f = lambda x: x+1
f(10)
和下面的寫法等價
def f(x):
return x+1
f(10)
def f(a, b):
return a + b
f(2, 3)
def f(a):
def g(b):
return a + b
return g
f(2)(3)
def true_(x, y):
return x
def false_(x, y):
return y
def if_(c, x, y):
return c(x, y)
def and_(p, q):
return p(q, false_)
def or_(p, q):
return p(true_, q)
def not_(p):
return p(false_, true_)
def _0(f, x):
return x
def _1(f, x):
return f(x)
def _2(f, x):
return f(f(x))
def _3(f, x):
return f(f(f(x)))
def succ(n):
def g(f, x):
return f(n(f, x))
return g
def plus(m):
def _plus(n):
return m(succ, n)
return _plus
def mult(m, n):
return m(plus, n) _0
\[PRED=\lambda n.\lambda f.\lambda x.n\\ (\lambda g.\lambda h.h\ (g\ f))\\ (\lambda u.x)\ (\lambda u.u)\]
- $\lambda u.x$
- $\lambda u.u\ x$
- $\lambda u.u\ (f\ x)$
- $\lambda u.u\ (f\ (f\ x))$
- $\lambda u.u\ (f\ (f\ (f\ x)))$
- $...$
def sub(m, n):
return n(pred, m)
ISZERO = lambda n: n(lambda u: FALSE)(TRUE)
LESS_THAN_EQUAL = lambda m: lambda n: ISZERO(SUB(m)(n))
LESS_THAN = lambda m: lambda n: NOT(LESS_THAN_EQUAL(n)(m))
EQUAL = lambda m: lambda n: AND(LESS_THAN_EQUAL(m)(n))\
(LESS_THAN_EQUAL(n)(m))
GREATER_THAN_EQUAL = lambda m: lambda n:\
LESS_THAN_EQUAL(n)(m)
GREATER_THAN = lambda m: lambda n:\
NOT(GREATER_THAN_EQUAL(n)(m))
def pair(x, y):
def g(f):
return f(x, y)
return g
def g(a, b):
return a(a, b)
g(g, x)
一開始的想法…
def fib(n):
def f(a, b):
if_(
b <= 2,
1,
a(a, b-1) + a(a, b-2))
return f(f, n)
def fib(n):
def f(a, b):
if_(b <= 2,
lambda g: 1,
lambda g: g(g, b-1) + g(g, b-2)) (a)
return f(f, n)
U = lambda g: g(g)
FIBONACCI = U(lambda f: lambda x:\
IF(LESS_THAN_EQUAL(x)(_2))\
(lambda g: _1)\
(lambda g: PLUS (U(g)(PRED(x)))
(U(g)(PRED(PRED(x))) )) (f))