(* ---------------------------------------------------------------------------- *)

(* 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
}.

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.