sig
  module type S =
    sig
      type term
      type t
      val create : ?size:int -> unit -> Congruence.S.t
      val clear : Congruence.S.t -> unit
      val push : Congruence.S.t -> unit
      val pop : Congruence.S.t -> unit
      val stack_size : Congruence.S.t -> int
      val find : Congruence.S.t -> Congruence.S.term -> Congruence.S.term
      val iter :
        Congruence.S.t ->
        (mem:Congruence.S.term -> repr:Congruence.S.term -> unit) -> unit
      val iter_roots : Congruence.S.t -> (Congruence.S.term -> unit) -> unit
      val mk_eq :
        Congruence.S.t -> Congruence.S.term -> Congruence.S.term -> unit
      val mk_less :
        Congruence.S.t -> Congruence.S.term -> Congruence.S.term -> unit
      val is_eq :
        Congruence.S.t -> Congruence.S.term -> Congruence.S.term -> bool
      val is_less :
        Congruence.S.t -> Congruence.S.term -> Congruence.S.term -> bool
      val cycles : Congruence.S.t -> bool
    end
  module type TERM =
    sig
      type t
      val equal : Congruence.TERM.t -> Congruence.TERM.t -> bool
      val hash : Congruence.TERM.t -> int
      val subterms : Congruence.TERM.t -> Congruence.TERM.t list
      val update_subterms :
        Congruence.TERM.t -> Congruence.TERM.t list -> Congruence.TERM.t
    end
  module Make :
    functor (T : TERM->
      sig
        type term = T.t
        type t
        val create : ?size:int -> unit -> t
        val clear : t -> unit
        val push : t -> unit
        val pop : t -> unit
        val stack_size : t -> int
        val find : t -> term -> term
        val iter : t -> (mem:term -> repr:term -> unit) -> unit
        val iter_roots : t -> (term -> unit) -> unit
        val mk_eq : t -> term -> term -> unit
        val mk_less : t -> term -> term -> unit
        val is_eq : t -> term -> term -> bool
        val is_less : t -> term -> term -> bool
        val cycles : t -> bool
      end
  module FO :
    sig
      type term = FOTerm.t
      type t
      val create : ?size:int -> unit -> t
      val clear : t -> unit
      val push : t -> unit
      val pop : t -> unit
      val stack_size : t -> int
      val find : t -> term -> term
      val iter : t -> (mem:term -> repr:term -> unit) -> unit
      val iter_roots : t -> (term -> unit) -> unit
      val mk_eq : t -> term -> term -> unit
      val mk_less : t -> term -> term -> unit
      val is_eq : t -> term -> term -> bool
      val is_less : t -> term -> term -> bool
      val cycles : t -> bool
    end
end