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