sig
  type key = symbol * symbol
  type 'a t
  val empty : 'a t
  val is_empty : 'a t -> bool
  val cardinal : 'a t -> int
  val add : 'a t -> key -> '-> 'a t
  val find : 'a t -> key -> 'a
  val remove : 'a t -> key -> 'a t
  val mem : 'a t -> key -> bool
  val find_key : 'a t -> key -> key option
  val iter : (key -> '-> unit) -> 'a t -> unit
  val map : ('-> 'b) -> 'a t -> 'b t
  val mapi : (key -> '-> 'b) -> 'a t -> 'b t
  val fold : ('-> key -> '-> 'a) -> '-> 'b t -> 'a
  val fold_map : ('-> key -> '-> 'a * 'c) -> '-> 'b t -> 'a * 'c t
  val forall2 : ('-> '-> bool) -> 'a t -> 'b t -> bool
  val forall : (key -> '-> bool) -> 'a t -> bool
  val exists : (key -> '-> bool) -> 'a t -> bool
  val find_iter : (key -> '-> 'b option) -> 'a t -> 'b option
  val isect_mem : 'a t -> (key -> bool) -> 'a t
  val choose : 'a t -> key * 'a
  val filter_add : 'a t -> key -> ('a option -> 'a) -> 'a t
  val filter_remove : 'a t -> key -> ('-> 'a option) -> 'a t
  val replace : 'a t -> key -> ('-> 'a) -> 'a t
  val keys : 'a t -> key list
  val data : 'a t -> 'a list
  val add_list : 'a t -> (key * 'a) list -> 'a t
  val equal : ('-> '-> bool) -> 'a t -> 'a t -> bool
  val union : (key -> '-> '-> 'a) -> 'a t -> 'a t -> 'a t
end