29.12.2013 Aufrufe

Theoretische Informatik II

Theoretische Informatik II

Theoretische Informatik II

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!