(* ---------------------------------------------------------------------------- *)
(* This is our generic definition of [lift] in terms of [traverse]. *)
Instance Lift_Traverse `{Var V, Traverse V T} : Lift T := {
lift w k t :=
traverse (fun l x => var (lift w (l + k) x)) 0 t
}.
(* This lemma repeats the definition (!) and is useful when rewriting. *)

(* Specifications: *)
Lemma expand_lift:
forall `{Var V, Traverse V T},
forall w k t,
lift w k t =
traverse (fun l x => var (lift w (l + k) x)) 0 t.