停止の問題を回避するプログラムのサブセットはありますか


21

私は停止する問題の別の説明を読んでいたところ、例として挙げられているすべての問題が無限のシーケンスに関係していると考えるようになりました。しかし、プログラムで無限シーケンスを使用することはありません。時間がかかりすぎます。すべての実世界のアプリケーションには下限と上限があります。実数でさえ真の実数ではありません-32/64ビットなどとして保存された近似値です。

問題は、プログラムが停止した場合に判断できるサブセットがあるかどうかです。ほとんどのプログラムで十分ですか?プログラムの「停止可能性」を判別できる言語構成体のセットを作成できますか。私はこれがどこかで以前に研究されたと確信しているので、どんなポインタでも評価されるでしょう。言語は完全なチューリングではありませんが、チューリングがほぼ完了しているようなものがありますか?

当然のことながら、このような構成体は再帰と無制限のwhileループを除外する必要がありますが、これらを使用しないプログラムは簡単に作成できます。

例として標準入力からの読み取りは制限されなければなりませんが、それは十分に簡単です-問題のドメインに応じて、入力を10,000,000文字などに制限します。

ティア

[更新]

コメントと回答を読んだ後、おそらく質問を書き直すべきです。

すべての入力が制限されている特定のプログラムについて、プログラムが停止するかどうかを判断できます。その場合、言語の制約は何であり、入力セットの制限は何ですか。これらの構成体の最大セットは、停止するかしないかを推測できる言語を決定します。これについて行われた研究はありますか?

[更新2]

これが答えです、はい、1967年にhttp://www.isp.uni-luebeck.de/kps07/files/papers/kirner.pdfから遡ります

有限状態システムの停止問題は少なくとも理論的に解決できることは、1967年にミンスキーによって既に議論されています[4]:「...有限状態のマシンは、完全に放置されると、最終的に完全に周期的になり繰り返しパターン。この繰り返しパターンの期間は、マシンの内部状態の数を超えることはできません...」

(したがって、有限チューリングマシンに固執する場合は、オラクルを構築できます)


13
「無限シーケンス...時間がかかりすぎる」。大声で笑わせた。
ブライアンオークリー

3
SQL92と正規表現は、停止が保証されている言語の例だと思います。
エリアンエビング

2
回答として「Update2 ...」を投稿してください。
S.Lott

2
再帰を除外する必要はありません。再帰を呼び出し先の引数の厳密なサブタームに制限すると、常に終了を証明できます。これは十分な要件です。教会の数字を使用している限り、「境界ループ」などは必要ありません。
SKロジック

1
Idris言語は、依存型付けとプルーフチェッカーを使用して、プログラムを実行する前に終了することを証明します。Haskellに似ており、再帰を許可しますが、一般的な再帰は許可しません-(依存する型を介して)証明できる再帰のみが何らかの終端状態につながります。
ジャック14

回答:


8

この問題は入力ではなく(明らかに、無制限の入力では、入力を読み取るだけで無制限の実行時間を持つことができます)、内部状態の数にあります。

内部状態の数が制限されている場合、理論的にはすべての場合に停止の問題を解決できます(停止または状態の繰り返しに達するまでエミュレートします)。そうでない場合は、解決できない場合があります。しかし、内部状態の数が実際には制限されている場合でも、内部状態の数の制限に依存する方法は、最も些細なプログラム以外の終了を証明するのに役に立たないほど巨大です。

プログラムの終了を確認するより実用的な方法があります。たとえば、再帰もgotoも持たず、ループのエントリで指定する必要のある反復回数にループ構造がすべて制限されているプログラミング言語で表現します。(境界は実際の反復回数に実際に関連する必要はないことに注意してください。ループの終了を証明する標準的な方法は、反復ごとに厳密に減少していることを証明する関数を使用することです。確実に肯定的であれば、最初の評価をあなたの限界として置くことができます)。


10

まず、検出器が停止した場合に何が起こるかを考えます。対角線の議論から、停止しているディテクターが停止しないか、間違った応答をするプログラムが少なくとも1つ存在することがわかります。しかし、それは奇妙でありそうもないプログラムです。

