どの計算モデルが文法を通して表現できますか?


18

これは文法プログラムの再定式化ですか?Vagによる以前の質問と、コメント作成者からの多くの提案。

文法はどのように計算のモデルを指定していると見ることができますか?たとえば、次のような単純な文脈自由文法を使用する場合

G ::= '1' -> '0' '+' '1'
      '1' -> '1' '+' '0'
      '2' -> '2' '+' '0'
      '2' -> '1' '+' '1'
      '2' -> '0' '+' '2'
      '3' -> '3' '+' '0'
      '3' -> '2' '+' '1'
      '3' -> '1' '+' '2'
      '3' -> '1' '+' '2'

パーサが区別されないと仮定すると、端末非終端私がここに実証されてきたように、シンボル、3までの番号については、単純な算術演算を行うことが可能です。

たとえば、文字列を取ります

"2 + 0 + 1"

この文字列でLR(1)パーサーを実行すると、計算の結果がツリーのルートに格納される次の具体的な構文ツリーが得られます。

           '3'
         /  |  \
        /   |   \
      '2'  '+'  '1'
     / | \
    /  |  \
  '2' '+' '0' 

したがって、文法をプログラムに、パーサージェネレーターをコンパイラーにすると、文法仕様言語をプログラミング言語と見なすことができますか?

さらに、セルオートマトンまたはラムダ計算でチューリング完全プログラムを構築する方法と同様の文法を指定して、チューリング完全プログラムを構築できますか?

つまり、言語を認識するという意味では、通常の言語有限状態オートマトンに対応し、コンテキストフリー言語プッシュダウンオートマトンに対応し、コンテキスト依存言語線形有界オートマトンに対応することが知られています。しかし、文法を計算デバイス(つまり、上記の例の意味でのプログラム)として見ると、チョムスキー階層の各クラスの文法の計算強度をどのように分類するのでしょうか?

また、次のような文法のあまり知られていないサブクラスについてはどうですか

編集:ちなみに、これは私自身の質問のちょっとした選択ですが、例の文法に開始記号を付けず、端末と非端末を区別する必要性に手を振ったことは言及しませんでした。技術的または伝統的に、私はおそらくこのようなより複雑な形式で文法を書く必要があると思います(Sは開始記号で、$はストリームの終端を表します)。

G ::= S -> R0 '$'
      S -> R1 '$'
      S -> R2 '$'
      R0 -> '0'
      R0 -> R0 '+' '0'
      R1 -> '1'
      R1 -> R0 '+' '1'
      R1 -> '1' '+' R0
      R1 -> R0 '+' '1' '+' R0
      R2 -> '2'
      R2 -> R0 '+' '2'
      R2 -> '2' '+' R0
      R2 -> R0 '+' '2' '+' R0
      R2 -> R1 '+' '1'
      R2 -> R1 '+' '1' '+' R0

...実際に何かが変わるわけではありませんが、言及する必要があると思いました。

編集: gascheの答えを読んだときに気になった他のことは、私の例のツリーの各ブランチはサブ計算を表しているということです。各プロダクションルールを、LHSが結果を表し、RHSがその引数を表す関数として見ると、文法の構造によって関数の構成方法が決まります。

つまり、パーサーのコンテキストと先読みメカニズムを組み合わせることで、適用する関数(パラメトリック多相性のような 'kinda')だけでなく、それらをどのように組み合わせて新しい関数を作成するかを決定するのに役立ちます。

少なくとも、曖昧さのないCFGについては、このように見ることができると思います。他の文法については、今のところ精神体操は私には少し多すぎます。


