lamdba算子4:布尔值和选择

来源:互联网 发布:淘宝网页怎么打开口令 编辑:程序博客网 时间:2024/04/29 07:12

Lambda算子里的布尔值和选择

原文在这里。既然Lambda算子里有了数的概念我们想进行任意的计算就只需要两件东西了:怎么表示选择,和怎么表达重复操作。我们先聊聊怎么表示布尔值(也就是非真即假的二元集合)和选择,然后再讨论重复和递归(友情预告:人见人爱的Y Combinator终于可以出场了)。

 

我们一般把选择表示为if/then/else的表达式,和大多数编程语言的选择语句没有区别。丘齐数的基本模式无非是把一个数表达为一个函数。这个函数把它自己加到另外一个函数上。我们继续沿用这个模式,把true和false也表达为对自己的参数执行if-then-else操作的函数:
let TRUE = lambda x y . x
let FALSE = lambda x y . y

现在我们就可以写“if-then-else”函数了(记到哈,lambda算子理论里所有东东都是函数)。这个函数的第一个参数是一个条件表达式,第二个参数是当第一个参数为真时返回的表达式,而第三个参数自然是当第一个参数为假时返回的表达式了。相当于我们的if cond then true_expr else false_expr:
let IfThenElse = lambda cond true_expr false_expr . cond true_expr false_expr

为了我们刚定义的布尔值有用,我们还得定义一些常用的逻辑操作先:
let BoolAnd = lambda x y . x y FALSE
let BoolOr = lambda x y. x TRUE y
let BoolNot = lambda x . x FALSE TRUE

上面定义了常用的“与”,“或”,和“非”操作。我们可以稍微考查一下它们的机制。

BoolAnd TRUE FALSE (也就是 true && false):

我们把TRUE和FALSE替换为它们的定义:  BoolAnd (lambda x y . x) (lambda x y . y)
执行Alpha 替换避免混淆变量名:BoolAnd (lambda xt yt . xt) (lambda xf yf . yf)
然后把BoolAnd替换为它的定义:(lambda x  y . x y FALSE)(lambda xt yt . xt) (lambda xf yf . yf)
执行Beta替换:(lambda xt yt . xt) (lambda xf yf . yf) FALSE
呵呵,再Beta一把:(lambda xf yf . yf)。

最后的结果lambda xf yf . yf就是FALSE的定义。也就是说, BoolAnd TRUE FALSE = FALSE。神奇吧?看起来只是简单的替换:变量替换,参数替换,但最后的结果确意义重大。这让我想起当年第一次读
GEB时不由自主地感叹,看似简单的句法层面的操作竟然能得出迷幻般的结果。

我们再来看看 false && true, 也就是 BoolAnd FALSE TRUE。“噫,那不是和我们刚推演过的BoolAnd TRUE FALSE一样么!”。眼尖的老大们可能要问。嗯,我们知道布尔逻辑里的操作是服从交换率的,所以 a && b 等于 b && a。可惜我们在用lambda算子定义布尔操作,是不是服从交换率,需要我们证明。如果BoolAnd FALSE TRUE的结果是FALSE,我们也就证明了BoolAnd符合交换率:
定义替换:BoolAnd (lambda x y . y) (lambda x y .x)
Alpha替换:
BoolAnd (lambda xf yf . yf) (lambda xt yt . xt)
替换BoolAnd的定义: (lambda x y .x y FALSE) (lambda xf yf . yf) (lambda xt yt . xt)
Beta替换: (lambda xf yf . yf) (lambda xt yt . xt) FALSE
再来Beta替换: lambda xt yt. xt, 也就是FALSE
所以说, BoolAnd FALSE TRUE = FALSE

最后,我们来看看BoolAnd TRUE TRUE:
定义替换:BoolAnd (lambda x y . x) (lambda x y . x)
Alpha替换: BoolAnd (lambda xa ya . xa) (lambda xb yb . xb)
替换BoolAnd的定义: (lambda x y . x y FALSE) (lambda xa ya . xa) (lambda xb yb . xb)
Beta替换: (lambda xa ya . xa) (lambda xb yb . xb) FALSE
再次Beta替换: (lambda xb yb .xb),这个正是TRUE的定义
所以我们得到BoolAnd TRUE TRUE = TRUE