sig
  type id = ID.t
  type +'ty t = private { id : Var.id; ty : 'ty; }
  val equal : 'Var.t -> 'Var.t -> bool
  val compare : 'Var.t -> 'Var.t -> int
  val make : ty:'ty -> name:string -> 'ty Var.t
  val makef :
    ty:'ty ->
    ('b, Format.formatter, unit, 'ty Var.t) Pervasives.format4 -> 'b
  val fresh_copy : 'ty Var.t -> 'ty Var.t
  val fresh_copies : 'ty Var.t list -> 'ty Var.t list
  val of_id : ty:'ty -> Var.id -> 'ty Var.t
  val ty : 'ty Var.t -> 'ty
  val id : 'Var.t -> Var.id
  val name : 'Var.t -> string
  val update_ty : 'Var.t -> f:('-> 'b) -> 'Var.t
  val set_ty : 'Var.t -> ty:'-> 'Var.t
  val fresh_update_ty : 'Var.t -> f:('-> 'b) -> 'Var.t
  val make_gen :
    names:(int -> string, unit, string) Pervasives.format -> '-> 'Var.t
  val print : 'Var.t CCFormat.printer
  val to_string : 'Var.t -> string
  val print_full : 'Var.t CCFormat.printer
  val to_string_full : 'Var.t -> string
  module Subst :
    sig
      type 'a var = 'Var.t
      type (+'ty, +'a) t
      val empty : ('a, 'b) Var.Subst.t
      val is_empty : ('a, 'b) Var.Subst.t -> bool
      val size : ('a, 'b) Var.Subst.t -> int
      val singleton : 'ty Var.Subst.var -> '-> ('ty, 'a) Var.Subst.t
      val add :
        subst:('ty, 'a) Var.Subst.t ->
        'ty Var.Subst.var -> '-> ('ty, 'a) Var.Subst.t
      val add_list :
        subst:('ty, 'a) Var.Subst.t ->
        'ty Var.Subst.var list -> 'a list -> ('ty, 'a) Var.Subst.t
      val concat :
        ('ty, 'a) Var.Subst.t ->
        into:('ty, 'a) Var.Subst.t -> ('ty, 'a) Var.Subst.t
      val of_list :
        'ty Var.Subst.var list -> 'a list -> ('ty, 'a) Var.Subst.t
      val remove :
        subst:('ty, 'a) Var.Subst.t ->
        'ty Var.Subst.var -> ('ty, 'a) Var.Subst.t
      val deref_rec :
        subst:('ty, 'ty Var.Subst.var) Var.Subst.t ->
        'ty Var.Subst.var -> 'ty Var.Subst.var
      val find_deref_rec :
        subst:('ty, 'ty Var.Subst.var) Var.Subst.t ->
        'ty Var.Subst.var -> 'ty Var.Subst.var option
      val rename_var :
        ('a, 'Var.Subst.var) Var.Subst.t ->
        'Var.Subst.var ->
        ('a, 'Var.Subst.var) Var.Subst.t * 'Var.Subst.var
      val mem : subst:('ty, 'a) Var.Subst.t -> 'ty Var.Subst.var -> bool
      val find :
        subst:('ty, 'a) Var.Subst.t -> 'ty Var.Subst.var -> 'a option
      val find_exn : subst:('ty, 'a) Var.Subst.t -> 'ty Var.Subst.var -> 'a
      val find_or :
        subst:('ty, 'a) Var.Subst.t -> default:'-> 'ty Var.Subst.var -> 'a
      val map :
        f:('-> 'b) -> ('ty, 'a) Var.Subst.t -> ('ty, 'b) Var.Subst.t
      val to_list : ('ty, 'a) Var.Subst.t -> ('ty Var.Subst.var * 'a) list
      val to_seq :
        ('ty, 'a) Var.Subst.t -> ('ty Var.Subst.var * 'a) Sequence.t
      val print :
        'CCFormat.printer -> ('b, 'a) Var.Subst.t CCFormat.printer
    end
  module Set :
    functor (Ty : sig type t end->
      sig
        type elt = Ty.t t
        type t
        val empty : t
        val is_empty : t -> bool
        val mem : elt -> t -> bool
        val add : elt -> t -> t
        val singleton : elt -> t
        val remove : elt -> t -> t
        val union : t -> t -> t
        val inter : t -> t -> t
        val diff : t -> t -> t
        val compare : t -> t -> int
        val equal : t -> t -> bool
        val subset : t -> t -> bool
        val iter : (elt -> unit) -> t -> unit
        val fold : (elt -> '-> 'a) -> t -> '-> 'a
        val for_all : (elt -> bool) -> t -> bool
        val exists : (elt -> bool) -> t -> bool
        val filter : (elt -> bool) -> t -> t
        val partition : (elt -> bool) -> t -> t * t
        val cardinal : t -> int
        val elements : t -> elt list
        val min_elt : t -> elt
        val max_elt : t -> elt
        val choose : t -> elt
        val split : elt -> t -> t * bool * t
        val find : elt -> t -> elt
        val of_seq : elt CCSet.sequence -> t
        val add_seq : t -> elt CCSet.sequence -> t
        val to_seq : t -> elt CCSet.sequence
        val of_list : elt list -> t
        val add_list : t -> elt list -> t
        val to_list : t -> elt list
        val pp :
          ?start:string ->
          ?stop:string -> ?sep:string -> elt CCSet.printer -> t CCSet.printer
        val print :
          ?start:string ->
          ?stop:string ->
          ?sep:string -> elt CCSet.formatter -> t CCSet.formatter
      end
end