Hint Extern 1 (lift ?wk _ _ = lift (S ?wk) _ _) =>
eapply lift_lift_fuse_successor
: lift_lift_fuse_successor.
(* [lift_zero] and [lift_lift_fuse_successor] are often useful when arguing that [lift n] is equivalent to [n] successive applications of [lift 1]. The following tactic helps with this argument. *)
Ltac iterated_lift :=
first [
rewrite lift_zero
| rewrite <- lift_lift_fuse_successor
].
(* The following lemma can be viewed as a general form of [subst_lift]. Indeed, [subst_lift] corresponds to a special case of [subst_lift_generalized] where [n] is zero. *)

(* Specifications: *)
Lemma subst_lift_generalized:
forall `{Lift T, Subst V T},
forall { _ : LiftLift },
forall { _ : LiftLiftFuse },
forall { _ : SubstLift },
forall n v t,
subst v n (lift (S n) 0 t) = lift n 0 t.