言語をチューリング完全にするものは何ですか?


79

チューリング完全にする言語機能/構造の最小セットは何ですか?


21
グーグルで検索した方がいいのではないでしょうか?en.wikipedia.org/wiki/Turing_completeness
aml90

2
こんにちは、好奇心の強い猫、プログラマーへようこそ!リストの募集はここでは話題になりません。あなたの質問からその部分を削除しました。とはいえ、このクエストは非常に幅広いものです。チューリング完全性について考えている特定の問題がありますか?

3
@amalantony:脚注として
ボビー

コンピューターサイエンスの観点については、こちらをご覧ください
ラファエル

回答:


73

チューリングターピットは、できるだけ少数の要素を使用しながら、チューリング完全であることを目指してい難解なプログラミング言語の一種です。Brainfuckはおそらく最も有名なターピットですが、たくさんあります。

  • IotaJotは、それぞれSK(I)コンビネーター計算に基づいた2つと3つのシンボルを持つ関数型言語です。

  • OISCOne Instruction Set Computer)は、通常「ゼロ以下の場合は減算および分岐」、または「借入の場合は逆減算およびスキップ」という1つ以上の引数の1つの命令のみを必要とする命令型計算のタイプを示します。x86 MMUは前者の命令を実装しているため、チューリング完全です。

