4.1 Primitive Rekursion. Motivation und Definition
Primitive Rekursion ist ein Versuch, Berechbarkeit von Funktionen
Sind diese Funktionen "offensichtlich berechenbar"? Ich würde sagen, die fundamentale Eigenschaft
der natürlichen Zahlen ist, dass jede Zahl einen Nachfolger (successor) hat; daher ist irgendwie
klar, dass
Eine weitere Klasse von "offensichtlich" berechenbaren Funktionen sind die sogenannten
Projektionen
Um aber komplexere Operationen implementieren zu können, brauchen wir eine Art von Schleife. Was ist die einfachste Art von Schleife oder Rekursion. Wir dürfen nur eine sehr beschränkte Form der Rekursion verwenden:
Wenn Sie Rekursionshasser sind, dann können Sie sich es als Funktion mit einer
for
-Schleife
vorstellen, in der nur eine lokale Variable erlaubt ist:
Die Forderung, dass man nur eine lokale Variable durch die Schleife führen darf, scheint sehr restriktiv; es ist aber wohl die einfachste Form einer Schleife, die wirklich etwas "schleifenhaftes" tut.def PrimRec(g, h):
def f(t,*x):
temp = g(*x)
for i in range(t):
temp = h(temp, i, *x)
return temp
return f
Proj(k)
: erzeugt die FunktionComp(f, g0, g1, ...)
: erzeugt die Funktion Sie als User müssen sicherstellen, dass die Stelligkeit von mit der Anzahl der als übergebenen Funktionen übereinstimmt.-
PrimRec(g,h)
: erzeugt die Funktion
Wenn wir die primitive Rekursion als "Programmiersprache" betrachten, dann heißt das, dass
wir
neue Funktionen bauen dürfen, indem wir zero,succ,Proj,Comp,PrimRec
verwenden,
aber nicht selbst Python-Funktionen schreiben. Wir dürfen also nie selbst Integers in die
Hand nehmen.
Lassen Sie mich das am Beispiel der Addition erklären. Ich will eine Funktion
def add(x,y):
return x + y
schreiben, denn unsere "Programmiersprache" ist Primitive Rekursion, nicht Python! Wir
müssen uns add
aus den Kombinatoren zusammenbasteln. Ich schreibe
nun
Wir sehen also, dass dies eine Anwendung der primitiven Rekursion ist mit
p0 = Proj(0)
add = PrimRec (p0, Comp(succ,p0))
add = PrimRec (p0, Comp(succ,p0))
implementiert habe:
Tip: Für exp und minus ist es einfacher, die Argumente "umgedreht" zu
betrachten,
also
Experimentieren Sie weiter und implementieren Sie "Boolesche" Prädikate und Funktionen wie
isPositive
greaterThan, lessThan, greaterEqual, lessEqual
max, min
ifThenElse(x,y,z)
: dies soll zurückliefern, falls (alsofalse
) ist, und sonst.