CNF staat voor Chomsky-normaalvorm. Een CFG (contextvrije grammatica) is in CNF (Chomsky-normaalvorm) als alle productieregels aan een van de volgende voorwaarden voldoen:
- Begin met het genereren van symbool ε. Bijvoorbeeld A → ε.
- Een niet-terminal die twee niet-terminals genereert. Bijvoorbeeld S → AB.
- Een niet-terminal die een terminal genereert. Bijvoorbeeld S → a.
Bijvoorbeeld:
G1 = {S → AB, S → c, A → a, B → b} G2 = {S → aA, A → a, B → c}
De productieregels van Grammatica G1 voldoen aan de regels gespecificeerd voor CNF, dus de grammatica G1 is in CNF. De productieregel van Grammatica G2 voldoet echter niet aan de regels die zijn gespecificeerd voor CNF, aangezien S → aZ terminal bevat, gevolgd door niet-terminal. De grammatica G2 is dus niet in CNF.
java lang naar string
Stappen voor het omzetten van CFG naar CNF
Stap 1: Elimineer het startsymbool uit de RHS. Als het startsymbool T aan de rechterkant van een productie staat, maak dan een nieuwe productie aan als:
S1 → S
Waarbij S1 het nieuwe startsymbool is.
Stap 2: Verwijder in de grammatica de null-, unit- en nutteloze producties. U kunt verwijzen naar de Vereenvoudiging van CFG.
Stap 3: Elimineer terminals uit de RHS van de productie als ze samen met andere niet-terminals of terminals bestaan. Productie S → aA kan bijvoorbeeld worden ontleed als:
S → RA R → a
Stap 4: Elimineer RHS met meer dan twee niet-terminals. S → ASB kan bijvoorbeeld worden ontleed als:
S → RS R → AS
Voorbeeld:
Converteer de gegeven CFG naar CNF. Beschouw de gegeven grammatica G1:
wanneer werd de school uitgevonden?
S → a | aA | B A → aBB | ε B → Aa | b
Oplossing:
Stap 1: We zullen een nieuwe productie S1 → S maken, aangezien het startsymbool S op de RHS verschijnt. De grammatica zal zijn:
S1 → S S → a | aA | B A → aBB | ε B → Aa | b
Stap 2: Omdat grammatica G1 A → ε nulproductie bevat, levert de verwijdering ervan uit de grammatica het volgende op:
java csv-bestand lezen
S1 → S S → a | aA | B A → aBB B → Aa | b | a
Omdat grammatica G1 eenheidsproductie S → B bevat, levert de verwijdering het volgende op:
S1 → S S → a | aA | Aa | b A → aBB B → Aa | b | a
Verwijder ook de eenheidsproductie S1 → S, de verwijdering ervan uit de grammatica levert op:
S0 → a | aA | Aa | b S → a | aA | Aa | b A → aBB B → Aa | b | a
Stap 3: In de productieregel S0 → aA | Aa, S → aA | Aa, A → aBB en B → Aa, terminal a bestaat op RHS met niet-terminals. We zullen dus terminal a vervangen door X:
S0 → a | XA | AX | b S → a | XA | AX | b A → XBB B → AX | b | a X → a
Stap 4: In de productieregel A → XBB heeft RHS meer dan twee symbolen, waardoor deze uit de grammaticaopbrengst worden verwijderd:
S0 → a | XA | AX | b S → a | XA | AX | b A → RB B → AX | b | a X → a R → XB
Voor de gegeven grammatica is dit dus de vereiste CNF.
verschil tussen vos en wolf