チューリングの「ハルティング問題‍」を解決するアルゴリズム


23

「アランチューリングは、1936年に、考えられるすべてのプログラム入力ペアの停止問題を解決する一般的なアルゴリズムが存在できないことを証明しました。」

私はのために停止問題を解決するための一般的なアルゴリズムを見つけることができますいくつかの可能なプログラム入力ペアを?

プログラミング言語(複数の言語)を見つけることができます。この言語のすべての種類のプログラムに対して、プログラムが終了するか永久に実行されるかを決定できますか?



3
5月にCACMの非常に興味深い記事がありました:プログラム終了の証明
クリストフワレッシュ

3
「いくつかの可能なプログラム入力ペアのための一般的なアルゴリズム[...]-それは自己矛盾に近い。すべてのプログラムの無限のサブクラスに自分を制限したいと思いますか?
ラファエル

回答:


25

可能なプログラム入力ペアの停止問題を解決する一般的なアルゴリズムを見つけることができますか?

はい、そうです。たとえば、ループも再帰も含まないプログラムに対して「はい、終了します」を返すアルゴリズムを記述できます。また、while(true)間違いなく到達し、含まれていないループを含むプログラムに対して「いいえ、終了しません」breakステートメント、およびその他すべての「Dunno」。

プログラミング言語(複数の言語)を見つけることができます。この言語のすべての種類のプログラムに対して、プログラムが終了するか永久に実行されるかを決定できますか?

その言語がチューリング完全である場合ではありません。

しかし、例えばCoqAgdaまたはMicrosoft Dafnyのように停止問題を決定できる非チューリング完全言語があります(そして実際にはそれぞれのタイプシステムによって決定され、それらを完全な言語にします(つまり、終了しない可能性のあるプログラムはコンパイル))。


1
プリミティブ再帰関数のクラスは、よく知られている「プログラミング言語」であり、停止問題は自明に決定可能です。
ラファエル

すべてのプログラムが終了することが証明されている「完全な関数型プログラミング」言語がいくつかあります。
アンダーソングリーン

3

ここでの答えはすべて完全にあり、その点を見逃していると思います。質問への答えは、プログラムが停止することを意図していると仮定すると、はい、停止することを示すことができたほう良いでしょう。簡単に停止しないことを示すことができない場合、プログラムは非常に不適切に作成されていると見なされ、品質管理によって拒否されます。

適切なマシンアルゴリズムを実際に作成できるかどうかは、入力プログラミング言語とあなたの意欲に依存します。終了を証明することを簡単に可能にすることは、プログラミング言語の合理的な設計目標です。

言語がC ++の場合、おそらくツールを書くことはできません。実際、パーサーを実行させることはまずないでしょう。より構造化された言語の場合、証明を生成できるか、少なくとも特定の前提条件で生成する必要があります。後者の場合、ツールはこれらの前提条件を出力する必要があります。同様のアプローチは、言語に終了アサーションを含め、ツールがアサーションを信頼する複雑な状況で使用することです。

一番下の行は、プログラムが停止するという証拠が実際に可能であることを誰も理解していないようです。なぜなら、そのような停止プログラムを書くことを意図している(良い)プログラマーは、常に意図的にそうし、なぜ彼らが正しく終了して行動するのかという精神的な絵で:そのようなコードは意図的に書かれているので、それらが停止し、正しいことは明らかです。妥当なアルゴリズムがこれを証明できない場合、おそらくいくつかのヒントがあれば、プログラムは拒否されるべきです。

要点:プログラマーは任意のプログラムを作成しないため、停止定理の論文は満足されず、結論は当てはまりません。


4
その点を完全かつ完全に見落としたのはあなただと思います。あなたの答えの最初の段落は、アルゴリズムについて質問しているため、質問には適用されません-人間が証明できるかできないかではありません。残りの答えは、質問の最初の段落、つまりアルゴリズムがいくつかのプログラムの終了を証明できるかどうかに答えます。以前の回答の誰もがすでにその質問に「はい」と言っていました。
sepp2k

3
十分に単純なチューリング完全言語ですべての適切に記述されたプログラムの終了を証明できるアルゴリズムを書くことができるというあなたの主張は、完全に間違っています。終了を証明しようとするすべての可能なアルゴリズムについて、その問題を解決するすべてのプログラムがそのアルゴリズムによって停止することを証明できないという問題があります。そのため、その問題を解決するすべてのプログラムが定義によって不適切に記述されている(これは馬鹿げている)と言っているのでない限り、それはあなたの主張を裏付けます。
sepp2k

1
@Sam誰かが何らかのコードが停止するかどうか私に尋ねたら、コードを見て、それを理解しようとします。しかし、私はアルゴリズムではありません。もちろん、多くのプログラムでプログラムが停止するかどうかを確認できるアルゴリズムを作成することもできます。しかし、それはイットリルが言ったことではありません。Yttrillは、よく書かれたプログラムはすべて可能だと言いました。そして、以前のコメントで述べたように、特定の問題は不適切に書かれたプログラムでしか解決できないと主張しない限り、それは単純に偽です(これもばかげています)。
sepp2k

