チューリングコンプリートとは?


回答:


325

これが最も簡単な説明です:

チューリングコンプリートシステムとは、答えを見つけるプログラムを作成できるシステムを意味します(ただし、ランタイムやメモリは保証されません)。

したがって、誰かが「私の新しいことは完全なチューリングである」と言った場合、それは原則として(実際には多くの場合ではありませんが)計算の問題を解決するために使用できることを意味します。

時々それは冗談です...男はviでTuring Machineシミュレーターを書いたので、viは世界で必要とされる唯一の計算エンジンであると言えるでしょう。


18
詳細については、「注釈付きチューリング」を参照してください。とても親しみやすい。amazon.com/Annotated-Turing-Through-Historic-Computability/dp/...
i_am_jorf

43
「実際には多くの場合」は正しくありません。実現可能なシステムには無限のテープがないため、実際にはチューリング完全なシステムはありません。私たちが実際に意味しているのは、一部のシステムには、使用可能なメモリの限界までチューリング完全性を概算する機能があるということです。
シェルビームーアIII 14

22
しかし、Viはこれまでに世界で必要とされる唯一の計算エンジンです... ;-)
Joe Edgar 14

4
Emacsもターニングマシンですか?XD
alem0lars

6
誰かが最近PowerPointもTuring Completeであることを示しました。
Tagc 2017

193

これが最も簡単な説明です

Alan Turingは、プログラムを取得してそのプログラムを実行し、結果を表示できるマシンを作成しました。しかし、その後、プログラムごとに異なるマシンを作成する必要がありました。そこで彼は、あらゆるプログラムを実行できる「Universal Turing Machine」を作成しました。

プログラミング言語はそれらのマシンに似ています(仮想ですが)。彼らはプログラムを取得して実行します。現在、プログラミング言語は、チューリングマシンが十分な時間とメモリを与えられて実行できる任意のプログラム(言語に関係なく)を実行できる場合、「チューリング完了」と呼ばれています。

例:10個の数値を受け取り、それらを加算するプログラムがあるとします。チューリングマシンはこのプログラムを簡単に実行できます。しかし、何らかの理由でプログラミング言語が同じ追加を実行できないと想像してください。これにより、「いわば不完全なチューリング」になります。一方、ユニバーサルチューリングマシンで実行できるプログラムを実行できれば、チューリングは完成です。

最近のほとんどのプログラミング言語(Java、JavaScript、Perlなど)は、加算、乗算、if-else条件、returnステートメント、格納/取得/消去の方法など、プログラムの実行に必要なすべての機能を実装しているため、すべてチューリング完全ですデータなど。

更新:詳細は私のブログ投稿「JavaScriptはチューリング完了」で説明されています—説明


5
この種のマシンには用語もあるという考えは、チューリングや他の初期のコンピューター科学者が特定の問題を解決するたびに特定のマシンを構築することを覚えていると、はるかに理にかなっています。私たちは、永久に再プログラムできる1台のマシンに慣れています。コンテキストをありがとう、ラジャ。
ジェイコブフォード

JavaScriptでチューリングを完全にするにはどうすればよいですか?ファイルシステム、適切なマルチスレッドAPIがありません。主にブラウザのセキュリティサンドボックスの性質により、多くの制限があります。それは「プログラミング言語」と呼ぶことはほとんどできません。JSが持っていないものを補うために、スクリプト抽象化のバリアントがいくつ存在するかを確認してください(反応、typescript ..名前を付けます)。(asm.jsはここで言及する必要があります)。Java、Python、またはC ++は、真の「Turing Complete」の例です。しかし、js?私はそうは思いません。
マイケルIV

2
@MichaelIVツーリングマシンにもファイルシステム/スレッドがありませんでした。JSは完全にツアーを終えています。
Bax

@MichaelIV Baxの応答に加えて、現代のコンピュータは、あなたが言及するこれらすべての素晴らしいことを可能にするために連携して動作するいくつかの Turingマシンで構成されると考えることができます。たとえば、CPUがGPUが読み取る「テープ」を生成して、GPUがモニターに「テープ」を書き込み、モニターがユーザーに「テープ」を書き込むことができるようにします。同様に、CPUはハードドライブ、NIC、サウンドカードなどの「テープ」を生成する可能性があります

86

ウィキペディアから:

アランチューリングにちなんで名付けられたチューリングの完全性は、これまでに進歩したコンピューティングデバイスのすべてのもっともらしい設計が、普遍的なチューリングマシン(Church-Turing論文として知られるようになった観察)によってエミュレートできるという点で重要です。したがって、普遍的なチューリングマシンとして機能できるマシンは、原則として、他のプログラム可能なコンピューターで可能な計算を実行できます。ただし、これは、マシンのプログラムを作成するために必要な労力、マシンが計算を実行するのにかかる時間、またはマシンが持つ可能性のある、計算に関係のない能力とは関係ありません。

