feat(pointed): generalize the definition of ap1 so that we can use path induction to prove properties about it

This commit is contained in:
Floris van Doorn 2017-03-22 18:35:35 -04:00
parent 540d451e01
commit 8e2adaa5ba
3 changed files with 66 additions and 49 deletions

View file

@ -249,23 +249,24 @@ namespace susp
end end
definition loop_psusp_unit_natural (f : X →* Y) definition loop_psusp_unit_natural (f : X →* Y)
: loop_psusp_unit Y ∘* f ~* ap1 (psusp_functor f) ∘* loop_psusp_unit X := : loop_psusp_unit Y ∘* f ~* Ω→ (psusp_functor f) ∘* loop_psusp_unit X :=
begin begin
induction X with X x, induction Y with Y y, induction f with f pf, esimp at *, induction pf, induction X with X x, induction Y with Y y, induction f with f pf, esimp at *, induction pf,
fconstructor, fconstructor,
{ intro x', esimp [psusp_functor], symmetry, { intro x', symmetry,
exact exact
!idp_con !ap1_gen_idp_left
(!ap_con ⬝ (!ap_con ⬝
whisker_left _ !ap_inv) ⬝ whisker_left _ !ap_inv) ⬝
(!elim_merid ◾ (inverse2 !elim_merid)) }, (!elim_merid ◾ (inverse2 !elim_merid)) },
{ rewrite [▸*,idp_con (con.right_inv _)], { rewrite [▸*, idp_con (con.right_inv _)],
apply inv_con_eq_of_eq_con, apply inv_con_eq_of_eq_con,
refine _ ⬝ !con.assoc', refine _ ⬝ !con.assoc',
rewrite inverse2_right_inv, rewrite inverse2_right_inv,
refine _ ⬝ !con.assoc', refine _ ⬝ !con.assoc',
rewrite [ap_con_right_inv], rewrite [ap_con_right_inv],
xrewrite [idp_con_idp, -ap_compose (concat idp)] }, rewrite [ap1_gen_idp_left_con],
rewrite [-ap_compose (concat idp)] },
end end
definition loop_psusp_counit [constructor] (X : Type*) : psusp (Ω X) →* X := definition loop_psusp_counit [constructor] (X : Type*) : psusp (Ω X) →* X :=
@ -285,7 +286,7 @@ namespace susp
{ reflexivity }, { reflexivity },
{ esimp, apply eq_pathover, apply hdeg_square, { esimp, apply eq_pathover, apply hdeg_square,
xrewrite [ap_compose' f, ap_compose' (susp.elim (f x) (f x) (λ (a : f x = f x), a)),▸*], xrewrite [ap_compose' f, ap_compose' (susp.elim (f x) (f x) (λ (a : f x = f x), a)),▸*],
xrewrite [+elim_merid,▸*,idp_con] }}, xrewrite [+elim_merid, ap1_gen_idp_left] }},
{ reflexivity } { reflexivity }
end end
@ -294,13 +295,14 @@ namespace susp
begin begin
induction X with X x, fconstructor, induction X with X x, fconstructor,
{ intro p, esimp, { intro p, esimp,
refine !idp_con refine !ap1_gen_idp_left
(!ap_con ⬝ (!ap_con ⬝
whisker_left _ !ap_inv) ⬝ whisker_left _ !ap_inv) ⬝
(!elim_merid ◾ inverse2 !elim_merid) }, (!elim_merid ◾ inverse2 !elim_merid) },
{ rewrite [▸*,inverse2_right_inv (elim_merid id idp)], { rewrite [▸*,inverse2_right_inv (elim_merid id idp)],
refine !con.assoc ⬝ _, refine !con.assoc ⬝ _,
xrewrite [ap_con_right_inv (susp.elim x x (λa, a)) (merid idp),idp_con_idp,-ap_compose] } xrewrite [ap_con_right_inv (susp.elim x x (λa, a)) (merid idp),ap1_gen_idp_left_con,
-ap_compose] }
end end
definition loop_psusp_unit_counit (X : Type*) definition loop_psusp_unit_counit (X : Type*)

View file

