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", взимате едно от този жетон. След това за всяко "bb" взимате по един жетон от стека. Когато стекът е празен, приемате.

За самия 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 копия на "bb".

Състояние 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