Eingabe und Ausgabe als Kirchenzahlen .
00000000 01011111 01100101 11101101 0
Im Lambda-Kalkül ist es λ m . λ n . λ f . λ x . m f ( n f x ).
De Bruijn-Index : λ λ λ 4 2 (3 2 1)
Die Lambda-Rechnung ist eine prägnante Methode zur Beschreibung einer Abbildung (Funktion).
Zum Beispiel kann diese Aufgabe als λ x geschrieben werden . λ y . x + y
Zu beachten ist, dass dies kein Lambda (Funktion) ist, das zwei Argumente akzeptiert. Dies ist eigentlich ein verschachtelter Lambda. Es verhält sich jedoch wie ein Lambda, das zwei Argumente akzeptiert, sodass es informell als solches beschrieben werden kann. Jedes Lambda enthält formal nur ein Argument.
Wenn wir zum Beispiel dieses Lambda auf 3 und 4 anwenden:
(& lgr; x . & lgr; y . x + y ) 3 4 ≤ (& lgr; y . 3 + y ) 4 ≤ 3 + 4 = 7
Das erste Lambda gibt also tatsächlich ein anderes Lambda zurück.
Kirchenzahlen sind eine Möglichkeit, die zusätzlichen Zeichen zu beseitigen, indem nur Lambda-Symbole und -Variablen übrig bleiben.
Jede Zahl im Kirchensystem ist tatsächlich ein Lambda, das angibt, wie oft die Funktion auf einen Gegenstand angewendet wird.
Sei die Funktion f und der Gegenstand x .
Die Zahl 1 würde also λ f entsprechen . λ x . f x , was bedeutet, dass f genau einmal auf x angewendet wird.
Die Zahl 3 wäre beispielsweise λ f . λ x . f ( f ( f x )), was bedeutet, dass f genau dreimal auf x angewendet wird.
Wenn Sie also zwei Church-Ziffern (z. B. m und n ) addieren , ist dies dasselbe wie das Anwenden von f auf x , m + n .
Wir können beobachten , dass dies die gleichen wie erste Anwendung ist f auf x , n - mal, und dann die Anwendung f auf den resultierenden Punkt m mal.
Zum Beispiel 2 würde bedeuten f(f(x))
und 3 würde bedeuten f(f(f(x)))
, so 2 + 3 sein würde f(f(f(f(f(x)))))
.
Zur Anwendung f auf x , n - mal, haben wir n f x .
Sie können m und n als Funktionen anzeigen , die informell zwei Argumente annehmen.
Dann wenden wir f erneut auf diesen resultierenden Gegenstand an, m mal: m f ( n f x ).
Dann addieren wir die Kesselplatte zurück, um λ m zu erhalten . λ n . λ f . λ x . m f ( n f x ).
Jetzt müssen wir es in den De Bruijn-Index konvertieren .
Erstens zählen wir den "relativen Abstand" zwischen jeder Variablen zur Lambda-Deklaration. Zum Beispiel hätte das m einen Abstand von 4, weil es als 4 Lambda "vor" deklariert wird. In ähnlicher Weise hätte das n einen Abstand von 3, das f hätte einen Abstand von 2 und das x hätte einen Abstand von 1.
Also schreiben wir es als diese Zwischenform: λ m . λ n . λ f . λ x . 4 2 (3 2 1)
Dann entfernen wir die Variablendeklarationen und hinterlassen: λ λ λ 4 2 (3 2 1)
Jetzt konvertieren wir es in eine binäre Lambda-Rechnung .
Die Regeln sind:
- λ wird
00
.
- m n (Gruppierung) wird
01 m n
.
- Zahlen i wird
1
i mal + 0
, zum Beispiel 4 wird 11110
.
λ λ λ λ 4 2 (3 2 1)
Λ λ λ λ 11110
110
( 1110
110
10
)
Λλλλ 11110
110
0101 111011010
Λλλλ 0101
111101100101111011010
≡ 00
00
00
00
0101
111101100101 111011010
≡ 000000000101111101100101111011010