プログラミング言語がチューリング完全であるための最低限の基準はありますか?


55

プログラミング言語をチューリング完全と見なすために、プログラミング言語にプログラミング言語構成体のセットが存在しますか?

wikipediaから言えることから、言語は再帰をサポートする必要があります。または、一見、停止せずに実行できる必要があります。これですべてですか?


6
おそらくあなたの質問は、「プログラミング構成要素の最小限のセットはありますか...」と尋ねるべきです。なぜなら、答えは「すべての計算可能なもの」だからです。
デイブクラーク


@DaveClarke、ありがとう、更新しました。私の言語が貧弱だからだと思いますが、あなたのコメントはいくらか質問にうんざりしていると思います。言語が計算できる場合、それは同等のチューリングであるいくつかの操作があるかどうかを尋ねることを意味しました。
ハンザー

回答:


45

しかし、再帰関数がそれを釘付けにしました。以下は、計算可能な関数のセット全体を定義するものです。これは、respを含む関数の最小セットです。次に対して閉鎖:μ

  1. 定数関数0
  2. 後継機能
  3. パラメータの選択
  4. 機能構成
  5. 原始再帰
  6. 演算子は(最小探しなど...その)μバツ

詳細については上記のリンクを確認してください。非常にコンパクトなプログラミング言語になります。プログラムするのも恐ろしいです-無料のランチはありません。それらのどれかを落とすと、あなたは完全な力を失うので、それは公理の最小限のセットです。

これらは文字通り、WHILEプログラムの基本的な構文要素に変換できます。

  1. 定数 0
  2. 増分 _ + 1
  3. 変数アクセス x
  4. プログラム/ステートメントの連結 _; _
  5. カウントダウンループ for ( x to 0 ) do _ end
  6. whileループ while ( x != 0 ) do _ end

1
言語の5番目のルールを削除できないことは明らかだと思います。while6 のループは定数ゼロと比較されるため、変数はルール2によってのみインクリメントでき、開始する負の定数はありません(ルール1)、while6 のループは入力されない(x = 0)か無限です( x> 0、およびループ本体はそれを減らすことができません)。
–MSalters

1
@MSaltersあなたは正しいと思います。私が念頭に置いていたと思われるシミュレーションのために、私たちは必要であり_ - 1、それなしでそれを実装する方法を考えることができませんfor。キャッチしてくれてありがとう!(「より良い」とは何ですか- _ - 1または、forうーん。)
ラファエル

20

チューリング完全と見なされるためには、プログラミング言語で実行可能である必要がある一連の計算がありますか?

はい、チューリング完全と見なされるには、プログラミング言語がチューリングマシンで実行できる計算を実行できる必要があります。したがって、最小限の要件として、ユニバーサルチューリングマシン(または他のチューリング完全言語のインタープリター)を実装できる必要があります。

ウィキペディアから言えることから、言語は再帰をサポートする必要があります。または、一見、停止せずに実行できる必要があります。これで終わりです。

いいえ。たとえば、許可されている操作が再帰のみである言語(つまり、記述できる唯一の関数はf(x) = f(x)である場合、チューリング完全ではありません。記述できるのは終了しないプログラムのみです。前述のとおり、チューリング完全言語チューリングマシンで実行できるあらゆる計算を実装できる必要があります。

また、言語は、あなたが考えている方法で再帰をサポートする必要はありません。ループを表現する無制限の方法です。それは再帰かもしれませんが、while-loopまたはgotoかもしれません。関数をまったく持たない言語でも、チューリング完全にできます。また、ループまたは再帰関数は十分な条件ではありません。条件に応じて異なるコードを実行する方法と、古い値から新しい値を計算する方法が必要です(そうしないと、すべてのループ/再帰が無限になるか、まったく実行されません)。


これらの操作をサポートする言語はチューリング完全であり、そうでない言語はそうではないなど、必要かつ十分な操作の最小限のセットがあるかどうかについて:いいえ、ありません(「操作」を漠然と定義しない限り) 、それが無意味になること):

たとえば、すでに述べたように、再帰関数(または関数)をサポートしないチューリング完全言語があります。gotoステートメントまたはwhileループ(および任意の量のデータを格納する方法)がある場合、これらはチューリング完全になります。ただし、再帰関数を持つ言語は、チューリング完全である必要はありませwhilegoto。したがってgoto、必要な十分な操作のセットには含まれませんが、を削除するとチューリング完全ではなくなる言語がありますgoto。したがって、そのようなセットはありません。


私が確信していない唯一の部分は、必要な最小限の操作に対するあなたの答えです。操作の定義を制御構造に制限しているように見えますが、これは要求よりもはるかに狭い範囲であるように思われ、「あいまいに、意味がない」ように定義しないという独自の要件を超えています。
ジョシュアドレイク

@JoshuaDrakeどういう意味かわかりません。操作を制御構造に限定していません。反例では、制御構造ではない操作については話さないのは、それらが例に関連していないからです。実際、「任意の量のデータを保存する方法」について言及していますが、これはほとんど制御構造ではありません。
sepp2k

一部の言語はチューリングの完全性をサポートしていますが、一部の言語はサポートgotoしていないと主張し、一部の言語gotoはチューリングの完全性に必要な一連の操作の一部には使用できないと主張しているようです。私のポイントはgoto、ジャンプなどの特定のより一般的な操作を実装する構文上の方法にすぎないということです。したがって、特定の制御構造から単純に抽象化した場合、少なくともチューリング完全性を指す操作のセットに近づくと思います。
ジョシュアドレイク

