使用されるほぼすべてのプログラミング言語は チューリング完全 であり、これにより言語は任意の 計算可能 アルゴリズムを表すことができますが、独自の 問題 のセットも付属しています。 =。私が書いたすべてのアルゴリズムは停止することを意図しているので、停止することを保証する言語でそれらを表現できるようにしたいと思います。
正規表現 文字列の照合に使用され、 有限状態マシン は 字句解析 の場合に使用されますが、より一般的で広義の言語があるかどうか疑問に思います。チューリング完全ではありませんか?
編集:明確にする必要があります。「一般的な目的」によって、必ずしもすべての停止アルゴリズムを言語で記述できるようにする必要はありません(そのような言語が存在すると思います)が、すべてのアルゴリズムが停止することが保証されている言語を生成するために一般化できる証明の停止には共通のスレッドがあると思います。
この問題に取り組む別の方法もあります-理論的に無限のメモリの必要性を排除します。マシンが許可されるメモリの量を制限すると、マシンが存在する状態の数は有限で数えられるため、アルゴリズムが停止するかどうかを判断できます(マシンが以前の状態に移行しないようにすることで) )。
否定論者の言うことを聞かないでください。終了を保証したり、ランタイムエラーの可能性を排除するなどしてコードを単純化したい場合は、一部のコンテキストで非チューリング完全言語を好む理由が非常にあります。時には、物事を無視するだけでは不十分な場合があります。
論文 Total Functional Programming は、コンパイラの保証が非常に強力であるため、実際にはほとんどの場合、そのような制限された言語を好むべきであると多かれ少なかれ説得力を持って主張しています。プログラムが停止したことを証明できること自体が重要な場合がありますが、実際には、これは、単純な言語が提供するはるかに簡単な推論の結果です。さまざまな機能を持つ言語の階層の1つのコンポーネントとして、非普遍的な言語の有用性の範囲は非常に広いです。
この階層化の概念にさらに完全に対処する別のシステムは ヒューム です。 ヒュームレポート は、システムとその5つの層の、徐々に完全で安全性の低い言語の完全な説明を提供します。
そして最後に、忘れないでください チャリティー 。これは少し抽象的ですが、圏論の概念に直接基づいている、有用ではあるが普遍的ではないプログラミング言語への非常に興味深いアプローチでもあります。
BlooP ([〜#〜] b [〜#〜]oundedの略) loop)は、興味深い非チューリング完全言語です。これは本質的にチューリング完全言語ですが、1つの(主要な)警告があります。すべてのループmustには反復回数の制限が含まれています。無限ループは許可されていません。その結果、BlooPプログラムの停止問題を解決することができます。
問題はチューリングマシンではなく、「アルゴリズム」にあります。アルゴリズムが停止するかどうかを予測できない理由は、次の理由によるものです。
function confusion()
{
if( halts( confusion ) )
{
while True:
no-op
}
else
return;
}
再帰やループを実行できない言語は、実際には「汎用」ではありません。
正規表現と有限状態マシンは同じものです!字句解析と文字列照合は同じものです! FSMが停止する理由は、FSMがループしないためです。入力をcharごとに渡して終了するだけです。
編集:
多くのアルゴリズムでは、それらが停止するかどうかは明らかです。
例えば:
function nonhalting()
{
while 1:
no-op
}
この機能は明らかに停止することはありません。
そして、この関数は明らかに停止します:
function simple_halting_function()
{
return 1;
}
つまり、最終的には、アルゴリズムが停止することを保証できます。停止するように設計するだけです。
アルゴリズムが常に停止するかどうかわからない場合。その場合、「停止」を保証する言語で実装することはおそらく不可能です。
チューリング完全になるのはかなり簡単であることがわかります。たとえば、必要なのは8つの命令ala BrainF ** k だけであり、実際に必要なのは 1つの命令 だけです。
これらの言語の中心はループ構造であり、無制限のループがあるとすぐに、固有の停止問題が発生します。ループはいつ終了しますか?無制限のループをサポートする非チューリング完全言語でも、 might は practice で停止問題を抱えています。
すべてのプログラムを終了させたい場合は、コードを注意深く書く必要があります。特定の言語はあなたの好みやスタイルに合っているかもしれませんが、どの言語でも結果のプログラムが停止することを絶対に保証できるとは思いません。
これを行う正しい方法であるIMHOは、チューリング完全な言語を使用することですが、プルーフチェッカーによる処理に適したセマンティクスを記述するためのシステムを提供することです。
次に、意図的に終了プログラムを作成していると仮定すると、なぜそれが停止するのかについての良い議論が頭に浮かびます。この新しい種類の言語を使用すると、その議論を表現し、証明できるはずです。
私のプロダクションコンパイラの脇として、私は確かに特定の入力で停止しないことを知っている再帰を持っています..私はこれを止めるために厄介なハックを使用します:「賢明な」制限のあるカウンター。参考までに、実際のコードはポリモーフィックコードの単形化に関係しており、ポリモーフィック再帰を使用すると無限展開が発生します。 Haskellはこれをキャッチしますが、Felix用のコンパイラはキャッチしません(これは、修正方法がわからないコンパイラのバグです)。
私の一般的な議論に続いて..私は、述べられた目的にどのような種類の注釈が適しているかを知りたいと思います:私は言語とコンパイラを制御できるので、正確に何をすべきかを知っていれば、そのようなサポートを簡単に追加できますadd :)この目的のために、ループに「invariant」および「variant」句が追加されているのを見てきましたが、言語がその情報を終了の証明に使用するように拡張されたとは思いません(むしろ、で不変条件とバリアントをチェックしました私が正しく覚えていれば実行時間)。
多分それは別の質問に値する..
「理論的に無限のメモリの必要性を排除します。」 - まあ、そうだろう。物理的なコンピューターは、宇宙のエントロピーによって制限され、それ以前でも、光の速度(==情報が伝播できる最大速度)によって制限されます。
さらに簡単に、物理的に実現可能なコンピューターでは、リソースの消費を監視し、それに制限を加えるだけです。 (つまり、メモリまたは時間の消費がMY_LIMITを超える場合は、プロセスを強制終了します)。
あなたが求めているのが純粋に数学的/理論的な解決策である場合、「一般的な目的」をどのように定義しますか?