Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
決定不能な問題
田浦健次朗
1 / 19
決定不能 (undecidable) な問題
▶ いかなるアルゴリズムでも「解けない」「問題」▶ 要するに, コンピュータで解けない問題
2 / 19
正しい理解
そもそもアルゴリズムで「問題」が「解ける」とは?▶ 問題: = 仕様 = 入力と出力の間で満たされるべき「関係」
▶ ある「問題」を「解く」アルゴリズム▶ 停止性: 任意の入力に対して, 有限時間で停止する▶ その時の出力が正しい
3 / 19
正しい理解
▶ 入力の長さに上限はない (任意の長さの bit 列) → 「無限個」ある
▶ 正確には, 可算集合 (countable set)
▶ 言い換えれば, 「仕様」= 「自然数 → 自然数」の関数▶ 数学では具体的な手順がなくても関数が「定義」できる.例
▶ …f(x) は連続で, かつ f(x) < 3 を満たす. そこでf(x) の最大値を M とする …
最も簡潔には, どのような「自然数の関数」が具体的に手順化可能か, という問い
4 / 19
可算集合 (countable set)
「集合 A が可算集合」⇐⇒ 「N ↔ A (自然数の集合) という1-1 対応を作ることができる」言い換え
1. A の元が一度ずつ現れる数列 a0, a1, a2, . . . を作ることができる
2. 自然数から A への全単射 i 7→ a(i) ∈ A が存在する
5 / 19
可算集合の例1. 3 の倍数の集合 3N :
0, 3, 6, 9, . . .
2. 整数の集合 Z
0, 1,−1, 2,−2, 3,−3, . . .
3. 自然数 2 つの組 (i, j) (i, j ∈ N) の集合 N× N
(0, 0), (0, 1), (1, 0), (0, 2), (1, 1), (2, 0), (3, 0), . . .
4. 任意の長さの bit 列
0, 1, 00, 01, 10, 11, 000, 001, 010, 011, 100, . . .
明らかに, 最初の集合 ⊊ N, 後者 3 つの集合 ⊋ N だが, それでも 1-1 対応が存在することに注意 (「無限」の不思議)
6 / 19
可算でない集合の例
▶ 実数全体の集合 R▶ 自然数の部分集合の集合 2N
▶ 自然数から {0, 1} への写像の集合 N → {0, 1}▶ (上と全く同じ事だが) {0, 1} の (無限) 数列の集合
それらが可算でないことの証明は後述
7 / 19
一番有名な決定不能な問題: 停止問題 (HaltingProblem)
▶ 入力: プログラムの文面 P とそれへの入力 (x)▶ 出力: P に入力 x を与えた時, 停止するか否か▶ つまり以下の関数 halt を「計算」したい
halt(P, x) ={
1 (Pにxを与えたら停止する場合)0 (Pにxを与えたら停止しない場合)
要するに, 「あなたが今走らせているプログラムは決して停止しませんよ」と (正確に) 教えてくれる言語処理系�
1 $ perl my_script my_data2 error: your program would not terminate on your data
8 / 19
停止問題は決定不能 (1)▶ 対角線論法を用いた証明▶ プログラムも可算個しかない (∵有限個の文字列で書かれる).そこで「全てのプログラム」が現れる列を, P0,P1,P2, . . . と書く
▶ データも同様に可算個なので,「全てのデータ」が現れる列を,X0,X1,X2, . . . と書く
▶ 関数 halt を実現するプログラム—任意の i, j に対して Pi に Xjを与えたら停止するか否かを答えられるプログラム H—があったとし, 矛盾を導く (背理法).
P0
P1
P2
P3
P4
...
9 / 19
停止問題は決定不能 (1)▶ 対角線論法を用いた証明▶ プログラムも可算個しかない (∵有限個の文字列で書かれる).そこで「全てのプログラム」が現れる列を, P0,P1,P2, . . . と書く
▶ データも同様に可算個なので,「全てのデータ」が現れる列を,X0,X1,X2, . . . と書く
▶ 関数 halt を実現するプログラム—任意の i, j に対して Pi に Xjを与えたら停止するか否かを答えられるプログラム H—があったとし, 矛盾を導く (背理法).
X0 X1 X2 X3 X4
P0
P1
P2
P3
P4
...
...
9 / 19
停止問題は決定不能 (1)▶ 対角線論法を用いた証明▶ プログラムも可算個しかない (∵有限個の文字列で書かれる).そこで「全てのプログラム」が現れる列を, P0,P1,P2, . . . と書く
▶ データも同様に可算個なので,「全てのデータ」が現れる列を,X0,X1,X2, . . . と書く
▶ 関数 halt を実現するプログラム—任意の i, j に対して Pi に Xjを与えたら停止するか否かを答えられるプログラム H—があったとし, 矛盾を導く (背理法).
0 1
0
1 1
0 1
1 1
0 1
0 1 1
1 0 1 0
0
0
...
...
...
...
...
...............
X0 X1 X2 X3 X4
P0
P1
P2
P3
P4
...
...0
1
0
1
1...
9 / 19
停止問題は決定不能 (2)▶ 以下のプログラム C を考える�1 bool C(x) {2 if (H(x,x))3 /* 無限ループ */4 while (1) ;5 else6 return 1;7 }
▶ C(0) = 1,C(1) = 0,C(2) =1,C(3) = 0,C(4) = 0, . . .
▶ C はどこかの行 (Pc) と一致するはずだが, 明らかにどの Pc とも対角線上で異なる
0 1
0
1 1
0 1
1 1
0 1
0 1 1
1 0 1 0
0
0
...
...
...
...
...
...............
X0 X1 X2 X3 X4
P0
P1
P2
P3
P4
...
...0
1
0
1
1...
10 / 19
停止問題は決定不能 (2)▶ 以下のプログラム C を考える�1 bool C(x) {2 if (H(x,x))3 /* 無限ループ */4 while (1) ;5 else6 return 1;7 }
▶ C(0) = 1,C(1) = 0,C(2) =1,C(3) = 0,C(4) = 0, . . .
▶ C はどこかの行 (Pc) と一致するはずだが, 明らかにどの Pc とも対角線上で異なる
1
0 1
0
0
1 1
0 1
1 1
0 1
0 1 1
1 0 1
0
0
0
0
1
0
...
...
...
...
...
...............
X0 X1 X2 X3 X4
P0
P1
P2
P3
P4
...
...0
1
0
1
1
...
...
10 / 19
停止問題は決定不能 (2)▶ 以下のプログラム C を考える�1 bool C(x) {2 if (H(x,x))3 /* 無限ループ */4 while (1) ;5 else6 return 1;7 }
▶ C(0) = 1,C(1) = 0,C(2) =1,C(3) = 0,C(4) = 0, . . .
▶ C はどこかの行 (Pc) と一致するはずだが, 明らかにどの Pc とも対角線上で異なる
1
0 1
0
0
1 1
0 1
1 1
0 1
0 1 1
1 0 1
0
0
0
0
1
0
...
...
...
...
...
...............
X0 X1 X2 X3 X4
P0
P1
P2
P3
P4
...
...0
1
0
1
1
...
...
10 / 19
停止問題は決定不能 (3)▶ 実質的には同じだがよく見かける別の論証の仕方.�
1 bool C(x) {2 if (H(x,x))3 /* 無限ループ */4 while (1) ;5 else6 return 1;7 }
▶ C も P0,P1, . . . のどこかに現れる. それを Pc としよう
▶ C に c を与えたらどうなるか?
0 1
0
1 1
0 1
1 1
0 1
0 1 1
1 0 1 0
0
0
...
...
...
...
...
...............
X0 X1 X2 X3 X4
P0
P1
P2
P3
P4
...
...0
1
0
1
1...
11 / 19
停止問題は決定不能 (3)▶ 実質的には同じだがよく見かける別の論証の仕方.�
1 bool C(x) {2 if (H(x,x))3 /* 無限ループ */4 while (1) ;5 else6 return 1;7 }
▶ C も P0,P1, . . . のどこかに現れる. それを Pc としよう
▶ C に c を与えたらどうなるか?
0 1
0
1 1
0 1
1 1
0 1
0 1 1
1 0 1 0
0
0
...
...
...
...
...
...............
X0 X1 X2 X3 X4
P0
P1
P2
P3
P4
...
...0
1
0
1
1...
11 / 19
停止問題は決定不能 (3)▶ 実質的には同じだがよく見かける別の論証の仕方.�
1 bool C(x) {2 if (H(x,x))3 /* 無限ループ */4 while (1) ;5 else6 return 1;7 }
▶ C も P0,P1, . . . のどこかに現れる. それを Pc としよう
▶ C に c を与えたらどうなるか?
0 1
0
1 1
0 1
1 1
0 1
0 1 1
1 0 1 0
0
0
...
...
...
...
...
...............
X0 X1 X2 X3 X4
P0
P1
P2
P3
P4
...
...0
1
0
1...
1
11 / 19
停止問題は決定不能 (4)▶ C に c を与えたらどうなるか?�1 if (H(c, c))2 無限ループ;3 else4 終了;
▶ halt(Pc,Xc) = 1▶ → H(c, c) = 1▶ → C(c) は停止しない▶ → halt(Pc,Xc) = 0▶ → 矛盾
▶ halt(Pc,Xc) = 0 も同様 →矛盾 (やってみよ)
0 1
0
1 1
0 1
1 1
0 1
0 1 1
1 0 1 0
0
0
...
...
...
...
...
...............
X0 X1 X2 X3 X4
P0
P1
P2
P3
P4
...
...0
1
0
1...
1
12 / 19
停止問題は決定不能 (4)▶ C に c を与えたらどうなるか?�1 if (H(c, c))2 無限ループ;3 else4 終了;
▶ halt(Pc,Xc) = 1▶ → H(c, c) = 1▶ → C(c) は停止しない▶ → halt(Pc,Xc) = 0▶ → 矛盾
▶ halt(Pc,Xc) = 0 も同様 →矛盾 (やってみよ)
0 1
0
1 1
0 1
1 1
0 1
0 1 1
1 0 1 0
0
0
...
...
...
...
...
...............
X0 X1 X2 X3 X4
P0
P1
P2
P3
P4
...
...0
1
0
1...
1
12 / 19
停止問題は決定不能 (4)▶ C に c を与えたらどうなるか?�1 if (H(c, c))2 無限ループ;3 else4 終了;
▶ halt(Pc,Xc) = 1▶ → H(c, c) = 1▶ → C(c) は停止しない▶ → halt(Pc,Xc) = 0▶ → 矛盾
▶ halt(Pc,Xc) = 0 も同様 →矛盾 (やってみよ)
0 1
0
1 1
0 1
1 1
0 1
0 1 1
1 0 1 0
0
0
...
...
...
...
...
...............
X0 X1 X2 X3 X4
P0
P1
P2
P3
P4
...
...0
1
0
1...
1
12 / 19
対角線論法
対角線論法はもともとカントールにより「実数の集合が可算でないこと」を示すのに発明された
▶ 実数は (無限桁の) 小数で表せる
▶ 特に [0, 1] の実数を 2 進数で展開すると考えれば,
0 ≤ x ≤ 1の実数↔ 0-1 の (無限の) 列
▶ 実数の集合が可算個, つまり, 全ての実数が現れる数列 r0, r1, . . . があったとする
0 1
0
1 1
0 1
1 1
0 1
0 1 1
1 0 1 0
0
0
...
...
...
...
...
...............
r0= 0.
...
...
0
1
0
1
1...
r4= 0.r3= 0.r2= 0.r1= 0.
小数第 j桁
13 / 19
対角線論法
対角線論法はもともとカントールにより「実数の集合が可算でないこと」を示すのに発明された
▶ 実数は (無限桁の) 小数で表せる▶ 特に [0, 1] の実数を 2 進数で展開すると考えれば,
0 ≤ x ≤ 1の実数↔ 0-1 の (無限の) 列
▶ 実数の集合が可算個, つまり, 全ての実数が現れる数列 r0, r1, . . . があったとする
0 1
0
1 1
0 1
1 1
0 1
0 1 1
1 0 1 0
0
0
...
...
...
...
...
...............
r0= 0.
...
...
0
1
0
1
1...
r4= 0.r3= 0.r2= 0.r1= 0.
小数第 j桁
13 / 19
対角線論法
対角線論法はもともとカントールにより「実数の集合が可算でないこと」を示すのに発明された
▶ 実数は (無限桁の) 小数で表せる▶ 特に [0, 1] の実数を 2 進数で展開すると考えれば,
0 ≤ x ≤ 1の実数↔ 0-1 の (無限の) 列
▶ 実数の集合が可算個, つまり, 全ての実数が現れる数列 r0, r1, . . . があったとする
0 1
0
1 1
0 1
1 1
0 1
0 1 1
1 0 1 0
0
0
...
...
...
...
...
...............
r0= 0.
...
...
0
1
0
1
1...
r4= 0.r3= 0.r2= 0.r1= 0.
小数第 j桁
13 / 19
対角線論法
▶ 右表の対角線上の数を逆転させた0-1 の無限列もまた実数
▶ そこでそれはどこかの行に現れなくてはならないが, 明らかに対角線部分で一致していない
0 1
0
1 1
0 1
1 1
0 1
0 1 1
1 0 1 0
0
0
...
...
...
...
...
...............
r0= 0.
......
0
1
0
1
1...
r4= 0.r3= 0.r2= 0.r1= 0.
小数第 j桁
14 / 19
対角線論法
▶ 右表の対角線上の数を逆転させた0-1 の無限列もまた実数
▶ そこでそれはどこかの行に現れなくてはならないが, 明らかに対角線部分で一致していない
1
0 1
0
0
1 1
0 1
1 1
0 1
0 1 1
1 0 1
0
0
0
0
1
0
...
...
...
...
...
...............
r0= 0.
......
0
1
0
1
1
...
...
r4= 0.r3= 0.r2= 0.r1= 0.
小数第 j桁
14 / 19
対角線論法のその他の応用
対角線論法は, 色々な集合が「可算でない (自然数と 1-1 対応させられない)」ことを示すのに有用である. 以下は演習問題
1. 自然数の部分集合すべての集合 2N は可算でない2. 自然数 → 自然数の関数すべての集合 N → N は可算でない
▶ 注: 2 つ目はすでに, 「決定不能な関数がある」ということの証明になっている
▶ 停止問題の決定不能性の証明は, そのような関数を具体的に示してみせた
15 / 19
もし, 停止問題が決定可能だったら…
色々な数学の問題を「解く」アルゴリズムが得られていた…▶ 自然数を未知数とする「あらゆる」方程式 f(x) = 0
(n ∈ N) が解を持つか否かを判定する�1 bool P(f) {2 for (i = 0; 1; i++)3 if (f(i) == 0) return 1;4 }5 bool solve(f) {6 return H(P, f);7 }
16 / 19
もし, 停止問題が決定可能だったら…
▶ もちろん変数の数は 2, 3, 4, …いずれでもよい (N× N,N× N× N なども可算だった)
▶ その他あらゆる可算個の領域を未知数とする方程式の解を判定可能
▶ フェルマーの最終予想も原理的にはコンピュータで解けた!
f(x, y, z, n) = xn + yn − z
17 / 19
その他の決定不能な問題
▶ 整数係数ディオファントス方程式の解の存在判定.▶ 入力: 多変数の整数係数多項式 f(x0, . . . , xn−1)▶ 出力: f(x0, . . . , xn−1) = 0 は解を持つか?
ヒルベルトの第 10 問題が, 「これを解くアルゴリズムを求めよ」というものだった
▶ ポストの対応問題▶ 入力: n 個の bit 列のペア (ai, bi) (i = 0, . . . ,n − 1▶ 出力: 各 bit 列を何度使っても良いとして, ai をつなげた文字列と, 対応する bi をつなげた文字列を同じにできるか
▶ 一階述語論理の真偽判定
18 / 19
参考
▶ Wikipedia. List of undecidable problemshttp://en.wikipedia.org/wiki/List_of_undecidable_problems
▶ Undecidable problems: a samplerhttp://arxiv.org/abs/1204.0299
19 / 19