负暄琐话

我的email: rot47('649@ 6(hF+`hd"w=92vhG{>}G3"@l M >:>6?4@56 \F')

囧囧ID:g9yuayon
842872次访问,排名32好友19人,关注者21
姓名:g9yuayon
前世:夜郎国厚脸皮神棍
魅力指数:0
名气:1
宠物:一只从来不对生人叫的看门狗
g9yuayon的文章
原创 240 篇
翻译 4 篇
转载 48 篇
评论 836 篇
g9的公告
最近评论
vvukqr:WoW Gold
vvukqr:WoW Gold,
vvukqr:WoW Gold
lbaby:#xingranliuyun 发表于2008-06-27 23:09:36 IP: 61.49.217.*
好文!

graphviz这东西着实不错,以前学过用这东西来画C的函数调用图。

http://www.ibm.com/developerworks/cn/linux/l-graphvis/
----……
dikatour:最近不知道怎么回事,公司打开csdn的速度可以用蜗牛的速度来形容,不知道是不是有世仇:D

csdn博客很讨厌的一个地方就是每篇文章后面现在都多出来一个“收藏”,这两个字摆在每篇文章的后面,极度破坏美感。

一眼扫过去,
A...收藏
B....收藏
C.....收藏
D......收藏

没法看了
文章分类
收藏
    相册
    旅游
    计算机科学
    Lambda the Ultimate
    软件开发
    Reddit编程专栏(RSS)
    正在读的书
    存档
    订阅我的博客
    XML聚合  FeedSky

    翻译 lamdba算子4:布尔值和选择收藏

    新一篇: 实在抵不住张老师的诱惑,又跳坑了

    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

     

    发表于 @ 2006年08月27日 08:55:00|评论(loading...)|编辑

    旧一篇: 拒领菲尔兹(ZT)

    评论

    #albertlee 发表于2006-09-12 16:41:00  IP: 222.128.7.*
    老兄,继续阿, 我已经把你的这一系列翻译成 python程序了,come on~

    http://blog.chinaunix.net/u/4614/showart.php?id=169984
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © g9