170
правок
Изменения
Нет описания правки
{{Теорема
|id = th1
|statement = Класс [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора | контекстно-свободных языков ]] (<tex>\mathrm{CFG}</tex>) является подмножеством класса языков, задаваемых [[Автоматы с магазинной памятью | автоматами с магазинной памятью ]] (<tex>\mathrm{PDA}</tex>), то есть по любой КС-грамматике можно построить МП-автомат, задающий тот же язык, что и исходная грамматика.
|proof =
Пусть дана КС-грамматика <tex>\Gamma =\langle \Sigma, N, S, P\rangle</tex>. Поскольку классы языков, допускаемых МП-автоматами по допускающему состоянию и по пустому стеку, [[МП-автоматы, допуск по пустому стеку и по допускающему состоянию, эквивалентность | совпадают]], достаточно построить автомат с допуском по пустому стеку.
: Заметим, что <tex>\alpha_n = \varepsilon, v_n = w, x_n = \varepsilon</tex>, поэтому <tex>(q, w, S) \vdash^* (q, \varepsilon, \varepsilon)</tex>.
* Пусть <tex>(q, w, S) \vdash^* (q, \varepsilon, \varepsilon)</tex>. Воспользуемся индукцией по числу переходов в автомате и докажем для любой строки <tex>x</tex> и маркера дна нетерминала <tex>M \in N</tex>, что если <tex>(q, x, M) \vdash^* (q, \varepsilon, \varepsilon)</tex>, то <tex>M \Rightarrow^* x</tex>.
** База (1 переход): <br> Если <tex>(q, x, M) \vdash^* (q, \varepsilon, \varepsilon)</tex>, то <tex>x = \varepsilon</tex> и в грамматике присутствует правило <tex>M \rightarrow \varepsilon</tex>, по которому выводится <tex>\varepsilon = x</tex>.
** Индукционный переход: <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>N 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>
}}
|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>, используя индукцию по числу переходов в автомате.
** База (1 переход): <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, \{r_i\}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, \{r_i\}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 \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>, используя индукцию по числу шагов в порождении.
** База (1 шаг): <br> Если <tex>[pXq] \Rightarrow^* w</tex> за один шаг, то в <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>.
** Индукционный переход: <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>(q0q_0, w, z0z_0) \vdash^* (p, \varepsilon, \varepsilon)</tex>, то есть что <tex>A</tex> допускает <tex>w</tex> по пустому стеку. Суммируя всё вышесказанное, получаем, что построенная грамматика <tex>\Gamma</tex> порождает слово <tex>w</tex> тогда и только тогда, когда оно допускается автоматом <tex>A</tex>.
<!--
}}
=== Замечания Следствия ===
{{Утверждение
|statement = Для любого МП-автомата с допуском по пустому стеку существует эквивалентный МП-автомат с одним состоянием.
|proof = Построим КС-грамматику по данному автомату, затем по полученной грамматике построим МП-автомат, как указано выше. Заметим, что этот автомат не будет иметь <tex>\varepsilon</tex>-переходов, что и требовалось доказать.
}}
=== Ссылки ===
[[Формальные грамматики | Формальные грамматики]]
[[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора | Контекстно-свободные грамматики]]
[[Автоматы с магазинной памятью | Автоматы с магазинной памятью]]
[[МП-автоматы, допуск по пустому стеку и по допускающему состоянию, эквивалентность | МП-автоматы, допуск по пустому стеку и по допускающему состоянию, эквивалентность]]
=== Литература ===
* ''Хопкрофт Д., Мотвани Р., Ульман Д.'' Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. {{---}} М.:Издательский дом «Вильямс», 2002. {{---}} С. 251.