本当にチューリング完全なマシンは無制限のストレージを必要とするため、物理的に不可能である可能性が非常に高いですが、チューリングの完全性は、多くの場合、無制限のストレージがあれば普遍的である物理マシンまたはプログラミング言語によるものです。この意味で、すべての最新のコンピューターはチューリング完全です。

「完全なチューリングとは、「十分な時間とスペースがあれば計算可能な問題に答えることができる」ということを除いて、あなたがそれよりも非技術的であることができる方法がわかりません。


4
この文脈で、「コンピューティングデバイス」とは何ですか?
dopatraman 2014年

30
ほとんどのウィキペディアの記事と同様に、この引用は技術的には正しいものですが、その主題に関する知識がなく、それを理解しようとしている人には価値がありません。物事を適切に説明できること自体が科学です:)
Lacho Tomov

76

非公式な定義

チューリング完全言語は、あらゆる計算を実行できる言語です。チャーチ=チューリングのテーゼの任意の実行可能計算がチューリングマシンによって行うことができると述べています。A チューリングマシン、それが読むべきおもむくまま、書き込み、およびそのメモリを越えて移動、それは一定の結果で終了しなければならない、とそれが次に何をすべきという無限のランダム・アクセス・メモリと有限「プログラム」が機械です。チューリングマシンへの入力は、開始する前にそのメモリに入れられます。

チューリングを完全ではない言語にすることができるもの

Aチューリングマシンは、それがメモリに見ているものに基づいて決定を下すことができます -のみサポートされていることを「言語」+-*、そして/それはその入力に基づいて選択が、チューリングマシン缶を作ることができないので、整数にはチューリング完全ではありません。

Turingマシンは永久に実行できます-Java、Javascript、またはPythonを使用して、あらゆる種類のループ、GOTO、または関数呼び出しを実行する機能を削除した場合、任意の計算を実行できないため、Turingは完全ではありません終わらない。Coqは、終了しないプログラムを表現できない定理証明であるため、チューリング完全ではありません。

チューリングマシンは無限メモリを使用できます - チューリングマシンは無限メモリを使用できるため、Javaとまったく同じでしたが、4ギガバイトを超えるメモリを使用すると終了する言語は、チューリングを完了できません。これが実際にTuringマシンを構築できない理由ですが、Java 言語には無限メモリの使用を妨げる制限がないため、Javaは依然としてTuring完全言語です。これが、正規表現が完全なチューリングではない理由の1つです。

Aチューリングマシンは、ランダム・アクセス・メモリを持っている -あなただけは介してメモリで動作することができますことを言語pushpopスタックへの操作がチューリング完全ではないことでしょう。文字列を1回読み取り、スタックからのプッシュとポップによってのみメモリを使用できる「言語」がある場合(、文字列内のすべてが独自のものを持っているかどうかを、それが表示)されたときにプッシュし、表示されたときに(ポップすることでわかり)ます。すべてのは、しかし、それは私に言うことができない(、独自のを持って)後にし、すべてのは[、自身の持っている](ノートの後に([)]、この基準を満たしているが([]]ないが)。チューリングマシンは、ランダムアクセスメモリを使用して()[]は別々ですが、スタックのみのこの言語はできません。

チューリングマシンは、他のチューリングマシンをシミュレートできます。チューリングマシンは、適切な「プログラム」が与えられると、別のチューリングマシンの「プログラム」を受け取り、任意の入力でそれをシミュレートできます。Pythonインタープリターの実装が禁止されている言語がある場合、それは完全なチューリングではありません。

完全な言語のチューリングの例

言語に無限のランダムアクセスメモリ、条件付き実行、および何らかの形の繰り返し実行がある場合、それはおそらくチューリング完全です。チューリングマシンで可能なすべてのことを実現できる、よりエキゾチックなシステムがあります。

  • 型なしラムダ計算
  • コンウェイの人生ゲーム
  • C ++テンプレート
  • プロローグ

11
SQLは間違いなくチューリング完全です。あらゆる計算を可能にするスクリプト機能を備えています。
nzifnab

53
いいえ、SQLをT-SQL / PL-SQLなどの拡張機能と混同しています。ANSI SQLは完全ではありません。しかし、TSQL / PLSQL-です。
Agnius Vasiliauskas

15
どうやらSQLはチューリング完全さ:stackoverflow.com/questions/900055/...
Newtang

2
よると完全性チューリング -すべてのシングルテープチューリング機械をシミュレートするために使用することができた場合にシステムの完全なチューリングされます。しかし、上記の例では、開発者が特別に構築されたのcyclic tag systemではなく、理解していたためuniversal cyclic tag systemです。したがって、記事はSQLが完全であることを証明していません。(または私は何かを誤解しました)
Agnius Vasiliauskas

