1 Cantor の対関数
定義 1.1 (Cantor の対関数). a , b ∈ N a,b\in\mathbb N a , b ∈ N に対して
pair ( a , b ) = ( a + b ) ( a + b + 1 ) 2 + b \operatorname{pair}(a,b)
=\frac{(a+b)(a+b+1)}2+b pair ( a , b ) = 2 ( a + b ) ( a + b + 1 ) + b と定める。この関数を Cantor の対関数 (Cantor pairing function ) という。left ( z ) \operatorname{left}(z) left ( z ) とright ( z ) \operatorname{right}(z) right ( z ) は
pair ( left ( z ) , right ( z ) ) = z \operatorname{pair}(\operatorname{left}(z),\operatorname{right}(z))=z pair ( left ( z ) , right ( z )) = z を満たす二つの成分とする。
補題 1.2. pair : N 2 → N \operatorname{pair}\colon\mathbb N^2\to\mathbb N pair : N 2 → N は全単射である。pair \operatorname{pair} pair 、left \operatorname{left} left 、right \operatorname{right} 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 left ( pair ( a , b )) = a , right ( pair ( a , b )) = b が成り立つ。
証明. w = a + b w=a+b w = a + b とおき、三角数T w = w ( w + 1 ) / 2 T_w=w(w+1)/2 T w = w ( w + 1 ) /2 と書けばpair ( a , b ) = T w + b \operatorname{pair}(a,b)=T_w+b pair ( a , b ) = T w + b である。0 ≤ b ≤ w 0\le b\le w 0 ≤ b ≤ w なので、和がw w w である対は
T w , T w + 1 , … , T w + w = T w + 1 − 1 T_w,T_w+1,\ldots,T_w+w=T_{w+1}-1 T w , T w + 1 , … , T w + w = T w + 1 − 1 へ、b b b の順に重複なく写る。これらの区間はw = 0 , 1 , … w=0,1,\ldots w = 0 , 1 , … の順に隣接し、N \mathbb N N を尽くす。したがって各z z z はただ一つのw w w とb ≤ w b\le w b ≤ w をもち、z = T w + b z=T_w+b z = T w + b と書くことができる。a = w − b a=w-b a = w − b とすれば全単射性を得る。
加法、乗法、固定数2 2 2 による商は原始再帰的なのでpair \operatorname{pair} pair は原始再帰的である。pair ( a , b ) = z \operatorname{pair}(a,b)=z pair ( a , b ) = z ならa , b ≤ z a,b\le z a , b ≤ z である。したがって0 ≤ a , b ≤ z 0\le a,b\le z 0 ≤ a , b ≤ z の範囲で等式を満たす唯一の対を有界探索すればよい。有界探索と有限の場合分けは原始再帰的なので、二成分を返すleft \operatorname{left} left とright \operatorname{right} right も原始再帰全関数である。▨
2 すべての自然数を有限列として読む
定義 2.1 (Cons による有限列符号).
Empty = 0 , Cons ( a , t ) = 1 + pair ( a , t ) , SeqCode ( a 0 , … , a n − 1 ) = Cons ( a 0 , Cons ( a 1 , … , Cons ( a n − 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} Empty Cons ( a , t ) SeqCode ( a 0 , … , a n − 1 ) = 0 , = 1 + pair ( a , t ) , = Cons ( a 0 , Cons ( a 1 , … , Cons ( a n − 1 , 0 ) … )) . この符号化を Cons 有限列符号 (Cons finite-sequence coding ) という。
s > 0 s>0 s > 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 ( s ) = left ( s − 1 ) , Tail ( s ) = right ( s − 1 ) とし、Head ( 0 ) = Tail ( 0 ) = 0 \operatorname{Head}(0)=\operatorname{Tail}(0)=0 Head ( 0 ) = Tail ( 0 ) = 0 とする。
前者関数s − ˙ 1 s\mathbin{\dot-}1 s − ˙ 1 と零判定による場合分けを用いれば、Head \operatorname{Head} Head とTail \operatorname{Tail} Tail は全域原始再帰関数である。
命題 2.2. s > 0 s>0 s > 0 ならTail ( s ) < s \operatorname{Tail}(s)<s Tail ( s ) < s である。したがって、任意の自然数s s s からTail \operatorname{Tail} Tail を反復すると有限回で0 0 0 に到達し、s s s はただ一つの有限列へ復号される。ゆえに符号述語Seq ( s ) \operatorname{Seq}(s) Seq ( s ) は常に真である一変数原始再帰関係とすることができ、bad code は存在しない。
証明. s > 0 s>0 s > 0 とし、a = Head ( s ) a=\operatorname{Head}(s) a = Head ( s ) 、t = Tail ( s ) t=\operatorname{Tail}(s) t = Tail ( s ) とおく。対関数の逆の定義によりs = 1 + pair ( a , t ) s=1+\operatorname{pair}(a,t) s = 1 + pair ( a , t ) である。pair ( a , t ) = T a + t + t ≥ t \operatorname{pair}(a,t)=T_{a+t}+t\ge t pair ( a , t ) = T a + t + t ≥ t なのでt < s t<s t < s である。
s s s から始めてs , Tail ( s ) , Tail 2 ( s ) , … s,\operatorname{Tail}(s),\operatorname{Tail}^2(s),\ldots s , Tail ( s ) , Tail 2 ( s ) , … と進むと、正である間は自然数が真に減少する。自然数の真の降下列は有限なので、Tail n ( s ) = 0 \operatorname{Tail}^n(s)=0 Tail n ( s ) = 0 を満たす非負整数n n n が存在する。各正の符号に対する Head と Tail は対関数の全単射性から一意であるため、復号列も一意である。恒真関係の特性関数は単項定数関数C 1 ( s ) = 1 C_1(s)=1 C 1 ( s ) = 1 であり、初期関数から合成で構成することができる。零項関係を追加する必要はない。▨
3 コース再帰を通常の原始再帰へ還元する
値F ( s ) F(s) F ( s ) を、それより小さい引数での値から定める再帰をコース再帰という。ここでは必要な過去の値を右入れ子の履歴へ保存し、通常の原始再帰だけで実行する。
補題 3.1. D ( x ⃗ , s ) < s D(\vec x,s)<s D ( x , s ) < s がs > 0 s>0 s > 0 で成り立つ原始再帰関数D D D と、原始再帰関数B ( x ⃗ ) B(\vec x) B ( x ) 、G ( x ⃗ , s , u ) G(\vec x,s,u) G ( 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) F ( x , 0 ) = B ( x ) , F ( x , s ) = G ( x , s , F ( x , D ( x , s ))) ( s > 0 ) で定まるF F F は原始再帰全関数である。パラメータ列x ⃗ \vec x x は空でもよい。空の場合にもF F F は再帰引数s s s を残す一変数関数であり、零項関数にはならない。
証明. 最初に履歴から第j j j 成分を取る補助関数を作る。
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} I ( t , 0 ) I ( t , j + 1 ) E ( t , j ) = t , = Tail ( I ( t , j )) , = Head ( I ( t , j )) . I I I はj j j に関する通常の原始再帰であり、E E E は合成なので、ともに原始再帰的である。
H ( x ⃗ , n ) H(\vec x,n) H ( x , n ) を、先頭からF ( x ⃗ , n − 1 ) , … , F ( x ⃗ , 0 ) F(\vec x,n-1),\ldots,F(\vec x,0) F ( x , n − 1 ) , … , F ( x , 0 ) を並べた逆向きの履歴符号とする。H H H を次の通常の原始再帰で同時に構成する。
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} H ( x , 0 ) H ( x , n + 1 ) = 0 , = Cons ( V ( x , n ) , H ( x , n )) , ここで
V ( x ⃗ , 0 ) = B ( x ⃗ ) , V(\vec x,0)=B(\vec x), V ( x , 0 ) = B ( x ) , n > 0 n>0 n > 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) V ( x , n ) = G ( x , n , E ( H ( x , n ) , n − 1 − D ( x , n )) ) とする。条件D ( x ⃗ , n ) < n D(\vec x,n)<n D ( x , n ) < n により添字は自然数である。切捨て減法と零判定による場合分けを用いればV V V の右辺は原始再帰関数の合成である。したがってH H H は通常の原始再帰によって得る。
n n n に関するメタ理論の帰納法により、H ( x ⃗ , n ) H(\vec x,n) H ( x , n ) の第n − 1 − d n-1-d n − 1 − d 成分はF ( x ⃗ , d ) F(\vec x,d) F ( x , d ) であることが分かる。特にd = D ( x ⃗ , n ) d=D(\vec x,n) d = D ( x , n ) とすれば、V ( x ⃗ , n ) V(\vec x,n) V ( x , n ) は定義式どおりF ( x ⃗ , n ) F(\vec x,n) F ( x , n ) になる。よって
F ( x ⃗ , n ) = E ( H ( x ⃗ , n + 1 ) , 0 ) F(\vec x,n)=E(H(\vec x,n+1),0) F ( x , n ) = E ( H ( x , n + 1 ) , 0 ) であり、F F F は原始再帰的である。用いた再帰はすべて通常の原始再帰であり、x ⃗ \vec x x が空のときは基底値B = c B=c B = c を一つの自然数として指定する規約に従う。▨
一つの小さい引数の値だけを読む前補題では、二つの直下構文の値を同時に必要とする再帰や、再帰呼出しごとに環境を更新する再帰を直接扱うことができない。次の有限スタック・接頭トレースによる還元を用いる。
補題 3.2. K K K を固定した標準自然数とする。要求q q q に対して、階数r ( q ) r(q) r ( q ) 、子の個数m ( q ) ≤ K m(q)\le K m ( q ) ≤ K 、j < m ( q ) j<m(q) j < m ( q ) に対する第j j j 子d ( q , j ) d(q,j) d ( q , j ) 、および子の値の有限列h h h から親の値を返すC ( q , h ) 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)) r ( d ( q , j )) < r ( q ) ( j < m ( q )) が成り立つなら、各子を左から評価してC C C へ渡す有限分岐コース再帰の値Eval ( q ) \operatorname{Eval}(q) Eval ( q ) は原始再帰全関数である。要求q q q は、主引数だけでなく、種類タグ、補助パラメータ、および子へ渡す更新済み有限環境を含んでよい。
証明. 要求、未処理の子の位置をもつ継続枠、および計算済みの値を、それぞれ固定タグを先頭にもつ
Req ( q ) , Frame ( q , j , h ) , Val ( a ) \operatorname{Req}(q),\qquad
\operatorname{Frame}(q,j,h),\qquad
\operatorname{Val}(a) Req ( q ) , Frame ( q , j , h ) , Val ( a ) という固定長列で符号化する。計算状態は、これらを上端から並べた有限スタックとする。子の値は逆順の列h h h へ保存し、C C C が Entry により左からの順序へ読み直す規約を固定する。
一段遷移 Step を次のように定める。上端が Req( q ) (q) ( q ) でm ( q ) = 0 m(q)=0 m ( q ) = 0 なら、これを
Val( C ( q , 0 ) ) (C(q,0)) ( C ( q , 0 )) へ置き換える。m ( q ) > 0 m(q)>0 m ( q ) > 0 なら、Req( q ) (q) ( q ) を
Req ( d ( q , 0 ) ) , Frame ( q , 1 , 0 ) \operatorname{Req}(d(q,0)),\quad
\operatorname{Frame}(q,1,0) Req ( d ( q , 0 )) , Frame ( q , 1 , 0 ) へ置き換える。上端二要素が Val( a ) (a) ( a ) 、Frame( q , j , h ) (q,j,h) ( q , j , h ) なら、a a a をh h h の先頭へ追加する。j < m ( q ) j<m(q) j < m ( q ) なら次に Req( d ( q , j ) ) (d(q,j)) ( d ( q , j )) と Frame( q , j + 1 , Cons ( a , h ) ) (q,j+1,\operatorname{Cons}(a,h)) ( q , j + 1 , Cons ( a , h )) を積み、j = m ( q ) j=m(q) j = m ( q ) なら両要素を
Val( C ( q , Cons ( a , h ) ) ) (C(q,\operatorname{Cons}(a,h))) ( C ( q , Cons ( a , h ))) へ置き換える。スタックが一要素 Val( a ) (a) ( a ) だけになった停止状態では Step を恒等写像とし、不正な状態の値も0 0 0 への場合分けによって固定する。タグ照合、Head、Tail、Entry、Cons、有界比較、およびr , m , d , C r,m,d,C r , m , d , C だけを用いるため、Step は原始再帰的である。
停止までの一様な原始再帰的上界を与える。次の関数を通常の原始再帰で定める。
N K ( 0 ) = 1 , N K ( s + 1 ) = 1 + K N K ( s ) . N_K(0)=1,\qquad N_K(s+1)=1+K\,N_K(s). N K ( 0 ) = 1 , N K ( s + 1 ) = 1 + K N K ( s ) . 階数がs s s 以下の一要求から展開される要求木の節点数は、s s s に関するメタ理論の帰納法によりN K ( s ) N_K(s) N K ( s ) 以下である。各節点は一度だけ Req として展開され、各辺は子の値を親の Frame へ戻すときに一度だけ処理される。したがって3 N K ( r ( q ) ) 3N_K(r(q)) 3 N 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 , 0 ) R ( q , n + 1 ) = SeqCode ( Req ( q )) , = Step ( R ( q , n )) と通常の原始再帰で定める。R ( q , 3 N K ( r ( q ) ) ) R(q,3N_K(r(q))) R ( q , 3 N K ( r ( q ))) の唯一の Val の成分を取り出す関数は、合成により原始再帰的である。これをEval ( q ) \operatorname{Eval}(q) Eval ( q ) とする。
正しさは階数に関するメタ理論の帰納法で示す。階数0 0 0 の要求は子をもたず、最初の遷移でC ( q , 0 ) C(q,0) C ( q , 0 ) を返す。階数s + 1 s+1 s + 1 では各子の階数がs + 1 s+1 s + 1 より小さいため、帰納法の仮定により各 Req は定義どおりの値を Val として返す。Frame は返った値を左から漏れなく逆順列へ保存するので、最後にC C C が受け取る値列は定義されたすべての子の値である。要求に含めた環境やほかの補助パラメータはd ( q , j ) d(q,j) d ( q , j ) が子ごとに自由に更新することができる。この証明で用いた対象言語上の再帰は、接頭長n n n に関するR R R と上界N K N_K N 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 ( 0 ) Len ( Cons ( a , t )) Entry ( Cons ( a , t ) , 0 ) Entry ( Cons ( a , t ) , i + 1 ) Concat ( 0 , t ) Concat ( Cons ( a , s ) , t ) = 0 , = 1 + Len ( t ) , = a , = Entry ( t , i ) , = t , = Cons ( a , Concat ( s , t )) . Len \operatorname{Len} Len 、Entry \operatorname{Entry} Entry 、Concat \operatorname{Concat} Concat をそれぞれ 長さ関数 (length function ) 、成分取得関数 (entry function ) 、連結関数 (concatenation function ) という。
空列に対してEntry ( 0 , i ) = 0 \operatorname{Entry}(0,i)=0 Entry ( 0 , i ) = 0 とする。したがって、列の長さ以上の添字に対する値も0 0 0 である。
定理 4.2. Head \operatorname{Head} Head 、Tail \operatorname{Tail} Tail 、Len \operatorname{Len} Len 、Entry \operatorname{Entry} Entry 、Concat \operatorname{Concat} 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} Len ( s ) = { 0 1 + Len ( Tail ( s )) ( s = 0 ) , ( s > 0 ) というコース再帰であり、s > 0 s>0 s > 0 ではTail ( s ) < s \operatorname{Tail}(s)<s Tail ( s ) < s である。補題 3.1 を適用して原始再帰性を得る。
成分取得について、反復尾I I I を同補題の証明と同じ通常の原始再帰で定めると
Entry ( s , i ) = Head ( I ( s , i ) ) \operatorname{Entry}(s,i)=\operatorname{Head}(I(s,i)) Entry ( s , i ) = Head ( I ( s , i )) である。したがって Entry は原始再帰的である。i ≥ Len ( s ) i\ge\operatorname{Len}(s) i ≥ Len ( s ) なら反復尾は既に0 0 0 へ達し、その後も0 0 0 にとどまるので範囲外の値は0 0 0 になる。
t t t をパラメータとして、Concat は第1引数s s s に関するコース再帰
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) C ( t , 0 ) = t , C ( t , s ) = Cons ( Head ( s ) , C ( t , Tail ( s ))) ( s > 0 ) である。再び Tail の真の減少と補題 3.1 を用いればC ( t , s ) C(t,s) C ( t , s ) は原始再帰的であり、Concat ( s , t ) = C ( t , s ) \operatorname{Concat}(s,t)=C(t,s) Concat ( s , t ) = C ( t , s ) は射影の交換との合成で得る。各構成は全域関数からの合成と通常の原始再帰だけを用いるので、すべて全域である。▨
例 4.3 (復号と連結). c = SeqCode ( 4 , 1 , 7 ) c=\operatorname{SeqCode}(4,1,7) c = 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. Len ( c ) = 3 , Entry ( c , 0 ) = 4 , Entry ( c , 2 ) = 7 , Entry ( c , 5 ) = 0. d = SeqCode ( 2 , 8 ) d=\operatorname{SeqCode}(2,8) d = SeqCode ( 2 , 8 ) ならConcat ( c , d ) = SeqCode ( 4 , 1 , 7 , 2 , 8 ) \operatorname{Concat}(c,d)=\operatorname{SeqCode}(4,1,7,2,8) Concat ( c , d ) = SeqCode ( 4 , 1 , 7 , 2 , 8 ) である。
5 演習
問題 5.1.
Tail ( s ) < s \operatorname{Tail}(s)<s Tail ( s ) < s がすべての自然数の有限復号を保証する理由を説明せよ。
補題 3.1 で履歴を逆向きに保存した理由を説明せよ。
Entry が範囲外で0 0 0 を返すことを、反復尾I I I から証明せよ。
補題 3.2 で3 N K ( r ( q ) ) 3N_K(r(q)) 3 N K ( r ( q )) 回の遷移が停止の上界になる理由を説明せよ。
解答 (確認問題の解答).
正の符号で Tail を取るたびに自然数が真に減少し、自然数には無限の真の降下列がないからである。
段階n n n で既に計算したF ( 0 ) , … , F ( n − 1 ) F(0),\ldots,F(n-1) F ( 0 ) , … , F ( n − 1 ) のうち、F ( d ) F(d) F ( d ) を先頭からn − 1 − d n-1-d n − 1 − d 回の Tail で取り出せるようにするためである。
i ≥ Len ( s ) i\ge\operatorname{Len}(s) i ≥ Len ( s ) ではI ( s , i ) = 0 I(s,i)=0 I ( s , i ) = 0 である。Tail(0)=0 なので以後も 0 にとどまり、Head(0)=0 から Entry(s,i)=0 となる。
階数がs s s 以下の要求木の節点数はN K ( s ) N_K(s) N K ( s ) 以下である。各節点の要求展開と各辺から親への値の返却を数えると、各節点につき三回以内の遷移で処理することができるためである。
▨