3. Génération de chaînes, fonctionnement et dérivation

Une grammaire G est peut être utilisée soit pour générer les phrases du langage L(G) soit pour déterminer si une phrase donnée appartient ou non au langage L(G) :

On appelle application de règle, une dérivation directe. On étend cette notion à des suites finies d'applications de règles par les définitions qui suivent.


Dérivations

Soit G = (VT, VN, S, R) une grammaire.

  • On définit la relation "dérive directement de" sur V*, notée =G1⇒, par : ∀ z,z' ∈ V*, z =G1⇒ z' ⇔ ∃ t, u, v, w ∈ V*, z=uvw, et z'=utw, et v → t ∈ R
    z =G1⇒ z' est appelé une dérivation directe de z' à partir de z.
    De plus, si u ∈ VT* (resp. w ∈ VT*) alors uvw =G1⇒ utw est une dérivation à gauche (resp. à droite). Intuitivement, on remplace dans uvw le non terminal v le plus à gauche (resp. à droite) pour obtenir utw.
  • On appelle dérivation de longueur n (n ∈ N) toute suite s=u0, ...,un de chaînes de V* telle que u0 =G⇒ u1 et ... et un-1 =G⇒ un (ce que l'on abrège par u0 =G⇒ ... =G⇒ un)

Notations et terminologie : On écrit ⇒ pour =G⇒ quand il n'y a pas d'ambigüité sur la grammaire et =R⇒ pour désigner explicitement la règle utilisée. On adopte en outre les conventions suivantes pour les dérivations, où a est la première chaîne de la dérivation et b la dernière :

Pour reprendre les grammaires précédentes, nous avons les dérivations suivantes :

En conséquence de ces définitions, les formes sententielles d'une grammaire sont exactement les chaînes que l'on peut dériver à partir de son axiome S. On peut donc proposer une nouvelle définition d'une langage engendré par une grammaire, équivalente à la précédente.


Langage (version 2)

Soit G = (VT, VN, S, R) une grammaire :

  • Une chaîne a est une forme sententielle pour la grammaire G si et seulement si S =*⇒ a.
  • Le langage engendré par G est l'ensemble des chaînes de symboles terminaux que l'on peut dériver à partir de l'axiome S :
    L(G)={x ∈ VT* | S =+⇒ x}.

Cette définition n'est pas très différente de la précédente, mais elle permet de manipuler explicitement les dérivations, ce qui est pratique pour certaines démonstrations.

Si l'on revient sur l'exemple précédent, on peut maintenant montrer que le langage de la grammaire G0 coïncide exactement avec {0n1n | n ≥ 1}. Il faut pour cela montrer une double inclusion : {0n1n | n ≥ 1} ⊆ L(G0) et L(G0) ⊆ {0n1n | n ≥ 1}. Démonstration.

On a donc établi et illustré la façon dont une grammaire définit un langage. Il peut arriver qu'un même langage L soit atteint par deux grammaires différentes.


Grammaire équivalente

Deux grammaires G1 et G2 sont dites équivalentes si L(G1) = L(G2).

Par exemple, soit la grammaire G4=({0, 1}, {S, X}, S, R) avec R :

On pourrait montrer que cette grammaire définit le même langage que G0, c'est-à-dire L(G4)={anbn | n ≥ 1}=L(G0), par une démonstration du même type que la précédente. Autrement dit, G0 et G4 sont équivalentes (il en est de même avec G1 et G2).

Exercices et tests :

Exercice 3.1. Pour chacune des grammaires suivantes :

    1. Générer quelques mots à l'aide de dérivations successives ;
    2. Préciser leur longueur.

Gex1 = ({a,b,c}, {S}, S, {S → aSbSa | c})

Gex2 = ({a,b,ch,d}, {S,A,B,C}, S, {S → BCaCbbA ; A → CaCbb | ε ; Ca → ba ; Cbb → da ; B → cha})

Gex3 = ({a,b}, {S,A}, S, {S → Aa | bA ; A → Sa | bS})

Solution


E. Desmontils (IUP-MIAGe de Nantes)
Last modified: Thu Jan 27 11:08:51 CET 2005