Kirche Subtraktion
Lambda-Kalkül war schon immer eine Faszination von mir und das aufkommende Verhalten, Funktionen ineinander zu übertragen, ist erstaunlich komplex. Kirchenzahlen sind Darstellungen natürlicher Zahlen, die aus der wiederholten Anwendung einer Funktion (normalerweise der unären Addition einer Konstanten) gebildet werden. Zum Beispiel gibt die Zahl Null x zurück und "ignoriert" die Eingabefunktion, eins ist f(x)
, zwei ist f(f(x))
und so weiter:
ident = lambda x: x
zero = lambda f: ident
succ = lambda n: lambda f: lambda x: f(n(f)(x))
one = succ(zero)
add1 = lambda x: x + 1
to_int = lambda f: f(add1)(0)
print(to_int(one))
>>> 1
Daraus können wir leicht erkennen, dass die Addition erreicht wird, indem die erste Funktion auf x und dann die zweite Funktion auf x angewendet werden:
add = lambda m: lambda n: lambda f: lambda x: n(f)(m(f)(x))
print(to_int(add(one)(two)))
>>> 3
Das Hinzufügen ist relativ einfach zu verstehen. Für einen Neuling könnte es jedoch unvorstellbar sein, darüber nachzudenken, wie Subtraktion in einem in der Kirche verschlüsselten Zahlensystem aussieht. Was könnte es möglicherweise bedeuten, eine Funktion aufzuheben?
Herausforderung
Implementieren Sie die Subtraktionsfunktion in einem in der Kirche kodierten Zahlensystem. Wobei die Subtraktion die Monus-Operation ausführt und eine Funktion auslöst,n
wenn das Ergebnis größer als Null ist oder andernfalls Null. Das ist Code-Golf, also gewinnt der kürzeste Code.
Eingang
Zwei Kirchenzahlen, die in der von Ihnen gewählten Sprache codiert wurden. Die Eingabe kann positions- oder currystrukturiert sein. Um zu beweisen , diese sind wahre Kirche Zahlen sie müssen in irgendeiner Funktion zu übernehmen und anwenden sie wiederholt ( add1
wird in den Beispielen gegeben , aber es könnte sein add25
, mult7
oder jede andere einstellige Funktion.)
Ausgabe
Eine Kirchenzahl. Es ist zu beachten, dass wenn m < n
dann m - n
immer die gleiche Identitätsfunktion vorliegt.
Beispiele:
minus(two)(one) = one
minus(one)(two) = zero
...
auch akzeptabel:
minus(two, one) = one
minus(one, two) = zero
Anerkennung:
Dieser Github ist dafür gedacht , mir eine Python-Implementierung von Church Numerals zu geben.
lambda m,n,f:apply f m-n times
(oder sogar lambda m,n,f,x:apply f m-n times to x
) zu definieren lambda m,n:lambda f:...
? Oder gilt das nur für die beiden Eingänge m
und n
?
m
und n
in der anderen Reihenfolge? Dies würde beim Curry helfen.
exp(m, n)
berechnetm^n
natürlich.)