logo

Chomsky normál formája (CNF)

A CNF a Chomsky normál formát jelenti. A CFG (kontextusmentes nyelvtan) CNF (Chomsky normál formában) van, ha minden termelési szabály megfelel a következő feltételek egyikének:

  • Indítsa el az ε szimbólum generálását. Például A → ε.
  • Egy nem terminál, amely két nem terminált generál. Például S → AB.
  • Terminált generáló nem terminál. Például S → a.

Például:

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

A G1 nyelvtan előállítási szabályai megfelelnek a CNF-re meghatározott szabályoknak, így a G1 nyelvtan CNF-ben van. A Grammar G2 előállítási szabálya azonban nem felel meg a CNF-re meghatározott szabályoknak, mivel az S → aZ terminált, majd nem terminált tartalmaz. Tehát a G2 nyelvtan nincs a CNF-ben.

keresse meg a c++ térképen

A CFG CNF-vé alakításának lépései

1. lépés: Távolítsa el a start szimbólumot az RHS-ből. Ha a T kezdőszimbólum bármely produkció jobb oldalán található, hozzon létre egy új produkciót a következőképpen:

 S1 → S 

Ahol S1 az új kezdő szimbólum.

2. lépés: A nyelvtanból távolítsa el a null, unit és haszontalan produkciókat. Olvassa el a CFG egyszerűsítését.

3. lépés: Távolítsa el a terminálokat a gyártás RHS-éből, ha léteznek más nem terminálokkal vagy terminálokkal. Például az S → aA termelés a következőképpen bontható fel:

 S → RA R → a 

4. lépés: Szüntesse meg az RHS-t kettőnél több nem terminállal. Például az S → ASB a következőképpen bontható fel:

 S → RS R → AS 

Példa:

Konvertálja a megadott CFG-t CNF-re. Tekintsük a megadott G1 nyelvtant:

összefűzési karakterlánc java-ban
 S → a | aA | B A → aBB | ε B → Aa | b 

Megoldás:

1. lépés: Létrehozunk egy új S1 → S produkciót, mivel az S start szimbólum megjelenik az RHS-en. A nyelvtan a következő lesz:

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

2. lépés: Mivel a G1 nyelvtan A → ε null produkciót tartalmaz, a nyelvtanból való eltávolítása a következőket eredményezi:

középső css gomb
 S1 → S S → a | aA | B A → aBB B → Aa | b | a 

Most, mivel a G1 nyelvtan S → B egységtermelést tartalmaz, eltávolítási hozama:

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

Távolítsa el az S1 → S egységprodukciót is, ennek eltávolítása a nyelvtanból a következő eredményt kapja:

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

3. lépés: Az S0 → aA | termelési szabályban Aa, S → aA | Aa, A → aBB és B → Aa, az a terminál létezik az RHS-en nem terminálokkal. Tehát az a terminált X-re cseréljük:

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

4. lépés: Az A → XBB előállítási szabályban az RHS kettőnél több szimbólumot tartalmaz, ami eltávolítja a nyelvtani hozamból:

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

Ezért az adott nyelvtanhoz ez a szükséges CNF.

húrfordítás c