module Cubical.Cohomology.EilenbergMacLane.Groups.Wedge where
open import Cubical.Cohomology.EilenbergMacLane.Base
open import Cubical.Homotopy.EilenbergMacLane.Base
open import Cubical.Homotopy.EilenbergMacLane.GroupStructure
open import Cubical.Homotopy.EilenbergMacLane.Properties
open import Cubical.Homotopy.Connected
open import Cubical.Foundations.Prelude
open import Cubical.Foundations.HLevels
open import Cubical.Foundations.Isomorphism
open import Cubical.Foundations.Pointed
open import Cubical.Foundations.GroupoidLaws
open import Cubical.Foundations.Function
open import Cubical.Data.Nat
open import Cubical.Data.Sigma
open import Cubical.Algebra.Group.MorphismProperties
open import Cubical.Algebra.Group.Properties
open import Cubical.Algebra.AbGroup.Base
open import Cubical.HITs.SetTruncation as ST
open import Cubical.HITs.Truncation as Trunc
open import Cubical.HITs.Pushout
open import Cubical.HITs.Wedge
private
variable
ℓ ℓ' : Level
module _ {A : Pointed ℓ} {B : Pointed ℓ'} (G : AbGroup ℓ) where
A∨B = A ⋁ B
open AbGroupStr (snd G) renaming (_+_ to _+G_ ; -_ to -G_)
private
×H : (n : ℕ) → AbGroup _
×H n = dirProdAb (coHomGr (suc n) G (fst A))
(coHomGr (suc n) G (fst B))
Hⁿ×→Hⁿ-⋁ : (n : ℕ) → (A ⋁ B → EM G (suc n))
→ (fst A → EM G (suc n)) × (fst B → EM G (suc n))
fst (Hⁿ×→Hⁿ-⋁ n f) x = f (inl x)
snd (Hⁿ×→Hⁿ-⋁ n f) x = f (inr x)
Hⁿ-⋁→Hⁿ× : (n : ℕ)
→ (f : fst A → EM G (suc n))
→ (g : fst B → EM G (suc n))
→ (A ⋁ B → EM G (suc n))
Hⁿ-⋁→Hⁿ× n f g (inl x) = f x -[ (suc n) ]ₖ f (pt A)
Hⁿ-⋁→Hⁿ× n f g (inr x) = g x -[ (suc n) ]ₖ g (pt B)
Hⁿ-⋁→Hⁿ× n f g (push a i) =
(rCancelₖ (suc n) (f (pt A)) ∙ sym (rCancelₖ (suc n) (g (pt B)))) i
Hⁿ⋁-Iso : (n : ℕ)
→ Iso (coHom (suc n) G (A ⋁ B))
(coHom (suc n) G (fst A)
× coHom (suc n) G (fst B))
Iso.fun (Hⁿ⋁-Iso n) =
ST.rec (isSet× squash₂ squash₂)
λ f → ∣ f ∘ inl ∣₂ , ∣ f ∘ inr ∣₂
Iso.inv (Hⁿ⋁-Iso n) =
uncurry (ST.rec2 squash₂ λ f g → ∣ Hⁿ-⋁→Hⁿ× n f g ∣₂)
Iso.rightInv (Hⁿ⋁-Iso n) =
uncurry (ST.elim2
(λ _ _ → isOfHLevelPath 2 (isSet× squash₂ squash₂) _ _)
λ f g
→ ΣPathP (Trunc.rec (isProp→isOfHLevelSuc n (squash₂ _ _))
(λ p → cong ∣_∣₂ (funExt λ x → cong (λ z → f x +[ (suc n) ]ₖ z)
(cong (λ z → -[ (suc n) ]ₖ z) p ∙ -0ₖ (suc n))
∙ rUnitₖ (suc n) (f x)))
(isConnectedPath (suc n)
(isConnectedEM (suc n)) (f (pt A)) (0ₖ (suc n)) .fst)
, Trunc.rec (isProp→isOfHLevelSuc n (squash₂ _ _))
(λ p → cong ∣_∣₂ (funExt λ x → cong (λ z → g x +[ (suc n) ]ₖ z)
(cong (λ z → -[ (suc n) ]ₖ z) p ∙ -0ₖ (suc n))
∙ rUnitₖ (suc n) (g x)))
(isConnectedPath (suc n)
(isConnectedEM (suc n)) (g (pt B)) (0ₖ (suc n)) .fst)))
Iso.leftInv (Hⁿ⋁-Iso n) =
ST.elim (λ _ → isSetPathImplicit)
λ f → Trunc.rec (isProp→isOfHLevelSuc n (squash₂ _ _))
(λ p → cong ∣_∣₂
(funExt λ { (inl x) → pgen f p (inl x)
; (inr x) → p₂ f p x
; (push a i) j → Sq f p j i}))
(Iso.fun (PathIdTruncIso (suc n))
(isContr→isProp (isConnectedEM {G' = G} (suc n))
∣ f (inl (pt A)) ∣ ∣ 0ₖ (suc n) ∣ ))
where
module _ (f : (A ⋁ B → EM G (suc n))) (p : f (inl (pt A)) ≡ 0ₖ (suc n))
where
pgen : (x : A ⋁ B) → _ ≡ _
pgen x =
(λ j → f x -[ (suc n) ]ₖ (p j))
∙∙ (λ j → f x +[ (suc n) ]ₖ (-0ₖ (suc n) j))
∙∙ rUnitₖ (suc n) (f x)
p₂ : (x : typ B) → _ ≡ _
p₂ x = (λ j → f (inr x) -[ (suc n) ]ₖ (f (sym (push tt) j)))
∙ pgen (inr x)
Sq : Square (rCancelₖ (suc n) (f (inl (pt A)))
∙ sym (rCancelₖ (suc n) (f (inr (pt B)))))
(cong f (push tt))
(pgen (inl (pt A)))
(p₂ (pt B))
Sq i j =
hcomp (λ k → λ {(i = i0) → (rCancelₖ (suc n) (f (inl (pt A)))
∙ sym (rCancelₖ (suc n) (f (push tt k)))) j
; (i = i1) → f (push tt (k ∧ j))
; (j = i0) → pgen (inl (pt A)) i
; (j = i1) → ((λ j → f (push tt k) -[ (suc n) ]ₖ
(f (sym (push tt) (j ∨ ~ k))))
∙ pgen (push tt k)) i})
(hcomp (λ k → λ {(i = i0) → rCancel (rCancelₖ (suc n)
(f (inl (pt A)))) (~ k) j
; (i = i1) → f (inl (pt A))
; (j = i0) → pgen (inl (pt A)) i
; (j = i1) → lUnit (pgen (inl (pt A))) k i})
(pgen (inl (pt A)) i))
Hⁿ-⋁≅Hⁿ×Hⁿ : (n : ℕ)
→ AbGroupEquiv
(coHomGr (suc n) G (A ⋁ B))
(dirProdAb (coHomGr (suc n) G (fst A)) (coHomGr (suc n) G (fst B)))
fst (Hⁿ-⋁≅Hⁿ×Hⁿ n) = isoToEquiv (Hⁿ⋁-Iso n)
snd (Hⁿ-⋁≅Hⁿ×Hⁿ n) =
makeIsGroupHom
(ST.elim2 (λ _ _ → isOfHLevelPath 2 (isSet× squash₂ squash₂) _ _)
λ f g → refl)