NPDA для этого языка с n и n-1

введите здесь описание изображения

Чтобы нарисовать граф переходов NPDA, который принимает L, я думаю, что можно начать эту задачу, прочитав a, написав a, затем переместившись вправо, а затем проделав то же самое для b, чтобы было какое-то состояние q1< /sub>, который получает эти «ab» движения. Но как же тогда bb получить n-1?

У меня есть кое-что, что, как я думаю, работает, но я учу этому себя, так что, может быть, кто-нибудь может показать мне, где n и n-1 можно сделать правильно.

РЕДАКТИРОВАТЬ:

Но теперь это должно быть -

введите здесь описание изображения


person stackuser    schedule 28.11.2013    source источник


Ответы (1)


На самом деле это довольно просто. Каждый раз, когда вы читаете «ab», вы сохраняете токен в стеке. Затем, прочитав «c», вы берете один из этого токена. Затем за каждый «бб» вы берете один жетон из стека. Когда стек пуст, вы соглашаетесь.

Для самого NPDA все зависит от того, как вы определяете приемку. Из вашего вопроса я не понимаю, что вы имеете в виду под «написать a, а затем двигаться вправо». Вы путаете NPDA с машиной Тьюринга? NPDA очень похож на NFA (недетерминированные конечные автоматы), за исключением того, что он оснащен стеком, в который вы можете помещать символы стека. Подробнее читайте здесь: http://www.cs.duke.edu/~rodger/courses/cps140/lects/sectnpdaH.pdf

Ниже приведена таблица переходов, предполагающая символы стека {A,Z}, где Z — начальный символ стека. Принять, когда мы находимся в единственном принимающем состоянии qa и мы закончили чтение входной ленты. Предположим, что каждый переход всегда потребляет один символ стека, и если нет больше символа, который нужно использовать, пока NPDA не находится в состоянии принятия, NPDA не принимает (или отклоняет) строку.

В приведенной ниже таблице первый столбец представляет состояние, в котором мы сейчас находимся, и символ стека, который мы читаем. Последующие столбцы представляют новое состояние и символ стека, помещаемый в стек при чтении определенного символа во входной строке (или вообще без чтения какого-либо символа с помощью ε).

+------++---------+-------+--------+-------+
|      ||    a    |   b   |   c    |   ε   |
+------++---------+-------+--------+-------+
|(q1,Z)|| (q2,Z)  |    -   |    -   |   -   |
+------++---------+-------+--------+-------+
|(q1,A)|| (q2,A)  |    -   | (q3,ε) |   -   |
+------++---------+-------+--------+-------+
|(q2,Z)||    -    |(q1,ZA) |    -   |   -   |
+------++---------+-------+--------+-------+
|(q2,A)||    -    |(q1,AA) |    -   |   -   |
+------++---------+-------+--------+-------+
|(q3,Z)||    -    |   -    |    -   |(qa,ε) |
+------++---------+-------+--------+-------+
|(q3,A)||    -    | (q4,A) |    -   |   -   |
+------++---------+-------+--------+-------+
|(q4,A)||    -    | (q3,ε) |    -   |   -   |
+------++---------+-------+--------+-------+

Ключевая идея здесь заключается в том, что количество букв A в стеке показывает, сколько раз фраза «ab» появляется во входной строке.

Вы можете видеть, что при чтении "a" в состоянии q1 с символом стека Z мы помещаем Z обратно в стек. Это означает, что "ab" еще не обнаружен. Затем он перейдет к q2.

В q2 мы принимаем только «b», любой другой ввод приведет к зависанию (и, следовательно, отклонению). Он помещает считанное состояние обратно в стек, а также дополнительный A, эффективно увеличивая количество A в стеке на 1, поскольку этот переход представляет собой дополнительную фразу «ab» во входной строке.

Состояние q3 представляет часть после успешного чтения "c". Обратите внимание, что переход от q1 к q3 должен потреблять A, а не Z, так как у нас есть ограничение n >= 1. Затем, прочитав «b», он перейдет в состояние q4, чтобы дождаться другого «b». Позже q4, при чтении "b", будет потреблять символ стека A, соответствующий

В состоянии q3 нам также нужен переход в состояние принятия qa, как только мы достигнем символа стека Z, ссылаясь на состояние, в котором есть n копий "ab" и n-1 копии "бб".

Состояние q4 принимает только входную строку "b" с символом стека A, что означает, что новая фраза "bb" должна совпадать с ранее найденной фразой "ab".

Надеюсь это поможет!

person justhalf    schedule 28.11.2013
comment
Хорошее объяснение, +1, но я хочу убедиться, что полностью вас понимаю. Я добавил, как я думаю, способ, которым это будет работать. - person stackuser; 28.11.2013
comment
Если ваша лямбда (или 2?) на вашей диаграмме относится к тому, чтобы ничего не помещать в стек, а (ab,1)/1 относится к помещению дополнительного символа в стек, то вы получили Это. Хотя я не уверен, следует ли включать граничный случай чтения (ab,Z) в q_0. - person justhalf; 28.11.2013
comment
Спасибо, я обязательно вернусь и посмотрю (ab,z)/z, ответ принят. Вы знаете, если у вас есть минутка, я работаю над stackoverflow.com/questions/20258391/, о котором у меня уже есть некоторое представление (это может быть совершенно неправильно но эй, кто знает), а также stackoverflow.com/questions/ 20232717/, где я рассматриваю некоторые алгоритмы обслуживания дисков. Если вы заинтересованы. - person stackuser; 28.11.2013
comment
Добавил (ab,z)/z, просто хочу убедиться, что это тот самый переход, о котором вы говорили. - person stackuser; 28.11.2013
comment
На самом деле вы должны поставить (ab,Z)/1Z, что означает, что после чтения символа стека Z вы вернули Z обратно, а также вы вставили 1 в качестве нового символа стека. И другой переход тоже. Вместо (ab,1)/1 нужно поставить (ab,1)/11. Но вы правильно поняли мысль. - person justhalf; 28.11.2013
comment
Исправлено, чтобы включить первоначальный толчок 1 в z и 11 в верхней части стека впоследствии. Просто хочу убедиться, что я правильно вас понял. - person stackuser; 28.11.2013