module type S =sig..end
type term 
type t 
val create : ?size:int -> unit -> tsize : a hint for the initial size of the hashtable.val clear : t -> unitval push : t -> unitCongruence.S.pop will restore the congruence to its current state.val pop : t -> unitInvalid_argument if there is no checkpoint to restore to
        (ie if no call to Congruence.S.push matches this call to Congruence.S.pop)val stack_size : t -> intCongruence.S.push that lead to the current state of the
      congruence. Also, how many times Congruence.S.pop can be called.val find : t -> term -> termval iter : t ->
       (mem:term -> repr:term -> unit) -> unitmem, the term itself, and repr,
      the current representative of the term mem.
      Invariant: when calling iter cc f, if f ~mem ~repr is called,
      then find cc mem == repr holds.
val iter_roots : t -> (term -> unit) -> unitval mk_eq : t -> term -> term -> unitmk_eq congruence t1 t2 asserts that t1 = t2 belongs to
      the congruenceval mk_less : t -> term -> term -> unitmk_less congruence t1 t2 asserts that t1 < t2 belongs to
      the congruenceval is_eq : t -> term -> term -> boolval is_less : t -> term -> term -> boolval cycles : t -> boolmk_eq and mk_less entail a cycle in
      the ordering (hence contradicting irreflexivity/transitivity of less)