Автомат PushDown (PDA) для L={a^(n)b^(n)c^(n)|n>=1}
Я по поручению дурака пытаюсь построить автомат Pushdown для неконтекстно-свободного языка L={a^(n)b^(n)c^(n)|n>=1} и подумал о двух подходах.
Первый подход:-
Я думал, что для каждого 'a' в строке я буду вставлять 3 'a' в стек, а для каждого 'b' в строке я теперь вытолкну 2 'a' из стека для каждого 'c' в строке I будет по-прежнему иметь 1 "а" в стеке.
Проблема с первым подходом:- сгенерированный язык становится примерно таким: L={a^(p)b^(m)c^(n)| p>=1 и не может определить, как можно определить m и n}
Второй подход:-
Мы знаем, что L={ a^(n)b^(m)c^(m)d^(n) | n>=0 } - это контекстно-свободный язык, а L={ wxw | w∈(a,b)* } также является контекстно-свободным языком.
Итак, я подумал, что L={ a^(n)b^(m)b^(m)c^(n) | n>=1 и m = этаж ((n+1)/2) }
Проблема со Вторым подходом:- не знаю, можем ли мы вычислить минимальный уровень (n+1/2) в КПК, не нарушая элементы стека.
Пожалуйста, помогите определить, как m и n могут быть определены в первом подходе, и как я могу найти слово ((n + 1) / 2) в КПК.
Файлы JFLAP доступны для обоих при необходимости.
2 ответа
Как отмечает Ами Тавори, для этого языка нет КПК, потому что этот язык не является контекстно-свободным. Этот язык легко распознать, если вы используете очередь вместо стека, используете два стека или машину Тьюринга (все эквивалентно).
Машина очереди:
- Ставить
a
пока вы видитеa
с, пока вы не увидитеb
, - Dequeue
a
и поставить в очередьb
пока вы видитеb
с, пока вы не увидитеc
- Dequeue
b
пока вы видитеc
s. - Принять, если вы завершите этот процесс без дополнительного ввода и пустой очереди.
Двухстоечный КПК:
- Используйте первый стек, чтобы убедиться
a^n b^n
толкаяa
когда вы видитеa
и появляютсяa
когда вы видитеb
; - Используйте второй стек, чтобы убедиться,
b^n c^n
толкаяb
когда вы видитеb
и появляютсяb
когда вы видитеc
; - Примите, если оба стека пусты в конце этого процесса.
Машина Тьюринга:
- обеспечивать
a^n ... c^n
заменяя каждыйa
сA
и стирание соответствияc
; - обеспечивать
A^n b^n
стирая совпадающие парыA
а такжеb
; - Принять, если в конце этого процесса у вас больше нет
A
и не болееb
лента была полностью очищена.
Одна из причин, по которой вам не удалось создать автомат для этого языка, заключается в том, что его нет. Лемма прокачки Бар Гилеля показывает это.
Чтобы наметить доказательство, предположим, что это можно сделать. Тогда для некоторого p каждая строка больше p может быть разделена на uvwxy, st,
| VWX | <р
| ъх | > 1
uv n wx n y также принимается автоматом для любого n.
Первое правило подразумевает, что vwx не может охватывать три региона, только самое большее два (для достаточно больших строк). Второе и третье правила теперь подразумевают, что вы можете качать так, чтобы непокрытая область была меньше, чем, по крайней мере, одна из других областей.