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