2026-08-28·by Sijie Wang#idea#math

ackermann

阿克曼函数——完全可计算,但不是原始递归

父级:recursive-functions

primitive recursion ⊊ 完全可计算的经典见证:一个你显然能计算、却没有任何 for 循环程序能计算的函数。

阿克曼函数

A(0, n) = n + 1 A(m+1, 0) = A(m, 1) A(m+1, n+1) = A(m, A(m+1, n)) 最后一行在自己的参数内部递归——是嵌套,不是单纯的计数器。

A完全的(每次调用都会终止——数对 (m,n) 按字典序严格递减),也显然是可计算的(照规则执行即可)。

Theorem

A 不是原始递归的 阿克曼函数比任何原始递归函数都增长得快。

Proof

支撑证明的是一条支配引理:每一个原始递归函数都被某个单一的阿克曼层级封顶。我们要用到 A 的几条标准单调性(均可用归纳法证明):A(m,n) > nA 在每个参数上都严格递增;以及层级吸收A(a, A(b,n)) ≤ A(max(a,b)+2, n)——嵌套两层的代价只是一个常数。

引理。 对任意原始递归函数 f(x₁,…,xₖ),都存在一个固定层级 t,使得对所有输入都有 f(x⃗) < A(t, max(x⃗))

f 的构造做结构归纳来证明。

  • 基础情形。 零函数 = 0、后继函数 = A(0,x)、投影函数 ≤ max(x⃗)——全部都 < A(1, max(x⃗))
  • 复合。 f = g(h₁,…,hⱼ)。由归纳假设,每个 hᵢ < A(u, max(x⃗))(取最大的 u),且 g < A(s, 其参数的最大值)。于是 f < A(s, A(u, max(x⃗))) ≤ A(max(s,u)+2, max(x⃗)),由层级吸收得到——仍是一个固定层级。
  • 原始递归。 f(0,x⃗)=g(x⃗)f(n+1,x⃗)=h(n,f(n,x⃗),x⃗),由归纳假设 g < A(p,·)h < A(q,·)。展开递归:每一步都套用一次(被 A(q,·) 界定的)操作,共 n 层深。而 A(q,·) 迭代 n 次仍不超过 A(q+1, n+·)——这恰好就是递推式 A(q+1, n+1) = A(q, A(q+1, n))。所以 f < A(q+2, n + max(x⃗))——同样是一个固定层级。

每一种构造方式都只把所需层级抬高一个常数,所以任何固定的原始递归函数 f 都落在某个固定层级 t 之下。∎(引理证毕)

现在对角化。 假设 A 确实是原始递归的。那么 g(n) = A(n,n) + 1 也是原始递归的(把 A 与对角线复合而成),于是引理给出一个固定的 t,使得对所有 n 都有 g(n) < A(t, n)。令 n = tA(t,t) + 1 = g(t) < A(t, t)——矛盾。所以 A 不是原始递归的。∎

寓意:一个原始递归函数被困在层级体系 A(0,·), A(1,·), A(2,·), … 中某个固定的梯级 t 上;而 A(n,n)n 一路往上爬梯级,所以它逃出了每一个固定梯级。

增长速度极其剧烈:A(4,2) 就已经有 19,729 位十进制数字。这份额外的威力来自嵌套递归——恰恰是有界计数器无法表达的东西,也预示了 general-recursion 中那种无界搜索。(A 本身依然是完全的;你还不需要不终止性——但你已经离开了 for 循环的世界。)

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 →