Первый из них может работать следующим образом:
- читает a в первом состоянии и помещает pu sh a в стек; переход в новое состояние
- , чтение ab во втором состоянии и pu sh ab в стек; переход в новое состояние
- навсегда читает b в третьем состоянии, каждый раз помещая b в стек. если вы в конце концов прочитаете a, перейдите в новое состояние и pu sh a a в стеке
- прочитаете b в четвертом состоянии, поместив b в стек; переход в новое состояние
- чтение a в пятом состоянии навсегда, помещая a в стек; в любой момент недетерминированный переход в новое состояние
- в шестом состоянии, просто ничего не читать и вываливать вещи из стека. это состояние принимает, и npda принимает входную строку, если вход полностью прочитан и стек пуст.
Второй может работать так:
- прочитайте хотя бы один a и pu sh его в стеке, затем перейдите в новое состояние
- продолжайте чтение навсегда во втором состоянии, каждый раз помещая один a в стек; если вы видите b, go в новое состояние
- прочитайте b в третьем состоянии и вытолкните a из стека; go в новое состояние
- прочитайте b в четвертом состоянии и оставьте стек в покое; go вернуться в третье состояние
- продолжать читать b в третьем и четвертом состояниях, пока не закончится ввод; если вы находитесь в четвертом состоянии, у вас закончился ввод и у вас пустой стек, тогда и только тогда кпк принимает входную строку
EDIT: схема необходимых переходов.
Первый:
q0 is initial
(q0, a, Z) -> (q1, aZ)
(q1, b, a) -> (q2, ba)
(q2, b, b) -> (q2, bb)
(q2, a, b) -> (q3, ab)
(q3, b, a) -> (q4, ba)
(q4, a, b) -> (q4, ab)
(q4, a, a) -> (q4, aa)
(q4, e, a) -> (q5, a)
(q4, e, b) -> (q5, b)
q5 is accepting
Второй:
q0 is initial
(q0, a, Z) -> (q1, aZ)
(q1, a, a) -> (q1, aa)
(q1, b, a) -> (q2, a)
(q2, b, a) -> (q3, e)
(q3, b, a) -> (q2, a)
q3 is accepting
Оба NPDA предназначены для принятия в состоянии принятия, когда стек пуст и вход исчерпан.