# Forme normale de Chomsky

En informatique théorique, et notamment en théorie des langages, une grammaire non contextuelle est en forme normale de Chomsky si et seulement si toutes ses règles de production sont de la forme :
* $X\to YZ$ ;
* ou $X\to a$ ;
* ou $S\to \varepsilon$
où $X,Y,Z$ sont des symboles non terminaux, $a$ est un symbole terminal, $S$ est l'axiome de la grammaire, et $\varepsilon$ est le mot vide.
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.

## Variantes de définition

Une variante de la définition consiste à ne pas permettre le mot vide : seules des règles de la forme
    $X\to YZ$ ou $X\to a$,
sont permises où $X$, $Y$ et $Z$ sont des symboles non terminaux et $a$ est un symbole terminal. C'est la définition adoptée par exemple par Carton ou Hopcroft et. al.. Bien entendu, ces grammaires n'engendrent pas le mot vide.
Une autre variante$^,$ 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 $n>0$ se fait donc toujours en $2n-1$ étapes : il y a $n-1$ étapes de type (1) et $n$ é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 $2n-1$ nœuds internes et $n$ 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$^,$$^,$$^,$$^,$ $^,$ $^,$. Dans un article pédagogique, Lange et Leiß 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 comme la place que prend l'écriture des règles, sont
    $|G|=\sum _{X\to \alpha }|X\alpha |$
où la sommation porte sur toutes les règles $X\to \alpha$ 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 $S_{0}$ qui devient l'axiome, et la règle
    $S_{0}\to S$,
où $S$ est l’ancien axiome. Ceci ne modifie pas le langage engendré, et la variable $S_{0}$ 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 $a$ figure dans un membre droit de règle de longueur au moins 2, on la remplace par une nouvelle $N_{a}$ et on ajoute la nouvelle règle
    $N_{a}\to a$
et on remplace la règle ci-dessus par
    $X\to WN_{a}T$
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
    $X\to Y_{1}Y_{2}\cdots Y_{n}$,
par les règles
    $X\to Y_{1}Z_{1},\ Z_{1}\to Y_{2}Z_{2},\ldots ,\ Z_{n-2}\to Y_{n-1}Y_{n}$,
où les $Z_{i}$ sont des nouveaux symboles non terminaux$^,$. 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
    $X\to \varepsilon$,
où $X$ 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
    $X\to Y_{1}\cdots Y_{n}$ telle que $Y_{1},\ldots ,Y_{n}$ sont tous annulables.
Pour toute variable $X$, annulable ou non, toute règle
    $X\to Y_{1}\cdots Y_{n}$
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).
Par exemple, dans la grammaire suivante avec axiome S$_0$,
    S$_0$ → AbB | C
    B → AA | AC
    C → b | c
    A → a | ε
La variable A, et par conséquent B, sont annulables, et ni C ni S$_0$ ne le sont. Dans la version intermédiaire suivante, on a coloré les variables à supprimer :
    S$_0$ → 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
    S$_0$ → 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
    $X\to Y$
où $X$ et $Y$ sont des variables, et plus généralement une règle
    $X\to WYT$,
où toutes les variable de $WT$ sont annulables. Pour éliminer ce type de règles, on la remplace par la règle
    $X\to \alpha$
pour chaque règle
    $Y\to \alpha$
sauf si c'est une règle unité précédemment enlevée. Cette technique est complétée dans le cas de cycles (comme l'existence de trois règles $X\to Y,Y\to Z,Z\to X$) 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$ à 2$^{2|G|}$ pour une grammaire de taille |G|. 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 2$^{2n}$ règles, et sinon est linéaire. UNIT peut provoquer une augmentation quadratique de la taille.
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 preuve Coq a été entreprise par Marcus V. M. Ramos et Ruy J. G. B. de Queiroz. Dans ce formalisme, Coq prouve que les opérations sont correctes en ce sens qu’ils préservent le langage engendré par la grammaire.