let filter_base f m =
    match m with
    | Top (t, a) ->
        (try
           inject_top_origin a
             (Top_Param.fold
                (fun v acc -> if f v then Top_Param.O.add v acc else acc)
                t
                Top_Param.O.empty)
         with Top_Param.Error_Top -> top)
    | Map m ->
        Map (M.fold (fun k _ acc -> if f k then acc else M.remove k acc) m m)