Modul Berechenbarkeit und Komplexität Inhaltsverzeichnis

Werbung
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
Herunterladen