Sustracción de la iglesia
El cálculo de Lambda siempre ha sido una fascinación mía y los comportamientos emergentes de pasar funciones entre sí son deliciosamente complejos. Los números de iglesia son representaciones de números naturales construidos a partir de la aplicación repetida de una función (normalmente la suma unaria de una constante). Por ejemplo, el número cero devuelve x e "ignora" la función de entrada, uno es f(x)
, dos es f(f(x))
y así sucesivamente:
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
A partir de esto, podemos ver fácilmente que la suma se logra aplicando la primera función a x y luego aplicando la segunda función a x:
add = lambda m: lambda n: lambda f: lambda x: n(f)(m(f)(x))
print(to_int(add(one)(two)))
>>> 3
La suma es relativamente fácil de entender. Sin embargo, para un recién llegado, podría ser inconcebible pensar en cómo se ve la resta en un sistema numérico codificado de la Iglesia. ¿Qué podría significar desaplicar una función?
Desafío
Implemente la función de resta en un sistema de numeración codificado de Church. Donde la resta realiza la operación monus y no aplica una función n
veces si el resultado será mayor que cero o cero de lo contrario. Este es el código de golf, por lo que gana el código más corto.
Entrada
Dos números de la Iglesia que han sido codificados en su idioma de elección. La entrada puede ser posicional o curry. Para probar estos son los verdaderos números de la Iglesia que se tienen que tomar en cualquier función y aplicarlos varias veces ( add1
se da en los ejemplos pero podría ser add25
, mult7
o cualquier otra función unaria.)
Salida
Un número de iglesia. Cabe señalar que si m < n
a continuación, m - n
siempre es la misma que la función identidad.
Ejemplos:
minus(two)(one) = one
minus(one)(two) = zero
...
también aceptable:
minus(two, one) = one
minus(one, two) = zero
Crédito:
Este github gist por darme una implementación en Python de los números de la iglesia.
lambda m,n,f:apply f m-n times
(o incluso lambda m,n,f,x:apply f m-n times to x
) en lugar de lambda m,n:lambda f:...
? ¿O esto solo se aplica a las dos entradas m
y n
?
m
y n
en el otro orden? Esto ayudaría con el curry.
exp(m, n)
calcula,m^n
por supuesto.)