停止問題の制限されたバージョンについて私たちは何を知っていますか


16

UPDATE:良く形成疑問が提起され、ここでこの質問を明確に定義されていないことを示し、以下の受け入れ答えのコメントとして)


停止問題の不可能性の古典的な証明は、入力としてそれ自体に停止検出アルゴリズムを適用しようとするときに矛盾を実証することに依存します。詳細については、以下の背景を参照してください。

実証された矛盾は、自己参照パラドックスのために適用されます(「この文は正しくない」という文のように)。しかし、そのような自己参照を厳密に禁止した場合(つまり、そのような自己参照が停止することを決定できないという事実を受け入れた場合)、どのような結果が残されますか?非自己参照マシンの残りのセットの停止の問題は、停止するかどうかを決定できますか?

質問は次のとおりです。

自己参照ではない(つまり、入力として自分自身を受け取らない)可能性のあるすべてのチューリングマシンのサブセットを検討する場合、このサブセットの停止問題について何がわかりますか?

更新

たぶん、私が何を求めているかをよりよく再定式化することは、決定可能なセットを定義するものをよりよく理解することです。HALTを実行する場合を除いて、決定不能性に関する情報を追加しないため、古典的な決定不能性の証明を分離しようとしました。

背景: チューリングマシンのエンコードである入力とを決定できるチューリングマシンがあり、停止するかどうかの矛盾を前提としています。次に、とを取り、を使用して停止するかどうかを決定し、逆のことを行うチューリングマシン考えます。つまり、が停止しない場合はが停止し、は停止します。次に、は矛盾を示しますQMバツMバツKMバツQMバツKMバツMバツKKK 停止しない場合は停止する必要があり、停止しても停止しません。

動機: 同僚がソフトウェアシステムの正式な検証に取り組んでおり(特に、システムがソースコードレベルで既に証明されており、コンパイラーの問題を中和するために、コンパイルされたバージョンでそれを修正したい場合)、彼の場合、組み込みの制御プログラムの特別なセットで、自己参照型ではないことは確かです。彼が実行したい検証の1つの側面は、入力ソースコードが終了することが証明された場合に、コンパイルされたプログラムが停止することが保証されるかどうかです。

更新

以下のコメントに基づいて、非自己参照チューリングマシンの意味を明確にします。

目標は、それを証明で提示された矛盾を引き起こさないセットとして定義することです(上記の「背景」を参照)。次のように定義できます。

チューリングマシンが存在すると仮定すると、チューリングマシンのセットのための停止問題を決定する、その後、に対して非自己参照されるそれが呼び出したすべてのマシン除外した場合上(直接または間接的に)。(明らかに、はメンバーにはなれません。)QSSQQSQS

を間接的に呼び出すことの意味を明確にするには:QS

でを呼び出すことは、状態のセットとテープ上の特定の可能な初期入力(任意のメンバーに対応)を持つチューリング機械によって示され、最初はその入力の先頭にあります。マシン呼び出す上の段階の(有限の)シーケンスがあることがあれば、「間接的に」、初期設定にその設定が「準同型」にするためにかかるだろう。QSQSWQSWQS

更新2

同じタスクを実行するチューリングマシンが無限に多く、が一意ではないという議論からの回答から、は単一のチューリングマシンではなく、すべてのマシンコンピューティングの(無限)セットであると言うことで上記の定義を変更します同じ関数(HALT)。HALTは、特定の入力でチューリングマシンが停止するかどうかを決定する関数です。QQ

更新3

チューリングマシン準同型の定義:

ラベル付きノードANDエッジを持つグラフの準同型の標準的な意味で、Aの遷移グラフがBの遷移グラフと準同型である場合、A TM AはTM B と準同型です。TMの遷移グラフ(V、E)は、V = states、E = states間の遷移アークです。各アークには、(S、W、D)、S =テープから読み取ったシンボル、W =テープに書き込むシンボル、D =ヘッドショーが移動する方向のラベルが付いています。


5
「非自己参照の残りのセット」このセットについて賢明に議論する前に、「自己参照」の定義が欲しい。しかし、それを定義するのは難しいと思いますか?
サムネア

1
証明可能な停止プログラムの研究があります(ただし、このクラスにはすべての停止プログラムが含まれているわけではありません)。基本的に、それらはプログラムとそれが停止する証拠のペアです。たとえば、私が間違っていなければ、Agdaは停止するプログラムのみを許可します。ロジックやプログラミング言語に取り組んでいる人は、これについてもっと言いたいことがあると思います。
伊藤剛

1
@M。アラガン。今私は、「呼び出すのが定義したいと思います上のSオリジナルの「自己参照」:)として定義するために、私は難しいようであることを疑う間接的に、」QS
ロブ・シモンズ

2
これは興味深い質問を提起します:すべての計算不能性(決定不能性)証明は、Cantorの対角化法にトレーサブルですか?対角化法に直接または間接的に依存しない決定不能性の証拠はありますか?
モハマドアルトルコ

回答:


9

「明確な」質問に到達するには、もう少し作業が必要だと思います。特に、これには問題があります。

