VL-11: Primitive Rekursion
(Berechenbarkeit und Komplexit¨ at, WS 2019) Gerhard Woeginger
WS 2019, RWTH
Organisatorisches
N¨achste Vorlesungen:
Mittwoch, Dezember 04, 10:30–12:00, Aula
Freitag, Dezember 06:Keine Vorlesung (Tag der Informatik) Mittwoch, Dezember 11, 10:30–12:00, Aula
Webseite:
https://algo.rwth-aachen.de/Lehre/WS1920/BuK/BuK.py
Wiederholung
Wdh.: LOOP versus WHILE
Die Ackermann FunktionA:N2→Nist folgendermassen definiert:
A(0,n) = n+1 f¨urn≥0
A(m+1,0) = A(m,1) f¨urm≥0 A(m+1,n+1) = A(m,A(m+1,n)) f¨urm,n≥0 Satz
Die Ackermann Funktion ist nicht LOOP-berechenbar.
Da die Ackermann Funktion (durch eine TM) berechenbar ist, folgt:
Satz
Die Menge der LOOP-berechenbaren Funktionen
bildet eineechte Teilmengeder berechenbaren Funktionen.
Wdh.: Die Berechenbarkeitslandschaft
Rekursiv aufz¨ahlbare
Probleme
H
H D
Probleme mit rekursiv aufz¨ahlbarem
Komplement H H
D rekursive
Probleme
Nicht rekursiv aufz¨ahlbare Probleme mit
nicht rekursiv aufz¨ahlbarem Komplement Htot PCP
Dioph
A(·,·) LOOP berechenbar
Douglas Hofstadter: “G¨ odel, Escher, Bach” (1979)
This book looks at the surprising points of contact between the music of Bach, the artwork of Escher, and the mathematics of G¨odel. It also looks at the prospects for computers and artificial intelligence for mimicking human thought.
BlooPis a non-Turing-complete programming language in Hofstadter’s book whose flow structure is a bounded loop. All programs in the language must terminate, and this language can only expressprimitive recursive functions.
Vorlesung VL-11
Primitiv rekursive Funktionen
Primitiv rekursive Funktionen Aquivalenz zu LOOP¨
µ-rekursive Funktionen Aquivalenz zu WHILE¨
Primitiv rekursive Funktionen
Die primitiv rekursiven Funktionen bilden eine Unterfamilie der FunktionenNk →Nmitk ≥1.
Sie sind induktiv definiert, und werden durch zweiOperationen aus den sogenanntenBasisfunktionen zusammengebaut.
Die Basisfunktionen
Die folgenden drei Funktionsmengen bilden die Basisfunktionen unter den primitiv rekursiven Funktionen:
Allekonstanten Funktionensind primitiv rekursiv.
Alle identischen Abbildungen (Projektionenauf eine der Komponenten) sind primitiv rekursiv.
Die Nachfolgerfunktionsucc(n) =n+1ist primitiv rekursiv.
Anmerkung: Die ProjektionNk →Nauf diep-te vonk Komponenten wird manchmal mitπk,p bezeichnet.
Die beiden Operationen
JedeKompositionvon primitiv rekursiven Funktionen ist primitiv rekursiv.
Wenn die Funktiong:Nk →Nprimitiv rekursiv ist und
wenn die k Funktionen h1, . . . ,hk :N` →Nprimitiv rekursiv sind, so ist auch die folgende Funktion f :N`→Nprimitiv rekursiv:
f(x1, . . . ,x`) = g(h1(x1, . . . ,x`), . . . ,hk(x1, . . . ,x`))
Jede Funktion, die durchprimitive Rekursionaus primitiv rekursiven Funktionen entsteht ist primitiv rekursiv.
Wenn die beiden Funktionen g:Nk →Nundh:Nk+2→N primitiv rekursiv sind, so ist auch f :Nk+1→Nprimitiv rekursiv:
f(0,x1, . . . ,xk) = g(x1, . . . ,xk)
f(n+1,x1, . . . ,xk) = h(n, f(n,x1, . . . ,xk), x1, . . . ,xk)
Intuition zu primitiv rekursiven Funktionen
Beobachtung:Jede primitiv rekursive Funktion ist berechenbar und total.
Klar f¨ur Basisfunktionen. Und die Komposition von berechenbaren und totalen Funktionen ist ebenfalls berechenbar und total.
Angenommen, die beiden Funktioneng:Nk →Nundh:Nk+2→N sind berechenbar. Dann berechnen wir der Reihe nach:
y0 := g(x1, . . . ,xk) = f(0,x1, . . . ,xk)
y1 := h(0,y0, x1, . . . ,xk) = f(1,x1, . . . ,xk) y2 := h(1,y1, x1, . . . ,xk) = f(2,x1, . . . ,xk) y3 := h(2,y2, x1, . . . ,xk) = f(3,x1, . . . ,xk)
... ...
yn := h(n−1,yn−1, x1, . . . ,xk) = f(n,x1, . . . ,xk) Damit haben wir dann auchf(n,x1, . . . ,xk) =ynberechnet.
Primitiv rekursive Beispiele
Beispiel: Addition
Die Additionsfunktionadd:N2→Nmitadd(x,y) =x+y ist primitiv rekursiv.
add(0,x) = x
add(n+1,x) = succ(add(n,x))
Genauer:Die Additionsfunktion add:N2→Nentsteht durch primitive Rekursion aus der Projektiong(x) =π1,1(x) =x und aus der primitiv rekursiven Funktionh(a,b,c) =succ(π3,2(a,b,c)):
add(0,x) = g(x)
add(n+1,x) = h(n,add(n,x),x)
Beispiel: Multiplikation
Die Multiplikationsfunktionmult:N2→Nmitmult(x,y) =x·y ist primitiv rekursiv.
mult(0,x) = 0
mult(n+1,x) = add(mult(n,x),x)
Genauer:Die Multiplikationsfunktion mult:N2→Nentsteht durch primitive Rekursion aus der konstanten Abbildungg(x) =0und aus der primitiv rekursiven Funktionh(a,b,c) =add(π3,2(a,b,c), π3,3(a,b,c)):
mult(0,x) = g(x)
mult(n+1,x) = h(n,mult(n,x),x)
Beispiel: Vorg¨ anger
Die Vorg¨angerfunktionpred:N→Nmitpred(x) =max{x−1,0} ist primitiv rekursiv.
pred(0) = 0 pred(n+1) = n
Genauer:Die Vorg¨angerfunktionpred:N→Nentsteht durch primitive Rekursion aus der konstanten Abbildungg() =0und aus der Projektion h(a,b) =π2,1(a,b) =a:
pred(0) = g()
pred(n+1) = h(n,pred(n))
Beispiel: Subtraktion
Die (modifizierte) Subtraktionsfunktionsub:N2→Nmit sub(x,y) =x−. y =max{x−y,0}ist primitiv rekursiv.
Da die zugrunde liegende primitive Rekursion ¨uber die erste Komponente l¨auft, definieren wir zun¨achst die HilfsfunktionsubAux(y,x) =x−. y.
subAux(0,x) = x
subAux(n+1,x) = pred(subAux(n,x))
Genauer:Die HilfsfunktionsubAux:N2→Nentsteht aus der Projektiong(x) =π1,1(x) =x und aus der primitiv rekursiven Funktionh(a,b,c) =pred(π3,2(a,b,c)):
subAux(0,x) = g(x)
subAux(n+1,x) = h(n,subAux(n,x),x)
Danach definieren wir sub(x,y) =subAux(π2,2(x,y), π2,1(x,y)).
Weitere primitiv rekursive Beispiele (1)
Notation: F¨ur ein logischesPr¨adikatverwenden wir die Schreibweise[Pr¨adikat], wobei
[Pr¨adikat] =0fallsPr¨adikatden Wahrheitswertfalschhat, und [Pr¨adikat] =1fallsPr¨adikatden Wahrheitswertwahr hat.
Ubung¨
Die folgenden Funktionen sind primitiv rekursiv:
Signum:f :N→ {0,1}mitf(x) = [x ≥1]
Gleichheit:f :N2→ {0,1} mitf(x,y) = [x=y]
Kleiner: f :N2→ {0,1}mitf(x,y) = [x <y] Gr¨osser:f :N2→ {0,1}mitf(x,y) = [x>y] Kleiner-gleich:f :N2→ {0,1} mitf(x,y) = [x≤y]
Gr¨osser-gleich:f :N2→ {0,1}mitf(x,y) = [x ≥y]
Weitere primitiv rekursive Beispiele (2)
Ubung¨
Die folgenden Funktionen sind primitiv rekursiv:
Maximum:f :N2→Nmitf(x,y) =max{x,y}
Minimum:f :N2→Nmitf(x,y) =min{x,y} Division:f :N2→Nmitf(x,y) =bx/yc Teilbarkeit: f :N2→ {0,1}mitf(x,y) = [x|y] Parit¨at:f :N→ {0,1}mitf(x) = [x gerade]
Parit¨at:f :N→ {0,1}mitf(x) = [x ungerade]
Primzahl:f :N→ {0,1}mitf(x) = [x prim]
Ein wichtiges Werkzeug:
Primitiv rekursive Bijektionen
Eine Bijektion (1)
Die Funktionbinom2:N→Nmit binom2(x) =
x 2
= 1
2x(x−1) = 0+1+2+· · ·+ (x−1)
ist primitiv rekursiv.
binom2(0) = 0
binom2(n+1) = add(n,binom2(n))
Die Funktionβ:N2→Nmit
β(x,y) =
x+y+1 2
+x ist primitiv rekursiv.
Eine Bijektion (2)
Beobachtung (und Hausaufgabe am 3. ¨Ubungsblatt) Die Funktionβ(x,y) = x+y+12
+x ist eine Bijektion zwischenN2undN.
x/y 0 1 2 3 4 5 6 · · ·
0 0 1 3 6 10 15 21 · · ·
1 2 4 7 11 16 22 29 · · ·
2 5 8 12 17 23 30 38 · · ·
3 9 13 18 24 31 39 48 · · ·
4 14 19 25 32 40 49 59 · · ·
5 20 26 33 41 50 60 71 · · ·
6 27 34 42 51 61 72 84 · · ·
7 35 43 52 62 73 85 98 · · ·
Die Umkehrfunktion der Bijektion (1)
Ubung¨
Beweisen Sie: F¨ur allex,y ∈Ngilt x≤β(x,y) und y≤β(x,y).
Als n¨achstes Ziel wollen wir nun f¨ur eine gegebene Zahlndie entsprechende (eindeutig festgelegte) Zahlx ∈Nin der Gleichung β(x,y) =nbestimmen.
Triviale M¨oglichkeit: Teste alle Paare(x,y)∈N2.
Kl¨ugere M¨oglichkeit: Teste alle Paare(x,y)∈ {0,1, . . . ,n}2.
Die Umkehrfunktion der Bijektion (2)
Die Funktion f :N3→ {0,1}mitf(x,y,n) = [β(x,y) =n]ist primitiv rekursiv.
Die Funktion g:N3→ {0,1} mit
g(x,k,n) = [∃y≤k :β(x,y) =n]ist primitiv rekursiv:
g(x,0,n) = f(x,0,n)
g(x,k,n) = [f(x,k,n) =1 ∨ g(x,k−1,n) =1]
Wir definierenmax∅=0. Die Funktionh:N3→Nmit h(m,k,n) =max{x≤m:∃y ≤k:β(x,y) =n} ist primitiv rekursiv:
h(0,k,n) = 0
h(m,k,n) = max{h(m−1,k,n), m·g(m,k,n)}
Die Umkehrfunktion der Bijektion (3)
Daraus folgt sofort:
Die Funktionγ:N→Nmitγ(n) =h(n,n,n)ist primitiv rekursiv Also:γ(n) =h(n,n,n)ist die gr¨osste Zahl x≤n, f¨ur die eine Zahl y ≤nexistiert, sodassβ(x,y) =ngilt.
F¨ur jedes n∈Ngibt es ein einziges Zahlenpaar(x,y)∈N2 mit β(x,y) =n. Die Funktionγ(n)gibt uns daher die (eindeutig bestimmte) Zahlx in dieser Gleichung an.
Analog: Es gibt eine primitiv rekursive Funktionδ(n), die die (eindeutig bestimmte) Zahly in der Gleichungβ(x,y) =nangibt.
Zusammenfassend:
Die Umkehrfunktionenγ undδder Bijektionβ sind primitiv rekursiv.
F¨ur allen∈Ngilt β(γ(n), δ(n)) =n.
Weitere Bijektionen
Aus der Bijektionβ:N2→Nkann man weitere Bijektionen zwischen Nk+1 undNbauen: Dieprimitiv rekursiveFunktion
β(n0, β(n1, β(n2, . . . , β(nk−1,nk). . .))
weist jedem(k+1)-Tupel(n0,n1, . . . ,nk)eine entsprechende Zahl inN zu, die wir im Folgenden mithn0,n1, . . . ,nkibezeichnen.
Mit Hilfe der beiden Funktionenγ(n)undδ(n)kann man dann weitere primitiv rekursiveFunktionen u0,u1, . . . ,uk :N→Nkonstruieren, sodass f¨ur allen∈Ndie folgende Beziehung gilt:
n = hu0(n), u1(n), . . . ,uk(n)i
Aquivalenz zu LOOP Programmen ¨
Aquivalenz zu LOOP Programmen ¨
Satz
Die Menge derprimitiv rekursivenFunktionen f¨allt
mit der Menge der LOOP-berechenbarenFunktionen zusammen.
Hinrichtung:
LOOP → Primitiv rekursiv
LOOP → Primitiv rekursiv: Hauptidee
Wir betrachten eine LOOP-berechenbare Funktionf, die von einem LOOP Programm P berechnet wird.
Die im ProgrammP verwendeten Variablen seienx0,x1, . . . ,xk.
Wir beweisen mit Induktion ¨uber den Aufbau vonP, dass eine primitiv rekursive FunktiongP :N→Nexistiert, die die Arbeitsweise vonP simuliert:
Wenn das ProgrammP die Anfangswerte a0,a1, . . . ,ak der Variablen in die Endwerteb0,b1, . . . ,bk ¨ubersetzt, dann gilt entsprechend
gP(ha0,a1, . . . ,aki) =hb0,b1, . . . ,bki
LOOP → Primitiv rekursiv (1)
Zuweisungen
FallsP aus der Zuweisungxi:=xj+c besteht, so ist
gP(x) =hu0(x), . . . ,ui−1(x),uj(x) +c,ui+1(x), . . . , uk(x)i
LOOP → Primitiv rekursiv (2)
Hintereinanderausf¨uhrung
FallsP die FormQ;R hat, so gilt gP(x) =gR(gQ(x) )
LOOP → Primitiv rekursiv (3)
LOOP-Konstrukt
Angenommen,P ist ein LOOP Programm von der Form LOOPxi DOQ ENDLOOP
Wir definieren zun¨achst die (primitiv rekursive) Hilfsfunktion h:N2→Nmit
h(0,x) = x
h(n+1,x) = gQ(h(n,x)).
Der Aufrufh(n,x)wendet das ProgrammQ genaun-mal hintereinander auf die Eingabex an.
Da der Wert xi am Anfang der Schleife durchui(x)gegeben ist, gilt gP(x) =h(ui(x),x)
LOOP → Primitiv rekursiv: Schluss
Schlussendlich geben wir Anfang und Ende der Simulation an:
Start des LOOP Programms
Die Eingabe ist in den Variablenx1, . . . ,xm enthalten.
Alle anderen Variablen werden mit0initialisiert.
Wenn diem Eingabevariablen die Wertex10, . . . ,xm0 haben, so ist der Eingabewert f¨ur die primitiv rekursive Simulation
x = h0, x10,x20, . . . ,xm0 , 0,0, . . . ,0
| {z }
k−m
i
Terminieren des LOOP Programms
Das Resultat ist die Zahl, die sich am Ende in der Variablenx0 ergibt.
Das Resultat des LOOP ProgramsP ergibt sich als u0 gP(h0, x10,x20, . . . ,xm0, 0,0, . . . ,0i)
.
R¨ uckrichtung:
Primitiv rekursiv → LOOP
Primitiv rekursiv → LOOP: Hauptidee
Wir betrachten eine primitiv rekursive Funktion f :Nk →N Wir beweisen mit Induktion ¨uber die Definition vonf, dass ein LOOP ProgrammPf existiert, das die Auswertung vonf simuliert Das ProgrammPf nimmt die Variablenwertex1, . . . ,xk als Eingabe und terminiert mit x0=f(x1, . . . ,xk).
Primitiv rekursiv → LOOP (1)
Basisfunktionen
Die konstante Funktionf(x1, . . . ,xk) =c wird durch das LOOP Programx0:=c simuliert.
Die Projektionf(x1, . . . ,xk) =xj wird durch das LOOP Programx0:=xj simuliert.
Die Nachfolgerfunktionsucc(xj) =xj+1wird durch das LOOP Programx0:=xj+1simuliert.
Primitiv rekursiv → LOOP (2)
Komposition
Falls die primitiv rekursive Funktionf durch Komposition aus anderen primitiv rekursiven Funktionenf1, . . . ,fs entsteht,
so wird f simuliert, indem man die LOOP Programme f¨urf1, . . . ,fs geeignet hintereinander ausf¨uhrt.
Anmerkung:Zwischenergebnissekann sich die Simulation f¨ur sp¨ater merken, indem sie sie in separaten Variablen bis zur Wiederverwendung zwischenspeichert.
Primitiv rekursiv → LOOP (3)
Primitive Rekursion
Angenommen, die Funktionf :Nk+1→Nentsteht durch primitive Rekursion aus den beiden primitiv rekursiven Funktioneng:Nk →Nund h:Nk+2→N, wobei
f(0,x1, . . . ,xk) = g(x1, . . . ,xk)
f(n+1,x1, . . . ,xk) = h(n, f(n,x1, . . . ,xk), x1, . . . ,xk)
Das simulierende LOOP ProgrammPf sieht dann wie folgt aus:
x0:=g(x1, . . . ,xk);
s :=0;
LOOPnDO
x0:=h(s,x0, x1, . . . ,xk);
s:=s+1;
ENDLOOP;
µ-rekursive Funktionen
Der Kleene’sche µ-Operator
Wir definieren min∅=⊥.
Definition
Es seig:Nk+1→N∪ {⊥}eine (partielle oder totale) Funktion mitk+1 Argumenten (k ≥1). Durch Anwendung desµ-Operatorsaufgentsteht eine neue Funktionf :Nk →N∪ {⊥}mitk Argumenten, wobei
f(x1, . . . ,xk) =min{n|g(n,x1, . . . ,xk) =0 und
f¨ur allem<ngiltg(m,x1, . . . ,xk)6=⊥}.
Die entstehende Funktionf wird mitµg:Nk →N∪ {⊥}bezeichnet.
Anmerkung: Derµ–Operator arbeitet immer mit der ersten Komponente.
Beispiele
Beispiel
Es seig:N4→Nmit g(x,a,b,c) = (x−a)2(x−b)2(x−c)2. Dann ist(µg)(a,b,c)die kleinste Zahlx ∈Nmitg(x,a,b,c) =0.
Daraus ergibt sich(µg)(a,b,c) =min{a,b,c}.
Beispiel
Es seig:N2→Nmit g(x,y)≡1.
Dann ist(µg)(y)die kleinste Zahlx ∈Nmit g(x,y) =0.
Daraus ergibt sich(µg)(y)≡ ⊥.
µ-rekursive Funktionen
Definition
Die Klasse derµ-rekursiven Funktionen ist die kleinste Klasse von (partiellen und totalen) Funktionen,
die die Basisfunktionen (konstante Funktionen; Projektionen;
Nachfolgerfunktion) enth¨alt und
die abgeschlossen ist unter (1) Komposition, (2) primitiver Rekursion und (3) Anwendung des µ-Operators.
Anmerkung: Wenn eines der Argumente vonf(x1, . . . ,xk)den Wert⊥ annimmt, so f¨uhrt das zum Funktionswert f(x1, . . . ,xk) =⊥.
Stephen Kleene (1909–1994)
Wikipedia:Stephen Cole Kleenewas a student of Alonzo Church.
Kleene is best known as the founder of recursion theory, which
subsequently helped to provide the foundations of theoretical computer science.
Kleene’s work grounds the study of computable functions. A number of mathematical concepts are named after him: Kleene hierarchy, Kleene algebra, the Kleene star (Kleene closure), Kleene’s recursion theorem, and the Kleene fixpoint theorem. He also invented regular expressions, and made significant contributions to the
foundations of mathematical intuitionism.
Aquivalenz zu WHILE Programmen ¨
Aquivalenz zu WHILE Programmen ¨
Satz
Die Menge derµ-rekursivenFunktionen f¨allt
mit der Menge der WHILE-berechenbaren(Turing-berechenbaren;
RAM-berechenbaren) Funktionen zusammen.
Der Beweis dieses Satz basiert auf dem Beweis unseres letzten Satzes (primitiv rekursiv ⇔LOOP-berechenbar), und bildet eine einfache Erweiterung
In der Hinrichtung zeigen wir, dass WHILE Schleifen mit Hilfe des µ-Operators simuliert werden k¨onnen
In der R¨uckrichtung zeigen wir, dass derµ-Operator durch eine WHILE Schleife simuliert werden kann
Hinrichtung: WHILE → µ-rekursiv
Simulation eines WHILE ProgrammsP WHILExi6=0 DOQ ENDWHILE
Wir recyclen die Hilfsfunktion h:N2→N, die durch den Aufruf h(n,x)das Programm Qgenau n-mal aufx anwendet:
h(0,x) = x
h(n+1,x) = gQ(h(n,x)).
Die Funktion uih:N2→Ngibt den Wertuih(n,x) =ui(h(n,x))der Variablenxi nachn-maliger Anwendung vonQ an.
Die Funktion µ(uih) :N→Ngibt die kleinste Zahln=µ(uih)(x) an, f¨ur diexi nachn-maliger Anwendung vonQ den Wert0hat.
Daher wird das WHILE ProgrammP simuliert durch gP(x) =h(µ(uih)(x), x)
R¨ uckrichtung: µ-rekursiv → WHILE
Simulation desµ-Operators
Angenommen, die Funktionf :Nk →Nentsteht durch den µ-Operator aus derµ-rekursiven Funktiong:Nk+1→N, also f =µg.
Das simulierende WHILE ProgrammPf sieht dann wie folgt aus:
x0:=0;
y :=g(0,x1, . . . ,xk);
WHILEy 6=0 DO x0:=x0+1;
y:=g(x0, x1, . . . ,xk);
ENDLOOP;
Landschaftsbild
TM = RAM = WHILE =µ-rekursiv
LOOP = primitiv rekursiv + − × ab ab kn
A(m,n)
Ackermann Funktion