次の証明についていくつか質問したい。証明はもともと教科書から来ており、次に下のスタックオーバーフローに関する質問から来ています。
停止問題が決定不能であるというこの証明はどのように機能するのでしょうか?
質問1:
以下の証明は、本質的に H をその入力マシンのシミュレーターにしますか?
言い換えれば、H = M と言うのと、以下の証明からの記述との間に重要な違いはありますか?
H([M,w]) = {accept if M accepts w}
= {reject if M does not accept w.}
質問2:
私の次のコメントはどのように正しいか間違っていますか?
停止の問題は、特定のマシンがその出力 (受け入れ/拒否) に関係なく停止するかどうかを決定する問題だと思いました。停止する問題の解決策が存在する場合、それは実際に実行するのではなく、コンパイラ/逆コンパイラ/逆アセンブラのようにソース コードを分析するものでなければなりません。それを実行する必要がある場合、明らかに「いいえ」の答えを決定することはありません。
証明の明らかな問題に注目すると、証明全体が停止問題の決定不能性を示していないように見えます。
代わりに、証明はこれを示しているようです: 次のアルゴリズムは停止しません:
boolean D()
{
return not D();
}
以下は、Sipser による Intro to the Theory of Computation から再タイプされた問題の証明です。
停止の問題は決定不可能です
これで定理 4.11、言語の決定不能性を証明する準備が整いました。
ATM = {[M,w] | M は TM であり、M は w} を受け入れます。
証明: ATM が決定可能であると仮定し、矛盾を取得します。H が ATM のディサイダーであるとします。M が TM で w が文字列である input で、H は停止し、M が w を受け入れる場合に受け入れます。さらに、M が w を受け入れない場合、H は停止して拒否します。つまり、H は TM であると仮定します。
H([M,w]) = {accept if M accepts w}
= {reject if M does not accept w.}
ここで、サブルーチンとして H を使用して新しいチューリング マシン D を構築します。この新しい TM は、H を呼び出して、M への入力が独自の記述である場合に M が何をするかを決定します。D がこの情報を決定すると、反対のことを行います。つまり、M が受け入れる場合は拒否し、M が受け入れない場合は受け入れます。Dの説明は以上です。
D = "On input [M], where M is a TM:
1. Run H on input [M, [M]].
2. Output the opposite of what H outputs; that is, if H accepts, reject and if H rejects, accept."
独自の記述でマシンを実行するという考えに混乱しないでください。これは、それ自体を入力としてプログラムを実行することに似ており、実際には時々発生します。たとえば、コンパイラは他のプログラムを変換するプログラムです。Pascal 言語のコンパイラ自体が Pascal で記述されている可能性があるため、そのプログラムをそれ自体で実行することは理にかなっています。要約すれば、
D([M]) = { accept if M does not accept [M]
= { reject if M accepts [M]
独自の説明を入力として D を実行するとどうなるか > その場合、次のようになります。
D([D]) = {accept if D does not accept [D]
= {reject if D accepts [D]
D が何をしようとも、反対のことをするのは力であり、明らかに矛盾しています。したがって、TM D も TM H も存在できません。