sig
  type (_, _) t = T : ('a, 'a) Type_equal.t
  type ('a, 'b) equal = ('a, 'b) Type_equal.t
  val refl : ('a, 'a) Type_equal.t
  val sym : ('a, 'b) Type_equal.t -> ('b, 'a) Type_equal.t
  val trans :
    ('a, 'b) Type_equal.t -> ('b, 'c) Type_equal.t -> ('a, 'c) Type_equal.t
  val conv : ('a, 'b) Type_equal.t -> '-> 'b
  module Lift :
    functor (X : T.T1->
      sig
        val lift : ('a, 'b) Type_equal.t -> ('X.t, 'X.t) Type_equal.t
      end
  module Lift2 :
    functor (X : T.T2->
      sig
        val lift :
          ('a1, 'b1) Type_equal.t ->
          ('a2, 'b2) Type_equal.t ->
          (('a1, 'a2) X.t, ('b1, 'b2) X.t) Type_equal.t
      end
  val detuple2 :
    ('a1 * 'a2, 'b1 * 'b2) Type_equal.t ->
    ('a1, 'b1) Type_equal.t * ('a2, 'b2) Type_equal.t
  val tuple2 :
    ('a1, 'b1) Type_equal.t ->
    ('a2, 'b2) Type_equal.t -> ('a1 * 'a2, 'b1 * 'b2) Type_equal.t
  module type Injective =
    sig
      type 'a t
      val strip :
        ('Type_equal.Injective.t, 'Type_equal.Injective.t)
        Type_equal.equal -> ('a, 'b) Type_equal.equal
    end
  module type Injective2 =
    sig
      type ('a1, 'a2) t
      val strip :
        (('a1, 'a2) Type_equal.Injective2.t,
         ('b1, 'b2) Type_equal.Injective2.t)
        Type_equal.equal ->
        ('a1, 'b1) Type_equal.equal * ('a2, 'b2) Type_equal.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
      module Uid : Unique_id_intf.Id
      val uid : 'Type_equal.Id.t -> Uid.t
      val create : name:string -> 'Type_equal.Id.t
      val hash : 'Type_equal.Id.t -> int
      val name : 'Type_equal.Id.t -> string
      val same : 'Type_equal.Id.t -> 'Type_equal.Id.t -> bool
      val same_witness :
        'Type_equal.Id.t ->
        'Type_equal.Id.t -> ('a, 'b) Type_equal.equal Or_error.t
      val same_witness_exn :
        'Type_equal.Id.t -> 'Type_equal.Id.t -> ('a, 'b) Type_equal.equal
      val sexp_of_t :
        ('-> Sexplib.Sexp.t) -> 'Type_equal.Id.t -> Sexplib.Sexp.t
    end
end