再帰定理とY-combinator
同じく高橋正子著 『計算論』 近代科学社のp.51から:
補題1.6.10
をが個の引数を取る計算プログラムのコードとしたとき,その計算結果を返す関数とする(がプログラムのコードでなかったり,計算が止まらないときは未定義とする).
このとき任意の帰納的な全域関数に対して,ある自然数が存在して,
は,それ以前に詳しく定義されている部分帰納的関数で,を動かすことで(部分)帰納的関数を枚挙するものになっている.ただし,がプログラムのコード(ゲーデル数を使ったプログラムのコード化)でない場合は未定義なので,かなりスカスカした感じである.
テキストではひっそりと再帰定理と書いてあるが,特にそれに関しては言及がない.あくまで次のRiceの定理を証明するための補題との位置づけである.
それにしてもこの補題の主張はかなり奇妙な感じがする.というのは,およびがプログラムのコードでない場合は,定義域全域で未定義の関数が等しいといっているだけに思えるからである.もし,として,定義域が空でない部分帰納的関数のプログラムコードになっているものが存在するとなるとかなりすごい主張なのであるが,が任意なのでがそのようなプログラムコードになっている一般的な保障などはありそうにない.ただし,をうまく取れば,が全域で定義された帰納関数のコードになる場合がある.そのひとつの例を次に述べるが,この定理(Kleeneに拠る)が再帰定理と呼ばれる理由になっている.
上の全域で定義された帰納的関数との全域で定義された帰納的関数を任意に選んでおく.
として上の部分帰納的関数のプログラムコードを上の部分帰納的関数のプログラムコードに移す次のようなものを取る:
このようにを定義しておき(Pが帰納的関数のコードでない場合でも,上の定義をそのまま適用すれば,は部分帰納的関数のコードになる.よって,は全域で定義されている),補題を適用すると,
なる自然数が存在する.と定義すると, の定義と,補題の関係式より
が成立する.すなわちこれはが,とから再帰的に定義された帰納関数であるということになっている(したがって全域で定義されている).
定理の形からは不動点定理なわけであるが,不動点=再帰という公式は計算論ではよくある話のようである.
計算では,関数を関数に移す写像の不動点を作り出すものということでは,Y-combinatorと呼ばれるものがある.
が,その定義であるが,かなりけったいな代物ではある.この演算子は引数に関数を関数に移す写像を取り,結果は関数となる.この結果の関数がどういう形になるかを計算してみると
[tex:\quad\quad Yf=(\lambda x.f(xx))(\lambda x.f(xx))= f*1(\lambda x.f(xx)))=f(Yf)]
と確かに形式的にはの不動点になるわけだが,内容的には代入の無限後退が起こっており,のの部分を集合論の言葉で表現しようとすると面倒なことが起こる.そのための理論が計算のモデルであり,テキストである『計算論』の主題になっている.
ここでは上の補題とY-combinatorの関連について考察してみる.補題の証明を振り返れば
によって,は,『n+1個の引数をとる部分帰納的関数のコードを与えたとき,最後の引数に自身のコードを代入することで n個の引数をとる部分帰納的関数にしたもの』のコードである.これにを写像した自然数をn個の引数をとる部分帰納的関数のコードとした計算は,
となる.証明のこの部分から,またの不動点の存在ということからも,が『n個の引数をとる部分帰納的関数のコードをn個の引数をとる部分帰納的関数のコードに写像する』ぐらいの制限が無いと実質的には意味をなさないということがわかる.
さて,この計算はとのn+1個の引数をとる部分帰納関数でもあるから,そのコードをとすると,
.
左辺はきちんときまった計算であり,コードには何の不思議もない.
さて,コードはn+1個の引数をとる部分帰納関数であるから,ののところに代入することで が定義できる.
より,が成立するため,が題意を満たす自然数になっている.ただし,直接が成立しているわけではない.あくまでコードとコードは,n個の引数をとる部分帰納関数としてどちらも同じものを与えるという意味での不動点である.
ここで簡単のために,の場合を考えてみる.このときは,
なのであるが,この右辺をあるいはと書いてしまえば,Y-combinatorに現れるのとの関連が浮かんでくる.対応は,
となり,再帰定理での不動点とY-combinatorの作用の結果である不動点がぴったり対応する.
ここでいう対応とは計算のモデル理論で厳密に定義されるものである.テキストの前半で展開されている,部分帰納関数の計算プログラムのゲーデル数によるコーディングを使ったこのモデルはたぶんの部分モデルになってると思われるが,不勉強ゆえ正確なところはまだ私にはわからない.
*1:\lambda x.f(xx