計算不可能な関数の具体例から計算可能性について考えてみよう、という話です。
<計算可能>を素朴に考える2022 年 11 月 16 日1
View Slide
なにをするか計算可能でない関数を考えて,計算を試み,「いや,やっぱり計算できないじゃん」と言う.厳密な話はしません.なんとなく面白そうだなとか思ってもらえると嬉しいです.少しばかりスライドに詰め込みすぎました.2
計算可能であるとはそれを計算するための具体的な計算手順があること.例えば以下はだめ.• 無限に計算を続ける• 気合でいい感じの数を思いつく• ラマヌジャンを用意するちゃんとした定義は,「それを有限のステップで計算するチューリング機械が存在すること」.3
計算可能じゃないって?(以下,自然数(0 含む)のみを考える.)「計算可能な関数」は,よく知ってるやつら.+, −, ×, π の n 桁目の値, . . . などなど.計算の仕方を示せば「確かに計算できますね」と言えそう.じゃあ「計算可能でない」ってどういうこと? たとえば?ためしに “計算可能でない関数” を作ってみよう.4
“計算可能でない関数” を作る計算可能な関数は,具体的な計算方法を備えている.計算方法を記号列で表したとしよう(例えば英語で).例えば,f(x) = x + 1 の計算方法 E は E = “add one”計算方法をアルファベット順に並べて,番号をつける.E0, E1, E2, . . .これで計算可能な関数に自然数の番号がつく.f0, f1, f2, . . .5
“計算可能でない関数” を作るここで新しい関数 g を(さっきの番号の付け方を用いて)g(x) = fx(x) + 1とおいてみよう.何が起こるかな?6
g は “計算可能” か?g が計算可能と仮定すると,g には番号が振られる.つまり,ある自然数 j について g = fj.そのような自然数 j について g(j) を考えると...?g(j) = fj(j) + 1= g(j) + 1=⇒ 0 = 1はい矛盾.g は計算可能ではありえない!7
g は計算可能じゃない!わーい! 計算可能じゃなかった!8
g は計算可能じゃない!わーい! 計算可能じゃなかった!なんかこれ計算できそうじゃね?9
g(x) を計算してみる自然数 x が与えられたときに,この値を求めてみよう.1. 有限の長さの(カンマ,ピリオド,空白を含む)アルファ ベット列を並べた表を作る.この表は途中まで作って, 必要に応じて適宜継ぎ足していけば OK.a, b, c, . . . , z, aa, ab, . . . , az, ba, bb, . . . , zz, aaa, aab, . . .2. この表の頭から順に計算手順になっていないものを 除去して,x 番目の計算手順 fx を見つける.10
g(x) を計算してみる3. fx に x を代入して,g(x) = fx(x) + 1 が求まる.パッと見では計算できてそうだが...?アルファベットを使ったのが悪い?代わりに C++ のコードでやっても同じことが起こる.11
何がいけなかったか1. 有限の長さのアルファベット列を並べる.a, b, c, . . . , z, aa, ab, . . . , az, ba, bb, . . . , zz, aaa, aab, . . .2. 頭から順に,計算手順になっていないものを除去して x 番目の計算手順 fx を見つける.3. x 番目の計算手順 fx に x を代入して 1 を足して, g(x) = fx(x) + 1 が計算できました.12
何がいけなかったか1. 有限の長さのアルファベット列を並べる.a, b, c, . . . , z, aa, ab, . . . , az, ba, bb, . . . , zz, aaa, aab, . . .2. 頭から順に,計算手順になっていないものを除去して x 番目の計算手順 fx を見つける.3. x 番目の計算手順 fx に x を代入して 1 を足して, g(x) = fx(x) + 1 が計算できました.13
停止性問題“計算可能である” なら,有限の手続きで答えが出る.しかし,ある計算手順が有限で終わるか機械的には判定できない.ゆえに,「計算可能か判定する関数」は計算可能ではない!(有限の手順で終わることを証明するのは簡単. 有限な手順を具体的に示せばいい.)14
参考文献M. Davis. 計算の理論. 岩波書店, 1966.神保町で叩き売られてた(400 円),神保町サイコー.15