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