Изменения

Перейти к: навигация, поиск
Нет описания правки
Далее будут приведены конструкции для построения МП-автомата по заданной КС-грамматике, и наоборот. Также будет приведена теорема об эквивалентности языков.=== Построение МП-автомата по заданной КС-грамматике ===Пусть <tex> G=(V,T,Q,S) </tex> — КС-грамматика. Построим МП-автомат <tex> P=(\{q\},T,V \cup T, \delta ,q,S) </tex>, который допускает <tex> L(G) </tex> по пустому магазину. Функция переходов <tex> \delta </tex> будет определена по следующим правилам:*1. <tex> \delta(q,\epsilon,A)=\{(q,\beta )| A \rightarrow \beta</tex> — продукция <tex> G \} </tex> — для каждой переменной <tex> A </tex>. *2. <tex> \delta(q,a,a)=\{(q,\epsilon)\} </tex> для каждого терминала <tex> a </tex>.
{{Теорема|id =th1|statement === Пример ====Преобразуем грамматику выражений в Класс [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора | контекстно-свободных языков]] <tex>(\mathrm{CFG})</tex> является подмножеством класса языков, задаваемых [[Автоматы с магазинной памятью | автоматами с магазинной памятью]] <tex>(\mathrm{PDA})</tex>, то есть по любой КС-грамматике можно построить МП-автомат, задающий тот же язык, что и исходная грамматика. |proof = Пусть дана КС-грамматика:<tex>\Gamma =\langle \Sigma, N, S, P\rangle</tex>. Поскольку классы языков, допускаемых МП-автоматами по допускающему состоянию и по пустому стеку, [[МП-автоматы, допуск по пустому стеку и по допускающему состоянию, эквивалентность | совпадают]], достаточно построить автомат с допуском по пустому стеку. *Построим автомат из одного состояния <tex>q</tex> с входным алфавитом <tex>\Sigma</tex>, стековым алфавитом <tex>N \cup \Sigma</tex>, маркером дна <tex>S</tex> и функцией перехода <tex>\delta</tex>, определённой ниже. Формально <tex>A = \langle \Sigma, N \cup \Sigma, \{q\}, q, S, \delta \rangle</tex>, где <tex> I \rightarrow adelta</tex> задаётся следующим образом: [[Файл:Delta.png |bthumb |I1right |I0|Ia|Ib Добавим такие переходы для каждого терминала <tex>a</tex> и правила вывода <tex>V \rightarrow \gamma</tex>]] *для каждого правила вывода <tex> E V \rightarrow I|E*E|E+E|\gamma \in P</tex> определим <tex>\delta(q, \varepsilon, V) = \{(Eq, \gamma) \}</tex>;Множеством входных символов является * для каждого терминала <tex>a</tex> определим <tex> \delta(q, a, a) = \{a(q, \varepsilon)\} </tex>. Покажем,bчто язык,1допускаемый автоматом <tex>A</tex>,0совпадает с языком грамматики <tex>\Gamma</tex>,то есть что <tex>S \Rightarrow^* w \iff (q, w,S)\vdash^* (q,+\varepsilon,\varepsilon)</tex>: ;Пусть <tex>S \Rightarrow^*w</tex>.: Рассмотрим [[ Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора | левосторонний вывод ]] <tex>S = \gamma_0 \Rightarrow \gamma_1 \Rightarrow ... \Rightarrow \gamma_n=w</tex>. Обозначим как <tex>v_i</tex> наибольший префикс <tex>\gamma_i</tex>, состоящий только из терминалов, а <tex>\alpha_i</tex> {{---} } остаток <tex>\gamma_i</tex>, то есть <tex>\gamma_i = v_i\alpha_i</tex>, причём <tex>v_i \in \Sigma^*</tex>, а <tex>\alpha_i</tex>начинается с нетерминала (либо пустая). Эти символыС помощью индукции по <tex>i</tex> докажем, что <tex>(q, w, S) \vdash^* (q, x_i, \alpha_i)</tex> для <tex>i \leq n</tex>, где <tex>x_i</tex> {{---}} то, что остаётся после чтения <tex>v_i</tex>, вместе с переменными то есть <tex>v_ix_i = w</tex> I. Иными словами,E переходя по автомату по символам <tex>v_i</tex>, образуют магазинный алфавитможно оставить на стеке <tex>\alpha_i</tex>. Функция переходов определена следующим образом:* '''База:''' <br> Пусть <tex>i = 0</tex>. <br> В этом случае <tex>\gamma_0 = S</tex>, поэтому <tex>v_0 = \varepsilon, \alpha_0 = S, x_i = w</tex>. Очевидно, <tex>(q, w, S) \vdash^* (q, w, S)</tex>.:* '''Индукционный переход:''' <br> Пусть <tex>(q, w, S) \vdash^*a(q, x_i, \alpha_i)</tex> для <tex>i < n</tex>. <tex>\alpha_i</tex> по определению начинается с какого-то нетерминала <tex>V</tex> (если <tex>\alpha_i = \varepsilon</tex>, то получена <tex>\gamma_n</tex>, а мы предположили, что <tex>i < n</tex>) , то есть <tex>\alpha_i = Vq_i</tex> Поскольку мы рассматриваем левосторонний вывод, то переход <tex>\gamma_i \Rightarrow \gamma_{i + 1}</tex> включает замену нетерминала <tex>V</tex> на какую-то цепочку <tex>\beta</tex> по правилу <tex>V \rightarrow \beta</tex>. Так как <tex>\gamma_i = v_i \alpha_i = v_i V q_i</tex>, то <tex>\gamma_{i + 1} = v_i \beta q_i = v_{i + 1} \alpha_{i + 1}</tex>. В автомате <tex>A</tex> по построению присутствует правило перехода <tex> \delta(q,\epsilonvarepsilon,IV)=\{(q, \beta)\}</tex>, поэтому <tex>\alpha_i</tex> на стеке можно заменить на <tex>\beta q_i</tex>. Заметим, что <tex>\beta q_i</tex> представляет собой конкатенацию нескольких терминалов из <tex>w</tex> и <tex>\alpha_{i + 1}</tex>. Считывая очередные символы строки <tex>w</tex>, будем переходить по автомату, убирая терминалы со стека, пока не встретим нетерминал. Таким образом, на стеке окажется <tex>\alpha_{i+1}</tex>. Получили, что <tex>(q, x_i, \alpha_i) \vdash^* (q,ax_{i + 1}, \alpha_{i + 1})</tex>, а значит, <tex>(q, w, S) \vdash^* (q,bx_{i + 1}, \alpha_{i + 1})</tex>. Индукционный переход доказан.: Заметим, что <tex>\alpha_n = \varepsilon, v_n = w, x_n = \varepsilon</tex>, поэтому <tex>(q,Iaw, S) \vdash^* (q, \varepsilon, \varepsilon)</tex>. ;Пусть <tex>(q, w, S) \vdash^* (q,Ib\varepsilon, \varepsilon)</tex>.: Воспользуемся индукцией по числу переходов в автомате и докажем для любой строки <tex>x</tex> и нетерминала <tex>M \in N</tex>, что если <tex>(q, x, M) \vdash^* (q,I0\varepsilon, \varepsilon)</tex>, то <tex>M \Rightarrow^* x</tex>.:* '''База:''' <br> Пусть в автомате один переход. <br> Если <tex>(q, x, M) \vdash^* (q,I1\varepsilon, \varepsilon)};</tex>, то <tex>x = \varepsilon</tex> и в грамматике присутствует правило <tex>M \rightarrow \varepsilon</tex>, по которому выводится <tex>\varepsilon = x</tex>.:*b'''Индукционный переход:''' <br> Предположим, что автомат <tex>A</tex> совершает <tex>n</tex> шагов (<tex>n > 1</tex>) . Изначально на вершине стеке находится <tex>M</tex>, поэтому первый переход совершается по какому-то правилу из первого пункта построения <tex> \delta</tex>, и на стеке оказывается последовательность из терминалов и нетерминалов <tex>Y_1 Y_2 \ldots Y_k</tex>. В процессе следующих <tex>n - 1</tex> переходов автомат прочитает строку <tex>x</tex> и поочерёдно вытолкнет со стека <tex>Y_1 Y_2 \ldots Y_k</tex>. Разобьём <tex>w</tex> на подстроки <tex>x_1 x_2 \ldots x_k</tex>, где <tex>x_1</tex> {{---}} порция входа, прочитанная до выталкивания <tex>Y_1</tex> со стека, <tex>x_2</tex> {{---}} следующая порция входа, прочитанная до выталкивания <tex>Y_2</tex> со стека и так далее. Формально можно заключить, что <tex>(q, x_i x_{i + 1} \ldots x_k, Y_i) \vdash^* (q,x_{i + 1} \epsilonldots x_k,E\varepsilon)</tex>, причём менее чем за <tex>n</tex> шагов. Если <tex>Y_i</tex> {{---}} нетерминал, то по индукционному предположению имеем, что <tex>Y_i \Rightarrow^* x_i</tex>. Если же <tex>Y_i</tex> {{---}} терминал, то должен совершаться только один переход, в котором проверяется совпадение <tex>x_i</tex> и <tex>Y_i</tex>. Значит, <tex>Y_i \Rightarrow^* x_i</tex> за 0 шагов. <br> Таким образом, получаем, что <tex>M \Rightarrow Y_1 Y_2 \ldots Y_k \Rightarrow^* x_1 x_2 \ldots x_k = x</tex>.: Подставляя <tex>w</tex> вместо <tex>x</tex> и <tex>S</tex> вместо <tex>M</tex>, получаем, что <tex>S \Rightarrow^* w.</tex>}} === Пример ===Поскольку доказательство теоремы конструктивно, то используя правила перехода, описанные в ней, можно преобразовать любую КС-грамматику в МП-автомат. Рассмотрим грамматику слов над алфавитом <tex>\{0, 1\}</tex>, в которых одинаковое количество нулей и единиц:: <tex> S \rightarrow 0S1 </tex>: <tex> S \rightarrow 1S0 </tex>: <tex> S \rightarrow \varepsilon </tex>Множеством терминалов является <tex>\Sigma = \{0, 1\}</tex>, а нетерминалов {{---}} <tex>N =\{S\}</tex>. Таким образом, стековый алфавит состоит из <tex>0, 1, S</tex>. Функция переходов <tex>\delta</tex> определена следующим образом: : <tex>\delta(q,I\varepsilon, S), = \{(q,E+E0S1), (q,E*E1S0), (q,(E)\varepsilon)\};</tex>(в соответствии с первым пунктом построения <tex>\delta</tex>) *c) : <tex> \delta(q,a0,a0)=\{(q,\epsilonvarepsilon)\}</tex>; <tex> \delta(q,b1,b1)=\{(q,\epsilonvarepsilon)\}</tex> (в соответствии со вторым пунктом построения <tex>\delta</tex>Получившийся автомат: [[Файл:Example1.png]] == Построение КС-грамматики по МП-автомату =={{Теорема|id = th2|statement = Класс языков, задаваемых автоматами с магазинной памятью <tex>(\mathrm{PDA})</tex>, является подмножеством класса контекстно-свободных языков <tex>(\mathrm{CFG})</tex>, то есть по любому МП-автомату можно построить КС-грамматику, задающую тот же язык, что и допускаемый автоматом.|proof = Пусть дан МП-автомат с допуском по пустому стеку <tex>A = \langle \Sigma, \Pi, Q, q_0 \in Q, z_0, \delta \rangle</tex>. Как отмечалось ранее, предположение о допуске по пустому стеку не умаляет общности. Построим эквивалентную ему КС-грамматику <tex>\Gamma = \langle \Sigma, N, S, P \rangle</tex>. В качестве нетерминалов будем использовать конструкции вида <tex>[pXq]</tex> (где <tex> p, q \in Q</tex>, <tex>X \in \Pi</tex>), которая неформально означает, что в процессе изменения состояния автомата от <tex>p</tex> до <tex>q</tex> символ <tex>X</tex> удаляется с вершины стека, не затрагивая то, что находится ниже. Также введём стартовый нетерминал <tex>S</tex>. Таким образом, <tex>N = Q \times \Pi \times Q \cup S</tex>. Правила вывода <tex>P</tex> построим следующим образом: * для каждого состояния <tex>p \in Q</tex> добавим правило <tex>S \rightarrow [q_0 z_0 p]</tex>;* для каждого перехода <tex>(r_0, \gamma_1 \gamma_2 \ldots \gamma_k) \in \delta(p, a, X)</tex> сделаем следующее: для всех упорядоченных списков состояний <tex>[r_1, r_2 \ldots r_k] \in Q^k</tex> добавим правило <tex>[p X r_k] \rightarrow a [r_0 \gamma_1 r_1] [r_1 \gamma_2 r_2] \ldots [r_{k - 1} \gamma_k r_k]</tex>, если <tex>k > 0</tex>, и <tex>[p X r_0] \rightarrow a</tex>, если <tex>k = 0</tex>. Нетерминал <tex>[pXq]</tex> должен выводить только те строки <tex>w</tex>, которые переводят автомат из состояния <tex>(p, X)</tex> в <tex>(q, \varepsilon)</tex>. Формально это можно записать следующим образом: <tex>[pXq] \Rightarrow^* w \iff (p, w, X) \vdash^* (q, \varepsilon, \varepsilon)</tex>. Докажем это утверждение: ;Пусть <tex>(p, w, X) \vdash^* (q, \varepsilon, \varepsilon)</tex>.: Докажем, что <tex>[pXq] \Rightarrow^* w</tex>, используя индукцию по числу переходов в автомате.:*'''База:'''<br> Пусть выполняется только один переход.<br> Тогда длина <tex>w</tex> не больше единицы и <tex>(q, \varepsilon) \in \delta(p, w, X)</tex>, поэтому правило <tex>[pXq] \rightarrow w</tex> по построению должно присутствовать в <tex>P</tex>.:*'''Индукционный переход:'''<br> Предположим, что <tex>(p, w, X) \vdash^* (q,\varepsilon, \varepsilon)</tex> за <tex>n > 1</tex> шагов. Первый переход имеет вид <tex>(p, w, X) \vdash (r_0, x, \gamma_1 \gamma_2 \ldots \gamma_k) \vdash^*(q, \varepsilon, \varepsilon)</tex>, где <tex>w = ax</tex> (<tex>a</tex> {{---}} символ из <tex>\Sigma</tex> или <tex>\varepsilon</tex>). Значит, <tex>(r_0, \gamma_1 \gamma_2 \ldots \gamma_k) \in \delta(p, a,*X)</tex>. По построению в грамматике должно присутствовать правило <tex>[p X r_k] \rightarrow a [r_0 \gamma_1 r_1] [r_1 \gamma_2 r_2] \ldots [r_{k - 1} \gamma_k r_k]</tex> для любой последовательности состояний <tex>[r_1, \ldots r_k]</tex>. Пусть <tex>x =w_1 w_2 \ldots w_k</tex>, где <tex>w_i</tex> {{---}} входная цепочка, которая прочитывается до удаления <tex>\gamma_i</tex> со стека, то есть найдётся такая последовательность состояний <tex>[r_1, \ldots r_k]</tex>, что <tex>(r_{i - 1}, w_i, \gamma_i) \vdash^* (r_i, \varepsilon, \varepsilon)</tex>, причём заканчивается всё в <tex>q= r_k</tex>. Заметим, что все эти выводы содержат менее <tex>n</tex> переходов, а значит, по индукционному предположению <tex>[r_{i - 1} \gamma_i r_i] \Rightarrow^* w_i</tex> для всех <tex>i</tex>. <br> Собирая вышесказанное,получаем <tex>[p X r_k] \Rightarrow a [r_0 \epsilon)gamma_1 r_1] [r_1 \gamma_2 r_2] \ldots [r_{k - 1}\gamma_k r_k] \Rightarrow^* a w_1 w_2 \ldots w_k = w</tex>. Так как <tex>r_k = q</tex>, то <tex>[pXq] \Rightarrow^* w</tex>, тем самым индукционный переход доказан. ; если входной символ совпадает с вершиной стекаПусть <tex>[pXq] \Rightarrow^* w</tex>.: Докажем, что <tex>(p, w, X) \vdash^* (q, \varepsilon, \varepsilon)</tex>, то вершина удаляетсяиспользуя индукцию по числу шагов в порождении.Пункты :*'''a,bБаза:''' образованы по первому правилу построения функции переходов<br> Пусть <tex>[pXq] \Rightarrow^* w</tex> за один шаг.<br> Тогда в <tex>\Gamma</tex> должно быть правило вывода <tex>[pXq] \rightarrow w</tex>, а значит, в автомате должен быть переход <tex>(q, \varepsilon) \in \delta(p, w, X)</tex> и <tex>w</tex> не может иметь длину больше единицы. Таким образом, <tex>(p, w, X) \vdash^* (q, \varepsilon, пункт \varepsilon)</tex>.:*'''cИндукционный переход:''' <br> Предположим, что <tex>[pXq] \Rightarrow^* w </tex> за <tex>n > 1</tex> шагов. По построению вывод должен иметь вид <tex>[p X r_k] \Rightarrow a [r_0 \gamma_1 r_1] [r_1 \gamma_2 r_2] \ldots [r_{k - 1} \gamma_k r_k] \Rightarrow^* w</tex>, где <tex>r_k = q</tex> и <tex>(r_0, \gamma_1 \gamma_2 \ldots \gamma_k) \in \delta(p, a, X)</tex>. Вновь представим <tex>w</tex> в виде <tex>w = a w_1 w_2 \ldots w_k</tex> так, что <tex>[r_{i - 1} \gamma_i r_i] \Rightarrow^* w_i</tex>. Так как все эти выводы содержат менее <tex>n</tex> шагов, то по индукционному предположению для всех <tex>i</tex> выполнено <tex>(r_{i - 1}, w_i, \gamma_i) \vdash^* (r_i, \varepsilon, \varepsilon)</tex>. Собирая всё вместе, получаем <tex>(r_0, w_1 w_2 \ldots w_k, \gamma_1 \gamma_2 \ldots \gamma_k) \vdash^* (r_1, w_2 w_3 \ldots w_k, \gamma_2 \gamma_3 \ldots \gamma_k) \vdash^* \ldots \vdash^* (r_k, \varepsilon, \varepsilon)</tex>. Так как <tex>(r_0, \gamma_1 \gamma_2 \ldots \gamma_k) \in \delta(p, a, X)</tex> и <tex>r_k = q</tex>, то в итоге <tex>(p, w, X) \vdash^* (q, \varepsilon, \varepsilon)</tex>. Таким образом, мы доказали, что <tex>[pXq] \Rightarrow^* w \iff (p, w, X) \vdash^* (q, \varepsilon, \varepsilon)</tex>. Заметим, что <tex>S \Rightarrow^* w</tex> тогда и только тогда, когда найдётся <tex>p</tex>, что <tex>[q_0 z_0 p] \Rightarrow^* w</tex>. По доказанному выше это равносильно тому, что <tex>(q_0, w, z_0) \vdash^* (p, \varepsilon, \varepsilon)</tex>, то есть что <tex>A</tex> допускает <tex>w</tex> по второму правилупустому стеку. Суммируя всё вышесказанное, получаем, что построенная грамматика <tex>\Gamma</tex> порождает слово <tex>w</tex> тогда и только тогда, когда оно допускается автоматом <tex>A</tex>.}} === Пример ===Пусть у нас имеется МП-автомат <tex>A = \langle \{i,e\}, \{Z\}, \{q\}, q, Z, \delta \rangle</tex>, функция <tex>\delta</tex> задана следующим образом::<tex>\delta(q, i, Z) = \{(q, ZZ)\}</tex>:<tex>\delta(q, e, Z) = \{(q, \varepsilon)\}</tex> [[Файл:Example2.png]] Так как стековый алфавит <tex>A</tex> содержит лишь один символ и одно состояние, то в построенной грамматике будет лишь 2 нетерминала: *<tex>S</tex> — стартовый нетерминал. *<tex>[qZq]</tex> — единственная тройка, которую можно собрать из состояний автомата и символов стекового алфавита. Также грамматика имеет следующие правила вывода:* Единственной продукцией для <tex>S</tex> является <tex>S \rightarrow [qZq]</tex>. Но если бы у автомата было <tex>n</tex> состояний, то тут бы имелось и <tex>n</tex> продукций.* Из того факта, что <tex>\delta(q, i, Z)</tex> содержит <tex>(q, ZZ)</tex>, получаем правило вывода <tex>[qZq] \rightarrow i[qZq][qZq]</tex>. Если бы у автомата было <tex>n</tex> состояний, то такой переход порождал бы <tex>n^2</tex> продукций.* Из <tex>\delta(q,e,Z)=\{(q,\varepsilon)\}</tex> получаем правило вывода <tex>[qZq] \rightarrow e</tex>Для удобства тройку <tex>[qZq]</tex> можно заменить символом <tex>A</tex>, в таком случае правила вывода в грамматике будут следующие::<tex>S \rightarrow A</tex>:<tex>A \rightarrow iAA</tex>:<tex>A \rightarrow e</tex>Упростим грамматику, заменив <tex>A</tex> на <tex>S</tex> (очевидно, она не поменяется), и получим в результате <tex>\Gamma = \langle\{i,e\}, \{S\}, S, \{S \rightarrow iSS | e\}\rangle</tex>
==== Корректность построения ==Эквивалентность языков МП-автоматов и КС-языков==Пусть <tex> w\in L(G)</tex>, тогда <tex> w </tex> имеет следующее левое порождение:{{Теорема<tex> S |about = \gamma_1 \Rightarrow \gamma_2 \Rightarrow ... \Rightarrow \gamma_nоб эквивалентности языков МП-автоматов и КС-языков|statement =w</tex>.Покажем индукцией по <tex> i </tex>Множество языков, что <tex> (qдопускаемых МП-автоматами,w,S)\vdash^*(q,y_i,\alpha_i)</tex>:*Базасовпадает с множеством контекстно-свободных языков. Очевидно, что <tex> (q,w,S)\vdash^*(q,w,S) </tex>*Переход. Предположим|proof = [[#th1 | Первая теорема]] гласит, что <tex> (q,w,S)\vdash^*(q,w_i,mathrm{CFG} \alpha_i) </tex>. Заметим, что шаг порождения <tex> y_i subseteq \Rightarrow y_mathrm{i+1PDA}</tex> включает замену некоторой переменной <tex> A </tex> ее продукцией <tex> \beta </tex>. Правило 1 построения МП-автомата позволяет на заменить <tex> A </tex> на вершине стека на цепочку <tex> \beta </tex>, а правило 2 позволяет затем сравнить любые терминалы на вершине со входными символами. В результате достигается МО <tex> (q,y_[[#th2 | вторая]] {{i+1---},\alpha_{i+1}) </tex>.*Также заметим, что <tex> \alpha_n = mathrm{PDA} \subseteq \epsilonmathrm{CFG} </tex>. Таким образом , <tex> (q,w,S)\vdash^*(q,mathrm{PDA} = \epsilon,\epsilon) mathrm{CFG} </tex>, т.е допускает <tex> P </tex> по пустому стеку.}} == Следствия ==
{{Утверждение
|about=1|statement= Если Для любого МП-автомата с допуском по пустому стеку существует эквивалентный МП-автомат <tex> P </tex> построен по грамматике <tex> G </tex>, с использованием указанной выше конструкции, то <tex> L(G) \subseteq N(P) </tex>одним состоянием.|proof= Выше доказана корректность построения МППостроим КС-автомата грамматику по данному автомату, затем по любой КС-полученной грамматике. Значит множество языков КС-грамматик является подмножеством языков допускаемых построим МП-автоматамиавтомат, как указано выше. Заметим, что этот автомат будет иметь одно состояние, что и требовалось доказать.
}}
{{Утверждение|statement === Построение КСДля любого МП-грамматики автомата с допуском по пустому стеку существует эквивалентный МП-автомату ===Наша конструкция эквивалентной грамматики использует переменные вида: <tex> [pXq]</tex> — которая означаетавтомат, что в процессе изменения состояния автомата от <tex> p </tex> до <tex> q </tex>, <tex> X </tex> удалилось из стекалюбом переходе которого на стек кладётся не больше двух символов.<br>|proof = Построим КС-грамматику по данному автомату и приведём её к [[Файл:-pXq-.jpgНормальная форма Хомского | нормальной форме Хомского]]Следует отметить, что удаление <tex> X </tex> может являться результатом множества переходов.<br>Пусть <tex> P=(Q,\Sigma,\Gamma,\delta,q_0,Z_0)</tex> — Затем по полученной грамматике построим МП-автомат. Построим <tex> G=(V,\Sigma,R,S)</tex>, где <tex> V </tex> состоит из:*1 Специальный стартовый символ <tex> S </tex>*2 Все символы вида <tex> [pXq]</tex>, где <tex> p </tex> и <tex> q </tex> — состояния из <tex> Q </tex>, а <tex> X </tex> — магазинный символ из <tex> \Gamma </tex>как указано выше.Грамматика <tex> G </tex> имеет следующие продукции:*a) продукции <tex> S \rightarrow [q_0Заметим,Z_0,p] </tex> для что в нормальной форме Хомского правые части всех <tex> p </tex>правил имеют длину не больше двух, таким образом <tex> (q,w,Z_0)\vdash^* (q,\epsilon,\epsilon)</tex>*b) пусть <tex> \delta(q,a,X) </tex> содержит <tex> (r,Y_1,Y_2,...,Y_k)</tex>. Тогда для всех списков состояний <tex> r_1,r_2,...,r_k</tex> поэтому в любом переходе в грамматике <tex> G </tex> есть продукция <tex> [qXr_k]\rightarrow a[r Y_1 r_1][r_1 Y_1 r_2]...[r_{k-1} Y_k r_k]</tex>.==== Пример ====Пусть у нас имеется <tex> P=({q},{i,e},{Z},\delta,q,Z)</tex>, функция <tex> \delta </tex> задана следующим образом:*<tex> \delta(q,i,Z)=\{(q,ZZ)\}</tex>*<tex> \delta(q,e,Z)=\{(q,\epsilon)\}</tex>Так как <tex> P </tex> имеет один магазинный символ и одно состояние, то грамматика строится просто. У нас будет всего две переменные:*a) <tex> S </tex> — стартовый символ.*b) <tex> [qZq] </tex> — единственная тройка, которую можно собрать из наших состояний и магазинный полученном автомате на стек кладётся не больше двух символов.Также грамматика имеет следующие продукции:*1. Единственной продукцией для <tex> S </tex> является <tex> S \rightarrow [qZq] </tex>. Но если бы у автомата было <tex> n </tex> состояний, то тут бы имелось и <tex> n </tex> продукций.*2. Из того факта, что <tex> \delta(q,i,Z) </tex> содержит <tex> (q,ZZ)</tex>, получаем продукцию <tex> [qZq] \rightarrow i[qZq][qZq] </tex>. Если бы у автомата было '''n''' состояний, то такое правило порождало бы <tex> n^2 </tex> продукций.*3. Из <tex> \delta(q,e,Z)=\{(q,\epsilon)\} </tex> получаем продукцию <tex> [qZq] \rightarrow \epsilon </tex>Для удобства тройку <tex> [qZq] </tex> можно заменить символом <tex> A </tex>, в таком случае грамматика состоит из следующих продукций:* <tex> S \rightarrow A</tex>* <tex> A \rightarrow iAA | \epsilon</tex>В действительности можно заметить, что <tex>S</tex> и <tex>A</tex> порождают одни и те же цепочки, поэтому их можно обозначить одинаково, итого: <tex> G=(\{S\},\{i,e\},\{S \rightarrow iSS| \epsilon\},S)</tex>
==== Корректность построения ====
Докажем, что если <tex> (q,w,X) \vdash^* (p,\epsilon,\epsilon)</tex>, то <tex> [q,X,p] \Rightarrow^* w </tex>.
*База. Пара <tex> (p,\epsilon) </tex> должна быть в <tex> \delta(q,w,X) </tex> и <tex> w </tex> есть одиночный символ, или <tex> \epsilon </tex>. Из построения <tex> G </tex> следует, что <tex> [qXp] \rightarrow w </tex> является продукцией, поэтому <tex> [qXp] \Rightarrow w </tex>.
*Переход. Предположим, что последовательность <tex> (q,w,X) \vdash^* (p,\epsilon,\epsilon)</tex> состоит из <tex> n </tex> переходов, и <tex> n>1 </tex>. Первый переход должен иметь вид:
<tex> (q,w,Z) \vdash (r_0,X,Y_1Y_2...Y_k) \vdash^* (p,\epsilon,\epsilon) </tex>, где <tex> w=aX </tex> для некоторого <tex> a </tex>, которое является либо символом из <tex> \Gamma </tex>, либо <tex> \epsilon </tex>. По построению <tex> G </tex> существует продукция <tex> [qXr_k] \rightarrow a[r_0 Y_1 r_1][r_1 Y_2 r_2]...[r_{k-1} Y_k r_k] </tex>, где <tex> r_i</tex> — состояния из <tex> Q </tex>, и <tex> r_k = p </tex>. Пусть <tex> X=w_1 w_2 ... w_k </tex>, где <tex> w_i </tex> — входная цепочка, которая прочитывается до удаления <tex> Y_i </tex> из стека, тогда <tex> (r_{i-1},w_i, Y_i) \vdash^* (r_i, \epsilon, \epsilon)</tex>. По скольку ни одна из этих последовательностей переходов не содержит более, чем <tex> n </tex> переходов, к ним можно применить предположение индукции <tex> [r_{i-1}Y_ir_i] \Rightarrow^* w_i</tex>. Соберем эти порождения вместе: <br>
<tex> [qXr_k] \Rightarrow a[r_0Y_1r_1][r_1Y_1r_2]...[r_{k-1}Y_kr_k] \Rightarrow^* aw_1[r_1Y_1r_2]...[r_{k-1}Y_kr_k] \Rightarrow^* aw_1w_2[r_2Y_3r_3]...[r_{k-1}Y_kr_k] \Rightarrow^*... \Rightarrow^* aw_1w_2...w_k = w</tex>.
{{Утверждение
|about=2|statement= Если КСДля любого МП-автомата существует эквивалентный МП-грамматика автомат с допуском по пустому стеку без <tex> G \varepsilon</tex> построена -переходов.|proof = Построим КС-грамматику по данному автомату, затем по полученной грамматике построим МП-автомату <tex> P </tex>автомат, с использованием указанной как указано выше конструкции. Заметим, то что этот автомат не будет иметь <tex> N(P) \subseteq L(G) varepsilon</tex>|proof= Выше доказана корректность построения КС-грамматики по МП-автомату. Значит языки допускаемые МП-автоматами являются подмножеством языковпереходов, заданных КС-грамматикойчто и требовалось доказать.
}}
== См. также ==
*[[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора | Контекстно-свободные грамматики]]
*[[Автоматы с магазинной памятью | Автоматы с магазинной памятью]]
 
== Источники информации ==
*[https://en.wikipedia.org/wiki/Pushdown_automaton#PDA_and_context-free_languages Wikipedia — PDA and context-free languages]
* Введение в теорию автоматов, языков и вычислений / Хопкрофт Д., Мотвани Р., Ульман Д. — М.:Издательский дом «Вильямс», 2002. с. 251. — ISBN 5-8459-0261-4
=== Эквивалентность [[Категория: Теория формальных языков МП-автоматов и КС-языков===]]{{Теорема|about= Об эквивалентности языков МП-автоматов и КС[[Категория: Контекстно-языковсвободные грамматики]]|statement= Множество языков, допускаемых [[Категория: МП-автоматами совпадает с множеством языков, задаваемых с помощью контекстно-свободных грамматик.|proof= Из утверждения 1 следует, что <tex> L(G) \subseteq N(P) </tex>, в свою очередь из утверждения 2 следует, что <tex> N(P) \subseteq L(G) </tex>. Отсюда <tex> L(G)=N(P) </tex>.}}автоматы]]
48
правок

Навигация