ただし、停止検出器は不可能であるという別の議論があり、それは停止検出器が魔法であるというより直感的な議論です。フェルマーの最終定理が真であるか偽であるかを知りたいとします。真であれば停止し、偽であれば永久に実行するプログラムを作成し、その上で停止ディテクターを実行します。プログラムを実行するのではなく、プログラムで停止検出器実行するだけです。検出器を停止すると、プログラムを書くだけで、数論の未解決の膨大な問題をすぐに解決できます。

それで、停止を常に決定できるプログラムを生成することが保証されているプログラミング言語を書くことができますか?はい。ループや条件を持たせたり、任意の量のストレージを使用したりすることはできません。ループなし、「if」ステートメントなし、または厳密に制限された量のストレージを使用する場合は、停止が常に決定可能な言語を作成できます。


2
ジャンプが常に前方である必要があり、後方ではない場合、ifステートメントを使用できます。BASIC言語の制限されたサブセットについて考えています。「GOTO X」は、行番号currentLine + Xに移動することを意味し、Xは0より大きくなければなりません。行が無効な場合は停止します。これにより、ストレージの需要が高まりますが、いくつかの重要なロジックが可能になります。これはおそらく、頂点がグラフを形成し、グラフにサイクルがないか、FSMが無効である有限状態マシンと同等です。また、行き止まりの状態はすべて受け入れ状態でなければなりません。
ジョブ

3
それは境界ループを持っている可能性があります-たとえばi = 1から10の場合、同様に適切に動作するイテレータ 解くことができる有限問題のクラスがあります-フェルマーの定理は再び実数の無限シーケンスに関係しています。ただし、ドメインを1 000 000未満の数値に制限すると、停止します。
daven11

2
なぜ条件はありませんか?...ジャンプのない条件が常に停止に示すことができると思われる
ビリーONeal

2
@nikie:もちろん、それは弱い議論です。ポイントは、そのような停止検出器が証拠を必ずしも見つけることなくそのような声明を証明するか反証することができるということです。私が読者にここで開発させようとしている直感は、些細な停止検出器が書ける言語は、フェルマーの最終定理やゴールドバッハの予想のような数論の単純な問題すら表現できない言語であり、おそらくそうではないということです非常に便利な言語。
エリックリッパー

3
@EricLippert:間違っています。このような言語には、ループ、適切なストレージ、その他多くの便利なものがあります。ほぼすべてをコーディングすることができます。見よ、ここにある:coq.inria.fr
SKロジック

6

ゲーデル、エッシャー、バッハを読むことをお勧めします。とりわけ、ゲーデルの不完全性定理と停止する問題に触れている非常に楽しくて啓発的な本です。

簡単に質問に答えるには、プログラムにwhileループ(またはその多くの可能な兆候)が含まれていない限り、停止の問題は決定可能です。


申し訳ありませんが、私はあなたを誤解しています。コメントを削除しましたが、GEBの推奨事項を再度述べます。
AProgrammer

いくつかの時間のための私の読書リストにされています@zvrba -でダイビングにはおそらく時間。
daven11

5

限られた量のメモリ(あらゆる種類のストレージを含む)で動作するプログラムごとに、停止の問題を解決できます。つまり、決定できないプログラムは実行時にますます多くのメモリを使用することになります。

しかし、たとえそうであっても、この洞察は、現実の問題に使用できることを意味するものではありません。数キロバイトのメモリで作業している停止プログラムは、宇宙の残りの寿命よりも簡単に長く停止する可能性があるからです。


3

(部分的に)「停止の問題を回避するプログラムのサブセットはありますか?」という質問に答えるために:はい、実際にあります。ただし、このサブセットは驚くほど役に立たない(私が話しているサブセットは停止するプログラムの厳密なサブセットであることに注意してください)。

「ほとんどの入力」の問題の複雑さの研究は、一般的なケースの複雑さと呼ばれます。可能な入力のサブセットを定義し、このサブセットが「ほとんどの入力」をカバーすることを証明し、このサブセットの問題を解決するアルゴリズムを提供します。

たとえば、停止問題は、ほとんどの入力の多項式時間で解決できます(実際、論文を正しく理解しいれば、線形時間で)。

