Forme normale de Greibach

De testwiki
Aller à la navigation Aller à la recherche

Modèle:Voir homonymes

En informatique théorique, et notamment en théorie des langages formels, une grammaire algébrique est en forme normale de Greibach (en anglais, Greibach normal form ou GNF) si les membres droits de ses règles commencent 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

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

AaA1A2An

ou

Sε

A est une variable, a est une lettre, et A1A2An est une suite éventuellement vide de variables ; S 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 Sε, l'algorithme est plus simple ; il existe des transformations complexité en temps O(n4) dans le cas général et en temps O(n3) si la grammaire n'a pas de règle unité (de la forme AB pour une variable B)[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. La 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

Modèle:Article détaillé On peut supposer que l'axiome de la grammaire ne figure pas dans un membre droit de règle[4].

Une règle Aε, où A n'est pas l'axiome, est supprimée ; on considère chaque règle BαA figure dans α, et on ajoute, pour chaque occurrence α=βAγ, la règle Bβγ à la grammaire, sauf si on crée une epsilon-règle. Par exemple, si

BaAbAc

on ajoute les trois règles

BabAc,BaAbc,Babc.

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

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

Modèle:Article détaillé Une règle unité est une règle de la forme AB, où B est une variable. Pour éliminer ce type de règles, on remplace une telle règle par la règle

Aα

pour chaque règle

Bα

(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 AB,BC,CA) 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 A1,A2,,Am ; on définit une suite G0,G1,,Gn de grammaires, où G0 est la grammaire initiale, avec la propriété que dans Gi, les variables A1,,Ai n'apparaissent pas en tête des membres droits de règle. On suppose la grammaire Gi1 construite, et on procède en deux étapes

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

AiAiα1Aiαnβ1βm

où les βj ne commencent pas par A sont remplacées par

Aiβ1A'iβmA'iβ1βm
A'iα1A'iαnA'iα1αn

2. Suppression des occurrences de Ai en tête : les occurrences de variables Aj(1ji) 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 Ta, une pour chaque lettre a, avec la règle Taa.

Exemple

Voici un exemple tiré du livre d'Olivier Carton[6] (on écrit A,B,C au lieu de A1,A2,A3) :

Grammaire G0 :

AABa
BBCb
CCAc

Les deux règles de A sont remplacées par

AaAa,ABAB.

On obtient :

Grammaire G1 :

AaAa
ABAB
BBCb
CCAc

Les deux règles de B sont remplacées par

BbBb,BCBC, et les occurrences en tête de B

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

Grammaire G2 :

AaAa
AbBAbAbBb
BbBb
BCBC
CCAc

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

CcCc,CACA,

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

Grammaire G3

AaAa
AbBAbAbBb
BbBb
BcCBcBcCc
CcCc
CaACaCaAa

Autres formes normales

Forme normale quadratique

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

AaV

V 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 :

SaSS|b

du langage de Lukasiewicz sont sous forme quadratique, la grammaire

SaSSS|b

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

SaST|b,TSS

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 T, ce qui donne TaSSSSbS, d'où

SaST|b,TaTTbS.

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 ΣΣV*Σ, où Σ et V 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 ΣΣ(εVV2)Σ, 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]Modèle:,[8].

Autres constructions

Un autre construction, plus algébrique, a été proposée par Daniel J. Rosenkrantz[9]Modèle:,[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

Modèle:Références

Bibliographie

Manuels
Cours
Article récent

Voir aussi

Modèle:Portail

  1. Modèle:Harvsp.
  2. Modèle:Article.
  3. Modèle:Article.
  4. On introduit, comme pour la construction de la Forme normale de Chomsky, une nouvelle variable S0 qui devient l'axiome, et une unique règle supplémentaire S0S, où S est l'ancien axiome.
  5. Modèle:Harvsp.
  6. 6,0 et 6,1 Modèle:Harvsp.
  7. Modèle:Article.
  8. Modèle:Article.
  9. Modèle:Article.
  10. Modèle:Article.