52dd6cf90b
This commit adds truncated 2-quotients, groupoid quotients, Eilenberg MacLane spaces, chain complexes, the long exact sequence of homotopy groups, the Freudenthal Suspension Theorem, Whitehead's principle, and the computation of homotopy groups of almost all spheres which are known in HoTT.
382 lines
12 KiB
Text
382 lines
12 KiB
Text
/-
|
||
Copyright (c) 2015 Floris van Doorn. All rights reserved.
|
||
Released under Apache 2.0 license as described in the file LICENSE.
|
||
Authors: Floris van Doorn, Ulrik Buchholtz
|
||
|
||
Declaration of suspension
|
||
-/
|
||
|
||
import hit.pushout types.pointed cubical.square .connectedness
|
||
|
||
open pushout unit eq equiv
|
||
|
||
definition susp (A : Type) : Type := pushout (λ(a : A), star) (λ(a : A), star)
|
||
|
||
namespace susp
|
||
variable {A : Type}
|
||
|
||
definition north {A : Type} : susp A :=
|
||
inl star
|
||
|
||
definition south {A : Type} : susp A :=
|
||
inr star
|
||
|
||
definition merid (a : A) : @north A = @south A :=
|
||
glue a
|
||
|
||
protected definition rec {P : susp A → Type} (PN : P north) (PS : P south)
|
||
(Pm : Π(a : A), PN =[merid a] PS) (x : susp A) : P x :=
|
||
begin
|
||
induction x with u u,
|
||
{ cases u, exact PN},
|
||
{ cases u, exact PS},
|
||
{ apply Pm},
|
||
end
|
||
|
||
protected definition rec_on [reducible] {P : susp A → Type} (y : susp A)
|
||
(PN : P north) (PS : P south) (Pm : Π(a : A), PN =[merid a] PS) : P y :=
|
||
susp.rec PN PS Pm y
|
||
|
||
theorem rec_merid {P : susp A → Type} (PN : P north) (PS : P south)
|
||
(Pm : Π(a : A), PN =[merid a] PS) (a : A)
|
||
: apd (susp.rec PN PS Pm) (merid a) = Pm a :=
|
||
!rec_glue
|
||
|
||
protected definition elim {P : Type} (PN : P) (PS : P) (Pm : A → PN = PS)
|
||
(x : susp A) : P :=
|
||
susp.rec PN PS (λa, pathover_of_eq (Pm a)) x
|
||
|
||
protected definition elim_on [reducible] {P : Type} (x : susp A)
|
||
(PN : P) (PS : P) (Pm : A → PN = PS) : P :=
|
||
susp.elim PN PS Pm x
|
||
|
||
theorem elim_merid {P : Type} {PN PS : P} (Pm : A → PN = PS) (a : A)
|
||
: ap (susp.elim PN PS Pm) (merid a) = Pm a :=
|
||
begin
|
||
apply eq_of_fn_eq_fn_inv !(pathover_constant (merid a)),
|
||
rewrite [▸*,-apd_eq_pathover_of_eq_ap,↑susp.elim,rec_merid],
|
||
end
|
||
|
||
protected definition elim_type (PN : Type) (PS : Type) (Pm : A → PN ≃ PS)
|
||
(x : susp A) : Type :=
|
||
pushout.elim_type (λx, PN) (λx, PS) Pm x
|
||
|
||
protected definition elim_type_on [reducible] (x : susp A)
|
||
(PN : Type) (PS : Type) (Pm : A → PN ≃ PS) : Type :=
|
||
susp.elim_type PN PS Pm x
|
||
|
||
theorem elim_type_merid (PN : Type) (PS : Type) (Pm : A → PN ≃ PS)
|
||
(a : A) : transport (susp.elim_type PN PS Pm) (merid a) = Pm a :=
|
||
!elim_type_glue
|
||
|
||
theorem elim_type_merid_inv {A : Type} (PN : Type) (PS : Type) (Pm : A → PN ≃ PS)
|
||
(a : A) : transport (susp.elim_type PN PS Pm) (merid a)⁻¹ = to_inv (Pm a) :=
|
||
!elim_type_glue_inv
|
||
|
||
protected definition merid_square {a a' : A} (p : a = a')
|
||
: square (merid a) (merid a') idp idp :=
|
||
by cases p; apply vrefl
|
||
|
||
end susp
|
||
|
||
attribute susp.north susp.south [constructor]
|
||
attribute susp.rec susp.elim [unfold 6] [recursor 6]
|
||
attribute susp.elim_type [unfold 5]
|
||
attribute susp.rec_on susp.elim_on [unfold 3]
|
||
attribute susp.elim_type_on [unfold 2]
|
||
|
||
namespace susp
|
||
|
||
open is_trunc is_conn trunc
|
||
|
||
-- Theorem 8.2.1
|
||
definition is_conn_susp [instance] (n : trunc_index) (A : Type)
|
||
[H : is_conn n A] : is_conn (n .+1) (susp A) :=
|
||
is_contr.mk (tr north)
|
||
begin
|
||
apply trunc.rec,
|
||
fapply susp.rec,
|
||
{ reflexivity },
|
||
{ exact (trunc.rec (λa, ap tr (merid a)) (center (trunc n A))) },
|
||
{ intro a,
|
||
generalize (center (trunc n A)),
|
||
apply trunc.rec,
|
||
intro a',
|
||
apply pathover_of_tr_eq,
|
||
rewrite [transport_eq_Fr,idp_con],
|
||
revert H, induction n with [n, IH],
|
||
{ intro H, apply is_prop.elim },
|
||
{ intros H,
|
||
change ap (@tr n .+2 (susp A)) (merid a) = ap tr (merid a'),
|
||
generalize a',
|
||
apply is_conn_fun.elim n
|
||
(is_conn_fun_from_unit n A a)
|
||
(λx : A, trunctype.mk' n (ap (@tr n .+2 (susp A)) (merid a) = ap tr (merid x))),
|
||
intros,
|
||
change ap (@tr n .+2 (susp A)) (merid a) = ap tr (merid a),
|
||
reflexivity
|
||
}
|
||
}
|
||
end
|
||
|
||
end susp
|
||
|
||
/- Flattening lemma -/
|
||
namespace susp
|
||
|
||
open prod prod.ops
|
||
section
|
||
universe variable u
|
||
parameters (A : Type) (PN PS : Type.{u}) (Pm : A → PN ≃ PS)
|
||
include Pm
|
||
|
||
local abbreviation P [unfold 5] := susp.elim_type PN PS Pm
|
||
|
||
local abbreviation F : A × PN → PN := λz, z.2
|
||
|
||
local abbreviation G : A × PN → PS := λz, Pm z.1 z.2
|
||
|
||
protected definition flattening : sigma P ≃ pushout F G :=
|
||
begin
|
||
apply equiv.trans !pushout.flattening,
|
||
fapply pushout.equiv,
|
||
{ exact sigma.equiv_prod A PN },
|
||
{ apply sigma.sigma_unit_left },
|
||
{ apply sigma.sigma_unit_left },
|
||
{ reflexivity },
|
||
{ reflexivity }
|
||
end
|
||
end
|
||
|
||
end susp
|
||
|
||
/- Functoriality and equivalence -/
|
||
namespace susp
|
||
variables {A B : Type} (f : A → B)
|
||
include f
|
||
|
||
protected definition functor : susp A → susp B :=
|
||
begin
|
||
intro x, induction x with a,
|
||
{ exact north },
|
||
{ exact south },
|
||
{ exact merid (f a) }
|
||
end
|
||
|
||
variable [Hf : is_equiv f]
|
||
include Hf
|
||
|
||
open is_equiv
|
||
protected definition is_equiv_functor [instance] : is_equiv (susp.functor f) :=
|
||
adjointify (susp.functor f) (susp.functor f⁻¹)
|
||
abstract begin
|
||
intro sb, induction sb with b, do 2 reflexivity,
|
||
apply eq_pathover,
|
||
rewrite [ap_id,ap_compose' (susp.functor f) (susp.functor f⁻¹)],
|
||
krewrite [susp.elim_merid,susp.elim_merid], apply transpose,
|
||
apply susp.merid_square (right_inv f b)
|
||
end end
|
||
abstract begin
|
||
intro sa, induction sa with a, do 2 reflexivity,
|
||
apply eq_pathover,
|
||
rewrite [ap_id,ap_compose' (susp.functor f⁻¹) (susp.functor f)],
|
||
krewrite [susp.elim_merid,susp.elim_merid], apply transpose,
|
||
apply susp.merid_square (left_inv f a)
|
||
end end
|
||
|
||
|
||
end susp
|
||
|
||
namespace susp
|
||
variables {A B : Type} (f : A ≃ B)
|
||
|
||
protected definition equiv : susp A ≃ susp B :=
|
||
equiv.mk (susp.functor f) _
|
||
end susp
|
||
|
||
namespace susp
|
||
open pointed
|
||
definition pointed_susp [instance] [constructor] (X : Type)
|
||
: pointed (susp X) :=
|
||
pointed.mk north
|
||
end susp
|
||
|
||
open susp
|
||
definition psusp [constructor] (X : Type) : Type* :=
|
||
pointed.mk' (susp X)
|
||
|
||
namespace susp
|
||
open pointed
|
||
variables {X Y Z : Type*}
|
||
|
||
definition psusp_functor (f : X →* Y) : psusp X →* psusp Y :=
|
||
begin
|
||
fconstructor,
|
||
{ exact susp.functor f },
|
||
{ reflexivity }
|
||
end
|
||
|
||
definition is_equiv_psusp_functor (f : X →* Y) [Hf : is_equiv f]
|
||
: is_equiv (psusp_functor f) :=
|
||
susp.is_equiv_functor f
|
||
|
||
definition psusp_equiv (f : X ≃* Y) : psusp X ≃* psusp Y :=
|
||
pequiv_of_equiv (susp.equiv f) idp
|
||
|
||
definition psusp_functor_compose (g : Y →* Z) (f : X →* Y)
|
||
: psusp_functor (g ∘* f) ~* psusp_functor g ∘* psusp_functor f :=
|
||
begin
|
||
fconstructor,
|
||
{ intro a, induction a,
|
||
{ reflexivity },
|
||
{ reflexivity },
|
||
{ apply eq_pathover, apply hdeg_square,
|
||
rewrite [▸*,ap_compose' _ (psusp_functor f),↑psusp_functor],
|
||
krewrite +susp.elim_merid } },
|
||
{ reflexivity }
|
||
end
|
||
|
||
-- adjunction from Coq-HoTT
|
||
|
||
definition loop_susp_unit [constructor] (X : Type*) : X →* Ω(psusp X) :=
|
||
begin
|
||
fconstructor,
|
||
{ intro x, exact merid x ⬝ (merid pt)⁻¹},
|
||
{ apply con.right_inv},
|
||
end
|
||
|
||
definition loop_susp_unit_natural (f : X →* Y)
|
||
: loop_susp_unit Y ∘* f ~* ap1 (psusp_functor f) ∘* loop_susp_unit X :=
|
||
begin
|
||
induction X with X x, induction Y with Y y, induction f with f pf, esimp at *, induction pf,
|
||
fconstructor,
|
||
{ intro x', esimp [psusp_functor], symmetry,
|
||
exact
|
||
!idp_con ⬝
|
||
(!ap_con ⬝
|
||
whisker_left _ !ap_inv) ⬝
|
||
(!elim_merid ◾ (inverse2 !elim_merid))
|
||
},
|
||
{ rewrite [▸*,idp_con (con.right_inv _)],
|
||
apply inv_con_eq_of_eq_con,
|
||
refine _ ⬝ !con.assoc',
|
||
rewrite inverse2_right_inv,
|
||
refine _ ⬝ !con.assoc',
|
||
rewrite [ap_con_right_inv],
|
||
unfold psusp_functor,
|
||
xrewrite [idp_con_idp, -ap_compose (concat idp)]},
|
||
end
|
||
|
||
definition loop_susp_counit [constructor] (X : Type*) : psusp (Ω X) →* X :=
|
||
begin
|
||
fconstructor,
|
||
{ intro x, induction x, exact pt, exact pt, exact a},
|
||
{ reflexivity},
|
||
end
|
||
|
||
definition loop_susp_counit_natural (f : X →* Y)
|
||
: f ∘* loop_susp_counit X ~* loop_susp_counit Y ∘* (psusp_functor (ap1 f)) :=
|
||
begin
|
||
induction X with X x, induction Y with Y y, induction f with f pf, esimp at *, induction pf,
|
||
fconstructor,
|
||
{ intro x', induction x' with p,
|
||
{ reflexivity},
|
||
{ reflexivity},
|
||
{ 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 [+elim_merid,▸*,idp_con]}},
|
||
{ reflexivity}
|
||
end
|
||
|
||
definition loop_susp_counit_unit (X : Type*)
|
||
: ap1 (loop_susp_counit X) ∘* loop_susp_unit (Ω X) ~* pid (Ω X) :=
|
||
begin
|
||
induction X with X x, fconstructor,
|
||
{ intro p, esimp,
|
||
refine !idp_con ⬝
|
||
(!ap_con ⬝
|
||
whisker_left _ !ap_inv) ⬝
|
||
(!elim_merid ◾ inverse2 !elim_merid)},
|
||
{ rewrite [▸*,inverse2_right_inv (elim_merid id idp)],
|
||
refine !con.assoc ⬝ _,
|
||
xrewrite [ap_con_right_inv (susp.elim x x (λa, a)) (merid idp),idp_con_idp,-ap_compose]}
|
||
end
|
||
|
||
definition loop_susp_unit_counit (X : Type*)
|
||
: loop_susp_counit (psusp X) ∘* psusp_functor (loop_susp_unit X) ~* pid (psusp X) :=
|
||
begin
|
||
induction X with X x, fconstructor,
|
||
{ intro x', induction x',
|
||
{ reflexivity},
|
||
{ exact merid pt},
|
||
{ apply eq_pathover,
|
||
xrewrite [▸*, ap_id, ap_compose' (susp.elim north north (λa, a)), +elim_merid,▸*],
|
||
apply square_of_eq, exact !idp_con ⬝ !inv_con_cancel_right⁻¹}},
|
||
{ reflexivity}
|
||
end
|
||
|
||
definition susp_adjoint_loop (X Y : Type*) : pointed.mk' (susp X) →* Y ≃ X →* Ω Y :=
|
||
begin
|
||
fapply equiv.MK,
|
||
{ intro f, exact ap1 f ∘* loop_susp_unit X},
|
||
{ intro g, exact loop_susp_counit Y ∘* psusp_functor g},
|
||
{ intro g, apply eq_of_phomotopy, esimp,
|
||
refine !pwhisker_right !ap1_compose ⬝* _,
|
||
refine !passoc ⬝* _,
|
||
refine !pwhisker_left !loop_susp_unit_natural⁻¹* ⬝* _,
|
||
refine !passoc⁻¹* ⬝* _,
|
||
refine !pwhisker_right !loop_susp_counit_unit ⬝* _,
|
||
apply pid_comp},
|
||
{ intro f, apply eq_of_phomotopy, esimp,
|
||
refine !pwhisker_left !psusp_functor_compose ⬝* _,
|
||
refine !passoc⁻¹* ⬝* _,
|
||
refine !pwhisker_right !loop_susp_counit_natural⁻¹* ⬝* _,
|
||
refine !passoc ⬝* _,
|
||
refine !pwhisker_left !loop_susp_unit_counit ⬝* _,
|
||
apply comp_pid},
|
||
end
|
||
|
||
definition susp_adjoint_loop_nat_right (f : psusp X →* Y) (g : Y →* Z)
|
||
: susp_adjoint_loop X Z (g ∘* f) ~* ap1 g ∘* susp_adjoint_loop X Y f :=
|
||
begin
|
||
esimp [susp_adjoint_loop],
|
||
refine _ ⬝* !passoc,
|
||
apply pwhisker_right,
|
||
apply ap1_compose
|
||
end
|
||
|
||
definition susp_adjoint_loop_nat_left (f : Y →* Ω Z) (g : X →* Y)
|
||
: (susp_adjoint_loop X Z)⁻¹ᵉ (f ∘* g) ~* (susp_adjoint_loop Y Z)⁻¹ᵉ f ∘* psusp_functor g :=
|
||
begin
|
||
esimp [susp_adjoint_loop],
|
||
refine _ ⬝* !passoc⁻¹*,
|
||
apply pwhisker_left,
|
||
apply psusp_functor_compose
|
||
end
|
||
|
||
definition iterate_susp (n : ℕ) (A : Type) : Type := iterate susp n A
|
||
definition iterate_psusp (n : ℕ) (A : Type*) : Type* := iterate (λX, psusp X) n A
|
||
|
||
open is_conn trunc_index nat
|
||
definition iterate_susp_succ (n : ℕ) (A : Type) :
|
||
iterate_susp (succ n) A = susp (iterate_susp n A) :=
|
||
idp
|
||
|
||
definition is_conn_iterate_susp [instance] (n : ℕ₋₂) (m : ℕ) (A : Type)
|
||
[H : is_conn n A] : is_conn (n + m) (iterate_susp m A) :=
|
||
begin induction m with m IH, exact H, exact @is_conn_susp _ _ IH end
|
||
|
||
definition is_conn_iterate_psusp [instance] (n : ℕ₋₂) (m : ℕ) (A : Type*)
|
||
[H : is_conn n A] : is_conn (n + m) (iterate_psusp m A) :=
|
||
begin induction m with m IH, exact H, exact @is_conn_susp _ _ IH end
|
||
|
||
-- Separate cases for n = 0, which comes up often
|
||
definition is_conn_iterate_susp_zero [instance] (m : ℕ) (A : Type)
|
||
[H : is_conn 0 A] : is_conn m (iterate_susp m A) :=
|
||
begin induction m with m IH, exact H, exact @is_conn_susp _ _ IH end
|
||
|
||
definition is_conn_iterate_psusp_zero [instance] (m : ℕ) (A : Type*)
|
||
[H : is_conn 0 A] : is_conn m (iterate_psusp m A) :=
|
||
begin induction m with m IH, exact H, exact @is_conn_susp _ _ IH end
|
||
|
||
end susp
|