Automaten und Formale Sprachen alias Theoretische Informatik Sommersemester 2012 Dr. Sander Bruggink Übungsleitung: Jan Stückrath Sander Bruggink Automaten und Formale Sprachen 1
Abgeschlossenheit (Definition) Gegeben sei eine Menge M und ein n-ärer Operator f : M M M. Man sagt, eine Menge M M ist unter f abgeschlossen, wenn für n beliebige Elemente m 1,..., m n M gilt: f (m 1,..., m n ) M. Beispiel: Sei M = N und M = {i i N und i ist gerade}. Sei f der Multiplikationsoperator, d.h. f (x, y) = x y. M ist abgeschlossen unter f, denn das Produkt zweier gerader Zahlen ist wieder eine gerade Zahl. Sei nun g die Operation: g(x) = x/2, wobei / der Ganzzahldivision entspricht. M ist nicht unter der Operation g abgeschlossen. Ein Gegenbeispiel ist: g(6) = 6/2 = 3. Sander Bruggink Automaten und Formale Sprachen 169
Wir betrachten hier für die Menge aller regulären Sprachen. Die interessante Frage ist: Falls L 1, L 2 regulär sind, sind dann auch L 1 L 2, L 1 L 2, L 1 L 2, L 1 = Σ \L 1 (Komplement) und L 1 regulär? Kurze Antwort: Die regulären Sprachen sind unter allen diesen Operationen abgeschlossen. Sander Bruggink Automaten und Formale Sprachen 170
Abschluss unter Vereinigung Wenn L 1 und L 2 reguläre Sprachen sind, dann ist auch L 1 L 2 regulär. Beweis: Da L 1 und L 2 nach Annahme regulär sind, gibt es reguläre Ausdrücke α 1 und α 2 mit L(α 1 ) = L 1 und L(α 2 ) = L 2. Der reguläre Ausdruck α 1 α 2 erzeugt nun die Sprache L 1 L 2 und von daher ist sie regulär. Sander Bruggink Automaten und Formale Sprachen 171
Abschluss unter Produkt/Konkatenation Wenn L 1 und L 2 reguläre Sprachen sind, dann ist auch L 1 L 2 = {w 1 w 2 w 1 L 1, w 2 L 2 } regulär. Beweis: Da L 1 und L 2 nach Annahme regulär sind, gibt es reguläre Ausdrücke α 1 und α 2 mit L(α 1 ) = L 1 und L(α 2 ) = L 2. Der reguläre Ausdruck α 1 α 2 erzeugt nun die Sprache L 1 L 2 und von daher ist sie regulär. Sander Bruggink Automaten und Formale Sprachen 172
Abschluss unter der Stern-Operation Wenn L eine reguläre Sprache ist, dann ist auch L regulär. Beweis: Da L nach Annahme regulär ist, gibt es einen regulären Ausdruck α mit L(α) = L. Der reguläre Ausdruck α erzeugt dann die Sprache L. Da es einen regulären Ausdruck für die Sprache gibt, ist sie regulär. Sander Bruggink Automaten und Formale Sprachen 173
Abschluss unter Komplement Wenn L eine reguläre Sprache ist, dann ist auch L = Σ \L regulär. Bemerkung: bei Bildung des Komplements muss immer festgelegt werden, bezüglich welcher Obermenge das Komplement gebildet werden soll. Hier ist das die Menge Σ aller Wörter über dem Alphabet Σ, das gerade betrachtet wird. Sander Bruggink Automaten und Formale Sprachen 174
Beweis: Da L nach Annahme regulär ist, gibt es einen DFA M = (Z, Σ, δ, z 0, E) mit T (M) = L. Dieser Automat wird einfach in einen Automaten M für L umgewandelt, indem man die End- und Nicht-Endzustände vertauscht. D.h. M = (Z, Σ, δ, z 0, Z\E). Dann gilt: w L ˆδ(z 0, w) E ˆδ(z 0, w) Z\E w L. Weil es einen DFA M für L gibt, ist L regulär. Sander Bruggink Automaten und Formale Sprachen 175
Abgeschlossenheit unter Komplement b z 0 c z 1 a z 2 c z E a b b, c a b a, b, c z 0 c z 1 a z 2 c z E a b b, c a a, b, c Sander Bruggink Automaten und Formale Sprachen 176
Abschluss unter Schnitt Wenn L 1 und L 2 reguläre Sprachen sind, dann ist auch L 1 L 2 regulär. Beweis: Es gilt L 1 L 2 = L 1 L 2 und wir wissen bereits, dass reguläre Sprachen unter Komplement und Vereinigung abgeschlossen sind. Sander Bruggink Automaten und Formale Sprachen 177
Kreuzproduktkonstruktion Es gibt noch eine direkte Konstruktion. Dabei werden die zwei Automaten für L 1 und L 2 miteinander synchronisiert und quasi parallelgeschaltet. Dies erfolgt durch das Bilden des Kreuzprodukts. Seien M 1 = (Z 1, Σ, δ 1, s 1, E 1 ) und M 2 = (Z 2, Σ, δ 2, s 2, E 2 ) DFAs mit T (M 1 ) = L 1 und T (M 2 ) = L 2. Dann akzeptiert folgender Automat M die Sprache L 1 L 2 : M = (Z 1 Z 2, Σ, δ, (s 1, s 2 ), E 1 E 2 ), wobei δ((z 1, z 2 ), a) = (δ 1 (z 1, a), δ 2 (z 2, a)). M akzeptiert ein Wort w genau dann, wenn sowohl M 1 als auch M 2 das Wort w akzeptieren. Sander Bruggink Automaten und Formale Sprachen 178
Warum sind interessant? Zeigen, dass eine Sprache regulär ist. Kompliziertere reguläre Sprachen können aus einfacheren zusammengebaut werden. Zeigen, dass eine Sprache nicht regulär ist. Manchmal ist es z.b. einfacher zu beweisen, dass das Komplement oder der Schnitt einer Sprache mit einer regulären Sprachen nicht regulär ist. Sander Bruggink Automaten und Formale Sprachen 179
Algorithmen Algorithmen für Probleme Wir diskutieren nun, ob es Verfahren bzw. Algorithmen gibt, um Fragestellungen bzw. Probleme für reguläre Sprachen zu lösen. Die allgemeine Form der Fragestellungen ist: Gegeben seien reguläre Sprachen L 1, L 2. Gilt für diese Sprachen, dass...? Dabei nehmen wir an, dass reguläre Sprachen als DFAs, NFAs, Grammatiken oder reguläre Ausdrücke gegeben sind. Sander Bruggink Automaten und Formale Sprachen 178
Algorithmen für Probleme Algorithmen Probleme Wortproblem: Gegeben eine reguläre Sprache L und w Σ. Gilt w L? Leerheitsproblem: Gegeben eine reguläre Sprache L. Gilt L =? Endlichkeitsproblem: Gegeben eine reguläre Sprache L. Ist L endlich? Schnittproblem: Gegeben zwei reguläre Sprachen L 1, L 2. Gilt L 1 L 2 =? Inklusionsproblem: Gegeben zwei reguläre Sprachen L 1, L 2. Gilt L 1 L 2? Äquivalenzproblem: Gegeben zwei reguläre Sprachen L 1, L 2. Gilt L 1 = L 2? Sander Bruggink Automaten und Formale Sprachen 179
Algorithmen für Probleme Algorithmen Wortproblem (w L?) Gegeben sind L und w Σ. Lösung: Bestimme einen DFA M für L und verfolge die Zustandsübergänge von M, wie durch w vorgegeben. Endzustand wird erreicht w L Nicht-Endzustand wird erreicht w L Sander Bruggink Automaten und Formale Sprachen 180
Algorithmen für Probleme Algorithmen Leerheitsproblem (L =?) Gegeben ist L. Lösung: Bestimme einen NFA M für L. L = es gibt keinen Pfad von einem Start- zu einem Endzustand. Sander Bruggink Automaten und Formale Sprachen 181
Algorithmen für Probleme Algorithmen Endlichkeitsproblem (Ist L endlich?) Gegeben ist L. Lösung: Bestimme einen NFA M für L. L ist unendlich in M gibt es unendlich viele Pfade von einem Start- zu einem Endzustand es gibt einen erreichbaren Zyklus in M, von dem aus wiederum ein Endzustand erreichbar ist. Sander Bruggink Automaten und Formale Sprachen 182
Algorithmen für Probleme Algorithmen Schnittproblem (L 1 L 2 =?) Gegeben sind L 1, L 2. Lösung: Bestimme DFAs M 1, M 2 für L 1, L 2 und bilde das Kreuzprodukt von M 1, M 2. Wende dann den Leerheitstest auf das Kreuzprodukt an. Sander Bruggink Automaten und Formale Sprachen 183
Algorithmen für Probleme Algorithmen Inklusionsproblem (L 1 L 2?) Gegeben sind L 1, L 2. Lösung: Es gilt L 1 L 2 genau dann, wenn L 1 L 2 =. Da Schnitt und Komplement konstruktiv bestimmbar sind und ein Leerheitstest existiert, kann damit das Inklusionsproblem gelöst werden. Sander Bruggink Automaten und Formale Sprachen 184
Algorithmen für Probleme Algorithmen Äquivalenzproblem (L 1 = L 2?) Gegeben sind L 1, L 2. Lösung 1: Bestimme jeweils zu L 1 und L 2 die minimalen DFAs. Wenn die DFAs gleich sind (evtl. nach Umbenennung der Zuständen), dann sind L 1 und L 2 gleich. Lösung 2: Es gilt L 1 = L 2 genau dann, wenn L 1 L 2 und L 1 L 2. Das Inklusionsproblem ist wie wir vorher gesehen haben lösbar. Sander Bruggink Automaten und Formale Sprachen 185
Algorithmen für Probleme Algorithmen Effizienzgesichtspunkte: Je nach dem in welcher Darstellung eine Sprache L gegeben ist, kann die Komplexität der oben beschriebenen Verfahren sehr unterschiedlich ausfallen. Beispiel Äquivalenzproblem: L 1, L 2 gegeben als DFAs Komplexität O(n 2 ) (d.h., quadratisch viele Schritte in der Größe der Eingabe) L 1, L 2 gegeben als Grammatiken, reguläre Ausdrücke oder NFAs Komplexität NP-hart Das bedeutet unter anderem: es ist nicht bekannt, wie dieses Problem effizient gelöst werden kann. Mehr zum Thema Komplexität in der Vorlesung Berechenbarkeit und Komplexität im Wintersemester. Sander Bruggink Automaten und Formale Sprachen 186
Anwendung: Modellverifikation Programmverifikation mit regulären Sprachen System Spezifikation Modellierung Modellierung endliche Automaten Systemmodell Spezifikationsmodell Model Checker Yes No Sander Bruggink Automaten und Formale Sprachen 187
Programmverifikation mit regulären Sprachen Anwendung: Modellverifikation In unserem Fall: Das Systemmodell ist ein NFA Sys, der alle möglichen Systemabläufe akzeptiert. Das Spezifikationsmodell ist ein NFA Spec, der alle erlaubten Systemabläufe akzeptiert. Wir verifizieren eine Sicherheitseigenschaft. Das heißt, das Spec die erlaubte Abläufe des Systems angibt. Wir ermitteln also, ob: L(Sys) L(Spec) Sander Bruggink Automaten und Formale Sprachen 188
Programmverifikation mit regulären Sprachen Anwendung: Verifikation Beispiel: wechselseitiger Ausschluss (eng.: mutual exclusion) Wir betrachten zwei Prozesse P 1, P 2, die auf eine gemeinsame Ressource zugreifen wollen. Jeder Prozess hat einen sogenannten kritischen Bereich, in dem auf die Ressource zugegriffen wird. Es darf sich jeweils nur ein Prozess im kritischen Bereich befinden. Es stehen gemeinsame Variable zur Verfügung, über die sich die Prozesse synchronisieren können. Diese Variablen sind jedoch keine Semaphore, d.h., eine atomare Operation, bei der gleichzeitig gelesen und geschrieben wird, ist nicht möglich. Wir möchten zeigen, dass der wechselseitige Ausschluss gewährleistet ist und dass gewisse Fairnessbedingungen (jeder Prozess kommt irgendwann an die Reihe) eingehalten werden. Sander Bruggink Automaten und Formale Sprachen 189
Programmverifikation mit regulären Sprachen Anwendung: Verifikation Versuch 1: Beide Prozesse P 1, P 2 verwenden eine gemeinsame Boolesche Variable f, die mit false initialisiert wird. Programmcode für P 1, P 2 while true do 1: if (f = false?) then 2: f := true 3: Betrete kritischen Bereich... 4: Verlasse kritischen Bereich 5: f := false end end Sander Bruggink Automaten und Formale Sprachen 190
Programmverifikation mit regulären Sprachen Anwendung: Verifikation Vorgang: Gebe Automaten P 1 und P 2 für die beiden Prozesse an. Gebe einen Automaten F für den Wert der Variable an. Berechne das Kreuzprodukt M Sys der obigen drei Automaten (dieser Automat modelliert das Gesamtverhalten des Systems). Gebe einen Automaten M Spec für die Spezifikation an. Finde heraus, ob L(M Sys ) L(M Spec ). Sander Bruggink Automaten und Formale Sprachen 191
Programmverifikation mit regulären Sprachen Anwendung: Verifikation Wir verwenden folgendes Alphabet, bestehend aus den Programm-Befehlen und den Abfragen der Booleschen Variablen: Σ = {(f := true) i, (f := false) i, (f = true?) i, (f = false?) i i {1, 2}} (Synchronisation von Prozess i mit Variable f ) {BkB i, VkB i i {1, 2}} (Prozess i betritt/verläßt kritischen Bereich). Der Index i {1, 2} gibt an, ob die jeweilige Aktion vom ersten oder vom zweiten Prozess ausgeführt wird. Sander Bruggink Automaten und Formale Sprachen 192
Anwendung: Verifikation Programmverifikation mit regulären Sprachen Beschreibung der Abläufe eines Prozesses i als endlicher Automat: (f = true?) i i P i 1 (f = false?) i 2 (f := true) i i (f := false) i 3 i 5 VkB i 4 BkB i i mit i = {(f :=true) i, (f :=false) i, (f =true?) i, (f =false?) i BkB j, VkB j } wobei j = 2, falls i = 1, und j = 1, falls i = 2. i Sander Bruggink Automaten und Formale Sprachen 193
Anwendung: Verifikation Programmverifikation mit regulären Sprachen Beschreibung der Booleschen Variable f durch einen Automaten: f F (f = false?) 1 (f := false) 1 (f = false?) 1 2 (f := false) 2 (f := true) 1 (f := true) 2 (f := false) 1 (f := false) 2 (f = true?) 1 (f = true?) 2 2 (f := true) 1 (f := true) 2 f mit f = {BkB 1, VkB 1, BkB 2, VkB 2 }. Sander Bruggink Automaten und Formale Sprachen 194
Anwendung: Verifikation Programmverifikation mit regulären Sprachen Die Sprache aller Abläufe des Gesamtsystems ist T (P 1 ) T (P 2 ) T (F ). Der Automat WA, der alle Abläufe beschreibt, die den wechselseitigen Ausschluß erfüllen (beide Prozesse sind nicht gleichzeitig im kritischen Bereich) sieht folgendermaßen aus: WA BkB 1 VkB 2 Σ\{VkB 1, BkB 2 } 2 1 3 Σ\{BkB 1, VkB 2 } VkB 1 BkB 2 Σ\{BkB 1, BkB 2 } Damit ist zu zeigen T (P 1 ) T (P 2 ) T (F ) T (WA). Sander Bruggink Automaten und Formale Sprachen 195
Programmverifikation mit regulären Sprachen Anwendung: Verifikation Kodierung für Grail: (f := true) 1 a (f := true) 2 A (f := false) 1 b (f := false) 2 B (f = true?) 1 c (f = true?) 2 C (f = false?) 1 d (f = false?) 2 D BkB 1 x BkB 2 X VkB 1 y VkB 2 Y Sander Bruggink Automaten und Formale Sprachen 196
Programmverifikation mit regulären Sprachen Anwendung: Verifikation Automaten-Dateien: p1.aut, p2.aut, f.aut, wa.aut. Benutzte Grail-Werkzeuge: fmcross aut1 < aut2 > res erzeugt das Kreuzprodukt von aut1 und aut2 und speichert das Ergebnis in res. fmcment aut > res erzeugt das Komplement des aut und speichert es in res. fmenum aut zählt die Wörter in der vom Automaten aut akzeptierten Sprache auf. Sander Bruggink Automaten und Formale Sprachen 197
Anwendung: Verifikation Programmverifikation mit regulären Sprachen Die entstehende Sprache ist nicht leer! Es gibt also Abläufe, die die Bedingung des wechselseitigen Ausschluss verletzen. Einer davon ist DdAXax. Übersetzt ins ursprüngliche Alphabet: (f = false?) 2 (f = false?) 1 (f := true) 2 BkB 2 (f := true) 1 BkB 1. Grund für die Verletzung des wechselseitigen Ausschlusses: Es gibt keine atomare Schreib- und Leseoperation. Daher können beide Prozessen nacheinander die Variable auslesen, anschließend setzen beide die Variable und betreten den kritischen Bereich. Der Algorithmus ist also falsch! Sander Bruggink Automaten und Formale Sprachen 198
Anwendung: Verifikation Programmverifikation mit regulären Sprachen Versuch 2: Wir betrachten nun das Verfahren zum wechselseitigen Ausschluss von Lamport. Dabei betrachten wir: zwei Prozesse P 1, P 2 mit unterschiedlichem Programmcode und zwei Boolesche Variable f 1, f 2 (beide initialisiert mit false). Sander Bruggink Automaten und Formale Sprachen 199
Anwendung: Verifikation Programmverifikation mit regulären Sprachen Prozess P 1 : while true do 1: f 1 := true 2: while (f 2 = true?) do skip end 3: Betrete kritischen Bereich... 4: Verlasse kritischen Bereich 5: f 1 := false end skip : Null-Operation (hat keine Auswirkungen) Sander Bruggink Automaten und Formale Sprachen 200
Programmverifikation mit regulären Sprachen Anwendung: Verifikation Prozess P 2 while true do 1: f 2 := true 2: if (f 1 = true?) then do 3: f 2 := false 4: while (f 1 = true?) do skip end else 5: Betrete kritischen Bereich... 6: Verlasse kritischen Bereich 7: f 2 := false end end Sander Bruggink Automaten und Formale Sprachen 201
Programmverifikation mit regulären Sprachen Anwendung: Verifikation In diesem Fall betrachten wir folgendes Alphabet Σ: Σ = {(f 1 := false) i, (f 2 := false) i, (f 1 = false?) i, (f 2 = false?) i, (f 1 := true) i, (f 2 := true) i, (f 1 = true?) i, (f 2 = true?) i, BkB i, VkB i i {1, 2}} Sander Bruggink Automaten und Formale Sprachen 202
Anwendung: Verifikation Programmverifikation mit regulären Sprachen Automat für den Prozess P 1 : 1 (f 1 := true) 1 (f 2 = false?) 1 2 3 (f 2 = true?) 1 BkB 1 P 1 (f 1 := false) 1 5 VkB 1 4 Dabei gilt, dass all mögliche Aktionen von Prozess 2 enthält. Sander Bruggink Automaten und Formale Sprachen 203
Anwendung: Verifikation Programmverifikation mit regulären Sprachen Automat für den Prozess P 2 : (f 1 = true?) 2 (f 1 = false?) 2 4 (f 2 := false) 2 1 (f 2 := true) 2 2 (f 1 = true?) 2 3 (f 2 := false) 2 7 6 VkB 2 BkB 2 5 (f 1 = false?) 2 P 2 Dabei gilt, dass all mögliche Aktionen von Prozess 1 enthält. Sander Bruggink Automaten und Formale Sprachen 204
Programmverifikation mit regulären Sprachen Anwendung: Verifikation Automaten für die beiden Variablen: 1 2 F 1 F 2 (f 1 = false?) 2 1 (f 1 := false) 1 (f 2 = false?) 1 1 (f 2 := false) 2 (f 1 := true) 1 (f 1 := false) 1 (f 2 := true) 2 (f 2 := false) 2 (f 1 = true?) 2 2 (f 1 := true) 1 (f 2 = true?) 1 2 (f 2 := true) 2 1 2 1 = {(f 2 := true) 2, (f 2 := false) 2, (f 2 = true?) 1, (f 2 = false?) 1 BkB 1, BkB 2, VkB 1, VkB 2 Analog für 2. Sander Bruggink Automaten und Formale Sprachen 205
Programmverifikation mit regulären Sprachen Anwendung: Verifikation Kodierung für Grail: (f 1 := true) 1 a (f 2 := true) 2 A BkB 1 x (f 1 := false) 1 b (f 2 := false) 2 B BkB 2 X (f 2 = true?) 1 c (f 1 = true?) 2 C VkB 1 y (f 2 = false?) 1 d (f 1 = false?) 2 D VkB 2 Y Jetzt sind die Systemabläufe in den erlaubten Systemabläufe enthalten. Das Protokoll ist also korrekt. Sander Bruggink Automaten und Formale Sprachen 206
Programmverifikation mit regulären Sprachen Anwendung: Verifikation Zusammenfassung Verifikation: Wir haben mit Hilfe von endlichen Automaten zwei Protokolle modelliert, die wechselseitigen Ausschluss realisieren sollen. Mit Hilfe der Lösungsverfahren für das Inklusionsbzw. Schnittproblem konnten wir überprüfen, ob diese Protokolle tatsächlich wechselseitigen Ausschluss realisieren. Das bedeutet: die vorgestellten Verfahren können zur Programmverifikation eingesetzt werden. Sander Bruggink Automaten und Formale Sprachen 207