Stackautomat

Nichtdeterministischer / deterministischer Stackautomat

Es gibt Sprachen, die von einem nichtdeterministischen Stackautomaten erkannt werden, aber von keinem deterministischen Stackautomaten.

Ein Beispiel für eine solche Sprache ist die Sprache

L  =  { wwR  |  w ∈ {a, b}*,   wR ist das Spiegelbild von w }

also die Menge aller Wörter, die sich in w und w rückwärts gelesen zerlegen lassen.

Ein solches Wort ist beispielsweise abba, mit w = ab und wR = ba.

Der folgende nichtdeterministische Stackautomat N  = (Z, E, H, d, q, F) erkennt die Sprache aller Wörter der Form wwR über dem Alphabet {a, b}.

Z={0, 1, 2, 3} Zustands­menge
E={a, b} Eingabe­alphabet
H={$, a, b} Stack­alphabet
q=0 Startzustand
F={3} Menge der Endzustände
d: Übergangs­relation

 

Eingabeband

 
 
 
 
 
 
 
 
 
 
 
 
 
Pfeil
 
 
 
 
 
 
 
 
 
 
 
 
 
Pfeil
Stack

Eingabewort

   

 

sehh's'
 0 εε$1
 1 aεa1
 1 bεb1
 1 εεε2
 2 aaε2
 2 bbε2
 2 ε$ε3*




 

Wenn du den Stackautomaten simulierst, legst du als Erstes das Stack-Ende-Zeichen $ auf den Stack.

Dann legst du zunächst alle gelesenen Zeichen von w auf den Stack und anschließend entfernst du diese korrespondierend zu den gelesenen spiegelbildlichen Zeichen von wR wieder vom Stack.

An der Grenze zwischen w und wR schaltest du von "Ablegen auf dem Stack" zu "Entfernen vom Stack" um, indem du den Zustandsübergang 1 ε ε ε 2 vollführst (gelbes Feld in der Übergangsrelation anklicken).

Als Mensch siehst du zwar durch scharfes Hinsehen, wo diese Stelle ist, also die Mitte des Eingabewortes – ein Stackautomat jedoch kann dies nicht sehen, er kann dies nur nichtdeterministisch sozusagen raten. Hier ist wirklich Nichtdeterminismus gefragt.

Es gibt keinen deterministischen Stackautomaten, der die Sprache L erkennt, denn ein deterministischer Stackautomat weiß nicht, wo w endet und wR beginnt.