Skip to content

λ 演算

Lambda calculus · Untyped lambda calculus

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

条目类型
模型

形式陈述

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

t::=xλx.ttt

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

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

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

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

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

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

直觉

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

极少的构造并不意味着执行行为简单。一个项可以同时含多个 redex,可能存在正规形,也可能无限归约;选择哪个 redex 属于策略,能否汇合或终止属于元理论。把这些问题分开,是 λ 演算作为核心语言的价值。

左侧列出三种构造,右侧把应用 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βafalseabβb。这里“数据”没有额外标签,只通过选择哪个分支表现自身。

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

Ω=(λ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。
关系图谱25 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

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

使用的工具