停止問題の決定不能性の証拠を理解するのに苦労しています。
がプログラムが入力で停止するかどうかを返す場合、なぜと両方にのコードを渡す必要があるのですか?
にと任意の入力(などを入力できないのはなぜですか?
停止問題の決定不能性の証拠を理解するのに苦労しています。
がプログラムが入力で停止するかどうかを返す場合、なぜと両方にのコードを渡す必要があるのですか?
にと任意の入力(などを入力できないのはなぜですか?
回答:
証拠は矛盾を見つけることを目指しています。がそれ自体への入力として使用される理由を理解するために、導出された矛盾が何であるかを理解する必要があります。矛盾は非公式です。「aがbを受け入れる」と決定するマシンH(a、b)がある場合、自分自身を受け入れないマシンを受け入れるマシンを構築できます。(あなたはそれを得るまで数回ということ読む。)画像に示されているマシン-レッツ・コールもM - M (P )=んPは受け付けませ⟨ P ⟩を?
あなたが尋ねるとき、矛盾が起こる:ん受け入れ⟨ Mを⟩?2つのオプションを試して、矛盾があるかどうかを確認してください。
受け入れ ⟨ Mを⟩場合に限り、 Mは受け付けません ⟨ Mを。これは明らかに矛盾しています。
これが、証明が任意の入力ではなく、それ自体でを実行することが不可欠である理由です。これは、対角引数として知られる不可能性証明の一般的なテーマです。
しばらく画像を無視してください。間もなく到達します。プログラムは停止テスターであると想定されています:Hにプログラムaの入力(プログラムのリストとしてaと考えてください)およびb、H (a 、b )次のように機能します
議論、ビルドすることは不可能であるが、特定の「あまのじゃく」プログラムの動作に依存しているP使用して、1 Hをサブルーチンとして。Pは、入力としてプログラムxのリストを受け取り、次のことを行います。
P(x) =
run H(x, x)
if H(x, x) answers "yes"
loop forever
else
halt
それを見るのは難しくありません
は、プログラム xが独自の説明を入力として与えられたときに永久に実行される場合にのみ停止します。
これまでのところ、はサブルーチンHがプログラムである限り、確実にプログラムになります。
今、絵に戻ります。入力として独自の説明が与えられるとどうなりますか?絵はまさにそのシナリオを説明しています。pをプログラムPの説明とし、次に上記の強調表示された部分に代入すると、次のようになります。
は、プログラム P (p )が永久に実行される場合にのみ停止します。
我々はサブルーチンという結論に強制しているので、明らかに、この逆説的な動作は、不可能である、それが与えられています一つのケースに失敗したため、停止テスターすることはできません(P 、P )を入力として。Hは正常に機能する他のケースもありますが、Hは少なくとも1つの状況で失敗するため、必要に応じて完全な停止テスターにすることはできません。
H
は2回以上呼び出されることはありP
ません。再帰はまったくありません。H(P, P)
実行されP
ずP
、渡されたときに停止するかどうかを「魔法のように」判断するだけです。
H(P,P)
は実行する必要はありませんが、停止するかどうかを判断する一部としてP
実行H(x ↦ H(x,x), P)
する必要がありP
ます。などに展開H(x ↦ H(y ↦ H(y,y), x), P)
します。
H
、この証明では指定されていません。そのため、それが何であれ、それ自体であれ、何も実行する必要はありませんP
。証拠H
は、停止問題を魔法のように決定する何らかのプログラムが存在するという仮定から始まり、そのようなプログラムの存在そのものが矛盾であり、したがってそのようなプログラムは存在しないことを証明し続けます。
よりきれいな証明を試してくださいアニメーションでを。そして、縫製業者にはサイトへの単なるリンク以上のものが含まれているはずなので、ここにあなたの質問に対する答えがあります。
最初に、Halting oracleが存在しないという証明がどのように機能するかを思い出しましょう。H
Halting oracleの候補があれば、プログラムP
と入力a
があり、どのプログラムがH
何を正しく予測できないかを証明します。P(a)
ます。
定理: Let H
は、2つの入力を受け取り、常にhalt
またはのいずれかを返すプログラムloop
です。次にプログラムが存在するQ
と、入力a
ようにQ(a)
停止した場合、およびのみ、もしH(Q,a)
戻りますloop
。
証明。プログラムを検討する
program P(y):
if H(y,y) = halt then
loop forever
else:
return
させQ = P
てくださいa = P
。どちらかH(Q,a) = halt
かH(Q,a) = loop
:
H(Q,a) = halt
その後、Q(a)
(ちょうどであるP(P)
の定義によって永遠に実行されます)P
。H(Q,a) = loop
、その後Q(a)
のdefinitoinで停止P
。QED
他のもののH(P,P)
代わりに私たちが考えた理由を尋ねた。明白な答えは、「証明が機能するためです」です。任意のに使用した場合、スタックします。実際、証明は次のようになります。H(P,X)
X
H(P,P)
H(P,X)
X
壊れた証拠。プログラムを検討する
program P(y):
if H(y,y) = halt then
loop forever
else:
return
させるQ = P
とa = X
いくつかの任意のX
。どちらかH(Q,X) = halt
かH(Q,X) = loop
:
H(Q,X) = halt
し、我々は何を言うことができないP(X)
ためか、ないP(X)
停止が何に依存してH(X,X)
戻ります。我々が立ち往生しています。我々はそれを知っていた場合は、P(X)
とX(X)
同じですが、我々は進歩を遂げることができました。(だから、私たちは本当に取る必要がありますX = P
)。H(Q,a) = loop
、私たちは再び立ち往生しX = P
ます。QEDなし。
これH(P,P)
が、アイデアを機能させるために考慮する必要があることを示していることを願っています。