Skip to content

模型Model

λ 演算

施工中 · 内容逐步修订

Lambda calculus · Untyped lambda calculus

以变量、抽象、应用和 β-归约表达高阶函数计算的无类型核心演算。

形式陈述 ​

无类型 λ 演算的原始项由抽象语法

t::=x∣λx.t∣tt

归纳生成。三种构造依次是变量、函数抽象和函数应用。应用按左结合解析,tuv 表示 (tu)v;抽象体尽量向右延伸,λx.tu 表示 λx.(tu)。

抽象 λx.t 中的 λx 按词法作用域绑定 t 内相应的 x。原始语法树相同是字面语法相等;只一致更换绑定变量得到的是 α-等价,不能与字面相等混写。理论中常把项按 α-等价识别。

核心计算规则是 β-收缩:

(λx.t)s→βt[x:=s],

其中右侧是无捕获替换。把规则对应用两侧和抽象体作相容闭包,就得到完整 β-归约;它允许收缩任意 β-redex。调用值、调用名等求值策略只选择其中一部分位置和步骤,因此是完整 β-归约的特定子关系。

β-归约的自反、对称、传递闭包给出 β-可转换关系 =β;它表达由若干正向或反向 β 步联系的项。一步归约 →β、有限多步 →β∗ 和等式关系 =β 的方向性不同,后续定理不能互换这些符号。

直觉

λ 演算把计算压缩成“抽象接受实参”。变量给出引用,抽象形成函数,应用把函数与实参相接,β-步骤再以代入实现调用。函数与参数采用同一种项语法,所以函数能够接收函数、返回函数,也能把自身作为数据传递。

极少的构造并不意味着执行行为简单。redex 是应用节点左侧已经出现抽象的局部形状;不必先计算整个函数体才能辨认。例如 (λx.x)((λy.y)z) 有内外两个 redex。先收缩外层会留下 (λy.y)z,先收缩内层会得到 (λx.x)z,两条路径再各走一步都到 z。这个小例子展示“选择归约位置”和“最后得到什么”是不同问题;所有分叉的可汇合性仍需要一般定理证明。

左侧列出三种构造,右侧把应用 lambda x 点 x 到 y 展开为对应抽象语法树。
例子与边界

恒等函数满足 (λx.x)y→βy。下面的项暴露了绑定边界:

(λx.λy.x)y.

若把参数 y 直接文本替换进函数体,会得到 λy.y,原本自由的 y 被内层抽象错误捕获,项的含义已经改变。正确做法先把内层绑定变量 α-换名:

(λx.λz.x)y→βλz.y.

结果中的 y 仍然自由,z 才是函数参数。两种结果 λy.y 与 λz.y 既不字面相等,也不 α-等价;错误捕获确实改变了项。

布尔值可由行为编码:

true=λt.λf.t,false=λt.λf.f.

应用左结合,故 trueab 先视为 ((λt.λf.t)a)b。对绑定变量适当换名后,两步为 (λf.a)b→a;falseab 则先得到 (λf.f)b,再得到 b。这里“数据”没有额外标签,只通过选择哪个分支表现自身。

这种选择行为不自动等于实用语言中的短路条件式。若调用值求值器在调用前求出两个分支,trueaΩ 仍会在第二实参上发散;要延迟未选分支,可先把分支包装成函数,再只调用被选中的那个。编码能否实现预期控制行为,必须连同求值策略一起判断。

无类型演算允许自应用。令

Ω=(λx.xx)(λx.xx),

则 Ω→βΩ。项 (λx.y)Ω 收缩最外层可得正规形 y,若持续归约参数却会发散。它同时说明三个边界:闭项未必终止,存在正规形不代表所有归约路径终止,完整 β-归约也不等于某个确定求值器。

推论与应用

λ 演算是函数式语言与操作语义的理论原型。替换语义直接把实参写入函数体;环境解释器则把函数表示为代码与定义环境组成的闭包。两种实现路径必须给出相同的词法绑定行为。

无类型演算可用不动点组合子在没有 let rec 原语时构造一般递归,具体 Y/Z 展开与策略边界由专页承担。

β-归约、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。
关系图谱24 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组