Nichtdeterministische Automaten mit Stack — das Akzeptor-Modell für die kontextfreien Sprachen (Typ 2).
TL;DR
- Ein PDA erweitert den endlichen Automaten um einen Kellerspeicher (Stack) mit Kelleralphabet $\Gamma$ und Bodensymbol $\#$.
- Die Übergangsfunktion $\delta$ liest optional ein Eingabezeichen und das oberste Kellerzeichen, ersetzt es durch ein Wort aus $\Gamma^*$ und ist per Default nichtdeterministisch.
- PDAs erkennen genau die kontextfreien Sprachen (Typ 2 der Chomsky-Hierarchie).
- Es gibt zwei gleich mächtige Akzeptanzarten: Akzeptanz durch Endzustand und Akzeptanz durch leeren Keller.
- DPDA (deterministische PDA) sind echt schwächer — nicht jede kontextfreie Sprache ist deterministisch kontextfrei.
- Diese Seite enthält jetzt auch durchgerechnete Rechenaufgaben. Klausur = Lesen UND Rechnen.
1. Definitionen & Formalismen
Kellerautomat (formal)
Ein Kellerautomat ist ein 7-Tupel
$$M = (Z, \Sigma, \Gamma, \delta, z_0, \#, E)$$- $Z$ — endliche Menge von Zuständen
- $\Sigma$ — endliches Eingabealphabet
- $\Gamma$ — endliches Kelleralphabet (Stack-Alphabet)
- $\delta: Z \times (\Sigma \cup \{\varepsilon\}) \times \Gamma \to \mathcal{P}(Z \times \Gamma^*)$ — Übergangsfunktion (nichtdeterministisch, ergibt Potenzmenge)
- $z_0 \in Z$ — Startzustand
- $\# \in \Gamma$ — Kellerbodensymbol (initial einziges Zeichen auf dem Stack)
- $E \subseteq Z$ — Menge der Endzustände (nur relevant bei Endzustands-Akzeptanz)
Konfiguration
Eine Konfiguration beschreibt den vollständigen Momentanzustand des PDA und ist ein Tripel $(z, w, \gamma) \in Z \times \Sigma^* \times \Gamma^*$.
- $z$ — aktueller Zustand
- $w$ — noch zu lesende Resteingabe
- $\gamma$ — Kellerinhalt (linkes Zeichen ist Top of Stack)
Die Startkonfiguration lautet $(z_0, w, \#)$. Ein Übergang wird mit $\vdash$ notiert.
Übergangsschritt
Aus $\delta(z, a, A) \ni (z', B_1 B_2 \dots B_k)$ folgt
$$(z, aw, A\gamma) \;\vdash\; (z', w, B_1 B_2 \dots B_k \, \gamma)$$Das oberste Kellerzeichen $A$ wird durch das Wort $B_1 \dots B_k$ ersetzt. Bei $\varepsilon$-Übergängen ($a = \varepsilon$) wird kein Eingabezeichen konsumiert.
Akzeptanz durch Endzustand — $L(M)$
$$L(M) = \{\, w \in \Sigma^* \mid (z_0, w, \#) \;\vdash^*\; (z, \varepsilon, \gamma) \text{ für ein } z \in E, \gamma \in \Gamma^* \,\}$$Das Wort $w$ wird akzeptiert, wenn nach vollständigem Lesen ein Endzustand erreichbar ist. Kellerinhalt am Ende beliebig.
Akzeptanz durch leeren Keller — $N(M)$
$$N(M) = \{\, w \in \Sigma^* \mid (z_0, w, \#) \;\vdash^*\; (z, \varepsilon, \varepsilon) \text{ für ein } z \in Z \,\}$$Das Wort $w$ wird akzeptiert, wenn nach vollständigem Lesen der Keller leer ist. Zustand am Ende beliebig; $E$ irrelevant.
PDA und Typ-2-Sprachen
Eine Sprache $L$ ist genau dann kontextfrei, wenn ein PDA $M$ existiert mit $L = L(M)$.
Die Klasse der von PDAs erkannten Sprachen fällt zusammen mit der Klasse der von kontextfreien Grammatiken erzeugten Sprachen.
Deterministischer PDA (DPDA)
Ein PDA heißt deterministisch, wenn für alle $z \in Z$, $A \in \Gamma$ gilt: entweder ist $\delta(z, \varepsilon, A) = \emptyset$ und $|\delta(z, a, A)| \leq 1$ für alle $a$, oder aber $\delta(z, a, A) = \emptyset$ für alle $a \in \Sigma$.
Kurz: keine Konflikte zwischen $\varepsilon$- und Symbol-Übergängen und höchstens ein Nachfolger pro Situation.
2. Kernkonzepte & Vorgehen
- Sprache verstehen. Formuliere zuerst in Worten, welche Bedingungen ein Wort in $L$ erfüllen muss. Zählen ($a^n b^n$), Spiegeln ($w w^R$), Verhältnisse ($2 \cdot |a| = |b|$)? Das bestimmt, was der Stack merken soll.
- Stack-Strategie festlegen. Der Keller ist ein LIFO-Gedächtnis. Typische Muster: pushe Marker pro gelesenem Zeichen, poppe später im Verhältnis. Der Keller ist die einzige unbegrenzte Ressource.
- Zustände als Phasen. Zustände unterscheiden Phasen (z. B. ich lese noch $a$, ich lese jetzt $b$). Kombiniere Zustandsinformation mit Stack-Information — beides zusammen kodiert den vollständigen Kontext.
- Nichtdeterminismus nutzen. Für Palindrome oder Sprachen mit Mittelpunkt: rate den Umschaltpunkt per $\varepsilon$-Übergang. Das ist erlaubt und für viele CFL nötig.
- Akzeptanzart wählen. Für Klausurpapier ist Leerkeller-Akzeptanz oft eleganter (kein $E$ nötig), Endzustands-Akzeptanz ist deskriptiver, wenn Zustandsstruktur wichtig ist.
- Konfigurationsfolge ausschreiben. Bei Aufgaben verfolge das Wort $w$ jede Konfiguration einzeln notieren als $(z, \text{Resteingabe}, \text{Kellerinhalt}) \vdash \dots$ — die Nachvollziehbarkeit ist der bewertete Teil.
3. Beispiel durchgerechnet
PDA für $L = \{\, a^n b^n \mid n \geq 1 \,\}$
Wir konstruieren einen PDA mit Endzustands-Akzeptanz. Idee: pushe für jedes gelesene $a$ ein Zeichen $A$ auf den Stack, poppe für jedes $b$ ein $A$ wieder herunter. Am Ende muss nur noch das Bodensymbol $\#$ da liegen.
$M = (Z, \Sigma, \Gamma, \delta, z_0, \#, E)$ mit
- $Z = \{z_0, z_1, z_f\}$
- $\Sigma = \{a, b\}$, $\Gamma = \{A, \#\}$
- $E = \{z_f\}$
Übergangsfunktion $\delta$:
δ(z₀, a, #) = { (z₀, A#) } // erstes a: pushe A auf Boden
δ(z₀, a, A) = { (z₀, AA) } // weitere a: pushe A
δ(z₀, b, A) = { (z₁, ε) } // erstes b: Phase wechseln, poppe A
δ(z₁, b, A) = { (z₁, ε) } // weitere b: poppe A
δ(z₁, ε, #) = { (z_f, #) } // Boden erreicht: akzeptiere
Zustandsdiagramm
a, # / A# b, A / ε
a, A / AA
┌──────┐ ┌──────┐ ┌──────┐
→──▶ │ z₀ │ ─────────▶ │ z₁ │ ─────────▶ │ z_f │ ((Endzustand))
└──────┘ └──────┘ ε, #/# └──────┘
b, A / ε
(Selbstschleife)
Konfigurationsfolge für $w = aaabbb$
1. ⊢ (z₀, aabbb, A#) # δ(z₀,a,#) push A
2. ⊢ (z₀, abbb, AA#) # δ(z₀,a,A) push A
3. ⊢ (z₀, bbb, AAA#) # drittes a: push A
4. ⊢ (z₁, bb, AA#) # δ(z₀,b,A) Phasenwechsel, pop
5. ⊢ (z₁, b, A#) # δ(z₁,b,A) pop
6. ⊢ (z₁, ε, #) # letztes b: pop, Boden sichtbar
7. ⊢ (z_f, ε, #) # ε-Übergang in Endzustand
Da $z_f \in E$ und die Eingabe vollständig gelesen ist, gilt $aaabbb \in L(M)$. ✓
Gegenprobe: $w = aab$
1. ⊢ (z₀, ab, A#)
2. ⊢ (z₀, b, AA#)
3. ⊢ (z₁, ε, A#) # Eingabe leer, aber A noch auf Stack
$\delta(z_1, \varepsilon, A)$ ist nicht definiert und $z_1 \notin E$. Es gibt keinen Übergang zu einem Endzustand mit leerer Resteingabe. Also $aab \notin L(M)$. ✓
4. Rechenaufgaben mit Lösung
Trainiere hier den Klausur-Modus: Aufgabe lesen, selbst probieren, dann Lösung aufklappen und Schritt für Schritt vergleichen.
Konstruiere einen Kellerautomaten $M = (Z, \Sigma, \Gamma, \delta, z_0, \#)$, der die Sprache $L = \{\, a^n b^n \mid n \geq 0 \,\}$ durch leeren Keller akzeptiert. Gib das 6-Tupel und alle Übergänge $\delta$ vollständig an. Achte insbesondere auf den Randfall $n = 0$ (leeres Wort $\varepsilon$).
Lösung anzeigen
| # | $\delta(z, a, X)$ | Wirkung |
|---|---|---|
| 1 | $\delta(z_0, a, \#) = \{(z_0, A\#)\}$ | erstes $a$: push $A$ |
| 2 | $\delta(z_0, a, A) = \{(z_0, AA)\}$ | weiteres $a$: push $A$ |
| 3 | $\delta(z_0, b, A) = \{(z_1, \varepsilon)\}$ | erstes $b$: Phasenwechsel, pop |
| 4 | $\delta(z_1, b, A) = \{(z_1, \varepsilon)\}$ | weiteres $b$: pop |
| 5 | $\delta(z_1, \varepsilon, \#) = \{(z_1, \varepsilon)\}$ | Boden entfernen, Keller leer |
| 6 | $\delta(z_0, \varepsilon, \#) = \{(z_1, \varepsilon)\}$ | Randfall $n = 0$: sofort leeren |
Konstruiere einen PDA für die Sprache $L = \{\, w w^R \mid w \in \{a, b\}^* \,\}$ (Palindrome gerader Länge). Nutze Endzustands-Akzeptanz und begründe kurz, warum du Nichtdeterminismus benötigst.
Lösung anzeigen
| # | Übergang | Bedeutung |
|---|---|---|
| 1 | $\delta(z_0, a, \#) = \{(z_0, A\#)\}$ | push $A$ auf Boden |
| 2 | $\delta(z_0, b, \#) = \{(z_0, B\#)\}$ | push $B$ auf Boden |
| 3 | $\delta(z_0, a, A) = \{(z_0, AA)\}$ | push $A$ |
| 4 | $\delta(z_0, a, B) = \{(z_0, AB)\}$ | push $A$ |
| 5 | $\delta(z_0, b, A) = \{(z_0, BA)\}$ | push $B$ |
| 6 | $\delta(z_0, b, B) = \{(z_0, BB)\}$ | push $B$ |
| # | Übergang | Bedeutung |
|---|---|---|
| 7 | $\delta(z_0, \varepsilon, A) = \{(z_1, A)\}$ | Mitte raten, Phase wechseln |
| 8 | $\delta(z_0, \varepsilon, B) = \{(z_1, B)\}$ | Mitte raten, Phase wechseln |
| 9 | $\delta(z_0, \varepsilon, \#) = \{(z_1, \#)\}$ | Fall $w = \varepsilon$: leeres Palindrom |
| # | Übergang | Bedeutung |
|---|---|---|
| 10 | $\delta(z_1, a, A) = \{(z_1, \varepsilon)\}$ | $a$ matcht $A$: pop |
| 11 | $\delta(z_1, b, B) = \{(z_1, \varepsilon)\}$ | $b$ matcht $B$: pop |
| 12 | $\delta(z_1, \varepsilon, \#) = \{(z_f, \#)\}$ | Boden sichtbar: akzeptiere |
Gegeben sei der PDA aus dem Beispiel oben mit $\delta(z_0, a, \#) = \{(z_0, A\#)\}$, $\delta(z_0, a, A) = \{(z_0, AA)\}$, $\delta(z_0, b, A) = \{(z_1, \varepsilon)\}$, $\delta(z_1, b, A) = \{(z_1, \varepsilon)\}$, $\delta(z_1, \varepsilon, \#) = \{(z_f, \#)\}$ und $E = \{z_f\}$. Führe die vollständige Konfigurationsfolge für das Eingabewort $w = aabb$ aus und entscheide, ob $w \in L(M)$.
Lösung anzeigen
Gegeben die kontextfreie Grammatik $G = (V, \Sigma, P, S)$ in Chomsky-Normalform mit $V = \{S, A, B\}$, $\Sigma = \{a, b\}$ und den Produktionen
$$S \to AB, \quad S \to AC, \quad C \to SB, \quad A \to a, \quad B \to b$$Konstruiere einen PDA $M$, der $L(G)$ durch leeren Keller akzeptiert. Nutze die Standard-Konstruktion mit einem einzigen Zustand.
Lösung anzeigen
| Produktion | PDA-Übergang |
|---|---|
| $S \to AB$ | $\delta(z, \varepsilon, S) \ni (z, AB)$ |
| $S \to AC$ | $\delta(z, \varepsilon, S) \ni (z, AC)$ |
| $C \to SB$ | $\delta(z, \varepsilon, C) \ni (z, SB)$ |
| $A \to a$ | $\delta(z, \varepsilon, A) \ni (z, a)$ |
| $B \to b$ | $\delta(z, \varepsilon, B) \ni (z, b)$ |
| Terminal | PDA-Übergang |
|---|---|
| $a$ | $\delta(z, a, a) = \{(z, \varepsilon)\}$ |
| $b$ | $\delta(z, b, b) = \{(z, \varepsilon)\}$ |
Gegeben die kontextfreie Grammatik $G$ in Chomsky-Normalform mit Startsymbol $S$ und Produktionen
$$S \to AB \mid BC, \quad A \to BA \mid a, \quad B \to CC \mid b, \quad C \to AB \mid a$$Prüfe mit dem CYK-Algorithmus, ob das Wort $w = baaba$ (Länge $n = 5$) in $L(G)$ liegt. Fülle die vollständige CYK-Tabelle $V_{i,j}$ mit $1 \leq i \leq j \leq 5$ aus und begründe die Antwort.
Lösung anzeigen
| Position | Zeichen | $V_{i,i}$ |
|---|---|---|
| $V_{1,1}$ | $b$ | $\{B\}$ |
| $V_{2,2}$ | $a$ | $\{A, C\}$ |
| $V_{3,3}$ | $a$ | $\{A, C\}$ |
| $V_{4,4}$ | $b$ | $\{B\}$ |
| $V_{5,5}$ | $a$ | $\{A, C\}$ |
- $V_{1,2}$: $\{B\} \cdot \{A,C\} = \{BA, BC\}$. Regeln matchen: $A \to BA$ liefert $A$; $S \to BC$ liefert $S$. Also $V_{1,2} = \{A, S\}$.
- $V_{2,3}$: $\{A,C\} \cdot \{A,C\} = \{AA, AC, CA, CC\}$. Regeln matchen: $B \to CC$ liefert $B$. Also $V_{2,3} = \{B\}$.
- $V_{3,4}$: $\{A,C\} \cdot \{B\} = \{AB, CB\}$. Regeln matchen: $S \to AB$ liefert $S$; $C \to AB$ liefert $C$. Also $V_{3,4} = \{S, C\}$.
- $V_{4,5}$: $\{B\} \cdot \{A,C\} = \{BA, BC\}$. Wie $V_{1,2}$: $V_{4,5} = \{A, S\}$.
- $V_{1,3}$: Splits $V_{1,1} V_{2,3} = \{B\}\{B\} = \{BB\}$ (keine Regel); $V_{1,2} V_{3,3} = \{A,S\}\{A,C\} = \{AA, AC, SA, SC\}$ (keine Regel). $V_{1,3} = \emptyset$.
- $V_{2,4}$: $V_{2,2} V_{3,4} = \{A,C\}\{S,C\} = \{AS, AC, CS, CC\}$. Regel $B \to CC$ matcht: $B$. Split $V_{2,3} V_{4,4} = \{B\}\{B\} = \{BB\}$ nichts. Also $V_{2,4} = \{B\}$.
- $V_{3,5}$: $V_{3,3} V_{4,5} = \{A,C\}\{A,S\} = \{AA, AS, CA, CS\}$ nichts. $V_{3,4} V_{5,5} = \{S,C\}\{A,C\} = \{SA, SC, CA, CC\}$. Regel $B \to CC$ matcht: $B$. Also $V_{3,5} = \{B\}$.
- $V_{1,4}$: $V_{1,1} V_{2,4} = \{B\}\{B\}$ nichts; $V_{1,2} V_{3,4} = \{A,S\}\{S,C\} = \{AS, AC, SS, SC\}$ nichts; $V_{1,3} V_{4,4} = \emptyset$. Also $V_{1,4} = \emptyset$.
- $V_{2,5}$: $V_{2,2} V_{3,5} = \{A,C\}\{B\} = \{AB, CB\}$. Regeln $S \to AB$ und $C \to AB$ matchen: $\{S, C\}$. $V_{2,3} V_{4,5} = \{B\}\{A,S\} = \{BA, BS\}$. Regel $A \to BA$ matcht: $A$. $V_{2,4} V_{5,5} = \{B\}\{A,C\} = \{BA, BC\}$. Regeln $A \to BA$ und $S \to BC$ matchen: $\{A, S\}$. Vereinigung: $V_{2,5} = \{S, C, A\}$.
- $k=1$: $V_{1,1} V_{2,5} = \{B\}\{S,C,A\} = \{BS, BC, BA\}$. Regel $A \to BA$ matcht: $A$. Regel $S \to BC$ matcht: $S$.
- $k=2$: $V_{1,2} V_{3,5} = \{A,S\}\{B\} = \{AB, SB\}$. Regeln $S \to AB$ und $C \to AB$ matchen: $\{S, C\}$.
- $k=3$: $V_{1,3} V_{4,5} = \emptyset$.
- $k=4$: $V_{1,4} V_{5,5} = \emptyset$.
| $\ell$ | $i=1$ | $i=2$ | $i=3$ | $i=4$ | $i=5$ |
|---|---|---|---|---|---|
| 1 | $\{B\}$ | $\{A,C\}$ | $\{A,C\}$ | $\{B\}$ | $\{A,C\}$ |
| 2 | $\{A,S\}$ | $\{B\}$ | $\{S,C\}$ | $\{A,S\}$ | — |
| 3 | $\emptyset$ | $\{B\}$ | $\{B\}$ | — | — |
| 4 | $\emptyset$ | $\{S,C,A\}$ | — | — | — |
| 5 | $\{A,S,C\}$ | — | — | — | — |
5. Typische Klausurfragen (Lesen!)
Typ A — Konfigurationsfolge nachvollziehen
Gegeben ein PDA $M$ und ein Wort $w$. Aufgabe: Gib die Konfigurationsfolge $(z_0, w, \#) \vdash^* \dots$ an und entscheide, ob $w$ akzeptiert wird. Falle: bei Nichtdeterminismus musst du eine akzeptierende Berechnung finden — es genügt, dass eine existiert.
Typ B — Sprache eines PDA bestimmen
Gegeben eine $\delta$-Tabelle. Aufgabe: Beschreibe $L(M)$ in Mengennotation. Vorgehen: Muster erkennen (was wird gepusht, wann gepoppt, welche Phasen). Falle: Bodensymbol $\#$ als Bedingung für Akzeptanz übersehen.
Typ C — PDA zu einer Sprache konstruieren
Gegeben eine Sprache wie $L = \{\, a^n b^{2n} \mid n \geq 0 \,\}$. Aufgabe: konstruiere $\delta$. Falle: $n = 0$ (leeres Wort) wird gerne vergessen — hier braucht es einen $\varepsilon$-Übergang direkt in den Endzustand.
Typ D — Akzeptanzart umwandeln
Gegeben PDA mit Endzustands-Akzeptanz, konstruiere äquivalenten PDA mit Leerkeller-Akzeptanz (oder umgekehrt). Standard-Konstruktion: neues Bodensymbol $\$$ einfügen, spezieller Räum-Zustand, der bei Endzustand den Keller leert.
Typ E — DPDA vs PDA argumentieren
Aufgabe: Zeige, dass eine Sprache kontextfrei, aber nicht deterministisch kontextfrei ist, oder umgekehrt. Falle: nichtdeterministisch nötig muss argumentiert werden — ein einzelner DPDA-Versuch reicht als Nichtexistenzbeweis nicht.