lambda算子3:阿隆佐.丘齐(Alonzo Church)的天才

翻译 2006年08月14日 14:45:00

lambda算子3

阿隆佐.丘齐(Alonzo Church)的天才:Lambda算子里的数

前面建立了lambda运算的基本规则,就可以用lambda算子做点有意思的东西了。开始前为方便计,我们先来点语法糖花差花差,用来命名函数。这些语法糖可以让复杂的公式好写一点。

我们用"let" 来引入一个“全局”函数(也就是说,我们用这个函数时,不用在每个表达式里定义一次):
let squer = lambda x. x^2

这个式子申明了一个叫"square"的函数,定义为 lamdba x. x^2。如果我们有一个表达式 "square 4",上面的"let"意味着这个表达式和下面这个表达式一样:
(lambda square. square 4)(lambda x. x^2)。这个"let"是从Common Lisp或者Scheme里借来的。Lambda算子里可没有这个东西。数学家推崇“如无必要,毋增实体”。这些关键字不入他们的法眼。不过对写惯了程序的我们来说,这些句法糖就可爱多了。

我们的例子里会用到数字和算术操作符。不过记住lambda算子里根本没有数字。我们只有函数!所以我们需要发明用函数来创造数字的方法。幸好Alonzo Church是个天才。他既然发明了lambda算子,用lambda算子表征数字自然不在话下。他搞出的用于数字的函数自然就叫做丘齐数(Church Numerals)。

丘齐数里,所有的数字都是两个参数的函数:

  1. 零是 lambda s z . z
  2. 一是 lambda s z . s z
  3. 二是 lambda s z . s (s z)
  4. 对任意一个数"n",它的丘齐数都是一个函数。这个函数把它的第一个参数应用到第二个参数上n次。用流行的写法,就是lambda s z . s sn z。 绕口啊绕口。做形式化的东东不幸之处就是成天和绕口令打交道。解脱这道呢?当然就是牢记牛人费因曼在Connection Machine工作时的学习方法:问最简单的问题。“给我最简单的例子”。“怎么才能验证这是正确的?”。
    比如说零(lambda s z . z)吧,第一个参数是s, 应用零次就是没有,所以函数体就是孤零零的"z"。那数字一呢?当让就是把第一个参数,s,应用到z上一次,所以函数体就变成了"s z"。

理解这个定义的方法之一时把"z"看作丘齐数里零的名字,而把"s"看后继函数(successor function)的名字。“后继函数”其实很简单,C/C++里的++是也。所以呢,零就是一个返回"0"这个值的函数;一就是把后继函数应用到零上一次的函数;二就是把后继函数应用到一上一次或者说零上两次的函数。0++ 得到 1, 1++ 等价与(0++)++,而1++得到2.现在把0换成z,把++换成s, 一切就清楚了。


现在--看好了。如果我们想做加法,x+y,我们需要一个带4个参数的函数。两个参数代表相加的两个数字,以及为得到结果而需要的"s"和"z"。

let add = lambda s z x y . x s (y s z)

看着好像有点不知所云。不过我们可以用Curry这个利器,分开"s" "z"和x, y。首先,Curry后得到的函数带两个参数,x和y(这个好比add(x, y),符合我们对加号的理解)。其次,我们需要正规化x和y需要的s和z,让x和y共享相同的零和后继函数的绑定:

let add = lambda x y. (lambda s z . (x s (y s z)))

仔细观察一下,上面的式子无非是说,要把x和y相加,我们先用"s"和"z"创建丘齐数"y",然后在把"x"应用到y上。应用时需要的"s"和"z"是"y"里的"s"和"z"。也就是说,我们的到的结果是一个函数,这个函数把自己加到另一个函数上。还是用例子来说明问题。比如说2+3:

add (lambda s z. s (s z)) (lambda s z . s (s (s z))) news newz

为了让演算变得稍微容易一点,我们先对2和3来个Alpha转换。让2用s2和z2,而3用s3和z3:

add (lambda s2 z2 . s2 (s2 z2)) (lambda s3 z3 . s3 (s3 (s3 z3)))

现在我们可以把"add"替换成它的定义了:

(lambda x y .(lambda s z. (x s y (s z)))) (lambda s2 z2 . s2 (s2 z2)) (lambda s3 z3 . s3 (s3 (s3 z3))) 

现在可以对"add"用beta变换了(温馨提示:也就是把形参x和y换成对应的实参):

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


然后我们可以对3这个丘齐数做beta转换。这步操作其实是“正规化”3:把3的定义里的后继函数和零函数(还记得零是个函数吧?)替换成add的参数列表里的后继函数和零函数:

