FromNandの日記

自分的備忘録

停止性問題についてまとめておく

Wikiがわかりやすかった。
停止性問題 - Wikipedia


まず、プログラムが停止するかどうかを判別できるプログラムH(A)が存在したと仮定する。(この仮定が結果的に矛盾を生じる)
プログラムH(A)は引数としてプログラムAを取り、プログラムAが停止する場合はYESを、停止しない場合はNOを返す。


次に、プログラムHを利用して次のようなプログラムM(H, A)を考える。

M(H, A){
    if(H(A) == YES){
        while(1);
    }
}


上の実装を見るとわかるが、M(H, A)はH(A)がYESを返す(つまり、Aが停止するとHが判断する場合)に無限ループに入り、M(H, A)はH(A)がNOを返す(つまり、Aが停止しないとHが判断する場合)に停止する。
ここで問題、M(H, M)は停止するだろうか?

M(H, M){
    if(H(M) == YES){
        while(1);
    }
}


【M(H, M)が停止する場合】
M(H, M)が停止するということは、if文の中の「H(M) == YES」が成り立たなかった場合である。つまり、H(M)はNOを返した。
Hは引数のプログラムが停止する場合はYES、停止しない場合はNOを返すので、Mは停止しないことになる。
これは、Mが停止するという結果に矛盾。


【M(H, M)が停止しない場合】
M(H, M)が停止しないということは、if文の中の「H(M) == YES」が成り立った場合である。つまり、H(M)はYESを返した。
Hは引数のプログラムが停止する場合はYES、停止しない場合はNOを返すので、Mは停止することになる。
これは、Mが停止しないという結果に矛盾。


よって、そのようなプログラムHは存在しない。