TD 4 : grammaires
Exercice 1
Lemme d'Arden : est une solution de (et si ne contient pas , cette solution est unique).
- En pratique, il faut choisir la variable qui sera éliminée en premier. Ici, on va remplacer par sa valeur dans (on se permet de confondre les singletons avec leur élément par concision) :
D'après le lemme d'Arden, on a : .
On remplace dans : .
Encore une fois, avec le lemme : .
Et on termine en remplaçant et dans .
- On veut montrer que est toujours solution si contient le mot vide.
Si contient , alors ; de plus, est inclus dans , donc .
Donc est bien solution de l'équation .
-
Pour prouver le lemme, il faut montrer que est bien une solution, puis l'unicité (ce qu'on va faire en montrant qu'elle est la plus petite et la plus grande).
-
Montrons d'abord que est une solution de :
Or le produit de langages est associatif, donc .
-
Toute solution contient . Montrons par récurrence sur que : on a , et si , alors . Donc .
-
Dans le cas où ne contient pas le mot vide, toute solution est incluse dans . Soit un mot de le plus court possible tel que n'est pas dans . est dans , donc est :
- soit dans (impossible, car ) ;
- soit dans .
Donc avec dans et dans . Comme , , donc est dans par minimalité de . Donc est dans , donc dans : contradiction.
- On construit l'automate en créant un état par variable plus un état final, et on crée les transitions pour chaque règle (cf. cours).
Exercice 2
L'intuition naïve qu'on pourrait avoir serait "d'inverser" les membres droits de chaque règle. Cependant, cette méthode génère en fait le miroir du langage de la grammaire de départ.
À partir d'une grammaire linéaire droite , on peut obtenir un automate fini qui accepte le langage de la grammaire. Ensuite, on calcule l'automate qui accepte le langage miroir, ce qui permet d'obtenir une grammaire linéaire droite . Enfin, on inverse "naïvement" et on obtient une grammaire linéaire gauche de même langage que (on peut bien sûr effectuer l'opération inverse).
On peut aussi convertir en automate fini puis inverser les états initiaux et finaux du résultat, ainsi que toutes les transitions. FH : cette transformation correspond au calcul de l'automate miroir dans la solution ci-dessus. C'est une étape de la construction, mais elle ne répond pas totalement à la question.
Parenthèse sur un arbre de dérivation pour une grammaire régulière
Pour la dérivation :
S
/ \
a S
/ \
b T
|
eps
On peut avoir deux suites de dérivations différentes, mais le même arbre :
S
/ | \
S + S
| |
x x
Dans ce cas, on peut choisir de remplacer le premier ou le deuxième par , ce qui donne deux arbres distincts pour le même mot : la grammaire est ambiguë.
En remplaçant le deuxième, on trouve l'arbre suivant :
S
/ | \
S + S
| / | \
x S + S
| |
x x
Exercice 3
On est en présence d'une grammaire non linéaire (à cause de la première règle, qui mène à avec deux symboles non terminaux).
- Grammaire de départ, où l'on remplace le facteur par une variable (d'après les règles de , ) :
En renommant en :
Finalement, en supprimant la variable inutile :
Il faut garder à l'esprit que les grammaires hors contexte ne sont pas toutes équivalentes à des grammaires linéaires.
Exercice 4
Conversion de langages en grammaires.
-
:
-
:
D'ailleurs, cette grammaire est ambiguë : , mais aussi , qui correspondent à deux arbres différents : on a deux façons différentes de construire .
-
: , qui n'est pas ambiguë.
-
Les mots de Dyck : , qui est ambiguë.
-
Variante avec les parenthèses imbriquées dans l'ordre , puis , puis :
Exercice 5
-
Cette grammaire est hors contexte.
-
On exhibe deux arbres différents qui génèrent le même mot (cf. la parenthèse de l'exercice 2).
Problème : il est difficile d'évaluer l'expression (arithmétique) car on ne sait pas quel arbre choisir (la priorité de sur n'est pas imposée).
-
On peut se baser sur l'expression régulière : on trouve .
-
On ajoute la règle . Il n'y a pas de grammaire régulière qui décrit ce nouveau langage, car ce n'est pas un langage régulier (il faut compter les parenthèses ouvrantes non fermées).