すべてのチューリング完全言語は交換可能ですか


26

プログラミングの方法は知っていますが、CS理論の初心者です。

この答えによると

チューリング完全性は、計算可能性の抽象的な概念です。言語がチューリング完全である場合、他のチューリング完全言語が実行できる計算を実行できます。

そして、チューリング完全言語で書かれたプログラムは、別のプログラムで書き直すことができます

OK。意味あり。Cをアセンブリに翻訳(コンパイル)できます(そして、私は毎日それを行います!)。また、アセンブリをCに翻訳できます(Cで仮想マシンを書くことができます)。同じことが他の言語にも当てはまります。任意の言語をアセンブリにコンパイルし、別の言語で記述されたVMで実行できます。

しかし、チューリング完全言語で書かれたプログラムを別のプログラムで書き直すことはできますか?

アセンブリにLIGHTBUTTONオペコードがある場合はどうなりますか?私は物理的に電球のないシステム(言語)でその言語をエミュレートすることはできません。

OK。つまり、コンピューター理論を扱っているので、物理的なデバイスの制限については話していません。

しかし、乗算を持たないデバイスはどうでしょうか?分割?私の知る限り(これはmath.SEの問題ですが)、加算と減算を使用して乗算をエミュレートすることはできません(もちろん、除算はエミュレートできません)[1]。

では、「完全な言語のチューリング」(加算、減算、およびジャンプが可能)は、加算、減算、乗算、およびジャンプが可能な別の言語をどのようにエミュレートしますか?

編集

[1]。任意の実数上。


33
実数は、ハイパーチューリング計算の領域に属します。チューリングマシンは実数を扱うことができません。したがって、チューリング完全性とは無関係です。
ヨルグWミットタグ

3
関連:命令が1つだけのアセンブリ言語の命令セットは、汎用コンピューターen.wikipedia.org/wiki/One_instruction_set_computerを構築するのに十分強力です。たとえば、メモリオペランドを使用した「ゼロ以下の場合は減算および分岐」。最新のx86と比較すると低速ですが、パフォーマンス比はどのプログラムでも有限です。
ピーター

1
チューリングの完全性には無限のストレージが必要であり、宇宙は無限ではないため、物理的な(実際に存在する)マシンはチューリング完全ではありません。このことから、2つの抽象マシンが同等であるかどうかの肯定的な答えは、それらのマシンの2つの物理的近似が同等であるかどうかの質問に答える助けにはなりません。
ベン

2
@PeterCordes:比率が有限であると言うとき、どちらかで有限時間で完了するタスクは両方で有限時間で完了することを単に意味すると仮定します-特定のマシン(入力を含まない)ではない一部の入力で比率がどれだけ高くなるかについての有限の制限。チューリング完全なマシンを構築でき、そのマシンで入力を選択して、比率を任意に高くすることができます。おそらく、入力サイズの計算可能な関数でさえありません。
-supercat

6
「加算と減算で乗算をエミュレートすることはできません(もちろん、除算をエミュレートすることはできません)」という考えをどこで得ているかわかりません。乗算方法を学ぶときに小学校から教えられました
-phuclv

回答:


55

チューリング完全性とは、1つのことと1つのことだけです。チューリングマシンでモデル化できる計算もそのモデルでモデル化できる場合、計算モデルはチューリング完全です。

それでは、Turing Machineがモデル化できる計算は何ですか?まあ、何よりもまず、Alan Turingと彼の同僚全員は、自然数の関数にしか興味がありませんでした。したがって、チューリングマシン(およびλ計算、SKコンビネーター計算、μ再帰関数など)は、自然数の関数の計算可能性についてのみ話します。自然数の関数について話していない場合、チューリング完全性の概念は意味をなさず、単に適用できません。

ただし、多くの興味深いものを自然数としてエンコードできることに注意してください。文字列を自然数としてエンコードでき、グラフを自然数としてエンコードでき、ブール値を自然数としてエンコードできます。チューリングマシンを自然数としてエンコードできるため、チューリングマシンについて話すチューリングマシンを作成できます。

そして、もちろん、自然数のすべての関数が計算可能というわけではありません。Aチューリングマシンでのみ計算することができ、いくつかの自然数の機能を、λ計算のみ計算することができ、いくつかの自然数の機能を、SKコンビネータ結石のみを計算することができ、いくつかの自然数上の関数を、...。驚くべきことに(あるいはそうではない)、すべての計算モデル(実際に物理的宇宙で実際に実現可能)は、自然数に対して同じ関数を計算できることがわかりました(少なくとも今まで見つかったすべてのモデルについて)。[注:明らかに、計算の弱いモデルがありますが、より強力なモデルはまだ見つかりません、実数やタイムトラベルを使用したモデルなど、物理的宇宙と明らかに互換性のないものを除きます。]

