“在λ 演算中,完整 β 归约具有合流性。对任意项 $t,u,v$,若”
形式陈述
无类型 λ 演算的原始项由抽象语法
归纳生成。三种构造依次是变量、函数抽象和函数应用。应用按左结合解析,
抽象
核心计算规则是 β-收缩:
其中右侧是无捕获替换。把规则对应用两侧和抽象体作相容闭包,就得到完整 β-归约;它允许收缩任意 β-redex。调用值、调用名等求值策略只选择其中一部分位置和步骤,因此是完整 β-归约的特定子关系。
β-归约的自反、对称、传递闭包给出 β-可转换关系
直觉
λ 演算把计算压缩成“抽象接受实参”。变量给出引用,抽象形成函数,应用把函数与实参相接,β-步骤再以代入实现调用。函数与参数采用同一种项语法,所以函数能够接收函数、返回函数,也能把自身作为数据传递。
极少的构造并不意味着执行行为简单。redex 是应用节点左侧已经出现抽象的局部形状;不必先计算整个函数体才能辨认。例如
例子与边界
恒等函数满足
若把参数
结果中的
布尔值可由行为编码:
应用左结合,故
这种选择行为不自动等于实用语言中的短路条件式。若调用值求值器在调用前求出两个分支,
无类型演算允许自应用。令
则
推论与应用
λ 演算是函数式语言与操作语义的理论原型。替换语义直接把实参写入函数体;环境解释器则把函数表示为代码与定义环境组成的闭包。两种实现路径必须给出相同的词法绑定行为。
无类型演算可用不动点组合子在没有 let rec 原语时构造一般递归,具体
β-归约、Church–Rosser 定理和正规化理论分别刻画局部计算、分叉汇合与终止。简单类型 λ 演算加入类型限制,排除
在可计算性侧,无类型 λ 演算与图灵机刻画同一类可计算函数;在逻辑侧,类型化 λ 项通过 Curry–Howard 对应承担证明对象的角色。前者允许一般非终止,后者的终止性取决于具体类型系统。
参考资料
- Henk Barendregt, The Lambda Calculus: Its Syntax and Semantics, revised ed., North-Holland, 1984, Chapters 2–3。
- Benjamin C. Pierce, Types and Programming Languages, MIT Press, 2002, Chapters 5–7。
- J. Roger Hindley and Jonathan P. Seldin, Lambda-Calculus and Combinators: An Introduction, Cambridge University Press, 2008, Chapters 1–4。