Rekursive Funktionen und algorithmische Berechenbarkeit
Wir hatten die arithmetischen Operationen auf den natürlichen Zahlen rekursiv eingeführt. Als Ausblick betrachten wir nun das Konzept einer rekursiv definierten Funktion noch genauer und gelangen in zwei Stufen zu einer einfachen Definition von „algorithmisch berechenbar“.
Für die erste Stufe benötigen wir Basisfunktionen, Kompositionen und die so genannte primitive Rekursion.
Als Basisfunktionen bezeichnen wir die folgenden Funktionen:
Z : ℕ → ℕ, | Z(n) = 0 für alle n, (Nullfunktion) |
S : ℕ → ℕ, | S(n) = n + 1 für alle n, (Nachfolgerfunktion) |
Iki : ℕ k → ℕ, | Iki(n1, …, nk) = ni für alle n1, …, nk, (Projektionen) |
wobei die Projektionen für alle k ≥ 1 und alle 1 ≤ i ≤ k definiert sind.
Sind h : ℕk → ℕ und gi : ℕk′ → ℕ, 1 ≤ i ≤ k, Funktionen, so ist die Komposition dieser Funktionen, in Zeichen h(g1, …, gk), die Funktion f : ℕk′ → ℕ mit
f (n1, …, nk′) = h(g1(n1, …, nk′), …, gk(n1, …, nk′)) für alle n1, …, nk′ .
Seien h : ℕk + 1 → ℕ und g : ℕk − 1 → ℕ Funktionen für ein k ≥ 1. (Ist k = 1, so fassen wir g als ein Element von ℕ auf.) Dann ist die primitive Rekursion von g und h, in Zeichen rec(g, h), die Funktion f : ℕk → ℕ mit:
f (0, p1, …, pk − 1) | = g(p1, …, pk − 1), (Rekursionsanfang) |
f (n + 1, p1, …, pk − 1) | = h(n, f (n, p1, …, pk − 1), p1, …, pk − 1) (Rekursionsschritt) |
für alle n und alle „Parameter“ p1, …, pk − 1 ∈ ℕ.
Damit können wir nun definieren:
Definition (primitiv rekursive Funktionen)
Die primitiv rekursiven Funktionen sind wie folgt definiert:
(i) | Jede Basisfunktion ist primitiv rekursiv. |
(ii) | Eine Komposition h(g1, …, gk) primitiv rekursiver Funktionen h, g1, …, gk ist primitiv rekursiv. |
(iii) | Eine primitive Rekursion rec(g, h) primitiv rekursiver Funktionen g und h ist primitiv rekursiv. |
Für ein A ⊆ ℕk definieren wir die Indikatorfunktion indA : ℕk → { 0, 1 } von A durch indA(n1, …, nk) = 1, falls (n1, …, nk) ∈ A, und indA(n1, …, nk) = 0, sonst. Damit können wir unseren Rekursionsbegriff auf Relationen übertragen:
Definition (primitiv rekursive Relationen)
Eine Relation A ⊆ ℕk, k ≥ 1, heißt primitiv rekursiv, falls indA : ℕk → ℕ primitiv rekursiv ist.
Es ist leicht zu sehen, dass die Addition, Multiplikation und Exponentiation auf ℕ primitiv rekursiv sind. Allgemeiner kann eine Fülle von Funktionen und Relationen als primitiv rekursiv nachgewiesen werden. Alle primitiv rekursiven Funktionen sind im intuitiven Sinne algorithmisch berechenbar, und konkret können wir die vermöge der Schemata (i) − (iii) vorliegende Definition einer primitiv rekursiven Funktion f : ℕk → ℕ einem Computer beibringen und die Werte f(n1, …, nk) für beliebige n1, …, nk ausrechnen, wenn wir physikalische Limitationen vernachlässigen. Umgekehrt stellt sich die Frage, ob jede durch einen Computer berechenbare Funktion primitiv rekursiv ist. Die Antwort ist nein. Es zeigt sich, dass geschachtelte Rekursionen durch die primitive Rekursion nicht in allen Fällen abgedeckt sind. Ein Beispiel ist die Ackermann-Funktion ac : ℕ2 → ℕ, die definiert wird durch
Der Leser möge sich das enorme Wachstum dieser Funktion vor Augen führen, indem er einige Werte ac(m, n) für kleine m und n berechnet. In der Tat kann man zeigen, dass die Funktion h : ℕ → ℕ mit h(n) = ac(n, n) für alle n schneller wächst als jede primitiv rekursive Funktion. Die Funktionen h und ac sind damit nicht primitiv rekursiv. Andererseits sind diese Funktionen mit Hilfe eines Computers berechenbar.
Ein anderes Beispiel für eine berechenbare, aber nicht primitiv rekursive Funktion erhalten wir durch Diagonalisierung. Wir können alle einstelligen primitiv rekursiven Funktionen auflisten als f0, f1, f2, …, fn, … Nun definieren wir eine Funktion g : ℕ → ℕ „diagonal“ durch g(n) = fn(n) + 1 für alle n. Dann ist g ≠ fn für alle n. Die Funktion g lässt sich, mit etwas Programmieraufwand, tatsächlich mit Hilfe eines Computers berechnen.
Wir müssen also unsere Definition der primitiv rekursiven Funktion erweitern, und im Hinblick auf das sehr allgemeine Diagonalargument muss diese Erweiterung substantiell sein und eine neue Idee ins Spiel bringen. Erstaunlicherweise sind wir aber nur einen Schritt von einer umfassenden Definition entfernt: In Berechnungen können wir eine „unbeschränkte Suche“ starten, die entweder ein Ergebnis liefert oder aber divergiert, d. h. unendlich lange läuft. Diese unbeschränkte Suche fügen wir nun zu den primitiv rekursiven Funktionen hinzu.
Ist g : ℕk + 1 → ℕ, k ≥ 1, eine Funktion, so ist die μ-Rekursion von g, in Zeichen μ g, die Funktion f : A → ℕ mit
A = { (n1, …, nk) | es gibt ein n mit g(n1, …, nk, n) = 0 } ⊆ ℕk,
f(n1, …, nk) = „das kleinste n mit g(n1, …, nk, n) = 0“ für alle (n1, …, nk) ∈ A.
Damit definieren wir nun:
Definition (partiell rekursiv)
Eine Funktion f : A → ℕ, A ⊆ ℕk, k ≥ 1, heißt partiell rekursiv, falls es primitiv rekursive Funktionen g : ℕk + 1 → ℕ und u : ℕ → ℕ gibt mit f = u ∘ μ g.
Eine partiell rekursive Funktion entsteht also aus einer primitiv rekursiven Funktion durch eine unbeschränkte Nullstellensuche, gefolgt von einer abschließenden primitiv rekursiven Umrechnung der Suchergebnisse (beschrieben durch u).
Der Definitionsbereich einer k-stelligen partiell rekursiven Funktion ist im Allgemeinen eine echte Teilmenge von ℕk. Dieses Merkmal verhindert es, die partiell rekursiven Funktionen erneut durch Diagonalisierung zu transzendieren. Wir können diese Funktionen wieder als f0, f1, …, fn, … auflisten, und wir können g : A → ℕ, A ⊆ ℕ, definieren durch g(n) = fn(n) + 1, falls n ∈ dom(fn). Aber wir können nicht mehr „g ≠ fn für alle n“ folgern, da im Allgemeinen n ∉ dom(g) gilt.
Gilt dom(f) = ℕk für eine k-stellige partiell rekursive Funktion f, so heißt f auch μ-rekursiv oder kurz rekursiv.
Man kann beweisen, dass die partiell rekursiven Funktionen genau mit den Funktionen f : A → ℕ, A ⊆ ℕk, k ≥ 1, zusammenfallen, die durch eine beliebig gewählte höhere Programmiersprache im theoretischen Sinne berechnet werden können. Insbesondere sind die Ackermann-Funktion und die Diagonalisierung der primitiv rekursiven Funktionen μ-rekursiv, und die Diagonalisierung der partiell rekursiven Funktionen ist partiell rekursiv.
Insgesamt ist eine Vielzahl von unterschiedlich motivierten Definitionen des Begriffs „algorithmisch berechenbar“ gefunden worden, die allesamt genau die partiell rekursiven Funktionen liefern. Dies ist ein starkes Argument dafür, dass man einen wichtigen und natürlichen Begriff gefunden hat. Dass alle intuitiv berechenbaren Funktionen unter diesen Begriff fallen, lässt sich aufgrund der Unschärfe der intuitiven Berechenbarkeit naturgemäß nicht beweisen. Diese Hypothese ist als Churchsche These bekannt.
Die μ-rekursiven Funktionen bilden nur einen kleinen Teil aller Funktionen auf den natürlichen Zahlen. Denn ihre Menge ist abzählbar, während die Menge aller Funktionen von ℕ nach ℕ überabzählbar ist. Diese Überlegung zeigt die Weite des allgemeinen mathematischen Funktionsbegriffs.