一部のプログラミング言語は完全なチューリングですが、他の言語のいくつかの機能が欠けているのはなぜですか?


42

外部プログラム/関数にフックする(すべき)インタープリターを作成するときに奇妙な問題に遭遇しました: 'C'および 'C ++'の関数可変引数関数をフックできません。たとえば、 'printf'を呼び出す関数を作成できません取得した引数とまったく同じ引数を使用し、代わりに可変個のオブジェクトを取る代替バージョンを呼び出す必要があります。匿名フックを保持するオブジェクトを作成できるようにしたいので、これは非常に問題です。

だから、ForthJavaScript、そしておそらく他の多くの言語がアセンブリ言語/マシンコードに頼ることなくこれを非常に簡単に行うことができるので、これは奇妙だと思った。他の言語はこれを非常に簡単に行うことができるので、各プログラミング言語が解決できる問題のクラスは、これらの言語がすべてチューリング完全であっても、実際には言語によって異なりますか?


33
ターピットのチューリングを検討する必要があります。これらは魅力的なタイプのプログラミング言語であり、使用可能な操作をできるだけ少なくして、完全にチューリングします。それらのほとんどには、基本的なデータ型、関数、さらには変数の宣言などの単純なものもありません。個人的には、それらのコーディングは非常に楽しいと思います。なぜなら、それはあなたをあなたの快適ゾーンから追い出し、不必要に難しいことを試みるからです。
DJMcMayhem

8
チューリングマシンの機能を見ると、「チューリング完了」がクリアするのに非常に低いハードルであることがわかります。基本的に、基本的な算術をサポートしながら「読み取り」、「書き込み」、「ジャンプ」できるものはすべてチューリング完全です。これは、あなたが見ている言語機能のレベルを大きく下回っています。
アロス

2
さらにばかげたことには、x86プロセッサ上のMOV命令はチューリング完全です。詳細については、cl.cam.ac.uk /〜sd601 / papers / mov.pdfを参照してください。
ガレスマコーガン

3
カードゲームのMagic:The Gatheringでさえチューリング完全です。チューリング完全性は、言語の機能とはほとんど関係ありません。
マスト

2
ところで、それらの証明チェッカーのように、完全ではない非常に複雑なプログラミング言語もあります。
盛安安

回答:


68

チューリング完全言語は、同じ関数セットを計算できます。これは、一般的な再帰部分関数のセットです。それでおしまい。NkN

これは、言語機能については何も言いません。チューリングマシンの構成機能は非常に限られています。型付けされていない -calculusははるかに構成的ですが、現代の言語で一般的に見られる多くの機能が欠けています。λ

チューリングの完全性は、型、組み込みの配列/整数/辞書、入力/出力機能、ネットワークアクセス、マルチスレッド、動的割り当てなどについては何も伝えません。

Javaに機能X(たとえば、マクロ、上位の型、または依存型)がないため、Turingが突然完全に停止することはありません。

チューリングの完全性と言語の表現力は、2つの異なる概念です。


42
イドリスのデザイナーであるエドウィン・ブレイディは、「テトリス完全」という言葉を冗談めかして(彼が発明したかどうかはわかりません)「自然数で計算可能な関数を計算できる」と「できる」の違いを表現します。環境と対話する重要なプログラムを作成するために使用してください。」
ヨルグWミットタグ

12
また、C / C ++でこれらのものを使用できることにも言及できます。C / C ++コード内の文字列をコンパイルする場所で、C / C ++のコンパイラーとして機能する別の言語のコードを記述する必要があります。その後、Cファイル内でJavaのようなものでプログラミングすることができます。これはすべて大変な作業になりますが、可能です(おそらく、C / C ++がチューリング完全だからです)。
シャッフルパンツ

4
@Shufflepantsしかし、「別の言語を解釈できるので、C ++でできる」と言うのは本当に便利かと思います。そのため、Java、ML、C ++は同等です。TM for syscalls(I / O)も同等です。その理由から、事実上すべての言語が等しく表現力があることを恐れています。その場合、言語を比較することは有用な概念ではありません。
チー

9
@chiあなたは正しいです、それらは同等です。それがチューリング完全であることの意味です。1つのチューリング完了システムで実行できることはすべて、別のチューリング完了システムで実行できます。特定のシステムで行うのは便利ではない場合があります。また、さまざまなプログラミング言語を比較する主な方法は、さまざまなことを行う便利さです。しかし、それは質問が尋ねていたものではありません。
シャッフルパンツ

