Дан простой язык с грамматикой: S -> a S b | epsilon. Постройте ДКА/НКА для распознавания языка, докажите корректность и обсудите, можно ли эту грамматику преобразовать в регулярную
Кратко: язык порождаемый грамматикой S→aSb∣εS \to a S b \mid \varepsilonS→aSb∣ε равен L={anbn∣n≥0},
L=\{a^n b^n \mid n\ge 0\}, L={anbn∣n≥0},
он не регулярный, поэтому не существует ни ДКА, ни НКА, распознающего этот язык. Зато существует магазинный автомат (PDA). Докажу это и приведу PDA. 1) Нерегулярность (доказательство через лемму о накачке). Пусть для противоречия LLL регулярный; пусть ppp — длина накачки. Возьмём строку s=apbp.
s=a^p b^p. s=apbp.
По лемме s=xyzs=xyzs=xyz, где ∣xy∣≤p|xy|\le p∣xy∣≤p, ∣y∣>0|y|>0∣y∣>0. Тогда yyy состоит только из символов aaa, скажем y=aky=a^ky=ak, k>0k>0k>0. Накочивая i=0i=0i=0 получаем xz=ap−kbp,
x z = a^{p-k} b^p, xz=ap−kbp,
что не принадлежит LLL (число aaa меньше числа bbb). Противоречие. Значит LLL не регулярен. 2) PDA, распознающий LLL. Опишем детерминированный PDA M=({q},{a,b},{Z0,A},δ,q,Z0,∅)M=(\{q\},\{a,b\},\{Z_0,A\},\delta,q,Z_0,\varnothing)M=({q},{a,b},{Z0,A},δ,q,Z0,∅) с принятием по переходу в особое финальное состояние (или по финальному состоянию). Можно сократить до приёма по пустому стеку; ниже даётся вариант с финальным состоянием qfq_fqf. Переходы (в виде δ(состояние,символ входа,символ на стеке)∋(новое состояние,замена на стеке)\delta(\text{состояние},\text{символ входа},\text{символ на стеке}) \ni (\text{новое состояние},\text{замена на стеке})δ(состояние,символвхода,символнастеке)∋(новоесостояние,заменанастеке)): - Для каждого прочитанного aaa пушим метку AAA: δ(q,a,Z0)∋(q,AZ0),δ(q,a,A)∋(q,AA).
\delta(q,a,Z_0)\ni (q, A Z_0),\qquad \delta(q,a,A)\ni (q,A A). δ(q,a,Z0)∋(q,AZ0),δ(q,a,A)∋(q,AA).
- Для каждого прочитанного bbb попаем одну AAA: δ(q,b,A)∋(q,ε).
\delta(q,b,A)\ni (q,\varepsilon). δ(q,b,A)∋(q,ε).
- Когда вход прочитан и на стеке только Z0Z_0Z0, делаем ε\varepsilonε-переход в финальное состояние: δ(q,ε,Z0)∋(qf,Z0).
\delta(q,\varepsilon,Z_0)\ni (q_f,Z_0). δ(q,ε,Z0)∋(qf,Z0). Интуиция и корректность: при чтении ana^nan автомат запишет nnn символов AAA на стек; при последующем чтении bbb каждый символ bbb удаляет ровно одну AAA. Строка принимается тогда и только тогда, когда после обработки всего ввода стек вернулся к Z0Z_0Z0 (т.е. число bbb равно числу ранее прочитанных aaa). Далее по индукции видно, что MMM принимает ровно строки anbna^n b^nanbn. 3) Можно ли преобразовать грамматику в регулярную? Нет. Регулярная грамматика порождает регулярный язык; поскольку L={anbn}L=\{a^n b^n\}L={anbn} не регулярен, никакой регулярной грамматики, эквивалентной данной, не существует. Также непосредственно видно, что правило S→aSbS\to a S bS→aSb не является ни праволинейным, ни леволинейным (рекурсивный символ находится в середине продукции), так что прямое приведение к регулярной форме невозможно. Вывод: НКА/ДКА для данного языка не существует; корректный автомат — PDA, приведённый выше; грамматику в регулярную преобразовать нельзя, потому что язык нерегулярен.
L={anbn∣n≥0}, L=\{a^n b^n \mid n\ge 0\},
L={anbn∣n≥0}, он не регулярный, поэтому не существует ни ДКА, ни НКА, распознающего этот язык. Зато существует магазинный автомат (PDA). Докажу это и приведу PDA.
1) Нерегулярность (доказательство через лемму о накачке).
Пусть для противоречия LLL регулярный; пусть ppp — длина накачки. Возьмём строку
s=apbp. s=a^p b^p.
s=apbp. По лемме s=xyzs=xyzs=xyz, где ∣xy∣≤p|xy|\le p∣xy∣≤p, ∣y∣>0|y|>0∣y∣>0. Тогда yyy состоит только из символов aaa, скажем y=aky=a^ky=ak, k>0k>0k>0. Накочивая i=0i=0i=0 получаем
xz=ap−kbp, x z = a^{p-k} b^p,
xz=ap−kbp, что не принадлежит LLL (число aaa меньше числа bbb). Противоречие. Значит LLL не регулярен.
2) PDA, распознающий LLL.
Опишем детерминированный PDA M=({q},{a,b},{Z0,A},δ,q,Z0,∅)M=(\{q\},\{a,b\},\{Z_0,A\},\delta,q,Z_0,\varnothing)M=({q},{a,b},{Z0 ,A},δ,q,Z0 ,∅) с принятием по переходу в особое финальное состояние (или по финальному состоянию). Можно сократить до приёма по пустому стеку; ниже даётся вариант с финальным состоянием qfq_fqf .
Переходы (в виде δ(состояние,символ входа,символ на стеке)∋(новое состояние,замена на стеке)\delta(\text{состояние},\text{символ входа},\text{символ на стеке}) \ni (\text{новое состояние},\text{замена на стеке})δ(состояние,символ входа,символ на стеке)∋(новое состояние,замена на стеке)):
- Для каждого прочитанного aaa пушим метку AAA:
δ(q,a,Z0)∋(q,AZ0),δ(q,a,A)∋(q,AA). \delta(q,a,Z_0)\ni (q, A Z_0),\qquad \delta(q,a,A)\ni (q,A A).
δ(q,a,Z0 )∋(q,AZ0 ),δ(q,a,A)∋(q,AA). - Для каждого прочитанного bbb попаем одну AAA:
δ(q,b,A)∋(q,ε). \delta(q,b,A)\ni (q,\varepsilon).
δ(q,b,A)∋(q,ε). - Когда вход прочитан и на стеке только Z0Z_0Z0 , делаем ε\varepsilonε-переход в финальное состояние:
δ(q,ε,Z0)∋(qf,Z0). \delta(q,\varepsilon,Z_0)\ni (q_f,Z_0).
δ(q,ε,Z0 )∋(qf ,Z0 ).
Интуиция и корректность: при чтении ana^nan автомат запишет nnn символов AAA на стек; при последующем чтении bbb каждый символ bbb удаляет ровно одну AAA. Строка принимается тогда и только тогда, когда после обработки всего ввода стек вернулся к Z0Z_0Z0 (т.е. число bbb равно числу ранее прочитанных aaa). Далее по индукции видно, что MMM принимает ровно строки anbna^n b^nanbn.
3) Можно ли преобразовать грамматику в регулярную?
Нет. Регулярная грамматика порождает регулярный язык; поскольку L={anbn}L=\{a^n b^n\}L={anbn} не регулярен, никакой регулярной грамматики, эквивалентной данной, не существует. Также непосредственно видно, что правило S→aSbS\to a S bS→aSb не является ни праволинейным, ни леволинейным (рекурсивный символ находится в середине продукции), так что прямое приведение к регулярной форме невозможно.
Вывод: НКА/ДКА для данного языка не существует; корректный автомат — PDA, приведённый выше; грамматику в регулярную преобразовать нельзя, потому что язык нерегулярен.