Kapitel 7: Berechenbarkeit § 7.1 Das Halteproblem in JAVA § 7.2 Entscheidbarkeit und Aufzählbarkeit § 7.3 GOTO-Programme § 7.4 Turingmaschinen § 7.5 Berechenbare Funktionen auf den natürlichen Zahlen § 7.6 Das Halteproblem für GOTO-Programme § 7.7 Die Unentscheidbarkeit der Logik der ersten Stufe 539 § 7.1 Das Halteproblem in JAVA 540 Automatische Verifikation von Software Ziel Automatische (d.h., so weit wie möglich computergestützte) Verifikation von Programmen. Zwei Arten von Fehlern in Programmen: Spezifische Fehler Ein Programm tut nicht das, was es soll, d.h., es genügt nicht seiner Spezifikation. Automatisches Erkennen solcher Fehler scheint schwierig und erfordert zumindest auch eine vollständige Formalisierung der Spezifikation. Diese ist auch wieder fehleranfällig! Generische Fehler Ein Programm tut gar nichts, d.h., es stürzt ab“ und hält mit einer ” Fehrmeldung an, oder es hält gar nicht an. Automatisches Erkennen solcher Fehler scheint auf den ersten Blick leichter. 541 Das Halteproblem Problem Entscheide, ob ein gegebenes Programm bei jeder Eingabe irgendwann anhält (d.h., dass das Programm niemals in eine Endlosschleife läuft). Ziel Ein Programm für das Halteproblem. 542 Eine konkrete Spezifikation des Halteproblems in JAVA Eingabe: Ausgabe: String method (Name der zu überprüfenden JAVA-Methode) Array parameters von Objekten (die Parameter, die an die Methode übergeben werden) true, falls method wirklich eine Methode in einer verfügbaren Klasse bezeichnet, parameters die richtige Zahl von Parametern mit den richtigen Typen enthält und die Methode method bei Eingabe parameters (irgendwann) anhält, false sonst. 543 In JAVA: class Halt { ... static boolean halt(String method, Object[] parameters) { ... } ... } Wir können annehmen, dass die Methode halt Zugriff auf den Quellcode von method hat. 544 Die Unentscheidbarkeit des Halteproblems Satz 7.1 Es gibt kein JAVA-Programm, das das Halteproblem löst. 545 Beweis von Satz 7.1 Angenommen, es gibt ein Programm, das das Halteproblem löst. Wir können annehmen, dass dies mittels einer Methode static boolean halt(String method,Object[] parameters) in einer Klasse Halt geschieht. Wir definieren eine neue Methode diag in einer Klasse Diag: class Diag{ static void diag(String method) { Object[] parameters = { method }; // Eingaben bestehen nur aus // dem einen String method. if ( Halt.halt(method,parameters) ) { while ( true ) {}; // Wenn Methode method bei // Eingabe method hält, // dann laufe in Endlosschleife. } } } 546 Was passiert beim Aufruf Diag.diag("foo") wenn foo der Name einer Methode ist, die einen String als Parameter erwartet? ⇐⇒ ⇐⇒ diag.diag("foo") hält Halt.halt("foo",{"foo"}) gibt false zurück foo("foo") hält nicht. Also beim Aufruf Diag.diag("Diag.diag"): ⇐⇒ Diag.diag("Diag.diag") hält Diag.diag("Diag.diag") hält nicht. Widerspruch! 547 § 7.2 Entscheidbarkeit und Aufzählbarkeit 548 Ein informeller Algorithmenbegriff Eigenschaften von Algorithmen (oder Berechnungsverfahren) I I I I Ein Algorithmus ist eine schrittweise Anleitung (ein Kochrezept“) ” zur Lösung eines Problems. Ein Algorithmus lässt sich von einem geeignet programmierten Computer ausführen. Ein Algorithmus verarbeitet möglicherweise ein oder mehrere Eingaben und produziert möglicherweise ein oder mehrere Ausgaben. Führt man einen Algorithmus aus, so ist die Ausführung möglicherweise nach endlich vielen Schritten beendet (wir sagen, der Algorithmus hält), oder die Ausführung ist nie beendet. 549 Beispiele 1. Der Davis-Putnam Algorithmus zum Testen von Erfüllbarkeit von aussagenlogischen Formeln. Eingabe: Endliche Menge von aussagenlogischen Klauseln. Ausgabe: Erfüllbar“ oder unerfüllbar“. ” ” 2. Das algebraische Verfahren zum Testen von Äquivalenz von Aussagenlogischen Formeln. Eingabe: Aussagenlogische Formeln α und α 0 . Ausgabe: Äquivalent“, möglicherweise hält der Algorithmus aber ” gar nicht an. 3. Der Auswertungsalgorithmus für σ-Formeln in endlichen Strukturen. Eingabe: Endliche σ-Struktur A, σ-Formel ϕ(x1 , . . . , xn ). Ausgabe: ϕ(A). 550 Repräsentation durch Zeichenketten Ein- und Ausgaben von Algorithmen sind endliche“ Objekte. Alle ” endlichen Objekte lassen sich als Wörter über einem endlichen Alphabet darstellen. Computer repräsentieren intern alle Objekte als Bitfolgen, also als Wörter über dem Alphabet {0, 1}. Definition 7.2 Seien A, B endliche Alphabete. 1. Ein Entscheidungsproblem über A ist eine Teilmenge P ⊆ A∗ . 2. Ein funktionales Problem über A, B ist eine partielle Funktion von A∗ nach B ∗ . 551 Beispiele von Entscheidungsproblemen Das Primzahlproblem. Wir kodieren natürliche Zahlen in Binärdarstellung, d.h., als Wörter über dem Alphabet {0, 1}. Dann ist das Primzahlproblem folgendes Entscheidungsproblem über {0, 1}: Pprim := {n ∈ {0, 1}∗ | n ist Primzahl} 552 Das Graphenzusammenhangsproblem. Wir kodieren Graphen in geeigneter Weise als Wörter über dem Alphabet {0, 1}, d.h. wir definieren eine injektive Abbildung κ, die jedem Graphen G (auf natürliche Weise“) ein Wort κ(G) über {0, 1} ” zuordnet. Das Zusammenhangsproblem ist folgendes Entscheidungsproblem über {0, 1}: PZus := g ∈ {0, 1}∗ Es gibt einen zusammenhängenden Graphen G, so dass g = κ(G) . 553 Das aussagenlogische Erfüllbarkeitsproblem. Wir betrachten aussagenlogische Formeln in ASCII-Syntax, d.h., als Wörter über dem Alphabet ASCII. Dann ist das aussagenlogische Erfüllbarkeitsproblem folgendes Entscheidungsproblem über ASCII: PAL-Erf := α ∈ ASCII∗ α ∈ AL, α ist erfüllbar . 554 Das Allgemeingültigkeitsproblem für σ-Sätze Ähnlich wie aussagenlogische Formeln können wir auch σ-Formeln eine ASCII-Syntax geben (Symbole können wir etwa als Wörter kodieren, die aus eine Punkt gefolgt von Buchstaben und Zahlen bestehen). Das Allgemeingültigkeitsproblem für σ-Sätze ist folgendes Problem über dem Alphabet ASCII: Pσ-Allg := ϕ ∈ ASCII∗ ϕ ist allgemeingültiger σ-Satz . 555 Entscheidbarkeit Definition 7.3 Seien A ein endliches Alphabet und P ⊆ A∗ ein Entscheidungsproblem über A. 1. Ein Algorithmus A entscheidet P (oder: ist ein Entscheidungsalgorithmus für P), wenn er bei Eingabe x ∈ A∗ hält und ein y ∈ A∗ ausgibt, so dass y 6= ε falls x ∈ P, y = ε falls x 6∈ P. 2. P heißt entscheidbar, falls es einen Algorithmus gibt, der P entscheidet. 556 Beispiele 1. Das Primzahlproblem Pprim ist entscheidbar. 2. Das Graphenzusammenhangsproblem PZus ist entscheidbar. 3. Das aussagenlogische Erfüllbarkeitsproblem PAL-Erf ist entscheidbar. 4. Lσ , aufgefasst als Entscheidungsproblem über ASCII, ist entscheidbar. 557 Aufzählbarkeit Definition 7.4 Seien A ein endliches Alphabet und P ⊆ A∗ ein Entscheidungsproblem über A. 1. Ein Algorithmus A ist ein Aufzählungsalgorithmus für P, wenn er in Gang gesetzt nach und nach genau die Wörter aus P ausgibt (in irgendeiner Reihenfolge, eventuell mit Wiederholungen). 2. P heißt aufzählbar, wenn es ein Aufzählungsalgorithmus für P gibt. Achtung! Aufzählbar und abzählbar (im Sinne der Mengenlehre) sind nicht dasselbe. Ist A ein endliches Alphabet, so ist jede Teilmenge von A∗ abzählbar, d.h., endlich oder abzählbar unendlich, aber es gibt nicht für jede Teilmenge von A∗ einen Aufzählungsalgorithmus. 558 Aufzählbarkeit aller Wörter über einem endlichen Alphabet Lemma 7.5 Sei A ein endliches Alphabet. Dann ist A∗ (aufgefasst als Entscheidungsproblem über A) aufzählbar. Ein Aufzählungsalgorithmus für A∗ : 1. M := {ε} 2. Ausgabe ε 3. Wiederhole folgende Schritte: 4. M 0 := ∅ 5. Für alle x ∈ M 6. Für alle a ∈ A 7. M 0 := M 0 ∪ {xa} 8. Ausgabe xa 9. M := M 0 559 Aufzählbarkeit von Lσ Lemma 7.6 Lσ ist aufzählbar. Aufzählungsalgorithmus für Lσ : 1. Für alle x ∈ ASCII∗ // Verwende Aufzählungsalgorithmus für ASCII∗ 2. 3. Wenn x ∈ Lσ dann // Verwende Entscheidungsalgorithmus für Lσ Ausgabe x 560 Entscheidbarkeit vs Aufzählbarkeit 1 Satz 7.7 Jedes entscheidbare Problem ist aufzählbar. Beweis: Sei A ein endliches Alphabet und P ⊆ A∗ entscheidbar. Dann ist folgender Algorithmus ein Aufzählungsalgorithmus für P: 1. Für alle x ∈ A∗ // Verwende Aufzählungsalgorithmus für A∗ 2. 3. Wenn x ∈ P dann // Verwende Entscheidungsalgorithmus für P Ausgabe x 561 Aufzählbarkeit der σ-BS Beweise Beweise im System σ-BS sind endliche Tupel von Formeln, wir können sie also auch als Wörter über dem Alphabet ASCII auffassen. Lemma 7.8 Das Entscheidungsproblem Pσ-BS := x ∈ ASCII∗ x σ-BS Beweis ist entscheidbar. Korollar 7.9 Pσ-BS ist aufzählbar. 562 Aufzählbarkeit der allgemeingültigen σ-Sätze Satz 7.10 Pσ-Allg , das Allgemeingültigkeitsproblem für σ-Sätze, ist aufzählbar. Aufzählungsalgorithmus für Pσ-Allg : 1. Für alle σ-BS Beweise (ϕ1 , . . . , ϕ` ) // Verwende Aufzählungsalgorithmus für Pσ-BS 2. 3. Wenn frei(ϕ` ) = ∅ dann Ausgabe ϕ` 563 Entscheidbarkeit vs Aufzählbarkeit 2 Satz 7.11 Sei A ein endliches Alphabet und P ⊆ A∗ , so dass P und A∗ \ P aufzählbar sind. Dann ist P entscheidbar. Beweis: Sei A ein Aufzählungsalgorithmus für P und B ein Aufzählungsalgorithmus für A∗ \ P. Folgender Algorithmus entscheidet P: Eingabe: x ∈ A∗ . 1. Führe abwechselnd jeweils einen Schritt von A und einen Schritt von B aus. 2. 3. 4. 5. Immer wenn A ein Wort y ∈ A∗ ausgibt, teste, ob x = y. Wenn ja, halte mit irgendeiner Ausgabe 6= ε. Immer wenn B ein Wort y ∈ A∗ ausgibt, teste, ob x = y. Wenn ja, halte mit Ausgabe ε. Der Algorithmus hält immer, weil entweder w ∈ P oder w ∈ A∗ \ P und damit A bzw. B irgendwann w ausgibt. 564 Semi-Entscheidbarkeit Definition 7.12 Seien A ein endliches Alphabet und P ⊆ A∗ ein Entscheidungsproblem über A. 1. Ein Algorithmus A ist ein Semi-Entscheidungsalgorithmus für P, wenn er bei Eingabe x ∈ A∗ genau dann hält, wenn x ∈ P. 2. P heißt semi-entscheidbar, falls es einen Semi-Entscheidungsalgorithmus für P gibt. 565 Semi-Entscheidbarkeit vs Aufzählbarkeit Satz 7.13 Ein Entscheidungsproblem ist genau dann semi-entscheidbar, wenn es aufzählbar ist. 566 Berechenbare Funktionen Definition 7.14 Seien A, B endliche Alphabete und F eine partielle Funktion von A∗ nach B ∗ . 1. Ein Algorithmus A berechnet F (oder: ist ein Berechnungsalgorithmus für F ), wenn er bei Eingabe x ∈ A∗ genau dann hält, wenn x ∈ def(F ), und dabei F (x) ausgibt. 2. F heißt berechenbar, falls es einen Algorithmus gibt, der F berechnet. 567 Berechenbarkeit vs Entscheidbarkeit Satz 7.15 Sei A ein endliches Alphabet und P ⊆ A∗ ein Entscheidungsproblem. Die Funktion cP : A∗ → {0, 1}∗ sei definiert durch 1 falls x ∈ P, cP (x) := 0 sonst, für x ∈ A∗ . Man bezeichnet cP als die charakteristische Funktion von P. Dann gilt: P ist entscheidbar ⇐⇒ cP is berechenbar. 568 Berechenbarkeit vs Semi-Entscheidbarkeit Satz 7.16 Sei A ein endliches Alphabet, a ∈ A und P ⊆ A∗ ein Entscheidungsproblem. Die partielle Funktion dP von A∗ nach {0, 1}∗ sei definiert durch 1 falls x ∈ P, dP (x) := undefiniert sonst, für x ∈ A∗ . Dann gilt: P ist semi-entscheidbar ⇐⇒ dP is berechenbar. 569 Ansätze zur Präzisierung des Algorithmenbegriffs Historisch vor den ersten Computern: I Rekursive Funktionen (Gödel 1934, Kleene 1936) I I Turingmaschinen (Turing 1936) λ-Kalkül (Church 1936) I Postsche Korrespondenzsysteme (Post 1936) An Computern und Programmiersprachen orientierte Algorithmenbegriffe: I Registermaschinen I WHILE- oder GOTO-Sprachen Programmiersprachen wie JAVA oder C. I 570 Alan Turing (1912–1954) Alonzo Church (1903–1995) 571 Emil Post (1897–1954) Stephen Cole Kleene (1909–1994) 572 Die Church-Turingsche These Satz 7.17 Alle genannten Präzisierungen des Algorithmenbegriffs führen zur selben Klasse von berechenbaren Funktionen (und damit zu den selben Klassen von entscheidbaren und aufzählbaren Problemen). Church-Turingsche These Der intuitive Algorithmenbegriff führt zur selben Klasse von berechenbaren Funktionen wie die genannten Präzisierungen. 573 § 7.3 GOTO-Programme 574 Syntax der GOTO-Sprache Arbeitsalphabet: A (endliches Alphabet) Variablen: Var = {v0 , v1 , v2 , . . .} Anweisungen (über A): I Verlängerungsanweisung. Für i ∈ N und a ∈ A: vi ← vi + a I Verkürzungsanweisung. Für i ∈ N: vi ← vi − I Sprunganweisung. Für s ∈ N: GOTO s I Leerheitstest. Für i, s ∈ N: IF vi = ε GOTO s Buchstabentest. Für i, s ∈ N und a ∈ A: IF vi ?a GOTO s I 575 Programme Sei A ein endliches Alphabet. Ein GOTO-Programm (über A) ist ein Tupel (Z0 , . . . , Zr ) von Anweisungen über A. Beispiel 7.18 Ein Programm über dem Alphabet {a}: ` ´ IF v0 = ε GOTO 5, v0 ← v0 −, v1 ← v1 + a, v1 ← v1 + a, GOTO 0 Um die Lesbarkeit zu erhöhen, geben wir den Programmen Namen und notieren Sie zeilenweise: Beispiel-1 0. IF v0 = ε GOTO 5 1. v0 ← v0 − 2. v1 ← v1 + a 3. v1 ← v1 + a 4. GOTO 0 576 Semantik von GOTO-Programmen (intuitiv) Programme laufen auf Registermaschinen Programm ... 0 ... 1 ... 2 ... v4 v3 v2 Z Zeilenzähler Recheneinheit v1 v0 Register So lange der Zähler auf einer gültigen Programmzeile steht, wird die Anweisung in dieser Zeile ausgeführt und der Speicher und Zähler entsprechend verändert. 577 Bedeutung der Anweisungen I vi ← vi + a: Verlängere das Wort in vi um den Buchstaben a. I vi ← vi −: Streiche den letzten Buchstaben des Wortes in vi , wenn diese Wort nicht leer ist. I GOTO z: Weiter mit Zeile z (wenn Zeile z nicht existiert, so halte an). I IF vi = ε GOTO z: Wenn vi das leere Wort enthält, so weiter mit Zeile z. I IF vi ?a GOTO z: Wenn vi mit dem Buchstaben a endet, so weiter mit Zeile z. 578 Beispiel Berechnung des Programms Beispiel-1. 0. 1. 2. 3. 4. IF v0 = e GOTO 5 v0 <− v0 − v1 <− v1 + a v1 <− v1 + a GOTO 0 0 aa 579 Beispiel Berechnung des Programms Beispiel-1. 0. 1. 2. 3. 4. IF v0 = e GOTO 5 v0 <− v0 − v1 <− v1 + a v1 <− v1 + a GOTO 0 1 aa 580 Beispiel Berechnung des Programms Beispiel-1. 0. 1. 2. 3. 4. IF v0 = e GOTO 5 v0 <− v0 − v1 <− v1 + a v1 <− v1 + a GOTO 0 2 a 581 Beispiel Berechnung des Programms Beispiel-1. 0. 1. 2. 3. 4. IF v0 = e GOTO 5 v0 <− v0 − v1 <− v1 + a v1 <− v1 + a GOTO 0 3 a a 582 Beispiel Berechnung des Programms Beispiel-1. 0. 1. 2. 3. 4. IF v0 = e GOTO 5 v0 <− v0 − v1 <− v1 + a v1 <− v1 + a GOTO 0 4 aa a 583 Beispiel Berechnung des Programms Beispiel-1. 0. 1. 2. 3. 4. IF v0 = e GOTO 5 v0 <− v0 − v1 <− v1 + a v1 <− v1 + a GOTO 0 0 aa a 584 Beispiel Berechnung des Programms Beispiel-1. 0. 1. 2. 3. 4. IF v0 = e GOTO 5 v0 <− v0 − v1 <− v1 + a v1 <− v1 + a GOTO 0 1 aa a 585 Beispiel Berechnung des Programms Beispiel-1. 0. 1. 2. 3. 4. IF v0 = e GOTO 5 v0 <− v0 − v1 <− v1 + a v1 <− v1 + a GOTO 0 2 aa 586 Beispiel Berechnung des Programms Beispiel-1. 0. 1. 2. 3. 4. IF v0 = e GOTO 5 v0 <− v0 − v1 <− v1 + a v1 <− v1 + a GOTO 0 3 aaa 587 Beispiel Berechnung des Programms Beispiel-1. 0. 1. 2. 3. 4. IF v0 = e GOTO 5 v0 <− v0 − v1 <− v1 + a v1 <− v1 + a GOTO 0 4 aaaa 588 Beispiel Berechnung des Programms Beispiel-1. 0. 1. 2. 3. 4. IF v0 = e GOTO 5 v0 <− v0 − v1 <− v1 + a v1 <− v1 + a GOTO 0 0 aaaa 589 Beispiel Berechnung des Programms Beispiel-1. 0. 1. 2. 3. 4. IF v0 = e GOTO 5 v0 <− v0 − v1 <− v1 + a v1 <− v1 + a GOTO 0 5 aaaa Hier hält die Berechnung an, weil das Programm keine Zeile 5 hat. 590 Semantik von GOTO-Programmen (formal) Definition 7.19 Sei A ein Alphabet. Eine Konfiguration über A ist ein Paar (s, β), wobei s ∈ N und β : Var → A∗ eine Belegung ist. KonfA bezeichnet die Menge aller Konfigurationen über A. 591 Die Nachfolgerfunktion eines Programms Definition 7.20 Sei P = (Z0 , . . . , Zr ) ein GOTO-Programm über A. Die Nachfolgerfunktion von P ist die partielle Funktion NP von KonfA nach KonfA , die folgendermaßen definiert ist: Sei (s, β) ∈ KonfA eine Konfiguration. I I I Falls s > r , so ist NP (s, β) undefiniert. Falls Zs = vi ← vi + a, so ist NP (s, β) = (s + 1, β 0 ), wobei β(vj )a falls j = i, 0 β (vj ) = β(vj ) sonst. Falls Zs = vi ← vi −, so ist NP (s, β) = (s + 1, β 0 ), wobei x falls j = i und β(vi ) = xa für ein x ∈ A∗ , a ∈ A, 0 β (vj ) = β(vj ) sonst. (Fortsetzung auf der nächsten Folie) 592 I Falls Zs = GOTO t, so ist NP (s, β) = (t, β). I Falls Zs = IF vi = ε GOTO t, so ist (t, β) falls β(vi ) = ε, NP (s, β) = (s + 1, β) sonst. I Falls Zs = IF vi ?a GOTO t, so ist (t, β) falls β(vi ) = xa für ein x ∈ A∗ , NP (s, β) = (s + 1, β) sonst. 593 Berechnungen Definition 7.21 Sei P = (Z0 , . . . , Zr ) ein GOTO-Programm über A. (t) 1. Für t ≥ 0 sei die partielle Funktion NP von KonfA nach KonfA rekursiv wie folgt definiert: (0) (t+1) NP (s, β) := (s, β) und NP (t) (s, β) := NP (NP (s, β)). 2. Eine Anfangskonfiguration von P ist eine Konfiguration (0, β). 3. Eine Endkonfiguration von P ist eine Konfiguration (s, β) mit s > r. 4. Die Berechnung von P bei Eingabe β ist die Folge (0, β) = N (0) (0, β), N (1) (0, β), N (2) (0, β), . . . von Konfigurationen. 5. P hält bei Eingabe β, wenn es ein t ≥ 0 gibt, so dass N (t) (0, β) eine Endkonfiguration ist. 594 Belegungen auf Anfangsstücken von Var Notation Sei A ein Alphabet. Für k ∈ N und x0 , . . . , xk −1 ∈ A∗ bezeichnet [x0 , . . . , xk −1 ] die Belegung β : Var → A∗ mit xi β(vi ) = ε falls 0 ≤ i ≤ k − 1 sonst 595 Beispiel Berechnung des Programms Doppel 0. IF v0 = ε GOTO 5 1. v0 ← v0 − 2. v1 ← v1 + a 3. v1 ← v1 + a 4. GOTO 0 5. IF v1 = ε GOTO 9 6. v1 ← v1 − 7. v0 ← v0 + a 8. GOTO 5 Eingabe: β := [aa, ε] Berechnung: ` ´ ` ´ ` ´ 0, [aa, ε] → 1, [aa, ε] → 2, [a, ε] ` ´ ` ´ ` ´ → 3, [a, a] → 4, [a, aa] → 0, [a, aa] ` ´ ` ´ ` ´ → 1, [a, aa] → 2, [ε, aa] → 3, [ε, aaa] ` ´ ` ´ ` ´ → 4, [ε, aaaa] → 0, [ε, aaaa] → 5, [ε, aaaa] ` ´ ` ´ ` ´ → 6, [ε, aaaa] → 7, [ε, aaa] → 8, [a, aaa] ` ´ ` ´ ` ´ → 5, [a, aaa] → 6, [a, aaa] → 7, [a, aa] ` ´ ` ´ ` ´ → 8, [aa, aa] → 5, [aa, aa] → 6, [aa, aa] ` ´ ` ´ ` ´ → 7, [aa, a] → 8, [aaa, a] → 5, [aaa, a] ´ ` ´ ` ´ ` → 6, [aaa, a] → 7, [aaa, ε] → 8, [aaaa, ε] ` ´ ` ´ → 5, [aaaa, ε] → 9, [aaaa, ε] 596 Notation Sei P = (Z0 , . . . , Zr ) ein GOTO-Programm über A und β : Var → A∗ eine Belegung. I Wir schreiben P β ↓, wenn P bei Eingabe β hält und P β ↑ sonst. I Wenn P β ↓, so schreiben wir P β ↓ β 0, I wenn es ein s gibt, so dass (s, β 0 ) die (eindeutige) Endkonfiguration der Berechnung von P bei Eingabe β ist. Für y ∈ A∗ schreiben wir Pβ ↓ y , wenn es ein β 0 : Var → A∗ gibt, so dass Pβ ↓ β 0 und β 0 (v0 ) = y . 597 G-Berechenbarkeit Definition 7.22 Seien B, C Alphabete, k ≥ 1 und F eine partielle Funktion von (B ∗ )k nach C ∗ . Ein GOTO-Programm P über einem Alphabet A mit A ⊇ B ∪ C berechnet F , wenn für alle (x0 , . . . , xk −1 ) ∈ (B ∗ )k und y ∈ C ∗ gilt: F (x0 , . . . , xk −1 ) = y ⇐⇒ P[x0 , . . . , xk −1 ] ↓ y . F ist G-berechenbar, wenn es ein GOTO-Programm gibt, das F berechnet. Beispiel 7.23 Die Funktion F : {a}∗ → {a}∗ mit F (x) = xx ist G-berechenbar. 598 Beispiel Sei A = {a, b}. Für ein Wort x = a0 . . . ak −1 ∈ A∗ sei x −1 := ak −1 . . . a0 . Folgendes GOTO-Programm berechnet die Funktion F : A∗ → A∗ mit F (x) = x −1 PROGRAMM Invers 0. 1. 2. 3. 4. 5. 6. 7. IF v0 = ε GOTO 8 IF v0 ? b GOTO 5 v0 ← v0 − v1 ← v1 + a GOTO 0 v0 ← v0 − v1 ← v1 + b GOTO 0 8. 9. 10. 11. 12. 13. 14. 15. IF v1 = ε GOTO 16 IF v1 ? b GOTO 13 v1 ← v1 − v2 ← v2 + a GOTO 8 v1 ← v1 − v2 ← v2 + b GOTO 8 16. 17. 18. 19. 20. 21. 22. 23. IF v2 = ε GOTO 24 IF v2 ? b GOTO 21 v2 ← v2 − v0 ← v0 + a GOTO 16 v2 ← v2 − v0 ← v0 + b GOTO 16 599 G-Entscheidbarkeit Definition 7.24 Seien B ein Alphabet, k ≥ 1 und R ⊆ (B ∗ )k . Ein GOTO-Programm P über einem Alphabet A ⊇ B entscheidet R, wenn für alle (x0 , . . . , xk −1 ) ∈ (B ∗ )k gilt: (x0 , . . . , xk −1 ) ∈ R =⇒ P[x0 , . . . , xk −1 ] ↓ y für ein y ∈ A∗ \ {ε}, (x0 , . . . , xk −1 ) 6∈ R =⇒ P[x0 , . . . , xk −1 ] ↓ ε. R ist G-entscheidbar, wenn es ein GOTO-Programm gibt, dass R entscheidet. 600 Beispiel Sei A = {a, b}. Ein Wort x ∈ A∗ ist ein Palindrom, wenn x = x −1 . Folgendes G-Programm entscheidet die Menge {x ∈ A∗ | x = x −1 } der Palindrome. 601 PROGRAMM Palindrom 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. IF v0 = ε GOTO 10 IF v0 ? b GOTO 6 v0 ← v0 − v1 ← v1 + a v2 ← v2 + a GOTO 0 v0 ← v0 − v1 ← v1 + b v2 ← v2 + b GOTO 0 IF v2 = ε GOTO 18 IF v2 ? b GOTO 15 v2 ← v2 − v0 ← v0 + a GOTO 10 v2 ← v2 − v0 ← v0 + b GOTO 10 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. IF v0 = ε GOTO 31 IF v0 ? a GOTO 24 IF v1 ? a GOTO 28 v0 ← v0 − v1 ← v1 − GOTO 18 IF v1 ? b GOTO 28 v0 ← v0 − v1 ← v1 − GOTO 18 IF v0 = ε GOTO 32 v0 ← v0 − GOTO 28 v0 ← v0 + a 602 G-Semi-Entscheidbarkeit Definition 7.25 Seien B ein Alphabet, k ≥ 1 und R ⊆ (B ∗ )k . Ein GOTO-Programm P über einem Alphabet A ⊇ B ist ein Semi-Entscheidungsprogramm für R, wenn für alle (x0 , . . . , xk −1 ) ∈ (B ∗ )k gilt: (x0 , . . . , xk −1 ) ∈ R =⇒ P[x0 , . . . , xk −1 ] ↓, (x0 , . . . , xk −1 ) 6∈ R =⇒ P[x0 , . . . , xk −1 ] ↑ . R ist G-semi-entscheidbar, wenn es ein GOTO-Programm gibt, dass ein Semi-Entscheidungsprogramm für R ist. 603 G-Aufzählbarkeit I I Weil GOTO-Programme keinen Ausgabemechanismus haben, lassen sich Aufzählungsalgorithmen (mit potentiell unendlich vielen Ausgaben) nicht durch GOTO-Programme beschreiben. Wir können aber unsere GOTO Sprache durch einen Befehl PRINT vi erweitern, der den Inhalt der Variablen vi ausgibt. I Dann läßt sich zeigen, dass die durch GOTO-Programme mit PRINT-Befehl aufzählbaren Mengen gerade die G-semi-entscheidbaren Mengen sind. 604 G-Berechenbarkeit und andere Berechenbarkeitsbegriffe Satz 7.26 Eine (partielle) Funktion ist genau dann G-berechenbar, wenn sie berechenbar ist bzgl. irgendeiner der anderen Präzisierungen von Algorithmen, die wir am Ende von § 7.2 genannt haben. Entsprechendes gilt für G-entscheidbare und G-semi-entscheidbare Mengen und Relationen. (ohne Beweis) Unter Verwendung der Church-Turingschen These können wir dann schließen, dass alle mit unserem intuitiven Berechenbarkeitsbegriff als entscheidbar oder aufzählbar erkannten Probleme und alle als berechenbar erkannten Funktionen auch G-entscheidbar bzw. G-aufzählbar bzw. G-berechenbar sind. Zum Beispiel: Satz 7.27 Pσ-Allg , das Allgemeingültigkeitsproblem für σ-Sätze, ist G-semi-entscheidbar. 605 § 7.4 Turingmaschinen 606 Eine Turingmaschine beidseitig unendliches Band a b a # a a0 0 1 a 12b # # Schreib−/Lesekopf endliche Kontrolleinheit 607 Turingmaschinen Definition 7.28 Eine Turingmaschine (kurz: TM) ist ein Tupel M = (Z , A, , δ, z0 , E), bestehend aus: I I einer endlichen Zustandsmenge Z , einem endlichen Arbeitsalphabet A, I einem Blank ∈ A, einer Übergangsfunktion δ : Z × A → Z × A × {L, N, R}, I einem Anfangszustand z0 ∈ Z , I einer Menge E ⊆ Z von Endzuständen. I 608 Informelle Semantik I Zu Beginn der Berechnung steht auf dem Band die Eingabe, ein endliches Wort aus (A \ {})∗ , auf beiden Seiten ergänzt um unendlich viele Blanks. Die Maschine befindet sich im Anfangszustand z0 . Der Schreib-/Lesekopf steht auf dem ersten Symbol der Eingabe. I Die Maschine arbeitet schrittweise. Nehmen wir an, sie befindet sich in einem Zustand z ∈ Z , und der Schreib-/Lesekopf liest das Symbol a ∈ A. Das Verhalten der Maschine wird jetzt von der Übergangsfunktion bestimmt, sei also δ(z, a) = (z 0 , a 0 , r ). Dann geht die Maschine in den Zustand z 0 über, der Schreib-/Lesekopf überschreibt das a, auf dem er steht, durch ein a 0 und I I I bewegt sich um ein Feld nach links, falls r = L, bleibt wo er ist, falls r = N, oder bewegt sich um ein Feld nach rechts, falls r = R. 609 Beispiel Die folgende Maschine M interpretiert das Eingabewort als natürliche Zahl in Binärdarstellung und addiert 1: M = ({z0 , z1 , z2 , z3 }, {0, 1, }, , δ, z0 , {z3 }), wobei δ folgendermaßen definiert ist: (z, a) (z0 , 0) (z0 , 1) (z0 , ) (z, a) (z2 , 0) (z2 , 1) (z2 , ) δ(z, a) (z0 , 0, R) (z0 , 1, R) (z1 , , L) (z, a) (z1 , 0) (z1 , 1) (z1 , ) δ(z, a) (z2 , 1, R) (z1 , 0, L) (z2 , 1, R) δ(z, a) (z2 , 0, R) (z2 , 1, R) (z3 , , N). (z, a) (z3 , 0) (z3 , 1) (z3 , ) δ(z, a) (z3 , 0, N) (z3 , 1, N) (z3 , , N). 610 Konfigurationen Definition 7.29 Eine Konfiguration einer Turingmaschine M = (Z , A, , δ, z0 , E) ist ein Tripel (z, v , w) ∈ Z × A∗ × A∗ . KonfM bezeichnet die Menge aller Konfigurationen der TM M. Intuitive Bedeutung Ist (z, v , w) eine Konfiguration, so ist I I I z der aktuelle Zustand und . . . vw . . . die Beschriftung des Bandes. Der Schreib-/Lesekopf befindet sich auf dem ersten Symbol von w falls w 6= ε, bzw. auf dem ersten Blank rechts von v falls w = ε. 611 Die Nachfolgerfunktion einer Turingmaschine Definition 7.30 Sei M = (Z , A, , δ, z0 , E) eine Turingmaschine. Die Nachfolgerfunktion von M ist die Funktion NM : KonfM → KonfM , die wie folgt definiert ist: Sei (z, v , w) ∈ KonfM mit v = a1 . . . am und w = b1 . . . bn und δ(z, b1 ) falls m ≥ 1, 0 (z , c, r ) := δ(z, ) sonst. Sei (a1 . . . am−1 , am cb2 . . . bn ) (ε, cb . . . b ) 2 n (v 0 , w 0 ) := . . . a , cb (a 1 m 2 . . . bn ) (a1 . . . am c, b2 . . . bn ) falls r falls r falls r falls r = L und m ≥ 1, = L und m = 0, = N, = R. Wir setzen NM (z, v , w) := (z 0 , v 0 , w 0 ). 612 Berechnungen Definition 7.31 Sei M = (Z , A, , δ, z0 , E) eine Turingmaschine. (t) 1. Für t ≥ 0 sei die Funktion NM : KonfM → KonfM rekursiv wie folgt definiert: (0) (t+1) NM (z, v , w) := (z, v , w) und NM (t) (z, v , w) := NM (NM (z, v , w)). 2. Eine Anfangskonfiguration von M ist eine Konfiguration (z0 , ε, x) für ein x ∈ (A \ {})∗ . 3. Eine Endkonfiguration von M ist eine Konfiguration (z, v , w) mit z ∈ E. 4. Die Berechnung von M bei Eingabe x ∈ (A \ {})∗ ist die Folge (0) (1) (2) (z0 , ε, x) = NM (z0 , ε, x), NM (z0 , ε, x), NM (z0 , ε, x), . . . von Konfigurationen. 5. M hält bei Eingabe x ∈ (A \ {})∗ , wenn es ein t ≥ 0 gibt, so dass N (t) (z0 , ε, x) eine Endkonfiguration ist. 613 Notation Sei M = (Z , A, , δ, z0 , E) eine Turingmaschine und x ∈ (A \ {})∗ . eine Eingabe. I Wir schreiben M x ↓, wenn M bei Eingabe x hält und M x ↑ sonst. I Wenn M x ↓, so schreiben wir M x ↓ y, wenn die erste Endkonfiguration in der Berechnung von M bei Eingabe x die Gestalt (z, . . . y , w) hat. 614 T-Berechenbarkeit Definition 7.32 Seien B, C Alphabete und F eine partielle Funktion von B ∗ nach C ∗ . Eine Turingmaschine M = (Z , A, , δ, z0 , E) mit A \ {} ⊇ B ∪ C berechnet F , wenn für alle x ∈ B ∗ und y ∈ C ∗ gilt: F (x) = y ⇐⇒ M x ↓ y . F ist T-berechenbar, wenn es eine Turingmaschine gibt, die F berechnet. Die Begriffe der T-Entscheidbarkeit und T-Semi-Entscheidbarkeit werden entsprechend definiert. 615 Beispiel Folgende Turingmaschine berechnet die Funktion F : {a}∗ → {a}∗ mit F (x) = xx: M = ({z0 , z1 , . . . , z5 }, {a, ∗, }, , δ, z0 , {z5 }), wobei δ definiert ist durch (z, a) (z0 , a) (z0 , ∗) (z0 , ) δ(z, a) (z1 , ∗, L) (z0 , ∗, R) (z4 , , L) (z, a) (z2 , a) (z2 , ∗) (z2 , ) (z1 , a) (z1 , ∗) (z1 , ) (z1 , a, L) (z1 , ∗, L) (z2 , a, L) (z3 , a) (z3 , ∗) (z3 , ) δ(z, a) (z3 , a, R) (z3 , a, R) (z0 , ∗, R) (z, a) (z4 , a) (z4 , ∗) (z4 , ) δ(z, a) (z5 , a, R) (z4 , , L) (z5 , a) (z5 , ∗) (z5 , ) Die fehlenden Einträge können beliebig gewählt werden. 616 Simulation von Turingmaschinen durch GOTO-Programme Lemma 7.33 Jede T-berechenbare partielle Funktion ist auch G-berechenbar. 617 Beweisidee für Lemma 7.33 Sei M = (Z , A, , δ, z0 , E) eine Turingmaschine. Wir geben ein GOTO-Programm P über dem Alphabet A an, das M schrittweise simuliert. I I I P hat zwei Variablen v0 , v1 , in denen die Bandbeschriftung gespeichert wird. Das Programm besteht aus einem Initialisierungsteil, einem Kontrollteil, und einem Ausführungsteil, und einem Abschlussteil. Der Initialisierungsteil wird zuerst ausgeführt, in ihm wird der Inhalt der Variablen v0 (die Eingabe des Programmes) in umgekehrter Reihenfolge nach v1 kopiert. 618 I Der Kontrollteil besteht aus einer bedingten Sprunganweisung für jedes Paar (z, a) ∈ Z × A, die den Kontrollfluss des Programmes auf den Anfang eines Unterprogramms lenkt, das dafür sorgt, dass der Übergang δ(z, a) korrekt umgesetzt wird. Zusätzlich wird im Kontrollteil für jedes z noch eine weitere Sprunganweisung für den Fall v1 = ε benötigt, die den Kontrollfluß auf die gleiche Zeile lenkt wie die Sprunganweisung für δ(z, ). I Der Ausführungsteil enthält all die Unterprogramme, die die Übergänge umsetzen und danach den Kontrollfluss wieder auf die Richtige Zeile im Kontrollteil lenken. I Im Abschlussteil wird schliesslich die korrekte Ausgabe in die Variable v0 geschrieben. Dabei werden am linken Ende stehende Blank-Symbole gelöscht. Wenn noch andere Blanksymbole vorkommen, so ist die Ausgabe undefiniert, und das Programm läuft in eine Endlosschleife. 619 Umsetzung der Beweisidee Sei M = (Z , A, , δ, z0 , E), wobei A = {a1 , . . . , an } und a1 = . Der Intialisierungsteil Der Initialisierungsteil besteht aus den Zeilen: 0. IF v0 = ε GOTO s(z0 ) // Beginn des Kontrollteils für Zustand z0 1. IF v0 ?a1 GOTO n+1 2. IF v0 ?a2 GOTO n+3 .. . n. IF v0 ?an GOTO 3n-1 n+1. v1 ← v1 + a1 n+2. GOTO 3n n+3. v1 ← v1 + a2 n+4. GOTO 3n .. . 3n-3. v1 ← v1 + an−1 3n-2. GOTO 3n 3n-1. v1 ← v1 + an 620 Umsetzung der Beweisidee (cont.) 3n. v0 ← v0 − 3n+1. GOTO 0 Der Kontrollteil: Der Kontrollteil enthält für jedes z ∈ Z \ E folgende (n + 1) Zeilen: s(z). IF v1 = ε GOTO s(z, ) s(z)+1. IF v1 ?a1 GOTO s(z, a1 ) ... s(z)+n. IF v1 ?an GOTO s(z, an ) Für Endzustände z ∈ E sei s(z) = sA die erste Zeile des Abschlussteils. Der Ausführungsteil: Der Ausführungsteil enthält für jedes z ∈ Z \ {E} und jedes a ∈ A Zeilen s(z, a), . . . , s(z, a) + t(z, a). Diese Zeilen hängen von δ(z, a) ab. Sei (z 0 , a 0 , r ) := δ(z, a). 621 Umsetzung der Beweisidee (cont.) 1. Fall: r = R. In diesem Fall muss das letzte Symbol a von v1 entfernt werden, und a 0 muss an v0 angehängt werden. Anschließend springt das Programm in Zeile s(z 0 ). Das kann mit folgenden Programmzeilen erreicht werden: s(z, a). v1 ← v1 − s(z, a)+1. v0 ← v0 + a 0 s(z, a)+2. GOTO s(z 0 ) Also ist t(z, a) = 2. 2. Fall: r = N. In diesem Fall muss das letzte Symbol von v1 durch a 0 überschrieben werden. Anschließend springt das Programm in Zeile s(z 0 ). Das kann mit folgenden Programmzeilen erreicht werden: s(z, a). v1 ← v1 − s(z, a)+1. v1 ← v1 + a 0 s(z, a)+2. GOTO s(z 0 ) 622 Umsetzung der Beweisidee (cont.) Also ist t(z, a) = 2. 3. Fall: r = L. Dieser Fall ist komplizierter. Zunächst muss das letzte Symbol von v1 durch a 0 überschrieben werden. Dann muss das letzte Symbol von v0 an v1 angehängt werden, bzw. ein Blank, falls v0 = ε. Anschließend springt das Programm in Zeile s(z 0 ). Das kann mit folgenden Programmzeilen erreicht werden: s(z, a). v1 ← v1 − s(z, a)+1. v1 ← v1 + a 0 s(z, a)+2. IF v0 = ε GOTO s(z, a)+n+3 // a1 = s(z, a)+3. IF v0 ?a1 GOTO s(z, a)+n+3 s(z, a)+4. IF v0 ?a2 GOTO s(z, a)+n+5 .. . s(z, a)+n+2. IF v0 ?an GOTO s(z, a)+3n+1 s(z, a)+n+3. v1 ← v1 + a1 s(z, a)+n+4. GOTO s(z, a)+3n+2 s(z, a)+n+5. v1 ← v1 + a2 623 Umsetzung der Beweisidee (cont.) s(z, a)+n+6. GOTO s(z, a)+3n+2 .. . s(z, a)+3n+1. v1 ← v1 + an s(z, a)+3n+2. v0 ← v0 − s(z, a)+3n+3. GOTO s(z 0 ) Also ist t(z, a) = 3n + 3. Abschlussteil: Zunächst wird der aktuelle Inhalt von v0 in umgekehrter Reihenfolge nach v2 kopiert. sA . IF v0 = ε GOTO sA +3n+2 sA +1. IF v0 ?a1 GOTO sA +n+1 sA +2. IF v0 ?a2 GOTO sA +n+3 .. . sA +n. IF v0 ?an GOTO sA +3n-1 sA +n+1. v2 ← v2 + a1 sA +n+2. GOTO sA +3n sA +n+3. v2 ← v2 + a2 624 Umsetzung der Beweisidee (cont.) sA +n+4. GOTO sA +3n .. . sA +3n-3. v2 ← v2 + an−1 sA +3n-2. GOTO 3n sA +3n-1. v2 ← v2 + an sA +3n. v0 ← v0 − sA +3n+1. GOTO sA Anschließend werden alle Blanks am Anfang von v2 gelöscht: sA +3n+2. sA +3n+3. sA +3n+4. sA +3n+5. IF v2 ?a1 GOTO sA +3n+4 GOTO sA +3n+6 v2 ← v2 − GOTO sA +3n+2 Zuletzt wird der Inhalt von v2 nach v0 zurückkopiert. Stößt das Programm dabei auf einen Blank, so läuft es in eine Endlosschleife. sA +3n+6. IF v2 = ε GOTO sA +6n+6 sA +3n+7. IF v2 ?a1 GOTO sA +3n+7 // Endlosschleife bei Blank 625 Umsetzung der Beweisidee (cont.) sA +3n+8. IF v2 ?a2 GOTO sA +4n+7 .. . sA +4n+6. IF v2 ?an GOTO sA +6n+3 sA +4n+7. v0 ← v0 + a2 sA +4n+8. GOTO sA +6n+4 sA +4n+9. v0 ← v0 + a3 sA +4n+10. GOTO sA +6n+4 .. . sA +6n+3. v0 ← v0 + an sA +6n+4. v2 ← v2 − sA +6n+5. GOTO sA +3n+6 Die Zeilennummern der einzelnen Programmteile werden natürlich so gewählt, dass sie sich nicht überschneiden und dass zwischen ihnen keine Lücken sind. Per Induktion über die Länge der Berechnung der Turingmaschine lässt sich jetzt relativ leicht zeigen, dass das Programm die Maschine korrekt simuliert. Wir verzichten auf Details. 626 Simulation von GOTO-Programmen durch Turingmaschinen Lemma 7.34 Jede G-berechenbare partielle Funktion ist auch T-berechenbar. 627 Beweisidee für Lemma 7.34 Sei P ein GOTO-Programm über dem Alphabet A. Sei V die Menge aller Variablen, die in P vorkommen. Wir geben eine Turingmaschine M an, die P schrittweise simuliert. I Das Alphabet von M ist A ∪ {, ∗} ∪ (A × V ), wobei , ∗ 6∈ A. Wie üblich ist das Blank. I M arbeitet in drei Phasen, der Initialisierungsphase, der Simulationsphase, und der Abschlussphase. I Während der Simulationsphase ist der nichtleere Teil des Bandes von M ausschließlich mit Symbolen (a, v ) ∈ A × V oder ∗ beschriftet. I Der Sinn des ∗ Symbols ist es, die bei ‘−’ Anweisungen entstehenden Lücken zu füllen. 628 Bandbeschriftung Ist zu einem Zeitpunkt der Simulation der Wert einer Variablen V unter der aktuellen Belegung a1 . . . an , so enthält das Band der Maschine M die Symbole (a1 , v ), . . . , (an , v ) in dieser Reihenfolge und keine anderen Symbole (a, v ). Allerdings können vor, zwischen, und hinter den (ai , v ) noch beliebig viele andere Symbole (b, w) für Variablen w 6= v oder ∗ vorkommen. Beispiel Sei V = {v0 , v1 , v2 } und seien zu irgendeinem Zeitpunkt während der Simulation die Werte der Variablen unter der aktuellen Belegung β β(v0 ) = ab, β(v1 ) = bab, β(v2 ) = b. Dann sind zwei mögliche Bandbeschriftungen der Maschine M: · · · (a, v0 )(b, v0 )(b, v1 )(a, v1 )(b, v1 )(b, v2 ) · · · · · · (b, v2 ) ∗ ∗ (a, v0 )(b, v1 ) ∗ (b, v0 )(a, v1 )(b, v1 ) ∗ · · · 629 Initialisierungsphase In der Initialisierungsphase ersetzt die Maschine das Eingabewort a1 . . . an durch (a1 , v0 ) . . . (an , v0 ) und bewegt anschließend den Schreib-/Lesekopf wieder ganz nach links. 630 Simulationsphase In jedem Simulationsschritt arbeitet die Maschine eine Zeile Z des Programms ab. Für jede Zeile Z hat die Maschine einen eigenen Satz von Zuständen z(Z , 1), . . . , z(Z , mZ ). Zu Beginn ist die Maschine im Zustand z(Z , 1), und der Schreib-/Lesekopf steht am linken Ende der Bandbeschriftung. I Falls Z = GOTO s, so muss die Maschine nur geeignet den Zustand wechseln. Ansonsten kommt in der Zeile Z genau eine Variable v vor. I Falls Z = v ← v + a für ein a ∈ A, so bewegt die Maschine den Schreib-/Lesekopf hinter das rechte Ende der Bandbeschriftung, schreibt dort (a, v ) aufs Band, und bewegt den Kopf wieder ans linke Ende der Bandbeschriftung. I Falls Z = v ← v − für ein a ∈ A, so bewegt die Maschine den Schreib-/Lesekopf bis ans rechte Ende der Bandbeschriftung. Dann bewegt sie den Kopf wieder zurück ans linke Ende. Dabei ersetzt sie das erste Symbol der Gestalt (a, v ), auf das sie trifft, durch ∗. 631 I Falls Z = IF v = ε GOTO s, so liest die Maschine so lange das Band, bis sie entweder auf ein Symbol (a, v ) trifft und weiß, dass v unter der aktuellen Belegung nicht das leere Wort ist, oder bis sie nach dem rechten Ende der Bandbeschriftung auf ein Blank trifft und weiß, dass v unter der aktuellen Belegung das leere Wort ist. Dann bewegt sie den Kopf wieder ans linke Ende der Bandbeschriftung und wechselt den Zustand entsprechend. I Falls Z = IF v ?a GOTO s, so liest die Maschine das Band bis zum rechten Ende und merkt sich dabei mit Hilfe ihres Zustands das letzte Symbol a ∈ A, so dass (a, v ) auf dem Band steht (wenn überhaupt ein Symbol der Gestalt (a, v ) vorkommt). Dann bewegt sie den Kopf zurück ans linke Ende und wechselt geeignet den Zustand. 632 Abschlussphase In der Abschlussphase schreibt die Maschine den aktuellen Inhalt der Variablen v0 aufs Band und bewegt den Kopf hinter das rechte Ende dieser Beschriftung. 633 Der Äquivalenzsatz Satz 7.35 Eine partielle Funktion ist genau dann G-berechenbar, wenn sie T-berechenbar ist. Korollar 7.36 Ein Problem ist genau dann G-entscheidbar (G-semi-entscheidbar), wenn es T-entscheidbar (bzw. T-semi-entscheidbar) ist. 634 Mehrband-Turingmaschinen I I Statt eines Bandes kann die Maschine mehrere Bänder als Speicher verwenden, jedes mit einem eigenen Schreib-/Lesekopf. Je eines der Bänder wird als Ein- bzw. Ausgabeband festgelegt. Es kann gezeigt werden, dass jede von einer Mehrband-TM berechenbare Funktion auch von einer Einband-TM berechnet werden kann, also T- und damit G-berechenbar ist. 635 Nichtdeterministische Turingmaschinen (NTM) I I I Statt einer Übergangsfunktion hat eine NTM eine Übergangsrelation. Dann kann eine Konfiguration mehrere Nachfolgekonfigurationen oder auch gar keine Nachfolgekonfiguration haben. Dadurch kann es mehrere Berechnungen geben. Zum Berechnen von Funktionen sind NTM nicht geeignet, wohl aber für Entscheidungsprobleme: Eine NTM akzeptiert eine Eingabe, wenn es mindestens eine akzeptierende Berechnung gibt. Es kann gezeigt werden, dass die Klasse der durch NTM entscheidbaren Probleme gleich der durch normale, deterministische“ TM entscheidbaren Probleme und damit ” gleich der Klasse der G-entscheidbaren Probleme ist. 636 § 7.5 Berechenbare Funktionen auf den natürlichen Zahlen 637 Kodierung natürlicher Zahlen Wir kodieren natürliche Zahlen unär als Wörter über dem Alphabet {|}. Wir definieren eine Kodierungsfunktion h · i : N → {|}∗ durch h0i := ε und hn + 1i := hni | für n ≥ 0. 638 Berechenbare Funktionen und entscheidbare Relationen Definition 7.37 Sei k ≥ 1. 1. Eine (partielle) Funktion f : Nk → N nennen wir G-berechenbar, wenn die (partielle) Funktion F : ({|}∗ )k → {|}∗ mit F (hn0 i, . . . , hnk −1 i) = hf (n0 , . . . , nk −1 )i G-berechenbar ist. 2. Eine Relation r ⊆ Nk nennen wir G-entscheidbar (bzw. G-semi-entscheidbar), wenn die Relation R := {(hn0 i, . . . , hnk −1 i) | (n0 , . . . , nk −1 ) ∈ r } G-entscheidbar (bzw. G-semi-entscheidbar) ist. 639 Beispiel: Addition Folgendes GOTO-Programm berechnet die Additionsfunktion: Plus 0. IF v1 = ε GOTO 4 1. v1 ← v1 − 2. v0 ← v0 + | 3. GOTO 0 640 Notation Notation In GOTO-Programmen über dem Alphabet {|} schreiben wir im Folgenden für alle i ∈ N: I vi ← vi + 1 anstatt vi ← vi + |, I vi ← vi −1 anstatt vi ← vi −, vi = 0 anstatt vi = ε I Beispielsweise sieht das Additionsprogramm von der letzten Folie dann folgendermaßen aus: Plus 0. IF v1 = 0 GOTO 4 1. v1 ← v1 −1 2. v0 ← v0 + 1 3. GOTO 0 641 Beispiel: Gerade Zahlen Folgendes GOTO-Programm entscheidet die Menge der geraden Zahlen: Gerade 0. IF v0 = 0 GOTO 5 1. v0 ← v0 −1 2. IF v0 = 0 GOTO 6 3. v0 ← v0 −1 4. GOTO 0 5. v0 ← v0 + 1 642 Hintereinanderausführung von Programmen Lemma 7.38 Seien P und P 0 GOTO-Programme. Dann gibt es ein GOTO-Programm (P; P 0 ), so dass für alle Belegungen β, β 0 gilt: (P; P 0 )β ↓ β 0 ⇐⇒ ex. Belegung β 00 , so dass Pβ ↓ β 00 und P 0 β 00 ↓ β 0 . 643 Unterprogramme Syntax von GOTO-Programm mit Unterprogrammen Seien P1 , . . . , Pn GOTO-Programme. Ein GOTO-Programm mit Unterprogrammen P1 , . . . , Pn ist ein Programm, dass neben normalen Anweisungen auch noch Anweisungen der Form vi ← Pm (vj0 , . . . , vjk −1 ) für 1 ≤ m ≤ n und beliebige i, k , j0 , . . . , jk −1 ∈ N enthält. 644 Semantik von GOTO-Programm mit Unterprogrammen Seien P1 , . . . , Pn GOTO-Programme und Q = (Z1 , . . . , Zr ) ein GOTO-Programm mit Unterprogrammen P1 , . . . , Pn über dem Alphabet A. Wir definieren die Nachfolgerfunktion NQ von Q wie folgt: Sei (s, β) ∈ KonfA . I Falls s > r oder Zs eine normale GOTO-Anweisung ist, so sei NQ (s, β) wie bei normalen GOTO-Programmen definiert. I Falls Zs = vi ← Pm (vj , . . . , vj ), so sei 0 k −1 undefiniert falls Pm [β(vj0 ), . . . , β(vjk −1 )] ↑, NQ (s, β) = (s + 1, β 0 ) falls Pm [β(vj0 ), . . . , β(vjk −1 )] ↓, wobei y falls ` = i und Pm [β(vj0 ), . . . , β(vjk −1 )] ↓ y , β 0 (v` ) = β(v` ) sonst. Mit Hilfe der Nachfolgerfunktion können wir jetzt die Semantik von Q wie bei einem normalen GOTO-Programm definieren. 645 Lemma 7.39 Seien P1 , . . . , Pn GOTO-Programme und Q ein GOTO-Programm mit Unterprogrammen P1 , . . . , Pn über dem Alphabet A. Dann gibt es für alle k ≥ 1 ein GOTO-Programm Q 0 , so dass für alle x0 , . . . , xk −1 , y ∈ A∗ gilt: Q[x0 , . . . , xk −1 ] ↓ y ⇐⇒ Q 0 [x0 , . . . , xk −1 ] ↓ y . Insbesondere ist also jede Funktion, die von einem GOTO-Programm mit Unterprogrammen berechnet werden kann, auch GOTO-berechenbar. 646 Beispiel: Multiplikation Wir verwenden folgende Hilfsprogramme Null Id 0. IF v0 = 0 GOTO 3 0. GOTO 1 1. v0 ← v0 −1 2. GOTO 0 Folgendes Programm berechnet die Multiplikationsfunktion: Mal 0. v2 ← Id(v0 ) 1. v0 ← Null 2. IF v1 = 0 GOTO 6 3. v1 ← v1 −1 4. v0 ← Plus(v0 , v2 ) 5. GOTO 2 647 Rekursion Satz 7.40 Seien f : N → N, g : N3 → N G-berechenbare Funktionen. Sei h : N2 → N definiert durch h(x, 0) := f (x), h(x, y + 1) := g(x, y + 1, h(x, y )) (für x, y ∈ N). Dann ist h G-berechenbar. 648 Beispiele Folgende Funktionen sind G-berechenbar: 1. Die Potenzfunktion: f (x, y ) = x y x −y 2. Die modifizierte Subtraktion: f (x, y ) = 0 falls x ≥ y sonst. 3. Die Fakultätsfunktion: f (x) = x! 649 § 7.6 Das Halteproblem für GOTO-Programme 650 Vereinbarung In diesem Paragraphen sei A = {a0 , . . . , aq } (für ein q ≥ 0) ein festes Alphabet. OBdA sei a0 = |. Für n ∈ N ist dann hni = a0 . . . a0 ∈ A∗ . | {z } n mal 651 Kodierung von Wörtern Sei B := {b0 , . . . , bp } ein beliebiges Alphabet. Wir definieren eine Kodierungsfunktion h · iB,A : B ∗ → A∗ wie folgt: Wir zählen B ∗ lexikographisch auf, also ε, b0 , b1 , . . . , bp , b0 b0 , b0 b1 , . . . , bp bp , b0 b0 b0 , . . . . Ist x ∈ B ∗ das n-te Wort in dieser Aufzählung, so setzen wir hxiB,A := hni = | . . . | . |{z} n mal Notation Wir schreiben einfach hxi statt hxiB,A . 652 Kodierung von Programmen (Gödelisierung) GOTO-Programme über dem Alphabet A lassen sich als Wörter über dem Alphabet B := A ∪ {0, . . . , 9} ∪ {A, B, . . . , Z} ∪ {v } ∪ {0 , . . . , 9 } ∪ {←, +, −, ε, =, ?, (, ), ‘ , ’, ‘ ’} auffassen. Beispiel 7.41 Das Programm Beispiel-1 entspricht dem Wort ` ´ IF v0 = ε GOTO 5, v0 ← v0 −, v1 ← v1 + a, v1 ← v1 + a, GOTO 0 Den Code hPi = hPiB,A bezeichnen wir als die Gödelnummer von P. 653 Entscheidbarkeit der GOTO-Sprache Lemma 7.42 Die Menge {hPi | P GOTO-Programm über A} ist entscheidbar. 654 Ein unentscheidbares Problem Lemma 7.43 Das Problem K := {hPi | P[hPi] ↓} ist nicht G-entscheidbar. 655 Beweis von Lemma 7.43 Nehmen wir an, K ist G-entscheidbar, sagen wir, durch ein GOTO-Programm PK . Dann gilt für alle GOTO-Programme P: PK [hPi] ↓ y für ein y 6= ε PK [hPi] ↓ ε ⇐⇒ P[hPi] ↓, ⇐⇒ P[hPi] ↑ . (?) 1. Schritt: Wir konstruieren ein GOTO-Programm P , so dass für alle x ∈ A∗ : K ⇐⇒ P [x] ↑, ⇐⇒ P [x] ↓ . K (??) K PK [x] ↓ y für ein y 6= ε PK [x] ↓ ε 656 Beweis von Lemma 7.43 (cont.) Konstruktion: Wir definieren ein Programm P folgt: 0. v0 ← PK (v0 ) 1. IF v0 = ε GOTO 3 2. GOTO 2 Dann gilt für alle x ∈ A∗ : 0 mit Unterprogramm PK wie K ⇐⇒ P 0 [x] ↑, ⇐⇒ P 0 [x] ↓ . PK [x] ↓ y für ein y 6= ε PK [x] ↓ ε K K Sei P ein GOTO-Programm, so dass für alle x, y ∈ A∗ gilt: K P [x] ↓ y ⇐⇒ P 0 [x] ↓ y. K K P erfüllt dann (??). K 657 Beweis von Lemma 7.43 (cont.) 2. Schritt: Wir wenden P auf sich selbst an. Nach (??) angewandt auf x := hPi und (?) gilt für alle GOTO-Programme P: K P [hPi] ↑ ⇐⇒ PK [hPi] ↓ y für ein y 6= ε ⇐⇒ P[hPi] ↓ . K Also mit P := P K P [hP i] ↑ ⇐⇒ P [hP i] ↓ . K K K K Das ist ein Widerspruch. 658 Das Parametrisierungslemma Lemma 7.44 Für alle GOTO-Programme P und alle x ∈ A∗ gibt es ein GOTO-Programm Px , so dass für alle y ∈ A∗ gilt: P[x] ↓ y ⇐⇒ Px [ε] ↓ y. Ferner gibt es ein GOTO-Programm Q, so dass für alle GOTO-Programme P und alle x ∈ A∗ gilt: Q[hPi, x] ↓ hPx i. 659 Die Unentscheidbarkeit des Halteproblems Satz 7.45 1. Das spezielle Halteproblem Hε := {hPi | P[ε] ↓} ist nicht G-entscheidbar. 2. Das allgemeine Halteproblem H := {(hPi, x) | P[x] ↓} ist nicht G-entscheidbar. 660 Beweis von Satz 7.45 (1) Nehmen wir an, Hε ist G-entscheidbar, sagen wir, durch ein GOTO-Programm PHε . Dann gilt für alle GOTO-Programme P: PHε [hPi] ↓ y für ein y 6= ε PHε [hPi] ↓ ε ⇐⇒ P[ε] ↓, ⇐⇒ P[ε] ↑ . Sei Q das Programm aus dem Parametrisierungslemma, und sei R folgendes Programm mit Unterprogrammen Q, PHε : 0. v0 ← Q(v0 , v0 ) 1. v0 ← PHε (v0 ) 661 Beweis von Satz 7.45 (cont.) Dann gilt für alle GOTO-Programme P und alle y ∈ A∗ R[hPi] ↓ y ⇐⇒ PHε [hPhPi i] ↓ y, wobei PhPi ein Programm ist mit PhPi [ε] ↓ ⇐⇒ P[hPi] ↓ . Also für alle GOTO-Programme P: R[hPi] ↓ y für ein y 6= ε ⇐⇒ PHε [hPhPi i] ↓ y für ein y 6= ε ⇐⇒ PhPi [ε] ↓ ⇐⇒ P[hPi] ↓ und R[hPi] ↓ ε ⇐⇒ PHε [hPhPi i] ↓ ε ⇐⇒ PhPi [ε] ↑ ⇐⇒ P[hPi] ↑ Also entscheidet R die Menge K . Nach Lemma 7.43 ist K aber nicht G-entscheidbar; das ist ein Widerspruch. 662 Beweis von Satz 7.45 (cont.) (2) Nehmen wir an, die Menge H ist G-entscheidbar, sagen wir, durch ein GOTO-Programm PH . Dann gilt für alle GOTO-Programme P und x ∈ A∗ : PH [hPi, x] ↓ y für ein y 6= ε PH [hPi, x] ↓ ε ⇐⇒ P[x] ↓, ⇐⇒ P[x] ↑ . Weil [hPi, ε] = [hPi], folgt daraus für x := ε PH [hPi] ↓ y für ein y 6= ε PH [hPi] ↓ ε ⇐⇒ P[ε] ↓, ⇐⇒ P[ε] ↑ . Also entscheidet PH auch Hε , ein Widerspruch. 663 Universelle Programme Bislang ist bei unseren Registermaschinen das Programm fest ” verdrahtet“ in dem Sinne, dass jede Maschine ihr eigenes festes Programm hat. Eine universelle Maschine ist eine frei ” programmierbare“ Registermaschine, die die Gödelnummer hPi eines Programmes als Eingabe erwartet und dieses Programm dann ausführt. Satz 7.46 Es gibt ein GOTO-Programm PU über dem Alphabet A, so dass für alle GOTO-Programme P über A und alle x, y ∈ A∗ gilt: PU [hPi, x] ↓ y ⇐⇒ P[x] ↓ y . 664 Semi-Entscheidbarkeit des Halteproblems Satz 7.47 Die Mengen H, Hε und K sind G-semi-entscheidbar. Korollar 7.48 Die Mengen A∗ \ H, A∗ \ Hε und A∗ \ K sind nicht G-semi-entscheidbar. 665 § 7.7 Die Unentscheidbarkeit der Logik der ersten Stufe 666 Alphabet und Symbolmenge In diesem Paragraphen betrachten wir GOTO-Programme über dem Alphabet A := {|}. Wir verwenden wieder die (bijektive) Kodierungsfunktion h · i : N → A∗ . Sei ˙ ḟ , 0̇} ∪ {Q̇m | m ≥ 0}, σ := {≤, wobei ˙ 2-stelliges Relationssymbol, I ≤ I ḟ 1-stelliges Funktionssymbol, 0̇ Konstantensymbol, I Q̇m (m + 3)-stelliges Relationssymbol (für m ≥ 0). I 667 Reduktion des Halteproblems auf das Allgemeingültigkeitsproblem Lemma 7.49 Für jedes GOTO-Programm P über A gibt es einen σ-Satz ϕP ∈ Lσ , so dass ϕP allgemeingültig ⇐⇒ P[ε] ↓ . Ferner gibt es ein GOTO-Programm R über dem Alphabet ASCII, so dass für alle GOTO-Programme P: R[hPi] ↓ ϕP . 668 Beweis von Lemma 7.49 Wir zeigen nur, wie man zu einem GOTO-Programm P den Satz ϕP definiert. Intuitiv wird klar sein, dass die Abbildung P 7→ ϕP berechenbar ist. Nach der Church’schen These ist sie damit auch G-berechenbar. Sei P = (Z0 , . . . , Zr ) ein GOTO-Programm über A. 1. Vorbereitende Definitionen. Wir betrachten die Berechnung von P bei Eingabe [ε]: (s0 , β0 ), (s1 , β1 ), . . . , wobei (s0 , β0 ) := (0, [ε]) und (st+1 , βt+1 ) := NP (st , βt ) für t ≥ 0. Falls (su , βu ) eine Endkonfiguration ist, so ist (st , βt ) für t > u undefiniert. Sei T := {t ≥ 0 | (st , βt ) ist definiert}. Dann ist T = N ⇐⇒ P[ε] ↑ . 669 Beweis von Lemma 7.49 (cont.) Sei m der höchste Variablenindex in P, d.h., m = max{i | vi kommt in P vor}. Man beachte, dass für alle i > m und alle t ∈ T gilt βt (vi ) = ε. Für 0 ≤ i ≤ m und t ∈ T sei bti := hβt (vi )i−1 , also bti ∈ N, so dass βt (vi ) = hbti i. Dann gilt βt = [βt0 , . . . , βtm ]. Weil in jedem Schritt der Wert einer Variablen höchstens um | verlängert werden kann (also die zugehörige Zahl um höchstens 1 erhöht), gilt für t ∈ T und 0 ≤ i ≤ m: bti ≤ t. Schließlich sei rmax die größte Zeilennummer, die in P entweder als Zeilennummer oder als Ziel einer Sprunganweisung vorkommt. 670 Beweis von Lemma 7.49 (cont.) 2. Definition der Struktur AP . Wir definieren eine σ-Struktur AP wie folgt: I AP := T ∪ {0, . . . , rmax }, I ˙ AP ist die natürliche Ordnung auf AP ⊆ N. ≤ I ḟ AP ist die Nachfolgerfunktion, d.h, n + 1 falls n + 1 ∈ AP , AP f (n) := n sonst. I I 0̇AP := 0 ˛ A Q̇m P := (t, st , bt0 , . . . , btm ) ˛ t ∈ T }. I Qj AP = ∅ für alle j 6= m. Die Struktur AP beschreibt also vollständig die Berechnung von P bei Eingabe [ε]. 671 Beweis von Lemma 7.49 (cont.) 3. Definition des Satzes ψP . Wir definieren einen Satz ψP := ψOrd ∧ ψQ ∧ ψAnfang ∧ ψZeile 0 ∧ . . . ∧ ψZeile r wie folgt: I ˙ Ordnung ist, ḟ die zugehörige Nachfolgerfunktion, und ψOrd sagt, dass ≤ 0̇ das kleinste Element: ˙ x ψOrd := ∀x x ≤ ` ´ ˙ y ∧y≤ ˙ z) → x ≤ ˙ z ∧ ∀x∀y∀z (x ≤ ` ´ . ˙ y ∧y≤ ˙ x) → x = ∧ ∀x∀y (x ≤ y ˙ y ∨y≤ ˙ x) ∧ ∀x∀y(x ≤ ˙ ḟ (x) ∧ ∀x x ≤ ` ´ . ˙ x ∧ ∀x ¬x = ḟ (x) ∨ ∀y y ≤ ` ´ . . ˙ y ∧y≤ ˙ ḟ (x)) → (x = ∧ ∀x∀y (x ≤ y ∨ ḟ (x) = y) (Reflexivität) (Transitivität) (Antisymmetrie) (Konnexität) (N1) (N2) (N3) 672 Beweis von Lemma 7.49 (cont.) ˙ x ∧ ∀x 0̇ ≤ (Null ist Min.) (N1)–(N3) axiomatisieren die Nachfolgerfunktion. Damit die Nachfolgerfunktion auch dann eine totale Funktion ist, wenn der Träger . der Struktur endlich ist, lassen wir ḟ (x) = x für das maximale Element x zu. Für jedes n ∈ N definieren wir induktiv einen σ-Term ṅ. 0̇ ist bereits definiert. Für n ∈ N sei ˙ 1 := f (ṅ). n+ Also 1̇ = f (0̇), I 2̇ = f (f (0̇)), ... ψQ setzt den Rahmen dafür, dass Qm die Folge der Konfigurationen kodiert. ψQ ist die Konjunktion folgender Sätze: 673 Beweis von Lemma 7.49 (cont.) I Für jeden Zeitpunkt x enthält Q̇m nur eine Konfiguration.“ ” ∀x∀z∀z 0 ∀y0 . . . ∀ym ∀y00 . . . ∀ym0 “` ´ Q̇m (x, z, y0 , . . . , ym ) ∧ Q̇m (x, z 0 y00 , . . . , ym0 ) m ^ ´” ` . . → z = z0 ∧ yi = yi 0 i=0 I Wenn eine Konfiguration eine Zeilennummer ≤ r hat, so gibt es ” eine Nachfolgekonfiguration.“ “` ´ ˙ ṙ ∀x∀z∀y0 . . . ∀ym Q̇m (x, z, y0 , . . . , ym ) ∧ z ≤ ” ` . → ¬x = ḟ (x) ∧ ∃z 0 ∃y00 . . . ∃yk0 Q̇m (ḟ (x), z 0 , y00 , . . . , ym0 ) 674 Beweis von Lemma 7.49 (cont.) I I Wenn eine Konfiguration eine Zeilennummer > r hat, so gibt es ” keine Konfigurationen zu späteren Zeitpunkten.“ “` ´ ˙ ṙ ∀x∀z∀y0 . . . ∀ym Q̇m (x, z, y0 , . . . , ym ) ∧ ¬z ≤ ” ` . ˙ x 0 ∧ ¬x = → ∀x 0 (x ≤ x 0 ) → ∀z 0 ∀y00 . . . ∀ym0 ¬Q̇m (x 0 , z 0 , y00 , . . . , ym0 ) ψAnfang besagt, dass Q̇m zum Zeitpunkt 0 die Anfangskonfiguration (s0 = 0, b0i = 0 für alle i) enthält: ψAnfang := Q̇m (0̇, 0̇, 0̇, . . . , 0̇). I Für 0 ≤ s ≤ r sei ψZeile s in Abhängigkeit vom Befehl in Zeile s wie folgt definiert: I Ist Zs = vi ← vi + 1, so ist “ ψZeile s := ∀x∀y0 . . . ∀ym Q̇m (x, ṡ, y0 , . . . , ym ) ” ˙ 1, y0 , . . . , yi−1 , ḟ (yi ), yi+1 , . . . , ym ) → Q̇m (ḟ (x), s + 675 Beweis von Lemma 7.49 (cont.) I Ist Zs = vi ← vi −1, so ist “ ψZeile s := ∀x∀y0 . . . ∀ym Q̇m (x, ṡ, y0 , . . . , ym ) `` . ´ ˙ 1, y0 , . . . , ym ) → yi = 0̇ ∧ Q̇m (ḟ (x), s + ` . . ∨ ¬yi = 0̇ ∧ ∃y(ḟ (y) = yi ´´” ˙ 1, y0 , . . . , yi−1 , y, yi+1 , . . . , ym )) ∧ Q̇m (ḟ (x), s + . I Ist Zs = GOTO s 0 , so ist “ ψZeile s := ∀x∀y0 . . . ∀ym Q̇m (x, ṡ, y0 , . . . , ym ) ´ → Q̇m (ḟ (x), s˙0 , y0 , . . . , ym ) 676 Beweis von Lemma 7.49 (cont.) I I Ist Zs = IF vi = ε GOTO s 0 , so ist “ ψZeile s := ∀x∀y0 . . . ∀ym Q̇m (x, ṡ, y0 , . . . , ym ) `` . ´ → yi = 0̇ ∧ Q̇m (ḟ (x), s˙0 , y0 , . . . , ym ) ` ´´” . ˙ 1, y0 , . . . , ym ) ∨ ¬yi = 0̇ ∧ Q̇m (ḟ (x), s + Ist Zs = IF vi ? | GOTO s 0 , so ist “ ψZeile s := ∀x∀y0 . . . ∀ym Q̇m (x, ṡ, y0 , . . . , ym ) `` ´ . → ¬yi = 0̇ ∧ Q̇m (ḟ (x), s˙0 , y0 , . . . , ym ) ` . ´´” ˙ 1, y0 , . . . , ym ) ∨ yi = 0̇ ∧ Q̇m (ḟ (x), s + 677 Beweis von Lemma 7.49 (cont.) 4. Bedeutung des Satzes ψP . Es ist leicht, zu beweisen, dass AP |= ψP . (?) Ferner kann man für jede σ-Struktur A mit A |= ψP per Induktion über t ≥ 0 zeigen: A |= Q̇m (ṫ, ṡt , ḃt0 , . . . , ḃtm ). (??) 5. Definition des Satzes ϕP . Wir setzen ` ´ ˙ ṙ ∧ ∃y0 . . . ∃ym Q̇m (x, z, y0 , . . . , ym ) . ϕP := ψP → ∃x∃z ¬z ≤ Behauptung: ϕP allgemeingültig ⇐⇒ P[ε] ↓ . Beweis: =⇒“: ” ϕP allgemeingültig =⇒ AP |= ϕP 678 Beweis von Lemma 7.49 (cont.) ´ ` ˙ ṙ ∧ ∃y0 . . . ∃ym Q̇m (x, z, y0 , . . . , ym ) =⇒ AP |= ∃x∃z ¬z ≤ (?) =⇒ ex. t ∈ T , s > r : βt = (s, bt0 , . . . , btm ) Def. AP =⇒ P[ε] ↓ . ⇐=“: Es gelte P[ε] ↓. Dann gibt es ein t ∈ T , so dass st > r . Wähle so ein t. ” Sei A σ-Struktur. Falls A 6|= ψP , so A |= ϕP . Nehmen wir also an, A |= ψP . Wegen (??) gilt dann A |= Q̇m (ṫ, ṡt , ḃt0 , . . . , ḃtm ). Also ` ´ ˙ ṙ ∧ ∃y0 . . . ∃ym Q̇m (x, z, y0 , . . . , ym ) A |= ∃x∃z ¬z ≤ √ und damit A |= ϕP . 679 Die Unentscheidbarkeit der Logik der ersten Stufe Satz 7.50 Pσ-Allg , das Allgemeingültigkeitsproblem für σ-Sätze, ist nicht G-entscheidbar. Korollar 7.51 Das Erfüllbarkeitsproblem für σ-Sätze ist nicht G-aufzählbar (und damit auch nicht G-entscheidbar). Bemerkung 7.52 Der Satz gilt nicht nur für unsere spezielle Symbolmenge σ, sondern für alle Symbolmengen, die mindestens ein mindestens 2-stelliges Funktions- oder Relationsymbol enthalten. 680 Beweis von Satz 7.50 Nehmen wir an, das Allgemeingültigkeitsproblem wäre entscheidbar, etwa durch ein Programm PA . Sei Q ein GOTO-Programm, dass die Menge {hPi | P GOTO-Programm über A} entscheidet und R ein GOTO-Programm, das die Abbildung hPi 7→ ϕP aus Lemma 7.49 berechnet. Dann entscheidet folgendes Programm (mit Unterprogrammen PA , Q, R, Null, wobei Null ein GOTO-Programm ist, das die Funktion f : A∗ → A∗ mit f (x) = ε für alle x ∈ A∗ berechnet) das spezielle Halteproblem Hε : 0. v1 ← Q(v0 ) 1. IF v1 = ε GOTO 5 2. v0 ← R(v0 ) 3. v0 ← PA (v0 ) 4. GOTO 6 5. v0 ← Null Das ist ein Widerspruch, weil Hε nach Satz 7.45 unentscheidbar ist. 681