Theoretische Informatik Skript zur Vorlesung Prof. Dr. Uwe Petermann FB IMN, HTWK Leipzig Gustav-Freytag-Str. 42A, Leipzig [email protected] 4. Juni 2006 c Uwe Petermann Vortrag oder anderweitige Verwertung, Reproduktion, Vervielfältigung, Mikroverfilmung, Speicherung in und Bearbeitung mit elektronischen Systemen sowie Übersetzung auch von Bestandteilen dieses Lehrmaterials bedürfen der Genehmigung des Autors, falls sie nicht mit der im Titel genannten Vorlesung in Verbindung stehen. Zur Beachtung: Dieser Text wird weiter ergänzt und u.U. modifiziert. 1 Komplexität von Algorithmen und Problemen 1.1 Ressourcenbedarf von Programmen Die wesentlichen Ressourcen, die von Programmen beansprucht werden, sind Speicherplatz und Rechenzeit. Nachfolgend wird vor allem der Bedarf an Rechenzeit untersucht. Dabei wird stillschweigend angenommen, daß genügend Speicher zur Verfügung steht, um die Probleme zu lösen, die in der verfügbaren Zeit überhaupt bearbeitbar sind. Andererseits besteht ein Zusammenhang zwischen Speicherbedarf und Zeitaufwand, da der Aufwand für das Beschreiben von (neuen) Speicherzellen ebenfalls im Zeitaufwand widergespiegelt wird. 1.2 Algorithmenmodelle Um über den Zeitbedarf von Algorithmen sprechen zu können, muß zunächst eine Formalisierung des Algorithmenbegriffs angegeben werden. Nach der Churchschen These sind alle bekannten universellen Algorithmenmodelle gleichwertig hinsichtlich der Klasse der durch sie beschreibbaren Funktionen. Deshalb ist es gerechtfertigt, jeweils das Algorithmenmodell zu benutzen, welches die für die jeweilige Untersuchung am geeignetsten ist. Für prinzipielle Abschätzungen der Schwere von Problemen ist es oft zweckmäßig, abstraktere Algorithmusmodelle zu benutzen. Andernfalls sind die entstehenden mathematischen Probleme zu schwierig. Die Verwendung sehr abstrakter Modelle kann auch formal gerechtfertigt werden, indem nachgewiesen werden kann, daß sich die Komplexität der Algorithmen beim Übergang von der Formulierung in einem Modell zu einem anderen nicht wesentlich ändert. Nicht wesentlich heißt hier, daß der Übergang innerhalb der gleichen Größenordnung erfolgt. 1.2.1 Programmiersprachen Um die Zeitkomplexität von Algorithmen zu beurteilen, die in realen Programmiersprachen formuliert sind, ist es zweckmäßig folgende Operationen zu zählen: (1) Ausführung von arithmetischen, Vergleichs- oder logischen Operationen, (2) Wertzuweisung auf einfache Variablen oder Zeigervariablen, (3) Berechnung des Werts von indizierten Variablen, Zeigervariablen oder Feldern von Datenstrukturen oder Klassen, (4) Initialisierung von Prozedur- oder Funktionsaufrufen, (5) Übergabe der Werte von Aktualparametern sowie 2 (6) Ausführung der leeren Anweisung, eines Sprungbefehls oder einer (einfachen) Ein- oder Ausgabe. Bei dieser Zählweise wird vorausgesetzt, daß eine gemeinsame Obergrenze der Kosten dieser Operationen angenommen werden kann. Diese Voraussetzung schließt ein, daß die Größe der bearbeiteten elementaren Daten durch einen endlichen Wert sinnvoll nach oben abgeschätzt werden kann. Dies ist bei Implementierungen auf üblichen Rechnerarchitekturen der Fall, wenn zur Darstellung der elementaren Datentypen die rechnerinternen Repräsentationen benutzt werden. Kann letztere Voraussetzung nicht gemacht werden, müssen für die Elementaroperationen Kosten veranschlagt werden, die proportional zum Logarithmus der Argumentewerte sind. Dies wäre beispielsweise beim Rechnen mit Zahlen der Fall, die durch Objekte der Java-Klasse java.math.BigInteger dargestellt werden. 1.2.2 Turing-Maschinen Der Begriff der Turing-Maschine (kurz: TM) geht auf Alan M. Turing zurück [Tur36] zurück. Dieser Algorithmenbegriff ist durch das Rechnen mit Bleistift und Papier inspiriert. Die TM ist dadurch etwas weiter als die RM von der heutigen Hardware entfernt. Jedoch zeichnet sie sich durch große Einfachheit der Definition aus. Die TM modelliert ein in zwei Richtungen unendliches Band {ci }i∈Z von gleichartigen Feldern, in die Zeichen aus einem endlichen Bandalphabet Γ geschrieben werden können. Ein Schreib-Lese-Mechanismus kann in Einerschritten über dem Band positioniert werden. Die Maschine befindet sich stets in einem internen Zustand, welcher Element einer endlichen Menge Q ist. In einem Takt wird (1) der Inhalt des aktuellen Feldes gelesen und (2) in Abhängigkeit vom gelesenen Symbol und vom internen Zustand der TM wird (a) ein Zeichen in das aktuelle Feld geschrieben sowie (b) die Position des Schreib-Lese-Mechanismus um ein Feld verschoben oder konstant gehalten und schließlich (c) eventuell der interne Zustand verändert. Nehmen wir an, daß die Bewegungsrichtungen des Schreib-Lese-Kopfes durch R, L und N dargestellt werden, kann man ein Programm für eine TM als eine Abbildung Q × Γ → Q × Γ × {R, L, N } auffassen. Turing-Maschinen werden detailierter in Abschnitt 2 behandelt. 3 1.2.3 Registermaschinen Definition 1.1 (vgl. [Weg93] S. 9 ff) Eine Registermaschine (kurz: RM, engl. RAM, d.h. random access machine) besteht aus folgenden Komponenten: Speicher: unendliche Folge c = {ci }i∈N natürlicher Zahlen, das Element c0 heißt Akkumulator, Befehlszähler: natürliche Zahl, nachfolgend als b notiert. Programm: endliche Folge {ai }i∈N von Befehlen. Zulässige Befehle sind in folgender Tabelle dargestellt. Befehl storei loadi cloadi addi caddi subi csubi multi cmulti gotoj if c0 sl gotoj , s bedeutet eines der binären Relationssymbole =, <, >, ≥, ≤. neuer Wert eines Registers neuer Wert des Befehlzählers falls verändert, dann wie folgt: c(i) := c(0) b:=b+1 c(0) := c(i) b:=b+1 c(0) := i b:=b+1 c(0) := c(0) + c(i) b:=b+1 c(0) := c(0) + i b:=b+1 c(0) := max(c(0) − c(i), 0) b:=b+1 c(0) := max(c(0) − i, 0) b:=b+1 c(0) := c(0) ∗ c(i) b:=b+1 c(0) := c(0) ∗ i b:=b+1 b := j j . . . c0 sl erfüllt b := b + 1 . . . sonst end Abarbeitung: Folge von Zuständen {(b, c)k }k∈n , wobei jeder Zustand (außer dem null-ten) durch eine Befehlsausführung aus seinem Vorgänger hervorgeht. 2 Die RM spiegelt die realen Rechner hinreichend gut wider. Die Zahl der Rechenschritte auf der RM unterscheidet sich nur um einen konstanten Faktor von der Schrittzahl auf realen Rechnern. Dies gilt zumindest solange nur mit Zahlen einer festen Maximalgröße gerechnet wird. Es kann dann das uniforme Kostenmaß verwendet werden. D.h. jeder Befehl der RM wird mit einer Kosteneinheit veranschlagt. Muß diese Annahme fallengelassen werden, so muß mit dem logarithmischen Kostenmaß gerechnet werden. Dann geht die Länge der Darstellung der verarbeiteten Zahlen in die Kosten ein. 4 1.2.4 Nichtdeterministische Registermaschinen Definition 1.2 Eine nichtdeterministische Registermaschine hat im Vergleich zur (deterministischen) Registermaschine folgenden zusätzlichen Befehl: • choosei - lege einen der Werte 0 oder 1 in der i-ten Speicherzelle ab. 2 Ein Zustand (b, c) hat zwei mögliche Nachfolger, wenn der nach dem Wert des Befehlszählers auszuführende Befehl choosei ist. Der Begriff der Abarbeitung in einer nichtdeterministischen RM wird analog zu Definition 1.1 eingeführt. 1.2.5 while-Programme while-Programme arbeiten ähnlich den Registermasschinen mit Speicherzellen, die natürliche Zahlen aufnehmen können. Es werden Mengen von Funktionsanweisungen F M = {vor, nach} und Testanweisungen T M = {null} angenommen. Diese Anweisungen beziehen sich jeweils auf eine Speicherzelle i (Notation nachi , vori , nulli ). nachi ersetzt den Inhalt der i-ten Speicherzelle durch dessen Nachfolger, vori berechnet den Vorgänger, soweit er existiert, und läßt den Wert unverändert andernfalls. nulli prüft, ob der Inhalt der i-ten Speicherzelle 0 ist oder nicht, und liefert 1 oder 0 als Wert bei Erfülltheit bzw. Nichterfülltheit der Bedingung. ΦF M,T M bezeichnet die Menge der mit diesen Anweisungen formulierbaren while-Programme. 5 1.3 Begriffe zur Komplexität • Sei F : E → A eine berechenbare Funktion für Mengen E und A von Eingabe- bzw. Ausgabewerten . • g, k : E → N sind Funktionen, die die Größe einer Eingabe (Größenmaß) und den Aufwand zur Berechnung des Funktionswertes für eine Eingabe (Kostenfunktion) angeben. • Die Mengen E und A sind als Teilmengen von N kodiert. • Die Funktion F ist mit Register- oder Turingmaschinen berechenbar. • Die Kostenfunktion kann z.B. durch Zählen der Ausführungen von Tests und Elementaranweisungen definiert werden. • Die Größe eines Eingabewertes e kann als konstant angesehen werden, wenn seine Größe sinnvoll von ober abgeschätzt werden kann. Sonst ist seine Größe durch die Länge der Binärdarstellung seiner Kodierung als natürliche Zahl anzusetzen. • Definitionen für Größenmaß und Kostenfunktion werden so gewählt, daß die Problemstellung adäquat widergespiegelt wird. • Bei gegebenen Größenmaß und Kostenfunktion können folgende Komplexitätsmaße definiert werden: 1.3.1 Kosten im schlimmsten Fall (worst case cost) KF (n) = sup {k(e) | e ∈ E, g(e) = n} 1.3.2 Kosten im mittleren Fall (average case cost) Wenn • für n ∈ N die Menge En = {e ∈ E | g(e) = n} endlich ist, • und eine Verteilungsfunktion Wn : En → [0, 1] mit Σg(e)=n Wn (e) = 1 gegeben ist, dann KFav (n) = Σg(e)=n Wn (e) ∗ k(e) • Bei der Angabe der Kostenfunktionen muß oftmals auf deren genaue Angabe verzichtet werden, da häufig keine geschlossene Darstellung möglich ist. 6 • Es wird angegeben, wie sich die Funktionen für große Eingabewerte verhalten. • Es ist folgende Notation für dieses asymptotische Verhalten üblich (vgl. [CLRS01, HMU02, Weg93]): Definition 1.3 Sei f : N → N eine Funktion. Es werden folgende Mengen von Funktionen definiert: Angabe einer oberen Schranke: O(f ) = g ∈ NN | ∃c > 0∃n0 ∀n ≥ n0 : g(n) ≤ f (n) Angabe einer unteren Schranke: Ω(f ) = g ∈ NN | ∃c > 0∃n0 ∀n ≥ n0 : g(n) ≥ f (n) Angabe einer oberen und unteren Schranke: Θ(f ) = g ∈ NN | ∃c, d > 0∃n0 ∀n ≥ n0 : 1/c ∗ f (n) ≤ g(n) ≤ d ∗ f (n) 2 1.3.3 Beispiel zur Anwendung der Notation Beispiel 1.1 max(4, 2 ∗ n2 − 7) = O(n2 ) c = 2, n0 = 3 1.3.4 Einige Rechenregeln für Größenordnungen f = O(g), g = O(h) → f = O(h) (1) f = Θ(g), g = Θ(h) → f = Θ(h) (2) f = O(g), g = O(f ) → f = Θ(g) (3) f = Θ(g) → g = Θ(f ) (4) g = O(f ) → k ∗ g = O(f ) (5) g = O(f ), h = O(f ) → g + h = O(f ) (6) g = O(f1 ), h = O(f2 ) → g ∗ h = O(f1 ∗ f2 ) (7) 7 2 Turing-Maschinen Der Begriff der Turing-Maschine geht auf Alan M. Turing zurück [Tur36]. Dieser Algorithmenbegriff erscheint wie durch das Rechnen mit Bleistift und Papier inspiriert. Er wirkt dadurch etwas von der heutigen Hardware entfernt. Jedoch zeichnet er sich durch große Einfachheit der Definition aus. Dadurch ist dieser Maschinentyp vor allem geeignet, wenn sehr grundlegende Aussagen bewiesen werden sollen. Die Turing-Maschine modelliert ein unendliches Band von gleichartigen Feldern, in die Zeichen aus einem endlichen Alphabet geschrieben werden können. Ein Schreib-Lese-Mechanismus kann in Einerschritten über dem Band positioniert werden. In einem Takt wird der Inhalt eines Feldes gelesen und geschrieben und die Position des Schreib-Lese-Kopfs neu bestimmt. Außerdem erfolgt ein Zustandsübergang. 2.1 Formalisierung der Turing-Maschine Definition 2.1 Turing-Maschine Eine Turing-Maschine M = (Q, Γ, δ, q0 , F ) hat folgende Komponenten • Q, die endliche Zustandsmenge, • q0 ∈ Q, einen Anfangszustand, • F ⊆ Q, eine Menge von akzeptierenden oder Endzuständen, • Σ, ein endliches Eingabealphabet, • Γ, ein endliches Bandalphabet, Γ enthält immer auch das Zeichen B, B 6∈ Σ und umfaßt das Eingabealphabet, • δ : Q × Γ → 2Q×Γ×{−1,0,+1} , eine Übergangsfunktion. M heißt deterministisch (kurz: DTM), wenn |δ(q, a)| = 1 für alle (q, a) ∈ Q × Γ. Anderenfalls heißt M nichtdeterministisch (kurz: NTM). Ein Wort uqv mit u, v ∈ Γ∗ , q ∈ Q heißt Konfiguration. Dabei wird angenommen, daß das erste und letzte Alphabetssymbol in uqv die auf dem Band am weitesten links bzw. rechts stehenden vom Blank-Symbol verschiedenen Zeichnen sind. Eine Konfiguration uqv beschreibt also eine Situation, in der der Lese-SchreibKopf der Turing-Maschine über dem ersten Symbol des Wortes v steht und im Zustand q ist. 8 Für Konfigurationen k, k 0 schreiben wir k ` k 0 falls k 0 aus k durch eine Aktion der TM hervorgeht. Die Relation ` ist wie folgt definiert, wobei u, v ∈ Γ∗ , a, b, c ∈ Γ und q, q 0 ∈ Q gelten. uq 0 acv . . . (q 0 , c, −1) ∈ δ(q, b) uaq 0 cv . . . (q 0 , c, 0) ∈ δ(q, b) uaqbv ` uacq 0 v . . . (q 0 , c, +1) ∈ δ(q, b) 0 q Bcv . . . (q 0 , c, −1) ∈ δ(q, b) q 0 cv . . . (q 0 , c, 0) ∈ δ(q, b) qbv ` 0 cq v . . . (q 0 , c, +1) ∈ δ(q, b) uq 0 ac . . . (q 0 , c, −1) ∈ δ(q, B) uaq 0 c . . . (q 0 , c, 0) ∈ δ(q, B) uaq ` uacq 0 . . . (q 0 , c, +1) ∈ δ(q, B) 0 q Bc . . . (q 0 , c, −1) ∈ δ(q, B) q0c . . . (q 0 , c, 0) ∈ δ(q, B) q ` 0 cq . . . (q 0 , c, +1) ∈ δ(q, B) 2 Turingmaschinen können durch ihre Turing-Tafeln angegeben werden. Dies sind Tabellen, die die Übergangsfunktion widerspiegeln. Beispiel 2.1 Beispiel einer Maschine, die einen beliebigen Bandinhalt löscht. Sei Q = {s, e} , Γ = {0, 1, B} , q0 = s, F = {e}. Q s s s Γ 0 1 B Q s s e δ Γ Richtung B +1 B +1 B N Beispiel 2.2 Beispiel einer Maschine, die zu einer binärkodierten Zahl den Nachfolger bildet. Eine binärkodierte Zahl ist entweder die Zeichenkette der Länge 1, deren einziges Zeichen 0 ist, oder sie hat die Form 1w, wobei w eine beliebige Zeichenkette über dem Alphabet bestehend aus den beiden Symbolen 0 und 1 ist. Sei Q = {s, a, l, e} , Γ = {0, 1, B} , q0 = s. 9 Q s s s a a a l l l Γ 0 1 B 0 1 B 0 1 B Q s s a l a e l l e Γ 0 1 B 1 0 1 0 1 B δ Richtung +1 +1 -1 -1 -1 N -1 -1 +1 Erläuterung suche rechtes Wortende addiere 1 und propagiere Übertrag suche linkes Wortende 2.2 Abarbeitungsbegriff für Turing-Maschinen Definition 2.2 Endzustand und Terminierende Berechnung (vgl. [Weg93, AHU74, HMU02]) (1) Eine Konfiguration uqv ist genau dann eine Endkonfiguration, wenn δ(q, a) = {(q, a, 0)} und q ∈ F gilt. (2) Eine Folge von Konfigurationen {ki }m i=0 heißt terminierende Berechnung für ND-TM M = (Q, Γ, δ, q0 , F ), falls (a) k0 = q0 w (b) ki ` ki+1 für i = 0, . . . , m − 1 (c) km ist Endkonfiguration. 2 Definition 2.3 Von Turing-Maschine berechnete semantische Funktion, akzeptierte Sprache (1) Eine (i.A. partielle) Funktion f : Γ∗ → Γ∗ heißt semantische Funktion für die TM M = (Q, Γ, δ, q0 , F ), falls v ist Bandinschrift nach v . . . terminierender Berechnung, f (w) = (8) die mit w startet undefiniert . . . sonst 10 (2) Mit bin(n) bezeichnen wir die Binärkodierung einer natürlichen Zahl n, mit bin−1 die Umkehrfunktion der Funktion bin. Eine Funktion g : Nn → N heißt von TM M = (Q, Γ, δ, q0 , F ) berechnet, falls bin−1 (v) . . . v = f (bin(m1 )# . . . #bin(mn )) g(m1 , . . . , mn ) = undefiniert . . . sonst (9) gilt, wobei f die semantische Funktion für M ist. Die Funktion g heißt dann Turing-berechenbar. (3) Eine terminierende Berechnung, die von einer Konfiguration mit Bandinschrift x ∈ Γ∗ startet, heißt akzeptierende Berechnung für x. L(M ) = {x ∈ Γ∗ | es gibt eine akzeptierende Berechnung für x} L(M ) heißt die von Turing-Maschine M akzeptierte Sprache. 2 Satz 2.1 Eine Funktion ist Turing-berechenbar gdw. sie RM-berechenbar ist. Definition 2.4 (Zeitkomplexität einer Turing-Maschine) Sei M = (Q, Γ, δ, q0 , F ) eine Turing-Maschine. (1) Angenommen, M ist nichtdeterministisch. L(M ) ⊆ N ist die von M akzeptierte Sprache. Dann heißt die Funktion k ist Länge einer inf k | TM (n) = max akzeptierenden Berechnung für x x ∈ L(M ) |x| = n Zeitkomplexität der ND-TM M . (2) Angenommen, M ist deterministisch. Dann heißt die Funktion k ist Länge einer TM (n) = max inf k | akzeptierenden Berechnung für x x ∈ L(M ) |x| = n Zeitkomplexität der TM M . 2 Man beachte sorgfältig den Unterschied zwischen den Definitionen der Zeitkomplexität von deterministischen und nichtdeterministischen TM. Bei der Zeitkomplexität einer nichtdeterministischen TM werden nur die Längen der terminierenden Berechnungen berücksichtigt. Bei einer deterministischen TM werden jedoch auch die Längen der nichtterminierenden Berechnungen beachtet, die durch die Infimumbildung mit ∞ veranschlagt wird. 11 Beispiel 2.3 Die Zeitkomplexität der Maschine in Beispiel 2.2 ist O(log n). Beispiel 2.4 Die Zeitkomplexität einer nichtdeterministischen Maschine, die das Cliquenproblem nach dem naiven Algorithmus löst, ist polynomiell in der Zahl der Knoten des betrachteten Graphen. 2.3 Eigenschaften von Abarbeitungen von Turing-Maschinen Satz 2.2 ([Weg93], Satz 2.3.1) Jede für das logarithmische Kostenmaß t(n)-zeitbeschränkte RM kann für ein Polynom q durch eine O(q(n + t(n)))-zeitbeschränkte TM simuliert werden. Satz 2.3 ([Weg93], Satz 2.3.2) Jede t(n)-zeitbeschränkte TM kann durch eine uniform O(n+t(n))-zeitbeschränkte und für das logarithmische Kostenmaß O((n+t(n)) log(n+t(n)))-zeitbeschränkte RM simuliert werden. RM und TM (und analog ihre nichtdeterministischen Varianten) können einander in Polynomzeit simulieren, vorausgesetzt, daß bei den RM ein für beliebig große Zahlen realistisches Kostenmaß angesetzt wurde. Dieses realistische Kostenmaß ist das logarithmische. 12 3 Schwierige Probleme und ihre Lösung • schwierig heißt hier: es existieren keine Algorithmen polynomieller Komplexität oder es sind keine solchen bekannt. • Für viele schwierige Problemen kann man zeigen: Aus der Existenz eines solchen Algorithmus würde folgen, daß für alle polynomiell in nichtdeterministischer Zeit lösbaren Probleme polynomielle Algorithmen existieren würden. • Dies gilt als starker Hinweis darauf, daß es für diese Probleme keine polynomiellen Algorithmen gibt. 3.1 Fallstudie: Cliquenproblem in ungerichteten Graphen Eine Clique in einem ungerichteten Graphen ist ein vollständiger Teilgraph. Cliquenproblem in ungerichteten Graphen: Zu entscheiden, ob für gegebenes k ∈ N in einem Graphen eine Clique mit k Knoten existiert. Formalisierung: Graph sei als G = (V, E) mit E ⊆ V × V gegeben. Problem: Entscheiden, ob V 0 ⊆ V mit |V 0 | = k und V 0 × V 0 ⊆ E existiert. Kodierung des Problems: Die Kantenmenge E wird als Adjazenzmatrix dargestellt. Bei einer n-elementigen Knotenmenge wird dazu ein Bitvektor der Länge n2 benutzt. Die Größe der gesuchten Clique wird ebenfalls als Bitvektor, und zwar der Länge blog2 nc + 1, dargestellt1 . Es seien G(w) der durch Bitvektor w dargestellte Graph und W (v) die durch Binärzahl v dargestellte natürliche Zahl. w, v ∈ {0, 1}∗ , |w| = n2 , |v| = blog2 nc + 1 Clique = (w, v) | G(w) enthält Clique der Größe W (v) Für das Cliquenproblem gibt es eine naive Lösung, die darauf beruht, daß n einfach alle k-elementigen Teilmengen der n-elementigen Knotenmenk ge daraufhin geprüft werden, ob sie eine Clique sind. Man sieht, daß die Kosten für den Test, ob eine ausgewählte Teilmenge Clique ist, quadratisch in deren Mächtigkeit sind. Damit ist die pessimistische Komplexität des Algorithmus exponentiell. Diese hohe Komplexität ergibt sich aus der Notwendigkeit der Konstruktion aller Teilmengen einer bestimmten Größe. Dagegen sind die Kosten für die Überprüfung der Cliqueneigenschaft einer gegeben Menge relativ gering. Dies führt zur Betrachtung nichtdeterministischer Maschinen und ihrer Komplexität. Man stellt sich vor, daß ein Kandidat für eine Clique nichtdeterministisch 1 Zur Notation: brc = supn∈N {n | n ≤ r}. dre = infn∈N {n | n ≥ r}. 13 rate_teilmenge_mit_k_elementen; pruefe_ob_teilmenge_eine_Clique_ist Abbildung 1: Grobstruktur einer Lösung des Cliquenproblems ausgewählt wird. Nach der Auswahl erfolgt der Test deterministisch. Zur Definition einer nichtdeterministischen Kostenfunktion für die Entscheidung der Existenz einer Clique in einem Graphen setzt man die Länge der kürzesteten möglichen Abarbeitung an, die zur Bejahung der Existenz einer Clique führt. knd (e) = min {k | es gibt Berechnung der Länge k für f (e)} Die pessimistische und die mittlere Komplexität bildet man nun analog zu den Definitionen 1.3.1 und 1.3.2. Wir diskutieren nun den erwähnten nichtdeterministischen Algorithmus. Er hat die in Abbildung 1 dargestellte Grobstruktur. Die erste Anweisung wird in Abbildung 2 als C-Programm skizziert. Darin tritt die nichtdeterministische Anweisung choosej auf. Im Feld candidate wird als Bitvektor eine Kodierung der auszuwählenden Kandidatin, die daraufhin getestet wird, ob sie Clique ist, gehalten. Die Zahl in der Variablen j ist die Nummer des Knotens über dessen Zugehörigkeit zur Kandidatenmenge gerade entschieden wird. Über die Zugehörigkeit wird mittels der Anweisung choosej eine nichtdeterministische Entscheidung getroffen. In i steht die Anzahl der Knoten, die noch in die Kandidatenmenge aufgenommen werden müssen. Die zweite Anweisung des Programms in Abbildung 1 kann einfach durch zwei verschachtelte for-Schleifen realisiert werden. Die angebene Lösung ist eine sehr einfache Variante des Prinzips Generieren” und-Testen“. Eine Verbesserung ist durch sinnvolleres Koppeln von Testen und Generieren möglich: • für einen neu zu einem Cliquenkandidaten hinzugenommenen Knoten wird sofort getestet, ob er mit allen anderen Knoten des Kandidaten durch eine Kante verbunden ist. Diese Verbesserung verbleibt jedoch innerhalb der exponentiellen Komplexität. 14 int m=n; /* Initialisierung von m mit der Groesse des Graphen */ int i=k; /* Initialisierung von k mit der Groesse der Clique. * Es wird k=<n vorausgesetzt. */ int j; while (j=0; i!==0; j++) { /* Invariante: * fuer m Knoten wurde noch nicht entschieden * i Knoten werden noch fuer den Kandidaten gebraucht */ if (i<m) { choose(candidate[j]); if (candidate[j]==1) { /* j-ter Knoten in Kandidatenmenge aufgenommen */ i=i-1; } } else { /* Es gilt i=m. * j-ter Knoten automatisch in Kandidatenmenge aufgenommen, * da diese aufgefuellt werden muss. */ candidate[j]=1; i=i-1; } m=m-1; } Abbildung 2: Nichtdeterministische Auswahl eines Cliquen-Kandidaten 15 3.2 Eine Auswahl schwieriger Probleme Es werden jetzt weitere schwierige Probleme beschrieben. Für einige werden Lösungsalgorithmen diskutiert. Für andere wird ihre gegenseitige Reduzierbarkeit gezeigt. Die NP-Vollständigkeitstheorie zeigt, daß alle hier vorgestellten Probleme alle nichtdeterministisch in polynomieller Zeit lösbaren Probleme repräsentieren. Zunächst werden die Entscheidungsvarianten der Probleme diskutiert. 3.2.1 Das Erfüllbarkeitsproblem in der Aussagenlogik Name: Sat Eingabe: Eine aussagenlogische Formel F in CNF (d.h. konjunktiver Klauselnormalform). Frage: Ist F erfüllbar? Bereits das Problem der Erfüllbarkeit von Mengen von Klauseln der Länge von maximal 3 ist NP-vollständig. Name: Sat(3) Eingabe: Eine aussagenlogische Formel F in CNF mit Klauseln von maximal 3 Literalen. Frage: Ist F erfüllbar? 3.2.2 Cliquenproblem Name: Clique (Entscheidbarkeitsvariante) Eingabe: Paar, bestehend aus einem Graph und einer natürlichen Zahl k. Frage: Enthält der Graph eine Clique der Größe k? 3.2.3 Das symmetrische Problem des Handelsreisenden Name: T SP (Entscheidbarkeitsvariante) Eingabe: Geordnetes Paar, bestehend aus einer symmetrischen Distanzmatrix dist : {0, . . . , n − 1} × {0, . . . , n − 1} → N, und einer natürlichen Zahl k. Frage: Enthält der Graph eine Rundreise der Länge ≤ k? 16 3.2.4 Das symmetrische Problem des Handelsreisenden mit Dreiecksungleichung Name: ∆T SP (Entscheidbarkeitsvariante) Eingabe: Geordnetes Paar, bestehend aus einer symmetrischen Distanzmatrix dist : {0, . . . , n − 1} × {0, . . . , n − 1} → N, die der Dreiecksungleichung dist(i, j) + dist(j, l) ≥ dist(i, l) genügt, und einer natürlichen Zahl k. Frage: Enthält der Graph eine Rundreise der Länge ≤ k? 3.2.5 Das Rucksackproblem Name: Knapsack (Entscheidbarkeitsvariante) Eingabe: Folgen natürlicher Zahlen {gi }ni=1 (die Größen von n Objekten) und {ai }ni=1 (die Werte der n Objekte) sowie natürliche Zahlen G (Größenlimit des Rucksacks) und N (gewünschter Gesamtwert). Frage: Gibt es eine Teilmenge J ⊆ {1, . . . , n} mit Σj∈J aj = N und Σj∈J gj ≤ G? 3.3 Zusammenhang zwischen Entscheidungs- und Optimierungsproblemen Für die Praxis ist oft nicht nur die Frage der Existenz einer Lösung wichtig, sondern auch die Existenz einer möglichst guten Lösung bzw. auch die beste Lösung selbst wird gebraucht. Die erstgenannte Variante ist ein Entscheidungsproblem, die beiden weiteren sind Optierungsvarianten. 3.3.1 Optimierungsvarianten des Cliquenproblems Name: Clique2 Eingabe: Ein Graph. Frage: Welche ist die größte natürliche Zahl k, für die der Graph eine Clique der Größe k enthält? Wenn die Entscheidungsvariante des Cliquenproblems in polynomieller Zeit lösbar ist, dann ist es auch die Optimierungsvariante Clique 2“. Begründung: ” Wenn ein polynomieller Algorithmus für die Entscheidungsvariante gegeben ist, kann dieser als Unterprogramm in der linearen Suche nach der maximalen Cliquengröße aufgerufen werden. 17 Name: Clique3 Eingabe: Ein Graph G. Aufgabe: Finde eine in G eine Clique der maximaler Größe. Wenn die Optimierungsvariante Clique 2“ in polynomieller Zeit lösbar ist, ” dann ist es auch die Optimierungsvariante Clique 3“. ” Begründung: Übungsaufgabe 3.3.2 Optimierungsvarianten des Rucksackproblems Name: Knapsack2 Eingabe: Folgen natürlicher Zahlen {gi }ni=1 und {ai }ni=1 sowie eine natürliche Zahl G. Aufgabe: Bestimme die größte Zahl N , für die es eine Teilmenge J ⊆ {1, . . . , n} mit N = Σj∈J aj und Σj∈J gj ≤ G gibt. Name: Knapsack3 Eingabe: Folgen natürlicher Zahlen {gi }ni=1 und {ai }ni=1 sowie eine natürliche Zahl G. Aufgabe: Bestimme eine Teilmenge J ⊆ {1, . . . , n} derart, daß N = Σj∈J aj gilt und die Zahl Σj∈J aj maximal wird. 3.3.3 Optierungsvarianten des Problems des Handlungsreisenden Name: T SP 2 Eingabe: Symmetrische Distanzmatrix dist : {0, . . . , n − 1} × {0, . . . , n − 1} → N Frage: Welche Länge hat die kürzeste Rundreise? Name: T SP 3 Eingabe: Symmetrische Distanzmatrix dist : {0, . . . , n − 1} × {0, . . . , n − 1} → N Aufgabe: Bestimme eine Rundreise kürzester Länge. 18 3.3.4 Optierungsvarianten des Problems des Handlungsreisenden mit Dreiecksungleichung Name: ∆T SP 2 Eingabe: Symmetrische Distanzmatrix dist : {0, . . . , n − 1} × {0, . . . , n − 1} → N, die der Dreiecksungleichung dist(i, j) + dist(j, l) ≥ dist(i, l) genügt. Frage: Welche Länge hat die kürzeste Rundreise? Name: ∆T SP 3 Eingabe: Symmetrische Distanzmatrix dist : {0, . . . , n − 1} × {0, . . . , n − 1} → N, die der Dreiecksungleichung dist(i, j) + dist(j, l) ≥ dist(i, l) genügt. Aufgabe: Bestimme eine Rundreise kürzester Länge. 3.4 Überblick über Lösungsmethoden für schwierige Probleme Spezialfälle: Ist die Problemlösung in voller Allgemeinheit nötig? Manchmal existieren effiziente Algorithmen für Teilklassen. So für Planungsprobleme mit Vorrangeinschränkungen: Teilklasse 1: mit 2 Prozessoren, Teilklasse 2: wenn die Vorrangeinschränkungen baumförmig sind. Bessere Organisation der Suche: Z.B. Dynamische Programmierung und Branch and Bound als geschickte Suchmethoden. Untersuchung der Wahrscheinlichkeit verschiedener Eingaben: Bei manchen Problemen sind die wirklich harten Eingaben selten und sporadisch auftretende lange Berechnungen können toleriert werden. Beispiel: Unifikation von Termen. Approximationsalgorithmen: Für manche Optimierungsprobleme existieren schnelle Algorithmen, die hinreichend gute Annäherungen der optimalen Lösungen liefern. Beispiel: Rundreiseproblem. Probabilistische Algorithmen: Es gibt schnelle Algorithmen, die hinreich oft richtige Lösungen liefern. Beispiel: Primzahltest. Heuristiken: Heuristiken können helfen, bei der Lösung eines schweren Problems zumindest nicht ungeschickt vorzugehen. 19 4 Die Komplexitätsklassen P und NP Zur Klasse der NP-vollständigen Probleme gehören viele praktisch bedeutsame Probleme. Außer den bereits genannten seien Stundenplanprobleme, Optimierungsprobleme und Datenbankprobleme erwähnt. In diesem Kapitel wird dargelegt, daß das Cliquenproblem in gewissem Sinne stellvertretend für alle Probleme ist, die nichtdeterministisch in polynomieller Zeit gelöst werden können, für die aber keine in polynomieller Zeit arbeitenden deterministischen Lösungsalgorithmen bekannt sind. Wenn nämlich das Cliquenproblem auch deterministisch in polynomieller Zeit gelöst werden könnte, dann würde das auf alle nichtdeterministisch in polynomieller Zeit lösbaren Probleme zutreffen. Gegenwärtig sind über 2000 Probleme bekannt, für die diese als NP-Vollständigkeit bezeichnete Eigenschaft nachgewiesen wurde. Um derart globale Aussagen formulieren und nachweisen zu könnnen, braucht man einen möglichst allgemeinen und einfachen Begriff der Berechenbarkeit, auf den verschiedenste Problemstellungen formal zurückgeführt werden können. 4.1 Grundlagen Definition 4.1 Die Komplexitätsklassen P und NP es gibt TM M = (Z, Γ, δ, z0 , F ) , Polynom p mit P= L | L ⊆ Γ∗ , L = L(M ), ∀n ∈ N : TM (n) ≤ p(n) es gibt ND TM M = (Z, Γ, δ, z0 , F ) , Polynom p mit NP = L | L ⊆ Γ∗ , L = L(M ), ∀n ∈ N : TM (n) ≤ p(n) 2 Da eine deterministische TM als Spezialfall der ND TM betrachtet werden kann, bei dem für jede Eingabe genau eine Abarbeitung existiert, gilt: P ⊆ NP. Definition 4.2 (1) Es seien Σ und Γ endliche Alphabete. Eine totale Abbildung f : Σ∗ → Γ∗ heißt (in polynomieller Zeit) berechenbare Transformation, falls f in (polynomieller Zeit) TM-berechenbar ist. (2) Seien L ⊆ Σ∗ und K ⊆ Γ∗ Sprachen. L heißt auf K reduzierbar (Notation: L ≤ K (L ≤p K)), falls es eine (polynomielle) Transformation f : Σ∗ → Γ∗ gibt, mit ∀x ∈ Σ∗ : x ∈ L gdw. f (x) ∈ K 20 (3) Eine Sprache L heißt NP-vollständig, wenn (a) L ∈ NP und (b) ∀K ∈ NP : K ≤p L gelten. (4) Eine Sprache L heißt NP-hart, wenn ∀K ∈ NP : K ≤p L gilt. 2 4.2 NP-Vollständigkeit wichtiger Probleme Satz 4.1 (Cook, vgl. [Weg93] S. 47-50) SAT ist NP-vollständig. Beweis. Beweisskizze: (1) Behauptung: SAT ist NP. Um diese Behauptung nachzuweisen, konstruiert man eine TM, welche für eine auf dem Band kodierte Formel nichtdeterministisch eine Belegung wählt und danach deterministisch prüft, ob die gewählte Belegung die Formel erfüllt. (2) Behauptung: Für jedes Problem P , welches zu NP gehört, gilt P ≤p Sat. Da das betrachtete Problem zu NP gehört, existieren ein Polynom p und eine ND TM M , welche jede Instanz des Problems P der Größe n nichtdeterministisch in der Zeit p(n) löst. Das Verhalten dieser ND TM gilt es, als aussagenlogischen Ausdruck zu kodieren. Dazu werden die Abarbeitungen von M bei den einzelnen Probleminstanzen durch aussagenlogische Ausdrücke kodiert. Wichtig ist, daß die modellierte ND TM für jede Probleminstanz der Größe n in jedem Zweig höchsten p(n) viele Schritte macht und damit auch nur höchstens p(n) viele Zeichen auf das Band schreiben kann. Damit kann die Abarbeitung von M bei einer Eingabe der Größe n jeweils mit einer Folge von Wörtern c0 , . . . , cp(n) beschrieben werden. Jedes der Wörter hat p(n) Zeichen2 . Zum Abschluß des Beweises modelliert man nun die TM als aussagenlogischen Ausdruck, indem man ihre Abarbeitungen, d.h. Folgen von Wörtern der Form vqw (Notation: siehe Definition der TM und nachfolgende Ausführungen), durch eine Konjunktion von Teilausdrücke modelliert, deren nachfolgend angegeben wird. Die Form der Teilausdrücke ist durch die zu modellierende ND TM M bestimmt und widerspiegelt generisch deren Abarbeitungen. 2 Zur Vereinheitlichung der Darstellung wird links und rechts der eigentlichen“ Bandin” schrift mit Blank-Symbolen aufgefüllt. 21 ND TM M startet richtig: vqw beschreibt die Startkonfiguration, d.h. alle Zeichen in v sind Blanks, q ist der Startzustand, w enthält als Präfix die Eingabe und ansonsten Blanks (vgl. Fußnote 2). Jeder Schritt von M ist richtig: Übergang vqw ` v 0 q 0 w0 ist korrekt. ND TM M endet richtig: vqw ist korrekt und wird nicht mehr verändert. q.e.d. Satz 4.2 Für NP-vollständige Probleme L gilt: (1) L ∈ P gdw. P = NP (2) Wenn L ≤p K und K ∈ NP, dann ist K NP-vollständig. Für die in Unterabschnitt 3.2 vorgestellten Probleme sind folgende Reduktionsbeziehungen bekannt (vgl. [Weg93]). Da diese Probleme sämtlich in NP sind, sind sie damit NP-vollständig. Sat ≤p Sat(3) ≤p Clique (vgl. [Weg93] S. 51ff) Sat(3) ≤p Knapsack (vgl. [Weg93] S. 53f) Sat(3) ≤p DHC ≤p HC ≤p ∆T SP (vgl. [Weg93] S. 56ff) Um die Beziehung Sat(3) ≤p Clique nachzuweisen, betrachten wir eine Klauselmenge F = {ci }ki=1 mit ci = {Ki , Li , Mi }. Der Klauselmenge wird ein Graph (V, E) wie folgt zugeordnet: Sk S ( ist als Vereinigung von Multimengen aufzufassen) gehören zu verschiedenen Klauseln E = (v, w) ∈ V × V | v, w und sind nicht komplementär V = i=1 ci Man sieht leicht: F ist erfüllbar gdw. (V, E) enthält Clique der Größe k. 4.3 Pseudopolynomielle Algorithmen An dieser Stelle wird noch einmal auf die Lösung des Rucksackproblems 3.2.5 eingegangen. Für dieses Problem werden Algorithmen angegeben, die polynomiell in der Rucksackgröße G und der Anzahl der Objekte n sind, unter der Voraussetzung, daß der Wert der Objekte höchstens polynomiell in n ist. 22 Bei der Reduktion von Sat(3) ≤p Knapsack wurde aber gerade in den Gewichten und der Anzahl der Objekte die Schwierigkeit des Problems versteckt“. ” Solche Algorithmen heißen pseudopolynomiell. Beim Cliquenproblem ist diese Differenzierung gegenstandslos, da in der Kodierung des Problems keine großen Zahlen vorkommen. Im Gegensatz zum Rucksackproblem existiert für das Problem des Handelsreisenden kein pseudopolynomieller Algorithmus. 23 5 Beispiele von Problemtransformationen (Reduktionen) Hinweis: Bei jeder der nachfolgend angegebenen Konstruktionen ist zu beachten, daß die angegebenen Zeitkosten als Kosten der Arbeit einer Turingmaschine auf den in der Turingmaschine dargestellten Daten der Transformationen zu verstehen sind. 5.1 Reduktion Sat ≤p Clique Instanzen des Problems Sat seien als endliche Mengen von Klauseln dargestellt. Klauseln seien als endliche Mengen von aussagenlogischen Literalen dargestellt. Ein aussagenlogisches Literal ist eine aussagenlogische Variable oder deren Negation. Eine Klausel wird als Disjunktion ihrer Literale interpretiert. Eine Menge von Klauseln wird als Konjunktion ihrer Elemente interpretiert. Definition: Als aufspannende Paarung für eine Menge F aussagenlogischer Klauseln bezeichnet man eine Menge von Mengen {L, ¬L} von Literalen mit folgender Eigenschaft: (1) L und ¬L kommen in verschiedenen Klauseln vor ( Paarung“). ” (2) Stellt man sich die Klauselmenge ausmultipliziert“ vor, d.h. als Dis” junktion von Konjunktionen von Literalen, kann man feststellen, daß jede dieser Konjunktionen ein Literal gemeinsam mit seiner Negation enthält. Zwei Literale, von denen eines die Negation des anderen ist, werden als komplementär bezeichnet. Beobachtung 1: Eine endliche Menge aussagenlogischer Klauseln ist genau dann erfüllbar, wenn für sie keine aufspannende Paarung existiert. Konstruktion der Reduktion: Gegeben sei eine Klauselmenge M = {C0 , . . . , Cn−1 }. Für diese Klauselmenge wird ein Graph G(M ) mit der Knotenmenge C0 × {0} ∪ . . . ∪ Cn−1 × {n − 1} konstruiert. Ein Paar {(L, l), (K, m)} gehört zur Kantenmenge von G(M ) gdw. L und K nicht komplementär sind und l 6= m gilt. Beobachtung 2: In G(M ) existiert eine Clique der Größe n genau dann, wenn für die Klauselmenge M keine aufspannende Paarung existiert. Beobachtung 3: Die Kosten für die Konstruktion des Graphen G(M ) sind polynomial. Aus den Beobachtungen 1, 2 und 3 folgt, daß mit der Konstruktion von G die behauptete Reduzierbarkeit nachgewiesen ist. 24 5.2 Reduktion Sat ≤p Sat(3) Es wird eine Konstruktion angegeben, die jeder Menge M von aussagenlogischen Klauseln eine Menge aussagenlogischer Klauseln T (M ) zuordnet, die folgende Eigenschaften hat: (1) T (M ) ist genau dann erfüllbar, wenn M erfüllbar ist. (2) Jede Klausel in T (M ) besteht aus höchstens 3 Literalen. (3) Die Kosten für die Konstruktion von T (M ) sind polynomial in der Größe von M . Um T (M ) für eine Klauselmenge M zu konstruieren, wird folgender Transformationsschritt solange wiederholt, bis eine Instanz des Problems Sat(3) erhalten wurde: Wenn die zu betrachtende Klauselmenge M eine Klausel enthält, die mehr als 3 Elemente enthält, wird folgende Ersetzung durchgeführt: Es sei n die maximale Länge von Klauseln in M . Es wird eine Klausel C der Länge n ausgewählt. Seien L und K zwei Literale in C und J eine Aussagenvariable, die in keiner der Klauseln in M vorkommt. Dann ersetzt man in M die Klausel C durch die Klauseln (C \ {L, K}) ∪ {J} und {L, K, ¬J}. Die Ersetzung hat keinen Einfluß auf die Erfüllbarkeit. Für jedes n ∈ N mit 3 < n gilt, daß nach endlich vielen Ersetzungsschritten alle Klauseln der Länge n durch kürzere ersetzt sind. Nach endlich vielen Ersetzungsschritten ist die maximale Länge von Klauseln nicht größer als 3. Damit hat die Transformation T die geforderten Eigenschaften. 5.3 Reduktion Sat(3) ≤p Knapsack Sei C eine Menge von Klauseln {C1 , . . . , Cm }, in denen jeweils höchstens 3 Aussagenvariablen vorkommen. Die Menge der in Klauseln von C vorkommenden Aussagenvariablen sei {V1 , . . . , Vn }. Es wird in Polynomialzeit folgende Instanz K(C) des Rucksackproblems konstruiert, die die erforderlichen Eigenschaften hat: Anzahl der Objekte: Das Problem K(C) hat 2m + 2n Objekte. Gewichte und Nutzwerte: Gewicht und Nutzwert eines jeden Objekts sind gleich. Sie werden durch eine m + n-stellige Dezimalzahl dargestellt. Vereinfachend wird zugelassen, daß in der Notation dieser Zahl führende Nullen vorkommen. 25 Die Wahl der letzten n Stellen des Nutzwerts der Objekte und des zu erzielenden Gesamtwerts sichern die Konsistenz und die Definiertheit der Belegung. Die Wahl der ersten m Stellen des Nutzwerts der Objekte und des zu erzielenden Gesamtwerts sichern die Erfülltheit der Formel durch die durch die gewählten Objekte kodierte Belegung. Es werden vier Arten von Objekten unterschieden. Es gibt je m der ersten und der zweiten Art sowie je n der dritten und der vierten Art. Das Gewicht des i-ten Objektes der ersten Art kodiert das nichtnegierte Vorkommen der i-ten Aussagenvariablen in der k-ten Klausel durch eine 1 an der k-ten Stelle der Zahldarstellung des Gewichts. An den restlichen der m ersten Stellen steht eine 0. Das Gewicht des i-ten der m Objekte der zweiten Art kodiert das negierte Vorkommen der i-ten Aussagenvariablen in der k-ten Klausel durch eine 1 an der k-ten Stelle der Zahldarstellung des Gewichts. An den restlichen der m ersten Stellen steht eine 0. Bei beiden genannten Objektarten wird in der Stelle m + j in der Darstellung des Gewichts des j-ten Objekts der betreffenden Art mit einer 1 die Nummer der Variablen (also xj ) dargestellt, deren Vorkommen repräsentiert wird. Die übrigen der n letzten Ziffern sind null. Die Zahldarstellung des Gewichts des i-ten der m Objekte der dritten Art hat eine 1 an der i-ten Stelle und sonst Nullen. Die Zahldarstellung des Gewichts des i-ten der m Objekte der vierten Art hat eine 2 an der i-ten Stelle und sonst Nullen. Gesamtwert: Der zu erzielende Gesamtwert wird durch eine m + n-stellige Dezimalzahl A mit folgender Form ausgedrückt: Jede der m ersten Ziffern von A ist eine 4. Jede der n restlichen Ziffern von A ist eine 1. 5.4 Reduktion Sat(3) ≤p DHC Sei C eine Menge von Klauseln {C1 , . . . , Cm }, in denen jeweils höchstens 3 Aussagenvariablen vorkommen. Die Menge der in Klauseln von C vorkommenden Aussagenvariablen sei {V1 , . . . , Vn }. Nachfolgend wird eine Instanz D(C) des Problems des Hamiltonkreises im gerichteten Graphen konstruiert. Die Kosten der Konstruktion sind polynomial. Knotenmenge: Der Graph hat n Knoten, die die Variablen widerspiegeln (kurz: Variablenknoten), sowie die jeweils 6 Knoten von m Teilgraphen ( Komponenten“), die die Klauseln widerspiegeln. ” Kantenmenge: Jeder der genannten Teilgraphen hat 3 Knoten ( Eingangs” knoten“), in die je 1 Kante von außerhalb des Teilgraphen hineinführt, 26 und 3 weitere Knoten ( Ausgangsknoten“), aus denen je 1 Kante nach ” außerhalb des Teilgraphen führt. Die Eingangsknoten sind durch weitere Kanten zu einem Zyklus verknüpft, analog die Ausgangsknoten, allerdings mit gegenläufiger Orientierung. Außerdem führt von jedem Eingangsknoten eine Kante zu genau einem Ausgangsknoten. Diese Konstruktion widerspiegelt, daß die dargestellte Klausel durch 1, 2 oder 3 ihrer Literale erfüllt werden kann. Ein Hamilton-Kreis kann 1, 2 oder 3 mal in den Teilgraphen ein- und wieder austreten. Widerspiegelung der Literale in Klauseln: In den die Klauseln darstellenden Komponenten widerspiegelt jedes Paar bestehend aus einem Eintrittsund einem mit ihm direkt verbundenem Austrittsknoten ein Literal der Klausel. Widerspiegelung der Konsistenz der Belegung: Von jedem der Variablenknoten führen genau zwei Kanten heraus. Diese sind Beginn je eines Kantenzugs, der die nichtnegierten bzw. die negierten Vorkommen der betreffenden Variablen in Klauseln widerspiegelt. Hier wird der Kantenzug für die nichtnegierten Variablenvorkommen besprochen. Analog können die negierten Vorkommen von Variablen widergespiegelt werden. Beginn des Kantenzugs: Eine der genannten Kanten führt zum entsprechenden Eingangsknoten des die erste Klausel darstellenden Teilgraphen, in der die betreffende Variable nichtnegiert vorkommt, soweit diese Variable nichtnegiert vorkommt. Kommt sie nicht nichtnegiert vor, führt die genannte Kante zum die nächste Variable darstellenden Knoten, soweit es sich nicht um die letzte Variable handelt. In letzterem Fall führt die Kante zum die erste Variable darstellenden Knoten. Fortsetzung des Kantenzugs: Der Kantenzug wird von einem Eingangsknoten einer Komponente über den entsprechenden Ausgangsknoten fortgesetzt. Von jenem führt eine Kante zum der betreffenden Variablen zugeordneten Eingangsknoten der nächsten, noch nicht von dem Kantenzug berührten Komponente. Sollte eine solche Komponente nicht existieren, führt die Kante zum die nächste Variable darstellenden Knoten. Sollte die Variable die letzte sein, führt die Kante zum die erste Variable darstellenden Knoten. Interpretation eines Hamiltonkreises in D(C) als Belegung in C: 27 Abhängig von der Kante, über die ein Hamiltonkreis einen Variablenknoten verläßt, wird die darstellte Variable mit 0 oder 1 belegt. Übungsbeispiel: (x1 ∨ ¬x2 ∨ x3 ) ∧ (¬x1 ∨ x2 ∨ ¬x4 ) ∧ (¬x1 ∨ ¬x2 ∨ ¬x3 ) 5.5 Reduktion DHC ≤p HC Gegeben sei ein gerichteter Graph G = (V, E) mit Knotenmenge V und Kantenmenge E. Es wird ein ungerichteter Graph U (G) = (V × {0, 1, 2} , D) definiert: Für jede Kante (v, w) ∈ E gilt {(v, 1), (w, 2)} ∈ D. Für jeden Knoten v ∈ V gilt {{(v, 1), (v, 0)} , {(v, 2), (v, 0)}} ⊆ D. Für jede Kante {(v, n), (w, m)} ∈ D gilt eine der folgenden Bedingungen: (1) v = w, n = 1, m = 0 und v ∈ V , (2) v = w, n = 2, m = 0 und v ∈ V oder (3) n = 1, m = 2 und (v, w) ∈ E. Man kann nachweisen, daß in U (G) genau dann ein ungerichteter Hamiltonkreis existiert, wenn G einen gerichteten Hamiltonkreis hat. Die Kosten der Transformation U sind polynomial. 5.6 Reduktion HC ≤p ∆T SP Die Reduktion beruht darauf, für einen gegebenen gerichteten Graphen eine Kantenbewertung zu definieren, die jeder Kante die Länge 1 zuordnet. Dann existiert in einem Graphen mit n Knoten ein Hamiltonkreis genau dann, wenn es eine Rundreise der Länge n gibt. 28 6 Quantencomputer Die in den vorstehenden Kapiteln besprochen Modelle der Berechenbarkeit beruhen auf der Vorstellung, daß während der Ausführung eines Algorithmus von einem diskreten Zustand zum anderen übergegangen wird. Dies entspricht der Vorstellung vom Rechnen mit Papier und Bleistift, von der Argumentation in einem Beweis wie der Abarbeitung mit einem üblichen Rechner. Betrachtet man die physikalischen Grundlagen heutiger Rechentechnik, so stellt man fest, daß die bei deren Realisierung ausgenutzten physikalischen Prinzipien viel komplexere Zusammenhänge kennen. Im Quantencomputing wird der spannende Versuch unternommen, diese Prinzipien direkt für in Algorithmen einzusetzen. Interessenten werden auf [KSV02] verwiesen. Hier wird dem klassischen Algorithmusmodell ein Berechnungsmodell für Quantencomputer gegenübergestellt. 29 7 7.1 Berechenbarkeit und Aufzählbarkeit These von Church Alle bislang bekannten Formalisierungen der intuitiven Begriffe der Berechenbarkeit und Entscheidbarkeit führen zur gleichen Klasse von Funktionen bzw. Sprachen. Nach dem Logiker Alonzo Church ist die (nicht beweisbare, da informale) These benannt, daß alle Präzisierungen der Begriffe Berechenbarkeit und Entscheidbarkeit gleich mächtig sind. Mit der Definition der while-Programme in Abschnitt 1.2.5 kann also folgende Präzisierung der intuitiven Begriffe der Berechenbarkeit und Entscheidbarkeit vorgenommen werden. Eine Präzisierung der Begriffe berechenbar“ und entscheidbar“ ” ” Eine Funktion ist genau dann intuitiv berechenbar, wenn sie mit einem whileProgramm (vgl. Abschnitt 1.2.5) berechenbar ist. Eine Menge X natürlicher Zahlen ist genau dann intuitiv entscheidbar, wenn sie while-Programmen entscheidbar ist. 7.2 Unentscheidbarkeitsresultate In diesem Abschnitt werden wichtige Eigenschaften von Programmen hinsichtlich ihrer Entscheidbarkeit betrachtet. Es wird sich zeigen, daß die dynamischen Eigenschaften von Programmen nicht entscheidbar sind. Als Algorithmenmodell werden while-Programme betrachtet. Diese lassen sich die anderen betrachteten Algorithmenmodelle simulieren und umgekehrt. Um den Umfang der Definition klein zu halten, werden nur einfachste Anweisungen betrachtet. Als Übung kann man ebenfalls zeigen, daß die in Definition 1.1 eingeführten Anweisungen von Registermaschinen durch while-Programme simuliert werden können. Man beachte, daß anders als in Kapitel 2 keine Beschränkungen hinsichtlich der Kosten der Simulation bestehen. Zunächst wird als technisches Hilfsmittel eine berechenbare Kodierungsfunktion eingeführt, die while-Programmen eineindeutig natürliche Zahlen zuordnet. Durch diese Kodierung können while-Programme (genauer: ihre Kodierung als natürliche Zahlen) selbst als Argumente von Funktionen über natürlichen Zahlen aufgefaßt werden. Bei der Kodierung wird die Eindeutigkeit der Darstellung natürlicher Zahlen durch Produkte von Primzahlpotenzen ausgenutzt. Diese Art der Kodierung geht auf Kurt Gödel zurück. Er benutzte eine derartige Kodierung in seinem Nachweis der Nichtaxiomatisierbarkeit der Arithmetik. Aus dieser folgt der Satz von Church über die Unentscheidbarkeit der Prädikatenlogik erster Stufe (vgl. [Lyn66]). 30 Definition 7.1 (Gödelisierung von while-Programmen) Es wird eine Basis mit Mengen von Funktionsanweisungen F M = {vor, nach} und von Testanweisungen T M = {null} angenommen. Diese Anweisungen beziehen sich jeweils auf eine Speicherzelle. nachi ersetzt den Inhalt der i-ten Speicherzelle durch dessen Nachfolger, vori berechnet den Vorgänger, soweit er existiert, und läßt den Wert unverändert andernfalls. nulli prüft, ob der Inhalt der i-ten Speicherzelle 0 ist oder nicht, und liefert 1 oder 0 als Wert bei Erfülltheit bzw. Nichterfülltheit der Bedingung. ΦF M,T M bezeichnet die Menge der mit diesen Anweisungen formulierbaren while-Programme. Die Funktion code : ΦF M,T M → N wird wie folgt definiert. Für alle P ∈ ΦF M,T M sei 20 21 ∗ 3i 2 i 2 ∗3 0 00 23 ∗ 3i ∗ 5code(P ) ∗ 7code(P ) code(P ) = 0 24 ∗ 3i ∗ 5code(P ) 0 25 ∗ 3i ∗ 5code(P ) 26 ∗ 3code(P 0 ) ∗ 5code(P 00 ) ... ... ... ... ... ... ... P P P P P P P = = nachi = vori = if nulli then P 0 else P 00 fi = while nulli do P 0 od = while not nulli do P 0 od = P 0 ; P 00 2 Beispiel 7.1 6 18 12 code(while not null1 do nach2 ; vor1 od) = 25 ∗ 31 ∗ 52 ∗3 ∗5 code−1 (241) ist nicht definiert. Die in Definition 7.1 eingeführte Funktion code ist injektiv aber nicht surjektiv. Für die folgenden Überlegungen ist es notwendig, eine bijektive Kodierfunktion zu haben. Diese und ihre Umkehrfunktion werden nun konstruiert. Da für natürliche Zahlen der Primzahltest und die Zerlegung in Produkte von Primzahlpotenzen berechenbar sind, kann auch entschieden werden, ob eine natürliche Zahl Kod eines Programms ist. Man kann damit voraussetzen: Die Menge code(Φ(F M,T M ) ) ist entscheidbar. Das Programm, welches die charakteristische Funktion der Menge code(Φ(F M,T M ) ) berechnet, wird mit R(i) := iscode(R(j)) notiert. Es wird nun eine bijektive Nummerierung der Programme in ΦF M,T M definiert. Die Idee beruht darauf, daß man sich die Elemente aus ΦF M,T M nach der Größe ihrer Gödelnummer in einer Folge angeordnet vorstellen kann. 31 Einem Programm P wird nun als Wert der Funktion surcode(P ) seine Position in dieser Folge zugeordnet. surcode(P ) wird unter Verwendung der Hilfsfnktion ncode : N → N durch die folgenden Gleichungen definiert3 : ∀n ∈ N : ncode(n) = | m | m ∈ code(Φ(F M,T M ) ), m < n | ∀P ∈ ΦF M,T M : surcode(P ) = ncode(code(P )) (10) (11) Die Funktion surcode hat damit die folgende Eigenschaft. ∀P ∈ ΦF M,T M : surcode(P ) = | m | m ∈ code(Φ(F M,T M ) ), m < code(P ) | (12) Ein Programm zur Berechnung der Hilfsfunktion ncode kann aus dem in Abbildung 3 dargestellten Programm konstruiert werden. Dieses erwartet in Speicherzelle 0 das Argument und legt das Ergebnis in Speicherzelle 1 ab. Startet das Programm in Abbildung 3 unter der Annahme, daß 0 der Inhalt der Speicherzelle 1 ist, hat die Schleife die Invariante: Die Summe des Inhalts von Speicherzelle 1 und der Anzahl der Programme, deren Code kleiner als der Inhalt von Speicherzelle 0 ist, gleicht dem zu berechnenden Wert. while not null0 do R(2) := iscode(R(0)); if null2 then else nach1 fi; vor0 od Abbildung 3: Ein Programm zur Berechnung der Funktion ncode Die zu ncode inverse Funktion ncode−1 kann durch das in Abbildung 4 dargestellte Programm berechnet werden. Es arbeitet nach dem Prinzip Generieren ” und Testen“. Nach der Initialisierung mit den ersten 3 Anweisungen generiert es mit der Anweisung nach3 in der zweiten Schleife fortlaufend Zahlen und prüft mit den restlichen Anweisungen des Körpers dieser Schleife, ob die jeweils zuletzt generierte Zahl Code eines Programm ist. Ist n der Inhalt des Registers 0 bei Aufruf des Programms, dann gilt nach der Initialisierung jeweils im Moment der Testauswertung der zweiten Schleife die folgende Bedingung: In der Speicherzelle 2 ist die Anzahl der Programme gespeichert, deren Gödelnummer größer als der Inhalt von R(3) und nicht größer als die des n-ten Programms in der nach Gödelnummern geordneten Folge der Programme ist. 3 |M | bezeichnet die Mächtigkeit der Menge M . 32 Gewissermaßen wird in der Testbedingung der zweiten Schleifenanweisung gefragt: Wieviele Programmcodes haben wir noch zu generieren?“ Der jeweils ” nächste Testkandidat wird in der nachfolgenden Anweisung nach3 generiert. R(2):=R(0); nach2 ; while not null3 do vor3 od; while not null2 do nach3 R(0):=R(3) R(1) := iscode(R(0)); if null1 then else vor2 fi; od; R(1):=R(3) Abbildung 4: Ein Programm zur Berechnung der Funktion ncode−1 7.2.1 Das Selbstanwendbarkeitsproblem Das Selbstanwendbarkeitsproblem (SAP) besteht darin zu entscheiden, ob ein Programm terminiert, wenn es auf seine Kodnummer als Eingabe angewendet wird. Formal wird das Selbstanwendbarkeitsproblem durch die Menge SAP derjenigen natürlichen Zahlen definiert, die Kodnummer eines Programmes sind, welches terminert, wenn es auf seine Kodnummer als Eingabe angewendet wird. Definition 7.2 SAP = p | QM (p) ist definiert für Q = surcode−1 (p) 2 Satz 7.1 Das Selbstanwendbarkeitsproblem ist nicht entscheidbar. Beweis. Indirekter Beweis. Die Annahme, daß das Selbstanwendbarkeitsproblems entscheidbar ist, also ein Programm Q existiert, 33 dessen semantische Funktion χSAP ist, wird zum Widerspruch geführt. Für die charakteristische Funktion χSAP des Selbstanwendbarkeitsproblems gilt nach Definition 7.2: χSAP (p) = 1 . . . QM (p) ist definiert für Q = surcode−1 (p) 0 . . . sonst Angenommen Q sei ein Programm Q ∈ ΦF M,T M , welches χSAP berechnet, d.h. 1 . . . QM (p) ist definiert für Q = surcode−1 (p) QM (p) = 0 . . . sonst Weiter sei R das Programm Q; while not null1 do od Die semantische Funktion des Programms R erfüllt die Gleichung nicht def. . . . QM (p) ist definiert für Q = surcode−1 (p) RM (p) = 0 . . . sonst (13) Es wird nun die Selbstanwendung von R auf das Argument surcode(R) betrachtet und die folgende Fallunterscheidung durchgeführt: Fall 1: RM (surcode(R)) ist nicht definiert. Wegen surcode(R) = ncode(code(R)) (11) und Gleichung (13) müßte RM (surcode(R)) dann definiert sein. Widerspruch. Fall 2: RM (surcode(R)) ist definiert. Wegen surcode(R) = ncode(code(R)) (11) und Gleichung (13) müßte RM (surcode(R)) dann nicht definiert sein. Widerspruch. q.e.d. 7.2.2 Auf das Selbstanwendbarkeitsproblem reduzierbare Probleme Weitere Probleme sind auf das Selbstanwendbarkeitsproblem reduzierbar. Die Bedeutung dieser Aussage wird zunächst prazisiert. Definition 7.3 Sind M1 , M2 ⊆ N und ist f eine totale und berechenbare Funktion f : N → N mit 34 ∀n ∈ N : n ∈ M1 ↔ f (n) ∈ M2 , (14) dann heißt M1 mittels f auf M2 reduzierbar. 2 (Notation: M1 ≤f M2 ) Satz 7.2 Sind f : N → N und g : N → N totale und berechenbare Funktionen, dann gilt dies auch für ihre Verkettung g ◦ f . Beweis. Angenommen f und g seien semantische Funktion von Programmen P und Q. Dann können P und Q leicht so zu P 0 und Q0 modifiziert werden, daß sie keine gemeinsamen Hilfsregister benutzen und Q0 seine Eingabe dem Register entnimmt, in das P 0 seine Ausgabe schreibt. g ◦ f ist dann semantische Funktion des Programms P ; Q. q.e.d. Satz 7.3 Sind M1 , M2 ⊆ N, gilt M1 ≤f M2 und ist M2 entscheidbar, dann ist auch M1 entscheidbar. Beweis. Angenommen χM2 sei total und berechenbar. Wegen Gleichung (14) in Definition 7.3 gilt χM1 = χM2 ◦ f . Mit Satz 7.2 ist χM1 ebenfalls total und berechenbar. q.e.d. Mit dem vorstehenden Satz beweist man leicht, daß die Relation der Reduzierbarkeit transitiv ist. Satz 7.4 Sind M1 , M2 , M3 ⊆ N, f und g totale und berechenbare Funktionen und gelten M1 ≤f M2 und M2 ≤g M3 , dann gilt auch M1 ≤g◦f M3 . Satz 7.5 Für M ⊆ N ist M entscheidbar, gdw. auch M entscheidbar ist. 35 Der Satz von Rice sagt verallgemeinernd, daß alle nichttrivialen Eigenschaften von while-Programmen, die auf Registermaschinen interpretiert werden, unentscheidbar sind. Satz 7.6 (Rice) Es sei F die Menge der berechenbaren Funktionen. Für jede Menge F ⊂ F mit ∅ 6= F 6= F ist unentscheidbar, ob für ein gegebenes P ∈ ΦF M,T M für dessen semantische Funktion PM ∈ F gilt. Beweis. Seien F und F wie in der Voraussetzung des Satzes gegeben. Es sei RICE(F ) = p | für Q = surcode−1 (p) gilt : QM ∈ F . Fall 1: Wenn ∅ ∈ F , dann sei T (F ) = RICE(G) und G = F . Fall 2: Wenn ∅ 6∈ F , dann sei T (F ) = RICE(F ) und G = F . Dann gilt ∅ 6∈ G und T (F ) ist entscheidbar gdw. RICE(F ) entschiedbar ist. Es genügt also, die Entscheidbarkeit von T (F ) zu widerlegen. Widerspruchsbeweis. Konstruktion einer Reduktionsfunktion. Sei Q ein Programm mit einer von der leeren Funktion verschiedenen semantischen Funktion h ∈ G. Für jedes Programm P ∈ ΦF M,T M sei R(0):=p das Programm, welches den Kod p = surcode(P) in das Register 0 schreibt. Es sei nun das Programm R(P) wie folgt definiert: R(i):=R(0); R(0):=p; P; R(0):=R(i); R(i):=0; Q Man sieht, daß R(P)M = QM genau dann gilt, wenn p ∈ SAP . Damit gilt SAP ≤f T (F ) für die Funktion f : N → N mit ∀p : f (p) = surcode(R(surcode−1 (p))) q.e.d. Die Tabelle 7.2.2 gibt einen Überblick über weitere unentscheidbare Probleme und die entsprechenden Reduktionen, mit deren Hilfe die Unentscheidbarkeit bewiesen werden kann. 36 Name Reduktion HP SAP ≤f HP Beschreibung Halteproblem: Terminiert Programm P bei Eingabe? HP = m | m = b2 (p, n), für P = surcode−1 (p) : PM (n)ist definiert ∀n ∈ N : f (p) = b2 (p, p) NHP SAP ≤g N HP UDP SAP ≤g U DP TP SAP ≤g T P Null-Halteproblem: Terminiert Programm P bei Eingabe 0? N HP = p | für P = surcode−1 (p) : PM (0)ist definiert Undefiniertheitsproblem: Terminiert Programm P für keine Eingabe? U DP = p | für P = surcode−1 (p) : (¬∃n : PM (n)ist definiert) Totalitätsproblem: Ist Programm P total? T P = p | für P = surcode−1 (p) : (∀n : PM (n)ist definiert) ∀p ∈ N : g(p) = surcode(R(0) := p; surcode−1 (p)) Äquivalenzproblem: Sind semantische Funktionen von P und Q gleich? für P = surcode−1 (p), Q = surcode−1 (q) : 2 U DP ≤h EQP EQP = b (p, q) | PM = QM ∀n ∈ N : h(p) = b2 (p, surcode(R)) EQP für R= while null0 do od; while not null0 do od Tabelle 1: Unentscheidbare Problem und ihre Reduktionsfunktionen 37 7.3 Rekursive Aufzählbarkeit Am Ende des letzten Abschnitts wurden mehrere interessante unentscheidbare Mengen beschrieben. Wir wenden uns nun der rekursiven Aufzählbarkeit von Mengen zu. Diese Eigenschaft ist schwächer als die Entscheidbarkeit, erlaubt aber zumindest, daß alle Elemente einer rekursiv aufzählbaren Menge effektiv konstruiert werden können. Die folgenden Begriffe werden auf den Begriff der Berechenbarkeit gestützt. Dabei wird jedoch nicht mehr auf ein bestimmtes Maschinenmodell abgezielt. Definition 7.4 Eine Menge M natürlicher Zahlen heißt genau dann rekursiv aufzählbar, wenn es eine berechenbare totale Funktion f : N → N gibt, so daß M = f (N) gilt. 2 Der Zusammenhang von rekursiver Aufzählbarkeit und Entscheidbarkeit wird durch den nachfolgend definierten Begriff der Semi-Entscheidbarkeit (Definition 7.5) und dessen Äquivalenz mit dem Begriff der rekursiven Aufzählbarkeit (Definition 7.4) deutlich. Definition 7.5 Eine Menge M natürlicher Zahlen ist genau dann semi-entscheidbar, wenn es eine (nicht notwendig überall definierte) berechenbare Funktion f : N → N gibt, so daß ∀x ∈ N : f (x) = 1 ↔ x ∈ M gilt. 2 Lemma 7.1 Eine Menge M natürlicher Zahlen ist genau dann semi-entscheidbar, wenn sie rekursiv aufzählbar ist. Beweis. →: Angenommen, Menge M sei rekursiv aufzählbar. Sei f : N → N Funktion mit f (N) = M . Sei Q Programm, dessen semantische Funktion f ist. Das nachfolgend angegebene Programm P implementiert die Funktion gemäß Definition 7.5. R(3) := R(0); R(0) := 0; //Initialisiere Nummer des Testkandidaten R(2) := 0; //Initialisiere Register fuer Testergebnis whilenull2 do Q; //Erzeuge neuen Kandidaten, Ergebnis in R(1) if R(3) = R(1) then R(2) := 1 else fi; nach0 od; R(1) := 1; R(3 := 0; R(2) := 0 38 ←: Angenommen, M ist semi-entscheidbar. P sei Programm, dessen semantische Funktion f ist mit ∀x ∈ N : f (x) = 1 ↔ x ∈ M. Problem: Die Termination von P ist nicht gesichert. Aus P wird ein Programm Q konstruiert, welches terminiert und dessen semantische Funktion die Elemente von M rekursiv aufzählt. Dazu wird eine neue Variable eingeführt, die als Befehlszähler genutzt wird. Dieser wird durch zusätzliche Anweisungen bei jedem Schleifentest geprüft. Ist er größer als Null, wird er verringert. Ist er kleiner, wird der Schleifenkörper nicht mehr ausgeführt. Das modifizierte Programm wird in den Körper einer äußeren while-Schleife eingebettet, in der systematisch alle Paare von Argumenten für die Funktion f und zulässigen Schrittzahlen probiert werden. q.e.d. Satz 7.7 Eine Menge M natürlicher Zahlen ist genau dann entscheidbar, wenn M und N \ M semi-entscheidbar sind. 7.4 Universelle Funktionen Definition 7.6 Eine berechenbare Funktion F : Nn+1 → N heißt universell für eine Klasse von n-stelligen berechenbaren Funtionen F ⊆ Rn , falls es für jede Funktion f ∈ F eine Zahl k ∈ N gibt, so daß λx1 , . . . , xn .F (x1 , . . . , xn , k) = f gilt. Ein while-Programm heißt universell für eine Klasse von berechenbaren Funktionen F ⊆ Rn , wenn seine semantische Funktion universell für die Klasse F ⊆ Rn ist. 2 Satz 7.8 Es sei n positive ganze Zahl. Es gibt keine totale Funktion, die für die Klasse der n-stelligen totalen berechenbaren (d.h. rekursiven) Funktionen universell ist. Beweis. Durch Diagonalverfahren: Angenommen, f : Nn+1 → N wäre eine universelle Funktion für die Klasse der n-stelligen totalen berechenbaren Funktionen. f 39 ist total und berechenbar und P sei ein Programm, dessen semantische Funktion f ist. Man kann P zu einem Programm Q erweitern, welches die folgende semantische Funktion hat g(x1 , . . . , xn ) = f (x1 , . . . , xn , xn ) + 1 (15) g ist ebenfalls total. Da f universell für die Klasse der n-stelligen totalen berechenbaren Funktionen ist, gibt es ein i ∈ N, so daß λx1 , . . . , xn .f (x1 , . . . , xn , i) = g. Das führt für xn = i zum Widerspruch zu 15. q.e.d. Satz 7.9 Für jede positive ganze Zahl n gibt es eine universelle Funktion für die Klasse der n-stelligen berechenbaren (d.h. partiell rekursiven) Funktionen. Beweis. Skizze zur Konstruktion des universellen Programms: Programme seien durch ihre Gödelnummer kodiert. Diese wird als das (n + 1)-te Argument einer universellen Funktion aufgefaßt, die semantische Funktion der zu konstruierenden universellen Maschine ist. Die Konstruktion der universellen Maschine erfolgt in folgenden Schritten. (1) Primzahltest. (2) Zerlegung natürlicher Zahlen in Produkte von Primzahlpotenzen. (3) Dekodierfunktion; ermöglicht die Dekodierung der aktuellen Anweisung. (4) Interpreter. q.e.d. 40 8 Endliche Automaten Die Verarbeitung von Texten ist ein wichtiger Teil der Informatik. Ein zentraler Begriff ist der der formalen Sprache. Programmmiersprachen können als anschauliches Beispiel dienen. Überwiegend erfolgt Kommunikation zwischen Mensch und Maschine bzw. zwischen Maschinen über Ausdrücke, die Wörter einer formalen Sprache sind. Formale Sprachen sind meist unendlich, es ist daher wichtig, endliche Beschreibungsmittel für formale Sprachen bereitzustellen. Wichtige algorithmische Probleme sind das Erkennen der Zugehörigkeit von Wörtern zu einer Sprache, das Erzeugen von Wörtern einer Sprache und die Interpretation der Wörter einer Sprache. Hier werden zu diesem Zweck endliche Automaten bereitgestellt und die mit diesem Ausdrucksmittel beschreibbaren Sprachen charakterisiert. 8.1 Formale Sprachen Definition 8.1 Sei eine nichtleere Menge Σ gegeben. Nachfolgend werden die Menge Σ Alphabet und ihre Elemente Zeichen genannt. Eine endliche Folge von Zeichen eines Alphabets Σ heißt Wort über Σ. Die Menge aller Wörter über Σ wird mit Σ∗ notiert. Eine Teilmenge von Σ∗ heißt Sprache über Σ. 2 Für eine kompakte Notation werden folgende Abkürzungen eingeführt: Wörter werden als Folgen ihrer Zeichen ohne Trennzeichen notiert. Gegeben sei ein Alphabet Σ, ein Zeichen a ∈ Σ und eine natürliche Zahl n ∈ N. Dann bedeuten a0 die leere Zeichenreihe (auch ε notiert) und an die Zeichenreihe a . . a}. Mit | .{z n-fach Σ+ wird die Menger der nichtleeren Wörter bezeichnet, d.h. Σ+ = Σ∗ \ {ε}. Weitere Notationen: Zeichen eines Alphabets Wörter über einem Alphabet Sprachen a, b, c, . . . x, y, z, . . . A, B, C, . . . Für Wörter sind folgende Operationen und Relationen erklärt. Verkettung der Wörter x = a1 . . . an und y = b1 . . . bm ist das Wort xy = a1 . . . an b1 . . . bm . Teilwort. x ist Teilwort des Wortes y, wenn es Wörter z1 und z2 gibt mit y = z1 xz2 . In Zeichen x v y. Präfix. x ist Präfix des Wortes y, wenn es ein Wort z mit y = xz gibt. Suffix. x ist Suffix des Wortes y, wenn es ein Wort z mit y = zx gibt. 41 Anmerkung: x v y genau dann, wenn es z1 und z2 gibt mit x Suf f ix z1 und z1 P raef ix y sowie x P raef ix z2 und z2 Suf f ix y. Beispiel 8.1 Sei Σ = {a, b, c, d, e, f, g}. Folgende Mengen dienen als Beispiele für Sprachen. Sie sind nach aufsteigender Komplexität ihrer Beschreibung geordnet. (1) L1 = {ab, ba} (2) L2 = {abn a | n ∈ N} (3) L3 = cx1 cx2 . . . cxn dn | n ∈ N, 0 < n, x1 , x2 , . . . , xn ∈ {a}+ (4) L4 = {x1 ayx2 bx3 yx4 | y ∈ Σ+ , x1 , x2 , x3 , x4 ∈ Σ∗ , ay 6v x1 x2 } 8.2 Endliche Automaten Zur Motivation bzw. betreffs Anwendungen von endlichen Automaten: • Beschreibung von Schaltwerken: vgl. [Weg93] S. 86. Mit dieser Anwendung ist der weiter unten definierte Begriff des MealyAutomaten motiviert. • Als Akzeptoren von formalen Sprachen: vgl. [Weg93] S. 90-92 Mit dieser Anwendung wird der nachfolgend eingeführte deterministische endliche Automat (DEA) motiviert. In dieser Vorlesung werden wir vorwiegend an Mechanismen zur Beschreibung von formalen Sprachen interessiert sein. Deshalb wird vor allem mit DEA gearbeitet. 42 Beispiel: endlicher Automat A1 = (Q, Σ, q0 , δ, F ): a - 0 1 b @ a b@ Zustandsmenge: R @ 2 a,b 6 Q = {0, 1, 2} Eingabealphabet: Σ = {a, b} Startzustand: q0 = 0 Zustandsüberführungsfunktion: δ: 0 1 2 Endzustandsmenge: a 1 2 2 b 2 0 2 F = {0} von A akzeptierte Wörter: , ab, abab, ababab, ... von A nicht akzeptierte Wörter: a, aba, aab, abbb, ... es gilt: δ ∗ (0, abab) = 0, δ ∗ (0, a) = 1, δ ∗ (1, ab) = 2, ... Definition 8.2 (1) Ein Tupel A = (Q, Σ, q0 , δ, F ) heißt deterministischer endlicher Automat (DEA), falls (a) Q und Σ endliche, paarweise disjunkte Mengen (genannt: Zustandsmenge und Eingabealphabet) sind, (b) q0 ∈ Q heißt Startzustand. (c) F ⊆ Q für die Endzustandsmenge F gilt und (d) δ eine Abbildung δ : Q × Σ → Q ist. Sie heißt Zustandsüberführungsfunktion. (2) Die erweiterte Zustandsüberführungsfunktion δ ∗ : Q × Σ∗ → Q ist wie folgt definiert: (a) δ ∗ (q, ε) = q und (b) δ ∗ (q, wx) = δ(δ ∗ (q, w), x). (3) Die von A akzeptierte Sprache ist {x ∈ Σ∗ | δ ∗ (q0 , x) ∈ F } und wird mit L(A) notiert. A wird auch Akzeptor für L(A) genannt. 2 43 Beispiel 8.2 vgl. 4.1.1, 4.1.2, 4.1.3 in [Weg93] Definition 8.3 (1) Ein Tupel A = (Q, Σ, Ω, q0 , δ, γ, F ) heißt deterministischer Mealy-Automat, falls (a) Q, Σ und Ω endliche, paarweise disjunkte Mengen (genannt: Zustandsmenge, Eingabe- und Ausgabealphabet) sind, (b) q0 ∈ Q heißt Startzustand. (c) F ⊆ Q für die EndzustandsmengeF gilt und (d) δ, γ Abbildungen δ : Q × Σ → Q bzw. γ : Q × Σ → Ω sind. Sie heißen Zustandsüberführungs- bzw. Ausgabefunktion. (2) Die erweiterte Zustandsüberführungsfunktion und die akzeptierte Sprache sind wie beim deterministischen endlichen Automaten definiert. (3) Die vom Mealy-Automaten A berechnete Funktion ist die wie folgt definierte f : Σ∗ → Ω∗ : (a) Zunächst wird die Funktion γ zu γ ∗ : Q × Σ∗ → Ω∗ erweitert. i. γ ∗ (q, ε) = ε und ii. γ ∗ (q, wx) = γ ∗ (q, w)γ(δ ∗ (q, w), x). (b) Nun wird f durch γ ∗ definiert: f (w) = γ ∗ (q0 , w), 2 8.3 Minimale deterministische endliche Automaten Minimalität bzgl. der Anzahl der Zustände wird als Gütemaß für Automaten angenommen. Für einen gegebenen Automaten ist man an einem Automaten interessiert, der das gleiche leistet, d.h. die gleiche Sprache akzeptiert, aber möglichst wenige Zustände hat. Es gilt, zwei Ursachen für zu große Zustandsmengen auszuschalten: (1) Zustände, die nichts zur Arbeit des Automaten beitragen, weil sie niemals aktiv werden. (2) Paare von Zuständen, die sich in ihrer Wirkung nicht unterscheiden. Die ersten Quelle von Ineffizienz wird mit der Konstruktion nach Satz 8.1 beseitigt. Äquivalente Zustände werden mit dem in Definition 8.7 angebenen Algorithmus erkannt. Durch das Zusammenfassen von äquivalenten Zuständen kommt man zum Äquivalenzklassenautomat (vgl. Definition 8.6). 44 Mit der Betrachtung der Nerode-Relation wird schließlich im Satz 8.4 die Grundlage für den Nachweis gelegt, daß man mit den genannten beiden Schritten zu einem minimalen Automaten kommt. Definition 8.4 ([Weg93], Df. 4.2.1) Ein Zustand q eines DEA A = (Q, Σ, q0 , δ, F ), der vom Anfangszustand nicht errreicht wird (d.h. für den es kein w ∈ Σ∗ gibt mit δ ∗ (q0 , w) = q), heißt überflüssig. 2 Satz 8.1 ([Weg93], Satz. 4.2.2) Die Menge der überflüssigen Zustände eines DEA kann in Zeit O(|Q||Σ|) berechnet werden. Beweis. Beweisidee: Tiefe-zuerst-Suche im Graphen, der den DEA darstellt. q.e.d. Beipiel: endlicher Automat A2 = (Q, Σ, q0 , δ, F ): a - 0 1 b Zustandsmenge: @ a b@ a R @ Eingabealphabet: a,b - 2 Startzustand: 3 b 6 Zustandsüber- Q = {0, 1, 2, 3} Σ = {a, b} q0 = 0 führungsfunktion: δ: 0 1 2 3 a b 1 2 2 0 2 2 0 2 Endzustandsmenge: F = {0} Genau ein unerreichbarer Zustand: 3 Definition 8.5 ([Weg93], Df. 4.2.3) Zustände p und q eines DEA A = (Q, Σ, q0 , δ, F ) heißen äquivalent gdw. ∀w ∈ Σ∗ : δ ∗ (p, w) ∈ F ⇔ δ ∗ (q, w) ∈ F Notation: p ≡ q. Anmerkung: p und q sind von außen“ nicht unterscheidbar. ” Ein Wort w ∈ Σ∗ heißt Zeuge für die Inäquivalenz von Zuständen p und q eines DEA A = (Q, Σ, q0 , δ, F ) gdw. die Äquivalenz δ ∗ (p, w) ∈ F ⇔ δ ∗ (q, w) ∈ F nicht gilt. 2 45 Beispiel: endlicher Automat A3 = (Q, Σ, q0 , δ, F ): b - 0 1 b I @ o @ @a S S Zustandsmenge: b a b a@ @ S @ R a Eingabealphabet: 3 2 4 b Startzustand: 6 Zustandsüber- Q = {0, 1, 2, 3, 4} Σ = {a, b} q0 = 0 führungsfunktion: a δ: 0 1 2 3 4 a b 4 1 3 0 4 0 1 2 4 0 Endzustandsmenge: F = {0} Zwei äquivalente Zustände: 2 und 4 Definition 8.6 ([Weg93], Df. 4.2.3) Äquivalenzklassenautomat: sei ≡ die in Definition 8.5 eingeführte Äquivalenzrelation auf der Menge der Zustände eines DEA A = (Q, Σ, q0 , δ, F ). Dann sei A0 = (Q0 , Σ0 , q00 , δ 0 , F 0 ) wie folgt definiert: (1) Q0 = [Q]/≡ (2) Σ0 = Σ (3) q00 = [q0 ]≡ (4) F 0 = {[q]≡ | q ∈ F } 2 (5) δ 0 ([q]≡ , x) = [δ(q, x)]≡ Satz 8.2 ([Weg93], Df. 4.2.5) Äquivalenzklassenautomat A0 ist wohldefiniert und akzeptiert die gleiche Sprache wie A. Idee für Minimierung: Versuche statt der Allaussage für äquivalente Zustände (aus der Definition) eine Existenzaussage (betreffs Zeugen) für nichtäquivalente Zustände beweisen. 46 Beipiel: endlicher Automat A3 = (Q, Σ, q0 , δ, F ): b - 0 1 b I @ o S @ @a b a bS a@ @ Zeuge S @ R a 3 2 4 b 6 ab b ab b b a Zustandspaar 0 1 0 2 0 3 0 4 1 2 1 3 1 4 2 3 2 4 3 4 Symbole a Wartelisten b 3 4 3 4 4 0 2 4 0 0 2 0 0 2 {1, 2} , {1, 4} Zwei äquivalente Zustände: 2 und 4 — Nachweis Definition 8.7 (vgl. Algorithmus in Df. 4.2.6 [Weg93]) Zur Vereinfachung der Notation wird angenommen, das die Zustandsmenge Q des DEA A = (Q, Σ, q0 , δ, F ) die Menge der natürlichen Zahlen von {0, 1, . . . , n − 1} für ein gewisses n ∈ N ist. Eingabe: DEA A = (Q, Σ, q0 , δ, F ) Ausgabe: Markierung aller Paare4 {i, j} mit i, j ∈ Q und i 6≡ j Datenstruktur: Für alle i, j mit 1 ≤ i < j ≤ n wird eine Liste von Paaren von Zuständen gehalten mit folgender Eigenschaft: ∀ {k, l} : {k, l} ∈ Li,j → (i 6≡ j→k 6≡ l) Erläuteung: Im Algorithmus wird es in manchen Situationen für ein Zustandspaar {k, l} anhand der bereits angesammelten Information möglich sein, deren Inäquivalenz sofort festzustellen. In anderen Situationen wird man dies nicht können. Dann aber wird man zumindest wissen, daß die Inäquivalenz von k und l aus der eines anderen Paares {i, j} folgt. Man fügt dann {k, l} in die mit {i, j} verbundene Warteliste Li,j ein, in der Hoffnung, später die Inäquivalenz von k und l aus der von i und j folgern zu können. 4 Im Kontext dieses Algorithmus werden Paare als ungeordnet angesehen. 47 Initialisierung bewirkt: Algorithmusschritt 1: Für alle i, j: Li,j = ∅ Markiere alle Paare {i, j} mit (i ∈ F ∧ j 6∈ F ) ∨ (i 6∈ F ∧ j ∈ F ) Die Inäquivalenz der Zustände in den markierten Paaren wird durch das leere Wort bezeugt. Algorithmusschritt 2: Für alle nicht markierten Paare {i, j}: Algorithmusschritt 2a: Für alle a ∈ Σ: wenn {δ(i, a), δ(j, a)} markiert, dann (1) markiere {i, j} (2) markiere alle {k, l} ∈ Li,j (3) entleere Li,j . Algorithmusschritt 2b: War für kein a ∈ Σ das Paar {δ(i, a), δ(j, a)} markiert, dann für alle a ∈ Σ: füge {i, j} zu Lδ(i,a),δ(j,a) hinzu, falls δ(i, a) 6= δ(j, a). 2 Zur Korrektheit des Algorithmus aus Definition 8.7: Zunächst ist nachvollziehbar, daß nur Paare von solchen Zuständen markiert werden, für deren Inäquivalenz Zeugen existieren. Die Annahme, daß umgekehrt Paare inäquivalenter Zustände unentdeckt bleiben, kann wie folgt zum Widerspruch geführt werden: Man betrachte von allen Paaren inäquivalenter Zustände, welche durch den Algorithmus nicht entdeckt wurden, ein Paar {i, j}, welches einen Zeugen kleinster Länge hat. Dieser Zeuge kann nicht das Leerwort sein, da die Paare von Zuständen, deren Inäquivalenz durch das Leerwort bezeugt wird, in der Initialisierung gefunden und markiert werden. Der Zeuge hat also die Form aw für gewisse a ∈ Σ und w ∈ Σ∗ . Wir betrachten nun die Zustände δ(i, a) und δ(j, a), deren Inäquivalenz durch w bezeugt wird. Da der Zeuge w kürzer als aw ist, wird dieser laut Annahme über die Minimalität von aw vom Algorithmus gefunden. Nach dem betrachteten Algorithmus war aber im Moment der Behandlung von {i, j} entweder {δ(i, a), δ(j, a)} schon als inäquivalent erkannt gewesen oder es wäre in die Warteliste L{δ(i,a),δ(j,a)} eingefügt und beim Feststellen der Inäquivalenz von δ(i, a) und δ(j, a) erkannt worden. Widerspruch. Satz 8.3 ([Weg93], Df. 4.2.7) Algorithmus 8.7 markiert alle Zustandspaare {i, j} mit i 6≡ j in O(|Q|2 |Σ|) Schritten. 48 Zum Nachweis, daß Entfernen überflüssiger Zustände und nachfolgende Äquivalenzklassenbildung wirklich minimale DEA liefern, ist ein Satz von Nerode über die Struktur regulärer Sprachen nötig. Zu dessen Formulierung brauchen wir den Begriff der rechtsinvarianten Äquivalenzrelation in Sprachen. Es wird sich herausstellen, daß sich von DEA akzeptierte Sprachen stets als Vereinigung endlich vielen Äquivalenzklassen einer solchen Äquivalenzrelation darstellen lassen. Definition 8.8 ([Weg93], Df. 4.2.8) Eine Äquivalenzrelation R auf Σ∗ heißt rechtsinvariant gdw. ∀ x, y ∈ Σ∗ : (xRy→∀ w ∈ Σ∗ : xwRyw) Die Anzahl der Äquivalenzklassen bzgl. R heißt Index von R (Notation: Ind(R)). 2 Beispiel 8.3 ([Weg93], Beispiel 4.2.9) Für DEA A sei Relation xRA y wie folgt definiert: xRA y gdw. δ ∗ (q0 , x) = δ ∗ (q0 , y). Dann ist RA rechtsinvariant. Der Index von RA ist gleich der Zahl nichtüberflüssiger Zustände. Definition 8.9 (Nerode-Relation, [Weg93], Beispiel 4.2.10) Für L ⊆ Σ∗ sei Binärrelation RL in Σ∗ × Σ∗ wie folgt erklärt: xRL y gdw. ∀ w ∈ Σ∗ : (xw ∈ L ∧ yw ∈ L) ∨ ( xw 6∈ L ∧ yw 6∈ L) 2 RL ist rechtsinvariante Äquivalenz. Satz 8.4 (Satz von Nerode, [Weg93], Df. 4.2.11) Für L ⊆ Σ∗ sind äquivalent: (1) L wird von einem DEA A akzeptiert (d.h. L = L(A)). (2) L ist Vereinigung einiger Äquivalenzklassen einer rechtsinvarianten Äquivalenzrelation mit endlichem Index. (3) RL hat endlichen Index. 49 Beweis: (1) impliziert (2): Als Relation dient die in Beispiel 8.3 definierte. (2) impliziert (3): Sei R die nach (2) gegebene Relation. Man zeigt R ⊆ RL . (3) impliziert (1): Als Zustände nimmt man die Äquivalenzklassen nach RL d.h. die Elemente aus L/RL . Automatenkonstruktion in Anlehnung an die Konstruktion in Definition 8.6. Satz 8.5 (Folgerung aus Satz von Nerode, [Weg93], Korollar. 4.2.12) Hat für eine Sprache L die Relation RL einen endlichen Index, so gibt dieser die Anzahl der Zustände eines minimalen DEA A mit L(A) = L an. Beweis. Der im Beweisschritt (3) impliziert (1)“ von Satz 8.4 konstruierte ” DEA ist minimal. q.e.d. Satz 8.6 ([Weg93], Satz 4.2.13) Entfernen überflüssiger Zustände und nachfolgende Äquivalenzklassenbildung liefern minimale DEA. Beispiel 8.4 (Minimierung eines DEA, [Weg93], Ex. 4.2.14) Seite 99,100 8.4 Konstruktions- und Entscheidungsalgorithmen für Automaten Satz 8.7 ([Weg93], Satz 4.6.1) Für einen DEA A kann in linearer Zeit entschieden werden, ob L(A) leer ist. Beweis. Der Automat A = (Q, Σ, q0 , δ, F ) kann als kantenbewerteter Graph aufgefaßt werden. Dessen Knotenmenge ist die Zustandsmenge, die Kantenmenge ist {(q, δ(q, a)) | q ∈ Q, a ∈ Σ} Mittels Tiefe-zuerst-Suche entscheiden, ob in diesem Graph kein akzeptierender Zustand vom Startzustand aus erreichbar ist. q.e.d. 50 Satz 8.8 ([Weg93], Satz 4.6.2) Für einen DEA A mit Alphabet Σ kann in linearer Zeit entschieden werden, ob L(A) = Σ∗ gilt. Beweis. Mittels Tiefe-zuerst-Suche kann man entscheiden, ob alle nichtakzeptierenden Zustände unerreichbar sind. q.e.d. Satz 8.9 ([Weg93], Satz 4.6.3) Für einen DEA A kann in linearer Zeit entschieden werden, ob L(A) unendlich ist. Beweis. (1) Alle überflüssigen Zustände entfernen, ergibt DEA A0 . (2) L(A) unendlich gdw. A0 enthält, als Graph aufgefaßt, einen Kreis, von dem aus ein akzeptierender Zustand erreichbar ist. (3) Richtung der Kanten umkehren. Mit Tiefe-zuerst-Suche entscheiden, ob von den akzeptierenden Zuständen ausgehend Rückkanten auftreten. q.e.d. Satz 8.10 ([Weg93], Satz 4.6.4) Für einen DEA A = (Q, Σ, q0 , δ, F ) kann in linearer Zeit ein DEA A0 konstruiert werden, der das Komplement L zu akzeptiert. Beweis. F durch Q \ F ersetzen. q.e.d. Satz 8.11 ([Weg93], Satz 4.6.5) Für DEA A1 = (Q1 , Σ, q1 , δ1 , F1 ) und A2 = (Q2 , Σ, q20 , δ2 , F2 ) kann in der Zeit O(|Q1 ||Q2 ||Σ|) ein DEA konstruiert werden, der die Vereinigung L(A1 )∪L(A2 ) akzeptiert. Beweis. Konstruktionsidee für den Automaten A = (Q, Σ, q0 , δ, F ): Q = Q1 × Q2 , q0 = (q1 , q2 ), ∀(q, q 0 ) ∈ Q, a ∈ Σ : δ((q, q 0 ), a) = (δ1 (q, a), δ2 (q 0 , a)) 51 F = Q1 × F2 ∪ F1 × Q2 . q.e.d. Anmerkung: Der L(A1 )∪L(A2 ) akzeptierende Automat kann unter Vermeidung überflüssiger Zustände konstruiert werden. Bei der Konstruktion wird in einer Matrix für Q1 × Q2 eingetragen, welche Zustände erreichbar sind. Satz 8.12 ([Weg93], Satz 4.6.6) Für DEA A1 = (Q1 , Σ, q1 , δ1 , F1 ) und A2 = (Q2 , Σ, q20 , δ2 , F2 ) kann in der Zeit O(|Q1 ||Q2 ||Σ|) entschieden werden, ob L(A1 ) = L(A2 ) gilt. Beweis. (1) L(A1 ) = L(A2 ) gdw. L(A1 ) ∩ L(A2 ) = ∅ und L(A1 ) ∩ L(A2 ) = ∅. (2) Automaten, die L(A1 ) ∩ L(A2 ) bzw. L(A1 ) ∩ L(A2 ) akzeptieren, können in der Zeit O(|Q1 ||Q2 ||Σ|) konstruiert werden. (3) Die Probleme L(A1 ) ∩ L(A2 ) = ∅ und L(A1 ) ∩ L(A2 ) = ∅ sind in linearer Zeit entscheidbar. q.e.d. Für Sprachen werden folgende Operationen erklärt. Definition 8.10 Die Verkettung (auch: die Produktsprache, die Konkatenation) der Sprachen L und L0 ist die Sprache LL0 = {xy | x ∈ L, y ∈ L0 }. 2 Definition 8.11 Der Kleenesche Abschluß (kurz: der Abschluß) der Sprache L ist die Sprache S L∗ = i∈N Li . Dabei gelten L0 = {ε} und für alle i ∈ N : Li+1 = L(Li ). 2 Oft wird auch die Abkürzung L+ für LL∗ benutzt (genannt positiver Abschluß). Mit Hilfe der eben eingeführten Operationen und der Vereinigung von Mengen können Sprachen einer einfachen Sprachklasse definiert werden (vgl. Definition 9.1). Beispiel 8.5 (1) Die Sprachen 1 und 2 in Beispiel 8.1 sind regulär, die Sprachen 3 und 4 in jenem Beispiel sind es nicht. 52 (2) Über dem Alphabet {a, . . . , z, 0, . . . , 9} beschreibt die Sprache L5 = {a, . . . , z} {a, . . . , z, 0, . . . , 9}∗ die Menge der Namen in (Standard-)Pascal. (3) Über dem Alphabet {−, +, 0, 1} beschreibt die Sprache L6 = {−1, +1, 1} {0, 1}∗ ∪ {0} alle Darstellungen ganzer Zahlen im Dualsystem. (4) Über dem Alphabet {−, +, ., 0, 1, E} beschreibt die Sprache L7 = {−1, +1, 1} {.} {0, 1}∗ {E} {−1, +1} {0, 1}+ alle Darstellungen reeller Zahlen im Dualsystem. 8.5 Nichtdeterministische endliche Automaten Können für gegebene Sprachen A1 und A2 Automaten A3 und A4 konstruiert werden, die L(A1 )L(A2 ) bzw. L(A1 )∗ akzeptieren? Idee: Hintereinanderschalten“ der Automaten A1 und A2 . ” Problem: Es entsteht i.A. zunächst keine Übergangsfunktion sondern eine Übergangsrelation. Das führt zum Begriff des nichtdeterministischen endlichen Automaten NEA. Erst mit einer u.U. aufwendigen Konstruktion kommt man wieder zu einem DEA. Beispiel 8.6 (nach Satz 4.4.3 aus [Weg93]) Für natürliche Zahl n sei Ln Menge aller Wörter über {0, 1}, bei denen 1 der n-letzte Buchstabe ist. DEA für Erkennen von Ln hat mindestens 2n Zustände. Beweisidee: Betrachtung der Nerode-Relation (vgl. Beispiel 8.9) zeigt, daß alle Wörter aus {0, 1}n paarweise inäquivalent sind. Definition 8.12 (1) Ein Tupel A = (Q, Σ, q0 , δ, F ) heißt nichtdeterministischer endlicher Automat (NEA), falls (a) Q und Σ endliche, paarweise disjunkte Mengen (genannt: Zustandsmenge und Eingabealphabet) sind, (b) q0 ∈ Q heißt Startzustand. (c) F ⊆ Q für die Endzustandsmenge F gilt und 53 (d) δ eine Abbildung δ : Q × Σ → P (Q) ist. Sie heißt Zustandsüberführungsfunktion. (2) Die erweiterte Zustandsüberführungsfunktion δ ∗ : Q × Σ∗ → P (Q) ist wie folgt definiert: (a) δ ∗ (q, ε) = {q} und S (b) δ ∗ (q, wx) = q0 ∈δ∗ (q,w) δ(q 0 , x). (3) Die von A akzeptierte Sprache ist {x ∈ Σ∗ | δ ∗ (q0 , x) ∩ F 6= ∅} und wird mit L(A) notiert. A wird auch Akzeptor für L(A) genannt. 2 Beispiel 4.4.2 aus [Weg93]: NEA für String Matching Problem (Erkennen von Zeichenketten). Beispiel 8.7 (nach Satz 4.4.3 aus [Weg93]) Für natürliche Zahl n sei Ln Menge aller Wörter über {0, 1}, bei denen 1 der n-letzte Buchstabe ist. Es gibt einen NEA für Erkennen von Ln mit n + 1 Zuständen. Satz 8.13 ([Weg93], Satz 4.6.10) Für DEA A1 = (Q1 , Σ, q1 , δ1 , F1 ) und A2 = (Q2 , Σ, q2 , δ2 , F2 ) kann in der Zeit O((|Q1 | + |Q2 |)|Σ|) ein NEA konstruiert werden, der L(A1 )L(A2 ) akzeptiert. Beweis. Konstruktionsidee für den Automaten A = (Q, Σ, q0 , δ, F ): Q = Q1 ∪ Q2 , q0 = q1 , . . . q ∈ Q1 \ F1 {δ1 (q, a)} {δ1 (q, a), δ2 (q2 , a)} . . . q ∈ F1 ∀q ∈ Q, a ∈ Σ : δ(q, a) = {δ2 (q, a)} . . . q ∈ Q2 F1 ∪ F2 . . . ε ∈ L(A2 ) F = . F2 . . . ε 6∈ L(A2 ) q.e.d. Satz 8.14 ([Weg93], Satz 4.6.12) Für DEA A = (Q, Σ, q0 , δ, F ) kann in der Zeit O(|Q||Σ|) ein NEA konstruiert werden, der L(A)∗ akzeptiert. Beweis. Konstruktionsidee für den Automaten A0 = (Q0 , Σ, q00 , δ 0 , F 0 ): Schritt 1: Konstruktion eines L(A)+ akzeptierenden DEA. Q0 = Q, 54 q00 = q0 , ∀q ∈ Q, a ∈ Σ : δ 0 (q, a) = {δ(q, a)} ... q ∈ Q \ F {δ(q, a), δ(q0 , a)} . . . q ∈ F F0 = F. In zwei weiteren Schritten wird ein Automat A00 konstruiert, der genau das leere Wort akzeptiert. Aus beiden kann ein Automat konstruiert werden, der die Vereinigung L(A)∗ = L(A)+ ∪ {ε} akzeptiert. q.e.d. Es bleibt die Frage, wie man für einen NEA einen äquivalenten DEA konstruiert. Satz 8.15 ([Weg93], Satz 4.4.5) Zu jedem NEA mit n Zuständen gibt es einen äquivalenten DEA mit 2n Zuständen. Beweis. Schritt 1: Es wird in einem ersten Schritt die Potenzmengenkonstruktion (vgl. [Weg93], Algorithmus 4.4.4) verwendet. Konstruktion des Automaten A0 = (Q0 , Σ, q00 , δ 0 , F 0 ): Q0 = P(Q), q00 = {q0 }, ∀q 0 ∈ P(Q), a ∈ Σ : δ 0 (q 0 , a) = F0 = {q 0 ∈ Q0 | q0 S q∈q 0 δ(q, a) ∩ F 6= ∅}. Danach können uberflüssige Zustände beseitigt (Schritt 2) und der DEA minimiert werden (Schritt 3). q.e.d. Diskussion: In der Praxis ist es notwendig, die Schritte 1 und 2 zu integrieren. Dies ist zumindest theoretisch möglich. Jedoch kann der entstehende nichtminimale DEA ohne überflüssige Zustände immer noch sehr groß sein. 55 9 Reguläre Sprachen 9.1 Reguläre Ausdrücke Mit Hilfe der Vereinigung, Konkatenation und Iteration von Sprachen können Sprachen einer einfachen Sprachklasse definiert werden. Definition 9.1 Eine Sprache, die durch endlich viele Anwendungen der Operationen Verkettung, Vereinigung und Iteration aus endlichen Sprachen über einem Alphabet Σ gebildet werden kann, heißt reguläre Sprache über Σ. 2 Zur Vereinfachung der Schreibweise für reguläre Mengen werden reguläre Ausdrücke eingeführt: Definition 9.2 Die Menge der regulären Ausdrücke über einem Alphabet Σ ist • die kleinste Menge, die alle Elemente aus Σ enthält und • bezüglich der folgenden Konstruktionsregeln abgeschlossen ist: Wenn A und B reguläre Ausdrücke sind, dann auch (AB) (Verkettung), (A|B) (Vereinigung) und (A)∗ (Iteration). 2 Die Bedeutung (Interpretation) eines reguläre Ausdruck A über einem Alphabet Σ ist die folgende Sprache I(A) (über dem gleichen Alphabet): I(a) = {a} für a ∈ Σ. I(A|B) = I(A) ∪ I(B). I(AB) = I(A)I(B) und I(A∗ ) = (I(A))∗ . Beispiel 9.1 Wir betrachten das Alphabet Σ = {a, b, c}. regulärer Ausdruck ab a|b a∗ b∗ (ab)∗ Interpretation als reguläre Menge {ab} {a, b} {an bm | n, m ∈ N } {(ab)m | m ∈ N } 56 Um möglichst wenige Klammern schreiben zu müssen, führt man folgende Vorrangregeln ein. Die Iteration ∗ bindet stärker als die Verkettung und diese stärker als die Vereinigung. Die Zusammenhänge zwischen den Klassen von durch Automaten akzeptierten Sprachen, regulären Sprachen und durch reguläre Ausdrücke beschriebene Sprachen beschreibt der folgende Satz. Satz 9.1 (1) Eine Sprache ist dann und nur dann regulär, wenn sie die Interpretation eines regulären Ausdrucks ist. (2) Eine Sprache ist dann und nur dann regulär, wenn sie durch einen endlichen deterministischen Automaten akzeptiert wird. Beweis. Ein Alphabet Σ sei beliebig aber fest vorgegeben. zu 1. Es genügt zu beobachten, daß jedes Wort w einer endliches Sprache auch einen regulären Ausdruck darstellt, dessen Interpretation die Einermenge {w} ist. Damit läßt sich eine endliche Sprache {w1 , . . . , wn } als Interpretation des regulären Ausdrucks w1 | . . . | wn darstellen. Der weitere Beweis kann nun durch Induktion über die Struktur der regulären Ausdrücke geführt werden. zu 2. Zunächst skizzieren wir, wie für eine beliebige reguläre Sprache L über Σ ein DEA konstruiert werden kann, der L akzeptiert. Der Nachweis erfolgt durch Induktion über die Struktur der regulären Sprache. Induktionsanfang: Für eine beliebige endliche Sprache L = {w1 , . . . , wn } genügt es festzustellen, daß L = {a1,1 } . . . {a1,m1 } ∪ . . . ∪ {an,1 } . . . {an,mn } gilt, falls das Wort wi für i = 1, . . . , n die Form ai,1 . . . ai,ni hat. Damit kann ausgehend von DEA die Sprachen der Form {ai,j } akzeptieren, mittels der Konstruktionen nach den Sätzen 8.11, 8.13 und 8.15 ein DEA konstruiert werden, der L akzeptiert. Induktionsschritt: Unter Verwendung der Sätze 8.11, 8.13, 8.14 und 8.15 können DEA konstruiert werden, die Sprachen akzeptieren, die aus einfacheren Sprachen durch eine Anwendung von Vereinigung, Verkettung bzw. Iteration entstanden sind. Nun zeigen wir für einen beliebigen DEA A = (Q, Σ, q0 , F, δ), wie die durch A akzeptierte Sprache durch endlich viele Anwendungen der Operationen Vereinigung, Verkettung und Iteration aus endlichen Sprachen konstruiert werden kann. O.B.d.A. nehmen wir an, daß {1, . . . , n} für eine positive ganze Zahl n die Menge der Zustände des DEA A und 1 dessen Anfangszustand ist. Mit k bezeichnen wir die Menge der Wörter w für die gilt: Ri,j 57 (1) δ ∗ (i, w) = j und (2) für alle nichtleeren und von w verschiedenen Anfangsstücke w0 gilt: δ ∗ (i, w0 ) ≤ k k konstruiert. AchNun wird rekursiv eine Familie regulärer Mengen Ri,j k bedeutet hier ausnahmsweise einen oberen Index und tung: Das k in Ri,j nicht eine Potenz der betreffenden regulären Menge. 0 =∪Σ Grundfall: Ri,j k = Rk−1 ∪ Rk−1 (Rk−1 )∗ Rk−1 rekursiver Fall: Ri,j i,j i,k k,k k,j S n Man kann nun zeigen, daß L(A) = i∈F R1,i gilt. q.e.d. 9.2 Beschreibung von Textmustern mitttels regulärer Ausdrücke In verschiedenen Computersystemen steht das Programm grep (engl.: global regular expression print) zur Verfügung, mit dem in Textdateien nach Mustern gesucht werden kann, die durch reguläre Ausdrücke beschrieben sind. Die vom Programm grep benutzte Syntax wird auch in Editoren (z.B. im Editor des Turbo-Pascal) verwendet, um Textmuster für Such- und andere Funktionen anzugeben. Die Zeichen * und + bedeuten die oben definierten Formen der Iteration. Allerdings beziehen sie sich nur auf das vor ihnen stehende Zeichen. ^ bezeichnet den Zeilenanfang, $ das Zeilenende, . ein beliebiges Zeichen. Die eckigen Klammern dienen als Mengenklammern. Mit dem Minuszeichen können Aufzählungen abgekürzt werden. Mit [a-z0-9] werden beispielsweise alle Kleinbuchstaben und Ziffern beschrieben. [^a-z0-9] bezeichnet das Komplement dieser Zeichenmenge. Ein am Anfang einer Auflistung stehender Zirkumflex bewirkt, daß das Komplement der Menge gebildet wird. Beispiel: grep -r ^alpha.*$ text sucht in der Datei text alle Zeilen, in denen am Zeilenanfang das Wort alpha steht. Bei der Angabe eines Dateinamens können die Ersetzungszeichen * und ? verwendet werden. Die Suche ist nicht notwendig auf das aktuelle Verzeichnis beschränkt. grep -r "[a-z][a-z0-9 ]* *: *real" ex.pas sucht in dem Programm ex.pas alle Vereinbarungen einer Variablen oder eines Parameters vom Typ real. Das Suchmuster muß in diesem Fall in Anführungsstriche eingeschlossen werden, weil das Leerzeichen sonst als Trennzeichen zwischen verschiedenen Parametern für das Programm aufgefaßt würde. Auf analoge Weise werden reguläre Ausdrücke in Editoren eingesetzt, um komplexe Such- und Ersetzungfunktionen auszuführen (z.B. Emacs oder der Editor im Turbo-Pascal) 58 Beispielsweise kann man im Editor Emacs mit der Funktion replace-regexp (für vorsichtige Naturen ist query-replace-regexp besser geeignet) alle Kommentare in einem Pascal-Programm in C-Kommentare übersetzen. Dazu wird das zu ersetzende Textmuster durch {\([^{}]*\)} beschrieben. Die mit dem Rückstrich versehenen runden Klammern schließen hier einen regulären Ausdruck als Teilausdruck, auf dem man sich bei der Angabe des ersetzenden Textmusters beziehen kann (hier mittels \1). Das ersetzende Textmuster ist nun /*\1*/. Analog kann man Vereinbarungen von integer-Variablen in Pascal in Vereinbarungen von integer-Variablen in C umwandeln. Vereinfachend setzen wir zunächst voraus, daß keine Leerzeichen auftreten. Dann kann \([a-z][a-z0-9]*\(,[a-z][a-z0-9]*\)*\):integer; zur Beschreibung des zu ersetzenden Teilausdrucks verwendet werden. Das ersetzende Textmuster wird mittels int \1; beschrieben. Würden Leerzeichen zugelassen, würde sich der reguläre Ausdruck nicht wesentlich komplizierter gestalten. 9.3 Lexikalische Analyse Bei der Übersetzung von Programmierungsprachen ist das Problem der lexalischen Analyse zu lösen. Dabei ist der Eingabestrom, eine Folge von Zeichen, in eine Folge von Terminalsymbolen der Grammatik, nutzerdefinierten Namen und Zahlkonstanten der Sprache zu zerlegen (englisch: scanning). Es muß also eine Teilsprache erkannt werden, deren Elemente zum Aufbau der eigentlichen Sprache dient. Diese Teilsprache ist oft regulär. Zu ihrer Beschreibung werden reguläre Ausdrücke benutzt. Beispiel 9.2 (1) Über dem Alphabet {a, . . . , z, 0, . . . , 9} beschreibt der Ausdruck [a − z] [a − z0 − 9]∗ die Sprache L5 , d.h. die Menge der Namen in (Standard-)Pascal. (2) Über dem Alphabet {−, +, 0, 1} beschreibt der Ausdruck (−1| + 1|1)(0|1)∗ + 0 die Sprache L6 , d.h. alle Darstellungen ganzer Zahlen im Dualsystem. (3) Über dem Alphabet {−, +, ., 0, 1, E} beschreibt der Ausdruck (−1| + 1|1).(0|1)∗ E(−1| + 1)(0|1)+ die Sprache L7 , d.h. alle Darstellungen reeller Zahlen im Dualsystem. 59 Für die Konstruktion von Übersetzern bzw. Interpretern ist ein Unterprogramm notwendig, welches die lexalischen Analyse ausführt. Mit den Konstruktionen aus den Sätzen ?? ist man prinzipiell in der Lage, aus regulären Ausdrücken äquivalente DEA zu konstruieren. Diese wiederum kann in ausführbare Programme übersetzen. Dieses Verfahren ist in Werkzeugen wie lex (kommerziell) oder flex (freie Software) realisiert. Diese Werkzeuge übersetzen reguläre Ausdrücke in C-Programme. 9.4 Konstruktion von Akzeptoren für reguläre Sprachen Algorithmen (Programme), mit deren Hilfe die Zugehörigkeit von Wörtern zu einer Sprache entschieden werden kann, werden als Akzeptoren bezeichnet. Hier wird die automatische Konstruktion von Akzeptoren für reguläre Sprachen behandelt. In Abbildung 5 ist ein Eingabedatei für das Programm lex dargestellt. 9.5 Grenzen der Ausdruckfähigkeit regulärer Sprachen Der folgende als Pumping-Lemma bezeichnete Satz markiert eine prinzipielle Schranke der Ausdrucksfähigkeit von regulären Sprachen. Der Satz sagt aus, daß es für jede reguläre Sprache L eine natürliche Zahl n gibt, so daß es für jedes Wort z, welches wenigstens die Länge n hat, eine Darstellung von z als uvw mit nichtleerem v gibt, so daß auch alle Wörter der Form uv i w in die Sprache hineingepumpt“ werden. ” Satz 9.2 Es sei L eine reguläre Sprache über einem Alphabet Σ. Dann gibt es eine natürliche Zahl n, so daß es für jedes Wort z ∈ Σ∗ mit |z| ≥ n Wörter u, v, w ∈ Σ∗ gibt mit (1) z = uvw, (2) v 6= ε, (3) |uv| ≤ n und (4) ∀i ∈ N : uv i w ∈ L Beweis. Der Beweis beruht auf folgender Idee: Es sei n die Anzahl der Zustände eines L akzeptierenden DEA. Dann wird beim Akzeptieren eines Wortes z mit einer Länge größer oder gleich n ein Weg mit mindestens n + 1 Zuständen durchlaufen. Das heißt, betrachtet man den Automaten wieder als Graphen, muß dieser Weg einen Zyklus enthalten. Es sei u das Präfix von z, welches bis zum ersten Erreichen des Zyklus gelesen wird. Es sei w das Suffix von z, welches nach dem ersten Durchlaufen des Zyklus gelesen wird. Schließlich sei v derart, daß z = uvw. Man zeigt leicht, daß ∀i ∈ N : uv i w ∈ L. q.e.d. 60 Der Beweis macht deutlich, daß die Endlichkeit der Speichermöglichkeiten des Automaten der Grund für die beschriebene Ausdrucksschwäche ist. Beispiel 9.3 Wir betrachten die Sprache L3 = cx1 cx2 . . . cxn dn | n ∈ N, 0 < n, x1 , x2 , . . . , xn ∈ {a}+ aus Beispiel 8.1. Angenommen, L3 sei regulär. Dann sei n die natürliche Zahl, die nach dem Pumping-Lemma existiert. Es sei z das Wort aus L3 mit der Form caca . . . cadn+1 und uvw seine Zerlegung, die nach dem Pumping-Lemma existiert. Zunächst kann ausgeschlossen werden, daß v Teilwort eines Wortes a ist. Denn dann wäre ein Wort der Form caca . . . cc . . . cadn+1 oder caca . . . cacdn+1 in L3 in Widerspruch zur Definition. Da |uv| ≤ n ist, kann v außerdem das Alphabetssymbol d nicht enthalten. Es muß demnach das Symbol c enthalten. Dann gilt aber bereits uvvw 6∈ L3 Widerspruch. Folglich ist L3 nicht regulär. Man kann weitere Beispiele konstruieren, die zeigen, daß reguläre Sprachen insbesondere nicht ausreichen, um Klammerstrukturen korrekt zu beschreiben. 61 ID [a-z][a-z0-9]* %% {ID} {ID}[,]{ID} {ID}(","{ID})* a(-(c|d))*e . { { { { { printf("1 Name: printf("2 Namen: printf("viele Namen: printf("gefunden: printf("*** falsch: %s\n",yytext); %s\n",yytext); %s\n",yytext); %s\n",yytext); %s\n",yytext); } } } } } %% /*-----------------------------------------------------------------------** Hauptprogramm: main() ** Zweck: Versucht, ein Wort der Spraches einzulesen, ** solange Dateiende nicht erreicht ist. ------------------------------------------------------------------------*/ int main() { while ( yylex() ) {} return 0; } /*-----------------------------------------------------------------------** Prozedur: yywrap() ** Zweck: sagt lex dass nach EOF kein Fortsetzung moeglich. ** Argumente: keine ** Rueckgabewert: TRUE ------------------------------------------------------------------------*/ int yywrap() { return 1; } Abbildung 5: Eingabedatei für automatische Konstruktion eines Scanners 62 10 Kontextfreie Sprachen Am Beispiel der Sprache L3 wurde demonstriert, daß es Sprachen gibt, die nicht regulär sind. Auf ähnliche Weise kann man zeigen, daß eine Programmiersprache wie Pascal ebenfalls nicht regulär ist. Dazu genügt es zu beobachten, daß in Programmiersprachen vielfältige Klammerstrukturen auftreten, z.B. verschachtelte begin - end Klammerungen. Im folgenden werden Grammatiken als ein weiteres Bescheibungsmittel eingeführt. Es werden danach in Abschnitt 11 die Syntaxdefinition und die Syntaxanalyse für Programmiersprachen genauer betrachtet. Insbesondere die sogenannten kontextfreien Grammatiken sind dabei ein wichtiges Hilfsmittel. Definition 10.1 (1) Ein Quatrupel G = (T, H, s, R) heißt Grammatik, falls folgende Eigenschaften erfüllt sind. (a) T , H und R sind endliche Mengen. T und H heißen Terminal- bzw. Nichtterminalalphabet und ihre Elemente Terminal- bzw. Nichtterminalsymbole, die Elemente von R Regeln. (b) H ∩ T = ∅. (c) R ⊆ ((H ∪ T )∗ \ T ∗ ) × (H ∪ T )∗ . (d) s ∈ H. Das Nichtterminalsymbol s heißt Startsymbol der Grammatik. (2) (a) Ein Wort y über T ∪ H heißt direkt ableitbar aus einem Wort x ∈ (T ∪H)∗ , falls es eine Regel (l, r) ∈ R und Wörter u, v ∈ (T ∪H)∗ gibt mit x = ulv und y = urv. In Zeichen x →R y. (b) Ein Wort y über T ∪ H heißt ableitbar aus x ∈ (T ∪ H)∗ , falls es eine endliche Folge von Wörtern z1 , . . . , zn gibt, so daß z1 = x, zn = y und für alle i = 1, . . . , n − 1 gilt zi →R zi+1 . In Zeichen x →∗G y. (c) Die Menge L(G) = {x | x ∈ T ∗ , s →∗G x} heißt von G erzeugte Sprache. (3) Eine Grammatik G = (T, H, s, R) heißt kontextfrei, falls R ⊆ H ×(H ∪T )∗ . 2 Grammatiken werden in der sogenannten Chomsky-Hierarchie klassifiziert. Typ 0-Grammatiken heißen alle Grammatiken im Sinne von Definition 10.1, die keinen weiteren Einschränkungen unterliegen. Typ 1- oder kontextsenstive Grammatiken sind durch folgende Bedingung charakterisiert: Für alle Regeln (u, v) ∈ R gelten entweder u ∈ V + , v ∈ ((H ∪ T ) \ {s})+ und |u| ≤ |v| oder aber u = s und v = ε. 63 Typ 2-Grammatiken sind die kontextfreien Grammatiken. Typ 3- oder rechtslineare oder reguläre Grammatiken sind die kontextfreien Grammatiken die folgende Bedingung erfüllen: Für alle (u, v) ∈ R gelten entweder v = ε oder v ist ein Wort der Form aB mit a ∈ T und B ∈ H. Die von regulären Grammatiken erzeugten Sprachen sind genau die regulären Sprachen. Beispiel 10.1 Es werden die Bezeichnungen wie in Beispiel 8.1 verwendet. (1) L1 = L(G1 ) mit G1 = (Al, {s} , s, {(s, ab), (s, ba)}) . (2) L2 = L(G2 ) mit G2 = (Al, {s, t} , s, {(s, at), (t, bt), (t, a)}) . (3) L3 = L(G3 ) mit G3 = (Al, {s, t} , s, {(s, ctsd), (s, ctd), (t, at), (t, a)}) . Wir bezeichnen die Familien von durch Grammatiken der Typen 0, 1, 2 und 3 definierbaren Sprachen mit L0 , L1 , L2 bzw. L3 . Dann gelten folgende Inklusionsrelationen. ⊂ ⊂ ⊂ L3 6= L1 6= L2 6= L0 Besonders wichtig ist die Anwendung kontextfreier Sprachen bei der Definition von Programmiersprachen. Man geht dabei oft in zwei Schritten vor: (1) Man definiert mit einer kontextfreien Grammatik zunächst eine Obermenge der betrachteten Sprache. (2) Mit Hilfe von Kontextbedingungen wählt man daraus die eigentliche Programmiersprache aus. Typische Kontextbedingungen betreffen die Definiertheit von Variablen und anderen Sprachkonstrukten sowie deren Eigenschaften. Alle verwendeten Namen müssen vereinbart oder vordefiniert sein. Die Vereinbarungen müssen der Verwendung entsprechen. Für die weiteren Betrachtungen führen noch wir eine bequemere Notation für die Grammatiken ein, die sogenannte Backus-Naur-Notation (BNF). Es sei eine Grammatik G = (T, H, s, R) gegeben. Backus-Naur-Notation (BNF) : Regeln (r, w1 ),. . . , (r, wn ), deren linke Seite das gleiche Nichtterminalsymbol r ist, können in folgender Schreibweise zusammengefaßt werden: r ::= w1 | . . . |wn 64 14 Übungsaufgaben Aufgabe 14.1 (1) Definieren Sie den Begriff deterministische Turingmaschine! (2) Konstruieren Sie eine deterministische Turingmaschine, welche für eine auf deren Band binärkodiert geschriebene positive ganze Zahl den Vorgänger berechnet! (3) Konstruieren Sie eine deterministische Turingmaschine, welche für eine auf deren Band geschriebene Zeichenkette feststellt, ob diese ein Palindrom ist. Aufgabe 14.2 (1) Definieren Sie den Begriff nichtdeterministische Turingmaschine! (2) (a) Problemdefinition: Als Partitionsproblem bezeichnet man das folgende Problem: gegeben: Eine Folge positiver ganzer Zahlen b1 , b2 , . . . , bn . gesucht: Eine Zerlegung der Indexmenge {1, 2, . . . , n} in zwei disjunkte Teilmengen {n1 , . . . , nk } und {m1 , . . . , ml } mit k+l =n und bn1 + . . . + bnk = bm1 + . . . + bml . (b) Skizzieren Sie eine nichtdeterministische Turingmaschine, welche mit polynomiellem Zeitaufwand eine Lösung für eine auf deren Band geschriebene Instanz des Partitionsproblems findet, soweit es eine Lösung gibt! Hinweis: Stellen Sie sich die Gleichung bn1 + . . . + bnk = bm1 + . . . + bml durch eine Bandinschrift dargestellt vor, die über Abarbeitungsschritte aus einer Bandinschrift entsteht, die die Aufgabenstellung repräsentiert. 134 Aufgabe 14.3 (1) Geben Sie unter Verwendung deterministischer Turing-Maschinen als Algorithmenmodell eine Definition für den Begriff Problem A ist in poly” nomieller Zeit auf Problem B reduzierbar“ an! (2) Beispielprobleme (Hinweis: Stellen Sie sich die zu den folgenden Problemen formulierten Fragen auch zu den anderen behandelten Problemen!) (a) Zeigen Sie, daß sich das Erfüllbarkeitsproblem (SAT) der Aussagenlogik auf das auf Mengen von aus höchstens 3 Literalen bestehenden Klauseln eingeschränkte Erfüllbarkeitsproblem der Aussagenlogik (SAT(3)) mit polynomiellem Zeitaufwand zurückführen läßt! (b) Zeigen Sie, daß sich das Problem der Existenz eines Hamiltonkreises in einem gerichteten Graphen (DHC) auf das der Existenz eines Hamiltonkreises in einem ungerichteten Graphen (HC) mit polynomiellem Zeitaufwand zurückführen läßt! (3) Geben Sie dazu jeweils das Prinzip der Reduktion an! (4) Begründen Sie die Korrektheit der Reduktion! (5) Welche Kosten verursacht der Reduktionsalgorithmus? (6) In welchem Zusammenhang steht die Zugehörigkeit der beiden in (2) genannten Probleme zur Klasse P? (7) In welchem Zusammenhang steht die NP-Vollständigkeit der beiden in (2) genannten Probleme? Aufgabe 14.4 (1) Definieren Sie den Begriff deterministische Turingmaschine! (2) Problemdefinition: Als Cliquenproblem bezeichnet man das folgende Problem: gegeben: Ein ungerichteter Graph G und eine nichtnegative ganze Zahl n. gesucht: Eine Clique der Größe n in G. Skizzieren Sie eine nichtdeterministische Turingmaschine, welche mit polynomiellem Zeitaufwand eine Lösung für eine auf deren Band geschriebene Instanz des Cliquenproblems findet, soweit es eine Lösung gibt! 135 Aufgabe 14.5 (1) Definieren Sie den Begriff Entscheidbarkeit, indem Sie als Algorithmenmodell while-Programme benutzen! (2) Erläutern Sie unter Verwendung der vorstehenden Definition die Formalisierung der folgenden Probleme: (3) Beispielprobleme (Hinweis: Stellen Sie sich die zu den folgenden Problemen formulierten Fragen auch zu den anderen behandelten Problemen!) (a) i. Das Undefiniertheitsproblem. ii. Das Äquivalenzproblem. (b) i. Das Selbstanwendbarkeitsproblem. ii. Das Halteproblem. Gehen Sie dabei auf der Methode der Gödelisierung ein! (4) Geben Sie eine Reduktion des Undefiniertheitsproblems auf das Äquivalenzproblem an! (5) Angenommen, Ihre vorstehende Reduktion wurde korrekt definiert. In welchem Zusammenhang stehen dann die Entscheidbarkeit von Undefiniertheitsproblem und Äquivalenzproblem? Aufgabe 14.6 Die interne Steuerung eines Bankautomaten verarbeitet Zeichenketten, die über dem aus den Zeichen a,b,k,l,v,w,s,q,0,1 bestehenden Alphabet gebildet werden und folgende Struktur haben: Sie sind in die Zeichen s und q eingeschlossene Folgen von zumindest einem Fragment. Ein Fragment ist ein Wort, welches mit einem der Buchstaben a, k oder v beginnt. Darauf folgt eine von 0 verschiedene Binärzahl. Den Abschluß eines Fragments bildet jeweils in Abhängigkeit vom Anfangszeichen des Fragments das Zeichen b, l oder w. (1) Konstruieren Sie einen deterministischen, endlichen Automaten, der die Menge der nach dieser Beschreibung gebildeten Zeichenketten akzeptiert! 136 (2) Auf Kundenwunsch soll die Funktionalität des Automaten komfortabler werden. Es sollen jetzt Schachtelungen der Fragmente möglich sein, wie man sie von Programmiersprachen her kennt. Vor dem ein Fragment abschließenden Zeichen b, l oder w soll es jetzt möglich sein, ein neues Fragment zu eröffnen und zu schließen. Ist diese Aufgabe mit endlichen Automaten als Ausdrucksmittel zu lösen? (3) Geben Sie das im Zusammenhang mit Teilaufgabe (2) wichtige Ergebnis der theoretischen Informatik zur Ausdruckskraft bestimmter Formalisierungsmittel wieder! Aufgabe 14.7 Das Alphabet sei Σ = {a, b}. Zeigen Sie, daß die Sprache L2 = {an bm | n, m ∈ N } regulär ist. (1) indem Sie L2 durch einen regulären Ausdruck beschreiben, (2) indem Sie für L2 einen DEA konstruieren, welcher L2 akzeptiert. (3) Ist der von Ihnen konstruierte Automat A minimal? Begründen Sie Ihre Antwort. (4) Sollte der von Ihnen konstruierte Automat A nicht minimal sein, geben Sie einen minimalen DEA A0 mit L(A0 ) = L2 an. Aufgabe 14.8 Das Alphabet sei Σ = {+, −, 0, 1}. Geben Sie zum nachfolgend beschriebenen DEA A = (Q, Σ, q0 , δ, F ) einen minimalen DEA an, welcher die gleiche Sprache akzeptiert wie A. (1) Q = {0, 1, 2, 3, 4, 5, 6, 7, 8}. (2) q0 = 0. (3) F = {1, 4, 5, 6}. (4) Die Zustandsüberführungsfunktion δ wird durch folgende Tabelle angegeben. δ(q, a) für a = 1 q + − 0 0 3 2 6 1 1 7 7 1 1 2 7 7 7 4 3 7 7 7 5 4 7 7 4 4 5 7 7 5 5 7 6 7 7 7 7 7 7 7 7 8 7 6 1 2 137 Welche Zustände in A sind überflüssig, welche äquivalent? Nutzen Sie den Algorithmus aus Definition 1.7 und das entsprechende Programm. Aufgabe 14.9 (1) Gegeben sei das Alphabet Σ = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ., E, +, −} . Beschreiben Sie die Menge der Wörter über diesem Alphabet, die in Pascal reelle Zahlen darstellen, durch einen regulären Ausdruck. (2) Schreiben Sie eine Eingabedatei für das Programm lex (bzw. flex), welches reelle Zahlen erkennt und diese ausgibt. (3) Beschreiben Sie mit einem regulären Ausdruck die Menge der Wörter über dem Alphabet Σ = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ., E, +, −, i}, die komplexe Zahlen in der Form A + Bi darstellen, wobei A und B Darstellungen reeller Zahlen wie in Teilaufgabe 1 sind. Aufgabe 14.10 Gegeben sei die Sprache L1 = Alphabet Σ = {a, b}. an b2n | n ∈ N über dem (1) Geben Sie je 3 Wörter über dem Alphabet Σ an, die zu L1 gehören bzw. nicht gehören. (2) Ist die Sprache L1 eine reguläre Sprache? Begründen Sie Ihre Antwort. Aufgabe 14.11 Das Alphabet sei Σ = {a, b}. Zeigen Sie, daß die Sprache L2 = {xn ay m | x = ab, y = ba, n, m ∈ N } regulär ist. (1) indem Sie L2 durch einen regulären Ausdruck beschreiben, (2) indem Sie für L2 einen DEA konstruieren, welcher L2 akzeptiert. (3) Ist der von Ihnen konstruierte Automat A minimal? Begründen Sie Ihre Antwort. (4) Sollte der von Ihnen konstruierte Automat A nicht minimal sein, geben Sie einen minimalen DEA A0 mit L(A0 ) = L2 an. 138 Aufgabe 14.12 Das Alphabet sei Σ = {+, −, 0, 1}. Geben Sie zum nachfolgend beschriebenen DEA A = (Q, Σ, q0 , δ, F ) einen minimalen DEA an, welcher die gleiche Sprache akzeptiert wie A. Es gelten Q = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, q0 = 0 und F = {1, 4, 5, 6, 8}. Die Zustandsüberführungsfunktion δ wird durch folgende Tabelle angegeben. q 0 1 2 3 4 5 6 7 8 9 δ(q, a) + − 3 2 7 7 7 7 7 7 9 6 7 7 7 7 7 7 7 7 7 9 für 0 6 1 7 7 5 5 7 7 8 4 a= 1 5 1 8 1 2 5 7 7 8 8 Welche Zustände in A sind überflüssig, welche äquivalent? Nutzen Sie den Algorithmus aus Definition 1.7 und seine Implementierung, um die Frage zu beantworten. Aufgabe 14.13 Das Alphabet Σ1 enthalte genau die Dezimalziffern, die Kleinbuchstaben des englischen Alphabets, das Unterstreichungszeichen, öffnende und schließende runde Klammern, Leerzeichen, Doppelpunkt, Komma und Semikolon. (1) Beschreiben Sie mit einem regulären Ausdruck die Menge der Wörter über dem Alphabet Σ1 , die in Pascal Prozedurköpfe darstellen, die keinen anderen außer Wertparametern vom Typ integer oder real enthalten. Auf Kontextabhängigkeiten (Verbot von Doppeltverwendung von Parameternamen) braucht keine Rücksicht genommen zu werden. (2) Schreiben Sie eine Eingabedatei für das Programm lex (bzw. flex), aus welcher ein Programm generiert wird, welches die vorstehend beschriebene Sprache akzeptiert. (3) Geben Sie einen DEA an, welcher die vorstehend beschriebene Sprache akzeptiert. Aufgabe 14.14 Das Alphabet Σ2 enthalte genau die Dezimalziffern, die Kleinbuchstaben des englischen Alphabets, den Dezimalpunkt, den Rückstrich und das Unterstreichungszeichen. 139 (1) Beschreiben Sie mit einen regulären Ausdruck die Menge der Wörter über dem Alphabet Σ, die im Dateisystem von DOS Pfadnamen darstellen. (2) Geben Sie einen DEA A = (Q, Σ2 , q0 , F, δ) an, welcher die vorstehend beschriebene Sprache akzeptiert. (3) Ist der von Ihnen konstruierte Automat A minimal? Begründen Sie Ihre Antwort, indem Sie für nicht überflüssige Zustände q ∈ Q Wörter w ∈ Σ∗2 mit δ ∗ (q0 , w) = q angeben. Für Paare von Zuständen sind Zeugen für deren Inäquivalenz oder Gründe für die Nichtexistenz derartiger Zeugen anzugeben. Aufgabe 14.15 Es sei Σ ein beliebiges Alphabet. Widerlegen Sie, daß die Sprache L = {uv | u ist Spiegelbild von v} regulär ist. Aufgabe 14.16 Es sei L1 die Sprache, die genau die unter Verwendung der Operationszeichen + und ∗ (in Infixnotation), des Variablensymbols a und der Klammern ( und ) darstellbaren arithmetischen Ausdrücke enthält. Es soll möglich sein, die arithmetischen Ausdrücke ohne überflüssige Klammern nach der Regel Punktrechnung geht vor Strichrechnung“ zu bilden. ” (1) Konstruieren Sie eine kontextfreie Grammatik über dem Alphabet Σ1 = {+, ∗, a, (, )}, welche L1 erzeugt. (2) Untersuchen Sie, ob Ihre Grammatik die Kriterien 1 und 2 aus Kapitel 4.1 der Vorlesung erfüllt. (3) Entwerfen Sie ein Programm, welches die Sprache L1 akzeptiert. Hinweis: Überlegen Sie, ob Sie eine Ihnen bekannte Programmiersprache als Vorlage nehmen können. Aufgabe 14.17 Es sei Σ2 = {+, ∗, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, (, )}. Die Sprache L2 sei analog zu L1 aus Aufgabe 14.19 gebildet, jedoch mit dem Unterschied, daß statt der Variablen a jetzt beliebige nichtleere aus Buchstaben zusammengesetzte Wörter als Variablen zugelassen sind. (1) Erweitern Sie die Grammatik aus Übung 14.19, damit L2 erzeugt wird. (2) Erfüllt Ihre Grammatik die Kriterien 1 und 2 für die effiziente Top-DownAnalyse? Begründen Sie Ihre Antwort. (3) Entwerfen Sie ein Programm, welches L2 akzeptiert. 140 Aufgabe 14.18 Gegeben ist die Grammatik G = ( x, n, ∗, (, ), :, ; , =, begin, end , {A, P, D, I, F } , I, R) mit den Regeln R: I A P D F ::= n := A | begin F end ::= x | (P ) ::= AD ::= | ∗ AD ::= | I; F (1) Bestimmen Sie die Mengen der Anfangssymbole für I und F (d.h. as(I), as(F )) und die Mengen der Folgesymbole für I und F (d.h. f s(I), f s(F )). (2) Erfüllt die definierte Sprache die Kriterien 1 und 2 für die Top-DownAnalyse? Aufgabe 14.19 Es sei L die Sprache, die genau die unter Verwendung der Operationszeichen + und ∗ (in Infixnotation), des Variablensymbols a und der Klammern ( und ) darstellbaren arithmetischen Ausdrücke enthält. Die Syntaxanalyse soll so erfolgen, das auch Ausdrücke, die ohne nach der Vorrangregel Punktrechnung geht vor Strichrechnung“ überflüssige Klammern geschrieben ” werden, richtig interpretiert werden. (1) Konstruieren Sie eine kontextfreie Grammatik über dem Alphabet Σ1 = {+, ∗, a, (, )}, welche L1 erzeugt. (2) Untersuchen Sie, ob Ihre Grammatik die Kriterien 1 und 2 aus Kapitel 4.1 der Vorlesung erfüllt. (3) Entwerfen Sie ein Programm, welches die Sprache L akzeptiert. Hinweis: Überlegen Sie, ob Sie eine Ihnen bekannte Programmiersprache als Vorlage nehmen können. Aufgabe 14.20 Gegeben ist die Grammatik n o G = ( x, n, | , (, ), &, ; , =, if , {, } , {I, A, P, L, W, S, V } , I, R) mit der Menge R von in BNF dargestellten Regeln: I A P L W S V ::= ::= ::= ::= ::= ::= ::= W | if (A = A) V x | (ALAP ) | LAP &&| | | n=A | IS W ; | { IS } 141 (1) Geben Sie je 3 Wörter an, die zur von G erzeugten Sprache gehören bzw. nicht gehören. (2) Zeigen Sie, daß die angegebene Grammatik die Kriterien 1 und 2 für die Top-Down-Analyse erfüllt. Aufgabe 14.21 Gegeben sei Grammatik G3 = ({u, v, w} , {S, R, T, X} , S, P ) mit den Regeln P : X ::= Ru | T v T ::= | T w S ::= X R ::= | Rw (1) Geben Sie Ableitungen für Wörter der Form wn u und wn v an. (2) Ist die Grammatik eindeutig? D.h. existiert für jedes Wort in L(G3 ) genau in Syntaxbaum? (3) Kommt ein Syntaxanlysealgorithmus, welcher diese Grammatik umsetzt, mit einem konstanten Lookahead5 aus? (4) Erfüllt diese Grammatik die Kriterien 1 und 2 für die effiziente Top-DownAnalyse? Begründen Sie Ihre Antwort. 5 Als Lookahead wird die Anzahl der Alphabetszeichen bezeichnet, die sich ein Syntaxanlysealgorithmus merken muß, um zu entscheiden, welche Grammatikregel anzuwenden ist. 142 Inhaltsverzeichnis 1 Komplexität von Algorithmen und Problemen 2 1.1 Ressourcenbedarf von Programmen . . . . . . . . . . . . . . . . . . . . . 2 1.2 Algorithmenmodelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.2.1 Programmiersprachen . . . . . . . . . . . . . . . . . . . . . . . . 2 1.2.2 Turing-Maschinen . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2.3 Registermaschinen . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2.4 Nichtdeterministische Registermaschinen . . . . . . . . . . . . . . 5 1.2.5 while-Programme . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Begriffe zur Komplexität . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.3.1 Kosten im schlimmsten Fall (worst case cost) . . . . . . . . . . . 6 1.3.2 Kosten im mittleren Fall (average case cost) . . . . . . . . . . . . 6 1.3.3 Beispiel zur Anwendung der Notation . . . . . . . . . . . . . . . 7 1.3.4 Einige Rechenregeln für Größenordnungen 7 1.3 . . . . . . . . . . . . 2 Turing-Maschinen 8 2.1 Formalisierung der Turing-Maschine . . . . . . . . . . . . . . . . . . . . 8 2.2 Abarbeitungsbegriff für Turing-Maschinen . . . . . . . . . . . . . . . . . 10 2.3 Eigenschaften von Abarbeitungen von Turing-Maschinen . . . . . . . . . 12 3 Schwierige Probleme und ihre Lösung 13 3.1 Fallstudie: Cliquenproblem in ungerichteten Graphen . . . . . . . . . . . 13 3.2 Eine Auswahl schwieriger Probleme . . . . . . . . . . . . . . . . . . . . . 16 3.2.1 Das Erfüllbarkeitsproblem in der Aussagenlogik . . . . . . . . . . 16 3.2.2 Cliquenproblem . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3.2.3 Das symmetrische Problem des Handelsreisenden . . . . . . . . . 16 3.2.4 Das symmetrische Problem des Handelsreisenden mit Dreiecksungleichung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Das Rucksackproblem . . . . . . . . . . . . . . . . . . . . . . . . 17 Zusammenhang zwischen Entscheidungs- und Optimierungsproblemen . 17 3.3.1 Optimierungsvarianten des Cliquenproblems . . . . . . . . . . . . 17 3.3.2 Optimierungsvarianten des Rucksackproblems . . . . . . . . . . . 18 3.3.3 Optierungsvarianten des Problems des Handlungsreisenden . . . 18 3.3.4 Optierungsvarianten des Problems des Handlungsreisenden mit Dreiecksungleichung . . . . . . . . . . . . . . . . . . . . . . . . . 19 Überblick über Lösungsmethoden für schwierige Probleme . . . . . . . . 19 3.2.5 3.3 3.4 4 Die Komplexitätsklassen P und NP 4.1 Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 20 20 4.2 NP-Vollständigkeit wichtiger Probleme . . . . . . . . . . . . . . . . . . . 21 4.3 Pseudopolynomielle Algorithmen . . . . . . . . . . . . . . . . . . . . . . 22 5 Beispiele von Problemtransformationen (Reduktionen) 24 5.1 Reduktion Sat ≤p Clique . . . . . . . . . . . . . . . . . . . . . . . . . . 24 5.2 Reduktion Sat ≤p Sat(3) . . . . . . . . . . . . . . . . . . . . . . . . . . 25 5.3 Reduktion Sat(3) ≤p Knapsack . . . . . . . . . . . . . . . . . . . . . . . 25 5.4 Reduktion Sat(3) ≤p DHC . . . . . . . . . . . . . . . . . . . . . . . . . 26 5.5 Reduktion DHC ≤p HC . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 5.6 Reduktion HC ≤p ∆T SP . . . . . . . . . . . . . . . . . . . . . . . . . . 28 6 Quantencomputer 29 7 Berechenbarkeit und Aufzählbarkeit 30 7.1 These von Church . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 7.2 Unentscheidbarkeitsresultate . . . . . . . . . . . . . . . . . . . . . . . . 30 7.2.1 Das Selbstanwendbarkeitsproblem . . . . . . . . . . . . . . . . . 33 7.2.2 Auf das Selbstanwendbarkeitsproblem reduzierbare Probleme . . 34 7.3 Rekursive Aufzählbarkeit . . . . . . . . . . . . . . . . . . . . . . . . . . 38 7.4 Universelle Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 8 Endliche Automaten 41 8.1 Formale Sprachen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 8.2 Endliche Automaten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 8.3 Minimale deterministische endliche Automaten . . . . . . . . . . . . . . 44 8.4 Konstruktions- und Entscheidungsalgorithmen für Automaten . . . . . . 50 8.5 Nichtdeterministische endliche Automaten . . . . . . . . . . . . . . . . . 53 9 Reguläre Sprachen 56 9.1 Reguläre Ausdrücke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 9.2 Beschreibung von Textmustern mitttels regulärer Ausdrücke . . . . . . . 58 9.3 Lexikalische Analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 9.4 Konstruktion von Akzeptoren für reguläre Sprachen . . . . . . . . . . . 60 9.5 Grenzen der Ausdruckfähigkeit regulärer Sprachen . . . . . . . . . . . . 60 10 Kontextfreie Sprachen 63 10 Kellerautomaten und kontextfreie Sprachen 86 11 Deterministisch kontextfreie Sprachen 87 11.1 Top-down Syntaxanalyse . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 87 11.1.1 Syntaxdiagramme . . . . . . . . . . . . . . . . . . . . . . . . . . 91 11.1.2 Konstruktion von Syntaxanalyseprogrammen . . . . . . . . . . . 92 11.2 Syntaxbäume . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 11.3 Bottom-Up Syntaxanalyse . . . . . . . . . . . . . . . . . . . . . . . . . . 95 12 Die Chomsky-Hierarchie 98 13 Semantik von Programmiersprachen - Überblick 133 14 Übungsaufgaben 134 15 Anhang 1: Programme 144 15.1 Algorithmus zum Entdecken überflüssiger Zustände . . . . . . . . . . . . 144 15.2 Ein einfaches Syntaxanalyseprogramm . . . . . . . . . . . . . . . . . . . 147 153 Literatur [AHU74] A. V. Aho, J. E. Hopcroft, and J. D. Ullmann. The Design and Analysis of Computer Algorithms. Addison-Wesley Publishing Company, 1974. [CLRS01] Thomas H. Corman, Charles E. Leiserson, Ronald L. Rivest, and Cliffor Stein. Introduction to Algorithms. MIT Press, Cambridge MA, 2001. [HK95] Christian Horn and Immo O. Kerner. Lehr- und Übungsbuch Informatik, Band 1: Grundlagen und Überlick. Fachbuchverlag Leipzig, 1995. [HMU02] John E. Hopcroft, Rajeev Motwani, and Jeffry D. Ullmann. Einführung in die Automatentheorie, Formale Sprachen und Komplexitätstheorie. Pearson Studium, 2002. [HSAF93] Ellis Horowitz, Sartaj Sahni, and Susan Anderson-Freed. Fundamentals of Data Structures in C. W. H. Freeman and Company, New York and Oxford, 1993. [KSV02] A. Yu. Kitaev, A. H. Shen, and M. N. Vyalyi. Classical and Quantum Computation. American Mathematical Society, 2002. [Lyn66] Roger C. Lyndon. Notes on Logic. Litton Educational Publishing Inc., 1966. Polnisch von Wiktor Marek, PWN Warszawa, 1977. [RMD83] G. Riedewald, Jan Maluszyński, and Piotr Dembiński. Formale Beschreibung von Programmiersprachen - Eine Einführung in die Semantik. Akademie-Verlag, Berlin, 1983. [Tur36] Alan M. Turing. On computable numbers, with an application to the entscheidungsproblem. In Proceedings of the London Mathematical Society, volume 42 and 43, pages 230–265 and 544–546, 1936. [Weg93] Ingo Wegener. Theoretische Informatik. B. G. Teubner, 1993. [Wir83] Niklaus Wirth. Algorithmen und Datenstrukturen. B. G. Teubner Stuttgart, 1983. 154