チューリング完全にする言語機能/構造の最小セットは何ですか?
チューリング完全にする言語機能/構造の最小セットは何ですか?
回答:
チューリングターピットは、できるだけ少数の要素を使用しながら、チューリング完全であることを目指してい難解なプログラミング言語の一種です。Brainfuckはおそらく最も有名なターピットですが、たくさんあります。
IotaとJotは、それぞれSK(I)コンビネーター計算に基づいた2つと3つのシンボルを持つ関数型言語です。
OISC(One Instruction Set Computer)は、通常「ゼロ以下の場合は減算および分岐」、または「借入の場合は逆減算およびスキップ」という1つ以上の引数の1つの命令のみを必要とする命令型計算のタイプを示します。x86 MMUは前者の命令を実装しているため、チューリング完全です。
一般に、命令型言語がチューリング完全であるためには、次のものが必要です。
条件付きの繰り返しや条件ジャンプの形(例えば、while
、if
+ goto
)
何らかの形式のストレージ(変数、テープなど)を読み書きする方法
ラムダ計算は TCをする関数型言語をベースに、必要があります。
引数を介して関数を抽象化する機能(ラムダ抽象化、引用など)
引数に関数を適用する機能(例、リダクション)
もちろん、他の計算の見方もありますが、これらはチューリングターピットの一般的なモデルです。実際のコンピューターは、無制限のストレージがないため、汎用のチューリングマシンではない ことに注意してください。厳密に言えば、それらは「境界のあるストレージマシン」です。メモリを追加し続けると、それらは漸近的にチューリングマシンに近づきます。ただし、境界のあるストレージマシンや有限状態マシンも計算には役立ちます。それらは単に普遍的ではありません。
厳密に言えば、チューリング完全性のためにI / Oは必要ありません。TCは、言語が目的の関数を計算できることのみを主張し、結果を表示できると主張するのではありません。実際には、すべての有用な言語には、何らかの形で世界と対話する方法があります。
より実用的な観点から:チューリング完全言語のすべてのプログラムを自分の言語に翻訳できる場合、(私の知る限り)チューリング完全でなければなりません。したがって、設計した言語がチューリング完全であるかどうかを確認する場合は、Brainf ***をYourLanguageコンパイラに書き込むだけで、すべての正当なBFプログラムをコンパイルできることを証明/実証できます。
明確にするために、YourLanguageのインタープリターに加えて、BFプログラムをYourLanguageにコンパイルできるコンパイラー(任意の言語)を作成します(もちろん、同じセマンティクスを維持します)。
</sarcasm>
システムは、万能チューリング機械ができることを何でもできる場合にのみ、チューリング完全と見なすことができます。普遍的なチューリング機械は、時間を与えられると計算可能な機能を解くことができると言われているので、チューリング完全なシステムは、拡張により、そうすることもできます。
チューリングが完全かどうかを確認するには、その中にチューリングマシンを実装できるかどうかを確認します。つまり、次をシミュレートできるかどうかを確認します。
これらは、チューリング完全と見なされるシステムの真の最小要件です。これ以上でもそれ以下でもありません。何らかの方法でこれらのいずれもシミュレートできない場合、チューリングは完了していません。他の人が提案した方法は、これらの機能を持たないチューリング完全システムがいくつかあるため、あくまでも手段です。
真のチューリング完全システムを実際に構築する既知の方法はないことに注意してください。これは、物理空間内でチューリングマシンのテープの無限性を真にシミュレートする既知の方法がないためです。
プログラミング言語を使用して計算を行うことができれば、プログラミング言語は完全なものになります。言語チューリングを完全にする機能のセットは1つだけではないので、ループが必要である、または変数が必要であるという答えは、チューリングが完全ではない言語があるため間違っています。
Alan Turingはユニバーサルチューリングマシンを作成しました。ユニバーサルマシンで動作するように設計されたプログラムを翻訳して、言語で実行できる場合は、チューリングも完了します。これは間接的にも機能するため、すべての汎用チューリングマシンプログラムをYプログラムに翻訳できるため、完全な言語YをチューリングするためのすべてのプログラムをXに翻訳できる場合、言語Xはチューリングが完了していると言えます。
時間の複雑さ、スペースの複雑さ、入力/出力形式の容易さ、プログラムの記述の容易さは方程式に含まれていないため、計算が電力損失または太陽に飲み込まれることによって停止しない場合、そのようなマシンは理論的にすべての計算を行うことができます。
通常、チューリングの完全性を証明するために、彼らは完全な言語をチューリングしていることが証明されているすべてのインタープリターを作成しますが、それを機能させるには、入力と出力の手段が必要です。プログラムが起動時に状態を変更し、プログラムが停止した後にメモリを検査できることで十分です。
しかし、成功する言語を作るには、完全性をチューリングする以上のものが必要です。これは、ターピットをチューリングする場合にも当てはまります。私は考えていないBrainFuckはせずに人気があったであろう,
と.
。
無限ループするか停止するかはわかりません。
説明:何らかの入力が与えられた場合、(別のチューリングマシンを使用して)あらゆる場合に、物が無限にループするか、最終的に停止するかを伝えることは不可能です。ループする場合!)。
これは、潜在的に無制限の量のデータを何らかの方法で保存できる必要があることを意味します-どんなに複雑でも、無限のテープに相当するものが必要です!(それ以外の場合、状態の数は有限であり、その状態を以前に経て、最終的に停止したかどうかを確認できます)。一般に、チューリングマシンは、何らかの制御可能な手段によって状態のサイズを拡大または縮小できます。
チューリングの元の汎用チューリングマシンには解決できない停止の問題があるため、独自のチューリング完全マシンにも解決できない停止の問題がなければなりません。
チューリング完全システムは、他のチューリング完全システムをエミュレートできます。そのため、システム内の有名なチューリング完全システムのエミュレーターを構築できれば、システムもチューリング完全であることを証明できます。
たとえば、無限に繰り返されるグリッドパターンを持つボード(上部と左側に異なるバージョンがある)が与えられた場合、Snakes&Laddersがチューリング完全であることを証明したいとします。2カウンターミンスキーマシンがチューリング完全(2つの無制限のカウンターと1つの状態のうち有限数)であることがわかっている場合、グリッド上のXおよびY位置が2カウンターの現在値である同等のボードを構築できます現在のパスは現在の状態です。バング!スネークとはしごがチューリング完全であることを証明しました。
必要な条件の1つは、反復の前に決定されない最大反復カウントを持つループ、または最大再帰深度が先に決定されない再帰です。例として、多くの新しい言語で見つかったfor ... in ...ループは、言語のチューリングを完全にするのに十分ではありません(ただし、他の手段があります)。これは、反復回数や再帰深度の制限を意味するものではありませんが、最大反復回数と再帰深度を事前に計算する必要があることに注意してください。
たとえば、アッカーマン関数は、これらの機能がない言語では計算できません。一方、これらの機能を必要とせずに、非常に複雑で非常に有用なソフトウェアをたくさん書くことができます。
一方、すべての反復回数とすべての再帰の深さが事前に計算されるため、プログラムが停止するかどうかを決定できるだけでなく、停止することもできます。
私はこれが正式な正しい答えではないことを知っていますが、「チューリング完了」から「最小限」を取り出して、それが属する場所に「実用的」に戻すと、プログラミング言語とマークアップ言語は
次に来る
これらのアサーションをテストするには、HTMLなどのマークアップ言語から始めます。変数のみ、または条件のみ(MSが条件付きコメントでそれを行った)、または何らかの種類のループ構造(条件のない場合はおそらくのようなものになる<repeat n='4'>...</repeat>
)を含むHTML +を発明することができます。これらのいずれかを実行すると、HTML +はプレーンHTMLよりも大幅に(?)より強力になりますが、それでもプログラミング言語というよりもマークアップになります。新しい機能ごとに、宣言型ではなく命令型言語になります。
ロジックとプログラミングの最小性の探求は確かに重要で興味深いものですが、n00biesの若い人も古い人も「プログラミングとは何か」と「プログラミングを学ぶ方法」を教えなければならなかったなら、私は完全な幅と幅から始めることはほとんどありませんでしたチューリング完全性の理論的基礎の。料理とプログラミングの本質はすべて、正しい順序で、お母さんがやったように準備ができるまで繰り返すことです。それは私のためにそれを要約しています。
それから、CSを終えたことはありません。