logo

Chomského normálna forma (CNF)

CNF znamená Chomského normálna forma. CFG (bezkontextová gramatika) je v CNF (Chomského normálna forma), ak všetky produkčné pravidlá spĺňajú jednu z nasledujúcich podmienok:

  • Začnite generovať symbol ε. Napríklad A → ε.
  • Neterminál generujúci dva neterminály. Napríklad S → AB.
  • Neterminál generujúci terminál. Napríklad S → a.

Napríklad:

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

Produkčné pravidlá gramatiky G1 spĺňajú pravidlá špecifikované pre CNF, takže gramatika G1 je v CNF. Produkčné pravidlo gramatiky G2 však nespĺňa pravidlá špecifikované pre CNF, keďže S → aZ obsahuje koncovku, za ktorou nasleduje neterminál. Takže gramatika G2 nie je v CNF.

v regexe java

Kroky na premenu CFG na CNF

Krok 1: Odstráňte štartovací symbol z RHS. Ak je štartovací symbol T na pravej strane akejkoľvek produkcie, vytvorte novú produkciu ako:

 S1 → S 

Kde S1 je nový štartovací symbol.

Krok 2: V gramatike odstráňte nulu, jednotku a zbytočné produkcie. Môžete si pozrieť Zjednodušenie CFG.

Krok 3: Odstráňte terminály z RHS výroby, ak existujú s inými neterminálmi alebo terminálmi. Napríklad produkciu S → aA možno rozložiť ako:

 S → RA R → a 

Krok 4: Odstráňte RHS s viac ako dvoma neterminálmi. Napríklad S → ASB možno rozložiť ako:

 S → RS R → AS 

Príklad:

Preveďte daný CFG na CNF. Zvážte danú gramatiku G1:

pole java
 S → a | aA | B A → aBB | ε B → Aa | b 

Riešenie:

Krok 1: Vytvoríme novú produkciu S1 → S, keďže na pravej strane sa objaví štartovací symbol S. Gramatika bude:

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

Krok 2: Keďže gramatika G1 obsahuje A → ε nulovú produkciu, jej odstránením z gramatiky sa získa:

stiahnite si videá z youtube vlc
 S1 → S S → a | aA | B A → aBB B → Aa | b | a 

Teraz, keďže gramatika G1 obsahuje produkciu jednotiek S → B, jej výťažok odstránenia:

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

Odstráňte aj produkciu jednotiek S1 → S, jej odstránenie z gramatiky vedie k:

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

Krok 3: Vo výrobnom pravidle S0 → aA | Aa, S → aA | Aa, A → aBB a B → Aa, terminál a existuje na RHS s neterminálmi. Terminál a teda nahradíme X:

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

Krok 4: Vo výrobnom pravidle A → XBB má RHS viac ako dva symboly, čím sa odstraňuje z gramatického výťažku:

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

Pre danú gramatiku je to teda požadovaný CNF.

filtrovanie pythonu