3
このような素敵で有望なアプライアンスである、Visibly Pushdown Automaton(ネストされた単語)について言及するのを忘れていました!一般的なプログラミング言語で書かれたプログラムを解析できるようにすることは、正規表現に対する最小限の改善であるように見えるため、重要です。(cis.upenn.edu/~alur/nw.html
浮浪人

1
おかげで、それは非常に興味深いです、私はそれを調べていません!私はまた、決定論的文脈自由のようにスキップされ、他のカップルがあります、ツリーに隣接するが、というようにインデックスを付け、私はちょうどそれが一つの質問のために非常に少しかもしれないと思った...しかし、多分私はそれらを追加します
Rehno Lindeque

1
@imz文法は、チョムスキー階層で正式に定義されているとおりです(つまり、プロダクションのセットとして)。私はあなたが言っていることを正確に主張しているので、文法はプログラムであるということは、単に文法で表現可能なプログラムのクラスを意味します(これが問題です)。
レノリンデケ11年

1
@imz正直に言うと、私はインデックス付き文法にあまり精通していないので、後付けとしてのみ追加しました。
レノリンデケ11年

1
この質問をLtUフォーラムに投稿するのは良い考えかもしれないと考え始めています。Btw @imz、おそらく質問を「文法のどのクラスがマークハマンの答えでユッカによって記述された「機能」の意味でのプログラムのどのクラスに対応するか」と読むのが最善でしょう。おそらく、私は...これをより明確にかかわらをしなければならない
Rehno Lindeque

回答:


10

Chomsky Type-0文法とチューリングマシンの間には1対1の対応があります。

これはThueプログラミング言語で利用され、初期文字列と文字列書き換えルールのセット(タイプ0文法に相当するセミThue文法)で指定されたチューリング完全プログラムを記述できます。

更新:

Thueのような難解な "Turing tar-pit"言語以外に、プログラマが独自の構文を拡張できるさまざまな汎用言語を使用して、構文解析コンパイル段階でチューリング完全な計算を実行できます。

Lispファミリーの言語、特にCommon Lispは、おそらく最も明白な例ですが、大まかに言えば、テンプレートScala、およびQi を使用したC ++など、常に停止する必要のない静的型チェックを備えた言語です。


しかし、問題は逆方向に機能するものに関するものです。ルールに従ってシンボルの初期シーケンスを書き換えることによって結果に到達する必要はありませんが、この質問の文法によって定義された計算の「結果」は初期です文法の規則に従って「入力」シーケンスを生成できるシンボル。
imz-イヴァンザカリヤシェフ

2
しかし、私が正しく理解している場合、2つのことは本質的に同等です:固定された初期シンボルから開始して、文法が入力シーケンスを生成できる場合にのみ、対応するチューリングマシンはそのシーケンスを受け入れます。受け入れ/拒否以外の結果を返す計算を検討したいが、それでも有限集合にある場合、初期シンボルの非決定的なチョーシュを追加する必要があります(実際には、それは単なる追加ルールです)。無限のセットで結果を許可するには、文字列を生成する文法を定義できますconcat(quote(in),out)TM(in)=out

Type0文法とTMの対応は、質問に対する有効な回答であることに同意します(特に、yes / no関数の計算に制限されている場合)。(続きする):入力-出力ペアを表現する方法をいくつかの規則を導入することによって、文法で任意のTMをモデル化するための更なる提案は、元の質問の意図関心と一致していないように思える
IMZ -イワンZakharyaschevを

私は、既存の文法フレームワークと対応するパーサーを正確に活用して計算を実行するための質問として理解しています。つまり、関数fと文法の間の変換の許可された形式は、次のようにしかできません: I)= S
imz-イヴァンザカリヤシェフ

1
表面的には、Thueプログラミング言語は、このような種類の文法フレームワークを使用するようには見えません。文法のような書き換えルールがありますが、入力からの結果の計算は、逆ではなくルールの方向になります。 Rehnoが望む方向。(ただし、おそらくプロダクションの矢印の方向を変更するだけの問題です。このQの意味での「パーサーとしての計算」文法をThueに変換することは、ルールの方向を変更することだけです。それはないだろう、確かに結果として開始シンボルに到着します。)?
IMZ -イワンZakharyaschev

6

私の答えは、形式的で、正確で、絶対にトピックになることを意図していません。Marc Hammanの答えは堅実だと思いますが、あなたの質問に関連するトピックについて考えさせられました。

文法は演ductiveシステムの特別な場合と見なされる場合があります。入力は判断であり、解析ツリーは判断の派生、または(文法)ルールに従って判断が有効であることの証明です。

その意味では、あなたの質問には、論理プログラミング/証明検索コミュニティ(私が考えているの一部のアプローチに関連している可能性がデイル・ミラー証拠ということです例えば)、検索がより多くの古典とは反対に、計算内容を持っています計算が証明正規化である場合の型/証明理論の観点。

注釈:私の答えを読み直しますが、ここでは「解析木構築は証明探索である」という考えは少し遠慮がちだと思います。証明探索はむしろ他の方向に流れます:与えられたかなり複雑な判断から始まり、証明の構造に作用する推論規則を繰り返し使用することにより、さらに証明する必要のないより単純な公理を達成することが望まれます。したがって、文法的には、複雑な判断を非終端として、原子を終端として、証明探索を単語生成問題として、または空でないテストとして見る方が自然でしょう。


しかし非常に興味深い発言。私の脳は...しかし、私の例では木の枝が、本質的に解析したルールに従って一緒に構成されているサブ計算を表し、今の良好な応答を与えるために少しも疲れだ
Rehno Lindeque

6

さらに、文法を指定してチューリング完全なプログラムを構築できますか?

私はあなたの質問を正しく理解したかどうかはわかりませんが、文字列書き換えシステムに基づいたプログラミング言語を探しているなら、おそらくマルコフアルゴリズム形式に基づいたRefal(Turing-文法のような文字列書き換えシステムでもある完全な形式主義)。


1
私は次のように質問を理解しました:Rehnoは、結果の計算として見られるブートムアップ解析プロセス(文法で定義)に興味があります。計算では、文法の生成規則とは逆の方向に進む部分から結果を構築する必要があります。Refalの書き換えルール(上記のThueプログラミング言語と同様のIIUC)は、(入力から結果まで)別の方向に向かっています。
imz-イヴァンザカリヤシェフ

