2026-08-28·by 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.xfalse ≡ λ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.xsucc ≡ λ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:ℕ→ℕ,是指对每个 nF ⌜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。这条支脉从这里开始延伸下去。
about this entry

One of sijie's wiki entries. The AI on this site is grounded in the same corpus and answers in sijie's voice, with citations back to entries like this one — answering costs sijie money, so it waits behind a code: enter an access code →

lambda-calculus