この事実は、多くの異なるモデルを長期間検索した後、毎回、まったく同じ関数を計算できることを発見したという事実が、教会チューリング論文の基礎になっています。計算モデルは同様に強力であり、それらのすべてが「計算可能」であるという意味の「理想的な」概念をキャプチャします。(CTTの2番目の、より哲学的な側面もあります。つまり、アルゴリズムに従う人間は、TMが計算できるのとまったく同じ関数を計算することもできます。)

ただし、これについては何も言われていません

  • さまざまなモデルの効率
  • 彼らはどのくらい便利です
  • どのような他の彼らが行うことができます以外の自然数の計算機能

そして、それこそが、異なる計算モデル(およびプログラミング言語)の違いが関係するところです。

異なるパフォーマンスの例として、ランダムアクセスマシンとチューリングマシンの両方がアレイをコピーできます。しかし、RAM はそれを行うために操作を必要としますが、TMは各要素をコピーするために要素をスキップする必要があるため、操作を必要とします、コピーする要素があります。O I Z 、E 2 、A 、R 、R 、Y、S 、I 、Z 、E 、A 、R 、R 、Y、S 、I 、Z 、E 、A 、R 、R 、YO(sizearray)O(sizearray2)sizearraysizearray

異なる利便性の例として、非常に高レベルの言語で記述されたコード、アセンブリで記述されたコード、および同じ問題を解決するためのTMの説明を比較することができます。

また、ライトスイッチは3番目の種類の違いの例です。一部のモデルで実行できることは、自然数では機能しないため、チューリング完全性とは関係ありません。

特定の質問に答えるには:

しかし、チューリング完全言語で書かれたプログラムを別のプログラムで書き直すことはできますか?

いいえ。プログラムが自然数でチューリング計算可能な関数を計算する場合のみ。その場合でも、複雑なエンコードが必要になる場合があります。たとえば、λ計算には自然数すらありません。関数を使用してエンコードする必要があります(関数だけがλ計算にあるため)。

この入力と出力のエンコードは、アルゴリズムを表現できるように非常に複雑になる可能性があります。したがって、どのプログラムも書き換え可能であることは事実ですが、書き換えられたプログラムは、はるかに複雑で、はるかに大きく、より多くのメモリを使用し、はるかに遅くなる可能性があります。

アセンブリにLIGHTBUTTONオペコードがある場合はどうなりますか?私は物理的に電球のないシステム(言語)でその言語をエミュレートすることはできません。

電球は、自然数に対するチューリング計算可能な関数ではありません。実際、電球は関数でも計算でもありません。電球のオンとオフの切り替えは、I / Oの副作用です。チューリングマシンはI / Oの副作用をモデル化せず、チューリング完了はそれらに関連しません。

任意の実数上。

チューリング完全性は、自然数の計算可能な関数のみを扱い、実数には関係しません。

チューリング完全性は、次の2つの理由から、あなたのような質問になると、それほど興味深いものではありません。

  1. それは非常に高いハードルではありません。あなたがされる必要があるすべてIFGOTOWHILE、および単一の整数の変数(変数を想定したが、任意の大きな整数値を保持することができます)。または、再帰。たくさん、たくさんの物がチューリング完全です。カードゲームMagic:The Gatheringはチューリング完全です。CSS3はチューリング完全です。sendmail設定ファイルはチューリング完全です。Intel x86 MMUはチューリング完全です。Intel x86 MOV命令はチューリング完全です。PowerPointアニメーションはチューリング完全です。Excel(スクリプトなし、数式のみを使用)はチューリング完全です。BGPルーティングプロトコルはチューリング完全です。sedチューリング完全です。Apache mod_rewriteルールはチューリング完全です。「(偶然または驚くべきことに)チューリング完了のためのGoogle「他の興味深い例を見つけるために。ほとんどすべてがチューリング完全である場合、チューリング完全であることは興味深い特性ではなくなります。
  2. 実際に有用である必要はありません。多くの有用なものチューリング完全ではありません。バージョン3より前のCSSはチューリング完全ではありません(CSS3 実際に使用されているわけでありません)。1999年以前のSQLはチューリング完全ではありませんでしたが、それでも非常に便利でした。追加ライブラリのない Cプログラミング言語は、チューリング完全ではないようです。依存型の言語は、定義により多かれ少なかれチューリング完全ではありませんが、オペレーティングシステム、Webサーバー、およびゲームをそれらで記述することができます。

