这两周在空闲时间看了看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替换(应用)
剩下的都是扩展,更多的定义就是在研究这个系统的性质与结构的东西了。
浙公网安备 33010602011771号