logo

Forme normale de Chomsky (CNF)

CNF signifie Forme normale de Chomsky. Une CFG (grammaire libre de contexte) est au format CNF (forme normale de Chomsky) si toutes les règles de production satisfont à l'une des conditions suivantes :

  • Commencez le symbole générant ε Par exemple, A → ε.
  • Un non-terminal générant deux non-terminaux. Par exemple, S → AB.
  • Un non-terminal générant un terminal. Par exemple, S → a.

Par exemple:

 G1 = {S → AB, S → c, A → a, B → b} G2 = {S → aA, A → a, B → c} 

Les règles de production de la Grammaire G1 satisfont aux règles spécifiées pour le CNF, donc la grammaire G1 est en CNF. Cependant, la règle de production de Grammar G2 ne satisfait pas aux règles spécifiées pour CNF car S → aZ contient un terminal suivi d'un non-terminal. La grammaire G2 n'est donc pas en CNF.

décodage js base64

Étapes pour convertir CFG en CNF

Étape 1: Éliminer le symbole de départ du RHS. Si le symbole de départ T se trouve à droite d'une production, créez une nouvelle production comme :

 S1 → S 

Où S1 est le nouveau symbole de départ.

Étape 2: Dans la grammaire, supprimez les productions nulles, unitaires et inutiles. Vous pouvez vous référer à la Simplification de CFG .

Étape 3: Eliminer les terminaux du RHS de la production s'ils existent avec d'autres non-terminaux ou terminaux. Par exemple, la production S → aA peut être décomposée comme suit :

 S → RA R → a 

Étape 4: Éliminez le RHS avec plus de deux non-terminaux. Par exemple, S → ASB peut être décomposé comme suit :

 S → RS R → AS 

Exemple:

Convertissez le CFG donné en CNF. Considérons la grammaire G1 donnée :

différence entre un tableau et une liste de tableaux
 S → a | aA | B A → aBB | ε B → Aa | b 

Solution:

Étape 1: Nous allons créer une nouvelle production S1 → S, car le symbole de départ S apparaît sur le RHS. La grammaire sera :

 S1 → S S → a | aA | B A → aBB | ε B → Aa | b 

Étape 2: Comme la grammaire G1 contient une production nulle A → ε, sa suppression de la grammaire donne :

importer le scanner java
 S1 → S S → a | aA | B A → aBB B → Aa | b | a 

Or, comme la grammaire G1 contient la production unitaire S → B, son rendement d'élimination :

 S1 → S S → a | aA | Aa | b A → aBB B → Aa | b | a 

Supprimez également la production unitaire S1 → S, sa suppression de la grammaire donne :

 S0 → a | aA | Aa | b S → a | aA | Aa | b A → aBB B → Aa | b | a 

Étape 3: Dans la règle de production S0 → aA | Aa, S → aA | Aa, A → aBB et B → Aa, le terminal a existe sur RHS avec des non-terminaux. Nous remplacerons donc le terminal a par X :

 S0 → a | XA | AX | b S → a | XA | AX | b A → XBB B → AX | b | a X → a 

Étape 4: Dans la règle de production A → XBB, RHS a plus de deux symboles, ce qui le supprime du rendement grammatical :

 S0 → a | XA | AX | b S → a | XA | AX | b A → RB B → AX | b | a X → a R → XB 

Par conséquent, pour la grammaire donnée, il s’agit du CNF requis.

parcours d'arbre