Automaten und Formale Sprachen Skript zur Vorlesung WS 2005/06 Fassung vom 6.10.2005 Martin Dietzfelbinger
Technische U...
115 downloads
1345 Views
1MB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Automaten und Formale Sprachen Skript zur Vorlesung WS 2005/06 Fassung vom 6.10.2005 Martin Dietzfelbinger
Technische Universit¨ at Ilmenau Fakult¨ at fu ¨ r Informatik und Automatisierung Fachgebiet Komplexit¨ atsheorie und Effiziente Algorithmen
Inhaltsverzeichnis 0 Vorbemerkungen
1
0.1
¨ Einleitung und Uberblick . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
0.2
Zur Arbeitstechnik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
0.3
Literatur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
1 Grundbegriffe 1.1
8
Alphabete und Sprachen . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
2 Endliche Automaten und regul¨ are Sprachen 16 2.1 Deterministische endliche Automaten . . . . . . . . . . . . . . . . . . . . . 16 2.2
Nichtdeterministische endliche Automaten . . . . . . . . . . . . . . . . . . 28
2.3
Regul¨are Ausdr¨ ucke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
2.4
Das Pumping-Lemma f¨ ur regul¨are Sprachen . . . . . . . . . . . . . . . . . 55
2.5
Abschlusseigenschaften f¨ ur regul¨are Sprachen . . . . . . . . . . . . . . . . . 59
2.6
Entscheidbarkeitsfragen f¨ ur regul¨are Sprachen . . . . . . . . . . . . . . . . 63
2.7
Die Minimierung deterministischer endlicher Automaten . . . . . . . . . . 65 2.7.1 2.7.2
Unerreichbare Zust¨ande . . . . . . . . . . . . . . . . . . . . . . . . 65 ¨ Aquivalente und nicht-¨aquivalente Zust¨ande . . . . . . . . . . . . . 69
2.7.3
Minimalautomaten . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
3 Grammatiken und die Chomsky-Hierarchie
83
3.1
Grammatiken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
3.2
Rechtslineare Grammatiken und regul¨are Sprachen . . . . . . . . . . . . . 95 3.2.1 3.2.2
Rechtslineare Grammatiken . . . . . . . . . . . . . . . . . . . . . . 95 ¨ Aquivalenz zu regul¨aren Sprachen . . . . . . . . . . . . . . . . . . . 96
3.2.3
Linkslineare Grammatiken . . . . . . . . . . . . . . . . . . . . . . . 98
i
4 Kontextfreie Grammatiken und kontextfreie Sprachen
101
4.1
Beispiele und Ableitungen . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
4.2
Ableitungsb¨aume, Linksableitungen, Rechtsableitungen . . . . . . . . . . . 108
4.3
Die Chomsky-Normalform . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 4.3.1
Separierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
4.3.2
Verk¨ urzung rechter Seiten . . . . . . . . . . . . . . . . . . . . . . . 124
4.3.3
Bearbeitung von ε-Produktionen . . . . . . . . . . . . . . . . . . . 126
4.3.4
Elimination von Kettenregeln . . . . . . . . . . . . . . . . . . . . . 134
4.4
Das Pumping-Lemma f¨ ur kontextfreie Sprachen . . . . . . . . . . . . . . . 138
4.5
Der Cocke-Younger-Kasami-Algorithmus . . . . . . . . . . . . . . . . . . . 152
4.6
Abschlusseigenschaften kontextfreier Sprachen I . . . . . . . . . . . . . . . 157
5 Kellerautomaten
161
5.1
Nichtdeterministische Kellerautomaten . . . . . . . . . . . . . . . . . . . . 161
5.2
Top-Down-Parsing, LL-Parsing . . . . . . . . . . . . . . . . . . . . . . . . 175
5.3
Bottom-Up-Parsing, LR-Parsing . . . . . . . . . . . . . . . . . . . . . . . . 180
5.4
Akzeptierungsmodi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
5.5
Kellerautomaten und Grammatiken . . . . . . . . . . . . . . . . . . . . . . 187
5.6
Abschlusseigenschaften II . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
5.7
Deterministische Kellerautomaten und ihre Sprachen . . . . . . . . . . . . 191
5.8
Entscheidungsfragen f¨ ur kontextfreie Sprachen . . . . . . . . . . . . . . . . 198
A
203 A.1 b-¨are und b-adische Zahldarstellung . . . . . . . . . . . . . . . . . . . . . . 203 A.1.1 Die b-¨are Zahldarstellung . . . . . . . . . . . . . . . . . . . . . . . 203 A.1.2 Die b-adische Zahldarstellung . . . . . . . . . . . . . . . . . . . . . 206 A.2 Induktive Definitionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 A.2.1 Beispiel: Aussagenlogische Formeln . . . . . . . . . . . . . . . . . . 210 A.2.2 Beispiel: Korrekte Klammerausdr¨ ucke . . . . . . . . . . . . . . . . . 215 A.2.3 Induktive Definitionen: Formaler Rahmen . . . . . . . . . . . . . . 217
ii
Kapitel 0 Vorbemerkungen 0.1
¨ Einleitung und Uberblick
Die Vorlesung Automaten und Formale Sprachen“ behandelt zusammen mit der Vor” lesung Algorithmentheorie“ im folgenden Semester die Grundlagen der Theoretischen ” Informatik, wie sie traditionell im Grundstudium des Studienganges Informatik vermittelt werden. Die in diesen Vorlesungen benutzten Methoden sind mathematisch, auch hier werden also Dinge ( Begriffe“/ Konzepte“) formal definiert, u ¨ber die dann S¨atze bewie” ” sen werden. Allerdings haben die in dieser Vorlesung behandelten Gegenst¨ande auch noch die Eigenschaft, dass sie in engem Bezug zu konkreten Fragen aus dem Informatik-Alltag stehen. Die AT-Vorlesung (n¨achstes Semester) befasst sich zun¨achst mit der Theorie zur Bere” chenbarkeit und Entscheidbarkeit“; hier wird versucht, die Trennlinie zu verstehen zwischen Aufgaben, die man mit einem Computer im Prinzip l¨osen kann und solchen, die man nicht l¨osen kann. Das ber¨ uhmteste von Computern unl¨osbare Problem, das Halte” problem“, m¨ochte wohl jeder Programmierer gerne gel¨ost haben: Gegeben ein Computerprogramm P und eine Eingabedatei D, h¨alt P irgendwann an, wenn ich es mit den Daten aus D als Input f¨ uttere? In einem zweiten Teil ( NP-Vollst¨andigkeit“) geht es um die ” Grenze zwischen Problemen, die von effizienten, das heißt, schnellen Algorithmen gel¨ost werden k¨onnen, und solchen, f¨ ur die es keine schnellen Algorithmen gibt. In der AFS-Vorlesung geht es haupts¨achlich um Mittel zur Beschreibung formaler Sprachen, wie man sie insbesondere bei der Erstellung von Compilern oder Interpretern ben¨otigt. Die wesentlichen Beschreibungsmittel hierf¨ ur sind Automaten und Grammatiken. Wir beginnen die Vorlesung mit der Einf¨ uhrung des Begriffs (synonym: Konzeptes) For” male Sprache“. Etwas flapsig ausgedr¨ uckt ist eine formale Sprache einfach eine Menge von Texten (technisch sagt man zu einem Text Wort“ oder String“), wobei man die ” ” Menge der Zeichen festlegen muss, die im Text benutzt werden d¨ urfen. Beispiele f¨ ur formale Sprachen sind
1
• die Menge {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, . . .} der Dezimaldarstellungen der nat¨ urlichen Zahlen; die erlaubten Zeichen sind 0, 1, 2, 3, 4, 5, 6, 7, 8, 9; • die Menge {0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001, . . .} der Bin¨ardarstellungen der nat¨ urlichen Zahlen; die erlaubten Zeichen sind 0 und 1; • die Menge aller Zeichenreihen aus {X, , 0, 1, ∨, ∧, ¬, (, )}; die Formeln mit Aussagesymbolen X 1, X 10, X 11 usw. in disjunktiver Form darstellen (wie (X 100 ∧ X 11) ∨ (X 1 ∧ ¬X 10 ∧ ¬X 1001)); • die Menge der korrekten Darstellungen f¨ ur Floating-point-Zahlen in Pascal (oder C, oder C++, oder Java); • die Menge der korrekt gebildeten Namen ( identifier“) in Pascal-Programmen; ” • die Menge der korrekt gebildeten arithmetischen Ausdr¨ ucke in Pascal-Progammen; • die Menge der syntaktisch korrekten Pascal-Programme (oder C- oder C++- oder Java-Programme); • die Menge der syntaktisch korrekten Pascal-Programme, die auf allen Eingaben nach endlich vielen Schritten anhalten; • die Menge aller W¨orter, die in der gedruckten Version des Vorlesungsverzeichnisses der TU Ilmenau f¨ ur das Sommersemester 2005 stehen. Man kann sich dar¨ uber streiten, ob die Menge der korrekten S¨atze der deutschen Sprache eine formale Sprache darstellt, da wohl f¨ ur manche S¨atze die Frage, ob sie korrekt oder nicht korrekt sind, nicht eindeutig beantwortet werden kann, oder sich diese Eigenschaft im Lauf der Zeit ¨andert. Aus den Beispielen sieht man schon, dass viele wichtige formale Sprachen unendlich sind. Um sie zu beschreiben, kann man also nicht einfach alle W¨orter aufz¨ahlen, die dazu geh¨oren. Vielmehr brauchen wir Formalismen, die es gestatten, solche unendlichen Mengen von Texten durch einen einzigen endlichen Text oder eine endliche Struktur zu beschreiben. Als Beispiel f¨ ur eine solche endliche Beschreibung sei die bekannte Methode zur Definition der syntaktisch korrekten Pascal-Programme durch Syntaxdiagramme genannt. Alle Syntaxdiagramme (die man in jedem ordentlichen Pascal-Buch findet) zusammen sind nur ein endliches Gebilde, aber sie erlauben es, korrekte und nicht korrekte Programmtexte zu unterscheiden. Ein Hauptgegenstand der Vorlesung sind also verschiedene Formalismen zur Beschreibung und Manipulation formaler Sprachen. Dabei beginnen wir mit den endlichen Automaten (schon aus der Vorlesung Rechnerorganisation“ bekannt), die eine der primitivsten ” solchen Beschreibungsformen darstellen. Bemerkenswert ist, dass solche Automaten eine Vielzahl von Anwendungen haben: ziemlich naheliegende im Zusammenhang mit dem
2
Lesen und Analysieren einfachst strukturierter Texte (wie Identifier oder Floating-PointZahlen) oder einfacher Kommandosprachen, aber auch bei Grundfunktionen von Editoren (Suchen eines Strings in einer Datei). Andererseits werden endliche Automaten immer dann verwendet, wenn es um die mathematische Modellierung eines Systems geht, das nur endlich viele Zust¨ande annehmen kann. Diese findet man in praktisch jedem Anwendungsbereich, bei den Betriebssystemen, bei technischen Anwendungen (Steuerung), in der Rechnerarchitektur, in der Telematik ebenso wie bei der Modellierung von Transaktionen zwischen Gesch¨aftspartnern (e-commerce). Nichtdeterministische endliche Automaten bilden eine Verallgemeinerung von endlichen Automaten, die manche Beschreibung kompakter m¨oglich macht; wir werden aber sehen, dass die Ausdruckskraft solcher Automaten nicht st¨arker ist als die der gew¨ohnlichen endlichen Automaten. Automaten kann man als Akzeptoren“ f¨ ur Texte benutzen, indem man sie einen endlichen ” Eingabetext Buchstabe f¨ ur Buchstabe lesen l¨asst und am Ende fragt, ob der Automat den gelesenen Text gut findet ( akzeptiert“) oder nicht. Wenn ein Automat M gegeben ist, bil” det die Menge der von M akzeptierten Texte eine Sprache LM . Die Sprachen, die sich von endlichen Automaten beschreiben lassen, nennen wir regul¨ are Sprachen. F¨ ur sie stellen wir noch einen anderen Beschreibungsmechanismus bereit, die regul¨ aren Grammatiken. Diese beschreiben Sprachen nicht durch einen Lese- und Akzeptierungsmechanismus, sondern durch einen Erzeugungsprozess in der Art, wie die Syntaxdiagramme die Regeln aufzeigen, wie Pascalprogramme gebaut werden k¨onnen. Wir zeigen, dass endliche Automaten und regul¨are Grammatiken genau dieselbe Klasse von Sprachen beschreiben, indem wir Grammatiken in Automaten und Automaten in Grammatiken umbauen, ohne dass sich die zugeh¨orige Sprache ¨andert. Weiter untersuchen wir Wege, wie wir zu einem minimalen Automaten“ kommen k¨onnen, ” also demjenigen Automaten f¨ ur eine regul¨are Sprache L, der die geringste Anzahl von Zust¨anden hat. (Ein solcher Automat ist im wesentlichen eindeutig bestimmt.) Eine weitere wichtige Beschreibungsform f¨ ur regul¨are Sprachen sind durch die regul¨ aren Ausdru ucken, wenn man einen ¨ cke gegeben. Man begegnet einfachen regul¨aren Ausdr¨ Editor eine komplexere Suchen nach Teilstrings in einer Datei durchf¨ uhren l¨asst (z. B. mit wildcards und Wiederholungen von Teiltextstrukturen). Auch hier zeigen wir wieder exakt, das heißt mit einem mathematischen Beweis, dass diese Beschreibungsform ¨aquivalent zu der mit endlichen Automaten ist. Die Untersuchung der regul¨aren Ausdr¨ ucke und der von ihnen definierten Sprachen gibt uns Gelegenheit, die Methode der induktiven Definitionen“ etwas genauer unter die ” Lupe zu nehmen, die oft zur Abgrenzung von legalen“ Strukturen von illegalen“ benutzt ” ” wird, wie etwa, um die Menge aller korrekt gebildeten aussagenlogischen Formeln pr¨azise zu beschreiben. Auch die Beschreibung der Menge der syntaktisch korrekten PascalProgramme l¨asst sich als eine solche induktive Definition auffassen. — Es stellt sich heraus, wiederum mit einem konstruktiven Umbau-Beweis, dass die Klasse der von regul¨aren Ausd¨ ucken beschreibbaren Sprachen wieder dieselbe ist wie die durch endliche Automaten beschreibbare. Wichtig sind mathematische Techniken, mit denen man beweisen kann, dass eine vorge3
gebene Sprache nicht regul¨ar ist, man sich also die Suche nach einem sie beschreibenden Automaten sparen kann. Wir beweisen das sogenannte Pumping Lemma, das die wichtigste Technik f¨ ur diesen Zweck darstellt. Mit dieser Technik l¨asst sich dann schnell und elegant unterscheiden, welche Aufgaben man von endlichen Automaten erledigen lassen kann und welche nicht. Der zweite Teil der Vorlesung ist der Betrachtung der kontextfreien Grammatiken und der zugeh¨origen Klasse der kontextfreien Sprachen gewidmet. Woher die merkw¨ urdige Bezeichnung stammt, werden wir im Verlauf der Vorlesung erkl¨aren. Hier sei nur gesagt, dass kontextfreie Grammatiken das Beschreibungsmittel sind, mit dem die Syntax aller Programmiersprachen definiert wird, die irgendeine Form von Klammerschachtelung zulassen (und das sind praktisch alle). Hinter den Pascal-Syntaxdiagrammen steckt eine kontextfreie Grammatik, ebenso wie hinter den mehr oder weniger formalen Beschreibungen C, C++, Java, Haskell, usw. in den entsprechenden Handb¨ uchern. Auch XML, der aktuell praktisch extrem wichtige Formalismus zur Beschreibung semistrukturierter ” Daten“, ist im wesentlichen ein System, in dem man f¨ ur jede Anwendung eine eigene kontextfreie Grammatik u ¨berlegen muss. Wir definieren kontextfreie Grammatiken, untersuchen Syntaxb¨ aume und Ableitungssequenzen, und betrachten wichtige Normalformen f¨ ur Grammatiken. Ein Pumping ” Lemma“ f¨ ur kontextfreie Sprachen erlaubt den Nachweis, dass bestimmte Sprachen nicht kontextfrei sind; hierzu geh¨ort zum Beispiel die Sprache aller Texte, die durch Hintereinanderf¨ ugen eines Textes mit einer exakten Kopie entstehen (z. B. geh¨ort das Wort abrakadabrakad zu dieser Sprache). Diese einfache Beobachtung f¨ uhrt zu der Erkenntnis, dass kontextfreie Grammatiken nicht ausreichen, um eine typische Eigenschaft von Pascal-Programmen auszudr¨ ucken, n¨amlich dass jede Variable, die irgendwo benutzt wird, vorher deklariert worden sein muss. (Hierf¨ ur gibt es dann gesonderte Kontextbedingun” gen“, die man zus¨atzlich zu den Syntaxdiagrammen beachten muss.) Die Beschreibung der Menge der syntaktisch korrekten Programme ist eine Sache, die Syn¨ taxanalyse und die Ubersetzung in Maschinensprache (oder einen Zwischencode wie bei Java) eine andere. Hierf¨ ur braucht man Syntaxanalysemethoden, die im Fall von kontextfreien Grammatiken durch sogenannte Kellerautomaten geliefert werden. Auch dieses Modell wird ausf¨ uhrlich besprochen, und wir untersuchen im Prinzip, wie Kellerautomaten W¨orter daraufhin untersuchen, ob sie zu einer von einer Grammatik beschriebenen Sprache geh¨oren. Die Einzelheiten der Konstruktion von Syntaxanalyseverfahren aus einer kontextfreien ¨ Grammatik bleibt aber einer Spezialvorlesung zum Thema Ubersetzerbau“ vorbehalten. ”
4
0.2
Zur Arbeitstechnik
Erfahrungsgem¨aß f¨allt es vielen Studierenden schwer, sich mit der Arbeits- und Denkweise anzufreunden, die in den beiden Theorie-Vorlesungen des Grundstudiums erwartet wird. Dabei f¨allt den meisten die Arbeit mit der AFS-Vorlesung noch leichter als die AT-Vorlesung. Daher folgen hier einige aus der Erfahrung der mit diesen Vorlesungen und zugeh¨origen ¨ Ubungen befassten Lehrpersonen fließende Ratschl¨age. (Sie klingen vielleicht banal, ihre Beachtung erh¨oht aber Ihre Erfolgschancen. Sie sind aber nicht unbedingt leicht umzusetzen, erfordern also Ihre Aufmerksamkeit jede Woche neu.) • Diese Vorlesung ist von der Dichte und der Art des Stoffs her nicht daf¨ ur geeignet, sie durch reines Zuh¨oren zu verarbeiten. Eigenes Weiterarbeiten ist unabdingbar. • Arbeiten Sie daher den Stoff jeder Vorlesung zeitnah nach. Material hierf¨ ur sind Ihre eigenen Notizen, das Skript im Web, erg¨anzendes Material von der Webseite, sowie weitere Literatur. Veranschlagen Sie hierf¨ ur mindestens 2 bis 3 Zeitstunden pro Woche, also deutlich mehr als die Dauer der Vorlesung. • Stil und Arbeitsweise sind mathematisch, und es kommt darauf an, dass man die Definitionen ganz genau ansieht und versteht. • Es bestehen enge Zusammenh¨ange innerhalb eines Vorlesungsteils, aber auch u ¨ber weitere Abst¨ande. Man muss die relevanten Definitionen und Sachverhalte aus den vergangenen Vorlesungen auswendig parat haben, da man sonst die Dinge nicht verstehen kann, die darauf aufbauen. ¨ • Wir geben jede Woche ein Ubungsblatt heraus. Idealerweise u ur ¨berlegen Sie sich f¨ ¨ ¨ einige der Ubungsaufgaben L¨osungen, die dann mit den in der Ubungsstunde angegebenen verglichen werden k¨onnen. Studierende sind auch eingeladen, selbst L¨osun¨ gen vorzutragen. — Minimale Vorbereitung auf die Ubung ist das Durchdenken der ¨ Aufgaben, damit man weiß, worum es geht. — Auch f¨ ur die Ubungen gilt, dass zeitnahes Nacharbeiten und Kontrolle des eigenen Verstehens am meisten n¨ utzt. ¨ • Stellen Sie Fragen (in oder nach der Vorlesung, in oder nach den Ubungen). • Bereiten Sie sich semesterbegleitend auf die Pr¨ ufung vor, die im Februar stattfindet. ¨ • Gegenstand der Pr¨ ufung ist der Stoff der Vorlesung und die in den Ubungen bearbeiteten Aufgabentypen. F¨ ur die Fragen zur Vorlesung ist es sehr hilfreich, wenn Sie sich eine eigene Kurzfassung mit den Definitionen und den zentralen Tatsachen anfertigen. Sie finden fr¨ uhere Klausuren auf unseren Webseiten. Das schriftliche L¨osen ¨ von Ubungsaufgaben und fr¨ uheren Klausuraufgaben, auch in der Nacharbeit der ¨ Ubungen, ist die beste Pr¨ ufungsvorbereitung.
5
0.3
Literatur
Zur Vorlesung erscheint ein Skript im ps- und pdf-Format, das im Copyshop und auf der Webseite zur AFS-Vorlesung http://www.tu-ilmenau.de/fakia/AFS05.html zu finden ist. Das Skript definiert den pru ¨ fungsrelevanten Stoff der Vorlesung. ¨ Auf derselben Webseite findet sich auch weiteres Material (Ubungsbl¨ atter, Links zu fr¨ uheren Vorlesungen, fr¨ uhere Klausuren, Kopien von Folien bzw. Pr¨asentationsmaterialien, die in der Vorlesung benutzt wurden). Es ist aber allen Studierenden geraten, auch andere Darstellungen und B¨ ucher zu Rate zu ziehen. Fast alle B¨ ucher zum Thema decken den Stoff beider Vorlesungen (AFS und AT) ab. Hier einige (bei weitem nicht alle) Bu ¨ cher zum Stoff der Vorlesungen AFS und AT: 1. J. E. Hopcroft, R. Motwani, J. D. Ullman: Einf¨ uhrung in die Automatentheorie, Formale Sprachen und Komplexit¨atstheorie. Pearson, 2002. ¨ (Klassiker in Neubearbeitung. Ubersetzt aus dem Englischen. Sehr ausf¨ uhrlich, viele ¨ Anwendungen und Beispiele, mathematische Details; Ubungsaufgaben.) 2. U. Sch¨oning: Theoretische Informatik – kurzgefasst. Spektrum Akademischer Verlag, 2001. (Sehr kompakt, konzentriert sich auf die wesentlichen Techniken. Viele Exemplare in der Lehrbuchsammlung.) 3. D. C. Kozen: Automata and Computability. Springer, 1997. 4. A. Asteroth, C.Baier: Theoretische Informatik – Eine Einf¨ uhrung in Berechenbarkeit, Komplexit¨at und formale Sprachen mit 101 Beispielen. Pearson Studium, 2002. (Theoretische Informatik, wie sie an der Universit¨at Bonn gelehrt wird. Viele Beispiele, aber mathematisch genaue Entwicklung.) 5. I. Wegener: Theoretische Informatik – eine algorithmenorientierte Einf¨ uhrung. Teubner, 1999. (Verwandt zur Vorlesung, aber anderer Stil. Beginnt mit AT-Stoff, dann AFS-Stoff.) 6. I. Wegener: Kompendium Theoretische Informatik – eine Ideensammlung. Teubner, 1996. (Erg¨anzung zur Vorlesung, erl¨autert Konzepte und u ¨bergreifende Ideen.) 7. K. W. Wagner: Theoretische Informatik – Eine kompakte Einf¨ uhrung. 2. Auflage. Springer, 2003. (Theoretische Informatik, wie sie an der Universit¨at W¨ urzburg gelehrt wird. Deutlich mehr Gewicht auf der Berechenbarkeitstheorie mit Maschinenmodellen.) 6
8. N. Blum: Theoretische Informatik – eine anwendungsorientierte Einf¨ uhrung. 2. Auflage. Oldenbourg, 2001. (Kombination des Stoffs der Vorlesung mit einer Einf¨ uhrung in das Gebiet der effizienten Algorithmen, exakte Durchf¨ uhrung der Beweise.) Zu Informatik- und Mathematik-Grundlagen: 1. A. Aho, J. D. Ullman. Informatik: Datenstrukturen und Konzepte der Abstraktion. International Thomson Publishing, 1996. 2. Ehrig, Mahr, Cornelius, Große-Rhode, Zeitz: Mathematisch-strukturelle Grundlagen der Informatik. Springer, 2001. 3. C. Meinel, M. Middendorf: Mathematische Grundlagen der Informatik – Mathematisches Denken und Beweisen. Teubner, 2002. Website: 1. Lernumgebung Automatentheorie“, Universit¨at Z¨ urich, Skript und Automaten zum ” Selberbasteln. http://www.ifi.unizh.ch/cl/broder/jflap Weiterfu ¨ hrende Literatur: 1. A. Aho, R. Sethi, J. D. Ullman. Compilerbau Teil 1. Oldenbourg, 1999. 2. R. Floyd, R. Beigel. Die Sprache der Maschinen. International Thomson Publishing, 1996. 3. J. Hromkoviˇc: Theoretical Computer Science – Introduction to Automata, Computability, Complexity, Algorithmics, Randomization, Communication, and Cryptography. Springer, 2004. 4. H. Lewis, C. Papadimitriou: Elements of the Theory of Computation. Prentice Hall, 1998. ¨ 5. R. Wilhelm, D. Maurer: Ubersetzerbau – Theorie, Konstruktion, Generierung. Springer, 1997.
7
Kapitel 1 Grundbegriffe 1.1
Alphabete und Sprachen
1.1.1 Vereinbarung N bezeichnet die Menge {0, 1, 2, 3, . . .} der nat¨ urlichen Zahlen. F¨ ur die Menge {1, 2, 3, . . .} der positiven nat¨ urlichen Zahlen schreiben wir N+ .
1.1.2 Definition F¨ ur eine beliebige Menge X, X 6= ∅, bezeichnet Seq(X) die Menge der endlichen Folgen oder “Tupel” in X, d. h. die Menge {(a1 , . . . , an ) | n ≥ 0, a1 , . . . , an ∈ X}. (Im Gegensatz dazu ist X N = {(ai )i≥0 | ai ∈ X f¨ ur i ≥ 0} die Menge der unendlichen Folgen in X.)
1.1.3 Beispiel Wir k¨onnen endliche Tupel aus nat¨ urlichen Zahlen betrachten: Die Menge Seq(N) enth¨alt () (die leere Folge mit L¨ange 0), (0), (1), . . ., (0, 0), (0, 1), (0, 2), . . ., (1, 0), (1, 1), (1, 2), . . ., (3, 4, 4, 2), . . .. In h¨oheren Programmiersprachen wie Pascal, C, Java, usw. wird anscheinend mit Zahlen gerechnet. Bei genauerem Hinsehen stellt sich heraus, dass reale Rechner dies gar nicht tun. Vielmehr operieren sie auf Bitfolgen (der Inhalt des Hauptspeichers eines Rechners etwa ist eine Bitfolge, ebenso Dateiinhalte). Zahlen muß man bin¨ar kodieren. Auch wir werden uns meist auf den Standpunkt stellen, dass Maschinen nur Zeichenreihen mit Zeichen aus einem endlichen Zeichensatz bearbeiten k¨onnen. Im Anhang Zahldarstellungen ” und Abz¨ahlungen“ werden die Prinzipien des Umrechnens von Zahlen in Zeichenreihen und umgekehrt besprochen. An dieser Stelle geben wir einige allgemeine Grundkonzepte f¨ ur solche Zeichenreihen (synonym: W¨ orter, Strings, Zeichenketten) an. 8
1.1.4 Definition Ein Alphabet Σ ist eine endliche nichtleere Menge. (Alphabete werden oft auch mit ∆, Γ, . . . bezeichnet.) Die Elemente eines Alphabets heißen Buchstaben. Typische konkrete Buchstaben sind: 0, 1, 2,. . . , a, b, c, . . . , A, B, C, . . . , #, /c, $, . . .. Die Symbole a, b, . . . , a0 , a1 , a2 , . . . werden auch als Platzhalter f¨ ur beliebige Buchstaben“ ” verwendet.
1.1.5 Beispiel (a) Die Menge {1} oder {|} heißt das un¨ are Alphabet. Die Menge Σ = {0, 1} heißt das bin¨ are Alphabet. Die Menge {0, 1, #} ist das bin¨are Alphabet mit Trennzeichen #. (b) Die Menge Γ = {0, 1}8 ist das Alphabet aller 8-Bit-Strings (Bytes). Der einfache ASCII-Code gibt eine injektive Abbildung einer Menge von nat¨ urlichen“ Buch” staben, Ziffern, und Symbolen (d. h. eines gewissen Alphabets) in {0, 1}7 an. Diese Darstellung wird dann durch eine f¨ uhrende Null zu einem Byte erg¨anzt. Der volle ASCII-Code hat 256 Buchstaben“, unter ihnen auch jede Menge (unsichtbare) ” Steuerzeichen. (c) Das lateinische Alphabet besteht aus 26 Groß- und 26 Kleinbuchstaben und einer Reihe von Sonderzeichen wie Punkt, Komma, Zwischenraum, usw. (d) Nat¨ urlich sind Alphabete Σ und Σ0 gleichwertig“, wenn |Σ| = |Σ0 | gilt, es also eine ” bijektive Abbildung von Σ nach Σ0 gibt. Jedes Alphabet Σ mit k Buchstaben ist mit {1, 2, . . . , k} und {0, 1, . . . , k − 1} gleichwertig. Die Schreibweise Σ = {b1 , b2 , . . . , bk } bzw. Σ = {b0 , b1 , . . . , bk−1 } stellt die entsprechende Korrespondenz her. 1.1.6 Definition Σ sei ein Alphabet. F¨ ur n ∈ N bezeichnet Σn die Menge aller Folgen w = (a1 , . . . , an ) aus n Buchstaben aus Σ. Statt (a1 , . . . , an ) schreiben wir a1 · · · an , falls keine Verwirrung m¨oglich ist1 . Eine solche Folge w nennen wir ein Wort u ¨ber Σ (synonym: Zeichenreihe, Zeichenkette oder String u ange von w, bezeichnet mit ¨ber Σ). Die L¨ |w|, ist n. Offenbar gibt es genau |Σ|n W¨orter der L¨ange n u ber Σ. Die Menge aller W¨orter ¨ u ¨ber Σ wird folgendermaßen bezeichnet: [ Σ∗ := {Σn | n ∈ N}. Nat¨ urlich ist Σ∗ = Seq(Σ). Ein besonderes Wort ist ε, das leere Wort, das einzige Wort der L¨ange 0 u ¨ber Σ. Formal: ε = (), die leere Folge. 1
Sind die Buchstaben in Σ selbst W¨ orter, muss man nat¨ urlich die Fugen markieren: z.B. w = (11, 7, 9, 13, 20) bei Σ = {0, . . . , 31} oder w = hdel1ihtextihdel2i bei Σ = {del1, text, del2, . . .}. Treten (, ) und das Komma als Buchstaben auf, verhindert man Missverst¨andnisse gegebenenfalls durch Einschließen in Anf¨ uhrungszeichen “(”, “)”, “,” oder dergleichen.
9
Beachte: Σ0 = {ε}, Σ1 =“ Σ. (Man identifiziert das 1-Tupel (a) mit dem Objekt a und ” erh¨alt Σ1 = {(b) | b ∈ Σ} =“ Σ.) Mit dieser Vereinbarung ist dann stets Σ ⊆ Σ∗ . ” Die Menge aller nichtleeren W¨orter u ¨ber Σ heißt Σ+ : [ Σ+ := Σ∗ − {ε} = {Σn | n ≥ 1}. 1.1.7 Beispiel (a) Σ = {1} : Dann ist Σ∗ = {ε, 1, 11, 111, 1111, 11111, . . .} = b {0, 1, 2, 3, 4, 5, . . .}. (Die Bijektion |1 ·{z · · 1} ↔ k liefert die Strichlistendarstellung oder un¨are Darstellung k−mal
f¨ ur die nat¨ urlichen Zahlen.)
(b) Σ = {0, 1} : Dann ist Σ∗ = {ε, 0, 1, 00, 01, 10, 11, 000, 001, . . .}, die Menge aller Bin¨arw¨orter. (c) Ein ASCII-File ist ein Wort u ¨ber Σ = {0, 1}8 . Man beachte dabei, dass bei der rechnerinternen Darstellung die unsichtbaren Leerzeichen als Buchstabe ( space“) gelten ” und Zeilenumbr¨ uche durch Steuerzeichen markiert werden, die selbst Buchstabe im ASCII-Alphabet sind.
1.1.8 Definition Sind u = a1 · · · an und v = b1 · · · bm W¨orter (¨ uber einem Alphabet Σ), so heißt uv := a1 · · · an b1 · · · bm (ein Wort der L¨ange n + m) die Konkatenation oder Hintereinanderschaltung von u und v. (Manchmal findet man auch die Notation u ◦ v oder u · v f¨ ur diese Operation.)
1.1.9 Beispiel 010 · 111 ε · 11 10 · ε εε = ε · ε
= 010 ◦ 111 = 010111 = ε ◦ 11 = 11 = 10 ◦ ε = 10 = ε ◦ ε = ε
1.1.10 Bemerkung Die Menge Σ∗ ist mit der Operation ◦ (Konkatenation) ein Monoid mit neutralem Element ε, d.h. es gelten die folgenden Beziehungen: (i) Assoziativit¨at: (uv)w = u(vw) f¨ ur alle u, v, w ∈ Σ∗ . (ii) Neutrales Element: εu = uε = u f¨ ur alle u ∈ Σ∗ .
10
1.1.11 Beispiel (00 ◦ 10) ◦ 111 00 ◦ (10 ◦ 111) 100 ◦ ε = ε ◦ 100 ε◦ε
= 0010111 = 0010111 = 100 = ε
Konsequenz: Bei Konkatenation kann man Klammern beliebig setzen oder alle Klammern weglassen. Man schreibt also 00 ◦ 01 ◦ 101 f¨ ur (00 ◦ 01) ◦ 101 oder 00 ◦ (01 ◦ 101). 1.1.12 Definition
F¨ ur ein Wort w = a1 · · · an ∈ Σ∗ und einen Buchstaben a ∈ Σ sei
|w|a := die H¨aufigkeit des Auftauchens von a in w := |{i | 1 ≤ i ≤ n ∧ ai = a}|. Beispiele: |0101011|1 = 4; |0101011|0 = 3; |0101011|2 = 0. Offenbar gilt: |uv|a = |u|a + |v|a (und ¨ahnliche Formeln) und |w| = Σ = {b1 , . . . , bk } ist.
Pk
i=1
|w|bi , wenn
1.1.13 Definition Ist w ∈ Σ∗ ein Wort und i ∈ N, so wird mit wi die i-fache Konkatenation von w mit sich selbst bezeichnet, d.h. wi = ww · · · w}. Formal definieren wir | {z i−mal
induktiv:
w0 := ε wi := wwi−1 , f¨ ur i ≥ 1.
Da Σ ⊆ Σ∗ , ist damit auch ai f¨ ur Buchstaben a ∈ Σ erkl¨art. Informal: ai = |a ·{z · · a} , f¨ ur i−mal
ur beliebiges i ≥ 0. i ≥ 0. Man beachte die Gleichheiten a0 = ε und a1 = a, sowie εi = ε f¨
Wir vereinbaren folgende Priorit¨atsregel beim Zusammentreffen von Konkatenation und Potenzierung: Potenzieren bindet st¨arker als Konkatenation. Um dies aufzuheben, sind geeignet Klammern zu setzen. Beispiele: Sei Σ = {0, 1}. Ist a = 0 und w = 101, dann gilt a0 = w0 = ε, a6 = 000000, w3 = 101101101. Weiter gilt 00012 0 = 000110, (00)(01)2 0 = 0001010 und (0001)2 0 = 000100010. 1.1.14 Definition u und w seien W¨orter u ¨ber Σ. Dann heißt u ein Teilwort ∃v1 , v2 ∈ Σ∗ : w = v1 uv2 ∃v ∈ Σ∗ : w = uv Pr¨ afix oder Anfangsstu . von w, falls ¨ck ∗ ∃v ∈ Σ : w = vu Suffix oder Endstu ¨ck
Beachte: Wenn u ein Pr¨afix (oder Suffix) von w ist, ist u auch Teilwort von w, da w = εuv (oder w = vuε) geschrieben werden kann. — Es ist klar, dass jedes w ∈ Σn genau n + 1 Pr¨afixe und n + 1 Suffixe hat, unter denen sich jeweils auch w selbst und ε befinden. 11
1.1.15 Beispiel 0000 ist Teilwort von 010000011, aber weder Pr¨afix noch Suffix. 0000 ist Pr¨afix von 0000010 und Suffix von 1110000; daher ist 0000 auch Teilwort von 000010 und 1110000. 1.1.16 Definition (a) Wenn Σ ein Alphabet ist und L ⊆ Σ∗ , dann heißt L eine (formale) Sprache u ¨ ber Σ. (b) Eine Menge L heißt eine (formale) Sprache, wenn es ein Alphabet Σ mit L ⊆ Σ∗ gibt. Im Zusammenhang mit dieser Vorlesung bedeutet Sprache“ immer dasselbe wie formale ” ” Sprache“. Sprachen interessieren uns in zweierlei Hinsicht: einmal als Formalisierung des Begriffs eines Berechnungsproblems“ (dieser Aspekt wird in der AT-Vorlesung im Vordergrund ” stehen), hier aber zun¨achst als Gegenst¨ande der Theorie der formalen Sprachen. Charakteristisch am Umgang mit Sprachen in der Informatik ist, dass die dort vorkommenden Sprachen meist unendlich viele W¨orter enthalten (man denke etwa an die Menge der syntaktisch korrekten Pascal-Programme). Eine unendliche Sprache kann man nicht durch Auflisten ihrer Elemente angeben, sondern immer nur dadurch, dass man eine endliche Menge von Regeln angibt, anhand derer man entscheiden kann, welche W¨orter dazu geh¨oren und welche nicht. In dieser Vorlesung werden viele solche Beschreibungsmethoden angegeben und der Umgang mit ihnen ge¨ ubt. Wir werden als Beschreibungsform (Spezifikation) von Sprachen haupts¨achlich Grammatiken betrachten, aber auch Maschinenmodelle untersuchen, die die Analyse von vorgelegten W¨ortern durchf¨ uhren k¨onnen, im Hinblick darauf, ob sie zu einer Sprache geh¨oren oder nicht. Wenn L eine Sprache u urlicher Weise ein Entschei¨ber Σ ist, so geh¨ort zu L in ganz nat¨ dungsproblem, n¨amlich: Wortproblem f¨ ur L: Eingabe: w ∈ Σ∗ . Ausgabe: JA, falls w ∈ L, NEIN sonst. Umgekehrt kann man normalerweise Entscheidungsprobleme als Wortprobleme u ¨ber passenden Sprachen formulieren. Dieser Zusammenhang wird aber erst im sp¨ateren Verlauf (Vorlesung AT) wichtig werden. 1.1.17 Beispiel (a) L∅ = ∅ heißt die leere Sprache; Lε = {ε} ist die Sprache, die nur das leere Wort enth¨alt. L∅ und Lε sind Sprachen u ur jedes Alphabet Σ. F¨ ur jedes beliebige ¨ber Σ f¨ ∗ Alphabet Σ ist Σ ⊆ Σ , also ist die Menge Σ eine Sprache; f¨ ur n ∈ N beliebig ist Σn eine Sprache, Σ∗ ist Sprache u ur a ∈ Σ ist {an | n ∈ N} Sprache u ¨ber Σ. F¨ ¨ber Σ. 12
(b) Sei Σ = {0, 1} das bin¨are Alphabet. Dann ist Σ+ = die Sprache aller nichtleeren Bitstrings; Σ8 ist die Sprache, die genau die 256 verschiedenen Bytes enth¨alt; Σ32 ist die Sprache, die alle 32-Bit-W¨ rter enth¨alt. Einem Bin¨arwort w = bk−1 · · · b0 ∈ Σk entPok−1 spricht die Zahl (w)2 = i=0 bi 2i (Umrechnung von Bin¨ardarstellung in nat¨ urliche Zahl). Ist i ∈ N, so heißt ein Wort w mit |w| ≥ 1 und (w)2 = i eine Bin¨ardarstellung von i. Das k¨ urzeste solche Wort w (außer f¨ ur (0)2 = 0 hat das Wort w als erstes Zeichen eine 1) heißt oft die“ Bin¨ardarstellung von i und wird mit bin(i) ” bezeichnet. F¨ ur i ∈ N nennen wir 1i die Un¨ardarstellung von i. Offenbar ist die Abbildung N 3 i 7→ 1i ∈ {1}∗ eine Bijektion. Eine (recht nat¨ urliche) Bijektion N ↔ {1, 2}∗ wird in Abschnitt A.1.2 im Anhang vorgestellt. (c) Man kann nun mathematische und andere Probleme als Wortprobleme u ¨ber passenden Sprachen darstellen, z. B. Lgerade = {0, 10, 100, 110, 1000, 1010, 1100, . . .} = {bin(n) ∈ {0, 1}∗ | n gerade}. Lbin = {0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001, . . .} = {bin(n) | n ∈ N}. Lprim = {10, 11, 101, 111, 1011, 1101, 10001, 10011, . . .} = {bin(p) | p Primzahl}. LPrimzahlzwillinge = {bin(i)#bin(j) | i, j ∈ N, i + 2 = j, i, j Primzahl}. Dabei heißt ein Paar (i, i + 2) ein Paar von Primzahlzwillingen, wenn sowohl i als auch i + 2 Primzahlen sind. Zum Beispiel sind (3, 5), (5, 7), (11, 13), (17, 19) solche Paare. Es ist ein ber¨ uhmtes offenes Problem der Zahlentheorie, herauszufinden, ob es unendlich viele solche Paare gibt. LPrimzahlzwillinge ist eine Sprache u ¨ber dem Alphabet {0, 1, #}. Das Problem Gibt es unendlich viele Primzahlzwillinge?“ l¨asst sich dann ” schreiben als die Frage Ist LPrimzahlzwillinge unendlich?“ ” Wenn Σ ⊆ Σ0 ist, so ist selbstverst¨andlich jede Sprache u ¨ber Σ automatisch auch Sprache 0 u ¨ber Σ . Wir werden dies im folgenden oft stillschweigend benutzen. Insbesondere kann man bei beliebigen Sprachen L1 (¨ uber Σ1 ) und L2 (¨ uber Σ2 ) immer annehmen, dass dasselbe Alphabet zugrundeliegt: man w¨ahle einfach Σ = Σ1 ∪ Σ2 . 1.1.18 Definition (a) Sind L1 und L2 Sprachen, so heißt L1 L2 = {w1 w2 | w1 ∈ L1 , w2 ∈ L2 } die Konkatenation von L1 und L2 . Beispiele: {0}∗ {1}∗ = {0i 1j | i, j ≥ 0}, {0} ∪ {1}{0, 1}∗ = Lbin . 13
(auch L1 ◦ L2 oder L1 · L2 )
Beachte: Die Konkatenation ist assoziativ, d. h. f¨ ur beliebige Sprachen L1 , L2 , L3 gilt (L1 L2 )L3 = L1 (L2 L3 ). Weiter gilt Lε L = LLε = L f¨ ur jede Sprache L. (Damit ist f¨ ur jedes Alphabet Σ die Menge {L | L ⊆ Σ∗ , L 6= ∅} der nichtleeren Sprachen u ¨ber Σ ein Monoid mit neutralem Element Lε .) Andererseits ist L∅ ein ausl¨oschendes Element, denn es gilt L∅ L = LL∅ = L∅ = ∅ f¨ ur jede Sprache L. ¨ (Die Beweise sind einfache Ubungsaufgaben.) (b) Ist L Sprache, so definieren wir: Li := {w1 w2 · · · wi | w1 , . . . , wi ∈ L}, f¨ ur i ≥ 0. Formal definieren wir induktiv: L0 := Lε ; Li := LLi−1 f¨ ur i ≥ 1. Man beachte, dass {wi | w ∈ L} ⊆ Li ist, dass aber gew¨ohnlich nicht Gleichheit herrscht, wie man etwa an dem Beispiel {01, 10}2 = {0101, 0110, 1001, 1010} 6= {0101, 1010} sieht. Weiter sei L∗ :=
[
{Li | i ≥ 0} = L0 ∪ L1 ∪ L2 ∪ L3 ∪ · · ·
Diese Sprache heißt der Kleene-Abschluss von L. Weiter sei [ L+ := {Li | i ≥ 1} = L1 ∪ L2 ∪ L3 ∪ · · · .
In Worten: L∗ enth¨alt die W¨orter w der Form w = w1 · · · wi , i ≥ 0, wobei w1 , . . . , wi ∈ ¨ L; L+ enth¨alt die W¨orter w = w1 · · · wi , i ≥ 1, wobei w1 , . . . , wi ∈ L sind. Zur Ubung + ∗ ∗ u ¨berlege man, dass L = LL = L L ist. Man beachte den Unterschied zwischen L∗ und {wi | w ∈ L, i ≥ 0}. F¨ ur die Sprache L = {0, 11} ist zum Beispiel das Wort 011001111011 = 0(11)00(11)(11)0(11) in L∗ enthalten, nicht aber in {wi | w ∈ L, i ≥ 0}. (c) Sprachen lassen nat¨ urlich auch alle Mengenoperationen zu, insbesondere folgende: Sind L1 , L2 Sprachen, so auch die Vereinigung L1 ∪ L2 und der Durchschnitt L1 ∩ L2 . Ist L Sprache u ¨ber Σ, kann man auch das Komplement L = Σ∗ − L betrachten. L∅ ist neutrales Element bez¨ uglich Vereinigung: L ∪ L∅ = L∅ ∪ L = L. ∗ F¨ ur Sprachen u uglich Durchschnitt: L ∩ Σ∗ = ¨ber Σ ist Σ neutrales Element bez¨ Σ∗ ∩ L = L. 14
1.1.19 Beispiel Betrachte L1 = {w ∈ {0, 1}∗ | |w|0 = |w|1 } und L2 = {0}∗ {1}∗ = {0i 1j | i, j ≥ 0}. Dann ist L1 ∩ L2 = {0i 1j | i = j} = {ε, 01, 0011, 000111, . . .} und L1 = {w ∈ {0, 1}∗ | |w|0 6= |w|1 }. Sprechweise: Oft betrachtet man die Gesamtheit aller Sprachen mit einer gewissen Eigenschaft. Dann sprechen wir gew¨ohnlich von einer Klasse von Sprachen (nicht von einer Menge). Beispiele hierf¨ ur: Die Klasse aller Sprachen“, die Klasse der unendlichen Spra” ” chen“, die Klasse der Sprachen u ¨ber einem einelementigen Alphabet“, die Klasse der ” ” regul¨aren Sprachen“. F¨ ur Mathematikfans und Puristen sei kurz der Hintergrund erkl¨art: In der Mengenlehre zeigt man, dass die Gesamtheit aller Mengen selber keine Menge ist. Daraus ergibt sich sofort, dass die Gesamtheit aller Alphabete keine Menge sein kann, und auch nicht die Gesamtheit aller formalen Sprachen. F¨ ur Gesamtheiten, die man definieren kann, die aber keine Mengen darstellen, benutzt man in der Mengenlehre die Bezeichnung (echte) Klasse“. (F¨ ur den Gebrauch in dieser Vorlesung macht diese Feinheit aber keinen ” Unterschied.)
15
Kapitel 2 Endliche Automaten und regul¨ are Sprachen Die regul¨aren Sprachen ( regular sets“) sind die einfachsten formalen Sprachen. Wir wer” den Maschinenmodelle kennenlernen ( endliche Automaten“ in verschiedenen Vari” anten), die diesen Sprachen entsprechen, und andere Methoden, diese Sprachen zu beschreiben ( regul¨ are Ausdru are Grammatiken“). Wir wollen uns ¨cke“ und regul¨ ” ” ¨ anhand der regul¨aren Sprachen exemplarisch die Uberg¨ ange zwischen verschiedenen Be¨ schreibungsformen f¨ ur dieselbe Sprache klarmachen, und f¨ ur diese Uberg¨ ange soweit wie m¨oglich effiziente Algorithmen bereitstellen. Zudem wird sich zeigen, dass man f¨ ur jede regul¨are Sprache algorithmisch einen effizientesten“ Automaten konstruieren kann. ” Ebenso wichtig wie das Konzept der regul¨aren Sprache ist das Konzept des Automaten selbst, das in vielen verschiedenen Teilbereichen der Theoretischen, der Praktischen und der Technischen Informatik Anwendung findet. Erinnert sei an die Vorlesung Rechner” organisation“, in der schon endliche Automaten untersucht wurden.1
2.1
Deterministische endliche Automaten
In diesem Abschnitt besprechen wir das f¨ ur die regul¨aren Sprachen grundlegende Maschinenmodell: die deterministischen endlichen Automaten ( deterministic fi” nite automata“, abgek¨ urzt DFA“). Diese Automaten erhalten ein Eingabewort x = ” b1 · · · bm ∈ Σ∗ (f¨ ur ein Alphabet Σ) vorgelegt, das einmal von links nach rechts gelesen wird. Endliche Automaten haben eine Steuereinheit, die eine endliche Speicherkapazit¨at repr¨asentiert und abstrakt durch eine endliche Menge Q von Zust¨anden gegeben ist. Einer der Zust¨ande ist als Startzustand ausgezeichnet (bezeichnet mit q0 ). Startend in p0 = q0 , liest der DFA einen Buchstaben des Eingabewortes nach dem anderen und geht dabei in 1
Im Gegensatz zur dortigen Darstellung ist es f¨ ur unsere Zwecke nicht wichtig, ob die Eingabezeichen und die Zust¨ ande bin¨ ar oder anders dargestellt werden.
16
jedem Schritt in Abh¨angigkeit vom alten Zustand pt−1 und dem gerade gelesenen Buchstaben at in einen Zustand pt u ur t = 1, 2, . . . , m. Welcher Zustand jeweils anzunehmen ¨ber, f¨ ¨ ist, wird von einer Ubergangsfunktion δ : Q × Σ → Q vorgeschrieben (δ(q, a) = q 0 bedeutet: wird in Zustand q der Buchstabe a gelesen, so ist der neue Zustand q 0 ). Am Ende der Berechnung, d. h. sobald der letzte Buchstabe bm gelesen wurde, wird (nur!) anhand von pm , dem schließlich erreichten Zustand, entschieden, ob x = b1 · · · bm akzeptiert“ ” oder verworfen“ werden soll. Dazu wird eine Menge F ⊆ Q (die akzeptierenden“ ” ” Zust¨ande) benutzt. Hinter dem Modell des deterministischen endlichen Automaten steht das etwas allgemeinere Konzept eines finite state system“: ein System mit endlich vielen Zust¨anden ” (Menge Q), das mit einer Folge von Signalen“ aus einem endlichen Vorrat Σ von Signa” ¨ len gef¨ uttert wird und auf jedes Signal mit dem Ubergang in einen durch alten Zustand und Signal eindeutig bestimmten n¨achsten Zustand reagiert. Wenn man noch einen Startzustand q0 spezifiziert ( Reset-Zustand“), so bestimmt jede Signalfolge (b1 , . . . , bm ) ∈ Σ∗ ” eine Folge von Zust¨anden, die das System durchl¨auft. Dieses Modell l¨asst sich auch durch eine Ausgabefunktion erweitern, so dass etwa in jedem Schritt ein Ausgabesignal oder eine endliche Folge von Ausgabesignalen erzeugt wird (Moore- und Mealy-Automaten, siehe Vorlesung Rechnerorganisation“). ” Wir stellen die Bearbeitung eines Eingabewortes durch einen DFA wie folgt graphisch dar: Start
p =q 0 0
b1
p1
b2
p2
...
bm
pm
F?
Abbildung 2.1: Ablauf einer Berechnung auf einem DFA Die Folge der durchlaufenen Zust¨ande p0 , . . . , pm wird als (gerichteter) Weg dargestellt, wobei nat¨ urlich Wiederholungen m¨oglich sind. Die Kante vom Knoten pt−1 zum Knoten pt ist mit bt markiert. Wir geben nun eine pr¨azise Definition von DFA’s und ihrer Arbeitsweise. 2.1.1 Definition Ein deterministischer endlicher Automat ( deterministic ” finite automaton“ — DFA) M besteht aus 5 Komponenten: • einer endlichen Menge Q (der Zustandsmenge“); ” • einem Alphabet Σ (dem Eingabealphabet“); ” • einem ausgezeichneten Zustand q0 ∈ Q (dem Startzustand“); ” • einer Menge F ⊆ Q von akzeptierenden“ Zust¨anden; ” ¨ • einer Ubergangsfunktion“ δ : Q × Σ → Q. ” (Formal schreibt man M = (Q, Σ, q0 , F, δ).) 17
Wenn ein DFA M = (Q, Σ, q0 , F, δ) gegeben ist, dann kann man ein beliebiges Eingabewort b1 · · · bm von M verarbeiten lassen und am Ende nachsehen, ob der erreichte Zustand pm in F liegt oder nicht. 2.1.2 Beispiel Wir beschreiben einen DFA, der genau die Dezimalzahlen akzeptiert, deren Wert nicht durch 3 teilbar ist. Nach einer bekannten Rechenregel gilt: N = (b1 · · · bm )10 ist durch 3 teilbar genau dann wennP die Quersumme der Dezimaldarstellung b1 · · · bm von N durch 3 teilbar ist, d. h. wenn 1≤i≤m bi ≡ 0 (mod 3) ist. Wir geben nun einen Automaten an, der eine Dezimalzahl (auch mit f¨ uhrenden Nullen) ziffernweise von links nach rechts liest und dabei (in der Steuereinheit) die Quersumme der bislang gesehenen Ziffern modulo 3 speichert. Wir setzen M = (Q, Σ, q0 , F, δ) mit Q = {0, 1, 2} (die m¨oglichen Reste), Σ = {0, 1, . . . , 9}, q0 = 0, F = {1, 2}; δ ist durch folgende Tabelle gegeben:
δ:
a q 0 0 0 1 1 2 2
1 2 1 2 2 0 0 1
3 4 0 1 1 2 2 0
5 2 0 1
6 7 0 1 1 2 2 0
8 9 2 0 0 1 1 2
Tabelle 2.1: Tabellendarstellung eines DFA Wir sehen uns an, wie der DFA auf der Eingabe w = 044318 arbeitet. Es werden die Zust¨ande 0, 0, 1, 2, 2, 0 durchlaufen und schließlich 2 erreicht. Da 2 ∈ F , wird das Eingabewort w akzeptiert. — Man bemerkt, dass man aus der Berechnung auch erf¨ahrt, 0 1 i bi 0 pi 0 0 ∈ F? – –
2 4
3 4
1 ∗
4 3
2 ∗
5 1
2 ∗
6 8
0 –
2 ∗
Tabelle 2.2: Arbeitsweise eines DFA dass das leere Wort ε nicht akzeptiert wird, ebenso wie die Ziffernfolge 04431. Dem Leser wird geraten, als weiteres Beispiel die von M auf den Eingaben u = 00123234345 durchlaufene Zustandsfolge anzusehen. (u wird nicht akzeptiert.) Man u sich ¨berzeugt P leicht (per Induktion u ¨ber t), dass M nach dem Lesen von b1 , . . . , bt im Zustand 1≤i≤t bi mod 3 ist, sich also die Quersumme modulo 3 merkt“. Aufgrund der Festlegung von F gilt ” dann, dass M genau die W¨orter akzeptiert, die Zahlen darstellen, die nicht durch 3 teilbar sind.
18
2.1.3 Bemerkung (Darstellungsweisen f¨ ur endliche Automaten) Es wird sich als vorteilhaft erweisen, verschiedene Darstellungsweisen f¨ ur endliche Automaten zur Verf¨ ugung zu haben. Wir charakterisieren zuerst die eben im Beispiel verwendete Form. (a) Tabellenform: Man hat die Mengen Q und Σ durch Auflistungen gegeben, ebenso F ; weiter ein Element ¨ q0 ∈ Q. Die Ubergangsfunktion δ ist als Tabelle (|Q| × |Σ|-Matrix) gegeben: Der Eintrag am Schnittpunkt der Zeile f¨ ur q ∈ Q mit der Spalte f¨ ur a ∈ Σ ist δ(q, a) ∈ Q. Als Beispiel betrachte man Tab. 2.1. Diese Form ist besonders gut zur Ausf¨ uhrung der Berechnungen von DFA’s und zur Manipulation von DFA’s auf Rechnern geeignet. Die dazu ben¨otigten Datenstrukturen m¨oge man sich selbst zurechtlegen. (Arrays f¨ ur Σ und Q, ein Bitvektor f¨ ur F , ein Index f¨ ur q0 , ein zweidimensionales Array mit Eintr¨agen aus Q f¨ ur δ. Wenn ein Eingabewort verarbeitet wird, muss nur ein Zustand, d. h. ein Index im Q-Array, gespeichert werden.) (b) Beschreibung durch Formeln: Mitunter ist Q so groß, dass eine explizite Auflistung nicht in Frage kommt. Man denke etwa an ein 32 Bit breites Register, auf das eine Folge von 30-Bit-Zahlen aufaddiert werden soll (modulo 232 ). Der Zustand ist der Inhalt des Registers, ein Eingabe- Buchstabe“ ” ist ein 30-Bit-String. Also ist Q = {0, 1}32 und Σ = {0, 1}30 . Die Tabelle h¨atte Gr¨oße 262 ≈ 4,6 · 1018 . Man schreibt dann einfach: δ(q, a) = die Bin¨ardarstellung (mit 32 Bits) von ((q)2 + (a)2 ) mod 232 , f¨ ur q ∈ Q und a ∈ Σ. Der Startzustand q0 ist eventuell das Wort 032 ; wie die Menge F zu w¨ahlen ist, h¨angt von der Anwendung ab. (c) Graphenform: Man kann einen DFA M als einen gerichteten Graphen GM mit Knoten- und Kantenmarkierungen auffassen. Jedem Zustand q ∈ Q entspricht ein Knoten vq mit Markierung q. Die (gerichteten) Kanten in GM sind mit Buchstaben a ∈ Σ markiert. Dabei verl¨auft eine mit a markierte Kante von vq nach vq0 genau dann wenn δ(q, a) = q 0 . Beachte, dass GM Mehrfachkanten (mit verschiedenen Markierungen) und Schleifen (Kanten mit demselben Anfangs- und Endpunkt) besitzen kann. Jeder Knoten in GM hat genau |Σ| viele ausgehende Kanten.
19
d q a
q’
q
b a
a q’
q
c
b Einfachkante d Mehrfachkante
δ(q,a)=q’
Schleife δ(q,a)=δ (q,c)=q
δ(q,a)=δ(q,b)=δ(q,d)=q’
Abbildung 2.2: Graphische Darstellung eines DFA Eine Tabelle f¨ ur δ wie in (a) ist einfach eine kompakte Beschreibung von GM . Die Knoten vq0 und vq , q ∈ F , sind speziell markiert. Wenn wir GM zeichnen, markieren wir vq0 mit einem mit Start“ bezeichneten eingehenden Pfeil; die Knoten vq mit q ∈ F ” erhalten einen doppelten Rand: Start
q0
q
Abbildung 2.3: Startknoten (links) und Knoten f¨ ur einen akzeptierenden Zustand (rechts) Bei der graphischen Darstellung vermeiden wir Mehrfachkanten von vq nach vq0 dadurch, dass wir nur eine Kante angeben und diese mit den Elementen der Menge {a ∈ Σ | δ(q, a) = q 0 } bzw. einer Abk¨ urzung f¨ ur diese Menge markieren. Der große Vorteil der Darstellung von endlichen Automaten als Graphen liegt neben der anschaulicheren Darstellung darin, dass DFA’s mit Graphenalgorithmen bearbeitet werden k¨onnen. Wir werden die Graphensichtweise oft verwenden. Als graphische Darstellung des Automaten aus Beispiel 2.1.2 ergibt sich folgendes: 0,3,6,9 Start
0
2,5,8 1,4,7
0,3,6,9 2,5,8 1,4,7 1
0,3,6,9 2
1,4,7 2,5,8
Abbildung 2.4: Graphische Darstellung eines DFA Die akzeptierende Berechnung von M auf der Eingabe x = 12211112 wird wie folgt dargestellt: 20
Start
0
1
1
2
0
2
2
1
0
1
1
1
2
1
0
2
2
Abbildung 2.5: Eine akzeptierende Berechnung Man sieht“, dass jedes Wort w = b1 · · · bm einen Weg in GM beschreibt, der in vq0 ” beginnt und dessen Kanten mit den Buchstaben b1 , . . . , bm beschriftet sind. Dieser Weg ist eindeutig bestimmt, weil δ eine Funktion ist. Die Darstellung der Berechnung wie in Abb. 2.1 ergibt sich dabei als abgewickelte“ Version dieses Weges, wobei die Knoten ” wiederholt werden. Das Wort w wird genau dann akzeptiert, wenn der von w in G erzeugte Weg in einem Knoten vq mit q ∈ F endet. 2.1.4 Beispiel Sei Σ = B ∪ Z, wo B = {a, . . . , z, A, . . . , Z} die Menge der Buchstaben und Z = {0, . . . , 9} die Menge der Dezimalziffern ist. Weiter sei L := BΣ∗ (= {w ∈ Σ∗ | w beginnt mit einem Buchstaben}) die Menge der legalen Bezeichner ( identifier“), z. B. in Pascal. Zum Beispiel sind eagle15 ” und afs2005 in L, nicht jedoch 1E oder ε. Der folgende Automat M = (Q, Σ, q0 , F, δ) akzeptiert genau die W¨orter in L: Q = {0, 1, 2}, F = {1}, q0 = 0, und δ gegeben durch folgendes Diagramm: 1
B Start
Σ
0 Z
2
Σ
Abbildung 2.6: DFA mit Fehlerzustand 2“ ” 2
Σ
Bemerkenswert an diesem Diagramm ist der Knoten v2 : Ein solcher Knoten stellt einen Fehlerzustand“ dar. Wird w¨ahrend der Verabeitung eines Eingabewortes einmal ” dieser Zustand erreicht, kann er nie mehr verlassen werden, und der Automat wird garantiert verwerfen. Mitunter l¨asst man in der graphischen Darstellung von DFA’s solche Fehlerzust¨ande und die in sie hineinf¨ uhrenden Kanten weg. Das sieht dann so aus: Start
0
B
1
Σ
Abbildung 2.7: DFA aus Abb. 2.6, Fehlerzustand weggelassen Wenn beim Lesen eines Wortes w versucht wird, eine nicht vorhandene Kante zu benutzen, ist man schon sicher, dass w nicht akzeptiert wird. 21
Wir wenden uns nun der mathematischen Definition der zu einem DFA M geh¨orenden Sprache zu. Man definiert, in welchen Zustand M ger¨at, wenn er in einem beliebigen Zustand q startet und das Wort w = b1 · · · bm , m ≥ 0, liest, und sieht nach, ob dieser Zustand in F liegt. 2.1.5 Definition (a) Definiere δˆ : Q × Σ∗ −→ Q durch Induktion u ¨ber die L¨ange m eines Wortes w = b1 · · · bm : ˆ ε) := q, f¨ δ(q, ur q ∈ Q.; ˆ b1 · · · bm ) := δ(δ(q, ˆ b1 · · · bm−1 ), bm ), f¨ δ(q, ur q ∈ Q, m ≥ 1, b1 , . . . , bm ∈ Σ. ˆ ε) = q, f¨ ˆ ua) = δ(δ(q, ˆ u), a), f¨ (Kurz: δ(q, ur q ∈ Q; δ(q, ur q ∈ Q und u ∈ Σ∗ , a ∈ Σ.) ˆ 0 , w) ∈ F . (b) F¨ ur w ∈ Σ∗ definieren wir: M akzeptiert w, falls δ(q (c) LM := {w ∈ Σ∗ | M akzeptiert w}. Wenn L = LM , sagt man auch: M akzeptiert L“, als Abk¨ urzung f¨ ur M akzeptiert ” ” die W¨orter in L und nur diese“. Umgekehrt heißt L die von M akzeptierte ” Sprache“. (d) Eine Sprache L heißt regul¨ ar , falls es einen DFA M mit L = LM gibt. (Die Herkunft der Bezeichnung regul¨ar“ wird in Abschnitt 2.3 gekl¨art.) ” ˆ a) = δ(q, ˆ εa) = δ(δ(q, ˆ ε), a) = δ(q, a). F¨ ur q ∈ Q, a ∈ Σ gilt nach den Definitionen: δ(q, ∗ ˆ Also ist δ eine Fortsetzung von δ von Q × Σ auf Q × Σ . Es kann also keine Verwirrung auftreten, wenn wir ab jetzt stets δ statt δˆ schreiben. Die erweiterte δ-Funktion hat eine simple Interpretation im Automatengraphen GM : δ(q, w) = q 0 gilt genau dann, wenn man in vq startend und dann den von w = b1 · · · bm vorgeschriebenen Kanten folgend den Knoten vq0 erreicht. Wir notieren einfache Eigenschaften, die die Aneinanderreihung von Teilrechnungen betreffen. 2.1.6 Bemerkung (a) Sind w, w0 ∈ Σ∗ , q ∈ Q, so ist δ(q, ww0 ) = δ(δ(q, w), w0 ). (b) Sind w1 , w2 , ∈ Σ∗ , q ∈ Q mit δ(q, w1 ) = δ(q, w2 ), so ist δ(q, w1 w0 ) = δ(q, w2 w0 ) f¨ ur 0 ∗ alle w ∈ Σ .
22
Beweis (a) Diese Aussage sollte intuitiv klar sein. Wir geben den Beweis als Beispiel f¨ ur einen einfachen Beweis durch Induktion u ¨ber die L¨ange von W¨ortern“ an.) ” 0 Induktion u ber |w |: ¨ I. A.: Ist |w0 | = 0, also w0 = ε, so ist δ(q, ww0 ) = δ(q, w) = δ(δ(q, w), ε) nach Definition 2.1.5(a). I. S.: Ist |w0 | ≥ 1, also w0 = ua f¨ ur u ∈ Σ∗ , a ∈ Σ, so gilt: 2.1.5(a) 2.1.5(a) I.V. δ(q, ww0 ) = δ(q, wua) = δ(δ(q, wu), a) = δ(δ(δ(q, w), u), a) = = δ(δ(q, w), ua) = δ(δ(q, w), w0 ). (a) (a) Vor. ˆ w2 w0 ). (b) δ(q, w1 w0 ) = δ(δ(q, w1 ), w0 ) = δ(δ(q, w2 ), w0 ) = δ(q,
Bemerkung 2.1.6 kann man informal so ausdr¨ ucken: Alles, was ein DFA nach dem Lesen eines Pr¨afixes w der Eingabe weiß“, steckt in dem Zustand δ(q0 , w). Weil Q endlich ist, ” kann ein DFA nur endlich viele verschiedene Situationen auseinanderhalten. Wir benutzen dies, um eine ganz einfache Aufgabe anzugeben, die kein DFA l¨osen kann. 2.1.7 Beispiel die Sprache
( Kein endlicher Automat kann beliebig weit z¨ahlen“.) Wir betrachten ” L := {x ∈ {0, 1}∗ | |x|0 = |x|1 },
die aus allen Bin¨arw¨ortern besteht, die genau gleich viele Nullen und Einsen haben. (Zum Beispiel ist 01100011 ∈ L, nicht aber 00011100.) Wir behaupten: L ist nicht regul¨ar. Der Beweis ist indirekt. Angenommen, es gilt L = LM f¨ ur einen DFA M = (Q, Σ, q0 , F, δ). Weil Q endlich ist, k¨onnen die Zust¨ande δ(q0 , 0), δ(q0 , 02 ), δ(q0 , 03 ), . . . nicht alle verschieden sein, also gibt es i, j ≥ 0 mit i < j, so dass δ(q0 , 0i ) = δ(q0 , 0j ). Weil L = LM und 0i 1i ∈ L und 0j 1i ∈ / L, gilt δ(q0 , 0i 1i ) ∈ F und δ(q0 , 0j 1i ) 6∈ F . Andererseits gilt j (wegen δ(q0 , 0 ) = δ(q0 , 0i ) und nach 2.1.6(b)), dass δ(q0 , 0i 1i ) = δ(q0 , 0j 1i ). Dies ist der gew¨ unschte Widerspruch. 2.1.8 Bemerkung Zwischen Definition 2.1.5 und der graphischen Darstellung von DFA’s besteht folgender einfacher Zusammenhang. Dabei ist mit GM die eigentliche Version, also die mit Mehrfachkanten, gemeint. Zu einem Zustand q und einem Wort x = b1 · · · bm geh¨ort ein eindeutig bestimmter Weg der L¨ange m, der in vq startet und dessen Kanten mit b1 , . . . , bm markiert sind. Offenbar gilt δ(q, b1 · · · bm ) = q 0 genau dann, wenn dieser Weg in vq0 endet. (Z. B. haben wir oben den Weg, der in dem Automaten aus Beispiel 2.1.2 von Zustand 0 ausgehend durch das Wort 12211112 erzeugt wird, explizit angegeben.) Man beachte den Spezialfall m = 0, der einem Weg der L¨ange 0 entspricht. Der Fall q = q0 f¨ uhrt zu folgender Charakterisierung des Akzeptierungsbegriffs: b1 · · · bm ∈ LM genau dann, wenn der eindeutige Weg, der in vq0 startet und Kantenbeschriftung b1 , . . . , bm hat, in einem Knoten vq mit q ∈ F endet. ¨ Zur Ubung interpretiere man Bemerkung 2.1.6(a) in der Sichtweise der Graphen. (Es werden Wege aneinandergeh¨angt.) 23
Wir wollen einige einfache Eigenschaften der Klasse der regul¨aren Sprachen notieren. Vorher stellen wir ein Lemma bereit, das besagt, dass man bei einer regul¨aren Sprache L das Alphabet des zugeh¨origen Automaten beliebig w¨ahlen kann, solange das Alphabet alle Buchstaben enth¨alt, die in W¨ortern von L vorkommen. 2.1.9 Lemma Wenn L regul¨are Sprache ist und L ⊆ Σ∗ , dann existiert ein DFA M = (Q, Σ, q0 , F, δ) mit L = LM . Beweis Weil L regul¨ar ist, existiert nach Definition 2.1.5(d) ein DFA M 0 = (Q0 , Σ0 , q00 , F 0 , δ 0 ) mit L = LM 0 . (Das Problem ist, dass Σ 6= Σ0 sein kann, und auf den ersten Blick kein DFA f¨ ur L mit Alphabet Σ in Sicht ist. Man stelle sich vor, Σ = {0, 1}, L ⊆ {0}∗ , und wir haben einen DFA f¨ ur L mit Alphabet Σ0 = {0, a, b}.) Wir bauen M 0 wie folgt zu einem neuen DFA M um: Buchstaben aus Σ0 − Σ werden nicht ber¨ ucksichtigt (sie kommen in 0 W¨ortern aus L auf keinen Fall vor). Buchstaben aus Σ − Σ werden gelesen, f¨ uhren aber sofort in einen Fehlerzustand, denn auch sie kommen in W¨ortern aus L nicht vor. Formal setzen wir: Q0 ∪ {qFEHLER }, f¨ ur einen neuen Zustand qFEHLER , 0 q0 , F 0, δ 0 (q, a), wenn q ∈ Q0 , a ∈ Σ ∩ Σ0 ; qFEHLER , wenn q ∈ Q0 , a ∈ Σ − Σ0 ; qFEHLER f¨ ur alle q ∈ Q. ¨ In der Graphendarstellung sieht die Anderung so aus: Aus GM 0 werden alle Kanten weg0 gelassen, die mit a ∈ Σ − Σ beschriftet sind. Sodann wird ein neuer Knoten f¨ ur den Fehlerzustand qFEHLER hinzugef¨ ugt; aus allen urspr¨ unglichen Knoten f¨ uhren Kanten, die 0 mit a ∈ Σ − Σ beschriftet sind, in diesen Fehlerknoten. Q q0 F δ(q, a) δ(q, a) δ(qFEHLER , a)
= = = = = =
Es ist leicht zu sehen, dass folgendes gilt: F¨ ur w ∈ (Σ∩Σ0 )∗ ist δ(q0 , w) = δ 0 (q00 , w), also ist w ∈ LM genau dann wenn w ∈ LM 0 = L. (Formal beweist man das durch Induktion u ¨ber die L¨ange von w.) F¨ ur w ∈ Σ∗ , die mindestens einen Buchstaben aus Σ − Σ0 enthalten, ist δ(q0 , w) = qFEHLER , also w 6∈ LM . Daraus folgt LM = L. 2.1.10 Satz (a) Die Sprache L∅ = ∅ ist regul¨ar. (b) Ist Σ ein Alphabet und w ∈ Σ∗ , so ist {w} regul¨ar. (Insbesondere sind also {ε} und {a} f¨ ur a ∈ Σ regul¨ar.) (c) Sind L1 und L2 regul¨are Sprachen, so sind auch L1 ∪ L2 und L1 ∩ L2 regul¨ar. (d) Alle endlichen Sprachen sind regul¨ar. (e) Ist L ⊆ Σ∗ eine regul¨are Sprache, so ist auch L = Σ∗ − L regul¨ar. 24
Beweis (a) Der DFA Start
Σ
0
¨ (f¨ ur ein beliebiges Alphabet Σ) akzeptiert ∅. (Zur Ubung gebe man diesen Automaten auch in Tabellenform an.) (b) Ist w = a1 · · · an ∈ Σ∗ , so akzeptiert der DFA Start
0
a1
1
a2
Σ−{a 1 } Σ−{a 2 }
2
a3
a n-1
...
Σ−{a 3 }
n-1
an
n
Σ−{a n } ...
q
Σ
FEHLER
Σ
die Sprache {w}. ¨ (Ubung: Wie sieht die Tabelle f¨ ur δ aus?) Man beachte die folgenden Spezialf¨alle: F¨ ur w = ε fallen die Zust¨ande 0 und n zusammen, d. h. der DFA hat nur zwei Zust¨ande 0 und qFEHLER . Dabei ist δ(0, a) = qFEHLER f¨ ur alle a ∈ Σ, und F = {0}. F¨ ur w = a ∈ Σ hat der DFA drei Zust¨ande 0, 1 und qFEHLER . (Was ist δ und F ?) (c) W¨ahle ein Alphabet Σ mit L1 ∪ L2 ⊆ Σ∗ und (nach Lemma 2.1.9 geht das!) (1) (2) DFA’s M1 = (Q1 , Σ, q0 , F1 , δ1 ) und M2 = (Q2 , Σ, q0 , F2 , δ2 ) mit LM1 = L1 und LM2 = L2 . Die Idee ist, beide Automaten gleichzeitig“ laufen zu lassen. Dazu sieht ” man Zust¨ande vor, die aus einem M1 -Zustand und einem M2 -Zustand bestehen. Aus offensichtlichen Gr¨ unden heißt die folgende Konstruktion Kreuzproduktkonstruktion. Definiere Q := Q1 × Q2 , (1) (2) q0 := (q0 , q0 ), (1) (2) (1) (2) δ((q , q ), a) := δ1 (q , a), δ2 (q , a) , f¨ ur q (1) ∈ Q1 , q (2) ∈ Q2 , a ∈ Σ.
25
Man zeigt dann durch Induktion u ¨ber |w| : (1)
(2)
δ(q0 , w) = (δ1 (q0 , w), δ2 (q0 , w)) ∈ Q, f¨ ur alle w ∈ Σ. Wenn wir also definieren: F 0 := {(q (1) , q (2) ) ∈ Q | q (1) ∈ F1 und q (2) ∈ F2 }, F 00 := {(q (1) , q (2) ) ∈ Q | q (1) ∈ F1 oder q (2) ∈ F2 }, u r L1 ∩ L2 so sehen wir (nach Definition 2.1.5), dass M 0 = (Q, Σ, q0 , F 0 , δ) ein DFA f¨ 00 00 und M = (Q, Σ, q0 , F , δ) ein DFA f¨ ur L1 ∪ L2 ist. Analog kann man DFA’s f¨ ur andere Boolesche Kombinationen wie L1 − L2 oder L1 ⊕ L2 = (L1 − L2 ) ∪ (L2 − L1 ) konstruieren. ¨ (Man u wie der Graph GM 0 bzw. GM 00 aussieht. Tip: Trage die ¨berlege zur Ubung, Knoten von GM 0 in ein Gitter ein, dessen Zeilen mit q (1) ∈ Q1 und dessen Spalten mit q (2) ∈ Q2 beschriftet sind. Der Knoten f¨ ur Zustand (q (1) , q (2) ) sitzt am Schnittpunkt (1) (2) von Zeile q und Spalte q .) (d) Um einen DFA f¨ ur die Sprache L := {w1 , . . . , wm } zu erhalten, definiere L0 := ∅ und Li := {w1 , . . . , wi }. Ein DFA f¨ ur Li entsteht aus dem f¨ ur Li−1 und dem f¨ ur {wi } (gem¨aß (b)) durch Anwendung der Konstruktion aus (c). Die Behauptung folgt durch vollst¨andige Induktion. Alternativ betrachte man die folgende direkte Konstruktion, die i. a. deutlich weniger Zust¨ande ben¨otigt. Es sei Σ ein Alphabet mit L ⊆ Σ∗ . Die Idee ist folgende: Der DFA muss sich merken“, welche Zeichen er bisher gelesen hat. Wenn diese ein ” Wort in L bilden, muss der DFA in einem akzeptierenden Zustand sein. Wenn die bisher gelesenen Zeichen nicht Pr¨afix eines Wortes aus L sind, kann der DFA in ¨ einen Fehlerzustand gehen. Nach kurzer Uberlegung sieht man, dass man als Zustandsmenge einfach die Menge aller Pr¨afixe der W¨orter in L und einen zus¨atzlichen Fehlerzustand nehmen kann. Q q0 F δ(u, a) δ(u, a) δ(qFEHLER , a)
:= := := := := :=
{u ∈ Σ∗ | u ist Pr¨afix eines Wortes w ∈ L} ∪ {qFEHLER }; ε; L; ua, falls u ∈ Q − {qFEHLER } und ua ∈ Q, qFEHLER , falls u ∈ Q − {qFEHLER } und ua 6∈ Q, qFEHLER f¨ ur alle a ∈ Σ.
Man kann nun durch Induktion u ¨ber |w| zeigen, dass δ(q0 , w) = w ist, falls w Pr¨afix eines Wortes in L ist und δ(q0 , w) = qFEHLER sonst. Daraus folgt nach der Definition von F , dass M genau die W¨orter in L akzeptiert.
26
(e) Nach Lemma 2.1.9 ist es m¨oglich, einen DFA M = (Q, Σ, q0 , F, δ) mit L = LM zu w¨ahlen. Dann definiere F 0 := Q − F und M 0 := (Q, Σ, q0 , F 0 , δ), d. h. M 0 entsteht aus M durch Vertauschen von akzeptierenden und nicht akzeptierenden Zust¨anden. Es ist klar, dass L = Σ∗ − L = LM 0 , da f¨ ur w ∈ Σ∗ gilt: w ∈ L ⇔ w 6∈ L ⇔ δ(q0 , w) 6∈ F ⇔ δ(q0 , w) ∈ F 0 . Beachte: F¨ ur diese Konstruktion ist es n¨otig, dass δ eine Funktion ist. Die nichtdeterministischen endlichen Automaten des n¨achsten Abschnitts lassen diese Konstruktion nicht zu.
2.1.11 Beispiel (a) Die Sprachen L0 = {x ∈ {0, 1}∗ | |x|0 gerade} und L1 = {x ∈ {0, 1}∗ | |x|1 gerade} sind regul¨ar: Offenbar ist L0 = LM0 f¨ ur folgenden DFA M0 : 1 0
Start
1
0 1 0
Vertauschen wir bei den Kantenmarkierungen 0 und 1, erhalten wir einen DFA M1 f¨ ur die Sprache L1 . Setzen wir in M0 F 0 = {0, 1} − F = {1}, so erhalten wir einen DFA M00 f¨ ur die Sprache L0 = {x ∈ {0, 1}∗ | |x|0 ungerade}. (b) Die mit dem Verfahren von Satz 2.1.10(c) konstruierten Automaten f¨ ur L0 ∪ L1 , L0 ∩ L1 , L0 ∪ L1 sehen im Prinzip wie folgt aus: 1 (0,1)
(0,0)
Start 0
1 0
0
0
1 (1,0)
(1,1) 1
Gezeichnet ist ein Automat f¨ ur L0 ∩ L1 . Automaten f¨ ur die anderen Sprachen erh¨alt man durch Variieren der Menge der Endzust¨ande. Z. B. entspricht F = {(0, 0), (0, 1), (1, 0)} der Sprache L0 ∪ L1 , und F = {(1, 1)} der Sprache L0 ∪ L1 .
27
2.2
Nichtdeterministische endliche Automaten
Nichtdeterministische Automaten unterscheiden sich von deterministischen dadurch, dass sie in einer gegebenen Situation (Zustand und neu gelesenes Zeichen) eventuell die M¨oglichkeit haben, unter mehreren Nachfolgezust¨anden auszuw¨ahlen. Nach wie vor liest der Automat in jedem Schritt einen Buchstaben, jedoch ist zugelassen, dass zu einem gegebenen gegenw¨artigen Zustand q und gelesenem Buchstaben a kein, ein oder mehr als ein legaler Nachfolgezustand q 0 existieren. Demgem¨aß gibt es zu einer Eingabe w unter Umst¨anden mehrere legale Berechnungen. 2.2.1 Beispiel (Eingeschr¨ anktes Rucksackproblem) Wir stellen uns folgende Situation vor: Ein Einbrecher ist mit einem Rucksack ausger¨ ustet, der genau h Kubikzentimeter fasst, f¨ ur ein h ∈ N. Er steht in einem Raum, in dem sich n S¨ackchen befinden, die mit Edelmetallkr¨ umeln gef¨ ullt sind. Die S¨ackchen sind beliebig verformbar; ihre Volumina sind a1 , a2 , . . . , an , wobei die ai Zahlen in {1, . . . , h} sind. Nat¨ urlich m¨ochte der Einbrecher seinen Rucksack m¨oglichst voll packen. Ist es m¨oglich, eine Teilmenge der S¨ackchen auszuw¨ahlen, so dass die Kapazit¨at h des Rucksacks perfekt ausgenutzt wird? Technisch ausgedr¨ uckt: gibt es eine Teilfolge i1 < · · · < ik in der Folge 1, . . . , n derart dass ai1 + · · · + aik = h ist? Um diese Situation als Sprache zu modellieren, legen wir als Eingabealphabet die Menge Σh = {1, 2, . . . , h} fest, f¨ ur ein h ≥ 1. Unser Problem entspricht dann dem Wortproblem f¨ ur die Sprache X LRS a1 · · · an ∈ Σ∗ ∃I ⊆ {1, . . . , n} : ai = h . h = i∈I
RS Beispielsweise ist (2, 2, 2, 2, 2, 2) ∈ / LRS 5 , jedoch (2, 1, 2, 3, 2, 1, 3) ∈ L5 .
Wir wollen das Problem mit einem nichtdeterministischen Verfahren l¨osen, bei dem die Reihe der Zahlen a1 , . . . , an nur einmal von links nach rechts gelesen wird. F¨ ur eine Eingabefolge (ein Eingabewort) w = a1 · · · an ∈ Σ∗h wollen wir also herausbekommen, ob es eine Teilfolge gibt, die sich zu h summiert. Wir geben einen endlichen Automaten mit nicht ¨ eindeutig bestimmten Uberg¨ angen an, der zur Bearbeitung des Problems geeignet ist. Als Zustandsmenge w¨ahlen wir Q = {0, 1, . . . , h} (mit der Intention, in einem Zustand q die Summe der bisher gew¨ahlten Volumina zu speichern). Wir starten mit q0 = 0 (anfangs ist nichts gew¨ahlt) und zielen auf F = {h} (am Ende soll die Summe h genau erreicht sein). Wird nun ein Eingabezeichen a ∈ Σh gelesen, kann man die Zahl a entweder der Teilsumme hinzuf¨ ugen oder nicht. M¨ogliche neue Zust¨ande sind also q (Gegenstand nicht nehmen) oder q + a (Gegenstand nehmen — das ist nat¨ urlich nur sinnvoll, wenn q + a ≤ h ist). Formal dr¨ ucken wir das so aus, dass wir als Wert δ(q, a) die Menge aller Zust¨ande angeben, die von q aus gew¨ahlt werden d¨ urfen, wenn a gelesen wird. Also: {q, q + a}, falls q + a ≤ h, δ(q, a) := {q}, falls q + a > h. 28
Nun kann eine Eingabe zu mehreren verschiedenen legalen Berechnungen f¨ uhren. Beispielsweise kann man auf Eingabe w = (2, 1, 3, 1) unter anderen die beiden in Abb. 2.8 gezeigten Berechnungen erhalten. Start
0
Start
0
2
1
2
2
1
0
3
3
3
1
1
3
4
1
4
5
Abbildung 2.8: Zwei verschiedene Berechnungen f¨ ur eine Eingabe auf einem NFA ¨ Um einen Uberblick u ¨ber alle m¨oglichen Berechnungen zu erhalten, stellen wir diese in einem Berechnungsbaum“ dar. F¨ ur jeden erreichten Zustand und das n¨achste eingelesene ” Zeichen stellt man alle m¨oglichen Nachfolgezust¨ande als Knoten dar. Zum Beispiel ergeben sich f¨ ur die Eingabew¨orter (2, 4, 2, 2) und (2, 1, 3, 1), wo h = 5, die in Abb. 2.9 angegebenen Bilder. Start
0 2
2 0 0
4
2
2
0
2 2
2 2
2 0
2 4 2
4
4
4 2 4
2 4
2 2
2 2
Start
1 0
3 1 1
2
2
2
1
1
0 0
1 3 3 1 3
4 2 4
2 4
0
0 1
2
2 2
1 1 4
3
1
1
1
2
2 3 1 4
4
2 1 5
1 2
3 3 1 3
5 1 5
1 3 3 3 1 1 3 4
Abbildung 2.9: Alle Berechnungen f¨ ur (2, 4, 2, 2) und (2, 1, 3, 1), f¨ ur h = 5 Bei Eingabe (2, 4, 2, 2) ∈ / LRS anden; 5 enden alle Berechnungen in nicht akzeptierenden Zust¨ dies entspricht der Situation, dass es keine Folge von Entscheidungen gibt, die dazu f¨ uhrt, enden manche dass man am Ende in Zustand h = 5 landet. Bei Eingabe (2, 1, 3, 1) ∈ LRS 5 29
Berechnungen in nicht akzeptierenden Zust¨anden; hier hat man unterwegs ungeeignete Entscheidungen getroffen. Es gibt aber zwei verschiedene Berechnungswege, die zum akzeptierenden Zustand h = 5 f¨ uhren. Auch f¨ ur kleine Zustandsmengen und Alphabete k¨onnen die Berechnungsb¨aume sehr groß werden. K¨onnen wir hier etwas sparen? Man sieht, dass Zust¨ande auf demselben Level ¨ mehrfach aufgelistet werden, obwohl dies eigentlich nicht n¨otig ist. Eine kurze Uberlegung f¨ uhrt zu der Erkenntnis, dass es gen¨ ugt, die Menge der auf einem Level auftretenden Zust¨ande zu registrieren. (Das sind {0}, {0, 2}, {0, 2, 4}, {0, 2, 4}, {0, 2, 4} im ersten und {0}, {0, 2}, {0, 1, 2, 3}, {0, 1, 2, 3, 4, 5}, {0, 1, 2, 3, 4, 5} im zweiten Baum in Abb. 2.9.) Diese Beobachtung werden wir benutzen, um den Akzeptierungsmodus f¨ ur unsere nichtdeterministischen Automaten zu definieren. Wir entwickeln nun die formale Definition von nichtdeterministischen endlichen Automa¨ ten. Ein solcher Automat M spezifiziert Q, Σ, q0 , F und eine Ubergangsfunktion δ : Q × Σ → P(Q) (wobei P(Q) die Potenzmenge {B | B ⊆ Q} bezeichnet). 2.2.2 Definition Ein nichtdeterministischer endlicher Automat ( nondeter” ministic finite automaton“, abgek¨ urzt NFA) M besteht aus • einer endlichen Menge Q; • einem Alphabet Σ; • einem ausgezeichneten Zustand q0 ∈ Q; • einer Menge F ⊆ Q; ¨ • einer Ubergangsfunktion“ δ : Q × Σ → P(Q). ” (Formal schreibt man M = (Q, Σ, q0 , F, δ).) Die Situation, dass q 0 ∈ δ(q, a) ist, ist so zu interpretieren, dass M in den Zustand q 0 u ¨bergehen darf, falls er in Zustand q ist und a liest. Man beachte, dass δ(q, a) leer sein kann (kein Nachfolgezustand), ein Element enthalten kann (Nachfolgezustand eindeutig bestimmt), oder mehr als ein Element enthalten kann (nichtdeterministische Auswahl). Der NFA M = M5RS aus Beispiel 2.2.1 sieht dann folgendermaßen aus: M = (Q, Σ, q0 , F, δ) mit Q = {0, 1, 2, 3, 4, 5}, Σ = {1, 2, 3, 4, 5}, q0 = 0, F = {5}, und δ wie in Tabelle 2.3 angegeben. (Es ist untypisch an diesem Automaten, dass in jeder Situation mindestens ein n¨achster Schritt m¨oglich ist.) Wenn ein NFA M = (Q, Σ, q0 , F, δ) gegeben ist, setzen wir δ wieder auf Q × Σ∗ fort, ˆ Wenn dann q 0 ∈ δ(q, ˆ w) ist, bedeutet dies, definieren also aus δ eine iterierte Version δ. dass der NFA, in Zustand q gestartet, bei der Verarbeitung des Wortes w in den Zustand q 0 gelangen kann. Basierend auf unseren Beobachtungen zu Abb. 2.9 erfassen wir die Menge der beim Lesen von w erreichbaren Zust¨ande. 30
q
a 1
2
3
4
5
0 1 2 3 4 5
{0, 1} {1, 2} {2, 3} {3, 4} {4, 5} {5}
{0, 2} {1, 3} {2, 4} {3, 5} {4} {5}
{0, 3} {1, 4} {2, 5} {3} {4} {5}
{0, 4} {1, 5} {2} {3} {4} {5}
{0, 5} {1} {2} {3} {4} {5}
¨ Tabelle 2.3: Tabellendarstellung der Ubergangsfunktion δ eines NFA 2.2.3 Definition Wir definieren δˆ : Q × Σ∗ → P(Q) durch Induktion u ¨ber die L¨ange von w ∈ Σ, wie folgt. ˆ ε) := q, f¨ δ(q, ur q ∈ Q; [ ˆ ua) := δ(q, δ(q 0 , a), f¨ ur q ∈ Q, u ∈ Σ∗ , a ∈ Σ. ˆ q 0 ∈δ(q,u)
ˆ ε) = {1}, δ(1, ˆ 2) = {1, 3}, δ(1, ˆ (2, 2)) = Im in Abb. 2.3 angegebenen Beispiel ist etwa δ(1, ˆ (2, 2, 1)) = {1, 2} ∪ {3, 4} ∪ {5} = {1, 2, 3, 4, 5}. {1, 3} ∪ {3, 5} = {1, 3, 5}, und δ(1, Wir beobachten, dass ˆ a) = δ(q,
[
δ(q 0 , a) =
[
δ(q 0 , a) = δ(q, a)
q 0 ∈{q}
ˆ q 0 ∈δ(q,ε)
ˆ ohne dass Verwechslungen ist. Wie im Falle der DFA’s schreiben wir also wieder δ statt δ, auftreten k¨onnen. Um die doch recht technische Definition der iterierten δ-Funktion besser verstehen zu k¨onnen, u unscht, zeigt sich, ¨bersetzen wir sie in die Sprache von Berechnungen. Wie gew¨ 0 dass q ∈ δ(q, w) ist genau dann wenn es die M¨oglichkeit gibt, von q startend unter Lesen von w nach q 0 zu gelangen, wobei in jedem Schritt ein nach δ erlaubter Zustands¨ ubergang stattfindet. 2.2.4 Lemma In der Situation von Definition 2.2.3 gilt q 0 ∈ δ(q, b1 · · · bm ) f¨ ur ein Wort w = b1 · · · bm genau dann wenn es eine Folge p0 , . . . , pm in Q gibt derart dass p0 = q, pm = q 0 und pi ∈ δ(pi−1 , bi ) f¨ ur 1 ≤ i ≤ m. Beweis Dies wird durch Induktion u ¨ber die L¨ange m des Eingabewortes w = b1 · · · bm bewiesen. 31
Wenn m = 0, also w = ε ist, dann ist δ(q, w) = {q} und es gibt nur eine Folge p0 , . . . , pm mit der beschriebenen Eigenschaft, n¨amlich die Folge mit dem einen Element q. Sei nun m ≥ 1. Als Induktionsvoraussetzung nehmen wir an, die Aussage sei wahr f¨ ur alle W¨orter u der L¨ange m − 1. Wir betrachten ein Wort w = b1 · · · bm . ⇐“: Wenn es eine Zustandsfolge p0 , . . . , pm in Q gibt derart dass p0 = q, pm = q 0 und ” pi ∈ δ(pi−1 , bi ) f¨ ur 1 ≤ i ≤ m, dann folgt nach I.V., dass pm−1 ∈ δ(q, b1 · · · bm−1 ) gilt. Weil 0 nun q ∈ δ(pm−1 , bm ), gilt nach Definition 2.2.3 auch q 0 ∈ δ(q, b1 · · · bm ). ⇒“: Wenn q 0 ∈ δ(q, b1 · · · bm ), dann heißt dies nach der Definition, dass q 0 ∈ δ(q 00 , bm ) f¨ ur ” einen Zustand q 00 ∈ δ(q, b1 · · · bm−1 ). Nach I.V. gibt es dann eine Folge p0 , . . . , pm−1 in Q mit p0 = q und pm−1 = q 00 , derart dass pi ∈ δ(pi−1 , bi ) f¨ ur 1 ≤ i ≤ m − 1. Wir k¨onnen q 0 einfach an diese Folge anh¨angen.
2.2.5 Definition
Ein NFA M = (Q, Σ, q0 , F, δ) sei gegeben.
(a) F¨ ur w ∈ Σ∗ definiere: M akzeptiert w, falls δ(q0 , w) ∩ F 6= ∅, d. h. wenn man, von q0 startend, bei der Verarbeitung des Wortes w einen akzeptierenden Zustand erreichen kann. (Das ist genau dann der Fall, wenn eine Folge p0 , . . . , pm in Q mit p0 = q0 , pm ∈ F und pi ∈ δ(pi−1 , bi ) f¨ ur 1 ≤ i ≤ m existiert.) (b) LM := {w ∈ Σ∗ | M akzeptiert w}. LM heißt die von M akzeptierte Sprache. Das Modell nichtdeterministischer endlicher Automat“ ist nicht als eine Maschine zu ” ¨ denken, die direkt gem¨aß ihrer Ubergangsfunktion rechnen kann, sondern vielmehr als eine M¨oglichkeit, in kompakter Weise eine Sprache zu spezifizieren. Wie wir gleich sehen werden, kann man aber aus einem NFA M einen in gewisser Weise effizienten deterministischen Algorithmus f¨ ur das Wortproblem von LM gewinnen. Die in Definition 2.2.3 angegebene rekursive Formel f¨ uhrt n¨amlich zu einem iterativen Algorithmus, der bei Eingabe w = b1 · · · bm nacheinander δ(q, b1 · · · bt ) f¨ ur t = 0, 1, . . . , m berechnet und hierf¨ ur ¨ eine einigermaßen m¨aßige Rechenzeit ben¨otigt — solange die Ubergangsfunktion δ als Tabelle gespeichert werden kann. Wenn M ein NFA ist, benutzen wir X |M | := (1 + |δ(q, a)|) q∈Q,a∈Σ
als ein Maß f¨ ur die Gr¨oße von M . Dies entspricht in etwa der Anzahl der Eintr¨age von Zust¨anden in einer tabellarischen Auflistung von δ. 2.2.6 Satz Es gibt einen Algorithmus zur L¨osung des Wortproblems f¨ ur NFA’s“, d.h. ∗ ” f¨ ur das Problem, zu vorgelegtem NFA M und w ∈ Σ zu entscheiden, ob w ∈ LM oder nicht. Die Laufzeit des Algorithmus ist O(|M | · |w|); der Platzbedarf ist O(|Q|).
32
Beweis Wir geben etwas allgemeiner einen Algorithmus an, der die Menge δ(qin , w) berechnet, f¨ ur ein beliebiges gegebenes qin ∈ Q und ein w = b1 · · · bm ∈ Σ∗ . Um das Wortproblem zu entscheiden, berechnet man mit dem Algorithmus δ(q0 , w) und pr¨ uft, ob diese Menge ein Element von F enth¨alt. F¨ ur den Algorithmus setzen wir voraus, dass die Zustandsmenge Q einfach {1, 2, . . . , s} ist. Eine Teilmenge von Q l¨asst sich dann durch einen Bitvektor der L¨ange s darstellen. Wir benutzen zwei solche Bitvektoren, Aalt[1..s] und Aneu[1..s]. Der Bitvektor Aneu[1..s] wird mit Nullen vorbesetzt, nur Aneu[qin ] ist 1. Nun wird f¨ ur i = 1, 2, . . . , m folgendes durchgef¨ uhrt: 1. kopiere Aneu[1..s] nach Aalt[1..s]; 2. setze alle Eintr¨age in Aneu[1..s] auf 0; 3. f¨ ur jedes p mit Aalt[p] = 1 tue folgendes: f¨ ur jedes q ∈ δ(p, bi ) f¨ uhre Aneu[q] ← 1 aus. Die Ausgabe steht in Aneu[1..s]. Es ist mit einem Induktionsbeweis leicht zu sehen, dass der Algorithmus im Schleifendurchlauf f¨ ur bi einen Bitvektor berechnet, der die Menge δ(qin , b1 · · · bi ) darstellt. Wenn ¨ die Ubergangsfunktion in Tabellenform gegeben ist, dann erfordert die Ausf¨ uhrung des Schleifendurchlaufs f¨ ur bi das Lesen und Abarbeiten der gesamten Spalte f¨ ur den Buchstaben a in der Tabelle. Diese Spalte hat L¨ange s, aber jeder Eintrag kann eine umfangreiche Menge darstellen. Den gesamten Zeitaufwand k¨onnen wir aber sicher als O(|M |) absch¨atzen (was den Kosten entspricht, die das Lesen der gesamten δ-Tabelle verursacht). 2.2.7 Bemerkung (Vgl. Bemerkung 2.1.3.) Auch NFA’s lassen sich bequem als Graph GM darstellen. Wieder gibt es f¨ ur jeden Zustand q ∈ Q einen Knoten vq , und von vq nach vq0 verl¨auft eine mit a ∈ Σ markierte Kante genau dann wenn q 0 ∈ δ(q, a). Im Gegensatz zu DFA’s kann es nun sein, dass zu q ∈ Q und a ∈ Σ keine oder eine mit a markierte Kante oder mehrere mit dem Buchstaben a markierte Kanten in vq beginnen: aus v keine Kante mit Markierung a q δ(q,a)= Ο
eine Kante mit a
q
a
drei Kanten mit a
q’
q’ q
δ(q,a)={q’}
a a a
q’’
δ(q,a)={q’,q’’,q’’’}
q’’’
Die Konventionen u ¨ber die Zusammenfassung von Mehrfachkanten sind dieselben wie bei den DFA’s. 33
Fortsetzung von Beispiel 2.2.1: Der NFA f¨ ur LRS 3 hat die in Abb. 2.10 angegebene Graphdarstellung. 1,2,3 Start
0
1,2,3 1
1
1,2,3
1,2,3 1
2
1
3
2
2 3
Abbildung 2.10: Graphdarstellung eines NFA Wir beobachten, dass nunmehr Startknoten vq und Kantenbeschriftung b1 , . . . , bm nicht mehr eindeutig einen Weg in GM festlegen. Unter Umst¨anden gibt es auch gar keinen mit b1 , . . . , bm beschrifteten Weg, der in vq beginnt. Auf jeden Fall gilt f¨ ur q, q 0 ∈ Q, b1 · · · bm ∈ ∗ Σ die folgende Charakterisierung des Akzeptierungsverhaltens eines NFA M . (Dies ist ¨ einfach eine Ubertragung von Definition 2.2.3 und der Charakterisierung der δ-Funktion in Lemma 2.2.4 in die Graphdarstellungs-Sprechweise.) (a) q 0 ∈ δ(q, b1 · · · bm ) genau dann, wenn in GM ein Weg von vq nach vq0 existiert, dessen Kanten mit b1 , . . . , bm beschriftet sind. Und damit, nach Definition 2.2.5(a): (b) M akzeptiert b1 · · · bm genau dann, wenn in GM ein Weg von vq0 zu einem Knoten vq mit q ∈ F existiert, dessen Kanten mit b1 , . . . , bm beschriftet sind. Um ein Gef¨ uhl f¨ ur diese Aussage zu bekommen, suche man im Graphen in Abb. 2.10 Wege f¨ ur Eingaben (2, 2, 2, 2) und (1, 2, 3, 1, 2). Man sieht sofort, dass jeder DFA M = (Q, Σ, q0 , F, δ) einen NFA M 0 = (Q, Σ, q0 , F, δ 0 ) bestimmt, der dasselbe tut“ wie M : definiere einfach δ 0 (q, a) := {δ(q, a)}. Wir sagen: ” Jeder DFA M kann auch als NFA aufgefasst werden“. Wie sieht es mit der umgekehrten ” Richtung aus? Wir stellen im n¨achsten Satz fest, dass im Prinzip NFA’s nicht mehr leisten (also nicht mehr Sprachen akzeptieren) als DFA’s. Dennoch sind NFA’s n¨ utzlich und wichtig: f¨ ur theoretische Untersuchungen wie die Kl¨arung der Beziehung zwischen DFA’s und Grammatiken und regul¨aren Ausdr¨ ucken, die wir sp¨ater kennenlernen werden; zur bequemen Konstruktion von Automaten, wo direkte DFA-Konstruktionen m¨ uhselig w¨aren; schließlich zur kompakten Darstellung von Automaten f¨ ur Sprachen, deren DFA’s zu groß w¨aren (s. Bsp. 2.2.10 unten).
34
2.2.8 Satz
Ist L = LM f¨ ur einen NFA M , so gilt L = LM 0 f¨ ur einen DFA M 0 .
Beweis ( Potenzmengenkonstruktion“) Sei M = (Q, Σ, q0 , F, δ). Nach Definiti” on 2.2.3 kann die Gesamtheit aller Berechnungen von M auf Eingabe w = b1 · · · bm durch eine Folge δ(q0 , ε), δ(q0 , b1 ), δ(q0 , b1 b2 ), . . . , δ(q0 , b1 · · · bi ), . . . , δ(q0 , w) von Teilmengen von Q dargestellt werden. Wir benutzen dementsprechend die Potenzmenge P(Q) als Zustandsmenge f¨ ur M 0 , und definieren: M 0 := (Q0 , Σ, q00 , F 0 , δ 0 ), wo Q0 := P(Q) = {B | B ⊆ Q}; q00 := {q0 }; F 0 := {B ∈ Q0 | B ∩ F 6= ∅}; [ δ 0 (B, a) := δ(q, a), f¨ ur B ∈ Q0 , a ∈ Σ. q∈B
δ 0 (B, a) ist die Menge der Zust¨ande, die M erreichen kann, wenn in einem Zustand q ∈ B der Buchstabe a gelesen wird. Wir m¨ ussen zeigen, dass M 0 dieselben W¨orter akzeptiert wie M . Hierzu stellen wir einen Zusammenhang zwischen den beiden Automaten her: Behauptung: δ 0 ({q}, w) = δ(q, w) f¨ ur alle q ∈ Q, w ∈ Σ∗ . (Dabei ist δ 0 die eben definierte Funktion, geh¨ort also zu M 0 , δ ist wie in 2.2.3, geh¨ort also zu M .) Beweis der Behauptung durch Induktion u ¨ber |w| : w=ε: δ 0 ({q}, ε)
Def. 2.1.5(a)
=
{q}
Def. 2.2.3
=
δ(q, ε).
w = ua f¨ ur u ∈ Σ∗ , a ∈ Σ: δ 0 ({q}, ua)
Def. 2.1.5(a)
=
Def. δ 0
=
I.V.
δ 0 (δ 0 ({q}, u), a) = δ 0 (δ(q, u), a) [ 2.2.3 δ(q 0 , a) = δ(q, ua).
q 0 ∈δ(q,u)
Damit haben wir, f¨ ur alle w ∈ Σ∗ : w ∈ LM
Def. 2.2.5(a)
⇔
Def. q00 ,F 0
⇔
Beh.
δ(q0 , w) ∩ F 6= ∅ ⇔ δ 0 ({q0 }, w) ∩ F 6= ∅ Def.2.1.5(b) δ 0 (q00 , w) ∈ F 0 ⇔ w ∈ LM 0 .
Also ist LM = LM 0 .
35
2.2.9 Beispiel Wir f¨ uhren Beispiel 2.2.1 fort, indem wir einen DFA f¨ ur LRS h angeben. Die Potenzmengenkonstruktion liefert: Q0 Σ q00 F0
:= = := :=
P({0, 1, . . . , h}) {1, . . . , h} {0} {B ⊆ {0, 1, . . . , h} | h ∈ B}
und, f¨ ur B ∈ Q0 , a ∈ Σ : δ 0 (B, a) := B ∪ ({b + a | b ∈ B} ∩ {0, . . . , h}). Als Beispiel w¨ahlen wir h = 3 und geben den resultierenden Automaten graphisch an. Dabei werden Mengen durch Listen ihrer Elemente dargestellt. 1,2,3
Start
Ο
0
1,2,3
3
1
2
2,3
3 2
0,1
1
3
0,2 3
1
0,3 3
1
1
1
2
2
0,1,2,3 0,1,2 1,2,3 1,2
1 0,1,3
0,2,3
1,2 2,3
1,2,3
3
2
3
2 1
1,2,3
1
1,3
2,3
3 1,2,3
2,3
1,2,3
1
Beachte, dass im vorigen Beispiel der Teil des Graphen rechts (die Zust¨ande B mit 0 6∈ B) in keiner Berechnung eine Rolle spielt, da diese Zust¨ande vom Startzustand {0} nicht erreicht werden k¨onnen. (Solche Zust¨ande heißen u ussig“ und k¨onnen weggelassen ¨berfl¨ ” werden, siehe weiter unten.) Man kann bei der Erstellung des Potenzmengenautomaten die Erzeugung u ussiger Zust¨ande vermeiden, indem man mit B0 = {q0 } startet und ¨berfl¨ dann nur solche Zust¨ande generiert, die von einem bisher schon vorliegenden Zustand B S aus durch Lesen eines Buchstabens erreicht werden, also als B 0 = q∈B δ(q, a) darstellbar sind. Man kann dies zum Beispiel als Algorithmus formulieren, der mit einer (anfangs leeren) Warteschlange arbeitet: 36
Setze B0 := {q0 }; (∗ Startzustand von M 0 ∗) setze B := {B0 }. (∗ bisher erzeugte Zust¨ande ∗) F¨ uge B0 in die Warteschlange ein. Solange die Warteschlange nicht leer ist: entnehme ein B aus der Warteschlange; S f¨ ur jedes a ∈ Σ teste ob B 0 = q∈B δ(q, a) in B ist, falls nicht, setze B := B ∪ {B 0 } und f¨ uge B 0 in die Warteschlange ein. Ausgabe: B. ¨ Nebenbei k¨onnen wir die Tabelle f¨ ur die Ubergangsfunktion δ 0 erzeugen. Wie groß wird der von der Potenzmengenkonstruktion erzeugte DFA M 0 ? Grunds¨atzlich gibt es nur die obere Schranke |Q0 | = 2|Q| . L¨asst man u ussige Zust¨ande weg, wird ¨berfl¨ 0 Q u. U. kleiner. Jedoch zeigt es sich, dass in manchen F¨allen der exponentielle Blow-up unvermeidbar ist. 2.2.10 Beispiel Sei n ≥ 1 fest, und sei L = {0, 1}∗ {0}{0, 1}n−1 , die Menge aller Bin¨arstrings der L¨ange mindestens n, die an der n-ten Stelle von rechts eine 0 haben. Ein NFA f¨ ur L mit n + 1 Zust¨anden sieht aus wie folgt: 0,1 Start
0
0
1
0,1
2
0,1...
n-1
0,1
n
Die pure Potenzmengenkonstruktion liefert einen DFA mit 2n+1 Zust¨anden. Von diesen sind 2n nicht erreichbar, n¨amlich die B mit 0 ∈ / B, wie man sich leicht u ¨berlegt. Durch n Weglassen dieser Zust¨ande erhalten wir einen DFA mit 2 Zust¨anden. Andererseits gilt: Behauptung: Jeder DFA M = (Q, Σ, q0 , F, δ) mit L = LM hat mindestens 2n Zust¨ande. Dies sieht man mit folgendem indirekten Beweis ein: Angenommen, |Q| < 2n . Dann existieren zwei verschiedene W¨orter a1 · · · an , b1 · · · bn ∈ {0, 1}n mit δ(q0 , a1 · · · an ) = δ(q0 , b1 · · · bn ). W¨ahle ein i mit ai 6= bi , z. B. ai = 0 und bi = 1. Dann gilt a1 · · · ai · · · an 0i−1 ∈ L und b1 · · · bi · · · bn 0i−1 6∈ L, also δ(q0 , a1 · · · an 0i−1 ) ∈ F und δ(q0 , b1 · · · bn 0i−1 ) 6∈ F. Andererseits ist nach 2.1.6 δ(q0 , a1 · · · an 0i−1 ) = δ(q0 , b1 · · · bn 0i−1 ), ein Widerspruch. Wir betrachten noch zwei weitere Beispiele f¨ ur NFAs und die Potenzmengenkonstruktion. Dabei geht es um das Erkennen von W¨ortern aus einer endlichen Menge. Diese Beispiele sollten im Detail studiert werden, da noch einige Besonderheiten von NFAs zur Sprache kommen. 37
2.2.11 Beispiel Wir betrachten nochmals die Aufgabe, einen endlichen Automaten f¨ ur eine endliche Sprache L bereitzustellen. Diese Aufgabe wurde in Satz 2.1.10(d) schon auf zwei Arten gel¨ost: durch einen Induktionsbeweis und durch direktes Angeben eines DFA, der als Zustandsmenge die Menge der Pr¨afixe der W¨orter in L hatte. Hier geben wir eine weitere M¨oglichkeit an: Wir konstruieren einen NFA f¨ ur L und wandeln diesen mit Hilfe der Potenzmengenkonstruktion in einen DFA um. Angenommen, L = {w1 , . . . , wn } mit s = |w1 | + · · · + |wn |. Unser NFA ML hat einen Startzustand q0 und genau s weitere Zust¨ande. F¨ ur jedes Wort wi gibt es in GML einen Weg, der aus Zustand 1 und |wi | weiteren Zust¨anden besteht. Die |wi | Kanten auf diesem Weg sind mit den Buchstaben von wi beschriftet. Die Endknoten der |L| Wege entsprechen akzeptierenden Zust¨anden. Wenn das leere Wort ε in L ist, entspricht diesem Wort ein Weg der L¨ange 0; in diesem Fall ist der Startzustand 1 akzeptierend. ur die Sprache L = {bei, beine, bube} u Abbildung 2.11 zeigt den NFA ML f¨ ¨ber dem Alphabet Σ = {a, . . . , z}. 2
e
3
i
4
b Start
1
b
5
e
6
i
7
n
8
e
9
b 10
u
11
b
12
e
13
Abbildung 2.11: Ein NFA in Graphdarstellung f¨ ur die Sprache {bei, beine, bube} u ¨ber Σ = {a, . . . , z} Wir haben die Zust¨ande willk¨ urlich durchnummeriert. Der Startzustand ist q0 = 1, die akzeptierenden Zust¨ande sind durch F = {4, 9, 13} gegeben. Ein NFA f¨ ur die Sprache 0 L = L ∪ {ε} w¨ urde genau so aussehen, nur w¨are auch der Zustand 1 akzeptierend. Man beachte, dass man sich keine M¨ uhe geben muss, gemeinsame Pr¨afixe der W¨orter in L zu finden, da es bei einem NFA gestattet ist, dass ein Knoten mehrere ausgehende Kanten mit derselben Beschriftung hat, wie der Knoten 1 im Beispiel, aus dem drei bKanten herausf¨ uhren. Es ist offensichtlich, dass in diesen NFA genau die drei W¨orter aus L hineinpassen“, im Sinn von Bemerkung 2.2.7. Alle W¨orter, die nicht Pr¨afix eines ” Wortes in L sind, f¨ uhren in eine Sackgasse“, d h. es gibt u ¨berhaupt keine Berechnung ” des NFA, der ein solches Wort vollst¨andig liest. ¨ Die Ubergangsfunktion des NFA aus Abb. 2.11 ist in Tabellenform in Tab. 2.4 gegeben.
38
q start → 1 2 3 4 5 6 7 8 9 10 11 12 13
F
∗
∗
∗
b
e
i
n
u
Σ − {b, e, i, n, u}
{2, 5, 10} − − − − − − − − − {12} − −
− {3} − − {6} − − {9} − − − {13} −
− − {4} − − {7} − − − − − − −
− − − − − − {8} − − − − − −
− − − − − − − − − {11} − − −
− − − − − − − − − − − − −
¨ Tabelle 2.4: Tabellendarstellung der Ubergangsfunktion δ eines NFA f¨ ur die Sprache L = {bei, beine, bube}. Statt ∅“ schreiben wir −“; das Verhalten bei Buchstaben, die nicht ” ” in L vorkommen, ist in einer Spalte zusammengefasst Wenn wir die Potenzmengenkonstruktion auf diesen NFA anwenden, wobei wir die Version verwenden, bei der die unerreichbaren Zust¨ande nicht erzeugt werden, erhalten wir den DFA, der in Abb. 2.12 dargestellt ist.
39
{3,6}
i
{4,7}
n
{8}
e
{9}
e Start
{1}
b
{2,5,10}
u {11}
b
{12}
e
{13}
0/
Abbildung 2.12: Der durch Potenzmengenkonstruktion entstehende DFA f¨ ur die Sprache {bei, beine, bube}; gestrichelte Kanten f¨ uhren zum Fehlerzustand ∅; sie sind mit allen Buchstaben beschriftet zu denken, die nicht explizit an anderen Kanten stehen In der Abbildung gibt es einen Fehlerzustand (die leere Menge ∅); um die Abbildung u ¨bersichtlicher zu gestalten, haben die (gestrichelten) Kanten, die zu diesem Zustand f¨ uhren, keine explizite Beschriftung. Dies soll bedeuten, dass alle nicht explizit angegebe¨ nen Uberg¨ ange u uhren. ¨ber diese Kanten in den Fehlerzustand f¨ Oft l¨asst man bei der graphischen Darstellung eines DFA mit einem Fehlerzustand diesen ¨ ganz weg, inklusive aller Uberg¨ ange, die in ihn hineinf¨ uhren. Im Bild w¨ urde das bedeuten, dass alle gestrichelten Kanten weggelassen werden. Nicht nur in diesem Beispiel, sondern immer bei der Anwendung der Potenzmengenkonstruktion auf den NFA ML ergibt sich ein DFA, der strukturell genau dem Pr¨afixautomaten f¨ ur die Sprache L entspricht, siehe Satz 2.1.10(d). (In mathematischer Sprache sagt man, der entstehende DFA sei isomorph“ zum Pr¨afixautomaten f¨ ur L.) Insbesonde” re f¨ uhrt die Potenzmengenkonstruktion hier nicht zu einer Vergr¨oßerung der Anzahl der Zust¨ande.
2.2.12 Beispiel Unser letztes Beispiel sieht auf den ersten Blick dem vorangegangenen Beispiel ¨ahnlich. Wir untersuchen ein Problem, das bei der Verarbeitung von Texten immer wieder vorkommt. Man m¨ochte wissen, ob eine bestimmte Zeichenreihe in einem Text (einem File) vorkommt, und wenn ja, wo. Etwas allgemeiner k¨onnte man bei einer gegebenen Suchwortliste S = (w1 , . . . , wn ) von endlich vielen Strings fragen, ob und wo einer dieser Strings in einem gegebenen File vorkommt. Das File wird dabei als Eingabewort w aufgefasst. (Allgemeinere Suchanfragen sind m¨oglich; wir kommen sp¨ater darauf zur¨ uck.) Wir wollen einen deterministischen endlichen Automaten entwerfen, mit dem wir ein Eingabewort w durchmustern k¨onnen, derart dass man unterwegs immer genau dann in 40
einem akzeptierenden Zustand ist, wenn gerade das Ende eines der W¨orter aus S erreicht worden ist. Wenn wir als Wortliste wieder (bei, beine, bube) verwenden, sollte beispielsweise das Wort obeinbubebeinebeleintabubeibringt zu einer Zustandsfolge f¨ uhren, die sich folgendermaßen zu F verh¨alt: o b e i n b u b e b e i n e b e l e i n t a b u b e i b r i n g t - - - - F - - - - F - - F - F - - - - - - - - - - - F F - - - - - Wir k¨onnen diese Anforderung wie folgt als formale Sprache formulieren, wobei Σ ein passendes Alphabet sein soll. LS := {w ∈ Σ∗ | eines der W¨orter w1 , . . . , wn ist Suffix von w}. Dann ist jeder DFA f¨ ur uns geeignet, der das Wortproblem f¨ ur LS l¨ost. Wir bauen zun¨achst einen NFA MS f¨ ur LS , um diesen dann per Potenzmengenkonstruk¨ tion in einen DFA umzubauen. Kurzes Uberlegen zeigt, dass ein NFA f¨ ur LS einfach aus dem NFA aus Beispiel 2.2.11 f¨ ur die Wortmenge {w1 , . . . , wn } zu erhalten ist, indem wir am Startzustand eine Schleife anbringen, die es erm¨oglicht, beliebige Buchstaben aus Σ zu lesen, ohne diesen Zustand zu verlassen. Wenn wir als Wortliste wieder (bei, beine, bube) und als Alphabet wieder Σ = {a, . . . , z} verwenden, ergibt sich die in Abbildung 2.13 angegebene Modifikation des NFA von eben. 2
a..z Start
e
3
i
4
b 1
b
5
e
6
i
7
n
8
e
9
b 10
u
11
b
12
e
13
Abbildung 2.13: Ein NFA f¨ ur LS mit S = (bei, beine, bube) Wenn wir die Potenzmengenkonstruktion anwenden, nat¨ urlich wieder in der Version, in der keine u ussigen Zust¨ande erzeugt werden, erhalten wir den in Abb. 2.14 angegebenen ¨berfl¨ DFA.
41
b Start
{1}
b
{1,2,5,10}
e
b
b
b {1,3,6} i
{1,4,7}
n
b {1,8}
e
{1,9}
u
b {1,11}
b
b {1,2,5,10,12} e
i {1,3,6,13}
u
Abbildung 2.14: Ein DFA f¨ ur LS mit S = (bei, beine, bube) Wir beobachten (ohne einen allgemeinen Beweis), dass der DFA nicht mehr Zust¨ande hat als der NFA. (In unserem Fall sind es sogar weniger, weil bei Pr¨afix von beine ist.) Wenn wir die erreichten DFA-Zust¨ande (also NFA-Zustandsmengen) nicht nur daraufhin ansehen, ob sie einen F -Zustand enthalten, sondern auch daraufhin, welche genau, k¨onnen wir am nach dem Lesen eines Pr¨afixes w0 von w erreichten Zustand B (des NFA) sogar ablesen, welches Wort (welche W¨orter) aus S am Ende von w0 stehen.
2.3
Regul¨ are Ausdru ¨ cke
Bisher haben wir Sprachen immer nur abstrakt oder durch zugeh¨orige Maschinen beschrieben. Regul¨are Ausdr¨ ucke stellen eine andere Art dar, Sprachen zu spezifizieren. Regul¨are Ausdr¨ ucke formalisieren den folgenden induktiven Ansatz zur Konstruktion immer komplizierterer Sprachen: (i) Starte mit den trivialen Sprachen“ ∅, {ε}, {a}, f¨ ur a ∈ Σ; ” (ii) Wende die Operationen Konkatenation: L1 , L2 → L1 L2 = L1 · L2 = {w1 w2 | w1 ∈ L1 , w2 ∈ L2 } Vereinigung: L1 , L2 → L1 ∪ L2 = {w | w ∈ L1 ∨ w ∈ L2 } 42
Kleene-Abschluss“: L → L∗ = {w1 . . . ws | s ≥ 0, w1 , · · · , ws ∈ L} ” iteriert auf bereits erzeugte Sprachen an. Neben dem reinen Erzeugungsprozess geben regul¨are Ausdr¨ ucke den erzeugten Sprachen auch Namen (wobei jede Sprache unendlich viele Namen hat). F¨ ur das folgende setzen wir voraus, dass die Alphabete {∅, ε}, {(, ), +,∗ } und Σ disjunkt ur allgemeine Informationen zu induktiven Definitionen siehe Anhang A.2. sind.2 F¨ 2.3.1 Definition
Σ sei ein Alphabet.
(a) Die Menge der regul¨aren Ausdr¨ ucke (¨ uber Σ) ist induktiv definiert wie folgt: (i) ∅ und ε sind regul¨are Ausdr¨ ucke. (Hier werden ∅“ und ε“ als Zeichen benutzt.) ” ” F¨ ur jedes a ∈ Σ ist a regul¨arer Ausdruck. (ii) Ist r regul¨arer Ausdruck, so auch (r∗ ). Sind r1 und r2 regul¨are Ausdr¨ ucke, so auch (r1 r2 ) und (r1 + r2 ). (iii) Nur die durch die obigen Regeln erzeugbaren W¨orter sind regul¨are Ausdr¨ ucke. (b) Jedem regul¨aren Ausdruck r ist eine Sprache L(r) ⊆ Σ∗ zugeordnet. Diese ist induktiv definiert wie folgt: (i) L(∅) := ∅; L(ε) := {ε}; L(a) := {a}, f¨ ur a ∈ Σ. (ii) L((r∗ )) := L(r)∗ ; L((r1 r2 )) := L(r1 )L(r2 ); L((r1 + r2 )) := L(r1 ) ∪ L(r2 ). (c) Ist L(r) = L(r0 ), so heißen r und r0 ¨aquivalent (Notation: r ∼ r0 ). Wir werden sehen, dass die Klasse der solcherart erzeugten Sprachen (die durch regul¨are ” Ausdr¨ ucke“ beschriebenen Sprachen) gleich der Klasse der regul¨aren Sprachen, d. h. der von DFA’s akzeptierten Sprachen ist. Historisch war es nat¨ urlich umgekehrt: Die Bezeichnung regul¨are Sprachen“ leitet sich von der Tatsache ab, dass diese Sprachen durch ” regul¨are Ausdr¨ ucke beschrieben werden. Regul¨are Ausdr¨ ucke u uber dem Alphabet {∅, ε, (, ), +,∗ } ∪ Σ); ¨ber Σ sind also W¨orter (¨ jedes dieser W¨orter bezeichnet eine Sprache. Da L(r) = L((r+∅)) = L(((r+∅)+∅)) = . . ., gibt es f¨ ur jede Sprache L(r) unendlich viele Namen, d. h. zu r unendlich viele ¨aquivalente Ausdr¨ ucke. 2
Der Konvention gem¨ aß benutzen wir in regul¨aren Ausdr¨ ucken ∅“ und ε“ als Zeichen. ” ”
43
2.3.2 Beispiel (a) L((01)) = L(0)L(1) = {0}{1} = {01} (b) L(((01)∗ )) = L((01))∗ = {01}∗ = {ε, 01, 0101, 010101, . . .} (c) L((((01)∗ ) + ((10)∗ ))) = L(((01)∗ )) ∪ L(((10∗ )) = {ε, 01, 10, 0101, 1010, . . .} (d) L((((01)∗ )((10)∗ ))) = . . . = {(01)i (10)j | i ≥ 0, j ≥ 0} (e) L((a + · · · + z + A + · · · + Z)(0 + · · · + 9 + a + · · · + z + A + · · · + Z)∗ ) ist die Menge der Pascal-Bezeichner. (Klammern weggelassen, siehe unten.) (f) L(((0 + 1)∗ )) = {0, 1}∗ ; L(((0 + ε)∗ )) = L((0∗ )), also ((0 + ε)∗ ) ∼ (0∗ ). Um die Notation regul¨arer Ausdr¨ ucke zu vereinfachen, legen wir Pr¨aferenzregeln fest: ∗ bindet st¨arker als (das nicht geschriebene Zeichen) · (f¨ ur die Konkatenation) und +; · bindet st¨arker als +; wir notieren, dass + und · assoziativ sind und dass + kommutativ ¨ ist (bis auf Aquivalenz), wenn man die erzeugten Sprachen betrachtet. Dann lassen wir u ussige Klammern weg: ¨berfl¨ (01∗ 001∗ 0 + (1 + 2)0∗ 1∗ )∗ entspricht damit (((((0(1∗ ))((00)(1∗ )))0) + ((1 + 2)((0∗ )(1∗ ))))∗ ) oder auch (((((1 + 2)(0∗ ))(1∗ )) + ((0(1∗ ))((00)((1∗ )0))))∗ ). Weiter benutzen wir manchmal die Abk¨ urzung r+ f¨ ur (r∗ )r. Offenbar gilt (L(r))+ = ∗ ∗ ∗ + L(r) L(r) = L(r )L(r) = L((r )r) = L(r ). Anmerkung: Oft findet man auch die Konvention, dass regul¨are Ausdr¨ ucke r und die von ihnen bezeichnete Sprache L(r) identifiziert werden. Das liest sich dann so: (01)∗ = {ε, 01, 0101, 010101, . . . }, (0 + 1)∗ = {0, 1}∗ , (00 + 111)∗ = {ε, 00, 111, 00111, 11100, . . . }. ¨ Statt des Aquivalenzsymbols benutzt man dann das Gleichheitszeichen: (0 + 1)∗ = ((0 + 1)+1)∗ = (0+(1+1))∗ ; ((0+1)∗ )∗ = (0+1)∗ ; (0+ε)∗ = 0∗ ; usw. Zum Ein¨ uben unterscheiden wir in diesem Text Sprachen und die regul¨aren Ausdr¨ ucke, die sie bezeichnen. ¨ Schließlich notieren wir noch einige Aquivalenzen, die beim Rechnen“ mit regul¨aren ” Ausdr¨ ucken hilfreich sind:
44
∅r ∼ r∅ ∼ ∅; εr ∼ rε ∼ r; r + ∅ ∼ ∅ + r ∼ r; (r + ε)∗ ∼ r∗ ; (r + ε)+ ∼ r∗ ; r + r ∼ r; (r∗ )(r∗ ) ∼ r∗ ; (r∗ )∗ ∼ r∗ . Die Beweise ergeben sich durch Betrachten der entsprechenden Manipulationen mit Sprachen. Weitere Rechenregeln kann man sich selbst herleiten. Wir zeigen im Rest dieses Abschnitts, dass regul¨are Ausdr¨ ucke genau die regul¨aren Sprachen erfassen. 2.3.3 Satz
Ist M ein NFA, so gibt es einen regul¨aren Ausdruck rM mit LM = L(rM ).
Beweis M = (Q, Σ, q0 , F, δ) sei gegeben. O. B. d. A. sei Q = {0, 1, . . . , s − 1}, q0 = 0. (Ist das nicht so, nummeriert man die Elemente von Q beliebig durch und ersetzt q ∈ Q durch seine Nummer.) Wir definieren zun¨achst |Q|2 Sprachen: L(i, j) := {w ∈ Σ∗ | j ∈ δ(i, w)}, f¨ ur 0 ≤ i, j < s. Wir benutzen im folgenden intensiv die Interpretation von M als Graph GM (vgl. Bemerkung 2.2.7). Demnach gilt: L(i, j) besteht aus den W¨ortern b1 · · · bm , die als Kantenbeschriftung an Wegen auftreten, die in Knoten vi beginnen und in Knoten vj enden. Unser Ziel ist es, regul¨are Ausdr¨ ucke rj f¨ ur L(0, j), j ∈ Q, zu finden (d. h. L(rj ) = L(0, j)). Denn dann k¨onnen wir rM := rj1 + · · · + rj|F | S benutzen, wo F = {j1 , . . . , j|F | } ⊆ Q ist, weil LM = {L(0, j) | j ∈ F } ist.
Um diese regul¨aren Ausdr¨ ucke zu finden, benutzen wir einen algorithmischen Ansatz, der als dynamische Programmierung“ bekannt ist. Bei der Definition von L(i, j) werden ” beliebige Wege von i nach j zugelassen. Wir f¨ uhren eine feinere Unterscheidung ein, indem wir die Menge der Knoten einschr¨anken, die auf dem Weg vorkommen d¨ urfen. L(i, j, k) := {b1 · · · bm ∈ Σ∗ | ∃ Weg in GM von vi nach vj mit Kantenbeschriftung b1 , . . . , bm der [außer vi am Anfang und vj am Ende] nur Knoten in {v0 , . . . , vk−1 } benutzt}, f¨ ur 0 ≤ i, j < s und 0 ≤ k ≤ s.
Schema eines Weges in GM , der b1 · · · bm ∈ L(i, j, k) bewirkt: i
b1
b2
b3 ... bm-1
nur Zustände in {0,...,k-1}
45
bm
j
Wir beobachten folgende Eigenschaften der Mengen L(i, j, k), f¨ ur 0 ≤ i, j < s und k = 0 bzw. k = s: (2.1)
i 6= j ⇒ L(i, j, 0) = {a ∈ Σ | j ∈ δ(i, a)} i
= Menge der Buchstaben an Kanten (2.2)
j
L(i, i, 0) = {a ∈ Σ | i ∈ δ(i, a)} ∪ {ε} = {ε} ∪ Menge der Buchstaben an Kanten
(2.3)
i
L(i, j) = L(i, j, s).
Um die regul¨aren Ausdr¨ ucke f¨ ur L(i, j, k) induktiv konstruieren zu k¨onnen, ben¨otigen wir noch eine Beziehung zwischen den Sprachen L(.., .., k) und L(.., .., k + 1). Dazu beobachten wir: Ein Weg von vi nach vj , der unterwegs nur Knoten in {v0 , . . . , vk } benutzt, verl¨auft entweder g¨anzlich in {v0 , . . . , vk−1 } oder setzt sich aus Teilwegen der folgenden Art zusammen: (i) von vi nach vk in {v0 , . . . , vk−1 } ; (ii) von vk nach vk in {v0 , . . . , vk−1 } [0-, 1-, oder mehrmals]; (iii) von vk nach vj in {v0 , . . . , vk−1 }. Schematisch: Weg in {v0 , ..., vk-1} vi
vj
(l+1)-mal, l > 0 vi
vk
vk
vk
vj
Daraus erkennt man: (2.4)
L(i, j, k + 1) = L(i, j, k) ∪ L(i, k, k)L(k, k, k)∗ L(k, j, k), f¨ ur 0 ≤ i, j < s, 0 ≤ k < s.
46
[F¨ ur Puristen geben wir einen exakten Beweis dieser Aussage an. Normalerweise wird man sich mit dem genannten anschaulichen Argument zufriedengeben. Zum Gl¨ uck h¨alt die Graphensprechweise den Beweis noch einigermaßen u bersichtlich. ¨ Beweis von (1.4): ⊆“: Ist w ∈ L(i, j, k + 1), so ist w = b1 · · · bm Kantenbeschriftung ” eines Weges von vi nach vj u ¨ber Zwischenknoten in {v0 , . . . , vk }. Falls auf diesem Weg vk nicht vorkommt, ist w ∈ L(i, j, k). Falls doch, zerlege den Weg in Teile wie oben unter (i), (ii), (iii) aufgef¨ uhrt. Dadurch wird das Wort b1 · · · bm in Teilw¨orter x, y1 , . . . , yl , l ≥ 0, und z zerlegt, wo x die Kantenbeschriftung am Teilweg (i) ist, y1 , . . . , yl die an den Teilwegen von Typ (ii), und z die Kantenbeschriftung am letzten Teilweg (iii). Damit ist x ∈ L(i, k, k), y1 , . . . , yl ∈ L(k, k, k), und z ∈ L(k, j, k), also w = b1 · · · bm = xy1 · · · yl z ∈ L(i, k, k)L(k, k, k)∗ L(k, j, k). ⊇“: Es ist klar, dass L(i, j, k) ⊆ L(i, j, k + 1) gilt. Liegt ” ein Wort w ∈ L(i, k, k)L(k, k, k)∗ L(k, j, k) vor, so kann man w = xy1 · · · yl z schreiben f¨ ur ein l ≥ 0, x ∈ L(i, k, k), y1 , . . . , yl ∈ L(k, k, k), z ∈ L(k, j, k). Diesen W¨ortern entsprechen Wege von vi nach vk bzw. vk nach vk bzw. vk nach vj , die nur Zwischenknoten in {v0 , . . . , vk−1 } benutzen. H¨angen wir diese l + 2 Wege hintereinander, erhalten wir einen Weg von vi nach vj mit Zwischenknoten in {v0 , . . . , vk }, der w als Kantenbeschriftung hat; also ist w ∈ L(i, j, k + 1). Damit ist (1.4) bewiesen.] Mit Hilfe der Aussagen (1.1), (1.2), (1.4) konstruieren wir (durch Induktion u ¨ber k) regul¨are Ausdr¨ ucke ri,j,k f¨ ur L(i, j, k), 0 ≤ i, j < s, 0 ≤ k ≤ s. (1.1’) ri,j,0 := a1 + · · · + as + ∅, wo L(i, j, 0) = {a1 , · · · , as } ⊆ Σ, i 6= j. (1.2’) ri,i,0 := a1 + · · · + as + ε, wo L(i, i, 0) = {a1 , . . . , as } ∪ {ε}. ∗ (1.4’) ri,j,k+1 := ri,j,k + ri,k,k (rk,k,k )rk,j,k , f¨ ur 0 ≤ i, j < s, 0 ≤ k < s.
Aus der Konstruktion und (1.1), (1.2), (1.4) folgt sofort (technisch: per Induktion u ¨ber k), dass L(i, j, k) = L(ri,j,k ), f¨ ur 0 ≤ i, j < s, 0 ≤ k ≤ s. Schließlich setzen wir rj := r0,j,s , f¨ ur 0 ≤ j < s; es ist dann klar (mit (1.3)), dass L(0, j) = L(0, j, s) = L(r0,j,s ) = L(rj ). Damit kann die Konstruktion von rM beendet werden, wie ganz am Anfang des Beweises angegeben. Der Beweis liefert auch eine konstruktive Methode, um rM zu erzeugen. Ungl¨ ucklicherweise werden selbst f¨ ur kleine Automaten die entstehenden Ausdr¨ ucke schnell unhandlich. Man achte daher auf Vereinfachungsm¨oglichkeiten (Ersetzen von Teilausdr¨ ucken durch ¨aquivalente einfachere). Weiter kann es Arbeit sparen, wenn man nicht alle ri,j,k konstruiert, sondern nur die, die man zur Konstruktion von r0,j,s , j ∈ F , wirklich braucht. Man kann beweisen, dass es eine Familie (Mn )n≥2 von DFA’s gibt, wo Mn = (Qn , Σn , . . . ) mit |Qn | = n, |Σn | = n2 , und wo der kleinste regul¨are Ausdruck rn f¨ ur LMn mindestens 47
2n−1 Symbole hat (vgl. I. Wegener, Theoretische Informatik – eine algorithmenorientierte Einf¨ uhrung, Teubner, 1999, S. 133f.). Das bedeutet, dass im allgemeinen ein Explodieren der Gr¨oße des entstehenden regul¨aren Ausdrucks unvermeidlich ist. 2.3.4 Beispiel
Wir wollen einen regul¨aren Ausdruck f¨ ur den NFA 0 1 Start
1
0
1
¨ konstruieren. Zur Ubung erzeugen wir alle ri,j,k . k=0: r0,0,0 = 0 + ε;
r0,1,0 = 1; r1,0,0 = ∅;
r1,1,0 = 1 + ε;
k = 1: ∗ r0,0,1 = r0,0,0 + r0,0,0 (r0,0,0 )r0,0,0 = (0 + ε) + (0 + ε)(0 + ε)∗ (0 + ε) ∼ 0∗ ; ∗ r0,1,1 = r0,1,0 + r0,0,0 (r0,0,0 )r0,1,0 = 1 + (0 + ε)(0 + ε)∗ 1 ∼ 0∗ 1; ∗ )r0,0,0 = ∅ + ∅(0 + ε)∗ (0 + ε) ∼ ∅; r1,0,1 = r1,0,0 + r1,0,0 (r0,0,0 ∗ )r0,1,0 = (1 + ε) + ∅(0 + ε)∗ 1 ∼ (1 + ε). r1,1,1 = r1,1,0 + r1,0,0 (r0,0,0
k=2: ∗ r0,0,2 = r0,0,1 + r0,1,1 (r1,1,1 )r1,0,1 = 0∗ + 0∗ 1(1 + ε)∗ ∅ ∼ 0∗ ; ∗ r0,1,2 = r0,1,1 + r0,1,1 (r1,1,1 )r1,1,1 = 0∗ 1 + 0∗ 1(1 + ε)∗ (1 + ε) ∼ 0∗ 1+ ;
r1,0,2 = ∅; ∗ r1,1,2 = r1,1,1 + r1,1,1 (r1,1,1 )r1,1,1 = (1 + ε) + (1 + ε)(1 + ε)∗ (1 + ε) ∼ 1∗ .
Gesamt: rM = r0,0,2 + r0,1,2 = 0∗ + 0∗ 1+ ∼ 0∗ 1∗ . Wir m¨ ussen jetzt noch die andere Richtung unserer urspr¨ unglichen Behauptung beweisen: Zu jedem regul¨aren Ausdruck r gibt es einen NFA (und damit auch einen DFA), der L(r) akzeptiert. Ein solcher Automat ist sogar algorithmisch erzeugbar. Diese Richtung ist auch die f¨ ur Anwendungen interessante: Man spezifiziert eine Sprache durch einen regul¨aren Ausdruck (das ist oft bequem); der dazugeh¨orige DFA oder NFA wird vom Rechner erzeugt. Zum Beispiel gehen Substring-Suchalgorithmen, die in Editoren benutzt werden, in dieser Weise vor. Wir beschreiben im folgenden grob einen Algorithmus, der dies leistet. ¨ Als technisches Hilfsmittel definieren wir noch NFA’s mit ε-Uberg¨ angen“, ein Konzept, ” das auch praktisch wichtig ist. Man erlaubt dem NFA, gewisse Zustands¨ uberg¨ange auch ohne Lesen eines Symbols auszuf¨ uhren. ¨ 2.3.5 Definition Ein NFA mit ε-Uberg¨ angen (kurz: ε-NFA) ist ein 5-Tupel M = / Σ, aber (Q, Σ, q0 , F, δ), wo Q, Σ, q0 , F wie bei NFA’s sind (vgl. 2.2.2), mit ε ∈ δ : Q × (Σ ∪ {ε}) → P(Q). 48
Interpretation: Ist q 0 ∈ δ(q, ε), so kann M , ohne ein Zeichen zu lesen, von Zustand q in Zustand q 0 gelangen. Die formale Definition der iterierten Funktion δˆ : Q × Σ∗ → P(Q) ist hier etwas m¨ uhsam; wir gehen daher den leichteren und anschaulicheren Weg u ¨ber die graphische Darstellung GM von M (vgl. Bemerkung 2.2.7). Zus¨atzlich zu den Elementen, die GM f¨ ur einen NFA M hatte, sind bei ε-NFA’s jetzt auch Kanten q
ε
q’
gestattet. Eine solche Kante ist vorhanden genau dann wenn q 0 ∈ δ(q, ε).
49
Beispiel: 1 1
ε Start
ε
0
3 .
ε
ε
2
3
2
Abbildung 2.15: Ein ε-NFA f¨ ur L(1∗ 3∗ + 2∗ 3∗ ) 2.3.6 Definition
Sei M ein ε-NFA.
(a) F¨ ur q ∈ Q, w = b1 · · · bm ∈ Σ∗ definieren wir ˆ w) := {p ∈ Q | ∃ Weg in GM von vq nach vp , δ(q, dessen Kantenmarkierungen, von ε’s abgesehen, gleich b1 , . . . , bm sind }. ˆ ε) ⊇ {q} und δ(q, ˆ a) ⊇ δ(q, a), aber nicht notwendig Gleichheit! Achtung: Es gilt δ(q, ˆ x) ∩ F 6= ∅. (b) M akzeptiert x :⇔ δ(q, (c) LM := {x ∈ Σ∗ | M akzeptiert x}. Im obigen Beispiel haben wir etwa den folgenden akzeptierenden Weg f¨ ur das Wort w = 1113: Start
0
ε
1 1
1
1
1
1
1
ε
3
3
3
Abbildung 2.16: Akzeptierende Rechnung f¨ ur 1113 ∈ LM Es gibt keinen Pfad von v0 nach v3 mit Kantenbeschriftung ε · · · ε3ε · · · ε1ε · · · ε, also ist 31 6∈ LM . Wir stellen zun¨achst fest, dass ε-NFA’s nicht mehr Sprachen akzeptieren als NFA’s und DFA’s. ur einen NFA M 0 (also 2.3.7 Satz Gilt L = LM f¨ ur einen ε-NFA M , so ist L = LM 0 f¨ ist L regul¨ar ). 50
Beweis Sei M = (Q, Σ, q0 , F, δ). Die einfache Idee der Konstruktion von M 0 ist es, ε-Wege kurzzuschließen“. Wo in GM ein Weg von vq nach vp f¨ uhrt, der mit ε, . . . , ε, a ” beschriftet ist (a ∈ Σ), soll in GM 0 eine direkte, mit a beschriftete Kante von vq nach vp f¨ uhren. Man muss dann noch sicherstellen, dass Knoten vq , von denen aus man auf einem reinen ε-Weg zu einem Knoten vp , p ∈ F , gelangt, selbst akzeptierend werden. Also: M 0 = (Q, Σ, q0 , F 0 , δ 0 ), mit δ 0 (q, a) := {p ∈ Q | ∃ Weg in GM von vq nach vp , der mit ε, . . . , ε, a markiert ist }, f¨ ur q ∈ Q, a ∈ Σ, und F 0 := {q ∈ Q | ∃p ∈ F : ∃ Weg (der L¨ange ≥ 0) in GM von vq nach vp , der mit ε, . . . , ε markiert ist }. Zu zeigen ist: F¨ ur a1 · · · an ∈ Σ∗ gilt: M akzeptiert a1 · · · an ⇔ M 0 akzeptiert a1 · · · an . ⇒“: Falls M das Wort a1 · · · an akzeptiert, gibt es einen Weg in GM von v0 zu einem vq ” mit q ∈ F , dessen Kanten mit ε, . . . , ε, a1 , ε, . . . , ε, a2 , . . . , ε, . . ., ε, an , ε, . . . , ε beschriftet sind. Es seien vq1 , . . . , vqn die Knoten auf dem Weg, in die die mit a1 , . . . , an beschrifteten Kanten dieses Weges m¨ unden. Dann sind, nach Definition von δ 0 , die Kanten (vqi−1 , vqi ) in GM 0 mit ai beschriftet, 1 ≤ i ≤ n, und qn ∈ F 0 . Also gibt es in GM 0 einen Weg von vq0 zu vq0 mit q 0 ∈ F 0 , dessen Kanten mit a1 , . . . , an beschriftet sind, d. h. M 0 akzeptiert a1 · · · an . ⇐“: Falls M 0 das Wort a1 · · · an akzeptiert, gibt es einen Weg vq0 , vq1 , . . . , vqn in GM 0 mit ” qn ∈ F 0 , so dass die Kante (vqi−1 , vqi ) mit ai beschriftet ist, 1 ≤ i ≤ n. Nach Definition von M 0 gibt es in GM Wege von vqi−1 nach vqi , die mit ε, . . . , ε, ai beschriftet sind, 1 ≤ i ≤ n, und einen Weg von vqn zu vq mit q ∈ F , der mit ε, . . . , ε beschriftet ist. Man verkettet diese n + 1 Wege, um einen zu erhalten, der von vq0 nach vq verl¨auft, und abgesehen von ε’s, mit a1 , . . . , an beschriftet ist. Also akzeptiert M das Wort a1 · · · an . Wenden wir die im Beweis angegebene Konstruktion auf das Beispiel von oben an, erhalten wir folgenden NFA. 1 1 3
1 Start
3
0
3
.
3 2
3
2 2
51
2.3.8 Satz Sei Σ ein Alphabet. Ist r ein regul¨arer Ausdruck u ¨ber Σ, so existiert ein ε-NFA Mr mit L(r) = LMr . (Nach 2.3.7 und 2.2.6 ist also L(r) regul¨ar.) Beweis Wir zeigen durch Induktion u ¨ber den Aufbau von r die folgende Aussage: Es gibt einen ε-NFA Mr = (Q, Σ, q0 , {qf }, δ), mit q0 6= qf . mit L(r) = LMr . (Mr hat also genau einen akzeptierenden Zustand, der zudem vom Startzustand verschieden ist.) Die Automaten werden dabei durchweg in der Graphdarstellung angegeben. (Man beachte, dass ¨ahnliche Konstruktionen auch ohne die Einschr¨ankung q0 ∈ / F und |F | = 1 m¨oglich sind; dadurch vermindert sich u. U. die Gr¨oße des entstehenden Automaten.) Die folgenden Skizzen zeigen den Aufbau der Automaten M∅ , Mε , Ma und die induktive Technik, mit der man aus Mr1 und Mr2 ε-NFA’s M(r1 +r2 ) , M(r1 r2 ) und M(r1∗ ) aufbaut. Dabei stellt ein Rechteck M:
Start
q
GM
q’
immer den Graphen eines ε-NFA M mit Startzustand q0 = q und akzeptierendem Zustand qf = q 0 dar. .
MO : Start
0
1
Abbildung 2.17: r = ∅ : GM∅ hat keine Kante!
Mε : Start
ε
0
1
Abbildung 2.18: r = ε : GMε hat eine ε-Kante.
52
Ma : a
Start
Abbildung 2.19: r = a : GMa hat eine a-Kante.
Abbildung 2.20: r = r1 r2 : Aus Mr1 , Mr2 baue Mr wie folgt: M r1r2 : M r1 Start
M r2 GMr
ε 1
53
GMr
2
Abbildung 2.21: r = r1 + r2 : Aus Mr1 , Mr2 baue Mr wie folgt: Mr1 + r2 :
M r1 GMr
1
ε
ε Start
M r2 ε
ε GMr
2
Abbildung 2.22: r = r1∗ : Aus Mr1 baue Mr wie folgt: M (r *):
ε
1
M r1
Start
ε
GMr
ε 1
ε
Um die Behauptung zu beweisen, m¨ usste man f¨ ur jeden der Konstruktionsschritte nachweisen, dass der zusammengesetzte Automat tats¨achlich zu der Sprache L(r1 r2 ), L(r1 +r2 ), L(r1∗ ) geh¨ort, vorausgesetzt, dies stimmt schon f¨ ur L(r1 ) und Mr1 bzw. L(r2 ) und Mr2 . Die¨ ser formale Beweis sei dem Leser/der Leserin als Ubung empfohlen. Als Vorbild benutze man den Beweis der Formel (1.4) in Satz 2.3.3. 2.3.9 Bemerkung Die Konstruktion von ε-NFA’s (und damit NFA’s, s. Satz 2.3.7) aus regul¨aren Ausdr¨ ucken ist wesentlich gutartiger als die umgekehrte Konstruktion. Man zeigt leicht durch (starke) Induktion u ¨ber l ≥ 1: Besteht r aus l Symbolen aus {ε} ∪ {a | 54
a ∈ Σ} ∪ {∅} ∪ {+, ·, ∗ }, so hat GMr h¨ochstens 2l Knoten und h¨ochstens 4l Kanten. Wenn man die Datenstrukturen geschickt w¨ahlt, und Syntaxanalysetechniken aus sp¨ateren Kapiteln benutzt, ist eine Konstruktion von GMr aus r in Zeit O(l) m¨oglich, da in jedem Konstruktionsschritt nur eine fixe Menge von Kanten neu zu ziehen ist. 2.3.10 Beispiel Wendet man die Konstruktion aus 2.3.8 auf den regul¨aren Ausdruck ∗ ∗ ∗ 0 1 + 11 0 an, ergibt sich folgender ε-NFA:
ε
ε
ε 0
1
ε ε
Start ε
ε
ε
ε
ε 1
ε
ε 1
ε
ε
0
ε
ε ε
e
ε
Obgleich dieser Automat im anschaulichen Sinn u ¨bertriebenen Aufwand hat, ist seine ∗ Knotenzahl nicht gr¨oßer als 2 · # (Symbole in 0 · 1∗ + 1 · 1∗ · 0) = 2 · 12 = 24. Wir fassen die beiden letzten S¨atze zusammen: 2.3.11 Satz Eine Sprache L ⊆ Σ∗ ist regul¨ar genau dann, wenn L = L(r) f¨ ur einen regul¨aren Ausdruck r u ¨ber Σ. 2.3.12 Korollar Die Klasse der regul¨aren Sprachen ist unter der ∗-Operation (KleeneAbschluss) und unter Konkatenation abgeschlossen. Beweis Wenn L, L1 , L2 regul¨are Sprachen sind, dann kann man nach Satz 2.3.3 regul¨are Ausdr¨ ucke r, r1 und r2 mit L = L(r), L1 = L(r1 ) und L2 = L(r2 ) angeben. Wir bilden die regul¨aren Ausdr¨ ucke r∗ und r1 r2 . Dann sind nach Satz 2.3.7 L∗ = L(r∗ ) und L1 L2 = L(r1 r2 ) ebenfalls regul¨ar. ¨ Es ist eine interessante Ubung, das letzte Korollar ohne Benutzung von regul¨aren Ausdr¨ ucken zu beweisen. (Man kann direkt mit NFA’s arbeiten.)
2.4
Das Pumping-Lemma fu are Sprachen ¨ r regul¨
Dieser Abschnitt behandelt eine Struktur-Eigenschaft“, die jede regul¨are Sprache besitzt ” (Satz 2.4.1). Diese wird meistens dazu benutzt, um nachzuweisen, dass gewisse Sprachen nicht regul¨ar sind. 55
2.4.1 Satz
(Pumping-Lemma fu are Sprachen) ¨ r regul¨ Ist L regul¨ar, so gibt es eine Zahl n ≥ 1, f¨ ur die folgendes gilt: Ist x ∈ L, |x| ≥ n, so kann man x = uvw schreiben f¨ ur u, v, w ∈ Σ∗ , derart dass |uv| ≤ n, |v| ≥ 1, und uv i w ∈ L f¨ ur alle i ≥ 0. ( Aufpumpen“ heißt aus x = uvw die W¨orter uv 2 w = uvvw, uv 3 w = uvvvw, . . . bilden; ” abpumpen“ heißt uv 0 w = uw bilden.) ” Beweis Es sei L eine regul¨are Sprache. Dann ist L = LM f¨ ur einen NFA M = (Q, Σ, q0 , F , δ). Die Zahl n ist einfach die Zahl |Q| der Zust¨ande von M . Betrachte nun x = a1 · · · am ∈ L, m ≥ n. Es gibt eine akzeptierende Berechnung von M f¨ ur x, die einem Weg Px von vq0 nach vq , q ∈ F , in GM entspricht, dessen Kanten mit a1 , . . . , am markiert sind: Start
p0
a1
p1
a2
p2
a3
p3 a 4 ... a n
pn
... a m
pm
(p0= q 0)
Da |Q| = n, k¨onnen die Zust¨ande p0 , p1 , . . . , pn nicht alle verschieden sein, also gibt es k, l ∈ {0, . . . , n} mit k < l, so dass pk = pl . Wir setzen u := a1 · · · ak ; v := ak+1 · · · al ; w := al+1 · · · am . Offenbar ist x = uvw, |uv| = l ≤ n, |v| = l − k ≥ 1. Es bleibt nur die Pump-Eigenschaft“ nachzukontrollieren. Wir ” zerschneiden den Weg Px in drei Teile: Pu von vq0 nach vpk , Kantenmarkierungen a1 , . . . , ak ; Pv von vpk nach vpl = vpk , Kantenmarkierungen ak+1 , . . . , al ; Pw von vpl = vpk nach vpm , Kantenmarkierungen al+1 , . . . , am . Sind P , P 0 zwei Wege, wo Endpunkt p und Anfangspunkt p0 u ¨bereinstimmen, so bezeichnet P P 0 die Konkatenation der beiden. Wir haben: Pu Pw ist Weg von vq0 nach vpm mit Kantenmarkierung uw; Pu Pv Pv Pw ist Weg von vq0 nach vpm mit Kantenmarkierung uv 2 w; allgemein: f¨ ur i ≥ 0 ist Pu Pv · · · Pv Pw Weg von vq0 nach vpm mit Kantenmarkierung uv i w. | {z } i-mal Weil pm ∈ F , erhalten wir uv i w ∈ L f¨ ur i ≥ 0. Als Beispiel betrachten wir den folgenden Automaten M , der die Sprache LM = {x ∈ {0, 1}∗ | |x|0 , |x|1 sind gerade} akzeptiert.
56
1 Start
0 0
1
1 0
0 1
3
0 2
1
Der Weg in GM , der der Eingabe x = 000101 ∈ LM entspricht, sieht so aus: // Start
0
0
3
0
0
0
1
3
2
0
1
1
0
//
Unter den ersten 5 Zust¨anden der Folge kommt ein Zustand, z. B. der Zustand 3, zweifach vor. Die akzeptierenden Wege in GM Start
0
Start
0
0
0
3
3
1
0
2
0
0
0
1
3
1
0
0
0
0
3
1
2
0
1
1
die durch Entfernen bzw. Wiederholen des Teilwegs zwischen dem 2. und 4. Knoten entstehen, belegen, dass 0101 = 0(00)0 101 und 00000101 = 0(00)2 101 in L sind. Genauso lassen sich l¨angere solche Wege mit Kantenmarkierungen 0(00)i 101 f¨ ur i ≥ 3 erzeugen. Wir benutzen das Pumping-Lemma ausschließlich, um zu zeigen, dass gewisse Sprachen nicht regul¨ar sind. Daf¨ ur verwenden wir folgendes Schema mit f¨ unf Schritten. L sei die Sprache, deren Nichtregularit¨at bewiesen werden soll. [1] (W¨ortlich) Beweis indirekt. Annahme: L ist regul¨ar. [2] (W¨ortlich) Dann gibt es ein n ≥ 1 mit den im Pumping-Lemma 2.4.1 behaupteten Eigenschaften. [3] (Problemspezifisch) W¨ahle nun x ∈ L, mit |x| gen¨ ugend groß (mindestens |x| ≥ n) — so dass Schritt 5 ausf¨ uhrbar ist. 57
0
[4] (W¨ortlich) Gem¨aß Pumping-Lemma kann man x = uvw mit |uv| ≤ n und |v| ≥ 1 schreiben, so dass X = {uw, uvw, uv 2 w, . . .} ⊆ L. [5] (Problemspezifisch) W¨ahle ein passendes Element y aus X aus und zeige direkt, dass y nicht in L sein kann. (Manchmal ist dies uw, manchmal auch uv i w f¨ ur ein i ≥ 2.) Dies ist der gew¨ unschte Widerspruch. Wir demonstrieren die Verwendung des Schemas an einigen Beispielen. 2.4.2 Behauptung
Die folgenden Sprachen sind nicht regul¨ar.
m m
(a) L1 = {0 1 | m ∈ N}. 2
(b) L2 = {0m | m ∈ N}. (c) L3 = {0m 10l 10m+l | m, l ∈ N}. (d) L4 = {0p | p ist Primzahl}. (e) L5 = {w | w ∈ {(, )}∗ ist korrekter Klammerausdruck}. Beweis (a) [1] Beweis indirekt. Annahme: L1 ist regul¨ar. [2] Dann existiert ein n ≥ 1 mit den im Pumping-Lemma behaupteten Eigenschaften. [3] Wir w¨ahlen x = 0n 1n . Offenbar ist x ∈ L und |x| ≥ n. [4] Gem¨aß Pumping-Lemma kann x = uvw geschrieben werden mit |uv| ≤ n und |v| ≥ 1 derart dass uv i w ∈ L f¨ ur alle i ≥ 0. [5] Weil |uv| ≤ n, besteht uv nur aus Nullen. Also ist uv 0 w = 0n−|v| 1n . Dieses Wort ist nicht in L1 , weil |v| ≥ 1 ist. Andererseits m¨ usste nach dem Pumping0 Lemma uv w ∈ L1 sein. Das ist der gew¨ unschte Widerspruch. (Genauso k¨onnte man verwenden, dass uv 2 w = 0n+|v| 1n ∈ / L1 ist.) Wenn man das Schema einmal verstanden hat, muss man es nicht mehr ganz detailliert abschreiben, wie in den folgenden Beweisen. (b) Annahme, L2 w¨are regul¨ar. Dann g¨abe es n ≥ 1 wie im Pumping-Lemma. W¨ahle 2 x = 0n . Offenbar ist x ∈ L2 , |x| ≥ n. Gem¨aß Pumping-Lemma kann man x = uvw schreiben, mit |uv| ≤ n, |v| ≥ 1, so dass ∀i ∈ N : uv i w ∈ L2 . Nun ist aber z. B. 2 uv 2 w = 0n +|v| 6∈ L2 , weil n2 + |v| ≤ n(n + 1) < (n + 1)2 . Dies ist ein Widerspruch. (c) Annahme, L3 w¨are regul¨ar. Dann g¨abe es n ≥ 1 wie im Pumping-Lemma. W¨ahle x = 0n 110n . Offenbar ist x ∈ L3 , |x| ≥ n. Gem¨aß Pumping-Lemma kann man x = uvw schreiben, mit |uv| ≤ n, |v| ≥ 1, so dass ∀i ∈ N : uv i w ∈ L3 . Weil |uv| ≤ n, erstreckt sich uv nur u ¨ber einen Teil der ersten n Nullen in x; also ist z. B. uv 0 w = 0n−|v| 110n 6∈ L3 , ein Widerspruch. 58
(d) Annahme, L4 w¨are regul¨ar. Dann g¨abe es n ≥ 1 wie im Pumping-Lemma. W¨ahle x = 0p f¨ ur eine Primzahl p ≥ n + 2. Offenbar ist x ∈ L4 und |x| ≥ n + 2. Gem¨aß Pumping-Lemma kann man x = uvw schreiben mit |uv| ≤ n, |v| ≥ 1, und uv i w ∈ L4 f¨ ur alle i ≥ 0. Offenbar ist dann |w| ≥ 2. Betrachte uv |u|+|w| w = 0|u|+|u||v|+|w||v|+|w| = |u|+|w| (|u|+|w|)(|v|+1) w = (|u| + 0 . Es ist |u| + |w| ≥ 2 und |v| + 1 ≥ 2, also ist uv |w|)(|v| + 1) keine Primzahl, ein Widerspruch. (e) F¨ ur L5 benutzt man x = (n )n und argumentiert sonst wie in Teil (a).
Es gibt nichtregul¨are Sprachen, deren Nichtregularit¨at sich nicht mit dem PumpingLemma beweisen l¨asst. Zum Beispiel hat die Sprache 2 L = z ∈ {0, 1}∗ | z = 1k f¨ ur ein k ≥ 0 oder z = 0j 1k f¨ ur j ≥ 1 und k ≥ 0
diese Eigenschaft. (Vgl. Buch von Wegener, S. 102, Bsp. 4.3.3.) Wir geben noch eine allgemeinere Version an, die f¨ ur manche solche F¨alle doch noch eine Handhabe liefert. Die Verwendung dieses Lemmas folgt demselben Schema wie oben formuliert. 2.4.3 Satz (Verallgemeinertes Pumping-Lemma fu are Sprachen) Ist ¨ r regul¨ L regul¨ar, so gibt es eine Zahl n ≥ 1, f¨ ur die folgendes gilt: Ist x ∈ L, und ist x = y0 y1 · · · yn yn+1 f¨ ur y0 , . . . , yn+1 ∈ Σ∗ , wo |y1 | , . . . , |yn | ≥ 1, so gibt es Zahlen 0 ≤ k < l ≤ n derart dass f¨ ur u := y0 · · · yk , v := yk+1 · · · yl , w := yl+1 · · · yn+1 gilt: uv i w ∈ L f¨ ur alle i ≥ 0. Beweis Analog zum Beweis von 2.4.1.
2.5
Abschlusseigenschaften fu are Sprachen ¨ r regul¨
Dieses kurze Kapitel behandelt Operationen, die aus regul¨aren Sprachen wieder regul¨are Sprachen erzeugen. Wir fassen zusammen, was wir schon wissen. 2.5.1 Satz Lreg , die Klasse der regul¨aren Sprachen, enth¨alt alle endlichen Sprachen und ist abgeschlossen unter Durchschnitt, Vereinigung, Komplementbildung, Konkatenation und Kleene-Abschluss. Beweis F¨ ur Abgeschlossenheit unter Konkatenation (sind L1 , L2 regul¨ar, so auch L1 L2 ) und Kleene-Abschluss (ist L regul¨ar, so auch L∗ ), siehe 2.3.7. Die anderen Eigenschaften wurden in 2.1.10 bewiesen.
59
Mitunter ist es g¨ unstig, regul¨are Sprachen hierarchisch zu definieren. Ein primitives Beispiel ist folgendes: Die Sprache aller Bezeichner kann man erhalten, indem man die Sprache L1 = L(B(B + Z)∗ ) u ¨ber dem Alphabet {B, Z} betrachtet, und dann in W¨orter dieser Sprache f¨ ur jedes vorkommende B einen beliebigen Buchstaben und f¨ ur jedes vorkommende Z eine beliebige Ziffer einsetzt. Wir formalisieren und verallgemeinern diese Konstruktion. 2.5.2 Definition Sei Σ = {a1 , . . . , an } und sei ∆ ein Alphabet. Eine Substitution ist eine Funktion f : Σ → P(∆∗ ), d. h. f (ai ) ist eine Sprache u ur 1 ≤ i ≤ n. ¨ber ∆, f¨ F¨ ur w = b1 · · · bm ∈ Σ∗ setzen wir f (w) := und f¨ ur L ⊆ Σ∗ setzen wir
, f (b1 )f (b2 ) · · · f (bm ) | {z } Konkatenation von Sprachen
f (L) :=
[
{f (w) | w ∈ L}.
(Im obigen Beispiel w¨are Σ = {B, Z}, ∆ = {a, . . . , z, A, . . . , Z, 0, . . . , 9} und f (B) = {a, . . . , z, A, . . . , Z} (eine Sprache!) und f (Z) = {0, . . . , 9}.) 2.5.3 Satz ( Lreg ist abgeschlossen unter Substitution“) Sei f Substitution wie in ” 2.5.2. Sind f (a1 ), . . . , f (an ) regul¨are Sprachen und ist L regul¨ar, so ist auch f (L) regul¨ar. ur a ∈ Σ, Beweisidee: Betrachte DFA M mit L = LM und ε-NFA’s Ma mit LMa = f (a), f¨ und die entsprechenden graphischen Darstellungen dieser Automaten. Dabei nehmen wir an, dass die ε-NFA’s Ma das Format wie in 2.3.8 haben: ein Anfangszustand und ein davon verschiedener akzeptierender Zustand. Ersetze nun in GM jede Kante (q, q 0 ) mit Markierung a ∈ Σ q
a
q’
durch eine Kopie von Ma , wobei eine ε-Kante von vq zum Startzustand von GMa f¨ uhrt und eine ε-Kante von dem akzeptierenden Zustand von GMa zu vq0 . Schematisch: Ma
q
ε
GM
a
60
ε
q’
Der resultierende Graph stellt einen ε-NFA M 0 dar. Man muss sich nur noch u ¨berlegen, 0 dass ein Wort w von M akzeptiert wird genau dann wenn man w = w1 · · · wr schreiben kann, wo wj ∈ f (aj ), 1 ≤ i ≤ r, und a1 · · · ar von M akzeptiert wird. Hierf¨ ur greift man uck. wieder auf die Argumentationsweise von Satz 2.3.3, Formel (1.4), zur¨
2.5.4 Definition Ist f eine Substitution (siehe 2.5.2) mit |f (a)| = 1 f¨ ur alle a ∈ Σ, so heißt f Homomorphismus. (Man schreibt dann f (a) = u anstatt f (a) = {u}.) Ist L eine Sprache, f Homomorphismus, so ist nat¨ urlich f (L) = {f (b1 ) · · · f (bm ) | b1 · · · bm ∈ L}. Ist 0 ∗ weiter L ⊆ ∆ , so kann man das Urbild f −1 (L0 ) = {w ∈ Σ∗ | f (w) ∈ L0 } betrachten ( inverser Homomorphismus“). ” 2.5.5 Satz ( Lreg ist abgeschlossen unter Homomorphismen und inversen Ho” momorphismen“) Sei f : Σ → ∆∗ ein Homomorphismus. Dann gilt: (a) Ist L ⊆ Σ∗ regul¨ar, so ist auch f (L) regul¨ar. (b) Ist L0 ⊆ ∆∗ regul¨ar, so ist auch f −1 (L0 ) regul¨ar. Beweis (a) ist Spezialfall von 2.5.3. F¨ ur (b) betrachte einen DFA M 0 = (Q0 , ∆, q00 , F 0 , δ 0 ) mit L0 = LM 0 . Wir definieren einen DFA M = (Q, Σ, q0 , F, δ) wie folgt: Q := Q0 , q0 := q00 , F := F 0 , und δ(q, a) := δ 0 (q, f (a)) , f¨ ur jedes q ∈ Q, a ∈ Σ. Man zeigt jetzt durch Induktion u ur a1 · · · an ∈ Σ∗ gilt: ¨ber n, dass f¨ δ(q0 , a1 · · · an ) = δ 0 (q0 , f (a1 ) · · · f (an )). Also: a1 · · · an ∈ LM ⇔ δ(q0 , a1 · · · an ) ∈ F ⇔ δ 0 (q0 , f (a1 ) · · · f (an )) ∈ F 0 ⇔ f (a1 ) · · · f (an ) ∈ L0 . Also ist LM = f −1 (L0 ).
61
Man kann Teil (a) dieses Satzes benutzen, um die Nichtregularit¨at von komplizierten Sprachen (wie z. B. die syntaktisch korrekten Pascal-Programme) auf die prototypischer Sprachen (wie die Sprache der korrekt geklammerten (-)-Ausdr¨ ucke) zur¨ uckzuf¨ uhren, indem man einen Homomorphismus benutzt, der alle uninteressanten Buchstaben auf ε abbildet. Eine weitere ganz einfache Operation ist die Spiegelung von W¨ortern und Sprachen. 2.5.6 Definition
Σ sei ein Alphabet.
(a) Zu w = a1 · · · an ∈ Σ∗ , n ≥ 0, sei wR := an · · · a1 . (b) Zu L ⊆ Σ∗ sei LR := {wR | w ∈ L}. (Beispiel: Ist L = {an bn cn | n ≥ 0}, so ist LR = {cn bn an | n ≥ 0}. Ist L regul¨ar, so ist auch LR regul¨ar.
2.5.7 Satz
Beweis Wir skizzieren eine von mehreren Beweism¨oglichkeiten. Sei L ⊆ Σ∗ regul¨ar. Sei M = (Q, Σ, q0 , F, δ) ein NFA mit L = LM . Betrachte GM . Wir f¨ ugen einen neuen Knoten vqf hinzu, mit Kanten von vq nach vqf f¨ ur alle q ∈ F , die alle mit ε markiert werden. Der einzige akzeptierende Knoten im neuen Graphen GM 0 wird vqf . Offenbar ist M 0 ein ε-NFA mit L = LM 0 , derart dass M genau einen akzeptierenden Zustand hat, der zudem von q0 verschieden ist. Aus GM 0 bilde GM 00 durch Umdrehen aller Kanten (ohne Ver¨anderung der Markierung); vq0 wird akzeptierend, vqf wird Startknoten. Es ist klar, dass LM 00 = LR M, da in GM 0 genau dann ein Weg von vq0 nach vqf existiert, der mit a1 , a2 , . . . , an markiert ist, wenn in GM 00 ein Weg von vqf nach vq0 existiert, der mit an , an−1 , . . . , a1 markiert ist. Beispiel: GM :
0,1
0 0
LM = L (0+ (0 + 1)∗ + 1)
Start
1 1
GM’ :
0,1
0 0 Start
LM 0 = LM
ε 1
1
ε
62
GM" : 0
0,1 0
∗ + LM 00 = LR M = L (1 + (0 + 1) 0 )
ε 1
1
Start ε
(Alternativ kann man durch Induktion u ucke beweisen, ¨ber die Definition regul¨arer Ausdr¨ R R R dass zu jedem regul¨aren Ausdruck r ein r existiert mit L(r) = L(r ). Die Details m¨oge ¨ man sich als Ubung u ¨berlegen.)
2.6
Entscheidbarkeitsfragen fu are Sprachen ¨ r regul¨
Hier fragen wir nach Verfahren, die anhand einer endlichen Sprachbeschreibung entscheiden, ob die entsprechende Sprache eine gewisse Eigenschaft hat oder nicht. Dabei bieten die regul¨aren Sprachen im Bezug auf Entscheidbarkeitsfragen eine heile Welt“ an. Ins” besondere sind die folgenden Probleme f¨ ur regul¨are Sprachen entscheidbar: (a) Ist L = ∅? (b) Ist |L| < ∞? (c) Ist L = Σ∗ ? (d) Ist L1 ⊆ L2 ? (e) Ist L1 = L2 ? Nat¨ urlich muss man vorher sagen, in welcher Form die regul¨aren Sprachen gegeben sind. (Sprachen sind i. a. unendlich, also als Eingaben f¨ ur Algorithmen ungeeignet.) Wir werden dabei annehmen, dass die regul¨aren Sprachen durch entsprechende DFA’s bzw. NFA’s gegeben sind. Hat man eine andere Beschreibungsweise (regul¨arer Ausdruck, ε-NFA, rechtslineare Grammatik [s. Kap. 2]), so muss man aus dieser erst mit Hilfe der besprochenen Algorithmen einen DFA erzeugen. Beachte, dass dabei u. U. ein Effizienzverlust eintritt, weil die Anwendung der Potenzmengenkonstruktion auf NFA’s zu exponentiell gr¨oßeren DFA’s f¨ uhren kann. 2.6.1 Satz Es gibt effiziente (d. h. Polynomialzeit-)Algorithmen, die folgende Probleme l¨osen: Zu einem vorgelegtem Automaten M = (Q, Σ, q0 , F , δ) entscheide, ob (f¨ ur NFA M ), (a) LM = ∅ (b) |LM | < ∞ (f¨ ur NFA M ), (c) LM = Σ∗ (f¨ ur DFA M ). Zu DFA’s M1 und M2 entscheide ob (d) LM1 ⊆ LM2 , (e) LM1 = LM2 . 63
Beweis Wir formulieren die Algorithmen alle in der graphentheoretischen Sprache, stellen uns also vor, dass ein Automat M als Graph GM gegeben ist. Beachte, dass die Tabelle (das |Q|×|Σ|-Array mit Eintr¨agen aus f (Q) (f¨ ur NFA’s) bzw. aus Q (f¨ ur DFA’s)) f¨ ur δ im wesentlichen in seinen Zeilen die Adjazenzlisten f¨ ur GM enth¨alt, einschließlich der Kantenmarkierungen. Es ist fair, als Eingabegr¨oße f¨ ur diesen Graphen |δ| := |Q|+Σq∈Q,a∈Σ |δ(q, a)| anzusetzen, das ist die Summe aus Knoten- und Kantenzahl in GM . (a) Offenbar ist LM 6= ∅ genau dann, wenn es in GM u ¨berhaupt einen Weg von vq0 zu einem vq mit q ∈ F gibt (ohne auf die Kantenmarkierungen zu achten). Dies l¨asst sich z. B. durch Breitensuche in GM feststellen. Der Zeitbedarf hierf¨ ur ist O(|δ|). (b) Wir u ¨berlegen zun¨achst, dass |LM | = ∞ ist genau dann, wenn es in GM einen Weg von vq0 zu einem vq mit q ∈ F gibt, der einen Kreis enth¨alt. [ ⇒: Ist |LM | = ∞, so ” existiert x ∈ LM mit |x| ≥ |Q|. Die Existenz eines akzeptierenden Weges, der einen Knoten zweimal benutzt, also einen Kreis enth¨alt, folgt wie in 2.4.1. ⇐“: Gibt es einen ” Weg von vq0 zu vq , q ∈ F, mit einem Kreis, so besitzt nach dem Argument von 2.4.1 L eine unendliche Teilmenge der Form {uv i w | i ∈ N}, mit |v| ≥ 1 also ist L unendlich.] Algorithmus 1. Konstruiere die Umkehrung von GM : ← GM := {vq | q ∈ Q}, {(vq , vq0 ) | (vq0 , vq ) Kante in GM } . ←
2. Mittels Breitensuche in GM , startend von {vq | q ∈ F }, ermittle die Menge ←
V 0 = {vq0 | ∃ Weg in GM von vq nach vq0 f¨ ur ein q ∈ F } ( = {vq0 | ∃ Weg in GM von vq0 nach vq f¨ ur ein q ∈ F } ). 3. Bilde G0 := Einschr¨ankung von GM auf V 0 . Falls Vq0 6∈ V 0 , stoppe mit der Antwort endlich“. ” 0 4. Tiefensuche in G “, vom Knoten vq0 startend, mit dem Test, ob es jemals R¨ uckw¨artskanten zu aktiven“ Knoten gibt, erlaubt es festzustellen, ob von vq0 aus ein gerichte” ter Kreis in G0 erreichbar ist. Falls dies so ist, wird ∞“ ausgegeben, sonst endlich“. ” ” Schritte 1 und 2 konstruieren die Menge V 0 aller Knoten, von denen aus man nach einem Knoten vq , q ∈ F , gelangen kann. Die anderen Knoten k¨onnen nat¨ urlich f¨ ur das Akzeptieren von W¨ortern keine Rolle spielen; man kann sie weglassen. Dies liefert G0 . Die ¨ eingangs bewiesene Aquivalenz zeigt, dass tats¨achlich LM unendlich ist genau dann wenn von vq0 aus ein gerichteter Kreis in GM 0 erreichbar ist. Also ist der Algorithmus korrekt. ←
Die Laufzeit ist durch den Aufwand f¨ ur die Tiefensuche in GM bzw. GM 0 beschr¨ankt; dies ist immer O(|δ|) = O(Gr¨oße von GM ). (F¨ ur Details zur Tiefensuche siehe das Buch von Cormen/Leiserson/Rivest, S. 447ff., insbesondere Lemma 23.10, oder die Vorlesung Algorithmen und Datenstrukturen“.) ” 64
(c) Da M ein DFA ist, gen¨ ugt es zu testen, ob es einen Weg von vq0 zu einem vq mit q 6∈ F gibt. Dies macht man ¨ahnlich wie in Teil (a) beschrieben. (d) Zu M1 , M2 bilde M20 mit LM20 = LM2 . Wie in 2.1.10(c) bilde M 0 mit LM 0 = LM1 ∩LM20 = LM1 ∩ LM2 = LM1 − LM2 . Teste (mit dem Verfahren aus (a)) ob LM 0 = ∅. (Die Laufzeit dieses Algorithmus ist linear in der Gr¨oße von GM 0 , das ist O(|Q1 |·|Q2 |·|Σ|).) (e) Teste, wie in (d), ob LM1 ⊆ LM2 und LM2 ⊆ LM1 .
2.7
Die Minimierung deterministischer endlicher Automaten
In diesem Abschnitt kehren wir zu den DFA’s zur¨ uck. Wir suchen effizienteste“ DFA’s zu ” einer vorgegebenen regul¨aren Sprache L. Was soll das sein? Schließlich macht jeder DFA auf einem Eingabewort der L¨ange n genau n Schritte. Ein vern¨ unftiges Komplexit¨atsmaß f¨ ur einen DFA M ist aber seine Gr¨oße“, also die Zahl |Q| der Zust¨ande. Wir suchen also ” nach DFA’s mit m¨oglichst wenigen Zust¨anden f¨ ur eine gegebene Sprache.
2.7.1
Unerreichbare Zust¨ ande
Betrachte den NFA M = (Q, Σ, q0 , F, δ), der in Abb. 2.23 dargestellt ist. 1
a, b
b
a Start
0
3
b a 2
Abbildung 2.23: Ein NFA f¨ ur L((a + b)∗ (ab + ba)) Der NFA M hat vier Zust¨ande. Die zugeh¨orige Sprache umfasst alle W¨orter u ¨ber {a, b}, die mit ab“ oder ba“ enden. Wenn wir auf M die Potenzmengenkonstruktion (Satz 2.2.8) ” ” anwenden, erhalten wir einen DFA M 0 = (Q0 , Σ, q00 , F 0 , δ 0 ) mit 16 Zust¨anden. Ein Teil von M 0 ist in Abb. 2.24 dargestellt. Bei der Darstellung der Elemente von Q0 im Bild lassen wir die Mengenklammern weg, schreiben also z. B. 013 f¨ ur {0, 1, 3}.
65
a 01
023
b b
a Start
b
a
0
03
0123
012
b
b
b
a b
a
a
a a
02
013
b Weitere unerreichbare Zustände (Kanten weggelassen):
0/
1
2
3
12
13
23
123
Abbildung 2.24: Ein DFA, erhalten mit der Potenzmengenkonstruktion (Teil) Wegen der mit a, b beschrifteten Schleife an Zustand q0 = 0 in M gilt f¨ ur jeden vom 0 0 Startzustand q0 = {0} in M aus erreichbaren Zustand B, dass 0 ∈ B ist. Die acht Zust¨ande, die 0 nicht enthalten (in Abb. 2.24 in der letzten Reihe aufgelistet), spielen also f¨ ur kein Eingabewort eine Rolle. Es gibt aber auch Zust¨ande B von M 0 , die 0 enthalten und trotzdem unerreichbar sind, n¨amlich die Zust¨ande {0, 3}, {0, 1, 2} und {0, 1, 2, 3}. Man vergleiche auch nochmals Beispiel 2.2.9 und das dortige Bild. Dort sind genau die Zust¨ande B ∈ Q0 mit 0 ∈ / B nicht von q0 aus erreichbar. Der Zustand {1, 2, 3} in dem dortigen DFA ist ein Beispiel daf¨ ur, dass auch solche Zust¨ande unerreichbar sein k¨onnen, in die Kanten hineinf¨ uhren. 2.7.1 Definition Sei M = (Q, Σ, q0 , F, δ) ein DFA. Ein Zustand q ∈ Q heißt unerreichbar (manchmal auch: u ur alle w ∈ Σ∗ (d. h.(!) ¨berflu ¨ssig ), wenn δ(q0 , w) 6= q f¨ wenn es in GM keinen Weg von vq0 nach vq gibt). Ein Zustand q ∈ Q heißt erreichbar, wenn δ(q0 , w) = q f¨ ur ein w ∈ Σ∗ . Wieso k¨onnen u ¨berhaupt unerreichbare Zust¨ande auftreten? Von Hand“ konstruierte ” DFA’s werden nat¨ urlich keine solchen Zust¨ande enthalten. Oft werden aber DFA’s von Algorithmen oder Programmen erzeugt, die dann durchaus unerreichbare Zust¨ande enthalten k¨onnen. Nicht nur bei der Potenzmengenkonstruktion, sondern auch bei der Kreuzproduktkonstruktion (Satz 2.1.10(c)) kann dies auftreten. (Man u ¨berlege sich zum Beispiel, dass das Kreuzprodukt eines DFA M mit sich selbst unerreichbare Zust¨ande hat, wenn M nicht v¨ollig trivial ist.) 66
Wir beschreiben nun einen Algorithmus, der zu einem DFA M = (Q, Σ, q0 , F, δ) die Menge U der unerreichbaren Zust¨ande identifiziert. Es ist ziemlich nat¨ urlich, dass man daf¨ ur die Menge der erreichbaren Zust¨ande ermittelt; die unerreichbaren Zust¨ande sind dann der Rest. Alternativ kann man einfach in GM Breitensuche von vq0 aus durchf¨ uhren; dabei werden genau die erreichbaren Zust¨ande entdeckt. Die Idee ist ganz einfach. Man markiert q0 — dieser Zustand ist sicher erreichbar. In einer Warteschlange oder Halde H werden die noch zu bearbeitenden Zust¨ande gemerkt. Anfangs enth¨alt H nur q0 . Eine Runde besteht darin, einen Zustand p aus H zu entnehmen und alle ≤ |Q| Zust¨ande r, die in einem Schritt von p aus erreichbar sind, zu testen, ob sie schon markiert sind. Ist r markiert, passiert nichts; ist r nicht markiert, markieren wir r und f¨ ugen r zu H hinzu. Wenn man den Markierungsalgorithmus programmieren will, muss er etwas pr¨aziser formuliert sein, etwa wie hier: 2.7.2 Algorithmus var H: subset of Q T: subset of Q
( ERREICHBAR“) ” (Halde oder Warteschlange: die markierten, noch nicht bearbeiteten Zust¨ande) (die als erreichbar markierten Zust¨ande)
begin T := H := {q0 } ; while H6= ∅ do entnehme (beliebiges) p aus H ; for all a ∈ Σ do r := δ(p, a) ; if r 6∈ T then bearbeite p“ ” T := T ∪{r} ; H := H ∪{r} ; return T ; end. Die Ausgabe ist die am Ende in T gespeicherte Menge, die wir T ∗ nennen. Man sieht sofort, dass jeder Zustand h¨ochstens einmal (markiert und) in H eingef¨ ugt wird. Infolgedessen gibt es h¨ochstens |Q| Durchl¨aufe durch die while-Schleife, und der Algorithmus terminiert. Die Laufzeit von Algorithmus 2.7.2 ist O(|Q| · |Σ|), wenn man geeignete Datenstrukturen benutzt. 2.7.3 Satz Wenn Algorithmus 2.7.2 auf einen DFA M = (Q, Σ, q0 , F, δ) angewendet wird, so gilt: T ∗ = {q ∈ Q | q erreichbar } .
67
Beweis: ⊆“: Wenn Zustand q markiert wird, dann ist q erreichbar.“ — Formal beweist man das ” ” durch Induktion u ¨ber Runden, d. h. die Durchl¨aufe der while-Schleife. I.A.: Runde 0 ist die Initialisierung, in der q0 markiert wird. q0 ist erreichbar. Induktionsschritt: Betrachte die Runde, in der p bearbeitet wird. Da p in H ist, wurde es vorher irgendwann eingef¨ ugt und gleichzeitig markiert. Nach I.V. ist p erreichbar, d. h. es gibt ein Wort w mit δ(q0 , w) = p. Wenn nun in dieser Runde r neu markiert wird, kommt man in GM in einem Schritt von p nach r, d. h. es gibt einen Buchstaben a mit δ(p, a) = r. Dann hat man δ(q0 , wa) = r, also ist r erreichbar. Das ist die Induktionsbehauptung. ⊇“: Es sei δ(q0 , w) = q f¨ ur ein Wort w. Wir zeigen, dass q irgendwann einmal markiert ” wird. Dies beweist man indirekt. Annahme: Es gibt ein Wort w, so dass q = δ(q0 , w) nie markiert wird. Wir w¨ahlen ein solches w mit minimaler L¨ange |w|. Es ist unm¨oglich, dass w = ε ist, denn q0 = δ(q0 , ε) ist markiert. Also kann man w = ua schreiben, f¨ ur ein Wort u und einen Buchstaben a. Das Wort u ist k¨ urzer als w, also wird p = δ(q0 , u) irgendwann markiert und daher irgendwann einmal in H aufgenommen. Nach dem Algorithmus wird in einer sp¨ateren Runde p aus H entnommen und bearbeitet. Dann stellt sich aber heraus, dass q = δ(q0 , w) = δ(p, a) nicht markiert ist, und q wird markiert. Dies ist der gew¨ unschte Widerspruch. Wenn wir diesen Algorithmus auf den DFA M 0 aus Abb. 2.24 anwenden, ergeben sich die folgenden Runden. Wir benutzen wieder die abk¨ urzenden Schreibweisen f¨ ur die Zust¨ande von M 0 . Runde Zustand neu in T H 0 − 0 {0} 1 0 01, 02 {01, 02} 2 01 023 {02, 023} 3 02 013 {023, 013} 4 023 − {013} 5 013 − ∅
Die Menge der erreichbaren Zust¨ande ergibt sich als {0, 01, 02, 023, 013}, unerreichbar sind die anderen 11 Zust¨ande von M 0 . ¨ Uberfl¨ ussige Zust¨ande kann man weglassen, ohne die zu einem DFA geh¨orende Sprache zu ver¨andern. Dies wird im Folgenden genau begr¨ undet. 2.7.4 Bemerkung
Zu einem DFA M = (Q, Σ, q0 , F, δ) definieren wir Me = (Qe , Σ, q0 , Fe , δe )
68
durch: Qe := {q ∈ Q | q erreichbar }, Fe := Qe ∩ F, δe := δ Qe × Σ , (Einschr¨ankung von δ auf Qe × Σ) . Wir lassen also aus GM alle unerreichbaren Knoten weg, sowie die Kanten, die in solche Knoten hineinf¨ uhren oder aus solchen Knoten herausf¨ uhren. Wir behaupten nun: Me ist DFA ohne unerreichbare Zust¨ande, und LM = LMe . Beweis: Nach Definition entspricht Qe genau der Menge der Knoten in GM , die von vq0 aus auf einem Weg in GM erreichbar sind. Damit haben GM und GMe genau dieselben von vq0 aus startenden Wege, mit denselben Kantenmarkierungen. Die akzeptierenden Zust¨ande sind ebenfalls identisch. Daraus folgt LM = LMe . Weiterhin sind alle in GM von vq0 aus erreichbaren Knoten auch in GMe erreichbar, also hat GMe keine unerreichbaren Zust¨ande. Beispielsweise ergibt sich aus dem DFA M 0 aus Abb. 2.24 durch Weglassen der unerreichbaren Zust¨ande der in Abb. 2.25 angegebene DFA, in dem alle Zust¨ande erreichbar sind. a 01
023
b b
a Start
a
0 b
b
a a
02
013
b
Abbildung 2.25: Ein DFA ohne unerreichbare Zust¨ande
2.7.2
¨ Aquivalente und nicht-¨ aquivalente Zust¨ ande
Dass ein DFA keine unerreichbaren Zust¨ande enth¨alt, heißt noch nicht, dass er schon die minimale Zahl von Zust¨anden f¨ ur die akzeptierte Sprache hat.
69
2.7.5 Beispiel Sei M = ({0,1,2,3,4}, {a, b}, 0, {1,2}, δ) durch den in Abb. 2.26 dargestellten Graphen gegeben. a 1 a Start
a b 3 b
0
b
b
b 2
4 a
a
Abbildung 2.26: Ein DFA mit ¨aquivalenten Zust¨anden ¨ (Zur Ubung m¨oge man sich u ¨berlegen, welche Sprache LM zu diesem DFA geh¨ort.) Wir beobachten, durch Inspektion, dass die Zust¨ande 1 und 2 praktisch dasselbe tun“: ” Wenn wir in 1 starten und eine Buchstabenfolge w = b1 · · · bm lesen, so bringt uns jedes gelesene a in den Zustand 1, und jedes b, das einem a folgt, in Zustand 3. Das erste Paar aufeinanderfolgender b’s f¨ uhrt uns in Zustand 0. Wenn wir in 2 starten, spielt sich genau dasselbe ab, nur u ¨bernimmt 4 die Rolle von 3 und 2 die Rolle von 1. Obendrein sind 1 und 2 akzeptierend und 3 und 4 verwerfend. Man sieht, dass M beim Lesen eines Wortes w keinen Unterschied zwischen Start in Zustand 1 und Start in Zustand 2 feststellen kann, solange wir nur fragen, ob wir in einem akzeptierenden oder verwerfenden Zustand sind. Technisch ausgedr¨ uckt: F¨ ur jedes w ∈ {a, b}∗ gilt: δ(1, w) ∈ F ⇔ δ(2, w) ∈ F . Man kann nun auf den Zustand 2 verzichten und alle Kanten, die auf v2 zeigen, auf v1 umh¨angen“, ” ohne die Menge der akzeptierten W¨orter zu ver¨andern: a a 1 a ,b Start
0
a
b
1
3
a ,b
b a
b
Start
0
a
b
3 b
4
Abbildung 2.27: DFA aus Abb. 2.26 nach Entfernen des (zu 1 ¨aquivalenten) Zustandes 2 und nach Streichen des unerreichbaren Zustandes 4 Nun ist Zustand 4 unerreichbar geworden, und mit 2.7.4 erhalten wir durch Weglassen dieses Zustandes einen Automaten mit drei Zust¨anden f¨ ur LM (der sich nicht weiter verkleinern l¨asst). 70
¨ Aquivalenz“ von Zust¨anden liefert also einen Ansatz zur Verkleinerung von DFA’s. Wir ” entwickeln nun zun¨achst eine Methode, um f¨ ur jedes Zustandspaar festzustellen, ob sie ¨ a¨quivalent“ sind oder nicht. Zun¨achst m¨ ussen wir genau formulieren, was wir unter Aqui” valenz von Zust¨anden verstehen wollen. ¨ Erinnerung: Aquivalenzrelationen und Partitionen. (Siehe Vorlesung Logik und Zahlen“.) ” Sei X eine nichtleere Menge. Eine zweistellige Relation ∼ ⊆ X × X (wir schreiben x ∼ y ¨ f¨ ur (x, y) ∈ ∼) heißt eine Aquivalenzrelation, wenn gilt: (i) Reflexivit¨ at: ∀x ∈ X : x ∼ x. (ii) Symmetrie: ∀x, y ∈ X : x ∼ y ⇒ y ∼ x. (iii) Transitivit¨ at: ∀x, y, z ∈ X : x ∼ y ∧ y ∼ z ⇒ x ∼ z. ¨ ¨ Ist ∼ eine Aquivalenzrelation, so wird dadurch X in Aquivalenzklassen“ XSi , i ∈ I ” 3 zerlegt. Das heißt: Die Mengen Xi , i ∈ I, sind paarweise disjunkt und X = i∈I Xi . (Man sagt: Xi , i ∈ I, bilden eine Partition ( Aufteilung“) von X.) Und weiter: x ∼ y ” gilt genau dann wenn es ein i mit x, y ∈ Xi gibt. ¨ F¨ ur die Aquivalenzklasse von x schreibt man [x] oder [x]∼ . Es gilt: x ∼ y ⇔ [x] = [y] und x 6∼ y ⇒ [x] ∩ [y] = ∅. Beispiel : X = {0, 1, 2, 3, 4, 5, 6, 7, 8, 10}. Mit x ∼ y :⇔ 3 teilt (x − y)
ergeben sich die folgenden Klassen:
[0] = [3] = [6] = [9] = {0, 3, 6, 9}, [1] = [4] = [7] = [10] = {1, 4, 7, 10}, [2] = [5] = [8] = {2, 5, 8}. ¨ Man lernt in der Mathematik, dass eine Aquivalenzrelation auf X gleichbedeutend mit ¨ ¨ einer Partition von X ist: Ist eine Aquivalenzrelation ∼ vorgegeben, bilden die Aquivalenzklassen eine Partition von X. Ist eine Partition {Xi | i ∈ I} von X gegeben, erh¨alt ¨ man eine Aquivalenzrelation durch die Festsetzung: x ∼ y falls x, y ∈ Xi f¨ ur ein i ∈ I. ¨ (Normalerweise ist eine Einteilung in disjunkte Klassen leichter vorzustellen; Aquivalenzrelationen lassen sich beweistechnisch leichter handhaben.) 2.7.6 Definition Sei M = (Q, Σ, q0 , F, δ) ein DFA. F¨ ur p, q ∈ Q definiere: p ∼ q wenn ∗ f¨ ur alle w ∈ Σ gilt: δ(p, w) ∈ F ⇔ δ(q, w) ∈ F . (Intuitiv gesprochen: Zust¨ande p und q sind a¨quivalent, wenn M mit seinen Mitteln, n¨amlich δ auf W¨orter anzuwenden und Zust¨ande darauf zu testen, ob sie in F oder F liegen, p und q nicht unterscheiden kann.) 3
I ist eine passende Indexmenge.
71
Im DFA aus Abb. 2.26 sind die Zust¨ande 1 und 2 ¨aquivalent, wie oben diskutiert. Die Zust¨ande 0 und 2 sind nicht ¨aquivalent, weil δ(0, ε) = 0 ∈ / F , aber δ(2, ε) = 2 ∈ F . Weiterhin sind 0 und 4 nicht a¨quivalent, weil δ(0, b) = 2 ∈ F , aber δ(4, b) = 0 ∈ / F . Man suche weitere nicht¨aquivalente Paare! 2.7.7 Lemma
¨ auf Q. Die in 2.7.6 definierte Relation ∼ ist eine Aquivalenzrelation
Beweis Dass ∼ reflexiv, symmetrisch und transitiv ist, ergibt sich sofort aus den entsprechenden Eigenschaften von ⇔“. ” Nun stellt sich die Frage, wie wir feststellen k¨onnen, ob zwei Zust¨ande p und q ¨aquivalent sind. Wenn man versucht, direkt Definition 2.7.6 zu benutzen, bemerkt man die Schwierigkeit, in endlicher Zeit die Bedingung ∀w ∈ Σ∗ : δ(p, w) ∈ F ⇔ δ(q, w) ∈ F zu testen, die von unendlich vielen w’s spricht. ¨ Wir l¨osen dieses Problem, indem wir zur komplement¨aren Relation, der Nicht-Aquivalenz u ¨bergehen. Wann sind p und q nicht ¨aquivalent? Wir notieren eine Basis-Bedingung: (∗) Wenn p ∈ F und q ∈ F oder q ∈ F und p ∈ F , dann sind p und q nicht ¨aquivalent. (Beweis: Das Wort ε erf¨ ullt δ(p, ε) ∈ F ∧ δ(q, ε) ∈ / F bzw. δ(q, ε) ∈ F ∧ δ(p, ε) ∈ / F, was der Definition von ∼ widerspricht.) ¨ Weiterhin notieren wir eine Schlussregel, die es erlaubt, Nicht-Aquivalenz von einem Paar 0 0 p, q auf ein anderes Paar p , q zu u ¨bertragen. (∗∗) Wenn p 6∼ q und δ(q 0 , a) = q und δ(p0 , a) = p f¨ ur ein a ∈ Σ, dann sind p0 und q 0 auch nicht ¨aquivalent. (Beweis: Wenn p 6∼ q, dann heißt das nach Definition 2.7.6, dass es ein Wort w ∈ Σ∗ gibt derart dass einer der Zust¨ande δ(p, w), δ(q, w) in F liegt, der andere nicht. Nun gilt δ(p0 , aw) = δ(p, w) und δ(q 0 , aw) = δ(q, w) ; also liegt einer der Zust¨ande δ(p0 , aw), δ(q 0 , aw) in F , der andere nicht. Nach Definition 2.7.6 bedeutet das aber gerade, dass p0 und q 0 nicht ¨aquivalent sind.) Aus Regeln (i) und (ii) erhalten wir einen Markierungsalgorithmus zum Ermitteln von Paaren nicht-¨aquivalenter Zust¨ande. Zu Beginn markieren wir Paare p, q, wenn p ∈ F und q ∈ / F oder umgekehrt. Nachher pr¨ ufen wir f¨ ur unmarkierte Paare p0 , q 0 , ob es ein 72
a ∈ Σ gibt derart dass q = δ(q 0 , a) und p = δ(p0 , a) ein markiertes Paar bilden. In diesem Fall wird auch p0 , q 0 markiert. Dieser Schritt wird so lange iteriert, bis er nicht mehr durchf¨ uhrbar ist. Etwas formaler gefasst ergibt sich folgendes Verfahren.4
¨ NICHT-AQUIVALENZ“ ” Input: DFA M = (Q, Σ, q0 , F, δ)
2.7.8 Algorithmus
var H: subset of [Q]2 N: subset of [Q]2
(Halde oder Warteschlange: die markierten, noch nicht bearbeiteten Zustandspaare) (die als nicht-¨aquivalent markierten Zustandspaare)
begin N := H := {{p, q} | p ∈ F, q ∈ / F} ; while H6= ∅ do entnehme (beliebiges) Paar {p, q} aus H ; for all a ∈ Σ do for all p0 , q 0 ∈ Q do if {δ(p0 , a), δ(q 0 , a)} = {p, q} und {p0 , q 0 } 6∈ N then N := N ∪{{p0 , q 0 }} ; H := H ∪{{p0 , q 0 }} ; return N ; end.
bearbeite {p, q}“ ”
Die Ausgabe ist die am Ende in N gespeicherte Menge von Paaren, die wir N ∗ nennen. uhrt zu folgender Wir wenden Algorithmus 2.7.8 auf den DFA aus Abb. 2.26 an. Dies f¨ Berechnung. Runde 0 1 2 3 4 5 6 7 8
Paar − {0, 1} {0, 2} {1, 3} {2, 3} {1, 4} {2, 4} {0, 4} {0, 3}
neu in N {0, 1}, {0, 2}, {1, 3}, {2, 3}, {1, 4}, {2, 4} – {0, 4}, {0, 3} – – – – – –
4
H {0, 1}, {0, 2}, {1, 3}, {2, 3}, {1, 4}, {2, 4} {0, 2}, {1, 3}, {2, 3}, {1, 4}, {2, 4} {1, 3}, {2, 3}, {1, 4}, {2, 4}, {0, 4}, {0, 3} {2, 3}, {1, 4}, {2, 4}, {0, 4}, {0, 3} {1, 4}, {2, 4}, {0, 4}, {0, 3} {2, 4}, {0, 4}, {0, 3} {0, 4}, {0, 3} {0, 3} ∅
Mit [Q]2 bezeichnen wir die Menge {{p, q} | p, q ∈ Q, p 6= q} der ungeordneten Paare verschiedener Elemente von Q.
73
Wir beschreiben noch eine u ur diesen Algorithmus, die ¨bersichtlichere Darstellungsweise f¨ f¨ ur die Durchf¨ uhrung per Hand geeignet ist. Man benutzt eine Tabelle, in der es f¨ ur jedes (ungeordnete) Paar {p, q} von verschiedenen Zust¨anden eine Position gibt. Zu Beginn markiert man die Positionen der Paare {p, q} mit p ∈ F und q ∈ / F und notiert, dass alle diese Markierungen noch nicht bearbeitet sind. Dann iteriert man folgenden Schritt: W¨ahle eine noch nicht bearbeitete Markierung, z. B. f¨ ur das Paar {p, q}. F¨ ur jedes un0 0 0 markierte Paar {p , q } derart, dass es einen Buchstaben a gibt mit δ(q , a) = q und δ(p0 , a) = p, markiere {p0 , q 0 } und notiere, dass {p0 , q 0 } noch nicht bearbeitet ist. Beispiel : F¨ ur den DFA aus Abb. 2.26 ben¨otigen wir eine Tabelle der folgenden Form. 1 2 3 4 0 1 2 3 Wir markieren die Paare {p, q} mit p ∈ F und q ∈ / F mit (willk¨ urlich angeordneten) Nummern: 1 2 3 4
1 2 3
4
5
6
0 1 2 3 Nun werden die markierten Paare, z. B. in der Reihenfolge ihrer Nummern, durchmustert, und gepr¨ uft, ob sie zu neuen Markierungen f¨ uhren. Bei Paar {0, 1} ist das nicht der Fall. Bei Paar {0, 2} sehen wir, dass δ(4, b) = 0 und δ(0, b) = 2. Daher wird nun Paar {0, 4} markiert. Weiter ist δ(3, b) = 0 und δ(0, b) = 2, und auch Paar {0, 3} wird markiert. Bei bearbeiteten Paaren kann man z. B. die Markierung durchstreichen; sie werden nie mehr angesehen. Dies liefert folgendes Bild: 1 2 3 4
61 62 7
3
4
8
5
6
0
1 2 3
Abarbeiten der weiteren markierten Paare liefert nichts Neues mehr; wir erhalten als endg¨ ultiges Resultat folgendes Bild: 74
61
1 2 3 4
62 67
63
64
68
65
66
0
1
2
3
In der Tabelle bleiben eventuell Felder frei. Diese entsprechen unmarkierten Paaren {p, q}. Wir werden gleich sehen, dass diese Paare ¨aquivalent sind. Vorher betrachten wir aber noch ein weiteres, umfangreicheres Beispiel. 2.7.9 Beispiel Man betrachte den folgenden DFA M = (Q, Σ, q0 , F, δ) mit Q = {0, 1, . . . , 8}, Σ = {a, b}, q0 = 0, F = {0, 1, 4, 5, 6, 8}: a Start
0
1
a
2
a
b
b
a
3
4
a
b
5
a
b
b
b
6
b
b
7
a
b
8
a a
Wir u uckt ¨berlegen kurz, welche Sprache dieser DFA erkennt. Mit dem Lesen eines a“ r¨ ” man zyklisch eine Spalte weiter, mit dem Lesen eines b“ zyklisch eine Zeile. Akzeptiert ” werden die W¨orter w, f¨ ur die |w|a ≡ |w|b mod 3 oder |w|a ≡ |w|b + 1 mod 3. (Dieser DFA ergibt sich aus einer Variante der Kreuzproduktkonstruktion (vgl. 2.1.10(c)), angewendet auf zwei DFA’s zum Z¨ahlen der a’s bzw. b’s modulo 3.) Wir wenden den Markierungsalgorithmus auf diesen DFA an. Nach der Initialisierung haben wir die folgende Tabelle:
75
1 2 3 4 5 6 7 8
1
4
2
5
3
7
11
8
12
9
13
6
0 1
15 10
14
2
3
16
17 18
4
5
6
7
¨ Nun werden die Markierungen in aufsteigender Reihenfolge abgearbeitet. Zur Ubung sollte man jeden Schritt nachvollziehen.
76
Nummer
Paar
1
{0, 2} {0, 3} {0, 7} {1, 2} {1, 3} {1, 7} {2, 4} {2, 5} {2, 6} {2, 8} {3, 4} {3, 5} {3, 6} {3, 8} {4, 7} {5, 7} {6, 7} {7, 8} {6, 8} {0, 6} {4, 6} {0, 1} {0, 5} {1, 8} {1, 4} {5, 8} {4, 5}
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
erreicht u ¨ber a-Kanten von {1, 2} {2, 5} {2, 6} {0, 1} {0, 5} {0, 6} {1, 3} {1, 4} {1, 8} {1, 7} {4, 5} {3, 4} {5, 8} {5, 7} {3, 6} {4, 6} {6, 8} {6, 7} {7, 8} {2, 8} {3, 8} {0, 2} {2, 4} {0, 7} {0, 3} {4, 7} {3, 4}
erreicht u ¨ber b-Kanten von {6, 8} {0, 6} {4, 6} {7, 8} {0, 7} {4, 7} {1, 8} {2, 8} {3, 8} {5, 8} {0, 1} {0, 2} {0, 3} {0, 5} {1, 4} {2, 4} {3, 4} {4, 5} {3, 5} {3, 6} {1, 3} {6, 7} {2, 6} {7, 5} {1, 7} {2, 5} {1, 2}
neu markiert 19: 20: 21: 22: 23: 24: 25: 26:
27:
{6, 8} {0, 6} {4, 6} {0, 1} {0, 5} – {1, 8} {1, 4} – {5, 8} – – – – – – – {4, 5} – – – – – – – – –
Tabelle 2.5 zeigt das Ergebnis nach dem Ausf¨ ullen. (Wir haben die Markierungsnummern nicht durchgestrichen.) Wenn man f¨ ur einen Augenblick annimmt (wir beweisen das gleich), dass der Markierungsalgorithmus alle Paare nicht¨aquivalenter Zust¨ande markiert, dann geben die leeren Felder in Tabelle 2.5 die Paare nicht-¨aquivalenter Zust¨ande an. Im Beipiel sind dies {2, 3}, {0, 4}, {1, 5}, {1, 6}, {5, 6}, {2, 7}, {3, 7}, {0, 8}, {4, 8} ¨ was den folgenden Aquivalenzklassen entspricht: {0, 4, 8}, {1, 5, 6}, {2, 3, 7}. ¨ (Diese Aquivalenzklassen lassen sich in Fig. 2.26 als Diagonalmengen interpretieren. 77
1 2 3 4 5 6 7 8
22 1
4
2
5 25
7
11
23
8
12
27
20
9
13
21
3
0
6
15
24
10
14
1
2
3
4
16
17
26
19
18
5
6
7
Tabelle 2.5: Ergebnis des Markierungsalgorithmus Der folgende Satz besagt, dass sich aus dem Ergebnis des Markierungsalgorithmus immer ¨ auf diese Weise die ¨aquivalenten Paare und damit auch die Aquivalenzklassen des DFA M ablesen lassen. 2.7.10 Satz Wenn Algorithmus 2.7.8 auf einen DFA M = (Q, Σ, q0 , F, δ) angewendet wird, dann werden genau die Paare {p, q} mit p 6∼M q markiert. (Die Ausgabemenge N ∗ enth¨alt genau die Paare aus nicht-¨aquivalenten Zust¨anden.) ussen zeiBeweis: (Vergleiche den Beweis der Korrektheit von Algorithmus 2.7.2.) Wir m¨ gen, dass ein Paar {p, q} genau dann markiert wird, wenn p und q nicht ¨aquivalent sind. ⇒“: Wir zeigen durch Induktion u ¨ber die Rundennummer, dass jedes markierte Paar ” {p, q} aus nicht¨aquivalenten Zust¨anden besteht. I.A.: Wenn {p, q} in der Initialisierungsphase markiert wird, dann gilt p ∈ F ⇔ q ∈ / F. Nach Regel (∗) (nach Lemma 2.7.7) sind p, q nicht ¨aquivalent. Induktionsannahme: Alle bis zur Runde r − 1 markierten Zustandspaare {p, q} sind nicht¨aquivalent. Induktionsschritt: Wenn {p0 , q 0 } in Runde r ≥ 1 markiert wird, dann gibt es (nach dem Algorithmus) ein Paar {p, q}, das in einer fr¨ uheren Runde markiert wurde, und einen Buchstaben a ∈ Σ mit δ(p0 , a) = p und δ(q 0 , a) = q. Nach I.V. gilt p 6∼ q. Nach Nach Regel (∗∗) (nach Lemma 2.7.7) sind p0 , q 0 nicht ¨aquivalent. Damit ist die Induktionsbehauptung gezeigt. ⇐“: Indirekt. Annahme: Es gibt ein Paar {p, q}, das nicht markiert wird, aber p 6∼ q ” erf¨ ullt. — Zu jedem solchen Paar {p, q} gibt es nach Definition 2.7.6 ein Wort w mit δ(p, w) ∈ F ⇔ δ(q, w) ∈ / F . Wir w¨ahlen unter allen m¨oglichen Kombinationen (p, q, w) mit dieser Eigenschaft eine, f¨ ur das |w| m¨oglichst klein ist. 1. Fall: w = ε. — Dann gilt p = δ(p, ε) ∈ F ⇔ q = δ(q, ε) ∈ / F . Dann wird aber {p, q} in der Initialisierungsrunde markiert; also kann Fall 1 gar nicht eintreten. 78
2. Fall: |w| ≥ 1. — Dann schreiben wir w = au f¨ ur einen Buchstaben a und ein Wort 0 0 u mit |u| < |w|. Setze p = δ(p, a) und q = δ(q, a). Dann ist δ(p, w) = δ(p0 , u) und δ(q, w) = δ(q 0 , u). Das heißt: δ(p0 , u) ∈ F ⇔ δ(q 0 , u) ∈ / F. Weil u k¨ urzer ist als w, folgt daraus nach der Wahl von w, dass das Paar {p0 , q 0 } irgendwann einmal markiert wird (und damit in die Warteschlange H aufgenommen wird). Irgendwann danach wird dann {p0 , q 0 } bearbeitet und festgestellt, dass δ(q, a) = p0 und δ(q, a) = q 0 ist, und dass {p, q} unmarkiert ist. In diesem Moment wird {p, q} markiert, was der Annahme widerspricht. Also ist die Annahme falsch, und es kann u ¨berhaupt kein Paar nicht¨aquivalenter Zust¨ande geben, das nicht markiert wird.
2.7.3
Minimalautomaten
Mit den Ergebnissen des letzten Abschnitts k¨onnen wir die Zustandsmenge Q eines be¨ liebigen DFA’s in Aquivalenzklassen bez¨ uglich ∼M aufteilen. Wir zeigen nun, dass sich ¨ die Menge dieser Aquivalenzklassen als Zustandsmenge eines DFA f¨ ur LM mit minimaler Gr¨oße benutzen l¨asst, wenn man von einem DFA ohne unerreichbare Zust¨ande ausgeht. ¨ kann man direkt definieren. Diesen neuen DFA (den Aquivalenzklassenautomaten“) ” 2.7.11 Definition Sei ∼ zu einem DFA M = (Q, Σ, q0 , F, δ) wie in 2.7.6 definiert. Nun ˜ durch: ˜ = (Q, ˜ Σ, q˜0 , F˜ , δ) definiere einen DFA M ˜ := {[q] | q ∈ Q} ¨ Q (Menge der Aquivalenzklassen bzgl. ∼) ; q˜0 := [q0 ] ; F˜ := {[q] | q ∈ F } ; ˜ ˜ a ∈ Σ. δ([q], a) := [δ(q, a)], f¨ ur [q] ∈ Q, ¨ F¨ ur das Beispiel aus Abb. 2.7.9 hatten wir in Abschnitt 2.7.2 drei Aquivalenzklassen identifiziert. Damit ergibt sich mit Definition 2.7.11: ˜ = {0, 4, 8}, {1, 5, 6}, {2, 3, 7} , Q Σ = {a, b}, q˜0 = {0, 4, 8}, F˜ = {0, 4, 8}, {1, 5, 6} ;
¨ die Ubergangsfunktion δ˜ ist durch folgenden Graphen gegeben: a a Start
a
0,4,8
1,5,6
b b
79
2,3,7
b
˜ ist Man bemerkt, dass in diesem Beispiel kein Konflikt entsteht: F¨ ur jede Klasse [q] ∈ Q 0 0 [q] ⊆ F oder [q] ∩ F = ∅; und es gilt stets q ∼ q ⇒ δ(q, a) ∼ δ(q , a). Im folgenden Satz wird unter anderem gezeigt, dass dies immer so ist. 2.7.12 Satz
˜ zu M wie in 2.7.11 definiert. Dann gilt: Sei M ein DFA; sei M
(a) Wenn q ∼ q 0 , dann gilt q ∈ F ⇔ q 0 ∈ F . D. h.: f¨ ur jedes q ∈ Q ist [q] ⊆ F oder [q] ∩ F = ∅. (b) δ˜ ist wohldefiniert; ˜ ist ein DFA; (c) M (d) LM = LM˜ . Beweis: (a) Sei q ∼ q 0 . Nach Def. 2.7.6 gilt q 0 = δ(q 0 , ε) ∈ F genau dann wenn q = δ(q, ε) ∈ F. ˜ die formal auf einen Re(b) Wohldefiniertheit bedeutet, dass die Definition von δ, ¨ pr¨asentanten einer Aquivalenzklasse bezogen ist, nur von der Klasse, nicht vom Repr¨asentanten abh¨angt. Sei dazu a ∈ Σ, q 0 ∈ [q] beliebig. Zu zeigen ist: [δ(q, a)] = [δ(q 0 , a)], d. h. δ(q, a) ∼ δ(q 0 , a). Tats¨achlich gilt f¨ ur alle w ∈ Σ∗ : δ(q, aw) ∈ F ⇔ δ(q 0 , aw) ∈ F, weil q ∼ q 0 . Also gilt f¨ ur alle w ∈ Σ∗ : δ(δ(q, a), w) ∈ F ⇔ δ(δ(q 0 , a), w) ∈ F, was δ(q, a) ∼ δ(q 0 , a) bedeutet. (c) Alle formalen Anforderungen an einen DFA sind erf¨ ullt: ˜ ˜ ˜ ˜ und δ˜ : Q ˜ × Σ → Q. ˜ Q ist endlich und nichtleer, Σ ist Alphabet, q˜0 ∈ Q, F ⊆ Q (d) Hilfsbehauptung (HB): ˜ δ([q], w) = [δ(q, w)], f¨ ur alle q ∈ Q, w ∈ Σ∗ . ˜ (Beweis von HB durch Induktion u ε) = [q] = [δ(q, ε)]. ¨ber n = |w|: Ist w = ε, so gilt δ([q], ∗ Im Induktionsschritt ist w = ua f¨ ur u ∈ Σ , a ∈ Σ. Dann gilt: ˜ δ([q], ua)
= Def.δ˜
=
I.V. ˜ ˜ δ([q], ˜ δ( u), a) = δ([δ(q, u)], a)
[δ(δ(q, u), a)] = [δ(q, ua)];
dies ist die Induktionsbehauptung.) Damit haben wir f¨ ur beliebige w ∈ Σ∗ : w ∈ LM˜
⇔ Teil(a)
⇔
˜ q0 , w) ∈ F˜ HB δ(˜ ⇔ [δ(q0 , w)] ∈ F˜ δ(q0 , w) ∈ F ⇔ w ∈ LM . 80
¨ Der n¨achste Satz ist noch etwas abstrakter als die bisherigen Uberlegungen. Er besagt unter anderem, dass man einen DFA f¨ ur L mit der kleinstm¨ oglichen Anzahl von Zust¨ anden wie folgt erh¨alt: Beginne mit einem beliebigen DFA M0 f¨ ur L. Entferne alle ¨ unerreichbaren Zust¨ande (Ergebnis M ) und wende dann die Aquivalenzklassenkonstruk˜ ). tion an (Ergebnis M 2.7.13 Satz (Minimalit¨ at) Es sei M = (Q, Σ, q0 , F, δ) ein DFA ohne unerreichbare ˜ Zust¨ande, und M zu M sei wie in 2.7.11 definiert. Weiter sei M 0 = (Q0 , Σ, q00 , F 0 , δ 0 ) ein beliebiger DFA ohne unerreichbare Zust¨ande, mit LM = LM 0 . Dann gibt es eine surjektive Funktion ˜, Φ : Q0 → Q so dass: (2.5)
0 ˜ Φ(δ 0 (q 0 , a)) = δ(Φ(q ), a), f¨ ur a ∈ Σ und q 0 ∈ Q0 ,
sowie (2.6)
q 0 ∈ F 0 ⇔ Φ(q 0 ) ∈ F˜ .
Aus der Surjektivit¨at von Φ folgt insbesondere, dass kein DFA f¨ ur LM eine geringere ˜ . Insofern k¨onnen wir M ˜ einen MinimalautoAnzahl von Zust¨anden haben kann als M maten f¨ ur LM nennen. Beweis: Es sei q 0 ∈ Q0 . Dann gibt es ein Wort w ∈ Σ∗ derart, dass δ 0 (q00 , w) = q 0 ist. Wir definieren: Φ(q 0 ) = [δ(q0 , w)]. Hier gibt es wieder die Frage, ob hierdurch Φ wohldefiniert ist, oder ob die Definition von der willk¨ urlichen Wahl von w abh¨angt. Die folgende Behauptung zeigt, dass hier kein Problem besteht: wenn δ 0 (q00 , w1 ) = q 0 und δ 0 (q00 , w2 ) = q 0 gilt, dann ist [δ(q0 , w1 )] = [δ(q0 , w1 )]. Behauptung: Wenn δ 0 (q00 , w1 ) = q 0 und δ 0 (q00 , w2 ) = q 0 , dann ist δ(q0 , w1 ) ∼M δ(q0 , w2 ). (Beweis der Behauptung: Setze p1 = δ(q0 , w1 ) und p2 = δ(q0 , w1 ). Nun sei w ∈ Σ∗ beliebig. Wir haben: δ(p1 , w) = δ(q0 , w1 w) und δ(p2 , w) = δ(q0 , w2 w). Nach Voraussetzung ist δ 0 (q00 , w1 w) = δ 0 (q 0 , w) = δ 0 (q00 , w2 w). Das heißt, dass w1 w ∈ LM 0 = LM gilt genau dann wenn w2 w ∈ LM 0 = LM , in anderen Worten: δ(p1 , w) = δ(q0 , w1 w) ∈ F genau dann wenn δ(p2 , w) = δ(q0 , w2 w) ∈ F. Da dies f¨ ur jedes beliebige w gilt, ist p1 ∼M p2 , wie gew¨ unscht.) ˜ mit q ∈ Q. Dann gibt es ein w mit δ(q0 , w) = q. Es sei [q] ein beliebiger Zustand in Q, Dieses w erf¨ ullt auch Φ(δ(q00 , w)) = [δ(q0 , w)] = [q]. 81
Also ist Φ surjektiv. Es bleiben die beiden Gleichungen zu beweisen, die besagen, dass Φ ein Automaten” Homomorphismus“ ist. Es sei w ein Wort mit δ 0 (q00 , w) = q 0 . Dann ist einerseits Φ(δ 0 (q 0 , a)) = Φ(δ 0 (q00 , wa)) = [δ(q0 , wa)] und andererseits 0 ˜ ˜ δ(Φ(q ), a) = δ([δ(q 0 , w)], a) = [δ(δ(q0 , w), a)] = [δ(q0 , wa)] .
Das beweist (2.5). Weiterhin gilt q 0 ∈ F 0 ⇔ w ∈ LM 0 = LM = LM˜ ⇔ [Φ(q 0 )] = [δ(q0 , w)] ∈ F˜ . Anmerkung: Wenn man noch etwas genauer hinsieht, kann man sogar feststellen, dass alle Automaten f¨ ur eine regul¨are Sprache mit der minimalen Zustandszahl isomorph“ ” ˜ ¨ sind. Im Licht dieser Tatsache ist es gerechtfertigt, den Aquivalenzklassenautomaten M den Minimalautomaten f¨ ur LM zu nennen.
82
Kapitel 3 Grammatiken und die Chomsky-Hierarchie In den 50er Jahren gab Noam Chomsky (∗ 1928), ein amerikanischer Linguist, vier Grammatiktypen als m¨ogliche Modelle f¨ ur Grammatiken nat¨ urlicher Sprachen an. Die Informatiker (und -innen), die sich einerseits mit Formalismen zur Spezifikation k¨ unstlicher Sprachen (Programmiersprachen!) und Algorithmen zur Syntaxanalyse in solchen Sprachen besch¨aftigten, und andererseits die formalen Sprachen als interessanten Gegenstand mathematischer Untersuchungen ansahen, bem¨achtigten sich bald Chomskys Definitio¨ nen, formten um, bewiesen Aquivalenzen zu Sprachklassen, die zu verschiedenen Typen von Automaten geh¨oren, und benutzten die Analysen als Basis f¨ ur die Konstruktion von ¨ Ubersetzern f¨ ur Programmiersprachen. Wir wollen in diesem Kapitel diese Grammatiktypen kurz betrachten; wir lassen dabei den Bezug zu den nat¨ urlichen Sprachen v¨ollig außer acht und konzentrieren uns auf die Aspekte des Formalismus, die f¨ ur InformatikAnwendungen von Bedeutung sind.1
3.1
Grammatiken
Bisher haben wir Sprachen L spezifiziert durch • Algorithmen, die w ∈ L von w 6∈ L unterschieden (Automaten) • regul¨are Ausdr¨ ucke (rekursive Konstruktion von Sprachen). Grammatiken stellen eine ganz andere Methode dar, Sprachen zu spezifizieren, n¨amlich einen Kalk¨ ul, in dem gem¨aß gewisser Regeln W¨orter erzeugt werden (durch einen nichtdeterministischen Erzeugungs- oder Ableitungsprozess); die in diesem Kalk¨ ul erzeugbaren W¨orter bilden dann die Sprache. 1
Im Buch Theoretische Informatik – kurz gefasst“ von U. Sch¨oning ist in Kap. 1 ein nat¨ urlichspra” ” chiges“ Beispiel f¨ ur eine formale Grammatik angegeben.
83
Grob gesprochen sehen solche Regelsysteme so aus: Sie bestehen aus einem Alphabet ∆, einem Startsymbol“ S ∈ ∆, und einer zweistelligen Relation ⇒ u ¨ber ∆∗ . (α ⇒ α0 ” 0 wird gelesen als: α ist aus α in einem Schritt ableitbar“. Diese Relation hat nichts mit ” ∗ logischer Implikation zu tun!) Dann betrachtet man die Iteration ⇒ von ⇒: ∗
α ⇒ α0 ,
falls es eine Folge α0 , . . . , αt in ∆∗ gibt mit α0 = α, αr = α0 , und αi−1 ⇒ αi f¨ ur 1 ≤ i ≤ t.
∗
(⇒ ist die reflexive und transitive H¨ ulle“ von ⇒; siehe Beispiel A.2.16 in Anhang A.2.) ” Schließlich bezeichnet man ∗ {α ∈ ∆∗ | S ⇒ α} als die Menge der im Regelsystem ableitbaren/herleitbaren W¨orter. In dieser Allgemeinheit sind Regelsysteme impraktikabel, insbesondere weil ⇒ i. a. eine unendliche Relation ist und man sie daher nicht als endlichen Text schreiben kann. Auch erweist es sich als n¨ utzlich, Hilfszeichen zu haben, die in Zwischenschritten von Ableitungen vorkommen d¨ urfen, die aber nicht zum Alphabet der letztendlich interessierenden Sprache geh¨oren. Wir verfeinern also unseren Ansatz dadurch, dass wir ⇒ durch einen endlichen Satz lokaler Ersetzungsregeln“ spezifizieren und dadurch, dass wir zwei Typen ” von Buchstaben verwenden: Variable“ (das sind die Hilfszeichen) und Terminalzei” ” chen“ (das sind die Zeichen des Zielalphabets“). Technisch schreibt man ∆ = V ∪ Σ, ” wo V , Σ disjunkte Alphabete sind, S ∈ V ; die interessierende Sprache L ist Sprache u ¨ber Σ. 3.1.1 Beispiel (Arithmetische Ausdru aten) Wir wollen die Men¨ cke mit Priorit¨ ge aller arithmetischen Ausdr¨ ucke mit Operatoren +, -, *, /, und mit Klammern ( und ) spezifizieren. Die Operanden sind Numerale“ (Zahldarstellungen), die nicht weiter spe” zifiziert werden. Man kann sich vorstellen, dass das genaue Format von Numeralen durch eine regul¨are Sprache spezifiziert wird, die man dann substituiert. Als Hilfszeichen benutzen wir htermi, hexpr i, hfactor i. Die Terminalzeichen, das sind also die Zeichen, aus denen die arithmetischen Ausdr¨ ucke aufgebaut sind, sind +, -, *, /, (, ), num, wobei num Platzhalter f¨ ur ein Numeral, also die Darstellung einer Zahl, ist.
84
Regeln (oder Produktionen“): ” hfactor i → num hfactor i → (hexpr i) htermi → htermi * hfactor i htermi → htermi / hfactor i htermi → hfactor i hexpr i → hexpr i + htermi hexpr i → hexpr i - htermi hexpr i → htermi Begonnen wird mit dem Hilfszeichen S = hexpr i. Eine m¨ogliche Folge von Anwendungen der Regeln liefert folgendes: hexpr i ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ .. . ⇒
htermi ⇒ htermi / hfactor i htermi / (hexpr i) htermi / (hexpr i - htermi) hfactor i / (hexpr i - htermi) num / (hexpr i - htermi) num / (hexpr i + htermi - htermi) num / (hexpr i + hfactor i - htermi) num / (hexpr i + num - htermi) num / (num + num - num)
Wir sagen, dass wir das resultierende Wort aus Terminalzeichen aus hexpr i abgeleitet“ ” haben. Bei der Anwendung der Regeln hat man oft eine Auswahl sowohl darin, auf welches Hilfszeichen eine Regel angewendet werden soll als auch darin, welche von mehreren m¨oglichen rechten Seiten“ eingesetzt werden soll. Der durch ein solches Ersetzungsregelsystem ” gegebene Kalk¨ ul ist also grunds¨atzlich nichtdeterministisch ( darf ersetzen“). ” ¨ Zur Ubung finde man Ableitungen f¨ ur die arithmetischen Ausdr¨ ucke (num)+num-num
und
num*num/num/(num-num).
Nun wenden wir uns der Entwicklung des formalen Rahmens solcher Regelsysteme zu. 3.1.2 Definition Eine Grammatik G ist ein 4-Tupel (V, Σ, S, P ), wobei Σ und V disjunkte Alphabete sind, S ∈ V ist und P eine endliche Teilmenge von (V ∪Σ)+ ×(V ∪Σ)∗ ist. Die Komponenten der Grammatik werden folgendermaßen bezeichnet: 85
V : Menge der (syntaktischen) Variablen“. ” (Variable werden bei theoretischen Untersuchungen mit A, B, C, . . ., S, T , . . . bezeichnet, in praktischen Anwendungen mit W¨ortern wie statement oder expression, oder speziell markierten Strings wie htermi, hexpr i, hfactor i, usw.) Σ : Menge der Terminalzeichen“. ” (Die Bezeichnungen f¨ ur Terminalzeichen-Alphabete und Buchstaben sind dieselben wie bei den regul¨aren Sprachen.) S ∈ V : Startsymbol“, Startvariable“. ” ” P : Menge von Produktionen“ oder Ableitungsregeln“ (l, r), ” ” l ∈ (V ∪ Σ)+ , r ∈ (V ∪ Σ)∗ , geschrieben: l → r, gelesen: man darf l durch r ersetzen“. ” In Beispiel 3.1.1 ist V = {hexpr i, htermi, hfactor i}, Σ = {+, -, *, /, (, ), num}, S = hexpr i, und P = {(hfactor i, num), (hfactor i, (hexpr i)), (htermi, htermi * hfactor i), (htermi, htermi / hfactor i), (htermi, hfactor i), (hexpr i, hexpr i + htermi), (hexpr i, hexpr i - htermi), (hexpr i, htermi)} Der besseren Lesbarkeit halber notiert man die Produktionen nicht als Liste von Paaren, sondern wie in Beispiel 3.1.1 als Tabelle von Eintr¨agen l → r. Eine Grammatik G ist ein endlicher Text. Sie spezifiziert einen Kalk¨ ul, in dem W¨orter (¨ uber V ∪Σ) erzeugt werden k¨onnen. Wir beschreiben jetzt, wie dieser Kalk¨ ul funktioniert. 3.1.3 Definition
Sei G = (V, Σ, S, P ) Grammatik.
(a) (Wir erlauben, inmitten eines Wortes die linke Seite l einer Produktion l → r durch die rechte zu ersetzen.) Wir schreiben ulv ⇒G urv oder k¨ urzer ulv ⇒ urv, falls u, v ∈ (V ∪ Σ)∗ und l → r eine Produktion in P ist. (⇒ ist zweistellige Relation u ¨ber (V ∪ Σ)∗ .) Sprechweise: urv ist in 1 Schritt aus ulv ableitbar . (Man nennt ⇒ die Halbgruppenh¨ ulle“ von →, weil man → mittels der [assoziativen] ” Konkatenationsoperation erweitert.) (b) (Wir erlauben, mehrere solche Schritte nacheinander auszuf¨ uhren.) ∗
⇒ ist die reflexive, transitive H¨ ulle von ⇒. ∗
Das heißt: α ⇒ α0 , falls es α0 = α, α1 , . . . , αt = α0 gibt, t ≥ 0, so dass αi−1 ⇒ αi f¨ ur ∗ 1 ≤ i ≤ t. (Spezialfall t = 0: α ⇒ α gilt immer.) Sprechweise: α0 ist aus α (in t Schritten) ableitbar. Wenn man die Schrittanzahl t betonen will, kann man auch α ⇒ α0 schreiben. 86
(c) Was ist aus S ableitbar? ∗
α ∈ (V ∪ Σ)∗ heißt Satzform von G, falls S ⇒ α. Eine Folge S = α0 ⇒ α1 ⇒ · · · ⇒ αt = α, t ≥ 0, heißt Ableitung/Herleitung von α. (d) Welche W¨orter u ¨ber Σ sind ableitbar? ∗
L(G) := {w ∈ Σ∗ | S ⇒ w} heißt die von G erzeugte (oder beschriebene) Sprache. Mit Grammatiken in dieser allgemeinen Form kann man so ziemlich alles“ machen — ” wir werden das gleich pr¨azisieren. Hier nur ein einfaches Beispiel f¨ ur eine Grammatik, die Zweierpotenzen in Un¨ardarstellung erzeugt. 3.1.4 Beispiel Typische Satzformen unserer Grammatik sind /ca · · · aXa · · · a$, wobei X eine der zwei Variablen A, B ist, und /ca · · · aCa · · · a. Die Produktionen sind so angelegt, dass in Ableitungen folgendes vor sich geht. • A wandert von links nach rechts und verdoppelt jedes u ¨bersprungene a. • Wenn A beim $ anst¨oßt, wird A$ in B$ oder in C umgewandelt. (Im zweiten Fall wird das $-Zeichen geschluckt“.) ” • B l¨auft von rechts nach links und wird beim Auftreffen auf /c wieder in A umgewandelt. • C l¨auft nach links, um sich beim Auftreffen auf das /c-Zeichen in nichts“ ( ε ) ” aufzul¨osen. Also: V = {S, /c, $, A, B, C}, Σ = {a}, und die Produktionsmenge P enth¨alt folgende Paare: (1) (2) (3) (4) (5) (6) (7) (8)
S → /cAa$ Aaa → aaAa Aa$ → aaB$ aB → Ba /cB → /cA Aa$ → aaC aC → Ca /cC → ε
87
Um in einem Ableitungsschritt ulv ⇒ urv anzudeuten, welche Produktion auf welches Teilwort angewandt wird, unterstreichen wir l und schreiben die Nummer der Produktion auf den Pfeil. Beispiele: (4)
A/caAaBa ⇒ A/caABaa (2)
$$AaaB ⇒ $$aaAaB (4)
$$AaaB ⇒ $$AaBa Man erkennt: Auch unsinnige“ Ableitungsschritte sind definiert, und die Ableitungsrela” tion ist nichtdeterministisch. Die f¨ ur uns interessanten Ableitungen sind nur die, die mit S beginnen: (1)
(6)
(1)
(3)
(7)
(7)
(8)
S ⇒ /cAa$ ⇒ /caaC ⇒ /caCa ⇒ /cCaa ⇒ aa. (4)
(4)
(5)
S ⇒ /cAa$ ⇒ /caaB$ ⇒ /caBa$ ⇒ /cBaa$ ⇒ (2)
(6)
(7)
(7)
(7)
(8)
⇒ /cAaa$ ⇒ /caaAa$ ⇒ /caaaaC ⇒ /caaaCa ⇒ · · · ⇒ /cCaaaa ⇒ aaaa. Mit jeder Tour von A einmal von links nach rechts verdoppelt sich die Anzahl der a’s. Man u ur das Wort aaaaaaaa aussieht. Wenn eine Tour von ¨berlege, wie eine Ableitung f¨ A oder B oder C unvollst¨andig ist, dann enth¨alt die erreichte Satzform noch /c oder $, besteht also nicht nur aus Terminalzeichen. Man sieht also intuitiv, dass alle Folgen aj , die s (aus S) ableitbar sind, die Form a2 , s ≥ 1, haben, und dass jede dieser Folgen ableitbar ist. Also: s ∗ L(G) = {w ∈ {a}∗ | S ⇒ w} = {a2 | s ≥ 1}. (Der formale Beweis dieser Aussage ist nur m¨ uhsam, nicht tief.) Grammatiken in der in 3.1.3 angegebenen allgemeinen Form heißen auch Chomsky-0-Grammatiken, Typ-0-Grammatiken oder Semi-Thue-Systeme.2 3.1.5 Definition Mit L0 bezeichnen wir die Klasse aller Sprachen L, f¨ ur die es eine Typ-0-Grammatik G mit L = L(G) gibt. Auf die Klasse L0 kommen wir sp¨ater und in der Vorlesung Algorithmentheorie“ zur¨ uck. ” Es wird sich herausstellen, dass sie genau die u ul ¨berhaupt durch einen beliebigen Kalk¨ erzeugbaren Sprachen enth¨alt (die rekursiv aufz¨ahlbaren“ Sprachen). ” Wir wenden uns nun einem ersten eingeschr¨ankten Grammatiktyp zu. Dabei darf in einem Ableitungsschritt immer nur eine Variable A ∈ V durch ein nichtleeres Wort ersetzt werden. Man hat aber die M¨oglichkeit, dies auszuschließen, wenn A nicht in einem vorgeschriebenen Teilwort vorkommt (dem Kontext“). ” 2
A. Thue war Mathematiker, der um 1914 Regelsysteme zur Manipulation von Zeichenreihen, sog. Thue-Systeme, untersuchte. Seine Regeln waren symmetrisch (l → r impliziert r → l), das Semi“ (lat. ” f¨ ur halb“) dr¨ uckt aus, dass unsere Produktionen gerichtet sind. ”
88
3.1.6 Definition (a) Sei G = (V, Σ, S, P ) Grammatik. Eine Produktion l → r heißt kontextsensitiv , wenn l = αAγ, r = αβγ, wobei A ∈ V ist, α, β, γ ∈ (V ∪ Σ)∗ sind und |β| ≥ 1. ( Man darf A durch das nichtleere Wort β ersetzen, aber nur, wenn A im Kontext α..γ ” steht.“) Um Missverst¨andnisse auszuschließen: Auch A → β mit |β| ≥ 1 ist eine kontextsensitive Produktion (mit α = γ = ε ). Die eigentlich wesentliche Eigenschaft hier ist die Nicht” Verku ¨rzung“: es gilt stets |l| ≤ |r|. (b) Die Grammatik G = (V, Σ, S, P ) heißt kontextsensitiv , wenn • entweder alle Produktionen von G kontextsensitiv sind • oder alle Produktionen von G kontextsensitiv sind außer der folgenden: S → ε, und S nie auf der rechten Seite einer Produktion vorkommt. Kontextsensitive Grammatiken heißen auch Chomsky-1-Grammatiken oder Typ-1Grammatiken. (c) Eine Sprache L heißt kontextsensitiv oder vom Typ 1 oder Chomsky-1-Sprache, falls L = L(G) f¨ ur eine kontextsensitive Grammatik G gilt. L1 ist die Klasse aller kontextsensitiven Sprachen. Auch L1 wird sp¨ater nochmals diskutiert. Weil jede Typ-1-Grammatik auch Typ-0-Grammatik ist, gilt nat¨ urlich L1 ⊆ L0 . Beispiele f¨ ur kontextsensitive Produktionen: S → /cAa$ Aab → aaBab bbAa$ → bbaba$ bbAa$ → bbSBa$ /cB → /cA Man suche jeweils die Teilw¨orter α, β, γ! Keine kontextsensitiven Produktionen sind: Aa$ → aaB$ aC → Ca /cC → ε S→ε Kontextsensitive Grammatiken sind theoretisch einfach zu handhaben, aber f¨ ur die Beschreibung von Sprachen sehr unhandlich. Leichter geht es mit der allgemeiner aussehenden Klasse der monotonen“ Grammatiken. Wir werden sehen, dass solche Grammatiken ” relativ leicht in kontextsensitive umgebaut werden k¨onnen. Damit ergibt sich folgendes Standard-Vorgehen: Spezifiziere eine Sprache L u ¨ber eine monotone Grammatik; schließe, dass L kontextsensitiv ist. 89
3.1.7 Definition (a) Sei G = (V, Σ, S, P ) eine Grammatik. Eine Produktion l → r heißt (wortl¨ angen-)monoton, wenn |l| ≤ |r| ist. Beachte: Dies ist die Eigenschaft Nicht-Verk¨ urzung“ von den kontextsensitiven Produk” tionen. Also: Jede kontextsensitive Produktion ist monoton. (b) Eine Grammatik G = (V, Σ, S, P ) heißt (wortl¨ angen-)monoton, wenn • entweder alle Produktionen von G monoton sind • oder alle Produktionen von G monoton sind außer der folgenden: S → ε, und S nie auf der rechten Seite einer Produktion vorkommt. Aus den Definitionen folgt sofort, dass jede kontextsensitive Grammatik monoton ist. Die Umkehrung gilt nicht! Zum Beipiel ist die Produktion aC → Ca monoton, aber nicht kontextsensitiv. Es gilt aber, dass die monotonen Grammatiken nur kontextsensitive Sprachen beschreiben k¨onnen. 3.1.8 Satz Sei L = L(G) f¨ ur eine monotone Grammatik G. Dann gibt es eine kontext0 sensitive Grammatik G mit L = L(G0 ). (Insbesondere ist L(G) kontextsensitiv.) 3.1.9 Beispiel Betrachte die Grammatik G = (V, Σ, S, P ) mit V = {S, A, C}, Σ = {a, b, c}, Startsymbol S, und den folgenden Produktionen: S S S A A Cb Cc
→ → → → → → →
ε abc aAbc aACb aCb bC cc
Man sieht, dass alle Produktionen monoton sind außer S → ε, und dass S nicht rechts vorkommt. Klar ist, dass S ⇒ ε und S ⇒ abc gilt und daher, dass ε, abc ∈ L(G). Weiter haben wir die folgende Ableitungsfolge: S ⇒ aAbc ⇒ aaCbbc ⇒ aabCbc ⇒ aabbCc ⇒ aabbcc. Also ist auch aabbcc ∈ L(G). Die Grammatik G und die von ihr beschriebene Sprache ¨ wird in der Ubung genauer untersucht. Es stellt sich folgendes heraus: L(G) = {an bn cn | n ≥ 0}. Mit Satz 3.1.8 k¨onnen wir schließen, dass diese Sprache kontextsensitiv ist, also zur Klasse L1 geh¨ort. 90
Auch wenn es auf den ersten Blick nicht so aussieht (wegen der Produktion /cC → ε), kann man auch die Grammatik aus Beispiel 3.1.4 zu einer monotonen Grammatik umbauen. i Daraus folgt, wieder mit Satz 3.1.8, dass auch {a2 | i ≥ 1} ∈ L1 gilt. Es fehlt noch der Beweis von Satz 3.1.8. Der Umbau von G = (V, Σ, S, P ) (monoton) in G0 = (V 0 , Σ, S, P 0 ) (kontextsensitiv) erfolgt in zwei Schritten. 1. Schritt: Separierung“. Hier wird erreicht, dass auf der linken Seite von Produk” tionen nur noch Variable stehen, keine Terminalzeichen. Das ist ganz leicht. Man erfindet f¨ ur jedes a ∈ Σ eine neue Variable, z. B. Da , und ersetzt in jeder Produktion in P jedes Vorkommen von a durch Da . Weiterhin f¨ ugt man f¨ ur jedes a ∈ Σ die eine neue Produktion Da → a hinzu. Die neue Menge von Produktionen nennen wir P 00 . Im Beispiel 3.1.9 bekommt man die folgende Menge P 00 : S S S A A CDb CDc Da Db Dc
→ → → → → → → → → →
ε Da Db Dc Da ADb Dc Da ACDb Da CDb Db C Dc Dc a b c
Die Ableitungen, die sich mit P 00 ergeben, sind dieselben wie die in G, nur stehen u ¨berall die Stellvertreter-Variablen an Stelle der Terminalzeichen. Zu beliebigen Zeiten kann man auch Variable Da in das Terminalzeichen a umwandeln. Ein solches Terminalzeichen kann aber nachher nicht mehr in einem Ableitungsschritt benutzt werden, weil in keiner Produktion links ein Terminalzeichen vorkommt. Das bedeutet, dass man immer so tun kann, als ob diese Umwandlung erst ganz zum Schluss passiert. Beispiel : S ⇒ Da ADb Dc ⇒ Da aCDb Db Dc ⇒ Da Da Db CDb Dc ⇒ Da Da Db Db CDc ⇒ Da Da Db Db Dc Dc . Aus dieser Satzform kann man in sechs abschließenden Schritten das Wort aabbcc erhalten. 2. Schritt: Einzelschritte“. Hier werden die monotonen Produktionen aus P 00 , die ” nicht ohnehin schon kontexsensitiv sind, in eine Folge kontextsensitiver Produktionen umgewandelt. Wir zeigen dies an einem Beispiel, das sich aber in offensichtlicher Weise verallgemeinern l¨asst. Wir betrachten eine Produktion p: X1 X2 X3 → Y1 Y2 Y3 Y4 Y5 , 91
wobei X1 , . . . , Y5 Variable sind. Wir erfinden drei neue Variable Z1 , Z2 , Z3 , die nur f¨ ur diese Produktion p Verwendung finden. Die Produktion p wird ersetzt durch die folgende Liste von kontextsensitiven Produktionen: X1 X2 X3 → Z1 X2 X3 Z1 X2 X3 → Z1 Z2 X3 Z1 Z2 X3 → Z1 Z2 Z3 Z1 Z2 Z3 → Y 1 Z2 Z3 Y 1 Z2 Z3 → Y 1 Y 2 Z3 Y 1 Y 2 Z3 → Y 1 Y 2 Y 3 Y 4 Y 5 Diese Produktionen zerfallen in drei Gruppen: erst werden die Xi ’s nacheinander in Zi ’s umgewandelt, dann die Zi ’s bis auf das letzte in Yi ’s, und schließlich das letzte Zi in einen Block von Yi ’s. Man kann sich leicht u ¨berlegen, dass diese Produktionsfolge in einer legalen Ableitung zu nichts anderem benutzt werden kann als um X1 X2 X3 in Y1 Y2 Y3 Y4 Y5 zu transformieren. Das liegt daran, dass die Zwischenergebnisse“ alle mindestens eine ” der Zi -Variablen enthalten, die man nur wieder loswerden kann, wenn man die Folge von Produktionen exakt in der vorgesehenen Reihenfolge durchf¨ uhrt. Im allgemeinen Fall hat man eine Produktion X1 · · · Xn → Y1 · · · Ym mit m ≥ n, und dasselbe Vorgehen funktioniert. In der Produktionenmenge P 00 im Beispiel 3.1.9 ist nur die Produktion CDb → Db C nicht kontextsensitiv. Sie wird eine Folge von Produktionen ersetzt. Insgesamt ergibt sich die folgende kontextsensitive Grammatik f¨ ur die Sprache L(G) = {an bn cn | n ≥ 0}.
92
G0 = (V 0 , Σ, S, P 0 ) mit V 0 = {S, A, C, Da , Db , Dc , Z1 , Z2 }; die Menge P 0 der Produktionen ist: S S S A A CDb Z1 D b Z1 Z2 D b Z2 CDc Da Db Dc
→ → → → → → → → → → → → →
ε Da Db Dc Da ADb Dc Da ACDb Da CDb Z1 D b Z 1 Z2 D b Z2 Db C Dc Dc a b c
Die n¨achste Definition ist grundlegend f¨ ur den Rest der Vorlesung. 3.1.10 Definition (a) Sei G = (V ; Σ, S, P ) eine Grammatik. Eine Produktion l → r heißt kontextfrei , wenn l ∈ V (und r ∈ (V ∪ Σ)∗ beliebig) ist. Eine kontextfreie Produktion hat also das Format A → α, A ∈ V , α ∈ (V ∪ Σ)∗ . (Beachte: Kontextfreie Produktionen, deren rechte Seite nicht ε ist, sind ein Spezialfall von kontextsensitiven Produktionen. Man kann l = A durch r ersetzen, ganz egal wo und in welchem Wort A vorkommt. Erst hier wird der Grund f¨ ur die Bezeichnung Variable“ ” richtig klar: f¨ ur jede Variable kann (und muss) etwas anderes eingesetzt werden, damit sich schließlich ein Wort aus Terminalzeichen ergibt.) (b) Eine Grammatik G heißt kontextfrei , wenn alle ihre Produktionen kontextfrei sind. Kontextfreie Grammatiken heißen auch Chomsky-2-Grammatiken oder Typ-2Grammatiken. (c) Eine Sprache L heißt kontextfrei (oder Typ-2-Sprache oder Chomsky-2-Sprache), falls L = L(G) f¨ ur eine kontextfreie Grammatik G gilt. L2 ist die Klasse aller kontextfreien Sprachen. Notation: Besonders bei kontextfreien Sprachen ist es u ¨blich, Produktionen mit derselben Variablen auf der linken Seite zusammenzufassen, wobei das Zeichen | benutzt wird, um die verschiedenen rechten Seiten zu trennen. Statt A → β1 , A → β2 , . . . , A → βs 93
schreibt man also A → β1 | β2 | · · · | βs oder senkrecht: A → | | .. . |
β1 β2 β3 .. . βs
Die Grammatik aus Beispiel 3.1.1 w¨ urde dann also folgendermaßen aussehen:
hfactor i → num | (hexpr i) htermi → htermi * hfactor i | htermi / hfactor i | hfactor i hexpr i → hexpr i + htermi | hexpr i - htermi | htermi 3.1.11 Beispiel (Korrekte Klammerausdru ¨ cke) Wir betrachten die Grammatik G = (V, Σ, S, P ) mit V = {S}, Σ = {0, 1}; P enth¨alt die folgenden Produktionen: (1) S → ε (2) S → SS (3) S → 0S1. Kurz: S → ε | SS | 0S1. Eine Ableitung in dieser Grammatik sieht z. B. aus wie folgt: S ⇒ SS ⇒ SSS ⇒ 0S1SS ⇒ 01SS ⇒ 01S0S1 ⇒ 01S00S11 ⇒ 0100S11 ⇒ 010011 ∈ Σ∗ . Ersetzt man 0 durch (“ und 1 durch )“, ist dies das Wort ()(()). Tats¨achlich kann man ” ” zeigen, dass L(G) gerade die Menge kKA aller korrekten Klammerausdr¨ ucke ist; damit ist kKA kontexfrei.
3.1.12 Beispiel Betrachte G = (V, Σ, S, P ) mit V = {S}, Σ = {0, 1}; P enth¨alt die folgenden Produktionen: 94
(1) S → ε (2) S → 0S1. Kurz: S → ε | 0S1. Eine typische Ableitung in dieser Grammatik sieht aus wie folgt: S ⇒ 0S1 ⇒ 00S11 ⇒ 000S111 ⇒ 0000S1111 ⇒ 00001111. Man sieht recht leicht: L(G) = {0n 1n | n ≥ 0}. Wir wissen nach Behauptung 2.4.2(a), dass diese Sprache nicht regul¨ar ist.
3.2
Rechtslineare Grammatiken und regul¨ are Sprachen
Mit kontextfreien Sprachen besch¨aftigen wir uns ausf¨ uhrlich in den beiden folgenden Kapiteln. Wir betrachten zuvor noch einen engeren Grammatiktyp.
3.2.1
Rechtslineare Grammatiken
3.2.1 Definition (a) Sei G = (V, Σ, S, P ) eine Grammatik. Eine Produktion l → r heißt rechtslinear , falls l ∈ V und r = aB f¨ ur a ∈ Σ, B ∈ V oder r = ε ist. ( Auf der ” rechten Seite r steht die Variable rechts.“) Beachte: Rechtslineare Produktionen sind kontextfrei. (b) Eine Grammatik G heißt rechtslinear , wenn alle ihre Produktionen rechtslinear sind (kurz: P ⊆ V × (ΣV ∪ {ε})). Rechtslineare Grammatiken heißen auch Chomsky-3Grammatiken oder Typ-3-Grammatiken. (c) L3 ist die Klasse aller Sprachen L, f¨ ur die gilt: L = L(G) f¨ ur eine rechtslineare Grammatik G. Es ist offensichtlich, dass jede rechtslineare Grammatik G auch kontextfrei ist. Damit haben wir L3 ⊆ L2 . 3.2.2 Beispiel
Die folgende Grammatik ist rechtslinear:
G = ({S, B, C, D}, {1, 2}, S, P ), wo P folgende Produktionen hat: S → 1B , S → 2C , S → ε, B → 1B , B → 2D , B → ε, C → 2D, D → 2D , D → ε. Kurzform: S → 1B | 2C | ε,
B → 1B | 2D | ε, 95
C → 2D,
D → 2D | ε.
Typische Ableitungsfolgen f¨ ur diese Grammatik sind etwa: S ⇒ 1B ⇒ 11B ⇒ 111B ⇒ 1112D ⇒ 11122D ⇒ 111222D ⇒ 111222. S ⇒ 2C ⇒ 22D ⇒ 222D ⇒ 222. In Ableitungen bei rechtslinearen Grammatiken passiert“ immer nur am rechten Ende ” der Satzform etwas, weil dort die einzige Variable der Satzform steht.
3.2.2
¨ Aquivalenz zu regul¨ aren Sprachen
In diesem Abschnitt zeigen wir, dass die Typ-3-Sprachen nichts anderes sind als die regul¨aren Sprachen. Genauer stellt sich heraus, dass rechtslineare Grammatiken eigentlich nur eine andere Schreibweise f¨ ur NFA’s sind. 3.2.3 Beispiel
Es sei M folgender NFA: 1 B
2
1 Start
S
2
D 2
C
2
Man macht sich leicht klar, dass LM = L(ε + 1+ 2∗ + 22+ ) gilt. Wir betrachten zwei Berechnungswege in M : Start
S
Start
S
1
2
1
B
C
2
B
D
1
2
B
2
D
2
D
2
D
D
Diese Berechnungen von M auf Inputs 111222 und 222 vergleiche man mit den beiden in Beispiel 3.2.2 notierten Ableitungen in G. ¨ Die Ahnlichkeit zwischen Berechnungen und Ableitungen ist offensichtlich, und nicht zuf¨allig. Der n¨achste Satz (und sein Beweis) zeigen, dass NFA’s und rechtslineare Grammatiken im wesentlichen nur verschiedene Notationen f¨ ur dasselbe Konzept darstellen.
96
3.2.4 Satz
Sei L ⊆ Σ∗ Sprache. Dann gilt L ∈ L3 ⇔ L ist regul¨ar.
Wir beschreiben die Transformation zwischen rechtslinearer Grammatik G und NFA M zun¨achst anhand von Beispiel 3.2.2. Nat¨ urlich haben beide genau dasselbe (Terminalzeichen)Alphabet Σ = {0, 1}. Die Menge Q = {S, B, C, D} der Zust¨ande in M entspricht der Menge V der Variablen in G. Das Startsymbol S von G entspricht dem Startzustand in M . Im Automatengraphen zu M gibt es zum Beispiel die Kanten S
1
B
B
1
B
Diesen entsprechen die Produktionen S → 1B
und B → 1B.
¨ (Man beachte die graphische Ahnlichkeit!) In dieser Weise kann man jeder Kante im Automatengraphen eine Produktion der Form A → aB zuordnen. Schließlich sind die Zust¨ande S, B und D in M akzeptierend; dem entsprechen die Produktionen S → ε, B → ε und D → ε, mit denen man Ableitungen abschließen kann. Man kann sich dann u ¨berlegen, dass es immer m¨oglich ist, eine Ableitung S ⇒ a1 p 1 ⇒ a1 a2 p 2 ⇒ a1 a2 · · · an p n ⇒ a1 a2 · · · an in der Grammatik zu benutzen, um einen Weg im Automatengraphen vom Startzustand S zu einem akzeptierenden Zustand pn zu finden, der mit a1 , . . . , an beschriftet ist — und umgekehrt. Es folgt der formale Beweis. Beweis (Satz 3.2.4). ⇒“: Sei L = LM f¨ ur einen NFA M = (Q, Σ, q0 , F, δ). Wir setzen G = (V, Σ, S, P ) mit ” V := Q, (dasselbe Σ,) S := q0 und folgenden Regeln in P : q → aq 0 f¨ ur q, q 0 ∈ Q = V, a ∈ Σ, q 0 ∈ δ(q, a). q → ε f¨ ur q ∈ F . Zu zeigen: M akzeptiert w ⇔ w ∈ L(G), f¨ ur w ∈ Σ∗ . Das sieht man so ein: M akzeptiert w = a1 · · · an ⇔ ∃ Zust¨ande p0 , p1 , . . . , pn mit p0 = q0 , pn ∈ F und pi ∈ δ(pi−1 , ai ), 1 ≤ i ≤ n ⇔ ∃ Variable p0 , p1 , . . . , pn mit p0 = S und p 0 ⇒ a1 p 1 ⇒ a1 a2 p 2 ⇒ · · · ⇒ a1 · · · an p n ⇒ a1 · · · an ist Ableitung in G ⇔ a1 · · · an ∈ L(G). 97
⇐“: Gegeben sei eine rechtslineare Grammatik G = (V, Σ, S, P ) mit L = L(G). Wir ” definieren einen NFA M = (Q, Σ, q0 , F, δ) durch: Q := V , (Σ gleich,) q0 := S, F := {A ∈ V | A → ε ist Produktion}, und δ(A, a) := {B | A → aB ist Produktion}. Zu zeigen: M akzeptiert w ⇔ w ∈ L(G). Dazu muss man nur beobachten, dass die Definition des NFA M genau die Umkehrung der Definition der Grammatik G von oben ist. Damit folgt die behauptete Gleichheit der Sprachen aus dem obigen Beweis. Wir haben also: L3 ⊆ L2 (denn jede rechtslineare Grammatik ist kontextfrei) und L3 6= L2 , denn die Sprache {0n 1n | n ≥ 0} ist nicht regul¨ar, wohl aber kontextfrei (Beispiel 3.1.12). Die Chomsky-Hierarchie: L3 ⊆ L2 ⊆ L1 ⊆ L0 In Worten: F¨ ur Sprachen L gelten die folgenden drei Implikationen: L regul¨ar ⇒ L kontextfrei ⇒ L kontextsensitiv ⇒ L rekursiv aufz¨ahlbar Wir haben hier schon notiert, dass L2 ⊆ L1 gilt, was nicht offensichtlich ist und erst sp¨ater bewiesen wird. Sp¨ater werden wir auch sehen, dass L2 ( L1 ( L0 gilt, die Sprachklassen in der Chomsky-Hierarchie also eine echte Hierarchie bilden.
3.2.3
Linkslineare Grammatiken
Es ist nat¨ urlich, sich zu fragen, welche Sprachklasse man erh¨alt, wenn man nicht rechtslineare Produktionen A → aB, sondern linkslineare“ A → Ba betrachtet. Es sollte keine ” ¨ große Uberraschung sein, dass man auch hier wieder die regul¨aren Sprachen bekommt. Dies wollen wir in diesem Abschnitt u ¨berlegen. 3.2.5 Definition (a) Eine Produktion A → r heißt linkslinear , falls r = ε oder r = Ba f¨ ur eine Variable B ∈ V und einen Buchstaben a ∈ Σ. (b) Eine Grammatik heißt linkslinear, falls alle ihre Produktionen linkslinear sind.
98
3.2.6 Beispiel G = (V, Σ, S, P ) mit V = {S, A, B}, Σ = {0, 1}, Startsymbol S und P mit den Produktionen S → A0, A → A0 | A → B1, B → ε. Eine typische Ableitungsfolge in dieser Grammatik sieht so aus: S ⇒ A0 ⇒ A00 ⇒ A000 ⇒ B1000 ⇒ 1000. Man sieht leicht, dass L(G) = L(10+ ) gilt.
3.2.7 Behauptung Es sei G = (V, Σ, S, P ) eine linkslineare Grammatik und L = L(G) die von G erzeugte Sprache. Dann gilt: (a) Es gibt eine rechtslineare Grammatik G0 = (V, Σ, S, P 0 ) mit LR = L(G0 ). (b) Es gibt einen NFA M f¨ ur LR ; es gibt einen NFA M 0 f¨ ur L = (LR )R mit |V | + 1 Zust¨anden. (Insbesondere ist L regul¨ar.) (c) Es gibt eine rechtslineare Grammatik G00 = (V 00 , Σ, S 00 , P 00 ) f¨ ur L mit |V 00 | = |V | + 1. Wir wollen die Punkte (a) bis (c) parallel zum Beweis an folgendem Beispiel durchgehen: G = (V, Σ, C, P ) mit V = {A, B, C} Σ = {0, 1} Startsymbol: S = C P enth¨alt die Produktionen C → B0 | B1 , B → A0 , A → ε | A0 | A1 . (G erzeugt die W¨orter aus {0, 1}∗ , deren vorletztes Zeichen eine Null ist. Dies impliziert, dass diese W¨orter mindestens die L¨ange 2 haben m¨ ussen.) (a) Konstruktion von GR mit L(GR ) = LR : G A → Ba A→ε S
GR A → aB A→ε = S
Am Beispiel: GR hat folgende Produktionen: C → 0B | 1B , B → 0A , A → ε | 0A | 1A. Es ist leicht zu sehen, dass L(GR ) = L(G)R ist. (GR erzeugt die W¨orter aus {0, 1}∗ , deren zweites Zeichen eine Null ist.) (b) NFA-Konstruktion: Nach Satz 2.2.3 existiert ein NFA M R mit L(GR ) = LM R . 99
Aus M R konstruiere den Umkehr-NFA“ M 0 mit L(M 0 ) = (LM R )R , gem¨aß 1.5.7. ” Wir wissen, dass M 0 so gew¨ahlt werden kann, dass die Zustandszahl h¨ochstens um 1 steigt, also h¨ochstens |V | + 1 Zust¨ande erzeugt werden. Am Beispiel: M R: Start
C
0,1
B
0
0,1
A 0,1
M’:
C
0,1
B
0
A
Start
LM 0 = (LM R )R = L(GR )R = (L(G)R )R = L(G). (c) Konstruktion von G00 mit L(G00 ) = L: Aus M 0 l¨asst sich nun nach Satz 2.2.3 eine rechtslineare Grammatik G00 derart gewinnen, dass L(G00 ) = LM 0 = L(G) ist. Die dort angegebene Konstruktion liefert f¨ ur unser Beispiel die folgende Grammatik G00 = (V 00 , Σ, S 00 , P 00 ): V 00 = {A, B, C} S 00 = A P 00 enth¨alt: A → 0A | 1A | 0B , B → 0C | 1C , C → ε
Fazit: Ist G eine linkslineare Grammatik, so ist L(G) regul¨ar. Genauer gilt: Zu jeder linkslinearen Grammatik G = (V, Σ, S, P ) existiert eine ¨aquivalente rechtslineare Grammatik G0 = (V 0 , Σ, S, P 0 ) mit |V 0 | ≤ |V | + 1 und V ⊆ V 0 . Warnung: Mischen der beiden Produktionstypen rechtslinear“ und linkslinear“ f¨ uhrt ” ” zu linearen Grammatiken“, die aus der Klasse L3 der regul¨aren Sprachen hinausf¨ uhren. ” Zum Beispiel betrachte man die Grammatik G = (V, Σ, S, P ) mit V = {S, B}, Σ = {a, b} und P mit den Produktionen S → aB | ε, B → Sb. P enth¨alt nur linkslineare und rechtslineare Produktionen, aber L(G) = {an bn | n ≥ 0} 6∈ L3 .
100
Kapitel 4 Kontextfreie Grammatiken und kontextfreie Sprachen In diesem Kapitel untersuchen wir die im vorigen Kapitel definierte Sprachklasse L2 genauer. Diese Klasse (und besonders noch engere Teilklassen davon) spielt eine zentrale Rolle bei der Spezifikation von Programmiersprachen und der Konstruktion von Compilern f¨ ur Programmiersprachen.
4.1
Beispiele und Ableitungen
Wir wiederholen Definition 3.1.10: Eine kontextfreie Grammatik G besteht aus der Menge V der (syntaktischen) Variablen, einem Terminalzeichen-Alphabet Σ, einem Startsymbol S ∈ V und der Menge P der Produktionen, wobei jede Produktion in P die Form A → X1 · · · Xr , A ∈ V, X1 , . . . , Xr ∈ V ∪ Σ hat. (Elemente von V ∪ Σ bezeichnen wir mit X, Y, Z, Xi , Yi , Zi , usw.) Man erinnere sich auch an die Konvention, statt A → β1 , A → β2 , . . . , A → βs kurz A → β1 | β2 | · · · | βs zu schreiben. Wir haben schon mehrere Beispiele f¨ ur kontextfreie Grammatiken gesehen: (a) Beispiel 3.1.1 sollte arithmetische Ausdr¨ ucke mit den vier Grundoperationen, Klammerung und der Priorit¨atsregel Punkt vor Strich“ beschreiben. ”
101
(b) Bei Beispiel 3.1.11 sollte, so wurde behauptet, mit den drei Produktionen S → ε | SS | 0S1 die Menge kKA der korrekten Klammerausdr¨ ucke beschrieben werden. (Diese Sprache wird in Definition A.2.6 im Anhang definiert.) (c) In Beispiel 3.1.12 sollten die beiden Produktionen S → ε | 0S1 die Sprache {0n 1n | n ≥ 0} beschreiben. Wir erinnern uns weiter an den Ableitungs-Kalk¨ ul. (Siehe Definition 3.1.3(c).) Wenn α = Y 1 · · · Y s A Z1 · · · Zt (mit Y1 , . . . , Ys , Z1 , . . . , Zt ∈ V ∪ Σ), und A → X1 · · · Xr eine Produktion in P ist, dann kann man aus α in einem Schritt α0 = Y1 · · · Ys X1 · · · Xr Z1 · · · Zt ableiten; man schreibt α ⇒ α0 . ∗
Dann betrachtet man Ketten von Ableitungsschritten und schreibt α ⇒ α0 , wenn es eine Folge α = α0 ⇒ α1 ⇒ · · · ⇒ αt , t ≥ 0 , von Ableitungsschritten gibt. Die W¨orter α ∈ (V ∪ Σ)∗ , die man auf diese Weise aus S erzeugen kann, heißen Satzformen in G. D. h.: α ∈ (V ∪ Σ)∗ ist Satzform in G ⇔ es existiert eine Folge S = α0 ⇒ α1 ⇒ · · · ⇒ αt = α, mit t ≥ 0. Satzformen in Beispiel 3.1.1 sind z. B. die Zwischenw¨orter“, die in der in diesem Beispiel ” angegebenen Ableitung auftreten, also hexpr i , htermi , htermi / hfactor i , htermi / (hexpr i) , htermi / (hexpr i - htermi) , hfactor i / (hexpr i - htermi) , num / (hexpr i - htermi) und so weiter. Keine Satzformen sind (hexpr i / hexpr i)(htermi / hexpr i) und -htermi . In Beispiel 3.1.11 sind z. B. die folgenden W¨orter Satzformen (pr¨ ufen!): S , 0S1 , 01 , SS , 0S1S , 01S , 01SS , 01S0S1 , 010S1S , 0101S , 0101 , 01S01 , 0100S110S1 , 0100110S1 , 01001101 . 102
Keine Satzformen sind 1S0 , S0S , 0S0S1, und so weiter. Sehr n¨ utzlich f¨ ur den Nachweis, dass etwas keine Satzform ist, ist der Umstand, dass man das Konzept der Satzformen auch als induktive Definition fassen kann, vgl. Anhang A.2: (i) S ist Satzform in G; (ii) wenn α = Y1 · · · Ys A Z1 · · · Zt Satzform in G ist und A → X1 · · · Xr eine Produktion in P , dann ist auch α0 = Y1 · · · Ys X1 · · · Xr Z1 · · · Zt eine Satzform in G. (iii) Nichts sonst ist Satzform in G. ¨ Die Aquivalenz der beiden Formulierungen ist nicht schwer nachzuweisen. (Der Leser ist ¨ eingeladen, dies als Ubung zu beweisen.) Wir benutzen diejenige der beiden Formulierungen, die bequemer ist. Induktion u ¨ber den Aufbau von Satzformen“ ist oft hilfreich, um ” nachzuweisen, dass alle Satzformen eine bestimmte Eigenschaft haben. In Beispiel 3.1.1 kann man z. B. mit einer solchen Induktion leicht zeigen, dass keine Satzform mit -“ ” beginnt. Daher kann - htermi keine Satzform sein. Mit derselben Methode kann man beweisen, dass in keiner Satzform eines der W¨orter )hexpr i , )htermi , )hfactor i oder )( als Teilwort vorkommen kann. Daher kann (hexpr i / hexpr i)(htermi / hexpr i) keine Satzform sein. Unter den Satzformen zu einer Grammatik G interessieren uns besonders diejenigen, die keine Variable enthalten. In Beispiel 3.1.11 sind dies z. B. 01, 0101 und 01001101. Die Menge L(G) = {w ∈ Σ∗ | w ist Satzform von G} ist die von G erzeugte Sprache. Also: w ist in L(G) ⇔ w ∈ Σ∗ und es gibt eine Ableitung S = α0 ⇒ α1 ⇒ · · · ⇒ αt = w. Achtung: Wenn die Grammatik G mehr als eine Variable benutzt, hat die Menge L(G) normalerweise keine einfache induktive Definition. 4.1.1 Beispiel Sei G = (V, Σ, S, P ), wo V = {S}, Σ = {0, 1}, und P enth¨alt die Produktionen S → 0S0, S → 1S1, S → 0, S → 1, S → ε, oder k¨ urzer: S → 0S0 | 1S1 | 0 | 1 | ε.
103
Ableitungen in der Grammatik G sehen beispielsweise so aus: S ⇒ ε ; S ⇒ 0S0 ⇒ 01S10 ⇒ 01110 ; S ⇒ 1S1 ⇒ 11S11 ⇒ 110S011 ⇒ 110011 .
4.1.2 Proposition
F¨ ur die Grammatik G aus Beispiel 4.1.1 gilt L(G) = {w ∈ {0, 1}∗ | w = wR }.
D. h.: L(G) ist die Sprache der Spiegelw¨ orter ( Palindrome“) u ¨ber {0, 1}. ” Ein Palindrom sieht von vorne und hinten gelesen gleich aus. Palindrome u ¨ber dem 26buchstabigen lateinischen Alphabet sind zum Beispiel ara, elle, hannah, reliefpfeiler, sinnlosolnnis, ε . (Wie sieht eine kontextfreie Grammatik f¨ ur die Menge der Palindrome u ¨ber {a, . . . , z} aus? Wie die f¨ ur die Palindrome u ¨ber einem beliebigen vorgegebenen Alphabet Σ?) Beweis von Proposition 4.1.2: ¨ (Dieser Beweis ist als (Ubungs-)Beispiel daf¨ ur zu verstehen, wie man das intuitiv Naheliegende formal exakt fassen kann.) ⊆“: (Typisch: Durch Induktion u ¨ber den Aufbau der Satzformen beweist man eine Eigen” schaft aller Satzformen. Diese wird dann benutzt, um eine Eigenschaft aller ableitbaren W¨orter w ∈ Σ∗ zu zeigen.) Behauptung: Ist α eine Satzform in G, so gilt entweder (I) α = wSwR f¨ ur ein w ∈ Σ∗ oder (II) α = w ∈ Σ∗ mit w = wR . (Aus dieser Behauptung folgt sofort, dass jedes in G ableitbare Wort w ∈ Σ∗ die Eigenschaft w = wR hat.) I.A.: α = S: S = εSεR , also Format (I). I.V.: Die Behauptung gilt f¨ ur α. I.S.: Sei α0 aus der Satzform α durch einen Ableitungsschritt gewonnen. Dann muss α mindestens eine Variable enthalten, also gilt nach der I.V.: α = wSwR f¨ ur ein w ∈ Σ∗ . Nun gibt es drei F¨alle. 1. Fall : Es wird die Produktion S → ε angewendet, um von α nach α0 zu kommen. Dann ist α0 = wwR , und es gilt (wwR )R = (wR )R wR = wwR . Also gilt (II) f¨ ur α 0 .
104
2. Fall : Es wird eine Produktion S → a, a ∈ {0, 1} angewendet, um von α nach α0 zu kommen. Dann ist α0 = wawR , und es gilt (wawR )R = (wR )R aR wR = wawR . Also gilt (II) f¨ ur α 0 . 3. Fall : Es wird eine Produktion S → aSa, a ∈ {0, 1}, angewendet, um von α nach α0 zu kommen. Dann ist α0 = waSawR , und es gilt (waSawR )R = (wR )R aSawR = waSawR . Also gilt (I) f¨ ur α 0 . In jedem Fall hat auch α0 Format (I) oder (II). ⊇“: (Typisch: Durch Induktion u ¨ber die Wortl¨ange zeigt man, dass gewisse W¨orter u ¨ber ” Σ Satzformen darstellen, also in L(G) liegen.) Durch Induktion u ¨ber die Wortl¨ange |w| zeigen wir: (+)
Ist w = wR , so ist w ∈ L(G), f¨ ur alle w ∈ Σ∗ .
I.A.: w = ε, 0, oder 1. Dann gilt w ∈ L(G), weil S ⇒ ε, S ⇒ 0, S ⇒ 1 Ableitungen sind. I.V.: k ≥ 2, und f¨ ur alle w0 mit |w0 | < k gilt (+). I.S.: Sei w ein Palindrom mit |w| = k. Weil |w| ≥ 2, ist w = aw0 a f¨ ur ein a ∈ {0, 1} und 0 ∗ 0 0 R 0 ein w ∈ Σ . Offenbar gilt w = (w ) und |w | < k. Nach I.V. ist also w0 eine Satzform in G. Das heißt: Es existiert eine Ableitung S ⇒ α1 ⇒ · · · ⇒ αr ⇒ w0 f¨ ur w0 , mit r ≥ 0. Damit ist S ⇒ aSa ⇒ aα1 a ⇒ · · · ⇒ aαr a = aw0 a Ableitung f¨ ur aw0 a, also w = aw0 a ∈ L(G). Damit ist Proposition 4.1.2 bewiesen.
¨ Wir bemerken, dass nach einer Ubungsaufgabe die Sprache {w ∈ Σ∗ | w = wR } nicht regul¨ar ist. Also sehen wir hier nochmals, dass L3 6= L2 ist. Nun wollen wir mit derselben Methode nachweisen, dass die Grammatik G = (V, Σ, S, P ) aus Beispiel 3.1.11, mit V = {S}, Σ = {0, 1}, und Produktionen S → ε | SS | 0S1, die Menge kKA der korrekten Klammerausdr¨ ucke erzeugt, siehe Definition A.2.6. Als Vorbereitung beweisen wir eine flache“ Charakterisierung der Elemente von kKA: Ein ” 0-1-Wort w ist ein korrekter Klammerausdruck genau dann wenn w ebenso viele Nullen wie Einsen hat und wenn beim Lesen von w von links nach rechts es niemals vorkommt, dass man mehr Einsen als Nullen gesehen hat. Formal: 4.1.3 Proposition (∗)
Ein Wort w ∈ {0, 1}∗ ist in kKA genau dann wenn
|w|0 = |w|1 und f¨ ur jedes Pr¨afix u von w gilt |u|0 ≥ |u|1 . 105
Beweis: ⇒“: Dies wurde mit Satz A.2.7 und Satz A.2.8 bewiesen. ” ⇐“: Wir zeigen durch Induktion u ullen, zur Menge ¨ber |w|, dass alle W¨orter w, die (∗) erf¨ ” kKA geh¨oren. I.A.: |w| = 0, d. h. w = ε. Dieses Wort geh¨ort zu kKA. I.V.: Sei k ≥ 1, und f¨ ur alle w0 mit |w0 | < k gilt die Behauptung: wenn w0 Bedingung (∗) 0 erf¨ ullt, dann ist w ∈ kKA. I.S.: Es sei w ein Wort u ullt. Weil w gleich viele Einsen ¨ber {0, 1} der L¨ange k, das (∗) erf¨ und Nullen hat, ist k eine gerade Zahl. Wir betrachten den ersten Buchstaben a von w. Wegen Bedingung (∗) ist es nicht m¨oglich, dass a = 1 ist, daher gilt a = 0. Es gibt mindestens ein Pr¨afix v 6= ε von w mit |v|0 = |v|1 , n¨amlich v = w. Wir w¨ahlen als u das k¨ urzeste solche Pr¨afix von w, und schreiben w = uw00 . (Um u zu finden, liest man w von links nach rechts und z¨ahlt dabei mit, welchen Vor” sprung“ die Nullen vor den Einsen in dem bisher gelesenen Pr¨afix haben. Die erste Stelle, wo dieser Vorsprung wieder Null ist, markiert das Ende von u.) Bemerkung: Wenn man 0 als (“ und 1 als )“ interpretiert, sucht man hier die schließende ” ” Klammer, die zu der ersten o¨ffnenden Klammer in w geh¨ort. Beispiele: Wenn w = 000110101011, so ist u = w und w00 = ε. Wenn w = 001001110010110011, so ist u = 00100111 und w00 = 0010110011. In Klammernotation sieht das so aus: In ((( ))( )( )( )) und ((( )))(( )( ))(( )) geh¨oren jeweils offensichtlich“ die fett dargestellten Klammern zusammen. ” Wegen der Wahl von u k¨onnen wir u = 0w0 1 schreiben. Nun weist man folgendes nach: 1. w0 enth¨alt ebenso viele Nullen wie Einsen, und f¨ ur jedes Pr¨afix v von w0 gilt |0v|0 > |0v|1 (sonst h¨atten wir u k¨ urzer gew¨ahlt), also |v|0 ≥ |v|1 . Nach I.V. schließen wir, dass w0 zu kKA geh¨ort. (Man pr¨ ufe an den Beispielen, dass 0011010101 und 0101 korrekte Klammerausdr¨ ucke sind.) 2. w00 enth¨alt ebenso viele Nullen wie Einsen, und f¨ ur jedes Pr¨afix v von w00 gilt: |v|0 = |uv|0 − |u|0 ≥ |uv|1 − |u|0 = |uv|1 − |u|1 = |v|1 . Nach I.V. schließen wir, dass auch w00 zu kKA geh¨ort. (In den Beispielen sind ε und 0010110011 korrekte Klammerausdr¨ ucke.) Damit haben wir: w = 0w0 1w00 , wo w0 , w00 ∈ kKA. Nach Definition A.2.6 gilt dann auch w ∈ kKA, und das ist die Induktionsbehauptung. 4.1.4 Proposition
F¨ ur die Grammatik G aus Beispiel 3.1.11 gilt: kKA = L(G). 106
Beweis: ⊆“: Wir zeigen durch Induktion u ¨ber die Struktur von kKA, dass alle Elemente ” w von kKA in L(G) sind, d. h., eine Ableitung haben. (i) Ist w = ε, so ist S ⇒ ε eine Ableitung von w. Also ist w ∈ L(G). (ii) Ist w = 0u1v, mit u, v ∈ kKA, so gibt es nach I.V. Ableitungen S = α0 ⇒ · · · ⇒ αt = u , , S = β0 ⇒ · · · ⇒ βs = v. Diese k¨onnen wir mit den Anfangsschritten S ⇒ SS ⇒ 0S1S kombinieren, um eine Ableitung S ⇒ SS ⇒ 0S1S = 0α0 1β0 ⇒ · · · ⇒ 0αt 1β0 ⇒ · · · ⇒ 0αt 1βs = 0u1v = w f¨ ur w zu erhalten. Also ist w ∈ L(G). ¨ (Ubung: Man benutze diese Strategie, um f¨ ur das Wort 010010101011 eine Ableitung in G zu finden.) ⊇“: Wir beweisen die folgende Hilfsbehauptung (HB) u ¨ber Satzformen α in G: ” (HBα )
|α|0 = |α|1 und jedes Pr¨afix γ von α erf¨ ullt |γ|0 ≥ |γ|1 .
Der Beweis erfolgt durch Induktion u ¨ber den Aufbau von Satzformen. I.A.: Wenn α = S, so ist (HBα ) erf¨ ullt, weil S keine Nullen oder Einsen enth¨alt. I.V.: α = β S ζ erf¨ ullt (HBα ). I.S.: Betrachte die Satzformen, die aus α in einem Schritt erzeugt werden k¨onnen, indem man auf das S zwischen β und ζ eine Produktion anwendet. Es gibt zwei F¨alle: 1. Fall : α0 = β SS ζ. (HBα0 ) folgt unmittelbar aus (HBα ), da sich an der Verteilung von Nullen und Einsen nichts ¨andert. 2. Fall : α0 = β 0S1 ζ. Hier erh¨oht sich die Gesamtzahl von Nullen und Einsen um jeweils 1, also folgt |α0 |0 = |α0 |1 aus der I.V. Nun betrachten wir Pr¨afixe: F¨ ur ein Pr¨afix γ 0 von α0 gibt es verschiedene M¨oglichkeiten. Wenn γ 0 Pr¨afix von β ist, besagt die I.V. direkt, dass |γ 0 |0 ≥ |γ 0 |1 . Weil nach I.V. |β|0 ≥ |β|1 , folgt auch |β0|0 ≥ |β0|1 , |β0S|0 ≥ |β0S|1 und |β0S1|0 ≥ |β0S1|1 . Schließlich k¨onnte γ 0 = β0S1ζ 0 f¨ ur ein Pr¨afix ζ 0 von ζ sein. Dann 0 0 liefert die I.V., dass |βζ |0 ≥ |βζ |1 gilt; daraus folgt sofort |β0S1ζ 0 |0 ≥ |β0S1ζ 0 |1 , weil sich auf beiden Seiten die Anzahl der Nullen und Einsen um 1 erh¨oht. Nach dem Prinzip der Induktion u ¨ber den Aufbau von der Satzformen in G folgt, dass (HBα ) f¨ ur alle Satzformen in G gilt. Da jedes Wort w ∈ L(G) (auch) Satzform ist, erf¨ ullt jedes w ∈ L(G) Bedingung (∗) in Proposition 4.1.3, ist also in kKA.
107
4.2
Ableitungsb¨ aume, Linksableitungen, Rechtsableitungen
Wir haben bislang Ableitungen als Folgen S ⇒ α1 ⇒ · · · ⇒ αr in (V ∪ Σ)∗ dargestellt. Im Fall der kontextfreien Grammatiken bietet es sich jedoch an, Ableitungen als B¨ aume darzustellen. Diese Syntaxb¨ aume“ oder Ableitungsb¨ aume“ sind wichtiges Hilfmittel ” ” und Zwischenergebnis bei der Analyse von Programmtexten durch einen Compiler. 4.2.1 Beispiel
Wir betrachten wieder die Grammatik G mit Produktionen S → ε | SS | 0S1
aus Beispiel 3.1.11. Folgendes ist eine Ableitung in dieser Grammatik: S ⇒ SS ⇒ SSS ⇒ S0S1S ⇒ S01S ⇒ 0S101S ⇒ 0S101S ⇒ 0101S ⇒ 0101 . (In jedem Schritt haben wir die Kopie von S, auf die eine Produktion angewandt wird,
T : 2
T : 1
T : 0
T : 4
T : 3 S
S
S
S_ S_
S
S S_
T : 5
S
S
S_
1
0
T : 6 S
S
S
1
0
S
1
0
S ε
S
0
ε
S
S S_
S
1
S
1
S
S S
S
ε
T : 7 S
S
S
S 0
S_
S_
S
S
S
0
S
S
1
0
S
S
ε
ε
S
S
1
0
S
1
ε
ε
Abbildung 4.1: Schrittweiser Aufbau eines Ableitungsbaums unterstrichen.) Aus einer solchen Ableitung α0 ⇒ · · · ⇒ αt bauen wir schrittweise B¨aume 108
T0 , . . . , Tt , wie folgt. Baum T0 ist ein Knoten, der mit S beschriftet ist. Nach Abarbeiten der Ableitungsschritte α0 ⇒ · · · ⇒ αs , s ≤ t, haben wir einen Baum Ts , an dessen Bl¨attern, von links nach rechts gelesen, die Buchstaben der Satzform αs stehen. Im Schritt αs ⇒ αs+1 wird eine der Produktionen S → ε, S → SS, S → 0S1 auf eine der Variablen angewendet, die in einem Blatt steht. An dieses Blatt h¨angen wir einen, zwei oder drei neue Knoten, die mit ε oder den Buchstaben in der rechten Seite der benutzten Produktion beschriftet werden. Wenn s = t, sind wir fertig, und Tt ist der Ableitungsbaum“ zu ” α0 ⇒ · · · ⇒ αt . Aus der Beispielableitung ergibt sich die in Abb. 4.1 dargestellte Folge von Ableitungsb¨aumen. Aus der Ableitung S ⇒ SS ⇒ SSS ⇒ 0S1SS ⇒ 0S1S ⇒ 01S ⇒ 010S1 ⇒ 0101 f¨ ur dasselbe Terminalzeichenwort erhalten wir am Ende denselben Baum wie in Abb. 4.1. (Der Leser/die Leserin ist eingeladen, die entsprechende Folge aufzuzeichnen und sich zu u ¨berzeugen, dass eigentlich dieselben Ableitungsschritte vorgenommen werden, nur in einer anderen Reihenfolge.) Dagegen ergibt die Ableitung S ⇒ SS ⇒ SSS ⇒ SS ⇒ 0S1S ⇒ 01S ⇒ 010S1 ⇒ 0101 , die dasselbe Wort erzeugt, den in Abb. 4.2 dargestellten Baum, der eine andere Struktur hat. S
S
S
S ε
S
0
0
S
1
S
1
ε
ε
Abbildung 4.2: Ein zweiter Ableitungsbaum f¨ ur 0101
Als weiteres Beispiel betrachten wir Ableitungsb¨aume zur Grammatik aus Beispiel 3.1.1. In den Abbildungen haben wir die Knoten, die syntaktischen Variablen entsprechen, einfach durch den Namen der Variablen dargestellt; nur Terminalzeichen sind als Kreis dargestellt. Abbildung 4.3 zeigt einen Ableitungsbaum f¨ ur das Wort ( num - num * num / num ) / num + num * num / num - num 109
<expr>
+
/
(
<expr>
−
num
)
<expr>
*
−
num
num
*
/
num
<expr>
<expr>
num
num
num
num
/
num
Abbildung 4.3: Ableitungsbaum f¨ ur ( num - num * num / num ) / num + num * num / num - num ur Abbildung 4.4 einen f¨ num - num - num - num * num . In Abbildung 4.5 sieht man einen Ableitungsbaum, in dem manche Bl¨atter mit Variablen beschriftet sind, der also eine Satzform liefert und noch weiter ausgebaut werden k¨onnte. Wir definieren nun formal, was Ableitungsb¨aume sein sollen. 4.2.2 Definition
Sei G = (V, Σ, S, P ) eine kontextfreie Grammatik.
(a) Ein Ableitungsbaum (auch: Syntaxbaum) T ist ein gerichteter, geordneter1 Baum mit Wurzel, dessen Knoten mit je einem Buchstaben aus V ∪ Σ oder mit ε beschriftet sind, wobei folgendes gilt: 1
Ein Baum heißt geordnet, wenn die unmittelbaren Nachfolgerknoten eines Knotens eine Reihenfolge von links nach rechts“ haben. ”
110
<expr>
num
−
<expr>
−
<expr>
num
num
−
<expr>
num
*
num
Abbildung 4.4: Ableitungsbaum f¨ ur num - num - num - num * num (I) Die Wurzel ist mit S beschriftet, (II) Ist v ein Knoten, der mit a ∈ Σ oder mit ε beschriftet ist, so ist v ein Blatt, hat also keine Nachfolgerknoten. (III) Ist v ein Knoten, der mit A ∈ V beschriftet ist, und ist v kein Blatt, so gilt: (i) die Nachfolgerknoten v1 , . . . , vr von v sind mit X1 , . . . , Xr ∈ Σ ∪ V beschriftet, und A → X1 · · · Xr ist Produktion in P oder (ii) v hat genau einen Nachfolger v 0 , der mit ε beschriftet ist, und A → ε ist Produktion in P . (b) Ist T ein Ableitungsbaum, so bezeichnen wir mit α(T ) das Wort u ¨ber V ∪ Σ, das sich beim Lesen der Bl¨atter von T von links nach rechts ergibt. (Das Wort α(T ) heißt manchmal Ergebnis“ oder Resultat“ von T (engl. yield ), manch” ” mal auch das Blattwort“ von T .) ” 111
<expr>
+
/
<expr>
−
*
num
/
<expr>
num
Abbildung 4.5: Ableitungsbaum f¨ ur eine Satzform In den B¨aumen in Abb. 4.1 sind die W¨orter α(T0 ), . . . , α(T7 ) einfach die Satzformen in der zugrunde liegenden Ableitung. Im Baum in Abb. 4.2 ist α(T ) = 0101. Bei der Bestimmung von α(T ) werden ε’s nat¨ urlich einfach verschluckt. Im Extremfall sind alle Bl¨atter von T mit ε beschriftet; dann ist α(T ) = ε. Ein Beispiel f¨ ur diese Situation ist f¨ ur die Grammatik aus Beispiel 4.2.1 in Abb. 4.6 angegeben. S
S
S ε
S
S S
S
ε
ε
S
S
ε
ε
Abbildung 4.6: Ein Ableitungsbaum f¨ ur ε Wenn X ∈ V ∪ Σ beliebig ist, ist ein X-Ableitungsbaum genauso definiert wie in Definition 4.2.2, außer dass man verlangt, dass die Beschriftung der Wurzel X ist. Zum Beispiel ist in Abb. 4.3 der linke Unterbaum der Wurzel ein htermi-Ableitungsbaum T 0 mit Ergebnis α(T 0 ) = ( num - num * num / num ) / num. X-Ableitungsb¨aume werden schematisch so gezeichnet: 112
X T α(T ) Wir halten fest, dass Ableitungsb¨aume tats¨achlich dasselbe leisten wie Ableitungsfolgen. 4.2.3 Lemma Sei G kontextfreie Grammatik. Dann sind f¨ ur X ∈ V ∪ Σ und α ∈ ∗ (V ∪ Σ) die folgenden beiden Aussagen ¨aquivalent: ∗
(i) X ⇒ α; (ii) α = α(T ) f¨ ur einen X-Ableitungsbaum T . Insbesondere gilt: α ist Satzform von G genau dann wenn es einen (S-)Ableitungsbaum T mit α(T ) = α gibt; und w ∈ L(G) ⇔ w ∈ Σ∗ und es gibt einen Ableitungsbaum T mit α(T ) = w. Beweis (i) ⇒ (ii)“: Sei X = α0 ⇒ · · · ⇒ αr = α Ableitung in G. Wir formulieren ” die in 4.2.1 angewandte induktive Methode, aus einer Ableitung schrittweise einen Baum zu konstruieren, allgemein. Die Wurzel ist ein Knoten, der mit X = α0 beschriftet ist. Sei nun 0 ≤ s < r. Als Induktionsvoraussetzung nehmen wir an, wir h¨atten schon einen X-Ableitungsbaum Ts f¨ ur αs = X1 · · · Xt , d. h. X1 , . . . , Xt sind die von ε verschiedenen Eintr¨age an den Bl¨attern von Ts . Es gibt dann t0 ∈ {1, . . . , t} und Y1 · · · Yu derart, dass Xt0 → Y1 · · · Yu eine Produktion ist und αs = X1 · · · Xt0 · · · Xt ⇒ X1 · · · Xt0 −1 Y1 · · · Yu Xt0 +1 · · · Xt = αs+1 der n¨achste Ableitungsschritt ist. Der Knoten zu Xt0 in Ts erh¨alt u Nachfolgerknoten, die mit Y1 , . . . , Yu beschriftet werden. Offenbar ist der resultierende Baum Ts+1 wieder ein X-Ableitungsbaum, und α(Ts+1 ) = αs+1 . Ist u = 0, erh¨alt der Knoten zu Xt0 einen Nachfolger mit Markierung ε. Das Konstruktionsschema ist in Abb. 4.7 wiedergegeben.
113
Ts :
Ts + 1:
X
X1 ... X t’ ... X t
X
X1 ... X t’ ... X t ...
Y1 ... ... Yu Abbildung 4.7: Konstruktion eines Ableitungsbaumes, ein Schritt Nach r Schritten ergibt sich ein Baum Tr mit α(Tr ) = αr = α. (ii) ⇒ (i)“: Es sei ein X-Ableitungsbaum T gegeben. Durch Induktion nach der Tiefe k ” ∗ von T zeigen wir, dass X ⇒ α(T ) gilt. 0
k = 0: Hat T nur einen Knoten, die Wurzel, so ist α(T ) = X, und X ⇒ X ist Ableitung. k > 0: Ist T ein Baum, der nicht nur aus der Wurzel besteht, so muss die Wurzelbeschriftung X eine Variable A ∈ V sein. Falls die Wurzel nur einen, mit ε beschrifteten, Nachfolger besitzt, ist α(T ) = ε; dann muss aber A → ε Produktion sein, also A ⇒ ε Ableitung. Sonst hat die Wurzel r ≥ 1 Nachfolger v1 , . . . , vr , die mit X1 , . . . , Xr ∈ V ∪ Σ beschriftet sind. Der i-te Unterbaum Ti (mit Wurzel vi ) ist Xi -Ableitungsbaum, f¨ ur 1 ≤ i ≤ r, jeweils mit Tiefe kleiner als k. Nach Induktionsvoraussetzung gilt ∗
Xi ⇒ α(Ti ) , f¨ ur 1 ≤ i ≤ r . Durch Zusammensetzen dieser r Ableitungen erhalten wir die Ableitung ∗
∗
∗
X ⇒ X1 X2 · · · Xr ⇒ α(T1 )X2 · · · Xr ⇒ α(T1 )α(T2 )X3 · · · Xr ⇒ · · · ∗
⇒ α(T1 ) · · · α(Tr ) = α(T ) . Beispiel:
Wir wollen aus dem Baum S
S
S
S ε
S
0
S
0
1
ε
0
S
S ε
114
1
1
zu der Grammatik aus 4.2.1 eine Ableitung bauen. Zuerst behandeln wir den linken Unterbaum und finden (notfalls durch Anwenden derselben Prozedur auf diesen Unterbaum) die Ableitungsfolge S ⇒ SS ⇒ S ⇒ 0S1 ⇒ 01. Der rechte Unterbaum liefert die Ableitungsfolge S ⇒ 0S1 ⇒ 00S11 ⇒ 0011. Diese beiden Ableitungen werden hintereinandergesetzt“ an den Startschritt S ⇒ SS ” angef¨ ugt — mit der ersten Ableitung wird das erste S“ bearbeitet, mit der zweiten das ” zweite. Dies liefert: S ⇒ SS ⇒ SSS ⇒ SS ⇒ 0S1S ⇒ 01S ⇒ 010S1 ⇒ 0100S11 ⇒ 010011. Folgende Beobachtung ist f¨ ur sp¨ater wichtig: Ableitungsschritte, die zum rechten Unterbaum geh¨oren, werden erst durchgef¨ uhrt, wenn der linke Unterbaum komplett abgearbeitet ist. Dies f¨ uhrt dazu, dass immer die am weitesten links stehende Variable bearbeitet wird. Der Ableitungsbaum T enth¨alt vollst¨andige Information dar¨ uber, durch welche Ableitungsschritte die Satzform α(T ) abgeleitet wird, also auch noch jede Menge Strukturinformation. Einzig von der Reihenfolge der Anwendung der Produktionen wird abgesehen. Deshalb heißen Ableitungsb¨aume auch Syntaxb¨aume oder Strukturb¨aume — sie geben u uglich der Grammatik G ¨ber die Struktur“ oder den Satzbau“ des Wortes α(T ) bez¨ ” ” Auskunft. Diese Eindeutigkeit der verwendeten Produktionen ist bei Ableitungsfolgen nicht unbedingt gegeben; z. B. k¨onnen zur Folge S ⇒ SS ⇒ SSS in der Grammatik von Beispiel 4.2.1 die beiden verschiedenen B¨aume S S
S S
S
S S
S
S S
geh¨oren. Daher zieht man meist Ableitungsb¨aume als Darstellung f¨ ur Ableitungen vor. Oft ist es jedoch n¨ utzlich, eindimensionale (zeigerfreie) Notationen f¨ ur Ableitungsb¨aume zu haben. Diesem Zweck dienen Linksableitungen (bzw. Rechtsableitungen). 4.2.4 Definition Eine Ableitung S = α0 ⇒ α1 ⇒ · · · ⇒ αr = w ∈ Σ∗ (NB: w besteht aus Terminalzeichen) ist eine Linksableitung , wenn f¨ ur 0 ≤ s < r ¨ beim Ubergang von αs zu αs+1 auf die am weitesten links stehende Variable in αs eine Produktion angewendet wird. Mit anderen Worten: In einer Linksableitung gilt f¨ ur jeden Ableitungsschritt Y1 · · · Ys A Z1 · · · Zt ⇒ Y1 · · · Ys X1 · · · Xr Z1 · · · Zt , 115
dass Y1 , . . . , Ys ∈ Σ∗ sind. Rechtsableitungen werden analog definiert: Produktionen werden immer auf die am weitesten rechts stehende Variable angewendet. Beispiel: (Zu Grammatik aus 4.2.1 ) S ⇒ SS ⇒ 0S1S ⇒ 00S11S ⇒ 0011S ⇒ 00110S1 ⇒ 001101 ist Linksableitung, S ⇒ SS ⇒ S0S1 ⇒ S01 ⇒ 0S101 ⇒ 00S1101 ⇒ 001101 ist Rechtsableitung. Die Ableitung S ⇒ SS ⇒ SSS ⇒ S0S1S ⇒ 0S1S ⇒ 0S10S1 ⇒ 010S1 ⇒ 0101 ist weder Links- noch Rechtsableitung. Wenn man weiß, dass eine Ableitung eine Linksableitung (bzw. eine Rechtsableitung) ist, er¨ ubrigt es sich, in αs die Variable zu markieren, auf die eine Produktion angewendet wird — es ist immer die am weitesten links (bzw. rechts) stehende. 4.2.5 Proposition Sei G kontextfreie Grammatik, w ∈ Σ∗ . Dann gilt: Ableitungsb¨aume und Linksableitungen f¨ ur w entsprechen einander eineindeutig. Die entsprechende Aussage gilt f¨ ur Ableitungsb¨aume und Rechtsableitungen. Beispiel: Das Wort 010101 besitzt in der Grammatik aus 4.2.1 die beiden Linksableitungen S ⇒ SS ⇒ 0S1S ⇒ 01S ⇒ 01SS ⇒ 010S1S ⇒ 0101S ⇒ 01010S1 ⇒ 010101, S ⇒ SS ⇒ SSS ⇒ 0S1SS ⇒ 01SS ⇒ 010S1S ⇒ 0101S ⇒ 01010S1 ⇒ 010101, entsprechend den beiden in Abb. 4.8 angegebenen Ableitungsb¨aumen. (Man suche die entsprechenden Rechtsableitungen!) S
S S
S 0
S ε
S
S
1 0
S ε
S 1
0
S
S S
S 1
0
ε
S ε
1
0
S
0 1
S
1
ε
ε
Abbildung 4.8: Zwei verschiedene Ableitungsb¨aume f¨ ur das Wort 010101 116
Beweis von Proposition 4.2.5: Sei w ∈ L(G) fest. Wenn eine beliebige Linksableitung LA f¨ ur w ∈ Σ∗ gegeben ist, so k¨onnen wir wie im Beweisteil (i) ⇒ (ii)“ von Lemma 4.2.3 daraus einen Ableitungsbaum TLA f¨ ur w erzeugen. ” Sind zwei verschiedene Linksableitungen LA1 und LA2 f¨ ur w gegeben, so f¨ uhren diese zu zwei verschiedenen Ableitungsb¨aumen TLA1 und TLA2 . (Man betrachte den ersten Ableitungsschritt, in dem sich LA1 und LA2 unterscheiden. Dabei m¨ ussen auf dieselbe Variable an derselben Position verschiedene Produktionen angewendet werden; dies schl¨agt sich direkt in einem Unterschied in den Syntaxb¨aumen nieder.) Die Abbildung Φ : LA 7→ TLA ist also injektiv. Wenn man nun einen beliebigen Ableitungsbaum T f¨ ur w gegeben hat, so liefert die Konstruktion aus Lemma 4.2.3 (ii) ⇒ (i)“ eine Linksableitung LA(T ) f¨ ur w, und es gilt ” TLA(T ) = T . Damit ist die Abbildung Φ auch surjektiv; sie stellt also eine Bijektion dar. Um diesen Beweis zu illustrieren, wende man die Konstruktionen aus 4.2.3 auf das nach Bemerkung 4.2.5 angegebene Beispiel an. 4.2.6 Definition (a) Eine kontextfreie Grammatik G heißt mehrdeutig , wenn es ein Wort w ∈ L(G) gibt, das (mindestens) zwei verschiedene Ableitungsb¨aume besitzt. Sie heißt eindeutig , wenn jedes Wort w ∈ L(G) genau einen Ableitungsbaum besitzt. (b) Eine Sprache L ∈ L2 heißt inh¨ arent mehrdeutig , wenn jede kontextfreie Grammatik G mit L = L(G) mehrdeutig ist. Es ist f¨ ur die Syntaxanalyse (Konstruktion eines Ableitungs- oder Syntaxbaumes zu einem vorgelegten Wort w ∈ L(G)), wie sie z. B. in Compilern geleistet wird, sehr wichtig, dass jedes Wort w ∈ L(G) nur einen Syntaxbaum, also auch nur eine Linksableitung besitzt. Beim Entwurf von Programmiersprachen ist es also wichtig, eine eindeutige Grammatik f¨ ur die Sprache zu haben. Insbesondere ist es ung¨ unstig, wenn die Programmiersprache selbst inh¨arent mehrdeutig ist. ur kKA ist mehrdeutig, wie wir 4.2.7 Beispiel (a) Die Grammatik aus Beispiel 4.2.1 f¨ an den in Abb. 4.1 und 4.2 dargestellten verschiedenen Ableitungsb¨aumen f¨ ur das Wort 0101 erkennen k¨onnen. Dennoch ist die Sprache kKA nicht inh¨arent mehrdeutig, da sie auch eine eindeutige Grammatik besitzt. Wir behaupten n¨amlich, und beweisen gleich, dass folgendes eine eindeutige Grammatik f¨ ur die Sprache kKA ist: G = ({S}, {0, 1}, S, P ), wo P die Produktionen S → ε , S → 0S1S enth¨alt. (Man baue Ableitungsb¨aume in dieser Grammatik f¨ ur einige W¨orter w ∈ kKA!) (b) Ohne Beweis bemerken wir, dass die Sprache L := {an bn cm | n, m ∈ N} ∪ {am bn cn | n, m ∈ N} 117
eine inh¨arent mehrdeutige kontextfreie Sprache ist. Die Aussage L ∈ L2 ist dabei nicht schwer zu zeigen. Folgendes ist eine naheliegende Grammatik f¨ ur L: G = ({S, A, B}, {a, b, c}, S, P ), wobei P die folgenden Produktionen enth¨alt: S A D C E
→ → → → →
AD | EC aA | ε bDc | ε cC | ε aEb | ε .
Zum Beispiel gibt es f¨ ur das Wort aabbcc die beiden folgenden verschiedenen Linksableitungen, anhand derer man auch die Idee hinter der Grammatik studieren kann: S ⇒ AD ⇒ aAD ⇒ aaAD ⇒ aaD ⇒ aabDc ⇒ aabbDcc ⇒ aabbcc ; S ⇒ EC ⇒ aEbC ⇒ aaEbbC ⇒ aabbC ⇒ aabbcC ⇒ aabbccC ⇒ aabbcc . Der Nachweis der inh¨arenten Mehrdeutigkeit ist aufwendiger und wird hier ausgelassen. Intuitiv ben¨otigt jede Grammatik G0 mit L(G0 ) = L f¨ ur die beiden Teile der Sprache unabh¨angige Abteilungen“; die W¨orter an bn cn f¨ ur große n m¨ ussen Ableitungen in beiden ” Abteilungen“ besitzen, die dann notwendig verschieden sind. ” 4.2.8 Proposition gilt:
Es sei G = ({S}, {0, 1}, S, P ) mit P = {S → ε, S → 0S1S}. Dann
(a) L(G) = kKA, (b) G ist eindeutig. Beweis: (a) ⊆“: Durch Induktion u ¨ber die L¨ange t einer Ableitungsfolge ” S = α0 ⇒ α1 ⇒ · · · ⇒ αt beweist man, dass jede Satzform in der Grammatik G die Hilfsbehauptung (HBα ) aus dem Beweis von Prop. 4.1.4 erf¨ ullt. Das geht praktisch genau so wie dort vorgef¨ uhrt. Daraus folgt dann, dass jedes w ∈ L(G) die Eigenschaft (∗) aus Prop. 4.1.3 hat, also ein korrekter Klammerausdruck ist. ⊇“: Wir beweisen durch Induktion u ¨ber |w|, dass jeder korrekte Klammerausdruck w ” eine Ableitung in G besitzt. I.A.: Wenn |w| = 0, also w = ε, ist S ⇒ ε eine Ableitung. I.V.: k ≥ 1, und f¨ ur jeden w0 ∈ kKA mit |w0 | < k gibt es eine Ableitung. 118
I.S.: Nun sei w ein korrekter Klammerausdruck mit |w| = k. Nach der Definition ist w = 0w0 1w00 f¨ ur korrekte Klammerausdr¨ ucke w0 und w00 , die beide k¨ urzer sind als w. ∗ ∗ Nach I.V. gibt es Ableitungsfolgen S ⇒ w0 und S ⇒ w00 . Wenn wir diese Folgen mit dem Ableitungsschritt S ⇒ 0S1S kombinieren, erhalten wir eine Ableitung ∗
∗
S ⇒ 0S1S ⇒ 0w0 1S ⇒ 0w0 1w00 = w, wie gew¨ unscht. (b) Wir zeigen durch Induktion u ¨ber |w|, dass jedes Wort w ∈ L(G) genau eine Linksableitung hat. I.A.: Wenn |w| = 0, also w = ε, ist S ⇒ ε die einzige Ableitung f¨ ur w. 0 0 I.V.: Es sei k ≥ 1, und f¨ ur jedes w ∈ kKA mit |w | < k gebe es genau eine Linksableitung. I.S.: Nun sei w ∈ L(G), |w| = k ≥ 1, mit Linksableitung S = α0 ⇒ 0S1S = α1 ⇒ · · · ⇒= αt = 0w0 1w00 = w. Man denkt sich die 0 und die 1 in α1 = 0S1S markiert (unterstrichen). Diese Terminalzeichen werden ja nach diesem ersten Ableitungsschritt nie mehr ver¨andert. Da wir es mit einer Linksableitung von w zu tun haben, werden in einem ersten Teil α0 ⇒ · · · ⇒ αs der Ableitung Produktionen nur auf Variable zwischen 0 und 1 angewendet, und αs = 0w0 1S. Da man aus S nur W¨orter in L(G) erzeugen kann, ist w0 ∈ L(G) und der Teil der Ableitung α1 ⇒ · · · ⇒ αs , der sich zwischen 0 und 1 abspielt, bildet eine Linksableitung f¨ ur w0 . Diese ist nach I.V. eindeutig bestimmt; daher sind α1 , . . . , αs eindeutig bestimmt. Genauso argumentiert man, dass sich im zweiten Teil der Ableitung αs ⇒ · · · ⇒ αt im Teil rechts von 1 eine Linksableitung f¨ ur das Wort w00 abspielen muss. Wieder wegen der Eindeutigkeit dieser Linksableitung (nach I.V.) kann es auch nur eine M¨oglichkeit f¨ ur 0 diesen zweiten Teil der Ableitung geben. Schließlich bemerkt man, dass 0w 1 das k¨ urzeste Pr¨afix von w ist, das gleich viele Nullen wie Einsen enth¨alt. Damit sind die Teilw¨orter w0 und w00 durch w, nicht durch die Ableitung α0 ⇒ 0S1S ⇒ · · · ⇒ w, festgelegt. Also kann es f¨ ur w nur diese eine Linksableitung geben; das ist die Induktionsbehauptung. Wir bemerken noch (ohne formalen Beweis), dass die Grammatik f¨ ur arithmetische Aus¨ dr¨ ucke aus Beispiel 3.1.1 eindeutig ist. In den Ubungen wird eine mehrdeutige Grammatik f¨ ur klammerfreie arithmetische Ausdr¨ ucke besprochen.
4.3
Die Chomsky-Normalform
Sowohl f¨ ur theoretische Zwecke als auch f¨ ur praktische Anwendungen ist es g¨ unstig, kontextfreie Grammatiken zu haben, deren Produktionen noch engere Anforderungen erf¨ ullen als die bloße Kontextfreiheit. In diesem Abschnitt geben wir eine solche Normalform an und besprechen einen Konstruktionsalgorithmus daf¨ ur. Anwendungen werden in sp¨ateren Abschnitten angegeben. 119
4.3.1 Definition Eine kontextfreie Grammatik G = (V, Σ, S, P ) ist in ChomskyNormalform, falls • entweder alle Produktionen von G die Form A → BC (A, B, C ∈ V ) oder A → a (A ∈ V, a ∈ Σ) haben • oder alle Produktionen von G die Form A → BC oder A → a oder S → ε haben, und S nie auf der rechten Seite einer Produktion vorkommt. 4.3.2 Beispiel (a) Die Grammatik G = (V, Σ, S, P ) mit V = {S, R, A, B, F, H}, Σ = {0, 1}, Startsymbol S und Produktionen S R F H A B
→ → → → → →
ε | AF AF BR | RH | 1 BR | 1 0 1
erf¨ ullt die Anforderungen der Definition. Die Produktion S → ε kommt vor; S kommt nicht auf der rechten Seite irgendeiner Produktion vor. Die einzige M¨oglichkeit, das Wort ε zu erzeugen, ist mit der 1-Schritt-Ableitung S ⇒ ε. An der Beispiel-Linksableitung S ⇒ AF ⇒ 0F ⇒ 0RH ⇒ 0AF H ⇒ 00F H ⇒ 00BRH ⇒ 001RH ⇒ 001AF H ⇒ 0010F H ⇒ 00101H ⇒ 00101BR ⇒ 001011R ⇒ 001011AF ⇒ 0010110F ⇒ 00101101 f¨ ur ein Wort 6= ε erkennt man, dass in jedem Ableitungsschritt entweder die Zahl der Zeichen um 1 steigt oder eine Variable in ein Terminalzeichen umgewandelt wird. Daraus sieht man sofort, auch allgemein, dass die Zahl der Ableitungsschritte in einer Grammatik in Chomsky-Normalform f¨ ur ein Wort w mit n Buchstaben genau 2n − 1 betr¨agt. Eine Satzform besteht immer aus 0 oder mehr Terminalzeichen, gefolgt von 0 oder mehr Variablen. Der Ableitungsbaum, der der Beispiel-Linksableitung entspricht, sieht folgendermaßen aus: Wieder erkennt man schon am Beispiel, dass Ableitungsb¨aume f¨ ur n-buchstabige W¨orter genau n Bl¨atter haben, die mit Terminalzeichen beschriftet sind, und dass der Teil des Baums, dessen Knoten mit Variablen beschriftet sind, einen vollen“ Bin¨arbaum ” 120
S
F
A
0 H
R
A
F
B
0
R
1 B
R
1 A
F
0
1
A
F
0
1
Abbildung 4.9: Ein Ableitungsbaum zu einer Grammatik in Chomsky-Normalform mit n Bl¨attern darstellt.2 Man weiß, dass solche B¨aume 2n − 1 Knoten haben (die genau den Ableitungsschritten entsprechen). Wie im Beispiel gilt allgemein, dass Ableitungen und Ableitungsb¨aume in Grammatiken in Chomsky-Normalform sehr stark standardisiert und u ¨bersichtlich sind. (b) Die Grammatik G = (V, Σ, S, P ) mit V = {S, A, B, F, H}, Σ = {0, 1}, Startsymbol S und Produktionen S F H A B
→ → → → →
AF BS | SH | 1 BS | 1 0 1
erf¨ ullt ebenfalls die Anforderungen der Definition. Die Startvariable erscheint auf der rechten Seite von Produktionen, aber es gibt u ¨berhaupt keine ε-Produktion. 2
Ein Bin¨ arbaum heißt voll“, wenn jeder Knoten, der kein Blatt ist, genau zwei Nachfolger hat. ”
121
Der Leser/die Leserin ist eingeladen, einige Ableitungen und Ableitungsb¨aume f¨ ur diese Grammatik zu entwickeln und zu spekulieren, welche Sprache zu G geh¨ort.
4.3.3 Definition L(G0 ) gilt.
Zwei Grammatiken G und G0 heißen ¨ aquivalent, wenn L(G) =
Am Ende dieses Abschnitts werden wir folgenden Satz bewiesen haben: 4.3.4 Satz Jede kontextfreie Grammatik G kann in eine ¨aquivalente Grammatik G0 in Chomsky-Normalform umgebaut werden. Hierf¨ ur gehen wir in vier Schritten vor: 1. Separieren der Terminalzeichen-Produktionen 2. Verk¨ urzen der rechten Seiten 3. Elimination der ε-Produktionen A → ε 4. Elimination von Kettenregeln A → B
4.3.1
Separierung
Zun¨achst wollen wir Produktionen, die Terminalzeichen erzeugen, von solchen trennen, die Variable erzeugen. Es soll also niemals auf einer rechten Seite eine Mischung von Terminalzeichen und Variablen stehen; zudem sollen niemals Bl¨ocke von mehreren Terminal¨ zeichen erzeugt werden. Es gibt keinen Grund, sich f¨ ur diese Uberlegung auf kontextfreie Grammatiken zu beschr¨anken. 4.3.5 Definition Eine Grammatik G = (V, Σ, S, P ) (im Sinn von Definition 3.1.2) heißt separiert, wenn Terminalzeichen nur in Produktionen der Form A → a (A ∈ V , a ∈ Σ) vorkommen. (Alle anderen Produktionen haben die Form X1 · · · Xs → Y1 · · · Yt , mit s ≥ 1, t ≥ 0, X1 , . . . , Xs , Y1 , . . . , Yt Variable.) 4.3.6 Lemma Jede Grammatik G = (V, Σ, S, P ) kann in eine ¨aquivalente separierte Grammatik G0 = (V 0 , Σ, S, P 0 ) umgebaut werden. 122
Beweis: F¨ ur jedes a ∈ Σ wird eine neue Variable Da eingef¨ uhrt. In allen Produktionen in P wird auf der linken und auf der rechten Seite a durch Da ersetzt. Weiterhin werden neue Regeln Da → a, f¨ ur a ∈ Σ, hinzugef¨ ugt. Offenbar gilt f¨ ur die resultierende Grammatik G0 := (V ∪ {Da | a ∈ Σ}, Σ, S, P 0 ), dass L(G) = L(G0 ).
4.3.7 Beispiel Wenn man die angegebene Konstruktion auf G = ({S}, {0, 1}, S, P ) mit P = {S → ε | 0S1S} anwendet, braucht man zwei neue Variable, etwa A (als D0 ) und B (als D1 ). Die Produktionen der neuen Grammatik G0 sind dann: S → ε | ASBS A → 0 B → 1 4.3.8 Beispiel Weiter wenden wir die Konstruktion aus Lemma 4.3.6 auf die Grammatik aus Beispiel 3.1.1 an, die die folgenden Produktionen hat: hfactor i → num | (hexpr i) htermi → htermi * hfactor i | htermi / hfactor i | hfactor i hexpr i → hexpr i + htermi | hexpr i - htermi | htermi Wir f¨ uhren f¨ ur jedes Terminalzeichen eine neue Variable und eine Produktion ein, zum Beispiel wie folgt: hnumi hliklai hreklai hplusi hminusi htimesi hover i
→ → → → → → →
123
num ( ) + * /
¨ Die alten Produktionen sehen nach der Anderung wie folgt aus: hfactor i → hnumi | hliklaihexpr ihreklai htermi → htermi htimesi hfactor i | htermi hover i hfactor i | hfactor i hexpr i → hexpr i hplusi htermi | hexpr i hminusi htermi | htermi
4.3.2
Verku ¨ rzung rechter Seiten
Als n¨achsten Schritt m¨ochten wir erreichen, dass unsere Grammatiken keine Produktionen mehr haben, bei denen auf der rechten Seite mehr als zwei Variable stehen. Das ist ganz leicht. 4.3.9 Lemma Jede separierte kontextfreie Grammatik G = (V, Σ, S, P ) kann in eine ¨aquivalente separierte kontextfreie Grammatik G0 = (V 0 , Σ, S, P 0 ) umgebaut werden, die nur noch Produktionen der folgenden Form hat: • A → ε, • A → a, mit A ∈ V , a ∈ Σ, • A → B, mit A, B ∈ V , • A → BC, mit A, B, C ∈ V . Beweis: Wir bearbeiten jede Produktion A → C1 C2 · · · Cr in P mit r ≥ 3 separat. Es werden r − 2 neue Variable Y2 , . . . , Yr−1 (die nur f¨ ur diese Produktion verwendet werden) zu V hinzugenommen; die folgenden Produktionen werden zu P hinzugef¨ ugt: A → C1 Y2 Y2 → C2 Y3 .. . Yr−1 → Cr−1 Cr . Schließlich wird die Produktion A → C1 C2 · · · Cr gestrichen. Die neue Variablenmenge heißt V 0 ; die neue Produktionenmenge P 0 . 124
Es ist offensichtlich, dass in der neuen Grammatik G0 gilt: A ⇒ C1 Y2 ⇒ C1 C2 Y3 ⇒ · · · ⇒ C1 C2 · · · Yr−1 ⇒ C1 C2 · · · Cr−1 Cr . Daher sind in G0 mindestens alle W¨orter von L(G) ableitbar. Umgekehrt kann man sich u ¨berlegen, dass die neuen Variablen zu nichts anderem verwendet werden k¨onnen, als in einer Teilableitung oder in einem Teil des Ableitungsbaums A in C1 · · · Cr zu transformie¨ ren. In der Notation der Ableitungsb¨aume sieht die Ubersetzung so aus: ersetze A
A
C1
α1
...
...
Cr
αr
durch
^ D 2
C1
α1
^ D r-1
C2
α2
Cr-1
α r-1
Cr
αr
und umgekehrt.
4.3.10 Beispiel Wenn wir mit der separierten Grammatik G = ({S, A, B}, {0, 1}, S, P ) aus Beispiel 4.3.7 beginnen, die die Produktionen S → ε | ASBS A → 0 B → 1 hat, ben¨otigen wir zwei neue Variable, etwa F und H, und die neuen Produktionen S → AF F → SH H → BS . Die Produktion S → ASBS wird gestrichen.
125
4.3.3
Bearbeitung von ε-Produktionen
Der erste ernsthafte Schritt in der Konstruktion der Chomsky-Normalform ist die Elimination der ε-Regeln aus der Grammatik. Hier gehen wir in zwei Teilschritten vor: Zun¨achst l¨osen wir (f¨ ur eine beliebige kontextfreie Grammatik G) das Problem herauszufinden, aus welchen Variablen man das leere Wort ableiten kann: wir bestimmen die Menge ∗
Vε = {A ∈ V | A ⇒ ε} . In einem zweiten Schritt bauen wir eine separierte Grammatik G mit kurzen rechten Seiten zu einer Grammatik G0 f¨ ur L(G) − {ε} um, so dass in G0 u ¨berhaupt keine ε-Produktionen vorkommen. Teilschritt 1: Ermittlung von Vε . Dies geschieht mit einem Markierungsalgorithmus. Eingabe ist eine kontextfreie Grammatik G = (V, Σ, S, P ). Markierungsalgorithmus fu ¨ r Vε Auszuf¨ uhren auf einer Tabelle aller Produktionen in P Runde 0: Markiere alle (Vorkommen von) A, wo A → ε Produktion Runde t: (t = 1, 2, . . .) Wenn A → C1 C2 · · · Cr Produktion, r ≥ 1, und C1 , . . . , Cr sind alle markiert und A ist unmarkiert dann markiere (alle Vorkommen von) A . Ausgabe: Menge der markierten Variablen . 4.3.11 Beispiel
Die Liste der Produktionen k¨onnte wie folgt aussehen: S S A A B B C T T T
→ → → → → → → → → →
BB ABC aA a bB ε SBT A BT B
In Runde 0 wird B markiert (unterstrichen), und zwar alle neun Exemplare, die vorkommen. In den Runden 1, 2 und 3 folgen S, T und C. Schließlich sieht die Tabelle so 126
aus: S S A A B B C T T T
→ → → → → → → → → →
BB ABC aA a bB ε SBT A BT B
Die Variable A kann nicht markiert werden, was der intuitiven Beobachtung entspricht, dass aus A das leere Wort nicht ableitbar ist. F¨ ur diese Grammatik ergibt sich also Vε = {B, S, T, C}. 4.3.12 Proposition
F¨ ur das Resultat des Markierungsalgorithmus gilt: ∗
(a)
A wird markiert ⇔ A ⇒ ε.
(b)
A wird markiert ⇔ es gibt einen A-Ableitungsbaum T mit α(T ) = ε.
(c)
ε ∈ L(G)
⇔
S wird markiert.
Beweis: Nach Lemma 4.2.3 sind (a) und (b) ¨aquivalent. Weiter ist es klar, dass (c) aus (a) folgt. Es gen¨ ugt also, (b) zu beweisen. (b) ⇒“: Man zeigt durch eine einfache Induktion u ¨ber Markierungsschritte, dass es zu ” jeder markierten Variablen A einen A-Ableitungsbaum TA,ε mit α(TA,ε ) = ε gibt. I.A.: Wenn A in Runde 0 markiert wird, gibt es die Produktion A → ε und daher den A-Ableitungsbaum
A ε I.S.: Nun betrachte eine Variable A, die in Runde t ≥ 1 markiert wird. Dies passiert, weil es eine Produktion A → C1 · · · Cr gibt, wobei die Variablen C1 , . . . , Cr in fr¨ uheren Runden markiert wurden. Nach der I.V. gibt es also f¨ ur jedes i, 1 ≤ i ≤ r, einen Ci -Ableitungsbaum TCi ,ε mit Ergebnis α(TCi ,ε ) = ε. Diese B¨aume k¨onnen wir wie in Abb. 4.10 angegeben zu einem A-Ableitungsbaum TA,ε zusammenbauen. Dies liefert die Induktionsbehauptung. 127
T
A,ε
: A
Cr
C1
TC ,ε r
T C ,ε 1
ε
ε
Abbildung 4.10: Struktur eines A-Ableitungsbaums mit Ergebnis ε (b) ⇐“: ” Wir zeigen: Falls es einen A-Ableitungsbaum TA gibt, der Tiefe d hat und α(TA ) = ε erf¨ ullt, so wird A markiert. (Man sollte sich u ¨berlegen, dass dies keineswegs offensichtlich ist. Der Baum TA k¨onnte im Prinzip sehr groß sein, und es ist nicht klar, wieso der Markierungsalgorithmus, der ja h¨ochstens |V | Runden ausf¨ uhrt, feststellt, dass ε aus A ableitbar ist. Der Beweis zeigt aber, dass es in diesem Fall auch einen kleinen A-Ableitungsbaum mit Ergebnis ε geben muss, den der Algorithmus finden kann.) Wir benutzen Induktion u ¨ber d. I.A.: d = 1: Dann sieht TA wie folgt aus:
A ε Es muss also A → ε Produktion in P sein; also wird A in Runde 0 markiert. I.V.: d ≥ 2, und die Aussage stimmt f¨ ur d0 < d. I.S.: Es sei d ≥ 2 und ein Baum TA der Tiefe d gegeben. Dann gibt es Variable C1 , . . . , Cr , r ≥ 1, und eine Produktion A → C1 · · · Cr derart, dass TA folgendermaßen aussieht:
128
T : A A
Cr
C1
TC
TC
r
1
ε
ε
Die Unterb¨aume TC1 , . . . , TCr haben alle Tiefe kleiner als d, und jeder liefert als Ergebnis ε. Nach I.V. werden also die Variablen C1 , . . . , Cr alle markiert. Daraus folgt, nach der Formulierung des Algorithmus, und weil A → C1 · · · Cr Produktion ist, dass auch die Variable A irgendwann einmal markiert werden muss. Damit ist die Induktionsbehauptung gezeigt. ¨ Mit den vorangegangenen Uberlegungen k¨onnen wir f¨ ur jede kontextfreie Grammatik G die Menge Vε ermitteln und auch feststellen, ob ε ∈ L(G) ist oder nicht. Ausflug: Produktive und u ¨ berflu ¨ ssige Variable Mit den eben f¨ ur Vε entwickelten Techniken l¨asst sich auch eine andere fundamentale Frage u ¨ber eine gegebene kontextfreie Grammatik G l¨osen, n¨amlich ob L(G) = ∅ ist, oder ∗ ur mindestens ein Wort w ∈ Σ∗ ist. Allgemeiner betrachtet man ¨aquivalent, ob S ⇒ w f¨ folgende Eigenschaft von Variablen: 4.3.13 Definition Eine Variable A in einer kontextfreien Grammatik G = (V, Σ, S, P ) ∗ heißt produktiv , wenn es ein Terminalzeichenwort w mit A ⇒ w gibt. ¨ (Aquivalent: . . . wenn es einen A-Ableitungsbaum T mit α(T ) ∈ Σ∗ gibt.) Die Menge der produktiven Variablen heißt Vprod . Eine Variable A, die nicht produktiv ist, heißt u ¨berflu ¨ssig . Man kann sich leicht u ussige Variable in keinem Ableitungsbaum ¨berlegen, dass eine u ¨berfl¨ zur Grammatik G vorkommen kann, der als Ergebnis ein Terminalzeichenwort hat. Produktionen, in denen solche Variablen vorkommen, k¨onnen also weggelassen werden, ohne die Sprache zu ver¨andern. Die Sprache L(G) ist leer genau dann wenn S u ussig ist. ¨berfl¨ Wenn G = (V, Σ, S, P ) gegeben ist, ermitteln wir die Menge der produktiven Variablen durch einen Markierungsalgorithmus, der dem f¨ ur Vε sehr ¨ahnelt. 129
Markierungsalgorithmus fu ¨ r Vprod Auszuf¨ uhren auf einer Tabelle aller Produktionen in P Runde 0: Markiere alle (Vorkommen von) A, wo A → w Produktion f¨ ur ein w ∈ Σ∗ Runde t: (t = 1, 2, . . .) Wenn A → X1 X2 · · · Xr Produktion, r ≥ 1, und X1 X2 · · · Xr sind markierte Variable oder Terminalzeichen, und A ist unmarkiert dann markiere (alle Vorkommen von) A . Ausgabe: Menge der markierten Variablen . 4.3.14 Proposition
F¨ ur das Resultat des Markierungsalgorithmus gilt: ∗
(a)
A wird markiert ⇔ A ⇒ w f¨ ur ein w ∈ Σ∗ .
(b)
A wird markiert ⇔ es gibt einen A-Ableitungsbaum T mit α(T ) ∈ Σ∗ .
(c)
L(G) 6= ∅
⇔
S wird markiert.
Der Beweis dieser Behauptung verl¨auft ganz genau so wie der f¨ ur Proposition 4.3.12. ¨ (Eine gute Ubung!) 4.3.15 Beispiel
Betrachte folgende Produktionen: S A B C D E F
→ → → → → → →
ABC | ADC | AF aA | a bB cC | ε S | Eabc AE | AaE | ACA F B | abB | F F
In Runde 0 werden die Variablen A und C markiert, wegen der Produktionen A → a und C → ε. In Runde 1 wird E markiert (wegen der Produktion E → ACA), in Runde 2 D (wegen der Produktion D → Eabc) und in Runde 3 schließlich S (wegen der Produktion S → ADC). Es ergibt sich die Tabelle S A B C D E F
→ → → → → → →
ABC | ADC | AF aA | a bB cC | ε S | Eabc AE | AaE | ACA F B | abB | F F. 130
Keine weitere Variable kann mehr markiert werden. Als produktiv stellen sich also A, C, E, D und S heraus Weil S produktiv ist, erzeugt die Grammatik auch mindestens ein Terminalzeichenwort. Als u ussig ergeben sich B und F . (In diesem konkreten Beispiel ¨berfl¨ ist auch intuitiv zu sehen, dass man die Variable B nie loswerden“ kann, und dass sich ” dies dann auch auf F u ¨bertr¨agt.) Dies beendet unsere kurze Diskussion von produktiven und u ussigen Variablen. Wir ¨berfl¨ kehren zur¨ uck zur Konstruktion der Chomsky-Normalform, und hier konkret zur Elimination von ε-Produktionen. Teilschritt 2: Gegeben sei eine kontextfreie Grammatik G = (V, Σ, S, P ), in der es nur Produktionen der Form • A → ε, • A → a, mit A ∈ V , a ∈ Σ, • A → B, mit A, B ∈ V , • A → BC, mit A, B, C ∈ V . gibt. Auf diese Grammatik wenden wir den Markierungsalgorithmus f¨ ur ε-produzierende Variable an, und erhalten Vε . ¨ P 0 entsteht aus P durch folgende Anderungen: • Wenn A → BC Produktion und B ∈ Vε , f¨ uge A → C hinzu • Wenn A → BC Produktion und C ∈ Vε , f¨ uge A → B hinzu • Streiche alle Produktionen A → ε 4.3.16 Lemma
Die Grammatik G0 = (V, Σ, S, P 0 ) erf¨ ullt L(G0 ) = L(G) − {ε}.
Bevor wir das Lemma beweisen, geben wir ein Beispiel an. 4.3.17 Beispiel In der Grammatik G = ({S, A, B, F, H}, {0, 1}, S, P ) aus Beispiel 4.3.10 mit den Produktionen: S F H A B
→ → → → →
ε | AF SH BS 0 1
131
ergibt sich: Vε = {S}. Die folgenden Produktionen werden hinzugef¨ ugt: F → H H → B die Produktion S → ε wird gestrichen. Damit ergibt sich als neue Produktionenmenge P 0: S F H A B
→ → → → →
AF H | SH B | BS 0 1
Die Grammatik G0 = ({S, A, B, F, H}, {0, 1}, S, P 0 ) erzeugt L(G) − {ε}, das ist die Menge aller korrekten Klammerausdr¨ ucke ohne ε. ussen zeigen, dass man einen Ableitungsbaum f¨ ur w ∈ Beweis von Lemma 4.3.16: Wir m¨ + 0 Σ in G in einen in G umbauen kann und umgekehrt. ⊇“: Gegeben ist ein Ableitungsbaum T f¨ ur das Wort w 6= ε in der alten Grammatik ” G. Wenn dieser Baum keine ε-Produktionen benutzt, sind wir fertig, weil dann T selbst ein Baum f¨ ur die neue Grammatik G0 ist. Andernfalls suchen wir in T einen maximalen Unterbaum T0 mit α(T0 ) = ε. Maximal“ heißt hier, dass jeder Unterbaum, der T0 echt ” T:
T’ :
S
A
A
B
T B ε
S
C
C
T C
T’ C
=/ ε
=/ ε
Abbildung 4.11: Links: G-Baum, mit Produktion A → BC, der C-Unterbaum liefert ε. Rechts: entsprechender G0 -Baum, mit Produktion A → B, keine ε-Produktionen enth¨alt, Ergebnis 6= ε hat. Es ist klar, dass T0 nicht der ganze Baum T ist (denn α(T ) 6= ε). Also hat die Wurzel von T0 , die etwa mit B beschriftet ist, einen Vorg¨anger (mit A 132
beschriftet). Der Teilbaum unter dem A-Knoten kann nicht Ergebnis ε haben (da T0 maximal groß ist). Also hat der B-Knoten einen Bruder, etwa mit C beschriftet, und der Unterbaum unter dem C-Knoten liefert ein Ergebnis 6= ε. Dies liefert den ersten Baum in Abbildung 4.11. Wir ersetzen die Produktion A → BC im Baum T durch die Produktion A → C aus der neuen Grammatik G0 , ohne dass sich das Ergebnis des Baums ¨andert. Diesen Schritt f¨ uhren wir gleichzeitig f¨ ur alle maximalen ε-erzeugenden Unterb¨aume aus. Dadurch ¨andert sich eventuell auch der Baum TC unter dem C-Knoten in einen neuen Baum TC0 . Das Resultat ist als zweiter Baum in Abb. 4.11 angegeben. Insgesamt erhalten wir einen Baum zur Grammatik G0 mit Ergebnis w. ⊆“: Gegeben ist ein Ableitungsbaum T 0 f¨ ur das Wort w in der neuen Grammatik G0 . Diese ” benutzt Produktionen, die in G nicht vorkommen. Betrachte zum Beispiel die Produktion A → C, die in P 0 ist, weil P die Produktion A → BC enth¨alt und B ∈ Vε ist. Das bedeutet, dass es in G einen B-Ableitungsbaum TB,ε , gibt, der als Ergebnis ε liefert. Nun ersetzen wir in T 0 einfach jedes Knotenpaar, das der Produktion A → C entspricht, durch eine Unterstruktur f¨ ur die Produktion A → BC und h¨angen unter den B-Knoten den Unterbaum TB,ε . Diese Transformation ist in Abb. 4.12 skizziert. T’ :
T:
S
A
S
A
B
C
T C
T B, ε
=/ ε
ε
C
T C =/ ε
Abbildung 4.12: Links: G0 -Baum mit neuer Produktion A → C. Rechts: G-Baum f¨ ur dasselbe Wort, mit Produktion A → BC und B-Ableitungsbaum TB,ε mit Ergebnis ε ¨ Durch eine solche Anderung ¨andert sich das Ergebnis des Gesamtbaums nicht. Wenn wir 0 diesen Umbau f¨ ur alle in T verwendeten neuen Produktionen durchf¨ uhren, erhalten wir einen Ableitungsbaum f¨ ur w in der alten Grammatik G. Damit ist Lemma 4.3.16 bewiesen.
4.3.18 Lemma
Jede separierte kontextfreie Grammatik G = (V, Σ, S, P ) mit Produk133
tionen der Form A → ε, A → a, A → B, A → BC, mit A, B, C ∈ V , a ∈ Σ, kann in eine ¨aquivalente separierte kontextfreie Grammatik G0 = (V 0 , Σ, S, P 0 ) umgebaut werden, die folgendes erf¨ ullt: • entweder sind alle Produktionen von der Form A → a, A → B oder A → BC, • oder alle Produktionen sind von der Form A → a, A → B, A → BC oder S → ε und S kommt nicht auf der rechten Seite einer Produktion vor. Diese Grammatik G0 ist kontextsensitiv im Sinn von Definition 3.1.6(b). Beweis: Sei L ∈ L2 , also L = L(G) f¨ ur eine kontextfreie Grammatik G. Nach 4.3.9 und 4.3.16 existiert eine kontextfreie Grammatik G1 = (V1 , Σ, S, P1 ) mit L(G1 ) = L(G) − {ε}, wobei P1 nur Produktionen der Form A → a, A → B und A → BC hat. Demnach besteht P1 nur aus kontextsensitiven Produktionen (Definition 3.1.6(a)). 1. Fall : ε 6∈ L. Dann L = L(G1 ), und wir k¨onnen G0 = G1 w¨ahlen. 2. Fall : ε ∈ L. Dann ist L = L(G0 ) f¨ ur die Grammatik G0 = (V1 ∪ {S 0 }, Σ, S 0 , P1 ∪ {S 0 → S, S 0 → ε}). Diese erf¨ ullt die aufgef¨ uhrten Anforderungen, ist also insbesondere kontextsensitiv.
Wir notieren, dass wir mit Lemma 4.3.18 einen entscheidenden Schritt in Richtung ChomskyHierarchie getan haben. (Siehe hierzu die Bemerkungen zur Chomsky-Hierarchie am Ende von Abschnitt 3.2.) 4.3.19 Korollar
Jede kontextfreie Sprache ist kontextsensitiv, in Zeichen: L2 ⊆ L1
Beweis: Nach Lemma 4.3.9 kann jede kontextfreie Grammatik G in eine ¨aquivalente kontextsensitive Grammatik G0 umgebaut werden.
4.3.4
Elimination von Kettenregeln
Mit der kontextsensitiven Form aus Lemma 4.3.18 sind wir noch immer nicht ganz zufrieden. Wir wollen auch noch die Kettenregeln“, das sind Produktionen der Form A → B ” f¨ ur A, B ∈ V , eliminieren. Wir starten hierzu mit einer Grammatik G = (V, Σ, S, P ) mit Produktionen der Form wie in Lemma 4.3.18 f¨ ur G0 angegeben. 134
Zun¨achst k¨onnen wir alle Produktionen der Form A → A weglassen, da Ableitungsschritte, die diese Produktion benutzen, nichts ¨andern. Die verbleibende Menge aller Kettenregeln in P nennen wir P1 . Die Idee f¨ ur das Weitere ist, Ableitungsfolgen der Form A = A0 ⇒ A1 ⇒ · · · ⇒ At = B ⇒ CD bzw. A = A0 ⇒ A1 ⇒ · · · ⇒ At = B ⇒ a durch Hinzuf¨ ugen von Produktionen A → CD bzw. A → a kurzzuschließen“. Dadurch ” entstehen nat¨ urlich keine Ableitungen f¨ ur W¨orter, die nicht schon vorher in L(G) waren. Nun werden alle Kettenregeln A → B weggelassen, und man muss sich u ¨berlegen, dass dadurch die Menge der ableitbaren W¨orter nicht schrumpft. 4.3.20 Beispiel (a) Wir betrachten die Grammatik G = ({S, A, B, F, H}, {0, 1}, S, P ) aus Beispiel 4.3.17 mit Produktionen: S F H A B
→ → → → →
AF SH | H BS | B 0 1
Hier gibt es die Ableitungsfolgen F ⇒ H ⇒ B ⇒ 1, F ⇒ H ⇒ BS und H ⇒ B ⇒ 1. Entsprechend f¨ ugen wir die neuen Produktionen F → 1 F → BS H → 1 hinzu. Die Kettenregeln F → H und H → B fallen weg. Dies liefert die folgende Liste von Produktionen: S F H A B
→ → → → →
AF SH | BS | 1 BS | 1 0 1
Diese Grammatik in Chomsky-Normalform haben wir schon in Beispiel 4.3.2(b) gesehen. Aus dem Erzeugungsprozess folgt, dass sie die Klammersprache ohne ε erzeugt. 135
(b) Weiter betrachten wir die Grammatik Gε = ({Sε , S, A, B, F, H}, {0, 1}, Sε , P ∪ {Sε → ugen eines speziellen neuen ε | S}), die aus der Grammatik aus Beispiel 4.3.17 durch Hinzuf¨ Startsymbols Sε hervorgeht. Wenn man hier alle Ketten u berbr¨ uckt und die Kettenregeln ¨ wegl¨asst, ergibt sich die folgende Produktionenmenge f¨ ur die volle Klammersprache in Chomsky-Normalform: Sε S F H A B
→ → → → → →
ε | AF AF SH | BS | 1 BS | 1 0 1
Wenn wir hier S in R und dann Sε in S umbenennen, erhalten wir die Grammatik aus Beispiel 4.3.2(a). Die formale Konstruktion besteht aus zwei Phasen. +
Phase (a): Ermittle die Menge P1+ aller Variablenpaare (A, B) mit A ⇒ B. Das heißt, (A, B) ist in P1+ genau dann wenn A = A0 ⇒ A1 ⇒ · · · ⇒ At = B f¨ ur eine Variablenfolge A0 , . . . , At , t ≥ 1. Hierf¨ ur benutzen wir einen Markierungsalgorithmus. Markierungsalgorithmus (f¨ ur Kettenregeln) Gegeben ist die Menge P1 aller Kettenregeln A → B, A 6= B, in einer kontextfreien Grammatik G. Wir arbeiten auf einer Tabelle aller Paare (A, B), A, B in V verschieden. Runde 0: Markiere alle Paare (A, B) mit A → B in P1 . Runde t, t = 1, 2, . . .: Falls m¨oglich, finde ein markiertes Paar (A, B) und ein Paar (B, C) in P1 derart dass (A, C) noch nicht markiert ist; dann markiere (A, C). Ausgabe: Menge der markierten Paare. Klar ist, dass der Algorithmus irgendwann einmal anh¨alt. Wir stellen fest, dass er die Menge der Paare in P1+ ausgibt. Behauptung: (A, B) wird markiert ⇔ (A, B) ∈ P1+ . 136
Der Beweis f¨ ur diese Aussage verl¨auft ¨ahnlich zu den Korrektheitsbeweisen f¨ ur andere Markierungsalgorithmen. ⇒“: Durch Induktion u ¨ber Runden zeigt man, dass es eine Ableitungsfolge A = A0 ⇒ ” A1 ⇒ · · · ⇒ At = B gibt, wenn (A, B) markiert wird. ⇐“: Man nimmt an, es gibt eine Ableitungsfolge A = A0 ⇒ A1 ⇒ · · · ⇒ At = B und ” zeigt durch Induktion u ¨ber i, dass alle Paare (A, Ai ), i = 1, . . . , t markiert werden. Phase (b): F¨ ur jede Kombination (A, B) ∈ P1+ , B → a in P f¨ ugen wir die Produktion A → a zu P hinzu; f¨ ur jede Kombination (A, B) ∈ P1+ , B → CD in P f¨ ugen wir die Produktion A → CD zu P hinzu. Alle Kettenregeln A → B werden aus P entfernt. Die neue Produktionenmenge heißt dann P 0 ; die neue Grammatik G0 . Man sieht sofort, dass in der neuen Grammatik G0 = (V, Σ, S, P 0 ) nicht mehr W¨orter ableitbar sind als in G. Umgekehrt kann man einen Ableitungsbaum T f¨ ur ein Wort w in der 0 Grammatik G immer zu einem in der Grammatik G umbauen, indem man in T maximal lange Ketten von Knoten mit jeweils einem Nachfolger sucht, die dann Teilableitungen A = A0 ⇒ A1 ⇒ · · · ⇒ At = B ⇒ a bzw. . . . At = B ⇒ CD entsprechen, und diese Ketten durch die Unterstrukturen zur Grammatik G0 ersetzt, die den Teilableitungen A ⇒ a bzw. A ⇒ CD entsprechen. Wir erhalten: A
A
B
C
bzw.
B
a
D
im Ableitungsbaum durch A
A bzw.
C
a
D
137
4.4
Das Pumping-Lemma fu ¨ r kontextfreie Sprachen
Wir benutzen die Chomsky-Normalform, um ein Pumping-Lemma ¨ahnlich dem f¨ ur regul¨are Sprachen (Satz 2.4.1) zu beweisen. Dieses Lemma, das eine grundlegende Struktureigenschaft kontextfreier Sprachen formuliert, wird gew¨ohnlich daf¨ ur benutzt (in ¨ahnlicher Weise wie in Abschnitt 2.4 das f¨ ur regul¨are Sprachen), um nachzuweisen, dass gewisse Sprachen nicht kontextfrei sind. 4.4.1 Satz (Pumping-Lemma fu ¨ r kontextfreie Sprachen) Wenn L eine kontextfreie Sprache u ur die folgendes gilt: F¨ ur jedes ¨ber Σ ist, dann gibt es eine Zahl n ≥ 1, f¨ z ∈ L mit |z| ≥ n gibt es W¨orter u, v, w, x, y ∈ Σ∗ , derart dass: (i) z = uvwxy, (ii) |vwx| ≤ n, (iii) |v| + |x| ≥ 1, (iv) ∀i ∈ N : uv i wxi y ∈ L. Beweis: Weil L kontextfrei ist, gibt es f¨ ur L eine Grammatik G = (V, Σ, S, P ) in ChomskyNormalform (Definition 4.3.1 und Satz 4.3.4). — Wir definieren n := 2|V | und zeigen, dass diese Zahl die verlangten Eigenschaften hat. Sei dazu z ∈ L = L(G) mit |z| ≥ n. Dann gibt es einen Ableitungsbaum T f¨ ur z in G. Weil n ≥ 1, kann in diesem Baum u ¨berhaupt keine ε-Produktion benutzt werden. Beispielsweise (Abb. 4.13) betrachte man nochmals den Ableitungsbaum aus Abb. 4.9 zur Grammatik aus Beispiel 4.3.2. Da in der Grammatik G Terminalzeichen a ∈ Σ nur durch Produktionen A → a erzeugt werden, hat T genau |z| viele Variablenknoten, die als Nachfolger ein (mit einem Terminalzeichen beschriftetes) Blatt haben; alle anderen Knoten haben genau zwei Nachfolger. Anders ausgedr¨ uckt: Der Variablenteil des Ableitungsbaumes bildet einen vollen Bin¨arbaum. Behauptung: Ein Bin¨arbaum, in dem auf dem l¨angsten Weg von der Wurzel zu einem Blatt genau d Knoten liegen, hat maximal 2d−1 viele Bl¨atter. (Am meisten Bl¨atter unter allen solchen B¨aumen hat der vollst¨andige Bin¨arbaum mit d Schichten. In diesem Baum liegt auf Schicht 1 die Wurzel, also ein Knoten. Auf Schicht l ≥ 2 liegen genau 2l−1 Knoten, wie man per Induktion leicht sieht; also liegen auf Schicht d, der Blattebene, genau 2d−1 Knoten.) Wir legen nun im Ableitungsbaum T f¨ ur z einen Wurzel-Blatt-Weg mit maximaler Knotenzahl l fest. Nach der Behauptung“ gilt ” 2|V | = n ≤ |z| ≤ 2l−1 , 138
S
F
A
0 H
R
A
F
B
0
R
1 B
R
1 A
F
0
1
A
F
0
1
Abbildung 4.13: Ein Ableitungsbaum zu einer Chomsky-Normalform-Grammatik also |V | < l. (Diese kleine Rechnung ist der Grund daf¨ ur, dass wir n = 2|V | gew¨ahlt haben.) T:
S
A¦V |
A2 | V |+1 Knoten A1
A0 z
a
Abbildung 4.14: Ein maximal langer Weg in Ableitungsbaum T Wir nennen die Variablen auf diesem Weg, vom Blatt her z¨ahlend, A0 , A1 , . . . , Al−1 . (Siehe Abb. 4.14.) 139
Nach dem Schubfachprinzip muss in der Folge A0 , . . . , A|V | eine Variable wiederholt vorkommen. Wir k¨onnen also i, j w¨ahlen mit 0 ≤ i < j ≤ |V | und Ai = Aj . Die doppelt vorkommende Variable wird A genannt. Damit haben wir die in Abb. 4.15 skizzierte Situation. T:
S
A
A
<| V |+1 Knoten
A0 z
a
Abbildung 4.15: Eine Variablenwiederholung Die beiden ausgew¨ahlten Positionen in der Folge A0 , . . . , A|V | bestimmen die Wurzeln von zwei Unterb¨aumen T1 (Knoten zu Aj ) und T2 (Knoten zu Ai ) von T . Beide Knoten sind mit A beschriftet, siehe Abb. 4.16.
140
T: S
T1:
A
T2 :
u
v
A
w
x
y
Abbildung 4.16: Ineinander geschachtelte Teilb¨aume, beide Wurzeln mit A beschriftet Die Teilb¨aume T1 und T2 teilen z = α(T ) in 5 Teile (von denen manche leer sein k¨onnen): u := der Inhalt der Bl¨atter von T links von T1 v := der Inhalt der Bl¨atter von T1 links von T2 w := α(T2 ) x := der Inhalt der Bl¨atter von T1 rechts von T2 y := der Inhalt der Bl¨atter von T rechts von T1 . Im Beispielbaum aus Abb. 4.13 k¨onnten diese Unterb¨aume und die zugeh¨origen Teilw¨orter zum Beispiel aussehen wie in Abb. 4.17. Hier wiederholt sich die Variable F . Folgende Eigenschaften der Teilw¨orter liest man aus der Konstruktion ab. (i) z = uvwxy. (ii) |vwx| ≤ n. Dies sieht man so: vwx = α(T1 ), also ist |vwx| gerade die Anzahl der Bl¨atter in T1 . Weil die zu A0 , A1 , . . . , A|V | geh¨orende Knotenfolge zu einem Weg maximaler L¨ange in T geh¨ort, hat der l¨angste Weg in T1 h¨ochstens |V | + 1 Variablenknoten. Nach der obigen Behauptung“ hat T1 h¨ochstens 2|V | Bl¨atter, also ist |vwx| ≤ 2|V | = n. ” (iii) |v| + |x| ≥ 1. Dies gilt, weil nach der Konstruktion T2 echter Teilbaum von T1 ist, und weil es bei Chomsky-Normalform-Grammatiken im Inneren eines Ableitungsbaumes nur Knoten von Grad 2 und keine ε-Produktionen gibt. Also muss auf dem Weg von der Wurzel von T1 zur Wurzel von T2 rechts oder links oder beidseitig von T2 ein nichtleeres Teilwort entstehen. Es bleibt (iv) zu zeigen. Weil T1 und T2 im Wurzelknoten dieselbe Variable A als Inschrift haben, kann man den Teil von T1 , der nicht auch in T2 ist, beliebig oft, d.h., 0-mal, 1-mal, 141
S
F
A
0 H
R
A
F
B
0
R
1 B
R
1 A
F
0
1
A
F
0
1
Abbildung 4.17: Zerlegung von α(T ) = 00101101: u = 00, v = 10, w = 1, x = ε, y = 101 2-mal usw., zwischen den Baum T (ohne T1 ) und T2 einf¨ ugen und daraus stets einen legalen Ableitungsbaum zur Grammatik G erhalten. Diese Idee sieht man am besten anhand der in Abbildungen 4.18 und 4.19 wiedergegebenen Skizzen ein.
142
T:
T2:
S
A
w
y
u
Abbildung 4.18: T2 anstelle von T1 eingeh¨angt. In Abb. 4.18 nimmt T2 die Stelle von T1 ein; das Resultat ist ein Ableitungsbaum f¨ ur 0 0 0 0 uv wx y. Daher ist uwy = uv wx y in L = L(G). In Abb. 4.19 wird der Teil von T1 , der nicht auch in T2 ist, zweimal benutzt; es ergibt sich ein Ableitungsbaum f¨ ur uv 2 wx2 w. Damit liegt auch dieses Wort in L = L(G). T:
T1:
S
A
T1 :
u
v
A
T2 :
x A w
v
y
x
Abbildung 4.19: Verdopplung eines Teils von T1 Es sollte zumindest anschaulich klar sein, dass man ebenso Ableitungsb¨aume f¨ ur uv 3 wx3 y, 143
uv 4 wx4 y usw. konstruieren kann. — Also gilt {uv 0 wx0 y, uvwxy = z, uv 2 wx2 y, uv 3 wx3 y, . . . } ⊆ L, wie in (iv) behauptet.
4.4.2 Beispiel Aus der Grammatik in Beispiel 4.2.1 erh¨alt man durch Anwendung der Schritte Separierung“ und Verk¨ urzung der rechten Seiten“ und durch Weglassen der ” ” ε-Produktion eine Grammatik G = ({S, D, D0 , D1 }, {0, 1}, S, P ), wobei P die folgenden Produktionen enth¨alt: S → SS | D0 D | D0 D1 , D → SD1 , D0 → 0, D1 → 1 . Es ist klar, dass L(G) die Sprache der korrekten Klammerausdr¨ ucke ohne ε ist. Betrachte z. B. den folgenden Ableitungsbaum f¨ ur z = 00101101 in dieser Grammatik: S
S
S
D0
D
0
D1
S
S
S
D0
D1
0
1
1
T1 D0
D1
D0
D1
0
1
0
1
T2
Wir haben einen l¨angsten Pfad markiert; auf ihm wiederholt sich die Variable S (doppelt umrandet). Auch die resultierenden Teilb¨aume T1 und T2 sind markiert. Man u ufe, ¨berpr¨ dass hier u = 0, v = 01, w = 01, x = ε und y = 101 gilt, und die Aussagen (i), (ii), (iii) aus 4.4.1! 144
Durch Herausschneiden und Verdoppeln des Baumteils T1 ohne T2“ ergeben sich die ” folgenden Ableitungsb¨aume: S 001101: S
S
D0
D
0
S
D1
D0
D1
0
1
D0
D1
0
1
1 T2
0010101101:
S S
S D0
D
0
D1
S S
S
1 D0
D1
0
1
S
S
D0
D1
D0
D1
0
1
0
1
¨ Zur Ubung erstelle man einen Ableitungsbaum f¨ ur uv 3 wx3 y!
145
D0
D1
0
1
Ganz genau wie im Fall des Pumping-Lemmas f¨ ur regul¨are Sprachen wollen wir das ur den Beweis nutzen, dass gewisse Sprachen nicht kontextfrei Pumping-Lemma 4.4.1 f¨ sind. Dabei gehen wir nach demselben Schema vor wie in Kapitel 2 (vor 2.4.2). L sei die Sprache, deren Nichtregularit¨at bewiesen werden soll. Schema fu ¨ r Nicht-Kontextfreiheits-Beweise: [1] (W¨ortlich) Beweis indirekt. Annahme: L ist kontextfrei. [2] (W¨ortlich) Dann gibt es ein n ≥ 1 mit den im Pumping-Lemma f¨ ur kontextfreie Sprachen (PL-kfS, Satz 4.4.1) behaupteten Eigenschaften. [3] (Problemspezifisch) Wir w¨ahlen z ∈ L, mit |z| ≥ n. (z muss man geschickt w¨ahlen, so dass Schritt [5] ausf¨ uhrbar ist.) [4] (W¨ortlich) Gem¨aß (PL-kfS) gibt es u, v, w, x, y derart dass (i) z = uvwxy; (ii) |vwx| ≤ n; (iii) |v| + |x| ≥ 1 und (iv) uv i wxi y ∈ L f¨ ur alle i ≥ 0. [5] (Problemspezifisch) Zeige nun, dass man fu ¨ r jede mo ¨gliche Position der Teilw¨orter i i u, v, w, x, y in z ein i angeben kann, so dass uv wx y ∈ / L ist. (Hierf¨ ur muss man oft mehrere F¨alle betrachten. Eventuell sind in verschiedenen F¨allen die ben¨otigten i’s unterschiedlich.) (W¨ortlich) Dies ist der gew¨ unschte Widerspruch. Wir wenden dieses Beweisschema auf einige Beispiele an. Nur im ersten Beispiel markieren wir die Teilschritte. Die behandelten Sprachen sind auch charakteristisch f¨ ur Sprachen, die nicht kontextfrei sind. 4.4.3 Behauptung
Die Sprache L1 = {am bm cm | m ≥ 1}
ist nicht kontextfrei. Beweis: [1] Indirekt. Angenommen, L1 w¨are kontextfrei. [2] Dann gibt es ein n ≥ 1 mit den Eigenschaften wie in (PL-kfS). [3] Wir w¨ahlen z = an bn cn ∈ L1 . Offenbar ist |z| = 3n ≥ n. [4] Nach (PL-kfS) gibt es u, v, w, x, y ∈ Σ∗ derart dass (i) an bn cn = uvwxy, (ii) |vwx| ≤ n, (iii) |v| + |x| ≥ 1, 146
(iv) ∀i ∈ N : uv i wxi y ∈ L1 . [5] Das Teilwort vwx von z kann nicht sowohl a’s als auch c’s enthalten. (Sonst m¨ usste vwx mindestens n + 2 Buchstaben haben, was (ii) widerspricht.) 1. Fall: vwx enth¨alt kein c. Dann betrachten wir uv 0 wx0 y = uwy. Dieses Wort enth¨alt (immer noch) genau n c’s, aber die Zahl der a’s und b’s zusammen ist gleich 2n−|v|−|x| < 2n (wegen (iii)). Also ist uv 0 wx0 y 6∈ L1 , im Widerspruch zu (iv). 2. Fall: vwx enth¨alt kein a. Dann betrachten wir uv 0 wx0 y = uwy. Dieses Wort enth¨alt (immer noch) genau n a’s, aber die Zahl der b’s und c’s zusammen ist gleich 2n−|v|−|x| < 2n (wegen (iii)). Also ist uv 0 wx0 y 6∈ L1 , im Widerspruch zu (iv). (Hinweis: Der zweite Fall ist so ¨ahnlich zum ersten, dass man hier normalerweise analog“ ” schreiben w¨ urde.)
4.4.4 Bemerkung (a) Nat¨ urlich ist es v¨ollig unwichtig, ob das leere Wort in der Sprache enthalten ist oder nicht; allgemeiner kann man immer eine endliche Anzahl von W¨ortern hinzuf¨ ugen oder entfernen, ohne die Eigenschaft der Kontextfreiheit zu ver¨andern. Also sind auch die Sprachen {am bm cm | m ≥ 0} und {am bm cm | m ≥ 5} (und so weiter) nicht kontextfrei. (b) Auch Sprachen wie {am b2m cm | m ≥ 0} und {a4m bm c3m | m ≥ 1} oder {0m 10m 10m | m ≥ 0} und {0m 1m 0m | m ≥ 0} sind nicht kontextfrei, was sich mit leichten Variationen des Beweises f¨ ur Behaup¨ tung 4.4.3 zeigen l¨asst. (Siehe Ubung.) (c) In Beispiel 3.1.9 haben wir eine monotone Grammatik f¨ ur {am bm cm | m ≥ 1} angegeben, also ist dies eine Chomsky-1-Sprache. Wenn wir das mit Korollar 4.3.19 kombinieren, erhalten wir, dass L2 ( L1 gilt. Dies beweist einen weiteren Teil unserer fr¨ uher aufgestellten Behauptung, dass die Chomsky-Hierarchie eine echte Hierarchie ist.
147
4.4.5 Behauptung
Die Sprache L2 = {am bk cm dk | m, k ≥ 1}
ist nicht kontextfrei. Beweis: Indirekt. Angenommen, L2 w¨are kontextfrei. Dann gibt es ein n ≥ 1 mit den Eigenschaften wie in (PL-kfS). W¨ahle nun z = an bn cn dn ∈ L2 . Offenbar ist |z| = 4n ≥ n. Nach (PL-kfS) gibt es u, v, w, x, y ∈ Σ∗ derart dass (i) an bn cn dn = uvwxy, (ii) |vwx| ≤ n, (iii) |v| + |x| ≥ 1, (iv) ∀i ∈ N : uv i wxi y ∈ L2 . Das Teilwort vwx von z kann nicht sowohl a’s als auch c’s enthalten, und auch nicht sowohl b’s als auch d’s. (Sonst m¨ usste vwx mindestens n + 2 Buchstaben haben, was (ii) widerspricht.) Also ist vwx entweder Teilwort von an bn oder Teilwort von bn cn oder Teilwort von cn dn . 1. Fall: vwx ist Teilwort von an bn . Dann ist im Wort uv 0 wx0 y die Zahl der a’s und b’s zusammen gleich 2n−|v|−|x| < 2n (wegen (iii)), aber die Zahl der c’s und d’s zusammmen gleich 2n. Also ist uv 0 wx0 y 6∈ L2 . Dies widerspricht (iv). 2. Fall: vwx ist Teilwort von bn cn . Dann ist im Wort uv 0 wx0 y die Zahl der b’s und c’s zusammen gleich 2n−|v|−|x| < 2n (wegen (iii)), aber die Zahl der a’s und d’s zusammmen gleich 2n. Jedes Wort t ∈ L2 erf¨ ullt aber |t|a + |t|d = |t|b + |t|c . Also ist uv 0 wx0 y 6∈ L2 . Dies widerspricht (iv). 3. Fall: vwx ist Teilwort von cn dn . Hier erh¨alt man analog zum 1. Fall einen Widerspruch. 4.4.6 Bemerkung (a) Auch Sprachen wie {am b2k c3m d4k | m ≥ 0} und {am bm am bm | m ≥ 0} erweisen sich mit ¨ahnlichen Beweisen als nicht kontextfrei. Man versuche, das Muster zu erkennen: Kontextfreie Grammatiken k¨onnen nicht beschreiben, dass in vier Teilw¨ortern w1 , w2 , w3 , w4 von w, die voneinander abgegrenzt sind, die L¨angenbeziehung |w1 | = |w3 | und |w2 | = |w4 | gilt. Dies liegt daran, dass die Anordnung der Paare (w1 , w3 ) und (w2 , w4 ) entsprechender Teilw¨orter nicht einer korrekten Klammerung entspricht. 148
(b) Im Gegensatz zu (a) bemerken wir, dass die Sprache L02 = {am bk ck dm | m, k ≥ 1}, die auf den ersten Blick sehr ¨ahnlich zu L2 aussieht, kontextfrei ist. (Man kann eine Grammatik mit Variablen S und A und Produktionen S → aSd | aAd und A → bAc | bc benutzen.) Es ist also kein Problem, mit einer kontextfreien Grammatik zu spezifizieren, dass in vier Teilw¨ortern w1 , w2 , w3 , w4 von w, die voneinander abgegrenzt sind, die L¨angenbeziehung |w1 | = |w4 | und |w2 | = |w3 | gilt. Hier sind die einander entsprechenden Teilwortpaare wie in korrekten Klammerausdr¨ ucken angeordnet. (c) Auch L2 und die in (a) genannten Sprachen sind Chomsky-1-Sprachen. 4.4.7 Behauptung
Die Sprache L3 = {w2w | w ∈ {0, 1}∗ }
u ¨ber Σ = {0, 1, 2} ist nicht kontextfrei. Beweis: Indirekt. Angenommen, L3 w¨are kontextfrei. Dann gibt es ein n ≥ 1 mit den Eigenschaften wie in (PL-kfS). W¨ahle nun z = 0n 1n 20n 1n ∈ L3 . Offenbar ist |z| = 4n+1 > n. Nach (PL-kfS) gibt es u, v, w, x, y ∈ Σ∗ derart dass (i) 0n 1n 20n 1n = uvwxy, (ii) |vwx| ≤ n, (iii) |v| + |x| ≥ 1, (iv) ∀i ∈ N : uv i wxi y ∈ L3 . 1. Fall: v oder x enth¨alt die 2“ aus z. Dann enth¨alt uv 0 wx0 y u ¨berhaupt keine 2“, ist ” ” also nicht in L3 . 2. Fall: Die 2“ liegt im Teilwort u. D. h.: vwx liegt in z komplett rechts von der 2“. ” ” Dann befinden sich in uv 0 wx0 y rechts von der 2“ weniger Buchstaben als links von der ” 2“, also ist uv 0 wx0 y nicht in L3 . ” 3. Fall: Die 2“ liegt im Teilwort y. Analog zum 2. Fall ist dann uv 0 wx0 y nicht in L3 . ” 4. Fall: Die 2“ liegt im Teilwort w. D. h.: v liegt komplett links von der 2“ und x ” ” liegt komplett rechts von der 2“. Nach (ii) gilt |vwx| ≤ n, also ist v ein Teilwort des ” Einserblocks links von der 2“ und x ein Teilwort des Nullerblocks rechts von der 2“. ” ” Damit ist uv 0 wx0 y = 0n 1n−|v| 20n−|x| 1n . Nach (iii) sind nicht |x| und |v| beide 0. Daher ist uv 0 wx0 y ∈ / L3 . In allen vier F¨allen ergibt sich ein Widerspruch zu (iv). 149
4.4.8 Bemerkung Die in der letzten Behauptung notierte Eigenschaft, dass kontextfreie Grammatiken nicht erzwingen k¨onnen, dass zwei Teilw¨orter identisch sind, kann verallgemeinert werden, zum Beispiel folgendermaßen: Die Sprache {w1 3 · · · 3wr 2v1 3 · · · 3vs | s ≥ r ≥ 1, w1 , . . . , wr , v1 , . . . , vr ∈ {0, 1}∗ , jedes vi kommt in {w1 , . . . , wr } vor} ist nicht kontextfrei. Dies hat zur Folge, dass eine grundlegende Eigenschaft korrekter Pascal- und Java-Programme nicht durch kontextfreie Grammatiken ausgedr¨ uckt werden kann, n¨amlich das Prinzip, dass die Namen von Variablen, die benutzt werden, zuvor deklariert worden sein m¨ ussen. Bedingungen dieser Art werden daher stets zus¨atzlich zu der formalen Grammatik angegeben.
4.4.9 Behauptung
Die Sprache 2
L4 = {0n | n ≥ 1} ist nicht kontextfrei. Beweis: Indirekt. Angenommen, L4 w¨are kontextfrei. Dann gibt es ein n ≥ 1 mit den Ei2 genschaften wie in (PL-kfS). W¨ahle nun z = 0n ∈ L4 . Nach (PL-kfS) gibt es u, v, w, x, y ∈ Σ∗ derart dass f¨ ur z (i)–(iv) erf¨ ullt sind. Nun ist aber 2 +|v|+|x|
uv 2 wx2 y = 0n
2 +k
= 0n
f¨ ur ein k mit 1 ≤ k ≤ n (nach (ii) und (iii)). Jedoch ist n2 < n2 + k < (n + 1)2 , also n2 + k keine Quadratzahl und damit uv 2 wx2 y 6∈ L4 . Dies widerspricht (iv). 4.4.10 Bemerkung (a) Der Beweis von Behauptung 4.4.9 verl¨auft genauso wie der Beweis von Behauptung 2.4.2(b), wo wir gesehen haben, dass L3 nicht regul¨ar ist. Dies ist charakteristisch f¨ ur Sprachen u ¨ber einem einelementigen Alphabet: Ein Nichtregularit¨atsbeweis mit dem Pumping-Lemma f¨ ur regul¨are Sprachen f¨ uhrt sofort zu einem fast gleichlautenden Beweis der Nicht-Kontextfreiheit, wenn wir das Pumping-Lemma f¨ ur kontextfreie Sprachen benutzen. (b) Tats¨achlich gilt: L ⊆ Σ∗ , |Σ| = 1, L ∈ L2 ⇒ L ∈ L3 . Es gibt also u ¨berhaupt keine kontextfreien Sprachen u ¨ber einem einelementigen Alphabet, die nicht regul¨ar sind. Der Beweis dieser Aussage ist etwas aufwendiger — er benutzt u ¨brigens das Pumping-Lemma 4.4.1 — und nicht Stoff der Vorlesung. 150
Zum Schluss dieses Abschnittes formulieren wir eine verst¨arkte Version des PumpingLemmas f¨ ur kontextfreie Sprachen, das in Beweisen f¨ ur Nicht-Kontextfreiheit oft zum Ziel f¨ uhrt, wenn die Anwendung des einfachen Pumping-Lemmas m¨ uhsam oder nicht m¨oglich ist. Diese Aussage nennt man nach seinem Urheber das Lemma von Ogden“. ” Bei der Anwendung dieses Lemmas per Schema d¨ urfen wir in Schritt [3] nicht nur z w¨ahlen, sondern in z auch n uns g¨ unstig erscheinende Buchstaben in z markieren“ (unterstrei” chen, rot einf¨arben). Die Zerlegung in u, v, w, x, y, die wir in Schritt [5] bearbeiten m¨ ussen, hat die Eigenschaft, dass entweder v oder x mindestens einen der markierten Buchstaben enth¨alt. Wir formulieren das Lemma und das resultierende Beweisschema. Auf einen Beweis des Lemmas von Ogden verzichten wir hier. Dieser Beweis ist sehr ¨ahnlich zu dem f¨ ur das Pumping-Lemma f¨ ur kontextfreie Sprachen (Satz 4.4.1). 4.4.11 Satz (Lemma von Ogden) Wenn L eine kontextfreie Sprache u ¨ber Σ ist, dann gibt es eine Zahl n ≥ 1, f¨ ur die folgendes gilt: Wenn z ein Wort in L ist, in dem n Buchstabenpositionen markiert“ sind, dann gibt es W¨orter u, v, w, x, y ∈ Σ∗ , derart dass ” folgendes gilt: (i) z = uvwxy, (ii) v und x zusammen enthalten mindestens ein markierte Buchstabenposition, (iii) ∀i ∈ N : uv i wxi y ∈ L. Schema fu ¨ r Nicht-Kontextfreiheits-Beweise mit dem Lemma von Ogden: [1] (W¨ortlich) Beweis indirekt. Annahme: L ist kontextfrei. [2] (W¨ortlich) Dann gibt es ein n ≥ 1 mit den im Lemma von Ogden (Satz 4.4.11) behaupteten Eigenschaften. [3] (Problemspezifisch) W¨ahle z ∈ L, mit |z| ≥ n, und markiere n Buchstaben in z. (z und die Markierungspunkte werden so gew¨ahlt, dass Schritt [5] gut ausf¨ uhrbar ist.) [4] (W¨ortlich) Gem¨aß (PL-kfS) gibt es u, v, w, x, y derart dass folgendes gilt: (i) z = uvwxy; (ii) v und x enthalten mindestens eine markierte Position; und (iii) uv i wxi y ∈ L f¨ ur alle i ≥ 0. [5] (Problemspezifisch) Zeige nun, dass man fu ¨ r jede nach (ii) noch mo ¨gliche i Position der Teilw¨orter u, v, w, x, y in z ein i angeben kann, so dass uv wxi y ∈ /L ist. (W¨ortlich) Dies ist der gew¨ unschte Widerspruch. 151
4.4.12 Behauptung
Die Sprache L4 = {ak bl cm | k ≥ l ≥ m ≥ 0}
ist nicht kontextfrei. Beweis: Indirekt. Angenommen, L4 w¨are kontextfrei. Dann gibt es ein n ≥ 1 mit den Eigenschaften wie im Lemma von Ogden. W¨ahle nun z = an bn cn ∈ L4 und markiere die n a’s. Nach dem Lemma von Ogden gibt es u, v, w, x, y ∈ Σ∗ derart dass (i) an bn cn = uvwxy,
;
(ii) v und x zusammen enthalten mindestens einen markierten Buchstaben, also mindestens ein a; (iii) ∀i ∈ N : uv i wxi y ∈ L4 . 1. Fall: v enth¨alt zwei verschiedene Buchstaben. Dann sieht man sofort, dass in uv 2 wx2 y die Buchstabenreihenfolge ak bl cm nicht eingehalten ist, was der Aussage aus (iii) widerspricht. 2. Fall: x enth¨alt zwei verschiedene Buchstaben. Das f¨ uhrt ebenso wie in Fall 1 zu einem Widerspruch. Von hier an nehmen wir an, dass v und x jeweils nur eine Sorte von Buchstaben enth¨alt. 3. Fall: x besteht aus a’s. Dann besteht vx nur aus a’s, und uv 0 wx0 y enth¨alt weniger a’s als b’s, also ist uv 0 wx0 y nicht in L4 , Widerspruch. 4. Fall: x besteht aus b’s. Wegen (ii) ist dann v eine nichtleere Folge von a’s, und uv 0 wx0 y enth¨alt weniger a’s als c’s, also ist uv 0 wx0 y nicht in L4 , Widerspruch. 5. Fall: x besteht aus c’s. F¨ uhrt analog zum 4. Fall zu einem Widerspruch.
4.5
Der Cocke-Younger-Kasami-Algorithmus
In diesem Abschnitt betrachten wir das Wortproblem f¨ ur kontextfreie Grammatiken, d. h. das Problem, f¨ ur eine vorgelegte kontextfreie Grammatik G = (V, Σ, S, P ) und ein Wort w ∈ Σ∗ zu entscheiden, ob w ∈ L(G) gilt oder nicht. Wir k¨onnen annehmen, dass G in Chomsky-Normalform vorliegt (andernfalls wenden wir den Umbau-Algorithmus aus ussen wir nur pr¨ ufen, ob S → ε eine Produktion in P Abschnitt 4.3 an). Falls w = ε, m¨ ist. Also interessieren uns nur W¨orter w 6= ε. In Ableitungen f¨ ur ein solches w k¨onnen keine ε-Produktionen vorkommen. Wir beschr¨anken uns also auf die Produktionen in P , die die Form A → BC oder A → a haben, mit A, B, C ∈ V , a ∈ Σ.
152
Es sei also w = a1 · · · an ∈ Σ∗ gegeben, n ≥ 1. Wir wollen f¨ ur jedes Teilwort ai · · · ai+d−1 , 1 ≤ d ≤ n, 1 ≤ i ≤ n − d + 1, von w wissen, aus welchen Variablen dieses Wort herleitbar ist. Dazu definieren wir Mengen ∗
Ud,i := {A ∈ V | A ⇒ ai · · · ai+d−1 }, f¨ ur 1 ≤ d ≤ n, 1 ≤ i ≤ n − d + 1. Offenbar ist w ∈ L(G) genau dann wenn S ∈ Un,1 . Wir u ¨berlegen nun, wie die Ud,i durch Induktion u ¨ber d = 1, 2, . . . , n zu berechnen sind. ∗
Induktionsanfang d = 1: Weil G in Chomsky-Normalform ist, gilt A ⇒ a f¨ ur A ∈ V , a ∈ Σ genau dann wenn A → a in P ist. Also: U1,i = {A ∈ V | A → ai }, f¨ ur 1 ≤ i ≤ n. ∗
Induktionsschritt d > 1: Setze v := ai · · · ai+d−1 . Ist A ⇒ v, so gibt es einen AAbleitungsbaum T mit α(T ) = v. Die Wurzel von T ist also mit A beschriftet, und T hat d Bl¨atter. Die Wurzel muss zwei Nachfolger haben, die mit Variablen (etwa C und D) beschriftet sind. Schematisch sieht das so aus: A C
D TD
TC
w’’
w’
Die beiden Teilb¨aume von T heißen TC und TD , und wir setzen w0 := α(TC ), w00 := α(TD ). Offenbar gilt: ∗
∗
C ⇒ w0 , D ⇒ w00 , v = w0 w00 , und 1 ≤ |w0 |, |w00 | < d , und A → CD ist Produktion.
(4.1)
Umgekehrt u ¨berlegt man sich leicht, anhand desselben Bildes, dass aus der Situation (4.1) ∗ folgt, dass A ⇒ v. — Wir haben also, f¨ ur A ∈ V : ∗
A ⇒ ai · · · ai+d−1
⇔
∃C, D ∈ V ∃d0 : 1 ≤ d0 < d − 1 und ∗ ∗ C ⇒ ai · · · ai+d0 −1 , D ⇒ ai+d0 · · · ai+d−1 und A → CD ist Produktion .
Damit erhalten wir folgende Rekursionsformel f¨ ur die Mengen Ud,i : Ud,i = {A ∈ V | ∃C, D ∈ V ∃d0 : 1 ≤ d0 < d und A → CD ist Produktion und C ∈ Ud0 ,i und D ∈ Ud−d0 ,i+d0 }. 153
Aus der Rekursionsformel ergibt sich folgender Algorithmus zur L¨osung des Wortproblems f¨ ur eine Grammatik G in Chomsky-Normalform. Eingabe: Grammatik G = (V, Σ, S, P ) in Chomsky-Normalform, w = a1 · · · an ∈ Σ∗ . Falls w = ε, pr¨ ufe, ob S → ε Produktion ist. Falls ja, gib JA“ aus, sonst NEIN“. ” ” Ab hier wird n ≥ 1 vorausgesetzt. Datenstruktur: Ein Array U [1..n, 1..n], wo jeder Eintrag eine Teilmenge von V ist. Initialisierung: U [d, i] := ∅, f¨ ur 1 ≤ d ≤ n, 1 ≤ i ≤ n − d + 1. (Nur diese Eintr¨age in U werden benutzt.) Methode: 1. U [1, i] := {A | A → ai ist Produktion }, f¨ ur 1 ≤ i ≤ n. 2. for d := 2 to n do for i := 1 to n − d + 1 do for d0 := 1 to d − 1 do U [d, i] := U [d, i] ∪ {A ∈ V | ∃ Produktion A → CD und C ∈ U [d0 , i], D ∈ U [d − d0 , i + d0 ]} . 3. Falls S ∈ U [n, 1], gib
JA“ aus, sonst NEIN“. ” ”
¨ Die Korrektheit des Algorithmus folgt aus den vorher angestellten Uberlegungen. Die 3 Laufzeit ist O(n ) — dabei geht die Gr¨oße der Grammatik G in die in dem O“ versteckte ” Konstante ein. Wenn man den CYK-Algorithmus von Hand ausf¨ uhrt, verwendet man ein dreieckiges Schema, dessen Felder den relevanten Eintr¨agen des Arrays U entsprechen. In Feld (d, i), 1 ≤ d ≤ n, 1 ≤ i ≤ n − d + 1, werden die Variablen A ∈ Dd,i eingetragen, also die Variablen, aus denen ai · · · ai+d−1 ableitbar ist.
154
i= w=
1 a1
2 a2
n an
. . . . .
d =1 2 ... ... ... n
Die Eintr¨age werden zeilenweise berechnet. Die Eintr¨age in Zeile d = 1 ergeben sich direkt aus den Produktionen der Form A → a. Um die Variablen in Zelle (d, i) f¨ ur d > 1 zu berechnen, betrachtet man Paare von schon ausgef¨ ullten Zellen nach folgendem Muster, etwa f¨ ur d = 5, i = 2: i= w=
1 a1
2 a2
d =1
1
2
2
...
3
...
4
...
*
n an
. . . . .
4 3 2 1
n
Abbildung 4.20: Ein Schritt im CYK-Algorithmus, zu bearbeitende Zellen F¨ ur d0 = 1, . . . , d − 1 pr¨ uft man f¨ ur jede Produktion A → CD der Grammatik, ob C in 0 0 Zelle (i, d ) und D in Zelle (i + d , d − d0 ) vorkommt. (Falls dies so ist, wird A in die Zelle (d, i) eingetragen.) In Abb. 4.20 wird die Zelle (2, 5) ausgef¨ ullt. Zusammengeh¨orige Zellen 0 0 0 (i, d ) und (i + d , d − d ) sind mit den gleichen eingekreisten Zahlen markiert. Die Zellen (i, d0 ) bilden im Schema eine Teil-Spalte, die Zellen (i + d0 , d − d0 ) eine TeilDiagonale. Die schraffierten Dreiecke deuten an, welche Teilw¨orter betroffen sind, wenn 155
die Zellen (2, 3) und (5, 2) (Nummer 3) untersucht werden. Beispiel : Betrachte die Grammatik aus Beispiel 4.4.2. Anwenden des Verfahrens auf die Eingaben w1 = 00100111 und w2 = 01011100 liefert die in Abb. 4.21 angegebenen Ergebnisse. (Ist die Menge Ud,i leer, deuten wir dies durch Freilassen des entsprechenden K¨astchens an.)
d=1
0
0
1
0
0
1
1
1
0
1
0
1
1
0
1
0
D0
D0
D1
D0
D0
D1
D1
D1
D0
D1
D0
D1
D1
D0
D1
D0
S
2
S
4
S
5
D
6
S
7
D
S
S
D
D
3
8
S
S
S
Abbildung 4.21: Anwendung des CYK-Algorithmus auf zwei W¨orter Es ergibt sich, dass w1 in L(G) ist, w2 dagegen nicht. Durch eine leichte Erweiterung der Datenstruktur ist es auch m¨oglich, den Algorithmus so auszubauen, dass im Falle w ∈ L(G) eine Ableitungsfolge oder ein Ableitungsbaum f¨ ur w ausgegeben wird. (Dazu notiert man f¨ ur jede eingetragene Variable A die Produktion A → BC, die zum Eintrag gef¨ uhrt hat, und den Wert d0 , der zu diesem Eintrag geh¨ort. Mit diesen Informationen l¨asst sich, von dem S in K¨astchen (d, 1) beginnend, ein Ableitungsbaum aufbauen.) Ebenso ist leicht feststellbar, ob das Wort w mehrere Ableitungen besitzt. (Wenn in ein K¨astchen (i, d) dieselbe Variable A ein zweites Mal eingetragen wird, bedeutet dies, dass es zwei verschiedene Ableitungsb¨aume f¨ ur die Ableitung ∗ A ⇒ ai · · · ai+d−1 gibt. Wenn ein solcher Eintrag im weiteren Verlauf dazu beitr¨agt, dass die Variable S in das K¨astchen (n, 1) eingetragen wird, dann gibt es f¨ ur das Eingabewort zwei verschiedene Ableitungen. Wir betrachten nochmals zwei Beispieleingaben f¨ ur die Grammatik aus Beispiel 4.4.2: w3 = 01001101 und w4 = 01010111. Die entsprechenden Eintragungen im Schema finden sich in Abb. 4.22.
156
d=1
0
1
0
0
1
1
0
1
0
1
0
1
0
1
1
1
D0
D1
D0
D0
D1
D1
D0
D1
D0
D1
D0
D1
D0
D1
D1
D1
1
2
S
2
S
S
S
D
3
S D
S
4
S
5
S D
2
1
S
6
S
S
7 8
S
S
D S
S
Abbildung 4.22: Mehrere Ableitungen im CYK-Algorithmus Es ergibt sich, dass w3 zwei verschiedene Ableitungsb¨aume besitzt. Die beiden Paare von Variablen S, die zu je einem Eintrag S“ in K¨astchen (8, 1) f¨ uhren, sind mit Indizes 1 ” bzw. 2 markiert. Das Schema f¨ ur w4 weist eine Doppel-Eintragung auf, jedoch ist w4 nicht in L(G). Wir haben gezeigt: 4.5.1 Satz Es gibt einen Algorithmus, der zu einer vorgelegten kontextfreien Grammatik G = (V, Σ, S, P ) und w ∈ Σ∗ entscheidet, ob w ∈ Σ∗ . F¨ ur festes G ist die Laufzeit des 3 Algorithmus O(n ), f¨ ur |w| = n. (Die Gr¨oße und Struktur der Grammatik G geht in die im O“ versteckte Konstante ein.) ” Es sei angemerkt, dass die Laufzeit O(n3 ) zur Analyse von Programmen in einer durch eine kontextfreie Grammatik spezifizierten Programmiersprache indiskutabel langsam ist — schließlich gibt es Programme, die aus zigtausenden von Texteinheiten (Tokens) bestehen. In der Praxis benutzt man daher spezielle Grammatiken, die eine Syntaxanalyse in linearer Zeit erlauben. Weitere Erl¨auterungen hierzu finden sich im folgenden Kapitel 5. (Details ¨ in der Vorlesung Ubersetzerbau“.) ”
4.6
Abschlusseigenschaften kontextfreier Sprachen I
Wir diskutieren hier zun¨achst einige Operationen, unter denen die Klasse L2 der kontextfreien Sprachen abgeschlossen ist. Die Beweistechniken f¨ ur diese positiven Abschlusseigen157
schaften k¨onnen auch gut f¨ ur den Entwurf von kontextfreien Grammatiken f¨ ur komplexere Sprachen benutzt werden. Zum zweiten werden wir zeigen, dass L2 nicht unter der Durchschnittsoperation und unter Komplementbildung abgeschlossen ist. Weitere Abschlusseigenschaften der Klasse L2 und verwandter Klassen werden (nach der Besprechung von Kellerautomaten im folgenden Kapitel 5) in Abschnitt 5.6 diskutiert. 4.6.1 Satz Die Klasse L2 ist abgeschlossen unter Vereinigung, Konkatenation und Kleene-Abschluss. Beweis: Wir betrachten zun¨achst Vereinigung und Konkatenation. Es sei L1 = L(G1 ), L2 = L(G2 ) f¨ ur kontextfreie Grammatiken G1 = (V1 , Σ1 , S1 , P1 ) und G2 = (V2 , Σ2 , S2 , P2 ). O. B. d. A. k¨onnen wir annehmen, dass V1 ∩ V2 = ∅. Dann definieren wir neue Grammatiken G0 und G00 durch Zusammenwerfen von P1 und P2 und Verbinden der beiden Teile durch passend gew¨ahlte Startproduktionen. Hierzu w¨ahlen wir eine neue Variable S, also S 6∈ V1 ∪ V2 . G0 := (V1 ∪ V2 ∪ {S}, Σ1 ∪ Σ2 , S, P1 ∪ P2 ∪ {S → S1 | S2 }) G00 := (V1 ∪ V2 ∪ {S}, Σ1 ∪ Σ2 , S, P1 ∪ P2 ∪ {S → S1 S2 }). Man u ¨berzeugt sich leicht, dass L(G0 ) = L1 ∪ L2 und L(G00 ) = L1 L2 gilt. Nun betrachten wir den Kleene-Abschluss. Gegeben sei eine kontextfreien Grammatik G = (V, Σ, S, P ). Wir w¨ahlen eine neue Variable S 0 , S 0 6∈ V , und definieren eine kontextfreie Grammatik G000 wie folgt: G000 := (V ∪ {S 0 }, Σ, S 0 , P ∪ {S 0 → S S 0 | ε}). Wieder ist leicht zu sehen, dass L(G000 ) = L(G)∗ gilt.
4.6.2 Beispiel Wir betrachten die Grammatiken G1 = ({A}, {0, 1}, A, P1 ) mit den Produktionen A → 0A1 | ε und G2 = ({B}, {0, 1}, B, P2 ) mit den Produktionen B → 1B0 | ε. Eine Grammatik f¨ ur die Sprache L(G1 ) ∪ L(G2 ) = {0n 1n | n ≥ 0} ∪ {1n 0n | n ≥ 0} hat Startvariable S und Produktionen S → A|B A → 0A1 | ε B → 1B0 | ε 158
Eine Grammatik f¨ ur die Sprache L(G1 )L(G2 ) = {0n 1n 1m 0m | n, m ≥ 0} hat Startvariable S und Produktionen S → AB A → 0A1 | ε B → 1B0 | ε Schließlich sieht eine Grammatik f¨ ur die Sprache L(G1 )∗ = {0n1 1n1 · · · 0nr 1nr | r ≥ 0, n1 , . . . , nr ≥ 0} wie folgt aus: Startvariable S, Produktionen S → AS | ε A → 0A1 | ε F¨ ur den folgenden Satz rekapituliere man Definition 2.5.2, die die Substitution von Sprachen definiert. Es ist ziemlich klar, dass kontextfreie Sprachen unter dieser Operation abgeschlossen sind, da kontextfreie Grammatiken wesentlich auf der Substitutionsoperation beruhen. 4.6.3 Satz Die Klasse L2 ist abgeschlossen unter Substitution. D. h.: Wenn f eine Substitution wie in Definition 2.5.2 ist und f (a1 ), . . . , f (an ) sowie L kontextfreie Sprachen sind, so ist auch f (L) kontextfrei. Beweis: Man w¨ahlt Grammatiken G1 , . . . , Gn (mit Startvariablen S1 , . . . , Sn ) und G f¨ ur die Sprachen f (a1 ), . . . , f (an ) und L und sorgt daf¨ ur, dass die Variablenmengen in diesen Grammatiken disjunkt sind. Dann ersetzt man f¨ ur 1 ≤ i ≤ n in G das Teminalzeichen ai durch eine neue Variable Di , vereinigt alle Produktionenmengen, und f¨ ugt die n Produktionen Di → Si zur Produktionenmenge hinzu. Die resultierende Grammatik erzeugt f (L).
4.6.4 Satz
Die Klasse L2 ist nicht abgeschlossen unter Durchschnitt und Komplement.
Beweis: Durchschnitt“: Wir m¨ ussen zeigen, dass es kontextfreie Sprachen L1 und L2 ” gibt, deren Durchschnitt nicht kontextfrei ist. Betrachte hierzu L1 := {ai bi cj | i, j ≥ 1} und L2 := {ai bj cj | i, j ≥ 1}. 159
Beide Sprachen sind kontextfrei. Zum Beispiel wird L1 von einer Grammatik mit den Produktionen S → AC A → aAb | ab C → cC | c erzeugt. Jedoch ist L1 ∩ L2 = {am bm cm | m ≥ 1}, eine Sprache, die sich in Behauptung 4.4.3 als nicht kontextfrei herausstellte. Komplement“: Wir untersuchen die Sprache ” L3 = {ai bj ck | i, j, k ≥ 0, i 6= j oder j 6= k}. Behauptung 1: L3 ist kontextfrei. Dies sieht man folgendermaßen: L3 = L01 ∪ L02 ∪ L03 ∪ L04 , wobei L01 L02 L03 L04
= = = =
{ai bj ck {ai bj ck {ai bj ck {ai bj ck
| 0 ≤ i < j, k ≥ 0} | 0 ≤ j < i, k ≥ 0} | 0 ≤ j < k, i ≥ 0} | 0 ≤ k < j, i ≥ 0}.
Die vier Sprachen L01 , . . . , L04 sind alle kontextfrei — zum Beispiel wird L01 von einer Grammatik mit den folgenden Produktionen erzeugt: S → AbC A → aAb | Ab | ε C → cC | ε Nach Satz 4.6.1 ist also auch L3 kontextfrei. Behauptung 2: L4 := L3 ∪ (Σ∗ − L(a∗ b∗ c∗ )) ist kontextfrei. — Dies sieht man so ein: Die Sprache L(a∗ b∗ c∗ ) und daher auch Σ∗ − L(a∗ b∗ c∗ ) sind regul¨ar. (Die regul¨aren Sprachen sind unter Komplement abgeschlossen!) Weil L3 ⊆ L2 , ist Σ∗ −L(a∗ b∗ c∗ ) auch kontextfrei. Daraus folgt, wieder mit Satz 4.6.1, dass L4 ebenfalls kontextfrei ist. Behauptung 3: L4 ist nicht kontextfrei. — In L4 sind alle W¨orter, die weder in Σ∗ − L(a∗ b∗ c∗ ) noch in L3 sind. Dies sind also die W¨orter der Form ai bj ck , die i = j und j = k erf¨ ullen. Das heißt: L4 = {am bm cm | m ≥ 0}, die Sprache, die nach Behauptung 4.4.3 nicht kontextfrei ist.
160
Kapitel 5 Kellerautomaten In diesem Kapitel behandeln wir das Maschinenmodell, das den kontextfreien Grammatiken entspricht, n¨amlich die nichtdeterministischen Kellerautomaten. Anhand des Modells werden verschiedene Prinzipien f¨ ur die Syntaxanalyse (die Erstellung eines Ableitungsbaumes zu einem vorgelegten Wort aus L(G)) diskutiert: Top-Down-Parsing und BottomUp-Parsing. Weiter wird auf die deterministische Variante des Kellerautomaten-Modells und die zugeh¨orige Sprachklasse eingegangen. Schließlich werden einige Abschluss- und Entscheidbarkeitseigenschaften der entsprechenden Sprachklassen diskutiert.
5.1
Nichtdeterministische Kellerautomaten
Was passiert mit der Berechnungsst¨arke von endlichen Automaten, wenn sie zus¨atzlich zur Kontrolleinheit mit einem weiteren (unendlichen) Speichermedium versehen werden? Wir betrachten hier eine ganz spezielle Form eines Speichers: einen Keller“ oder Stack“ ” ” (englisch auch: pushdown store“).1 ” Diese Datenstruktur l¨asst die Operationen empty, push und pop zu, wobei empty einen leeren Keller erzeugt, push a das Element a oben auf den Keller legt, und pop das oberste Kellerelement entfernt und ausliest. Im Zusammenhang mit Sprachen speichern wir Buchstaben eines (Keller-)Alphabets. 1
Synonym auch: Stapel, LIFO-Speicher, f¨ ur last-in-first-out
161
leer:
push
push
push
pop
push
push
push
κ
λ κ
φ
λ
π
κ
λ
κ
λ
π
λ κ
κ
λ κ
κ
π λ κ
pop
pop
push
pop
pop
pop
κ
π
π
π
κ
π
λ κ
π
λ κ
λ κ
λ κ
λ
pop
push
λ
κ Abbildung 5.1: Arbeitsweise eines Kellerspeichers
Die Funktionsweise eines Kellers wird in Abbildung 5.1 veranschaulicht, die den Effekt der Operationsfolge empty; push κ; push λ; push φ; pop; push π; push κ; push λ; pop; pop; push π; pop; pop; pop; pop; push λ; auf einen anfangs leeren Keller zeigt. Keller sind sehr gut zur Bearbeitung von klammerartigen Strukturen geeignet; Zum Beispiel kann man die Auswertung eines (auch geklammerten und nach der Punkt-vor StrichRegel auszuwertenden) arithmetischen Ausdrucks sehr bequem mit einer solchen Datenstruktur durchf¨ uhren. Wir werden hier sehen, dass alle von kontextfreien Grammatiken erzeugbaren Strukturen von Automaten mit einem Keller analysiert werden k¨onnen. Ein Kellerautomat besteht aus einem Kellerspeicher (pushdown store), einer Steuereinheit, wie sie von den endlichen Automaten bekannt ist, und einem Eingabeband, das einfach von links nach rechts gelesen wird. Abbildung 5.2 veranschaulicht die Struktur.
162
Eingabeband:
c a
c b
b
c #
c
b b
c a
c
Lesekopf: Keller:
B
Steuereinheit:
B C A C Abbildung 5.2: Anschauliches Bild eines Kellerautomaten Im Keller eines solchen Kellerautomaten k¨onnen die Elemente eines Keller-Alphabets“ Γ ” gespeichert werden. Anfangs steht im Keller ein besonderes Zeichen, das Keller-Anfangs” Symbol“. Die Eingabe f¨ ur den Kellerautomaten steht auf einem separaten Eingabeband, das mit Hilfe eines Lesekopfs“ einmal von links nach rechts gelesen wird. Anfangs steht ” der Kopf auf dem ersten Zeichen des Eingabewortes x ∈ Σ∗ . Die Steuereinheit des Kellerautomaten sieht aus wie bei einem DFA oder einem NFA: es gibt endlich viele Zust¨ande, von denen einer als Startzustand ausgezeichnet ist. Der Kellerautomat rechnet in Schritten. In einem Schritt r¨ uckt der Kopf auf dem Eingabeband entweder um ein Feld nach rechts oder ¨andert seine Position nicht (letzteres nennen wir einen ε-Zug“). Wenn das Eingabewort vollst¨andig gelesen worden ist, befindet sich ” der Lesekopf rechts von der Eingabe; dies ist also auch eine legale Position. Ein Schritt besteht dabei aus folgenden Teilschritten: 1. Das oberste Kellersymbol A wird vom Keller entfernt und gemerkt (pop-Operation). 2. Es wird entweder das n¨achste Symbol ai des Eingabewortes gelesen (dann r¨ uckt der Lesekopf um ein Feld nach rechts) oder nichts vom Eingabeband gelesen (der Lesekopf bewegt sich nicht: ε-Zug). 3. Das Kellerzeichen A, der gegenw¨artige Zustand q und (falls kein ε-Zug vorliegt) das Zeichen ai zusammen legen fest, welche Z¨ uge ausf¨ uhrbar sind. Ein Zug besteht dabei aus – einem neuen Zustand q 0 ; 163
– einer Folge γ = X1 · · · Xr von Kellerzeichen, die auf den Keller gelegt werden: push(Xr ); push(Xr−1 ); . . . push(X1 ). Einer der ausf¨ uhrbaren Z¨ uge wird durchgef¨ uhrt. In einer gegebenen Situation k¨onnen in Teilschritt 3. kein, ein, oder mehrere verschiedene Z¨ uge ausf¨ uhrbar sein. Die hier betrachteten Kellerautomaten sind also nichtdeterministisch. Daher sind, wie bei NFA’s, eventuell auf einer Eingabe viele verschiedene Berechnungen m¨oglich. Eine Berechnung des Kellerautomaten auf einer Eingabe x = a1 · · · an akzeptiert, falls nach Lesen aller Zeichen der Eingabe und Durchf¨ uhrung entsprechender Z¨ uge der Keller v¨ollig geleert ist. Man beachte, dass nach v¨olligem Entleeren des Kellers kein weiterer Schritt m¨oglich ist (Teilschritt 1. kann nicht durchgef¨ uhrt werden) und dass nach Lesen des letzten Eingabezeichens an nur noch ε-Z¨ uge m¨oglich sind. 5.1.1 Beispiel
Palindrome (Spiegelw¨orter) u ¨ber {a, b, c} mit Mittezeichen.
Wir beschreiben die Funktionsweise einen Kellerautomaten, der genau die W¨orter der (nicht regul¨aren) Sprache L = {w#wR | w ∈ {a, b, c}∗ } akzeptiert. Zun¨achst gehen wir informal vor. Der Automat arbeitet in zwei Phasen. Lesephase: Vor dem Auftauchen von #“ werden im Keller die bisher gelesenen Zeichen ” gespeichert. Kontrollphase: Nach dem #“ werden die gelesenen Zeichen mit den Kellerzeichen ver” glichen. Die Steuereinheit wird benutzt, um zwischen den Phasen ( L“ f¨ ur links“‘, R“ f¨ ur rechts“) ” ” ” zu unterscheiden. Wenn in der Kontrollphase ein weiteres #“ auftaucht, bricht die Rech” nung ab.
164
Beginn: Eingabeband:
c a
c b
b
c #
Lesekopf
c
b b
c a
c
c a
c
c a
c
Keller:
L
R
Nach dem Einlesen von 5 Buchstaben: Eingabeband:
c a
c b
b
c #
c
b b
Keller:
B B C A C
L
R
Nach dem Entdecken des #: Eingabeband:
c a
c b
b
c #
c
b b
Keller:
C B B C A C
L
R
165
Nach dem Kontrollieren von 3 Buchstaben: Eingabeband:
c a
c b
b
c #
c
b b
c a
c
c a
c
Keller:
C A C
L
R
Am Ende der Eingabe: Eingabeband:
c a
c b
b
c #
c
b b
Keller:
L
R
Wort zuende, Keller leer: akzeptieren!
Wir setzen nun die obige informale Beschreibung in eine formale Definition um. 5.1.2 Definition Ein nichtdeterministischer Kellerautomat (englisch: nondeterministic pushdown automaton; Abk.: NPDA) ist ein 6-tupel M = (Q, Σ, Γ, q0 , Z0 , δ), bestehend aus 6 Komponenten: – Q, einer endlichen, nichtleeren Menge von Zust¨anden, – Σ, dem Eingabe-Alphabet; – Γ, dem Keller-Alphabet (Stack-Alphabet) – q0 ∈ Q, dem Startzustand – Z0 ∈ Γ, dem Symbol, das anfangs im Keller steht ¨ – δ : Q × (Σ ∪ {ε}) × Γ → P<∞ (Q × Γ∗ ), der (nichtdeterministischen) Ubergangsfunktion. (Dabei steht P<∞ (X) f¨ ur {Y ⊆ X | X endlich}, f¨ ur beliebige Mengen X.) 166
¨ Wir erl¨autern die Details und die Anwendung der Ubergangsfunktion δ. Wenn q ein Zustand, a ein Buchstabe aus Σ und Z ein Buchstabe aus dem Kelleralphabet Γ ist, dann ist δ(q, a, Z) eine endliche Menge von Paaren (q 0 , Z1 · · · Zr ), q 0 Zustand, r ≥ 0, Z1 , . . . , Zr Buchstaben aus Γ. Jedes solche Paar beschreibt einen m¨ oglichen Zug , wenn auf dem Eingabeband a steht, der Automat in Zustand q ist und das oberste Kellerzeichen Z ist. Wenn δ(q, a, Z) = ∅ ist, ist in dieser Situation kein Zug m¨oglich, der a liest. Wird der Zug (q 0 , Z1 · · · Zr ) angewendet, • geht der Automat in den neuen Zustand q 0 u ¨ber, • das Eingabezeichen a wird gelesen, • der Lesekopf wird um ein Feld nach rechts ger¨ uckt, • das alte Kellerzeichen Z wird entfernt ( pop“) und ” • die Kellerzeichen Z1 · · · Zr werden auf den Keller gepackt, in der Art, dass Z1 oben liegt. Dies entspricht der Operationsfolge push(Xr ); push(Xr−1 ); . . . push(X1 ). Bemerkung: Mit r = 0 wird das oberste Kellersymbol gestrichen. Mit r = 1 und Z1 = Z bleibt der Keller unver¨andert. Mit r ≥ 2 und Zr = Z werden Z1 , . . . , Zr−1 auf den Keller gestapelt. Neben den Z¨ ugen, die einen Buchstaben lesen, gibt es die ε-Zu ¨ ge, die durch die Werte δ(q, ε, Z) gegeben sind. Auch δ(q, ε, Z) ist jeweils eine endliche, m¨oglicherweise leere, Menge von Z¨ ugen. Wenn der Automat in Zustand q ist und das oberste Kellerzeichen Z ist, kann einer der Z¨ uge aus δ(q, ε, Z) ausgef¨ uhrt werden. Wenn der Zug (q 0 , Z1 · · · Zr ) ausgef¨ uhrt wird, geht der Automat in den Zustand q 0 u ¨ber und ersetzt das oberste Kellerzeichen Z durch Z1 · · · Zr . Der Lesekopf ver¨andert seine Position nicht. Beachte: In einer Situation, in der M in Zustand q ist, das n¨achste Eingabezeichen a ist und das oberste Kellerzeichen Z ist, ist jeder der Z¨ uge aus δ(q, a, Z)∪δ(q, ε, Z) anwendbar. Wir sagen (vorerst informal), dass M ein Wort x akzeptiert, wenn es m¨oglich ist, aus der Startsituation (Zustand q0 , Kellerinhalt Z0 , x als Inhalt des Eingabebands) durch Anwendung einer von δ erlaubten Folge von Z¨ ugen das Eingabewort vollst¨andig zu lesen und dabei den Keller zu leeren. 5.1.3 Beispiel Wir setzen Beispiel 5.1.1 fort. Ein NPDA, der genau die Palindrome mit Mittezeichen akzeptiert, hat die folgenden Komponenten: • Q = {L, R} • Σ = {a, b, c, #} • Γ = {A, B, C, ⊥} • q0 = L 167
• Z0 = ⊥ • δ ist durch die folgende Tabelle gegeben: ⊥ A δ (L, a) (L, A) (L, AA) (L, b) (L, B) (L, BA) (L, c) (L, C) (L, CA) (L, #) (R, ε) (R, A) – (R, ε) (R, a) (R, b) – – – – (R, c) – – (R, #)
B C (L, AB) (L, AC) (L, BB) (L, BC) (L, CB) (L, CC) (R, B) (R, C) – – (R, ε) – – (R, ε) – –
In der Tabelle steht ein Paar (q 0 , γ) f¨ ur die Einermenge {(q 0 , γ)}; der Strich – “ ” steht f¨ ur ∅. Die Zeilen f¨ ur die ε-Z¨ uge sind weggelassen, da δ(q, a, Z) = ∅ ist f¨ ur alle a, q, Z, also u uge m¨oglich sind. ¨berhaupt keine ε-Z¨ ¨ Man sieht, dass die Ubergangsfunktion deterministisch ist in dem Sinn, dass in jeder Situation entweder ein oder kein Zug m¨oglich ist. Dies ist von der Definition nicht verboten. Das Anfangs-Keller-Zeichen wird im ersten Leseschritt gel¨oscht. Man u ¨berzeuge sich durch Testen auf einigen Eingabew¨ortern, z. B. ε, #, a#a, a#, ac#ca und acc#ccab, dass der beschriebene Automat genau mit den Palindromen mit Mittezeichen als Input die beabsichtigte Berechnung absolviert (vollst¨andiges Lesen des Eingabeworts, Leeren des Kellers). Situationen, die zu einem fehlerhaften Anhalten f¨ uhren, sind: • Leeren des Kellers, bevor das Eingabewort vollst¨andig gelesen ist; • Erreichen des Endes des Eingabewortes, ohne dass der Keller leer ist; • eine Situation mit Zustand q, oberstem Kellerzeichen Z, Eingabebuchstaben a, in der δ(q, a, Z) ∪ δ(q, ε, Z) = ∅ ist. Auch beachte man die Wirkung der Z¨ uge • (L, AB) ∈ δ(L, a, B) (Hinzuf¨ ugen von A“ im Keller), ” • (L, A) ∈ δ(L, #, A) (Keller bleibt unver¨andert), • (R, ε) ∈ δ(L, a, A) (L¨oschen des Kellersymbols A“ nach Abgleich mit dem Einga” bezeichen a).
168
Alternativ zur Tabellendarstellung kann man f¨ ur den Entwurf und f¨ ur die Beschreibung ¨ der Ubergangsfunktion f¨ ur (kleine) NPDA’s auch eine graphische Darstellung benutzen. In Abb. 5.3 ist eine solche Darstellung f¨ ur den NPDA aus Beispiel 5.1.3 angegeben.
Start
a,
A
b,
B
#, u u
c,
C
#,
a, u A u
L
ε
a, A ε R
b, B ε c ,C ε
b, u B u c, u C u u steht für A, B oder C
Abbildung 5.3: Graphische Darstellung eines NPDA In einer solchen graphischen Darstellung von M = (Q, Σ, Γ, q0 , Z0 , δ) gibt es f¨ ur jeden Zustand q ∈ Q einen Knoten, der mit q beschriftet ist. Der Knoten f¨ ur den Startzustand q0 ist mit einem Pfeil gekennzeichnet. Falls (q 0 , Z1 · · · Zr ) ∈ δ(q, a, Z), verl¨auft eine Kante von q nach q 0 , die mit a, Z | Z1 · · · Zr beschriftet ist. Dabei werden Mehrfachkanten zu einer zusammengefasst, die mit einer ¨ Liste von Beschriftungen versehen ist; weitere Abk¨ urzungen f¨ ur ¨ahnliche Uberg¨ ange sind m¨oglich. Um auch die Wirkung des Nichtdeterminismus zu sehen, betrachten wir ein weiteres Beispiel. 5.1.4 Beispiel
Die Sprache L = {w wR | w ∈ {a, b, c}∗ }
enth¨alt genau die Palindrome (Spiegelw¨orter) u ¨ber {a, b, c}, die gerade L¨ange haben. Zum Beispiel sind ε, aaaa und abbccbba in dieser Sprache, nicht hingegen aca und abca. Die Idee f¨ ur einen NPDA, der die W¨orter dieser Sprache akzeptiert, ist die folgende. Der Automat arbeitet in zwei Phasen. Lesephase: (Zustand L“) Die gelesenen Zeichen werden im Keller gespeichert. ” 169
Kontrollphase: (Zustand R“) Die gelesenen Zeichen werden mit den Kellerzeichen ver” glichen. Da das Eingabewort keine Markierung f¨ ur das Umschalten von der Lese- zur Kontrollphase enth¨alt, benutzen wir hierf¨ ur den Nichtdeterminismus: Jederzeit w¨ahrend der Lesephase kann der NPDA nichtdeterministisch w¨ahlen, ob das n¨achste Zeichen gelesen und im Keller gespeichert oder spontan (mit einem ε-Zug) in die Kontrollphase gewechselt werden soll. Der NPDA hat die folgenden Komponenten: • Q = {L, R} • Σ = {a, b, c} • Γ = {A, B, C, ⊥} • q0 = L • Z0 = ⊥ • δ ist durch die folgende Tabelle gegeben: δ ⊥ A (L, a) (L, A) (L, AA) (L, b) (L, B) (L, BA) (L, c) (L, C) (L, CA) (L, ε) (R, ε) (R, A) (R, a) – (R, ε) (R, b) – – (R, c) – –
B C (L, AB) (L, AC) (L, BB) (L, BC) (L, CB) (L, CC) (R, B) (R, C) – – (R, ε) – – (R, ε)
Die graphische Darstellung sieht aus wie in Abb. 5.4 angegeben. Start
a,
A
b,
B
ε, u u
c,
C
ε,
a, u A u
L
ε
a, A ε R
b, B ε c ,C ε
b, u B u c, u C u u steht für A, B oder C
Abbildung 5.4: NPDA f¨ ur Palindrome gerader L¨ange 170
Nun hat in dieser Tabelle jeder Eintrag δ(q, a, Z) und δ(q, ε, Z) Gr¨oße 1 oder Gr¨oße 0. Wo ist die nichtdeterministische Enscheidungsm¨oglichkeit? Wenn zum Beispiel der Zustand L und das oberste Kellerzeichen A ist, und der n¨achste Buchstabe auf dem Eingabeband das b, dann kann der NPDA zwischen den Z¨ ugen (L, BA) ∈ δ(L, b, A) aus und (R, A) ∈ δ(L, ε, A) w¨ahlen. Man finde f¨ ur die Eingabe acca eine Berechnung des NPDA M , die das Wort liest und den Keller leert, sowie eine Berechnung, die eine Fehlentscheidung trifft und in eine Sackgasse ger¨at! Wie sieht die erfolgreiche Berechnung f¨ ur die Eingabe ε aus? Um das Verhalten von NPDA’s formal zu erfassen, ohne nichtmathematische Gegenst¨ande wie Lesek¨opfe oder Kellerspeicher zu erw¨ahnen, benutzen wir das Konzept der Konfigurationen. Dieses Vorgehen ist typisch und beispielhaft f¨ ur die exakte Beschreibung der Semantik von Systemen, die in Schritten rechnen und Speicher- oder Steuer-Zust¨ande haben. 5.1.5 Definition
Sei M = (Q, Σ, Γ, q0 , Z0 , δ) ein NPDA.
(a) Eine Konfiguration von M ist ein Tripel (q, w, α) ∈ Q × Σ∗ × Γ∗ . Beispiel : Im NPDA aus Beispiel 5.1.4 sind (L, aabbc, BBC) oder (R, aabbc, CCC⊥AB) Konfigurationen. (q ist der gegenw¨artige Zustand, w ist das noch nicht gelesene Suffix des Eingabewortes, α = A1 · · · Ar ∈ Γ∗ , r ≥ 0, ist der Kellerinhalt — A1 ist das oberste Kellersymbol. Es ist nicht verlangt, dass das Wort α in einer Berechnung als Kellerinhalt auftreten kann.) Die Menge aller Konfigurationen von M nennen wir KM . (KM ist eine unendliche Menge.) (b) Wenn k = (q, au, Zγ) Konfiguration ist, mit q ∈ Q, a ∈ Σ, u ∈ Σ∗ , Z ∈ Γ und γ ∈ Γ∗ , und wenn zudem (q 0 , Z1 · · · Zr ) ∈ δ(q, a, Z) ist, dann nennen wir k 0 = (q 0 , u, Z1 · · · Zr γ) eine direkte Nachfolgekonfiguration von k und schreiben k `M k 0 oder k ` k 0 ; weiterhin: wenn k = (q, u, Zγ) Konfiguration ist, mit q ∈ Q, u ∈ Σ∗ , Z ∈ Γ und γ ∈ Γ∗ , und wenn zudem (q 0 , Z1 · · · Zr ) ∈ δ(q, ε, Z) ist, dann nennen wir k 0 = (q 0 , u, Z1 · · · Zr γ) eine direkte Nachfolgekonfiguration von k und schreiben k `M k 0 oder k ` k 0 . Damit ist `M eine zweistellige Relation auf KM . 171
(c) Die Relation `∗M , oder kurz `∗ , ist die reflexive und transitive H¨ ulle von ` (siehe ∗ 0 Beispiel A.2.16 im Anhang), das heißt: k `M k ⇔ es existiert eine Folge k0 = k, . . . , kl = k 0 , l ≥ 0, derart dass ki−1 ` ki , f¨ ur 1 ≤ i ≤ l. (Dies bedeutet, dass k = k 0 ist oder dass man in einer Reihe von legalen Schritten von der Konfiguration k zur Konfiguration k 0 kommen kann.) (d) M akzeptiert x ∈ Σ∗ , falls (q0 , x, Z0 ) `∗M (q, ε, ε) f¨ ur ein q ∈ Q. (Startend in Zustand q0 , mit Eingabe x und nur dem Zeichen Z0 im Keller, kann in einer Reihe von legalen Schritten das Eingabewort gelesen und der Keller geleert werden.) Die Konfiguration initM (x) := (q0 , x, Z0 ) heißt Startkonfiguration von M zu Eingabe x. Jede legale Konfigurationenfolge initM (x) = k0 `M k1 `M k2 `M · · · `M kt heißt eine Berechnung von M auf x. (e) LM := {x ∈ Σ∗ | M akzeptiert x} heißt die von M akzeptierte Sprache. Wir betrachten nochmals Beispiel 5.1.4. Die folgenden Paare liegen in der Relation `M : (L, aabbc, BBC) `M (L, abbc, ABBC) (L, aabbc, BBC) `M (R, aabbc, BBC) ¨ (Auch dumme Uberg¨ ange k¨onnen legal sein.) (L, abc, BBC⊥A) `M (L, bc, ABBC⊥A) (Es kommt nicht darauf an, ob k und k 0 in echten Berechnungen vorkommen.) (R, aabbc, BBC) hat keine Nachfolgekonfiguration. (R, aabbc, ε) hat keine Nachfolgekonfiguration. Eine legale Berechnung dieses NPDA, die zur gew¨ unschten akzeptierenden Konfiguration f¨ uhrt, ist folgende:
` ` ` ` `
(L, cbbc, ⊥) (L, bbc, C) (L, bc, BC) (R, bc, BC) (R, c, C) (R, ε, ε).
172
Eine legale, aber nicht akzeptierende Berechnung auf demselben Eingabewort: ` ` ` `
(L, cbbc, ⊥) (L, bbc, C) (L, bc, BC) (L, c, BBC) (R, c, BBC)
Diese Berechnung f¨ uhrt in eine Sackgasse“, eine Konfiguration ohne Nachfolgekonfigura” tion. Obgleich solche Sackgassen existieren, geh¨ort das Wort x = cbbc zur Sprache LM : eine akzeptierende Berechnung gen¨ ugt uns.
(L,abbbba, (L,bbbba,A) (L,bbba,BA) (L,bba,BBA) (L,ba,BBBA) (L,a,BBBBA)
(R,abbbba, ε ) (R,bbbba,A) (R,bbba,BA)
(R,bba,BBA)
(R,ba,BBBA)
(L, ε,ABBBBA) (R,a,BBBBA)
)
(R,a,BBA)
(R,ε ,ABBBBA)
(R,bba,A) (R,ba,BA) (R,a,A) (R, ε , ε )
Abbildung 5.5: Baum aller m¨oglichen Berechnungen auf Eingabe abbbba Um dies zu verdeutlichen, geben wir in Abb. 5.5 den Baum aller m¨oglichen legalen Berechnungen auf dem Eingabewort abbbba an. Sechs dieser Berechnungen enden in einer Sackgasse, aber eine erreicht die akzeptierende Konfiguration (R, ε, ε). Dies gen¨ ugt, um abbbba ∈ LM zu folgern. Wenn ein Wort x nicht in LM ist, dann enth¨alt der Baum aller m¨oglichen Berechnungen keine einzige Berechnung, die in der akzeptierende Konfiguration (R, ε, ε) endet. (Man zeichne den entsprechenden Baum f¨ ur die Eingabe abbb!) 5.1.6 Beispiel Zu guter Letzt wollen wir noch einen NPDA f¨ ur die Sprache der korrekten Klammerausdr¨ ucke angeben. Zur Abwechslung benutzen wir nicht die Buchstaben 0 und 1, sondern ( und ). Es geht also um die Sprache L = {w | w ∈ {(, )}∗ ist korrekter Klammerausdruck} 173
Die Idee f¨ ur den NPDA ist ganz einfach: Wir z¨ahlen im Keller die offenen“ Klammern. ” Das heißt: Beim Lesen eines (“ wird der Kellerstand um 1 erh¨oht, beim Lesen eines )“ ” ” wird der Kellerstand um 1 erniedrigt. Ein Fehler tritt ein, wenn der Keller leer ist und ein )“ gelesen wird. Hingegen ist es kein Fehler, wenn der Keller leer wird und dann ” wieder ein (“ gelesen wird. (Man hat dann ein Pr¨afix des Eingabewortes gesehen, das ” f¨ ur sich ein korrekter Klammerausdruck ist.) Hierf¨ ur benutzen wir folgenden Trick: Das Kellerendezeichen ⊥ wird nicht gel¨oscht. Wenn es als oberstes Kellerzeichen auftaucht, wissen wir, dass der Keller eigentlich“ leer ist und dass kein )“ gelesen werden kann. ” ” ¨ Andererseits erlauben wir in dieser Situation einen ε-Ubergang, der das ⊥ l¨oscht, den Keller im technischen Sinn leert, und die Berechnung beendet. Der NPDA hat die folgenden Komponenten: • Q = {0}
(|Q| = 1: Zustand ist irrelevant);
• Σ = {(, )}; • Γ = {1, ⊥}; • q0 = 0; • Z0 = ⊥; • δ ist durch folgende Tabelle gegeben: ⊥ 1 δ (0, () (0, 1⊥) (0, 11) (0, )) − (0, ε) (0, ε) (0, ε) −
(, Start
0
1
(, 1
11
), 1
ε
ε,
ε
Abbildung 5.6: NPDA f¨ ur korrekte Klammerausdr¨ ucke
174
5.2
Top-Down-Parsing, LL-Parsing
Wir wollen zun¨achst anhand eines Beispiels u ¨berlegen, dass kontextfreie Grammatiken mit Kellerautomaten verarbeitet werden k¨onnen. Dazu betrachten wir die Grammatik G = (V, Σ, S, P ) mit V = {S}, Σ = {(, )} und P = {S → (S)S | ε}, die bekanntermaßen die korrekten Klammerausdr¨ ucke erzeugt. Der Kellerautomat hat Bandalphabet Σ, Kelleralphabet Γ = {S, (, )} und Anfangs-Kellerzeichen Z0 = S. Erlaubt sind folgende Aktionen: 1) Ist ( oberstes Kellerzeichen und n¨achstes Eingabezeichen, streiche ( aus dem Keller und r¨ ucke Leseband um 1 Feld nach rechts ( Lesen“: L). ” 2) Wie 1), mit ( durch ) ersetzt ( Lesen“ : L). ” 3) Ist S oberstes Kellerzeichen, ersetze dies durch nichts (ε) oder durch die 4 Zeichen (S)S ( Expandieren“: E). ” Die Eingabe ()(()()) kann dann folgendermaßen verarbeitet werden: Aktionstyp gelesene Bandbuchstaben Keller Start S E (S)S L ( S)S E ( )S L () S E () (S)S L ()( S)S E ()( (S)S)S L ()(( S)S)S E ()(( )S)S L ()(() S)S E ()(() (S)S)S L ()(()( S)S)S E ()(()( )S)S L ()(()() S)S E ()(()() )S L ()(()()) S E ()(()()) Schluss Beobachte: Konkateniert man in jeder Zeile die gelesenen Buchstaben und den Kellerinhalt, ergibt sich, von oben nach unten gelesen, eine Linksableitung f¨ ur das Eingabewort ()(()()). Das Lesen eines Wortes w aus L(G) unter Herstellung einer Ableitung (insbes. eines Ableitungsbaums f¨ ur w) nennen wir Parsing . In unserem Beispiel wird das Wort von links 175
nach rechts gelesen; dabei wird eine Linksableitung erzeugt ( LL-Parsing“). Wenn man ” die in dieser Linksableitung durchgef¨ uhrten Expansionsschritte in der in Lemma 4.2.3 ( ⇒“) beschriebenen Weise in einen Ableitungsbaum umsetzt, dann entsteht dieser von ” der Wurzel (oben) her auf die Bl¨atter (unten) zu wachsend. Wir sprechen daher beim LL-Parsing auch von Top-Down-Syntaxanalyse“. ” 5.2.1 Beispiel Wir formalisieren den oben skizzierten NPDA zur Grammatik mit den Produktionen S → (S)S | ε wie folgt: • Q = {0}; q0 = 0 (der Zustand ist irrelevant); • Σ = {(,)}; • Γ = {S, (, )}, Z0 = S; • δ(0,(,() = {(0, ε)} (L) , δ(0,),)) = {(0, ε)} (L) , δ(0, ε, S) = {(0, ε), (0, (S)S)} (E). Das eben an einem Beispiel beschriebene Vorgehen l¨asst sich f¨ ur jede kontextfreie Grammatik anwenden. 5.2.2 Satz Zu jeder kontextfreien Grammatik G gibt es einen NPDA M mit L(G) = LM . Der Kellerautomat M hat nur einen Zustand. Beweis: Es sei G = (V, Σ, S, P ) eine kontextfreie Grammatik. Wir konstruieren M = (Q, Σ, Γ, q0 , Z0 , δ) in Verallgemeinerung von Beispiel 5.2.1 wie folgt. Wenn das oberste Kellersymbol eine Variable A ist, kann diese in einem Expansionsschritt“ durch irgend” eine rechte Seite α einer Produktion A → α ersetzt werden. Der Nichtdeterminismus liegt darin, dass zu einer Variablen mehrere rechte Seiten geh¨oren k¨onnen. Wenn das oberste Kellerzeichen ein Terminalzeichen a ist, kann nur ein Leseschritt“ erfolgen: es wird ge” pr¨ uft, ob das n¨achste Eingabezeichen ebenfalls a ist; in diesem Fall wird dieses a gelesen und aus dem Keller gel¨oscht. Formal: • Q = {0}, • Γ = V ∪ Σ, • Z0 = S, • δ(0, a, a) = {(0, ε, ε)} (Leseschritt) δ(0, ε, A) = {(0, γ) | A → γ ist in P }, f¨ ur A ∈ V (Expansionsschritt).
176
Wir m¨ ussen nun zeigen, dass tats¨achlich L(G) = LM ist. Die Idee des Beweises ist ganz einfach. Aus einer akzeptierenden Berechnung von M auf w erhalten wir durch Betrachten der Expansionsschritte eine Linksableitung f¨ ur w in G; umgekehrt kann man aus einer Linksableitung eine akzeptierende Berechnung erhalten, indem man passende Leseschritte dazwischenschiebt. Etwas formaler sieht das so aus: L(G) ⊆ LM “: Es sei ein Wort w ∈ L(G) mit einer Linksableitung ” S = α0 ⇒G α1 ⇒G · · · ⇒G αt = w, (mit t ≥ 1) gegeben. Die Idee ist, zu zeigen, dass es eine akzeptierende Berechnung von M auf w gibt, die genau dieser Linksableitung folgt. Technisch zeigen wir, dass f¨ ur j = 0, 1, . . . , t die folgende Aussage (Aj ) gilt: Es sei w0 das l¨angste Pr¨afix von αj , das nur aus Terminalzeichen besteht. Schreibe αj = w0 β und w = w0 w00 . (D. h.: F¨ ur j < t ist β = Aγ mit einer Variablen A; f¨ ur j = t ist β = ε.) ∗ 00 Dann gilt f¨ ur M : (0, w, S) `M (0, w , β). Wir beweisen (Aj ) durch Induktion u ¨ber j. I.A.: j = 0. In diesem Fall ist w0 = ε, also β = S, und w00 = w; damit gilt (0, w, S) `∗M (0, w00 , β), weil beide Konfigurationen gleich sind. Nun sei j ≥ 1. I.V.: Die Behauptung (Aj−1 ) gilt. Das heißt: Es sei u0 das l¨angste Pr¨afix von αj−1 ohne Variable, w = u0 u00 , und und αj−1 = u0 Aγ. Es gibt eine Berechnung (0, w, S) `∗M (0, u00 , Aγ). I.S.: In der Konfiguration (0, u00 , Aγ) wenden wir einen Expansionsschritt an, und zwar mit der Produktion A → α, die von αj−1 = u0 Aγ zu αj = u0 αγ f¨ uhrt. Dies liefert:
(5.1)
(0, u00 , Aγ) `M (0, u00 , αγ).
In Kombination mit der I.V. ergibt sich daraus: (5.2)
(0, w, S) `∗M (0, u00 , αγ).
Wenn nun αγ mit einer Variablen beginnt oder gleich ε ist, sind wir fertig, da dann u0 auch das l¨angste Pr¨afix von αj aus Terminalzeichen ist. Sonst sei v 0 das l¨angste Pr¨afix von αγ, das nur aus Terminalzeichen besteht. Schreibe αγ = v 0 ζ. Da u0 αγ = u0 v 0 ζ ⇒∗G u0 u00 177
im Rahmen einer Linksableitung, ist v 0 auch Pr¨afix von u00 , und wir k¨onnen u00 = v 0 v 00 schreiben. In der Konfiguration (0, u00 , αγ) wenden wir |v 0 | Leseschritte an und erhalten (0, u00 , αγ) = (0, v 0 v 00 , v 0 ζ) `∗M (0, v 00 , ζ),
(5.3)
wobei entweder ζ = ε ist oder mit einer Variablen beginnt. Wenn wir nun (5.2) und (5.3) zusammensetzen, ergibt sich: (0, w, S) `∗M (0, v 00 , ζ),
(5.4)
und das ist die Induktionsbehauptung. Damit haben wir die Aussage (Aj ) f¨ ur alle j bewiesen. Insbesondere gilt (At ). Weil aber αt = w ist, heißt (At ) einfach, dass es eine Berechnung (0, w, S) `∗M (0, ε, ε) gibt, was zu zeigen war. L ⊆ L(G)“: Sei w ∈ LM . Dann haben wir eine akzeptierende Berechnung ” M initM (w) = (0, w, S) = k0 `M k1 `M · · · `M kt = (0, ε, ε). Wir zeigen (wie im Beispiel am Anfang dieses Abschnitts schon beobachtet), dass aus dieser Berechnung eine Linksableitung abgelesen werden kann. Technisch gehen wir wie folgt vor. Eine Konfiguration kj in dieser Berechnung hat folgende Form: kj = (0, wj00 , βj ), wo wj00 der noch nicht gelesene Teil von w ist und βj ∈ (V ∪ Σ)∗ der Kellerinhalt. Wir k¨onnen also w = wj0 wj00 schreiben, f¨ ur ein Wort wj0 (der schon gelesene Teil, der in der Konfiguation kj nicht mehr erw¨ahnt wird). Behauptung: (Bj ) S ⇒∗G wj0 βj , f¨ ur j = 0, . . . , t. (Wenn (Bj ) bewiesen ist, wenden wir (Bt ) an und erhalten S ⇒∗G wt0 βt = w, also w ∈ L(G), wie gew¨ unscht.) Die Aussage (Bj ) beweisen wir durch Induktion u ¨ber j. I.A.: j = 0: Es ist w00 = ε (noch nichts gelesen) und β0 = S. Daher gilt S ⇒∗G w00 β0 . Nun sei 1 ≤ j ≤ t. 0 I.V.: (Bj−1 ) gilt, d. h. S ⇒∗G wj−1 βj−1 .
I.S.: 1. Fall : Der Schritt von kj−1 zu kj ist ein Expansionsschritt. Dann kann man βj−1 = Aγ schreiben, f¨ ur eine Variable A und γ ∈ (V ∪ Σ)∗ , und βj = αγ, 00 0 wobei A → α eine Produktion ist. Weiter gilt wj00 = wj−1 und daher wj0 = wj−1 , weil kein Zeichen gelesen wird. Daraus folgt: 0 0 0 wj−1 βj−1 = wj−1 Aγ ⇒G wj−1 αγ = wj0 βj .
178
Wenn wir dies mit der I.V. kombinieren, ergibt sich S ⇒∗G wj0 βj , also die Induktionsbehauptung (Bj ). 2. Fall : Der Schritt von kj−1 zu kj ist ein Leseschritt. Dann gibt es ein a ∈ Σ so dass 00 βj−1 = aβj und wj−1 = awj00 0 gilt. Daraus folgt sofort wj0 = wj−1 a. Wir erhalten: 0 0 wj−1 βj−1 = wj−1 aβj = wj0 βj ,
und daher nach der Induktionsvoraussetzung auch S ⇒∗G wj0 βj , also die Induktionsbehauptung (Bj ). Dieser Beweis kann als Rezept interpretiert werden, wie aus einer akzeptierenden Berechnung von M eine Linksableitung in G zu erhalten ist und umgekehrt. Die Leseschritte tauchen in der Ableitung nicht auf; die Schritte der Linksableitung entsprechen genau den Expansionsschritten der Berechnung des NPDAs. Man pr¨ ufe dies noch einmal anhand des Beispiels am Anfang dieses Abschnitts nach. 5.2.3 Bemerkung Die Benutzung des Nichtdeterminismus zum Finden der richtigen Ableitungsschritte ist nat¨ urlich recht st¨orend. Wenn die Grammatik G eindeutig ist (siehe Def. 4.2.6(a)), dann hat jedes Wort w ∈ L(G) genau eine Ableitung; nach der Konstruktion aus dem eben gef¨ uhrten Beweis gibt es also genau eine akzeptierende Berechnung des NPDA M . Das heißt, dass es in jeder Situation genau eine korrekte Entscheidung gibt, die am Ende zur akzeptierenden Situation f¨ uhrt. Wenn man einen wirklichen, benutzbaren Parser erstellen will, der nach dem Top-DownPrinzip (und ohne Zur¨ ucksetzen) arbeitet, muss man einen Mechanismus bereitstellen, der es erlaubt, in jeder Situation diesen einen korrekten Zug zu finden. G¨angig sind die sogenannten LL(1)-Parser, die diese Entscheidung aufgrund des obersten Kellersymbols und des n¨achsten anstehenden Zeichen in der Eingabe treffen. Sollte die Entscheidung zugunsten eines Expansions-Zuges fallen, wird nat¨ urlich dieses Eingabezeichen nicht verbraucht. Die Klasse der Grammatiken, die solche LL(1)-Parser zulassen, die sogenannten LL(1)Grammatiken, ist eine echte Teilklasse der kontextfreien Grammatiken. Zum Beispiel besitzt der wesentliche (kontextfreie) Teil der Programmiersprache Pascal eine LL(1)Grammatik. Es gibt Algorithmen (und kommerziell verf¨ ugbare Programme, also Werkzeuge), die testen, ob eine Grammatik G zu dieser Klasse geh¨ort, und die gegebenenfalls ein Programm erzeugen, das einen deterministischen LL(1)-Parser f¨ ur G darstellt. (Solche Werkzeuge heißen Parser-Generatoren.) In Verallgemeinerung der LL(1)-Grammatiken betrachtet man auch LL(k)-Grammatiken f¨ ur beliebige k ≥ 1, bei denen der Parser die jeweils n¨achsten k Zeichen der Eingabe 179
inspizieren darf ( lookahead“), um die Entscheidung u ¨ber den n¨achsten vorzunehmenden ” Zug zu treffen. Details zu LL(1)-Grammatiken und zur Konstruktion von LL-Parsern erf¨ahrt man in der ¨ Vorlesung Ubersetzerbau“. ”
5.3
Bottom-Up-Parsing, LR-Parsing
In Abschnitt 5.2 haben wir mit dem Top-Down-Parsing oder LL-Parsing eine Methode kennengelernt, wie man (im Prinzip) zu einem gegebenen Wort w ∈ L(G) mit einem Kellerautomaten eine Ableitung und einen Ableitungsbaum entwickeln kann. In diesem Abschnitt besprechen wir einen anderen Ansatz, der denselben Effekt hat. Im Gegensatz zum LL-Parsing werden hier die Eingabew¨orter zwar von links nach rechts gelesen; jedoch wird eine Rechts-Ableitung erzeugt; der Ableitungsbaum entsteht von den Bl¨attern her auf die Wurzel zu wachsend. Daher spricht man von LR-Parsing oder von BottomUp-Parsing . Der Ausgangspunkt ist derselbe wie vorher. Gegeben ist eine kontextfreie Grammatik G = (V, Σ, S, P ) und eine w ∈ Σ∗ . Wir wollen eine Ableitung und damit implizit einen Syntaxbaum konstruieren, falls w ∈ L(G) ist. Hierzu nehmen wir hier, in diesem theoretischen Rahmen, wieder den Nichtdeterminismus zu Hilfe. Wir diskutieren zum Schluss noch kurz, wie deterministische Parser aussehen, die nach dem Bottom-Up-Prinzip arbeiten. Die Grundidee ist, bei w zu beginnen und Schritt f¨ ur Schritt r¨ uckw¨arts eine Ableitung von w zu konstruieren. Ein elementarer Schritt in diesem Vorgang ist die Reduktion“, ” ¨ das ist das Uberf¨ uhren eines Wortes α β γ ∈ (V ∪ Σ)∗ in α A, γ, wobei A → β eine Produktion ist. In Erweiterung unserer Standardnotation k¨onnte man αβ γ ⇐ αAγ f¨ ur einen solchen Schritt schreiben. Wenn man bei w beginnt und nach Anwenden einer Reihe solcher Reduktionsschritte bei S ankommt, dann hat man gezeigt, dass w ∈ L(G) ist, und eine Ableitungsfolge r¨ uckw¨arts durchlaufen. Diesen Vorgang wollen wir auf einem Kellerautomaten durchf¨ uhren, der w von links nach rechts liest, und zwar so, dass die Reduktionsschritte immer am oberen Kellerende stattfinden. Schematisch kann man sich das so vorstellen. Wir zeichnen einen Kellerautomaten, wobei einstweilen der Zustand keine Rolle spielen soll, so dass der Keller links steht, horizontal angeordnet, mit dem oberen Kellerende rechts. Die Eingabe wird rechts davon ebenfalls horizontal angeordnet. Anfangssituation: 180
Eingabe
a1 a2 Keller unten oben
.........
an
Steuereinheit
Zwischensituation: Eingabe
ai
Z r . . . . Z1 Keller
.........
an
gelesen
Steuereinheit oben
unten
In einer gegebenen Situation sind zwei Arten von Aktion m¨oglich: 1) shift“: Falls noch ungelesene Eingabebuchstaben vorhanden sind, kann das n¨achste ” Eingabesymbol gelesen und oben auf den Keller gelegt werden. Eingabe
a
Zr . . . .Z 1 a i Keller
i+1 . . . .
an
gelesen
Steuereinheit
2) reduce“: Falls die s obersten Kellersymbole Z1 , . . . , Zs , s ≥ 0, eine rechte Seite ” β = Zs . . . Z1 , s ≥ 0, einer Produktion A → β bilden, dann kann Z1 , . . . , Zs durch A ersetzt werden. Dabei wird kein Eingabezeichen gelesen. Das Wort β ∈ (V ∪ Σ)∗ am oberen Kellerende nennt man handle“ (oder Griff“) f¨ ur die Reduktion. ” ” Eingabe
ai
Z r . . . . Z s +1 A Keller
Ende:
.........
an
gelesen
Steuereinheit
Die gesamte Kellerinschrift ist ⊥S. Dann kann diese gel¨oscht werden.
Beispiel : Folgende Produktionen, mit Startsymbol S, geh¨oren zu einer eindeutigen kontextfreien Grammatik f¨ ur die Klammersprache ohne ε: S → (S)S | () | (S) | ()S. 181
Wir arbeiten die Eingabe nach den formulierten Regeln ab. Die Stelle in der Eingabe, an der der Lesekopf steht, ist durch einen senkrechten Strich (|) markiert. Mitunter sind ein einer Konfiguration mehrere Z¨ uge m¨oglich. Immer wenn eine Reduktion anwendbar ist und die Eingabe noch nicht vollst¨andig gelesen ist, k¨onnte man auch einen Leseschritt anwenden ( shift-reduce-Konflikt“). Es kann aber auch sein, dass nicht eindeutig bestimmt ist, ” welcher Reduktionsschritt, d. h. welche Produktion, auf die Zeichen am oberen Kellerende anzuwenden ist. Dies kann vorkommen, wenn es verschiedene Produktionen A → β und B → γ gibt, wo β ein Pr¨afix von γ oder gar gleich γ ist ( reduce-reduce-Konflikt“; in der ” hier betrachteten Grammatik nicht vorliegend). Wir benutzen hier Nichtdeterminismus, um denjenigen Zug zu w¨ahlen, der zum Ziel f¨ uhrt. Keller
Eingabe
⊥
| (())((()())())
shift:
⊥(
( | ())((()())())
shift:
⊥((
(( | ))((()())())
shift:
⊥(()
(() | )((()())())
reduce:
⊥(S
(() | )((()())())
shift:
⊥(S)
(()) | ((()())())
shift:
Griff“:() ”
Griff“:(S) ”
Shift-Reduce-Konflikt“ : f¨ ur shift entscheiden: ” ⊥(S)( (())( | (()())())
shift:
⊥(S)((
(())(( | ()())())
shift:
⊥(S)(((
(())((( | )())())
shift:
⊥(S)((()
(())((() | ())())
shift:
⊥(S)((()(
(())((()( | ))())
shift:
⊥(S)((()()
(())((()() | )())
reduce:
⊥(S)((()S
(())((()() | )())
reduce:
⊥(S)((S
(())((()() | )())
shift:
⊥(S)((S)
(())((()()) | ())
shift:
⊥(S)((S)(
(())((()())( | )) 182
Konflikt! → shift
Konflikt! → shift
shift:
⊥(S)((S)()
(())((()())() | )
reduce:
⊥(S)((S)S
(())((()())() | )
reduce:
⊥(S)(S
(())((()())() | )
shift:
⊥(S)(S)
(())((()())()) |
reduce:
⊥(S)S
(())((()())()) |
reduce:
⊥S
(())((()())()) |
Schlussschritt: leere Keller ε Wenn wir parallel zu dieser Berechnung die den Reduktionsschritten entsprechenden Teile des Syntaxbaumes aufschreiben, so entsteht dieser von den Bl¨attern beginnend nach oben auf die Wurzel zu. Wir sprechen daher von Bottom-Up-Parsing“. ” Beobachtung: Von unten nach oben gelesen, bilden die Konkatenationen Kellerinhalt
Resteingabe
eine Rechtsableitung f¨ ur das Eingabewort w. Das liegt daran, dass shift“-Schritte die ” Konkatenation nicht ¨andern und dass in reduce“-Schritten ein Reduktionsschritt ange” wendet wird, der die Umkehrung eines Ableitungsschrittes ist. Wegen der Endebedingung (Kellerinhalt ⊥S) und der Anfangsbedingung (Restwort w, Kellerinhalt ⊥S) handelt es sich um eine vollst¨andige Ableitung f¨ ur w. Schließlich ist in jedem Reduktionsschritt die in der jeweiligen Satzform am weitesten rechts stehende Variable betroffen, da in der Resteingabe“ nat¨ urlich nur Variable stehen. ” Bevor wir tats¨achlich sagen k¨onnen, dass diese Art von Reduktion von einem NPDA durchgef¨ uhrt werden kann, m¨ ussen wir noch ein technisches Problem diskutieren. Nach unserer Definition k¨onnen NPDA’s nur das oberste Kellerzeichen lesen; in unserer Strategie haben wir aber so getan, als k¨onnten wir die obersten l = max |α| A → α Produktion Kellerzeichen sehen. Dies kann man aber leicht durch die Benutzung von Zust¨anden der Steuereinheit simulieren. In der Steuereinheit sind (Cache-artig) stets die obersten l Kellersymbole gespeichert; nur die noch tiefer liegenden Kellereintr¨age stehen wirklich“ im ” Keller. Eine Kopie des ⊥-Zeichens verbleibt immer im Keller.
183
r >l Eingabe
Zr
Z l +1
Zl
Z1 gelesen
r
Eingabe
Zr
Z1 gelesen
Als Zustandsmenge benutzen wir [ Q= Γr , wobei Γ = {⊥} ∪ V ∪ Σ. 0≤r≤l
Die Bedingung, dass der Zustand die bis zu l obersten Kellerzeichen darstellt, ist leicht aufrechtzuerhalten. Wenn in einem shift“-Schritt die Kellerh¨ohe w¨achst, muss das l-te ” Zeichen aus dem Zustand in den echten“ Keller verschoben werden. Wenn in einem ” reduce“-Schritt die Kellerh¨ohe sinkt, muss man mit ε-Schritten Zeichen aus dem Keller ” nachziehen“, bis dieser leer ist oder die Steuereinheit wieder l Zeichen kennt. (Die formale ” Definition von δ ist nicht schwer, nur etwas m¨ uhsam.) vorher
Zr
Eingabe . . . Z l +1
Zl
...Z 1
gelesen nachher
Zr
...
Eingabe
Z l+s
Z l+s
+1
. . . Z s +1A
gelesen
Im Beispiel sind schon shift-reduce-Konflikte“ aufgetreten. Die zweite oben erw¨ahnte Art ” von Konflikten, die eintreten, wenn in einer Konfiguration mehrere verschiedene Reduktionsschritte anwendbar sind ( reduce-reduce-Konflikt“) gibt es in der Grammatik des ” Beispiels nicht, da es keine rechten Seiten von Produktionen gibt, die gleich oder Pr¨afix voneinander sind. Allerdings sind solche Grammatiken nicht selten. Bevor man den Shift-Reduce-Parsing-Vorgang algorithmisch einsetzt, m¨ ussen also noch Wege gefunden werden, diese Konflikte jeweils deterministisch zu entscheiden. Hierf¨ ur 184
geht man bei der Konstruktion von Parsern f¨ ur Programmiersprachen folgenden Weg. Um zwischen dem ε-Zug reduce“ und einem Leseschritt ( shift“) zu entscheiden, darf der ” ” Parser die n¨achsten k ≥ 1 Eingabesymbole ansehen. (Man nennt dies lookahead“. Falls ” er sich f¨ ur reduce“ entscheidet, wird keines dieser Zeichen verbraucht; im Fall von shift“ ” ” nur eines. Man beachte, dass technisch gesehen unser NPDA-Modell im Fall eines ε-Zuges das n¨achste Eingabesymbol u ¨berhaupt nicht ansieht.) Es gibt nun gewisse eindeutige2 Grammatiken (die man dann LR(k)-Grammatiken“ nennt), bei denen es m¨oglich ist, ” mit dieser Zusatzinformation s¨amtliche Konflikte eindeutig aufzul¨osen, wobei immer die eine richtige M¨oglichkeit gew¨ahlt wird, die zum Ableitungsbaum bzw. zur Rechtsableitung f¨ ur das Eingabewort w f¨ uhrt — falls w zu der Sprache, geh¨ort, die von der Grammatik erzeugt wird. Das Verfahren, zu entscheiden, ob eine vorgelegte Grammatik eine LR(k)Grammatik ist und eventuell einen entsprechenden NPDA zu bauen, der die beschriebene Eindeutigkeitseigenschaft hat, ist eine komplexe Aufgabe, mit deren Einzelheiten sich die ¨ Vorlesung Ubersetzerbau“ besch¨aftigt. Insbesondere f¨ ur den Fall k = 1 gibt es aber schon ” seit langem Werkzeuge, so genannte Parser-Generatoren, die diese Arbeit durchf¨ uhren. Es ist also in der Praxis kein Problem, eine Grammatik auf die LR(1)-Eigenschaft zu testen und automatisch einen entsprechenden Kellerautomaten erzeugen zu lassen. (Dies leistet zum Beispiel der Parser-Generator yacc, der zu den Standardapplikationen geh¨ort, die in jedem Unix-System enthalten sind.) Technisch ergibt sich der folgende Zusammenhang (der Beweis muss hier offen bleiben): L ist deterministisch kontextfrei genau dann wenn es eine LR(1)-Grammatik G mit L = L(G) gibt. Zu jeder deterministisch kontextfreien Sprache gibt es also einen Shift-Reduce-Parser, der seine Entscheidungen aufgrund des Zustandes, des obersten Kellersymbols, und eines lookahead-Symbols“ trifft. ”
5.4
Akzeptierungsmodi
Die bislang betrachteten NPDA’s akzeptieren mit leerem Keller“. Alternativ (und n¨aher ” am NFA-Modell) kann man auch den Modus Akzeptieren durch akzeptierenden Zustand“ ” betrachten. Diese Variante von NPDA’s hat eine weitere Komponente F ⊆ Q. Die Definition von Konfiguration und der Relation `∗M bleibt gleich, jedoch wird w ∈ Σ∗ akzeptiert, ist also in LM , wenn (q0 , w, Z0 ) `∗M (q, ε, γ) f¨ ur ein q ∈ F und ein beliebiges γ ∈ Γ∗ . Das heißt, man fragt, ob von der Startkonfiguration aus das ganze Wort gelesen werden kann und dann ein akzeptierender Zustand erreicht werden kann. Die beiden Modelle sind ¨ beschreiben wir die Transformation genau. ¨aquivalent. Zur Ubung 2
also Grammatiken, bei denen jedes ableitbare Wort genau einen Ableitungsbaum besitzt
185
5.4.1 Behauptung Es sei L ⊆ Σ∗ . Dann gilt: L = LM f¨ ur einen NPDA M , der mit leerem Keller akzeptiert, genau dann wenn L = LM 0 f¨ ur einen NPDA M 0 , der mit akzeptierendem Zustand akzeptiert. Beweis ⇒“ : Betrachte M = (Q, Σ, Γ, q0 , Z0 , δ). Wir bauen einen ¨aquivalenten NPDA ” M 0 = (Q0 , Σ, Γ0 , q00 , Z00 , δ 0 ), der mit akzeptierenden Zust¨anden arbeitet. Die Idee ist einfach: M 0 hat ein neues Keller-Anfangssymbol Z00 und einen neuen Startzustand q00 . Als erste Aktion jeder Berechnung schreibt M 0 zus¨atzlich das Keller-Anfangs-Zeichen Z0 von M in seinen Keller und geht in den Zustand q0 u ¨ber. Von hier an verh¨alt sich M 0 genau wie M . Nur wenn der Keller von M leer w¨are, kann M 0 dies dadurch feststellen, dass das Keller-Zeichen Z00 im Keller sichtbar ist. Wann immer das passiert, kann M 0 mit einem optionalen ε-Zug in einen neuen akzeptierenden Zustand qacc wechseln, von dem aus nicht weitergerechnet werden kann. Formal wird diese Idee durch die folgenden Definitionen umgesetzt: Q0 = Q ∪ {q00 , qacc }, Γ0 = Γ ∪ {Z00 }, F = {qacc }. (i) δ(q00 , ε, Z00 ) = {(q0 , Z0 Z00 )}. (ii) δ 0 stimmt auf Q × (Σ ∪ {ε}) × Γ mit δ u ¨berein. ur q ∈ Q. (iii) δ 0 (q, ε, Z00 ) = {(qacc , ε)} f¨ ⇐“ : Betrachte M 0 = (Q0 , Σ, Γ0 , q00 , Z00 , δ 0 , F 0 ), ein NPDA, der L mit akzeptierenden ” ” Zust¨anden“ akzeptiert. Wir suchen einen NPDA M , der dieselbe Sprache mit leerem Keller akzeptiert. Hierf¨ ur m¨ ussen wir M 0 simulieren, und immer, wenn M 0 in einem akzeptierenden Zustand ist, die M¨oglichkeit er¨offnen, nichtdeterministisch in einen Modus (Zustand qevac ) zu wechseln, in dem nur noch der Keller geleert wird. Hierf¨ ur betrachte 0 M = (Q, Σ, Γ, q0 , Z0 , δ). Die Zustandsmenge Q = Q ∪{q0 , qevac } enth¨alt einen neuen Startzustand q0 und einen Leere-den-Keller“-Zustand qevac . Das Kelleralphabet Γ = Γ0 ∪ {Z0 } ” enth¨alt einen neuen Keller-Anfangs-Zustand Z0 . Dieses besondere Zeichen dient dazu, zu verhindern, dass der Keller von M leer wird, obgleich M 0 keinen akzeptierenden Zustand ¨ erreicht hat. Die Ubergangsfunktion δ wird wie folgt definiert. (i) δ(q0 , ε, Z0 ) = {(q00 , Z00 Z0 )} (ii) δ stimmt auf Q0 × (Σ ∪ {ε}) × Γ0 mit δ 0 u ¨berein. (iii) zus¨atzlich ist(qevac , ε) ∈ δ(q, ε, Z) f¨ ur q ∈ F 0 ∪ {qevac }, Z ∈ Γ0 ∪ {Z0 }. Man sieht, dass M dieselben Rechnungen wie M 0 durchf¨ uhrt, nur mit dem zus¨atzlichen Kellersysmbol Z0 . Wenn (aus Sicht von M 0 ) ein akzeptierender Zustand erreicht wurde, kann begonnen werden, den Keller, einschließlich Z0 , zu leeren, und damit M zu einer akzeptierenden Konfiguration zu f¨ uhren — falls das Eingabewort fertig gelesen ist. Man beachte, dass das zus¨atzliche Kellersymbol Z0 verhindert, dass die Situation, wo M 0 das Eingabewort fertig liest und gleichzeitig den Keller leert, jedoch nicht in einem akzeptierenden Zustand ist, versehentlich“ zum Akzeptieren durch M f¨ uhrt. ” 186
5.5
Kellerautomaten und Grammatiken
¨ Wir wenden uns nun dem bereits angek¨ undigten Aquivalenzsatz zu, der besagt, dass kontextfreie Grammatiken und NPDA’s dieselbe Sprachklasse beschreiben. Der Satz ist sehr wichtig. Von großer praktischer Bedeutung ist die Konstruktion von Parsern aus ¨ kontextfreien Grammatiken, wie in den Abschnitten 5.2 und 5.3 dargestellt. Der Ubergang von Kellerautomaten zu Grammatiken ist von prinzipieller und theoretischer Bedeutung. Daher werden wir (f¨ ur die Neugierigen und Unerschrockenen) auch einen vollst¨andigen Beweis angeben. (In der Vorlesung wird dieser nur skizziert, und er ist auch nicht pru ¨fungsrelevant.) 5.5.1 Satz
Sei L ⊆ Σ∗ Sprache. Dann sind ¨aquivalent:
(a) L = L(G) f¨ ur eine kontextfreie Grammatik G. (b) L = LM f¨ ur einen NPDA M . (a) ⇒ (b)“: Diese Richtung wurde mit Satz 5.2.2 schon gezeigt. ” (b) ⇒ (a)“: ” Es sei ein NPDA M = (Q, Σ, Γ, q0 , Z0 , δ) gegeben. Wir geben eine kontextfreie Grammatik G = (V, Σ, S, P ) an, die LM = L(G) erf¨ ullt. Wegen der besonderen Form der Variablen von G heißt diese Konstruktion auch die Tripelkonstruktion“. Wir definieren ”
Beweis
V := {S} ∪ {hq, A, pi | p, q ∈ Q, A ∈ Γ}. (S ist das Startsymbol von G.) Unsere Absicht ist es, die Produktionen von G so anzulegen, dass f¨ ur q, p ∈ Q, A ∈ Γ und w ∈ Σ∗ gilt: (5.5)
hq, A, pi ⇒∗G w
(q, w, A) `∗M (p, ε, ε).
⇔
In Worten: Es gibt einen G-Ableitungsbaum mit Wurzel hq, A, pi und Ergebnis (Blattinschrift) w ⇔ M kann von der Konfiguration (q, w, A) (Zustand q, Wort w zu lesen, genau das Symbol A im Keller) aus die Konfiguration (p, ε, ε) erreichen (Zustand p, w vollst¨andig gelesen, Keller leer) erreichen. Es ist g¨ unstig, sich gleich hier klarzumachen, dass (q, w, A) `∗M (p, ε, ε) auch bedeutet, dass dieselbe Rechnung als Teilrechnung oben auf einem anderweitig gef¨ ullten Keller und ∗ ur mit einem nachfolgenden Restwort m¨oglich ist, dass also (q, wu, Aγ) `M (p, u, γ) gilt, f¨ beliebige u ∈ Σ∗ und γ ∈ Γ∗ . Dazu legen wir fest, dass P folgende Produktionen enth¨alt: 187
(i) S → hq0 , Z0 , pi, f¨ ur jedes p ∈ Q. (ii) hq, A, qm+1 i → ahq1 , A1 , q2 ihq2 , A2 , q3 i · · · hqm , Am , qm+1 i, f¨ ur (q, a, A) ∈ Q × (Σ ∪ {ε}) × Γ, q1 , . . . , qm+1 ∈ Q, m ≥ 0, wo (q1 , A1 · · · Am ) ∈ δ(q, a, A). (Man beachte die Spezialf¨alle m = 0, die zur Produktion hq, A, q1 i → a f¨ uhrt, und a = ε.) Wir m¨ ussen nun zeigen: Behauptung: Aussage (5.5) gilt. Bevor wir dies beweisen, folgern wir, dass L(G) = LM ist: w ∈ LM
⇔ (5.5) ⇔ ⇔ ⇔
∃p ∈ Q : (q0 , w, Z0 ) `∗M (p, ε, ε) ∃p ∈ Q : hq0 , Z0 , pi ⇒∗G w S ⇒∗G w w ∈ L(G).
¨ Die vorletzte Aquivalenz gilt dabei, weil aus S im ersten Schritt nur Variable hq0 , Z0 , pi, p ∈ Q, ableitbar sind. Es bleibt die Behauptung zu beweisen. ⇒“: Wir beweisen die Aussage ” hq, A, pi ⇒∗G w impliziert (q, w, A) `∗M (p, ε, ε) durch (Wertverlaufs-)Induktion u ur die ¨ber die Tiefe k ≥ 1 eines Ableitungsbaumes f¨ ∗ Ableitung hq, A, pi ⇒G w. Ist k = 1, so sieht der Ableitungsbaum f¨ ur w ∈ Σ∗ so aus: [q,A,p]
w
Damit muss hq, A, pi → w eine Regel in P sein. Nach der Definition von P kann dies nur dann passieren, wenn w = ε oder w ∈ Σ ist; weiter gilt (p, ε) ∈ δ(q, w, A). Daraus folgt aber (q, w, A) `M (p, ε, ε). Sei nun k > 1. Der Ableitungsbaum f¨ ur die Ableitung hq, A, pi ⇒∗G w hat folgendes Format: 188
[q,A,p]
a
[q1,A1,q2]
[qm,Am,q m+1]
...
Tiefe
w1
wm
Dabei ist m ≥ 0, q1 , . . . , qm ∈ Q, qm+1 = p, a ∈ Σ ∪ {ε} (wenn a = ε, f¨allt das erste Blatt weg), und w1 , . . . , wm ∈ Σ∗ sind die Eintr¨age an den Bl¨attern der m Teilb¨aume, also w = aw1 · · · wm , und hqi , Ai , qi+1 i ⇒∗G wi mittels Ableitungsb¨aumen der Tiefe < k. Also gilt nach Induktionsvoraussetzung (qi , wi , Ai ) `∗M (qi+1 , ε, ε), f¨ ur 1 ≤ i ≤ m. Also gilt: (q, aw1 · · · wm , A)
`M (q1 , w1 · · · wm , A1 · · · Am ) `∗M (q2 , w2 · · · wm , A2 · · · Am ) .. . `∗M (qm+1 , ε, ε) = (p, ε, ε),
wie gew¨ unscht. (Man mache sich klar, dass es wirklich legal ist, solche Teilrechnungen aneinanderzuh¨angen.) ⇐“: Wir beweisen die Aussage ” (q, w, A) `∗M (p, ε, ε) impliziert hq, A, pi ⇒∗G w durch Induktion u ¨ber die Zahl k ≥ 1 der Schritte, die M macht, um (q, w, A) in (p, ε, ε) zu u uhren. ¨berf¨ Ist k = 1, so muss w ∈ Σ ∪ {ε} und (p, ε) ∈ δ(q, w, A) sein. Also ist, nach Definition von P , hq, A, pi → w eine Produktion, also gilt hq, A, pi ⇒G w. Sei nun k > 1. Wir betrachten eine Rechnung, die M in k Schritten von (q, w, A) nach (p, ε, ε) f¨ uhrt. Wir 0 zerlegen w = aw , wo a ∈ Σ oder a = ε ist, je nachdem, ob M im ersten Schritt einen Buchstaben von w liest oder nicht. Es sei (q1 , A1 · · · Am ) ∈ δ(q, a, A) ¨ das Paar in der Ubergangsfunktion δ von M , das im ersten Schritt verwendet wird. Die letzten k − 1 Schritte der betrachteten Berechnung von M f¨ uhren also (q1 , w0 , A1 · · · Am ) 189
in (p, ε, ε) u ¨ber. Wir teilen diese Berechnung in m Phasen (t0 , t1 ], . . . , (tm−1 , tm ] ein, wobei 0 = t0 < t1 < · · · < tm die Schritte der Rechnung von M sind, die durch folgende Ereignisse gekennzeichnet sind: ti ist der Schritt von M , nach dem erstmals Ai+1 · · · Am die Kellerinschrift ist, 1 ≤ i ≤ m. Offensichtlich dauert jede dieser Phasen < k Schritte, Mit wi , 1 ≤ i ≤ n, bezeichnen wir das Teilwort von w, das w¨ahrend Phase (ti−1 , ti ] von M gelesen wird. Offenbar gilt dann w0 = w1 · · · wm . W¨ahrend Phase i spielt sich also folgender Konfigurations¨ ubergang ab, f¨ ur gewisse qi ∈ Q, i = 2, . . . , m: (qi , wi · · · wm , Ai · · · Am ) `M · · · `M (qi+1 , wi+1 · · · wm , Ai+1 · · · Am ). Da w¨ahrend dieser Rechnung der Teil Ai+1 · · · Am des Kellers nicht ber¨ uhrt, auch nicht gelesen wird, ist auch folgendes eine legale (Teil-)Rechnung des NPDA M , mit < k Schritten: (qi , wi , Ai ) `M · · · `M (qi+1 , ε, ε). Nach Induktionsvoraussetzung folgt hqi , Ai , qi+1 i ⇒∗G wi , f¨ ur 1 ≤ i ≤ m. Da nach Definition von G auch A ⇒G ahq1 , A1 , q2 i · · · hqm , Am , qm+1 i gilt, haben wir (durch Betrachten des Ableitungsbaums): A ⇒∗G aw1 · · · wm = w. Damit ist der Beweis der Behauptung, und auch der von Satz 5.5.1, beendet.
5.6
Abschlusseigenschaften II
Wir erg¨anzen noch eine interessante (und wichtige) Abschlusseigenschaft von L2 . 5.6.1 Satz
Ist L1 kontextfrei und L2 regul¨ar, so ist L1 ∩ L2 kontextfrei.
Beweis(idee): Weil L1 kontextfrei ist, gibt es nach Satz 5.5.1 und Behauptung 5.4.1 einen NPDA M , der L1 mit akzeptierenden Zust¨anden akzeptiert. Außerdem existiert ein DFA M 0 = (Q0 , Σ, q00 , F 0 , δ 0 ) f¨ ur L2 . Um einen NPDA M∩ f¨ ur L1 ∩ L2 zu erhalten, erweitert man die Steuereinheit von M in der folgenden Weise: Es wird ein zus¨atzliches Register (mathematisch: eine Komponente) angelegt, die einen Zustand von M 0 speichern kann. Dieses wird anfangs mit q00 besetzt. Bei Z¨ ugen von M , bei denen ein Buchstabe a gelesen wird, wird dieses Register gem¨aß δ 0 weitergeschaltet. Bei ε-Z¨ ugen bleibt der Registerinhalt 190
unver¨andert. Der neue DPDA M∩ ist in einem akzeptierenden Zustand, wenn M in einem akzeptierenden Zustand ist und das Register einen Zustand q 0 ∈ F 0 enth¨alt. Es ist nicht schwierig, den NPDA M∩ durch eine leichte Verallgemeinerung der Kreuzproduktkonstruktion (Siehe Satz 2.1.10(c)) pr¨azise zu definieren und zu zeigen, dass LM∩ = L1 ∩ L2 ist. Wir bemerken, dass es nicht m¨oglich ist, zwei NPDA’s mit einer an die Kreuzproduktkonstruktion angelehnten Verfahren zu kombinieren. Grund ist, dass jeder NPDA seinen eigenen Keller mitbringt und es nicht m¨oglich ist, diese beiden Keller zu einem einzigen zu vermischen“. Hier handelt es sich um eine mathematisch pr¨azise Aussage! W¨are es im” mer m¨oglich, auf eine solche Weise aus zwei NPDA’s einen NPDA f¨ ur den Durchschnitt der zwei Sprachen zu konstruieren, dann w¨aren die kontextfreien Sprachen unter der Durchschnittsoperation abgeschlossen, was nach Satz 4.6.4 nicht der Fall ist. Tats¨achlich werden wir in der Vorlesung Algorithmentheorie“ sehen, dass zwei unabh¨angige Keller ” zu Rechenmodellen f¨ uhren, die viel st¨arker sind als die NPDA’s.
5.7
Deterministische Kellerautomaten und ihre Sprachen
Wir betrachten hier eine Teilklasse der NPDA’s, n¨amlich deterministische Kellerautomaten (DPDA’s). Diese zeichnen sich dadurch aus, dass in jeder Konfiguration h¨ochstens ein n¨achster Zug m¨oglich ist. Weil dazu auch keine Wahlm¨oglichkeit zwischen ε-Zug und Lesen eines Symbols vom Eingabeband bestehen darf, verlangt man: (5.6)
|δ(q, a, A)| + |δ(q, ε, A)| ≤ 1
f¨ ur jedes q ∈ Q, a ∈ Σ, A ∈ Γ. Der Berechnungsbaum (vgl. Abb. 5.5) degeneriert zu einem Weg ohne Verzweigung. Weiterhin muss man (aus technischen Gr¨ unden) festlegen, dass u ¨ber akzeptierende Zust¨ande akzeptiert wird. Beispiel : Wir wollen die Klammersprache mit einem deterministischen Kellerautomaten bearbeiten. W¨ urde dieser mit leerem Keller“ akzeptieren, dann m¨ usste zum Beispiel nach ” dem Lesen des Wortes (()) der Keller leer sein; damit ist aber das Weiterrechnen und Akzeptieren auf der Eingabe (())() nicht m¨oglich. (Allgemein k¨onnen deterministische Verfahren mit Akzeptierungsmodus leerer Keller“ nicht funktionieren, wenn die zu ak” zeptierende Sprache L nicht pr¨ afixfrei ist, d. h. wenn es W¨orter w1 , w2 ∈ L gibt, derart dass w1 echtes Pr¨afix von w2 ist.) Ein DPDA hat also eine Menge F ⊆ Q von akzeptierenden Zust¨anden, und M akzeptiert w ∈ Σ∗ , wenn w vollst¨andig gelesen wird und nach dem vollst¨andigen Lesen von w ein akzeptierender Zustand erreicht wird. Die formalen Definitionen lauten folgendermaßen. 191
5.7.1 Definition Ein deterministischer Kellerautomat (DPDA) besteht aus 7 Komponenten: Q, Σ, Γ, q0 , Z0 sind wie in Definition 5.1.2, F ist Teilmenge von Q, und δ : Q × (Σ ∪ {ε} × Γ) → P<∞ (Q × Γ∗ ), wobei |δ(q, a, A)| + |δ(q, ε, A)| ≤ 1, f¨ ur alle a ∈ Σ, q ∈ Q, A ∈ Γ.
5.7.2 Definition
Sei M = (Q, Σ, Γ, q0 , Z0 , F, δ) ein DPDA mit Formel (4.1).
(a) Konfigurationen und die Relationen `M und `∗M sind wie in 5.1.5 definiert. (Beachte, dass f¨ ur jede Konfiguration k h¨ochstens eine direkte Nachfolgekonfiguration existiert.) (b) M akzeptiert w ∈ Σ∗ , falls (q0 , w, Z0 ) `∗M (q, ε, γ) f¨ ur ein q ∈ F, γ ∈ Γ∗ . (c) LM = {w ∈ Σ∗ | M akzeptiert w}. Beachte: (i) Es ist erlaubt, dass M die Eingabe vollst¨andig liest und dann noch einen oder mehrere ε-Z¨ uge durchf¨ uhrt, die den Keller (lesen und) ver¨andern k¨onnen und auch durch mehrere Zust¨ande f¨ uhrt. Akzeptiert wird, wenn schließlich ein akzeptierender Zustand erreicht wird. (ii) Bei nicht akzeptierten W¨ortern ist u ¨ber das Verhalten zun¨achst nichts gesagt. Die Rechnung kann (ohne Nachfolgekonfiguration) in der Mitte des Wortes anhalten oder (mit ε-Z¨ ugen) in eine Endlosschleife geraten, in der sich nur noch Kellerinhalt und Zust¨ande ¨andern. Dabei kann sogar der Keller immer weiter wachsen. (Wir kommen auf diese Problematik zur¨ uck.) 5.7.3 Beispiel Wir konstruieren einen deterministischen Kellerautomaten f¨ ur die Sprache L ⊆ {(, )}∗ der korrekten Klammerausdr¨ ucke. Die grundlegende Idee ist einfach: Der Keller realisiert einen (un¨aren) Z¨ahler. Wenn ein (“ gelesen wird, erh¨oht sich der Z¨ahler; wenn ein )“ gelesen ” ” wird, erniedrigt er sich. Dadurch wird erreicht, dass der Z¨ahlerstand den Vorsprung“ der ” gelesenen ¨offnenden Klammern vor den schließenden Klammern ausdr¨ uckt, der nat¨ urlich immer nichtnegativ ist. Man kann akzeptieren, wenn der Z¨ahlerstand 0 ist. Technisch arbeitet man mit dem Kelleralphabet Γ = {1, ⊥}. Dabei wird das Kelleranfangszeichen ⊥ nie gel¨oscht und markiert immer das Ende des Kellers. Wenn dieses Zeichen im Keller sichtbar ist, wechseln wir mit einem ε-Zug in einen akzeptierenden Zustand. Formal legen wir den DPDA M wie folgt fest: 192
• Q = {A, V }, • q0 = V , • Σ = {(, )}, • Γ = {1, ⊥}, • Z0 = ⊥, • F = {A}, • δ ist als Graph und als Tabelle beschrieben.
(, 1 11 ε, A
V
Start
(,
1
), 1 ε Abbildung 5.7: Ein DPDA f¨ ur die Klammersprache δ
⊥ (V, ε) (A, ⊥) (V, () − (V, )) − (A, ε) − (A, () (V, 1⊥) (A, )) −
1 − (V, 11) (V, ε) − − −
Auf der Eingabe ()(())((()())) arbeitet dieser DPDA wie folgt:
193
schon gelesen Keller − ⊥ − ⊥ ( 1⊥ () ⊥ () ⊥ ()( 1⊥ ()(( 11⊥ ()(() 1⊥ ()(()) ⊥ ()(()) ⊥ ()(())( 1⊥ ()(())(( 11⊥ ()(())((() 11⊥ ()(())((()( 111⊥ ()(())((()() 11⊥ ()(())((()()) 1⊥ ()(())((()())) ⊥ ()(())((()())) ⊥
Zustand V A V V A V V V V A V V V V V V V A
Man beachte, wie der Keller tats¨achlich immer die Anzahl der momentan ge¨offneten Klammern widerspiegelt, und wie der ε-Zug im Zustand V genutzt wird, um die Beobachtung, dass das Kellersymbol ⊥ sichtbar ist, in einen Zustandswechsel umzusetzen.
5.7.4 Beispiel Wir konstruieren einen Kellerautomaten f¨ ur die Sprache L = {ai bj | i, j ≥ 0, i 6= j}. Hierbei ist die erste Idee, die Bedingung, dass erst a’s und dann b’s kommen sollen, im Zustand der Steuereinheit zu kontrollieren. Weiterhin z¨ahlen wir die gelesenen a’s im Keller, um dann f¨ ur jedes gelesene b den Z¨ahlerstand um 1 zu erniedrigen. Solange der Z¨ahlerstand nicht 0 ist, erkl¨aren wir den Zustand f¨ ur akzeptierend. Wichtig ist hier, beim Herunterz¨ahlen zun¨achst in einen verwerfenden Zustand zu gehen und erst dann mit einem ε-Zug in einen akzeptierenden zu wechseln, wenn sich der Keller nicht als leer erweist. Wenn der Z¨ahlerstand exakt 0 ist, muss verworfen werden; wenn dann weitere b’s folgen, k¨onnen wir wieder akzeptieren. Das Kellerendezeichen ⊥ wird nie gel¨oscht. Formal sieht der DPDA f¨ ur L folgendermaßen aus. • Q = {S, A, B, C, D}, • q0 = S, • Σ = {a, b}, • Γ = {1, ⊥} 194
• Z0 = ⊥, • F = {A, C, D}, • δ ist als Graph beschrieben. a,1 11 a, Start
1
S
b, b ,1 ε
A
b,
B
D
b, 1 ε
ε ,1 1 C b,
Abbildung 5.8: Ein DPDA f¨ ur die Sprache {ai bj | i, j ≥ 0, i 6= j} Man pr¨ ufe nach, dass in diesem DPDA es nie zwei miteinander konkurrierende Z¨ uge gibt. Die Zust¨ande S und A dienen zum Lesen von a’s, die Zust¨ande B, C und D zum Lesen von b’s. Die Kombination der Zust¨ande B und C realisiert das vorsichtige Lesen der b’s: erst wird gelesen und der Z¨ahler erniedrigt (Zustand B), dann wird mit einem ε-Zug gepr¨ uft, dass der Keller nicht leer ist. Eine Beispielberechnung dieses DPDA’s sieht wie folgt aus:
Eingabe: aaabbbbbbb
schon gelesen − − a aa aaa aaab aaab aaabb aaabb aaabbb aaabbbb aaabbbbb ...
Keller ⊥ ⊥ 1⊥ 11⊥ 111⊥ 11⊥ 11⊥ 1⊥ 1⊥ ⊥ ⊥ ⊥ ...
Zustand S S A A A B C B C B D D ...
5.7.5 Definition Eine Sprache L heißt deterministisch kontextfrei , wenn L = LM f¨ ur einen DPDA M gilt. 195
Wir merken an, dass die Klasse der deterministisch kontextfreien Sprachen u ¨ber ein Maschinenmodell definiert ist, obwohl die kontextfreien Sprachen u ¨ber eine Eigenschaft der zugeh¨origen Grammatiken definiert ist. Gibt es auch einen Grammatiktyp, der zu den deterministisch kontextfreien Grammatiken geh¨ort? Dies ist tats¨achlich der Fall; es handelt sich um die LR(k)-Grammatiken“, f¨ ur k ≥ 1. Die Definition der Klasse der LR(k)” Grammatiken ist aber relativ komplex; sie l¨auft darauf hinaus, dass ein bestimmtes deterministisches Bottom-Up-Parsing-Verfahren, das f¨ ur das Aufl¨osen von Shift-Reduce- und Reduce-Reduce-Konflikten die n¨achsten k Zeichen des Eingabewortes ansehen darf, erfolgreich arbeiten kann. (Vergleiche auch Abschnitt 5.3.) Man kann Grammatiken auf diese Eigenschaft testen. LR(k)-Grammatiken mit den zugeh¨origen Parsern sind die m¨achtigsten bekannten Syntaxbeschreibungsverfahren mit Syntaxanalyse in Linearzeit“. Insbe” ¨ sondere LR(1)-Grammatiken werden bei der Konstruktion von Ubersetzern f¨ ur Programmiersprachen bevorzugt eingesetzt. N¨aheres zu diesen Grammatiken und zur Konstruktion ¨ der zugh¨origen Parser erf¨ahrt man in der Vorlesung Ubersetzerbau“. ” Wir notieren, dass die Klasse der deterministisch kontextfreien Sprachen unter Komplementbildung abgeschlossen ist. Sonst ist diese Klasse unter ziemlich wenigen Operationen abgeschlossen, insbesondere nicht unter Vereinigung oder Durchschnitt, Konkatenation und Kleene-Abschluss. Die Grundidee f¨ ur die Konstruktion eines DPDA M 0 f¨ ur LM ist einfach: Man lasse M auf Eingabe w laufen; wenn M akzeptiert, verwirft man, sonst akzeptiert man. Mit dieser Idee treten verschiedene Probleme auf. Das wichtigste davon ist, dass M auf Eingaben w∈ / LM nicht zu einem vern¨ unftigen Abschluss der Berechnung finden muss. 5.7.6 Lemma Wenn M ein DPDA ist, dann existiert ein DPDA M1 f¨ ur dieselbe Sprache derart, dass M1 jede Eingabe w bis zum letzten Buchstaben liest und nach dem Lesen nur eine begrenzte Zahl von ε-Z¨ ugen ausf¨ uhrt. F¨ ur die Details des Beweises sei auf die Literatur verwiesen. 5.7.7 Lemma Beweis: liest. Idee:
¯ Ist L deterministisch kontextfrei, so auch L.
L = LM f¨ ur einen DPDA, der (nach 5.7.6) alle Eingabew¨orter bis zum Ende F und Q − F vertauschen (wie bei DFA’s)
Problem: M k¨onnte nach dem Lesen von w ∈ Σ∗ einen Zustand q1 ∈ F erreichen (also ¨ w ∈ LM ), dann aber in ε-Uberg¨ angen einen anderen Zustand q2 ∈ / F erreichen. W¨ urde man F und Q − F einfach vertauschen, w¨ urde auch der neue Automat w akzeptieren — f¨alschlicherweise. ¨ L¨osung: Beobachten, ob bisher w¨ahrend der ε-Uberg¨ ange ein F /F¯ -Zustand auftauchte. Verhalten bei w ∈ / LM :
196
M: M 0:
a lesen −→ a lesen −→
ε
ε
q1 ∈ F¯
→
q2 ∈ F¯
→
q3 ∈ F¯
¨ −→ kein ε Ubergang m¨oglich
verw.
→
verw.
→
verw.
→ akz.
ε
Außer gegen Komplement sind deterministische kontextfreie Sprachen gegen fast nichts abgeschlossen. 5.7.8 Behauptung sind. Beweis:
Es gibt kontextfreie Sprachen, die nicht deterministisch kontextfrei
L = {ai bj ck | i 6= j ∨ j 6= k} ist kontextfrei.
¯ deterministisch kontextfrei, W¨are L deterministisch kontextfrei, w¨are nach 5.7.7 auch L ¯ also insbesondere kontextfrei. Die Sprache L ist aber nicht kontextfrei, sonst w¨are nach ¯ ∩ {a}∗ {b}∗ {c}∗ = {an bn cn | n ≥ 0} ebenfalls kontextfrei, was nicht der Fall Satz 5.6.1 L ist. Es sei bemerkt, dass die Sprache {w | w ∈ {0, 1}∗ , w = wR } der Spiegelw¨orter ohne Mittezeichen nicht deterministisch kontextfrei ist. Intuitiv gesprochen kann ein deterministischer Kellerautomat die Stelle nicht identifizieren, an der umzukehren und mit dem bisher Gelesenen zu vergleichen ist. Der Beweis f¨ ur diese einleuchtende Tatsache ist allerdings technisch aufwendig. 5.7.9 Behauptung ∩ abgeschlossen. Beweis:
Die deterministisch kontextfreien Sprachen sind nicht gegen ∪ und
L1 = {ai bj ck | i 6= j} ist deterministisch kontextfrei. L2 = {ai bj ck | j 6= k} ist deterministisch kontextfrei. aber nicht L1 ∪ L2 (siehe oben). L3 = {ai bj ck | i = j} und L4 = {ai bj ck | j = k} sind deterministisch kontextfrei. aber L3 ∩ L4 ∈ / L2 .
5.7.10 Behauptung Die deterministisch kontextfreien Sprachen sind nicht gegen Konkatenation und Kleene-Abschluss abgeschlossen. (Ohne Beweis.) 5.7.11 Satz Die deterministisch kontextfreien Sprachen sind gegen Durchschnitt mit regul¨aren Sprachen abgeschlossen. (D. h.: L1 deterministisch kontextfrei, L2 regul¨ar ⇒ L1 ∩ L2 deterministisch kontextfrei.) Dies beweist man genauso wie Satz 5.6.1. 197
5.8
Entscheidungsfragen fu ¨ r kontextfreie Sprachen
Ebenso wie bei regul¨aren Sprachen kann man sich fragen, welche Eigenschaften der Sprache L(G) man anhand der Grammatik G effizient — oder zumindest effektiv, also algorithmisch — testen kann. Dabei stellt sich heraus, dass viele Probleme bez¨ uglich kontextfreier Grammatiken unentscheidbar werden. Das bedeutet, dass es prinzipiell keinen Algorithmus geben kann, der dieses Problem f¨ ur alle Grammatiken l¨osen kann. Den technischen Hintergrund f¨ ur Unentscheidbarkeitsaussagen werden wir jedoch erst im n¨achsten Semester, in der Vorlesung Algorithmentheorie“, kennenlernen. Daher werden hier alle ” Unentscheidbarkeitsaussagen (einstweilen) ohne Beweis bleiben. 5.8.1 Satz l¨osbar :
Die folgenden Aufgaben bez¨ uglich kontextfreier Sprachen sind algorithmisch
(a) (Leerheitsproblem) Gegeben eine kontextfreie Grammatik G = (V, Σ, S, P ), entscheide ob L(G) = ∅ ist. (b) (Wortproblem) Gegeben eine kontextfreie Grammatik G = (V, Σ, S, P ) und ein w ∈ Σ∗ , entscheide ob w ∈ L(G), und finde im positiven Fall einen Ableitungsbaum. (c) (Unendlichkeitsproblem) Gegeben eine kontextfreie Grammatik G, entscheide ob |L(G)| = ∞ ist. ugt es, mit dem dort angegebenen MarkieBeweis: (a) Nach Proposition 4.3.14(c) gen¨ rungsalgorithmus die Menge der produktiven Variablen in V zu bestimmen. Die Sprache L(G) ist nicht leer genau dann wenn S produktiv ist. (b) Man wandelt G in eine ¨aquivalente Grammatik G0 in Chomsky-Normalform um (s. Abschnitt 4.3). Dann wendet man auf G0 und w den CYK-Algorithmus an, der in Abschnitt 4.5 besprochen wurde. (c) Mit dem Algorithmus aus Abschnitt 4.3 wandeln wir G in eine ¨aquivalente Grammatik G0 = (V 0 , Σ, S 0 , P 0 ) in Chomsky-Normalform um. Mit dem Algorithmus zu Proposition 4.3.14 ermitteln wir die Menge der produktiven Variablen in V 0 . Wenn S 0 nicht produktiv ist, ist L(G) = ∅, und wir sind fertig. Sonst lassen wir aus V 0 die nicht produktiven (die nutzlosen“) Variablen weg, und erhalten eine zu G ¨aquivalente Grammatik ” G00 = (V 00 , Σ, S 0 , P 00 ) in Chomsky-Normalform, die keine nutzlosen Variablen hat. Mit einem weiteren Markierungsalgorithmus ermitteln wir nun die Menge V 000 aller Variablen A ∈ V 00 , die in einer Satzform α von G00 vorkommen, also mit einer Ableitungsfolge S ⇒G00 α1 ⇒G00 α2 ⇒G00 · · · ⇒G00 αt = α ¨ erreichbar sind. (Die Details m¨oge man sich als Ubung u ¨berlegen.) Wenn wir aus G00 die nicht erreichbaren Variablen weglassen und alle Produktionen streichen, in denen solche Variablen vorkommen, erhalten wir eine zu G ¨aquivalente Grammatik G000 = (V 000 , Σ, S 0 , P 000 ), in der jede Variable erreichbar und produktiv ist. 198
Zur Vereinfachung der Notation nehmen wir ab hier einfach an, dass L(G) 6= ∅ ist und dass V keine nutzlosen und keine unerreichbaren Variablen enth¨alt. Nun definieren wir einen gerichteten Graphen H = (V, E) mit Knotenmenge V und Kantenmenge E := {(A, B) ∈ V × V | ∃C ∈ V : A → BC oder A → CB ist Produktion}. Mit einem geeigneten Graphalgorithmus oder auch einem simplen Markierungsalgorithmus k¨onnen wir u ufen, ob es r ≥ 1 und eine Folge A0 , A1 , . . . , Ar in V gibt mit ¨berpr¨ A0 = Ar und (A0 , A1 ), . . . , (Ar−1 , Ar ) ∈ E. (Diese Kantenfolge bildet also einen gerichteten Kreis der L¨ange r im Graphen H.) Dieser Test liefert die gew¨ unschte Antwort, wie die folgende Behauptung feststellt. Behauptung: |L(G)| = ∞
⇔
H besitzt einen gerichteten Kreis.
Beweis der Behauptung: “⇒“: Wenn H keinen Kreis besitzt, dann besitzt jeder Weg in einem Ableitungsbaum von G h¨ochstens |V | viele innere Knoten. Es gibt aber nur endlich viele Bin¨arb¨aume der Tiefe ≤ |V | mit Knotenmarkierungen aus V , also l¨asst G nur endlich viele Ableitungsb¨aume zu. Also ist L(G) endlich. “⇐“: Angenommen, H besitzt einen Kreis A0 , A1 , . . . , Ar = A0 . Nun bauen wir einen Ableitungsbaum in G wie folgt: 1. Bilde einen Ableitungsbaum T mit Wurzelbeschriftung S f¨ ur eine Satzform α(T ), in der A0 vorkommt. (Dies geht, weil jede Variable, also auch A0 , erreichbar ist.) Das heißt, dass T einen Blattknoten k1 hat, der mit A0 beschriftet ist. 2. Bilde einen A0 -Ableitungsbaum T10 mit Wurzelbeschriftung A0 , der nicht nur aus der Wurzel besteht und ein Wort α(T1 ) als Ergebnis hat, in dem A0 vorkommt. (Dies geht mit den Produktionen, die den Kreis A0 , A1 , . . . , Ar = A0 in H erzeugen.) 3. F¨ uge T10 in T ein, indem die Wurzel von T10 mit k1 identifiziert wird. Das Resultat ist der Baum T 0 . Der Blattknoten in T10 , der mit A0 beschriftet ist, heiße k2 . 4. Wenn k ein Blatt von T 0 ist, das mit einer Variablen A beschriftet ist, so erg¨anze unter k einen A-Ableitungsbaum, dessen Bl¨atter mit Terminalzeichen beschriftet sind. (Dies geht, weil A produktiv ist.) 5. Der resultierende Ableitungsbaum heiße T0 . Der Unterbaum mit Wurzel k1 heißt T1 ; der Unterbaum von T1 mit Wurzel k2 heißt T2 . Nun haben wir eine Situation erreicht, die der im Beweis des Pumping-Lemmas (Satz 4.4.1) entspricht. Wenn wir w = α(T2 ) setzen und v und x so w¨ahlen, dass α(T1 ) = vwx, und schließlich u und y so, dass uvwxy = α(T0 ) ist, so k¨onnen wir genau wie im Beweis des Pumping-Lemmas schließen, dass |vx| ≥ 1 ist und alle W¨orter uv i wxi y ∈ L(G) sind. Diese W¨orter sind alle verschieden; also ist L(G) unendlich. 199
5.8.2 Satz
Die folgenden Aufgaben bez¨ uglich NPDA’s sind algorithmisch l¨osbar:
(a) (Leerheitsproblem) Gegeben ein NPDA M , entscheide ob LM = ∅ ist. (b) (Wortproblem) Gegeben ein NPDA M und ein w ∈ Σ∗ , entscheide ob w ∈ LM , und finde im positiven Fall eine akzeptierende Berechnung von M auf x. (c) (Unendlichkeitsproblem) Gegeben ein NPDA M , entscheide ob |LM | = ∞ ist. Beweis: Aus Satz 5.5.1 wissen wir, dass man aus M eine kontextfreie Grammatik G (in Chomsky-Normalform) mit L(G) = LM konstruieren kann. Auf diese Grammatik wenden wir die Algorithmen aus Satz 5.8.1(a), (b) und (c) an. Wenn wir in Aufgabe (b) herausfinden, dass w ∈ LM ist, dann probieren wir systematisch alle Berechnungen von M auf Eingabe w durch, die t Schritte machen, f¨ ur t = |w|, |w| + 1, |w| + 2, . . ., bis wir eine akzeptierende Berechnung finden. Nat¨ urlich sind dieselben Fragen f¨ ur DPDA’s im Prinzip mit denselben Algorithmen l¨osbar, da DPDA’s nur ein Spezialfall von NPDA’s sind. Im Fall des Wortproblems gibt es f¨ ur DPDA’s einen einfacheren Algorithmus. Gegeben einen DPDA M und ein Eingabewort w, bauen wir M nach den in Lemmas 5.7.6 und 5.7.7 beschriebenen Methoden in einen zu M ¨aquivalenten DPDA M 0 um, der seine Eingabe w vollst¨andig liest und dann mittels seines Zustandes mitteilt, ob w ∈ LM oder nicht. Damit l¨asst sich das Wortproblem dann direkt l¨osen, ohne den DPDA in eine Grammatik umzuformen. Weiter kann man f¨ ur einen DPDA M algorithmisch testen, ob LM = Σ∗ ist. (Man baut mit der Methode der eben erw¨ahnten Lemmata einen DPDA M 0 f¨ ur LM und testet, ob LM 0 = ∅.) Zum Abschluss wollen wir noch einige algorithmisch unentscheidbare“ Eigenschaften von ” kontextfreien Sprachen diskutieren. Eine Eigenschaft“ ist dabei einfach eine Aussage, ” die auf kontextfreie Grammatiken zutreffen kann oder nicht, beispielsweise die Aussagen L(G) ist endlich“ oder G ist mehrdeutig“. ” ” Zun¨achst erkl¨aren wir: 5.8.3 Erkl¨ arung Eine Eigenschaft E von kontextfreien Grammatiken heißt unentscheidbar , wenn es keinen Algorithmus A gibt, der zu jeder vorgelegten kontextfreien Grammatik G als Eingabe die Antwort ja“ liefert, wenn G die Eigenschaft E hat, und ” nein“ sonst. ” Die Erkl¨arung des Begriffs unentscheidbar“ muss momentan noch etwas vage und mathe” matisch ungenau bleiben, weil wir den Begriff Algorithmus“ nicht pr¨azise definiert haben ” (und dies auch gar nicht k¨onnen). In der Vorlesung Algorithmentheorie“ wird gezeigt, ” wie man den intuitiven Algorithmusbegriff durch eine formale Definition ersetzen kann, so dass die Behauptung es gibt keinen Algorithmus“ mathematischer Argumentation ” zug¨anglich wird. 200
Nat¨ urlich kann man genauso u ¨ber Eigenschaften anderer Dinge, wir NPDA’s oder DPDA’s sagen, sie seien unentscheidbar. Manchmal bezeichnet man auch eine Eigenschaft von kontextfreien Sprachen als unentscheidbar (z.B. sagt man, die Eigenschaft L = Σ∗“ oder ” L ist regul¨ar“ sei f¨ ur kontextfreie Sprachen unentscheidbar“). Dann ist aber implizit ” ” immer gemeint, dass die Sprachen durch eine endliche Beschreibung wie eine Grammatik oder einen Kellerautomaten gegeben sein m¨ ussen. Wenn eine Eigenschaft von Grammatiken unentscheidbar ist, dann bedeutet dies insbesondere, dass es prinzipiell kein Debugging-Tool“ geben kann, das das entsprechen” de Entscheidungsproblem allgemein und f¨ ur jede Grammatik l¨ost. Beispielsweise ist die Eigenschaft G ist mehrdeutig“ unentscheidbar. Das bedeutet, dass jeder menschliche ” Grammatik-Designer, aber auch automatische Grammatik-Konstruktions-Verfahren auf andere Weise sicherstellen m¨ ussen, dass eine neu konstruierte Grammatik nicht versehentlich mehrdeutig wird. Wir geben nun einige unentscheidbare Fragen im Zusammenhang mit kontextfreien Sprachen an. F¨ ur die Beweise (Auswahl) sei auf die Vorlesung Algorithmentheorie“ verwiesen. ” ¨ 5.8.4 Satz (Schnittproblem, Aquivalenzproblem fu ¨ r L2 ) Folgende Probleme sind unentscheidbar : Gegeben seien zwei kontextfreie Grammatiken G1 und G2 . (a) Ist L(G1 ) ∩ L(G2 ) = ∅? (b) Ist L(G1 ) = L(G2 )? 5.8.5 Satz (Unentscheidbare Fragen fu ¨ r L2 ) Folgende Probleme sind unentscheidbar : Gegeben sei eine kontextfreie Grammatik G. (a) Ist G mehrdeutig? (b) Ist L(G) inh¨arent mehrdeutig? (c) Ist L(G) kontextfrei? (d) Ist L(G) deterministisch kontextfrei? (e) Ist L(G) regul¨ar? Wir bemerken, dass die Unentscheidbarkeit sich auf NPDA’s u ¨bertr¨agt, da man nach Satz 5.5.1 Grammatiken und NPDA’s algorithmisch ineinander umformen kann. Wir benennen noch den Entscheidbarkeitsstatus dreier Fragen zu DPDA’s. Der Status ¨ des Aquivalenzproblems bildete jahrzehntelang ein (ber¨ uhmtes) offenes Problem, bis sein Status 1997 gekl¨art wurde. 201
5.8.6 Satz
(Entscheidungsfragen fu ¨ r DPDA’s)
(a) (Schnittproblem) Es ist unentscheidbar, ob f¨ ur gegebene DPDA’s M1 und M2 gilt, dass LM1 ∩ LM2 = ∅. ¨ (b) (Aquivalenzproblem) Es gibt einen Algorithmus, der zu gegebenen DPDA’s M1 und M2 entscheidet, ob LM1 = LM2 gilt. (G. S´enizergues, 1997.) (c) (Regularit¨ atsproblem) Es gibt einen Algorithmus, der zu einem gegebenen DPDA M entscheidet, ob L(M ) regul¨ar ist.
202
Anhang A
A.1
b-¨ are und b-adische Zahldarstellung
Wir betrachten verschiedene Zahldarstellungen. Diese Untersuchungen liefern Beispiele f¨ ur Induktionsbeweise und sie liefern sehr nat¨ urliche Abz¨ahlungen f¨ ur die Mengen Σ∗ , wobei Σ ein beliebiges Alphabet ist. Der Inhalt dieses Kapitels ist nicht pr¨ ufungsrelevant, allerdings wird er in der Vorlesung als bekannt vorausgesetzt.
A.1.1
Die b-¨ are Zahldarstellung
In diesem Abschnitt diskutieren wir die mathematischen Grundlagen f¨ ur die Verwendung der Zahldarstellungen zu verschiedenen Basiszahlen. Allgemein u ¨blich und vertraut ist die Dezimaldarstellung , das ist die Notation von Zahlen mit Ziffern 0, 1, 2, . . ., 9. In der Informatik von zentraler Bedeutung ist die Bin¨ ardarstellung , d. h. die Darstellung von Zahlen mit den Ziffern 0 und 1. H¨aufig verwendet wird auch die Oktaldarstellung (Ziffern 0, 1, 2, 3, 4, 5, 6, 7) und die Hexadezimaldarstellung (Ziffern 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F; dabei stehen A, . . . , F f¨ ur 10, . . . , 15.) Weil man sich manchmal die Bin¨ardarstellung von Zahlen in Bytes oder Maschinenw¨orter zerlegt denkt, sind auch Darstellungen zur Basis 28 = 256, 216 = 65536 oder 232 interessant. Beispielsweise kann man die Zahl 467 ∈ N in Bin¨ardarstellung als 111010011, in Oktaldarstellung als 723 und in Hexadezimaldarstellung als 1D3 schreiben. Die Dezimaldarstellung ist nat¨ urlich 467. (Auch wenn es etwas pedantisch erscheint, ist es g¨ unstig, f¨ ur diesen Abschnitt die Zahl n ∈ N, die wir nat¨ urlich als Dezimalzahl (wie 467) notieren, von dem Wort (wie 467) u ¨ber dem Alphabet {0, 1, 2, . . . , 9} zu unterscheiden, das diese Zahl darstellt.) Wir benutzen als Alphabete Mengen Σb = {0, 1, . . . , b − 1} f¨ ur b ≥ 2; f¨ ur b ≤ 16 schreiben wir die Ziffern in der Schreibmaschinentype 0, 1, 2, . . . . F¨ ur Zahlsysteme mit mehr als 16 Ziffern muss man andere Konventionen benutzen. Am einfachsten ist es, die Ziffern mit gew¨ohnlicher (dezimaler) Notation zu schreiben und die W¨orter als k-Tupel mit Klammern und Kommas. Zum Beispiel hat dann die Zahl 300670126 zur Basis b = 100 203
die Darstellung (3, 0, 67, 1, 26). A.1.1 Definition (A.1)
+ F¨ ur b ≥ 2 und ak−1 · · · a1 a0 ∈ Σ+ b = {0, 1, . . . , b − 1} sei X (ak−1 · · · a1 a0 )b := ai b i 0≤i
die durch ak−1 · · · a1 a0 dargestellte nat¨ urliche Zahl. (Formal gesehen ist ( · )b eine Abbildung von Σ+ otig, kann man auch b nach N. Falls n¨ (ε)b := 0 definieren und damit die Abbildung ( · )b auf Σ∗ erweitern; das ist aber eher un¨ ublich.) Wir diskutieren kurz, wie man aus dem Wort ak−1 · · · a1 a0 ∈ {0, 1, . . . , b − 1}+ die zugeh¨orige Zahl berechnen kann. Anstelle von Formel (A.1) benutzt man das HornerSchema X (A.2) ai bi = (((· · · ((ak−1 · b + ak−2 ) · b + ak−3 ) · b + · · · ) + a2 ) · b + a1 ) · b + a0 . 0≤i
Dies f¨ uhrt zu folgendem iterativen Algorithmus f¨ ur die Berechnung von (ak−1 · · · a1 a0 )b : x := ak−1 ; for i := k − 2 downto 0 do x := x * b + ai ; Die Ausgabe ist der Inhalt n von x.
Wir zeigen an einem Beispiel, wie einfach etwa die Berechnung von (ak−1 · · · a1 a0 )2 durch iteriertes Verdoppeln und Addieren von 1 wird: ak−1 · · · a1 a0 sei 000101101011100. Eine Mitschrift der Inhalte i und x der Variablen i und x aus dem Programm sieht folgendermaßen aus: i 14 13 12 11 10 9 8 7
ai 0 0 0 1 0 1 1 0
x 0 0 0 1 2 5 11 22
i 6 5 4 3 2 1 0
ai 1 0 1 1 1 0 0
x 45 90 181 363 727 1454 2908
Es ist offensichtlich, dass f¨ uhrende Nullen auf den Wert einer Zahldarstellung keinen Einfluss haben; zum Beispiel ist (000467)10 = (467)10 = 467. 204
A.1.2 Definition Wenn ak−1 · · · a1 a0 ∈ {0, 1, . . . , b − 1}+ mit k = 1 (nur eine Ziffer) oder ak−1 6= 0 (keine f¨ uhrende Null), und n = (ak−1 · · · a1 a0 )b , so heißt ak−1 · · · a1 a0 eine b-¨ are Darstellung von n. Es w¨are nun denkbar, dass manche Zahlen keine b-¨are Darstellung besitzen, andere u. U. mehrere. Dass dies nicht so ist, macht das Konzept der b-¨aren Darstellung erst praktisch verwendbar. A.1.3 Satz
Sei b ≥ 2. Dann gibt es f¨ ur jede Zahl n ∈ N genau eine b-¨are Darstellung.
Beweis Wir bezeichnen die Aussage n besitzt genau eine b-¨are Darstellung“ mit E(n) ” und zeigen ∀n : E(n) durch starke Induktion nach n. — Sei also n ∈ N. 1. Fall: 0 ≤ n < b. Dann ist a0 = n eine b-¨are Darstellung von n, mit k = 1. Ist cl−1 · · · c1 c0 eine beliebige b-¨are Darstellung von n, so kann nicht l ≥ 2 sein (sonst w¨are n ≥ cl−1 bl−1 ≥ bl−1 ≥ b, ein Widerspruch). Also ist l = 1, und es folgt c0 = n = a0 . 2. Fall: n ≥ b. Dann k¨onnen wir nach der Methode der ganzzahligen Division mit Rest schreiben n = q · b + r f¨ ur ein q ∈ N und ein r mit 0 ≤ r < b, f¨ ur eindeutig bestimmte q = bn/bc und r = n − qb. Dabei ist n > q = bn/bc ≥ 1, weil n ≥ b ≥ 2 ist. Wir k¨onnen also die Induktionsvoraussetzung E(q) anwenden. Diese besagt, dass q eine eindeutig bestimmte b-¨are Darstellung cl−1 · · · c1 c0 besitzt. Weil q ≥ 1 ist, gilt also X q= ci bi , mit cl−1 6= 0. 0≤i
Wir setzen a0 := r und ai+1 := ci f¨ ur 0 ≤ i < l, und k := l + 1. Dann gilt offenbar X X n=r+b· c i bi = ai b i , 0≤i
0≤i
und ak−1 6= 0, also ist ak−1 · · · a1 a0 eine b-¨are Darstellung · d1 d0 Pvon n. —i Ist weiter P dm−1 · ·i−1 eine beliebige b-¨are Darstellung von n, so folgt aus n = d b = b·( d b )+ 0≤i<m i 1≤i<m i P i−1 d0 , dass d0 = r = a0 und q = ist, mit dm−1 6= 0. Letzteres heißt, dass 1≤i<m di b dm−1 · · · d1 eine b-¨are Darstellung von q ist. Nun ist aber (nach Induktionsvoraussetzung) cl−1 · · · c1 c0 die einzige b-¨are Darstellung von q. Daraus folgt m = l + 1 = k und di = ci−1 = ai , f¨ ur 1 ≤ i < k. Also ist ak−1 · · · a1 a0 die einzige b-¨are Darstellung von n. A.1.4 Bemerkung Man beachte, dass der Beweis eine (sogar praktisch leicht anwendbare und sehr effiziente) Methode zur Berechnung der Ziffern der b-¨aren Darstellung von n liefert. Genaugenommen beruht der Beweis eben auf der Beobachtung, dass man eine b-¨are Darstellung f¨ ur ein gegebenes n berechnen kann, ohne dass bei dieser Berechnung Wahlm¨oglichkeiten bestehen. Diese Methode ist, iterativ formuliert, durch das folgende Programmst¨ uck gegeben: 205
i := 0 ; q := n; repeat Teile ganzzahlig q durch b: r:= Rest und q:= Quotient ; ai := r ; i := i+1 until (q = 0) Den Inhalt der Variablen i am Ende der Berechnung nennen wir k. Die Ausgabe ist ak−1 · · · a1 a0 als b-¨are Darstellung von n. A.1.5 Beispiel Bei n = 467 und b = 8 ergeben sich nacheinander die folgenden Paare (Quotient q, Rest r): (b467/8c, 3) = (58, 3) , (b58/8c, 2) = (7, 2) , (b7/8c, 7) = (0, 7), und damit die Oktaldarstellung 723 f¨ ur 467. Angesichts der in Satz A.1.3 gemachten Feststellung ist es gerechtfertigt, von der b-¨aren Darstellung einer Zahl n zu sprechen. Aus der Sicht der formalen Sprachen ergibt sich folgendes Resultat: A.1.6 Korollar
Die Abbildung b-¨ar : N 3 n 7→ ak−1 · · · a1 a0 ∈ {0, 1, . . . , b − 1}+ , wo ak−1 · · · a1 a0 die b-¨are Darstellung von n ist,
ist injektiv. Ihr Bild ist b-¨ar(N) = {0} ∪ {1, 2, . . . , b − 1}{0, 1, . . . , b − 1}∗ . Das Bild der Abbildung b-¨ar ist eine echte Teilmenge von {0, 1, . . . , b − 1}+ , da die mehr als einziffrigen W¨orter mit f¨ uhrenden Nullen fehlen. Diese Funktion ist also nicht geeignet, eine Aufz¨ahlung von {0, 1, . . . , b − 1}+ zu liefern. Dies gelingt erst mit der im folgenden Abschnitt beschriebenen alternativen Abbildung.
A.1.2
Die b-adische Zahldarstellung
Weit weniger gebr¨auchlich als die b-¨are Darstellung, aber strukturell interessant und elegant ist die b-adische Darstellung von nat¨ urlichen Zahlen. Diese liefert eine nat¨ urliche ∗ Bijektion zwischen N und Σ , f¨ ur jedes endliche Alphabet Σ. 206
Wir bemerken zuerst, dass wir uns ein endliches Alphabet Σ mit |Σ| = b ≥ 1 immer als die Menge ∆b := {1, 2, . . . , b} ⊆ N vorstellen k¨onnen. Wir werden im folgenden auch immer nur von solchen Alphabeten sprechen. Wie vorher werden wir f¨ ur die Darstellung der kleinen Alphabete ∆b f¨ ur 1 ≤ b ≤ 10 die Ziffern 1, 2, . . . , 9, A benutzen (A steht f¨ ur die 10). A.1.7 Definition
F¨ ur b ≥ 1, k ≥ 0 und ak−1 · · · a1 a0 ∈ ∆∗b = {1, 2, 3, . . . , b}∗ sei [ak−1 · · · a1 a0 ]b :=
X
ai b i
0≤i
die durch ak−1 · · · a1 a0 dargestellte nat¨ urliche Zahl. ¨ mit der b-¨aren Darstellung. Definition A.1.7 hat auf den ersten Blick große Ahnlichkeit Man beachte aber, dass b = 1 nun erlaubt ist und dass die Ziffer 0 nicht vorkommt. Die Abbildung [ · ]b bildet ∆∗b nach N ab. Man beachte, dass hier der Fall k = 0, also ak−1 · · · a1 a0 = ε ausdr¨ ucklich eingeschlossen ist. Es ist [ε]b = 0 (f¨ ur alle b). Der Algorithmus zur Berechnung der Zahl [ak−1 · · · a1 a0 ]b ist fast derselbe wie bei (ak−1 · · · a1 a0 )b . Nur muss hier der Sonderfall k = 0 ber¨ ucksichtigt werden. x := 0 ; for i := k − 1 downto 0 do x := x * b + ai ; Die Ausgabe ist der Inhalt n von x. Im Fall b = 1 hat die Multiplikation mit b keine Wirkung, und die einzige m¨ogliche Ziffer ist die 1; damit ergibt sich hier eine sehr einfache Beziehung: [1k ]1 = k, f¨ ur alle k ∈ N. D. h. die 1-adische (oder monadische) Darstellung entspricht einfach der Repr¨asentation einer nat¨ urlichen Zahl durch eine Strichliste. A.1.8 Definition Wenn b ≥ 1 und ak−1 · · · a1 a0 ∈ ∆∗b und n = [ak−1 · · · a1 a0 ]b , dann heißt ak−1 · · · a1 a0 eine b-adische Darstellung von n. A.1.9 Beispiel Wir geben b-adische Darstellungen f¨ ur eine Reihe von nat¨ urlichen Zahlen an, f¨ ur b = 10, 5, 4, 3, 2, und 1.
207
n 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 126 127 200 1000
b = 10 ε 1 2 3 4 5 6 7 8 9 A 11 12 13 14 15 16 17 18 19 1A 21 126 127 19A 99A
b=5 ε 1 2 3 4 5 11 12 13 14 15 21 22 23 24 25 31 32 33 34 35 41 451 452 125 13345
b=4 ε 1 2 3 4 11 12 13 14 21 22 23 24 31 32 33 34 41 42 43 44 111 1332 1333 2414 44214
b=3 ε 1 2 3 11 12 13 21 22 23 31 32 33 111 112 113 121 122 123 131 132 133 11123 11131 13332 323231
b=2 ε 1 2 11 12 21 22 111 112 121 122 211 212 221 222 1111 1112 1121 1122 1211 1212 1221 22222 111111 2112112 222212112
b=1 ε 1 11 111 1111 11111 111111 1111111 11111111 111111111 1111111111 111 112 113 114 115 116 117 118 119 120 121 1126 1127 1200 11000
Man versuche, anhand der Tabelle die Gesetzm¨aßigkeiten zu entdecken, die das Weiterz¨ahlen von n auf n + 1 in diesen Darstellungen bestimmen! Zudem beobachte man, dass allem Anschein nach die W¨orter in ∆∗b in der kanonischen Reihenfolge“ auf” gez¨ahlt werden, n¨amlich zun¨achst der L¨ange nach geordnet und innerhalb der Gruppen gleicher L¨ange lexikographisch geordnet. Wie bei der b-¨aren Darstellung zeigt man f¨ ur die b-adische Darstellung Existenz und Eindeutigkeit. Der Beweis hat auch dieselbe Struktur. A.1.10 Satz stellung.
Sei b ≥ 1. Dann gibt es f¨ ur jede Zahl n ∈ N genau eine b-adische Dar-
Beweis Wir bezeichnen die Aussage n besitzt genau eine b-adische Darstellung“ mit ” E(n) und zeigen ∀n : E(n) durch starke Induktion nach n. — Sei also n ∈ N. 1. Fall: n = 0. Dann ist ε eine b-adische Darstellung von n, mit P k = 0. Kein Wort ∗ cl−1 · · · c1 c0 ∈ ∆b mit l ≥ 1 kann b-adische Darstellung von 0 sein, weil 0≤i 0 ist. 208
2. Fall: n ≥ 1. Dann k¨onnen wir durch leichte Modifikation der ganzzahligen Division mit Rest schreiben n = q · b + r f¨ ur ein q ∈ N und ein r mit 1 ≤ r ≤ b, f¨ ur eindeutig bestimmte q ∈ N und 1 ≤ r ≤ b. (Wenn die gew¨ohnliche ganzzahlige Division n = q 0 · b + r0 f¨ ur q 0 ∈ N und ein r0 mit 0 ≤ r0 < b liefert, so setzen wir (q, r) := (q − 1, b) falls r = 0 und (q, r) := (q 0 , r0 ) sonst.) Man sieht leicht ein, dass q = b(n − 1)/bc < n und r = n − qb gilt. Wir k¨onnen also die Induktionsvoraussetzung E(q) anwenden. Diese besagt, dass q eine eindeutig bestimmte b-adische Darstellung cl−1 · · · c1 c0 ∈ ∆∗b besitzt: X q= c i bi . 0≤i
Wir setzen a0 := r und ai+1 := ci f¨ ur 0 ≤ i < l, und k := l + 1. Dann gilt offenbar X X n=r+b· c i bi = ai b i , 0≤i
0≤i
also ist ak−1 · · · a1 a0 eine b-adische Darstellung von n. — · · d1 d0 ∈ ∆∗b eine PIst weiteri dm−1 ·P beliebige b-adische Darstellung P von n, so folgt aus n = 0≤i<m di b = b·( 1≤i<m di bi−1 )+ d0 , dass d0 = r = a0 und q = 1≤i<m di bi−1 ist. Letzteres heißt, dass dm−1 · · · d1 eine badische Darstellung von q ist. Nun ist aber cl−1 · · · c1 c0 die einzige b-adische Darstellung von q. Daraus folgt m = l + 1 = k und di = ci−1 = ai , f¨ ur 1 ≤ i < k. Also ist ak−1 · · · a1 a0 die einzige b-adische Darstellung von n.
A.1.11 Bemerkung Analog zur b-¨aren Darstellung liefert dieser Beweis eine effiziente Methode zur Berechnung der Ziffern der b-adischen Darstellung von n: i := 0; q := n; while (q > 0) do Teile ganzzahlig q durch b : r:= Rest und q:= Quotient ; if r = 0 then q := q-1; r:= b ; ai := r ; i := i+1
Der Inhalt von i am Ende der Berechnung sei k. Die Ausgabe ist ak−1 · · · a1 a0 als b-adische Darstellung von n. 209
Angesichts der in Satz A.1.10 gemachten Feststellung ist es gerechtfertigt, von der badischen Darstellung einer Zahl n zu sprechen. Aus der Sicht der formalen Sprachen ergibt sich folgendes Resultat, das insbesondere besagt, dass f¨ ur jedes endliche Alphabet ∗ Σ die Menge Σ abz¨ahlbar ist: A.1.12 Korollar
F¨ ur jedes b ≥ 1 ist die Abbildung b-adic : N 3 n 7→ ak−1 · · · a1 a0 ∈ {1, 2, . . . , b}∗ , wo ak−1 · · · a1 a0 die b-adische Darstellung von n ist,
eine Bijektion. Ihre Umkehrung ist die Abbildung [ · ]b .
A.2
Induktive Definitionen
Wir diskutieren in diesem Abschnitt eine f¨ ur alle Bereiche der Informatik wichtige Methode f¨ ur die Konstruktion von Objekten und Strukturen. Diese Methode kennen Sie zumindest implizit aus anderen Grundvorlesungen ( Algorithmen und Datenstrukturen“, ” Programmierparadigmen“); in unserer Vorlesung spielt sie eine wichtige Rolle; auch im ” ¨ Hauptstudium wird sie gebraucht. Die rein mathematischen Uberlegungen im letzten Teil dieses Abschnittes geh¨oren nicht zum Pr¨ ufungsstoff. Wer jedoch den Mechanismus verstehen will, der hinter den in der Informatik allgegenw¨artigen induktiven Konstruktionen und den zugeh¨origen Induktionsbeweisen steckt, sollte den hier pr¨asentierten Stoff als Anlass zum Nachdenken nutzen. Die Beispiele sollte man auf jeden Fall durcharbeiten. Man muss in der Lage sein, einfache induktive Definitionen selbst zu entwerfen.
A.2.1
Beispiel: Aussagenlogische Formeln
Wir beginnen mit einem ausf¨ uhrlichen Beispiel, das an Konzepte aus der Vorlesung Logik ” und Zahlen“ ankn¨ upft. Aussagenlogische Formeln sind Gebilde wie (A ∨ B) (A → (B ∨ (¬C))) ((¬A) → (A → B)) ((A ∧ B) ↔ (¬((¬A) ∨ (¬B)))) Dabei stehen die Zeichen A, B, C f¨ ur (nicht weiter spezifizierte) Aussagen; die Zeichen ¬ ( nicht“), ∨ oder“, ∧ und“, → ( wenn . . . dann . . .“), ↔ genau dann wenn“ sind aussa” ” ” ” ” ” genlogische Verkn¨ upfungen“. Wir wollen zun¨achst genau definieren, was aussagenlogische 210
Formeln sind (und was nicht). Damit wir immer gen¨ ugend Aussagezeichen ( Aussageva” riable“) zur Verf¨ ugung haben, w¨ahlen wir (etwas willk¨ urlich) einen unendlichen Vorrat: A = {Ai | i ∈ N} ist die Menge der aussagenlogischen Variablen. (Mitunter benutzt man auch die Variablenmenge {Xi | i ∈ N}.) Statt aussagenlogische Variable“ sagen wir auch kurz ” Variable“. (Diese Zeichen nennt man u ur sie ¨brigens auch deswegen Variable“, weil f¨ ” ” sp¨ater etwas eingesetzt werden soll, n¨amlich Wahrheitswerte true“ oder false“.) ” ” A.2.1 Definition
(Aussagenlogische Formeln – alF )
(i) Jede Variable Ai , i ∈ N, ist eine aussagenlogische Formel (alF). (ii) (α) Wenn φ eine alF ist, dann auch (¬φ). (β) Wenn φ und ψ alF sind, dann auch folgendes: (φ ∧ ψ), (φ ∨ ψ), (φ → ψ), (φ ↔ ψ). (iii) Nur die von (i) und (ii) erfassten Gegenst¨ande sind aussagenlogische Formeln. Durch Anwenden der Regeln erhalten wir, dass beispielsweise die folgenden Gebilde Formeln sind: 1. A0 , A1 , A2 , A3 , A10 , A17 , A1001 , . . . ; 2. (¬A0 ), (¬A1 ), (¬A17 ), . . .
(wegen 1. und (ii)(α));
3. (A0 ∨ (¬A0 )), (A0 → (¬A3 )), ((¬A0 ) ↔ A3 ), (A0 ∧ A1 ), . . . (wegen 1., 2., und (ii)(β)); 4. (¬(A0 → (¬A3 ))), (¬(A0 ∧ A1 )), ((A0 ∨ (¬A0 )) ∧ (A0 → (¬A3 ))), . . . (wegen 1., 2., 3. und (ii)(β)); 5. ((¬(A0 → (¬A3 ))) ∧ (¬(A0 ∧ A1 ))), . . .
(wegen 4. und (ii)(β))
usw. Keine Formeln sind hingegen A0 A0 , (A0 ← A0 ), (¬¬A0 ), (A0 → A0 A1 ), (A0 ∧ A1 ∧ A2 ), . . .
211
Um letzteres zu begr¨ unden, m¨ usste man (iii) in geeigneter Weise einsetzen. Intuitiv ist es wohl klar, eine formal einwandfreie Begr¨ undung liegt zun¨achst nicht auf der Hand. Wie schon erw¨ahnt, ist die Haupteigenschaft von aussagenlogischen Formeln, dass man f¨ ur die Variablen Wahrheitswerte einsetzen kann ( 0“: false“ und 1“: true“) und dass ” ” ” ” dann damit ganzen Formeln Wahrheitswerte zugeordnet werden. Hierf¨ ur benutzt man das Konzept der Belegung“. ” A.2.2 Definition Eine Belegung b ist eine Funktion b : A → {0, 1}. (F¨ ur jedes Ai ∈ A ist b(Ai ) ein Wert 0“ oder 1“.) ” ” Wenn eine Formel φ und eine Belegung b vorliegt, so erh¨alt auch φ einen Wahrheitswert“ ” valb (φ). Ist beispielsweise b(A0 ) = 0 und b(A1 ) = 1, wird man (¬A0 ) den Wert 1 und (A0 ∨ (¬A1 )) den Wert 0 geben. Das Zeichen ↔“ wird als “¨aquivalent“ interpretiert, also ” werden bei dieser Belegung b die Formeln (A0 ↔ (¬A1 )) und ((¬A0 ) ↔ A1 ) den Wert 1 erhalten, die Formel (A0 ↔ A1 ) hingegen den Wert 0. Allgemein definieren wir das Konzept Wert der aussagenlogischen Formel φ unter der Belegung b durch Induktion u ¨ber den Aufbau von φ“: ” A.2.3 Definition folgt:
F¨ ur beliebiges b : A → {0, 1} und alF φ definieren wir valb (φ) wie
(i) valb (Ai ) = b(Ai ), f¨ ur i ∈ N; (ii) (α) Ist φ = (¬ψ), so ist 1 falls valb (ψ) = 0 valb (φ) = 0 falls valb (ψ) = 1 (Man sieht: hier wird die Negation modelliert.) (β) Ist φ = (ψ∧ ϑ), so ist 1 falls valb (ψ) = valb (ϑ) = 1 valb (φ) = 0 sonst. (Hier wird die Idee modelliert, dass φ wahr ist, wenn ψ wahr ist und ϑ wahr ist.) (γ) Ist φ = (ψ∨ ϑ), so ist 0 falls valb (ψ) = valb (ϑ) = 0 valb (φ) = 1 sonst. (Hier wird die Idee modelliert, dass φ wahr ist, wenn ψ wahr ist oder ϑ wahr ist.) (δ) Ist φ = (ψ→ ϑ), so ist 1 falls valb (ψ) = 0 oder valb (ϑ) = 1 valb (φ) = 0 sonst. (Dies entspricht der klassischen Interpretation der Implikation: ψ → ϑ ist falsch genau dann wenn ψ wahr und ϑ falsch ist.) 212
(ε) Ist φ = (ψ↔ ϑ), so ist 1 falls valb (ψ) = valb (ϑ) ¨ valb (φ) = (Dies entspricht der Aquivalenz :ψ↔ 0 falls valb (ψ) 6= valb (ϑ) ϑ ist wahr genau dann wenn ψ und ϑ beide wahr oder beide falsch sind.) Beispiele: Die Belegung b sei wie folgt gew¨ahlt: b(Ai ) = 1, falls i gerade ist, und b(Ai ) = 0, falls i ungerade ist. Dann gilt: valb (A0 ∨ A1 ) = max{b(A 0 ), b(A1 )} = 1 valb ((A1 ∨A1 ) ∨ A3 ) = 0 valb (¬A1 ) = 1 valb (A0 ↔ A2 ) ∨ (A1 ↔ A4 ) = 1, weil valb (A0 ) = valb (A2 ). Um systematisch die Semantik“ einer Formel φ zu erfassen, benutzt man in der Logik ” oft Wahrheitstafeln, in denen jeder m¨oglichen Belegung (spezifiziert f¨ ur die Variablen, die in φ vorkommen) und jeder Teilformel ψ von φ der Wert valb (ψ) zugeordnet wird. Beispiel: b(A0 ) b(A1 ) b(A2 ) valb ((A0 ∧ A1 )) valb ((A1 ∨ A2 )) valb (((A0 ∧ A1 ) ↔ (A1 ∨ A2 ))) 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 1 1 1 1 1 1 1 1 Im Prinzip kann man f¨ ur jede alF φ (und ihre Komponentenformeln) eine solche Wahrheitstafel aufstellen. Wenn man ein wenig Logik kennt, weiß man, dass die Zeichen →“ und ↔“ eigentlich ” ” nicht ben¨otigt werden, ja dass man sogar mit den beiden Zeichen ∧ und ¬ auskommt und dennoch dieselben Funktionen“ b 7→ valb (φ) beschreiben kann. Dies wollen wir nun ” pr¨azisieren. Wir beginnen mit einer weiteren induktiven Definition. A.2.4 Definition
Die Menge der {∧, ¬}-Formeln ist wie folgt definiert:
(i) F¨ ur jedes i ∈ N ist Ai eine {∧, ¬}-Formel. (ii) (α) Ist φ eine {∧, ¬}-Formel, dann auch (¬φ). (β) Sind φ und ψ {∧, ¬}-Formeln, dann auch (φ ∧ ψ). (iii) Nur was von (i) und (ii) erfasst ist, ist {∧, ¬}-Formel. 213
Beispiele: Die Ausdr¨ ucke A0 , (¬A0 ), (¬(¬A1 )), ((¬A1 ) ∧ A3 ), (¬((¬A1 ) ∧ (¬A2 ))), usw. sind {∧, ¬}-Formeln, nicht aber (A1 → (¬A2 )) und (A0 ∨ A1 ). Die Beschr¨ankung der aussagenlogischen Verkn¨ upfungen beschr¨ankt nicht die Ausdruckskraft der Formelmenge: A.2.5 Satz F¨ ur jede alF φ gilt folgendes: E(φ): Es gibt eine {∧, ¬}-Formel φ0 derart, dass f¨ ur jede Belegung b gilt: 0 valb (φ) = valb (φ ). (Man sagt: φ0 ist ¨aquivalent“ (genauer: semantisch ¨aquivalent“ ) zu φ.) ” ” Beispiel: Zu φ = (A0 ↔ (¬A2 )) ist die Formel φ0 = (¬(A0 ∧ A2 )) ∧ (¬((¬A0 ) ∧ (¬A2 ))) ur beide Formeln verifiziert: ¨aquivalent, wie man durch Aufstellen der Wahrheitstafeln f¨ b(A0 ) b(A2 ) valb (φ) valb (¬(A0 ∧ A2 )) valb (¬((¬A0 ) ∧ (¬A2 ))) valb (φ0 ) 0 0 0 1 0 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1 0 0 1 0 Aus der Definition von {∧, ¬}-Formeln folgt, dass jede {∧, ¬}-Formel φ0 auch eine alF ist, dass also valb (φ0 ) definiert ist. Der Satz wird mit einer Technik bewiesen, die typisch ist f¨ ur mittels einer induktiven Definition konstruierte Mengen. Beweis
Durch Induktion u ¨ ber den Aufbau von φ:“ ”
(i) Induktionsanfang: Wenn φ eine Aussagenvariable Ai f¨ ur ein i ∈ N, w¨ahlen wir 0 0 φ = φ. Dann ist φ eine {∧, ¬}-Formel, und nat¨ urlich gilt valb (φ) = b(Ai ) = valb (φ0 ), f¨ ur alle Belegungen b. (ii) Induktionsschritt: (α) Wenn φ = (¬ψ) ist, dann gibt es nach Induktionsvoraussetzung eine {∧, ¬}Formel ψ 0 mit valb (ψ) = valb (ψ 0 ), f¨ ur alle Belegungen b. 0 0 Wir w¨ahlen φ = (¬ψ ). Offenbar ist φ0 {∧, ¬}-Formel und valb (φ0 ) = 1 − valb (ψ 0 ) = 1 − valb (ψ) = valb (φ) f¨ ur alle Belegungen b. (β) Wenn φ = (ψ ∧ ϑ) oder φ = (ψ ∨ ϑ) oder φ = (ψ → ϑ) oder φ = (ψ ↔ ϑ) ist, dann gibt es nach Induktionsvoraussetzung {∧, ¬}-Formeln ψ 0 und ϑ0 mit valb (ψ) = valb (ψ 0 ) und valb (ϑ) = valb (ϑ0 ) f¨ ur alle Belegungen b. 0 Wir w¨ahlen φ wie folgt: Falls φ = (ψ ∧ ϑ) : φ0 = (ψ 0 ∧ ϑ0 ) Falls φ = (ψ ∨ ϑ) : φ0 = (¬((¬ψ 0 ) ∧ (¬ϑ0 ))) Falls φ = (ψ → ϑ) : φ0 = (¬(ψ 0 ∧ (¬ϑ0 ))) Falls φ = (ψ ↔ ϑ) : φ0 = ((¬(ψ 0 ∧ (¬ϑ0 ))) ∧ (¬(ϑ0 ∧ (¬ψ 0 )))) . 214
Weil f¨ ur beliebige Wahrheitswerte u[= valb (ψ) = valb (ψ 0 )] und v[= valb (ϑ) = valb (ϑ0 )] gilt: u·v max{u, v} max{(1 − u), v} (1 − u · v) + (1 − (1 − u) · (1 − v))
= = = =
u·v 1 − (1 − u) · (1 − v) 1 − (u · (1 − v)) (1 − u · (1 − v)) · (1 − v · (1 − u))
folgt in allen vier F¨allen, dass valb (φ0 ) = valb (φ) f¨ ur alle Belegungen b ist.
Diese allgemeine Konstruktion liefert f¨ ur die Beispielformel φ = (A0 ↔ (¬A2 )) die {∧, ¬}0 Formel φ = ((¬(A0 ∧ (¬(¬A2 )))) ∧ (¬((¬A2 ) ∧ (¬A0 )))). Damit ist die Diskussion des einf¨ uhrenden Beispiels aussagenlogische Formeln“ beendet. ”
A.2.2
Beispiel: Korrekte Klammerausdru ¨ cke
In diesem Abschnitt wollen wir uns mit der Sprache der korrekten Klammeraus” dru ¨cke“ befassen. Diese Sprache isoliert ein Merkmal aus vielen in der Informatik wichtigen Sprachen: die M¨oglichkeit, geklammerte Ausdr¨ ucke beliebig tief ineinander zu schachteln. Geklammerte Ausdr¨ ucke kommen in der Mathematik vor; in Programmen gibt es geklammerte arithmetische Ausdr¨ ucke und, ebenso wichtig, Strukturen aus ineinander geschachtelten Bl¨ocken (in Pascal durch begin-end-Konstruktionen, in C, C++ und Java durch die {-}-Struktur gegeben). Wir stellen uns vor, dass wir nur eine Sorte von Klammern, n¨amlich ( und ), haben, und lassen aus den betreffenden Ausdr¨ ucken oder Texten alles weg, was nicht Klammer ist. Welche Ausdr¨ ucke bleiben u ¨brig? Folgende W¨orter sind korrekte Klammerausdr¨ ucke: (), ()(()), ((())), ()()(()()), folgende nicht: ), )(), (())), (())(, (()))(. Im Lauf der Zeit merkt man, dass die intuitive Notation mit Klammern etwas unhandlich ist. Wir schreiben im folgenden 0 f¨ ur ( und 1 f¨ ur ). Unsere Beispiele f¨ ur kKA sind dann 01, 010011, 000111, 0101001011; die Gegenbeispiele sind 1, 101, 00111, 00110, 001110.
215
A.2.6 Definition
(Korrekte Klammerausdru ¨cke)
Wir definieren die Menge der korrekten Klammerausdr¨ ucke (kKA, eine Sprache u ¨ber Σ = {0, 1}) wie folgt: (i) ε ist in kKA; (ii) Falls w1 , w2 in kKA sind, dann ist auch 0w1 1w2 in kKA; (iii) Sonst ist nichts in kKA. Wir beweisen Aussagen u ucke per Induktion u ¨ber korrekte Klammerausdr¨ ¨ber die Definition: A.2.7 Satz
F¨ ur jeden korrekten Klammerausdruck w ∈ kKA gilt |w|0 = |w|1 .
Beweis I.A.: Offenbar ist |ε|0 = 0 = |ε|1 . I.V.: w1 , w2 ∈ kKA erf¨ ullen die Behauptung. I.S.: Betrachte w = 0w1 1w2 . Dann gilt I.V.
|w|0 = 1 + |w1 |0 + |w2 |0 = 1 + |w1 |1 + |w2 |1 = |w|1 , wie gew¨ unscht.
A.2.8 Satz F¨ ur jeden korrekten Klammerausdruck w ∈ kKA gilt: Wenn u ein Pr¨afix von w ist, so ist |u|0 ≥ |u|1 . ¨ Beweis Siehe Ubungen.
Die in Satz A.2.7 und Satz A.2.8 gemachten Aussagen machen es uns leicht nachzuweisen, dass eine 0-1-Folge kein korrekter Klammerausdruck ist. In den Beispielen 1, 101, 00111, 00110 von oben ist die Anzahl der Nullen und Einsen unterschiedlich; im Beispiel 001110 hat das Pr¨afix 00111 drei Einsen und zwei Nullen, was der Bedingung in Satz A.2.8 widerspricht. Die Bedingungen in den beiden S¨atzen zusammen sind auch hinreichend: A.2.9 Satz Ist w ∈ {0, 1}∗ derart dass (i) |w|0 = |w|1 und so dass (ii) |u|0 ≥ |u|1 f¨ ur jedes Pr¨afix u von w, dann ist w ∈ kKA.
216
Beweis Wir benutzen starke Induktion u ¨ber i = |w|. I.A.: i = 0, d. h. w = . Dieses Wort ist in kKA. I.V.: i ≥ 1 und f¨ ur alle W¨orter w0 mit |w0 | = i0 < i, die (i), (ii) erf¨ ullen, gilt w0 ∈ kKA. I.S.: Betrachte w ∈ {0, 1}∗ mit i = |w|, so dass (i), (ii) gelten. Betrachte das k¨ urzeste Pr¨afix u 6= ε von w mit |u|0 = |u|1 . (Wegen (i) ist w selbst ein solches Pr¨afix, also gibt es welche. Die Intuition hinter der Wahl von u ist, in w von links beginnend die Stelle zu suchen, wo die schließende Klammer steht, die der ersten ¨offnenden Klammer entspricht.) Wegen (ii) muss w, also auch u, mit 0 beginnen; aus der Wahl von u ( k¨ urzestes“) folgt ” sofort, dass u mit dem Buchstaben 1 enden muss. Mit u = 0u0 1 k¨onnen wir schreiben: w = 0u0 1v, f¨ ur ein v ∈ {0, 1}∗ . Man kann sich nun leicht folgendes u ¨berlegen: u0 enth¨alt ebenso viele Nullen wie Einsen, und in jedem Pr¨afix von u0 gibt es mindestens so viele Nullen wie Einsen — das folgt wieder daraus, dass u minimale L¨ange hat. Noch leichter sieht man, dass v die analogen Eigenschaften hat. Nach I.V. folgt, dass u0 und v beide in kKA sind. Nach der induktiven Definition A.2.6 von kKA ist also w = 0u0 1v ∈ kKA.
A.2.3
Induktive Definitionen: Formaler Rahmen
In dem in den Abschnitten A.2.1 und A.2.2 vorgestellten Beispielen finden sich die folgenden Muster, die bei der Verwendung von induktiven Definitionen (bzw. rekursiven Konstruktionen) immer wieder auftauchen. F¨ ur die Definition der Menge (alF oder {∧, ¬}Formeln oder kKA) selbst: (i) Basisobjekte; (ii) Vorschriften, wie aus gegebenen Objekten neue, zusammengesetzte Objekte zu gewinnen sind; (iii) die Einschr¨ankung: nur die durch (i) und (ii) gelieferten Objekte sind gemeint. Weiterhin haben wir an den Beispielen die Technik Definition von Funktionen u ¨ber ” den Aufbau von induktiv definierten Objekten“ (wie valb ) kennengelernt sowie die Methode Beweis durch Induktion u ¨ber den Aufbau von induktiv definierten Objek” ten“. Wir wollen nun einen formalen Rahmen f¨ ur die obigen Konstruktionen diskutieren, der insbesondere die benutzten Definitions- und Beweismethoden rechtfertigt. Dieser Abschnitt ist nicht pru ¨ fungsrelevant. Allerdings muss man in der Lage sein, in konkreten Situationen induktive Definitionen zu bauen und Definitionen und Beweise u uhren. ¨ber den Aufbau“ durchzuf¨ ” Was brauchen wir f¨ ur eine induktive Definition einer Menge M von Objekten wie aussagenlogischen Formeln oder Klammerausdr¨ ucken? 217
(i) Basisobjekte, mit denen man anfangen kann. (ii) Konstruktionsregeln, die sagen, unter welchen Umst¨anden man aus schon vorliegenden Objekten neue Objekte bauen kann und wie diese aussehen. (iii) Eine Ausschlussregel : Nur die durch (i) und (ii) erzeugten Objekte geh¨oren zu M. Aus technischen Gr¨ unden ist es n¨ utzlich, sich eine universelle“ Grundmenge A vorzuge” ben, innerhalb derer sich die konstruierten Objekte befinden. Formal: A soll die Grundmenge sein, B ⊆ A die Menge der Basisobjekte; die Regelmenge ist als Menge von Tupeln ((a1 , . . . , al ), b) , l ≥ 1 mit a1 , . . . , al ∈ A gegeben. (Interpretation: aus a1 , . . . , al kann man b bauen“.) ” In mathematischer Notation fasst man die Tupel, die Regeln entsprechen, als Relation R ⊆ Seq+ (A) × A auf, wo Seq+ (A) = {(a1 , . . . , al ) | l ≥ 1, a1 , . . . , al ∈ A} die Menge der nichtleeren endlichen Folgen in A ist. Die in den obigen Beispielen verwendeten induktiven Definitionen haben nun das folgende Muster: (i) B ⊆ M . (ii) Wenn a1 , . . . , al ∈ M und ((a1 , . . . , al ), b) ∈ R, dann ist auch b ∈ M . (iii) Nur die durch die Anwendung von (i) und (ii) erfassten Objekte sind in M . Wie sollen wir uns die durch so etwas definierte Menge M vorstellen? Am einfachsten ist es, sich die Objekte in M nach und nach“ gem¨aß den Regeln (i) und (ii) erzeugt ” vorzustellen. Dazu teilen wir die konstruierten Objekte in Schichten“ ein. Schicht 0 sind ” die Basisobjekte; in Schicht i sind alle Objekte aus Schicht i − 1 und zus¨atzlich diejenigen, die man mit einer Anwendung einer Regel in R aus Objekten der Schicht i−1 bauen kann. Formal kann man die Schichten so definieren: i = 0 : IR0 (B) := B; i ≥ 1 : IRi (B) := IRi−1 (B) ∪ {b ∈ A | ∃a1 , . . . , al ∈ IRi−1 (B) mit ((a1 , . . . , al ), b) ∈ R}. Als einfaches Beispiel betrachten wir die Klammersprache aus Abschnitt A.2.2. Als A w¨ahlen wir {0, 1}∗ . Die Menge der Basisobjekte gem¨aß Regel (i) ist B := {ε} ⊆ A. Die Regeln (ii) zur Erzeugung neuer Klammerausdr¨ ucke sind durch die Relation R = {((w1 , w2 ), 0w1 1w2 ) | w1 , w2 ∈ A} 218
gegeben. (Man sieht an diesem Beispiel, dass R auch v¨ollig unsinnige konkrete Regeln enth¨alt, die beim Aufbau von M gar nicht benutzt werden. Beispielsweise liegt die Regel ((010, 00), 0010100) in R. Dass dies so sein muss, ist aber klar: Wenn man sich schon auf Elemente von M beschr¨anken k¨onnte, m¨ usste man M ja nicht definieren.) Dann ergibt sich:
IR0 (B) IR1 (B) IR2 (B) IR3 (B)
= = = =
B = {ε} {ε} ∪ {01}, weil 0 ◦ ε ◦ 1 ◦ ε = 01 {ε, 01} ∪ {01, 0011, 0101, 001101} IR2 (B) ∪ {0001110101, 0001110011, . . . }
(Die Menge IR3 (B) hat schon 26 Elemente.) Es ist intuitiv einleuchtend, dass wegen der Regeln (i) und (ii) alle Elemente von IRi (B) zu M geh¨oren m¨ ussen, f¨ ur alle i ≥ 0. Regel (iii) verlangt, dass wir nicht mehr Elemente als unbedingt n¨otig in M einbeziehen. Es ist daher nat¨ urlich, in die erzeugte Menge genau i die Objekte zu packen, die in einem der IR (B) liegen und daher dabei sein mu ¨ssen. Dies f¨ uhrt zu folgender Definition. [ I R (B) := IRi (B). i≥0
¨ (Der Uberstrich symbolisiert eine Abschlussoperation“: I R (B) entsteht durch Ab” schluss von B unter den durch R gegebenen Konstruktionsregeln.) Wir wollen zeigen, dass I R (B) unter allen Mengen, die (i) und (ii) erf¨ ullen, die kleinste ist. Hierzu definieren wir: A.2.10 Definition gilt:
C ⊆ A heißt R-abgeschlossen, wenn f¨ ur alle ((a1 , . . . , al ), b) ∈ R a1 , . . . , al ∈ C ⇒ b ∈ C.
A.2.11 Satz ullt B ⊆ I R (B) und ist R-abgeschlossen. (a) Die Menge I R (B) erf¨ (b) Wenn B ⊆ C und C R-abgeschlossen ist, dann gilt I R (B) ⊆ C. Beweis (a) Wir haben B = IR0 (B) und IR0 (B) ⊆ I R (B) nach Definition. (b) Behauptung: IRi (B) ⊆ C, f¨ ur alle i ≥ 0. Beweis durch vollst¨andige Induktion u ¨ber i ≥ 0: 0 I.A.: IR (B) = B ⊆ C nach Annahme.
219
I.V.: IRi−1 (B) ⊆ C. I.S.: Betrachte ein Element b von IRi (B) = IRi−1 (B) ∪ {b ∈ A | ∃a1 , . . . , al ∈ IRi−1 (B) mit ((a1 , . . . , al ), b) ∈ R}. Wenn b ∈ IRi−1 (B), ist b ∈ C nach I.V. Wenn ((a1 , . . . , al ), b) ∈ R ist, f¨ u r a 1 , . . . , al ∈ i−1 IR (B) ⊆ C, dann ist auch b ∈ C, weil C R-abgeschlossen ist. Also ist jedes Element von IRi (B) in C, wie gew¨ unscht. Aus der Behauptung folgt sofort: I R (B) =
[
IRi (B) ⊆ C.
i≥0
Wir wollen Satz A.2.11 benutzen, um Induktionsbeweise im Zusammenhang mit induktiven Definitionen zu rechtfertigen. A.2.12 Fakt (Beweisprinzip Induktion u ¨ ber den Aufbau“) Es sei eine Menge ” A, eine Menge R ⊆ Seq(A) × A und ein B ⊆ A gegeben. E(a) sei eine Eigenschaft1 , die f¨ ur Elemente von A wahr oder falsch sein kann. Falls nun gilt: (i) E(a) f¨ ur alle a ∈ B. (ii) wenn ((a1 , . . . , al ), b) ∈ R und E(a1 ), . . . , E(al ) gilt, so gilt auch E(b). dann gilt E(a) f¨ ur alle a ∈ I R (B). Beweis Setze C := {a ∈ A | E(a) gilt}. Wegen (i) gilt B ⊆ C; wegen (ii) gilt, dass C R-abgeschlossen ist. Daraus folgt mit Satz A.2.11, dass I R (B) ⊆ C ist — das heißt aber gerade, dass f¨ ur alle a ∈ I R (B) Eigenschaft E(a) gilt. A.2.13 Beispiel Bei Klammerausdr¨ ucken k¨onnte E(w) die folgende Aussage sein: f¨ ur alle Pr¨afixe v von w gilt: |v|0 ≥ |v|1 . ur Induktionsbeweise in der in den AbschnitFakt A.2.12 liefert eine Rechtfertigung f¨ ten A.2.1 und A.2.2 diskutierten Art. F¨ ur eine gegebene Eigenschaft E(a) zeige man nur (i) und (ii); damit ist bewiesen, dass E(a) f¨ ur alle a ∈ I R (B) gilt. Schließlich diskutieren wir noch kurz die M¨oglichkeit, auf Mengen I R (B) durch Induktion ” u ¨ber den Aufbau“ Funktionen zu definieren, wie es in den Anwendungen in selbstverst¨andlicher Weise gemacht wird. 1
E“ ist ein geschwungenes E“ und hat mit ε“ (epsilon) nichts zu tun. ” ” ”
220
A.2.14 Fakt Es seien A, B, R wie vorher. Die Relation R habe die zus¨atzliche Eigenschaft, dass f¨ ur b ∈ I R (B) gilt: b ∈ B oder ((a1 , . . . , ar ), b) ∈ R f¨ ur genau ein Tupel (a1 , . . . , ar ) ∈ Seq(I R (B)). Dann kann man auf folgende Weise eine Funktion f mit Definitionsbereich I R (B) definieren: (i) definiere f (a) f¨ ur alle a ∈ B; (ii) f¨ ur b ∈ I R (B) − B spezifiziere, wie man f (b) aus a1 , . . . , ar , b, f (a1 ), . . . , f (ar ) berechnet, wenn ((a1 , . . . , ar ), b) ∈ Seq(I R (B)) × I R (B). Den (nicht schwierigen, aber trockenen) Beweis f¨ ur Fakt A.2.14 u ¨berlassen wir der Mathematik. Wir betrachten lieber noch Beispiele. A.2.15 Beispiel F¨ ur Klammerausdr¨ ucke w definieren wir induktiv die Schachtelungstiefe d(w). (Beispiel: d(01) = 1, d(0001011011) = 3. Deutlicher wird die Idee, wenn man die W¨orter in der Schreibweise () und ((()())()) ansieht.) Dies geht einfach, wie folgt: (i) d(ε) = 0; (ii) d(0w1 1w2 ) = max{1 + d(w1 ), d(w2 )}. ¨ Nun kann man (zur Ubung) Aussagen per Induktion beweisen, wie z. B. die folgende: d(w) = max{|v|0 − |v|1 | v Pr¨afix von w}. A.2.16 Beispiel (Reflexive und transitive Hu aren Relation) Es ¨ lle einer bin¨ sei X eine Menge, S ⊆ X × X eine bin¨are Relation. Wir definieren die reflexive und transitive H¨ ulle von S als S ∗ := I R (B), wo die Grundmenge A := X × X, die Konstruktionsrelation R := {((x, y), (y, z))|(x, y) ∈ ¨ A, (y, z) ∈ S}, und die Startmenge B := {(x, x)|x ∈ X} ist. (Zur Ubung u ¨berlege man, i welche Tupel in IR (B) liegen.)
221