functor (Key : Id_Datatype->
  sig
    type key = Key.t
    type 'v map
    val id : 'v map -> int
    val hash : 'v map -> int
    val equal : 'v map -> 'v map -> bool
    val compare : ('-> '-> int) -> 'v map -> 'v map -> int
    val pretty : 'Pretty_utils.formatter -> 'v map Pretty_utils.formatter
    val is_empty : 'v map -> bool
    val is_singleton : 'v map -> (key * 'v) option
    val on_singleton : (key -> '-> bool) -> 'v map -> bool
    val cardinal : 'v map -> int
    val find : key -> 'v map -> 'v
    val find_check_missing : key -> 'v map -> 'v
    val find_key : key -> 'v map -> key
    val mem : key -> 'v map -> bool
    val min_binding : 'v map -> key * 'v
    val max_binding : 'v map -> key * 'v
    val iter : (key -> '-> unit) -> 'v map -> unit
    val for_all : (key -> '-> bool) -> 'v map -> bool
    val exists : (key -> '-> bool) -> 'v map -> bool
    val fold : (key -> '-> '-> 'b) -> 'v map -> '-> 'b
    val fold_rev : (key -> '-> '-> 'b) -> 'v map -> '-> 'b
    val cached_fold :
      cache_name:string ->
      temporary:bool ->
      f:(key -> '-> 'b) ->
      joiner:('-> '-> 'b) -> empty:'-> 'v map -> 'b
    val fold2_join_heterogeneous :
      cache:Hptmap_sig.cache_type ->
      empty_left:('b map -> 'c) ->
      empty_right:('a map -> 'c) ->
      both:(key -> '-> '-> 'c) ->
      join:('-> '-> 'c) -> empty:'-> 'a map -> 'b map -> 'c
    type predicate_type = ExistentialPredicate | UniversalPredicate
    type predicate_result = PTrue | PFalse | PUnknown
    val binary_predicate :
      Hptmap_sig.cache_type ->
      predicate_type ->
      decide_fast:('a map -> 'b map -> predicate_result) ->
      decide_fst:(key -> '-> bool) ->
      decide_snd:(key -> '-> bool) ->
      decide_both:(key -> '-> '-> bool) -> 'a map -> 'b map -> bool
    val symmetric_binary_predicate :
      Hptmap_sig.cache_type ->
      predicate_type ->
      decide_fast:('v map -> 'v map -> predicate_result) ->
      decide_one:(key -> '-> bool) ->
      decide_both:(key -> '-> '-> bool) -> 'v map -> 'v map -> bool
    val decide_fast_inclusion : 'v map -> 'v map -> predicate_result
    val decide_fast_intersection : 'v map -> 'v map -> predicate_result
    val clear_caches : unit -> unit
    type 'a t = 'a map
  end