{-# OPTIONS --lossy-unification #-} module Cubical.Homotopy.Group.Properties where open import Cubical.Homotopy.Loopspace open import Cubical.Homotopy.Connected open import Cubical.Homotopy.Group.Base open import Cubical.Foundations.Prelude open import Cubical.Foundations.Pointed open import Cubical.Foundations.Equiv open import Cubical.HITs.PropositionalTruncation open import Cubical.HITs.SetTruncation as ST open import Cubical.HITs.Truncation as TR open import Cubical.Data.Nat open import Cubical.Algebra.Group.Morphisms open import Cubical.Algebra.AbGroup open import Cubical.Algebra.Group.Abelianization.Properties connectedFun→πEquiv : ∀ {ℓ} {A B : Pointed ℓ} (n : ℕ) (f : A →∙ B) → isConnectedFun (3 + n) (fst f) → GroupEquiv (πGr n A) (πGr n B) connectedFun→πEquiv {ℓ = ℓ} {A = A} {B = B} n f conf = (πHom n f .fst , subst isEquiv (funExt (ST.elim (λ _ → isSetPathImplicit) (λ _ → refl))) (πA≃πB .snd)) , πHom n f .snd where lem : (n : ℕ) → suc (suc n) ∸ n ≡ 2 lem zero = refl lem (suc n) = lem n connΩ^→f : isConnectedFun 2 (fst (Ω^→ (suc n) f)) connΩ^→f = subst (λ k → isConnectedFun k (fst (Ω^→ (suc n) f))) (lem n) (isConnectedΩ^→ (suc (suc n)) (suc n) f conf) πA≃πB : π (suc n) A ≃ π (suc n) B πA≃πB = compEquiv setTrunc≃Trunc2 (compEquiv (connectedTruncEquiv 2 (fst (Ω^→ (suc n) f)) connΩ^→f) (invEquiv setTrunc≃Trunc2)) connectedFun→π'Equiv : ∀ {ℓ} {A B : Pointed ℓ} (n : ℕ) (f : A →∙ B) → isConnectedFun (3 + n) (fst f) → GroupEquiv (π'Gr n A) (π'Gr n B) fst (fst (connectedFun→π'Equiv {ℓ = ℓ} {A = A} {B = B} n f conf)) = π'∘∙Hom n f .fst snd (fst (connectedFun→π'Equiv {ℓ = ℓ} {A = A} {B = B} n f conf)) = transport (λ i → isEquiv (GroupHomπ≅π'PathP-hom n f i .fst)) (connectedFun→πEquiv n f conf .fst .snd) snd (connectedFun→π'Equiv {ℓ = ℓ} {A = A} {B = B} n f conf) = π'∘∙Hom n f .snd connected→Abπ'Equiv : ∀ {ℓ} {A B : Pointed ℓ} (n : ℕ) (f : A →∙ B) → isConnectedFun (3 + n) (fst f) → AbGroupEquiv (AbelianizationAbGroup (π'Gr n A)) (AbelianizationAbGroup (π'Gr n B)) connected→Abπ'Equiv n f isc = AbelianizationEquiv (connectedFun→π'Equiv n f isc) connectedFun→πSurj : ∀ {ℓ} {A B : Pointed ℓ} (n : ℕ) (f : A →∙ B) → isConnectedFun (2 + n) (fst f) → isSurjective {G = πGr n A} {H = πGr n B} (πHom n f) connectedFun→πSurj {ℓ = ℓ} {A = A} {B = B} n f conf = ST.elim (λ _ → isProp→isSet squash₁) λ p → TR.rec squash₁ (λ {(q , r) → ∣ ∣ q ∣₂ , (cong ∣_∣₂ r) ∣₁}) (connΩ^→f p .fst) where lem : (n : ℕ) → suc n ∸ n ≡ 1 lem zero = refl lem (suc n) = lem n connΩ^→f : isConnectedFun 1 (fst (Ω^→ (suc n) f)) connΩ^→f = subst (λ k → isConnectedFun k (fst (Ω^→ (suc n) f))) (lem n) (isConnectedΩ^→ (suc n) (suc n) f conf) connectedFun→π'Surj : ∀ {ℓ} {A B : Pointed ℓ} (n : ℕ) (f : A →∙ B) → isConnectedFun (2 + n) (fst f) → isSurjective (π'∘∙Hom n f) connectedFun→π'Surj n f conf = transport (λ i → isSurjective (GroupHomπ≅π'PathP-hom n f i)) (connectedFun→πSurj n f conf)