@@ -98,19 +98,14 @@ struct
9898 end
9999 | None -> m
100100 let diff m1 m2 =
101- M. merge (fun _ b1 b2 ->
102- match b1, b2 with
103- | Some b1 , Some b2 ->
104- begin match B. diff b1 b2 with
105- | b' when B. is_bot b' ->
106- None (* remove bot bucket to preserve invariant *)
107- | exception Lattice. BotValue ->
108- None (* remove bot bucket to preserve invariant *)
109- | b' ->
110- Some b'
111- end
112- | Some _ , None -> b1
113- | None , _ -> None
101+ M. difference (fun b1 b2 ->
102+ match B. diff b1 b2 with
103+ | b' when B. is_bot b' ->
104+ None (* remove bot bucket to preserve invariant *)
105+ | exception Lattice. BotValue ->
106+ None (* remove bot bucket to preserve invariant *)
107+ | b' ->
108+ Some b'
114109 ) m1 m2
115110
116111 let of_list es = List. fold_left (fun acc e ->
@@ -127,32 +122,24 @@ struct
127122 M. widen m1 m2
128123
129124 let meet m1 m2 =
130- M. merge (fun _ b1 b2 ->
131- match b1, b2 with
132- | Some b1 , Some b2 ->
133- begin match B. meet b1 b2 with
134- | b' when B. is_bot b' ->
135- None (* remove bot bucket to preserve invariant *)
136- | exception Lattice. BotValue ->
137- None (* remove bot bucket to preserve invariant *)
138- | b' ->
139- Some b'
140- end
141- | _ , _ -> None
125+ M. nonidempotent_inter_filter (fun b1 b2 -> (* TODO: idempotent_inter_filter if not using int domain refinement *)
126+ match B. meet b1 b2 with
127+ | b' when B. is_bot b' ->
128+ None (* remove bot bucket to preserve invariant *)
129+ | exception Lattice. BotValue ->
130+ None (* remove bot bucket to preserve invariant *)
131+ | b' ->
132+ Some b'
142133 ) m1 m2
143134 let narrow m1 m2 =
144- M. merge (fun _ b1 b2 ->
145- match b1, b2 with
146- | Some b1 , Some b2 ->
147- begin match B. narrow b1 b2 with
148- | b' when B. is_bot b' ->
149- None (* remove bot bucket to preserve invariant *)
150- | exception Lattice. BotValue ->
151- None (* remove bot bucket to preserve invariant *)
152- | b' ->
153- Some b'
154- end
155- | _ , _ -> None
135+ M. nonidempotent_inter_filter (fun b1 b2 -> (* TODO: idempotent_inter_filter if not using int domain refinement *)
136+ match B. narrow b1 b2 with
137+ | b' when B. is_bot b' ->
138+ None (* remove bot bucket to preserve invariant *)
139+ | exception Lattice. BotValue ->
140+ None (* remove bot bucket to preserve invariant *)
141+ | b' ->
142+ Some b'
156143 ) m1 m2
157144
158145 let union = join
@@ -578,45 +565,75 @@ struct
578565 let nonidempotent_union f m1 m2 = M. nonidempotent_union (fun b1 b2 ->
579566 B. nonidempotent_union f b1 b2
580567 ) m1 m2
581- let idempotent_inter f m1 m2 = M. idempotent_inter (fun b1 b2 ->
582- B. idempotent_inter f b1 b2
568+ let idempotent_inter f m1 m2 = M. idempotent_inter_filter (fun b1 b2 ->
569+ match B. idempotent_inter f b1 b2 with
570+ | b' when B. is_bot b' ->
571+ None (* remove bot bucket to preserve invariant *)
572+ | exception Lattice. BotValue ->
573+ None (* remove bot bucket to preserve invariant *)
574+ | b' ->
575+ Some b'
576+ ) m1 m2
577+ let nonidempotent_inter f m1 m2 = M. nonidempotent_inter_filter (fun b1 b2 ->
578+ match B. nonidempotent_inter f b1 b2 with
579+ | b' when B. is_bot b' ->
580+ None (* remove bot bucket to preserve invariant *)
581+ | exception Lattice. BotValue ->
582+ None (* remove bot bucket to preserve invariant *)
583+ | b' ->
584+ Some b'
583585 ) m1 m2
584- let nonidempotent_inter f m1 m2 = M. nonidempotent_inter (fun b1 b2 ->
585- B. nonidempotent_inter f b1 b2
586+ let idempotent_inter_filter f m1 m2 = M. idempotent_inter_filter (fun b1 b2 ->
587+ match B. idempotent_inter_filter f b1 b2 with
588+ | b' when B. is_bot b' ->
589+ None (* remove bot bucket to preserve invariant *)
590+ | exception Lattice. BotValue ->
591+ None (* remove bot bucket to preserve invariant *)
592+ | b' ->
593+ Some b'
594+ ) m1 m2
595+ let nonidempotent_inter_filter f m1 m2 = M. nonidempotent_inter_filter (fun b1 b2 ->
596+ match B. nonidempotent_inter_filter f b1 b2 with
597+ | b' when B. is_bot b' ->
598+ None (* remove bot bucket to preserve invariant *)
599+ | exception Lattice. BotValue ->
600+ None (* remove bot bucket to preserve invariant *)
601+ | b' ->
602+ Some b'
603+ ) m1 m2
604+ let difference f m1 m2 = M. difference (fun b1 b2 ->
605+ match B. difference f b1 b2 with
606+ | b' when B. is_bot b' ->
607+ None (* remove bot bucket to preserve invariant *)
608+ | exception Lattice. BotValue ->
609+ None (* remove bot bucket to preserve invariant *)
610+ | b' ->
611+ Some b'
586612 ) m1 m2
587- let merge f m1 m2 = failwith " ProjectiveMap.merge" (* TODO: ? *)
588613
589614 let widen m1 m2 =
590615 Lattice. assert_valid_widen ~leq ~pretty_diff m1 m2;
591616 M. widen m1 m2
592617
593618 let meet m1 m2 =
594- M. merge (fun _ b1 b2 ->
595- match b1, b2 with
596- | Some b1 , Some b2 ->
597- begin match B. meet b1 b2 with
598- | b' when B. is_bot b' ->
599- None (* remove bot bucket to preserve invariant *)
600- | exception Lattice. BotValue ->
601- None (* remove bot bucket to preserve invariant *)
602- | b' ->
603- Some b'
604- end
605- | _ , _ -> None
619+ M. nonidempotent_inter_filter (fun b1 b2 -> (* TODO: idempotent_inter_filter if not using int domain refinement *)
620+ match B. meet b1 b2 with
621+ | b' when B. is_bot b' ->
622+ None (* remove bot bucket to preserve invariant *)
623+ | exception Lattice. BotValue ->
624+ None (* remove bot bucket to preserve invariant *)
625+ | b' ->
626+ Some b'
606627 ) m1 m2
607628 let narrow m1 m2 =
608- M. merge (fun _ b1 b2 ->
609- match b1, b2 with
610- | Some b1 , Some b2 ->
611- begin match B. narrow b1 b2 with
612- | b' when B. is_bot b' ->
613- None (* remove bot bucket to preserve invariant *)
614- | exception Lattice. BotValue ->
615- None (* remove bot bucket to preserve invariant *)
616- | b' ->
617- Some b'
618- end
619- | _ , _ -> None
629+ M. nonidempotent_inter_filter (fun b1 b2 -> (* TODO: idempotent_inter_filter if not using int domain refinement *)
630+ match B. narrow b1 b2 with
631+ | b' when B. is_bot b' ->
632+ None (* remove bot bucket to preserve invariant *)
633+ | exception Lattice. BotValue ->
634+ None (* remove bot bucket to preserve invariant *)
635+ | b' ->
636+ Some b'
620637 ) m1 m2
621638
622639 include MapDomain. Print (E ) (V ) (
@@ -778,7 +795,9 @@ struct
778795 in
779796 snd (S. fold f s2 (s1, S. empty () ))
780797 let idempotent_inter _ _ _ = failwith " PairwiseMap.idempotent_inter" (* TODO: ? *)
781- let merge f m1 m2 = failwith " PairwiseMap.merge" (* TODO: ? *)
798+ let idempotent_inter_filter _ _ _ = failwith " PairwiseMap.idempotent_inter_filter" (* TODO: ? *)
799+ let nonidempotent_inter_filter _ _ _ = failwith " PairwiseMap.nonidempotent_inter_filter" (* TODO: ? *)
800+ let difference _ _ _ = failwith " PairwiseMap.difference" (* TODO: ? *)
782801
783802 let leq s1 s2 =
784803 S. for_all (fun b1 ->
0 commit comments