sig
  type t = (Term.trm * Term.trm) list
  val pp : Term.Subst.t Pretty.printer
  val empty : Term.Subst.t
  val fuse :
    Term.apply -> Term.trm * Term.trm -> Term.Subst.t -> Term.Subst.t
  val compose :
    Term.apply -> Term.trm * Term.trm -> Term.Subst.t -> Term.Subst.t
  val lookup : Term.Subst.t -> Term.trm -> Term.trm
  val invlookup : Term.Subst.t -> (Term.trm -> bool) -> Term.trm
  val apply :
    Term.map ->
    ((Term.trm * Term.trm) * 'a) list -> Term.trm -> Term.trm * 'a list
  val fold : (Term.trm * Term.trm -> '-> 'a) -> Term.Subst.t -> '-> 'a
end