Formale Sprachen und Komplexit¨at
Sommersemester 2019
Berechenbarkeitstheorie: Teil II
Prof. Dr. David Sabel
LFE Theoretische Informatik
Inhalt
Ackermannfunktion
Primitiv rekursive Funktionen µ-rekursive Funktionen
Die Ackermannfunktion
Von Wilhelm Ackermann in 1920er Jahre vorgeschlagen sehr schnell wachsende Funktion
Variante von R´ozsa P´eter:
Ackermann-Funktiona: (N×N)→N
a(x, y) =
y+ 1, falls x= 0
a(x−1,1) falls x6= 0 undy = 0 a(x−1, a(x, y−1)) falls x >0 undy >0
Unser n¨achstes Ziel:
Die Ackermannfunktion ist WHILE-berechenbar, aber: die Ackermannfunktion istnicht LOOP-berechenbar (obwohl sie total ist)
Die Ackermannfunktion
Von Wilhelm Ackermann in 1920er Jahre vorgeschlagen sehr schnell wachsende Funktion
Variante von R´ozsa P´eter:
Ackermann-Funktiona: (N×N)→N
a(x, y) =
y+ 1, falls x= 0
a(x−1,1) falls x6= 0 undy = 0 a(x−1, a(x, y−1)) falls x >0 undy >0 Unser n¨achstes Ziel:
Die Ackermannfunktion ist WHILE-berechenbar, aber:
die Ackermannfunktion istnicht LOOP-berechenbar (obwohl sie total ist)
Einige Werte der Ackermannfunktion
Tabelle mita(x, y)-Eintr¨agen:
y\x 0 1 2 3 4
0 1 2 3 5 13
1 2 3 5 13 65533
2 3 4 7 29 265536−3
3 4 5 9 61 a(3,265536−3) 4 5 6 11 125 a(3, a(4,3))
Terminierung
a(x, y) =
y+ 1, falls x= 0
a(x−1,1) falls x6= 0 undy = 0 a(x−1, a(x, y−1)) falls x >0 undy >0 Mehrmaliges Entfalten der dritten Zeile zeigt:
a(x, y) = (a(x−1, a(x−1, a(x−1, . . . , a(x−1,
| {z }
y+1−mal
1). . .))))
Daher sind alle rekursiven Aufrufe echt kleiner und daher terminiert die Ackermannfunktion stets.
Lemma
Die Ackermannfunktion ist total.
Berechenbarkeit der Ackermannfunktion
Intuitiv klar: Mit jeder modernen Programmiersprache ist die Ackermannfunktion implementierbar. Daher ist sie auch (intuitiv) berechenbar.
Satz
Die Ackermannfunktion ist WHILE-berechenbar.
Beweis: Erstelle ein WHILE-Programm, welches die rekursive Berechnung durchf¨uhrt mit einem Stack.
Daher ist der erste Schritt im Beweis: Darstellung des Stacks
Implementierung von Operationen auf dem Stack als WHILE-Programm.
Danach wird das Programm angegeben, dass die Stackoperationen durchf¨uhrt.
Berechenbarkeit der Ackermannfunktion
Intuitiv klar: Mit jeder modernen Programmiersprache ist die Ackermannfunktion implementierbar. Daher ist sie auch (intuitiv) berechenbar.
Satz
Die Ackermannfunktion ist WHILE-berechenbar.
Beweis: Erstelle ein WHILE-Programm, welches die rekursive Berechnung durchf¨uhrt mit einem Stack.
Daher ist der erste Schritt im Beweis: Darstellung des Stacks
Implementierung von Operationen auf dem Stack als WHILE-Programm.
Danach wird das Programm angegeben, dass die Stackoperationen durchf¨uhrt.
Berechenbarkeit der Ackermannfunktion
Intuitiv klar: Mit jeder modernen Programmiersprache ist die Ackermannfunktion implementierbar. Daher ist sie auch (intuitiv) berechenbar.
Satz
Die Ackermannfunktion ist WHILE-berechenbar.
Beweis: Erstelle ein WHILE-Programm, welches die rekursive Berechnung durchf¨uhrt mit einem Stack.
Daher ist der erste Schritt im Beweis:
Darstellung des Stacks
Implementierung von Operationen auf dem Stack als WHILE-Programm.
Danach wird das Programm angegeben, dass die Stackoperationen durchf¨uhrt.
Vorbemerkung
Darstellung von Tupelfolgen mit fester L¨ange kals eine einzige Zahl:
hn1, . . . , nk,0i=c(n1, c(n2,(. . . , c(nk,0). . .) wobei c(x, y) eine Bijektion (N×N)→Nist Wir nehmen an, dass left und right existieren mit left(c(x, y)) =xund right(c(x, y)) =y
Genauere Details zuc,left,right werden sp¨ater nochmal er¨ortert
Ackermannfunktion mit WHILE berechnen
Stack:
Stack: Folge von Zahlenn1, . . . , nk,0 sodassn1 ganz oben liegt. Leerer Stack: 0 markiert Kellerboden.
Stack im WHILE-Programm: Variable stack, die Zahl hn1, . . . , nk,0i=c(n1, c(n2,(. . . , c(nk,0). . .) speichert, und stacksize, die Gr¨oße des Stacks speichert
Stack-Operationen:
push(x, stack) legt Zahlx oben auf den Stack. WHILE-Programm dazu:
stack:=c(x, stack);stacksize:=stacksize+ 1.
x:=pop(stack) entfernt das oberste Element vom Stack und setzt x auf dessen Wert.
WHILE-Programm: x:=left(stack);stack=right(stack); stacksize:=stacksize−1
stacksize6= 1: WHILE-Programm dazu existiert
Ackermannfunktion mit WHILE berechnen
Stack:
Stack: Folge von Zahlenn1, . . . , nk,0 sodassn1 ganz oben liegt. Leerer Stack: 0 markiert Kellerboden.
Stack im WHILE-Programm: Variable stack, die Zahl hn1, . . . , nk,0i=c(n1, c(n2,(. . . , c(nk,0). . .) speichert, und stacksize, die Gr¨oße des Stacks speichert
Stack-Operationen:
push(x, stack) legt Zahlx oben auf den Stack.
WHILE-Programm dazu:
stack:=c(x, stack);stacksize:=stacksize+ 1.
x:=pop(stack) entfernt das oberste Element vom Stack und setzt x auf dessen Wert.
WHILE-Programm: x:=left(stack);stack=right(stack);
stacksize:=stacksize−1
stacksize6= 1: WHILE-Programm dazu existiert
WHILE-Programm zur Berechnung von a(x, y)
stack:= 0;
stacksize:= 0;
push(x, stack);
push(y, stack);
WHILEsize(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)
ELSEpush(x−1, stack);push(x, stack),push(y−1, stack);
END END END
result:=pop(stack);
Eigenschaften der Ackermannfunktion
Lemma
Die folgenden Monotonie-Eigenschaften gelten f¨ur die Ackermannfunktiona:
1 y < a(x, y)
2 a(x, y)< a(x, y+ 1)
3 a(x, y+ 1)≤a(x+ 1, y)
4 a(x, y)< a(x+ 1, y)
5 Falls x≤x0 und y≤y0, dann gilt aucha(x, y)≤a(x0, y0) Beweise im Skript (Induktion ¨uberx bzw. y, bzw (x, y))
Maximale LOOP-berechenbare Zahlen
Sei P ein LOOP-Programm
Seien x0, . . . , xk die in P vorkommenden Variablen.
Sei
fP(n) = max ( k
X
i=0
ρ0(xi)|
k
X
i=0
ρ(xi)≤n,(ρ, P)−−−→
LOOP
∗ (ρ0, ε) )
fP(n) ist die maximale Zahl, die als Summe aller
Endbelegungen ρ0 der Variablenx0, . . . , xk zustande kommt,
¨uber alle initialen Variablenbelegung ρ, die in der Summe der Werte ρ(x0), . . . , ρ(xk)den Wert n nicht ¨uberschreiten.
Maximale LOOP-berechenbare Zahlen (2)
Satz
F¨ur jedes LOOP-Programm P gibt es eine Konstantek, so dass fP(n)< a(k, n)f¨ur alle n∈N.
Beweis: NormalisiereP zun¨achst:
Ersetze Zuweisungenxi:=xj+c durch xi:=xj + 1;xi:=xi+ 1;. . . xi :=xi+ 1
| {z }
c−1mal
.
F¨urLOOP xi DO QEND und xi kommt in Qvor:
Ersetze LOOPxi DO QEND durch x0i:=xi;LOOPx0i DO QEND;x0i := 0, wobei x0i eine neue Variable ist.
Beides ver¨andertfP nicht!
Zeige Behauptung f¨ur normalisierte Programme.
Maximale LOOP-berechenbare Zahlen (3)
Zu zeigen: F¨ur jedes normalisierte LOOP-Programm P gibt es eine Konstantek, so dassfP(n)< a(k, n) f¨ur alle n∈N.
Beweis durch strukturelle Induktion ¨uber normalisiertes Programm. F¨alle:
1 Zuweisung xi :=xj+cmit c∈Zund c≤1
2 Sequenz P1;P2
3 LOOP-Schleife LOOPxi DO QEND, wobei xi nicht inQvorkommt.
Maximale LOOP-berechenbare Zahlen (3)
Zu zeigen: F¨ur jedes normalisierte LOOP-Programm P gibt es eine Konstantek, so dassfP(n)< a(k, n) f¨ur alle n∈N.
Beweis durch strukturelle Induktion ¨uber normalisiertes Programm.
F¨alle:
1 Zuweisung xi :=xj+cmit c∈Zund c≤1
2 Sequenz P1;P2
3 LOOP-Schleife LOOPxi DO QEND, wobei xi nicht inQvorkommt.
Maximale LOOP-berechenbare Zahlen (3)
Zu zeigen: F¨ur jedes normalisierte LOOP-Programm P gibt es eine Konstantek, so dassfP(n)< a(k, n) f¨ur alle n∈N.
Beweis durch strukturelle Induktion ¨uber normalisiertes Programm.
F¨alle:
1 Zuweisung xi :=xj+cmitc∈Zund c≤1
2 Sequenz P1;P2
3 LOOP-Schleife LOOPxi DO QEND, wobei xi nicht inQvorkommt.
Maximale LOOP-berechenbare Zahlen (4)
Fall: Zuweisungxi :=xj+cmitc∈Z und c≤1 Dann giltfP(n)≤2n+ 1, da im maximalen Fall:
ρ(xk) = 0 f¨urk6=j ρ(xj) =n
c= 1und ρ0(xi) =n+ 1, ρ0(xj) =nund
ρ0(xk) = 0 f¨urk6=j und k6=i Mita(2, y) = 2y+ 3(s. Skript) folgt
fP(n)≤2n+ 1<2n+ 3 =a(2, n) D.h. die AussagefP(n)≤a(k, n) gilt mit k= 2.
Maximale LOOP-berechenbare Zahlen (5)
Fall: SequenzP1;P2
Induktionsannahme:fPi(n)< a(ki, n) f¨uri= 1,2.
Es gilt:
fP(n) =fP2(fP1(n))
< a(k2, a(k1, n))
≤a(max{k1, k2}, a(max{k1, k2}, n) (1)
≤a(max{k1, k2}, a(max{k1, k2}+ 1, n+ 1) (1)
=a(max{k1, k2}+ 1, n+ 1) (Definition vona)
≤a(max{k1, k2}+ 2, n) (2)
(1) Monotonie:x≤x0, y ≤y0 =⇒ a(x, y)≤a(x0, y0) (2) Monotonie:a(x, y+ 1)≤a(x+ 1, y)
Daher giltfP(n)< a(k, n) f¨ur k= max{k1, k2}+ 2.
Maximale LOOP-berechenbare Zahlen (6)
Fall:LOOP xi DO QEND und xi kommt nicht inQ vor Induktionsannahme:fQ(n)< a(kQ, n) f¨ur einkQ.
fP(n) berechnet Maximum. Sei ρ so, dass fP(n) maximal ist.
Wenn ρ(xi) = 0, dann istfP(n) =n < a(0, n).
Wenn ρ(xi) = 1, dann istfP(n) =fQ(n)< a(kQ, n) Sei ρ(xi)≥2. . . .
Maximale LOOP-berechenbare Zahlen (7)
Fall:LOOP xi DO QEND und xi kommt nicht inQ vor Sei ρ(xi)≥2. . . . Da xi nicht inQ vorkommt, gilt:
fP(n) =fQ(. . .(fQ
| {z }
ρ(xi)mal
(n−ρ(xi)). . .) +ρ(xi) (daxi6∈Q,fQ unabh. vonρ(xi))
≤a(k1, . . . , a(k1, n−ρ(xi)). . .) (ρ(xi)-mal gilt<(f¨ur jedesfQ).
Daher ≤undρ(xi)f¨allt weg)
< a(k1, . . . , a(k1,
| {z }
ρ(xi)−1mal
a(k1+ 1, n−ρ(xi)). . .))(1)
=a(k1+ 1, n−ρ(xi) +ρ(xi)−1)(Definition vona)
=a(k1+ 1, n−1)≤a(k1+ 1, n)(2)
(1) Monotonie:a(x, y)< a(x+ 1, y) (2) Monotonie:a(x, y)< a(x, y+ 1) Daher giltfP(n)< a(k, n) f¨ur k=k1+ 1
Ackermannfunktion nicht LOOP-berechenbar
Theorem
Die Ackermannfunktion ist nicht LOOP-berechenbar.
Beweis:
Annahme: aist LOOP-berechenbar.
Dann ist auchf(x1) =a(x1, x1) LOOP-berechenbar.
Sei P LOOP-Programm, dassf berechnet.
Dann gilt f(x1)≤fP(x1) (daρ0(x0) =f(x1) nach Ausf¨uhrung von P)
Es gibt Konstante k, sodassfP(n)< a(k, n) Starte P mitρ={x1 7→k}.
Dann gilt f(k)≤fP(k)< a(k, k) =f(k) Widerspruch!
aist nicht LOOP-berechenbar.
Fazit
Theorem
Es gibt totale WHILE-berechenbare (bzw. GOTO-berechenbare, Turingberechenbare) Funktionen, die nicht LOOP-berechenbar sind.
Rekursive Funktionen
Weiterer Formalismus zur Definition der Berechenbarkeit Primitiv rekursive Funktionen und
µ-rekursive Funktionen Wir werden sehen
Primitiv rekursive Funktionen entsprechen genau den LOOP-berechenbaren Funktionen
µ-rekursive Funktionen entsprechen genau den
Turingberechenbaren (WHILE-, GOTO-berechenbaren) Funktionen
Primitiv rekursive Funktionen
Definition
Eine Funktionf :Nk→Nistprimitiv rekursiv, wenn sie der folgenden induktiven Definition gen¨ugt:
Jedekonstante Funktionf(x1, . . . , xk) =c∈Nist primitiv rekursiv.
DieProjektionsfunktionenπki(x1, . . . , xk) =xisind primitiv rekursiv.
DieNachfolgerfunktionsucc(x) =x+ 1ist primitiv rekursiv.
Komposition / Einsetzung: Wenng:Nm→Nund f¨uri= 1, . . . , m:
hi:Nk→Nprimitiv rekursiv sind, dann ist auchf mit
f(x1, . . . , xk) =g(h1(x1, . . . , xk), . . . , hm(x1, . . . , xk))primitiv rekursiv.
Primitive Rekursion: Wenng:Nk−1→Nundh:Nk+1→Nprimitiv rekursiv, dann ist auchf mit
f(x1, . . . , xk) =
g(x2, . . . , xk), wennx1= 0
h(f(x1−1, x2, . . . , xk), x1−1, x2, . . . , xk),sonst primitiv rekursiv.
Konstruktionen
Komponenten eines Tupels entfernen / vertauschen / vervielfachen Wenng:N4 →Nprimitiv rekursiv, dann ist auchf :N3→N mit
f(n1, n2, n3) =g(n2, n3, n3, n2), denn:
f(n1, n2, n3) =g(π32(n1, n2, n3), π33(n1, n2, n3), π33(n1, n2, n3), π23(n1, n2, n3))
Konstruktionen (2)
Rekursion durch das i. Argument F¨ur1≤i≤kkann man
f(x1, . . . , xk) =
g(x1, . . . , xi−1, xi+1, xk),fallsxi= 0
h(f(x1, . . . , xi−1, xi−1, xi+1, . . . , xk), x1, . . . ,
xi−1, xi−1, xi+1, . . . , xk),sonst durchf(x1, . . . , xk) =f0(xi, x1. . . , xi−1, xi+1, . . . , xk)darstellen, wobei
f0(x1, . . . , xk) =
g0(x2, . . . , xk),fallsx1= 0
h0(f0(x1−1, x2. . . , xk), x1−1, x2, . . . , xk),sonst g0(x1, . . . , xk−1) = g(x2, . . . , xi, x1, xi+1, . . . , xk)
h0(x1, . . . , xk+1) = h(x1, x2, . . . , xi, x1−1, xi+1, . . . , xk)
Beispiele (1)
Additionsfunktion
add(x1, x2) =x1+x2 ist primitiv rekursiv:
add(x1, x2) =
x2, fallsx1= 0
succ(add(x1−1, x2)), sonst Bemerkung:
Die verwendeten Funktioneng und h aus der Definition der primitiv rekursiven Funktionen sind hier:
g=π11
h(x1, x2, x3) =succ(π13(x1, x2, x3))
Beispiele (2)
Multiplikationsfunktion
mult(x1, x2) =
0, fallsx1= 0
add(mult(x1−1, x2), x2), sonst Idee:x1-malx2 zu0 addieren:
Beispiele (3)
Differenz
Allgemeinx1−x2 nicht primitiv rekursiv, undefinierter Fall x1 < x2 nicht darstellbar.
Angepasste Differenz
liefert0falls x1 < x2, ist primitiv rekursiv:
sub(x1, x2) =
x1, falls x2 = 0
pred(sub(x1, x2−1)) sonst wobei
pred(x1) =
0, falls x1 = 0 x1−1, sonst
N¨ achstes Ziel
Wir wollen zeigen:
Primitiv rekursive Funktionen sind genau die LOOP-berechenbaren Funktionen
Ben¨otigt:
Darstellung der Variablenbelegung ρ alseine einzige Zahl, um sie der primitiv rekursiven Funktion als Argument zu
¨
ubergeben.
D.h. eindeutige Darstellung eines Tupels nat¨urlicher Zahlen als eine einzige Zahl.
Operationen zum Konvertieren in beide Richtungen Eine solches Verfahren nennt man auch
”G¨odelisierung“
(nach Kurt G¨odel)
G¨ odelisierung (1)
Tupel von nat¨urlichen Zahlen(x0, . . . , xk) bijektiv in die nat¨urlichen Zahlen abbilden
F¨ur festes k
mit primitiv rekursivenFunktionen c(x, y) =
x+y+ 1 2
+x Werte vonc(x, y) f¨ur x, y∈ {0, . . . ,5}:
y\x 0 1 2 3 4 5
0 0 1 3 6 10 15
1 2 4 7 11 16 22
2 5 8 12 17 23 30
3 9 13 18 24 31 39
4 14 19 25 32 40 49
5 20 26 33 41 50 60
G¨ odelisierung (2)
Funktionc ist primitiv rekursiv, da 0
2
= 0 und
n+ 1 2
= n
2
+n
F¨urk+ 1-Tupel definieren wir:
hx0, . . . , xki=c(x0, c(x1, . . . , c(xk,0). . .)) Beachte:h·i ist primitiv rekursiv
(dacprimitiv rekursiv und Komposition primitiv rekursiv)
G¨ odelisierung (3)
R¨uckgewinnung der Komponenten:
Seienleft und right Funktionen mit left(c(x, y)) =x und
right(c(x, y)) =y.
Im Skript wird gezeigt:
left und right existieren
left und right sind primitiv rekursiv
G¨ odelisierung (5)
Zugriff auf beliebige Komponenten:
Programmieredi(hx0, . . . , xki) =xi durch:
d0(x) = left(x) d1(x) = left(right(x))
di(x) = left(right(right. . .right
| {z }
imal
(x). . .))
Damit sind auch diedi-Funktionen primitiv rekursiv.
Von LOOP-Programm berechnete Funktion
Sei P ein LOOP-Programm, ρ eine Variablenbelegung mit (ρ, P)−−−→
LOOP
∗ (ρ0, ε)
Seien x0, x1, . . . , xn alle vom ProgrammP verwendeten Variablen (auch solche, die nicht in ρ vorkommen) Die vonP berechnete Funktion:
gP(hx0, . . . , xni) =hx00, . . . , x0ni (wobei x0i =ρ0(xi))
LOOP-Programme berechnen primitiv rekursive Funktionen
Lemma
F¨ur jedes LOOP-Programm P ist die zugeh¨orige FunktiongP
primitiv rekursiv.
Beweis: Strukturelle Induktion ¨uber jedes TeilprogrammQund die zugeh¨orige FunktiongQ.
Basis:Q ist Zuweisungxi =xj±c.
F¨urgQ muss gelten:
gQ(hm0, . . . , mni) =hm0, . . . , mi−1, mj±c, mi, . . . , mni Primitiv rekursive Implementierung:
gQ(x) =hd0(x), . . . , di−1(x), dj(x) +c, di+1(x), . . . dn(x)i
LOOP-Programme berechnen primitiv rekursive Funktionen (2)
Induktionsschritt:
Q ist eine SequenzQ1;Q2.
Induktionshypothese: primitiv rekursive Funktionen gQ1,gQ2. Funktion gQ(x) =gQ2(gQ1(x))ist primitiv rekursiv.
Q istLOOP xi DOP END.
Induktionshypothese liefert primitiv rekursive Funktion gP. Konstruktion von gQ:xi-mal wirdgP angewendet.
gQ(x) = run(di(x), x) run(n, x) =
x, fallsn= 0
gP(run(n−1, x)) sonst
run ist primitiv rekursiv. Damit auch gQ primitiv rekursiv.
LOOP-berechenbare Funktionen sind primitiv rekursiv
Satz 11.1.6
Jede LOOP-berechenbare Funktion ist primitiv rekursiv.
Beweis:
Sei f :Nk→N LOOP-berechenbar.
Sei P LOOP-Programm mit ρ={x1 7→n1, . . . , xk7→nk}, (ρ, P)−−−→
LOOP
∗ (ρ0, ε) undρ0(x0) =f(n1, . . . , nk)
Es gilt f(n1, . . . , nk) =d0(gP(h0, n1, . . . , nk,0, . . . ,0i)).
Dah·i,d0 und gP primitiv rekursiv sind, ist auch f primitiv rekursiv.
Primitiv rekursive Funktionen sind LOOP-berechenbar
Satz 11.1.7
Jede primitiv rekursive Funktion ist LOOP-berechenbar.
Beweis: Induktion ¨uber Struktur der primitiv rekursiven Funktion:
Wenn f(x) =c,f =succ, oderf =πnk, dann gibt es auch LOOP-Programm dazu.
Wenn f(x1, . . . , xk) =h(g1(x1, . . . , xk), . . . , gn(x1, . . . , xk)):
Induktionshypothese liefert LOOP-ProgrammePh und Pg,1, . . . , Pg,n, dieh,g1,. . . ,gn berechnen.
Konstruiere Programm f¨ur f nach dem Schema:
y1 :=g1(x1, . . . , xk);. . .;yn:=gn(x1, . . . , xk);x0 :=h(y1, . . . , yn) Genauer: Pg,1, . . . , Pg,n, Ph ab¨andern, so dass sie auf
disjunkten Variablenmengen arbeiten, entsprechende Variableninhalte f¨urx1, . . . , xk verdoppeln.
. . .
Primitiv rekursive Funktionen sind LOOP-berechenbar (2)
. . .
f ist primitiv rekursiv:
f(x1, . . . , xk) =
g(x2, . . . , xk) wenn x1= 0
h(f(x1−1, x2, . . . , xk), x1−1, x2, . . . , xk) sonst wobei g:Nk−1 →Nund h:Nk+1→N primitiv rekursiv sind.
Induktionshypothese liefert LOOP-Programme, die g, h berechnen.
Konstruiere LOOP-Programm f¨ur f nach dem Schema y:= 0;
x0 :=g(x2, . . . , xk);
LOOPx1 DO y:=y+ 1;x0 :=h(x0, y, x2, . . . , xk) END
LOOP-berechenbar = primitiv rekursiv
Theorem 11.1.8
Die primitiv rekursiven Funktionen sind genau die LOOP-berechenbaren Funktionen.
µ-Operator
Definition µ-Operator
Seih:Nk+1 →Neine (partielle oder totale) Funktion. Dann ist (µh) :Nk→Ndefiniert als
(µh)(x1, . . . , xk) =
n fallsh(n, x1, . . . , xk)= 0 und f¨ur allem <n:h(m, x1, . . . , xk)ist definiert und h(m, x1, . . . , xk)>0.
undefiniert, sonst µ-Operator
”sucht“ nach einer kleinsten Nullstelle von h.
Wenn diese nicht existiert (entweder da h keine Nullstelle hat, oder da h undefiniert ist f¨ur Werte, die kleiner als die Nullstelle sind), dann ist auch der µ-Operator angewendet auf hundefiniert.
µ-rekursive Funktionen
Definition
Die Menge allerµ-rekursiven Funktionensei die kleinste Menge, so dass gilt:
Jedekonstante Funktionf(x1, . . . , xk) =c∈Nistµ-rekursiv.
DieProjektionsfunktionenπki(x1, . . . , xk) =xisindµ-rekursiv.
DieNachfolgerfunktionsucc(x) =x+ 1istµ-rekursiv.
Komposition / Einsetzung: Wenng:Nm→Nund f¨uri= 1, . . . , m:
hi:Nk→Nµ-rekursiv sind, dann ist auchf mit
f(x1, . . . , xk) =g(h1(x1, . . . , xk), . . . , hm(x1, . . . , xk))µ-rekursiv.
Rekursion: Wenng:Nk−1→Nundh:Nk+1→Nµ-rekursiv, dann ist
f(x1, . . . , xk) =
g(x2, . . . , xk), wennx1= 0
h(f(x1−1, x2, . . . , xk), x1−1, x2, . . . , xk),sonst auchµ-rekursiv.
µ-Operator: Wennh:Nk+1→Nµ-rekursiv, dann auchf =µh µ-rekursiv.
WHILE-berechenbare Funktionen sind µ-rekursiv
Satz 11.2.3
Jede WHILE-berechenbare Funktion istµ-rekursiv.
Beweis: Analog zu Satz 11.1.6 ¨uber Struktur des WHILE-ProgrammsP Neuer Fall:P ist WHILExi6= 0 DO QEND
Induktionshypothese liefertµ-rekursive Funktion gQ f¨urQ.
Konstruiere:
gP(x) = run(µ(runi)(x), x) runi(n, x) = di(run(n, x)) run(n, x) =
x, fallsn= 0
gQ(run(n−1, x)) sonst run(n, x) f¨uhrt n-malgQ aus.
µ(runi)(x) berechnet, wie oft die Schleife minimal durchlaufen werden muss, bis xi den Wert 0 hat .
Divergiert die Schleife, so istµ(runi) undefiniert undgP undefiniert.
µ-rekursive Funktionen sind WHILE-berechenbar
Satz 11.2.4
Jedeµ-rekursive Funktion ist WHILE-berechenbar.
Beweis: Analog zu Satz 11.1.7 ¨uber die Struktur der Funktion.
Neuer Fall:f =µh f¨ur eine µ-rek. Funktionh.
Induktionshypothese liefert WHILE-ProgrammPh, dash berechnet.
KonstruierePf nach dem Schema:
x0 := 0;
y:=h(0, x1, . . . , xn);
WHILE y6= 0 DO
x0:=x0+ 1;y:=h(x0, . . . , xn) END
WHILE-Schleife berechnet minimalen Wert f¨ur h(x0, . . . , xn) = 0 Wenn dieser nicht existiert, terminiert die Schleife nicht.
Entspricht der Berechnung vonµh.
WHILE-berechenbar = µ-rekursiv
Theorem 11.2.5
Dieµ-rekursiven Funktionen entsprechen genau den WHILE-berechenbaren (und damit auch den GOTO- und Turingberechenbaren) Funktionen.
Uberblick: Berechenbarkeitsformalismen ¨
WHILE-berechenbar
LOOP-berechenbar primitiv rekursiv
µ-rekursiv
Turingberechenbar GOTO-berechenbar
Theorem 11.1.8 Theorem 11.2.4
Satz 10.5.2
Theorem 10.2.4 Theorem 10.4.1
Satz 10.2.3