5

万能帰納的関数に関する逆張り話。

756
0

ISer Advent Calendar 2020 12/01

はじまり。

存在することだけ注目されて具体的な構成がスルーされがちな万能帰納的関数さんですが、その基本性質として知られている s-m-n theorem (パラメータ定理) の証明には万能帰納的関数の具体的な構成を用いるのが普通です。そのため万能帰納的関数の存在をファクトにしてしまう本では s-m-n の証明も省略されてしまい、結果として読者は再帰定理や Rice の定理といった強力な s-m-n の系たちを「なんか成り立つらしい」で飲み込まなくてはなりません。

ちょっと待って!

証明が省略されて「成り立つよ」なんて納得できないですよね?納得できないので反例を出しました。s-m-n、再帰定理、Rice、そういうのが成り立たない残念な万能帰納的関数の例です。そんなに難しい例でもないので「私も出せるよ」と思いながら気楽に読むといいと思います。

前提知識

まずは些細な定義の違いで揉めたり疑問を残したりしないように、各用語が何を指すのかの共通認識を得ましょう。何事においても重要なことです。ただし帰納的関数の定義などは仮定します。

ゲーデル関数

自然数iに対しpr(i)i番目の素数を表すことにする。例えばpr(0)=2,pr(1)=3など。

このとき関数G:iNNiN,(x0,,xn1)i=0n1pr(i)xi+1をゲーデル関数と呼ぶ。また始域を制限した G|NiGiと書くことにする。

本当は、ゲーデル関数というのは特別ないくつかの条件を満たす関数ならなんでもよい、言わば関数の性質を表す言葉なのですが、ここでは詳しい解説を省くため特に性質の良い例である上の関数で固定しておきます。これは有限長の数列を自然数にコーディングするものです。

万能帰納的関数, universal recursive function

自然数上の二変数部分関数 f:N2Nが万能帰納的関数であるとは、任意の帰納的関数を実行できる帰納的関数であることを言う。つまり f自身が帰納的関数であり、さらに任意の帰納的関数g:NnNに対し、gのコードもしくはインデックスと呼ばれるある自然数egが存在して f(eg,Gn())なる関数が gに一致する。

万能帰納的関数とはつまりコンピュータのことです。プログラム egと入力 (x0,,xn1)を受け取って、その実行結果 g(x0,,xn1) を得ます。コンピュータの内部実装がただ一つではないように、万能帰納的関数もその定義を満たす範囲で色々なものが考えることができます。これが今回の本題に繋がります。

s-m-n

fを万能帰納的関数とする。このとき任意の自然数m,nNに対し、ある原始帰納的関数 Snm:Nm+1Nが存在して、任意のe,x0,,xn1,y0,,ym1に対し次を満たす。

f(Snm(e,y0,,ym1),Gn(x0,,xn1))=f(e,Gn+m(x0,,xn1,y0,,ym1))

これはプログラムeに入力の一部y0,,ym1を部分適用した新たなプログラムSnm(e,y0,,ym1)を計算できることを主張しています。あたかも任意の万能帰納的関数で成り立つかのように書いてありますが、成り立たない例も存在するよというのが今回の話です。

再帰定理

fを万能帰納的関数とする。任意の一変数全域的帰納的関数 g:NNと自然数kNについて、ある自然数uが存在してug(u)は同じk変数関数のコードになる。つまり f(u,Gk())f(g(u),Gk())は同じ関数になる。

Rice

fを万能帰納的関数とする。このとき、以下の条件全てを満たす関数g:NNは存在しない。

  1. 全域的である。
  2. 定数関数ではない。
  3. 帰納的関数である。
  4. ある自然数kNが存在し、同じk変数関数のコードとなる自然数には同じ値を返す。つまり、f(a,Gk())f(b,Gk())が同じ関数ならばg(a)=g(b)となる。

再帰定理は一種の不動点定理です。s-m-n を使ってうまく具体的なuを構成することで証明できます。また Rice は決定不能な集合をどんどん見つけることができる強い定理であり、条件1.2.3.と再帰定理をうまく使って条件4.に違反させることで証明できます。

お話。

万能帰納的関数の例 fを具体的に構成したり、その構成で得られた fにおいて上の定理たちが成立することは自分で勉強してもらうとして、言葉の共有が済んだので本題に近づきましょう。

任意の万能帰納的関数 fと0でない自然数kN>0について、次の集合totalkNは決定不能である。

totalk={eNf(e,Gk())}

決定可能であると仮定すれば、次の関数g:NkNは全域的かつ帰納的。
g(x0,,xk1)={f(x0,Gk(x0,,xk1))+1(x0totalk)0(otherwise)

よってこの関数のコードegを考えれば、
g(eg,,eg)=f(eg,Gk(eg,,eg))+1=g(eg,,eg)+1
より矛盾である。

今、対角線論法によって証明を行いましたが、Rice の定理を用いればk=0の場合も含めてより簡単に示すことができます。

ちょっと待って!

でも0変数関数ってつまり定数なので、例えばnのコードはn+1、未定義関数のコードは0という簡単なコーディングができてしまいますよね?そしてこの場合、total0=N>0に他ならず明らかに決定可能です。おっ、楽しいね。

本題

本題

任意に万能帰納的関数 fをとる。このとき次の関数 fも万能帰納的関数だが、Riceの定理は成立しない。
f(e,x)={undefined(e=0x=G0())e1(e>0x=G0())f(e,x)(otherwise)

はい、Rice が成り立たない例が出ました。Rice は再帰定理から、再帰定理は s-m-n から従うので、もうこの時点で「再帰定理も s-m-n も壊れちゃったなぁ」という感じなのですが、ちゃんとどこがどうして壊れたのか眺めることは大切です。

s-m-n theorem に注目しましょう。一体どんな m,nNで困ってしまうでしょうか。もちろん0を使いたいのですが、m=0では恒等関数がSn0の例になってしまいます。ではm>0,n=0の場合を考えましょう。このとき S0mは次のような関数でなくてはなりません。

S0m(e,y0,,ym1)={f(e,Gm(y0,,ym1))+1(f(e,Gm(y0,,ym1)))0(otherwise)

つまりS0mは変数の数を固定しただけの万能帰納的関数、それも全域的であるという強力な代物というわけです。このような関数は当然、原始帰納的であるどころか帰納的ですらありません。

上の S0mが帰納的であると仮定する。このとき
g(x0,,xm1)=S0m(x0,x0,,xm1)
なる関数も全域的かつ帰納的だが、そのコードegを考えれば
g(eg,,eg)=S0m(eg,eg,,eg)=f(eg,Gm(eg,,eg))+1=g(eg,,eg)+1
より矛盾である。

おわり。

今回挙げた例では、m>0,n>0の場合は残念ながら、元の f で s-m-n が成立するならその Snm が必ず f に対しても Snm の条件を満たします。お?今度はm>0,n>0Snm が存在しないような万能帰納的関数を探してみたくなってきましたね。なれ!その場合、今回のtotal0の代わりにどのような集合が Rice を破るのでしょうか?是非みなさん面白い例を出して私に教えてあげましょう。

投稿日:20201130
OptHub AI Competition

この記事を高評価した人

高評価したユーザはいません

この記事に送られたバッジ

バッジはありません。
バッチを贈って投稿者を応援しよう

バッチを贈ると投稿者に現金やAmazonのギフトカードが還元されます。

投稿者

うお。
うお。
21
2240
趣味の話をするマン。

コメント

他の人のコメント

コメントはありません。
読み込み中...
読み込み中