Основываясь на этих переходах, я буду предполагать, что конечным состоянием является q2, и оно принимает с пустым стеком (похоже, оно избавляется даже от символа нижней части стека z, что немного необычно для меня, но Я думаю, это нормально).
Это следующие переходы:
δ(q0, a, z) = {(q1 , 0), (q2 , λ)}
δ(q1, b, 0) = {(q1, 1)}
δ(q1, b, 1) = {(q1, 1)}
δ(q1, a, 1) = {(q2, λ)}
Давайте рассмотрим их по одному.
δ(q0, a, z) = {(q1 , 0), (q2 , λ)}
означает что если мы находимся в исходном состоянии и видим a
, мы можем либо go указать q1
и заменить z
на 0
, либо мы можем избавиться от z
и go заявить q2
. Это фактически принимающая конфигурация для NPDA; это означает, что NPDA принимает пустую строку, и любой язык, который мы определяем, также должен содержать эту строку. Поскольку единственный выход из начального состояния q0
состоит в том, чтобы увидеть a
, мы также знаем, что любые непустые строки в нашем языке должны начинаться с a
.
δ(q1, b, 0) = {(q1, 1)}
означает, что если мы сейчас находимся в состоянии q1
, видим b
на входе и имеем 0
на вершине стека, мы можем изменить символ стека на 1
. Мы будем в этой конфигурации, как только мы получим состояние q1
с q0
. Обратите внимание, что, поскольку никакой другой переход не помещает 0
поверх стека, это единственный раз, когда этот переход можно использовать; и действительно, его нужно использовать, поскольку q1
не принимает, и мы должны пройти через этот переход, чтобы очистить 0
с вершины стека. Итак, все непустые строки в языке должны начинаться с ab
.
δ(q1, b, 1) = {(q1, 1)}
означает, что если мы в состоянии q1
, см. b
на входе и 1
на вершине стека, мы можем потреблять больше b
s навсегда. Мы останемся в этой конфигурации, пока у нас будет больше b
на входе. Однако нам не обязательно проходить через это состояние: существуют другие переходы, которые помещают 1
поверх стека, и путь к принимающему состоянию может вообще не включать этот переход. Этот переход позволяет нам поставить столько b
с, сколько мы хотим, после того, как требуется b
, которое мы видели в последнем переходе.
δ(q1, a, 1) = {(q2, λ)} means that if we're in state
q1 , see an
a in the input and have a
1 on top of the stack, we can erase the stack and go to the accepting state. This means that any non-empty string in the language ends with a single
a`.
Напомним:
- пустая строка на языке
- любая непустая строка в языке начинается с
ab
- любая непустая строка в языке может иметь произвольное число
b
с в середине - любая непустая строка в языке заканчивается с
a
.
Собрав все это вместе, мы находим регулярное выражение, описывающее язык: e + abb*a
. Мы не должны удивляться этому, так как этот стек NPDA содержит от одного до двух элементов; поскольку количество используемых стеков является постоянным, NPDA эквивалентен некоторому DFA, и поэтому его язык должен быть регулярным.