MathLabs
定理証明済み

停止問題の決定不可能性

内容

すべてのプログラム索引 ee と入力 xx について、φe(x)\varphi_e(x)(プログラム ee を入力 xx で実行すること)が停止するかどうかを常に停止して正しく出力するアルゴリズム H(e,x)H(e,x) は存在しない。

なぜ正しいのか?

これは、どのアンチウイルスソフト、コンパイラ、IDEも、無限ループ、デッドコード、「この関数は常にクラッシュする」といったことを完全に一般的な形で検出できない数学的理由である——今日の工学の限界ではなく、揺るぎない数学の壁である。

証明の概略

背理法で、そのような判定器 HH が存在すると仮定する:φe(x) ⁣↓\varphi_e(x)\!\downarrow(停止する)なら H(e,x)=1H(e,x)=1、φe(x) ⁣↑\varphi_e(x)\!\uparrow(永遠に走る)なら H(e,x)=0H(e,x)=0 であり、HH 自身は常に停止し正しい答えを出す。

HH を用いて、入力 ee に対し次のように動作する新しいプログラム DD を作る:H(e,e)H(e,e) を計算し、H(e,e)=1H(e,e)=1 なら DD は無限ループに入り、H(e,e)=0H(e,e)=0 なら DD は直ちに停止する。DD は HH から実効的に構成される(単に HH に if 文とループを加えただけ)ので、あるプログラム索引 dd を持つ、すなわち D=φdD=\varphi_d。

ここで自己言及的な問いを立てる:φd(d)\varphi_d(d) は停止するか?

場合1:φd(d)\varphi_d(d) が停止するなら、HH の正しさにより H(d,d)=1H(d,d)=1。しかし DD の定義により H(d,d)=1H(d,d)=1 は DD を入力 dd で無限ループさせる——すなわち φd(d)\varphi_d(d) は停止しない。矛盾。

場合2:φd(d)\varphi_d(d) が停止しないなら、HH の正しさにより H(d,d)=0H(d,d)=0。しかし DD の定義により H(d,d)=0H(d,d)=0 は DD を入力 dd で停止させる——すなわち φd(d)\varphi_d(d) は停止する。矛盾。

どちらの場合も矛盾するので、HH が存在するという仮定は偽である。停止問題は決定不可能である。■\blacksquare

この定理を使うトピック

ステップごとの証明

この定理のステップごとの証明はまだありません。

参考文献

  1. Wikipedia contributors (2024). Halting problem
  2. Wikipedia contributors (2024). Rice's theorem
  3. Wikipedia contributors (2024). Ackermann function