イドリスの著者であるエドウィン・ブレイディは、「テトリス完全」という用語を使用して、これらの側面のいくつかについて話しています。テトリス完全であることは厳密には定義されていません(明白な「テトリスの実装に使用できる」以外)が、非常に高レベルで表現力があり、非常識にならずにゲームを書くことができるようなものが含まれます。外部の世界(入力および出力)と対話し、副作用を表現でき、イベントループを記述でき、リアクティブ、非同期、および並行プログラミングを表現でき、オペレーティングシステムと対話でき、外部ライブラリと対話する(言い換えると、Cコードで呼び出して呼び出すことができる)など。これらは、チューリング完全性よりも汎用プログラミング言語のはるかに興味深い機能です。


あなたがリンクした質問に対する私の答えは面白いかもしれません。それは、異なる質問に答えても同じポイントのいくつかに触れます。


7
この答えは本当に好きですが、あらゆる種類の興味深いものを自然数で表現できることは注目に値します。たとえば、文字列を自然数で表現したり、グラフを自然数で表現したり、コンピューターのメモリの状態全体を自然数で表現したりできます。実数は自然数の関数としてコーディングでき、自然数の(多くの)関数は自然数でコーディングできます。したがって、関数を自然数から自然数に制限することは大きな制限ではありません。暗くて、コンピューターにライトをオンにしたい場合を除きます。
セオドアノーベル

3
いい答えですが、これは「チューリング完全であることは興味深い特性であるのをやめる」というのは明らかに間違っています。何かがチューリング完全である場合、その停止問題は、チューリング機械の停止問題への計算可能な削減によりチューリング完全である。たとえば、カードゲームのMagic:The Gatheringはチューリング完全です。これは、そのルールが決定できないことを意味します。つまり、一般的な場合、次のゲーム状態になるものを計算上推定することは不可能です。これは非常に興味深い特性です。さらに深刻なことは、チューリング完全性と縮約を使用して、決定できない問題を証明することです。
クイックソート

チューリングと彼の同僚は自然数の関数に興味がありましたが、チューリングマシンは実際には数値を処理せず、シンボルの文字列を処理します。明らかに、既知の有限アルファベット内の記号の有限の文字列を自然数として簡単に解釈できますが、TMは入力で「多くの」ことを直接行うのではなく、「数字」を操作するだけです。実際には、TMの標準的な記述から「自然数の関数」に移行するには、少しのロジックが必要です。TMを使用する場合、文字列を数値としてではなく、文字列としてエンコードします。
ベン

これは明らかに素晴らしい答えですが、OPの理解を超えていることを恐れています。OPは、実数(の有限サブセット)での乗算の実装について既に混乱しています。これを考えると、あなたの答えは、実際にはチューリング完全なプログラミング言語は純粋な計算の目的のために交換可能ではないことを暗示しているようです(なぜなら現代のCPUは、一部のものだけでなく、すべてが自然にエンコードできるためです)数字)。
コンラッドルドルフ

9
@TheodoreNorvell実数を自然数でエンコードすることについて。実際、ほとんどすべての実数を自然数でエンコードすることはできません。自然数でエンコードできるため、自然数でエンコードできる実数のセットは、せいぜい数え切れないほど無限です。そして、それは数え切れないほど無限であるため、セットのメジャーはゼロです。実数を自然数で表現できると言うのは少々不誠実です。なぜなら、実数を表現できるのはほんのわずかであり、正確には0%です。
シャッフルパンツ

9

もちろん、加算と減算を使用して乗算を実装できます。

/* Assume b is positive for simplicity */
int multiply(int a, int b) {
  int res = 0;
  while (b > 0) { res += a; b -= 1; }
  return res;
}

あなたがそうしない可能性が高いという事実は、それを可能にしません。

除算はほとんど難しくありません:

/* Assume a and b are positive for simplicity */
int divide(int a, int b) {
  int res = 0;
  while (a >= b) { res += 1; a -= b; }
  return res;
}

そして、乗算と除算は実際にはCPUの回路によって実行されると思いますか?ヒント:巨大なルックアップテーブルではありません。ビットシフトも使用されるため、上記よりも効率的ですが、基本的には加算と減算の観点から実装されます。


4
@touring:浮動小数点に対しては正常に機能します。最初に、分子が末尾のバイナリ0を持つように仮数を正規化します。次に、整数除算を行います。最後に、指数を修正します。元の指数の差に加えて、正規化からの修正を加えます。2precision
リチ

7
@touring:ご存知のように、浮動小数点コプロセッサーが存在する前に、浮動小数点演算が利用可能でした。
リチ

6

チューリングの完全性には無限のストレージが必要であり、宇宙は無限ではないため、物理的な(実際に存在する)マシンはチューリング完全ではありません。

このことから、2つの抽象マシンが同等であるかどうかの肯定的な答えは、それらのマシンの2つの物理的近似が同等であるかどうかの質問に答える助けにはなりません。

したがって、(たとえば)2つの言語の抽象モデルのチューリング等価性は、それぞれが実際に他方が計算できるすべてを計算できることを意味しません。一方が他方の前に物理的な制限に直面する場合があります。