5
@Rhymoidメモリアクセス上の理由でCがチューリング完了でない場合、または任意の大きなストレージを備えた接続デバイスに任意の信号を送信できない場合、実際の言語またはデバイスはチューリング完了ではないと主張することができます。 。しかし、私はそれが推論の非常に生産的なラインだとは思わない。
シャッフルパンツ

47

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

しかし、これはそうすることがいかに便利であるかを示していません。一部の言語で簡単な機能の中には、設計上の選択により、他の言語では非常に難しいものもあります。チューリングの完全性とは、計算ができるということです。極端な例として、C ++で可変機能関数をフックすることは困難かもしれませんが、可変機能関数をフックできるC ++でJavaScriptインタープリターを作成することは可能です。

言語設計は非常に興味深い芸術です。実行しなければならない主要なステップの1つは、言語のバックボーンを形成する動作を識別することです。これらの動作は1階に組み込まれているため、言語で簡単に実行できます。どの言語にどの機能を含めるかについて設計上の決定を下します。

あなたの特定の例に関して言えば、Cが開発されたとき、それはその日のアセンブリ言語の動作に非常に近い動作をするように設計されていました。可変個の関数は、型安全性が非常に低い状態で、単に引数をスタックにプッシュします。これらの可変個性関数の実装は、最大限の移植性を確保するためにコンパイラーに任されていました。したがって、ハードウェアの機能に関してはほとんど想定されていません。JavaScriptが登場する頃には、シーンは変化していました。すでにインタープリター言語として仮想マシンで動作しているため、バランスが便利に移行します。可変個の関数のフックを許可することは合理的になります。Just In Time CompiledのJavaScriptの場合でも、コンパイラーは、従来のCコンパイラーが保存しようとしていたよりもはるかに多くの引数に関する追加情報を保存しようとします。


1
@Wildcard(事実上)すべてのコンパイラーはこれについては見苦しいと思います。ほとんどの言語はチューリング完全ですが、最終的にはアセンブリによって解釈/コンパイルする必要がありますが、そうではありません。しかし、これは必要な物理的制限です。ハードウェアは強力なチューリングではありません。それでも、計算可能性は、実用的な意味で実際のコンピューターに「適用」する多くの有用な概念を提供します。
チー

3
@Wildcardその些細な意味で。アセンブリ(およびC)には固定サイズのポインターがあり、制限された量のメモリのみをアドレス指定できます。理論的には、ポインターが無制限の自然であるアセンブリを定義できますが、これ以上「アセンブリ」とは呼びません。URMまたはそのようなものと呼びます。実際には、プログラムを実行できるように物理的な境界が十分に大きいふりをするので、コンピューターが有限状態マシンのみである場合でも(たとえば、加算を実行できないことを意味する)、チューリングマシンと考えます(加算は実行可能です)。
カイ

4
@chiそれはまったく正確ではありません。まず、ほぼすべての人がCをチューリング完全であると見なします。これは、通常、「十分なメモリがある」という前提に基づいてこのフレーズを割り当てるためです。そのような仮定が無効である、より厳密な言葉遣いを心配しなければならない非常に少数の人々のために、Cはポインターのサイズを指定せず、どのくらいのメモリーをアドレス指定できるかを指定しません。したがって、「チューリング完全」という絶対的に最も厳密な意味でさえ、Cはチューリング完全です。
コートアンモン

3
@CortAmmon私は反対しなければなりません。Cのセマンティクスを形式化して、「十分なメモリ」の仮定を埋め込もうとするとsizeof(void *)、ISO C標準によって何かを評価することが義務付けられるため、失敗します。これにより、特定のプログラムのメモリ量を大きなものに制限する必要がありますが、それでも制限があります。たとえば、セマンティクスが2つの任意の自然を追加するプログラムを書くことはできません。Cは、TMテープのようなファイルを使用して、I / Oを介してチューリングを強力にすることができます(@Hurkylが先に指摘したように)。これは実際問題ではないことに同意します。
カイ

7
新しい言語C-infをお勧めします。これはCとまったく同じです。ただし、再帰またはヒープ割り当てによって割り当てられたメモリが多すぎる場合、プログラムは中止され、sizeof(void *)およびsizeof(size_t)の大きな値で再コンパイルされます。そして、最初から再び実行を開始します。
gnasher729

26

