let intersects m1 m2 =
    let result =
      match m1,m2 with
      | Top (_,_), Top (_,_) -> true
      | Top _, (Map _ as m) | (Map _ as m), Top _ -> not (equal m bottom)
      | Map m1, Map m2 ->
          let intersects_in_m1 k v2 =
            let v1 = find_or_bottom k m1 in
            if V.intersects v1 v2
            then raise Found_inter
          in
          try
            M.iter intersects_in_m1 m2;
            false
          with
            Found_inter -> true
    in
    (* Format.printf "Map_Lattice.intersects: m1=%a m2=%a result=%b@\n"
       pretty m1
       pretty m2
       result;*)

    result