1
@Sam「意図的に停止するように書かれたプログラムは停止条件について簡単に分析できることは私には簡単に思えます」-その場合、なぜそのようなツールがないのでしょうか?人々が試みていないかのようではありません。(犯人の1つはメソッドのオーバーライドです。コンパイル時に、実行されるすべてのコードがわかりません。)
ラファエル

1
@Sam "無限ループが存在する"は、実際のループであっても、アプローチするのが難しいものです。もちろん、ループ不変条件を見つける方法を教えられましたが、それは、多くの場合、(簡単に)ループ不変条件を見つけることができるという意味ではありません。私の知る限りでは、推測と証明が最近の標準です。ここでも、そこにあればした合理一般的なアルゴリズムは、私は彼らが(メジャーコンパイルまたはのIDEに含まれることに期待しませんいくつかの些細な、構文チェックを実行します)。かなり強力なアルゴリズムへの参照を提供できますか?
ラファエル

3

優れた(疑わしいほど深い)質問。実際に、限られた入力セットで成功する停止検出プログラムがあります。その活発な研究分野。(自動化された)定理証明領域と非常に強い結びつきがあります。

ただし、コンピュータサイエンスには、「プログラム」を表す「正確な」用語が「時々」あるとは思えません。「アルゴリズム」という言葉は通常、常に停止するプログラムのために予約されています。

その概念は、CS理論家が、成功する確率が既知または計算可能であると主張する確率的アルゴリズムとは明らかに異なるようです。

時々使用されるセミアルゴリズムという用語がありますが、明らかに列挙可能または計算不可能なことの同義語です。

そのため、ここでは、それらをquasialgorithmsと呼びます。概念は決定可能と決定不能とは異なります。

AXBYXYXYBA

CSでは、この「準アルゴリズム階層」はこれまでのところほとんど非公式にしか研究されていないようです。

忙しいビーバーの研究[1]とPCP問題[2]に現れます。実際、PCPに対するDNAベースのコンピューティング攻撃は、準アルゴリズムと見なすことができます。[3] そして、定理証明[4]のようなすでに指摘された他の分野で見られます。

[1] ビジービーバーの問題に対する新しいミレニアム攻撃

[2] Zhao (v2?)による投稿の対応の問題への取り組み

[3] バインド後の対応の問題を解決するためにDNAを使用したカリら

[4] Cook et al、Comm。によるプログラム終了の証明。ACMの

(これは実際、defnがTCS.SE imhoに値する非常に深い質問です...おそらく誰かがそれが収まるようにそこに再質問することができます)


psは準アルゴリズムがどれほど強力であるかの印象的な例として、ACMはackermanns関数が準アルゴリズムによって停止することが証明できるが、それはすべての原始再帰関数よりも大きい(計算できない)ことを指摘しています。
vzn

1
「通常、「アルゴリズム」という言葉は、常に停止するプログラムのために予約されています。」-それが本当かどうかはわかりません。(特に検証で)部分的に終了するアルゴリズムがたくさんあり、「アルゴリズム」と言わない人は聞いたことがない。
ラファエル

「アルゴリズム」の非公式の使用があります。「部分的に終了」は問題ありませんが、prob nonstd。述べたように、まだ標準化された用語はないようです。ウィキペディアでは、アルゴリズム効果的な方法として定義しています。つまり、次の特性を備えた決定可能なものです。(2)常に正しい答えを出し、間違った答えを与えない。(3)無限数ではなく、常に有限数のステップで完了する。(4)クラスの問題のすべてのインスタンスに対して機能します。
vzn

そして、同じ記事の後半では、「「有効なメソッド」という用語のさらなる説明には、メソッドが有効なクラスの外部から問題が与えられたときに、メソッドが停止せずに停止または永久にループするという要件が含まれることがあります、ただし、それが問題の答えであるかのように結果を返してはいけません。」つまり、それはほとんど矛盾している!?!そのため、明らかに、驚くべきことに、主要な問題に関して何らかの本当の混乱があり、既存の用語は厳密ではありません。「アルゴリズム」という言葉は、千年以上前に近いものであり、大幅にシフトしていることに注意してください
。– vzn

それは本当です:ウィキペディアが言うように、伝統的な意味はおそらく「効果的な方法」です(あなたが引用する文に矛盾はありませんが、それは少し明確ではありません)-人々は終わらない機能/アルゴリズムを考えませんでしたいくつかの入力)。これは1950年代から変化していると思います。私が言ったように、今日、人々は明らかに部分的に終了するメソッドを「アルゴリズム」と呼んでいます。
ラファエル

2

問題のプログラミング言語が十分に複雑である限り(つまり、チューリング完全である場合)、言語には、終了することが証明できないプログラムが常に存在します。

最も原始的な言語を除くすべてがチューリング完全であるため(変数や条件のようなもののみを使用するため)、停止問題を解決できる非常に小さなおもちゃの言語のみを構築できます。

