前言
因为最近在学习组合范畴文法,也就是CCG(combinatory categorial grammar)。这种文法在表达语义的过程中使用到一些关于lambda演算的一些知识,所以在网上找到一些资料错略的学习了一下。在这里把所学习的内容整理一下以便以后学习参考。
lambda演算 (lambda calculus 或者 λ-calculus)
先简单介绍一下历史。当年莱布尼茨leibniz有两个理想:(1)希望能够创造一种能够描述任何问题的语言,(2)找到一种能够解决用这种通用语言描述的问题的通用方法,这个问题也就是Entscheidungsproblem (这是德语,其实就是decision problem,我们经常说的判定问题)。对于第二个遐想,1936年Church发明了一种形式系统也就是lambda calculus,并指出判定问题是无解的。lambda演算还能够清晰的定义什么是一个可计算的函数。之后,lambda演算对函数式的编程语言(如Lisp)的发展有很重要的影响,并且在λ-演算的基础上,发展起来的π-演算、χ-演算,成为近年来的并发程序的理论工具之一,许多经典的并发程序模型就是以π-演算为框架的。
1 lambda演算是什么?
lambda演算是一个形式系统(形式系统主要是由形式语言加上推理规则或转换规则构成的集合),它主要是被用来研究函数定义,函数应用和递归。简单点说,lambda演算就是一个小的形式系统,它主要表达了计算机计算中两个概念:“代入”和“置换”。“代入”通俗点解释就是和我们平常接触的函数调用类似,比如用实参代入到形参。“置换”一般理解为变量换名规则。“代入”就是后面要讲到的lambda演算中的β-规约,而“置换”相当于lambda演算中的α--变换。
2 lambda演算相关的概念和定义
lambda表达式主要由以下元素构成:
变量: v1, v2, ..., vn, ...
- 抽象符号: λ 和 . (一个点)
- 左右括号 ( )
- 还有两个:规约:→ 和等价:=
lambda表达式的集合 Λ, 递归定义如下:
(1)如果x是一个变量,那么 x ∈ Λ
(2)如果 x 是一个变量,且 M ∈ Λ, 那么 (λx.M) ∈ Λ
(3)如果 M, N ∈ Λ, 那么 (M N) ∈ Λ
λ-项