プログラミング言語を、自転車、車、ホバーカー、電車などのさまざまな陸上車両と考えてください。

チューリング完全性は、「この車両は、他の車両が行くことができる場所ならどこにでも行くことができる」と言います。つまり、すべて同じ関数を計算できます。入力から出力、開始から終了。

しかし、その声明は、あなたがそこに着く方法については何も述べていません。レール上、道路上、空中にある可能性があります。同様に、チューリング完全性は、関数の計算方法については何も述べていません。再帰、反復、または奇妙なセルオートマトンを使用できます。型を使用しても使用しなくても、動的または静的な手法を使用してもかまいません。ただし、計算できる関数(またはセット/フォーマル言語)のみを検討する場合は、チューリング完全である限り、これらの機能は同じ力を提供します。


4
これは非常によく似ています。また、このサイトの他の場所で見た、チューリングマシンを超える他の計算モデルがあるかどうかという問題にもうまく拡張できます。この類推では、飛行機と宇宙船はチューリング完了以上のものであり、スピードボートも別のものです。完全にマシンのタイプ。:)
ワイルドカード

2
Light-Travelの計算よりも速いのは、おそらくSuper-Turing計算のより良いアナロジーです。それ可能かもしれませんが、ほとんどの人はそうではないと思います。
jmite

@jmiteもちろん、私たちの脳がスーパーチューリングコンピューターであることを示唆する良い証拠はまだありません。それは必ずしも乗り越えられない障壁ではありませんが、非チューリングマシンを考慮することができない(明らかな)ことは、そこから生じる可能性があります。飛行機は実際には非常によく似ています-地形を無視して、2つのポイント間を「真っ直ぐ」に行きます。時空自体のトポロジーを無視できれば、光よりも速く飛ぶことができます。時空のトポロジーを無視することは可能だと言っているわけではありません。気を付けてください:)
Luaan

1
@Luaanそう、でも私たちの脳は、スーパーチューリングコンピューターを理解するために必ずしもスーパーチューリングである必要はありません。TMとその状態を取得し、次の状態にステップする関数を記述することにより、単純型付きラムダ計算のような弱い終了言語を使用して、チューリングマシンのセマンティクスを説明できます。私は実際にその言語でマシンを実行することはできません(無限のステップがかかる可能性があるため)が、各ステップがどのように見えるかを書くことができます。
jmite

@Luaan、「私たちの脳が超チューリングコンピュータであることを示唆する良い証拠はまだありません」 -しかし、人間の心がチューリングマシンにすぎないことを示唆する証拠もありません。アイデアにさかのぼることができないどこかを指摘することができます何のチューリングマシンが存在しないため、人間によって発信心があることに違いはまだある生活ができる発信アイデアを、そして機械的な工夫はできませんが。しかし、計算のモデルに関してはチューリングマシンは、「計算」、アイデア、夢などと合理的に呼ばれる可能性のあるあらゆるものをうまく取り込んでいると思います。
ワイルドカード

17

あなたが本質的に求めているのは、計算能力と、一般的に言語(または計算システム)の表現力(または単に表現力)と呼ばれるものとの違いです。

計算力

計算能力は、問題の種類は、言語を計算することができるものを指します。最もよく知られている計算能力のクラスは、ユニバーサルチューリングマシンと同等です。Random Access Machinesλ-calculusSK combinator calculusμ-再帰関数WHILEプログラムなど、他の多くの計算システムがあります。結局のところ、これらはすべて相互にシミュレートできるため、すべて同じ計算能力を持っています。

これにより、チャーチチューリングテーゼ(λ-calculusを作成したAlonzo ChurchとUniversal Turing Machineを作成したAlan Turingにちなんで名付けられた)が生まれます。Church-Turing-Thesisは、2つの側面を持つ計算可能性に関する仮説です。

  1. 一般的な計算が可能なすべてのコンピューティングシステムは同等に強力であり、
  2. アルゴリズムに従う人間は、チューリングマシン(および他のシステム)が計算できる関数を正確に計算できます。

ただし、2番目はコンピューターサイエンスよりも心の哲学の分野で重要です。

しかし、あなたの質問に非常に関連している、教会-チューリング-テーゼ言っていない 2つのことがあります:

  1. どのように効率的に様々なシミュレーションであり、
  2. 問題のエンコードがどれほど便利か。

