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