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
- lamdba算子4:布尔值和选择
- lamdba算子之布尔值理解
- 布尔表达式和选择结构
- Lamdba
- c#写的遗传算法的交叉算子,选择算子和变异算子
- 4-布尔类型和引用
- 浅论遗传算法及其优化和算子选择
- 浅论遗传算法及其优化和算子选择
- Spark算子选择策略
- NULL和空字符串的布尔值
- swift-5类型别名和布尔值
- 布尔值
- log算子 和dog 算子
- 拉普拉斯算子和梯度算子
- log算子 和dog 算子
- log算子 和dog 算子
- 遗传算法中的选择算子
- 遗传算法的选择算子
- 说说.NET中的垃圾回收
- How to enhance the performance of ASP/ASP.NET+SQL web site?问:如何提高ASP/ASP.NET+SQL网站性能?
- 如何在linux 下多用户的建立
- Java的类装载器(Class Loader)和命名空间(NameSpace)
- UML简析
- lamdba算子4:布尔值和选择
- 微软问我6个问题,关于MVP,我怎么回答?
- ActionScript 里的基本常识
- 工作流管理系统概述
- 用Visual Studio .NET 中的Mobile Web Form创建移动网络应用程序
- 不使用fileSystem组件,叫你列举出文件夹下的所以文件包括子文件夹
- 泛型中使用接口的显示实现
- 注册表读写类
- 内德维德的解说稿