let meet m1 m2 =
if m1 == m2 then m1 else
match m1, m2 with
| Top (x1, a1), Top (x2, a2) ->
let meet_topparam = Top_Param.meet x1 x2 in
Top (meet_topparam, Origin.meet a1 a2)
| Top (Top_Param.Top, _), (Map _ as x)
| (Map _ as x),Top (Top_Param.Top, _) -> x
| Top (Top_Param.Set set, _), (Map _ as x)
| (Map _ as x), Top (Top_Param.Set set, _) ->
filter_base (fun v -> is_in_set ~set v) x
| Map m1, Map m2 ->
let merge_key k v acc =
add_or_bottom k (V.meet v (find_or_bottom k m2)) acc
in
Map (M.fold merge_key m1 M.empty)