Automat ze stosem (PDA)

by Jerry Sky

2020-11-05



1. DEF: PDA

Automat z dodatkową pamięcią w postaci stosu (widać tylko ostatnio włożony symbol).

Automatem ze stosem nazywamy M=(Q,Σ,Γ,δ,q0,Z0,F)M = (Q,\Sigma, \Gamma, \delta, q_0, Z_0, F), gdzie

1.1. DEF: Opis chwilowy automatu

— to trójka (q,α,γ)(q, \alpha, \gamma), gdzie

1.2. DEF: Relacja przejścia w jednym kroku M\vdash_M

\vdash^* — zwrotne i przechodnie domknięcie \vdash,
i\vdash^iii-krotne złożenie \vdash.


1.3. Sposoby akceptowania słów języka

  1. Język Akceptowany przez PDA MM przy pustym stosie (F=F = \emptyset) to N(M)={wΣ:pQ(q0,w,Z0)(p,ϵ,ϵ)} N(M) = \left\{ w \in \Sigma^*: \exists p\in Q \enspace (q_0, w, Z_0) \vdash^* (p, \epsilon, \epsilon) \right\}

  2. Język akceptowany przez PDA MM przez stan końcowy to L(M)={wΣ:pFγΓ(q,w,Z0)(p,ϵ,γ)} L(M) = \left\{ w \in \Sigma^*: \exists p\in F \enspace \exists \gamma\in \Gamma^* \enspace (q, w, Z_0) \vdash^* (p, \epsilon, \gamma) \right\}

Oba sposoby akceptowania są równoważne.


2. Przykład

Palindrom z gramatyką S0S01S1#S \to 0S0|1S1|\#

  1. Automat startuje z pustym stosem i w stanie q1q_1.
  2. Jeżeli jesteśmy w stanie q1q_1 i na wejściu widzimy a{0,1}a \in \{0,1\} to wstawiamy aa na stos, pozostajemy w stanie q1q_1 i idziemy do następnego symbolu wejściowego.
  3. Jeżeli jesteśmy w stanie q1q_1 i na wejściu widzimy #\# to przechodzimy do stanu q2q_2 i idziemy do następnego symbolu wejściowego.
  4. Jeżeli jesteśmy w stanie q2q_2 i na wejściu widzimy a{0,1}a \in \{0,1\} i na stosie jest także aa to pozostajemy w stanie q2q_2, ściągamy aa ze stosu i idziemy do następnego symbolu wejściowego.
  5. Jeżeli jesteśmy w stanie q2q_2, skończyliśmy czytać wejście i stos jest pusty, to akceptujemy słowo wejściowe.
  6. W każdym innym przypadku odrzucamy słowo wejściowe.

3. Przykład

Mamy maszynę M=({q1,q2},{0,1},{A,B,Z},δ,q1,Z,)M = \left( \{q_1,q_2\}, \{0,1\}, \{A,B,Z\}, \delta, q_1, Z, \emptyset \right)

δ\delta (0,A)(0, A) (0,B)(0, B) (0,Z)(0, Z) (1,A)(1, A) (1,B)(1, B) (1,Z)(1, Z)
q1q_1 (q1,AA)(q_1, AA) (q1,AB)(q_1, AB) (q1,A)(q_1, A) (q1,BA)(q_1, BA) (q1,BB)(q_1, BB) (q1,B)(q_1, B)
q2q_2 (q2,ϵ)(q_2, \epsilon) (q2,ϵ)(q_2, \epsilon)

δ\delta (ϵ,A)(\epsilon, A) (ϵ,B)(\epsilon, B) (ϵ,Z)(\epsilon, Z)
q1q_1 (q2,A)(q_2, A) (q2,B)(q_2, B) (q2,ϵ)(q_2, \epsilon)
q2q_2

Przykładowo dla 01100110:
(q1,0110,Z)(q1,110,A)(q1,10,BA)(q2,10,BA)(q2,0,A)(q2,ϵ,ϵ)(q_1, 0110, Z) \vdash (q_1, 110, A) \vdash (q_1, 10, BA) \vdash (q_2, 10, BA) \vdash (q_2, 0, A) \vdash (q_2, \epsilon, \epsilon)

Za to 110110 nie należy do języka:

  1. (q1,110,Z)(q1,10,B)(q1,0,BB)(q1,ϵ,ABB)(q2,ϵ,ABB)?(q_1, 110, Z) \vdash (q_1, 10, B) \vdash (q_1, 0, BB) \vdash (q_1, \epsilon, ABB) \vdash (q_2, \epsilon, ABB) \vdash ?
  2. (q1,110,Z)(q1,10,B)(q1,0,BB)(q2,0,BB)?(q_1, 110, Z) \vdash (q_1, 10, B) \vdash (q_1, 0, BB) \vdash (q_2, 0, BB) \vdash ?
  3. (q1,110,Z)(q1,10,B)(q2,10,B)(q2,0,ϵ)?(q_1, 110, Z) \vdash (q_1, 10, B) \vdash (q_2, 10, B) \vdash (q_2, 0, \epsilon) \vdash ?
  4. (q1,110,Z)(q2,100,ϵ)?(q_1, 110, Z) \vdash (q_2, 100, \epsilon) \vdash ?

Oczywiście mamy język N(M)={wwR:w{0,1}}N(M) = \left\{ ww^R: w \in \{0,1\}^* \right\}.