編集:コメントを踏まえて、より明確にしましょう。停止する問題を解決できるように設計する可能性のある言語は、チューリング不完全でなければなりません。これにより、適切な基本的な要素のセット(たとえば、「変数、条件、ジャンプ」、または@ sepp2kが言うように、汎用の「while」ループ)を含む言語はすべて除外されます。

どうやらそのような実用的な「単純な」言語がいくつか存在するようです(例えば、CoqやAgdaなどの定理ソルバー)。それらが「プログラミング言語」の概念を満たしている場合、それらが何らかの完全性を満たしているかどうか、または停止問題が解決可能かどうかを調査することができます。


3
「ほとんどの原始言語を除くすべての言語がチューリング完全であるため(変数や条件のようなもののみを使用します)」それは事実ではありません。まず第一に、少なくとも再帰または何らかの形のループ構造(whileループと同じくらい強力でなければなりません-単純なカウントループでは不十分です)が必要です。第二に、CoqやAgda(これらは完全であり、完全ではない)言語や原始言語やおもちゃの言語を呼び出す人は多くないと思います。
sepp2k

@ sepp2k:ええ、はい。ペアノ演算も非常に有用であり、チューリング完全ではありません。単純化されたステートメント、と思います。OPが問題に十分に精通している場合は、技術的な詳細を記入できることを願っています。

3
「十分に複雑」であることとチューリング完全であることの間には大きなギャップがあります。Coqは確かに複雑であり、非常に広範囲の実用的なタスクに適しています。

1
@Kerrek SBまあ、チューリング完全言語は、終了を証明できる方法で使用される可能性があります。再帰式が常に終了条件(階乗関数など)に近づくことを証明できる場合は、すべての種類の再帰を処理できない場合でも、それが終了することを証明できます。

@ArtB:もちろん、終了することが証明できるプログラムが常にいくつかあります。OPの最初の質問はそれを暗示しているかもしれませんが、私はそれを完全にフォローするかどうかはわかりません。プログラムが終了するの任意の家族が、逆にしながら、あなたがいる場合たとえば、あなたが決定し、「一般的なアルゴリズム」を持つことができなかった可能性があり、おそらく機能を仮定すると、その家族に属していることを、あなたはアルゴリズムそれかどうかを言うことができるような機能の制限された家族を構築します終了します。(しかし、その家族が自明でないかどうかは

2

TT

これは非常に簡単です。停止中のTMのceサブセットと非停止中のTMのceサブセットの和集合をとると、結果は停止の問題を決定できるTMのセットになります(最初のマシンがTMを受け入れる場合、両方のマシンを並行して実行します)停止します。2番目が受け入れた場合、マシンは停止しません)。しかし、これはあまり興味深い言語にはなりません。

ALogTimecM


1

はい、できますが、役に立つとは思いません。おそらくケース分析のためにそれを行う必要があり、それから最も明白なケースのみを探すことができるでしょう。たとえば、コードのファイルをgrepできますwhile(true){}。ファイルにそのコードがある場合、ファイルは終了しません^。より一般的には、ループや再帰のないプログラムは常に終了すると言うことができ、プログラムが終了するかしないことを保証できるいくつかのケースがありますが、中規模のプログラムでもこれは非常に困難であり、多くの場合、答えを出すことはできません。

tl; dr:はい。ただし、ほとんどの便利なプログラムで使用できるようにすることはできません。


^はい、技術的には、そのコードがコードパス上にない場合、またはまだ終了する可能性のある他のスレッドがある場合、ここで一般的なポイントを示しています。


4
CoqとAgdaが役に立たないと思うのはなぜですか?チューリング完全性の価値を過大評価しています。

Coqを使用しましたが、ほとんどの商用ソフトウェアはJava / C ++ / Ruby / C#で記述されているため、私の主張は真実です。90%の人々が執筆に興味を持っているプログラムの種類は利益をもたらさないでしょう。基本的に、Coq / Agdaなどを知らない場合、それはターゲット市場ではありません。

5
現実世界のプログラムの99%は、チューリング完全ではない言語のサブセットで実装されることで恩恵を受けると思います。たとえば、アッカーマン関数を毎日実装することはありません。CRUDの100%は「実際の」言語を必要としません。データ処理はほとんどの場合簡単です。ターミネータープロジェクトを参照してください-彼らは可能なC ++プログラムのまともなサブセットも提供しています。これは、現実世界のもの(ドライバーや他の低レベルコードを含む)には十分すぎるほどです。

ほとんどの現実世界のプロジェクトは、チューリング完全言語で記述されたライブラリを再利用し、IDE、デバッガ、およびチュートリアルを使用したいと考えています。はい、非チューリング言語で物事を成し遂げることはできますが、実際に「Xをやりたい」と答え、「Coqを使用」と答える人は想像できません。ps- The Terminator Projectを紹介してくれてありがとう。

4
想像を絶するほど大きな割合のビジネスロジックが、チューリング完全でないSQLに既に実装されています。そして、DSLとeDSLは現在増加しています。そのため、ほとんどのビジネスアプリプログラマーは、すべての「汎用」言語を忘れます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.