第7章递归论的基本知识 递归论是递归函数论的简称。它数理逻辑的一个重要分支,由于递归函数是直观上的 可计算函数的精确化,递归论也被称为可计算性理论。 递归论创立于1930年代,最初是为了精确定义可计算性(即可判定性),有了可计 算性(可判定性)的精确定义,人们才可以证明什么是不可计算的或不可判定的。很多 经典的不可判定性结果,如停机问题和一阶逻辑的普遍有效性都是不可判定的,都是在 1930年代建立的。之后人们的注意力转向了各种相对可计算性和由此产生的(不可解) 度的研究。递归论的现代口号是研究可定义性,因为可定义性是可计算性的一种自然推 。依照对可定义性要求苛刻程度的大小,递归论的研究范围包括:(部分)理论计算机 科学,古典递归论(一阶算术),(部分)描述集合论和(部分)集合论。还有各类高等递 归论等等。 我们介绍递归论的动机除了了解可计算性概念之外,在系统内“表示”递归关系也是 证明哥德尔不完全性定理的重要组成部分。 第1节原始递归函数 711原始递归函数的定义 定义71.以下三类函数称为初始函数:零函数Z(x)=0,后继函数S(x),和投射函数 r(x1,…,xn)=x1,其中n为正整数且1≤i≤n 令n为自然数,且g:Nn→N和h:Nn+2→N分别为m-元和(n+2)-元函数。我们 称(n+1)-元函数∫:N+1→N为从g和h经原始递归得到的,如果 f(rr 且 rn,y+1)=h(x1,……,xn,y,f(x1 )) (注意:这里的y+1实际上是y的后继S(y),严格地说,并不是加法。) 为方便起见,我们规定一个0-元函数g就是一个固定常数c,这样一元函数∫也可以 像上面一样从g和h经原始递归得到 f(0)=c,且f(y+1)=h(y,f(y) (7.1)
第 7 章 递归论的基本知识 递归论是递归函数论的简称。它数理逻辑的一个重要分支,由于递归函数是直观上的 可计算函数的精确化,递归论也被称为可计算性理论。 递归论创立于 1930 年代,最初是为了精确定义可计算性(即可判定性),有了可计 算性(可判定性)的精确定义,人们才可以证明什么是不 可计算的或不 可判定的。很多 经典的不可判定性结果,如停机问题和一阶逻辑的普遍有效性都是不可判定的,都是在 1930 年代建立的。之后人们的注意力转向了各种相对可计算性和由此产生的(不可解) 度的研究。递归论的现代口号是研究可定义性,因为可定义性是可计算性的一种自然推 广。依照对可定义性要求苛刻程度的大小,递归论的研究范围包括:(部分)理论计算机 科学,古典递归论(一阶算术),(部分)描述集合论和(部分)集合论。还有各类高等递 归论等等。 我们介绍递归论的动机除了了解可计算性概念之外,在系统内“表示”递归关系也是 证明哥德尔 不完全性定理的重要组成部分。 第 1 节 原始递归函数 7.1.1 原始递归函数的定义 定义 7.1. 以下三类函数称为初始函数:零函数 Z(x) = 0,后继函数 S(x),和投射函数 π n i (x1, · · · , xn) = xi,其中 n 为正整数且 1 ≤ i ≤ n。 令 n 为自然数,且 g : N n → N 和 h : N n+2 → N 分别为 n- 元和 (n + 2)-元函数。我们 称 (n + 1)-元函数 f : N n+1 → N 为从 g 和 h 经原始递归 得到的,如果 f(x1, · · · , xn, 0) = g(x1, · · · , xn), 且 f(x1, · · · , xn, y + 1) = h(x1, · · · , xn, y, f(x1, · · · , xn, y))。 (注意:这里的 y + 1 实际上是 y 的后继 S(y),严格地说,并不是加法。) 为方便起见,我们规定一个 0-元函数 g 就是一个固定常数 c,这样一元函数 f 也可以 像上面一样从 g 和 h 经原始递归得到: f(0) = c, 且 f(y + 1) = h(y, f(y))。 (7.1) 1
第1节原始递归函数 第7章递归论的基本知识 定义72.全体原始递归函数的集合C是最小的满足下列条件的集合 1)所有的初始函数都在C中。 (2)C对函数复合封闭,即,如果f(x1,…,xn)=g(h1(x1,…,xn),…,hr(x1,…,xrn), 并且g(v,…,y)和ha(x1,…,xn)(1≤i≤r)都在C中,则∫也在C中。 (3)C对原始递归封闭。 我们称C中的元素为原始递归函数。 在第??章第??节中我们讨论过关于闭包的“自上而下”和“自下而上”的定义方 式,并且论证了它们是等价的。定义??是“自上而下”的,换成“自下而上”的等价 形式,我们有:每个原始递归函数f都有一个有穷的生成序列:《f1,f2,…,f),其中 fn=f并且对任意1≤i≤n,f或者是初始函数,或者是由前面的函数通过复合或 原始递归得到的。注意生成序列是不唯一的。我们可以沿着生成序列做归纳。例如,我 们可以证明所有的原始递归函数都是全函数,即,如果∫:Ⅳ→N是原始递归的,则 dom∫=Ⅳ(练习)。此外,也请大家思考一下所有的原始递归函数的确都是直观上可计 算的 例71.自然数的加法是原始递归的。通常是利用后继函数由下列递归方程定义的 (y+1)=S(x+y) 作为例子,我们给出它的一个生成序列:(今后我们将只给递归方程,而将生成序列 留给对方程有疑义的读者。) S(x1)(后继函数),H(x1)=x1(一元投射函数),n3(x1,x2,x3)=x3(三元投射函 数),g(x1,x2,x3)=Soπ3(x1,x2,x3)=S(x3)(第一项与第三项的复合),f(x1,x2)(由 第二项和第四项经原始递归得到) ∫(x1,y+1)=g(x1,y,f(x1,y) 显然,f(x,y)=x+ 引理7.1.下列函数都是原始递归的: 1.常数函数C(x1,…,xn)=k,其中k是一个固定的自然数。 2乘法函数x·y、指数函数xy和阶乘函数x!
第 1 节 原始递归函数 第 7 章 递归论的基本知识 定义 7.2. 全体原始递归函数 的集合 C 是最小的满足下列条件的集合: (1) 所有的初始函数都在 C 中。 (2) C 对函数复合封闭,即,如果 f(x1, · · · , xn) = g(h1(x1, · · · , xn), · · · , hr(x1, · · · , xn)), 并且 g(y1, · · · , yr) 和 hi(x1, · · · , xn) (1 ≤ i ≤ r)都在 C 中,则 f 也在 C 中。 (3) C 对原始递归封闭。 我们称 C 中的元素为原始递归函数。 在第 ?? 章第 ?? 节中我们讨论过关于闭包的“自上而下”和“自下而上”的定义方 式,并且论证了它们是等价的。定义 ?? 是“自上而下”的,换成“自下而上”的等价 形式,我们有:每个原始递归函数 f 都有一个有穷的生成序列:⟨f1, f2, · · · , fn⟩,其中 fn = f 并且对任意 1 ≤ i ≤ n,fi 或者是初始函数,或者是由前面的函数通过复合或 原始递归得到的。注意生成序列是不唯一的。我们可以沿着生成序列做归纳。例如,我 们可以证明所有的原始递归函数都是全 函数,即,如果 f : N n → N 是原始递归的,则 domf = N n(练习)。此外,也请大家思考一下所有的原始递归函数的确都是直观上可计 算的。 例 7.1. 自然数的加法是原始递归的。通常是利用后继函数由下列递归方程定义的: x + 0 = x, x + (y + 1) = S(x + y)。 作为例子,我们给出它的一个生成序列:(今后我们将只给递归方程,而将生成序列 留给对方程有疑义的读者。) S(x1) (后继函数),π 1 1 (x1) = x1 (一元投射函数),π 3 3 (x1, x2, x3) = x3 (三元投射函 数),g(x1, x2, x3) = S ◦ π 3 3 (x1, x2, x3) = S(x3) (第一项与第三项的复合),f(x1, x2) (由 第二项和第四项经原始递归得到) f(x1, 0) = π 1 1 (x1); f(x1, y + 1) = g(x1, y, f(x1, y))。 显然,f(x, y) = x + y。 引理 7.1. 下列函数都是原始递归的: 1. 常数函数 C n k (x1, · · · , xn) = k,其中 k 是一个固定的自然数。 2. 乘法函数 x · y、指数函数 x y 和阶乘函数 x!。 2
第7章递归论的基本知识 第1节原始递归函数 3.如下定义的非零检测函数σ和零检测函数δ 0,如果x=0; 1,如果x=0; 如果x≠ 6(x) 0,如果x≠ 4.前驱函数pred(x) 5.如下定义的截断减法(或减法) 如果 否则 证明:练习 利用投射函数,我们可以将一个原始递归函数的自变量任意重排,所得到的仍是原始 递归函数。具体地说,我们有下面的引理 引理72令f:Ⅳ→N为一个原始递归函数。定义一个新的函数g:N→N为g(x1,…,xr)= f(,…,纵),其中每个v或者是x1(1≤i≤r)或者是一个常数。则g也是原始递归 的 证明:g可以通过复合从f和投影或常数函数得到。 例如,如果f(x,y)是原始递归的,则g(x)=f(x,x)和h(x,y,z)=f(z,y)也是。 71,2原始递归集合和谓词 在数学中,人们常常利用特征函数把集合“转化”成函数。对一个k-元谓词P,我 们也可以定义它的特征函数为 1,如果P()成立; XP(C) 0,否则 利用特征函数,我们很自然地把原始递归的概念从函数扩展到集合和谓词。 我们称Ⅳ的一个子集A或一个k-元谓词P为原始递归的,如果它的特征函数是 个原始递归函数。一个k-元谓词P为原始递归的也可等价地定义为集合{:P(动}是一 个原始递归的集合。 例如,二元谓词=和≤都是原始递归的(练习)。 引理73. 1.如果A,B≤Ⅳ都是原始递归的集合,则Ⅳ-A,AUB和A∩B也是
第 7 章 递归论的基本知识 第 1 节 原始递归函数 3. 如下定义的非零检测 函数 σ 和零检测 函数 δ: σ(x) = { 0, 如果 x = 0; 1, 如果 x ̸= 0。 δ(x) = { 1, 如果 x = 0; 0, 如果 x ̸= 0。 4. 前驱函数 pred(x)。 5. 如下定义的截断减法 (或减法) x−˙ y = { 0, 如果 x < y; x − y, 否则。 证明: 练习。 利用投射函数,我们可以将一个原始递归函数的自变量任意重排,所得到的仍是原始 递归函数。具体地说,我们有下面的引理: 引理7.2. 令 f : N k → N 为一个原始递归函数。定义一个新的函数g : N r → N 为 g(x1, · · · , xr) = f(y1, · · · , yk),其中每个 yj 或者是 xi(1 ≤ i ≤ r)或者是一个常数。则 g 也是原始递归 的。 证明: g 可以通过复合从 f 和投影或常数函数得到。 例如,如果 f(x, y) 是原始递归的,则 g(x) = f(x, x) 和 h(x, y, z) = f(z, y) 也是。 7.1.2 原始递归集合和谓词 在数学中,人们常常利用特征函数把集合“转化”成函数。对一个 k-元谓词 P ,我 们也可以定义它的特征函数为: χP (⃗x) = { 1, 如果 P(⃗x) 成立; 0, 否则。 利用特征函数,我们很自然地把原始递归的概念从函数扩展到集合和谓词。 我们称 N k 的一个子集 A 或一个 k-元谓词 P 为原始递归的,如果它的特征函数是一 个原始递归函数。一个 k-元谓词 P 为原始递归的也可等价地定义为集合 {⃗x : P(⃗x)} 是一 个原始递归的集合。 例如,二元谓词 = 和 ≤ 都是原始递归的(练习)。 引理 7.3. 1. 如果 A, B ⊆ N k 都是原始递归的集合,则 N k − A, A ∪ B 和 A ∩ B 也是。 3
第1节原始递归函数 第7章递归论的基本知识 2.如果P和Q都是原始递归的谓词,则→P,PVQ和P∧Q也是。 引理74(分情形定义)如果∫和彡都是原始递归函数,并且P是原始递归谓词,则函数 f(r f1(x),如果P(x)成立 f2(x),否则 也是原始递归的。 用程序语言来说,我们可以执行条件判断的指令。 证明:∫(x)=f(x)XP(x)+f2(x)(1-xP(x) 现在我们可以处理四则运算的最后一则运算-除法了。首先用符号quo(x,y)和rem(x,y)分 别表示用x去除y而得到的商和余数。为了使它们成为全函数,我们规定quo(0,y) 0和rem(0,y) 引理75.函数quo(x,y)和rem(x,y)都是原始递归的。 证明:基本思路是利用下面的递归定义,我们把对定义的仔细分析留给读者。 rem(a,y+1)= em(x,y)+1,如果rem(x,y)+1≠x 否则。 和 quo(a, y+ 1) quo(x,y)+1,如果rem(x,y)+1=x (x,y),否则 回忆一下关于有界量词的定义。我们定义(丑x<a)yp(x)为彐(x<a∧y(x)和定 义(x<a)y(x)为r(x<a→y(x)。 接下来我们引进有界极小算子。下文中的希腊字母p可以读作“最小的” 定义73.令P(,2)为一个(k+1)-元的性质。定义 (1z≤y)P(x,z) 最小的满足P(,z)且≤y的z,如果它存在; y+1 否则 引理76.如果f(,y)是原始递归的,则有界和∑<:f(x,y)和有界积Ⅱl<:f(x,y)都是 原始递归的。 证明:练习
第 1 节 原始递归函数 第 7 章 递归论的基本知识 2. 如果 P 和 Q 都是原始递归的谓词,则 ¬P,P ∨ Q 和 P ∧ Q 也是。 引理 7.4 (分情形定义). 如果 f1 和 f2 都是原始递归函数,并且 P 是原始递归谓词,则函数 f(x) = { f1(x), 如果 P(x) 成立; f2(x), 否则 也是原始递归的。 用程序语言来说,我们可以执行条件判断的指令。 证明: f(x) = f1(x)χP (x) + f2(x)(1−˙ χP (x))。 现在我们可以处理四则运算的最后一则运算—除法了。首先用符号quo(x, y) 和 rem(x, y) 分 别表示用 x 去除 y 而得到的商和余数。为了使它们成为全函数,我们规定 quo(0, y) = 0 和 rem(0, y) = 0。 引理 7.5. 函数 quo(x, y) 和 rem(x, y) 都是原始递归的。 证明: 基本思路是利用下面的递归定义,我们把对定义的仔细分析留给读者。 rem(x, y + 1) = { rem(x, y) + 1, 如果 rem(x, y) + 1 ̸= x; 0, 否则。 和 quo(x, y + 1) = { quo(x, y) + 1, 如果 rem(x, y) + 1 = x; quo(x, y), 否则。 回忆一下关于有界量词 的定义。我们定义 (∃x < a)φ(x) 为 ∃x(x < a ∧ φ(x)) 和定 义 (∀x < a)φ(x) 为 ∀x(x < a → φ(x))。 接下来我们引进有界极小算子。下文中的希腊字母 µ 可以读作“最小的”。 定义 7.3. 令 P(⃗x, z) 为一个 (k + 1)-元的性质。定义 (µz ≤ y)P(⃗x, z) = { 最小的满足 P(⃗x, z) 且 ≤ y 的 z, 如果它存在; y + 1, 否则。 引理 7.6. 如果 f(⃗x, y) 是原始递归的,则有界和 ∑ y≤z f(⃗x, y) 和有界积 ∏ y≤z f(⃗x, y) 都是 原始递归的。 证明: 练习。 4
第7章递归论的基本知识 第1节原始递归函数 我们用符号X:=Y表示X是按照Y来定义的,或按照Y定义的那个X。 引理77.假定P(x,x)是一个原始递归的谓词。则 )谓词E(,y):=(3z≤y)P(x,z)和A(,y):=(z≤)P(正,z)都是原始递归的。 b)函数f(x,y):=(z≤y)P(z,z)也是原始递归的 证明:(a)根据定义,我们有:谓词(vz≤y)P(,2)为真当且仅当∏syxP(,2)=1;并 且谓词(彐z≤y)P(x,z)等价于一(Vz≤y)-P(z,z)。由此可以得到(a)。 今()只须注意(2≤y)P(,2)=∑=0I=0x(n)即可。特别注意当满足条件 不存在时,等式右边恰恰等于y+1。 713编码 我们下面讨论一些有关素数的可计算性,目的是利用素数分解定理来编码 引理7.8.(1丿)谓词“x整除y”是原始递归的。 2)谓词“x是合数”和“x是素数”都是原始递归的 (3)函数p(n):=第n个素数是原始递归的。这个函数我们今后经常会用到。p(m)也常 被写作pn,例如,p=2,p1=3,P2=5,…等等。 证明:练习。 我们现在可以利用素数分解定理来能行地编码了。 定义74.(以)我们用尖括号(aon…,an)来表示乘积p+ 并把它称为有穷 序列(ao,…,an)的哥德尔数。定义空序列()的哥德尔数为1 (2)定义函数h:N→N为lh(a)=k≤a(Pk十a)。我们称lha)为长度函数,因 为h(1)=0且对于任意的哥德尔数a={a0,…,an},都有lha)=n+1 (3)定义关于a和i的二元函数(a)1=k≤a四+2+d。我们称(a)为分量函数,因为 它刚好从编码为a的有穷序列中挑出第i项:对任意的哥德尔数a={(a,…,an}), (a)=a1(0≤i≤n)。 4)对自然数a,b定义串接函数a^b如下 i<Ih(b
第 7 章 递归论的基本知识 第 1 节 原始递归函数 我们用符号 X := Y 表示 X 是按照 Y 来定义的,或按照 Y 定义的那个 X。 引理 7.7. 假定 P(⃗x, z) 是一个原始递归的谓词。则 (a) 谓词 E(⃗x, y) := (∃z ≤ y)P(⃗x, z) 和 A(⃗x, y) := (∀z ≤ y)P(⃗x, z) 都是原始递归的。 (b) 函数 f(⃗x, y) := (µz ≤ y)P(⃗x, z) 也是原始递归的。 证明: (a) 根据定义,我们有:谓词 (∀z ≤ y)P(⃗x, z) 为真当且仅当 ∏ z≤y χP (⃗x, z) = 1;并 且谓词 (∃z ≤ y)P(⃗x, z) 等价于 ¬(∀z ≤ y)¬P(⃗x, z)。由此可以得到 (a)。 (b) 只须注意 (µz ≤ y)P(⃗x, z) = ∑y z=0 ∏z r=0 χ¬P (⃗x, r) 即可。特别注意当满足条件 的 z 不存在时,等式右边恰恰等于 y + 1。 7.1.3 编码 我们下面讨论一些有关素数的可计算性,目的是利用素数分解定理来编码。 引理 7.8. (1) 谓词“x 整除 y”是原始递归的。 (2) 谓词“x 是合数”和“x 是素数”都是原始递归的。 (3) 函数 p(n) := 第 n 个素数 是原始递归的。这个函数我们今后经常会用到。p(n) 也常 被写作 pn,例如,p0 = 2, p1 = 3, p2 = 5, · · · 等等。 证明: 练习。 我们现在可以利用素数分解定理来能行地编码了。 定义 7.4. (1) 我们用尖括号 ⟨a0, · · · , an⟩ 来表示乘积 p a0+1 0 · · · · · p an+1 n ,并把它称为有穷 序列 (a0, · · · , an) 的哥德尔 数。定义空序列 ⟨ ⟩ 的哥德尔数为 1。 (2) 定义函数 lh : N → N 为 lh(a) = µk ≤ a (pk - a)。我们称 lh(a) 为长度 函数,因 为 lh(1) = 0 且对于任意的哥德尔数 a = ⟨a0, · · · , an⟩,都有 lh(a) = n + 1。 (3) 定义关于 a 和 i 的二元函数 (a)i = µk ≤ a [p k+2 i - a]。我们称 (a)i 为分量 函数,因为 它刚好从编码为 a 的有穷序列中挑出第 i 项:对任意的哥德尔 数 a = ⟨a0, · · · , an⟩, (a)i = ai(0 ≤ i ≤ n)。 (4) 对自然数 a, b 定义串接 函数 a^b 如下: a^b = a · ∏ i<lh(b) p (b)i+1 lh(a)+i。 5
第2节递归函数 第7章递归论的基本知识 注意:函数h(a)和(a}都是全函数。特别地,函数h对不是哥德尔数的自然数a也 有定义,只不过我们不关心它的值罢了。对函数(a)1当≥h(a)时,情形也一样。 引理7.9.()全体有穷序列的哥德尔数构成的集合是原始递归的。 (2)函数ih(a)和(a)1都是原始递归的 (3)函数ab是原始递归的且(a 〉=(ao,…,an,b,…,bn)。还有, 如果a和b都是某个有穷序列的哥德尔数,则a^b也是。 证明:习题。 回忆一下原始递归的定义,当我们定义∫(y+1)的时候,我们仅仅用到了f在前 点的值f(y)。大家很自然地会猜测,我们并不非得要用前一点的值,只要我们以前已经 算过的值我们应该都可以用,即,在定义f(y+1)时,我们可以利用任何f(x)的值,只 要z≤y即可。下面的引理说的就是这件事情。首先引入两个自然的术语。对任何一个全 函数f:N+1→N,令F(,n)=P0(x0+11x1+1…xm)+。我们称它为∫的历史函数 我们称函数∫为从g和h经强递归得到的,如果 ∫(x,0)=9(x); f(E,y+1)=h(i, y, F(,y)). 理7.10.如果函数∫为从g和h经强递归得到的,且g和h都是原始递归的,则∫也是 原始递归的。 证明很容易看出∫的历史函数F(x,y)是原始递归的 F(,0)=22+1 F(,y+1)=F( F(,y)p+1 h(E, y, F(E,)+1 所以,∫(x,y)=(F(x,y)也是原始递归的。 引理??在后面非常有用,尤其是在讨论语法的算术化的时候。 第2节递归函数 721非原始递归函数 是不是所有的直观上可计算的函数都是原始递归的呢?答案是否定的。 我们可以用“对角线”方法来论证。首先注意:我们直观上有一个程序,它可以系 统地把所有原始递归函数枚举出来。比如,我们可以把所有可能的生成序列一一枚举出
第 2 节 递归函数 第 7 章 递归论的基本知识 注意:函数 lh(a) 和 (a)i 都是全函数。特别地,函数 lh 对不是哥德尔数的自然数 a 也 有定义,只不过我们不关心它的值罢了。对函数 (a)i 当 i ≥ lh(a) 时,情形也一样。 引理 7.9. (1) 全体有穷序列的哥德尔数构成的集合是原始递归的。 (2) 函数 lh(a) 和 (a)i 都是原始递归的。 (3) 函数 a^b 是原始递归的且 ⟨a0, · · · , an⟩^⟨b0, · · · , bm⟩ = ⟨a0, · · · , an, b0, · · · , bm⟩。还有, 如果 a 和 b 都是某个有穷序列的哥德尔数,则 a^b 也是。 证明: 习题。 回忆一下原始递归的定义,当我们定义 f(y + 1) 的时候,我们仅仅用到了 f 在前一 点的值 f(y)。大家很自然地会猜测,我们并不非得要用前一点的值,只要我们以前已经 算过的值我们应该都可以用,即,在定义 f(y + 1) 时,我们可以利用任何 f(z) 的值,只 要 z ≤ y 即可。下面的引理说的就是这件事情。首先引入两个自然的术语。对任何一个全 函数 f : N k+1 → N,令 F(⃗x, n) = p f(⃗x,0)+1 0 p f(⃗x,1)+1 1 · · · p f(⃗x,n)+1 n 。我们称它为 f 的历史函数。 我们称函数 f 为从 g 和 h 经强递归 得到的,如果 f(⃗x, 0) = g(⃗x); f(⃗x, y + 1) = h(⃗x, y, F(⃗x, y))。 引理 7.10. 如果函数 f 为从 g 和 h 经强递归得到的,且 g 和 h 都是原始递归的,则 f 也是 原始递归的。 证明: 很容易看出 f 的历史函数 F(⃗x, y) 是原始递归的: F(⃗x, 0) = 2g(⃗x)+1; F(⃗x, y + 1) = F(⃗x, y) · p h(⃗x,y,F(⃗x,y))+1 y+1 。 所以,f(⃗x, y) = (F(⃗x, y))y 也是原始递归的。 引理 ?? 在后面非常有用,尤其是在讨论语法的算术化的时候。 第 2 节 递归函数 7.2.1 非原始递归函数 是不是所有的直观上可计算的函数都是原始递归的呢?答案是否定的。 我们可以用“对角线”方法来论证。首先注意:我们直观上有一个程序,它可以系 统地把所有原始递归函数枚举出来。比如,我们可以把所有可能的生成序列一一枚举出 6
第7章递归论的基本知识 第2节递归函数 来。令90,91,表示这样枚举出来的原始递归函数序列。定义函数F:N→N为F(n)= gn(n)+1。这个函数F是直观上可计算的,但它不出现在原始递归函数的序列中,因而 不是原始递归的。 一个更为具体的例子是所谓的阿克曼函数A(x,y),定义如下: A(0,y)=y+1,A(x+1,0)=A(x,1) A(x+1,y+1)=A(x,A(x+1,y) 例如,A(1,y)=y+2、A(2,y)=2y+3还有A(3,y)=2y+3-3。粗略地说,A(x+1,y) 是通过y次叠代运算A(x,y)而得到的。 利用双重归纳,我们不难证明A(x,y)是一个全函数,即,对所有的自然数x和y, A(x,y)都是有定义的。这个归纳的过程同时告诉我们直观上怎样计算阿克曼函数。但它 不是原始递归的,原因是它增长得太快了,任何一个原始递归函数最终都会被它优超。具 体的断言和证明我们留作习题。 722递归函数 从程序语言的角度看,原始递归函数可以处理所有的算术运算、条件判断、以及形 如“从i=1到η执行…”这样的循环。我们想一想,同一般的程序语言相比,我们还 缺什么呢?答案是,我们还缺少“无(事先给定的)界的循环”,即处理“重复…直到 ”这样的指令。下面的定义试图弥补这一缺陷。 定义7.5.令∫:N+1→N为一个全函数。我们称函数g()是从∫通过正则极小化 或由正则-算子得到的,如果yf(x,y)=0(称为正则性条件)并且g()是使 得f(正,y)=0的最小的yo沿用记号μ,我们把它写成g()=pyf(式,y)=0。 定义7.6.全体递归函数的集合为最小的包含所有初始函数,并且对复合,原始递归和正 则极小化封闭的函数集合 同前一样,如果一个集合的特征函数是一个递归函数,我们则称该集合为一个递归 集。递归集就是可判定集合的精确说法 定义中的正则性条件Ⅴ过vg(x,y)=0从可计算的角度看是非常复杂的。我们无法能 行地判断正则性条件是否成立。很难想象我们在设计一个算法或在写一个程序的时候需要 时而不时地检査正则性条件。我们希望能够把它删掉。删掉它的后果是我们对y的搜寻可 能永远不停止,因此必须面对所谓的部分函数,即在某些点没有定义的函数。从现在起, 当我们考虑函数∫:A→B时,f的定义域可以是A的一个真子集。对A中的一个点x, 我们用f(x)↓表示“函数f在x点有定义”(或称为“f(x)是收敛的”);而f(x)↑表示 函数∫在x点没有定义的”(或称为“f(x)是发散的”)
第 7 章 递归论的基本知识 第 2 节 递归函数 来。令 g0, g1, . . . 表示这样枚举出来的原始递归函数序列。定义函数 F : N → N 为 F(n) = gn(n) + 1。这个函数 F 是直观上可计算的,但它不出现在原始递归函数的序列中,因而 不是原始递归的。 一个更为具体的例子是所谓的阿克曼函数 A(x, y),定义如下: A(0, y) = y + 1, A(x + 1, 0) = A(x, 1), A(x + 1, y + 1) = A(x, A(x + 1, y))。 例如,A(1, y) = y + 2、A(2, y) = 2y + 3 还有 A(3, y) = 2y+3 − 3。粗略地说,A(x + 1, y) 是通过 y 次叠代运算 A(x, y) 而得到的。 利用双重归纳,我们不难证明 A(x, y) 是一个全函数,即,对所有的自然数 x 和 y, A(x, y) 都是有定义的。这个归纳的过程同时告诉我们直观上怎样计算阿克曼函数。但它 不是原始递归的,原因是它增长得太快了,任何一个原始递归函数最终都会被它优超。具 体的断言和证明我们留作习题。 7.2.2 递归函数 从程序语言的角度看,原始递归函数可以处理所有的算术运算、条件判断、以及形 如“从 i = 1 到 n 执行……”这样的循环。我们想一想,同一般的程序语言相比,我们还 缺什么呢?答案是,我们还缺少“无(事先给定的)界的循环”,即处理“重复……直到 ……”这样的指令。下面的定义试图弥补这一缺陷。 定义 7.5. 令 f : N n+1 → N 为一个全函数。我们称函数 g(⃗x) 是从 f 通过正则极小化 或由正则 µ- 算子 得到的,如果 ∀⃗x∃yf(⃗x, y) = 0 (称为正则性条件)并且 g(⃗x) 是使 得 f(⃗x, y) = 0 的最小的 y。沿用记号 µ,我们把它写成 g(⃗x) = µy[f(⃗x, y) = 0]。 定义 7.6. 全体递归函数 的集合为最小的包含所有初始函数,并且对复合,原始递归和正 则极小化封闭的函数集合。 同前一样,如果一个集合的特征函数是一个递归函数,我们则称该集合为一个递归 集。递归集就是可判定集合 的精确说法。 定义中的正则性条件 ∀⃗x∃yg(⃗x, y) = 0 从可计算的角度看是非常复杂的。我们无法能 行地判断正则性条件是否成立。很难想象我们在设计一个算法或在写一个程序的时候需要 时而不时地检查正则性条件。我们希望能够把它删掉。删掉它的后果是我们对 y 的搜寻可 能永远不停止,因此必须面对所谓的部分函数,即在某些点没有定义的函数。从现在起, 当我们考虑函数 f : A → B 时,f 的定义域可以是 A 的一个真子集。对 A 中的一个点 x, 我们用 f(x) ↓ 表示“函数 f 在 x 点有定义”(或称为“f(x) 是收敛的”);而 f(x) ↑ 表示 “函数 f 在 x 点没有定义的”(或称为“f(x) 是发散的”)。 7
第2节递归函数 第7章递归论的基本知识 723部分递归函数 定义77.令∫为一个部分函数。我们称函数g是从∫通过极小化或由μ-算子得到的,如 果 9()=四yⅣz≤y(f(x,2)↓)∧f(x,y)=0。 我们解释一下条件Vz≤y(f(x,2)↓)。由于函数f(x,y)可以是部分函数,很有可能在 它的最小的根(比如说)出现之前,它在某些点(比如说x)上是没有定义的。这时 候我们应该怎样处理呢?让我们参考一下编程时的做法。我们只能耐心地一个点一个点地 检验。假如我们跳过a,即使看到了踟这个根,我们也不敢断定它是最小的,因为我们 不可能能行地知道∫(x,)是发散的(见后面停机问题的讨论)。因此,我们宁可达不到 真正的根,也不能跳过发散点,这就是条件vz≤y(f(z,2)↓)的目的。后面在习题??中, 我们会看到如果允许跳过发散点,则定义出来的函数类比可计算函数类要大。最后再说明 点,后面的克林尼正规型定理告诉我们,对部分函数使用极小算子是不那么重要的,每 个部分递归函数本质上都可以通过对某个原始递归谓词使用一次极小算子产生出来 定义7.8.全体部分递归函数的集合为最小的包含所有初始函数,并且对复合,原始递归 和极小化封闭的函数集合。 对初学者来说,部分函数的概念可能不容易接受,尤其是我们关心的对象似乎主要是 递归(全)函数。后面会提到一些部分函数所具有的一些优点。但我们研究部分函数最重 要的原因是由可计算性的本质决定的:每一个算法(或程序)都天然地对应一个部分函 数,而不是全函数。 在本章中的部分递归函数自然可以是部分函数。但我们使用“递归函数”这个词时, 指的是递归全函数。有时我们为了强调,也会用“递归全函数”。 引理711.阿克曼函数是部分递归的全函数 我们下面给出证明的梗概。基本思路是搜索一个“包含所有计算所需信息的编码”。 这一方面说明极小算子带来的好处,另一方面,确认一个编码包含所有中间步骤的完整信 息比确认最终答案要容易,这件事情本身也有意思,后面证明克林尼正规型定理时也会用 到这一想法。当然,这也不难理解,确认一个定理的证明是对是错比确认一个猜想是一个 定理要容易多了。 证明:比照阿克曼函数的定义,我们称一个三元组的有穷集合S为好的,如果它满足下列 条件 (a)如果(0,y,2)∈S则z=y+1 (b)如果(x+1,0,2)∈S则(x,1,z)∈S; 8
第 2 节 递归函数 第 7 章 递归论的基本知识 7.2.3 部分递归函数 定义 7.7. 令 f 为一个部分函数。我们称函数 g 是从 f 通过极小化 或由 µ-算子 得到的,如 果 g(⃗x) = µy [∀z ≤ y(f(⃗x, z) ↓) ∧ f(⃗x, y) = 0]。 我们解释一下条件 ∀z ≤ y(f(⃗x, z) ↓)。由于函数 f(⃗x, y) 可以是部分函数,很有可能在 它的最小的根(比如说 y0)出现之前,它在某些点(比如说 z0)上是没有定义的。这时 候我们应该怎样处理呢?让我们参考一下编程时的做法。我们只能耐心地一个点一个点地 检验。假如我们跳过 z0,即使看到了 y0 这个根,我们也不敢断定它是最小的,因为我们 不可能能行地知道 f(⃗x, z0) 是发散的(见后面停机问题的讨论)。因此,我们宁可达不到 真正的根,也不能跳过发散点,这就是条件 ∀z ≤ y(f(⃗x, z) ↓) 的目的。后面在习题 ?? 中, 我们会看到如果允许跳过发散点,则定义出来的函数类比可计算函数类要大。最后再说明 一点,后面的克林尼正规型定理告诉我们,对部分函数使用极小算子是不那么重要的,每 个部分递归函数本质上都可以通过对某个原始递归谓词使用一次极小算子产生出来。 定义 7.8. 全体部分递归函数 的集合为最小的包含所有初始函数,并且对复合,原始递归 和极小化封闭的函数集合。 对初学者来说,部分函数的概念可能不容易接受,尤其是我们关心的对象似乎主要是 递归(全)函数。后面会提到一些部分函数所具有的一些优点。但我们研究部分函数最重 要的原因是由可计算性的本质决定的:每一个算法(或程序)都天然地对应一个部分函 数,而不是全函数。 在本章中的部分递归函数自然可以是部分函数。但我们使用“递归函数”这个词时, 指的是递归全函数。有时我们为了强调,也会用“递归全函数”。 引理 7.11. 阿克曼函数是部分递归的全函数。 我们下面给出证明的梗概。基本思路是搜索一个“包含所有计算所需信息的编码”。 这一方面说明极小算子带来的好处,另一方面,确认一个编码包含所有中间步骤的完整信 息比确认最终答案要容易,这件事情本身也有意思,后面证明克林尼正规型定理时也会用 到这一想法。当然,这也不难理解,确认一个定理的证明是对是错比确认一个猜想是一个 定理要容易多了。 证明: 比照阿克曼函数的定义,我们称一个三元组的有穷集合 S 为好的,如果它满足下列 条件: (a) 如果 (0, y, z) ∈ S 则 z = y + 1; (b) 如果 (x + 1, 0, z) ∈ S 则 (x, 1, z) ∈ S; 8
第7章递归论的基本知识 第3节图灵机 (c)如果(x+1,y+1,2)∈S则存在一个自然数u使得(x+1,y,u)∈S且(x,u,x)∈S 注意:一个好的三元组集S具有如下性质:如果(x,y,2)∈S,则 (1)z=A(x,y) (2)S包含计算A(x,y)过程中所需的所有的“先前的”三元组(x,y,A(x,y) 接下来我们把三元组(x,y,2)编码成(x,y,x)=2+13y+15+1;并把一个三元组的编码 的有穷集{u…,wk}编码成{u1,u2,…,wk}。所以一个三元组的有穷集可以被编码成 个自然数 令S表示编码为υ的三元组集。则谓词“(x,y,z)∈S。”是原始递归的,因为它等价 于“玉<v()=(x,y,x)”。更进一步,“S是一个好的三元组的集合”也是一个原始 递归谓词(练习)。所以谓词 R(x,y,v):=“是一个好的三元组集的编码并且彐z<v(x,y,z)∈S) 也是原始递归的 于是函数f(x,y)=R(x,y,u)是部分递归的。所以A(x,y)=2(x,y,2)∈Srax)也 是部分递归的;并且f(x,y)和A(x,y)都是全函数。 第3节图灵机 英国数学家图灵是二十世纪最伟大的数理逻辑学家之一,也被人称为计算机科学和 人工智能之父。在他1936年的文章中1,他提出了图灵机的概念,并且证明了停机问题 是不可判定的,从而解决了希尔伯特提出的判定性问题。虽然哥德尔和丘奇等人也在更早 或差不多同时也给出了判定冋题的否定答案,但图灵提岀的被称为图灵机的计算模型可 以被视为纯机械的物理机器,因而比形式系统更能代表任何的机械装置,从而在不可判定 问题的解答上更为直观也更有说服力。 731图灵机的定义 我们先看图灵机的物理描述。图灵分析了一个“计算员( computor)”进行计算的过 程,得出了一台图灵机应该包括以下要素 On Computable Numbers, with an application to the Entscheidungsproblem, Proc. Lond. Math. Soc
第 7 章 递归论的基本知识 第 3 节 图灵机 (c) 如果 (x + 1, y + 1, z) ∈ S 则存在一个自然数 u 使得 (x + 1, y, u) ∈ S 且 (x, u, z) ∈ S。 注意:一个好的三元组集 S 具有如下性质:如果 (x, y, z) ∈ S,则 (1) z = A(x, y)。 (2) S 包含计算 A(x, y) 过程中所需的所有的“先前的”三元组 (x ′ , y′ , A(x ′ , y′ ))。 接下来我们把三元组 (x, y, z) 编码成 ⟨x, y, z⟩ = 2x+13 y+15 z+1;并把一个三元组的编码 的有穷集 {u1, · · · , uk} 编码成 ⟨u1, u2, · · · , uk⟩。所以一个三元组的有穷集可以被编码成一 个自然数 v。 令 Sv 表示编码为 v 的三元组集。则谓词“(x, y, z) ∈ Sv”是原始递归的,因为它等价 于“∃i < v((v)i = ⟨x, y, z⟩)”。更进一步,“Sv 是一个好的三元组的集合”也是一个原始 递归谓词(练习)。所以谓词 R(x, y, v) := “v 是一个好的三元组集的编码并且 ∃z < v ((x, y, z) ∈ Sv)” 也是原始递归的。 于是函数f(x, y) = µvR(x, y, v) 是部分递归的。所以A(x, y) = µz((x, y, z) ∈ Sf(x,y)) 也 是部分递归的;并且 f(x, y) 和 A(x, y) 都是全函数。 第 3 节 图灵机 英国数学家图灵是二十世纪最伟大的数理逻辑学家之一,也被人称为计算机科学和 人工智能之父。在他 1936 年的文章中 1,他提出了图灵机的概念,并且证明了停机问题 是不可判定的,从而解决了希尔伯特提出的判定性问题。虽然哥德尔和丘奇等人也在更早 或差不多同时也给出了判定问题的否定答案,但图灵提出的被称为图灵机的计算模型可 以被视为纯机械的物理机器,因而比形式系统更能代表任何的机械装置,从而在不可判定 问题的解答上更为直观也更有说服力。 7.3.1 图灵机的定义 我们先看图灵机的物理描述。图灵分析了一个“计算员(computor)”进行计算的过 程,得出了一台图灵机应该包括以下要素: 1On Computable Numbers, with an application to the Entscheidungsproblem, Proc. Lond. Math. Soc. 9
第3节图灵机 第7章递归论的基本知识 10100 图71:图灵机示意图 1.一条两个方向都可无限延长的纸带,被分成一个个小的格子。这些格子中或者是空 白的,用0表示,或者可以写上一个字符,这些字符来自一个事先给定的有穷的字 母表A={a1,a2,…,an,0}。 2.一个读写头,每次可以扫描纸带上的一个格子。读写头可以辨别格子是空白的还是 有字的,它还能在空白格子中写上符号,也能将已有的字符抹去,使其重新成为空 白的;读写头可以左右移动,但每次只能移动一格 3.一个有穷的状态集Q={q1,…,n},在任何一个给定时刻,图灵机都处在当中的某 个状态q 图灵机的数学定义则是根据它的“软件”而来的。 定义79.一台图灵机是由下面几个部分组成的:一个有穷的字母表A、两个特殊的方向 符号L(左)和R(右)、一个有穷的状态集Q、和一个有穷的指令集δ,其中每个指令是 个具有下列形式的四元组 aqaq其中q,q∈Q并且a,a'∈A 1b)qaLq其中q,q∈Q并且a∈A c)qaRq其中q,q∈Q并且a∈A 此外,我们还假定对任意的状态q和字符a,至多只有一个四元组以q起头。 这个四元组集对应着一个从Q×A到(AU{B,L})×Q的一个部分函数,我们称它 为一个转换函数 指令qua'q的解读如下:如果图灵机的当前状态为q并且当前读写头在格子中看到的 符号为a,则将格子中的a改成a',并把状态改成q。指令qaLq和qaq的解读类似, 只不过是把读写头分别地向左和向右移动一格,而不改动格子内的符号
第 3 节 图灵机 第 7 章 递归论的基本知识 · · · 1 0 1 0 0 1 1 · · · q 图 7.1: 图灵机示意图 1. 一条两个方向都可无限延长的纸带,被分成一个个小的格子。这些格子中或者是空 白的,用 0 表示,或者可以写上一个字符,这些字符来自一个事先给定的有穷的字 母表 A = {a1, a2, · · · , an, 0}。 2. 一个读写头,每次可以扫描纸带上的一个格子。读写头可以辨别格子是空白的还是 有字的,它还能在空白格子中写上符号,也能将已有的字符抹去,使其重新成为空 白的;读写头可以左右移动,但每次只能移动一格。 3. 一个有穷的状态集 Q = {q1, · · · , qn},在任何一个给定时刻,图灵机都处在当中的某 个状态 qi。 图灵机的数学定义则是根据它的“软件”而来的。 定义 7.9. 一台图灵机 是由下面几个部分组成的:一个有穷的字母表 A、两个特殊的方向 符号 L(左)和 R(右)、一个有穷的状态集 Q、和一个有穷的指令集 δ,其中每个指令是 一个具有下列形式的四元组: (a) qaa′ q ′ 其中 q, q′ ∈ Q 并且 a, a′ ∈ A。 (b) qaLq′ 其中 q, q′ ∈ Q 并且 a ∈ A。 (c) qaRq′ 其中 q, q′ ∈ Q 并且 a ∈ A。 此外,我们还假定对任意的状态 q 和 字符 a,至多只有一个四元组以 qa 起头。 这个四元组集对应着一个从 Q × A 到 (A ∪ {R, L}) × Q 的一个部分函数,我们称它 为一个转换函数。 指令 qaa′ q ′ 的解读如下:如果图灵机的当前状态为 q 并且当前读写头在格子中看到的 符号为 a,则将格子中的 a 改成 a ′,并把状态改成 q ′。指令 qaLq′ 和 qaRq′ 的解读类似, 只不过是把读写头分别地向左和向右移动一格,而不改动格子内的符号。 10