Inhaltsverzeichnis - Automaten und Formale Sprachen

theoinf.tu.ilmenau.de

Inhaltsverzeichnis - Automaten und Formale Sprachen

Inhaltsverzeichnis 0 Vorbemerkungen 1 0.1 Grundbegriffe: Alphabete und Sprachen . . . . . . . . . . . . . . . . . . . . 1 1 Endliche Automaten und reguläre Sprachen 8 1.1 Deterministische endliche Automaten . . . . . . . . . . . . . . . . . . . . . 8 1.2 Nichtdeterministische endliche Automaten . . . . . . . . . . . . . . . . . . 18 1.3 Reguläre Ausdrücke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 1.4 Das Pumping-Lemma für reguläre Sprachen . . . . . . . . . . . . . . . . . 36 1.5 Abschlusseigenschaften für reguläre Sprachen . . . . . . . . . . . . . . . . . 40 1.6 Entscheidbarkeitsfragen für reguläre Sprachen . . . . . . . . . . . . . . . . 44 1.7 Die Minimierung deterministischer endlicher Automaten . . . . . . . . . . 46 2 Grammatiken und die Chomsky-Hierarchie 64 2.1 Grammatiken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 2.2 Rechtslineare Grammatiken und reguläre Sprachen . . . . . . . . . . . . . 69 3 Kontextfreie Grammatiken und Sprachen 74 3.1 Beispiele, Ableitungsbäume,Linksableitungen . . . . . . . . . . . . . . . . . 74 3.2 Die Chomsky-Normalform . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 3.3 Das Pumping-Lemma für kontextfreieSprachen . . . . . . . . . . . . . . . . 93 3.4 Der Cocke-Younger-Kasami-Algorithmus . . . . . . . . . . . . . . . . . . . 100 4 Kellerautomaten 105 4.1 Nichtdeterministische Kellerautomaten . . . . . . . . . . . . . . . . . . . . 105 4.2 Bottom-Up-Parsing,LR-Parsing . . . . . . . . . . . . . . . . . . . . . . . . 110 4.3 Akzeptierungsmodi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 4.4 Kellerautomaten und Grammatiken . . . . . . . . . . . . . . . . . . . . . . 115 i


4.5 Deterministische Kellerautomaten und ihre Sprachen . . . . . . . . . . . . 120 4.6 Abschlußeigenschaften kontextfreier Sprachen . . . . . . . . . . . . . . . . 124 4.7 Entscheidbarkeitsfragen für kontextfreieSprachen . . . . . . . . . . . . . . . 126 A b-äre und b-adische Zahldarstellung 131 A.1 Die b-äre Zahldarstellung . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 A.2 Die b-adische Zahldarstellung . . . . . . . . . . . . . . . . . . . . . . . . . 135 B Induktive Definitionen 140 C Mathematische Grundlagen 155 ii


Kapitel 0 Vorbemerkungen 0.1 Grundbegriffe: Alphabete und Sprachen 0.1.1 Vereinbarung IN = {0, 1, 2, . . .} bezeichnet die Menge der natürlichen Zahlen. 0.1.2 Definition Für eine beliebige Menge X, X ≠ ∅, bezeichnet Seq(X) die Menge der endlichen Folgen oder ” Tupel“ in X, d. h. die Menge {(a 0 , a 1 , . . . , a n−1 ) | n ≥ 0, a 0 , a 1 , . . . , a n−1 ∈ X}. (Im Gegensatz dazu ist X IN = {(a i ) i≥0 | a i ∈ X für i ≥ 0} die Menge der unendlichen Folgen in X.) Beispiel: Wir können Tupel aus natürlichen Zahlen betrachten, also Seq(IN). Die Menge Seq(IN) 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 mit Zahlen und Zahlenfolgen gerechnet. Wenn man genau hinsieht, sieht man, 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, daß Maschinen nur Zeichenreihen mit Zeichen aus einem endlichen Zeichensatz bearbeiten können. Im Anhang ” Zahldarstellungen und Abzählungen“ 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. 0.1.3 Definition Ein Alphabet Σ ist eine endliche nichtleere Menge. (Alphabete werden oft auch mit ∆, Γ, . . . bezeichnet.) Die Elemente eines Alphabets heißen Buchstaben. Typische Buchstaben sind: 0, 1, 2,. . . , a, b, c, . . . , A, B, C, . . . , #, /c, $, . . .. Die Symbole a, b, . . . , a 0 , a 1 , a 2 , . . . werden auch als Platzhalter für ” beliebige Buchstaben“ verwendet. 1


0.1.4 Beispiel 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 #. Die Menge Γ = {0, 1} 8 ist die Menge aller 8-Bit-Strings (Bytes). Der ASCII-Code gibt eine injektive Abbildung einer Menge von ” natürlichen“ Buchstaben, 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. Das lateinische Alphabet besteht aus 26 Groß- und 26 Kleinbuchstaben und einer Reihe von Sonderzeichen wie Punkt, Komma, Zwischenraum, usw. Natürlich sind Alphabete Σ und Σ ′ ” gleichwertig“, wenn |Σ| = |Σ′ | gilt, es also eine bijektive Abbildung von Σ nach Σ ′ gibt. Jedes Alphabet Σ mit |Σ| = k ist mit {1, 2, . . . , k} und {0, 1, . . . , k − 1} gleichwertig. Die Schreibweise Σ = {b 1 , b 2 , . . . , b k } bzw. Σ = {b 0 , b 1 , . . . , b k−1 } stellt die entsprechende Korrespondenz her. 0.1.5 Definition Σ sei ein Alphabet. Für n ∈ IN bezeichnet Σ n die Menge aller Folgen w = (a 0 , . . . , a n−1 ) aus n Buchstaben aus Σ. Statt (a 0 , . . . , a n−1 ) schreiben wir a 0 · · · a n−1 , falls keine Verwirrung möglich ist 1 . 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 ∈ IN}. Natürlich ist Σ ∗ = Seq(Σ). Ein besonderes Wort ist ε, das leere Wort, das einzige Wort der Länge 0 über Σ. Formal: ε = (), die leere Folge. 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 Σ + : Beispiele: Σ + := Σ ∗ − {ε} = ⋃ {Σ n | n ≥ 1}. (a) Σ = {1} : Dann ist Σ ∗ = {ε, 1, 11, 111, 1111, 11111, . . .} ̂= {0, 1, 2, 3, 4, 5, . . .}. (Dies ist die Strichlistendarstellung oder unäre Darstellung 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. 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 = 〈del1〉〈text〉〈del2〉 bei Σ = {del1, text, del2, . . .}. Treten (, ) und das Komma als Buchstaben auf, verhindert man Missverständnisse gegebenenfalls durch Einschließen in Anführungszeichen “(”, “)”, “,” oder dergleichen. 2


