Soustraction d'église
Le calcul lambda a toujours été une fascination pour moi et les comportements émergents de passage de fonctions les uns dans les autres sont délicieusement complexes. Les chiffres d'église sont des représentations de nombres naturels obtenus à partir de l'application répétée d'une fonction (normalement l'addition unaire d'une constante). Par exemple, le nombre zéro renvoie x et "ignore" la fonction d'entrée, un est f(x)
, deux est f(f(x))
et ainsi de suite:
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
De cela, nous pouvons facilement voir que l'addition est accomplie en appliquant la première fonction à x puis en appliquant la deuxième fonction à x:
add = lambda m: lambda n: lambda f: lambda x: n(f)(m(f)(x))
print(to_int(add(one)(two)))
>>> 3
L'addition est relativement facile à comprendre. Cependant, pour un nouveau venu, il pourrait être inconcevable de penser à quoi ressemble la soustraction dans un système numérique codé par l'Église. Qu'est-ce que cela pourrait signifier de ne pas appliquer une fonction?
Défi
Implémentez la fonction de soustraction dans un système numérique encodé par Church. Où la soustraction effectue l' opération monus et désapplique une fonction n
fois si le résultat sera supérieur à zéro ou zéro sinon. C'est le code-golf donc le code le plus court gagne.
Contribution
Deux chiffres d'église qui ont été encodés dans votre choix de langue. L'entrée peut être positionnelle ou curry. Pour prouver ces éléments sont vrais chiffres de l' Église , ils doivent prendre en toute fonction et les appliquer à plusieurs reprises ( add1
est donné dans les exemples , mais il pourrait être add25
, mult7
ou toute autre fonction unaire.)
Production
Un chiffre d'église. Il convient de noter que si m < n
alors m - n
est toujours la même que la fonction d'identité.
Exemples:
minus(two)(one) = one
minus(one)(two) = zero
...
également acceptable:
minus(two, one) = one
minus(one, two) = zero
Crédit:
Ce github est essentiel pour m'avoir donné une implémentation en python des chiffres de l'église.
lambda m,n,f:apply f m-n times
(ou même lambda m,n,f,x:apply f m-n times to x
) au lieu de lambda m,n:lambda f:...
? Ou cela s'applique-t-il uniquement aux deux entrées m
et n
?
m
et n
dans l'autre ordre? Cela aiderait au curry.
exp(m, n)
calculem^n
bien sûr.)