非専門的シンギュラリティー研究所

無限に動き続けるシステムを表す方法を AI なども使って考えていきます。

不完全性定理(5)

不完全性定理とはなにか』の新しい版(不完全性定理とはなにか 完全版 ゲーデルとチューリング 天才はなにを証明したのか (ブルーバックス B 2277))が出ていたので、旧版のわかりにくかったところが書き換えられているのかどうかを調べようと思ったのですが、書き換えられているかどうかはよくわかりませんでした。そこでそれを調べる前に、まずチューリング機械の停止問題について ChatGPT で調べてみました。

チューリング機械の停止問題

ChatGPT で以下のように入力しました。

プログラミング言語Cと同等の機能をもち、かつメモリー不足で停止することはなく永久に動き続けることができるプログラミング言語を「プログラミング言語Cω」とします。 「」は以下の機能をもつとします。

」のコードを実行すると、終了するか、または永久に動き続けるとします。実際のコンピューター上のプログラミング言語で実行すると、メモリー不足で終了してしまったり、動力を供給することができなくなって停止してしまったりすることもありますが、「」はそのようなことが起こらない理想的なコンピューター上で動作しているのでそのようなことは起こらないとします。
このとき「」で以下のような関数 h を書くことができたと仮定します:

  • 一つの自然数を引数として受け取る
  • この関数は必ず終了する
  • 引数の自然数が「」のコードのときは、コードを実行したとき終了するならば 1、終了しないならば 0 を返す
  • 引数の自然数が「」のコードではないときは 2 を返す

」でこのような関数 h を書くことができたと仮定するとどうなりますか

以下のような答えが戻ってきました。

このような関数   h を「」で書けると仮定すると、チューリング停止問題の解決が可能であることを意味します。しかし、この仮定は理論的には矛盾を引き起こします。以下に詳細を説明します。

1. 停止性判定問題の背景

停止性問題(Halting Problem)は、任意のプログラム(コード)とその入力が与えられたときに、そのプログラムが有限時間内に停止するかどうかを決定する問題です。この問題はアラン・チューリングによって1936年に理論的に解明され、停止性問題は一般には解決不可能であることが示されています。

」で定義された関数   h は次のように停止性問題を解くための判定関数を提供します:
 h(n) = \begin{cases} 
1 & \text{もし} \ n \ \text{が「Cω」のコードで、実行時に停止する場合} \\
0 & \text{もし} \ n \ \text{が「Cω」のコードで、実行時に停止しない場合} \\
2 & \text{もし} \ n \ \text{が「Cω」のコードでない場合}
\end{cases}
このような関数を記述できると仮定した場合、停止性問題を解けるため、チューリングの停止性問題の非決定可能性という理論と矛盾します。

2. 矛盾の具体例

矛盾を示すために、関数   h を用いた自己参照的なプログラムを考えます。

  g(n) の定義

以下のようなプログラム   g を考えます:
 g(n) = \begin{cases}
\text{無限ループする} & \text{もし} \ h(n) = 1 \\
\text{停止する} & \text{もし} \ h(n) \neq 1
\end{cases}
この   g のコード(自然数として表現される値)を   n_g とします。

矛盾の導出

1. ケース1:   h(n_g) = 1 の場合

  •   h(n_g) = 1 であるということは、  g(n_g) が停止することを意味します。
  • しかし、  g(n_g) の定義では   h(n_g) = 1 の場合に無限ループするように書かれています。
  • したがって矛盾します。

2. ケース2:   h(n_g) \neq 1 の場合

  •   h(n_g) = 0 または   h(n_g) = 2 を意味します。
  • この場合、  g(n_g) は停止するように定義されています。
  • しかし、  g(n_g) の定義では   h(n_g) \neq 1 の場合に停止するので矛盾しません。
  • ところが   g(n_g) が停止すると、元の停止性判定の結果   h(n_g) が正しくなくなる場合が生じます。

3. 結論

この矛盾から、「」でそのような   h を実装できるという仮定が間違っていることがわかります。具体的には、次のことが言えます:

  • 理論的に停止性問題を解くような判定関数   h を記述することは不可能である。
  • 」が停止性問題を解決可能であるならば、「」はチューリングマシンよりも強力な計算能力を持つ必要があるが、それは既存の計算理論と矛盾する。

このため、「」の設計上、「h のような関数を記述できる」という仮定自体が成立しない、または「」が現実的には存在し得ないという結論に至ります。