Primitiv rekursive und µ-rekursive Funktionen

Ähnliche Dokumente
1.3 Primitiv rekursive und µ-rekursive Funktionen

Primitiv rekursive und µ-rekursive Funktionen

Theorie der Informatik

Mächtigkeit von WHILE-Programmen

1.2 LOOP-, WHILE- und GOTO-Berechenbarkeit

Primitive Rekursion. Basisfunktionen: Konstante Funktion: const 3 3 (1,1, pr 1,3(g,h) (1,1)) Projektion: proj 3 (1,1, pr. Komposition: comp 3,2

Typen von Programmiersprachen

Mitschrift BFS WS 13/14

Syntax von LOOP-Programmen

Berechenbarkeits- und Komplexitätstheorie

Theoretische Informatik II

Theorie der Informatik

GTI. Hannes Diener. 18. Juni. ENC B-0123,

Proseminar Theoretische Informatik - WS07/08 - Prof. Helmut Alt. I. Einleitung Berechnungsmodelle LOOP, WHILE, GOTO, rekursive Funktionen

Rekursive und primitiv rekursive Funktionen. Ein maschinenunabhängiges formales Berechnungsmodell auf den natürlichen Zahlen

Theorie der Informatik Einleitung. Theorie der Informatik Basisfunktionen und Einsetzung Primitive Rekursion. 14.

1 Einführung. 2 Typ-0- und Typ-1-Sprachen. 3 Berechnungsmodelle. 4 Unentscheidbarkeit. 5 Unentscheidbare Probleme. 6 Komplexitätstheorie

Einführung in die Theoretische Informatik

Einführung in die Theoretische Informatik

LOOP-Programme: Syntaktische Komponenten

Theoretische Informatik SS 03 Übung 4

ALP I Primitiv-Rekursive Funktionen

1 Einführung. 2 Typ-0- und Typ-1-Sprachen. 3 Berechnungsmodelle. 4 Unentscheidbarkeit. 5 Unentscheidbare Probleme. 6 Komplexitätstheorie

Einführung in die Theoretische Informatik

Primitiv rekursive Funktionen

Theorie der Informatik

ALP I Rekursive Funktionen

Mächtigkeit von LOOP-Programmen. Prof. Dr. Berthold Vöcking Lehrstuhl Informatik 1 Algorithmen und Komplexität RWTH Aachen

Alternative Berechnungsmodelle

Def.: Die Menge der LOOP-Programme ist induktiv wie folgt definiert:

Einführung in die Theoretische Informatik

Grundlagen der Theoretischen Informatik: Übung 10

2. Imperative Programmierung und Berechenbarkeit - Registermaschinen -

GOTO simuliert Turingmaschinen

GTI. µ-rekursive Funktionen. Hannes Diener. 20. Juni 2. Juli. ENC B-0123,

Theoretische Informatik

THEORETISCHE INFORMATIK UND LOGIK

Theoretische Informatik SS 03 Übung 5

Grundlagen der Theoretischen Informatik II

Einführung in die Theoretische Informatik

Berechenbarkeit und Komplexität: Mächtigkeit von Programmiersprachen: WHILE- und LOOP-Programme

Mächtigkeit von WHILE-Programmen

Die primitiv rekursiven Funktionen

1.4 Die Ackermannfunktion

Grundlagen Theoretischer Informatik 2 WiSe 2011/12 in Trier. Henning Fernau Universität Trier

THEORETISCHE INFORMATIK UND LOGIK

Wir suchen Antworten auf die folgenden Fragen: Was ist Berechenbarkeit? Wie kann man das intuitiv Berechenbare formal fassen?

2.5 Die Ackermannfunktion

Dank. Theoretische Informatik II. Teil II. Registermaschinen. Vorlesung

Einführung in die Informatik I

Primitiv rekursive Codier- und Decodierfunktionen

Mächtigkeit von WHILE-Programmen

Logik und Beweisbarkeit

8. Rekursive und primitiv rekursive Funktionen

Berechenbarkeit und Komplexität: Mächtigkeit von Programmiersprachen: WHILE- und LOOP Programme

6.4 Entscheidbarkeit. nein sein müssen, ist klar. THEO 6.4 Entscheidbarkeit 205/307 c Ernst W. Mayr

Unentscheidbarkeitssätze der Logik

Halteproblem/Kodierung von Turing-Maschinen

Berechenbarkeit und Komplexität

LOOP-Programme 1. Def (Meyer/Ritchie). LOOP-Programme werden induktiv aufgebaut aus den (Basis-) Anweisungen. Führe P X-mal aus ) LOOP-Programme 2

