Skript - TU Ilmenau

Transcription

Skript - TU Ilmenau
Automaten und Formale Sprachen
Skript zur Vorlesung
WS 2009/2010
Vorlesender: Prof. Dr. M. Kunde
Fassung vom 07.01.2008
Autor: Prof. M. Dietzfelbinger
Technische Universität Ilmenau
Fakultät für Informatik und Automatisierung
Fachgebiet Komplexitätsheorie und Effiziente Algorithmen
Inhaltsverzeichnis
0 Vorbemerkungen
2
0.1
Einleitung und Überblick . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
0.2
Zur Arbeitstechnik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
0.3
Literatur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
1 Grundbegriffe
1.1
9
Alphabete und Sprachen . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2 Endliche Automaten und reguläre Sprachen
2.1
9
18
Deterministische endliche Automaten . . . . . . . . . . . . . . . . . . . . . 18
2.1.1
Endliche Automaten mit Ausgabe . . . . . . . . . . . . . . . . . . . 30
2.2
Nichtdeterministische endliche Automaten . . . . . . . . . . . . . . . . . . 31
2.3
Reguläre Ausdrücke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
2.4
Das Pumping-Lemma für reguläre Sprachen . . . . . . . . . . . . . . . . . 60
2.5
Abschlusseigenschaften für reguläre Sprachen . . . . . . . . . . . . . . . . . 63
2.6
Entscheidbarkeitsfragen für reguläre Sprachen . . . . . . . . . . . . . . . . 68
2.7
Die Minimierung deterministischer endlicher Automaten . . . . . . . . . . 71
2.7.1
Unerreichbare Zustände . . . . . . . . . . . . . . . . . . . . . . . . 71
2.7.2
Äquivalente und nicht-äquivalente Zustände . . . . . . . . . . . . . 74
2.7.3
Minimalautomaten . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
3 Grammatiken und die Chomsky-Hierarchie
87
3.1
Grammatiken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
3.2
Rechtslineare Grammatiken und reguläre Sprachen . . . . . . . . . . . . . 99
3.2.1
Rechtslineare Grammatiken . . . . . . . . . . . . . . . . . . . . . . 99
3.2.2
Äquivalenz zu regulären Sprachen . . . . . . . . . . . . . . . . . . . 100
ii
3.2.3
Linkslineare Grammatiken . . . . . . . . . . . . . . . . . . . . . . . 102
4 Kontextfreie Grammatiken und kontextfreie Sprachen
105
4.1
Beispiele und Ableitungen . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
4.2
Ableitungsbäume, Linksableitungen, Rechtsableitungen . . . . . . . . . . . 111
4.3
Die Chomsky-Normalform . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
4.3.1
Separierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
4.3.2
Verkürzung rechter Seiten . . . . . . . . . . . . . . . . . . . . . . . 127
4.3.3
Bearbeitung von ε-Produktionen . . . . . . . . . . . . . . . . . . . 129
4.3.4
Elimination von Kettenregeln . . . . . . . . . . . . . . . . . . . . . 137
4.4
Das Pumping-Lemma für kontextfreie Sprachen . . . . . . . . . . . . . . . 141
4.5
Der Cocke-Younger-Kasami-Algorithmus . . . . . . . . . . . . . . . . . . . 158
4.6
Abschlusseigenschaften kontextfreier Sprachen I . . . . . . . . . . . . . . . 163
5 Kellerautomaten
167
5.1
Nichtdeterministische Kellerautomaten . . . . . . . . . . . . . . . . . . . . 167
5.2
Top-Down-Parsing, LL-Parsing . . . . . . . . . . . . . . . . . . . . . . . . 181
5.3
Bottom-Up-Parsing, LR-Parsing . . . . . . . . . . . . . . . . . . . . . . . . 191
5.4
Akzeptierungsmodi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
5.5
Kellerautomaten und Grammatiken . . . . . . . . . . . . . . . . . . . . . . 198
5.6
Abschlusseigenschaften II . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
5.7
Deterministische Kellerautomaten und ihre Sprachen . . . . . . . . . . . . 202
5.8
Entscheidungsfragen für kontextfreie Sprachen . . . . . . . . . . . . . . . . 209
A
214
A.1 Zahldarstellungen und Abzählungen . . . . . . . . . . . . . . . . . . . . . . 214
A.1.1 Die b-äre Zahldarstellung . . . . . . . . . . . . . . . . . . . . . . . 214
A.1.2 Die b-adische Zahldarstellung . . . . . . . . . . . . . . . . . . . . . 218
A.2 Induktive Definitionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
A.2.1 Beispiel: Aussagenlogische Formeln . . . . . . . . . . . . . . . . . . 222
A.2.2 Beispiel: Korrekte Klammerausdrücke . . . . . . . . . . . . . . . . . 225
A.2.3 Induktive Definitionen: Formaler Rahmen . . . . . . . . . . . . . . 228
1
Kapitel 0
Vorbemerkungen
0.1
Einleitung und Überblick
Die Lehrveranstaltung Automaten und Formale Sprachen (AFS)“ behandelt zusammen
”
mit der Veranstaltung Berechenbarkeit und Komplexitätstheorie (BKT)“ im 5. 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, über die dann Sätze bewiesen werden. Allerdings haben die in diesen Veranstaltungen behandelten Gegenstände auch noch die Eigenschaft, dass sie in engem Bezug zu
konkreten Fragen aus dem Informatik-Alltag stehen.
In der AFS-Veranstaltung geht es hauptsächlich um Mittel zur Beschreibung formaler
”
Sprachen“, wie man sie insbesondere bei der Erstellung von Compilern oder Interpretern
benötigt. Die wesentlichen Beschreibungsmittel hierfür sind Automaten und Grammatiken.
Wir beginnen die Vorlesung mit der Einführung des Begriffs (synonym: Konzeptes) For”
male Sprache“. Etwas flapsig ausgedrückt 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ürfen. Beispiele für formale Sprachen sind
• die Menge {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, . . .} der Dezimaldarstellungen der
natürlichen 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ärdarstellungen der
natürlichen 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));
2
• die Menge der korrekten Darstellungen für 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ücke 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örter, die in der gedruckten Version des Vorlesungsverzeichnisses
der TU Ilmenau für das Wintersemester 2007/08 stehen.
Man kann sich darüber streiten, ob die Menge der korrekten Sätze der deutschen Sprache
eine formale Sprache darstellt, da wohl für viele Sätze die Frage, ob sie korrekt oder nicht
korrekt sind, nicht eindeutig beantwortet werden kann, da die Antwort vom Zusammenhang oder vom Geschmack abhängt oder sich im Lauf der Zeit ändert.
Aus den Beispielen sieht man schon, dass viele wichtige formale Sprachen unendlich sind.
Um eine solche Sprache zu beschreiben (d. h. zu spezifizieren“), kann man also nicht
”
einfach alle Wörter aufzählen, die dazu gehören. 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ür eine solche endliche
Beschreibung sei die bekannte Methode zur Definition der syntaktisch korrekten PascalProgramme 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
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ände 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äftspartnern (e-commerce). Oft erzeugen endliche Automaten dann
auch Ausgabesymbole oder Ausgabewörter. Diesen Aspekt streifen wir nur kurz. Nichtdeterministische endliche Automaten bilden eine Verallgemeinerung von endlichen
3
Automaten, bei denen der nächste Schritt nicht eindeutig vorgeschrieben ist. Dieses Modell macht die Beschreibung einger Sprachen kompakter möglich; wir werden aber sehen,
dass die Ausdruckskraft solcher Automaten im Prinzip nicht stärker ist als die der gewöhnlichen endlichen Automaten. Automaten kann man als Akzeptoren“ für Texte benutzen,
”
indem man sie einen endlichen Eingabetext Buchstabe für Buchstabe lesen lässt und am
Ende fragt, ob der Automat den gelesenen Text gut findet ( akzeptiert“) oder nicht.
”
Wenn ein Automat M gegeben ist, bildet die Menge der von M akzeptierten Texte eine
Sprache LM . Die Sprachen, die sich von endlichen Automaten beschreiben lassen, nennen
wir reguläre Sprachen. Für sie stellen wir noch einen anderen Beschreibungsmechanismus bereit, die regulären 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önnen. Wir zeigen, dass endliche Automaten und reguläre Grammatiken genau
dieselbe Klasse von Sprachen beschreiben, indem wir Grammatiken in Automaten und
Automaten in Grammatiken umbauen, ohne dass sich die zugehörige Sprache ändert.
Weiter untersuchen wir Wege, wie wir zu einem minimalen Automaten“ kommen können,
”
also demjenigen Automaten für eine reguläre Sprache L, der die geringste Anzahl von
Zuständen hat. (Ein solcher Automat ist im wesentlichen eindeutig bestimmt.)
Eine weitere wichtige Beschreibungsform für reguläre Sprachen sind durch die regulären
Ausdrücke gegeben. Man begegnet einfachen regulären Ausdrücken, wenn man einen
Editor eine komplexere Suchen nach Teilstrings in einer Datei durchführen lässt (z. B.
mit wildcards und Wiederholungen von Teiltextstrukturen). Auch hier zeigen wir wieder exakt, das heißt mit einem mathematischen Beweis, dass diese Beschreibungsform
äquivalent zu der mit endlichen Automaten ist.
Die Untersuchung der regulären Ausdrücke 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äzise zu beschreiben. Auch die Beschreibung der Menge der syntaktisch korrekten PascalProgramme lässt sich als eine solche induktive Definition auffassen. — Es stellt sich heraus,
wiederum mit einem konstruktiven Umbau-Beweis, dass die Klasse der von regulären Ausdrücken beschreibbaren Sprachen wieder dieselbe ist wie die durch endliche Automaten
beschreibbare.
Wichtig sind mathematische Techniken, mit denen man beweisen kann, dass eine vorgegebene Sprache nicht regulär ist, man sich also die Suche nach einem sie beschreibenden
Automaten sparen kann. Wir beweisen das sogenannte Pumping Lemma, das die wichtigste Technik für diesen Zweck darstellt. Mit dieser Technik lässt 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örigen Klasse der kontextfreien Sprachen gewidmet. Woher die merkwürdige
4
Bezeichnung stammt, werden wir im Verlauf der Vorlesung erklären. 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üchern. Auch XML,
der aktuell praktisch extrem wichtige Formalismus zur Beschreibung semistrukturierter
”
Daten“, ist im wesentlichen ein System, in dem man für jede Anwendung eine eigene
kontextfreie Grammatik überlegen muss.
Wir definieren kontextfreie Grammatiken, untersuchen Syntaxbäume und Ableitungssequenzen, und betrachten wichtige Normalformen für Grammatiken. Ein Pumping
”
Lemma“ für kontextfreie Sprachen erlaubt den Nachweis, dass bestimmte Sprachen nicht
kontextfrei sind; hierzu gehört zum Beispiel die Sprache aller Texte, die durch Hintereinanderfügen eines Textes mit einer exakten Kopie entstehen (z. B. gehört das Wort
abrakadabrakad zu dieser Sprache). Diese einfache Beobachtung führt zu der Erkenntnis, dass kontextfreie Grammatiken nicht ausreichen, um eine typische Eigenschaft von
Pascal-Programmen auszudrücken, nämlich dass jede Variable, die irgendwo benutzt wird,
vorher deklariert worden sein muss. (Hierfür gibt es dann gesonderte Kontextbedingun”
gen“, die man zusätzlich zu den Syntaxdiagrammen beachten muss.)
Die Beschreibung der Menge der syntaktisch korrekten Programme ist eine Sache, die Syntaxanalyse und die Übersetzung in Maschinensprache (oder einen Zwischencode wie bei
Java) eine andere. Hierfür braucht man Syntaxanalysemethoden, die im Fall von kontextfreien Grammatiken durch sogenannte Kellerautomaten geliefert werden. Auch dieses
Modell wird ausführlich besprochen, und wir untersuchen im Prinzip, wie Kellerautomaten
Wörter daraufhin untersuchen, ob sie zu einer von einer Grammatik beschriebenen Sprache gehören. Auch hier werden nichtdeterministische Automaten für Modellierungszwecke
benutzt. Um eine Syntaxanalyse durch einmaliges Lesen des Textes zu erreichen, benötigt
man Kellerautomaten, die in jeder Situation einen eindeutig bestimmten nächsten Schritt
haben, was zu den deterministischen Kellerautomaten“ führt. Die Einzelheiten der Kon”
struktion von Syntaxanalyseverfahren aus einer kontextfreien Grammatik bleibt einer
Spezialvorlesung zum Thema Übersetzerbau“ vorbehalten.
”
Ausblick: Die Vorlesung Berechenbarkeit und Komplexitätstheorie“ im 5. Semester be”
fasst sich zunächst mit der Theorie zur Berechenbarkeit und Entscheidbarkeit“; hier
”
wird versucht, die Trennlinie zu verstehen zwischen Aufgaben, die man mit einem Computer im Prinzip lösen kann und solchen, die man nicht lösen kann. Das berühmteste von
Computern unlösbare Problem, das Halteproblem“, möchte wohl jeder Programmierer
”
gerne gelöst haben: Gegeben ein Computerprogramm P und eine Eingabedatei D, hält
P irgendwann an, wenn ich es mit den Daten aus D als Input füttere? In einem zweiten
Teil ( NP-Vollständigkeit“) geht es um die Grenze zwischen Problemen, die von effizien”
ten, das heißt, schnellen Algorithmen gelöst werden können, und solchen, für die es keine
schnellen Algorithmen gibt.
5
0.2
Zur Arbeitstechnik
Erfahrungsgemäß fällt es vielen Studierenden schwer, sich mit der Arbeits- und Denkweise anzufreunden, die in den beiden Theorie-Vorlesungen erwartet wird. Dabei fällt den
meisten die Arbeit mit der AFS-Vorlesung noch leichter als die BKT-Vorlesung.
Daher folgen hier einige aus der Erfahrung der mit diesen Vorlesungen und zugehörigen
Übungen befassten Lehrpersonen fließende Ratschläge. (Sie klingen vielleicht banal, ihre
Beachtung erhöht aber Ihre Erfolgschancen. Die Ratschläge sind 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ür geeignet,
sie durch reines Zuhören zu verarbeiten. Eigenes Weiterarbeiten ist unabdingbar.
• Arbeiten Sie daher den Stoff jeder Vorlesung zeitnah nach. Material hierfür sind Ihre
eigenen Notizen, das Skript im Web, ergänzendes Material von der Webseite, sowie
weitere Literatur. Veranschlagen Sie hierfür mindestens 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änge innerhalb eines Vorlesungsteils, aber auch über
weitere Abstände. Man muss die relevanten Definitionen und Sachverhalte ( Sätze“)
”
aus den vergangenen Vorlesungen auswendig parat haben, da man sonst die Dinge
nicht verstehen kann, die darauf aufbauen.
• Wir geben alle 14 Tage ein Übungsblatt heraus. Überlegen Sie sich für einige oder
alle Übungsaufgaben Lösungen, die dann mit den in der Übungsstunde angegebenen verglichen werden können. Studierende sind auch eingeladen, selbst Lösungen
vorzutragen. – Minimale Vorbereitung auf die Übung ist das Durchdenken der Aufgaben, damit man weiß, worum es geht. – Auch für die Übungen gilt, dass zeitnahes
Nacharbeiten und Kontrolle des eigenen Verstehens am meisten nützt.
• Stellen Sie Fragen (in oder nach der Vorlesung, in oder nach den Übungen).
• Bereiten Sie sich semesterbegleitend auf die Prüfung vor, die im Februar stattfindet.
• Gegenstand der Prüfung ist der Stoff der Vorlesung und die in den Übungen bearbeiteten Aufgabentypen. Für 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ühere Klausuren auf unseren Webseiten. Das schriftliche Lösen
von Übungsaufgaben und früheren Klausuraufgaben, auch in der Nacharbeit der
Übungen, ist die beste Prüfungsvorbereitung.
6
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/Automaten-und-Formal.afs_ws07.0.html
zu finden ist.
Auf derselben Webseite findet sich auch weiteres Material (Übungsblätter, Links zu früheren Vorlesungen, frühere Klausuren, Kopien von Folien bzw. Präsentationsmaterialien, die
in der Vorlesung benutzt wurden). Das Skript und die Folien gemeinsam definieren den
prüfungsrelevanten Stoff der Vorlesung.
Es wird aber allen Studierenden geraten, auch andere Darstellungen und Bücher zu Rate
zu ziehen. Fast alle Bücher zum Thema decken den Stoff beider Vorlesungen (AFS und
BKT) ab.
Hier einige (bei weitem nicht alle) Bücher zum Stoff der Vorlesungen AFS und BKT:
1. J. E. Hopcroft, R. Motwani, J. D. Ullman: Einführung in die Automatentheorie,
Formale Sprachen und Komplexitätstheorie. Pearson, 2002.
(Klassiker in Neubearbeitung. Übersetzt aus dem Englischen. Sehr ausführlich, viele
Anwendungen und Beispiele, mathematische Details; Übungsaufgaben.)
2. U. Schöning: Theoretische Informatik – kurzgefasst. 4. Auflage. Spektrum Akademischer Verlag, 2001.
(Sehr kompakt, konzentriert sich auf die wesentlichen Techniken. Viele Exemplare
in der Lehrbuchsammlung.)
3. I. Wegener: Theoretische Informatik – eine algorithmenorientierte Einführung. 3.
Auflage. Teubner, 2005.
(Verwandt zur Vorlesung, aber anderer Stil. Beginnt mit BKT-Stoff, dann AFSStoff.)
4. I. Wegener: Kompendium Theoretische Informatik – eine Ideensammlung. Teubner,
1996.
(Ergänzung zur Vorlesung, erläutert Konzepte und übergreifende Ideen.)
5. G. Vossen, K.-U. Witt, Grundkurs Theoretische Informatik, 3. Auflage, Vieweg,
2004.
(Dieses Buch entwickelt die Theorie, legt aber auch großen Wert auf die Darstellung
von Anwendungsbeispielen.)
6. A. Asteroth, C.Baier: Theoretische Informatik – Eine Einführung in Berechenbarkeit, Komplexität und formale Sprachen mit 101 Beispielen. Pearson Studium, 2002.
(Theoretische Informatik, wie sie an der Universität Bonn gelehrt wird. Viele Beispiele, aber mathematisch genaue Entwicklung.)
7
7. D. C. Kozen: Automata and Computability. Springer, 1997.
(Amerikanische Version des Themas.)
8. K. W. Wagner: Theoretische Informatik – Eine kompakte Einführung. 2. Auflage.
Springer, 2003.
(Theoretische Informatik, wie sie an der Universität Würzburg gelehrt wird. Deutlich mehr Gewicht auf der Berechenbarkeitstheorie mit Maschinenmodellen.)
9. N. Blum: Einführung in Formale Sprachen, Berechenbarkeit, Informations- und
Lerntheorie. Oldenbourg, 2007.
(Kombination des Stoffs der Vorlesung mit einer Einführung in das Gebiet der Informationstheorie, exakte Durchführung 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ät Zürich, Skript und Automaten zum
”
Selberbasteln. http://www.ifi.unizh.ch/cl/broder/jflap
Weiterfü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č: 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: Übersetzerbau – Theorie, Konstruktion, Generierung. Springer, 1997.
8
Kapitel 1
Grundbegriffe
1.1
Alphabete und Sprachen
1.1.1 Vereinbarung N bezeichnet die Menge {0, 1, 2, 3, . . .} der natürlichen Zahlen.
Für die Menge {1, 2, 3, . . .} der positiven natürlichen Zahlen schreiben wir N+ .
1.1.2 Definition Für 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ür i ≥ 0} die Menge der unendlichen
Folgen in X.)
1.1.3 Beispiel
Wir können endliche Tupel aus natürlichen Zahlen betrachten: Die
Menge Seq(N) enthält ( ) (die leere Folge mit Länge 0), (0), (1), . . ., (0, 0), (0, 1), (0, 2),
. . ., (1, 0), (1, 1), (1, 2), . . ., (3, 4, 4, 2), . . ..
In höheren 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är kodieren. Auch wir werden uns meist auf den Standpunkt stellen, dass Maschinen nur Zeichenreihen mit Zeichen
aus einem endlichen Zeichensatz bearbeiten können. Im Anhang Zahldarstellungen und
”
Abzählungen“ (A.1) werden die Prinzipien des Umrechnens von Zahlen in Zeichenreihen
und umgekehrt besprochen. An dieser Stelle geben wir einige allgemeine Grundkonzepte
für solche Zeichenreihen (synonym: Wörter, Strings, Zeichenketten) an.
9
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ür beliebige Buchstaben“
”
verwendet.
1.1.5 Beispiel
(a) Die Menge {1} oder {|} heißt das unäre Alphabet. Die Menge Σ = {0, 1} heißt das
binäre Alphabet. Die Menge {0, 1, #} ist das binäre 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ürlichen“ Buch”
staben, Ziffern, und Symbolen (d. h. eines gewissen Alphabets) in {0, 1}7 an. Diese
Darstellung wird dann durch eine führende Null zu einem Byte ergänzt. 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. Hinzu kommen eine Reihe von Sonderzeichen wie die Satzzeichen und der Zwischenraum.
(d) Natürlich sind Alphabete Σ und Σ′ gleichwertig“, wenn |Σ| = |Σ′ | gilt, es also eine
”
bijektive Abbildung von Σ nach Σ′ 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ür 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öglich ist1 . Eine solche Folge w nennen wir ein Wort über Σ (synonym:
Zeichenreihe, Zeichenkette oder String über Σ). Die Länge von w, bezeichnet mit
|w|, ist n. Offenbar gibt es genau |Σ|n Wörter der Länge n über Σ. Die Menge aller Wörter
über Σ wird folgendermaßen bezeichnet:
[
Σ∗ := {Σn | n ∈ N}.
Natürlich ist Σ∗ = Seq(Σ). Ein besonderes Wort ist ε, das leere Wort, das einzige Wort
der Länge 0 über Σ. Formal: ε = ( ), die leere Folge.
1
Sind die Buchstaben in Σ selbst Wörter, muss man natürlich 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ändnisse gegebenenfalls durch
Einschließen in Anführungszeichen “(”, “)”, “,” oder dergleichen.
10
Beachte: Σ0 = {ε}, Σ1 =“ Σ. (Man identifiziert das 1-Tupel (a) mit dem Objekt a und
”
erhält Σ1 = {(b) | b ∈ Σ} =“ Σ.) Mit dieser Vereinbarung ist dann stets Σ ⊆ Σ∗ .
”
Die Menge aller nichtleeren Wörter ü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äre Darstellung
k−mal
für die natürlichen Zahlen.)
(b) Σ = {0, 1} : Dann ist Σ∗ = {ε, 0, 1, 00, 01, 10, 11, 000, 001, . . .}, die Menge aller Binärwörter.
(c) Ein ASCII-File ist ein Wort über Σ = {0, 1}8 . Man beachte dabei, dass bei der rechnerinternen Darstellung die unsichtbaren Leerzeichen als Buchstabe ( space“) gelten
”
und Zeilenumbrüche durch Steuerzeichen markiert werden, die selbst Buchstabe im
ASCII-Alphabet sind.
1.1.8 Definition Sind u = (a1 , . . . , an ) und v = (b1 , . . . , bm ) Wörter (über einem Alphabet Σ), so heißt u ◦ v := (a1 , . . . , an , b1 , . . . , bm ) (ein Wort der Länge n + m) die Konkatenation oder Hintereinanderschaltung von u und v. Kurz: a1 · · · an ◦ b1 · · · bm =
a1 · · · an b1 · · · bm . Manchmal findet man auch die Notation u · v für diese Operation. Normalerweise lässt man das Operationszeichen weg und schreibt uv statt u ◦ v.
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ät: (uv)w = u(vw) für alle u, v, w ∈ Σ∗ .
(ii) Neutrales Element: εu = uε = u für alle u ∈ Σ∗ .
11
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ür (00 ◦ 01) ◦ 101 oder 00 ◦ (01 ◦ 101).
1.1.12 Definition
Für ein Wort w = a1 · · · an ∈ Σ∗ und einen Buchstaben a ∈ Σ sei
|w|a := die Häufigkeit 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 ähnliche 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ür i ≥ 1.
Da Σ ⊆ Σ∗ , ist damit auch ai für Buchstaben a ∈ Σ erklärt. Informal: ai = a
· · a} , für
| ·{z
i−mal
i ≥ 0. Man beachte die Gleichheiten a0 = ε und a1 = a, sowie εi = ε für beliebiges i ≥ 0.
Wir vereinbaren folgende Prioritätsregel beim Zusammentreffen von Konkatenation und
Potenzierung: Potenzieren bindet stärker 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örter über Σ. Dann heißt u ein




Teilwort


 ∃v1 , v2 ∈ Σ∗ : w = v1 uv2 
Präfix oder Anfangsstück
∃v ∈ Σ∗ : w = uv
von w, falls
.




∗
Suffix oder Endstück
∃v ∈ Σ : w = vu
Beachte: Wenn u ein Präfix (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äfixe und n + 1 Suffixe hat, unter denen sich jeweils auch w selbst und ε befinden.
12
1.1.15 Beispiel 0000 ist Teilwort von 010000011, aber weder Präfix noch Suffix. 0000
ist Präfix 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 ü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 Vorlesung Berechenbarkeit und
”
”
Komplexitätstheorie“ im Vordergrund stehen), hier aber zunächst als Gegenstände der
Theorie der formalen Sprachen.
Charakteristisch am Umgang mit Sprachen in der Informatik ist, dass die dort vorkommenden Sprachen meist unendlich viele Wörter 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örter dazu
gehören und welche nicht. In dieser Vorlesung werden viele solche Beschreibungsmethoden angegeben und der Umgang mit ihnen geübt. Wir werden als Beschreibungsform
(Spezifikation) von Sprachen hauptsächlich Grammatiken betrachten, aber auch Maschinenmodelle untersuchen, die die Analyse von vorgelegten Wörtern durchführen können,
im Hinblick darauf, ob sie zu einer Sprache gehören oder nicht.
Wenn L eine Sprache über Σ ist, so gehört zu L in ganz natürlicher Weise ein Entscheidungsproblem, nämlich:
Wortproblem für L: Eingabe: w ∈ Σ∗ . Ausgabe: JA, falls w ∈ L, NEIN sonst.
Umgekehrt kann man normalerweise Entscheidungsprobleme als Wortprobleme über passenden Sprachen formulieren. Dieser Zusammenhang wird aber erst in der Vorlesung BKT
wichtig werden.
1.1.17 Beispiel
(a) L∅ = ∅ heißt die leere Sprache; Lε = {ε} ist die Sprache, die nur das leere Wort
enthält. L∅ und Lε sind Sprachen über Σ für jedes Alphabet Σ. Für jedes beliebige
13
Alphabet Σ ist Σ ⊆ Σ∗ , also ist die Menge Σ eine Sprache; für n ∈ N beliebig ist Σn
eine Sprache, Σ∗ ist Sprache über Σ. Für a ∈ Σ ist {an | n ∈ N} Sprache über Σ.
(b) Sei Σ = {0, 1} das binäre Alphabet. Dann ist Σ+ = die Sprache aller nichtleeren Bitstrings; Σ8 ist die Sprache, die genau die 256 verschiedenen Bytes enthält; Σ32 ist die
Sprache, die alle 32-Bit-Wörter
Einem Binärwort w = bk−1 · · · b0 ∈ Σk entPk−1 enthält.
i
spricht die Zahl (w)2 = i=0 bi 2 (Umrechnung von Binärdarstellung in natürliche
Zahl). Ist i ∈ N, so heißt ein Wort w mit |w| ≥ 1 und (w)2 = i eine Binärdarstellung von i. Das kürzeste solche Wort w (außer für (0)2 = 0 hat das Wort w als
erstes Zeichen eine 1) heißt oft die“ Binärdarstellung von i und wird mit bin(i)
”
bezeichnet.
Für i ∈ N nennen wir 1i die Unärdarstellung von i. Offenbar ist die Abbildung
N ∋ i 7→ 1i ∈ {1}∗
eine Bijektion. Eine (recht natürliche) Bijektion N ↔ {1, 2}∗ wird in Abschnitt A.1.2
im Anhang vorgestellt.
(c) Man kann nun mathematische und andere Probleme als Wortprobleme ü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ühmtes offenes Problem der Zahlentheorie, herauszufinden, ob es
unendlich viele solche Paare gibt. LPrimzahlzwillinge ist eine Sprache über dem Alphabet
{0, 1, #}. Das Problem Gibt es unendlich viele Primzahlzwillinge?“ lässt sich dann
”
schreiben als die Frage Ist LPrimzahlzwillinge unendlich?“
”
Wenn Σ ⊆ Σ′ ist, so ist selbstverständlich jede Sprache über Σ automatisch auch Sprache
über Σ′ . Wir werden dies im folgenden oft stillschweigend benutzen. Insbesondere kann
man bei beliebigen Sprachen L1 (über Σ1 ) und L2 (über Σ2 ) immer annehmen, dass
dasselbe Alphabet zugrundeliegt: man wählt einfach Σ = Σ1 ∪ Σ2 .
1.1.18 Bemerkung Die Gesamtheit aller Sprachen über Σ riesig, nämlich überabzählbar unendlich. (Dies gilt für jedes Alphabet Σ, selbst wenn Σ = {0} ist, also Σ nur ein
Element hat.) Daher werden wir nur sehr wenige Sprachen überhaupt zu sehen bekommen.
Behauptung: Für jedes Alphabet Σ ist LΣ = {L | L ⊆ Σ∗ } eine überabzählbare Menge.
Wir bemerken zunächst, dass aus Korollar A.1.12 im Anhang folgt, dass wir die Elemente
von Σ∗ aufzählen können:
Σ∗ = {w0 , w1 , w2 , w3 , . . . }.
14
Die Mengen {w0 }, {w1 }, {w2 }, . . . sind Elemente von LΣ , also ist diese Menge sicher
unendlich.
Nun sei L0 , L1 , L2 , . . . irgendeine Aufzählung von (einigen) Elementen von LΣ . Wir definieren
L× := {wi | wi ∈
/ Li }.
Es ist klar, dass L× eine Teilmenge von Σ∗ ist, also eine Sprache. Kann L in der Folge
L0 , L1 , L2 , . . . vorkommen? Nun, für jedes j ∈ N gilt: wj ∈ Lj ⇔ wj ∈
/ L× , also Lj 6= L× .
Daher kommt L nicht in L0 , L1 , L2 , . . . vor. Das bedeutet, dass keine Aufzählung ganz LΣ
erfassen kann, also kann LΣ nicht abzählbar sein.
1.1.19 Definition
(a) Sind L1 und L2 Sprachen, so heißt
L1 ◦ L2 := {w1 w2 | w1 ∈ L1 , w2 ∈ L2 }
(auch L1 · L2 oder L1 L2 )
die Konkatenation von L1 und L2 .
Beispiele:
{0}∗ {1}∗ = {0i 1j | i, j ≥ 0},
{0} ∪ {1}{0, 1}∗ = Lbin .
Beachte: Die Konkatenation ist assoziativ, d. h. für beliebige Sprachen L1 , L2 , L3 gilt
(i) (L1 L2 )L3 = L1 (L2 L3 ).
Weiter gilt
(ii) Lε L = LLε = L für jede Sprache L.
(Damit ist für jedes Alphabet Σ die Menge {L | L ⊆ Σ∗ , L 6= ∅} der nichtleeren
Sprachen über Σ ein Monoid mit neutralem Element Lε .) Andererseits ist L∅ ein
auslöschendes Element, denn es gilt
L∅ L = LL∅ = L∅ = ∅ für jede Sprache L.
Beweis von (i): Wenn w ∈ (L1 L2 )L3 , dann ist w = w′ w3 für ein w′ ∈ L1 L2 und
w3 ∈ L3 . Weiter ist dann w′ = w1 w2 für ein w1 ∈ L1 und ein w2 ∈ L2 . Damit
ist w2 w2 ∈ L2 L3 , also w = w1 (w2 w3 ) ∈ L1 (L2 L3 ). Insgesamt haben wir gezeigt:
(L1 L2 )L3 ⊆ L1 (L2 L3 ). Die umgekehrte Richtung zeigt man ähnlich.
Beweis von (ii): Wenn w ∈ Lε L, dann ist w = ε ◦ w′ für ein w′ ∈ L. Da ε neutrales
Element ist, folgt w = w′ , also w ∈ L. – Wenn umgekehrt w ∈ L ist, dann ist
w = ε ◦ w ∈ Lε L.
15
(b) Ist L Sprache, so definieren wir:
Li := {w1 w2 · · · wi | w1 , . . . , wi ∈ L}, für i ≥ 0.
Formal definieren wir induktiv:
L0 := Lε ;
Li := LLi−1 für i ≥ 1.
Man beachte, dass {wi | w ∈ L} ⊆ Li ist, dass aber gewöhnlich 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ält die Wörter w der Form w = w1 · · · wi , i ≥ 0, wobei w1 , . . . , wi ∈
L; L+ enthält die Wörter w = w1 · · · wi , i ≥ 1, wobei w1 , . . . , wi ∈ L sind. Zur Übung
überlege man, dass L+ = LL∗ = L∗ L ist.
Man beachte den Unterschied zwischen L∗ und {wi | w ∈ L, i ≥ 0}. Für 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ürlich auch alle Mengenoperationen zu, insbesondere folgende: Sind L1 , L2 Sprachen, so auch die Vereinigung L1 ∪ L2 und der Durchschnitt
L1 ∩ L2 .
Ist L Sprache über Σ, kann man auch das Komplement L = Σ∗ − L betrachten.
L∅ ist neutrales Element bezüglich Vereinigung: L ∪ L∅ = L∅ ∪ L = L.
Für Sprachen über Σ ist Σ∗ neutrales Element bezüglich Durchschnitt: L ∩ Σ∗ =
Σ∗ ∩ L = L.
1.1.20 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 }.
16
Sprechweise: Oft betrachtet man die Gesamtheit aller Sprachen mit einer gewissen Eigenschaft. Dann sprechen wir gewöhnlich von einer Klasse von Sprachen (nicht von einer
Menge). Beispiele hierfür: Die Klasse aller Sprachen“, die Klasse der unendlichen Spra”
”
chen“, die Klasse der Sprachen über einem einelementigen Alphabet“, die Klasse der
”
”
regulären Sprachen“. Für Mathematikfans und Puristen sei kurz der Hintergrund erklärt:
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ür Gesamtheiten, die man definieren
kann, die aber keine Mengen darstellen, benutzt man in der Mengenlehre die Bezeichnung
(echte) Klasse“. Für den Gebrauch in dieser Vorlesung macht diese Feinheit aber kei”
nen Unterschied. Die Bemerkung in Beispiel 1.1.5(d) zeigt, dass man sich immer auf ein
Normalalphabet“ {b1 , . . . , bk } zurückziehen kann.
”
17
Kapitel 2
Endliche Automaten und reguläre
Sprachen
Die regulären 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äre Ausdrücke“ und reguläre Grammatiken“). Wir wollen uns
”
”
anhand der regulären Sprachen exemplarisch die Übergänge zwischen verschiedenen Beschreibungsformen für dieselbe Sprache klarmachen, und für diese Übergänge soweit wie
möglich effiziente Algorithmen bereitstellen. Zudem wird sich zeigen, dass man für jede
reguläre Sprache algorithmisch einen effizientesten“ Automaten konstruieren kann.
”
Ebenso wichtig wie das Konzept der regulären 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ür die regulären Sprachen grundlegende Maschinenmodell: die deterministischen endlichen Automaten ( deterministic fi”
nite automata“, abgekürzt DFA“). Diese Automaten erhalten ein Eingabewort x =
”
b1 · · · bm ∈ Σ∗ (für ein Alphabet Σ) vorgelegt, das einmal von links nach rechts gelesen
wird. Endliche Automaten haben eine Steuereinheit (engl. finite control), die eine endliche
Speicherkapazität repräsentiert und abstrakt durch eine endliche Menge Q von Zuständen
gegeben ist. Einer der Zustände 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 jedem Schritt in Abhängigkeit vom alten Zustand pt−1 und dem
1
Im Gegensatz zur dortigen Darstellung ist es für unsere Zwecke nicht wichtig, ob die Eingabezeichen
und die Zustände binär oder anders dargestellt werden.
18
gerade gelesenen Buchstaben at in einen Zustand pt über, für t = 1, 2, . . . , m. Welcher
Zustand jeweils anzunehmen ist, wird von einer Übergangsfunktion δ : Q × Σ → Q vorgeschrieben (δ(q, a) = q ′ bedeutet: wird in Zustand q der Buchstabe a gelesen, so ist der
neue Zustand q ′ ). 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ände) benutzt.
”
Hinter dem Modell des deterministischen endlichen Automaten steht das etwas allgemeinere Konzept eines finite state system“: ein System mit endlich vielen Zuständen
”
(Menge Q), das mit einer Folge von Signalen“ aus einem endlichen Vorrat Σ von Signa”
len gefüttert wird und auf jedes Signal mit dem Übergang in einen durch alten Zustand
und Signal eindeutig bestimmten nächsten Zustand reagiert. Wenn man noch einen Startzustand q0 spezifiziert ( Reset-Zustand“), so bestimmt jede Signalfolge (b1 , . . . , bm ) ∈ Σ∗
”
eine Folge von Zuständen, die das System durchläuft. Dieses Modell lässt 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).
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ände p0 , . . . , pm wird als (gerichteter) Weg dargestellt,
wobei natürlich Wiederholungen möglich sind. Die Kante vom Knoten pt−1 zum Knoten
pt ist mit bt markiert.
Wir geben nun eine präzise 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änden;
”
• einer Übergangsfunktion“ δ : Q × Σ → Q.
”
(Formal schreibt man M = (Q, Σ, q0 , F, δ).)
19
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ührenden 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öglichen 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ände 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ährt,
i
0
1
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 überzeugt sich
leicht
P (perInduktion ü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örter akzeptiert, die Zahlen darstellen, die
nicht durch 3 teilbar sind.
20
2.1.3 Bemerkung
Automaten an.
Wir geben verschiedene nützliche Darstellungsweisen für endliche
(a) Tabellenform:
Man hat die Mengen Q und Σ durch Auflistungen gegeben, ebenso F ; weiter ein Element
q0 ∈ Q. Die Übergangsfunktion δ ist als Tabelle (|Q| × |Σ|-Matrix) gegeben: Der Eintrag
am Schnittpunkt der Zeile für q ∈ Q mit der Spalte für a ∈ Σ ist δ(q, a) ∈ Q. Als Beispiel
betrachte man Tabelle 2.1.
Diese Form ist besonders gut zur Ausführung der Berechnungen von DFA’s und zur Manipulation von DFA’s auf Rechnern geeignet. Die dazu benötigten Datenstrukturen möge
man sich selbst zurechtlegen. (Arrays für Σ und Q, ein Bitvektor für F , ein Index für q0 ,
ein zweidimensionales Array mit Einträgen aus Q für δ. 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 (b1 , . . . , bm ) von 30-Bit-Zahlen
aufaddiert werden soll (modulo 232 ). Der Zustand ist der Inhalt des Registers, ein EingabeBuchstabe“ ist ein 30-Bit-String. Also ist Q = {0, 1}32 und Σ = {0, 1}30 . Die Tabelle
”
hätte Größe 262 ≈ 4,6 · 1018 . Man schreibt aber einfach:
δ(q, a) = die Binärdarstellung (mit 32 Bits) von ((q)2 + (a)2 ) mod 232 ,
für q ∈ Q und a ∈ Σ; damit erübrigt sich das Berechnen und Speichern der Tabelle. Der
Startzustand q0 ist eventuell das Wort 032 ; wie die Menge F zu wählen ist, hängt 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äuft
eine mit a markierte Kante von vq nach vq′ genau dann wenn δ(q, a) = q ′ . 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.
21
d
q
a
q’
q
b
a
a
q’
q
c
b
Einfachkante
Schleife
d
δ(q,a)=q’
δ(q,a)=δ (q,c)=q
Mehrfachkante
δ(q,a)=δ(q,b)=δ(q,d)=q’
Abbildung 2.2: Graphische Darstellung eines DFA
Eine Tabelle für δ 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ür einen akzeptierenden Zustand (rechts)
Bei der graphischen Darstellung vermeiden wir Mehrfachkanten von vq nach vq′ dadurch,
dass wir nur eine Kante angeben und diese mit den Elementen der Menge {a ∈ Σ |
δ(q, a) = q ′ } bzw. einer Abkürzung für 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önnen. 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
22
Die akzeptierende Berechnung von M auf der Eingabe x = 12211112 wird wie folgt
dargestellt:
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örter 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ährend der Verabeitung eines Eingabewortes einmal
”
dieser Zustand erreicht, kann er nie mehr verlassen werden, und der Automat wird garantiert verwerfen. Mitunter lässt man in der graphischen Darstellung von DFA’s solche
Fehlerzustände und die in sie hineinführenden Kanten weg. Das sieht dann so aus:
Start
0
B
1
Σ
Abbildung 2.7: DFA aus Abb. 2.6, Fehlerzustand weggelassen
23
Wenn beim Lesen eines Wortes w versucht wird, eine nicht vorhandene Kante zu benutzen,
ist man schon sicher, dass w nicht akzeptiert wird.
Wir wenden uns nun der mathematischen Definition der zu einem DFA M gehörenden
Sprache zu. Man definiert, in welchen Zustand M gerät, 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 über die Länge m eines Wortes w =
b1 · · · bm :
δ̂(q, ε) := q, für q ∈ Q.;
δ̂(q, b1 · · · bm ) := δ(δ̂(q, b1 · · · bm−1 ), bm ), für q ∈ Q, m ≥ 1, b1 , . . . , bm ∈ Σ.
(Kurz: δ̂(q, ε) = q, für q ∈ Q; δ̂(q, ua) = δ(δ̂(q, u), a), für q ∈ Q und u ∈ Σ∗ , a ∈ Σ.)
(b) Für w ∈ Σ∗ definieren wir: M akzeptiert w, falls δ̂(q0 , w) ∈ F .
(c) LM := {w ∈ Σ∗ | M akzeptiert w}.
Wenn L = LM , sagt man auch: M akzeptiert L“, als Abkürzung für M akzeptiert
”
”
die Wörter in L und nur diese“. Umgekehrt heißt L die von M akzeptierte
”
Sprache“.
(d) Eine Sprache L heißt regulär , falls es einen DFA M mit L = LM gibt.
(Die Herkunft der Bezeichnung regulär“ wird in Abschnitt 2.3 geklärt.)
”
Für q ∈ Q, a ∈ Σ gilt nach den Definitionen: δ̂(q, a) = δ̂(q, εa) = δ(δ̂(q, ε), a) = δ(q, a).
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 ′ gilt genau dann, wenn man in vq startend und dann den von w = b1 · · · bm
vorgeschriebenen Kanten folgend den Knoten vq′ erreicht.
Wir notieren einfache Eigenschaften, die die Aneinanderreihung von Teilrechnungen betreffen.
2.1.6 Bemerkung
(a) Sind w, w′ ∈ Σ∗ , q ∈ Q, so ist δ(q, ww′ ) = δ(δ(q, w), w′ ).
(b) Sind w1 , w2 , ∈ Σ∗ , q ∈ Q mit δ(q, w1 ) = δ(q, w2 ), so ist δ(q, w1 w′ ) = δ(q, w2 w′ ) für
alle w′ ∈ Σ∗ .
24
Beweis (a) Diese Aussage sollte intuitiv klar sein. Wir geben den Beweis als Beispiel
für einen einfachen Beweis durch Induktion über die Länge von Wörtern“ an.
”
Induktion über |w′ |:
I. A.: Ist |w′ | = 0, also w′ = ε, so ist δ(q, ww′ ) = δ(q, w) = δ(δ(q, w), ε) nach Definition 2.1.5(a).
I. S.: Ist |w′ | ≥ 1, also w′ = ua für u ∈ Σ∗ , a ∈ Σ, so gilt:
2.1.5(a)
I.V.
δ(q, ww′ ) = δ(q, wua) = δ(δ(q, wu), a) = δ(δ(δ(q, w), u), a)
= δ(δ(q, w), ua) = δ(δ(q, w), w′ ).
(a)
2.1.5(a)
=
(a)
Vor.
(b) δ(q, w1 w′ ) = δ(δ(q, w1 ), w′ ) = δ(δ(q, w2 ), w′ ) = δ̂(q, w2 w′ ).
Bemerkung 2.1.6 kann man informal so ausdrücken: Alles, was ein DFA nach dem Lesen
eines Präfixes 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ösen kann.
2.1.7 Beispiel
die Sprache
( Kein endlicher Automat kann beliebig weit zählen“.) Wir betrachten
”
L := {x ∈ {0, 1}∗ | |x|0 = |x|1 },
die aus allen Binärwörtern besteht, die genau gleich viele Nullen und Einsen haben. (Zum
Beispiel ist 01100011 ∈ L, nicht aber 00011100.) Wir behaupten: L ist nicht regulär. Der
Beweis ist indirekt. Angenommen, es gilt L = LM für einen DFA M = (Q, Σ, q0 , F, δ).
Weil Q endlich ist, können die Zustände δ(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ünschte Widerspruch.
2.1.8 Bemerkung
Zwischen Definition 2.1.5 und der graphischen Darstellung GM
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ört ein eindeutig bestimmter Weg der Länge m, der in vq startet und
dessen Kanten mit b1 , . . . , bm markiert sind. Offenbar gilt δ(q, b1 · · · bm ) = q ′ genau dann,
wenn dieser Weg in vq′ endet. (Z. B. haben wir in Abbildung 2.5 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änge 0
entspricht. Der Fall q = q0 führt 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 Übung interpretiere man Bemerkung 2.1.6(a) in der Sichtweise der Graphen. (Es
werden Wege aneinandergehängt.)
25
Wir wollen einige einfache Eigenschaften der Klasse der regulären Sprachen notieren.
Vorher stellen wir ein Lemma bereit, das besagt, dass man bei einer regulären Sprache
L das Alphabet des zugehörigen Automaten beliebig wählen kann, solange das Alphabet
alle Buchstaben enthält, die in Wörtern von L vorkommen. Beispiel : Die Sprache {02i |
i ∈ N} = {ε, 00, 0000, 000000, . . .} der Strichlisten gerader Länge ist Sprache über dem
Alphabet {0}, aber auch Sprache über den Alphabeten {0, 1} und {0, 1, . . . , 9} usw.
2.1.9 Lemma
Wenn L reguläre Sprache ist und L ⊆ Σ∗ , dann existiert ein DFA
M = (Q, Σ, q0 , F, δ) mit L = LM .
Beweis Weil L regulär ist, existiert nach Definition 2.1.5(d) ein DFA M ′ = (Q′ , Σ′ , q0′ , F ′ , δ ′ )
mit L = LM ′ . (Das Problem ist, dass Σ 6= Σ′ sein kann, und auf den ersten Blick kein
DFA für L mit Alphabet Σ in Sicht ist. Man stelle sich vor, Σ = {0, 1}, L ⊆ {0}∗ , und wir
haben einen DFA für L mit Alphabet Σ′ = {0, a, b}.) Wir bauen M ′ wie folgt zu einem
neuen DFA M um: Buchstaben aus Σ′ − Σ werden nicht berücksichtigt (sie kommen in
Wörtern aus L auf keinen Fall vor). Buchstaben aus Σ − Σ′ werden gelesen, führen aber
sofort in einen Fehlerzustand, denn auch sie kommen in Wörtern aus L nicht vor. Formal
setzen wir:
Q
q0
F
δ(q, a)
δ(q, a)
δ(qFEHLER , a)
=
=
=
=
=
=
Q′ ∪ {qFEHLER }, für einen neuen Zustand qFEHLER ,
q0′ ,
F ′,
δ ′ (q, a), wenn q ∈ Q′ , a ∈ Σ ∩ Σ′ ;
qFEHLER , wenn q ∈ Q′ , a ∈ Σ − Σ′ ;
qFEHLER für alle q ∈ Q.
In der Graphendarstellung sieht die Änderung so aus: Aus GM ′ werden alle Kanten weggelassen, die mit a ∈ Σ′ − Σ beschriftet sind. Sodann wird ein neuer Knoten für den (verwerfenden) Fehlerzustand qFEHLER hinzugefügt; aus allen ursprünglichen Knoten führen
Kanten, die mit a ∈ Σ − Σ′ beschriftet sind, in diesen Fehlerknoten.
Es ist leicht zu sehen, dass folgendes gilt: Für w ∈ (Σ∩Σ′ )∗ ist δ(q0 , w) = δ ′ (q0′ , w), also ist
w ∈ LM genau dann wenn w ∈ LM ′ = L. (Formal beweist man das durch Induktion über
die Länge von w.) Für w ∈ Σ∗ , die mindestens einen Buchstaben aus Σ − Σ′ enthalten,
ist δ(q0 , w) = qFEHLER , also w 6∈ LM . Daraus folgt LM = L.
2.1.10 Satz
(a) Die Sprache L∅ = ∅ ist regulär.
(b) Ist Σ ein Alphabet und w ∈ Σ∗ , so ist {w} regulär. (Insbesondere sind also {ε} und
{a} für a ∈ Σ regulär.)
26
(c) Sind L1 und L2 reguläre Sprachen, so sind auch L1 ∪ L2 und L1 ∩ L2 regulär.
(d) Alle endlichen Sprachen sind regulär.
(e) Ist L ⊆ Σ∗ eine reguläre Sprache, so ist auch L = Σ∗ − L regulär.
Beweis
(a) Der DFA
Start
Σ
0
(für ein beliebiges Alphabet Σ) akzeptiert ∅. (Zur Übung 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 }
...
Σ
qFEHLER
Σ
die Sprache {w}.
(Übung: Wie sieht die Tabelle für δ aus?)
Man beachte die folgenden Spezialfälle: Für w = ε fallen die Zustände 0 und n
zusammen, d. h. der DFA hat nur zwei Zustände 0 und qFEHLER . Dabei ist δ(0, a) =
qFEHLER für alle a ∈ Σ, und F = {0}. Für w = a ∈ Σ hat der DFA drei Zustände 0,
1 und qFEHLER . (Was ist δ und F ?)
(c) Wähle 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ände vor, die aus einem M1 -Zustand und einem M2 -Zustand bestehen.
27
Aus offensichtlichen Gründen heißt die folgende Konstruktion Kreuzproduktkonstruktion. Definiere
Q := Q1 × Q2 ,
(1) (2)
q0 := (q0 , q0 ),
δ((q (1) , q (2) ), a) := δ1 (q (1) , a), δ2 (q (2) , a) , für q (1) ∈ Q1 , q (2) ∈ Q2 , a ∈ Σ.
Man zeigt dann durch Induktion über |w| :
(1)
(2)
δ(q0 , w) = (δ1 (q0 , w), δ2 (q0 , w)) ∈ Q, für alle w ∈ Σ.
Wenn wir also definieren:
F ′ := {(q (1) , q (2) ) ∈ Q | q (1) ∈ F1 und q (2) ∈ F2 },
F ′′ := {(q (1) , q (2) ) ∈ Q | q (1) ∈ F1 oder q (2) ∈ F2 },
so sehen wir (nach Definition 2.1.5), dass M ′ = (Q, Σ, q0 , F ′ , δ) ein DFA für L1 ∩ L2
und M ′′ = (Q, Σ, q0 , F ′′ , δ) ein DFA für L1 ∪ L2 ist.
Analog kann man DFA’s für andere Boolesche Kombinationen wie L1 − L2 oder
L1 ⊕ L2 = (L1 − L2 ) ∪ (L2 − L1 ) konstruieren.
(Man überlege zur Übung, wie der Graph GM ′ bzw. GM ′′ aussieht. Tipp: Trage die
Knoten von GM ′ in ein Gitter ein, dessen Zeilen mit q (1) ∈ Q1 und dessen Spalten mit
q (2) ∈ Q2 beschriftet sind. Der Knoten für Zustand (q (1) , q (2) ) sitzt am Schnittpunkt
von Zeile q (1) und Spalte q (2) .)
(d) Um einen DFA für die Sprache L := {w1 , . . . , wm } zu erhalten, definiere L0 := ∅
und Li := {w1 , . . . , wi }. Ein DFA für Li entsteht aus dem für Li−1 und dem für
{wi } (gemäß (b)) durch Anwendung der Konstruktion aus (c). Die Behauptung
folgt durch vollständige Induktion.
Alternativ betrachte man die folgende direkte Konstruktion, die i. a. deutlich weniger Zustände benötigt. 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äfix eines Wortes aus L sind, kann der DFA in
einen Fehlerzustand gehen. Nach kurzer Überlegung sieht man, dass man als Zustandsmenge einfach die Menge aller Präfixe der Wörter in L und einen zusätzlichen
Fehlerzustand nehmen kann.
Q
q0
F
δ(u, a)
δ(u, a)
δ(qFEHLER , a)
:=
:=
:=
:=
:=
:=
{u ∈ Σ∗ | u ist Präfix 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ür alle a ∈ Σ.
28
(Ein Beispiel für diese Konstruktion findet sich in Beispiel 2.1.11(c).) Man kann nun
durch Induktion über |w| zeigen, dass δ(q0 , w) = w ist, falls w Präfix eines Wortes
in L ist und δ(q0 , w) = qFEHLER sonst. Daraus folgt nach der Definition von F , dass
M genau die Wörter in L akzeptiert.
(e) Nach Lemma 2.1.9 ist es möglich, einen DFA M = (Q, Σ, q0 , F, δ) mit L = LM zu
wählen. Dann definiere F ′ := Q − F und M ′ := (Q, Σ, q0 , F ′ , δ), d. h. M ′ entsteht
aus M durch Vertauschen von akzeptierenden und nicht akzeptierenden Zuständen.
Es ist klar, dass L = Σ∗ − L = LM ′ , da für w ∈ Σ∗ gilt:
w ∈ L ⇔ w 6∈ L ⇔ δ(q0 , w) 6∈ F ⇔ δ(q0 , w) ∈ F ′ .
Beachte: Für diese Konstruktion ist es nötig, dass δ eine Funktion ist. Die nichtdeterministischen endlichen Automaten des nächsten 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är: Offenbar ist L0 = LM0 für folgenden DFA M0 :
1
0
Start
1
0
1
0
Vertauschen wir bei den Kantenmarkierungen 0 und 1, erhalten wir einen DFA M1
für die Sprache L1 . Setzen wir in M0 F ′ = {0, 1} − F = {1}, so erhalten wir einen
DFA M0′ für die Sprache L0 = {x ∈ {0, 1}∗ | |x|0 ungerade}.
(b) Die mit dem Verfahren von Satz 2.1.10(c) konstruierten Automaten für 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
29
Gezeichnet ist ein Automat für L0 ∩ L1 . Automaten für die anderen Sprachen erhält
man durch Variieren der Menge der Endzustände. Z. B. entspricht F = {(0, 0), (0, 1),
(1, 0)} der Sprache L0 ∪ L1 , und F = {(1, 1)} der Sprache L0 ∪ L1 .
(c) Der mit dem Verfahren von Satz 2.1.10(d) konstruierte Automat für die endliche
Sprache L = {bei, beine, bube} (Präfixautomat) sieht folgendermaßen aus. Dabei
ist der Fehlerzustand mit ∅“ markiert.
”
be
i
bei
n
bein
e
beine
e
Start
ε
b
b
u
b
bu
bub
e
bube
0/
2.1.1
Endliche Automaten mit Ausgabe
Für die Modellierung von Aufgaben sind auch endliche Automaten wichtig, die über das
Akzeptieren/Verwerfen hinaus andere Ausgabesignale erzeugen. Beispiele hierfür wurden
auch in der Veranstaltung Rechnerorganisation“ besprochen. Wir skizzieren hier, wie
”
eine solche Zusatzanforderung in unseren formalen Rahmen passt. Hierfür skizzieren wir
Mealy-Automaten, bei denen die Ausgabe ein beliebiges (auch leeres) Wort sein kann,
das vom gegenwärtigen Zustand und vom gelesenen Zeichen abhängt.
Ein Mealy-Automat ist ein 6-Tupel M = (Q, Σ, Γ, q0 , δ, λ), wobei
• Q die endliche, nichtleere Zustandsmenge ist,
• Σ das Alphabet der Eingangssignale/-symbole,
• Γ das Alphabet der Ausgabesignale/-symbole,
• q0 ∈ Q der Startzustand,
• δ : Q × Σ → Q die Übergangsfunktion, und
• (NEU) λ : Q × Σ → Γ∗ die Ausgabefunktion
30
ist.
Ein solcher Automat arbeitet wie folgt, in Schritten. M startet in Zustand q0 . Wenn M in
Zustand q ist und Signal bzw. Symbol a ∈ Σ erhält bzw. liest, wechselt M in den neuen
Zustand q ′ = δ(q, a) und gibt die Folge λ(q, a) ∈ Γ∗ aus. (Dies könnte durch Ausgeben
einer Folge von Signalen oder durch Schreiben auf ein Ausgabeband erfolgen.)
Wie bei DFA’s kann man das Verhalten von M auf einem Eingabewort w ∈ Σ∗ (einer
Signalfolge) induktiv beschreiben:
δ̂(q, ε) = q; δ̂(q, ua) = δ(δ̂(q, u), a), für u ∈ Σ∗ , a ∈ Σ;
λ̂(q, ε) = ε ∈ Γ∗ ; λ̂(q, ua) = λ̂(q, u)λ(δ̂(q, u), a), für u ∈ Σ∗ , a ∈ Σ.
Dann sagt δ̂(q, w), welchen Zusatnd der Automat nach Lesen von w hat, und λ̂(q, w) sagt,
welche Ausgabe von der Eingabe w bewirkt wird, falls der Automat im Zustand q startet.
Beispiel : Der folgende Mealy-Automat ersetzt in einer Eingabe w ∈ {0, 1}∗ jeden Block
von ≥ 1 aufeinander folgenden Nullen durch 00. Er tut dies, indem er Einsen kopiert und
die jeweils erste Null in einem Block von Nullen verdoppelt, die darauf folgenden jedoch
ignoriert.
Zustandsmenge: Q = {p0 , p1 }.
(Intuition: p0 : letztes Symbol war = 0; p1 : letztes Symbol war 6= 0.)
q0 := p1 .
δ(q, 1) = p1 , λ(q, 1) = 1, für q ∈ Q.
δ(p0 , 0) = p0 ; λ(p0 , 0) = ε;
δ(p1 , 0) = p0 ; λ(p1 , 0) = 00.
Zur Übung sollte man sich Tabelle und graphische Darstellung für M aufmalen. (An der
Kante von vq zu vq′ steht a | x wenn δ(q, a) = q ′ und λ(q, a) = x ∈ Γ∗ .)
Studieren Sie die Arbeitsweise von M an einigen Beispielen! (Eingabe 000100101110 sollte
Ausgabe 0010010011100 liefern.)
Eine Variante von Automaten mit Ausgabe sind die Moore-Automaten. Bei dieser
Sorte hängt die Ausgabe in einem Schritt nicht vom gelesenen Zeichen, sondern nur vom
Zustand ab. Es ist nicht schwer, sich zu überlegen, dass bis auf oberflächliche Unterschiede
Moore- und Mealy-Automaten genau dieselben Übersetzungs-Aufgaben“ lösen können.
”
Alle Einzelheiten über die entsprechenden Konstruktionen sind in der Literatur zu finden.
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öglichkeit haben, unter mehreren Nachfolgezuständen auszuwählen. Nach wie vor liest der Automat in jedem Schritt einen Buchstaben, jedoch ist zugelassen, dass zu einem gegebenen
gegenwärtigen Zustand q und gelesenem Buchstaben a kein, ein oder mehr als ein legaler
Nachfolgezustand q ′ existieren. Demgemäß gibt es zu einer Eingabe w unter Umständen
31
mehrere legale Berechnungen.
2.2.1 Beispiel
(Eingeschränktes Rucksackproblem) Wir stellen uns folgende
Situation vor: Ein Einbrecher ist mit einem Rucksack ausgerüstet, der genau h Kubikzentimeter fasst, für ein h ∈ N. Er steht in einem Raum, in dem sich n Säckchen befinden, die
mit Edelmetallkrümeln gefüllt sind. Die Säckchen sind beliebig verformbar; ihre Volumina
sind a1 , a2 , . . . , an , wobei die ai Zahlen in {1, . . . , h} sind. Natürlich möchte der Einbrecher seinen Rucksack möglichst voll packen. Ist es möglich, eine Teilmenge der Säckchen
auszuwählen, so dass die Kapazität h des Rucksacks perfekt ausgenutzt wird? Technisch
ausgedrückt: 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ür ein h ≥ 1. Unser Problem entspricht dann dem Wortproblem für 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ösen, bei dem die
Reihe der Zahlen a1 , . . . , an nur einmal von links nach rechts gelesen wird. Für 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 Übergängen an, der zur Bearbeitung des Problems geeignet ist. Als
Zustandsmenge wählen wir Q = {0, 1, . . . , h} (mit der Intention, in einem Zustand q die
Summe der bisher gewählten Volumina zu speichern). Wir starten mit q0 = 0 (anfangs
ist nichts gewählt) 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ügen oder nicht. Mögliche neue Zustände sind also q (Gegenstand nicht
nehmen) oder q + a (Gegenstand nehmen — das ist natürlich nur sinnvoll, wenn q + a ≤ h
ist). Formal drücken wir das so aus, dass wir als Wert δ(q, a) die Menge aller Zustände
angeben, die von q aus gewählt werden dürfen, wenn a gelesen wird. Also:
{q, q + a}, falls q + a ≤ h,
δ(q, a) :=
{q},
falls q + a > h.
Nun kann eine Eingabe zu mehreren verschiedenen legalen Berechnungen führen. Beispielsweise kann man auf Eingabe w = (2, 1, 3, 1) unter anderen die beiden in Abb. 2.8
gezeigten Berechnungen erhalten.
32
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ür eine Eingabe auf einem NFA
Um einen Überblick über alle möglichen Berechnungen zu erhalten, stellen wir diese in
einem Berechnungsbaum“ dar. Für jeden erreichten Zustand und das nächste eingelesene
”
Zeichen stellt man alle möglichen Nachfolgezustände als Knoten dar. Zum Beispiel ergeben
sich für die Eingabewörter (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ür (2, 4, 2, 2) und (2, 1, 3, 1), für h = 5
Bei Eingabe (2, 4, 2, 2) ∈
/ LRS
5 enden alle Berechnungen in nicht akzeptierenden Zuständen;
dies entspricht der Situation, dass es keine Folge von Entscheidungen gibt, die dazu führt,
dass man am Ende in Zustand h = 5 landet. Bei Eingabe (2, 1, 3, 1) ∈ LRS
5 enden manche
Berechnungen in nicht akzeptierenden Zuständen; hier hat man unterwegs ungeeignete
Entscheidungen getroffen. Es gibt aber zwei verschiedene Berechnungswege, die zum akzeptierenden Zustand h = 5 führen.
Auch für kleine Zustandsmengen und Alphabete können die Berechnungsbäume sehr groß
werden. Können wir hier etwas sparen? Man sieht, dass Zustände auf demselben Level
33
mehrfach aufgelistet werden, obwohl dies eigentlich nicht nötig ist. Eine kurze Überlegung führt zu der Erkenntnis, dass es genügt, die Menge der auf einem Level auftretenden Zustände 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ür unsere nichtdeterministischen Automaten zu definieren.
Wir entwickeln nun die formale Definition von nichtdeterministischen endlichen Automaten. Ein solcher Automat M spezifiziert Q, Σ, q0 , F und eine Übergangsfunktion
δ : 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ürzt NFA) M besteht aus
• einer endlichen Menge Q;
• einem Alphabet Σ;
• einem ausgezeichneten Zustand q0 ∈ Q;
• einer Menge F ⊆ Q;
• einer Übergangsfunktion“ δ : Q × Σ → P(Q).
”
(Formal schreibt man M = (Q, Σ, q0 , F, δ).)
Die Situation, dass q ′ ∈ δ(q, a) ist, ist so zu interpretieren, dass M in den Zustand q ′
ü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ächster
Schritt möglich ist.)
Wenn ein NFA M = (Q, Σ, q0 , F, δ) gegeben ist, setzen wir δ wieder auf Q × Σ∗ fort,
definieren also aus δ eine iterierte Version δ̂. Wenn dann q ′ ∈ δ̂(q, w) ist, bedeutet dies,
dass der NFA, in Zustand q gestartet, bei der Verarbeitung des Wortes w in den Zustand q ′
gelangen kann. Basierend auf unseren Beobachtungen zu Abb. 2.9 erfassen wir die Menge
der beim Lesen von w erreichbaren Zustände.
34
q
0
1
2
3
4
5
a
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 Übergangsfunktion δ eines NFA
2.2.3 Definition Wir definieren δ̂ : Q × Σ∗ → P(Q) durch Induktion über die Länge
von w ∈ Σ, wie folgt.
δ̂(q, ε) := q, für q ∈ Q;
[
δ̂(q, ua) :=
δ(q ′ , a), für q ∈ Q, u ∈ Σ∗ , a ∈ Σ.
q ′ ∈δ̂(q,u)
Im in Abb. 2.3 angegebenen Beispiel ist etwa δ̂(1, ε) = {1}, δ̂(1, 2) = {1, 3}, δ̂(1, (2, 2)) =
{1, 3} ∪ {3, 5} = {1, 3, 5}, und δ̂(1, (2, 2, 1)) = {1, 2} ∪ {3, 4} ∪ {5} = {1, 2, 3, 4, 5}.
Wir beobachten, dass
δ̂(q, a) =
[
δ(q ′ , a) =
[
δ(q ′ , a) = δ(q, a)
q ′ ∈{q}
q ′ ∈δ̂(q,ε)
ist. Wie im Falle der DFA’s schreiben wir also wieder δ statt δ̂, ohne dass Verwechslungen
auftreten können.
Um die doch recht technische Definition der iterierten δ-Funktion besser verstehen zu
können, übersetzen wir sie in die Sprache von Berechnungen. Wie gewünscht, zeigt sich,
dass q ′ ∈ δ(q, w) ist genau dann wenn es die Möglichkeit gibt, von q startend unter Lesen
von w nach q ′ zu gelangen, wobei in jedem Schritt ein nach δ erlaubter Zustandsübergang
stattfindet.
2.2.4 Lemma In der Situation von Definition 2.2.3 gilt q ′ ∈ δ(q, b1 · · · bm ) für ein Wort
w = b1 · · · bm genau dann wenn es eine Folge p0 , . . . , pm in Q gibt derart dass p0 = q,
pm = q ′ und pi ∈ δ(pi−1 , bi ) für 1 ≤ i ≤ m.
Beweis Dies wird durch Induktion über die Länge m des Eingabewortes w = b1 · · · bm
bewiesen.
35
Wenn m = 0, also w = ε ist, dann ist δ(q, w) = {q} und es gibt nur eine Folge p0 , . . . , pm
mit der beschriebenen Eigenschaft, nämlich die Folge mit dem einen Element q.
Sei nun m ≥ 1. Als Induktionsvoraussetzung nehmen wir an, die Aussage sei wahr für
alle Wörter u der Länge m − 1. Wir betrachten ein Wort w = b1 · · · bm .
⇐“: Wenn es eine Zustandsfolge p0 , . . . , pm in Q gibt derart dass p0 = q, pm = q ′ und
”
pi ∈ δ(pi−1 , bi ) für 1 ≤ i ≤ m, dann folgt nach I.V., dass pm−1 ∈ δ(q, b1 · · · bm−1 ) gilt. Weil
nun q ′ ∈ δ(pm−1 , bm ), gilt nach Definition 2.2.3 auch q ′ ∈ δ(q, b1 · · · bm ).
⇒“: Wenn q ′ ∈ δ(q, b1 · · · bm ), dann heißt dies nach der Definition, dass q ′ ∈ δ(q ′′ , bm ) für
”
einen Zustand q ′′ ∈ δ(q, b1 · · · bm−1 ). Nach I.V. gibt es dann eine Folge p0 , . . . , pm−1 in Q
mit p0 = q und pm−1 = q ′′ , derart dass pi ∈ δ(pi−1 , bi ) für 1 ≤ i ≤ m − 1. Wir können q ′
einfach an diese Folge anhängen.
2.2.5 Definition
Ein NFA M = (Q, Σ, q0 , F, δ) sei gegeben.
(a) Für 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ür 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äß ihrer Übergangsfunktion rechnen kann, sondern vielmehr als
eine Möglichkeit, 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ür das Wortproblem von LM gewinnen. Die in Definition 2.2.3
angegebene rekursive Formel führt nämlich zu einem iterativen Algorithmus, der bei Eingabe w = b1 · · · bm nacheinander δ(q, b1 · · · bt ) für t = 0, 1, . . . , m berechnet und hierfür
eine einigermaßen mäßige Rechenzeit benötigt — solange die Übergangsfunktion δ als
Tabelle gespeichert werden kann. Wenn M ein NFA ist, benutzen wir
X
|M | :=
(1 + |δ(q, a)|)
q∈Q,a∈Σ
als ein Maß für die Größe von M . Dies entspricht in etwa der Anzahl der Einträge von
Zuständen in einer tabellarischen Auflistung von δ.
2.2.6 Satz Es gibt einen Algorithmus zur Lösung des Wortproblems für NFA’s“, d.h.
”
für 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|).
36
Beweis Wir geben etwas allgemeiner einen Algorithmus an, der die Menge δ(qin , w)
berechnet, für ein beliebiges gegebenes qin ∈ Q und ein w = b1 · · · bm ∈ Σ∗ . Um das
Wortproblem zu entscheiden, berechnet man mit dem Algorithmus δ(q0 , w) und prüft, ob
diese Menge ein Element von F enthält.
Für den Algorithmus setzen wir voraus, dass die Zustandsmenge Q einfach {1, 2, . . . , s}
ist. Eine Teilmenge von Q lässt sich dann durch einen Bitvektor der Länge 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ür i = 1, 2, . . . , m
folgendes durchgeführt:
1. kopiere Aneu[1..s] nach Aalt[1..s];
2. setze alle Einträge in Aneu[1..s] auf 0;
3. für jedes p mit Aalt[p] = 1 tue folgendes:
für jedes q ∈ δ(p, bi ) führe 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ür bi einen Bitvektor berechnet, der die Menge δ(qin , b1 · · · bi ) darstellt. Wenn
die Übergangsfunktion in Tabellenform gegeben ist, dann erfordert die Ausführung des
Schleifendurchlaufs für bi das Lesen und Abarbeiten der gesamten Spalte für den Buchstaben a in der Tabelle. Diese Spalte hat Länge s, aber jeder Eintrag kann eine umfangreiche Menge darstellen. Den gesamten Zeitaufwand können wir aber sicher als O(|M |)
abschätzen (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ür jeden Zustand q ∈ Q einen Knoten vq , und von vq nach
vq′ verläuft eine mit a ∈ Σ markierte Kante genau dann wenn q ′ ∈ δ(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 q keine Kante
mit Markierung a
q
δ( q , a ) = {}
eine Kante
mit Markierung a
q
a
drei Kanten
mit Markierung a
q’
q’
δ( q , a ) = {q’ }
a
a
q
q’’
a
q’’’
δ( q , a ) = { q’ , q’’, q’’’ }
37
Die Konventionen über die Zusammenfassung von Mehrfachkanten sind dieselben wie bei
den DFA’s.
Fortsetzung von Beispiel 2.2.1: Der NFA für 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änden gibt es auch gar keinen mit
b1 , . . . , bm beschrifteten Weg, der in vq beginnt. Auf jeden Fall gilt für q, q ′ ∈ Q, b1 · · · bm ∈
Σ∗ die folgende Charakterisierung des Akzeptierungsverhaltens eines NFA M . (Dies ist
einfach eine Übertragung von Definition 2.2.3 und der Charakterisierung der δ-Funktion
in Lemma 2.2.4 in die Graphdarstellungs-Sprechweise.)
(a) q ′ ∈ δ(q, b1 · · · bm ) genau dann, wenn in GM ein Weg von vq nach vq′ 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ühl für diese Aussage zu bekommen, suche man im Graphen in Abb. 2.10
Wege für Eingaben (2, 2, 2, 2) und (1, 2, 3, 1, 2).
Man sieht sofort, dass jeder DFA M = (Q, Σ, q0 , F, δ) einen NFA M ′ = (Q, Σ, q0 , F, δ ′ )
bestimmt, der dasselbe tut“ wie M : definiere einfach δ ′ (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ächsten Satz fest, dass im Prinzip NFA’s nicht mehr leisten (also nicht
mehr Sprachen akzeptieren) als DFA’s. Dennoch sind NFA’s nützlich und wichtig: für
theoretische Untersuchungen wie die Klärung der Beziehung zwischen DFA’s und Grammatiken und regulären Ausdrücken, die wir später kennenlernen werden; zur bequemen
Konstruktion von Automaten, wo direkte DFA-Konstruktionen mühselig wären; schließlich zur kompakten Darstellung von Automaten für Sprachen, deren DFA’s zu groß wären
(s. Bsp. 2.2.10 unten).
38
2.2.8 Satz
Ist L = LM für einen NFA M , so gilt L = LM ′ für einen DFA M ′ .
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ür M ′ , und definieren: M ′ := (Q′ , Σ, q0′ , F ′ , δ ′ ), wo
Q′ := P(Q) = {B | B ⊆ Q};
q0′ := {q0 };
F ′ := {B ∈ Q′ | B ∩ F 6= ∅};
[
δ ′ (B, a) :=
δ(q, a), für B ∈ Q′ , a ∈ Σ.
q∈B
δ ′ (B, a) ist die Menge der Zustände, die M erreichen kann, wenn in einem Zustand q ∈ B
der Buchstabe a gelesen wird. Wir müssen zeigen, dass M ′ dieselben Wörter akzeptiert
wie M . Hierzu stellen wir einen Zusammenhang zwischen den beiden Automaten her:
Behauptung: δ ′ ({q}, w) = δ(q, w) für alle q ∈ Q, w ∈ Σ∗ .
(Dabei ist δ ′ die eben definierte Funktion, gehört also zu M ′ , δ ist wie in 2.2.3, gehört
also zu M .)
Beweis der Behauptung durch Induktion über |w| :
w=ε:
δ ′ ({q}, ε)
Def. 2.1.5(a)
=
w = ua für u ∈ Σ∗ , a ∈ Σ:
δ ′ ({q}, ua)
Def. 2.1.5(a)
=
Def. δ ′
=
{q}
Def. 2.2.3
=
δ(q, ε).
I.V.
δ ′ (δ ′ ({q}, u), a) = δ ′ (δ(q, u), a)
[
2.2.3
δ(q ′ , a) = δ(q, ua).
q ′ ∈δ(q,u)
Damit haben wir, für alle w ∈ Σ∗ :
w ∈ LM
Def. 2.2.5(a)
⇔
Def. q0′ ,F ′
⇔
Beh.
δ(q0 , w) ∩ F 6= ∅ ⇔ δ ′ ({q0 }, w) ∩ F 6= ∅
Def.2.1.5(b)
⇔
w ∈ LM ′ .
δ ′ (q0′ , w) ∈ F ′
Also ist LM = LM ′ .
39
2.2.9 Beispiel
Wir führen Beispiel 2.2.1 fort, indem wir einen DFA für LRS
h angeben.
Die Potenzmengenkonstruktion liefert:
Q′
Σ
q0′
F′
:=
=
:=
:=
P({0, 1, . . . , h})
{1, . . . , h}
{0}
{B ⊆ {0, 1, . . . , h} | h ∈ B}
und, für B ∈ Q′ , a ∈ Σ :
δ ′ (B, a) := B ∪ ({b + a | b ∈ B} ∩ {0, . . . , h}).
Als Beispiel wählen 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
3
1
3
0,2
1
0,3
3
1
1
1
2
2
1
0,1,2,3
0,1,2
1,2,3
0,1,3
0,2,3
1,2
2
1
1,2,3
1
1,3
2,3
1,2
2,3
1,2,3
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ände B mit 0 6∈ B)
in keiner Berechnung eine Rolle spielt, da diese Zustände vom Startzustand {0} nicht
erreicht werden können. (Solche Zustände heißen überflüssig“ und können weggelassen
”
werden, siehe weiter unten.) Man kann bei der Erstellung des Potenzmengenautomaten
die Erzeugung überflüssiger Zustände vermeiden, indem man mit B0 = {q0 } startet und
dann nur solche Zustände generiert, die von einem bisher schon vorliegenden
Zustand B
S
aus durch Lesen eines Buchstabens erreicht werden, also als B ′ = q∈B δ(q, a) darstellbar
sind.
Man kann dies zum Beispiel als Algorithmus formulieren, der mit einer (anfangs leeren)
Warteschlange arbeitet:
40
Setze B0 := {q0 };
(∗ Startzustand von M ′ ∗)
setze B := {B0 }.
(∗ bisher erzeugte Zustände ∗)
Füge B0 in die Warteschlange ein.
Solange die Warteschlange nicht leer ist:
entnehme ein B aus der Warteschlange;
S
für jedes a ∈ Σ teste ob B ′ = q∈B δ(q, a) in B ist,
falls nicht, setze B := B ∪ {B ′ }
und füge B ′ in die Warteschlange ein.
Ausgabe: B.
Nebenbei können wir die Tabelle für die Übergangsfunktion δ ′ erzeugen.
Wie groß wird der von der Potenzmengenkonstruktion erzeugte DFA M ′ ? Grundsätzlich
gibt es nur die obere Schranke |Q′ | = 2|Q| . Lässt man überflüssige Zustände weg, wird
Q′ u. U. kleiner. Jedoch zeigt es sich, dass in manchen Fällen 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ärstrings der Länge mindestens n, die an der n-ten Stelle von rechts eine 0 haben. Ein
NFA für L mit n + 1 Zuständen 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änden. Von diesen
sind 2n nicht erreichbar, nämlich die B mit 0 ∈
/ B, wie man sich leicht überlegt. Durch
Weglassen dieser Zustände erhalten wir einen DFA mit 2n Zuständen. Andererseits gilt:
Behauptung: Jeder DFA M = (Q, Σ, q0 , F, δ) mit L = LM hat mindestens 2n Zustände.
Dies sieht man mit folgendem indirekten Beweis ein: Angenommen, |Q| < 2n . Dann
existieren zwei verschiedene Wörter a1 · · · an , b1 · · · bn ∈ {0, 1}n mit δ(q0 , a1 · · · an ) =
δ(q0 , b1 · · · bn ). Wähle 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
ein Widerspruch.
δ(q0 , a1 · · · an 0i−1 ) = δ(q0 , b1 · · · bn 0i−1 ),
Wir betrachten noch zwei weitere Beispiele für NFAs und die Potenzmengenkonstruktion.
Dabei geht es um das Erkennen von Wörtern aus einer endlichen Menge. Diese Beispiele
sollten im Detail studiert werden, da noch einige Besonderheiten von NFAs zur Sprache
kommen.
41
2.2.11 Beispiel
Wir betrachten nochmals die Aufgabe, einen endlichen Automaten
für eine endliche Sprache L bereitzustellen. Diese Aufgabe wurde in Satz 2.1.10(d) schon
auf zwei Arten gelöst: durch einen Induktionsbeweis und durch direktes Angeben eines
DFA, der als Zustandsmenge die Menge der Präfixe der Wörter in L hatte.
Hier geben wir eine weitere Möglichkeit an: Wir konstruieren einen NFA für 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ände. Für jedes Wort wi gibt es in GML einen
Weg, der aus Zustand 1 und |wi | weiteren Zuständen besteht. Die |wi | Kanten auf diesem
Weg sind mit den Buchstaben von wi beschriftet. Die Endknoten der |L| Wege entsprechen
akzeptierenden Zuständen. Wenn das leere Wort ε in L ist, entspricht diesem Wort ein
Weg der Länge 0; in diesem Fall ist der Startzustand 1 akzeptierend.
Abbildung 2.11 zeigt den NFA ML für die Sprache L = {bei, beine, bube} ü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ür die Sprache {bei, beine, bube} über
Σ = {a, . . . , z}
Wir haben die Zustände willkürlich durchnummeriert. Der Startzustand ist q0 = 1, die
akzeptierenden Zustände sind durch F = {4, 9, 13} gegeben. Ein NFA für die Sprache
L′ = L ∪ {ε} würde genau so aussehen, nur wäre auch der Zustand 1 akzeptierend.
Man beachte, dass man sich keine Mühe geben muss, gemeinsame Präfixe der Wörter
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ühren. Es ist offensichtlich, dass in diesen NFA genau die drei Wörter
aus L hineinpassen“, im Sinn von Bemerkung 2.2.7. Alle Wörter, die nicht Präfix eines
”
Wortes in L sind, führen in eine Sackgasse“, d h. es gibt überhaupt keine Berechnung
”
des NFA, der ein solches Wort vollständig liest.
Die Übergangsfunktion des NFA aus Abb. 2.11 ist in Tabellenform in Tab. 2.4 gegeben.
42
q
start → 1
2
3
4
5
6
7
8
9
10
11
12
13
F
∗
∗
∗
b
e
i
n
u
{2, 5, 10}
−
−
−
−
−
−
−
−
−
{12}
−
−
−
{3}
−
−
{6}
−
−
{9}
−
−
−
{13}
−
−
−
{4}
−
−
{7}
−
−
−
−
−
−
−
−
−
−
−
−
−
{8}
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
{11}
−
−
−
Σ − {b, e, i, n, u}
−
−
−
−
−
−
−
−
−
−
−
−
−
Tabelle 2.4: Tabellendarstellung der Übergangsfunktion δ eines NFA für 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ände nicht erzeugt werden, erhalten wir den
DFA, der in Abb. 2.12 dargestellt ist.
43
{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ür die Sprache
{bei, beine, bube}; gestrichelte Kanten führen 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
übersichtlicher zu gestalten, haben die (gestrichelten) Kanten, die zu diesem Zustand
führen, keine explizite Beschriftung. Dies soll bedeuten, dass alle nicht explizit angegebenen Übergänge über diese Kanten in den Fehlerzustand führen.
Oft lässt man bei der graphischen Darstellung eines DFA mit einem Fehlerzustand diesen
ganz weg, inklusive aller Übergänge, die in ihn hineinführen. Im Bild würde 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äfixautomaten für die Sprache L entspricht, siehe Satz 2.1.10(d). (In mathematischer Sprache sagt
man, der entstehende DFA sei isomorph“ zum Präfixautomaten für L.) Insbesonde”
re führt die Potenzmengenkonstruktion hier nicht zu einer Vergrößerung der Anzahl der
Zustände.
2.2.12 Beispiel
Unser letztes Beispiel sieht auf den ersten Blick dem vorangegangenen Beispiel ähnlich. Wir untersuchen ein Problem, das bei der Verarbeitung von Texten
immer wieder vorkommt. Man möchte wissen, ob eine bestimmte Zeichenreihe in einem
Text (einem File) vorkommt, und wenn ja, wo. Etwas allgemeiner könnte 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öglich; wir kommen später darauf
zurück.)
Wir wollen einen deterministischen endlichen Automaten entwerfen, mit dem wir ein
Eingabewort w durchmustern können, derart dass man unterwegs immer genau dann in
44
einem akzeptierenden Zustand ist, wenn gerade das Ende eines der Wörter aus S erreicht
worden ist.
Wenn wir als Wortliste wieder (bei, beine, bube) verwenden, sollte beispielsweise das
Wort obeinbubebeinebeleintabubeibringt zu einer Zustandsfolge führen, die sich folgendermaßen zu F verhält:
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önnen diese Anforderung wie folgt als formale Sprache formulieren, wobei Σ ein
passendes Alphabet sein soll.
LS := {w ∈ Σ∗ | eines der Wörter w1 , . . . , wn ist Suffix von w}.
Dann ist jeder DFA für uns geeignet, der das Wortproblem für LS löst.
Wir bauen zunächst einen NFA MS für LS , um diesen dann per Potenzmengenkonstruktion in einen DFA umzubauen. Kurzes Überlegen zeigt, dass ein NFA für LS einfach aus
dem NFA aus Beispiel 2.2.11 für die Wortmenge {w1 , . . . , wn } zu erhalten ist, indem wir
am Startzustand eine Schleife anbringen, die es ermöglicht, 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ür LS mit S = (bei, beine, bube)
Wenn wir die Potenzmengenkonstruktion anwenden, natürlich wieder in der Version, in der
keine überflüssigen Zustände erzeugt werden, erhalten wir den in Abb. 2.14 angegebenen
DFA.
45
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ür LS mit S = (bei, beine, bube)
Wir beobachten (ohne einen allgemeinen Beweis), dass der DFA nicht mehr Zustände
hat als der NFA. (In unserem Fall sind es sogar weniger, weil bei Präfix von beine ist.)
Wenn wir die erreichten DFA-Zustände (also NFA-Zustandsmengen) nicht nur daraufhin
ansehen, ob sie einen F -Zustand enthalten, sondern auch daraufhin, welche genau, können
wir am nach dem Lesen eines Präfixes w′ von w erreichten Zustand B (des NFA) sogar
ablesen, welches Wort (welche Wörter) aus S am Ende von w′ stehen.
2.3
Reguläre Ausdrücke
Bisher haben wir Sprachen immer nur abstrakt oder durch zugehörige Maschinen beschrieben. Reguläre Ausdrücke stellen eine andere Art dar, Sprachen zu spezifizieren. Reguläre
Ausdrücke formalisieren den folgenden induktiven Ansatz zur Konstruktion immer komplizierterer Sprachen:
(i) Starte mit den trivialen Sprachen“ ∅, {ε}, {a}, für 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 }
46
Kleene-Abschluss“: L → L∗ = {w1 . . . ws | s ≥ 0, w1 , · · · , ws ∈ L}
”
iteriert auf bereits erzeugte Sprachen an.
Neben dem reinen Erzeugungsprozess geben reguläre Ausdrücke den erzeugten Sprachen
auch Namen (wobei jede Sprache unendlich viele Namen hat).
Für das folgende setzen wir voraus, dass die Alphabete {∅, ε}, {(, ), +,∗ } und Σ disjunkt
sind.2 Für allgemeine Informationen zu induktiven Definitionen siehe Anhang A.2.
2.3.1 Definition
Σ sei ein Alphabet.
(a) Die Menge der regulären Ausdrücke (über Σ) ist induktiv definiert wie folgt:
(i) ∅ und ε sind reguläre Ausdrücke.
(Hier werden ∅“ und ε“ als Zeichen benutzt.)
”
”
Für jedes a ∈ Σ ist a regulärer Ausdruck.
(ii) Ist r regulärer Ausdruck, so auch (r∗ ).
Sind r1 und r2 reguläre Ausdrücke, so auch (r1 r2 ) und (r1 + r2 ).
(iii) Nur die durch die obigen Regeln erzeugbaren Wörter sind reguläre Ausdrücke.
(b) Jedem regulären Ausdruck r ist eine Sprache L(r) ⊆ Σ∗ zugeordnet. Diese ist induktiv definiert wie folgt:
(i) L(∅) := ∅;
L(ε) := {ε};
L(a) := {a}, für 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(r′ ), so heißen r und r′ äquivalent (Notation: r ∼ r′ ).
Wir werden sehen, dass die Klasse der solcherart erzeugten Sprachen (die durch reguläre
”
Ausdrücke“ beschriebenen Sprachen) gleich der Klasse der regulären Sprachen, d. h. der
von DFA’s akzeptierten Sprachen ist. Historisch war es natürlich umgekehrt: Die Bezeichnung reguläre Sprachen“ leitet sich von der Tatsache ab, dass diese Sprachen durch
”
reguläre Ausdrücke beschrieben werden.
Reguläre Ausdrücke über Σ sind also Wörter (über dem Alphabet {∅, ε, (, ), +,∗ } ∪ Σ);
jedes dieser Wörter bezeichnet eine Sprache. Da L(r) = L((r+∅)) = L(((r+∅)+∅)) = . . .,
gibt es für jede Sprache L(r) unendlich viele Namen, d. h. zu r unendlich viele äquivalente
Ausdrücke.
2
Der Konvention gemäß benutzen wir in regulären Ausdrücken ∅“ und ε“ als Zeichen.
”
”
47
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ärer Ausdrücke zu vereinfachen, legen wir Präferenzregeln fest: ∗
bindet stärker als (das nicht geschriebene Zeichen) · (für die Konkatenation) und +; ·
bindet stärker als +; wir notieren, dass + und · assoziativ sind und dass + kommutativ
ist (bis auf Äquivalenz), wenn man die erzeugten Sprachen betrachtet. Dann lassen wir
überflüssige Klammern weg:
(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ürzung r+ für (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äre Ausdrücke 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 Äquivalenzsymbols benutzt man dann das Gleichheitszeichen: (0 + 1)∗ = ((0 +
1)+1)∗ = (0+(1+1))∗ ; ((0+1)∗ )∗ = (0+1)∗ ; (0+ε)∗ = 0∗ ; usw. Zum Einüben unterscheiden
wir in diesem Text Sprachen und die regulären Ausdrücke, die sie bezeichnen.
Schließlich notieren wir noch einige Äquivalenzen, die beim Rechnen“ mit regulären
”
Ausdrücken hilfreich sind:
48
∅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äre Ausdrücke genau die regulären Sprachen erfassen.
2.3.3 Satz
Ist M ein NFA, so gibt es einen regulären 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ächst |Q|2 Sprachen:
L(i, j) := {w ∈ Σ∗ | j ∈ δ(i, w)}, für 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örtern b1 · · · bm , die als Kantenbeschriftung an Wegen auftreten, die in Knoten vi beginnen und in Knoten vj enden. Unser
Ziel ist es, reguläre Ausdrücke rj für L(0, j), j ∈ Q, zu finden (d. h. L(rj ) = L(0, j)). Denn
dann können 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ären Ausdrücke 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ühren eine feinere Unterscheidung ein, indem
wir die Menge der Knoten einschränken, die auf dem Weg vorkommen dürfen.
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ür 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}
49
bm
j
Wir beobachten folgende Eigenschaften der Mengen L(i, j, k), für 0 ≤ i, j < s und k = 0
bzw. k = s:
(2.1)
i 6= j ⇒ L(i, j, 0) = {a ∈ Σ | j ∈ δ(i, a)}
= Menge der Buchstaben an Kanten
(2.2)
i
j
L(i, i, 0) = {a ∈ Σ | i ∈ δ(i, a)} ∪ {ε}
i
= {ε} ∪ Menge der Buchstaben an Kanten
(2.3)
L(i, j) = L(i, j, s).
Um die regulären Ausdrücke für L(i, j, k) induktiv konstruieren zu können, benötigen 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äuft entweder gänzlich 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ür 0 ≤ i, j < s, 0 ≤ k < s.
50
[Für Puristen geben wir einen exakten Beweis dieser Aussage an. Normalerweise wird
man sich mit dem genannten anschaulichen Argument zufriedengeben. Zum Glück hält
die Graphensprechweise den Beweis noch einigermaßen übersichtlich.
Beweis von (1.4): ⊆“: Ist w ∈ L(i, j, k + 1), so ist w = b1 · · · bm Kantenbeschriftung
”
eines Weges von vi nach vj ü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ührt. Dadurch wird das Wort b1 · · · bm in Teilwörter 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ür
ein l ≥ 0, x ∈ L(i, k, k), y1 , . . . , yl ∈ L(k, k, k), z ∈ L(k, j, k). Diesen Wörtern entsprechen Wege von vi nach vk bzw. vk nach vk bzw. vk nach vj , die nur Zwischenknoten in
{v0 , . . . , vk−1 } benutzen. Hängen 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 über k) reguläre Ausdrücke ri,j,k für 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ür 0 ≤ i, j < s, 0 ≤ k < s.
Aus der Konstruktion und (1.1), (1.2), (1.4) folgt sofort (technisch: per Induktion über
k), dass
L(i, j, k) = L(ri,j,k ), für 0 ≤ i, j < s, 0 ≤ k ≤ s.
Schließlich setzen wir
rj := r0,j,s , für 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ücklicherweise werden selbst für kleine Automaten die entstehenden Ausdrücke schnell unhandlich.
Man achte daher auf Vereinfachungsmöglichkeiten (Ersetzen von Teilausdrücken durch
äquivalente 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äre Ausdruck rn für LMn mindestens
51
2n−1 Symbole hat (vgl. I. Wegener, Theoretische Informatik – eine algorithmenorientierte
Einführung, Teubner, 1999, S. 133f.). Das bedeutet, dass im allgemeinen ein Explodieren
der Größe des entstehenden regulären Ausdrucks unvermeidlich ist.
2.3.4 Beispiel
Wir wollen einen regulären Ausdruck für den NFA
0
1
Start
1
0
1
konstruieren. Zur Übung erzeugen wir alle ri,j,k .
k=0:
r0,0,0 = 0 + ε;
k = 1:
r0,1,0 = 1; r1,0,0 = ∅;
r1,1,0 = 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;
∗
r1,0,1 = r1,0,0 + r1,0,0 (r0,0,0
)r0,0,0 = ∅ + ∅(0 + ε)∗ (0 + ε) ∼ ∅;
∗
r1,1,1 = r1,1,0 + r1,0,0 (r0,0,0
)r0,1,0 = (1 + ε) + ∅(0 + ε)∗ 1 ∼ (1 + ε).
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üssen jetzt noch die andere Richtung unserer ursprünglichen Behauptung beweisen:
Zu jedem regulären 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ür Anwendungen interessante: Man spezifiziert eine Sprache durch einen regulären
Ausdruck (das ist oft bequem); der dazugehörige 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 ε-Übergängen“, ein Konzept,
”
das auch praktisch wichtig ist. Man erlaubt dem NFA, gewisse Zustandsübergänge auch
ohne Lesen eines Symbols auszuführen.
2.3.5 Definition
Ein NFA mit ε-Übergängen (kurz: ε-NFA) ist ein 5-Tupel M =
(Q, Σ, q0 , F, δ), wo Q, Σ, q0 , F wie bei NFA’s sind (vgl. 2.2.2), mit ε ∈
/ Σ, aber
δ : Q × (Σ ∪ {ε}) → P(Q).
52
Interpretation: Ist q ′ ∈ δ(q, ε), so kann M , ohne ein Zeichen zu lesen, von Zustand q in
Zustand q ′ gelangen. Die formale Definition der iterierten Funktion δ̂ : Q × Σ∗ → P(Q)
ist hier etwas mühsam; wir gehen daher den leichteren und anschaulicheren Weg über die
graphische Darstellung GM von M (vgl. Bemerkung 2.2.7). Zusätzlich zu den Elementen,
die GM für einen NFA M hatte, sind bei ε-NFA’s jetzt auch Kanten
q
ε
q’
gestattet. Eine solche Kante ist vorhanden genau dann wenn q ′ ∈ δ(q, ε).
53
Beispiel:
1
1
ε
Start
ε
0
3
.
ε
ε
2
3
2
Abbildung 2.15: Ein ε-NFA für L(1∗ 3∗ + 2∗ 3∗ )
2.3.6 Definition
Sei M ein ε-NFA.
(a) Für q ∈ Q, w = b1 · · · bm ∈ Σ∗ definieren wir
δ̂(q, w) := {p ∈ Q | ∃ Weg in GM von vq nach vp ,
dessen Kantenmarkierungen, von ε’s
abgesehen, gleich b1 , . . . , bm sind }.
Achtung: Es gilt δ̂(q, ε) ⊇ {q} und δ̂(q, a) ⊇ δ(q, a), aber nicht notwendig Gleichheit!
(b) M akzeptiert x :⇔ δ̂(q, x) ∩ F 6= ∅.
(c) LM := {x ∈ Σ∗ | M akzeptiert x}.
Im obigen Beispiel haben wir etwa den folgenden akzeptierenden Weg für das Wort w =
1113:
Start
0
ε
1 1
1
1
1
1
1
ε
3
3
3
Abbildung 2.16: Akzeptierende Rechnung für 1113 ∈ LM
Es gibt keinen Pfad von v0 nach v3 mit Kantenbeschriftung ε · · · ε3ε · · · ε1ε · · · ε, also ist
31 6∈ LM .
Wir stellen zunächst fest, dass ε-NFA’s nicht mehr Sprachen akzeptieren als NFA’s und
DFA’s.
2.3.7 Satz Gilt L = LM für einen ε-NFA M , so ist L = LM ′ für einen NFA M ′ (also
ist L regulär ).
54
Beweis Sei M = (Q, Σ, q0 , F, δ). Die einfache Idee der Konstruktion von M ′ ist es,
ε-Wege kurzzuschließen“. Wo in GM ein Weg von vq nach vp führt, der mit ε, . . . , ε, a
”
beschriftet ist (a ∈ Σ), soll in GM ′ eine direkte, mit a beschriftete Kante von vq nach
vp führen. 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 ′ = (Q, Σ, q0 , F ′ , δ ′ ), mit
δ ′ (q, a) := {p ∈ Q | ∃ Weg in GM von vq nach vp ,
der mit ε, . . . , ε, a markiert ist },
für q ∈ Q, a ∈ Σ, und
F ′ := {q ∈ Q | ∃p ∈ F : ∃ Weg (der Länge ≥ 0) in GM von vq nach vp ,
der mit ε, . . . , ε markiert ist }.
Zu zeigen ist: Für a1 · · · an ∈ Σ∗ gilt:
M akzeptiert a1 · · · an ⇔ M ′ 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ünden. Dann sind, nach Definition von δ ′ , die Kanten (vqi−1 , vqi )
in GM ′ mit ai beschriftet, 1 ≤ i ≤ n, und qn ∈ F ′ . Also gibt es in GM ′ einen Weg von
vq0 zu vq′ mit q ′ ∈ F ′ , dessen Kanten mit a1 , . . . , an beschriftet sind, d. h. M ′ akzeptiert
a1 · · · an .
⇐“: Falls M ′ das Wort a1 · · · an akzeptiert, gibt es einen Weg vq0 , vq1 , . . . , vqn in GM ′ mit
”
qn ∈ F ′ , so dass die Kante (vqi−1 , vqi ) mit ai beschriftet ist, 1 ≤ i ≤ n. Nach Definition von
M ′ 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äuft, 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
55
2.3.8 Satz Sei Σ ein Alphabet. Ist r ein regulärer Ausdruck über Σ, so existiert ein
ε-NFA Mr mit L(r) = LMr . (Nach 2.3.7 und 2.2.6 ist also L(r) regulär.)
Beweis Wir zeigen durch Induktion ü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 ähnliche Konstruktionen auch ohne die Einschränkung q0 ∈
/ F und |F | = 1
möglich sind; dadurch vermindert sich u. U. die Größ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
0
q
f
immer den Graphen eines ε-NFA M mit Startzustand q0 = q und akzeptierendem Zustand
qf = q ′ 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.
56
Ma :
Start
a
0
1
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
57
GMr
2
Abbildung 2.21: r = r1 + r2 : Aus Mr1 , Mr2 baue Mr wie folgt:
Mr
1 + r2
:
Mr
1
GM
r1
ε
ε
Start
Mr
2
ε
ε
GM
r
2
Abbildung 2.22: r = r1∗ : Aus Mr1 baue Mr wie folgt:
M (r *):
ε
1
Mr
Start
ε
1
GM
ε
r1
ε
Um die Behauptung zu beweisen, müsste man für jeden der Konstruktionsschritte nachweisen, dass der zusammengesetzte Automat tatsächlich zu der Sprache L(r1 r2 ), L(r1 +r2 ),
L(r1∗ ) gehört, vorausgesetzt, dies stimmt schon für L(r1 ) und Mr1 bzw. L(r2 ) und Mr2 . Dieser formale Beweis sei dem Leser/der Leserin als Übung empfohlen. Als Vorbild benutze
man den Beweis der Formel (1.4) in Satz 2.3.3.
58
2.3.9 Bemerkung
Die Konstruktion von ε-NFA’s (und damit NFA’s, s. Satz 2.3.7)
aus regulären Ausdrücken ist wesentlich gutartiger als die umgekehrte Konstruktion. Man
zeigt leicht durch (starke) Induktion über l ≥ 1: Besteht r aus l Symbolen aus {ε} ∪ {a |
a ∈ Σ} ∪ {∅} ∪ {+, ·, ∗ }, so hat GMr höchstens 2l Knoten und höchstens 4l Kanten.
Wenn man die Datenstrukturen geschickt wählt, und Syntaxanalysetechniken aus späteren
Kapiteln benutzt, ist eine Konstruktion von GMr aus r in Zeit O(l) möglich, 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ären Ausdruck
0∗ 1∗ + 11∗ 0 an, ergibt sich folgender ε-NFA:
ε
ε
ε
0
1
ε
ε
Start
ε
ε
ε
ε
ε
1
ε
ε
1
ε
ε
ε
ε
ε
0
ε
ε
Obgleich dieser Automat im anschaulichen Sinn übertriebenen Aufwand hat, ist seine
Knotenzahl nicht größer als 2 · # (Symbole in 0∗ · 1∗ + 1 · 1∗ · 0) = 2 · 12 = 24.
Wir fassen die beiden letzten Sätze zusammen:
2.3.11 Satz Eine Sprache L ⊆ Σ∗ ist regulär genau dann, wenn L = L(r) für einen
regulären Ausdruck r über Σ.
2.3.12 Korollar Die Klasse der regulären Sprachen ist unter der ∗-Operation (KleeneAbschluss) und unter Konkatenation abgeschlossen.
Beweis Wenn L, L1 , L2 reguläre Sprachen sind, dann kann man nach Satz 2.3.3 reguläre
Ausdrücke r, r1 und r2 mit L = L(r), L1 = L(r1 ) und L2 = L(r2 ) angeben. Wir bilden
die regulären Ausdrücke r∗ und r1 r2 . Dann sind nach Satz 2.3.7 L∗ = L(r∗ ) und L1 L2 =
L(r1 r2 ) ebenfalls regulär.
Es ist eine interessante Übung, das letzte Korollar ohne Benutzung von regulären Ausdrücken zu beweisen. (Man kann direkt mit NFA’s arbeiten.)
59
2.4
Das Pumping-Lemma für reguläre Sprachen
Dieser Abschnitt behandelt eine Struktur-Eigenschaft“, die jede reguläre Sprache besitzt
”
(Satz 2.4.1). Diese wird meistens dazu benutzt, um nachzuweisen, dass gewisse Sprachen
nicht regulär sind.
2.4.1 Satz
(Pumping-Lemma für reguläre Sprachen)
Ist L regulär, so gibt es eine Zahl n ≥ 1, für die folgendes gilt:
Ist x ∈ L, |x| ≥ n, so kann man x = uvw schreiben für u, v, w ∈ Σ∗ , derart dass |uv| ≤
n, |v| ≥ 1, und uv i w ∈ L für alle i ≥ 0.
( Aufpumpen“ heißt aus x = uvw die Wörter uv 2 w = uvvw, uv 3 w = uvvvw, . . . bilden;
”
abpumpen“ heißt uv 0 w = uw bilden.)
”
Beweis Es sei L eine reguläre Sprache. Dann ist L = LM für einen NFA M = (Q,
Σ, q0 , F , δ). Die Zahl n ist einfach die Zahl |Q| der Zustände von M . Betrachte nun
x = a1 · · · am ∈ L, m ≥ n. Es gibt eine akzeptierende Berechnung von M für 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önnen die Zustände 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 ′ zwei Wege, wo Endpunkt p und Anfangspunkt p′ übereinstimmen, so bezeichnet P P ′ 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ür 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ür i ≥ 0.
60
Als Beispiel betrachten wir den folgenden Automaten M , der die Sprache LM = {x ∈
{0, 1}∗ | |x|0 , |x|1 sind gerade} akzeptiert.
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änden 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ängere solche Wege mit Kantenmarkierungen 0(00)i 101 für i ≥ 3 erzeugen.
Wir benutzen das Pumping-Lemma ausschließlich, um zu zeigen, dass gewisse Sprachen
nicht regulär sind. Dafür verwenden wir folgendes Schema mit fünf Schritten. L sei die
Sprache, deren Nichtregularität bewiesen werden soll.
[1] (Wörtlich) Beweis indirekt. Annahme: L ist regulär.
[2] (Wörtlich) Dann gibt es ein n ≥ 1 mit den im Pumping-Lemma 2.4.1 behaupteten
Eigenschaften.
61
0
[3] (Problemspezifisch) Wähle nun x ∈ L, mit |x| genügend groß (mindestens |x| ≥ n)
— so dass Schritt 5 ausführbar ist.
[4] (Wörtlich) Gemäß 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ähle 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ür ein
i ≥ 2.) Dies ist der gewünschte Widerspruch.
Wir demonstrieren die Verwendung des Schemas an einigen Beispielen.
2.4.2 Behauptung
Die folgenden Sprachen sind nicht regulär.
(a) L1 = {0m 1m | 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 ∈ {0, 1}∗ ist korrekter Klammerausdruck}.
Beweis
(a) [1] Beweis indirekt. Annahme: L1 ist regulär. [2] Dann existiert ein n ≥ 1 mit den im
Pumping-Lemma behaupteten Eigenschaften. [3] Wir wählen x = 0n 1n . Offenbar ist
x ∈ L und |x| ≥ n. [4] Gemäß Pumping-Lemma kann x = uvw geschrieben werden
mit |uv| ≤ n und |v| ≥ 1 derart dass uv i w ∈ L für 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üsste nach dem PumpingLemma uv 0 w ∈ L1 sein. Das ist der gewünschte Widerspruch. (Genauso könnte 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äre regulär. Dann gäbe es n ≥ 1 wie im Pumping-Lemma. Wähle
2
x = 0n . Offenbar ist x ∈ L2 , |x| ≥ n. Gemäß 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.
62
(c) Annahme, L3 wäre regulär. Dann gäbe es n ≥ 1 wie im Pumping-Lemma. Wähle
x = 0n 110n . Offenbar ist x ∈ L3 , |x| ≥ n. Gemäß 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 über einen Teil der ersten n Nullen in x; also ist z. B.
uv 0 w = 0n−|v| 110n 6∈ L3 , ein Widerspruch.
(d) Annahme, L4 wäre regulär. Dann gäbe es n ≥ 1 wie im Pumping-Lemma. Wähle
x = 0p für eine Primzahl p ≥ n + 2. Offenbar ist x ∈ L4 und |x| ≥ n + 2. Gemäß
Pumping-Lemma kann man x = uvw schreiben mit |uv| ≤ n, |v| ≥ 1, und uv i w ∈ L4
für alle i ≥ 0. Offenbar ist dann |w| ≥ 2. Betrachte uv |u|+|w| w = 0|u|+|u||v|+|w||v|+|w|
=
0(|u|+|w|)(|v|+1) . Es ist |u| + |w| ≥ 2 und |v| + 1 ≥ 2, also ist uv |u|+|w| w = (|u| +
|w|)(|v| + 1) keine Primzahl, ein Widerspruch.
(e) Für L5 benutzt man x = 0n 1n und argumentiert sonst wie in Teil (a).
Es gibt nichtreguläre Sprachen, deren Nichtregularität sich nicht mit dem PumpingLemma beweisen lässt. Zum Beispiel hat die Sprache
2
L = z ∈ {0, 1}∗ | z = 1k für ein k ≥ 0 oder z = 0j 1k für 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ür manche solche Fälle doch noch eine Handhabe liefert. Die
Verwendung dieses Lemmas folgt demselben Schema wie oben formuliert.
2.4.3 Satz (Verallgemeinertes Pumping-Lemma für reguläre Sprachen) Ist
L regulär, so gibt es eine Zahl n ≥ 1, für die folgendes gilt: Ist x ∈ L, und ist x =
y0 y1 · · · yn yn+1 für y0 , . . . , yn+1 ∈ Σ∗ , wo |y1 | , . . . , |yn | ≥ 1, so gibt es Zahlen 0 ≤ k < l ≤ n
derart dass für u := y0 · · · yk , v := yk+1 · · · yl , w := yl+1 · · · yn+1 gilt: uv i w ∈ L für alle
i ≥ 0.
Beweis Analog zum Beweis von 2.4.1.
2.5
Abschlusseigenschaften für reguläre Sprachen
Dieses kurze Kapitel behandelt Operationen, die aus regulären Sprachen wieder reguläre
Sprachen erzeugen. Wir fassen zusammen, was wir schon wissen.
2.5.1 Satz Lreg , die Klasse der regulären Sprachen, enthält alle endlichen Sprachen und
ist abgeschlossen unter Durchschnitt, Vereinigung, Komplementbildung, Konkatenation
und Kleene-Abschluss.
63
Beweis Für Abgeschlossenheit unter Konkatenation (sind L1 , L2 regulär, so auch L1 L2 )
und Kleene-Abschluss (ist L regulär, so auch L∗ ), siehe 2.3.7. Die anderen Eigenschaften
wurden in 2.1.10 bewiesen.
Mitunter ist es günstig, reguläre 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)∗ ) über dem Alphabet {B, Z} betrachtet, und dann in Wörter
dieser Sprache für jedes vorkommende B einen beliebigen Buchstaben und für 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 über ∆, für 1 ≤ i ≤ n.
Für w = b1 · · · bm ∈ Σ∗ setzen wir
f (w) :=
und für L ⊆ Σ∗ setzen wir
f (b1 )f (b2 ) · · · f (bm )
,
|
{z
}
Konkatenation von Sprachen
f (L) :=
[
{f (w) | w ∈ L}.
(Im obigen Beispiel wäre Σ = {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äre Sprachen und ist L regulär, so ist auch f (L) regulär.
Beweisidee: Betrachte DFA M mit L = LM und ε-NFA’s Ma mit LMa = f (a), für a ∈ Σ,
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 ′ ) mit
Markierung a ∈ Σ
q
a
q’
durch eine Kopie von Ma , wobei eine ε-Kante von vq zum Startzustand von GMa führt
und eine ε-Kante von dem akzeptierenden Zustand von GMa zu vq′ . Schematisch:
64
Ma
q
ε
GMa
ε
q’
Der resultierende Graph stellt einen ε-NFA M ′ dar. Man muss sich nur noch überlegen,
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ür greift man
wieder auf die Argumentationsweise von Satz 2.3.3, Formel (1.4), zurück.
2.5.4 Definition Ist f eine Substitution (siehe 2.5.2) mit |f (a)| = 1 für 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ürlich f (L) = {f (b1 ) · · · f (bm ) | b1 · · · bm ∈ L}. Ist
weiter L′ ⊆ ∆∗ , so kann man das Urbild
f −1 (L′ ) = {w ∈ Σ∗ | f (w) ∈ L′ }
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är, so ist auch f (L) regulär.
(b) Ist L′ ⊆ ∆∗ regulär, so ist auch f −1 (L′ ) regulär.
Beweis (a) ist Spezialfall von 2.5.3. Für (b) betrachte einen DFA
M ′ = (Q′ , ∆, q0′ , F ′ , δ ′ ) mit L′ = LM ′ . Wir definieren einen DFA M = (Q, Σ, q0 , F, δ) wie
folgt:
Q := Q′ , q0 := q0′ , F := F ′ , und
δ(q, a) := δ ′ (q, f (a)) , für jedes q ∈ Q, a ∈ Σ.
Man zeigt jetzt durch Induktion über n, dass für a1 · · · an ∈ Σ∗ gilt:
δ(q0 , a1 · · · an ) = δ ′ (q0 , f (a1 ) · · · f (an )).
65
Also:
a1 · · · an ∈ LM ⇔ δ(q0 , a1 · · · an ) ∈ F
⇔ δ ′ (q0 , f (a1 ) · · · f (an )) ∈ F ′
⇔ f (a1 ) · · · f (an ) ∈ L′ .
Also ist LM = f −1 (L′ ).
Man kann Teil (a) dieses Satzes benutzen, um die Nichtregularität von komplizierten
Sprachen (wie z. B. die syntaktisch korrekten Pascal-Programme) auf die prototypischer
Sprachen (wie die Sprache der korrekt geklammerten (-)-Ausdrücke) zurückzuführen, indem man einen Homomorphismus benutzt, der alle uninteressanten Buchstaben auf ε
abbildet.
Eine weitere ganz einfache Operation ist die Spiegelung von Wörtern 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är, so ist auch LR regulär.
2.5.7 Satz
Beweis Wir skizzieren eine von mehreren Beweismöglichkeiten. Sei L ⊆ Σ∗ regulär. Sei
M = (Q, Σ, q0 , F, δ) ein NFA mit L = LM . Betrachte GM . Wir fügen einen neuen Knoten
vqf hinzu, mit Kanten von vq nach vqf für alle q ∈ F , die alle mit ε markiert werden. Der
einzige akzeptierende Knoten im neuen Graphen GM ′ wird vqf . Offenbar ist M ′ ein ε-NFA
mit L = LM ′ , derart dass M genau einen akzeptierenden Zustand hat, der zudem von q0
verschieden ist. Aus GM ′ bilde GM ′′ durch Umdrehen aller Kanten (ohne Veränderung der
Markierung); vq0 wird akzeptierend, vqf wird Startknoten. Es ist klar, dass LM ′′ = LR
M,
da in GM ′ genau dann ein Weg von vq0 nach vqf existiert, der mit a1 , a2 , . . . , an markiert
ist, wenn in GM ′′ ein Weg von vqf nach vq0 existiert, der mit an , an−1 , . . . , a1 markiert ist.
Beispiel:
GM :
0,1
0
0
Start
LM = L (0+ (0 + 1)∗ + 1)
1
1
66
GM’ :
0,1
0
0
LM ′ = LM
ε
Start
1
1
GM" :
0
ε
0,1
0
ε
Start
1
1
∗ +
LM ′′ = LR
M = L (1 + (0 + 1) 0 )
ε
(Alternativ kann man durch Induktion über die Definition regulärer Ausdrücke beweisen,
dass zu jedem regulären Ausdruck r ein rR existiert mit L(r)R = L(rR ). Die Details möge
man sich als Übung überlegen.)
67
2.6
Entscheidbarkeitsfragen für reguläre Sprachen
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ären Sprachen im Bezug auf Entscheidbarkeitsfragen eine heile Welt“ an. Ins”
besondere sind die folgenden Probleme für reguläre Sprachen entscheidbar:
(a) Ist L = ∅?
(b) Ist |L| < ∞?
(c) Ist L = Σ∗ ?
(d) Ist L1 ⊆ L2 ?
(e) Ist L1 = L2 ?
(f) Ist ε ∈ L?
(g) Ist w ∈ L? (Für gegebenes w ∈ Σ∗ .)
Natürlich muss man vorher sagen, in welcher Form die regulären Sprachen gegeben sind.
Sprachen sind ja i. a. unendlich, also als Eingaben für Algorithmen ungeeignet. Wir verwenden hier die bislang entwickelten Beschreibungsformen für reguläre Sprachen. Wir
werden also annehmen, dass die regulären Sprachen durch einen DFA, einen NFA, einen
ε-NFA oder einen regulären Ausdruck gegeben sind. Wir betrachten zunächst Automaten.
2.6.1 Satz
Es gibt effiziente (d. h. Polynomialzeit-)Algorithmen, die folgende Probleme lösen: Zu einem vorgelegtem Automaten M = (Q, Σ, q0 , F , δ) entscheide, ob
(a) LM = ∅
(für NFA oder ε-NFA M ),
(b) |LM | = ∞ (für NFA oder ε-NFA M ),
(c) LM = Σ∗ (für DFA M ).
Zu DFA’s M1 und M2 entscheide ob
(d) LM1 ⊆ LM2 ,
(e) LM1 = LM2 .
Zu ε-NFA M entscheide ob
(f) ε ∈ LM ,
(g) w ∈ LM , für gegebenes w ∈ Σ∗ .
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ägen aus P(Q) [für (ε-)NFA’s] bzw. aus Q [für
DFA’s]) für δ im wesentlichen in seinen Zeilen die Adjazenzlisten für GM enthält, einschließlich der Kantenmarkierungen. Es ist fair, als Eingabegröße für diesen Graphen
68
|M | := |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 überhaupt einen Weg (vp0 , . . . , vpm )
(mit m ≥ 0) von vq0 = vp0 zu einem vpm mit pm ∈ F gibt (ohne auf die Kantenmarkierungen zu achten). Dies lässt sich z. B. durch Breitensuche in GM feststellen. Der
Zeitbedarf hierfür ist O(|M |).
(b) Behauptung: |LM | = ∞ gilt genau dann wenn es in GM einen Weg von vq0 zu einem
vq mit q ∈ F gibt, der einen Kreis enthält.
[Beweis hiervon: ⇒: Ist |LM | = ∞, so existiert x ∈ LM mit m = |x| ≥ |Q|. Die Existenz
”
eines akzeptierenden Weges (p0 , . . . , pm ), der einen Knoten zweimal benutzt, also einen
Kreis enthält, folgt wie im Beweis von Satz 2.4.1 (Pumping-Lemma).
⇐“: Gibt es einen Weg von vq0 zu einem vq mit q ∈ F , der einen Kreis enthält, so
”
besitzt nach dem Beweis von Satz 2.4.1 (Pumping-Lemma) L eine unendliche Teilmenge
der Form {uv i w | i ∈ N}, mit |v| ≥ 1, also ist L unendlich.]
Algorithmisch gehen wir so vor, dass wir zunächst die Menge V1 der Knoten ermitteln, von
denen aus ein Knoten vq mit q ∈ F erreichbar ist. Die anderen Knoten können natürlich
für das Akzeptieren von Wörtern keine Rolle spielen; man kann sie weglassen. Dann prüfen
wir, ob es in Q1 einen bei vq0 beginnenden Weg mit einem Kreis gibt.
Algorithmus
1. Konstruiere die Umkehrung von GM :
←
′
′
GM := {vq | q ∈ Q}, {(vq , vq ) | (vq , vq ) Kante in GM } .
←
2. Mittels Breitensuche in GM , startend von {vq | q ∈ F }, ermittle die Menge
←
V1 = {vq′ | ∃ Weg in GM von vq nach vq′ für ein q ∈ F }
( = {vq′ | ∃ Weg in GM von vq′ nach vq für ein q ∈ F } ).
3. Bilde GM,1 := Einschränkung von GM auf V1 .
Falls Vq0 6∈ V ′ , stoppe mit der Antwort LM ist endlich“.
”
4. Tiefensuche in GM,1 , vom Knoten vq0 startend, mit dem Test, ob es jemals
Rückwärtskanten zu aktiven“ Knoten gibt, erlaubt es festzustellen, ob von vq0 aus
”
ein gerichteter Kreis in G′ erreichbar ist. Falls dies so ist, wird ∞“ ausgegeben,
”
sonst endlich“.
”
Die Behauptung“ besagt, dass LM unendlich ist genau dann wenn von vq0 aus ein gerich”
teter Kreis in GM,1 erreichbar ist. Also ist der Algorithmus korrekt. Die Laufzeit ist durch
←
den Aufwand für die Tiefensuche in GM bzw. GM1 beschränkt; dies ist immer O(|M |).
(Für Details zur Tiefensuche siehe die Vorlesung Algorithmen und Datenstrukturen“
”
69
oder auch das Buch von Cormen/Leiserson/Rivest/Stein, S. 540ff., insbesondere Lemma
22.11.)
Bemerkung: Wenn M ε-Kanten hat, sucht man nach von vq0 erreichbaren Kreisen in
GM,1 , die mindestens eine mit einem Buchstaben a, also nicht mit ε, beschriftete Kante
haben. Ähnlichen Aufwand hat aber der Ansatz, M in einem NFA M ′ umzuwandeln (siehe
Satz 2.3.7) und dann den beschriebenen Algorithmus auf M ′ anzuwenden. Hierbei erhöht
sich eventuell die Kantenzahl, aber höchstens auf |Q|2 . Die Laufzeit des Algorithmus ist
damit O(|Q|2 ).
(c) Da M ein DFA ist, genügt es zu testen, ob alle Wege von vq0 aus zu einem vq mit
q ∈ F führen. Hierzu benutzt man eine einfache Breitensuche in gM , Laufzeit O(|M |).
Bemerkung: Wenn M ein (ε-)NFA ist, genügt es nicht mehr, die Wege von vq0 aus zu
testen. (Man konstruiere einen NFA, der nur akzeptierende Zustände hat und dennoch
nicht ganz Σ∗ akzeptiert.) Hier muss man M zuerst in einen DFA umwandeln. Die Laufzeit
kann erheblich sein, da durch die Potenzmengenkonstruktion (Satz 2.2.8) die Zahl der
Zustände stark ansteigen kann, siehe Beispiel 2.2.10.
(d) Zu DFA’s M1 , M2 bilde M2′ mit LM2′ = LM2 . Mit der Kreuzproduktkonstruktion
(Satz 2.1.10(c)) bilde M ′ mit LM ′ = LM1 ∩ LM2′ = LM1 ∩ LM2 = LM1 − LM2 . Teste (mit
dem Verfahren aus (a)) ob LM ′ = ∅.
Die Laufzeit dieses Algorithmus ist linear in der Größe von GM ′ , das ist O(|Q1 | · |Q2 | · |Σ|).
(e) Wie in (d) baue mit der Kreuzproduktkonstruktion einen DFA M ′ für die Sprache
LM1 ⊕ LM2 = (LM1 − LM2 ) ∪ (LM2 − LM1 ). Mit dem Verfahren aus (a) teste, ob LM ′ = ∅.
Bemerkung: (Für (d) und (e).) Wenn M1 , M2 (ε-)NFA’s sind, muss man sie zunächst in
DFA’s umwandeln, wieder um den Preis einer eventuellen größen Erhöhung der Zahl der
Zustände.
(f) Bei NFA M teste, ob der Startzustand akzeptierend ist. Bei ε-NFA M teste, ob es in
GM einen ε-Weg (der Länge m ≥ 0) von vq0 zu einem vq mit q ∈ F gibt.
(g) Falls M DFA ist, lässt man (in Zeit O(|w|)) den Automaten M auf w ablaufen. Für
NFA’s M benutzt man den Algorithmus aus Satz 2.2.6. Einen ε-NFA M wandelt man
zunächst in einen NFA um und verwendet dann diesen Algorithmus.
2.6.2 Satz Es gibt Polynomialzeit-Algorithmen, die die folgenden Probleme lösen: Zu
einem vorgelegtem regulären Ausdruck r entscheide, ob
(a) L(r) = ∅,
(b) |L(r)| = ∞,
(f) ε ∈ LM ,
(g) w ∈ LM , für gegebenes w ∈ Σ∗ .
Für die folgenden Probleme gibt es Algorithmen, die jedoch auch exponentielle Laufzeit
haben können: Zu regulären Ausdrücken r bzw. r1 und r2 entscheide ob
70
(c) L(r) = Σ∗ ,
(d) L(r1 ) ⊆ L( r2 ),
(e) L(r1 ) = L(r2 ). (d. h. r1 ∼ r2 ).
Beweis Bei (a), (b), (f) und (g) wandelt man mit der Methode von Satz 2.3.8 den
regulären Ausdruck r in einen äquivalenten NFA Mr um und wendet dann den entsprechenden Algorithmus aus Satz 2.6.1 an. Nach Bemerkung 2.3.9 ist M nicht viel größer als
r. Bei (c), (d), (e) hingegen muss man aus r bzw. r1 und r2 zuerst einen äquivalenten DFA
konstruieren (Potenzmengenkonstruktion, Satz 2.2.8), um die Algorithmen aus Satz 2.6.1
anwenden zu können. Dies kann zu DFA’s führen, die exponentiell größer sind als der
reguläre Ausdruck, von dem man ausgegangen ist.
Bemerkung: Alternativ hierzu kann man auch durch eine konsequente Analyse der
Struktur von r feststellen, ob L(r) leer ist oder unendlich ist oder ob L(r) = {ε} ist.
Dies ist (eventuell) Gegenstand einer Übungsaufgabe.
2.7
Die Minimierung deterministischer endlicher Automaten
In diesem Abschnitt kehren wir zu den DFA’s zurück. Wir suchen effizienteste“ DFA’s zu
”
einer vorgegebenen regulären Sprache L. Was soll das sein? Schließlich macht jeder DFA
auf einem Eingabewort der Länge n genau n Schritte. Ein vernünftiges Komplexitätsmaß
für einen DFA M ist aber seine Größe“, also die Zahl |Q| der Zustände. Wir suchen also
”
nach DFA’s mit möglichst wenigen Zuständen für eine gegebene Sprache.
2.7.1
Unerreichbare Zustände
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ür L((a + b)∗ (ab + ba))
Der NFA M hat vier Zustände. Die zugehörige Sprache umfasst alle Wörter über {a, b},
die mit ab“ oder ba“ enden. Wenn wir auf M die Potenzmengenkonstruktion (Satz 2.2.8)
”
”
71
anwenden, erhalten wir einen DFA M ′ = (Q′ , Σ, q0′ , F ′ , δ ′ ) mit 16 Zuständen. Ein Teil von
M ′ ist in Abb. 2.24 dargestellt. Bei der Darstellung der Elemente von Q′ im Bild lassen
wir die Mengenklammern weg, schreiben also z. B. 013 für {0, 1, 3}.
a
01
023
b
b
a
Start
0
03
0123
012
b
b
b
a
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ür jeden vom
Startzustand q0′ = {0} in M ′ aus erreichbaren Zustand B, dass 0 ∈ B ist. Die acht
Zustände, die 0 nicht enthalten (in Abb. 2.24 in der letzten Reihe aufgelistet), spielen also
für kein Eingabewort eine Rolle.
Es gibt aber auch Zustände B von M ′ , die 0 enthalten und trotzdem unerreichbar sind,
nämlich die Zustände {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ände B ∈ Q′ mit 0 ∈
/ B nicht von q0 aus erreichbar. Der Zustand {1, 2, 3} in dem
dortigen DFA ist ein Beispiel dafür, dass auch solche Zustände unerreichbar sein können,
in die Kanten hineinführen.
2.7.1 Definition Sei M = (Q, Σ, q0 , F, δ) ein DFA. Ein Zustand q ∈ Q heißt unerreichbar (manchmal auch: überflüssig ), wenn δ(q0 , w) 6= q für alle w ∈ Σ∗ (d. h.(!)
wenn es in GM keinen Weg von vq0 nach vq gibt). Ein Zustand q ∈ Q heißt erreichbar,
wenn δ(q0 , w) = q für ein w ∈ Σ∗ .
Wieso können überhaupt unerreichbare Zustände auftreten? Von Hand“ konstruierte
”
DFA’s werden natürlich keine solchen Zustände enthalten. Oft werden aber DFA’s von
Algorithmen oder Programmen erzeugt, die dann durchaus unerreichbare Zustände enthalten können. Nicht nur bei der Potenzmengenkonstruktion, sondern auch bei der Kreuz72
produktkonstruktion (Satz 2.1.10(c)) kann dies auftreten. Man überlege sich zum Beispiel,
dass das Kreuzprodukt eines DFA M mit sich selbst unerreichbare Zustände hat, wenn
M nicht völlig trivial ist.
Es gibt einen ganz einfachen Algorithmus, der zu einem DFA M = (Q, Σ, q0 , F, δ) die
Menge U der unerreichbaren Zustände identifiziert. Es ist ziemlich natürlich, dass man
dafür die Menge der erreichbaren Zustände ermittelt; die unerreichbaren Zustände sind
dann der Rest von Q. Man führt einfach in GM eine Breitensuche vom Startknoten vq0
aus durch; dabei werden genau die erreichbaren Zustände entdeckt. Wenn man geeignete
Datenstrukturen benutzt, ist die Laufzeit O(|Q| · |Σ|).
Für den DFA M ′ aus Abb. 2.24 ergibt sich {0, 01, 02, 023, 013} als die Menge der erreichbaren Zustände, unerreichbar sind die anderen 11 Zustände von M ′ .
Überflüssige Zustände kann man weglassen, ohne die zu einem DFA gehörende Sprache
zu verändern. Dies wird im Folgenden genau begründet.
2.7.2 Bemerkung
δe ) durch:
Zu einem DFA M = (Q, Σ, q0 , F, δ) definieren wir Me = (Qe , Σ, q0 , Fe ,
Qe := {q ∈ Q | q erreichbar },
Fe := Qe ∩ F,
δe := δ ↾ Qe × Σ ,
(Einschränkung von δ auf Qe × Σ) .
Wir lassen also aus GM alle unerreichbaren Knoten weg, sowie die Kanten, die in solche
Knoten hineinführen oder aus solchen Knoten herausführen.
Wir behaupten nun: Me ist DFA ohne unerreichbare Zustände, 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ände innerhalb von Qe 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ände.
Beispielsweise ergibt sich aus dem DFA M ′ aus Abb. 2.24 durch Weglassen der unerreichbaren Zustände der in Abb. 2.25 angegebene DFA, in dem alle Zustände erreichbar
sind.
73
a
01
023
b
b
a
Start
a
0
b
b
a
a
02
013
b
Abbildung 2.25: Ein DFA ohne unerreichbare Zustände
2.7.2
Äquivalente und nicht-äquivalente Zustände
Dass ein DFA keine unerreichbaren Zustände enthält, heißt noch nicht, dass er schon die
minimale Zahl von Zuständen für die akzeptierte Sprache hat.
2.7.3 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 äquivalenten Zuständen
(Zur Übung möge man sich überlegen, welche Sprache LM zu diesem DFA gehört.)
Wir beobachten, durch Inspektion, dass die Zustände 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ührt uns in Zustand 0. Wenn wir in 2 starten, spielt sich genau
dasselbe ab, nur ü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
74
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ückt: Für 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ängen“,
”
ohne die Menge der akzeptierten Wörter zu verändern:
a
a
1
a ,b
Start
a
b
0
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 äquivalenten) Zustandes 2
und nach Streichen des unerreichbaren Zustandes 4
Nun ist Zustand 4 unerreichbar geworden, und mit 2.7.2 erhalten wir durch Weglassen
dieses Zustandes einen Automaten mit drei Zuständen für LM (der sich nicht weiter
verkleinern lässt).
Äquivalenz“ von Zuständen liefert also einen Ansatz zur Verkleinerung von DFA’s. Wir
”
entwickeln nun zunächst eine Methode, um für jedes Zustandspaar festzustellen, ob sie
äquivalent“ sind oder nicht. Zunächst müssen wir genau formulieren, was wir unter Äqui”
valenz von Zuständen verstehen wollen.
Erinnerung: Äquivalenzrelationen und Partitionen.
(Siehe Vorlesung Diskrete Strukturen“.)
”
Sei X eine nichtleere Menge. Eine zweistellige Relation ∼ ⊆ X × X (wir schreiben x ∼ y
für (x, y) ∈ ∼) heißt eine Äquivalenzrelation, wenn gilt:
(i) Reflexivität: ∀x ∈ X : x ∼ x.
(ii) Symmetrie: ∀x, y ∈ X : x ∼ y ⇒ y ∼ x.
(iii) Transitivität: ∀x, y, z ∈ X : x ∼ y ∧ y ∼ z ⇒ x ∼ z.
Ist ∼ eine Äquivalenzrelation, so wird dadurch X in Äquivalenzklassen“ XSi , i ∈ I
”
zerlegt.3 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ür die Äquivalenzklasse von x schreibt man [x] oder [x]∼ . Es gilt: x ∼ y ⇔ [x] = [y] und
x 6∼ y ⇒ [x] ∩ [y] = ∅.
3
I ist eine passende Indexmenge.
75
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}.
2
1
0
5
4
3
7
6
8
10
9
Abbildung 2.28: Eine Partition, entsprechend einer Äquivalenzrelation
Man lernt in der Mathematik, dass eine Äquivalenzrelation auf X gleichbedeutend mit
einer Partition von X ist: Ist eine Äquivalenzrelation ∼ vorgegeben, bilden die Äquivalenzklassen eine Partition von X. Ist eine Partition {Xi | i ∈ I} von X gegeben, erhält
man eine Äquivalenzrelation durch die Festsetzung: x ∼ y falls x, y ∈ Xi für ein i ∈ I.
Wieso benutzt man zwei verschiedene Sprechweisen, wenn es doch eigentlich um dieselbe
Struktur geht? Normalerweise kann man sich eine Einteilung von X in disjunkte Klassen leichter vorstellen; Äquivalenzrelationen auf X sind dagegen oft beweistechnisch und
algorithmentechnisch leichter zu handhaben – so auch in unserem Fall.
2.7.4 Definition Sei M = (Q, Σ, q0 , F, δ) ein DFA. Für p, q ∈ Q definiere: p ∼ q wenn
für alle w ∈ Σ∗ gilt: δ(p, w) ∈ F ⇔ δ(q, w) ∈ F .
(Intuitiv gesprochen: Zustände p und q sind äquivalent, wenn M mit seinen Mitteln,
nämlich δ auf Wörter anzuwenden und Zustände darauf zu testen, ob sie in F oder F
liegen, p und q nicht unterscheiden kann.)
Im DFA aus Abb. 2.26 sind die Zustände 1 und 2 äquivalent, wie oben diskutiert. Die
Zustände 0 und 2 sind nicht äquivalent, weil δ(0, ε) = 0 ∈
/ F , aber δ(2, ε) = 2 ∈ F .
Weiterhin sind 0 und 4 nicht äquivalent, weil δ(0, b) = 2 ∈ F , aber δ(4, b) = 0 ∈
/ F.
(Man suche weitere nichtäquivalente Paare!)
76
2.7.5 Lemma
Die in 2.7.4 definierte Relation ∼ ist eine Äquivalenzrelation auf Q.
Beweis Dass ∼ reflexiv, symmetrisch und transitiv ist, ergibt sich sofort aus den entsprechenden Eigenschaften von ⇔“.
”
Nun stellt sich die Frage, wie wir feststellen können, ob zwei Zustände p und q äquivalent sind. Wenn man versucht, direkt Definition 2.7.4 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ösen dieses Problem, indem wir zur komplementären Relation, der Nicht-Äquivalenz
übergehen. Wann sind p und q nicht äquivalent? Wir notieren eine Basis-Bedingung:
(∗) Wenn p ∈ F und q ∈ F oder q ∈ F und p ∈ F , dann sind p und q nicht äquivalent.
(Beweis: Das Wort ε erfüllt
δ(p, ε) ∈ F ∧ δ(q, ε) ∈
/ F bzw. δ(q, ε) ∈ F ∧ δ(p, ε) ∈
/ F,
was der Definition von ∼ widerspricht.)
Weiterhin notieren wir eine Schlussregel, die es erlaubt, Nicht-Äquivalenz von einem Paar
p, q auf ein anderes Paar p′ , q ′ zu übertragen.
(∗∗) Wenn p 6∼ q und δ(q ′ , a) = q und δ(p′ , a) = p für ein a ∈ Σ, dann sind p′ und q ′ auch
nicht äquivalent.
(Beweis: Wenn p 6∼ q, dann heißt das nach Definition 2.7.4, dass es ein Wort w ∈ Σ∗ gibt
derart dass einer der Zustände δ(p, w), δ(q, w) in F liegt, der andere nicht. Nun gilt
δ(p′ , aw) = δ(p, w) und δ(q ′ , aw) = δ(q, w) ;
also liegt einer der Zustände δ(p′ , aw), δ(q ′ , aw) in F , der andere nicht. Nach Definition 2.7.4 bedeutet das aber gerade, dass p′ und q ′ nicht äquivalent sind.)
Aus Regeln (i) und (ii) erhalten wir einen Markierungsalgorithmus“ zum Ermitteln von
”
Paaren nicht-äquivalenter Zustände. Zu Beginn markieren wir Paare p, q, wenn p ∈ F
und q ∈
/ F oder umgekehrt. Nachher prüfen wir für unmarkierte Paare p′ , q ′ , ob es ein
a ∈ Σ gibt derart dass q = δ(q ′ , a) und p = δ(p′ , a) ein markiertes Paar bilden. In diesem
Fall wird auch p′ , q ′ markiert. Dieser Schritt wird so lange iteriert, bis er nicht mehr
durchführbar ist. Etwas formaler gefasst ergibt sich folgendes Verfahren.4
4
Mit [Q]2 bezeichnen wir die Menge {{p, q} | p, q ∈ Q, p 6= q} der ungeordneten Paare verschiedener
Elemente von Q.
77
2.7.6 Algorithmus
NICHT-ÄQUIVALENZ“
”
Input: DFA M = (Q, Σ, q0 , F, δ)
var H: subset of [Q]2
N: subset of [Q]2
(Halde oder Warteschlange:
die markierten, noch nicht bearbeiteten Zustandspaare)
(die als nicht-äquivalent 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 p′ , q ′ ∈ Q do
if {δ(p′ , a), δ(q ′ , a)} = {p, q} und {p′ , q ′ } 6∈ N then
N := N ∪{{p′ , q ′ }} ;
H := H ∪{{p′ , q ′ }} ;
return N ;
end.











bearbeite {p, q}“
”
Die Ausgabe ist die am Ende in N gespeicherte Menge von Paaren, die wir N ∗ nennen.
Wir wenden Algorithmus 2.7.6 auf den DFA aus Abb. 2.26 an. Dies führt zu folgender
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}
–
–
–
–
–
–
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}
∅
Der folgende Satz besagt, dass der Markierungsalgorithmus immer die nichtäquivalenten
Paare liefert, so dass man aus seinem Ergebnis auch die äquivalenten Paare und damit
auch die Äquivalenzklassen des DFA M ablesen kann.
2.7.7 Satz Wenn Algorithmus 2.7.6 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ält genau die Paare aus nicht-äquivalenten Zuständen.)
78
Beweis: Wir müssen zeigen, dass ein Paar {p, q} genau dann markiert wird, wenn p und
q nicht äquivalent sind.
⇒“: Einen Durchlauf durch die while-Schleife nennen wir eine Runde“. Wir zeigen
”
”
durch Induktion über die Rundennummer, dass jedes markierte Paar {p, q} aus nichtäquivalenten Zuständen besteht.
I.A.: Wenn {p, q} in der Initialisierungsphase markiert wird, dann gilt p ∈ F ⇔ q ∈
/ F.
Nach Regel (∗) (nach Lemma 2.7.5) sind p, q nicht äquivalent.
Induktionsannahme: Alle bis zur Runde r − 1 markierten Zustandspaare {p, q} sind
nichtäquivalent.
Induktionsschritt: Wenn {p′ , q ′ } in Runde r ≥ 1 markiert wird, dann gibt es (nach dem
Algorithmus) ein Paar {p, q}, das in einer früheren Runde markiert wurde, und einen
Buchstaben a ∈ Σ mit δ(p′ , a) = p und δ(q ′ , a) = q. Nach I.V. gilt p 6∼ q. Nach Nach Regel
(∗∗) (nach Lemma 2.7.5) sind p′ , q ′ nicht äquivalent. Damit ist die Induktionsbehauptung
gezeigt.
⇐“: Sei p 6∼ q, d. h., es gibt ein Wort w = b1 · · · bm mit δ(p, w) ∈ F ⇔ δ(q, w) ∈
/ F.
”
Wir definieren wi = b1 · · · bi , für 0 ≤ i ≤ m, und zeigen die folgende Behauptung:
(2.5)
δ(p, wi ) 6∼ δ(q, wi ) , für 0 ≤ i ≤ m.
Die Behauptung wird durch Induktion über i = m, m − 1, . . . , 0 bewiesen (man beachte
die etwas ungewöhnliche Reihenfolge).
I.A.: δ(p, wm ) = δ(p, w) und δ(q, wm ) = δ(q, w). Von diesen Zuständen ist einer in F , der
andere nicht, also sind sie nicht äquivalent.
I.Vor.: Sei i ≥ 1 mit δ(p, wi ) 6∼ δ(q, wi ).
I.Schritt: δ(p, wi ) = δ(δ(p, wi−1 ), bi ) und δ(q, wi ) = δ(δ(q, wi−1 ), bi ). Nach I.V. sind
δ(p, wi ) und δ(q, wi ) nicht äquivalent, daraus folgt mit Regel (∗∗) (nach Lemma 2.7.5),
dass δ(p, wi−1 ) und δ(q, wi−1 ) nicht äquivalent sind.
Nach der Behauptung für i = 0 sind δ(p, w0 ) = δ(p, ε) = p und δ(q, w0 ) = δ(q, ε) = q
nicht äquivalent, was zu zeigen war.
Wir beschreiben noch eine übersichtlichere Darstellungsweise für den Markierungsalgorithmus für die nichtäquivalenten Zustände, die für die Durchführung per Hand geeignet
ist. Man benutzt eine dreieckige Tabelle mit 12 |Q|(|Q|−1) Plätzen, in der es für jedes (ungeordnete) Paar {p, q} von verschiedenen Zuständen 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ähle
eine noch nicht bearbeitete Markierung, z. B. für das Paar {p, q}. Für jedes unmarkierte
Paar {p′ , q ′ } derart, dass es einen Buchstaben a gibt mit δ(q ′ , a) = q und δ(p′ , a) = p,
markiere {p′ , q ′ } und notiere, dass {p′ , q ′ } noch nicht bearbeitet ist.
Beispiel : Für den DFA aus Abb. 2.26 benötigen wir eine Tabelle der folgenden Form.
79
1
2
3
4
0 1 2 3
Wir markieren die Paare {p, q} mit p ∈ F und q ∈
/ F mit (willkürlich 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üft, ob sie zu neuen Markierungen führen. 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ültiges Resultat folgendes Bild:
1
2
3
4
61
62
67
63
64
0
1
2
68
65
66
3
In der Tabelle bleiben eventuell Felder frei. Diese entsprechen genau den unmarkierten
Paaren {p, q}, also den Paaren äquivalenter Zustände. Aus diesen Paaren lassen sich die
Äquivalenzklassen leicht ablesen.
80
Wenn man den Algorithmus von Hand durchführt, braucht man die Tabellenplätze nicht
mit Nummern zu versehen, sondern es reicht, sie zu markieren, z. B. die entdeckten, aber
noch nicht bearbeiteten Paare, also die Elemente von N ∩ H, mit einem Strich /“ und die
”
bearbeiteten Paare (N − H) mit einem Kreuz ד.
”
Wir betrachten noch ein weiteres, umfangreicheres Beispiel.
2.7.8 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
b
a
3
4
a
b
5
a
b
b
b
6
b
7
a
b
8
a
a
Wir überlegen kurz, welche Sprache dieser DFA erkennt. Mit dem Lesen eines a“ rückt
”
man zyklisch eine Spalte weiter, mit dem Lesen eines b“ zyklisch eine Zeile. Akzeptiert
”
werden die Wörter w, für 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ählen der a’s bzw. b’s modulo 3.)
Wir wenden den Markierungsalgorithmus auf diesen DFA an. Nach der Initialisierung
haben wir die folgende Tabelle:
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
81
16
17
18
4
5
6
7
Nun werden die Markierungen in aufsteigender Reihenfolge abgearbeitet. Zur Übung sollte
man jeden Schritt nachvollziehen.
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 ü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 ü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üllen. (Wir haben die Markierungsnummern
nicht durchgestrichen.)
Die leeren Felder in Tabelle 2.5 geben die Paare nicht-äquivalenter Zustände an. Im Beispiel sind dies
{2, 3}, {0, 4}, {1, 5}, {1, 6}, {5, 6}, {2, 7}, {3, 7}, {0, 8}, {4, 8}
was den folgenden Äquivalenzklassen entspricht:
{0, 4, 8}, {1, 5, 6}, {2, 3, 7}.
(Diese Äquivalenzklassen lassen sich in Fig. 2.26 als Diagonalmengen interpretieren.
82
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
2.7.3
Minimalautomaten
Mit den Ergebnissen des letzten Abschnitts können wir die Zustandsmenge Q eines beliebigen DFA’s in Äquivalenzklassen bezüglich ∼M aufteilen. Wir zeigen nun, dass sich
die Menge dieser Äquivalenzklassen als Zustandsmenge eines DFA für LM mit minimaler
Größe benutzen lässt, wenn man von einem DFA ohne unerreichbare Zustände ausgeht.
Diesen neuen DFA (den Äquivalenzklassenautomaten“) kann man direkt definieren.
”
2.7.9 Definition Sei ∼ zu einem DFA M = (Q, Σ, q0 , F, δ) wie in 2.7.4 definiert. Nun
definiere einen DFA M̃ = (Q̃, Σ, q˜0 , F̃ , δ̃) durch:
Q̃
q̃0
F̃
δ̃([q], a)
:=
:=
:=
:=
{[q] | q ∈ Q}
(Menge der Äquivalenzklassen bzgl. ∼) ;
[q0 ] ;
{[q] | q ∈ F } ;
[δ(q, a)], für [q] ∈ Q̃, a ∈ Σ.
Für das Beispiel aus Abb. 2.7.8 hatten wir in Abschnitt 2.7.2 drei Äquivalenzklassen
identifiziert. Damit ergibt sich mit Definition 2.7.9:
Q̃ = {0, 4, 8}, {1, 5, 6}, {2, 3, 7} ,
Σ = {a, b},
q̃0 = {0, 4, 8},
F̃ = {0, 4, 8}, {1, 5, 6} ;
die Übergangsfunktion δ̃ ist durch folgenden Graphen gegeben:
83
a
a
Start
a
0,4,8
1,5,6
b
2,3,7
b
b
Man bemerkt, dass in diesem Beispiel kein Konflikt entsteht: Für jede Klasse [q] ∈ Q̃ ist
[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.10 Satz (Korrektheit der Äquivalenzklassen-Konstruktion)
sei M̃ zu M wie in 2.7.9 definiert. Dann gilt:
Sei M ein DFA;
(a) Wenn q ∼ q ′ , dann gilt q ∈ F ⇔ q ′ ∈ F .
D. h.: für jedes q ∈ Q ist [q] ⊆ F oder [q] ∩ F = ∅.
(b) δ̃ ist wohldefiniert;
(c) M̃ ist ein DFA;
(d) LM = LM̃ .
Beweis: (a) Sei q ∼ q ′ . Nach Def. 2.7.4 gilt q ′ = δ(q ′ , ε) ∈ F genau dann wenn q = δ(q, ε) ∈
F.
(b) Wohldefiniertheit bedeutet, dass die Definition von δ̃, die formal auf einen Repräsentanten einer Äquivalenzklasse bezogen ist, nur von der Klasse, nicht vom Repräsentanten abhängt. Sei dazu a ∈ Σ, q ′ ∈ [q] beliebig. Zu zeigen ist: [δ(q, a)] = [δ(q ′ , a)], d. h.
δ(q, a) ∼ δ(q ′ , a). Tatsächlich gilt für alle w ∈ Σ∗ :
δ(q, aw) ∈ F ⇔ δ(q ′ , aw) ∈ F,
weil q ∼ q ′ . Also gilt für alle w ∈ Σ∗ :
δ(δ(q, a), w) ∈ F ⇔ δ(δ(q ′ , a), w) ∈ F,
was δ(q, a) ∼ δ(q ′ , a) bedeutet.
(c) Alle formalen Anforderungen an einen DFA sind erfüllt:
Q̃ ist endlich und nichtleer, Σ ist Alphabet, q̃0 ∈ Q̃, F̃ ⊆ Q̃ und δ̃ : Q̃ × Σ → Q̃.
(d) Hilfsbehauptung (HB):
δ̃([q], w) = [δ(q, w)], für alle q ∈ Q, w ∈ Σ∗ .
84
[Beweis von HB durch Induktion über n = |w|: Ist w = ε, so gilt δ̃([q], ε) = [q] = [δ(q, ε)].
Im Induktionsschritt ist w = ua für u ∈ Σ∗ , a ∈ Σ. Dann gilt:
δ̃([q], ua)
I.V.
=
δ̃(δ̃([q], u), a) = δ̃([δ(q, u)], a)
Def.δ̃
=
[δ(δ(q, u), a)] = [δ(q, ua)];
dies ist die Induktionsbehauptung.]
Damit haben wir für beliebige w ∈ Σ∗ :
w ∈ LM̃
HB
⇔
δ̃(q̃0 , w) ∈ F̃ ⇔ [δ(q0 , w)] ∈ F̃
⇔
δ(q0 , w) ∈ F ⇔ w ∈ LM .
Teil(a)
Aber ist nun der Äquivalenzklassenautomat endlich minimal? Ja, wie der nächste Satz
belegt. Damit ergibt sich der kleinste DFA für eine Sprache LM wie folgt: Streiche aus M
alle unerreichbaren Zustände (Ergebnis M0 ) und wende dann auf M0 die Äquivalenzklassenkonstruktion an (Ergebnis M̃0 ).
2.7.11 Satz (Minimalität) Es sei M = (Q, Σ, q0 , F, δ) ein DFA ohne unerreichbare
Zustände, und M̃ zu M sei wie in 2.7.9 definiert. Weiter sei M ′ = (Q′ , Σ, q0′ , F ′ , δ ′ ) ein
beliebiger DFA ohne unerreichbare Zustände, mit LM = LM ′ .
Dann gibt es eine surjektive Funktion
Φ : Q′ → Q̃ ,
so dass gilt:
(2.6)
Φ(δ ′ (q ′ , a)) = δ̃(Φ(q ′ ), a), für a ∈ Σ und q ′ ∈ Q′ ,
sowie
(2.7)
q ′ ∈ F ′ ⇔ Φ(q ′ ) ∈ F̃ .
Aus der Surjektivität von Φ folgt insbesondere, dass |Q′ | ≥ |Q̃|, also dass kein DFA für
LM eine geringere Anzahl von Zuständen haben kann als M̃ . Insofern können wir M̃ einen
Minimalautomaten für LM nennen.
Die Formeln (2.6) und (2.7) besagen, dass M̃ eine Vergröberung“ auch von M ′ ist, wobei
”
die Funktion Φ äquivalente Zustände von M ′ auf denselben Zustand in M̃ abbildet.
Beweis von Satz 2.7.11: Es sei q ′ ∈ Q′ . Weil jeder Zustand in M ′ erreichbar ist, gibt es
ein Wort w ∈ Σ∗ derart, dass δ ′ (q0′ , w) = q ′ ist. Wir definieren:
Φ(q ′ ) = [δ(q0 , w)].
85
Hier gibt es wieder die Frage, ob hierdurch Φ wohldefiniert ist, oder ob die Definition
von der willkürlichen Wahl von w abhängt. Die folgende Behauptung zeigt, dass hier
kein Problem besteht: wenn δ ′ (q0′ , w1 ) = q ′ und δ ′ (q0′ , w2 ) = q ′ gilt, dann ist [δ(q0 , w1 )] =
[δ(q0 , w1 )].
Behauptung: Wenn δ ′ (q0′ , w1 ) = q ′ und δ ′ (q0′ , w2 ) = q ′ , 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 δ ′ (q0′ , w1 w) = δ ′ (q ′ , w) = δ ′ (q0′ , w2 w). Das heißt, dass w1 w ∈ LM ′ =
LM gilt genau dann wenn w2 w ∈ LM ′ = LM , in anderen Worten:
δ(p1 , w) = δ(q0 , w1 w) ∈ F genau dann wenn δ(p2 , w) = δ(q0 , w2 w) ∈ F.
Da dies für jedes beliebige w gilt, ist p1 ∼M p2 , wie gewünscht.)
Es sei [q] ein beliebiger Zustand in Q̃, mit q ∈ Q. Weil M keine unerreichbaren Zustände
hat, gibt es ein w mit δ(q0 , w) = q. Setze q ′ = δ ′ (q0′ , w). Dann gilt:
Φ(q ′ ) = Φ(δ(q0′ , w)) = [δ(q0 , w)] = [q].
Also ist Φ surjektiv.
Es bleiben die beiden Gleichungen (2.6) und (2.7) zu beweisen, die besagen, dass Φ ein
Automaten-Homomorphismus“ ist.
”
Es sei w ein Wort mit δ ′ (q0′ , w) = q ′ . Dann ist einerseits
Φ(δ ′ (q ′ , a)) = Φ(δ ′ (q0′ , wa)) = [δ(q0 , wa)]
und andererseits
δ̃(Φ(q ′ ), a) = δ̃([δ(q0 , w)], a) = [δ(δ(q0 , w), a)] = [δ(q0 , wa)] .
Das beweist (2.6). Weiterhin gilt
q ′ ∈ F ′ ⇔ w ∈ LM ′ = LM = LM̃ ⇔ [Φ(q ′ )] = [δ(q0 , w)] ∈ F̃ .
Anmerkung: Wenn man noch etwas genauer hinsieht, kann man sogar feststellen, dass
alle Automaten für eine reguläre Sprache mit der minimalen Zustandszahl isomorph“
”
sind. Im Licht dieser Tatsache ist es gerechtfertigt, den Äquivalenzklassenautomaten M̃
den Minimalautomaten für LM zu nennen.
86
Kapitel 3
Grammatiken und die
Chomsky-Hierarchie
In den 50er Jahren gab Noam Chomsky (∗ 1928), ein amerikanischer Linguist, vier Grammatiktypen als mögliche Modelle für Grammatiken natürlicher Sprachen an. Die Informatiker (und -innen), die sich einerseits mit Formalismen zur Spezifikation künstlicher
Sprachen (Programmiersprachen!) und Algorithmen zur Syntaxanalyse in solchen Sprachen beschäftigten, und andererseits die formalen Sprachen als interessanten Gegenstand
mathematischer Untersuchungen ansahen, bemächtigten sich bald Chomskys Definitionen, formten um, bewiesen Äquivalenzen zu Sprachklassen, die zu verschiedenen Typen
von Automaten gehören, und benutzten die Analysen als Basis für die Konstruktion von
Übersetzern für Programmiersprachen. Wir wollen in diesem Kapitel diese Grammatiktypen kurz betrachten; wir lassen dabei den Bezug zu den natürlichen Sprachen völlig
außer acht und konzentrieren uns auf die Aspekte des Formalismus, die für 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äre Ausdrücke (rekursive Konstruktion von Sprachen).
Grammatiken stellen eine ganz andere Methode dar, Sprachen zu spezifizieren, nämlich
einen Kalkül, in dem gemäß gewisser Regeln Wörter erzeugt werden (durch einen nichtdeterministischen Erzeugungs- oder Ableitungsprozess); die in diesem Kalkül erzeugbaren Wörter bilden dann die Sprache.
1
Im Buch Theoretische Informatik – kurz gefasst“ von U. Schöning ist in Kap. 1 ein natürlichspra”
”
chiges“ Beispiel für eine formale Grammatik angegeben.
87
Grob gesprochen sehen solche Regelsysteme so aus: Sie bestehen aus einem Alphabet
∆, einem Startsymbol“ S ∈ ∆, und einer zweistelligen Relation ⇒ über ∆∗ . (α ⇒ α′
”
wird gelesen als: α′ ist aus α in einem Schritt ableitbar“. Diese Relation hat nichts mit
”
∗
logischer Implikation zu tun!) Dann betrachtet man die Iteration ⇒ von ⇒:
∗
α ⇒ α′ ,
falls es eine Folge α0 , . . . , αt in ∆∗ gibt mit
α0 = α, αr = α′ , und αi−1 ⇒ αi für 1 ≤ i ≤ t.
∗
(⇒ ist die reflexive und transitive Hülle“ von ⇒; siehe Beispiel A.2.14 in Anhang A.2.)
”
Schließlich bezeichnet man
∗
{α ∈ ∆∗ | S ⇒ α}
als die Menge der im Regelsystem ableitbaren/herleitbaren Wörter.
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ützlich, Hilfszeichen zu haben, die in Zwischenschritten von Ableitungen vorkommen dürfen, die aber nicht zum Alphabet der letztendlich interessierenden
Sprache gehören. 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 über
Σ.
3.1.1 Beispiel (Arithmetische Ausdrücke mit Prioritäten) Wir wollen die Menge aller arithmetischen Ausdrücke 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äre 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ücke
aufgebaut sind, sind
+, -, *, /, (, ), num,
wobei num Platzhalter für ein Numeral, also die Darstellung einer Zahl, ist.
88
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ögliche 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öglichen rechten Seiten“ eingesetzt werden soll. Der durch ein solches Ersetzungsregelsystem
”
gegebene Kalkül ist also grundsätzlich nichtdeterministisch ( darf ersetzen“).
”
Zur Übung finde man Ableitungen für die arithmetischen Ausdrücke
(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:
89
V : Menge der (syntaktischen) Variablen“.
”
(Variable werden bei theoretischen Untersuchungen mit A, B, C, . . ., S, T , . . .
bezeichnet, in praktischen Anwendungen mit Wörtern wie statement oder expression,
oder speziell markierten Strings wie htermi, hexpr i, hfactor i, usw.)
Σ : Menge der Terminalzeichen“.
”
(Die Bezeichnungen für Terminalzeichen-Alphabete und Buchstaben sind dieselben
wie bei den regulären Sprachen.)
S ∈ V : Startsymbol“, Startvariable“.
”
”
P : Menge von Produktionen“ oder Ableitungsregeln“ (l, r), geschrieben l → r, mit
”
”
folgendem allgemeinen Format:
l → r,
l ∈ (V ∪ Σ)+ , r ∈ (V ∪ Σ)∗ .
Man liest: 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ägen l → r.
Eine Grammatik G ist ein endlicher Text. Sie spezifiziert einen Kalkül, in dem Wörter
(über V ∪Σ) erzeugt werden können. Wir beschreiben jetzt, wie dieser Kalkül 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ürzer ulv ⇒ urv, falls u, v ∈ (V ∪ Σ)∗ und l → r
eine Produktion in P ist. (⇒ ist zweistellige Relation über (V ∪ Σ)∗ .)
Sprechweise: urv ist in 1 Schritt aus ulv ableitbar .
(Man nennt ⇒ auch die Halbgruppenhülle“ von →, weil man → mittels der [asso”
ziativen] Konkatenationsoperation erweitert.)
90
(b) (Wir erlauben, mehrere solche Schritte nacheinander auszuführen.)
∗
⇒ ist die reflexive, transitive Hülle von ⇒.
∗
Das heißt: α ⇒ α′ , falls es α0 = α, α1 , . . . , αt = α′ gibt, t ≥ 0, so dass αi−1 ⇒ αi für
∗
1 ≤ i ≤ t. (Spezialfall t = 0: α ⇒ α gilt immer.)
Sprechweise: α′ ist aus α (in t Schritten) ableitbar. Wenn man die Schrittanzahl
t
betonen will, kann man auch α ⇒ α′ schreiben.
(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örter ü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äzisieren. Hier nur ein einfaches Beispiel für eine Grammatik, die
Zweierpotenzen in Unärdarstellung 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.
• Aus dem Startsymbol S wird /cAa$.
• A wandert von links nach rechts und verdoppelt jedes übersprungene a.
• Wenn A beim $ anstößt, wird A$ in B$ oder in C umgewandelt. (Im zweiten Fall
wird das $-Zeichen geschluckt“.)
”
• B läuft von rechts nach links und wird beim Auftreffen auf /c wieder in A umgewandelt. (Dann kann A erneut von links nach rechts laufen.)
• C läuft nach links, um sich beim Auftreffen auf das /c-Zeichen in nichts“ ( ε )
”
aufzulösen.
Also: V = {S, /c, $, A, B, C}, Σ = {a}, und die Produktionsmenge P enthält folgende
Paare:
91
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
S → /cAa$
Aaa → aaAa
Aa$ → aaB$
aB → Ba
/cB → /cA
Aa$ → aaC
aC → Ca
/cC → ε
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ür 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 überlege, wie eine Ableitung für das Wort aaaaaaaa aussieht. Wenn eine Tour von
A oder B oder C unvollständig ist, dann enthält 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ühsam, 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ür die es eine
Typ-0-Grammatik G mit L = L(G) gibt.
2
A. Thue war Mathematiker, der um 1914 Regelsysteme zur Manipulation von Zeichenreihen, sogenannte Thue-Systeme, untersuchte. Seine Regeln waren symmetrisch (l → r impliziert r → l), das Semi“
”
(lat. für halb“) drückt aus, dass unsere Produktionen gerichtet sind.
”
92
Auf die Klasse L0 kommen wir später und in der Vorlesung Berechenbarkeit und Kom”
plexitätstheorie“ zurück. Es wird sich herausstellen, dass sie genau die überhaupt durch
einen beliebigen Kalkül erzeugbaren Sprachen enthält (die rekursiv aufzählbaren“
”
Sprachen).
Wir wenden uns nun einem ersten eingeschränkten Grammatiktyp zu. Dabei darf in einem Ableitungsschritt immer nur eine Variable A ∈ V durch ein nichtleeres Wort ersetzt
werden. Man hat aber die Möglichkeit, dies auszuschließen, wenn A nicht in einem vorgeschriebenen Teilwort vorkommt (dem Kontext“).
”
3.1.6 Definition (a) Sei G = (V, Σ, S, P ) Grammatik. Eine Produktion l → r heißt
kontextsensitiv , wenn sie das folgende Format hat:
αAγ → αβγ,
A ∈ V , α, β, γ ∈ (V ∪ Σ)∗ , |β| ≥ 1 .
( Man darf A durch das nichtleere Wort β ersetzen, falls A im Kontext“ α..γ steht.“)
”
”
Um Missverständnisse auszuschließen: Auch A → β mit |β| ≥ 1 ist eine kontextsensitive
Produktion (mit α = γ = ε ). Die eigentlich wesentliche Eigenschaft hier ist die Nicht”
Verkü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ür eine kontextsensitive Grammatik G gilt. L1 ist die Klasse aller kontextsensitiven Sprachen.
Auch L1 wird später nochmals diskutiert. Weil jede Typ-1-Grammatik auch Typ-0-Grammatik
ist, gilt natürlich L1 ⊆ L0 .
Beispiele für kontextsensitive Produktionen:
S → /cAa$
Aab → aaBab
bbAa$ → bbaba$
bbAa$ → bbSBa$
/cB → /cA
Man suche jeweils die Teilwörter α, β, γ!
Keine kontextsensitiven Produktionen sind:
93
Aa$ → aaB$
aC → Ca
/cC → ε
S→ε
Kontextsensitive Grammatiken sind theoretisch einfach zu handhaben, aber für 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önnen. Damit ergibt sich folgendes
Standard-Vorgehen: Spezifiziere eine Sprache L über eine monotone Grammatik; schließe,
dass L kontextsensitiv ist.
3.1.7 Definition (a) Sei G = (V, Σ, S, P ) eine Grammatik. Eine Produktion l → r
heißt (wortlängen-)monoton, wenn |l| ≤ |r| ist.
Beachte: Dies ist die Eigenschaft Nicht-Verkürzung“ von den kontextsensitiven Produk”
tionen. Also: Jede kontextsensitive Produktion ist monoton.
(b) Eine Grammatik G = (V, Σ, S, P ) heißt (wortlängen-)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önnen.
3.1.8 Satz Sei L = L(G) für eine monotone Grammatik G. Dann gibt es eine kontextsensitive Grammatik G′ mit L = L(G′ ). (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
→
→
→
→
→
→
→
94
ε
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 Übung genauer untersucht. Es stellt sich folgendes heraus:
L(G) = {an bn cn | n ≥ 0}.
Mit Satz 3.1.8 können wir schließen, dass diese Sprache kontextsensitiv ist, also zur Klasse
L1 gehört.
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
G′ = (V ′ , Σ, S, P ′ ) (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ür jedes a ∈ Σ eine neue Variable, z. B. Da , und ersetzt in jeder Produktion in P jedes
Vorkommen von a durch Da . Weiterhin fügt man für jedes a ∈ Σ die eine neue Produktion
Da → a hinzu. Die neue Menge von Produktionen nennen wir P ′′ .
Im Beispiel 3.1.9 bekommt man die folgende Menge P ′′ :
S
S
S
A
A
CDb
CDc
Da
Db
Dc
→
→
→
→
→
→
→
→
→
→
ε
D a Db Dc
Da ADb Dc
Da ACDb
Da CDb
Db C
D c Dc
a
b
c
Die Ableitungen, die sich mit P ′′ ergeben, sind dieselben wie die in G, nur stehen ü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
95
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 ′′ , 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ässt. Wir betrachten eine Produktion p:
X1 X2 X3 → Y1 Y2 Y3 Y4 Y5 ,
wobei X1 , . . . , Y5 Variable sind. Wir erfinden drei neue Variable Z1 , Z2 , Z3 , die nur für
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 → Y1 Z2 Z3
Y1 Z2 Z3 → Y1 Y2 Z3
Y1 Y2 Z3 → Y1 Y2 Y3 Y4 Y5
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 ü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ührt.
Im allgemeinen Fall hat man eine Produktion X1 · · · Xn → Y1 · · · Ym mit m ≥ n, und
dasselbe Vorgehen funktioniert.
3.1.9 Beispiel, fortgesetzt: In der Produktionenmenge P ′′ ist nur die Produktion
CDb → Db C
nicht kontextsensitiv. Sie wird durch eine Folge von Produktionen ersetzt. Insgesamt ergibt
sich die folgende kontextsensitive Grammatik für die Sprache L(G) = {an bn cn | n ≥ 0}.
96
G′ = (V ′ , Σ, S, P ′ ) mit V ′ = {S, A, C, Da , Db , Dc , Z1 , Z2 }; die Menge P ′ der Produktionen
ist:
S
S
S
A
A
CDb
Z1 D b
Z1 Z2
D b Z2
CDc
Da
Db
Dc
→
→
→
→
→
→
→
→
→
→
→
→
→
ε
D a Db Dc
Da ADb Dc
Da ACDb
Da CDb
Z1 D b
Z1 Z2
Db Z2
Db C
D c Dc
a
b
c
Die nächste Definition ist grundlegend für 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ür die Bezeichnung Variable“
”
richtig klar: für 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ür eine kontextfreie Grammatik G gilt. L2 ist die Klasse aller
kontextfreien Sprachen.
Notation: Besonders bei kontextfreien Sprachen ist es ü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
97
schreibt man also
A → β1 | β2 | · · · | βs
oder senkrecht:
A →
|
|
..
.
|
β1
β2
β3
..
.
βs
Die Grammatik aus Beispiel 3.1.1 würde 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 Klammerausdrücke) Wir betrachten die Grammatik
G = (V, Σ, S, P ) mit V = {S}, Σ = {0, 1}; P enthält 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ächlich kann man
”
”
zeigen, dass L(G) gerade die Menge kKA aller korrekten Klammerausdrücke ist, wie sie
in Anhang A.2 in Definition A.2.4 definiert werden; damit ist kKA kontexfrei.
3.1.12 Beispiel
Betrachte G = (V, Σ, S, P ) mit V = {S}, Σ = {0, 1}; P enthält die
folgenden Produktionen:
98
(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är ist.
3.2
Rechtslineare Grammatiken und reguläre Sprachen
Mit kontextfreien Sprachen beschäftigen wir uns ausführlich 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ür a ∈ Σ, B ∈ V oder r = ε ist. Eine
kontextfreie Produktion hat also das Format
A → aB, A, B ∈ V , a ∈ Σ, oder
A → ε, A ∈ V .
( Auf der rechten Seite r steht die Variable rechts.“)
”
Beachte: Jede rechtslineare Produktion ist 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ür die gilt: L = L(G) für 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,
99
D → 2D , D → ε.
Kurzform:
S → 1B | 2C | ε,
B → 1B | 2D | ε,
C → 2D,
D → 2D | ε.
Typische Ableitungsfolgen für 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
Äquivalenz zu regulären Sprachen
In diesem Abschnitt zeigen wir, dass die Typ-3-Sprachen nichts anderes sind als die regulären Sprachen. Genauer stellt sich heraus, dass rechtslineare Grammatiken eigentlich
nur eine andere Schreibweise für 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.
100
Die Ähnlichkeit zwischen Berechnungen und Ableitungen ist offensichtlich, und nicht
zufällig. Der nächste Satz (und sein Beweis) zeigen, dass NFA’s und rechtslineare Grammatiken im wesentlichen nur verschiedene Notationen für dasselbe Konzept darstellen.
3.2.4 Satz
Sei L ⊆ Σ∗ Sprache. Dann gilt
L ∈ L3 ⇔ L ist regulär.
Wir beschreiben die Transformation zwischen rechtslinearer Grammatik G und NFA M
zunächst anhand von Beispiel 3.2.2. Natürlich haben beide genau dasselbe (Terminalzeichen-)Alphabet Σ = {0, 1}. Die Menge Q = {S, B, C, D} der Zustände 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 Ähnlichkeit!) In dieser Weise kann man jeder Kante im
Automatengraphen eine Produktion der Form A → aB zuordnen. Schließlich sind die
Zustände 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 überlegen, dass es immer möglich ist, eine Ableitung
S ⇒ a1 p 1 ⇒ a1 a 2 p 2 ⇒ a1 a2 · · · an p n ⇒ a1 a 2 · · · 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ür 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 ′ für q, q ′ ∈ Q = V, a ∈ Σ, q ′ ∈ δ(q, a).
q → ε für q ∈ F .
101
Zu zeigen: M akzeptiert w ⇔ w ∈ L(G), für w ∈ Σ∗ . Das sieht man so ein:
M akzeptiert w = a1 · · · an
⇔ ∃ Zustände 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 ⇒ a 1 p 1 ⇒ a 1 a 2 p 2 ⇒ · · · ⇒ a1 · · · a n p n ⇒ a 1 · · · a n
ist Ableitung in G
⇔ a1 · · · an ∈ L(G).
⇐“: 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är, wohl aber kontextfrei (Beispiel 3.1.12).
Die Chomsky-Hierarchie:
L3 ⊆ L2 ⊆ L1 ⊆ L0
In Worten: Für Sprachen L gelten die folgenden drei Implikationen:
L regulär ⇒ L kontextfrei ⇒ L kontextsensitiv ⇒ L rekursiv aufzählbar
Wir haben hier schon notiert, dass L2 ⊆ L1 gilt, was nicht offensichtlich ist und erst später
bewiesen wird. Später 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ürlich, sich zu fragen, welche Sprachklasse man erhält, wenn man nicht rechtslineare Produktionen A → aB, sondern linkslineare“ A → Ba betrachtet. Es sollte keine
”
große Überraschung sein, dass man auch hier wieder die regulären Sprachen bekommt.
Dies wollen wir in diesem Abschnitt überlegen.
102
3.2.5 Definition
(a) Eine Produktion A → r heißt linkslinear , falls r = ε oder r = Ba für eine
Variable B ∈ V und einen Buchstaben a ∈ Σ.
(b) Eine Grammatik heißt linkslinear, falls alle ihre Produktionen linkslinear sind.
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 G′ = (V, Σ, S, P ′ ) mit LR = L(G′ ).
(b) Es gibt einen NFA M für LR ; es gibt einen NFA M ′ für L = (LR )R mit |V | + 1
Zuständen. (Insbesondere ist L regulär.)
(c) Es gibt eine rechtslineare Grammatik G′′ = (V ′′ , Σ, S ′′ , P ′′ ) für L mit |V ′′ | = |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ält die Produktionen C → B0 | B1 , B → A0 , A → ε | A0 | A1 .
(G erzeugt die Wörter aus {0, 1}∗ , deren vorletztes Zeichen eine Null ist. Dies impliziert,
dass diese Wörter mindestens die Länge 2 haben müssen.)
(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.
103
Es ist leicht zu sehen, dass L(GR ) = L(G)R ist.
(GR erzeugt die Wörter 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 .
Aus M R konstruieren wir den Umkehr-NFA“ M ′ mit L(M ′ ) = (LM R )R , gemäß
”
Satz 2.5.7. Wir wissen, dass M ′ so gewählt werden kann, dass die Zustandszahl
höchstens um 1 steigt, also höchstens |V | + 1 Zustände 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 ′ = (LM R )R = L(GR )R = (L(G)R )R = L(G).
(c) Konstruktion von G′′ mit L(G′′ ) = L:
Aus M ′ lässt sich nun nach Satz 2.2.3 eine rechtslineare Grammatik G′′ derart
gewinnen, dass L(G′′ ) = LM ′ = L(G) ist. Die dort angegebene Konstruktion liefert
für unser Beispiel die folgende Grammatik G′′ = (V ′′ , Σ, S ′′ , P ′′ ):
V ′′ = {A, B, C}
S ′′ = A
P ′′
enthält: A → 0A | 1A | 0B , B → 0C | 1C , C → ε
Fazit: Ist G eine linkslineare Grammatik, so ist L(G) regulär.
Genauer gilt: Zu jeder linkslinearen Grammatik G = (V, Σ, S, P ) existiert eine äquivalente
rechtslineare Grammatik G′ = (V ′ , Σ, S, P ′ ) mit |V ′ | ≤ |V | + 1 und V ⊆ V ′ .
Warnung: Mischen der beiden Produktionstypen rechtslinear“ und linkslinear“ führt
”
”
zu linearen Grammatiken“, die aus der Klasse L3 der regulären Sprachen hinausführen.
”
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ält nur linkslineare und
rechtslineare Produktionen, aber L(G) = {an bn | n ≥ 0} 6∈ L3 .
104
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ür 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ür kontextfreie Grammatiken gesehen:
(a) Beispiel 3.1.1 sollte arithmetische Ausdrücke mit den vier Grundoperationen, Klammerung und der Prioritätsregel Punkt vor Strich“ beschreiben.
”
105
(b) Bei Beispiel 3.1.11 sollte, so wurde behauptet, mit den drei Produktionen
S → ε | SS | 0S1
die Menge kKA der korrekten Klammerausdrücke beschrieben werden. (Diese Sprache wird in Definition A.2.4 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ül. (Siehe Definition 3.1.3(c).) Wenn
α = Y1 · · · Ys 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
α′ = Y1 · · · Ys X1 · · · Xr Z1 · · · Zt
ableiten; man schreibt α ⇒ α′ .
∗
Dann betrachtet man Ketten von Ableitungsschritten und schreibt α ⇒ α′ , wenn es eine
Folge
α = α0 ⇒ α1 ⇒ · · · ⇒ αt , t ≥ 0 ,
von Ableitungsschritten gibt. Die Wörter α ∈ (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örter“, 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örter Satzformen (prüfen!):
S , 0S1 , 01 , SS , 0S1S , 01S , 01SS , 01S0S1 ,
010S1S , 0101S , 0101 , 01S01 , 0100S110S1 , 0100110S1 , 01001101 .
106
Keine Satzformen sind
1S0 , S0S , 0S0S1,
und so weiter.
Sehr nützlich für 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 α′ = Y1 · · · Ys X1 · · · Xr Z1 · · · Zt eine Satzform in G.
(iii) Nichts sonst ist Satzform in G.
Die Äquivalenz der beiden Formulierungen ist nicht schwer nachzuweisen. (Der Leser ist
eingeladen, dies als Übung zu beweisen.) Wir benutzen diejenige der beiden Formulierungen, die bequemer ist. Induktion ü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örter )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ält die Produktionen S → 0S0, S → 1S1, S → 0, S → 1, S → ε, oder kürzer:
S → 0S0 | 1S1 | 0 | 1 | ε.
107
Ableitungen in der Grammatik G sehen beispielsweise so aus:
S ⇒ ε ; S ⇒ 0S0 ⇒ 01S10 ⇒ 01110 ; S ⇒ 1S1 ⇒ 11S11 ⇒ 110S011 ⇒ 110011 .
4.1.2 Proposition
Für 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örter ( Palindrome“) über {0, 1}.
”
Ein Palindrom sieht von vorne und hinten gelesen gleich aus. Palindrome über dem 26buchstabigen lateinischen Alphabet sind zum Beispiel
ara, elle, hannah, reliefpfeiler, sinnlosolnnis, ε .
(Wie sieht eine kontextfreie Grammatik für die Menge der Palindrome über {a, . . . , z}
aus? Wie die für die Palindrome über einem beliebigen vorgegebenen Alphabet Σ?)
Beweis von Proposition 4.1.2:
(Dieser Beweis ist als (Übungs-)Beispiel dafür zu verstehen, wie man das intuitiv Naheliegende formal exakt fassen kann.)
⊆“: (Typisch: Durch Induktion über den Aufbau der Satzformen beweist man eine Eigen”
schaft aller Satzformen. Diese wird dann benutzt, um eine Eigenschaft aller ableitbaren
Wörter w ∈ Σ∗ zu zeigen.)
Behauptung: Ist α eine Satzform in G, so gilt entweder
(I) α = wSwR für 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ür α.
I.S.: Sei α′ aus der Satzform α durch einen Ableitungsschritt gewonnen. Dann muss α
mindestens eine Variable enthalten, also gilt nach der I.V.: α = wSwR für ein w ∈ Σ∗ .
Nun gibt es drei Fälle.
1. Fall : Es wird die Produktion S → ε angewendet, um von α nach α′ zu kommen. Dann
ist α′ = wwR , und es gilt (wwR )R = (wR )R wR = wwR . Also gilt (II) für α′ .
108
2. Fall : Es wird eine Produktion S → a, a ∈ {0, 1} angewendet, um von α nach α′ zu
kommen. Dann ist α′ = wawR , und es gilt (wawR )R = (wR )R aR wR = wawR . Also gilt
(II) für α′ .
3. Fall : Es wird eine Produktion S → aSa, a ∈ {0, 1}, angewendet, um von α nach α′ zu
kommen. Dann ist α′ = waSawR , und es gilt (waSawR )R = (wR )R aSawR = waSawR .
Also gilt (I) für α′ .
In jedem Fall hat auch α′ Format (I) oder (II).
⊇“: (Typisch: Durch Induktion über die Wortlänge zeigt man, dass gewisse Wörter über
”
Σ Satzformen darstellen, also in L(G) liegen.)
Durch Induktion über die Wortlänge |w| zeigen wir:
(+)
Ist w = wR , so ist w ∈ L(G), für 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ür alle w′ mit |w′ | < k gilt (+).
I.S.: Sei w ein Palindrom mit |w| = k. Weil |w| ≥ 2, ist w = aw′ a für ein a ∈ {0, 1} und
ein w′ ∈ Σ∗ . Offenbar gilt w′ = (w′ )R und |w′ | < k. Nach I.V. ist also w′ eine Satzform in
G. Das heißt: Es existiert eine Ableitung
S ⇒ α1 ⇒ · · · ⇒ αr ⇒ w′
für w′ , mit r ≥ 0. Damit ist
S ⇒ aSa ⇒ aα1 a ⇒ · · · ⇒ aαr a = aw′ a
Ableitung für aw′ a, also w = aw′ a ∈ L(G).
Damit ist Proposition 4.1.2 bewiesen.
Wir bemerken, dass nach einer Übungsaufgabe die Sprache {w ∈ Σ∗ | w = wR } nicht
regulär 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ücke erzeugt, siehe Definition A.2.4.
Als Vorbereitung notieren wir eine nichtrekursive 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ür jedes Präfix u von w gilt |u|0 ≥ |u|1 .
109
Beweis: Siehe Sätze A.2.5, A.2.6, A.2.7 in Anhang A.2.
4.1.4 Proposition
Für die Grammatik G aus Beispiel 3.1.11 gilt:
kKA = L(G).
Beweis: ⊆“: Wir zeigen durch Induktion ü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önnen 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ür w zu erhalten. Also ist w ∈ L(G).
(Übung: Man benutze diese Strategie, um für das Wort 010010101011 eine Ableitung in
G zu finden.)
⊇“: Wir beweisen die folgende Hilfsbehauptung (HB) über Satzformen α in G:
”
(HBα )
|α|0 = |α|1 und jedes Präfix γ von α erfüllt |γ|0 ≥ |γ|1 .
Der Beweis erfolgt durch Induktion über den Aufbau von Satzformen.
I.A.: Wenn α = S, so ist (HBα ) erfüllt, weil S keine Nullen oder Einsen enthält.
I.V.: α = β S ζ erfüllt (HBα ).
I.S.: Betrachte die Satzformen, die aus α in einem Schritt erzeugt werden können, indem
man auf das S zwischen β und ζ eine Produktion anwendet. Es gibt zwei Fälle:
1. Fall : α′ = β SS ζ. (HBα′ ) folgt unmittelbar aus (HBα ), da sich an der Verteilung von
Nullen und Einsen nichts ändert.
2. Fall : α′ = β 0S1 ζ. Hier erhöht sich die Gesamtzahl von Nullen und Einsen um jeweils
1, also folgt |α′ |0 = |α′ |1 aus der I.V. Nun betrachten wir Präfixe: Für ein Präfix γ ′ von
α′ gibt es verschiedene Möglichkeiten. Wenn γ ′ Präfix von β ist, besagt die I.V. direkt,
dass |γ ′ |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önnte γ ′ = β0S1ζ ′ für ein Präfix ζ ′ von ζ sein. Dann
liefert die I.V., dass |βζ ′ |0 ≥ |βζ ′ |1 gilt; daraus folgt sofort |β0S1ζ ′ |0 ≥ |β0S1ζ ′ |1 , weil
sich auf beiden Seiten die Anzahl der Nullen und Einsen um 1 erhöht.
Nach dem Prinzip der Induktion über den Aufbau von der Satzformen in G folgt, dass
(HBα ) für alle Satzformen in G gilt. Da jedes Wort w ∈ L(G) (auch) Satzform ist, erfüllt
jedes w ∈ L(G) Bedingung (∗) in Proposition 4.1.3, ist also in kKA.
110
4.2
Ableitungsbäume, 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äume
darzustellen. Diese Syntaxbäume“ oder Ableitungsbäume“ 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
1
ε
ε
0
S
S
1
ε
ε
Abbildung 4.1: Schrittweiser Aufbau eines Ableitungsbaums
unterstrichen.) Aus einer solchen Ableitung α0 ⇒ · · · ⇒ αt bauen wir schrittweise Bäume
111
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ättern, 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ängen 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äumen. Aus der Ableitung
S ⇒ SS ⇒ SSS ⇒ 0S1SS ⇒ 0S1S ⇒ 01S ⇒ 010S1 ⇒ 0101
für 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 ü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ür 0101
Als weiteres Beispiel betrachten wir Ableitungsbäume 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ür das Wort
( num - num * num / num ) / num + num * num / num - num
112
<expr>
+
<term>
<factor>
(
<term>
<expr>
−
<factor>
num
/
<term>
)
<factor>
<factor>
num
num
<expr>
num
−
<term>
<term>
*
<factor>
num
<term>
<factor>
<expr>
<term>
*
<factor>
/
num
/
<expr>
<term>
<term>
<factor>
<factor>
num
num
<term>
<factor>
num
Abbildung 4.3: Ableitungsbaum für
( num - num * num / num ) / num + num * num / num - num
Abbildung 4.4 einen für num - num - num - num * num. In Abbildung 4.5 sieht man
einen Ableitungsbaum, in dem manche Blätter mit Variablen beschriftet sind, der also
eine Satzform liefert und noch weiter ausgebaut werden könnte.
Wir definieren nun formal, was Ableitungsbäume 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:
(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.
1
Ein Baum heißt geordnet, wenn die unmittelbaren Nachfolgerknoten eines Knotens eine Reihenfolge
von links nach rechts“ haben.
”
113
<expr>
<term>
<factor>
num
−
<expr>
<term>
−
<expr>
<factor>
<term>
num
<factor>
num
−
<expr>
<term>
<factor>
num
*
<term>
<factor>
num
Abbildung 4.4: Ableitungsbaum für num - num - num - num * num
(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 ′ , der mit ε beschriftet ist, und A → ε ist Produktion
in P .
(b) Ist T ein Ableitungsbaum, so bezeichnen wir mit α(T ) das Wort über V ∪ Σ, das sich
beim Lesen der Blätter von T von links nach rechts ergibt.
(Das Wort α(T ) heißt das Ergebnis“ oder Resultat“ von T (engl. yield ), manchmal
”
”
auch das Blattwort“ von T .)
”
In den Bäumen in Abb. 4.1 sind die Wörter α(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ürlich einfach verschluckt. Im Extremfall sind alle Blätter von T
114
<expr>
+
<term>
<factor>
/
<expr>
<term>
−
<term>
<factor>
<factor>
<term>
*
<factor>
num
/
<term>
<expr>
<term>
<factor>
num
Abbildung 4.5: Ableitungsbaum für eine Satzform
mit ε beschriftet; dann ist α(T ) = ε. Ein Beispiel für diese Situation ist für 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ür ε
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 ′
mit Ergebnis α(T ′ ) = ( num - num * num / num ) / num.
X-Ableitungsbäume werden schematisch so gezeichnet:
115
X
T
α(T )
Wir halten fest, dass Ableitungsbäume tatsächlich dasselbe leisten wie Ableitungsfolgen.
4.2.3 Lemma Sei G kontextfreie Grammatik. Dann sind für X ∈ V ∪ Σ und α ∈
(V ∪ Σ)∗ die folgenden beiden Aussagen äquivalent:
∗
(i) X ⇒ α;
(ii) α = α(T ) für 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ätten schon einen
X-Ableitungsbaum Ts für αs = X1 · · · Xt , d. h. X1 , . . . , Xt sind die von ε verschiedenen
Einträge an den Blättern von Ts . Es gibt dann t′ ∈ {1, . . . , t} und Y1 · · · Yu derart, dass
Xt′ → Y1 · · · Yu eine Produktion ist und
αs = X1 · · · Xt′ · · · Xt ⇒ X1 · · · Xt′ −1 Y1 · · · Yu Xt′ +1 · · · Xt = αs+1
der nächste Ableitungsschritt ist. Der Knoten zu Xt′ in Ts erhält 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ält der Knoten zu Xt′ einen
Nachfolger mit Markierung ε. Das Konstruktionsschema ist in Abb. 4.7 wiedergegeben.
116
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ür 1 ≤ i ≤ r, jeweils
mit Tiefe kleiner als k. Nach Induktionsvoraussetzung gilt
∗
Xi ⇒ α(Ti ) , für 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
ε
117
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ügt – 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ür später wichtig: Ableitungsschritte, die zum rechten Unterbaum gehören, werden erst durchgeführt, wenn der linke Unterbaum komplett abgearbeitet ist. Dies führt dazu, dass immer die am weitesten links stehende Variable bearbeitet
wird.
Der Ableitungsbaum T enthält vollständige Information darüber, 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äume auch Syntaxbäume oder Strukturbäume – sie geben über
die Struktur“ oder den Satzbau“ des Wortes α(T ) bezüglich der Grammatik G Aus”
”
kunft. Diese Eindeutigkeit der verwendeten Produktionen ist bei Ableitungsfolgen nicht
unbedingt gegeben; z. B. können zur Folge S ⇒ SS ⇒ SSS in der Grammatik von
Beispiel 4.2.1 die beiden verschiedenen Bäume
S
S
S
S
S
S
S
S
S
S
gehören. Daher zieht man meist Ableitungsbäume als Darstellung für Ableitungen vor.
Oft ist es jedoch nützlich, eindimensionale (zeigerfreie) Notationen für Ableitungsbäume
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ür 0 ≤ s < r
beim Übergang 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ür jeden Ableitungsschritt
Y1 · · · Ys A Z1 · · · Zt ⇒ Y1 · · · Ys X1 · · · Xr Z1 · · · Zt ,
118
dass Y1 , . . . , Ys ∈ Σ sind.
Rechtsableitungen werden analog definiert: Produktionen werden immer auf die am
weitesten rechts stehende Variable angewendet.
Beispiel: (Zu Grammatik aus Beispiel 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übrigt 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äume
und Linksableitungen für w entsprechen einander eineindeutig.
Die entsprechende Aussage gilt für Ableitungsbäume 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äumen. (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äume für das Wort 010101
119
Beweis von Proposition 4.2.5: Sei w ∈ L(G) fest.
Wenn eine beliebige Linksableitung LA für w ∈ Σ∗ gegeben ist, so können wir wie im Beweisteil (i) ⇒ (ii)“ von Lemma 4.2.3 daraus einen Ableitungsbaum TLA für w erzeugen.
”
Sind zwei verschiedene Linksableitungen LA1 und LA2 für w gegeben, so führen diese zu
zwei verschiedenen Ableitungsbäumen TLA1 und TLA2 . (Man betrachte den ersten Ableitungsschritt, in dem sich LA1 und LA2 unterscheiden. Dabei müssen auf dieselbe Variable
an derselben Position verschiedene Produktionen angewendet werden; dies schlägt sich
direkt in einem Unterschied in den Syntaxbäumen nieder.) Die Abbildung Φ : LA 7→ TLA
ist also injektiv.
Wenn man nun einen beliebigen Ableitungsbaum T für w gegeben hat, so liefert die
Konstruktion aus Lemma 4.2.3 (ii) ⇒ (i)“ eine Linksableitung LA(T ) für 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äume besitzt. Sie
heißt eindeutig , wenn jedes Wort w ∈ L(G) genau einen Ableitungsbaum besitzt.
(b) Eine Sprache L ∈ L2 heißt inhärent mehrdeutig , wenn jede kontextfreie Grammatik
G mit L = L(G) mehrdeutig ist.
Es ist für 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ür die Sprache zu haben. Insbesondere ist es ungünstig, wenn die Programmiersprache selbst inhärent mehrdeutig ist.
4.2.7 Beispiel
(a) Die Grammatik aus Beispiel 4.2.1 für kKA ist mehrdeutig, wie wir
an den in Abb. 4.1 und 4.2 dargestellten verschiedenen Ableitungsbäumen für das Wort
0101 erkennen können. Dennoch ist die Sprache kKA nicht inhärent mehrdeutig, da sie
auch eine eindeutige Grammatik besitzt.
Wir behaupten nämlich, und beweisen gleich, dass folgendes eine eindeutige Grammatik
für die Sprache kKA ist: G = ({S}, {0, 1}, S, P ), wo P die Produktionen S → ε , S →
0S1S enthält. (Man baue Ableitungsbäume in dieser Grammatik für einige Wörter w ∈
kKA!)
(b) Ohne Beweis bemerken wir, dass die Sprache
L := {an bn cm | n, m ∈ N} ∪ {am bn cn | n, m ∈ N}
120
eine inhärent mehrdeutige kontextfreie Sprache ist. Die Aussage L ∈ L2 ist dabei nicht
schwer zu zeigen. Folgendes ist eine naheliegende Grammatik für L:
G = ({S, A, B}, {a, b, c}, S, P ),
wobei P die folgenden Produktionen enthält:
S
A
D
C
E
→
→
→
→
→
AD | EC
aA | ε
bDc | ε
cC | ε
aEb | ε .
Zum Beispiel gibt es für 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ärenten Mehrdeutigkeit ist aufwendiger und wird hier ausgelassen.
Intuitiv benötigt jede Grammatik G′ mit L(G′ ) = L für die beiden Teile der Sprache
unabhängige Abteilungen“; die Wörter an bn cn für große n müssen 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 über die Länge 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üllt. Das geht praktisch genau so wie dort vorgeführt. 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 über den Aufbau von korrekten Klammerausdrücken,
”
dass jeder korrekte Klammerausdruck w eine Ableitung in G besitzt.
I.A.: Wenn w = ε, ist S ⇒ ε eine Ableitung.
I.S.: Nun sei w 6= ε ein korrekter Klammerausdruck. Nach der Definition ist w = 0w′ 1w′′
121
∗
für korrekte Klammerausdrücke w′ und w′′ . Nach I.V. gibt es Ableitungsfolgen S ⇒ w′
∗
und S ⇒ w′′ . Wenn wir diese Folgen mit dem Ableitungsschritt S ⇒ 0S1S kombinieren,
erhalten wir eine Ableitung
∗
∗
S ⇒ 0S1S ⇒ 0w′ 1S ⇒ 0w′ 1w′′ = w,
wie gewünscht.
(b) Wir zeigen durch Induktion über |w|, dass jedes Wort w ∈ L(G) genau eine Linksableitung hat.
I.A.: Wenn w = ε, ist S ⇒ ε die einzige Ableitung für w.
I.V.: Es sei k ≥ 1, und für jedes w′ ∈ L(G) gebe es genau eine Linksableitung. I.S.: Nun
sei w ∈ L(G), w 6= ε, mit einer Linksableitung
S = α0 ⇒ 0S1S = α1 ⇒ · · · ⇒ αt = 0w′ 1w′′ = w.
Man denkt sich die 0 und die 1 in α1 = 0S1S permanent markiert (unterstrichen). Diese Terminalzeichen werden ja nach dem ersten Ableitungsschritt nie mehr verändert.
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 = 0w′ 1S. Da man aus S nur Wörter in L(G) erzeugen kann, ist w′ ∈ L(G)
und der Teil der Ableitung α1 ⇒ · · · ⇒ αs , der sich zwischen 0 und 1 abspielt, bildet eine Linksableitung für w′ . Nun ist |w′ | < |w|, und daher ist nach der I.V. diese
Ableitung 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ür das Wort w′′ abspielen muss. Wieder wegen der Eindeutigkeit
dieser Linksableitung (nach I.V.) kann es auch nur eine Möglichkeit für diesen zweiten
Teil der Ableitung geben. Schließlich bemerkt man, dass 0w′ 1 das kürzeste Präfix von w
ist, das gleich viele Nullen wie Einsen enthält. Damit sind die Teilwörter w′ und w′′ durch
w, nicht durch die spezielle Ableitung α0 ⇒ 0S1S ⇒ · · · ⇒ αt = w, festgelegt. Also kann
es für w nur diese eine Linksableitung geben; das ist die Induktionsbehauptung.
Wir bemerken noch (ohne formalen Beweis), dass die Grammatik für arithmetische Ausdrücke aus Beispiel 3.1.1 eindeutig ist. In den Übungen wird eine mehrdeutige Grammatik
für klammerfreie arithmetische Ausdrücke besprochen.
4.3
Die Chomsky-Normalform
Sowohl für theoretische Zwecke als auch für praktische Anwendungen ist es günstig, kontextfreie Grammatiken zu haben, deren Produktionen noch engere Anforderungen erfüllen
als die bloße Kontextfreiheit. In diesem Abschnitt geben wir eine solche Normalform an
und besprechen einen Konstruktionsalgorithmus dafür. Anwendungen werden in späteren
Abschnitten angegeben.
122
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üllt die Anforderungen der Definition. Die Produktion S → ε kommt vor; S kommt
nicht auf der rechten Seite irgendeiner Produktion vor.
Die einzige Möglichkeit, 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ür 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ür ein Wort w mit n Buchstaben genau 2n − 1 beträgt. 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äume für n-buchstabige
Wörter genau n Blätter haben, die mit Terminalzeichen beschriftet sind, und dass der
Teil des Baums, dessen Knoten mit Variablen beschriftet sind, einen vollen“ Binärbaum
”
123
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ättern darstellt.2 Man weiß, dass solche Bäume 2n − 1 Knoten haben (die genau
den Ableitungsschritten entsprechen).
Wie im Beispiel gilt allgemein, dass Ableitungen und Ableitungsbäume in Grammatiken
in Chomsky-Normalform sehr stark standardisiert und ü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üllt ebenfalls die Anforderungen der Definition. Die Startvariable erscheint auf der
rechten Seite von Produktionen, aber es gibt überhaupt keine ε-Produktion.
2
Ein Binärbaum heißt voll“, wenn jeder Knoten, der kein Blatt ist, genau zwei Nachfolger hat.
”
124
Der Leser/die Leserin ist eingeladen, einige Ableitungen und Ableitungsbäume für diese
Grammatik zu entwickeln und zu spekulieren, welche Sprache zu G gehört.
4.3.3 Definition
L(G′ ) gilt.
Zwei Grammatiken G und G′ heißen äquivalent, wenn L(G) =
Am Ende dieses Abschnitts werden wir folgenden Satz bewiesen haben:
4.3.4 Satz Jede kontextfreie Grammatik G kann in eine äquivalente Grammatik G′ in
Chomsky-Normalform umgebaut werden.
Hierfür gehen wir in vier Schritten vor:
1. Separieren der Terminalzeichen-Produktionen
2. Verkürzen der rechten Seiten
3. Elimination der ε-Produktionen A → ε
4. Elimination von Kettenregeln A → B
4.3.1
Separierung
Zunächst 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öcke von mehreren Terminalzeichen erzeugt werden. Es gibt keinen Grund, sich für diese Überlegung auf kontextfreie
Grammatiken zu beschränken.
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 äquivalente separierte
Grammatik G′ = (V ′ , Σ, S, P ′ ) umgebaut werden.
125
Beweis: Für jedes a ∈ Σ wird eine neue Variable Da eingeführt. 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ür a ∈ Σ, hinzugefügt. Offenbar gilt für die resultierende Grammatik
G′ := (V ∪ {Da | a ∈ Σ}, Σ, S, P ′ ),
dass L(G) = L(G′ ).
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 G′ 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ühren für jedes Terminalzeichen eine neue Variable und eine Produktion ein, zum
Beispiel wie folgt:
hnumi
hliklai
hreklai
hplusi
hminusi
htimesi
hover i
→
→
→
→
→
→
→
126
num
(
)
+
*
/
Die alten Produktionen sehen nach der Änderung 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
Verkürzung rechter Seiten
Als nächsten Schritt möchten 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
äquivalente separierte kontextfreie Grammatik G′ = (V ′ , Σ, S, P ′ ) 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ür diese
Produktion verwendet werden) zu V hinzugenommen; die folgenden Produktionen werden
zu P hinzugefügt:
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 ′ ; die neue Produktionenmenge P ′ .
127
Es ist offensichtlich, dass in der neuen Grammatik G′ gilt:
A ⇒ C1 Y2 ⇒ C1 C2 Y3 ⇒ · · · ⇒ C1 C2 · · · Yr−1 ⇒ C1 C2 · · · Cr−1 Cr .
Daher sind in G′ mindestens alle Wörter von L(G) ableitbar. Umgekehrt kann man sich
überlegen, dass die neuen Variablen zu nichts anderem verwendet werden können, als in
einer Teilableitung oder in einem Teil des Ableitungsbaums A in C1 · · · Cr zu transformieren. In der Notation der Ableitungsbäume sieht die Übersetzung 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ötigen wir zwei neue Variable, etwa F und H, und die neuen Produktionen
S → AF
F → SH
H → BS .
Die Produktion S → ASBS wird gestrichen.
128
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ächst lösen wir (für 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 G′ für L(G) − {ε} um, so dass in G′ überhaupt keine ε-Produktionen
vorkommen.
Teilschritt 1: Ermittlung von Vε . Dies geschieht mit einem Markierungsalgorithmus.
Eingabe ist eine kontextfreie Grammatik G = (V, Σ, S, P ).
Markierungsalgorithmus für Vε
Auszuführen 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önnte 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
129
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ür diese Grammatik ergibt sich also Vε =
{B, S, T, C}.
4.3.12 Proposition
(a)
(b)
(c)
Für das Resultat des Markierungsalgorithmus gilt:
∗
A wird markiert ⇔ A ⇒ ε.
A wird markiert ⇔ es gibt einen A-Ableitungsbaum T mit α(T ) = ε.
ε ∈ L(G)
⇔
S wird markiert.
Beweis: Nach Lemma 4.2.3 sind (a) und (b) äquivalent. Weiter ist es klar, dass (c) aus
(a) folgt. Es genügt also, (b) zu beweisen.
(b) ⇒“: Man zeigt durch eine einfache Induktion ü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üheren Runden
markiert wurden. Nach der I.V. gibt es also für jedes i, 1 ≤ i ≤ r, einen Ci -Ableitungsbaum
TCi ,ε mit Ergebnis α(TCi ,ε ) = ε. Diese Bäume können wir wie in Abb. 4.10 angegeben zu
einem A-Ableitungsbaum TA,ε zusammenbauen. Dies liefert die Induktionsbehauptung.
130
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üllt, so wird A markiert.
(Man sollte sich überlegen, dass dies keineswegs offensichtlich ist. Der Baum TA könnte
im Prinzip sehr groß sein, und es ist nicht klar, wieso der Markierungsalgorithmus, der
ja höchstens |V | Runden ausführt, 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 ü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ür d′ < 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:
131
T :
A
A
Cr
C1
TC
TC
r
1
ε
ε
Die Unterbäume 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 Überlegungen können wir für jede kontextfreie Grammatik G
die Menge Vε ermitteln und auch feststellen, ob ε ∈ L(G) ist oder nicht.
Ausflug: Produktive und überflüssige Variable
Mit den eben für Vε entwickelten Techniken lässt sich auch eine andere fundamentale
Frage über eine gegebene kontextfreie Grammatik G lösen, nämlich ob L(G) = ∅ ist, oder
∗
äquivalent, ob S ⇒ w für mindestens ein Wort w ∈ Σ∗ ist. Allgemeiner betrachtet man
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.
(Äquivalent: . . . 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 überflüssig .
Man kann sich leicht überlegen, dass eine überflüssige Variable in keinem Ableitungsbaum
zur Grammatik G vorkommen kann, der als Ergebnis ein Terminalzeichenwort hat. Produktionen, in denen solche Variablen vorkommen, können also weggelassen werden, ohne
die Sprache zu verändern. Die Sprache L(G) ist leer genau dann wenn S überflüssig ist.
Wenn G = (V, Σ, S, P ) gegeben ist, ermitteln wir die Menge der produktiven Variablen
durch einen Markierungsalgorithmus, der dem für Vε sehr ähnelt.
132
Markierungsalgorithmus für Vprod
Auszuführen auf einer Tabelle aller Produktionen in P
Runde 0: Markiere alle (Vorkommen von) A, wo A → w Produktion für 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
(a)
(b)
(c)
Für das Resultat des Markierungsalgorithmus gilt:
∗
A wird markiert ⇔ A ⇒ w für ein w ∈ Σ∗ .
A wird markiert ⇔ es gibt einen A-Ableitungsbaum T mit α(T ) ∈ Σ∗ .
L(G) 6= ∅
⇔
S wird markiert.
Der Beweis dieser Behauptung verläuft ganz genau so wie der für Proposition 4.3.12.
(Eine gute Übung!)
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.
133
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 überflüssig ergeben sich B und F . (In diesem konkreten
Beispiel ist auch intuitiv zu sehen, dass man die Variable B nie loswerden“ kann, auch
”
wenn man noch so viele Ableitungsschritte durchführt, und dass sich dies dann auch auf
F überträgt.)
Dies beendet unsere kurze Diskussion von produktiven und überflüssigen Variablen. Wir
kehren zurück 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ür ε-produzierende
Variable an, und erhalten Vε .
P ′ entsteht aus P durch folgende Änderungen:
• Wenn A → BC Produktion und B ∈ Vε , füge A → C hinzu
• Wenn A → BC Produktion und C ∈ Vε , füge A → B hinzu
• Streiche alle Produktionen A → ε
4.3.16 Lemma
Die Grammatik G′ = (V, Σ, S, P ′ ) erfüllt L(G′ ) = 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
134
ergibt sich: Vε = {S}. Die folgenden Produktionen werden hinzugefügt:
F → H
H → B
die Produktion S → ε wird gestrichen. Damit ergibt sich als neue Produktionenmenge
P ′:
S
F
H
A
B
→
→
→
→
→
AF
H | SH
B | BS
0
1
Die Grammatik G′ = ({S, A, B, F, H}, {0, 1}, S, P ′ ) erzeugt L(G) − {ε}, das ist die Menge
aller korrekten Klammerausdrücke ohne ε.
Beweis von Lemma 4.3.16: Wir müssen zeigen, dass man einen Ableitungsbaum für w ∈
Σ+ in G in einen in G′ umbauen kann und umgekehrt.
⊇“: Gegeben ist ein Ableitungsbaum T für 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ür die neue Grammatik G′ 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 G′ -Baum, mit Produktion A → B, keine ε-Produktionen
enthält, 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änger (mit A
135
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 G′ , ohne dass sich das Ergebnis des Baums ändert. Diesen Schritt führen
wir gleichzeitig für alle maximalen ε-erzeugenden Unterbäume aus. Dadurch ändert sich
eventuell auch der Baum TC unter dem C-Knoten in einen neuen Baum TC′ . Das Resultat
ist als zweiter Baum in Abb. 4.11 angegeben. Insgesamt erhalten wir einen Baum zur
Grammatik G′ mit Ergebnis w.
⊆“: Gegeben ist ein Ableitungsbaum T ′ für das Wort w in der neuen Grammatik G′ . Diese
”
benutzt Produktionen, die in G nicht vorkommen. Betrachte zum Beispiel die Produktion
A → C, die in P ′ ist, weil P die Produktion A → BC enthält und B ∈ Vε ist. Das
bedeutet, dass es in G einen B-Ableitungsbaum TB,ε , gibt, der als Ergebnis ε liefert. Nun
ersetzen wir in T ′ einfach jedes Knotenpaar, das der Produktion A → C entspricht, durch
eine Unterstruktur für die Produktion A → BC und hängen 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: G′ -Baum mit neuer Produktion A → C. Rechts: G-Baum für
dasselbe Wort, mit Produktion A → BC und B-Ableitungsbaum TB,ε mit Ergebnis ε
Durch eine solche Änderung ändert sich das Ergebnis des Gesamtbaums nicht. Wenn wir
diesen Umbau für alle in T ′ verwendeten neuen Produktionen durchführen, erhalten wir
einen Ableitungsbaum für 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 Produk136
tionen der Form
A → ε, A → a, A → B, A → BC,
mit A, B, C ∈ V , a ∈ Σ, kann in eine äquivalente separierte kontextfreie Grammatik
G′ = (V ′ , Σ, S, P ′ ) umgebaut werden, die folgendes erfüllt:
• 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 G′ ist kontextsensitiv im Sinn von Definition 3.1.6(b).
Beweis: Sei L ∈ L2 , also L = L(G) für 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 ist L = L(G1 ), und wir können G′ = G1 wählen.
2. Fall : ε ∈ L. Dann ist L = L(G′ ) für die Grammatik
G′ = (V1 ∪ {S ′ }, Σ, S ′ , P1 ∪ {S ′ → S, S ′ → ε}).
Diese erfüllt die aufgeführten 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 äquivalente kontextsensitive Grammatik G′ 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ür 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ür G′ angegeben.
137
Zunächst können wir alle Produktionen der Form A → A weglassen, da Ableitungsschritte,
die diese Produktion benutzen, nichts ändern. Die verbleibende Menge aller Kettenregeln
in P nennen wir P1 .
Die Idee für das Weitere ist, Ableitungsfolgen der Form
A = A0 ⇒ A1 ⇒ · · · ⇒ At = B ⇒ CD
bzw.
A = A0 ⇒ A1 ⇒ · · · ⇒ At = B ⇒ a
durch Hinzufügen von Produktionen A → CD bzw. A → a kurzzuschließen“. Dadurch
”
entstehen natürlich keine Ableitungen für Wörter, die nicht schon vorher in L(G) waren.
Nun werden alle Kettenregeln A → B weggelassen, und man muss sich überlegen, dass
dadurch die Menge der ableitbaren Wörter 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ügen 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.
138
(b) Weiter betrachten wir die Grammatik Gε = ({Sε , S, A, B, F, H}, {0, 1}, Sε , P ∪ {Sε →
ε | S}), die aus der Grammatik aus Beispiel 4.3.17 durch Hinzufügen eines speziellen neuen
Startsymbols Sε hervorgeht. Wenn man hier alle Ketten überbrückt und die Kettenregeln
weglässt, ergibt sich die folgende Produktionenmenge für 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): Für jedes A ∈ V ermittle die Menge
∗
VA = {B ∈ V | A ⇒ B und A 6= B}.
Das heißt, B ∈ VA genau dann wenn
A = A0 ⇒ A1 ⇒ · · · ⇒ At = B
für eine Variablenfolge A0 , . . . , At , t ≥ 0, und A 6= B.
Algorithmisch gehen wir dazu folgendermaßen vor: Wir fassen V als Knotenmenge und
E = P1 als Kantenmenge eines Graphen H = (V, E) auf. Nun ermitteln wir für jedes
A ∈ V durch Breitensuche die Menge VA = {B ∈ V | B ist von A aus erreichbar}. Der
Zeitaufwand hierfür ist O(|V | · (|V | + |P1 |)), also polynomiell.
Phase (b): Für jede Kombination
A ∈ V, B ∈ VA , B → a in P
fügen wir die Produktion A → a zu P hinzu; für jede Kombination
A ∈ V, B ∈ VA , B → CD in P
fügen wir die Produktion A → CD zu P hinzu. Alle Kettenregeln A → B werden aus P
entfernt. Die neue Produktionenmenge heißt dann P ′ ; die neue Grammatik G′ .
Man sieht sofort, dass in der neuen Grammatik G′ = (V, Σ, S, P ′ ) nicht mehr Wörter ableitbar sind als in G. Umgekehrt kann man einen Ableitungsbaum T für ein Wort w in der
Grammatik G immer zu einem in der Grammatik G′ umbauen, indem man in T maximal
139
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 G′ ersetzt, die den Teilableitungen A ⇒ a
bzw. A ⇒ CD entsprechen.
Wir ersetzen also
A
A
A1
A1
A2
bzw.
B
B
D
C
A2
a
im Ableitungsbaum durch
A
C
A
bzw.
D
a
und umgekehrt.
140
4.4
Das Pumping-Lemma für kontextfreie Sprachen
Wir benutzen die Chomsky-Normalform, um ein Pumping-Lemma ähnlich dem für reguläre Sprachen (Satz 2.4.1) zu beweisen. Dieses Lemma, das eine grundlegende Struktureigenschaft kontextfreier Sprachen formuliert, wird gewöhnlich dafür benutzt (in ähnlicher
Weise wie in Abschnitt 2.4 das für reguläre Sprachen), um nachzuweisen, dass gewisse
Sprachen nicht kontextfrei sind.
4.4.1 Satz (Pumping-Lemma für kontextfreie Sprachen) Wenn L eine kontextfreie Sprache über Σ ist, dann gibt es eine Zahl n ≥ 1, für die folgendes gilt: Für jedes
z ∈ L mit |z| ≥ n gibt es Wörter 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ür 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ür z in G. Weil
n ≥ 1 ist und G in Chomsky-Normalform ist, kann in diesem Baum 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ückt: Der Variablenteil des Ableitungsbaumes bildet einen vollen
”
Binärbaum“.
Behauptung: Ein voller Binärbaum, in dem auf dem längsten Weg von der Wurzel zu
einem Blatt genau d Knoten liegen, hat maximal 2d−1 viele Blätter.
(Dies beweist man durch Induktion über d. I.A.: Wenn der längste Weg einen Knoten
hat, besteht der Baum nur aus der Wurzel und hat 20 Blätter. I.S.: Sei nun d > 1. Im
linken Teilbaum hat der längste Weg maximal d − 1 Knoten, also hat der linke Teilbaum
nach I.V. höchstens 2d−2 Blätter. Dasselbe gilt für den rechten Teilbaum. Insgesamt gibt
es also höchstens 2 · 2d−2 = 2d−1 Blätter.)
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.13: Ein Ableitungsbaum zu einer Chomsky-Normalform-Grammatik
Wir wählen nun im Ableitungsbaum T für z einen Wurzel-Blatt-Weg mit maximaler
Knotenzahl; diese sei l. Nach der Behauptung“ gilt
”
2|V | = n ≤ |z| ≤ 2l−1 ,
also |V | < l. (Diese kleine Rechnung ist der Grund dafür, dass wir n = 2|V | gewählt
haben.)
142
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ählend, A0 , A1 , . . . , Al−1 . (Siehe
Abb. 4.14.) Nach dem Schubfachprinzip muss in der Folge A0 , . . . , A|V | eine Variable
wiederholt vorkommen. Wir können also i, j wählen 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
143
Die beiden ausgewählten Positionen in der Folge A0 , . . . , A|V | bestimmen die Wurzeln von
zwei Unterbäumen T1 (Knoten zu Aj ) und T2 (Knoten zu Ai ) von T . Beide Knoten sind
mit A beschriftet, siehe Abb. 4.16.
T:
S
T1:
A
T2 :
u
v
A
w
x
y
Abbildung 4.16: Ineinander geschachtelte Teilbäume, beide Wurzeln mit A beschriftet
Die Teilbäume T1 und T2 teilen z = α(T ) in 5 Teile (von denen manche leer sein können):
u := der Inhalt der Blätter von T links von T1
v := der Inhalt der Blätter von T1 links von T2
w := α(T2 )
x := der Inhalt der Blätter von T1 rechts von T2
y := der Inhalt der Blätter von T rechts von T1 .
Im Beispielbaum aus Abb. 4.13 könnten diese Unterbäume und die zugehörigen Teilwörter
zum Beispiel aussehen wie in Abb. 4.17. Hier wiederholt sich die Variable F .
Folgende Eigenschaften der Teilwörter 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ätter in T1 .
Weil die zu A0 , A1 , . . . , A|V | gehörende Knotenfolge zu einem Weg maximaler Länge in T
gehört, hat der längste Weg in T1 höchstens |V | + 1 Variablenknoten. Nach der obigen
Behauptung“ hat T1 höchstens 2|V | Blätter, 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
144
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
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,
2-mal usw., zwischen den Baum T (ohne T1 ) und T2 einfügen 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.
145
T:
T2:
S
A
w
y
u
Abbildung 4.18: T2 anstelle von T1 eingehängt.
In Abb. 4.18 nimmt T2 die Stelle von T1 ein; das Resultat ist ein Ableitungsbaum für
uv 0 wx0 y. Daher ist uwy = uv 0 wx0 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ür 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äume für uv 3 wx3 y,
146
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ält man durch Anwendung
der Schritte Separierung“ und Verkürzung der rechten Seiten“ und durch Weglassen
”
”
der ε-Produktion eine Grammatik G = ({S, D, A, B}, {0, 1}, S, P ), wobei P die folgenden
Produktionen enthält:
S → SS | AD | AB ,
D → SB ,
A → 0, B → 1 .
Diese Grammatik G ist in Chomsky-Normalform. Es ist klar, dass L(G) die Sprache der
korrekten Klammerausdrücke ohne ε ist. Betrachte z. B. den folgenden Ableitungsbaum
für z = 00101101 in dieser Grammatik:
S
S
S
D
A
0
B
S
S
S
A
B
0
1
1
T1
A
B
A
B
0
1
0
1
T2
Wir haben einen längsten Pfad markiert; auf ihm wiederholt sich die Variable S (doppelt
umrandet). Auch die resultierenden Teilbäume T1 und T2 sind markiert. Man überprüfe,
147
dass hier u = 0, v = 01, w = 01, x = ε und y = 101 gilt, und die Aussagen (i), (ii), (iii)
aus 4.4.1!
Durch Herausschneiden und Verdoppeln des Baumteils T1 ohne T2“ ergeben sich die
”
folgenden Ableitungsbäume:
S
S
S
D
A
0
S
B
A
B
1
0
1
T2
148
A
B
0
1
S
S
S
D
A
0
S
B
A
B
0
1
B
0
1
1
S
S
A
S
S
A
B
A
B
0
1
0
1
T1
T1 ohne T2
Zur Übung erstelle man einen Ableitungsbaum für uv 3 wx3 y!
Genau wie im Fall des Pumping-Lemmas für reguläre Sprachen wollen wir das PumpingLemma 4.4.1 für den Beweis nutzen, dass gewisse Sprachen nicht kontextfrei sind. Dabei
gehen wir nach demselben Schema vor wie in Kapitel 2 (vor 2.4.2). L sei die Sprache,
deren Nichtregularität bewiesen werden soll.
Schema für Nicht-Kontextfreiheits-Beweise:
[1] (Wörtlich) Beweis indirekt. Annahme: L ist kontextfrei.
[2] (Wörtlich) Dann gibt es ein n ≥ 1 mit den im Pumping-Lemma für kontextfreie
Sprachen (PL-kfS, Satz 4.4.1) behaupteten Eigenschaften.
[3] (Problemspezifisch) Wir wählen z ∈ L, mit |z| ≥ n.
(z muss man geschickt wählen, so dass Schritt [5] ausführbar ist.)
[4] (Wörtlich) Gemäß (PL-kfS) gibt es u, v, w, x, y derart dass
(i) z = uvwxy; (ii) |vwx| ≤ n; (iii) |v| + |x| ≥ 1 und
149
(iv) uv i wxi y ∈ L für alle i ≥ 0.
[5] (Problemspezifisch) Zeige nun, dass man für jede mögliche Position der Teilwörter
u, v, w, x, y in z ein i angeben kann, so dass uv i wxi y ∈
/ L ist.
(Hierfür muss man oft mehrere Fälle betrachten. Eventuell sind in verschiedenen
Fällen die benötigten i’s unterschiedlich.)
(Wörtlich) Dies ist der gewünschte Widerspruch.
Wir wenden dieses Beweisschema auf einige Beispiele an. Nur im ersten Beispiel markieren
wir die Teilschritte. Die behandelten Sprachen sind auch charakteristisch für 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äre kontextfrei. [2] Dann gibt es ein n ≥ 1 mit den
Eigenschaften wie in (PL-kfS). [3] Wir wählen 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,
(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üsste
vwx mindestens n + 2 Buchstaben haben, was (ii) widerspricht.)
1. Fall: vwx enthält kein c. Dann betrachten wir uv 0 wx0 y = uwy. Dieses Wort enthält
(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ält kein a. Dann betrachten wir uv 0 wx0 y = uwy. Dieses Wort enthält
(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 ähnlich zum ersten, dass man hier normalerweise analog“
”
schreiben würde.)
150
4.4.4 Bemerkung
(a) Es ist unwichtig, ob das leere Wort in der Sprache enthalten ist oder nicht; allgemeiner kann man immer eine endliche Anzahl von Wörtern hinzufügen oder entfernen,
ohne die Eigenschaft der Kontextfreiheit zu verändern. (Technisch werden wir dies
erst weiter unten sehen, siehe Abschnitt 5.6.) 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ür Behauptung 4.4.3 zeigen lässt. (Siehe Übung.)
(c) In Beispiel 3.1.9 haben wir eine monotone Grammatik für {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üher aufgestellten Behauptung, dass
die Chomsky-Hierarchie eine echte Hierarchie ist.
4.4.5 Behauptung
Die Sprache
L2 = {am bk cm dk | m, k ≥ 1}
ist nicht kontextfrei.
Beweis: Indirekt. Angenommen, L2 wäre kontextfrei. Dann gibt es ein n ≥ 1 mit den
Eigenschaften wie in (PL-kfS). Wähle 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 .
151
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üsste 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. Jedes Wort t ∈ L2 erfüllt aber |t|a + |t|b = |t|c + |t|d . 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üllt 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ält 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 ähnlichen Beweisen als nicht kontextfrei. Man versuche, das Muster zu erkennen: Kontextfreie Grammatiken können nicht beschreiben, dass in vier
Teilwörtern w1 , w2 , w3 , w4 von w, die voneinander abgegrenzt sind, die Längenbeziehung
|w1 | = |w3 | und |w2 | = |w4 |
gilt. Intuitiv gesagt liegt das daran, dass die Anordnung der Paare (w1 , w3 ) und
(w2 , w4 ) einander entsprechender Teilwörter nicht einer korrekten Klammerung entspricht.
(b) Im Gegensatz zu (a) bemerken wir, dass die Sprache
L′2 = {am bk ck dm | m, k ≥ 1},
die auf den ersten Blick sehr ähnlich 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örtern w1 , w2 , w3 , w4 von w, die voneinander
abgegrenzt sind, die Längenbeziehung
|w1 | = |w4 | und |w2 | = |w3 |
gilt. Hier sind die einander entsprechenden Teilwortpaare wie in korrekten Klammerausdrücken angeordnet.
152
(c) Auch L2 und die in (a) genannten Sprachen sind Chomsky-1-Sprachen. (Hier ohne
Beweis.)
4.4.7 Behauptung
Die Sprache
L3 = {w2w | w ∈ {0, 1}∗ }
über Σ = {0, 1, 2} ist nicht kontextfrei.
Beweis: Indirekt. Angenommen, L3 wäre kontextfrei. Dann gibt es ein n ≥ 1 mit den
Eigenschaften wie in (PL-kfS). Wähle 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ält die 2“ aus z. Dann enthält uv 0 wx0 y ü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ällen ergibt sich ein Widerspruch zu (iv).
4.4.8 Bemerkung Die in der letzten Behauptung notierte Eigenschaft, dass kontextfreie Grammatiken nicht erzwingen können, dass zwei Teilwörter 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}
153
ist nicht kontextfrei. Dies hat zur Folge, dass eine grundlegende Eigenschaft korrekter
Pascal- und Java-Programme nicht durch kontextfreie Grammatiken ausgedrückt werden
kann, nämlich das Prinzip, dass die Namen von Variablen, die benutzt werden, zuvor
deklariert worden sein müssen. Bedingungen dieser Art werden daher stets zusätzlich
zu der formalen Grammatik angegeben.
4.4.9 Behauptung
Die Sprache
2
L4 = {0n | n ≥ 1}
ist nicht kontextfrei.
Beweis: Indirekt. Angenommen, L4 wäre kontextfrei. Dann gibt es ein n ≥ 1 mit den Ei2
genschaften wie in (PL-kfS). Wähle nun z = 0n ∈ L4 . Nach (PL-kfS) gibt es u, v, w, x, y ∈
Σ∗ derart dass für z (i)–(iv) erfüllt sind. Nun ist aber
2 +|v|+|x|
uv 2 wx2 y = 0n
2 +k
= 0n
für 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äuft genauso wie der Beweis von Behauptung 2.4.2(b), wo wir gesehen haben, dass L3 nicht regulär ist. Dies ist charakteristisch für Sprachen über einem einelementigen Alphabet: Ein Nichtregularitätsbeweis mit dem Pumping-Lemma für reguläre Sprachen führt sofort zu einem fast
gleichlautenden Beweis der Nicht-Kontextfreiheit, wenn wir das Pumping-Lemma
für kontextfreie Sprachen benutzen.
(b) Tatsächlich gilt:
L ⊆ Σ∗ , |Σ| = 1, L ∈ L2 ⇒ L ∈ L3 .
Es gibt also überhaupt keine kontextfreien Sprachen über einem einelementigen
Alphabet, die nicht regulär sind. Der Beweis dieser Aussage ist etwas aufwendiger
– er benutzt übrigens das Pumping-Lemma 4.4.1 – und nicht Stoff der Vorlesung.
Zum Schluss dieses Abschnittes formulieren wir eine verstärkte Version des PumpingLemmas für kontextfreie Sprachen, das in Beweisen für Nicht-Kontextfreiheit oft zum
Ziel führt, wenn die Anwendung des einfachen Pumping-Lemmas mühsam oder nicht
möglich ist. Diese Aussage nennt man nach seinem Urheber das Lemma von Ogden“.
”
Bei der Anwendung dieses Lemmas per Schema dürfen wir in Schritt [3] nicht nur z wählen,
sondern in z auch n uns günstig erscheinende Buchstaben in z markieren“ (unterstrei”
chen, rot einfärben). Die Zerlegung in u, v, w, x, y, die wir in Schritt [5] bearbeiten
154
müssen, hat die Eigenschaft, dass entweder v oder x mindestens einen der markierten
Buchstaben enthält.
Wir formulieren das Lemma und das resultierende Beweisschema. Auf einen Beweis des
Lemmas von Ogden verzichten wir hier. Dieser Beweis ist sehr ähnlich zu dem für das
Pumping-Lemma für kontextfreie Sprachen (Satz 4.4.1).
4.4.11 Satz (Lemma von Ogden) Wenn L eine kontextfreie Sprache über Σ ist,
dann gibt es eine Zahl n ≥ 1, für die folgendes gilt: Wenn z ein Wort in L ist, in dem n
Buchstabenpositionen markiert“ sind, dann gibt es Wörter 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 für Nicht-Kontextfreiheits-Beweise mit dem Lemma von Ogden:
[1] (Wörtlich) Beweis indirekt. Annahme: L ist kontextfrei.
[2] (Wörtlich) Dann gibt es ein n ≥ 1 mit den im Lemma von Ogden (Satz 4.4.11)
behaupteten Eigenschaften.
[3] (Problemspezifisch) Wähle z ∈ L, mit |z| ≥ n, und markiere n Buchstaben
in z.
(z und die Markierungspunkte werden so gewählt, dass Schritt [5] gut ausführbar
ist.)
[4] (Wörtlich) Gemäß (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ür alle i ≥ 0.
[5] (Problemspezifisch) Zeige nun, dass man für jede nach (ii) noch mögliche
Position der Teilwörter u, v, w, x, y in z ein i angeben kann, so dass uv i wxi y ∈
/L
ist.
(Wörtlich) Dies ist der gewünschte Widerspruch.
4.4.12 Behauptung
Die Sprache
L4 = {ak bl cm | k ≥ l ≥ m ≥ 0}
ist nicht kontextfrei.
155
Beweis: Indirekt. Angenommen, L4 wäre kontextfrei. Dann gibt es ein n ≥ 1 mit den
Eigenschaften wie im Lemma von Ogden. Wähle 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ält 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ält zwei verschiedene Buchstaben. Das führt 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ält.
3. Fall: x besteht aus a’s. Dann besteht vx nur aus a’s, und uv 0 wx0 y enthält 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ält weniger a’s als c’s, also ist uv 0 wx0 y nicht in L4 , Widerspruch.
5. Fall: x besteht aus c’s. Führt analog zum 4. Fall zu einem Widerspruch.
Eine alternative Sicht auf Beweise mit dem Pumping-Lemma:
Ein Spiel-Schema
Es gibt eine Formulierung für Beweise mit dem Pumping-Lemma, die es vermeidet, die
Stichwörter Annahme“ und Widerspruch“ zu benutzen, die zu unserem Beweisschema
”
”
gehören. Diese Formulierung formuliert den Beweis als ein Spiel, das wir (die Beweiser“,
”
Spieler B), gegen einen Gegner (Spieler G) spielen. Auch hier sind die Züge zum Teil
mechanisch, zum Teil erfordern sie etwas Einfallsreichtum.
Gegeben ist eine Sprache L. Die zu beweisende Behauptung ist: L ist nicht kontextfrei.
Spiel-Schema
Runde 1: G gibt uns eine Zahl n ≥ 1.
Runde 2: (B) Wir wählen (geschickt) ein z ∈ L mit |z| ≥ n
(∗ so dass wir in Runde 4 immer gewinnen ∗)
156
Runde 3: G gibt uns u, v, w, x, y mit
(i) z = uvwxy, (ii) |vwx| ≤ n und (iii) |v| + |x| ≥ 1 .
(∗ Wir wissen nicht genau, wie u, v, w, x, y in z liegen. ∗)
Runde 4: (B) Wir wählen, abhängig von u, v, w, x, y, ein i und zeigen, dass uv i wxi y ∈
/
L.
(∗ Normalerweise muss man hier einige Fälle betrachten. ∗)
Wenn man sich das Spiel-Schema ansieht, erkennt man, dass keine Komponenten eines
indirekten Beweises (wie Annahme“ und Dies ist ein Widerspruch“) mehr vorkommen.
”
”
Allerdings hat sich die Schwierigkeit, die darin liegt, ein gutes z zu wählen und in Runde
4 für alle Möglichkeiten von u, v, w, x, y zu zeigen, dass man ein passendes i finden kann,
gegenüber dem gewöhnlichen Schema nicht verändert.
Wir demonstrieren die Benutzung des Spielschemas an einem Beispiel.
Beh.: Die Sprache L = {0n 12n 23n | n ≥ 0} ist nicht kontextfrei.
Wir beweisen dies mit dem Spielschema.
Runde 1: G gibt uns eine Zahl n ≥ 1.
Runde 2: Wir (B) wählen z = 0n 12n 23n .
Es ist klar, dass |z| = 6n ≥ n ist.
Runde 3: G gibt uns u, v, w, x, y mit
(i) x = uvwxy, (ii) |vwx| ≤ n und
(iii) |v| + |x| ≥ 1 .
Runde 4: Unsere (B) Aufgabe ist es, nun zu zeigen, dass es ein i ∈ N gibt derart dass
uv i wxi y ∈
/ L ist. Da wir nicht wissen, wie u, v, w, x, y in z liegen, müssen wir
mehrere Möglichkeiten betrachten.
Zuerst benutzen wir, dass |vwx| ≤ n ist und folgern, dass vwx entweder den Buchstaben 0 nicht enthält oder den Buchstaben 2 nicht enthält. (Sonst müsste vwx alle
1en und zudem eine 0 und eine 2 enthalten, hätte also Länge mindestens 2n+2 > n.)
1. Fall: vwx enthält keine 2. – Setze i = 0. Dann gilt für uv 0 wx0 y = uwz folgendes:
|uwy|0 + |uwy|1 = 3n − (|v| + |x|) < 3n, aber |uwy|2 = 3n. Daher kann uwy kein
Element von L sein.
2. Fall: vwx enthält keine 0. – Setze i = 0. Dann gilt für uv 0 wx0 y = uwz folgendes:
|uwy|0 = n, aber |uwy|1 + |uwy|2 = 5n − (|v| + |x|) < 5n. Daher kann uwy kein
Element von L sein.
Wir verzichten auf den formalen Beweis dafür, dass die korrekte Vervollständigung des
Spielschemas in Runden 2 und 4 für eine Sprache L hinreichend dafür ist, zu zeigen, dass
L nicht kontextfrei ist. Man sieht aber, dass man im Spielschema eigentlich nichts anderes
macht als in den gewöhnlichen Beweisen nach dem Schema mit den indirekten Beweisen:
157
wähle (geschickt) ein z und beweise dann für eine beliebige Zerlegung von z in u, v, w, x,
y, die (i), (ii), (iii) erfüllt, dass es ein i mit uv i wxi y ∈
/ L geben muss.
Bemerkung: Entsprechend modifizierte Spiel-Schemata sind auch geeignet, Nicht-Kontextfreiheits-Beweise mit dem Lemma von Ogden und Nicht-Regularitäts-Beweise mit dem
Pumping-Lemma für reguläre Sprachen durchzuführen.
4.5
Der Cocke-Younger-Kasami-Algorithmus
In diesem Abschnitt betrachten wir das Wortproblem für kontextfreie Grammatiken, d. h.
das Problem, für eine vorgelegte kontextfreie Grammatik G = (V, Σ, S, P ) und ein Wort
w ∈ Σ∗ zu entscheiden, ob w ∈ L(G) gilt oder nicht. Wir können annehmen, dass G
in Chomsky-Normalform vorliegt (andernfalls wenden wir den Umbau-Algorithmus aus
Abschnitt 4.3 an). Falls w = ε, müssen wir nur prüfen, ob S → ε eine Produktion in P
ist. Also interessieren uns nur Wörter w 6= ε. In Ableitungen für ein solches w können
keine ε-Produktionen vorkommen. Wir beschränken uns also auf die Produktionen in P ,
die die Form A → BC oder A → a haben, mit A, B, C ∈ V , a ∈ Σ.
Wir benutzen das Prinzip der dynamischen Programmierung , das in der Vorlesung
Effiziente Algorithmen“ genauer behandelt wird.
”
Es sei w = a1 · · · an ∈ Σ∗ gegeben, n ≥ 1. Wir wollen für 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ür 1 ≤ d ≤ n, 1 ≤ i ≤ n − d + 1.
Offenbar ist w ∈ L(G) genau dann wenn S ∈ Un,1 . Wir überlegen nun, wie die Ud,i durch
Induktion über d = 1, 2, . . . , n berechnet werden können.
∗
Induktionsanfang d = 1: Weil G in Chomsky-Normalform ist, gilt A ⇒ a für A ∈ V ,
a ∈ Σ genau dann wenn A → a in P ist. Also:
U1,i = {A ∈ V | A → ai }, für 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ätter. Die Wurzel muss zwei Nachfolger haben, die mit Variablen (etwa C und
D) beschriftet sind. Schematisch sieht das so aus:
158
A
C
D
TD
TC
w’’
w’
Die beiden Teilbäume von T heißen TC und TD , und wir setzen w′ := α(TC ), w′′ := α(TD ).
Offenbar gilt:
∗
∗
C ⇒ w′ , D ⇒ w′′ , v = w′ w′′ , und 1 ≤ |w′ |, |w′′ | < d ,
und A → CD ist Produktion.
(4.1)
Umgekehrt überlegt man sich leicht, anhand desselben Bildes, dass aus der Situation (4.1)
∗
folgt, dass A ⇒ v. – Wir haben also, für A ∈ V :
∗
A ⇒ ai · · · ai+d−1
⇔
∃C, D ∈ V ∃d′ : 1 ≤ d′ < d − 1 und
∗
∗
C ⇒ ai · · · ai+d′ −1 , D ⇒ ai+d′ · · · ai+d−1
und A → CD ist Produktion .
Damit erhalten wir folgende Rekursionsformel für die Mengen Ud,i :
Ud,i = {A ∈ V | ∃C, D ∈ V ∃d′ : 1 ≤ d′ < d und
A → CD ist Produktion und
C ∈ Ud′ ,i und D ∈ Ud−d′ ,i+d′ }.
Aus der Rekursionsformel ergibt sich der folgende iterative Algorithmus zur Lösung des
Wortproblems für eine Grammatik G in Chomsky-Normalform.
Eingabe: Grammatik G = (V, Σ, S, P ) in Chomsky-Normalform, w = a1 · · · an ∈ Σ∗ .
Falls w = ε, prüfe, 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ür 1 ≤ d ≤ n, 1 ≤ i ≤ n − d + 1.
(Nur diese Einträge in U werden benutzt. d ist die Länge des betrachteten Teilworts, i
die Position des ersten Buchstabens.)
Methode:
1. U [1, i] := {A | A → ai ist Produktion }, für 1 ≤ i ≤ n.
159
2. for d := 2 to n do
for i := 1 to n − d + 1 do
for d′ := 1 to d − 1 do
U [d, i] := U [d, i] ∪ {A ∈ V | es gibt eine Produktion A → CD
und C ∈ U [d′ , i], D ∈ U [d − d′ , i + d′ ]} .
3. Falls S ∈ U [n, 1], gib
JA“ aus, sonst NEIN“.
”
”
Die Korrektheit des Algorithmus folgt aus den vorher angestellten Überlegungen. Die
Laufzeit ist O(n3 ) – dabei geht die Größe der Grammatik G in die in dem O“ versteckte
”
Konstante ein.
Wenn man den CYK-Algorithmus von Hand ausführt, verwendet man ein dreieckiges
Schema, dessen Felder den relevanten Einträgen 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.
i=
w=
1
a1
2
a2
. . . . .
n
an
d =1
2
...
...
...
n
Die Einträge werden zeilenweise berechnet. Die Einträge in Zeile d = 1 ergeben sich direkt
aus den Produktionen der Form A → a. Um die Variablen in Zelle (d, i) für d > 1 zu
berechnen, betrachtet man Paare von schon ausgefüllten Zellen nach folgendem Muster,
etwa für d = 5, i = 2:
160
i=
w=
1
a1
2
a2
d =1
1
2
2
3
3
4
4
5
*
n
an
. . . . .
4
3
2
1
n= 6
Abbildung 4.20: Ein Schritt im CYK-Algorithmus, zu bearbeitende Zellen
Für d′ = 1, . . . , d − 1 prüft man für jede Produktion A → CD der Grammatik, ob C in
Zelle (i, d′ ) und D in Zelle (i + d′ , d − d′ ) vorkommt. (Falls dies so ist, wird A in die Zelle
(d, i) eingetragen.) In Abb. 4.20 wird die Zelle (2, 5) ausgefüllt. Zusammengehörige Zellen
(i, d′ ) und (i + d′ , d − d′ ) sind mit den gleichen eingekreisten Zahlen markiert. Die Zellen
(i, d′ ) bilden im Schema eine Teil-Spalte, die Zellen (i + d′ , d − d′ ) eine Teil-Diagonale.
Zum Beispiel muss man testen, ob es eine Produktion A → CD gibt, derart dass C in
Zelle (3, 2) und D in Zelle (2, 5) steht (mit eingekreister 3“ markiertes Zellenpaar). Die
”
schraffierten Dreiecke deuten an, welche Teilwörter betroffen sind, wenn 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ästchens an.)
161
d=1
0
0
1
0
0
1
1
1
0
1
0
1
1
0
1
0
A
A
B
A
A
B
B
B
A
B
A
B
B
A
B
A
S
2
S
D
3
4
S
5
D
6
S
7
D
8
S
S
S
D
S
S
Abbildung 4.21: Anwendung des CYK-Algorithmus auf zwei Wörter
Es ergibt sich, dass w1 in L(G) ist, w2 dagegen nicht.
Durch eine leichte Erweiterung der Datenstruktur ist es auch möglich, den Algorithmus
so auszubauen, dass im Falle w ∈ L(G) eine Ableitungsfolge oder ein Ableitungsbaum für
w ausgegeben wird: Dazu notiert man für jede eingetragene Variable A die Produktion
A → BC, die zum Eintrag geführt hat, und den Wert d′ , der zu diesem Eintrag gehört. Mit
diesen Informationen lässt sich, von dem S in Kästchen (d, 1) beginnend, ein Ableitungsbaum aufbauen. Ebenso ist leicht feststellbar, ob das Wort w mehrere Ableitungen besitzt:
Wenn in ein Kästchen (i, d) dieselbe Variable A ein zweites Mal eingetragen wird, bedeu∗
tet dies, dass es zwei verschiedene Ableitungsbäume für die Ableitung A ⇒ ai · · · ai+d−1
gibt. Wenn ein solcher Eintrag im weiteren Verlauf dazu beiträgt, dass die Variable S in
das Kästchen (n, 1) eingetragen wird, dann gibt es für das Eingabewort zwei verschiedene
Ableitungen.
Wir betrachten nochmals zwei Beispieleingaben für die Grammatik aus Beispiel 4.4.2:
w3 = 01001101 und w4 = 01010111. Die entsprechenden Eintragungen im Schema finden
sich in Abb. 4.22.
162
d=1
0
1
0
0
1
1
0
1
0
1
0
1
0
1
1
1
A
B
A
A
B
B
A
B
A
B
A
B
A
B
B
B
1
2
S
2
S
S
S
D
3
S
D
S
4
S
S
D
5
2
6
S
1
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äume besitzt. Die beiden Paare von
Variablen S, die zu je einem Eintrag S“ in Kästchen (8, 1) führen, sind mit Indizes 1
”
bzw. 2 markiert. Das Schema für w4 weist ebenfalls 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 ∈ L(G). Für festes G ist die Laufzeit des
Algorithmus O(n3 ), für |w| = n. (Die Größe und Struktur der Grammatik G geht in die
im O“ versteckte Konstante ein.)
”
Es sei angemerkt, dass die Laufzeit O(n3 ) für die Analyse und Übersetzung 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äuterungen hierzu finden sich im
folgenden Kapitel 5, und Details in einer Vorlesung Übersetzerbau“.
”
4.6
Abschlusseigenschaften kontextfreier Sprachen I
Wir diskutieren hier zunächst einige Operationen, unter denen die Klasse L2 der kontextfreien Sprachen abgeschlossen ist. Die Beweistechniken für diese positiven Abschlusseigen163
schaften können auch gut für den Entwurf von kontextfreien Grammatiken für 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ächst Vereinigung und Konkatenation.
Es sei L1 = L(G1 ), L2 = L(G2 ) für kontextfreie Grammatiken G1 = (V1 , Σ1 , S1 , P1 ) und
G2 = (V2 , Σ2 , S2 , P2 ). O. B. d. A. können wir annehmen, dass V1 ∩ V2 = ∅. (Gegebenenfalls
benennt man Variablen um.) Dann definieren wir neue Grammatiken G′ und G′′ durch
Zusammenwerfen von P1 und P2 und Verbinden der beiden Teile durch eine passend
gewählte Startproduktion. Hierzu wählen wir eine neue Startvariable S 6∈ V1 ∪ V2 .
G′ := (V1 ∪ V2 ∪ {S}, Σ1 ∪ Σ2 , S, P1 ∪ P2 ∪ {S → S1 | S2 })
G′′ := (V1 ∪ V2 ∪ {S}, Σ1 ∪ Σ2 , S, P1 ∪ P2 ∪ {S → S1 S2 }).
Man überzeugt sich leicht, dass L(G′ ) = L1 ∪ L2 und L(G′′ ) = L1 L2 gilt.
Nun betrachten wir den Kleene-Abschluss. Gegeben sei eine kontextfreien Grammatik G =
(V, Σ, S, P ). Wir wählen eine neue Variable S ′ , S ′ 6∈ V , und definieren eine kontextfreie
Grammatik G′′′ wie folgt:
G′′′ := (V ∪ {S ′ }, Σ, S ′ , P ∪ {S ′ → S S ′ | ε}).
Wieder ist leicht zu sehen, dass L(G′′′ ) = 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 | ε. Offenbar ist L(G1 ) = {0n 1n | n ≥ 0} und L(G2 ) = {1n 0n | n ≥ 0}.
Eine Grammatik für 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 | ε
164
Eine Grammatik für die Sprache
L(G1 )L(G2 ) = {0n 1n 1m 0m | n, m ≥ 0} = {0n 1n+m 0m | n, m ≥ 0}
hat Startvariable S und Produktionen
S → AB
A → 0A1 | ε
B → 1B0 | ε
Schließlich sieht eine Grammatik für die Sprache
L(G1 )∗ = {0n1 1n1 · · · 0nr 1nr | r ≥ 0, n1 , . . . , nr ≥ 0}
wie folgt aus: Startvariable S, Produktionen
S → AS | ε
A → 0A1 | ε
Für 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.
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ählt Grammatiken G1 , . . . , Gn (mit Startvariablen S1 , . . . , Sn ) und G für
die Sprachen f (a1 ), . . . , f (an ) und L und sorgt dafür, dass die Variablenmengen in diesen
Grammatiken disjunkt sind. Dann ersetzt man für 1 ≤ i ≤ n in G das Teminalzeichen
ai durch eine neue Variable Di , vereinigt alle Produktionenmengen, und fügt 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üssen 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}.
165
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 = L′1 ∪ L′2 ∪ L′3 ∪ L′4 ,
wobei
L′1
L′2
L′3
L′4
=
=
=
=
{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 L′1 , . . . , L′4 sind alle kontextfrei – zum Beispiel wird L′1 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∗ ) ist regulär. Da die regulären Sprachen unter Komplementbildung
abgeschlossen sind, ist auch Σ∗ − L(a∗ b∗ c∗ ) regulär. 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örter, die weder in Σ∗ −
L(a∗ b∗ c∗ ) noch in L3 sind. Dies sind also die Wörter der Form ai bj ck , die i = j und j = k
erfüllen. Das heißt:
L4 = {am bm cm | m ≥ 0},
die Sprache, die nach Behauptung 4.4.3 und Bemerkung 4.4.4 nicht kontextfrei ist.
166
Kapitel 5
Kellerautomaten
In diesem Kapitel behandeln wir das Maschinenmodell, das den kontextfreien Grammatiken entspricht, nämlich die nichtdeterministischen Kellerautomaten. Anhand des Modells
werden verschiedene Prinzipien für die Syntaxanalyse diskutiert, d. h. die Erstellung eines
Ableitungsbaumes zu einem vorgelegten Wort aus L(G): Top-Down-Parsing und BottomUp-Parsing. Weiter wird auf die deterministische Variante des Kellerautomaten-Modells
und die zugehörige Sprachklasse eingegangen. Schließlich werden wesentliche Abschlussund Entscheidbarkeitseigenschaften der entsprechenden Sprachklassen diskutiert.
5.1
Nichtdeterministische Kellerautomaten
Was passiert mit der Berechnungsstärke von endlichen Automaten, wenn sie zusätzlich
zur Steuereinheit 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ässt 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ür last-in-first-out-Speicher. Diese Struktur wird im 1. Semester in der Lehrveranstaltung Algorithmen und Programmierung“ besprochen.
”
167
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ühren. Wir werden hier sehen, dass alle von kontextfreien Grammatiken
erzeugbaren Strukturen von Automaten mit einem Keller analysiert werden können.
Anschaulich gesprochen besteht ein Kellerautomat 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 gibt ein
Beispiel.
168
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önnen die Elemente eines Keller-Alphabets“ Γ
”
gespeichert werden. Anfangs steht im Keller ein besonderes Zeichen, das Keller-Anfangs”
Symbol“. Die Eingabe für 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ände,
von denen einer als Startzustand ausgezeichnet ist.
Der Kellerautomat rechnet in Schritten. In einem Schritt rückt der Kopf auf dem Eingabeband entweder um ein Feld nach rechts oder ändert seine Position nicht (letzteres nennen
wir einen ε-Zug“). Wenn das Eingabewort vollständig 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 Z wird vom Keller entfernt und gemerkt (pop-Operation).
2. Es wird entweder das nächste Symbol ai des Eingabewortes gelesen (dann rückt
der Lesekopf um ein Feld nach rechts) oder nichts vom Eingabeband gelesen (der
Lesekopf bewegt sich nicht: ε-Zug).
3. Das Kellerzeichen Z, der gegenwärtige Zustand q und (falls kein ε-Zug vorliegt) das
Zeichen ai zusammen legen fest, welche Züge ausführbar sind. Ein Zug besteht dabei
aus
– einem neuen Zustand q ′ ;
169
– einer Folge γ = Z1 · · · Zr von Kellerzeichen, die auf den Keller gelegt werden:
Der Keller verändert sich gemäß der Operationsfolge
push(Zr ); push(Zr−1 ); . . . ; push(Z1 ).
Einer der ausführbaren Züge wird durchgeführt.
In einer gegebenen Situation können in Teilschritt 3. kein, ein, oder mehrere verschiedene
Züge ausführbar sein. Die hier betrachteten Kellerautomaten sind also nichtdeterministisch. Daher sind, wie bei NFA’s, eventuell auf einer Eingabe viele verschiedene Berechnungen möglich.
Per Konvention legen wir fest, dass der Kellerautomat mit leerem Keller akzeptiert“,
”
d. h. eine Berechnung des Kellerautomaten auf einer Eingabe x = a1 · · · an akzeptiert, falls
nach Lesen aller Zeichen der Eingabe und Durchführung entsprechender Züge der Keller
völlig geleert ist. Man beachte, dass nach völligem Entleeren des Kellers kein weiterer
Schritt möglich ist (Teilschritt 1. kann nicht durchgeführt werden) und dass nach Lesen
des letzten Eingabezeichens an nur noch ε-Züge möglich sind.
Die alternative Möglichkeit, über akzeptierende Zustände zu akzeptieren, wird später
besprochen.
5.1.1 Beispiel
Palindrome (Spiegelwörter) über {a, b, c} mit Mittezeichen.
Wir beschreiben die Funktionsweise einen Kellerautomaten, der genau die Wörter der
(nicht regulären) Sprache
L = {w#wR | w ∈ {a, b, c}∗ }
akzeptiert. Zunächst 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 der Reihe nach mit den
”
Kellerzeichen verglichen.
Die Steuereinheit wird benutzt, um zwischen den Phasen ( L“ für links“, R“ für rechts“)
”
”
”
zu unterscheiden. Wenn in der Kontrollphase ein weiteres #“ auftaucht, bricht die Rech”
nung ab; die Eingabe wird nicht akzeptiert.
170
Beginn:
Eingabeband:
c a
c b
b
c # c
Lesekopf
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
171
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änden,
• Σ, dem Eingabe-Alphabet;
• Γ, dem Keller-Alphabet (Stack-Alphabet)
• q0 ∈ Q, dem Startzustand
• Z0 ∈ Γ, dem Symbol, das anfangs im Keller steht
172
• δ : Q × (Σ ∪ {ε}) × Γ → P<∞ (Q × Γ∗ ), der (nichtdeterministischen) Übergangsfunktion.
(Dabei steht P<∞ (R) für {T ⊆ R | T endlich}, für beliebige Mengen R.)
Wir erläutern die Details und die Anwendung der Übergangsfunktion δ. 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 ′ , Z1 · · · Zr ), q ′ Zustand, r ≥ 0, Z1 , . . . , Zr
Buchstaben aus Γ. Jedes solche Paar beschreibt einen möglichen 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öglich, der a liest. Wird der Zug
(q ′ , Z1 · · · Zr ) angewendet,
• geht der Automat in den neuen Zustand q ′ über,
• das Eingabezeichen a wird gelesen,
• der Lesekopf wird um ein Feld nach rechts gerückt,
• 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(Zr ); push(Zr−1 ); . . . ; push(Z1 ).
Bemerkung: Mit r = 0 wird das oberste Kellersymbol gestrichen. Mit r = 1 und Z1 = Z
bleibt der Keller unverändert. Mit r ≥ 2 und Zr = Z werden Z1 , . . . , Zr−1 auf den Keller
gestapelt.
Neben den Zügen, die einen Buchstaben lesen, gibt es die ε-Züge, die durch die Werte δ(q, ε, Z) gegeben sind. Auch δ(q, ε, Z) ist jeweils eine endliche, möglicherweise leere,
Menge von Zügen. Wenn der Automat in Zustand q ist und das oberste Kellerzeichen
Z ist, kann einer der Züge aus δ(q, ε, Z) ausgeführt werden. Wenn der Zug (q ′ , Z1 · · · Zr )
ausgeführt wird, geht der Automat in den Zustand q ′ über und ersetzt das oberste Kellerzeichen Z durch Z1 · · · Zr . Der Lesekopf verändert seine Position nicht.
Beachte: In einer Situation, in der M in Zustand q ist, das nächste Eingabezeichen a ist
und das oberste Kellerzeichen Z ist, ist jeder der Züge aus δ(q, a, Z)∪δ(q, ε, Z) anwendbar.
Wir sagen (vorerst informal), dass M ein Wort x akzeptiert, wenn es möglich ist, aus
der Startsituation (Zustand q0 , Kellerinhalt Z0 , x als Inhalt des Eingabebands) durch
Anwendung einer von δ erlaubten Folge von Zügen das Eingabewort vollständig 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}
173
• Σ = {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)
(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 ′ , γ) für die Einermenge {(q ′ , γ)}; der Strich – “
”
steht für ∅. Die Zeilen für die ε-Züge sind weggelassen, da δ(q, a, Z) = ∅ ist für alle
a, q, Z, also überhaupt keine ε-Züge möglich sind.
Man sieht, dass die Übergangsfunktion deterministisch ist in dem Sinn, dass in jeder Situation entweder ein oder kein Zug möglich ist. Dies ist von der Definition nicht verboten.
Das Anfangs-Keller-Zeichen wird im ersten Leseschritt gelöscht.
Man überzeuge sich durch Testen auf einigen Eingabewörtern, 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ändiges Lesen des Eingabeworts, Leeren des Kellers). Situationen, die zu einem fehlerhaften Anhalten führen,
sind:
• Leeren des Kellers, bevor das Eingabewort vollständig 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üge
• (L, AB) ∈ δ(L, a, B) (Hinzufügen von A“ im Keller),
”
• (L, A) ∈ δ(L, #, A) (Keller bleibt unverändert),
• (R, ε) ∈ δ(L, a, A) (Löschen des Kellersymbols A“ nach Abgleich mit dem Einga”
bezeichen a).
174
Alternativ zur Tabellendarstellung kann man für den Entwurf und für die Beschreibung
der Übergangsfunktion für (kleine) NPDA’s auch eine graphische Darstellung benutzen.
In Abb. 5.3 ist eine solche Darstellung für 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ür jeden
Zustand q ∈ Q einen Knoten, der mit q beschriftet ist. Der Knoten für den Startzustand
q0 ist mit einem Pfeil gekennzeichnet. Falls (q ′ , Z1 · · · Zr ) ∈ δ(q, a, Z), verläuft eine Kante
von q nach q ′ , die mit
a, Z | Z1 · · · Zr
beschriftet ist. Dabei werden Mehrfachkanten zu einer zusammengefasst, die mit einer
Liste von Beschriftungen versehen ist; weitere Abkürzungen für ähnliche Übergänge sind
möglich.
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ält genau die Palindrome (Spiegelwörter) über {a, b, c}, die gerade Länge haben.
Zum Beispiel sind ε, aaaa und abbccbba in dieser Sprache, nicht hingegen aca und abca.
Die Idee für einen NPDA, der die Wörter dieser Sprache akzeptiert, ist die folgende. Der
Automat arbeitet in zwei Phasen.
Lesephase: (Zustand L“) Die gelesenen Zeichen werden im Keller gespeichert.
”
175
Kontrollphase: (Zustand R“) Die gelesenen Zeichen werden mit den Kellerzeichen ver”
glichen.
Da das Eingabewort keine Markierung für das Umschalten von der Lese- zur Kontrollphase
enthält, benutzen wir hierfür den Nichtdeterminismus: Jederzeit während der Lesephase
kann der NPDA nichtdeterministisch wählen, ob das nächste 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ür Palindrome gerader Länge
176
Nun hat in dieser Tabelle jeder Eintrag δ(q, a, Z) und δ(q, ε, Z) Größe 1 oder Größe 0. Wo
ist die nichtdeterministische Enscheidungsmöglichkeit? Wenn zum Beispiel der Zustand L
und das oberste Kellerzeichen A ist, und der nächste Buchstabe auf dem Eingabeband das
b, dann kann der NPDA zwischen den Zügen (L, BA) ∈ δ(L, b, A) und (R, A) ∈ δ(L, ε, A)
wählen.
Man finde für 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ät! Wie sieht die erfolgreiche Berechnung für die Eingabe ε aus?
Um das Verhalten von NPDA’s formal zu erfassen, ohne nichtmathematische Gegenstände
wie Leseköpfe oder Kellerspeicher zu erwähnen, benutzen wir das Konzept der Konfigurationen. Dieses Vorgehen ist typisch und beispielhaft für die exakte Beschreibung der
Semantik von Systemen, die in Schritten rechnen und Speicher- oder Steuer-Zustände
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ärtige Zustand, w ist das noch nicht gelesene Suffix des Eingabewortes (w wird oft auch Restwort“ genannt), α = Y1 · · · Yr ∈ Γ∗ , r ≥ 0, ist der
”
Kellerinhalt – Y1 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 natürlich eine unendliche Menge.)
(b) Wenn k = (q, au, Zγ) Konfiguration ist, mit q ∈ Q, a ∈ Σ, u ∈ Σ∗ , Z ∈ Γ und
γ ∈ Γ∗ ,
und wenn zudem (q ′ , Z1 · · · Zr ) ∈ δ(q, a, Z) ist, dann nennen wir k ′ = (q ′ , u, Z1 · · · Zr γ)
eine direkte Nachfolgekonfiguration von k und schreiben
k ⊢M k ′ oder k ⊢ k ′ ;
weiterhin: wenn k = (q, u, Zγ) Konfiguration ist, mit q ∈ Q, u ∈ Σ∗ , Z ∈ Γ und
γ ∈ Γ∗ ,
und wenn zudem (q ′ , Z1 · · · Zr ) ∈ δ(q, ε, Z) ist, dann nennen wir k ′ = (q ′ , u, Z1 · · · Zr γ)
eine direkte Nachfolgekonfiguration von k und schreiben
k ⊢M k ′ oder k ⊢ k ′ .
Damit ist ⊢M eine zweistellige Relation auf KM .
177
(c) Die Relation ⊢∗M , oder kurz ⊢∗ , ist die reflexive und transitive Hülle von ⊢ (siehe
Beispiel A.2.14 im Anhang), das heißt: k ⊢∗M k ′ ⇔ es existiert eine Folge k0 =
k, . . . , kl = k ′ , l ≥ 0, derart dass ki−1 ⊢ ki , für 1 ≤ i ≤ l.
(Dies bedeutet, dass k = k ′ ist oder dass man in einer Reihe von legalen Schritten
von der Konfiguration k zur Konfiguration k ′ kommen kann.)
(d) M akzeptiert x ∈ Σ∗ , falls (q0 , x, Z0 ) ⊢∗M (q, ε, ε) für 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. Der erreichte Zustand ist irrelevant.)
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 Übergänge können legal sein.)
(L, abc, BBC⊥A) ⊢M (L, bc, ABBC⊥A) (Es kommt nicht darauf an, ob k und k ′ in
echten Berechnungen vorkommen.)
(R, aabbc, BBC) hat keine Nachfolgekonfiguration.
(R, aabbc, ε) hat keine Nachfolgekonfiguration. (Allgemein gilt: Eine Konfiguration mit
leerem Keller hat keine Nachfolgekonfiguration.)
Eine legale Berechnung dieses NPDA, die zur gewünschten akzeptierenden Konfiguration
führt, ist folgende:
⊢
⊢
⊢
⊢
⊢
(L, cbbc, ⊥)
(L, bbc, C)
(L, bc, BC)
(R, bc, BC)
(R, c, C)
(R, ε, ε).
178
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ührt in eine Sackgasse“, eine Konfiguration ohne Nachfolgekonfigura”
tion. Obgleich solche Sackgassen existieren, gehört das Wort x = cbbc zur Sprache LM :
eine akzeptierende Berechnung genügt 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öglichen Berechnungen auf Eingabe abbbba
Um dies zu verdeutlichen, geben wir in Abb. 5.5 den Baum aller möglichen legalen Berechnungen auf dem Eingabewort abbbba an. Sechs dieser Berechnungen enden in einer
Sackgasse, aber eine erreicht die akzeptierende Konfiguration (R, ε, ε). Dies genügt, um
abbbba ∈ LM zu folgern. Wenn ein Wort x nicht in LM ist, dann enthält der Baum aller
möglichen Berechnungen keine einzige Berechnung, die in der akzeptierende Konfiguration
(R, ε, ε) endet. (Man zeichne den entsprechenden Baum für die Eingabe abbb!)
5.1.6 Beispiel Zu guter Letzt wollen wir noch einen NPDA für die Sprache der korrekten Klammerausdrücke 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}
179
Die Idee für den NPDA ist ganz einfach: Wir merken uns im Keller (in Unärdarstellung)
die Anzahl der gelesenen offenen“ Klammern, für die noch kein schließendes Gegenstück
”
aufgetaucht ist. Das heißt: Beim Lesen eines (“ wird der Kellerstand um 1 erhöht, 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äfix des Eingabewortes
”
gesehen, das für sich ein korrekter Klammerausdruck ist.) Hierfür benutzen wir folgenden
Trick: Das Kellerendezeichen ⊥ wird nicht gelöscht. 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 ε-Übergang, der das ⊥ löscht,
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ür korrekte Klammerausdrücke
180
5.2
Top-Down-Parsing, LL-Parsing
Wir wollen zunächst anhand eines Beispiels überlegen, dass Wörter zu kontextfreien
Grammatiken mit Kellerautomaten verarbeitet werden können. Dazu betrachten wir die
Grammatik G = (V, Σ, S, P ) mit V = {S}, Σ = {(, )} und P = {S → (S)S | ε}, die
nach Proposition 4.2.8 die korrekten Klammerausdrücke erzeugt. Der Kellerautomat hat
Bandalphabet Σ, Kelleralphabet Γ = {S, (, )} und Anfangs-Kellerzeichen Z0 = S.
Erlaubt sind folgende Aktionen:
1) Ist (“ oberstes Kellerzeichen und nächstes Eingabezeichen, streiche (“ aus dem
”
”
Keller und rücke den Lesekopf auf dem Eingabeband um ein Feld nach rechts ( Le”
sen“: 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ür das Eingabewort
()(()()). Leseschritte bringen dabei die Ableitung nicht voran, sie verschieben nur ein
181
Zeichen aus dem Keller in das schon gelesene Anfangsstück. Expansionsschritte entsprechen Ableitungsschritten.
Das Lesen eines Wortes w aus L(G) unter Herstellung einer Ableitung (insbesonodere
eines Ableitungsbaums für w) nennen wir Parsing . In unserem Beispiel wird das Wort
von links nach rechts gelesen; dabei wird eine Linksableitung erzeugt ( LL-Parsing“).
”
Wenn man die in dieser Linksableitung durchgeführten 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ätter (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, ε)} (Leseschritt) ,
δ(0,),)) = {(0, ε)} (Leseschritt) ,
δ(0, ε, S) = {(0, ε), (0, (S)S)} (Expansionsschritt).
Das eben an einem Beispiel beschriebene Vorgehen lässt sich für 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ören können. Wenn das oberste
Kellerzeichen ein Terminalzeichen a ist, kann nur ein Leseschritt“ erfolgen: es wird ge”
prüft, ob das nächste Eingabezeichen ebenfalls a ist; in diesem Fall wird dieses a gelesen
und aus dem Keller gelöscht. Formal:
• Q = {0},
• Γ = V ∪ Σ,
• Z0 = S,
182
• δ(0, a, a) = {(0, ε)} (Leseschritt)
δ(0, ε, A) = {(0, γ) | A → γ ist in P }, für A ∈ V (Expansionsschritt).
Es folgt nun der formale Beweis dafür, dass tatsächlich L(G) = LM ist. Dabei ist die Idee
des Beweises ganz einfach. Aus einer akzeptierenden Berechnung von M auf w erhalten
wir durch Betrachten der Expansionsschritte eine Linksableitung für w in G; umgekehrt
kann man aus einer Linksableitung eine akzeptierende Berechnung erhalten, indem man
passende Leseschritte dazwischenschiebt.
Die Details des Beweises sind nicht prüfungsrelevant. Jedoch muss man in der
Lage sein, zu einer gegebenen Grammatik G den NPDA M zu definieren sowie aus einer
akzeptierenden Berechnung von M die entsprechende Linksableitung abzulesen und aus
einer Linksableitung eine akzeptierende Berechnung des NPDA zu konstruieren.
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ür
j = 0, 1, . . . , t die folgende Aussage (Aj ) gilt:
Es sei w′ das längste Präfix von αj , das nur aus Terminalzeichen besteht.
Schreibe αj = w′ β und w = w′ w′′ .
(D. h.: Für j < t ist β = Aγ mit einer Variablen A; für j = t ist β = ε.)
Dann gilt für M : (0, w, S) ⊢∗M (0, w′′ , β).
Wir beweisen (Aj ) durch Induktion über j.
I.A.: j = 0. In diesem Fall ist w′ = ε, also β = S, und w′′ = w; damit gilt (0, w, S) ⊢∗M
(0, w′′ , β), weil beide Konfigurationen gleich sind.
Nun sei j ≥ 1.
I.V.: Die Behauptung (Aj−1 ) gilt. Das heißt: Es sei u′ das längste Präfix von αj−1 ohne
Variable, w = u′ u′′ , und und αj−1 = u′ Aγ. Es gibt eine Berechnung
(0, w, S) ⊢∗M (0, u′′ , Aγ).
I.S.: In der Konfiguration (0, u′′ , Aγ) wenden wir einen Expansionsschritt an, und zwar
mit der Produktion A → α, die von αj−1 = u′ Aγ zu αj = u′ αγ führt. Dies liefert:
(5.1)
(0, u′′ , Aγ) ⊢M (0, u′′ , αγ).
In Kombination mit der I.V. ergibt sich daraus:
(5.2)
(0, w, S) ⊢∗M (0, u′′ , αγ).
183
Wenn nun αγ mit einer Variablen beginnt oder gleich ε ist, sind wir fertig, da dann u′
auch das längste Präfix von αj aus Terminalzeichen ist. Sonst sei v ′ das längste Präfix von
αγ, das nur aus Terminalzeichen besteht. Schreibe αγ = v ′ ζ. Da u′ αγ = u′ v ′ ζ ⇒∗G u′ u′′
im Rahmen einer Linksableitung, ist v ′ auch Präfix von u′′ , und wir können u′′ = v ′ v ′′
schreiben. In der Konfiguration (0, u′′ , αγ) wenden wir |v ′ | Leseschritte an und erhalten
(0, u′′ , αγ) = (0, v ′ v ′′ , v ′ ζ) ⊢∗M (0, v ′′ , ζ),
(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 ′′ , ζ),
(5.4)
und das ist die Induktionsbehauptung.
Damit haben wir die Aussage (Aj ) für 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, wj′′ , βj ),
wo wj′′ der noch nicht gelesene Teil von w ist und βj ∈ (V ∪ Σ)∗ der Kellerinhalt. Wir
können also w = wj′ wj′′ schreiben, für ein Wort wj′ (der schon gelesene Teil, der in der
Konfiguation kj nicht mehr erwähnt wird).
Behauptung: (Bj ) S ⇒∗G wj′ βj , für j = 0, . . . , t.
(Wenn (Bj ) für alle j bewiesen ist, wenden wir (Bt ) an und erhalten S ⇒∗G wt′ βt = w, also
w ∈ L(G), wie gewünscht.)
Die Aussage (Bj ) beweisen wir durch Induktion über j.
I.A.: j = 0: Es ist w0′ = ε (noch nichts gelesen) und β0 = S. Daher gilt S ⇒∗G w0′ β0 .
Nun sei 1 ≤ j ≤ t.
′
βj−1 .
I.V.: (Bj−1 ) gilt, d. h. S ⇒∗G wj−1
I.S.:
1. Fall : Der Schritt von kj−1 zu kj ist ein Expansionsschritt.
Dann kann man βj−1 = Aγ schreiben, für eine Variable A und γ ∈ (V ∪ Σ)∗ , und βj = αγ,
184
′′
′
wobei A → α eine Produktion ist. Weiter gilt wj′′ = wj−1
und daher wj′ = wj−1
, weil kein
Zeichen gelesen wird. Daraus folgt:
′
′
′
wj−1
βj−1 = wj−1
Aγ ⇒G wj−1
αγ = wj′ βj .
Wenn wir dies mit der I.V. kombinieren, ergibt sich S ⇒∗G wj′ βj , also die Induktionsbehauptung (Bj ).
2. Fall : Der Schritt von kj−1 zu kj ist ein Leseschritt.
Dann gibt es ein a ∈ Σ so dass
′′
βj−1 = aβj und wj−1
= awj′′
′
gilt. Daraus folgt sofort wj′ = wj−1
a. Wir erhalten:
′
′
wj−1
βj−1 = wj−1
aβj = wj′ βj ,
und daher nach der Induktionsvoraussetzung auch S ⇒∗G wj′ β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üfe dies noch einmal anhand des
Beispiels am Anfang dieses Abschnitts (5.2) nach.
Ausblick: LL(1)-Grammatiken und ihre deterministischen Parser
Die Benutzung des Nichtdeterminismus zum Finden der richtigen Ableitungsschritte ist
natürlich recht störend. Wenn die Grammatik G eindeutig ist (siehe Def. 4.2.6(a)), dann
hat jedes Wort w ∈ L(G) genau eine Linksableitung; nach der Konstruktion aus dem
eben geführten 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ührt.
Wenn man einen wirklichen, benutzbaren Parser erstellen will, der nach dem Top-DownPrinzip (und ohne Zurücksetzen) arbeitet, muss man einen Mechanismus bereitstellen,
der es erlaubt, in jeder Situation diesen einen korrekten Zug zu finden. Eine Möglichkeit
hierfür sind die sogenannten LL(1)-Parser, die diese Entscheidung aufgrund des obersten
Kellersymbols und des nächsten anstehenden Zeichen in der Eingabe treffen.
In Verallgemeinerung der LL(1)-Grammatiken betrachtet man auch LL(k)-Grammatiken
für beliebige k ≥ 1, bei denen der Parser die jeweils nächsten k Zeichen der Eingabe
inspizieren darf ( lookahead“), um die Entscheidung über den nächsten vorzunehmenden
”
Zug zu treffen. Details zu LL(k)-Grammatiken und zur Konstruktion von LL-Parsern
185
erfährt man in der Vorlesung Übersetzerbau“ oder aus den entsprechenden Lehrbüchern
”
wie [Aho, Sethi, Ullman, Compilerbau, Oldenbourg 1999] oder [Wilhelm, Maurer, Übersetzerbau, Springer 1997].
Wir skizzieren das Vorgehen bei LL(1)-Grammatiken. Um die Diskussion zu vereinfachen, vereinbaren wir folgendes. Zu einer Grammatik G = (V, Σ, S, P ) wird ein neues
Terminalzeichen $, eine neue Variable S ′ und eine neue Produktion S ′ → S$ hinzugefügt. Die Variable S ′ wird die Startvariable. Die neue (erweiterte) Grammatik soll dann
G′ = (V ′ , Σ′ , S ′ , P ′ ) heißen, und wir betrachten nur Grammatiken, die diese Struktur
haben. Damit endet jedes Wort in L(G′ ) auf $, und dieses Zeichen kommt nirgendwo
anders vor. (In tatsächlich verwendeten Sprachen gibt es Abwandlungen dieser Vereinbarung. Zum Beispiel signalisiert in der Programmiersprache Pascal die Zeichenfolge end.
das Ende des Programms. In anderen Programmiersprachen spielt das nicht-druckbare
Zeichen eof, das das Dateiende markiert, die Rolle des Schlusszeichens.)
Die betrachteten LL-Kellerautomaten beginnen ihre Berechnung damit, die Zeichen $
und S in den Keller zu schreiben. Eingabewörter, die das Zeichen $ nicht oder nicht nur
am Schluss enthalten, führen immer zu einem Fehler. Damit ist klar, dass akzeptierende
Berechnungen mit einem Leseschritt enden müssen, bei dem das Schlusszeichen $ der
Eingabe gelesen und das Schlusszeichen $ im Keller gelöscht wird.
5.2.3 Definition Eine kontextfreie Grammatik G′ = (V ′ , Σ′ , S ′ , P ′ ) (mit Endezeichen
$) heißt vom Typ LL(1), wenn für jede Variable A und jedes Paar verschiedener Produktionen A → α und A → β gilt:
∗
∗
∗
∗
(a) Wenn α ⇒ au, β ⇒ bv, a, b ∈ Σ′ , u, v ∈ (Σ′ )∗ , dann ist a 6= b.
(Aus zwei verschiedenen rechten Seiten in Produktionen von A kann nie derselbe
erste Terminalbuchstabe entstehen.)
∗
(b) Wenn α ⇒ au, β ⇒ ε, S ′ ⇒ xAbv, u, x, v ∈ (Σ′ )∗ , a, b ∈ Σ′ , dann ist a 6= b.
(Es kann nicht vorkommen, dass aus einer Produktion von A ein Terminalbuchstabe
als erstes Zeichen entsteht, der auch in einer Ableitung an dieser Stelle stehen kann,
die aus A das leere Wort erzeugt.)
Der Effekt dieser Definition ist folgender: Wenn man beim bislang fehlerlosen LL-Parsing
eines Wortes w ∈ L(G′ ) in einer Situation angekommen ist, wo w = w′ aw′′ , w′ das schon
gelesene Teilwort, und aw′′ das noch zu lesende Restwort ist, und wenn der Kellerinhalt
Aγ ist, mit A ∈ V ′ , γ ∈ (V ′ ∪ Σ′ )∗ , dann gibt es nur eine Produktion A → α, die jetzt
anwendbar ist. Diese Produktion ist durch A und a eindeutig bestimmt.
5.2.4 Fakt Es gibt einen Algorithmus, der Grammatiken auf die LL(1)-Eigenschaft
testet und der zu jeder Kombination (A, a), A ∈ V ′ , a ∈ Σ′ , den richtigen Zug (d. h. die
jetzt anzuwendende Produktion) ermittelt.
186
5.2.5 Beispiel
Wir demonstrieren die Struktur eines LL(1)-Parsers an einem ausführlichen Beispiel. Unsere erste Grammatik in Beispiel 3.1.1 diente zur Erzeugung der Menge
der arithmetischen Ausdrücke mit Klammern und Prioritäten. Wir wiederholen die Grammatik hier, mit abgekürzten Variablen:
G = ({T, E, F }, {+, -, *, /, (, ), n}, E, P ), wobei P die folgenden Regeln enthält:
E → E+T |E-T |T
T → T *F |T /F |F
F → (E)|n
Diese Grammatik enthält eine Erscheinung, die man Linksrekursion“ nennt: es gibt Pro∗ ”
duktionen der Form A → Aα (allgemeiner: A ⇒ Aα). Solche Grammatiken können
niemals LL(1)-Grammatiken sein. (Wieso?) Man baut (mit einem einfachen Algorithmus,
den wir hier nicht besprechen) die Grammatik zu einer äquivalenten Grammatik um, die
die Erscheinung Linksrekursion“ nicht hat, und fügt gleich das Abschlusszeichen $ hinzu.
”
Dies liefert die folgende Grammatik:
G′ = ({T, T ′ , E, E ′ , F, S ′ }, {+, -, *, /, (, ), n, $}, E ′ , P ′ ), wobei P ′ die folgenden Regeln
enthält:
S′
E
E′
T
T′
F
→
→
→
→
→
→
E$
T E′
+ T E′ | - T E′ | ε
F T′
* F T′ | / F T′ | ε
(E)|n
187
S’
$
E
E’
T
F
T’
n
ε
+
T
E’
ε
T’
F
(
E
T
F
n
*
)
(
E’
T’
F
/
T’
ε
F
T’
F
T’
n
ε
n
ε
ε
)
E
T
E’
−
T
E’
F
T’ −
n
ε
T
E’
F
T’
n
ε
ε
Abbildung 5.7: Der Ableitungsbaum in G′ für das Wort n+(n*n)/(n-n-n)$
Als Anschauungsmaterial für das Funktionieren dieser Grammatik geben wir den Ableitungsbaum (Abb. 5.7) und eine Linksableitung (Abb. 5.8) für das Wort n+(n*n)/(n-n-n)$
an. Um diese etwas abzukürzen, notieren wir die Teilableitung T ⇒ F T ′ ⇒ nT ′ ⇒ n, die
∗
stillschweigend (mit ⇒) benutzt wird.
188
S′ ⇒
⇒
∗
⇒
⇒
⇒
⇒
⇒
⇒
⇒
⇒
⇒
⇒
⇒
⇒
⇒
⇒
∗
⇒
⇒
∗
⇒
⇒
∗
⇒
⇒
⇒
⇒
E$
T E ′$
nE ′ $
n+T E ′ $
n+F T ′ E ′ $
n+(E)T ′ E ′ $
n+(T E ′ )T ′ E ′ $
n+(F T ′ E ′ )T ′ E ′ $
n+(nT ′ E ′ )T ′ E ′ $
n+(n*F T ′ E ′ )T ′ E ′ $
n+(n*nT ′ E ′ )T ′ E ′ $
n+(n*nE ′ )T ′ E ′ $
n+(n*n)T ′ E ′ $
n+(n*n)/F T ′ E ′ $
n+(n*n)/(E)T ′ E ′ $
n+(n*n)/(T E ′ )T ′ E ′ $
n+(n*n)/(nE ′ )T ′ E ′ $
n+(n*n)/(n-T E ′ )T ′ E ′ $
n+(n*n)/(n-nE ′ )T ′ E ′ $
n+(n*n)/(n-n-T E ′ )T ′ E ′ $
n+(n*n)/(n-n-nE ′ )T ′ E ′ $
n+(n*n)/(n-n-n)T ′ E ′ $
n+(n*n)/(n-n-n)E ′ $
n+(n*n)/(n-n-n)$
Abbildung 5.8: Die Linksableitung in G′ für n+(n*n)/(n-n-n)$
Um die Wirkungsweise der Grammatik intuitiv zu verstehen, kann man sich vorstellen, dass E“ für einen Ausdruck mit + und -“ steht, E ′“ für Erweiterung eines
”
”
”
”
+/-Ausdrucks“, und dass ähnlich T“ für einen Ausdruck mit * und /“ steht, T ′“ für
”
”
”
Erweiterung eines *//-Ausdrucks“. Schließlich steht F“ für einen Faktor“ innerhalb
”
”
”
eines *//-Ausdrucks.
Eine Entscheidungstabelle für die Expansionsschritte für diese Grammatik sieht folgendermaßen aus. Die Spalte Var.“ gibt die Variable an, die oben im Keller steht. Wenn das
”
oberste Kellerzeichen ein Terminalzeichen ist, kommt nur ein Leseschritt in Frage.
189
nächstes Eingabezeichen
Var.
n
+
-
*
/
(
)
$
S′
S ′ → E$
–
–
–
–
S ′ → E$
–
–
–
–
–
–
–
–
E ′ → +T E ′
E ′ → -T E ′
E → T E′
–
–
–
E′ → ε
–
–
–
–
–
–
–
T′ → ε
T′ → ε
T ′ → *F T ′
T ′ → /F T ′
T → FT′
E′ → ε
–
T′ → ε
T′ → ε
F →n
–
–
–
–
F → (E)
–
E
E′
T
T′
F
E → T E′
–
T → FT′
Erste Schritte des deterministischen LL(1)-Parsers auf der Eingabe n+(n*n)/(n-n-n):
gelesen
ε
ε
ε
ε
ε
n
n
n
n+
n+
n+
n+(
n+(
n+(
n+(
n+(n
n+(n
n+(n*
n+(n*
n+(n*n
n+(n*n
n+(n*n
n+(n*n)
..
.
nächstes
Zeichen
n
n
n
n
n
+
+
+
(
(
(
n
n
n
n
*
*
n
n
)
)
)
/
..
.
Keller
S′
E$
T E ′$
F T ′E ′$
nT ′ E ′ $
T ′E ′$
E ′$
+T E ′ $
T E ′$
F T ′E ′$
(E)T ′ E ′ $
E)T ′ E ′ $
T E ′ )T ′ E ′ $
F T ′ E ′ )T ′ E ′ $
nT ′ E ′ )T ′ E ′ $
T ′ E ′ )T ′ E ′ $
*F T ′ E ′ )T ′ E ′ $
F T ′ E ′ )T ′ E ′ $
nT ′ E ′ )T ′ E ′ $
T ′ E ′ )T ′ E ′ $
E ′ )T ′ E ′ $
)T ′ E ′ $
T ′E ′$
..
.
Es ist eine gute Übung, die Tabelle zu vervollständigen.
190
Zug
S′ → E
E → T E′
T → FT′
F →n
Lesen
T′ → ε
E ′ → +T E ′
Lesen
T → FT′
F → (E)
Lesen
E → T E′
T → FT′
F →n
Lesen
T ′ → *F T ′
Lesen
F →n
Lesen
T′ → ε
E′ → ε
Lesen
...
..
.
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. Die Eingabewörter werden wieder von links nach rechts gelesen; im Gegensatz zum LL-Parsing
wird aber eine Rechts-Ableitung erzeugt; der Ableitungsbaum entsteht von den Blättern
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 ein 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ür Schritt rückwärts eine Ableitung
von w zu konstruieren. Ein elementarer Schritt in diesem Vorgang ist die Reduktion“,
”
das ist das Überführen eines Wortes
α β γ ∈ (V ∪ Σ)∗
in α A γ, wobei A → β eine Produktion ist. In Erweiterung unserer Standardnotation
könnte man
αβ γ ⇐ αAγ
für 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ückwärts durchlaufen. Diesen Vorgang wollen wir auf einem
Kellerautomaten durchführen, 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:
Eingabe
a1 a2
Keller
unten
oben
Steuereinheit
191
.........
an
Zwischensituation:
Eingabe
ai
Z r . . . . Z1
Keller
.........
an
gelesen
Steuereinheit
oben
unten
In einer gegebenen Situation sind zwei Arten von Aktion möglich:
1) shift“: Falls noch ungelesene Eingabebuchstaben vorhanden sind, kann das nächste
”
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, zusammen 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ür die Reduktion.
”
”
Eingabe
ai
Z r . . . . Z s +1 A
Keller
Ende:
.........
an
gelesen
Steuereinheit
Die gesamte Kellerinschrift ist ⊥S. Dann kann diese gelöscht werden.
Beispiel : Folgende Produktionen, mit Startsymbol S, gehören zu einer eindeutigen kontextfreien Grammatik für die Sprache der korrekten Klammerausdrücke ohne ε:
S → (S)S | () | (S) | ()S.
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üge möglich. Immer wenn eine Reduktion anwendbar ist und
die Eingabe noch nicht vollständig gelesen ist, könnte 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
192
anzuwenden ist. Dies kann vorkommen, wenn es verschiedene Produktionen A → β und
B → γ gibt, wo β ein Präfix von γ oder gar gleich γ ist ( reduce-reduce-Konflikt“; in der
”
hier betrachteten Grammatik nicht vorliegend). Wir benutzen hier Nichtdeterminismus,
um denjenigen Zug zu wählen, der zum Ziel führt.
Keller
Eingabe
⊥
| (())((()())())
shift:
⊥(
( | ())((()())())
shift:
⊥((
(( | ))((()())())
shift:
⊥(()
(() | )((()())())
reduce:
⊥(S
(() | )((()())())
shift:
⊥(S)
(()) | ((()())())
shift:
Griff“:()
”
Griff“:(S)
”
Shift-Reduce-Konflikt“ : für 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)(
(())((()())( | ))
shift:
⊥(S)((S)()
(())((()())() | )
reduce:
⊥(S)((S)S
(())((()())() | )
reduce:
⊥(S)(S
(())((()())() | )
193
Konflikt! → shift
Konflikt! → shift
shift:
⊥(S)(S)
(())((()())()) |
reduce:
⊥(S)S
(())((()())()) |
reduce:
⊥S
(())((()())()) |
Schlussschritt: leere den Keller
(())((()())()) |
ε
Wenn wir parallel zu dieser Berechnung die den Reduktionsschritten entsprechenden Teile
des Syntaxbaumes aufschreiben, so entsteht dieser von den Blättern 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ür das Eingabewort w. Das liegt daran, dass shift“-Schritte die
”
Konkatenation nicht ändern und dass in reduce“-Schritten ein Reduktionsschritt ange”
wendet wird, der die Umkehrung eines Ableitungsschrittes ist. Wegen der Endebedingung
(Kellerinhalt ⊥S) und der Anfangsbedingung (Kellerinhalt ⊥, Restwort w) handelt es
sich um eine vollständige Ableitung für w. Schließlich ist in jedem Reduktionsschritt die
in der jeweiligen Satzform am weitesten rechts stehende Variable betroffen, da in der
Resteingabe“ natürlich nur Terminalzeichen stehen.
”
Bevor wir tatsächlich sagen können, dass diese Art von Reduktion von einem NPDA
durchgeführt werden kann, müssen wir noch ein technisches Problem diskutieren. Nach
unserer Definition können NPDA’s nur das oberste Kellerzeichen lesen; in unserer Strategie haben wir aber so getan, als könnten wir die obersten
l = max |α| A → α Produktion
Kellerzeichen sehen. Dies kann man aber leicht durch die Benutzung von Zuständen der
Steuereinheit simulieren. In der Steuereinheit sind (Cache-artig) stets die obersten l Kellersymbole gespeichert; nur die noch tiefer liegenden Kellereinträge stehen wirklich“ im
”
Keller. Eine Kopie des ⊥-Zeichens verbleibt immer im Keller.
194
r >l
Eingabe
Zr
Z l +1
Zl
Z1
gelesen
r<l
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öhe wächst, muss das l-te
”
Zeichen aus dem Zustand in den echten“ Keller verschoben werden. Wenn in einem
”
reduce“-Schritt die Kellerhöhe 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ühsam.)
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ähnte 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äfix
voneinander sind. Allerdings sind solche Grammatiken nicht selten.
Bevor man den Shift-Reduce-Parsing-Vorgang algorithmisch einsetzt, müssen also noch
Wege gefunden werden, diese Konflikte jeweils deterministisch zu entscheiden. Hierfür
195
geht man bei der Konstruktion von Parsern für Programmiersprachen folgenden Weg.
Um zwischen dem ε-Zug reduce“ und einem Leseschritt ( shift“) zu entscheiden, darf der
”
”
Parser die nächsten k ≥ 1 Eingabesymbole ansehen. (Man nennt dies lookahead“. Falls
”
er sich für 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ächste Eingabesymbol überhaupt nicht ansieht.) Es gibt nun gewisse eindeutige2
Grammatiken (die man dann LR(k)-Grammatiken“ nennt), bei denen es möglich ist,
”
mit dieser Zusatzinformation sämtliche Konflikte eindeutig aufzulösen, wobei immer die
eine richtige Möglichkeit gewählt wird, die zum Ableitungsbaum bzw. zur Rechtsableitung
für das Eingabewort w führt – falls w zu der Sprache, gehört, die von der Grammatik
erzeugt wird. Der Algorithmus, der entscheidet, ob eine vorgelegte Grammatik eine LR(k)Grammatik ist und eventuell einen entsprechenden NPDA baut, der die beschriebene
Eindeutigkeitseigenschaft hat, ist etwas komplexer. Mit dieser Problemstellung beschäftigt
sich die Vorlesung Übersetzerbau“. Es gibt aber auch schon seit langem Werkzeuge,
”
sogenannte Parser-Generatoren, die diese Arbeit durchführen. Es ist also in der Praxis
kein Problem, eine Grammatik auf die LR(1)-Eigenschaft (oder die LR(k)-Eigenschaft) zu
testen und automatisch einen entsprechenden Kellerautomaten erzeugen zu lassen. Dies
leistet zum Beispiel der Parser-Generator yacc, der zu den Standardapplikationen gehört,
die in jedem Unix-System enthalten sind.
5.4
Akzeptierungsmodi
Die bislang betrachteten NPDA’s akzeptieren mit leerem Keller“. Alternativ (und näher
”
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ür 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
äquivalent. Zur Übung beschreiben wir die Transformation genau.
5.4.1 Behauptung
Es sei L ⊆ Σ∗ . Dann gilt: L = LM für einen NPDA M , der
mit leerem Keller akzeptiert, genau dann wenn L = LM ′ für einen NPDA M ′ , der mit
akzeptierendem Zustand akzeptiert.
Beweis ⇒“ : Betrachte M = (Q, Σ, Γ, q0 , Z0 , δ). Wir bauen einen äquivalenten NPDA
”
M ′ = (Q′ , Σ, Γ′ , q0′ , Z0′ , δ ′ ), der mit akzeptierenden Zuständen arbeitet. Die Idee ist einfach:
M ′ hat ein neues Keller-Anfangssymbol Z0′ und einen neuen Startzustand q0′ . Als erste
Aktion jeder Berechnung schreibt M ′ zusätzlich das Keller-Anfangs-Zeichen Z0 von M in
2
also Grammatiken, bei denen jedes ableitbare Wort genau einen Ableitungsbaum besitzt, siehe
Def. 4.2.6
196
seinen Keller und geht in den Zustand q0 über. Von hier an verhält sich M ′ genau wie
M . Nur wenn der Keller von M leer wäre, kann M ′ dies dadurch feststellen, dass das
Keller-Zeichen Z0′ im Keller sichtbar ist. Wann immer das passiert, kann M ′ mit einem
optionalen ε-Zug in einen neuen akzeptierenden Zustand qacc wechseln, von dem aus nicht
weitergerechnet werden kann. Wenn M ′ dies durchführt, nachdem das Eingabewort w
vollständig gelesen worden ist, wird w von M ′ akzeptiert.
Formal wird diese Idee durch die folgenden Definitionen umgesetzt:
Q′ = Q ∪ {q0′ , qacc }, Γ′ = Γ ∪ {Z0′ }, F = {qacc }.
(i) δ(q0′ , ε, Z0′ ) = {(q0 , Z0 Z0′ )}.
(ii) δ ′ stimmt auf Q × (Σ ∪ {ε}) × Γ mit δ überein.
(iii) δ ′ (q, ε, Z0′ ) = {(qacc , ε)} für q ∈ Q.
Es ist nicht schwer zu sehen, dass tatsächlich LM = LM ′ gilt.
⇐“ : Wir gehen von einem NPDA M ′ = (Q′ , Σ, Γ′ , q0′ , Z0′ , δ ′ , F ′ ) aus, der L mit akzep”
”
tierenden Zuständen“ akzeptiert. Wir suchen einen NPDA M , der dieselbe Sprache mit
leerem Keller akzeptiert. Hierfür müssen wir M ′ simulieren, und immer, wenn M ′ in einem
akzeptierenden Zustand ist, die Möglichkeit eröffnen, nichtdeterministisch in einen Modus
(Zustand qevac ) zu wechseln, in dem nur noch der Keller geleert wird. Hierfür definieren wir
M = (Q, Σ, Γ, q0 , Z0 , δ) folgendermaßen. Die Zustandsmenge Q = Q′ ∪ {q0 , qevac } enthält
einen neuen Startzustand q0 und einen Leere-den-Keller“-Zustand qevac . Das Kelleral”
phabet Γ = Γ′ ∪ {Z0 } enthält einen neuen Keller-Anfangs-Zustand Z0 . Dieses besondere
Zeichen dient dazu, zu verhindern, dass der Keller von M leer wird, obgleich M ′ keinen
akzeptierenden Zustand erreicht hat. Die Übergangsfunktion δ wird wie folgt definiert.
(i) δ(q0 , ε, Z0 ) = {(q0′ , Z0′ Z0 )}.
(ii) δ stimmt auf Q′ × (Σ ∪ {ε}) × Γ′ mit δ ′ überein.
(iii) zusätzlich ist(qevac , ε) ∈ δ(q, ε, Z) für q ∈ F ′ ∪ {qevac }, Z ∈ Γ′ ∪ {Z0 }.
Man sieht, dass M dieselben Rechnungen wie M ′ durchführt, nur mit dem zusätzlichen
Kellersysmbol Z0 . Wenn (aus Sicht von M ′ ) ein akzeptierender Zustand erreicht wurde,
kann begonnen werden, den Keller, einschließlich Z0 , zu leeren, und damit M zu einer
akzeptierenden Konfiguration zu führen – falls das Eingabewort fertig gelesen ist. Man
beachte, dass das zusätzliche Kellersymbol Z0 verhindert, dass die Situation, wo M ′ das
Eingabewort fertig liest und gleichzeitig den Keller leert, jedoch nicht in einem akzeptierenden Zustand ist, versehentlich“ zum Akzeptieren durch M führt.
”
197
5.5
Kellerautomaten und Grammatiken
Wir wenden uns nun dem bereits angekündigten Äquivalenzsatz 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 in Grundzügen dargestellt. Der
Übergang von Kellerautomaten zu Grammatiken ist von prinzipieller und theoretischer
Bedeutung. Daher werden wir (für die Neugierigen und Unerschrockenen) auch einen
vollständigen Beweis angeben. (In der Vorlesung werden die Details nicht ausgeführt, und
diese sind auch nicht prüfungsrelevant.)
5.5.1 Satz
Sei L ⊆ Σ∗ Sprache. Dann sind äquivalent:
(a) L = L(G) für eine kontextfreie Grammatik G.
(b) L = LM für 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üllt. 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ür 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 Wurzelbeschriftung hq, A, pi und Ergebnis
(Blattinschrift) w
⇔
M kann von der Konfiguration (q, w, A) (Zustand q, Restwort w zu lesen, genau das
Symbol A im Keller) aus die Konfiguration (p, ε, ε) (Zustand p, w vollständig gelesen,
Keller leer) erreichen.
5.5.2 Bemerkung
Es ist günstig, sich gleich hier klarzumachen, dass (q, w, A) ⊢∗M
(p, ε, ε) auch bedeutet, dass dieselbe Rechnung als Teilrechnung oben auf einem irgendwie
gefüllten Keller und mit einem nachfolgenden Restwort möglich ist, dass also (q, wu, Aγ) ⊢∗M
(p, u, γ) gilt, für beliebige u ∈ Σ∗ und γ ∈ Γ∗ .
198
Um den in (5.5) angegebenen Effekt zu erzielen, legen wir fest, dass P folgende Produktionen enthält:
(i) S → hq0 , Z0 , pi, für jedes p ∈ Q.
(ii)
hq, A, qm+1 i → ahq1 , A1 , q2 ihq2 , A2 , q3 i · · · hqm , Am , qm+1 i,
für (q, a, A) ∈ Q × (Σ ∪ {ε}) × Γ , q1 , . . . , qm+1 ∈ Q , m ≥ 0, wenn (q1 , A1 · · · Am ) ∈
δ(q, a, A).
Man beachte zwei Spezialfälle: m = 0, was zur Produktion hq, A, q1 i → a führt, und a = ε,
was zu einer Produktion hq, A, qm+1 i → hq1 , A1 , q2 i · · · hqm , Am , qm+1 i führt.
Damit ist die Konstruktion beendet. Der Umbau von NPDA in eine Grammatik ist also
überhaupt nicht schwierig (nur etwas mühsam).
Etwas komplizierter (und nicht prüfungsrelevant) ist der Beweis dafür, dass die neue
Grammatik die von M definierte Sprache erzeugt.
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 Äquivalenz 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 verallgemeinerte Induktion über die Tiefe k ≥ 1 eines hq, A, pi-Ableitungsbaumes
mit Blattwort w.
Ist k = 1, so sieht der Ableitungsbaum für w ∈ Σ∗ so aus:
<q,A,p>
w
199
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ür die Ableitung hq, A, pi ⇒∗G w hat folgendes
Format:
<q,A,p>
a
<q , A , q 2 >
1
...
<q , A , q >
1
m
m
m+1
Tiefe < k
w1
wm
Dabei ist m ≥ 0, q1 , . . . , qm ∈ Q, qm+1 = p, a ∈ Σ ∪ {ε} (wenn a = ε, fällt das erste
Blatt weg), und w1 , . . . , wm ∈ Σ∗ sind die Einträge an den Blättern der m Teilbäume,
also w = aw1 · · · wm , und hqi , Ai , qi+1 i ⇒∗G wi mittels Ableitungsbäumen der Tiefe < k.
Also gilt nach Induktionsvoraussetzung
(qi , wi , Ai ) ⊢∗M (qi+1 , ε, ε), für 1 ≤ i ≤ m.
Also gilt mit der Regel (q1 , A1 . . . Am ) ∈ δ(q, a, A):
(q, aw1 · · · wm , A)
⊢M (q1 , w1 · · · wm , A1 · · · Am )
⊢∗M (q2 , w2 · · · wm , A2 · · · Am )
..
.
⊢∗M (qm+1 , ε, ε) = (p, ε, ε),
wie gewünscht. (Man benutzt Bemerkung 5.5.2, um zu sehen, dass es legal ist, diese
Teilrechnungen aneinanderzuhängen.)
⇐“: Wir beweisen die Aussage
”
(q, w, A) ⊢∗M (p, ε, ε) impliziert hq, A, pi ⇒∗G w
durch Induktion über die Zahl k ≥ 1 der Schritte, die M macht, um (q, w, A) in (p, ε, ε)
zu überführen.
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
200
betrachten eine Rechnung, die M in k Schritten von (q, w, A) nach (p, ε, ε) führt. Wir
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 Übergangsfunktion δ von M , das im ersten Schritt verwendet wird. Die
letzten k − 1 Schritte der betrachteten Berechnung von M führen also (q1 , w′ , A1 · · · Am )
in (p, ε, ε) ü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ährend Phase (ti−1 , ti ] von M gelesen wird.
Offenbar gilt dann w′ = w1 · · · wm . Während Phase i spielt sich also folgender Konfigurationsübergang ab, für gewisse qi ∈ Q, i = 2, . . . , m:
(qi , wi · · · wm , Ai · · · Am ) ⊢M · · · ⊢M (qi+1 , wi+1 · · · wm , Ai+1 · · · Am ).
Da während dieser Rechnung der Teil Ai+1 · · · Am des Kellers nicht berührt, 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ür 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änzen noch eine interessante (und wichtige) Abschlusseigenschaft von L2 .
5.6.1 Satz
Ist L1 kontextfrei und L2 regulär, so ist L1 ∩ L2 kontextfrei.
201
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änden akzeptiert. Außerdem existiert ein DFA
M ′ = (Q′ , Σ, q0′ , F ′ , δ ′ ) für L2 . Um einen NPDA M∩ für L1 ∩ L2 zu erhalten, erweitert
man die Steuereinheit von M in der folgenden Weise: Es wird ein zusätzliches Register
(mathematisch: eine Komponente) angelegt, die einen Zustand von M ′ speichern kann.
Dieses wird anfangs mit q0′ besetzt. Bei Zügen von M , bei denen ein Buchstabe a gelesen
wird, wird dieses Register gemäß δ ′ weitergeschaltet. Bei ε-Zügen bleibt der Registerinhalt
unverändert. Der neue DPDA M∩ ist in einem akzeptierenden Zustand, wenn M in einem
akzeptierenden Zustand ist und das Register einen Zustand q ′ ∈ F ′ enthält.
Es ist nicht schwierig, den NPDA M∩ durch eine leichte Verallgemeinerung der Kreuzproduktkonstruktion (siehe Satz 2.1.10(c)) präzise zu definieren und zu zeigen, dass LM∩ =
L1 ∩ L2 ist.
Wir bemerken, dass es nicht möglich 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öglich ist, diese beiden Keller zu einem einzigen zu
vermischen“. Hier handelt es sich um eine mathematisch präzise Aussage! Wäre es im”
mer möglich, auf eine solche Weise aus zwei NPDA’s einen NPDA für den Durchschnitt
der zwei Sprachen zu konstruieren, dann wären die kontextfreien Sprachen unter der
Durchschnittsoperation abgeschlossen, was nach Satz 4.6.4 nicht der Fall ist. Tatsächlich
werden wir in der Vorlesung Berechenbarkeit und Komplexitätstheorie“ sehen, dass zwei
”
unabhängige Keller zu Rechenmodellen führen, die viel stärker sind als die NPDA’s.
5.7
Deterministische Kellerautomaten und ihre Sprachen
Wir betrachten hier eine Teilklasse der NPDA’s, nämlich deterministische Kellerautomaten (DPDA’s). Diese zeichnen sich dadurch aus, dass in jeder Konfiguration höchstens ein
nächster Zug möglich ist.
Weil dazu auch keine Wahlmöglichkeit zwischen ε-Zug und Lesen eines Symbols vom
Eingabeband bestehen darf, verlangt man:
(5.6)
|δ(q, a, A)| + |δ(q, ε, A)| ≤ 1
für jedes q ∈ Q, a ∈ Σ, A ∈ Γ. Der Berechnungsbaum (vgl. Abb. 5.5) degeneriert zu einem
Weg ohne Verzweigung. Weiterhin muss man (aus technischen Gründen) festlegen, dass
über akzeptierende Zustände akzeptiert wird, wie in der in Abschnitt 5.4 besprochenen
Variante.
Beispiel : Wir wollen die Klammersprache mit einem deterministischen Kellerautomaten
bearbeiten. Würde dieser mit leerem Keller“ akzeptieren, dann müsste zum Beispiel nach
”
dem Lesen des Wortes (()) der Keller leer sein; damit ist aber das Weiterrechnen und
202
Akzeptieren auf der Eingabe (())() nicht möglich. (Allgemein können deterministische
Verfahren mit Akzeptierungsmodus leerer Keller“ nicht funktionieren, wenn die zu ak”
zeptierende Sprache L nicht präfixfrei ist, d. h. wenn es Wörter w1 , w2 ∈ L gibt, derart
dass w1 ein echtes Präfix von w2 ist.)
Ein DPDA hat also eine Menge F ⊆ Q von akzeptierenden Zuständen, und M akzeptiert
w ∈ Σ∗ , wenn w vollständig gelesen wird und nach dem vollständigen Lesen von w ein
akzeptierender Zustand erreicht wird. Die formalen Definitionen lauten folgendermaßen.
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ür alle a ∈ Σ, q ∈ Q, A ∈ Γ.
5.7.2 Definition
Sei M = (Q, Σ, Γ, q0 , Z0 , F, δ) ein DPDA, der (5.6) erfüllt.
(a) Konfigurationen und die Relationen ⊢M und ⊢∗M sind wie in Abschnitt 5.1.5 definiert.
(Man beachte, dass für jede Konfiguration k höchstens eine direkte Nachfolgekonfiguration existiert.)
(b) M akzeptiert w ∈ Σ∗ , falls
(q0 , w, Z0 ) ⊢∗M (q, ε, γ) für ein q ∈ F, γ ∈ Γ∗ .
(c) LM = {w ∈ Σ∗ | M akzeptiert w}.
Beachte:
(i) Es ist erlaubt, dass M die Eingabe vollständig liest und dann noch einen oder mehrere
ε-Züge durchführt, die den Keller (lesen und) verändern können und auch durch mehrere Zustände führt. Akzeptiert wird, wenn schließlich ein akzeptierender Zustand erreicht
wird.
(ii) Bei nicht akzeptierten Wörtern ist über das Verhalten zunächst nichts gesagt. Die
Rechnung kann (ohne Nachfolgekonfiguration) in der Mitte des Wortes anhalten oder (mit
ε-Zügen) in eine Endlosschleife geraten, in der sich nur noch Kellerinhalt und Zustände
ändern. Dabei kann sogar der Keller immer weiter wachsen. (Wir kommen auf diese Problematik zurück.)
203
5.7.3 Beispiel
Wir konstruieren einen deterministischen Kellerautomaten für die Sprache L ⊆ {(, )}∗ der
korrekten Klammerausdrücke. Die grundlegende Idee ist einfach: Der Keller realisiert einen
(unären) Zähler. Wenn ein (“ gelesen wird, erhöht sich der Zähler; wenn ein )“ gelesen
”
”
wird, erniedrigt er sich. Dadurch wird erreicht, dass der Zählerstand den Vorsprung“ der
”
gelesenen öffnenden Klammern vor den schließenden Klammern ausdrückt, der natürlich
immer nichtnegativ ist. Man kann akzeptieren, wenn der Zählerstand 0 ist. Technisch
arbeitet man mit dem Kelleralphabet Γ = {1, ⊥}. Dabei wird das Kelleranfangszeichen
⊥ nie gelöscht und markiert immer das Ende des Kellers. Wenn dieses Zeichen im Keller
sichtbar ist, wechseln wir mit einem ε-Zug in einen akzeptierenden Zustand. Der Keller
wird dadurch nicht verändert, so dass auch Weiterrechnen möglich ist.
Formal legen wir den DPDA M wie folgt fest:
• 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.9: Ein DPDA für die Klammersprache
δ
⊥
(V, ε) (A, ⊥)
(V, ()
−
(V, ))
−
−
(A, ε)
(A, () (V, 1⊥)
(A, ))
−
204
1
−
(V, 11)
(V, ε)
−
−
−
Auf der Eingabe ()(())((()())) arbeitet dieser DPDA wie folgt:
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ächlich immer die Anzahl der momentan geöffneten 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ür 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ählen wir die gelesenen a’s
im Keller, um dann für jedes gelesene b den Zählerstand um 1 zu erniedrigen. Solange
der Zählerstand nicht 0 ist, erklären wir den Zustand für akzeptierend. Wichtig ist hier,
beim Herunterzählen zunächst 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ählerstand exakt 0 ist, muss verworfen werden; wenn dann weitere b’s
folgen, können wir wieder akzeptieren. Das Kellerendezeichen ⊥ wird nie gelöscht. Formal
sieht der DPDA für L folgendermaßen aus.
• Q = {S, A, B, C, D},
• q0 = S,
• Σ = {a, b},
205
• Γ = {1, ⊥}
• 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.10: Ein DPDA für die Sprache {ai bj | i, j ≥ 0, i 6= j}
Man prüfe nach, dass in diesem DPDA es nie zwei miteinander konkurrierende Züge gibt.
Die Zustände S und A dienen zum Lesen von a’s, die Zustände B, C und D zum Lesen von
b’s. Die Kombination der Zustände B und C realisiert das vorsichtige Lesen der b’s: erst
wird gelesen und der Zähler erniedrigt (Zustand B), dann wird mit einem ε-Zug geprüft,
dass der Keller nicht leer ist.
Eine Beispielberechnung dieses DPDA’s sieht wie folgt aus:
Eingabe: aaabbbbbbb
schon gelesen
Keller
Zustand
−
−
a
aa
aaa
aaab
aaab
aaabb
aaabb
aaabbb
aaabbbb
aaabbbbb
...
⊥
⊥
1⊥
11⊥
111⊥
11⊥
11⊥
1⊥
1⊥
⊥
⊥
⊥
...
S
S
A
A
A
B
C
B
C
B
D
D
...
206
5.7.5 Definition Eine Sprache L heißt deterministisch kontextfrei , wenn L = LM
für einen DPDA M gilt.
Wir merken an, dass die Klasse der deterministisch kontextfreien Sprachen über ein Maschinenmodell definiert ist, obwohl die kontextfreien Sprachen über eine Eigenschaft der
zugehörigen Grammatiken definiert ist. Gibt es auch einen Grammatiktyp, der zu den deterministisch kontextfreien Grammatiken gehört? Dies ist tatsächlich der Fall; es handelt
sich um die LR(k)-Grammatiken“, für k ≥ 1. Die Definition der Klasse der LR(k)”
Grammatiken ist nicht einfach syntaktisch wie bei den Typ-i-Grammatiken, i = 0, 1, 2, 3,
sondern bezieht sich auf eine unendliche Menge von Situationen, die in Ableitungen
auftreten können. Die Eigenschaft läuft darauf hinaus, dass ein bestimmtes deterministisches Bottom-Up-Parsing-Verfahren (siehe Abschnitt 5.3), das für das Auflösen von
Shift-Reduce- und Reduce-Reduce-Konflikten die nächsten k Zeichen des Eingabewortes ansehen darf, erfolgreich arbeiten kann. Man kann aber Grammatiken algorithmisch
auf diese Eigenschaft testen. LR(k)-Grammatiken mit den zugehörigen Parsern sind die
mächtigsten bekannten Syntaxbeschreibungsverfahren mit Syntaxanalyse in Linearzeit“.
”
Man kann zeigen (dies wäre ein Thema einer fortgeschrittenen Vorlesung über formale
Sprachen), dass jede deterministisch kontextfreie Sprache sogar eine LR(1)-Grammatik
hat, so dass die Grammatikklassen LR(k), k ≥ 1, alle gleichmächtig sind. Insbesondere
LR(1)-Grammatiken werden bei der Konstruktion von Übersetzern für Programmiersprachen bevorzugt eingesetzt. Näheres zu diesen Grammatiken und zur Konstruktion der
zugehörigen Parser erfährt man in der Vorlesung Übersetzerbau“.
”
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ür die Konstruktion eines DPDA M ′ für 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ünftigen Abschluss der Berechnung finden muss.
5.7.6 Lemma Wenn M ein DPDA ist, dann kann man aus M einen DPDA M1 für
dieselbe Sprache konstruieren, der folgende Eigenschaften hat :
• M1 liest jede Eingabe w bis zum letzten Buchstaben (es gibt kein vorzeitiges Akzeptieren oder Verwerfen);
• nach dem Lesen des letzten Buchstabens führt M1 nur eine begrenzte Zahl von εZügen aus (es kann nicht unendlich viele ε-Züge geben, die keinen Buchstaben der
Eingabe lesen).
Für einen Beweis (der etwas technisch ist) wird auf die Literatur verwiesen (z. B. [Floyd,
Beigel, Die Sprache der Maschinen, Thomson 1996, S. 373ff.]).
207
5.7.7 Lemma
Wenn L deterministisch kontextfrei ist, dann auch L̄.
Beweis: Nach Lemma 5.7.6 gibt es einen DPDA M = (Q, Σ, Γ, q0 , Z0 , F, δ) mit L = LM ,
der alle Eingabewörter bis zum Ende liest und nach dem Lesen eines Eingabebuchstabens
nur endlich viele Schritte macht, bevor der nächste Buchstabe gelesen wird.
Die naheliegende Idee ist, in M einfach F und Q − F zu vertauschen. (Das funktioniert
bei DFA’s, siehe Satz 2.1.10(e).) Es gibt aber noch ein kleines technisches Problem: M
könnte nach dem Lesen von w ∈ Σ∗ noch einige ε-Schritte machen und dabei Zustände
in F und Zustände in Q − F erreichen. Würde man F und Q − F einfach vertauschen,
würde auch der neue DPDA w akzeptieren – fälschlicherweise.
Dieses Problem ist aber leicht zu lösen. Der neue DPDA M ′ registriert (in der Steuereinheit), welche Art von Zuständen M in den ε-Zügen nach dem Lesen eines Buchstabens
durchläuft. Irgendwann erreicht M eine Situation, in der kein weiterer ε-Zug möglich ist.
Nun gibt es zwei Möglichkeiten: (1) Alle Zustände nach dem Lesen des letzten Buchstabens waren nicht in F . Dann wechselt M ′ mit einem ε-Zug in einen (neuen) akzeptierenden
Zustand, und rechnet dann mit dem Lesen des nächsten Buchstabens weiter. (2) Nach
dem Lesen des letzten Buchstabens wurde mindestens ein Zustand aus F durchlaufen.
Dann rechnet M ′ einfach weiter, ohne in den akzeptierenden Zustand zu wechseln.
Außer gegen Komplementbildung sind deterministisch kontextfreie Sprachen gegen keine
weitere der Standard-Operationen abgeschlossen.
5.7.8 Behauptung
sind.
Es gibt kontextfreie Sprachen, die nicht deterministisch kontextfrei
Beweis: L = {ai bj ck | i 6= j ∨ j 6= k} ist kontextfrei. (Das haben wir im Beweis von
Satz 4.6.4 gesehen, Behauptung 1 über L3 .)
Wäre L deterministisch kontextfrei, wäre nach 5.7.7 auch L̄ deterministisch kontextfrei,
also insbesondere kontextfrei. Die Sprache L̄ ist aber nicht kontextfrei, sonst wäre nach
Satz 5.6.1 L̄ ∩ {a}∗ {b}∗ {c}∗ = {an bn cn | n ≥ 0} ebenfalls kontextfrei, was nicht der Fall
ist.
Ein sehr naheliegendes Beispiel einer kontextfreien, aber nicht deterministisch kontextfreien Sprache ist
{w | w ∈ {0, 1}∗ , w = wR }.
Intuitiv gesprochen kann ein deterministischer Kellerautomat die Stelle in einem Eingabewort w nicht identifizieren, an der umzukehren“ und der Kellerinhalt mit dem bisher
”
Gelesenen zu vergleichen ist. Der Beweis für diese einleuchtende Tatsache ist allerdings
technisch aufwendig.
5.7.9 Behauptung
∩ abgeschlossen.
Die deterministisch kontextfreien Sprachen sind nicht gegen ∪ und
208
L1 = {ai bj ck | i 6= j} und
L2 = {ai bj ck | j 6= k} sind deterministisch kontextfrei (Beweis von Satz 4.6.4);
aber L1 ∪ L2 ist nicht deterministisch kontextfrei (Beweis von Behauptung 5.7.8).
Beweis:
L3 = {ai bj ck | i = j} und
L4 = {ai bj ck | j = k} sind deterministisch kontextfrei;
aber L3 ∩ L4 ist nicht kontextfrei. (Vgl. Beweis von Satz 4.6.4.)
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ären Sprachen abgeschlossen.
(D. h.: L1 deterministisch kontextfrei, L2 regulär ⇒ L1 ∩ L2 deterministisch kontextfrei.)
Dies beweist man genauso wie Satz 5.6.1.
5.8
Entscheidungsfragen für kontextfreie Sprachen
Ebenso wie bei regulären 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üglich kontextfreier
Grammatiken unentscheidbar werden. Das bedeutet, dass es prinzipiell keinen Algorithmus geben kann, der dieses Problem für alle Grammatiken lösen kann. Den technischen
Hintergrund für Unentscheidbarkeitsaussagen werden wir jedoch erst in der Vorlesung
Berechenbarkeit und Komplexitätstheorie“ kennenlernen. Daher werden hier alle Unent”
scheidbarkeitsaussagen (einstweilen) ohne Beweis bleiben.
5.8.1 Satz
lösbar :
Die folgenden Aufgaben bezüglich 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.
209
Beweis: (a) Nach Proposition 4.3.14(c) genügt es, mit dem dort angegebenen Markierungsalgorithmus 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 äquivalente Grammatik G′ in Chomsky-Normalform um (s.
Abschnitt 4.3). Dann wendet man auf G′ 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 äquivalente Grammatik G′ = (V ′ , Σ, S ′ , P ′ ) in Chomsky-Normalform um. Mit dem Algorithmus zu Proposition 4.3.14 ermitteln wir die Menge der produktiven Variablen in V ′ . Wenn S ′ nicht
produktiv ist, ist L(G) = ∅, und wir sind fertig. Sonst lassen wir aus V ′ die nicht produktiven (die nutzlosen“) Variablen weg, und erhalten eine zu G äquivalente Grammatik
”
G′′ = (V ′′ , Σ, S ′ , P ′′ ) in Chomsky-Normalform, die keine nutzlosen Variablen hat.
Mit einem weiteren Markierungsalgorithmus ermitteln wir nun die Menge V ′′′ aller Variablen A ∈ V ′′ , die in einer Satzform α von G′′ vorkommen, also mit einer Ableitungsfolge
S ⇒G′′ α1 ⇒G′′ α2 ⇒G′′ · · · ⇒G′′ αt = α
erreichbar sind. (Die Details möge man sich als Übung überlegen.) Wenn wir aus G′′
die nicht erreichbaren Variablen weglassen und alle Produktionen streichen, in denen
solche Variablen vorkommen, erhalten wir eine zu G äquivalente Grammatik G′′′ =
(V ′′′ , Σ, S ′ , P ′′′ ), in der jede Variable erreichbar und produktiv ist.
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ält.
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önnen wir überprüfen, ob es r ≥ 1 und eine Folge A0 , A1 , . . . , Ar in V gibt mit
A0 = Ar und
(A0 , A1 ), . . . , (Ar−1 , Ar ) ∈ E.
(Diese Kantenfolge bildet also einen gerichteten Kreis der Länge r im Graphen H.) Dieser
Test liefert die gewünschte 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öchstens |V | viele innere Knoten. Es gibt aber nur endlich
viele Binärbäume der Tiefe ≤ |V | mit Knotenmarkierungen aus V , also lässt G nur
endlich viele Ableitungsbäume zu. Also ist L(G) endlich.
“⇐“: Angenommen, H besitzt einen Kreis A0 , A1 , . . . , Ar = A0 . Nun bauen wir einen
Ableitungsbaum in G wie folgt:
210
1. Bilde einen Ableitungsbaum T mit Wurzelbeschriftung S für 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 T1′ 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üge T1′ in T ein, indem die Wurzel von T1′ mit k1 identifiziert wird. Das Resultat
ist der Baum T ′ . Der Blattknoten in T1′ , der mit A0 beschriftet ist, heiße k2 .
4. Wenn k ein Blatt von T ′ ist, das mit einer Variablen A beschriftet ist, so ergänze
unter k einen A-Ableitungsbaum, dessen Blätter 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ählen, dass α(T1 ) = vwx, und
schließlich u und y so, dass uvwxy = α(T0 ) ist, so können wir genau wie im Beweis des
Pumping-Lemmas schließen, dass |vx| ≥ 1 ist und alle Wörter uv i wxi y ∈ L(G) sind. Diese
Wörter sind alle verschieden; also ist L(G) unendlich.
5.8.2 Satz
Die folgenden Aufgaben bezüglich NPDA’s sind algorithmisch lösbar:
(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ür t = |w|, |w| + 1, |w| + 2, . . ., bis wir
eine akzeptierende Berechnung finden.
Bemerkung: Man beachte das vosichtige Vorgehen in (b). Es genügt nicht, den NPDA
einfach alle möglichen Berechnungen durchprobieren zu lassen, da es für ein Wort w ∈
/L
möglicherweise unendlich viele Berechnungen gibt und man nie feststellt, dass es keine
akzeptierende Berechnung gibt.
211
Natürlich sind dieselben Fragen für DPDA’s im Prinzip mit denselben Algorithmen lösbar,
da DPDA’s nur ein Spezialfall von NPDA’s sind. Im Fall des Wortproblems gibt es für
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 erwähnten Methoden in einen zu
M äquivalenten DPDA M ′ um, der seine Eingabe w vollständig liest und dann mittels
seines Zustandes mitteilt, ob w ∈ LM oder nicht. Damit lässt sich das Wortproblem dann
direkt lösen, ohne den DPDA in eine Grammatik umzuformen.
Weiter kann man für einen DPDA M algorithmisch testen, ob LM = Σ∗ ist. (Man baut
mit der Methode der eben erwähnten Lemmata einen DPDA M ′ für LM und testet, ob
LM ′ = ∅.)
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ächst erklären wir:
5.8.3 Erklärung 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ärung des Begriffs unentscheidbar“ muss momentan noch etwas vage und ma”
thematisch ungenau bleiben, weil wir den Begriff Algorithmus“ nicht präzise definiert
”
haben (und dies auch gar nicht können). In der Vorlesung Berechenbarkeit und Komple”
xitätstheorie“ wird gezeigt, wie man den intuitiven Algorithmusbegriff durch eine formale
Definition ersetzen kann, so dass die Behauptung es gibt keinen Algorithmus“ mathema”
tischer Argumentation zugänglich wird.
Natürlich kann man genauso ü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är“ sei für 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üssen.
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ür jede Grammatik löst. 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üssen, dass eine neu konstruierte Grammatik nicht versehentlich mehrdeutig wird.
Wir geben nun einige unentscheidbare Fragen im Zusammenhang mit kontextfreien Sprachen an. Für die Beweise (Auswahl) verweisen wir auf die Vorlesung Berechenbarkeit
”
212
und Komplexitätstheorie“.
5.8.4 Satz (Unentscheidbare Fragen für zwei kontextfreie Grammatiken)
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 für eine kontextfreie Grammatik)
Folgende Probleme sind unentscheidbar :
Gegeben sei eine kontextfreie Grammatik G.
(a) Ist G mehrdeutig?
(b) Ist L(G) inhärent mehrdeutig?
(c) Ist L(G) kontextfrei ?
(d) Ist L(G) deterministisch kontextfrei?
(e) Ist L(G) regulär ?
Wir bemerken, dass die Unentscheidbarkeit sich auf NPDA’s überträgt, 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 Äquivalenzproblems bildete jahrzehntelang ein (berühmtes) offenes Problem, bis er
1997 geklärt wurde.
5.8.6 Satz
(Entscheidungsfragen für DPDA’s)
(a) (Schnittproblem) Es ist unentscheidbar, ob für gegebene DPDA’s M1 und M2 gilt,
dass LM1 ∩ LM2 = ∅.
(b) (Äquivalenzproblem) Es gibt einen Algorithmus, der zu gegebenen DPDA’s M1
und M2 entscheidet, ob LM1 = LM2 gilt. (G. Sénizergues, 1997.)
(c) (Regularitätsproblem) Es gibt einen Algorithmus, der zu einem gegebenen DPDA
M entscheidet, ob L(M ) regulär ist.
213
Anhang A
A.1
Zahldarstellungen und Abzählungen
Wir betrachten verschiedene Zahldarstellungen. Diese Untersuchungen liefern Beispiele
für Induktionsbeweise und sie liefern sehr natürliche Abzählungen für die Mengen Σ∗ ,
wobei Σ ein beliebiges Alphabet ist. Der Inhalt dieses Kapitels ist nicht prüfungsrelevant,
allerdings wird er in der Vorlesung als bekannt vorausgesetzt.
Zur Erinnerung:
N = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, . . . }.
Eine Aufzählung einer Menge X ist eine bijektive Funktion f : N → X. Wenn f eine
Aufzählung von X ist, gilt
X = {f (0), f (1), f (2), f (3), . . . }.
Eine Menge X heißt abzählbar (unendlich), wenn sie eine Aufzählung hat.
Ein Hauptresultat dieses Abschnittes ist, dass für jedes Alphabet Σ die Menge Σ∗ abzählbar unendlich ist, wobei die Aufzählung sogar eine recht einfache Funktion ist.
A.1.1
Die b-äre Zahldarstellung
In diesem Abschnitt diskutieren wir die mathematischen Grundlagen für die Verwendung
der Zahldarstellungen zu verschiedenen Basiszahlen. Allgemein ü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ärdarstellung , d. h. die Darstellung
von Zahlen mit den Ziffern 0 und 1. Häufig 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ür 10, . . . , 15.) Weil man sich manchmal
214
die Binärdarstellung von Zahlen in Bytes oder Maschinenwörter zerlegt denkt, sind auch
Darstellungen zur Basis 28 = 256, 216 = 65536 oder 232 interessant.
Beispielsweise kann man die Zahl 467 ∈ N in Binärdarstellung als 111010011, in Oktaldarstellung als 723 und in Hexadezimaldarstellung als 1D3 schreiben. Die Dezimaldarstellung
ist natürlich 467. (Auch wenn es etwas pedantisch erscheint, ist es günstig, für diesen Abschnitt die Zahl n ∈ N, die wir natürlich als Dezimalzahl (wie 467) notieren, von dem
Wort (wie 467) über dem Alphabet {0, 1, 2, . . . , 9} zu unterscheiden, das diese Zahl
darstellt.) Wir benutzen als Alphabete Mengen Σb = {0, 1, . . . , b − 1} für b ≥ 2; für b ≤ 16
schreiben wir die Ziffern in der Schreibmaschinentype 0, 1, 2, . . . . Für Zahlsysteme mit
mehr als 16 Ziffern muss man andere Konventionen benutzen. Am einfachsten ist es, die
Ziffern mit gewöhnlicher (dezimaler) Notation zu schreiben und die Wörter als k-Tupel
mit Klammern und Kommas. Zum Beispiel hat dann die Zahl 300670126 zur Basis b = 100
die Darstellung (3, 0, 67, 1, 26).
A.1.1 Definition
(A.1)
+
Für b ≥ 2 und ak−1 · · · a1 a0 ∈ Σ+
b = {0, 1, . . . , b − 1} sei
X
(ak−1 · · · a1 a0 )b :=
ai b i
0≤i<k
die durch ak−1 · · · a1 a0 dargestellte natürliche Zahl.
Formal gesehen ist ( · )b eine Abbildung von Σ+
b nach N. Falls nötig, kann man auch
(ε)b := 0 definieren und damit die Abbildung ( · )b auf Σ∗ erweitern; das ist aber eher
unüblich.
Wir diskutieren kurz, wie man aus dem Wort ak−1 · · · a1 a0 ∈ {0, 1, . . . , b − 1}+ die zugehörige 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<k
Dies führt zu folgendem iterativen Algorithmus für 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 x 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:
215
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ührende Nullen auf den Wert einer Zahldarstellung keinen
Einfluss haben; zum Beispiel ist (000467)10 = (467)10 = 467.
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ührende Null), und n = (ak−1 · · · a1 a0 )b , so heißt ak−1 · · · a1 a0 eine
b-äre Darstellung von n.
Es wäre nun denkbar, dass manche Zahlen keine b-äre Darstellung besitzen, andere u. U.
mehrere. Dass dies nicht so ist, macht das Konzept der b-ären Darstellung erst praktisch
verwendbar.
A.1.3 Satz
Sei b ≥ 2. Dann gibt es für jede Zahl n ∈ N genau eine b-äre Darstellung.
Beweis Wir bezeichnen die Aussage n besitzt genau eine b-äre Darstellung“ mit E(n)
”
und zeigen ∀n : E(n) durch verallgemeinerte Induktion nach n. – Sei also n ∈ N.
1. Fall: 0 ≤ n < b. Dann ist a0 = n eine b-äre Darstellung von n, mit k = 1. Ist
cl−1 · · · c1 c0 eine beliebige b-äre Darstellung von n, so kann nicht l ≥ 2 sein (sonst wäre
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önnen wir nach der Methode der ganzzahligen Division mit Rest schreiben
n = q · b + r für ein q ∈ N und ein r mit 0 ≤ r < b,
für eindeutig bestimmte q = ⌊n/b⌋ und r = n − qb. Dabei ist n > q = ⌊n/b⌋ ≥ 1, weil
n ≥ b ≥ 2 ist. Wir können also die Induktionsvoraussetzung E(q) anwenden. Diese besagt,
dass q eine eindeutig bestimmte b-äre Darstellung cl−1 · · · c1 c0 besitzt. Weil q ≥ 1 ist, gilt
also
X
q=
ci bi , mit cl−1 6= 0.
0≤i<l
Wir setzen a0 := r und ai+1 := ci für 0 ≤ i < l, und k := l + 1. Dann gilt offenbar
X
X
n=r+b·
c i bi =
ai b i ,
0≤i<l
216
0≤i<k
und ak−1 6= 0, also ist ak−1 · · · a1 a0 eine b-äre Darstellung
· d1 d0
P von n. –i Ist weiter
P dm−1 · ·i−1
eine beliebige b-äre Darstellung von
P n, so folgti−1aus n = 0≤i<m di b = b·( 1≤i<m di b )+
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-äre Darstellung von q ist. Nun ist aber (nach Induktionsvoraussetzung)
cl−1 · · · c1 c0 die einzige b-äre Darstellung von q. Daraus folgt m = l + 1 = k und di =
ci−1 = ai , für 1 ≤ i < k. Also ist ak−1 · · · a1 a0 die einzige b-äre 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-ären Darstellung von
n liefert. Genaugenommen beruht der Beweis eben auf der Beobachtung, dass man eine
b-äre Darstellung für ein gegebenes n berechnen kann, ohne dass bei dieser Berechnung
Wahlmöglichkeiten bestehen. Diese Methode ist, iterativ formuliert, durch das folgende
Programmstück gegeben:
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-äre Darstellung von n.
A.1.5 Beispiel Bei n = 467 und b = 8 ergeben sich nacheinander die folgenden Paare
(Quotient q, Rest r):
(⌊467/8⌋, 3) = (58, 3) , (⌊58/8⌋, 2) = (7, 2) , (⌊7/8⌋, 7) = (0, 7),
und damit die Oktaldarstellung 723 für 467.
Angesichts der in Satz A.1.3 gemachten Feststellung ist es gerechtfertigt, von der b-ären
Darstellung einer Zahl n zu sprechen. Aus der Sicht der formalen Sprachen ergibt sich
folgendes Resultat:
A.1.6 Korollar
Die Abbildung
b-är : N ∋ n 7→ ak−1 · · · a1 a0 ∈ {0, 1, . . . , b − 1}+ ,
wo ak−1 · · · a1 a0 die b-äre Darstellung von n ist,
ist injektiv. Ihr Bild ist
b-är(N) = {0} ∪ {1, 2, . . . , b − 1}{0, 1, . . . , b − 1}∗ .
Für jedes n ∈ N gilt (b-är(n))b = n.
217
Das Bild der Abbildung b-är ist eine echte Teilmenge von {0, 1, . . . , b − 1}+ , da die mehr
als einziffrigen Wörter mit führenden Nullen fehlen. Diese Funktion ist also nicht geeignet,
eine Aufzählung 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äuchlich als die b-äre Darstellung, aber strukturell interessant und elegant ist die b-adische Darstellung von natürlichen Zahlen. Diese liefert eine natürliche
Bijektion zwischen N und Σ∗ , für jedes endliche Alphabet Σ.
Wir bemerken zuerst, dass wir uns ein endliches Alphabet Σ mit |Σ| = b ≥ 1 immer
als die Menge ∆b := {1, 2, . . . , b} ⊆ N vorstellen können. Wir werden im folgenden auch
immer nur von solchen Alphabeten sprechen. Wie vorher werden wir für die Darstellung
der kleinen Alphabete ∆b für 1 ≤ b ≤ 10 die Ziffern 1, 2, . . . , 9, A benutzen (A steht für
die 10).
A.1.7 Definition
Für 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<k
die durch ak−1 · · · a1 a0 dargestellte natürliche Zahl.
A.1.8 Beispiel In Tabelle A.1 geben wir b-adische Darstellungen für eine Reihe von
natürlichen Zahlen an, für b = 10, 5, 4, 3, 2, und 1.
Definition A.1.7 hat auf den ersten Blick große Ähnlichkeit mit der b-ären Darstellung.
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ücklich eingeschlossen ist. Es ist [ε]b = 0 (für 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ücksichtigt werden.
x := 0 ;
for i := k − 1 downto 0 do
x := x * b + ai ;
Die Ausgabe ist der Inhalt x von x.
Im Fall b = 1 hat die Multiplikation mit b keine Wirkung, und die einzige mögliche Ziffer
ist die 1; damit ergibt sich hier eine sehr einfache Beziehung:
[1k ]1 = k, für alle k ∈ N.
218
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
Tabelle A.1: b-adische Darstellung einiger natürlicher Zahlen
219
D. h. die 1-adische (oder monadische) Darstellung entspricht einfach der Repräsentation
einer natürlichen Zahl k durch eine Strichliste 11 · · · 11.
| {z }
k Einsen
A.1.9 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.
Man versuche, anhand von Tabelle A.1 die Gesetzmäßigkeiten zu entdecken, die das Weiterzählen von n auf n + 1 in diesen Darstellungen bestimmen! Zudem beobachte man,
dass allem Anschein nach die Wörter in ∆∗b in der kanonischen Reihenfolge“ auf”
gezählt werden, nämlich zunächst der Länge nach geordnet und innerhalb der Gruppen
gleicher Länge lexikographisch geordnet. Wie bei der b-ären Darstellung zeigt man für 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ür 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 verallgemeinerte 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<l ci bi ≥ c0 > 0
ist.
2. Fall: n ≥ 1.
Dann können wir durch leichte Modifikation der ganzzahligen Division mit Rest schreiben
n = q · b + r für ein q ∈ N und ein r mit 1 ≤ r ≤ b,
für eindeutig bestimmte q ∈ N und 1 ≤ r ≤ b. (Wenn die gewöhnliche ganzzahlige Division
n = q ′ · b + r′ für q ′ ∈ N und ein r′ mit 0 ≤ r′ < b liefert, so setzen wir (q, r) := (q − 1, b)
falls r = 0 und (q, r) := (q ′ , r′ ) sonst.) Man sieht leicht ein, dass q = ⌊(n − 1)/b⌋ < n und
r = n − qb gilt.
Wir können 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<l
Wir setzen a0 := r und ai+1 := ci für 0 ≤ i < l, und k := l + 1. Dann gilt offenbar
X
X
n=r+b·
c i bi =
ai b i ,
0≤i<l
0≤i<k
also ist ak−1 · · · a1 a0 eine b-adische Darstellung von n. –PIst weiter dm−1 · P
· · d1 d0 ∈ ∆∗b eine
beliebige b-adische Darstellung von n, so folgt aus n = 0≤i<m di bi = b·( 1≤i<m di bi−1 )+
220
P
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ür 1 ≤ i < k. Also ist ak−1 · · · a1 a0
die einzige b-adische Darstellung von n.
A.1.11 Bemerkung Analog zur b-ären 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.
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ür jedes endliche Alphabet
Σ die Menge Σ∗ abzählbar ist:
A.1.12 Korollar
Für jedes b ≥ 1 ist die Abbildung
b-adic : N ∋ 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 .
Wir haben gesehen, dass die Menge der endlichen Folgen über einem endlichen Alphabet
Σ abzählbar unendlich ist. Wie sieht es mit der Menge Seq(N) der endlichen Folgen
natürlicher Zahlen aus? Interessanterweise ergibt die Sicht auf die Zahlen in b-adischer
Darstellung eine sehr einfache Bijektion zwischen N und Seq(N).
Der Einfachheit halber betrachten wir die 2-adische Darstellung. Ein beliebiges Wort w
über {1, 2} hat das Format
w = 1···1 2 1···1 2 ···12 1···1,
| {z } | {z }
| {z }
i1 Einsen
i2 Einsen
221
ik Einsen
wobei die Anzahl k ≥ 0 und die Länge i1 , . . . , ik der Blöcke aus Einsen eindeutig gegeben
ist. Wir definieren für dieses w:
h(w) = (i1 , . . . , ik ).
Die Funktion h ist eine Bijektion von {1, 2}∗ auf Seq(N)−{( )}. (Die Wörter w, die nur aus
Einsen bestehen, werden auf die Folgen mit einer Komponente abgebildet. Insbesondere
wird das leere Wort auf h(ε) = (0) abgebildet. Wir definieren daher:
(
()
für n = 0
f (n) :=
h(2-adic(n − 1)) für n ≥ 1
Nach Korollar A.1.12 ist klar, dass diese Funktion f die Zahl 0 auf die leere Folge und die
Menge N+ bijektiv auf Seq(N) − {( )} abbildet. Daher ist f eine Aufzählung von Seq(N).
Zur Übung ermittle man die Folgen f (n) für n = 1, 3, 6, 10, 15, 21, 28.
A.2
Induktive Definitionen
Wir diskutieren in diesem Abschnitt eine für alle Bereiche der Informatik wichtige Methode für die Konstruktion von Objekten und Strukturen. Diese Methode kennen Sie aus
der Vorlesung Logische Strukturen der Informatik“; in unserer Vorlesung spielt sie ei”
ne wichtige Rolle; auch im weiteren Verlauf des Studiums und in vielen auch praktisch
wichtigen Konstruktionen der Informatik wird sie gebraucht. Die rein mathematischen
Überlegungen im letzten Teil dieses Abschnittes gehören nicht zum Prüfungsstoff. Wer jedoch den Mechanismus verstehen will, der hinter den in der Informatik allgegenwärtigen
induktiven Konstruktionen und den zugehörigen Induktionsbeweisen steckt, sollte den
hier präsentierten 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 Beispiel, das ein Konzept aus der Vorlesung Logische Syste”
me der Informatik“ anknüpft, aber unabhängig von dieser Veranstaltung nachvollzogen
werden kann.
Aussagenlogische Formeln sind Gebilde wie
(A ∨ B)
(A → (B ∨ (¬C)))
((¬A) → (A → B))
((A ∧ B) ↔ (¬((¬A) ∨ (¬B))))
222
Dabei stehen die Zeichen A, B, C für (nicht weiter spezifizierte) Aussagen; die Zeichen ¬
( nicht“), ∨ oder“, ∧ und“, → ( wenn . . . dann . . .“), ↔ genau dann wenn“ sind aussa”
”
”
”
”
”
genlogische Verknüpfungen“. Wir wollen zunächst genau definieren, was aussagenlogische
Formeln sind (und was nicht). Damit wir immer genügend Aussagezeichen ( Aussageva”
riable“) zur Verfügung haben, wählen wir (etwas willkürlich) 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 übrigens auch deswegen Variable“, weil für sie
”
”
später etwas eingesetzt werden soll, nämlich 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ände 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 ))), . . .
usw.
Keine Formeln sind hingegen
223
(wegen 4. und (ii)(β))
A0 A0 , (A0 ← A0 ), (¬¬A0 ), (A0 → A0 A1 ), (A0 ∧ A1 ∧ A2 ), . . .
Um letzteres zu begründen, müsste man (iii) in geeigneter Weise einsetzen. Intuitiv ist es
wohl klar, eine formal einwandfreie Begründung liegt zunächst nicht auf der Hand.
Wie schon erwähnt, ist die Haupteigenschaft von aussagenlogischen Formeln, dass man
für die Variablen Wahrheitswerte einsetzen kann ( 0“: false“ und 1“: true“) und dass
”
”
”
”
dann damit ganzen Formeln Wahrheitswerte zugeordnet werden. Hierfür benutzt man das
Konzept der Belegung“.
”
A.2.2 Definition Eine Belegung b ist eine Funktion b : A → {0, 1}.
(Für jedes Ai ∈ A ist b(Ai ) ein Wert 0“ oder 1“.)
”
”
Wenn eine Formel φ und eine Belegung b vorliegt, so erhält 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 “äquivalent“ 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 über den Aufbau von φ“:
”
A.2.3 Definition
folgt:
Für beliebiges b : A → {0, 1} und alF φ definieren wir valb (φ) wie
(i) valb (Ai ) = b(Ai ), für 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.
224
(Dies entspricht der klassischen Interpretation der Implikation: ψ → ϑ ist falsch
genau dann wenn ψ wahr und ϑ falsch ist.)
(ε) Ist φ = (ψ↔ ϑ), so ist
1 falls valb (ψ) = valb (ϑ)
valb (φ) =
(Dies entspricht der Äquivalenz : ψ ↔
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ählt: 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öglichen Belegung (spezifiziert für 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
0
1
1
0
1
0
1
0
0
0
0
1
0
1
0
1
0
1
1
1
0
1
1
1
1
1
1
1
1
1
Im Prinzip kann man für jede alF φ (und ihre Komponentenformeln) eine solche Wahrheitstafel aufstellen.
A.2.2
Beispiel: Korrekte Klammerausdrücke
In diesem Abschnitt wollen wir uns mit der Sprache der korrekten Klammeraus”
drücke“ (kKA) befassen. Diese Sprache isoliert ein Merkmal aus vielen in der Informatik wichtigen Sprachen: die Möglichkeit, geklammerte Ausdrücke beliebig tief ineinander
zu schachteln. Geklammerte Ausdrücke kommen in der Mathematik vor; in Programmen
gibt es geklammerte arithmetische Ausdrücke und, ebenso wichtig, Strukturen aus ineinander geschachtelten Blöcken (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ämlich ( und ), haben, und lassen aus den betreffenden Ausdrücken oder
Texten alles weg, was nicht Klammer ist. Welche Ausdrücke bleiben übrig?
225
Folgende Wörter sind korrekte Klammerausdrücke:
(), ()(()), ((())), ()()(()()),
folgende nicht:
), )(), (())), (())(, (()))(.
Im Lauf der Zeit merkt man, dass die intuitive Notation mit Klammern etwas unhandlich
ist. Wir schreiben im folgenden
0 für ( und 1 für ).
Unsere Beispiele für kKA sind dann 01, 010011, 000111, 0101001011; die Gegenbeispiele
sind 1, 101, 00111, 00110, 001110.
A.2.4 Definition
(Korrekte Klammerausdrücke)
Wir definieren die Menge der korrekten Klammerausdrücke (kKA, eine Sprache ü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 über korrekte Klammerausdrücke per Induktion über die Definition:
A.2.5 Satz
Für jeden korrekten Klammerausdruck w ∈ kKA gilt |w|0 = |w|1 .
Beweis I.A.: Offenbar ist |ε|0 = 0 = |ε|1 .
I.V.: w1 , w2 ∈ kKA erfüllen 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ünscht.
Der nächste Satz drückt eine intuitiv einleuchtende Tatsache aus: Wenn man einen korrekten Klammerausdruck von links nach rechts liest, dann hat man zu jedem Zeitpunkt
mindestens so viele öffnende Klammern wie schließende gesehen.
A.2.6 Satz Für jeden korrekten Klammerausdruck w ∈ kKA gilt: Wenn u ein Präfix
von w ist, so ist |u|0 ≥ |u|1 .
226
Beweis Wir führen Induktion über den Aufbau von korrekten Klammerausdrücken.
I.A.: Offenbar ist |ε|0 = 0 ≥ 0 = |ε|1 .
I.V.: w1 , w2 ∈ kKA erfüllen die Behauptung.
I.S.: Betrachte w = 0w1 1w2 und ein beliebiges Präfix u von w. Es gibt mehrere Fälle.
1. Fall: u = ε. – Dann gilt |u|0 = 0 ≥ 0 = |u|1 .
2. Fall: u = 0u1 für ein Präfix u1 von w1 . – Dann gilt mit Satz A.2.5:
I.V.
|u|0 = 1 + |u1 |0 ≥ 0 + |u1 |1 = |u|1 .
3. Fall: u = 0w1 1. – Dann gilt |u|0 = 1 + |w1 |0 = 1 + |w1 |1 = |u|1 .
4. Fall: u = 0w1 1u2 für ein Präfix u2 von w2 . – Dann gilt mit Satz A.2.5:
I.V.
|u|0 = 1 + |w1 |0 + |u2 |0 ≥ 1 + |w1 |1 + |u2 |1 = |u|1 .
5. Fall: u = w. – Dann gilt |u|0 = 1 + |w1 |0 + |w2 |0 = 1 + |w1 |1 + |w2 |1 = |u|1 .
Die in Satz A.2.5 und Satz A.2.6 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äfix 00111 drei Einsen und zwei Nullen, was der Bedingung in Satz A.2.6
widerspricht.
Die Bedingungen in den beiden Sätzen zusammen sind auch hinreichend: Wenn ein Ausdruck die Präfixeigenschaft von Satz A.2.6 erfüllt und insgesamt gleich viele öffnende und
schließende Klammern hat, dann liegt ein korrekter Klammerausdruck vor.
A.2.7 Satz Ist w ∈ {0, 1}∗ derart dass (i) |w|0 = |w|1 und so dass (ii) |u|0 ≥ |u|1 für
jedes Präfix u von w, dann ist w ∈ kKA.
Beweis Wir benutzen verallgemeinerte Induktion über i = |w|.
I.A.: i = 0, d. h. w = ǫ. Dieses Wort ist in kKA.
I.V.: i ≥ 1 und für alle Wörter w′ mit |w′ | = i′ < i, die (i), (ii) erfüllen, gilt w′ ∈ kKA.
I.S.: Betrachte w ∈ {0, 1}∗ mit i = |w|, so dass (i), (ii) gelten. Betrachte das kürzeste
Präfix u 6= ε von w mit |u|0 = |u|1 . (Wegen (i) ist w selbst ein solches Präfix, 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 öffnenden Klammer entspricht.)
Wegen (ii) muss w, also auch u, mit 0 beginnen; aus der Wahl von u ( kürzestes“) folgt
”
sofort, dass u mit dem Buchstaben 1 enden muss. Mit u = 0u′ 1 können wir schreiben:
w = 0u′ 1v,
227
für ein v ∈ {0, 1}∗ . Man kann sich nun leicht folgendes überlegen: u′ enthält ebenso viele
Nullen wie Einsen, und in jedem Präfix von u′ gibt es mindestens so viele Nullen wie
Einsen – das folgt wieder daraus, dass u minimale Länge hat. Noch leichter sieht man,
dass v die analogen Eigenschaften hat. Wir wenden die I.V. auf die Wörter u′ und v
an (die beide kürzer als w sind) und erhalten, dass u′ und v zu kKA gehören. Nach der
induktiven Definition A.2.4 von kKA ist also w = 0u′ 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ür die Definition der Menge (alF oder kKA)
selbst:
(i) Basisobjekte;
(ii) Vorschriften, wie aus gegebenen Objekten neue, zusammengesetzte Objekte zu gewinnen sind;
(iii) die Einschränkung: nur die durch (i) und (ii) gelieferten Objekte sind gemeint.
Weiterhin haben wir an den Beispielen die Technik Definition von Funktionen über
”
den Aufbau von induktiv definierten Objekten“ (wie valb ) kennengelernt sowie die Methode Beweis durch Induktion über den Aufbau von induktiv definierten Objek”
ten“.
Wir wollen nun einen formalen Rahmen für die obigen Konstruktionen diskutieren,
der insbesondere die benutzten Definitions- und Beweismethoden rechtfertigt.
Dieser Abschnitt ist nicht prüfungsrelevant. Allerdings muss man in der Lage sein,
in konkreten Situationen induktive Definitionen zu bauen und Definitionen und Beweise
über den Aufbau“ durchzuführen.
”
Was brauchen wir für eine induktive Definition einer Menge M von Objekten wie aussagenlogischen Formeln oder Klammerausdrücken?
(i) Basisobjekte, mit denen man anfangen kann.
(ii) Konstruktionsregeln, die sagen, unter welchen Umständen 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ören zu
M.
228
Aus technischen Gründen ist es nützlich, 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äß 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ätzlich 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ählen wir {0, 1}∗ . Die Menge der Basisobjekte gemäß Regel (i) ist B := {ε} ⊆ A. Die
Regeln (ii) zur Erzeugung neuer Klammerausdrücke sind durch die Relation
R = {((w1 , w2 ), 0w1 1w2 ) | w1 , w2 ∈ A}
gegeben. (Man sieht an diesem Beispiel, dass R auch völlig unsinnige konkrete Regeln
enthält, die beim Aufbau von M gar nicht benutzt werden. Beispielsweise liegt die Regel
((010, 00), 0010100) in R. 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, . . . }
229
(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ören müssen, für alle i ≥ 0. Regel (iii) verlangt, dass wir nicht mehr Elemente als
unbedingt nötig in M einbeziehen. Es ist daher natürlich, in die erzeugte Menge genau
die Objekte zu packen, die in einem der IRi (B) liegen und daher dazugehören müssen.
Dies führt zu folgender Definition.
[
I R (B) :=
IRi (B).
i≥0
(Der Überstrich 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üllen, die kleinste
ist. Hierzu definieren wir:
A.2.8 Definition
gilt:
C ⊆ A heißt R-abgeschlossen, wenn für alle ((a1 , . . . , al ), b) ∈ R
a1 , . . . , al ∈ C ⇒ b ∈ C.
A.2.9 Satz
(a) Die Menge I R (B) erfüllt B ⊆ I R (B) und ist R-abgeschlossen.
(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ür alle i ≥ 0.
Beweis durch vollständige Induktion über i ≥ 0:
I.A.: IR0 (B) = B ⊆ C nach Annahme.
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ür a1 , . . . , al ∈
IRi−1 (B) ⊆ C, dann ist auch b ∈ C, weil C R-abgeschlossen ist. Also ist jedes Element von
IRi (B) in C, wie gewünscht.
Aus der Behauptung folgt sofort:
I R (B) =
[
i≥0
IRi (B) ⊆ C.
230
Wir wollen Satz A.2.9 benutzen, um Induktionsbeweise im Zusammenhang mit induktiven
Definitionen zu rechtfertigen.
A.2.10 Fakt (Beweisprinzip Induktion über den Aufbau“ oder strukturelle
”
”
Induktion“) Es sei eine Menge A, eine Menge R ⊆ Seq(A) × A und ein B ⊆ A gegeben.
E(a) sei eine Eigenschaft1 , die für Elemente von A wahr oder falsch sein kann. Falls nun
gilt:
(i) E(a) für 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ür 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.9, dass I R (B) ⊆ C ist – das heißt aber gerade, dass für alle a ∈ I R (B) Eigenschaft
E(a) gilt.
A.2.11 Beispiel Bei Klammerausdrücken könnte E(w) die folgende Aussage sein: für
alle Präfixe v von w gilt: |v|0 ≥ |v|1 .
Fakt A.2.10 liefert eine Rechtfertigung für Induktionsbeweise in der in den Abschnitten A.2.1 und A.2.2 diskutierten Art. Für eine gegebene Eigenschaft E(a) zeige man nur
(i) und (ii); damit ist bewiesen, dass E(a) für alle a ∈ I R (B) gilt.
Schließlich diskutieren wir noch kurz die Möglichkeit, auf Mengen I R (B) durch Induktion
”
über den Aufbau“ Funktionen zu definieren, wie es in den Anwendungen in selbstverständlicher Weise gemacht wird.
A.2.12 Fakt Es seien A, B, R wie vorher. Die Relation R habe die zusätzliche Eigenschaft, dass für b ∈ I R (B) gilt:
b ∈ B oder ((a1 , . . . , ar ), b) ∈ R für 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ür alle a ∈ B;
(ii) für 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).
1
E“ ist ein geschwungenes E“ und hat mit ε“ (epsilon) nichts zu tun.
”
”
”
231
Den (nicht schwierigen, aber trockenen) Beweis für Fakt A.2.12 überlassen wir der Mathematik. Wir betrachten lieber noch Beispiele.
A.2.13 Beispiel Für Klammerausdrücke w definieren wir induktiv die Schachtelungstiefe d(w).
(Beispiel: d(01) = 1, d(0001011011) = 3. Deutlicher wird die Idee, wenn man die Wörter
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 Übung) Aussagen per Induktion beweisen, wie z. B. die folgende:
d(w) = max{|v|0 − |v|1 | v Präfix von w}.
A.2.14 Beispiel (Reflexive und transitive Hülle einer binären Relation) Es
sei X eine Menge, S ⊆ X × X eine binäre Relation. Wir definieren die reflexive und
transitive Hülle 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 Übung überlege man,
welche Tupel in IRi (B) liegen.)
232