しかし、質問は言語について尋ねました。特定のマシンについて言及していますが、それは、実際のマシンが実数で動作しないことを彼が認識していないためです。
シャッフルパンツ

3

nm=n+n(m1)m/n=1+(mn)/n

実際のところ、演算「加算1」、「減算1」、および「指定されたレジスタがゼロの場合は条件付きジャンプ」は、計算モデルをチューリング完全にするのに十分です(2カウンターマシンを参照するには非常に最小限のチューリング完全な計算モデル)。

22n=n+n2m×2n=2m×nm×(2n+1)=m+2m×n


3

TL; DR - チューリングマシンは、一般的な論理システムの操作のためだけの基本的な論理記述されています。彼らは、特殊なオペコードの呼び出しや構築された数学演算など、説明できるほとんどのことを実行できます。


アセンブリにLIGHTBUTTONオペコードがある場合はどうなりますか?私は物理的に電球のないシステム(言語)でその言語をエミュレートすることはできません。

チューリングモデルでは、LIGHTBUTTONオペコードのようなシンボルは、チューリングコンピューターが使用するアルファベットの文字列です。

したがって、チューリングマシンは、文字列"LIGHTBUTTON"、またはそのオペコードに対応する整数値の生成を担当します。外部エンティティがそれに基づいて行動するかどうかは、チューリングコンピューターのビジネスではありません。

Cプログラムにも同じ制限があります。つまり、Cプログラムはのオペコードのみを呼び出すことができますがLIGHTBUTTON、CPUがそのオペコードに関連付けられた操作を実際に実行するかどうかは、CPUに任されています。


しかし、乗算のないデバイスはどうでしょうか?分割?私の知る限りでは(これはmath.SEの問題ですが)、(任意の実数で)加算と減算を使用して乗算(および除算ではない)をエミュレートすることはできません。

うん、チューリングマシンは、人間が記述可能なロジックであれば可能な限り、実数であってもこれらのことを実行できます。チューリングマシンは、Rule 110セルラーオートメーションと同じくらい簡単です。

トリックは、マシンが自然に持っている物理学から論理システムを構築することです。たとえば、メインストリームCPUは算術論理ユニット(ALU)を備えているため、乗算と除算を実行できます。しかし、ALUは魔法ではありません。それらは単純な論理ゲートそのものです。そして、それらの論理ゲートはトランジスタで作られています。そして、これらのトランジスタはドープされた砂で作られています。

したがって、チューリング完全なデバイスで数学を実行するには、そのようにプログラムする必要があります。

ππ=0ππππ=0


3

しかし、チューリング完全言語で書かれたプログラムを別のプログラムで書き直すことはできますか?

プログラムへの入力が任意の長さのビットシーケンスであり、出力も任意の長さのビットシーケンスである場合、YES。書き換える時間とエネルギーがあり、パフォーマンスを気にせず、両方の実装に十分な物理メモリがあると仮定します。

2つのチューリング完全言語は互換性がないことを意味する実際的な考慮事項には、以下が含まれます。

  • さまざまな種類の入力と出力をサポートします(SQLデータベースアクセスなど)

  • データ型の異なるライブラリがあります(Unicode文字列のサポートなど)

  • さまざまなタスク(オブジェクト、スレッド、コルーチン、ファーストクラス関数など)に最適化されたさまざまなプログラミングパラダイムを提供します。

  • さまざまな関数ライブラリを提供します(XML解析およびシリアル化など)


1

いいえ。チューリング完全性はプログラムとは関係ありません。それは数学関数(またはアルゴリズム)に関するものです。任意のアルゴリズム-任意の計算 -Cで実行でき、他のチューリング完全言語で実行できます(これは明らかです)。しかし、チューリング完全性では、実際にI / Oを実行できるとは言えません。ハードウェアについてはまったく言及していません。計算のみ。

チューリング完全言語を任意のハードウェア操作で拡張できます(技術的には、これがCでの方法fputcと動作ですfgetc)。2つのチューリング完全言語を使用し、同一のハードウェア固有の操作でそれらを拡張する場合、それらは互換性を維持します。したがって、LIGHTBULB操作を備えたアセンブリ言語はチューリング完全よりも強力です。あなたはそれがチューリング完全であるLIGHTBULBと言うことができます。他の言語をそれと同一にするためには、チューリング完全である必要がありLIGHTBULBます; これを行う最も簡単な方法は、LIGHTBULBプリミティブ/命令/関数/などを追加することです。

これが、C実装が一般にインラインアセンブラーをサポートするか、アセンブラーで記述された関数を呼び出す方法を文書化する理由であり、他の言語の実装が一般にCで記述された関数を呼び出す方法を提供する理由です。

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