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^i — ii-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∈Σ∗:∃p∈Q(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∈Σ∗:∃p∈F∃γ∈Γ∗(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ą S→0S0∣1S1∣#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. ∀q∈Q∀Z∈Γδ(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. ∀q∈Q∀a∈Σ∪{ϵ}∀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 x∈T∗x \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 S⇒G∗  ⟺  (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},{A→aAB∣aB,B→b},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:
A⇒aAB⇒aaBB⇒aabB⇒aabbA \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]⇒G∗x  ⟺  (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.