SimplifyCFG 

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

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

> removeLambdaCFG(cfg);
removeUnitCFG(%);
removeUselessCFG(%);
 

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

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

CFG({V0, V1}, {a1, a2, a3}, V0, TABLE([V0 = {[a3, V1, a1, a2]}, V1 = {[a1], [a3]}])) (10.5.2)
 

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

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

> removeLambdaCFG(cfg);
removeUnitCFG(%);
#removeUselessCFG(%);
 

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

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

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

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

> removeLambdaCFG(cfg);
removeUnitCFG(%);
#removeUselessCFG(%);
 

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

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

>
 

> while true do
cfg:=randomCFG(5,3):
cfg1:=removeLambdaCFG(cfg):
if nops(op(op(4,cfg))) = nops(op(op(4,cfg1))) then
 next:
fi:
cfg2:=removeUnitCFG(cfg1):
if nops(op(op(4,cfg1))) = nops(op(op(4,cfg2))) then
 next:
fi:
cfg3:=removeUselessCFG(cfg2):
if nops(op(op(4,cfg2))) <> nops(op(op(4,cfg3))) and nops(op(op(4,cfg3))) >= 2 then
 break:
fi:
od:
cfg;
cfg1;
cfg2;
cfg3;
 

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

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

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

CFG({V0, V2}, {a1, a2, a3}, V0, TABLE([V0 = {[a2, a1, V2]}, V2 = {[a3]}])) (10.5.7)
 

>