2
無限のテープがないため、チューリング完全言語の実現可能な実装はありません。私たちが実際に意味していることは、一部の言語には、ホストマシンの使用可能なメモリの制限までチューリング完全性を概算する機能があるということです。
シェルビームーアIII 14

17

基本的に、チューリング完全性は簡潔な要件の1つであり、無限の再帰です。

記憶に縛られることすらありません。

私はこれを独立して考えましたが、これは主張についての議論です。LSPの私の定義は、より多くのコンテキストを提供します。

ここでの他の答えは、チューリング完全性の基本的な本質を直接定義するものではありません。


有限状態オートマトンは、無限の再帰を持つことができます。適例:a*

3
@Rhymoid FSMのメモリは制限されています(状態の数は有限です)。私は、テールの最適化のみで、定義を無制限の再帰のサブセットに制限しませんでした。親切にあなたの反対票を削除してください。
シェルビームーアIII 14

あなたは無制限の再帰霧の定義を保ちました。「プリミティブな再帰」という意味で「再帰」を意味し、「部分的」(または「一般」または「mu-」)にすることで「無限」を意味しますか?その後、あなたは正しいかもしれません。しかし、あなたの現在の定式化は、David Harelの「On Folk Theorems」で批判された声明に近すぎます。数学において厳密であることは重要であり、正確な定義を省くことによって、あなたはそれを無視しているのです。ちなみに、FSMは一般化して相互作用をモデル化できます。それらをTMと区別するのは、後者の環境も(テープとして)モデル化されていることです。

@Rhymoid列挙は精度の正反対です。たとえば、1インチの端数の最大精度を列挙します。無制限の再帰とは、無限のテープなしでは不可能であるあらゆる可能な再帰の形態を意味します。完全に一般化された再帰(モデル内の一般的なものだけでなく)は常にチューリング完全です。一般化された再帰と、あらゆる可能な計算を実行する機能との間の同等性を述べています。これは、注目すべき重要な同等性です。
シェルビームーアIII 14

「無限の再帰は、あらゆる可能な再帰の形を意味します」それはあなたの読書です。ほとんどのSOユーザーにとって、「無限の再帰」とはを意味しwhile (p) { /* ... */ }ます。「私は、一般化された再帰とあらゆる可能な計算を実行する能力との間の同等性を述べています。」教会の論文は非常に異なる問題であり、実際には個別に議論する必要があります。

13

Turing Completeは、少なくともTuring Machineと同じくらい強力であることを意味します。つまり、チューリングマシンで計算できるものはすべて、チューリングコンプリートシステムで計算できます。

チューリングマシンよりも強力なシステムを見つけた人はいません。したがって、当面のところ、システムがTuring Completeであると言うことは、そのシステムが既知のコンピューティングシステムと同じくらい強力であると言うことと同じです(Church-Turing論文を参照)。


3
これはすべてウォールタイムを無視することに注意してください。「できる」とだけ書いてある。
するThorbjörnRavnアンデルセン

@ThorbjørnRavnAndersen実際には、物理​​的な計算能力はまったく無視されます。宇宙の時代よりも長くかかるだけでなく、宇宙のすべてのフェルミオンとボソンで構築できるよりも多くのメモリを使用するかもしれません。
Waylon Flinn 2016年

宇宙のボソンとフェルミオンの量に制限はありません。サイズはわかりません。おそらくわかりません。「宇宙」のXの数を読むたびに、人々は実際に観測可能な宇宙について話している。興味深いですが、実際の物理的な制限ではありません。
Stijn de Witt 2017

9

簡単に言えば、チューリング完全システムは、起こり得るあらゆる計算問題を解決できます。

重要な要件の1つは、スクラッチパッドのサイズに制限がないことであり、スクラッチパッドへの以前の書き込みにアクセスするために巻き戻すことができます。

したがって、実際にはチューリング完全なシステムはありません。

むしろ、いくつかのシステムは、制限のないメモリをモデル化し、システムのメモリ内に収まる可能性のあるあらゆる計算を実行することにより、チューリング完全性を概算します。


2

「Turing Complete」という概念の重要性は、プロセスを「単純な」命令に分解できる、単純で単純な計算機(必ずしも機械的/電気的な「コンピュータ」ではない)を特定できることだと思いますUniversalマシンが解釈して実行できることを示す命令。

私はアノテーション付きチューリングを強くお勧めします

@Mark私が説明しているのは、ユニバーサルチューリングマシンとチューリングコンプリートの説明の混合だと思います。

