lambda calculus
一种符号表述的演算形式系统。由阿隆佐·邱奇 在 1930s 提出。
lambda 演算被用来证明判定问题是没有答案的。也明确定义了可计算理论中的可计算性。也是现代编程语言中函数式编程的重要理论基础。
理论上和图灵机等效,也就是说,图灵机可计算的,lambda演算一定可以计算。
上述公式含义:“x 作为参数,代入到函数 M 中,最终得到的值”
基本定义
演算系统中的合法字符:
- x1, x2, x3 以及各种变元
- → 表示规约
- = 表示等价
-
( )
三个符号
对上述字符的理解:
- 变量:x,表示参数或者值
- 抽象: 表示输入参数 x 返回表达式 e 的函数。
- 应用:e0 e1 ,将函数 e0 作用与函数 e1
关于 项的抽象:
- 函数的应用(代入):用括号 (M N) 表示。
- 例如, 是将 2 代入到前面的表达式中计算。因为未定义 +,所以以上表述是非法的,仅用来表达这个意思
- 函数的抽象: ,表示参数为 x,函数体为 M 的米名函数
左结合性:所有的 lambda 演算为从做往右结合。
自由出现法则
出现在 lambda 演算中的变量有两种表示方式:
- 自由变量:变量独立出现在表达式中
- 绑定变量:变量被绑定出现,例如 即为被绑定的 x
规约规则:简化方法
- 变换:变量名称可以随意替换,
λx.x ≡ λy.y
- 规约:函数应用(代入),将 后面的项代入到之前绑定的项目中。
(λx.x) y → y
- 规约:若
x
不在e
中自由出现,则λx.e x → e
,就是将函数消除,成为单一的变量。
合流性:不论顺序如何,最终结果唯一。
特殊的表达式
- Omega 组合子(无限循环):
- Y组合子(递归):
- 第一个 f 表示要代入一个函数,当函数传入后,公式就会变为函数的嵌套形式,递归完成。
计算例子
lambda 演算中,TRUE 运算符定义为 λx.λy.x
举个例子: ((TRUE a) b)
的计算。
即为 ((λx.λy.x a) b)
,然后开始规约:
- 应用第一个参数 a,得到
(λy.a b)
- 应用第二个参数 b,因为返回值 a 与 b 无关,所以最终返回为
a
因此,TRUE 的行为是:总返回第一个参数,忽略第二个参数。