sig
  type t
  type elt = elt
  val empty : t
  val add : t -> term -> elt -> t
  val remove : t -> term -> elt -> t
  val is_empty : t -> bool
  val iter : t -> (term -> elt -> unit) -> unit
  val fold : t -> '-> ('-> term -> elt -> 'a) -> 'a
  val size : t -> int
  val fold_unify :
    ?subst:subst ->
    t Scoped.t -> term Scoped.t -> (term * elt * subst) Sequence.t
  val fold_match :
    ?subst:subst ->
    t Scoped.t -> term Scoped.t -> (term * elt * subst) Sequence.t
  val fold_matched :
    ?subst:subst ->
    t Scoped.t -> term Scoped.t -> (term * elt * subst) Sequence.t
end