しかし、今考えてみると、文脈依存文法には、プロダクションルールのLHSに複数のシンボルがあります。だから私は実際の実用的な違いはないと思います。状況依存言語のパーサーは、どのように正しく見ても文字列書き換えシステムになりますか?
レノリンデケ11年

@imzはRehnoの質問を明確にしてくれてありがとう。@Rehno「状況依存言語のパーサーは、どのように正しく見ても文字列書き換えシステムでしょうか?」—おそらく理にかなっています。
アルテムPelenitsyn

しかし、Refalの書き換えルールは非決定的に扱われますか?(言い換えると、Refalは動作中の書き換えパスの検索でバックトラッキングを行いますか?)この「計算としての解析」アプローチを逆方向の書き換えルールでモデル化する場合、非決定的なルールが必要です。のような文法を考えてくださいS -> A a; S -> B b; A -> 0; B -> 0。ルールを逆にしてこれをプログラムする場合、0「0a」または「0b」を評価するために、実行時に処理する異なるルールを選択する必要がありますS
imz-イヴァンザカリヤシェフ

6

(ちょっとした些細な考慮事項。コメントかもしれませんが、長すぎます。)

実際、あなたが説明することは、言語が何であるか(「言語」、その目的の人間の理解において)および文法が言語をどのように定義するかについての非常に自然な見方として効果的に見えます

言語は、意味値を与えるように解釈される(無限に多くの)正しい構文形式で構成されます

解釈が計算可能な場合、言語の構文形式は、セマンティック値を計算するプログラムと見なすことができます。

言語が有限デバイスとして実装されていると仮定すると、この言語の有限表現を「文法」と呼ぶことができます。この理解によると、文法は構文だけでなく、セマンティクス、つまり、その部分の値から式全体の意味値を計算する方法も考慮します(アトミック部分とその値は「辞書」に格納されます) 。

自然言語のいくつかの理論は、そのような形式(上記の考慮事項と一致する形式です;ここで@gascheの回答ですでに言及されています):入力の派生を検索する演ductive システム(セマンティックの計算と組み合わせて)値、または証明用語の作成;カリーハワード通信を参照)。したがって、そのようなシステムを見て、それらを文法と考えると、あなたの質問は簡単です。これらのシステムは、あなたが説明する方法で計算を実行するために正確に考案されています。

fGI f(I)=SISG

(実際、プログラミング言語の実際のコンパイラは、構文とセマンティクスの両方を備えたシステムのように見えます。プログラムの構文形式を実行可能ファイルに変換します。これは、単に開始記号ではなく、プログラムのセマンティックな意味です文法の。)


4

追加するだけ:

純粋な論理プログラムには、宣言的読み取りと手続き的読み取りがあります。このレポートでは、これらを文法的な読みで補完できるという考え方について説明します。この場合、句は文法の書き換え規則と見なされます。目的は、この視点が論理プログラミングからプログラミング言語に関する他の研究へ、またはその逆へ専門知識の移転を促進することを示すことです。そのような転送の例をいくつか説明します。一方、提示された文法ビューは、純粋な論理プログラミングに対するアドホックな拡張を正当化し、そのような拡張の理論的基盤の開発を促進します。

Pierre DeransartとJan Maluszynskiによる論理プログラミングの文法的見解


どうやら、Prologは属性の文法から生まれたため、このビューがロジックプログラミングを開始しました。
reinierpost 14

1

ペアノ数のようなものはどうですか:

S    -> int
int  -> zero
int  -> succ
zero -> "0"
succ -> "#" int

この形式の文字列(数字)を認識します:

0   // zero
#0  // one
##0 // two

そして、深さが数値であるネストされた構造を返す必要があります。

しかし、単に追加を実装したいときに複雑になり始めます:

S    -> int
int  -> sum
int  -> zero
int  -> succ
zero -> "0"
succ -> "#" int
sum  -> int "+" int

次のような整形式のintのみを認識するという点で、完全に理にかなっています。

#####0 + ####0

しかし、この文法は合計があるたびに解析ツリーに分割を導入するので、数値に直接マップする素敵な1分岐ツリーを使用する代わりに、式の構造がありますが、有効な値。したがって、計算は行われず、認識のみが行われます。問題は文法ではなく、パーサーかもしれません。代わりにidkを使用することもできます...頭に浮かぶもう1つの点は、計算を表現するための文法形式の妥当性です。ペアノの公理を見るとき(ハスケルのような表記法で):

1) Nat = Zero
2) Nat = Succ Nat
3) Sum ( Succ X ) ( Y ) = Succ ( X + Y )
4) Sum Zero X = X

3番目のルールは、変換を明示的に述べています。誰もが文脈自由文法規則で同じ量の意味を運ぶことを想像できますか?もしそうなら、どのように!?

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