Odejmowanie Kościoła
Rachunek Lambda zawsze był moją fascynacją, a pojawiające się zachowania polegające na przekazywaniu sobie funkcji są zachwycająco złożone. Liczby kościelne są reprezentacjami liczb naturalnych skonstruowanych w wyniku wielokrotnego zastosowania funkcji (zwykle jednoargumentowego dodania stałej). Na przykład liczba zero zwraca x i „ignoruje” funkcję wejściową, jedna to f(x)
dwie, druga f(f(x))
itd.:
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
Z tego możemy łatwo zobaczyć, że dodawanie odbywa się poprzez zastosowanie pierwszej funkcji do x, a następnie zastosowanie drugiej funkcji do x:
add = lambda m: lambda n: lambda f: lambda x: n(f)(m(f)(x))
print(to_int(add(one)(two)))
>>> 3
Dodawanie jest stosunkowo łatwe do zrozumienia. Jednak dla nowoprzybyłego może być nie do pomyślenia, jak wygląda odejmowanie w systemie liczbowym zakodowanym w Kościele. Co może oznaczać cofnięcie zastosowania funkcji?
Wyzwanie
Zaimplementuj funkcję odejmowania w zakodowanym w kościele systemie liczbowym. Gdzie odejmowanie wykonuje operację monus i nie stosuje funkcji n
razy, jeśli w przeciwnym razie wynik będzie większy niż zero lub zero. To jest golf golfowy, więc wygrywa najkrótszy kod.
Wejście
Dwie cyfry kościelne zakodowane w wybranym przez ciebie języku. Wejście może być pozycyjne lub curry. Aby udowodnić te są prawdziwe cyfry kościelne będą musieli podjąć w dowolnej funkcji i zastosować je wielokrotnie ( add1
podano w przykładach, ale to może być add25
, mult7
lub jakakolwiek inna funkcja jednoskładnikowa).
Wynik
Cyfra kościelna. Należy zauważyć, że jeśli m < n
wtedy m - n
jest zawsze taki sam jak funkcja tożsamości.
Przykłady:
minus(two)(one) = one
minus(one)(two) = zero
...
dopuszczalne również:
minus(two, one) = one
minus(one, two) = zero
Kredyt:
Ten github ma za zadanie zaimplementować w języku Python numerację kościelną.
lambda m,n,f:apply f m-n times
(a nawet lambda m,n,f,x:apply f m-n times to x
) zamiast lambda m,n:lambda f:...
? Czy to dotyczy tylko dwóch wejść m
i n
?
m
i n
w drugiej kolejności? Pomoże to w curry.
exp(m, n)
obliczam^n
oczywiście.)