博客推荐:good math, bad math之Lambda算子简介

转载 2006年05月22日 06:54:00

Good math,bad math是我最近发现的一个博客。作者Mark Chu-Carroll写的一系列关于计算机科学理论的文章深入浅出,通俗易懂,属于茶余饭后绝佳的消遣读物。俺一直想写点介绍lambda caculus的小文章,但看了他的“My Fravorite Calculus: Lambda”后,就打消了这个念头。有这么好的文章,转贴就行了,自己就不用再写不入流的文章。今天先转介绍lamdba calculus的第一部分。先申明一下,俺的翻译在不影响作者原意的基础上(但愿能做到到),有时也插科打诨加点8卦。如果谁觉得文章垃圾,完全因为俺水平有限。原文绝对精彩。另外,俺数学方面的术语止于大一微积分。所以术语用错了,还请多多指正。

在计算机科学尤其是是编程语言领域,我们常用一种算子:Lambda Calculus。逻辑学家也常用Lambda Calculus 来研究计算和离散数学结构的本质。其实当初Alanzo Church(就是丘奇-图灵论点里的那位丘奇老大了)和Stephen Cole Kleene(就是自动机理论里Kleene Star那个Kleene了)推出这个Lambda Calculus,也是为了方便他们做逻辑方面的推理,好证明决定性问题。当然以Church和图灵的天才,没多久他们便证明图灵机和lambda calculus具有等价的计算能力。Church提出Lambda Calculus时就怀疑他的理论能被用在其它地方。事实证明他的确高瞻远瞩。Lambda Calculus在编程的理论和实践两方面都意义深远。做理论和做函数编程的且不说。就算是玩儿脚本语言的老大们,也多半成天和lambda打交道。说来好玩儿,计算机科学理论的发展相当诡异。常常是逻辑学家为了推进逻辑理论提出一个理论,若干年后计算机科学家出于实际需求再“重新发现”一模一样的理论。 比如说现在很多函数编程语言常用的Hindley-Milner类型系统,就是逻辑学家Roger Hindley 于1969年先发现,再由大名鼎鼎的牛人Robin Milner于1978年独立提出。说远了。Lambda Calculus本身有若干显著优点:

  1. 它非常简单。反正比图灵机简单。
  2. 它图灵完备。也就是说,图灵机能完成的计算,Lambda Calculus也能完成。
  3. 它易于读写。这点很重要。简单就是力量。我们不可不记。
  4. 它的语义足够强大,能让我们用它来推理。
  5. 它的计算模型足够强大
  6. 容易创建不同的变种,以便我们探索用不同的方式构建计算或语义时的特性

Lambda Calculus易于读写意义重大。正是这个优点催生了许多或多或少基于lambda calculus的极为优秀的编程语言:Lisp, ML, 和Haskell都在很大程度上基于Lambda calculus开发出来。

Lambda calculus建立在函数这个概念上。纯粹的lambda算子理论中,任何东西都是函数。除了函数外别无它物。不过我们可以用函数搭建出各种东西。其实我们可以从lambda calculus开始,从无到有搭建出整个数学的结构。

牛皮轰轰吧?我们就来看一下lambda calculus为什么这么神奇。对任何一个算子理论来说,我们必须先定义两个东西。一是句法(syntax),用来描述什么表达式是合法的;二是一套规则,用来规定我们怎么对表达式作合法的符号操作。

Lambda Calculus句法

Lambda calculus 只有三种表达式

  1. 函数定义:在lambda calculus里一个函数就是一个表达式,写成lambda x . <函数体>。意思是“一个函数,带一个参数X,返回计算函数体后得到的结果”。这个时候我们说这个lambda表达式绑定了参数X。
  2. 标识符引用(identifier reference): 一个标识符引用就是一个名字。这个名字和包括这个引用的函数定义里的参数同名。
  3. 函数应用(function application): 这个更简单,把要应用的值放到函数定义的后面就行了。比如
    (lambda x . plus x x) y

这么简单的定义能干什么嗫?怎么没有多个参数嗫?这个就是数学的魅力了。我们很快会发现,多个参数可以被等价的操作(所谓的currying)来代替。而配上简单的操作后(本质操作就一个:替换),我们就得到了一门强大的编程语言,不输基于图灵机模型的Algo系列语言,比如C。

欲知后事如何,且听下回分解。

相关文章推荐

用VB6.0编写自我升级的程序(三)

 VERSION 5.00Begin VB.Form frmUpdate    BackColor       =   &H80000007&   BorderStyle     =   0  Non...
  • douhapy
  • douhapy
  • 2004年05月19日 22:30
  • 1383

康托尔、哥德尔、图灵——永恒的金色对角线(rev#2)

  康托尔、哥德尔、图灵——永恒的金色对角线(rev#2) By 刘未鹏C++的罗浮宫(http://blog.csdn.net/pongba) 我看到了它,却不敢相信它[1]。——康托尔 计算机是数...
  • pongba
  • pongba
  • 2006年10月15日 23:36
  • 64360

OpenGL超级宝典7th简体中文-第五章-数据

我们会学到什么 如何创建缓冲和纹理,用它们来存储数据,以及程式如何访问数据。 如何使得OpenGL自动为我们的顶点属性提供数据。 如何从着色器中访问纹理和缓冲。 至今为止的示例中,我们要么在着色器直接...

博客推荐:good math, bad math之Lambda算子简介

博客推荐:good math, bad math之Lambda算子简介 分类: 计算机科学 阅读流水帐 翻译2006-05-22 06:54 8928人阅读 评论(2) 收藏 举报 ...

js中单体对象(Global/Math)转码解码的方法和Date简介

008 //其它引用类型对象。 //单体对象(Global,Math),你不需要对对象实例化,就可以直接使用。 //Global对象(全局)这个对象不存在,无形的对象。 ...

java.Math.bigdecimal的用法简介(大数据处理)

在java中提供了大数字的操作类,即java.math.BinInteger类和java.math.BigDecimal类。这两个类用于高精度计 算,其中BigInteger类是针对大整数的处理类,而...

HP_when_good_disks_go_bad_wp1.pdf

  • 2012年05月22日 14:32
  • 597KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:博客推荐:good math, bad math之Lambda算子简介
举报原因:
原因补充:

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