§E16.17Gödel 符号化と有限列

最終更新

有限の構文対象と有限の計算履歴を算術の対象にするため、有限列を一つの自然数で表す。固定長の組だけでは、長さが入力によって変わる証明列や計算列を一つの形式で扱うことができない。本記事では一つの可変長符号を固定し、復号、長さ、成分取得、連結をすべて全域原始再帰関数として構成する。

1 Cantor の対関数

定義 1.1 (Cantor の対関数).a,b∈Na,b\in\mathbb Nに対して

pair⁡(a,b)=(a+b)(a+b+1)2+b\operatorname{pair}(a,b) =\frac{(a+b)(a+b+1)}2+b

と定める。この関数を Cantor の対関数 (Cantor pairing function) という。left⁡(z)\operatorname{left}(z)とright⁡(z)\operatorname{right}(z)は

pair⁡(left⁡(z),right⁡(z))=z\operatorname{pair}(\operatorname{left}(z),\operatorname{right}(z))=z

を満たす二つの成分とする。

補題 1.2.pair⁡ ⁣:N2→N\operatorname{pair}\colon\mathbb N^2\to\mathbb Nは全単射である。pair⁡\operatorname{pair}、left⁡\operatorname{left}、right⁡\operatorname{right}は正のアリティをもつ原始再帰全関数であり、

left⁡(pair⁡(a,b))=a,right⁡(pair⁡(a,b))=b\operatorname{left}(\operatorname{pair}(a,b))=a, \qquad \operatorname{right}(\operatorname{pair}(a,b))=b

が成り立つ。

証明.w=a+bw=a+bとおき、三角数Tw=w(w+1)/2T_w=w(w+1)/2と書けばpair⁡(a,b)=Tw+b\operatorname{pair}(a,b)=T_w+bである。0≤b≤w0\le b\le wなので、和がwwである対は

Tw,Tw+1,…,Tw+w=Tw+1−1T_w,T_w+1,\ldots,T_w+w=T_{w+1}-1

へ、bbの順に重複なく写る。これらの区間はw=0,1,…w=0,1,\ldotsの順に隣接し、N\mathbb Nを尽くす。したがって各zzはただ一つのwwとb≤wb\le wをもち、z=Tw+bz=T_w+bと書くことができる。a=w−ba=w-bとすれば全単射性を得る。

加法、乗法、固定数22による商は原始再帰的なのでpair⁡\operatorname{pair}は原始再帰的である。pair⁡(a,b)=z\operatorname{pair}(a,b)=zならa,b≤za,b\le zである。したがって0≤a,b≤z0\le a,b\le zの範囲で等式を満たす唯一の対を有界探索すればよい。有界探索と有限の場合分けは原始再帰的なので、二成分を返すleft⁡\operatorname{left}とright⁡\operatorname{right}も原始再帰全関数である。▨

2 すべての自然数を有限列として読む

定義 2.1 (Cons による有限列符号).

Empty⁡=0,Cons⁡(a,t)=1+pair⁡(a,t),SeqCode⁡(a0,…,an−1)=Cons⁡(a0,Cons⁡(a1,…,Cons⁡(an−1,0)…)).\begin{aligned} \operatorname{Empty}&=0,\\ \operatorname{Cons}(a,t)&=1+\operatorname{pair}(a,t),\\ \operatorname{SeqCode}(a_0,\ldots,a_{n-1}) &=\operatorname{Cons}(a_0, \operatorname{Cons}(a_1,\ldots, \operatorname{Cons}(a_{n-1},0)\ldots)). \end{aligned}

この符号化を Cons 有限列符号 (Cons finite-sequence coding) という。

s>0s>0では

Head⁡(s)=left⁡(s−1),Tail⁡(s)=right⁡(s−1)\operatorname{Head}(s)=\operatorname{left}(s-1), \qquad \operatorname{Tail}(s)=\operatorname{right}(s-1)

とし、Head⁡(0)=Tail⁡(0)=0\operatorname{Head}(0)=\operatorname{Tail}(0)=0とする。