@JoshuaDrake gotoの代わりに "jump"を使用すると、十分で必要な一連の操作を定義できるようになるとは思わない。おそらく、すべての言語で何らかのジャンプ操作が必要になることは事実です(関数呼び出しのみの場合)が、それを十分にするためにさらに操作を考え出すことはできないと思います。たとえば、ラムダ計算には2つの操作があります。アプリケーション(つまり、ジャンプ操作)と抽象化(つまり、関数の作成)
...-sepp2k

1
@JoshuaDrakeこの記事では、チューリング完全言語にはこれらの操作が必要だと主張しているとは思わない。特に、そのステートメントを手続き型言語に特に制限しているためです。gotoの形式(つまり、関数アプリケーション)を除き、Lambda Calculusにはこれらの機能はありません。ここでの「最小」とは、これらの機能のみを備えた言語では、チューリングの完全性を失わずにそれらのいずれも削除できないことを意味すると思います。チューリングの完全性にも十分な他の最小限の操作セットがないということではありません。
sepp2k

14

チューリング完全言語につながるさまざまな単一の命令があります。典型的な例は、「ゼロの場合は減算および分岐」です。これらは、アセンブリ言語プログラミングのコンテキストでよく知られています。詳細については、Wikipediaの記事を参照してください。

これは特性化につながります。整数をフェッチしてメモリに格納し、「ゼロの場合は減算および分岐」操作を実行する操作をシミュレートできる場合にのみ、言語はチューリング完全です。


13

これはあなたの質問に対する一般的な答えではありませんが、構造化プログラミングの定理により、必要なのは選択(たとえば、ifC / C ++)と繰り返し(たとえば、whileC / C ++)を行う能力だけです。編集:Dave Clarkeがコメントで指摘したように、構造化プログラミングの定理にも順序が必要です。私は最初にこれをリストしませんでした。なぜなら、読者がメモリストアからの読み取りやメモリストアへの書き込みなどのために後で言及されたような他の命令の基本ブロックも必要だと理解していたからです。もちろん、明示的にする方が良いです。これらのこともできる必要があります。

これらは両方とも条件付きジャンプ命令(JNZx86など)を使用して実装できるため、チューリング等価性にも十分です。

他のことが必要であることに注意してください。つまり、ある数のシンボル(たとえばビット... 0または1)をある種の外部メモリストアに書き込む機能です。その意味では、実際のコンピューターはチューリングと同等ではありません。なぜなら、どれも無限のストレージを持っているからです。ただし、メモリの量は通常膨大であり、実際のコンピューターが解決できる問題は決定論的な有限オートマトンで解決できる場合でも、チューリングモデルは依然として有用です。州の数はとてつもなく巨大になるでしょう)。

これは必ずしもsepp2kの答えと矛盾するわけではないことに注意してください。これは、同じ質問について考えるための単なる別の方法です。

編集:

注また、あなたが本当に両方を必要としないことif、およびwhileC / C ++インチ 次ifを使用whileしてシミュレートできます。

bool C;
// some code that sets C
if(C) { /* some other code /* }
// rest of the program

次のコードは常に同等です。

bool C;
// some code that sets C
bool C2 = C;
while(C2) { /* some other code /* C2 = false; }
// rest of the program

まあ...あなたが注意していれば、建設は機能し、可能であるはずです、それはそうです。また、再帰関数がある場合は、最終的に選択も必要になることに注意してください。選択のない再帰関数は基本ケースを実際に実装できないため、再帰関数は無限再帰になります。

編集:

また、停止しないプログラムを作成する能力がチューリングの等価性に十分であるかどうかに関するあなたの質問に関しては、答えはノーです。必要ですが、十分ではありません。停止に失敗したプログラムを表現できない言語で記述されたプログラムの停止問題を解決できます。答えは、すべてのインスタンスで「プログラムは停止します」です。しかし、唯一の命令がマシンに無限ループに入るような言語を定義することができます...そのような言語はチューリングと同等ではありません。


13

コンビネータおよびここで、およびは、任意の(閉じた)ラムダ項、したがって計算可能な関数を表現するのに十分です。詳細については、このウィキペディアのページをご覧ください。KS x y z = x z y z K x y = xSKS バツ y z=バツ z y zK バツ y=バツ

実際、ラムダ項は、すべてのラムダ項を表現するのに十分な基礎です。同じウィキペディアのページの後半を参照してくださいバツ=λバツバツ S K


5

言語構成要素は交換可能です

プログラミング言語によってネイティブに提供される必要のあるコンストラクトに関する設定された最小基準はありません。チューリング完全なシステムを表現するために何らかの形で複雑になる可能性のある奇妙なコンストラクトを提供する場合、明らかに、それらのコンストラクトは他のコンストラクトと同じくらい適切です。

これを証明するために、「ゼロの場合は減算および分岐」操作のみを提供する言語はチューリング完全です。個別の「ゼロの場合は減算と分岐」構文を提供しないチューリング完全言語が存在します。そのため、必須の構文または構文のセットはありません。

TP完全言語の構造の効果は、他のTP完全言語の構造によってエミュレートできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.