一般に、命令型言語がチューリング完全であるためには、次のものが必要です。

  1. 条件付きの繰り返しや条件ジャンプの形(例えば、whileif+ goto

  2. 何らかの形式のストレージ(変数、テープなど)を読み書きする方法

ラムダ計算は TCをする関数型言語をベースに、必要があります。

  1. 引数を介して関数を抽象化する機能(ラムダ抽象化、引用など)

  2. 引数に関数を適用する機能(例、リダクション)

もちろん、他の計算の見方もありますが、これらはチューリングターピットの一般的なモデルです。実際のコンピューターは、無制限のストレージがないため、汎用のチューリングマシンでない ことに注意してください。厳密に言えば、それらは「境界のあるストレージマシン」です。メモリを追加し続けると、それらは漸近的にチューリングマシンに近づきます。ただし、境界のあるストレージマシンや有限状態マシンも計算には役立ちます。それらは単に普遍的ではありません。

厳密に言えば、チューリング完全性のためにI / Oは必要ありません。TCは、言語が目的の関数を計算できることのみを主張し、結果を表示できると主張するのではありません。実際には、すべての有用な言語には、何らかの形で世界と対話する方法があります。


命令型言語の場合、単純な変数で十分ですか?ある種のコレクション(配列やリンクリストなど)が必要だという印象を受けました。
luiscubal

1
@luiscubalでは、任意の量のデータを指定できる必要があります。単純な変数を使用すると、変数自体が持つデータの量を表すことができます。N + 1個の異なるデータを表す必要がある場合はどうでしょう。フラクトランの演劇のようなトリックを使えば、単純な変数でもそれを行うことができると主張することができます...

言語がENDLESSループをサポートする必要はありませんか?
sergiol

繰り返しになりますが、「すべての便利な言語には、世界と対話する方法があります。」Algol 60には、世界と相互作用する明確な方法がありませんでした。Algol 60プログラムでのすべてのI / Oは、ライブラリ関数を呼び出すことで行われ、ライブラリ関数は実装によってまったく異なる場合があります。しかし、私はここで、Algol 60が「有用」であったかどうかの議論から自分を拒否します。
ソロモンスロー

15

より実用的な観点から:チューリング完全言語のすべてのプログラムを自分の言語に翻訳できる場合、(私の知る限り)チューリング完全でなければなりません。したがって、設計した言語がチューリング完全であるかどうかを確認する場合は、Brainf ***をYourLanguageコンパイラに書き込むだけで、すべての正当なBFプログラムをコンパイルできることを証明/実証できます。

明確にするために、YourLanguageのインタープリターに加えて、BFプログラムをYourLanguageにコンパイルできるコンパイラー(任意の言語)を作成します(もちろん、同じセマンティクスを維持します)。


11
はい、それは間違いなくそれに最もアプローチする最も実用的な方法でしょう。</sarcasm>
ロバートハーベイ

13
@RobertHarveyにはポイントがありますが、一般的な考え方は非常に重要です。Brainfuckは、プログラミング言語が進むにつれてチューリング完全で非常にシンプルであることが証明されています。非難解なプログラミング言語の場合、brainfuckインタープリターを実装することは、どこからでも厳密な証明を与えるよりもはるかに簡単で速いかもしれません(数行のPythonでBFを実装できますが、正式なものからどこから始めるべきかわかりませんPythonが完全にチューリングしていることの証明); そして、何十もの難解なBrainfuckに触発された言語は、それらがBrainfuckにどのようにマップされるかを知っているので、完全にチューリングしていることが知られています。

7
@RobertHarvey:どうして?独自の言語を設計している人なら、BFコンパイラを書くことができます(それが必須である場合、そうでなければ適切な他の言語を見つけます)。
アントンゴロフ

5
@delnan:あなたはなりますあなたのBFインタプリタが正しくBF仕様を実装していること、しかし、証明する必要があり、IOWはあなたのBFインタプリタは、実際には、BF-ような言語のためのBFインタプリタではなくインタプリタであることを証明しなければならないことチューリング完全である場合とそうでない場合があります。
ヨルグWミットタグ

2
@DarekNędza、それはチューリング完全性が定義される方法の自然な結果です。チューリング完了言語の拡張はチューリング完了のままです。
アントンゴロフ

8

システムは、万能チューリング機械ができることを何でもできる場合にのみ、チューリング完全と見なすことができます。普遍的なチューリング機械は、時間を与えられると計算可能な機能を解くことができると言われているので、チューリング完全なシステムは、拡張により、そうすることもできます。

チューリングが完全かどうかを確認するには、その中にチューリングマシンを実装できるかどうかを確認します。つまり、次をシミュレートできるかどうかを確認します。

  1. 「変数」(または任意のデータ)を読み書きする能力:ほとんど自明です。
  2. 読み取り/書き込みヘッドの移動をシミュレートする機能:変数を取得して保存するだけでは不十分です。他の変数を参照するために、テープのヘッドを移動する機能をシミュレートすることも可能でなければなりません。これは、配列データ構造(または同等)を使用してプログラミング言語内でシミュレートできます。または、マシンコードなどの特定の言語の場合、「ポインター」(または同等)を使用して他の変数を参照できます。
  3. 有限状態マシンをシミュレートする機能:よく言及されていませんが、チューリングマシンは、実際にはAI開発でよく使用される有限状態マシンのバリエーションです。アラン・チューリングは、州の目的は人の「問題解決のさまざまなモード」をシミュレートすることだと言いました。
  4. 「停止」状態:チューリング完全であるとカウントするために、一連のルールが繰り返される必要があることがよく言及されていますが、アルゴリズムが状態アルゴリズムであるものの正式な定義は常に最終的に結論。何らかの方法で結論を出すことができない場合、チューリングが完全ではないか、アルゴリズムが計算可能な関数ではないということです。ゲームコンソールなどのように、技術的に結論が出ない完全なシステムをチューリングすると、何らかの方法で停止状態を「シミュレート」できるため、この制限を回避できます。「停止の問題」と混同しないようにしてください。

これらは、チューリング完全と見なされるシステムの真の最小要件です。これ以上でもそれ以下でもありません。何らかの方法でこれらのいずれもシミュレートできない場合、チューリングは完了していません。他の人が提案した方法は、これらの機能を持たないチューリング完全システムがいくつかあるため、あくまでも手段です。

真のチューリング完全システムを実際に構築する既知の方法はないことに注意してください。これは、物理空間内でチューリングマシンのテープの無限性を真にシミュレートする既知の方法がないためです。


4

プログラミング言語を使用して計算を行うことができれば、プログラミング言語は完全なものになります。言語チューリングを完全にする機能のセットは1つだけではないので、ループが必要である、または変数が必要であるという答えは、チューリングが完全ではない言語があるため間違っています。

Alan Turingはユニバーサルチューリングマシンを作成しました。ユニバーサルマシンで動作するように設計されたプログラムを翻訳して、言語で実行できる場合は、チューリングも完了します。これは間接的にも機能するため、すべての汎用チューリングマシンプログラムをYプログラムに翻訳できるため、完全な言語YをチューリングするためのすべてのプログラムをXに翻訳できる場合、言語Xはチューリングが完了していると言えます。

時間の複雑さ、スペースの複雑さ、入力/出力形式の容易さ、プログラムの記述の容易さは方程式に含まれていないため、計算が電力損失または太陽に飲み込まれることによって停止しない場合、そのようなマシンは理論的にすべての計算を行うことができます。

通常、チューリングの完全性を証明するために、彼らは完全な言語をチューリングしていることが証明されているすべてのインタープリターを作成しますが、それを機能させるには、入力と出力の手段が必要です。プログラムが起動時に状態を変更し、プログラムが停止した後にメモリを検査できることで十分です。

しかし、成功する言語を作るには、完全性をチューリングする以上のものが必要です。これは、ターピットをチューリングする場合にも当てはまります。私は考えていないBrainFuckはせずに人気があったであろう,.


2
「プログラミング言語で計算を行うことができれば、プログラミング言語は完全なものになります。」それが教会チューリングの論文であり、言語をチューリング完全にするものではありません。
ライモイド

@Rhymoidそれで、あなたは通訳者を作れない限り、完全なチューリングはないということですか?すなわち。ラムダ計算は、均等にチューリングしていてもチューリングが完了していませんか?
シルウェスター

1
私は、チューリング等価およびチューリング完全(およびチューリング強力)という用語の信頼できる定義を探しています。私はすでに、掲示板の人々から、自分のフリギンの論文の研究者まで、これらの用語を異なって解釈する多くのケースを見てきました。
ライモイド

とにかく、「チューリング完全」をユニバーサルチューリングマシン(UTM。これは、あらゆるチューリングマシンをシミュレートできるため、「ユニバーサル」)と同等のシミュレーションであると解釈します。彼がマシンを紹介した1936年のチューリングの論文では、UTMの概念を定義し、UTMがチャーチのラムダ計算と同等のシミュレーションであるという証拠のスケッチを示しました。そうすることで、彼は彼らが同じ計算能力を持っていることを証明した。チャーチ・チューリングの論文は、簡単に言えば、「これがあなたが得るすべての計算能力だ」と断言します。
ライモイド

ウィキペディアのチューリング完全性ページの 2つの正式な定義があります。1つはI / Oを必要とし、もう1つは必要ありません。チューリングで計算可能なすべての関数を計算できる場合、マシンが完全にチューリングしているとは言いません。これにより、ラムダ計算をチューリングの完全な状態に戻すことができます。ラムダ計算では、チューリングマシンプログラムと同じ計算を行う同等のプログラムを簡単に作成できるためです。
シルウェスター

4

無限ループするか停止するかはわかりません。

-------------

説明:何らかの入力が与えられた場合、(別のチューリングマシンを使用して)あらゆる場合に、物が無限にループするか、最終的に停止するかを伝えることは不可能です。ループする場合!)。

