sig
  module type HashedLogtkType =
    sig
      type t
      val equal :
        LogtkHashcons.HashedLogtkType.t ->
        LogtkHashcons.HashedLogtkType.t -> bool
      val hash : LogtkHashcons.HashedLogtkType.t -> int
      val tag : int -> LogtkHashcons.HashedLogtkType.t -> unit
    end
  module type S =
    sig
      type elt
      module H :
        sig
          type data = elt
          type t
          val create : int -> t
          val clear : t -> unit
          val merge : t -> data -> data
          val add : t -> data -> unit
          val remove : t -> data -> unit
          val find : t -> data -> data
          val find_all : t -> data -> data list
          val mem : t -> data -> bool
          val iter : (data -> unit) -> t -> unit
          val fold : (data -> '-> 'a) -> t -> '-> 'a
          val count : t -> int
          val stats : t -> int * int * int * int * int * int
        end
      type t
      val default : LogtkHashcons.S.t
      val weak_of : LogtkHashcons.S.t -> LogtkHashcons.S.H.t
      val hashcons :
        ?table:LogtkHashcons.S.t ->
        LogtkHashcons.S.elt -> LogtkHashcons.S.elt
      val mem : ?table:LogtkHashcons.S.t -> LogtkHashcons.S.elt -> bool
      val fresh_unique_id : ?table:LogtkHashcons.S.t -> unit -> int
      val stats :
        ?table:LogtkHashcons.S.t -> unit -> int * int * int * int * int * int
    end
  module Make :
    functor (X : HashedLogtkType->
      sig
        type elt = X.t
        module H :
          sig
            type data = elt
            type t
            val create : int -> t
            val clear : t -> unit
            val merge : t -> data -> data
            val add : t -> data -> unit
            val remove : t -> data -> unit
            val find : t -> data -> data
            val find_all : t -> data -> data list
            val mem : t -> data -> bool
            val iter : (data -> unit) -> t -> unit
            val fold : (data -> '-> 'a) -> t -> '-> 'a
            val count : t -> int
            val stats : t -> int * int * int * int * int * int
          end
        type t
        val default : t
        val weak_of : t -> H.t
        val hashcons : ?table:t -> elt -> elt
        val mem : ?table:t -> elt -> bool
        val fresh_unique_id : ?table:t -> unit -> int
        val stats : ?table:t -> unit -> int * int * int * int * int * int
      end
end