邱奇非负整数0的定义如下:
(define zero (lambda (f) (lambda (x) x)))
下面定义加一运算
(define (add-1 n)
(lambda (f) (lambda (x) (f ((n f) x)))))
问1:如何定义1, 2?(定义中不包含zero和add-1)
(add-1 zero) => ((lambda (n) (lambda (f) (lambda (x) (f ((n f) x))))) (lambda (f) (lambda (x) x)))
=> (lambda (f) (lambda (x) (f (((lambda (f) (lambda (x) x))) f) x)))
=> (lambda (f) (lambda (x) (f x)))
(define one
(lambda (f)
(lambda (x)
(f x))))
(add-1 one)
=> ((lambda (n)
(lambda (f)
(lambda (x) (f ((n f) x)))))
(lambda (f)
(lambda (x)
(f x))))
=> (lambda (f)
(lambda (x)
(f ((lambda (f)
(lambda (x)
(f x)))
f)
x)))
=> (lambda (f)
(lambda (x)
(f (lambda (x) (f x)) x)))
=> (lambda (f)
(lambda (x) (f (f x))))
(define two
(lambda (f)
(lambda (x) (f (f x)))))
问2:如何定义加法
(define plus (m n)
(lambda (f)
(lambda (x) ((m f) ((n f) x)))))
python 等价代码:
>>> def zero(): return lambda f: lambda x: x
...
>>> def one(): return lambda f: lambda x: f(x)
...
>>> def two(): return lambda f: lambda x: f(f(x))
...
>>> def addone(n): return lambda f: lambda x: f(n(f)(x))
...
>>> def plus(m,n): return lambda f: lambda x: m(f)((n(f)(x)))