5.3 Nichtdeterministische endliche Automaten

Ein nichtdeterministischer Automat ist, informell ausgedrückt, wie ein deterministischer Automat, nur dass es für eine Zustand-Symbol-Kombination beliebig viele ausgehende Pfeile (eventuell gar keinen) geben kann. Hier ist das Beispiel von vorhin, leicht abgewandelt:

Ein Pfeil beschreibt also nicht unbedingt einen Zustandsübergang, der geschieht, sondern einen, der möglich ist. Formal gesprochen ist δ nun keine Funktion mehr, sondern eine Relation:

Definition 5.3.1 (Nichtdeterministischer endlicher Automat, non-deterministic finite state machine) Ein nichtdeterministischer endlicher Automat besteht aus
  • einem endlichen Eingabealphaet Σ,
  • einer endlichen Menge Q von Zuständen,
  • einem Startzustand qstartQ,
  • einer Menge FQ von akzeptierenden Endzuständen,
  • einer Zustandsübergangsrelation δQ×Σ×Q.
Formal gesehen ist also ein Automat ein Quintupel M=(Σ,Q,qstart,F,δ).
Von nun an bezeichnen wir endliche Automaten auch als deterministische endliche Automaten, um den Unterschied zu den nichtdeterministischen zu verdeutlichen. Wenn in einem deterministischen endlichen Automaten δ(q,x)=q war, so hatte das die Bedeutung wenn der Automat im Zustand q ist und x liest, so geht er in Zustand q über; wenn nun in einem nichtdeterministischen Automaten (q,x,q)δ gilt, so bedeutet das, wenn der Automat im Zustand q ist und x liest, so kann er in Zustand q übergehen. Analog zu den deterministischen Automaten definieren wir eine erweiterte Zustandsübergangsrelation.
Definition 5.3.2 (Erweiterte Zuständsübergangsfunktion). Für einen nichtdeterministischen endlichen Automaten (Σ,Q,qstart,F,δ) definieren wir die erweiterte Zustandsübergangsrelation δ^Q×ΣQ als die Menge aller Zustand-Wort-Zustand-Tripel (q,x1x2xn,q), für die wir Zwischenzustände q=qstart,q1,q2,,qn=q finden können mit (qstart,x1,q1),(q1,x2,q2),,(qn1,xn,qn)δ Dies schließt den Fall n=0 mit ein, also (q,ϵ,q)δ^. Wie zuvor schreiben wir qαq.

Die von M akzeptierte Sprache ist L(M):={αΣ |  es gibt ein qF mit qstartαq}

Beobachtung 5.3.3 Sei M=(Σ,Q,qstart,F,δ) ein nichtdeterministischer endlicher Automat. Dann gibt es eine reguläre Grammatik G mit L(G)=L(M).

Wir führen hier den Beweis nicht noch einmal; er ist mehr oder weniger identisch mit dem Beweis von Theorem 4.2.5; wir haben nämlich in jenem Beweis nirgends verwendet, dass δ eine Funktion ist, und daher geht mit einem δ, das eine Relation ist, alles ganz genau gleich. Allerdings gilt nun auch der Umkehrschluss: zu einer regulären Grammatik gibt es einen nichtdeterministischen endlichen Automaten:

Theorem 5.3.4 Sei G=(Σ,N,P,S) eine reguläre Grammatik. Dann gibt es einen nichtdeterministischen endlichen Automaten M mit L(G)=L(M).
Beweis. Unser Automat hat als Zustandsmenge N, die Menge der nichtterminalen Symbole und als Startzustand S, das Startsymbol der Grammatik G. Wir definieren δ, indem wir jeden G-Pfeil in einem M-Pfeil umwandeln: eine Produktion XaY in G wird dann zu (X,a,Y)δ also einem Pfeil XaY in M. Für jede Regel der Form Xϵ machen wir X zu einem Endzustand.

Was aber mit Regeln der Form XY? Hierfür könnte man Nichtdeterministische Automaten mit ϵ-Übergängen definieren, die also vom Zustand X nach Y wechseln können, ohne ein Eingabesymbol zu lesen; wir gehen hier einen anderen Weg und verweisen auf Theorem 4.1.7, welches uns erlaubt, Regeln der Form XY und Xa zu eliminieren.

Beispiel 5.3.5

Wir betrachten abermals die reguläre Grammatik aus dem vorherigen Kapitel 4.1: Sϵ | aS | bTTϵ | bT  und auch den (falschen) endlichen Automaten, den wir im letzten Kapitel dafür gebaut haben:

Wir sehen nun, dass dies genau der nichtdeterministische Automat ist, den wir nach Theorem 4.3.4 bauen können. Die Zustandsübergangsrelation δ ist δ={(S,a,S),(S,b,S),(T,b,T)} . Jeder Zustand ist ein Endzustand, allerdings heißt das nicht, dass der Automat jedes Wort akzeptiert. Für α=ba beispielsweise gibt es keinen Zustand q mit Sbaq, geschweige denn einen akzeptierenden Endzustand. Daher gilt: baL(M).

Beispiel 5.3.6

Wir betrachten die reguläre Grammatik aus Übungsaufgabe 4.1.7:

SA | BAϵ | bA | cABϵ | aB | cB

Bevor wir einen nichtdeterministischen Automaten bauen können, müssen wir erst die Produktionen der Form XY eliminieren bzw. ersetzen. Wenn Sie Aufgabe 4.1.7 gelöst haben, haben Sie wahrscheinlich in etwa folgende Grammatik erhalten:

