Skip to content

Instantly share code, notes, and snippets.

@smwhr
Last active November 15, 2017 18:52
Show Gist options
  • Select an option

  • Save smwhr/9f005bf2579d6fa4ebccb7b5d9fc85d8 to your computer and use it in GitHub Desktop.

Select an option

Save smwhr/9f005bf2579d6fa4ebccb7b5d9fc85d8 to your computer and use it in GitHub Desktop.
Exprimer la fonction factorielle comme composition de fonctions prenant exactement 1 argument. D'après un talk de Gary Bernhardt
def fact(n):
if n == 0:
return 1
else:
return n * fact(n -1)
print fact(6)
ADD1 = (lambda n : (lambda f : lambda x : f ( n(f)(x) ) ))
ZERO = (lambda f : lambda x : x)
ONE = ADD1(ZERO)
SIX = (ADD1(ADD1(ADD1(ADD1(ADD1(ADD1(ZERO)))))))
ADD = (lambda n : lambda m : n(ADD1)(m))
MULT = (lambda n : lambda m : n(lambda x : ADD(x)(m)) (ZERO))
NULL = (lambda x : x)
TRUE = (lambda t : lambda f : t(NULL))
FALSE = (lambda t : lambda f : f(NULL))
IF = (lambda cond : lambda t : lambda f : cond(t)(f))
IS_ZERO = (lambda n : n(lambda x : FALSE)(TRUE))
SUB1 = (
(lambda n:
lambda f:
lambda x: n (lambda g : lambda h: h(g(f)))
(lambda u: x)
(lambda u: u))
)
fact = lambda mfact: (
lambda n:(
IF (
IS_ZERO(n)
)(
lambda _ : ONE
)(
lambda _ : MULT(n)( mfact(mfact) ( SUB1(n) ) )
)
)
)
print(fact(fact)(SIX)(lambda x : x + 1)(0))
print(
(lambda mfact: (
lambda n:(
(lambda cond : lambda t : lambda f : cond(t)(f)) (
(lambda n : n(lambda x : (lambda t : lambda f : f((lambda x : x))))((lambda t : lambda f : t((lambda x : x)))))(n)
)(
lambda _ : (lambda n : (lambda f : lambda x : f ( n(f)(x) ) ))((lambda f : lambda x : x))
)(
lambda _ : (lambda n : lambda m : n(lambda x : (lambda n : lambda m : n((lambda n : (lambda f : lambda x : f ( n(f)(x) ) )))(m))(x)(m)) ((lambda f : lambda x : x)))(n)( mfact(mfact) ( ((lambda n:lambda f:lambda x: n (lambda g : lambda h: h(g(f)))(lambda u: x)(lambda u: u)))(n) ) )
)
)
))((lambda mfact: (
lambda n:(
(lambda cond : lambda t : lambda f : cond(t)(f)) (
(lambda n : n(lambda x : (lambda t : lambda f : f((lambda x : x))))((lambda t : lambda f : t((lambda x : x)))))(n)
)(
lambda _ : (lambda n : (lambda f : lambda x : f ( n(f)(x) ) ))((lambda f : lambda x : x))
)(
lambda _ : (lambda n : lambda m : n(lambda x : (lambda n : lambda m : n((lambda n : (lambda f : lambda x : f ( n(f)(x) ) )))(m))(x)(m)) ((lambda f : lambda x : x)))(n)( mfact(mfact) ( ((lambda n:lambda f:lambda x: n (lambda g : lambda h: h(g(f)))(lambda u: x)(lambda u: u)))(n) ) )
)
)
)))(
((lambda n : (lambda f : lambda x : f ( n(f)(x) ) ))((lambda n : (lambda f : lambda x : f ( n(f)(x) ) ))((lambda n : (lambda f : lambda x : f ( n(f)(x) ) ))((lambda n : (lambda f : lambda x : f ( n(f)(x) ) ))((lambda n : (lambda f : lambda x : f ( n(f)(x) ) ))((lambda n : (lambda f : lambda x : f ( n(f)(x) ) ))((lambda f : lambda x : x))))))))
)(lambda x : x + 1)(0)
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment