通常の言語はチューリング完全にできますか?


32

私はイオタとジョットについて読んでいたが、このセクションは混乱を招くことがわかった。

Iotaは、文字列の構文ツリーが左または右に分岐できるのとは異なり、Jot構文は一様に左分岐です。その結果、Iotaは厳密にコンテキストに依存しませんが、Jotは通常の言語です。

私の理解では、イオタとジョットはチューリング完全です。しかし、明らかに、1つはコンテキストに依存せず、もう1つは規則的です!確かに通常の言語はチューリングを完全にすることはできませんか?


3
チューリングマシンを記述する言語は、通常の言語で簡単に記述できます。たとえば、i = {0,1、-1}、b = {end of input}(i + bi + bi)+ b(i +)は空ではないルールのセットとそれに続く空ではない入力。または、むしろ、インタープリターがあれば、そのように解釈することができます。インタープリターは、答えが言及しているように、言語のクラスとは別の概念です。
キュービック

1
@Cubic:さらに言えば、チューリングマシンは、すべての数字が正確に1つのマシンを表すように番号を付けることができ(つまり、カウント可能)、それらの数字は単項表記で表現できます。私はこのことをきちんと研究したことがないので、定義に1*0苦労しなければなりませんが、プログラマーやコンパイラーライターにとってはとてもフレンドリーなプログラミング言語ではありませんが、普通の言語だと思います。
スティーブジェソップ

回答:


40

要するに、答えはイエスです。

ただし、「言語」という用語のまったく関係のない2つの意味が混同されています(そう、これは混乱を招きます)。

  • 文字列のセット。「文脈自由言語」とは、「文脈自由文法を使用して認識できる一連の文字列」を意味します。
  • 計算を指定する方法。「チューリング完全言語」とは、「チューリングマシンを指定できるプログラムを指定する方法」を意味します。

「言語」という言葉の2つの無関係な意味を使用して、完全に無関係な2つの観点から「C ++言語」について話すことができることに注意してください。

  • C ++文法に従って正当な一連の文字列としてのC ++
  • プログラムを指定する方法としてのC ++。

これら2つの観点から見た「C ++言語」の特徴は無関係です。

これらの概念を分離するのに役立つその他の例:

  • 「[az] + @ [az]。[az]」という表現は、有限オートマトン、つまり通常の言語で認識可能な一連の文字列を表します。ただし、それは-文字列のセット:プログラムを指定する方法ではないため(そのような各文字列をプログラムとして解釈する方法がない場合)、チューリングであるかどうかについて話すことは意味がありません。コンプリート。
  • フローチャートの言語は、プログラムを指定する方法です。フローチャートの特定のフレーバーに応じて、チューリング完全である場合とそうでない場合があります。ただし、フローチャートは文字列ではないため、「文字列のセットとしての言語」という意味でフローチャートについて話すことはまったく意味がありません。

3
私は追加することになり(([a-z][0-9]*)*[A-Z][0-9]*([a-z][0-9]*)*->([a-zA-Z][0-9]*)*)*、クラス0のいずれかの言語の文法を記述することができ、通常の言語である
Erburethは回復モニカ言う

2
{01}

10

Jotの法的プログラムのセットは定期的ですが、Jot自体はチューリング完全です。つまり、計算可能な各関数は、Jotで表現できます。すべてのバイナリ文字列は合法ですが、言語自体はチューリング完全(演習)である言語を考え出すことさえできます。構文とセマンティクスを混同しています。

ちなみに、コンテキストフリー言語も(おそらく)NP完全ではありません。多項式時間解析アルゴリズムを持っているからです。


9

最新のプログラミング言語の構文のみ(構文ツリーにエンコードされている)は、それらが行うすべてのこととはほど遠いものです。実際、エラーなしでコンパイルされる特定の言語のすべてのプログラムのセットによって定義された正式な言語は、ほとんどコンテキストフリーではありません

静的および動的なセマンティクスは、方程式を考慮します。これらは構文ツリーでは見えませんが、コードの一部が実際にプログラムであるかどうかと、それが計算するものを決定します。ボトムライン、コンテキストフリーの応答。「構文」で定義される通常の形式言語は、プログラミング言語の過大評価を与えます。

さて、あなたの質問に答えましょう。はい、可能です。たとえば、チューリング機械のゲーデル番号付けを考えてみましょう。それぞれがTMを表すすべての自然数の「プログラミング言語」を取得します。確かに、プログラミングに適した言語ではありませんが、確かにチューリング完全な言語であり、定期的であり、些細なことです。


3
  1. プログラミング言語は、チューリングマシンで計算可能なすべての関数を指定するのに十分な表現力がある場合、チューリング完全です。ここでは、プログラミング言語で指定さた言語の力について説明 ています。たとえば、Pythonでチューリングマシンのインタープリターを記述することは難しくないため、Pythonはチューリング完全なプログラミング言語です。

  2. プログラミング言語の構文、つまり、プログラミング言語の有効なプログラムに対応する文字列のセットは、それ自体が言語です。たとえば、可能なすべてのPythonプログラムのセットを検討します。プログラミング言語の構文は、コンテキスト依存コンテキストフリー正規などに。特定の文字列がプログラミング言語の有効なプログラムであることを確認することの難しさに興味があります(これはコンパイラー/インタープリターによって行われます)。プログラミング言語の構文がコンテキストフリーであると言うとき、その構文にはコンテキストフリーの文法があり、プログラムの妥当性をチェックするためのプッシュダウンオートマトンがあることを意味します。

プログラミング言語の構文の単純さは、そのプログラミング言語で指定されたプログラムの計算能力の制限を意味しないことに注意してください。


1

答えはイエスです。受け入れられた答えが示すように、文法はその意味とは無関係です。チョムスキー自身の言葉で:

文法は自律的であり、意味から独立していると結論付けざるを得ないと思います...

チョムスキー、構文構造(1956)

文法が計算可能なすべてのものを記述するのに十分な文を生成できる場合、その文に計算的意味を任意に割り当てることができます-計算可能なものごとに1つ。

実際の具体的な例として、人気のある言語whitespaceには通常の文法があり、場合によってはさらにx86 assembly languages検証が必要です。


パッセージはGoの文法が正式な意味で通常の言語であることを意味するとは思わない。文法が不規則ではない、つまり一貫しているということを意味しているだけだと思います。Goの構文が実際にChomsky階層の通常の言語である場合、たとえば、バランスのとれたネストされた括弧を生成できません。
tsleyson

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