チューリング完全性とは、1つのことと1つのことだけです。チューリングマシンでモデル化できる計算もそのモデルでモデル化できる場合、計算モデルはチューリング完全です。
それでは、Turing Machineがモデル化できる計算は何ですか?まあ、何よりもまず、Alan Turingと彼の同僚全員は、自然数の関数にしか興味がありませんでした。したがって、チューリングマシン(およびλ計算、SKコンビネーター計算、μ再帰関数など)は、自然数の関数の計算可能性についてのみ話します。自然数の関数について話していない場合、チューリング完全性の概念は意味をなさず、単に適用できません。
ただし、多くの興味深いものを自然数としてエンコードできることに注意してください。文字列を自然数としてエンコードでき、グラフを自然数としてエンコードでき、ブール値を自然数としてエンコードできます。チューリングマシンを自然数としてエンコードできるため、チューリングマシンについて話すチューリングマシンを作成できます。
そして、もちろん、自然数のすべての関数が計算可能というわけではありません。Aチューリングマシンでのみ計算することができ、いくつかの自然数の機能を、λ計算のみ計算することができ、いくつかの自然数の機能を、SKコンビネータ結石のみを計算することができ、いくつかの自然数上の関数を、...。驚くべきことに(あるいはそうではない)、すべての計算モデル(実際に物理的宇宙で実際に実現可能)は、自然数に対して同じ関数を計算できることがわかりました(少なくとも今まで見つかったすべてのモデルについて)。[注:明らかに、計算の弱いモデルがありますが、より強力なモデルはまだ見つかりません、実数やタイムトラベルを使用したモデルなど、物理的宇宙と明らかに互換性のないものを除きます。]
この事実は、多くの異なるモデルを長期間検索した後、毎回、まったく同じ関数を計算できることを発見したという事実が、教会チューリング論文の基礎になっています。計算モデルは同様に強力であり、それらのすべてが「計算可能」であるという意味の「理想的な」概念をキャプチャします。(CTTの2番目の、より哲学的な側面もあります。つまり、アルゴリズムに従う人間は、TMが計算できるのとまったく同じ関数を計算することもできます。)
ただし、これについては何も言われていません
- さまざまなモデルの効率
- 彼らはどのくらい便利ですか
- どのような他の彼らが行うことができます以外の自然数の計算機能
そして、それこそが、異なる計算モデル(およびプログラミング言語)の違いが関係するところです。
異なるパフォーマンスの例として、ランダムアクセスマシンとチューリングマシンの両方がアレイをコピーできます。しかし、RAM はそれを行うために操作を必要としますが、TMは各要素をコピーするために要素をスキップする必要があるため、操作を必要とします、コピーする要素があります。O (ねI Z 、E 2 、A 、R 、R 、Y)、S 、I 、Z 、E 、A 、R 、R 、Y、S 、I 、Z 、E 、A 、R 、R 、YO(sizearray)O(size2array)sizearraysizearray
異なる利便性の例として、非常に高レベルの言語で記述されたコード、アセンブリで記述されたコード、および同じ問題を解決するためのTMの説明を比較することができます。
また、ライトスイッチは3番目の種類の違いの例です。一部のモデルで実行できることは、自然数では機能しないため、チューリング完全性とは関係ありません。
特定の質問に答えるには:
しかし、チューリング完全言語で書かれたプログラムを別のプログラムで書き直すことはできますか?
いいえ。プログラムが自然数でチューリング計算可能な関数を計算する場合のみ。その場合でも、複雑なエンコードが必要になる場合があります。たとえば、λ計算には自然数すらありません。関数を使用してエンコードする必要があります(関数だけがλ計算にあるため)。
この入力と出力のエンコードは、アルゴリズムを表現できるように非常に複雑になる可能性があります。したがって、どのプログラムも書き換え可能であることは事実ですが、書き換えられたプログラムは、はるかに複雑で、はるかに大きく、より多くのメモリを使用し、はるかに遅くなる可能性があります。
アセンブリにLIGHTBUTTONオペコードがある場合はどうなりますか?私は物理的に電球のないシステム(言語)でその言語をエミュレートすることはできません。
電球は、自然数に対するチューリング計算可能な関数ではありません。実際、電球は関数でも計算でもありません。電球のオンとオフの切り替えは、I / Oの副作用です。チューリングマシンはI / Oの副作用をモデル化せず、チューリング完了はそれらに関連しません。
任意の実数上。
チューリング完全性は、自然数の計算可能な関数のみを扱い、実数には関係しません。
チューリング完全性は、次の2つの理由から、あなたのような質問になると、それほど興味深いものではありません。
- それは非常に高いハードルではありません。あなたがされる必要があるすべて
IF
、GOTO
、WHILE
、および単一の整数の変数(変数を想定したが、任意の大きな整数値を保持することができます)。または、再帰。たくさん、たくさんの物がチューリング完全です。カードゲームMagic:The Gatheringはチューリング完全です。CSS3はチューリング完全です。sendmail
設定ファイルはチューリング完全です。Intel x86 MMUはチューリング完全です。Intel x86 MOV
命令はチューリング完全です。PowerPointアニメーションはチューリング完全です。Excel(スクリプトなし、数式のみを使用)はチューリング完全です。BGPルーティングプロトコルはチューリング完全です。sed
チューリング完全です。Apache mod_rewrite
ルールはチューリング完全です。「(偶然または驚くべきことに)チューリング完了のためのGoogle「他の興味深い例を見つけるために。ほとんどすべてがチューリング完全である場合、チューリング完全であることは興味深い特性ではなくなります。
- 実際に有用である必要はありません。多くの有用なものはチューリング完全ではありません。バージョン3より前のCSSはチューリング完全ではありません(CSS3 が実際に使用されているわけではありません)。1999年以前のSQLはチューリング完全ではありませんでしたが、それでも非常に便利でした。追加ライブラリのない Cプログラミング言語は、チューリング完全ではないようです。依存型の言語は、定義により多かれ少なかれチューリング完全ではありませんが、オペレーティングシステム、Webサーバー、およびゲームをそれらで記述することができます。
イドリスの著者であるエドウィン・ブレイディは、「テトリス完全」という用語を使用して、これらの側面のいくつかについて話しています。テトリス完全であることは厳密には定義されていません(明白な「テトリスの実装に使用できる」以外)が、非常に高レベルで表現力があり、非常識にならずにゲームを書くことができるようなものが含まれます。外部の世界(入力および出力)と対話し、副作用を表現でき、イベントループを記述でき、リアクティブ、非同期、および並行プログラミングを表現でき、オペレーティングシステムと対話でき、外部ライブラリと対話する(言い換えると、Cコードで呼び出して呼び出すことができる)など。これらは、チューリング完全性よりも汎用プログラミング言語のはるかに興味深い機能です。
あなたがリンクした質問に対する私の答えは面白いかもしれません。それは、異なる質問に答えても同じポイントのいくつかに触れます。