2 原始遞歸函數
2.1 原始遞歸函數
- Q: 證明合成、原始遞歸保持可計算性的思路是什么?
A: 寫一段\(\mathscr S\)程序計算相應函數。
合成:順序結構。
原始遞歸:循環結構。(更具體地,用一個變量\(Z\)表示不斷增長的\(t\),\(Z\)每次+1,而\(X_{n+1}\)每次-1,當\(X_{n-1}\)減為0時跳出循環,恰好\(Z\)就是輸入的最后一個分量,這就計算出了結果) - Q: 原始遞歸函數定義中的\(n+2\)元函數\(g\)的輸入分為三部分:遞歸次數\(t\),上次遞歸結果\(h(\cdots, t)\),本次輸入\(x_1,\cdots,x_n\). 那么只使用三部分中其中某些部分的原始遞歸函數退化成了什么?有哪些典型例子是對這三部分不全部使用的?
A:
0. 只使用\(t\)則退化成了一元函數。- 只使用\(x_1,\cdots,x_n\)則退化成多元函數。
- 只使用\(t,x_1,\cdots,x_n\)也退化成多元函數。
總之不使用\(h(t)\)就一定跟一般意義的“遞歸”沒有關系。 - 只使用\(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猜想。 - 只使用\(t,h\):相當於利用原始遞歸運算構造一元函數。一切原始遞歸運算構造的一元函數都可以看作此類例子。
具體地,當\(t\)從0開始不斷增大時,連續應用了一系列\(g(t,h)\),這就可以很容易的構造某種“累積”,例如\(g(t,h)=f(t)+h(t)\),這就可以計算從1開始一串整數的函數值之和。(參見2.3迭代運算)
特別地,回憶只使用\(h\)的情況,對於上面“計算函數值之和”的例子就退化為計算常數之和,即反復加同一個常數。 - 只使用\(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\). 可以看到關鍵點是階乘每次“操作”不是“相同”的,但是加法乘法每次操作是“相同”的。
- Q: 對於課本中本節列舉的10種常見的原始遞歸函數,請用樹結構表示\(p(x),x\dot -y, |x-y|, \alpha(x)\)間的依賴關系。
A: \(p(x):\{x\dot -y:\{|x-y|,\alpha(x)\}\}\) - 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 原始遞歸謂詞
- Q: 如何表示邏輯運算、分段函數?
A: 乘是“與”,\(\alpha\)是“非”。與、非已經是邏輯連接符的完備集了。
\(f\cdot P+g\cdot \neg P\)
2.3 迭代運算、有界量詞和極小化
- Q: 迭代運算、有界量詞和有界極小化有何聯系?
A: 界為\(y\)的有界量詞相當於\(y\)次邏輯運算,而與、或邏輯運算相當於乘法、加法,則有界量詞就是\(\prod,\sum\).
構造有界極小化時,設“最小合題意的數”存在為\(t_0\),那么只需對小於\(t_0\)的所有數賦函數值1,大於等於\(t_0\)的賦值0,這些值全部相加就恰好得到\(t_0\). 而這個“賦值”可以通過邏輯與實現(即“更小的都不滿足”)。所以有界極小化是外層連加,內層連乘。 - Q: 由上定義,如果不存在\(t_0\),那么有界極小化結果為\(y+1\). 但本書中強行定義此時結果為(). 觀察本節內容,推測這出於什么考慮。
A: 0
由此,得到\(\lfloor x/0\rfloor=p_0=0\).
本節中對於第\(n\)個質數\(p_n\)的界估計非常“慷慨”。實際上,因為有界極小化只需要有一個界就行了,我們經常給出很松的估計。
如果將\(t_0\)不存在時有界極小化結果定義為\(y+1\),那么結果和界有關,這顯然不太理想。 - Q: 辨析:有界極小化,極小化
原始遞歸函數,遞歸函數,部分遞歸函數,可計算函數,部分可計算函數
A: 極小化相比有界極小化,去除了界的限制。故原本有界極小化找不到\(t_0\)而輸出0的情況在極小化處要不然會輸出\(>t_0\)的數,要不然\(\uparrow\).
原始遞歸函數使用三種初始函數(零,后繼,投影)和兩種針對函數的運算(合成,原始遞歸)得到,而部分遞歸函數可額外使用極小化。故原始遞歸一定部分遞歸,也一定遞歸。部分遞歸不一定原始遞歸。
部分遞歸的全函數即遞歸函數。遞歸也不一定原始遞歸。
根據極小化可用\(\mathscr S\)計算,知部分遞歸、遞歸就是部分可計算、可計算。其實反過來也成立,但此章先不證明。
2.4 配對函數和Gödel數
- Q: 利用配對函數的構造方式,構造有序\(k\)元組到自然數的一一對應。
A: 例如4元,\(2^x 3^y 5^zf(w)\),其中\(f(w)\)是從小到大第\(w\)個不被2,3,5整除的數。
不過此時還有0的問題,所以最后要\(-1\)
注:可以不寫帶點的\(\dot -1\),因為此處可以保證被減數不小於減數。 - Q: 配對函數和Gödel數都對解碼是全函數提出了要求,那么怎么處理邊界情況呢?
A: 本書中,配對函數直接\(-1\),Gödel數則在對0解碼或者解碼“第0位”時始終得0.
注:\((0)_i=(1)_i=(i)_0=0\).
注:可以看到配對函數的解碼仍是單射,但哥德爾編碼的解碼並不是,因為規定0和1的解碼都是“空”(或稱全為0的數列)。 - Q: 哥德爾編碼中,求長度\(Lt(x)\)為什么可以用有界極小化表示?
A: 平凡的界:一個自然數的因數小於等於自身。
2.5 原始遞歸運算
- 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數。- 2.1題1.
聯立遞歸針對\(h\)(每個\(t\)的\(h\)變成多個),多步遞歸也針對\(h\)(積累之前的所有h),多變量遞歸針對\(h\)和\(t\)(\(t\)變成兩個,\(h\)也相應有兩個相關輸入字段\(t_1,t_2\))
- 2.1題1.
- Q: 本節中2.21至2.24中都出現原始遞歸(可計算)字樣。原始遞歸就是可計算嗎?如果不是,那么這括號又是什么意思?
A: 不是。原始遞歸函數是可計算函數的真子集。(參見下節)
括號表示從使用(聯立、多步、多變量)遞歸前到使用遞歸后只使用了原始遞歸函數所允許的各個運算,故使用遞歸保持原始遞歸,也保持可計算。
簡單來說:原始遞歸,原始遞歸,得到原始遞歸。
可計算,原始遞歸,得到可計算。
括號反映的是這里的相同。不是這里的相同。 - 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\),否則死循環了。