前者関数s−˙1s\mathbin{\dot-}1と零判定による場合分けを用いれば、Head⁡\operatorname{Head}とTail⁡\operatorname{Tail}は全域原始再帰関数である。

命題 2.2.s>0s>0ならTail⁡(s)<s\operatorname{Tail}(s)<sである。したがって、任意の自然数ssからTail⁡\operatorname{Tail}を反復すると有限回で00に到達し、ssはただ一つの有限列へ復号される。ゆえに符号述語Seq⁡(s)\operatorname{Seq}(s)は常に真である一変数原始再帰関係とすることができ、bad code は存在しない。

証明.s>0s>0とし、a=Head⁡(s)a=\operatorname{Head}(s)、t=Tail⁡(s)t=\operatorname{Tail}(s)とおく。対関数の逆の定義によりs=1+pair⁡(a,t)s=1+\operatorname{pair}(a,t)である。pair⁡(a,t)=Ta+t+t≥t\operatorname{pair}(a,t)=T_{a+t}+t\ge tなのでt<st<sである。

ssから始めてs,Tail⁡(s),Tail⁡2(s),…s,\operatorname{Tail}(s),\operatorname{Tail}^2(s),\ldotsと進むと、正である間は自然数が真に減少する。自然数の真の降下列は有限なので、Tail⁡n(s)=0\operatorname{Tail}^n(s)=0を満たす非負整数nnが存在する。各正の符号に対する Head と Tail は対関数の全単射性から一意であるため、復号列も一意である。恒真関係の特性関数は単項定数関数C1(s)=1C_1(s)=1であり、初期関数から合成で構成することができる。零項関係を追加する必要はない。▨

3 コース再帰を通常の原始再帰へ還元する

値F(s)F(s)を、それより小さい引数での値から定める再帰をコース再帰という。ここでは必要な過去の値を右入れ子の履歴へ保存し、通常の原始再帰だけで実行する。

補題 3.1.D(x⃗,s)<sD(\vec x,s)<sがs>0s>0で成り立つ原始再帰関数DDと、原始再帰関数B(x⃗)B(\vec x)、G(x⃗,s,u)G(\vec x,s,u)を考える。

F(x⃗,0)=B(x⃗),F(x⃗,s)=G(x⃗,s,F(x⃗,D(x⃗,s)))(s>0)F(\vec x,0)=B(\vec x), \qquad F(\vec x,s)=G(\vec x,s,F(\vec x,D(\vec x,s)))\quad(s>0)

で定まるFFは原始再帰全関数である。パラメータ列x⃗\vec xは空でもよい。空の場合にもFFは再帰引数ssを残す一変数関数であり、零項関数にはならない。

証明. 最初に履歴から第jj成分を取る補助関数を作る。

I(t,0)=t,I(t,j+1)=Tail⁡(I(t,j)),E(t,j)=Head⁡(I(t,j)).\begin{aligned} I(t,0)&=t,\\ I(t,j+1)&=\operatorname{Tail}(I(t,j)),\\ E(t,j)&=\operatorname{Head}(I(t,j)). \end{aligned}

IIはjjに関する通常の原始再帰であり、EEは合成なので、ともに原始再帰的である。

H(x⃗,n)H(\vec x,n)を、先頭からF(x⃗,n−1),…,F(x⃗,0)F(\vec x,n-1),\ldots,F(\vec x,0)を並べた逆向きの履歴符号とする。HHを次の通常の原始再帰で同時に構成する。

H(x⃗,0)=0,H(x⃗,n+1)=Cons⁡(V(x⃗,n),H(x⃗,n)),\begin{aligned} H(\vec x,0)&=0,\\ H(\vec x,n+1)&=\operatorname{Cons}(V(\vec x,n),H(\vec x,n)), \end{aligned}

ここで

V(x⃗,0)=B(x⃗),V(\vec x,0)=B(\vec x),

n>0n>0では

