Modul Berechenbarkeit und Komplexität Bachelor Informatik 2. Semester Inhaltsverzeichnis 1 Modulbeschreibung 3 2 Gegenstand der Theoretischen Informatik 3 3 Berechenbarkeit 5 3.1 Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 3.2 Turingmaschinen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3.3 Varianten von Turingmaschinen . . . . . . . . . . . . . . . . . . . . . . 10 3.4 Registermaschinen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.5 Die These von Church . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3.6 Entscheidbarkeit und Aufzählbarkeit . . . . . . . . . . . . . . . . . . . 16 3.7 Reduzierbarkeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.8 Standardnumerierungen (Gödelisierungen) von Programmen, Funktionen und aufzählbaren Mengen . . . . . . . . . . . . . . . . . . . . . . . 18 Das Postsche Korrespondenzproblem . . . . . . . . . . . . . . . . . . . 20 3.10 Das Allgemeingültigkeitsproblem der Prädikatenlogik erster Stufe . . . 21 3.11 Aufzählbarkeits- und Iterationssatz . . . . . . . . . . . . . . . . . . . . 22 3.12 Fixpunktsatz von Kleene und Satz von Rice . . . . . . . . . . . . . . . 24 3.13 Algebraische Beschreibung der berechenbaren Funktionen . . . . . . . . 26 3.9 4 Effiziente Berechenbarkeit 29 4.1 Zeitaufwand von Programmen als Effizienzmaß . . . . . . . . . . . . . . 29 4.2 Polynomialzeit und Exponentialzeit . . . . . . . . . . . . . . . . . . . . 30 4.3 Polynomialzeit auf nichtdeterministischen Maschinen . . . . . . . . . . 31 4.4 Polynomiale Reduktion, NP-Vollständigkeit und P-NP-Problem . . . . 31 4.5 Das Erfüllbarkeitsproblem der Aussagenlogik . . . . . . . . . . . . . . . 33 4.6 Die NP-Vollständigkeit von SAT und 3SAT . . . . . . . . . . . . . . . . 34 4.7 Die NP-vollständigen Probleme One-in-Three 3SAT, Set Splitting und Graph 3-Colorability . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 1 4.8 Die Probleme Vertex Cover, Maximum Independent Set und Maximum Clique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 Die Kantenfärbungszahl . . . . . . . . . . . . . . . . . . . . . . . . . . 43 4.10 Das Problem 3-Dimensional Matching . . . . . . . . . . . . . . . . . . . 44 4.11 Die Probleme Partition und Bin Packing . . . . . . . . . . . . . . . . . 44 4.12 Approximative Lösung von Optimierungsproblemen . . . . . . . . . . . 45 4.13 Graphisomorphie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 4.9 5 Ausblick 46 2 1 Modulbeschreibung “Das Modul führt in die Grundlagen der Berechenbarkeit und effizienten Berechenbarkeit ein, zeigt Grenzen der Berechenbarkeit und vermittelt formale Werkzeuge zur Einordnung von Algorithmen und Problemen bezüglich ihrer Berechenbarkeit bzw. der Effizienz der Berechenbarkeit.” Im SS 2012 zu behandelnde Inhalte: 1. Motivation - Algorithmen und Programme 2. Maschinenmodelle: Turingmaschinen, Registermaschinen, Schaltkreise 3. Berechenbare Funktionen, Entscheidbarkeit, Aufzählbarkeit 4. Nicht entscheidbare Probleme wie z.B. Halteproblem, Postsches Korrespondenzproblem, Gültigkeitsproblem der Prädikatenlogik erster Stufe 5. Reduktion 6. Aufzählungen berechenbarer Funktionen, Satz von Rice, semantische Korrektheit von Programmen 7. Effiziente Berechenbarkeit, Polynomialzeit 8. Die Komplexitätsklassen P und NP, Polynomialzeitreduktion, NP-Vollständigkeit 9. Einordnung ausgewählter Probleme wie z.B. Erfüllbarkeitsproblem der Aussagenlogik, SAT, 3SAT und 2SAT 10. weitere Beispiele NP-vollständiger Probleme wie z.B. Vertex Cover, TSP u.s.w. 2 Gegenstand der Theoretischen Informatik Das vorliegende Skript beschreibt elementares Grundwissen auf dem Gebiet Berechenbarkeit und Komplexität. Es soll kein Ersatz für die reichlich vorhandene Lehrbuchliteratur sein; gerade für die theoretische Informatik gibt es sehr viele Lehrbücher, wie z.B. die folgenden: • John E. Hopcroft, Jeffrey D. Ullman, Einführung in die Automatentheorie, formale Sprachen und Komplexitätstheorie, Addison-Wesley 1990 • Ingo Wegener, Theoretische Informatik, B.G. Teubner Stuttgart 1993, 3. Auflage 2005 • Uwe Schöning, Theoretische Informatik kurz gefaßt, Bibliographisches Institut Mannheim 1992, 5. Auflage 2008 3 • Klaus W. Wagner, Einführung in die Theoretische Informatik - Grundlagen und Modelle, Springer 1994, 2. Auflage 2003 • Norbert Blum, Theoretische Informatik - Eine anwendungsorientierte Einführung, R. Oldenbourg Verlag München Wien 1998, 2. Auflage 2001 • Juraj Hromkovic, Theoretical Computer Science, Springer 1998, Deutsche Version bei Teubner+Vieweg, 4. Auflage 2010 Nr. 1 der Liste gab es zuerst auf Englisch unter dem Titel Introduction to Automata Theory, Languages and Computation, Addison-Wesley 1979 (in späteren erweiterten Auflagen auch mit dem Coautor Rajeev Motwani) und ist der Klassiker auf diesem Gebiet und Vorbild für viele der nachfolgenden Lehrbücher. Alle diese Lehrbücher beschreiben sowohl Grundwissen der berechenbarkeit und Komplexität als auch der Formalen Sprachen. Darüber hinaus werden in einigen von ihnen weitere Themen behandelt. Ich empfehle besonders die ersten drei. Daneben gibt es eine Fülle von Büchern zu einzelnen Teilgebieten der theoretischen Informatik. Alle genannten Bücher haben gemeinsam, daß sie über den Stoff von zwei Semestern mit je 2 SWS Vorlesung weit hinausgehen. Wir wollen versuchen, uns in diesem Skript auf den tatsächlich in ca. 14 Vorlesungen vermittelbaren Inhalt zu beschränken. Dabei fallen naturgemäß viele schöne Resultate weg - die Auswahl ist so getroffen, daß sie einem Mindestwissen für Studenten der Informatik entspricht. Das in diesem Skript beschriebene Grundwissen der Berechenbarkeit und Komplexität gehört in vielen Gebieten der Informatik zu den elementarsten Grundlagen, wie z.B. bei Programmiersprachen und Compilerbau, dem Gebiet der Informationssysteme und Datenbanken, der Technischen Informatik, den Methoden der Künstlichen Intelligenz, der Modellierung und Simulation, dem Software-Engineering, der Computergraphik sowie bei Hochleistungsrechnern und -berechnungen. Theoretische Informatik, bestehend aus den Gebieten Berechenbarkeit und Komplexität sowie Formale Sprachen ist nach Auffassung des Fakultätentages für Informatik in Deutschland einer der vier Grundpfeiler des Informatikstudiums. Die Methoden der theoretischen Informatik sind ihrem Wesen nach mathematische Methoden, allerdings sind die hier gestellten Fragen nicht schlechthin Mathematik, sondern spezifisch auf die Bedürfnisse der Informatik ausgerichtet. Insbesondere spielen algorithmische Fragen sowie Fragen der Beschreibungsfähigkeit eine wesentliche Rolle. Manche der Grundlagen wie die Präzisierung des Algorithmenbegriffs, Begriffe aus der Logik, Grundlagen der Graphentheorie sowie zahlentheoretische Grundlagen z.B. der Kryptographie sind bereits in der Mathematik vorhanden gewesen, noch bevor die ersten Computer gebaut wurden und lange bevor die Informatik als Wissenschaft entstand. Die stürmische Entwicklung der Informatik hat die Weiterentwicklung dieser Grundlagen allerdings auch sehr stark beeinflußt und gefördert. Die Theoretische Informatik wird in Rostock im Bachelorstudium Informatik in den drei Modulen Logik, Berechenbarkeit und Komplexität sowie Formale Sprachen vermittelt. 4 3 Berechenbarkeit 3.1 Einleitung Der Begriff des Algorithmus und der algorithmischen Berechenbarkeit ist in vielen Quellen zu finden. Einige Beispiele für Formulierungen: • “Ein Algorithmus ist ein Verfahren, welches mit Hilfe einer entsprechend konstruierten Maschine realisiert werden kann.” (J.R. Shoenfield, Mathematical Logic, Addison-Wesley 1967) • “Unter einem Algorithmus versteht man eine genaue Vorschrift, nach der ein gewisses System von Operationen in einer bestimmten Reihenfolge auszuführen ist und mit der man alle Aufgaben eines gegebenen Typs lösen kann.” (B.A. Trachtenbrot, Algorithmen und Rechenautomaten, Deutscher Verlag der Wissenschaften 1977) • “Ein Algorithmus ist eine mechanische Regel oder eine automatisierte Methode oder ein Programm für die Ausführung mathematischer Operationen.” (N.J. Cutland, Computability, Cambridge University Press 1980) • “Algorithmus: Allgemeines (eindeutiges) Verfahren zur Lösung einer Klasse gleichartiger Probleme (z.B. zur Berechnung einer Funktion für verschiedene Argumente), gegeben durch einen aus elementaren Anweisungen an einen (menschlichen oder maschinellen) Rechner bestehenden Text.” (H.-J. Schneider, Hrsg., Lexikon der Informatik und Datenverarbeitung, Oldenbourg 1991) • “Ein Algorithmus ist eine aus endlich vielen Schritten bestehende eindeutige Handlungsvorschrift zur Lösung eines Problems oder einer Klasse von Problemen.” Wikipedia, 3.4.2012. Diese so unterschiedlichen Formulierungen haben im wesentlichen eines gemeinsam: Algorithmen sind Verfahren, die auf Maschinen bzw. Rechnern automatisiert, d.h. ohne Eingriff des Menschen, ausgeführt werden sollen. Dies entspricht der über Jahrhunderte gesammelten Erfahrung, daß für viele Operationen oder Systeme von Operationen Verfahren angebbar sind, nach denen man diese ausführen kann, ohne weiter über sie nachdenken zu müssen. Mit dem Entstehen der mechanischen und später der elektronischen “Rechenmaschinen” bzw. der Computer ist die Programmierung als weitere Komponente hinzugekommen: Verfahren müssen gemäß den syntaktischen Vorschriften einer Programmiersprache implementiert werden, um auf einer Maschine ausführbar zu werden. Betrachtet man die obigen Formulierungen des Algorithmenbegriffs noch einmal unter diesem Aspekt, so sieht man, daß die Begriffe Algorithmus und Programm zusammengehören, aber nicht vermischt werden dürfen: Algorithmen sind (in exakten Vorschriften formulierte) Verfahren, die zu ihrer Ausführung auf Maschinen als Programme in geeigneten Sprachen implementiert werden. 5 Die Frage nach den Grenzen des algorithmisch Berechenbaren ist lange vor dem Entstehen der Informatik gestellt worden. Solange man Probleme untersucht hat, die mittels Algorithmen lösbar waren, bestand keine Notwendigkeit, den Begriff des Algorithmus mathematisch präzise zu formulieren. Dies wurde erst notwendig, als man versuchte nachzuweisen, daß es zu bestimmten Problemen keinen Algorithmus gibt, der dieses Problem löst. Der berühmte Göttinger Mathematiker David Hilbert formulierte auf dem Internationalen Pariser Mathematikerkongreß 1900 eine Reihe von Problemen, zu denen auch das sogenannte Problem der Diophantischen Gleichungen gehörte (es war das zehnte seiner Probleme): Gegeben: Ein Polynom P (x1 , . . . , xn ) mit den Variablen x1 , . . . , xn und ganzzahligen Koeffizienten. Gesucht: Alle ganzzahligen Lösungen der Polynomgleichung P (x1 , . . . , xn ) = 0. Beispiel 3.1 P (x1 , x2 , x3 ) := x21 + x22 −x23 . Gesucht werden alle ganzzahligen Lösungen der Polynomgleichung x21 + x22 − x23 = 0, d.h. der Gleichung x21 + x22 = x23 Das von Hilbert formulierte Problem blieb lange offen und wurde erst in den siebziger Jahren des 20. Jahrhunderts durch den russischen Mathematiker Juri Matijasevich gelöst: Es gibt keinen Lösungsalgorithmus zur ganzzahligen Lösung diophantischer Gleichungen. Ein weiteres Beispiel eines algorithmisch nicht lösbaren Problems ist das Allgemeingültigkeitsproblem der Prädikatenlogik: Es gibt keinen Algorithmus, der zu gegebener prädikatenlogischer Formel feststellt, ob sie allgemeingültig ist (dies wird im Satz von Church später genauer behandelt). Für die Programmierung ist das Problem der semantischen Korrektheit von grundlegender Bedeutung: Leistet ein Programm das Gewünschte? Während es relativ einfach ist festzustellen, ob ein Programm syntaktisch korrekt ist, d.h. die Syntaxregeln der jeweiligen Programmiersprache einhält, ist das Problem der semantischen Korrektheit algorithmisch unlösbar, wie sich später zeigen wird. Die exakte Formulierung des Algorithmen- und des Maschinenbegriffes hat für die Informatik noch einen weiteren Nutzen. Sie ermöglicht es, Fragen des Rechenaufwandes von Algorithmen in einer geeigneten, genügend einfachen Weise zu formulieren. Die ersten Präzisierungen gehen zurück bis in die Zeit um 1936, und die sicher am häufigsten verwendete Form ist die durch Alan Turing (der von 1912 bis 1954 gelebt hat) eingeführte und später nach ihm benannte Turingmaschine. 3.2 Turingmaschinen Mit N bezeichnen wir im Folgenden die Menge der natürlichen Zahlen (einschließlich der Null). Es sei Σ eine endliche nichtleere Menge (von Symbolen), auch Alphabet genannt. Die Wortmenge Σ∗ über Σ besteht aus allen endlichen Folgen x1 x2 . . . xn , n ∈ N, von Elementen xi ∈ Σ, i ∈ {1, 2, . . . , n}, die man sich hintereinander geschrieben vorstellt. Dabei ist auch der Fall n = 0 zugelassen, der die leere Folge 6 bzw. das leere Wort ε liefert. Die Wortlänge |x1 x2 . . . xn | des Wortes x1 x2 . . . xn ist n. Damit ist also |ε| = 0. Es sei für Wörter u = x1 x2 . . . xn und w = y1 y2 . . . ym das Wortprodukt uw := x1 x2 . . . xn y1 y2 . . . ym , also die Hintereinanderschreibung der beiden Wörter. Sind L und M Mengen von Wörtern, so sei LM := {uw : u ∈ L und w ∈ M}. Wir definieren in etwas strengerer formaler Schreibweise nun noch einmal die gesamte Wortmenge Σ∗ : Σ0 := {ε} ist die Einermenge mit dem leeren Wort als einzigem Element, Σ1 := Σ ist das Alphabet selbst, Σi+1 := Σi Σ für alle i ∈ N und S i Σ∗ := ∞ i=0 Σ die Menge aller Wörter über Σ sowie S i Σ+ := ∞ i=1 Σ die Menge aller nichtleeren Wörter über Σ. Für die Länge eines Wortes w gilt also: |w| = 0 falls w = ε 1 + |w ′| falls w = xw ′ , x ∈ Σ Nun zum Begriff der Turingmaschine: Die inhaltliche Vorstellung der Arbeitsweise solcher Maschinen ist weit entfernt von der Funktionsweise heutiger Computer. Es soll jedoch damit auch nicht die Arbeitsweise von Computern beschrieben werden, sondern es wird ein möglichst einfaches formales Modell zur Präzisierung des Begriffs der Berechenbarkeit angegeben, das sich in vielerlei Hinsicht in der Theoretischen Informatik bewährt hat. Die Turingmaschine hat ein beidseitig unendliches Band, das in Zellen eingeteilt ist, in denen jeweils ein Symbol aus dem jeweils gewählten Alphabet Σ steht. Die Arbeit auf diesem Band erfolgt taktweise und wird von einem Lese-Schreibkopf ausgeführt. Auf dem Band befindet sich also ein solcher Kopf, der in jedem Takt den Inhalt einer einzigen Bandzelle liest, auf der der Kopf momentan steht. Der Kopf aktualisiert diesen Inhalt durch ein Symbol aus Σ und führt anschließend eine Bewegung zur rechten oder zur linken Nachbarzelle aus oder bleibt einen weiteren Takt auf derselben Zelle stehen. Außerdem hat die Turingmaschine eine endliche Zustandsmenge Z, und in jedem Takt befindet sich die Maschine in einem dieser Zustände. Das mögliche Verhalten der Maschine wird bestimmt durch eine endliche Menge von Befehlen, die jeweils zu gegebenem Zustand aus Z und gegebenem Symbol aus Σ einen Folgezustand aus Z, ein Folgesymbol aus Σ sowie eine Folgeposition angeben. Befehle sind also von der Form z, x → z ′ , x′ , λ mit z, z ′ ∈ Z und x, x′ ∈ Σ sowie λ ∈ {+1, −1, 0}, wobei z = z ′ bzw. x = x′ nicht ausgeschlossen wird und λ ∈ {+1, −1, 0} bedeutet: bei λ = +1 geht der Kopf einen 7 Schritt nach rechts zur nächsten Zelle, bei λ = −1 geht der Kopf einen Schritt nach links, und bei λ = 0 bleibt der Kopf auf derselben Zelle stehen. Soviel zum möglichen Verhalten der Turingmaschinen. Eine konkrete Turingmaschine oder besser gesagt, ein Turingprogramm M ist nun das folgende Tupel: M = (Z, Σ, δ, za , ze ), wobei gilt: 1. Z ist endliche Menge (von Zuständen); za ∈ Z (za heißt Anfangszustand); ze ∈ Z (ze heißt Endzustand) 2. Σ ist endliche Menge (das Bandalphabet); ∈ Σ ( ist das Leersymbol, das anzeigt, daß eine Bandzelle leer ist) 3. δ (die Befehlsmenge) ist eine endliche Teilmenge von Z ×Σ×Z ×Σ×{+1, −1, 0}. Wie schon erwähnt, schreiben wir Befehle der Übersichtlichkeit halber in der Form z, x → z ′ , x′ , λ. Das Paar z, x heißt dann die linke Seite und das Tripel z ′ , x′ , λ die rechte Seite des Befehls. Ein Turingprogramm M = (Z, Σ, δ, za , ze ) heißt deterministisch, falls für alle (z, x) ∈ Z × Σ die Befehlsmenge δ höchstens einen Befehl mit der linken Seite z, x enthält. Ohne diese Einschränkung heißt das Programm nichtdeterministisch; deterministische Programme sind also spezielle nichtdeterministische Programme. Nun zum Begriff der Berechnungen eines Turingprogramms. Dazu müssen wir zunächst den Begriff der Konfiguration eines Turingprogramms definieren: Eine Konfiguration ist, anschaulich gesehen, stets die vollständige Beschreibung der Momentansituation auf der Turingmaschine: Dazu gehören folgende Bestandteile: 1. gesamter Inhalt des Bandes; 2. Zustand aus Z; 3. Kopfposition auf dem Band. Eine Konfiguration ist also ein Tripel, bestehend aus diesen drei Größen. Ist nun x1 . . . xn ∈ Σ∗ ein Eingabewort, so ist die Anfangskonfiguration gegeben durch: 1. den Bandinhalt, bei dem das Wort x1 . . . xn auf dem Band steht, und links sowie rechts von x1 . . . xn stehen nur Leerzeichen; 2. den Anfangszustand za ; 3. die Position des Kopfes ist die Zelle mit dem Inhalt x1 , d.h. der Kopf steht auf dem am weitesten links stehenden Symbol der Eingabe. 8 Eine Konfiguration heißt Endkonfiguration, falls ihr Zustand ze ist. Sind K und K ′ Konfigurationen, so heißt K ′ Folgekonfiguration von K bezüglich des Turingprogramms M = (Z, Σ, δ, za , ze ), falls es in δ einen Befehl z, x → z ′ , x′ , λ gibt mit der Eigenschaft: Die Ausführung des Befehls auf K ergibt die Konfiguration K ′ . Schreibweise: K ⊢ K ′ , bzw. K ⊢b K ′ , falls die Anwendung des Befehls b ∈ δ betont werden soll. Um die endliche Beschreibbarkeit der Konfigurationen zu sichern, schreibt man nie den gesamten (unendlich langen) Bandinhalt hin, sondern beschränkt sich im wesentlichen auf den nichtleeren Anteil, wobei ein paar Sonderfälle zu beachten sind. Es könnte z.B. der Kopf bei K auf dem am weitesten links stehenden nichtleeren Symbol stehen und λ = −1 sein – in diesem Fall ist das gelesene Symbol bei K ′ dann das leere Symbol . Wir formalisieren diese Sonderfälle hier nicht. Eine Berechnung von M auf Eingabe x ist nun eine Folge K0 , K1 , K2 , . . . von Konfigurationen mit den Eigenschaften 1. K0 ist Anfangskonfiguration; 2. für alle i ≥ 0 ist Ki+1 Folgekonfiguration von Ki (Ki ⊢ Ki+1 ). Berechnungen können also auch unendlich lang sein. Eine (erfolgreich) abbrechende Berechnung ist eine Berechnung K0 , K1 , K2 , . . . , Km mit der Eigenschaft: Km ist Endkonfiguration. Die Länge der Berechnung ist die Zahl m der Übergänge. Dies ist gleichzeitig die Berechnungszeit, also der Zeitaufwand dieser Berechnung. Beachten Sie, daß Berechnungen nicht abbrechen müssen (dies ist auch bei realeren Programmen theoretisch der Fall, wenn sie in eine Schleife geraten und daher “gewaltsam” abgebrochen werden müssen oder wie bei Betriebssystemen nicht abbrechen sollen) bzw. erfolglos enden können, weil keine weiteren Folgekonfigurationen existieren, ohne daß eine Endkonfiguration erreicht wird. Beachten Sie: Anders als bei Programmen in prozeduralen Programmiersprachen hat die Menge der Befehle eines Turingprogramms keine festgelegte Reihenfolge. Die Abarbeitung der Befehle ergibt sich aus der Frage, ob sie zu einer Konfiguration passen. Was berechnet nun eine abbrechende Berechnung - was ist die Ausgabe des Programms? Dazu eignet sich der (endliche) Bandinhalt der ersten Endkonfiguration einer abbrechenden Berechnung. Damit die Ausgabe eindeutig bestimmt ist, legen wir als Ausgabe den Bandinhalt der ersten Konfiguration mit Endzustand fest (dies für den Fall, daß auch Endkonfigurationen Folgekonfigurationen besitzen, was man natürlich ausschließen könnte). Auf diese Weise kann man mit deterministischen Programmen die Berechnung von Funktionen definieren. Die berechnete Funktion f ordnet dem Eingabewort x entweder den Bandinhalt der ersten Endkonfiguration der abbrechenden Berechnung von M auf Eingabe x zu oder ist nicht definiert, falls die Berechnung nicht abbricht. Ist also M ein deterministisches Programm, so ist die von M berechnete Funktion fM wie folgt definiert: 9 fM (x) := Bandinhalt von Km falls M abbrechende Berechnung K0 , K1 , . . . , Km liefert nicht definiert sonst Eine Funktion f : Σ∗ −→ Σ∗ heißt Turingprogramm-berechenbar (kurz: T-berechenbar), falls ein Turingprogramm M existiert mit f = fM . Damit ist eine erste Präzisierung des Berechenbarkeitsbegriffs gegeben. Beispiele: 1) Unäre Addition von 1: Wir verwenden als Alphabet Σ = {, |}. Das Programm hat die Befehle za , |→ za , |, +1 za , → ze , |, 0. 2) Binäre Addition von 1: Das Programm hat die Befehle za , 0 → za , 0, +1 za , 1 → za , 1, +1 za , → z1 , , −1 z1 , 0 → ze , 1, 0 z1 , 1 → z1 , 0, −1 z1 , → ze , 1, 0. Nun wäre eigentlich ein (induktiver) Korrektheitsbeweis dafür fällig, daß die Programme das Gewünschte leisten. Die obigen Beispiele sind einfach genug, um die Korrektheit sofort zu sehen. 3.3 Varianten von Turingmaschinen - Simulation der Arbeit einer Turingmaschine mit zwei Bändern durch eine Turingmaschine mit nur einem Band; Turingmaschinen mit endlich vielen Bändern; Turingmaschinen mit mehreren Köpfen; Turingmaschinen mit mehrdimensionalen Bändern etc. 10 3.4 Registermaschinen Das Konzept der Turingmaschine hat rein äußerlich mit der Arbeitsweise realer Computer wenig zu tun. Etwas näher kommen diesen die Registermaschinen, die potentiell unendlich viele Register R0 , R1 , R2 , . . . besitzen, deren Inhalt < Ri > jeweils eine beliebig große natürliche Zahl sein kann. Im Programm einer Registermaschine verwenden wir nur folgende Elementarbefehle für Registermaschinen: 1. < Ri >:= 0 (Setze den Inhalt des Registers Ri gleich Null) 2. < Ri >:=< Ri > +1 (Erhöhe den Inhalt des Registers Ri um 1) 3. < Ri >:=< Rj > (Setze den Inhalt von Register Ri gleich dem Inhalt von Register Rj ) 4. if Ri 6= Rj then goto Marke (Bedingter Sprungbefehl) 5. goto Marke (Unbedingter Sprungbefehl) 6. STOP Die Auswahl der obigen Befehle erscheint etwas willkürlich, ist es aber nicht in dem Maße, wie es auf den ersten Blick aussieht. Das eigentlich Erstaunliche ist, daß man für das Konzept der Berechenbarkeit mit so wenig Befehlen auskommt. Wir werden im weiteren zeigen, daß man mit diesen Befehlen genausoviel leisten kann wie mit Turingmaschinen. Zunächst müssen wir jedoch diese Art von Berechnungsfähigkeit formal definieren. Ein Registermaschinenprogramm (kurz: Registerprogramm) ist eine endliche Folge (l1 , b1 ), . . . , (lk , bk ) von Paaren (li , bi ), jeweils bestehend aus einer Marke li und einem Befehl bi der obigen Art. Dazu kommt eine Festlegung der Eingaberegister R1 , . . . , Rk und eines Ausgaberegisters R0 . Beim Programm, also bei der Befehlsfolge, kommt es, wie bei realen Programmiersprachen, und anders als bei den Turingprogrammen, auf die Reihenfolge an. Nun lassen sich, ähnlich wie bei Turingprogrammen, Berechnungen über Folgen von Konfigurationen definieren: Eine Konfiguration ist wiederum eine vollständige Beschreibung einer Momentansituation der Registermaschine. Dazu gehören der Inhalt aller Register sowie die Marke des nächsten auszuführenden Befehls. Zu gegebener Eingabe x1 , . . . , xn ist die Anfangskonfiguration gegeben durch eine Belegung des Ausgaberegisters mit 0, eine Belegung der Eingaberegister Ri mit xi , i ∈ {1, . . . , n} sowie der übrigen Register Rj , j ≥ n + 1, mit 0. Der nächste auszuführende Befehl ist der erste Befehl des Programms. In formaler Schreibweise: Ist (l1 , b1 ), (l2 , b2 ), . . . , (lk , bk ) das Programm, so heißt K = ((0, x1 , x2 , . . . , xn , 0, 0, . . .), l1 ) die Anfangskonfiguration. Ki+1 heißt Folgekonfiguration von Ki , falls Ki = ((r0 , r1 , r2 , . . .), li ) und Ki+1 aus Ki durch Anwendung des Befehls mit der Marke li hervorgeht. Um es genauer zu sagen, ist eine Fallunterscheidung über die Art der Befehle notwendig: Ist 11 der Befehl bi der Marke li eine Addition von 1 im Register rj , so ist Ki+1 = ((r0 , r1 , r2 , . . . , rj−1 , rj + 1, rj+1, . . .), li+1 ), d.h. die Registerinhalte von Ki+1 ergegeben sich als (r0 , r1 , r2 , . . . , rj−1 , rj + 1, rj+1, . . .) – der einzige Inhalt, der geändert wird, ist der von Register Rj , und zwar wird dieser um 1 erhöht. Bei Sprungbefehlen erfolgen keine Registerinhaltsänderungen. Bei den ersten drei Befehlsarten ist der nächste auszuführende Befehl der nach dem ausgeführten Befehl stehende. Bei den beiden Sprungbefehlen ergibt sich der nächste auszuführende Befehl aus der angegebenenen Sprungmarke. Bei einem STOP-Befehl gibt es keinen nächsten auszuführenden Befehl. Eine Konfiguration K = ((y, r1, r2 , . . .), lj ) heißt Endkonfiguration, falls lj Marke des Befehls STOP ist. Eine Folge K0 , K1 , K2 . . . von Konfigurationen heißt wie im Falle der Turingprogramme Berechnung, falls K0 Anfangskonfiguration ist, und für alle i ≥ 0 ist Ki+1 Folgekonfiguration von Ki . Analog ist eine abbrechende Berechnung eine Berechnung K0 , K1 , K2 , . . . , Km mit der Eigenschaft: Km ist Endkonfiguration. Wie bei Turingprogrammen ist der Zeitaufwand, d.h. die Länge der Berechnung, die Zahl m der Übergänge. Beachten Sie, daß auch bei Registerprogrammen Berechnungen nicht abbrechen müssen bzw. nicht unbedingt den STOP-Befehl erreichen müssen. Ist R ein Registerprogramm, so ist die von R berechnete Funktion fR die folgende Funktion: < R0 > in Km falls K0 , K1 , . . . , Km abbrechende Berechnung vonR auf Eingabe x1 , . . . , xn ist fR (x1 , . . . , xn ) := nicht definiert sonst Eine Funktion f : Nk −→ N heißt Registerprogramm-berechenbar (kurz: Registerberechenbar, R-berechenbar), falls ein Registerprogramm R existiert mit f = fR . Nun zu einigen Beispielen: 1) Das folgende Programm mit den Eingaberegistern R1 und R2 berechnet die Addition f (x1 , x2 ) = x1 + x2 . Dabei bezeichne xi =< Ri >. (1) x0 := x1 (2) if x3 6= x2 then goto (4) (3) STOP (4) x0 := x0 + 1 (5) x3 := x3 + 1 12 (6) goto (2) 2) Wir definieren zwei Hilfsfunktionen, die im weiteren gebraucht werden. Es seien x und y natürliche Zahlen. Die ganzzahlige Division x div y von x durch y ist wie folgt definiert: x div y := größtes k ∈ N nicht definiert mit k · y ≤ x falls y ≥ 1 falls y = 0 Der ganzzahlige Rest x mod y bei Division von x durch y ist x mod y = x − (x div y) · y Beispiel: 7 div 3 = 2; 7 mod 3 = 1. Mit folgendem einfachen Prinzip kann man x div y sowie x mod y berechnen: Falls x < y (um diesen Test ausführen zu können, muß wiederum ein kleines Hilfsprogramm geschrieben werden), ist x div y = 0 und x mod y = x, sonst subtrahiere wiederholt y von x, bis die dabei entstehende Zahl x′ kleiner als x ist. Die Zahl der Wiederholungen dieses Schrittes ist x div y, die Zahl x′ ist x mod y. In den nachfolgenden Sätzen wird gezeigt, daß die Berechnungsfähigkeiten von Turingprogrammen und Registerprogrammen gleich sind. Hierbei braucht man geeignete Codierungen von Wörtern durch Zahlen und umgekehrt, da ja Turingprogramme Wortfunktionen berechnen, während Registerprogramme Zahlenfunktionen berechnen. Naheliegend ist z.B. eine Binärcodierung von Registerinhalten, d.h. von natürlichen Zahlen. Umgekehrt werden Bandinhalte von Turingmaschinen als Zahlen codiert, um mit ihnen auf Registermaschinen arbeiten zu können; wesentlich ist bei all diesen Codierungen, daß sie auf offensichtliche Weise berechenbar sind. Satz 3.1 Jede R-berechenbare Funktion ist (bei geeigneter Codierung) T-berechenbar. Beweis. Es sei f : Nk −→ N eine Registerprogramm-berechenbare Funktion, d.h. es existiert ein Registerprogramm R mit f = fR . Wir geben ein Turingprogramm M an, das dieselbe Funktion berechnet, indem es die Arbeit des Registerprogramms Schritt für Schritt simuliert. Die Eingabe von M sei das k-Tupel (x1 , . . . , xk ) in geeigneter Codierung, also z.B. in Binärcodierung mit Trennzeichen zwischen den k Zahlen. 1. M schreibt zuerst (aus dem endlichen Zustands-Gedächtnis) das Programm R auf das Band links neben die Eingabe. Rechts neben der Eingabe kann M beliebig viele Bandabschnitte, getrennt durch ein geeignetes Trennzeichen, als Register R0 , R1 , . . . nutzen. 2. M führt das Programm R auf der Eingabe (x1 , . . . , xk ) Schritt für Schritt aus. Es sei (lj , bj ) der nächste auszuführende Befehl. Wir haben wieder eine Fallunterscheidung über die möglichen Befehlsarten. Ist z.B. der Befehl bj ein Befehl 13 der Art < Ri >:=< Ri > +1, so muß M zur Bandzone laufen, die das Register Ri repräsentiert (dies läßt sich durch Zählen der Trennzeichen realisieren), dort eine 1 addieren (wenn die Länge der für Ri vorhandenen Bandzone dadurch um 1 wächst, muß eine Verschiebung des weiteren Bandinhalts um 1 nach rechts erfolgen) und zum nächsten Befehl des Programms R links von der Eingabe zurückkehren. Alle anderen Fälle lassen sich analog realisieren. Lediglich für den STOP-Befehl ist zu beachten, daß die Ausgabe des Turingprogramms der Bandinhalt nach Erreichen des Endzustands ist. Also muß in diesem Fall das Turingprogramm den gesamten Bandinhalt bis auf den Inhalt von R0 löschen und in den Endzustand übergehen. Damit ist gezeigt, daß M ebenfalls fR berechnet. Nun zur umgekehrten Richtung: Satz 3.2 Jede T-berechenbare Funktion ist (bei geeigneter Codierung) R-berechenbar. Beweis. Es sei M ein Turingprogramm, das die Funktion fM berechnet. Wir geben wieder eine Schritt-für-Schritt-Simulation der Arbeit von M durch R an, wobei die Idee der Simulation die folgende ist: der Bandinhalt von M wird in zwei Bereiche L(K) links vom Kopf sowie R(K) rechts vom Kopf unterteilt, und beide Teile werden als k-näre Zahlen gedeutet. Man kann sich sogar auf ternäre Zahlen beschränken, da es reicht, drei Bandsymbole bei M zu haben. Dabei werden die Zahlendarstellungen jeweils in aufsteigender Ordnung von der Kopfposition aus gedeutet, d.h. die kleinsten Stellen sind die zur Kopfposition nächststehenden. Geht der Kopf nun einen Schritt nach rechts, so wird L(K) um ein Symbol länger und R(K) um ein Symbol kürzer, und analog für die umgekehrte Richtung. Um die Änderungen genauer beschreiben zu können, brauchen wir die div- und die mod-Funktion. Es sei also nun M ein Turingprogramm mit den Bandsymbolen Σ = {|, #, }. Wir beschränken uns auf Wortfunktionen f : {#, |}∗ −→ {#, |}∗ , da jede Wortfunktion f ′ : Σ∗1 −→ Σ∗2 mit dem obigen zweielementigen Alphabet codierbar ist: Ist ai ∈ Σ1 und bi ∈ Σ2 , so sei c1 (ai ) := # | . . . | = #|i und c2 (bi ) := ##|i . | {z } i−mal Um zu Zahlencodierungen von Wörtern über Σ = {|, #, } zu gelangen, legen wir fest: c() := 0, c(|) := 1, c(#) := 2. Ein Wort x = x0 . . . xn ∈ Σ∗ wird dann codiert durch die Zahl c(x) = c(x0 ) · 30 + c(x1 ) · 31 + . . . + c(xn ) · 3n . Lemma 3.1 Ist c(x0 . . . xn ) = c(x′0 . . . x′n ), so ist x0 . . . xn = x′0 . . . x′n . Beweis. Für n = 0 ist die Behauptung klar. Nun nehmen wir an, daß für n die Behauptung gilt, und zeigen sie für n+ 1: Es gilt c(x0 . . . xn ) = c(x0 . . . xn−1 ) + c(xn ) · 3n 14 sowie c(x′0 . . . x′n ) = c(x′0 . . . x′n−1 ) + c(x′n ) · 3n . Wegen c(xn ) = c(x′n ) und c(x0 . . . xn−1 ) = c(x′0 . . . x′n−1 ). Pn−1 i=0 3i < 3n ist dann auch Das einzige Problem bei der eindeutigen Decodierung sind Wörter verschiedener Längen |x| < |x′ | und gleichem Code c(x) = c(x′ ), z.B. haben x = |# und x′ = |# dieselben Codes c(x) = c(x′ ) = 1 · 30 + 2 · 31 (+0 · 32 + 0 · 33 ). Führende Nullen in der Ternärdarstellung des Wortes entsprechen zusätzlichen Leersymbolen im Wort. Es sei nun M = (Σ, Z, δ, za , ze ) das gegebene Turingprogramm mit Σ = {|, #, }, Z = {0, . . . , k}, za = 0, ze = k und K eine Konfiguration von M mit K = yl . . . y0 zx0 . . . xr (d.h. der Zustand ist z, und der Kopf liest gerade x0 ) und linkem Anteil L(K) = yl . . . y0 sowie rechtem Anteil R(K) = x0 . . . xr . Die Zahlencodierung von K erfolgt in drei Zahlen c1 := c(y0 . . . yl ) c2 := c(x0 . . . xr ) c3 := z Es sei K ′ Folgekonfiguration von K bezüglich M. Wir müssen beschreiben, wie das Registerprogramm R die Zahlencodierung von K ′ aus der von K berechnet: Hierzu gibt es wieder verschiedene Fälle, je nachdem, ob der Kopf von M stehenbleibt, einen Schritt nach rechts geht oder einen Schritt nach links geht. Wir nehmen als Beispiel den letzten Fall - die übrigen Fälle lassen sich analog behandeln. Es sei also ein Befehl der Form z, x0 → z ′ , x′0 , −1 anzuwenden. Dies bedeutet K ′ = yl . . . y1 z ′ y0 x′0 x1 . . . xr mit linkem Anteil L(K ′ ) = yl . . . y1 und rechtem Anteil R(K) = y0 x′0 x1 . . . xr . Setzen wir c′1 := c(y1 . . . yl ), so ist c′1 = c1 div 3. Entsprechend ist für c′2 := c(R(K ′ )) c′2 = 3 · (c(R(K)) − 31 · (c(x0 ) − c(x′0 ))) + 30 · c(y0), wobei c(y0 ) = c1 mod 3 ist. Eine kleine technische Schwierigkeit entsteht noch durch den Sonderfall des linken Randes: Steht der Kopf schon auf dem am weitesten links stehenden nichtleeren Symbol der Bandzone, so ist y0 = zu beachten. Damit ist beschrieben, wie die Bandinhalte als Zahlen codiert werden und wie R die Arbeit von M schrittweise simuliert. Um nun ein Gesamtprogramm R zu erhalten, müssen die verschiedenen Unterprogramme von R, die die jeweiligen möglichen Fälle für die jeweiligen Befehle von M behandeln, alle zu einem gemeinsamen Registerprogramm zusammengefügt werden, das außerdem in der Lage ist, die notwendigen Umrechnungen auszuführen und beim Erreichen des Endzustandes von M den Bandinhalt, als Zahl codiert, in das Register R0 zu schreiben. Alles dies ist jedoch in offensichtlicher Weise möglich. 15 3.5 Die These von Church Die beschriebene Äquivalenz zwischen der Berechnungsfähigkeit von Turingprogrammen und von Registerprogrammen ist nicht das einzige Beispiel für die Äquivalenz zweier Berechnungsmodelle. Es sind schon in den 1930er Jahren weitere Präzisierungen des Berechenbarkeitsbegriffes angegeben worden, und alle diese Konzepte waren gleichwertig in ihrer Berechnungsstärke. Dies hat zur Formulierung der folgenden These geführt. These 3.1 (These von Church) Jede (natürliche) Präzisierung des Algorithmenbegriffes führt zu derselben Klasse berechenbarer Funktionen. Diese Funktionen werden auch als die im intuitiven Sinne berechenbaren Funktionen bezeichnet. Wie auch immer man bisher den intuitiven Begriff der Berechenbarkeit präzisiert hat – stets kam man zur gleichen Klasse von Funktionen. Die These von Church ist eine These und kein Satz, da man nicht in der Lage ist, alle möglichen Präzisierungen des Algorithmenbegriffs anzugeben. Die These ist bisher aber auch nicht widerlegt worden, und es gibt guten Grund zu der Annahme, daß sie Bestand haben wird. 3.6 Entscheidbarkeit und Aufzählbarkeit Grundlegende Berechnungsaufgaben sind häufig Entscheidungsaufgaben der Art, daß zu einer gegebenen Eingabe x gefragt wird, ob diese die Eigenschaft M besitzt. Dabei ist in der einfachsten Variante die Eingabe x eine natürliche Zahl und die Eigenschaft M eine Menge von natürlichen Zahlen wie z.B. die Eigenschaft einer Zahl, Primzahl zu sein. Die charakteristische Funktion χM (x) einer Zahlenmenge M ⊆ N ist definiert als χM (x) := 1 falls x ∈ M 0 sonst Eine Zahlenmenge M ⊆ N heißt entscheidbar, wenn ihre charakteristische Funktion χM (x) berechenbar ist. Bei einem anderen Typ von Berechnungsaufgaben werden von einer unendlichen Liste von Werten beliebig lange endliche Anfangsstücke erzeugt. Um diese Art von Berechnungsaufgaben zu erfassen, definiert man den nachstehenden Begriff der Aufzählbarkeit (häufig auch als Semi-Entscheidbarkeit bezeichnet). Eine Zahlenmenge M ⊆ N heißt aufzählbar (häufig auch als semi-entscheidbar bezeichnet), wenn sie entweder die leere Menge ist oder eine überall definierte berechenbare Funktion f existiert, die diese Menge M als Wertebereich Wf = {f (0), f (1), f (2), . . .} hat: M = Wf . 16 Satz 3.3 Eine Menge M ⊆ N ist genau dann entscheidbar, wenn sie und ihr Komplement M = N \ M aufzählbar sind. Beweis. 1. =⇒: Ist M entscheidbar, so ist offenbar auch M entscheidbar, da nach Definition der Entscheidbarkeit von M dann auch die charakteristische Funktion von M berechenbar ist. Jede entscheidbare Menge M ist aber aufzählbar: Ein offensichtliches Aufzählungsverfahren prüft für jede natürliche Zahl 0, 1, 2, . . ., ob sie in M liegt. 2. ⇐=: Sind umgekehrt M und M aufzählbar, so ist im Fall, daß M = ∅ oder M = ∅ gilt, die Behauptung unmittelbar klar. Es seien nun M 6= ∅ und M 6= ∅ und f und g überall definierte berechenbare Funktionen mit M = Wf und M = Wg . Dann läßt sich M auf folgende Weise entscheiden: Zu gegebener Eingabe x wird abwechselnd x = f (0), x = g(0), x = f (1), x = g(1), . . . geprüft, bis sich für einen Index i x = f (i) oder x = g(i) ergibt. Ist x = f (i), so ist x ∈ M, ist dagegen x = g(i), so ist x ∈ / M. Man beachte, daß ein solcher Index i existieren muß, da entweder x ∈ M oder x ∈ / M gilt. Also ist die charakteristische Funktion von M berechenbar und damit M entscheidbar. Kontrollfrage: Warum erfolgt die Suche abwechselnd bei f und bei g, d.h. warum kann man nicht erst alle Werte {f (0), f (1), f (2), . . .} und dann alle Werte {g(0), g(1), g(2), . . .} nach x durchsuchen? Eine wichtige Frage der theoretischen Informatik und insbesondere der Berechenbarkeit ist die nach der Entscheidbarkeit bzw. Nicht-Entscheidbarkeit von konkreten Mengen. Insbesondere entsteht zunächst die Frage, ob es überhaupt unentscheidbare Mengen gibt. Aus mengentheoretischen Argumenten ergibt sich auf einfache Weise die Existenz solcher Mengen. Es gibt nämlich nur abzählbar unendlich viele berechenbare Funktionen, aber überabzählbar unendlich viele Teilmengen der Menge der natürlichen Zahlen. Also könnte man sagen, daß “fast jede” Teilmenge der natürlichen Zahlen nicht entscheidbar ist. Konkrete Mengen dieser Art anzugeben ist jedoch schwierig. In den folgenden Abschnitten kommen einige Beispiele. Nun noch einige weitere Eigenschaften aufzählbarer Zahlenmengen: Satz 3.4 Es sei M eine Menge von natürlichen Zahlen. Die folgenden Eigenschaften sind äquivalent: (1) M ist aufzählbar; (2) M ist Wertebereich einer einstelligen berechenbaren Funktion; (3) M ist Definitionsbereich einer einstelligen berechenbaren Funktion. Satz 3.5 Es sei M eine Menge von natürlichen Zahlen. Die folgenden Eigenschaften sind äquivalent: (1) M ist entscheidbar; 17 (2) M ist Wertebereich einer einstelligen streng monoton wachsenden überall definierten berechenbaren Funktion. Aufgabe 3.1 Beweisen Sie die Sätze 3.4 und 3.5. Aufgabe 3.2 Es sei χ′M (x) := 1 nicht definiert falls x ∈ M sonst Behauptung: M ist genau dann aufzählbar, wenn χ′M berechenbar ist. 3.7 Reduzierbarkeit Es seien A und B Mengen natürlicher Zahlen. Wir definieren A ≤ B, falls eine überall definierte berechenbare Funktion f existiert mit der Eigenschaft: für alle x ∈ N gilt x ∈ A ⇐⇒ f (x) ∈ B. Die Relation ≤ ist offenbar reflexiv, denn die identische Funktion reduziert jede Zahlenmenge A auf sich selbst, und transitiv, denn sind f und g überall definierte berechenbare Funktionen mit x ∈ A ⇐⇒ f (x) ∈ B und x ∈ B ⇐⇒ g(x) ∈ C, so ist die Hintereinanderausführung g ◦ f eine überall definierte berechenbare Funktion mit x ∈ A ⇐⇒ g(f (x)) ∈ C. Satz 3.6 Es seien A, B ⊆ N. Dann gilt: (1) Ist A ≤ B und B entscheidbar, so auch A entscheidbar. (2) Ist A ≤ B und A unentscheidbar, so auch B unentscheidbar. Beweis. Es sei f eine berechenbare Funktion mit x ∈ A ⇐⇒ f (x) ∈ B und χB (·) berechenbar. Dann ist auch χA (x) = χB (f (x)) berechenbar und damit A entscheidbar. Hieraus folgt auch die zweite Behauptung des Satzes. Der Satz gilt analog auch für A ⊆ Nk und B ⊆ Nl . Entscheidbarkeit für Tupelmengen wird analog definiert. 3.8 Standardnumerierungen (Gödelisierungen) von Programmen, Funktionen und aufzählbaren Mengen Die im folgenden definierte quasilexikographische Aufzählung w0 , w1 , w2 , . . . aller Wörter über einem Alphabet Σ liefert eine häufig verwendete Reihenfolge für Programme und 18 damit auch für berechenbare Funktionen sowie aufzählbare Mengen. Es sei Σ ein geeignetes Alphabet, das zur Beschreibung aller Programme eines Maschinentyps bzw. einer Programmiersprache geeignet ist. Der Einfachheit halber beschränken wir uns beim Maschinenmodell wieder auf Turingmaschinen. Auf Σ sei eine Ordnung < der Symbole gegeben (ist Σ z.B. die Menge der ASCIIZeichen, so ist dies in natürlicher Weise der Fall). Die Wörter von Σ∗ werden nach wachsender Länge geordnet, und für Wörter gleicher Länge ordnet man nach lexikographischem Prinzip entsprechend der Ordnung < auf Σ: Es gilt also w < w ′ ⇐⇒ |w| < |w ′| oder (|w| = |w ′ | und es existiert ein k ≤ |w| − 1 mit der Eigenschaft: die ersten k Symbole von w und w ′ stimmen überein, und das (k + 1)-te Symbol von w ist im Sinne von < auf Σ kleiner als das (k + 1)-te Symbol von w ′ ). Nun legt man irgendein einfaches Prinzip zur Beschreibung von Turingprogrammen durch Wörter aus Σ∗ fest, so daß zu gegebenem Wort aus Σ∗ entscheidbar ist, ob dieses Wort ein Turingprogramm beschreibt. Streicht man aus der quasilexikographisch geordneten Liste w0 , w1 , w2 , . . . aller Wörter über Σ diejenigen Wörter weg, die keine Turingprogramme beschreiben, so bleibt eine entsprechende quasilexikographische Reihenfolge p0 , p1 , p2 , . . . aller Turingprogramme übrig. Wir vereinbaren, daß wir diese Liste außerdem noch auf diejenigen Turingmaschinen beschränken, welche einstellige Zahlenfunktionen über den natürlichen Zahlen berechnen. Dann ist mit der Liste p0 , p1 , p2 , . . . der Programme gleichzeitig eine Liste der von diesen Programmen berechneten Funktionen ϕ0 (·), ϕ1(·), ϕ2 (·), . . . sowie eine Liste von deren Definitionsbereichen D0 , D1 , D2 , . . . gegeben. Wir wenden nun die so erhaltene Reihenfolge an, um zu zeigen, daß das wie folgt definierte spezielle Halteproblem K für Turingprogramme nicht entscheidbar ist: Es sei K = {n | n ∈ Dn }, d.h. K ist die Menge der Indizes n, für die das n-te Turingprogramm auf der Eingabe n nach endlich vielen Schritten anhält. (Anhalten ist hier wieder gleichbedeutend mit dem Erreichen des Endzustandes.) Satz 3.7 Das spezielle Halteproblem K ist aufzählbar, aber nicht entscheidbar. Beweis. Daß K aufzählbar ist, sieht man leicht an folgendem Aufzählungsverfahren: für jedes n = 0, 1, 2, . . . beginne Berechnungen des n-ten Turingprogramms pn auf Eingabe n, die jeweils solange fortgesetzt werden, solange das Programm pn auf n noch nicht gehalten hat. Dabei wird bei der Reihenfolge der Schritte nach folgendem Prinzip verfahren (dieses Verfahren nennt man auch “dovetailing”): Ein erster und zweiter Schritt von p0 auf 0, danach ein erster Schritt von p1 auf 1, danach ein dritter Schritt von p0 auf 0, ein zweiter Schritt von p1 auf 1, ein erster Schritt von p2 auf 2 usw. Jedesmal, wenn eine Berechnung ihren Endzustand erreicht, wird die entsprechende Eingabe n als zu K gehörend ausgegeben. Nun zur Unentscheidbarkeit von K: Angenommen, K wäre doch entscheidbar. Dann ist auch die Komplementmenge K = {n | n ∈ / Dn } entscheidbar und damit auch aufzählbar. Also existiert nach Satz 3.4 ein n0 mit Dn0 = K. Nach Definition von K gilt: n0 ∈ K ⇐⇒ n0 ∈ / K = Dn0 ⇐⇒ n0 ∈ / K, 19 und das ist ein Widerspruch zur Annahme, daß K entscheidbar wäre. Der zweite Teil des obigen Beweises ist ein Diagonalisierungstrick, der aus der Mengenlehre und Logik stammt und in der Berechenbarkeitstheorie relativ häufig verwendet wird. Auf einfache Weise zeigt man nun, daß auch das allgemeine Halteproblem Ka für Turingmaschinen nicht entscheidbar ist: Es sei Ka = {(n, m) | n ∈ Dm }. Da wir bereits wissen, daß K nicht entscheidbar ist und die folgende einfache Reduktion n ∈ K ⇐⇒ (n, n) ∈ Ka gilt, ist wegen Satz 3.6 auch Ka nicht entscheidbar. Man kann Zahlenpaare auch auf einfache Weise durch Zahlen codieren; solche Codierungen heißen Cantornumerierungen. Wir geben ein Beispiel einer solchen Funktion P (k+l+1)(k+l) + k. Ein Prinzip dieser Abbildung ist an: Es sei < k, l >:= k+l i + k = i=0 2 also: Alle Paare mit gleicher Summe bekommen aufeinanderfolgende Nummern. So bekommt (0, 0) die Nummer 0, die Paare (0, 1) und (1, 0) bekommen die Nummern 1 und 2, die Paare (0, 2), (1, 1), (2, 0) bekommen die Nummern 3 bis 5 usw. Diese berechenbare Funktion < k, l > ist eineindeutig von N2 auf N, und ihre komponentenweisen Umkehrfunktionen sind diejenigen Funktionen l(n) und r(n) mit < l(n), r(n) >= n. Zum Beispiel ist für n = 5 l(5) = 2 und r(5) = 0. Ist M ⊆ N2 , so ist die Menge der Cantornummern von M die Menge {< x, y >| (x, y) ∈ M}. Aufgabe 3.3 Zeigen Sie: Eine Paarmenge ist genau dann aufzählbar, wenn die Menge ihrer Cantornummern aufzählbar ist. Die Cantornumerierungen lassen sich in naheliegender Weise auf Nk verallgemeinern. 3.9 Das Postsche Korrespondenzproblem Es sei Σ wie gewohnt ein endliches Alphabet und K eine endliche Menge von Paaren nichtleerer Wörter über Σ∗ , also K = {(x1 , y1 ), . . . , (xk , yk )}, wobei xi , yi ∈ Σ+ für alle i ∈ {1, . . . , k} sei. K heißt lösbar, falls eine Indexfolge (i1 , i2 , . . . , in ) existiert mit xi1 xi2 . . . xin = yi1 yi2 . . . yin . Die Folge (i1 , i2 , . . . , in ) heißt dann auch Lösung von K. Das Postsche Korrespondenzproblem (PKP) ist das folgende Problem: Gegeben: Eine Instanz K = {(x1 , y1 ), . . . , (xk , yk )}, wobei xi , yi ∈ Σ+ . Frage: Hat K eine Lösung? Beispiele: Wir wählen Σ = {0, 1}. 1. K = {(1, 10), (0, 00)} hat keine Lösung, da |xi | < |yi | ist für i = 1, 2. 2. K = {(1, 101), (10, 00), (011, 11)} hat z.B. die Lösung 1323: x1 x3 x2 x3 = y1 y3 y2 y3 = 101110011. 20 3. Für K = {(001, 0), (01, 011), (01, 101), (10, 001)} hat die kürzeste Lösung die folgenden 66 Indizes: 243 442 124 343 443 442 144 213 411 344 421 211 134 341 214 421 411 341 131 131 214 113. Satz 3.8 Das Postsche Korrespondenzproblem ist unentscheidbar. Der Beweis ist technisch aufwendig und wird z.B. in den Lehrbüchern von Schöning bzw. Wegener ausgeführt. Er erfolgt durch Reduktion vom Halteproblem für Turingmaschinen. Dabei wird gezeigt, daß man mit den sprachlichen Mitteln des PKP abbrechende Berechnungen von Turingmaschinen ausdrücken kann. Es gilt sogar folgende Verschärfung: Satz 3.9 Das Postsche Korrespondenzproblem ist sogar unentscheidbar für Σ = {0, 1}. 3.10 Das Allgemeingültigkeitsproblem der Prädikatenlogik erster Stufe Satz 3.10 (Church) Das Allgemeingültigkeitsproblem der Prädikatenlogik erster Stufe ist unentscheidbar. Beweis. Wir reduzieren das Postsche Korrespondenzproblem (PKP) auf das Allgemeingültigkeitsproblem der Prädikatenlogik erster Stufe. Dazu sei K = {(x1 , y1), . . . , (xk , yk )} eine Instanz des PKP. Wir konstruieren eine Formel FK , so daß gilt: K hat genau dann eine Lösung, wenn FK allgemeingültig ist. FK = (F1 ∧ F2 ) → F3 enthält ein Konstantensymbol a, zwei einstellige Funktionensymbole f0 und f1 und ein zweistelliges Prädikatensymbol P . Als abkürzende Schreibweise vereinbaren wir fjl ...j2 j1 (x) := fj1 (fj2 (. . . fjl (x) . . .)) mit j1 , j2 , . . . , jl ∈ {0, 1}. (Beachte, daß sich aus technischen Gründen die Reihenfolge der Indizes von der linken Seite zur rechten Seite umkehrt.) F = FK = (F1 ∧ F2 ) → F3 hat folgende drei Bestandteile F1 , F2 , F3 : V F1 = ki=1 P (fxi (a), fyi (a)) V F2 = ∀u∀v(P (u, v) → ki=1 P (fxi (u), fyi (v))) F3 = ∃zP (z, z) Nun sind zwei Richtungen zu zeigen: 1. Wenn F allgemeingültig ist, hat K eine Lösung: Jede zu F passende Struktur erfüllt F , also auch folgende spezielle Struktur A = (UA , IA ): 21 UA = {0, 1}∗ aA = ε f0A (α) = α0 f1A (α) = α1 P A = {(α, β) | α, β ∈ {0, 1}+ und es gibt Indizes i1 , i2 , . . . , il mit α = xi1 xi2 . . . xil und β = y i1 y i2 . . . y il } Also gilt: Ein Wortpaar (α, β) liegt in P A , wenn α durch dieselbe Indexfolge i1 , i2 , . . . , il aus den xi aufgebaut ist wie β aus den yi . Offenbar ist die Struktur A passend zu F . Weil F als allgemeingültig vorausgesetzt war, erfüllt A die Formel F . Außerdem ist leicht zu sehen, daß A auch F1 und F2 erfüllt (bei F1 hat man den Spezialfall von nur einem Index i, und bei F2 gilt: sind u und v mit derselben Indexfolge aus x-Wörtern bzw. y-Wörtern aufgebaut, so auch nach Anhängen von xi bei u bzw. yi bei v). Damit erfüllt A auch F3 wegen der Implikation in F . Dies bedeutet: Es existiert ein Wort γ ∈ {0, 1}+ , das mittels derselben Indexfolge aus den xi wie aus den yi aufgebaut werden kann. Damit hat K eine Lösung. 2. Wenn K eine Lösung hat, ist F allgemeingültig: Es sei xi1 xi2 . . . xin = yi1 yi2 . . . yin eine Lösung und A = (UA , IA ) sei eine beliebige zu F passende Struktur. Falls A F1 oder F2 nicht erfüllt, so ist A(F ) = 1. Nun nehmen wir an, daß A die linke Seite F1 ∧ F2 der Implikation F = (F1 ∧ F2 ) → F3 erfüllt. Wir definieren nun die Funktion µ : {0, 1}∗ → UA wie folgt: µ(ε) := aA µ(x0) := f0A (µ(x)) µ(x1) := f1A (µ(x)) Es gilt also µ(x) = fxA (aA ). Zum Beispiel ist µ(01101) = f1A (f0A (f1A (f1A (f0A (aA ))))). Wegen A |= F1 gilt (µ(xi ), µ(yi )) ∈ P A für alle i ∈ {1, . . . , k}. Wegen A |= F2 gilt: Aus (µ(u), µ(v)) ∈ P A folgt (µ(uxi ), µ(vyi )) ∈ P A für alle i ∈ {1, . . . , k}. Durch Induktion folgt dann: (µ(xi1 . . . xin ), µ(yi1 . . . yin )) ∈ P A . Für u = µ(xi1 . . . xin ) = µ(yi1 . . . yin ) gilt dann (u, u) ∈ P A . Damit gilt A |= ∃zP (z, z) und somit A |= F . 3.11 Aufzählbarkeits- und Iterationssatz Nicht nur bei Zahlenmengen, sondern auch bei Funktionenmengen spielen Aufzählungen eine wichtige Rolle. Es bezeichne P k die Menge der k-stelligen berechenbaren Zahlenfunktionen über N und Rk die Menge der überall definierten k-stelligen berechen- 22 baren Zahlenfunktionen über N. Eine Funktionenmenge F ⊆ P k heißt aufzählbar, falls eine (k + 1)-stellige berechenbare Funktion ψ(x1 , . . . , xk+1 ) existiert mit F = {ψ(0, x2 , . . . , xk+1 ), ψ(1, x2 , . . . , xk+1 ), ψ(2, x2, . . . , xk+1 ), . . .}. Die Funktion ψ heißt in diesem Falle die F aufzählende Funktion. Beispiel 3.2 Die Funktion ψ(x1 , x2 ) := x1 + x2 zählt die Funktionenmenge F := {x1 + 0, x1 + 1, x1 + 2, . . .} auf. Eine naheliegende Frage ist es, ob (für jedes k ∈ N) die Menge P k aller k-stelligen berechenbaren Funktionen aufzählbar ist. Der folgende Satz bejaht dies: Satz 3.11 (Aufzählbarkeitssatz) Zu jedem k ∈ N gibt es eine (k + 1)-stellige berechenbare Funktion ψ (k+1) , welche die Menge P k aufzählt: Zu jeder berechenbaren Funktion f ∈ P k existiert ein Index x1 mit f (x2 , . . . , xk+1 ) = ψ (k+1) (x1 , x2 , . . . , xk+1 ). Beweis. Die Behauptung folgt unmittelbar aus der Tatsache, daß zu gegebenem i das i-te Turingprogramm pi−1 der Aufzählung p0 , p1 , . . . aller Programme, welche k-stellige Funktionen berechnen, berechenbar ist. Die Funktion ψ (k+1) (x1 , x2 , . . . , xk+1 ) bestimmt also erst das x1 -te Programm und wendet dies dann auf die Eingabe (x2 , . . . , xk+1 ) an. Dies liefert eine (k + 1)-stellige berechenbare Funktion. Auch zwischen aufzählenden Funktionen gibt es einen Reduzierbarkeitsbegriff: Für Funktionen ψ und ψ ′ aus P 2 sei ψ ≤ ψ ′ , falls eine überall definierte berechenbare Funktion f existiert mit ψ(x, x2 ) = ψ ′ (f (x), x2 ). (Dies läßt sich auch auf k-stellige Funktionen für k > 2 verallgemeinern.) Es sei ϕ0 (·), ϕ1(·), ϕ2 (·), . . . die bereits definierte Standardaufzählung aller einstelligen berechenbaren Funktionen. Der folgende Satz zeigt, daß diese im obigen Sinne der Reduzierbarkeit von Aufzählungen von Funktionenmengen ein größtes Element darstellt: Satz 3.12 (Iterationssatz, s-m-n-Theorem) Zu jeder Funktion ψ ∈ P 2 gibt es eine überall definierte berechenbare Funktion s, so daß gilt: Zu jedem Index n ist ψ(n, ·) = ϕs(n) (·). Beweis. Es sei ψ ∈ P 2 und M ein Turingprogramm, das ψ berechnet. Wir definieren für jedes feste n das folgende Turingprogramm Mn , das (nur) die Eingabe m hat: 1. Für jede Eingabe m ∈ N schreibe die Eingabe n links von m (und durch eine Marke von m getrennt) auf das Band; 2. Wende das Turingprogramm M auf das Eingabepaar (n, m) an. 23 Dadurch ist ein Turingprogramm Mn definiert, das in der Gödelisierung aller Turingprogramme eine wohlbestimmte Position hat - diese Position heiße s(n); s(n) ist berechenbar und für jedes n definiert, und es gilt ψ(n, m) = ϕs(n) (m) für alle m ∈ N. Völlig analog läßt sich der Iterationssatz für Funktionen mit mehr als zwei Variablen formulieren und beweisen: Zu jeder Funktion ψ ∈ P k+1 gibt es eine überall definierte berechenbare k-stellige Funktion s, so daß gilt: Zu jedem k-Tupel x1 , . . . , xk ist ψ(x1 , . . . , xk , ·) = ϕs(x1 ,...,xk ) (·). Nachfolgend zwei Anwendungen des Iterationssatzes: Satz 3.13 Es gibt eine überall definierte berechenbare Funktion s(i, j) mit der Eigenschaft: ϕi (x) + ϕj (x) = ϕs(i,j)(x). Dies heißt, die Addition zweier berechenbarer Funktionen ist in folgendem Sinne eine berechenbare Operation: Zu gegebenen Gödelnummern i und j der Funktionen läßt sich eine Gödelnummer s(i, j) der Summe der Funktionen ausrechnen. Beweis. Die Funktion r(i, j, x) := ϕi (x) + ϕj (x) ist eine berechenbare dreistellige Funktion. Also existiert nach dem Iterationssatz eine zweistellige, überall definierte Funktion s(i, j) mit r(i, j, x) = ϕs(i,j) (x) = ϕi (x) + ϕj (x). Eine weitere, nicht ganz so offensichtliche Anwendung des Iterationssatzes ist der folgende Satz: Satz 3.14 Das allgemeine Halteproblem Ka := {(n, m) | n ∈ Dm } ist auf das spezielle Halteproblem K := {n | n ∈ Dn } reduzierbar. Beweis. Wir setzen a(i, j, z) := 1 nicht definiert falls (i, j) ∈ Ka sonst Beachte: Als Funktion von z ist a(i, j, z) entweder überall oder nirgends definiert. Nach dem Iterationssatz gibt es eine überall definierte berechenbare Funktion s mit a(i, j, z) = ϕs(i,j) (z). Nun gilt: (i, j) ∈ Ka ⇐⇒ Ds(i,j) = N ⇐⇒ s(i, j) ∈ Ds(i,j) ⇐⇒ s(i, j) ∈ K 3.12 Fixpunktsatz von Kleene und Satz von Rice Wir stellen uns zunächst folgende Frage: Kann man jede (nicht notwendig überall definierte) berechenbare Funktion f : N → N fortsetzen zu einer überall definierten berechenbaren Funktion f ′ ? (f ′ heißt Fortsetzung von f , falls f und f ′ auf dem Definitionsbereich von f übereinstimmen). 24 Dazu konstruieren wir die Funktion f (x) := ϕx (x) + 1. Offenbar ist diese Funktion berechenbar. Angenommen, diese Funktion wäre fortsetzbar zu einer überall definierten berechenbaren Funktion f ′ (·) = ϕj0 (·): Dann wäre ϕj0 (j0 ) + 1 = ϕj0 (j0 ) - Widerspruch. Dieser Widerspruch läßt sich nur dadurch vermeiden, daß die Funktion an der betreffenden Stelle nicht definiert ist. Satz 3.15 (Fixpunktsatz von Kleene) Zu jeder überall definierten berechenbaren Funktion f gibt es ein n0 mit ϕf (n0 ) (·) = ϕn0 (·). Beweis. Wir vereinbaren zunächst: Ist ϕn (n) nicht definiert, so sei die Funktion ϕϕn (n) (x) nirgends definiert. Wir konstruieren g(n, x) := ϕϕn (n) (x) nicht definiert falls ϕn (n) definiert ist sonst Offenbar ist die so definierte zweistellige Funktion berechenbar. Also existiert nach dem Iterationssatz eine berechenbare überall definierte Funktion s mit g(n, ·) = ϕs(n) (·). Andererseits ist nach Definition g(n, ·) = ϕϕn (n) (·). Es sei nun f eine überall definierte berechenbare Funktion. Zur berechenbaren Funktion f (s(·)) gibt es eine ϕ-Nummer n0 : f (s(·)) = ϕn0 (·). Nun gilt ϕs(n0 ) (·) = g(n0 , ·) = ϕϕn0 (n0 ) (·) = ϕf (s(n0 )) (·). Also ist s(n0 ) ein Fixpunkt zur Funktion f . Die Fixpunktgleichung kann jedoch dadurch erfüllt werden, daß ϕn0 (n0 ) nicht definiert ist, d.h. die Funktionen ϕs(n0 ) (·) und ϕf (s(n0 )) (·) nirgends definiert sind. Für die Formulierung des nächsten Satzes benötigen wir den Begriff der Indexmenge NF einer Menge F berechenbarer Funktionen. Es sei F ⊆ P 1 und ϕ0 (·), ϕ1 (·), ϕ2 (·), . . . eine Gödelisierung aller Funktionen in P 1 . Dann ist NF := {n | ϕn ∈ F }. Selbst im Falle, daß F nur eine einzige berechenbare Funktion f enthält, d.h. F = {f }, ist natürlich die Indexmenge NF unendlich, denn es gibt ja unendlich viele Programme, die f berechnen. Der nachfolgende Satz zeigt, daß “nichttriviale” Indexmengen stets unentscheidbar sind. Wir formulieren den Satz zunächst wieder für einstellige Funktionen. Er gilt ganz analog für mehrstellige Funktionen. Satz 3.16 (Rice) Für jede Funktionenmenge F ⊆ P 1 mit F 6= ∅ und F 6= P 1 gilt: Die Indexmenge NF von F ist nicht entscheidbar. Beweis. Es sei F 6= ∅ und F 6= P 1 . Dann ist NF 6= ∅ und NF 6= ∅. Wir wählen ein a ∈ NF sowie ein b ∈ NF = NF und setzen 25 f (x) := b falls x ∈ NF a falls x ∈ NF Unter der Annahme, daß NF entscheidbar wäre, handelte es sich bei f um eine berechenbare überall definierte Funktion, für die der Fixpunktsatz von Kleene anwendbar ist. Also existiert ein n0 mit ϕf (n0 ) (·) = ϕn0 (·). Dann gilt jedoch ϕn0 (·) ∈ F ⇐⇒ ϕf (n0 ) (·) ∈ F nach Definition von f , und das bedeutet ϕn0 (·) ∈ F ⇐⇒ ϕn0 (·) ∈ / F Widerspruch. Also ist NF nicht entscheidbar. Eine wichtige Folgerung des Satzes von Rice ist die Tatsache, daß auch für einelementige Funktionenmengen F = {f } die Indexmenge NF unentscheidbar ist. Dies hängt eng mit dem Problem der semantischen Korrektheit von Programmen in folgender Formulierung zusammen: Gegeben: Eine berechenbare Funktion f und ein Programm pn . Frage: Berechnet pn die Funktion f ? Folgerung 3.1 Das Problem der semantischen Korrektheit ist nicht entscheidbar. Beweis. Nach dem Satz von Rice gilt: {n | ϕn = f } ist unentscheidbar. Das heißt: Für jede berechenbare Funktion f ist die Frage, ob das Programm pn die Funktion f berechnet, unentscheidbar. Selbst für einfachste Funktionen f wie z.B. die identische Abbildung f (x) = x gibt es keinen Algorithmus, der diese Frage entscheidet. Aufgabe 3.4 Folgende Mengen sind nicht entscheidbar: 1. {n | ϕn eine konstante Funktion } 2. {n | für alle x ist ϕn (x) ≤ 10} 3. {n | Dn endlich } 4. {n | Dn unendlich } 5. {n | Dn leer } 3.13 Algebraische Beschreibung der berechenbaren Funktionen Wir haben bei der Definition der Registermaschinen intuitiv die Berechenbarkeit folgender einfacher Funktionen verwendet: 1. die Nullfunktion n(x) := 0 für alle x ∈ N; 2. die Nachfolgerfunktion s(x) := x + 1 für alle x ∈ N; 26 3. die Projektionsfunktionen proji (x1 , . . . , xn ) := xi für alle (x1 , . . . , xn ) ∈ Nn ; Die Menge dieser Funktionen bildet die Menge der Anfangsfunktionen. Weiterhin sind folgende Zusammensetzungen von berechenbaren Funktionen intuitiv wieder berechenbar. Es sei dazu F k die Klasse der k-stelligen, nicht notwendig überall definierten Funktionen f : Nk −→ N. Das Normalschema der Substitution: Es seien g ∈ F k und h1 , . . . , hk ∈ F m . Dann ist die Funktion f = SUB k (g, h1 , . . . , hk ) definiert durch folgendes Normalschema der Substitution: f (x1 , . . . , xm ) := g(h1 (x1 , . . . , xm ), . . . , hk (x1 , . . . , xm )) Das Normalschema der primitiven Rekursion: Es seien g ∈ F n und h ∈ F n+2 . Dann ist die Funktion f = P Rn (g, h) definiert durch folgendes Normalschema der primitiven Rekursion: f (0, x1 , . . . , xn ) := g(x1 , . . . , xn ) und f (y + 1, x1 , . . . , xn ) := h(x1 , . . . , xn , y, f (y, x1, . . . , xn )) Wir definieren die Menge der primitiv rekursiven Funktionen als die Menge der Funktionen, die sich aus der Menge der Anfangsfunktionen durch endlichmalige Anwendung der Operationen des Normalschemas der Substitution sowie der primitiven Rekursion erzeugen lassen. Dies ist also die algebraische Hülle der Anfangsfunktionen unter diesen beiden Operationen. Eine Zeitlang hat man geglaubt, daß man auf diese Weise alle berechenbaren Funktionen erhält. 1928 hat Ackermann eine berechenbare Funktion konstruiert, die schneller wächst als jede primitiv rekursive Funktion und damit von jeder dieser Funktionen verschieden ist. Diese zweistellige Ackermann-Funktion A (wir schreiben aus technischen Gründen die erste Variable in den Index) kann wie folgt definiert werden: A : N2 −→ N ist definiert durch 1. A0 (y) := y + 1; 2. Ax+1 (0) := Ax (1); 3. Ax+1 (y + 1) := Ax (Ax+1 (y)) Satz 3.17 Die Ackermann-Funktion A hat folgende Eigenschaften: 1. A1 (y) = y + 2; 2. A2 (y) > 2y; 27 3. A3 (y) > 2y+1 ; 4. A wächst schneller als jede primitiv rekursive Funktion. Es zeigt sich, daß man nur eine weitere Operation, den sogenannten µ-Operator, braucht, um alle (intuitiv) berechenbaren Funktionen zu erfassen. Dies ist die sogenannte µ-Rekursion: Es sei f ∈ F 2 . Die Funktion g = µy(f ) ist definiert als: min{y : f (x, y) = 0} falls ein solches y existiert und für y0 = min{y : f (x, y) = 0} alle Funktionswerte g(x) := f (x, z), z ≤ y0 , definiert sind nicht definiert sonst Satz 3.18 Die Klasse der durch Registermaschinen berechenbaren Funktionen ist gleich der Klasse der durch endlichmalige Anwendung der Operationen Normalschema der Substitution, der primitiven Rekursion und des µ-Operators aus der Menge der Anfangsfunktionen erzeugbaren Funktionen. Beweisidee. Durch die Definition von Registermaschinen und Registerprogrammen ist unmittelbar klar, daß die Anfangsfunktionen R-berechenbar sind. Nun schließt man induktiv: 1. Sind die Funktionen g ∈ F k und h1 , . . . , hk ∈ F m R-berechenbar, so auch f = SUB k (g, h1 , . . . , hk ). 2. Sind g ∈ F n und h ∈ F n+2 R-berechenbar, so auch f = P Rn (g, h). 3. Ist f ∈ F 2 , so auch g = µy(f ). Damit sind dann alle aus den Anfangsfunktionen durch endlichmalige Anwendung der drei Operationen erzeugbaren Funktionen auch R-berechenbar. Die Idee für die umgekehrte Richtung ist die folgende: Ist R ein Registerprogramm, so ist die Ausgabefunktion fR (x1 , . . . , xn ) dadurch gegeben, daß man genau dann in endlich vielen Takten zum STOP-Befehl kommt, falls fR auf dieser Eingabe definiert ist, und im Falle, daß der STOP-Befehl im Takt t erreicht wird, ist fR (x1 , . . . , xn ) (t) das Ergebnis der Projektion auf die erste Komponente R0 der (endlichen) Folge der (t) (t) (t) Registerinhalte (R0 , R1 , R2 , . . .) von R im Takt t. Nun muß man sich noch überlegen, daß die Registerinhalte jedes Taktes t durch die drei Operationen, angewendet auf die Anfangsfunktionen, erzeugbar sind. Dies geschieht induktiv. Außerdem erhält man den Takt, in dem der STOP-Befehl erreicht wird (falls er erreicht wird), durch den µ-Operator. 28 4 Effiziente Berechenbarkeit 4.1 Zeitaufwand von Programmen als Effizienzmaß Für praktische Zwecke reicht es nicht, algorithmische Probleme als berechenbar oder nicht berechenbar zu klassifizieren, sondern es kommt entscheidend auf den Zeitaufwand der anzuwendenden Algorithmen an. Braucht man für die Entscheidung der Frage, ob eine Gleichung lösbar ist bzw. zum Auffinden von Lösungen eine Million Jahre, so kann man sicher nicht von effizienter Berechenbarkeit bzw. effizienter Lösbarkeit reden. Bei vielen praktischen Aufgaben wird Echtzeitverhalten zur Lösung der Aufgabe verlangt, d.h. zu jedem Bit, das man als Information über die Eingabe bekommt, muß sofort reagiert werden. Insbesondere besteht diese Anforderung bei Aufgaben der Prozeßsteuerung. Andererseits gibt es viele wichtige Probleme, bei denen man keine Echtzeitalgorithmen kennt. Ein wichtiges Qualitätskriterium eines Algorithmus ist also sein Zeitaufwand, gemessen als Funktion der Eingabe bzw. der Eingabelänge. Ist Σ das Alphabet zur Beschreibung der Eingaben, so existieren bei Eingabelänge n genau |Σ|n Eingabewörter dieser Länge n. Um den Zeitaufwand eines Algorithmus zu messen, gibt es verschiedene Möglichkeiten: 1. worst case: Es wird für jedes n das Maximum des Zeitaufwandes bei Wörtern der Länge n bestimmt. Dies kann bedeuten, daß einige wenige pathologisch schwierige und zeitaufwendige Fälle die Schranke für den Aufwand verschlechtern, der Vorteil ist aber, daß man alle Fälle berücksichtigt hat. 2. average case: Man hat eine Wahrscheinlichkeitsverteilung auf der Menge der Eingaben und bildet den gewichteten Mittelwert des Zeitaufwands bei den verschiedenen Eingaben der Länge n. Das ist nur dann eine gute Methode, wenn man wirklich eine begründete Wahrscheinlichkeitsverteilung kennt (was selten der Fall ist), sagt aber nichts über den schlechtesten Fall. Da Computer getaktet arbeiten, kann man sich den Zeitaufwand einer Berechnung als die Zahl der Takte vorstellen, welche die Maschine auszuführen hat. Bei theoretischen Maschinenmodellen geht man noch einen Schritt weiter und nimmt an, daß alle Befehle zu ihrer Ausführung den gleichen Zeitaufwand erfordern. Dies ist im Falle von Turingmaschinen gut vorstellbar, trifft jedoch bei Registermaschinen nicht direkt zu. Zum Beispiel ist es nicht realistisch anzunehmen, daß ein Befehl wie die Addition von 1 zu einem beliebig großen Registerinhalt nur einen Takt erfordert. Noch unrealistischer wird es, wenn man bei Registermaschinen die Multiplikation zweier Zahlen als Grundbefehl zuläßt und annimmt, daß dies in einem Takt möglich sei. Die Konsequenz ist, daß man die Länge der Registerinhalte mit zu berücksichtigen hat. Unter dieser Voraussetzung zeigt es sich, daß der Zeitaufwand zur Ausführung von Berechnungen auf Turingmaschinen bzw. auf Registermaschinen nicht “wesentlich verschieden” ist, wenn man den Aufwand durch eine genügend grobe Brille betrachtet. Dies wird dadurch verständlicher, daß für viele Zwecke die wichtigste Unterscheidung diejenige zwischen polynomialem und exponentiellem Aufwand ist. 29 4.2 Polynomialzeit und Exponentialzeit Brauchbare Algorithmen benötigen bei Eingaben der Länge n nicht mehr als O(nk ) Takte für eine (kleine!) Konstante k (dies heißt dann polynomialer Zeitaufwand), während Algorithmen mit exponentiellem Zeitaufwand 2n (oder allgemeiner cn für ein c > 1) schon für kleine Eingabelängen n unbrauchbar sind; die Funktion 2n erreicht bekanntlich schon für n = 300 astronomisch große Werte. Bei polynomialem Aufwand nk mit großem k (z.B. k = 106 ) ist der Aufwand ebenfalls unrealistisch groß, jedoch ist bei praktisch relevanten Algorithmen der Exponent k “klein”, falls überhaupt ein Polynomialzeitalgorithmus existiert. Das Ziel dieser Unterscheidung ist eine grobe Klassifikation von Problemen in “effizient lösbar” und “nicht effizient lösbar”, ohne daß dies vom gewählten Maschinenmodell abhängen soll. Schaut man sich die Beweise der Sätze 3.1 und 3.2 genauer an, so stellt sich heraus, daß diese Sätze analog mit Zeitbeschränkungen gelten: Der Zeitaufwand des Registerprogramms zur Simulation des Turingprogramms ist polynomial, und umgekehrt ist es ebenso. Mit anderen realistischen Modellen ist es ähnlich, so daß man die These von Church auf analoge Weise noch einmal für polynomialen Zeitaufwand formulieren kann. Wir beschränken uns der Einfachheit halber wieder auf Turingprogramme und setzen zunächst Determinismus voraus. Um nun die formalen Mittel zur Klassifikation von Problemen in “effizient lösbar” und “nicht effizient lösbar” zu erhalten, sind folgende Definitionen notwendig. Der Zeitaufwand tP (w) eines Turingprogramms P bei Eingabe w wird wie folgt definiert: tP (w) := Zahl der Takte von P falls P bei Eingabe w anhält ∞ sonst Dann ist tP (n) := max{tP (w) | w ∈ Σn }. Auf dieser Grundlage lassen sich sogenannte Zeitkomplexitätsklassen definieren. Zu gegebener Zahlenfunktion s : N −→ N sei die Zeitkomplexitätsklasse DT IME(s) die Menge aller Entscheidungsprobleme, die sich mit deterministischen Turingprogrammen in Zeitaufwand s entscheiden lassen. Etwas formaler ist: DT IME(s) := {L | L ⊆ Σ∗ und es existiert ein deterministisches Turingprogramm P , das L entscheidet und für das gilt: tP (w) ≤ s(n) für alle w ∈ Σn }. Ist z.B. s(n) = n2 , so handelt es sich bei DT IME(n2 ) um die Menge aller Entscheidungsprobleme, die sich mit Zeitaufwand n2 berechnen lassen. Wir definieren nun die Komplexitätsklasse P als Vereinigung aller Klassen DT IME(nk ), k ∈ N. Also ist P := ∞ [ DT IME(nk ). k=1 30 4.3 Polynomialzeit auf nichtdeterministischen Maschinen Nichtdeterministische Programme haben, wie im Abschnitt über Turingmaschinen beschrieben, zu gegebener Konfiguration nicht notwendig nur eine Nachfolgekonfiguration. Damit ist es zur Beschreibung des Verhaltens eines nichtdeterministischen Programms auf einer Eingabe w erforderlich, den Berechnungsbaum aller möglichen Aufeinanderfolgen von Konfigurationen anzugeben. (Der Begriff Berechnungsbaum ist eigentlich nicht ganz korrekt und müßte Berechnungsgraph heißen, da es sich in Wirklichkeit um einen gerichteten azyklischen Graphen von Konfigurationen als Knoten und Aufeinanderfolgen von Konfigurationen als Kanten handelt.) Geht es um ein Entscheidungsproblem (wir wollen solche Probleme im Zusammenhang mit nichtdeterministischen Programmen zur genaueren Unterscheidung zu deterministischen Berechnungen ab sofort Akzeptierungsprobleme nennen), so gilt die Eingabe w als akzeptiert, falls auf mindestens einem Weg dieses Graphen Akzeptierung im üblichen Sinne durch Erreichen eines Endzustands erfolgt. Der Zeitaufwand eines nichtdeterministischen Programms zur Akzeptierung eines Wortes ist dann die kürzeste Länge eines akzeptierenden Berechnungsweges im Berechnungsgraphen. Stellt man sich also noch einmal vereinfachend vor, daß der Berechnungsgraph ein Baum ist, so ist der Zeitaufwand einer nichtdeterministischen Akzeptierung die Tiefe des Baumes bis zu einer akzeptierenden Konfiguration. Auf dieser Grundlage lassen sich die nichtdeterministischen Zeitkomplexitätsklassen definieren. Zu gegebener Zahlenfunktion s : N −→ N sei die Zeitkomplexitätsklasse NT IME(s) die Menge aller Entscheidungsprobleme, die sich mit nichtdeterministischen Turingprogrammen in Zeitaufwand s entscheiden lassen. Etwas formaler ist: NT IME(s) := {L | L ∈ Σ∗ und es existiert ein (nichtdeterministisches) Turingprogramm P , das L akzeptiert und für das gilt: tP (w) ≤ s(n) für alle w ∈ Σn }. Ist z.B. s(n) = n2 , so handelt es sich bei NT IME(n2 ) um die Menge aller Akzeptierungsprobleme, die sich nichtdeterministisch mit Zeitaufwand n2 berechnen lassen. Wir definieren nun die Komplexitätsklasse NP als Vereinigung aller Klassen NT IME(nk ), k ∈ N. Also ist NP := ∞ [ NT IME(nk ). k=1 4.4 Polynomiale Reduktion, NP-Vollständigkeit und P-NPProblem Es seien A und B Wortmengen über einem Alphabet Σ, also A ⊆ Σ∗ und B ⊆ Σ∗ . Analog zur Reduzierbarkeit in der Berechenbarkeitstheorie definieren wir polynomiale Reduzierbarkeit wie folgt: Es sei A ≤p B, falls eine überall definierte polynomialzeit-berechenbare Funktion f : Σ∗ −→ Σ∗ existiert mit der Eigenschaft: Für alle x ∈ Σ∗ gilt x ∈ A ⇐⇒ f (x) ∈ B. 31 Dabei heißt die Funktion f : Σ∗ −→ Σ∗ polynomialzeit-berechenbar, falls es ein deterministisches Turingprogramm P gibt, das den Funktionswert f (x) bei Eingabe x (die auf dem Eingabeband steht), mit Hilfe eines Arbeitsbandes in polynomial vielen Schritten nk für ein festes k und n = |x| auf das Ausgabeband schreibt. Lemma 4.1 Die Relation ≤p ist transitiv. Beweis. Es sei A ≤p B und B ≤p C, d.h. es existieren eine überall definierte polynomialzeit-berechenbare Funktion f : Σ∗ −→ Σ∗ mit der Eigenschaft: Für alle x ∈ Σ∗ gilt x ∈ A ⇐⇒ f (x) ∈ B, sowie eine überall definierte polynomialzeitberechenbare Funktion g : Σ∗ −→ Σ∗ mit der Eigenschaft: Für alle y ∈ Σ∗ gilt y ∈ B ⇐⇒ g(y) ∈ C. Es sei O(nk ) die Zeitschranke zur Berechnung von f und O(nl ) die Zeitschranke zur Berechnung von g. Nun ist g ◦ f (x) = g(f (x)) eine überall definierte polynomialzeit-berechenbare Funktion mit der Eigenschaft: Für alle x ∈ Σ∗ gilt x ∈ A ⇐⇒ g(f (x)) ∈ C. Die Zeitschranke für die Berechnung von g(f (x)) ergibt sich als O(nk ) für die Berechnung von f (x) – dies ist gleichzeitig eine Beschränkung für die Länge von f (x) – und O((nk )l ) = O(nk·l ) für die anschließende Berechnung von g(f (x)). Dies ist offenbar eine polynomiale Zeitschranke. Wir definieren nun den Begriff der NP-Vollständigkeit, der dazu dienen soll, schwierigste Probleme in NPzu erfassen: Es sei L ⊆ Σ∗ . L heißt NP-vollständig, falls gilt: 1. L ∈ NP. 2. Für alle M ∈ NP ist M ≤p L. Aus der Definition folgt noch nicht, daß es überhaupt NP-vollständige Mengen gibt. Dies ist jedoch der Fall, und wir geben im weiteren einige Beispiele an. Zunächst jedoch eine wichtige Eigenschaft: Lemma 4.2 Ist L NP-vollständig und L ∈ P, so ist P = NP. Beweis. Es sei P ein Turingprogramm, das L in polynomialer Zeit nl für ein festes l entscheidet. Nach Definition der NP-Vollständigkeit gibt es zu jedem M ∈ NP eine überall definierte polynomialzeit-berechenbare Funktion f mit der Eigenschaft: Für alle x ∈ Σ∗ gilt x ∈ M ⇐⇒ f (x) ∈ L. Der Zeitaufwand für die Berechnung von f (x) sei höchstens nk für n = |x|. Die Ausgabe f (x) hat dann ebenfalls höchstens die Länge |f (x)| ≤ nk . Nun ist wegen M ≤p L auch M ∈ P, da zu jeder Eingabe x die Frage, ob x ∈ M ist, wie folgt entschieden werden kann: 1. Berechne f (x) - dies benötigt höchstens nk Takte für n = |x|. 2. Prüfe, ob f (x) ∈ L ist - dies benötigt höchstens (nk )l = nk·l Takte. 32 Der Gesamtzeitaufwand ist also polynomial. Die Frage, ob P 6= NP gilt, ist das sogenannte P-NP-Problem und stellt eines der zentralen bisher ungelösten Probleme der theoretischen Informatik dar. Für seine Lösung sind 1 Million US-Dollar ausgesetzt. Allgemein wird vermutet, daß P 6= NP gilt. Daher ist die NP-Vollständigkeit eines Problems also ein Warnsignal: Wird ein Problem als NP-vollständig nachgewiesen, so kann man nicht darauf hoffen, einen effizienten (d.h. Polynomialzeit-) Algorithmus zu seiner Lösung zu finden. Mehr ist dies beim gegenwärtigen Wissensstand allerdings nicht, denn wie schon gesagt, hat man bisher nicht zeigen können, daß die Klasse NP größer ist als die Klasse P. 4.5 Das Erfüllbarkeitsproblem der Aussagenlogik Wir betrachten als nächstes das Erfüllbarkeitsproblem der Aussagenlogik, das in vielen Gebieten der Informatik, insbesondere bei den Grundlagen der Künstlichen Intelligenz, bei Schaltkreisen sowie in der Komplexitätstheorie eine wichtige Rolle spielt und im Modul Logik bereits ausführlich behandelt wurde. Dazu definieren wir zunächst die Formeln der Aussagenlogik. Ihre Struktur bildet die Syntax der Aussagenlogik: 1. Die Aussagenvariablen A1 , A2 , . . . sind Formeln (atomare Formeln). 2. Sind F, G Formeln, so auch (F ∨ G), (F ∧ G), ¬F . 3. Weitere Formeln gibt es nicht. Die Semantik der Aussagenlogik beschreibt die Belegung der Formeln mit Wahrheitswerten. Es sei F eine Formel mit den Aussagenvariablen A1 , . . . , An (der Einfachheit halber nehmen wir die lückenlose Menge von Aussagenvariablen in F ). Eine zu F passende Belegung b ist eine Abbildung der Variablen A1 , . . . , An von F in die Menge der beiden Wahrheitswerte {1, 0} (dabei steht 1 für wahr und 0 für falsch). Der Wahrheitswert für eine Formel wird nun induktiv wie folgt definiert: b(F ∧ G) := min(b(F ), b(G)), b(F ∨ G) := max(b(F ), b(G)), b(¬F ) := 1 − b(F ). Wir verzichten in der Syntaxdefinition auf die Formel A → B, die eine Abkürzung für ¬A ∨ B darstellen soll. Eine Formel heißt allgemeingültig (bzw. gültig), falls für jede passende Belegung b zu F der Wahrheitswert b(F ) = 1 ist. Eine Formel heißt erfüllbar, falls eine Belegung b mit b(F ) = 1 existiert. Offenbar ist F genau dann gültig, wenn ¬F nicht erfüllbar ist. Die Gültigkeit bzw. Erfüllbarkeit einer Formel kann man an ihrer Wahrheitswerttafel testen, aber dieser Test ist sehr ineffizient, weil er bei n Aussagenvariablen im schlechtesten Fall zum Prüfen von 2n Werten führen kann, und dies ist schon für relativ kleine Werte von n (z.B n = 300) astronomisch groß. Eine wichtige Frage ist, ob es wesentlich schnellere 33 Methoden gibt, die exponentielle Suche vermeiden, denn gerade die Frage nach der Erfüllbarkeit einer Formel ist von großer Bedeutung. 4.6 Die NP-Vollständigkeit von SAT und 3SAT Es sei SAT := {F | F ist Formel in KNF und es existiert eine erfüllende Belegung für F }. In der Schreibweise von [5]: Satisfiability (SAT) [LO1]: Gegeben: Eine konjunktive Normalform (KNF) F = C1 ∧ . . . ∧ Cm . Frage: Gibt es eine erfüllende Belegung von F ? Satz 4.1 (Satz von Cook) SAT ist NP-vollständig. Beweisidee: 1. SAT ∈ NP: Es sei F eine KNF mit den Aussagenvariablen A1 , . . . , An , deren Erfülltheit getestet werden soll. Dazu verzweigt ein Turingprogramm für die Aussagenvariablen A1 , . . . , An jeweils mit dem Wert 0 nach links bzw. mit dem Wert 1 nach rechts, so daß ein binärer Baum der Tiefe n entsteht, an dessen Blättern jeweils eine Belegung der Aussagenvariablen steht. Geht man in diesem Baum zum Beispiel immer nach links, so erhält man die Belegung Ai = 0 für alle i ∈ {1, . . . , n}. Nun bleibt nur noch zu testen, ob die jeweilige Belegung die Formel F erfüllt. Dies geht in weiteren höchstens n2 Schritten, so daß damit ein nichtdeterministisches Turingprogramm zur Akzeptierung von SAT in Polynomialzeit beschrieben ist. 2. Für alle M ∈ NP ist M ≤p SAT . Dies ist der schwierige Teil des Beweises und erfordert die Modellierung von Polynomialzeitberechnungen auf nichtdeterministischen Turingmaschinen in der Sprache der Erfüllbarkeit von aussagenlogischen Formeln in KNF. Es sei L ∈ NP und M ein nichtdeterministisches Turingprogramm, das genau die Wörter w ∈ L in nk Schritten akzeptiert, wobei |w| = ist. O.B.d.A. können wir annehmen, daß wir Turingmaschinen mit einseitig unendliches Band betrachten, und Konfigurationen können (beliebig oft) wiederholt werden. M habe die Zustandsmenge Z = {z1 , . . . , zs }, wobei z1 der Anfangszustand und zs der akzeptierende Endzustand sein soll. Das Bandalphabet von M sei X = {x1 , . . . , xr }, wobei x1 das Leersymbol bezeichne. Die Befehlsmenge von M wird als Liste von m 5-Tupeln aus X × Z × X × Z × {0, +1, −1} durchnumeriert. Es gilt: w wird von M genau dann akzeptiert, wenn es eine Folge K1 , K2 , . . . , Knk von Konfigurationen gibt mit den Eigenschaften: 1. K1 ist Anfangskonfiguration 2. Knk ist akzeptierende Endkonfiguration 34 3. Für alle i ≤ nk − 1 ist Ki+1 Folgekonfiguration von Ki . Die Aufgabe besteht nun darin, dies als Erfüllbarkeit einer KNF zu formulieren. Genauer gesagt, wird eine KNF Fw konstruiert mit der Eigenschaft: w ∈ L ⇐⇒ Fw ist erfüllbar. Wir verschaffen uns folgenden Vorrat an Aussagenvariablen. Dabei ist stets 1 ≤ t ≤ nk . 1. Zustandsvariablen zt,i , 1 ≤ i ≤ s: Ihre Belegung ist 1 genau dann, wenn M im Takt t im Zustand zi ist. 2. Inhaltsvariablen xt,i,j , 1 ≤ i ≤ nk , 1 ≤ j ≤ r: Ihre Belegung ist 1 genau dann, wenn im Takt t der Inhalt der i-ten Bandzelle das Symbol xj ist. 3. Positionsvariablen st,i , 1 ≤ i ≤ nk : Ihre Belegung ist 1 genau dann, wenn im Takt t der Lese-Schreibkopf auf der i-ten Bandzelle steht. 4. Befehlsvariablen bt,i , 1 ≤ i ≤ m: Ihre Belegung ist 1 genau dann, wenn beim Übergang von Takt t zu Takt t + 1 der i-te Befehl angewendet wird. Mit Hilfe dieser Aussagenvariablen werden vier Teilformeln A, U, E und R der KNF Fw = A ∧ U ∧ E ∧ R gebildet: 1. A steht für die Anfangskonfiguration. 2. U drückt aus, daß für alle 1 ≤ t ≤ nk Kt+1 durch Anwendung eines Befehls auf Kt entsteht. 3. E drückt aus, daß Knk akzeptierende Endkonfiguration ist. 4. R drückt aus, daß M in jedem Takt t in genau einem Zustand ist, genau eine Bandzelle liest, diese genau ein Symbol enthält und genau ein Befehl angewendet wird. Dies mag selbstverständlich erscheinen, ist jedoch für die Rückrichtung des Beweises wichtig. Am einfachsten ist E = znk ,s . Ebenfalls einfach ist A = z1,1 ∧ s1,1 ∧ x1,1,j1 ∧ x1,2,j2 ∧ . . . ∧ x1,n,jn ∧ x1,n+1,1 ∧ . . . ∧ x1,nk ,1 . Damit ist M in der Anfangskonfiguration im Zustand z1 , der Kopf befindet sich auf der am weitesten links stehenden Bandzelle, in den ersten n Bandzellen steht das Eingabewort und die übrigen Bandzellen enthalten das Leersymbol x1 . V U = 1≤t≤nk U(t), wobei U(t) ausdrückt, daß der Übergang von Takt t zu t + 1 durch Ausführung eines Befehls erfolgt, der der Befehlsvariablen bt,i mit dem Wahrheitswert 1 entspricht. Dabei wird also höchstens der Inhalt der gelesenen Bandzelle geändert, alle anderen Symbole bleiben gleich. Außerdem müssen der Zustand und die Kopfposition entsprechend aktualisiert werden. All dies ist in einer KNF U ausdrückbar. 35 Für die Teilformel R brauchen wir eine Zwischenbetrachtung, um auszudrücken, daß von k Aussagenvariablen y1 , . . . , yk genau eine erfüllt ist: Offenbar ist GenauEine(y1 , . . . , yk ) = Mindestens-Eine(y1 , . . . , yk )∧ Höchstens-Eine(y1 , . . . , yk ). Außerdem ist Mindestens-Eine(y1 , . . . , yk ) = (y1 ∨ . . . ∨ yk ) und Höchstens-Eine(y1 , . . . , yk ) = Nicht-Mindestens-Zwei(y1 , . . . , yk ), also Höchstens-Eine(y1 , . . . , yk ) = ¬((y1 ∧ y2 ) ∨ (y1 ∧ y3 ) ∨ . . . (yk−1 ∧ yk )) = ¬yj ). Damit ist die Teilformel Genau-Eine(y1 , . . . , yk ) in KNF. V 1≤i<j≤k (¬yi ∨ R setzt sich nun zusammen aus Genau-Eine-Teilformeln für die Forderung, daß M in jedem Takt t in genau einem Zustand ist, genau eine Bandzelle liest, diese genau ein Symbol enthält und genau ein Befehl angewendet wird. Die Formel Fw = A ∧ U ∧ E ∧ R hat in n = |w| polynomiale Größe (es treten höchstens n3k Variablen auf), und sie ist in polynomialer Zeit konstruierbar. Nun ist noch zu zeigen: M akzeptiert w genau dann, wenn die Formel Fw erfüllbar ist. Wird die Eingabe w von M akzeptiert, so existiert eine akzeptierende Berechnung von M auf w, die höchstens die Länge nk hat. Dann ergibt sich aus der akzeptierenden Berechnung eine erfüllende Belegung mit den entsprechenden Belegungen der Aussagenvariablen in Fw . Ist umgekehrt Fw erfüllbar, so entspricht wegen der Erfülltheit von R jede erfüllende Belegung von Fw einer akzeptierenden Berechnung von M auf w mit nk Schritten. Nun zeigen wir als nächstes, daß auch folgende Variante von SAT NP-vollständig ist: Es sei kSAT := {F | F ist Formel in KNF mit höchstens k Literalen pro Klausel und es existiert eine erfüllende Belegung für F }. Für k = 3 ist also: 3-Satisfiability (3SAT) [LO2]: Gegeben: Eine konjunktive Normalform (KNF) F = C1 ∧ . . . ∧ Cm mit höchstens 3 Literalen pro Klausel. Frage: Gibt es eine erfüllende Belegung von F ? Satz 4.2 3SAT ist NP-vollständig. Beweis: Offensichtlich ist 3SAT in NP; der Beweis geht analog zu dem von SAT in NP. Wir zeigen nun SAT ≤p 3SAT. Es sei F eine KNF und K eine Klausel von F mit den Literalen y1 , . . . , yk , also K = (y1 ∨ . . . ∨ yk ) für k ≥ 4. Es seien z2 , . . . , zk−2 neue Variablen und K ′ die folgende, für K konstruierte Teilformel einer Formel F ′ mit nur noch drei Literalen pro Klausel: K ′ := (y1 ∨ y2 ∨ z2 ) ∧ (¬z2 ∨ y3 ∨ z3 ) ∧ (¬z3 ∨ y4 ∨ z4 ) ∧ . . . ∧ (¬zk−3 ∨ yk−2 ∨ zk−2 ) ∧ (¬zk−2 ∨ yk−1 ∨ yk ). Ist nun b eine Belegung, die K erfüllt, also b(K) = 1, so sei b(yi ) = 1 für ein i ∈ {1, . . . , k}. Ist i = 1 oder i = 2, so setze b′ (zj ) = 0 für alle j ∈ {2, . . . , k − 2}. Ist i = k oder i = k − 1, so setze b′ (zj ) = 1 für alle j ∈ {2, . . . , k − 2}. Ist 2 < i < k − 1, so setze b′ (z2 ) = . . . = b′ (zi−1 ) = 1 und b′ (zi ) = . . . = b′ (zk−2 ) = 0. Dann gilt b′ (K ′ ) = 1. 36 Ist umgekehrt b eine Belegung, die K ′ erfüllt, also b(K ′ ) = 1, so können nicht alle yi mit 0 belegt sein: Sonst wäre b(zi ) = 1 für alle i ∈ {2, . . . , k − 2}, aber dann hat die letzte Klausel den Wert 0 - Widerspruch. Für einen effizienten Algorithmus zur Entscheidung von 2SAT verweisen wir auf das Skript zum Modul Effiziente Graphenalgorithmen. 4.7 Die NP-vollständigen Probleme One-in-Three 3SAT, Set Splitting und Graph 3-Colorability Eine Reihe von weiteren Varianten des Erfüllbarkeitsproblems sind NP-vollständig [15], darunter folgendes Problem: One-in-Three 3SAT [LO4]: Gegeben: Eine konjunktive Normalform (KNF) F = C1 ∧ . . . ∧ Cm mit 3 Literalen pro Klausel. Frage: Gibt es eine erfüllende Belegung von F , die in jeder Klausel genau ein Literal erfüllt? Satz 4.3 One-in-Three 3SAT ist NP-vollständig. Beweis: Der Beweis verwendet eine Formel R(u, v, w), die genau dann erfüllt ist, wenn genau eines der u, v, w erfüllt ist: R(u, v, w) = (u ∨ v ∨ w) ∧ (¬u ∨ ¬v) ∧ (¬u ∨ ¬w) ∧ (¬v ∨ ¬w). Nun wird zu einer KNF F = C1 ∧ . . . ∧ Cm zu jeder Klausel Cj = (x ∨ y ∨ z) eine Formel Fj mit jeweils neuen Variablen aj , bj , cj , dj , ej , fj auf folgende Weise konstruiert: Fj = R(x, aj , dj ) ∧ R(y, bj , dj ) ∧ R(aj , bj , ej ) ∧ R(cj , dj , fj ) ∧ R(z, cj , 0). Es gilt: b(x ∨ y ∨ z) = 1 genau dann, wenn Fj erfüllbar ist (und zwar mit genau einem erfüllten Literal pro Klausel). In der Arbeit [15] von Schaefer, in der die NP-Vollständigkeit dieses und vieler anderer Erfüllbarkeitsprobleme bewiesen wurde, wird sogar gezeigt, daß man auf Negation in den Klauseln verzichten kann. Formuliert man das Problem in dieser Weise, so wird es ein Mengenproblem, das auch den Namen Set Splitting (Problem [SP4] in [5]) hat (in anderem Zusammenhang [10] wird es auch Hypergraph 2-Coloring genannt): Set Splitting [SP4]: Gegeben: Eine endliche Menge S und eine Kollektion C von Teilmengen von S. Frage: Gibt es eine Zerlegung S1 ∪ S2 = S, so daß für alle M ∈ C M ∩ S1 6= ∅ und M ∩ S2 6= ∅ gilt? Satz 4.4 Set Splitting ist NP-vollständig. 37 Beweis: 1) Offensichtlich ist Set Splitting in NP. 2) Die folgende Reduktion von SAT auf Set Splitting zeigt die NP-Vollständigkeit: Es sei F = C1 ∧ . . . ∧ Cm eine KNF mit den Klauseln C1 , . . . , Cm und den Variablen x1 , . . . , xn . Dann setzen wir: Die Grundmenge S = {x1 , . . . , xn } ∪ {¬x1 , . . . , ¬xn } ∪ {f }, wobei f ein neues Symbol sei. Die Kollektion C von Teilmengen von S sei: (i) Für alle i ∈ {1, . . . , n} sei Xi = {xi , ¬xi }. (ii) Für alle j ∈ {1, . . . , m} sei Yj die Menge der Literale in Cj plus zusätzlich das Element f . Wir zeigen: F ist erfüllbar genau dann, wenn (S, C) ∈ Set Splitting: Zu einer Wahrheitswertbelegung b mit b(F ) = 1 definieren wir folgende Zerlegung S1 ∪ S2 von S: Wenn b(xi ) = 1 ist, dann sei xi ∈ S1 und ¬xi ∈ S2 , und wenn b(xi ) = 0 ist, dann sei xi ∈ S2 und ¬xi ∈ S1 . Das Element f sei in S2 . Nun schneidet für jedes i ∈ {1, . . . , n} die Menge {xi , ¬xi } sowohl S1 als auch S2 . Die Menge Yi schneidet S2 in f und S1 , weil die entsprechende Klausel Cj ein erfülltes Literal bei der Belegung b hat. Hat man umgekehrt eine Zerlegung S1 ∪ S2 von S, so daß alle Mengen Xi und Yj beide Mengen S1 und S2 schneiden, so sei ohne Beschränkung der Allgemeinheit f ∈ S2 . Wir definieren auf folgende Weise eine Wahrheitswertbelegung b der Variablen: b(xi ) = 1, falls xi ∈ S1 und b(xi ) = 0, falls xi ∈ S2 . Dies ist eine Wahrheitswertbelegung, da Xi nur zwei Elemente hat und sowohl S1 als auch S2 schneidet. Für alle j ∈ {1, . . . , , m} schneiden die Mengen Yj S1 in einem Element, das von f verscheiden ist. Damit erfüllt b jede Klausel. Lovász [10] hat sogar gezeigt: Set Splitting ist NP-vollständig, wenn alle Teilmengen in C 3-elementig sind. Ebenfalls von Lovász wurde gezeigt, daß daraus die NP-Vollständigkeit des Problems folgt, ob ein gegebener Graph 3-färbbar ist: Es sei G = (V, E) ein endlicher ungerichteter Graph. Eine Zerlegung der Knotenmenge V in unabhängige Mengen V1 , . . . , Vk heißt zulässige k-Färbung von G. Die chromatische Zahl χ(G) von G ist das kleinste k, für das G eine zulässige k-Färbung hat. Offenbar ist G genau dann bipartit, wenn χ(G) ≤ 2 ist. Dies ist leicht zu entscheiden. Viel schwieriger ist die Frage, ob ein gegebener Graph 3-färbbar ist: Graph k-Colorability (Chromatic Number) [GT4]: Gegeben: Ein Graph G = (V, E) und eine positive ganze Zahl k. Frage: Ist χ(G) ≤ k? Satz 4.5 Das Problem der 3-Färbbarkeit von Graphen ist NP-vollständig. 38 x1 F R -x1 x2 T a1 d1 c1 x3 b1 e1 d2 -x2 a2 c2 -x3 x4 -x4 b2 e2 Abbildung 1: Der Graph GF für die Formel F = (x1 ∨ ¬x2 ∨ ¬x3 ) ∧ (¬x1 ∨ x2 ∨ x4 ). Beweis: Das 3-Färbbarkeitsproblem ist offenbar in NP. Nun reduzieren wir 3SAT auf das 3-Färbbarkeitsproblem wie folgt: Zu gegebener KNF F = C1 ∧. . .∧Cm konstruieren wir einen Graphen GF , der die Knoten T, F, R hat (die gleichzeitig als Farben T, F, R bzw. grün, blau, rot aufgefaßt werden), die ein Dreieck bilden. Außerdem hat GF die Knoten xi , −xi zu jeder Variablen xi , und {xi , −xi } bilden jeweils eine Kante. Die Knoten xi , −xi werden alle mit dem Knoten R durch eine Kante verbunden. Schließlich gibt es zu jeder Klausel Cj die Knoten aj , bj , cj , dj , ej , wobei die Knoten aj , bj , cj ein Dreieck bilden, und {cj , dj } sowie {dj , ej } sind Kanten. Die Knoten dj und ej werden jeweils durch eine Kante mit dem Knoten T verbunden. Außerdem sind die Knoten aj , bj , ej die Kontaktknoten zu den Literalknoten der jeweiligen Klausel Cj , d.h., aj bekommt eine Kante zum ersten Literalknoten, bj eine Kante zum zweiten und ej eine Kante zum dritten Literalknoten von Cj . Ein Beispiel ist in Abbildung 1 für die Formel F = (x1 ∨ ¬x2 ∨ ¬x3 ) ∧ (¬x1 ∨ x2 ∨ x4 ) gegeben. Behauptung: F ist genau dann erfüllbar, wenn GF 3-färbbar ist. Dabei ist von entscheidender Bedeutung, daß der Teilgraph, der durch die Klauselknoten aj , bj , cj , dj , ej zusammen mit T und den Literalknoten induziert wird, nicht 3-färbbar ist, wenn die Farben der drei Literalknoten alle F sind (da die Literalknoten alle zu R adjazent sind, kommt bei einer 3-Färbung nur T und F in Frage). In allen übrigen Fällen gibt es eine 3-Färbung. 39 Ist F erfüllbar, so bekommt mindestens ein Literalknoten pro Klausel die Farbe T , und damit ist GF 3-färbbar. Ist umgekehrt GF 3-färbbar, so gibt es in jeder Klausel mindestens einen Literalknoten mit Farbe T , und damit läßt sich eine erfüllende Belegung für F definieren. 4.8 Die Probleme Vertex Cover, Maximum Independent Set und Maximum Clique In Konfliktgraphen, in denen Kanten zwischen Knoten existieren, die um gemeinsame Ressourcen konkurrieren, ist es wichtig, konfliktfreie Knotenmengen zu betrachten. Diese heißen in der folgenden Definition unabhängige Knotenmengen. Definition 4.1 Es sei G = (V, E) endlicher ungerichteter Graph. (1) Eine Knotenmenge U ⊆ V heißt unabhängige Knotenmenge, wenn für alle x, y ∈ U xy ∈ / E gilt. Es bezeichne α(G) die maximale Größe einer unabhängigen Knotenmenge in G. (2) Analog heißt eine Knotenmenge Clique in G, falls sie im Komplementgraphen G unabhängige Knotenmenge ist. Es bezeichne ω(G) die maximale Größe einer Clique in G. (3) Eine Knotenmenge U ⊆ V heißt Knotenüberdeckung (vertex cover, Überdeckung aller Kanten durch Knoten), wenn für alle Kanten e ∈ E gilt: e ∩ U 6= ∅. Es bezeichne β(G) die kleinste Größe einer Knotenüberdeckung von G. Das Problem, ein möglichst kleines vertex cover eines Graphen zu bestimmen, ist eines der wichtigsten Graphenprobleme. Um dies zu illustrieren, geben wir folgendes Beispiel an: Die Matrix in Abbildung 2 zeigt mit dem Symbol ? markierte Zellen, die fehlerhaft sind und durch Austausch von (möglichst wenigen) ganzen Zeilen oder Spalten repariert werden sollen. Die fehlerhaften Zellen werden in Abbildung 2 durch Kanten in einem (bipartiten) Graphen B = (X, Y, E) dargestellt mit den Knotenmengen X = {x1 , x3 , x4 , x7 } (für die Zeilen, die eine fehlerhafte Zelle enthalten) sowie Y = {y1 , y2 , y4, y7 , y9 } (für die Spalten, die eine fehlerhafte Zelle enthalten). Es ist xi yj ∈ E genau dann, wenn die Zelle in Zeile i und Spalte j fehlerhaft ist; so ist z.B. x1 y4 ∈ E. Das Problem der Überdeckung aller fehlerhaften Zellen durch Zeilen bzw. Spalten entspricht also genau dem Problem, ein vertex cover in B zu bestimmen; z.B. ist x4 , y1 , y4 , y9 ein vertex cover, dargestellt durch die eingekreisten Knoten in Abbildung 2. Eigenschaft 4.1 Es sei G = (V, E) ungerichteter endlicher Graph. Dann gilt: S ⊆ V ist genau dann unabhängige Knotenmenge, wenn V \ S Knotenüberdeckung ist. 40 Beweis. Ist S unabhängig, so gilt für jede Kante e = uv ∈ E für die Knoten u ∈ V \ S oder v ∈ V \ S, d.h. V \ S ist Knotenüberdeckung und umgekehrt. Es ist also α(G) = ω(G) und α(G) + β(G) = |V |. Dies zeigt, wie eng alle drei Begriffe zusammenhängen. Leider sind die folgenden Probleme NP-vollständig: Vertex Cover [GT1]: Gegeben: Ein Graph G = (V, E) und eine positive ganze Zahl k. Frage: Gibt es eine Knotenüberdeckung von G mit ≤ k Knoten? Maximum Independent Set [GT20]: Gegeben: Ein Graph G = (V, E) und eine positive ganze Zahl k. Frage: Gibt es eine unabhängige Knotenmenge von G mit ≥ k Knoten? Maximum Clique [GT19]: Gegeben: Ein Graph G = (V, E) und eine positive ganze Zahl k. Frage: Gibt es eine Clique von G mit ≥ k Knoten? Satz 4.6 VERTEX COVER ist NP-vollständig. Beweis. Daß VERTEX COVER in NP liegt, läßt sich leicht zeigen, indem in nichtdeterministischer Polynomialzeit eine Teilmenge V ′ ⊆ V mit |V ′ | ≤ k “geraten” wird und anschließend in (deterministischer) Polynomialzeit geprüft wird, ob die geratene Menge V ′ eine Knotenüberdeckung von G darstellt. Es existiert genau dann ein erfolgreicher Berechnungsweg, wenn der Graph eine Knotenüberdeckung V ′ mit |V ′ | ≤ k besitzt. Wir zeigen nun: 3SAT ≤p VERTEX COVER: 1 2 3 4 5 6 7 1 2 ? 3 4 ? 5 6 7 8 9 ? x1 x3 ? ? ? ? x4 x7 ? ? y1 y2 y4 y7 y9 Abbildung 2: Ein reconfigurable array mit fehlerhaften Zellen und der dazugehörige bipartite Graph. 41 x1 a1 -x1 x2 b1 -x2 c1 x3 a2 -x3 b2 x4 c2 -x4 Abbildung 3: Der Graph GF für die Formel F = (x1 ∨ ¬x3 ∨ ¬x4 ) ∧ (¬x1 ∨ x2 ∨ ¬x4 ). Es sei F = C1 ∧ . . . ∧ Cm eine KNF mit den Variablen x1 , . . . , xn und höchstens 3 Literalen pro Klausel: O.B.d.A. enthalte jede Klausel genau drei Literale – ist dies nicht der Fall, so lassen sich die Klauseln in aussagenlogisch äquivalenter Weise leicht auf diese Zahl erweitern. Wir konstruieren einen Graphen GF = (V, E) wie folgt: (1) Für jede Variable xi , i ∈ {1, . . . , n}, enthält GF eine Kante {xi , −xi }. (2) Für jede Klausel Cj , j ∈ {1, . . . , m}, enthält GF ein Dreieck mit den Knoten aj , bj , cj . (3) Die Knoten aj , bj , cj werden jeweils durch eine Kante mit den jeweiligen Literalknoten von Cj verbunden, und zwar aj mit dem ersten, bj mit dem zweiten und cj mit dem dritten Literalknoten von Cj . Diese Kanten heißen Verbindungskanten. Ein Beispiel ist in Abbildung 3 gegeben. Behauptung: F ist genau dann erfüllbar, wenn der Graph GF ein vertex cover mit n + 2m Knoten hat. a) Falls V ′ Knotenüberdeckung von GF ist, enthält V ′ von jeder Kante {xi , −xi } mindestens einen Knoten, d.h. mindestens n solche Knoten, und von jedem Dreieck mit den Knoten aj , bj , cj mindestens 2 Knoten, d.h. mindestens 2m solche Knoten. Jede Knotenüberdeckung von GF hat also mindestens n + 2m Knoten. b) Ist b eine erfüllende Belegung von F , so wähle für ein vertex cover bei den Kanten {xi , −xi } diejenigen Knoten, die erfüllten Literalen entsprechen. Diese überdecken gewisse Verbindungskanten mit. Es sind also nur noch jeweils zwei Knoten in jedem der m Dreiecke geeignet zu wählen, um alle Kanten zu überdecken. 42 c) Existiert eine Knotenüberdeckung V ′ mit n + 2m Knoten, so setze b(xi ) = 1 genau dann, wenn xi ∈ V ′ ist. Da V ′ Knotenüberdeckung ist, also die Verbindungskanten mit überdeckt, aber aus jedem Sunter (2) definierten Dreieck nur 2 Knoten enthält, überdeckt ein Knoten aus V ′ ∩ ni=1 {xi , −xi } jeweils eine Verbindungskante mit, d.h. Cj wird bei b erfüllt, j ∈ {1, . . . , m}. Also ist b eine erfüllende Belegung von F . Der maximale Grad in dem Graphen GF der obigen Konstruktion ist im allgemeinen nicht durch eine Konstante beschränkt. Garey, Johnson und Stockmeyer [6] haben jedoch sogar folgende Verschärfung bewiesen: Satz 4.7 VERTEX COVER ist NP-vollständig für planare Graphen G mit Knotengrad 3 aller Knoten. Die NP-Vollständigkeit von VERTEX COVER bedeutet nicht, daß das oben beschriebene Problem der Fehlerkorrektur bei reconfigurable arrays auch NP-vollständig ist: Aus einem Satz von D. König (siehe z.B. [3]) folgt, daß das VERTEX COVER Problem auf bipartiten Graphen (als eine Anwendung von Maximalflußalgorithmen) in Polynomialzeit lösbar ist. 4.9 Die Kantenfärbungszahl Es sei G = (V, E) Graph. Eine Zerlegung E1 , . . . , Ek von E heißt (zulässige) Kantenfärbung von G, falls gilt: für alle i ∈ {1, . . . , k} ist Ei matching in G (d.h. keine zwei Kanten gleicher Farbe haben einen Knoten gemeinsam). Wir definieren die minimale Zahl von Kantenfarben in einer zulässigen Kantenfärbung von G als den chromatischen Index von G: χE (G) = min{k | es existiert eine Kantenfärbung E1 , . . . , Ek von G} ist der chromatische Index von G. Satz 4.8 (König 1916) Ist B = (X, Y, E) paarer Graph mit Maximalgrad ∆(B), so ist χE (B) = ∆(B). Der folgende Satz zeigt, daß erstaunlicherweise für beliebige Graphen G die Kantenfärbungszahl höchstens ∆(G) + 1 sein kann: Satz 4.9 (Vizing 1964) Ist G = (V, E) Graph, so gilt χE (G) = ∆(G) oder χE (G) = ∆(G) + 1. Ein kurzer und konstruktiver Beweis des Satzes von Vizing wird in [12] gegeben. Die Entscheidung der Frage, welcher der beiden Fälle für χE (G) eintritt, ist ein weiteres NP-vollständiges Problem: Chromatic Index: 43 Gegeben: Ein Graph G = (V, E). Frage: Ist χE (G) = ∆(G) oder χE (G) = ∆(G) + 1? Ein Graph heißt kubisch, wenn alle seine Knoten den Grad 3 haben. Satz 4.10 (Holyer 1981) Graphen. CHROMATIC INDEX ist NP-vollständig für kubische Der Beweis beruht auf einer nichttrivialen Reduktion von 3SAT. 4.10 Das Problem 3-Dimensional Matching Bekanntlich ist das Problem Perfect Matching in bipartiten Graphen (bzw. das Problem, ein Maximum Matching in einem bipartiten Graphen zu finden), effizient lösbar. Es ist auch unter dem Namen “Heiratsproblem” bekannt. Folgende Verallgemeinerung auf drei “Geschlechter” ist NP-vollständig: 3-Dimensional Matching (3DM) [SP1]: Gegeben: Disjunkte endliche Mengen W, X, Y mit |W | = |X| = |Y | = q und M ⊆W ×X ×Y. Frage: Existiert M ′ ⊆ M mit |M ′ | = q und keine zwei Tripel in M ′ haben ein Element gemeinsam? In [5] ist eine Reduktion von 3SAT auf 3DM angegeben, die zeigt: Satz 4.11 Das Problem 3DM ist NP-vollständig. 4.11 Die Probleme Partition und Bin Packing Folgende Probleme lassen sich als Probleme über gewichteten Mengen interpretieren und sind ebenfalls NP-vollständig: Partition [SP12]: Gegeben: Eine endliche Menge U und eine Funktion s, die jedem Element u ∈ U eine natürliche Zahl s(u) zuordnet. Frage: Existiert eine Zerlegung U = U1 ∪ U2 mit Σu∈U1 s(u) = Σu∈U2 s(u)? In [5] ist eine Reduktion von 3DM auf Partition angegeben, die zeigt: Satz 4.12 Das Problem Partition ist NP-vollständig. Bin Packing [SR1]: 44 Gegeben: Eine endliche Menge U und eine Funktion s, die jedem Element u ∈ U eine natürliche Zahl s(u) zuordnet, sowie natürliche Zahlen B und k. Frage: Existiert eine Zerlegung U = U1 ∪ . . . ∪ Uk mit Σu∈Ui s(u) ≤ B für alle i ∈ {1, . . . , k}? Bin Packing soll ein Packungsproblem ausdrücken, bei dem Kisten einheitlicher Größe B mit den Objekten aus U gefüllt werden sollen, wobei das Ziel ist, möglichst wenig Kisten zu brauchen, also k zu minimieren. Es enthält als Spezialfall das Problem Partition und ist daher NP-vollständig: Satz 4.13 Das Problem Bin Packing ist NP-vollständig. 4.12 Approximative Lösung von Optimierungsproblemen Da man sich mit der Feststellung der NP-Vollständigkeit eines wichtigen Problems nicht zufrieden geben kann, versucht man, mittels geeigneter Heuristiken Optimierungsprobleme approximativ zu lösen. Dabei gibt es eine Reihe von Problemen, die Approximationen erlauben, welche nur einen konstanten Faktor t vom Optimum entfernt sind, also bei Minimierungsproblemen höchstens das t-fache des Optimums erzielen. Ein Beispiel ist das Problem Vertex Cover: Folgende Heuristik liefert ein vertex cover U: 1. U := ∅. 2. Wähle wiederholt eine Kante xy ∈ E und füge x und y zu U hinzu sowie streiche alle Kanten, die mit x bzw. y inzident sind, bis der Restgraph leer ist. Da man auf diese Weise bei der Wahl der Kanten ein matching M erzeugt und jedes vertex cover von G mindestens M Knoten enthalten muß, die Lösung also höchstens doppelt so schlecht ist wie das Optimum, ist die Approximationsgüte 2. Man weiß sogar Approximationen mit etwas besserem Wert als Faktor 2 sowie eine untere Schranke siehe das Kompendium von Viggo Kann zu Approximation auf seiner homepage. Ein anderes wichtiges Beispiel ist die approximative Lösung von Bin Packing: Es sei U = {u1 , . . . , uj . Die First-Fit-Heuristik wählt jeweils eine am weitesten links befindliche Kiste, die noch ausreichend Platz hat, um das Objekt ui aufzunehmen. Dabei braucht man höchstens zweimal so viel wie das Optimum angibt, denn höchstens eine Kiste bleibt bei diesem Vorgehen (mindestens) halbleer: Wären es zwei, so wäre ein Objekt der weiter rechts stehenden in die weiter links stehende Kiste gekommen, was ein Widerspruch ist. Dieses Problem wird in [5] ausführlich beschrieben. Bei der FFD-Heuristik werden zuerst die Elemente aus U nach absteigender Größe als s(u1 ) ≥ s(u2) ≥ . . . s(uk′ ) geordnet, und dann wird wie bei der First-Fit-Heuristik verfahren. Mittlerweile weiß man, daß die FFD-Heuristik die Approximationsgüte 3/2 hat. Außerdem weiß man: Wenn P 6= NP gilt, so existiert kein Polynomialzeitalgorithmus, der 45 das Problem Bin Packing mit einer Approximationsgüte von < 3/2 löst. In dem Buch von Jansen und Margraf [8] ist dies und vieles andere ausführlich beschrieben. 4.13 Graphisomorphie Von dem folgenden Problem der Graphisomorphie ist die Komplexität bisher nicht bekannt, obwohl sehr viele Arbeiten sich mit diesem wichtigen Problem beschäftigt haben. Dabei heißen Graphen G1 = (V1 , E1 ) und G2 = (V2 , E2 ) isomorph, falls eine Bijektion f von V1 auf V2 existiert mit der Eigenschaft: xy ∈ E1 ⇐⇒ f (x)f (y) ∈ E2 . Graphisomorphie: Gegeben: Endliche ungerichtete Graphen G1 und G2 . Frage: Sind G1 und G2 isomorph? Das folgende Problem ist als NP-vollständig bekannt: Subgraph Isomorphism [GT48]: Gegeben: Endliche ungerichtete Graphen G1 = (V1 , E1 ) und G2 = (V2 , E2 ). Frage: Enthält G1 einen Teilgraphen G′1 , der isomorph zu G2 ist? Siehe [5] für dieses Problem und eine ausführliche Diskussion der Varianten. 5 Ausblick Im Masterstudium Informatik in Rostock wird im Modul “Algorithmen und Komplexität” das Thema der algorithmischen Komplexität von Problemen sowie die Eigenschaften grundlegender Komplexitätsklassen vertieft. In [14, 18] werden die Grundlagen der Komplexitätstheorie beschrieben und u.a. Hierarchiesätze für Raum und Zeit angegeben, die zu beliebig schwierigen Probleme führen. 46 Literatur [1] A.V. Aho, J.E. Hopcroft, J.D. Ullman, The Design and Analysis of Computer Algorithms, Addison Wesley, 1974 [2] N. Blum, Theoretische Informatik, Oldenbourg 1998 [3] T.H. Cormen, C.E. Leiserson, R.L. Rivest, Introduction to Algorithms, MIT Press – McGraw Hill, 1990 [4] S. Even, Graph Algorithms, Computer Science Press, Potomac, Maryland, 1979 [5] M.R. Garey, D.S. Johnson, Computers and Intractability: A Guide to the Theory of NP–Completeness, W.H. Freeman, 1979 [6] M.R. Garey, D.S. Johnson, L. Stockmeyer, Some simplified NP-complete graph problems, Theor. Computer Science 1 (1976) 237-267 [7] J.E. Hopcroft, J.D. Ullman, Introduction to Automata Theory, Languages and Computation, Addison–Wesley 1979 (auch in neueren Auflagen sowie in deutscher Übersetzung erschienen) [8] K. Jansen, M. Margraf, Approximative Algorithmen und Nichtapproximierbarkeit, de Gruyter, 2008 [9] J. van Leeuwen, Hrsg., Handbook of Theoretical Computer Science, Elsevier, MIT Press 1990 [10] L. Lovász, Coverings and Colorings of Hypergraphs, Proceedings 4th Southeastern Conf. on Combinatorics, Graph Theory and Computing, 1973 [11] K. Mehlhorn, Graph Algorithms and NP–Completeness (Band 2 von: Data Structures and Algorithms), Springer, 1984 [12] J. Misra, D. Gries, A constructive proof of Vizing’s Theorem, Inf. Processing Letters 41 (1992) 131-133 [13] C.H. Papadimitriou, K. Steiglitz, Combinatorial Optimization: Algorithms and Complexity, Prentice Hall, 1982 [14] K.R. Reischuk, Einführung in die Komplexitätstheorie, B.G. Teubner Stuttgart, 1990 [15] T.J. Schaefer, The complexity of satisfiability problems, Proceedings 10th Annual ACM Symposium on Theory of Computing, 216-226, 1978 [16] U. Schöning, Theoretische Informatik – kurzgefaßt, Spektrum Akademischer Verlag 1995 47 [17] K. Wagner, Theoretische Informatik – Grundlagen und Modelle, Springer Lehrbuch 1994 [18] G. Wechsung, Vorlesungen zur Komplexitätstheorie, B.G. Teubner Stuttgart, 2000 [19] I. Wegener, Theoretische Informatik, B.G. Teubner Stuttgart 1993 48