(1)の簡単な例:ランダムアクセスマシンでは、配列のコピーは配列の長さに比例して時間がかかります。ただし、チューリングマシンでは、配列の長さの2乗に比例した時間がかかります。チューリングマシンにはランダムメモリアクセスがないため、テープを一度に1セルしか移動できません。したがって、それらをコピーするには、配列のn 個の要素をn回移動する必要があります。そのため、実装の詳細から抽象化しようとする漸近的な場合でも、異なる計算モデルは異なるパフォーマンス特性を持つ場合があります。

(2)の例は豊富です:λ計算とPythonはどちらもチューリング完全です。しかし、Pythonまたはλ計算でプログラムを作成したいですか?

また、私がこれまで回避してきた3番目のしわもあります。これらのオリジナルシステムはすべて、コンピューター科学者ではなく、論理学者、哲学者、または数学者によって設計されました。これらはすべて、Konrad Zuseの非常に最初の実験(それでもプログラム可能ではなかった、および/またはチューリング完全ではなかった)の前でさえ、1930年代初期に遡ります。彼らは「自然数の計算可能な関数」についてのみ話します。

結局のところ、自然数の関数として表現できるものはたくさんあります。結局、私たちの現代のコンピューターはそれよりもはるかに少ないものでさえ通ってます(基本的には数字0と1で3-4の関数、それだけです) )、しかし、たとえば、オペレーティングシステムはどの機能を計算しますか?

このI / Oの概念、環境と相互作用する副作用は、「自然数に対する関数」という概念にとらわれていません。それでも、サイモン・ペイトン・ジョーンズがかつて「副作用のない純粋な機能はすべてあなたのCPUを熱くする」と言っていたように、観客「実際、それ側面」と答えたので、それはちょっと重要です。効果も!」

イドリスの設計者であるエドウィン・ブレイディ(半分だけ)は、「テトリス完全」という言葉を冗談めかして(彼が発明したかどうかはわかりません)「自然数で計算可能な関数を計算できる」と「できる」環境と対話する重要なプログラムを作成するために使用してください。」さらに皮肉なことに、彼はIdrisにSpace Invadersクローンを実装することでこれを実証していますが、TetrisはSpace Invadersに還元されると確信しています。

別の指摘すべきことは、チューリングの等価性が実際に「有用な」プログラムを書くことについて話すのに必ずしも十分ではないだけでなく、OTOHも必要でさえないかもしれないということです。たとえば、SQLはANSI SQL:1999チューリングと同等になりましたが、それ以前はまだ有用でした。実際、チューリングと同等にすることは、その有用性にまったく追加されないと主張するかもしれません。チューリングと同等ではない多くのドメイン固有言語があります。データ記述言語は通常そうではありません(そうすべきではありません)。Total Languagesは明らかにTuringに相当するものではありませんが、それでもイベントループ、Webサーバー、またはオペレーティングシステムを記述することができます。チューリングと同等の言語もありますが、実際にはこれは間違いと見なされます。

したがって、全体として、プログラムを静的に分析する場合を除き、チューリング等価性はそれほど興味深いものではありません。

表現力

私たちの計算システムが問題をまったく解決するのに十分な計算能力を持っていると仮定すると、次にやらなければならないことは、そのシステムの何らかの形式の表記でその問題を解決するためのアルゴリズムを表現することです。言い換えれば、何らかのコンピューター言語でプログラムを作成する必要があります。そこで表現力の概念が生まれます。

基本的に、特定のプログラミング言語でプログラムを作成することが「簡単」または「楽しい」ことを指します。ご覧のとおり、この概念は非常に曖昧で主観的であり、技術的というよりも心理的です。

ただし、より正確な定義が試みられています。最も有名なもの(そして私が知っている最も厳格なもの)は、プログラミング言語の表現力についての Matthias Felleisenの論文です(最初の2ページには穏やかな紹介があり、残りの論文はより肉厚です)。

主な直観はこれです:プログラムを言語から別の言語に翻訳するとき、あなたがする必要のある変更のいくつかはローカルに含まれています(例えば、FORループをWHILEループに変える、ループを条件付きにGOTO変えるなど)、そしていくつかはグローバルへの変更を必要としますプログラムの構造。

1つの言語の1つの機能をローカル変換だけで別の言語の別の機能に置き換えることができる場合、これらの機能は表現力に影響を与えないと言われています。これは構文糖と呼ばれます。

一方、プログラムのグローバル構造の変更が必要な場合、翻訳先の言語は機能を表現できないと言われます。そして、あなたが翻訳している言語は、(この機能に関して)より表現力があると言われています。

