回答:
言語Lの文法曖昧さを証明する(少なくとも)1つの方法があります。次の2つの手順で構成されます。
最初のステップは非常に明確です:文法が(少なくとも)必要な単語を生成すること、つまり正確であることを示します。
ことを第2段階を示し長さの単語のような多くの構文木を有するNとして、Lは長さの単語有するN 1と、これは曖昧を意味します- 。それは、チョムスキーとシュッツェンベルガー[1]に戻るGの構造関数を使用します。
構文木の数Gは、長さの単語を有するN。もちろん必要です| L n | これが機能するために。
良い点は、コンテキストなしの言語ではを(通常)簡単に取得できることですが、t nの閉じた形式を見つけるのは難しい場合があります。変換Gを非終端記号ごとに変数を持つ関数の方程式系に:
これは手ごわいように見えるかもしれませんが、例で明らかになるように、実際には単なる構文変換です。生成された終端記号はの指数でカウントされ、システムはGと同じ形式であるため、z nはGによってn個の終端を生成できるのと同じ頻度で発生します。詳細については、Kuich [2]を確認してください。
この方程式システム(コンピューター代数!)を解くと、ます。これで、係数を(「閉じた」一般的な形式で)プルする必要があります。TCSチートシートとコンピュータ代数は、多くの場合、そうすることができます。
ルール付きの単純な文法を考えます
。
それは明らかである(ステップ1、誘導によって証明)。2 nありますnが偶数の場合は長さnの 2回の回文、それ以外の場合は0。
方程式システムを設定する
その解決策は
。
の係数はパリンドロームの数と一致するため、Gは明確です。
これは良い質問ですが、いくつかのグーグルは、あいまいさを決定する一般的な方法がないとあなたに言ったでしょうので、あなたはあなたの質問をより具体的にする必要があります。
For some grammars, a proof by induction (over word length) is possible.
Consider for example a grammar over given by the following rules:
All words of length in -- there's only -- have only one left-derivation.
Assume that all words of length for some have only one left-derivation.
Now consider arbitrary for some . Clearly, . If , we know that the first rule in every left-derivation has to be ; if , it has to be . This covers all cases. By induction hypothesis, we know that there is exactly one left-derivation for . In combination, we conclude that there is exactly one left-derivation for as well.
This becomes harder if
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.
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)