“递归定理”的版本间的差异

来自集智百科 - 复杂系统|人工智能|复杂科学|复杂网络|自组织
跳到导航 跳到搜索
第12行: 第12行:
  
 
'''第一递归定理(日常语言版)''':''任何递归定义——即把一个函数在某处的值,写成它自己在其他输入上的值(比如阶乘 <math>fac(n) = n\cdot fac(n−1)</math>)——都必然有解'' ,而且其中"最小"的那个解一定能被机器算出。换句话说,'''机械式的递归定义永远合法、永远有解'''。<ref name="rogers1967" />
 
'''第一递归定理(日常语言版)''':''任何递归定义——即把一个函数在某处的值,写成它自己在其他输入上的值(比如阶乘 <math>fac(n) = n\cdot fac(n−1)</math>)——都必然有解'' ,而且其中"最小"的那个解一定能被机器算出。换句话说,'''机械式的递归定义永远合法、永远有解'''。<ref name="rogers1967" />
 +
 +
两个定理的对照表(其中涉及的符号会在第二节逐一解释,此处可先跳过细节):
 +
 +
{| class="wikitable"
 +
|-
 +
!
 +
! '''第一递归定理'''(First Recursion Theorem, FRT)
 +
! '''第二递归定理'''(Second Recursion Theorem, SRT)
 +
|-
 +
| '''作用对象'''
 +
| 函数本身("把函数变成函数"的规则)
 +
| 程序的编号(代码)
 +
|-
 +
| '''结论'''
 +
| 任何可计算的函数变换规则 <math>\Psi</math> 都有最小[[不动点]] <math>\phi</math>,且 <math>\phi</math> 是可计算的:<math>\Psi(\phi) = \phi</math>
 +
| 任何可计算的程序变换规则 <math>f</math> 都有不动点 <math>n</math>:程序 <math>n</math> 与程序 <math>f(n)</math> 计算同一个函数,记作 <math>\phi_n = \phi_{f(n)}</math>
 +
|-
 +
| '''数学血统'''
 +
| [[序理论]]中 [[Knaster–Tarski 不动点定理]]的"可计算版本"<ref name="rogers1967" />
 +
| [[对角线方法]](diagonalization,[[Cantor]]、[[Gödel]]、[[Turing]] 用过的同一种论证技术)的集大成者<ref name="rogers1967" />
 +
|-
 +
| '''别称'''
 +
| 弱递归定理
 +
| 强递归定理、Kleene 不动点定理
 +
|-
 +
| '''首次出现'''
 +
| Kleene (1952)《元数学导论》中明确表述<ref name="kleene1952">Kleene, S. C. (1952). ''Introduction to Metamathematics''. D. Van Nostrand.【第一递归定理的明确表述】</ref><ref name="moschovakis2010" />
 +
| Kleene (1938) §2 末尾,当时甚至没有名字,证明只有两行<ref name="kleene1938" />
 +
|}
 +
[[文件:两种“不动点”.png|替代=两种“不动点”|缩略图|图2:两个定理的"不动点"含义截然不同——左:函数 <math>\phi</math>经变换<math>\Psi</math> 后变回 <math>\phi</math>(函数层面);右:程序 <math>n</math> 经变换 <math>f</math> 后变成另一个程序 <math>f(n)</math>(通常<math> f(n) \neq n</math>),但<math>\phi_n = \phi_{f(n)}</math>('''代码变了,行为不变''')。§2.5 对此有详细辨析。]]

2026年9月10日 (四) 06:07的版本

递归定理(recursion theorem)递归函数论——即可计算性理论(computability theory,研究"什么问题原则上可以被机械地计算"的学科)——中的一组基本定理,由Stephen Cole Kleene提出,合称 Kleene 递归定理,包括两条:第一递归定理: 任何用递归方式定义的函数方程都有可计算的(最小)解——机械式的递归定义永远合法、永远有解;第二递归定理: 对任何可计算的全函数 [math]\displaystyle{ f }[/math],总存在源程序[math]\displaystyle{ c }[/math],使得执行[math]\displaystyle{ c }[/math]与执行[math]\displaystyle{ f(c) }[/math] 效果完全相同([math]\displaystyle{ \phi_c = \phi_{f(c)} }[/math])——程序可以合法地引用自己的代码。

