« Forme normale de Greibach » : différence entre les versions

Un article de Wikipédia, l'encyclopédie libre.
Contenu supprimé Contenu ajouté
Rehtse (discuter | contributions)
m v1.41 - Correction syntaxique (Section « Notes et références » manquante - Orthographe et typographie)
ManiacParisien (discuter | contributions)
J'ai réécrit l'article, en me fondant sur le livre de Carton, après avoir essayé de rafistoler la version précédente
Ligne 1 : Ligne 1 :
En [[informatique]] et dans la théorie des [[Langages formels|langages formel]]<nowiki/>s, une [[grammaire hors-contexte]] est en forme normale de Greibach (GNF) si tous les membres à droite de chaque règle commencent par un [[Symboles terminaux et non terminaux|symbole terminal]], suivi par zéro ou plusieurs variables.
En informatique théorique, et notamment en théorie des [[langage formel|langages formels]], une [[grammaire algébrique]] est en '''forme normale de Greibach''' si les membre droits de ses règles commence tous par un [[symboles terminaux et non terminaux|symbole terminal]], suivi éventuellement d'une ou plusieurs [[symboles terminaux et non terminaux|variables]]. Une variante permet une règle additionnelle pour engendrer le [[mot (mathématiques)|mot vide]] s'il fait partie du langage. Cette forme normale porte le nom de [[Sheila Greibach]] qui l'a introduite et a prouvé son existence.


Plus précisément, une grammaire hors-contexte est dite en forme normale de Greibach, si toutes les règles de productions sont sous la forme:
D'autres formes normales de grammaire existent, comme la [[forme normale de Chomsky]], ou les grammaires sans [[récursivité gauche]]. La forme normale de Greibach est la plus élaborée de ces formes normales, et elle a été raffinée par la suite.


== Description ==
<math>A \to a A_1 A_2 \dots A_n</math>


Un grammaire algébrique est en '''forme normale de Greibach''' si toutes se règles sont de la forme :
ou bien
:<math>A \to a A_1 A_2 \cdots A_n</math>
ou
:<math>S \to \varepsilon</math>
où <math>A</math> est une [[symboles terminaux et non terminaux|variable]], <math>a</math> est une lettre, et
<math>A_1 A_2 \ldots A_n</math> est une suite éventuellement vide de variables ; <math>S</math> est l'axiome et ε est le [[mot (mathématiques)|mot vide]]<ref>{{harvsp|id=HU|Hopcroft|Ullman|1979|p=95}}.</ref>.


Une grammaire en forme normale de Greibach est notamment sans [[récursivité gauche]]. La propriété principale est que toute grammaire algébrique peut être transformée en une grammaire équivalent en forme normale de Greibach, théorème établi en 1965 par Sheila Greibach
<math>S \to \epsilon</math>
<ref name="Greibach1965">{{cite journal|last1=Greibach|first1=Sheila A.|title=A New Normal-Form Theorem for Context-Free Phrase Structure Grammars|journal=Journal of the ACM|volume=12|issue=1|month=janvier|year=1965|pages=42–52|doi=10.1145/321250.321254}}.</ref>.


