Lambda演算与Church计数
⁞
最近对FP(Functional Programming)很感兴趣,这两天在看SICP,见到一个很有意思的练习题2.6,是关于Church计数的。用函数来表示数字,对我来说太抽象了。查找了一些资料,稍稍理解了一些。
0 ≡ λf.λx. x(define zero (lambda (f) (lambda (x) x)))1 ≡ λf.λx. f x(define one (lambda (f) (lambda (x) (f x))))2 ≡ λf.λx. f (f x)(define two (lambda (f) (lambda (x) ( f (f x)))))3 ≡ λf.λx. f (f (f x))(define three (lambda (f) (lambda (x) (f (f (f x))))))... ... n ≡ λf.λx. fn x...
- 加法函数 plus(m,n) = m + n 利用了恒等式 f(m + n)(x) = fm(fn(x))。
plus ≡
λm.λn.λf.λx. m f (n f x) =>(define add
(lambda (m)
(lambda (n)
(lambda (f)
(lambda (x) ((m f) ((n f) x)))))))
- 後继函数 succ(n) = n + 1 (plus 1)。
succ ≡ λn.λf.λx. f (n f x) =>
- (define (succ n)
(lambda (f) (lambda (x) (f ((n f) x)))))
- 乘法函数 times(m,n) = m * n 利用了恒等式 f(m * n) = (fm)n。
- mult ≡
λm.λn.λf. n (m f) =>(define mult (lambda (m) (lambda (n) (lambda (f) (m (n f))))))
在参考[3]中,有另外一种写法,和上面的所谓“经典”写法略有不同, 例如:
(define two (lambda (f) (lambda (x) (f (f x))))) (define two (lambda (f x) (f (f x))))这两种写法等价么?首先我们知道two是f的2次复合函数。假定f(x) = x2,即
(define (f x) (* x x))。
第一种写法中,two是一个函数,它以另一个函数f为参数,而f的参数为x,(two f)可以运算得到f的2次复合函数, ((two f) 2) => f(f(2)) => 16。在第二种写法中,two的参数为,函数f以及函数f的参数x,(two f 2) => f(f(2)) => 16,而(two f)是无效的。意义上稍有不同。
参考:
1. Wikipedia [zh]
2. http://www.mactech.com/articles...
3. http://www.cs.cmu.edu/afs/cs/project...


的函数。 
发表于 hogt 在 2007年06月10日, 01:42 下午 CST #
发表于 Yong Sun 在 2007年06月10日, 03:02 下午 CST #