sig
  type +'a t = private { id : ID.t; ty : 'a; }
  type 'a var = 'a Var.t
  val make : ty:'a -> ID.t -> 'a Var.t
  val of_string : ty:'a -> string -> 'a Var.t
  val gensym : ty:'a -> unit -> 'a Var.t
  val copy : 'a Var.t -> 'a Var.t
  val update_ty : 'a Var.t -> f:('a -> 'b) -> 'b Var.t
  val id : 'a Var.t -> ID.t
  val ty : 'a Var.t -> 'a
  val name : 'a Var.t -> string
  val compare : 'a Var.t -> 'b Var.t -> int
  val equal : 'a Var.t -> 'b Var.t -> bool
  val hash : 'a Var.t -> int
  val hash_fun : 'a Var.t CCHash.hash_fun
  val pp : 'a Var.t CCFormat.printer
  val to_string : 'a Var.t -> string
  val pp_full : 'a Var.t CCFormat.printer
  val pp_fullc : 'a Var.t CCFormat.printer
  module Set :
    sig
      type +'a t
      val is_empty : 'a Var.Set.t -> bool
      val empty : 'a Var.Set.t
      val add : 'a Var.Set.t -> 'a Var.var -> 'a Var.Set.t
      val mem : 'a Var.Set.t -> 'a Var.var -> bool
      val find : 'a Var.Set.t -> ID.t -> 'a Var.var option
      val find_exn : 'a Var.Set.t -> ID.t -> 'a Var.var
      val diff : 'a Var.Set.t -> 'a Var.Set.t -> 'a Var.Set.t
      val of_seq : 'a Var.var Sequence.t -> 'a Var.Set.t
      val to_seq : 'a Var.Set.t -> 'a Var.var Sequence.t
      val to_list : 'a Var.Set.t -> 'a Var.var list
      val cardinal : 'a Var.Set.t -> int
      val pp : 'a Var.Set.t CCFormat.printer
    end
  module Subst :
    sig
      type (+'a, +'b) t
      val empty : ('a, 'b) Var.Subst.t
      val add :
        ('a, 'b) Var.Subst.t -> 'a Var.var -> 'b -> ('a, 'b) Var.Subst.t
      val mem : ('a, 'b) Var.Subst.t -> 'a Var.var -> bool
      val find : ('a, 'b) Var.Subst.t -> 'a Var.var -> 'b option
      val find_exn : ('a, 'b) Var.Subst.t -> 'a Var.var -> 'b
      val of_seq : ('a Var.var * 'b) Sequence.t -> ('a, 'b) Var.Subst.t
      val to_list : ('a, 'b) Var.Subst.t -> ('a Var.var * 'b) list
      val to_seq : ('a, 'b) Var.Subst.t -> ('a Var.var * 'b) Sequence.t
      val pp : 'b CCFormat.printer -> ('a, 'b) Var.Subst.t CCFormat.printer
    end
end