チューリング完全にする言語機能/構造の最小セットは何ですか?
A Turing tarpit は、使用する要素をできるだけ少なくしながら、チューリング完全であるように努力する一種の難解なプログラミング言語です。 Brainfuck はおそらく最もよく知られているターピットですが、たくさんあります。
Iota と Jot は、それぞれ SK(I)コンビネーター計算 に基づいた2つと3つのシンボルを持つ関数型言語です。
[〜#〜] oisc [〜#〜] ( One Instruction Set Computer )は、1つ以上の引数の1つの命令のみを必要とする、通常は「ゼロ以下の場合は減算して分岐する」、または「借りる場合は逆減算してスキップする」。 x86 MM は前の命令を実装するため、チューリング完全です。
一般に、命令型言語がチューリング完全であるためには、以下が必要です。
条件付き反復または条件付きジャンプの形式(例:while
、if
+ goto
)
ある形式のストレージ(変数、テープなど)を読み書きする方法
lambda-calculus –ベースの関数型言語をTCにするには、以下が必要です。
引数に対して関数を抽象化する機能(ラムダ抽象化、引用など)
引数に関数を適用する機能(例:リダクション)
もちろん他の計算方法もありますが、これらはチューリングターピットの一般的なモデルです。実際のコンピューターはではないユニバーサルチューリングマシン であることに注意してください。厳密に言えば、それらは「境界付きストレージマシン」です。それらにメモリを追加し続けると、チューリングマシンに漸近的に近づきます。ただし、境界のあるストレージマシンや 有限状態マシン も計算に役立ちます。それらは単にuniversalではありません。
厳密に言うと、チューリング完全性のためにI/Oは必要ありません。 TCは、言語が必要な関数をcomputeできるshow結果。実際には、すべての有用な言語には、なんとかして世界と対話する方法があります。
より実用的な観点から:もしチューリング完全な言語のすべてのプログラムをあなたの言語に翻訳できるなら、そのとき(私の知る限り)、あなたの言語はチューリング完全でなければなりません。したがって、設計した言語がチューリング完全であるかどうかを確認したい場合は、Brainf ***をYourLanguageコンパイラーに書き込み、すべての正当なBFプログラムをコンパイルできることを証明/実証できます。
明確に言うと、YourLanguageのインタープリターに加えて、任意のBFプログラムをYourLanguageにコンパイルできるコンパイラー(任意の言語で)を作成します(もちろん、同じセマンティクスを維持します)。
システムは、万能のチューリングマシンで実行できることをすべて実行できる場合にのみ、チューリング完了であると見なされます。ユニバーサルチューリングマシンは、与えられた時間で計算可能な関数を解くことができると言われているので、チューリングコンプリートシステムは、ひいてはそうすることができます。
チューリングが完了しているかどうかを確認するには、その中にチューリングマシンを実装できるかどうかを確認します。つまり、以下をシミュレートできるかどうかを確認します。
これらは、チューリング完了と見なされるシステムの真の最小要件です。それ以上でもそれ以下でもありません。これらを何らかの方法でシミュレートできない場合、チューリングは完全ではありません。他の人々が提案した方法は、それらの機能を持たないいくつかのチューリング完全なシステムがあるので、最後まで手段にすぎません。
真のチューリング完全なシステムを実際に構築する方法は知られていないことに注意してください。これは、物理的な空間内でチューリングマシンのテープの無限を真にシミュレートする既知の方法がないためです。
必要な条件の1つは、反復の前に決定されない最大反復カウントのループ、または最大再帰の深さが前もって決定されない再帰です。例として、多くの新しい言語で見つけたfor ... in ...ループはnotで言語を完全なものにするのに十分です(ただし、他の方法があります)。これは、反復回数や再帰深度が制限されていることを意味するのではなく、最大反復回数と再帰深度を事前に計算する必要があることに注意してください。
たとえば、アッカーマン関数は、これらの機能がない言語では計算できません。一方で、これらの機能を必要とせずに、非常に複雑で非常に有用なソフトウェアをたくさん書くことができます。
一方、すべての反復回数とすべての再帰の深さが先に計算されると、プログラムが停止するかどうかを決定できるだけでなく、will停止することもできます。
プログラミング言語を使って計算を行うことができれば、プログラミング言語は完全に整っています。言語を完全なものにする機能のセットが1つだけではないため、ループが必要か、変数が必要であると答えると、- どちらもない であるが完全に成熟している言語があるため、答えは間違っています。
Alan Turingがユニバーサルチューリングマシンを作成しました。ユニバーサルマシンで動作するように設計されたプログラムを翻訳して言語で実行できるようになれば、チューリングも完成します。これは間接的にも機能するので、すべての汎用チューリングマシンプログラムをYプログラムに変換できるため、完全な言語YをチューリングするためのすべてのプログラムをXに翻訳できる場合、言語Xは完全にチューリングしています。
時間の複雑さ、スペースの複雑さ、入出力形式の簡単さ、プログラムの作成のしやすさは方程式に含まれていません。したがって、そのようなマシンは、計算が電力損失や太陽に飲み込まれた地球によって停止されない限り、理論的にすべての計算を実行できます。
通常、完全なチューリングを証明するために、完全な言語をチューリングしていることが証明されたもののインタープリターを作成しますが、それが機能するためには、言語が完全にチューリングするために実際には必要とされない、入力と出力の手段が必要です。プログラムが起動時の状態を変更でき、プログラムが停止した後でメモリを検査できるので十分です。
言語を成功させるには、完全性を調整する以上のことが必要ですが、これはターピットを調整する場合にも当てはまります。 BrainFuck は,
と.
がなければ人気があったとは思いません。
無限にループするか停止するかはわかりません。
説明:何らかの入力が与えられた場合、それが実行されることによって以外は無限ループするか、または最終的に停止するかどうかを(別のTuringマシンを使用して)すべての場合に判断することは不可能ですループする場合!).
これは、潜在的に無制限の量のデータを何らかの方法で保存できる必要があることを意味します-どんなに複雑であっても、無限テープと同等のものでなければなりません! (そうでない場合、状態の数は有限であり、その状態を以前に経験したことがあるかどうかを確認して、最終的に停止することができます)。一般に、チューリングマシンは、いくつかの制御可能な手段によって状態のサイズを拡大または縮小できます。
チューリングのオリジナルのユニバーサルチューリングマシンには解決できない停止問題があるため、独自のチューリングコンプリートマシンにも解決できない停止問題がなければなりません。
チューリングコンプリートシステムは他のチューリングコンプリートシステムをエミュレートできるため、システム内でよく知られたチューリングコンプリートシステムのエミュレータを構築できれば、システムもチューリングコンプリートであることを証明できます。
たとえば、無限に繰り返されるグリッドパターン(上と左側に異なるバージョンがある)のボードが与えられた場合、Snakes&Laddersがチューリング完全であることを証明したいとします。 2カウンターのミンスキーマシンがチューリング完全であること(2つの無制限カウンターと有限数のうち1つの状態)がわかっているので、グリッド上のXとYの位置が2つのカウンターの現在の値である同等のボードを構築できます。現在のパスは現在の状態です。バン!ヘビとはしごが完全なチューリングであることを証明しました。