sig
  type term = FOTerm.t
  type subst = Substs.t
  module type LEAF = Index_intf.LEAF
  module MakeLeaf :
    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
  module type TERM_IDX = Index_intf.TERM_IDX
  module type CLAUSE = Index_intf.CLAUSE
  module type SUBSUMPTION_IDX = Index_intf.SUBSUMPTION_IDX
  module type EQUATION = Index_intf.EQUATION
  module BasicEquation :
    sig
      type t = FOTerm.t * FOTerm.t
      type rhs = FOTerm.t
      val compare : t -> t -> int
      val extract : t -> Index_intf.term * rhs * bool
      val priority : t -> int
    end
  module type UNIT_IDX = Index_intf.UNIT_IDX
end