プログラムを書くと、どんな入力でも必ず答えを返すものもあれば、入力によっては延々と動き続けるものもあります。「あるプログラムが、この入力でいつか止まるか」を、別のプログラムで必ず見抜くことはできるのでしょうか。この記事では、まず「計算できる」とは何かを数学の言葉で決め、そのうえで「見抜く手順は存在しない」ことを証明します。読み終えると、「解けない」ことを証明するとはどういうことか、その典型的な形が分かります。
「アルゴリズムで計算できる関数」を、チューリング機械 で数学的に定義します。有限個の規則をもつ機械が、無限に延びるテープの上で記号 0 , 1 0,1 0 , 1 (と作業用の目印 2 2 2 )を読み書きする、という最小限のモデルです。
同じクラスの関数を、機械を使わない帰納的な定義でも与えられます。原始再帰関数 (足し算から掛け算を作るように、一つ前の値から次の値を組み立てる繰り返しで定義される関数)に最小化演算 μ \mu μ (条件を満たす最小の数を探す操作)を加えたものが部分再帰関数 です。両者が一致すること(定理 5.4 , 定理 6.2 )が、定義の選び方に依らない概念であることの根拠になります。
チューリング機械の動作を数に置き換えて(算術化)、ステップ数を探索する部分以外が原始再帰的であることを示すと、クリーネの標準形定理 (定理 5.3 )が出ます。これが機械そのものを数で名指しし、それを実行する万能関数 (番号 e e e と入力を受け取り、番号 e e e の機械の動作を再現する関数)を得る仕組みです。
停止問題 は決定不能です(定理 7.2 )。証明はカントールの対角線論法と同じ形で、「自分自身に適用した結果を反転する」関数を作ります。
ライスの定理 (定理 8.2 ):機械が計算する関数の(自明でない)性質を、機械の記述から判定するアルゴリズムは存在しない。停止問題への帰着が証明の中身です。
この結果が、不完全性定理(形式体系の定理は列挙できるが判定できない)と、型検査器にできること・できないことの前提になります。
この記事で使う事前知識
部分関数 : 定義域の一部でしか値が決まらなくてもよい関数。入力によっては「未定義」になります。§1 でこの記事の記号を確認します。
対角線論法 : 数え上げた表の対角成分をずらして、どの行にも現れないものを作る議論。→ 濃度と無限
数学的帰納法 : 最初の場合と「n n n のとき成り立てば n + 1 n+1 n + 1 でも成り立つ」を示して、すべての自然数で成り立つとする証明。→ 証明の技術
背理法 : 結論が成り立たないと仮定して矛盾を導く証明。→ 証明の技術
特性関数 : 集合に属すれば 1 1 1 、属さなければ 0 0 0 を返す関数(§2.2 で定義します)。
素因数分解の一意性 : 自然数は素数の積として(順序を除いて)ただ一通りに書けること。
1928 年、ヒルベルトとアッケルマンは決定問題 を提示しました。一階述語論理の文を与えられたとき、それが恒真であるか否かを、有限回の機械的な操作で必ず判定する手順はあるか、という問いです。一階述語論理と完全性定理 で見たとおり、恒真な文には必ず証明があり、証明は機械的に検査できます。証明を短い順にすべて試せば、恒真な文はいつか見つかります。しかし恒真でない文については、探索は永遠に終わりません。
この問いに「ない」と答えるには、「手順」の意味を数学の言葉で固定しなければなりません。「どんな手順をもってしても不可能だ」を証明するには、手順の全体を定義する必要があるからです。1936 年にチャーチは λ \lambda λ 定義可能性で、チューリングはチューリング機械 で、これを行いました。さらに両者が(そしてゲーデルとクリーネの再帰関数も)同じクラスの関数を与えることが示されます。
この記事の目標は三つです。(1) 計算可能性の標準的な定義を与え、それらが一致することを示す。(2) 停止問題が解けないことを証明する。(3) その帰結として、機械の性質に関する問いのほとんどが解けないこと(ライスの定理)を示す。
記号と約束。 N = { 0 , 1 , 2 , … } \mathbb{N}=\{0,1,2,\ldots\} N = { 0 , 1 , 2 , … } です。関数 f : N n ⇀ N f:\mathbb{N}^n\rightharpoonup\mathbb{N} f : N n ⇀ N は部分関数 (定義域が N n \mathbb{N}^n N n の一部でもよい)で、f ( x ⃗ ) ↓ f(\vec{x})\downarrow f ( x ) ↓ は「f ( x ⃗ ) f(\vec{x}) f ( x ) が定義されている」、f ( x ⃗ ) ↑ f(\vec{x})\uparrow f ( x ) ↑ は「定義されていない」を表します。式 f ( x ⃗ ) ≃ g ( x ⃗ ) f(\vec{x})\simeq g(\vec{x}) f ( x ) ≃ g ( x ) は「両辺がともに未定義、またはともに定義されて等しい」ことを意味します。全域で定義された関数を全関数 と呼びます。
定義 2.1 (チューリング機械 ) ↗
チューリング機械 (以下、機械)M M M とは、有限個の規則 の集合である。各規則は
( q , a ) ⟼ ( q ′ , b , d ) (q,a)\longmapsto(q',b,d) ( q , a ) ⟼ ( q ′ , b , d ) の形をしている。ここで q , q ′ ∈ N q,q'\in\mathbb{N} q , q ′ ∈ N は状態 、a , b ∈ { 0 , 1 , 2 } a,b\in\{0,1,2\} a , b ∈ { 0 , 1 , 2 } は記号 (0 0 0 を空白とみなし、2 2 2 は作業用の目印として使う)、d ∈ { L , R } d\in\{L,R\} d ∈ { L , R } は移動方向 である。各組 ( q , a ) (q,a) ( q , a ) に対して規則は高々一つしか存在しない。
テープ は両側に無限に延びる升目の列で、各升目に 0 , 1 , 2 0,1,2 0 , 1 , 2 のどれかが書かれている(有限個を除いて 0 0 0 )。ヘッド は升目の一つを指す。状況 (configuration)とは、テープの内容、ヘッドの位置、現在の状態の組である。
機械は状態 0 0 0 から始める。状況が ( q , a ) (q,a) ( q , a ) (q q q は現在の状態、a a a はヘッドの下の記号)のとき、規則 ( q , a ) ↦ ( q ′ , b , d ) (q,a)\mapsto(q',b,d) ( q , a ) ↦ ( q ′ , b , d ) があれば、1 ステップで次のことを行う。ヘッドの下の記号を b b b に書き換え、d d d の方向に升目を一つ移動し、状態を q ′ q' q ′ にする。該当する規則がなければ停止 する。
0 0 1 1 1 0 1 0 0 0 0 … … ヘッド(状態 q) テープ(有限個を除いて 0) テープとヘッド。状態 q の機械が 1 を読み、規則 (q,1) → (q′, 0, R) があれば、0 を書いて右へ 1 つ動き状態 q′ になる。
規則が高々一つ(決定性 )で、状態集合が有限(規則が有限個)である点が肝心です。状態は無限の番号が使えますが、ひとつの機械が実際に使う番号は有限個です。
自然数を関数の入出力に使うため、規約を決めます。
定義 2.2 (機械が計算する関数 ) ↗
自然数 x x x を、x + 1 x+1 x + 1 個の連続する 1 1 1 のブロック 1 x + 1 1^{x+1} 1 x + 1 で表す。n n n 個の引数 x 1 , … , x n x_1,\ldots,x_n x 1 , … , x n の標準入力 とは、テープが
1 x 1 + 1 0 1 x 2 + 1 0 ⋯ 0 1 x n + 1 1^{x_1+1}\,0\,1^{x_2+1}\,0\cdots0\,1^{x_n+1} 1 x 1 + 1 0 1 x 2 + 1 0 ⋯ 0 1 x n + 1 の形で、これ以外の升目がすべて 0 0 0 であり、ヘッドが最左の 1 1 1 を指し、状態が 0 0 0 であるような状況をいう。標準出力 y y y とは、テープが 1 y + 1 1^{y+1} 1 y + 1 以外すべて 0 0 0 で、ヘッドがその最左の 1 1 1 を指す状況をいう(状態は問わない)。
機械 M M M が標準入力 x ⃗ \vec{x} x から始めて有限ステップで停止し、そのとき標準出力 y y y になっているならば、φ M ( n ) ( x ⃗ ) = y \varphi^{(n)}_M(\vec{x})=y φ M ( n ) ( x ) = y と定める。そうでなければ(停止しない、または停止しても標準出力でない)φ M ( n ) ( x ⃗ ) ↑ \varphi^{(n)}_M(\vec{x})\uparrow φ M ( n ) ( x ) ↑ とする。部分関数 f f f に対して f = φ M ( n ) f=\varphi^{(n)}_M f = φ M ( n ) となる機械 M M M があるとき、f f f はチューリング計算可能 であるという。
例 2.3 (後者関数を計算する機械 )
次の三つの規則からなる機械 M S M_S M S は φ M S ( 1 ) ( x ) = x + 1 \varphi^{(1)}_{M_S}(x)=x+1 φ M S ( 1 ) ( x ) = x + 1 を計算します。
( 0 , 1 ) ↦ ( 1 , 1 , L ) , ( 1 , 0 ) ↦ ( 2 , 1 , L ) , ( 2 , 0 ) ↦ ( 3 , 0 , R ) . (0,1)\mapsto(1,1,L),\qquad(1,0)\mapsto(2,1,L),\qquad(2,0)\mapsto(3,0,R). ( 0 , 1 ) ↦ ( 1 , 1 , L ) , ( 1 , 0 ) ↦ ( 2 , 1 , L ) , ( 2 , 0 ) ↦ ( 3 , 0 , R ) . 標準入力のヘッドは最左の 1 1 1 (位置 p p p )にあります。状態 0 0 0 で 1 1 1 を読み、そのまま書いて左へ動くと位置 p − 1 p-1 p − 1 (空白)に出ます。状態 1 1 1 で 0 0 0 を読み、1 1 1 を書いて左へ動くと位置 p − 2 p-2 p − 2 。状態 2 2 2 で 0 0 0 を読み、0 0 0 を書いて右へ動くと位置 p − 1 p-1 p − 1 に戻り、状態 3 3 3 で 1 1 1 を読みます。状態 3 3 3 の規則はないので停止します。テープは位置 p − 1 p-1 p − 1 から p + x p+x p + x までが 1 1 1 (x + 2 x+2 x + 2 個)で、ヘッドは最左の 1 1 1 にある。これは標準出力 x + 1 x+1 x + 1 です。
x = 2 x=2 x = 2 の入力で、機械 M S M_S M S が 1 ステップごとにヘッドと状態を変えていく様子を見てください。
後者関数の機械 M_S を x = 2 で動かした 3 ステップ。テープに 1 が 1 つ増え、ヘッドは最左の 1 に戻って停止する。
決定問題と半決定問題 を定義します。集合 A ⊆ N A\subseteq\mathbb{N} A ⊆ N が決定可能 であるとは、特性関数 χ A \chi_A χ A (A A A に属すれば 1 1 1 、属さなければ 0 0 0 )がチューリング計算可能な全関数であることをいいます。A A A が半決定可能 (計算可能枚挙可能)であるとは、A A A がチューリング計算可能な部分関数の定義域であることをいいます。属するものにはいつか「はい」と答え、属さないものには永遠に答えない手順があること、と読めます。
機械を使わずに、関数を帰納的に定義する方法を用意します。これは「f ( y + 1 ) f(y+1) f ( y + 1 ) を f ( y ) f(y) f ( y ) から計算する」という素朴な再帰を一般化したものです。
定義 3.1 (原始再帰関数 ) ↗
次の基本関数 を考える。
ゼロ関数 Z ( x ) = 0 Z(x)=0 Z ( x ) = 0 。
後者関数 S ( x ) = x + 1 S(x)=x+1 S ( x ) = x + 1 。
射影関数 P i n ( x 1 , … , x n ) = x i P^n_i(x_1,\ldots,x_n)=x_i P i n ( x 1 , … , x n ) = x i (1 ≤ i ≤ n 1\le i\le n 1 ≤ i ≤ n )。
原始再帰関数 とは、基本関数から次の二つの操作を有限回繰り返して得られる関数である。
合成 :g : N m → N g:\mathbb{N}^m\to\mathbb{N} g : N m → N と h 1 , … , h m : N n → N h_1,\ldots,h_m:\mathbb{N}^n\to\mathbb{N} h 1 , … , h m : N n → N から、f ( x ⃗ ) = g ( h 1 ( x ⃗ ) , … , h m ( x ⃗ ) ) f(\vec{x})=g(h_1(\vec{x}),\ldots,h_m(\vec{x})) f ( x ) = g ( h 1 ( x ) , … , h m ( x )) 。
原始再帰 :g : N n → N g:\mathbb{N}^n\to\mathbb{N} g : N n → N と h : N n + 2 → N h:\mathbb{N}^{n+2}\to\mathbb{N} h : N n + 2 → N から、
f ( x ⃗ , 0 ) = g ( x ⃗ ) , f ( x ⃗ , y + 1 ) = h ( x ⃗ , y , f ( x ⃗ , y ) ) . f(\vec{x},0)=g(\vec{x}),\qquad f(\vec{x},y+1)=h(\vec{x},y,f(\vec{x},y)). f ( x , 0 ) = g ( x ) , f ( x , y + 1 ) = h ( x , y , f ( x , y )) .
原始再帰関数はすべて全関数です(再帰の深さ y y y に関する帰納法)。集合(述語 )P ⊆ N n P\subseteq\mathbb{N}^n P ⊆ N n が原始再帰的であるとは、その特性関数が原始再帰的であることをいいます。
証明(命題 3.2) (1) x + 0 = x x+0=x x + 0 = x , x + ( y + 1 ) = S ( x + y ) x+(y+1)=S(x+y) x + ( y + 1 ) = S ( x + y ) から加法、x ⋅ 0 = 0 x\cdot0=0 x ⋅ 0 = 0 , x ⋅ ( y + 1 ) = x ⋅ y + x x\cdot(y+1)=x\cdot y+x x ⋅ ( y + 1 ) = x ⋅ y + x から乗法、以下同様に x y x^y x y , x ! x! x ! を得る。p d \mathrm{pd} pd は p d ( 0 ) = 0 \mathrm{pd}(0)=0 pd ( 0 ) = 0 , p d ( y + 1 ) = y \mathrm{pd}(y+1)=y pd ( y + 1 ) = y という原始再帰(h ( y , ⋅ ) = P 1 2 h(y,\cdot)=P^2_1 h ( y , ⋅ ) = P 1 2 )。x − ˙ 0 = x x\dot-0=x x − ˙ 0 = x , x − ˙ ( y + 1 ) = p d ( x − ˙ y ) x\dot-(y+1)=\mathrm{pd}(x\dot-y) x − ˙ ( y + 1 ) = pd ( x − ˙ y ) 。s g ( 0 ) = 0 \mathrm{sg}(0)=0 sg ( 0 ) = 0 , s g ( y + 1 ) = 1 \mathrm{sg}(y+1)=1 sg ( y + 1 ) = 1 。
(2) 述語の特性関数 χ P , χ Q \chi_P,\chi_Q χ P , χ Q に対し、χ ¬ P = 1 − ˙ χ P \chi_{\neg P}=1\dot-\chi_P χ ¬ P = 1 − ˙ χ P , χ P ∧ Q = χ P ⋅ χ Q \chi_{P\wedge Q}=\chi_P\cdot\chi_Q χ P ∧ Q = χ P ⋅ χ Q , χ P ∨ Q = s g ( χ P + χ Q ) \chi_{P\vee Q}=\mathrm{sg}(\chi_P+\chi_Q) χ P ∨ Q = sg ( χ P + χ Q ) 。場合分け f = g 1 f=g_1 f = g 1 (P P P のとき)、g 2 g_2 g 2 (そうでないとき)は χ P ⋅ g 1 + ( 1 − ˙ χ P ) ⋅ g 2 \chi_P\cdot g_1+(1\dot-\chi_P)\cdot g_2 χ P ⋅ g 1 + ( 1 − ˙ χ P ) ⋅ g 2 。
(3) F ( x ⃗ , 0 ) = 0 F(\vec{x},0)=0 F ( x , 0 ) = 0 , F ( x ⃗ , y + 1 ) = F ( x ⃗ , y ) + f ( x ⃗ , y ) F(\vec{x},y+1)=F(\vec{x},y)+f(\vec{x},y) F ( x , y + 1 ) = F ( x , y ) + f ( x , y ) (積は初期値 1 1 1 と乗法)。
(4) ∃ i < y P = s g ( ∑ i < y χ P ( x ⃗ , i ) ) \exists i<y\,P=\mathrm{sg}(\sum_{i<y}\chi_P(\vec{x},i)) ∃ i < y P = sg ( ∑ i < y χ P ( x , i )) 。∀ i < y P = ¬ ∃ i < y ¬ P \forall i<y\,P=\neg\exists i<y\,\neg P ∀ i < y P = ¬∃ i < y ¬ P 。有界最小化は μ i < y [ P ] = ∑ j < y ∏ i ≤ j ( 1 − ˙ χ P ( x ⃗ , i ) ) \mu i<y[P]=\sum_{j<y}\prod_{i\le j}(1\dot-\chi_P(\vec{x},i)) μ i < y [ P ] = ∑ j < y ∏ i ≤ j ( 1 − ˙ χ P ( x , i )) で表せる:P P P を満たす最小の i 0 i_0 i 0 があれば、j < i 0 j<i_0 j < i 0 の項は積が 1 1 1 、j ≥ i 0 j\ge i_0 j ≥ i 0 の項は積が 0 0 0 なので和は i 0 i_0 i 0 、なければ全項が 1 1 1 で和は y y y 。
(5) ⌊ x / y ⌋ = μ k < x + 1 [ ( k + 1 ) ⋅ y > x ] \lfloor x/y\rfloor=\mu k<x+1\,[(k+1)\cdot y>x] ⌊ x / y ⌋ = μ k < x + 1 [( k + 1 ) ⋅ y > x ] (y > 0 y>0 y > 0 )。x m o d y = x − ˙ y ⋅ ⌊ x / y ⌋ x\bmod y=x\dot-y\cdot\lfloor x/y\rfloor x mod y = x − ˙ y ⋅ ⌊ x / y ⌋ 。y ∣ x ⟺ x m o d y = 0 ( y > 0 ) y\mid x\iff x\bmod y=0\ (y>0) y ∣ x ⟺ x mod y = 0 ( y > 0 ) 。素数述語は「x ≥ 2 x\ge2 x ≥ 2 かつ ∀ d < x ( d ≤ 1 ∨ d ∤ x ) \forall d<x\,(d\le1\vee d\nmid x) ∀ d < x ( d ≤ 1 ∨ d ∤ x ) 」。p i + 1 p_{i+1} p i + 1 については、p i ! + 1 p_i!+1 p i ! + 1 の素因数は p i p_i p i 以下の素数ではどれも割り切れない(定理 3.2[素数の魅力と素数定理] の議論)ので p i ! + 1 p_i!+1 p i ! + 1 の素因数のうち最小のものは p i p_i p i より大きく、p i ! + 1 p_i!+1 p i ! + 1 以下である。したがって p i + 1 = μ k ≤ p i ! + 1 [ k > p i ∧ k は素数 ] p_{i+1}=\mu k\le p_i!+1\,[k>p_i\wedge k\text{ は素数}] p i + 1 = μ k ≤ p i ! + 1 [ k > p i ∧ k は素数 ] と有界最小化で書ける(p i + 1 p_{i+1} p i + 1 は p i p_i p i より大きい最小の素数)。最後に、n > 0 n>0 n > 0 のとき ( n ) i = μ k < n [ p i k + 1 ∤ n ] (n)_i=\mu k<n\,[\,p_i^{k+1}\nmid n\,] ( n ) i = μ k < n [ p i k + 1 ∤ n ] (p i k ≤ n p_i^{k}\le n p i k ≤ n なら k < n k<n k < n なので探索範囲は足りる)。
∎
有界最小化の式 (4) は、小さな例で確かめると意味が見えます。y = 4 y=4 y = 4 で、P ( i ) P(i) P ( i ) が i = 2 i=2 i = 2 で初めて成り立つとします(χ P = ( 0 , 0 , 1 , ∗ ) \chi_P=(0,0,1,\ast) χ P = ( 0 , 0 , 1 , ∗ ) 。∗ \ast ∗ は何でもよい)。j = 0 , 1 j=0,1 j = 0 , 1 の項は ∏ i ≤ j ( 1 − ˙ χ P ( i ) ) = 1 \prod_{i\le j}(1\dot-\chi_P(i))=1 ∏ i ≤ j ( 1 − ˙ χ P ( i )) = 1 、j = 2 , 3 j=2,3 j = 2 , 3 の項は χ P ( 2 ) = 1 \chi_P(2)=1 χ P ( 2 ) = 1 を含むので 0 0 0 です。和は 1 + 1 + 0 + 0 = 2 1+1+0+0=2 1 + 1 + 0 + 0 = 2 で、確かに最小の i i i が出ます。
素因数分解の存在と一意性(定理 4.2[素数の魅力と素数定理] )により、有限列 ( a 0 , … , a k ) (a_0,\ldots,a_k) ( a 0 , … , a k ) は数 p 0 a 0 p 1 a 1 ⋯ p k a k p_0^{a_0}p_1^{a_1}\cdots p_k^{a_k} p 0 a 0 p 1 a 1 ⋯ p k a k に一意に符号化され、( n ) i (n)_i ( n ) i で復号できます。これがこの記事で使う唯一の符号化の道具です。
原始再帰関数はすべて全関数ですが、機械は停止しないことがあるので、機械が計算する関数のクラスに一致させるには部分関数まで広げる必要があります。無限探索を許す最小化 を加えます。
定義 4.1 (部分再帰関数 ) ↗
部分関数 g : N n + 1 ⇀ N g:\mathbb{N}^{n+1}\rightharpoonup\mathbb{N} g : N n + 1 ⇀ N に対して、最小化 f = μ g f=\mu g f = μg を
f ( x ⃗ ) ≃ μ y [ g ( x ⃗ , y ) = 0 ] f(\vec{x})\simeq\mu y\,[g(\vec{x},y)=0] f ( x ) ≃ μ y [ g ( x , y ) = 0 ] で定める。右辺は「g ( x ⃗ , 0 ) , … , g ( x ⃗ , y − 1 ) g(\vec{x},0),\ldots,g(\vec{x},y-1) g ( x , 0 ) , … , g ( x , y − 1 ) がすべて定義されて 0 0 0 でなく、g ( x ⃗ , y ) = 0 g(\vec{x},y)=0 g ( x , y ) = 0 となる最小の y y y 」であり、そのような y y y がなければ未定義とする。
部分再帰関数 (μ \mu μ 再帰関数)とは、基本関数から合成・原始再帰・最小化を有限回用いて得られる部分関数である。ここで合成と原始再帰は、部分関数に対しても同じ式で、≃ \simeq ≃ の意味(右辺の各部分が定義されている限りで定義される)で適用する。たとえば f ( x ⃗ , y + 1 ) ≃ h ( x ⃗ , y , f ( x ⃗ , y ) ) f(\vec{x},y+1)\simeq h(\vec{x},y,f(\vec{x},y)) f ( x , y + 1 ) ≃ h ( x , y , f ( x , y )) では、f ( x ⃗ , y ) f(\vec{x},y) f ( x , y ) が未定義なら f ( x ⃗ , y + 1 ) f(\vec{x},y+1) f ( x , y + 1 ) も未定義とする。全関数であるものを再帰関数 という。
機械の動作を数の演算に翻訳します(算術化 )。以下では φ e ( n ) \varphi_e^{(n)} φ e ( n ) という記号で、番号 e e e の機械が計算する n n n 変数関数を表します。
定義 5.1 (機械の番号 ) ↗
自然数 e e e に対し、機械 M e M_e M e を次で定める。各 q ∈ N q\in\mathbb{N} q ∈ N , a ∈ { 0 , 1 , 2 } a\in\{0,1,2\} a ∈ { 0 , 1 , 2 } について v = ( e + 1 ) 3 q + a v=(e+1)_{3q+a} v = ( e + 1 ) 3 q + a (e + 1 e+1 e + 1 の素因数分解における p 3 q + a p_{3q+a} p 3 q + a の指数)とおく。v = 0 v=0 v = 0 なら ( q , a ) (q,a) ( q , a ) に対する規則はない。v ≥ 1 v\ge1 v ≥ 1 なら w = v − 1 w=v-1 w = v − 1 とおき、規則
( q , a ) ⟼ ( q ′ , b , d ) , q ′ = ⌊ w / 6 ⌋ , b = ⌊ w / 2 ⌋ m o d 3 , d = { R ( w m o d 2 = 1 ) L ( w m o d 2 = 0 ) (q,a)\longmapsto(q',b,d),\qquad q'=\lfloor w/6\rfloor,\ b=\lfloor w/2\rfloor\bmod3,\ d=\begin{cases}R&(w\bmod 2=1)\\L&(w\bmod 2=0)\end{cases} ( q , a ) ⟼ ( q ′ , b , d ) , q ′ = ⌊ w /6 ⌋ , b = ⌊ w /2 ⌋ mod 3 , d = { R L ( w mod 2 = 1 ) ( w mod 2 = 0 ) を M e M_e M e に入れる。e + 1 e+1 e + 1 の素因数は有限個なので、M e M_e M e の規則は有限個である。φ e ( n ) = φ M e ( n ) \varphi^{(n)}_e=\varphi^{(n)}_{M_e} φ e ( n ) = φ M e ( n ) と書く。
w = 6 q ′ + 2 b + d ′ w=6q'+2b+d' w = 6 q ′ + 2 b + d ′ (d ′ ∈ { 0 , 1 } d'\in\{0,1\} d ′ ∈ { 0 , 1 } )により、w ↦ ( q ′ , b , d ) w\mapsto(q',b,d) w ↦ ( q ′ , b , d ) は N \mathbb{N} N から(状態, 記号, 方向)の組全体への全単射なので、すべての機械はある M e M_e M e と一致し、すべての e e e は機械を与えます (素因数分解の一意性による)。機械の番号は無限に重複なく振られています。
具体例として、§2.2 の機械 M S M_S M S の番号を作ってみます。規則 ( 0 , 1 ) ↦ ( 1 , 1 , L ) (0,1)\mapsto(1,1,L) ( 0 , 1 ) ↦ ( 1 , 1 , L ) では w = 6 ⋅ 1 + 2 ⋅ 1 + 0 = 8 w=6\cdot1+2\cdot1+0=8 w = 6 ⋅ 1 + 2 ⋅ 1 + 0 = 8 、v = 9 v=9 v = 9 で、位置は 3 q + a = 1 3q+a=1 3 q + a = 1 なので素数 p 1 = 3 p_1=3 p 1 = 3 の指数が 9 9 9 です。同様に ( 1 , 0 ) ↦ ( 2 , 1 , L ) (1,0)\mapsto(2,1,L) ( 1 , 0 ) ↦ ( 2 , 1 , L ) は w = 14 w=14 w = 14 、v = 15 v=15 v = 15 、位置 3 3 3 (p 3 = 7 p_3=7 p 3 = 7 )、( 2 , 0 ) ↦ ( 3 , 0 , R ) (2,0)\mapsto(3,0,R) ( 2 , 0 ) ↦ ( 3 , 0 , R ) は w = 19 w=19 w = 19 、v = 20 v=20 v = 20 、位置 6 6 6 (p 6 = 17 p_6=17 p 6 = 17 )となります。したがって e + 1 = 3 9 ⋅ 7 15 ⋅ 17 20 e+1=3^{9}\cdot7^{15}\cdot17^{20} e + 1 = 3 9 ⋅ 7 15 ⋅ 1 7 20 のとき M e = M S M_e=M_S M e = M S です。素因数分解の指数を、規則の「表」の各欄として使っているだけです。
テープの内容を、ヘッドが指す升目の記号 a a a 、左側の升目を近い順に並べた記号列を 3 進数とみなした数 l l l (最近接の升目が最下位の桁)、右側の升目を近い順に並べた記号列を 3 進数とみなした数 r r r の三つ組で表します。有限個を除いて 0 0 0 なので l , r l,r l , r は自然数です。
3 進数を使う理由は、記号が 0 , 1 , 2 0,1,2 0 , 1 , 2 の三種類で、ヘッドが一つ動くときの更新が「最下位の桁を取り出す・付け加える」という割り算と掛け算だけで書けるからです。たとえばヘッドの左側が近い順に 1 , 2 1,2 1 , 2 、ヘッドの下が 1 1 1 、右側が近い順に 0 , 1 0,1 0 , 1 なら、l = 1 + 2 ⋅ 3 = 7 l=1+2\cdot3=7 l = 1 + 2 ⋅ 3 = 7 、a = 1 a=1 a = 1 、r = 0 + 1 ⋅ 3 = 3 r=0+1\cdot3=3 r = 0 + 1 ⋅ 3 = 3 です。状況を一つの数にまとめれば、機械の動作全体を数の関数として扱え、原始再帰関数の道具が使えるようになります。
状態 q q q を加え、状況を一つの数
⟨ q , l , a , r ⟩ = 2 q 3 l 5 a 7 r \langle q,l,a,r\rangle=2^q3^l5^a7^r ⟨ q , l , a , r ⟩ = 2 q 3 l 5 a 7 r
で表します。次の補題が、機械の 1 ステップが原始再帰的な計算であることを示します。
補題 5.2 (1 ステップの算術化 ) ✓
関数 S t e p ( e , c ) \mathrm{Step}(e,c) Step ( e , c ) を次で定める。c = ⟨ q , l , a , r ⟩ c=\langle q,l,a,r\rangle c = ⟨ q , l , a , r ⟩ とし、M e M_e M e の規則 ( q , a ) ↦ ( q ′ , b , d ) (q,a)\mapsto(q',b,d) ( q , a ) ↦ ( q ′ , b , d ) があれば
d = R d=R d = R のとき S t e p ( e , c ) = ⟨ q ′ , 3 l + b , r m o d 3 , ⌊ r / 3 ⌋ ⟩ \mathrm{Step}(e,c)=\langle q',\,3l+b,\ r\bmod3,\ \lfloor r/3\rfloor\rangle Step ( e , c ) = ⟨ q ′ , 3 l + b , r mod 3 , ⌊ r /3 ⌋⟩ 、
d = L d=L d = L のとき S t e p ( e , c ) = ⟨ q ′ , ⌊ l / 3 ⌋ , l m o d 3 , 3 r + b ⟩ \mathrm{Step}(e,c)=\langle q',\,\lfloor l/3\rfloor,\ l\bmod3,\ 3r+b\rangle Step ( e , c ) = ⟨ q ′ , ⌊ l /3 ⌋ , l mod 3 , 3 r + b ⟩ 、
規則がなければ S t e p ( e , c ) = c \mathrm{Step}(e,c)=c Step ( e , c ) = c とする。S t e p \mathrm{Step} Step は原始再帰的であり、M e M_e M e の状況 c c c の次の状況を表す。
証明(補題 5.2) 右へ動く場合:書き込んだ記号 b b b のある升目は新しいヘッドの左隣の最近接の升目になるので、左側の記号列の最下位の桁に b b b を付け加えて l ′ = 3 l + b l'=3l+b l ′ = 3 l + b 。新しいヘッドの下の記号は右側の最近接の升目、つまり r r r の最下位の桁 r m o d 3 r\bmod3 r mod 3 で、右側の残りは ⌊ r / 3 ⌋ \lfloor r/3\rfloor ⌊ r /3 ⌋ 。左へ動く場合は対称。規則の有無と ( q ′ , b , d ) (q',b,d) ( q ′ , b , d ) は 定義 5.1 のとおり ( e + 1 ) 3 q + a (e+1)_{3q+a} ( e + 1 ) 3 q + a から場合分けで決まり、命題 3.2 の道具で原始再帰的に書ける。q , l , a , r q,l,a,r q , l , a , r は c c c の素因数分解の指数 ( c ) 0 , ( c ) 1 , ( c ) 2 , ( c ) 3 (c)_0,(c)_1,(c)_2,(c)_3 ( c ) 0 , ( c ) 1 , ( c ) 2 , ( c ) 3 で、c c c は 2 q ′ 3 l ′ 5 a ′ 7 r ′ 2^{q'}3^{l'}5^{a'}7^{r'} 2 q ′ 3 l ′ 5 a ′ 7 r ′ で再構成できる。
∎
標準入力の状況 I n i t n ( x ⃗ ) \mathrm{Init}_n(\vec{x}) Init n ( x ) は原始再帰的です。標準入力のテープ全体を、ヘッドの升目を最下位の桁として右へ読んだ 3 進数を W n ( x 1 , … , x n ) W_n(x_1,\ldots,x_n) W n ( x 1 , … , x n ) とおくと、
W 1 ( x ) = 3 x + 1 − 1 2 , W n + 1 ( x 1 , x ⃗ ′ ) = 3 x 1 + 1 − 1 2 + 3 x 1 + 2 W n ( x ⃗ ′ ) W_1(x)=\frac{3^{x+1}-1}{2},\qquad W_{n+1}(x_1,\vec{x}')=\frac{3^{x_1+1}-1}{2}+3^{x_1+2}\,W_n(\vec{x}') W 1 ( x ) = 2 3 x + 1 − 1 , W n + 1 ( x 1 , x ′ ) = 2 3 x 1 + 1 − 1 + 3 x 1 + 2 W n ( x ′ )
です(1 x 1 + 1 1^{x_1+1} 1 x 1 + 1 は 3 進で ∑ i ≤ x 1 3 i = ( 3 x 1 + 1 − 1 ) / 2 \sum_{i\le x_1}3^i=(3^{x_1+1}-1)/2 ∑ i ≤ x 1 3 i = ( 3 x 1 + 1 − 1 ) /2 に当たり、その次に 0 0 0 が一つあって、その後に残りの引数の語が続く)。ヘッドの下の記号は 1 1 1 、左側は 0 0 0 、右側は r = ( W n − 1 ) / 3 r=(W_n-1)/3 r = ( W n − 1 ) /3 なので、I n i t n ( x ⃗ ) = ⟨ 0 , 0 , 1 , ( W n ( x ⃗ ) − 1 ) / 3 ⟩ \mathrm{Init}_n(\vec{x})=\langle0,0,1,(W_n(\vec{x})-1)/3\rangle Init n ( x ) = ⟨ 0 , 0 , 1 , ( W n ( x ) − 1 ) /3 ⟩ です。
標準出力の状況は、l = 0 l=0 l = 0 , a = 1 a=1 a = 1 , r = ( 3 y − 1 ) / 2 r=(3^y-1)/2 r = ( 3 y − 1 ) /2 となる y y y が存在する(右側が 1 1 1 だけ y y y 個並ぶ)という条件で特徴づけられ、出力値は y = μ y ≤ r [ 3 y = 2 r + 1 ] y=\mu y\le r\,[\,3^y=2r+1\,] y = μ y ≤ r [ 3 y = 2 r + 1 ] です。これらも原始再帰的です。
証明(定理 5.3) C o n f ( e , x ⃗ , 0 ) = I n i t n ( x ⃗ ) \mathrm{Conf}(e,\vec{x},0)=\mathrm{Init}_n(\vec{x}) Conf ( e , x , 0 ) = Init n ( x ) , C o n f ( e , x ⃗ , t + 1 ) = S t e p ( e , C o n f ( e , x ⃗ , t ) ) \mathrm{Conf}(e,\vec{x},t+1)=\mathrm{Step}(e,\mathrm{Conf}(e,\vec{x},t)) Conf ( e , x , t + 1 ) = Step ( e , Conf ( e , x , t )) は原始再帰(補題 5.2 )。T n ( e , x ⃗ , t ) T_n(e,\vec{x},t) T n ( e , x , t ) を「c = C o n f ( e , x ⃗ , t ) c=\mathrm{Conf}(e,\vec{x},t) c = Conf ( e , x , t ) に対して c c c が標準出力の状況である、かつ M e M_e M e に c c c の状態と記号に対する規則がない」と定める。これは原始再帰的である。U ( c ) U(c) U ( c ) は標準出力の状況 c c c から出力値 y y y を読む関数とする。
機械が停止するまで C o n f \mathrm{Conf} Conf は実際の動作を追い、停止後は S t e p \mathrm{Step} Step の定義から同じ状況に止まる。よって T n ( e , x ⃗ , t ) T_n(e,\vec{x},t) T n ( e , x , t ) が成り立つ最小の t t t が存在することは、「M e M_e M e が停止し、そのとき標準出力である」ことと同値で、その状況は C o n f ( e , x ⃗ , t ) \mathrm{Conf}(e,\vec{x},t) Conf ( e , x , t ) である。このとき U U U が出力値を与えるので、両辺は定義の意味で一致する。停止しない、または標準出力でない状況で停止する場合は、どの t t t でも T n T_n T n が成り立たないので μ \mu μ は未定義で、これは φ e ( n ) ( x ⃗ ) ↑ \varphi^{(n)}_e(\vec{x})\uparrow φ e ( n ) ( x ) ↑ と一致する。
∎
定理 5.4 (チューリング計算可能なら部分再帰的 ) ✓
チューリング計算可能な部分関数はすべて部分再帰関数である。さらに、万能関数 Φ ( n ) ( e , x ⃗ ) ≃ φ e ( n ) ( x ⃗ ) \Phi^{(n)}(e,\vec{x})\simeq\varphi^{(n)}_e(\vec{x}) Φ ( n ) ( e , x ) ≃ φ e ( n ) ( x ) は部分再帰関数である。
証明(定理 5.4) 定理 5.3 の右辺は、原始再帰関数と一回の最小化 μ t [ 1 − ˙ χ T n ( e , x ⃗ , t ) = 0 ] \mu t\,[1\dot-\chi_{T_n}(e,\vec{x},t)=0] μ t [ 1 − ˙ χ T n ( e , x , t ) = 0 ] の合成であり、部分再帰関数である。チューリング計算可能な関数 f f f は、ある e e e について f = φ e ( n ) f=\varphi^{(n)}_e f = φ e ( n ) であり(すべての機械は M e M_e M e の形)、f ( x ⃗ ) ≃ Φ ( n ) ( e , x ⃗ ) f(\vec{x})\simeq\Phi^{(n)}(e,\vec{x}) f ( x ) ≃ Φ ( n ) ( e , x ) は e e e を定数に固定した Φ ( n ) \Phi^{(n)} Φ ( n ) なので部分再帰関数である。
∎
万能関数が部分再帰的であることは、一つの機械が他のすべての機械を番号付きで模倣できる (万能チューリング機械)という事実の算術化された形です。コンピュータの原型です。
逆向きは、再帰関数の構成の各段階に対応する機械を作ることで示します。機械同士を組み合わせるため、次の性質をもつ機械を考えます。
定義 6.1 (整った機械 ) ↗
n n n 変数の部分関数 f f f について、機械 M M M が整っている とは、すべての標準入力 x ⃗ \vec{x} x から始めた動作が次を満たすことをいう。ヘッドの最初の位置(最左の 1 1 1 )を p p p とする。
(a) M M M が停止するのは、升目 p p p 以右の内容が標準出力(一つのブロック 1 y + 1 1^{y+1} 1 y + 1 以外すべて 0 0 0 )になっていて、ヘッドがその最左の 1 1 1 を指しているときに限り、そのとき y = f ( x ⃗ ) y=f(\vec{x}) y = f ( x ) である。特に f ( x ⃗ ) ↑ f(\vec{x})\uparrow f ( x ) ↑ ならば M M M は停止しない。(以下、標準出力といえばこの意味、すなわち升目 p − 1 p-1 p − 1 以左の内容は問わない。)
(b) M M M は升目 p − 2 p-2 p − 2 以左を訪れない。升目 p − 1 p-1 p − 1 には移ってよいが、そこでは書き込まない。
(b) は、M M M の左側にあるデータを壊さないための条件です。以下ではデータのブロックが空白一つを挟んで並び、M M M の開始位置 p p p の左隣 p − 1 p-1 p − 1 は常に空白です。このとき M M M の動作は p p p 以右の升目だけで決まるので、左側に何があっても、標準入力の置かれた位置さえ指せば同じ動作をします。作業用の記号 2 2 2 (目印)を使えば、次の部品は有限個の規則で実現できます。語 D D D は空白一つで区切られたブロックの列を表します。
(S1) 語の右端(空白が二つ続く位置)へ移る。
(S2) j j j 番目のブロックを、語の右端の空白一つ先に複製する。
(S3) 語の右端のブロックを消す。
(S4) 右端のブロックを、直前の空白を詰めて左へ平行移動する。
(S5) ブロックの長さを一つ増やす。二つのブロックの長さが等しいかを判定して分岐する。
例えば (S2) は、複製元の最左の 1 1 1 を 2 2 2 に書き換えて右端まで運び、そこに 1 1 1 を一つ書き、戻って次の 1 1 1 を 2 2 2 に、というのを繰り返し、最後に 2 2 2 をすべて 1 1 1 に戻す。目印を使うので、ブロックの長さの情報を機械の状態に持たなくて済みます。
定理 6.2 (部分再帰関数はチューリング計算可能 ) ✓
すべての部分再帰関数 f : N n ⇀ N f:\mathbb{N}^n\rightharpoonup\mathbb{N} f : N n ⇀ N について、f f f について整っている機械 M f M_f M f が存在する。特に、f f f はチューリング計算可能である。
証明(定理 6.2) f f f の構成に関する帰納法で示す。以下、機械を図式(部品の連結)で述べる。連結 M 1 ; M 2 M_1;M_2 M 1 ; M 2 とは、M 1 M_1 M 1 が停止する状況(標準出力でヘッドは最左の 1 1 1 )から M 2 M_2 M 2 を始めるように規則をつなぐことである(M 1 M_1 M 1 の停止状況の規則のない組に、M 2 M_2 M 2 の開始状態への遷移を足す。M 1 M_1 M 1 は標準出力でしか停止しないので、足した規則が働くのは意図した状況に限られる)。
基本関数。 Z Z Z :最左の 1 1 1 を残して残りを消し、戻る。S S S :ブロックの右端に 1 1 1 を一つ足し((S5))、最左の 1 1 1 に戻る。P i n P^n_i P i n :i i i 番目以外のブロックを((S3) を左から必要な回数使い、ブロック数 n n n は機械が知っているので端を検出できる)消して、i i i 番目のブロックの最左の 1 1 1 に立つ。いずれも (b) を満たす。
合成 f ( x ⃗ ) = g ( h 1 ( x ⃗ ) , … , h m ( x ⃗ ) ) f(\vec{x})=g(h_1(\vec{x}),\ldots,h_m(\vec{x})) f ( x ) = g ( h 1 ( x ) , … , h m ( x )) 。標準入力 D = x ⃗ D=\vec{x} D = x から、i = 1 , … , m i=1,\ldots,m i = 1 , … , m について次を行う。(S2) で D D D のすべてのブロックを右端に複製し、複製の最左の 1 1 1 に立って M h i M_{h_i} M h i を走らせる。(b) により D D D や既に得た値は壊れない。終わると語は D 0 y 1 0 ⋯ 0 y i D\ 0\ y_1\ 0\cdots0\ y_i D 0 y 1 0 ⋯ 0 y i (y j = h j ( x ⃗ ) y_j=h_j(\vec{x}) y j = h j ( x ) )になっている。最後に y 1 y_1 y 1 の最左の 1 1 1 に立って M g M_g M g を走らせ、出力を得たら (S3) で D D D と余りを消し、出力の最左の 1 1 1 に立つ。どの h i h_i h i も未定義の入力では対応する段階で停止しないので、(a) が保たれる。g g g の未定義も同様。
原始再帰 f ( x ⃗ , 0 ) = g ( x ⃗ ) f(\vec{x},0)=g(\vec{x}) f ( x , 0 ) = g ( x ) , f ( x ⃗ , y + 1 ) = h ( x ⃗ , y , f ( x ⃗ , y ) ) f(\vec{x},y+1)=h(\vec{x},y,f(\vec{x},y)) f ( x , y + 1 ) = h ( x , y , f ( x , y )) 。語 x ⃗ 0 y \vec{x}\ 0\ y x 0 y から始め、(S2) で x ⃗ \vec{x} x を複製して M g M_g M g を走らせ、語 x ⃗ 0 y 0 1 0 v 0 \vec{x}\ 0\ y\ 0\ 1\ 0\ v_0 x 0 y 0 1 0 v 0 を得る(1 1 1 のブロックは添字 i = 0 i=0 i = 0 の表現、v 0 = g ( x ⃗ ) v_0=g(\vec{x}) v 0 = g ( x ) )。以下を繰り返す。i i i のブロックと y y y のブロックの長さを (S5) で比べ、等しければ v i v_i v i を (S4) で語の先頭へ移すなどして余りを消し、停止する。等しくなければ x ⃗ , i , v i \vec{x},i,v_i x , i , v i を (S2) で順に右端へ複製して M h M_h M h を走らせ、得た v i + 1 v_{i+1} v i + 1 の前の v i v_i v i のブロックを消して詰め、i i i のブロックに (S5) で 1 1 1 を足す。ループは y y y の値だけ回って終わり、各段階が定義されている限りで定義される。
最小化 f ( x ⃗ ) ≃ μ y [ g ( x ⃗ , y ) = 0 ] f(\vec{x})\simeq\mu y\,[g(\vec{x},y)=0] f ( x ) ≃ μ y [ g ( x , y ) = 0 ] 。語 x ⃗ 0 y \vec{x}\ 0\ y x 0 y に y = 0 y=0 y = 0 (1 1 1 のブロック)を置いて始める。x ⃗ \vec{x} x と y y y を複製して M g M_g M g を走らせ、結果が 0 0 0 (長さ 1 1 1 のブロック)かどうかを (S5) で判定する。0 0 0 なら y y y のブロックを残して余りを消して停止する。そうでなければ結果を消し、y y y に 1 1 1 を足して繰り返す。どれかの段階で g g g が未定義ならそこで停止せず、最小の y y y がなければ永久に続く。
どの場合も、機械が停止するのは出力を得た後の標準出力に限ることを、構成から確かめられる。
∎
遷移表を一つずつ書き下すことは機械的ですが長いため、上では部品の連結の図式で記述しました。各部品が少数の状態の機械であること、連結が規則の追加と状態の改番で行えることは、読者が確かめられる範囲です。
定理 6.3 (チューリング計算可能性と部分再帰性の一致 ) ✓
部分関数 f : N n ⇀ N f:\mathbb{N}^n\rightharpoonup\mathbb{N} f : N n ⇀ N について、次は同値である。
f f f はチューリング計算可能である。
f f f は部分再帰関数である。
証明(定理 6.3) (1) ⇒ \Rightarrow ⇒ (2) は 定理 5.4 、(2) ⇒ \Rightarrow ⇒ (1) は 定理 6.2 。
∎
以後、「計算可能」はどちらの意味でも同じなので、単に計算可能な部分関数 と呼びます。
機械の番号 e e e が N \mathbb{N} N の元なので、機械を入力として受け取る問題を考えられます。
定義 7.1 (停止問題 ) ↗
K = { e ∈ N ∣ φ e ( 1 ) ( e ) ↓ } K=\{\,e\in\mathbb{N}\mid\varphi^{(1)}_e(e)\downarrow\,\} K = { e ∈ N ∣ φ e ( 1 ) ( e ) ↓ } を停止問題 の集合という。機械 M e M_e M e を自分自身の番号 e e e を入力として走らせたとき、標準出力で停止するような e e e の集合である。
定理 7.2 (停止問題の決定不能性 ) ✓
K K K は決定可能ではない。一方、K K K は半決定可能である。
証明の方針は次のとおりです。K K K を判定する機械があると仮定し、それを使って「K K K に入っていれば止まらず、入っていなければ 0 0 0 で止まる」機械を作ります。この機械自身の番号を自分に入力すると、止まるなら止まらず、止まらないなら止まる、という矛盾が出ます。なお下の μ y [ χ K ( e ) = 0 ] \mu y\,[\chi_K(e)=0] μ y [ χ K ( e ) = 0 ] では、条件に y y y が現れませんが、それで構いません。χ K ( e ) = 0 \chi_K(e)=0 χ K ( e ) = 0 なら y = 0 y=0 y = 0 で探索が終わり、χ K ( e ) = 1 \chi_K(e)=1 χ K ( e ) = 1 ならどの y y y でも条件が成り立たず、探索が永遠に続くだけだからです。
証明(定理 7.2) 決定不能性 。K K K が決定可能で、特性関数 χ K \chi_K χ K がチューリング計算可能な全関数だとする。定理 5.4 から χ K \chi_K χ K は部分再帰関数である。部分関数
h ( e ) ≃ μ y [ χ K ( e ) = 0 ] h(e)\simeq\mu y\,[\chi_K(e)=0] h ( e ) ≃ μ y [ χ K ( e ) = 0 ] を考える。部分再帰関数の最小化の定義より、h h h は部分再帰関数である。e ∉ K e\notin K e ∈ / K ならば χ K ( e ) = 0 \chi_K(e)=0 χ K ( e ) = 0 なので h ( e ) = 0 h(e)=0 h ( e ) = 0 。e ∈ K e\in K e ∈ K ならば χ K ( e ) = 1 \chi_K(e)=1 χ K ( e ) = 1 で、y y y によらず χ K ( e ) ≠ 0 \chi_K(e)\ne0 χ K ( e ) = 0 だから h ( e ) ↑ h(e)\uparrow h ( e ) ↑ 。
定理 6.2 により h h h はチューリング計算可能なので、ある e 0 e_0 e 0 について h = φ e 0 ( 1 ) h=\varphi^{(1)}_{e_0} h = φ e 0 ( 1 ) である。ここで e 0 e_0 e 0 に自分自身を入力すると、
e 0 ∈ K ⟺ φ e 0 ( 1 ) ( e 0 ) ↓ ⟺ h ( e 0 ) ↓ ⟺ e 0 ∉ K e_0\in K\iff\varphi^{(1)}_{e_0}(e_0)\downarrow\iff h(e_0)\downarrow\iff e_0\notin K e 0 ∈ K ⟺ φ e 0 ( 1 ) ( e 0 ) ↓ ⟺ h ( e 0 ) ↓ ⟺ e 0 ∈ / K となり矛盾する。
半決定可能性 。e ↦ Φ ( 1 ) ( e , e ) e\mapsto\Phi^{(1)}(e,e) e ↦ Φ ( 1 ) ( e , e ) は部分再帰関数(定理 5.4 )で、その定義域は K K K 。定理 6.2 によりチューリング計算可能である。
∎
証明の骨格は、カントールの対角線論法(定理 7.1[濃度と無限] )と同じです。計算可能な部分関数を表の行 φ 0 , φ 1 , … \varphi_0,\varphi_1,\ldots φ 0 , φ 1 , … に並べ、対角成分 φ e ( e ) \varphi_e(e) φ e ( e ) を取り、それを反転させたものはどの行とも異なる、という議論です。反転が「定義されていれば未定義、未定義なら 0 0 0 」であるところだけが違います。
3 ↑ 0 7 ↑ ↑ ↑ 2 ↑ 1 5 1 8 4 0 ↑ 6 1 ↑ 2 0 0 9 3 7 x = 0 x = 1 x = 2 x = 3 x = 4 φ₀ φ₁ φ₂ φ₃ φ₄ 対角成分が定義 → h は未定義 対角成分が ↑ → h = 0 h = (↑, 0, ↑, 0, ↑, …) どの φ_e とも x = e で食い違う (表の値は説明のための例。↑ は未定義)
対角線論法。表の行は計算可能な部分関数 φ_e。対角成分を反転した関数 h は、どの行とも対角で食い違う。h が計算可能なら矛盾。
系 7.3 (停止問題の補集合は半決定可能でない ) ✓
集合 A A A と補集合 A ‾ = N ∖ A \overline{A}=\mathbb{N}\setminus A A = N ∖ A がともに半決定可能ならば、A A A は決定可能である。特に K ‾ \overline{K} K は半決定可能でない。
証明(系 7.3) A = d o m ( φ a ( 1 ) ) A=\mathrm{dom}(\varphi^{(1)}_a) A = dom ( φ a ( 1 ) ) , A ‾ = d o m ( φ b ( 1 ) ) \overline{A}=\mathrm{dom}(\varphi^{(1)}_b) A = dom ( φ b ( 1 ) ) とする。「M e M_e M e が x x x から t t t ステップ以内に標準出力で停止する」という述語 H ( e , x , t ) H(e,x,t) H ( e , x , t ) は、定理 5.3 の T 1 T_1 T 1 を使って ∃ t ′ ≤ t T 1 ( e , x , t ′ ) \exists t'\le t\,T_1(e,x,t') ∃ t ′ ≤ t T 1 ( e , x , t ′ ) と書け、原始再帰的である。x x x ごとに x ∈ A x\in A x ∈ A か x ∈ A ‾ x\in\overline{A} x ∈ A のちょうど一方が成り立つので、s ( x ) = μ t [ H ( a , x , t ) ∨ H ( b , x , t ) ] s(x)=\mu t\,[H(a,x,t)\vee H(b,x,t)] s ( x ) = μ t [ H ( a , x , t ) ∨ H ( b , x , t )] は全関数であり、χ A ( x ) = χ H ( a , ⋅ , ⋅ ) ( x , s ( x ) ) \chi_A(x)=\chi_{H(a,\cdot,\cdot)}(x,s(x)) χ A ( x ) = χ H ( a , ⋅ , ⋅ ) ( x , s ( x )) と書ける。χ A \chi_A χ A は全域的な部分再帰関数なので、定理 6.2 により A A A は決定可能である。K ‾ \overline{K} K が半決定可能なら K K K が決定可能になって 定理 7.2 に反する。
∎
停止問題の次に問いたいのは、「機械が計算する関数が何かの性質をもつか」を機械の記述から判定できるか、ということです。答えは、自明でない性質については否定的です。
補題 8.1 (パラメータの固定(s-m-n) ) ✓
G G G を 2 変数関数 φ G ( 2 ) \varphi^{(2)}_G φ G ( 2 ) を計算する機械の番号とする。このとき、原始再帰的な全関数 s s s が存在して、すべての e , y e,y e , y について
φ s ( e ) ( 1 ) ( y ) ≃ φ G ( 2 ) ( e , y ) \varphi^{(1)}_{s(e)}(y)\simeq\varphi^{(2)}_G(e,y) φ s ( e ) ( 1 ) ( y ) ≃ φ G ( 2 ) ( e , y ) が成り立つ。
証明(補題 8.1) e e e を固定し、機械 P e P_e P e を次の規則で定める(状態 0 , 1 , … , e + 3 0,1,\ldots,e+3 0 , 1 , … , e + 3 )。
( 0 , 1 ) ↦ ( 1 , 1 , L ) , ( 1 , 0 ) ↦ ( 2 , 0 , L ) , ( 2 + i , 0 ) ↦ ( 3 + i , 1 , L ) ( 0 ≤ i ≤ e ) , ( e + 3 , 0 ) ↦ ( e + 4 , 0 , R ) . (0,1)\mapsto(1,1,L),\quad(1,0)\mapsto(2,0,L),\quad(2+i,0)\mapsto(3+i,1,L)\ (0\le i\le e),\quad(e+3,0)\mapsto(e+4,0,R). ( 0 , 1 ) ↦ ( 1 , 1 , L ) , ( 1 , 0 ) ↦ ( 2 , 0 , L ) , ( 2 + i , 0 ) ↦ ( 3 + i , 1 , L ) ( 0 ≤ i ≤ e ) , ( e + 3 , 0 ) ↦ ( e + 4 , 0 , R ) . 標準入力 1 y + 1 1^{y+1} 1 y + 1 (最左の 1 1 1 の位置を p p p とする)から始めると、P e P_e P e は位置 p − 1 p-1 p − 1 を空白のままにして、p − 2 , p − 3 , … , p − 2 − e p-2,p-3,\ldots,p-2-e p − 2 , p − 3 , … , p − 2 − e に 1 1 1 を e + 1 e+1 e + 1 個書き、位置 p − 2 − e p-2-e p − 2 − e の最左の 1 1 1 に立つ状態 e + 4 e+4 e + 4 で終わる。テープは 1 e + 1 0 1 y + 1 1^{e+1}\,0\,1^{y+1} 1 e + 1 0 1 y + 1 、つまり ( e , y ) (e,y) ( e , y ) の標準入力である。
M G M_G M G の各状態 q q q を q + e + 4 q+e+4 q + e + 4 に付け替えたものを P e P_e P e に続けた機械を M s ( e ) M_{s(e)} M s ( e ) とする。付け替えた開始状態が e + 4 e+4 e + 4 である。この機械は、入力 y y y に対して φ G ( 2 ) ( e , y ) \varphi^{(2)}_G(e,y) φ G ( 2 ) ( e , y ) を計算する。番号 s ( e ) s(e) s ( e ) は、P e P_e P e の規則に対応する素数のべき(定義 5.1 の符号化に従う)と、G G G の各規則を状態番号を e + 4 e+4 e + 4 ずらして符号化したものの積に − 1 -1 − 1 した数で、有界な範囲の素数べきの積だから原始再帰的に計算できる。
∎
定理 8.2 (ライスの定理 ) ✓
P \mathcal{P} P を 1 変数の計算可能な部分関数の集合とし、A P = { e ∣ φ e ( 1 ) ∈ P } A_{\mathcal{P}}=\{\,e\mid\varphi^{(1)}_e\in\mathcal{P}\,\} A P = { e ∣ φ e ( 1 ) ∈ P } とする。P \mathcal{P} P が空でも全体でもなければ、A P A_{\mathcal{P}} A P は決定可能でない。
証明(定理 8.2) どの x x x でも未定義な関数を ⊥ \bot ⊥ とする(常に右へ動き続ける機械で計算できる)。
⊥ ∉ P \bot\notin\mathcal{P} ⊥ ∈ / P の場合。 P ≠ ∅ \mathcal{P}\ne\varnothing P = ∅ なので φ e 1 ( 1 ) ∈ P \varphi^{(1)}_{e_1}\in\mathcal{P} φ e 1 ( 1 ) ∈ P となる e 1 e_1 e 1 を一つ取る。2 変数の部分関数
g ( e , y ) ≃ Φ ( 1 ) ( e 1 , y + 0 ⋅ Φ ( 1 ) ( e , e ) ) g(e,y)\simeq\Phi^{(1)}\bigl(e_1,\ y+0\cdot\Phi^{(1)}(e,e)\bigr) g ( e , y ) ≃ Φ ( 1 ) ( e 1 , y + 0 ⋅ Φ ( 1 ) ( e , e ) ) を考える。Φ ( 1 ) ( e , e ) \Phi^{(1)}(e,e) Φ ( 1 ) ( e , e ) が定義されるのは e ∈ K e\in K e ∈ K のときに限り、そのとき g ( e , y ) = φ e 1 ( 1 ) ( y ) g(e,y)=\varphi^{(1)}_{e_1}(y) g ( e , y ) = φ e 1 ( 1 ) ( y ) 。e ∉ K e\notin K e ∈ / K のときは g ( e , y ) ↑ g(e,y)\uparrow g ( e , y ) ↑ (合成で未定義が伝わる)。g g g は部分再帰関数の合成だから部分再帰関数で、定理 6.2 によりある G G G について g = φ G ( 2 ) g=\varphi^{(2)}_G g = φ G ( 2 ) 。補題 8.1 の s s s をとると
e ∈ K ⇒ φ s ( e ) ( 1 ) = φ e 1 ( 1 ) ∈ P , e ∉ K ⇒ φ s ( e ) ( 1 ) = ⊥ ∉ P . e\in K\ \Rightarrow\ \varphi^{(1)}_{s(e)}=\varphi^{(1)}_{e_1}\in\mathcal{P},\qquad e\notin K\ \Rightarrow\ \varphi^{(1)}_{s(e)}=\bot\notin\mathcal{P}. e ∈ K ⇒ φ s ( e ) ( 1 ) = φ e 1 ( 1 ) ∈ P , e ∈ / K ⇒ φ s ( e ) ( 1 ) = ⊥ ∈ / P . したがって e ∈ K ⟺ s ( e ) ∈ A P e\in K\iff s(e)\in A_{\mathcal{P}} e ∈ K ⟺ s ( e ) ∈ A P 、すなわち χ K = χ A P ∘ s \chi_K=\chi_{A_{\mathcal{P}}}\circ s χ K = χ A P ∘ s 。A P A_{\mathcal{P}} A P が決定可能なら、χ A P \chi_{A_{\mathcal{P}}} χ A P も s s s も部分再帰関数なので χ K \chi_K χ K も(部分再帰関数の合成として)計算可能になり、定理 7.2 に反する。
⊥ ∈ P \bot\in\mathcal{P} ⊥ ∈ P の場合。 補集合 P c \mathcal{P}^{c} P c (計算可能な 1 変数部分関数のうち P \mathcal{P} P に属さないもの)は空でなく ⊥ ∉ P c \bot\notin\mathcal{P}^{c} ⊥ ∈ / P c なので、前の場合から A P c A_{\mathcal{P}^c} A P c は決定可能でない。A P c = N ∖ A P A_{\mathcal{P}^c}=\mathbb{N}\setminus A_{\mathcal{P}} A P c = N ∖ A P だから、A P A_{\mathcal{P}} A P が決定可能なら補集合も決定可能となり矛盾する。
∎
例 8.3 (ライスの定理の応用 )
次の集合はいずれも決定可能でありません(P \mathcal{P} P は空でも全体でもない)。
{ e ∣ φ e が全関数 } \{e\mid\varphi_e\text{ が全関数}\} { e ∣ φ e が全関数 } (機械が全入力で停止するか)。
{ e ∣ φ e ( 0 ) ↓ } \{e\mid\varphi_e(0)\downarrow\} { e ∣ φ e ( 0 ) ↓ } (入力 0 0 0 で停止するか)。
{ e ∣ φ e は定数関数 } \{e\mid\varphi_e\text{ は定数関数}\} { e ∣ φ e は定数関数 } 。
{ e ∣ φ e = φ e ′ } \{e\mid\varphi_e=\varphi_{e'}\} { e ∣ φ e = φ e ′ } (e ′ e' e ′ を固定。二つの機械が同じ関数を計算するか)。
プログラムの「意味」に関する自明でない問いは、静的解析で完全には判定できない、という事実の数学的な根拠です。一方、機械の記述 に関する問い(規則が 5 個以下か、状態番号が偶数か)は、φ e \varphi_e φ e が同じでも e e e によって答えが変わるので A P A_{\mathcal{P}} A P の形ではなく、決定可能です。
演習 9.1 標準
フィボナッチ数列 F ( 0 ) = 0 F(0)=0 F ( 0 ) = 0 , F ( 1 ) = 1 F(1)=1 F ( 1 ) = 1 , F ( n + 2 ) = F ( n + 1 ) + F ( n ) F(n+2)=F(n+1)+F(n) F ( n + 2 ) = F ( n + 1 ) + F ( n ) は原始再帰的な関数であることを示せ。(原始再帰の定義は f ( y + 1 ) f(y+1) f ( y + 1 ) が f ( y ) f(y) f ( y ) のみに依存する形であることに注意する。)
解答 G ( n ) = 2 F ( n ) 3 F ( n + 1 ) G(n)=2^{F(n)}3^{F(n+1)} G ( n ) = 2 F ( n ) 3 F ( n + 1 ) を考える。G ( 0 ) = 2 0 3 1 = 3 G(0)=2^03^1=3 G ( 0 ) = 2 0 3 1 = 3 。G ( n + 1 ) = 2 F ( n + 1 ) 3 F ( n + 2 ) = 2 ( G ( n ) ) 1 ⋅ 3 ( G ( n ) ) 0 + ( G ( n ) ) 1 G(n+1)=2^{F(n+1)}3^{F(n+2)}=2^{(G(n))_1}\cdot3^{(G(n))_0+(G(n))_1} G ( n + 1 ) = 2 F ( n + 1 ) 3 F ( n + 2 ) = 2 ( G ( n ) ) 1 ⋅ 3 ( G ( n ) ) 0 + ( G ( n ) ) 1 なので、G ( n + 1 ) G(n+1) G ( n + 1 ) は G ( n ) G(n) G ( n ) の原始再帰的な関数であり、G G G は原始再帰で定義できる(命題 3.2 (5) の ( ⋅ ) i (\cdot)_i ( ⋅ ) i と冪、加法を使う)。そして F ( n ) = ( G ( n ) ) 0 F(n)=(G(n))_0 F ( n ) = ( G ( n ) ) 0 は G G G と ( ⋅ ) 0 (\cdot)_0 ( ⋅ ) 0 の合成なので原始再帰的である。
演習 9.2 標準
B = { e ∣ φ e ( 1 ) ( 0 ) ↓ } B=\{\,e\mid\varphi^{(1)}_e(0)\downarrow\,\} B = { e ∣ φ e ( 1 ) ( 0 ) ↓ } は半決定可能だが決定可能でないことを示せ。
解答 B B B は e ↦ Φ ( 1 ) ( e , 0 ) e\mapsto\Phi^{(1)}(e,0) e ↦ Φ ( 1 ) ( e , 0 ) の定義域であり、この関数は 定理 5.4 により部分再帰的、定理 6.2 により計算可能だから、B B B は半決定可能。決定可能でないことは、P = { f ∣ f ( 0 ) ↓ } \mathcal{P}=\{f\mid f(0)\downarrow\} P = { f ∣ f ( 0 ) ↓ } にライスの定理 (定理 8.2 ) を使う。P \mathcal{P} P は定数関数 0 0 0 (機械 Z Z Z で計算できる)を含むので空でなく、⊥ ∉ P \bot\notin\mathcal{P} ⊥ ∈ / P より全体でもない。
演習 9.3 難
全関数 g : N 2 → N g:\mathbb{N}^2\to\mathbb{N} g : N 2 → N で、すべての計算可能な全 関数 f : N → N f:\mathbb{N}\to\mathbb{N} f : N → N について、ある e e e が存在して f = g ( e , ⋅ ) f=g(e,\cdot) f = g ( e , ⋅ ) となるものは、計算可能でないことを示せ。(部分関数なら万能関数 Φ \Phi Φ は計算可能であった。全関数に制限すると何が起こるか。)
解答 g g g がそのような計算可能な全関数だとする。d ( x ) = g ( x , x ) + 1 d(x)=g(x,x)+1 d ( x ) = g ( x , x ) + 1 は計算可能な全関数。よって d = g ( e 0 , ⋅ ) d=g(e_0,\cdot) d = g ( e 0 , ⋅ ) となる e 0 e_0 e 0 が存在し、d ( e 0 ) = g ( e 0 , e 0 ) d(e_0)=g(e_0,e_0) d ( e 0 ) = g ( e 0 , e 0 ) だが定義から d ( e 0 ) = g ( e 0 , e 0 ) + 1 d(e_0)=g(e_0,e_0)+1 d ( e 0 ) = g ( e 0 , e 0 ) + 1 で矛盾。万能関数が部分関数であることは、対角成分が未定義になって対角線論法が働かないための必然的な条件である。
A. M. Turing, “On Computable Numbers, with an Application to the Entscheidungsproblem”, Proceedings of the London Mathematical Society (2) 42 (1936), 230–265.
S. C. Kleene, “General recursive functions of natural numbers”, Mathematische Annalen 112 (1936), 727–742.
H. G. Rice, “Classes of recursively enumerable sets and their decision problems”, Transactions of the American Mathematical Society 74 (1953), 358–366.
M. Davis, Computability and Unsolvability , McGraw-Hill, 1958(Dover 版 1982)。
H. Rogers Jr., Theory of Recursive Functions and Effective Computability , McGraw-Hill, 1967。
田中一之編『ゲーデルと 20 世紀の論理学』東京大学出版会、2006–2007。