Réponses:
Il existe (au moins) une façon de prouver l’ambiguïté d’une grammaire pourlangage L . Il se compose de deux étapes:
La première étape est assez claire: montrez que la grammaire génère (au moins) les mots que vous voulez, c'est l'exactitude.
La deuxième étape montre que a autant d'arbres de syntaxe pour les mots de longueur n que L a de mots de longueur n - avec 1. cela implique une ambiguïté. Il utilise la fonction de structure de G qui remonte à Chomsky et Schützenberger [1], à savoir
avec le nombre d'arbres de syntaxe G a pour les mots de longueur n . Bien sûr, vous devez avoir | L n | pour que cela fonctionne.
La bonne chose est que est (généralement) facile à obtenir pour les langages sans contexte, bien que trouver une forme fermée pour t n puisse être difficile. Transformez G en un système d'équations de fonctions avec une variable par non terminal:
Cela peut sembler intimidant, mais ce n'est en réalité qu'une transformation syntaxique, comme cela apparaîtra clairement dans l'exemple. L'idée est que les symboles terminaux générés sont comptés dans l'exposant de et que le système a la même forme que G , z n se produit le plus souvent dans la somme en tant que n bornes peuvent être générés par G . Consultez Kuich [2] pour plus de détails.
La résolution de ce système d'équation (algèbre informatique!) Donne ; il ne vous reste plus qu'à "tirer" le coefficient (sous forme fermée et générale). La triche TCS et l'algèbre informatique peuvent souvent le faire.
Considérez la grammaire simple avec des règles
.
Il est clair que (étape 1, preuve par induction). Il y a 2 n palindromes de longueurnsinest pair,0sinon.
Configuration des rendements du système d'équations
dont la solution est
.
Les coefficients de coïncident avec le nombre de palindromes, donc est sans ambiguïté.
This is a good question, but some Googling would have told you that there is no general method for deciding ambiguity, so you need to make your question more specific.
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)