SでQを呼び出すことは、状態のセットとテープ上の特定の可能な初期入力(Sの任意のメンバーに対応)を持つチューリングマシンQで示され、最初はその入力の先頭にあります。マシンWは、Q(S)の初期構成に対して構成を「準同型」にするために(有限の)一連のステップがある場合、SでQを「間接的に」呼び出します。

1つの問題は、同じ関数を計算するチューリングマシンが無数にあることです。標準の対角化引数では、QサブルーチンをHALTの別のディサイダーに置き換えることができます。無限に多数あるためです。または、HALTと計算上同等の機能。したがって、「間接呼び出し」の概念をどのように定義するかは、私には完全には明らかではありません。

別の質問かもしれません:どのセットのチューリングマシンについて、停止の問題を決定できるのでしょうか?ここにはたくさんの答えがあります:リソース制限されたTM(例:f(n)スペースのみを使用、fは特定の計算可能な関数)、特定の方法で動作制限されたTM(例:読み取りヘッドが一方向にのみ移動)しかし、別の興味深い質問は、その制限されたセットのメンバーシップが決定可能かどうか、または入力の「約束された」サブセットで正しい答えを保証するだけで検証しない「約束の問題」に制限する必要があるかどうかですメンバーシップ。


QH

それほど単純ではありません。計算可能なHALTを探しているので、あなたの定義は逆説的です。ただし、これが計算可能な場合、計算可能な関数は計算上同等です。ただし、入力セットに準計算可能な問題(TM)が含まれている場合、そのようなTMの停止問題を決定するとその問題の決定手順が得られるため、矛盾が生じます。
マークReitblatt

1)計算不可能なHALTは決定不能を意味しませんか?矛盾を期待して、そのような計算可能なHALTが存在すると仮定していました。2)すべての計算可能な関数が互いに計算可能に等価であるという概念に精通していません。引用しましたが、これはHALT問題を解決する関数であることを意味します。どうやらλx.1は計算可能ですが、HALTを決定しません。間違っている場合は修正してください。半計算可能な問題については、HALTは無限の数のステップを踏む可能性がありますが、HALTが決定不可能であるという元の証明に矛盾が生じることはありません。
M.アラガン

1)そうです。しかし、問題は「非自己参照」という概念を定義しようとしていることです。それは、私が主張したように対角化を可能にする弱い制限であるか、すべてを排除する強い制限です。2)簡単です。「計算上同等」とは、回答を保存する一方から他方への計算可能なマッピングがあることをほぼ意味します。しかし、答えを計算できるなら、私はごまかしてマッピングを簡単にすることができます。3)HALTを決定するTM自体が終了しない場合、HALTの決定者ではありません。
マークReitblatt

少しわかりにくいのは、TMと彼らが計算した決定問題との混同です。TMが互いに計算上同等であることを話すのは普通ではありません。むしろ、それらによって計算される関数は同等(または等しい)にすることができます。問題は、TMが別のTMをシミュレートしないと言うことは、それらによって計算される関数を分離するための具体的な何かを与えることなく、一般的に定義するのが難しいことです。たとえば、Log-space TMはEXP空間の問題を解決するTMをシミュレートできません。
マークReitblatt

9

あなたの動機を正しく理解していれば、これは「制限された停止の問題」の問題よりも「コンパイラの正確さ」の問題のようです。いくつかのソースレベルプログラムProgで証明したプロパティ(終了)があり、それをコンパイル済みコードに拡張して、compiled(Prog)と同じプロパティを取得したい場合。しかし、コンパイラは(一般的に)チューリング完全なランタイム(JVMなど)の実装、終了プログラムをJVMバイトコードにコンパイルしてから、JVMを起動してコンパイル済みバイトコードを供給する実行可能ファイルをダンプするなど、arbitrarily意的なことを任意に実行できます。

実際には、コンパイラがどのように動作するかについての暗黙の知識を利用して、コンパイルされたプログラムが正しいソースプログラムが正しいことを証明する検証手順を実装することはおそらく非常に可能です(実際、プログラムの多くの自動検証ツールは暗黙の知識を利用していますプログラマーの頭の中のアルゴリズムからコードへの「コンパイラ」の)。ただし、一般的にはおそらくコンパイラの正確性の問題を見ているでしょう。私が理解しているように、そうするための2つの古典的な方法があります。

1つのオプションは、プログラムProgおよびプルーフを入力として受け取り、プルーフが終了(Prog)し、出力をコンパイル(Prog)および終了(compiled(Prog))するコンパイラーを使用することです。後者は、コンパイラ。これに関する古典的な論文は、ネキュラとリーの「証明コンパイラの設計と実装」です。

または、compiles()関数に関する事実を証明できます。compiles()が終了入力を与えるたびに、終了出力を生成します。コンパイラの正確性についてのこの考え方へのアクセシブルな紹介は、Xavier LeroyのCACM記事、「現実的なコンパイラの形式的検証」です

(PSこの回答が役立つことを願っています-あなたが尋ねた質問とは少し異なることを認識していますので、私がオフベースであるか、すでに知っていることを繰り返すかどうか教えてください。)


すばらしい回答をありがとう。これは私の同僚にとって間違いなく役に立つでしょう。しかし、私は(同僚とは独立して)停止問題の証明に関する理論的意味にもっと興味があります。矛盾を示したケースを取り除くと、停止問題の決定可能性について他に何がわかりますか?
M.アラガン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.