V(x⃗,n)=G(x⃗,n,E(H(x⃗,n),n−1−D(x⃗,n)))V(\vec x,n)= G\bigl(\vec x,n, E(H(\vec x,n),n-1-D(\vec x,n))\bigr)

とする。条件D(x⃗,n)<nD(\vec x,n)<nにより添字は自然数である。切捨て減法と零判定による場合分けを用いればVVの右辺は原始再帰関数の合成である。したがってHHは通常の原始再帰によって得る。

nnに関するメタ理論の帰納法により、H(x⃗,n)H(\vec x,n)の第n−1−dn-1-d成分はF(x⃗,d)F(\vec x,d)であることが分かる。特にd=D(x⃗,n)d=D(\vec x,n)とすれば、V(x⃗,n)V(\vec x,n)は定義式どおりF(x⃗,n)F(\vec x,n)になる。よって

F(x⃗,n)=E(H(x⃗,n+1),0)F(\vec x,n)=E(H(\vec x,n+1),0)

であり、FFは原始再帰的である。用いた再帰はすべて通常の原始再帰であり、x⃗\vec xが空のときは基底値B=cB=cを一つの自然数として指定する規約に従う。▨

一つの小さい引数の値だけを読む前補題では、二つの直下構文の値を同時に必要とする再帰や、再帰呼出しごとに環境を更新する再帰を直接扱うことができない。次の有限スタック・接頭トレースによる還元を用いる。

補題 3.2.KKを固定した標準自然数とする。要求qqに対して、階数r(q)r(q)、子の個数m(q)≤Km(q)\le K、j<m(q)j<m(q)に対する第jj子d(q,j)d(q,j)、および子の値の有限列hhから親の値を返すC(q,h)C(q,h)が原始再帰関数であるとする。すべての実際の子について

r(d(q,j))<r(q)(j<m(q))r(d(q,j))<r(q)\qquad(j<m(q))

が成り立つなら、各子を左から評価してCCへ渡す有限分岐コース再帰の値Eval⁡(q)\operatorname{Eval}(q)は原始再帰全関数である。要求qqは、主引数だけでなく、種類タグ、補助パラメータ、および子へ渡す更新済み有限環境を含んでよい。

証明. 要求、未処理の子の位置をもつ継続枠、および計算済みの値を、それぞれ固定タグを先頭にもつ

Req⁡(q),Frame⁡(q,j,h),Val⁡(a)\operatorname{Req}(q),\qquad \operatorname{Frame}(q,j,h),\qquad \operatorname{Val}(a)

という固定長列で符号化する。計算状態は、これらを上端から並べた有限スタックとする。子の値は逆順の列hhへ保存し、CCが Entry により左からの順序へ読み直す規約を固定する。

一段遷移 Step を次のように定める。上端が Req(q)(q)でm(q)=0m(q)=0なら、これを Val(C(q,0))(C(q,0))へ置き換える。m(q)>0m(q)>0なら、Req(q)(q)を

Req⁡(d(q,0)),Frame⁡(q,1,0)\operatorname{Req}(d(q,0)),\quad \operatorname{Frame}(q,1,0)

へ置き換える。上端二要素が Val(a)(a)、Frame(q,j,h)(q,j,h)なら、aaをhhの先頭へ追加する。j<m(q)j<m(q)なら次に Req(d(q,j))(d(q,j))と Frame(q,j+1,Cons⁡(a,h))(q,j+1,\operatorname{Cons}(a,h))を積み、j=m(q)j=m(q)なら両要素を Val(C(q,Cons⁡(a,h)))(C(q,\operatorname{Cons}(a,h)))へ置き換える。スタックが一要素 Val(a)(a)だけになった停止状態では Step を恒等写像とし、不正な状態の値も00への場合分けによって固定する。タグ照合、Head、Tail、Entry、Cons、有界比較、およびr,m,d,Cr,m,d,Cだけを用いるため、Step は原始再帰的である。

停止までの一様な原始再帰的上界を与える。次の関数を通常の原始再帰で定める。

