/ / Wie modelliere ich Bedingungen mit erstklassigen Funktionen? - Haskell, Lambda-Kalkül

Wie modelliert man Conditionals mit erstklassigen Funktionen? - Haskell, Lambda-Kalkül

Da Sprachen mit rekursiv erstklassigFunktionen sind Turing-komplett, sie sollten in der Lage sein, alles auszudrücken, was in einer anderen Programmiersprache ausgedrückt werden kann. Daher sollte es möglich sein, bedingte Ausdrücke (d. H. If-Anweisungen) mit erstklassigen Funktionen zu modellieren. Könnte jemand veranschaulichen, wie das geht?

Antworten:

6 für die Antwort № 1

Das Übliche Codierung der Booleschen, aufgrund der Kirche, ist

$$ {sf true} = Lambda x. Lambda y. x qquad {sf false} = Lambda x. Lambda y. y $$

In etwa ist "true" die Funktion, die zwei Argumente $ x, y $ akzeptiert (zuerst $ x $, dann auch $ y $) und das erste zurückgibt. Stattdessen gibt "false" den zweiten zurück.

If-then-else wird dann codiert, indem ein codierter Boolescher Wert auf die Zweige "then" und "else" angewendet wird. Auf diese Weise wählt der Boolesche Wert den richtigen Wert für die Rückgabe aus.

$$ {sf wenn} b {sf dann} t {sf sonst} e = b, t, e $$

Es ist dann einfach, die sogenannten "$ beta $" -Gesetze zu überprüfen:

$$ {sf wenn wahr dann} t {sf sonst} e = {sf true}, t, e = (Lambda x · Lambda y · x), t, e = (Lambda y.t), e = t $$

und

$$ {sf wenn falsch dann} t {sf sonst} e = {sf false}, t, e = (lambda x lambda y y), t, e = (Lambda y.y), e = e $$

Im Wesentlichen legen diese Gesetze fest, was passiert, wenn Sie einen Booleschen Wert "konstruieren" (unter Verwendung der Konstanten $ sf true, false $) und ihn später "zerstören" (unter Verwendung in einem $ sf if then else $).

Mit diesen Funktionen können Codierungen für alle gängigen Datentypen wie Naturals, Paare, Varianten, Listen, Bäume usw. geschrieben werden.