Sottrazione della Chiesa
Il calcolo lambda è sempre stato un mio fascino e i comportamenti emergenti nel passare funzioni l'una nell'altra sono deliziosamente complessi. I numeri di chiesa sono rappresentazioni di numeri naturali derivati dall'applicazione ripetuta di una funzione (normalmente l'aggiunta unaria di una costante). Ad esempio, il numero zero restituisce x e "ignora" la funzione di input, uno è f(x)
, due è f(f(x))
e così via:
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
Da ciò si può facilmente vedere che l'addizione si ottiene applicando la prima funzione a x quindi applicando la seconda funzione a x:
add = lambda m: lambda n: lambda f: lambda x: n(f)(m(f)(x))
print(to_int(add(one)(two)))
>>> 3
L'aggiunta è relativamente facile da capire. Tuttavia, per un nuovo arrivato potrebbe essere inconcepibile pensare a come appare la sottrazione in un sistema numerico codificato dalla Chiesa. Cosa potrebbe significare eventualmente annullare l'applicazione di una funzione?
Sfida
Implementa la funzione di sottrazione in un sistema numerico codificato dalla Chiesa. Dove la sottrazione esegue l' operazione monus e non applica una funzione n
volte se il risultato sarà maggiore di zero o zero altrimenti. Questo è code-golf, quindi vince il codice più corto.
Ingresso
Due numeri della Chiesa che sono stati codificati nella tua lingua scelta. L'input può essere posizionale o curry. Per provare questi sono numeri veri della Chiesa si devono prendere in qualsiasi funzione e applicarle più volte ( add1
è dato negli esempi ma potrebbe essere add25
, mult7
o qualsiasi altra funzione unario.)
Produzione
Un numero di chiesa. Va notato che se m < n
allora m - n
è sempre uguale alla funzione identità.
Esempi:
minus(two)(one) = one
minus(one)(two) = zero
...
accettabile anche:
minus(two, one) = one
minus(one, two) = zero
Credito:
Questa idea github per avermi dato un'implementazione in pitone dei numeri della Chiesa.
lambda m,n,f:apply f m-n times
(o anche lambda m,n,f,x:apply f m-n times to x
) anziché lambda m,n:lambda f:...
? O questo si applica solo ai due ingressi m
e n
?
m
e n
nell'altro ordine? Ciò aiuterebbe con il curry.
exp(m, n)
calcolam^n
ovviamente.)