logo

Normalna oblika Chomskega (CNF)

CNF pomeni normalno obliko Chomskyja. CFG (kontekstno prosta slovnica) je v CNF (Chomsky normalna oblika), če vsa produkcijska pravila izpolnjujejo enega od naslednjih pogojev:

  • Začni simbol generirati ε. Na primer, A → ε.
  • Ne-terminal, ki generira dva ne-terminala. Na primer S → AB.
  • Neterminal, ki generira terminal. Na primer S → a.

Na primer:

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

Produkcijska pravila slovnice G1 izpolnjujejo pravila, določena za CNF, zato je slovnica G1 v CNF. Vendar produkcijsko pravilo slovnice G2 ne izpolnjuje pravil, določenih za CNF, saj S → aZ vsebuje terminal, ki mu sledi neterminal. Torej slovnica G2 ni v CNF.

spanje v javascriptu

Koraki za pretvorbo CFG v CNF

Korak 1: Odstranite začetni simbol z RHS. Če je začetni simbol T na desni strani katere koli proizvodnje, ustvarite novo proizvodnjo kot:

 S1 → S 

Kjer je S1 nov začetni simbol.

2. korak: V slovnici odstranite ničelne, enotne in neuporabne produkcije. Lahko se sklicujete na poenostavitev CFG.

3. korak: Odstranite terminale iz RHS proizvodnje, če obstajajo z drugimi ne-terminali ali terminali. Na primer, proizvodnjo S → aA je mogoče razstaviti kot:

 S → RA R → a 

4. korak: Odstranite RHS z več kot dvema neterminaloma. Na primer, S → ASB je mogoče razstaviti kot:

 S → RS R → AS 

primer:

Pretvorite podani CFG v CNF. Razmislite o dani slovnici G1:

binarno drevo
 S → a | aA | B A → aBB | ε B → Aa | b 

rešitev:

Korak 1: Ustvarili bomo novo proizvodnjo S1 → S, saj se na RHS pojavi začetni simbol S. Slovnica bo:

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

2. korak: Ker slovnica G1 vsebuje A → ε ničelno produkcijo, njena odstranitev iz slovnice daje:

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

Zdaj, ker slovnica G1 vsebuje proizvodnjo enote S → B, njena odstranitev prinaša:

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

Odstranite tudi proizvodnjo enote S1 → S, njena odstranitev iz slovnice daje:

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

3. korak: V proizvodnem pravilu S0 → aA | Aa, S → aA | Aa, A → aBB in B → Aa, terminal a obstaja na RHS z neterminali. Tako bomo zamenjali terminal a z X:

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

4. korak: V produkcijskem pravilu A → XBB ima RHS več kot dva simbola, kar ga odstrani iz slovničnega donosa:

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

Zato je za dano slovnico to zahtevana CNF.

testiranje in vrste testiranja