Im -calculus, wir können Arithmetik, Zahlen, Boolesche Werte codieren und sogar Fakultäten von Zahlen berechnen, wie hier gezeigt .
Gibt es eine Kodierung von "für" oder "während"?
Im -calculus, wir können Arithmetik, Zahlen, Boolesche Werte codieren und sogar Fakultäten von Zahlen berechnen, wie hier gezeigt .
Gibt es eine Kodierung von "für" oder "während"?
Antworten:
Sicher! Lassen Sie mich anhand eines Beispiels zeigen, wie FOR codiert wird.
Angenommen, wir möchten ein einfaches faktorielles FOR-Programm übersetzen
x := 1
for i := 1 to N do
x := x * i
Wir schreiben es um als
x := 1
i := 1
repeat N times
x := x*i
i := i+1
dann setzen wir alle Variablen, die wir verwenden, in ein Tupel (hier genügt ein Paar)
(x,i) := (1,1)
repeat N times
(x,i) := (x*i, i+1)
Dies wendet die Funktion effektiv an zum ersten Paar zum mal.
Schon seit kann als Kirchenzahl dargestellt werden, bekommen wir
Die obige Syntax verwendet einige Dinge, die über den einfachen Lambda-Kalkül hinausgehen. Zahlen und Arithmetik können mit Kirchenzahlen präzisiert werden. Paare haben auch eine eigene Kirchencodierung:
Wenn Sie mehr als zwei Variablen haben, können Sie die obige Codierung auf Tupel verallgemeinern oder Tupel einfach als verschachtelte Paare darstellen.
WÄHREND die Rekursion am besten behandelt wird: statt
while p(x,i) do
(x,i) := f(x,i)
Wo p
ein Prädikat und f
eine (Teil-) Funktion ist, können wir so etwas verwenden
def recFun(x,i):
if p(x,i):
return recFun(f(x,i))
else:
return (x,i)
In der Lambda-Rechnung wird die Rekursion unter Verwendung eines Festpunktkombinators , z. B. der Kirche, erhalten oder Turings . Wir bekommen so etwas wie
wo vorausgesetzt, Boolesche Werte sind kirchenkodiert.
Beachten Sie auch, dass WHILE (streng) leistungsfähiger als FOR ist. Jedes FOR kann als WHILE codiert werden, sodass diese Codierungstechnik auch für FOR verwendet werden kann.
Es gibt Codierungen von Schleifen, aber sie funktionieren nicht genau wie die Schleifen, die Sie gewohnt sind, da der Lambda-Kalkül keine zwingende Sprache ist. Der Lambda-Kalkül hat keine Nebenwirkungen (es ist eine rein funktionale Sprache), daher wäre das genaue Äquivalent einer Schleife nutzlos.
Ein imperatives Programm kann in eine rein funktionale Sprache übersetzt werden, indem der gesamte Status explizit als Variable im Programm weitergegeben wird. Ich werde die Python-Syntax für den imperativen Pseudocode verwenden. Es sollte größtenteils transparent sein, mit der Angabe, (a, b) = f(…)
dass der Aufruf der Funktion f
ein Paar zurückgibt a
und b
der ersten bzw. zweiten Komponente des Paares zugewiesen wird. Betrachten Sie eine Schleife
while test_condition():
do_stuff()
Lassen Sie uns den Zustand explizit machen.
state = initial_state
(state, cond) = test_condition(state)
while cond:
(state, cond) = test_condition(do_stuff(state))
Wir können dies in einen rekursiven Aufruf übersetzen. def loop(state):
definiert eine aufgerufene Funktion loop
.
def loop(state):
(state, cond) = test_condition(state)
if cond: return loop(do_stuff(state))
else: return state
state = loop(initial_state)
Hierbei werden nur die folgenden Konzepte verwendet, die alle im Lambda-Kalkül leicht ausgedrückt werden können:
Und so können wir eine while
Funktion für eine Bedingung definieren( test_condition
) und ein Körper( do_stuff
):
For-Schleifen variieren je nach Programmiersprache, sind jedoch immer ein Sonderfall von while-Schleifen, sodass sie auf die gleiche Weise codiert werden können. Wenn die Ausgangssprache die Ausdruckskraft von for-Schleifen einschränkt, kann es zu einfacheren Codierungen kommen. Zum Beispiel „Wiederholen times ”ist einfach Funktionszusammensetzung Zeiten, in denen die Funktion die Zustandstransformation ist, die den Körper der Schleife bildet, und wenn ist eine kirchliche Ziffer, die einfach zutrifft selbst auf die Schleifenkörperfunktion.
Ein alternativer Ansatz für den Zustand besteht darin, den Lambda-Kalkül mit Grundelementen zur Zustandsmanipulation zu erweitern. Wenn Sie dies tun, wird die Reihenfolge der Bewertung wichtig. In diesem Fall kann eine while-Schleife direkt mit Rekursion ausgedrückt werden.