Probleme – Mesurer l'ambiguïté
Exercice · niveau 3 (difficile) · informatique (MP2I/MPI), chapitre 30 — Grammaires non contextuelles
Énoncé
On veut savoir, sans l'inspecter à la main, si une grammaire est ambiguë.
- Écrire le calcul qui compte les arbres d'analyse d'un mot donné.
- L'appliquer à et à la grammaire à trois niveaux.
- Que devient l'ensemble des valeurs possibles d'une expression ambiguë ?
- Ce procédé décide-t-il l'ambiguïté d'une grammaire ?
Corrigé
1. Le calcul. Notons le nombre d'arbres d'analyse du facteur à partir du symbole . Pour une règle , on somme sur toutes les façons de découper le facteur :
avec si est le terminal et , et sinon. On calcule par mémoïsation sur les triplets : c'est la programmation dynamique du chapitre chap:dynamique, sur les intervalles.
Un piège de programmation, qu'il faut nommer. Si l'on énumère naïvement les découpages, un facteur vide attribué au premier symbole ramène au même triplet et la récursion boucle. On borne donc les découpages par la longueur minimale dérivable de chaque symbole, calculée d'avance par un point fixe. Sans cette précaution, le programme ne termine pas — et l'erreur ne se voit que sur les grammaires ayant un symbole annulable.
2. Les mesures.
| Mot | grammaire à trois niveaux | |
|---|---|---|
| `n+n*n` | arbres | arbre |
| `n*n+n` | arbres | arbre |
| `n+n+n` | arbres | arbre |
| `n+n*n+n` | arbres | arbre |
La grammaire à trois niveaux n'est ambiguë sur aucun mot de longueur au plus , et l'on a vérifié qu'elle engendre exactement les mêmes mots sans parenthèses que la version simplifiée, jusqu'à la longueur . Faiblement équivalentes, et une seule est utilisable.
3. L'ensemble des valeurs. Pour 2+3*4, les deux arbres donnent et . Le nombre de valeurs distinctes croît vite : c'est le nombre d'arbres, moins les coïncidences dues à l'associativité et à la commutativité.
Et c'est là qu'est le vrai danger. Une grammaire ambiguë ne choisit pas. Deux compilateurs conformes à la même grammaire peuvent donc calculer deux résultats différents pour le même programme, sans que ni l'un ni l'autre ne soit fautif. La spécification est incomplète, et le défaut ne se voit sur aucune exécution particulière : il se voit en changeant de compilateur.
4. Non, ce procédé ne décide rien. Il trouve un témoin d'ambiguïté quand il en existe un court. Il ne prouve jamais l'absence d'ambiguïté : avoir vérifié tous les mots de longueur au plus ne dit rien du mot de longueur .
Et il n'existe pas de procédé qui décide. Savoir si une grammaire non contextuelle est ambiguë est un problème indécidable — au sens exact du chapitre chap:decidabilite : aucun programme ne répond correctement pour toutes les grammaires. C'est un contraste frappant avec le chapitre chap:automates, où l'on savait décider l'équivalence de deux automates par un simple parcours.
Ce que l'on fait donc en pratique : on construit des grammaires non ambiguës par des recettes sûres — un niveau par priorité, la récursivité du côté de l'associativité voulue —, et l'on teste par le décompte ci-dessus. On ne cherche pas à décider après coup.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.