Im vorletzten Post wurden Endliche Automaten erläutert. Dieser Automatentyp ist zwar sehr einfach, aber auch beschränkt in seiner Anwendung. In diesem Post wird der Kellerautomat erläutert - ein Automat, der einen Speicher besitzt und so zum Beispiel auch Palindrome erkennen kann.
Der Keller
Gegenüber einem Endlichen Automaten unterscheidet sich ein Keller-Automat durch den Keller. Der Keller ist ein Stack, mithilfe dessen sich der Automat Dinge merken kann. Wichtig: Man kann bei einem Stack neue Werte nur oben anfügen sowie den obersten Wert auslesen. Liest man den obersten Wert aus, wird dieser auch sofort entfernt1.
Die Definition eines Kellerautomat wächst im Vergleich zum Endlichen Automaten um zwei Parameter:
Das Keller-Alphabet , welches alle für den Keller zulässigen Symbole enthält, sowie das Initial-Symbol des Kellers, bezeichnet als .
, die Übergangsfunktion, verändert sich leicht, um nun zusätzlich die Veränderung des Kellers abzubilden.
Ein Beispiel
Ein einfacher Kellerautomat wäre dieser, der die Sprache ( mal “a”, dann mal “b”) erkennt.
Wie liest man so einen Übergangsgraphen?
Der Pfeil a,#;#A
von nach bedeutet:
Wenn du in bist, ein “a” eingelesen hast und der oberste Wert des Kellers ein “#”2 ist, dann gehe nach und lege ein “#” sowie ein “A” auf den Keller drauf.
Der obige Automat funktioniert so:
Zu Beginn werden alle “a”s des Wortes eingelesen, für jedes eingelesene “a” wird ein “A” auf den Keller gelegt.
Die Anzahl der “A” im Keller repräsentiert also die Anzahl der “a”, mit denen die Eingabe beginnt.
Sobald das erste “b” kommt, wird zu gewechselt. Nun wird für jedes folgende “b” ein “A” aus dem Keller genommen.
Am Ende des Wortes (wenn das leere Wort ε eingelesen wird) steht also im Keller ein “A” für jedes “a” ohne entsprechendes “b”. Ist der Keller leer (“#” ist das oberste Keller-Symbol), ist die Anzahl der “a” gleich der Anzahl der “b” und das Wort wird angenommen.
Was kann ein Kellerautomat?
Ein Kellerautomat kann sich Dinge über seine Eingabe merken, dadurch kann er deutlich mehr Sprachen abbilden als ein Endlicher Automat.
So kann ein Kellerautomat zum Beispiel auch Palindrome erkennen, deren Wortmitte markiert ist:
Der gezeigte Automat ist ein deterministischer Kellerautomat.
Mit einem nichtdeterministischen Kellerautomaten kann man ein Palindrom auch ohne eine Markierung der Wortmitte erkennen:
Daraus wird erkenntlich, dass es, anders als beim Endlichen Automaten, keine einfache Übersetzung zwischen deterministischen und nichtdeterministischen Kellerautomaten gibt - der nichtdeterministische kann mehr Sprachen erkennen.
Was kann ein Kellerautomat nicht?
Der Schwachpunkt des Kellerautomaten ist der Keller: Da der Keller nicht beliebig beschrieben werden kann, sind bestimmte Sprachen nicht durch ihn erkennbar.
Ein Beispiel:
Diese Sprache kann von einem Kellerautomaten nicht erkannt werden, da er zum validieren der “b”s bereits seinen Keller leeren muss. Um die Menge der “c”s zu validieren fehlen ihm die nötigen Keller-Elemente.
Auch die Sprache kann vom Kellerautomaten nicht erkannt werden, da der Keller dafür von unten nach oben ausgelesen werden müsste.
Solche Sprachen können von einer Turing-Maschine erkannt werden, die in einem zukünftigen Post erklärt wird.
TL;DR
Der Kellerautomat erweitert den Endlichen Automaten um einen Speicher. Dieser Speicher ist ein Stack, in dem Elemente des Keller-Alphabets gespeichert werden.
Ein Kellerautomat, der die Sprache erkennt, sieht so aus:
Die Menge der Sprachen, die ein nichtdeterministischer Kellerautomat erkennt, ist eine Übermenge der Sprachen, die ein deterministischer Kellerautomat erkennt.
Auch ein Kellerautomat erkennt nicht alle Sprachen, er ist durch den Stack beschränkt. Eine Turingmaschine kann zum Beispiel die Sprache erkennnen.
-
Wie man einen Stack implementiert, kann in meinem Post über Stacks nachgelesen werden. ↩
-
”#” ist per Konvention immer das unterste Element des Kellers. ↩