LOOP-Programme: Syntaktische Komponenten

Programmieren für Fortgeschrittene

(Prüfungs-)Aufgaben zur Berechenbarkeits- und Komplexitätstheorie

Theoretische Informatik für Wirtschaftsinformatik und Lehramt

Berechenbarkeit und Komplexität Vorlesung 10

Theoretische Informatik II

Relativierte Berechnungen und die arithmetische Hierachie

Theoretische Informatik II

Berechenbarkeit. Serie 4. Die Seminaraufgaben werden in den Übungen vom bis besprochen.

Die Ackermannfunktion

Funktionale Programmierung ALP I. µ-rekursive Funktionen WS 2012/2013. Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda

Satz von Rice. Lemma 39

Berechenbarkeitsmodelle

Primitive Rekursion. Alexander Hölzle

ALP I Turing-Maschine

Umgekehrt kann eine Datenbank-Instanz in eine konjunktive Anfrage umgewandelt werden: hasairport. ans. fly n 1 n 2 n 3 n 2 Bonn n 4.

6. Rekursive und primitiv rekursive Funktionen. Ein maschinenunabhängiges formales Berechnungsmodell auf den natürlichen Zahlen

Berechenbarkeit und Komplexität Vorlesung 11

Semantik von Programmiersprachen SS 2017

Wiederholung. Organisatorisches. VL-11: LOOP und WHILE Programme I. (Berechenbarkeit und Komplexität, WS 2017) Gerhard Woeginger

VL-11: LOOP und WHILE Programme I. (Berechenbarkeit und Komplexität, WS 2017) Gerhard Woeginger

Einwegfunktionen. Problemseminar. Komplexitätstheorie und Kryptographie. Martin Huschenbett. 30. Oktober 2008

Berechenbarkeit und Komplexität

VL-11: Primitiv rekursive Funktionen. (Berechenbarkeit und Komplexität, WS 2018) Gerhard Woeginger

Die Church-Turing-These

Einführung in die Theoretische Informatik Tutorium IX

Universelle Maschinen und universelle Funktionen

Kapitel 1. Grundlagen

Theoretische Informatik für Wirtschaftsinformatik und Lehramt

Informatik III. Arne Vater Wintersemester 2006/ Vorlesung

Berechenbarkeit. Script, Kapitel 2

Einführung in die Berechenbarkeitstheorie

Theoretische Informatik II. WS 2007/2008 Jun.-Prof. Dr. Bernhard Beckert Ulrich Koch. 1. Teilklausur Vorname:... Nachname:...

Grundlagen der Theoretischen Informatik Musterlösungen zu ausgewählten Übungsaufgaben

Ausgewählte Kapitel Diskreter Mathematik mit Anwendungen

3.5 Schnelle Fouriertransformation (FFT, DFT)

Transkript:

Primitiv rekursive und µ-rekursive Funktionen Loop-, While- und Goto-Programme sind vereinfachte imperative Programme und stehen für imperative Programmiersprachen, bei denen Programme als Folgen von Befehlen aufgefaßt werden. Parallel dazu gibt es jedoch auch funktionale Programme, deren Hauptbestandteil die Definition rekursiver Funktionen ist. Es gibt auch Berechnungsbegriffe, die sich eher an funktionalen Programmen orientieren. Zum Beispiel: λ-kalkül (Alonzo Church, 1932) µ-rekursive und primitiv rekursive Funktionen (werden hier in der Vorlesung betrachtet) 105

