2015-11-16 20:30:28 +00:00
|
|
|
|
/-
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
homotopy groups of a pointed space
|
|
|
|
|
-/
|
|
|
|
|
|
2016-09-22 20:00:14 +00:00
|
|
|
|
import .trunc_group types.trunc .group_theory types.nat.hott
|
2015-11-16 20:30:28 +00:00
|
|
|
|
|
2016-09-22 20:00:14 +00:00
|
|
|
|
open nat eq pointed trunc is_trunc algebra group function equiv unit is_equiv nat
|
2015-11-16 20:30:28 +00:00
|
|
|
|
|
2016-04-22 19:12:25 +00:00
|
|
|
|
-- TODO: consistently make n an argument before A
|
2016-12-26 21:07:57 +00:00
|
|
|
|
-- TODO: rename cghomotopy_group to aghomotopy_group
|
|
|
|
|
-- TODO: rename homotopy_group_functor_compose to homotopy_group_functor_pcompose
|
2015-11-16 20:30:28 +00:00
|
|
|
|
namespace eq
|
|
|
|
|
|
2017-02-03 02:38:48 +00:00
|
|
|
|
definition inf_pgroup_loop [constructor] [instance] (A : Type*) : inf_pgroup (Ω A) :=
|
|
|
|
|
inf_pgroup.mk concat con.assoc inverse idp_con con_idp con.left_inv
|
|
|
|
|
|
|
|
|
|
definition inf_group_loop [constructor] (A : Type*) : inf_group (Ω A) := _
|
|
|
|
|
|
|
|
|
|
definition ab_inf_group_loop [constructor] [instance] (A : Type*) : ab_inf_group (Ω (Ω A)) :=
|
|
|
|
|
⦃ab_inf_group, inf_group_loop _, mul_comm := eckmann_hilton⦄
|
|
|
|
|
|
2017-06-02 16:13:20 +00:00
|
|
|
|
definition inf_group_loopn (n : ℕ) (A : Type*) [H : is_succ n] : inf_group (Ω[n] A) :=
|
|
|
|
|
by induction H; exact _
|
|
|
|
|
|
|
|
|
|
definition ab_inf_group_loopn (n : ℕ) (A : Type*) [H : is_at_least_two n] : ab_inf_group (Ω[n] A) :=
|
|
|
|
|
by induction H; exact _
|
|
|
|
|
|
2017-02-03 02:38:48 +00:00
|
|
|
|
definition gloop [constructor] (A : Type*) : InfGroup :=
|
|
|
|
|
InfGroup.mk (Ω A) (inf_group_loop A)
|
|
|
|
|
|
2016-09-22 19:42:46 +00:00
|
|
|
|
definition homotopy_group [reducible] [constructor] (n : ℕ) (A : Type*) : Set* :=
|
2016-02-16 01:59:38 +00:00
|
|
|
|
ptrunc 0 (Ω[n] A)
|
|
|
|
|
|
2016-09-22 19:42:46 +00:00
|
|
|
|
notation `π[`:95 n:0 `]`:0 := homotopy_group n
|
2015-11-16 20:30:28 +00:00
|
|
|
|
|
2017-06-15 00:03:35 +00:00
|
|
|
|
section
|
|
|
|
|
local attribute inf_group_loopn [instance]
|
|
|
|
|
definition group_homotopy_group [instance] [constructor] [reducible] (n : ℕ) [is_succ n] (A : Type*)
|
|
|
|
|
: group (π[n] A) :=
|
|
|
|
|
trunc_group (Ω[n] A)
|
|
|
|
|
end
|
2015-11-16 20:30:28 +00:00
|
|
|
|
|
2016-04-22 19:12:25 +00:00
|
|
|
|
definition group_homotopy_group2 [instance] (k : ℕ) (A : Type*) :
|
2016-09-22 19:42:46 +00:00
|
|
|
|
group (carrier (ptrunctype.to_pType (π[k + 1] A))) :=
|
2017-06-15 00:03:35 +00:00
|
|
|
|
group_homotopy_group (k+1) A
|
2016-04-22 19:12:25 +00:00
|
|
|
|
|
2017-06-15 00:03:35 +00:00
|
|
|
|
section
|
|
|
|
|
local attribute ab_inf_group_loopn [instance]
|
|
|
|
|
definition ab_group_homotopy_group [constructor] [reducible] (n : ℕ) [is_at_least_two n] (A : Type*)
|
|
|
|
|
: ab_group (π[n] A) :=
|
|
|
|
|
trunc_ab_group (Ω[n] A)
|
|
|
|
|
end
|
2015-11-16 20:30:28 +00:00
|
|
|
|
|
2016-11-24 05:13:05 +00:00
|
|
|
|
local attribute ab_group_homotopy_group [instance]
|
2015-11-16 20:30:28 +00:00
|
|
|
|
|
2017-06-15 00:03:35 +00:00
|
|
|
|
definition ghomotopy_group [constructor] (n : ℕ) [is_succ n] (A : Type*) : Group :=
|
|
|
|
|
Group.mk (π[n] A) _
|
2015-11-16 20:30:28 +00:00
|
|
|
|
|
2017-06-15 00:03:35 +00:00
|
|
|
|
definition cghomotopy_group [constructor] (n : ℕ) [is_at_least_two n] (A : Type*) : AbGroup :=
|
|
|
|
|
AbGroup.mk (π[n] A) _
|
2015-11-16 20:30:28 +00:00
|
|
|
|
|
2016-09-20 02:13:16 +00:00
|
|
|
|
definition fundamental_group [constructor] (A : Type*) : Group :=
|
2016-09-22 20:00:14 +00:00
|
|
|
|
ghomotopy_group 1 A
|
2015-11-16 20:30:28 +00:00
|
|
|
|
|
2016-09-22 20:00:14 +00:00
|
|
|
|
notation `πg[`:95 n:0 `]`:0 := ghomotopy_group n
|
|
|
|
|
notation `πag[`:95 n:0 `]`:0 := cghomotopy_group n
|
2015-11-16 20:30:28 +00:00
|
|
|
|
|
2016-04-22 19:12:25 +00:00
|
|
|
|
notation `π₁` := fundamental_group -- should this be notation for the group or pointed type?
|
2016-04-11 17:11:59 +00:00
|
|
|
|
|
|
|
|
|
definition tr_mul_tr {n : ℕ} {A : Type*} (p q : Ω[n + 1] A) :
|
|
|
|
|
tr p *[πg[n+1] A] tr q = tr (p ⬝ q) :=
|
|
|
|
|
by reflexivity
|
|
|
|
|
|
|
|
|
|
definition tr_mul_tr' {n : ℕ} {A : Type*} (p q : Ω[succ n] A)
|
|
|
|
|
: tr p *[π[succ n] A] tr q = tr (p ⬝ q) :=
|
|
|
|
|
idp
|
2015-11-16 20:30:28 +00:00
|
|
|
|
|
2016-09-22 19:42:46 +00:00
|
|
|
|
definition homotopy_group_pequiv [constructor] (n : ℕ) {A B : Type*} (H : A ≃* B)
|
|
|
|
|
: π[n] A ≃* π[n] B :=
|
2016-03-08 05:16:45 +00:00
|
|
|
|
ptrunc_pequiv_ptrunc 0 (loopn_pequiv_loopn n H)
|
2016-03-01 04:37:03 +00:00
|
|
|
|
|
2016-09-22 19:42:46 +00:00
|
|
|
|
definition homotopy_group_pequiv_loop_ptrunc [constructor] (k : ℕ) (A : Type*) :
|
|
|
|
|
π[k] A ≃* Ω[k] (ptrunc k A) :=
|
2016-03-02 21:23:24 +00:00
|
|
|
|
begin
|
2016-09-22 19:42:46 +00:00
|
|
|
|
refine !loopn_ptrunc_pequiv⁻¹ᵉ* ⬝e* _,
|
2016-03-06 00:35:12 +00:00
|
|
|
|
exact loopn_pequiv_loopn k (pequiv_of_eq begin rewrite [trunc_index.zero_add] end)
|
2016-03-02 21:23:24 +00:00
|
|
|
|
end
|
|
|
|
|
|
2016-06-23 22:38:35 +00:00
|
|
|
|
open trunc_index
|
2016-09-22 19:42:46 +00:00
|
|
|
|
definition homotopy_group_ptrunc_of_le [constructor] {k n : ℕ} (H : k ≤ n) (A : Type*) :
|
|
|
|
|
π[k] (ptrunc n A) ≃* π[k] A :=
|
2016-04-22 19:12:25 +00:00
|
|
|
|
calc
|
2016-09-22 19:42:46 +00:00
|
|
|
|
π[k] (ptrunc n A) ≃* Ω[k] (ptrunc k (ptrunc n A))
|
|
|
|
|
: homotopy_group_pequiv_loop_ptrunc k (ptrunc n A)
|
2016-04-22 19:12:25 +00:00
|
|
|
|
... ≃* Ω[k] (ptrunc k A)
|
2016-06-23 22:38:35 +00:00
|
|
|
|
: loopn_pequiv_loopn k (ptrunc_ptrunc_pequiv_left A (of_nat_le_of_nat H))
|
2016-09-22 19:42:46 +00:00
|
|
|
|
... ≃* π[k] A : (homotopy_group_pequiv_loop_ptrunc k A)⁻¹ᵉ*
|
2016-04-22 19:12:25 +00:00
|
|
|
|
|
2016-09-22 19:42:46 +00:00
|
|
|
|
definition homotopy_group_ptrunc [constructor] (k : ℕ) (A : Type*) :
|
|
|
|
|
π[k] (ptrunc k A) ≃* π[k] A :=
|
|
|
|
|
homotopy_group_ptrunc_of_le (le.refl k) A
|
2016-06-23 22:38:35 +00:00
|
|
|
|
|
2016-04-20 15:51:56 +00:00
|
|
|
|
theorem trivial_homotopy_of_is_set (A : Type*) [H : is_set A] (n : ℕ) : πg[n+1] A ≃g G0 :=
|
2015-11-18 23:08:38 +00:00
|
|
|
|
begin
|
|
|
|
|
apply trivial_group_of_is_contr,
|
|
|
|
|
apply is_trunc_trunc_of_is_trunc,
|
|
|
|
|
apply is_contr_loop_of_is_trunc,
|
2016-02-15 20:18:07 +00:00
|
|
|
|
apply is_trunc_succ_succ_of_is_set
|
2015-11-18 23:08:38 +00:00
|
|
|
|
end
|
|
|
|
|
|
2016-09-22 19:42:46 +00:00
|
|
|
|
definition homotopy_group_succ_out (A : Type*) (n : ℕ) : π[n + 1] A = π₁ (Ω[n] A) := idp
|
2016-03-01 04:37:03 +00:00
|
|
|
|
|
2016-09-22 19:42:46 +00:00
|
|
|
|
definition homotopy_group_succ_in (A : Type*) (n : ℕ) : π[n + 1] A ≃* π[n] (Ω A) :=
|
|
|
|
|
ptrunc_pequiv_ptrunc 0 (loopn_succ_in A n)
|
2015-11-18 23:08:38 +00:00
|
|
|
|
|
2016-09-22 20:00:14 +00:00
|
|
|
|
definition ghomotopy_group_succ_out (A : Type*) (n : ℕ) : πg[n + 1] A = π₁ (Ω[n] A) := idp
|
2016-03-01 04:37:03 +00:00
|
|
|
|
|
2016-09-22 20:00:14 +00:00
|
|
|
|
definition homotopy_group_succ_in_con {A : Type*} {n : ℕ} (g h : πg[n + 2] A) :
|
2016-09-22 19:42:46 +00:00
|
|
|
|
homotopy_group_succ_in A (succ n) (g * h) =
|
|
|
|
|
homotopy_group_succ_in A (succ n) g * homotopy_group_succ_in A (succ n) h :=
|
2016-04-22 19:12:25 +00:00
|
|
|
|
begin
|
|
|
|
|
induction g with p, induction h with q, esimp,
|
2016-09-22 19:42:46 +00:00
|
|
|
|
apply ap tr, apply loopn_succ_in_con
|
2016-04-22 19:12:25 +00:00
|
|
|
|
end
|
|
|
|
|
|
2016-11-23 22:59:13 +00:00
|
|
|
|
definition ghomotopy_group_succ_in [constructor] (A : Type*) (n : ℕ) :
|
|
|
|
|
πg[n + 2] A ≃g πg[n + 1] (Ω A) :=
|
2015-11-18 23:08:38 +00:00
|
|
|
|
begin
|
2016-04-20 15:51:56 +00:00
|
|
|
|
fapply isomorphism_of_equiv,
|
2016-09-22 19:42:46 +00:00
|
|
|
|
{ exact homotopy_group_succ_in A (succ n)},
|
|
|
|
|
{ exact homotopy_group_succ_in_con},
|
2015-11-18 23:08:38 +00:00
|
|
|
|
end
|
|
|
|
|
|
2017-06-02 16:13:20 +00:00
|
|
|
|
definition is_contr_homotopy_group_of_is_contr (A : Type*) (n : ℕ) [is_contr A] : is_contr (π[n] A) :=
|
|
|
|
|
begin
|
|
|
|
|
apply is_trunc_trunc_of_is_trunc,
|
|
|
|
|
apply is_contr_loop_of_is_trunc,
|
|
|
|
|
apply is_trunc_of_is_contr
|
|
|
|
|
end
|
|
|
|
|
|
2016-09-22 19:42:46 +00:00
|
|
|
|
definition homotopy_group_functor [constructor] (n : ℕ) {A B : Type*} (f : A →* B)
|
|
|
|
|
: π[n] A →* π[n] B :=
|
2016-02-16 01:59:38 +00:00
|
|
|
|
ptrunc_functor 0 (apn n f)
|
|
|
|
|
|
2016-09-22 19:42:46 +00:00
|
|
|
|
notation `π→[`:95 n:0 `]`:0 := homotopy_group_functor n
|
2016-03-01 04:37:03 +00:00
|
|
|
|
|
2016-09-22 19:42:46 +00:00
|
|
|
|
definition homotopy_group_functor_phomotopy [constructor] (n : ℕ) {A B : Type*} {f g : A →* B}
|
|
|
|
|
(p : f ~* g) : π→[n] f ~* π→[n] g :=
|
2016-04-22 19:12:25 +00:00
|
|
|
|
ptrunc_functor_phomotopy 0 (apn_phomotopy n p)
|
|
|
|
|
|
2016-11-23 22:59:13 +00:00
|
|
|
|
definition homotopy_group_functor_pid (n : ℕ) (A : Type*) : π→[n] (pid A) ~* pid (π[n] A) :=
|
|
|
|
|
ptrunc_functor_phomotopy 0 !apn_pid ⬝* !ptrunc_functor_pid
|
|
|
|
|
|
2016-09-22 19:42:46 +00:00
|
|
|
|
definition homotopy_group_functor_compose [constructor] (n : ℕ) {A B C : Type*} (g : B →* C)
|
|
|
|
|
(f : A →* B) : π→[n] (g ∘* f) ~* π→[n] g ∘* π→[n] f :=
|
|
|
|
|
ptrunc_functor_phomotopy 0 !apn_pcompose ⬝* !ptrunc_functor_pcompose
|
2016-04-22 19:12:25 +00:00
|
|
|
|
|
|
|
|
|
definition is_equiv_homotopy_group_functor [constructor] (n : ℕ) {A B : Type*} (f : A →* B)
|
|
|
|
|
[is_equiv f] : is_equiv (π→[n] f) :=
|
|
|
|
|
@(is_equiv_trunc_functor 0 _) !is_equiv_apn
|
|
|
|
|
|
2016-09-22 19:42:46 +00:00
|
|
|
|
definition homotopy_group_functor_succ_phomotopy_in (n : ℕ) {A B : Type*} (f : A →* B) :
|
|
|
|
|
homotopy_group_succ_in B n ∘* π→[n + 1] f ~*
|
|
|
|
|
π→[n] (Ω→ f) ∘* homotopy_group_succ_in A n :=
|
2016-04-22 19:12:25 +00:00
|
|
|
|
begin
|
|
|
|
|
refine !ptrunc_functor_pcompose⁻¹* ⬝* _ ⬝* !ptrunc_functor_pcompose,
|
|
|
|
|
exact ptrunc_functor_phomotopy 0 (apn_succ_phomotopy_in n f)
|
|
|
|
|
end
|
|
|
|
|
|
2016-09-22 19:42:46 +00:00
|
|
|
|
definition is_equiv_homotopy_group_functor_ap1 (n : ℕ) {A B : Type*} (f : A →* B)
|
|
|
|
|
[is_equiv (π→[n + 1] f)] : is_equiv (π→[n] (Ω→ f)) :=
|
|
|
|
|
have is_equiv (homotopy_group_succ_in B n ∘* π→[n + 1] f),
|
|
|
|
|
from is_equiv_compose _ (π→[n + 1] f),
|
|
|
|
|
have is_equiv (π→[n] (Ω→ f) ∘ homotopy_group_succ_in A n),
|
|
|
|
|
from is_equiv.homotopy_closed _ (homotopy_group_functor_succ_phomotopy_in n f),
|
|
|
|
|
is_equiv.cancel_right (homotopy_group_succ_in A n) _
|
2016-04-22 19:12:25 +00:00
|
|
|
|
|
2016-09-22 19:42:46 +00:00
|
|
|
|
definition tinverse [constructor] {X : Type*} : π[1] X →* π[1] X :=
|
2016-03-01 04:37:03 +00:00
|
|
|
|
ptrunc_functor 0 pinverse
|
|
|
|
|
|
2016-03-06 00:35:12 +00:00
|
|
|
|
definition is_equiv_tinverse [constructor] (A : Type*) : is_equiv (@tinverse A) :=
|
|
|
|
|
by apply @is_equiv_trunc_functor; apply is_equiv_eq_inverse
|
|
|
|
|
|
2016-03-01 04:37:03 +00:00
|
|
|
|
definition ptrunc_functor_pinverse [constructor] {X : Type*}
|
|
|
|
|
: ptrunc_functor 0 (@pinverse X) ~* @tinverse X :=
|
|
|
|
|
begin
|
|
|
|
|
fapply phomotopy.mk,
|
|
|
|
|
{ reflexivity},
|
|
|
|
|
{ reflexivity}
|
|
|
|
|
end
|
|
|
|
|
|
2016-09-22 19:42:46 +00:00
|
|
|
|
definition homotopy_group_functor_mul [constructor] (n : ℕ) {A B : Type*} (g : A →* B)
|
2016-03-01 04:37:03 +00:00
|
|
|
|
(p q : πg[n+1] A) :
|
2016-09-22 20:00:14 +00:00
|
|
|
|
(π→[n + 1] g) (p *[πg[n+1] A] q) = (π→[n+1] g) p *[πg[n+1] B] (π→[n + 1] g) q :=
|
2016-03-01 04:37:03 +00:00
|
|
|
|
begin
|
|
|
|
|
unfold [ghomotopy_group, homotopy_group] at *,
|
|
|
|
|
refine @trunc.rec _ _ _ (λq, !is_trunc_eq) _ p, clear p, intro p,
|
|
|
|
|
refine @trunc.rec _ _ _ (λq, !is_trunc_eq) _ q, clear q, intro q,
|
|
|
|
|
apply ap tr, apply apn_con
|
|
|
|
|
end
|
|
|
|
|
|
2016-09-22 20:00:14 +00:00
|
|
|
|
definition homotopy_group_homomorphism [constructor] (n : ℕ) [H : is_succ n] {A B : Type*}
|
|
|
|
|
(f : A →* B) : πg[n] A →g πg[n] B :=
|
2016-04-20 15:51:56 +00:00
|
|
|
|
begin
|
2016-09-22 20:00:14 +00:00
|
|
|
|
induction H with n, fconstructor,
|
2016-09-22 19:42:46 +00:00
|
|
|
|
{ exact homotopy_group_functor (n+1) f},
|
|
|
|
|
{ apply homotopy_group_functor_mul}
|
2016-04-20 15:51:56 +00:00
|
|
|
|
end
|
|
|
|
|
|
2016-09-22 20:00:14 +00:00
|
|
|
|
notation `π→g[`:95 n:0 `]`:0 := homotopy_group_homomorphism n
|
|
|
|
|
|
2017-06-02 16:13:20 +00:00
|
|
|
|
definition homotopy_group_homomorphism_pcompose (n : ℕ) [H : is_succ n] {A B C : Type*} (g : B →* C)
|
|
|
|
|
(f : A →* B) : π→g[n] (g ∘* f) ~ π→g[n] g ∘ π→g[n] f :=
|
|
|
|
|
begin
|
|
|
|
|
induction H with n, exact to_homotopy (homotopy_group_functor_compose (succ n) g f)
|
|
|
|
|
end
|
|
|
|
|
|
2016-04-20 15:51:56 +00:00
|
|
|
|
definition homotopy_group_isomorphism_of_pequiv [constructor] (n : ℕ) {A B : Type*} (f : A ≃* B)
|
|
|
|
|
: πg[n+1] A ≃g πg[n+1] B :=
|
|
|
|
|
begin
|
2016-09-22 20:00:14 +00:00
|
|
|
|
apply isomorphism.mk (homotopy_group_homomorphism (succ n) f),
|
2016-04-20 15:51:56 +00:00
|
|
|
|
esimp, apply is_equiv_trunc_functor, apply is_equiv_apn,
|
|
|
|
|
end
|
|
|
|
|
|
2016-09-22 20:00:14 +00:00
|
|
|
|
definition homotopy_group_add (A : Type*) (n m : ℕ) :
|
|
|
|
|
πg[n+m+1] A ≃g πg[n+1] (Ω[m] A) :=
|
2016-04-20 15:51:56 +00:00
|
|
|
|
begin
|
|
|
|
|
revert A, induction m with m IH: intro A,
|
|
|
|
|
{ reflexivity},
|
2016-09-22 19:42:46 +00:00
|
|
|
|
{ esimp [loopn, nat.add], refine !ghomotopy_group_succ_in ⬝g _, refine !IH ⬝g _,
|
2016-04-20 15:51:56 +00:00
|
|
|
|
apply homotopy_group_isomorphism_of_pequiv,
|
2016-09-22 19:42:46 +00:00
|
|
|
|
exact !loopn_succ_in⁻¹ᵉ*}
|
2016-04-20 15:51:56 +00:00
|
|
|
|
end
|
|
|
|
|
|
2016-09-22 19:42:46 +00:00
|
|
|
|
theorem trivial_homotopy_add_of_is_set_loopn {A : Type*} {n : ℕ} (m : ℕ)
|
2016-04-20 15:51:56 +00:00
|
|
|
|
(H : is_set (Ω[n] A)) : πg[m+n+1] A ≃g G0 :=
|
|
|
|
|
!homotopy_group_add ⬝g !trivial_homotopy_of_is_set
|
|
|
|
|
|
2016-09-22 19:42:46 +00:00
|
|
|
|
theorem trivial_homotopy_le_of_is_set_loopn {A : Type*} {n : ℕ} (m : ℕ) (H1 : n ≤ m)
|
2016-04-20 15:51:56 +00:00
|
|
|
|
(H2 : is_set (Ω[n] A)) : πg[m+1] A ≃g G0 :=
|
|
|
|
|
obtain (k : ℕ) (p : n + k = m), from le.elim H1,
|
|
|
|
|
isomorphism_of_eq (ap (λx, πg[x+1] A) (p⁻¹ ⬝ add.comm n k)) ⬝g
|
2016-09-22 19:42:46 +00:00
|
|
|
|
trivial_homotopy_add_of_is_set_loopn k H2
|
2016-04-11 17:11:59 +00:00
|
|
|
|
|
2016-09-22 19:42:46 +00:00
|
|
|
|
definition homotopy_group_pequiv_loop_ptrunc_con {k : ℕ} {A : Type*} (p q : πg[k +1] A) :
|
|
|
|
|
homotopy_group_pequiv_loop_ptrunc (succ k) A (p * q) =
|
|
|
|
|
homotopy_group_pequiv_loop_ptrunc (succ k) A p ⬝
|
|
|
|
|
homotopy_group_pequiv_loop_ptrunc (succ k) A q :=
|
2016-04-22 19:12:25 +00:00
|
|
|
|
begin
|
|
|
|
|
refine _ ⬝ !loopn_pequiv_loopn_con,
|
2016-09-22 19:42:46 +00:00
|
|
|
|
exact ap (loopn_pequiv_loopn _ _) !loopn_ptrunc_pequiv_inv_con
|
2016-04-22 19:12:25 +00:00
|
|
|
|
end
|
|
|
|
|
|
2016-09-22 19:42:46 +00:00
|
|
|
|
definition homotopy_group_pequiv_loop_ptrunc_inv_con {k : ℕ} {A : Type*}
|
2016-04-22 19:12:25 +00:00
|
|
|
|
(p q : Ω[succ k] (ptrunc (succ k) A)) :
|
2016-09-22 19:42:46 +00:00
|
|
|
|
(homotopy_group_pequiv_loop_ptrunc (succ k) A)⁻¹ᵉ* (p ⬝ q) =
|
|
|
|
|
(homotopy_group_pequiv_loop_ptrunc (succ k) A)⁻¹ᵉ* p *
|
|
|
|
|
(homotopy_group_pequiv_loop_ptrunc (succ k) A)⁻¹ᵉ* q :=
|
|
|
|
|
inv_preserve_binary (homotopy_group_pequiv_loop_ptrunc (succ k) A) mul concat
|
|
|
|
|
(@homotopy_group_pequiv_loop_ptrunc_con k A) p q
|
2016-04-22 19:12:25 +00:00
|
|
|
|
|
2017-06-15 00:03:35 +00:00
|
|
|
|
definition ghomotopy_group_ptrunc_of_le [constructor] {k n : ℕ} (H : k ≤ n) [Hk : is_succ k] (A : Type*) :
|
|
|
|
|
πg[k] (ptrunc n A) ≃g πg[k] A :=
|
2016-04-22 19:12:25 +00:00
|
|
|
|
begin
|
|
|
|
|
fapply isomorphism_of_equiv,
|
2017-06-15 00:03:35 +00:00
|
|
|
|
{ exact homotopy_group_ptrunc_of_le H A},
|
|
|
|
|
{ intro g₁ g₂, induction Hk with k,
|
2016-09-22 19:42:46 +00:00
|
|
|
|
refine _ ⬝ !homotopy_group_pequiv_loop_ptrunc_inv_con,
|
|
|
|
|
apply ap ((homotopy_group_pequiv_loop_ptrunc (k+1) A)⁻¹ᵉ*),
|
2016-04-22 19:12:25 +00:00
|
|
|
|
refine _ ⬝ !loopn_pequiv_loopn_con ,
|
|
|
|
|
apply ap (loopn_pequiv_loopn (k+1) _),
|
2016-09-22 19:42:46 +00:00
|
|
|
|
apply homotopy_group_pequiv_loop_ptrunc_con}
|
2016-04-22 19:12:25 +00:00
|
|
|
|
end
|
|
|
|
|
|
2017-06-15 00:03:35 +00:00
|
|
|
|
definition ghomotopy_group_ptrunc [constructor] (k : ℕ) [is_succ k] (A : Type*) :
|
|
|
|
|
πg[k] (ptrunc k A) ≃g πg[k] A :=
|
|
|
|
|
ghomotopy_group_ptrunc_of_le (le.refl k) A
|
|
|
|
|
|
2016-04-11 17:11:59 +00:00
|
|
|
|
/- some homomorphisms -/
|
|
|
|
|
|
2016-09-22 19:42:46 +00:00
|
|
|
|
-- definition is_homomorphism_cast_loopn_succ_eq_in {A : Type*} (n : ℕ) :
|
|
|
|
|
-- is_homomorphism (loopn_succ_in A (succ n) : πg[n+1+1] A → πg[n+1] (Ω A)) :=
|
2016-09-18 05:44:19 +00:00
|
|
|
|
-- begin
|
|
|
|
|
-- intro g h, induction g with g, induction h with h,
|
|
|
|
|
-- xrewrite [tr_mul_tr, - + fn_cast_eq_cast_fn _ (λn, tr), tr_mul_tr, ↑cast, -tr_compose,
|
2016-09-22 19:42:46 +00:00
|
|
|
|
-- loopn_succ_eq_in_concat, - + tr_compose],
|
2016-09-18 05:44:19 +00:00
|
|
|
|
-- end
|
2016-03-01 04:37:03 +00:00
|
|
|
|
|
2017-01-11 18:45:42 +00:00
|
|
|
|
definition is_mul_hom_inverse (A : Type*) (n : ℕ)
|
|
|
|
|
: is_mul_hom (λp, p⁻¹ : (πag[n+2] A) → (πag[n+2] A)) :=
|
2016-04-11 17:11:59 +00:00
|
|
|
|
begin
|
2016-09-18 05:44:19 +00:00
|
|
|
|
intro g h, exact ap inv (mul.comm g h) ⬝ mul_inv h g,
|
2016-04-11 17:11:59 +00:00
|
|
|
|
end
|
|
|
|
|
|
2015-11-16 20:30:28 +00:00
|
|
|
|
end eq
|