ただし、この結果は、3つの副次的な理由により、役に立たないものです。まず、実際のコンピューター上の実際のコンピュータープログラムではなく、1本のテープでチューリングマシンについて説明します。私の知る限り、実世界のコンピューターに同じことが当てはまるかどうかは誰も知りません(実世界のコンピューターはチューリングマシンと同じ機能を計算できるかもしれませんが、許可されるプログラムの数、その長さ、停止するかどうかは全然違う)。

第二に、「ほとんどの入力」が意味するものに注意する必要があります。これは、「長さ」nのランダムプログラムがこのアルゴリズムでチェックできる確率は、nが無限大になると1になる傾向があることを意味します。言い換えれば、nが十分に大きい場合、長さnのランダムプログラムはこのアルゴリズムによってほぼ確実にチェックできます。

論文に記載されているアプローチでチェックできるプログラムはどれですか?基本的に、状態を繰り返す前に停止するすべてのプログラム(「状態」はプログラム内のコード行にほぼ対応します)。

ほぼすべてのプログラムをこの方法でチェックできますが、この方法でチェックできるプログラムはどれも非常に興味深いものではなく、通常は人間が設計するものではないため、実用的な価値はまったくありません。

また、ほとんどすべての興味深いプログラムは(明らかに)チェックするのが難しいため、一般的なケースの複雑さはおそらく停止問題の解決に役立たないことを示しています。または、別の言い方をすれば、ほとんどすべてのプログラムは面白くないが、確認は簡単です。


2
-1、これは...非常に多くのレベルで間違っている
user281377

1
まず、実世界のコンピューターは、チューリングマシンができないことを計算できません。今まで、チューリングマシンよりも(互換性の点で)実世界のコンピュータの能力を発揮した人はいませんでした。第二に、プログラムがその状態を繰り返しても停止しないので、停止の問題はそのプログラムと入力に対して解決されます。要確認:停止の問題は、特定の入力でプログラムが停止するかどうかを決定することです。無限ループは、ポジティブに検出したら問題ありません。最後に、停止の問題を解決できる有用なプログラムが多数あります。それらは限られたストレージで動作します。
user281377

あなたの最初の問題に関して:論文で述べたように、ある計算モデルがチューリング完全であることを示すことは、いくつのプログラムが正確に停止するかを保存しません。私はチューリングの完全性をよく知っており、なぜそれが私の答えを「間違った」ものにするのか完全にはわかりません。
アレックス10ブリンク

あなたの2番目の問題に関しては、私が話している状態は通常話している「マシンの状態」(状態を持つことができるすべての状態を含む)と同じではなく、有限状態オートマトンの状態ですチューリングマシンの制御に使用されます。これは、実行中の任意の時点でプログラムが作業しているコード行にほぼ対応しています。コードの行を繰り返すと、メモリの内容が異なる場合があるため、すぐに停止するわけではありません。これを明確にするために回答を更新します。
アレックス10ブリンク

@ammoQ:いいえ、ストレージの制限がある現実のシステムについて話している場合、停止の問題は解決できません。これは、状態の組み合わせを処理できる現実のシステムを構築することを意味するためです。ほとんどのCPUで可能なレジスタ状態の数は、ユニバースのアトムの数を超えているため、これを行うことはできません。
デビッドソーンリー

3

実際には、他の問題のために停止する問題を常に解決するプログラムがあります。これらは、コンピューターを実行しているオペレーティングシステムの一部です。決定不能性は、他のすべてのプログラムで機能するようなプログラムは存在しないというだけの奇妙な主張です。

ある人は、停止している証明は、ミラーのように無限にトレースするため、解決できない唯一のプログラムであると正しく述べています。この同じ人は、停止するマシンがあれば、ソルバーのアルゴリズムが停止するかどうかを事前に伝えることで難しい数学の問題を教えてくれるので、魔法になると述べています。

これらの両方の場合の仮定は、トレースする証拠がないため、停止しているマシンがトレースしないことです。ただし、実際には、指定された入力で実行されるプログラムを実際にトレース/実行します。

少なくとも論理的な証明は簡単です。少なくとも最初のステップをトレースする必要がなければ、実行するプログラムと一緒に入力する必要はありません。情報を利用するには、少なくとも最初のステップをトレースしてから、そのパスの行き先を分析しなければなりません。

