Umwandlung von endlichen Automaten in reguläre Ausdrücke Wir werden sehen, wie man aus einem endlichen Automaten M einen regulären Ausdruck γ konstruieren kann, der genau die von M akzeptierte Sprache erzeugt. Die Konstruktion enfernt schrittweise Zustände aus dem Automaten und ersetzt die Beschriftungen der Kanten durch reguläre Ausdrücke. Am Ende besteht der Automat nur noch aus einem Start- und einem Endzustand, zwischen denen eine Kante liegt, die mit dem gesuchten regulären Ausdruck beschriftet ist. Zuerst schauen wir uns an einem Beispiel an, wie ein Zustand entfernt werden kann und sich dadurch die Beschriftung der Kanten im endlichen Automaten ändert. In diesem Beispiel wollen wir die Menge aller Wörter, mit denen man von Zustand 1 zu Zustand 4 kommt, durch einen regulären Ausdruck beschreiben. b a b b 1 a 2 a 3 4 a Zustand 2 soll zuerst entfernt werden. Aus Zustand 1 gelangt man über Zustand 2 zu Zustand 3 — zum Beispiel durch die Eingabe aa oder abbba. Allgemein lassen sich alle Wörter, durch die man von Zustand 1 über Zustand 2 zu Zustand 3 gelangt, mit ab∗ a beschreiben. Mit diesem regulären Ausdruck beschriftet man die neue Kante von Zustand 1 zu Zustand 3 nach Entfernen von Zustand 2. Weitere Kanten sind nicht betroffen. a b b 1 ab∗ a 3 4 a Nun soll Zustand 3 entfernt werden. Davon sind zwei Wege betroffen. Von Zustand 1 kommt man über Zustand 3 zu Zustand 4, und von Zustand 4 kommt man über Zustand 3 wieder zu Zustand 4. Betrachten wir zuerst den ersten betroffenen Weg. Bisher gibt es keine Kante von Zustand 1 zu Zustand 4. Damit diese Verbindung auch nach dem Entfernen von Zustand 3 erhalten bleibt, muss eine neue Kante von Zustand 1 zu Zustand 4 eingefügt werden. Ihre Beschriftung setzt sich zusammen aus 1. der Beschriftung ab∗ a der Kante von Zustand 1 zu Zustand 3 — gefolgt von 2. der Beschriftung a der Kante von Zustand 3 zu Zustand 3; da diese Kante beliebig oft wiederholt durchlaufen werden kann, wird diese Beschriftung mit einem ∗ versehen (das haben wir oben auch so gemacht) — gefolgt von 3. der Beschriftung b der Kante von Zustand 3 zu Zustand 4 Insgesamt ergibt das die Beschriftung ab∗ a a∗ b. Nun zum zweiten betroffenen Weg. Von Zustand 4 kann man einen Schritt zu Zustand 3 machen und von dort wieder in einem Schritt zu Zustand 4 gehen. Deshalb muss die Schleife über Zustand 4 ebenfalls neu beschriftet werden. Um von Zustand 4 zu Zustand 4 zu kommen, hat man zwei Möglichkeiten. Entweder man benutzt die Schleife über Zustand 4 – sie ist mit b beschriftet – oder man macht den Abstecher über Zustand 3 – nach dem obigen Schema ergibt der Abstecher die Beschriftung aa∗ b. Da man zwischen diesen beiden Alternativen wählen kann, ensteht die 1 Beschriftung der Kante aus erste Alternative | zweite Alternative, hier also b | aa∗ b. Damit ergibt sich nach dem Entfernen von Zustand 3 folgender Automat. b | aa∗ b 1 ab∗ a a∗ b 4 An den Kantenbeschriftungen kann man ablesen, mit welchen Wörtern man von Zustand 1 zu Zustand 4 kommt. Mit allen Wörtern, die durch ab∗ a a∗ b beschrieben werden, kommt man von Zustand 1 (erstmals) zu Zustand 4, und mit allen Wörtern, die durch b | aa∗ b beschrieben werden, bleibt man in Zustand 4. Insgesamt beschreibt dann der reguläre Ausdruck ab∗ a a∗ b ( ε | (b | aa∗ b)∗ ) die Menge aller Wörter, mit denen man von Zustand 1 zu Zustand 4 kommt. Das ε steht abkürzend für den regulären Ausdruck ∅∗ , der die Menge {ε} beschreibt. Das soll nun alles formaler – und damit klar nachvollziehbar und allgemein anwendbar – dargestellt werden. Wir bezeichnen die Beschriftung der Kante von Zustand s zu Zustand t mit R(s, t). Im letzten Beispiel ist R(1, 4) = ab∗ aa∗ b und R(4, 4) = b | aa∗ b. Wenn es keine Kante von s zu t gibt, dann fassen wir das als Beschriftung R(s, t) = ∅ auf. Im letzten Beispiel ist R(4, 1) = ∅ und R(1, 1) = ∅. Beim Entfernen von Zustand x muss man für jedes Paar s, t von Zuständen eine neue Beschriftung Rneu (s, t) bestimmen. Die neue Beschriftung besteht aus der Alternative der alten Beschriftung R(s, t) und der Beschriftung eines Weges von s nach t mit einem Abstecher über x. Wie oben beschrieben ist diese Beschriftung R(s, x) R(x, x)∗ R(x, t) – also zuerst ein Schritt von s zu x, dann eine Schleife in x, und zuletzt der Schritt von x zu t. Formal beschreibt man das wie folgt: Rneu (s, t) = R(s, t) | R(s, x) R(x, x)∗ R(x, t) Aus einem Automaten mit den Zuständen {z1 , z2 , . . . , zn } und den durch R gegebenen Kantenbeschriftungen erhält man nach Entfernen von Zustand zi einen Automaten mit den Zuständen {z1 , z2 , . . . , zn } − {zi } und den durch Rneu bestimmten Kantenbeschriftungen. Die Umwandlung eines endlichen Automaten in einen regulären Ausdruck geschieht nun durch schrittweises Entfernen der Zustände und Bestimmung der neuen Kantenbeschriftungen. Am Ende soll genau ein Startzustand und ein Endzustand übrig bleiben, so dass die Beschriftung der Kante zwischen diesen beiden Zuständen der gesuchte reguläre Ausdruck ist. Das geht nur, wenn der Startzustand am Anfang keine eingehende Kante und der Endzustand keine ausgehende Kante besitzt. Dazu muss man den Automaten nochmal umbauen. Zuerst fügt man einen neuen Zustand hinzu, der eine ε-Kante zum alten Startzustand hat. Dieser neue Zustand ist dann der Startzustand des umgebauten Automaten. Dann fügt man einen weiteren neuen Zustand hinzu, zu dem es eine ε-Kante von jedem Endzustand gibt. Dieser neue Zustand ist dann der einzige Endzustand des umgebauten Automaten. Nun kann man schrittweise alle Zustände bis auf den Start- und den Endzustand entfernen. Die Reihenfolge, in der man die Zustände entfernt, ist egal. Am Ende bleibt ein Automat übrig, der aus zwei Zuständen besteht: dem Startzustand und dem Endzustand. Es führt eine Kante vom Start- zum Endzustand, die mit dem regulären Ausdruck beschriftet ist, der den ursprünglichen endlichen Automaten beschreibt, mit dem man mal begonnen hat. 2 Erstes Beispiel Als Beispiel schauen wir uns einen Automaten an, der alle Binärwörter akzeptiert, die keine durch 3 teilbaren Binärzahlen darstellen. (Wir erlauben hier auch führende 0en.) Der Zustand gibt an, welchen Rest mod 3 das Binärwort hat, mit dem der Zustand erreicht wurde. 0 start 1 1 0 1 00 1 2 Schritt 1: Füge einen neue Startzustand und einen neuen Endzustand hinzu. 0 ε Start 1 1 0 1 0 1 ε 0 ε 2 Ende Nun werden schrittweise alle Zustände bis auf den Start- und den Endzustand entfernen. Schritt 2: Entferne Zustand 2. Alle Kantenbeschriftungen müssen erneuert werden mittels der Regel Rneu (s, t) = R(s, t) | R(s, 2) R(2, 2)∗ R(2, t) . Wenn R(s, 2) = ∅ oder R(2, t) = ∅, dann ist R(s, 2) R(2, 2)∗ R(2, t) = ∅ und folglich Rneu (s, t) = R(s, t). In diesem Fall ändert sich die Beschriftung also nicht. Damit sieht man, dass hier nur die Kante von Zustand 1 zu Zustand Ende und die Kante von Zustand 1 zu Zustand 1 neu beschriftet werden müssen. 1. Rneu (1, Ende) = R(1, Ende) | R(1, 2) R(2, 2)∗ R(2, Ende) = ε | 01∗ ε = ε | 01∗ 2. Rneu (1, 1) = R(1, 1) | R(1, 2) R(2, 2)∗ R(2, 1) = ∅ | 01∗ 0 = 01∗ 0 Die Beschriftung aller anderen Kanten bleibt unverändert. 01∗ 0 0 Start ε 0 1 1 3 ε | 01∗ 1 Ende Schritt 3: Entferne Zustand 0. Von Zustand Start zu Zustand 1 muss eine neue Kante eingefügt werden, damit man von Start zu 1 mit einem Abstecher über Zustand 0 gehen kann. Rneu (Start, 1) = R(Start, 1) | R(Start, 0) R(0, 0)∗ R(0, 1) = ∅ | ε0∗ 1 = 0∗ 1 Die Schleife über Zustand 1 muss neu beschriftet werden. Rneu (1, 1) = R(1, 1) | R(1, 0) R(0, 0)∗ R(0, 1) = 01∗ 0 | 10∗ 0 Die Kante von Zustand 1 zu Zustand Ende muss nicht neu beschriftet werden, da kein Abstecher über Zustand 0 die beiden Zustände verbindet. 01∗ 0 | 10∗ 1 Start 0∗ 1 ε | 01∗ 1 Ende Schritt 4: Entferne Zustand 1. Die einzige verbleibende Kante muss neu beschriftet werden. 0∗ 1 (01∗ 0 | 10∗ 1)∗ (ε | 01∗ ) Start Ende Damit ergibt sich, dass Rneu (Start, Ende) = 0∗ 1 (01∗ 0 | 10∗ 1)∗ (ε | 01∗ ) der reguläre Ausdruck ist, der die vom ursprünglichen Automaten akzeptierte Sprache beschreibt – also die Menge aller Binärzahlen, die nicht durch 3 teilbar sind. Zweites Beispiel Hier schauen wir uns einen recht kleinen endlichen Automaten an, für den der reguläre Ausdruck recht groß wird. Der endliche Automat akzeptiert die Sprache A = {w ∈ {a, b}∗ | die Anzahl der a in w ist gerade und die Anzahl der b in w ist ungerade} . Die Bezeichnung der Zustände ist so gewählt, dass das erste Zeichen (G oder U) angibt, ob die Anzahl der bisher gelesenen a gerade (G) oder ungerade (U) ist. Das zweite Zeichen der Zustandsbezeichnung gibt das entsprechende für b an. Der Zustand UG wird also erreicht, wenn eine Ungerade Anzahl a und eine Gerade Anzahl b gelesen wurde. 4 a start GG b UG a b b b a GU UU a Schritt 1: Füge einen neuen Startzustand und einen neuen Endzustand hinzu. a ε Start GG b UG a b b b a Ende GU ε UU a Schritt 2: Zustand UG wird entfernt. Folgende Beschriftungen sind betroffen. 1. Rneu (GG, GG) = R(GG, GG) | R(GG, UG)R(UG, UG)∗ R(UG, GG) = ∅ | a ∅∗ a = aa 2. Rneu (GG, UU) = R(GG, UU) | R(GG, UG)R(UG, UG)∗ R(UG, UU) = ∅ | a ∅∗ b = ab 3. Rneu (UU, UU) = R(UU, UU) | R(UU, UG)R(UG, UG)∗ R(UG, UU) = ∅ | b ∅∗ b = bb 4. Rneu (UU, GG) = R(UU, GG) | R(UU, UG)R(UG, UG)∗ R(UG, GG) = ∅ | b ∅∗ a = ba aa Start ε GG ba b b ab a Ende ε GU a UU Schritt 3: Zustand UU wird entfernt. Alle Kanten (mit Ausnahme der ε-Kanten) werden neu beschriftet. 5 bb aa | ab(bb)∗ ba ε Start GG b|ab(bb)∗ a Ende b|a(bb)∗ ba GU ε a(bb)∗ a Schritt 4: Zustand GG wird entfernt. Eine Kante vom Startzustand zu GU wird hinzugenommen. Bei der Beschriftung ist zu beachten, dass Rneu (Start, GU) = R(Start, GU) | R(Start, GG)R(GG, GG)∗ R(GG, GU) = R(GG, GG)∗ R(GG, GU) da R(Start, GU) = ∅ und R(Start, GG) = ε. Start (aa|ab(bb)∗ ba)∗ (b|ab(bb)∗ a) | {z }| {z } R(GG,GG)∗ Ende ε GU R(GG,GU) a(bb)∗ a | (b|a(bb)∗ ba) (aa|ab(bb)∗ ba)∗ ) (b|ab(bb)a) | {z } | {z }| {z } | {z } R(GU,GU) R(GU,GG) R(GG,GG)∗ R(GG,GU) Schritt 5: Zustand GU wird entfernt. Start (aa|ab(bb)∗ ba)∗ (b|ab(bb)∗ a) (a(bb)∗ a | (b|a(bb)∗ ba)(aa|ab(bb)∗ ba)∗ )(b|ab(bb)∗ a))∗ | {z } | {z } R(GU,GU)∗ R(Start,GU) Ende Damit ist der reguläre Ausdruck für den ursprünglichen Automaten bestimmt. 6
© Copyright 2025 ExpyDoc