Kapitel 1: Berechenbarkeitstheorie 1.4 Die Ackermannfunktion 1.4 Die Ackermannfunktion a : N2 → N : a(0, y ) = y + 1, a(x, 0) = a(x − 1, 1), x > 0, a(x, y ) = a(x − 1, a(x, y − 1)), x, y > 0. Beispiele: Beh.: a(1, y ) = y + 2 Bew. durch Induktion über y : a(1, 0) = a(0, 1) = 2 = 0 + 2. a(1, y + 1) = a(0, a(1, y )) =I.V. a(0, y + 2) = y + 3 = (y + 1) + 2. Beh.: a(2, y ) = 2y + 3 Bew. durch Induktion über y : a(2, 0) = a(1, 1) =s.o. 3 = 2 · 0 + 3. a(2, y + 1) = a(1, a(2, y )) =I.V. a(1, 2y + 3) =s.o. 2y + 5 = 2(y + 1) + 3. Prof. Dr. F. Otto (Universität Kassel) Berechenbarkeit und Formale Sprachen 65 / 313 Kapitel 1: Berechenbarkeitstheorie 1.4 Die Ackermannfunktion Lemma 1.20 a ist eine totale Funktion, d.h. a(x, y ) ist für alle x, y ∈ N definiert. Beweis durch Induktion über x: x =0: a(0, y ) = y + 1 x − 1 → x : a(x, y ) = = = = = Prof. Dr. F. Otto (Universität Kassel) a(x a(x ... a(x a(x − 1, a(x, y − 1)) − 1, a(x − 1, a(x, y − 2))) − 1, . . . , a(x − 1, a(x, 0)) . . .) − 1, . . . , a(x − 1, a(x − 1, 1)) . . .) Berechenbarkeit und Formale Sprachen 2 66 / 313 Kapitel 1: Berechenbarkeitstheorie 1.4 Die Ackermannfunktion Lemma 1.21 (a) y < a(x, y ). (b) a(x, y ) < a(x, y + 1). (c) a(x, y + 1) ≤ a(x + 1, y ). (d) a(x, y ) < a(x + 1, y ). (b)+(d): ∀x ≤ x ′ ∀y ≤ y ′ : a(x, y ) ≤ a(x ′ , y ′ ). Prof. Dr. F. Otto (Universität Kassel) Berechenbarkeit und Formale Sprachen 67 / 313 Kapitel 1: Berechenbarkeitstheorie 1.4 Die Ackermannfunktion Beweis von (a) durch Induktion über x: I.A.: x = 0 : a(0, y ) = y + 1 > y . I.V.: a(x, y ) > y für alle y . I.B.: a(x + 1, y ) > y für alle y . I.S: Induktion über y : I.A.: y = 0: a(x + 1, 0) = a(x, 1) >I.V. x 1 > 0. I.V.: a(x + 1, y ) > y für ein y ≥ 0. I.B.: a(x + 1, y + 1) > y + 1. = a(x, a(x + 1, y )) I.S: a(x + 1, y + 1) >I.V. x a(x + 1, y ) >I.V. y y , d.h., a(x + 1, y + 1) > y + 1. Prof. Dr. F. Otto (Universität Kassel) Berechenbarkeit und Formale Sprachen 2 68 / 313 Kapitel 1: Berechenbarkeitstheorie 1.4 Die Ackermannfunktion Die Funktion fP : N → N für ein LOOP-Programm P Sei P ein LOOP-Programm mit den Variablen x0 , x1 , . . . , xk . Seien n0 , n1 , . . . , nk die Startwerte für diese Variablen, und seien n0′ , n1′ , . . . , nk′ die Endwerte für diese Variablen. Definiere: fP : N → N : fP (n) = max{ X i≥0 ni′ | X ni ≤ n }. i≥0 Lemma 1.22 Für jedes LOOP-Programm P gibt es eine Konstante k , sodass für alle n folgendes gilt: fP (n) < a(k , n). Prof. Dr. F. Otto (Universität Kassel) Berechenbarkeit und Formale Sprachen 69 / 313 Kapitel 1: Berechenbarkeitstheorie 1.4 Die Ackermannfunktion Beweis Induktion über den Aufbau von P: (i) xi := xj ± 1 fP (n) ≤ 2n + 1 < a(2, n), d.h. k = 2. (ii) P1 ; P2 I.V.: fP1 (n) < a(k1 , n), fP2 (n) < a(k2 , n). Wähle k3 := max{k1 − 1, k2 }. Dann : fP (n) ≤ fP2 (fP1 (n)) < ≤ = ≤ d.h. k = k3 + 2. Prof. Dr. F. Otto (Universität Kassel) a(k2 , a(k1 , n)) a(k3 , a(k3 + 1, n)) a(k3 + 1, n + 1) a(k3 + 2, n), Berechenbarkeit und Formale Sprachen 70 / 313 Kapitel 1: Berechenbarkeitstheorie 1.4 Die Ackermannfunktion (iii) LOOP xi DO Q END I.V.: fQ (n) < a(k1 , n). O.B.d.A.: xi kommt in Q nicht vor. P ′ P nj ≤ n } fP (n) = max{ nj | j≥0 j≥0 Sei m ≤ n der Wert von xi bei dem P j≥0 annimmt. nj′ den maximalen Wert m = 0 : fP (n) = n < a(0, n). m = 1 : fP (n) ≤ fQ (n) < a(k1 , n). Prof. Dr. F. Otto (Universität Kassel) Berechenbarkeit und Formale Sprachen 71 / 313 Kapitel 1: Berechenbarkeitstheorie 1.4 Die Ackermannfunktion m ≥ 2 : fP (n) ≤ fQ (fQ (. . . (fQ (n − m)) . . .)) + m. | {z } m-mal < a(k1 , fQ (fQ (. . . (fQ (n − m)) . . .))) + m {z } | (m−1)-mal .. . < a(k1 , a(k1 , . . . , a(k1 , n − m) . . .)) + m {z } | m-mal ; fP (n) ≤ a(k1 , a(k1 , . . . , a(k1 , n − m) . . .)) < a(k1 , . . . a(k1 , a(k1 + 1, n − m) . . .)) {z } | (m−1)-mal = a(k1 + 1, n − 1) < a(k1 + 1, n), d.h. k = k1 + 1. Prof. Dr. F. Otto (Universität Kassel) Berechenbarkeit und Formale Sprachen 2 72 / 313 Kapitel 1: Berechenbarkeitstheorie 1.4 Die Ackermannfunktion Satz 1.23 Die Ackermannfunktion ist nicht LOOP-berechenbar, d.h. sie ist nicht primitiv rekursiv. Beweis (Indirekt): Sei P ein LOOP-Programm, das g(n) := a(n, n) berechnet. Dann gilt g(n) ≤ fP (n). Es gibt eine Konstante k mit: ∀n ≥ 0 : fP (n) < a(k , n), d.h. g(k ) ≤ fP (k ) < a(k , k ) = g(k ) Prof. Dr. F. Otto (Universität Kassel) Widerspruch ! Berechenbarkeit und Formale Sprachen 2 73 / 313 Kapitel 1: Berechenbarkeitstheorie 1.4 Die Ackermannfunktion Satz 1.24 Die Ackermannfunktion ist eine totale, WHILE-berechenbare Funktion, die nicht LOOP-berechenbar ist. Beweis: Vorüberlegung 1 Gleichungen Rechenregeln a(0, y ) = y + 1 (0, y ) 7→ y + 1 a(x + 1, 0) = a(x, 1) (x + 1, 0) 7→ (x, 1) a(x + 1, y + 1) = a(x, a(x + 1, y )) (x + 1, y + 1) 7→ (x, x + 1, y ) Beispiel: a(2, 1) = a(1, a(2, 0)) = a(1, a(1, 1)) = a(1, a(0, a(1, 0))) = . . . (2, 1) → 7 (1, 2, 0) 7→ (1, 1, 1) 7→ (1, 0, 1, 0) 7→ (1, 0, 0, 1) 7→ (1, 0, 2) 7→ (1, 3) 7→ (0, 1, 2) 7→ (0, 0, 1, 1) 7→ (0, 0, 0, 1, 0) 7→ (0, 0, 0, 0, 1) → 7 4 5 Prof. Dr. F. Otto (Universität Kassel) Berechenbarkeit und Formale Sprachen 74 / 313 Kapitel 1: Berechenbarkeitstheorie 1.4 Die Ackermannfunktion Beweis: Vorüberlegung 2 Folgende Operationen müssen realisiert werden: 1 Speichere Folge (x1 , . . . , xr −1 , xr ) von natürlichen Zahlen. 2 Teste, ob Folge die Länge r = 1 hat. 3 Bestimme (und entferne) das letzte Element der Folge. 4 Füge eine Zahl an die Folge an. Hierzu verwenden wir die Speicherstruktur Stack (oder Keller). Ein Stack speichert eine Folge von Elementen (z.B. Zahlen), wobei nur folgende Operationen erlaubt sind: - Initialisieren: Ein leerer Stack wird bereitgestellt. - Test: Ist der Stack leer? - Push: Ein Element auf den Stack legen. - Pop: Das oberste Element des Stacks lesen und vom Stack entfernen. Prof. Dr. F. Otto (Universität Kassel) Berechenbarkeit und Formale Sprachen 75 / 313 Kapitel 1: Berechenbarkeitstheorie 1.4 Die Ackermannfunktion Beweis von Satz 1.24: Noch z.z.: a(x, y ) ist WHILE-berechenbar. 1. Schritt: Ein Programm, das a(x, y ) mit Hilfe eines Stacks berechnet: INIT(st) size(st) PUSH(x, st) y := POP(st) : : : : Prof. Dr. F. Otto (Universität Kassel) Stack st initialisieren Anzahl der Elemente im Stack st bestimmen x auf den Stack st legen oberstes Element vom Stack st entfernen und an y übergeben Berechenbarkeit und Formale Sprachen 76 / 313 Kapitel 1: Berechenbarkeitstheorie 1.4 Die Ackermannfunktion Ein STACK-Programm zur Berechnung von a(x, y ) INPUT(x, y ); INIT(stack); PUSH(x,stack); PUSH(y ,stack); WHILE size(stack) 6= 1 DO y := POP(stack); x := POP(stack); IF x = 0 THEN PUSH(y + 1,stack) ELSE IF y = 0 THEN PUSH(x − 1,stack); PUSH(1,stack) ELSE PUSH(x − 1,stack); PUSH(x,stack); PUSH(y − 1,stack) END{IF} END{WHILE} result := POP(stack); OUTPUT(result). Prof. Dr. F. Otto (Universität Kassel) Berechenbarkeit und Formale Sprachen 77 / 313 Kapitel 1: Berechenbarkeitstheorie 1.4 Die Ackermannfunktion Realisierung der Stack-Operationen Sei (n1 , n2 , . . . , nk ) der aktuelle Stackinhalt. n := c(nk + 1, c(nk −1 + 1, . . . , c(n2 + 1, c(n1 + 1, 0)) . . .)) die Kodierung des Stackinhalts. Operation Realisierung INIT(stack) n := 0 PUSH(a,stack) n := c(a + 1, n) y := POP(stack) y := e(n) − 1; n := f (n) size(stack) 6= 1 f (n) 6= 0 Also ist a(x, y ) WHILE-berechenbar. Prof. Dr. F. Otto (Universität Kassel) Berechenbarkeit und Formale Sprachen 2 78 / 313 Kapitel 1: Berechenbarkeitstheorie 1.4 Die Ackermannfunktion Übersicht ↔ WHILE ↔ µ-rekursiv LOOP ↔ prim. rekursiv ( GOTO Prof. Dr. F. Otto (Universität Kassel) Berechenbarkeit und Formale Sprachen 79 / 313