@ -231,7 +231,6 @@ namespace pushout
-- revert c, apply @set_quotient.rec_prop, { intro z, apply is_trunc_pathover}, -- revert c, apply @set_quotient.rec_prop, { intro z, apply is_trunc_pathover},
-- intro l, -- intro l,
-- refine _ ⬝op ap decode_point !quotient.elim_type_eq_of_rel⁻¹, -- refine _ ⬝op ap decode_point !quotient.elim_type_eq_of_rel⁻¹,
-- -- REPORT THIS!!! esimp fails here, but works after this change
-- --esimp, -- --esimp,
-- change pathover (λ (a : pushout f g), trunc 0 (eq (pushout_of_sum x) a)) -- change pathover (λ (a : pushout f g), trunc 0 (eq (pushout_of_sum x) a))
-- (decode_point (class_of l)) -- (decode_point (class_of l))

View file

@ -8,7 +8,7 @@ The basic definitions are in init.pointed
-/ -/
import .nat.basic ..arity ..prop_trunc import .nat.basic ..arity ..prop_trunc
open is_trunc eq prod sigma nat equiv option is_equiv bool unit sigma.ops sum algebra open is_trunc eq prod sigma nat equiv option is_equiv bool unit sigma.ops sum algebra function
namespace pointed namespace pointed
variables {A B : Type} variables {A B : Type}
@ -191,20 +191,24 @@ namespace pointed
we generalize the definition of ap1 to arbitrary paths, so that we can prove properties about it we generalize the definition of ap1 to arbitrary paths, so that we can prove properties about it
using path induction (see for example ap1_gen_con and ap1_gen_con_natural) using path induction (see for example ap1_gen_con and ap1_gen_con_natural)
-/ -/
definition ap1_gen [reducible] [unfold 6 9 10] {A B : Type} (f : A → B) {a a' : A} (p : a = a') definition ap1_gen [reducible] [unfold 6 9 10] {A B : Type} (f : A → B) {a a' : A}
{b b' : B} (q : f a = b) (q' : f a' = b') : b = b' := {b b' : B} (q : f a = b) (q' : f a' = b') (p : a = a') : b = b' :=
q⁻¹ ⬝ ap f p ⬝ q' q⁻¹ ⬝ ap f p ⬝ q'
definition ap1_gen_idp [unfold 6] {A B : Type} (f : A → B) {a a' : A} (p : a = a') : definition ap1_gen_idp [unfold 6] {A B : Type} (f : A → B) {a : A} {b : B} (q : f a = b) :
ap1_gen f p idp idp = ap f p := ap1_gen f q q idp = idp :=
!con_idp ⬝ idp_con (ap f p) con.left_inv q
definition ap1_gen_idp_left [unfold 6] {A B : Type} (f : A → B) {a a' : A} (p : a = a') :
ap1_gen f idp idp p = ap f p :=
proof idp_con (ap f p) qed
definition ap1_gen_idp_left_con {A B : Type} (f : A → B) {a : A} (p : a = a) (q : ap f p = idp) :
ap1_gen_idp_left f p ⬝ q = proof ap (concat idp) q qed :=
proof idp_con_idp q qed
definition ap1 [constructor] (f : A →* B) : Ω A →* Ω B := definition ap1 [constructor] (f : A →* B) : Ω A →* Ω B :=
begin pmap.mk (λp, ap1_gen f (respect_pt f) (respect_pt f) p) (ap1_gen_idp f (respect_pt f))
fconstructor,
{ intro p, exact (respect_pt f)⁻¹ ⬝ ap f p ⬝ respect_pt f },
{ esimp, apply con.left_inv}
end
definition apn (n : ) (f : A →* B) : Ω[n] A →* Ω[n] B := definition apn (n : ) (f : A →* B) : Ω[n] A →* Ω[n] B :=
begin begin
@ -232,35 +236,35 @@ namespace pointed
definition apn_zero [unfold_full] (f : A →* B) : Ω→[0] f = f := idp definition apn_zero [unfold_full] (f : A →* B) : Ω→[0] f = f := idp
definition apn_succ [unfold_full] (n : ) (f : A →* B) : Ω→[n + 1] f = Ω→ (Ω→[n] f) := idp definition apn_succ [unfold_full] (n : ) (f : A →* B) : Ω→[n + 1] f = Ω→ (Ω→[n] f) := idp
definition ap1_gen_con {A B : Type} (f : A → B) {a₁ a₂ a₃ : A} (p₁ : a₁ = a₂) (p₂ : a₂ = a₃) definition ap1_gen_con {A B : Type} (f : A → B) {a₁ a₂ a₃ : A} {b₁ b₂ b₃ : B}
{b₁ b₂ b₃ : B} (q₁ : f a₁ = b₁) (q₂ : f a₂ = b₂) (q₃ : f a₃ = b₃) : (q₁ : f a₁ = b₁) (q₂ : f a₂ = b₂) (q₃ : f a₃ = b₃) (p₁ : a₁ = a₂) (p₂ : a₂ = a₃) :
ap1_gen f (p₁ ⬝ p₂) q₁ q₃ = ap1_gen f p₁ q₁ q₂ ⬝ ap1_gen f p₂ q₂ q₃ := ap1_gen f q₁ q₃ (p₁ ⬝ p₂) = ap1_gen f q₁ q₂ p₁ ⬝ ap1_gen f q₂ q₃ p₂ :=
begin induction p₂, induction q₃, induction q₂, reflexivity end begin induction p₂, induction q₃, induction q₂, reflexivity end
definition ap1_gen_inv {A B : Type} (f : A → B) {a₁ a₂ : A} (p₁ : a₁ = a₂) definition ap1_gen_inv {A B : Type} (f : A → B) {a₁ a₂ : A}
{b₁ b₂ : B} (q₁ : f a₁ = b₁) (q₂ : f a₂ = b₂) : {b₁ b₂ : B} (q₁ : f a₁ = b₁) (q₂ : f a₂ = b₂) (p₁ : a₁ = a₂) :
ap1_gen f p₁⁻¹ q₂ q₁ = (ap1_gen f p₁ q₁ q₂)⁻¹ := ap1_gen f q₂ q₁ p₁⁻¹ = (ap1_gen f q₁ q₂ p₁)⁻¹ :=
begin induction p₁, induction q₁, induction q₂, reflexivity end begin induction p₁, induction q₁, induction q₂, reflexivity end
definition ap1_con {A B : Type*} (f : A →* B) (p q : Ω A) : ap1 f (p ⬝ q) = ap1 f p ⬝ ap1 f q := definition ap1_con {A B : Type*} (f : A →* B) (p q : Ω A) : ap1 f (p ⬝ q) = ap1 f p ⬝ ap1 f q :=
ap1_gen_con f p q (respect_pt f) (respect_pt f) (respect_pt f) ap1_gen_con f (respect_pt f) (respect_pt f) (respect_pt f) p q
theorem ap1_inv (f : A →* B) (p : Ω A) : ap1 f p⁻¹ = (ap1 f p)⁻¹ := theorem ap1_inv (f : A →* B) (p : Ω A) : ap1 f p⁻¹ = (ap1 f p)⁻¹ :=
ap1_gen_inv f p (respect_pt f) (respect_pt f) ap1_gen_inv f (respect_pt f) (respect_pt f) p
-- the following two facts is used for the suspension axiom to define spectrum cohomology -- the following two facts are used for the suspension axiom to define spectrum cohomology
definition ap1_gen_con_natural {A B : Type} (f : A → B) {a₁ a₂ a₃ : A} {p₁ p₁' : a₁ = a₂} definition ap1_gen_con_natural {A B : Type} (f : A → B) {a₁ a₂ a₃ : A} {p₁ p₁' : a₁ = a₂}
{p₂ p₂' : a₂ = a₃} {p₂ p₂' : a₂ = a₃}
{b₁ b₂ b₃ : B} (q₁ : f a₁ = b₁) (q₂ : f a₂ = b₂) (q₃ : f a₃ = b₃) {b₁ b₂ b₃ : B} (q₁ : f a₁ = b₁) (q₂ : f a₂ = b₂) (q₃ : f a₃ = b₃)
(r₁ : p₁ = p₁') (r₂ : p₂ = p₂') : (r₁ : p₁ = p₁') (r₂ : p₂ = p₂') :
square (ap1_gen_con f p₁ p₂ q₁ q₂ q₃) square (ap1_gen_con f q₁ q₂ q₃ p₁ p₂)
(ap1_gen_con f p₁' p₂' q₁ q₂ q₃) (ap1_gen_con f q₁ q₂ q₃ p₁' p₂')
(ap (λp, ap1_gen f p q₁ q₃) (r₁ ◾ r₂)) (ap (ap1_gen f q₁ q₃) (r₁ ◾ r₂))
(ap (λp, ap1_gen f p q₁ q₂) r₁ ◾ ap (λp, ap1_gen f p q₂ q₃) r₂) := (ap (ap1_gen f q₁ q₂) r₁ ◾ ap (ap1_gen f q₂ q₃) r₂) :=
begin induction r₁, induction r₂, exact vrfl end begin induction r₁, induction r₂, exact vrfl end
definition ap1_gen_con_idp {A B : Type} (f : A → B) {a : A} {b : B} (q : f a = b) : definition ap1_gen_con_idp {A B : Type} (f : A → B) {a : A} {b : B} (q : f a = b) :
ap1_gen_con f idp idp q q q ⬝ con.left_inv q ◾ con.left_inv q = con.left_inv q := ap1_gen_con f q q q idp idp ⬝ con.left_inv q ◾ con.left_inv q = con.left_inv q :=
by induction q; reflexivity by induction q; reflexivity
definition apn_con (n : ) (f : A →* B) (p q : Ω[n+1] A) definition apn_con (n : ) (f : A →* B) (p q : Ω[n+1] A)
@ -431,19 +435,24 @@ namespace pointed
Pointed maps respecting pointed homotopies. Pointed maps respecting pointed homotopies.
In general we need function extensionality for pap, In general we need function extensionality for pap,
but for particular F we can do it without function extensionality. but for particular F we can do it without function extensionality.
This is preferred, because such pointed homotopies compute This might be preferred, because such pointed homotopies compute. On the other hand,
when using function extensionality, it's easier to prove that if p is reflexivity, then the
resulting pointed homotopy is reflexivity
-/ -/
definition pap (F : (A →* B) → (C →* D)) {f g : A →* B} (p : f ~* g) : F f ~* F g := definition pap (F : (A →* B) → (C →* D)) {f g : A →* B} (p : f ~* g) : F f ~* F g :=
phomotopy.mk (ap010 (λf, pmap.to_fun (F f)) (eq_of_phomotopy p)) phomotopy.mk (ap010 (λf, pmap.to_fun (F f)) (eq_of_phomotopy p))
begin cases eq_of_phomotopy p, apply idp_con end begin cases eq_of_phomotopy p, apply idp_con end
definition ap1_phomotopy {f g : A →* B} (p : f ~* g) definition ap1_phomotopy {f g : A →* B} (p : f ~* g) : Ω→ f ~* Ω→ g :=
: ap1 f ~* ap1 g := pap Ω→ p
--a proof not using function extensionality:
definition ap1_phomotopy_explicit {f g : A →* B} (p : f ~* g) : Ω→ f ~* Ω→ g :=
begin begin
induction p with p q, induction f with f pf, induction g with g pg, induction B with B b, induction p with p q, induction f with f pf, induction g with g pg, induction B with B b,
esimp at *, induction q, induction pg, esimp at *, induction q, induction pg,
fapply phomotopy.mk, fapply phomotopy.mk,
{ intro l, esimp, refine _ ⬝ !idp_con⁻¹ᵖ, refine !con.assoc ⬝ _, apply inv_con_eq_of_eq_con, { intro l, refine _ ⬝ !idp_con⁻¹ᵖ, refine !con.assoc ⬝ _, apply inv_con_eq_of_eq_con,
apply ap_con_eq_con_ap}, apply ap_con_eq_con_ap},
{ induction A with A a, unfold [ap_con_eq_con_ap], generalize p a, generalize g a, intro b q, { induction A with A a, unfold [ap_con_eq_con_ap], generalize p a, generalize g a, intro b q,
induction q, reflexivity} induction q, reflexivity}
@ -465,21 +474,28 @@ namespace pointed
{ reflexivity} { reflexivity}
end end
definition ap1_pinverse {A : Type*} : ap1 (@pinverse A) ~* @pinverse (Ω A) := definition ap1_pinverse [constructor] {A : Type*} : ap1 (@pinverse A) ~* @pinverse (Ω A) :=
begin begin
fapply phomotopy.mk, fapply phomotopy.mk,
{ intro p, refine !idp_con ⬝ _, exact !inv_eq_inv2⁻¹ }, { intro p, refine !idp_con ⬝ _, exact !inv_eq_inv2⁻¹ },
{ reflexivity} { reflexivity}
end end
definition ap1_pcompose (g : B →* C) (f : A →* B) : ap1 (g ∘* f) ~* ap1 g ∘* ap1 f := definition ap1_gen_compose {A B C : Type} (g : B → C) (f : A → B) {a₁ a₂ : A} {b₁ b₂ : B}
begin {c₁ c₂ : C} (q₁ : f a₁ = b₁) (q₂ : f a₂ = b₂) (r₁ : g b₁ = c₁) (r₂ : g b₂ = c₂) (p : a₁ = a₂) :
induction B, induction C, induction g with g pg, induction f with f pf, esimp at *, ap1_gen (g ∘ f) (ap g q₁ ⬝ r₁) (ap g q₂ ⬝ r₂) p = ap1_gen g r₁ r₂ (ap1_gen f q₁ q₂ p) :=
induction pg, induction pf, begin induction p, induction q₁, induction q₂, induction r₁, induction r₂, reflexivity end
fconstructor,
{ intro p, esimp, apply whisker_left, exact ap_compose g f p ⬝ ap (ap g) !idp_con⁻¹}, definition ap1_gen_compose_idp {A B C : Type} (g : B → C) (f : A → B) {a : A}
{ reflexivity} {b : B} {c : C} (q : f a = b) (r : g b = c) :
end ap1_gen_compose g f q q r r idp ⬝ (ap (ap1_gen g r r) (ap1_gen_idp f q) ⬝ ap1_gen_idp g r) =
ap1_gen_idp (g ∘ f) (ap g q ⬝ r) :=
begin induction q, induction r, reflexivity end
definition ap1_pcompose [constructor] {A B C : Type*} (g : B →* C) (f : A →* B) :
ap1 (g ∘* f) ~* ap1 g ∘* ap1 f :=
phomotopy.mk (ap1_gen_compose g f (respect_pt f) (respect_pt f) (respect_pt g) (respect_pt g))
(ap1_gen_compose_idp g f (respect_pt f) (respect_pt g))
definition ap1_pcompose_pinverse (f : A →* B) : ap1 f ∘* pinverse ~* pinverse ∘* ap1 f := definition ap1_pcompose_pinverse (f : A →* B) : ap1 f ∘* pinverse ~* pinverse ∘* ap1 f :=
begin begin
@ -490,8 +506,8 @@ namespace pointed
{ induction B with B b, induction f with f pf, esimp at *, induction pf, reflexivity}, { induction B with B b, induction f with f pf, esimp at *, induction pf, reflexivity},
end end
definition ap1_pconst (A B : Type*) : Ω→(pconst A B) ~* pconst (Ω A) (Ω B) := definition ap1_pconst [constructor] (A B : Type*) : Ω→(pconst A B) ~* pconst (Ω A) (Ω B) :=
phomotopy.mk (λp, idp_con _ ⬝ ap_constant p pt) rfl phomotopy.mk (λp, ap1_gen_idp_left (const A pt) p ⬝ ap_constant p pt) rfl
definition ptransport_change_eq [constructor] {A : Type} (B : A → Type*) {a a' : A} {p q : a = a'} definition ptransport_change_eq [constructor] {A : Type} (B : A → Type*) {a a' : A} {p q : a = a'}
(r : p = q) : ptransport B p ~* ptransport B q := (r : p = q) : ptransport B p ~* ptransport B q :=