Top source

Module mathcomp.classical.internal_Eqdep_dec


Attributes deprecated(since="mathcomp-analysis 1.10.0",
  note="This file is for internal purpose only and should not \
  be imported nor used. It may be removed in the future.").

Import EqNotations.

Section Dependent_Equality.

Variables ( : Type) ( : U -> Type).

Inductive ( : U) ( : P p) : forall : U, P q -> Prop :=
  
eq_dep_intro
Source code
: eq_dep p x p x.

Lemma
eq_dep_sym
Source code
( : U) ( : P p) ( : P q) :
  eq_dep p x q y -> eq_dep q y p x.
Proof.
destruct 1; auto; apply eq_dep_intro. Qed.

Inductive ( : U) ( : P p) ( : U) ( : P q) : Prop :=
  
eq_dep1_intro
Source code
: forall : q = p, x = rew h in y -> eq_dep1 p x q y.

Lemma
eq_dep_dep1
Source code
( : U) ( : P p) ( : P q) :
  eq_dep p x q y -> eq_dep1 p x q y.
Proof.
revert p q x y; intros p; destruct 1.
apply eq_dep1_intro with (eq_refl p); simpl; trivial.
Qed.

End Dependent_Equality.

Section Equivalences.

Variable : Type.

Definition
Eq_rect_eq_on

sigR : forall {U V : Type} {A : set V}, {fun [set: U] >-> A} -> U -> A sigR is not universe polymorphic Arguments sigR {U V}%type_scope {A}%classical_set_scope f u / The reduction tactics unfold sigR when applied to 5 arguments sigR is transparent Expands to: Constant mathcomp.classical.functions.sigR Declared in library mathcomp.classical.functions, line 2010, characters 11-15


Source code
( : U) ( : U -> Type) ( : Q p) :=
  forall ( : p = p), x = eq_rect p Q x p h.
Definition
Eq_rect_eq

valR : forall {U V : Type} {A : set V}, (U -> A) -> U -> V valR is not universe polymorphic Arguments valR {U V}%type_scope {A}%classical_set_scope f%function_scope x valR is transparent Expands to: Constant mathcomp.classical.functions.valR Declared in library mathcomp.classical.functions, line 2014, characters 11-15


Source code
:= forall , Eq_rect_eq_on p Q x.

Definition
Eq_dep_eq_on

valR_fun : forall {U V : Type} {A : set V}, (U -> A) -> {fun [set: U] >-> A} valR_fun is not universe polymorphic Arguments valR_fun {U V}%type_scope {A}%classical_set_scope f%function_scope valR_fun is transparent Expands to: Constant mathcomp.classical.functions.valR_fun Declared in library mathcomp.classical.functions, line 2017, characters 11-19


Source code
( : U -> Type) ( : U) ( : P p) :=
  forall ( : P p), eq_dep _ _ p x p y -> x = y.
Definition
Eq_dep_eq

sigLR : forall {U V : Type} {A : set U} {B : set V}, {fun A >-> B} -> A -> B sigLR is not universe polymorphic Arguments sigLR {U V}%type_scope {A B}%classical_set_scope x u sigLR is transparent Expands to: Constant mathcomp.classical.functions.sigLR Declared in library mathcomp.classical.functions, line 2244, characters 11-16


Source code
:= forall , Eq_dep_eq_on P p x.

Definition
Streicher_K_on_

valLR : forall {U V : Type}, V -> forall {A : set U} {B : set V}, (A -> B) -> U -> V valLR is not universe polymorphic Arguments valLR {U V}%type_scope v {A B}%classical_set_scope _%function_scope _ valLR is transparent Expands to: Constant mathcomp.classical.functions.valLR Declared in library mathcomp.classical.functions, line 2249, characters 11-16


Source code
( : U) ( : x = x -> Prop) :=
  P (eq_refl x) -> forall : x = x, P p.
Definition
Streicher_K_

valLRfun : forall {U V : Type}, V -> forall {A : set U} {B : set V}, (A -> B) -> {fun A >-> B} valLRfun is not universe polymorphic Arguments valLRfun {U V}%type_scope v {A B}%classical_set_scope _%function_scope valLRfun is transparent Expands to: Constant mathcomp.classical.functions.valLRfun Declared in library mathcomp.classical.functions, line 2250, characters 11-19


Source code
:= forall , Streicher_K_on_ x P.

Lemma
eq_rect_eq_on__eq_dep1_eq_on
Source code
( : U) ( : U -> Type) ( : P p) :
  Eq_rect_eq_on p P y -> forall ( : P p), eq_dep1 _ _ p x p y -> x = y.
Proof.
intro ere; simple destruct 1; intro; rewrite <-ere; auto. Qed.

Lemma
eq_rect_eq__eq_dep1_eq
Source code
:
  Eq_rect_eq -> forall (:U->Type) (:U) ( :P p), eq_dep1 _ _ p x p y -> x = y.
Proof (fun
eq_rect_eq
Source code
=>
  @eq_rect_eq_on__eq_dep1_eq_on p P x (eq_rect_eq p P x) y).

Lemma
eq_rect_eq_on__eq_dep_eq_on
Source code
( : U) ( : U -> Type) ( : P p) :
  Eq_rect_eq_on p P x -> Eq_dep_eq_on P p x.
Proof.
intros eq_rect_eq; red; intros y H.
symmetry; apply (eq_rect_eq_on__eq_dep1_eq_on _ _ _ eq_rect_eq).
apply eq_dep_sym in H; apply eq_dep_dep1; trivial.
Qed.
Lemma
eq_rect_eq__eq_dep_eq
Source code
: Eq_rect_eq -> Eq_dep_eq.
Proof (fun
eq_rect_eq
Source code
=>
  @eq_rect_eq_on__eq_dep_eq_on p P x (eq_rect_eq p P x) y).