两条之中,第二递归定理尤为重要,它是数学中对自指(self-reference)现象最简洁、最有力的统一陈述:它只有一步对角线证明 `[math]\displaystyle{ c = S(e, e) }[/math]`([math]\displaystyle{ S }[/math] 是"把程序的部分输入写死、生成新程序"的柯里化操作,详见 §2.3),却统一了从罗素悖论(1901)、Gödel不完备定理(1931)、Turing停机问题(1936)、von Neumann 自复制自动机(1948)到今天的Quine程序(1960s)等全部自指现象——它们本质上是同一种对角线/自指结构的不同化身(详 §5.7)。

自指家族
图1:六个经典自指现象——Cantor对角线(1891)、Russell悖论(1901)、Gödel不完备定理(1931)、Turing停机问题(1936)、von Neumann自复制(1948)、Quine(自打印程序,1960s)——都源于同一种对角线/自指原理;Kleene 第二递归定理是这一原理最一般的陈述。


总览:两个定理各说了什么

Kleene 递归定理是关于自指(self-reference,即一个系统"谈论"自身)不动点(fixed point,即变换后保持不变的点)两个基本定理的合称。先用日常语言各说一遍,再给出精确表述。

第二递归定理(日常语言版):对任何可计算的全函数 [math]\displaystyle{ f }[/math](一个对任何输入都停机的"程序变换"),总存在一个源程序 [math]\displaystyle{ c }[/math],使得执行 [math]\displaystyle{ c }[/math] 的效果,等同于执行 [math]\displaystyle{ f(c) }[/math]——即 [math]\displaystyle{ f }[/math] 拿着 [math]\displaystyle{ c }[/math] 自己的源代码算出来的那个程序。 用符号写就是:[math]\displaystyle{ \phi_c = \phi_{f(c)} }[/math][1].

第一递归定理(日常语言版):任何递归定义——即把一个函数在某处的值,写成它自己在其他输入上的值(比如阶乘 [math]\displaystyle{ fac(n) = n\cdot fac(n−1) }[/math])——都必然有解 ,而且其中"最小"的那个解一定能被机器算出。换句话说,机械式的递归定义永远合法、永远有解。[1]

两个定理的对照表(其中涉及的符号会在第二节逐一解释,此处可先跳过细节):

第一递归定理(First Recursion Theorem, FRT) 第二递归定理(Second Recursion Theorem, SRT)
作用对象 函数本身("把函数变成函数"的规则) 程序的编号(代码)
结论 任何可计算的函数变换规则 [math]\displaystyle{ \Psi }[/math] 都有最小不动点 [math]\displaystyle{ \phi }[/math],且 [math]\displaystyle{ \phi }[/math] 是可计算的:[math]\displaystyle{ \Psi(\phi) = \phi }[/math] 任何可计算的程序变换规则 [math]\displaystyle{ f }[/math] 都有不动点 [math]\displaystyle{ n }[/math]:程序 [math]\displaystyle{ n }[/math] 与程序 [math]\displaystyle{ f(n) }[/math] 计算同一个函数,记作 [math]\displaystyle{ \phi_n = \phi_{f(n)} }[/math]
数学血统 序理论中 Knaster–Tarski 不动点定理的"可计算版本"[1] 对角线方法(diagonalization,Cantor、Gödel、Turing 用过的同一种论证技术)的集大成者[1]
别称 弱递归定理 强递归定理、Kleene 不动点定理
首次出现 Kleene (1952)《元数学导论》中明确表述[2][3] Kleene (1938) §2 末尾,当时甚至没有名字,证明只有两行[4]
两种“不动点”
图2:两个定理的"不动点"含义截然不同——左:函数 [math]\displaystyle{ \phi }[/math]经变换[math]\displaystyle{ \Psi }[/math] 后变回 [math]\displaystyle{ \phi }[/math](函数层面);右:程序 [math]\displaystyle{ n }[/math] 经变换 [math]\displaystyle{ f }[/math] 后变成另一个程序 [math]\displaystyle{ f(n) }[/math](通常[math]\displaystyle{ f(n) \neq n }[/math]),但[math]\displaystyle{ \phi_n = \phi_{f(n)} }[/math](代码变了,行为不变)。§2.5 对此有详细辨析。
  1. ↑ 1.0 1.1 1.2 1.3 Rogers, H., Jr. (1967). Theory of Recursive Functions and Effective Computability. McGraw-Hill. 第 11 章 The Recursion Theorem, pp. 179–222.【教科书标准表述;第一/第二递归定理的命名来源】
  2. ↑ Kleene, S. C. (1952). Introduction to Metamathematics. D. Van Nostrand.【第一递归定理的明确表述】
  3. ↑ 引用错误:无效<ref>标签;未给name属性为moschovakis2010的引用提供文字
  4. ↑ 引用错误:无效<ref>标签;未给name属性为kleene1938的引用提供文字