Theoretische Informatik II
Theoretische Informatik II
Theoretische Informatik II
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
<strong>Theoretische</strong> <strong>Informatik</strong> <strong>II</strong><br />
Einheit 4.2<br />
Rekursive Funktionen<br />
1. Primitiv- und µ-rekursive Funktionen<br />
2. Analyse und Programmierung<br />
3. Äquivalenz zu Turingmaschinen
Berechenbarkeit auf N ohne Maschinenmodelle<br />
Welche Arten von Funktionen sind berechenbar?<br />
• Primitive Funktionen müssen berechenbar sein<br />
– Nachfolger: von einer Zahl zur nächsten weiterzählen<br />
– Projektion: aus einer Gruppe von Werten einen herauswählen<br />
– Konstante: unabhängig von der Eingabe eine feste Zahl ausgeben<br />
• Berechenbare Funktionen sind zusammensetzbar<br />
– Einfache Operationen erzeugen neue berechenbare Funktionen<br />
– Komposition: Hintereinanderausführen mehrerer Berechnungen<br />
– Rekursion: Bei der Ausführung ruft eine Funktion sich selbst wieder auf<br />
– Suche: Bestimmung der ersten Nullstelle einer Funktion<br />
• Beschreibung benötigt keine Funktionsargumente<br />
– Es reicht, primitive Grundfunktionen und Operationen zu benennen<br />
– ‘Abstrakte Programmiersprache’: wende Operationen auf Funktionen an<br />
– Mathematischer Kalkül für das informatiktypische ‘Baukastensystem’<br />
<strong>Theoretische</strong> <strong>Informatik</strong> <strong>II</strong> §4.2: 1 Rekursive Funktionen
Bausteine µ-rekursiver Funktionen<br />
• Grundfunktionen<br />
– Nachfolgerfunktion s :N→N mit s(x) = x+1 für x ∈N<br />
– Projektionsfunktionen prk n :Nn →N mit prk n(x 1, .., x n ) = x k (1≤k≤n)<br />
– Konstantenfunktion c n k :Nn →N mit c n k (x 1, .., x n ) = k (0≤n)<br />
• Operationen auf Funktionen<br />
– Komposition f ◦ (g 1 , .., g n ) :N k →N (g 1 , .., g n :N k →N, f:N n →N)<br />
Für h = f ◦ (g 1 , .., g n ) gilt h(⃗x) = f( g 1 (⃗x), .., g n (⃗x) )<br />
– Primitive Rekursion P r[f, g] :N k →N (f:N k−1 →N, g:N k+1 →N)<br />
Für h = P r[f, g] gilt h(⃗x, 0) = f(⃗x), und h(⃗x, y+1) = g(⃗x, y, h(⃗x, y))<br />
– µ-Operator (Minimierung)<br />
⎧<br />
µf :N k →N (f:N k+1 →N)<br />
⎨ min{y | f(⃗x, y)=0} falls dies existiert und<br />
Für h = µf gilt h(⃗x) =<br />
alle f(⃗x, i), i
Operationen entsprechen Programmstrukturen<br />
• Komposition ˆ= Folge von Anweisungen<br />
y 1<br />
:= g 1<br />
(x 1<br />
,..,x m<br />
);<br />
.<br />
y n<br />
:= g n<br />
(x 1<br />
,..,x m<br />
);<br />
h := f(y 1<br />
,..,y n<br />
) (h ˆ= h(x 1 , .., x m ) für h = f◦(g 1 , .., g n ))<br />
• Primitive Rekursion ˆ= umgekehrte Zählschleife<br />
h := f(x 1<br />
,..,x n<br />
);<br />
for i:=1 to y do<br />
od<br />
h := g(x 1<br />
,..,x n<br />
,i-1,h)<br />
(h ˆ= h(x 1 , .., x n , y) für h = P r[f, g])<br />
• Minimierung ˆ= Suche mit While-schleife<br />
y := 0;<br />
while f(x 1<br />
,..,x n<br />
,y)≠0 do<br />
(unbegrenzte Suche)<br />
y:=y+1<br />
od;<br />
h := y (h ˆ= h(x 1 , .., x n ) für h = µf<br />
<strong>Theoretische</strong> <strong>Informatik</strong> <strong>II</strong> §4.2: 3 Rekursive Funktionen
Primitiv- und µ-rekursive Funktionen<br />
• f:N k →N primitiv-rekursiv<br />
– f ist Nachfolger-, Projektions- oder Konstantenfunktion<br />
– f entsteht aus primitiv-rekursiven Funktionen<br />
durch Komposition oder primitive Rekursion<br />
Primitiv-rekursive Funktionen sind total (terminieren immer)<br />
• f:N k →N µ-rekursiv (kurz rekursiv)<br />
– f ist Nachfolger-, Projektions- oder Konstantenfunktion<br />
– f entsteht aus µ-rekursiven Funktionen<br />
durch Komposition, primitive Rekursion oder Minimierung<br />
µ-rekursive Funktionen können partiell sein<br />
• Kurzbezeichnungen<br />
– PR: Menge der primitiv-rekursiven Funktionen<br />
– T R: Menge der totalen µ-rekursiven Funktionen<br />
– R: Menge der µ-rekursiven Funktionen<br />
<strong>Theoretische</strong> <strong>Informatik</strong> <strong>II</strong> §4.2: 4 Rekursive Funktionen
Beispiel einer primitiv-rekursiven Funktion<br />
• f 1<br />
= P r[pr 1 1 , s ◦ pr3 3 ] Was macht f 1 ?<br />
• Stelligkeitsanalyse:<br />
pr 1 1:N→N, pr 3 3:N 3 →N, s ◦ pr 3 3:N 3 →N<br />
↦→ f 1<br />
: N 2 →N<br />
• Auswertung durch schrittweises Einsetzen<br />
Beispiel: f 1 (2, 2) = 4<br />
– Einsetzen des Definitionsschemas bei Operationen<br />
– Direkte Auswertung von Argumenten bei Grundfunktionen<br />
• Analyse des rekursiven Verhaltens:<br />
– f 1 (x, 0) = pr 1 1(x) = x<br />
– f 1 (x, y+1) = (s ◦ pr 3 3)(x, y, f 1 (x, y)) = s(f 1 (x, y)) = f 1 (x, y)+1<br />
Das ist die Rekursionsgleichung }<br />
der Addition<br />
x+0 = x<br />
↦→ f 1 = add mit add(n, m) = n+m<br />
x+(y+1) = (x+y)+1<br />
<strong>Theoretische</strong> <strong>Informatik</strong> <strong>II</strong> §4.2: 5 Rekursive Funktionen
Analyse µ-rekursiver Funktionen<br />
• f 2<br />
= µc 2 1<br />
f 2 (x) =<br />
=<br />
⎧<br />
⎨<br />
⎩<br />
{<br />
min{y | c 2 1(x, y)=0} falls y existiert und alle<br />
c 2 1(x, i), i0 und y
‘Programmierung’ µ-rekursiver Funktionen<br />
• Vorgängerfunktion p : N→N p(n) = n ˙−1<br />
Finde ‘Programm’ im Kalkül der µ-rekursiven Funktionen<br />
• Analysiere rekursives Verhalten:<br />
– p(0) = 0 ˙−1 = 0<br />
– p(y+1) = (y+1) ˙−1 = y<br />
• Beschreibe Verhalten als Primitive Rekursion:<br />
– Benötigt: f:N 0 →N mit p(0) = f() = 0 ↦→ f = c 0 0<br />
und g:N 2 →N mit p(y+1) = g(y, p(y)) = y ↦→ g = pr1<br />
2<br />
↦→ p = P r[c 0 0 , pr2 1 ]<br />
<strong>Theoretische</strong> <strong>Informatik</strong> <strong>II</strong> §4.2: 7 Rekursive Funktionen
Beispiele primitiv-rekursiver Funktionen<br />
• Subtraktion sub : N 2 →N<br />
sub(n, m) = n ˙−m<br />
– sub(x, 0) = x = pr1(x)<br />
1<br />
– sub(x, y+1) = x ˙−(y+1) = (x ˙−y) ˙−1 = p(x ˙−y) = (p ◦ pr3)(x, 3 y, sub(x, y))<br />
↦→ sub = P r[pr1, 1 p ◦ pr3]<br />
3<br />
• Multiplikation mul : N 2 →N<br />
mul(n, m) = n∗m<br />
– mul(x, 0) = 0 = c 1 0(x)<br />
– mul(x, y+1) = mul(x, y)+x = (add ◦ (pr1, 3 pr3))(x, 3 y, mul(x, y))<br />
↦→ mul = P r[c 1 0, (add ◦ (pr1, 3 pr3))]<br />
3<br />
• Exponentiierung exp : N 2 →N<br />
exp = P r[c 1 1, (mul ◦ (pr1, 3 pr3))]<br />
3<br />
exp(n, m) = n m<br />
• Fakultät fak : N→N<br />
fak = P r[c 0 1, (mul ◦ (s ◦ pr1, 2 pr2))]<br />
2<br />
• Signum-Funktion sign : N→N sign(n) =<br />
sign = P r[c 0 0, c 2 1]<br />
fak(n) = n! = 1*2*...*n<br />
{<br />
0 falls n = 0<br />
1 sonst<br />
<strong>Theoretische</strong> <strong>Informatik</strong> <strong>II</strong> §4.2: 8 Rekursive Funktionen
Primitiv-rekursive Programmiertechniken<br />
• Definition durch Fallunterscheidung<br />
h(⃗x) =<br />
{<br />
f(⃗x) falls test(⃗x) = 0<br />
g(⃗x) sonst<br />
(f, g, test:N k →N primitiv-rekursiv)<br />
Wende Signum-Funktion auf Testergebnis an und multipliziere auf<br />
– h(⃗x) = (1 ˙−sign(test(⃗x))) ∗ f(⃗x) + sign(test(⃗x)) ∗ g(⃗x)<br />
↦→ h = add ◦ (mul ◦ (sub ◦ (c 1 1, sign ◦ test), f), mul ◦ (sign ◦ test, g))<br />
• Generelle Summe Σ r i=0f(⃗x, i)<br />
Generelles Produkt Π r i=0 f(⃗x, i) (f:Nk+1 →N p.r.)<br />
– ∑ 0<br />
i=0<br />
f(⃗x, i) = f(⃗x, 0)<br />
– ∑ y+1<br />
i=0 f(⃗x, i) = (∑ y<br />
i=0<br />
f(⃗x, i)) + f(⃗x, y + 1)<br />
↦→ Σf = P r[f ◦ (pr 1 1, c 1 0), add ◦ (pr 3 3, f ◦ (pr 3 1, s ◦ pr 3 2))]<br />
↦→ Πf = P r[f ◦ (pr 1 1, c 1 0), mul ◦ (pr 3 3, f ◦ (pr 3 1, s ◦ pr 3 2))]<br />
<strong>Theoretische</strong> <strong>Informatik</strong> <strong>II</strong> §4.2: 9 Rekursive Funktionen<br />
(für k=1)<br />
Lösungen für k>1 analog
Primitiv-rekursive Programmiertechniken<br />
• Beschränkte Minimierung<br />
h(⃗x, t) =<br />
{<br />
min{y≤t | f(⃗x, y) = 0} falls dies existiert<br />
t+1 sonst<br />
Schreibweise: h(⃗x, t) = Mn t [f](⃗x)<br />
Rekursives Verhalten:<br />
{<br />
0 fallsf(⃗x, 0) = 0<br />
– h(⃗x, 0) =<br />
= sign(f(⃗x, 0))<br />
1 sonst<br />
⎧<br />
⎪⎨ h(⃗x, t) falls h(⃗x, t)≤t<br />
– h(⃗x, t+1) = t+1 falls h(⃗x, t) = t+1 und f(⃗x, t+1) = 0<br />
⎪⎩ t+2 sonst<br />
Programmierbar mit Fallunterscheidung und<br />
primitiver Rekursion (aufwendiger Ausdruck)<br />
h ist primitiv rekursiv, wenn f primitiv rekursiv ist<br />
<strong>Theoretische</strong> <strong>Informatik</strong> <strong>II</strong> §4.2: 10 Rekursive Funktionen
Weitere primitiv-rekursive Funktionen<br />
• Absolute Differenz absdiff : N 2 →N absdiff (n, m) = |n − m|<br />
{<br />
• Maximum max : N 2 n falls n ≥ m<br />
→N max(n, m) =<br />
m sonst<br />
{<br />
• Minimum min : N 2 m falls n ≥ m<br />
→N min(n, m) =<br />
n sonst<br />
• Division div : N 2 →N<br />
div(n, m) = n÷m<br />
• Divisionsrest mod : N 2 →N<br />
• Quadratwurzel sqrt : N→N<br />
• Logarithmus ld : N→N<br />
mod(n, m) = n mod m<br />
sqrt(n) = ⌊ √ n⌋<br />
ld(n) = ⌊log 2 n⌋<br />
• Größter gemeinsamer Teiler ggT : N 2 →N<br />
• Kleinstes gemeinsames Vielfaches kgV : N 2 →N<br />
Beweise in Übungen<br />
<strong>Theoretische</strong> <strong>Informatik</strong> <strong>II</strong> §4.2: 11 Rekursive Funktionen
Berechenbare Numerierung von Zahlenpaaren<br />
0 1 2 3 4 5 ...<br />
0 0 1 3 6 10 15 ...<br />
1 2 4 7 11 16 ...<br />
2 5 8 12 17 ...<br />
3 9 13 18 ...<br />
4 14 19 ...<br />
5<br />
.<br />
20<br />
. . . . .<br />
...<br />
. ...<br />
〈x, y〉<br />
:=<br />
(x+y)(x+y+1)÷2 + y<br />
“Standard-Tupelfunktion”<br />
• 〈〉:N 2 →N ist primitiv-rekursiv und bijektiv<br />
• Die Umkehrfunktionen π 2 i := pr2 i ◦ 〈〉−1 sind primitiv-rekursiv<br />
• 〈〉 kann iterativ auf N k →N und auf N ∗ →N fortgesetzt werden<br />
– 〈x, y, z〉 3 = 〈x, 〈y, z〉〉, . . . , 〈x 1 ...x k 〉 ∗ = 〈k, 〈x 1 , .., x k 〉 k 〉<br />
– Alle Funktionen sind bijektiv und primitiv-rekursiv<br />
– Alle Umkehrfunktionen π k i und π ∗ i sind primitiv-rekursiv<br />
• Jede rekursive Funktion kann einstellig simuliert werden<br />
– Für f:N 2 →N und g:=f◦(π 2 1, π 2 2) gilt g : N→N und g〈x, y〉 = f(x, y)<br />
<strong>Theoretische</strong> <strong>Informatik</strong> <strong>II</strong> §4.2: 12 Rekursive Funktionen
Die Ackermann-Funktion (1928)<br />
• Definiere Funktionen A n iterativ:<br />
A 0 (x) :=<br />
⎧<br />
⎪⎨<br />
⎪⎩<br />
1 falls x = 0<br />
2 falls x = 1<br />
x+2 sonst<br />
A n+1 (0) := 1<br />
Jede der Funktionen A n ist primitiv-rekursiv<br />
• Wachstumsverhalten<br />
A 1 (x) = 2x (x≥1)<br />
A 2 (x) = 2 x<br />
A 3 (x) = 2 (2(2...2) )<br />
} {{ }<br />
x−mal<br />
A 4 (0) = 1<br />
A 4 (1) = 2<br />
• Definiere A(x) := A x (x)<br />
A 4 (2) = 2 2 = 4<br />
A n+1 (x+1) := A n (A n+1 (x))<br />
A 4 (3) = 2 222 = 65536<br />
A 4 (4) = 2 (2(2...2) )<br />
} {{ }<br />
65536−mal<br />
A 4 (5) = 2 (2(2...2) )<br />
} {{ }<br />
A 4 (4)−mal<br />
(Große Ackermann-Funktion)<br />
– A nicht primitiv-rekursiv: A wächst schneller als jede p.r. Funktion<br />
– A µ-rekursiv: Abarbeitung des Berechnungsstacks ‘programmierbar’<br />
<strong>Theoretische</strong> <strong>Informatik</strong> <strong>II</strong> §4.2: 13 Rekursive Funktionen
Min-rekursive Funktionen<br />
Funktionsdefinition ohne primitive Rekursion<br />
• f:N k →N<br />
min-rekursiv<br />
– f ist Addition, Nachfolger-, Projektions- oder Konstantenfunktion<br />
– f entsteht aus min-rekursiven Funktionen durch Komposition<br />
oder Minimierung<br />
Wichtiger Sonderfall für Vergleiche mit anderen Modellen<br />
R min : Menge der min-rekursiven Funktionen<br />
• R min ⊆ R: min-rekursive Funktionen sind µ-rekursiv<br />
– Offensichtlich, da Additition µ-rekursiv ist<br />
• R ⊆ R min : µ-rekursive Funktionen sind min-rekursiv<br />
– Beschreibe Abarbeitung des Stacks einer primitiven Rekursion<br />
– Suche nach erstem erzeugten Stack der Länge 1 (Details aufwendig)<br />
<strong>Theoretische</strong> <strong>Informatik</strong> <strong>II</strong> §4.2: 14 Rekursive Funktionen
Ausdruckskraft rekursiver Funktionen<br />
• Es gilt PR ⊂ T R ⊂ R<br />
– Teilmengenbeziehung gilt offensichtlich<br />
– T R ≠ R: nicht alle rekursiven Funktionen sind total (z.B. f 3<br />
= µ add)<br />
– PR ≠ T R: die Ackermannfunktion ist total, aber nicht primitiv rekursiv<br />
• R⊆T : rekursive Funktionen sind Turing-berechenbar<br />
– Alle Grundfunktionen sind konventionell berechenbar<br />
– Komposition, Primitive Rekursion und µ-Operator sind berechenbar<br />
– Konventionell berechenbare Funktionen sind Turing-berechenbar<br />
• T ⊆R: Turing-berechenbare Funktionen sind rekursiv<br />
– Codiere Konfigurationen (Worttupel) als Zahlentupel<br />
– Simuliere Konfigurationsübergänge ⊢ als primitiv-rekursive Funktionen<br />
– Beschreibe Terminierung von ⊢ ∗ als Suche nach Endkonfiguration<br />
– Semantik der Turingmaschine ist Iteration von ⊢ bis Terminierung<br />
<strong>Theoretische</strong> <strong>Informatik</strong> <strong>II</strong> §4.2: 15 Rekursive Funktionen
Konsequenzen der Äquivalenzbeweise<br />
• Für formale Argumente zur Berechenbarkeit<br />
können wahlweise Turingmaschinen oder<br />
µ-rekursive Funktionen eingesetzt werden<br />
• Kleene Normalform Theorem:<br />
Für jede berechenbare Funktion h kann man primitivrekursive<br />
Funktionen f und g konstruieren, so daß<br />
h(x) = g(x, µf(x))<br />
– Simuliere Turingmaschine für h als µ-rekursive Funktion<br />
– f ist die Funktion, die Terminierung charakterisiert<br />
– µf berechnet die Anzahl der Schritte bis zur Terminierung<br />
– g berechnet die Iteration der Konfigurationsübergänge<br />
• Berechenbare Funktionen kommen mit einer<br />
einzigen Minimierung (While-Schleife) aus<br />
<strong>Theoretische</strong> <strong>Informatik</strong> <strong>II</strong> §4.2: 16 Rekursive Funktionen