sig
  module S :
    sig
      type t
      and ext = Term.Var.Set.t
      val eq : t -> t -> bool
      val pp : t Pretty.printer
      val empty : t
      val is_empty : t -> bool
      val is_dependent : t -> Term.t -> bool
      val is_independent : t -> Term.t -> bool
      val iter : (Fact.Equal.t -> unit) -> t -> unit
      val fold : (Fact.Equal.t -> '-> 'a) -> t -> '-> 'a
      val for_all : (Fact.Equal.t -> bool) -> t -> bool
      val exists : (Fact.Equal.t -> bool) -> t -> bool
      val to_list : t -> Fact.Equal.t list
      val equality : t -> Term.t -> Fact.Equal.t
      val apply : t -> Jst.Eqtrans.t
      val find : t -> Jst.Eqtrans.t
      val inv : t -> Jst.Eqtrans.t
      val dep : t -> Term.t -> Term.Var.Set.t
      val ext : t -> ext
      module Dep :
        sig
          type eqs = t
          val iter : eqs -> (Fact.Equal.t -> unit) -> Term.t -> unit
          val fold : eqs -> (Fact.Equal.t -> '-> 'a) -> Term.t -> '-> 'a
          val for_all : eqs -> (Fact.Equal.t -> bool) -> Term.t -> bool
          val exists : eqs -> (Fact.Equal.t -> bool) -> Term.t -> bool
          val choose :
            eqs -> (Fact.Equal.t -> bool) -> Term.t -> Fact.Equal.t
        end
      val restrict : t -> Term.t -> unit
      type config = Partition.t * t
      val update : config -> Fact.Equal.t -> unit
      val diff : t -> t -> t
      val copy : t -> t
    end
  type tag = R | T
  val pp : La.tag -> La.S.t Pretty.printer
  val can : Partition.t * La.S.t -> Jst.Eqtrans.t
  val nl_merge : (Fact.Equal.t -> unit) Pervasives.ref
  module Infsys :
    sig
      type e = S.t
      val current : unit -> e
      val initialize : e -> unit
      val finalize : unit -> e
      val abstract : Term.t -> unit
      val merge : Fact.Equal.t -> unit
      val propagate : Fact.Equal.t -> unit
      val dismerge : Fact.Diseq.t -> unit
      val propagate_diseq : Fact.Diseq.t -> unit
      val branch : unit -> unit
      val normalize : unit -> unit
      val nonneg : Fact.Nonneg.t -> unit
      val pos : Fact.Pos.t -> unit
    end
  exception Unbounded
  val upper : Partition.t * La.S.t -> Jst.Eqtrans.t
  val lower : Partition.t * La.S.t -> Jst.Eqtrans.t
  val is_equal : Partition.t * La.S.t -> Jst.Pred2.t
  val model : La.S.t -> Term.t list -> Term.t Term.Map.t
end