4. Deterministyczny PDA

PDA może być deterministyczny, jeśli w każdym przypadku możemy wykonać co najwyżej jedno przejście (czyli może też być zero przejść w przeciwieństwie do zwykłego DFA):

  1. qQZΓδ(q,ϵ,Z)    aΣδ(q,a,Z)=\forall q \in Q \enspace \forall Z \in \Gamma \enspace \delta(q, \epsilon, Z) \neq \emptyset \implies \forall a \in \Sigma \enspace \delta(q,a,Z) = \emptyset
  2. qQaΣ{ϵ}ZΓδ(q,a,Z)1\forall q \in Q \enspace \forall a \in \Sigma \cup \{\epsilon\} \enspace \forall Z \in \Gamma \enspace \left\lvert \delta(q, a, Z) \right\rvert \le 1

Niestety takie DPDA są słabsze od PDA.
Np. język z przykładu nie jest rozpoznawalny przez żaden DPDA.


5. Twierdzenie: język bezkontekstowy     \implies PDA

Jeśli LL jest językiem bezkontekstowym to istnieje PDA MM taki, że L=N(M)L = N(M).

5.1. D-d

Załóżmy, że LL nie zawiera ϵ\epsilon i jest zdefiniowany przez gramatykę bezkontekstową w postaci Greibach G=(N,T,P,S)G = (N, T, P, S). Definiujemy PDA MM następująco:

MM symuluje wprowadzenie lewostronne gramatyki GG. Ponieważ GG jest typu Greibach każdy kolejny napis w wyprowadzeniu lewostronnym ma formę xαx\alpha, gdzie xTx \in T^* oraz αN\alpha \in N^*. Maszyna MM przechowuje α\alpha na stosie po przeczytaniu przedrostka xx.

Teraz d-d indukcyjny po długości wyprowadzenia (liczby kroków), że SG    (q,x,S)M(q,ϵ,ϵ) S \underset{G}{\Rightarrow}^* \iff (q, x, S) \underset{M}{\vDash}^* (q, \epsilon, \epsilon)


5.2. Przykład

G=({A,B},{a,b},{AaABaB,Bb},A)G = \left( \{A,B\}, \{a,b\}, \{A \to aAB|aB, B \to b\}, A \right)

A więc M=({q},{a,b},{A,B},δ,q,A,)M = \left( \{q\}, \{a,b\}, \{A,B\}, \delta, q, A, \emptyset \right)

δ\delta (a,A)(a,A) (a,B)(a, B) (b,A)(b, A) (b,B)(b, B) (ϵ,A)(\epsilon, A) (ϵ,B)(\epsilon, B)
qq (q,AB),(q,B)(q, AB), (q, B) (q,ϵ)(q, \epsilon)

Czyli na przykład mamy:
AaABaaBBaabBaabbA \Rightarrow aAB \Rightarrow aaBB \Rightarrow aabB \Rightarrow aabb.

I właśnie teraz równoważnie:
(q,aabb,A)(q,abb,AB)(q,bb,BB),(q,b,B)(q,ϵ,ϵ)(q, aabb, A) \vdash (q, abb, AB) \vdash (q, bb, BB), \vdash (q, b, B) \vdash (q, \epsilon, \epsilon).


6. Twierdzenie: PDA     \implies język bezkontekstowy

Jeśli L=N(M)L = N(M) dla PDA MM to LL jest językiem bezkontekstowym.

6.1. D-d

Weźmy PDA M=(Q,Σ,Γ,δ,q0,Z0,)M = (Q, \Sigma, \Gamma, \delta, q_0, Z_0, \emptyset). Konstruujemy gramatykę bezkontekstową G=(N,Σ,P,S)G = (N, \Sigma, P, S), gdzie

Wyprowadzenie lewostronne w GG symuluje ruchy MM na wejściu xx.

[q,A,p][q, A, p] wyprowadza x    Mx \iff M będąc w stanie qq i mając na stosie AαA \alpha po wczytaniu xx znajdzie się w stanie pp, na stosie będzie α\alpha i α\alpha nie była zmieniana i czytana w tym czasie.

Teraz dowód indukcyjny po liczbie kroków, że [q,A,p]Gx    (q,x,A)M(p,ϵ,ϵ) [q, A, p] \underset{G}{\Rightarrow}^* x \iff (q, x, A) \underset{M}{\vdash}^* (p, \epsilon, \epsilon)


6.2. Przykład

Mamy M=({p,q},{a,b},{X,Z},δ,p,Z,)M = \left( \{p,q\}, \{a,b\}, \{X,Z\}, \delta, p, Z, \emptyset \right)

δ\delta (a,X)(a, X) (a,Z)(a, Z) (b,X)(b, X) (b,Z)(b, Z) (ϵ,X)(\epsilon, X) (ϵ,Z)(\epsilon, Z)
pp (p,XX)(p, XX) (p,X)(p, X) (q,ϵ)(q, \epsilon) (q,ϵ)(q, \epsilon)
qq (q,ϵ)(q, \epsilon)

Możemy powyższą tabelkę zapisać w następujący sposób:

Tworzymy produkcje:

i od razu je „przetwarzamy” na podstawie funkcji przejścia δ\delta i patrząc na dowód twierdzenia.
Następnie usuwamy niepotrzebne elementy, które albo się zapętlają, albo prowadzą do nikąd.