チューリング完全にするための言語機能/構造の最小限のセットは何ですか?
コメント
- 勝った’グーグルするほうがいいですか? en.wikipedia.org/wiki/Turing_completeness
- こんにちは好奇心旺盛な猫、プログラマーへようこそ!リストの呼び出しは、ここでは’トピックではありません:’質問からその部分を削除しました。とはいえ、この探求は非常に広範です。チューリング完全性について考えている’に取り組んでいる特定の問題はありますか?
- @amalantony:脚注として。
- コンピュータサイエンスの観点については、こちらをご覧ください。
回答
A チューリング陥穷は一種の難解プログラミング言語であり、可能な限り少ない要素を使用しながらチューリング完全になるように努めています。 Brainfuck はおそらく最も有名なターピットですが、たくさんあります。
-
Iota と Jot は、 SK(I)コンビネータ計算。
-
OISC ( 1つの命令セットコンピューター)は、1つ以上の引数の1つの命令のみを必要とするタイプの必須計算を示します。通常、「ゼロ以下の場合は減算して分岐します」、または「逆減算し、借用する場合はスキップします」。 x86 MMU は前者の命令を実装しているため、チューリング完全です。
一般的に、チューリング完全であるための命令型言語には、次のものが必要です。
-
条件付き反復または条件付きジャンプの形式(例:
while
、if
+goto
) -
何らかの形式のストレージを読み書きする方法(例: 、変数、テープ)
ラムダ計算ベースの関数型言語をTCにするには、ニーズ:
-
引数を介して関数を抽象化する機能(ラムダ抽象化、引用など)
-
関数をに適用する機能引数(例:縮小)
もちろん他の計算方法もありますが、これらはチューリング陥穎の一般的なモデルです。実際のコンピューターには無制限のストレージがないため、 ユニバーサルチューリングマシンではないことに注意してください。厳密に言えば、それらは「有界ストレージマシン」です。それらにメモリを追加し続けると、それらは力のあるチューリングマシンに漸近的に近づきます。ただし、制限付きストレージマシンや有限状態マシンでも計算には役立ちます。単にユニバーサルではありません。
厳密に言えば、チューリング完全性のためにI / Oは必要ありません。 TCは、言語が必要な関数を計算できると主張するだけであり、結果を表示できるとは主張しません。実際には、すべての有用な言語には、何らかの形で世界と対話する方法があります。
コメント
- 命令型言語の場合、単純な変数で十分ですか?なんらかのコレクション(配列やリンクリストなど)が必要だという印象を受けました。
- @luiscubal任意の量のデータを指定できる必要があります。単純な変数を使用すると、変数自体が持つデータの量を表すことができます。 N +1個の異なるデータを表す必要がある場合はどうなりますか。 Fractranが演じるようなトリックを使えば、単純な変数でもそれを行うことができると主張する人もいるかもしれません…しかし、’あなたが’求めていることとはまったく異なります。
- ‘言語が ENDLESS ループ?
- Re、”すべての有用な言語には世界と対話する方法があります。” Algol 60には、世界と対話するための定義された方法がありませんでした。 Algol60プログラムのすべてのI / Oは、ライブラリ関数を呼び出すことによって実行されました。ライブラリ関数は、実装ごとに完全に異なる可能性があります。ただし、Algol60が”有用であったかどうかについての議論はここでは拒否します。”
回答
より実用的な観点から:チューリング完全言語のすべてのプログラムを自分の言語に翻訳できる場合は、(私は知っています)、あなたの言語はチューリング完全でなければなりません。したがって、設計した言語がTuring-completeであるかどうかを確認したい場合は、Brainf ***をYourLanguageコンパイラーに記述して、すべての正当なBFプログラムをコンパイルできることを証明/実証するだけです。
To明確に言うと、YourLanguageのインタープリターに加えて、任意のBFプログラムをYourLanguageにコンパイルできる(もちろん同じセマンティクスを維持する)コンパイラー(任意の言語)を作成することを意味します。
コメント
- はい、それは間違いなくそれにアプローチするための最も実用的な方法です。
</sarcasm>
- @RobertHarveyにはポイントがありますが、一般的な考え方は非常に重要です。 Brainfuckは、プログラミング言語が進むにつれて、チューリング完全で非常にシンプルであることが証明されています。非難解プログラミング言語の場合、brainfuckインタープリターの実装は、どこからともなく厳密な証明を与えるよりもはるかに簡単で高速な場合があります(Pythonの数行でBFを実装できますが、’ Pythonが完全にチューリングしているという正式な証明からどこから始めればよいかわからない); ‘がどのようにbrainfuckにマッピングされるかを知っているため、数十の難解なbrainfuckに触発された言語が完全にチューリング完全であることが知られています。
- @RobertHarvey:なぜですか?確かに、独自の言語を設計している人は、それにBFコンパイラを書くことができます(必須の場合は、他の適切な言語を見つけることができます)。
- @delnan:あなたはそうしますただし、BFインタープリターがBF仕様を正しく実装していることを証明する必要があります。IOWでは、BFインタープリターが実際にはBFインタープリターであり、BFのような言語のインタープリターではないことを証明する必要があります。チューリング完全。
- @DarekNędza、’は、チューリング完全性の定義方法の自然な結果です。チューリング完全言語の拡張は引き続きチューリング完全です。
回答
システムのみを検討できます万能チューリング機械ができることなら何でもできるならチューリング完全であること。万能チューリング機械は、与えられた時間で計算可能な関数を解くことができると言われているので、チューリング完全システムは、ひいては、そうすることもできます。
何かがチューリング完全であるかどうかを確認するには、その中にチューリングマシンを実装することができます。つまり、次のことをシミュレートできるかどうかを確認してください。
- 「変数」(または任意のデータ)の読み取りと書き込みの機能:ほとんど自明です。
- 読み取り/書き込みヘッドの移動をシミュレートする機能:変数を取得して保存するだけでは不十分です。他の変数を参照するために、テープのヘッドを移動する機能をシミュレートすることも可能である必要があります。これは、多くの場合、配列データ構造(または同等のもの)を使用してプログラミング言語内でシミュレートできます。マシンコードなどの特定の言語の場合は、「ポインター」(または同等のもの)を使用して他の変数を参照できます。
- 有限状態マシンをシミュレートする機能:あまり言及されていませんが、チューリングマシンは実際にはAI開発でよく使用される有限状態マシンのバリエーション。アランチューリングは、州の目的は人の「問題解決のさまざまなモード」をシミュレートすることであると述べました。
- 「停止」状態:チューリング完全であると見なすには、一連のルールが繰り返される必要があるとよく言われますが、これは、何が正式に定義されているので、実際には良い基準ではありません。アルゴリズムは状態であり、アルゴリズムは常に最終的に結論を下す必要があります。何らかの方法で結論を出すことができない場合は、チューリング完全ではないか、アルゴリズムが計算可能な機能ではありません。動作方法が原因で技術的に結論を出すことができない完全なシステム(ゲーム機など)をチューリングすることで、何らかの方法で停止状態を「シミュレート」できるため、この制限を回避できます。「停止問題」と混同しないでください。 “、それを証明する決定不可能な関数”与えられた入力が別のシステムを結論付けない場合、100%の信頼性で検出できるシステムを構築することは不可能です。
これらは真の最小値ですチューリング完全と見なされるシステムの要件。それ以上でもそれ以下でもありません。これらのいずれかを何らかの方法でシミュレートできない場合は、チューリング完全ではありません。他の人々が提案した方法は、それらの機能を持たないチューリング完全システムがいくつかあるため、目的を達成するための手段にすぎません。
真のチューリング完全システムを実際に構築する既知の方法はないことに注意してください。 。これは、物理空間内でチューリングマシンのテープの無限性を真にシミュレートする既知の方法がないためです。
回答
プログラミング言語を使用して計算を実行できる場合、プログラミング言語は完全にチューリング完全です。言語チューリングを完全にする機能のセットは1つだけではないため、にはどちらも持たない言語があるため、ループが必要である、または変数が必要であるという回答は間違っていますしかし、チューリングは完了しています。
アランチューリングはユニバーサルチューリングマシンを作成しました。ユニバーサルマシンで動作するように設計されたプログラムを翻訳して、自分の言語で実行できる場合は、チューリング完全でもあります。これは間接的にも機能するため、すべてのユニバーサルチューリングマシンプログラムをYプログラムに変換できるため、完全な言語YをチューリングするためのすべてのプログラムをXに変換できれば、言語Xは完全にチューリングしていると言えます。
時間の複雑さ、スペースの複雑さ、入力/出力形式のしやすさ、プログラムの書きやすさは方程式に含まれていないため、電力損失や地球が太陽に飲み込まれて計算が停止しない限り、このようなマシンは理論的にすべての計算を実行できます。
通常、チューリング完全性を証明するために、チューリング完全言語であることが証明されたもののインタープリターを作成しますが、それが機能するには、入力と出力の手段が必要です。これは、言語がチューリング完全であるために実際には必要ない2つのことです。プログラムが起動時に状態を変更でき、プログラムの停止後にメモリを検査できるので十分です。
言語を成功させるには、完全性を調整するだけでは不十分です。チューリング陥穷にも当てはまります。 BrainFuck は、,
と.
aがなければ人気がなかったと思います。
。
コメント
- “計算ができる場合、プログラミング言語は完全にチューリング完全です”それは’チャーチ・チューリングの論文であり、言語をチューリング完全にするものではありません。
- @Rhymoidつまり、インタプリタを作成できない限り、チューリング完全ではないということですか?つまり、ラムダ計算は、’チューリング完全であっても、チューリング完全ではありませんか?
- I ‘私はまだチューリング等価およびチューリング完全(およびチューリング完全)という用語の信頼できる定義を探しています。I’メッセージボードの人々から、これらの用語の解釈が異なる独自の’論文の研究者まで、すでに多くのケースを見てきました。
- とにかく、 ‘ Turing-complete ‘は、ユニバーサルチューリングマシン(UTM;)と同等のシミュレーションであると解釈します。これにより、任意のチューリングマシンをシミュレートできます。したがって、’ユニバーサル’)。 1936年のTuring ‘の論文で、彼は自分のマシンを紹介し、UTMの概念を定義し、UTMがChurch
のラムダ計算。そうすることによって、彼はそれらが同じ計算能力を持っていることを証明しました。チャーチチューリングの論文は、簡単に言えば、” ‘があなたのすべての計算能力であると主張しています’ “を取得します。 - チューリング完全性ページの2つの正式な定義があります。 。一方はI / Oを必要とし、もう一方は’ tを必要としません。 ‘ではないものは、チューリング計算可能なすべての関数を計算できれば、マシンがチューリング完全であるとは言いません。ラムダ計算では、他のチューリングマシンプログラムと同じように計算する同等のプログラムを簡単に作成できるため、ラムダ計算はチューリング完全に戻ります。
回答
無限にループするのか停止するのかわからない。
————-
説明:何らかの入力が与えられた場合、(別のチューリングマシンを使用して)すべての場合に、実行する以外に、物事が無限にループするのか、最終的に停止するのかを判断することは不可能です(そうする場合は答えが得られます)。停止しますが、ループした場合はそうではありません!)
これは、潜在的に無制限の量のデータを何らかの方法で保存できる必要があることを意味します。どのようにしても、無限のテープに相当するものが必要です。複雑です!(それ以外の場合、状態の数は限られているため、以前にその状態を通過したことがあり、最終的に停止するかどうかを確認できます)。一般に、チューリングマシンは、制御可能な手段によって状態のサイズを拡大または縮小できます。
チューリングの元のユニバーサルチューリングマシンには解決できない停止問題があるため、独自のチューリング完全マシンにも解決できない停止が必要です。問題。
チューリング完全システムは他のチューリング完全システムをエミュレートできるため、システム内の有名なチューリング完全システムのエミュレーターを構築できれば、システムもチューリング完全であることを証明できます。
たとえば、無限に繰り返されるグリッドパターンを持つボード(上部に異なるバージョンがある)が与えられた場合、ヘビ&ラダーがチューリング完全であることを証明したいとします。および左側)。 2カウンターのミンスキーマシンがチューリング完全(2つの無制限のカウンターと有限数のうちの1つの状態)であることを知っていると、グリッド上のXとYの位置が2つのカウンターの現在の値である同等のボードを構築できます現在のパスは現在の状態です。バン!ヘビ&はしごがチューリング完全であることを証明しました。
コメント
- 私は’その議論を買うな。チューリングマシンで停止問題が決定不能であるからといって、停止問題が決定不可能なプログラムを指定できるすべての表記がチューリング完全であることを直接意味するわけではありません。逆だけが明らかに当てはまります。表記がチューリング完全である場合、停止問題が決定できないプログラムを作成することはもちろん可能です。
- It ‘必要条件。すべてのプログラムでプログラムを停止するかどうかを決定できる場合、言語は’チューリング完全ではありません。
回答
必要な条件の1つは、最大反復回数が反復前に決定されていないループ、または最大再帰深度が事前に決定されていない再帰です。例として、多くの新しい言語で見られる… in …ループは、言語のチューリングを完全にするのに十分ではありません(ただし、他の手段もあります)。これは、反復回数や再帰深度の制限を意味するものではありませんが、最大反復回数と再帰深度を事前に計算する必要があることに注意してください。
たとえば、アッカーマン関数は、これらの機能。一方、これらの機能を必要とせずに、非常に複雑で非常に便利なソフトウェアを多数作成できます。
一方、すべての反復回数とすべての再帰深度を事前に計算するだけでなく、プログラムを停止するかどうかは決定できますが、停止します。
回答
これが正式な正解ではないことはわかっていますが、「Turing-complete」から「minimal」を取り除き、「practical」を元の場所に戻すと、プログラミング言語とを区別する最も重要な機能が表示されます。マークアップ言語は
- 変数
- 条件付き(if / then …)
- ループ(ループ/ブレーク、while …)
next com e
- 匿名の名前付き関数
これらのアサーションをテストするには、HTMLなどのマークアップ言語から始めます。変数のみ、条件付きのみ(MSは条件付きコメントでそれを行いました)、またはある種のループ構造(条件がない場合はおそらく<repeat n="4">...</repeat>
)。これらのいずれかを実行すると、HTML +はプレーンHTMLよりも大幅に(?)強力になりますが、それでもプログラミング言語よりもマークアップになります。新しい機能を使用するたびに、宣言型ではなく命令型言語になります。
論理とプログラミングの最小性の探求は確かに重要で興味深いものですが、老いも若きもn00biesに「プログラミングとは何か」と「プログラミングを学ぶ方法」を教えなければならないとしたら、ほとんど始めませんでした。チューリング完全性の理論的基礎の全幅と幅で、料理とプログラミングの本質は、あなたのお母さんがやったように、準備ができるまで繰り返すことを正しい順序で行うことです。それは私にとってそれを要約しています。
それでも、CSを終了したことはありません。
コメント
- わからない場合は、最初に調査する必要があります。 fractran は、 divと同様に、チューリング完全です。 > brainf * ck 。 html 5 + CSS 3 は、 rule 110 。
- yesyesyes私は知っていますが、与えられたすべての例は多かれ少なかれ難解です(おそらく興味深いか驚くべきことですが)、m yの答えは実用的なものであり、おそらく最小限ではありませんでした。 ‘指摘することが重要だと思います。このページはグーグルでチューリング完全性を検索したときに1位でした。ここでの答えは、たとえばn00bieにはほとんど役に立たない私見です。 HTMLとPHPまたはPythonの違いを知りたい人。つまり、brainf ckは理由もなくbrainfckと呼ばれていません。