Primitiv rekursive Funktionen Wir definieren nun Klassen von (totalen) Funktionen der Form f : N k N. Definition primitiv rekursive Funktionen Die Klasse der primitiv rekursive Funktionen ist induktiv wie folgt definiert: Alle konstanten Funktionen der Form k m : N N : n m (für ein festes m N) sind primitiv rekursiv. Alle Projektionen der Form π k i : N k N : (n 1,..., n k ) n i sind primitiv rekursiv. Die Nachfolgerfunktion s : N N : n n + 1 ist primitiv rekursiv. Wenn g : N k N und f 1,..., f k : N r N primitiv rekursiv sind, dann ist auch die Abbildung f : N r N mit f (n 1,..., n r ) = g(f 1 (n 1,..., n r ),..., f k (n 1,..., n r )) primitiv rekursiv (Einsetzung/Komposition), 106

Primitiv rekursive Funktionen Definition primitiv rekursive Funktionen (Fortsetzung) Jede Funktion f, die durch primitive Rekursion aus primitiv rekursiven Funktionen entsteht, ist primitiv rekursiv. Das heißt f : N k+1 N muss folgende Gleichungen erfüllen (für primitiv rekursive Funktionen g : N k N, h : N k+2 N): f (0, n 1,..., n k ) = g(n 1,..., n k ) f (n + 1, n 1,..., n k ) = h(f (n, n 1,..., n k ), n, n 1,..., n k ) Anschaulich: bei primitiver Rekursion wird die Definition von f (n + 1,... ) zurückgeführt auf f (n,... ). Das bedeutet, dass primitive Rekursion immer terminiert. Berechnungsmodell analog zu Loop-Programmen. 107

Primitiv rekursive Funktionen Beispiele für primitiv rekursive Funktionen: Additionsfunktion Die Funktion add : N 2 N : (m, n) m + n ist primitiv rekursiv. add(0, n) = n add(m + 1, n) = s(add(m, n)) Multiplikationsfunktion Die Funktion mult : N 2 N : (m, n) m n ist primitiv rekursiv. mult(0, n) = 0 mult(m + 1, n) = add(mult(m, n), n) 108

Primitiv rekursive Funktionen Dekrementierung Die Funktion dec : N N : n max(0, n 1) ist primitiv rekursiv. dec(0) = 0 dec(n + 1) = n Subtraktion Die Funktion sub : N 2 N : (m, n) max{0, m n} ist primitiv rekursiv. sub(m, 0) = m sub(m, n + 1) = dec(sub(m, n)) 109

Primitiv rekursive Funktionen Binomialkoeffizient Die Funktion N N : n ( n 2) ist primitiv rekursiv. ( ) 0 = 0 2 ( ) ( ) n + 1 n = + n 2 2 Durch Komposition folgt, dass auch die Abbildung ( ) m + n + 1 c : N 2 N : (m, n) m + 2 primitiv rekursiv ist. 110

Primitiv rekursive Funktionen Die Funktion c : N 2 N: m = 0 1 2 3 4 n = 0 0 2 5 9 14 1 1 4 8 13 19 2 3 7 12 18 25 3 6 11 17 24 32 4 10 16 23 31 40 Beachte: c(m, n) = m + m+n i=1 i. Die Abbildung c ist eine Bijektion von N 2 nach N (Paarungsfunktion). Die Funktion c kann verwendet werden, um beliebige (k + 1)-Tupel von natürlichen Zahlen durch eine Zahl zu kodieren: n 0 = c(n 0, 0) n 0, n 1,..., n k = c(n 0, n 1, n 2,..., n k ) Die Abbildung (n 0, n 1,..., n k ) n 0, n 1,..., n k ist dann auch primitiv rekursiv (für jedes feste k). 111

Primitiv rekursive Funktionen Es seien l : N N und r : N N die eindeutigen Funktionen mit: m, n N : l(c(m, n)) = m und r(c(m, n)) = n Wir werden nun zeigen, dass die Funktionen l und r ebenfalls primitiv rekursiv sind. Mit diesen lassen sich dann auch primitiv rekursive Dekodierfunktionen für kodierte (k + 1)-Tupel definieren, die d i ( n 0, n 1,..., n k ) = n i erfüllen: d 0 (n) = l(n) d 1 (n) = l(r(n)). d k (n) = l(r k (n)) 112

