48
правок
Изменения
Нет описания правки
{{Теорема|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\gamma \in P</tex> определим <tex>\delta(q, \varepsilon, V) = \{(q, \gamma)\}</tex>;*E|E+E|для каждого терминала <tex>a</tex> определим <tex> \delta(q, a, a) = \{(Eq, \varepsilon) \} </tex>.Множеством входных символов является Покажем, что язык, допускаемый автоматом <tex>A</tex>, совпадает с языком грамматики <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> {{a---}} остаток <tex>\gamma_i</tex>,bто есть <tex>\gamma_i = v_i\alpha_i</tex>,1причём <tex>v_i \in \Sigma^*</tex>,0а <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>. Эти символы вместе с переменными Иными словами, переходя по автомату по символам <tex>v_i</tex> I,E можно оставить на стеке <tex>\alpha_i</tex> образуют магазинный алфавит. Функция переходов определена следующим образом:*a) '''База:''' <br> Пусть <tex>i = 0</tex>. <br> В этом случае <tex> \delta(qgamma_0 = S</tex>,поэтому <tex>v_0 = \varepsilon,I)\alpha_0 = S, x_i ={w</tex>. Очевидно, <tex>(q,aw, S), \vdash^* (q,bw, S), </tex>.:* '''Индукционный переход:''' <br> Пусть <tex>(q,Iaw, S), \vdash^* (q,Ibx_i, \alpha_i)</tex> для <tex>i < n</tex>. <tex>\alpha_i</tex> по определению начинается с какого-то нетерминала <tex>V</tex> (если <tex>\alpha_i = \varepsilon</tex>, (qто получена <tex>\gamma_n</tex>, а мы предположили,I0что <tex>i < n</tex>), (qто есть <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>,I1)то <tex>\gamma_{i + 1} = v_i \beta q_i = v_{i + 1} \alpha_{i + 1};</tex>*b) . В автомате <tex>A</tex> по построению присутствует правило перехода <tex> \delta(q,\varepsilon,EV)=\{(q,I\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,Ex_i, \alpha_i) \vdash^* (q, x_{i +E1}, \alpha_{i + 1})</tex>, а значит, <tex>(q,Ew, S) \vdash^*E(q, x_{i + 1}, \alpha_{i + 1})</tex>. Индукционный переход доказан.: Заметим, что <tex>\alpha_n = \varepsilon, v_n = w, x_n = \varepsilon</tex>, поэтому <tex>(q,w, S) \vdash^* (E)q, \varepsilon, \varepsilon)};</tex>.*c) ;Пусть <tex> \delta(q,aw,aS)=\{vdash^* (q, \varepsilon,\varepsilon)</tex>.: Воспользуемся индукцией по числу переходов в автомате и докажем для любой строки <tex>x</tex> и нетерминала <tex>M \}in N</tex>; , что если <tex> \delta(q,bx,bM)=\{vdash^* (q, \varepsilon,\varepsilon)</tex>, то <tex>M \}Rightarrow^* x</tex>;..:* '''База:''' <br> Пусть в автомате один переход.<br> Если <tex> \delta(q,*x,*M)=\{vdash^* (q, \varepsilon,\varepsilon)</tex>, то <tex>x = \}varepsilon</tex> и в грамматике присутствует правило <tex>M \rightarrow \varepsilon</tex>. Если входной символ совпадает с вершиной стека, то вершина удаляетсяпо которому выводится <tex>\varepsilon = x</tex>.Пункты :* '''a,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} \ldots x_k, \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>, а пункт '''c''' по второмунетерминалов {{---}} <tex>N = \{S\}</tex>. Таким образом, стековый алфавит состоит из <tex>0, 1, S</tex>.Функция переходов <tex>\delta</tex> определена следующим образом: : <tex>\delta(q, \varepsilon, S) = \{(q, 0S1), (q, 1S0), (q, \varepsilon)\}</tex> (в соответствии с первым пунктом построения <tex>\delta</tex>)
: <tex> \delta(q, 0, 0)=\{(q, \varepsilon)\}</tex>; <tex> \delta(q, 1, 1)=\{(q, \varepsilon)\}</tex> (в соответствии со вторым пунктом построения <tex>\delta</tex>) Получившийся автомат: [[Файл:Example1.png]] == Корректность построения Построение КС-грамматики по МП-автомату =={{Теорема|id =th2|statement = Класс языков, задаваемых автоматами с магазинной памятью <tex>(\mathrm{PDA})</tex>, является подмножеством класса контекстно-свободных языков <tex>(\mathrm{CFG})</tex>, то есть по любому МП-автомату можно построить КС-грамматику, задающую тот же язык, что и допускаемый автоматом.|proof =Пусть дан МП-автомат с допуском по пустому стеку <tex> wA = \langle \Sigma, \Pi, Q, q_0 \in LQ, z_0, \delta \rangle</tex>. Как отмечалось ранее, предположение о допуске по пустому стеку не умаляет общности. Построим эквивалентную ему КС-грамматику <tex>\Gamma = \langle \Sigma, N, S, P \rangle</tex>. В качестве нетерминалов будем использовать конструкции вида <tex>[pXq]</tex> (Gгде <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> w P</tex> имеет следующее левое порождениепостроим следующим образом: * для каждого состояния <tex>p \in Q</tex> добавим правило <tex> S = \rightarrow [q_0 z_0 p]</tex>;* для каждого перехода <tex>(r_0, \gamma_1 \Rightarrow 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] \Rightarrow ... ldots [r_{k - 1} \Rightarrow gamma_k r_k]</tex>, если <tex>k > 0</tex>, и <tex>[p X r_0] \gamma_nrightarrow a</tex>, если <tex>k =w0</tex>.Покажем индукцией по Нетерминал <tex>[pXq]</tex> должен выводить только те строки <tex> i w</tex>, что которые переводят автомат из состояния <tex>(p, X)</tex> в <tex> (q,\varepsilon)</tex>. Формально это можно записать следующим образом: <tex>[pXq] \Rightarrow^* w\iff (p,Sw, X)\vdash^*(q,y_i\varepsilon,\alpha_ivarepsilon)</tex>. Докажем это утверждение:*База. Очевидно, что ;Пусть <tex> (qp,w,SX)\vdash^*(q, \varepsilon, \varepsilon)</tex>.: Докажем, что <tex>[pXq] \Rightarrow^* w</tex>, используя индукцию по числу переходов в автомате.:*'''База:'''<br> Пусть выполняется только один переход.<br> Тогда длина <tex>w</tex> не больше единицы и <tex>(q, \varepsilon) \in \delta(p,w,SX) </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,SX) \vdash (r_0, x, \gamma_1 \gamma_2 \ldots \gamma_k)\vdash^*(q,w_i\varepsilon,\alpha_ivarepsilon) </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> y_i [p X r_k] \rightarrow a [r_0 \gamma_1 r_1] [r_1 \Rightarrow y_gamma_2 r_2] \ldots [r_{i+k - 1}\gamma_k r_k]</tex> включает замену некоторой переменной для любой последовательности состояний <tex> A [r_1, \ldots r_k]</tex> ее продукцией . Пусть <tex> x = w_1 w_2 \beta ldots w_k</tex>. Правило 1 построения МП, где <tex>w_i</tex> {{---автомата позволяет на заменить }} входная цепочка, которая прочитывается до удаления <tex> A \gamma_i</tex> на вершине со стека на цепочку , то есть найдётся такая последовательность состояний <tex> [r_1, \beta ldots r_k]</tex>, а правило 2 позволяет затем сравнить любые терминалы на вершине со входными символами. В результате достигается МО что <tex> (r_{i - 1}, w_i, \gamma_i) \vdash^* (r_i, \varepsilon, \varepsilon)</tex>, причём заканчивается всё в <tex>q= r_k</tex>. Заметим, что все эти выводы содержат менее <tex>n</tex> переходов, а значит,y_по индукционному предположению <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 \gamma_1 r_1] [r_1 \alpha_gamma_2 r_2] \ldots [r_{i+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>, используя индукцию по числу шагов в порождении.:*'''База:''' <br> Пусть <tex>[pXq] \alpha_n = 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> (qp,w,SX)\vdash^*(q,\varepsilon,\varepsilon) </tex>.:*'''Индукционный переход:''' <br> Предположим, т.е допускает что <tex>[pXq] \Rightarrow^* w </tex> за <tex> P n > 1</tex> по пустому стекушагов.По построению вывод должен иметь вид <tex>[p X r_k] \Rightarrow a [r_0 \gamma_1 r_1] [r_1 \gamma_2 r_2] \ldots [r_{{Утверждение|aboutk - 1} \gamma_k r_k] \Rightarrow^* w</tex>, где <tex>r_k =1|statementq</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> P n</tex> построен шагов, то по грамматике индукционному предположению для всех <tex>i</tex> выполнено <tex>(r_{i - 1}, w_i, \gamma_i) \vdash^* (r_i, \varepsilon, \varepsilon)</tex>. Собирая всё вместе, получаем <tex> G (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> L(Gp, w, X) \subseteq Nvdash^* (Pq, \varepsilon, \varepsilon) </tex>. |proof= Выше доказана корректность построения МП-автомата Таким образом, мы доказали, что <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> [pXq]A = \langle \{i,e\}, \{Z\}, \{q\}, q, Z, \delta \rangle</tex> — которая означает, что в процессе изменения состояния автомата от функция <tex> p \delta</tex> до задана следующим образом::<tex> \delta(q, i, Z) = \{(q , ZZ)\}</tex>, :<tex> X \delta(q, e, Z) = \{(q, \varepsilon)\}</tex> удалилось из стека.<br>[[Файл:-pXq-.jpg]]
{{Утверждение
}}
}}
==См. также = Литература =*[[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора | Контекстно-свободные грамматики]]*[[Автоматы с магазинной памятью | Автоматы с магазинной памятью]] == Источники информации ==* Джон Хопкрофт, Раджив Мотвани, Джеффри Ульман[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 [[Категория: Теория формальных языков]][[Категория: Контекстно-свободные грамматики]][[Категория: МП-автоматы]]