(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. 0.1.6 Definition Sind u = a 0 · · · a n−1 und v = b 0 · · · b m−1 Wörter (über einem Alphabet Σ), so heißt uv := a 0 · · · a n−1 b 0 · · · b m−1 (ein Wort der Länge n + m) die Konkatenation oder Hintereinanderschaltung von u und v. (Manchmal findet man auch die Notation u◦v oder u · v für diese Operation.) Beispiele: 010 ◦ 111 = 010111 ε ◦ 11 = 11 10 ◦ ε = 10 ε ◦ ε = ε 0.1.7 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 ∈ Σ ∗ . Beispiele: (00 ◦ 10) ◦ 111 = 0010111 00 ◦ (10 ◦ 111) = 0010111 100 ◦ ε = ε ◦ 100 = 100 ε ◦ ε = ε Konsequenz: Bei Konkatenation erlaubt man beliebige Klammerung, oder man lässt die Klammern weg, schreibt also 00 ◦ 01 ◦ 101. 0.1.8 Definition Für ein Wort w = a 0 · · · a n−1 ∈ Σ ∗ und einen Buchstaben a ∈ Σ sei |w| a := die Häufigkeit des Auftauchens von a in w := |{i | 0 ≤ i < n ∧ a i = a}|. Beispiele: |0101011| 1 = 4; |0101011| 0 = 3. Offenbar gilt: |uv| a = |u| a + |v| a (und ähnliche Formeln) und |w| = ∑ k i=1 |w| a i , wenn Σ = {a 1 , . . . , a k } ist. 3


0.1.9 Definition Ist w ∈ Σ ∗ ein Wort und i ∈ IN, so wird mit w i die i-fache Konkatenation von w mit sich selbst bezeichnet, d.h. w i = ww } {{ · · · w} . Formal definieren wir i−mal induktiv: w 0 := ε w i := ww i−1 , für i ≥ 1. Da Σ ⊆ Σ ∗ , ist damit auch a i für Buchstaben a ∈ Σ erklärt. Informal: a i = a } ·{{ · · a} , für i−mal i ≥ 0. Man beachte die Gleichheiten a 0 = ε und a 1 = a. 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}. Dann gilt 0001 2 0 = 000110, 00(01) 2 0 = 0001010 und (0001) 2 0 = 000100010. Ist a = 0 und w = 101, dann gilt Dann a 0 = w 0 = ε, a 6 = 000000, w 3 = 101101101. 0.1.10 ⎧ Definition u ⎫und w seien⎧Wörter über Σ. Dann⎫ heißt u ein ⎨ Teilwort ⎬ ⎨ ∃v 1 , v 2 ∈ Σ ∗ : w = v 1 uv 2 ⎬ Präfix oder Anfangsstück ⎩ ⎭ von w, falls ∃v ∈ Σ ∗ : w = uv ⎩ 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. 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. 0.1.11 Definition (a) Wenn Σ ein Alphabet ist und L ⊆ Σ ∗ , dann heißt L eine Sprache über Σ. (b) Eine Menge L heißt eine Sprache, wenn es ein Alphabet Σ mit L ⊆ Σ ∗ gibt. Sprachen interessieren uns in zweierlei Hinsicht: einmal als Formalisierung des Begriffs eines ” Berechnungsproblems“ (dieser Aspekt wird in der Vorlesung ” Algorithmentheorie“ 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 unendliche Objekte sind (man denke etwa an die Menge der syntaktisch korrekten Pascal-Programme), man sie also niemals durch Auflisten angeben kann, sondern immer nur durch Angeben von eines endlichen Menge von Regeln festlegen kann, welche Wörter zu einer Sprache gehören und welche nicht. In dieser Vorlesung werden viele solche Beschreibungsmethoden angegeben und der Umgang mit ihnen geübt. Wir 4


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. 0.1.12 Beispiel (a) L ∅ = ∅ heißt die leere Sprache; L ε = {ε} ist die Sprache, die nur das leere Wort enthält. L ∅ und L ε sind Sprache über Σ für jedes Alphabet Σ. Für jedes beliebige Alphabet Σ ist Σ ⊆ Σ ∗ , also ist die Menge Σ eine Sprache; für n ∈ IN beliebig ist Σ n eine Sprache, Σ ∗ ist Sprache über Σ. Für a ∈ Σ ist {a n | n ∈ IN} 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 enthält. Einem Binärwort w = b k−1 · · · b 0 ∈ Σ k entspricht die Zahl (w) 2 = ∑ k−1 i=0 b i2 i (Umrechnung von Binärdarstellung in natürliche Zahl.) Ist i ∈ IN, 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 ∈ IN nennen wir 1 i die Unärdarstellung von i. Offenbar ist die Abbildung IN ∋ i ↦→ 1 i ∈ {1} ∗ eine Bijektion. Eine (recht natürliche) Bijektion IN ↔ {1, 2} ∗ wird im Anhang vorgestellt. (c) Man kann nun mathematische und andere Probleme als Wortprobleme über passenden Sprachen darstellen, z. B. L gerade = {0, 10, 100, 110, 1000, 1010, 1100, . . .} = {bin(n) ∈ {0, 1} ∗ | n gerade}. L bin = {0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001, . . .} = {bin(n) | n ∈ N }. L prim = {10, 11, 101, 111, 1011, 1101, 10001, 10011, . . .} = {bin(p) | p Primzahl}. L Primzahlzwilling = {bin(i)#bin(j) | i, j ∈ IN, i = j + 2, i, j Primzahl}. 5


L P rimzahlzwilling ist eine Sprache über dem Alphabet {0, 1, #}. Das offene mathematische Problem: ” Gibt es unendlich viele Primzahlzwillinge?“ lässt sich schreiben als die Frage ” Ist L pP rimzahlzwilling 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 L 1 (über Σ 1 ) und L 2 (über Σ 2 ) immer annehmen, dass dasselbe Alphabet zugrundeliegt: man wähle einfach Σ = Σ 1 ∪ Σ 2 . 0.1.13 Definition (a) Sind L 1 und L 2 Sprachen, so heißt L 1 L 2 = {w 1 w 2 | w 1 ∈ L 1 , w 2 ∈ L 2 } (auch L 1 ◦ L 2 oder L 1 · L 2 ) die Konkatenation von L 1 und L 2 . Beispiele: {0} ∗ {1} ∗ = {0 i 1 j | i, j ≥ 0}, {1}{0, 1} ∗ = L bin − {0}. Beachte: Die Konkatenation ist assoziativ, d. h. für beliebige Sprachen L 1 , L 2 , L 3 gilt Weiter gilt (L 1 L 2 )L 3 = L 1 (L 2 L 3 ). L ε L = LL ε = L für jede Sprache L. (Damit ist für jedes Alphabet Sigma die Menge {L | L ⊆ Σ ∗ , L ≠ ∅} 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. (Die Beweise sind einfache Übungsaufgaben.) (b) Ist L Sprache, so definieren wir: L i := {w 1 w 2 · · · w i | w 1 , . . . , w i ∈ L}, für i ≥ 0. Formal: L 0 := L ε ; L i := LL i−1 für i ≥ 1. Man beachte, dass {w i | w ∈ L} ⊆ L i ist, dass aber gewöhnlich nicht Gleichheit herrscht, wie man etwa an dem Beispiel {01, 10} 2 = {0101, 0110, 1001, 1010} ≠ {0101, 1010} sieht. 6


Weiter sei L ∗ := ⋃ {L i | i ≥ 0} und L + := ⋃ {L i | i ≥ 1} (!) = LL ∗ . Die Sprache L ∗ heißt der Kleene-Abschluss von L. In Worten: L ∗ enthält die Wörter w der Form w = w 1 · · · w i , i ≥ 0, wobei w 1 , . . . , w i ∈ L; L + enthält die Wörter w = w 1 · · · w i , i ≥ 1, wobei w 1 , . . . , w i ∈ L sind. Man beachte den Unterschied zwischen L i und {w i | w ∈ L} und den Unterschied zwischen L ∗ und {w i | w ∈ L, i ≥ 0}. (c) Sprachen lassen natürlich auch alle Mengenoperationen zu, insbesondere folgende: Sind L 1 , L 2 Sprachen, so auch die Vereinigung L 1 ∪L 2 und der Durchschnitt L 1 ∩L 2 . 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 Σ ∗ ist neutrales Element bezüglich Durchschnitt: L ∩ Σ ∗ = Σ ∗ ∩ L = L. Beispiele: Betrachte L 1 = {w ∈ {0, 1} ∗ | |w| 0 = |w| 1 } und L 2 = {0} ∗ {1} ∗ = {0 i 1 j | i, j ≥ 0}. Dann ist und L 1 ∩ L 2 = {0 i 1 j | i = j} = {ε, 01, 0011, 000111, . . .} L 1 = {w ∈ {0, 1} ∗ | |w| 0 ≠ |w| 1 }. 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: Die ” Klasse aller Sprachen“, die ” Klasse der unendlichen Sprachen“, die ” Klasse der Sprachen über einem einelementigen Alphabet“, die ” Klasse der regulären Sprachen“. 7


Kapitel 1 Endliche Automaten und reguläre Sprachen Die regulären Sprachen ( ” regular sets“) sind die einfachsten formalen Sprachen. Wir werden Maschinenmodelle kennenlernen ( ” endliche Automaten“ in verschiedenen Varianten), 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 und der praktischen Informatik Anwendung findet. 1.1 Deterministische endliche Automaten In diesem einleitenden Abschnitt besprechen wir das für die regulären Sprachen grundlegende Maschinenmodell: die deterministischen endlichen Automaten ( ” deterministic finite automata“, abgekürzt ” DFA“). Diese Automaten erhalten ein Eingabewort x = a 1 · · · a n ∈ Σ ∗ (für ein Alphabet Σ) vorgelegt, das einmal von links nach rechts gelesen wird. Endliche Automaten haben eine Steuereinheit, 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 q 0 ). Startend in p 0 = q 0 , liest der DFA einen Buchstaben nach dem anderen und geht dabei in jedem Schritt in Abhängigkeit vom alten Zustand p t−1 und dem gerade gelesenen Buchstaben a t in einen Zustand p t über, für t = 1, 2, . . . , n. 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. 8


sobald der letzte Buchstabe a n gelesen wurde, wird (nur!) anhand von p n , dem schließlich erreichten Zustand, entschieden, ob x = a 1 · · · a n ” 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 Signalen 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 q 0 spezifiziert ( ” Reset-Zustand“), so bestimmt jede Signalfolge (a 1 , . . . , a n ) ∈ Σ ∗ 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, siehe weiter unten). Wir stellen die Bearbeitung eines Eingabewortes durch einen DFA wie folgt graphisch dar: a 1 a Start p = q p 2 p ... 0 0 1 2 a n p n ∋ F? Die Folge der durchlaufenen Zustände p 0 , . . . , p n wird als (gerichteter) Weg dargestellt, wobei natürlich Wiederholungen möglich sind. Die Kante vom Knoten p t−1 zum Knoten p t ist mit a t markiert. Wir geben nun eine präzise Definition von DFA’s und ihrer Arbeitsweise. 1.1.1 Definition (a) Ein deterministischer endlicher Automat ( ” deterministic finite automaton“ — DFA) M besteht aus 5 Komponenten: – einer endlichen Menge Q (der ” Zustandsmenge“); – einem Alphabet Σ; – einem ausgezeichneten Zustand q 0 ∈ Q (dem ” Startzustand“); – einer Menge F ⊆ Q von ” akzeptierenden“ Zuständen; – einer ” Übergangsfunktion“ δ : Q × Σ → Q. (Formal schreibt man M = (Q, Σ, q 0 , F, δ).) Aus technischen Gründen verallgemeinert man die Sichtweise und definiert, in welchen Zustand M gerät, wenn er in einem beliebigen Zustand q startet und das Wort w = b 1 · · · b m , m ≥ 0, liest: 9


(b) Definiere ˆδ : Q × Σ ∗ −→ Q durch Induktion über die Länge m eines Wortes w = b 1 · · · b m : ˆδ(q, ε) := q, für q ∈ Q.; ˆδ(q, b 1 · · · b m ) := δ(ˆδ(q, b 1 · · · b m−1 ), b m ), für q ∈ Q, m ≥ 1, b 1 , . . . , b m ∈ Σ. (Kurz: ˆδ(q, ε) = q, für q ∈ Q; ˆδ(q, ua) = δ(ˆδ(q, u), a), für q ∈ Q und u ∈ Σ ∗ , a ∈ Σ.) (c) Für w ∈ Σ ∗ definieren wir: M akzeptiert w, falls ˆδ(q 0 , w) ∈ F . (d) L M := {w ∈ Σ ∗ | M akzeptiert w}. Wenn L = L M , sagt man auch: ” M akzeptiert L, als Abkürzung für ” M akzeptiert die Wörter in L und nur diese“. (e) Eine Sprache L heißt regulär, falls es einen DFA M mit L = L M gibt. (Die Herkunft der Bezeichnung ” regulär“ wird in Abschnitt 1.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 × Σ ∗ . Wir schreiben immer δ statt ˆδ. Wir notieren einfache Eigenschaften, die die Aneinanderreihung von Teilrechnungen betreffen. 1.1.2 Bemerkung (a) Sind w, w ′ ∈ Σ ∗ , q ∈ Q, so ist δ(q, ww ′ ) = δ(δ(q, w), w ′ ). (b) Sind w 1 , w 2 , ∈ Σ ∗ , q ∈ Q mit δ(q, w 1 ) = δ(q, w 2 ), so ist δ(q, w 1 w ′ ) = δ(q, w 2 w ′ ) für alle w ′ ∈ Σ ∗ . 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 ′ |: Ist |w ′ | = 0, also w ′ = ε, so ist δ(q, ww ′ ) = δ(q, w) = δ(δ(q, w), ε) nach Definition 1.1.1(b). Ist |w ′ | ≥ 1 also w ′ = ua für u ∈ Σ ∗ , a ∈ Σ, so gilt: δ(q, ww ′ ) = δ(q, wua) 1.1.1(b) = δ(δ(q, wu), a) I.V. = δ(δ(δ(q, w), u), a) 1.1.1(b) = = δ(δ(q, w), ua) = δ(δ(q, w), w ′ ). (b) δ(q, w 1 w ′ ) (a) = δ(δ(q, w 1 ), w ′ ) Vor. = δ(δ(q, w 2 ), w ′ ) (a) = ˆδ(q, w 2 w ′ ). □ 10


1.1.3 Beispiel Wir beschreiben einen DFA, der genau die Dezimalzahlen akzeptiert, deren Wert nicht durch 3 teilbar ist. Nach einer bekannten Rechenregel gilt: N = (a 1 · · · a n ) 10 ist durch 3 teilbar genau dann wenn die Quersumme der Dezimaldarstellung a 1 · · · a n von N durch 3 teilbar ist, d. h. wenn ∑ 1≤i≤n a i ≡ 0 (mod 3) ist. Wir geben nun einen Automaten an, der eine Dezimalzahl ziffernweise von links nach rechts liest und dabei (in der Steuereinheit) die Quersumme der bislang gesehenen Ziffern modulo 3 speichert. Wir setzen M = (Q, Σ, q 0 , F, δ) mit Q = {0, 1, 2} (die möglichen Reste), Σ = {0, 1, . . . , 9}, q 0 = 0, F = {1, 2}; δ ist durch folgende Tabelle gegeben: δ: q\a 0 1 2 3 4 5 6 7 8 9 0 0 1 2 0 1 2 0 1 2 0 1 1 2 0 1 2 0 1 2 0 1 2 2 0 1 2 0 1 2 0 1 2 Man überzeugt sich leicht (per Induktion über t), dass M nach dem Lesen von a 1 , . . . , a t m Zustand ∑ 1≤i≤t a i mod 3 ist, sich also die Quersumme modulo 3 merkt. Aufgrund der Festlegung von F gilt dann: L M = {w ∈ {0, 1, . . . , 9} ∗ |(w) 10 nicht durch 3 teilbar}. 1.1.4 Bemerkung (Darstellungsweisen für endliche Automaten) Es wird sich als vorteilhaft erweisen, verschiedene Darstellungsweisen für endliche Automaten zur Verfügung zu haben. Wir charakterisieren zuerst die eben im Beispiel verwendete Form. 11


(a) Tabellenform: Man hat die Mengen Q und Σ durch Auflistungen gegeben, ebenso F ; weiter ein Element q 0 ∈ 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. 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 Sigma und Q, ein Bitvektor für F , ein Index für q 0 , ein zweidimensionales Array mit Einträgen aus Q für δ.) (b) Graphenform: Man kann einen DFA M als einen gerichteten Graphen G M mit Knoten- und Kantenmarkierungen auffassen. Jedem Zustand q ∈ Q entspricht ein Knoten v q mit Markierung q. Die (gerichteten) Kanten in G M sind mit Buchstaben a ∈ Σ markiert. Dabei verläuft eine mit a markierte Kante von v q nach v q ′ genau dann wenn δ(q, a) = q ′ . Beachte, dass G M Mehrfachkanten (mit verschiedenen Markierungen) und Schleifen (Kanten mit demselben Anfangs- und Endpunkt) besitzen kann. Jeder Knoten in G M hat Ausgrad |Σ|. q a q’ Einfachkante δ(q,a)=q’ d b q a b d q’ Mehrfachkante δ(q,a)=δ (q,b)=δ(q,d)=q’ a q c Schleife δ(q,a)=δ (q,c)=q (Man überlege, wieso die Tabelle für δ aus (a) eine kompakte Beschreibung von G M darstellt.) Die Knoten v q0 und v q , q ∈ F , sind speziell markiert. Wenn wir G M zeichnen, stellen wir und die Knoten v q mit q ∈ F folgendermaßen dar: v q0 Start q 0 q Bei der graphischen Darstellung vermeiden wir Mehrfachkanten von v q nach v q ′ 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 konsequent verwenden. 12


Als graphische Darstellung des Automaten aus Beispiel 1.1.3 ergibt sich folgendes: Start 0,3,6,9 2,5,8 0,3,6,9 2,5,8 0 1,4,7 1 1,4,7 2 1,4,7 2,5,8 0,3,6,9 Die akzeptierende Berechnung von M auf der Eingabe x = 12211112 wird wie folgt dargestellt: Start 1 2 2 1 1 1 1 2 0 1 0 2 0 1 2 0 2 1.1.5 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. Der folgende Automat M = (Q, Σ, q 0 , F, δ) akzeptiert L: Q = {0, 1, 2}, F = {1}, q 0 = 0, und δ gegeben durch folgendes Diagramm: Start 0 B Z 1 2 Σ Σ 2 Σ Bemerkenswert an diesem Diagramm ist der Knoten v 2 : Ein solcher Knoten stellt einen Fehlerzustand“ dar, von dem aus der Automat nie mehr akzeptieren kann. 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 Σ Würde ein Wort die Benutzung einer nicht vorhandenen Kante verursachen, ist man schon sicher, dass das Wort nicht zu L M gehört. 13


1.1.6 Bemerkung Zwischen Definition 1.1.1 und der graphischen Darstellung von DFA’s besteht folgender einfacher Zusammenhang. Dabei ist mit G M die eigentliche Version, also die mit Mehrfachkanten gemeint. Zu einem Zustand q und einem Wort x = b 1 · · · b m gehört ein eindeutig bestimmter Weg der Länge m, der in v q startet und dessen Kanten mit b 1 , . . . , b m markiert sind. Offenbar gilt δ(q, b 1 · · · b m ) = q ′ genau dann, wenn dieser Weg in v q ′ endet. (Z. B. haben wir oben den Weg, der in dem Automaten aus Beispiel 1.1.3 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 = q 0 führt zu einer Charakterisierung des Akzeptierungsbegriffs: b 1 · · · b m ∈ L M genau dann, wenn der eindeutige Weg, der in v q0 startet und Kantenbeschriftung b 1 , . . . , b m hat, in einem Knoten v q mit q ∈ F endet. 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 das Alphabet des zugehörigen Automaten beliebig wählen kann. 1.1.7 Lemma Wenn L reguläre Sprache ist und L ⊆ Σ ∗ , dann existiert ein DFA M = (Q, Σ, q 0 , F, δ) mit L = L M . Beweis Weil L regulär ist, existiert nach Definition 1.1.1 ein DFA M ′ = (Q ′ , Σ ′ , q ′ 0, F ′ , δ ′ ) mit L = L M ′. (Das Problem ist, dass Σ ≠ Σ ′ 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 enem 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 = Q ′ ∪ {q FEHLER }, für einen neuen Zustand q FEHLER , q 0 = q ′ 0, F = F ′ , δ(q, a) = δ ′ (q, a), wenn q ∈ Q ′ , a ∈ Σ ∩ Σ ′ ; δ(q, a) = q FEHLER , wenn q ∈ Q ′ , a ∈ Σ − Σ ′ ; δ(q FEHLER , a) = q FEHLER für alle q ∈ Q. In der Graphendarstellung sieht die Änderung so aus: Aus G M ′ werden alle Kanten weggelassen, die mit a ∈ Σ ′ − Σ beschriftet sind. Sodann wird ein neuer Knoten für den Fehlerzustand q FEHLER 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 δ(q 0 , w) = δ ′ (q 0, ′ w), also ist w ∈ L M genau dann wenn w ∈ L M ′ = L. Für w ∈ Σ ∗ , die mindestens einen Buchstaben aus Σ − Σ ′ enthalten, ist δ(q 0 , w) = q FEHLER , also w ∉ L M . Daraus folgt L M = L. □ 14


1.1.8 Satz (a) Die Sprache ∅ ist regulär. (b) Ist Σ ein Alphabet und w ∈ Σ ∗ , so ist {w} regulär. (Insbesondere sind also {ε} und {a} für a ∈ Σ regulär.) (c) Sind L 1 und L 2 reguläre Sprachen, so sind auch L 1 ∪ L 2 und L 1 ∩ L 2 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 = a 1 · · · a n ∈ Σ ∗ , so akzeptiert der DFA a1 a 2 a 3 a n-1 a n Start 0 1 2 . . . n-1 n Σ−{ a 1 } Σ−{ a 2 } Σ−{ a 3 } . . . Σ−{ a n } Σ q FEHLER Σ 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 q FEHLER , wobei F = {0} ist. Für w = a ∈ Σ hat der DFA drei Zustände 0, 1 und q FEHLER . 15


(c) Wähle ein Alphabet Σ mit L 1 ∪ L 2 ⊆ Σ ∗ und (nach Lemma 1.1.7 geht das!) DFA’s M 1 = (Q 1 , Σ, q (1) 0 , F 1 , δ 1 ) und M 2 = (Q 2 , Σ, q (2) 0 , F 2 , δ 2 ) mit L M1 = L 1 und L M2 = L 2 . Die Idee ist, beide Automaten gleichzeitig laufen zu lassen. Da DFA’s in jedem Schritt genau ein Zeichen lesen, ist dies nicht schwierig zu bewerkstelligen. (Aus offensichtlichen Gründen heiß die folgende Konstruktion Kreuzproduktkonstruktion.) Definiere Q := Q 1 × Q 2 , q 0 := (q (1) 0 , q (2) 0 ), ( ) δ((q (1) , q (2) ), a) := δ 1 (q (1) , a), δ 2 (q (2) , a) , für q (1) ∈ Q 1 , q (2) ∈ Q 2 , a ∈ Σ. Man zeigt dann durch Induktion über |w| : Wenn wir also definieren: δ(q 0 , w) = (δ 1 (q (1) 0 , w), δ 2 (q (2) 0 , w)) ∈ Q, für alle w ∈ Σ. F ′ := {(q (1) , q (2) ) ∈ Q | q (1) ∈ F 1 und q (2) ∈ F 2 }, F ′′ := {(q (1) , q (2) ) ∈ Q | q (1) ∈ F 1 oder q (2) ∈ F 2 }, so sehen wir (nach Definition 1.1.1), dass M ′ = (Q, Σ, q 0 , F ′ , δ) ein DFA für L 1 ∩ L 2 und M ′′ = (Q, Σ, q 0 , F ′′ , δ) ein DFA für L 1 ∪ L 2 ist. Analog kann man DFA’s für andere Boolesche Kombinationen wie L 1 − L 2 oder L 1 ⊕ L 2 = (L 1 − L 2 ) ∪ (L 2 − L 1 ) konstruieren. (Man überlege zur Übung, wie der Graph G M ′ bzw. G M ′′ aussieht. Tip: Trage die Knoten von G M ′ in ein Gitter ein, dessen Zeilen mit q (1) ∈ Q 1 und dessen Spalten mit q (2) ∈ Q 2 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 := {w 1 , . . . , w m } zu erhalten, definiere L 0 := ∅ und L i := {w 1 , . . . , w i }. Ein DFA für L i entsteht aus dem für L i−1 und dem für {w i } (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. weniger Zustände benötigt. Es sei Σ ein Alphabet mit L ⊆ Σ ∗ . F := L; Q := {u ∈ Σ ∗ | u ist Präfix eines Wortes w ∈ L} ∪ {q FEHLER }; q 0 := ε; δ(u, a) := ua, falls u ∈ Q − {q FEHLER } und ua ∈ Q, δ(u, a) := q FEHLER , falls u ∈ Q − {q FEHLER } und ua ∉ Q, δ(q FEHLER , a) := q FEHLER für alle a ∈ Σ. Man kann nun durch Induktion über |w| zeigen, dass δ(q 0 , w) = w ist, falls w Präfix eines Wortes in L ist und δ(q 0 , w) = q FEHLER sonst. Daraus folgt nach der Definition von F , dass M genau die Wörter in L akzeptiert. 16


(e) Nach Lemma 1.1.7 ist es möglich, einen DFA M = (Q, Σ, q 0 , F, δ) mit L = L M zu wählen. Dann definiere F ′ := Q − F und M ′ := (Q, Σ, q 0 , F ′ , δ), d. h. M ′ entsteht aus M durch Vertauschen von akzeptierenden und nicht akzeptierenden Zuständen. Es ist klar, dass L = Σ ∗ − L = L M ′, da für x ∈ Σ ∗ gilt: x ∈ L ⇔ x ∉ L ⇔ δ(q 0 , x) ∉ F ⇔ δ(q 0 , x) ∈ 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. □ 1.1.9 Beispiel (a) Die Sprachen L 0 = {x ∈ {0, 1} ∗ | |x| 0 gerade} und L 1 = {x ∈ {0, 1} ∗ | |x| 1 gerade} sind regulär: Offenbar ist L 0 = L M0 für folgenden DFA M 0 : 1 0 1 Start 0 1 0 Vertauschen wir bei den Kantenmarkierungen 0 und 1, erhalten wir einen DFA M 1 für die Sprache L 1 . Setzen wir in M 0 F ′ = {0, 1} − F = {1}, so erhalten wir einen DFA M 0 ′ für die Sprache L 0 = {x ∈ {0, 1} ∗ | |x| 0 ungerade}. (b) Die mit dem Verfahren von Satz 1.1.8(c) konstruierten Automaten für L 0 ∪ L 1 , L 0 ∩ L 1 , L 0 ∪ L 1 sehen im Prinzip wie folgt aus: 1 Start (0,0) 1 (0,1) 0 0 0 0 1 (1,0) (1,1) 1 Gezeichnet ist ein Automat für L 0 ∩ L 1 . 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 L 0 ∪ L 1 , und F = {(1, 1)} der Sprache L 0 ∪ L 1 . 17


1.1.10 Beispiel ( ” Endliche Automaten können nicht beliebig weit zählen“.) Wir behaupten: Die Sprache L := {x ∈ {0, 1} ∗ | |x| 0 = |x| 1 } ist nicht regulär. Der Beweis ist indirekt. Angenommen, es gilt L = L M für einen DFA M = (Q, Σ, q 0 , F, δ). Weil Q endlich ist, können die Zustände δ(q 0 , 0), δ(q 0 , 0 2 ), δ(q 0 , 0 3 ), . . . nicht alle verschieden sein, also gibt es i, j ≥ 0 mit i < j, so dass δ(q 0 , 0 i ) = δ(q 0 , 0 j ). Weil L = L M und 0 i 1 i ∈ L und 0 j 1 i ≠ L, gilt δ(q 0 , 0 i 1 i ) ∈ F und δ(q 0 , 0 j 1 i ) ∉ F . Andererseits gilt (wegen δ(q 0 , 0 j ) = δ(q 0 , 0 i ) und nach 1.1.2(b)), dass δ(q 0 , 0 i 1 i ) = δ(q 0 , 0 j 1 i ). Dies ist der gewünschte Widerspruch. Man mache sich anhand dieses Beispiels klar, was die (informale) Aussage ” Alles, was M nach dem Lesen von w ∈ Σ ∗ weiß, steckt in δ(q 0 , w)“ bedeutet. Muss der Automat zwei Wörter w 1 w 3 und w 2 w 3 unterscheiden können, so muss δ(q 0 , w 1 ) ≠ δ(q 0 , w 2 ) sein. 1.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 x u. U. mehrere legale Berechnungen. Wir legen fest, dass der Automat x akzeptiert, falls (mindestens) eine Berechnung in einem akzeptierenden Zustand endet. Formal gehen wir wie folgt vor: M spezifiziert Q, Σ, q 0 , F und eine Übergangsfunktion δ : Q × Σ → P(Q) (dabei ist q ′ ∈ δ(q, a), wenn der Automat in den Zustand q ′ übergehen darf, falls er in Zustand q ist und a liest). Man setzt dann δ wieder auf Q × Σ ∗ fort (q ′ ∈ ˆδ(q, w) bedeutet, dass der Automat, in Zustand q gestartet, das Wort w lesen und dabei in den Zustand q ′ gelangen kann). Bemerkung: 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 man aus einem solchen Automaten einen deterministischen Algorithmus für das Wortproblem gewinnen kann, wird weiter unten diskutiert. 1.2.1 Definition (a) Ein nichtdeterministischer endlicher Automat ( ” nondeterministic finite automaton“, abgekürzt NFA) M besteht aus 5 Komponenten Q, Σ, q 0 , F (wie bei DFA, Def. 1.1.1) und δ, wo δ : Q × Σ → P(Q) ist. 18


(b) Wir definieren ˆδ : Q × Σ ∗ → P(Q) wie folgt: ˆδ(q, ɛ) = {q} für alle q ∈ Q; für q ∈ Q und b 1 · · · b m ∈ Σ ∗ , m ≥ 1, ist ˆδ(q, b 1 · · · b m ) = { q ′ ∈ Q | es existiert Folge p 0 , . . . , p m in Q mit p 0 = q, p m = q ′ und p i ∈ δ(p i−1 , b i ) für 1 ≤ i ≤ m}. Genau wie im deterministischen Fall (Bemerkung nach Definition 1.1.1) sieht man, dass δ(q, a) = ˆδ(q, a) und erlaubt sich daher, δ statt ˆδ zu schreiben. (c) Für x ∈ Σ ∗ definiere: M akzeptiert x, falls δ(q 0 , x) ∩ F ≠ ∅, d. h. wenn man, von q 0 startend, x lesen und dabei einen akzeptierenden Zustand erreichen kann, oder formaler, falls eine Folge p 0 , . . . , p m in Q mit p 0 = q 0 , p m ∈ F und p i ∈ δ(p i−1 , b i ) für 1 ≤ i ≤ m existiert. (d) L M := {x ∈ Σ ∗ | M akzeptiert x}. L M heißt die von M akzeptierte Sprache. 1.2.2 Bemerkung Wir beobachten, dass sich die Mengen δ(q, b 1 · · · b m ) leicht iterativ berechnen lassen: δ(q, ɛ) = {q}; ⋃ δ(q, b 1 · · · b m ) = {q ′′ ∈ Q | ∃q ′ ∈ δ(q, b 1 · · · b m−1 ) : q ′′ ∈ δ(q ′ , b m )} = δ(q ′ , b m ), für b 1 · · · b m ∈ Σ ∗ , m ≥ 1, oder kompakter: δ(q, ua) = ⋃ δ(q ′ , a), für u ∈ Σ ∗ , a ∈ Σ. q ′ ∈δ(q,u) q ′ ∈δ(q,b 1 ...b m−1 ) Diese Formeln führen zu einem iterativen Algorithmus, der nacheinander δ(q, b 1 · · · b t ) für t = 0, 1, . . . , m berechnet und dafür Rechenzeit O(|Q| 2 · m) und Speicherplatz O(|Q|) benötigt. (Die Einzelheiten, insbesondere die benötigten Datenstrukturen, möge man sich zur Übung überlegen. Hinweis: Ein Element B ∈ P(Q) lässt sich durch einen Bitvektor der Länge |Q| darstellen.) 1.2.3 Satz Es gibt einen effizienten 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 ∈ L M oder nicht. Die Laufzeit des Algorithmus ist O(|Q| 2 · |w|). 1.2.4 Beispiel (Eingeschränktes Rucksackproblem.) Es sei Σ = {1, 2, . . . , h}, h ≥ 1 fest. Betrachte L = L R(h) = {a 1 · · · a n ∈ Σ ∗ | ∃I ⊆ {1, . . . , n} : ∑ i∈I a i = h} 19


(Kann man h als Summe einiger der Ziffern a 1 , . . . , a n erhalten?) Beispielsweise ist 222222 /∈ L R(5) , jedoch 2123213 ∈ L R(5) . Wir geben einen NFA für L R(h) an. Q := {0, 1, . . . , h}, q 0 = 0, F = {h}. Der Zustand q steht für eine bisher akkumulierte Teilsumme. Wird eine Ziffer a ∈ Σ gelesen, kann man a entweder der Teilsumme hinzufügen oder nicht: δ(q, a) := {q, q + a} ∩ Q. Wir könnten Berechnungen als Berechnungsbäume darstellen, die alle möglichen Berechnungswege enthalten. Für Beispieleingaben 2422 und 2131, wo h = 5, ergeben sich folgende Bilder: Start 0 2 2 0 2 4 4 4 2 0 4 2 2 2 2 2 0 2 4 2 4 2 2 2 2 2 2 2 2 0 2 2 4 4 2 4 4 Start 0 0 2 0 1 2 3 0 3 1 4 2 5 3 0 1 3 4 1 2 4 5 2 3 5 3 4 Man sieht, dass man gar nicht den gesamten Baum benötigt, um festzustellen, ob eine akzeptierende Berechnung auf a 1 · · · a n existiert, sondern 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 Beispiel. Man mache sich klar, dass dies genau die Mengen ˆδ(q 0 , a 1 · · · a t ), t = 0, 1, 2, . . ., sind, wie in 1.2.1 definiert. 1.2.5 Bemerkung (Vgl. Bemerkung 1.1.4) Auch NFA’s lassen sich bequem als Graph G M darstellen (vgl. 1.1.4). Wieder gibt es für jeden Zustand q ∈ Q einen Knoten v q , und von v q nach v q ′ 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 v q beginnen: 20


aus v keine Kante mit Markierung a eine Kante mit a drei Kanten mit a a q q q’ q’ a q a q’’ δ(q,a)= Ο δ(q,a)={q’} δ(q,a)={q’,q’’,q’’’} a q’’’ Die Konventionen über die Zusammenfassung von Mehrfachkanten sind dieselben wie bei den DFA’s. Beispiel 1.2.4 (Fortsetzung): Der NFA für L R(3) hat folgende Graphdarstellung: 1,2,3 1,2,3 1,2,3 1,2,3 1 1 1 Start 0 1 2 3 2 2 3 Wir beobachten, dass nunmehr Startknoten v q und Kantenbeschriftung b 1 , . . . , b m nicht mehr eindeutig einen Weg in G M festlegen. (U. U. gibt es auch keinen solchen Weg.) Jedoch gilt für q, q ′ ∈ Q, b 1 · · · b m ∈ Σ ∗ die folgende Charakterisierung des Akzeptierungsverhaltens eines NFA M. (Dies ist einfach eine Übertragung von Definition 1.2.1(b) in die Graphdarstellungs-Sprechweise.) (a) q ′ ∈ δ(q, b 1 · · · b m ) genau dann, wenn in G M ein Weg von v q nach v q ′ existiert, dessen Kanten mit b 1 , . . . , b m beschriftet sind. Und damit, nach Definition 1.2.1(b): (b) M akzeptiert a 1 · · · a n genau dann, wenn in G M ein Weg von v q0 zu einem Knoten v q mit q ∈ F existiert, dessen Kanten mit a 1 , . . . , a n beschriftet sind. (Um ein Gefühl für diese Aussage zu bekommen, suche man im Graphen G M für L R(3) Wege für Eingaben 2222 und 12312.) 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: für theoretische Untersuchungen (siehe die Beziehung zu 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. 1.2.8 unten). 21


1.2.6 Satz Ist L = L M für einen NFA M, so gilt L = L M ′ für einen DFA M ′ . Beweis ( ” Potenzmengenkonstruktion“) Sei M = (Q, Σ, q 0 , F, δ). Nach Definition 1.2.1 und Bemerkung 1.2.2 kann die Gesamtheit aller Berechnungen von M auf Eingabe x durch eine Folge δ(q 0 , ε), δ(q 0 , a 1 ), δ(q 0 , a 1 a 2 ), . . . , δ(q 0 , a 1 · · · a i ), . . . , δ(q 0 , x) von Teilmengen von Q dargestellt werden. Wir benutzen dementsprechend P(Q) als Zustandsmenge für M ′ , und definieren: M ′ := (Q ′ , Σ, q ′ 0, F ′ , δ), wo Q ′ := P(Q) = {B | B ⊆ Q}; q ′ 0 := {q 0 }; F ′ := {B ∈ Q ′ | B ∩ F ≠ ∅}; δ ′ (B, a) := ⋃ q∈B δ(q, a), für B ∈ Q ′ , a ∈ Σ. (δ ′ (B, a) ist die Menge der Zustände, die M erreichen kann, wenn in einem Zustand q ∈ B der Buchstabe a gelesen wird.) Behauptung: δ ′ ({q}, w) = δ(q, w) für alle q ∈ Q, w ∈ Σ ∗ . (δ ′ ist die eben definierte Funktion, δ ist wie in 1.2.1). Beweis der Behauptung durch Induktion über |w| : w = ε : w = ua für u ∈ Σ ∗ , a ∈ Σ: δ ′ ({q}, ε) Def.1.1.1(b) = {q} Def.1.2.1(b) = δ(q, ε). δ ′ ({q}, ua) Def.1.1.1(b) = δ ′ (δ ′ ({q}, u), a) I.V. = δ ′ (δ(q, u), a) ⋃ Def. δ = ′ δ(q ′ , a) Bem.1.2.2 = δ(q, ua). q ′ ∈δ(q,u) Damit haben wir, für alle x ∈ Σ ∗ : x ∈ L M Def.1.2.1(c) ⇔ Def. q ′ 0 ,F ′ ⇔ δ(q 0 , x) ∩ F ≠ ∅ Beh. ⇔ δ ′ ({q 0 }, x) ∩ F ≠ ∅ δ ′ (q ′ 0, x) ∈ F ′ Def.1.1.1(c) ⇔ x ∈ L M ′. Also ist L M = L M ′. □ 1.2.7 Beispiel Wir führen Beispiel 1.2.4 fort, indem wir einen DFA für L R(h) angeben. Die Potenzmengenkonstruktion liefert: Q ′ := P({0, 1, . . . , h}) Σ = {1, . . . , h} q ′ 0 := {0}, F ′ := {B ⊆ {0, 1, . . . , h} | h ∈ B} 22


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. Start 0 Ο 1,2,3 3 1 2 2 0,1 0,2 0,3 3 3 1 2,3 2 1,2,3 3 1 2 3 1 3 1 2 1 2 1 0,1,2 0,1,2,3 0,1,3 0,2,3 1,2 1 1,2,3 1 1,3 2,3 1,2,3 1,2 2,3 3 3 1,2,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 ∉ 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 B 0 = {q 0 } startet und dann nur solche Zustände generiert, die von einem bisher schon vorliegenden Zustand B 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: Setze B 0 := {q 0 }; setze B := {B 0 }. Füge {q 0 } in die Warteschlange ein. Solange die Warteschlange nicht leer ist: entnehme ein B aus der Warteschlange; für jedes a ∈ Σ teste ob B ′ = ⋃ q∈B δ(q, a) in B ist, falls nicht, setze B := B ∪ {B ′ } 23


und füge B ′ in die Warteschlange ein. Ausgabe: B. 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. 1.2.8 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... 0 1 2 n-1 0,1 n Die pure Potenzmengenkonstruktion liefert einen DFA mit 2 n+1 Zuständen. Von diesen sind 2 n nicht erreichbar, nämlich die B mit 0 /∈ B, wie man sich leicht überlegt. Durch Weglassen dieser Zustände erhalten wir einen DFA mit 2 n Zuständen. Andererseits hat jeder DFA M = (Q, Σ, q 0 , F, δ) mit L = L M mindestens 2 n Zustände. Dies sieht man folgendermaßen ein: Angenommen, |Q| < 2 n . Dann existieren zwei verschiedene Wörter a 1 · · · a n , b 1 · · · b n ∈ {0, 1} n mit δ(q 0 , a 1 · · · a n ) = δ(q 0 , b 1 · · · b n ). Wähle ein i mit a i ≠ b i , z. B. a i = 0 und b i = 1. Dann gilt a 1 · · · a i · · · a n 0 i−1 ∈ L und b 1 · · · b i · · · b n 0 i−1 ∉ L, also Andererseits ist nach 1.1.2 ein Widerspruch. δ(q 0 , a 1 · · · a n 0 i−1 ) ∈ F und δ(q 0 , b 1 · · · b n 0 i−1 ) ∉ F. δ(q 0 , a 1 · · · a n 0 i−1 ) = δ(q 0 , b 1 · · · b n 0 i−1 ), 1.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: • Starte mit den ” trivialen Sprachen“ ∅, {ε}, {a}, für a ∈ Σ; • Wende die Operationen 24


Konkatenation: L 1 , L 2 → L 1 L 2 = L 1 · L 2 = {w 1 w 2 | w 1 ∈ L 1 , w 2 ∈ L 2 } Vereinigung: L 1 , L 2 → L 1 ∪ L 2 = {w | w ∈ L 1 ∨ w ∈ L 2 } ” Kleene-Abschluss“: L → L∗ = {w 1 . . . w s | s ≥ 0, w 1 , · · · , w s ∈ 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. Für allgemeine Informationen zu induktiven Definitionen siehe den entsprechenden Anhang. 1.3.1 Definition Σ sei ein Alphabet. (a) Die Menge der regulären Ausdrücke (über Σ) ist induktiv definiert wie folgt: – ∅ und ε sind reguläre Ausdrücke. – Für jedes a ∈ Σ ist a regulärer Ausdruck. – Ist r regulärer Ausdruck, so auch (r ∗ ). Sind r 1 und r 2 reguläre Ausdrücke, so auch (r 1 r 2 ) und (r 1 + r 2 ). – (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: L(∅) := ∅; L(ε) := {ε}; L(a) := {a}, für a ∈ Σ. L((r ∗ )) := L(r) ∗ ; L((r 1 r 2 )) := L(r 1 )L(r 2 ); L((r 1 + r 2 )) := L(r 1 ) ∪ L(r 2 ). (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. 25


1.3.2 Beispiel L((01)) = L(0)L(1) = {0}{1} = {01} L((01) ∗ ) = L((01)) ∗ = {01} ∗ = {ε, 01, 0101, 010101, . . .} L((01) ∗ + (10) ∗ ) = L((01) ∗ ) ∪ L((10 ∗ )) = {ε, 01, 10, 0101, 1010, . . .} L((01) ∗ (10) ∗ ) = . . . = {(01) i (10) j | i ≥ 0, j ≥ 0}. L((a + · · · + z + A + · · · + Z)(0 + · · · + 9 + a + · · · + z + A + · · · + Z) ∗ ) ist die Menge der Pascal-Bezeichner. L((0 + 1) ∗ ) = {0, 1} ∗ ; L((0 + ε) ∗ ) = L(0 ∗ ), also (0 + ε) ∗ ∼ 0 ∗ . 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. 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: entspricht damit oder auch (01 ∗ 001 ∗ 0 + (1 + 2)0 ∗ 1 ∗ ) ∗ (((((0(1 ∗ ))((00)(1 ∗ )))0) + ((1 + 2)((0 ∗ )(1 ∗ )))) ∗ ) (((((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 + ). Schließlich notieren wir noch einige Äquivalenzen, die beim ” Rechnen“ mit regulären Ausdrücken hilfreich sind: ∅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. 26


1.3.3 Satz Ist M ein NFA, so gibt es einen regulären Ausdruck r M mit L M = L(r M ). Beweis M = (Q, Σ, q 0 , F, δ) sei gegeben. O. B. d. A. sei Q = {0, 1, . . . , s − 1}, q 0 = 0. (Ist das nicht so, numeriert 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 G M (vgl. Bemerkung 1.2.5). Demnach gilt: L(i, j) besteht aus den Wörtern b 1 · · · b m , die als Kantenbeschriftung an Wegen auftreten, die in Knoten v i beginnen und in Knoten v j enden. Unser Ziel ist es, reguläre Ausdrücke r j für L(0, j), j ∈ Q, zu finden (d. h. L(r j ) = L(0, j)). Denn dann können wir r M := r j1 + · · · + r j|F | benutzen, wo F = {j 1 , . . . , j |F | } ⊆ Q ist, weil L M = ⋃ {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) := {b 1 · · · b m ∈ Σ ∗ | ∃ Weg in G M von v i nach v j mit Kantenbeschriftung b 1 , . . . , b m der [außer v i am Anfang und v j am Ende] nur Knoten in {v 0 , . . . , v k−1 } benutzt}, für 0 ≤ i, j < s und 0 ≤ k ≤ s. Schema eines Weges in G M , der b 1 · · · b m ∈ L(i, j, k) bewirkt: i b1 b 2 b 3 ... b m-1 b m j nur Zustände in {0,...,k-1} Wir beobachten folgende Eigenschaften der Mengen L(i, j, k), für 0 ≤ i, j < s und k = 0 bzw. k = s: (1.1) i ≠ j ⇒ L(i, j, 0) = {a ∈ Σ | j ∈ δ(i, a)} = Menge der Buchstaben an Kanten i j (1.2) L(i, i, 0) = {a ∈ Σ | i ∈ δ(i, a)} ∪ {ε} = {ε} ∪ Menge der Buchstaben an Kanten i 27


(1.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 v i nach v j , der unterwegs nur Knoten in {v 0 , . . . , v k } benutzt, verläuft entweder gänzlich in {v 0 , . . . , v k−1 } oder setzt sich aus Teilwegen der folgenden Art zusammen: (i) von v i nach v k in {v 0 , . . . , v k−1 } ; (ii) von v k nach v k in {v 0 , . . . , v k−1 } [0-, 1-, oder mehrmals]; (iii) von v k nach v j in {v 0 , . . . , v k−1 }. Schematisch: Weg in {v , ..., v } 0 k-1 v i v j (l+1)-mal, l > 0 v i v k v k v k v j Daraus erkennt man: (1.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. [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 = b ” 1 · · · b m Kantenbeschriftung eines Weges von v i nach v j über Zwischenknoten in {v 0 , . . . , v k }. Falls auf diesem Weg v k 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 b 1 · · · b m in Teilwörter x, y 1 , . . . , y l , l ≥ 0, und z zerlegt, wo x die Kantenbeschriftung am Teilweg (i) ist, y 1 , . . . , y l die an den Teilwegen von Typ (ii), und z die Kantenbeschriftung am letzten Teilweg (iii). Damit ist x ∈ L(i, k, k), y 1 , . . . , y l ∈ L(k, k, k), und z ∈ L(k, j, k), also w = b 1 · · · b m = xy 1 · · · y l z ∈ 28


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 = xy 1 · · · y l z schreiben für ein l ≥ 0, x ∈ L(i, k, k), y 1 , . . . , y l ∈ L(k, k, k), z ∈ L(k, j, k). Diesen Wörtern entsprechen Wege von v i nach v k bzw. v k nach v k bzw. v k nach v j , die nur Zwischenknoten in {v 0 , . . . , v k−1 } benutzen. Hängen wir diese l + 2 Wege hintereinander, erhalten wir einen Weg von v i nach v j mit Zwischenknoten in {v 0 , . . . , v k }, 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 r i,j,k für L(i, j, k), 0 ≤ i, j < s, 0 ≤ k ≤ s. (1.1’) r i,j,0 := a 1 + · · · + a s + ∅, wo L(i, j, 0) = {a 1 , · · · , a s } ⊆ Σ, i ≠ j. (1.2’) r i,i,0 := a 1 + · · · + a s + ε, wo L(i, i, 0) = {a 1 , . . . , a s } ∪ {ε}. (1.4’) r i,j,k+1 := r i,j,k + r i,k,k (r ∗ k,k,k )r k,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(r i,j,k ), für 0 ≤ i, j < s, 0 ≤ k ≤ s. Schließlich setzen wir es ist dann klar (mit (1.3)), dass r j := r 0,j,s , für 0 ≤ j < s; L(0, j) = L(0, j, s) = L(r 0,j,s ) = L(r j ). Damit kann die Konstruktion von r M beendet werden, wie ganz am Anfang des Beweises angegeben. □ Der Beweis liefert auch eine konstruktive Methode, um r M 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 r i,j,k konstruiert, sondern nur die, die man zur Konstruktion von r 0,j,s , j ∈ F , wirklich braucht. Man kann beweisen, dass es eine Familie (M n ) n≥2 von DFS’s gibt, wo M n = (Q n , Σ n , . . . ) mit |Q n | = n, |Σ n | = n 2 , und wo der kleinste reguläre Ausdruck r n für L Mn mindestens 2 n−1 Symbole hat (vgl. Wegener-Buch, S. 132). Das bedeutet, dass im allgemeinen ein Explodieren der Größe des entstehenden regulären Ausdrucks unvermeidlich ist. 1.3.4 Beispiel Wir wollen einen regulären Ausdruck für den NFA Start 0 0 1 1 1 konstruieren. Zur Übung erzeugen wir alle r i,j,k . 29


k = 0 : k = 1: k = 2 : r 0,0,0 = 0 + ε; r 0,1,0 = 1; r 1,0,0 = ∅; r 1,1,0 = 1 + ε; r 0,0,1 = r 0,0,0 + r 0,0,0 (r ∗ 0,0,0)r 0,0,0 = (0 + ε) + (0 + ε)(0 + ε) ∗ (0 + ε) ∼ 0 ∗ ; r 0,1,1 = r 0,1,0 + r 0,0,0 (r ∗ 0,0,0)r 0,1,0 = 1 + (0 + ε)(0 + ε) ∗ 1 ∼ 0 ∗ 1; r 1,0,1 = r 1,0,0 + r 1,0,0 (r ∗ 0,0,0)r 0,0,0 = ∅ + ∅(0 + ε) ∗ (0 + ε) ∼ ∅; r 1,1,1 = r 1,1,0 + r 1,0,0 (r ∗ 0,0,0)r 0,1,0 = (1 + ε) + ∅(0 + ε) ∗ )1 ∼ (1 + ε). r 0,0,2 = r 0,0,1 + r 0,1,1 (r ∗ 1,1,1)r 1,0,1 = 0 ∗ + 0 ∗ 1(1 + ε) ∗ ∅ ∼ 0 ∗ ; r 0,1,2 = r 0,1,1 + r 0,1,1 (r ∗ 1,1,1)r 1,1,1 = 0 ∗ 1 + 0 ∗ 1(1 + ε) ∗ (1 + ε) ∼ 0 ∗ 1 + ; r 1,0,2 = ∅; r 1,1,2 = r 1,1,1 + r 1,1,1 (r ∗ 1,1,1)r 1,1,1 = (1 + ε) + (1 + ε)(1 + ε) ∗ (1 + ε) ∼ 1 ∗ . Gesamt: r M = r 0,0,2 + r 0,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. 1.3.5 Definition Ein NFA mit ε-Übergängen (kurz: ε-NFA) ist ein 5-Tupel M = (Q, Σ, q 0 , F, δ), wo Q, Σ, q 0 , F wie bei NFA’s sind (vgl. 1.2.1), mit ε /∈ Σ, aber δ : Q × (Σ ∪ {ε}) → P(Q). 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 G M von M (vgl. Bemerkung 1.2.5). Zusätzlich zu den Elementen, die G M 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, ε). 30


Beispiel: ε 1 1 ε Start 0 ε 2 ε 3 3 Abbildung 1.1: Ein ε-NFA für L(1 ∗ 3 ∗ + 2 ∗ 3 ∗ ) 2 1.3.6 Definition Sei M ein ε-NFA. (a) Für q ∈ Q, w = b 1 · · · b m ∈ Σ ∗ definieren wir ˆδ(q, w) := {q ′ ∈ Q | ∃ Weg in G M von v q nach v q ′, dessen Kantenmarkierungen, von ε’s abgesehen, gleich b 1 , . . . , b m sind }. Achtung: Es gilt ˆδ(q, ε) ⊇ {q} und ˆδ(q, a) ⊇ δ(q, a), aber nicht notwendig Gleichheit! (b) M akzeptiert x :⇔ ˆδ(q, x) ∩ F ≠ ∅. (c) L M := {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 1.2: Akzeptierende Rechnung für 1113 ∈ L M Es gibt keinen Pfad von v 0 nach v 3 mit Kantenbeschriftung ε · · · ε3ε · · · ε1ε · · · ε, also ist 31 ∉ L M . Wir stellen zunächst fest, dass ε-NFA’s nicht mehr Sprachen akzeptieren als NFA’s und DFA’s. 1.3.7 Satz Gilt L = L M für einen ε-NFA M, so ist L = L M ′ für einen NFA M ′ (also ist L regulär). 31


Beweis Sei M = (Q, Σ, q 0 , F, δ). Die einfache Idee der Konstruktion von M ′ ist es, ε- Wege kurzzuschließen“. Wo in G ” M ein Weg von v q nach v q ′ führt, der mit ε, . . . , ε, a beschriftet ist (a ∈ Σ), soll in G M ′ eine direkte, mit a beschriftete Kante von v q nach v q ′ führen. Man muss dann noch sicherstellen, dass Knoten v q , von denen aus man auf einem reinen ε-Weg zu einem Knoten v q ′, q ′ ∈ F , gelangt, selbst akzeptierend werden. Also: M ′ = (Q, Σ, q 0 , F ′ , δ ′ ), mit für q ∈ Q, a ∈ Σ, und δ ′ (q, a) := {q ′ ∈ Q | ∃ Weg in G M von v q nach v q ′, der mit ε, . . . , ε, a markiert ist }, F ′ := {q ∈ Q | ∃q ′ ∈ F : ∃ Weg (der Länge ≥ 0) in G M von v q nach v q ′, Zu zeigen ist: Für a 1 · · · a n ∈ Σ ∗ gilt: der mit ε, . . . , ε markiert ist }. M akzeptiert a 1 · · · a n ⇔ M ′ akzeptiert a 1 · · · a n . ” ⇒“: Falls M das Wort a 1 · · · a n akzeptiert, gibt es einen Weg in G M von v 0 zu einem v q mit q ∈ F , dessen Kanten mit ε, . . . , ε, a 1 , ε, . . . , ε, a 2 , . . . , ε, . . ., ε, a n , ε, . . . , ε beschriftet sind. Es seien v q1 , . . . , v qn die Knoten auf dem Weg, in die die mit a 1 , . . . , a n beschrifteten Kanten dieses Weges münden. Dann sind, nach Definition von δ ′ , die Kanten (v qi−1 , v qi ) in G M ′ mit a i beschriftet, 1 ≤ i ≤ n, und q n ∈ F ′ . Also gibt es in G M ′ einen Weg von v q0 zu v q ′ mit q ′ ∈ F ′ , dessen Kanten mit a 1 , . . . , a n beschriftet sind, d. h. M ′ akzeptiert a 1 · · · a n . ” ⇐“: Falls M ′ das Wort a 1 · · · a n akzeptiert, gibt es einen Weg v q0 , v q1 , . . . , v qn in G M ′ mit q n ∈ F ′ , so dass die Kante (v qi−1 , v qi ) mit a i beschriftet ist, 1 ≤ i ≤ n. Nach Definition von M ′ gibt es in G M Wege von v qi−1 nach v qi , die mit ε, . . . , ε, a i beschriftet sind, 1 ≤ i ≤ n, und einen Weg von v qn zu v q mit q ∈ F , der mit ε, . . . , ε beschriftet ist. Man verkettet diese n + 1 Wege, um einen zu erhalten, der von v q0 nach v q verläuft, und abgesehen von ε’s, mit a 1 , . . . , a n beschriftet ist. Also akzeptiert M das Wort a 1 · · · a n . □ Wenden wir die im Beweis angegebene Konstruktion auf das Beispiel von oben an, erhalten wir folgenden NFA. 1 1 1 3 Start 0 3 3 3 2 2 3 2 32


1.3.8 Satz Sei Σ ein Alphabet. Ist r ein regulärer Ausdruck über Σ, so existiert ein ε-NFA M r mit L(r) = L Mr . (Nach 1.3.7 und 1.2.3 ist also L(r) regulär.) Beweis Wir zeigen durch Induktion über den Aufbau von r die folgende Aussage: Es gibt einen ε-NFA M r = (Q, Σ, q 0 , {q f }, δ), mit q 0 ≠ q f . mit L(r) = L Mr . (M r 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 q 0 /∈ 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 ε , M a und die induktive Technik, mit der man aus M r1 und M r2 ε-NFA’s M (r1 +r 2 ), M (r1 r 2 ) und M (r ∗ 1 ) aufbaut. Dabei stellt ein Rechteck M: q q’ G M immer den Graphen eines ε-NFA M mit Startzustand q 0 = q und akzeptierendem Zustand q f = q ′ dar. M O : Start 0 1 Abbildung 1.3: r = ∅ : G M∅ hat keine Kante! M ε : Start 0 ε 1 Abbildung 1.4: r = ε : G Mε hat eine ε-Kante. 33


M : a Start a Abbildung 1.5: r = a : G Ma hat eine a-Kante. Abbildung 1.6: r = r 1 r 2 : Aus M r1 , M r2 M : r 1 r 2 M r 1 M r 2 baue M r wie folgt: Start G ε M G r M 1 r 2 34


Abbildung 1.7: r = r 1 + r 2 : Aus M r1 , M r2 baue M r wie folgt: M r 1 + r 2 : M r1 G Mr 1 ε ε Start ε M r2 ε G Mr 2 Abbildung 1.8: r = r ∗ 1: Aus M r1 M (r *): 1 ε baue M r wie folgt: M r1 Start ε G Mr 1 ε ε Um die Behauptung zu beweisen, müsste man für jeden der Konstruktionsschritte nachweisen, dass der zusammengesetzte Automat tatsächlich zu der Sprache L(r 1 r 2 ), L(r 1 +r 2 ), L(r1) ∗ gehört, vorausgesetzt, dies stimmt schon für L(r 1 ) und M r1 bzw. L(r 2 ) und M r2 . Dieser formale Beweis sei dem Leser/der Leserin als Übung empfohlen. Als Vorbild benutze man den Beweis der Formel (1.4) in Satz 1.3.3. □ 1.3.9 Bemerkung Die Konstruktion von ε-NFA’s (und damit NFA’s, s. Satz 1.3.7) aus regulären Ausdrücken ist wesentlich gutartiger als die umgekehrte Konstruktion. Man zeigt leicht durch Wertverlaufsinduktion über l ≥ 1: Besteht r aus l Symbolen aus {ε} ∪ 35


{a | a ∈ Σ} ∪ {∅} ∪ {+, ∗}, so hat G Mr 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 G Mr aus r in Zeit O(l) möglich, da in jedem Konstruktionsschritt nur eine fixe Menge von Kanten neu zu ziehen ist. 1.3.10 Beispiel Wendet man die Konstruktion aus 1.3.8 auf den regulären Ausdruck 0 ∗ 1 ∗ + 11 ∗ 0 an, ergibt sich folgender ε-NFA: Start ε ε ε ε ε 0 ε ε ε 1 ε ε ε ε 1 ε ε 1 ε e 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: 1.3.11 Satz Eine Sprache L ⊆ Σ ∗ ist regulär genau dann, wenn L = L(r) für einen regulären Ausdruck r über Σ. 1.3.12 Korollar Die Klasse der regulären Sprachen ist unter der ∗-Operation (Kleene- Abschluss) abgeschlossen. 1.4 Das Pumping-Lemma für reguläre Sprachen Dieser Abschnitt behandelt eine ” Struktur-Eigenschaft“, die jede reguläre Sprache besitzt (Satz 1.4.1). Diese wird meistens dazu benutzt, um nachzuweisen, dass gewisse Sprachen nicht regulär sind. 1.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. 36


( Aufpumpen“ heißt aus x = uvw die Wörter uv 2 w = uvvw, uv 3 w = uvvvw, . . . bilden; ” ” abpumpen“ heißt uv0 w = uw bilden.) Beweis Es sei L eine reguläre Sprache. Dann ist L = L M für einen NFA M = (Q, Σ, q 0 , F , δ). Die Zahl n ist einfach die Zahl |Q| der Zustände von M. Betrachte nun x = a 1 · · · a m ∈ L, m ≥ n. Es gibt eine akzeptierende Berechnung von M für x, die einem Weg P x von v q0 nach v q , q ∈ F , in G M entspricht, dessen Kanten mit a 1 , . . . , a m markiert sind: Start p a 1 p a 2 1 p a 3 2 p a 4 a n 3 p a m 0 ... n ... p m (p = q ) 0 0 Da |Q| = n, können die Zustände p 0 , p 1 , . . . , p n nicht alle verschieden sein, also gibt es k, l ∈ {0, . . . , n} mit k < l, so dass p k = p l . Wir setzen u := a 1 · · · a k ; v := a k+1 · · · a l ; w := a l+1 · · · a m . Offenbar ist x = uvw, |uv| = l ≤ n, |v| = l − k ≥ 1. Es bleibt nur die ” Pump-Eigenschaft“ nachzukontrollieren. Wir zerschneiden den Weg P x in drei Teile: P u von v q0 nach v pk , Kantenmarkierungen a 1 , . . . , a k ; P v von v pk nach v pl = v pk , Kantenmarkierungen a k+1 , . . . , a l ; P w von v pl = v pk nach v pm , Kantenmarkierungen a l+1 , . . . , a m . Sind P , P ′ zwei Wege, wo Endpunkt p und Anfangspunkt p ′ übereinstimmen, so bezeichnet P P ′ die Konkatenation der beiden. Wir haben: P u P w ist Weg von v q0 nach v pm mit Kantenmarkierung uw; P u P v P v P w ist Weg von v q0 nach v pm mit Kantenmarkierung uv 2 w; allgemein: für i ≥ 0 ist P u P v · · · P } {{ } v P w Weg von v q0 nach v pm mit Kantenmarkierung uv i w. i-mal Weil p m ∈ F , erhalten wir uv i w ∈ L für i ≥ 0. □ Als Beispiel betrachten wir den folgenden Automaten M, der die Sprache L M {0, 1} ∗ | |x| 0 , |x| 1 sind gerade} akzeptiert. = {x ∈ Start 1 0 1 1 0 0 0 0 3 1 2 1 37


Der Weg in G M , der der Eingabe x = 000101 ∈ L M entspricht, sieht so aus: Start // 0 0 3 0 0 0 3 1 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 G M Start 0 0 3 1 0 1 2 1 0 0 0 0 0 0 1 0 1 Start 0 3 0 3 0 3 2 1 0 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 1.4.1 behaupteten Eigenschaften. [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. 38


1.4.2 Behauptung Die folgenden Sprachen sind nicht regulär. (a) L 1 = {0 m 1 m | m ∈ IN}. (b) L 2 = {0 m2 | m ∈ IN}. (c) L 3 = {0 m 10 l 10 m+l | m, l ∈ IN}. (d) L 4 = {0 p | p ist Primzahl}. (e) L 5 = {w | w ∈ {(, )} ∗ ist korrekter Klammerausdruck}. Beweis (a) [1] Beweis indirekt. Annahme: L 1 ist regulär. [2] Dann existiert ein n ≥ 1 mit den im Pumping-Lemma behaupteten Eigenschaften. [3] Wir wählen x = 0 n 1 n . 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 = 0 n−|v| 1 n . Dieses Wort ist nicht in L 1 , weil |v| ≥ 1 ist. Andererseits müsste nach dem Pumping- Lemma uv 0 w ∈ L 1 sein. Das ist der gewünschte Widerspruch. (Genauso könnte man verwenden, dass uv 2 w = 0 n+|v| 1 n /∈ L 1 ist.) Wenn man das Schema einmal verstanden hat, muss man es nicht mehr ganz detailliert abschreiben, wie in den folgenden Beweisen. (b) Annahme, L 2 wäre regulär. Dann gäbe es n ≥ 1 wie im Pumping-Lemma. Wähle x = 0 n2 . Offenbar ist x ∈ L 2 , |x| ≥ n. Gemäß Pumping-Lemma kann man x = uvw schreiben, mit |uv| ≤ n, |v| ≥ 1, so dass ∀i ∈ IN : uv i w ∈ L 2 . Nun ist aber z. B. uv 2 w = 0 n2 +|v| ∉ L 2 , weil n 2 + |v| ≤ n(n + 1) < (n + 1) 2 . Dies ist ein Widerspruch. (c) Annahme, L 3 wäre regulär. Dann gäbe es n ≥ 1 wie im Pumping-Lemma. Wähle x = 0 n 110 n . Offenbar ist x ∈ L 3 , |x| ≥ n. Gemäß Pumping-Lemma kann man x = uvw schreiben, mit |uv| ≤ n, |v| ≥ 1, so dass ∀i ∈ IN : uv i w ∈ L 3 . Weil |uv| ≤ n, erstreckt sich uv nur über einen Teil der ersten n Nullen in x; also ist z. B. uv 0 w = 0 n−|v| 110 n ∉ L 3 , ein Widerspruch. (d) Annahme, L 4 wäre regulär. Dann gäbe es n ≥ 1 wie im Pumping-Lemma. Wähle x = 0 p für eine Primzahl p ≥ n + 2. Offenbar ist x ∈ L 4 und |x| ≥ n + 2. Gemäß Pumping-Lemma kann man x = uvw schreiben mit |uv| ≤ n, |v| ≥ 1, und uv i w ∈ L 4 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 L 5 benutzt man x = ( n ) n und argumentiert sonst wie in Teil (a). □ 39


Es gibt nichtreguläre Sprachen, deren Nicht-Regularität sich nicht mit dem Pumping- Lemma beweisen lässt. Zum Beipiel hat die Sprache L = {z ∈ {0, 1} ∗ | z = 1 k für ein k ≥ 0 oder z = 0 j 1 k2 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. 1.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 = y 0 y 1 · · · y n y n+1 für y 0 , . . . , y n+1 ∈ Σ ∗ , wo |y 1 | , . . . , |y n | ≥ 1, so gibt es Zahlen 0 ≤ k < l ≤ n derart dass für u := y 0 · · · y k , v := y k+1 · · · y l , w := y l+1 · · · y n+1 gilt: uv i w ∈ L für alle i ≥ 0. Beweis Analog zum Beweis von 1.4.1. □ 1.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. 1.5.1 Satz L reg , die Klasse der regulären Sprachen, enthält alle endlichen Sprachen und ist abgeschlossen unter Durchschnitt, Vereinigung, Komplementbildung, Konkatenation und Kleene-Abschluss. Beweis Für Abgeschlossenheit unter Konkatenation (sind L 1 , L 2 regulär, so auch L 1 L 2 ) und Kleene-Abschluss (ist L regulär, so auch L ∗ ), siehe 1.3.7. Die anderen Eigenschaften wurden in 1.1.8 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 L 1 = 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. 1.5.2 Definition Sei Σ = {a 1 , . . . , a n } und sei ∆ ein Alphabet. Eine Substitution ist eine Funktion f : Σ → P(∆ ∗ ), d. h. f(a i ) ist eine Sprache über ∆, für 1 ≤ i ≤ n. 40


Für w = b 1 · · · b m ∈ Σ ∗ setzen wir f(w) := f(b 1 )f(b 2 ) · · · f(b m ) } {{ } , Konkatenation von Sprachen und für L ⊆ Σ ∗ setzen wir 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}.) 1.5.3 Satz ( ” L reg ist abgeschlossen unter Substitution“) Sei f Substitution wie in 1.5.2. Sind f(a 1 ), . . . , f(a n ) reguläre Sprachen und ist L regulär, so ist auch f(L) regulär. Beweisidee: Betrachte DFA M mit L = L M und ε-NFA’s M a mit L Ma = f(a), für a ∈ Σ, und die entsprechenden graphischen Darstellungen dieser Automaten. Dabei nehmen wir an, dass die ε-NFA’s M a das Format wie in 1.3.8 haben: ein Anfangszustand und ein davon verschiedener akzeptierender Zustand. Ersetze nun in G M jede Kante (q, q ′ ) mit Markierung a ∈ Σ q a q’ durch eine Kopie von M a , wobei eine ε-Kante von v q zum Startzustand von G Ma und eine ε-Kante von dem akzeptierenden Zustand von G Ma zu v q ′. Schematisch: führt M a q ε G Ma ε 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 = w 1 · · · w r schreiben kann, wo w j ∈ f(a j ), 1 ≤ i ≤ r, und a 1 · · · a r von M akzeptiert wird. Hierfür greift man wieder auf die Argumentationsweise von Satz 1.3.3, Formel (1.4), zurück. □ 41


1.5.4 Definition Ist f eine Substitution (siehe 1.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(b 1 ) · · · f(b m ) | b 1 · · · b m ∈ L}. Ist weiter L ′ ⊆ ∆ ∗ , so kann man das Urbild betrachten ( ” inverser Homomorphismus“). f −1 (L ′ ) = {w ∈ Σ ∗ | f(w) ∈ L ′ } 1.5.5 Satz ( ” L reg ist abgeschlossen unter Homomorphismen und inversen Homomorphismen“) 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 1.5.3. Für (b) betrachte einen DFA M ′ = (Q ′ , ∆, q ′ 0, F ′ , δ ′ ) mit L ′ = L M ′. Wir definieren einen DFA M = (Q, Σ, q 0 , F, δ) wie folgt: Q := Q ′ , q 0 := q ′ 0, F := F ′ , und δ(q, a) := δ ′ (q, f(a)) , für jedes q ∈ Q, a ∈ Σ. Man zeigt jetzt durch Induktion über n, dass für a 1 · · · a n ∈ Σ ∗ gilt: Also: δ(q 0 , a 1 · · · a n ) = δ ′ (q 0 , f(a 1 ) · · · f(a n )). a 1 · · · a n ∈ L M ⇔ δ(q 0 , a 1 · · · a n ) ∈ F ⇔ δ ′ (q 0 , f(a 1 ) · · · f(a n )) ∈ F ′ ⇔ f(a 1 ) · · · f(a n ) ∈ L ′ . Also ist L M = 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. 42


1.5.6 Definition Σ sei ein Alphabet. (a) Zu w = a 1 · · · a n ∈ Σ ∗ , n ≥ 0, sei w R := a n · · · a 1 . (b) Zu L ⊆ Σ ∗ sei L R := {w R | w ∈ L}. (Beispiel: Ist L = {a n b n c n | n ≥ 0}, so ist L R = {c n b n a n | n ≥ 0}. 1.5.7 Satz Ist L regulär, so ist auch L R regulär. Beweis Wir skizzieren eine von mehreren Beweismöglichkeiten. Sei L ⊆ Σ ∗ regulär. Sei M = (Q, Σ, q 0 , F, δ) ein NFA mit L = L M . Betrachte G M . Wir fügen einen neuen Knoten v qf hinzu, mit Kanten von v q nach v qf für alle q ∈ F , die alle mit ε markiert werden. Der einzige akzeptierende Knoten im neuen Graphen G M ′ wird v qf . Offenbar ist M ′ ein ε-NFA mit L = L M ′, derart dass M genau einen akzeptierenden Zustand hat, der zudem von q 0 verschieden ist. Aus G M ′ bilde G M ′′ durch Umdrehen aller Kanten (ohne Veränderung der Markierung); v q0 wird akzeptierend, v qf wird Startknoten. Es ist klar, dass L M ′′ = L R M , da in G M ′ genau dann ein Weg von v q0 nach v qf existiert, der mit a 1 , a 2 , . . . , a n markiert ist, wenn in G M ′′ ein Weg von v qf nach v q0 existiert, der mit a n , a n−1 , . . . , a 1 markiert ist. □ Beispiel: G M : Start 0 0 1 0,1 L M = L (0 + (0 + 1) ∗ + 1) 1 G M’ : Start 0 0 0,1 ε 1 1 ε 43


L M ′ = L M G M" : 0 0 0,1 ε 1 Start L M ′′ = L R M = L (1 + (0 + 1)∗ 0 + ) 1 ε (Alternativ kann man durch Induktion über die Definition regulärer Ausdrücke beweisen, dass zu jedem regulären Ausdruck r ein r R existiert mit L(r) R = L(r R ). Die Details möge man sich als Übung überlegen.) 1.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. Insbesondere sind die folgenden Probleme für reguläre Sprachen entscheidbar: (a) Ist L = ∅? (b) Ist |L| < ∞? (c) Ist L = Σ ∗ ? (d) Ist L 1 ⊆ L 2 ? (e) Ist L 1 = L 2 ? Natürlich muss man vorher sagen, in welcher Form die regulären Sprachen gegeben sind. (Sprachen sind i. a. unendlich, also als Eingaben für Algorithmen ungeeignet.) Wir werden dabei annehmen, dass die regulären Sprachen durch entsprechende DFA’s bzw. NFA’s gegeben sind. Hat man eine andere Beschreibungsweise (regulärer Ausdruck, ε-NFA, rechtslineare Grammatik [s. Kap. 2]), so muss man aus dieser erst mit Hilfe der besprochenen Algorithmen einen DFA erzeugen. Beachte, dass dabei u. U. ein Effizienzverlust eintritt, weil die Anwendung der Potenzmengenkonstruktion auf NFA’s zu exponentiell größeren DFA’s führen kann. 44


1.6.1 Satz Es gibt effiziente (d. h. Polynomialzeit-)Algorithmen, die folgende Probleme lösen: Zu einem vorgelegtem Automaten M = (Q, Σ, q 0 , F , δ) entscheide, ob (a) L M = ∅ (für NFA M), (b) |L M | < ∞ (für NFA M), (c) L M = Σ ∗ (für DFA M). Zu DFA’s M 1 und M 2 entscheide ob (d) L M1 ⊆ L M2 , (e) L M1 = L M2 . Beweis Wir formulieren die Algorithmen alle in der graphentheoretischen Sprache, stellen uns also vor, dass ein Automat M als Graph G M gegeben ist. Beachte, dass die Tabelle (das |Q|×|Σ|-Array mit Einträgen aus f(Q) (für NFA’s) bzw. aus Q (für DFA’s)) für δ im wesentlichen in seinen Zeilen die Adjazenzlisten für G M enthält, einschließlich der Kantenmarkierungen. Es ist fair, als Eingabegröße für diesen Graphen |δ| := |Q|+Σ q∈Q,a∈Σ |δ(q, a)| anzusetzen, das ist die Summe aus Knoten- und Kantenzahl in G M . (a) Offenbar ist L M ≠ ∅ genau dann, wenn es in G M überhaupt einen Weg von v q0 zu einem v q mit q ∈ F gibt (ohne auf die Kantenmarkierungen zu achten). Dies lässt sich z. B. durch einen einfachen Markierungsalgorithmus feststellen. Der Zeitbedarf hierfür ist O(|δ|). (b) Wir überlegen zunächst, dass |L M | = ∞ ist genau dann, wenn es in G M einen Weg von v q0 zu einem v q mit q ∈ F gibt, der einen Kreis enthält. [ ⇒: Ist |L ” M | = ∞, so existiert x ∈ L M mit |x| ≥ |Q|. Die Existenz eines akzeptierenden Weges, der einen Knoten zweimal benutzt, also einen Kreis enthält, folgt wie in 1.4.1. ⇐“: Gibt es einen ” Weg von v q0 zu v q , q ∈ F, mit einem Kreis, so besitzt nach dem Argument von 1.4.1 L eine unendliche Teilmenge der Form {uv i w | i ∈ IN}, mit |v| ≥ 1 also ist L unendlich.] Algorithmus 1. Konstruiere die Umkehrung von G M : ← GM:= ( {v q | q ∈ Q}, {(v q , v q ′) | (v q ′, v q ) Kante in G M } 2. Mittels eines Markierungsalgorithmus in ← GM, startend von {v q | q ∈ F }, ermittle die Menge V ′ = {v q ′ | ∃ Weg in ← GM von v q nach v q ′ für ein q ∈ F } ( = {v q ′ | ∃ Weg in G M von v q ′ nach v q für ein q ∈ F } ). 3. Bilde G ′ := Einschränkung von G M auf V ′ . Falls V q0 ∉ V ′ , stoppe mit der Antwort ” endlich“. 4. Ein geschickter Graphalgorithmus, genannt ” erweiterte Tiefensuche in G ′ “, vom Knoten v q0 startend, erlaubt es festzustellen, ob von v q0 aus ein gerichteter Kreis in G ′ erreichbar ist. Falls dies so ist, wird ” ∞“ ausgegeben, sonst ” endlich“. 45 ) .


Schritte 1 und 2 konstruieren die Menge V ′ aller Knoten, von denen aus man nach einem Knoten v q , q ∈ F , gelangen kann. Die anderen Knoten können natürlich für das Akzeptieren von Wörtern keine Rolle spielen; man kann sie weglassen. Dies liefert G ′ . Die eingangs bewiesene Äquivalenz zeigt, dass tatsächlich L M unendlich ist genau dann wenn von v q0 aus ein gerichteter Kreis in G M ′ erreichbar ist. Also ist der Algorithmus korrekt. Die Laufzeit ist durch den Aufwand für die Tiefensuche in ← GM bzw. G M ′ beschränkt; dies ist immer O(|δ|) = O(Größe von G M ). (Für Details zur Tiefensuche siehe das Buch von Cormen/Leiserson/Rivest, S. 447ff., insbesondere Lemma 23.10, oder die Vorlesung Effiziente Algorithmen“.) ” (c) Da M ein DFA ist, genügt es zu testen, ob es einen Weg von v q0 zu einem v q mit q ∉ F gibt. Dies macht man ähnlich wie in Teil (a) beschrieben. (d) Zu M 1 , M 2 bilde M ′ 2 mit L M ′ 2 = L M2 . Wie in 1.1.8(c) bilde M ′ mit L M ′ = L M1 ∩L M ′ 2 = L M1 ∩ L M2 = L M1 − L M2 . Teste (mit dem Verfahren aus (a)) ob L M ′ = ∅. (Die Laufzeit dieses Algorithmus ist linear in der Größe von G M ′, das ist O(|Q 1 |·|Q 2 |·|Σ|).) (e) Teste, wie in (d), ob L M1 ⊆ L M2 und L M2 ⊆ L M1 . □ 1.7 Die Minimierung deterministischer endlicher Automaten In diesem Abschnitt suchen wir effizienteste DFA’s zu einer vorgegebenen regulären Sprache L. Was soll das sein? Jeder DFA macht auf einem Eingabewort der Länge n genau n Schritte. Ein vernünftiges Komplexitätsmaß für DFA’s ist die ” Größe“, also die Zahl der Zustände. Wir suchen also nach DFA’s mit möglichst wenigen Zuständen. In Beispiel 1.2.7 (siehe dortige Illustration) haben wir gesehen, daß die Potenzmengenkonstruktion mitunter Zustände erzeugt, die gar nicht erreichbar sind, also in keiner Berechnung eine Rolle spielen. Solche Zustände können wir natürlich weglassen, und dadurch die Zahl der Zustände eines gegebenen DFA verringern. 1.7.1 Definition Sei M = (Q, Σ, q 0 , F, δ) ein DFA. Ein Zustand q ∈ Q heißt unerreichbar oder überflüssig, wenn δ(q 0 , w) ≠ q für alle w ∈ Σ ∗ (d. h.(!) wenn es in G M keinen Weg von v q0 nach v q gibt). Ein Zustand q ∈ Q heißt erreichbar, wenn δ(q 0 , w) = q für ein w ∈ Σ ∗ . Wieso können überhaupt überflüssige Zustände auftreten? Hierzu betrachte man Beispiel 1.2.7. Dort sind die Zustände B ∈ Q ′ mit 0 ∉ B unerreichbar. Dieses Beispiel zeigt auch, daß mechanische Konstruktionen ohne weiteres in der Lage sind, unerreichbare Zustände zu generieren. ” Von Hand“ konstruierte DFA’s werden natürlich keine solchen Zustände enthalten. 46


1.7.2 Bemerkung (a) Zu M definieren wir M ′ = (Q ′ , Σ, q 0 , F ′ , δ ′ ) durch: Q ′ := Q − {q | q überflüssig}, F ′ := Q ′ ∩ F, δ ′ := δ ¯ Q ′ × Σ, die Einschränkung von δ auf Q ′ × Σ. (Man läßt in G M alle überflüssigen Knoten und die damit inzidenten Kanten weg.) Dann gilt: M ′ ist DFA ohne überflüssige Zustände, und L M = L M ′. (b) Es gibt einen effizienten Algorithmus zum Auffinden der Menge U der überflüssigen Zustände eines DFA. Beweis (a) Nach Definition entspricht Q ′ genau der Menge der Knoten in G M , die von v q0 aus auf einem Weg in G M erreichbar sind. Damit haben G M und G M ′ genau dieselben von v q0 aus startenden Wege, mit denselben Kantenmarkierungen. Daraus folgt L M = L M ′. Weiterhin sind alle in G M von v q0 aus erreichbaren Knoten auch in G M ′ erreichbar, also hat G M ′ keine unerreichbaren Zustände. (b) Zum Auffinden der Menge U benutzt man einen einfachen Markierungsalgorithmus: Algorithmus ” ERREICHBAR“: var H: subset of Q (Halde: die markierten, noch nicht bearbeiteten Zustände) T: subset of Q (die als erreichbar markierten Zustände) begin T:=H:={q 0 } while H≠ ∅ do entnehme (beliebiges) ⎫p aus H for all a ∈ Σ do r:= δ(p, a) ⎪⎬ if r ∉ T then T:=T ∪{r} ⎪⎭ H:=H ∪{r} return T end bearbeite p“ ” Die Ausgabe, die in T erscheint, nennen wir T ∗ . Man beweist ohne Mühe: T ∗ = {q ∈ Q | q erreichbar}. Also kann man U := Q − T ∗ setzen. Die Laufzeit des Algorithmus ” ERREICHBAR“ ist O(|Q| · |Σ|), wenn man geeignete Datenstrukturen benutzt. Wir betrachten ab sofort in diesem Abschnitt nur noch DFA’s ohne überflüssige Zustände. Daß ein DFA keine überflüssigen Zustände enthält, heißt noch nicht, daß er schon die minimale Zahl von Zuständen für die akzeptierte Sprache hat. 47


1.7.3 Beispiel Sei M, ein Automat mit 5 Zuständen, durch den folgenden Graphen gegeben: 0 Start 0 1 0 1 1 2 1 1 1 0 3 4 0 0 (Man überlege, was die von M akzeptierte Sprache L M ist.) Wir beobachten, durch Inspektion, daß die Zustände ” 1“ und ” 2“ vom Standpunkt von M aus ” dasselbe tun“: für jedes w ∈ Σ ∗ gilt: δ(1, w) ∈ F ⇔ δ(2, w) ∈ F . Nun kann man eigentlich auf den Zustand ” 2“ verzichten und alle Kanten, die auf v 2 zeigen, auf v 1 umhängen, ohne die Menge der Markierungen der akzeptierenden Wege zu verändern: 0 1 0,1 1 1 Start 0 1 0 3 4 0 Nun ist Zustand 4“ überflüssig geworden, und mit 1.7.2 erhalten wir durch Weglassen ” dieses Zustandes einen Automaten mit drei Zuständen für L M (der sich nicht weiter verkleinern läßt). Nun ist es für größere DFA’s mühsam, mit solchen Einzelbeobachtungen einen minimalen Automaten zu konstruieren. Wir gehen besser systematisch vor. Dies liefert dann auch einen Algorithmus, der sich zur automatischen Minimierung benutzen läßt. Erinnerung: 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. 48


Ist ∼ eine Äquivalenzrelation, so werden dadurch in X ” Äquivalenzklassen“ [x] := [x] ∼ := {y ∈ X| x ∼ y} definiert. Es gilt: x ∼ y ⇔ [x] = [y] und x ≁ y ⇒ [x] ∩ [y] = ∅. Beispiel: X = {0, 1, 2, 3, 4, 5, 6, 7, 8, 10}. Mit x ∼ y :⇔ 3 teilt (x − y) ergeben sich die folgenden Klassen: [0] = [3] = [6] = [9] = {0, 3, 6, 9}, [1] = [4] = [7] = [10] = {1, 4, 7, 10}, [2] = [5] = [8] = {2, 5, 8}. Eine Partition von X ist eine Familie von Mengen ∅ ≠ X i ⊆ X, i ∈ I, für eine passende Indexmenge I, so daß X = ⋃ i∈I X i und aus i ≠ j folgt X i ∩ X j = ∅. Man lernt in der Mathematik, daß 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 {X i | i ∈ I} von X gegeben, erhält man eine Äquivalenzrelation durch die Festsetzung: x ∼ y falls x, y ∈ X i für ein i ∈ I. (Die künstlich erscheinende Terminologie der Äquivalenzrelationen wird nur verwendet, weil sie effizienter handhabbar ist als die Sprechweise mit Partitionen.) 1.7.4 Definition Sei M = (Q, Σ, q 0 , F, δ) ein DFA ohne überflüssige Zustände. Für q, q ′ ∈ Q definiere: q ∼ q ′ wenn für alle w ∈ Σ ∗ gilt: δ(q, w) ∈ F ⇔ δ(q ′ , w) ∈ F . (Intuitiv gesprochen: Zustände q 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, q und q ′ nicht unterscheiden kann.) 1.7.5 Lemma Die in 1.7.4 definierte Relation ∼ ist eine Äquivalenzrelation auf Q. Beweis Daß ∼ reflexiv, symmetrisch und transitiv ist, ergibt sich sofort aus den entsprechenden Eigenschaften von ⇔“. □ ” Die Äquivalenzrelation ∼ zerlegt Q in Äquivalenzklassen. Wir zeigen nun, daß sich die Menge dieser Äquivalenzklassen als Zustandsmenge eines DFA für L M mit minimaler Größe benutzen läßt. 1.7.6 Definition Sei ∼ wie in 1.7.4 definiert. Nun definiere einen DFA ˜M = ( ˜Q, Σ, ˜q 0 , ˜F , ˜δ) durch: ˜Q := {[q] | q ∈ Q} (Äquivalenzklassen bzgl. ∼) ; ˜q 0 := [q 0 ] ; ˜F := {[q] | q ∈ F } ; ˜δ([q], a) := [δ(q, a)], für [q] ∈ ˜Q, a ∈ Σ. 49


1.7.7 Beispiel Man betrachte den folgenden DFA M = (Q, Σ, q 0 , F, δ) mit Q = {0, 1, . . . , 8}, Σ = {a, b}, q 0 = 0, F = {0, 1, 4, 5, 6, 8}: a Start 0 a 1 a 2 b b b a 3 a 4 a 5 b b b b b b 6 a 7 a 8 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. Nicht akzeptiert werden die Wörter w, für die |w| a − |w| b − 2 durch 3 teilbar ist. (Dieser DFA ergibt sich aus einer Variante der Kreuzproduktkonstruktion (vgl. 1.1.8(c)), angewendet auf zwei DFA’s zum Zählen der a’s bzw. b’s modulo 3.) Durch etwas Herumprobieren und Entdecken von zyklischen Symmetrien kommt man bald zu folgender Vermutung: {0, 4, 8}, {1, 5, 6}, {2, 3, 7} bilden die drei Äquivalenzklassen bzgl. ∼. Dabei ist Nichtäquivalenz leicht feststellbar: Für die Äquivalenz beobachtet man: 0 ≁ 5 weil δ(0, b) = 3 ∉ F, δ(5, b) = 8 ∈ F. 5 ≁ 2 weil δ(5, ε) = 5 ∈ F, δ(3, ε) = 3 ∉ F. 7 ≁ 0 weil δ(0, ε) = 0 ∈ F, δ(7, ε) = 7 ∉ F. δ(0, ε) = 0 ∈ F, δ(0, a) = 1 ∈ F, δ(0, b) = 3 ∉ F, δ(0, aa) = 2 ∉ F, δ(0, ab) = 4 ∈ F, . . . und δ(8, ε) = 8 ∈ F, δ(8, a) = 6 ∈ F, δ(8, b) = 2 ∉ F, δ(8, aa) = 7 ∉ F, δ(8, ab) = 0 ∈ F, . . . (Hier deutet sich schon ein algorithmisches Problem an: Wie soll man die Tatsache q ∼ q ′ feststellen? Man kann ja schlecht alle unendlich vielen Wörter w ∈ Σ ∗ durchtesten.) 50


Damit ergibt sich mit Definition 1.7.6: ˜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: a Start 0,4,8 a b 1,5,6 a b 2,3,7 b Man bemerkt, daß kein Konflikt entsteht: Für jede Klasse [q] ∈ ˜Q ist [q] ⊆ F oder [q] ∩ F = ∅ und es gilt stets q ∼ q ′ ⇒ δ(q, c) = δ(q ′ , c) für c ∈ Σ. Daß dies kein Zufall ist, wird gleich gezeigt. 1.7.8 Satz Sei M ein DFA ohne überflüssige Zustände; sei ˜M zu M wie in 1.7.6 definiert. Dann gilt: (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 DFA; (d) L M = L ˜M; (e) Unter allen DFA’s M ′ mit L M ′ = L M hat ˜M die minimale Zahl von Zuständen. Beweis (a) Sei q ∼ q ′ . Nach Def. 1.7.4 gilt q ′ = δ(q ′ , ε) ∈ F genau dann wenn q = δ(q, ε) ∈ F . (b) Wohldefiniertheit bedeutet, daß 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 ∈ Σ ∗ : weil q ∼ q ′ . Also gilt für alle w ∈ Σ ∗ : δ(q, aw) ∈ F ⇔ δ(q ′ , aw) ∈ F, δ(δ(q, a), w) ∈ F ⇔ δ(δ(q ′ , a), w) ∈ F, 51


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 ∈ Σ ∗ . (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: wie gewünscht.) Damit haben wir für beliebige w ∈ Σ ∗ : ˜δ([q], ua) = ˜δ(˜δ([q], u), a) I.V. = ˜δ([δ(q, u)], a) Def.˜δ = [δ(δ(q, u), a)] = [δ(q, ua)], w ∈ L ˜M ⇔ ˜δ(˜q 0 , w) ∈ ˜F HB ⇔ [δ(q 0 , w)] ∈ ˜F Teil(a) ⇔ δ(q 0 , w) ∈ F ⇔ w ∈ L M . (e) Beweis indirekt. Annahme: Es existiert ein DFA M ′ = (Q ′ , Σ, q ′ 0, F ′ , δ ′ ) mit L M ′ = L M und |Q ′ | < | ˜Q|. Setze s := | ˜Q|. Weil M keinen überflüssigen Zustand hat, gibt es für jedes q ∈ Q ein w ∈ Σ ∗ mit δ(q 0 , w) = q. Wähle nun für jede Äquivalenzklasse in ˜Q ein Wort; genauer wähle w 1 , . . . , w s ∈ Σ ∗ derart daß ˜Q = {[δ(q 0 , w 1 )], . . . , [δ(q 0 , w s )]}. Daraus folgt, daß δ(q 0 , w i ) ≁ δ(q 0 , w j ) für 1 ≤ i < j ≤ s. Andererseits ist |Q ′ | < s. Mit dem Schubfachprinzip erhalten wir, daß es i, j, 1 ≤ i < j ≤ s gibt mit Daraus folgt aber, für beliebige w ∈ Σ ∗ : δ ′ (q ′ 0, w i ) = δ ′ (q ′ 0, w j ). δ ′ (δ ′ (q ′ 0, w i ), w) ∈ F ′ ⇔ δ ′ (δ ′ (q ′ 0, w j ), w) ∈ F ′ , d. h. δ ′ (q 0, ′ w i w) ∈ F ′ ⇔ δ ′ (q 0, ′ w j w) ∈ F ′ , d. h. w i w ∈ L M ′ ⇔ w j w ∈ L M ′ d.h., weil L M ′ = L M : δ(q 0 , w i w) ∈ F ⇔ δ(q 0 , w j w) ∈ F, d. h. δ(δ(q 0 , w i ), w) ∈ F ⇔ δ(δ(q 0 , w j ), w) ∈ F. Das letzte bedeutet δ(q 0 , w i ) ∼ δ(q 0 , w j ), im Widerspruch zur Annahme. □ 52


Anmerkung: Wenn man etwas genauer hinsieht, kann man sogar feststellen, daß alle Automaten für eine reguläre Sprache mit der minimalen Zustandszahl gleich“ sind. ” Sind nämlich M = (Q, Σ, q 0 , F, δ) und M ′ = (Q ′ , Σ, q 0, ′ F ′ , δ ′ ) zwei solche Automaten, so definiert die Abbildung Φ : Q → Q ′ , die durch Φ(δ(q 0 , w)) := δ ′ (q 0, ′ w) gegeben ist, einen Isomorphismus“ der Automaten. Die genaue Formulierung dieser Behauptung und ” ihr Beweis ist eine Übungsaufgabe. Im Lichte dieser Tatsache ist es gerechtfertigt, den Äquivalenzklassenautomaten ˜M den Minimalautomaten für L M zu nennen. Leider sind wir immer noch nicht ganz fertig. Wir haben den Minimalautomaten ˜M zwar definiert, aber wie soll man ˜M berechnen? Der Test auf Äquivalenz von Zuständen (∀w ∈ Σ ∗ : δ(q, w) ∈ F ⇔ δ(q ′ , w) ∈ F ) verlangt auf den ersten Blick das Testen von unendlich vielen Wörtern. Der im folgenden beschriebene und analysierte Spaltungsalgorithmus berechnet die Äquivalenzklassen zu ∼ durch iterierte Verfeinerung der Partition (F, ¯F ) von Q. Dem Algorithmus liegt die einfache Idee zugrunde, daß wenn δ(p, a) und δ(q, a) in verschiedenen Klassen liegen, dies auch für p und q gelten muß. 1.7.9 Algorithmus ( ” Spaltungsalgorithmus“) Gegeben: DFA M = (Q, Σ, q 0 , F, δ), ohne überflüssige Zustände. Es sei Σ = {a 1 , . . . , a s }, s ≥ 1, in irgendeiner Anordnung. Datenstrukturen: 1) Übergangsfunktion δ von M, z.B. als Tabelle. 2) Veränderliche Zerlegung von Q in Klassen K 1 , . . . , K t . Manche der Klassen sind markiert“. (Markierte Klassen werden nochmals darauf getestet, ob sie weiter zerlegt werden müssen; man kann die Markierung also als fragil“ oder zerbrechlich“ ” ” ” lesen.) Vorteilhaft ist es, jede Klasse K i durch eine Liste ihrer Elemente darzustellen, andererseits zu jedem q ∈ Q den Index k(q) ∈ {1, . . . , t} der Klasse, zu der q gehört, zu vermerken. Ablauf: Initialisierung (oder nullte Spaltungsrunde): K 1 := F ; K 2 := Q − F ; beide Klassen werden markiert. Schleife: solange es eine markierte Klasse gibt: Wähle eine markierte Klasse K := K j beliebig. ( ) Für jedes q ∈ K bestimme den Vektor w q := k(δ(q, a 1 )), . . . , k(δ(q, a s )) 1. Fall: alle w q , q ∈ K, sind gleich: entferne Markierung von K. ∈ {1, . . . , t} s . 53


2. Fall: sonst. Dann zerlege K in Gruppen G 1 , . . . , G l gemäß den l ≥ 2 verschiedenen w q -Werten. Die Gruppen werden neue Klassen und erhalten die Indizes j (NB: ehemals K = K j ) und t + 1, . . . , t + l − 1. Die neuen Klassen sind zunächst unmarkiert. Aber: Für jede (alte wie neue) Klasse K i , 1 ≤ i ≤ t + l − 1: wenn K i zwei verschiedene Zustände p und q enthält, so daß δ(p, a) und δ(q, a) in der eben zerlegten Klasse K liegen, für einen Buchstaben a ∈ Σ, dann markiere K i . Ausgabe: Sobald keine markierten Klassen mehr vorhanden sind: Partition K 1 , . . . , K t wird ausgegeben. Bevor wir uns dem formalen Beweis der Korrektheit zuwenden, wird der Algorithmus an einem Beispiel durchgeführt. Der DFA M sei durch den folgenden Graphen gegeben: Start a 0 b a a 1 2 b a b a 3 4 5 b a b a b 6 7 8 9 b a,b a b a,b (L M besteht aus allen Wörtern w ∈ {a, b} ∗ mit folgender Eigenschaft: Wenn man w = u 1 u 2 · · · u r u r+1 schreibt mit |u 1 | = · · · = |u r | = 3 und |u r+1 | ≤ 3, so enthält jeder Block eine gerade Anzahl von b’s.) Initialisierung: K 1 = F = {0, 1, 3, 5, 6, 8} 54


K 2 = Q − F = {2, 4, 7, 9} Markiert: K 1 , K 2 . 1. Schleifendurchlauf: Wähle K = K 1 . Wir tragen w q = ( k(δ(q, a)), k(δ(q, b)) ) , q = 0, 1, 3, 5, 6, 8 als Spalten in eine Tabelle ein: q 0 1 3 5 6 8 a 1 1 1 1 1 1 b 2 2 2 2 2 2 Alle Spalten w q sind gleich. Also wird die Markierung von K 1 entfernt. 2. Schleifendurchlauf: Die einzige markierte Klasse ist K 2 . Setze K = K 2 . Tabelle: q 2 4 7 9 a 2 2 2 2 b 1 1 2 2 Wir bilden neue Klassen anhand der verschiedenen Spalten: K 2 := {2, 4} (geschrumpft!) K 3 := {7, 9} (neu!) Markiert werden K 1 (weil z.B. δ(1, b), δ(3, b) ∈ K) und K 2 (weil δ(2, a), δ(4, a) ∈ K) und K 3 (weil δ(7, a), δ(9, a) ∈ K). 3. Schleifendurchlauf: Wähle K = K 1 . Neue Tabelle: q 0 1 3 5 6 8 a 1 1 1 1 1 1 b 2 2 3 3 2 2 Neue Klassen, anhand verschiedener Spalten: K 1 := {0, 1, 6, 8} (geschrumpft!) K 4 := {3, 5} K 2 und K 3 bleiben markiert; markiert werden K 1 (weil z.B. δ(0, a), δ(1, a) ∈ K) und K 4 (weil δ(3, a), δ(5, a) ∈ K). 4. Schleifendurchlauf: K = K 1 . Neue Tabelle: q 0 1 6 8 a 1 4 1 1 b 2 2 2 2 Neue Klassen: K 1 = {0, 6, 8} K 5 = {1}. K 5 wird nicht markiert, weil einelementig, wohl aber K 1 (weil δ(0, a), δ(6, a) ∈ K). K 2 , K 3 , K 4 bleiben markiert. 55


5. Schleifendurchlauf: K = K 1 . Neue Tabelle: q 0 6 8 a 5 5 5 b 2 2 2 Die Markierung wird von K 1 entfernt. 6. Schleifendurchlauf: K = K 2 . Tabelle: q 2 4 a 2 3 b 4 1 Wir erhalten die neuen Klassen K 2 := {2} und K 6 := {4}, beide unmarkiert. K 1 wird wieder markiert (weil δ(6, b), δ(8, b) ∈ K). 7. Schleifendurchlauf: K = K 1 . Tabelle: q 0 6 8 a 5 5 5 b 2 2 2 Die Markierung wird von K 1 entfernt. 8. Schleifendurchlauf: K = K 3 . Tabelle: q 7 9 a 3 3 b 3 3 K 3 verliert die Markierung. 9. Schleifendurchlauf: K = K 4 . Tabelle: q 3 5 a 1 1 b 3 3 K 4 verliert die Markierung. Nun gibt es keine markierten Klassen mehr. Die resultierende Partition ist: K 1 = {0, 6, 8} K 2 = {2} K 3 = {7, 9} K 4 = {3, 5} K 5 = {1} K 6 = {4} . Weiter: ˜q 0 = [q 0 ] = {0, 6, 8} = K 1 . 56


{ } ˜F = {K i | K i ⊆ F } = {0, 6, 8}, {3, 5}, {1} . Die Übergangsfunktion ist durch folgenden Graphen gegeben. Man beachte, daß man die Werte ˜δ(K i , c), c ∈ Σ, mit |K i | ≥ 2 aus dem Algorithmus entnehmen kann (Durchläufe 7, 8, 9, wo Klassen letztmalig die Markierung verlieren). Die Werte ˜δ(K i , c), |K i | = 1, muß man als k(δ(K i , c)) ermitteln. Resultat: Start a K 4 a b K K K 1 5 2 3 a b b b K a 6 K a b a,b Anmerkungen zur Ausführung ” von Hand“: Man schreibt nicht K i , sondern 〈i〉 oder dergleichen. Oft kann man schon einmal aufgestellte Tabellen weiterbenutzen oder korrigieren. Hierbei hilft es, neben k(δ(q, a)) auch δ(q, a) zu notieren. Meist ” sieht man“, wenn eine untersuchte markierte Klasse nicht gespalten werden kann, und die Markierung wird entfernt. Also: 〈1〉 := {0, 1, 3, 5, 6, 8} 〈2〉 := {2, 4, 7, 9} Markiert: 〈1〉, 〈2〉. δ-Tabelle für 〈1〉, in spitzen Klammern die k-Werte: q 0 1 3 5 6 8 a 1 〈1〉 3 〈1〉 6 〈1〉 8 〈1〉 1 〈1〉 1 〈1〉 b 2 〈2〉 4 〈2〉 7 〈2〉 9 〈2〉 2 〈2〉 2 〈2〉 Die Spalten sind bezüglich der 〈·〉-Werte gleich, also wird 〈1〉 ” unmarkiert“. 57


δ-Tabelle für 〈2〉, mit k-Werten: q 2 4 7 9 a 4 〈2〉 7 〈2〉 7 〈2〉 9 〈2〉 b 5 〈1〉 8 〈1〉 7 〈2〉 9 〈2〉 Aufspaltung gemäß verschiedener Spalten: 〈2〉 := {2, 4}, 〈3〉 := {7, 9}. Markiert: 〈1〉, 〈2〉, 〈3〉. Neue Tabelle für 〈1〉, erhalten durch Ausbessern der alten Tabelle an den Stellen, wo die Werte 7, 9 auftauchen: q 0 1 3 5 6 8 a 1 〈1〉 3 〈1〉 6 〈1〉 8 〈1〉 1 〈1〉 1 〈1〉 b 2 〈2〉 4 〈2〉 7 〈3〉 9 〈3〉 2 〈2〉 2 〈2〉 Aufspalten: 〈1〉 := {0, 1, 6, 8}, 〈4〉 := {3, 5}. Markiert: 〈1〉, 〈2〉, 〈3〉, 〈4〉. Neue Tabelle für 〈1〉 (durch Weglassen der Spalten für 3 und 5 und Korrektur): q 0 1 6 8 a 1 〈1〉 3 〈4〉 1 〈1〉 1 〈1〉 b 2 〈2〉 4 〈2〉 2 〈2〉 2 〈2〉 Aufspalten: 〈1〉 := {0, 6, 8}, 〈5〉 := {1}. Markiert: 〈1〉, 〈2〉, 〈3〉, 〈4〉. Neue Tabelle für 〈1〉 durch Weglassen der Spalte für 1 liefert, daß 〈1〉 unmarkiert wird und auch nie mehr aufgespalten werden kann, weil die δ-Werte in allen Spalten gleich sind. Neue Tabelle für 〈2〉, durch Weglassen der Spalten für 7 und 9 und Korrektur: q 2 4 a 4 〈2〉 7 〈3〉 b 5 〈4〉 8 〈1〉 Aufspalten liefert: 〈2〉 := {2}, 〈6〉 := {4}. Markiert: 〈1〉 (kann ignoriert werden), 〈3〉, 〈4〉. Tabelle für 〈3〉: q 7 9 a 7 〈3〉 9 〈3〉 b 7 〈3〉 9 〈3〉 Also wird 〈3〉 unmarkiert. 58


Tabelle für 〈4〉: q 3 5 a 6 〈1〉 8 〈1〉 b 7 〈3〉 9 〈3〉 Also wird 〈4〉 unmarkiert. Keine Klasse ist mehr markiert, wir sind fertig. Nun wenden wir uns dem Korrektheitsbeweis für den ” Spaltungsalgorithmus“ zu. 1.7.10 Proposition (a) Der Spaltungsalgorithmus terminiert. (b) Die ausgegebenen Klassen sind genau die Äquivalenzklassen in Q bezüglich ∼. Beweis: Wir halten zunächst fest, daß die Klassen K 1 , . . . , K t stets eine Partition von Q bilden. Weiter werden Klassen nur gespalten, nie zusammengefügt. (a) Jede Spaltung einer Klasse erhöht die Anzahl der Klassen um mindestens 1. Andererseits kann es nicht mehr als |Q| Klassen geben. Also gibt es höchstens |Q| − 2 Schleifendurchläufe, in denen eine Klasse aufgespalten wird. Wie können wir die Anzahl der Tests markierter Klassen abschätzen? (Ein und dieselbe Klasse kann mehrmals markiert und ” unmarkiert“ werden.) In einem Schleifendurchlauf mit Spaltung werden höchstens |Q|/2 Klassen neu markiert, weil einelementige Klassen nie markiert werden. Jeder Schleifendurchlauf ohne Spaltung verringert die Zahl der markierten Klassen um 1. Anfangs gibt es zwei markierte Klassen. Insgesamt folgt: es gibt höchstens 2 + (|Q| − 2) · |Q|/2 ≤ |Q| 2 /2 Schleifendurchläufe ohne Spaltung, in denen eine Markierung entfernt wird. Daher terminiert der Algorithmus. (Es sei bemerkt, daß die Zahl der Schleifendurchläufe normalerweise viel kleiner ist. Es gibt sogar eine clevere Implementierung des Spaltungsalgorithmus mit Zeitaufwand O(|Q| · |Σ| · log |Q|). Diese ist z.B. im Buch von N. Blum beschrieben.) (b) Korrektheit: Der Algorithmus gibt am Ende Klassen K 1 , . . . , K t aus, die (offenbar) eine Partition von Q bilden. Wir müssen zeigen: p ∼ q ⇔ p, q in derselben Klasse K j bzw. p ≁ q ⇔ p, q in verschiedenen Klassen. Genauer: ∃w ∈ Σ ∗ : (δ(p, w) ∈ F ⇔ δ(q, w) ∉ F ) ⇔ ∃r ≥ 0 : V r (p, q), 59


wobei V r (p, q) für die folgende Aussage steht: p und q gelangen durch die Spaltung in Schleifendurchlauf r in verschiedene Klassen“. ” Wir zeigen die beiden Richtungen separat. ” ⇒“: Zu zeigen: Wenn w ∈ Σ∗ mit δ(p, w) ∈ F ⇔ δ(q, w) ∉ F , dann gilt ∃r ≥ 0 : V r (p, q). Dies beweisen wir durch vollständige Induktion über n = |w|. n = 0: Das heißt, w = ε, also p ∈ F ⇔ q ∉ F . Natürlich gilt in diesem Fall p ∈ K 1 ⇔ q ∈ K 2 in Runde r = 0 des Algorithmus, also V 0 (p, q). n ≥ 1: Dann schreiben wir w = au, für ein a ∈ Σ, w ∈ Σ ∗ , und definieren p ′ := δ(p, a), q ′ := δ(q, a). Weil δ(p ′ , u) = δ(p, w) und δ(q ′ , u) = δ(q, w), gilt δ(p ′ , u) ∈ F ⇔ δ(q ′ , u) ∉ F nach Voraussetzung. Nach I.V. für u (mit |u| < |w|) folgt V r (p ′ , q ′ ) für ein r ≥ 0. Falls mit Schleifendurchlauf r die Zustände p und q schon in verschiedenen Klassen sind, sind wir fertig. Sonst liegen p und q in Schleifendurchlauf r in derselben Klasse K i , und eine Klasse K = K j mit p ′ = δ(p, a) ∈ K und q ′ = δ(q, a) ∈ K wird gespalten. Damit wird K i nun markiert und daher in einem Schleifendurchlauf r ′ > r bearbeitet. Dann zeigt sich, daß k(δ(q, a)) (Bestandteil von w q ) und k(δ(p, a)) verschieden sind; daher wird K i gespalten, und p und q gelangen in verschiedene Klassen, d.h. V r ′(p, q) gilt. ” ⇐“: Zu zeigen: Wenn V r(p, q) für ein r ≥ 0 gilt, dann gilt ∃w ∈ Σ ∗ : (δ(p, w) ∈ F ⇔ δ(q, w) ∉ F ). Dies wird durch Induktion über r bewiesen. r = 0: Wenn V 0 (p, q) gilt, heißt das δ(p, ε) = p ∈ K 1 = F ⇔ δ(q, ε) = q ∈ K 2 = Q − F in der Initialisierungsrunde. Das heißt: für w = ε ist δ(p, w) ∈ F ⇔ δ(q, w) ∉ F . r ≥ 1: Es gelte V r (p, q). Das heißt: In Schleifendurchlauf r findet eine Spaltung statt, in deren Verlauf p und q in verschiedenen Klassen landen. Nach dem Algorithmus gilt in dieser Runde: w p ≠ w q , also k(δ(p, a)) ≠ k(δ(q, a)) für ein a ∈ Σ. Wir setzen p ′ := δ(p, a), q ′ := δ(q, a). Dann sind p ′ und q ′ in einem Durchlauf r ′ < r in verschiedene Klassen gelangt, d.h. V r ′(p ′ , q ′ ) gilt; also gilt nach I.V.: δ(p ′ , u) ∈ F ⇔ δ(q ′ , u) ∉ F für ein u ∈ Σ ∗ . Nun ist δ(p ′ , u) = δ(δ(p, a), u) = δ(p, au) und analog δ(q ′ , u) = δ(q, au). Damit haben wir für w = au, daß δ(p, w) ∈ F ⇔ δ(q, w) ∉ F, wie gewünscht. Zu guter Letzt wollen wir von einem etwas abstrakteren Standpunkt aus noch einen Blick auf den Minimalautomaten werfen und einen Charakterisierungssatz für reguläre Sprachen beweisen. Ein kleiner Anlauf ist dazu notwendig. 1.7.11 Definition Es sei ∼ irgendeine Äquivalenzrelation über Σ ∗ . (Die Äquivalenzklassen von w bzgl. ∼ bezeichnen wir mit [w] oder [w] ∼ .) (a) ∼ heißt rechtsinvariant, falls w ∼ w ′ ⇒ wz ∼ w ′ z für alle w, w ′ , z ∈ Σ ∗ . (b) Der Index ind(∼) ∈ (IN − {0}) ∪ {∞} von ∼ ist die Zahl der Äquivalenzklassen von ∼. 60 □


Beispiele: (Die ” trivialen“ Äquivalenzrelationen.) (a) Gilt w ∼ w ′ für alle w, w ′ ∈ Σ ∗ , so ist ind(∼) = 1. (b) Gilt w ∼ w ′ genau dann wenn w = w ′ , so ist ind(∼) = ∞. Beide Äquivalenzrelationen sind rechtsinvariant. Die beiden folgenden Arten von rechtsinvarianten Äquivalenzrelationen stehen im Zentrum unserer Überlegungen. 1.7.12 Definition (Nerode-Relation) Ist L ⊆ Σ ∗ eine Sprache, so definieren wir ∼ L durch: Beispiele: w ∼ L w ′ falls ∀z ∈ Σ ∗ : wz ∈ L ⇔ w ′ z ∈ L. (a) Die von L = L(0 ∗ 1 ∗ ) erzeugte Relation ∼ L hat 3 Äquivalenzklassen: [ε] = L(0 ∗ ), [1] = L(0 ∗ 1 + ), [10] = L((0 + 1) ∗ 10(0 + 1) ∗ ). Die ersten beiden Klassen liegen in L, die dritte bildet das Komplement von L. (b) Die von L ′ = {0 n 1 n | n ≥ 0} erzeugte Relation ∼ L ′ vielen) Äquivalenzklassen: hat die folgenden (unendlich [ε], [0], [0 2 ], [0 3 ], . . . , [01], [0 2 1], [0 3 1], . . . , [1]. Dabei ist L ′ = [ε] ∪ [01]. (Beweis als Übungsaufgabe.) 1.7.13 Lemma ∼ L ist rechtsinvariante Äquivalenzrelation. Beweis: Reflexivität, Symmetrie und Transitivität prüft man leicht nach. Wir zeigen noch die Rechtsinvarianz: Seien w, w ′ , z ∈ Σ ∗ , w ∼ L w ′ . Für beliebiges u ∈ Σ ∗ gilt: (nach Definition der Relation ∼ L ), also w(zu) ∈ L ⇔ w ′ (zu) ∈ L (wz)u ∈ L ⇔ (w ′ z)u ∈ L (Assoziativität der Konkatenation). Also wz ∼ L w ′ z. □ (Etwas abstrakter kann man sich folgendes überlegen: ∼ L ist die ” gröbste“ Äquivalenzrelation auf Σ ∗ , die mit L verträglich ist [d. h. w ∼ w ′ ⇒ (w ∈ L ⇔ w ′ ∈ L)] und die rechtsinvariant ist: jede rechtsinvariante Äquivalenzrelation, die mit L verträglich ist, ist Verfeinerung von ∼ L .) Auch endliche Automaten induzieren rechtsinvariante Äquivalenzrelationen: 61


1.7.14 Definition Ist M = (Q, Σ, q 0 , F, δ) DFA (ohne überflüssige Zustände), so definiere ∼ M auf Σ ∗ durch w ∼ M w ′ falls δ(q 0 , w) = δ(q 0 , w ′ ). 1.7.15 Lemma Sei M DFA, sei L = L M . Dann gilt: (a) ∼ M ist rechtsinvariante Äquivalenzrelation mit endlichen Index ind(∼ M ) = |Q|. (b) ∼ M ist Verfeinerung von ∼ L , d. h. Insbesondere gilt ind(∼ L ) ≤ ind(∼ M ) = |Q|. w ∼ M w ′ ⇒ w ∼ L w ′ , für w, w ′ ∈ Σ ∗ . Beweis (a) Daß ∼ M Äquivalenzrelation ist, rechnet man leicht nach. Wir überprüfen die Rechtsinvarianz: Seien w, w ′ , z ∈ Σ ∗ , w ∼ M w ′ . Dann gilt δ(q 0 , wz) = δ(δ(q 0 , w), z) = δ(δ(q 0 , w ′ ), z) = δ(q 0 , w ′ z), also wz ∼ M w ′ z. Weiter ist es nicht schwer zu sehen, dass die Abbildung Q ∋ q ↦→ {w ∈ Σ ∗ | δ(q 0 , w) = q} die Menge Q bijektiv auf die Menge der Äquivalenzklassen von ∼ M abbildet, also gilt |Q| = ind(∼ M ). (Wir verwenden hier, dass M keine überflüssigen Zustände hat.) (b) Seien w, w ′ ∈ Σ ∗ , w ∼ M w ′ . Sei z ∈ Σ ∗ beliebig. Dann gilt δ(q 0 , w) = δ(q 0 , w ′ ) nach Definition von ∼ M , also δ(q 0 , wz) = δ(q 0 , w ′ z), also δ(q 0 , wz) ∈ F ⇔ δ(q 0 , w ′ z) ∈ F. Das heißt: wz ∈ L M ⇔ w ′ z ∈ L M . Damit ist gezeigt: w ∼ LM w ′ . □ Wir greifen hier nochmals Beispiel 1.7.3 vom Anfang des Abschnitts auf. Den Zuständen des Automaten sind die folgenden Äquivalenzklassen zugeordnet: 0 ↦→ L 0 = {w 1 · · · w r | r ≥ 0, w i ∈ L((0 + 1)0 ∗ 1(0 + 1) ∗ 1)}, 1 ↦→ L 0 L(0 + (10 + ) ∗ ), 2 ↦→ L 0 L(10 ∗ (10 + ) ∗ ), 3 ↦→ L 0 L((0 + 1) + ), 4 ↦→ L 0 L(10 ∗ 1(0 + 1) ∗ ). Offenbar ist L M die Vereinigung der Klassen zu Zustand 1 und Zustand 2 (das sind gerade die akzeptierenden Zustände von M). 1.7.16 Satz (Myhill-Nerode) Ist L ⊆ Σ ∗ , so ist L regulär genau dann wenn ind(∼ L ) < ∞. 62


Beweis ” ⇒“: L = L M für DFA M 1.7.15 ⇒ ind(∼ L ) ≤ ind(∼ M ) < ∞. ” ⇐“: Sei ind(∼ L) < ∞. Wir definieren einen DFA ˆM = ˆM(∼ L ) = ( ˆQ, Σ, ˆq 0 , ˆF , ˆδ) (den Nerode-Automaten“) , wie folgt: ” ˆQ := {[w] | w ∈ Σ ∗ } (Äquivalenzklassen bzgl. ∼ L ). ˆq 0 := [ε] ˆF := {[w] | w ∈ L} ˆδ([w], a) := [wa], für [w] ∈ ˆQ, a ∈ Σ. Offenbar ist | ˆQ| = ind(∼ L ) < ∞, nach Voraussetzung. Wir müssen zunächst zeigen, dass ˆF und ˆδ wohldefiniert sind, dass also die Definitionen nicht von den Repräsentanten der Äquivalenzklassen abhängen. Dies gilt für ˆF , da aus w ∈ L und w ∼ w ′ folgt, dass wε ∈ L ⇔ w ′ ε ∈ L (da ∼ L rechtsinvariant ist), also ist w ′ ∈ L. Aber auch ˆδ ist wohldefiniert: Ist w, w ′ , ∈ Σ ∗ , w ∼ w ′ , und a ∈ Σ, so ist wa ∼ L w ′ a (wegen der Rechtsvarianz von ∼ L ), also [wa] = [w ′ a]. Schließlich müssen wir noch zeigen, dass L ˆM = L. Dazu benützen wir folgende Hilfsbehauptung (HB): ˆδ(ˆq 0 , w) = [w], für w ∈ Σ ∗ . (Beweis durch Induktion über |w| : w = ε : ˆδ(ˆq 0 , ε) = ˆq 0 = [ε]. Ist w = ua, u ∈ Σ ∗ , a ∈ Σ, so ist ˆδ(ˆq 0 , ua), = ˆδ(ˆδ(ˆq 0 , u), a) I.V. = ˆδ([u], a) = [ua].) Damit gilt für w ∈ Σ ∗ : w ∈ L ˆM ⇔ ˆδ(ˆq 0 , w) ∈ ˆF HB ⇔ [w] ∈ ˆF Def. ˆF ⇔ w ∈ L. Mit obiger Konstruktion haben wir direkt den Minimalautomaten für die reguläre Sprache L gefunden: 1.7.17 Korollar Ist L = L M für einen DFA M = (Q, Σ, q 0 , F, δ) und ist ˆM(∼ L ) = ( ˆQ, Σ, ˆq 0 , ˆF , ˆδ) 1.7.16 wie in 1.7.16, so ist | ˆQ| = ind(∼ L ) 1.7.15 ≤ |Q|. □ □ In unserem Beispiel L(0 ∗ 1 ∗ ) erhalten wir den folgenden Minimalautomaten: Start [ ε ] 1 [1] 0 [10] 0 1 0,1 63


Kapitel 2 Grammatiken und die Chomsky-Hierarchie In den 50er Jahren gab Noam Chomsky, ein Linguist, vier Grammatiktypen als mögliche Modelle für Grammatiken natürlicher Sprachen an. Die Informatiker, die sich einerseits mit Formalismen zur Spezifikation künstlicher Sprachen (Programmiersprachen!) und Algorithmen zur Syntaxanalyse in solchen Sprachen beschäftigen, und andererseits die formalen Sprachen als interessanten Gegenstand mathematischer Untersuchungen ansahen, bemächtigen sich bald Chomskys Definitionen, formten um, bewiesen Äquivalenzen zu Sprachklassen, die zu Maschinentypen gehören, usw. 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 Informatik-Anwendungen von Bedeutung sind. 1 2.1 Grammatiken Bisher haben wir Sprachen L spezifiziert durch • Algorithmen, die w ∈ L von w ∉ L unterschieden (Automaten) • reguläre Ausdrücke. 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 Erzeugungsprozeß oder Ableitungsprozeß); die in diesem Kalkül erzeugbaren Wörter bilden dann die Sprache. Grob gesprochen sehen solche Regelsysteme so aus: Sie bestehen aus einem Alphabet ∆, einem ” Startsymbol“ S ∈ ∆, und einer zweistelligen Relation ⇒ über ∆ ∗ . (α ⇒ α ′ 1 Im Buch von U. Schöning (Kap. 1) ist ein ” natürlichsprachiges“ Beispiel angegeben. 64


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 ⇒.) 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, daß wir ⇒ durch einen endlichen Satz ” lokaler Ersetzungsregeln“ spezifizieren und dadurch, daß wir zwei Typen von Buchstaben verwenden: ” Variable“ (das sind die Hilfszeichen) und ” Terminale“ (das sind die Zeichen des ” Zielalphabets“). Technisch schreibt man ∆ = V ∪ Σ, wo V , Σ disjunkte Alphabete sind, S ∈ V ; die interessierende Sprache L ist Sprache über Σ. 2.1.1 Definition Eine Grammatik G ist ein 4-Tupel (V, Σ, S, P ), wobei Σ, V disjunkte Alphabete sind, S ∈ V ist und P eine endliche Teilmenge von (V ∪ Σ) + × (V ∪ Σ) ∗ ist. Die Komponenten der Grammatik werden folgendermaßen bezeichnet: V : Menge der ” Variablen“. (Variable werden mit A, B, C usw. bezeichnet.) Σ : Menge der ” Terminalzeichen“. (Terminalzeichen werden mit a, b, c, . . . , 0, 1, 2, . . . bezeichnet.) S ∈ V : ” Startsymbol“, ” Startvariable“. P : Menge von Produktionen“ oder Ableitungsregeln“ (l, r), ” ” l ∈ (V ∪ Σ) + , r ∈ (V ∪ Σ) ∗ gelesen: ” man darf l durch r ersetzen“. geschrieben: l → r Eine Grammatik G spezifiziert einen Kalkül, in dem Wörter (über V ∪ Σ) erzeugt werden können. Wir beschreiben jetzt, wie dieser Kalkül funktioniert. 2.1.2 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.) 65


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 ⇒ die ” Halbgruppenhülle“ von →, weil man mittels der [assoziativen] Konkatenationsoperation erweitert.) (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 daß α i−1 ⇒ α i für 1 ≤ i ≤ t. ( Spezialfall t = 0: α ∗ ⇒ α gilt immer). Sprechweise: α ′ ist aus α (in t Schritten) ableitbar. Wenn man die Schrittanzahl betonen will, kann man auch α t ⇒ α ′ 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 erzeugt. 2.1.3 Beispiel Typische Satzformen unserer Grammatik sind /ca · · · aXa · · · a$. Dabei ist X eine der drei Variablen A, B, C. Die Produktionen sind so angelegt, daß in Ableitungen folgendes vor sich geht. • A wandert von links nach rechts und verdoppelt jedes übersprungene a. • Wenn A beim $ anstößt, wird es in B oder C umgewandelt. • B läuft von rechts nach links und wird beim Auftreffen auf /c wieder in A umgewandelt. • C ” schluckt“ das $-Zeichen, läuft nach links, um beim Auftreffen auf das /c-Zeichen auch dieses zu schlucken. 66


Also: V = {S, /c, $, A, B, C}, Σ = {a}, und die Produktionsmenge P enthält folgende Paare: (1) S → /cAa$ (2) Aaa → aaAa (3) Aa$ → aaB$ (4) aB → Ba (5) /cB → /cA (6) Aa$ → aaC (7) aC → Ca (8) /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: A/caAaBa (4) ⇒ $$AaaB (2) ⇒ $$AaaB (4) ⇒ a/caABaa $$aaAaB $$AaBa Man erkennt: Auch ” unsinnige“ Ableitungsschritte sind definiert, und die Ableitungsrelation ist nichtdeterministisch. Die für uns interessanten Ableitungen sind nur die, die mit S beginnen: S (1) ⇒ /cAa$ (6) ⇒ /caaC (7) ⇒ /caCa (7) ⇒ /cCaa (8) ⇒ aa. S (1) ⇒ /cAa$ (3) ⇒ /caaB$ (4) ⇒ /caBa$ (4) ⇒ /cBaa$ (5) ⇒ ⇒ /cAaa$ (2) ⇒ /caaAa$ (6) ⇒ /caaaaC (7) ⇒ /caaaCa (7) ⇒ · · · (7) ⇒ /cCaaaa (8) ⇒ aaaa. Man sieht intuitiv, daß alle Folgen a j , die (aus S) ableitbar sind, die Form a 2s , s ≥ 1, haben, und daß jede dieser Folgen ableitbar ist. Also: L(G) = {w ∈ {a} ∗ | S ∗ ⇒ w} = {a 2s | s ≥ 1}. (Der Beweis dieser Aussage ist nur mühsam, nicht tief.) Grammatiken in der in 2.1.2 angegebenen allgemeinen Form heißen auch Chomsky-0-Grammatiken, Typ-0-Grammatiken oder Semi-Thue-Systeme. 2 2.1.4 Definition Mit L 0 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, sog. Thue-Systeme, untersuchte. Seine Regeln waren symmetrisch (l → r impliziert r → l), das ” Semi“ drückt aus, daß unsere Produktionen gerichtet sind. 67


Auf die Klasse L 0 kommen wir später und in der Vorlesung ” Algorithmentheorie“ zurück. Es wird sich herausstellen, daß sie genau die überhaupt durch einen Kalkül beschreibbaren Sprachen enthält (die ” rekursiv aufzählbaren“ Sprachen). Wir wenden uns nun einem 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“). 2.1.5 Definition (a) Sei G = (V, Σ, S, P ) Grammatik. Eine Produktion l → r heißt kontextsensitiv, wenn l = αAγ, r = αβγ, wobei A ∈ V ist, α, β, γ ∈ (V ∪ Σ) ∗ sind und |β| ≥ 1. ( ” Man darf A durch das nichtleere Wort β ersetzen, aber nur, wenn A im Kontext α..γ steht.“) Um Mißverstä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- 1-Grammatiken. (c) L 1 ist die Klasse aller Sprachen L, für die gilt: L = L(G) für eine kontextsensitive Grammatik G. Auch L 1 wird später nochmals diskutiert. Klar ist: L 1 ⊆ L 0 . Auch wenn es auf den ersten Blick nicht so aussieht, kann man die Grammatik aus Beispiel 2.1.3 zu einer kontextsensitiven Grammatik umbauen. Also: {a 2i | i ≥ 1} ∈ L 1 . (Ohne Beweis.) Die nächste Definition ist fundamental für den Rest der Vorlesung. 2.1.6 Definition (a) Sei G 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 muß) 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 Chomsky-2-Grammatiken oder Typ-2-Grammatiken. 68


(c) L 2 ist die Klasse aller Sprachen L, für die gilt: L = L(G) für eine kontextfreie Grammatik G. 2.1.7 Beispiel Wir betrachten die folgende Grammatik: G = (V, Σ, S, P ) mit V = {S}, Σ = {0, 1}; P enthält die folgenden Produktionen: (1) S → ε (2) S → SS (3) S → 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, daß L(G) gerade die Menge aller korrekten Klammerausdrücke ist. 2.1.8 Beispiel Betrachte G = (V, Σ, S, P ) mit V = {S}, Σ = {0, 1}; P enthält die folgenden Produktionen: (1) S → ε (2) S → 0S1. Eine typische Ableitung: S ⇒ 0S1 ⇒ 00S11 ⇒ 000S111 ⇒ 000111. Man sieht recht leicht: L(G) = {0 n 1 n | n ≥ 0}. 2.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. 2.2.1 Definition (a) Sei G Grammatik. Eine Produktion l → r heißt rechtslinear, falls l ∈ V und r = aB für a ∈ Σ, B ∈ V oder r = ε ist. (In r steht die Variable rechts.) Beachte: Rechtslineare Produktionen sind kontextfrei. (b) Eine Grammatik G heißt rechtslinear, wenn alle ihre Produktionen rechtslinear sind (kurz: P ⊆ V × (ΣV ∪ {ε})). Rechtslineare Grammatiken heißen auch Chomsky-3-Grammatiken oder Typ-3-Grammatiken. (c) L 3 ist die Klasse aller Sprachen L, für die gilt: L = L(G) für eine rechtslineare Grammatik G. 69


2.2.2 Beispiel Es sei M folgender NFA: 1 1 B 2 Start S D 2 2 C 2 Man macht sich leicht klar, daß L M = L(ε + 1 + 2 ∗ + 22 + ) gilt. Betrachte weiter die rechtslineare Grammatik G = ({S, B, C, D, E}, {1, 2}, S, P ), wo P folgende Produktionen hat: S → 1B, S → 2C, S → ε, B → 1B, B → 2D, B → ε, C → 2D, D → 2D, D → ε. Wir betrachten zwei Berechnungswege in M: Start S 1 1 1 2 2 2 B B B D D D Start S 2 C 2 2 D D und zwei Ableitungen in G: S ⇒ 1B ⇒ 11B ⇒ 111B ⇒ 1112D ⇒ 11122D ⇒ 111222D ⇒ 111222. S ⇒ 2C ⇒ 22D ⇒ 222D ⇒ 222. Die Ähnlichkeit zwischen Berechnungen und Ableitungen ist offensichtlich, und nicht zufällig. Der nächste Satz (und sein Beweis) zeigen, daß NFA’s und rechtslineare Grammatiken im wesentlichen nur verschiedene Notationen für dasselbe Objekt darstellen. 2.2.3 Satz Sei L ⊆ Σ ∗ Sprache. Dann gilt L ∈ L 3 ⇔ L ist regulär. 70


Beweis ” ⇒“: Sei L = L M für einen NFA M = (Q, Σ, q 0 , F, δ). Wir setzen G = (V, Σ, S, P ) mit V := Q, (dasselbe Σ), S := q 0 und folgenden Regeln in P : q → aq ′ für q, q ′ ∈ Q = V, a ∈ Σ, q ′ ∈ δ(q, a). q → ε für q ∈ F . Zu zeigen: M akzeptiert w ⇔ w ∈ L(G), für w ∈ Σ ∗ . Das sieht man so ein: ⇔ ⇔ ⇔ M akzeptiert w = a 1 · · · a n ∃ Zustände p 0 , p 1 , . . . , p n mit p 0 = q 0 , p n ∈ F und p i ∈ δ(p i−1 , a i ), 1 ≤ i ≤ n ∃ Variable p 0 , p 1 , . . . , p n mit p 0 = S und p 0 ⇒ a 1 p 1 ⇒ a 1 a 2 p 2 ⇒ · · · ⇒ a 1 · · · a n p n ⇒ a 1 · · · a n ist Ableitung in G a 1 · · · a n ∈ L(G). ⇐“: Gegeben sei eine rechtslineare Grammatik G = (V, Σ, S, P ) mit L = L(G). Wir ” definieren einen NFA M = (Q, Σ, q 0 , F, δ) durch: Q := V , (Σ gleich,) q 0 := S, F := {A ∈ V | A → ε ist Produktion}, und δ(A, a) := {B | A → aB ist Produktion}. Zu zeigen: M akzeptiert w ⇔ w ∈ L(G). Dazu muß man nur beobachten, daß 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: L 3 ⊆ L 2 (denn jede rechtlineare Grammatik ist kontextfrei) und L 3 ≠ L 2 , denn die Sprache {0 n 1 n | n ≥ 0} ist nicht regulär, wohl aber kontextfrei ( Beispiel 2.1.8 ). Später werden wir sehen, daß auch L 2 £ L 1 £ L 0 gilt, die definierten Sprachklassen also eine echte Hierarchie bilden (die ” Chomsky-Hierarchie“). Linkslineare Grammatiken 2.2.4 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. 2.2.5 Beispiel G = (V, Σ, S, P ) mit V = {S, A, B}, Σ = {0, 1} und P = {S → A0, A → A0, A → B1, B → ε}. (Man sieht leicht: L(G) = L(10 + ).) 71


Es sei G = (V, Σ, S, P ) eine linkslineare Grammatik und L = L(G) die von G erzeugte Sprache. 2.2.6 Behauptung (a) Es gibt eine rechtslineare Grammatik G ′ = (V, Σ, S, P ′ ) mit L R = L(G ′ ). (b) Es gibt einen NFA M für L R ; es gibt einen NFA M ′ für L = (L R ) 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: C P = {C → B0 | B1, B → A0, A → ε | A0 | A1}. (G erzeugt die Wörter aus {0, 1} ∗ , deren vorletztes Zeichen eine Null ist. Dies impliziert, daß diese Wörter mindestens die Länge 2 haben müssen.) (a) Konstruktion von G R mit L(G R ) = L R : G G R A → Ba A → aB A → ε A → ε S = S Am Beispiel: G R hat folgende Produktionen: C → 0B | 1B, B → 0A, A → ε | 0A | 1A. Es ist leicht zu sehen, daß L(G R ) = L(G) R ist. (G R 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(G R ) = L M R. Aus M R konstruiere den ” Umkehr-NFA“ M ′ mit L(M ′ ) = (L M R) R , gemäß 1.5.7. Wir wissen, daß M ′ so gewählt werden kann, daß die Zustandszahl höchstens um 1 steigt, also höchstens |V | + 1 Zustände erzeugt werden. Am Beispiel: 72


M R : Start 0,1 0 0,1 C B A 0,1 M’: 0,1 0 C B A Start L M ′ = (L M R) R = L(G R ) R = (L(G) R ) R = L(G). (c) Konstruktion von G ′′ mit L(G ′′ ) = L: Aus M ′ läßt sich nun nach Satz 2.2.3 eine rechtslineare Grammatik G ′′ derart gewinnen, daß L(G ′′ ) = L M ′ = 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 ′′ = {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 stärker sind als L 3 . Zum Beispiel betrachte man die Grammatik G = (V, Σ, S, P ) mit V = {S, B}, Σ = {a, b} und P = {S → aB | ε, B → Sb}. P enthält nur linkslineare und rechtslineare Produktionen, aber L(G) = {a n b n | n ≥ 0} ∉ L 3 . 73


Kapitel 3 Kontextfreie Grammatiken und Sprachen In diesem Kapitel untersuchen wir die im vorigen Kapitel definierte Sprachklasse L 2 genauer. Diese Klasse (und besonders noch engere Teilklassen davon) spielt eine wichtige Rolle bei der Spezifikation von Programmiersprachen und der Konstruktion von Übersetzern für Programme. 3.1 Beispiele, Ableitungsbäume, Linksableitungen Wir erinnern uns: Eine kontextfreie Grammatik G besteht aus V , Σ, S ∈ V und P , wobei jede Produktion in P die Form A → X 1 · · · X r mit A ∈ V und X 1 · · · X r ∈ (V ∪ Σ) ∗ , also 0 ≤ r, hat. (Elemente von V ∪ Σ bezeichnen wir mit X, Y, Z, X i , Y i , Z i , usw.) Jeder Ableitungsschritt in einer Ableitung hat also die Form Y 1 · · · Y s AZ 1 · · · Z t ⇒ Y 1 · · · Y s X 1 · · · X r Z 1 · · · Z t für Y 1 , . . . , Y s , Z 1 , . . . , Z t ∈ V ∪ Σ, s, t ≥ 0, A → X 1 · · · X r in P . Schreibweise: Sind A → α 1 , · · · , A → α r , α 1 , · · · , α r ∈ (V ∪ T ) ∗ , Produktionen mit linker Seite A in P , so schreiben wir kürzer A → α 1 | · · · | α r . 3.1.1 Beispiel ( ” Palindrome“) Sei G = (V, Σ, S, P ), wo V = {S}, Σ = {0, 1}, und P = {(S, 0S0), (S, 1S1), (S, 0), (S, 1), (S, ε)}, kürzer: S → 0S0 | 1S1 | 0 | 1 | ε. Einige Beispielableitungen: S ⇒ ε; S ⇒ 0S0 ⇒ 01S10; S ⇒ 1S1 ⇒ 11S11 ⇒ 110S011 ⇒ 110011. 74


Wir zeigen: L(G) = {w ∈ Σ ∗ | w = w R } (das ist die Sprache der Palindrome). Der Beweis ist als Beispiel dafür zu verstehen, wie man das intuitiv Naheliegende formal exakt fassen kann. Solche Beweise werden wir nur selten führen. ⊆“: (Typisch: Durch Induktion über die Länge der Ableitung zeigt man eine Eigenschaft ” aller Satzformen, die dann benutzt wird, um eine Eigenschaft aller ableitbaren Wörter w ∈ Σ ∗ zu zeigen.) Durch Induktion über r ≥ 0 zeigen wir folgende Aussage: Ist S = α 0 ⇒ α 1 ⇒ · · · ⇒ α r = α eine Ableitung für eine Satzform α ∈ (V ∪ Σ) ∗ , so hat α die Form (i) wSw R für ein w ∈ Σ ∗ oder (ii) w ∈ Σ ∗ mit w = w R . (Daraus folgt, daß jedes in G ableitbare Wort w die Eigenschaft w = w R hat.) Ind.-Anfang: r = 0: S = α 0 = εSε, ε R = ε. Ind.-Schritt: r > 0: Sei S = α 0 ⇒ · · · ⇒ α r−1 ⇒ α r Ableitung. Nach I. V. hat α r−1 die Gestalt (i) oder (ii). Aber (ii) ist unmöglich, da dann α r−1 ∈ Σ ∗ wäre, keine Variable enthielte und daher aus α r−1 nichts ableitbar wäre. Also ist α r−1 = wSw R für ein w ∈ Σ ∗ . Wir unterscheiden Fälle danach, welche Produktion für den Schritt α r−1 ⇒ α r angewendet wird. S → ε : α r = ww R , und (ww R ) R = ww R . S → 0 : α r = w0w R , und (w0w R ) R = w0w R . S → 1 : genauso. S → 0S0 : α r = w0S0w R = w0S(w0) R . S → 1S1 : genauso. Also hat auch α r Gestalt (i) oder (ii). ⊇“: (Typisch: Durch Induktion über die Wortlänge zeigt man, daß gewisse Wörter über ” Σ ableitbar sind oder gewisse Wörter über V ∪ Σ Satzformen darstellen.) Durch Induktion über |w| zeigen wir: Ist w = w R , so ist w ∈ L(G), für alle w ∈ Σ ∗ . Ind.-Anfang: w = ε, 0, oder 1. Dann gilt w ∈ L(G), weil S ⇒ ε, S ⇒ 0, S ⇒ 1 Ableitungen sind. Ind.-Schritt: |w| ≥ 2. Dann ist w = 0w ′ 0 oder w = 1w ′ 1 für ein w ′ ∈ Σ ∗ , w ′ = (w ′ ) R . Nach I. V. existiert also eine Ableitung S ⇒ α 1 ⇒ · · · ⇒ α r ⇒ w ′ für w ′ , mit r ≥ 0. Damit ist S ⇒ 0S0 ⇒ 0α 1 0 ⇒ · · · ⇒ 0α r 0 = 0w ′ 0 Ableitung für 0w ′ 0, also 0w ′ 0 ∈ L(G); analog sieht man, daß 1w ′ 1 ∈ L(G). Also ist w ∈ L(G). Damit ist gezeigt, daß L(G) die Menge der Palindrome ist. 75


Wir bemerken hier, daß nach einer Übungsaufgabe die Sprache {w ∈ Σ ∗ | w = w R } nicht regulär ist. Also sehen wir hier nochmals, daß L 3 £ L 2 ist. — Das folgende Beispiel greift eine grundlegende Strukturkomponente von modernen, blockstrukturierten Programmiersprachen auf: balancierte Klammerausdrücke. Diese tauchen etwa bei arithmetischen Ausdrücken mit Klammern [z. B. (((X + Y ) ∗ Z) − (U + V ))] auf, in der Sprache LISP und auch bei begin-end-Schachtelungen in Pascal, Modula, oder C usw. Wir wollen einsehen, daß Strukturen dieser Art sehr gut durch kontextfreie Grammatiken beschreibbar sind. Wir betrachten ein Modellbeispiel: pure korrekt geklammerte ( ” balancierte“) Klammerausdrücke wie (()(()))((()())()). Wir repräsentieren öffnende Klammern durch 0 und schließende Klammern durch 1; damit wird etwa dieser Klammerausdruck als 001001110001011011 geschrieben. Wir haben schon früher (s. Anhang über ” Induktive Definitionen“) eine induktive Definition für diese Sprache studiert. 3.1.2 Beispiel Wir betrachten die Grammatik G = (V, Σ, S, P ), mit V = {S}, Σ = {0, 1}, und der Menge P bestehend aus den Produktionen Zu zeigen ist: kKA = L(G). S → ε | 0S1 | SS. ⊆ “: Induktion über die induktive Definition. Ist w = ε, so ist S ⇒ ε eine Ableitung von ” w. Ist w = 0u1v, mit u, v ∈ kKA, so gibt es nach I.V. Ableitungen S ⇒ · · · ⇒ u, S ⇒ · · · ⇒ v. Diese können wir mit den Schritten S → SS → 0S1S kombinieren, um eine Ableitung zu erhalten. ⊇“: Wird nachgetragen. ” S → SS → 0S1S ⇒ · · · ⇒ 0u1S ⇒ · · · ⇒ 0u1v 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“ sind wichtiges Hilfmittel und Zwischenergebnis bei der Analyse von Programmen durch einen Compiler. 3.1.3 Beispiel Aus der Ableitung S ⇒ SS ⇒ SSS ⇒ 01SS ⇒ 01S01 ⇒ 010S101 ⇒ 01001101 zu der Grammatik mit Produktionen S → 0S1 | SS | 01 (der Deutlichkeit halber haben wir die Kopie von S, auf die eine Produktion angewandt wird, unterstrichen) erhalten wir auf naheliegende Weise folgenden Baum. 76


S S S 0 1 S S 0 S 1 0 1 0 1 Die inneren Knoten sind mit Variablen, die Blätter mit Terminalzeichen markiert. (Wir werden die Konstruktion von Ableitungsbäumen aus Ableitungen in 3.1.5 formal beschreiben.) Aus der Ableitung S ⇒ SS ⇒ 01S ⇒ 010S1S ⇒ 010011S ⇒ 01001101 erhalten wir denselben Baum. Dagegen ergibt die Ableitung den folgenden Baum: S ⇒ SS ⇒ SSS ⇒ SS01 ⇒ 01S01 ⇒ 010S101 ⇒ 01001101 S S S S S 0 1 0 1 0 S 1 0 1 Man kann zeigen, daß L(G) = L bal≠ε = Menge der nichtleeren Klammerausdrücke ist. Wir definieren nun formal, was Ableitungsbäume sein sollen. 3.1.4 Definition Sei G = (V, Σ, S, P ) eine kontextfreie Grammatik. (a) Für X ∈ V ∪ Σ ist ein X-Ableitungsbaum T ein gerichteter, geordneter Baum mit Wurzel, dessen Knoten mit je einem Buchstaben aus V ∪ Σ oder mit ε markiert sind, wobei folgendes gilt: (α) Die Wurzel ist mit X markiert, (β) Ist v ein Knoten, der mit a ∈ Σ oder mit ε markiert ist, so ist v ein Blatt. 77


(γ) Ist v ein Knoten, der mit A ∈ V markiert ist, und ist v kein Blatt, so gilt: (i) die Söhne v 1 , . . . , v r von v sind mit X 1 , . . . , X r ∈ Σ ∪ V markiert, und A → X 1 · · · X r ist Produktion in P oder (ii) v hat genau einen Sohn v ′ , der mit ε markiert ist, und A → ε ist Produktion in P . (b) Ist T ein X-Ableitungsbaum, so bezeichnen wir mit α(T ) das Wort über V ∪ Σ, das sich beim Lesen der Blätter von T von links nach rechts ergibt. (c) S-Ableitungsbäume heißen auch einfach Ableitungsbäume. Beispiel: α(T ) ist für jeden der zwei obigen Ableitungsbäume gleich dem Terminalwort 01001101. — X-Ableitungsbäume werden schematisch so gezeichnet: X T α(Τ) Wir halten fest, daß Ableitungsbäume tatsächlich dasselbe leisten wie Ableitungsfolgen. 3.1.5 Lemma Sei G kontextfreie Grammatik. Dann sind für X ∈ V ∪ Σ und α ∈ (V ∪ Σ) ∗ äquivalent: (i) X ∗ ⇒ α und (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) gilt genau dann wenn w ∈ Σ ∗ und es einen (S-)Ableitungsbaum T mit α(T ) = w gibt. Beweis ” (i) ⇒ (ii)“: Sei X = α 0 ⇒ · · · ⇒ α r = α Ableitung in G. Wir präzisieren die in 3.1.3 intuitiv angewandte Methode, zu einer Ableitung einen Baum zu konstruieren, und gehen dabei induktiv vor. Die Wurzel ist ein Knoten, mit X = α 0 markiert. Sei nun 0 < s ≤ r. Als Induktionsvoraussetzung nehmen wir an, wir hätten einen X-Ableitungsbaum T s−1 für α s−1 = X 1 · · · X t , d. h. X 1 , . . . , X t sind die Einträge an den Blättern von T s−1 . Es gibt dann t ′ ∈ {1, . . . , t} und Y 1 · · · Y u derart, daß X t ′ → Y 1 · · · Y u Produktion ist und α s−1 = X 1 · · · X t ′ · · · X t ⇒ X 1 · · · X t ′ −1Y 1 · · · Y u X t ′ +1 · · · X t = α s 78


der nächste Ableitungsschritt ist. Der Knoten zu X t ′ in T s−1 erhält u Söhne, die mit Y 1 , . . . , Y u markiert werden. Offenbar ist der resultierende Baum T s wieder X-Ableitungsbaum, und α(T s ) = α s . (Ist u = 0, erhält der Knoten zu X t ′ einen Sohn mit Markierung ε.) X X T s-1 s T X 1 ... X t’ ... Xt X t’ Y 1 ... ... Y u Nach r Schritten ergibt sich ein Baum T r mit α(T r ) = α r = α. (ii) ⇒ (i)“: Es sei ein X-Ableitungsbaum T gegeben. Durch Induktion nach der Tiefe k ” von T zeigen wir, daß X ⇒ ∗ α(T ) gilt. k = 0: Hat T nur einen Knoten, die Wurzel, so ist α(T ) = X, und X 0 ⇒ X ist Ableitung. k > 0: Ist T ein Baum, der nicht nur aus der Wurzel besteht, so muß die Wurzelmarkierung X eine Variable A ∈ V sein. Falls die Wurzel nur einen, mit ε markierten, Sohn besitzt, ist α(T ) = ε; dann muß aber A → ε Produktion sein, also A ⇒ ε Ableitung. Sonst hat die Wurzel r ≥ 1 Söhne v 1 , . . . , v r , die mit X 1 , . . . , X r ∈ V ∪ Σ markiert sind. Der i-te Unterbaum T i (mit Wurzel v i ) ist X i -Ableitungsbaum, für 1 ≤ i ≤ r, jeweils mit Tiefe kleiner als k. Nach Induktionsvoraussetzung gilt X i ⇒ ∗ α(T i ) , für 1 ≤ i ≤ r . Durch Zusammensetzen dieser r Ableitungen erhalten wir die Ableitung X ⇒ X 1 X 2 · · · X ∗ r ⇒ α(T 1 )X 2 · · · X ∗ r ⇒ α(T 1 )α(T 2 )X 3 · · · X ∗ r ⇒ · · · ∗ ⇒ α(T 1 ) · · · α(T r ) = α(T ) . □ Beispiel: Aus dem Baum S S S S S 0 1 0 S 1 79


zur Grammatik aus 3.1.3 ergibt sich die Ableitung S ⇒ SS ⇒ SSS ⇒ S01S ⇒ S010S1. 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“ von α(T ) bezüglich der Grammatik G Auskunft. 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 3.1.2 die beiden verschiedenen Bäume S S S S S S S S S S gehören. Daher zieht man meist Ableitungsbäume als Notation 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). 3.1.6 Definition Eine Ableitung S = α 0 ⇒ α 1 ⇒ · · · ⇒ α r = w ∈ Σ ∗ (NB: w besteht aus Terminalzeichen) ist eine Linksableitung, wenn für 1 ≤ i ≤ r beim Übergang von α i−1 zu α i auf die am weitesten links stehende Variable in α i−1 eine Produktion angewendet wird. (Analog definiert man Rechtsableitungen.) Beispiel: (Zu Grammatik aus 3.1.3 ) S ⇒ SS ⇒ 0S1S ⇒ 0011S ⇒ 001101 ist Linksableitung, ist Rechtsableitung, aber S ⇒ SS ⇒ S01 ⇒ 0S101 ⇒ 001101 S ⇒ SS ⇒ SSS ⇒ S01S ⇒ 0S101S ⇒ 001101S ⇒ 00110101 ist weder Links- noch Rechtsableitung. 3.1.7 Bemerkung Sei G kontextfreie Grammatik, w ∈ Σ ∗ . Dann gilt: Ableitungsbäume und Linksableitungen für w entsprechen einander eineindeutig. 80


Beispiel: Das Wort 010101 besitzt in der Grammatik aus 3.1.3 die zwei Linksableitungen S ⇒ SS ⇒ 01S ⇒ 01SS ⇒ 0101S ⇒ 010101, S ⇒ SS ⇒ SSS ⇒ 01SS ⇒ 0101S ⇒ 010101, entsprechend den beiden folgenden Ableitungsbäumen: S S S S S S 0 1 S S S S 0 1 0 1 0 1 0 1 0 1 Beweis von 3.1.7: Ein Ableitungsbaum für w sei gegeben. Man überlegt sich nun, wieder durch Induktion, daß die Konstruktion aus 3.1.5 ” (ii) ⇒ (i)“ eine Linksableitung für w ergibt. Sei nun umgekehrt eine Linksableitung für w ∈ Σ ∗ gegeben. Wie in 3.1.5 (i) ⇒ (ii)“ ” erzeugen wir einen Ableitungsbaum für w. Für diese Konstruktion gilt jedoch folgendes: Verschiedenen Linksableitungen entsprechen verschiedene Ableitungsbäume. (Betrachte den ersten Ableitungsschritt, in dem sich die Linksableitungen unterscheiden. Es müssen auf dieselbe Variable verschiedene Produktionen angewendet werden; dies schlägt sich direkt in einem Unterschied in den Syntaxbäumen nieder.) □ (Um diesen Beweis zu illustrieren, wende die Konstruktionen aus 3.1.5 auf das nach Bemerkung 3.1.7 angegebene Beispiel an.) Im allgemeinen ist es für die Syntaxanalyse (Konstruktion eines Syntaxbaumes zu einem vorgelegten Wort w ∈ L(G)), wie sie z. B. in Übersetzern geleistet wird, von Vorteil, wenn jedes Wort nur einen Syntaxbaum, also auch nur eine Linksableitung besitzt. 3.1.8 Definition (a) Eine kontextfreie Grammatik G heißt mehrdeutig, wenn es ein Wort w ∈ L(G) gibt, das zwei verschiedene Ableitungsbäume besitzt. (b) Eine Sprache L ∈ L 2 heißt inhärent mehrdeutig, wenn jede kontextfreie Grammatik G mit L = L(G) mehrdeutig ist. 3.1.9 Beispiel (a) Obgleich unsere Grammatik für L bal≠ε aus Beispiel 3.1.3 mehrdeutig ist, ist die Sprache selbst nicht inhärent mehrdeutig. Wir bemerken (ohne Beweis), daß folgendes eine eindeutige Grammatik für dieselbe Sprache ist: G ′ = (V ′ , Σ, S, P ′ ), wo V ′ = {S, A} und wo P ′ folgende Produktionen hat: S → AS | A , A → 01 | 0S1 . 81


(Man baue Ableitungsbäume für einige Wörter w ∈ L bal !) Die Grammatik mit den Produktionen S → 0S1S | 01S | 01 | 0S1 erzeugt ebenfalls die Sprache L bal≠ε und ist eindeutig. Eindeutige Grammatiken für L bal (aus 3.1.2) sind einfacher (vgl. Übungen). (b) Ohne Beweis bemerken wir, daß die Sprache L := {a n b n c m | n, m ∈ IN} ∪ {a m b n c n | n, m ∈ IN} eine inhärent mehrdeutige kontextfreie Sprache ist. Die Aussage L ∈ L 2 ist dabei nicht schwer zu zeigen — man gibt eine Grammatik an — ; der Nachweis der inhärenten Mehrdeutigkeit ist aufwendiger. Intuitiv benötigt jede Grammatik G mit L(G) = L für die beiden Teile der Sprache unabhängige ” Abteilungen“; die Wörter a n b n c n für große n müssen Ableitungen in beiden ” Abteilungen“ besitzen. 3.2 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. Wir beginnen mit Vorarbeiten für die Konstruktion der Chomsky-Normalform. Zunächst wollen wir Produktionen, die Terminalzeichen erzeugen, von solchen separieren, die Variable erzeugen (Grammatiken mit dieser Eigenschaft heißen ” separiert“); weiter sollen rechte Seiten von Produktionen höchstens Länge 2 haben. 3.2.1 Lemma Ist G = (V, Σ, S, P ) kontextfreie Grammatik, so existiert eine kontextfreie Grammatik G ′ = (V ′ , Σ, S, P ′ ) mit L(G) = L(G ′ ), derart daß P ′ nur Produktionen der Form ⎧ ⎪⎨ (∗) enthält. Technisch ausgedrückt: ⎪⎩ P ′ ⊆ V ′ × A → BC mit A, B, C ∈ V ′ , A → B mit A, B ∈ V ′ , A → ε mit A ∈ V ′ , A → a mit A ∈ V ′ , a ∈ Σ ( ) (V ′ ) 2 ∪ (V ′ ) 1 ∪ (V ′ ) 0 ∪ Σ . Beweis 1. Schritt (Separierung): Für jedes a ∈ Σ wird eine neue Variable D a eingeführt. In allen Regeln von P wird a durch D a ersetzt, und es werden die neuen Regeln D a → a, für a ∈ Σ, hinzugefügt. Offenbar gilt für die resultierende Grammatik G ′′ := (V ∪ {D a | a ∈ Σ}, Σ, S, P ′′ ), 82


daß L(G) = L(G ′′ ). Man kann nämlich Ableitungsbäume in G in solche in G ′′ umbauen, D a indem man Blätter a durch Teilbäume a ersetzt und umgekehrt. 2. Schritt (Verkürzung rechter Seiten): Wir behandeln nun Produktionen A → C 1 · · · C r , wo r ≥ 3 , A, C 1 , . . . , C r ∈ V ′′ , von G ′′ , und zwar jede für sich. Für eine solche Produktion führen wir r − 2 neue Variable ˆD 2 , . . . , ˆD r−1 ein und ersetzen die Produktion A → C 1 · · · C r in P ′′ durch die Folge A → C 1 ˆD2 ˆD 2 → C 2 ˆD2 . ˆD r−2 → C r−2 ˆDr−1 ˆD r−1 → C r−1 C r . Die resultierende Grammatik heißt G ′ . Um einzusehen, daß L(G ′′ ) = L(G ′ ), beobachtet man, daß man aus Ableitungsbäumen für G ′′ solche für G ′ erhält, wenn man A-(Teil-)Ableitungsbäume A A C ... 1 C r durch C 1 ... C 2 α 1 D^ 2 D^ r-1 α r α 1 α 2 Cr-1 C r α α r-1 r ersetzt, und umgekehrt. 3.2.2 Beispiel Die obigen Operationen formen die Grammatik G = ({S, A, B}, 83


{0, 1}, S, {S → SAB | ε , A → 0A | ε, B → 1B | ε}) um in G ′ = (V ′ , Σ, S, P ′ ) mit V ′ = {S, A, B, D 0 , D 1 , ˆD}, wo P ′ aus den folgenden Produktionen besteht: S → S ˆD | ε , ˆD → AB , A → D 0 A | ε , B → D 1 B | ε , D 0 → 0 , D 1 → 1 . (Überlege: Was ist L(G)?) □ Wir wollen als nächstes (Schritt 3 der Konstruktion) aus einer Grammatik G alle ε-Regeln, das sind Produktionen der Form A → ε, für A ∈ V , eliminieren. Man sieht sofort, daß in Grammatiken ohne ε-Regeln nur nichtleere Wörter w ableitbar sind. Also konstruieren wir eine Grammatik für L(G) − {ε} und notieren gleichzeitig, daß man (effizient) testen kann, ob ε ∈ L(G) oder nicht. 3.2.3 Lemma (a) G = (V, Σ, S, P ) sei kontextfreie Grammatik. Dann gibt es eine kontextfreie Grammatik G ′ = (V, Σ, S, P ′ ) mit L(G ′ ) = L(G) − {ε}, so daß P ′ nur Regeln der Form ⎧ ⎨ A → BC mit A, B, C ∈ V , (∗∗) A → B mit A, B ∈ V , ⎩ A → a mit A ∈ V, a ∈ Σ hat. (b) Es gibt einen (effizienten) Algorithmus, der zu Eingabe G feststellt, ob ε ∈ L(G) oder nicht. Beweis (a) Nach 3.2.1 können wir o. B. d. A. annehmen, daß P nur Produktionen der Form (∗) enthält (sonst wende die Konstruktion aus 3.2.1 an). Wir skizzieren zunächst einen Algorithmus zur Ermittlung der Menge V ε := {A ∈ V | A ∗ ⇒ ε}. Die Idee für den Algorithmus rührt her von folgender einfacher Beobachtung: A ∗ ⇒ ε gilt genau dann wenn (A → ε) oder (A → B und B ∗ ⇒ ε) oder (A → BC und B ∗ ⇒ ε, C ∗ ⇒ ε). 84


Um das einzusehen, betrachte man Ableitungsbäume zu den Produktionen der Form (∗) mit A als Startsymbol und Resultat ε: A A A ε B B C T B α(Τ ) B T B α(Τ ) B TC α(Τ C ) Wir konstruieren die Menge V ε in Stufen. Markierungs-Algorithmus: Initialisierung: Markiere alle A ∈ V , für die A → ε Produktion ist. Schleife: Solange es eine Variable A gibt derart dass A unmarkiert ist und es eine Produktion A → B gibt mit markiertem B oder eine Produktion A → BC, wo B und C markiert sind: markiere A. Ausgabe: Die Menge der markierten Variablen. Behauptung 1: Der Algorithmus gibt V ε aus. Beweis von Beh. 1: ” ⊆“: Wir zeigen durch Induktion über r ≥ 1: Falls es einen A- Ableitungsbaum T A gibt, der Tiefe r hat und α(T A ) = ε erfüllt, so wird A markiert. Diese Aussage ist klar für r = 1: Der einzig mögliche Baum ist: A ε und dann ist A → ε Produktion in P , also wird A bei der Initialisierung markiert. Ist r ≥ 2, gibt es für den Baum T A nur die folgenden beiden Möglichkeiten: A A B B C TB T B T C ε ε ε 85


Wir diskutieren nur den Fall mit zwei Unterbäumen, der andere geht analog. T B und T C haben Tiefe < r, also werden nach I. V. B, C irgendwann markiert. Gemäß dem Kriterium für das Abbrechen der Schleife ist am Ende des Algorithmus auch A sicher markiert. ” ⊇“: Unter Benutzung der obigen Beobachtung“ zeigt man leicht durch Induktion über ” die Schleifendurchläufe, dass gilt: Wenn A markiert ist, dann gilt A ∈ V ε . Folgerung: Teil (b) von 3.2.3 ist damit bewiesen. (Man muß nur noch testen, ob S ∈ V ε oder nicht.) Man überlege sich, wie der Algorithmus auf Produktionen erweiterbar ist, deren rechte Seite beliebig ist, also nicht (∗) erfüllt. Wir nehmen nun an, V ε wäre konstruiert, und geben die Grammatik G ′ an: P ′ enthält alle Produktionen der Form und zusätzlich die Produktionen A → BC, A → B, A → a aus P A → B , falls ∃C ∈ V ε : A → BC oder A → CB in P . Die Produktionen A → ε aus P werden weggelassen. Behauptung 2: L(G ′ ) = L(G) − ε. Beweis von Beh. 2: Wir müssen zeigen, wie man Ableitungsbäume für G in solche für G ′ umformt und umgekehrt. ⊇“: Wir zeigen folgendes durch Induktion über die Tiefe r von A-Ableitungsbäumen, ” A ∈ V , zur Grammatik G: Ist T A ein A-Ableitungsbaum für G mit α(T A ) = w ∈ Σ + , so existiert ein A-Ableitungsbaum T A ′ für G′ mit α(T A ′ ) = w. Ist r = 1, so ist der Baum T A A a (mit a = w ∈ Σ) selbst A-Ableitungsbaum für G ′ . Ist r > 1, so hat T A eine der folgenden Formen: (i) A (ii) A B T B C T C T D D α(Τ ) B α(Τ ) C α(Τ ) D 86


Dabei ist α(T A ) = α(T B )α(T C ) ≠ ε bzw. α(T A ) = α(T D ) ≠ ε. Die Unterbäume haben geringere Tiefe als T A , also kann man die Induktionsvoraussetzung anwenden. Im zweiten Fall ersetzen wir T D durch T D ′ . Im ersten Fall gibt es mehrere Möglichkeiten. (i) Ist α(T B ), α(T C ) ≠ ε, ersetzen wir T B durch T B ′ und T C durch T C ′ . (ii) Ist α(T B ) = ε, also B ∈ V ε , erhält der A-Knoten als einzigen Unterbaum den Baum T ′ C . (iii) Ist α(T C ) = ε, also C ∈ V ε , erhält der A-Knoten als einzigen Unterbaum den Baum T ′ B . (i) A A (ii) A (iii) T’ T’ T’ C T’ B C C B B C =ε =ε =ε =ε B Nach Konstruktion von P ′ ist dies jeweils ein A-Ableitungsbaum in G ′ . ⊆“ Wir zeigen folgendes durch Induktion über die Tiefe r von A-Ableitungsbäumen, ” A ∈ V , zur Grammatik G ′ : Ist T A ′ ein A-Ableitungsbaum für G′ mit α(T A ′ ) = w ∈ Σ∗ , so existiert ein A-Ableitungsbaum T A für G mit α(T A ) = w. Ist r = 1, so ist der Baum T A ′ selbst A-Ableitungsbaum für G. Sei also nun r > 1. Dann hat T A ′ eine der folgenden Formen: (i) A (ii) A B C B T’ T’ T’ B B C w Im Fall (i) ersetzt man T ′ B durch T B und T ′ C durch T C (diese Ableitungsbäume für G existieren nach I. V.). Nun zum Fall (ii): Ist A → B Produktion in G, ersetzt man T ′ B durch T B . Andernfalls gibt es, nach der Konstruktion von P ′ , ein C ∈ V ε , so daß entweder A → BC oder A → CB Produktion in P ist. Wähle irgendeinen C-Ableitungsbaum T C,ε für G mit α(T C,ε ) = ε. Dann können wir als T A folgenden Baum benutzen: 87


A A B C C B T C,ε bzw. T C,ε T B ε ε T B w w Damit ist Lemma 3.2.3 bewiesen. □ 3.2.4 Beispiel Aus der Grammatik aus 3.2.2 ergibt sich folgendes: V ε = {S, A, B, ˆD}, P ′ = {S → S ˆD | S | ˆD, ˆD → AB | A | B, A → D0 A | D 0 , B → D 1 B | D 1 , D 0 → 0, D 1 → 1}. Der Ableitungsbaum S S D^ S D^ A B ε A B D0 A D1 B ε ε 0 D0 A 1 ε 0 ε für G (maximale Unterbäume mit abgeleitetem Wort ε sind eingerahmt) entspricht dem Ableitungsbaum 88


S D^ A B D 0 A D 1 0 D 0 1 0 für G ′ (Regeln aus P ′ − P durch gepunktete Linien markiert). Wir können nun einen weiteren Schritt in Richtung Chomsky-Hierarchie tun. 3.2.5 Korollar L 2 ⊆ L 1 . Beweis Sei L ∈ L 2 , also L = L(G) für eine kontextfreie Grammatik G. Nach 3.2.1 und 3.2.3 existiert eine kontextfreie Grammatik G ′ = (V ′ , Σ, S, P ′ ) mit L(G ′ ) = L(G) − {ε}, wobei P ′ nur Produktionen der Form (∗∗) aus 3.2.3 enthält. Offenbar besteht P ′ nur aus kontextsensitiven Produktionen (Definition 2.1.6), da ε nie rechts vorkommt. 1. Fall: ε ∉ L. Dann L = L(G ′ ), fertig. 2. Fall: ε ∈ L. Dann ist L = L(G ′′ ) für die kontextsensitive Grammatik G ′′ = (V ′ ∪ {S ′′ }, Σ, S ′′ , P ′ ∪ {S ′′ → S, S ′′ → ε}). Mit der ” normaleren“ Form aus 3.2.3 sind wir noch immer nicht zufrieden. Wir wollen auch noch die ” Kettenregeln“, das sind Produktionen der Form A → B für A, B ∈ V , eliminieren. Das ist dann Schritt 4 der Konstruktion der Chomsky-Normalform. □ 89


3.2.6 Satz (Chomsky-Normalform) (a) Ist G = (V, Σ, S, P ) kontextfreie Grammatik, so gibt es eine kontextfreie Grammatik G ′ = (V ′ , Σ, S, P ′ ) mit L(G ′ ) = L(G) − {ε}, derart daß P ′ nur Produktionen der Form (∗ ∗ ∗) { A → BC mit A, B, C ∈ V , A → a mit A ∈ V, a ∈ Σ hat. (Technisch: P ′ ⊆ V × (V 2 ∪ Σ).) (b) Es gibt einen effizienten Algorithmus, der G ′ aus G berechnet. Beweis Auf beliebiges G wenden wir zunächst 3.2.1 und 3.2.3 an. Daher können wir o. B. d. A. annehmen, daß G nur Produktionen der Form (∗∗) aus 3.2.3 enthält. Wir eliminieren die Regeln der Form A → B im wesentlichen in zwei Phasen. Vorbereitung: Lasse alle Produktionen A → A, mit A ∈ V , weg. (Das ist harmlos.) Phase 1: Betrachte die Produktionsmenge P 1 := {(A, B) ∈ V 2 | A → B in P }. Suche einen Kreis in P 1 , mittels eines geeigneten Graphalgorithmus. Falls kein Kreis gefunden wird, gehe zu Phase 2. Falls ein Kreis A 1 → A 2 → · · · → A r → A 1 , r ≥ 2, in P 1 gefunden wurde, so ersetze in allen Produktionen in P , egal ob auf der linken oder der rechten Seite, jede der Variablen A 2 , . . . , A r durch A 1 . (Kommt S im Kreis vor, so ist o. B. d. A. S = A 1 .) Man überlegt sich leicht, daß sich die erzeugte Sprache nicht ändert. Dafür werden Ableitungsfolgen aus Kettenregeln im Kreis kurzgeschlossen“ und ” umgekehrt kurzgeschlossene“ Ableitungsschritte expandiert: ” ... ... A 2 A 1 A 3 B C D A 4 B C D (vorher) (nachher) 90


Die Aktion in Phase 1 wird so lange wiederholt, bis kein Kreis mehr gefunden wird. Da in jeder Runde die Zahl der Variablen echt abnimmt, ist dies nach höchstens |V | Wiederholungen der Fall. Dann ist Phase 1 beendet. Resultat dieser Phase ist eine Grammatik für dieselbe Sprache, deren Kettenregelmenge P 1 (wie oben) kreisfrei ist. Phase 2: Betrachte wieder den Graphen wie oben. P 1 ist nun kreisfrei. Wir betrachten P 1 = {(A, B) ∈ V 2 | A → B in P }, V 1 := {A ∈ V | es existiert eine Produktion A → B in P }. Ist V 1 = ∅, sind wir fertig: die Grammatik hat keine Kettenregeln mehr. Sonst suchen wir ein A ∈ V 1 mit folgender Eigenschaft: alle Produktionen A → B in P 1 erfüllen B ∉ V 1 . (Wieso existiert so ein A? Man startet mit irgendeinem C 0 ∈ V 1 . Falls C 0 nicht geeignet, gibt es eine Produktion C 0 → C 1 in P 1 . Aus C 1 erhält man C 1 → C 2 in P 1 , usw., bis schließlich C r gefunden wird, so daß kein C r+1 ∈ V 1 existiert mit C r → C r+1 in P 1 ; dies beruht auf der Kreisfreiheit von P 1 . Dieses C r ist als A geeignet.) Wir ersetzen nun in P jede solche Produktion A → B durch die Menge von Produktionen {A → CD | C, D ∈ V, B → CD in P } ∪ {A → a | a ∈ Σ, B → a in P }. Durch diese Operation wird A aus V 1 entfernt. Man macht sich wieder klar, daß diese Änderung die von der Grammatik erzeugte Sprache nicht ändert. Man ersetzt nur Teilstücke A A B bzw. B C D a im Ableitungsbaum durch 91


A A bzw. C D a und umgekehrt. Weiterhin ist bezüglich der neuen Grammatik auch A ∈ V −V 1 . Auch die Aktion in Phase 2 wird wiederholt, bis schließlich V 1 leer wird. Da |V 1 | in jeder Ausführung der Aktion um 1 abnimmt, ist dies nach höchstens |V | Iterationen der Fall. Die resultierende Grammatik enthält keine Kettenregeln mehr. □ 3.2.7 Beispiel Wir betrachten weiter die Grammatik aus Beispiel 3.2.4. G = ({S, A, B, D 0 , D 1 , ˆD}, {0, 1}, S, P ), wo P der Menge P ′ aus 3.2.4 entspricht. Wir entfernen die Produktion S → S und stellen dann fest, daß es in H keine Kreise gibt, daß also Schritt 1 nicht ausgeführt werden muß. Nun zu Schritt 2. V 1 = {S, ˆD, A, B}. Behandle A : Dazu: A → 0, streichen: A → D 0 . Behandle B : Dazu: B → 1, streichen: B → D 1 . Behandle ˆD : Dazu: ˆD → D0 A | 0, streichen: ˆD → A ; Dazu: ˆD → D1 B | 1, streichen: ˆD → B. Behandle S : Dazu: S → D 0 A | 0 | D 1 B | 1 | AB, streiche: S → ˆD. Als Resultat erhält man folgende Produktionen: S → S ˆD | D 0 A | D 1 B | AB | 0 | 1, A → D 0 A | 0, B → D 1 B | 1, D 0 → 0, D 1 → 1, ˆD → D 0 A | D 1 B | 0 | 1 | AB. Dies ist eine Grammatik in Chomsky-Normalform, wie gewünscht. Das oben beschriebene Verfahren zur Herstellung einer Chomsky-Normalform zu einer kontextfreien Grammatik G ist effizient in dem Sinn, daß es sich mit einem Algorithmus implementieren läßt, der Laufzeit polynomiell in der Größe der eingegebenen Grammatik hat (Zahl der Variablen, Zahl der Produktionen). 92


3.3 Das Pumping-Lemma für kontextfreie Sprachen Wir benutzen die Chomsky-Normalform, um ein Pumping-Lemma ähnlich dem für reguläre Sprachen (Satz 1.4.1) zu beweisen. Dieses Lemma kann man dann in ähnlicher Weise wie vorher für den Nachweis benutzen, daß gewisse Sprachen nicht kontextfrei sind. 3.3.1 Satz (Pumping-Lemma für kontextfreie Sprachen) Sei L eine kontextfreie Sprache über Σ. Dann gibt es eine Konstante n ≥ 1, so daß folgendes gilt: Ist z ∈ L, |z| ≥ n, so gibt es Wörter u, v, w, x, y ∈ Σ ∗ , derart daß (i) z = uvwxy, (ii) |vwx| ≤ n, (iii) |v| + |x| ≥ 1, (iv) ∀i ∈ IN : uv i wx i y ∈ L. Beweis Weil L ∈ L 2 , gibt es für L − {ε} eine Grammatik G = (V, Σ, S, P ) in Chomsky- Normalform (Satz 3.2.6). — Wir zeigen, daß n := 2 |V | die verlangten Eigenschaften hat. Sei dazu z ∈ L − {ε} = L(G) mit |z| ≥ n. Dann gibt es einen Ableitungsbaum T in G für z. Da in der Grammatik G Terminalzeichen a ∈ Σ nur durch Produktionen A → a erzeugt werden, hat T genau |z| ≥ n viele Knoten, die als Söhne ein (mit einem Terminalzeichen markiertes) Blatt haben; alle anderen Knoten haben Grad 2. Man überlegt sich leicht (formal: durch Induktion über d), daß ein Binärbaum, in dem der längste Weg d Knoten hat, höchstens 2 d−1 viele Blätter besitzt. Wenn wir also im Baum T einen Weg mit maximaler Knotenzahl l wählen, so ist 2 |V | = n ≤ 2 l−1 , also |V | < l. Wir nennen die Variablen auf diesem Weg, vom Blatt her zählend, A 0 , A 1 , . . . , A l−1 , und betrachten nur noch die untersten |V | + 1 dieser Knoten, entsprechend den Variablen A 0 , . . . , A |V | . 93


T: S A |V| A 2 |V|+1 Knoten A 1 A 0 z Da es nur |V | Variable gibt, müssen zwei der A i ’s gleich sein. Wir haben folgende Situation (die doppelt vorkommende Variable wird A genannt): T: S steht fuer einen Teilweg in T A A


T: S T : 1 A T : 2 A u v w x y Diese beiden Teilbäume teilen z = α(T ) in 5 Teile (von denen manche leer sein können): u := der Inhalt der Blätter von T links von T 1 v := der Inhalt der Blätter von T 1 links von T 2 w := α(T 2 ) x := der Inhalt der Blätter von T 1 rechts von T 2 y := der Inhalt der Blätter von T rechts von T 1 . Folgendes sieht man sofort: (i) z = uvwxy. (ii) |vwx| ≤ n. (Denn: vwx = α(T 2 ), also |vwx| = #Blätter von T 1 . Weil wir ursprünglich einen Weg maximaler Länge in T gewählt hatten, hat der längste Weg in T 1 höchstens |V | + 1 Knoten, die mit Variablen markiert sind. Nach obiger Überlegung gilt dann |α(T 1 )| ≤ 2 (|V |+1)−1 = n.) (iii) |v| + |x| ≥ 1. (Dies gilt, weil nach Konstruktion T 2 echter Teilbaum von T 1 ist, und weil es in der Chomsky-Normalform im Inneren des Baumes nur Knoten von Grad 2 und keine ε- Produktionen gibt.) Es bleibt (iv) zu zeigen: Die Idee ist dabei, daß man den Teil von T 1 , der nicht auch in T 2 ist, beliebig oft zwischen den Baum T (ohne T 1 ) und T 2 einfügen kann und daraus stets einen legalen Ableitungsbaum erhält. Also: 95


S A T 2 w u y ist Ableitungsbaum für uwy = uv 0 wx 0 y; der folgende Baum T: S T : 1 A T 1 A u v x y A T2 v w x ist einer für uv 2 wx 2 w, und es sollte zumindest anschaulich klar sein, daß man ebenso Ableitungsbäume für uv 3 wx 3 y, uv 4 wx 4 y usw. konstruieren kann. — Also gilt {uv 0 wx 0 y, uvwxy = z, uv 2 wx 2 y, uv 3 wx 3 y, . . . } ⊆ L, wie in (iv) behauptet. □ 96


3.3.2 Beispiel Aus der Grammatik in Beispiel 3.1.3 erhält man durch leichte Umformungen folgende Produktionen, die eine Grammatik für L bal≠ε in Chomsky-Normalform bestimmen: S → SS | D 0 ˆD | D0 D 1 , ˆD → SD 1 , D 0 → 0, D 1 → 1 . Betrachte z. B. den folgenden Ableitungsbaum für z = 00101101 in dieser Grammatik: S S S D 0 D D 0 D 1 0 S D 1 0 1 S S 1 T 1 D 0 D 1 D0 D 1 T 2 0 1 0 1 Wir haben einen längsten Pfad markiert; auf ihm wiederholt sich die Variable S (doppelt umrandet). Durch die o. a. Manipulationen ergeben sich die folgenden Ableitungsbäume: 97


S 001101: S S D D 0 D 1 0 D 0 1 S D 1 0 1 D 0 D 1 0 1 T 2 0010101101: S S S D 0 D D 0 D 1 0 S D 1 0 1 S S 1 D 0 D 1 S S 0 1 D 0 D 1 D 0 D 1 0 1 0 1 Man macht sich klar, daß hier u = 0, v = 01, w = 01, x = ε und y = 101 gilt. Überprüfe die Aussagen (i), (ii), (iii) aus 3.3.1! Ganz genau wie im Fall des Pumping-Lemmas für reguläre Sprachen wollen wir 3.3.1 als Hilfsmittel zur Konstruktion von Beweisen für die Nicht-Kontextfreiheit gewisser Sprachen 98


benutzen. Dabei gehen wir nach demselben Schema vor wie in Kapitel 1 (vor 1.4.2). Wir betrachten einige Beispiele. 3.3.3 Behauptung Die folgenden Sprachen sind nicht kontextfrei: (a) L 1 = {a m b m c m | m ≥ 1}. (b) L 2 = {a m b k c m d k | m, k ≥ 1}. (c) L 3 = {0 n2 | n ≥ 1}. Beweis von 3.3.3: (a) Beweis indirekt. Angenommen, L 1 wäre kontextfrei. Dann gibt es dazu ein n ≥ 1 mit den Eigenschaften wie im Pumping-Lemma 3.3.1 angegeben. Wähle nun z = a n b n c n ∈ L 1 . Nach 3.3.1 gibt es u, v, w, x, y ∈ Σ ∗ derart daß (i) a n b n c n = uvwxy, (ii) |vwx| ≤ n, (iii) |v| + |x| ≥ 1, (iv) ∀i ∈ IN : uv i wx i y ∈ L 1 . Wegen (i), (ii) haben wir, daß vwx entweder ein Teilwort von a n b n oder ein Teilwort von b n c n sein muß (vwx kann nicht ” b n echt überspannen“). Sei z. B. vwx Teilwort von a n b n (im Fall b n c n argumentiert man analog). Dann ist im Wort uv 0 wx 0 y die Zahl der a’s und b’s zusammen gleich 2n − |v| − |x| < 2n (wegen (iii)), jedoch die Zahl der c’s gleich n. Also ist uv 0 wx 0 y ∉ L 1 . Dies widerspricht aber (iv). (b) Beweis indirekt. Angenommen, L 2 wäre kontextfrei. Dann gibt es dazu ein n ≥ 1 mit den Eigenschaften wie im Pumping-Lemma 3.3.1 angegeben. Wähle nun z = a n b n c n d n ∈ L 2 . Nach 3.3.1 gibt es u, v, w, x, y ∈ Σ ∗ derart daß (i) a n b n c n d n = uvwxy, (ii) |vwx| ≤ n, (iii) |v| + |x| ≥ 1, (iv) ∀i ∈ IN : uv i wx i y ∈ L 2 . Wegen (i) und (ii) haben wir, daß vwx entweder Teilwort von a n b n oder Teilwort von b n c n oder Teilwort von c n d n sein muß. 1. Fall: vwx Teilwort von a n b n . Dann ist im Wort z 0 := uv 0 wx 0 y die Zahl der a’s und b’s zusammen gleich 2n−|v|−|x| < 2n (wegen (iii)), aber die Zahl der c’s und d’s zusammmen gleich 2n. Also ist z 0 = uv 0 wx 0 y ∉ L 2 . Dies widerspricht (iv). 2. Fall: vwx Teilwort von b n c n . Argumentiere genauso — spiele die Gesamtzahl der b’s und c’s in z 0 gegen die der a’s und d’s aus. 3. Fall: vwx Teilwort von c n d n . Analog. 99


(c) Beweis indirekt. Angenommen, L 3 wäre kontextfrei. Dann gibt es dazu ein n ≥ 1 mit den Eigenschaften wie im Pumping-Lemma 3.3.1 angegeben. Wähle nun z = 0 n2 ∈ L 3 . Nach 3.3.1 gibt es u, v, w, x, y ∈ Σ ∗ derart daß (i)–(iv) erfüllt sind. Nun ist aber z 0 = uv 0 wx 0 y = 0 n2 −|v|−|x| = 0 n2 −k für ein k mit 1 ≤ k ≤ n (nach (ii) und (iii)). Jedoch ist n 2 − k > (n − 1) 2 , also n 2 − k keine Quadratzahl und damit z 0 ∉ L 3 . Dies widerspricht (iv). □ Anmerkung: Zur Sprache L 3 aus der vorigen Behauptung und Sprache über einem einelementigen Alphabet überhaupt sei angemerkt, daß folgendes gilt: L ⊆ Σ ∗ , |Σ| = 1, L ∈ L 2 ⇒ L ∈ L 3 . (Der Beweis dieser Aussage ist etwas aufwendiger — er benutzt übrigens das Pumping- Lemma 3.3.1 — und nicht Stoff der Vorlesung.) Damit folgt also aus der Nichtregularität von L 3 , die wir schon früher bewiesen haben, auch schon, daß L 3 nicht kontextfrei ist. 3.4 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 kennen aus 3.2.3(b) einen effizienten Algorithmus für den Fall w = ε, und wir wissen, daß man G in eine Grammatik G ′ in Chomsky-Normalform mit L(G ′ ) = L(G)−{ε} umbauen kann. Also können wir hier o. B. d. A. annehmen, daß G in Chomsky-Normalform vorliegt, daß also alle Produktionen in P die Form A → BC oder A → a haben (A, B, C ∈ V ; a ∈ Σ). Es sei w = a 1 · · · a n ∈ Σ ∗ gegeben, n ≥ 1. Wir definieren Mengen U d,i := {A ∈ V | A ∗ ⇒ a i · · · a i+d−1 }, für 1 ≤ d ≤ n, 1 ≤ i ≤ n − d + 1. Für jedes Teilwort a i · · · a i+d−1 von w will man also wissen, aus welchen Variablen A ∈ V dieses Wort herleitbar ist. Offenbar ist w ∈ L(G) genau dann wenn S ∈ U n,1 . Wir überlegen nun, wie die U d,i durch Induktion über d zu berechnen sind. 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: U 1,i = {A ∈ V | A → a i }, für 1 ≤ i ≤ n. d > 1: Ist A ∗ ⇒ b 1 · · · b m =: v für ein Wort v ∈ Σ m , m ≥ 2, so gibt es einen A- Ableitungsbaum T mit α(T ) = v. Die Wurzel von T ist also mit A markiert, und T 100


hat m Blätter. Die Wurzel muß zwei Söhne haben, die mit Variablen (etwa C und D) markiert sind. Schematisch sieht das so aus: A T C C D T D v’’ v’ Die beiden Teilbäume von T heißen T C und T D , und wir setzen v ′ := α(T C ), v ′′ := α(T D ). Offenbar gilt: (3.1) C ∗ ⇒ v ′ , D ∗ ⇒ v ′′ , v = v ′ v ′′ , und 1 ≤ |v ′ |, |v ′′ | < m , und A → CD ist Produktion. Umgekehrt überlegt man sich leicht, anhand desselben Bildes, daß aus der Situation (3.1) folgt, daß A ∗ ⇒ v. — Wir haben also, für A ∈ V : A ∗ ⇒ v ⇔ ∃C, D ∈ V ∃v ′ , v ′′ ∈ Σ ∗ : (3.1) gilt . Auf v = a i · · · a i+d−1 angewandt, ergibt dies: A ∗ ⇒ a i · · · a i+d−1 ⇔ ∃C, D ∈ V ∃d ′ : 1 ≤ d ′ < d − 1 und C ∗ ⇒ a i · · · a i+d ′ −1, D ∗ ⇒ a i+d ′ · · · a i+d−1 und A → CD ist Produktion . Damit erhalten wir folgende Rekursionsformel für die Mengen U d,i : U d,i = {A ∈ V | ∃C, D ∈ V ∃d ′ : 1 ≤ d ′ < d und A → CD ist Produktion und C ∈ U d ′ ,i und D ∈ U d−d ′ ,i+d ′}. Daraus ergibt sich folgender Algorithmus zur Lösung des Wortproblems für eine Grammatik G in Chomsky-Normalform: Eingabe: w = a 1 · · · a n ∈ Σ + . Datenstruktur: Ein Array U[1..n, 1..n], wo jeder Eintrag eine Teilmenge von V ist. U[d, i] := ∅, für 1 ≤ d ≤ n, 1 ≤ i ≤ n − d + 1. (Nur diese Einträge in U werden benutzt.) 101


Methode: 1. U[1, i] := {A | A → a i ist Produktion }, für 1 ≤ i ≤ n. 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 | ∃ 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(n 3 ) — dabei geht die Größe der Grammatik G in die in dem ” O“ versteckte Konstante ein. Oft illustriert man die Arbeitsweise dieses Algorithmus mit einem dreieckigen Schema, in dem die relevanten Einträge des Arrays U aufgeführt sind. w= i= a 1 1 a 2 2 . . . . . . a n n d=1 2 ... n Die Zelle in Zeile d, Spalte i, enthält die Menge U d,i . 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: 102


i 1 (a) 4 (b) 2 (a) 3 (b) 3 (a) 2 (b) 4 (a) 1 (b) d=5 ? Für d ′ = 1, . . . , d − 1 prüft man für jede Produktion A → CD der Grammatik, ob C in Zelle d ′ (a) und D in Zelle d ′ (b) vorkommt. In diesem Fall wird A in die mit ” ?“ markierte Zelle eingetragen. Beispiel: Betrachte die Grammatik aus Beispiel 3.3.2. Anwenden des Verfahrens auf die Eingaben 00100111 und 01011100 liefert (ist die Menge U d,i leer, deuten wir dies durch Freilassen des entsprechenden Kästchens an): d=1 0 0 1 0 0 1 1 1 D 0 D 0 D 1 D 0 D 0 D 1 D 1 D 1 0 1 0 1 1 1 0 0 D 0 D 1 D 0 D 1 D 1 D 1 D 0 D 0 2 S S S S 3 D^ 4 5 S D^ S 6 7 S D^ 8 S Durch eine leichte Erweiterung der Datenstruktur ist es auch möglich, den Algorithmus so auszubauen, daß im Falle w ∈ L(G) 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.) Auf ähnliche Weise ist feststellbar, ob das Wort w mehrere Ableitungen besitzt. Wir haben gezeigt: 103


3.4.1 Satz Es gibt einen Algorithmus, der zu vorgelegter kontextfreier Grammatik G = (V, Σ, S, P ) und w ∈ Σ ∗ entscheidet, ob w ∈ Σ ∗ . Für festes G ist die Laufzeit des Algorithmus O(n 3 ), für |w| = n. Es sei angemerkt, daß kubische Laufzeit zur Analyse von Programmen in einer durch eine kontextfreie Grammatik spezifizierten Programmsprache 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. (Siehe Vorlesung ” Übersetzerbau“ oder ” Formale Sprachen“.) 104


Kapitel 4 Kellerautomaten In diesem Kapitel wird das Maschinenmodell behandelt, das den kontextfreien Grammatiken entspricht, nämlich die nichtdeterministischen Kellerautomaten. Danach wird noch auf die deterministische Variante dieses Modells und die dazugehörige Sprachklasse eingegangen. Schließlich werden einige Abschluß- und Entscheidbarkeitseigenschaften der entsprechenden Sprachklassen diskutiert. 4.1 Nichtdeterministische Kellerautomaten Was passiert mit der Berechnungsstärke von endlichen Automaten, wenn sie zusätzlich zur Kontrolleinheit mit einem weiteren (unendlichen) Speichermedium versehen werden? Wir betrachten hier eine schwache Form eines Speichers: einen ” Keller“ (englisch: pushdown store, stack). Dieser entspricht einem nach links unendlichen Band, auf das bei Rechtsbewegungen des Kopfes stets der Blankbuchstabe ” B“ geschrieben werden muß. Alternativ kann man sich auch die Standard-Datenstruktur ” Stack“ vorstellen, einen LIFO- (last-in-first-out-)Speicher, auf den Objekte gePUSHt (oben angehängt) und von dem Objekte gePOPt (von oben weggenommen werden) können. 105


Band: Bandende ... B ... B B B B B i n s c h r i f t # Stack: Links des Kopfes stehen nur B’s i n s c h r i f t # entspricht Kopf Zugriff nur auf oberes Kellerende unterstes Kellerzeichen Bandendesymbol Die Objekte, die in den Kellern unserer Kellerautomaten gespeichert werden, sind Elemente eines (Band-/Keller-)Alphabets Γ. Die Eingabe für Keller-Automaten steht auf einem separaten Eingabeband, das nur einmal von links nach rechts gelesen wird: in einem Schritt rückt der Kopf auf dem Eingabeband entweder um 1 Feld nach rechts oder ändert seine Position nicht (letzteres nennen wir einen ” ε-Zug“). Genauso wie endliche Automaten sind Kellerautomaten mit einer Kontrolleinheit mit endlicher Kapazität (abstrakt gegeben durch eine endliche Zustandsmenge Q) ausgestattet. Zu Anfang der Rechnung ist der Kellerautomat in einem Anfangszustand q 0 ; der Kopf des Eingabebandes steht links vom ersten Zeichen des Eingabewortes w = a 1 · · · a n , n ≥ 0, der Keller enthält einen Eintrag, nämlich das ausgezeichnete Keller-Ende-Symbol Z 0 . Der Kellerautomat rechnet in Schritten. Ein Schritt besteht dabei in folgendem: 1. Das oberste Kellersymbol A wird gelesen und vom Keller entfernt (POP-Operation). 2. Es wird entweder das nächste Symbol a i des Eingabewortes gelesen (dann rückt der Eingabeband-Kopf um 1 Feld nach rechts, also steht jetzt links von a i+1 ) oder nichts vom Eingabeband gelesen (der Kopf bewegt sich nicht: ε-Zug). 3. Aufgrund von A, dem gegenwärtigen Zustand und (falls kein ε-Zug vorliegt) dem Zeichen a i wird entschieden, – welche(s) Zeichen auf den Keller gePUSHt wird (werden); – was der neue Zustand q ′ sein soll. 106


Die hier betrachteten Kellerautomaten sind nichtdeterministisch, daher gibt es in 2. und 3. keine, eine oder mehrere gleichermaßen erlaubte Aktionen. Dies führt dazu, daß, wie bei NFA’s, viele verschiedene Berechnungen möglich sind. Eine Berechnung des Kellerautomaten akzeptiert, falls nach Lesen aller Zeichen der Eingabe der Keller völlig geleert wird, inklusive des Kellerende-Symbols Z 0 . Dabei ist zu beachten, daß nach völligem Entleeren des Kellers kein weiterer Schritt möglich ist (Teil 1 ist unmöglich) und daß nach Lesen des letzten Eingabezeichens a n nur noch ε-Züge möglich sind. Wir wollen uns zunächst anhand eines Beispiels davon überzeugen, daß kontextfreie 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 bekanntermaßen die korrekten Klammerausdrücke erzeugt. Der Kellerautomat hat Bandalphabet Σ, Kelleralphabet Γ = {S, (, )} und Kellerendezeichen Z 0 = S. Erlaubt sind folgende Aktionen: 1) Ist ” (“ oberstes Kellerzeichen und erstes Eingabezeichen, streiche ” (“ aus dem Keller und rücke Leseband um 1 Feld nach rechts ( ” Lesen“: L). 2) Wie 1), mit ” (“ durch ” )“ ersetzt ( ” Lesen“: L). 3) Ist ” S“ oberstes Kellerzeichen, ersetze dies durch nichts ( ” ε“) oder durch die 4 Zeichen ” (S)S“ ( ” Expandiere“: E). Die Eingabe ” ()(()())“ kann dann folgendermaßen verarbeitet werden: bereits gelesene Bandbuchstaben Keller Aktionstyp - S E - (S)S L ( S)S E ( ε)S ≡)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 L ()(()( S))S E ()(()( ))S L ()(()() )S L ()(()()) S E ()(()()) Schluß 107


Beobachte: Konkateniert man in jeder Zeile die gelesenen Buchstaben und den Kellerinhalt, ergibt sich, von oben nach unten gelesen, eine Linksableitung. Das Lesen eines Wortes w aus L(G) unter Herstellung einer Ableitung (insbes. eines Ableitungsbaums für w) nennen wir Parsing. In unserem Beispiel wird das Wort von links nach rechts gelesen und dabei eine Linksableitung erzeugt ( ” LL-Parsing“). Wir setzen nun die obige informale Beschreibung in eine formale Definition um. 4.1.1 Definition Ein nichtdeterministischer Kellerautomat (englisch: pushdown automaton; Abk.: PDA oder NPDA) besteht aus 6 Komponenten: – Q, einer endlichen, nichtleeren Menge von Zuständen, – Σ, dem Eingabealphabet; – Γ, dem Kelleralphabet (Stack-Alphabet) – q 0 ∈ Q, dem Startzustand – Z 0 ∈ Γ, dem Kellerende-Symbol – δ : Q × (Σ ∪ {ε}) × Γ → P


(d) M akzeptiert w ∈ Σ ∗ , falls (q 0 , w, #) ⊢ ∗ M (q, ε, ε) für ein q ∈ Q. (Startend in Zustand q 0 , mit Eingabe w und nur dem Zeichen # im Keller, kann in einer Reihe von legalen Rechenschritten das Eingabewort gelesen und der Keller geleert werden?) (e) L M := {w ∈ Σ ∗ | M akzeptiert w} ist die von M akzeptierte Sprache. 4.1.3 Beispiel Eine Formalisierung unseres PDA für die Klammersprache sieht wie folgt aus: Q = {q 0 }, Σ = {’(’,’)’}, Γ = {S, (, ), #}, Z 0 = #; δ(q 0 , ε, #) = {(q 0 , S#)} δ(q 0 ,’)’,’)’) = {(q 0 , Sε 0 )} δ(q 0 ,’(’S) = {(q 0 , S’)’S)} δ(q 0 , ε, #) = {(q 0 , ε)}. Dabei haben wir — die aufmerksame Leserin hat es bemerkt — die Aktion ” expandieren mit Resultat (S)S“ und ” Lesen eines ’(’“ zusammengefasst. 4.1.4 Beispiel Wir wollen einen PDA für die Sprache {ww R | w ∈ {0, 1} ∗ } angeben. Die Idee ist, die Buchstaben von w im Keller zu speichern, Nichtdeterminismus zu verwenden, um irgendwo auf das Lesen von w R umzuschalten und während dieser zweiten Phase die Kellersymbole einzeln mit den Buchstaben des Eingabewortes zu vergleichen. M = (Q, Σ, Γ, q 0 , Z 0 , δ), wobei Q = {q 0 , q 1 } (q 0 für Lesephase, q 1 für Kontrollphase), Σ = {0, 1}, Γ = {A 0 , A 1 , #}, Z 0 = #, δ wie folgt: δ(q 0 , a, X) = {(q 0 , A a X)}, für a ∈ {0, 1}, X ∈ Γ (1. Phase: Gelesenes Symbol a wird gePUSHt) δ(q 0 , ε, X) = {(q 1 , X)}, für X ∈ Γ (Umschalten auf 2. Phase: kein Eingabezeichen lesen, Keller nicht ändern) δ(q 1 , a, A a ) = {(q 1 , ε)}, für a ∈ {0, 1} (2. Phase: Falls gelesenes Symbol zu oberstem Kellerzeichen paßt, wird dieses ge- POPt.) δ(q 1 , ε, #) = {(q 1 , ε)} (Leeren des Kellers nach Ende der 2. Phase) Dabei sind die Knoten Konfigurationen, eine von oben nach unten verlaufende Kante von k nach k ′ steht für die Relation ⊢ M . Wir skizzieren den Baum aller möglichen Berechnungen dieses PDA auf der Eingabe 011110. 109


(q ,11110,A #) (q ,011110,#) 0 0 0 1 (q ,011110,#) (q ,1110,A A #) 0 1 0 (q ,11110,A #) 1 0 4 0 0 1 (q , ε,A (A ) A #) (q ,10,(A ) A #) (q ,0,(A ) A #) (q , ε,A (A ) A #) 4 1 0 1 3 0 1 (q ,110,A A A #) 0 1 4 3 0 1 1 (q ,110,A A A #) (q ,10,(A ) A #) (q ,1110,A #) 0 1 1 0 1 0 (q ,110,A #) 0 1 1 1 0 1 0 (q ,10,A A #) 0 1 1 0 (q ,0,(A ) A #) (q ,0,A A A #) (q ,0,A #) 0 1 1 4 0 1 1 1 0 1 0 0 1 (q , ε,#) (q 1ε , , ε) Da eine der Berechnungen in der Konfiguration (q 1 , ε, ε) endet, akzeptiert M das Wort 011110. Aus der Definition geht hervor, daß in einer Konfiguration, in der der Keller leer ist, kein weiterer Schritt möglich ist. Der Akzeptierungsmodus ” bei leerem Keller“ ist aus technischen Gründen bequem. Man kann zeigen, daß ein der Situation bei Automaten ähnlicher Akzeptierungsmodus verwendet werden kann: mittels akzeptierender Zustände. 4.2 Bottom-Up-Parsing, LR-Parsing Gegeben: Gesucht: kontextfreie Grammatik G und w ∈ L(G) Ableitungsbaum ( ” Syntaxbaum“) zu w Wir kennen ” Top-down“/ ” LL“-Parsing aus 4.4.1 ” (a) ⇒ (b)“. Dort wurde die Linksableitung konstruiert (Ableitungsbaum von der Wurzel her). Nun betrachten wir Kellerautomaten, die die Rechtsableitung konstruieren, dabei lesen wir von Links nach rechts (Ableitungsbaum von den Blättern her abarbeiten). Dieser Vorgang heißt entsprechend ” LR-Parsing“. Anfangs: (wobei q ∈ Q) 110


Eingabe # q a 1 a 2 a n Keller unten oben Kontrolleinheit Zwischensituation: # Z r Z 1 gelesen a i a n 2 mögliche Aktionen: 1) ” shift“ nächstes Eingabesymbol in den Keller: # Z r Z 1 a i gelesen a i+1 a n 2) ” reduce“ Falls die s obersten Kellersymbole Z 1 , . . . , Z s , s ≥ 0 eine rechte Seite α = Z s . . . Z 1 , s ≥ 0, einer Produktion A → α bilden, dann ersetze Z 1 , . . . , Z s durch A. Dabei wird kein Eingabezeichen gelesen. # Z r Z s+1 A gelesen a i a n Ende: S# ist die Kellerinschrift, lösche diese. Beispiel: folgende kontextfreie Grammatik sei gegeben: S → (S)S | () | (S) | ()S. Keller Steuereinheit Eingabe # (())((()())()) shift: #( · · · (.())((()())()) 111


shift: #(( · · · ((.))((()())()) shift: #(() · · · (().)((()())()) reduce: #(S · · · (().)((()())()) shift: #(S) · · · (()).((()())()) shift: #(S)( · · · (())(.(()())()) ” Griff“:() ” Griff“:(S) Shift-Reduce-Konflikt“ : für shift entschieden ” shift: #(S)(( · · · (())((.()())()) shift: #(S)((( · · · (())(((.)())()) shift: #(S)((() · · · (())((().())()) Konflikt! → shift shift: #(S)((()( · · · (())((()(.))()) shift: #(S)((()() · · · (())((()().)()) reduce: #(S)((()S · · · (())((()().)()) Konflikt! → reduce reduce: #(S)((S · · · (())((()().)()) shift: #(S)((S) · · · (())((()()).()) shift: #(S)((S)( · · · (())((()())(.)) shift: #(S)((S)() · · · (())((()())().) reduce: #(S)((S)S · · · (())((()())().) reduce: #(S)(S · · · (())((()())().) shift: #(S)(S) · · · (())((()())()). reduce: #(S)S · · · (())((()())()). reduce: #S · · · (())((()())()). Schlussschritt: leere Keller ε Im Syntaxbaum: Arbeiten von den Blättern startend: ” bottom-up“ Beobachtung: Von unten nach oben gelesen, bilden die Konkatenationen 112


Kellerinhalt Restwort eine Rechtsableitung für das Eingabewort w. Technische Probleme: Wenn t = max{|α| | A → α Produktion }, muss die Kontrolleinheit zur Entscheidung über den nächsten Zug die t obersten Kellersymbole kennen. Trick: k Kellersymbole (cacheartig) in der Kontrolleinheit aufbewahren: r >= k # Z r Z k+1 Z k Z 1 gelesen r < k # Zr Z1 gelesen ( ⋃ Zustandsmenge: Q = Q 0 × Γ ), r Γ = {#} ∪ V ∪ Σ, wobei Q 0 die Menge der 0≤r≤k eigentlichen“ Zustände ist. ” Die Definition von δ ist nicht schwer, aber mühsam: δ(Z 1 . . . Z k , a, X) = (aZ 1 . . . Z k−1 , Z k X). 113


Falls α = Z s . . . Z 1 und A → α eine Produktion ist, dann muß δ in mehreren ε-Übergängen: – α durch A ersetzen – die s − 1 obersten Kellersymbole in die Kontrolleinheit hochziehen“. ” vorher Z k+1 # Z r Zk Z1 gelesen # Z r Z k+s Z k+s-1 Z s+1 A gelesen nachher Verbleibende Probleme: shift-reduce-Konflikt und reduce-reduce-Konflikt (zwei Produktionen anwendbar). Hier wurde der Nichtdeterminismus benutzt. Diese ist aber praktisch undurchführbar. Eine Möglichkeit, den Nichtdeterminismus zu beseitigen, wäre die Nachahmung der Potenzmengenkonstruktion. In ” Übersetzerbau“: Spezielle Grammatiktypen ( ” LR(k)-Grammatiken“) werden von einem ” Compilergenerator“ in einen Kellerautomaten transformiert, der deterministisch (in jeder Situation nur eine Aktion möglich) LR-Analysen durchführt. Hilfsmittel hierbei ist: ” lookahead von k Zeichen“ (k ≥ 1 fix): die nächsten k Eingabezeichen werden für Entscheidungen über nächsten Zug ebenfalls herangezogen. 4.3 Akzeptierungsmodi 4.3.1 Bemerkung Unsere PDA’s akzeptieren mit leerem Keller“. Alternativ (und ” näher an NFA’s) kann man auch akzeptieren durch akzeptierenden Zustand“ betrachten. ” Diese Art von PDA’s hat eine weitere Komponente F ⊆ Q. Die Definition von Konfiguration und der Relation ⊢ ∗ M bleibt gleich, jedoch wird w ∈ Σ∗ akzeptiert, ist also in L M , wenn (q 0 , w, Z 0 ) ⊢ ∗ M (q, ε, γ) für ein q ∈ F und ein beliebiges γ ∈ Γ∗ , wenn also 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. 114


4.3.2 Fakt Es sei L ⊆ Σ ∗ . Dann gilt: L = L M für einen NPDA M, der mit leerem Keller akzeptiert, genau dann wenn L = L M ′ für einen NPDA M’, der mit akzeptierendem Zustand akzeptiert. Beweis ” ⇒“ : Betrachte M = (Q, Σ, Γ, q 0, Z 0 , δ). Wir konstruieren M ′ = (Q ′ , Σ, Γ ′ , q 0, ′ Z 0, ′ δ ′ ) wie folgt: Q ′ = Q ∪ {q 0, ′ q acc }, Γ ′ = Γ ∪ {z 0}, ′ F = {q acc }. (i) δ(q ′ 0, ε, Z ′ 0) = {(q 0 , Z 0 Z ′ 0)}. (ii) δ ′ stimmt auf Q × (Σ ∪ {ε}) × Γ mit δ überein. (iii) δ ′ (q 0 , ε, Z ′ 0) = {(q acc , ε)} für q ∈ Q. Man sieht leicht, daß auf der neuen Maschine M ′ genau die Rechnungen von M ablaufen, nur mit dem zusätzlichen neuen Kellersymbol Z ′ 0. Diese kann mittels Regel (iii) schließlich gestrichen werden, bei gleichzeitigem Übergang in einen akzeptierenden Zustand, wenn (aus Sicht von M) der Keller leer ist. ” ⇐“ : Betrachte M ′ = (Q ′ , Σ, Γ ′ , q ′ 0, Z ′ 0, δ ′ , F ′ ). Wir konstruieren: M = (Q, Σ, Γ, q 0 , Z 0 , δ) mit Q = Q ′ ∪ {q 0 , q acc }, Γ = Γ ′ ∪ {Z 0 } und (i) δ(q 0 , ε, Z 0 ) = {(q ′ 0, Z 0 Z ′ 0)} (ii) δ stimmt auf Q ′ × (Σ ∪ {ε}) × Γ ′ mit δ ′ überein. (iii) δ(q, ε, Z) = {(q acc , ε)} für q ∈ F ′ ∪ {q aac }, Z ∈ Γ ′ ∪ {Z 0 }. Man sieht, daß M dieselben Rechnungen wie M ′ durchführt, nur mit dem zusätzlichen Kellersysmbol Z 0 . Der Restkeller, einschließlich Z 0 , kann schließlich gestrichen werden, wenn (aus Sicht von M ′ ) ein akzeptierender Zustand erreicht wurde. 4.4 Kellerautomaten und Grammatiken Wir wenden uns nun dem bereits angekündigten Äquivalenzsatz zu. Der Satz ist sehr wichtig, daher wollen wir auch einen vollständigen Beweis angeben. (In der Vorlesung wird dieser nur skizziert.) Die eine Richtung (konstruiere Kellerautomaten zu gegebener Grammatik) kommt häufiger vor, jedoch hat man in der Praxis eingeschränkte Grammatiktypen, die dann auch andere Konstruktionsverfahren ermöglichen. Für Details vgl. die Vorlesung ” Übersetzerbau“. 4.4.1 Satz Sei L ⊆ Σ ∗ Sprache. Dann sind äquivalent: (a) L = L(G) für eine kontextfreie Grammatik G. 115


(b) L = L M für einen NPDA M. Beweis (a) ⇒ (b)“: Diese Konstruktion ist eine allgemeine Version der Konstruktion ” des PDA zur Klammersprache vom Anfang des Kapitels. Es sei eine kontextfreie Grammatik G = (V, Σ, S, P ) gegeben. Wir konstruieren einen PDA M mit L M = L(G) wie folgt. Der Kellerautomat versucht, in seinem Keller eine Links-Ableitung für das Eingabewort w nachzubilden. Um jedoch auf die am weitesten links stehenden Variablen in der gegenwärtig vorliegenden Satzform α ∈ (V ∪ Σ) ∗ eine Produktion anwenden zu können, muß diese sich am Anfang des Kellers befinden. Daher werden Terminalzeichen, die an der obersten Kellerposition auftauchen, stets gePOPt, wobei zugleich geprüft wird, daß sie mit dem nächsten Eingabezeichen übereinstimmen. Dies führt dazu, daß die in einer Konfiguration (q, w ′ , α) kodierte Satzform das Wort w ′′ α ist, wo w ′′ w ′ = w (w ′′ ist der bereits gelesene Teil der Eingabe). Um zu beginnen, benutzen wir S als anfängliches Kellersymbol. Formal: wo δ wie folgt definiert ist: M = ({q 0 }, Σ, V ∪ Σ, q 0 , S, δ), δ(q 0 , ε, A) := {(q 0 , α) | A → α ist in P }, für A ∈ V (Expandiere). δ(q 0 , a, a) := {(q 0 , ε)}, für a ∈ Σ (Lese). (Ist das oberste Kellersymbol eine Variable A, kann man eine der Produktionen anwenden, deren linke Seite A ist. Ist das oberste Kellersymbol ein Terminalzeichen a, so wird a mit dem nächsten Eingabezeichen verglichen und, falls sie übereinstimmen, wird a gePOPt.) Man kann nun formal folgendes zeigen: (q 0 , w, S) ⊢ ∗ M (q 0 , w ′ , α) genau dann wenn es eine Ableitung S ∗ ⇒ w ′′ α in G gibt, wobei w ′′ w ′ = w und in der Ableitungsfolge stets auf die am weitesten links stehende Variable eine Produktion aus P angewendet wird. (Man zeigt diese Äquivalenz durch Induktion über die Länge der Rechnung in M bzw. über die Zahl der Ableitungsschritte in G.) Wenn wir diese Äquivalenz auf w ′ = α = ε anwenden, erhalten wir: (q 0 , w, S) ⊢ M (q 0 , ε, ε) genau dann wenn es eine Linksableitung S ∗ ⇒ w in G gibt. 116


Das heißt aber w ∈ L M ⇔ w ∈ L(G), wie gewünscht. Anmerkung Mitunter will man unnötige ε-Züge vermeiden. Hierzu faßt man Expandierungs- und einen Leseschritt zusammen, wenn die rechte Seite α der Produktion A → α aus der Expandierung die Gestalt aγ mit a ∈ Σ und γ ∈ (V ∪ Σ) ∗ hat. Also: (i) δ(q 0 , ε, A) = {(q 0 , α) | A → α ist in P und α beginnend mit einer Variablen} (ii) δ(q 0 , a, A) = {(q 0 , γ) | A → aγ ist in P , α ∈ Σ, γ ∈ V ∪ Σ ∗ }. Die Funktionsweise des PDA ist dieselbe wie vorher, also gilt wieder, daß genau die Elemente von L(G) akzeptiert werden. 4.4.2 Definition Greibach-Normalform (Sheila G.) Eine kontextfreie Grammatik G = (V, Σ, S, P ) ist in Greibach-Normalform, falls jede Produktion die Form A → aB 1 . . . B k mit a ∈ Σ, B 1 , . . . , B k ∈ V , k ≥ 0 hat. Fakt: Wenn L = L(G) für eine kontextfreie Grammatik G, dann gibt es eine Grammatik in Greibach-Normalform mit, L(G ′ ) = L(G) − {ε}. G ′ kann in Zeit O(|G| 4 ) aus G konstruiert werden. 4.4.3 Folgerung: Zu jeder kontextfreien Sprache G existiert ein PDA M ohne ε- Übergänge, der L(G) − {ε} akzeptiert. (Der NPDA zur Grammatik G ′ in Greibach- Normalform besitzt keine Übergänge der Form (i).) 4.4.4 Folgerung: Zu jeder kfG L existiert ein PDA M mit nur 1 Zustand, der L akzeptiert. (Der eben konstruierte NPDA hat diese Eigenschaft.) Es folgt der Beweis der anderen Richtung ( ” (b) ⇒ (a)“) des Äquivalenzsatzes. Diese Richtung hat eher theoretische Bedeutung, für die Praxis ist die Konstruktion in diesem Beweis weniger relevant: man muß praktisch nie zu einem gegebenen PDA eine Grammatik konstruieren. Dieser Beweis ist nicht prüfungsrelevant. Es sei ein PDA M = (Q, Σ, Γ, q 0 , #, δ) gegeben. Wir geben eine kontextfreie Grammatik G = (V, Σ, S, P ) an, die L M = L(G) erfüllt. Wegen der besonderen Form der Variablen von G heißt diese Konstruktion auch die ” Tripelkonstruktion“. Wir definieren V := {S} ∪ {[q, A, p] | p, q ∈ Q, A ∈ Γ}. (S ist das Startsymbol von G.) Unsere Absicht ist es, die Produktionen von G so anzulegen, daß für w ∈ Σ ∗ gilt: M kann von Konfiguration (q, w, A) (ein Symbol im Keller) aus startend die Konfiguration (p, ε, ε) erreichen (w gelesen, Keller leer) 117


[q, A, p] ⇔ ∗ ⇒ G w. Dazu legen wir fest, daß P folgende Produktionen enthält: (i) S → [q 0 , Z 0 , p], für p ∈ Q. (ii) [q, A, q m+1 ] → a[q 1 , A 1 , q 2 ][q 2 , A 2 , q 3 ] · · · [q m , A m , q m+1 ], für (q, a, A) ∈ Q×(Σ∪{ε})× Γ, q 1 , . . . , q m+1 ∈ Q, m ≥ 0, wo (q 1 , A 1 · · · A m ) ∈ δ(q, a, A). (Beachte die Spezialfälle m = 0, die zur Produktion [q, A, q 1 ] → a führt, und a = ε.) Es gilt nun, wie oben schon angekündigt: Behauptung: Für p, q ∈ Q, A ∈ Γ, und w ∈ Σ ∗ : [q, A, p] ∗ ⇒ G w genau dann wenn (q, w, A) ⊢ ∗ M (p, ε, ε). Bevor wir diese Behauptung beweisen, folgern wir, daß L(G) = L M ist: w ∈ L M ⇔ ∃p ∈ Q : (q 0 , w, Z 0 ) ⊢ ∗ (p, ε, ε) Beh. ∗ ⇔ ∃p ∈ Q : [q 0 , Z 0 , p] ⇒ G w ⇔ ⇔ S ∗ ⇒ G w w ∈ L(G). Die vorletzte Äquivalenz gilt dabei, weil aus S im ersten Schritt nur Variable [q 0 , Z 0 , p], p ∈ Q, ableitbar sind. Es bleibt die Behauptung zu beweisen. ⇒“: Wir beweisen die Aussage ” [q, A, p] ⇒ ∗ G w impliziert (q, w, A) ⊢ ∗ M (p, ε, ε) durch Induktion über die Tiefe k ≥ 1 eines Ableitungsbaumes für die Ableitung [q, A, p] ⇒ ∗ G w. Ist k = 1, so sieht der Ableitungsbaum für w ∈ Σ ∗ so aus: [q,A,p] w Damit muß [q, A, p] → w eine Regel in P sein; nach der Definition von P ist also |w| ≤ 1 und (p, ε) ∈ δ(q, w, A); daraus folgt aber (q, w, A) ⊢ M (p, ε, ε). 118


Sei nun k > 1. Der Ableitungsbaum für die Ableitung [q, A, p] ⇒ ∗ G w hat folgendes Format: [q,A,p] a [q ,A ,q ] 1 1 2 ... [q m,A m,q m+1] Tiefe 1. Wir 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 (q 1 , A 1 · · · A m ) ∈ δ(q, a, A) 119


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 (q 1 , w ′ , A 1 · · · A m ) in (p, ε, ε) über. Wir teilen diese Berechnung in m Phasen (t 0 , t 1 ], . . . , (t m−1 , t m ] ein, wobei 0 = t 0 < t 1 < · · · < t m die Schritte der Rechnung von M sind, die durch folgende Ereignisse gekennzeichnet sind: t i ist der Schritt von M, nach dem erstmals A i+1 · · · A m die Kellerinschrift ist, 1 ≤ i ≤ m. Offensichtlich dauert jede dieser Phasen < k Schritte, Mit w i , 1 ≤ i ≤ n, bezeichnen wir das Teilwort von w, das während Phase (t i−1 , t i ] von M gelesen wird. Offenbar gilt dann w ′ = w 1 · · · w m . Während Phase i spielt sich also folgender Konfigurationsübergang ab, für gewisse q i ∈ Q, i = 2, . . . , m: (q i , w i · · · w m , A i · · · A m ) ⊢ M · · · ⊢ M (q i+1 , w i+1 · · · w m , A i+1 · · · A m ). Da während dieser Rechnung der Teil A i+1 · · · A m des Kellers nicht berührt, auch nicht gelesen wird, ist auch folgendes eine legale (Teil-)Rechnung des PDA M, mit < k Schritten: Nach Induktionsvoraussetzung folgt Da nach Definition von G auch (q i , w i , A i ) ⊢ M · · · ⊢ M (q i+1 , ε, ε). [q i , A i , q i+1 ] ∗ ⇒ G w i , für 1 ≤ i ≤ m. A ⇒ G a[q 1 , A 1 , q 2 ] · · · [q m , A m , q m+1 ] gilt, haben wir (durch Betrachten des Ableitungsbaums): A ∗ ⇒ G aw 1 · · · w m = w. Damit ist der Beweis der Behauptung, und auch der von Satz 4.4.1, beendet. □ 4.5 Deterministische Kellerautomaten und ihre Sprachen Wir betrachten hier eine Teilklasse der PDA’s, nämlich deterministische Kellerautomaten (DPDA’s). Diese zeichnen sich dadurch aus, daß in jeder Konfiguration höchstens ein nächster Zug möglich ist. Da man auch keine Wahlmöglichkeit zwischen ε-Zug und Lesen eines Symbols vom Eingabeband lassen möchte, verlangt man: (4.1) |δ(q, a, A)| + |δ(q, ε, A)| ≤ 1 für q ∈ Q, a ∈ Σ, A ∈ Γ. Der Berechnungsbaum degeneriert zu einem Weg. Weiterhin muß man (aus technischen Gründen) einen etwas anderen Akzeptierungsmodus wählen. Der DPDA hat eine Menge F ⊆ Q akzeptierender Endzustände, und M akzeptiert w ∈ Σ ∗ , wenn nach dem (deterministischen) Lesen von w ein akzeptierender Zustand erreicht wird. Die formale Definition lautet wie folgt: 120


4.5.1 Definition Ein deterministischer Kellerautomat (DPDA) besteht aus 7 Komponenten: Q, Σ, Γ, q 0 , # sind wie in 4.1.1, F ist Teilmenge von Q, δ : Q × (Σ ∪ {ε} × Γ) → P


gelesenes Symbol q Keller ? # # # akzeptiert ( 1 1# ) ? # # # akzeptiert ( 1 1# ( 1 11# ) ? 1# 1 1# ( 1 11# ( 1 111# ) ? 11# 1 11# ) ? 1# 1 1# ) ? # # # akzeptiert (Wort fertig) 4.5.4 Beispiel In analoger Weise konstruieren wir einen Kellerautomaten für die Sprache {a n b n | n ≥ 1}: δ(q 0 , a, X) = {(q 0 , aX)} a’s lesen, im Keller speichern δ(q 0 , b, a) = {(q 1 , ε)} erstes b lesen δ(q 1 , b, a) = {(q 1 , ε)} weitere b’s lesen δ(q 1 , ε, #) = {(q 2 , ε)} Test Keller leer?“ ” Hier ist Q = {q 0 , q 1 , q 2 }, Γ = {a, #}, F = {q 2 }. Übung: Man überlege, wieso ε nicht akzeptiert wird. Wie sieht ein DPDA für {a n b n | n ≥ 0} aus? 4.5.5 Definition Eine Sprache L heißt deterministisch kontextfrei, wenn L = L M für einen DPDA M. Wir merken an, daß die Klasse der deterministisch kontextfreien Sprachen über ein Maschinenmodell definiert ist. Der zugehörige Grammatiktyp ist die LR(k)-Grammatik, k ≥ 1 (Lookahead: k Symbole). ” LR(k)-Grammatiken“ mit zugehörigen Parsern sind die mächtigsten bekannten Syntaxbeschreibungsverfahren mit ” Syntaxanalyse in Linearzeit“. Näheres zu diesen Grammatiken erfährt man in der Vorlesung ” Übersetzerbau“. 122


4.5.6 Lemma Wenn M ein DPDA ist, dann existiert ein M ′ für dieselbe Sprache derart, daß M ′ jede Eingabe w bis zum letzten Buchstaben liest. Beweisidee: Ein DPDA kann durch Hinzunehmen eines endlichen Schrittzählers im Zustand so modifiziert werden, daß ohne Lesen eines Zeichens: (i) sich wiederholende Konfigurationen (ii) ein unendlich wachsender Keller erkannt wird. Dann wird erzwungen, daß die Resteingabe gelesen wird. □ 4.5.7 Lemma Ist L deterministisch kontextfrei, so auch ¯L. Beweis: Idee: L = L M für einen DPDA, der (nach 4.5.6) alle Eingaben ganz liest. F und Q − F vertauschen (wie bei DFA’s) Problem: M könnte nach dem Lesen von w ∈ Σ ∗ einen Zustand q 1 ∈ F erreichen (also w ∈ L M ), dann aber in ε-Übergängen einen anderen Zustand q 2 /∈ F erreichen. Würde man F und Q − F einfach vertauschen, würde auch der neue Automat w akzeptieren — fälschlicherweise. Lösung: Beobachten, ob bisher während der ε-Übergänge ein F / ¯F -Zustand auftauchte. Verhalten bei w /∈ L M : M: M ′ : a lesen −→ q 1 ∈ ¯F ε → q 2 ∈ ¯F a lesen −→ verw. → verw. → verw. ε → q 3 ∈ ¯F −→ kein ε Übergang möglich ε → akz. Außer gegen Komplement sind deterministische kontextfreie Sprachen gegen fast nichts abgeschlossen. 4.5.8 Behauptung Es gibt kontextfreie Sprachen, die nicht deterministisch kontextfrei sind. Beweis: L = {a i b j c k | i ≠ j ∨ j ≠ k} ist kontextfrei. Wäre L deterministisch kontextfrei, wäre ¯L nach 4.5.7 auch deterministisch kontextfrei, also kontextfrei. ¯L ist aber nicht kontextfrei, sonst wäre ¯L ∩ {a} ∗ {b} ∗ {c} ∗ = {a n b n c n | n ≥ 0} kontextfrei, was nicht stimmt. □ 4.5.9 Behauptung Die deterministisch kontextfreien Sprachen sind nicht gegen ∪ und ∩ abgeschlossen. 123


Beweis: L 1 = {a i b j c k | i ≠ j} ist deterministisch kontextfrei. L 2 = {a i b j c k | j ≠ k} ist deterministisch kontextfrei. aber nicht L 1 ∪ L 2 (siehe oben). L 3 = {a i b j c k | i = j} und L 4 = {a i b j c k | j = k} sind deterministisch kontextfrei. aber L 3 ∩ L 4 /∈ L 2 . 4.5.10 Behauptung Die deterministischen kontextfreien Sprachen sind nicht gegen Konkatenation und Kleene-Abschluß abgeschlossen. (ohne Beweis) 4.5.11 Behauptung Die deterministischen kontextreien Sprachen sind gegen Durchschnitt mit regulären Sprachen abgeschlossen. (L 1 deterministisch kontextfrei, L 2 regulär ⇒ L 1 ∩ L 2 deterministisch kontextfrei). 4.6 Abschlußeigenschaften kontextfreier Sprachen 4.6.1 Satz Die Klasse L 2 ist abgeschlossen unter Vereinigung, Konkatenation und Kleene-Abschluß. Beweis Es sei L 1 = L(G 1 ), L 2 = L(G 2 ) für kontextfreie Grammatiken G 1 = (V 1 , Σ 1 , S 1 , P 1 ) und G 2 = (V 2 , Σ 2 , S 2 , P 2 ). O. B. d. A. können wir annehmen, daß V 1 ∩ V 2 = ∅. Wir erhalten Grammatiken G ′ für L 1 ∪ L 2 und G ′′ für L 1 L 2 folgendermaßen: S sei neue Variable, S ∉ V 1 ∪ V 2 . G ′ := (V 1 ∪ V 2 ∪ {S}, Σ 1 ∪ Σ 2 , S, P 1 ∪ P 2 ∪ {S → S 1 | S 2 }) G ′′ := (V 1 ∪ V 2 ∪ {S}, Σ 1 ∪ Σ 2 , S, P 1 ∪ P 2 ∪ {S → S 1 S 2 }). Aus einer kontextfreien Grammatik G = (V, Σ, S, P ) erhalten wir eine kontextfreie Grammatik G ′′′ für L(G) ∗ wie folgt: S ′ sei neue Variable, S ′ ∉ V . Die Verifikation der Behauptungen G ′′′ := (V ∪ {S ′ }, Σ, S ′ , P ∪ {S ′ → S ′ S | ε}). L(G ′ ) = L 1 ∪ L 2 , L(G ′′ ) = L 1 L 2 , L(G ′′′ ) = L(G) ∗ sei dem Leser überlassen. □ 124


4.6.2 Satz Die Klasse L 2 ist nicht abgeschlossen unter Durchschnitt und Komplementierung, d. h. ∃L 1 , L 2 ∈ L 2 : L 1 ∩ L 2 ∉ L 2 und ∃L ∈ L 2 : ¯L ∉ L 2 . Beweis Durchschnitt“: Betrachte ” L 1 := {a i b i c j | i, j ≥ 1} und L 2 := {a i b j c j | i, j ≥ 1}. Beide Sprachen sind kontextfrei (siehe Übung). (Z.B. ist L 1 = L(G) für die Grammatik G = ({S, A, C}, {a, b, c}, S, P ) wo P aus den Produktionen S → AC, A → aAb | ab, C → cC | c besteht.) Jedoch ist L 1 ∩ L 2 = L ′ = {a m b m c m | m ≥ 1}, eine Sprache, die sich in 3.3.3(a) als nicht kontextfrei herausstellte. ” Komplement“: Indirekt. Wäre L 2 unter Komplement abgeschlossen, so hätten wir mit denselben Sprachen wie eben, daß L ′ = L ′ = L 1 ∩ L 2 = (L 1 ∪ L 2 ) kontextfrei ist (L 1 , L 2 kontextfrei nach Annahme, damit auch L 1 ∪ L 2 nach 4.6.1, damit auch (L 1 ∪ L 2 ) wieder nach Annahme). Das widerspricht aber 3.3.3(a). Alternativ, direkter Beweis: L 3 = {a i b j c k | i ≠ j ∨ j ≠ k} ist kontextfrei (siehe Übung). Daraus folgt mit Satz 4.6.1, daß L 4 = L 3 ∪ (Σ ∗ − L(a ∗ b ∗ c ∗ )) kontextfrei ist, weil L(a ∗ b ∗ c ∗ ) regulär und damit auch Σ ∗ − L(a ∗ b ∗ c ∗ ) regulär ist; aber ¯L 4 = {a n b n c n | n ≥ 0} ist nicht kontextfrei. □ 4.6.3 Korollar Es gibt kontextfreie Sprachen, die nicht deterministisch kontextfrei sind. Beweis Nach 4.5.7 ist die Klasse der deterministisch kontextfreien Sprachen unter Komplementbildung abgeschlossen, nicht jedoch L 2 , nach 4.6.2. Also sind die Klassen verschieden. Jedoch ist jede deterministisch kontextfreie Sprache auch kontextfrei — man kann beweisen, daß PDA’s, die mittels akzeptierendem Zustand akzeptieren, genau dieselben Sprachen akzeptieren wir die von uns gewählte Variante (Akzeptieren mittels leerem Keller). □ Es sei bemerkt, daß die Sprache {ww R | w ∈ {0, 1} ∗ } nicht deterministisch kontextfrei ist. iIntuitiv gesprochen kann ein deterministischer Kellerautomat die Stelle nicht identifizieren, an der umzukehren und mit dem bisher Gelesenen zu vergleichen ist. Der Beweis für diese einleuchtende Tatsache ist allerdings technisch aufwendig. 125


4.6.4 Satz Die Klasse der deterministisch kontextfreien Sprachen ist nicht unter Durchschnittsbildung abgeschlossen. Beweis Wie man durch Konstruktion von DPDA’s direkt nachprüft, sind die Sprachen L 1 = {a i b i c j | i, j ≥ 1} und L 2 = {a i b j c j | i, j ≥ 1} beide deterministisch kontextfrei. Jedoch ist L 1 ∩ L 2 = {a i b i c i | i ≥ 1} nicht einmal kontextfrei, nach 3.3.3(a). □ Eine interessante (und wichtige) Abschlußeigenschaft von L ist schließlich folgendes: 4.6.5 Satz (a) Ist L 1 ∈ L 2 und L 2 ∈ L 3 , so ist L 1 ∩ L 2 ∈ L 2 . (b) Ist L 1 deterministisch kontextfrei und L 2 ∈ L 3 , so ist L 1 ∩ L 2 deterministisch kontextfrei. Beweisidee: (a) L 1 ist kontextfrei, dann folgt aus 4.4.3, daß ein NPDA M 1 ohne ε-Übergänge für L 1 existiert. Außerdem existiert ein NFA M 2 für L 2 . Man kann auf M 1 und M 2 die für NFA’s bekannte Kreuzproduktkonstruktion anwenden, um einen NPDA M 1 × M 2 für L 1 ∩ L 2 zu erhalten: Ebenso wie man zwei DFA’s gleichzeitig auf demselben Eingabewort ablaufen lassen kann (vgl. 1.1.8), kann man auch einen (deterministischen oder nichtdeterministischen) Kellerautomaten (für L 1 ) und einen endlichen Automaten (für L 2 ) gleichzeitig auf demselben Eingabewort ablaufen lassen. Der Beweis für (b) verläuft genauso. □ 4.7 Entscheidbarkeitsfragen 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, daß viele Probleme bezüglich kontextfreier Grammatiken unentscheidbar werden. Wir behandeln hier einige wichtige entscheidbare Fragen. Die Unentscheidbarkeit einiger Probleme für kontextfreie Sprachen wird in der Vorlesung ” Algorithmentheorie“ besprochen. 4.7.1 Satz Die folgenden Aufgaben sind algorithmisch lösbar: 126


Gegeben Frage Methode kontextfreie Grammatik G w ∈ L(G) ? CYK-Algorithmus und w ∈ Σ ∗ L(G) = ∅ ? Satz 4.7.1 ε ∈ L(G) ? Schritt 3 in CNF-Konstruktion |L(G)| < ∞ ? Übung Dieselben Fragen für einen gegebenen Kellerautomaten. Vorschalten: Transformation Kellerautomat → Grammatik Satz 4.4.1 b → a“ ” Dieselben Fragen für einen gegebenen deterministischen Kellerautomaten. DPDA M L M = Σ ∗ ? Bilde M ′ für ¯L M , wende ∅-Test an. 4.7.2 Satz Es gibt effiziente Algorithmen, die folgende Probleme lösen: Zu einer vorgelegten kontextfreien Grammatik G = (V, Σ, S, P ) entscheide ob (a) L(G) = ∅ (b) L(G) < ∞. Beweis (a) Wir benutzen das Konzept der nutzlosen Variablen. Eine Variable A ∈ V heißt nutzlos, wenn A in keiner Ableitung S ∗ ⇒ w, w ∈ Σ ∗ , vorkommt. Die Menge der nützlichen (d. h. nicht nutzlosen) Variablen A ∈ V wird in 2 Phasen konstruiert. (i) V ′ := {A ∈ V | A ⇒ ∗ w für ein w ∈ Σ ∗ }. (V ′ heißt manchmal die Menge der produktiven“ Variablen.) Wir setzen ” Für i ≥ 2 setze: V 0 := ∅; V 1 := {A ∈ V | A → w für ein w ∈ Σ ∗ }. V 1 := {A ∈ V | A → α für ein α ∈ (Σ ∪ V i−1 ) ∗ }. Klar: ∅ ⊆ V 1 ⊆ V 2 ⊆ . . . ⊆ V i ⊆ . . . ⊆ V . Also gibt es ein i 0 mit V i0 = V i0 +1. Man kann recht leicht zeigen, daß V ′ = V i0 ist. (Der exakte Beweis verläuft ähnlich wie bei 3.2.3) Die Konstruktion von V ′ realisiert man praktisch mit dem folgenden Markierungsalgorithmus für die Liste P aller Produktionen: (1) Markiere alle Terminalzeichen in allen Produktionen. (2) Ist A → α eine Produktion, wo alle Zeichen in α markiert sind, so markiere die Variable A (an allen Stellen, wo sie vorkommt). 127


(3) Wiederhole (2), bis (2) nicht mehr anwendbar ist. V ′ besteht aus den markierten Variablen. (ii) Ist S ∉ V ′ sind wir fertig: L(G) = ∅. Sei also S ∈ V ′ . Wir berechnen jetzt V ′′ := {A ∈ V | ∃α, β ∈ (V ′ ∪ Σ) ∗ : S ∗ ⇒ αAβ}. Man überlegt sich dann (unter Benutzung von Ableitungsbäumen), daß V ′′ genau die Menge der nützlichen Variablen ist. Zur Konstruktion von V ′′ beginnen wir mit V 0 := {S} und berechnen induktiv, für i ≥ 1: V i := V i−1 ∪ { B ∈ V ′ | es existiert eine Produktion A → αBβ mit A ∈ V i−1 und α, β ∈ (Σ ∪ V ′ ) ∗ }. Das Verfahren hält, sobald einmal V i = V i−1 ist. Ähnlich wie in 3.2.3 zeigt man, daß die Ausgabe gleich V ′′ ist. Da offenbar L(G) = ∅ genau dann gilt wenn S nutzlos ist, löst der in (i) und (ii) skizzierte Algorithmus das Problem ” Ist ” L(G) = ∅?“. (b) Wir können nach (a) o. B. d. A. annehmen, daß die Grammatik G = (V, Σ, S, P ) in Chomsky-Normalform vorliegt und keine nutzlosen Variablen hat. Wir definieren einen Graphen H = (V, E) durch E := {(A, B) ∈ V × V | ∃C ∈ V : A → BC oder A → CB ist in P } Diesen Graphen überprüfen wir durch einen passenden Graphalgorithmus (Tiefensuche) auf Kreisfreiheit. Wir behaupten: |L(G)| = ∞ ⇔ H besitzt einen gerichteten Kreis. Beweis dazu: “⇒“: Wenn H keinen Kreis besitzt, so 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äßt G nur endlich viele Ableitungsbäume zu. “⇐“: Angenommen, H besitzt einen Kreis A 1 → A 2 → A 3 → · · · → A r → A 1 . Nach Definition von H entspricht dem ein Teil eines Ableitungsbaums, etwa des folgenden Formats: 128


B 1 A 1 A 2 A 3 B 2 A 4 B 3 B 4 A 5 B 5 A r Br A 1 (Die Produktion A i → A i+1 B i bzw. A i → B i A i+1 ist in P , 1 ≤ i ≤ r.) Da A 1 , B 1 , . . . , B r lauter nützliche Variable sind, gibt es Wörter w ′ , w ′′ und w 1 , . . . , w r , und w über Σ, so daß S ∗ ⇒ w ′ A 1 w ′′ B i ∗ ⇒ w i , 1 ≤ i ≤ r, mit |w i | ≥ 1. A 1 ∗ ⇒ w. Es sei nun u die Konkatenation aller w i , wo B i linker Sohn von A i auf dem Pfad ist, und v die Konkatenation aller w i (in umgekehrter Reihenfolge), wo B i rechter Sohn von A i auf dem Pfad ist. Wie beim Beweis des Pumping-Lemmas (3.3.1) sieht man nun, daß alle Wörter w ′ u i wv i w ′′ , i ≥ 0 in L(G) sind. Da r ≥ 1 und w 1 , . . . , w r alle nichtleer sind, gilt auch |u| + |v| ≥ 1, also sind alle diese Wörter verschieden und L(G) ist unendlich. □ Wir geben nun noch einige Aussagen zu unentscheidbaren Problemen im Zusammenhang mit kontextfreien Sprachen an. Für die Beweise sei auf das nächste Semester verwiesen. 4.7.3 Satz (Schnittproblem, Äquivalenzproblem für L 2 ) Folgende Probleme sind nicht entscheidbar: Gegeben seien zwei kontextfreie Grammatiken G 1 und G 2 . (a) Ist L(G 1 ) ∩ L(G 2 ) = ∅? (b) Ist L(G 1 ) = L(G 2 )? 129


4.7.4 Satz 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? 4.7.5 Satz (Schnittproblem, Äquivalenzproblem für DPDA) Folgende Probleme sind nicht entscheidbar: Gegeben seien zwei DPDA’s M 1 und M 2 . (a) Ist L M1 ∩ L M2 = ∅? (b) Ist L M1 = L M2 ? 130


Anhang A b-äre und b-adische Zahldarstellung 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. A.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 die Binärdarstellung von Zahlen in Bytes oder Maschinenwörter zerlegt denkt, sind auch Darstellungen zur Basis 2 8 = 256, 2 16 = 65536 oder 2 32 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 ∈ IN, 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 muß man andere Konventionen benutzen. Am einfachsten ist es, die Ziffern dezimal zu notieren und die Wörter als k-Tupel mit Klammern und Kommas. (Z. B. hat die Zahl 300670126 zur Basis b = 100 die Darstellung (3,0,67,1,26). Alternativ könnte man die Zifferndarstellungen in Begrenzer einschließen und etwa schreiben.) Definition. Für b ≥ 2 und a k−1 · · · a 1 a 0 ∈ Σ + b = {0, 1, . . . , b − 1}+ sei 131


(a k−1 · · · a 1 a 0 ) b := ∑ a i b i die durch a k−1 · · · a 1 a 0 dargestellte natürliche Zahl. 0≤i


Definition. Wenn a k−1 · · · a 1 a 0 ∈ {0, 1, . . . , b − 1} + mit k = 1 (nur eine Ziffer) oder a k−1 ≠ 0 (keine führende Null), und n = (a k−1 · · · a 1 a 0 ) b , so heißt a k−1 · · · a 1 a 0 eine b-äre Darstellung von n. Es wäre nun denkbar, daß manche Zahlen keine b-äre Darstellung besitzen, andere u. U. mehrere. Daß dies nicht so ist, macht das Konzept der b-ären Darstellung erst praktisch verwendbar. Satz 1. Sei b ≥ 2. Dann gibt es für jede Zahl n ∈ IN 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 starke Induktion (Wertverlaufsinduktion) nach n. — Sei also n ∈ IN. 1. Fall: 0 ≤ n < b. Dann ist a 0 = n eine b-äre Darstellung von n, mit k = 1. Ist c l−1 · · · c 1 c 0 eine beliebige b-äre Darstellung von n, so kann nicht l ≥ 2 sein (sonst wäre n ≥ c l−1 b l−1 ≥ b l−1 ≥ b, ein Widerspruch). Also ist l = 1, und es folgt c 0 = n = a 0 . 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 ∈ IN 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, daß q eine eindeutig bestimmte b-äre Darstellung c l−1 · · · c 1 c 0 besitzt. Weil q ≥ 1 ist, gilt also q = ∑ c i b i , mit c l−1 ≠ 0. 0≤i


i:=0; q:=n; repeat Teile ganzzahlig q durch b: r:= Rest und q:= Quotient ; a i := r ; i := i+1 until (q = 0) Den Inhalt der Variablen i am Ende der Berechnung nennen wir k. Die Ausgabe ist a k−1 · · · a 1 a 0 als b-äre Darstellung von n. 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 1 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: Korollar. Die Abbildung ist injektiv. Ihr Bild ist b-är : IN ∋ n ↦→ a k−1 · · · a 1 a 0 ∈ {0, 1, . . . , b − 1} + , wo a k−1 · · · a 1 a 0 die b-äre Darstellung von n ist, b-är(IN) = {0} ∪ {1, 2, . . . , b − 1}{0, 1, . . . , b − 1} ∗ . 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. Übungsaufgaben. Aufgabe 1. (a) Man beschreibe, wie man aus der b-ären Darstellung a k−1 · · · a 1 a 0 von n und der b-ären Darstellung c l−1 · · · c 1 c 0 von m die b-äre Darstellung von n+m berechnen kann. (Hinweis: Schulmethode für die Addition.) (b) Kann die in (a) angegebene Methode von einem Mealy-Automaten ausgeführt werden, wenn die Eingabeziffern in der Reihenfolge a 0 , c 0 , a 1 , c 1 , . . . , a k−1 , c k−1 , 0, c k , . . . , 0, c l−1 eingegeben werden (für l ≥ k)? (c) Wie hängen die b-ären Darstellungen von n und n + 1 zusammen? [Antworten: (a) ist nur Fingerübung im Formulieren von Verfahren. (b) Ja, wie man aus (a) ablesen kann. (c) Aus dem Additionsverfahren aus (a) sieht man: Es sei a k−1 · · · a 1 a 0 die b-äre Darstellung von n. 134


1. Fall: a k−1 = · · · = a 0 = b − 1. Dann ist n = b k − 1, also n + 1 = b k , also hat n + 1 die b-äre Darstellung d k d k−1 · · · d 1 d 0 mit d k = 1 und d k−1 = · · · = d 0 = 0. 2. Fall: Es existiert ein j, 0 ≤ j < k, mit a j < b − 1 und a j−1 = · · · = a 0 = b − 1. Dann hat n + 1 die b-äre Darstellung a k−1 · · · a j+1 d j d l−1 · · · d 1 d 0 , wo d j = a j + 1 und d j−1 = · · · = d 0 = 0. Klar: Ein Mealy-Automat kann diese Umrechnung durchführen. Aufgabe 2. Sei s ≥ 2. Man beschreibe einen Mealy-Automaten M s , der aus der b-ären Darstellung a k−1 · · · a 1 a 0 von n (Eingabereihenfolge a 0 , a 1 , . . . , a k−1 ) die b-äre Darstellung von s · n berechnet. Aufgabe 3. (Anzahl der Ziffern in der b-ären Darstellung) Man beweise: Für b ≥ 2 und n ≥ 1 gilt: |b-är(n)| = 1 + ⌊log b (n)⌋ = ⌈log b (n + 1)⌉. [Antwort: Es sei a k−1 · · · a 1 a 0 die b-äre Darstellung von n. Man sieht sofort: b k−1 ≤ n ≤ ∑ (b − 1)b i = b k − 1. 0≤i b ≥ 2. Welche Beziehung muß zwischen b und b ′ gelten, damit die Umrechnung von der b-ären Darstellung in die (b ′ )-äre Darstellung (bzw. umgekehrt) von einem Mealy-Automaten durchgeführt werden kann? [Vermutete Antwort: b ′ muß eine Potenz von b sein. Dies ist auf jeden Fall hinreichend. Die schwierige Richtung ist, zu beweisen, daß andernfalls ein Mealy-Automat die Umformung nicht durchführen kann. Um sich zu orientieren, sollte man zunächst die konkreten Zahlen b = 2 und b ′ = 10 betrachten und beweisen, daß ein Mealy-Automat weder die Dezimaldarstellung in die Binärdarstellung umrechnen kann noch umgekehrt.] A.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 IN und Σ ∗ , für jedes endliche Alphabet Σ. Wir bemerken zuerst, daß wir uns ein endliches Alphabet Σ mit |Σ| = b ≥ 1 immer als die Menge ∆ b := {1, 2, . . . , b} ⊆ IN vorstellen können. Wir werden im folgenden auch 135


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). Definition. Für b ≥ 1, k ≥ 0 und a k−1 · · · a 1 a 0 ∈ ∆ ∗ b = {1, 2, 3, . . . , b}∗ sei [a k−1 · · · a 1 a 0 ] b := ∑ die durch a k−1 · · · a 1 a 0 dargestellte natürliche Zahl. 0≤i


n b = 10 b = 5 b = 4 b = 3 b = 2 b = 1 0 ε ε ε ε ε ε 1 1 1 1 1 1 1 2 2 2 2 2 2 11 3 3 3 3 3 11 111 4 4 4 4 11 12 1111 5 5 5 11 12 21 11111 6 6 11 12 13 22 111111 7 7 12 13 21 111 1111111 8 8 13 14 22 112 11111111 9 9 14 21 23 121 111111111 10 A 15 22 31 122 1111111111 11 11 21 23 32 211 1 11 12 12 22 24 33 212 1 12 13 13 23 31 111 221 1 13 14 14 24 32 112 222 1 14 15 15 25 33 113 1111 1 15 16 16 31 34 121 1112 1 16 17 17 32 41 122 1121 1 17 18 18 33 42 123 1122 1 18 19 19 34 43 131 1211 1 19 20 1A 35 44 132 1212 1 20 21 21 41 111 133 1221 1 21 126 126 451 1332 11123 22222 1 126 127 127 452 1333 11131 111111 1 127 200 19A 125 2414 13332 2112112 1 200 1000 99A 13345 44214 323231 222212112 1 1000 Man versuche, die Gesetzmäßigkeiten zu entdecken, die das Weiterzählen von n auf n+1 in diesen Darstellungen determinieren! Zudem beobachte man, daß allem Anschein nach die Wörter in ∆ ∗ b in der kanonischen Reihenfolge“ aufgezä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. Satz 2. Sei b ≥ 1. Dann gibt es für jede Zahl n ∈ IN genau eine b-adische Darstellung. Beweis. Wir bezeichnen die Aussage ” n besitzt genau eine b-adische Darstellung“ mit E(n) und zeigen ∀n : E(n) durch starke Induktion (Wertverlaufsinduktion) nach n. — Sei also n ∈ IN. 1. Fall: n = 0. Dann ist ε eine b-adische Darstellung von n, mit k = 0. Kein Wort c l−1 · · · c 1 c 0 ∈ ∆ ∗ b mit l ≥ 1 kann b-adische Darstellung von 0 sein, weil ∑ 0≤i 0 ist. 2. Fall: n ≥ 1. 137


Dann können wir durch leichte Modifikation der ganzzahligen Division mit Rest schreiben n = q · b + r für ein q ∈ IN und ein r mit 1 ≤ r ≤ b, für eindeutig bestimmte q ∈ IN und 1 ≤ r ≤ b. (Wenn die gewöhnliche ganzzahlige Division n = q ′ · b + r ′ für q ′ ∈ IN 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, daß q = ⌊(n − 1)/b⌋ < n und r = n − qb gilt. Wir können also die Induktionsvoraussetzung E(q) anwenden. Diese besagt, daß q eine eindeutig bestimmte b-adische Darstellung c l−1 · · · c 1 c 0 ∈ ∆ ∗ b besitzt: q = ∑ 0≤i


Korollar. Für jedes b ≥ 1 ist die Abbildung b-adic : IN ∋ n ↦→ a k−1 · · · a 1 a 0 ∈ {1, 2, . . . , b} ∗ , wo a k−1 · · · a 1 a 0 die b-adische Darstellung von n ist, eine Bijektion. Ihre Umkehrung ist die Abbildung [ · ] b . Übungsaufgaben. Aufgabe 1. Man beschreibe, wie man aus der b-adischen Darstellung a k−1 · · · a 1 a 0 einer Zahl n und der b-adischen Darstellung c l−1 · · · c 1 c 0 einer Zahl m die b-adische Darstellung von m + n berechnen kann. (Hinweis: Man modifiziere die Schulmethode für die b-äre Addition.) Aufgabe 2. Es sei b ≥ 2. Man beschreibe, wie man aus der b-ären Darstellung a k−1 · · · a 1 a 0 ∈ {0, 1, . . . , b − 1} + einer Zahl n die b-adische Darstellung c l−1 · · · c 1 c 0 ∈ {1, 2, · · · , b} ∗ derselben Zahl berechnen kann und umgekehrt. Kann ein Mealy-Automat, der die Ziffern in der Reihenfolge a 0 , a 1 , . . . , a k−1 liest, diese Transformation durchführen? [Antwort: Es sei a k−1 · · · a 1 a 0 die b-äre Darstellung einer Zahl n. 1. Fall: k = 1 und a 0 = 0. Dann ist die Ausgabe ε. 2. Fall: k = 1 und a 0 > 0. Dann ist die Ausgabe c 0 = a 0 . 3. Fall: k ≥ 2 und a k−1 = 1. Dann addiere man mit der Methode aus Aufgabe 1 die Darstellungen a k−2 · · · a 1 a 0 und (b − 1)(b − 1) · · · (b − 1)b (k − 1 Ziffern). 3. Fall: k ≥ 2 und a k−1 > 1. Dann addiere man mit der Methode aus Aufgabe 1 die Darstellungen (a k−1 − 1)a k−2 · · · a 1 a 0 und (b − 1)(b − 1) · · · (b − 1)b (k − 1 Ziffern). Man kann sich überlegen daß ein Mealy-Automat diese Aufgabe ausführen kann, aber nur, wenn man die Ausgabe um ein Zeichen verzögert und nach a 0 , a 1 , . . . , a k−1 ein zusätzliches Ende-Zeichen eingegeben wird.] Aufgabe 3. Es sei b ≥ 1. Wir definieren A k := 1+b+b 2 +· · ·+b k−1 . (Für b ≥ 2 ist A k = (b k −1)/(b−1); für b = 1 ist A k = k.) Man zeige: (a) Die b-adische Darstellung von n hat genau k Ziffern ⇔ A k ≤ n < A k+1 , für alle k ∈ IN. (b) Wenn n bzw. m die b-adische Darstellung a k−1 · · · a 1 a 0 bzw. c k−1 · · · c 1 c 0 hat, dann gilt: n ≤ m ⇔ a k−1 · · · a 1 a 0 ≤ lex c k−1 · · · c 1 c 0 . (Dabei ist die lexikographische Anordnung ≤ lex auf Wörtern der Länge k wie gewöhnlich definiert.) (c) Man folgere aus (a) und (b): In der Folge (b-adic(n)) n∈IN ) finden sich die Wörter von ∆ ∗ b in kanonischer Reihenfolge. (d) Man folgere aus (a): Für b ≥ 2 und n ≥ 0 gilt: |b-adic(n)| = ⌊log b (n(b − 1) + 1)⌋. □ 139


Anhang B Induktive Definitionen Wir diskutieren in diesem Anhang eine für alle Bereiche der Informatik wichtige Methode für die Konstruktion von Objekten und Strukturen. Diese Methode kennen Sie zumindest implizit aus anderen Grundvorlesungen ( ” Algorithmen und Datenstrukturen“, ” Programmierparadigmen“); in unserer Vorlesung spielt sie eine wichtige Rolle; auch im Hauptstudium wird sie gebraucht. Die rein mathematischen Überlegungen 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 Anlaß zum Nachdenken nutzen. Die Beispiele sollte man auf jeden Fall durcharbeiten. Wir beginnen mit einem ausführlichen Beispiel, das an Konzepte aus der Vorlesung ” Logik und Zahlen“ anknüpft. Aussagenlogische Formeln sind Gebilde wie (A ∨ B) (A → (B ∨ (¬C))) ((¬A) → (A → B)) ((A ∧ B) ↔ (¬((¬A) ∨ (¬B)))) Dabei stehen die Zeichen A, B, C für (nicht weiter spezifizierte) Aussagen; die Zeichen ¬ ( ” nicht“), ∨ ” oder“, ∧ ” und“, → ( ” wenn . . . dann . . .“), ↔ ” genau dann wenn“ sind ” aussagenlogische Verknüpfungen“. Wir wollen zunächst genau definieren, was aussagenlogische Formeln sind (und was nicht). Damit wir immer genügend Aussagezeichen ( ” Aussagevariable“) zur Verfügung haben, wählen wir (etwas willkürlich) einen unendlichen Vorrat: A = {A i | i ∈ IN} ist die Menge der aussagenlogischen Variablen. (Mitunter benutzt man auch die Variablenmenge {x i | i ∈ IN}.) 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“.) B.1 Definition (Aussagenlogische Formel – alF) (i) Jede Variable A i , i ∈ IN, ist eine aussagenlogische Formel. 140


(ii) (α) Wenn φ eine alF ist, dann auch (¬φ). (β) Wenn φ und ψ alF sind, dann auch folgendes: (φ ∧ ψ), (φ ∨ ψ), (φ → ψ), (φ ↔ ψ). (iii) Nur die von (i) und (ii) erfaßten Gegenstände sind aussagenlogische Formeln. Durch Anwenden der Regeln erhalten wir, daß die folgenden Gebilde Formeln sind: usw. 1. A 0 , A 1 , A 2 , A 3 , A 10 , A 17 , A 1001 , . . . ; 2. (¬A 0 ), (¬A 1 ), (¬A 17 ), . . . (wegen 1. und (ii)(α)); 3. (A 0 ∨ (¬A 0 )), (A 0 → (¬A 3 )), ((¬A 0 ) ↔ A 3 ), (A 0 ∧ A 1 ), . . . (wegen 1., 2., und (ii)(β)); 4. (¬(A 0 → (¬A 3 ))), (¬(A 0 ∧ A 1 )), ((A 0 ∨ (¬A 0 )) ∧ (A 0 → (¬A 3 ))), . . . (wegen 1., 2., 3. und (ii)(β)); 5. ((¬(A 0 → (¬A 3 ))) ∧ (¬(A 0 ∧ A 1 ))), . . . (wegen 4. und (ii)(β)) Keine Formeln sind hingegen A 0 A 0 , (A 0 ← A 0 ), (¬¬A 0 ), (A 0 → A 0 A 1 ), (A 0 ∧ A 1 ∧ A 2 ), . . . Um letzteres zu begründen, müßte man (iii) in geeigneter Weise einsetzen. Intuitiv ist das wohl klar, eine formal einwandfreie Begründung liegt zunächst nicht auf der Hand. Wie schon erwähnt, ist die Haupteigenschaft von aussagenlogischen Formeln, daß man für die Variablen Wahrheitswerte einsetzen kann ( ” 0“: ” false“ und ” 1“: ” true“) und daß dann damit ganzen Formeln Wahrheitswerte zugordnet werden. Hierfür benutzt man das Konzept der ” Belegung“. B.2 Definition Eine Belegung b ist eine Funktion b : A → {0, 1}. (Für jedes A i ∈ A ist b(A i ) ein Wert ” 0“ oder ” 1“.) Wenn eine Formel φ und eine Belegung b vorliegt, so erhält auch φ einen ” Wahrheitswert“ val b (φ). Ist beispielsweise b(A 0 ) = 0 und b(A 1 ) = 1, wird man (¬A 0 ) den Wert 1 und (A 0 ∨ (¬A 1 )) den Wert 0 geben. Das Zeichen ” ↔“ wird als “äquivalent“ interpretiert, also werden bei dieser Belegung b die Formeln (A 0 ↔ (¬A 1 )) und ((¬A 0 ) ↔ A 1 ) den Wert 1 erhalten, die Formel (A 0 ↔ A 1 ) hingegen den Wert 0. Allgemein definieren wir das Konzept Wert der alF φ unter der Belegung b durch ” Rekursion über die Definition von φ“: 141


B.3 Definition Für beliebiges b : A → {0, 1} und alF φ definieren wir val b (φ) wie folgt: (i) val b (A i ) = b(A i ), für i ∈ IN; (ii) (α) Ist φ = (¬ψ), so ist { 1 falls valb (ψ) = 0 val b (φ) = 1 − val b (ψ) = 0 falls val b (ψ) = 1 (Man sieht: hier wird die Negation“ modelliert.) ” (β) Ist φ = (ψ ∧ ϑ), so ist { 1 falls valb (ψ) = val val b (φ) = val b (ψ) · val b (ϑ) = b (ϑ) = 1 0 sonst. (Hier wird die Idee modelliert, daß φ wahr ist, wenn ψ wahr ist und ϑ wahr ist.) (γ) Ist φ = (ψ ∨ ϑ), so ist { 0 falls valb (ψ) = val val b (φ) = max{val b (ψ), val b (ϑ)} = b (ϑ) = 0 1 sonst. (δ) Ist φ = (ψ → ϑ), so ist { val b (φ) = max{1 − val b (ψ), val b (ϑ)} = 1 falls valb (ψ) = 0 oder val b (ϑ) = 1 (Dies entspricht der klassischen 0 sonst. Interpretation des Implikationspfeils: ψ → ϑ ist falsch, genau dann wenn ψ wahr und ϑ falsch ist.) (ε) Ist φ = (ψ{ ↔ ϑ), so ist 1 falls valb (ψ) = val val b (φ) = b (ϑ) 0 falls val b (ψ) ≠ val b (ϑ) Beispiele: Die Belegung b sei wie folgt gewählt: b(A i ) = 1, falls i gerade und b(A i ) = 0, falls i ungerade. Dann gilt: val b ( (A0 ∨ A 1 ) ) = max{b(A 0 ), b(A 1 )} = 1 val b ( ((A1 ∨ A 1 ) ∨ A 3 ) ) = 0 val b ( (¬A1 ) ) = 1 val b ( (A0 ↔ A 2 ) ∨ (A 1 ↔ A 4 ) ) = 1, weil val b (A 0 ) = val b (A 2 ). 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) der Wert val b (φ) zugordnet wird. Beispiel: 142


b(A 0 ) b(A 1 ) b(A 2 ) val b ((A 0 ∧ A 1 )) val b ((A 1 ∨ A 2 )) val b (((A 0 ∧ A 1 ) ↔ (A 1 ∨ A 2 ))) 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 1 0 1 0 1 0 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. Wenn man ein wenig Logik kennt, weiß man, daß die Zeichen ” →“ und ” ↔“ eigentlich nicht benötigt werden, ja daß man sogar mit den beiden Zeichen ∧ und ¬ auskommt und dennoch ” dieselben Funktionen“ b ↦→ val b (φ) beschreiben kann. Dies kann man wie folgt präzisieren. Wir beginnen mit einer weiteren induktiven Definition. B.4 Definition Die Menge der {∧, ¬}-Formeln ist wie folgt definiert: (i) Für jedes i ∈ IN ist A i eine {∧, ¬}-Formel. (ii) (α) Ist φ eine {∧, ¬}-Formel, dann auch (¬φ). (β) Sind φ und ψ {∧, ¬}-Formeln, dann auch (φ ∧ ψ). (iii) Nur was von (i) und (ii) erfaßt ist, ist {∧, ¬}-Formel. Beispiele: Die Ausdrücke A 0 , (¬A 0 ), (¬(¬A 1 )), ((¬A 1 ) ∧ A 3 ), (¬((¬A 1 ) ∧ (¬A 2 ))), usw. sind {∧, ¬}-Formeln, nicht aber (A 1 → (¬A 2 )) und (A 0 ∨ A 1 ). Die Beschränkung der aussagenlogischen Verknüpfungen beschränkt nicht die Ausdruckskraft der Formelmenge: B.5 Satz Für jede alF φ gilt folgendes: E(φ): Es gibt eine {∧, ¬}-Formel φ ′ derart, daß für jede Belegung b gilt: val b (φ) = val b (φ ′ ). (Man sagt: φ ′ ist ” äquivalent“ zu φ.) Beispiel: Zu φ = (A 0 ↔ (¬A 2 )) ist die Formel φ ′ = (¬(A 0 ∧ A 2 )) ∧ (¬((¬A 0 ) ∧ (¬A 2 ))) äquivalent, wie man durch Aufstellen der Wahrheitstafel verifiziert: b(A 0 ) b(A 2 ) val b (φ) val b (¬(A 0 ∧ A 2 )) val b (¬((¬A 0 ) ∧ (¬A 2 ))) val b (φ ′ ) 0 0 0 1 0 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1 0 0 1 0 143


Aus der Definition von {∧, ¬}-Formeln folgt, daß jede {∧, ¬}-Formel φ ′ auch eine alF ist, daß also val b (φ ′ ) definiert ist. Der Satz wird mit einer Technik bewiesen, die für mittels einer induktiven Definition konstruierte Mengen typisch ist. Beweis Durch Induktion über den Aufbau von φ“: ” (i) Induktionsanfang: Wenn φ = A i für ein i ∈ IN, wählen wir φ ′ natürlich val b (φ) = b(A i ) = val b (φ ′ ), für alle Belegungen b. = φ. Dann ist (ii) Induktionsschritt (α) Wenn φ = (¬ψ) ist, dann gibt es nach Induktionsvoraussetzung eine {∧, ¬}- Formel, ψ ′ mit val b (ψ) = val b (ψ ′ ), für alle Belegungen b. Wir wählen φ ′ = (¬ψ ′ ). Offenbar ist φ ′ {∧, ¬}-Formel und val b (φ ′ ) = 1 − val b (ψ ′ ) = 1 − val b (ψ) = val b (φ) für alle Belegungen b. (β) Wenn φ = (ψ ∧ ϑ) oder φ = (ψ ∨ ϑ) oder φ = (ψ → ϑ) oder φ = (ψ ↔ ϑ) ist, dann gibt es nach Induktionsvoraussetzung {∧, ¬}-Formeln ψ ′ und ϑ ′ mit val b (ψ) = val b (ψ ′ ) und val b (ϑ) = val b (ϑ ′ ) für alle Belegungen b. Wir wählen φ ′ wie folgt: Falls φ = (ψ ∧ ϑ) : φ ′ = (ψ ′ ∧ ϑ ′ ) Falls φ = (ψ ∨ ϑ) : φ ′ = (¬((¬ψ ′ ) ∧ (¬ϑ ′ ))) Falls φ = (ψ → ϑ) : φ ′ = (¬(ψ ′ ∧ (¬ϑ ′ ))) Falls φ = (ψ ↔ ϑ) : φ ′ = ((¬(ψ ′ ∧ (¬ϑ ′ ))) ∧ (¬(ϑ ′ ∧ (¬ψ ′ )))) . Weil für beliebige Wahrheitswerte u[= val b (ψ) = val b (ψ ′ )] und v[= val b (ϑ) = val b (ϑ ′ )] gilt: u · v = u · v max{u, v} = 1 − (1 − u) · (1 − v) max{(1 − u), v} = 1 − (u · (1 − v)) (1 − u · v) + (1 − (1 − u) · (1 − v)) = (1 − u · (1 − v)) · (1 − v · (1 − u)) folgt in allen vier Fällen, daß val b (φ ′ ) = val b (φ) für alle Belegungen b ist. □ Diese allgemeine Konstruktion liefert für die Beispielformel φ = (A 0 ↔ (¬A 2 )) die {∧, ¬}- Formel φ ′ = ((¬(A 0 ∧ (¬(¬A 2 )))) ∧ (¬((¬A 2 ) ∧ (¬A 0 )))). In dem eben vorgestellten Beispiel finden sich die folgenden Muster, die bei der Verwendung von induktiven Definitionen (bzw. rekursiven Konstruktionen) immer wieder auftauchen. Für die Definition der Formelmenge selbst: (i) Basisobjekte; (ii) Vorschriften, wie aus gegebenen Objekten neue, zusammengesetzte zu gewinnen sind; 144


(iii) die Einschränkung: nur die durch (i) und (ii) gelieferten Objekte sind gemeint. Weiterhin haben wir am Beispiel die Technik ” rekursive Definition von Funktionen“ (wie val b ) kennengelernt sowie ” Induktion über den Aufbau“ von alFn. Dieselben Techniken tauchen in einem weiteren Beispiel (aus dem Gebiet der Datenstrukturen) wieder auf. B.6 Beispiel In einem Buch über Datenstrukturen und Algorithmen findet sich die folgende Definition: (i) Der leere Baum Λ ist ein binärer Baum. (ii) Wenn x ein Knoten ist und T 1 , T 2 binäre Bäume sind, dann ist auch (T 1 , x, T 2 ) ein binärer Baum. (iii) (nicht explizit angegeben, aber gemeint:) nur von (i) und (ii) erfaßte Objekte gelten als binärer Baum. Interpretiert wird dies folgendermaßen: (i) Der leere Baum (kein Knoten) ist Ausgangspunkt. (ii) Ist x ein Knoten und sind T 1 , T 2 binäre Bäume, so bildet man T als binären Baum mit Wurzel x, linkem Unterbaum T 1 und rechtem Unterbaum T 2 . Schematisch: x T 1 T 2 Nach dieser Definition sind ” offensichtlich“ folgendes binäre Bäume, wenn man einmal annimmt, daß x, y, z ” Knoten“ sind: Λ, (Λ, x, Λ), (((Λ, z, Λ), x, Λ), y, Λ), ((Λ, x, Λ), y, ((Λ, z, Λ), x, Λ)). Folgendes sind ” offensichtlich“ keine binären Bäume: (Λ, Λ, Λ), (x, y, z), (Λ, x, Λ, x, Λ). Diese Definition mag genügen, um ein ungefähres Gefühl dafür zu vermitteln, was ein binärer Baum sein könnte. Die Definition genügt eigentlich nicht zur Rechtfertigung von induktiven Definitionen und Induktionsbeweisen ” über die Definition von Bäumen“, wie 145


die folgenden, und gibt keinen klaren Anhaltspunkt dafür, wie man feststellen kann, daß etwas kein Binärbaum ist. Wenn man die oben aufgeführten Binärbäume graphisch darstellt, ergeben sich die folgenden Bilder: x y y x x x z z Im letzten Binärbaum kommt der Knoten x doppelt vor. Ist das erlaubt? (Die o.a. Definition erlaubt es; intuitiv hat man Zweifel.) Man kann auch fragen, ob für einen ” Knoten“ x und einen Binärbaum T 1 das Gebilde T = (T 1 , x, T 1 ) ein Binärbaum ist. Noch weiter überlegt: Was für Gegenstände sind eigentlich als ” Knoten“ zugelassen? Wir lernen: Bei der induktiven Definition ist Sorgfalt angebracht, damit man auch genau den intendierten Begriff definiert. – Bevor wir Korrekturen vornehmen, geben wir noch Beispiele für rekursive Definitionen und Induktionsbeweise für Bäume an. B.7 Definition Durch ” Rekursion über Binärbäume“ definieren wir: (i) Die Tiefe d(Λ) des leeren Baumes ist d(Λ) := −1. (ii) Ist T = (T 1 , x, T 2 ) ein Binärbaum, so ist seine Tiefe d(T ) := 1 + max{d(T 1 ), d(T 2 )}. Beispiele: 146


x x d(T ) = −1 z y u z d(T ) = 1 w d(T ) = 1 + max{2, −1} = 3 Die folgende Behauptung liegt aufgrund dieser Abbildung nahe. B.8 Behauptung Hat ein Binärbaum n (innere) Knoten, so enthält er n + 1 leere Bäume Λ. Beweis durch ” Induktion über Binärbäume“: (i) Der leere Baum hat 0 Knoten und enthält 1 leeren Baum. (ii) Ist T = (T 1 , x, T 2 ), n 1 bzw. n 2 die Zahl der Knoten in T 1 bzw. T 2 , so hat T n = 1 + n 1 + n 2 Knoten und (nach Induktionsvoraussetzung) (n 1 + 1) + (n 2 + 1) = n + 1 leere Bäume. □ (Bemerkung: In (ii) haben wir implizit verwendet, daß die Knoten in T 1 und T 2 und {x} alle verschieden sind. Dies kommt in der Definition B.7 gar nicht vor. Dies wird weiter unten verbessert.) Dem kritischen Leser oder der kritischen Leserin stellen sich hier vielleicht schon weitere Fragen: Definiert die rekursive Definition etwas Sinnvolles? Haben wir in dem eben gegebenen Beweis wirklich etwas bewiesen? Wie kann man etwas ” Induktionsbeweis nennen“, wenn darin gar keine natürlichen Zahlen vorkommen? Wie kann man sicher sein, daß die betrachteten ” Bäume“ keine Kreise haben oder daß nicht T Teilbaum von sich selbst sein kann? Wir kommen zum letzten Beispiel. 147


B.9 Beispiel (Korrekte Klammerausdrücke) Wir definieren die Menge der korrekten Klammerausdrücke (k.K.A., eine Sprache über Σ = {(, )}) wie folgt: (i) ε ist ein k.K.A. (ii) Falls w 1 , w 2 k.K.A. sind, dann ist auch (w 1 )w 2 ein k.K.A. (iii) Sonst ist nichts ein korrekter K.A. Folgende Wörter sind k.K.A.: (), ()(()), ((())), ()()(()()) folgende nicht: ), )(), (())), (())(. Wir wollen nun einen formalen Rahmen für die obigen Konstruktionen diskutieren, der insbesondere die benutzten rekursiven Definitionen und induktiven Beweise rechtfertigt. Was brauchen wir für eine induktive Definition einer Menge M von Objekten wie binäre Bäume oder Klammerausdrücke.? (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 Ausschlußregel: Nur die durch (i) und (ii) erzwungenen Objekte gehören zu M. Aus technischen Gründen ist es nützlich, sich eine ” universelle“ Grundmenge A vorzugeben, 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 ((a 1 , . . . , a l ), b) , l ≥ 1 mit a 1 , . . . , a l ∈ A gegeben. (Interpretation: ” aus a 1 , . . . , a l kann man b bauen“.) In mathematischer Notation faßt man die Tupel, die Regeln entsprechen, als Relation R ⊆ Seq + (A) × A auf, wo Seq + (A) = {(a 1 , . . . , a l ) | l ≥ 1, a 1 , . . . , a l endlichen Folgen in A ist. ∈ A} die Menge der nichtleeren Die in den obigen Beispielen verwendeten induktiven Definitionen haben nun das folgende Muster: 148


(i) B ⊆ M. (ii) Wenn a 1 , . . . , a l ∈ M und ((a 1 , . . . , a l ), b) ∈ R, dann ist auch b ∈ M. (iii) Nur die von (i) und (ii) erfaßten Objekte sind in M. Wie sollen wir uns M vorstellen? Am einfachsten ist es, sich die Objekte in M ” nach und nach“ gemäß den Regeln (i) und (ii) erzeugt vorzustellen. Dazu definieren wir: IR 0 (B) := B; für i ≥ 1: I i R (B) := Ii−1 R (B) ∪ {b ∈ A | ∃a 1, . . . , a l ∈ I i−1 R (B) mit ((a 1, . . . , a l ), b) ∈ R}. Dieser Definition entspricht ein Konstruktionsprozeß für M: Man starte mit den Elementen von B. In Runde i füge man zu den bisher erzeugten Elementen von M die hinzu, die sich durch einmalige Anwendung einer Regel aus R gewinnen lassen. Als einfaches Beispiel betrachten wir die Klammersprache aus Beispiel B.9. Als A wählen wir {(, )} ∗ . Die Menge der Basisobjekte gemäß Regel (i) ist B := {ε} ⊆ A. Die Regeln (ii) zur Erzeugung neuer Klammerausdrücke sind durch die Relation R = {((w 1 , w 2 ), (w 1 )w 2 ) | w 1 , w 2 ∈ A} gegeben. (Man sieht an diesem Beispiel, daß R auch völlig unsinnige konkrete Regeln enthält, die beim Aufbau von M nicht benutzt werden. Allerdings wird R meist durch ein Schema“ (oder mehrere) beschrieben sein.) ” Dann ergibt sich: IR(B) 0 = B = {ε} IR(B) 1 = {ε} ∪ {()}, weil (ε)ε = () IR(B) 2 = {ε, ()} ∪ {(), (()), ()(), (())()} IR(B) 3 = IR(B) 2 ∪ {((()))()(), ((()))(()), . . . } (Die Menge IR 3 (B) hat 26 Elemente.) usw. Es ist intuitiv einleuchtend, daß wegen der Regeln (i) und (ii) alle Elemente von I i R (B) zu M gehören müssen, für alle i ≥ 0. Regel (iii) verlangt, daß wir nicht mehr Elemente als unbedingt nötig in M einbeziehen. Wir setzen daher: M := ⋃ i≥0 I i R(B). Zu zeigen ist: M erfüllt (i), (ii), (iii). 149


B.10 Definition (Hüllenbildung) Es sei A eine Menge, R ⊆ Seq(A) + × A sei eine Relation, B ⊆ A sei gegeben. (a) C ⊆ A heißt R-abgeschlossen, wenn für alle ((a 1 , . . . , a l ), b) ∈ R gilt: a 1 , . . . , a l ∈ C ⇒ b ∈ C. (b) Γ R (B) := ⋂ {C | B ⊆ C ⊆ A ∧ C ist R-abgeschlossen} heißt der Abschluß von B unter R. Dies ist die kleinste Teilmenge von A, die B enthält und R-abgeschlossen ist. Veranschaulichung: ((a 1 , . . . , a l ), b) ∈ R bedeutet, daß man aus den Objekten a 1 , . . . , a l das neue Objekt b ” bauen“ kann. Γ R (B) soll die Menge genau der Objekte sein, die man bauen kann, wenn man mit den Objekten der Menge B startet. Als erstes wollen wir festhalten, daß die oben betrachteten Beispiele in unseren Rahmen passen. Zunächst wollen wir die Menge der binären Bäume als Menge von Wörtern konstruieren. (Diese Repräsentation von Bäumen liegt natürlich recht weit weg von der anschaulichen, graphorientierten.) Wir repräsentieren Knoten als Binärzahlen: X = {[bin(0)], [bin(1)], [bin(2)], . . .} ist die Menge aller Knoten. Als weitere Buchstaben verwenden wir: Λ (leerer Baum), (, ). Unser Alphabet ist also Σ = {0, 1, [, ], (, ), Λ}. Für ein Wort w ∈ Σ ∗ sei X(w) := {x | x ist Knoten, x Teilwort von w}, die Menge der in w erwähnten Knoten. Etwa: X([0]()[10][01[10][)111) = {[10], [0]}. Man sieht, daß diese Menge wohldefiniert ist. B.11 Beispiel (Nochmal: Binäre Bäume) Setze A := Σ ∗ ; setze B := {Λ}; setze R := {((w 1 , w 2 ), (w 1 xw 2 )) | w 1 , w 2 ∈ A, x ∈ X; X(w 1 ), X(w 2 ), {x} sind disjunkt}. Dann definieren wir: Γ R (B) heißt die Menge der Binärbäume über der Knotenmenge X; ein w ∈ A ist ein Binärbaum genau dann, wenn w ∈ Γ R (B). Illustration: Den anschaulichen Binärbäumen 150


5 1 9 2 3 4 7 5 3 entsprechen die Wörter Λ, (Λ[101]Λ), ((Λ[10]Λ)[1](Λ[11](Λ[101]Λ))), ((((Λ[11]Λ)[100]Λ)[111]Λ)[1001]Λ). Den Wörtern (Λ[01]Λ) und ((Λ[1]Λ)[1]Λ) entspricht kein Binärbaum. Es sollte intuitiv klar sein, daß zwischen anschaulichen Bäumen und den Elementen von Γ R (B) eine 1-1-Korrespondenz besteht. Als nächstes betrachten wir die Klammerausdrücke. Hier sind die Verhältnisse etwas einfacher. B.12 Beispiel Setze A := Σ ∗ für Σ = {(, )}. Setze B := {ε} (leere Folge), und R := {((w 1 , w 2 ), (w 1 )w 2 ) | w ∈ Σ ∗ }. Dann ist Γ R (B) die Menge der korrekten Klammerausdrücke. Wir wollen noch rekursive Definitionen und Induktionsbeweise im Zusammenhang mit induktiven Definitionen durch Hüllenbildung rechtfertigen. B.13 Fakt Es sei eine Menge A, eine Menge R ⊆ Seq(A) × A und ein B ⊆ A gegeben. E(a) sei eine Eigenschaft, die für Elemente von A wahr oder falsch sein kann. Falls nun gilt: (i) E(a) für alle a ∈ B. (ii) wenn ((a 1 , . . . , a l ), b) ∈ R und E(a 1 ), . . . , E(a l ) gilt, so gilt auch E(b). dann gilt E(a) für alle a ∈ Γ R (B). B.14 Beispiel (a) Bei Binärbäumen könnte E(w) die folgende Aussage sein: Die Zahl der in w vorkommenden Teilstrings Λ ist um 1 größer als die Zahl der in w vorkommenden Elemente x ∈ X. (b) Bei Klammerausdrücken könnte E(w) die folgende Aussage sein: für alle Präfixe v von w gilt: |v| ( ≥ |v| ) . 151


Fakt B.13 liefert eine Rechtfertigung für Induktionsbeweise in der am Anfang dieses Abschnitts diskutierten Art. Für eine gegebene Eigenschaft E(a) zeige man nur (i) und (ii); damit ist bewiesen, daß E(a) für alle a ∈ Γ R (B) gilt. ( Der Beweis von Fakt B.13 ist fast trivial: Setze C := {a ∈ A | E(a) gilt}. Wegen (i) gilt B ⊆ C; wegen (ii) gilt, daß C R-abgeschlossen ist. Also folgt nach Definition B.10 (b), daß Γ R (B) ⊆ C ist: das heißt aber gerade, daß für alle a ∈ Γ R (B) Eigenschaft E(a) gilt. ) Es ist noch interessant festzustellen, daß (auch der Intuition entsprechend) Γ R (B) von ” unten, schichtweise“ aufgebaut werden kann. Beispiel: aus Bäumen der Tiefe d 1 und d 2 und einem Knoten baut man einen neuen Baum der Tiefe q + max{d 1 , d 2 }. Allgemein sieht das so aus: B.15 Definition Eine Menge A, eine Teilmenge B ⊆ A und eine Relation R ⊆ Seq(A)× A seien gegeben. Wir definieren (per Induktion über i ∈ IN): I.A.: Γ 0 R (B) := B. I.Sch.: Γ i+1 R (B) := Γi R (B) ∪ {b ∈ A | es ex. a 1, . . . , a r ∈ Γ i R (B) mit ((a 1, . . . , a r ), b) ∈ R} Intuition: Γ i R (B) enthält die mit i ineinandergeschachtelten Konstruktionsschritten ” erzeugbaren“ Elemente von Γ R (B). B.16 Lemma In der Situation der vorherigen Definition gilt: (a) B = Γ 0 R (B) ⊆ Γ1 R (B) ⊆ Γ2 R (B) ⊆ . . . ⊆ Γi R (B) ⊆ Γi+1 R (B) ⊆ . . . (b) Γ R (B) = ⋃ i∈IN Γi (B). (Teil (b) besagt, daß man jedes Element von Γ R (B) nach endlich vielen Konstruktionsschritten ” von unten“ erreicht.) Beweis (a) ist klar, nach Definition von Γ i+1 R (B)=Γi R (B) ∪ {· · · }. (b) ⊆“: Definiere U := ⋃ ” i∈IN Γi (B). Offenbar gilt B ⊆ U. Weiterhin ist U R- abgeschlossen, denn: für a 1 , . . . , a r ∈ U gibt es wegen (a) ein i mit a 1 , . . . , a r ∈ Γ i R (B). Ist zudem ((a 1 , . . . , a r ), b) ∈ R, so ist b ∈ Γ i+1 R (B), also b ∈ U. Nach Definition B.10(b) ist also Γ R (B) ⊆ U. ” ⊇“: Wir zeigen (durch vollständige Induktion über i ∈ IN) daß Γi R (B) ⊆ Γ R(B). Hilfsbehauptung: Γ R (B) ist R-abgeschlossen und umfaßt B. (Das beweist man leicht aufgrund von Definition B.10.) I.Anf.: Γ 0 R (B) = B ⊆ Γ R(B) nach Hilfsbeh. 152


I.Ann.: i ≥ 0, Γ i R (B) ⊆ Γ R(B). I.Schritt: Sei b ∈ Γ i+1 R (B). 1. Fall: b ∈ Γ i R (B). Nach I.Ann. ist b ∈ Γ R(B). 2. Fall: es ex. a 1 , . . . , a r ∈ Γ i R (B) mit ((a 1, . . . , a r ), b) ∈ R. Nach I.Ann. gilt a 1 , . . . , a r ∈ Γ R (B); nach der Hilfsbehauptung folgt b ∈ Γ R (B). Lemma B.16 ermöglicht es, für beliebige induktive Definitionen die Menge Γ R (B) in disjunkte Schichten einzuteilen. Schicht i ist die Menge Γ i R (B) − Γi−1 R (B) für i ≥ 1; Schicht 0 ist die Menge B. Bei vielen induktiven Definitionen kommt der Schicht eines Objekts b eine anschauliche Bedeutung zu. Z. B. liegen bei Binärbäumen in Schicht i die Bäume der Tiefe i. □ Schließlich diskutieren wir noch kurz die Möglichkeit, auf Mengen Γ R (B) ” durch Induktion“ Funktionen zu definieren, wie es in den Anwendungen in selbstverständlicher Weise gemacht wird. B.17 Fakt Es seien A, B, R wie vorher. Die Relation R habe die zusätzliche Eigenschaft, daß für b ∈ Γ R (B) gilt: b ∈ B oder ((a 1 , . . . , a r ), b) ∈ R für genau ein Tupel (a 1 , . . . , a r ) ∈ Seq(Γ R (B)). Dann kann man auf folgende Weise eine Funktion f mit Definitionsbereich Γ R (B) definieren: (i) definiere f(a) für alle a ∈ B; (ii) für b ∈ Γ R (B) − B spezifiziere, wie man f(b) aus a 1 , . . . , a r , b, f(a 1 ), . . . , f(a r ) berechnet, wenn ((a 1 , . . . , a r ), b) ∈ Seq(Γ R (B)) × Γ R (B). Den (nicht schwierigen, aber trockenen) Beweis für Fakt B.17 überlassen wir der Mathematik. Wir betrachten lieber Beispiele. B.18 Beispiel (a) Die Tiefe d(T ) eines Binärbaums T ist wie folgt induktiv definiert: (i) d(Λ) = 0; (ii) d((T 1 xT 2 )) = 1 + max{d(T 1 ), d(T 2 )}, wenn ((T 1 , T 2 ), (T 1 xT 2 )) ∈ R und T 1 , T 2 Binärbäume sind. (Beachte, daß aus (T 1 xT 2 ) die Komponenten eindeutig konstruierbar sind.) 153


(b) Das Konzept der Aufzählung der Knoten eines Binärbaums T in Inorder-, Präorderund Postorder-Reihenfolge läßt sich durch drei Funktionen E In , E Prä , E Post schreiben, die jeweils auf den Binärbäumen definiert sind und Werte in Seq(X) haben. Man erinnere sich, daß ◦ die Konkatenation von Elementen von Seq(X) bezeichnet. Wir definieren die drei Funktionen wie folgt. (i) E In (Λ) = E Prä (Λ) = E Post (Λ) = ε, die leere Folge. (ii) E In ((T 1 xT 2 )) = E In (T 1 ) ◦ x ◦ E In (T 2 ) E Prä ((T 1 xT 2 )) = x ◦ E Prä (T 1 ) ◦ E Prä (T 2 ) E Post ((T 1 xT 2 )) = E Post (T 1 ) ◦ E Post (T 2 ) ◦ x B.19 Beispiel Für Klammerausdrücke w definieren wir induktiv die Schachtelungstiefe d(w). (Bsp.: d(( )) = 1, d(((()())())) = 3.) Dies geht einfach, wie folgt: (i) d(ε) = 0; (ii) d((w 1 )w 2 ) = max{1 + d(w 1 ), d(w 2 )}. Nun kann man (zur Übung) Aussagen per Induktion beweisen, wie z. B. die folgende: d(w) = max{|v| ( − |v| ) | v Präfix von w}. B.20 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 ∗ := Γ 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. Man könnte auch B ′ := {(x, x)|x ∈ X}∪S und R ′ := {(((x, y), (y, z)), (x, z))|x, y, z ∈ X} verwenden. (Zur Übung überlege man, welche Tupel in Γ i R (B) und welche in Γ R ′(B′ ) liegen). 154


Anhang C Mathematische Grundlagen 155

Weitere Magazine dieses Users
Ähnliche Magazine