Ich benutze die Haskell Konvention von Schreiben & Lambda; als \
.
Aus den Kommentaren sieht es aus wie Sie sind speziell mit diesem Teil Schwierigkeiten mit:
eq = \a b. a b (b (\x y. y) (\x y. x))
Also werde ich auf diese konzentrieren sich nur.
Unsere Codierung von Booleans ist als Funktionen, die zwei Argumente nehmen. True
gibt das erste Argument zurück, False
gibt das zweite Argument zurück. Der erste Absatz gibt die Codierung direkt:
True = \x y. x
False = \x y. y
Wir werden die Namen anstelle der Lambda-Ausdrücke, bis zum Ende.
Wir wissen, dass zwei Argumente, die zwei booleans zu vergleichen sind.(Die Codierung von booleans selbst nimmt zwei Argumente, aber das ist anders - eq
zwei Argumente nehmen soll, egal wie booleans codiert werden), so wissen wir, es sollte wie folgt aussehen:
eq = \a b. _________________
An dieser Stelle so ziemlich die einzige Was wir tun können, ist eines der Argumente zu überprüfen, ob es True
oder False
ist. ist symmetrisch, so dass es nicht wirklich wichtig ist, nach welchem wir fragen; Lassen Sie uns a
ohne Grund wählen. Die Art, wie wir nach der Codierung fragen, besteht darin, zwei Argumente an die Sache zu übergeben, die wir herausfinden wollen.
eq = \a b. a ____ ____
Wo haben wir noch nicht herausgefunden, was in den "Löchern" noch geht. Das erste Loch wird zurückgegeben, wenn a
True
ist, das zweite ist, was zurückgegeben wird, wenn es False
wird.
Um herauszufinden, wie diese Löcher zu füllen, lassen Sie uns die Wahrheitstabelle für schreiben, was wir versuchen zu definieren:
a | b | eq a b
------+-------+---------
True | True | True
True | False | False
False | True | False
False | False | True
Beachten Sie, dass an den beiden Zeilen, in denen a
True
ist, die a == b
Spalte das ist genau wie die b
Spalte. Wenn also a
True
ist, geben wir einfach b
zurück. So können wir in einem der Löcher füllen:
eq = \a b. a b ____
nun in der Tabelle feststellen, dass, wenn a
False
ist, a == b
ist das Gegenteil der b
Säule, so dass in diesem Fall wir b
umkehren sollte, und es zurückgeben.
Um b
zu invertieren, wollen wir, dass es False
ist, wenn b
True
ist und umgekehrt. Bei der Codierung, das heißt:
b False True
Und das ist, was wir zurückkommen sollen, wenn a
False
ist, so füllen wir in dem anderen Loch:
eq = \a b. a b (b False True)
Jetzt nur entrollen wir die Definitionen von False
und True
eq = \a b. a b (b (\x y. y) (\x y. x))
Und da haben Sie es.
Schauen Sie sich den Wikipedia-Artikel [Church boolean] (https://en.wikipedia.org/wiki/Church_encoding#Church_Booleans) an. – Alec
@ Alec Ich habe es überprüft, aber ich verstehe nicht, wie sie diesen Ausdruck ableiten. –