Module EqdepTh := EqdepTheory EqdepElim.
Export EqdepTh.
(* Generalize the extensionality tactic from the Coq library. *)
Tactic Notation "extensionality" :=
let x := fresh "x" in extensionality x.
Tactic Notation "extensionality" ident(x0) ident(x1) :=
extensionality x0; extensionality x1.
Tactic Notation "extensionality" ident(x0) ident(x1) ident(x2) :=
extensionality x0; extensionality x1; extensionality x2.
Tactic Notation "extensionality" ident(x0) ident(x1) ident(x2) ident(x3) :=
extensionality x0; extensionality x1; extensionality x2; extensionality x3.
Tactic Notation "extensionality" ident(x0) ident(x1) ident(x2) ident(x3)
ident(x4) :=
extensionality x0; extensionality x1; extensionality x2; extensionality x3;
extensionality x4.
Tactic Notation "extensionality" ident(x0) ident(x1) ident(x2) ident(x3)
ident(x4) ident(x5) :=
extensionality x0; extensionality x1; extensionality x2; extensionality x3;
extensionality x4; extensionality x5.
Tactic Notation "extensionality" ident(x0) ident(x1) ident(x2) ident(x3)
ident(x4) ident(x5) ident(x6) :=
extensionality x0; extensionality x1; extensionality x2; extensionality x3;
extensionality x4; extensionality x5; extensionality x6.
Tactic Notation "extensionality" ident(x0) ident(x1) ident(x2) ident(x3)
ident(x4) ident(x5) ident(x6) ident(x7) :=
extensionality x0; extensionality x1; extensionality x2; extensionality x3;
extensionality x4; extensionality x5; extensionality x6; extensionality x7.
Tactic Notation "extensionality" ident(x0) ident(x1) ident(x2) ident(x3)
ident(x4) ident(x5) ident(x6) ident(x7) ident(x8) :=
extensionality x0; extensionality x1; extensionality x2; extensionality x3;
extensionality x4; extensionality x5; extensionality x6; extensionality x7;
extensionality x8.
Tactic Notation "extensionality" ident(x0) ident(x1) ident(x2) ident(x3)
ident(x4) ident(x5) ident(x6) ident(x7) ident(x8) ident(x9) :=
extensionality x0; extensionality x1; extensionality x2; extensionality x3;
extensionality x4; extensionality x5; extensionality x6; extensionality x7;
extensionality x8; extensionality x9.

Lemma exist_ext:
forall (A: Type) (P: A -> Prop) (x y: A) (Hx: P x) (Hy: P y),
x = y -> exist _ x Hx = exist _ y Hy.