Forma normale di Chomsky
Un CFG è in forma normale di Chomsky se le produzioni sono nelle seguenti forme:
- A → a
- A → BC
- S → ε
dove A, B e C sono non terminali e a è terminale.
Algoritmo per convertire in forma normale di Chomsky -
Step 1 - Se il simbolo di avvio S si verifica su un lato destro, crea un nuovo simbolo di inizio S’ e una nuova produzione S’→ S.
Step 2- Rimuovi le produzioni Null. (Utilizzo dell'algoritmo di rimozione della produzione Null discusso in precedenza)
Step 3- Rimuovere le produzioni unitarie. (Utilizzo dell'algoritmo di rimozione della produzione unitaria discusso in precedenza)
Step 4 - Sostituisci ogni produzione A → B1…Bn dove n > 2 con A → B1C dove C → B2 …Bn. Ripetere questo passaggio per tutte le produzioni con due o più simboli sul lato destro.
Step 5 - Se il lato destro di qualsiasi produzione è nella forma A → aB dove a è un terminale e A, B non sono terminali, quindi la produzione viene sostituita da A → XB e X → a. Ripeti questo passaggio per ogni produzione che si trova nella formaA → aB.
Problema
Converti il seguente CFG in CNF
S → ASA | aB, A → B | S, B → b | ε
Soluzione
(1) Da S appare in RHS, aggiungiamo un nuovo stato S0 e S0→S viene aggiunto al set di produzione e diventa -
S 0 → S, S → ASA | aB, A → B | S, B → b | ∈
(2) Ora rimuoveremo le produzioni nulle -
B → ∈ e A → ∈
Dopo aver rimosso B → ε, l'insieme di produzione diventa -
S 0 → S, S → ASA | aB | a, A → B | S | ∈, B → b
Dopo aver rimosso A → ∈, il set di produzione diventa -
S 0 → S, S → ASA | aB | a | AS | SA | S, A → B | S, B → b
(3) Ora rimuoveremo le produzioni unitarie.
Dopo aver rimosso S → S, il set di produzione diventa -
S 0 → S, S → ASA | aB | a | AS | SA, A → B | S, B → b
Dopo aver rimosso S 0 → S, il set di produzione diventa -
S 0 → ASA | aB | a | AS | SA, S → ASA | aB | a | AS | SA
A → B | S, B → b
Dopo aver rimosso A → B, il set di produzione diventa -
S 0 → ASA | aB | a | AS | SA, S → ASA | aB | a | AS | SA
A → S | b
B → b
Dopo aver rimosso A → S, il set di produzione diventa -
S 0 → ASA | aB | a | AS | SA, S → ASA | aB | a | AS | SA
A → b | ASA | aB | a | AS | SA, B → b
(4) Ora scopriremo più di due variabili nella RHS
Qui, S 0 → ASA, S → ASA, A → ASA viola due non terminali in RHS
Quindi applicheremo il passaggio 4 e il passaggio 5 per ottenere il seguente set di produzione finale che è in CNF -
S 0 → AX | aB | a | AS | SA
S → AX | aB | a | AS | SA
A → b | AX | aB | a | AS | SA
B → b
X → SA
(5)Dobbiamo cambiare le produzioni S 0 → aB, S → aB, A → aB
E il set di produzione finale diventa -
S 0 → AX | YB | a | AS | SA
S → AX | YB | a | AS | SA
A → b A → b | AX | YB | a | AS | SA
B → b
X → SA
Y → a