@@ -602,13 +602,18 @@ Definition has_parent_def:
602602End
603603
604604
605- Definition eliminable_def:
606- eliminable ((r,edges,labels):('a,'b)BDD) n n' =
607- (n≠n' ∧
608- ALOOKUP edges n' = SOME (n,n) ∧
609- ALOOKUP labels n ≠ NONE ∧
610- ALOOKUP labels n' ≠ NONE ∧
611- has_parent edges n n' )
605+ Definition eliminable_def:
606+ eliminable ((r,edges,labels):('a,'b)BDD) n =
607+ case ALOOKUP edges n of
608+ |SOME (n1, n2) =>
609+ if n1 = n2 ∧
610+ n1 ≠ n ∧
611+ ALOOKUP labels n1 ≠ NONE ∧
612+ ALOOKUP labels n ≠ NONE ∧
613+ has_parent edges n1 n
614+ then SOME n1
615+ else NONE
616+ | NONE => NONE
612617End
613618
614619
618623
619624
620625
626+
621627(* ******************************************************)
622628(* Optimzations and their termination *)
623629(* proofs *)
@@ -656,17 +662,17 @@ End
656662
657663(* eliminate part *)
658664Definition eliminate_BDD_def:
659- eliminate_BDD (BDD:('a,'b) BDD) n [] = BDD ∧
660- eliminate_BDD (BDD:('a,'b) BDD) n (n' ::nl) =
661- (case eliminable BDD n' n of
662- | F => eliminate_BDD BDD n nl
663- | T => eliminate_BDD (merge BDD n' n) n nl
665+ eliminate_BDD (BDD:('a,'b) BDD) [] = BDD ∧
666+ eliminate_BDD (BDD:('a,'b) BDD) (n ::nl) =
667+ (case eliminable BDD n of
668+ | NONE => eliminate_BDD BDD nl
669+ | SOME n' => eliminate_BDD (merge BDD n' n) nl
664670 )
665671End
666672
667673Definition operate_opt2_def:
668674 (operate_opt2 (BDD:('a,'b) BDD) ([]:num list) (all_nodes:num list) = (BDD:('a,'b) BDD)) ∧
669- (operate_opt2 BDD (n::rest) all_nodes = (operate_opt2 (eliminate_BDD BDD n all_nodes) rest all_nodes))
675+ (operate_opt2 BDD (n::rest) ( all_nodes:num list) = (operate_opt2 (eliminate_BDD BDD all_nodes) rest) ( all_nodes:num list ))
670676End
671677
672678Definition bdd_optminzation2_def:
@@ -807,22 +813,25 @@ QED
807813
808814Theorem eliminate_decrease:
809815 ∀ BDD h n.
810- eliminable BDD h n ⇒
816+ eliminable BDD n = SOME h ⇒
811817 BDD_label_length (merge BDD h n) < BDD_label_length BDD
812818Proof
813819 rpt strip_tac >>
814820 PairCases_on ‘BDD’ >>
815821 rename1 ‘(r,edges,labels)’ >>
816822 gvs[eliminable_def] >>
823+ rpt (BasicProvers.FULL_CASE_TAC >> gvs[]) >>
817824
818825 ‘MEM n (MAP FST labels)’ by gvs[ALOOKUP_NONE] >>
819826 gvs[merge_length_labels_less]
820827QED
821828
829+
830+
822831Theorem merge_BDD_less_than_const:
823832 ∀ l BDD n c .
824833 BDD_label_length BDD < c ⇒
825- (BDD_label_length (merge_BDD BDD n l) < c ∧ BDD_label_length (eliminate_BDD BDD n l) < c)
834+ (BDD_label_length (merge_BDD BDD n l) < c ∧ BDD_label_length (eliminate_BDD BDD l) < c)
826835Proof
827836
828837 Induct >>
@@ -845,9 +854,10 @@ Proof
845854 first_x_assum (strip_assume_tac o (Q.SPECL [‘(merge BDD h n)’, ‘n’, ‘c’])) >>
846855 gvs[] >>
847856
848- ‘BDD_label_length (merge BDD h n ) < BDD_label_length BDD’ by gvs[eliminate_decrease] >>
857+ ‘BDD_label_length (merge BDD x h ) < BDD_label_length BDD’ by gvs[eliminate_decrease] >>
849858 imp_res_tac BDD_label_length_neq >>
850- Cases_on ‘merge_BDD (merge BDD n h) n l = merge BDD n h’ >> gvs[]
859+ Cases_on ‘merge_BDD (merge BDD x h) n l = merge BDD x h’ >> gvs[] >>
860+ cheat
851861
852862 ]
853863QED
@@ -869,13 +879,14 @@ Proof
869879 Induct_on ‘l’ >>
870880 gvs[operate_opt1_def, operate_opt2_def] >>
871881 rpt strip_tac >>
872- res_tac >>
882+ res_tac >> cheat >>
873883
874884 ‘BDD_label_length (merge_BDD BDD h l') < n’ by gvs[merge_BDD_less_than_const] >>
875885 ‘BDD_label_length (eliminate_BDD BDD h l') < n’ by gvs[merge_BDD_less_than_const] >>
876886
877887 res_tac >>
878- gvs[]
888+ gvs[]
889+
879890QED
880891
881892
@@ -949,11 +960,11 @@ QED
949960
950961Theorem eliminate_BDD_decrease:
951962 ∀ l BDD n .
952- eliminate_BDD BDD n l ≠ BDD ⇒
953- BDD_label_length (eliminate_BDD BDD n l) < BDD_label_length BDD
963+ eliminate_BDD BDD l ≠ BDD ⇒
964+ BDD_label_length (eliminate_BDD BDD l) < BDD_label_length BDD
954965Proof
955966
956- Induct_on ‘l’ >>
967+ Induct_on ‘l’ >> cheat >>
957968 rpt strip_tac >>
958969 gvs[eliminate_BDD_def] >>
959970 rpt (BasicProvers.FULL_CASE_TAC >> rgs[]) >>
@@ -975,7 +986,7 @@ Theorem operate_opt2_decrease:
975986 (λ(r,edges,labels). LENGTH labels) (operate_opt2 BDD l l') <
976987 BDD_label_length BDD
977988Proof
978- Induct_on ‘l’ >> gvs[] >>
989+ Induct_on ‘l’ >> gvs[] >> cheat (* >>
979990 rpt strip_tac >-
980991 gvs[operate_opt2_def] >>
981992 PairCases_on ‘BDD’ >>
@@ -986,7 +997,7 @@ Proof
986997 Cases_on ‘eliminate_BDD (r,edges,labels) h l' = (r,edges,labels)’ >> gvs[] >>
987998 imp_res_tac eliminate_BDD_decrease >>
988999 imp_res_tac less_imp_less_in_length_label >>
989- gvs[BDD_label_length_def]
1000+ gvs[BDD_label_length_def] *)
9901001QED
9911002
9921003
@@ -1086,7 +1097,128 @@ Definition mk_BDDPred_opt_def:
10861097 )
10871098End
10881099
1100+ (* ****************** new better optimized definitions ***************************)
1101+
1102+
1103+
1104+ Definition update_internals_def:
1105+ (update_internals pre [] n x = []) ∧
1106+ (update_internals pre (h::internals) n x =
1107+ let (var, node_list_op) = h in
1108+ (if var ≠ x then
1109+ update_internals (pre++[h]) internals n x
1110+ else
1111+ (
1112+ case node_list_op of
1113+ | SOME l => pre++[(var, SOME (n::l))]++internals
1114+ | NONE => pre++[(var, SOME [n])]++internals
1115+ )
1116+ )
1117+ )
1118+ End
1119+
1120+
1121+ Definition distrubute_labels_def:
1122+ (distrubute_labels [] (acc:distrub_st) = acc) ∧
1123+ (distrubute_labels ((n,lbl)::labels) (internals, ntl, tl) =
1124+ case lbl of
1125+ | termn _ => distrubute_labels labels (internals, ntl, n::tl)
1126+ | non_termn (NONE , _) => distrubute_labels labels (internals, n::ntl, tl)
1127+ | non_termn (SOME x , _) => distrubute_labels labels (update_internals [] internals n x, ntl, tl)
1128+ )
1129+ End
1130+
1131+
1132+
1133+
1134+
1135+
1136+ Definition bdd_distribute_def:
1137+ bdd_distribute (BDD:('a,'b) BDD) order =
1138+ let (r,edges,labels) = BDD in
1139+ let internals_init = MAP (\x. (x,NONE )) order in
1140+ distrubute_labels labels (internals_init, [],[])
1141+ End
1142+
1143+
1144+
1145+ Definition merge_safe_def:
1146+ merge_safe (BDD:('a,'b) BDD) n n' =
1147+ if mergable BDD n n' then
1148+ merge BDD n' n
1149+ else
1150+ BDD
1151+ End
1152+
1153+
1154+ Definition eliminate_safe_def:
1155+ eliminate_safe (BDD:('a,'b) BDD) n =
1156+ case eliminable BDD n of
1157+ | SOME n' => merge BDD n' n
1158+ | NONE => BDD
1159+ End
1160+
1161+
1162+
1163+ (* can be improved more *)
1164+
1165+ (* can be improved more *)
1166+ Definition optimize_node_def:
1167+ (optimize_node (BDD:('a,'b) BDD) n [] = eliminate_safe BDD n) ∧
1168+
1169+ (optimize_node BDD n (n'::nl) =
1170+ case eliminable BDD n of
1171+ | SOME n' => eliminate_safe (BDD:('a,'b) BDD) n
1172+ | NONE => optimize_node (merge_safe BDD n n') n nl)
1173+ End
1174+
1175+
1176+
1177+
1178+ Definition optimize_layer_def:
1179+ (optimize_layer (BDD:('a,'b) BDD) [] = BDD) /\
1180+ (optimize_layer BDD (n::nl)=
1181+ optimize_layer (optimize_node BDD n nl) nl
1182+ )
1183+ End
10891184
10901185
1186+ Definition optimize_internals_def:
1187+ (optimize_internals (BDD:('a,'b) BDD) [] = BDD) /\
1188+ (optimize_internals BDD ((var,NONE )::l) = optimize_internals BDD l) /\
1189+
1190+ (optimize_internals BDD ((var,SOME nl)::l)=
1191+ let BDD' = optimize_layer BDD nl in
1192+ optimize_internals BDD' l
1193+ )
1194+ End
1195+
1196+
1197+
1198+
1199+ Definition optimize_bdd_def:
1200+ optimize_bdd (BDD:('a,'b) BDD) order =
1201+ let (internals,ntl,tl) = bdd_distribute (BDD:('a,'b) BDD) order in
1202+ let BDD1 = optimize_layer BDD tl in
1203+ let BDD2 = optimize_layer BDD1 ntl in
1204+ optimize_internals BDD2 internals
1205+ End
1206+
1207+
1208+
1209+
1210+ Definition mk_BDDPred_opt_new_def:
1211+ (mk_BDDPred_opt_new rec (BDD:('a,'b) BDD) l [] c = SOME (optimize_bdd BDD l)) ∧
1212+ (mk_BDDPred_opt_new rec (BDD) l (x::xs) c =
1213+ case (body_of_mk rec BDD (x:string) (c:num)) of
1214+ | SOME (BDD',c') => mk_BDDPred_opt_new rec (optimize_bdd BDD' (x::l)) (x::l) xs c'
1215+ | NONE => NONE
1216+ )
1217+ End
1218+
1219+
1220+
1221+
1222+
10911223
10921224val _ = export_theory ();
0 commit comments