チューリングコンプリートとは、実用的には、ユニバーサルマシン(デスクトップコンピューター)で実行されるプログラムとして記述およびプログラムできるマシン/プロセス/計算です。他の人が述べたように、それは時間やストレージを考慮していませんが。


2

簡単な言葉で理解できること:

完全なチューリング:計算を実行できるプログラミング言語/プログラムは完全なチューリングです。

例えば ​​:

  1. Just HTMLを使用して2つの数値を追加できますか。(Ansは「いいえ」です。追加を実行するにはJavaScriptを使用する必要があります。)したがって、HTMLは完全なチューリングではありません。

  2. Java、C ++、Python、Javascript、EthereumのSolidityなどの言語は、この言語を使用して2つの数値を加算するような計算を実行できるため、完全なチューリングです。

お役に立てれば。


0

テストして分岐できる場合は完全です( 'if'がある場合)


1
そのような古い質問については、他の人がすでに同様のまたはより実質的な貢献をすでに行っているかどうかを確認することは価値があります
アラン・オカラガン

答えの正確さについてはわかりません。しかし、これは私が今まで見たことがない本当に簡単な説明です。おかしなこと:ずっと昔(最初のコードを書いた後)でも、同じ説明を使用して、可能な限り単純なプロセッサを定義しました。
Victor Yarema

これは、鋭く、簡潔で正確な操作定義を最初に試すのに最適です。しかし、ブランチはループを許可する必要があり、マシンがサブルーチンの呼び出し(つまり、再帰)も許可する必要があるわけではありませんか?再帰を伴うすべてのプログラムに対してネストされたループのフラット化されたプログラムはありますか?
user3673

0

チューリングマシンでは、どのプログラムでも状態テストを実行できる必要があります。それが基本です。

プレーヤーのピアノロールを考えてみましょう。プレーヤーのピアノは非常に複雑な音楽を再生できますが、音楽には条件ロジックはありません。チューリングコンプリートです。

条件付きロジックは、チューリングコンプリートであるマシンのパワーと危険の両方です。

ピアノロールは毎回停止することが保証されています。TMにはそのような保証はありません。これは「停止問題」と呼ばれます。


-1

ウェイロンフリンは言いました

Turing Completeは、少なくともTuring Machineと同じくらい強力であることを意味します。

これは間違っていると思います。チューリングマシンと同じくらい強力なシステムであれば、チューリングは完全です。つまり、マシンによって実行されるすべての計算はシステムによって実行できますが、システムによって実行されるすべての計算はチューリングマシンによって実行できます。


1
私はあなたがチャーチチューリングの論文がこの結論に到達するのは真実であると仮定していると思います。まだ証明されていません。あなたが説明しているプロパティは、「Turing Equivalent」と呼ばれています。
Waylon Flinn、

1
@WaylonFlinnいいえ、そうです。「完全性」とは、少なくとも物と同じくらい強いが、強くないことを意味します。「NP-Complete」と比較してください。
Devin Jeanpierre

3
@DevinJeanpierreここで炎上戦争を開始したくないのですが、あなたが説明している計算クラスが「Turing Equivalent」と呼ばれていることはほぼ間違いありません。ただし、チューリングコンプリートは、NPコンプリートと同様の関係にあります。NP-Completeは、P = NPの場合にのみNPと等しくなります。同様に、Turing Completeは、Church-Turingの論文が正しい場合に限り、Turing Equivalentと等しくなります。
Waylon Flinn 2012年

@Waylon Source?何も私の読み取りは、(例えばと一致するen.wikipedia.org/wiki/Turing_completeness
デヴィンJeanpierre

4
@DevinJeanpierreリンク先のウィキペディアの記事のすぐそこにあると書かれています。正式な定義セクションを引用すると、「すべてのチューリング計算可能な関数を計算できる計算システムはチューリング完全と呼ばれます」、「計算できるすべての関数がチューリング計算可能である場合、チューリング完全システムはチューリング同等と呼ばれます」
Waylon Flinn

-2

ほとんどのプログラマーに馴染みのある実用的な言語用語では、チューリング完全性を検出する通常の方法は、言語がネストされた無制限のwhileステートメントのシミュレーションを許可または許可するかどうかです(Pascalスタイルのforステートメントとは対照的に、上限は固定されています)。


1
単一無制限whileループは、チューリングマシンをシミュレートするのに十分です。
masterxilo

-8

リレーショナルデータベースは、場所と道路の緯度と経度を入力して、それらの間の最短経路を計算できますか。これは、SQLが完全なチューリングではないことを示す1つの問題です。

しかし、C ++はそれを実行でき、あらゆる問題を実行できます。したがってそうです。


10
ポイント間の最短経路を計算できることは、チューリング完全の定義ではありません。それには、1つの例だけではありません。
Eva

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.