NK(0)=1,NK(s+1)=1+K NK(s).N_K(0)=1,\qquad N_K(s+1)=1+K\,N_K(s).

階数がss以下の一要求から展開される要求木の節点数は、ssに関するメタ理論の帰納法によりNK(s)N_K(s)以下である。各節点は一度だけ Req として展開され、各辺は子の値を親の Frame へ戻すときに一度だけ処理される。したがって3NK(r(q))3N_K(r(q))回の遷移後には必ず停止状態にある。

開始状態とその接頭トレースを

R(q,0)=SeqCode⁡(Req⁡(q)),R(q,n+1)=Step⁡(R(q,n))\begin{aligned} R(q,0)&=\operatorname{SeqCode}(\operatorname{Req}(q)),\\ R(q,n+1)&=\operatorname{Step}(R(q,n)) \end{aligned}

と通常の原始再帰で定める。R(q,3NK(r(q)))R(q,3N_K(r(q)))の唯一の Val の成分を取り出す関数は、合成により原始再帰的である。これをEval⁡(q)\operatorname{Eval}(q)とする。

正しさは階数に関するメタ理論の帰納法で示す。階数00の要求は子をもたず、最初の遷移でC(q,0)C(q,0)を返す。階数s+1s+1では各子の階数がs+1s+1より小さいため、帰納法の仮定により各 Req は定義どおりの値を Val として返す。Frame は返った値を左から漏れなく逆順列へ保存するので、最後にCCが受け取る値列は定義されたすべての子の値である。要求に含めた環境やほかの補助パラメータはd(q,j)d(q,j)が子ごとに自由に更新することができる。この証明で用いた対象言語上の再帰は、接頭長nnに関するRRと上界NKN_Kの通常の原始再帰だけである。▨

4 長さ、成分取得、連結

定義 4.1 (有限列の全域操作).

Len⁡(0)=0,Len⁡(Cons⁡(a,t))=1+Len⁡(t),Entry⁡(Cons⁡(a,t),0)=a,Entry⁡(Cons⁡(a,t),i+1)=Entry⁡(t,i),Concat⁡(0,t)=t,Concat⁡(Cons⁡(a,s),t)=Cons⁡(a,Concat⁡(s,t)).\begin{aligned} \operatorname{Len}(0)&=0,\\ \operatorname{Len}(\operatorname{Cons}(a,t))&=1+\operatorname{Len}(t),\\[2mm] \operatorname{Entry}(\operatorname{Cons}(a,t),0)&=a,\\ \operatorname{Entry}(\operatorname{Cons}(a,t),i+1)&=\operatorname{Entry}(t,i),\\[2mm] \operatorname{Concat}(0,t)&=t,\\ \operatorname{Concat}(\operatorname{Cons}(a,s),t) &=\operatorname{Cons}(a,\operatorname{Concat}(s,t)). \end{aligned}

Len⁡\operatorname{Len}、Entry⁡\operatorname{Entry}、Concat⁡\operatorname{Concat}をそれぞれ 長さ関数 (length function)、成分取得関数 (entry function)、連結関数 (concatenation function) という。

空列に対してEntry⁡(0,i)=0\operatorname{Entry}(0,i)=0とする。したがって、列の長さ以上の添字に対する値も00である。

定理 4.2.Head⁡\operatorname{Head}、Tail⁡\operatorname{Tail}、Len⁡\operatorname{Len}、Entry⁡\operatorname{Entry}、Concat⁡\operatorname{Concat}は正のアリティをもつ原始再帰全関数である。

証明. Head と Tail の原始再帰性は補題 1.2と零判定による場合分けから既に従う。 Len は

