这两周在空闲时间看了看lambda演算。

最大的困难是没有好的资料……

在图书馆找到了两本书:

〈可计算性和计算复杂性〉朱一清,赵致琢;国防工业出版社        内容讲的很全,但是讲得如些烂,没给出定义的符号时不时的冒出来……

 

 

还有一本非常古老的(纸都变黄色了),那个年代人们做学问就是严谨。(书名以后补上)

 

不过两本书的特点都是先讲述完基础后才展开精彩的部分。

lambda系统有好多种,其实我关注的只是它的作为计算模型与图灵机的等价性。非常想有一个直奔它是如何计算的资料。

 

 

在网上搜,这个文章写的非常不错。

(不同地方所用的符号并不统一)

 

http://blog.csdn.net/g9yuayon/category/16776.aspx

 

 

列表中的关于lambda的三篇文章讲的非常通俗。

在些基础上可以再回头来注意lambda系统的严谨性以及相关的扩展,入门快。

 

 


 

困扰我较多的几个问题:

0.所谓的函数定义是指lambda x.M中的表达式M。在上面的链接中提到的lambda x.M就相当于函数定义。x是变量,M是函数体。

 

1.虽然概述时一再说lambda演算中不区分数据与函数,函数可以像基本变量一样赋值或传值。但是没有直观的例子,所以理解lambda x.f(x)时很不深刻,里边有误导,总想把f(x)作数学中的函数来理解,这样就缩小了它的本意。

lambda x.M(y)其实就是将M应用于y。这里的()并没有特别的意思(比如是M的附属物),可以写成lambda x.(M)(y)就不会混淆了。

 

2.currying 局部套用函数

其实数学表达式就是

lambda xyz.M=lambda x.(lambda y.(lambda z.M)))

这实际上是一个定义式。

根据lambda演算的形式系统,是没有lambda xyz.M这种三元函数的(x,y,z),只有lambda x.M这样的式子才是lambda项。

但通过currying 就可以引入多元函数了。定义就是lambda xyz.M=lambda x(lambda y(lambda z.M))) 

 

3.关于lambda演算的lambda项的公式要注意应用(即beta替换)与“函数定义”的区分。

比如lambda x.Mx是(lambda x.M)x还是lambda x.(Mx)?

答案是lambda x.(Mx)。在想表达(lambda x.M)x 的意思的地方千万不要忘了加括号。

在有的书上lambda x(lambda y(M))这样的记法就是定义,省略了点'.'而已。

 

4.在学习lambda演算时,最基本的一个形式化系统是

lambda 表达式的定义+currying(引入了多元函数)+alpha替换(换名)+beta替换(应用)

剩下的都是扩展,更多的定义就是在研究这个系统的性质与结构的东西了。

 

 

 

Posted on 2010-10-21 00:15  joneykk  阅读(411)  评论(0)    收藏  举报