これにより、客観的に測定可能な表現力の定義が得られることに注意してください。また、概念は機能に依存するコンテキストであり、比較であることに注意してください。言語の中のすべてのプログラムのであれば、Aは言語に翻訳することができるBのみローカルの変更で、言語に少なくとも1つのプログラムがあるBすることができないに変換され、Aのみローカルな変更では、その後、言語Bは厳密により表現の言語よりもありますA。ただし、より可能性の高いシナリオは、両方の言語の多くのプログラムが相互に翻訳できることですが、他の言語に翻訳できない両方の言語のプログラムがいくつかあります。これは、どちらの言語も他の言語よりも厳密に表現力がなく、異なるプログラムを異なる方法で表現できる異なる機能を備えていることを意味します。

これは、「より表現力豊か」であることの意味の正式な定義を提供しますが、現象の背後にある心理的概念をまだ捉えていません。たとえば、このモデルによると、構文糖はローカルの変更のみを使用して翻訳できるため、言語の表現力を高めることはありません。しかし、我々は持つことを経験から知っているFORWHILEIF彼らは条件付きのためだけ糖衣構文であっても、利用できるGOTO私達の意思表現ます簡単に

事実、異なる言語には異なる機能があり、それによって問題についてのさまざまな考え方を表現することがより簡単または難しくなります。また、意図を簡単に表現する方法を見つける人もいれば、別の方法を見つける人もいます。

StackOverflowのRubyタグで見つけた例:Rubyタグに従う多くのユーザーは、ループは再帰よりも理解しやすいと主張しており、再帰は高度な機能プログラマーのためのものであり、ループは初心者にとってより直感的ですが、次のようなコードを直観的に書く完全な新人:

def rock_paper_scissors
  get_user_input
  determine_outcome
  print_winner
  rock_paper_scissors # start from the top
end

これは通常、「これは機能しません」と「彼らはそれを間違っている」とコメントする複数の人々につながり、「正しい方法」はこれです:

def rock_paper_scissors
  loop do
    get_user_input
    determine_outcome
    print_winner
  end
end

ですから、明らかに、末尾の再帰がループ構造よりも「ループ」の概念を表現するためのより自然な方法である人がいます。

概要

2つの言語がチューリングと同等であるという事実は、チューリングマシンができるのと同じ数の自然数の関数セットを計算できるという1つの正確なことを示しています。それでおしまい。

これらの関数の計算速度については何も述べていません。それらの関数の表現のしやすさについては何も言っていません。そして、自然数の関数を計算する以外に何ができるかについては何も言っていません(例:Cライブラリへのリンク、ユーザーからの入力の読み取り、画面への出力の書き込み)。

それは、各プログラミング言語が実際に解決できる問題のクラスは、これらの言語がすべて完全に調整されているにもかかわらず、言語によって異なることを意味しますか?

はい。

  1. 画面への印刷など、「チューリング完全」という用語(自然数の関数の計算にのみ関係する)でカバーされない問題があります。2つの言語はチューリング完全にすることができますが、1つは画面への印刷を許可し、もう1つは許可しません。
  2. たとえ両方の言語が同じ問題を解決できたとしても、それはエンコーディングがどれほど複雑で、このエンコーディングを表現するのがどれほど簡単かについては何も言っていません。例えば、CでHaskellインタープリターを書くだけで、Haskellができるすべての問題を解決できます。しかし、この方法で問題を解決するには、まずHaskellインタープリターを書く必要があります。

7

すべてのチューリング完全プログラミング言語は、同じアルゴリズムのセットを実装できます。そのため、特定の言語で実装するのが非常に難しいアルゴリズムがある場合、それが不可能であることを意味するものではありません。

言語は構文とセマンティクスで構成されていることに注意してください。ある言語に属する単語のセットがチューリング完全と見なされるために最低限ではない場合があります。物事を簡単にする機能があります(それが機能と呼ばれる理由です)。これらの機能を削除しても、言語はチューリング完全です。

これらのいくつかは興味深いかもしれません:


5

すべてのチューリング完全言語は同じことを計算できます。

最新の言語を実装しようとすると、その機能のほとんどが計算機能を追加しないことに気付くでしょう。これらの機能の多くは、同じ言語に既に存在するより単純なものに下げることができます。

