首页 > 代码库 > lambda 演算

lambda 演算

本文是来自 g9yuayon, 算是一篇读书笔记. :-)
详细内容还是看原作者的.


自由变量

在 (lambda (x) (x y…)) 中, x 是绑定的变量, y 是自由变量


在 (lambda (x) (lambda (y) (x y …))) 中, 要分情况
在第一个 lambda 中, x, y 都是绑定的, 在 第二个 lambda中, x是自由变量


alpha 规则, (转换规则)


(lambda (x) (if (= x 0) 1 0))
;; 等价于
(lambda (y) (if (= y 0) 1 0))
转换操作不影响 lambda 的意义.

(lambda (x) (x)) = (lambda (t) (t))


用 y 替换 x, 用 [y/x] 表示.
例如

(lambda (x) (x))
==> [y/x]x ==> y


beta 规则, (简化规则)

一个测试的地方, 注意写法.



((lambda (x) (+ x 1)) 3)                ; 4

((lambda (y) (lambda (+ x y))) q)       ; (lambda (x) (+ x q))


((lambda (x y) (x y))
 (lambda (z) (* z z)) 3)                ; ((lambda (z) (* z z)) 3)
                                        ; 9

丘奇数

定义 0: (lambda (s z) (z))
定义 1: (lambda (s z) (s z))
定义 2: (lambda (s z) (s (s z)))


加法定义:

let add = (lambda (s z x y) (x s (y s z)))
相当于 let add = (lambda (x y) (lambda (s z) (x s (y s ))))


现在來看一下 (add 2 3):

(add (lambda (s z) (s (s z)))
     (lambda (s z) (s (s (s z)))))

==>

(lambda (s z)
     ((lambda (s2 z2) (s2 (s2 z2))) s
     ((lambda (s3 z3) (s3 (s3 (s3 z3)))) s z)))


先把 s z 搞进 s3 和 z 3
==>

(lambda (s z)
     ((lambda (s2 z2) (s2 (s2 z3))) s
     (s (s (s z)))))


把 s2 换成 s, z2换成 (s (s (s z)))
==>

(lambda (s z)
     (s (s (s (s (s z))))))

==> 5


布尔值

let TRUE  = (lambda (x y) x)
let FALSE = (lambda (x y) y)


let AND   = (lambda (x y) (x y FALSE)
let OR    = (lambda (x y) (x TRUE y)
let NOT   = (lambda (x) (x FALSE TRUE)


下面你就会看到为什么要这么定义, 但是 哪个变态能想到这么巧合…


我们來试下 (AND TRUE FALSE), 展开

((lambda (xt yt) xt)
 ((lambda (xf yf) yf) FALSE))

來一次 beta, 用 ((lambda (xf yf) yf) FALSE) 代替 (xt yt)
==> (lambda (xf yf) yf) ; 这和 FALSE 的定义一样



(AND FALSE TRUE), 展开

((lambda (xf yf) yf) ((lambda (xt yt) yt) FALSE))

==> FALSE


(AND FALSE FALSE), 展开

((lambda (xf yf) yf) ((lambda (xf yf) yf) FLASE))

==> FLASE


(AND TRUE TRUE), 展开

((lambda (xt yt) xt) ((lambda xt yt) xt) FALSE)

==>

(lambda (xt yt) xt)

==>TRUE ; 这和 TRUE 的定义一样



更多强大的公式也是可以验证的. 为什么有人会想到这些…


Y (难搞), YY = YYY

let Y = (lambda (y) ((lambda (x) (y (x x)))
                     (lambda (x) (y (x x)))))


现在我们要证明一个变态的东西 Y Y = Y (Y Y)


((lambda (y) ((lambda (x) (y (x x)))
              (lambda (x) (y (x x))))) Y)


==>

((lambda (x) (Y (x x)))
 (lambda (x) (Y (x x))))


把 (lambda (x) (Y (x x)))) 替换 x
==>

(Y ((lambda (x) (Y (x x)))
     (lambda (x) (Y (x x)))))


==> (Y Y) == (Y (Y Y))


展开 第一个Y,
==>

((lambda (y) ((lambda (x) (y (x x)))
              (lambda (x) (y (x x)))))
    ((lambda (x) (Y (x x)))
     (lambda (x) (Y (x x)))))


用 ((lambda (x) (Y (x x))) (lambda (x) (Y (x x)))) 替换 y,
接着我们可以用 (lambda (x) (Y (x x))) 和 (lambda (x) (Y (x x)))
分别替换 y后面的 2个(lambda (x)..), 为避免混乱, 用 a, b去替换
==>

((lambda (a) (((lambda (x) (Y (x x))) (lambda (x) (Y (x x)))) (a a)))
 (lambda (b) (((lambda (x) (Y (x x))) (lambda (x) (Y (x x)))) (b b)))

==> Y Y == YYY… (自己搞…)

lambda 演算