一番上の回答で言及された難しい数学の問題は、早急に答えを見つけられない問題です。つまり、停止している問題は、何らかのパターンが認識できるまでトレースを続けなければなりません。

したがって、停止する問題から取得する唯一の実用的な議論は、停止するマシンが最適化された問題ソルバーの結果を、問題ソルバーが終了するよりも早く決定できないということです。

この推論の正式な証明を与えることはより困難であり、学者だと説明しようとすると、彼らはかんしゃくのような猿を投げ、シャンデリアから揺れ動くことになります。それらの人々と議論しないことが最善です。


1

これが答えです、はい、1967年にhttp://www.isp.uni-luebeck.de/kps07/files/papers/kirner.pdfから遡ります

有限状態システムの停止問題は少なくとも理論的に解決できることは、1967年にミンスキーによって既に議論されています[4]:「...有限状態のマシンは、完全に放置されると、最終的に完全に周期的になり繰り返しパターン。この繰り返しパターンの期間は、マシンの内部状態の数を超えることはできません...」

(したがって、有限チューリングマシンに固執する場合は、オラクルを構築できます)

もちろん、これにかかる時間は別の質問です


0

停止した場合に判断できるプログラムのサブセットはありますか?

はい。

ほとんどのプログラムで十分ですか?

「ほとんど」を定義します。

プログラムの「停止可能性」を判別できる一連の言語構成体を作成できますか?

はい。

チューリングがほぼ完了しているなど、十分なものはありますか?

「ほぼ」を定義します。

多くの人は、whileステートメントや再帰を使用せずにPythonを書きます。

多くの人々は、終了することが簡単に証明できる単純なイテレーターまたはカウンターを含むforステートメントのみを使用してJavaを記述します。そして、彼らは再帰なしで書き込みます。

回避whileと再帰は非常に簡単です。


すべての入力が制限されている特定のプログラムについて、プログラムが停止するかどうかを判断できますか?

いや

その場合、言語の制約は何であり、入力セットの制限は何ですか。

あの 停止の問題は、プログラムがそれ自体ほど複雑なプログラムについて物事を判断できないことを意味します。多数の制約のいずれかを追加して、停止する問題を乗り越えることができます。

停止する問題への標準的なアプローチは、プログラミング言語で利用できるよりもわずかに「豊富な」数学的形式のセットを使用して証明を許可することです。

言語を制限するよりも証明システムを拡張する方が簡単です。制限があると、制限のために表現するのが困難な1つのアルゴリズムの引数になります。

これらの構成体の最大セットは、停止するかしないかを推測できる言語を決定します。これについて行われた研究はありますか?

はい。「グループ理論」と呼ばれます。一連の操作の下で閉じられる一連の値。かなりよく理解されているもの。


「ほぼ」は私が尋ねているビットです。プログラムが停止すると言われる問題の有限クラスがあり、問題はどの程度制限されていますか?たとえば、ステートメントif(i <10)then print(i)はすべてのiに対して停止します。iのドメインを32ビット整数に制限すると、停止します。
daven11

覚えておいてforループがある whileループ、そして人々は、多くの場合、単なる条件用語で、より複雑なものを入れますx < 42
ビリーONeal

@BillyONeal:良い点。Pythonでは、forループは反復子を介して動作するように非常に厳密に制約されています。forただし、Javaのより一般的なループには、イテレーターの単純な使用を無効にする追加の条件を含めることができます。
S.Lott

「プログラムが停止すると言える問題の有限クラスはありますか?」答えはイエスのままです。「問題はどの程度限定されていますか?」あの 有限は有限です。実数を近似し、すべての数学的操作の下で閉じた自然数に固執しようとするのをあきらめる場合、通常の群論を行っています。モジュラー演算。特にない。あなたが何を求めているのか明確ではありません。モジュラー演算とは何ですか?
S.Lott

@ S.Lott私は、抽象的な意味の数字ではなく、機械で表現される数字を意味します。したがって、数値は固定ビット数と考えてください。これらの数値には、整数や実数とは少し異なる規則があります。それが理にかなっていることを願っています。
daven11
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.