Sϵ | bA | cA | aB | cBAϵ | bA | cABϵ | aB | cB Also insgesamt 11 statt 8 Produktionen. Alle Nichtterminale erlauben auf ihrer rechten Seite ein ϵ und werden so zu akzeptierenden Zuständen. Die Zustandsübergangsrelation δ ist also δ={(S,b,A),(S,c,A),(S,a,B),(S,c,B),(A,b,A),(A,c,A),(B,a,B),(B,c,B)} Der nichtdeterminische Automat schaut also so aus:
Übungsaufgabe 5.3.1 Sei Σ={1} und Lk:={1n | n ist durch k teilbar}. Schreiben Sie für Lk einen deterministischen endlichen Automaten.

Schreiben Sie eine reguläre Grammatik für die Sprache L5L7, also die Strings aus 1, deren Länge durch 5 oder durch 7 teilbar ist.

Zeichnen Sie nun einen nichtdeterministischen endlichen Automaten für L5L7.

Nichtdeterministische endliche Automaten deterministisch machen

Wir werden nun zeigen, dass man zu jedem nichtdeterministischen Automaten M einen äquivalenten deterministischen Automaten M bauen kann. Bevor wir eine allgemeine Konstruktion zeigen, fragen wir uns, wie wir beispielsweise für den nichtdeterministischen endlichen Automaten M:

und das Eingabewort α=1001100 überprüfen können, ob 1001100L(M) gilt. Einem determinischen endlichen Automaten können wir ja das Eingabewort einfach füttern und schauen, was der Automat tut; bei nichtdeterministischen Automaten müssen wir schauen, was er alles tun könnte. Wir plazieren einen kleinen farbigen Punkt in jeden Zustand, in dem sich der Automat befinden könnte; am Anfang hat der Startzustand A einen roten Punkt.

Am Ende landet der grüne Punkt im Zustand E. Das Wort ist also in L(M). Das können wir auch ganz allgemein tun. Wenn Zustand q einen "Punkt" hat und Zeichen x gelesen wird, dann teilt sich dieser Punkt und plaziert einen Kind-Punkt in jedem Zustand q, für den qxq gilt. Formal gesprochen: für eine Menge RQ von Zuständen (die, die gerade einen "Punkt" haben) und ein Eingabe-Symbol x definieren wir Δ(R,x):={qQ |  es gibt  qR mit qxq} Für ein Eingabewort α=x1xn fangen wir nun mit R0={qstart} an, das entspricht dem einen roten Punkt auf dem Startzustand, und berechnen dann jeweils Ri=Δ(Ri1,xi); wenn die Menge Rn einen akzeptierenden Endzustand enthält (dieser also am Ende einen "Punkt" hat), gilt αL(M).

Treten Sie einen Schritt zurück und betrachten, was wir mit Δ definiert haben: wir haben eine Zustandsübergangsfunktion definiert, die nun aber nicht auf Zuständen sondern auf Zustandsmengen operiert. Das heißt, im Gegensatz zu δ, das eine Funktion δ:Q×ΣQ ist, ist Δ:2Q×Σ2Q . Wenn Sie die Schreibweise 2Q nicht kennen: dies ist die Potenzmenge von Q, also die Menge aller Untermengen, was die leere Menge und die "volle Menge" Q selbst miteinschließt. Wir haben also folgendes Theorem:

Theorem 5.3.7 (Einen nichtdeterministischen endlichen Automaten deterministisch machen). Sei M=(Σ,Q,qstart,F,δ) ein nichtdeterministischer Automat; dann heiße der deterministische Automat M=(Σ,2Q,{qstart},F,Δ) mit Endzustandsmenge F definiert als F:={XQ | XF} und Zustandsübergangsfunktion Δ definiert als Δ:2Q×Σ2Q(R,x){qQ |  es gibt  qR mit qxq} der Potenzmengenautomat. Es gilt L(M)=L(M).

Wir folgern also

Theorem 5.3.8 Zu jeder regulären Sprache L gibt es einen deterministischen endlichen Automaten M mit L(M)=L.
Beispiel 5.3.9 Der obige nichtdeterminische Automaten M, der die Sprache aller Wörter, deren viertletztes Zeichen eine 1 ist, akzeptiert, hat fünf Zustände. Sein Potenzmengenautomat M hätte also 25=32. Allerdings sehen wir, dass alle "relevanten" Zustände von M den Zustand A enthalten. Dieser wird nie verschwinden. Also sehen wir, dass man M mit 16 Zuständen implementieren kann (die anderen, die, die nicht A enthalten, sind unerreichbar). Da 16 immer noch recht groß für eine Abbildung ist, nehmen wir uns die Sprache aller Wörter, deren drittletztes Zeichen eine 1 ist. Der nichtdeterministische Automat hierfür ist

Der Potenzmengenautomat hat die Zustandsmenge

{,A,B,C,D,AB,AC,AD,BC,BD,CD,ABC,ABD,ACD,BCD,ABCD}

wobei wir der Lesbarkeit halber AB statt {A,B} etc. schreiben. Um bei der Konstruktion des Potenzmengenautomaten unnötige Zustände zu vermeiden, bauen wir ihn Schritt für Schritt, angefangen mit dem Startzustand {A} bzw. A, und hängen jedem Zustand einen ausgehenden 0-Pfeil und 1-Pfeil an, wobei wir womöglich neue Zustände "entdecken".

Wenn wir uns vorstellen, dass wir vor das Eingabewort α die Zeichen 000 stellen, also α durch 000α ersetzen, dann codiert jeder Zustand genau die letzten drei Zeichen des Eingabewortes, die der Automat gelesen hat. Der Zustand ACD bedeutet zum Beispiel die letzten drei Zeichen waren 110

Im folgenden Unterkapitel werden wir alle Transformationen, die wir bisher gesehen haben, an einem konkreten Beispiel anwenden.