sig
  type (_, _) t = ('_, '_) Type_equal.t = T : ('a, 'a) t
  type ('a, 'b) equal = ('a, 'b) t
  val refl : ('a, 'a) t
  val sym : ('a, 'b) t -> ('b, 'a) t
  val trans : ('a, 'b) t -> ('b, 'c) t -> ('a, 'c) t
  val conv : ('a, 'b) t -> '-> 'b
  val detuple2 : ('a1 * 'a2, 'b1 * 'b2) t -> ('a1, 'b1) t * ('a2, 'b2) t
  val tuple2 : ('a1, 'b1) t -> ('a2, 'b2) t -> ('a1 * 'a2, 'b1 * 'b2) t
  module type Injective =
    sig type 'a t val strip : ('a t, 'b t) equal -> ('a, 'b) equal end
  module type Injective2 =
    sig
      type ('a1, 'a2) t
      val strip :
        (('a1, 'a2) t, ('b1, 'b2) t) equal ->
        ('a1, 'b1) equal * ('a2, 'b2) equal
    end
  module Composition_preserves_injectivity :
    functor (M1 : Injective->
      functor (M2 : Injective->
        sig
          type 'a t = 'M1.t M2.t
          val strip : ('a t, 'b t) equal -> ('a, 'b) equal
        end
  module Id :
    sig
      type 'a t = 'Type_equal.Id.t
      val create : name:string -> 'a t
      val hash : 'a t -> int
      val name : 'a t -> string
      val same : 'a t -> 'b t -> bool
      val same_witness : 'a t -> 'b t -> ('a, 'b) equal Or_error.t
      val same_witness_exn : 'a t -> 'b t -> ('a, 'b) equal
      val sexp_of_t : ('-> Sexplib.Sexp.t) -> 'a t -> Sexplib.Sexp.t
    end
end