let link m1 m2 =
if is_included m1 m2 then m2 (* exact *)
else if is_included m2 m1 then m1 (* exact *)
else match m1, m2 with
| Top _, Map _ -> m1 (* may be approximated *)
| Map _, Top _ -> m2 (* may be approximated *)
| Top (s,_), Top (s',_) ->
if Top_Param.is_included s s' then m2 (* may be approximated *)
else if Top_Param.is_included s' s then m1 (* may be approximated *)
else m1 (* very approximated *)
| Map mm1, Map mm2 ->
let map =
M.fold
(fun k v1 acc ->
let v2 = find_or_bottom k mm2 in
let link_v = V.link v1 v2 in
M.add k link_v acc)
mm1
mm2
in
Map map