ここではいくつかの例を示します。

  • 列挙型がない場合は、整数を使用できます。
  • サイズがわかっているバッファーがない場合は、サイズを含む型とサイズがわからないバッファーを作成できます。
  • バッファの境界チェックがない場合は、使用するたびにインデックスをチェックするだけです。
  • 可変個の関数がない場合は、サイズを知っているバッファーを受け取る関数を作成し、そのバッファーから仮引数から取得するのと同じ情報を読み取ることができます。
  • 演算子がない場合は、関数を使用できます。
  • 相互に継承できる型がない場合は、相互に含まれる型を作成し、余分なレベルの間接参照を介してアクセスできます。包含型へのハンドル。
  • デリゲートはないが、関数ポインターはある場合は、参照先オブジェクトと関数ポインターを含む型を作成できます。
  • デリゲートはないがインターフェイスは持っている場合、必要な署名を持つ単一のメソッドを含むインターフェイスを宣言できます。
  • ジェネリック型がない場合は、関心のある上限または下限のみを想定する非ジェネリック型を使用できます(コンパイラを満足させるために、使用箇所で適切なキャストを実行することもできます)。
  • 線形/アフィン型システムがない場合は、変数を複数回使用することを避けることができます。
  • ...等々。

主流の言語設計は、物事をより速く計算し、ミスをより早く認識し、未知のコンポーネントに対してプログラムし、並列処理をより安全にするなど、より簡単便利機能に焦点を当てています。

純粋に計算的なものはずっと前に打ち落とされました。


4

既存の回答は、チューリングの完全性は言語を比較する良い方法ではないことを正しく指摘しています。実際、ほぼすべての言語はチューリング完全です。(「誰もが特別なら、誰も特別ではない」とインクレディブルは言っていました。)

ただし、言語の表現力を数学的精度と比較すること可能です。Felleisenの「プログラミング言語の表現力について」をご覧ください。大まかに言うと、次の質問をすることです。ローカルの変更のみを行うことで、言語Aのプログラムを言語Bのプログラムに変換できますか?言い換えれば、フェライゼンはあなたの直感に数学的に正確な形を与えます。


2

他の皆の答えに加えて、もう一つのアナロジーがあります。

衣服を洗うには、3つのものが必要です。水を保持するリザーバー、ある種の洗剤、攪拌機構です。これは多くの方法で実現できます。貯水池は、十分な水を保持するもの(浴槽、湖、川など)です。攪拌機構は、機械装置、洗濯板、または衣服が叩かれる岩でさえあり得る。また、洗剤にはさまざまな形があります。

それでは、現代のコンピューター化された洗濯機と川の隣の岩の違いは何ですか?

要約すると、効率、安全性、および利便性の3つです。一部の洗濯方法では、エネルギーの使用量が少なく、環境の汚染が少なく、水の使用量が少ないなどです。一部の洗濯方法では、手作業の繰り返しが少ない(負傷する)か、悪天候で屋外にいる必要があります。また、一部の洗濯方法では、人間がベビーシッターをする必要がありません。

チューリング完全プログラミング言語は汎用であるため、複数のタスクに使用されます。それにもかかわらず、特定のタスクでは、一部のプログラミング言語は他のプログラミング言語よりも効率的で、便利で、安全です(プログラムが実際に使用されたときに問題が少なくなるという意味で)。


2

他の人はたくさんの良い答えを提供しましたが、一度私をたくさん混乱させた1つの警告を明示的に言及しません:チューリング完全性は、言語がその入力から出力まで任意の計算可能な関数を表現できることを意味しません。それはより弱いです:計算可能な関数のセットのドメインと範囲を入力および出力として表現する何らかの方法がなければなりません。これらの各関数は、対応する出力への入力の表現を取るプログラムにマップします。

たとえば、チューリングマシンを表現する言語を考えてみましょう。言語の各プログラムはチューリングマシンです。

ここで、文字a、b、および空白のみを読み書きするすべてのチューリングマシンのサブ言語を検討します。これはチューリング完全ですが、たとえばcsを記述できないため、すべての入力でcを生成するプログラムを表現することはできません。asおよびbsの文字列としてエンコードされた入力および出力で、すべての計算可能な関数のみを表現できます。

したがって、すべてのチューリング完全言語が同じことを計算できるのは真実ではありません。これらのことを、潜在的な入力から潜在的な出力までの計算可能な関数に制限してもです。この言語では、特定の方法でエンコードされる入力および出力が必要になる場合があります。

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