Si la dernière règle est présente, il est demandé que l'axiome n'apparaisse jamais dans le membre droit d'une règle.
Historique
La forme normale de Chomsky tient son nom du linguiste américain Noam Chomsky, qui a conçu également la hiérarchie qui porte son nom, et qui a décrit cette forme normale à cette occasion dans un article publié en 1959[1].
Variantes de définition
Une variante de la définition consiste à ne pas permettre le mot vide : seules des règles de la forme
ou ,
sont permises où , et sont des symboles non terminaux et est un symbole terminal. C'est la définition adoptée par exemple par Carton[2] ou Hopcroft et. al.[3]. Bien entendu, ces grammaires n'engendrent pas le mot vide.
Une autre variante[4],[5] demande que les membres droits de règles soient de longueur au plus 2, mais n'impose pas que les membres droits de longueur 2 soient formés exclusivement de symboles non terminaux. Une telle grammaire est appelée 2-forme normale ou « 2NF ».
Propriétés et utilisations
Toute grammaire écrite en forme normale de Chomsky est une grammaire non contextuelle. Inversement, toute grammaire hors contexte peut être transformée en une grammaire équivalente (c'est-à-dire engendrant le même langage) en forme normale de Chomsky.
À l'exception de la règle (3), toutes les règles d'une grammaire sous forme normale de Chomsky sont croissantes ; par conséquent, tout au long d'une dérivation, les longueurs des mots croissent. Ils croissent de 1 avec une règle de type (1), et restent de même longueur avec une règle de type (2). La dérivation d'un mot de longueur se fait donc toujours en étapes : il y a étapes de type (1) et étapes de type (2). De plus, dans la mesure où toutes les règles de dérivation de non-terminaux transforment un non-terminal en deux non-terminaux, un arbre de dérivation fondé sur une grammaire en forme normale de Chomsky est un arbre binaire avec nœuds internes et feuilles, et sa hauteur est au maximum la longueur de la chaîne de caractères.
Grâce à ces propriétés, de nombreuses preuves dans le domaine des langages formels deviennent plus simples en utilisant la forme normale de Chomsky (par exemple le fait que l'appartenance d'un mot au langage engendré est décidable). Plusieurs algorithmes généraux d'analyse syntaxique, comme l'algorithme de Cocke-Younger-Kasami, emploient cette forme normale.
Conversion d'une grammaire en forme normale de Chomsky
La conversion d'une grammaire en forme normale de Chomsky se fait par une suite de transformations simples, appliquées dans un certain ordre. La plupart des manuels de théorie des automates décrivent cette conversion[6],[7],[8],[9],[10],[11],[12]. Dans un article pédagogique, Lange et Leiß[13] décrivent soigneusement ces opérations, et ils donnent des noms aux étapes de la transformation ce qui facilite l'exposition. De plus, ils indiquent l'ordre à utiliser qui permet de garantir une complexité linéaire.
En général, la transformation est précédée d'une opération — appelée « réduction » chez
Carton 2008, (Section 2.1.2 : Grammaires réduites, p. 79) ou « eliminating useless symbols » chez Hopcroft, Motwani et Ullman 2007, (Section 7.1.1 : Eliminating useless symbols, p. 262) — qui sert à supprimer les variables inutiles. Une variable X est utile si elle figure dans une dérivation de l'axiome en un mot terminal; pour cela, elle doit être accessible à partir de l’axiome par une suite de dérivations, et être « coaccessible », au sens qu'elle doit pouvoir être dérivée en un mot terminal.
Chacune des cinq transformation suivantes (START, TERM, BIN, DEL, UNIT) établit une des propriétés requise par la forme normale de Chomsky. On les présente, en suivant Lange et Leiß, comme si elles s'appliquaient à une grammaire générale ; on verra plus loin que l'ordre d'application est important si on veut minimiser la complexité en temps. Dans ces ordres particuliers, certaines opérations sont plus simples, comme l'opération UNIT qui sert à éliminer les règles unité.
La complexité des opérations se mesure par rapport à la taille de la grammaire G donnée. Elle est définie simplement[13] comme la place que prend l'écriture des règles, sont
où la sommation porte sur toutes les règles de la grammaire. En particulier, une ε-règle contribue pour 1 dans la somme.
START : Suppression de l’axiome dans les membres droits de règles
Pour cela, on introduit un nouveau symbole qui devient l'axiome, et la règle
,
où est l’ancien axiome. Ceci ne modifie pas le langage engendré, et la variable ne figure pas dans un membre droit de règle.
TERM : Suppression des lettres terminales dans les membres droits de règles de longueur au moins 2
Si une lettre terminale figure dans un membre droit de règle de longueur au moins 2, on la remplace par une nouvelle et on ajoute la nouvelle règle
et on remplace la règle ci-dessus par
En fait, on fait ce remplacement simultanément pour toutes les occurrences de lettres terminales dans les membres droits de règles. Cela ne modifie pas le langage engendré, et augmente le nombre de règles d'au plus le nombre de lettres terminales. L'opération est donc linéaire en fonction de |G|.
BIN : Suppression des membres droits avec plus de deux symboles
On remplace une règle
,
par les règles
,
où les sont des nouveaux symboles non terminaux[14],[15]. Cette opération au plus triple la taille de la grammaire.
DEL : Élimination des ε-règles
Une ε-règle est une règle de la forme
,
où n'est pas l’axiome de la grammaire. On commence par déterminer les variables qui dérivent en ε ; ces variables, appelées annulables (« nullable » en anglais), se calculent par récurrence : X est annulable s'il existe une règle
telle que sont tous annulables.
Pour toute variable , annulable ou non, toute règle
est remplacée par toutes les règles obtenues en supprimant une ou plusieurs, voire toutes les variables annulables dans le membre droit de règle, puis on supprime toutes les ε-règles (à l'exception de celle de l'axiome si elle est présente)[16].
Par exemple, dans la grammaire suivante avec axiome S0,
S0 → AbB | C
B → AA | AC
C → b | c
A → a | ε
La variable A, et par conséquent B, sont annulables, et ni C ni S0 ne le sont. Dans la version intermédiaire suivante, on a coloré les variables à supprimer :
S0 → AbB | AbB | AbB | AbB | C
B → AA | AA| AA | AεA | AC | AC
C → b | c
A → a | ε
Après suppression des variables en vert, et des règles A → ε (d'origine) et B → ε (produite), on obtient la grammaire
S0 → AbB | Ab | bB | b | C
B → AA | A | AC | C
C → b | c
A → a
Cette grammaire engendre le même langage, sans ε-règles.
UNIT : Suppression des règles unité
Une règle unité est une règle de la forme
où et sont des variables, et plus généralement une règle
,
où toutes les variable de sont annulables. Pour éliminer ce type de règles, on la remplace
par la règle
pour chaque règle
sauf si c'est une règle unité précédemment enlevée[17]. Cette technique est complétée dans le cas de cycles (comme l'existence de trois règles ) par l'identification des variables d'un cycle : elles sont toutes remplacées par l'une d'entre elles. La transformation UNIT peut faire passer la taille de la grammaire de |G| à |G|2.
Ordre des transformations
Préservation des propriétés des transformations
✓ la transformation X préserve le résultat de Y ✗ la transformation X peut altérer le résultat de Y.
X\Y
START
TERM
BIN
DEL
UNIT
START
✓
✓
✓
✗
TERM
✓
✗
✓
✓
BIN
✓
✓
✓
✓
DEL
✓
✓
✓
✗
UNIT
✓
✓
✓
(✓)*
*UNIT conserve le résultat de DEL si START a été effectué au préalable.
L'ordre dans lequel les opérations sont appliquées est important pour deux raisons : d'abord, il est possible qu'une transformation puisse annuler l'effet d'une opération précédente ; par exemple, si on utilise START après UNIT, on réintroduit une règle unité. Sur la table, les ordres convenables sont indiqués.
Une autre raison pour choisir l'ordre des opérations avec soin est l'augmentation possible de la taille de la grammaire, et par là même la complexité des opérations. La taille de la grammaire résultat peut aller de |G|2 à 22|G| pour une grammaire de taille |G|[18]. L'augmentation dépend de l'ordre entre DEL et BIN. Il peut être exponentiel si DEL est opéré en premier, puisqu'une règle dont le membre droit est de longueur n peut produire 22n règles, et sinon est linéaire. UNIT peut provoquer une augmentation quadratique de la taille[4].
La plus petite augmentation de taille se produit pour les ordres (START,TERM,BIN,DEL,UNIT) et (START,BIN,DEL,UNIT,TERM).
Preuve de correction
Les divers manuels et cours de théorie des langages contiennent en général, en plus de l'exposé des procédures, des démonstrations de la correction des algorithmes. Une formalisation de ces opérations de réduction, à savoir la suppression de variables inutiles, l’élimination des règles unité et des epsilon-règles dans l’assistant de preuveCoq a été entreprise par Marcus V. M. Ramos
et Ruy J. G. B. de Queiroz[19]. Dans ce formalisme, Coq prouve que les opérations sont correctes en ce sens qu’ils préservent le langage engendré par la grammaire.
↑Romain Legendre et François Schwarzentruber, Compilation : analyse lexicale et syntaxique : Du texte à sa structure en informatique, Paris, Ellipse, , 312 p. (ISBN978-2-340-00366-8)
Olivier Carton, Langages formels, calculabilité et complexité : licence et master de mathématiques ou d'informatique, option informatique de l'agrégation de mathématiques, Paris, Vuibert, , 237 p. (ISBN978-2-7117-2077-4, présentation en ligne)
(en) John C. Martin, Introduction to languages and the theory of computation, McGraw-Hill Science/Engineering/Math, , 543 p. (ISBN978-0-07-232200-2 et 0072322004)
(de) Ingo Wegener, Theoretische Informatik : Eine algorithmenorientierte Einführung, Vieweg+Teubner Verlag, coll. « Leitfäden und Monographien der Informatik », , 238 p. (ISBN978-3-519-02123-0 et 3519021234)