2 原始递归函数

2.1 原始递归函数

  1. Q: 证明合成、原始递归保持可计算性的思路是什么?
    A: 写一段\(\mathscr S\)程序计算相应函数。
    合成:顺序结构。
    原始递归:循环结构。(更具体地,用一个变量\(Z\)表示不断增长的\(t\)\(Z\)每次+1,而\(X_{n+1}\)每次-1,当\(X_{n-1}\)减为0时跳出循环,恰好\(Z\)就是输入的最后一个分量,这就计算出了结果)
  2. Q: 原始递归函数定义中的\(n+2\)元函数\(g\)的输入分为三部分:递归次数\(t\),上次递归结果\(h(\cdots, t)\),本次输入\(x_1,\cdots,x_n\). 那么只使用三部分中其中某些部分的原始递归函数退化成了什么?有哪些典型例子是对这三部分不全部使用的?
    A:
    0. 只使用\(t\)则退化成了一元函数。
    1. 只使用\(x_1,\cdots,x_n\)则退化成多元函数。
    2. 只使用\(t,x_1,\cdots,x_n\)也退化成多元函数。
      总之不使用\(h(t)\)就一定跟一般意义的“递归”没有关系。
    3. 只使用\(h(\cdots,t)\):退化为“反复地复合一元函数”,即\(h(\cdots,t+1)=g(t,h(\cdots,t),\cdots)=g_1(h(\cdots,t))=g_1(g_1(h(\cdots,t-1)))\)以此类推。
      例:不断平方,用于计算\(x^{2^n}\).
      例:验证Collatz猜想。
    4. 只使用\(t,h\):相当于利用原始递归运算构造一元函数。一切原始递归运算构造的一元函数都可以看作此类例子。
      具体地,当\(t\)从0开始不断增大时,连续应用了一系列\(g(t,h)\),这就可以很容易的构造某种“累积”,例如\(g(t,h)=f(t)+h(t)\),这就可以计算从1开始一串整数的函数值之和。(参见2.3迭代运算)
      特别地,回忆只使用\(h\)的情况,对于上面“计算函数值之和”的例子就退化为计算常数之和,即反复加同一个常数。
    5. 只使用\(h,x_1,\cdots,x_n\):直观上看,递归的规则和递归了多少次无关。不需显式出现\(t\)(即\(t\)的唯一作用就是计算出\(h(x,t)\)
      例如\(n=1\),递归定义加法为\(h(x,0)=x;h(x,t+1)=h(x,t)+1\). 递归定义乘法\(h(x,0)=0;h(x,t+1)=h(x,t)+x\). 递归定义乘方\(h(x,0)=1;h(x,t+1)=h(x,t)*x\). 这些例子中都不显式出现\(t\).
      相比之下,递归定义阶乘\(h(0)=1,h(t+1)=h(t)\cdot (t+1)\)中就显式出现了\(t\). 可以看到关键点是阶乘每次“操作”不是“相同”的,但是加法乘法每次操作是“相同”的。
  3. Q: 对于课本中本节列举的10种常见的原始递归函数,请用树结构表示\(p(x),x\dot -y, |x-y|, \alpha(x)\)间的依赖关系。
    A: \(p(x):\{x\dot -y:\{|x-y|,\alpha(x)\}\}\)
  4. Q: 说明在\(n\)个整数中取最大值的函数是原始递归的。
    A: 提示:用归纳
    \(max(x_1,\cdots, x_n)=max(max(x_1,\cdots,x_{n-1}),x_n)\)
    \(max(x,0)=x;max(x,t+1)=max(x,t)+(t\ge x)\)

2.2 原始递归谓词

  1. Q: 如何表示逻辑运算、分段函数?
    A: 乘是“与”,\(\alpha\)是“非”。与、非已经是逻辑连接符的完备集了。
    \(f\cdot P+g\cdot \neg P\)

2.3 迭代运算、有界量词和极小化

  1. Q: 迭代运算、有界量词和有界极小化有何联系?
    A: 界为\(y\)的有界量词相当于\(y\)次逻辑运算,而与、或逻辑运算相当于乘法、加法,则有界量词就是\(\prod,\sum\).
    构造有界极小化时,设“最小合题意的数”存在为\(t_0\),那么只需对小于\(t_0\)的所有数赋函数值1,大于等于\(t_0\)的赋值0,这些值全部相加就恰好得到\(t_0\). 而这个“赋值”可以通过逻辑实现(即“更小的不满足”)。所以有界极小化是外层连加,内层连乘。
  2. Q: 由上定义,如果不存在\(t_0\),那么有界极小化结果为\(y+1\). 但本书中强行定义此时结果为(). 观察本节内容,推测这出于什么考虑。
    A: 0
    由此,得到\(\lfloor x/0\rfloor=p_0=0\).
    本节中对于第\(n\)个质数\(p_n\)的界估计非常“慷慨”。实际上,因为有界极小化只需要有一个界就行了,我们经常给出很松的估计。
    如果将\(t_0\)不存在时有界极小化结果定义为\(y+1\),那么结果和界有关,这显然不太理想。
  3. Q: 辨析:有界极小化,极小化
    原始递归函数,递归函数,部分递归函数,可计算函数,部分可计算函数
    A: 极小化相比有界极小化,去除了界的限制。故原本有界极小化找不到\(t_0\)而输出0的情况在极小化处要不然会输出\(>t_0\)的数,要不然\(\uparrow\).
    原始递归函数使用三种初始函数(零,后继,投影)和两种针对函数的运算(合成,原始递归)得到,而部分递归函数可额外使用极小化。故原始递归一定部分递归,也一定递归。部分递归不一定原始递归。
    部分递归的全函数即递归函数。递归也不一定原始递归。
    根据极小化可用\(\mathscr S\)计算,知部分递归、递归就是部分可计算、可计算。其实反过来也成立,但此章先不证明。

2.4 配对函数和Gödel数

  1. Q: 利用配对函数的构造方式,构造有序\(k\)元组到自然数的一一对应。
    A: 例如4元,\(2^x 3^y 5^zf(w)\),其中\(f(w)\)是从小到大第\(w\)个不被2,3,5整除的数。
    不过此时还有0的问题,所以最后要\(-1\)
    注:可以不写带点的\(\dot -1\),因为此处可以保证被减数不小于减数。
  2. Q: 配对函数和Gödel数都对解码是全函数提出了要求,那么怎么处理边界情况呢?
    A: 本书中,配对函数直接\(-1\),Gödel数则在对0解码或者解码“第0位”时始终得0.
    注:\((0)_i=(1)_i=(i)_0=0\).
    注:可以看到配对函数的解码仍是单射,但哥德尔编码的解码并不是,因为规定0和1的解码都是“空”(或称全为0的数列)。
  3. Q: 哥德尔编码中,求长度\(Lt(x)\)为什么可以用有界极小化表示?
    A: 平凡的界:一个自然数的因数小于等于自身。

2.5 原始递归运算

  1. Q: 请分别根据2.4的角度和2.1题1.的角度对比联立递归、多步递归、多变量递归。
    A:
    0. 2.4
    联立递归使用配对(或者更一般的,对有限长元组编码)函数,把\(h_1,\cdots,h_m\)编码成一个\(H\).
    多步递归使用Gödel数,把\(h(x,0),\cdots,h(x,t)\)编码成一个\(H(x,t)\). 这里\(t\)是变长的,区别上面的\(m\).
    多变量递归使用Gödel数,把“对角线”上(\(t_1+t_2=常数\))的值编码成一个\(H\). 注:大于2个变量时,其实也可以用某种排序编码成Gödel数。
    1. 2.1题1.
      联立递归针对\(h\)(每个\(t\)\(h\)变成多个),多步递归也针对\(h\)(积累之前的所有h),多变量递归针对\(h\)\(t\)\(t\)变成两个,\(h\)也相应有两个相关输入字段\(t_1,t_2\)
  2. Q: 本节中2.21至2.24中都出现原始递归(可计算)字样。原始递归就是可计算吗?如果不是,那么这括号又是什么意思?
    A: 不是。原始递归函数是可计算函数的真子集。(参见下节)
    括号表示从使用(联立、多步、多变量)递归前使用递归后只使用了原始递归函数所允许的各个运算,故使用递归保持原始递归,也保持可计算。
    简单来说:原始递归,原始递归,得到原始递归
    可计算,原始递归,得到可计算
    括号反映的是这里的相同。不是这里的相同。
  3. Q: 多步递归和\(h(x,t+1)=g(t,h(x,\omega_1(x,t)),\cdots,h(x,\omega_k(x,t)),x),t\ge k-1, \omega_i(x,t)\le t\)有何联系?
    A: 多步递归允许使用之前所有数,自然允许计算出\(k\)个索引值\(\omega_1,\cdots,\omega_k\),再“查表”。注意每个索引值都必须\(\le t\),否则死循环了。