「アランチューリングは、1936年に、考えられるすべてのプログラム入力ペアの停止問題を解決する一般的なアルゴリズムが存在できないことを証明しました。」
私はのために停止問題を解決するための一般的なアルゴリズムを見つけることができますいくつかの可能なプログラム入力ペアを?
プログラミング言語(複数の言語)を見つけることができます。この言語のすべての種類のプログラムに対して、プログラムが終了するか永久に実行されるかを決定できますか?
「アランチューリングは、1936年に、考えられるすべてのプログラム入力ペアの停止問題を解決する一般的なアルゴリズムが存在できないことを証明しました。」
私はのために停止問題を解決するための一般的なアルゴリズムを見つけることができますいくつかの可能なプログラム入力ペアを?
プログラミング言語(複数の言語)を見つけることができます。この言語のすべての種類のプログラムに対して、プログラムが終了するか永久に実行されるかを決定できますか?
回答:
可能なプログラム入力ペアの停止問題を解決する一般的なアルゴリズムを見つけることができますか?
はい、そうです。たとえば、ループも再帰も含まないプログラムに対して「はい、終了します」を返すアルゴリズムを記述できます。また、while(true)
間違いなく到達し、含まれていないループを含むプログラムに対して「いいえ、終了しません」breakステートメント、およびその他すべての「Dunno」。
プログラミング言語(複数の言語)を見つけることができます。この言語のすべての種類のプログラムに対して、プログラムが終了するか永久に実行されるかを決定できますか?
その言語がチューリング完全である場合ではありません。
しかし、例えばCoq、AgdaまたはMicrosoft Dafnyのように停止問題を決定できる非チューリング完全言語があります(そして実際にはそれぞれのタイプシステムによって決定され、それらを完全な言語にします(つまり、終了しない可能性のあるプログラムはコンパイル))。
ここでの答えはすべて完全にあり、その点を見逃していると思います。質問への答えは、プログラムが停止することを意図していると仮定すると、はい、停止することを示すことができたほうが良いでしょう。簡単に停止しないことを示すことができない場合、プログラムは非常に不適切に作成されていると見なされ、品質管理によって拒否されます。
適切なマシンアルゴリズムを実際に作成できるかどうかは、入力プログラミング言語とあなたの意欲に依存します。終了を証明することを簡単に可能にすることは、プログラミング言語の合理的な設計目標です。
言語がC ++の場合、おそらくツールを書くことはできません。実際、パーサーを実行させることはまずないでしょう。より構造化された言語の場合、証明を生成できるか、少なくとも特定の前提条件で生成する必要があります。後者の場合、ツールはこれらの前提条件を出力する必要があります。同様のアプローチは、言語に終了アサーションを含め、ツールがアサーションを信頼する複雑な状況で使用することです。
一番下の行は、プログラムが停止するという証拠が実際に可能であることを誰も理解していないようです。なぜなら、そのような停止プログラムを書くことを意図している(良い)プログラマーは、常に意図的にそうし、なぜ彼らが正しく終了して行動するのかという精神的な絵で:そのようなコードは意図的に書かれているので、それらが停止し、正しいことは明らかです。妥当なアルゴリズムがこれを証明できない場合、おそらくいくつかのヒントがあれば、プログラムは拒否されるべきです。
要点:プログラマーは任意のプログラムを作成しないため、停止定理の論文は満足されず、結論は当てはまりません。
優れた(疑わしいほど深い)質問。実際に、限られた入力セットで成功する停止検出プログラムがあります。その活発な研究分野。(自動化された)定理証明領域と非常に強い結びつきがあります。
ただし、コンピュータサイエンスには、「プログラム」を表す「正確な」用語が「時々」あるとは思えません。「アルゴリズム」という言葉は通常、常に停止するプログラムのために予約されています。
その概念は、CS理論家が、成功する確率が既知または計算可能であると主張する確率的アルゴリズムとは明らかに異なるようです。
時々使用されるセミアルゴリズムという用語がありますが、明らかに列挙可能または計算不可能なことの同義語です。
そのため、ここでは、それらをquasialgorithmsと呼びます。概念は決定可能と決定不能とは異なります。
CSでは、この「準アルゴリズム階層」はこれまでのところほとんど非公式にしか研究されていないようです。
忙しいビーバーの研究[1]とPCP問題[2]に現れます。実際、PCPに対するDNAベースのコンピューティング攻撃は、準アルゴリズムと見なすことができます。[3] そして、定理証明[4]のようなすでに指摘された他の分野で見られます。
[2] Zhao (v2?)による投稿の対応の問題への取り組み
[3] バインド後の対応の問題を解決するためにDNAを使用したカリら
[4] Cook et al、Comm。によるプログラム終了の証明。ACMの
(これは実際、defnがTCS.SE imhoに値する非常に深い質問です...おそらく誰かがそれが収まるようにそこに再質問することができます)
問題のプログラミング言語が十分に複雑である限り(つまり、チューリング完全である場合)、言語には、終了することが証明できないプログラムが常に存在します。
最も原始的な言語を除くすべてがチューリング完全であるため(変数や条件のようなもののみを使用するため)、停止問題を解決できる非常に小さなおもちゃの言語のみを構築できます。
編集:コメントを踏まえて、より明確にしましょう。停止する問題を解決できるように設計する可能性のある言語は、チューリング不完全でなければなりません。これにより、適切な基本的な要素のセット(たとえば、「変数、条件、ジャンプ」、または@ sepp2kが言うように、汎用の「while」ループ)を含む言語はすべて除外されます。
どうやらそのような実用的な「単純な」言語がいくつか存在するようです(例えば、CoqやAgdaなどの定理ソルバー)。それらが「プログラミング言語」の概念を満たしている場合、それらが何らかの完全性を満たしているかどうか、または停止問題が解決可能かどうかを調査することができます。
はい、できますが、役に立つとは思いません。おそらくケース分析のためにそれを行う必要があり、それから最も明白なケースのみを探すことができるでしょう。たとえば、コードのファイルをgrepできますwhile(true){}
。ファイルにそのコードがある場合、ファイルは終了しません^。より一般的には、ループや再帰のないプログラムは常に終了すると言うことができ、プログラムが終了するかしないことを保証できるいくつかのケースがありますが、中規模のプログラムでもこれは非常に困難であり、多くの場合、答えを出すことはできません。
tl; dr:はい。ただし、ほとんどの便利なプログラムで使用できるようにすることはできません。
^はい、技術的には、そのコードがコードパス上にない場合、またはまだ終了する可能性のある他のスレッドがある場合、ここで一般的なポイントを示しています。