Il existe plusieurs constructions. Lorsqu'il n'y a pas de epsilon-règle <math>S \to \varepsilon</math>, l'algorithme est plus simple ; il existe des transformations complexité en temps <math>O(n^4)</math> dans le cas général et en temps <math>O(n^3)</math> si la grammaire n'a pas de règle unité (de la forme <math>A \to B</math> pour une variable <math>B</math>)<ref>
La forme normale de Greibach a été inventée par [[Sheila Greibach]]<ref>{{Article|prénom1=Sheila A.|nom1=Greibach|titre=A New Normal-Form Theorem for Context-Free Phrase Structure Grammars|périodique=J. ACM|volume=12|numéro=1|date=1965-01-01|issn=0004-5411|doi=10.1145/321250.321254|lire en ligne=http://doi.acm.org/10.1145/321250.321254|consulté le=2016-12-09|pages=42–52}}</ref> et porte son nom.
{{cite journal
| first1 = Norbert | last1 = Blum
| first2 = Robert | last2 = Koch
| title = Greibach Normal Form Transformation Revisited
| journal = Information and Computation
| volume = 150 | issue = 1 | year = 1999 | pages = 112–118
| doi=10.1006/inco.1998.2772
|url=http://www.sciencedirect.com/science/article/pii/S0890540198927729?via%3Dihub}}.</ref>.


En forme normale de Greibach, une dérivation engendre, à chaque pas de dérivation, une lettre d'un mot du langage donnée : la longueur de la dérivation est donc égale à la longueur du mot. L a forme normale peut être utilisée, de manière équivalente, pour construire une [[automate à pile]] qui accepte les mots du langage en temps réel, c'est-à-dire qui lit une lettre du mot d'entrée à chaque pas de calcul.
Une des propriétés remarquable de la forme normale de Greibach est que pour une grammaire hors-contexte quelconque <math>G</math>, on peut construire une grammaire <math>G'</math> en forme normale de Greibach qui soit équivalente à <math>G</math> (i.e. vérifiant <math>L(G)=L(G')</math>).


== Construction ==
Il est alors nécessaire d’élaborer des méthodes permettant de construire une grammaire sous forme normale de Greibach équivalente à une grammaire hors contexte donnée.
La construction d'une grammaire en forme normale de Greibach à partir d'une grammaire algébrique donnée par partie des sujets traités dans de nombreux manuels d'informatique théorique sur les langages formels, les automates et leur complexité. Une des constructions est en plusieurs phases :


=== Phase préliminaire : suppression des epsilon-règles===
Il existe plusieurs méthodes pour mettre une grammaire hors contexte sous forme normale de Greibach. La taille de la grammaire obtenue dépend de la méthode utilisée mais dans le cas général, la taille de la grammaire <math>G'</math> obtenue à partir de <math>G</math> est en <math>O(|G|^4)</math>.
{{article détaillé|contenu=Article détaillé : [[Forme normale de Chomsky#DEL : Élimination des ε-règles |Élimination des ε-règles]]}}
On peut supposer que l'axiome de la grammaire ne figure pas dans un membre droit de règle<ref>On introduit, comme pour la construction de la [[Forme normale de Chomsky]], une nouvelle variable <math>S_0</math> qui devient l'axiome, et une unique règle supplémentaire <math>S_0\to S</math>, où <math>S</math> est l'ancien axiome.</ref>
Une règle <math>A \to \varepsilon</math>, où <math>A</math> n'est pas l'axiome, est supprimée ; on considère chaque règle <math>B \to \alpha</math> où <math>A</math> figure dans <math>\alpha</math>, et on ajoute, pour chaque occurrence <math>\alpha = \beta A \gamma</math>, la règle <math>B \to \beta \gamma</math> à la grammaire, sauf si on crée une epsilon-règle. Par exemple, si
:<math>B \to aAbAc</math>
on ajoute les trois règles
:<math>B \to abAc, B \to aAbc, B \to abc</math>.
Un règle dont le membre droit contient <math>n</math> variables qui toutes dérivent en le mot vide peut ainsi donner jusqu'à <math>2^n</math> nouvelles règles.


=== Deuxième phase : suppression des règles unité ===
== Forme normale de Greibach ==
{{article détaillé|contenu=Article détaillé : [[Forme normale de Chomsky#UNIT: Suppression des règles unité|Suppression des règles unité]]}}
=== Définition ===
Une ''règle unité'' est une règle de la forme <math>A\to B</math>, où <math>B</math> st une variable. Pour éliminer ce type de règles, on remplace une telle règle
Soit une grammaire <math>G=(V,\Sigma,S,\mathcal{P})</math> (en reprenant les notations de [[Grammaire non contextuelle]]), <math>G</math> est dite en forme normale de Greibach lorsque <math>\mathcal{P} \subset (V \times \Sigma V^*)\cup \{(S,\epsilon)\}</math>, autrement dit toutes les règles de cette grammaire sont de la forme :
par la règle
: <math>A\to \alpha</math>
pour chaque règle
: <math>B \to \alpha</math>
(sauf si c'est une règle unité précédemment enlevée<ref>{{harvsp|Hopcroft|Motwani|Ullman|2007|id=HopcroftEtAl2007|p=268}}.</ref>. Cette technique est complétée dans le cas de cycles (comme l'existence de trois règles <math>A \to B, B \to C, C \to A</math>) par l'identification des variables d'un cycle : elles sont toutes remplacées par l'une d'entre elles.


=== Mise sous forme normale ===
<math>A \to a \alpha</math> ou <math>S \to \epsilon</math>
On suppose la grammaire sans ε-règles et sans règles unité. On suppose les variables numérotées en <math>A_1,A_2,\dots, A_m</math> ; on définit une suite <math>G_0,G_1,\dots,G_n</math> de grammaires, où <math>G_0</math> est la grammaire initiale, avec la propriété que dans <math>G_i</math>, les variables <math>A_1,\ldots, A_i</math> n'apparaissent pas en tête des membres droits de règle. On suppose la grammaire <math>G_{i-1}</math> construite, et on procède en deux étapes


Avec <math>A \in V</math>, <math>a \in \Sigma</math>, <math>\alpha \in V^*</math> et <math>\epsilon</math> le mot vide (on rappelle que <math>\Sigma</math> est l'ensemble des symboles terminaux et <math>V</math> l'ensemble des symboles non-terminaux)
'''1. Suppression de la [[récursivité gauche]] pour <math>A_i</math>''' : on supprime les <math>A_i</math> en tête des règle de <math>A_i</math> : les règles
:<math>A_i \rightarrow A_i\alpha_1 \mid \ldots \mid A_i\alpha_n \mid \beta_1 \mid \ldots \mid \beta_m </math>
où les<math>\beta_j</math> ne commencent pas par <math>A</math> sont remplacées par
:<math>A_i \rightarrow \beta_1A'_i \mid \ldots \mid \beta_mA'_i \mid \beta_1 \mid \ldots \mid \beta_m </math>
:<math>A'_i \rightarrow \alpha_1A'_i \mid \ldots \mid \alpha_nA'_i \mid \alpha_1 \mid \ldots \mid \alpha_n</math>


'''2. Suppression des occurrences de <math>A_i</math> en tête''' : les occurrences de variables <math>A_j (1\le j\le i)</math> qui figurent ou peuvent apparaître en tête dans les membres droits de règles sont remplacées par l'ensemble des règles de ces variables.
<math>G</math> est dite en forme normale de quasi-Greibach<ref>{{Ouvrage|langue=français|auteur1=Arthur MILCHIOR|titre=Forme normale de Greibach|passage=1|lieu=|éditeur=|année=2008|pages totales=|isbn=|lire en ligne=https://www.irif.fr/~carton/Enseignement/Complexite/ENS/Redaction/2008-2009/arthur.milchior.pdf}}</ref> lorsque <math>\mathcal{P} \subset V \times (\Sigma V^* \cup \{\epsilon\})</math>, c'est-à-dire qu'en plus des règles ci-dessus, on peut aussi avoir :


Si, à la fin, il reste des lettres terminales dans les membres droits de règles autrement qu'en tête, on les remplace par une variable additionnelle <math>T_a</math>, une pour chaque lettre <math>a</math>, avec la règle <math>T_a\to a</math>.
<math>A \to \epsilon</math>


=== Exemples ===
=== Exemple ===
Voici un exemple tiré du livre d'Olivier Carton<ref name="C">{{harvsp|Carton|2008|p=}}.</ref> (on écrit <math>A, B, C</math> au lieu de <math>A_1, A_2, A_3</math> :
* La grammaire en forme normale de Greibach suivante engendre le langage des [[Palindrome|palindromes]] <math>\Sigma = \{a,b\}</math>:
<math>S \to aSA | bSB | \epsilon</math>


''Grammaire'' G<sub>0</sub> :
<math>A \to a</math>
: <math>A\to AB\mid a</math>
: <math>B\to BC\mid b</math>
: <math>C\to CA\mid c</math>
Les deux règles de <math>A</math> sont remplacées par
: <math>A\to aA'\mid a, \quad A'\to BA' \mid B</math>.
On obtient :


''Grammaire'' G<sub>1</sub> :
<math>B \to b</math>
: <math>A\to aA'\mid a</math>
* La grammaire en forme normale de Greibach suivante engendre le [[Langage de Łukasiewicz|langage de Lukasiewicz]] :
<math>S \to aSS | b</math>
: <math>A'\to BA'\mid B</math>
: <math>B\to BC\mid b</math>
: <math>C\to CA\mid c</math>
Les deux règles de <math>B</math> sont remplacées par
: <math>B\to bB'\mid b, \quad B'\to CB' \mid C</math>, et les occurrences en tête de <math>B</math>
sont remplacée par ces deux règles. On obtient :


''Grammaire'' G<sub>2</sub> :
=== Remarques ===
: <math>A\to aA'\mid a</math>
* Une grammaire en forme normale de Greibach ne possède pas de [[Récursivité gauche|récursivité à gauche]].
: <math>A'\to bB'A'\mid bA' \mid bB' \mid b</math>
* Une grammaire en forme normale de Greibach est en forme normale de quasi-Greibach
: <math>B\to bB'\mid b</math>
: <math>B'\to CB'\mid C</math>
: <math>C\to CA\mid c</math>
De même, les deux règles de <math>C</math> sont remplacées par, dans une première étape, par
: <math>C\to cC'\mid c, \quad C'\to AC' \mid A</math>,
mais la variable <math>A</math> en tête est remplacée par ses règles, de même que la variable <math>C</math> en tête. On obtient la grammaire :


''Grammaire'' G<sub>3</sub>
== Algorithme de transformation en forme normale de Greibach<ref>{{Ouvrage|langue=anglais|auteur1=Jürgen Albert, Dora Giammarresi, Derick Wood|titre=Normal Form Algorithms for Extended Context-Free Grammars|passage=|lieu=|éditeur=|année=2000|pages totales=|isbn=|lire en ligne=http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.25.7607&rep=rep1&type=pdf}}</ref> ==
: <math>A\to aA'\mid a</math>
Il existe plusieurs algorithmes pour transformer une grammaire hors-contexte en forme normale de Greibach, nous en présenterons un dans cette partie.
: <math>A'\to bB'A'\mid bA' \mid bB' \mid b</math>
: <math>B\to bB'\mid b</math>
: <math>B'\to cC'B'\mid cB'\mid cC'\mid c</math>
: <math>C\to cC'\mid c</math>
: <math>C'\to aA'C'\mid aC' \mid aA' \mid a</math>


== Autres formes normales ==
Cet algorithme se découpe en trois parties :
=== Forme normale quadratique ===
* Tout d'abord, on factorise la grammaire, c'est-à-dire que toutes les règles doivent être de la forme <math>A \to A_1 A_2 \dots A_n</math> ou <math>A \to a</math> avec <math>A, A_1, A_2, \dots, A_n \in V</math> et <math>a \in \Sigma</math>, et on retire les règles de la forme <math>A \to \epsilon</math> avec <math>A \in V</math>.
Un grammaire est sous '''forme normale quadratique''' de Greibach si toutes ses règles sont de la forme
* Puis on retire les [[Récursivité gauche|récursivités gauches]].
:<math>A\to aV</math>
* Enfin on fini la transformation en forme normale de Greibach
où <math>V</math> est composé d'au plus deux variables, donc si de plus les membres droits de règles sont de longueur au plus 3.
La grammaire ci-dessus, et la grammaire :
:<math>S\to aSS|b</math>
du [[langage de Lukasiewicz]] sont sous forme quadratique, la grammaire
:<math>S\to aSSS|b</math>
ne l'est pas. On peut la transformer en grammaire quadratique en groupant les occurrences consécutive ; ici, on introduit une nouvelle variable <math>T</math> et on remplace la grammaire par :
:<math>S\to aST|b,\quad T\to SS</math>
La grammaire n'est plus sous forme normale de Greibach, mais comme précédemment, on remplace la variable de tête dans la règle pour <math>T</math>, ce qui donne <math>T\to aSSSS\mid bS</math>, d'où
:<math>S\to aST|b,\quad T\to aTT\mid bS</math>.
=== Forme normale bilatère ===
Un grammaire est sous '''forme normale bilatère''' ou forme normale '''double''' de Greibach si toutes ses règles débutent et finissent par une lettre terminale, formellement si les membres droits de règles sont dans <math>\Sigma\cup\Sigma V^*\Sigma</math>, où <math>\Sigma</math> et <math>V</math> sont l'alphabet terminal et non terminal de la grammaire. Une grammaire est sous '''forme normale bilatère quadratique''' si les membres droits de règles sont dans <math>\Sigma\cup\Sigma(\varepsilon\cup V\cup V^2)\Sigma</math>, donc si de plus les membres droits des règles sont de longueur inférieure ou égale à 4. Cette construction a été introduite par Günter Hotz<ref>
{{article
|auteur=Günter Hotz
|titre=Normal form transformations of context-free grammars
|périodique= Acta Cybernetica
|volume4|numéro=1|pages=65-84|année=1978}}.
</ref>{{,}}<ref name="Engelfriet1992">
{{cite journal
|last1=Engelfriet|first1=Joost
|title=An elementary proof of double Greibach normal form
|journal=Information Processing Letters
|volume=44|issue=6|year=1992|pages=291–293
|doi=10.1016/0020-0190(92)90101-Z}}.
</ref>.


== Autres constructions ==
=== Grammaire factorisée et propre ===
Un autre construction, plus algébrique, a été proposée par Daniel J. Rosenkrantz<ref>

{{article
==== Suppression des règles <math>A \to \epsilon</math> ====
|auteur= Daniel J. Rosenkrantz
Pour chaque règle <math>A \to \epsilon</math>, où <math>A</math> n'est pas l'axiome, on regarde chaque règle <math>B \to \alpha</math> telle que <math>A</math> apparaît dans <math>\alpha</math>, puis en posant, pour chaque apparition de <math>A</math>, <math>\alpha = \beta A \gamma</math>, on ajoute la règle <math>B \to \beta \gamma</math>, et enfin on supprime la règle <math>A \to \epsilon</math>.
|titre= Matrix equations and normal forms for context-free grammars

|journal = [[Journal of the ACM]]
==== Factorisation ====
|volume =14 |numéro=3|mois=juillet|année = 1967|pages = 501–507}}.
Pour chaque règle <math>A \to \alpha</math>, lorsque <math>\alpha</math> n'est pas simplement une lettre de <math>\Sigma</math>, pour tout terminal <math>a</math> de <math>\alpha</math>, on ajoute le non-terminal <math>A'</math>, on ajoute une règle <math>A' \to a</math> et on remplace tous les <math>a</math> de <math>\alpha</math> par <math>A'</math>.
</ref>{{,}}<ref name="C" />. Elle repose sur la résolution d'un système d'équations dans l'algèbre des parties sur un monoïde libre. Cette méthode conduit directement à une grammaire quadratique si on part d'une grammaire sous [[forme normale de Chomsky]]. D'autres constructions, et des généralisations, ont été données par divers auteurs<ref name="Yoshinaka2009">{{cite journal|last1=Yoshinaka|first1=Ryo|title=An elementary proof of a generalization of double Greibach normal form|journal=Information Processing Letters|volume=109|issue=10|year=2009|pages=490–492|doi=10.1016/j.ipl.2009.01.015}}.</ref>.

=== Suppression des récursivités gauches ===

L'objectif de cet algorithme est de supprimer les récursivités gauches dans une grammaire :

étant donné une grammaire <math>G</math> on veut construire une grammaire <math>G'</math> vérifiant <math>L(G)\ =\ L(G')</math> et telle que l'on n'ai pas de dérivation de la forme <math>A\ \to^* A\alpha </math> où <math>\alpha \in (\Sigma \cup V)^*</math>.

Dans la suite les idées de démonstration des algorithmes et les commentaires seront entre parenthèses.

On applique l'algorithme suivant à notre grammaire :
: '''Entrée''' ''Une grammaire : un ensemble de non-terminaux <math>A_1,\ldots,A_n</math> et leurs règles.''
: '''Sortie''' ''Une grammaire modifiée générant le même langage mais sans récursivité gauche.''
:# ''Pour <math>i</math>'' ''allant de 1 à <math>n</math>: ( à la fin de la i-ème boucle la grammaire <math>G'</math>'' ''obtenue vérifiera <math>L(G)\ =\ L(G')</math>'' ''et <math>\forall k \in [| -i;i|] </math>'' '': si <math>A_k\ \to\ A_l\ \beta \in \mathcal{P} </math> avec <math>\beta\in (\Sigma \cup V)^* </math> alors <math>k < l </math>. Cette assertion est l'invariant de boucle à utiliser pour démontrer l'algorithme )''
:## ''Répéter jusqu'à ce qu'une itération laisse la grammaire inchangée : (dans cette boucle on construit <math>G'</math>'' ''telle qu'il n'y ait pas de règle de la forme : <math>A_i\ \to\ A_j\ \beta \in \mathcal{P} </math> avec <math>\ \beta\in (\Sigma \cup V)^* </math> et <math>j<i </math>)''
:### ''Pour chaque règle <math>A_i\rightarrow\alpha</math> :''
:#### ''Si <math>\alpha = A_j \beta</math>'' ''avec <math>j<i</math> :''
:##### ''Supprimer la règle <math>A_i\rightarrow\alpha</math>.''
:##### ''Pour chaque règle <math>A_j\rightarrow\gamma</math>:''
:###### ''Ajouter la règle <math>A_i\rightarrow\gamma\beta</math>.''
:## ''Ajouter le non-terminal <math>A_{-i}</math>. ( l'indice -i permet de conserver l'indexation des non-terminaux initiale tout en conservant la propriété énoncée en début de boucle )''
:## ''Pour chaque règle <math>A_i\rightarrow\alpha</math> : ( dans cette boucle, on construit''' <math>G'</math>''' telle qu'il n'y ait pas de récursivité gauche directe avec <math>A_i </math> c'est-à-dire de règle de la forme : <math>A_i\ \to\ A_i\ \beta \in \mathcal{P} </math> avec <math>\beta\in (\Sigma \cup V)^* </math>)''
:### ''Si'' ''<math>\alpha = A_i \beta</math> :''
:#### ''Supprimer la règle <math>A_i\rightarrow\alpha</math>''
:#### ''Ajouter la règle <math>A_{-i} \to \beta A_{-i}|\beta</math>''
:### ''Sinon :''
:#### ''Ajouter la règle <math>A_i \to \alpha A_{-i}</math>''
On a ainsi supprimé les récursivités gauches et le langage engendré par la grammaire obtenue reste le même.

Notre nouvelle grammaire possède <math>2n</math> non-terminaux :

<math>A_{-n},\dots,A_{-1},A_1,\dots,A_n</math>

=== Dernière étape ===
Une fois ces étapes terminées, nous pouvons définir une relation d'ordre stricte :

<math>A < B \Longleftrightarrow \exists \alpha \in (V\cup \Sigma)^*\ tq\ A \to^*B\alpha</math>

On peut ainsi poser <math>A_1,A_2,\dots A_m</math> l'ensemble des non-terminaux avec la relation <math>(*)</math> :

<math>A_i < A_j \Longrightarrow i < j</math>

Attention : l'ordre défini ci-dessus n'est pas total, c'est-à-dire que la réciproque de cette dernière implication n'est pas vraie.

Il peut exister plusieurs façons d'indexer les non-terminaux de manière à respecter <math>(*)</math>, par exemple l'indexation obtenue dans la partie précédente vérifie <math>(*)</math>.

On exécute ensuite l'algorithme suivant :
: '''Entrée''' ''Une grammaire : un ensemble de non-terminaux <math>A_1,\ldots,A_m</math> et leurs règles, vérifiant la relation'' <math>(*)</math>
: '''Sortie''' ''Une grammaire modifiée générant le même langage en forme normale de Greibach.''
:# ''Pour <math>i</math> allant de <math>m</math> à 1 :''
:## ''Tant que l'ensemble des règles <math>A_i \to \alpha \in \mathcal{P}</math> est changé :''
:### ''Pour chaque règle <math>A_i \to \alpha</math> :''
:#### ''Si <math>\alpha = \alpha_1 b A_{j_1}\dots A_{j_k}</math> avec <math>\alpha_1 \in (\Sigma \cup V)^*\ ,\ \alpha_1 \neq \epsilon</math>, <math>b \in \Sigma</math> et <math>A_{j_1},\dots,A_{j_k} \in V</math> :''
:##### ''On ajoute un non terminal <math>B</math>''
:##### ''On ajoute la règle <math>B \to b A_{j_1}\dots A_{j_k}</math>''
:##### ''On remplace la règle <math>A_i \to \alpha</math> par la règle <math>A_i \to \alpha_1 B</math>''
:## ''Pour chaque règle <math>A_i \to \alpha</math> :''
:### ''Si <math>\alpha = A_j \beta</math> avec <math>\beta \in V^*</math>:''
:#### ''Supprimer la règle <math>A_i \to \alpha</math>''
:#### ''Pour chaque règle <math>A_j \to \gamma</math> :''
:##### ''Ajouter la règle <math>A_i \to \gamma \beta</math>''


== Notes et références ==
== Notes et références ==
{{Références}}
{{Références}}

== Bibliographie ==
; Manuels
<!-- Carton -->
* {{Ouvrage| auteur=Olivier Carton | titre=Langages formels, calculabilité et complexité | éditeur=Vuibert | année=2008 | isbn=978-2-7117-2077-4 | url= https://gaati.org/bisson/tea/lfcc.pdf | id=Carton2008}} {{commentaire biblio SRL| Section 2.5 Forme normale Greibach}}.
<!-- Hopcroft -->
* {{Ouvrage
| auteur1 = [[John Hopcroft|John E. Hopcroft]]
| auteur2 = [[Jeffrey Ullman|Jeffrey D. Ullman]]
| titre = Introduction to Automata Theory, Languages and Computation
| éditeur = Addison-Wesley
| année = 1979
| id=HU
}}
* {{Introduction to Automata Theory, Languages, and Computation}}
* {{Ouvrage | langue = en | auteur1 = John E. Hopcroft | auteur2 = Rajeev Motwani | auteur3 = Jeffrey D. Ullman | titre = Introduction to Automata Theory, Languages, and Computation | éditeur = Pearson Addison Wesley | numéro d’édition = 3 |lieu = | année = 2007 | pages totales = xvii+535 | isbn = 0-321-45536-3 }} — page 277.
<!-- Linz -->
*{{Ouvrage | langue = en | auteur = Peter Linz | titre = An Introduction to Formal Languages and Automata | éditeur = Jones & Bartlett Learning | lieu = | année = 2001 | pages totales = 410 | isbn = 9780763714222 | isbn2 = 0763714224}}.
<!-- Erk Priese -->
* {{Ouvrage | langue = de | auteur1 = Katrin Erk | auteur2 = Lutz Priese | titre = Theoretische Informatik : eine umfassende Einführung | éditeur = Springer | lieu = Berlin | année = 2008 | pages totales = | isbn = 9783540763192 | oclc = 244015158}} {{commentaire biblio SRL| 6.8.1 6.3 Chomsky- und Greibach-Normalform {{p.|121}}}}.
* {{Ouvrage | langue = en | auteur = Michael A. Harrison | titre = Introduction to Formal Language Theory | éditeur = Addison-Wesley | lieu = Reading, Mass. [u.a.] | année = 1978 | pages totales = | isbn = 0201029553 | oclc = 266962302}} {{commentaire biblio SRL|Section 4.6 Greibach normal form, {{p.|111-120}}}}.
; Cours
* {{Lien web
|url=https://www.irif.fr/~carton/Enseignement/Complexite/ENS/Redaction/2008-2009/arthur.milchior.pdf
|titre=Forme normale de Greibach
|série=Rédactions cours ENS (Olivier Carton)
|auteur=Arthur Milchior
|année= 19 décembre 2008
}}.
* {{Lien web
|url=http://www-igm.univ-mlv.fr/~desar/Cours/automates/ch4.pdf
|titre= Chapitre 4.4 La forme normale de Greibach
|série=Cours automates
|auteur=Jacques Désarménien
|éditeur= Université Paris-Est Marne-la-Vallée
}}.
* {{Lien web
|langue=
|url=http://deptinfo.unice.fr/~julia/AL/07al.pdf
|titre= Cours 7 - Grammaires hors contexte (suite)
|série=Automates & Langages
|auteur=Sandrine Julia
|éditeur= Université de Nice - Sophia Antipolis
}}.


== Voir aussi ==
== Voir aussi ==

Version du 11 février 2017 à 08:31

En informatique théorique, et notamment en théorie des langages formels, une grammaire algébrique est en forme normale de Greibach si les membre droits de ses règles commence tous par un symbole terminal, suivi éventuellement d'une ou plusieurs variables. Une variante permet une règle additionnelle pour engendrer le mot vide s'il fait partie du langage. Cette forme normale porte le nom de Sheila Greibach qui l'a introduite et a prouvé son existence.

D'autres formes normales de grammaire existent, comme la forme normale de Chomsky, ou les grammaires sans récursivité gauche. La forme normale de Greibach est la plus élaborée de ces formes normales, et elle a été raffinée par la suite.

Description

Un grammaire algébrique est en forme normale de Greibach si toutes se règles sont de la forme :

ou

est une variable, est une lettre, et est une suite éventuellement vide de variables ; est l'axiome et ε est le mot vide[1].

Une grammaire en forme normale de Greibach est notamment sans récursivité gauche. La propriété principale est que toute grammaire algébrique peut être transformée en une grammaire équivalent en forme normale de Greibach, théorème établi en 1965 par Sheila Greibach [2].

Il existe plusieurs constructions. Lorsqu'il n'y a pas de epsilon-règle , l'algorithme est plus simple ; il existe des transformations complexité en temps dans le cas général et en temps si la grammaire n'a pas de règle unité (de la forme pour une variable )[3].

En forme normale de Greibach, une dérivation engendre, à chaque pas de dérivation, une lettre d'un mot du langage donnée : la longueur de la dérivation est donc égale à la longueur du mot. L a forme normale peut être utilisée, de manière équivalente, pour construire une automate à pile qui accepte les mots du langage en temps réel, c'est-à-dire qui lit une lettre du mot d'entrée à chaque pas de calcul.

Construction

La construction d'une grammaire en forme normale de Greibach à partir d'une grammaire algébrique donnée par partie des sujets traités dans de nombreux manuels d'informatique théorique sur les langages formels, les automates et leur complexité. Une des constructions est en plusieurs phases :

Phase préliminaire : suppression des epsilon-règles

On peut supposer que l'axiome de la grammaire ne figure pas dans un membre droit de règle[4] Une règle , où n'est pas l'axiome, est supprimée ; on considère chaque règle figure dans , et on ajoute, pour chaque occurrence , la règle à la grammaire, sauf si on crée une epsilon-règle. Par exemple, si

on ajoute les trois règles

.

Un règle dont le membre droit contient variables qui toutes dérivent en le mot vide peut ainsi donner jusqu'à nouvelles règles.

Deuxième phase : suppression des règles unité

Une règle unité est une règle de la forme , où st une variable. Pour éliminer ce type de règles, on remplace une telle règle par la règle

pour chaque règle

(sauf si c'est une règle unité précédemment enlevée[5]. 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.

Mise sous forme normale

On suppose la grammaire sans ε-règles et sans règles unité. On suppose les variables numérotées en  ; on définit une suite de grammaires, où est la grammaire initiale, avec la propriété que dans , les variables n'apparaissent pas en tête des membres droits de règle. On suppose la grammaire construite, et on procède en deux étapes

1. Suppression de la récursivité gauche pour  : on supprime les en tête des règle de  : les règles

où les ne commencent pas par sont remplacées par

2. Suppression des occurrences de en tête : les occurrences de variables qui figurent ou peuvent apparaître en tête dans les membres droits de règles sont remplacées par l'ensemble des règles de ces variables.

Si, à la fin, il reste des lettres terminales dans les membres droits de règles autrement qu'en tête, on les remplace par une variable additionnelle , une pour chaque lettre , avec la règle .

Exemple

Voici un exemple tiré du livre d'Olivier Carton[6] (on écrit au lieu de  :

Grammaire G0 :

Les deux règles de sont remplacées par

.

On obtient :

Grammaire G1 :

Les deux règles de sont remplacées par

, et les occurrences en tête de

sont remplacée par ces deux règles. On obtient :

Grammaire G2 :

De même, les deux règles de sont remplacées par, dans une première étape, par

,

mais la variable en tête est remplacée par ses règles, de même que la variable en tête. On obtient la grammaire :

Grammaire G3

Autres formes normales

Forme normale quadratique

Un grammaire est sous forme normale quadratique de Greibach si toutes ses règles sont de la forme

est composé d'au plus deux variables, donc si de plus les membres droits de règles sont de longueur au plus 3. La grammaire ci-dessus, et la grammaire :

du langage de Lukasiewicz sont sous forme quadratique, la grammaire

ne l'est pas. On peut la transformer en grammaire quadratique en groupant les occurrences consécutive ; ici, on introduit une nouvelle variable et on remplace la grammaire par :

La grammaire n'est plus sous forme normale de Greibach, mais comme précédemment, on remplace la variable de tête dans la règle pour , ce qui donne , d'où

.

Forme normale bilatère

Un grammaire est sous forme normale bilatère ou forme normale double de Greibach si toutes ses règles débutent et finissent par une lettre terminale, formellement si les membres droits de règles sont dans , où et sont l'alphabet terminal et non terminal de la grammaire. Une grammaire est sous forme normale bilatère quadratique si les membres droits de règles sont dans , donc si de plus les membres droits des règles sont de longueur inférieure ou égale à 4. Cette construction a été introduite par Günter Hotz[7],[8].

Autres constructions

Un autre construction, plus algébrique, a été proposée par Daniel J. Rosenkrantz[9],[6]. Elle repose sur la résolution d'un système d'équations dans l'algèbre des parties sur un monoïde libre. Cette méthode conduit directement à une grammaire quadratique si on part d'une grammaire sous forme normale de Chomsky. D'autres constructions, et des généralisations, ont été données par divers auteurs[10].

Notes et références

  1. Hopcroft et Ullman 1979, p. 95.
  2. Sheila A. Greibach, « A New Normal-Form Theorem for Context-Free Phrase Structure Grammars », Journal of the ACM, vol. 12, no 1,‎ , p. 42–52 (DOI 10.1145/321250.321254).
  3. Norbert Blum et Robert Koch, « Greibach Normal Form Transformation Revisited », Information and Computation, vol. 150, no 1,‎ , p. 112–118 (DOI 10.1006/inco.1998.2772, lire en ligne).
  4. On introduit, comme pour la construction de la Forme normale de Chomsky, une nouvelle variable qui devient l'axiome, et une unique règle supplémentaire , où est l'ancien axiome.
  5. Hopcroft, Motwani et Ullman 2007, p. 268.
  6. a et b Carton 2008.
  7. Günter Hotz, « Normal form transformations of context-free grammars », Acta Cybernetica, no 1,‎ , p. 65-84.
  8. Joost Engelfriet, « An elementary proof of double Greibach normal form », Information Processing Letters, vol. 44, no 6,‎ , p. 291–293 (DOI 10.1016/0020-0190(92)90101-Z).
  9. Daniel J. Rosenkrantz, « Matrix equations and normal forms for context-free grammars », Journal of the ACM, vol. 14, no 3,‎ , p. 501–507.
  10. Ryo Yoshinaka, « An elementary proof of a generalization of double Greibach normal form », Information Processing Letters, vol. 109, no 10,‎ , p. 490–492 (DOI 10.1016/j.ipl.2009.01.015).

Bibliographie

Manuels
Cours

Voir aussi