{-# OPTIONS --safe #-} module Cubical.Cohomology.EilenbergMacLane.Groups.Connected where open import Cubical.Cohomology.EilenbergMacLane.Base open import Cubical.Homotopy.Connected open import Cubical.Foundations.Prelude open import Cubical.Foundations.HLevels open import Cubical.Foundations.Isomorphism open import Cubical.Data.Nat open import Cubical.Algebra.Group.MorphismProperties open import Cubical.Algebra.AbGroup.Base open import Cubical.HITs.SetTruncation as ST open import Cubical.HITs.Truncation as Trunc private variable ℓ ℓ' : Level module _ {A : Type ℓ} (conA : isConnected 2 A) (G : AbGroup ℓ') where private H⁰A = coHom 0 G A open AbGroupStr (snd G) renaming (_+_ to _+G_ ; -_ to -G_) a* : hLevelTrunc 2 A a* = conA .fst H⁰→G' : hLevelTrunc 2 A → H⁰A → fst G H⁰→G' = Trunc.rec (isSetΠ (λ _ → is-set)) (λ a → ST.rec is-set λ f → f a) H⁰→G'-id : (a : hLevelTrunc 2 A) → H⁰→G' a* ≡ H⁰→G' a H⁰→G'-id a = cong H⁰→G' (conA .snd a) H⁰→G : H⁰A → fst G H⁰→G = H⁰→G' a* G→H⁰ : fst G → H⁰A G→H⁰ x = ∣ (λ _ → x) ∣₂ G→H⁰→G : (x : fst G) → H⁰→G (G→H⁰ x) ≡ x G→H⁰→G = Trunc.rec (isSetΠ (λ _ → isOfHLevelPath 2 is-set _ _)) (λ a g i → H⁰→G'-id ∣ a ∣ i (G→H⁰ g)) a* H⁰→G→H⁰ : (x : H⁰A) → G→H⁰ (H⁰→G x) ≡ x H⁰→G→H⁰ = ST.elim (λ _ → isSetPathImplicit) λ f → Trunc.rec isSetPathImplicit (λ a → (λ i → G→H⁰ (H⁰→G'-id ∣ a ∣ₕ i ∣ f ∣₂)) ∙ cong ∣_∣₂ (funExt λ x → Trunc.rec (is-set _ _) (cong f) (Iso.fun (PathIdTruncIso 1) (isContr→isProp conA ∣ a ∣ ∣ x ∣)))) a* private H⁰conn' : AbGroupEquiv G (coHomGr zero G A) fst H⁰conn' = isoToEquiv is where is : Iso _ _ Iso.fun is = G→H⁰ Iso.inv is = H⁰→G Iso.rightInv is = H⁰→G→H⁰ Iso.leftInv is = G→H⁰→G snd H⁰conn' = makeIsGroupHom λ _ _ → refl H⁰conn : AbGroupEquiv (coHomGr zero G A) G H⁰conn = invGroupEquiv H⁰conn'