Ltac generalize_proof :=
    match goal with
    | [ |- context[eq_rect _ _ _ _ ?H ] ] => generalize H
    end.Ltac eq_rect_simpl :=
  unfold eq_rec_r, eq_rec;
  repeat rewrite eq_rect_nat_double;
  repeat rewrite <- (eq_rect_eq_dec eq_nat_dec).Ltac destruct_existT :=
  repeat match goal with
           | [H: existT _ _ _ = existT _ _ _ |- _] =>
             (apply Eqdep.EqdepTheory.inj_pair2 in H; subst)
         end.

Lemma eq_rect_existT_eq: forall (X: Type) (P: X -> Type) (x1 x2: X) (H1: P x1) (H2: P x2) (Hx: x1 = x2) (Hex: existT P x1 H1 = existT P x2 H2), H2 = eq_rect _ P H1 _ Hx.