引言:什么算"算法"?
"算法"这个词,每个人都在用——但什么叫"算法可计算"?什么叫"机械可执行"?这些词在历史上一直是直觉的。
1900 年希尔伯特把它列入第十问题("丢番图方程是否可解的判定算法");1928 年他又提了 Entscheidungsproblem——"判定问题":是否存在一个机械程序,输入任意一阶逻辑命题,输出真/假?为了回答 Entscheidungsproblem,必须先回答更基础的问题:什么叫"机械程序"?
1930 年代初,三位互不相识、风格迥异的数学家——Alonzo Church、Kurt Gödel、Alan Turing——各自给出了"机械可计算函数"的精确定义。让人震撼的是,三个定义、三种语言,最终居然完全等价。这不是巧合——它指向一个深刻的事实:
丘奇-图灵论题(Church-Turing Thesis):所有"直观上可机械执行的算法"都可以被图灵机模拟。
这条命题不是定理——"直观可计算"不是形式概念,无法证明。但 90 年来从未找到反例。它已经从经验事实,逐渐演变成数学的"宇宙常数"——计算的绝对边界。
本章我们要回答四件事:
1936 年发生了什么?三种"计算"的定义如何同时降临?
它们为什么等价?这种等价的"奇迹"说明了什么?
论题的物理含义:宇宙是不是图灵机?
有没有可能超越图灵机?量子、连续、超图灵假说——边界还在吗?
一、三种"计算"的同时降临
(1) λ 演算(Church 1932-1936)
Church 想做的是把所有数学还原为函数与函数应用。他设计的 λ 演算只有三个原子操作:
变量
:x, y, z, …
抽象
:λx. M("输入 x,返回 M"——定义函数)
应用
:M N("把函数 M 应用到 N 上")
核心的"计算规则"叫 β-归约:
就这点东西。它居然能做所有的计算——自然数、加减乘除、布尔逻辑、递归、列表都能编码进 λ 表达式。例如自然数 n 编码为 Church 数字"把 f 应用 n 次":
而递归则需要一个看似魔法的不动点组合子 Y:
有了 Y,函数就能"调用自己"——λ 演算因此能模拟任何 while 循环。
这种"万物皆函数"的语言,是后来 Lisp、Haskell、ML 等函数式编程语言的祖先——也是现代 lambda 演算/类型论/同伦类型论的原点。
(2) 一般递归函数(Gödel-Herbrand-Kleene 1934-1936)
Gödel 在哥德尔不完备性证明中已经定义过原始递归函数:从基本函数(零、后继、投影)出发,用复合 + 原始递归构造。但原始递归不够——Ackermann 函数证明存在"算法上可计算"但不在原始递归中的函数。
Kleene 引入μ 算子(最小化)补足:
(若不存在则未定义。) 加上 μ 算子的递归函数族就叫一般递归函数(或部分递归函数)。任何一般递归函数都可以用"嵌套循环 + 不知何时结束的 while 循环"写出。
(3) 图灵机(Turing 1936)
Turing 22 岁博士论文《On Computable Numbers, with an Application to the Entscheidungsproblem》给出了现代意义上"机器"的最早数学模型:
一条向两侧无限延伸的纸带,分成离散方格,每格写一个符号;
一个读写头,可以读当前格、写、左移、右移;
一组有限的内部状态;
一个转移函数 δ : (状态, 读到的符号) → (新状态, 写的符号, 移动方向)。
就这么简单。但它是现实计算机最简洁的数学画像——你可以看作是只有一个超长内存条 + CPU + 简单指令集的"理想计算机"。
Turing 进一步定义了通用图灵机 U:把另一台图灵机 M 的描述编码成纸带上的字符串⟨M⟩,U 读 ⟨M⟩w 后能模拟 M 在输入 w 上的运行。这是"程序即数据"思想的鼻祖——后来冯·诺依曼架构(存储程序)正是这个原理的物理实现。
二、三种模型的等价性——奇迹的诞生
1936-1937 年间,几乎同时:
Church + Kleene
:λ 可定义函数 = 一般递归函数;
Turing
:图灵可计算函数 = λ 可定义函数;
Post 系统、寄存器机、计数器机
等其他模型陆续被提出,且全部等价。
这些证明都是非平凡的——比如要在 λ 演算里实现"图灵机模拟",就得用 Y 组合子构造递归,相当复杂。但关键在于结果:无论你从哪个出发,能算的函数都是同一族。
这种"奇迹般的等价"是 Church-Turing 论题的最强证据。要么所有定义同时偶然撞上"假冒的真理",要么它们都触及了同一个客观存在的概念——绝大多数数学家相信后者。
三、丘奇-图灵论题的精确陈述
原始陈述有几个版本——核心都是同一件事:
(Church 版本):所有"有效可计算"的数论函数都是一般递归函数。
(Turing 版本):所有"可由人按机械步骤计算"的过程,都可以被某台图灵机模拟。
(现代综合版本):"算法可计算"的非形式概念 = 图灵可计算(= λ 可定义 = 一般递归)。
关键三点:
它不是定理
。"直观上可机械计算"不是形式概念,无法形式化证明。它的地位类似物理定律:依赖经验和直觉验证。
已被压力测试 90 年
。任何被人类设计出的计算模型——量子、DNA、模拟、神经形态——都未突破图灵边界。
它划定的不是"现实"边界,而是"算法"边界
。物理世界是否能实现超出图灵的计算(即"物理 Church-Turing"),是另一个层次的问题。
四、为什么这种等价不是巧合?
让我们看几条更深的"等价"线索。
(1) 编程语言全部等价
C、Java、Python、JavaScript、Haskell、Lisp、Rust、Brainfuck……这些语言看起来差异巨大,但只要包含"无界循环 / 递归 / 无限存储"三件套之一,它们都是图灵完备的——能算的函数完全相同。这与 1936 年的发现是同一个事实,只是换了 70 年后的语境。
(2) 看似"更强"的模型其实并不更强
多带图灵机
:用多条纸带模拟单条,时间慢一点(多项式因子),但能算的函数集合不变;
非确定性图灵机
:可以"猜测"分支,能算什么 = 普通图灵机(计算时间可能爆炸,但可计算性等价);
量子图灵机
:能算什么 = 普通图灵机(计算时间在某些问题上多项式更快,但可计算性等价);
带随机的图灵机
:可计算性不变。
所以"快慢"和"能不能"是两个层级——丘奇-图灵谈的是后者。
(3) 模型的结构稳定性
Church-Turing 等价是一种"结构性的鲁棒"——细节怎么改(带几条、字符表多大、状态多少)都不影响最终的"能算性"边界。这种鲁棒在数学里非常罕见,强烈暗示我们摸到了一个客观对象——"可计算性"是一个柏拉图式的真实存在。
五、物理 Church-Turing 论题
1985 年 David Deutsch 把论题推到了物理层面:
物理 Church-Turing 论题(Deutsch 1985):所有"物理上可实现的计算过程"都可以被通用图灵机模拟。
它把数学论题与物理学绑在一起——宇宙的计算能力等于图灵机。这是一个比原始论题更强、更冒险、也更深刻的命题。
支持证据:
量子力学
:量子计算更快(如 Shor 算法 P 时间分解大数),但能算的函数族 = 经典图灵机;
相对论
:CTC(封闭类时曲线)原本能假设"无限时间内运算",但破坏因果性;
热力学
:Landauer 极限指明每比特擦除有 kT ln 2 的最小能耗,无限计算需无限能量。
挑战与未决问题:
模拟计算机
:如果实数能"无限精度"读取(如 BSS 模型),可超图灵——但物理上量子化与噪声让这种精度不可达;
无限可分时间 / 加速器机器
:每一步用前一步一半的时间——能在有限时间执行无穷多步。但这需要"芝诺式"的物理资源;
量子引力
:黑洞内信息处理是否突破?仍是开放问题(Susskind/Maldacena 等)。
主流物理学家相信:物理 Church-Turing 论题在已知物理定律下是正确的。它把"宇宙就是一台超大图灵机"变成了一个具体可被检验的命题。
六、超计算(Hypercomputation)
"超图灵"模型有不少有趣的玩具:
Oracle 图灵机
:带一个"先知",能瞬间回答某类问题(如停机问题),构成停机集 K 的"加权可计算性"。如果 oracle 是 ∅',能算 ∅' 中的所有问题——这开启
第 20 章 图灵度
的故事。
无限时间图灵机(ITTM)
:允许"超限步"运行,能在 ω 步、ω² 步、ε₀ 步运行,能算什么完全超出经典——但它不是物理可实现的。
BSS 模型
:基于实数 + 浮点运算,能在有限步内做"实数比较"。在这个模型里 Mandelbrot 集是可判定的——但物理实现要求无限精度。
真随机数 + 物理时钟
:能否用量子随机性突破?——目前认为不能(量子可计算性等价图灵)。
这些"超图灵"模型告诉我们:如果允许某种"无限资源",可以突破图灵边界——但所有这些超资源在物理上要么不可达、要么破坏因果性。
关于实数计算的微妙之处
有一个常被忽略的细节:经典 Church-Turing 论题谈的是自然数上的函数 f: ℕ → ℕ。但当我们想问"sin(x) 可计算吗、Mandelbrot 集可判定吗"这类实数问题时,会遇到一个分叉。
一条路径是 BSS 模型:把实数当作"原子",假设比较、加减乘除一步完成。这条路径里,几乎所有解析函数都"可计算",但它依赖一个物理上不存在的"无限精度神谕"。另一条路径是 Weihrauch 的Type-2 可计算性:把每个实数表示成一个有理数序列,规定函数 f: ℝ → ℝ 可计算,当且仅当存在图灵机能从 x 的逼近序列输出 f(x) 的逼近序列,且精度可控。在这套框架下,sin、exp、π 都可计算,但实数相等"x = y"不可判定——因为你永远只能看到有限位精度。
这个对比揭示了一件事:图灵论题之所以稳健,部分原因是它选择了"离散信息"作为计算的基本载体。一旦切换到连续对象,"可计算"的边界会随表示方式微妙地漂移。这并不否定 Church-Turing 论题,反而印证了它的精妙——论题划定的是离散符号操作的极限,而非任意"思考"的极限。
七、丘奇-图灵论题的哲学意义
(1) 计算的客观性
"算法"曾被视为人类构造的语言之一,可能因发明者风格而异。但 Church-Turing 等价告诉我们:"可计算"是一个独立于发明者、独立于语言、独立于硬件的客观概念。这是计算机科学的"哥白尼时刻"——人类不是"发明"了计算,而是"发现"了它。
(2) 编程语言民主化
不存在"最强的"编程语言。Java 不比 Lisp 强、Lisp 不比 BrainFuck 强(仅在表达性上有差异,能算的函数完全相同)。这条原则在软件工程的方法论上意义重大——选语言时考虑可读性、生态、性能,而不是"能力"。
(3) "理解" vs "执行"
停机问题(第 17 章)告诉我们:图灵机能执行所有算法,但不能判断所有算法的行为。这是一道无法跨越的鸿沟——一个能模拟整个宇宙的机器,可能仍然无法预测它的某些子过程会不会停。
(4) 心智 = 图灵机?
这是 AI 哲学最古老的问题。如果心智可以被图灵机模拟(计算主义),那么 AGI 在理论上不存在不可逾越的障碍。如果心智本质上"超越图灵"(Penrose 的"量子意识"假说等),那么 AGI 永远是模拟而不是真正的智能。这场辩论 70 年没有定论,但都是建立在 Church-Turing 论题这块磐石上的。
八、几个常见误区
误区 1:"Church-Turing 论题已被证明"
错。它不可被证明——"直观可计算"不是形式概念。它是一个由经验和无数等价性事实支撑的命题。
误区 2:"量子计算机超越了图灵机"
错。量子计算机改变了"多快能算",没改变"能不能算"。Shor 算法分解大数从指数时间降到多项式时间(速度突破),但分解本身在经典图灵机上一直可计算(只是慢)。BQP ⊆ PSPACE ⊆ 可计算函数族。
误区 3:"图灵机太弱,神经网络更强"
错。神经网络只要权重和激活函数都可计算,就被图灵机模拟(标准 ReLU + 浮点权重的网络如此)。如果允许"实数权重无限精度",理论上可超图灵——但物理上不可实现。深度学习的力量不在于"超图灵",而在于找到了一类高效可学习的函数族。
误区 4:"物理 Church-Turing 已被证明"
错。它甚至比原始论题更不可证。它是一个关于"物理实在与算法的关系"的实验性假说,由量子力学的所有已知验证、热力学、相对论一起支撑——但仍是开放问题。
九、结语:一条无字的契约
把全章压成两句话:
"算法可计算"是一个客观概念
——λ、递归、图灵机、Post 系统、寄存器机所有定义都给出同一个函数族。这是 1936 年的奇迹,也是计算机科学的诞生证书。
这个边界很可能就是宇宙的计算边界
——量子计算、DNA、模拟,都没真正越过它。物理 Church-Turing 论题进一步主张:宇宙本身就是一台(超大、平行、量子)图灵机。
更深一层:
所有"现代编程语言"都坐落在 Church-Turing 论题之上
。这是为什么"换语言不会获得新的计算能力"。
不可计算性问题(停机/丢番图/字问题)独立于具体编程语言
。它们是数学事实,不是 C 语言或 Lisp 的特性——是
计算本身的特性
。
边界不是惩罚,而是契约
——它定义了"算法能解决什么"。我们不会期待算法解决所有问题,正如不会期待物理理论解释一切——边界让事情变得可数学化。
下一章我们沿这条边界深入——第 18 章 莱斯定理:停机问题不是个别现象,"程序的所有非平凡语义性质都不可判定"。这是计算机科学最一般、最压迫性的不可能性定理。