lambda s z . (lambda s2 z2 . s2 (s2 z2)) s (s (s (s z)))

嗯,有点眉目了。现在是真正漂亮的地方了。再来次对2的Beta变换。看看我们准备做什么:2是个带两个参数的函数:一个参数是后继函数,另一个是零函数。要把2加到3上,我们只需要用到"add"这个函数的后继函数。也就是说,我们把计算了3后的结果当成零函数的值!

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

而这个式子,正是丘齐数5!

丘齐数酷的地方是它抛弃了传统整数的概念,用函数取而代之。它把每个数对应为一个函数。而数数(counting)这个操作被对应为应用某个函数(在这里是后继函数)的次数。当然了,上面的介绍非常简单。对丘齐数感兴趣的,可以看这篇文章

丘齐数对编程有什么用嗫?俺还真不知道。但丘齐数(进而到丘齐编码)确实一系列基础理论中有重要应用,比如说有类型的lambda算子。不过这点重要吗?不重要吗?重要吗?不重要吗?研究研究嘛。

Alonzo Church的λ演算(摘自彭罗斯《皇帝新脑》)

可计算性的概念是一个非常重要和美丽的数学观念。它又是相当近代的,具有这样基本性质的事体进入数学的王国是本世纪三十年代的事。这个观念已经渗透到数学的所有领域中去(虽然这一点确实是真的,但是大多数数学家通...
  • Utensil
  • Utensil
  • 2007-08-28 12:01:00
  • 5350

Python 下的 lambda 算子

1. 允许缺省>> a = lambda x, y=2: x+y >> a(0) 2
  • lanchunhui
  • lanchunhui
  • 2016-08-02 19:33:54
  • 581

lambda算子简介1.a

接着前两天的转载继续写。上次说到lambda算子的函数只接受一个参数。那怎么处理多个参数呢?如果只有一个参数,那岂不是连加法都不能实现?这当然难不倒像丘齐这样的天才。于是, lo and behold...
  • g9yuayon
  • g9yuayon
  • 2006-05-29 08:30:00
  • 15035

lambda算子 1.b

上上周就快写完这篇时,IE突然当掉,写的东西烟消云散。俺也元气大伤。这次吸取教训,不用CSDN的在线工具写了。这样的坏处是把文章拷贝到CSDN时,格式难免出错,还得手工调整一下。CSDN什么时候可以实...
  • g9yuayon
  • g9yuayon
  • 2006-06-12 11:14:00
  • 10909

深入理解Lambda

概述   Lambda是一个表达式,也可以说它是一个匿名函数。然而在使用它或是阅读Lambda代码的时候,却显得并不那么容易。因为它匿名,因为它删减了一些必要的说明信息(比如方法名)。下面就来说说L...
  • u013761665
  • u013761665
  • 2016-03-10 17:18:43
  • 23874

lambda算子3:阿隆佐.丘齐(Alonzo Church)的天才

lambda算子3阿隆佐.丘齐(Alonzo Church)的天才:Lambda算子里的数前面建立了lambda运算的基本规则,就可以用lambda算子做点有意思的东西了。开始前为方便计,我们先来点语...
  • g9yuayon
  • g9yuayon
  • 2006-08-14 14:45:00
  • 12355

The Princeton Companion to Mathematics

(1903-1987) 814 VI.89 <em>Alonzo</em> <em>Church</em> (1903-1995) 816 VI.90 William Vallance Douglas Hodge (1903-1975) 816 VI.91 John von Neumann (1903-1957) 817...
  • 2018年04月13日 00:00

4.1.2自然数-丘奇数(Church numeral)

丘奇数的含义
  • yqj2065
  • yqj2065
  • 2015-07-30 17:59:34
  • 2280

不用0,1,2,以及加减乘除来进行运算——阿隆佐·邱奇

很久很久以前,有个叫阿隆佐·邱奇,发现只需要用函数,就可以用计算机实现运算,而不需要0、1、2、3这些数字和+、-、*、/这些符号。 JavaScript支持函数,所以可以通过JavaScript用函...
  • jiang314
  • jiang314
  • 2016-03-18 16:48:44
  • 2267

谁是真正的程序语言专家

一直以来,程序语言的研究都是一个非常偏僻,却非常重要的专业。由于它令人却步的难度,很少有人说得清楚什么人是真正的“高手”。这是一个很简单的道理,当一个人仰望星空的时候,他不会知道哪颗星更加伟大。通常人...
  • wql19881207
  • wql19881207
  • 2012-07-03 16:38:14
  • 2884
收藏助手
不良信息举报
您举报文章:lambda算子3:阿隆佐.丘齐(Alonzo Church)的天才
举报原因:
原因补充:

(最多只允许输入30个字)