これは、潜在的に無制限の量のデータを何らかの方法で保存できる必要があることを意味します-どんなに複雑でも、無限のテープに相当するものが必要です!(それ以外の場合、状態の数は有限であり、その状態を以前に経て、最終的に停止したかどうかを確認できます)。一般に、チューリングマシンは、何らかの制御可能な手段によって状態のサイズを拡大または縮小できます。

チューリングの元の汎用チューリングマシンには解決できない停止の問題があるため、独自のチューリング完全マシンにも解決できない停止の問題がなければなりません。

チューリング完全システムは、他のチューリング完全システムをエミュレートできます。そのため、システム内の有名なチューリング完全システムのエミュレーターを構築できれば、システムもチューリング完全であることを証明できます。

たとえば、無限に繰り返されるグリッドパターンを持つボード(上部と左側に異なるバージョンがある)が与えられた場合、Snakes&Laddersがチューリング完全であることを証明したいとします。2カウンターミンスキーマシンがチューリング完全(2つの無制限のカウンターと1つの状態のうち有限数)であることがわかっている場合、グリッド上のXおよびY位置が2カウンターの現在値である同等のボードを構築できます現在のパスは現在の状態です。バング!スネークとはしごがチューリング完全であることを証明しました。


1
私はその議論を買いません。停止問題がチューリングマシンにとって決定不能だからといって、停止問題が決定不可能なプログラムを指定できるすべての表記法がチューリング完全であることを直接的に意味するわけではありません。明らかに逆の場合のみです。表記法がチューリング完全である場合、停止問題が決定できないプログラムを作成することはもちろん可能です。
5gon12eder

