Logik und Beweisbarkeit Kap. III - Berechenbarkeitstheorie (Sommer 2017) Martin Mundhenk Univ. Jena, Institut für Informatik 2. Juni 2017 Vorlesung Logik und Beweisbarkeit (Sommer 2017) 1. Aussagenlogik 2. Arithmetik 3. Berechenbarkeitstheorie 4. Unvollständigkeitssätze 3 Berechenbarkeitstheorie 3. Berechenbarkeitstheorie URM-berechenbare Funktionen und die These von Church Entscheidbare Mengen Reduzierbarkeit Semi-entscheidbare Mengen Beweissysteme (Literatur: Nigel Cutland: Computability (Cambridge University Press) ) 3.0.1 3.1 URM-berechenbare Funktionen und die These von Church und Turing In diesem Abschnitt wird das Computer-Modell URM vorgestellt, mit dem man Funktionen auf den natürlichen Zahlen in • berechenbare Funktionen (d.h. solche, für die es ein URM-Programm gibt) und • nicht-berechenbare Funktionen (d.h. solche, für die es kein URM-Programm gibt) unterscheiden kann. Wir werden für allerlei Funktionen zeigen, wie sie von URM-Programmen berechnet werden können. Das ist (leider) technisch recht aufwendig, überzeugt uns aber davon, dass man alles, was von einem Computer-Modell erwarten kann, auch vom URM-Modell erreicht wird. Am Ende steht die These von Church und Turing, nach der man alles, was man in diesem Modell berechnen kann, auch intuitiv“ berechnen kann. ” Das erlaubt uns für die Zukunft davor, intuitiv“ statt formal zu ” argumentieren (wenn wir die Fallstricke der intuitiven Argumentation kennen). 3.1.1 Eine Unlimited Register Machine (URM) besteht aus • Registern R0 , R1 , R2 , . . . , Rk (für k ∈ N), die jeweils eine natürliche Zahl speichern können, und • einem URM-Programm. Ein URM-Programm besteht aus einer Folge folgender Befehle. a, b, c stehen für beliebige natürliche Zahlen. Befehl Z(a) Wirkung setze Register Ra auf 0 S(a) addiere 1 zum Register Ra T(a, b) kopiere den Inhalt von Register Ra nach Rb J(a, b, c) falls Register Ra und Rb den gleichen Inhalt haben, dann springe zu Zeile c des Programms 3.1.2 Beispiele für URM-Programme Addition 0: 1: 2: 3: 4: 5: T(1,0) Z(3) J(2,3,6) S(0) S(3) J(0,0,2) R0 := R1 R3 := 0 while R2 > R3 : R0 := R0 + 1 R3 := R3 + 1 Addiere die Inhalte von R1 und R2 und schreibe das Ergebnis nach R0 . (m:) (m+1:) (m+2:) (m+3:) (m+4:) (m+5:) T(c,a) Z(k) J(b,k,m+6) S(c) S(k) J(0,0,m+2) Rc := Ra Rk := 0 while Rb > Rk : Rc := Rc + 1 Rk := Rk + 1 Addiere die Inhalte von Ra und Rb und schreibe das Ergebnis nach Rc . ADDa,b,c (Rc := Ra + Rb ) Multiplizieren und Potenzieren 0: 1: 2: 3: 4: 5: Z(3) Z(0) J(2,3,6) ADD1,0,0 S(3) J(0,0,2) R3 := 0 R0 := 0 while R2 > R3 : R0 := R0 + R1 R3 := R3 + 1 R0 := R1 · R2 MULa,b,c (Rc := Ra · Rb ) 0: 1: 2: 3: 4: 5: 6: Z(3) Z(0) S(0) J(2,3,7) MUL1,0,0 S(3) J(2,2,3) R3 := 0 R0 := 1 while R2 > R3 : R0 := R0 · R1 R3 := R3 + 1 R0 := R1R2 POWa,b,c (Rc := RaRb ) 3.1.4 Dekrement 0: 1: 2: 3: 4: 5: 6: 7: Z(0) Z(2) J(1,2,8) S(2) J(1,2,8) S(0) S(2) J(0,0,4) R0 := 0 R2 := 0 if R1 = 0: Ende R2 := 1 while R1 > R2 R0 := R0 + 1 R2 := R2 + 1 Ziehe 1 vom Inhalt von R1 ab und schreibe das Ergebnis nach R0 . (m:) (m+1:) (m+2:) (m+3:) (m+4:) (m+5:) (m+6:) (m+7:) (m+8:) Z(k+1) Z(k) J(a,k,m+8) S(k) J(a,k,m+8) S(k) S(k+1) J(1,1,m+4) T(k+1,b) Ziehe 1 vom Inhalt von Ra ab und schreibe das Ergebnis nach Rb . Dabei werden Rk und Rk +1 benutzt. DECa,b (Ra := Rb − 1) Subtraktion auf den natürlichen Zahlen 0: 1: 2: 3: 4: 5: 6: 7: Z(0) T(1,3) T(2,4) J(4,0,8) DEC3,3 DEC4,4 J(0,0,3) T(3,0) R3 := R1 R4 := R2 while R4 > 0: R3 := R3 − 1 R4 := R4 − 1 R0 := R3 Subtrahiere den Inhalt von R2 vom Inhalt von R1 und schreibe das Ergebnis nach R0 . SUBa,b,c (Rc := Ra − Rb ) 3.1.6 Vorzeichenfunktionen 0: Z(0) 1: J(1,0,3) 2: J(0,0,4) 3: S(0) R0 := 0 if R1 = 0: R0 := 1 Falls R1 = 0, dann R0 := 1 sonst R0 := 0 SIGa,b 0: SIG1,2 1: SIG2,0 (Rb := “Ra = 0”) Falls R1 6= 0, dann R0 := 1 sonst R0 := 0 SIGa,b (Rb := “Ra 6= 0”) Vergleiche 0: SUB1,2,3 1: SIG3,0 R3 := R1 − R2 R0 := “R3 > 0” Falls R1 > R2 , dann R0 := 1 sonst R0 := 0 GTHa,b,c (Rc := “Ra > Rb ”) 0: Z(0) 1: J(1,2,4) 2: GTH1,2,0 3: J(0,0,6) 4: Z(0) 5: S(0) if R1 = R2 else R0 := “R1 > R2 ” then R0 := 1 Falls R1 > R2 , dann R0 := 1, sonst R0 := 0 GEQa,b,c (Rc := “Ra > Rb ”) Division und Rest 0: 1: 2: 3: 4: 5: 6: 7: T(1,3) Z(0) GTH2,3,4 J(4,6,5) J(0,0,8) SUB3,2,3 S(0) J(0,0,2) R3 := R1 R0 := 0 R0 := R1 − R2 · (R1 /R2 ) while R3 > R2 : R3 := R3 − R2 R0 := R0 + 1 R0 := R1 DIV R2 DIVa,b,c 0: DIV1,2,3 1: MUL2,3,4 2: SUB1,4,0 (Rc := Ra DIV Rb ) R0 := R1 MOD R2 MODa,b,c (Rc := Ra MOD Rb ) 3.1.9 Division und Rest mit Konstanten 0: 1: .. . Z(2) S(2) .. . k: S(2) k+1: DIV1,2,0 0: 1: .. . Z(2) S(2) .. . k: S(2) k+1: MOD1,2,0 R0 := R1 /k R0 := R1 MOD k DIVa,k,c (Rc := Ra DIV k) MODa,k,c (Rc := Ra MOD k) 3.1.10 Primzahlen 0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: Z(0) Z(2) J(1,2,13) Z(2) J(1,2,13) S(2) J(1,2,12) MOD1,2,3 J(3,0,13) S(2) J(1,2,12) J(1,1,7) S(0) if R1 = 0: Ende if R1 = 1: Ende R2 := 2 R0 := “R1 ist Primzahl” if R1 = 2: goto 12 PRIMa,b (Rb := “Ra ist Primzahl”) if R1 mod R2 = 0: Ende R2 = R2 + 1 if R1 = R2 : goto 12 goto 7 Ausgabe 1 3.1.11 n-te Primzahl 0: 1: 2: 3: 4: 5: 6: 7: 8: Z(2) Z(0) S(0) S(0) J(1,2,9) S(0) PRIM0,3 ADD2,3,2 J(0,0,4) R2 := 0 R0 := 2 R0 := R1 -te Primzahl while R1 > R2 : R0 := R0 + 1 PRIMIa,b R2 := R2 + “R0 ist prim” (Rb := Ra -te Primzahl) URM-Programme – Formale Definition Definition 3.1 (Syntax von URM-Programmen) Ein URM-Programm P ist eine endliche Folge von Befehlen der Art Z(a), S(a), T(a, b) und J(a, b, c) für a, b, c ∈ N. Sei m das Maximum aller a, b in Befehlen Z(a), S(a), T(a, b) und J(a, b, c), die im URM-Programm P vorkommen. Dann benutzt P (höchstens) die Register R0 , R1 , . . . , Rm , und man sagt: P ist URM-Programm mit m Registern. Bem.: wenn P ein Programm mit m Registern ist, dann ist P auch ein Programm für m0 Register für alle m0 > m. Definition 3.2 (Konfiguration eines URM-Programms) Sei P = (I0 , I1 , . . . , Is−1 ) ein URM-Programm mit k Registern. Eine Konfiguration von P ist ein Element von Nk+2 . P Definition 3.3 (Konfigurationsübergangsrelation → ) Sei P = (I0 , I1 , . . . , Is−1 ) ein URM-Programm mit k Registern, und c = (c0 , . . . , ck , pz) sowie c 0 = (c00 , . . . , ck0 , pz 0 ) seien zwei Konfigurationen von P. P Es gilt c → c 0 gdw. pz 6 s − 1 und • Ipz = Z (a), ca0 = 0 , ci0 = ci für i 6= a, und pz 0 = pz + 1, oder • Ipz = S(a), ca0 = ca + 1, ci0 = ci für i 6= a, und pz 0 = pz + 1, oder • Ipz = T (a, b), cb0 = ca , ci0 = ci für i 6= b, und pz 0 = pz + 1, oder • Ipz = J(a, b, c), ci0 = ci für alle i, und I I P ∗ ca = cb und pz 0 = c, oder ca 6= cb und pz 0 = pz + 1. P → ist die reflexive und transitive Hülle von →. 3.1.14 URM-berechenbare Funktionen Definition 3.4 (URM-berechenbare Funktionen) Eine partielle Funktion f : Nk → N ist URM-berechenbar, falls es ein URM-Programm P = (I0 , . . . , Is −1 ) mit ` > k Registern gibt, so dass für alle a1 , . . . , ak ∈ N gilt: 1. Wenn f (a1 , . . . , ak ) definiert ist, dann gibt es c1 , . . . , c` , pz ∈ N mit pz > s , so dass P ∗ (0, a1 , . . . , ak , 0, . . . , 0) → (f (a1 , . . . , ak ), c1 , . . . , c` , pz ) {z } | {z } | Startkonfiguration von P (a1 , . . . , ak ) Endkonfiguration ( umgangssprachlich: die Berechnung P(a1 , . . . , ak ) hält mit f (a1 , . . . , ak ) als Inhalt von Register R0 ). 2. Wenn f (a1 , . . . , ak ) undefiniert ist, dann gilt für jede Konfiguration P ∗ c 0 = (c00 , . . . , c`0 , pz 0 ) mit (0, a1 , . . . , ak , 0, . . . , 0) → c 0 , dass pz 0 < s ( umgangssprachlich: die Berechnung P(a1 , . . . , ak ) hält nicht ). 3.1.15 Programme lassen sich als Zahlen darstellen Jedes URM-Programm lässt sich als eine natürliche Zahl darstellen. Wir schreiben dann auch Pi für das Programm, das durch die Zahl i dargestellt wird. Es gibt ein universelles Programm U, das beliebige Programme simulieren kann. Das heißt • U(i, x) hält genau dann, wenn Pi (x) hält, und • wenn Pi (x) hält, dann liefert U(i, x) das gleiche Ergebnis. Um das zeigen zu können, brauchen wir ein paar Kodierungsfunktionen. 3.1.16 Kodierung von Zahlentupeln durch Zahlen Tupel (r1 , r2 , . . . , rk ) ∈ Nk können kodiert werden mittels τ : Nk>0 → N mit Y r pi i , τ (r1 , r2 , . . . , rk ) = p0k · i>1 wobei pi die i-te Primzahl ist (p0 = 2). Bsp.: (1, 2, 3, 4) wird kodiert durch τ (1, 2, 3, 4) = 24 · 31 · 52 · 73 · 114 = 6026235600. Lemma 3.5 (τ ist eine Kodierungsfunktion) Obige Funktion τ : Nk>0 → N ist injektiv. Wir werden nun zeigen, dass die Dekodierung URM-berechenbar ist. 3.1.17 Ein paar nützliche Abkürzungen CONSTa,b Ra := b 0: 1: 2: Z(a) S(a) S(a) .. . b: S(a) JGEa,b,c falls Ra > Rb : gehe zu Progr.zeile c 0: GEQa,b,1 1: SIG1,1 2: Z(2) 3: J(1,2,c) Ein paar nützliche Abkürzungen JNZa,b JZa,b falls Ra > 0: gehe zu Programmzeile b falls Ra = 0: gehe zu Programmzeile b 0: 1: 2: Z(k) J(a,k,3) J(0,0,b) 0: 1: Z(k) J(a,k,b) Lies einen Eintrag aus einem kodierten Tupel DECODEa,b,c : Dekodiere aus dem Tupelcode in Ra den Eintrag mit dem Index, der in Rb steht, und schreibe ihn nach Rc . 0: 1: 2: 3: 4: 5: 6: 7: T(a,5) Z(c) PRIMIb,6 MOD5,6,6 JNZ6,8 DIV5,6,5 S(c) J(0,0,3) R5 := Ra Rc := 0 R6 := Rb -te Primzahl while R5 mod R6 = 0: R5 := R5 /R6 Rc := Rc + 1 Kodierung von Programmzeilen I 0 = {Z(n), S(n), T(m, n), J(m, n, q) | m, n, q ∈ N} die Menge aller Programmzeilen von URM-Programmen und I = {(0, n), (1, n), (2, m, n), (3, m, n, q) | m, n, q ∈ N} eine Kodierung von I 0 durch Zahlen-Tupel. Sei Ein URM-Programm kann als Tupel von Programmzeilen (I0 , I1 , . . . , Is−1 ) aufgefasst werden. S k Die Menge P aller URM-Programme ist dann I . k>0 3.1.21 Kodierung von Programmen Ein URM-Programm kann als Tupel von Programmzeilen (I0 , I1 , . . . , Is−1 ) aufgefasst werden. S k Die Menge P aller URM-Programme ist dann I . k>0 Lemma 3.6 Die Funktion γ : P → N mit γ((I0 , I1 , . . . , Is−1 )) = τ (τ (I0 ), τ (I1 ), . . . , τ (Is−1 )) ist injektiv. Die Umkehrfunktionen • γ1 (γ((I0 , I1 , . . . , Is−1 ))) = s und • γ2 (γ((I0 , I1 , . . . , Is−1 )), j) = τ (Ij ) für j 6 s − 1 sind URM-berechenbar. Beispiel Zahl: 29341092968880130685859126855997665803940891154 194718966061225124871338028363811166906053312029 860704766684119068553698957391021815684919404149 525422311322197477282036911576527410891359828840 604716847195150046234935280003486289210775337829 473089708522502028024461870587335480341968438575 11767528212232036821660585701465606689453125000 = τ (432, 60, 100) URM-Programm: J(0,0,0) S(1) Z(2) (1) Die Funktion ϕ2934109296...453125000 : N → N ist die überall undefinierte Funktion, (1) d.h. für alle n ∈ N gilt: ϕ2934109296...453125000 (n) ist undefiniert. γ −1 (n) = (I0 , . . . , Is−1 ) mit s = max{i | 2i teilt n} i max{i | pj teilt n}, Ij = τ (2, 0, 0), und falls τ −1 (i, 1) ∈ {0, 1, 2, 3} für das Maximum i sonst (d.i. T(0, 0)) Also ist γ −1 (n) für jedes n ∈ N definiert (auch wenn γ keine Bijektion ist). Z.B. ist γ −1 (n) für jedes ungerade n das leere Programm. Das stört uns nicht, da uns ausreicht, dass γ injektiv ist. 3.1.24 Notationen Sei n ∈ N. • Pn ist das URM-Programm mit Dekodierung γ −1 (n) = Pn . (k) • ϕn bezeichnet die Funktion Nk → N, die durch das URM-Programm Pn berechnet wird. (1) • Für ϕn schreiben wir auch ϕn . 3.1.25 Eine nicht-URM-berechenbare Funktion Definiere ψ : N → N mit ψ(n) = ( 0, 1, falls ϕn (n) = 1 sonst Satz 3.7 ψ ist nicht URM-berechenbar. Beweis: Annahme: ψ ist URM-berechenbar, d.h. ψ = ϕm für ein m ∈ N. Dann gilt ψ(m) = 1 ⇒ ϕm (m) 6= 1 ⇒ ψ(m) 6= 1 und ψ(m) 6= 1 ⇒ ϕm (m) = 1 ⇒ ψ(m) = 1. Insgesamt: ψ(m) = 1 ⇔ ψ(m) 6= 1 d X Das universelle Programm U (k) simuliert die Berechnung k-stelliger Funktionen. Es erhält als Eingabe e, x1 , . . . , xk und berechnet die gleiche Ausgabe wie Pe (x1 , . . . , xk ) – bzw. hält nicht. Der grobe Algorithmus arbeitet wie folgt. Eingabe e , x1 , . . . , xk schreibe den Konfigurationscode von x1 , . . . , xk nach R2 setze den Programmzähler R3 auf 0 solange der Programmzähler < Länge des Programmcodes in R1 : simuliere den durch den Programmzähler bestimmten Befehl des Programmcodes in R1 auf dem Konfigurationscode in R2 und setze den Programmzähler entsprechend um schreibe den Inhalt von Register 0 aus dem Konfigurationscode nach R0 3.1.27 Der Konfigurationscode Jedes Programm benutzt nur eine feste Zahl R0 , R1 , R2 , . . . , Rk von Registern. Alle Registerinhalte r0 , r1 , r2 , . . . , rk können als τ (r0 , . . . , rk ) kodiert werden. Diese Zahl heißt Konfigurationscode. Im Konfigurationscode ist k unbedeutend. 3.1.28 Lies den Inhalt eines Registers aus einem Konfigurationscode READa,b,c : Lies aus dem Konfigurationscode/Programmcode in Ra den Inhalt von Register/Zeile RRb und schreibe ihn nach Rc . 0: 1: 2: 3: 4: 5: 6: 7: T(a,5) Z(c) PRIMIb+1,6 MOD5,6,6 JNZ6,8 DIV5,6,5 S(c) J(0,0,3) R5 := Ra Rc := 0 R6 := Rb+1 -te Primzahl while R5 mod R6 = 0: R5 := R5 /R6 Rc := Rc + 1 3.1.29 Setze ein Register auf 0 im Konfigurationscode RESETa,b : Schreibe im Konfigurationscode in Ra den Inhalt von Register RRb als 0. 0: 1: 2: 3: 4: PRIMIb+1,5 MODa,5,6 JNZ6,5 DIVa,5,a J(0,0,1) R5 := Rb+1 -te Primzahl while R2 mod R5 = 0: Ra := Ra /R5 Schreibe den Inhalt eines Registers im Konfigurationscode WRITEa,b,c : Schreibe den Inhalt von Rc in den Konfigurationscode in Ra als Inhalt von Register RRb . 0: 1: 2: 3: 4: 5: 6: RESETa,b PRIMIb+1,5 Z(6) J(6,c,7) MULTa,5,a S(6) J(0,0,3) R5 := Rb+1 -te Primzahl R6 := 0 while R6 < Rc : Ra := Ra · R5 R6 := R6 + 1 Berechne den Konfigurationscode beim Start der Simulation Der Inhalt der Register R2 , . . . , Rk+1 wird als Konfigurationscode (für Register (R0 , )R1 , . . . , Rk ) nach R2 geschrieben. INITk : 0: 1: 2: 3: 4: 2k-1: 2k: 2k+1: CONSTk+2,1 CONSTk+3,1 WRITEk+2,k+3,2 S(k+3) WRITEk+2,k+3,3 .. . S(k+3) WRITEk+2,k+3,k+1 T(k+2,2) Rk+2 := 1 Rk+3 := 1 kodiere R2 als R1 in den Konfigurationscode in Rk+2 kodiere R3 als R2 in den Konfigurationscode in Rk+2 kodiere Rk+1 als Rk in den Konfigurationscode in Rk+2 schreibe den Konfigurationscode aus Rk+2 nach R2 Simulation der einzelnen URM-Befehle: Z(b) simZb : simuliere Z(b), d.h. schreibe im Konfigurationscode in R2 den Inhalt von Register RRb als 0. 0: RESET2,b 1: S(3) Programmzähler+1 3.1.33 Simulation der einzelnen URM-Befehle: S(b) simSb : simuliere S(b), d.h. addiere 1 im Konfigurationscode in R2 zum Inhalt von Register RRb . 0: PRIMIb,5 1: MULT2,5,2 2: S(3) R5 := Rb -te Primzahl R2 := R2 · R5 Programmzähler+1 3.1.34 Simulation der einzelnen URM-Befehle: T(a, b) simTb,c : simuliere T(b, c), d.h. schreibe im Konfigurationscode in R2 den Inhalt von Register RRb in Register RRc . 0: READ2,b,5 1: WRITEc,5 2: S(3) Programmzähler+1 3.1.35 Simulation der einzelnen URM-Befehle: J(b, c, d ) simJb,c,d : simuliere J(b, c, d), d.h. setze den Programmzähler auf den Inhalt von Rd , falls im Konfigurationscode in R2 die Register RRb und Register RRc gleichen Inhalt haben. 0: 1: 2: 3: 4: 5: READ2,b,5 READ2,c,6 J(5,6,5) S(3) J(0,0,6) T(d,3) if Rb 6= Rc then Programmzähler+1 else Programmzähler:=Rd 3.1.36 Simulation einer Zeile des Programmcodes SIM: Simuliere Zeile R3 im Programmcode in R1 auf dem Konfigurationscode in R2 . 0: 1: 2: 3: 4: 5: 6: 7: 8: 9: READ1,3,5 DECODE5,1,6 DECODE5,2,7 JNZ6,6 simZ7 J(0,0,Ende) DEC6,6 JNZ6,10 simS7 J(0,0,Ende) 10: 11: 12: R5 := R3 -te Programmzeile 13: R6 := τ −1 (R5 , 1) 14: R7 := τ −1 (R5 , 2) 15: if R6 = 0 16: simuliere Z(R7 ) 17: goto Ende 18: R6 := R6 − 1 19: if R6 = 0 20: simuliere S(R7 ) 22: goto Ende 23: 24: Ende: DEC6,6 JNZ6,16 DECODE5,2,8 DECODE5,1,7 simT7,8 J(0,0,Ende) DEC6,6 JNZ6,Ende DECODE5,3,9 DECODE5,2,8 DECODE5,1,7 simJ7,8,9 J(0,0,Ende) S(3) R6 := R6 − 1 if R6 = 0 R8 := τ −1 (R5 , 2) R7 := τ −1 (R5 , 1) simul. T(R7 , R8 ) goto Ende R6 := R6 − 1 if R6 = 0 R9 := τ −1 (R5 , 3) R8 := τ −1 (R5 , 2) R7 := τ −1 (R5 , 1) sim.J(R7 , R8 , R9 ) goto Ende else: Progzähl.+1 Das universelle Programm U (k) U (k) (e, x1 , . . . , xk ) simuliert Pe (x1 , . . . , xk ) und berechnet ϕe (x1 , . . . , xk ). 0: 1: 2: 3: 4: 5: 6: 7: 8: INITk CONSTk+2,0 READ1,k+2,4 Z(3) JGE3,4,7 SIM J(0,0,4) Z(0) READ2,0,0 schreibe R2 , . . . , Rk+1 als Konfigurationscode nach R2 schreibe die Zeilenzahl des Programmes in R1 nach R4 setze den Programmzähler PZ auf 0 while PZ < Zeilenzahl des Programms: simuliere den nächsten Programmschritt schreibe das bei der Simulation berechnete Ergebnis nach R0 3.1.38 (k) Die universelle Funktion ψU Satz 3.8 (k) Für jedes k ∈ N ist die universelle Funktion ψU URM-berechenbar. Stelligkeit von Funktionen Wir haben den Begriff der Berechenbarkeit formal für Funktionen Nk → N definiert. Wir hätten das genauso für Funktionen Nk → N` machen können. Da man alle k-Tupel über N mittels der Tupelkodierung τ als natürliche Zahlen kodieren kann, unterscheiden wir von jetzt ab nicht zwischen Tupeln und Zahlen. Wir werden in Zukunft die Tupel-Konvention benutzen: Was für Zahlen geht, das geht auch für Tupel. 3.1.40 Die These von Church und Turing Es gibt eine Vielzahl formaler Begriffe der Berechenbarkeit (z.B. URM-Berechenbarkeit, Turing-B., µ-Rek., λ-B., Post-B., . . . ), von denen man formal zeigen kann, dass sie äquivalent sind. Man kennt keine Funktion, die • intuitiv“ berechenbar ist und ” • nicht URM-berechenbar ist. These von Church und Turing Die im intuitiven Sinne berechenbaren Funktionen sind genau die URM-berechenbaren Funktionen. Was ist wichtig? • Programme/berechenbare Funktionen lassen sich durch Zahlen darstellen. • Alles, was man intuitiv mit diesen Zahlen berechnen kann, kann man auch formal von URM-Programmen berechnen lassen. 3.1.42 3.2 Entscheidbare Mengen Wir wollen ja mal zeigen, dass die Menge der Formeln, die man mit den Peano-Axiomen beweisen kann, nicht die Menge der Formeln ist, die vom Standardmodell der natürlichen Zahlen erfüllt werden. Also sind wir eher an Mengen interessiert als an Funktionen. In diesem Abschnitt wird die Unterscheidung zwischen berechenbaren und nicht-berechenbaren Funktionen übertragen auf Mengen – dort wird zwischen entscheidbaren und nicht-entscheidbaren Mengen unterschieden. Letztlich interessieren uns fast nur die schwierigeren“ nicht-entscheidbaren ” Mengen. Wir werden ein paar Mengen mit dieser Eigenschaft kennenlernen. 3.2.1 Definition 3.9 (entscheidbare Mengen) Eine Menge A ⊆ N heißt entscheidbar, falls die charakteristische Funktion χA : N → {0, 1} mit ( 1, falls n ∈ A χA (n) = 0, falls n 6∈ A berechenbar ist. Beispiel: {n | n ist Primzahl} ist entscheidbar. PRIM1,0 berechnet die charakteristische Funktion. Komplemente entscheidbarer Mengen {n | n ist keine Primzahl} ist entscheidbar. Die charakt. Funktion wird durch folgendes Programm berechnet. PRIM1,0 SIG0,0 Lemma 3.10 Wenn A entscheidbar ist, dann ist auch A entscheidbar. Beweis. Sei PA das Programm für die charakteristische Funktion von A. Dann berechnet folgendes Programm die charakt. Funktion von A. PA SIG0,0 X 3.2.3 Definition 3.11 (Das beschränkte Halteproblem) (k) HB := {(e, x1 , . . . , xk , t) | Pe (x1 , . . . , xk ) hält nach 6 t Schritten} Lemma 3.12 (k) HB ist entscheidbar. Beweis: Das Universelle Programm lässt sich so modifizieren, dass die Anzahl der simulierten Schritte gezählt und die Schrittsimulationsschleife nach 6 t Wiederholungen verlassen wird. Wenn dann der Programmzähler kleiner als die Programmlänge ist, dann hat das simulierte Programm nicht nach t Schritten gehalten. Anderenfalls hat es nach 6 t Schritten gehalten. X Weitere Entscheidungsprobleme die wir noch betrachten werden Definition 3.13 (Halteprobleme) • das spezielle Halteproblem K := {n | Pn (n) hält} • das allgemeine Halteproblem H := {(n, m) | Pn (m) hält} • das 0-Halteproblem H0 := {n | Pn (0) hält} • TOTAL := {n | ϕn ist eine totale Funktion} Definition 3.14 • TOTAL := {n | ϕn ist eine totale Funktion} 3.2.5 Satz 3.15 Das spezielle Halteproblem K ist nicht entscheidbar. Beweis: Annahme: K ist entscheidbar. Also gibt es ein Programm R , das χK berechnet. Daraus lässt sich folgendes Programm Q konstruieren. 0: R 1: JNZ(0,1) if R0 6= 0: goto 1 Q habe die Kodierung m0 . Dann gilt: 1.) Q (m0 ) hält ⇒ R (m0 ) = 0 ⇒ Pm0 (m0 ) hält nicht, d.h. Q (m0 ) hält nicht d 2.) Q (m0 ) hält nicht ⇒ R (m0 ) = 1 ⇒ Pm0 (m0 ) hält, d.h. Q (m0 ) hält Also gilt: Q (m0 ) hält gdw. Q (m0 ) hält nicht. Folglich kann es das Programm R nicht geben, d.h. K ist nicht entscheidbar. X Satz 3.16 Das allgemeine Halteproblem H ist nicht entscheidbar. Beweis: Annahme: H ist entscheidbar. Dann gibt es ein Programm R, das χH berechnet. Daraus lässt sich folgendes Programm Q konstruieren. 0: T(1,2) 1: R R2 := R1 Es gilt ϕγ(Q) (n) = χK (n, n), für alle n ∈ N. Also ist ϕγ(Q) = χK . Folglich ist K entscheidbar. Das widerspricht Satz 3.15 d X Satz 3.17 Das 0-Halteproblem H0 ist nicht entscheidbar. Beweis: Für jedes n gilt: Pn (n) hält genau dann, wenn folgendes Programm Qn mit Eingabe 0 hält. 0: n-1: n: S(1) .. . S(1) Pn R1 := n Sei f die Funktion mit f (n) = γ(Qn ). (γ ist die Funktion aus Lemma 3.6 zur Kodierung von Programmen, γ1 (n) die Länge von Pn und γ2 (n, i) die i-te Programmzeile.) γ1 (Q n)−1 n n+γ (n) Q β((1,1)) γ2 (n,j ) f (n) = p0 1 · pi · pn+1+ j ist total und berechenbar. j =0 i =1 Also gilt für jedes n ∈ N: n ∈ K genau dann, wenn f (n) ∈ H0 . Wenn H0 entscheidbar ist, dann ist folglich auch K entscheidbar. Da K nicht entscheidbar ist (3.15), ist folglich H0 nicht entscheidbar. X 3.3 Reduzierbarkeit Um die Nicht-Enscheidbarkeit des allgemeinen Halteproblems und des 0-Halteproblems zu zeigen, haben wir darauf zurückgegeriffen, dass wir die Nicht-Entscheidbarkeit des speziellen Halteproblems bereits gezeigt haben. Wir haben also eine Beziehung zwischen den Entscheidbarkeiten der verschiedenen Mengen aufgezeigt. Das ist eine übliche Methode in der Berechenbarkeitstheorie. Deshalb gibt es für diese Beziehung zwischen Mengen einen Namen: Reduzierbarkeit. Diesen Begriff schauen wir uns in diesem Abschnitt an. 3.3.1 Definition 3.18 (Reduktion A ≤ B) Seien A, B ⊆ N Mengen. A ist reduzierbar zu B (A ≤ B), falls es eine totale und berechenbare Funktion f : N → N gibt, so dass für alle n ∈ N: n ∈ A gdw. f (n) ∈ B. 3.3.2 Wir haben gerade gesehen: Lemma 3.19 1. K ≤ H0 2. K ≤ H 3. H0 ≤ H Beweis: K ≤ H0 mittels der Reduktionsfunktion f im Beweis von Satz 3.17. K ≤ H mittels der Reduktionsfunktion f mit f (n) = (n, n). f ist total und berechenbar, und für jedes n gilt: n ∈ K gdw. (n, n) ∈ H. H0 ≤ H mittels der Reduktionsfunktion g mit g (n) = (n, 0) . f ist total und berechenbar, und für jedes n gilt: n ∈ H0 gdw. (n, 0) ∈ H. X 3.3.3 Reduktion H ≤ K Lemma 3.20 H ≤K Beweis: Für (n, a) konstruiere folgendes Programm. 0: CONST1,a 1: Pn R1 := a Pn Die Kodierung f (n, a) des Programms ist berechenbar. Das Programm Pf (n,a) berechnet bei jeder Eingabe Pn (a). Nun gilt für alle (n, a) ∈ N: (n, a) ∈ H gdw. Pn (a) hält gdw. Pf (n) (m) hält bei jeder Eingabe m gdw. Pf (n,a) (f (n, a)) hält gdw. f (n, a) ∈ K X Lemma 3.21 (Eigenschaften von ≤) 1. ≤ ist reflexiv und transitiv. 2. A ≤ B genau dann, wenn A ≤ B . Beweis: A ≤ A mittels der Reduktionsfunktion f (n) = n. Wenn A ≤ B mittels Red.funktion f und B ≤ C mittels Red.funktion g , dann ist A ≤ C mittels Red.funktion g (f ( · )). Wenn A ≤ B mittels Red.funktion f , dann ist A ≤ B mit der gleichen Reduktionsfunktion f . X Lemma 3.22 H0 ≤ K Beweis: H0 ≤ K folgt aus H0 ≤ H (3.19), H ≤ K (3.20) und der Transitivität von ≤ (3.21). X Reduzierbarkeit überträgt Entscheidbarkeit abwärts Satz 3.23 Wenn A ≤ B und B ist entscheidbar, dann ist auch A entscheidbar. Beweis: Sei A ≤ B mittels Reduktionsfunktion f und B sei entscheidbar. Dann sind f und χB totale und berechenbare Funktionen. Sei PB ein Programm für χB und Pf ein Programm für f . Das folgende Programm berechnet χA . 0: Pf 1: T(0,1) 2: PB X 3.3.6 . . . und Nicht-Entscheidbarkeit aufwärts Folgerung 3.24 Wenn A ≤ B und A ist nicht entscheidbar, dann ist auch B nicht entscheidbar. Das ist äquivalent zu Satz 3.23. Anwendungsbeispiel für (3.24): H ist nicht-entscheidbar, da K nicht entscheidbar ist (3.15) und K ≤ H (3.19). 3.3.7 3.4 Semi-entscheidbare Mengen Der Begriff der Entscheidbarkeit reicht noch nicht, um zwischen den Mengen der aus den Peano-Axiomen herleitbaren Formeln und den vom Standardmodell erfüllten Formeln zu unterscheiden. Wir werden später sehen, dass beide Mengen nicht entscheidbar sind. Um einen Unterschied zwischen den beiden Mengen zu finden, brauchen wir einen allgemeineren Begriff, der mehr Mengen umfasst: die Semi-Entscheidbarkeit. Wir werden sehen, dass das spezielle Halteproblem K diese Eigenschaft hat, während sein Komplement K sie nicht hat. Das ist ein Schlüssel, um einen einfachen“ Unterschied zwischen den ” beiden o.g. Formelmengen zu finden. 3.4.1 Definition 3.25 (semi-entscheidbare Mengen) Eine Menge A ⊆ N heißt semi-entscheidbar, falls die partielle charakteristische Funktion χ0A : N → {1} mit ( 1, falls n ∈ A χ0A (n) = undefiniert, falls n 6∈ A berechenbar ist. 3.4.2 Lemma 3.26 Das spezielle Halteproblem K ist semi-entscheidbar. Beweis: Die Funktion χ0K für K = {x | Px (x) hält} wird vom folgenden Programm Q berechnet. 0: T(1,2) 1: U (1) 2: CONST0,1 R2 := R1 ( = x ) simuliere Px (x) R0 := 1 Q(n) simuliert Pn (n). Falls Pn (n) hält, wird 1 ausgegeben. Falls Pn (n) nicht hält, hält Q(n) ebenfalls nicht. X Lemma 3.27 Jede entscheidbare Menge ist semi-entscheidbar. Beweis: Sei A entscheidbar, und PA berechne χA . Dann wird χ0A vom folgenden Programm berechnet. 0: PA 1: JZ0,1 R0 := χA (x) if R0 = 0: goto 1 (d.h. if R0 = 0: loop forever) X 3.4.4 Satz 3.28 (Entscheidbarkeit vs. Semi-Entscheidbarkeit) A ist entscheidbar genau dann, wenn A und A semi-entscheidbar sind. Beweis: “⇒“: wenn A entscheidbar ist, dann ist auch A entscheidbar. ⇐“: seien A und A semi-entscheidbar, und ” Pa und Pb seien Programme für χ0A bzw. χ0A . Dann berechnet folgender Algorithmus χA . Eingabe x z := 0 solange (a, x , z ) 6∈ HB und (b , x , z ) 6∈ HB : z := z + 1 falls (a, x , z ) ∈ HB dann Ausgabe 1 sonst Ausgabe 0 Der Algorithmus hält bei jeder Eingabe x (d.h. er ist total), da es für jedes x ein t gibt mit (a, x , t ) ∈ HB oder (b , x , t ) ∈ HB . Er gibt 1 aus, wenn χ0A (x ) = 1 — also wenn x ∈ A, und gibt 0 aus, wenn χ0A (x ) = 1 — also wenn x 6∈ A. X Satz 3.29 K ist nicht semi-entscheidbar. Beweis: Sei angenommen, dass K semi-entscheidbar ist. Da K semi-entscheidbar ist (3.26), folgt mit (3.28), dass K entscheidbar ist. Das widerspricht Satz (3.15). Folglich ist K nicht semi-entscheidbar. d X 3.4.6 Satz 3.30 (≤ überträgt Semi-Entscheidbarkeit abwärts) Wenn A ≤ B und B ist semi-entscheidbar, dann ist auch A semi-entscheidbar. Beweis: Sei A ≤ B mittels der Reduktionsfunktion f , die von Pf berechnet wird. PB berechne χ0B . Dann berechnet das folgende Programm Q die Funktion χ0A . 0: 1: 2: Pf T(0,1) PB R0 := f (x) R1 := R0 R0 := χ0B (R1 ) ( = χ0B (f (x)) ) Für alle x ∈ N gilt: da x ∈ A ⇔ f (x ) ∈ B , folgt 1.) x ∈ A ⇒ Q (x ) hält mit Ausgabe 1, und 2.) x 6∈ A ⇒ Q (x ) hält nicht. X Folgerung 3.31 (≤ überträgt Nicht-Semi-Entscheidbarkeit aufwärts) Wenn A ≤ B und A ist nicht semi-entscheidbar, dann ist auch B nicht semi-entscheidbar. 3.4.7 Satz 3.32 H und H0 sind semi-entscheidbar. Beweis: H ist semi-entscheidbar: Da K semi-entscheidbar ist (3.26) und H ≤ K (3.20), folgt das mit (3.30, Reduktion überträgt Semi-Entscheidbarkeit abwärts). H0 ist semi-entscheidbar: Das folgt aus H0 ≤ H (3.19), der Semi-Entscheidbarkeit von H (s.o.) und (3.30). X Mit der Nicht-Entscheidbarkeit von H (3.16) bzw. H0 (3.17) folgt daraus mit (3.28): Satz 3.33 H und H0 sind nicht semi-entscheidbar. Exkurs 1 TOTAL und TOTAL sind beide nicht semi-entscheidbar Lemma 3.34 K ≤ TOTAL Beweis: Für n berechnet die Reduktionsfunktion f die Kodierung des folgenden Programmes Pf (n) . 0: CONST1,n 1: Pn R1 := n f ist total und berechenbar, und es gilt für alle n ∈ N: n ∈ K gdw. gdw. gdw. gdw. Pn (n) hält Pf (n) hält bei jeder Eingabe ϕf (n) ist eine totale Funktion f (n) ∈ TOTAL X Lemma 3.35 K ≤ TOTAL Beweis: Sei Pq ein Programm für das beschränkte Halteproblem HB = {(e , n, t ) | Pe (n) hält nach 6 t Schritten}. Die Reduktionsfunktion f berechnet aus n die Kodierung des folgenden Programmes Pf (n) . 0: 1: 2: 3: 4: T(1,3) CONST2,n CONST1,n Pq JNZ(0,4) Es gilt für jedes n ∈ K gdw. gdw. gdw. gdw. R3 := R1 R2 := n R1 := n R0 := Pq (n, n, t) if R0 6= 0: goto 4 (d.h. if R0 6= 0: loop forever) n ∈ N: für alle t ∈ N : (n, n, t ) 6∈ HB für alle t ∈ N : Pq (n, n, t ) hält und hat Ausgabe 0 für alle t ∈ N : Pf (n) (t ) hält f (n) ∈ TOTAL X 3.5.2 Satz 3.36 TOTAL ist nicht semi-entscheidbar. Beweis: Da K ≤ TOTAL (3.35) und K (3.29) nicht semi-entscheidbar ist, folgt mit (3.31), dass TOTAL ebenfalls nicht semi-entscheidbar. X Satz 3.37 TOTAL ist nicht semi-entscheidbar. Beweis: Aus K ≤ TOTAL (3.34) folgt K ≤ TOTAL. Da K nicht semi-entscheidbar ist (3.29), folgt mit (3.31), dass TOTAL ebenfalls nicht semi-entscheidbar. X Exkurs 2 K ist vollständig für die Klasse der semi-entscheidbaren Mengen Satz 3.38 (Alle semi-entscheidb. Mengen sind zu H reduzierbar) Für alle semi-entscheidbaren Mengen A gilt A ≤ H. Beweis: Wenn A semi-entscheidbar ist, dann ist A = Wc für eine berechenbare Funktion ϕc . Also gilt für alle n: n ∈ A genau dann, wenn (c, n) ∈ H. Die Funktion f mit f (x) = (c, x) ist total und berechenbar, und f ist die Reduktionsfunktion für A ≤ H. X 3.5.4 Definition 3.39 (Härte und Vollständigkeit) Sei C eine Klasse (d.h. Menge) von Mengen, und A sei eine Menge. 1. A heißt hart für C, wenn für alle B ∈ C gilt: B ≤ A. 2. A heißt vollständig für C, wenn A hart für C und A ∈ C ist. Definition 3.40 (”Komplexitätsklassen“ (un)entscheidbarer Mengen) 1. REC= {A | A ist entscheidbar} ist die Klasse der entscheidbaren Mengen. 2. RE= {A | A ist semi-entscheidbar} ist die Klasse der semi-entscheidbaren Mengen. 3. coRE= {A | A ist semi-entscheidbar} ist die Klasse der Komplemente semi-entscheidbarer Mengen. Satz 3.41 H ist vollständig für RE. Beweis: H ist hart für RE (Satz 3.38) und H ist in RE (Satz 3.32). X 3.5.6 Satz 3.42 K ist vollständig für RE. Beweis: 1. K ist semi-entscheidbar (3.26) – d.h. K ist in RE. 2. Also bleibt noch zu zeigen, dass K hart für RE ist. Wir wissen bereits: für jedes A ∈ RE gilt A ≤ H (3.38) und H ≤ K (3.20). Da ≤ transitiv ist (3.21), folgt für jedes A ∈ RE: A ≤ K . Also ist K hart für RE. X Folgerung 3.43 (weitere harte und vollständige Mengen) 1. H0 , H und K sind vollständig für RE. 2. H, K0 , K sind vollständig für coRE. 3. TOTAL und TOTAL sind hart für RE und für coRE. 3.5.8 3.6 Beweissysteme Außer Natürlichem Schließen gibt es noch viele andere Beweissysteme, wie z.B. Frege-Kalkül, Resolution. Diese Beweissysteme haben die Gemeinsamkeit, dass • jeder Beweis ein endlicher Text“ ist, ” an dem man einfach erkennen kann, was bewiesen wird, und • von jedem endlichen Text einfach entschieden werden kann, ob er ein Beweis ist. Ein Beweissystem kann man sich also vorstellen als einen Algorithmus, der für eine gegebene Formel einen Beweis sucht. Das ist ein typischer Algorithmus für ein semi-entscheidbares Problem. Man kann sich ein Beweissystem auch vorstellen als eine Funktion, die einen endlichen Text“ auf das abbildet, was er beweist. Wir werden ” sehen, dass das genauso typisch für ein semi-entscheidbares Problem ist. 3.6.1 Das kann man für die Kodierungen der wahren arithmetischen Formeln N-Arith = {α | α ist eine arithmetische Formel, und N P e wie folgt abstrahieren. Definition 3.44 Ein Beweissystem für N-Arith ist eine totale und berechenbare Funktion auf N, deren Wertebereich N-Arith ist. (Wir werden sehen, dass es kein Beweissystem für N-Arith gibt . . . ) α} Beweissysteme und Semi-Entscheidbarkeit Den Begriff des Beweissystems kann man auch unabhängig von der Arithmetik für beliebige Mengen definieren. Definition 3.45 (Beweissystem für A) Sei A ⊆ N. Ein Beweissystem für A ist eine totale und berechenbare Funktion ψ : N → N mit Wertebereich A. Der nächste Satz zeigt, wie das in die bekannte Begriffswelt passt. Satz 3.46 Eine Menge A ⊆ N ist semi-entscheidbar genau dann, wenn sie ein Beweissystem besitzt. Im Prinzip“ ist der Begriff der Semi-Entscheidbarkeit also nur eine ” Verallgemeinerung des Begriffes der Beweissysteme (und der Beweisbarkeit) für Mengen, die nicht unbedingt etwas mit Logik zu tun haben. 3.6.4 Zum Beweis des Satzes benutzen wir eine bijektive Paarkodierung. Lemma 3.47 (Paarkodierung ist URM-berechenbar) Die Funktion π : N × N → N mit π(a, b) = 2a · (2b + 1) − 1 ist eine Bijektion und ist URM-berechenbar. Die Umkehrfunktionen π1 , π2 : N → N mit π1 (π(a, b)) = a und π2 (π(a, b)) = b sind ebenfalls URM-berechenbar. Beweis: π ist offensichtlich URM-berechenbar. Wenn man π(a, b) + 1 in Binärdarstellung betrachtet, sieht man: π(a, b) = |101 {z · · · 01} 1 |00 {z · · · 0} =b a 0en Daraus ergibt sich, dass π eine Bijektion ist. Die Berechnung von π1 zählt, wie oft π(a, b) + 1 ohne Rest durch 2 teilbar ist – das Zählergebnis ist a. Die Berechnung von π2 teilt π(a, b) + 1 solange durch 2, bis Rest 1 entsteht – das Ergebnis der wiederholten Halbierung ist b. 3.6.5 Die Umkehrfunktionen π1 und π2 werden wie folgt berechnet. 0: 1: 2: 3: 4: 5: 6: 7: 8: T(1,3) S(3) Z(0) MOD3,2,4 SIG4,4 J(4,5,Ende) S(0) DIV3,2,3 J(0,0,3) PI1a,b R3 := R1 + 1 R0 := 0 while R3 mod 2 = 0: R0 := R0 + 1 R3 := R3 /2 (Rb := π1 (Ra )) 0: 1: 2: 3: 4: 5: 6: T(1,0) S(0) MOD0,2,4 DIV0,2,0 SIG4,4 J(4,5,Ende) J(0,0,2) PI2a,b R0 := R1 + 1 repeat R0 := R0 /2 until R0 mod 2 was 1 (Rb := π2 (Ra )) (Ende des Beweises von Lemma 3.47) X Beweis ⇒“: ” (von Satz 3.46) Wenn A semi-entscheidbar ist, dann ist A = Wq für ϕq = χ0A . Definiere die Funktion ψ : N → N für ein c0 ∈ A als ( π1 (n), falls (q, π1 (n), π2 (n)) ∈ HB ψ(n) = c0 , sonst . Da ψ total und berechenbar ist, ist ψ = ϕr . Offensichtlich gilt für den Wertebereich Er von ψ: Er ⊆ A. (∗) Für jedes x ∈ A gibt es ein t ∈ N mit (q, x, t) ∈ HB , d.h. für jedes x ∈ A gibt es ein t ∈ N mit ψ(π(x, t)) = x. Folglich ist A ⊆ Er . (∗∗) Aus (∗) und (∗∗) folgt A = Er . Also ist A Wertebereich einer totalen berechenbaren Funktion, d.h. A besitzt ein Beweissystem. Beweis ⇐“: ” (von Satz 3.46) Habe A ein Beweissystem, d.h. A ist Wertebereich einer (totalen) berechenbaren Funktion ϕq . Definiere den folgenden Algorithmus R (für χ0A ). Eingabe x n := 0 solange (q , π1 (n), π2 (n)) 6∈ HB oder Pq (π1 (n)) 6= x wiederhole: n := n + 1 Ausgabe 1 Wenn m ∈ A, dann gibt es ein (w , t ) mit Pq (w ) = m in t Schritten“, ” und folglich hält R (m) mit Ausgabe 1, wenn n = π(w , t ) erreicht wurde. Wenn m 6∈ A, dann gilt für alle (w , t ): P (w ) hält nicht nach t Schritten oder Pq (w ) 6= m“, ” q und folglich hält R (m) nicht. Also berechnet R genau die Funktion χ0A . Das heißt: A ist semi-entscheidbar. X 3.6.8 Wenn man sich den Beweis des letzten Satzes genau anschaut, sieht man, dass man eigentlich noch etwas mehr bewiesen hat. Notation: • Wn ist der Definitionsbereich von ϕn . • En ist der Wertebereich von ϕn . Folgerung 3.48 (Charakterisierungen semi-entscheidbarer Mengen) Die folgenden Aussagen sind äquivalent für alle Mengen A 6= ∅. 1. A ist semi-entscheidbar. 2. A = Wn für ein n ∈ N. 3. A = En für ein n ∈ N, wobei ϕn total ist (d.h. A hat ein Beweissystem). 4. A = En für ein n ∈ N. Bem.: ∅ ist entscheidbar und folglich auch semi-entscheidbar. Bemerkungen Wenn A = Eq für eine totale berechenbare Funktion ϕq , dann ist A = {ϕq (0), ϕq (1), ϕq (2) . . .}. Daher stammt der Begriff rekursiv aufzählbar, der auch für semi-entscheidbare Mengen benutzt wird. Entscheidbare Mengen werden häufig rekursiv genannt. Daher stammen auch die Bezeichnungen REC für die Klasse aller entscheidbaren Mengen (REC = ˆ recursive) und RE für die Klasse aller semi-entscheidbaren Mengen (RE = ˆ recursively enumerable). 3.6.10 Weitere RE-vollständige Mengen Wir geben die Mengen ohne Kodierung durch natürliche Zahlen an. Die Kodierbarkeit ist intuitiv klar. • Das Wortproblem für Typ-0-Sprachen {(G , w ) | G ist eine Typ-0-Grammatik und w ∈ L(G )} • Ganzzahlige Nullstellen diophantischer Gleichungen {p | p ist ein Polynom mit ganzzahligen Koeffizienten und besitzt eine ganzzahlige Nullstelle} • Das Postsche Korrespondenzproblem • Parkettierungsprobleme (tiling) 3.6.11 Wie geht es weiter? Wir werden zeigen, dass es kein Beweissystem für die Arithmetik gibt. Da wir jetzt den Begriff Beweissystem formal definiert haben, können wir diese Frage in Angriff nehmen. Darüberhinaus gibt es dann noch einige Konsequenzen für Beweissysteme für Teile der Arithmetik. Diese Resultate nennt man die Unvollständigkeitssätze von Gödel. 3.6.12 Berechenbarkeit und ihre Grenzen S Z P → T URMberechenbar [3.4] J REC und RE [3.40] A ≤ B K [3.18] [3.13] K ist RE (3.26); K ist nicht RE (3.29) 3.6.13