End EqdepElim.
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.

(* Specifications: *)
Lemma imp_ext: forall (A A' B B' : Prop), (A=A') -> (A -> (B=B')) -> ((A->B)=(A'->B')).
Lemma exists_ext: forall (A: Type) F G, (forall x: A, F x = G x) -> (Logic.ex F = Logic.ex G).
Lemma and_ext: forall A B C D, A=B -> C=D -> (A /\ C) = (B /\ D).
Lemma and_ext': forall (A: Prop) B C D, A=B -> (A -> (C=D)) -> (A /\ C) = (B /\ D).
Lemma or_ext: forall A B C D, A=B -> C=D -> (A \/ C) = (B \/ D).
Lemma forall_ext: forall (A: Type) (F: A -> Prop) G, (forall x:A, F x = G x) -> (forall x, F x) = (forall x, G x).
Lemma existT_ext:
forall (A: Type) (P: A -> Prop) (x y: A) (Hx: P x) (Hy: P y),
x = y -> existT _ x Hx = existT _ y Hy.
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.
Lemma exist_ext' : forall A F (x y:@sig A F),
proj1_sig x = proj1_sig y -> x = y.