logo

Forma normală Greibach (GNF)

GNF înseamnă forma normală Greibach. O CFG (gramatică fără context) este în GNF (forma normală Greibach) dacă toate regulile de producție îndeplinesc una dintre următoarele condiții:

  • Un simbol de pornire care generează ε. De exemplu, S → ε.
  • Un non-terminal care generează un terminal. De exemplu, A → a.
  • Un non-terminal care generează un terminal care este urmat de orice număr de non-terminale. De exemplu, S → aASB.

De exemplu:

 G1 = aB, A → aA G2 = S → aAB 

Regulile de producție ale gramaticii G1 îndeplinesc regulile specificate pentru GNF, deci gramatica G1 este în GNF. Totuși, regula de producție a gramaticii G2 nu îndeplinește regulile specificate pentru GNF, deoarece A → ε și B → ε conține ε (doar simbolul de început poate genera ε). Deci gramatica G2 nu este în GNF.

Pași pentru conversia CFG în GNF

Pasul 1: Convertiți gramatica în CNF.

Dacă gramatica dată nu este în CNF, convertiți-o în CNF. Puteți face referire la următorul subiect pentru a converti CFG în CNF: forma normală Chomsky

Pasul 2: Dacă gramatica există recursivitate stângă, eliminați-o.

Dacă gramatica fără context conține recursiunea stângă, eliminați-o. Puteți consulta următorul subiect pentru a elimina recursiunea stângă: Recursie stânga

Pasul 3: În gramatică, convertiți regula de producție dată în forma GNF.

Dacă vreo regulă de producție din gramatică nu este în formă GNF, convertiți-o.

Exemplu:

 S → XB | AA A → a | SA B → b X → a 

Soluţie:

Deoarece gramatica dată G este deja în CNF și nu există recursivitate stângă, așa că putem sări peste pasul 1 și pasul 2 și să mergem direct la pasul 3.

Regula de producție A → SA nu este în GNF, așa că înlocuim S → XB | AA în regula de producție A → SA ca:

 S → XB | AA A → a | XBA | AAA B → b X → a 

Regula de producție S → XB și B → XBA nu este în GNF, așa că înlocuim X → a în regula de producție S → XB și B → XBA ca:

 S → aB | AA A → a | aBA | AAA B → b X → a 

Acum vom elimina recursiunea stângă (A → AAA), obținem:

 S → aB | AA A → aC | aBAC C → AAC | ε B → b X → a 

Acum vom elimina producția nulă C → ε, obținem:

 S → aB | AA A → aC | aBAC | a | aBA C → AAC | AA B → b X → a 

Regula de producție S → AA nu este în GNF, așa că înlocuim A → aC | aBAC | a | aBA în regula de producție S → AA ca:

 S → aB | aCA | aBACA | aA | aBAA A → aC | aBAC | a | aBA C → AAC C → aCA | aBACA | aA | aBAA B → b X → a 

Regula de producție C → AAC nu este în GNF, așa că înlocuim A → aC | aBAC | a | aBA în regula de producție C → AAC ca:

 S → aB | aCA | aBACA | aA | aBAA A → aC | aBAC | a | aBA C → aCAC | aBACAC | aAC | aBAAC C → aCA | aBACA | aA | aBAA B → b X → a 

Prin urmare, aceasta este forma GNF pentru gramatica G.