Len⁡(s)={0(s=0),1+Len⁡(Tail⁡(s))(s>0)\operatorname{Len}(s)= \begin{cases} 0&(s=0),\\ 1+\operatorname{Len}(\operatorname{Tail}(s))&(s>0) \end{cases}

というコース再帰であり、s>0s>0ではTail⁡(s)<s\operatorname{Tail}(s)<sである。補題 3.1を適用して原始再帰性を得る。

成分取得について、反復尾IIを同補題の証明と同じ通常の原始再帰で定めると

Entry⁡(s,i)=Head⁡(I(s,i))\operatorname{Entry}(s,i)=\operatorname{Head}(I(s,i))

である。したがって Entry は原始再帰的である。i≥Len⁡(s)i\ge\operatorname{Len}(s)なら反復尾は既に00へ達し、その後も00にとどまるので範囲外の値は00になる。

ttをパラメータとして、Concat は第1引数ssに関するコース再帰

C(t,0)=t,C(t,s)=Cons⁡(Head⁡(s),C(t,Tail⁡(s)))(s>0)C(t,0)=t, \qquad C(t,s)=\operatorname{Cons}(\operatorname{Head}(s),C(t,\operatorname{Tail}(s)))\quad(s>0)

である。再び Tail の真の減少と補題 3.1を用いればC(t,s)C(t,s)は原始再帰的であり、Concat⁡(s,t)=C(t,s)\operatorname{Concat}(s,t)=C(t,s)は射影の交換との合成で得る。各構成は全域関数からの合成と通常の原始再帰だけを用いるので、すべて全域である。▨

例 4.3 (復号と連結).c=SeqCode⁡(4,1,7)c=\operatorname{SeqCode}(4,1,7)とすると

Len⁡(c)=3,Entry⁡(c,0)=4,Entry⁡(c,2)=7,Entry⁡(c,5)=0.\operatorname{Len}(c)=3, \quad \operatorname{Entry}(c,0)=4, \quad \operatorname{Entry}(c,2)=7, \quad \operatorname{Entry}(c,5)=0.

d=SeqCode⁡(2,8)d=\operatorname{SeqCode}(2,8)ならConcat⁡(c,d)=SeqCode⁡(4,1,7,2,8)\operatorname{Concat}(c,d)=\operatorname{SeqCode}(4,1,7,2,8)である。

注意 4.4 (下流で符号を変更しない). 以後、自然数上の有限列には、本記事で定めた右入れ子の Cons 符号と Len、Entry、Concat を用いる。下流でこの符号を算術式によって表す場合にも外側の符号値を維持する。素因数分解符号または β 関数へ取り替えると、構文符号、計算列、証明列の数詞が一致しなくなるため、別の符号を併用しない。

5 演習

問題 5.1.

  1. Tail⁡(s)<s\operatorname{Tail}(s)<sがすべての自然数の有限復号を保証する理由を説明せよ。
  2. 補題 3.1で履歴を逆向きに保存した理由を説明せよ。
  3. Entry が範囲外で00を返すことを、反復尾IIから証明せよ。
  4. 補題 3.2で3NK(r(q))3N_K(r(q))回の遷移が停止の上界になる理由を説明せよ。
解答 (確認問題の解答).
  1. 正の符号で Tail を取るたびに自然数が真に減少し、自然数には無限の真の降下列がないからである。
  2. 段階nnで既に計算したF(0),…,F(n−1)F(0),\ldots,F(n-1)のうち、F(d)F(d)を先頭からn−1−dn-1-d回の Tail で取り出せるようにするためである。
  3. i≥Len⁡(s)i\ge\operatorname{Len}(s)ではI(s,i)=0I(s,i)=0である。Tail(0)=0 なので以後も 0 にとどまり、Head(0)=0 から Entry(s,i)=0 となる。
  4. 階数がss以下の要求木の節点数はNK(s)N_K(s)以下である。各節点の要求展開と各辺から親への値の返却を数えると、各節点につき三回以内の遷移で処理することができるためである。

▨

参考文献

  1. George S. Boolos, John P. Burgess, and Richard C. Jeffrey, Computability and Logic, 5th ed., Cambridge University Press, 2007.有限列の算術化と原始再帰的な構文符号化の扱いを参考にした。

前提記事