web-dev-qa-db-ja.com

チューリングが完全ではない「有用な」プログラミング言語を持つことは実際に可能ですか?

言語が良いものであるためにはチューリング完全でなければならないことが受け入れられている場合、チューリング完全ではない「有用な」プログラミング言語を実際に持つことは可能ですか?

これは、従来の意味での「プログラミング」言語に関するものであり、マークアップ言語やクエリ言語ではないことを明確にしておく必要があります。

38
PhonicUK

CoqAgda[〜#〜] hol [〜#〜]ACL2 はチューリング完全ではありませんが、非常に有用で非常に強力な言語です。

それらを非チューリング完全にする一般的な機能は、終了を証明することが常に可能であるという事実です。非常に単純な制限で十分です。再帰呼び出しは、構造的に小さいと思われる条件でのみ許可されます。したがって、チューリング完全な言語のインタープリターを実装することはできませんが、言語自体 さえ実装できません 他の多くの便利な認定Cコンパイラ のように、まだ可能です。

49
SK-logic

イェッジの「ミニ言語」という用語は、言語がタスクを完了するためにチューリング完全性を必要としない特定の問題に言語を使用することがしばしば有用であるという事実を指していると思います。 -完全な言語をチューリングすると便利です。 https://sites.google.com/site/steveyegge2/language-grubbing

ウィキペディアは、私の腸が言ったことと同じように、これに非常によく答えています。最初は純粋な数学を考えていましたが、次に正規表現を思い出しました。ウィキペディアには、「純粋な数学」の流れにあると思われるエピグラムがリストされています。

http://en.wikipedia.org/wiki/Turing_completeness#Non-Turing-complete_languages

非チューリング完全言語

チューリング完全ではない多くの計算言語が存在します。そのような例の1つは、有限オートマトンによって生成される一連の正規言語、最も一般的には正規表現です。有限オートマトンのより強力ですが、まだチューリング完全ではない拡張は、プッシュダウンオートマトンとコンテキストフリー文法のカテゴリーです。これらは、プログラムのコンパイルの初期段階で解析ツリーを生成するために一般的に使用されます。さらなる例には、Direct3DおよびOpenGL拡張機能に埋め込まれたピクセルシェーダー言語の初期バージョンの一部、またはサイクルのないスプレッドシート内の一連の数式が含まれます。[引用が必要]すべての関数型プログラミング言語では、すべての関数が合計であり、チャリティーやエピグラムなどの終了。チャリティーは型理論とカテゴリー理論に基づく制御構造を使用しますが、エピグラムは依存型を使用します。

データ言語

チューリング完全性の概念は、XML、JSON、YAML、S式などの言語には適用されません。これらは通常、計算を記述するのではなく、構造化データを表すために使用されるためです。これらは、マークアップ言語、またはより正確には「データ記述言語」と呼ばれることもあります。

また、データ構造の表現は言語ではないことにも触れていますが、XSLTは計算の表現として数えるべきだと思います。XPathは、SQLが計算言語ではなくクエリ言語であるというYannisの上記の説明に基づいていない可能性があります。おそらくT-SQLまたはPL/SQLは計算言語としてカウントされますが、それらの集計を使用して大量の計算を行うことができるため、SQLの一般化された形式ではおそらく集計が指定されません。

12
Jimmy Hoffa

SQLはビジネスタイプの間で非常に人気があることを理解しています

9
Martin Beckett

チューリングの完全性は、言語が汎用言語として使用するのに適しているために必要です。しかし、それは十分ではありません、つまり、チューリング完全であるという理由だけで、すべての問題領域に適しているわけではありません。

  • ホワイトスペースはチューリング完全であることが証明されていますが、プログラマーエンターテイメント以外の問題領域には明らかに適していません。
  • C++テンプレートは完全なチューリングであることが証明されていますが、実際にテンプレートを使用してプログラム全体を作成することはありません。

逆に [〜#〜] dsl [〜#〜] は、チューリング完全性がなくても、それが設計された問題ドメインに適しています(実際には適切に設計されていたと想定しています)。

  • HTML* DOMツリーを説明する簡潔な方法を提供します。 JavaScriptは完全なチューリングであり、同じことを行うために使用できますが、はるかにノイズが多く、不明確です
  • XPathおよびその他のクエリ言語、埋め込みコードのないPCREなどは、すべて、それらが設計された単一のジョブのための強力なツールです。

* IIRCは、CSSアニメーションを含むHTMLが、一連のチェックボックスにConwayのGame of Lifeを実装するためにそれらを使用することにより、完全なチューリングであることを証明しました。しかし、HTMLの有用性は、CSSアニメーションをサポートしていないブラウザーでも維持されます。

5
back2dos

「効率的な」プログラムしか記述できないプログラミング言語は実際に存在します。この意味で効率的とは、そのような言語で記述されたすべてのプログラムがPの言語を表すことを意味します。 Bellantoni、Niggl、Schwichtenberg このような言語をここに記述してください

3
SpaceTrucker

Cプリプロセッサは(設計上)チューリング完全ではありませんが、 インタプリタを実装できますisの言語の場合完全なチューリング(ドキュメントで説明されているOrder-the-languageは、基本的にはありきたりの純粋に機能的なML/Schemeタイプのものであり、比較的目立たないでしょう-おそらく非常に使いやすく、そうでなければ異常な実装の場合はt)。

その背後にあるトリックは、有限の物理的宇宙にチューリングマシンを実装することに関する上記の引数に似ています。Cプリプロセッサは、infiniteの数を提供できませんステップまたはデータセルを言語に変換しますが、次のことができます。

  1. 不当に大きい動的数(デフォルトでは2 ^ 64程度)を提供し、指数展開プロセスを使用して最も現実的な問題を解決するのに十分な大きさ(mumble mumble宇宙の寿命mumble)。

  2. 上記の数値には任意の静的キャップを使用します。つまり、ステップ数は有限数でなければなりませんが、特定のキャップの値を変更できます "インタープリターエンジンの静的設定を変更することにより、コンパイル時。このキャップの実際の値には(理論的な)制限がないため、(理論的に)any終了プログラムのスペース要件に合わせて拡張できます。 。

Order自体が必ずしも「有用」であるとか、CPPで実装されたエンジンがそうであるとかを主張するのではなく、興味深い概念実証です。また、おそらく 動的に型付けされた であり、この領域では珍しいものです。

1
Leushenko