Umwandlung eines Automaten in einen regulären Ausdruck
Wir zeigen, wie man einen beliebigen endlichen Automaten in einen regulären Ausdruck umwandelt.
Beschreibung des Algorithmus
Als Eingabe haben wir einen NEA A. Zuerst machen wir daraus einen VNEA. In der zweiten Phase entfernen wir in jedem Schritt einen Zustand, passen die Übergangsfunktion entsprechend an und wiederholen das, bis nur noch zwei Zustände übrig sind – der Start- und der Endzustand. Zwischen ihnen verläuft eine Kante, deren Beschriftung ein regulärer Ausdruck ist, der das Ergebnis des gesamten Algorithmus darstellt. Das ganze Verfahren besteht also vor allem darin, einen Zustand zu entfernen und den Automaten anschließend so zu korrigieren, dass wir einen äquivalenten Automaten erhalten.
Entfernen eines Zustands
Wie man einen Zustand entfernt, können wir an einem einfachen Beispiel darstellen. Nehmen wir an, ein Teil unseres Automaten sieht so aus:
wobei Ri irgendwelche regulären Ausdrücke sind. Wie würde der Automat aussehen, wenn wir den Zustand qr entfernten? Wir können uns vorstellen, dass wir im Zustand qi sind und fragen, welche Wörter wir auf diesem Abschnitt alle erzeugen können. Wenn wir vom Zustand qi direkt in den Zustand qj gehen, sind es alle Wörter, die dem regulären Ausdruck R4 entsprechen.
Wenn wir aber in den Zustand qr gehen, können wir Wörter der Form R1 erzeugen. Im Zustand qr können wir aber noch für den regulären Ausdruck R2 im Kreis laufen, also können wir eigentlich Wörter der Form
Jetzt wissen wir, dass aus diesem Teil des Automaten Wörter der Form R4 oder der Form
Nun können wir den Zustand qr einfach entfernen, nur die zwei Zustände qi und qj übrig lassen und anstelle von R4 den eben berechneten regulären Ausdruck schreiben:
Dieses Verfahren führen wir mit jeder Kante von jedem Zustand qi in irgendeinen Zustand qj durch, und zwar einschließlich der Schleifen, d. h. einschließlich des Falls qi = qj.
Nach dem Entfernen eines Zustands erhalten wir einen äquivalenten Automaten – einen Automaten, der dieselbe Sprache erkennt.
Der gesamte Algorithmus
Als Eingabe haben wir einen NEA A = ⟨Q, Σ, δ, q0, F⟩.
- Wir wandeln den NEA A in einen VNEA Z = ⟨Q′, Σ, δ′, q0′, qf′⟩ um. Mit dem Buchstaben k bezeichnen wir ab jetzt die Anzahl der Zustände in Z.
- Wenn k = 2, endet der Algorithmus, und auf der Kante zwischen dem Start- und dem Endzustand steht der resultierende reguläre Ausdruck.
- Wenn k>2, wählen wir einen beliebigen Zustand qr, der vom Start- und vom Endzustand verschieden ist, d. h. qr ≠ q0′ und qr ≠ qf′. Weiter erzeugen wir einen neuen VNEA Z′ = ⟨Q′′, Σ, δ′′,q0′,qf′⟩, für den gilt:
und für alle qi ∈ Q′′ ∖ {qf′} und für alle qj ∈ Q′′ ∖ {q0′} sei wobei R1 = δ′(qi,qr), R2 = δ′(qr,qr), R3 = δ′(qr, qj), R4 = δ′(qi, qj). Fahre mit Schritt 2 fort.
Beispiel
Wir haben als Eingabe diesen endlichen Automaten:
Zuerst wandeln wir ihn in einen VNEA um (überflüssige ∅-Übergänge zeichnen wir nicht ein):
Nun wenden wir den zweiten Teil des Algorithmus an und entfernen irgendeinen Knoten. Wir beginnen mit dem Knoten q2. Wir entfernen den Knoten q2 und fügen einen Übergang vom Zustand q1 in den Zustand qf hinzu. Diesen Übergang beschriften wir mit b(a|b)∗, denn vom Knoten q1 gelangen wir für Wörter der Form b in den Zustand q2, dann können wir für a|b im Kreis laufen, dadurch erhalten wir (a|b)∗, und schließlich wechseln wir mithilfe der ε-Regel nach qf. Dabei gilt b(a|b)∗ϵ = b(a|b)∗. Wir erhalten den Automaten:
Es bleibt noch, den letzten Zustand q1 zu entfernen. Wir fügen eine Kante vom Zustand qs in den Zustand qf hinzu. Wie beschriften wir sie? In den Zustand q1 gelangen wir über die ε-Regel, die können wir gleich weglassen. Dann können wir für a im Kreis laufen, also erhalten wir den regulären Ausdruck a∗. Und schließlich gelangen wir über eine Kante nach qf, also hängen wir noch b(a|b)∗ an den Ausdruck an. Die Kante beschriften wir also mit dem regulären Ausdruck a∗ b(a|b)∗.
Der Automat hat nur noch zwei Zustände, also endet der Algorithmus. Auf der Kante steht der resultierende reguläre Ausdruck.
Quellen
- Das Beispiel und die Beschreibung des Algorithmus stammen aus M. Sipser: Introduction to the Theory of Computation
Kapitel: Reguläre Ausdrücke, Umwandlung eines regulären Ausdrucks in einen Automaten, Verallgemeinerter nichtdeterministischer endlicher Automat, Umwandlung eines Automaten in einen regulären Ausdruck