Remove Unit Production Rules 

> P:=table():
P[S]:={[A,a],[B]}:P[B]:={[A],[A,b]}:
P[A]:={[a],[B,c],[B]}:
cfg:=mkCFG({S,A,B},{a,b,c},S,op(P));
 

`:=`(cfg, CFG({A, B, S}, {a, b, c}, S, TABLE([A = {[B], [a], [B, c]}, B = {[A], [A, b]}, S = {[A, a], [B]}]))) (10.3.1)
 

> type(cfg,CFG);
 

true (10.3.2)
 

> type(cfg,unitFreeCFG);
 

false (10.3.3)
 

> removeUnitCFG(cfg);
 

CFG({A, B, S}, {a, b, c}, S, TABLE([S = {[A, a], [a], [A, b], [B, c]}, B = {[a], [A, b], [B, c]}, A = {[a], [A, b], [B, c]}]))
CFG({A, B, S}, {a, b, c}, S, TABLE([S = {[A, a], [a], [A, b], [B, c]}, B = {[a], [A, b], [B, c]}, A = {[a], [A, b], [B, c]}]))
(10.3.4)
 

> type(%,unitFreeCFG);
 

true (10.3.5)
 

> cfg := mkCFG({V0, V1, V2, V3},{a1, a2},V0,table([V1 = {[V1, V3, a2, a1], [V2, a1]}, V2 = {[V3, V0]}, V0 = {[V2]}]));
 

`:=`(cfg, CFG({V1, V0, V2, V3}, {a1, a2}, V0, TABLE([V1 = {[V1, V3, a2, a1], [V2, a1]}, V0 = {[V2]}, V2 = {[V3, V0]}])))
`:=`(cfg, CFG({V1, V0, V2, V3}, {a1, a2}, V0, TABLE([V1 = {[V1, V3, a2, a1], [V2, a1]}, V0 = {[V2]}, V2 = {[V3, V0]}])))
(10.3.6)
 

> removeUnitCFG(cfg);
 

CFG({V1, V0, V2, V3}, {a1, a2}, V0, TABLE([V1 = {[V1, V3, a2, a1], [V2, a1]}, V0 = {[V3, V0]}, V2 = {[V3, V0]}]))
CFG({V1, V0, V2, V3}, {a1, a2}, V0, TABLE([V1 = {[V1, V3, a2, a1], [V2, a1]}, V0 = {[V3, V0]}, V2 = {[V3, V0]}]))
(10.3.7)
 

>
 

> cfg:=mkCFG({V0, V1, V2, V3, V4}, {a1, a2, a3}, V0, table([V4 = {[V2],[V0]},V0 = {[V1, V4, V2], [V2], [lambda]}, V2 = {[V4, a2]},V3 = {[V4], [a2]}]));
 

`:=`(cfg, CFG({V0, V1, V3, V4, V2}, {a1, a2, a3}, V0, TABLE([V3 = {[V4], [a2]}, V4 = {[V2], [V0]}, V0 = {[V2], [V1, V4, V2], [lambda]}, V2 = {[V4, a2]}])))
`:=`(cfg, CFG({V0, V1, V3, V4, V2}, {a1, a2, a3}, V0, TABLE([V3 = {[V4], [a2]}, V4 = {[V2], [V0]}, V0 = {[V2], [V1, V4, V2], [lambda]}, V2 = {[V4, a2]}])))
(10.3.8)
 

> removeLambdaCFG(cfg);
 

CFG({V0, V1, V3, V4, V2}, {a1, a2, a3}, V0, TABLE([V3 = {[V4], [a2]}, V4 = {[V2], [V0]}, V0 = {[V2], [V1, V4, V2], [V1, V2]}, V2 = {[V4, a2], [a2]}]))
CFG({V0, V1, V3, V4, V2}, {a1, a2, a3}, V0, TABLE([V3 = {[V4], [a2]}, V4 = {[V2], [V0]}, V0 = {[V2], [V1, V4, V2], [V1, V2]}, V2 = {[V4, a2], [a2]}]))
(10.3.9)
 

> removeUnitCFG(%);
 

CFG({V2, V1, V3, V4, V0}, {a1, a2, a3}, V0, TABLE([V2 = {[a2], [V4, a2]}, V3 = {[a2], [V1, V4, V2], [V4, a2], [V1, V2]}, V4 = {[a2], [V1, V4, V2], [V4, a2], [V1, V2]}, V0 = {[a2], [V1, V4, V2], [V4, a...
CFG({V2, V1, V3, V4, V0}, {a1, a2, a3}, V0, TABLE([V2 = {[a2], [V4, a2]}, V3 = {[a2], [V1, V4, V2], [V4, a2], [V1, V2]}, V4 = {[a2], [V1, V4, V2], [V4, a2], [V1, V2]}, V0 = {[a2], [V1, V4, V2], [V4, a...
CFG({V2, V1, V3, V4, V0}, {a1, a2, a3}, V0, TABLE([V2 = {[a2], [V4, a2]}, V3 = {[a2], [V1, V4, V2], [V4, a2], [V1, V2]}, V4 = {[a2], [V1, V4, V2], [V4, a2], [V1, V2]}, V0 = {[a2], [V1, V4, V2], [V4, a...
(10.3.10)
 

> cfg:=randomCFG(5,3);
 

`:=`(cfg, CFG({V1, V0, V2, V3, V4}, {a1, a2, a3}, V0, TABLE([V4 = {[V1, V0], [lambda]}, V1 = {[lambda]}, V2 = {[V1]}])))
`:=`(cfg, CFG({V1, V0, V2, V3, V4}, {a1, a2, a3}, V0, TABLE([V4 = {[V1, V0], [lambda]}, V1 = {[lambda]}, V2 = {[V1]}])))
(10.3.11)
 

> removeUnitCFG(cfg);
 

CFG({V1, V0, V2, V3, V4}, {a1, a2, a3}, V0, TABLE([V4 = {[V1, V0], [lambda]}, V1 = {[lambda]}, V2 = {[lambda]}])) (10.3.12)
 

>
 

>
 

>