关于无类型限制的lambda演算

关于无类型限制的lambda演算

在阅读这篇博文之前,你最好已经阅读过A Tutorial Introduction to the Lambda Calculus (Raul Rojas)

在接触Haskell几个月之后,才发觉Haskell不过是一个实现pattern match比较方便的工具,真正值得深入学习不仅有Haskell的实现和函数式编程的思想,还包括如下的内在理论知识:lambda演算,图灵机,语言和文法,符号系统,类型系统等等(目前还没有对这些内容进行系统学习,所以不能保证列出的顺序是正确的学习路线)。在这其中最基础的就是lambda演算。

lambda演算其实分成两派:带类型系统的和不带类型系统的。前者即声明出来的函数均有一个有限的、非递归的类型,主要用于程序语言理论,这里暂时不介绍了。后者是下文谈论的重点。

不带类型系统的lambda演算,理论框架是这么搭的:

  • 首先,通过类似文法定义的方式定义了函数的概念,以及针对其形式而自然产生的一些问题进行了说明(比如自由变量和约束变量)。
  • 基于函数定义了一些概念,证明这些概念可以基于函数进行定义。比如T/F/有关运算,自然数集/有关运算,等等。

(不带类型系统的)lambda演算和抽象代数很像。

  • 抽象代数是从集合出发,首先不加定义地给出了元素、集合、属于的概念,然后根据这几个概念提出新的定义(比如关系->运算->代数系统),从而构建整个抽象代数的理论体系,使很多(在数学中)有用的概念具有标准化定义。
  • lambda演算是先通过类似文法产生式的方式给出了函数的概念,然后提出了行为和现实概念类似的函数,比如用\x -> \y -> x表示True.这些函数的行为与现实概念的行为产生了对应(比如用函数定义的自然数集也符合皮亚诺公理),从而可以把一个很大的理论体系建立在lambda演算这个概念上。

数学里的定义对应CS里的记号(notation),对于一个记号,只要描述清楚他的性质,就相当于把这个记号定义了出来。lambda演算的目的就是将T,F,与或非,0
1,后继前驱加法乘法这些记号绑定到一些specially designed的函数上,使得这些记号仍然具有我们所熟悉的特性。

为什么非得要强调不带类型系统的lambda演算?
因为不带类型系统会让lambda演算具有更强大的描述能力。比如Y组合子的类型(如果写得出来的话)是t -> t1 -> ... -> t1,或者t满足t = t -> t1,这个类型不是有限的,从而不能在一个类型系统中存在,但是Y组合子可以在不带类型系统的lambda演算中定义出来。

我(可能)会在近期的博客中给出A Tutorial Introduction to the Lambda Calculus (Raul Rojas)的读书笔记和习题解答。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章