@@ -1113,6 +1113,9 @@ val _ = type_abbrev("distrub_st", ``:( (string, (num list) option) alist # num
11131113
11141114
11151115
1116+
1117+
1118+
11161119Definition eliminable_new_def:
11171120 eliminable_new ((r,edges,labels):('a,'b)BDD) n =
11181121 case ALOOKUP edges n of
@@ -1127,6 +1130,28 @@ End
11271130
11281131
11291132
1133+ Definition eliminable_projection_def:
1134+ eliminable_projection edges_proj n =
1135+ case ALOOKUP edges_proj n of
1136+ |SOME (n1, n2) =>
1137+ if n1 = n2 ∧
1138+ n1 ≠ n ∧
1139+ n ≠ 0n ∧
1140+ has_parent edges_proj n1 n
1141+ then SOME n1
1142+ else NONE
1143+ | NONE => NONE
1144+ End
1145+
1146+
1147+ Definition mergable_projection_def:
1148+ mergable_projection edges_proj labels_proj n n' =
1149+ (n≠n' ∧ ALOOKUP edges_proj n = ALOOKUP edges_proj n' ∧
1150+ eq_vars_in_labels labels_proj n n' ∧ ALOOKUP labels_proj n' ≠ NONE )
1151+ End
1152+
1153+
1154+
11301155Definition update_internals_def:
11311156 (update_internals pre [] n x = []) ∧
11321157 (update_internals pre (h::internals) n x =
@@ -1189,40 +1214,54 @@ End
11891214
11901215
11911216Definition optimize_node_def:
1192- (optimize_node (BDD:('a,'b) BDD) n [] = SND (eliminate_safe BDD n)) ∧
1217+ (optimize_node edges_proj labels_proj (BDD:('a,'b) BDD) n [] = SND (eliminate_safe BDD n)) ∧
11931218
1194- (optimize_node BDD n (n'::nl) =
1195- case eliminable_new BDD n of
1219+ (optimize_node edges_proj labels_proj BDD n (n'::nl) =
1220+ case eliminable_projection edges_proj n of
11961221 | SOME n' => SND (eliminate_safe BDD n)
11971222 | NONE => (
1198- case mergable BDD n' n of
1223+ case mergable_projection edges_proj labels_proj n' n of
11991224 | T => ( case merge_safe BDD n' n of
12001225 | (T, BDD') => BDD'
1201- | (F, BDD') => optimize_node BDD n nl
1226+ | (F, BDD') => optimize_node edges_proj labels_proj BDD n nl
12021227 )
12031228
1204- | F => optimize_node BDD n nl)
1229+ | F => optimize_node edges_proj labels_proj BDD n nl)
12051230 )
12061231End
12071232
12081233
12091234
12101235
12111236Definition optimize_layer_def:
1212- (optimize_layer (BDD:('a,'b) BDD) [] = BDD) /\
1213- (optimize_layer BDD (n::nl)=
1214- optimize_layer (optimize_node BDD n nl) nl
1237+ (optimize_layer edges_proj labels_proj (BDD:('a,'b) BDD) [] = BDD) /\
1238+ (optimize_layer edges_proj labels_proj BDD (n::nl)=
1239+ optimize_layer edges_proj labels_proj (optimize_node edges_proj labels_proj BDD n nl) nl
12151240 )
12161241End
12171242
1218-
1243+
1244+ Definition project_edges_to_def:
1245+ project_edges_to ((r, edges,labels):('a,'b) BDD) nl =
1246+ MAP (\n. (n,THE(ALOOKUP edges n))) nl
1247+ End
1248+
1249+ Definition project_labels_to_def:
1250+ project_labels_to ((r, edges,labels):('a,'b) BDD) nl =
1251+ MAP (\n. (n,THE(ALOOKUP labels n))) nl
1252+ End
1253+
1254+
1255+
12191256Definition optimize_internals_def:
12201257 (optimize_internals (BDD:('a,'b) BDD) [] = BDD) /\
12211258 (optimize_internals BDD ((var,NONE )::l) = optimize_internals BDD l) /\
12221259
12231260 (optimize_internals BDD ((var,SOME nl)::l)=
1224- let BDD' = optimize_layer BDD nl in
1225- optimize_internals BDD' l
1261+ let edges_proj = project_edges_to BDD nl in
1262+ let labels_proj = project_labels_to BDD nl in
1263+ let BDD' = optimize_layer edges_proj labels_proj BDD nl in
1264+ optimize_internals BDD' l
12261265 )
12271266End
12281267
@@ -1232,9 +1271,11 @@ End
12321271Definition optimize_bdd_def:
12331272 optimize_bdd (BDD:('a,'b) BDD) order =
12341273 let (internals,ntl,tl) = bdd_distribute (BDD:('a,'b) BDD) order in
1235- let BDD1 = optimize_layer BDD tl in
1236- let BDD2 = optimize_layer BDD1 ntl in
1237- optimize_internals BDD2 internals
1274+ let labels_proj_tl = project_labels_to BDD tl in (* for terminals *)
1275+ let labels_proj_ntl = project_labels_to BDD ntl in (* for terminals *)
1276+ let BDD1 = optimize_layer [] labels_proj_tl BDD tl in
1277+ let BDD2 = optimize_layer [] labels_proj_ntl BDD1 ntl in
1278+ optimize_internals BDD2 internals
12381279End
12391280
12401281
@@ -1253,5 +1294,6 @@ End
12531294
12541295
12551296
1297+
12561298
12571299val _ = export_theory ();
0 commit comments