| Themen |
|
KellerautomatenBei einem Kellerautomaten handelt es sich um einen endlichen Automaten, der um einen Kellerspeicher erweitert wurde. Nichtdeterminitische Kellerautomaten lösen das Wortproblem für die Klasse der kontextfreien Sprachen. Das bedeutet, dass Kellerautomaten genau die Sprachen erkennen können, die eine kontextfreie Grammatik besitzen. Was den regulären Sprachen die endlichen Automaten sind, sind den kontextfreien Sprachen die Kellerautomaten.
Funktionsweise Die zugrundeliegende Idee beim Kellerautomaten ist die folgende: Die Eingabe wird zeichenweise von links nach rechts verarbeitet. Wenn es möglich ist, wird das Eingabezeichen sofort verarbeitet, wenn nicht, wird es in den Kellerspeicher gelegt und die Bearbeitung sobald wie möglich nachgeholt. Die möglichen Aktionen des Automaten hängen dabei, wie beim endlichen Automaten, vom momentan verarbeiteten Eingabezeichen, vom momentanen Zustand des Automaten und (das ist die Erweiterung gegenüber dem endlichen Automaten) zusätzlich vom Kellerinhalt ab, wobei immer nur das oberste Zeichen des Kellers relevant ist. In jedem Verarbeitungsschritt (das Lesen eines Zeichens und die damit zusammenhängenden Operationen) kann sich der Zustand des Automaten und der Kellerinhalt ändern.
Formale DefinitionEin nichtdeterministischer Kellerautomat ist ein 7-Tupel M = {Q, Σ,
Γ,
δ, q0, k0, E}. - Q ist eine endliche Menge von Zuständen.
- Σ ist ein Alphabet, das sog. Eingabealphabet.
-
Γ ist eine Alphabet, das sog. Kelleralphabet
- δ ⊆ Q × Γ × (Σ ∪ {ε}) × Q × Γ* ist die Übergangsrelation.
- q0 ∈ Q ist der Startzustand.
- k0 ∈
Γ ist Kellerleerzeichen, auch Kellerstartsymbol (in der Regel #).
- E ⊆ Q ist die Menge der Endzustände.
[Alternativ gibt es auch die Möglichkeit, Eingaben "mit leerem Keller" zu akzeptieren. Das bedeutet, dass eine Eingabe akzeptiert wird, wenn nach ihrer Abarbeitung der Keller leer ist]
δ als Relation Der Automat wird als nicht-deterministisch definiert, d.h. von einem Zustand aus sind bei identischem Eingabe- und Kellerzeichen verschiedene Folgezustände möglich. Das hat zur Folge, dass man δ nicht mehr als einfache Funktion (= linkseindeutige Relation) definieren kann. Ein und demselben Eingabetripel Q × Γ × (Σ ∪ {ε}) können nun mehrere verschiedene Ausgabetupel Q × Γ* zugeordnet sein. Aus diesem Grund definiert man δ nun allgemeiner als Relation, also als Teilmenge des kartesischen Produktes Q × Γ × (Σ ∪ {ε}) × Q × Γ*. ε-Übergänge Die Schreibweise Σ ∪ {ε} bedeutet, dass sogenannte ε-Übergänge zulässig sind. Das bedeutet, dass der Kellerautomat in einem Verabreitungsschritt statt dem nächsten Eingabezeichen auch "nichts" lesen kann. Das Eingabeband bleibt in diesem Fall stehen und wird nicht wie sonst vorgerückt. Der Automat generiert seine Ausgabe (Zustandswechsel, Kellerwort) nur aufgrund seines aktuellen Zustands und des obersten Kellerzeichens.
Beispiel Um das Prinzip eines Kellerautomaten zu verdeutlichen, betrachten wir die Sprache der "wohlgeformten Klammerterme". Der Automat beginnt in einem Startzustand q0;
im Keller befindet sich ein Zeichen, welches das Ende kennzeichnet. Bei der Abarbeitung des Ausdrucks bewegt sich der Lesekopf
Zeichen für Zeichen weiter. Stößt er dabei auf eine öffnende Klammer,
so wird diese in den Keller geschrieben. Tritt in der weiteren
Abarbeitung eine schließende Klammer auf, so wird das oberste
Klammer-Auf-Zeichen im Keller wieder gelöscht. Der Ausdruck ist dann
erfolgreich abgearbeitet, wenn der Lesekopf das Ende des Eingabebandes
erreicht hat und sich im Keller ausschließlich das Zeichen # befindet (Akzeptieren mit leerem Keller).
Befände sich hingegen noch eine geöffnete Klammer nach der
Ausdrucksabarbeitung im Keller, so würde dies bedeuten, dass eine
schließende Klammer fehlt und ein syntaktischer Fehler vorliegt. Auch
wenn das Ende des Kellers erreicht wird, bevor die Eingabe vollständig
abgearbeitet wurde, liegt ein Fehler vor. In diesem Fall befinden sich
zu viele schließende Klammern in der Eingabe. Graphen von Kellerautomaten Wir betrachten das Beispiel eines Kellerautomaten, der die Sprache L = {anbn | n>0} akzeptiert. Der Kellerautomat ist gegeben durch - Q = {q0, q1, q2}.
- Σ = {a, b).
-
Γ = {#, A, B}.
- δ = {(q0, #, a, q0, A#), (q0, A, a, q0, AA), (q0, A, b, q1, ε), (q1, A, b, q1, ε), (q1, #, $, q2, #)}.
- q0 = q0.
- k0 = #.
- E = {q2}.
Wir haben es hier mit einem deterministischen Kellerautomaten zu tun! Es gibt genau einen ε-Übergänge in den Endzustand q2. Der Graph zu diesem Kellerautomaten sieht folgendermaßen aus:
Der Unterschied zum Graphen eines endlichen Automaten besteht zum einen darin, dass die Zustandsübergangsfunktion neben dem aktuellen Zustand und dem nächsten Eingabezeichen (Ausnahme: ε-Übergänge) auch das oberste Kellerzeichen benötigt. Zum anderen bewirkt die Übergangsfunktion neben dem Zustandswechsel auch das Schreiben eines Kellerwortes in den Keller.
- (A, a) : AA : Das erste Zeichen in der Klammer (hier: 'A') steht für das Kellerzeichen, das aktuell im Keller ganz oben liegt.
- (A, a) : AA : Das zweite Zeichen in der Klammer (hier: 'a') steht für das nächste Eingabezeichen.
- (A, a) : AA : Hinter dem Doppelpunkt steht das Kellerwort (hier 'AA'), dass in den Keller gespeichert wird.
Weitere Erläuterungen zum Graphen und zur Abarbeitung einer Eingabe: - Vom Zustand q0 gehen oben 3 Pfeile aus. Einer führt nach q1, zwei wiederum nach q0.Der Übergang mit der Beschriftung (#, A) : A# bewirkt, dass, wenn der Keller noch leer ist und das erste a gelesen wird, ein A in den Keller gespeichert wird. Beim Lesen wird # aus dem Keller entfernt, deshalb muss das Kellerleerzeichen ebenfalls wieder in den Keller gelegt werden. Das Kellerwort wird von rechts nach links zeichenweise im Keller gespeichert.
- Solange nun weitere a's im Eingabewort folgen, wird im Graphen immer wieder der Verbindung mit der Bezeichnung (A, a) : AA gefolgt. Will heissen: Wenn oben im Keller ein A liegt (beim Nachsehen wird gelöscht!) und ich ein weiteres a als nächstes Eingabezeichen finde, schreibe ich zwei A's ('AA') in den Kellerspeicher.
- Sobald das erste b kommt, folgen wir dem Pfeil zum Zustand q1. Ein ε als Kellerwort bedeutet, dass in diesem Schritt "nichts" in
den Keller geschrieben wird. Da man zuvor das oberste Zeichen gelesen
hat und es nun nicht wieder zurückschreibt, kommt diese Angabe einer
Löschung des obersten Zeichens gleich.
- Schließlich folgen wir nun solange dem Pfeil mit der Bezeichnung (A,b) : ε wie wir noch b's im Eingabewort finden.
- Wenn aus dem Zustand q1 heraus das Kellerzeichen # lesen, gelangen wir per ε-Übergang in den Endzustand q2. Wenn gleichzeitig auch das Ende der Eingabe erreicht ist, ist das Eingabewort ist akzeptiert. Wenn noch ein Zeichen auf dem Eingabeband steht, verursacht dieses im nächsten Verarbeitungsschritt einen Fehler, da es aus q2 heraus nicht mehr verarbeitet werden kann!
Kontextfreie Grammatiken und KellerautomatenZu jeder kontextfreien Grammatik gibt es einen äquivalenten (nichtdeterministischen!) Kellerautomaten und umgekehrt. Dies bedeutet also, dass die Klasse der kontextfreien Sprachen genau die Klasse der Sprachen ist, die sich von (nichtdeterministischen) Kellerautomaten erkennen lassen. Im Folgenden wird ein konstruktives Verfahren dafür angegeben, wie man im Allgemeinen aus einer gegebenen kontextfreien Grammatik einen nichtdeterministischen Kellerautomaten gewinnt. Wir betrachten dazu das Beispiel der wohlgeformten Klammerterme mit der Grammatik G = {N = {S}, Σ = {(, )}, P = {S → () | (S) | SS}, S = S}. Der Kellerautomat zur kontextfreien Sprache der Klammerterme ist folgendermaßen definiert: - Q = {z0}. [Der aus diesem Verfahren resultierende Kellerautomat hat immer nur einen Zustand]
- Σ = {(, )). [Das Eingabealphabet entspricht gerade der Menge der Terminalsymbole)
-
Γ = N ∪ Σ = {S, (, )}. [Das Kelleralphabet enthält alle Nicht-Terminalsymbole und alle Terminalsymbole]
- q0 = z0.
- k0 = S. [Das Kellerleerzeichen ist gleich dem Startsymbol der Grammatik]
- E = ∅. [Ein Eingabewort wird akzeptiert, falls der Keller nach Abarbeitung des Wortes leer ist.]
Bleibt noch die Übergangsrelation, die nach zwei Regeln gebildet wird:
Ist das gelesene Kellerzeichen ein Terminalsymbol [hier ( oder )] , so wird geprüft, ob das aktuelle Eingabezeichen mit dem Kellerzeichen übereinstimmt. Ist dies der Fall, so wird das Kellerzeichen gelöscht und zum nächsten Eingabezeichen übergegangen. Daraus folgen die Übergänge δ1 = (z0, (, (, z0, ε) und δ2 = (z0, ), ), z0, ε).
- Ist das gelesene Kellerzeichen ein Nichtterminalsymbol (hier S), so wird kein Eingabezeichen gelesen und das Kellerzeichen S wird durch die rechte Seite einer Regel, also () oder (S) oder SS ersetzt. Es ergibt sich:
δ3 = (z0, S, ε, z0, ()) und δ4 = (z0, S, ε, z0, SS) und δ5 = (z0, S, ε, z0, (S)).
Insgesamt folgt: δ = {(z0, (, (, z0, ε), (z0, ), ), z0, ε), (z0, S, ε, z0, ()), (z0, S, ε, z0, SS), (z0, S, ε, z0, (S))}. Das sieht dann als Graph so aus:
Dieser Kellerautomat ist zum einen nichtdeterministisch und zum anderen enthält er drei ε-Übergänge! Der Kellerautomat akzeptiert die Sprache der Klammerterme mit leerem Keller. Seine Arbeitsweise lässt sich am besten mit Hilfe einer Tabelle nachvollziehen: Regel | Zustand
| Kellerinhalt
| Eingabe (-rest) wort
| | z0 | S ( = Kellerleerzeichen)
| ((()())())
| δ5 | z0 | (S)
| ((()())()) | δ1 | z0 | S)
| (()())()) | δ4 | z0 | SS)
| (()())()) | δ5 | z0 | (S)S)
| (()())()) | δ1 | z0 | S)S)
| ()())()) | δ4 | z0 | SS)S)
| ()())()) | δ3 | z0 | ()S)S)
| ()())()) | δ1 | z0 | )S)S)
| )())()) | δ2 | z0 | S)S)
| ())()) | δ3 | z0 | ())S)
| ())()) | δ1 | z0 | ))S)
| ))()) | δ2 | z0 | )S)
| )())
| δ2 | z0 | S)
| ())
| δ3 | z0 | ())
| ())
| δ1 | z0 | ))
| ))
| δ2 | z0 | )
| )
| δ2 | z0 | leer
| leer
|
» drucken: pdf | html
|