sig
  module type HashedType =
    sig
      type t
      val equal : Hashcons.HashedType.t -> Hashcons.HashedType.t -> bool
      val hash : Hashcons.HashedType.t -> int
      val tag : int -> Hashcons.HashedType.t -> Hashcons.HashedType.t
    end
  module type S =
    sig
      type t
      val hashcons : Hashcons.S.t -> Hashcons.S.t
      val iter : (Hashcons.S.t -> unit) -> unit
      val stats : unit -> int * int * int * int * int * int
    end
  module Make :
    functor (H : HashedType->
      sig
        type t = H.t
        val hashcons : t -> t
        val iter : (t -> unit) -> unit
        val stats : unit -> int * int * int * int * int * int
      end
  val combine : int -> int -> int
  val combine2 : int -> int -> int -> int
  val combine3 : int -> int -> int -> int -> int
  val combine_list : ('-> int) -> int -> 'a list -> int
  val combine_option : ('-> int) -> 'a option -> int
  val combine_pair : ('-> int) -> ('-> int) -> 'a * '-> int
  type 'a hash_consed = private { tag : int; node : 'a; }
  module type HashedType_consed =
    sig
      type t
      val equal :
        Hashcons.HashedType_consed.t -> Hashcons.HashedType_consed.t -> bool
      val hash : Hashcons.HashedType_consed.t -> int
    end
  module type S_consed =
    sig
      type key
      val hashcons :
        Hashcons.S_consed.key -> Hashcons.S_consed.key Hashcons.hash_consed
      val iter : (Hashcons.S_consed.key Hashcons.hash_consed -> unit) -> unit
      val stats : unit -> int * int * int * int * int * int
    end
  module Make_consed :
    functor (H : HashedType_consed->
      sig
        type key = H.t
        val hashcons : key -> key hash_consed
        val iter : (key hash_consed -> unit) -> unit
        val stats : unit -> int * int * int * int * int * int
      end
end