Lemma
Streicher_K_on__eq_rect_eq_on
Source code
( : U) ( : U -> Type) ( : P p) :
  Streicher_K_on_ p (fun => x = rew -> [P] h in x) -> Eq_rect_eq_on p P x.
Proof.
intro Streicher_K; red; intros; apply Streicher_K; reflexivity. Qed.
Lemma
Streicher_K__eq_rect_eq
Source code
: Streicher_K_ -> Eq_rect_eq.
Proof.
End Equivalences.

Set SsrOldRewriteGoalsOrder.
Set Implicit Arguments.

Section EqdepDec.

Variable : Type.

Let ( : A) ( : x = y) ( : x = y') : y = y' :=
  eq_ind _ (fun => a = y') eq2 _ eq1.

Remark
trans_sym_eq
Source code
( : A) ( : x = y) : comp u u = eq_refl y.
Proof.
now case u. Qed.

Variables ( : A) ( : forall : A, x = y \/ x <> y).

Let (:A) (:x = y) : x = y :=
  match eq_dec y with
  | or_introl eqxy => eqxy
  | or_intror neqxy => False_ind _ (neqxy u)
  end.

#[local] Lemma
nu_constant
Source code
( : A) ( : x = y) : nu u = nu v.
Proof.
now unfold nu; destruct (eq_dec y) as [Heq|Hneq]; [reflexivity|case Hneq].
Qed.

Let ( : A) ( : x = y) : x = y := comp (nu (eq_refl x)) v.

Remark
nu_left_inv_on
Source code
(:A) (:x = y) : nu_inv (nu u) = u.
Proof.
case u; unfold nu_inv; apply trans_sym_eq. Qed.

Theorem
eq_proofs_unicity_on
Source code
( : A) ( : x = y) : p1 = p2.
Proof.
elim (nu_left_inv_on p1).
elim (nu_left_inv_on p2).
elim nu_constant with y p1 p2.
reflexivity.
Qed.

Theorem
K_dec_on
Source code
( : x = x -> Prop) ( : P (eq_refl x)) ( : x = x) : P p.
Proof.
now elim eq_proofs_unicity_on with x (eq_refl x) p. Qed.

End EqdepDec.

Theorem ( : forall : A, x = y \/ x <> y) ( : A) :
  forall : x = x -> Prop, P (eq_refl x) -> forall : x = x, P p.
Proof.
exact (@K_dec_on A x (eq_dec x)). Qed.

Section Eq_dec.

Variables ( : Type) ( : forall : A, {x = y} + {x <> y}).

Theorem
K_dec_type
Source code
( : A) ( : x = x -> Prop) ( : P (eq_refl x)) ( : x = x) :
  P p.
Proof.
elim p using K_dec; [|now trivial].
now intros x0 y; case (eq_dec x0 y); [left|right].
Qed.

Theorem
eq_rect_eq_dec
Source code
: forall ( : A) ( : A -> Type) ( : Q p) ( : p = p),
  x = eq_rect p Q x p h.
Proof.

Unset Implicit Arguments.

Lemma
eq_sigT_eq_dep
Source code
( : Type) ( : U -> Type) ( : U) ( : P p) ( : P q) :
  existT P p x = existT P q y -> eq_dep _ _ p x q y.
Proof.
intros * H; dependent rewrite H; apply eq_dep_intro. Qed.

Section Corollaries.

Variable : Type.

Definition
Inj_dep_pair_on

pinv_ : forall {T U : Type}, (U -> T) -> set T -> (T -> U) -> U -> T pinv_ is not universe polymorphic Arguments pinv_ {T U}%type_scope dflt%function_scope A%classical_set_scope f%function_scope _ pinv_ is transparent Expands to: Constant mathcomp.classical.functions.pinv_ Declared in library mathcomp.classical.functions, line 2473, characters 11-16


Source code
( : U -> Type) ( : U) ( : P p) :=
  forall ( : P p), existT P p x = existT P p y -> x = y.
Definition
Inj_dep_pair

cst : forall {T T' : Type}, T' -> T -> T' cst is not universe polymorphic Arguments cst {T T'}%type_scope x _ / The reduction tactics unfold cst when applied to 4 arguments cst is transparent Expands to: Constant mathcomp.classical.functions.cst Declared in library mathcomp.classical.functions, line 2563, characters 11-14


Source code
:= forall , Inj_dep_pair_on P p x.

Lemma
eq_dep_eq_on__inj_pair2_on
Source code
( : U -> Type) ( : U) ( : P p) :
  Eq_dep_eq_on U P p x -> Inj_dep_pair_on P p x.
Proof.
intro ede; red; intros; apply ede; apply eq_sigT_eq_dep; assumption. Qed.
Lemma
eq_dep_eq__inj_pair2
Source code
: Eq_dep_eq U -> Inj_dep_pair.
Proof (fun
eq_dep_eq
Source code
=>
  @eq_dep_eq_on__inj_pair2_on P p x (eq_dep_eq P p x)).

End Corollaries.

Lemma
inj_pair2_eq_dec
Source code
:
  forall ( : A -> Type) ( : A) ( : P p), existT P p x = existT P p y -> x = y.
Proof.
  apply eq_dep_eq__inj_pair2.
  apply eq_rect_eq__eq_dep_eq.
  unfold Eq_rect_eq, Eq_rect_eq_on.
  intros; apply eq_rect_eq_dec.
Qed.

End Eq_dec.