Kleeneの再帰定理(Kleene's recursion theorem)とは、部分計算可能関数の標準の番号付け $\varphi_e$ について、任意の 2 変数の部分計算可能関数 $g$ に対し、すべての $y$ で $\varphi_e(y)\simeq g(e,y)$ となる番号 $e$ が存在する、という計算可能性理論の定理である。プログラムは自分自身の番号を参照して計算してよいことを意味し、s-m-n 定理による対角線の構成で証明される。任意の計算可能関数 $f$ に対して $\varphi_e=\varphi_{f(e)}$ となる $e$ があるという不動点の形と同値で、そのような $e$ は無限個あり、パラメータから計算で求めることもできる。自分自身を出力するプログラムや自己参照による関数の定義を正当化し、Rice の定理の別証明を与える。
停止問題 の決定不能性の証明では、番号 $e$ のプログラムに自分の番号 $e$ を入力として与え、矛盾を導いた。Kleene の再帰定理(Kleene's recursion theorem)は、この自己言及が矛盾のためだけのものではないことを示す。どんな部分計算可能関数 $g(x,y)$ を与えても、「入力 $y$ に対して、自分の番号 $e$ を使って $g(e,y)$ を計算する」プログラム $e$ が存在する。プログラムは自分自身の符号を知っているかのように書いてよい、ということである。
この定理から、自分自身を出力するプログラムの存在、任意の計算可能な番号の変換 $f$ に対して $\varphi_e=\varphi_{f(e)}$ となる番号 $e$ の存在(不動点の形)、自分自身を呼び出す定義による部分計算可能関数の構成が得られる。Riceの定理 も不動点の形から直ちに従う。この記事では、定理とそのパラメータ付きの形を証明し、不動点が無限個あることと、いくつかの応用を示す。
名前の似た Kleeneの不動点定理 は、ω完備半順序集合の上の ω連続写像の最小不動点についての定理で、この記事の定理とは別のものである。自然数の上の再帰的な定義(初期値と規則による写像の定義)を正当化する 再帰定理 とも別のものである。
$\mathbb{N}=\{0,1,2,\dots\}$ とする。部分関数 $f\colon\mathbb{N}^k\rightharpoonup\mathbb{N}$ について、$f(\vec x)$ が定義されることを $f(\vec x)\!\downarrow$、されないことを $f(\vec x)\!\uparrow$ と書き、$\alpha\simeq\beta$ は「両辺とも定義されて等しいか、両辺とも定義されない」ことを表す。部分計算可能・計算可能(全域的)・決定可能・半決定可能の意味は 計算可能関数 の定義「計算可能関数」に従う。部分計算可能関数は合成と μ 作用素で閉じており、合成は内側の値がすべて定義されるときにだけ定義される。
番号付けは 計算可能関数 の定義「標準の番号付け」の $\varphi^{(k)}_e$($k$ 変数、$\varphi_e:=\varphi^{(1)}_e$)に固定し、$k\le3$ について次の事実を使う。
任意の 2 変数の部分計算可能関数 $g$ に対し、番号 $e$ があって、すべての $y$ について
$$
\varphi_e(y)\simeq g(e,y)
$$
が成り立つ。
$(x,y)\mapsto\varphi^{(2)}_x(x,y)$ は (N2) の関数と代入の合成なので部分計算可能である。(N4)($m=n=1$)により計算可能関数 $\delta$ で、すべての $x,y$ について
$$
\varphi_{\delta(x)}(y)\simeq\varphi^{(2)}_x(x,y)
$$
となるものがある。次に $l(x,y):\simeq g(\delta(x),y)$ は部分計算可能関数の合成なので部分計算可能であり、(N1) により $l=\varphi^{(2)}_d$ となる $d$ がある。$e:=\delta(d)$ とおくと、すべての $y$ について
$$
\varphi_e(y)\simeq\varphi_{\delta(d)}(y)\simeq\varphi^{(2)}_d(d,y)\simeq l(d,y)\simeq g(\delta(d),y)\simeq g(e,y)
$$
である。$\square$
$\delta(x)$ は「2 変数のプログラム $x$ の最初の引数に、$x$ 自身を入れたプログラム」の番号であり、対角線論法の対角線に当たる。プログラム $d$ は「受け取った番号 $x$ を $\delta$ で対角線に移し、それを $g$ に渡す」もので、その $d$ をさらに対角線に置いた $\delta(d)$ では、実行されるプログラムと $g$ に渡される番号が一致する。
2 から、自己停止集合 $K$ は指数集合($\varphi_a=\varphi_b$ なら $a,b$ が同時に属するか同時に属さない集合)でないことが分かる。
2 の $e$ をとる。(N3) により $\varphi_b=\varphi_e$、$b\neq e$ となる $b$ がある。$\varphi_e(e)\!\downarrow$ なので $e\in K$ であり、$\varphi_b(b)=\varphi_e(b)$ は $b\neq e$ なので定義されず、$b\notin K$ である。
番号を番号へ移す計算可能な変換 $f$ を「プログラムの書き換え」とみなすと、どんな書き換えにも、書き換えても計算する関数が変わらないプログラムがある。
任意の計算可能関数 $f\colon\mathbb{N}\to\mathbb{N}$ に対し、$\varphi_e=\varphi_{f(e)}$ となる番号 $e$ がある。
$g(x,y):\simeq\varphi_{f(x)}(y)$ は (N2) の関数と $f$ の合成なので部分計算可能である。thm-krt-main の $e$ について、すべての $y$ で $\varphi_e(y)\simeq g(e,y)\simeq\varphi_{f(e)}(y)$ である。$\square$
逆に、不動点の形から thm-krt-main が出る。2 変数の部分計算可能関数 $g$ に対し、(N4) により $\varphi_{f(x)}(y)\simeq g(x,y)$ となる計算可能関数 $f$ をとり、その不動点 $e$ をとれば $\varphi_e(y)\simeq\varphi_{f(e)}(y)\simeq g(e,y)$ だからである。2 つの形は同じ定理の言い換えである(OLT26 Lemma 30.25)。
等しくなるのは番号ではなく関数である。$f(x):=x+1$ には $e=f(e)$ となる数はないが、cor-krt-fixed-point により $\varphi_e=\varphi_{e+1}$ となる $e$ はある。番号が隣り合う 2 つのプログラムが同じ関数を計算する、ということである。
任意の計算可能関数 $f\colon\mathbb{N}\to\mathbb{N}$ に対し、$\varphi_e=\varphi_{f(e)}$ となる番号 $e$ は無限個ある。したがって、任意の 2 変数の部分計算可能関数 $g$ に対し、すべての $y$ で $\varphi_e(y)\simeq g(e,y)$ となる $e$ も無限個ある。
$N\in\mathbb{N}$ を任意にとり、$e>N$ となる不動点があることを示す。定数関数 $y\mapsto0,\ y\mapsto1,\ \dots,\ y\mapsto N+1$ は互いに異なる $N+2$ 個の部分計算可能関数なので、そのうち少なくとも 1 つは $\varphi_0,\dots,\varphi_N$ のどれとも異なる。その関数の番号を $a$ とし、
$$
f'(x):=\begin{cases}a&(x\le N),\\ f(x)&(x>N)\end{cases}
$$
とおく。$f'$ は計算可能なので、cor-krt-fixed-point により $\varphi_e=\varphi_{f'(e)}$ となる $e$ がある。$e\le N$ なら $\varphi_e=\varphi_a$ となるが、$\varphi_a$ は $\varphi_0,\dots,\varphi_N$ のどれとも異なるので矛盾する。よって $e>N$ であり、$\varphi_e=\varphi_{f'(e)}=\varphi_{f(e)}$ である。
後半は、(N4) により $\varphi_{f(x)}(y)\simeq g(x,y)$ となる計算可能関数 $f$ をとり、前半を使えばよい。$\square$
不動点を、パラメータ $z$ から計算で求めることもできる。
任意の 3 変数の部分計算可能関数 $g$ に対し、計算可能関数 $p\colon\mathbb{N}\to\mathbb{N}$ があって、すべての $z,y$ について
$$
\varphi_{p(z)}(y)\simeq g\bigl(p(z),z,y\bigr)
$$
が成り立つ。
prf-krt-main の $\delta$($\varphi_{\delta(x)}(y)\simeq\varphi^{(2)}_x(x,y)$)を使う。$G(z,x,y):\simeq g(\delta(x),z,y)$ は 3 変数の部分計算可能関数なので、(N4)($m=1$、$n=2$)により計算可能関数 $l$ で、すべての $z,x,y$ について $\varphi^{(2)}_{l(z)}(x,y)\simeq G(z,x,y)$ となるものがある。$p(z):=\delta(l(z))$ とおくと、$p$ は計算可能で、
$$
\varphi_{p(z)}(y)\simeq\varphi^{(2)}_{l(z)}\bigl(l(z),y\bigr)\simeq G\bigl(z,l(z),y\bigr)\simeq g\bigl(\delta(l(z)),z,y\bigr)\simeq g\bigl(p(z),z,y\bigr)
$$
である。$\square$
thm-krt-main の証明では $d$ を (N1) で「とった」が、ここではそれを (N4) で $z$ から計算している。そのため不動点 $p(z)$ が $z$ の計算可能関数になる。
プログラムの中で自分自身を呼び出して関数を定義することは、再帰定理によって正当化される。
2 変数の部分計算可能関数 $(x,y)\mapsto1$ と $(x,y)\mapsto y\cdot\varphi_x(y\mathbin{\dot-}1)$ の番号をそれぞれ $c_1,c_2$ とし((N1)・(N2))、
$$
j(y):=\begin{cases}c_1&(y=0),\\ c_2&(y\ge1),\end{cases}\qquad g(x,y):\simeq\varphi^{(2)}_{j(y)}(x,y)
$$
とおく。$j$ は計算可能なので、$g$ は (N2) の関数と $j$ の合成として部分計算可能であり、$g(x,0)=1$、$y\ge1$ では $g(x,y)\simeq y\cdot\varphi_x(y-1)$ である。thm-krt-main の $e$ をとると
$$
\varphi_e(0)=1,\qquad\varphi_e(y)\simeq y\cdot\varphi_e(y-1)\quad(y\ge1)
$$
であり、$y$ についての帰納法で、すべての $y$ について $\varphi_e(y)$ が定義されて $y!$ に等しいことが分かる。
場合分けの両方に部分関数が現れるときは、このように「どちらの番号で計算するか」を計算可能関数 $j$ で選び、(N2) の関数に渡す。分岐しない側の計算が止まらなくても、結果に影響しない。
自己参照の式が関数を 1 つに決めるとは限らない。$g(x,y):\simeq\varphi_x(y)$ では、式 $\varphi_e(y)\simeq\varphi_e(y)$ がどの $e$ でも成り立つ。ex-krt-factorial で関数が決まったのは、式の右辺が $y$ より小さい入力での値だけを使い、帰納法が使えたからである。自己参照による定義の一般の形と例は OLT26 §30.23(pp. 471–472)にある。
部分計算可能関数 $f$ で、「$W_e$ が決定可能なら、$f(e)$ が定義されて $\varphi_{f(e)}$ が $W_e$ の特性関数になる」という性質をもつものはない(OLT26 Theorem 30.27、p. 471)。
部分計算可能関数 $f$ を任意にとり、$g(x,y):\simeq\mu z\,[\,y+\varphi_{f(x)}(0)=0\,]$ とおく。$g$ は (N2) の関数と $f$ の合成に μ 作用素を施したもので部分計算可能であり、$g(x,y)$ は、$y=0$ かつ $f(x)$ と $\varphi_{f(x)}(0)$ が定義されて $\varphi_{f(x)}(0)=0$ のときに $0$ をとり、それ以外では定義されない(μ の条件が $z$ によらないので、偽なら探索は止まらない)。thm-krt-main の $e$ をとると $W_e\subset\{0\}$ なので、$W_e$ は有限集合で決定可能である。$f(e)$ と $\varphi_{f(e)}(0)$ が定義されて $\varphi_{f(e)}(0)=0$ なら $W_e=\{0\}$ であり、特性関数の $0$ での値は $1$ のはずだが $\varphi_{f(e)}(0)=0$ である。そうでなければ $W_e=\emptyset$ であり、特性関数の $0$ での値は $0$ のはずだが、$f(e)$ か $\varphi_{f(e)}(0)$ が定義されないか、$\varphi_{f(e)}(0)\neq0$ である。どちらの場合も $f$ は性質をもたない。
番号の大小についての問いにも、不動点の形が効く。番号 $e$ が 最小の番号 であるとは、$e'< e$ となるどの $e'$ でも $\varphi_{e'}\neq\varphi_e$ であることとし、最小の番号の全体を $\mathrm{MIN}$ と書く。部分計算可能関数はどれも最小の番号をただ 1 つもち、関数ごとに異なるので、$\mathrm{MIN}$ は無限集合である。
$\mathrm{MIN}$ の無限部分集合で半決定可能なものはない。とくに $\mathrm{MIN}$ は半決定可能でない。
$A\subset\mathrm{MIN}$ が無限で半決定可能だとする。計算可能関数 の定理「無限集合の枚挙」の 1 により、単射な計算可能関数 $a\colon\mathbb{N}\to\mathbb{N}$ で $A=a(\mathbb{N})$ となるものがある。$A$ は無限なので、各 $x$ に対し $a(k)>x$ となる $k$ があり、
$$
f(x):=a\bigl(\mu k\,[\,a(k)>x\,]\bigr)
$$
は計算可能関数で、$f(x)>x$ かつ $f(x)\in\mathrm{MIN}$ である。cor-krt-fixed-point により $\varphi_e=\varphi_{f(e)}$ となる $e$ をとると、$e< f(e)$ で $\varphi_e=\varphi_{f(e)}$ なので、$f(e)$ は最小の番号でない。これは $f(e)\in\mathrm{MIN}$ に反する。$\square$
$f$ は「自分より大きい、$A$ に載っている番号へ書き換える」変換である。不動点 $e$ は、自分より大きい最小の番号と同じ関数を計算してしまうので、その番号の最小性を壊す。
同じ考え方で、プログラムの振る舞いについての自明でない性質はどれも決定可能でないこと(Riceの定理)も、cor-krt-fixed-point から導ける。性質を判定できると仮定して「性質をもつなら、もたないプログラムのふりをする」書き換え $f$ を作ると、その不動点で矛盾が起きる。証明は Riceの定理 の節「不動点による別証明」にある。
prf-krt-main の構成は、算術の文が自分の Gödel 数について語る文を作る Gödelの不完全性定理 の補題「対角化補題」(一般の理論での形は 対角化補題)や、任意の項 $F$ に対し $YF$ と $F(YF)$ が $\beta$ 同値になる項 $Y$ を作る λ計算 の定理「不動点定理」と同じ形をしている。いずれも「対象 $x$ を受け取って $x$ を $x$ 自身に適用する」操作を、さらにそれ自身に適用している($\lambda$ 計算との対応は OLT26 pp. 469–470 の説明)。
| 外す条件 | 反例 | 成り立たなくなること |
|---|---|---|
| $g$ が部分計算可能(thm-krt-main) | $g(x,y):=0$($\varphi_x(y)\!\uparrow$)、$g(x,y)$ は定義されない($\varphi_x(y)\!\downarrow$) | $\varphi_e(y)\simeq g(e,y)$ となる $e$ の存在 |
| $f$ が計算可能(cor-krt-fixed-point) | $\varphi_a$ を定数 $0$、$\varphi_b$ をどこでも定義されない関数とし、$f(x):=a$($\varphi_x(0)\!\uparrow$)、$f(x):=b$($\varphi_x(0)\!\downarrow$) | $\varphi_e=\varphi_{f(e)}$ となる $e$ の存在 |
| $f$ が全域的(cor-krt-fixed-point) | どこでも定義されない部分計算可能関数 $f$ | $\varphi_e=\varphi_{f(e)}$ となる $e$ の存在 |
どの行も、結論の等式を満たす $e$ があると仮定して矛盾を導く。
1 行目:$\varphi_e(y)\simeq g(e,y)$ がすべての $y$ で成り立つなら、$\varphi_e(y)\!\downarrow\iff g(e,y)\!\downarrow\iff\varphi_e(y)\!\uparrow$ となって矛盾する。thm-krt-main の対偶により、この $g$ は部分計算可能でない。
2 行目:$f$ は全域的である。$\varphi_e(0)\!\uparrow$ なら $\varphi_{f(e)}=\varphi_a$ は $0$ で定義されるので $\varphi_e\neq\varphi_{f(e)}$ であり、$\varphi_e(0)\!\downarrow$ なら $\varphi_{f(e)}=\varphi_b$ は $0$ で定義されないので $\varphi_e\neq\varphi_{f(e)}$ である。cor-krt-fixed-point の対偶により $f$ は計算可能でない。
3 行目:$f(e)$ がどの $e$ でも定義されないので、$\varphi_{f(e)}$ という関数がない。部分計算可能な $f$ については、「$f(e)$ が定義されるなら $\varphi_e=\varphi_{f(e)}$」という弱い形しか期待できない。
Mathpediaは寄付と、参考文献の書籍リンク(Amazonアソシエイト)の紹介料で運営されています。 支援について / 寄付する