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
  ].

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.