Subtração da Igreja
O cálculo lambda sempre foi um fascínio meu e os comportamentos emergentes de passar funções entre si são deliciosamente complexos. Os numerais da igreja são representações de números naturais calculados a partir da aplicação repetida de uma função (normalmente a adição unária de uma constante). Por exemplo, o número zero retorna x e "ignora" a função de entrada, um é f(x)
, dois é f(f(x))
e assim por diante:
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 disso, podemos ver facilmente que a adição é realizada aplicando a primeira função em x e aplicando a segunda função em x:
add = lambda m: lambda n: lambda f: lambda x: n(f)(m(f)(x))
print(to_int(add(one)(two)))
>>> 3
A adição é relativamente fácil de entender. No entanto, para um recém-chegado, pode ser inconcebível pensar em como é a subtração em um sistema numérico codificado pela Igreja. O que poderia significar não aplicar uma função?
Desafio
Implemente a função de subtração em um sistema numérico codificado pela Igreja. Onde a subtração executa a operação monus e aplica uma função n
vezes se o resultado for maior que zero ou zero, caso contrário. Este é o código-golfe, pelo que o código mais curto vence.
Entrada
Dois números da igreja que foram codificados na sua escolha de idioma. A entrada pode ser posicional ou com curry. Para provar estes são verdadeiros números da Igreja que terá que tomar em qualquer função e aplicá-los repetidamente ( add1
é dado nos exemplos, mas poderia ser add25
, mult7
ou qualquer outra função unário.)
Resultado
Um numeral da igreja. Deve-se notar que se m < n
então m - n
é sempre o mesmo que a função de identidade.
Exemplos:
minus(two)(one) = one
minus(one)(two) = zero
...
também aceitável:
minus(two, one) = one
minus(one, two) = zero
Crédito:
Esta essência do github por me dar uma implementação em python dos numerais da igreja.
lambda m,n,f:apply f m-n times
(ou mesmo lambda m,n,f,x:apply f m-n times to x
) em vez de lambda m,n:lambda f:...
? Ou isso se aplica apenas às duas entradas m
e n
?
m
e n
na outra ordem? Isso ajudaria com o curry.
exp(m, n)
calculam^n
claro.)