Ich muss einige Lambda-Funktionen für & gt; , & lt; und! =
Ich habe keine Idee, wie, könnte mir bitte jemand helfen? PS: Wir haben gerade mit Lambda Calculus begonnen, also bitte keine Vorkenntnisse voraussetzen.
Vielen Dank im Voraus!
Bearbeiten - Was ich meinte, war Arithmetik in der Lambda-Kalkül
Edit 2 - Genauer: Suchen Sie nach einem Church-encoding (Lambda-Kalkül), um < , > , !=
Anmerkung des Herausgebers : Ich denke, das ist es, was das OP zu fragen versucht:
Ich versuche, die folgenden Operationen im untypisierten Lambda-Kalkül mit der Church-Codierung zu implementieren:
GT
oder >
). LT
oder <
). NE
oder !=
). Ich kann bereits Folgendes implementieren:
TRUE
oder λx.λy.x
). FALSE
oder λx.λy.y
). AND
oder λp.λq.p q p
). OR
oder λp.λq.p p q
). NOT
oder λp.λa.λb.p b a
). Wie würden Sie die Funktionen GT
, LT
und NE
im untypisierten Lambda-Kalkül schreiben?
"Eine Einführung in die funktionale Programmierung durch Lambda-Kalkül" von Greg Michaelson
Beginnend mit
Abschnitt 4.8.3. Vergleich
Es gibt eine Reihe von Möglichkeiten, die Gleichheit zwischen Zahlen zu definieren. Ein Ansatz ist zu beachten, dass der Unterschied zwischen zwei gleichen Zahlen ist Null. Aber wenn wir eine Zahl von einer kleineren Zahl subtrahieren, dann auch Nullen, also müssen wir den absoluten Unterschied zwischen ihnen finden; das Unterschied unabhängig von der Reihenfolge des Vergleichs. Um das Absolute zu finden Unterschied zwischen zwei Zahlen, addieren Sie den Unterschied zwischen dem ersten und der zweite zum Unterschied zwischen dem zweiten und dem ersten:
def abs_diff x y = addieren (sub x y) (suby x)
Wenn sie beide gleich sind, sind die absoluten Differenzen null weil das Ergebnis davon, jedes von dem anderen zu nehmen, Null ist. Wenn die zuerst ist größer als die Sekunde, dann ist die absolute Differenz der erste minus der zweite, weil der zweite minus der erste sein wird Null. In ähnlicher Weise, wenn die zweite größer ist als die erste, dann die Differenz ist die zweite minus der erste, weil das erste minus die Sekunde wird Null sein.
Somit können wir definieren:
def gleich x y = ist null (abs_diff x y)
Wir können auch Subtraktion verwenden, um arithmetische Ungleichungen zu definieren. Zum Beispiel: Eine Zahl ist größer als eine andere, wenn sie die zweite subtrahiert Von der ersten gibt ein Ergebnis ungleich Null:
def größer x y = nicht (iszero (sub x y))
Weniger ist im Abschnitt Lösungen für Übungen auf der Rückseite definiert.
def weniger x y = größer y x
Wenn Sie nun das Buch im Link verwenden, finden Sie alle untergeordneten Funktionen und Sie haben =, & gt ;, & lt ;. Während das Buch nicht definiert! = Sollte es offensichtlich sein.
BEARBEITEN
Pro Kommentar von WillNess
4.8.2. Subtraktion
Um den Unterschied zwischen zwei Zahlen zu finden, finden Sie den Unterschied zwischen den Zahlen nach dem Dekrementieren von beiden. Der Unterschied zwischen einer Zahl und Null ist die Zahl:
rec unter x y =
wenn iszero y
dann x
sonst sub (pred x) (pred y)
Bitte beachten Sie "Now using the book in the link just find all of the subordinate functions".
Ich plane nicht, alle untergeordneten Funktionen aufzuspüren und sie hier aufzulisten, weil sie hier explodieren würden, um viele Funktionen neu zu erstellen. Ich habe Teile des Buches gelesen und durchgearbeitet und es ist umfassend genug, dass mir nicht an Informationen mangelte.
Sie brauchen auch die Implementierung von natürlichen Zahlen. Dafür werden Sie Vergleichsoperatoren schreiben, nicht wahr?
Ich denke, dass ich mich an die Implementierung von natürlichen Zahlen erinnere. Eine Zahl n wird als Funktion dargestellt, die eine Funktion f und einen Wert x verwendet und f n mal auf x .
%Vor% Der Wikipedia-Artikel über die Kodierung in der Kirche enthält einen Abschnitt zu Prädikaten , der EQ
und LEQ
Tags und Links functional-programming lambda-calculus scheme lisp church-encoding