THEORETISCHE INFORMATIK II Vorlesungsskript Jiřı́ Adámek Institut für Theoretische Informatik Technische Universität Braunschweig Juni 2013 Inhaltsverzeichnis 1 Endliche Automaten 1 1.1 Mathematische Grundbegriffe . . . . . . . . . . . . . . . . . . . . . . . 2 1.2 Definition der endlichen Automaten . . . . . . . . . . . . . . . . . . . 5 1.3 Nichtdeterministische Automaten . . . . . . . . . . . . . . . . . . . . . 10 1.4 Reguläre Sprachen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.5 Ableitungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 1.6 Äquivalente Zustände . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 1.7 Konstruktion eines Quotient-DEA . . . . . . . . . . . . . . . . . . . . 25 1.8 Minimierung von Automaten . . . . . . . . . . . . . . . . . . . . . . . . 26 1.9 Nerode-Äquivalenz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 1.10 Beweise der Regularität . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 1.11 Moore- und Mealy-Automaten . . . . . . . . . . . . . . . . . . . . . . . 34 2 Kontextfreie Sprachen und Kellerautomaten 37 2.1 Die Idee einer formalen Grammatik . . . . . . . . . . . . . . . . . . . . 37 2.2 Kontextfreie Grammatik . . . . . . . . . . . . . . . . . . . . . . . . . . 38 2.3 Anwendungen von kontextfreien Grammatiken . . . . . . . . . . . . . 42 2.4 Ableitungsbäume . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 2.5 Kontextfreie und reguläre Sprachen . . . . . . . . . . . . . . . . . . . . 49 2.6 Eigenschaften kontextfreier Sprachen . . . . . . . . . . . . . . . . . . . 54 2.7 Nullierbare Variablen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 2.8 Chomsky-Normalform . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 2.9 Algorithmen für formale Sprachen . . . . . . . . . . . . . . . . . . . . . 69 2.10 Kellerautomaten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 2.11 Kellerautomaten und kontextfreie Sprachen . . . . . . . . . . . . . . . 75 3 Turingmaschinen 79 3.1 Definition einer Turingmaschine . . . . . . . . . . . . . . . . . . . . . . 79 3.2 Modifikationen von Turingmaschinen . . . . . . . . . . . . . . . . . . . 85 3.2.1 TM mit mehreren finalen Zuständen . . . . . . . . . . . . . . . 85 3.2.2 TM mit zusätzlichem Gedächtnis . . . . . . . . . . . . . . . . . 86 i ii INHALTSVERZEICHNIS 3.2.3 TM mit erweitertem Bandalphabet . . . . . . . . . . . . . . . 87 3.2.4 TM mit mehrspurigem Band . . . . . . . . . . . . . . . . . . . 88 3.2.5 TM mit mehreren Bändern . . . . . . . . . . . . . . . . . . . . 89 3.3 Nichtdeterministische Turingmaschinen . . . . . . . . . . . . . . . . . 92 3.4 Rekursiv aufzählbare Sprachen . . . . . . . . . . . . . . . . . . . . . . . 96 3.5 Rekursive Sprachen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 4 Church-Turing-These, rekursive Funktionen und Grammatiken 101 4.1 Berechenbare Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . 101 4.2 Primitive Rekursion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 4.3 µ-rekursive Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 4.4 Grammatiken und Turingmaschinen . . . . . . . . . . . . . . . . . . . 110 4.5 Universelle Turingmaschine . . . . . . . . . . . . . . . . . . . . . . . . . 116 4.6 Das Halteproblem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 4.7 Ein Rechner als Turing-Maschine . . . . . . . . . . . . . . . . . . . . . 122 5 Unentscheidbare Probleme 125 5.1 Das Akzeptanzproblem . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 5.2 Akzeptanz des leeren Wortes . . . . . . . . . . . . . . . . . . . . . . . . 126 5.3 Ist eine TM ein Algorithmus? . . . . . . . . . . . . . . . . . . . . . . . 127 5.4 Das Problem von “hello world” Programmen . . . . . . . . . . . . . . 128 5.5 Satz von Rice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 5.6 Minimierung von Turingmaschinen . . . . . . . . . . . . . . . . . . . . 131 6 Komplexität von Algorithmen 133 6.1 Beispiele effizienter Algorithmen . . . . . . . . . . . . . . . . . . . . . . 134 6.2 Komplexitätsklasse P . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 6.3 Berechnungsprobleme und Reduzierbarkeit . . . . . . . . . . . . . . . 144 6.4 Robustheit der Klasse P . . . . . . . . . . . . . . . . . . . . . . . . . . 149 6.4.1 TM mit zusätzlichem Gedächtnis . . . . . . . . . . . . . . . . . 150 6.4.2 TM mit mehrspurigem Band . . . . . . . . . . . . . . . . . . . 150 6.4.3 Mehr-Band TM . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 6.4.4 RAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 6.5 Geometrische Algorithmen und reelle RAM . . . . . . . . . . . . . . . 152 6.6 Komplexitätsklasse N P . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 6.7 N P-Vollständigkeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 6.8 Weitere N P-vollständige Probleme . . . . . . . . . . . . . . . . . . . . 170 6.9 Komplexitätsklasse coN P . . . . . . . . . . . . . . . . . . . . . . . . . 174 6.10 Komplexität von Optimierungsproblemen . . . . . . . . . . . . . . . . 176 6.11 Approximation von Optimierungsproblemen . . . . . . . . . . . . . . 181 6.12 Raumkomplexität . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186 Kapitel 3 Turingmaschinen kapTM Weder endliche Automaten noch Kellerautomaten sind genügend starke Berechnungsmodelle, denn sie sind nicht fähig, selbst so einfache Sprachen wie z. B. {an bn cn ; n ≥ 1} zu akzeptieren. Wir führen jetzt ein Modell einer Maschine ein, die eine sehr starke Leistung hat, obwohl die Definition nicht komplizierter als die der Kellerautomaten ist: die Turingmaschinen. Diese Maschinen wurden von Alan Turing in den 1930’er als Formalisierung des intuitiven Begriffs des Algorithmus eingeführt. Turing versuchte zu zeigen, dass jeder Rechenprozess, den ein Mensch aufgrund einer (endlichen, eindeutigen) Anweisung durchführen kann, auch automatisch von einer Maschine durchgeführt werden kann. Was einem menschlichen Rechner zur Verfügung steht, ist eine endliche Liste von Instruktionen, die zusammen mit den Daten in seinem Gedächtnis eine endliche Menge von (inneren) Zuständen formt. Außerdem hat er einen unbeschränkten Raum, in dem er lesen, schreiben und überschreiben darf. Das kann (zweidimensional) durch einen beliebig erweiterbaren Papierstoß realisiert werden, oder äquivalent, falls alle Zeilen als Erweiterungen der ersten angesehen werden, als ein (eindimensionales) unendliches Band. Das formale Modell ist dann dem eines Kellerautomaten ähnlich: anstelle des Kellers gibt es hier ein Band, auf dem sich ein read-and-write-Kopf unbeschränkt bewegt. Die Leistungsfähigkeit von Turingmaschinen ist trotzdem unvergleichlich größer als die der Kellerautomaten. Es zeigt sich, dass die Klasse aller Probleme, die mit Turingmaschinen gelöst werden können, dieselbe ist wie die Klasse aller Probleme, die moderne Rechner mit modernen Programmiersprachen lösen können. Die Churchsche These, die wir s0päter genauer erläutern, behauptet, dass die Turingmaschine sogar ein ganz allgemeines Modell des Begriffs des Algorithmus ist. Also kann ein Problem genau dann mit einem Algorithmus gelöst werden, wenn eine Turingmaschine es lösen kann. Diese These kann nicht bewiesen werden (der Begriff des Algorithmus ist eben doch nur intuitiv), aber sie wurde mehrmals überzeugend dadurch untermauert, dass andere – oft grundsätzlich verschiedene – Berechnungsmodelle dieselbe Klasse lösbarer Probleme ergeben. 3.1 Definition einer Turingmaschine Eine Turingmaschine besteht – analog zum Kellerautomaten – aus inneren Zuständen, externem Speicher und einer Betriebseinheit, die aufgrund des momentanen Zustandes und des gerade gelesenen Symbols entscheidet, welcher der nächste Zustand ist und wie der Speicher geändert wird. Im Vergleich zu Kellerautomaten hat hier der Speicher den Typ eines (unbeschränkten) Bandes, auf dem sich ein 79 80 KAPITEL 3. TURINGMASCHINEN Lese-/Schreibkopf frei bewegt: ... a b b a ⇑ { ● q0 q3 ● ● ... Band Kopf Betriebseinheit ● q1 ● q2 (Obwohl das Band unbeschränkt ist, ist zu jedem Zeitpunkt nur ein endlicher Teil beschrieben; der Rest ist leer.) Noch ein Unterschied im Vergleich zu den Kellerautomaten: wir arbeiten zuerst nur mit deterministischen Turingmaschinen, denn sie sind (wie im Fall der endlichen Automaten) genauso leistungsfähig wie die nichtdeterministischen. Das beweisen wir später. Die Übergangsfunktion δ einer Turingmaschine entscheidet aufgrund des momentanen Zustandes q und des gerade gelesenen Bandsymbols s, ob 1. sich der Zustand zu q ′ ändert und sich der Kopf nach links (L) oder rechts (R) bewegt oder 2. sich der Zustand zu q ′ ändert und der Kopf das momentane Bandsymbol mit einem neuen Symbol s′ überschreibt. Das beschreiben wir als Funktion δ(q, s) = (q ′ , s′ ), wobei s′ = L, R oder s′ ∈ Σ ist. (Σ ist das gegebene Eingabealphabet). Wir müssen aber auch Bandfelder, die nicht beschriftet sind, behandeln. Dazu führen wir ein Spezialsymbol # (Blank) ein, das unbeschriftete Felder bezeichnet. In der Formel δ(q, s) = (q ′ , s′ ) sind q und q ′ also Zustände, s ein Symbol aus Σ ∪ {#} und s′ ein Symbol aus Σ ∪ {#,L,R}. Obwohl die Turingmaschine, wie wir sie jetzt definieren, deterministisch ist, gibt es neben 1. und 2. noch eine weitere Möglichkeit für ihr Verhalten, nämlich dass 3. die Maschine im Zustand q auf dem Bandsymbol s hält und die Berechnung endet. Formal wird dies dadurch beschrieben, dass δ(q, s) nicht definiert ist. Hier ist δ also eine partielle Funktion. Es gibt einen wichtigen Grund für diesen dritten Fall: der Kopf der Turingmaschine ist kein read-only-Kopf (wie im Fall der endlichen Automaten und Kellerautomaten). Der Impuls, eine Berechnung zu beenden, erfolgt hier also nicht durch das Ende der Eingabe. Im Vergleich mit den DEA oder Kellerautomaten ergibt sich eine kleine Vereinfachung: es genügt ein finaler Zustand, wir brauchen keine Menge F ⊆ Q (vergleiche 3.2 unten). sectDefTuringmaschine defTuringmaschine Notation. Wir bezeichnen Σ̄ = Σ ∪ {∗} als die Menge aller Bandsymbole. Definition. Eine Turingmaschine (TM) ist ein Fünftupel M = (Q, Σ, δ, q0 , qF ) wobei 3.1. DEFINITION EINER TURINGMASCHINE Q Σ δ q0 ∈ Q qF ∈ Q 81 eine endliche Menge (aller Zustände), eine endliche Menge (das Eingabealphabet), die die Symbole L, R und # nicht enthält, eine partielle Funktion (die Übergangsfunktion) mit Definitionsbereich Q × (Σ ∪ {#}) und Wertebereich Q × (Σ ∪ {#,L,R}), der Initialzustand und der Finalzustand ist. Notation. Wir schreiben statt δ(q, s) = (q ′ , s′ ) oft nur (q, s) → (q ′ , s′ ) und sprechen von Übergangsregeln. Wenn s′ = L, bedeutet diese Regel, dass der Lesekopf nach links geht. Analog für s′ = R. Wenn s′ in Σ̄ liegt, wird das gelesene Symbol s durch s′ überschrieben und der Kopf bewegt sich nicht. sectBspAltDreiEinsEins bspAltDreiEinsEins Beispiel 1. Teilbarkeit durch 5. Der Algorithmus, der für eine Zahl entscheidet, ob sie durch 5 teilbar ist, ist einfach: akzeptiert werden Zahlen mit der letzten Ziffer 0 oder 5. Wir lesen also die Eingabe s1 . . . sn bis wir das letzte beschriebene Feld sn erreichen (also: bis # erscheint und dann einen Schritt zurück). Falls sn = 0 oder 5, gehen wir in den Finalzustand qF über: (q0 , i) → (q0 , R) für i = 0, 1, . . . , 9 (wir lesen weiter) (q0 , #) → (q1 , L) einen Schritt zurück und in den neuen Zustand q1 (q1 , 0) → (qF , 0) } falls sn = 0 oder 5, ist der letzte Zustand qF (q1 , 5) → (qF , 5) Genauer: die folgende TM M = ({q0 , q1 , qF }, {0, 1, . . . , 9}, δ, q0 , qF ), deren Übergangsregeln oben aufgelistet sind, akzeptiert die Sprache aller Wörter über Σ = {0, 1, . . . , 9}, die mit 0 oder 5 enden. Beispiel einer Berechnung: für die Eingabe 132 wird die TM die folgenden Schritte machen: ... # # 1 3 2 # # # # ... Initialkonfiguration ⇑ q0 ... # # 1 3 2 # # # # ... ⇑ q0 ... # # 1 3 2 # # # # ... ⇑ q0 ... # # 1 3 2 # # # # ... ⇑ q0 ... # # 1 3 2 # # # # ... Haltekonfiguration ⇑ q1 Da kein Übergang (q1 , 2) → definiert ist, hält hier die Turingmaschine. Die Eingabe 132 wird nicht akzeptiert, da q1 nicht der Finalzustand ist. 82 KAPITEL 3. TURINGMASCHINEN Die Berechnung von Eingaben formalisieren wir jetzt. Konfigurationen: Eine Konfiguration einer Turingmaschine ist die vollständige Information über die TM zu einem Zeitpunkt der Berechnung; sie wird durch (1) den momentanen Zustand q, (2) den Inhalt des Bandes und (3) die Position des Kopfes bestimmt. Also ist (1) ein Element der Menge Q. Wir können (2) und (3) zusammenfassen, indem wir sagen, welches Wort uL links vom Kopf steht, welches Wort uR rechts steht und welches Symbol a aus Σ = Σ ∪ {#} der Kopf liest. Dabei ist uL entweder leer, oder hat das erste Symbol aus Σ und die weiteren aus Σ: uL ∈ Σ × Σ ∪ {ε}. ∗ Analog uR ∈ Σ × Σ ∪ {ε}. ∗ Eine Konfiguration ist also ein Quadrupel ∗ ∗ (q, u, a, v), wobei q ∈ Q, u ∈ Σ × Σ ∪ {ε}, a ∈ Σ und v ∈ Σ × Σ ∪ {ε}. Die Menge aller solcher Quadrupel K = Q × (Σ × Σ ∪ {ε}) × Σ × (Σ × Σ ∪ {ε}) ∗ ∗ heißt Konfigurationsmenge. Die üblichere (und übersichtlichere) Schreibweise ist, u, a, v zu konkatenieren und a zu unterstreichen: (q, uav). In Beispiel 1 hat die Berechnung also die Konfigurationen (q0 , 132) (q0 , 132) (q0 , 132) (q0 , 132#) und (q1 , 132) Berechnung: Die Eingabe s1 s2 . . . sn ∈ Σ∗ wird immer so auf das Band geschrieben, dass die Buchstaben ohne Leerzeichen hintereinander stehen. Der Kopf wird auf den ersten Buchstaben gestellt und der Zustand ist initial. Mit anderen Worten heißt das: wir erwarten am Anfang, dass die Konfiguration die folgende Form hat: (∗) (q0 , s1 s2 . . . sn ), wobei s1 . . . sn ∈ Σ∗ . Der Fall der leeren Eingabe ε ∈ Σ∗ (also n = 0) entspricht der Konfiguration (q0 , #). Konfigurationen der Form (∗) heißen Initialkonfigurationen. Falls die Turingmaschine eine Konfiguration (q, s1 s2 . . . si−1 si si+1 . . . sn ) erreicht hat, gibt es zwei Möglichkeiten: entweder ist δ(q, si ) nicht definiert, dann heißt die Konfiguration Haltekonfiguration, oder es gilt δ(q, si ) = (q ′ , s′ ) mit s′ ∈ {L,R} ∪ Σ, dann definieren wir die Folgekonfiguration wie folgt: 1. falls s′ =L, dann ist die Folgekonfiguration (q ′ , s1 s2 . . . si−1 si si+1 . . . sn ) 2. falls s′ =R, dann ist die Folgekonfiguration (q ′ , s1 s2 . . . si−1 si si+1 . . . sn ) 3. falls s′ ∈ Σ, dann ist die Folgekonfiguration (q ′ , s1 s2 . . . si−1 s′ si+1 . . . sn ). 3.1. DEFINITION EINER TURINGMASCHINE Konfiguration (q, s1 s2 . . . si−1 si si+1 . . . sn ) (q, s1 s2 . . . si−1 si si+1 . . . sn ) (q, s1 s2 . . . si−1 si si+1 . . . sn ) (q, s1 s2 . . . si−1 si si+1 . . . sn ) δ(q, si ) (q ′ , L) (q ′ , R) (q ′ , s′ ) nicht definiert 83 Folgekonfiguration (q , s1 s2 . . . si−1 si si+1 . . . sn ) (q ′ , s1 s2 . . . si−1 si si+1 . . . sn ) (q ′ , s1 s2 . . . si−1 s′ si+1 . . . sn ) keine (Haltekonfiguration) ′ Tabelle 3.1: Definition tabFolgekonfiguration der Folgekonfiguration der TM tTabFolgekonfiguration Diese Definition ist in Tabelle 3.1 zusammengefasst. Bemerkung 1. Wie ist der Fall 1 zu verstehen, falls i = 1 gilt? Die Folgekonfiguration zu (q0 , s1 . . . sn ) ist natürlich (q ′ , #s1 . . . sn ). Analog folgt im Fall 2 aus i = n, dass die Folgekonfiguration (q ′ , s1 . . . sn #) ist. Notation. Die Relation Folgekonfiguration“ auf der Menge K aller Konfiguratio” nen bezeichnen wir mit dem Symbol ⊢. Also ergibt der 1. Fall (q, s1 s2 . . . si−1 si si+1 . . . sn ) ⊢ (q ′ , s1 s2 . . . si−1 si si+1 . . . sn ) usw. Die reflexive und transitive Hülle dieser Relation wird mit ⊢∗ bezeichnet; d.h., K ⊢∗ K ′ bedeutet, dass K und K ′ zwei Konfigurationen sind, die entweder gleich sind oder dass es Konfigurationen K = K0 , K1 , . . . , K n = K ′ mit Ki−1 ⊢ Ki für i = 1, . . . , n gibt. Wir sagen, dass die Konfiguration K ′ von K berechenbar ist. In Beispiel 1 in Abschnitt 3.1 gilt (q0 , 132) ⊢ (q0 , 132) ⊢ . . . ⊢ (q1 , 132) und, die letzte Konfiguration hat keine Folgekonfiguration, da sie eine Haltekonfiguration ist. sectDefTMKonfiguration defTMKonfigurationen Definition. Für jede Turingmaschine ist die Berechnung einer Eingabe s1 s2 . . . sn ∈ Σ∗ eine endliche oder unendliche Liste von Konfigurationen: K0 ⊢ K1 ⊢ K2 ⊢ . . . wobei 1. K0 die Initialkonfiguration mit K0 = (q0 , s1 s2 . . . sn ) ist, und 2. falls die Liste endlich ist, ist die letzte Konfiguration eine Haltekonfiguration. Wir sagen, dass die Turingmaschine die Eingabe genau dann akzeptiert, wenn ihre Berechnung endlich ist und der Zustand der letzten Konfiguration final ist. Bemerkung 2. Die Berechnung einer Eingabe w hat also drei mögliche Ergebnisse: 1. die TM hält und akzeptiert w, 2. die TM hält und akzeptiert w nicht, 3. die TM hält nicht (und akzeptiert w deshalb nicht). Am Anfang ist die Eingabe kompakt“, also ohne Unterbrechung (durch #) auf dem ” Band geschrieben. Im Verlauf der Berechnung kann # an jeder Stelle erscheinen. 84 KAPITEL 3. TURINGMASCHINEN Beispiel 1. (Fortsetzung) Die Berechnung der Eingabe 132 haben wir beschrieben. Die letzte Konfiguration ist (q1 , 132). Da q1 nicht final ist, wird 132 nicht akzeptiert. Auch das leere Wort wird nicht akzeptiert: hier haben wir eine 1-Schritt-Berechnung, denn (q0 , #) ist eine Haltekonfiguration, und q0 ist nicht final. sectDefSpracheEinerTM defSpracheEinerTM Diese Turingmaschine hält auf jede Eingabe (eine wichtige Eigenschaft, wie wir später erfahren werden) und akzeptiert genau die Eingaben, deren letztes Symbol 0 oder 5 ist. Definition. Für jede Turingmaschine M = (Q, Σ, δ, q0 , F ) bezeichnen wir mit L(M ) die Sprache aller Wörter über Σ, die M akzeptiert. sectBspAltDreiEinsDrei bspAltDreiEinsDrei Beispiel 2. DEA als Turing-Maschine. Gegeben sei ein DEA, A = (Q, Σ, δ, q0 , F ), definieren wir eine TM Ā = (Q ∪ {qf }, Σ, δ̄, q0 , qf ) wobei qf ∈/ Q wie folgt: / q ′ in A entspricht der Übergang (q, s) (a) jedem Übergang (q, s) in Ā / (q ′ , R) und (b) für jeden Zustand q ∈ F , der in A final ist, den Übergang (q, ∗) / (qf , ∗) . Dann hat die Turing-Maschine dieselbe Berechnung einer Eingabe s1 . . . sn wie der DEA: wir starten in . . . s1 s2 . . . sn ... ⇑ q0 und für den Übergang (q0 , s1 ) / q1 in A ist die nächste Konfiguration . . . s1 s2 . . . sn ... . . . sn ... ⇑ q1 usw. Wenn wir die Konfiguration . . . s1 s2 ⇑ qn erreichen, dann qn final ⇒ die nächste Konfiguration mit Zustand qf akzeptiert und qn nicht final ⇒ keine weitere Konfiguration und die letzte akzeptiert nicht. 3.2. MODIFIKATIONEN VON TURINGMASCHINEN 85 Bemerkung 3. Für einen DEA von k Zuständen und m Eingaben hat die entsprechende TM km + 1 Zustände. Beispiel 3. Eine Turing-Maschine für die Sprache a+ b+ c+ Da diese Sprache regulär ist, wird sie durch einen DEA akzeptiert: a / qo b a / q1 c / q2 b a,c b,c c / q3 ' a,b q5 ~w a,b,c U a,b,c Diesen DEA können wir als eine TM mit 5 × 3 + 1 = 16 Zuständen simulieren. Beispiel 4. Die Sprache aller Wörter der Form [an bn cn ] mit n = 1, 2, 3, . . . ist nicht kontextfrei. (Beweis analog zu dem für an bn cn .) Aber sie kann durch eine einfache TM akzeptiert werden. Die Simulieren den folgenden Algorithmus: 1. überprüfe, ob das innere Wort in der Sprache a+ b+ c+ liegt: dann genügt die TM aus dem vorigen Beispiel. 2. rekursiv lösche ein a dann ein b und dann ein c solange bis der Inhalt des Bandes die Form [## . . . #] Wenn 2. gelungen ist, akzeptiere, sonst akzeptiere nicht. 3.2 Modifikationen von Turingmaschinen sectModifikationenTM Wir behaupteten in der Einleitung zu diesem Kapitel, dass Turingmaschinen zu einer starken Leistung fähig sind. Das ist auf den ersten Blick nicht leicht zu erkennen. Aber wir führen jetzt kompliziertere Maschinen ein, mit deren Hilfe schon recht komplizierte Sprachen akzeptiert werden können. Anschließend zeigen wir, dass sich alle diese neuen Maschinen auf den einfachen Fall reduzieren lassen. (Das ist keine Überraschung: erinnern wir uns an die Churchsche These, die behauptet, dass sich alle Berechnungsmodelle auf TM reduzieren lassen!) subsectTMmehrereFinal 3.2.1 TM mit mehreren finalen Zuständen Wir können das Konzept der Turingmaschinen zu einer Maschine M = (Q, Σ, δ, q0 , F ) verallgemeinern, die der obigen entspricht, nur ist F ⊆ Q eine Menge finaler Zustände. Jede solche Maschine kann durch die folgende TM M ′ = (Q ∪ {qF }, Σ, δ ′ , q0 , qF ) simuliert werden: qF ist ein neuer Zustand, und δ ′ besteht aus allen Übergangsregeln, die in δ enthalten sind, und zusätzlich werden in δ ′ noch die folgenden Regeln 86 KAPITEL 3. TURINGMASCHINEN (q, s) → (qF , s) aufgenommen, wobei q ∈ F ein Zustand ist, für den δ(q, s) undefiniert ist. (Also führen Haltekonfigurationen (q, s) von M , bei denen q final ist, zu Haltekonfigurationen (qF , s) von M ′ .) Die Anzahl von Schritten, die M ′ macht, ist n + 1 wenn M n Schritte macht. 3.2.2 TM mit zusätzlichem Gedächtnis subsect-TM-gedaechtnis Wir können die Definition einer TM so modifizieren, dass die Maschine in jedem Schritt zusätzlich einen Zugriff auf ein Gedächtnis hat, wobei Symbole eines endlichen Alphabets A gespeichert werden. Die Übergangsfunktion δ entscheidet jetzt aufgrund (1) des Zustandes, (2) des gelesenen Symbols aus Σ ∪ {#} und (3) des gespeicherten Symbols aus A. Die Übergänge haben jetzt die Form (q, a, s) sectBspaltDreiZweiEins bspAltDreiZweiEins / (q ′ , s′ ) mit q, q ′ ∈ Q, a ∈ A, s ∈ Σ̄ und s′ ∈ Σ̄ ∪ L, R Für Initialkonfigurationen nehmen wir an, dass ein ausgewähltes Symbol a0 ∈ A gemerkt wird. Beispiel 1. Die Sprache aller Wörter, deren erstes Symbol nie wieder vorkommt, also L = {s1 . . . sn ∈ Σ∗ ; s1 ≠ si für i = 2, . . . , n}, kann durch eine TM mit zusätzlichem Gedächtnis wir folgt akzeptiert werden: die TM liest das erste Symbol und speichert es im Gedächtnis (also A = Σ, d.h., das zusätzliche Gedächtnis kann ein Symbol aus Σ speichern). Dies in Initialzustand q0 . Dann vergleicht die TM im Zustand q1 die anschließend gelesenen Symbole mit dem gespeicherten und hält und akzeptiert nicht, falls sie eine Übereinstimmung feststellt. Sobald die TM das Blanksymbol liest, hält sie und akzeptiert im Zustand q0 , der initial sowie final ist. Diese TM braucht nur zwei Zustände: q0 , initial und final, in dem s1 gespeichert wird, und q1 , in dem nach rechts gegangen und mit dem Speicher verglichen wird. Bemerkung 1. Eine TM mit zusätzlichem Gedächtnis ist eigentlich eine TM in dem vorher definierten Sinne, deren Zustandsmenge das kartesische Produkt Q×A ist (d. h. die Menge aller Paare (q, a), wobei q ein Zustand und a ∈ A ist). Die Übergänge der Maschine sind also von (q, a) ∈ Q × A und s ∈ S abhängig. Der Initialzustand ist (q0 , a0 ), und alle Zustände (qF , a), a ∈ A, sind final. Zum Beispiel gilt für die Maschine aus Beispiel 1, dass A = Σ (mit s0 ∈ Σ beliebig gewählt) und die Zustandsmenge Q = {q0 , q1 } × Σ ist. Wir können sie wie folgt als normale“ TM beschreiben, wobei der Initialzustand ” (q0 , s0 ) und alle Zustände (q0 , s) final sind. So gibt es die folgenden Übergangsregeln: ((q0 , s0 ), s) → ((q1 , s), R) für alle s ∈ Σ ((q1 , s), s′ ) → ((q1 , s), R) für alle s′ ∈ Σ, s′ ≠ s ((q1 , s), #) → ((q0 , s0 ), #). Zum Beispiel wird die Eingabe stt wie folgt berechnet: ((q0 , s0 ), stt) ⊢ ((q1 , s), stt) ⊢ ((q1 , s), stt) ⊢ ((q1 , s), stt#) ⊢ ((q0 , s0 ), stt#). Hier hält die TM und akzeptiert. 3.2. MODIFIKATIONEN VON TURINGMASCHINEN 3.2.3 87 TM mit erweitertem Bandalphabet subsectTMErwBandalph sectBspAltDreiZweiVier bspAltDreiZweiVier Manchmal ist es geschickt, zusätzliche (Hilfs-)Symbole auf das Band schreiben zu dürfen, die nicht zum Eingabealphabet gehören. Das bedeutet, dass außer dem Eingabealphabet Σ noch ein Bandalphabet Γ mit Σ ⊆ Γ gegeben wird und die Übergangsfunktion δ mit allen Symbolen aus Γ arbeitet, d.h., δ ist eine partielle Funktion mit Definitionsbereich Q×(Γ∪{#}) und Wertebereich Q×(Γ∪{#, L, R}). Eine TM mit erweitertem Bandalphabet ist also ein 6-Tupel M = (Q, Σ, Γ, δ, q0 , qF ) wobei Σ ⊆ Γ das Eingabealphabet und δ ∶ Q × (Γ ∪ {#}) → Q × (Γ ∪ {#, L, R}) eine partielle Funktion ist. Die Sprache, die M akzeptiert, ist die Sprache L(M ) ⊆ Σ∗ aller Wörter über dem (kleineren) Eingabealphabet Σ, für die M im Finalzustand hält. Beispiel 2. Eine 1-Band TM, die die Sprache {an bn cn ; n ≥ 1} akzeptiert. Hier haben wir Σ = {a, b, c}, und wir benutzen Γ = {a, b, c, [, ]}. Die TM wird erst die Eingabe mit [ und ] umklammern: (q0 , a) → (q0 , L) (q0 , #) → (q0 , [ ) (q0 , [ ) → (q1 , R) (q1 , x) → (q1 , R) füR x = a, b, c (q1 , #) → (q1 , ] ). Jetzt kann sie die TM von Beispiel 2 in Abschnitt 3.1 simulieren. Beispiel 3. Eine einfache TM für die Sprache an bn cn (n ≥ 1). Wir löschen die Symbole nicht, sondern ersetzen sie mit einem neuen Symbol X. Die TM hat das Bandalphabet a, b, c, X und arbeitet wie folgt (der Kopf ignoriert das Symbol X): (1) Das gelesene a wird durch X ersetzt. (2) Kopf geht nach rechts zum ersten b, das mit X ersetzt wird. Wenn keine b gefunden wird oder erst c vorkommt, hält die TM und akzeptiert nicht. (3) Kopf geht nach rechts zum ersten c, das mit X ersetzt wird. Wenn kein c vor # gefunden wird, hält die TM und akzeptiert nicht. (4) Kopf geht nach links bis # und dann rechts bis (4a) ein a gefunden wird, dann wiederholt sich der Zyklus (1) - (3) oder (4b) b oder c gefunden wird, dann hält die TM und akzeptiert nicht oder (4c) # gefunden wird, dann hält die TM und akzeptiert. Bemerkung 2. Für jede TM mit erweitertem Bandalphabet M gibt es eine ( nor” male“) TM, die M simuliert. (a) Nehmen wir erst an, dass Γ eine Untermenge von Σ+ ist. D.h. die neuen Symbole sind Wörter s1 . . . sk im ursprünglichen Alphabet Σ. Jeden Übergang (q, s1 . . . sk ) / (q ′ , s′ . . . sl ) 1 88 KAPITEL 3. TURINGMASCHINEN der TM können wir durch eine Sequenz von Übergängen einer neuen TM mit Bandalphabet Σ simulieren: der Kopf, statt das Wort s1 . . . sk auf einmal zu lesen, liest es in k Schritten und speichert es im zusätzlichen Gedächtnis. Dann Schreibt der Kopf, statt s′1 . . . s′l auf einmal, das Wort in l Schritten, indem er s1 . . . sk im zusätzlichen Gedächtnis zur Verfügung hat. (b) Wenn Γ ein beliebiges Alphabet ist, können wir es mit Wörtern aus Σ codieren: da die Menge Γ endlich ist und die Menge Σ+ unendlich ist, gibt es eine injektive Funktion γ ∶ Γ → Σ+ mit γ(s) = s für alle s ∈ Σ(⊆ Γ). Dann können wir, statt Γ, mit der gleichmächtigen Menge Γ̄ = γ(Γ), die Untermenge von Σ+ ist, arbeiten und den Fall (a) anwenden. 3.2.4 TM mit mehrspurigem Band subsectTMMehrspur Wir arbeiten hier mit einer Modifikation von TM, die darin besteht, dass das Band in k Spuren unterteilt wird, die alle gleichzeitig gelesen werden. Stellen wir uns erst vor, dass k = 2 ist. Wir schreiben Symbole aus dem Eingabealphabet Σ = Σ1 auf Spur 1 und Symbole eines Hilfsalphabetes Σ2 auf Spur 2: ... ... # 0 1 0 0 1 # # # # # a # b # # a # ⇑ ... ... Die Maschine entscheidet in jedem Schritt abhängig vom Zustand und dem Inhalt beider Spuren (1) was der nächste Zustand wird und (2) ob sich der Kopf bewegt oder beide Spuren gleichzeitig überschrieben werden. sectBspAltDreiZweiZwei bspAltDreiZweiZwei Eine 2-Spur-TM ist eigentlich eine TM im vorher definierten Sinne, deren Bandalphabet aus Paaren (s1 , s2 ), mit s1 ∈ Σ1 und s2 ∈ Σ2 , geformt wird. Die einzige Ausnahme ist das Paar (#, #), das jetzt als Blank-Symbol dient. Also ist eine 2Spur-TM einfach eine TM mit dem Eingabealphabet Σ = Σ1 × Σ2 − {(#, #)}. Analoges gilt für k-spurige Maschinen, die auf der i-ten Spur Symbole aus Σi tragen (i = 1, . . . , k): das sind also die normalen“ TM mit Eingabealphabet ” Σ = Σ1 × Σ2 × ⋅ ⋅ ⋅ × Σk − {(#, #, . . . , #)} und mit dem Blanksymbol (#, #, . . . , #). Beispiel 4. Primzahltest Wir zeigen, wie man eine 3-spurige TM konstruiert, die die Sprache L aller Primzahlen (in binärer Darstellung) akzeptiert. Hiermit kann man auch gut die Idee von Turing illustrieren, dass jeder Algorithmus mit einer TM automatisiert werden kann. Wir verwenden hier den primitiven Algorithmus, der jede Zahl n durch alle Testzahlen 2, 3, 4, . . . , n−1 teilt und n akzeptiert, falls alle Divisionen einen positiven Rest ergeben. EINGABESPUR TESTZAHLSPUR HILFSSPUR ... ... ... 1 0 1 1 1 1 0 1 1 0 1 1 1 ⇑ q0 ... ... ... Die Spuren der TM sind (1) Eingabespur, die während der Berechnung unverändert bleibt, (2) Testzahlspur, die am Anfang mit 1 beschriftet wird und in jedem Berech- 3.2. MODIFIKATIONEN VON TURINGMASCHINEN 89 nungsdurchgang um eins vergrößert wird (sodass in dem ersten Berechnungsdurchgang durch 2 dividiert wird, im zweiten mit 3, usw.) und (3) eine Hilfsspur. Wir schreiben am Anfang also die gegebene Zahl n = 1, 2, 3, . . . auf Spur 1, die Zahl 1 auf Spur 2 und nichts auf Spur 3. Der Initialzustand q0 überprüft (durch Vergleich mit Spur 2), ob auf Spur 1 eine Zahl n ≥ 2 steht. Im Fall von n = 0 oder n = 1, wird der Zustand q0 zu q− , einem nicht-finalen Haltezustand verändert. (Also werden 0 und 1 nicht akzeptiert.) Falls n ≥ 2 ist, werden Berechnungsdurchgänge rekursiv durchgeführt, die man wie folgt beschreiben kann: Anfang eines Berechnungsdurchganges: Spur 1 wird auf Spur 3 kopiert. Die Zahl auf Spur 2 wird um 1 vergrößert. Die Spuren 1 und 2 werden verglichen und falls die Zahlen gleich sind, wird der Zustand zu q+ , einem finalen Haltezustand geändert (die Eingabe wird also akzeptiert, denn keine Zahl kleiner n, die n teilt, wurde gefunden). Rumpf eines Berechnungsdurchganges: Die Zahl von Spur 3 wird durch die auf Spur 2 dividiert (z.B. durch wiederholte Subtraktion). Ende eines Berechnungsdurchganges: Jetzt steht auf Spur 3 der Rest der Eingabe modulo der Testzahl. Falls der Rest 0 ist, wird der Zustand zu q− verändert. Falls der Rest positiv ist, wird der Kopf nach links zum ersten Symbol 1 von Spur 1 geschoben und ein neuer Berechnungsdurchgang beginnt. Es ist leicht einzusehen, dass sich diese informale Beschreibung der Turingmaschine relativ einfach durch eine formal definierte TM realisieren lässt. 3.2.5 TM mit mehreren Bändern Die nächste Modifikation von TM ist eine Maschine, die mehrere Bänder hat und bei der auf jedem Band ein Lese-/Schreibkopf steht. Die k Köpfe bewegen sich unabhängig voneinander und schreiben auch unabhängig voneinander auf ihren individuellen Bändern. Die Kontrolle ist aber zentral (durch den gegebenen Zustand): Band 1 ... ... ● q0 ⇑ Kopf 1 Y ●2 q1 q4 ● ● ● ● Band 2 ... ... q3 q2 ⇑ Kopf 2 \ SCHEMA EINER 2-BAND TM sectDefKBandTM defKBandTM Das bedeutet, dass der Übergangsfunktion δ hier der Zustand q und die k gelesenen Symbole k (s1 , s2 , . . . , sk ) ∈ Σ zur Verfügung stehen. (Wir bezeichnen mit Ak = A × A × ⋅ ⋅ ⋅ × A die Menge aller k-Tupel von Elementen aus A). Hier ist Σ die Menge aller Bandsymbole von allen k Bändern. Als Ergebnis haben wir einen neuen Zustand q ′ und ein k-Tupel von Symbolen aus {L,R} ∪ Σ ∪ {#}. Das heißt, dass δ eine partielle Funktion mit Urbildbereich Q × (Σ ∪ {#})k und Wertebereich Q × (Σ ∪ {#,L,R})k ist. Definition. Eine k-Band-Turingmaschine ist ein Fünftupel M = (Q, Σ, δ, q0 , qF ), die wie eine TM definiert wird, nur ist δ jetzt eine partielle Funktion mit Urbildbereich Q × (Σ)k und Wertebereich Q × (Σ ∪ {L,R})k . 90 KAPITEL 3. TURINGMASCHINEN Die Berechnung durch eine k-Band TM ist analog zum Fall einer 1-Band TM definiert. Eine Konfiguration hat die Form (q, u1 a1 v1 , u2 a2 v2 , . . . , uk ak vk ), wobei q der Zustand und ui ai vi der Inhalt des i-ten Bandes bezeichnet. Falls δ(q, a1 . . . ak ) definiert ist, wird die Folgekonfiguration individuell auf jedem Band berechnet. Falls δ(q, a1 . . . ak ) undefiniert ist, heißt die Konfiguration Haltekonfiguration. Band 1 dient als Eingabeband, das heißt, die Initialkonfiguration für eine Eingabe s1 . . . sn ist (q0 , s1 . . . sn , #, #, . . . , #) ´¹¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¸¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹¶ (k−1)−mal sectBspAltDreiZweiDrei bspAltDreiZweiDrei Die Eingabe wird akzeptiert, falls die Maschine eine Haltekonfiguration mit dem finalen Zustand erreicht. Beispiel 5. Eine 2-Band TM, die die Sprache {an bn cn ; n ≥ 1} akzeptiert. Die TM hat ein Eingabeband (Band 1) und ein Hilfsband (Band 2). Band 1 bleibt unverändert, Band 2 ist am Anfang leer. Band 1 a a ... a b b ... b c c ... c # # ⇑ Band 2 # # # ... ⇑ Initialkonfiguration Erste Etappe der Berechnung: Solange der Kopf 1 a liest, schreibt Kopf 2 a, und beide Köpfe bewegen sich ein Feld nach rechts. Nur am Anfang schreibt Kopf 2 ein x anstelle von a. Band 1 a a ... a b b ... b c c ... c # # ⇑ Band 2 x a ... a # # # ... ⇑ Zweite Etappe: Hier bewegen sich Kopf 1 und Kopf 2 gleichzeitig in entgegengesetzte Richtungen: Kopf 1 nach rechts und Kopf 2 nach links, bis Kopf 1 c und Kopf 2 x liest. Falls Kopf 1 während dieser Bewegung immer b und Kopf 2 immer a liest, gehen wir zur dritten Etappe über; falls nicht, hält die TM in einem nicht-finalen Zustand (Eingabe nicht akzeptiert). Band 1 . . . ## a a . . . a b b . . . b c c . . . ⇑ Band 2 ... # x a ... a # # # ... ⇑ Dritte Etappe: Beide Köpfe bewegen sich gleichzeitig nach rechts, bis Kopf 1 # liest. Falls in jedem dieser Schritte außer dem letzten Kopf 1 c und Kopf 2 a liest und 3.2. MODIFIKATIONEN VON TURINGMASCHINEN 91 falls beide Köpfe im letzten Schritt # lesen, dann hält die TM im finalen Zustand qF (Eingabe akzeptiert). Falls nicht, hält die TM und akzeptiert nicht. Formal können wir die Übergänge wie folgt beschreiben: (q0 , a, #) → (q1 , a, x) Erste Etappe: (q1 , a, x) → (q1 , R, R) (q1 , a, #) → (q1 , a, a) (q1 , a, a) → (q1 , R, R) Zweite Etappe: (q1 , b, #) → (q2 , R, L) (q2 , b, a) → (q2 , R, L) (q2 , c, x) → (q2 , R, R) Dritte Etappe: (q2 , c, a) → (q2 , R, R) (q2 , #, #) → (qF , #, #). Das sind alle Übergänge für die 2-Band TM mit Bandalphabet Σ̂ = {a, b, c, x} und Eingabealphabet Σ = {a, b, c}, die die Sprache aller an bn cn (n ≥ 1) akzeptiert. (Vergleichen Sie das mit Beispiel 2 in Abschnitt 3.1). Beispiele von Berechnungen: Die Eingabe aabbcc wird wie folgt berechnet: (q0 , aabbcc, #) ⊢ (q0 , aabbcc, x) ⊢ (q0 , aabbcc, x#) ⊢ (q0 , aabbcc, xx) ⊢ (q0 , aabbcc, xx#) ⊢ (q0 , aabbcc, xx#) ⊢ (q0 , aabbcc, xx#) ⊢ (q0 , aabbcc, xx#) ⊢ (q0 , aabbcc#, xx#) ⊢ (qF , aabbcc#, xx#) und wird akzeptiert. Die Eingabe aabcc wird wie folgt berechnet: (q0 , aabcc, #) ⊢ (q0 , aabcc, x) ⊢ (q0 , aabcc, x#) ⊢ (q0 , aabcc, xx) ⊢ (q0 , aabcc, xx#) ⊢ (q0 , aabcc, xx) ⊢ (q0 , aabcc, xx#) und wird nicht akzeptiert. Bemerkung 3. Simulation einer 2-Band-TM durch eine 1-Band-TM Sei M = (Q, Σ, δ, q0 , F ) eine 2-Band-TM. Wir konstruieren eine 1-Band-TM mit zusätzlichem Gedächtnis, M , die die Maschine M Schritt für Schritt simuliert. Das Band von M ist 4-spurig: Band 1 a a b a a ⇑ Band 2 0 1 0 ... ... ... ... a # 0 ⇑ a # 1 # b # 0 # a ⇑ # # a # # # # # # # # # # # # # # # # # # # ... ... ... ... ⇑ Maschine M Maschine M Band 1 der Maschine M wird auf die Spur 1 von M kopiert, die Kopfposition des Kopfes von Band 1 steht auf der Spur 2. Analog wird Band 2 auf Spur 3 von M kopiert und die Kopfposition des Bandes auf Spur 4. Das Eingabealphabet von M 92 KAPITEL 3. TURINGMASCHINEN ist also Σ = (Σ ∪ {#}) × {⇑, #} × (Σ ∪ {#}) × {⇑, #} − {(#, #, #, #)}, wobei (#, #, #, #) das Blank-Symbol ist. Die Zustände von M und M sind dieselben. Die Maschine M muss sich die letzten von Kopf 1 und Kopf 2 gelesenen Symbole merken, also hat sie ein zusätzliches Gedächtnis der Form (s1 , s2 , x), wobei si ∈ Σi ∪ {#} das aktuelle Symbol von Band i (= 1, 2) der Turingmaschine M ist und x ∈ {l, r} aussagt, ob Kopf 2 (also das Symbol ⇑ auf Spur 4)links oder rechts von Kopf 1 (dem Symbol ⇑ auf Spur 2) steht. 1. Anfang der Simulation: Auf Spur 1 steht die Eingabe v1 v2 . . . vn von M , die Spuren 2 - 4 sind leer. Wir schreiben je ein ⇑ auf die Spuren 2 und 4 unter v1 von Spur 1. SPUR SPUR SPUR SPUR 1 2 3 4 ... ... ... ... # # # # v1 v2 . . . vn # ⇑ # ... # # ... ⇑ # ... ... ... ... ... 2. Berechnungsschritt: Am Anfang der Simulation einers Schrittes von M steht der Kopf von M unter dem Symbol ⇑ auf Spur 2. Das gerade gelesene Symbol von Spur 1 wird als s1 im zusätzlichen Gedächtnis gespeichert. Danach sucht der Kopf von M das Symbol ⇑ auf Spur 4: entweder stehen die beiden Symbole ⇑ untereinander, sonst suchen wir links bzw. rechts, falls im zusätzlichen Gedächtnis x = l bzw. x = r steht. Sobald ⇑ gefunden ist, wird das gerade gelesene Symbol von Spur 3 als s2 gespeichert. Aufgrund des Zustandes q von M und des Paares (s1 , s2 ) im zusätzlichen Gedächtnis werden jetzt die Kopfpositionssymbole auf den Spuren 3 und 4 so bewegt, wie die Maschine M die Köpfe bewegt, und die Symbole auf den Spuren 1 und 3 werden so überschrieben, wie M die Symbole auf beiden Bändern überschreibt. (Das geschieht in endlich vielen Schritten der Kopfbewegung von M .) Die Eingabe x ∈ {l, r} im Gedächtnis wir aktualisiert und der Kopf wird nach ⇑ auf Spur 2 bewegt. 3. Ende der Simulation: Die Maschine M hält genau dann, wenn eine Haltekonfiguration von M erreicht wird. Und M akzeptiert genau dann, wenn M akzeptiert. quivalenzKBandTMEinBandTM quivalenzKBandTMEinBandTM ministischeTuringmaschine ministischeTuringmaschine Satz 1. Für jede k-Band-TM gibt es eine (1-Band-) TM, die dieselbe Sprache akzeptiert. Beweis. Für k = 2 folgt der Beweis aus der gerade beschriebenen Simulation und dem Fakt, dass eine 4-spurige TM mit zusätzlichem Gedächtnis durch eine TM simuliert werden kann (siehe Kapitel 3.2.2). Für k > 2 ist der Beweis analog und wird dem Leser überlassen. 3.3 Nichtdeterministische Turingmaschinen Analog zum Fall nichtdeterministischer Automaten führen wir hier nichtdeterministische TM ein. Statt einer partiellen Funktion δ ∶ Q × Σ → Q × Σ ∪ {L,R} haben wir hier eine Relation δ: Definition. Eine nichtdeterministische Turingmaschine M (NTM) ist ein Fünftupel M = (Q, Σ, δ, q0 , qF ), das wie eine TM definiert wird, außer dass hier δ 3.3. NICHTDETERMINISTISCHE TURINGMASCHINEN 93 eine Relation δ ⊆ [Q × Σ] × [Q × (Σ ∪ {L,R})] ist. Wir schreiben, wie oben, (q, s) → (q ′ , s′ ) falls die Relation δ das Quadrupel (q, s, q ′ , s′ ) enthält. Der ganze Unterschied bezüglich der Notation zwischen einer TM und einer nichtdeterministischen TM ist, dass für eine deterministische TM für zwei beliebige Übergangsregeln (q, s) → (q ′ , s′ ) und (q, s) → (q ′ , s′ ) gilt, dass, falls die linken Seiten gleich sind (q = q und s = s), auch die rechten Seiten gleich sein müssen (q ′ = s′ und s′ = s′ ). Für nichtdeterministische TM gilt keine solche Einschränkung. Beispiel 1. stochastischer Zahlengenerator. Wir beschreiben eine nichtdeterministische Turingmaschine M , die auf ihr Band entweder eine beliebige Zahl n ≥ 1 (in binärer Form) schreibt und hält oder nie hält. Im Initialzustand q0 schreibt M eine 1 und geht zum Zustand q1 , in dem die folgende Wahl getroffen wird: entweder wird der Haltezustand qF erreicht, oder es wird ein neues Symbol 0, 1 geschrieben und (unter Verwendung eines Hilfezustandes q2 ) der Kopf nach rechts bewegt. Formal: M = ({q0 , q1 , q2 , qF }, {0, 1}, δ, q0 , qF ) wobei δ durch die folgenden Übergangsregeln beschrieben wird: (q0 , #) → (q0 , 1) (q0 , 1) → (q1 , R) (q1 , #) → (q2 , 0) Beispiel: (q1 , #) → (q2 , 1) (q1 , #) → (qF , #) (q2 , i) → (q1 , R) für i = 0, 1. 94 KAPITEL 3. TURINGMASCHINEN ... ... ⇑ q0 ... 1 ⇑ q0 ... ... 1 ... ⇑ q1 ... 1 0 ⇑ q2 ... ... 1 0 ... ⇑ q1 ... 1 0 1 ⇑ q2 ... ... 1 0 1 ... ⇑ q1 ... 1 0 1 ... ⇑ qF Konfigurationen und die Berechnung von Eingaben sind genauso definiert wie für die (deterministischen) TM. Hier hat eine Eingabe natürlich nicht nur eine, sondern mehrere Berechnungen. sectDefTMAkzeptiertW defTMAkzeptiertW sectBspAltDreiVierZwei bspAltDreiVierZwei Definition. Eine nichtdeterministische Turingmaschine M akzeptiert die Eingabe w ∈ Σ∗ , falls es für w mindestens eine Berechnung gibt, so dass M nach endlich vielen Schritten eine Haltekonfiguration mit dem finalen Zustand erreicht. Die Sprache aller Eingaben, die M akzeptiert, wird mit L(M ) bezeichnet. Bemerkung 1. Die k-Band-TM lassen sich analog zu den nichtdeterministischen k-Band-TM verallgemeinern: hier ist δ eine Relation k δ ⊆ [Q × Σ ] × [Q × (Σ ∪ {L,R})k ]. Beispiel 2. Test der Zerlegbarkeit. Wir zeigen eine nichtdeterministische 3-Band-TM, die die Sprache L ⊆ {∣}∗ aller zerlegbarer Zahlen, also Zahlen der Form n = pq mit p > 1 und q > 1 akzeptiert. Wie in Beispiel 4 in Abschnitt 3.2.4 hat M ein Eingabeband, ein Testzahlband und ein Hilfsband. Im Initialzustand schreibt M die Zahl zwei (∣∣) auf Band 2 (jede Testzahl ist größer oder gleich ∣∣) und verändert den Zustand zu q1 . In q1 , dem einzigen nichtdeterministischen Zustand, gibt es zwei Möglichkeiten: entweder wird ein neuer Strich auf Band 2 geschrieben, und der Zustand q1 bleibt, oder der Zustand verändert sich zu q2 . Im Zustand q2 wird wie folgt deterministisch berechnet: 3.3. NICHTDETERMINISTISCHE TURINGMASCHINEN 95 1. Die Zahl n auf Band 1 wird mit der Zahl m auf Band 2 verglichen. Falls n ≤ m ist, hält die Maschine, ohne zu akzeptieren. 2. Falls n > m, wird n auf Band 3 kopiert. 3. Band 2 wird von Band 3 abgezogen, bis auf Band 3 der Rest der Division von n durch die Testzahl steht. Dann hält die Maschine. 4. Falls Band 3 leer ist, wird die Eingabe akzeptiert, falls Band 3 nicht leer ist, wird sie nicht akzeptiert. Wir sehen, dass die Testzahl m eine beliebige Zahl m = 2, 3, 4, . . . sein kann. Die Eingabe n wird genau dann akzeptiert, wenn es ein m < n gibt, das n teilt. sectBspAltDreiVierDrei bspAltDreiVierDrei Beispiel 3. Simulation eines Kellerautomaten Wir können einfach jeden Kellerautomaten durch eine nichtdeterministische 2Band-Turingmaschine M simulieren, bei der auf Band 1 die Eingabe des Kellerautomaten und auf Band 2 der Kellerinhalt steht. M hat ein zusätzliches Gedächtnis, in dem die Übergangsregeln des Kellerautomaten notiert werden. Am Anfang schreibt die NTM das Symbol k0 auf Band 2. Jede Übergangsregel (q, s, k) → (q ′ , k1 . . . kn ), s ∈ Σ, des Kellerautomaten wird wie folgt simuliert: Band 1 Band 2 . . . s s′ s′′ . . . ⇑ . . . k k ′ k ′′ . . . ⇑ Übergang . . . s s′ s′′ . . . ⇑ k1 . . . kn k ′ k ′′ . . . ⇑ Falls die Maschine M im Zustand q die Symbole s (Band 1) und k (Band 2) liest, ändert sie ihren Zustand zu q ′ , bewegt den Kopf 1 einen Schritt nach rechts und macht folgendes auf Band 2: 1. Falls n ≠ 0 (also k1 . . . kn ≠ ε), wird k von kn überschrieben, und der Kopf 2 schreibt, sich nach links bewegend, die Symbole kn−1 , . . . , k1 . 2. Falls n = 0, löscht Kopf 2 das Symbol k und bewegt sich einen Schritt nach rechts. Analog wird jede spontane Übergangsregel (q, #, k) → (q ′ , k1 . . . kn ) simuliert: der einzige Unterschied ist, dass hierbei Kopf 1 stehenbleibt. tzSimulationNTMDurchTM tzSimulationNTMDurchTM Satz 1. Jede NTM kann durch eine (deterministische) TM simuliert werden. Beweis. Sei M eine NTM, und sei r eine Zahl, so dass es für jedes Paar (q, s) aus Q × (Σ ∪ {#}) höchstens r Übergänge (q, s) → (q ′ , s′ ) gibt. Dann können wir die Übergänge durchnummerieren: (q, s) → (q ′ i , s′ i ) für i = 1, 2, . . . , r (Wiederholungen sind erlaubt). Die einzige Ausnahme ist δ(q, s) = ∅ (Haltekonfiguration). Wir simulieren M mit einer 4-Band-TM wie folgt: Band 1 ist das Eingabeband mit einem read-only Kopf. Auf Band 2 werden systematisch alle Zahlen k = 0, 1, 2, 3, . . . 96 KAPITEL 3. TURINGMASCHINEN geschrieben, sie geben die Länge der Berechnung vor. Auf Band 3 werden systematisch alle k-Tupel aus Zahlen 1, . . . , r erzeugt (k = 1, 2, 3, . . . ). Auf Band 4 werden für jeden Eintrag i1 i2 . . . ik von Band 3 die ersten k Takte der Maschine M simuliert, aber in jedem Takt wählen wir den Übergang, dessen Index auf Band 2 steht. Also wird im Takt n der Übergang (q, s) → (q ′ in , s′ in ) gewählt, wobei q der momentane Zustand ist und s das gerade gelesene Symbol. In einer Haltekonfiguration von M mit q = qF hält M und akzeptiert die Eingabe, andernfalls, also auch bei Haltekonfigurationen mit q =/ qF wird k erhöht und die Simulation fortgesetzt. Es gibt also die folgenden Möglichkeiten für die Berechnung einer Eingabe w: 1. M hält auf w nach k Schritten für irgendeine Zahl k und akzeptiert w, d.h., es gibt eine akzeptierende Berechnung der Länge k von w. Dann hält auch M auf w und akzeptiert w (mit einem der rk möglichen Inhalte von Band 3); 2. M akzeptiert w nicht, d.h., alle von M bei Eingabe w erreichbaren Haltekonfigurationen haben einen von qF verschienedenen Zustand. Dann hält M nie, denn M schreibt immer länger werdende k-Tupel (k = 1, 2, 3, . . . ) auf Band 2. Damit gehört w weder zu L(M ) noch zu L(M ). Es folgt, dass L(M ) = L(M ). 3.4 sectEntscheidRek defRekursiveSprache sectBspAltDreiDreiEins bspAltDreiDreiEins Rekursiv aufzählbare Sprachen Definition. Eine Sprache L heißt rekursiv aufzählbar oder semientscheidbar , falls es eine Turingmaschine M gibt, die L akzeptiert. Beispiel 1. Die folgenden Sprachen sind rekursiv aufzählbar, denn die oben konstruierten TM akzeptieren sie: 1. Die Sprache aller durch 5 teilbaren Zahlen (siehe Beispiel 1 in Abschnitt 3.1). 2. Die Sprache aller Primzahlen (siehe Beispiel 4 in Abschnitt 3.2.4). 3. Die Sprache {an bn cn ; n ≥ 1} (siehe Beispiel 5 in Abschnitt 3.2.5 und Satz 1 in Abschnitt 3.2.5). 4. Jede kontextfreie Sprache (siehe Beispiel 3 in Abschnitt 3.3). sectBspAltDreiDreiZwei bspAltDreiDreiZwei Beispiel 2. Eine Sprache Lcode , die nicht rekursiv aufzählbar ist. Es ist nicht möglich, ein natürliches“ Beispiel einer nicht rekursiv aufzählbaren ” Sprache zu finden, da alle natürlichen“ Beispiele durch irgendeinen Algorithmus ” beschrieben werden. Aber vorausgesetzt, dass wir eine Codierung für alle TM mit dem Bandalphabet {0, 1} haben (eine solche Codierung wird in Kapitel 5.1 ausführlich beschrieben), können wir eine konkrete Sprache, die nicht rekursiv aufzählbar ist, konstruieren. Wir nehmen also an, dass es für jede Turingmaschine M mit Bandalphabet {0, 1} ein Wort c(M ) über {0, 1} gibt, sodass der Code c(M ) die Sprache der Turingmaschine M vollständig beschreibt. Das heißt, dass für alle Turingmaschinen M und M ′ gilt: c(M ) = c(M ′ ) ⇒ L(M ) = L(M ′ ). Mit Lcode bezeichnen wir die Sprache aller Codewörter w = c(M ) solcher Turingmaschinen M , die ihr eigenes Codewort nicht akzeptieren: Lcode = {w; w = c(M ) für eine Turingmaschine M mit w ∉ L(M )}. Diese Sprache ist nicht rekursiv aufzählbar. 3.5. REKURSIVE SPRACHEN 97 Beweis. Die Annahme, dass es eine Turingmaschine M̂ mit L(M̂ ) = Lcode gibt, führt zu einem Widerspruch. Für das Codewort ŵ = c(M̂ ) dieser Maschine M̂ zeigen wir nämlich, dass (a) aus ŵ ∉ Lcode folgt ŵ ∈ Lcode und (b) aus ŵ ∈ Lcode folgt ŵ ∉ Lcode . Dann ist weder ŵ ∈ Lcode noch ŵ ∉ Lcode wahr. Zu (a): Da ŵ ∉ L(M̂ ) und ŵ = c(M̂ ), folgt aus der Definition von Lcode , dass ŵ ∈ Lcode . ctSatzLLStrichRekursiv satzLLStrichRekursiv Zu (b): Da ŵ ∈ Lcode , gibt es M mit ŵ = c(M ) und ŵ ∉ L(M ). Aus c(M ) = c(M̂ ) folgt aber L(M ) = L(M̂ ); es gilt also ŵ ∉ L(M̂ ) = Lcode . Satz 1. Falls L und L′ rekursiv aufzählbaren Sprachen sind, sind auch die Sprachen L ∪ L′ , L ∩ L′ , LL′ und L∗ rekursiv aufzählbar. Beweis. Sei M eine TM, die L akzeptiert, und M ′ eine TM, die L′ akzeptiert. Wir nehmen an, dass M und M ′ auf jede Eingabe halten. (1) L + L′ . Diese Sprache wird von einer 2-Band TM akzeptiert, die auf Band 1 die Maschine M und gleichzeitig auf Band 2 die Maschine M ′ simuliert. Falls beide Maschinen halten, ist der Zustand der neuen Maschine genau dann final, wenn einer der entsprechenden Zustände (von M oder M ′ ) final ist. (2) L ∩ L′ . Der Beweis ist analog zu 1., nur ist ein Zustand genau dann final, wenn beide Zustände (von M sowie von M ′ ) final sind. 3.5 Rekursive Sprachen Wie oben erwähnt, repräsentiert eine TM eine formale Darstellung des Begriffs eines Algorithmus, indem sie eine beliebige Eingabe berechnet (und entweder akzeptiert oder nicht). Die Frage ist, ob wir nur terminierende Algorithmen betrachten dürfen, oder ob wir auch Algorithmen erlauben, die unendlich lange berechnen. Im Berechnungsmodell der TM entsprechen den terminierenden Algorithmen die TM, die auf jede Eingabe halten. Das bedeutet, dass das Nichtakzeptieren immer dadurch erfolgt, dass die TM in einem nichtfinalen Zustand hält. Die allgemeineren, nicht terminierenden Algorithmen werden von allgemeinen TM repräsentiert. Probleme, die ein terminierender Algorithmus löst, heißen entscheidbar . Die entsprechenden formalen Sprachen werden entweder entscheidbar oder rekursiv genannt. Definition. Eine Sprache heißt rekursiv oder entscheidbar wenn sie von einer TM, die auf jede Eingabe hält, akzeptiert wird. Beispiel 1. Alle bisher konstruierten TM halten auf jede Eingabe. Deswegen sind alle obere rekursiv aufzählbaren Sprachen eigentlich rekursiv. Bemerkung 1. Um ein Beispiel einer Sprache, die zwar rekursiv aufzählbar aber nicht rekursiv zeigen zu können, werden wir erst die Eigenschaften von rekursiven Sprachen erforschen. Merken Sie, dass in Satz 1 von Abschnitt 3.4 (über Eigenschaften von rekursiv aufzählbaren Sprachen) nichts über Komplement L = Σ∗ − L behauptet wurde? Dies ist ein entscheidender Unterschied zu rekursiven Sprachen.: Satz 1. Wenn L und L′ rekursive Sprachen im Alphabet Σ sind, sind auch die Sprachen L ∪ L′ , L ∩ L′ , LL′ , L∗ und L̄ = Σ∗ − L rekursiv. 98 KAPITEL 3. TURINGMASCHINEN Beweis. (1) L∪L′ und L∩L′ : der Beweis ist gleich zu dem im Satz 1 von Abschnitt 3.4. (2) LL′ . Hier benutzen wir eine 4-Band-Turingmaschine M . Band 1 ist ein Eingabeband mit einem read-only-Kopf. Auf Band 2 steht die Zahl i der Etappe (am Anfang i = 0). Auf Band 3 wird M simuliert, und auf Band 4 wird M ′ simuliert. Jede Eingabe s1 . . . sn der Länge n wird in n + 1 Etappen berechnet. Die i-te Etappe besteht daraus, dass das Wort s1 . . . si auf Band 3 und das Wort si+1 . . . sn auf Band 4 kopiert werden, und dann simuliert unsere TM die Maschine M auf Band 2 und die Maschine M ′ auf Band 3, bis beide Maschinen M und M ′ halten. Falls sie beide akzeptieren, hält auch M und akzeptiert. Falls M oder M ′ nicht akzeptiert und i < n, wird die nächste Etappe mit i ∶= i + 1 durchgeführt. Falls M oder M ′ nicht akzeptiert und i = n, hält M und akzeptiert nicht. (3) L∗ . Dieser Beweis ist analog zu 3. Zunächst prüft M , ob das Eingabeband leer ist und akzeptiert gegebenenfalls. Ansonsten erzeugen wir auf Band 2, statt nur einer Zahl i allein, alle möglichen aufsteigenden Listen (i0 , i1 , . . . , ir ) von Zahlen mit 0 = i0 < i1 < i2 < ⋅ ⋅ ⋅ < ir = n wobei r = 1, . . . , n. Band 3 simuliert M : wir kopieren erst s1 s2 . . . si1 auf Band 3 und, falls die Simulation in einem finalen Zustand von M hält, si1 +1 si1 +2 . . . si2 auf Band 3 und, falls die Simulation wieder in einem finalen Zustand hält, si2 +1 . . . si3 auf Band 3 usw. Falls alle Simulationen in finalen Zuständen von M halten, wird die Eingabe von M akzeptiert. Falls irgendeine der Simulationen in einem nichtfinalen Zustand hält, beginnt eine neue Etappe (mit der nächsten Liste auf Band 2). Wenn alle Listen auf Band 2 durchgegangen worden sind, ohne dass bis dahin M akzeptiert hat, hält M in einem nichtfinalen Zustand. (4) L̄: Gegeben sei eine TM, M , die L akzeptiert, bezeichnen wir durch M̄ dieselbe TM, nur alle Zustände außer qF sind final und qF ist nicht-final. Wenn M ein Wort nicht akzeptiert, dann akzeptiert es M̄ : hier ist wichtig, dass M auf die Eingabe hält! Dann hält sie in einem Zustand q ≠ qF der in M̄ final ist. Es gibt also L(M̄ ) = Σ∗ − L(M ). Bemerkung 2. Es ist erstaunlich, dass die Implikation L rekursiv ⇒ L̄ rekursiv die folgende Umkehrung hat: Satz 2. Wenn eine rekursiv aufzählbare Sprache L ⊆ Σ∗ auch rekursiv das aufzählbare Komplement L̄ = Σ∗ − L besitzt, dann ist L rekursiv. Beweis. Gegeben sind TM M für die Sprache L und M̄ für die Sprache L̄ Wir konstruieren eine TM, M1 , die L akzeptiert und auf jede Eingabe hält: M1 ist eine 2-Band TM, die auf Band 1 die Maschine M und auf Band 2 die Maschine M̄ simuliert. Die Maschine M1 rechnet so lange, bis auf Band 1 oder Band 2 die Berechnung hält. Wenn das passiert, dann (a) M1 akzeptiert genau wenn M auf Band 1 akzeptiert (falls M hält) und 3.5. REKURSIVE SPRACHEN 99 (b) M1 akzeptiert genau wenn M̄ auf Band 2 nicht akzeptiert (falls M̄ hält). Die einzige Frage ist: hält M1 auf jede Eingabe w2 ? Ja! Wenn w ∈ L, hält die Maschine M . Und wenn w ∈ L̄(= L(M¯)), dann hält die Maschine M̄ . Bemerkung 3. Jede rekursive Sprache ist selbstverständlich rekursiv aufzählbar, und jede kontextfreie Sprache ist rekursiv, wie sofort bewiesen wird. REGULÄR KONTEXTFREI REKURSIV REKURSIV AUFZÄHLBAR ALLE SPRACHEN Beispiel 5 in Abschnitt 3.2.5 zeigt, dass die Sprache L = {an bn cn ; n ≥ 1} rekursiv (aber nicht kontextfrei) ist. Ein Beispiel einer Sprache, die rekursiv aufzählbar aber nicht rekursiv ist, wird in Kapitel 5 vorgeführt. Dort zeigen wir, dass ein solches Beispiel die Sprache Lhalt aller Wörter c(M )w ist, wobei M eine Turingmaschine und w ein Eingabewort ist, auf das die Turingmaschine M hält. (Das bedeutet, dass das Halteproblem“ nicht ” entscheidbar ist.) 100 KAPITEL 3. TURINGMASCHINEN Kapitel 4 Church-Turing-These, rekursive Funktionen und Grammatiken 4.1 Berechenbare Funktionen Der berühmte Logiker Alfonzo Chruch, als er gesehen hat, dass sein am Anfang der 1930’er eingeführte λ-Kalkül genau dieselbe ”berechenbare” Funktion, definiert als die µ-rekursive Funktion hat einige Jahre vor Turings Paper über TM die These formuliert, dass der intuitive Begriff einer Funktion, die mechanisch berechnet werden kann, mit dem Begriff von µ-rekursiven Funktionen übereinstimmt. Später hat Turing, unabhängig von Chruch, seine These formuliert: die mechanisch berechenbare Funktionen sind genau die, die eine TM berechnen kann. Wie werden berechnen TM Funktionen berechnet? Wir beginnen mit zwei Beispielen. Beispiel 1. Die Funktion f (x) = 2x für x in binären Darstellung schreibt eine 0 am Ende des Wortes: (q0 , 0) → (q0 , R) (q0 , 1) → (q0 , R) (q0 , #) → (qF , 0) Beispiel 2. Die Nachfolgegeschwindigkeit succ(x) = x + 1 kann in der binären Darstellung auch einfach als TM dargestellt werden. Noch einfacher ist sie im Alphabet Σ = {∣}. Hier ist Σ∗ die unäre Darstellung von natürliche Zahlen: statt 0, 1, 2, . . . schreiben wir ε, ∣, ∣∣ Die TM für succ ist deswegen wie folgt: (q0 , #) → (qF , ∣) (q0 , ∣) → (q0 , R) Bemerkung 1. Daraus, dass die Nachfolgefunktion durch eine TM berechenbar werden kann folgt, dass die Addition auch berechnet werden kann, denn Addition ist eine rekursive Anwendung von succ. Analog: Multiplikation kann durch eine TM berechnet werden, denn dies ist eine rekursive Anwendung von Addition. Um diese Überlegung zu präsentieren, werden wir die primitiv rekursiven Funktionen einführen und beweisen, dass sie durch eine TM berechenbar sind. Erst müssen wir aber erklären, wie Funktionen durch eine TM programmiert werden. 101 102KAPITEL 4. CHURCH-TURING-THESE, REKURSIVE FUNKTIONEN UND GRAMMATIKEN Definition. Wir sagen, dass eine TM eine partielle Funktion f von Σ∗ nach Γ∗ berechnet wenn das Bandalphabet die menge Σ ∪ Γ enthält und auf jede Eingabe w aus Σ∗ Solche Funktionen heißen partiell-berechenbar. (a) M hält, wenn f (w) definiert ist, und auf dem Band steht f (w) und (b) M hält nicht, wenn f (w) nicht definiert ist Beispiel 3. Die partielle Funktion pred ∶ N → N definiert durch pred(n) = n − 1 für n ≠ 0 wird im Alphabet Σ = {∣} wie folgt berechnet: (q0 , #) → (q0 , R) (q0 , ∣) → (qF , #) In der Tat, für Eingabe 0 hält die TM nicht, denn sie geht stets nach rechts. Für Eingabe n = ∣∣ . . . ∣, n ≠ 0, löscht sie ein ∣ und hält. Definition. Eine (überall definierte) Funktion heißt berechenbar oder rekursiv wenn sie durch eine TM, die auf jede Eingabe hält berechnet werden kann. Bemerkung 2. 1. Wie im Fall von Sprachenakzeptanz können wir auch für Funktionen den Begriff der TM modifizieren und zum Beispiel eine MehrbandTM benutzen. Es ist dann üblich, Band 1 als Eingabeband und Band 2 als Ausgabeband (mit Inhalt f (w), nachdem die TM hält) zu verwenden. 2. Der Finalzustand spielt bei Berechnungen keine Rolle (und könnte, für diese Anwendung der TM, aus der Definition entfernt werden). 3. Für Funktionen zweier (oder mehrerer) Variablen werden die verschiedenen Variablen voneinander durch eine leere Zelle getrennt. Also zum Beispiel eine Funktion f (w1 , w2 ) zweier Variabler aus Σ∗ mit Werten in Γ∗ wird von einer TM berechnet, falls die TM auf jede Eingabe w1 #w2 mit Bandinhalt f (w1 , w2 ) hält. sectBspAltDreiFuenfDrei bspAltDreiFuenfDrei Beispiel 4. Addition. Wir wollen die Funktion f (n, m) = n + m (unär dargestellt) durch eine TM berechnen: es genügt, das erste Symbol ∣“ zu streichen und die ” Lücke, die die zwei Variablen voneinander trennt, durch ∣“ zu ersetzen: ” (q0 , ∣) → (q1 , #) (q0 , #) → (qF , R) (q1 , #) → (q2 , R) (q2 , ∣) → (q2 , R) (q2 , #) → (qF , ∣) Genauer, die TM M = ({q0 , q1 , q2 , qF }, {∣}, δ, q0 , qF ) mit der oben definierten Übergangsfunktion δ berechnet die Addition in unärer Darstellung. sectBspAltDreiFuenfVier bspAltDreiFuenfVier Beispiel 5. Multiplikation. Die Funktion f (n, m) = n ∗ m (unär dargestellt) kann von der folgenden 2-Band-TM berechnet werden: Band 1 ist das Eingabeband, aus Band 2 schreibt die Maschine n-mal hintereinander die Zahl m, das heißt, m Symbole ∣“. Dann hält sie und hat auf Band 2 ” (Ausgabeband) die Zahl n ∗ m. 4.1. BERECHENBARE FUNKTIONEN ctBspAltDreiFuenfFuenf bspAltDreiFuenfFuenf ctBspAltDreiFuenfSechs bspAltDreiFuenfSechs 103 Bemerkung 3. Wer der Churchschen These glaubt, erwartet, dass jede durch einen (terminierenden) Algorithmus gegebene, voll-definierte Funktion durch eine TM berechenbar sein muss: man implementiert einfach den Algorithmus auf einer TM. Beispiel 6. Division. Die Funktion n ∶ m (ganzzahlig) falls m ≠ 0 f (n, m) = { undefiniert falls m = 0 kann von der folgenden 2-Band-TM berechnet werden: Band 1 ist das Eingabeband, auf Band 2 schreibt die TM erst n und dann versucht sie, m Striche auf Band 2 wegzuwischen“. Falls dies nicht möglich ist, hält sie. Falls es jedoch möglich ist, ” versucht die Maschine erneut, m Striche auf Band 2 zu löschen und so weiter. Beispiel 7. Eine unberechenbare Funktion β ∶ N → N. Diese Funktion, die als busy beaver“ (fleißiger Biber) bekannt ist, ist wie folgt ” definiert: β(0) = 0 und für jedes n > 0 ist β(n) = k, falls k die größte Zahl ist, die eine TM mit n Zuständen auf die leere Eingabe schreiben kann. D.h., die TM hält auf der leeren Eingabe mit ∣k auf dem Band. Wir können β(n) einfach bestimmen, wenn wir alle TM mit n Zuständen durchgehen (und die, die auf die leere Eingabe nicht halten, ausschließen). (a) β(1): Die TM mit der einzigen Übergangsregel (q0 , #) → (q0 , ∣) schreibt ∣ auf die leere Eingabe. Daraus folgt β(1) ≥ 1. Aber jede Maschine mit nur einem Zustand, die mehr als einen Strich auf die leere Eingabe schreibt, hält nie. Also gilt β(1) = 1. (b) β(2): Die folgende TM (q0 , #) → (q0 , ∣) (q0 , ∣) → (q1 , R) schreibt ∣∣ auf das leere Band. Umgekehrt, für jede (q1 , #) → (q1 , ∣) TM mit zwei Zuständen darf δ nur auf drei Elementen der vierelementigen Menge Q × Σ definiert sein, damit die Maschine hält. Daraus folgt sofort β(2) = 2. (c) Im allgemeinen gilt (∗) β(n + 2) > β(n) für jedes n. In der Tat, falls β(n) = k, d.h., falls eine Turingmaschine M mit n Zuständen ∣k schreibt, konstruieren wir eine Turingmaschine, M ′ , die n + 2 Zustände hat und ∣k+1 schreibt – woraus β(n + 2) ≥ k + 1 > β(n) folgt. Wir fügen zwei neue Zustände q ′ und q ′′ zu den Zuständen von M hinzu. Hält M im Zustand q auf einem Feld ∣, so ergänzen wir M um drei neue Übergangsregeln: (q, ∣) → (q ′ , L) (q ′ , ∣) → (q ′ , L) (q ′ , #) → (q ′′ , ∣). Hält dagegen M im Zustand q auf einem Feld #, so kann sich dieses Feld wegen der Maximalität von β(n) nur direkt neben dem Ergebnis ∣k von M befinden. Wir können M nun um die Übergangsregel (q, #) → (q ′′ , ∣) ergänzen. In jedem Fall hält die Maschine M ′ im Zustand q ′′ , nachdem sie ∣k+1 geschrieben hat. 104KAPITEL 4. CHURCH-TURING-THESE, REKURSIVE FUNKTIONEN UND GRAMMATIKEN sectSatzZuFGibtEsR satzZuFGibtEsR Satz 1. Für jede berechenbare Funktion f (n) gibt es eine Konstante r mit der Eigenschaft, dass β(n + r) ≥ f (n) für alle n. Beweis. f (n) wird von einer Turingmaschine M berechnet. Sei r die Zahl aller Zustände von M . Wir konstruieren für jede Zahl n eine Turingmaschine Mn , die n + r Zustände hat und f (n) Striche auf die leere Eingabe schreibt – damit ist β(n + r) ≥ f (n) bewiesen. Zu den Zuständen von M werden n neue Zustände q 0 (initial), q 1 , . . . , q n−1 hinzugefügt, sodass Mn auf die leere Eingabe n-mal einen ∣ schreibt und sich dabei nach links bewegt: für i = 0, . . . , n − 1 (q i , #) → (q i , ∣) (q i , ∣) → (q i+1 , L) für i = 0, . . . , n − 2 (q n−1 , ∣) → (q0 , ∣) Der letzte Übergang bedeutet, dass von jetzt an die Maschine M (mit der Eingabe ∣n ) simuliert wird – sie schreibt also ∣f (n) und hält. Folgerung 4. Die busy-beaver-Funktion β(n) ist nicht berechenbar. Falls nämlich β(n) berechenbar wäre, müsste auch β(2n) berechenbar sein (wir hätten eine TM, die erst die Zahl aller ∣′ e der Eingabe verdoppelt, siehe Beispiel ?? und dann die TM für β(n) simuliert). Dann würde es eine Konstante r geben mit β(n + r) ≥ β(2n) für alle n. Speziell ergibt n = r + 2 β(2r + 2) ≥ β(2r + 4), ein Widerspruch zu (c) oben. 4.2 Primitive Rekursion Wir betrachten hier Funktionen mehrerer Variablen aus N die durch Rekursion und Verknüpfung aus sehr einfachen ”Basis”-Funktionen konstruiert werden. Die Fakultätsfunktion definiert man z.B. rekursiv mit Multiplikation, die Multiplikation wiederum rekursiv mit Addition und die Addition rekursiv mit der Nachfolgerfunktion succ. Hier endet aber diese Kette: succ ist eine der Basisfunktionen. Wir arbeiten hier mit k-stelligen Funktionen natürlicher Zahlen, d.h. mit Funktionen f ∶ Nk → N, wobei Nk = N × ⋅ ⋅ ⋅ × N (k-mal), für k = 1, 2, 3, . . . . f hat also k Variablen im Bereich N. Die konstante Funktion Ki mit Wert i gilt als 0-stellig, da sie von keiner Variablen abhängt. Nicht-konstante Funktionen sind k-stelllig für k ≥ 1. Besonders einfache k-stellige Funktionen sind die Projektionen π1k , . . . , πkk : die Projektion πik ordnet jedem k-Tupel sein i-tes Element zu. sectDfBasisfunktion dfBasisfunktion Beispiel 1. πik (n1 , n2 , . . . , nk ) = ni . Für k = 2 gibt es z.B. zwei Projektionen π12 (n, m) = n und π22 (n, m) = m. Für k = 1 ist π11 (n) = n die Identitätsfunktion. Definition. Die folgenden Funktionen heißen Basisfunktionen: 1. die Nachfolgerfunktion succ (mit succ(n) = n + 1) 2. die Nullfunktion K0 (mit dem einzigen Wert 0) und 3. die Projektionen πik für alle 1 ≤ i ≤ k, k = 1, 2, 3, . . . . 4.2. PRIMITIVE REKURSION ectBspAltVierFuenfEins bspAltVierFuenfEins 105 Aus den Basisfunktionen können weitere Funktionen mit Hilfe der Verknüpfung definiert werden: Beispiel 2. Konstante Funktionen. Die konstante Funktion K1 entspricht der Verknüpfung von K0 mit succ: K1 = succ(K0 ). Analog K2 = succ(K1 ) = succ(succ(K0 )) usw. ectBspAltVierFuenfZwei bspAltVierFuenfZwei Beispiel 3. Die Funktion f (n) = n + 2 für alle n ∈ N ist die Verknüpfung von succ mit sich selbst: f (n) = succ(succ(n)). ectBspAltVierFuenfDrei bspAltVierFuenfDrei Beispiel 4. Die Funktion g(n, m) = m + 2 (für alle n, m ∈ N) ist eine Verknüpfung der zweiten Projektion π22 (n, m) (die n wegfallen lässt) und der Funktion f aus Beispiel 3: g(n, m) = f (π22 (n, m)) = succ(succ(π22 (n, m)). Bemerkung 1. Im Allgemeinen definieren wir die Verknüpfung mehrstelliger Funktionen wie üblich: falls f ∶ Nk → N (k ≥ 1) eine k-stellige Funktion ist und g1 , . . . , gk ∶ Nm → N (m ≥ 0) k m-stellige Funktionen sind, ist die Verknüpfung von f mit g1 , . . . , gk die m-stellige Funktion h ∶ Nm → N, die durch h(n1 , . . . , nm ) = f (g1 (n1 , . . . , nm ), g2 (n1 , . . . , nm ), . . . , gk (n1 , . . . , nm )) für alle (n1 , . . . , nm ) auf Nm definiert wird. Beispiel 5. Aus der Nachfolgefunktion succ lässt sich die Addition add ∶ N×N → N wie folgt rekursiv definieren: add(n, 0) = n add(n, succm))succ(add(n, m)) Dies ist im Beispiel von primitiver Rekursion: Definition. Gegeben sei eine (k − 1)-stellige Funktion g und eine (k + 1)-stellige Funktion h, definieren wir ihre primitive Rekursion als die k-stellige Funktion f wie folgt: f (n1 , . . . , nk−1 , 0) = g(n1 , . . . , nk−1 ) und f (n1 , . . . , nk−1 , m + 1) = h(n1 , . . . , nk−1 , m, f (n1 , . . . , nk−1 , m)). ectBspAltVierFuenfVier bspAltVierFuenfVier Beispiel 6. Addition. add(n, m) = n + m wird durch primitive Rekursion mit g(n) = n = π11 (n) und h(n, m, i) = succ i = succ(π33 (n, m, i)) definiert. In der Tat gilt add(n, 0) = g(n) add(n, m + 1) = h(n, m, add(n, m)). ctBspAltVierFuenfFuenf bspAltVierFuenfFuenf Beispiel 7. Die Multiplikation ist durch primitive Rekursion aus Addition definiert: n∗0=0 106KAPITEL 4. CHURCH-TURING-THESE, REKURSIVE FUNKTIONEN UND GRAMMATIKEN sectDfPrimitivRekursiv dfPrimitivRekursiv n ∗ (m + 1) = (n ∗ m) + m. Genauer: für mul(n, m) = n ∗ m definieren wir g(n) = K0 und h(n, m, i) = add(m, i) = add(π23 (n, m, i), π33 (n, m, i)). Dann gilt mul(n, 0) = g(n) mul(n, m + 1) = h(n, m, mul(n, m)). Definition. Eine Funktion heißt primitiv-rekursiv , falls sie durch endlich viele Anwendungen von Verknüpfung und primitiver Rekursion auf die Basisfunktionen definiert werden kann. Mit anderen Worten ist die kleinste Klasse von Funktionen, die alle Basisfunktionen enthält und unter Verknüpfung und primitiver Rekursion abgeschlossen ist, die Klasse aller primitiv-rekursiver Funktionen. sectBspAltVierFuenfSechs bspAltVierFuenfSechs Beispiele: Kn , f (n) = n+2, g(n, m) = m+2, add(n, m) und mul(n, m) sind primitivrekursiv. Beispiel 8. Die Fakultätsfunktion m! ist primitiv-rekursiv, da sie mit der folgenden primitiven Rekursion definiert werden kann: 0! = 1 (m + 1)! = mul(m + 1, m!). Hier ist also g = K1 und h(x, y) = mul(x + 1, y) = mul(succ(π12 (x, y), π22 (x, y)). Da g und h beide primitiv-rekursiv sind, ist auch m! primitiv-rekursiv. sectBspAltVierFuenfAcht bspAltVierFuenfAcht Beispiel 9. Die modifizierte Subtraktion n − m falls n ≥ m n −̇ m = { 0 falls n < m ist primitiv-rekursiv: n −̇ 0 = n n −̇ (m + 1) = f (n −̇ m) für f aus Beispiel ??. Hier gilt also g(n) = n und h(n, m, i) = f (π33 (n, m, i)) = f (i). Bemerkung 2. Die Klasse aller primitiv-rekursiven Funktionen ist so mächtig, dass es nicht einfach ist, ein Beispiel einer Funktion außerhalb dieser Klasse zu finden (siehe Beispiel 10). Deswegen ist der folgende Satz eine neue Bestätigung der Stärke von Turingmaschinen. ursivUndTuringberechenbar ursivUndTuringberechenbar Satz 1. Jede primitiv-rekursive Funktion ist Turing-berechenbar. Beweis. Es genügt, zu beweisen, dass gilt: 1. alle Basisfunktionen sind Turing-berechenbar, 2. die Verknüpfung Turing-berechenbarer Funktionen ist Turing-berechenbar, und 3. die primitive Rekursion, die mit zwei Turing-berechenbaren Funktionen arbeitet, ergibt eine Turing-berechenbare Funktion. Dann sind alle primitiv-rekursiven Funktionen Turing-berechenbar. (1) ist trivial und (2) auch: Die Verknüpfung f (g(n)) wird z.B. von einer 2-BandTM berechnet, wobei Band 1 die Funktion g(n) berechnet und das Ergebnis als Eingabe der Funktion f auf Band 2 kopiert. 4.2. PRIMITIVE REKURSION 107 Wir wollen also (3) beweisen, d.h., dass es für die Funktion f mit f (n1 , . . . , nk , 0) = g(n1 , . . . , nk ) und f (n1 , . . . , nk , m + 1) = h(n1 , . . . , nk , m, f (n1 , . . . , nk , m)) eine TM gibt, falls Mg und Mh zwei TM sind, die g und h berechnen. Unsere TM hat fünf Bänder: Band 1 (Eingabeband) Band 2 (Schrittzähler) n1 $ n2 $ ... $ nk m Band 3 (simuliert Mg ) FUNKTION g Band 4 (simuliert Mh ) FUNKTION h Band 5 (Ausgabeband) ZWISCHENERGEBNIS j Die Berechnung von f erfolgt in Schritten Nr. m = 0, 1, 2, . . . , die auf Band 2 gezählt werden und die wie folgt ablaufen: Schritt 0: Band 2 enthält 0, auf Band 3 wird n1 , . . . , nk−1 (von Band 1) kopiert und g(n1 , . . . , nk−1 ) wird berechnet. Das Ergebnis wird auf Band 5 geschrieben. Schritt m + 1: Falls nk der Inhalt von Band 2 ist, hält die TM. (Band 5 enthält dann das Ergebnis.) Falls nicht, wird auf Band 4 die Eingabe n1 $ . . . $ nk $ m $ j geschrieben. j = f (n1 , . . . , nk−1 , m) ist der Inhalt von Band 5, m der von Band 2. Jetzt wird h(n1 , . . . , nk , m, j) berechnet und das Ergebnis auf Band 5 geschrieben. Der Inhalt von Band 2 wird um eins erhöht. Folgerung 5. Die busy beaver Funktion β ist nicht primitiv rekursiv. Bemerkung 3. Nicht jede partiell berechenbare Funktion ist primitiv-rekursiv. In der Tat sind alle primitiv-rekursiven total (d.h. überall definiert), und es gibt partielle Turing-berechenbare Funktionen. Aber auch alle totalen berechenbaren Funktionen sind leider nicht primitiv-rekursiv. Das können wir abstrakt wie folgt zeigen: alle primitiv-rekursiven Funktionen können wir systematisch aufzählen, z.B. setzen wir f0 = K0 , f1 = succ, f2 = π11 . Mit den gegebenen Funktionen f0 , . . . , fi machen wir alle möglichen Verknüpfungen und primitiven Rekursionen. Dabei entstehen fi+1 , . . . , fj , dann ist fj+1 die nächste noch nicht eingenommene Projektion, usw. Diese Aufzählung kann bestimmt eine TM durchführen. Dann ist die Funktion P (n) = 1 + fn (n, n, . . . , n) Berechenbar. Aber P ist nicht primitiv-rekursiv: falls nämlich P = fn , haben wir P (n) = 1 + fn (n) ≠ fn (n) – ein Widerspruch. Es ist Wilhelm Ackermann 1928 gelungen, ein viel konkreteres Beispiel einer Funktion anzugeben, die nicht primitiv-rekursiv ist, sich aber mit einem einfachen Algorithmus berechnen läßt. Die Funktion, die man heute Ackermann-Funktion nennt, ist eine von Rozsa Peter später entdeckte Vereinfachung der ursprünglichen Idee: ctBspAckermannFunktion bspAckermannFunktion Beispiel 10. Die Ackermann-Funktion A ∶ N2 → N ist wie folgt definiert: A(0, m) = m + 1 A(n + 1, 0) = A(n, 1) und A(n + 1, m + 1) = A(n, A(n + 1, m)). Es gilt also 108KAPITEL 4. CHURCH-TURING-THESE, REKURSIVE FUNKTIONEN UND GRAMMATIKEN A(0, 0) = 1, A(0, 1) = 2, A(1, 0) = A(0, 1) = 2, A(0, 2) = 3, A(1, 1) = A(0, A(1, 0)) = A(0, 2) = 3, A(2, 0) = A(1, 1) = 3, usw. Wir erhalten einen Algorithmus, um jeden Wert A(n, m) zu berechnen: alle möglichen Paare (n, m) werden so aufgezählt, dass der Wert A(n, m) direkt aus den vorigen Werten berechnet wird. ⋰2 Beispiel 11. A(4, m) = 22 −3 mit m+2 Exponenten. So dass zum Beispiel A(4, 4) 5000 mehr als 1010 dezimale Ziffern braucht (und es gibt weniger als 1080 Atome im sichtbaren Teil des Universums). Die Formel für A(4, m) lässt sich einfach per IndukA(1, m) = m + 2 tion beweisen, wobei man erst die folgenden Formeln beweist: A(2, m) = 2m + 3 A(3, m) = 2m+3 − 3 All diese Beweise sind trivial. Satz 2. (Ohne Beweis.) Die Ackermann-Funktion ist nicht primitiv-rekursiv, denn A(n, n) wächst schneller als jede primitiv-rekursive Funktion f (n) (d.h., es gibt eine Konstante n0 mit f (n) < A(n, n) für alle n ≥ n0 ). Satz 3. Die Ackermann-Funktion ist berechenbar. Beweis. Gegeben seien n, m. Wir wollen A(n, n) durch eine TM berechnen. Die TM berechnet systematisch alle Werte von A und schreibt sie in der Form $$n0 $m0 $A(n0 , m0 )$$ in einem Speicher: $$0$0$1$$0$i$2$$1$0$0$2$$ . . . ∥ ∥ A(0, 0) A(0, 1) A(1, 0) ∥ A(0, 1) Bei jedem Schritt fragt sie, ob sie schon A(n, n) berechnet hat: n m Band 1 (Eingabeband) Band 2 (Ausgabe) A(n, m) Band 3 (Zähler) n0 = 0, 1, 2 . . . Band 4 (Zähler) n0 = 0, 1, 2 . . . Band 5 (Speicher) $$n0 $m0 $A(n0 , m0 )$$⋯ Am Anfang ist B2 leer, auf B3 und B4 steht 0 und dann fängt die Maschine mit den folgenden Schritten an: (a) Ist n0 = n und m0 = m? Wenn ja, schreibe A(n, m) aus B5 auf B2 und halte. (b) Wenn nein, berechne den nächsten Wert der Ackermann-Funktion: entweder setze n0 ∶= n0 + 1, berechne A(n0 + 1, m0 ) und schreibe es auf B7, oder setze m0 ∶= m0 + 1, berechne A(n0 , m0 + 1) und schreibe es auf B7. GOTO (a). 4.3 µ-rekursive Funktionen Die Operationen Verknüpfung und primitive Rekursion sind nicht stark genug, um alle berechenbaren Funktionen zu generieren. Aber wenn der folgenden Operation µ hinzugefügt wird, genügen sie: 4.3. µ-REKURSIVE FUNKTIONEN 109 Definition. Gegeben sei eine partielle Funktion f von k + 1 variablen, definieren wir ihre Minimierung µf als die folgende partielle Funktion von k Variablen: µf (n1 , . . . , nk )) = m wenn m die kleinste zahl ist, so dass f (n1 , . . . , nk , m) = 0. (Und wenn keine solche Zahl existiert, ist µf in den k-Tupel nicht definiert). Notation. Wir schreiben auch µm f um zu betonen, dass die Variable m minimiert wird. Beispiel 1. Die Vorgängerfunktion pred(n) hat die Form µm f für f (n, m) = n − m (undefiniert für n < m). Beispiel 2. Die Funktion ⎧ ⎪0 für n = 0 ̂0 (n) = ⎪ K ⎨ ⎪ undefiniert sonst ⎪ ⎩ hat die Form ̂0 (n) = µm π 1 (n, m). K 1 In der Tat, π11 (n, m) = 0 nur wenn n = 0 und das kleinste mögliche m ist m = 0. Beispiel 3. Für die Funktion der ganzzahligen Divison: ⎧ ⎪ falls dividierbar ⎪n ∶ m div(n, m) ⎨ ⎪ undefiniert sonst ⎪ ⎩ hätten wir die Tendenz zu schreiben div(n, m) = µk (n − m ∗ k). Denn das kleinste k mit n − m ∗ k = 0 ist k = setzen wir f (n, m, k) = n − succ(pred(m)) ∗ k Dann gilt div(n, m) = µk f (n, m, k) n . m Aber dies ergibt 0 ∶ 0 = 0. Deswegen Definition. Eine Funktion heißt rekursiv (oder µ-rekursiv), wenn sie durch die Basisfunktionen und endlich viele Anwendungen von 1. Verknüpfung, 2. primitiver Rekursion und 3. Minimierung µ definiert werden kann. Beispiel 4. (a) Alle primitiv-rekursive Funktionen sind µ-rekursiv (b) Die Funktion sub(n, m) = n − m für n ≥ m ̂0 in Beispiel 2 durch die folgende ist µ-rekursiv: sie ensteht aus der Funktion K primitive Rekursion: ̂0 (m) sub(0, m) = K sub(n + 1, m) = succ(sub(n, m)). D.h., die Bestandteile der primitiven Rekursion sind ̂0 g(m) = K h(n, m, i) = succ(i) = succ(π13 ) beide µ-rekursiv. 110KAPITEL 4. CHURCH-TURING-THESE, REKURSIVE FUNKTIONEN UND GRAMMATIKEN (c) Deswegen ist pred µ-rekursiv, siehe Beispiel 1. Und auch Division ist µ-rekursiv, siehe Beispiel 3. ursivUndTuringberechenbar ursivUndTuringberechenbar Satz 1. Jede µ-rekursive Funktion ist partiell berechenbar. Beweis. Es genügt zu den Punkten 1. - 3. aus Satz 1 einen vierten Punkt hinzuzufügen: 4. Falls f partiell berechenbar ist, so ist es auch µf . Sei M eine TM, die f berechnet. Wir konstruieren eine 3-Band TM für µf wie folgt: n1 $ n2 $ . . . $ nk Band 1 (Eingabeband) Band 2 (Schrittzähler) i Band 3 (simuliert M ) FUNKTION f Am Anfang wird i = 0 auf Band 2 geschrieben, und dann wird auf Band 3 immer f (n1 , . . . , nk , i) berechnet. Falls das Ergebnis 0 ist, hält die TM, und Band 2 enthält die Ausgabe. Falls das Ergebnis nicht 0 ist, wird Band 2 um 1 erhöht (i ∶= i + 1), und f (n1 , . . . , nk , i) wird erneut berechnet, usw. ingberechenbarUndRekursiv ingberechenbarUndRekursiv Satz 2. (Ohne Beweis) Jede partiell berechenbare Funktion ist µ-rekursiv. Bemerkung 1. Für die totalen berechenbaren Funktionen gibt es einen analogen Satz. Die einzige Differenz ist, dass der Minimierungsoperator µ nur eingeschränkt benutzt wird: Definition. Eine totale Funktion f von k + 1 Variablen heißt minimierbar wenn für jeden k-Tupel n1 , . . . , nk es ein m gibt mit f (n1 , . . . , nk , m) = 0. Bemerkung 2. µm f ist dann eine totale Funktion. Satz 3. (Ohne Beweis.) Eine totale Funktion (mehrerer Variablen aus N) ist berechenbar, genau dann, wenn sie aus den Basisfunktionen durch endlich viele Anwendungen von Verknüpfungen, primitive Rekursion und Minimierung von minimierbaren Funktionen definiert werden kann. Beispiel 5. Die Ackermann-Funktion ist µ-rekursiv (mit µ nur auf minimierbare Funktionen angewendet). 4.4 sectDefGrammatik defGrammatik Grammatiken und Turingmaschinen In Kapitel 2 sprachen wir von kontextfreien Grammatiken, die es erlauben, eine Variable durch ein Wort zu ersetzen. Das ist ein Spezialfall einer Grammatik (auch unbeschränkte Grammatik oder Grammatik des Typs 0 genannt), die es allgemein erlaubt, ein Wort durch ein anderes zu ersetzen. Es zeigt sich, dass diese Grammatiken genau die rekursiv aufzählbaren Sprachen definieren. In diesem Sinn erhalten wir also ein vollkommen neues Modell von Sprachen, die Turing-akzeptierbar sind. Definition. Eine Grammatik G ist ein Quadrupel G = (Σ, V, S, R), wobei Σ das Alphabet aller Terminalsymbole, V das Alphabet aller Variablen (zu Σ disjunkt), S ∈ V das Startsymbol und R eine endliche Menge an Paaren (α, β) von Wörtern über Σ ∪ V mit α ≠ ε ist. 4.4. GRAMMATIKEN UND TURINGMASCHINEN 111 Bemerkung 1. Elemente (α, β) aus R werden mit α→β bezeichnet und werden Produktionen oder Ersetzungsregeln genannt. Die Anwendung einer Regel α → β auf ein Wort w ist genau dann möglich, wenn w die Form w = w′ αw′′ (w′ , w′′ Wörter über Σ ∪ V ) hat. Das Ergebnis der Anwendung ist das Wort w′ βw′′ . Notation. 1. Mit ⇒ bezeichnen wir die Anwendung einer einzigen Regel; also schreiben wir für zwei Wörter u, w in (Σ ∪ V )∗ u ⇒ v, falls es eine Regel α → β in R und Wörter u1 , u2 in (Σ ∪ V )∗ gibt, so dass u = u1 αu2 und v = u1 βu2 . fDurchGErzeugteSprache fDurchGErzeugteSprache sectBspAltVierDreiZwei bspAltVierDreiZwei 2. Mit ⇒∗ bezeichnen wir die reflexive und transitive Hülle der Relation ⇒. Definition. Für jede Grammatik G heißt die Menge aller Wörter über Σ, die vom Startsymbol ableitbar sind, die Sprache L(G) erzeugt durch G. Kürzer: L(G) = {w ∈ Σ∗ ; S ⇒∗ w}. Alle oben definierten Begriffe verallgemeinern die in Kapitel 2 eingeführten Begriffe für kontextfreie Sprachen. Aber die allgemeinen Grammatiken erzeugen Sprachen, die nicht kontextfrei sein müssen: Beispiel 1. Eine Grammatik für die (nicht kontextfreie) Sprache L = {an bn cn ; n ≥ 1}. Sei G = ({a, b, c}, {B, C, S}, S, R) die Grammatik mit den Regeln (1) S → aBC ∣ aSBC (2) CB → BC (3) aB → ab (4) bB → bb (5) bC → bc (6) cC → cc Das Wort an bn cn , n ≥ 1, liegt in L(G), da es sich wie folgt ableiten lässt: S ⇒∗ an−1 S(BC)n−1 [Regel S → aSBC, (n − 1)-mal angewendet] ⇒ an (BC)n [Regel S → aBC] ⇒∗ an B n C n [Regel BC → CB, (n − 1)-mal angewendet] ⇒ an bB n−1 C n [Regel aB → ab] ⇒∗ an bn C n [Regel bB → bb, (n − 1)-mal angewendet] ⇒ ⇒∗ an bn cC n−1 an bn cn [Regel bC → bc] [Regel cC → cc, (n − 1)-mal angewendet] Umgekehrt beweisen wir, dass nur Wörter der Form an bn cn ableitbar sind. In der Tat: falls w ein Wort ist, das von S ableitbar ist und keine Variable enthält, beweisen wir das folgende: 1. Die Anzahl von a’s im Wort w ist dieselbe wie die von b’s und dieselbe wie die von c’s . In der Tat, die Regeln (2) - (6) ändern die Anzahl der Buchstaben a, b/B oder c/C nicht, und Regel (1) erhöht alle drei dieser Zahlen gleichzeitig um 1. 2. Alle a’s stehen links im Wort w, das heißt, w hat die Form w = an v (und v besteht aus n b’s und n c’s ). Keine der Regeln (1) - (6) ändert nämlich die linke Position von a. 112KAPITEL 4. CHURCH-TURING-THESE, REKURSIVE FUNKTIONEN UND GRAMMATIKEN 3. Das Wort w enthält nicht die Kombination cb (das heißt, w hat nicht die Form w = ucbv). Um das zu beweisen, betrachten wir die Regeln (3) - (6): diese ändern weder Anzahl noch Position der Buchstaben a, b/B oder c/C im Wort, sie wandeln nur B → b oder C → c um. Wir können daher annehmen, dass in der Ableitung S ⇒∗ w zuerst nur die Regeln (1) und (2) benutzt werden, und dann erst werden die Regeln (3) - (6) angewendet. Genauer: es gibt eine Ableitung: S ⇒ w1 ⇒ w2 ⇒ ⋅ ⋅ ⋅ ⇒ wi ⇒ ⋅ ⋅ ⋅ ⇒ wk = w, wobei für S ⇒ ⋅ ⋅ ⋅ ⇒ wi nur die Regeln (1) und (2) angewendet werden und für wi ⇒ ⋅ ⋅ ⋅ ⇒ wk nur die Regeln (3) - (6). Dann unterscheiden sich die Wörter wi und wk nur dadurch, dass an der Stelle im Wort, an der b steht, wi den Buchstaben B hat und dasselbe gilt analog für c/C. Das Wort wi enthält die Kombination CB nicht, denn keine der Regeln (3) - (6) kann B in b umwandeln, falls vor diesem B entweder C oder c steht. Es folgt, dass das Wort w = wk die Kombination cb nicht enthält. 4. w = an bn cn , denn in 2. haben wir ein Wort v mit n b’s, n c’s und ohne die Kombination cb – das einzige Wort ist v = bn cn . Beispiel 2. Die Sprache aller Wörter über {a, b, c} mit der gleichen Anzahl von a’s, b’s und c’s. Auch diese Sprache ist nicht kontextfrei (beweisen Sie es mithilfe des Pumping-Lemmas!). Hier ist eine Grammatik für diese Sprache: (a) Start. Hier darf das Startsymbol einfach verschwinden: S → ABSC∣ε (b) Alle Variablen A, B, C sind untereinander kommutativ AB → BA BA → AB AC → CA CA → AC BC → CB CB → BC (c) Von Variablen zu Eingabesymbolen A→a B→b C → c. Jedes Wort w mit Länge 3n und mit n a’s, b’s sowie c’s lässt sich Ableiten: Wir verwenden erst (a) n − 1-mal S ⇒ ABSC ⇒ ABABSCC ⇒ . . . ⇒ (AB)n SC n ⇒ (AB)n C n Zunächst gestalten wir (AB)n C n zum Wort w um, außer dass die Buchstaben groß sind. Dies lässt sich durch Anwendung der Produktionen aus (b) leicht machen. Am Ende benutzen wir (c) um w zu erhalten. Um gekehrt, jedes Wort aus L(G) hat die gleiche Anzahl von a’s, b’s und c’s. in der tat, wir beweisen das folgende: gegeben S ⇒ w mit w über {a, b, c, A, B, C, S} ist die Anzahl von a, A gleich der von b, B und gleich der von c, C. Beweis per Induktion in der Länge k der Ableitung von w aus S: k=0 Dann w = s: die drei Zahlen sind gleich 0. k + 1: Wir haben S ⇒ w1 ⇒ . . . ⇒ wk ⇒ wk+1 (= w). Nach Induktionsvoraussetzung hat wk dieselbe Anzahl (sagen wir v) von a, A und 4.4. GRAMMATIKEN UND TURINGMASCHINEN 113 b, B und c, C. Das Wort wk+1 entsteht aus wk indem eine der Produktionen oben angewendet wird. Wenn S → ABSC angewendet wurde, hat wk genau i+1 der Symbole a, A sowie b, B und c, C. Alle anderen Produktionen haben die Eigenschaft, dass die Anzahl von a, A auf der rechten und linken Seite gleich ist. Dasselbe gilt für b, B und c, C. Deswegen hat auch wk+1 genau i Symbolen a, A sowie b, B und c, C. sectBspAltVierDreiDrei bspAltVierDreiDrei Beispiel 3. Simulation einer TM. Wir zeigen jetzt, wie die Arbeit einer TM vollständig von einer Grammatik simuliert werden kann. Erinnern wir uns an das Konzept von Konfigurationen (q, u, a, v) aus Kapitel 3.1: ... ... a ´¹¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¸ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¶ ⇑ ´¹¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¸ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¶ u v q Die Konfigurationen werden jetzt statt (q, uav) durch das Wort [uqav] über Σ ∪ Q ∪ {[, ], #} bezeichnet. Also ist die Initialkonfiguration mit Eingabe s1 . . . sn das Wort [q0 s1 . . . sn ]. Die Arbeit der TM wird durch die Relation ⊢ ( Folgekonfiguration“) beschrieben. ” Wir konstruieren jetzt eine Grammatik G, in der für zwei Konfigurationen gilt: [uqav] ⊢ [u′ q ′ a′ v ′ ] genau dann, wenn [u′ q ′ a′ v ′ ] ⇒ [uqav]. (Also beschreibt die Ableitung in der Grammatik G die Berechnung rückwärts.) Wir benutzen die Bandsymbole Σ der TM als terminale Symbole und die folgenden Variablen: V = Q ∪ {S, #, [, ]}; wir setzen V ∩ Σ = ∅ wie üblich voraus. Also G = (Σ, V, S, R), und die Produktionen R entsprechen den Möglichkeiten von ⊢ (siehe Tabelle 3.1 in Abschnitt 3.1): 1. Für jede Übergangsregel (q, s) → (q ′ , s′ ) der TM mit s′ in Σ ∪ {#} haben wir die Folgekonfigurationen [uqsv] ⊢ [uq ′ s′ v], und wir benötigen also die Produktion (in der Gegenrichtung) (1) q ′ s′ → qs. 2. Für jede Übergangsregel (q, s) → (q ′ , R) der TM haben wir die Folgekonfigurationen [uqsv] ⊢ [usq ′ v] falls v ≠ ε und [uqs] ⊢ [usq ′ #] falls v = ε. Wir benötigen dafür die Produktionen (2) sq ′ → qs (3) sq ′ #] → qs] 3. Für jede Übergangsregel (q, s) → (q ′ , L) brauchen wir die Produktionen (4) q ′ s′ s → s′ qs ∀s′ ∈ Σ ∪ {#} ′ (5) [q #s → [qs Nehmen wir jetzt an, dass die TM ein Wort s1 . . . sn über Σ akzeptiert, und dass sie ihr Eingabeband löscht, bevor sie hält. Dann haben wir eine Berechnung, die mit der Initialkonfiguration [q0 s1 . . . sn ] beginnt und mit der Finalkonfiguration [qF #] endet. Das heißt, aufgrund der Produktionen (1) (5) gibt es eine Ableitung (in der Gegenrichtung!) [qF #] ⇒ . . . ⇒ [q0 s1 . . . sn ]. 114KAPITEL 4. CHURCH-TURING-THESE, REKURSIVE FUNKTIONEN UND GRAMMATIKEN Wir fügen jetzt drei Produktionen hinzu, so dass wir dann vom Startsymbol S das Wort s1 . . . sn ableiten: (6) S → [qF #] (7) [q0 → ε (8) ] → ε Wir haben also die Grammatik GM = (Σ, V ∪ {#, [, ], S}, S, R) mit den Produktionen (1) - (8). Wir beweisen jetzt, dass sie die Sprache L(M ) erzeugt. sectSatzTMDieBandLoescht satzTMDieBandLoescht Satz 1. Falls M eine TM ist, die ihr Band immer löscht, bevor sie hält, dann gilt für die obige Grammatik GM , dass L(M ) = L(GM ). Beweis. 1. Jedes Wort w = s1 . . . sn , das M akzeptiert, ist aus GM ableitbar, das heißt, L(M ) ⊆ L(GM ). In der Tat, für eine gegebene Berechnung, die in der Konfiguration [q0 s1 . . . sn ] beginnt und in [qF #] endet, seien k0 = [q0 s1 . . . sn ] ⊢ k1 ⊢ . . . ⊢ kM = [qF #] die Konfigurationen der Berechnung. Dann gilt S ⇒ [qF #] ⇒ kM −1 ⇒ kM −2 ⇒ ⋅ ⋅ ⋅ ⇒ k1 ⇒ [q0 s1 . . . sn ] ⇒∗ s1 . . . sn , wobei am Anfang die Produktion (6) und am Ende die Produktionen (7) und (8) verwendet wurden. Also gehört s1 . . . sn zu L(GM ). 2. Sei w = s1 . . . sn ein Wort, das von S ableitbar ist. Wir haben eine Ableitung der Form S ⇒ [qF #] ⇒ w1 ⇒ w2 ⇒ . . . ⇒ wM = s1 . . . sn . Wir dürfen annehmen, dass die Regeln (7) und (8) (die bestimmt angewendet wurden, da w1 die beiden Klammern enthält, aber wM nicht) erst am Ende der Ableitung angewendet wurden, also wM −2 = [q0 s1 . . . sn ]. Für die Ableitung w1 ⇒∗ wM −2 wurden nur die Regeln (1) - (6) angewendet. Es ist also hinreichend, zu zeigen, dass, falls für zwei Konfigurationen w und w′ , w′ ⊢ w aufgrund von (1) - (6) gilt, dann folgt daraus w ⊢ w′ . (a) Falls die Produktion (1) angewendet wurde, gilt w′ = [uq ′ s′ v] und w = [uqsv], wobei qs → q ′ s′ eine Übergangsregel ist. Dann ist w′ eine Folgekonfiguration von w. (b) Falls die Produktion (2) angewendet wurde, gilt w′ = [usq ′ v] und w = [uqsv]. Wieder ist w′ eine Folgekonfiguration von w. (c) Falls die Produktion (3) angewendet wurde, gilt w′ = [usq ′ #] und w = [uqs], und auch diesmal ist w′ eine Folgekonfiguration von w. Analog mit den Produktionen (4) und (5). Also für w1 = [qF #] und wM −2 = [q0 s1 . . . sn ] folgt aus w1 ⇒∗ wM −2 , dass wM −2 ⊢∗ w1 . Das bedeutet, dass die TM auf die Eingabe s1 . . . sn hält und akzeptiert. Also gehört s1 . . . sn zu L(M ). ivaufzaehlbarUndGrammatik ivaufzaehlbarUndGrammatik Korollar 1. Für jede rekursiv-aufzählbare Sprache L gibt es eine Grammatik, die L erzeugt. sectBspAltVierDreiVier bspAltVierDreiVier sectBspAltVierDreiFuenf Beweis. Es gibt eine TM, die L akzeptiert. Sei M eine Modifikation dieser TM, die sich nur dadurch unterscheidet, dass M ihr Band löscht, bevor sie hält. Dann gilt L = L(M ) = L(GM ). 4.4. GRAMMATIKEN UND TURINGMASCHINEN bspAltVierDreiFuenf 115 Beispiel 4. Die folgende TM akzeptiert die Sprache aller ungeraden Zahlen (über Σ = {∣}): M = ({q0 , q1 , q2 }, {∣}, δ, q0 , qF ) mit Übergängen (q0 , ∣) → (q1 , #) (q1 , #) → (qF , R) (qF , ∣) → (q2 , #) (q2 , #) → (q0 , R) Dieser TM entspricht die folgende Grammatik GM = ({∣}, {q0 , q1 , q2 , #, [, ], S}, S, R) mit den Produktionen S → [qF #] q1 # → q0 ∣ #qF → q1 # #qF #] → q1 #] q2 # → qF ∣ #q0 → q2 # #q2 #] → q2 #] [q0 →ε ] →ε UndRekursivaufzaehlbar UndRekursivaufzaehlbar Satz 2. Jede von einer Grammatik erzeugte Sprache ist rekursiv-aufzählbar. Beweis. Wir wollen zeigen, dass für jede Grammatik G die Sprache L(G) von einer TM akzeptiert werden kann. Wir benutzen eine nichtdeterministische 2-Band-TM, die alle Produktionen von G in einem zusätzlichen Gedächtnis hat. Band 1 ist ein read-only Eingabeband. Auf Band 2 schreibt die TM zu Beginn das Startsymbol S. In jedem Berechnungsschritt zerlegt die TM nichtdeterministisch das Wort w auf Band 2 in drei Wörter: w = upv u, p, v ∈ (Σ ∪ V )∗ mit p ≠ ε. Zum Beispiel ist am Anfang die einzige mögliche Zerlegung u = ε, p = S und v = ε. Jetzt wählt die TM nichtdeterministisch eine Produktion von G von der Form p → q (falls keine solche Produktion existiert, hält die TM in einem nichtfinalen Zustand). Dann schreibt die TM das Wort w′ = uqv auf Band 2 und vergleicht Band 1 mit Band 2. Falls die Inhalte gleich sind, hält die TM und akzeptiert. Falls sie nicht gleich sind, wird der neue Berechnungsschritt (Zerlegung des Wortes w′ in drei Wörter usw.) gestartet. Es ist klar, dass die Eingabe auf Band 1, falls sie von S ableitbar ist, nach endlich vielen Berechnungsschritten (die der Ableitung der Eingabe aus S entsprechen) akzeptiert wird. Falls umgekehrt die Eingabe nicht zu L(G) gehört, ist jede mögliche Berechnung entweder unendlich oder hält und akzeptiert nicht. 116KAPITEL 4. CHURCH-TURING-THESE, REKURSIVE FUNKTIONEN UND GRAMMATIKEN 4.5 Universelle Turingmaschine sectUnivTM Wir konstruieren jetzt eine universelle (oder programmierbare“) TM, die bei Ein” gaben der Form (c, w) c – Algorithmus, w – Datei die Datei w entsprechend des Algorithmus c berechnet. Da wir Algorithmen als Turingmaschinen interpretieren, können wir genauer sagen: eine universelle Turingmaschine Mu erhält als Eingabe ein Wort c(M )w, wobei c(M ) eine passende Codierung der (beliebigen) Turingmaschine M und w ein (beliebiges) Eingabewort für M ist. Dann berechnet Mu die Eingabe und liefert genau dasselbe Ergebnis, das die Maschine M auf Eingabe w liefert. Das können wir entweder in der Akzeptor-Variante interpretieren, also Mu hält genau dann auf c(M )w, wenn M auf w hält, und dann akzeptiert Mu genau dann, wenn M akzeptiert, oder in der Rechner-Variante, also Mu führt für c(M )w zu der gleichen Ausgabe wie M für w. Es zeigt sich, dass die Maschine Mu , die wir jetzt beschreiben, beide Rollen erfüllt. Wir beschränken uns auf TM mit dem binären Bandalphabet Σ = {0, 1}. Also hat die universelle Turingmaschine Mu sowie alle simulierten Maschinen M dieses Eingabealphabet. Codierung c(M ) von Turingmaschinen M : Für jede TM M = (Q, {0, 1}, δ, q0 , q1 ) deren Zustände Q = {q0 , q1 , . . . , qn−1 } so durchnummeriert sind, dass q0 der Initialzustand und q1 der Finalzustand ist, definieren wir ein binäres Codewort c(M ) wie folgt. Wir benutzen 0i um die Zahl i zu codieren und 1 als Trennungssymbol. Das Wort c(M ) hat die folgende Form: Am Anfang steht 0n , das die Anzahl n aller Zustände bezeichnet. Dann werden die einzelnen t Übergangsregeln aus R durch binäre Wörter w1 , . . . , wt codiert, wie später erklärt wird, und durch eine 1 voneinander getrennt. Am Ende schreiben wir 111. Der Code hat also die Form c(M ) = 0n 1w1 1w2 1 . . . 1wt 111. Um die Übergangsregeln zu codieren, schreiben wir für Zustände 10i+1 statt qi und codieren die Symbole L, R, #, 0, 1 wie folgt Symbol Code L 10 R 100 # 1000 0 104 1 105 Die Übergangsregel (qi , 0) → (qj , L) erhält also den Code w = 10i+1 104 10j+1 10, die Übergangsregel (qi , #) → (qj , 0) den Code w = 10i+1 103 10j+1 104 usw. 4.5. UNIVERSELLE TURINGMASCHINE bspTMcode1 117 Beispiel 1. Wir codieren die Maschine M1 mit Zuständen q0 , q1 und Übergangsregeln (q0 , 1) → (q1 , R) (q1 , #) → (q1 , 1) wie folgt: c(M1 ) = 111001w1 1w2 111 wobei w1 der Code für (q0 , 1) → (q1 , R) ist: w1 = 10105 100100 und w2 der Code für (q1 , #) → (q1 , 1) ist: w2 = 100103 100105 . Insgesamt ergibt sich c(M1 ) = 00110105 1001001100103 100105 111. Wir bemerken, dass einzelne Übergangsregeln voneinander durch 11 getrennt werden. Jede Turingmaschine wird durch ihren Code vollständig beschrieben. bspTMcode2 Beispiel 2. Falls eine Turingmaschine den Code c(M2 ) = 000110105 10103 110103 10101100104 103 100111 hat, muss es die Maschine M2 = ({q0 , q1 , q2 }, {0, 1}, δ, q0 , q1 ) mit den Übergangsregeln (q0 , 1) → (q0 , #) (q0 , #) → (q0 , L) (q1 , 0) → (q2 , R) sein. Bemerkung 1. Erinnern wir uns an die in Kapitel 3 eingeführte Sprache Lcode = { c(M ) ∣ M ist eine TM, die c(M ) nicht akzeptiert } . Zum Beispiel das Wort c(M1 ) in Beispiel 1 ist ein Codewort einer TM. Akzeptiert diese TM das Wort c(M1 ) ? Der erste Buchstabe von c(M1 ) ist 0 und da kein Übergang (q0 , 9) →? definiert ist, hält die TM sofort. Da q0 nicht final ist, akzeptiert das Wort c(M1 ) nicht. Das heißt, c(M1 ) ∈ Lcode . Wie in Abschnitt 3.4 bewiesen, ist die Sprache Lcode nicht rekursiv-aufzählbar. Das bedeutet, dass kein Algorithmus entscheiden kann, ob eine beliebige TM ihr eigenes Wort akzeptiert oder nicht. Universelle Turingmaschine Mu Wir konstruieren jetzt eine universelle Turingmaschine Mu . Also reagiert sie auf die Eingabe c(M )w, wobei M eine TM mit Eingabe aus {0, 1} und w ein Wort über {0, 1} ist, wie folgt: 118KAPITEL 4. CHURCH-TURING-THESE, REKURSIVE FUNKTIONEN UND GRAMMATIKEN 1. Mu hält genau dann, wenn M auf das Wort w hält, 2. Mu akzeptiert genau dann, wenn M das Wort w akzeptiert 3. falls M gehalten hat, hat Mu auf Band 1 dasselbe Ausgabewort wie M . Die Maschine Mu wird als eine 3-Band TM beschrieben, aber wir wissen, dass das unwichtig ist, weil wir eine 1-Band TM konstruieren können, die Mu simuliert. BAND 1 BAND 2 # 0 1 0 ´ ... 1 1 1 1 0 1 ... µ³ ¶ ´ µ³ w c(M ) 1 # # ¶ ... Enthält c(M ) 0 0 ... ´ µ³ i+1 BAND 3 0 ¶ Zustand qi Band 1 enthält am Anfang die Eingabe c(M )w. Das Ende des Wortes c(M ) wird durch 111 gekennzeichnet und die Bänder 2 und 3 sind, wie üblich, leer. Zur Vorbereitung auf die Simulation führt Mu die folgenden Schritte aus: 1. c(M ) wird von Band 1 auf Band 2 kopiert und auf Band 1 gelöscht, 2. der Kopf von Band 1 wird auf das erste Symbol von w gestellt 3. Auf Band 3 wird 10 geschrieben (Zustand q0 ), und der Kopf wird auf die 1 gestellt. BAND 1 # 1 0 1 ... ´ µ³ ⇑ c(M ) 1 # # ¶ BAND 2 1 1 1 ... 1 1 1 ´ µ³ ¶ ⇑ c(M ) BAND 3 # 1 0 # ... ⇑ Dann wird M in rekursiven Schritten wie folgt simuliert (so dass das Band von M identisch mit dem Band 1 von Mu ist und der Zustand von M gleich qi ist, wobei 0i+1 auf Band 3 von Mu steht): Simulation von M : Der Kopf von Band 1 liest s = #, 0 oder 1, also ein Symbol, das den Code 10p hat, wobei p = 3 (#), p = 4 (0) oder p = 5 (1) gilt. Jetzt beginnt der Kopf auf Band 2 eine systematische Suche nach der Kombination 10i+1 10p , 4.5. UNIVERSELLE TURINGMASCHINE 119 wobei i + 1 die Zahl der 0’en auf Band 3 ist. Falls die Kombination 10i+1 10p nicht gefunden wurde, hat die Maschine M keine Übergangsregel (qi , s) →?, deshalb hält M . Also hält auch Mu (wenn sie die rechte Gruppe 111 auf Band 2 erreicht hat, ohne die gesuchte Kombination zu finden). Mu akzeptiert genau dann, wenn Band 3 den Inhalt 100 hat, d.h., genau dann, wenn M im Finalzustand q1 gehalten hat. Falls die Kombination 10i+1 10p gefunden wurde, liest der Kopf auf Band 2 weiter bis zur nächsten Gruppe 11. Wir haben jetzt das Wort 10i+1 10p 10j+1 10r 11 . . . auf Band 2 und das bedeutet, dass eine Übergangsregel von M die folgende Form besitzt: (qi , s) → (qj , s′ ) s′ hat den Code 10r (r = 1, . . . , 5) Die Maschine Mu ändert den Bandinhalt von Band 3 zu 10j+1 und bewegt den Kopf auf Band 1 nach links oder rechts, falls r = 1 oder 2 ist, oder Mu überschreibt s mit #(falls r = 3), 0 (r = 4) oder 1 (r = 5). Jetzt ist Mu für den nächsten Simulationsschritt vorbereitet. Definition. Die Sprache Lu = L(Mu ) aller binären Wörter c(M )w wobei die TM, M , das Wort w akzeptiert, heißt die universale Sprache. Folgerung 6. Lu ist rekursiv aufzählbar. Bemerkung 2. 1. Die obige Codierung kann auch auf nichtdeterministische Turingmaschinen mit dem Bandalphabet {0, 1} angewendet werden. 2. Es ist einfach zu entscheiden, ob ein binäres Wort v der Code einer (deterministischen oder nichtdeterministischen) TM ist. Die Codierungen sind nämlich alle von der Form TMcode1 (1) v = 0n 1w1 1w2 1 . . . 1wt 111, wobei w1 , . . . , wt verschiedene Wörter der Form TMcode2 (2) 10i+1 10p 10j+1 10r mit i, j = 0, . . . , n − 1, p = 3, 4, 5 und r = 1, 2, 3, 4, 5 sind. Umgekehrt ist jedes Wort v, das (1) und (2) erfüllt, der Code einer TM. Mit anderen Worten ist die Sprache aller Codierungen von allen nichtdeterministischen TM rekursiv. 3. Auch die Sprache aller Codierungen aller deterministischen TM ist rekursiv: hier muss der Algorithmus nur noch für alle Paare k, k ′ = 1, . . . , t von Indizes mit wk = 10i+1 10p 10j+1 10r und ′ wk′ = 10i + 110p 10j +1 10r überprüfen, ob j = j ′ und r = r′ . ′ 120KAPITEL 4. CHURCH-TURING-THESE, REKURSIVE FUNKTIONEN UND GRAMMATIKEN 4.6 Das Halteproblem sectHalt Gibt es einen Algorithmus, der für jedes Paar (Algorithmus c, Datei w) entscheidet, ob c auf die Datei w hält? Aus Abschnitt 4.5 wissen wir, dass es einen Algorithmus gibt, der auf die Eingabe (c, w) das Ergebnis von c auf die Datei w berechnet - das macht die universale Turingmaschine! Dennoch ist die Antwort auf die obige Frage, die als Halteproblem bekannt ist, negativ. Auch dann, wenn wir uns nur auf die Algorithmen beschränken, die von TM mit dem Bandalphabet {0, 1} repräsentiert werden, ist die Antwort negativ. Für diese Maschinen M haben wir die Codierung c(M ) aus Abschnitt 4.5, und wir können das Halteproblem präziser formulieren: ist die Sprache Lhalt = { v ∣ v = c(M )w für ein binäres Wort w und eine Turingmaschine M , die auf Eingabe w hält } rekursiv? Wir beweisen, dass Lhalt nicht rekursiv (also das Halteproblem nicht entscheidbar) ist, sie aber rekursiv-aufzählbar ist. Daraus folgt, dass das Komplement Lhalt nicht rekursiv-aufzählbar ist. Das bedeutet, dass das Problem, ob ein Algorithmus c auf die Datei w nicht hält, nicht einmal mehr semi-entscheidbar ist. Bemerken wir, dass in jedem Wort v = c(M )w der Code c(M ) eindeutig bestimmt ist (aufgrund der Trenngruppen 111 am Anfang und Ende von c(M )) und also auch w eindeutig bestimmt ist. Es gibt einen Algorithmus, der überprüft, ob u diese Form hat – siehe Bemerkung in Abschnitt 4.5. Bemerkung 1. Viele (auch ungelöste!) mathematische Probleme kann man umformulieren zu Fragen, ob eine leicht konstruierbare TM auf eine Eingabe hält. Beispiel 1. Beispiel einer TM mit sehr interessantem Halteproblem. Es ist ziemlich trivial, eine 5-Band-TM zu konstruieren, die auf Band 2 systematisch alle Zahlen n = 3, 4, 5, . . . schreibt und für jede Zahl n auf die Bänder 3 - 5 systematisch alle Zahlen a, b, c ≥ 2 schreibt und dann auf Band 1 die Zahl an + bn − cn berechnet. Falls diese Zahl 0 ist, hält die TM. Falls nicht, berechnet die TM den nächsten Quadrupel (n, a, b, c). Die Entscheidung, ob diese Turingmaschine M auf die leere Eingabe hält, das heißt, ob c(M ) ∈ Lhalt gilt, ist bestimmt höchst kompliziert: dies ist äquivalent zum Beweis des berühmten Satzes von Fermat! Satz 1. Die Sprache Lhalt ist rekursiv-aufzählbar. Beweis. Die folgende Turingmaschine akzeptiert Lhalt : TURINGMASCHINE M0 v EINGABE / Hat v die Form v = c(M )w für eine TM M ? NEIN JA / Hält Mu auf Eingabe v? NEIN v nicht akzeptiert v nicht akzeptiert JA / v akzeptiert 4.6. DAS HALTEPROBLEM 121 Also überprüft M0 , ob die Eingabe die Form c(M )w hat (siehe Bemerkung in 4.5), und falls das der Fall ist, simuliert sie die universale Turingmaschine Mu . Die Eingabe v wird genau dann von M0 akzeptiert, wenn v = c(M )w und Mu (akzeptierend oder nicht akzeptierend) auf die Eingabe v hält. Äquivalent dazu ist: genau dann, wenn M auf die Eingabe w hält. Kürzer: L(M0 ) = Lhalt . satzHalt Satz 2 (Unentscheidbarkeit des Halteproblems). Die Sprache Lhalt ist nicht rekursiv. Beweis. Die Annahme, dass Lhalt rekursiv ist, führt zu einem Widerspruch: es folgt, dass die Sprache Lcode = {w; w = c(M ) für eine Turingmaschine M mit w ∉ L(M )} rekursiv-aufzählbar ist. Das ist aber falsch, siehe Beispiel 2 in Kapitel 3.4. Sei Mhalt eine TM, die Lhalt akzeptiert und auf jede Eingabe hält. Dann lässt sich in der Tat eine TM konstruieren, die die Sprache Lcode akzeptiert: TURINGMASCHINE Mcode w EINGABE / Hat w die Form w = c(M ) für eine TM M ? NEIN w nicht akzeptiert JA / Akzeptiert Mhalt Eingabe ww? NEIN JA / Akzeptiert Mu Eingabe ww? w akzeptiert NEIN JA / w nicht akzeptiert w akzeptiert Das heißt, dass die Turingmaschine Mcode eine Eingabe w wie folgt berechnet: 1. Mcode überprüft, ob w = c(M ) für eine Turingmaschine M gilt (siehe Bemerkung in 4.5). 2. Falls ja, wiederholt Mcode die Eingabe und schreibt also ww = c(M )w auf das Band. 3. Jetzt simuliert Mcode die Maschine Mhalt bis sie hält. (a) Falls Mhalt die Eingabe ww nicht akzeptiert, hält Mcode und akzeptiert w. In diesem Fall hält nämlich die Maschine M nicht auf die Eingabe w (denn c(M )w ∉ Lhalt ); also wird w von M nicht akzeptiert – es folgt w ∈ Lcode . (b) Falls Mhalt akzeptiert, simuliert Mcode die universale TM auf dieselbe Eingabe ww. Da c(M )w ∈ Lhalt gilt, hält M auf die Eingabe w, also hält die universale TM auf die Eingabe c(M )w. Mcode akzeptiert genau dann, wenn Mu nicht akzeptiert. Die Turingmaschine Mcode hält auf jede Eingabe: der erste Schritt hält (denn die Sprache aller Codes ist rekursiv, siehe Bemerkung 2.2 4.5), der zweite hält nach unserer Voraussetzung von Mhalt , und der letzte hält, denn Mu erhält nur solche Eingaben ww, die von Mhalt akzeptiert werden, das heißt Eingaben c(M )w mit w = c(M ), so dass M auf w hält (oder äquivalent: Mu hält auf die Eingabe c(M )w = ww). Welche Eingaben w akzeptiert Mcode ? Genau die der Form w = c(M ), wobei entweder 122KAPITEL 4. CHURCH-TURING-THESE, REKURSIVE FUNKTIONEN UND GRAMMATIKEN M auf w nicht hält, d.h., Mhalt akzeptiert die Eingabe c(M )w nicht, oder M auf w hält und nicht akzeptiert, d.h., Mu akzeptiert die Eingabe c(M )w nicht. Also gilt: w ∈ L(Mcode ) genau dann, wenn w = c(M ) und w ∉ L(M ); oder kürzer: L(Mcode ) = Lcode , ein Widerspruch. Folgerung 7. Das Problem, ob eine TM nicht hält, ist nicht semi-entscheidbar. D.h., die Sprache Lhalt ist nicht rekursiv-aufzählbar. Beweis. Das folgt aus Satz 2 im Abschnitt 4.5: falls Lhalt und Lhalt rekursivaufzählbar wären, wäre Lhalt rekursiv. 4.7 Ein Rechner als Turing-Maschine Die universelle TM zeigt, dass TM programmierbar sind: wir können die Eingabe c(M )w der Maschine Mu als ein Paar von Algorithmen und Datei w, die als c(M ) dargestellt werden, verstehen. Ist aber klar, dass reelle Computer durchaus simuliert werden können? Ja, das wollen wir jetzt (informell, weil ”Computer” ist nicht definiert...) zeigen. (a) Wir nehmen an, dass der Speicher des Computers aus einer Reihe w0 , w1 , w2 , . . . (potentiell unendlich) von Wörtern oder Bytes besteht, wobei wi die Adresse i hat. (b) In einigen Wörtern ist das Programm gespeichert. Jedes Wort repräsentiert eine einfache Anweisung entsprechend der Maschinensprache (oder der Assemblersprache). Wir erlauben indirekte Adressierung: Inhalt eines Wortes kann die Adresse sein, wo man die notwendige Datei findet. (c) Die Register, d.h., die Wörter mit besonders schnellem Zugriff, können als separate Bänder der TM genommen werden. Hier nehmen wir an, dass unser Rechner nur ein Register hat, den Akkumulator (in dem z.B. die Arithmetik durchgeführt wird). Nehmen wir die einfache Programmiersprache, die nur die folgende Anweisung hat: LEADi Kopiert Wi in den Akkumulator ADDi Addiert Wi + Akkumulator und speichert dies in dem Akkumulator JUMPi Sprung auf Adresse i READi Lese i Bits der Eingabe WRITE Kopiert Akkumulator in die Ausgabe Die TM hat 7 Bänder: Band 1: Speicher $$0$W0 $1$W1 $10$W2 $ Band 2: Eingabe des Rechners (read only) Band 3: Programmregister 101 (Einweisung in W5 durchgeführt) Band 4: Adressregister 111 (Einweisung hat Adresse 7) Band 5: Akkumulator Band 6: Name der Anweisung Band 7: Ausgabe 4.7. EIN RECHNER ALS TURING-MASCHINE 123 Anfang der Simulation Band 1 enthält w$$u wobei w Datei (Eingabe) und u Inhalt des Speichers ist. Auf Band 2 kopieren wir die Eingabedatei aus Band 1 und löschen sie dort, sodass Band 1 den Speicher des Rechners enthält. Simulation einer Anweisung aus wj schreibe Auf Band 3 lese j, suche $j $wj $ auf Band 1 und (a) den Namen der Anweisung (LOAD, ADD, . . .) auf Band 6 und die Adresse i auf Band 4. (b) erhöhe Band 3 um 1 (c) die Anweisung durchführen Z.B. falls LOADi in wj steht, suche die TM $i$wi $ auf Band 1 und schreibt wi auf Band 5. Im Fall von WRITEi führt die TM die Addition von Band 5 und wi durch und schreibt das Ergebnis auf Band 5, usw. 124KAPITEL 4. CHURCH-TURING-THESE, REKURSIVE FUNKTIONEN UND GRAMMATIKEN Kapitel 5 Unentscheidbare Probleme Wir zeigen jetzt weitere Probleme, die nicht entscheidbar sind. Wir benutzen ständig die Codierung c(M ) von (deterministischen und nichtdeterministischen) Turingmaschinen M aus Abschnitt 3.5. Auch alle Modifikationen von Turingmaschinen mit Bandalphabet {0, 1} aus Abschnitt 3.2 sind damit codiert. Falls M z.B. eine nichtdeterministische k-Band TM ist, bezeichnen wir mit c(M ) den Code einer 1-BandTM, die M simuliert. Auch für jeden Kellerautomaten erhalten wir eine Codierung, in dem Sinne, dass wir ihn mit einer nichtdeterministischen 2-Band TM simulieren (Beispiel 3 in Kapitel 3.3) und den Code der TM verwenden. Wir werden eine TM, die auf jede Eingabe hält und die Sprache L akzeptiert, kurz Algorithmus für L nennen. 5.1 Das Akzeptanzproblem subsectAkzeptanz Erinnern wir uns an den CYK-Algorithmus (Kapitel 2.9), der für jede kontextfreie Grammatik G mit Terminalsymbolen aus {0, 1} und jedes Wort w über {0, 1} entscheidet, ob w in L(G) liegt. Daraus folgt, dass das Akzeptanzproblem für Kellerautomaten entscheidbar ist; mit anderen Worten haben wir einen Algorithmus, der für jeden Kellerautomaten M und jedes Wort w entscheidet, ob M das Wort w akzeptiert. Oder kürzer: die Sprache L(K) acc = {u; u = c(M )w für einen Kellerautomaten M und ein Wort w aus L(M )} (K) ist rekursiv. In der Tat kann ein Algorithmus, der Lacc entscheidet, wie folgt konstruiert werden: 1. Wir überprüfen, ob die Eingabe u die Form u = c(M )w, wobei M ein Kellerautomat ist, hat – vergleiche die Bemerkung in 4.5. 2. Für den gegebenen Kellerautomaten M konstruieren wir eine kontextfreie Grammatik G(M ), die die Sprache L(M ) erzeugt. 3. Der CYK-Algorithmus wird auf G(M ) und w angewendet. (K) Falls also M0 eine TM ist, die diesen Algorithmus repräsentiert, gilt Lacc = L(M0 ). Im Kontrast hierzu zeigen wir jetzt, dass das Akzeptanzproblem für Turingmaschinen, also die Frage, ob eine gegebene Turingmaschine ein gegebenes Eingabewort akzeptiert, unentscheidbar ist. Kürzer: die Sprache aller c(M )w wobei M das Wort w akzeptiert ist nicht rekursiv: 125 126 KAPITEL 5. UNENTSCHEIDBARE PROBLEME Definition. Lacc ist die Sprache aller binären Wörter c(M )w für eine Turingmaschine M und ein Wort w aus L(M ). Satz 1. Die Sprache Lacc ist nicht rekursiv. Beweis. Wir merken erst an, dass es zu jeder Turingmaschine M eine Turingmaschine M gibt, die sich von M nur darin unterscheidet, dass finale und nichtfinale Zustände ausgetauscht werden. (Genauer: wenn wir in M die finalen und nichtfinalen Zustände austauschen, erhalten wir eine TM mit mehreren finalen Zuständen, ̃ simuliert, siehe Abschnitt 3.2.1) Der Übergang von M und M ist eine TM, die M zu M lässt sich offensichtlich durch einen (kleinen) Algorithmus implementieren. Das bedeutet, dass es eine Turingmaschine M̂ gibt, die auf die Eingabe c(M ) die Ausgabe c(M ) berechnet. Es gilt w ∈ L(M ) genau dann, wenn M auf die Eingabe w hält und nicht akzeptiert. Wir beweisen jetzt, dass die Annahme, dass Lacc rekursiv ist, zu einem Widerspruch führt: wenn Lacc rekursiv wäre, würde folgen, dass Lhalt rekursiv ist. In der Tat: falls Lacc von einer Turingmaschine Macc akzeptiert wird, die auf jede Eingabe hält, können wir die folgende Turingmaschine Mhalt konstruieren, die Lhalt akzeptiert und auf jede Eingabe hält: TURINGMASCHINE Mhalt u u nicht akzeptiert O EINGABE Hat u die Form u = c(M )w für eine TM M ? NEIN u nicht akzeptiert NEIN Akzeptiert JA / NEIN/ c(M ) wird Macc Eingabe von M̂ c(M )w? berechnet JA u akzeptiert Akzeptiert / Macc Eingabe c(M )w? JA u akzeptiert Diese TM akzeptiert genau die Eingaben u = c(M )w, für die gilt, dass entweder M akzeptiert w (d.h., Macc akzeptiert c(M )w), oder M akzeptiert w (d.h., Macc akzeptiert c(M )w). Das heißt, genau die Eingaben c(M )w, für die M auf die Eingabe w hält. Kürzer: L(Mhalt ) = Lhalt . Darüber hinaus hält Mhalt auf jede Eingabe – ein Widerspruch zu Satz 2 aus Kapitel 4.6. 5.2 Akzeptanz des leeren Wortes subsectAkzeptanzEps Eine noch einfachere Frage ist, ob eine TM die leere Eingabe akzeptiert. Auch diese Frage ist aber unentscheidbar: Definition. Lε ist die SPrache aller binären Wörter c(M )w wobei M eine TM ist die ε akzeptiert Satz 1. Die Sprache Lε ist nicht rekursiv. 5.3. IST EINE TM EIN ALGORITHMUS? 127 Wir merken erst an, dass es für jede Turingmaschine M und jedes Wort w eine Turingmaschine Mw gibt, die das leere Wort genauso berechnet wie M das Wort w. Mw schreibt erst das Wort w = s1 . . . sn von links nach rechts auf ihr Band (mit Hilfe von n neuen Zuständen q1 , . . . , qn , wobei qn der Initialzustand von Mw ist) und dann geht sie in den Initialzustand q0 der Maschine M über und beginnt die Berechnung wie M . Das bedeutet, dass zu den Übergangsregeln von M die folgenden Regeln hinzugefügt werden: (qn , #) → (qn , sn ) (qn , sn ) → (qn−1 , L) (qn−1 , #) → (qn−1 , sn−1 ) (qn−1 , sn−1 ) → (qn−2 , L) ⋮ (q1 , #) → (q1 , s1 ) (q1 , s1 ) → (q0 , s1 ) (Jetzt steht der Kopf im Zustand q0 am Anfang des Wortes w = s1 . . . sn .) Offensichtlich kann der Übergang von (M, w) zu Mw durch einen Algorithmus implementiert werden, d.h., es gibt eine Turingmaschine M̂ , die auf die Eingabe c(M )w die Ausgabe c(Mw ) berechnet. Die Annahme, dass Lε rekursiv ist, führt zu einem Widerspruch: daraus würde folgen, dass Lacc rekursiv ist. In der Tat haben wir, falls Mε ein Algorithmus für Lε ist, den folgenden Algorithmus für Lacc : TURINGMASCHINE Macc u EINGABE / Hat u die Form u = c(M )w für eine TM M ? NEIN JA / c(Mw ) wird von M̂ berechnet. Akzeptiert / Mε Eingabe NEIN/ u nicht u nicht akzeptiert c(Mw )? JA akzeptiert u akzeptiert Es ist klar, dass Mε die Eingabe u = c(M )w genau dann akzeptiert, wenn Mw das leere Wort akzeptiert und das geschieht genau dann, wenn M das Wort w akzeptiert. Das heißt, genau dann, wenn die Eingabe u = c(M )w in Lacc liegt. Kürzer: L(Macc ) = Lacc . Außerdem hält Macc auf jede Eingabe – ein Widerspruch zu 5.1 5.3 Ist eine TM ein Algorithmus? Auch diese Frage, d.h., das Problem, ob eine gegebene TM auf jede Eingabe hält, ist unentscheidbar. Definition. Lalg ist die Sprache aller binären Wörter c(M )w wobei M eine TM ist, die auf jede Eingabe hält Satz 1. Die Sprache Lalg ist nicht rekursiv. Wir merken erst an, dass es für jede Turingmaschine M eine Turingmaschine M ′ gibt, die jede Eingabe so berechnet wie M die Eingabe ε: M ′ löscht erst das Band 128 KAPITEL 5. UNENTSCHEIDBARE PROBLEME und dann simuliert sie M . Offensichtlich kann der Übergang von M zu M ′ durch einen Algorithmus durchgeführt werden. Die Annahme, dass Lalg rekursiv ist, führt zu einem Widerspruch: daraus würde folgen, dass Lε rekursiv ist. In der Tat haben wir den folgenden Algorithmus für Lε , falls Malg ein Algorithmus für die Sprache Lalg ist: TURINGMASCHINE Mε u u akzeptiert O EINGABE JA Hat u die Form u = c(M ) für eine TM M ? NEIN ′ JA / c(M ) wird von M̂ berechnet. Akzeptiert / Malg Eingabe c(M ′ )? NEIN u nicht akzeptiert JA u nicht akzeptiert Akzeptiert Mu / die Eingabe c(M ′ )? NEIN u nicht akzeptiert Die Maschine Mε hält auf jede Eingabe u: nur im letzten Schritt müssen wir aufpassen, ob Mu auf die Eingabe c(M ′ ) hält (äquivalent: ob M ′ auf die Eingabe ε hält) – das folgt daraus, dass Malg die Eingabe c(M ′ ) akzeptiert. Und eine Eingabe u wird genau dann von Mε akzeptiert, wenn u = c(M ) für eine Turingmaschine, für die gilt: M ′ hält auf jede Eingabe und M ′ akzeptiert ε. Das ist äquivalent dazu, dass M auf ε hält und akzeptiert. Also u ∈ L(Mε ) genau dann, wenn u = c(M ) ∈ Lε . Das steht im Widerspruch zu 5.2 5.4 Das Problem von “hello world” Programmen Es ist leicht, ein JAVA-Programm zu schreiben, welches auf jede Eingabe “hello world” ausgibt und hält. Ist es aber so leicht, diese Eigenschaft zu überprüfen? Wir wollen ein Programm Phallo schreiben, welches für gegebene Eingabedatei w und JAVA Programmcode P entscheidet, ob P mit Eingabe w “hello world” schreibt und hält. Ist dies möglich? Nein, so ein Programm kann man nicht schreiben. Oder, äquivalent dazu, die folgende Sprache ist nicht rekursiv: Lhallo = {c(M )w; die TM M auf Eingabe w hält und hat ASCII-Code für “hello world” auf dem Band }. Satz 1. Lhallo ist unentscheidbar. Beweis. Angenommen, dass Lhallo entscheidbar ist, leiten wir einen Widerspruch her. Wir haben eine TM, Mhallo , die auf jede Eingabe hält und akzeptiert g.d.w. die ̃hallo , die auf jede Eingabe c(M )w in Lhallo ist. Wir modifizieren sie zu einer TM M Eingabe w = c(M ) funktioniert wie Mhallo auf Eingabe ww. Aber wenn Mhallo hält ̃hallo das Band. Vorausgesetzt Mhallo hält und akzeptierte und akzeptiert, löscht M ̃ nicht, schreibt Mhallo “hello world” auf das Band. ̃hallo TURINGMASCHINE M 5.5. SATZ VON RICE 129 / ww EINGABE / w / Mhallo akzeptiert / Band löschen akzeptiert nicht “hello world” am Band Es gibt zwei Möglichkeiten für das Wort w̃ = c(Mhallo ), beide sind widersprüchlich: ̃w ̃ liegt in Lhallo . Dann akzeptiert Mhallo das Wort w ̃w. ̃ Deswegen (a) Das Wort w ̃hallo auf Eingabe w ̃ leer. Das aber bedeutet, dass Mhallo ist das Band von M ̃)w ̃=w ̃w ̃ nicht. akzeptiert c(M ̃w ̃ liegt nicht in Lhallo . Dann akzeptiert Mhallo nicht diese Eingabe, (b) Das Wort w ̃hallo auf Eingabe w ̃ “hello world”. Daras folgt, dass Mhallo deswegen schreibt M ̃ ̃=w ̃w. ̃ akzeptiert c(Mhallo )w 5.5 Satz von Rice Ist es entscheidbar, ob für eine Turingmaschine M die akzeptierte Sprache L(M ) regulär, kontextfrei, oder nichtleer ist? Alle drei Antworten sind negativ. In der Tat gilt ein überraschend allgemeiner Satz in diesem Gebiet. Sei S eine beliebige Eigenschaft formaler Sprachen (z.B. regulär, kontextfrei, nicht leer, usw.) Wir fragen, ob es entscheidbar ist, dass eine TM eine Sprache mit der Eigenschaft S akzeptiert. Kürzer, ob die Sprache LS = {c(M ); M ist eine TM und L(M ) hat die Eigenschaft S} rekursiv ist. Das ist selbstverständlich der Fall, falls S trivial ist, d.h., entweder hat jede Sprache L(M ) die Eigenschaft S, oder keine Sprache L(M ) hat die Eigenschaft S. Die drei oben erwähnten Eigenschaften sind bestimmt nicht trivial. Der folgende Satz ergibt also die negativen Antworten: Satz 1 (Satz von Rice). Für jede nichttriviale Eigenschaft S von Sprachen ist es unentscheidbar, ob für eine Turingmaschine M die Sprache L(M ) die Eigenschaft S hat. Kürzer: die Sprache LS ist nicht rekursiv. Beweis. 1. Nehmen wir erst an, dass die leere Sprache ∅ die Eigenschaft S nicht hat. Da S nicht trivial ist, gibt es eine Turingmaschine M0 , so dass gilt L(M0 ) hat die Eigenschaft S. Für jede Turingmaschine M und jedes Wort w konstruieren wir die folgende Turingmaschine M w : 130 KAPITEL 5. UNENTSCHEIDBARE PROBLEME TURINGMASCHINE M w u EINGABE / Akzeptiert M0 die Eingabe u? NEIN JA / Akzeptiert M die Eingabe w? NEIN u nicht akzeptiert JA / u akzeptiert u nicht akzeptiert Es gilt ⎧ ⎪ ⎪L(M0 ) L(M w ) = ⎨ ⎪ ∅ ⎪ ⎩ falls M die Eingabe w akzeptiert falls M die Eingabe w nicht akzeptiert Der Übergang von (M, w) zu M w kann offensichtlich durch einen Algorithmus implementiert werden. Es gibt also eine Turingmaschine M̂ , die auf die Eingabe c(M )w die Ausgabe c(M w ) berechnet. Die Annahme, dass LS rekursiv ist, führt zu einem Widerspruch: es würde folgen, dass Lacc (5.1) rekursiv ist. In der Tat erhalten wir, falls MS ein Algorithmus für die Sprache LS ist, den folgenden Algorithmus für Lacc : TURINGMASCHINE Macc u u nicht akzeptiert O EINGABE NEIN Hat u die Form u = c(M )w für eine TM M ? NEIN u nicht akzeptiert JA / c(M w ) wird von M̂ berechnet. Akzeptiert / MS Eingabe c(M w )? JA u nicht akzeptiert In der Tat akzeptiert Macc genau die Wörter c(M )w, für die MS die Eingabe c(M w ) akzeptiert, d.h., für die die Sprache L(M w ) die Eigenschaft S hat. Es gilt: L(M w ) hat die Eigenschaft S ⇐⇒ M akzeptiert w, denn für L(M w ) haben wir nur zwei Möglichkeiten: L(M w ) = L(M0 ) und L(M0 ) hat die Eigenschaft S, oder L(M w ) = ∅, und ∅ hat die Eigenschaft S nicht. Also: Macc akzeptiert genau die Wörter c(M )w, die in Lacc liegen. Da Macc auf jede Eingabe hält, bekommen wir einen Widerspruch zu 5.1. 2. Nehmen wir an, dass die leere Sprache ∅ die Eigenschaft S hat. Sei S die komplementäre Eigenschaft (das heißt, die Negation von S), die genau die Sprachen haben, die die Eigenschaft S nicht haben. Speziell hat ∅ also nicht die Eigenschaft S, und S ist sicher nichttrivial. Aus (1) folgt, dass LS nicht rekursiv ist. Daraus folgt, dass die Sprache LS (aller Wörter, die nicht in LS liegen) nicht rekursiv ist, denn LS ist der Durchschnitt von LS und der Sprache aller Codes {c(M ); M eine TM}. Die letztere Sprache ist rekursiv, siehe Bemerkung in 4.5 Falls also auch LS rekursiv wäre, müsste LS rekursiv sein. Aus Satz ??? folgt, dass LS nicht rekursiv ist. 5.6. MINIMIERUNG VON TURINGMASCHINEN 5.6 131 Minimierung von Turingmaschinen Wir zeigen, dass es im Gegensatz zu endlichen Automaten keinen Minimierungsalgorithmus für Turingmaschinen gibt. Für jede TM (die, wie oben, das Bandalphabet {0, 1} hat) bezeichnen wir mit fM die partielle Funktion, die M wie folgt berechnet: falls M die Eingabe n (binär) hat, und falls M hält, ist fM (n) die Zahl, die auf dem Band steht, wenn alle Blanksymbole und eventuell am Anfang stehende Nullen ignoriert werden. Ein Minimierungsalgorithmus für Turingmaschinen ist ein Algorithmus A, der jeder Turingmaschine M eine Turingmaschine A(M ) mit der minimalen Anzahl von Zuständen zuordnet, die dieselbe Funktion berechnet, fM (n) = fA(M ) (n) für alle n. Beispiel 1. Für jede Turingmaschine M , die die Identitätsfunktion berechnet, d.h., fM (n) = n für alle n ∈ N erfüllt, hat die Turingmaschine A(M ) nur einen Zustand. Denn die Identitätsfunktion kann von einer TM mit einem einzigen Zustand und keiner Übergangsregel realisiert werden. Satz 1. Es gibt keinen Minimierungsalgorithmus für Turingmaschinen. Beweis. Wir merken erst an, dass es für jede Turingmaschine M und jedes Wort w möglich ist, die folgende Turingmaschine M(w) zu konstruieren TURINGMASCHINE M(w) n EINGABE / (binär) Hält M auf die NEIN / Eingabe w in M(w) lässt n ausgeben höchstens n Schritten? JA M(w) schreibt Ausgabe 0 Also simuliert M(w) die Turingmaschine M auf die Eingabe w für k ≤ n Schritte, bis M hält, und dann schreibt M(w) die Ausgabe 0; falls M in n Schritten nicht hält, schreibt M(w) die Ausgabe n. Der Übergang von M und w zu M(w) kann offensichtlich von einer Turingmaschine M̂ durchgeführt werden (M̂ ist eine einfache Modifikation der universalen TM). Also ist M̂ eine TM, die auf die Eingabe c(M )w die Ausgabe c(M(w) ) liefert. Es gilt: fM(w) (n) = n, falls M auf Eingabe w nicht hält, d.h., die Machine M(w) berechnet die Identitätsfunktion. Also gilt für jeden Minimierungsalgorithmus A, A(M(w) ) hat 1 Zustand, falls M auf w nicht hält. Umgekehrt gilt: falls M auf Eingabe w hält, ist fM(w) nicht die Identitätsfunktion. Es gilt also: M hält nicht auf Eingabe w ⇐⇒ A(M(w) ) berechnet die Identitätsfunktion. Die Annahme, dass es einen Minimierungsalgorithmus A gibt, führt zu einem Widerspruch: es folgt, dass die Sprache Lhalt rekursiv-aufzählbar ist (siehe Korollar in 4.6). In der Tat akzeptiert die folgende Turingmaschine M ∗ die Sprache Lhalt : 132 KAPITEL 5. UNENTSCHEIDBARE PROBLEME TURINGMASCHINE M ∗ u EINGABE / Hat u die Form u = c(M )w für eine TM M ? NEIN JA / c(M(w) ) wird von M̂ berechnet. / M(w) wird von A minimiert. / u nicht akzeptiert / Hat A(M(w) ) nur einen Zustand? NEIN u nicht akzeptiert JA / Berechnet A(M(w) ) die Identitätsfunktion? NEIN JA / u akzeptiert u nicht akzeptiert (Die letzte Entscheidung, ob eine TM mit nur einem Zustand die Identitätsfunktion berechnet, lässt sich bestimmt mit einem kleinen Algorithmus durchführen.) Die Maschine M ∗ hält auf jede Eingabe und akzeptiert alle Wörter u = c(M )w, wobei M(w) die Identitätsfunktion berechnet. Da fM(w) genau dann die Identitätsfunktion ist, wenn M auf die Eingabe w nicht hält, gilt M ∗ akzeptiert c(M )w ⇐⇒ M hält nicht auf w. Kürzer: L(M ∗ ) = Lhalt , ein Widerspruch. Kapitel 6 Komplexität von Algorithmen Bisher haben wir uns die Frage gestellt, ob ein Problem entscheidbar (d.h. mit Hilfe eines Algorithmus lösbar) ist. Jetzt wollen wir auch die Effizienz von Algorithmen diskutieren. Es gibt wichtige Aufgaben, wie z.B. jeden Graphen mit der kleinstmöglichen Zahl an Farben zu färben (ohne dass eine Kante gleichfarbige Knoten verbindet), für die es zwar Algorithmen gibt, aber kein effizienter Algorithmus bekannt ist. Wir führen zuerst die Klasse P aller Probleme ein, die effizient lösbar sind; z.B. das Problem, jeden Graphen, für den es möglich ist, mit zwei Farben zu färben. Effi” zient“ bedeutet: in polynomialer Zeit durchführbar. Genauer: ein Problem gehört der Klasse P an, falls es mit einem Algorithmus lösbar ist, für den es ein Polynom p(m) gibt, so dass für jede Eingabe der Größe m die Lösung in p(m) Zeiteinheiten gefunden werden kann. Es zeigt sich, dass die Klasse P nicht von dem Modell der Berechnung abhängt: es kann eine Turingmaschine, eine RAM oder eine moderne Workstation sein. (Natürlich wird für diese drei Modelle das ausgewählte Polynom p(n) ganz verschieden sein, d.h., der Grad der Effizienz“ hängt sehr von der kon” kreten Implementierung ab. Aber die prinzipielle Möglichkeit, die Zeit durch ein Polynom zu beschränken, ist implementierungsunabhängig.) Danach wird die Klasse N P aller Probleme eingeführt, für die wenigstens die Überprüfung, ob eine gegebene Datei das Problem löst, effizient ist. Z.B. das Problem, jeden Graphen, für den es möglich ist, mit drei Farben zu färben: es ist kein effizienter Algorithmus bekannt, aber die Überprüfung, ob eine vorgeschlagene Färbung wirklich drei Farben benutzt und keine Kante zwischen gleichfarbigen Knoten ergibt, ist effizient. Leider ist es bis heute nicht bekannt, ob P = N P. Aber es sind viele Probleme bekannt, die N P-vollständig“ sind - für diese gilt: wäre eines dieser ” Probleme effizient lösbar, wären es alle anderen auch, denn dann folgt P = N P. Das erwähnte Problem der Dreifärbung von Graphen ist, wie wir beweisen werden, N Pvollständig. Es scheint sehr unwahrscheinlich, dass dieses Problem effizient lösbar ist, aber falls ja, würde daraus folgen, dass viele andere wichtige Probleme (z.B. Traveling Salesman Problem) effizient lösbar wären. Dieses Kapitel hat, wie die vorigen, theoretischen Charakter; z.B. benutzt die Klasse P beliebige Polynome zur Zeiteinschränkung und das ist nicht realistisch“, falls ” das Polynom einen zu großen Exponenten hat. Dennoch hat Komplexitätstheorie wichtige praktische Aspekte. Stellen Sie sich vor, dass Ihr Chef Sie damit beauftragt hat, ein Programm zu schreiben, das überprüft, ob eine vorgeschlagene Produktspe133 134 KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN zifikation realisierbar ist. Trotz einigen Wochen intensiven Versuchens ist es Ihnen nicht gelungen, das Programm zu schreiben. Was jetzt? Wenn Sie die Produktspezifikation analysieren und feststellen, dass sie sehr allgemein formuliert ist, liegt es vielleicht an der Allgemeinheit und nicht an Ihrer Unfähigkeit. Es wäre z.B. toll, wenn Sie zeigen können, dass das von Ihnen verlangte Programm eigentlich auch das Halteproblem lösen könnte – dann können Sie Ihrem Chef beweisen, dass er unlösbare Aufgaben erteilt. Das ist aber leider nicht sehr wahrscheinlich, denn das Halteproblem ist doch sehr allgemein. Also versuchen Sie zu zeigen, dass Ihr Programm eines von den hunderten N P-vollständiger Problemen lösen würde – das zeigt nicht, dass die Aufgabe prinzipiell nicht effektiv implementierbar wäre, aber dass es schon einer Schar ausgezeichneter Programmierer nicht gelungen ist, einen effizienten Algorithmus zu entwickeln. 6.1 Beispiele effizienter Algorithmen sect-eff-alg In diesem Abschnitt illustrieren wir eine genaue Analyse der Effizienz von Algorithmen an einigen wichtigen Beispielen von Graphen-Algorithmen. Ein gerichteter Graph G = (V, E), wobei V die Menge aller (n) Knoten und E die Menge aller Kanten (d.h. geordneten Paaren von Knoten) ist, wird gewöhnlich durch seine n × n-Adjazenzmatrix (aij ) repräsentiert, wobei ⎧ ⎪ ⎪1 falls (i, j) eine Kante in E ist aij = ⎨ ⎪ 0 sonst ⎪ ⎩ Oder durch Adjazenzlisten, d.h., durch n lineare Listen, wobei die i-te Liste alle Knoten j mit (i, j) ∈ E enthält und die heads (Listenköpfe) in einem Array gespeichert werden. Beispiel: für den gerichteten Graphen / 2 1 O 3 _ 4 5 o haben wir die Adjazenzmatrix der Gesamtgröße m = n2 ⎛0 ⎜0 ⎜ ⎜0 ⎜ ⎜0 ⎝1 1 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0⎞ 0⎟ ⎟ 0⎟ ⎟ 1⎟ 0⎠ und die Adjazenzlisten der Gesamtgröße m = n + k 6.1. BEISPIELE EFFIZIENTER ALGORITHMEN 135 1 / 2 2 / 2 / 4 4 / 5 / 3 5 / 1 / 3 3 bsp-top-sort Beispiel 1 (Topologisches Sortieren). In Abschnitt 2.8 haben wir den folgenden Algorithmus für das topologische Sortieren eines gerichteten Graphen G = (V, E) beschrieben: 1: {(1) Initialisierung} 2: i ∶= 0 3: W ∶= V {W – die Menge der noch nicht bearbeiteten Knoten} 4: {(2) Rekursionsschritt} 5: while ein Knoten x ∈ W ohne Vorgänger existiert do 6: i ∶= i + 1; 7: ord(x) = i; 8: W ∶= W − {x} 9: Löschen des Knotens x aus dem Graphen 10: od Wie lange dauert dieser Algorithmus für einen Graphen mit n Knoten? Nehmen wir an, dass eine Eintragung in die Liste ord sowie die Modifikation der Variablen i und W eine konstante Zahl A von Zeiteinheiten dauert. Um einen Knoten x ohne Vorgänger zu finden, suchen wir in der Adjazenzmatrix eine Spalte mit lauter Nullen; das dauert Km2 Zeiteinheiten, wobei K eine Konstante ist und m die aktuelle Knotenzahl ( m = n, n − 1, . . . , 1), und die Entfernung eines Knotens dauert eine konstante Zahl L von Zeiteinheiten. Dann ist die gesamte Zahl von Zeiteinheiten für diesen Algorithmus n T = 2A + ∑ (Km2 + 3A + L) > Cn3 für eine Konstante C. m=1 Dieser Algorithmus kann viel effizienter implementiert werden. Diesmal stellen wir den Graphen mittels Adjazenzlisten dar. Wir bezeichnen für jeden Knoten v mit IN [v] (ein Array, v = 1, . . . , n) die Zahl aller Kanten mit dem Endknoten v und wir setzen U = {v; v ∈ V und IN [v] = 0}. Algorithmus für Topologisches Sortieren Eingabe: Gerichteter Graph G = (V, E) mit n Knoten und k Kanten Ausgabe: Topologische Sortierung ord ∶ V → {1, . . . , n} von G, falls G azyklisch ist 1: {(1) Initialisierung} 2: i ∶= 0 {i – die letzte Zahl, die ord benutzt hat} 3: U ∶= ∅ {U - die Menge aller Knoten v mit IN [v] = 0} 4: IN [1] ∶= 0, . . . , IN [n] ∶= 0 5: for alle Knoten v in V do 6: for alle Knoten w mit einer Kante (v, w) in E do 136 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN IN [w] ∶= IN [w] + 1 end for end for for alle Knoten v in V do if IN [w] = 0 then U ∶= U ∪ {v} end if end for {(2) Rekursionsschritt} while U einen Knoten v enthält do U ∶= U − v i ∶= i + 1 ord(v) ∶= i for alle Knoten w mit (v, w) ∈ E do IN [w] ∶= IN [w] − 1 if IN [w] = 0 then U ∶= U ∪ {w} end if end for od {(3) Ausgabe} Falls n = i, ist ord eine topologische Sortierung von G. Falls n > i, ist die Ausgabe ein Code dafür, dass G nicht azyklisch ist. Korrektheit: Für jeden azyklischen Graphen G ist ord eine topologische Sortierung von G. Das folgt daraus, dass jeder azyklische Graph einen Knoten ohne Vorgänger hat. Deshalb ist U ≠ ∅, solange nicht alle Knoten sortiert worden sind. Für jede Kante (v, w) von G gilt: falls in einem Durchgang der Schleife 16–26 der Wert ord(v) ∶= i zugeordnet wird, hat vor diesem Durchgang IN [w] einen Wert ≥ 1. Deswegen wird der Wert ord(w) erst in einem Durchgang i + k, k ≥ 1, zugewiesen und es folgt ord(v) < ord(w). Zeitkomplexität: Wir wollen die Zahl der Zeiteinheiten bestimmen, die dieser Algorithmus für Graphen mit n Knoten und k Kanten braucht. Das hängt von der Implementierung ab. Wir nehmen an, dass die mengentheoretischen Operationen (insert, delete) so implementiert werden, dass sie eine konstante Zahl A von Zeiteinheiten brauchen, und auch jede Zuweisung A Zeiteinheiten benötigt. Dann dauert die Initialisierung: Zeile 2. 3. 4. 5.–9. 10.–14. Zeitkomplexität A A An n + Ak 2An (3A + 1)n + Ak Zeiteinheiten Nur die Zeilen 5.–9. benötigt eine Erklärung: bezeichnen wir mit k(v) die Zahl aller Nachfolger von v. Die Implementierung mit Adjazenzlisten erlaubt eine Durchführung der Schleife 6.–8. in Zeit Ak(v). Die ganze Schleife dauert n + ∑nv=1 Ak(v) = n + Ak Zeiteinheiten. Im Rekursionsschritt dauert 20.–25. 3Ak(v) Schritte. Da die Rekursion n-mal wiederholt wird, benötigt sie 6.1. BEISPIELE EFFIZIENTER ALGORITHMEN 17. 18. 19. 20.–25. 137 An An An 3Ak 3A(n + k) Zeiteinheiten Die Zeitkomplexität des Algorithmus ist also (6A + 1)n + 4Ak Zeiteinheiten. Bemerkung 1. Die Konstante A hängt von der konkreten Implementierung ab. Um von solchen Details in unserer Analyse absehen zu können, führen wir, für jede Funktion t(n), die Klasse O(t(n)) (gelesen: O von t(n)“) ” ein, die aus allen Funktionen f (n) besteht, die nicht schneller als t(n) wachsen (für große Werte von n): Definition. O(t(n)) bezeichnet die Klasse aller Funktionen f (n), für die es Konstanten n0 und C gibt, so dass f (n) ≤ Ct(n) für alle n ≥ n0 . Beispiel 2. 1. Der Algorithmus für topologische Sortierung hat eine lineare Zeitkomplexität O(n + k) Es gilt (6A + 1)n + 4Ak ≤ C(n + k), wobei C = 6A + 1, für alle n ≥ 0. 2. Jedes quadratische Polynom gehört zur Klasse O(n2 ). In der Tat, für f (n) = a + bn + cn2 = ( a b + + c) n2 2 n n gilt: falls n ≥ max{a, b}, ist f (n)leq(2 + c)n2 . Es genügt also, n0 = max{a, b} und C = 2 + c zu setzen. 3. Allgemeiner enthält die Klasse O(nk ) alle Polynome des Grades k. 4. Die exponentielle Funktion 2n gehört nicht zu der Klasse O(nk ), denn 2n = ∞. n→∞ nk lim Bemerkung 2. Falls Graphen als Adjazenzmatrizen implementiert werden, benötigt jeder Algorithmus für das topologische Sortieren mindestens n2 Schritte 2 In der Tat muss jeder Algorithmus für jedes der n2 Paare (i, j) entweder aij oder aji in der Adjazenzmatrix durchsuchen. (Stellen wir uns vor, dass ein Algorithmus 138 KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN A weder aij noch aji durchsucht. Für den Graphen G mit n Knoten und keiner Kante ergibt A ein topologisches Sortieren. Bezeichnen wir mit G den Graphen, der genau zwei Kanten i → j und j → i enthält. Dann wird G mit dem Algorithmus A genau wie G bearbeitet, obwohl G zyklisch ist. Das ist ein Widerspruch.) Also ist auch bei dieser Implementierung die Zeitkomplexität linear in der Größe n2 der Eingabe. bsp-2-faerb Beispiel 3 (2-FÄRBUNG). Wir wollen einen (ungerichteten) Graphen G mit zwei Farben, z.B. rot und blau, so färben, dass keine zwei benachbarten Knoten gleichfarbig sind. Es ist klar, dass das für Graphen, die ein Dreieck enthalten, unmöglich ist. Allgemeiner: für einen Graphen mit einem Zyklus ungerader Länge existiert keine solche Färbung. In dem Fall, dass G keine Zyklen ungerader Länge hat, läßt sich ein einfacher Algorithmus wie folgt angeben: wir wählen einen Knoten v und färben ihn rot. Alle Nachbarn von v werden blau gefärbt – da G kein Dreieck enthält, verursacht diese Färbung keine Probleme. Dann werden alle Nachbarn der zuletzt gefärbten Knoten rot gefärbt - da G kein Dreieck und keinen Zyklus aus fünf Kanten enthält, verursacht auch dies keine Probleme. So wird fortgefahren, bis die ganze Komponente von v (d.h., alle Knoten, die mit v durch einen ungerichteten Weg verbunden sind) gefärbt ist. Dann wählen wir wieder einen beliebigen, noch nicht gefärbten, Knoten, der rot gefärbt wird, usw. Wir beschreiben diesen Algorithmus formal. Die Mengen aller (schon) roter oder blauer Knoten werden mit ROT und BLAU bezeichnet, die Menge aller zuletzt gefärbten Knoten mit F . Algorithmus für 2-Färbung Eingabe: Ungerichteter Graph G = (V, E) Ausgabe: Eine 2-Färbung V = ROT ∪ BLAU , falls es eine gibt. 1: {1. Initialisierung} 2: ROT ∶= ∅ 3: BLAU ∶= ∅ 4: F ∶= ∅ 5: {2. Rekursionsschritt} 6: while V ≠ ∅ do 7: wähle v aus V 8: V ∶= V − {v} 9: ROT ∶= ROT ∪ {v} 10: F ∶= F ∪ {v} 11: while F ≠ ∅ do 12: wähle w in F 13: for alle Knoten u ∈ V mit (u, w) ∈ E do 14: if w ∈ ROT then 15: BLAU ∶= BLAU ∪ {u} 16: else 17: ROT ∶= ROT ∪ {u} 18: end if 19: F ∶= F ∪ {u} 20: V ∶= V − {u} 21: end for 22: F ∶= F − {w} 23: od 24: od 25: {3. Ausgabe} 26: Falls ROT oder BLAU eine Kante aus E enthalten, ist die Ausgabe ein Code 6.1. BEISPIELE EFFIZIENTER ALGORITHMEN 139 dafür, dass G keine 2-Färbung hat. Falls weder ROT noch BLAU eine Kante enthält, ist dies die gesuchte 2-Färbung. Korrektheit: In jedem Schritt des Algorithmus gilt für jeden Knoten v: entweder v ∈ V oder v ∈ ROT oder v ∈ BLAU . Da am Ende V = ∅ gilt, ist also jeder Knoten entweder rot oder blau gefärbt. Falls weder ROT noch BLAU eine Kante enthält, haben wir eine 2-Färbung gefunden. Es bleibt zu zeigen, dass G Zyklen ungerader Länge hat, falls ROT eine Kante enthält (analog für BLAU). Sei v der Knoten in 7. Wir beweisen, dass jeder Knoten, der in 17. rot (oder in 15. blau) gefärbt wird, einen Weg von gerader (oder ungerader) Länge nach v hat, wobei die Länge des leeren Weges“ von v nach v gleich 0 gesetzt ” wird. Am Anfang der Schleife ab 11. ist das klar, denn der einzige roten Knoten ist v, und blaue gibt es nicht. Jeder Durchgang dieser Schleife erhält diese Eigenschaft: falls w rot ist und also einen Weg der Länge 2k nach v hat, wird jeder blau zu färbende Knoten u (für den eine Kante (u, w) gegeben ist) einen Weg der Länge 2k + 1 nach v haben. Analoges gilt, falls w blau ist. Sei (u, u′ ) eine Kante in ROT . Wir haben einen Kreis, der mit einen Weg der Länge 2k von u nach v beginnt, dann mit einem Weg der Länge 2k ′ von v nach u′ weitergeht und mit der Kante (u′ , u) endet. Dieser Kreis hat die ungerade Länge 2k + 2k ′ + 1 und enthält also einen Zyklus ungerader Länge (denn ein Kreis, der nur Zyklen von gerader Länge enthält, hat selbst gerade Länge). Analog läßt sich für eine Kante in BLAU argumentieren. Zeitkomplexität: Falls Graphen als Adjazenzlisten implementiert werden und die mengentheoretischen Operationen konstante Zeit erforden, hat dieser Algorithmus eine lineare Zeitkomplexität O(n + k) (wobei n die Zahl aller Knoten und k die Zahl aller Kanten ist). In der Tat benötigt die Initialisierung die Zeit O(1). Die Färbung einer Komponente K (die Zeilen 8.–23.), deren Zahl von Kanten k(K) ist, dauert O(k(K)), da jede Kante nur einmal durchsucht wird. Falls der Graph G genau r Komponenten hat, gilt k = k(K1 )+⋅ ⋅ ⋅+k(Kr ) und die r Durchgänge der Schleife 6.–24. dauern O(n+k) Schritte. Die Überprüfung, ob ROT oder BLAU eine Kante enthalten, benötigt auch die lineare Zeit O(n + k). Insgesamt wird der Algorithmus also in O(n + k) Schritten durchgeführt. Beispiel 4 (3-FÄRBUNG). Die analoge Aufgabe, einen gegebenen Graphen mit drei Farben zu färben, ist viel schwieriger. Kein effizienter Algorithmus ist bekannt – und später werden wir Gründe dafür kennenlernen, weshalb es unwahrscheinlich ist, dass ein effizienter Algorithmus existiert. Ineffizient können wir einfach alle möglichen Färbungen ausprobieren. Das ist bestimmt ein Algorithmus – aber er braucht O(3n ) Schritte, da es 3n Färbungsmöglichkeiten gibt. Und das ist sehr aufwendig. bsp-ger-weg Beispiel 5 (GERICHTETER WEG). Für zwei Knoten v und w eines gerichteten Graphen ist ein Weg der Länge d von v nach w eine Liste v = v0 , v1 , . . . , v d = w von Knoten, so dass (vi−1 , vi ) eine Kante für i = 1, . . . , d ist. Jeder Knoten hat einen (leeren) Weg der Länge 0 zu sich selbst. 140 KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN Seien ein gerichteter Graph G und zwei Knoten v und w gegeben, dann entscheiden wir in linearer Zeit O(n + k), ob ein Weg von v nach w führt. Sei M die Menge aller Knoten zu denen ein Weg von v führt. Algorithmus für gerichteter Weg Eingabe: Ein gerichteter Graph G = (V, E) und zwei Knoten v und w Augabe: JA, falls ein gerichteter Weg von v nach w führt, ansonsten NEIN 1: {Initialisierung:} 2: M ∶= {v} 3: {Rekursionsschritt:} 4: while eine Kante (x, y) mit x ∈ M und y ∉ M existiert do 5: M ∶= M ∪ {y} 6: E ∶= E − {(x, y)} 7: od 8: {Ausgabe:} 9: JA, falls w ∈ M , NEIN falls w ∈ / M. Zeitkomplexität: Falls der Graph mit Adjazenzlisten implementiert ist, dauert dieser Algorithmus O(n + k) Schritte, denn jede Liste wird höchstens einmal durchsucht. 6.2 Komplexitätsklasse P sect-classP Alle Probleme, die ein Rechner mit polynomialer Zeitkomplexität lösen kann, formen die Klasse P. Genauer: ein Entscheidungsproblem gehört zu P, falls es einen Algorithmus gibt, der für jede Eingabe der Länge n in höchstens p(n) Zeiteinheiten entscheidet, ob die Antwort JA oder NEIN ist, wobei p(n) ein (gegebenes) Polynom ist. Es entsteht die Frage: welche Implementierung haben wir hier im Sinn? Die Antwort ist: die Klasse P ist von der Implementierung unabhängig. Verschiedene Implementierungen können natürlich verschiedene Zeitkomplexitäten haben (wie im Fall des TOPOLOGISCHEN SORTIERENS in 6.1 gezeigt wurde); d.h., das Polynom p(n) wird für jede Implementierung individuell gewählt werden. Aber die Existenz eines Polynomes ist unabhängig von der Implementierung. Das zeigen wir, indem wir Turingmaschinen als Implementierungsmodell nehmen und dann beweisen, dass dieselbe Klasse P auch z.B. mit RAM als Modell entsteht. Der Beweis für andere Berechnungsmodelle folgt analog. Definition. Wir sagen, dass eine deterministische TM eine Zeitkomplexität t(n) hat, wobei t(n) eine Funktion aus der Menge N ist, falls die TM für jede Eingabe der Länge n in höchstens t(n) Schritten hält. kompl-bsp Beispiel 1. Die Sprache L ⊆ {0, 1}∗ aller Wörter, die keine zwei benachbarten Einsen enthalten, kann von der folgenden TM akzeptiert werden: M bleibt solange im Initialzustand q0 , wie sie Nullen liest, also (q0 , 0) → (q0, R). Falls M eine 1 liest, geht sie in den Zustand q1 über: (q0 , 1) → (q1, R). Falls nach der 1 gleich eine 0 folgt, gehen wir zurück zum Zustand q0 , falls aber noch eine 1 gelesen wird, hält die Maschine im (nichtfinalen) Zustand q1 . Und falls das Blanksymbol gelesen wird, hält die Maschine im finalen Zustand qF . Hier ist eine vollständige Beschreibung von M : M = ({q0 , q1 , qF }, {0, 1}, δ, q0 , qF ) 6.2. KOMPLEXITÄTSKLASSE P 141 wobei δ durch die folgenden Übergangsregeln bestimmt wird: (q0 , 0) → (q0 , R) (q0 , 1) → (q1 , R) (q0 , #) → (qF , #) (q1 , 0) → (q0 , R) (q1 , #) → (qF , #) Jede Eingabe der Länge n liest die TM von links nach rechts und hält spätestens bei dem Symbol # hinter dem Eingabewort, also nach höchstens n + 1 Schritten. Sie hat also die Zeitkomplexität t(n) = n + 1. Bemerkung 1. 1. Im Kapitel 3 haben wir verschiedene Varianten von TM eingeführt (zum Beispiel mit zusätzlichem Gedächtnis, mit mehreren Bändern, usw.). Die Definition der Klasse P (s.u.) ist unabhängig davon, welche der Varianten als TM gemeint ist; das beweisen wir exakt im Abschnitt 6.4. 2. Zeitkomplexität ist nicht eindeutig definiert (denn sie ist nur eine Abschätzung für die Anzahl der Berechnungsschritte). Genau genommen ist jede Funktion t′ (n) mit t′ (n) ≥ n+1 für alle n auch eine Zeitkomplexität der TM aus Beispiel 1. tm-palin Beispiel 2. Die Sprache aller Palindrome (siehe Abschnitt 2.1, Beispiel 3) wird von der folgenden Turingmaschine M akzeptiert. Die Maschine M hat ein zusätzliches Gedächtnis (siehe 3.2.2) für die Symbole aus Σ und vier Zustände: q0 , Initialzustand, qR und qL (für die Bewegung nach links oder rechts des Kopfes der Turingmaschine) und qF , einen finalen Zustand. Zustand q0 : Falls # gelesen wird, hält die TM und akzeptiert. Falls ein Symbol aus Σ gelesen wird, speichert die TM es im Gedächtnis, löscht es und geht zu qR über. Zustand qR bewegt den Kopf nach rechts bis er # liest, dann bewegt sich der Kopf einen Schritt nach links. [Problem: nach dem Löschen des ersten Symbols steht die TM im Zustand qR auf einem #; daher wird ein spezielles Löschsymbol benötigt.] Falls das jetzt gelesene Symbol mit dem Gedächtnis übereinstimmt, wird es gelöscht und die TM geht zu qL über; falls nicht, hält die TM und akzeptiert nicht. [Problem: zum Löschen am rechten Rand brauchen wir einen weiteren Zustand, etwa qC .] Zustand qL bewegt den Kopf nach links bis er # liest [bzw. das neue Löschsymbol], dann bewegt er den Kopf einen Schritt nach rechts und geht zu q0 über. Wie lange dauert die Berechnung einer Eingabe der Länge n? Der Übergang q0 → qR dauert einen Schritt und der Übergang qR → qL dauert n + 2 Schritte. Es dauert also 1 + (n + 2) + n = 2n + 3 Schritte, bis wieder q0 erreicht wird. Jetzt beginnt dieselbe Berechnung mit einem Wort der Länge n − 2. Der Zustand q0 wird also in 2(n − 2) + 3 Schritten wieder erreicht. (Wir nehmen immer den schlechtesten Fall an, hier also den Fall, dass die Eingabe wirklich ein Palindrom ist.) Die gesamte Berechnungszeit beträgt höchstens t(n) = (2n + 3) + (2n − 1) + ⋅ ⋅ ⋅ + 5 + 1 Schritte. Diese Summe ist gleich n2 + 4n + 4, wie durch Induktion leicht bewiesen werden kann (?). Das bedeutet, dass unsere TM die Zeitkomplexität t(n) = n2 + 4n + 4 142 KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN hat. Bemerkung 2. Wir können für die Sprache aller Palindrome eine fast doppelt so schnelle TM konstruieren, indem wir die beiden ersten Buchstaben speichern (und löschen) und sie mit den beiden letzten vergleichen (und diese dann auch löschen). Eine noch schnellere TM würde drei (oder vier usw.) Buchstaben auf einmal vergleichen. Wir können also eine fast k-mal schnellere TM für ein beliebig großes k konstruieren. Wir beobachten, dass jede dieser TM eine Zeitkomplexität hat, die von einem quadratischen Polynom repräsentiert wird. Den gleichen Beschleunigungsprozess können wir mit jeder TM machen, indem wir stets in einem Schritt k Felder gleichzeitig lesen und bearbeiten. Aus diesem Grund ist nicht die Funktion t(n) selbst interessant, nur die Geschwindigkeit des Wachs” tums“ von t(n), also die Klasse O(t(n)). Definition. Wir bezeichnen mit P die Klasse aller formalen Sprachen, die von einer TM mit polynomialer Zeitkomplexität akzeptiert werden können. Genauer: eine Sprache L gehört zur Klasse P, falls es eine Turingmaschine M und ein Polynom p(n) gibt, so dass L = L(M ) und M hält auf Eingaben der Länge n in höchstens p(n) Schritten. Bemerkung 3. Erinnern wir uns daran, dass Entscheidungsproblem ≡ formale Sprache. Genau genommen müssen wir ein Entscheidungsproblem erst codieren (z.B. binär, mit Symbolen 0 und 1). Dann bezeichnet L ⊆ {0, 1}∗ die Sprache aller Codierungen der Eingaben, auf die die Entscheidung JA ist. Weiter nehmen wir immer an, dass die Codierung von Problemen vernünftig“ ist. ” Wenn nämlich jemand freiwillig eine extrem lange Codierung der Eingabe benutzt, kann er auch ein kompliziertes Problem in linearer Zeit p(n) = n, wobei n die unvernünftige“ Codelänge ist, lösen. Die folgenden Regeln sind als vernünftig“ ” ” anzusehen: 1. Zahlen werden binär oder dezimal repräsentiert. (Nicht unär!) 2. Graphen werden durch Adjazenzmatrizen oder Adjazenzlisten dargestellt (siehe Abschnitt 6.1). 3. Mengentheoretische Operationen (Insert, Delete, Vereinigung, Durchschnitt) werden so implementiert, dass ihre Ausführung eine konstante Zahl von Zeiteinheiten dauert. Beispiel 3 (PALINDROM). Die Entscheidung, ob ein Wort ein Palindrom ist, ist ein Problem der Klasse P, denn die TM aus Beispiel 2 hat die Zeitkomplexität O(n2 ). Beispiel 4 (2-FÄRBUNG). Das Problem, ob ein Graph mit zwei Farben gefärbt werden kann, gehört zur Klasse P. In Abschnitt 6.1 haben wir dafür einen Algorithmus mit linearer Zeitkomplexität beschrieben. Es ist nicht kompliziert, den Algorithmus mit einer TM zu implementieren und zu beweisen, dass diese TM polynomiale Zeitkomplexität hat. 6.2. KOMPLEXITÄTSKLASSE P bsp-2-3-SAT 143 Beispiel 5 (2-ERFÜLLBARKEIT und 3-ERFÜLLBARKEIT). Analog zu der Situation der 2-Färbung und 3-Färbung haben wir hier ein anderes wichtiges Beispiel der Probleme, deren leichtere Variante zu P gehört und deren schwierige (wahrscheinlich) nicht. Es handelt sich um Boolesche Formeln über den Variablen x1 , . . . , xn . Die einfachsten Formeln sind die Variablen xi selbst und ihre Negationen ¬xi - diese Formeln heißen Literale. Die komplizierteren Formeln werden mit Hilfe der üblichen logischen Operationen, z.B. Konjunktion ∧, Disjunktion ∨ und Implikation → erzeugt. Jede Disjunktion von Literalen heißt Klausel . Beispiele: x ∨ y ∨ ¬z ¬x. und Jede Boolesche Formel phi hat eine konjunktive Normalform (KNF), d.h., φ = φ1 ∧ φ2 ∧ ⋅ ⋅ ⋅ ∧ φn ist eine Konjunktion der Klauseln φ1 , . . . , φn . Z.B. hat die Formel φ = (x → y ∧ z) ∧ (¬x → ¬z) die folgende KNF: wir benutzen die Äquivalenz von a→b und ¬a ∨ b und erhalten φ = (¬x ∨ (y ∧ z)) ∧ (x ∨ ¬z) Da ¬x ∨ (y ∧ z) äquivalent zu (¬x ∨ y) ∧ (¬x ∨ z) ist (de Morgansches Gesetz), gilt φ = (¬x ∨ y) ∧ (¬x ∨ z) ∧ (x ∨ ¬z). Das ist also eine Boolesche Formel, deren Klauseln je zwei Literale enthalten. Eine Formel φ heißt erfüllbar , falls die Variablen so mit true oder false belegt werden können, dass φ den Wert true annimmt. Beispiel: die obige Formel ist erfüllbar, denn für x = true, y = true, z = true gilt φ = true. Es ist kein effizienter Algorithmus bekannt, der für jede Boolesche Formel unterscheidet, ob sie erfüllbar ist. Das Problem m-ERFÜLLBARKEIT ist: Gegeben, eine Boolesche Formel φ in konjunktiver Normalform, wobei jede Klausel m Literale enthält, ist φ erfüllbar? Wir definieren die Größe der Eingabe φ als n + k, wobei n die Anzahl aller Variablen und k die Anzahl aller Klauseln von φ ist. 2-ERFÜLLBARKEIT gehört zur Klasse P. Wir könnten hier einen effizienten Algorithmus angeben, aber einfacher ist es zu zeigen (in Abschnitt 6.3), dass es eine effiziente Reduktion dieses Problems auf ein anderes Problem der Klasse P gibt – daraus folgt dann indirekt, dass 2-ERFÜLLBARKEIT zur Klasse P gehört. 3-ERFÜLLBARKEIT ist dagegen schwierig: in Abschnitt 6.4 zeigen wir, dass dieses Problem N P-vollständig ist, also genauso schwierig wie 3-FÄRBUNG. bsp-universal Beispiel 6 (UNIVERSALITÄT REGULÄRER AUSDRÜCKE). Das ist ein (rares) Beispiel eines leicht zu formulierenden Problems, für das bewiesen wurde, dass es nicht effizient lösbar ist. Reguläre Ausdrücke haben wir in Kapitel 1 eingeführt: sie werden aus Buchstaben des Alphabets Σ, z.B. Σ = {a, b}, und Symbolen ∅ und mit Hilfe der Operatoren +, ⋅, und ∗ erzeugt. Jetzt arbeiten wir mit komprimierter Notation: statt xx . . . x (n-mal) schreiben wir x ↑ n (n binär), z.B. xxxxx = x ↑ 101 144 KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN Der reguläre Ausdruck (aaa + b∗ )(aaa + b∗ ) ergibt also in komprimierter Notation (a ↑ 11 + b∗ ) ↑ 10. Ein regulärer Ausdruck über dem Alphabet Σ heißt universal , falls die dadurch definierte Sprache die ganze Sprache Σ∗ ist. Z.B. ist der obige reguläre Ausdruck (über Σ = {a, b}) nicht universal, aber (a∗ ↑ 11+b∗ ) ↑ 10 ist universal. Jeder reguläre Ausdruck über Σ ist also ein Wort über dem Alphabet Σ ∪ {∗, +, (, ), 0, 1, ↑} und die Länge dieses Wortes ist dann die Größe der Eingabe. Satz 1. Das Problem, zu entscheiden, ob ein gegebener regulärer Ausdruck in komprimierter Notation über {a, b} universal ist, gehört nicht zu P. Den Beweis kann der Leser unter 13.15 im Buch von Hopcroft und Ullman (siehe Einleitung [?]) finden. 6.3 Berechnungsprobleme und Reduzierbarkeit sect-berechnungsprob Die Komplexitätsklasse P wurde für Entscheidungsprobleme eingeführt. Analog können wir für Berechnungsprobleme die Klasse FP einführen, die alle in polynomialer Zeit lösbaren Probleme enthält. Beispiel 1. 2-FÄRBUNG ist das Problem, zu jedem 2-färbbaren Graphen eine 2-Färbung zu berechnen. Darunter verstehen wir, wie üblich, eine Funktion f ∶ {0, 1}∗ → {0, 1}∗ , die jedem binären Code w = c(G) eines Graphen G einen binären Code f (w) seiner 2-Färbung zuordnet, falls G eine 2-Färbung hat. So eine Funktion kann in linearer Zeit berechnet werden, siehe Beispiel 3 in 6.1. Wir verwenden wieder TM als Berechnungsmodell. Wir sagen, dass eine TM eine Funktion f ∶ Σ∗ → Γ∗ (Σ, Γ zwei Alphabete) berechnet, falls die TM für jede Eingabe s1 s2 . . . sn (aus Σ∗ ) nach endlich vielen Schritten mit dem Wort f (s1 . . . sn ) (aus Γ∗ ) auf dem Band hält, siehe Abschnitt ?? Definition. Wir bezeichnen mit FP die Klasse aller Funktionen f ∶ Σ∗ → Γ∗ , die von einer TM in polynomialer Zeit berechnet werden können. D.h., für die eine Turingmaschine M und ein Polynom p(n) existieren, so dass M auf jede Eingabe s1 . . . sn aus Σ∗ in höchstens p(n) Schritten hält und f (s1 . . . sn ) auf das Band schreibt. 6.3. BERECHNUNGSPROBLEME UND REDUZIERBARKEIT bsp-starke-komp arke-komp-formen-graph 145 Beispiel 2 (STARKE KOMPONENTEN). Zwei Knoten eines gerichteten Graphen G können genau dann in beiden Richtungen durch einen gerichteten Weg verbunden werden, wenn sie in einem Kreis des Graphen liegen. Wir sagen dann, dass die beiden Knoten in derselben starken Komponente liegen. Genauer: eine starke Komponente von G ist eine maximale Menge von Knoten, die durch gerichtete Wege (in beiden Richtungen) miteinander verbunden werden können. Beispiel: der folgende Graph <●b a ●o "● c d ●uo /● e "● | f hat drei starke Komponenten: {a, b, c}, {d, e} und {f }. Aufgrund des Algorithmus aus Beispiel 5 in 6.1 können wir einen trivialen Algorithmus finden, der für einen Graphen mit n Knoten und k Kanten in der Zeit O(n2 (n + k)) die starken Komponenten aufzählt: wir wählen einen Knoten v und fragen für jeden Knoten w, ob ein Weg von v zu w sowie ein Weg von w nach v führt. Das braucht O(2(n + k)) = O(n + k) Schritte für jeden Knoten w, also insgesamt O(n(n + k)) Schritte. Damit wird die starke Komponente von v in der Zeit O(n(n + k)) bestimmt. Außerdem gibt es höchstens n starke Komponenten, also ist die gesamte Komplexität O(n2 (n + k)). Es existiert ein Algorithmus, der die starken Komponenten in linearer Zeit O(n + k) berechnet. Diesen werden wir hier aber nicht vorführen. Bemerkung 1. Starke Komponenten jedes Graphen G formen einen neuen gerichteten Graphen G. Genauer, die Knoten von G sind die starken Komponenten v der Knoten v von G. Und für zwei starke Komponenten v, w von G gilt: (v, w) ist eine Kante von G genau dann, wenn v ≠ w und ein gerichteter Weg von v nach w führt in G. Zum Beispiel ergibt sich aus dem obigen Graphen G der folgende Graph ● {a, b, c} ● {d, e} ● {f } Es ist klar, dass der neue Graph G azyklisch ist (denn jeder Kreis von G kann zu einem Kreis aus G ergänzt werden, der dann mehrere starke Komponenten verbinden würde, das ist jedoch nicht möglich). Aufgrund von Beispiel 1 in 6.1 können also die starken Komponenten jedes gerichteten Graphen so sortiert werden, dass ord(v) ≤ ord(w) für jede Kante (v, w) von G. Bemerkung 2. Wir wollen verschiedene Entscheidungsprobleme bezüglich ihrer Komplexität vergleichen. Wann kann man sagen, dass ein Problem L ⊆ Σ∗ nicht schwieriger ist, als ein Problem L0 ⊆ Γ∗ ? Falls wir eine Übersetzung f haben, die alle Instanzen des ersten Problems (d.h., Wörter über Σ) in Instanzen des zweiten 146 KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN (Wörter über Γ) überführt, so dass die Lösungen von L genau den Lösungen von L0 entsprechen und f selbst effizient berechenbar ist: Definition. Wir sagen, dass eine Sprache L ⊆ Σ∗ in polynomialer Zeit auf eine Sprache L0 ⊆ Γ∗ reduzierbar ist, falls es eine Funktion f ∶ Σ∗ → Γ∗ der Klasse FP mit x ∈ L genau dann, wenn f (x) ∈ L0 (für alle x ∈ Σ∗ ) gibt. Aufpassen! Die Voraussetzung, dass die Reduktion f zur Klasse FP gehört, ist der Kern dieser Definition! Es ist nämlich trivial, eine beliebige Funktion f zu definieren, für die gilt x ∈ L genau dann, wenn f (x) ∈ L0 : man wähle zwei Wörter w ∈ L0 und w′ ∉ L0 und setze ⎧ ⎪ ⎪w falls x ∈ L f (x) = ⎨ ′ ⎪w falls x ∉ L ⎪ ⎩ Beispiel 3 (KANTEN-2-FÄRBBARKEIT). Wir wollen für einen gegebenen ungerichteten Graphen G wissen, ob sich seine Kanten derart blau und rot färben lassen, so dass Kanten mit gemeinsamen Knoten nie gleichfarbig sind. [Achtung: Wir haben gerade ein Entscheidungproblem formuliert; das zugehörige Berechnugsproblem besteht darin, eine legitime Kantenfärbung zu konstruieren, oder festzustellen, daß keine existiert. Insofern können wir das Entscheidungprobem auf dem Umweg über das Berechnungsproblem lösen.] Dieses Entscheidungsproblem können wir wie folgt auf das Problem von 2-Färbbarkeit (von Knoten) reduzieren: für jeden ungerichteten Graphen G = (V, E) bezeichnen wir mit Ĝ = (E, H) den dualen Graphen, dessen Knoten die Kanten von G sind, und zwei Kanten von G formen in Ĝ eine Kante (also gehören sie zu H) genau dann, wenn sie in G benachbart sind. Beispiel: ● ● (2, 3) 3 1● ●2 5● ●4 G (1, 3) ● ● (1, 2) ● (2, 4) Ĝ Es gilt: jede 2-Färbung von Ĝ ergibt eine Kanten-2-Färbung von G und umgekehrt. Folglich ist Ĝ genau dann 2-färbbar, wenn dies für G gilt. Ist diese Reduktion in polynomialer Zeit durchführbar? Das heißt, gehört die Funktion f ∶ {0, 1}∗ → {0, 1}∗ , die jedem Code wG eines Graphen G den Code f (wG ) = wĜ des dualen Graphen zuordnet, zu FP? Falls die Graphen als Adjazenzmatrizen implementiert werden, wird zu einer Matrix M die folgende Matrix f (M ) zugeordnet: die Zeilen und Spalten von f (M ) sind mit allen Paaren (i, j) markiert, wobei i ≤ j und Mij = 1. Und f (M ) hat eine 1 in der Position von Zeile (i, j) und Spalte (i′ , j ′ ) genau dann, wenn i = i′ oder j = j ′ . Das können wir in linearer Zeit O(m), wobei m die Größe der Eingabe ist (m = n2 für Graphen mit n Knoten), berechnen. Satz 1. Falls eine Sprache L0 zur Klasse P gehört, gehören zu P auch alle Sprachen, die sich in polynomialer Zeit auf L0 reduzieren lassen. Beweis. Wir haben eine Turingmaschine M0 , die L0 ⊆ Γ∗ akzeptiert, und eine polynomiale Zeitkomplexität p(n) hat. Für jede Sprache L ⊆ Σ∗ und jede Funktion f ∶ Σ∗ → Γ∗ der Klasse FP, die x ∈ L ⇐⇒ f (x) ∈ L0 erfüllt, zeigen wir, dass 6.3. BERECHNUNGSPROBLEME UND REDUZIERBARKEIT 147 die Sprache L zu P gehört. Sei M eine Turingmaschine mit polynomialer Zeitkomplexität q(n), die f berechnet. Wir benutzen die folgende 2-Band Turingmaschine M̃ : BAND 1: Eingabeband (Simulation von M ) s1 s2 ... sn BAND 2: Simulation von M0 Auf Band 1 wird erst M simuliert, so dass die Eingabe x = s1 s2 . . . sn , nachdem M gehalten hat, das Wort f (x) auf Band 1 ergibt. Das Wort wird jetzt auf Band 2 kopiert und M0 wird simuliert. Falls M0 akzeptiert, akzeptiert auch M̃ , und umgekehrt. Die Maschine M̃ akzeptiert ein Wort x ∈ Σ∗ genau dann, wenn M0 das Wort f (x) akzeptiert, d.h., genau dann, wenn f (x) ∈ L0 gilt. Das ist äquivalent zu x ∈ L. Es gilt also L = L(M̃ ). Für Eingaben der Länge n hält M nach höchstens q(n) Schritten und beschriftet höchstens q(n) Felder. In q(n) Schritten kopieren wir das Wort auf Band 2 und dann hält M0 in höchstens p(q(n)) Schritten. Die Zeitkomplexität von M̃ ist also 2q(n) + p(q(n)). Dieser Ausdruck ist ein Polynom, also gilt L(M̃ ) ∈ P. Beispiel 4. 2-ERFÜLLBARKEIT kann in polynomialer Zeit auf STARKE KOMPONENTEN (Beispiel 2) reduziert werden; deswegen gehört 2-ERFÜLLBARKEIT zu P. [Achtung: STARKE KOMPONENTEN ist ein Berechnungsproblem; das zugehörige Entscheidungsproblem, das in Wirklichkeit Ziel unserer Reduktion ist, fragt, ob für einen gerichteten Graphen, dessen Knotenmenge V disjunkte Vereinigung zweier isomorpher Mengen V ′ und V ′′ ist, und für eine Bijektion f ∶ V ′ → V ′′ die Knoten v ′ ∈ V ′ und f (v ′ ) ∈ V ′′ immer in verschiedenen starken Komponenten liegen.] Wir beschreiben die Reduktion. Für jede Formel φ in konjunktiver Normalform mit 2 Literalen je Klausel konstruieren wir einen gerichteten Graphen Gφ wie folgt: Knoten: für jede Variable x von φ hat Gφ zwei Knoten, markiert mit x und ¬x. Kanten: für jede Klausel α ∨ β von φ gibt es zwei Kanten in G: β ¬β ¬α α /● ● ●/ ● und Beispiel: für die Formel φ = (x ∨ y) ∧ (¬x ∨ z) ∧ (¬z ∨ ¬y) haben wir den Graphen x● _ y ?● ●a ● ¬y ¬x ●z ● ¬z Diese Konstruktion ist eine Reduktion in polynomialer Zeit, denn es gilt 148 KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN 1. φ ist erfüllbar genau dann, wenn x und ¬x in verschiedenen starken Komponenten von G liegen (für jede Variable x), und 2. die Funktion f , die jeder Formel φ den Graphen Gφ zuordnet, hat eine lineare Zeitkomplexität. Es ist klar, dass (2) gilt: falls φ eine Formel der Größe n (= Anzahl aller Variablen + Anzahl aller Klauseln) ist, benötigt die Konstruktion von Gφ die Zeit O(n). Wir beweisen (1). 1. Sei φ erfüllbar. Wir haben also eine Belegung der Variablen, so dass jede Klausel von φ den Wert true hat (d.h., für jede Klausel α ∨ β gilt α = true oder β = true). Es folgt, dass von einem true Knoten in Gφ keine Kante zu einem false Knoten führt. (Für die Kante ¬α → β gilt, falls ¬α = true, dass β = true sein muss, denn α ∨ β ist eine Klausel von φ; analoges gilt für ¬β → α.) Falls die Variable x den Wert true hat, führt in Gφ also kein Weg zu ¬x; falls x = false ist, führt kein Weg von ¬x zu x. In beiden Fällen liegen x und ¬x in verschiedenen starken Komponenten. 2. Seien x und ¬x immer in verschiedenen starken Komponenten. Wir erinnern an die obige Bemerkung 1: die starken Komponenten v der Knoten v des Graphen Gφ können so sortiert werden, dass für jede Kante v → w von G ord(v) ≤ ord(w) gilt. Wir belegen die Variablen wie folgt: x = true genau dann, wenn ord(¬x) < ord(x) (d.h., x hat genau dann den Wert true, wenn die starke Komponente von ¬x vor der starken Komponente von x liegt). Wir müssen beweisen, dass für jede Klausel α ∨ β entweder α = true oder β = true gilt (denn dann gilt φ = true). Nehmen wir an, dass α = false, d.h., ord(α) ≤ ord(¬α), dann beweisen wir β = true. Da Gφ die Kante ¬α → β enthält, gilt ord(¬α) ≤ ord(β) und da er auch die Kante ¬β → α enthält, gilt ord(¬β) ≤ ord(α). Also ord(¬β) ≤ ord(α) ≤ ord(¬α) ≤ ord(β). Damit ist bewiesen, dass ord(¬β) < ord(β) (denn die Komponenten ¬β und β sind wohl verschieden), also β = true. Konkrete Beispiele: Die Formel oben ist erfüllbar, denn die starken Komponenten des Graphen Gφ sind {x, z, ¬y} und {¬x, y, ¬z}. Die Formel (y ∨ x) ∧ (¬y ∨ z) ∧ (¬z ∨ x) ∧ (¬x ∨ ¬t) ∧ (t ∨ ¬x) ist nicht erfüllbar, denn der entsprechende Graph 6.4. ROBUSTHEIT DER KLASSE P v x● _ ¬x ●W 149 t ●t / ●z y? ● ¬y ● o 6 ● ¬z * ● ¬t hat eine einzige starke Komponente. Notation. Für zwei Sprachen L und L0 schreiben wir L ◁ L0 falls L auf L0 in polynomialer Zeit reduzierbar ist. (Das Zeichen ◁ ist dem Zeichen ≤ ähnlich und deutet an, dass die Komplexität von L kleiner gleich der von L0 ist.) Satz 2. Die Relation ◁ ist transitiv: für Sprachen Li ⊆ Σ∗i (i = 1, 2, 3) gilt L1 ◁ L2 ◁ L3 Ô⇒ L1 ◁ L3 . Beweis. Aus L1 ◁ L2 folgt, dass eine Funktion f1 ∶ Σ∗1 → Σ∗2 der Klasse FP x ∈ L1 ⇐⇒ f1 (x) ∈ L2 erfüllt; aus L2 ◁ L3 folgt, dass eine Funktion f2 ∶ Σ∗2 → Σ∗3 der Klasse FP y ∈ L2 ⇐⇒ f2 (y) ∈ L3 erfüllt. Sei h ∶ Σ∗1 → Σ∗3 , h(x) = f2 (f1 (x)) die Verknüpfung von f1 und f2 . Es gilt x ∈ L1 ⇐⇒ f1 (x) ∈ L2 ⇐⇒ h(x) = f2 (f1 (x)) ∈ L3 . Also bleibt nur zu zeigen, dass h(x) in der Klasse FP liegt. In der Tat: die Funktion fi (i = 1, 2) wird durch eine TM Mi in polynomialer Zeit pi (n) berechnet. Dann wird die Funktion h(x) = f2 (f1 (x)) durch die folgende TM berechnet: x / M1 f1 (x) / M2 / f2 (f1 (x)) Für Wörter x der Länge n macht M1 höchstens p1 (n) Schritte und schreibt also höchstens p1 (n) Symbole. Das Wort f1 (x) hat daher die Länge ≤ n + p1 (n). Dann dauert die Berechnung von M2 höchstens p2 (n + p1 (n)) Schritte. Insgesamt braucht die obige TM höchstens p1 (n) + p2 (n + p1 (n)) Schritte, und das ist ein Polynom – also liegt h in FP. Natürlich ist die Relation ◁ reflexiv, aber sie ist nicht antisymmetrisch. 6.4 sect-p-robust Robustheit der Klasse P Die Definition der Klasse P war auf dem Modell von TM aufgebaut. Sie ist aber von diesem Modell unabhängig, wie wir jetzt demonstrieren werden. Zuerst zeigen wir, dass, falls verschiedene Modifikationen von TM benutzt worden wären, die Klasse P dieselbe geblieben wäre. Die Zeitkomplexität ist für k-Band-TM genau wie oben für TM definiert. 150 6.4.1 KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN TM mit zusätzlichem Gedächtnis Erinnern wir daran, dass eine TM mit zusätzlichem Gedächtnis die Möglichkeit eines Zugriffs auf ein Gedächtnis hat, in dem Symbole eines endlichen Alphabets A gespeichert werden, siehe 3.2.2. Dies ist allerdings eine normale“ TM mit der ” Zustandsmenge Q × A. Für die Definition der Klasse P ist es also unerheblich, ob wir TM oder TM mit zusätzlichem Gedächtnis als Berechnungsmodell anwenden. 6.4.2 TM mit mehrspurigem Band Auch dieses Modell ändert die Klasse P nicht, denn wie in 3.2.3 gezeigt wurde, ist eine TM mit k-spurigem Band eine normale“ TM mit dem Bandalphabet ” Σ = (Σ1 ∪ {#}) × ⋅ ⋅ ⋅ × (Σk ∪ {#}) − {(#, . . . , #)}. 6.4.3 Mehr-Band TM In 3.2.4 haben wir das Modell einer k-Band-TM eingeführt: die TM hat k Bänder mit k unabhängigen Lese- und Schreibköpfen, aber mit einer Steuereinheit, die aufgrund des gegebenen Zustandes und der k gelesenen Symbole die Aktivität der k Köpfe steuert. Wir haben in 3.2.4 bewiesen, dass jede k-Band-TM durch eine TM simuliert werden kann. Jetzt beweisen wir, dass dies in polynomialer Zeit möglich ist: satz-k-band-sim-quad Satz 1. Jede k-Band-TM mit einer Zeitkomplexität t(n) ≥ n kann durch eine 1Band-TM mit einer Zeitkomplexität O(t(n)2 ) simuliert werden. Beweis. Wir führen den Beweis für k = 2 durch, der allgemeine Fall läßt sich ganz analog durchführen. Wir gehen von der Simulation, die in Kapitel 3 (siehe 3.2.2) beschrieben wurde, aus. Jeder Berechnungsschritt der Simulation hat drei Unterabschnitte. Abschnitt 1 (der Anfang) dauert einen Schritt, Abschnitt 2 (Kopfbewegung nach rechts oder links) benötigt höchstens O(t(n)) Schritte, denn der Kopf wird unter das nächste Symbol ⇑ bewegt und in der Zeit t(n) kann die k-Band-TM auf jedem Band höchstens O(t(n)) neue Felder beschreiben. Im Abschnitt 3 wird die Berechnung von Kopf i simuliert (in konstanter Zeit für i = 1, 2) und der Kopf wird zwischen die beiden Symbole ⇑ (in O(t(n)) Schritten bewegt. Jeder Simulationsdurchgang dauert also höchstens O(t(n)) Schritte. Da wir höchstens t(n) Durchgänge benötigen, hat die 1-Band-TM die Zeitkomplexität O(t(n)2 ). Korollar 1. Jede Sprache, die von einer k-Band-TM mit polynomialer Zeitkomplexität akzeptiert wird, gehört zur Klasse P. Beweis. Falls t(n) ein Polynom ist, ist auch t(n)2 ein Polynom. Bemerkung 1. Mit anderen Worten würde die Klasse P die gleiche bleiben, falls wir bei der Definition von P anstelle der TM die k-Band-TM benutzt hätten. Das gilt auch für die Klasse FP. 6.4.4 RAM In Kapitel ?? haben wir RAM als ein realistischeres Berechnungsmodell als TM eingeführt. Dann haben wir bewiesen, dass die Modelle RAM und TM die gleiche Leistung haben. Das gilt auch für die entsprechenden Klassen FP der in polynomialer Zeit berechenbaren Funktionen. Zuerst müssen wir aber erklären, was Zeitkomplexität für RAMs bedeutet. Es gibt zwei Varianten: 6.4. ROBUSTHEIT DER KLASSE P 151 Uniforme Zeitkomplexität. Hierbei gilt analog zu TM, dass jede Durchführung eines Befehls einem Schritt entspricht. Trotz der Analogie zu TM ist diese Variante nicht realistisch genug: ein Feld der RAM kann nämlich eine beliebig große Zahl enthalten. Wir können z.B. die ganze Eingabe s1 . . . sn als eine (sehr große) Zahl i codieren und i in einem Feld speichern – dann hat die Eingabe einfach die Größe 1. Deshalb hat uniforme Zeitkomplexität nur geringere theoretische Bedeutung (obwohl sie manchmal benutzt wird mit der Voraussetzung, dass die Codierung vernünftig“ durchgeführt wurde). ” Logarithmische Zeitkomplexität zählt die Anzahl aller Ziffern, die die Operanden des Befehls berechnen. Also, falls in einem Feld eine Zahl n steht, hat n die Größe dig(n) = kleinste ganze Zahl größer oder gleich log n (dig(n) ist die Zahl aller Ziffern von n.) Jeder Befehl zählt als k+1 Schritte, wobei k die Summe der Größen“ der Operanden ” ist. Z.B. der Befehl STORE i dauert 1 + dig(i) + dig(n) Schritte, wobei ⟨R0⟩ = n. Und STORE ∗i dauert 1 + dig(i) + dig(n) + dig(m) Schritte, wobei ⟨R0⟩ = n und ⟨Ri⟩ = m. Satz 2. Jede RAM mit logarithmischer Zeitkomplexität t(n) kann von einer MehrBand TM mit der Zeitkomplexität O(t(n)2 ) simuliert werden. Beweis. In Satz ?? in ?? haben wir gezeigt, wie man eine RAM einem Programm von p Zeilen von einer 6-Band-TM simulieren kann. Wir müssen nur beweisen, dass diese TM die Zeitkomplexität O(t(n)2 ) hat. Für jede Eingabe der Länge n dauert die Berechnung der RAM höchstens t(n) Schritte, und es werden höchstens t(n) Befehle durchgeführt. Daraus folgt, dass jedes Register eine Zahl mit O(t(n)) Ziffern enthält. Wir zeigen, dass jeder Befehl in höchstens O(t(n)) Schritten mit der TM simuliert wird – daraus folgt, dass die ganze Berechnung nur O(t(n)2 ) Schritte dauert. Es ist klar, dass auf jedem Band der TM höchstens O(t(n)) Felder beschriftet werden. Der Beweis, dass jeder Befehl in O(t(n)) Schritten simuliert wird, muß für alle möglichen Befehle einzeln durchgeführt werden. Wir nehmen zur Illustration den Fall STORE ∗i (detailliert im Beweis von Satz ?? in ?? beschrieben); die Zeitkomplexität der anderen Befehle läßt sich analog schätzen. Zuerst sucht der Kopf auf Band 2 die Kombination $ $ i $ j $ $. Da auf Band 2 höchstens O(t(n)) Felder beschriftet worden sind, dauert die Suche höchstens O(t(n)) Schritte. Dann schreibt die TM die Zahl j auf Band 5, dazu werden auch O(t(n)) Schritte benötigt, denn j hat O(t(n)) Ziffern. Da 3t(n) = O(t(n)), sehen wir, dass STORE ∗i in O(t(n)) Schritten simuliert wird. Korollar 2. Jede RAM mit polynomialer logarithmischer Zeitkomplexität berechnet eine Funktion der Klasse FP. Beweis. In der Tat wird eine RAM, falls sie die Zeitkomplexität t(n) hat, wobei t(n) ein Polynom ist, von einer Mehr-Band-TM mit der Zeitkomplexität O(t(n)2 ) 152 KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN simuliert und diese wird wiederum von einer Turingmaschine M mit der Zeitkomplexität O(n2 + (t(n))4 ) simuliert. Dann berechnet M dieselbe Funktion wie die RAM, und da n2 + t(n)4 ein Polynom ist, folgt daraus, dass die Funktion zu FP gehört. Schlußbemerkung: Die Klasse P ist unabhängig von unserer Wahl des Berechnungsmodells: wir konnten, statt TM, eine beliebige deterministische Variante von TM nehmen, um dieselbe Klasse zu beschreiben. Auch RAM, obwohl es ein viel stärkeres Modell ist, ergibt für Zahlenfunktionen keine größere Klasse von Funktionen, die polynomiale Zeitkomplexität haben, als die Klasse FP. 6.5 Geometrische Algorithmen und reelle RAM sect-geom Viele Algorithmen, speziell in der Computer-Graphik, arbeiten mit geometrischen Objekten in der Ebene oder im Raum, und für ihre Komplexität wird ein modifiziertes Berechnungsmodell benutzt: RAM, die mit reellen Zahlen arbeitet. Reelle RAM ist genau wie RAM (siehe ??) definiert, nur enthält jedes Register und jedes Feld des Ein- und Ausgabebandes eine reelle Zahl. Auch die Liste aller Operationen ist gleich (zum Beispiel LOAD i, LOAD ∗i, LOAD !i für eine beliebige natürliche Zahl i), aber die Operanden von ADD sind reelle Zahlen. Wie in Kapitel ?? gezeigt wurde, sind weitere Operationen (für RAM oder reelle RAM) einfach zu programmieren, zum Beispiel die Multiplikation von zwei Zahlen. Wir nehmen ferner an, dass Multiplikation und Division an einer reellen RAM so programmiert werden, dass sie in O(1) Schritten durchgeführt werden. Für die uniforme Komplexität im Fall der reellen RAM definieren wir die Größe der reellen Zahl x = n10−m als dig(n) + dig(m). Beispiel 1 (LINIE). Eingabe: Punkte a, b und r der Ebene, a ≠ b Ausgabe: JA, falls r auf der Linie L(a, b), von a und b bestimmt, liegt. Falls ( )x und ( )y die x- und y-Koordinaten bezeichnen, ist die Antwort genau dann JA, wenn rx − ax bx − ax = ry − ay by − ay (im Fall ry ≠ ay und by ≠ ay ) oder ganz allgemein: genau wenn (rx − ax )(by − ay ) = (bx − ax )(ry − ay ). Diese Entscheidung dauert nur O(1) Schritte auf einer reellen RAM. Beispiel 2 (ÜBER DER LINIE). Eingabe: Punkte a, b und r in der Ebene mit ax ≠ bx Ausgabe: JA, falls r über der Linie L(a, b) liegt. r ● ● b ● a r über L(a, b), mit k > 0 ● a r ● ● b r über L(a, b), mit k < 0 6.5. GEOMETRISCHE ALGORITHMEN UND REELLE RAM 153 Falls die Linie L(a, b) die Gleichung y = kx + q hat, liegt r genau dann über dieser Linie, wenn ry > krx + q. Auch diese Entscheidung dauert O(1) Schritte. Beispiel 3 (DAS INNERE EINES POLYGONS). Eingabe: Ein konvexes Polygon P und ein Punkt r. Ausgabe: Entscheidung, ob r im Inneren von P liegt. Bemerkung 1. Ein Polygon P ist eine Liste von Punkten, die als die Ecken von P bezeichnet werden. Ein Polygon P = (v0 , v1 , . . . , vn−1 ) heißt simple, falls sich die Strecken L(vi , vi+1 ) (wobei i + 1 modulo n berechnet wird) nur in den erwarteten“ ” Ecken schneiden, d.h., der Durchschnitt von L(vi , vi+1 ) und L(vj , vj+1 ) mit i ≠ j ist vi , falls j +1 = i, oder vj , falls i+1 = j, und ansonsten leer. Falls wir aus der Ebene die Strecken eines simplen Polygons P entfernen, erhalten wir zwei zusammenhängende Teile, einen gebundenen, der das Innere von P genannt wird, und einen weiteren, der als das Äußere von P bezeichnet wird. Ein simples Polygon P heißt konvex , falls sein Inneres jede Strecke enthält, deren Endpunkte es enthält. Beispiele: ● ● ● ● ● ● Konvexes Polygon ● ● ● ● ● ● ● ● ● ● ● Nichtkonvexes Polygon Nichtsimples Polygon Ein konvexes Polygon wird als eine Liste v0 , v1 , . . . , vn−1 von Punkten angegeben, wobei wir annehmen, dass die Orientierung im Uhrzeigersinn erfolgt und keine zwei benachbarten Ecken auf der gleichen Linie liegen: v1 ● v0 ● vn−1 ● ● vn−2 ● v2 ● ⋅ ⋅ ⋅ ● Um unseren Algorithmus zu vereinfachen, nehmen wir zusätzlich an, dass die xKoordinaten der Punkte v0 , . . . , vn−1 voneinander verschieden sind. Algorithmus für das INNERE EINES POLYGONS 1. Wir wählen einen Punkt p im Inneren von P . 2. Die Halblinien von p zu den Ecken v0 , . . . , vn−1 teilen die Ebene in n Sektoren. Wir bestimmen den Sektor, in dem sich der gegebene Punkt r befindet, in O(log n) Schritten wie folgt. 154 KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN v0 vi+1 ● ● ● ● a ● v1 ● p vi ● Wir suchen also i0 = 0, . . . , n − 1, so dass r im Sektor (vi0 , p, vi0 +1 ) liegt (hier wird i0 + 1 modulo n berechnet, d.h., (n − 1) + 1 = 0). Wir wenden binäres Suchen an: falls wir, für jedes i = 0, . . . , n − 1, in konstanter Schrittzahl O(1) entscheiden, ob i0 kleiner, gleich oder größer als i ist, berechnen wir i0 in O(log n) Schritten. Falls r rechts von p liegt (rx ≥ px ) brauchen wir nur die Ecken rechts von p betrachten. Sei also vi eine solche Ecke: vi 0 ● ● r ● vi0 +1 ● vi ● Falls r über L(p, vi ) liegt, gilt i0 > i. Falls r unter L(p, vi ), aber über L(p, vi+1 ) liegt, gilt i0 = i . Und falls r unter L(p, vi+1 ) liegt, gilt i0 < i. Diese Entscheidung benötigt eine konstante Zahl von Schritten. Analoges gilt für a links von p (rx ≤ px ). 3. Falls der Sektor (vi , p, vi+1 ), in dem r liegt, berechnet worden ist, gilt: r liegt genau dann im Inneren des Polygons P , wenn es im Inneren des Dreiecks (vi , p, vi+1 ) liegt. Dies bestimmen wir in konstanter Zahl O(1) von Schritten. (Sei αx + βy + γ = 0 die Gleichung der Linie L(vi , vi+1 ). Dann liegt r genau dann im Inneren des Dreiecks, wenn αx + βy + γ dieselben Zeichen für die Koordinaten von r und p hat.) Zeitkomplexität Der Algorithmus wird in O(1) + O(log n) + O(1) = O(log n) Schritten durchgeführt. Beispiel 4 (KONVEXE HÜLLE). Eingabe: Punkte v1 , . . . , vn in der Ebene mit paarweise verschiedenen x-Koordinaten. Ausgabe: Konvexe Hülle, d.h., das kleinste Polygon, das alle Punkte enthält. Bemerkung 2. Jede Ecke der konvexen Hülle ist einer der gegebenen Punkte. Das kann man sich leicht am Gummiband-Modell klarmachen: stellen wir uns ein elastisches Gummiband vor, das so gestreckt wird, dass es alle gegebenen Punkte enthält, und anschließend losgelassen wird. Es formt dann die konvexe Hülle. 6.5. GEOMETRISCHE ALGORITHMEN UND REELLE RAM 155 Die Ausgabe des folgenden Algorithmus ist also eine Liste mit Punkten vi (für einige i = 1, . . . , n), die die konvexe Hülle, im Uhrzeigersinn orientiert, repräsentiert. Algorithmus für die KONVEXE HÜLLE 1. Sortieren Wir sortieren die gegebenen Punkte nach ihren x-Koordinaten. Weiter nehmen wir also an, dass vi für alle i = 1, . . . , n links von vi+1 steht. 2. Berechnung der oberen Hülle Der Punkt v1 liegt links von allen anderen Punkten und der Punkt vn liegt rechts – also sind v1 und vn bestimmt in der konvexen Hülle enthalten. Die konvexe Hülle besteht aus (a) einer Liste mit Punkten von v1 zu vn , die wir die obere Hülle nennen und (b) einer Liste mit Punkten von vn zu v1 , der unteren Hülle. In dem folgenden Beispiel v4 v1 ● ● v8 ● ● v2 ● v6 ● v10 ● ● v5 ● v7 ● v3 v12 ● v11 ● obere Hülle v14 untere Hülle ● v13 ● v9 ist die obere Hülle v1 , v4 , v8 , v12 , v14 und die untere Hülle ist v14 , v13 , v9 , v3 , v1 . Die Berechnung der oberen Hülle verfolgt die folgende divide-and-conquer Strategie: 2a Die Punkte v1 , . . . , vn werden in zwei ungefähr gleich große Teile aufgeteilt. Nehmen wir an, dass n gerade ist, dann arbeiten wir mit der linken Hälfte“ ” v1, . . . , vn/2 und der rechten Hälfte“ vn/2+1 , . . . , vn . Für beide Hälften bestim” men wir rekursiv die obere Hülle. 156 KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN pi0 ● . .. ● p2 ● ● v1 = p 1 . .. ● ●⋱ ● ● qj0 ● q2 ● ● ● ● ps q1 ● obere Hülle für v1 , . . . , vn/2 ●⋱ ● ● ● ● ● q t = vn obere Hülle für vn/2+1 , . . . , vn Wir bezeichnen die obere Hülle von v1 , . . . , vn/2 mit p1 , p2 , . . . , p s und die obere Hülle für vn/2+1 , . . . , vn mit q1 , q2 , . . . , q t . 2b Wir berechnen die obere Tangente der beiden gefundenen oberen Hüllen: das ist das Segment L(pi0 , qj0 ), so dass alle Punkte p1 , . . . , ps , q1 , . . . , qt unter ihm liegen. 2c Die obere Hülle der Punkte v1 , . . . , vn ist p1 , p2 , . . . , pi0 , qj0 , qj0 +1 , . . . , qt . 3. Berechnung der unteren Hülle Dies geschieht analog zu (2). 4. Die konvexe Hülle ergibt sich aus der oberen Hülle gefolgt von der unteren Hülle. Zeitkomplexität: Schritt (1) hat die Zeitkomplexität O(n log n). Wir zeigen jetzt, dass auch Schritt (2) diese Zeitkomplexität hat; analoges gilt für Schritt (3). Da (4) in n Zeiteinheiten geschrieben werden kann, ist damit bewiesen, dass der ganze Algorithmus die Zeitkomplexität O(n log n) hat. Wir zeigen später, dass dies optimal ist. Zeitkomplexität von Schritt (2): Sie hängt von der Zeitkomplexität von (2b) ab. Wir zeigen, dass die obere Tangente in O(log n) Schritten gefunden werden kann. Dann folgt, falls Schritt (2) in t(n) Zeiteinheiten berechnet wird, dass die Schritte (2a) - (2c) die folgende Zeitkomplexität haben: (2a) (2b) (2c) 2t( n2 ) O(log n) O(n) Zeiteinheiten Zeiteinheiten Zeiteinheiten Es gibt also Konstanten n0 und K, so dass n für alle n ≥ n0 gilt t(n) ≤ 2t( ) + K. 2 6.5. GEOMETRISCHE ALGORITHMEN UND REELLE RAM 157 Da die Gleichung t(n) = 2t( n2 ) + K ⋅ n die Lösung t(n) = K ⋅ n ⋅ log n hat, ist damit bewiesen, dass Schritt 2 die Zeitkomplexität O(n log n) hat. Wie wird die obere Tangente berechnet? Wir zeigen zuerst, wie man für jeden Punkt pi (i = 1, . . . , s) in der Zeit O(log t) die obere Tangente von pi zu den Punkten q1 , . . . , qt berechnet, also wie man den Index j(i) findet, so dass alle Punkte q1 , . . . , qs unter der Linie L(pi , qj(i) ) liegen. ● ● ● ● ● ● qj(i) ● ● qj+1 pi ● ● ● ● qj ● qj−1 ● Das können wir in der Zeit O(log t) durch binäres Suchen zwischen j = 1, . . . , t berechnen, falls wir für jedes j in konstanter Zeit O(1) bestimmen, ob j(i) größer, gleich oder kleiner als j ist. In der Tat: falls qj−1 und qj+1 unter L(pi , qj ) liegen gilt j = j(i), falls qj−1 über L(pi , qj ) liegt gilt j > j(i), falls qj+1 über L(pi , qj ) liegt gilt j < j(i). Analog kann man zeigen, dass in der Zeit O(log n) die globale obere Tangente L(pi0 , qj0 ) berechnet werden kann. Hier müssen wir für jedes Paar (i, j) entscheiden, welcher der 9 Fälle (i = i0 , j = j0 oder i = i0 , j < j0 usw.) zutrifft. Jetzt bestimmen wir i0 durch binäres Suchen zwischen i = 1, . . . , s: für jedes i benötigen wir die Zeit O(log t), um j(i) zu berechnen, und dann nur konstante Zeit, um zu entscheiden, ob i0 größer, gleich oder kleiner als i ist: q j0 ● pi0 ● ● ● ● ● pi+1 ● ● pi qj(i) ● ● pi−1 ● ● ● ● ● ● falls pi−1 und pi+1 unter L(pi , qj(i) ) liegen, gilt i = i0 , falls pi−1 über L(pi , qj(i) ) liegt, gilt i < i0 , falls pi+1 über L(pi , qj(i) ) liegt, gilt i > i0 . ● 158 KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN Daraus folgt, dass wir mit binärem Suchen i0 in der Zeit O((log t)(log s)) = O(log(t + s)) = O(log n) finden können. Es gilt j0 = j(i0 ). Bemerkung 3. Der obige Algorithmus für die KONVEXE HÜLLE ist optimal. Wir können nämlich SORTIEREN auf KONVEXE HÜLLE in linearer Zeit reduzieren – deshalb kann kein Algorithmus schneller als Ω(n log n) sein. In der Tat formen wir mit gegebenen Zahlen x1 , . . . , xn in linearer Zeit die n Punkte v1 , . . . , vn der Kurve y = x2 mit den gegebenen x-Koordinaten: y = x2 x3 x1 x4 x2 Da die Kurve y = x2 konvex ist, enthält die konvexe Hülle der Punkte v1 , . . . , vn jeden dieser Punkte. Also antwortet jeder Algorithmus A, der das Problem KONVEXE HÜLLE löst, auf die Eingabe v1 , . . . , vn mit der Ausgabe vi1 , vi2 , . . . , vin , die eine Orientierung der gegebenen Punkte im Uhrzeigersinn repräsentiert. Sei k der Index, für den vik der letzte Punkt (nach rechts) ist, dann gilt xik > xik+1 > ⋅ ⋅ ⋅ > xin > xi1 > xi2 > ⋅ ⋅ ⋅ > xik−1 Wir können k in linearer Zeit O(n) bestimmen und also in der Zeit n + t(n) + n sortieren, wobei t(n) die Zeit ist, die A benötigt, um die konvexe Hülle zu berechnen. Es gilt also t(n) = Ω(n log n). Beispiel 5 (PLANARE 3-FÄRBBARKEIT). Eingabe: Ein planarer Graph (das heißt, ein Graph, dessen Knoten Punkte der Ebene sind, und dessen Kanten Linien sind, die sich nur in den Knoten schneiden). Ausgabe: Entscheidung, ob der Graph mit drei Farben gefärbt werde kann. Bemerkung 4. 1. Wir wissen, dass für Graphen im allgemeinen 2-FÄRBBARKEIT leicht“ und 3-FÄRBBARKEIT sehr schwierig“ ist, wie genau später ” ” bewiesen wird. Es folgt, dass zum Beispiel 4-FÄRBBARKEIT auch sehr ” schwierig“ sein muß: eine triviale Reduktion 3-FÄRBBARKEIT ◁ 4-FÄRBBARKEIT 6.5. GEOMETRISCHE ALGORITHMEN UND REELLE RAM 159 erfolgt, wenn zu dem gegebenen Graphen G ein neuer Knoten a hinzugefügt und mit allen alten Knoten verbunden wird. Der neue Graph G ist genau dann ● a ● ● ● ● ● G Graph G 4-färbbar, wenn G 3-färbbar ist (denn a muß eine andere Farbe haben als jeder Knoten x ≠ a). Und die Konstruktion von G verlangt nur lineare Zeit. 2. Für planare Graphen ist 2-FÄRBBARKEIT leicht“ (denn das gilt für alle ” Graphen) und 4-FÄRBBARKEIT noch leichter: nach dem berühmten Satz ist jeder planare Graph 4-färbbar! Um so erstaunlicher ist die folgende Reduktion, die zeigt, dass PLANARE 3-FÄRBBARKEIT mindestens so schwierig ist wie allgemeine 3-FÄRBBARKEIT: Reduktion: 3-FÄRBBARKEIT ◁ PLANARE 3-FÄRBBARKEIT Eingabe: ein beliebiger Graph G. Den können wir immer in polynomialer Zeit in der Ebene repräsentieren (ohne zu verlangen, dass die Kanten sich nicht überschneiden). Genauer: 1. für die n Knoten von G wählen wir (beliebig) n verschiedene Punkte der Ebene und 2. die Kante (u, v) von G wird durch eine Linie von Punkt u nach v repräsentiert, so dass kein Knoten außer u, v auf der Linie liegt, und falls sich zwei Linien außer einem Knoten schneiden, liegt der Schnittpunkt auf keiner weiteren Linie des Graphen. Ein Beispiel einer solchen Repräsentation ist im Bild 6.1 gezeigt. Ausgabe: ein planarer Graph G∗ , der genau dann 3-färbbar ist, wenn G 3-färbbar ist. Für die Konstruktion des Graphen G∗ benutzen wir den Hilfsgraphen H in Abbildung 6.2. Dieser Graph ist 3-färbbar, Abbildung 6.3 zeigt drei Beispiele von Färbungen mit den Farben 1, 2, 3. Lemma 1. Jede 3-Färbung von H färbt N und S mit denselben Farben, analog für O und W . Beweis. Nehmen wir an, dass N mit 1 und S mit 2 gefärbt wird. Wie wird der Mittelpunkt M gefärbt? Farbe 1: wählt man für die vertikalen Nachbarn von M die Farben 2 (oben) und 3 (unten), dann bleibt für die horizontalen Nachbarn keine Farbe übrig (Bild (6.4a)). Färbt man dagegen beide vertikalen Nachbarn mit Farbe 3, so muß der rechte horizontale Nachbar die Farbe 2 erhalten, während der Knoten zwischen S und O die Farbe 1 erhalten muß. Dies erzwingt die Farbe 2 für den Knoten O. Aber nun kann der Knoten zwischen N und O nicht mehr gefärbt werden (Bild (6.4b)). 160 KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN ⎡0 ⎢ ⎢0 ⎢ ⎢0 ⎢ ⎢ ⎢1 ⎢ ⎢1 ⎢ ⎢1 ⎣ (6.1a) Adjazenzmatrix 0 0 0 1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 1 0 0 0 ● ● ● ● ● ● ● ● ● ● ● ● 1⎤⎥ 1⎥⎥ 1⎥⎥ ⎥ 0⎥⎥ 0⎥⎥ 0⎥⎦ (6.1b) Erste Repräsentation (6.1c) Zweite Repräsentation Abbildung 6.1: Zwei Repräsentationen eines (nichtplanaren) Graphen N ● W ● M ● ● S rep-np-g ● ● ● ● ● ● ● ● O ● Abbildung 6.2: Graph H 1 1 ● 2 ● 2 ● 3 (6.3a) ● ● 1 2 ● 3 ● ● ● 3 ● ● 1 ● 3 2 2 ● 1 1 ● 3 ● 2 ● 3 (6.3b) ● 3 ● ● 3 graph-h 1 ● ● ● 1 ● ● 2 ● 3 2 3 ● 1 1 ● 2 ● 3 ● 2 (6.3c) ● ● ● 2 1 ● 2 ● ● 3 1 ● ● 2 3 ● ● 1 Abbildung 6.3: 3-Färbungen von H Farbe 2 entfällt aus demselben Grund. Farbe 3 - hier haben die vertikalen Nachbarn von M die Farben 2, 1 (Bild (6.4b), was für die horizontalen Nachbarn keine Farbe übrigläßt. Konstruktion von Graphen G∗ Gegeben ist ein Graph G, repräsentiert durch Punkte und Linien in der Ebene. Auf jeder Kante (u, v), die durch andere Kanten geschnitten wird (Bild 6.5a) füge neue Knoten hinzu, von u aus hinter jedem Schnittpunkt, wie in Bild 6.5b angedeutet; der letzte erhält das Label O. Für die Linien faerb-h 6.5. GEOMETRISCHE ALGORITHMEN UND REELLE RAM 1 ● ● ? ● ● (6.4a) ● 1 1 ● 2 ● ● ● 3 ● ● 2 ● ● ● ? ● ● ● (6.4b) 1 1 ● ● 161 3 ● ? ● ● 2 3 ● ● 1 2 ● ● ● ● 3 ? ● ● (6.4c) ● ● 3 2 ● ● ● 1 ● ● 2 ● ● ? Abbildung 6.4: Färbungsversuche des Graphen H graph-h-lemma von u′ nach v ′ , die (u, v) schneiden, wird jeweils ein Knoten mit dem Label S hinzugefügt, von u′ aus hinter dem Schnitt mit (u, v). ● v ● v ● v (6.5a) u ● u′ u′ ● O ● (6.5b) u ● ● ● S v ● ● ● ′ ● u′ ● O ● S ● v′ ● ● O ● S v′ ● (6.5c) u=W ● O ● =W ● O● O ● =W ● ● Abbildung 6.5: Konstruktion von G∗ Daraufhin werden die Überschneidungen durch eine Kette von Hilfsgraphen H, verbunden an den Knoten O bzw. W , ersetzt, wie in Bild 6.5c angedeutet. Konkretes Beispiel: für den Graphen in 6.1c) haben wir erst den folgenden Graphen konstr-gs 162 KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN ● u ● ● ● ● ● ● S v N ● W und dann den planaren Graphen G∗ ● ● ● u =O ● ● ● ● S ● ● ● ●N ● ● ● v ● ● ● W Eigenschaften von G∗ 1. G∗ ist planar. In der Tat, alle Schnittpunkte von Linien wurden durch Kopien von H überbrückt und es entstehen keine neuen. 2. Falls G∗ 3-färbbar ist, ist auch G 3-färbbar. Man benutzt dieselben Farben der Knoten wie in G∗ . Falls eine Linie (u, v) von G keinen Schnittpunkt in G aufweist, dann ist (u, v) auch eine Linie von G∗ und deswegen haben u, v verschiedene Farben. Andernfalls schneidet (u, v) andere Linien, was wie in Bild 6.5 durch H eliminiert wird. Dann hat u(= W ) dieselbe Farbe wie jeder OKnoten von 6.5b, siehe Lemma oben. Da v und der benachbarte O-Knoten von G∗ verschiedene Farben haben, sind auch die Farben von u und v verschieden. Ganz analog verfährt man mit Linien (u′ , v ′ ), die (u, v) schneiden: u′ hat dieselbe Farbe wie S, die sich von der Farbe von v ′ unterscheiden muß (dies gilt auch, wenn eine entlang der Knoten N und S verbundene Kette von Kopien von H entlang von (u′ , v ′ ) auftritt. 3. Falls G 3-färbbar ist, ist auch G∗ 3-färbbar. Wir färben in G∗ erst die alten“ ” Knoten von G mit den Farben 1, 2, 3. Danach werden für eine G-Kante (u, v) in 6.5b alle O-Knoten mit denselben Farben wie u gefärbt. Als letztes färben wir die Knoten des angeklebten Graphen H wie folgt. Die Farbe von 0 und W ist schon gegeben, zum Beispiel Farbe 1. Die anderen Farben hängen von der Färbung des Anfangsknotens u′ = N der Linie (u′ , v ′ ) ab, deren Überbrückung H präsentiert (Bild 6.6). 6.6. KOMPLEXITÄTSKLASSE N P u ● 1 ● 1● u′ ● ● ● 1 ● 1 ● 1 ● 3● ′ v (6.6a) 1 ● ● v 163 u ● 1 ● 2● u′ ● ● ● 2 ● 1 ● 1 ● 3● ′ v (6.6b) 1 ● ● v Abbildung 6.6: Färbung einer Kopie des Graphen H (a) Falls u′ Farbe 1 hat (siehe 6.6a), benutzen wir die Färbung von Bild 6.3a. (b) Falls u′ die Farbe 2 oder 3 hat, (siehe 6.6b), benutzen wir die Färbung von Bild 6.3b bzw. 6.3c. 4. Die Konstruktion von G∗ aus G dauert O(k 2 ) Schritte, wobei k die Zahl aller Kanten von G ist (falls G schon in der Ebene repräsentiert wird, was auch in polynomialer Zeit durchgeführt wird). In der Tat müssen wir für jede Kante höchstens k Schneidungen überbrücken, und das dauert (da eine Überbrückung in konstanter Zeit O(1) durchgeführt wird) O(k) Schritte pro Kante. 6.6 Komplexitätsklasse N P sect-classNP Probleme, die grundsätzlich schwieriger zu lösen sind als die der Klasse P, die sich aber trotzdem in polynomialer Zeit von einer nichtdeterministischen TM lösen lassen, formen die Komplexitätsklasse N P. Intuitiv kann man N P wie folgt erklären: falls ein Entscheidungsproblem die Eigenschaft hat, dass man in polynomialer Zeit überprüfen kann, ob eine angebotene“ Lösung wirklich die Aufgabe löst, gehört ” das Problem zu N P. Bevor wir N P formal definieren, zeigen wir diese intuitive Erklärung an einem Beispiel. bsp-zerlegbarkeit Beispiel 1 (ZERLEGBARKEIT). Wir sollen entscheiden, ob für eine Zahl n (Eingabe) eine Zerlegung in ein Produkt n = pq zweier kleinerer Zahlen existiert. Obwohl das ein Problem ist, dass in der Mathematik seit tausenden von Jahren behandelt wurde, gibt es keinen effizienten Algorithmus dafür. Wir wissen also nicht, ob ZERLEGBARKEIT zu P gehört. Aber dieses Problem gehört offensichtlich zu N P: falls uns jemand Zahlen p und q nennt, können wir effizient überprüfen, ob sie eine Lösung bilden, d.h., ob das Produkt pq der Eingabe gleicht. Das letzte kann mit einer nichtdeterministischen TM wie folgt gelöst werden: Band 1 ist das Eingabeband. Auf Band 2 wird nichtdeterministisch eine Zahl p geschrieben und auf Band 3 nichtdeterministisch eine Zahl q. Die NTM multipliziert p mit q und vergleicht pq mit Band 1: falls pq auf Band 1 steht, hält die NTM und akzeptiert, falls nicht, hält sie und akzeptiert nicht. Für jede Zahl n, die zerlegbar ist, gibt es eine Berechnung, die n in linearer Zeit akzeptiert. Definition. Wir sagen, dass eine nichtdeterministische Turingmaschine M die Zeitkomplexität p(n) hat, falls es für jede Eingabe der Länge n, die M akzeptiert, eine akzeptierende Berechnung gibt, die höchstens p(n) Berechnungsschritte benötigt. Mit N P bezeichnen wir die Klasse aller Sprachen (oder Entscheidungsprobleme), die von einer NTM mit polynomialer Zeitkomplexität akzeptiert (oder gelöst) werden können. Genauer: eine Sprache L gehört zu N P, falls es eine NTM und ein Polynom p(n) gibt, so dass die NTM die Zeitkomplexität p(n) hat und L akzeptiert. faerb-kop-h 164 bsp-np KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN Beispiel 2. 1. Jedes Problem der Klasse P gehört zu N P. 2. ZERLEGBARKEIT ist ein Problem der Klasse N P; es ist nicht bekannt, ob es zur Klasse P gehört. bsp-np-SAT bsp-np-TSP 3. ERFÜLLBARKEIT (siehe Beispiel 5 in 6.2) ist ein Problem der Klasse N P: für jede Boolesche Formel f (x1 , . . . , xn ) und jede potentielle Lösung“, d.h. ” jede (beliebig berechnete) Belegung aller Variablen x1 , . . . , xn , können wir effizient entscheiden, ob der Wert von f true oder false ist. Es ist einfach, eine NTM mit polynomialer Zeitkomplexität zu konstruieren, die das Problem ERFÜLLBARKEIT löst: Band 1 ist ein Eingabeband, auf dem ein Code der Formel f (x1 , . . . , xn ) gespeichert wird. Auf Band 2 erzeugt die NTM nichtdeterministisch n Werte 0 oder 1. Dann berechnet sie den Wert von f mit diesen n Variablenwerten (mit 1 = true und 0 = false). 4. TRAVELING SALESMAN PROBLEM (TSP) ist ein Problem der Klasse N P mit großer praktischer Relevanz. Die Eingabe ist eine Liste S1 , . . . , Sn von Städten und eine Matrix von Zahlen d(i, j) ≥ 0 für i, j = 1, . . . , n die die Distanz von Si zu Sj repräsentieren (oder die Kosten der Reise von Si nach Sj ). Die Aufgabe ist, zu entscheiden, ob alle Städte besucht werden können, ohne dass die gesamten Kosten eine gegebene Zahl k überschreiten. Das heißt: die Eingabe besteht aus Zahlen k und dij für i, j = 1, . . . , n. Die Lösung ist eine Rundfahrt, d.h. eine Permutation (i1 , i2 , . . . , in ) der Zahlen 1, . . . , n, so dass eq-tsp-def d(i1 , i2 ) + d(i2 , i3 ) + ⋅ ⋅ ⋅ + d(in−1 , in ) + d(in , i1 ) ≤ k. (∗) Auch für dieses Problem gibt es keinen effizienten Algorithmus. Aber das Problem gehört sicher zu N P: falls eine Permutation gegeben wird, benötigt die Überprüfung der Ungleichung (∗) nur lineare Zeit. Satz 1. Jede NTM mit der Zeitkomplexität p(n) kann von einer TM mit der Zeitkomplexität O(K p(n) ) wobei K eine Konstante ist simuliert werden. Beweis. Im Beweis des Satzes 1 in 3.3 haben wir eine Simulation einer nichtdeterministischen Turingmaschine M durch eine deterministische 3-Band Turingmaschine M gezeigt. Wir beweisen, dass M die Zeitkomplexität O(r2p(n) ) für eine Konstante r hat, falls M die Zeitkomplexität p(n) hat. Danach simulieren wir M mit einer (1-Band) TM, deren Komplexität O(n2 + (r2p(n) )2 ) ist, siehe Satz 1 in 6.4. Da (r2p(n) )2 = r4p(n) , setzen wir K = r4 : die Funktion n2 + r4p(n) gehört zu O(K p(n) ). Sei, wie im Beweis des Satzes 1 in 3.3, eine Numerierung der Übergänge (q, s) → (qi , si ) für i = 1, . . . , r gegeben. Für jede Eingabe der Länge n brauchen wir nur die ersten p(n) Berechnungsschritte der Maschine M zu simulieren. Die Maschine M erzeugt systematisch alle Listen aus Zahlen i1 i2 . . . ik mit k ≤ p(n) (und 1 ≤ is ≤ r für s = 1, . . . , k) auf Band 2 – die Anzahl dieser Listen ist r + r2 + r3 + ⋅ ⋅ ⋅ + rp(n) ∈ O(rp(n) ). Für jede Liste wird M (in k ≤ p(n) Schritten) simuliert, also dauert die ganze Simulation einer Eingabe höchstens O(p(n)rp(n) ) Schritte. Es gilt p(n)rp(n) ∈ O(r2p(n) ). 6.7. N P-VOLLSTÄNDIGKEIT 165 Korollar 1. Jedes Problem der Klasse N P kann von einem Algorithmus mit exponentieller Zeitkomplexität K p(n) K – Konstante, p(n) – Polynom gelöst werden. 6.7 N P-Vollständigkeit Wir haben oben erwähnt, dass kein effizienter Algorithmus für Probleme wie ZERLEGBARKEIT oder TSP bekannt ist. Mit anderen Worten ist es nicht bekannt, ob diese Probleme in der Klasse P liegen. Eigentlich ist auch die folgende allgemeine Frage bisher unbeantwortet: Offenes Problem: Gilt P = N P? Trotz intensiver Bemühungen vieler Wissenschaftler und trotz vieler Nebenergebnisse zu diesem Thema ist die Antwort noch nicht bekannt. Es gibt aber Probleme, die in der Klasse N P eine besondere Stellung haben: wenn man für eines dieser Probleme feststellen würde, dass es zu P gehöre, so würde jedes Problem der Klasse N P zu P gehören – also wäre die Antwort auf die obige Frage positiv. Solche Probleme (zu denen z.B. TSP gehört) heißen N P-vollständig. Erinnern wir uns an den Begriff der Reduktion in polynomialer Zeit (6.3): Definition. Eine Sprache L heißt N P-hart, falls es für jede Sprache L′ der Klasse N P eine Reduktion auf L in polynomialer Zeit gibt, oder kürzer: L′ ∈ N P Ô⇒ L′ ◁ L. Eine Sprache, die N P-hart ist und zu N P gehört, heißt N P-vollständig . Satz 1. Falls eine N P-harte Sprache in P liegt, gilt P = N P. Beweis. Sei L eine N P-harte Sprache in P. Für jede Sprache L′ in N P gibt es eine Reduktion auf L in polynomialer Zeit. Aus L ∈ P folgt also L′ ∈ P (Satz 1 in 6.3). Damit ist P = N P bewiesen. Satz 2 (Cookscher Satz.). ERFÜLLBARKEIT ist N P-vollständig. Beweis. 1. ERFÜLLBARKEIT ist ein Problem der Klasse NP: siehe Beispiel 2 Nr. 3 in Abschnitt 6.6. 2. Für jede Sprache L in N P zeigen wir, dass L auf ERFÜLLBARKEIT in polynomialer Zeit reduzierbar ist. Wir haben eine Turingmaschine M mit polynomialer Zeitkomplexität p(n), die L akzeptiert. Wir können für M , ohne Beschränkung der Allgemeinheit, das folgende annehmen: (a) Die Zustände von M sind wie folgt durchnumeriert: q0 (initial), q1 (final), q2 , . . . , qm . Der finale Zustand q1 ist ein Haltezustand. def (b) Die Bandsymbole von M sind s1 , . . . , sk und s0 = #. (c) Die Zellen des Bandes sind mit ganzen Zahlen durchnumeriert. Die Eingabe steht in den Zellen 1, . . . , n. 166 KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN Zelle Nr.: −2 −1 0 1 2 ... # # si1 si2 # n ... sin n+1 n+2 n+3 # # # ... ⇑ q0 Initialkonfiguration (d) Die Übergänge sind mit y = 1, 2, . . . , d durchnumeriert und wie folgt in eine Tabelle geschrieben: y Übergang Nr. y 1 (qi(1) , sj(1) ) → (qi′ (1) , sj ′ (1) ) 2 (qi(2) , sj(2) ) → (qi′ (2) , sj ′ (2) ) ⋮ ⋮ d (qi(d) , sj(d) ) → (qi′ (d) , sj ′ (d) ) Hier ist sj(y) ein Bandsymbol und sj ′ (y) ist entweder L, R oder ein Bandsymbol. Bemerkung 1. In der Zeit p(n) kann die TM höchstens p(n) Felder beschriften, also genügt es, die Bandzellen Nr. −p(n), −p(n) + 1, . . . , 0, 1, . . . , p(n) zu betrachten. Die Reduktion der Sprache L auf ERFÜLLBARKEIT bedeutet, dass für jedes Wort w über Σ eine Boolesche Formel φw konstruiert wird, so dass φw ist erfüllbar ⇐⇒ w ∈ L und dass die Konstruktion in polynomialer Zeit durchgeführt wird. Die Aussage w ∈ L bedeutet, dass es eine Berechnung des Wortes w durch M gibt, die im Zustand q1 hält. Eine solche Berechnung können wir durch eine Formel φw eindeutig beschreiben, wenn wir die folgenden Booleschen Variablen einführen: NAME BEDEUTUNG: ist true belegt genau dann, wenn UMFANG qit Zur Zeit t hat M den Zustand qi . t = 0, . . . , p(n) i = 0, . . . , m krt Zur Zeit t steht der Kopf im Feld r t = 0, . . . , p(n) r = −p(n), . . . , p(n) stj,r Zur Zeit t steht im Feld r das Symbol sj t = 0, . . . , p(n) j = 0, . . . , k r = −p(n), . . . , p(n) uty Zur Zeit t wird der Übergang Nr. y durchgeführt t = 0, . . . , p(n) − 1 y = 1, . . . , d Mit Hilfe dieser Variablen können wir alle Bedingungen einer akzeptierenden Berechnung von w formal darstellen: (a) Initialisierung. Zur Zeit t = 0 ist die folgende Belegung true: q00 k10 s0i1 ,1 , . . . , s0in ,n s00,b (Initialzustand q0) (initiale Kopfposition 1) (die gegebene Eingabe w = si1 . . . sin in Feldern 1, . . . , n) für alle b = −p(n), . . . , p(n) außer b = 1, . . . , n (das Symbol s0 = # in allen Zellen des Bandes außer der Eingabe) 6.7. N P-VOLLSTÄNDIGKEIT 167 Jede von diesen Variablen formt eine Klausel von φw , also ist der Anfang von φw : eq-phiw1 (1) n p(n) b=1 b=−p(n) b≠1,...,n φw = q00 ∧ k10 ∧ ⋀ s0ib ,b ∧ ⋀ s00,b ∧ . . . (b) Akzeptanz von w. Eine weitere Klausel von φw gewährleistet, dass w zum Zeitpunkt t = 1, . . . , p(n) akzeptiert wird, d.h., der Zustand ist q1 (finaler Haltezustand). Das ist die Klausel eq-phiw2 p(n) q11 ∨ q12 ∨ ⋅ ⋅ ⋅ ∨ q1 (2) (die genau dann true ist, wenn q1t für einen Zeitpunkt t true ist). (c) Randbedingungen. Wir müssen auch sicherstellen, dass zu jedem Zeitpunkt t die TM i. ii. iii. iv. genau einen Zustand hat, in jedem Feld genau ein Symbol steht, der Kopf genau eine Position hat und genau ein Übergang (falls es sich um keine Haltekonfiguration handelt) durchgeführt wird. Z.B. verlangt (i), dass φw für jeden Zeitpunkt t = 0, 1, . . . , p(n) die folgende Klausel hat: m eq-phiw3 (3) t t t t ⋁ qi = q0 ∨ q1 ∨ ⋅ ⋅ ⋅ ∨ qm i=0 (also: es gibt einen Zustand zum Zeitpunkt t), sowie die Klauseln eq-phiw4 (4) qit → ¬qit′ für alle i ≠ i′ (also: zwei Zustände qi und qi′ können nicht gleichzeitig vorhanden sein). Analoges gilt für (ii)–(iv). (d) Übergänge. Nehmen wir an, dass die Zeile y der Übergangstabelle die Bewegung des Kopfes nach links darstellt: ZEILE y: (qi(y) , sj(y) ) → (qi′ (y) , L) (Bewegung nach rechts oder Überschreibung des Bandsymbols werden analog behandelt). Dann müssen wir zu der Konjunktion von φw Klauseln hinzufügen, die gewährleisten, dass uty die erwartete Auswirkung zum Zeitpunkt t hat: Falls der Kopf im Feld r steht, wird er als nächstes im Feld r − 1 stehen: eq-phiw5 (5) t+1 (uty ∧ krt ) → kr−1 für alle r = −p(n) + 1, . . . , p(n). Der Zustand zum Zeitpunkt t muß qi(y) sein und der zum Zeitpunkt t + 1 muß qi′ (y) sein, also hat φw zwei Klauseln eq-phiw6 (6) t uty → qi(y) und uty → qit′ (y) Falls der Kopf im Feld r steht, muß das Symbol im Feld r gleich sj(y) sein: eq-phiw7 (7) (uty ∧ krt ) → stj(y),r für alle r = -p(n), . . . , p(n) 168 KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN Alle Bandsymbole bleiben unverändert: eq-phiw8 (8) (uty ∧ stj,r ) → st+1 j,r für alle j = 0, . . . , k und alle r = −p(n), . . . , p(n) − 1. Wenn alle Klauseln (5)–(8) zu φw hinzugefügt worden sind, wird der Übergang Nr. y korrekt ausgeführt. Damit ist die Konstruktion von φw vollständig. Es gilt: φw ist erfüllbar ⇐⇒ M akzeptiert die Eingabe w. In der Tat ergibt jede akzeptierende Berechnung von w eine Belegung der Variablen von φw für die alle Teile der Konjunktion true sind, also w = true: wir setzen qit = true, falls die Berechnung M zur Zeit t den Zustand qi hatte, analog mit krt und stj,r ; wir setzen uty = true, falls der Übergang Nr. y im Schritt t durchgeführt wurde. Umgekehrt beschreibt jede Belegung der Variablen von φw , für die alle Teile der Konjunktion von φw true sind, eine akzeptierende Berechnung von w. Wie viel Zeit benötigen wir, um φw zu konstruieren? Der Teil (1) braucht O(p(n)) Symbole (also O(p(n)) Zeiteinheiten), dasselbe gilt für den Teil (2). Es läßt sich leicht zeigen, dass die Randbedingungen nur O(p(n)2 ) Symbole benötigen. Der letzte Teil, der die d Übergänge repräsentiert, braucht O(p(n)) O(1) O(p(n)) O(p(n)) Symbole Symbole Symbole Symbole für für für für (5) (6) (7) und (8), und da d eine Konstante ist, brauchen wir für den letzten Teil O(p(n)) Symbole. Also reichen insgesamt O(p(n)2 ) Symbole. Es folgt, dass die Konstruktion von φw höchstens O(p(n)2 ) Schritte verlangt. Bemerkung 2. Die Idee, dass eine Sprache L genau dann zu N P gehört, wenn angebotene Lösungen in polynomialer Zeit überprüft werden können, läßt sich sich durch den Begriff Zertifikat formalisieren. Z.B. ist für 3-FÄRBUNG ein Zertifikat eines ungeordneten Graphen eine Färbung (korrekt oder nicht) seiner Knoten mit drei Farben. Wir formen die Sprache Lcheck aller Wörter wz, wobei w ein Code eines Graphen ist und z ein Code seines Zertifikates, das korrekt ist. Diese Sprache gehört der Klasse P an, denn für jeden Graphen und jede Färbung ist die Korrektheit effizient überprüfbar. Wichtig ist hier, dass die angebotenen Lösungen nicht komplizierter“ zu codieren sind als die Eingaben selbst. Genauer: für die Wörter ” wz (w – Eingabe, z - Zertifikat) nehmen wir an, dass die Länge ∣z∣ des Wortes z durch p(∣w∣), wobei p(n) ein Polynom ist, begrenzt werden kann: Definition. Für eine Sprache L ⊆ Σ∗ heißt eine Sprache Lcheck eine Zertifikatensprache, falls 1. Lcheck in P liegt und 2. es gibt ein Polynom p(n), so dass für jedes Wort w über Σ der Länge n gilt: w ∈ L ⇐⇒ wz ∈ Lcheck für irgendein Wort z der Länge ≤ p(n). 6.7. N P-VOLLSTÄNDIGKEIT 169 Satz 3. Eine Sprache gehört genau dann zur Klasse N P, wenn sie eine Zertifikatensprache hat. Beweis. 1. Gegeben eine Zertifikatensprache Lcheck ⊆ Γ∗ für L ⊆ Σ∗ *, wir beweisen, dass L ∈ N P. Sei M eine Turingmaschine mit polynomialer Zeitkomplexität q(n), die Lcheck akzeptiert. Dann haben wir die folgende nichtdeterministische Turingmaschine M ∗ , die L akzeptiert: Band 1 Eingabeband w1 w2 ... wn Band 2 Erzeugung von z z1 z2 ... zk Band 3 Simulation von M w1 w2 ... wn z1 für k ≤ p(n) z2 ... zk Auf Band 1 steht die Eigabe w der Länge n. Auf Band 2 wird nichtdeterministisch ein Wort z über der Länge k ≤ p(n) geschrieben. Dann werden w und danach z auf Band 3 kopiert, und die Maschine M wird simuliert; falls M hält und akzeptiert, hält auch M ∗ und akzeptiert. Es folgt also, dass M ∗ genau die Wörter w akzeptiert, für die es ein Wort z der Länge ≤ p(n) mit wz ∈ Lcheck gibt – also akzeptiert M ∗ die Sprache L. Die Erzeugung von z dauert 2k ∈ O(p(n)) Schritte und die Simulation von M dauert q(n+k) ∈ O(q(p(n))) Schritte, also hat M ∗ eine polynomiale Zeitkomplexität. 2. Für jede Sprache L ⊆ Σ∗ der Klasse N P konstruieren wir eine Zertifikatensprache. Wir haben eine nichtdeterministische Turingmaschine M mit polynomialer Zeitkomplexität p(n), die L akzeptiert. Für jedes Wort w ∈ L der Länge n gibt es eine Boolesche Formel φw der Länge O(p2 (n)), die die Berechnung von w vollständig beschreibt – siehe den obigen Beweis des Cookschen Satzes. Da φw eine Formel in KNF ist, ist sie ein Wort aus den Symbolen ∨, ∧, (, ), x0, x1, x10, . . . , xi (i ≤ p(n)2 ) wobei i binär dargestellt wird, also ein Wort über Γ = {∨, ∧, (, ), x, 0, 1}. Das Wort w hat die Länge O(p2 (n)). Genauer gibt es nur eine Konstante K, so dass für jedes Wort w ∈ L der Länge n die Berechnung von w durch eine Formel φw der Länge ≤ Kp2 (n) repräsentiert wird. Nehmen wir der Einfachheit halber an, dass Γ ∩ Σ = ∅. Dann ist die folgende Sprache Lcheck über Σ ∪ Γ eine Zertifikatensprache für L: Lcheck besteht aus allen Wörtern wφ, wobei w ein Wort über Σ (der Länge n) ist und φ eine Boolesche Formel der Länge ≤ Kp2 (n), die eine akzeptierende Berechnung von w beschreibt, ist. (a) Lcheck gehört zu P. In der Tat, für jedes Wort u der Länge m über Σ ∪ Γ überprüfen wir, i. ob u = wφ für w ∈ Σ∗ und φ ∈ Γ∗ , wobei w die Länge n und φ die Länge ≤ Kp2 (n) hat und ii. falls ja, ob φ = φw die Formel aus dem Beweis des Cookschen Satzes ist. 170 KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN Das kann in linearer Zeit O(m) überprüft werden. (b) w ∈ L ⇐⇒ es gibt ein Wort wφ ∈ Lcheck , so dass φ die Länge ≤ Kp2 (n) hat, wobei n die Länge von w ist. Das folgt aus der Konstruktion von Lcheck. 6.8 Weitere N P-vollständige Probleme Satz 1. Sei L eine N P-vollständige Sprache. Dann ist jede Sprache in N P, auf die L in polynomialer Zeit reduziert werden kann, auch N P-vollständig. Beweis. Sei L0 ⊆ Γ∗ eine Sprache der Klasse N P, und sei f ∶ Σ∗ → Γ∗ eine Reduktion von L ⊆ Σ∗ auf L0 in polynomialer Zeit. Wir beweisen, dass L0 N Pvollständig ist. Für jede Sprache L′ ⊆ (Σ′ )∗ der Klasse N P gibt es eine Reduktion g ∶ (Σ′ )∗ → Σ∗ von L′ nach L in polynomialer Zeit. Es genügt zu zeigen, dass die zusammengesetzte Abbildung f (g(x)) von (Σ′ )∗ nach Γ∗ eine Reduktion in polynomialer Zeit von L′ nach L0 ist. Damit ist die N P-Vollständigkeit von L0 bewiesen. Für jedes Wort x über Σ gilt x ∈ L′ ⇐⇒ g(x) ∈ L ⇐⇒ f (g(x)) ∈ L0 , also müssen wir nur zeigen, dass f (g(x)) eine Funktion der Klasse FP ist. Sei M eine TM, die f berechnet und die polynomiale Zeitkomplexität p(n) hat, und sei M eine TM, die g berechnet und die polynomiale Zeitkomplexität q(n) hat. Dann haben wir eine 2-Band Maschine M ∗ , die auf Band 1 die Maschine M simuliert (in q(n) Schritten) und das Ergebnis auf Band 2 kopiert, wo sie die Maschine M simuliert (in p(q(n)) Schritten). Das Ergebnis von M ∗ auf Band 2 ist das Wort f (g(x)), das in O(p(q(n))) Schritten berechnet wurde. Beispiel 1 (3-ERFÜLLBARKEIT). Wir wissen, dass 2-ERFÜLLBARKEIT zu P gehört. Trotzdem ist 3-ERFÜLLBARKEIT, d.h., das Problem der Erfüllbarkeit für Formeln, die in KNF höchstens drei Literale je Klausel enthalten, NP-vollständig: 1. 3-ERFÜLLBARKEIT gehört zu N P – klar. 2. Für ERFÜLLBARKEIT existiert eine Reduktion in polynomialer Zeit auf 3-ERFÜLLBARKEIT: In der Tat kann jede Klausel aus vier Literalen a1 ∨ a2 ∨ a3 ∨ a4 mit zwei Klauseln aus je drei Literalen (a1 ∨ a2 ∨ b) ∧ (¬b ∨ a3 ∨ a4 ) ersetzt werden. Es ist klar, dass a1 ∨ a2 ∨ a3 ∨ a4 genau dann erfüllt ist, wenn die letzte Formel mit b = true oder b = false erfüllt. Analog wird a1 ∨ a2 ∨ a3 ∨ a4 ∨ a5 mit drei Klauseln ersetzt: (a1 ∨ a2 ∨ b) ∧ (¬b ∨ a3 ∨ c) ∧ (¬c ∨ a4 ∨ a5 ) usw. Diese Übersetzung dauert lineare Zeit O(n), denn für jede Klausel der Länge n benötigen wir n − 2 Klauseln der Länge 3. 6.8. WEITERE N P-VOLLSTÄNDIGE PROBLEME 171 Beispiel 2 (3-FÄRBUNG.). Dies ist das Problem, ob ein gegebener Graph mit drei Farben gefärbt werden kann. Während 2-FÄRBUNG zu P gehört (Beispiel 3 in 6.1), zeigen wir jetzt, dass 3-FÄRBUNG N P-vollständig ist. Also gilt auch hier: falls jemand einen effizienten Algorithmus für 3-FÄRBUNG findet, beweist er P = N P! 1. 3-FÄRBUNG ist in N P. Falls eine 3-Färbung der Knoten vorgeschlagen wird, können wir in linearer Zeit entscheiden, ob sie korrekt ist. 2. 3-ERFÜLLBARKEIT läßt sich in polynomialer Zeit auf 3-FÄRBUNG reduzieren. Um den zweiten Teil zu beweisen, benutzen wir den folgenden Hilfsgraphen b ● c ● ● ● a ● ● ● ● ● d Hilfsgraph Wenn seine Knoten mit drei Farben, z.B. weiß, schwarz, blau gefärbt werden gilt: eq-d-schwarz (1) Falls a, b und c schwarz sind, muß d auch schwarz sein. (Das ist leicht zu überprüfen, denn falls b und c schwarz sind, ist keiner der beiden Knoten direkt unter b und c schwarz und die Spitze des rechten Dreiecks muß also schwarz sein. Dasselbe gilt dann für das linke Dreieck.) eq-d-weiss (2) Falls a oder b oder c weiß ist, darf d weiß sein. Genauer: färben wir a, b, c so mit den drei Farben, so dass mindestens einmal weiß benutzt wird, dann läßt sich der ganze Hilfsgraph so färben, dass d weiß wird. (Das ist auch leicht zu überprüfen). Wir konstruieren jetzt für jede Boolesche Formel φ mit Klauseln aus drei Literalen einen Graphen Gφ , so dass φ ist erfüllbar ⇐⇒ Gφ ist 3-färbbar. Der Graph Gφ hat drei verschiedene Typen von Knoten. Typ 1 sind drei Knoten, die mit den drei Farben markiert werden und ein Dreieck formen: S ● ●B ● W 172 KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN Typ 2: für jede Variable x der Formel φ wird ein extra Dreieck an den Knoten B angehängt. Die beiden freien Knoten dieses Dreiecks werden mit x und ¬x markiert. Z.B. erhalten wir, falls φ nur die Variablen x, y, z hat, den folgenden Graphen: x ● y ● z ¬z ● ● S ● ¬x ● ¬y ● ●B ● W Typ 3: für jede Klausel α ∨ β ∨ γ der Formel φ nehmen wir den obigen Hilfsgraphen: β ● γ ● ● ● α ● ● ● ● ● W und die vier Knoten, die mit α, β, γ, W markiert sind, werden mit den gerade markierten Knoten des Typs 2 identifiziert. Beispiel: für φ = y ∨ ¬x ∨ ¬z (1 Klausel) erhalten wir den Graphen ¬x ● x ● y ● ¬z ● z ● S ● ● ●B ● ● W Wir beweisen zuerst: φ erfüllbar Ô⇒ Gφ ist 3-färbbar. ¬y ● ● ● ● 6.8. WEITERE N P-VOLLSTÄNDIGE PROBLEME 173 Für die gegebene Belegung der Variablen mit φ = true färben wir wie folgt: 1. S, B und W wie angedeutet (schwarz, blau, weiß), 2. Knoten des Typs 2 sind weiß, falls ihr Wert true ist, und schwarz, falls der Wert false ist, 3. in jedem der Hilfsgraphen ist mindestens einer der Knoten a, b, c weiß gefärbt, deshalb können wir eine Färbung finden, die auch d weiß färbt finden, siehe (2) oben. Umgekehrt beweisen wir: Gφ 3-färbbar Ô⇒ φ erfüllbar. Wir können, ohne Beschränkung der Allgemeinheit, annehmen, dass die gegebene Färbung die Knoten des Typs 1 wie angedeutet färbt. Wir setzen dann x = true ⇐⇒ der x-Knoten des Typs 2 ist weiß. Wir beweisen, dass φ = true, d.h., dass in jeder Klausel α ∨ β ∨ γ von φ eines der Literale α, β, γ true ist. Da kein Knoten des Typs 2 blau gefärbt werden kann (wegen der Kante zu B), sind sie schwarz oder weiß. Aufgrund der Eigenschaft (1) des Hilfsgraphen können nicht α, β, γ gleichzeitig schwarz sein – also ist α, β oder γ true. Es ist klar, dass für eine Formel φ der Größe n = Anzahl aller Variablen + Anzahl aller Klauseln die Konstruktion des Graphen Gφ in linearer Zeit O(n) durchführbar ist. Beispiel 3. k-FÄRBUNG ist NP-vollständig für jedes k ≥ 3. Wir können z.B. 3FÄRBUNG auf 4-FÄRBUNG in polynomialer Zeit wie folgt reduzieren: ein Graph G ist genau dann 3-färbbar, wenn der folgende Graph ● Neuer Knoten ● ● ● ● ● ● G 4-färbbar ist. Bemerkung 1. Ein Graph ist planar , falls er so in der Ebene gezeichnet werden kann, dass die Kanten sich nicht überkreuzen. Das k-Färbungsproblem für planare Graphen ist 1. trivial für k ≥ 4, denn jeder planare Graph ist 4-färbbar, aber trotzdem 2. N P-vollständig für k = 3 (vergl. Bemerkung 4 in Abschnitt 6.5). Wir erinnern daran, dass ein Hamiltonscher Kreis in einem ungerichteten Graphen ein Kreis ist, der jeden Knoten genau einmal besucht. Das Problem HAMILTONSCHER KREIS hat als Eingabe einen Graphen G und wir sollen entscheiden, ob G einen Hamiltonschen Kreis hat. 174 KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN Beispiel 4. (ohne Beweis) HAMILTONSCHER KREIS ist ein N P-vollständiges Problem. Beispiel 5. TSP ist N P-vollständig. Wir haben in Beispiel 2 Nr. 4 in Abschnitt 6.6 bemerkt, dass TSP zur Klasse N P gehört. Es ist also genug, eine Reduktion von HAMILTONSCHER KREIS auf TSP in polynomialer Zeit zu finden. Das ist trivial: für jeden Graphen G mit Knoten 1, . . . , n setzen wir ⎧ ⎪ ⎪1 dij = ⎨ ⎪ 2 ⎪ ⎩ falls (i, j) eine Kante ist sonst Dann hat dieses TSP genau dann eine Lösung mit Gesamtkosten n, wenn G einen Hamiltonschen Kreis hat. Schlußbemerkung: Für hunderte von Problemen (einschließlich praktisch sehr wichtiger wir z.B. TSP oder 3-FÄRBUNBG) ist heute bekannt, dass sie N P-vollständig sind. Das Problem ZERLEGBARKEIT (Beispiel 1) ist eines der wenigen Probleme, für die nicht bekannt ist, ob sie N P-vollständig sind. Es gilt aber, falls P ≠ N P, dass in N P Probleme existieren, die nicht N P-vollständig sind (ohne Beweis). 6.9 Komplexitätsklasse coN P Definition. Mit coN P bezeichnen wir die Klasse aller Sprachen L, für die gilt: die komplementäre Sprache liegt in N P: L ∈ coN P ⇐⇒ L ∈ N P Beispiel 1 (PRIMZAHL). Eingabe: Zahl n Ausgabe: JA genau dann, wenn n eine Primzahl ist. Dies ist also komplemaentär zu ZERLEGBARKEIT, deswegen PRIMZAHL ∈ coN P. Beispiel 2 (GÜLTIGKEIT). Eingabe: Boolsche Formal φ in KNF. Ausgabe: JA genau dann, wenn φ gültig ist, d.h. für jede Belegung der Variablen gilt φ = true. Dies ist ein Problem in coN P, denn eine Belegung mit φ = false ist ein Zertifikat für die komplementäre Sprache! Bemerkung 1. 1. P ⊆ coN P. In der Tat, bei einer deterministischen TM genügt es, die finalen und nichtfinalen Zustände zu vertauschen. 2. coN P ist unter Reduktion abgeschlossen: L0 ∈ coN P, L ◁ L0 Ô⇒ L ∈ coN P Es gilt nämlich L ◁ L0 : wir haben doch f ∶ Γ∗ → Σ∗ in FP, so dass w ∈ L ⇐⇒ f (w) ∈ L0 , und dies bedeutet w ∈ L ⇐⇒ f (w) ∈ L0 . 6.9. KOMPLEXITÄTSKLASSE CON P 175 Definition. Eine Sprache L0 heißt coN P-vollständig , falls sie in coN P liegt und L ∈ coN P Ô⇒ L ◁ L0 . Beispiel 3. GÜLTIGKEIT ist coN P-vollständig. in der Tat, gegeben L ∈ coN P, dann gibt es weil L ∈ N P, eine Reduktion in polynomialer Zeit von L auf ERFÜLLBARKEIT. Sei f diese Reduktion: jedem Wort w wird eine Formel f (w) zugeordnet mit w ∈ L ⇐⇒ f (w) erfüllbar. Eine Formel φ ist genau dann gültig, wenn ¬φ immer false, d.h. unerfüllbar ist. Sei jetzt g die folgende Funktion: g(w) = ¬f (w) Aus f ∈ FP folgt bestimmt g ∈ FP. Und w ∈ L ⇐⇒ w ∉ L ⇐⇒ f (w) nicht erfüllbar ⇐⇒ g(w) gültig Offenes Problem: Gilt N P = coN P ? Die Antwort ist ja, falls GÜLTIGKEIT in N P liegt: Satz 1. Falls N P ≠ coN P, endhält N P keine coN P-vollständige Sprache. Beweis. Sei L0 coN P-vollständig. Wir beweisen, dass L0 ∈ N P Ô⇒ L ∈ N P für alle L ∈ coN P d.h., falls L0 ∈ N P, gilt coN P ⊆ N P): Es gibt Reduktion f in polynomialer Zeit von L nach L0 (da L ∈ coN P). Gegeben eine NTM M , die L0 in polynomialer Zeit akzeptiert, die Kombination Band 1 f berechnet Band 2 M simuliert ergibt eine NTM, die L in polynomialer Zeit akzeptiert, also L ∈ N P. Und L0 ∈ N P Ô⇒ L ∈ coN P für alle L ∈ N P (d.h., N P ⊆ coN P): hier existiert eine Reduktion f von L auf L0 , und die obige NTM akzeptiert in polynomialer Zeit die Sprache L, das beweist L ∈ N P, also L ∈ coN P. Bemerkung 2. Für PRIMZAHL gilt auch PRIMZAHL ∈ N P, aber dies ist ein nichttriviales Ergebnis, dessen Beweis hier nicht durchgeführt wird. Die Klasse N P ∩ coN P aller Probleme, die effektives Zertifikat für Antwort JA sowie für Antwort NEIN habe, enthält also interssante Probleme. Wir wissen, dass sie P enthält. Offenes Problem Gilt P = N P ∩ coN P? 176 6.10 KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN Komplexität von Optimierungsproblemen sec:compopti Viele Probleme sind weder als Entscheidungsprobleme, noch als Berechnungsprobleme zu verstehen, sondern als Probleme, die für einen maximalen (oder minimalen) Wert eines Parameters eine Konstruktion verlangen. Solche Maximierungs- oder Minimierungsprobleme heißen Optimierungsprobleme. Beispiel 1 (MINIMALE FÄRBUNG). Eingabe: Ungerichteter Graph G Ausgabe: Eine Färbung von G mit minimaler Zahl von Farben. Gibt es eine effiziente Lösung dieses Problems? Bestimmt nicht (falls P ≠ N P), denn jeder Algorithmus für MINIMALE FÄRBUNG kann natürlich 3-FÄRBUNG lösen. Für jedes Minimierungsproblem M haben wir das zugrunde liegende Entscheidungsproblem, dessen Eingabe ein Paar (x, y) ist, wobei x die Eingabe von M und y eine Zahl ist. Die Entscheidung lautet: hat P eine Lösung der Eingabe x mit einem Parameter ≤ y? Es ist klar, dass ein Minimierungsproblem, das eine effiziente Lösung hat, die Eigenschaft hat, dass das zugrunde liegende Entscheidungsproblem zu P gehört. Analoges gilt für Maximierungsprobleme. Beispiel 2 (MAXIMALES MATCHING). Eingabe: Ungerichteter Graph G Ausgabe: Eine maximale Menge von Kanten, die voneinander disjunkt sind. Dies ist ein Optimierungsproblem mit vielen praktischen Anwendungen. Der Name stammt von der Anwendung, wobei eine Gruppe von Männern und Frauen die Knotenmenge von G formen und eine Kante einen Mann x mit einer Frau y genau dann verbindet, wenn sie ein potentielles Paar formen. Die Aufgabe ist dann, die größte Menge von aktuellen Paaren zu bilden, für die kein(e) Teilnehmer(in) mehrmals auftritt. Dieser Graph ist offensichtlich 2-färbbar; oft wird das MAXIMALE MATCHING Problem nur für 2-färbbare Graphen untersucht. Es gibt einen effizienten Algorithmus, der MAXIMALES MATCHING löst. Die Grundidee ist, dass jedes Matching M durch einen erweiternden Weg verbessert werden kann. Für das gegebene Matching M heißt eine Kante des Graphen G frei , falls sie nicht in M liegt, und ein Knoten heißt frei, falls er kein Endknoten einer Kante in M ist. Definition. Für ein Matching M im Graphen G heißt ein Weg in G erweiternd , falls seine Endknoten frei sind und seine Kanten abwechselnd frei und unfrei sind. Beispiel 3. Im Graphen G hat das Matching M : x1 ● ● y1 x2 ● ● y2 x3 ● ● y3 x4 ● ● y4 x5 ● ● y5 6.10. KOMPLEXITÄT VON OPTIMIERUNGSPROBLEMEN x1 ● ● y1 x2 ● ● y2 x3 ● ● y3 x4 ● ● y4 x5 ● ● y5 177 den folgenden erweiternden Weg: x4 , y1 , x1 , y2 , x2 , y3 , x3 , y4 . erw-weg-matching Satz 1. Falls ein Matching M einen erweiternden Weg W hat, gibt es ein größeres Matching M ′ , das aus M dadurch ensteht, dass die freien und unfreien Kanten von W ausgetauscht werden. Beweis. M ′ ist ein Matching, denn für die inneren Knoten x des Weges W gibt es genau eine Kante in M , auf der x liegt, und die wird in M ′ mit genau einer Kante von W ausgetauscht. Für die beiden Endknoten von W (die in M frei sind) gibt es auch genau eine Kante in M ′ . Da beide Endknoten des Weges W frei sind, hat W mehr freie als unfreie Kanten, also hat M ′ mehr Kanten als M . Im obigen Beispiel erhalten wir das Matching x1 ● ● y1 x2 ● ● y2 x3 ● ● y3 x4 ● ● y4 x5 ● ● y5 Dieses Matching hat immer noch erweiternden Wege, etwa x5 , y2 , x1 , y5 , oder auch x5 , y3 , x2 , y2 , x1 , y5 . Diese liefern die neuen Matchings x1 ● ● y1 x1 ● ● y1 x2 ● ● y2 x2 ● ● y2 x3 ● ● y3 x3 ● ● y3 x4 ● ● y4 x4 ● ● y4 x5 ● ● y5 x5 ● ● y5 bzw. für die es keine erweiternden Wege mehr gibt – deshalb sind sie maximal: 178 matching-max KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN Satz 2. Jedes Matching, für das es keinen erweiternden Weg gibt, ist maximal. Beweis. Mit anderen Worten sollen wir für jedes Matching M zeigen, dass, falls es ein größeres Matching M ∗ gibt, M einen erweiternden Weg hat. Sei G der Graph, dessen Knoten die Knoten von G sind und dessen Kanten alle Kanten in (M − M ∗ ) ∪ (M ∗ − M ) sind, d.h. alle Kanten, die in genau einem der Matchings M und M ∗ liegen. Jeder Knoten von G liegt auf höchstens zwei Kanten. Das bedeutet, dass G eine disjunkte Vereinigung von Zyklen und (maximalen) Wegen ist. Da sich in jedem Zyklus die Kanten von M und M ∗ abwechseln, gilt: in jedem Zyklus ist die Zahl von Kanten aus M gleich der Zahl der Kanten aus M ∗ . Andererseits hat G mehr Kanten aus M ∗ als aus M , da M ∗ mehr Elemente als M enthält. Es gibt also einen maximalen Weg W in G, auf dem mehr Kanten aus M ∗ als aus M liegen. Das bedeutet, dass beide Endkanten von W in M ∗ liegen. Da der Weg W maximal ist, sind seine Endknoten frei im Matching M . Also ist W ein erweiternder Weg für M. Algorithmus für MAXIMALES MATCHING Eingabe: Ungerichteter Graph G = (V, E) Ausgabe: Maximales Matching M ⊆ E 1: Initialisierung M ∶= ∅ 2: while ein erweiternder Weg W für M existiert do 3: M ∶= M ′ für M ′ aus Satz 1 4: od Korrektheit: folgt aus Satz 1 und 2. Am Ende des while-Zyklus (der aufgrund von Satz 1 konvergiert) hat M keinen erweiternden Weg und ist also maximal. Zeitkomplexität: hängt natürlich von der Zeitkomplexität des Suchen des erweiternden Weges in Zeile 2 ab. Es sind Algorithmen bekannt, die für Graphen mit n Knoten und k Kanten die Zeitkomplexität O(nk) haben. Dann hat der ganze Algorithmus oben Zeitkomplexität O(nk). bsp:maxflow Beispiel 4 (MAXFLOW). Das Problem MAXIMALES MATCHING ist ein Spezialfall des MAXFLOW Problems: gegeben seien ein gerichteter Graph G und zwei Knoten s (source) und t (target), wir suchen den maximalen Fluß Kanten-disjunkter Wege von s nach t. (Die Wege dürfen also gemeinsame Knoten haben, aber keine gemeinsamen Kanten.) Auch hier wird die Lösung mit Hilfe von erweiternden Wegen berechnet. Gegeben ein Fluß H mit Wegen von s nach t, eine Kante von G heißt frei , falls sie auf keinem Weg von H liegt. Ein erweiternder Weg für H ist eine Liste s = v0 , v1 , . . . , vn−1 , vn = t von Knoten von G, so dass für jedes i = 1, . . . , n gilt entweder ist (vi−1 , vi ) eine freie Kante von G, oder (vi , vi−1 ) ist eine unfreie Kante von G. Wir erweitern H, indem alle freien Kanten (vi−1 , vi ) unfrei werden und alle unfreien Kanten (vi , vi−1 ) frei werden. Beispiel: Sei G der Graph und H der mit dickeren Linien gekennzeichneter Fluß wie folgt: 6.10. KOMPLEXITÄT VON OPTIMIERUNGSPROBLEMEN x s● z ●? 0●G x y ●/ y′ ● ● .● 179 ′ ●.> t z′ Der folgende erweiternde Weg s, y, z ′ , z, x′ , x, y ′ , t führt zum folgenden Fluß: x s● z ●? /●F x y /● y′ !● ● /● ′ !.=● t z′ Auch für MAXFLOW gibt es einen Algorithmus, der aufrund erweiternder Wege in der Zeit O(nk) das Problem löst. Um das Konzept eines Optimierungsproblems zu formalisieren, nehmen wir an, dass die Eingabe sowie potentielle Lösungen in demselben Alphabet Σ codiert werden. Z.B. nehmen wir für MINIMALE FÄRBUNG an, dass die Eingabe G binär (z.B. als Adjazenzmatrix) codiert wird, also über Σ = {0, 1}. Jede Färbung mit k Farben 1, 2, . . . , k kann auch über Σ codiert werden, z.B. als das Wort 0i1 10i2 1 . . . 10in 1, wobei der Knoten 1 mit der Farbe i1 gefärbt wird, der Knoten 2 mit der Farbe i2 , usw. Wir haben eine Relation L auf der Menge Σ∗ aller Wörter, wobei vLw bedeutet, dass die Instanz v des Problems durch w gelöst wird. D.h., dass v einen Graphen G codiert, w eine Färbung codiert und diese Färbung für G korrekt ist. Schließlich haben wir einen Parameter c(v, w), den wir optimieren wollen, und der von der Eingabe v und der Lösung w abhängen kann. Wir betrachten also eine Funktion c∶L→N Für MINIMALE FÄRBUNG ist c(v, w) = Anzahl der in w verwendeten Farben. Allgemein: Definition. bei 1. Ein Optimierungsproblem ist ein 5-Tupel (Σ, E, A, L, c), wo- Σ ein Alphabet ist (in dem Eingaben und Lösungen codiert werden), E eine Sprache über Σ ist (aller möglichen Eingaben), A eine Sprache über Σ ist (aller möglichen Lösungen oder Ausgaben) 180 KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN L ⊆ E × A ist eine Relation auf der Menge Σ∗ (insbesondere folgt aus vLw sofort v ∈ E und w ∈ A) und c eine Funktion (Kostenfunktion) ist, die jedem Paar (v, w) ∈ L die Kosten c(v, w) ∈ N der Lösung w zur Eingabe v zuordnet. 2. Eine Turingmaschine löst das Minimierungsproblem (Maximierungsproblem) (Σ, E, A, L, c), falls sie für jede Eingabe v ∈ E mit einer Ausgabe w ∈ A hält, für die gilt (a) vLw und (b) c(v, w) ≤ c(v, w′ ) (c(v, w) ≥ c(v, w′ )) für alle w′ ∈ A mit vLw′ . Die Relation L kann auch mit ihrer charakteristischen Funktion χL ∶ E × A → {true, false} identifiziert werden. Beispiel: die TM, die den oberen Algorithmus für MAXIMALES MATCHING implementiert, ist eine Lösung des Problems. Wie erwähnt, hat diese TM eine polynomiale Zeitkomplexität. Deswegen gehört MAXIMALES MATCHING zur folgenden Klasse: Definition. Die Klasse PO besteht aus allen Optimierungsproblemen (das heißt, allen Minimierungs- und Maximierungsproblemen) (Σ, E, A, L, c), für die gilt: 1. E und A sind Sprachen der Klasse P (d.h., wir haben eine effiziente Prozedur, die entscheidet, ob ein Wort eine Ein- oder Ausgabe codiert) 2. es gibt ein Polynom p(x), so daß jedes Paar (u, v) ∈ L der Bedingung ∣v∣ ≤ p(∣u∣) genügt (d.h., zu einer Eingabe kann es nur “kurze” Lösungen geben); 3. χL ∶ E × A → {true, false} ist eine Funktion der Klasse FP 4. c ist eine Funktion der Klasse FP und 5. es gibt eine TM mit polynomialer Zeitkomplexität, die das Optimierungsproblem löst. Beispiel 5. MINMALE FÄRBUNG gehört nicht zu PO, falls P ≠ N P, denn 3FÄRBUNG ist ein N P-vollständiges Problem. Beispiel 6. MAXIMALES MATCHING gehört zu PO. In der Tat 1. gibt es Algorithmen, die in linearer Zeit entscheiden, ob ein binäres Wort einen Graphen oder ein Matching codiert 2. ist jedes Matching als Teilmenge der Kantenmenge linear in der Eingabegröße beschränkt 3. gibt es einen Algorithmus, der in linearer Zeit entscheidet, ob eine Menge von Knoten ein Matching ist 4. kann die Bewertung der Zahl c(w, v) aller Knoten des Matching v in linearer Zeit durchgeführt werden und 5. haben wir einen effizienten Algorithmus für die Lösung von MAXIMALES MATCHING oben gezeigt. q-entscheidungsproblem 6.11. APPROXIMATION VON OPTIMIERUNGSPROBLEMEN 181 Bemerkung 1. Für jedes Minimierungsproblem (Σ, E, A, L, c) definieren wir das zugrunde liegende Entscheidungsproblem: gegeben ein Paar (w, n) mit w ∈ E und n ∈ N, gibt es eine Lösung v ∈ A, so dass (∗) vLw und c(w, v) ≤ n? Für jedes Minimierungsproblem der Klasse PO gehört das zugrunde liegende Entscheidungsproblem zur Klasse P. In der Tat können wir für jede Eingabe (w, n) in polynomialer Zeit die entsprechende minimale Lösung v finden, berechnen wir in polynomialer Zeit den Wert c(w, v) und schließlich entscheiden wir in der Zeit O(log n), ob dieser Wert kleiner gleich n ist. Analog für Maximierungsprobleme: hier wird die Ungleichung von (∗) umgedreht. Umgekehrt gilt also: falls P ≠ N P, enthält PO kein Optimierungsproblem, dessen zugrunde liegendes Entscheidungsproblem N P-vollständig ist. Beispiel 7 (MINIMALES TSP). (siehe 6.6, Beispiel 2 Nr. 4) Eingabe: w = (di,j )i,j=1,...,n , wobei di,j ∈ N die Kosten des Weges von Stadt i zu Stadt j sind. Ausgabe: Permutation v = (i1 , i2 , . . . , in ), die die Kosten c(w, v) = di1 ,i2 + di2 ,i3 + ⋅ ⋅ ⋅ + din−1 ,in + din ,i1 minimiert. Diese Aufgabe gehört nicht zu PO, falls P ≠ N P, denn wir wissen, dass das zugrunde liegende Entscheidungsproblem N P-vollständig ist. 6.11 Approximation von Optimierungsproblemen Falls es für ein Optimierungsproblem keinen effizienten Algorithmus gibt, der die optimale Lösung findet, können wir versuchen, eine suboptimale Lösung effizient zu konstruieren. Beispiel 1. MINIMALE KNOTEN-ÜBERDECKUNG Eingabe: Ungerichteter Graph Ausgabe: Minimale Menge D an Knoten, so dass jede Kante einen Knoten aus D enthält. Es ist bekannt, dass das zugrunde liegende Entscheidungsproblem (ob eine Knotendeckung mit höchstens n Knoten existiert) N P-vollständig ist. Eine suboptimale Lösung kann wie folgt beschrieben werden: Algorithmus für KNOTEN-ÜBERDECKUNG Eingabe: Ungerichteter Graph G Ausgabe: Eine Knotenüberdeckung D 1: D ∶= ∅ 2: V ∶= die Menge aller Knoten von G 3: E ∶= die Menge aller Kanten von G 4: while E eine Kante (x, y) enthält do 5: D ∶= D ∪ {x, y} 182 6: 7: KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN E ∶= E − {v ∶ v eine Kante mit Endknoten x oder y} od Korrektheit: Wir konstruieren hier eine Menge D von Knoten mit der Eigenschaft, dass jede im Schritt 6 entfernte Kante einen Endknoten in D hat. Da am Ende alle Kanten entfernt worden sind, ist D eine Knotenüberdeckung. Zeitkomplexität ist linear, denn jede Kante des Graphen wird von dem Algorithmus nur einmal besucht. Beziehung zum Optimum: Bezeichnen wir für jeden Graphen G mit opt(G) die minimale Größe einer Knoten-Überdeckung und mit c(G) die Größe der Überdeckung, die unser Algorithmus konstruiert. Es gilt c(G) ≤ 2opt(G). In der Tat hat der Algorithmus die folgende Eigenschaft: D wird mittels paarweise disjunkter Kanten des Graphen G konstruiert. Jede Überdeckung D0 muß wenigsten einen Endknoten von jeder dieser Kanten enthalten, also muß D0 mindestens halbsoviele Elemente wie D haben. Definition. Sei (Σ, E, A, L, c) ein Optimierungsproblem. Ein ε-approximierender Algorithmus (ε ≥ 0 eine reelle Zahl) ist ein Algorithmus der Klasse P, der für jede Eingabe w ∈ E eine Ausgabe v ∈ A mit vLw berechnet, so dass der relative Fehler von c(w, v) im Vergleich zum optimalen Wert opt(w) kleiner gleich ε ist; d.h., es gilt ∥c(w, v) − opt(w)∥ ≤ ε. opt(w) Beispiel 2. Für MINIMALE KNOTEN-ÜBERDECKUNG haben wir einen 1approximierenden Algorithmus gefunden: es gilt c(w, v) ≤ 2opt(v), also ∥c(w, v) − opt(w)∥ ≤ 1. opt(w) Dieser Algorithmus ist nicht ε-approximierend für ε < 1, denn schon für den Graphen mit zwei Knoten und einer Kante gilt opt = 1, c(w, v) = 2. bsp-sit Beispiel 3 (SIT (Scheduling Independent Tasks)). Es sollen Aufgaben W1 , . . . , Wn mit gegebener zeitlicher Dauer t1 , . . . , tn durch k Maschinen bewältigt werden. Wir nehmen an, dass jede Maschine unabhängig von den anderen jede Aufgabe bearbeiten kann. Unsere Ziel ist es, einen Plan (schedule) zu erstellen, d.h. jeder Arbeit Wi (i = 1, . . . , n) eine Maschine S(i) = 1, . . . , k zuzuordnen, so dass der Zeitbedarf T zur Erledigung aller Aufgaben minimal ist. Die Laufzeit der Maschine m(= 1, . . . , k) beträgt ∑ ti , wobei über alle i mit S(i) = m summiert wird. Der Zeitbedarf ist somit T = max{ ∑ ti , . . . , ∑ ti }. S(i)=1 S(i)=k Da die Zahl k der Maschinen konstant ist, bezeichnen wir das Problem als SIT(k). Wir haben also: Eingabe von SIT(k): Zahlen t1 , . . . , tn . Ausgabe von SIT(k): eine Funktion S ∶ {1, . . . , n} → {1, . . . , k}, 6.11. APPROXIMATION VON OPTIMIERUNGSPROBLEMEN 183 für die die Zahl T = max{ ∑ ti , . . . , ∑ ti } S(i)=1 S(i)=k minimal ist. Ein 1/3-approximierender Algorithmus A für SIT(k) Der folgende Algorithmus erledigt erst die längsten Arbeiten und erst dann die kürzeren. Außerdem zieht er die am wenigsten benutzten Maschinen vor. Wir benutzen die Hilfsvariable Tm = die Zeit, die Maschine m bisher gearbeitet hat Eingabe: Zahlen t1 , . . . , tk Ausgabe: Funktion S ∶ {1, . . . , n} → {1, . . . , k} 1: sortiere die gegebenen Zeiten, so dass t1 ≥ t2 ≥ ⋅ ⋅ ⋅ ≥ tn 2: for m = 1 to k do 3: Tm ∶= 0 4: end for 5: for i = 1 to n do 6: m ∶= ein Index mit Tm = min{T1 , . . . , Tk } 7: S(i) ∶= m 8: Tm ∶= Tm + ti 9: end for Korrektheit: In der zweiten Schleife ab Zeile 5 wird jede Aufgabe Wi einer Maschine S(i) zugeordnet. Zeitkomplexität: Das Sortieren in Zeile 1 dauert O(n⋅log n) Zeiteinheiten, die Initialisierung in Zeilen 2–4 dauert O(1) Einheiten, jeder der n Durchläufe der Schleife ab Zeile 5 dauert O(1) Zeiteinheiten (insbesondere besitzt die Menge, deren Minimum in Zeile 6 zu bestimmen ist, immer k Elemente). Insgesamt wird der Zeitbedarf des Algorithmus durch das Sortieren in Zeile 1 dominiert und betragt O(n log n). Dies ist also ein Algorithmus der Klasse P. Approximierung: Dieser Algorithmus ist 1/3-approximierend. Anstatt dies hier zu beweisen, zeigen wir (für ein beliebig kleines ε > 0) einen ε-approximierenden Algorithmus für SIT(k). Beispiel 4 (Ein ε-approximierender Algorithmus für SIT(k)). Die Idee ist einfach: wir wählen eine geeignete“ Konstante und verteilen die ersten r (längsten) Aufga” ben optimal – z.B. suchen wir aus allen k r möglichen Zuordnungen die beste aus. Den Rest berechnen wir mit dem Algorithmus aus Beispiel 3. Wir werden zeigen, dass jede Wahl eq-sit1 (1) r> k−1 ε einen ε-approximierbaren Algorithmus ergibt. Für eine ausgewählte Konstante r beschreiben wir also den entsprechenden Algorithmus. Approximierender Algorithmus Ar für SIT(k): 1: sortiere t1 ≥ t2 ≥ ⋅ ⋅ ⋅ ≥ tn 2: finde für die Eingabe t1 , . . . , tr die optimale Planung Sopt ∶ {1, . . . , r} → {1, . . . , k} 3: for m = 1 to k do 184 KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN Tm ∶= ∑Sopt (i)=m ti end for for i = r + 1 to n do m ∶= ein Index mit Tm = min{T1 , . . . , Tk } S(i) ∶= m 9: Tm ∶= Tm + ti 10: end for 4: 5: 6: 7: 8: Korrektheit: klar Zeitkomplexität: Für jede Konstante r hat dieser Algorithmus dieselbe Zeitkomplexität O(n ⋅ log n) wie oben in Beispiel 3. Genauer: der Algorithmus braucht die Zeit O(n log n + k r+1 ). Für jede Konstante r ist dies einfach O(n log n). Wenn aber ε in (1) gegen Null geht, wächst r und die Zeitkomplexität steigt exponentiell. In der Tat kann die optimale Zuordnung in Zeile 2 wie folgt gefunden werden: wir durchsuchen alle k r möglichen Zurodnungen: für jede Zuordnung S berechnen wir in der Zeit O(k) die gesamte Bearbeitungszeit T (S), die die m Arbeiten unter der Planung S dauern, und dann finden wir in der Zeit O(k r ) das Minimum aller T (S). Schritt 2 dauert also O(k ⋅ k r ) Zeiteinheiten. O(k k/ε ) Zeiteinheiten und der Algorithmus hat also die Zeitkomplexität O(n ⋅ log n + k M +1 ). Approximierung: Wir beweisen, dass unser Algorithmus ε-approximierbar ist, falls (1) gilt: eq-sit2 (2) aus r ≥ T − Topt k folgt ≤ε ε Topt Beweis. T sei der Zeitbedarf der Zuordnung, die unser Algorithmus findet. Es muß mindestens eine Aufgabe Wi geben, die genau zur Zeit T beendet wird. Falls i ≤ r, ist Wi eine der optimal zugeordneten Aufgaben W1 , . . . , Wr – also stimmt der Zeitbedarf T (zufällig) mit dem (optimalen) Zeitbedarf für die ersten r Aufgaben überein und ist folglich selber optimal, T = Topt , was (2) beweist. Wir können also eq-sit3 i>r (3) annehmen. Also erfolgt die Zuordnung der Aufgabe Wi durch den obigen Algorithmus A. Die Aufgabe Wi beginnt zur Zeit T − ti . Daraus folgt, dass alle k Maschinen im Zeitraum [0, T − ti ) durchgängig beschäftigt sind. Falls es nämlich eine Maschine geben sollte, deren Tätigkeit zur Zeit T0 < T − ti aufhört, würde der Algorithmus A die Aufgabe Wi auf dieser Maschine zum Zeitpunkt T0 beginnen lassen (denn A bevorzugt die weniger beschäftigten Maschinen) und somit würde Wi nicht zur Zeit T enden. Die Gesamtarbeitszeit aller k Maschinen im Zeitraum [0, T − ti ), also einem Intervall der Länge T − ti , beträgt also k(T − ti ). Aber der Algorithmus A verplant nur Aufgaben Wj mit j < i in diesem Zeitraum (da Wi selbst erst zur Zeit T − ti anfängt). Im Intervall [0, T − ti ) werden also nur die Aufgaben W1 , . . . , Wi−1 bearbeitet. Die Gesamtarbeitszeit k(T − ti ) ist also höchstens so groß wie die Zeit t1 + ⋅ ⋅ ⋅ + ti−1 , die die Bearbeitung der Aufgaben W1 , . . . , Wi−1 verlangt: eq-sit4 (4) k(T − ti ) ≤ t1 + ⋅ ⋅ ⋅ + ti−1 . Es gilt also eq-sit5 (5) T≤ t1 + ⋅ ⋅ ⋅ + ti−1 + ti . k 6.11. APPROXIMATION VON OPTIMIERUNGSPROBLEMEN 185 Anderseits dauern alle n Aufgaben insgesamt t1 +⋅ ⋅ ⋅+tn Zeiteinheiten. Die optimale Zuordnung ergibt einen Zeitbedarf von Topt Zeiteinheiten, dabei sind die k Maschinen maximal kTopt Zeiteinheiten aktiv (falls alle die ganze Zeit beschäftigt sind). Daraus folgt eq-sit6 kTopt ≥ t1 + ⋅ ⋅ ⋅ + tn . (6) Dann gilt eq-sit7 Topt ≥ (7) t1 + ⋅ ⋅ ⋅ + tn t1 + ⋅ ⋅ ⋅ + ti−1 ≥ . k k Die Kombination von (5) und (7) ergibt T − Topt ≤ t1 + ⋅ ⋅ ⋅ + ti−1 t1 + ⋅ ⋅ ⋅ + ti−1 + ti − = ti k k Aus (2) wissen wir, dass ti ≤ tr (denn i > r), also eq-sit8 T − Topt ≤ tr . (8) Jetzt benutzen wir (6) nochmals: da t1 ≥ t2 ⋅ ⋅ ⋅ ≥ tn , gilt Topt ≥ t1 + ⋅ ⋅ ⋅ + tn t1 + ⋅ ⋅ ⋅ + tr r ⋅ tr ≥ ≥ k k k und kombiniert mit (8), bekommen wir eq-sit9 T − Topt tr k ≤ r⋅tr = . Topt r k (9) Da r ≥ k ε ist, folgt k r ≤ ε, also ist (9) die gewünschte Ungleichung. Satz 1. Für kein ε > 0 gibt es einen ε-approximierenden Algorithmus für TSP, falls P ≠ N P. Beweis. Wir wissen, dass HAMILTONSCHER KREIS ein N P-vollständiges Problem ist. Wir beweisen, dass wir einen Algorithmus A der Klasse P für HAMILTONSCHER KREIS finden können, falls ein ε-approximierender Algorithmus Aε für TSP gegeben ist – es folgt, dass P = N P. Ein ungerichteter Graph G als Eingabe wird von A wie folgt bearbeitet: Der Algorithmus Aε wird auf das TSP angewendet mit n Städten und ⎧ ⎪ falls (i, j) eine Kante von G ist ⎪1 di,j = ⎨ ⎪ 2 + ⌈εn⌉ falls nicht, ⎪ ⎩ wobei ⌈εn⌉ die kleinste ganze Zahl ≥ εn ist. Bezeichnen wir mit c die Kosten der Tour, die Aε findet. Der Algorithmus A liefert die Antwort JA genau dann, wenn c ≤ (1 + ε)n. Korrektheit des Algorithmus A: wir beweisen G hat einen Hamiltonschen Kreis ⇐⇒ c ≤ (1 + ε)n. In der Tat: 186 KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN 1. Jeder Hamiltonsche Kreis von G besteht aus n Kanten, also betragen die Kosten copt = n. Da Aε ε-approximierend ist, gilt also c−n ≤ε n und somit c ≤ (ε + 1)n. 2. Falls die gefundene Rundreise der Bedingung c ≤ (1 + ε)n genügt, zeigen wir, dass sie nur Kanten aus G enthält, also einen Hamiltonschen Kreis in G bildet. Dazu reicht es, c < 2 + ⌈εn⌉ + (n − 1) zu beweisen, denn jede Rundreise, die mindestens einmal die Kanten von G verläßt, kostet mindestens 2 + ⌈εn⌉ (= Kosten einer Kante außerhalb von G) plus n−1 (die untere Grenze der Kosten der anderen n − 1 Kanten). Wegen εn < ⌈εn⌉ + 1 folgt c ≤ (ε + 1)n < n + ⌈εn⌉ + 1 = 2 + ⌈εn⌉ + (n − 1). Zeitkomplexität des Algorithmus A: für den Algorithmus Aε existiert ein Polynom p(n), so dass Aε die Rundreise in der Zeit p(n) findet. Dann dauert die Bearbeitung des Graphen G höchstens O(n2 ) Schritte für die Konstruktion von TSP und dann p(n) Schritte für Aε , insgesamt also O(n2 + p(n)) Schritte. Das bedeutet, dass A in der Klasse P liegt – im Widerspruch zur N P-Vollständigkeit von HAMILTONSCHEM KREIS. Zusammenfassung: Für Optimierungsprobleme, für die wir keinen effizienten Algorithmus finden können, können wir versuchen, approximierbare Algorithmen zu finden. Es gibt Aufgaben, die sogar für jedes ε einen ε-approximierbaren Algorithmus besitzen, z.B. SIT(k). Leider gibt es aber wichtige Optimierungsaufgaben, die keinen ε-approximierbaren Algorithmus erlauben, z.B. TSP. 6.12 Raumkomplexität Bisher haben wir einen Algorithmus als effizient betrachtet, falls er wenig Zeit braucht. Ein anderer wichtiger Gesichtspunkt ist der Speicherbedarf eines Algorithmus. Wie die Zeitkomplexität ist auch die Raumkomplexität prinzipiell von der Implementation unabhängig, falls wir nur die Frage stellen, ob polynomial großer Speicher genügt. Deswegen können wir wieder Turingmaschinen als Berechnungsmodell verwenden. Wir sagen, dass eine TM die Raumkomplexität s(n) hat, wobei s(n) eine Funktion über der Menge N aller natürlichen Zahlen ist, falls für jede Eingabe w der Länge n die TM hält und der Kopf höchstens s(n) Bandfelder durchgegangen ist. Definition. Wir bezeichnen mit PSPACE die Klasse aller formalen Sprachen, die von einer TM mit polynomialer Raumkomplexität akzeptiert werden können. Genauer: eine Sprache L gehört zur Klasse PSPACE, falls es eine Turingmaschine M und ein Polynom p(n) gibt, so dass L = L(M ) und M hat die Raumkomplexität p(n). bem-pspace Bemerkung 1. 1. Die vorher eingeführten Klassen P und N P werden oft PT IME und N PT IME bezeichnet, um sie von PSPACE zu unterscheiden. 6.12. RAUMKOMPLEXITÄT bem-time-in-space 187 2. Es gilt PT IME ⊆ PSPACE denn in einem Schritt kann eine TM nur ein Bandfeld besuchen. Es folgt, dass Probleme wie 2-FÄRBUNG, 2-ERFÜLLBARKEIT usw. in PSPACE liegen. 3. Das Problem der UNIVERSALITÄT REGULÄRER AUSDRÜCKE (Beispiel 6 in 6.2) gehört nicht zur Klasse PSPACE. 4. Die Klasse N PSPACE“, die zu N PT IME analog wäre, brauchen wir nicht ” einzuführen: Satz 1 (Savitch-Satz). Jede nichtdeterministische Turingmaschine mit polynomialer Raumkomplexität kann durch eine (deterministische) Turingmaschine mit polynomialer Raumkomplexität simuliert werden. Beweis. Sei M eine NTM mit Raumkomplexität p(n) > n, dann konstruieren wir eine (deterministische) Turingmaschine M ∗ , mit der Raumkomplexität O(p2 (n)), die dieselbe Sprache akzeptiert. Wir können annehmen, dass M das Band löscht, bevor sie im finalen Zustand hält. Dann ist (qF , #) die einzige akzeptierende Konfiguration. Es gibt eine Konstante C, so dass die Berechnung eines Wortes der Länge n höchstens 2Cp(n) Konfigurationen durchläuft. In der Tat haben die Konfigurationen die Form (q, s1 . . . si . . . sp(n) ), wobei q ein Zustand ist, s1 . . . sp(n) ist der Inhalt des Bandes und i ist die Kopfposition. Falls die Maschine r Zustände und m Symbole in Σ ∪ {#} hat, ist die Zahl der Konfigurationen gleich r (für Zustände q) mal p(n) (für Kopfpositionen i) mal der Zahl mp(n) aller Wörter s1 . . . sp(n) über Σ ∪ {#}. Es gilt rp(n)mp(n) < rmp(n) mp(n) = rm2p(n) < 2Cp(n) für eine geeignete Konstante C. Es folgt, dass für jedes von M akzeptierte Wort s1 . . . sn sn eine akzeptierende Berechnung von höchstens 2Cp(n) Schritten existiert. In der Tat, nehmen wir die kürzeste akzeptierende Berechnung von s1 . . . sn , dann wird keine der 2C p(n) Konfigurationen wiederholt. Es gilt: M akzeptiert s1 . . . sn genau dann, wenn (q0 , s1 . . . sn ) ⊢∗ (qF , #). Und das können wir durch die Begrenzung 2Cp(n) der Zahl der Schritte wie folgt verschärfen: Für zwei Konfigurationen K und K ′ schreiben wir REACH(K, K ′ , i) = true 188 KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN falls in höchstens 2i Berechnungsschritten aus der Konfiguration K die Konfiguration K ′ erreicht werden kann. (Z.B. bedeutet REACH(K, K ′ , 0), dass die Konfiguration K ′ in höchstens einem Schritt aus Konfiguration K erreicht werden kann – d.h., entweder K = K ′ oder K ′ ist eine Folgekonfiguration von K.). Es gilt M akzeptiert s1 . . . sn genau dann, wenn REACH(K, K ′ , Cp(n)) = true für K = (q0 , s1 . . . sn ), K ′ = (qF , #) Es genügt also, einen Algorithmus zu finden, der die Antwort REACH(K, K ′ , i) mit polynomialer Raumkomplexität für alle Paare K, K ′ von Konfigurationen und alle Zahlen i = 0, . . . , Cp(n) berechnet. Die Idee ist, dass es für i = 0 nur die Überprüfung ist, ob K ′ eine der Folgekonfigurationen ist, die in O(1) Zeiteinheiten berechnet wird, und aus dem Fall REACH(−, −, i) können wir REACH(−, −, i + 1) wie folgt berechnen: Seien K, K ′ Konfigurationen, für die REACH(K, K ′ , i + 1) = true ist. Also gibt es eine Berechnung in 2i+1 = 2⋅2i Schritten; sei K die Konfiguration, die aus K in dieser Berechnung in 2i Schritten erreicht wird – dann gilt REACH(K, K, i) = true und REACH(K, K ′ , i) = true. Umgekehrt: falls es eine Konfiguration K gibt mit REACH(K, K, i) = true = REACH(K, K ′ , i), gilt bestimmt REACH(K, K ′ , i + 1). Die Antwort REACH(K, K ′ , i) kann für i = 0, . . . , Cp(n) also rekursiv durch den folgenden deterministischen Algorithmus berechnet werden: i = 0 ∶ Antwort true genau dann, wenn K = K ′ oder K ⊢ K ′ . i + 1 ∶ Antwort true genau dann, wenn es eine Konfiguration K gibt mit REACH(K, K, i) ∧ REACH(K, K ′ , i) = true. Für i = 0 muß dieser Algorithmus nur die zwei Konfigurationen K, K ′ (Wörter der Länge p(n) + 1) speichern, also ist der Raumbedarf O(p(n)). Für i + 1 müssen wir, für den rekursiven Ablauf, i speichern, und neben den Eingaben K und K ′ wird die lokale Variable K gespeichert. Dann wird REACH(K, K, i) überprüft. Falls die Antwort true ist, können wir denselben Raum (!) wieder benutzen, um REACH(K, K ′ , i) zu überprüfen. Da i ≤ Cp(n) und K, K ′ , K Wörter der Länge p(n) + 1 sind, wird in einem Schritt der Rekursion Raum O(p(n)) genügen. Die Rekursion hat Cp(n) Schritte, also brauchen wir insgesamt Raum O(Cp2 (n)). Korollar 1. N PT IME ⊆ PSPACE Beweis. In der Tat sagt uns der Savitch-Satz, dass PSPACE = N PSPACE. Und N PT IME ⊆ N PSPACE ist analog zur Bemerkung 1 Nr. 2 oben. Bemerkung 2. Die Klasse PSPACE enthält also alle Probleme, für die es (Zeit-) effizient entscheidbar ist, ob eine angebotene Lösung wirklich das Problem löst. Z. B. TSP, 3-FÄRBBARKEIT usw. Es ist nicht bekannt, ob N PT IME = PSPACE gilt. Wir zeigen jetzt ein interessantes Beispiel eines Prolems, für das nicht klar ist, ob es zu N PT IME gehört, da es keinen vernünftigen Begriff von angebotener Lösung“ ” gibt, das aber zu PSPACE gehört. Beispiel 1 (QUANTIFIZIERTE BOOLESCHE FORMELN). Eingabe: Eine quantifizierte Boolesche Formel φ ohne freie Variablen. Ausgabe: JA genau dann, wenn φ den Wert true hat. 6.12. RAUMKOMPLEXITÄT 189 Bisher sprachen wir nur über Boolesche Formeln ohne Quantoren (∀x), (∃x). Die quantifizierten Booleschen Formeln, QBF, in Variablen xi (i = 1, . . . , n) können wie folgt definiert werden: 1. Jede Variable xi ist eine QBF 2. Die Konstanten true und false sind QBF 3. Falls E1 , E2 zwei QBF sind, sind auch E1 ∨ E2 , E1 ∧ E2 , E1 → E2 und ¬E2 QBF’n. 4. Falls E eine QBF ist, sind auch (∀x)E und (∃x)E (für jede Variable x) QBF’n. Das heißt: die Menge aller QBF ist die kleinste Menge, für die 1 – 4 gilt. Beispiel: E = (∀x)(∃y)(x → ((∀x)(¬y ∨ x))). Dies ist eine geschlossene QBF, dass heißt, alle Variablen werden quantifiziert (der innere Quantor (∀x) wirkt über die Formel (¬y ∨ x), der äußere über (∃y)(x → ((∀x)(¬y ∨ x))) ). Jede geschlossene Formel hat einen Wert, den wir bekommen, indem wir für jede quantifizierte Variable die Belegung mit true oder false betrachten. Zum Beispiel in E müssen wir, aufgrund des äußeren (∀x), die zwei Formeln E1 = (∃y)(true → ((∀x)(¬y ∨ x))) und E2 = (∃y)(false → ((∀x)(¬y ∨ x))) bewerten: falls beide Werte true sind, ist E true (sonst false). Also W ERT (E) = W ERT (E1) ∧ W ERT (E2) Um den Wert von E1 zu bewerten, müssen wir die Werte von E11 = true → ((∀x)(¬true ∨ x)) und E12 = true → ((∀x)(¬false ∨ x)) kennen: falls einer der Werte true ist, ist E1 true (sonst false), also W ERT (E1 ) = W ERT (E11 ) ∨ W ERT (E12 ). Der Wert von E11 ist false: betrachten wir die Belegung x = true. Aber der Wert von E12 ist true, da ¬false ∨ x = true ∨ x den Wert true hat für x = false, true. Also W ERT (E1 ) = false ∨ true = true. Analog kann man zeigen, dass W ERT (E2 ) = true, also W ERT (E) = true. 190 KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN Im allgemeinen definieren wir die Menge V ar(E) aller freien Variablen einer QBF wie folgt: V ar(xi ) = {xi } V ar(true) = V ar(false) = ∅ V ar(E1 ∨ E2 ) = V ar(E1 ) ∪ V ar(E2 ), analog mit ∧, → V ar(¬E) = V ar(E) V ar((∀x)E) = V ar((∃x)E) = V ar(E) − {x} Eine QBF heißt geschlossen, falls sie keine freien Variablen hat, falls also V ar(E) = ∅. Den Wert W ERT (E) einer geschlossenen QBF definieren wir wie folgt: W ERT (true) = true W ERT (false) = false W ERT (E1 ∨ E2 ) = W ERT (E1 ) ∨ W ERT (E2), analog mit ∧, → W ERT (¬E) = ¬W ERT (E) W ERT ((∀x)E) = W ERT (E(true/x)) ∧ W ERT (E(false/x)) W ERT ((∃x)E) = W ERT (E(true/x)) ∨ W ERT (E(false/x)) Hier ist E(true/x) die QBF, die wir aus E bekommen, indem alle freien Vorkommen der Variablen x durch true ersetzt werden, analog E(false/x). Bemerkung 3. Das Problem QBF gehört zur Klasse PSPACE. In der Tat existiert ein Algorithmus mit Raumkomplexität O(n2 ), wobei n die Länge des Wortes E ist, der entscheidet, ob E true ist. Hier bezeichnet E eine geschlossene Boolesche Formel. Den Wert W ERT (E) = true oder false berechnen wir rekursiv wie folgt falls E = true, ist W ERT (E) = true falls E = false, ist W ERT (E) = false falls E = ∀xi (E ′ ) oder E = ∃xi (E ′ ), berechnen wir erst (rekursiv) den Wert von E(true/xi ) Dann speichern wir das Ergebnis (in 1 Bit) und auf demselben Raum (!) berechnen wir E(false/xi ), speichern das Ergebnis (wieder 1 Bit) und entscheiden, ohne zusätzlichen Raum, den Wert von E aufgrund dieser zwei Werte. Algorithmus für QBF Eingabe: E, eine QBF ohne freie Variablen. Ausgabe: der Wert von E, W ERT (E), rekursiv berechnet: W ERT (true) ∶= true; W ERT (false) ∶= false; W ERT (∀xi (E)) ∶= W ERT (E(true/xi )) ∧ W ERT (E(false/xi )); W ERT (∃xi (E)) ∶= W ERT (E(true/xi )) ∨ W ERT (E(false/xi )); 6.12. RAUMKOMPLEXITÄT 191 Korrektheit: Jede QBF kann in die Form mit Quantoren nach außen gebracht werden. Falls die Formel in dieser Form keine freien Variablen besitzt, muß sie eine der 4 Typen oben sein. Die Rekursion erfolgt nach der Zahl k aller Quantoren von E. Für k = 0 ist E = true oder E = false, falls k > 0 ist, gilt E = ∀xi (E) oder E = ∃xi (E), wobei für E die Zahl aller Quantoren k − 1 ist. Nach k Rekursionsschritten wird also W ERT (E) berechnet sein. Raumkomplexität: Sei E eine QBF der Länge n. Die Zahl k aller Quantoren in E erfüllt k < n. Die Rekursion hat also Tiefe n und in jedem rekursiven Schritt brauchen wir, wie oben erklärt wurde, nur Raum um 2 Bit größer als der Raum des nächsten Schrittes. Das Wort E hat Länge n, also haben die in der Rekursion gespeicherten Wörter Länge O(n), was mit n rekursiven Schritten Raum O(n2 ) verlangt. Offenes Problem: Liegt QBF in N PT IME? In der Tat scheint dies unwahrscheinlich, denn QBF ist PSPACE-vollständig , das heißt für jedes Problem der Klasse PSPACE gibt es eine Reduktion auf QBF in polynomialer Zeit (!). Falls also QBF ∈ N PT IME ist, folgt N PT IME = PSPACE.