Primitiv rekursive Funktionen Definition beschränkter min-operator Sei P : N k+1 {0, 1} ein Prädikat und q : N k+1 N Funktion mit { 0 falls P(i, n) = 0 für alle 0 i n q(n, n) = min{i P(i, n) = 1} sonst. Dann sagen wir, daß q durch den beschränkten min-operator aus P hervorgeht. Lemma Wenn P primitiv rekursiv ist, dann ist auch q primitiv rekursiv. 113

Primitiv rekursive Funktionen Lemma Wenn P primitiv rekursiv ist, dann ist auch q primitiv rekursiv. Wir zeigen dies zunächst für die Funktion q : N k+1 N mit { q 0 falls P(i, n) = 0 für alle 0 i n (n, n) = min{i P(i, n) = 1} + 1 sonst q (0, n) = P(0, n) q (n + 1, n) = q (n, n) + (1 q (n, n)) P(n + 1, n) (n + 1) Es gilt q(n, n) = q (n, n) 1 114

Primitiv rekursive Funktionen Definition beschränkter Existenzquantor Seien P, Q : N k+1 {0, 1} Prädikate mit { 1 falls x n : P(x, n) = 1 Q(n, n) = 0 sonst. Dann sagen wir, daß Q durch den beschränkten Existenzquantor aus P hervorgeht. Lemma Wenn P primitiv rekursiv ist, dann ist auch Q primitiv rekursiv. Die Funktion q : N k+1 N mit { q 0 falls P(i, n) = 0 für alle 0 i n (n, n) = min{i P(i, n) = 1} + 1 sonst ist primitiv rekursiv und es gilt Q(n, n) = 1 (1 q (n, n)) 115

Primitiv rekursive Funktionen Nun können wir zeigen, dass die Umkehrfunktionen l und r von c : N 2 N primitiv rekursiv sind. Das Prädikat C : N 3 {0, 1} mit C(x, y, z) = 1 gdw. c(x, y) = z ist primitiv rekursiv: ( ) ( ) C(x, y, z) = 1 (c(x, y) z) 1 (z c(x, y)). Deshalb sind auch die Funktionen l und r mit primitiv rekursiv. Schließlich gilt: l (k, m, n) = min{x k y m : C(x, y, n) = 1} r (k, m, n) = min{y k x m : C(x, y, n) = 1} l(n) = l (n, n, n) und r(n) = r (n, n, n). 116

Primitiv rekursive Funktionen Lemma 20 (Loop-Programm primitiv rekursiv) Jede Loop-berechenbare Funktion f : N r N ist primitiv rekursiv. Beweis: Es gibt k r und ein Loop-Programm P, in dem keine Variable x i mit i k vorkommt, mit n 0,..., n r 1 N : f (n 0,..., n r 1 ) = π 0 ([P] k (n 0,..., n r 1, 0,..., 0)). Definiere die Funktion g P : N N mit n 0,..., n k 1 N : g P ( n 0,..., n k 1 ) = [P] k (n 0,..., n k 1 ). Wir werden zeigen, daß g P primitiv rekursiv ist. Wegen f (n 0,..., n r 1 ) = d 0 (g P ( n 0,..., n r 1, 0,..., 0 )) ist dann auch f primitiv rekursiv. 117

Primitiv rekursive Funktionen Fall 1. P = (x i := x j θd): g P (n) = d 0 (n),..., d i 1 (n), d j (n)θd, d i+1 (n),..., d k 1 (n) mit d = d = k d (n) falls d N und d = d l (n) falls d = x l. Fall 2. P = (Q; R): g P (n) = g R (g Q (n)). Fall 3. P = (Loop x i Do Q End): Definiere zunächst die primitiv rekursive Funktion h durch Dann gilt also h(n, m) = g n Q (m). Es gilt somit h(0, m) = m h(n + 1, m) = g Q (h(n, m)) g P (x) = h(d i (x), x). 118

Primitiv rekursive Funktionen Satz 21 (Loop-Programm primitiv rekursiv) Eine Funktion f : N r N ist genau dann Loop-berechenbar, wenn sie primitiv rekursiv ist. Es reicht die Implikation zu beweisen.durch Induktion über den Aufbau von f zeigen wir, dass f Loop-berechenbar ist. Fall 1: f ist eine der Basisfunktionen (konstante Funktionen, Projektionen, Nachfolgerfunktion). Dann ist f offensichtlich Loop-berechenbar. Fall 2: Es gibt primitiv rekursive Funktionen g, f 1,..., f k mit f (n 1,..., n r ) = g(f 1 (n 1,..., n r ),..., f k (n 1,..., n r )). Nach Induktionsvoraussetzung existieren Loop-Programme G, F 1,..., F k, die g, f 1,..., f k berechen. Dann berechnet das folgende Loop-Programm die Funktion f : 119

Primitiv rekursive Funktionen y 0 := x 0 ;... ; y r 1 := x r 1 ; (sichern der Argumente) F 1 ; z 0 := x 0 ; (jetzt gilt z 0 = f 1 (x 0,..., x r 1 )) x 0 := y 0 ;... ; x r 1 := y r 1 ; (rekonstruieren der Argumente) F 2 ; z 1 := x 0 ; (jetzt gilt z 1 = f 2 (x 0,..., x r 1 )). x 0 := y 0 ;... ; x r 1 := y r 1 ; (rekonstruieren der Argumente) F k ; z k 1 := x 0 ; (jetzt gilt z k 1 = f k (x 0,..., x r 1 )) x 0 := z 0 ;... ; x k 1 := z k 1 ; (jetzt gilt x i = f i+1 (x 0,..., x r 1 )) G 120

Primitiv rekursive Funktionen Fall 3: f entsteht aus g und h durch primitive Rekursion. Es gibt also primitiv rekursive Funktionen g : N r 1 N und h : N r+1 N mit f (0, n 1,..., n r 1 ) = g(n 1,..., n r 1 ) f (n + 1, n 1,..., n r 1 ) = h(f (n, n 1,..., n r 1 ), n, n 1,..., n r 1 ) Die Funktion f lässt sich dann durch das folgende (Pseudocode-) Loop-Programm berechnen: y := g(x 1,..., x r 1 ); k := 0; Loop x 0 Do y := h(y, k, x 1,..., x r 1 ); k := k + 1 End Unter Verwendung von Loop-Programmen für g und h sowie Zwischenspeicherung ähnlich zu Fall 2 kann dieser Pseudocode in ein Loop-Programm für f umgesetzt werden. 121

Zwischenbilanz TM Goto While Loop prim. rek. 122

µ-rekursive Funktionen Wir werden eine weitere Klasse von Funktionen definieren, die gleichmächtig zu While-Programmen, Goto-Programmen und Turingmaschinen ist. Definition µ-operator Sei f : N k+1 N eine partielle Funktion. Dann ist µf : N k N definiert durch µf (x 1,..., x k ) = min{n f (n, x 1,..., x k ) = 0 und Dabei gilt min = undefiniert. m < n : f (m, x 1,..., x k ) definiert} 123

µ-rekursive Funktionen Intuitive Berechnung von µf ( n) (falls f berechenbar ist): Berechne f (0, n), f (1, n),... bis ein n gefunden wird mit f (n, n) = 0. In diesem Augenblick gib n als Funktionswert zurück. Dieser Algorithmus terminiert nicht, falls f (m, n) undefiniert ist (ohne, dass vorher einmal der Funktionswert gleich 0 war) oder der Funktionswert 0 nie erreicht wird. In diesem Fall ist µf ( n) undefiniert. Analogie zu While-Programmen: es ist nicht klar, ob die Abbruchbedingung jemals erfüllt wird. 124

µ-rekursive Funktionen Definition µ-rekursive Funktionen Alle konstanten Funktionen k m : N N : n m, alle Projektionen πi k : N k N : (n 1,..., n k ) n i und die Nachfolgerfunktion s : N N : n n + 1 sind µ-rekursiv. Sind g : N k N und f 1,..., f k : N r N µ-rekursiv, so auch f : N r N mit f ( n) = g(f 1 ( n),..., f k ( n)) (wobei f ( n) genau dann definiert ist, wenn f i ( n) für alle i definiert ist und wenn g auf diesen Werten definiert ist). Jede partielle Funktion f, die durch primitive Rekursion aus µ-rekursiven Funktionen entsteht, ist µ-rekursiv. Ist f µ-rekursiv, so auch µf. 125

µ-rekursive Funktionen Durch den µ-operator können nun auch echt partielle Funktionen erzeugt werden. Überall undefinierte Funktion Die partielle Funktion Ω: N N mit Ω(n) = undefiniert für alle n N ist µ-rekursiv. Es gilt f (m, n) := k 1 (π1 2 (m, n)) = 1 für alle m, n N und f ist µ-rekursiv. Dann gilt Ω = µf und Ω ist µ-rekursiv. 126

µ-rekursive Funktionen Weiteres Beispiel: Wurzelfunktion Die Funktion sqrt : N N mit sqrt(n) = n ist µ-rekursiv. (Dabei rundet... eine reelle Zahl auf die nächstgrößere (oder gleiche) ganze Zahl auf.) Sei f (m, n) = n m m. (beachte: die Multiplikationsfunktion und Subtraktionsfunktion sind primitiv rekursiv und damit µ-rekursiv). Dann gilt sqrt = µf. Diese Funktion ist jedoch auch primitiv rekursiv. Intuition: bei Berechnung von sqrt(n) sind immer höchstens n Iterationen notwendig.) 127

µ-rekursive Funktionen Lemma 22 (While-Programm µ-rekursiv) Jede While-berechenbare partielle Funktion ist µ-rekursiv. Beweis: Es genügt, den Beweis von Lemma 20 um die While-Schleife zu erweitern. Sei also P = (While x i 0 Do Q End) ein While-Programm, in dem die Variablen x j für j k nicht vorkommen. Wir müssen zeigen, dass g P : N N : n 0, n 1,..., n k 1 [P] k (n 0,..., n k 1 ) µ-rekursiv ist (vgl. Folie 116). Nach Induktion ist dies für g Q bereits der Fall. 128

µ-rekursive Funktionen Sei also P = (While x i 0 Do Q End) ein While-Programm, in dem die Variablen x j für j k nicht vorkommen. Wir müssen zeigen, dass g P : N N : n 0, n 1,..., n k 1 [P] k (n 0,..., n k 1 ) µ-rekursiv ist (vgl. Folie 116). Nach Induktion ist dies für g Q bereits der Fall. Die Funktion h : N 2 N : (n, m) gq n (m) ist µ-rekursiv (vgl. Beweis von Lemma 20 (Fall 3)) Dann ist auch k : N 2 N : (n, m) d i (h(n, m)) µ-rekursiv und es gilt g P (x) = h((µk)(x), x),d.h. auch g P ist µ-rekursiv. 129

µ-rekursive Funktionen Satz 23 (While-Programm µ-rekursiv) Eine partielle Funktion f : N r N ist genau dann While-berechenbar, wenn sie µ-rekursiv ist. Wegen Lemma 22 reicht es, die Implikation zu beweisen. Hierzu müssen wir den Beweis von Satz 21 um den µ-operator erweitern. Sei also f = µg : N r N für eine µ-rekursive Funktion g : N r+1 N. Dann kann f durch das folgende (Pseudocode-) While-Programm berechnet werden: x 0 := 0; y := g(0, x 1,..., x r ); While y 0 Do x 0 := x 0 + 1; y := g(x 0, x 1,..., x r ); End Unter Verwendung eines While-Programms für g kann dieser Pseudocode in ein While-Programm für f umgesetzt werden. 130

Bilanz Goto TM While µ-rek. Loop prim. rek. Insbesondere sind also 4 Berechnungsbegriffe äquivalent, was die Churchsche These stützt: Churchsche These Die im intuitiven Sinne berechenbaren Funktionen sind genau die durch die formale Definition der Turingmaschinen berechenbaren. Wir wissen auch, daß es While-berechenbare Funktionen gibt, die nicht Loop-berechenbar sind (denn diese sind total). 131

Totale While-berechenbare Funktionen Frage: Ist jede totale While-berechenbare Funktion auch Loop-berechenbar? Totale, nicht Loop-berechenbare Funktionen Es gibt totale (Turing-)berechenbare Funktionen, die nicht Loop-berechenbar sind. Wir zeigen die Existenz solcher Funktionen durch einen Diagonalisierungsbeweis. 132

Totale While-berechenbare Funktionen Diagonalisierungsbeweis: 1. Schritt: Wir sehen Loop-Programme als Wörter über einem endlichen Alphabet Σ (bestehend aus den Zeichen :=, +,, Loop, x 0, x 1,... ) an. Damit kann man sie längen-lexikographisch anordnen und erhält eine Aufzählung aller Loop-Programme. 2. Schritt: Die Funktion p, die einer natürlichen Zahl n das n-te Loop-Programm in dieser Aufzählung zuordnet, ist berechenbar. Beispielsweise kann man nacheinander alle Wörter aus Σ längen-lexikographisch geordnet aufzählen, überprüfen, ob sie gültige Loop-Programme sind und das n-te gültige Programm ausgeben. 133

Totale While-berechenbare Funktionen 3. Schritt: Wir definieren eine Funktion g : N N, die bei Eingabe von n folgende Berechnungsschritte durchführt Das Loop-Programm P = p(n) wird mit n als Eingabe, d.h. n in der Variablen x 0, alle anderen Variablen mit 0 belegt, gestartet. Der bei Terminierung in der Variablen x 0 befindliche Wert wird um eins inkrementiert und ist dann der Funktionswert g(n).das heißt g(n) = π 0 ([P] k (n, 0,..., 0)) + 1 (wobei die Variablen x i für i k in P nicht vorkommen). Diese Funktion ist total, da jedes Loop-Programm terminiert. Sie ist auch Turing-berechenbar(zumindest nach der Churchschen These, man kann es aber auch formal beweisen) und daher While-berechenbar. 134

Totale While-berechenbare Funktionen 4. Schritt: Wir zeigen nun, dass g nicht Loop-berechenbar sein kann. Angenommen, es gibt ein Loop-Programm P, das g berechnet. Sei i der Index von P in der Aufzählung, d.h. P = p(i). Es gilt aufgrund der Wahl von P und der Definition von g: π 0 ([P] k (i, 0,..., 0)) = g(i) = π 0 ([P] k (i, 0,..., 0)) + 1 Das ist jedoch ein Widerspruch! 135

Totale While-berechenbare Funktionen Die Ackermann-Funktion ist das klassische Beispiel einer totalen While-, aber nicht Loop-berechenbaren Funktion Ackermannfunktion a: N 2 N (Ackermann 1928) a(0, y) = y + 1 a(x, 0) = a(x 1, 1), falls x > 0 a(x, y) = a(x 1, a(x, y 1)), falls x, y > 0 136

Totale While-berechenbare Funktionen Wertetabelle der Ackermannfunktion für kleine Werte: y = 0 1 2 3 4... a(x, y) x = 0 1 2 3 4 5... y + 1 x = 1 2 3 4 5 6... y + 2 x = 2 3 5 7 9 11... 2y + 3 x = 3 5 13 29 61 125... 2 y+3 3 x = 4 13 65533 > 10 19727 2 2... }{{} 3 y + 3 Zweier... Lemma 24 Die Ackermannfunktion ist total und While-berechenbar. Beweis siehe z.b. [Schöning]. 2 137

Totale While-berechenbare Funktionen Sei P ein Loop Programm, in dem keine Variable x i mit i k vorkommt. Für ein Tupel (n 1,..., n k ) N k schreiben wir im folgenden (n1,..., n k ) = n 1 + + n k. Dann definieren wir f P (n) = max{ [P] k (n 1,..., n k ) n 1,..., n k N, (n 1,..., n k ) n}. Lemma 25 Für jedes Loop Programm P gibt es eine Zahl l, so dass für alle n N gilt: f P (n) < a(l, n). Beweis siehe z.b. [Schöning]. 138

Totale While-berechenbare Funktionen Satz 26 (Ackermann-Funktion) Die Ackermann-Funktion ist total, While-berechenbar, aber nicht Loop-berechenbar. Angenommen die Ackermannfunktion a wäre Loop-berechenbar. Dann ist auch die Funktion g : N N mit g(n) = a(n, n) Loop-berechenbar. Sei P ein Loop-Programm mit n N : g(n) = π 0 ([P] k (n, 0,..., 0)). Nach Lemma 25 existiert eine Konstante l mit Für n = l folgt dann n N : f P (n) < a(l, n). g(l) = π 0 ([P] k (l, 0,..., 0)) f P (l) < a(l, l) = g(l). Dies ist ein Widerspruch. 139