自己参照なしで問題を停止する:なぜこの議論は十分ではない(またはそうならない)のですか?


8

私は、ホールディングプロブレムプルーフのアイデアを可能な限りアクセスしやすい方法で説明する方法を見つけようとしています(学部生のCS学生に)。私が見つけた最も単純な議論はこれです。これがまさに私が目指している治療スタイルです。ただし、自己参照(特に、プログラムがそれ自体で停止するかどうかのチェック)は、最も教訓的ではありません。

証明スケッチとして私が疑問に思っているのは、これ以上単純化できず、次のように言えない理由H(P,I)です。停止する場合にtrueでP(I)停止し、それ以外の場合はfalseで停止する停止問題のプログラムを想定すると、プログラムを作成できます。フォームの:

def Q(J):
  if H(Q,J) then loop forever
  else halt

...停止問題が有効なプログラムである場合にのみ有効なプログラムです。次に、次のように質問できます。H(Q,J)任意の値に対して何を返す必要がありJますか?両方の可能性に矛盾があり、の存在によりH矛盾したプログラムを構築できるQため、このような形式のプログラムはH存在できないと結論付けます。

プログラムQが現在の入力で停止するかどうかをチェックする(そしてその逆を行う)という点で、まだいくつかの自己参照がありますが、私にとって、これは、呼び出しを必要とする状況を設定するよりもはるかに直感的ですフォームP(P)H(P,P)など。しかし、私はこの単純な引数が使用されるのを見たことがありません。したがって、私の質問は次のとおりです。

  • 上記の議論は、停止問題の証明(スケッチ)として十分ですか?
    • もしそうなら、なぜこれほど多くの引数は、フォームの混乱のステップに行くのですP(P)H(P,P)?(式から重要でない「入力」を削除するだけですか?)
    • そうでない場合、何が欠けていますか?

このトピックには、次のようなさまざまな関連する質問があります。

また、ベリーのパラドックスに基づいた証明についての言及も見つかりました。これは非常に魅力的です。それでも、上記の特定の引数が機能するかどうかを自分で納得させることができませんでした(たとえ自分の理解のためだけでも、私はおそらく何か愚かなことを逃していると感じ、それが何であるか知りたいと思っています)。


2
このビデオをご存知ですか?それは私が今まで見た停止の問題の最も直感的な説明です。
Polygnome 2018

ポインタをありがとう!はい、@ DWは彼の回答でそれにリンクしています。
バドロイト2018

回答:


19

これは、停止の問題を提示するのに良い方法だとは思いません。重大な問題を隠れた方法で覆い隠してしまうからです。リンクしたものなど、より標準的なプレゼンテーションを使用することをお勧めします。技術的な内容を最小限に抑える方法で説明する方法を見つけたい場合、このビデオのプレゼンテーションは驚くほどアクセスしやすく、標準証明のロジックに忠実です。

あなたの提案の難しさについて。あなたの提案では、そのようなのコードを書き留めることは簡単ではありませんQ。ラインを持っているとはどういう意味か考えてください

  if H(Q,J) then loop forever 

の最初の引数Hは、コード/アルゴリズム/チューリングマシンを含むビット文字列であることを思い出してください。これは、関数へのポインターではなく文字列です。単純に、これはのコードQ内に、のソースコードを含むハードコードされた文字列を含めることを意味しているようですQ。しかし、それは不可能です。のコードにQ100文字かかるとします。次に、の定義内に100文字の文字列定数をハードコード化するQ必要があります。さらに、残りのロジックのためにさらにいくつかの文字が必要です。合計すると100文字を超えます。あなたが考えてみれば、我々がのコード内の文字列定数を持つことができないことは明らかだQというのコードであるQ、それは長すぎるので、。

多分あなたはそれがあなたが考えていたものではないと考えているのでしょう。たぶん、プログラミング言語には現在の関数のコードを取得するための組み込みのAPIがあると考えていたので、実際に考えていたコードは次のようなものです。

def Q(J):
  if H(get_source_code_of_current_function(),J) then loop forever
  else halt

いいよ。これは、get_source_code_of_current_function()API を備えたプログラミング言語で記述されたコードでは停止の問題を解決できないことを証明しています。しかし、私のお気に入りのプログラミング言語にはそのようなAPIがありません。だから、この証明は私の好きなプログラミング言語について何も証明していません-おそらく停止の問題は私の言語で解決可能です、誰が知っていますか?同様に、TuringマシンにはそのようなAPIがないため、Turingマシンの停止問題が特定できないことを証明するものではありません。

そして、それはあなたの証明の大きな欠陥です。そして、それは微妙で全く明らかではない欠陥です。表面上で「有効に見える」証拠を提示することは教育学的に良い考えではないと思いますが、実際には、深く掘り下げると欠陥があります。

これで、提案された証明を救うことできます。あなたが言ったように機能する関数を構築することは実際可能Qです。あなたは基本的にそれがクインである必要があります。私は原則的に、あなたが思うことができ、あなたの証拠を提示し、機能を実装する方法を説明し、その後、quinesの考え方を説明しQ 、それらのアイデアを使用して。しかし、教育的観点からは、それは私には悪い考えのように思えます。クインは心を曲げ、神秘的で、理解するのが大変です。クインを理解しない学生はあなたの証明を理解しません。そして、それは停止問題の決定不能性の証明を必要以上に不思議に見せます。したがって、これは停止の問題を理解するためのよりアクセスしやすい方法のようには思えません。


すばらしい回答、ありがとうございます。おそらく、より標準的なプレゼンテーションで行くことが(たとえば、クインを導入するのではなく)行く方法だと思います。
バドロイト2018

「基本的にはクインである必要があります」-またはQをより大きなプログラムの定数として定義し、汎用チューリングマシンまたは同等のものを使用して評価します。万能チューリングマシンがすべての状況で実行されているマシンと同じように動作することを受け入れる限り、それは確かに理解しやすいアプローチでしょうか?
Jules

@Jules、申し訳ありませんが、提案された証拠を理解できません。そのため、コメントできません。
DW

クインを理解するのが難しいと思う理由を説明していただけませんか。私の経験では、「これを書いてから同じ引用文を書く」という形のクインは、構成するのが非常に簡単です。
Dmitri Urbanowicz 2018

@DmitriUrbanowicz、おそらくそれは私だけで、私はそれにこだわっています。私は私の頭を包むのに魔法のように厳しいクインを見つけます。多分それは私だけです。あるいは、まだ正しい説明を見ていません。たぶん私は十分に頑張っていませんでした。たぶん他の人は違う経験をするでしょう!
DW

1

自己参照が教育学的にいかに難しいかはわかりません。理容パラドックスは非常に理解しやすいです。そして、あなたの議論には暗黙の自己参照があり、単純な自己参照よりも理解するのが難しいと思います。その上、それは矛盾している。H(Q、J)を定義するには、まずQが何であるかを知り、Qを定義するには、まずH(Q、J)が何であるかを知る必要があります。それはうまくいきません。せいぜい、Qはこの自己参照定義の固定小数点であると断言できますが、Qの矛盾した性質から何かを導き出そうとすると、Hが存在しないか、そのような固定小数点が存在しないことを示しているだけです。 ; ここで、Hが存在する場合、固定小数点が存在する必要があることを証明する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.