それは必要条件です。停止するかどうかをすべてのプログラムで決定できる場合、言語はチューリング完全ではありません。
gnasher729

4

必要な条件の1つは、反復の前に決定されない最大反復カウントを持つループ、または最大再帰深度が先に決定されない再帰です。例として、多くの新しい言語で見つかったfor ... in ...ループは、言語のチューリングを完全にするのに十分ではありません(ただし、他の手段があります)。これは、反復回数や再帰深度の制限を意味するものではありませんが、最大反復回数と再帰深度を事前に計算する必要があることに注意してください。

たとえば、アッカーマン関数は、これらの機能がない言語では計算できません。一方、これらの機能を必要とせずに、非常に複雑で非常に有用なソフトウェアをたくさん書くことができます。

一方、すべての反復回数とすべての再帰の深さが事前に計算されるため、プログラムが停止するかどうかを決定できるだけでなく、停止することできます。


-1

私はこれが正式な正しい答えではないことを知っていますが、「チューリング完了」から「最小限」を取り出して、それが属する場所に「実用的」に戻すと、プログラミング言語とマークアップ言語は

  • 変数
  • 条件(if / then ...)
  • ループ(loop / break、while ...)

次に来る

  • 匿名および名前付き関数

これらのアサーションをテストするには、HTMLなどのマークアップ言語から始めます。変数のみ、または条件のみ(MSが条件付きコメントでそれを行った)、または何らかの種類のループ構造(条件のない場合はおそらくのようなものになる<repeat n='4'>...</repeat>)を含むHTML +を発明することができます。これらのいずれかを実行すると、HTML +はプレーンHTMLよりも大幅に(?)より強力になりますが、それでもプログラミング言語というよりもマークアップになります。新しい機能ごとに、宣言型ではなく命令型言語になります。

ロジックとプログラミングの最小性の探求は確かに重要で興味深いものですが、n00biesの若い人も古い人も「プログラミングとは何か」と「プログラミングを学ぶ方法」を教えなければならなかったなら、私は完全な幅と幅から始めることはほとんどありませんでしたチューリング完全性の理論的基礎の。料理とプログラミングの本質はすべて、正しい順序で、お母さんがやったように準備ができるまで繰り返すことです。それは私のためにそれを要約しています。

それから、CSを終えたことはありません。


2
よくわからない場合は、まず調査する必要があります。 brainf * ck同様にfractran完全チューリングしています。また、html 5 + CSS 3ルール110を実装できるため、チューリング完全です。

1
はいyesysyes私は知っています。しかし、与えられたすべての例は多かれ少なかれ難解です(おそらく興味深いか驚くかもしれませんが)、私の答えは実用的なものであり、おそらく最小限ではありません。Googleでチューリング完全性を検索する際にこのページが1位だったことを指摘することが重要だと思います。ここでの答えは、HTMLとPHPまたはPythonの違いを知りたいn00bieにとってはほとんど役に立ちません。つまり、brainf ckは理由もなくBrainf ck と呼ばれていません。
フロー14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.