Bonak.νSet.SigT
Set Primitive Projections.
Set Printing Projections.
Record sigT {A: Type} (P: A → Type): Type :=
existT { projT1: A; projT2: P projT1 }.
Arguments sigT {A} P.
Arguments projT1 {A P} _.
Arguments projT2 {A P} _.
Arguments existT {A} P _ _.
Set Warnings "-notation-overridden".
Notation "{ x &T P }" := (sigT (fun x ⇒ P%type))
(x at level 99, format "{ '[ ' x &T '/' P ']' }"): type_scope.
Notation "{ x : A &T P }" := (sigT (A := A) (fun x ⇒ P%type))
(x at level 99, format "{ '[ ' '[' x : A ']' &T '/' P ']' }"): type_scope.
Notation "( x 'as' z 'in' T ; y 'in' P )" := (existT (fun z: T ⇒ P%type) x y)
(at level 0, only parsing).
Notation "( x ; y )" := (existT _ x y)
(at level 0, format "'[' ( x ; '/ ' y ) ']'").
Notation "x .1" := (projT1 x) (at level 1, left associativity, format "x .1").
Notation "x .2" := (projT2 x) (at level 1, left associativity, format "x .2").
Import Logic.EqNotations.
Definition eq_existT_uncurried {A: Type} {P: A → Type} {u1 v1: A}
{u2: P u1} {v2: P v1} (pq: { p: u1 = v1 &T rew p in u2 = v2 }):
(u1; u2) = (v1; v2).
Proof.
now destruct pq as [p q], q, p.
Defined.
Definition eq_sigT_uncurried {A: Type} {P: A → Type} (u v: { a: A &T P a })
(pq: { p: u.1 = v.1 &T rew p in u.2 = v.2 }): u = v.
Proof.
destruct u, v; now apply eq_existT_uncurried.
Defined.
Lemma eq_existT_curried {A: Type} {P: A → Type} {u1 v1: A} {u2: P u1}
{v2: P v1} (p: u1 = v1) (q: rew p in u2 = v2): (u1; u2) = (v1; v2).
Proof.
apply eq_sigT_uncurried; now ∃ p.
Defined.
Definition projT1_eq {A} {P: A → Type} {u v: { a: A &T P a }} (p: u = v):
u.1 = v.1 := f_equal (fun x ⇒ x.1) p.
Definition projT2_eq {A} {P: A → Type} {u v: { a: A &T P a }} (p: u = v):
rew projT1_eq p in u.2 = v.2 := rew dependent p in eq_refl.
Notation "(= u ; v )" := (eq_existT_curried u v)
(at level 0, format "(= u ; '/ ' v )").
Lemma eq_existT_curried_dep {A x} {P: A → Type} {Q: {a &T P a} → Type}
{y} {H: x = y}
{u: P x} {v: Q (x; u)}
{u': P y} {v': Q (y; u')}
{Hu: rew H in u = u'} {Hv: rew (=H; Hu) in v = v'}:
rew [fun x ⇒ {a: P x &T Q (x; a)}] H in (u; v) = (u'; v').
Proof.
now destruct Hu, Hv, H.
Qed.
Set Printing Projections.
Record sigT {A: Type} (P: A → Type): Type :=
existT { projT1: A; projT2: P projT1 }.
Arguments sigT {A} P.
Arguments projT1 {A P} _.
Arguments projT2 {A P} _.
Arguments existT {A} P _ _.
Set Warnings "-notation-overridden".
Notation "{ x &T P }" := (sigT (fun x ⇒ P%type))
(x at level 99, format "{ '[ ' x &T '/' P ']' }"): type_scope.
Notation "{ x : A &T P }" := (sigT (A := A) (fun x ⇒ P%type))
(x at level 99, format "{ '[ ' '[' x : A ']' &T '/' P ']' }"): type_scope.
Notation "( x 'as' z 'in' T ; y 'in' P )" := (existT (fun z: T ⇒ P%type) x y)
(at level 0, only parsing).
Notation "( x ; y )" := (existT _ x y)
(at level 0, format "'[' ( x ; '/ ' y ) ']'").
Notation "x .1" := (projT1 x) (at level 1, left associativity, format "x .1").
Notation "x .2" := (projT2 x) (at level 1, left associativity, format "x .2").
Import Logic.EqNotations.
Definition eq_existT_uncurried {A: Type} {P: A → Type} {u1 v1: A}
{u2: P u1} {v2: P v1} (pq: { p: u1 = v1 &T rew p in u2 = v2 }):
(u1; u2) = (v1; v2).
Proof.
now destruct pq as [p q], q, p.
Defined.
Definition eq_sigT_uncurried {A: Type} {P: A → Type} (u v: { a: A &T P a })
(pq: { p: u.1 = v.1 &T rew p in u.2 = v.2 }): u = v.
Proof.
destruct u, v; now apply eq_existT_uncurried.
Defined.
Lemma eq_existT_curried {A: Type} {P: A → Type} {u1 v1: A} {u2: P u1}
{v2: P v1} (p: u1 = v1) (q: rew p in u2 = v2): (u1; u2) = (v1; v2).
Proof.
apply eq_sigT_uncurried; now ∃ p.
Defined.
Definition projT1_eq {A} {P: A → Type} {u v: { a: A &T P a }} (p: u = v):
u.1 = v.1 := f_equal (fun x ⇒ x.1) p.
Definition projT2_eq {A} {P: A → Type} {u v: { a: A &T P a }} (p: u = v):
rew projT1_eq p in u.2 = v.2 := rew dependent p in eq_refl.
Notation "(= u ; v )" := (eq_existT_curried u v)
(at level 0, format "(= u ; '/ ' v )").
Lemma eq_existT_curried_dep {A x} {P: A → Type} {Q: {a &T P a} → Type}
{y} {H: x = y}
{u: P x} {v: Q (x; u)}
{u': P y} {v': Q (y; u')}
{Hu: rew H in u = u'} {Hv: rew (=H; Hu) in v = v'}:
rew [fun x ⇒ {a: P x &T Q (x; a)}] H in (u; v) = (u'; v').
Proof.
now destruct Hu, Hv, H.
Qed.