2026-08-28·作者 Sijie Wang#idea#math

lambda-calculus

λ 演算及其与图灵机的等价性

上级:logic

丘奇(Church)的 λ 演算(1930 年代初)是"可计算"这个概念的另一种定义——它诞生于函数,而非机器。两者能力相同,气质相反:图灵 → 通向计算机,丘奇 → 通向证明助手。

演算本身——三种构造,一条规则

项与 β-归约

项: 一个变量 x;一个抽象(abstraction)λx.M(即函数 x ↦ M);一个应用(application)M N。 计算规则(β-归约): (λx.M) N → M[x := N]——用实参替换被绑定的变量。(此外 α 表示绑定变量的重命名,η 表示外延性。) 计算 = 反复做 β-归约,直到得到一个范式(normal form,即不再含可归约项),如果存在这样一个范式的话。

一切都是函数——没有内建的数字、布尔值或循环,它们全部都是编码出来的。

为什么它有图灵机那么强

  • 丘奇数(Church numerals): n ≡ λf.λx. f (f (… (f x)))——"把 f 应用 n 次"。有了它,succ、+、×、exp 就都可以写成 λ 项。
  • 数据: true ≡ λx.λy.x,false ≡ λx.λy.y,以及序对、列表——都可以编码。
  • 不靠名字实现的递归: Y 组合子 Y ≡ λf.(λx.f (x x)) (λx.f (x x)) 满足 Y g = g (Y g)——这是一个不动点算子,由它给出无界递归。它是克莱尼(Kleene)μ-算子 / while 循环在 λ 世界里的对应物——正是它把这套演算从原始递归提升到了完整的图灵能力。

手算一遍

K a b = a(这个"取第一个"组合子),一步步做——每个 ⇒ 都是一次 β-归约:

(λx.λy.x) a b   ⇒   (λy.a) b   ⇒   a

丘奇算术同样机械——succ 0 = 1,其中 0 ≡ λf.λx.x、succ ≡ λn.λf.λx. f (n f x):

(λn.λf.λx. f (n f x)) (λf.λx.x)
  ⇒  λf.λx. f ((λf.λx.x) f x)
  ⇒  λf.λx. f ((λx.x) x)
  ⇒  λf.λx. f x            = 1

写成代码——解释器小得惊人

data Term = Var String | Lam String Term | App Term Term

subst :: String -> Term -> Term -> Term          -- [x := s] t  (naive; closed terms only)
subst x s (Var y)   = if x == y then s else Var y
subst x s (App a b) = App (subst x s a) (subst x s b)
subst x s (Lam y t) = if x == y then Lam y t else Lam y (subst x s t)

beta :: Term -> Maybe Term                        -- one normal-order step
beta (App (Lam x t) s) = Just (subst x s t)       -- the β-redex
beta (App a b)         = case beta a of
                           Just a' -> Just (App a' b)
                           Nothing -> App a <$> beta b
beta (Lam x t)         = Lam x <$> beta t
beta _                 = Nothing

normalize :: Term -> Term
normalize t = maybe t normalize (beta t)

整个语言就是三个构造子加一条规则——β 归约只是一次模式匹配。(真正的解释器还会加上α-重命名以避免变量捕获,这里省略了。)

等价性(丘奇、克莱尼、图灵,1936–37)

λ-可定义 = 图灵可计算 = 一般递归

一个数论函数可由某个 λ 项定义(借助丘奇数)当且仅当它可被某台图灵机计算当且仅当它是一般递归的。

Proof

先固定接口:一个封闭的 λ 项 F 计算了 f:ℕ→ℕ,是指对每个 n,F ⌜n⌝ 都 β-归约到 ⌜f(n)⌝,其中 ⌜n⌝ 是对应的丘奇数。要证明的是:F-可定义的 f 与图灵机可计算的 f 是同一批函数。

TM → λ。 转移表 δ 是有限的,所以可以写出一个 λ 项 step,它对编码后的 (状态, 读到的符号) 做分支判断——用到布尔值/序对/列表的编码——并返回下一个格局(写下的符号、读写头移动方向、新状态)。把整个格局也编码成一个 λ 项(纸带 = 一对列表加读写头符号加状态)。然后用 Y 反复迭代 step,配合一个布尔的 halted? 判断,直到进入停机状态;读出纸带内容即得 ⌜f(n)⌝。于是每一个图灵机可计算的函数都是 λ-可定义的。

λ → TM。 替换 M[x:=N] 以及"找到最左最外层的可归约项",都是关于项的字符串编码的原始递归操作——所以一台图灵机可以执行一步正规序(normal-order)β-归约,并不断重复。由标准化定理(standardization theorem)可知,只要范式存在,正规序归约就一定能到达它;因此当且仅当 F ⌜n⌝ 有范式时,这台图灵机才会输出 ⌜f(n)⌝。

两个方向的模拟都是可行的(effective),所以这两类函数相等(再由克莱尼的结果,它们也等于一般递归函数这一类)。∎

丘奇–罗瑟定理(合流性)

β-归约是合流的(confluent):如果一个项沿两条不同路径归约,其结果总能重新汇合到一起。因此范式一旦存在就是唯一的——即便归约的顺序是自由的,答案本身与顺序无关。

为什么它在后续脉络中重要

  • 它是丘奇为丘奇–图灵论题提供的见证;图灵 1936 年的论文加了一个附录证明了两者的等价性,把两条路统一了起来。
  • 无类型的 λ 演算是函数式编程(Lisp → ML → Haskell)的源头。
  • 加上类型之后 → 得到带类型的诸 λ 演算,其中每个项都带着一个类型,而 柯里–霍华德对应使得程序 = 证明,类型 = 命题 → 通向依值类型论 → Lean 4。这条支脉从这里开始延伸下去。
關於這一條

sijie 的一條 wiki 條目。本站的 AI 以同一套語料庫為依據、以 sijie 的口吻作答,並附有指向此類條目的引用——回答會花 sijie 的錢,所以它在存取碼後等待: 輸入存取碼 →

lambda-calculus — Sijie Wang