文法が明確であることを証明する方法は?


25

私の問題は、文法が明確であることをどのように証明できますか?私は次の文法を持っています:

Sstatementif expression then Sif expression then S else S

これを明確な文法にすると、正しいと思います:

  • SS1S2

  • S1if expression then Sif expression then S2 else S1

  • S2if expression then S2 else S2statement

明確な文法には、用語ごとに1つの解析ツリーがあることがわかっています。

回答:


20

言語Lの文法曖昧さを証明する(少なくとも)1つの方法があります。次の2つの手順で構成されます。G=(N,T,δ,S)L

  1. 証明LL(G)
  2. 証明[zn]SG(z)=|Ln|

最初のステップは非常に明確です:文法が(少なくとも)必要な単語を生成すること、つまり正確であることを示します。

ことを第2段階を示し長さの単語のような多くの構文木を有するNとして、Lは長さの単語有するN 1と、これは曖昧を意味します- 。それは、チョムスキーとシュッツェンベルガー[1]に戻るGの構造関数を使用します。GnLnG

SG(z)=n=0tnzn

構文木の数Gは、長さの単語を有するN。もちろん必要です| L n | これが機能するために。tn=[zn]SG(z)Gn|Ln|

良い点は、コンテキストなしの言語ではを(通常)簡単に取得できることですが、t nの閉じた形式を見つけるのは難しい場合があります。変換Gを非終端記号ごとに変数を持つ関数の方程式系に:SGtnG

[A(z)=(A,a0ak)δ i=0k τ(ai) :AN] with τ(a)={a(z),aNz,aT.

これは手ごわいように見えるかもしれませんが、例で明らかになるように、実際には単なる構文変換です。生成された終端記号はの指数でカウントされ、システムはGと同じ形式であるため、z nGによってn個の終端を生成できるのと同じ頻度で発生します。詳細については、Kuich [2]を確認してください。zGznnG

この方程式システム(コンピューター代数!)を解くと、ます。これで、係数を(「閉じた」一般的な形式で)プルする必要があります。TCSチートシートコンピュータ代数は、多くの場合、そうすることができます。S(z)=SG(z)


ルール付きの単純な文法を考えますG

SaSabSbε

それは明らかである(ステップ1、誘導によって証明)。2 nありますL(G)={wwRw{a,b}}nが偶数の場合は長さnの 2回の回文、それ以外の場合は02n2nn0

方程式システムを設定する

S(z)=2z2S(z)+1

その解決策は

SG(z)=112z2

の係数はパリンドロームの数と一致するため、Gは明確です。SG G


  1. Chomsky、Schützenberger(1963)による文脈自由言語の代数理論
  2. Kuichによる文脈自由言語のエントロピーについて(1970)

3
@Raphaelを知っているように、あいまいさは決定できないため、少なくとも1つのステップを機械化することはできません。どれがいい?閉じたフォームを取得しますか?tn
マーティンバーガー

2
次数が高すぎる場合、方程式システムはアルゴリズム的に解けない場合があり、生成関数から正確な係数を引き出すことは(あまりにも)難しい場合があります。しかし、「実践」では、しばしば小さな「次数」の文法を扱います-たとえば、チョムスキーの正規形は小さな次数の方程式系につながることに注意してください-そして、係数の少なくとも ; これはあいまいさを確立するのに十分かもしれません。曖昧さを証明するために、係数を引っ張らずにS Lz = S Gz を示すだけで十分であることに注意してください。ただし、このアイデンティティを証明するのは難しいかもしれません。SL(z)=SG(z)
ラファエル

@Raphaelありがとう。たとえばチョムスキーの標準形を使用した場合でも、決定不能性がどのように作用するかを詳細に説明するテキストを知っていますか?(私はKuichを把握できません。)
マーティンバーガー

@MartinBergerあなたのコメントを再発見しました。長い沈黙でごめんなさい。一般に計算できない3つのステップがあります(私は思う):1)決定します。2)計算| L n | 。3)[ z n ] S gz )を決定します。特に、2)に使用するLの表現は何ですか?SG|Ln|[zn]Sg(z)L
ラファエル

表現が問題になるのはなぜですか?たとえば、コンパイラのCFGを表す複数の方法のいずれかを使用できます。たぶん、あなたはL nを表現する方法を意味しますか?LLn
マーティンバーガー14年

6

これは良い質問ですが、いくつかのグーグルは、あいまいさを決定する一般的な方法がないとあなたに言ったでしょうので、あなたはあなたの質問をより具体的にする必要があります。


2
OPは、アルゴリズムではなく、証明技術を要求します。
ラファエル

私もそう思います; それは質問で言及されるかもしれません。
reinierpost

1
グーグルは真実のオラクルではありません。なぜなら、知識は民主的ではなく、グーグルの結果はそうだからです。この場合、私はGoogleに頼りません。なぜなら、人々はしばしば、コピーするものの正確さをチェックせずに、あるものを別のものからコピーするからです。証拠を示さずに、彼らは間違っているかもしれません。
SasQ

5
@SasQ: You read my words too literally. What Google gives me is the URLs to aticles that explain things.
reinierpost

4

For some grammars, a proof by induction (over word length) is possible.


Consider for example a grammar G over Σ={a,b} given by the following rules:

SaSabSbε

All words of length 1 in L(G) -- there's only ε -- have only one left-derivation.

Assume that all words of length n for some nN have only one left-derivation.

Now consider arbitrary w=w1wwnL(G)Σn for some n>0. Clearly, w1Σ. If w1=a, we know that the first rule in every left-derivation has to be SaSa; if w1=b, it has to be SbSb. This covers all cases. By induction hypothesis, we know that there is exactly one left-derivation for w. In combination, we conclude that there is exactly one left-derivation for w as well.


This becomes harder if

  • there are multiple non-terminals,
  • the grammar is not linear, and/or
  • the grammar is left-recursive.

It may help to strengthen the claim to all sentential forms (if the grammar has no unproductive non-terminals) and "root" non-terminals.

I think the conversion to Greibach normal form maintains (un)ambiguity, to applying this step first may take care of left-recursion nicely.

The key is to identify one feature of every word that fixes (at least) one derivation step. The rest follows inductively.


3

Basically, it's a child generation problem. Start with the first expression, and generate it's children .... Keep doing it recursively (DFS), and after quite a few iterations, see if you can generate the same expanded expression from two different children. If you are able to do that, it's ambiguous. There is no way to determine the running time of this algorithm though. Assume it's safe, after maybe generating 30 levels of children :) (Of course it could bomb on the 31st)


1
The OP asks for proof techniques, not algorithms.
Raphael

2
that can't possibly be a way to prove if a grammar is ambiguous or not. As a matter of fact when that bombing happens is undecidable.
Sнаđошƒаӽ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.