Sipser ki textbook mein order hai START → DEL → UNIT → TERM → BIN. Messy ε aur unit rules ko pehle hatao, phir terminals ko clean karo aur binarize karo baad mein.
START — ek fresh start symbol S0→S add karo (taaki start kabhi right-hand side par na aaye).
DEL — ==ε-productions== (nullable variables) eliminate karo.
UNIT — unit productions (A→B) eliminate karo.
TERM — lambe rules mein terminals ko naye variables se replace karo.
BIN — 2 se lambi right-hand sides ko length-2 rules ki chains mein todo.
WHY: CNF mein start symbol ko ε rakhne ki allowed hai. Agar S bhi kisi rule ke right side par aata hai, to deleting/transforming ulajh jaata hai. Ek fresh S0 jo sirf purane S ki taraf point kare, start ko "clean" rakhta hai.
WHY:A→ε (non-start A ke liye) illegal hai. HOW: saare nullable variables dhundho (jinse ε derive ho sakta hai), phir har rule ke liye, nullable occurrences ke har subset ko chhodne wale versions add karo (lekin kabhi bhi poora RHS empty tak mat delete karo — woh dobara ε-rule bana dega).
WHY:A→B koi terminal produce nahi karta aur koi branching nahi — bas rename karta hai. HOW: har unit pair (A,B) ke liye (matlab A⇒∗B sirf unit rules use karke), aur har non-unit rule B→γ ke liye, A→γ add karo. Phir saari unit rules drop karo.
WHY:A→B1B2B3B4 bahut lamba hai. Isko replace karo
A→B1X1,X1→B2X2,X2→B3B4.
Har naya Xi ek fresh variable hai jo "chain ka baaki hissa" rakhta hai.
START.S0→S add karo.
Yeh step kyun? Taaki start kabhi right side par na baithe.
Rules: S0→S; S→ASA∣aB; A→B∣S; B→b∣ε.
DEL. Nullable set: B→ε⇒B nullable. A→B jahan B nullable ⇒A nullable. Koi aur all-nullable RHS nahi. To N={A,B}.
Har rule ko nullable positions ke saare subsets par patch karo (kabhi empty tak nahi):
S→ASA: nullable positions dono A's hain. Drop subsets ⟹ S→SA∣AS∣S add karo. To S→ASA∣SA∣AS∣S.
S→aB: B nullable ⟹ S→a add karo. To S→aB∣a.
A→B: B nullable ⟹ A→ε add hota — drop karo (yeh S0 nahi hai). A→B rakho.
A→S: rakho (koi nullable symbol nahi).
B→b: rakho. B→ε delete karo.
DEL ke baad:
S0→S; S→ASA∣SA∣AS∣S∣aB∣a; A→B∣S; B→b.
UNIT. Unit pairs dhundho (reflexive + transitive closure unit rules S→S, A→B, A→S, S0→S par):
(S0,S), aur S ke through kuch aur nahi (S ka sirf unit rule S→S hai). S→S ek trivial self-unit hai, hata diya.
(A,S), (A,B).
Ab har variable ke liye, un saare variables ke non-unit bodies collect karo jahan tak woh pahunch sakta hai:
Non-unit bodies of S: {ASA,SA,AS,aB,a}.
Non-unit bodies of A: A⇒∗B se {b}; A⇒∗S se {ASA,SA,AS,aB,a}.
Sipser ke 5 CNF conversion steps ka order kya hai?
START, DEL, UNIT, TERM, BIN.
Sipser mein DEL/UNIT, TERM/BIN se pehle kyun aata hai?
ε- aur unit-removal sirf RHSs ko chhoTa/rename karta hai, to pehle karne se TERM/BIN kabhi undo nahi hota.
Nullable variable define karo.
Ek variable A jiske liye A⇒∗ε (empty string derive ho sake).
DEL mein A→XYZ jahan X,Z nullable hain, ko kaise patch karte hain?
{X,Z} ke har subset ko chhodte hue ek rule add karo: A→XYZ∣YZ∣XY∣Y (kabhi empty nahi).
Unit production kya hoti hai aur use kaise hatate hain?
Ek rule A→B (B ek variable); hatao har non-unit body γ ke liye A→γ add karke jo unit pair (A,B) ke roop mein reachable ho.
CNF useful kyun hai?
Parse trees binary ban jaate hain ⟹ CYK O(n3) membership aur CFL pumping lemma enable hota hai.
BIN mein A→B1B2B3 convert karne par kya milta hai?
A→B1X1, X1→B2B3 (ek fresh variable).
Pehle naya start symbol S0 kyun add karte hain?
Taaki start symbol kisi bhi right-hand side par na aaye, baad ke steps clean rahein.
Recall Feynman: 12-saal ke bache ko explain karo
Socho LEGO instructions jahan har step mein sirf EK cheez ho sakti hai: ya to do bade blocks snap karo, ya ek single colored tile lagao. Koi giant complicated steps allowed nahi. CNF ek messy building manual ko is baby-simple style mein rewrite karta hai. Bana hua tower bilkul wahi rahega — lekin ab ek robot steps bahut fast follow kar sakta hai aur yeh bhi check kar sakta hai ki koi diya hua tower bana sakta hai ya nahi. Hum clean karte hain: ek fresh "start" block deke, "kuch mat banao" steps hatake, "is block ko doosra naam se bolo" lazy steps hatake, phir loose colored tiles ko named blocks se badal ke, aur aakhir mein lambe steps ko pairs mein chop karke.