{-# OPTIONS --lossy-unification #-}
module Cubical.CW.Homology.Groups.Sn where
open import Cubical.Foundations.Prelude
open import Cubical.Foundations.HLevels
open import Cubical.Foundations.Isomorphism
open import Cubical.Data.Nat renaming (_+_ to _+ℕ_)
open import Cubical.Data.Nat.Order.Inductive
open import Cubical.Data.Int
open import Cubical.Data.Fin.Inductive
open import Cubical.Data.Sigma
open import Cubical.Data.Empty as ⊥
open import Cubical.HITs.PropositionalTruncation as PT
open import Cubical.HITs.SetQuotients.Base renaming (_/_ to _/s_)
open import Cubical.HITs.SetQuotients.Properties as SQ
open import Cubical.Algebra.Group
open import Cubical.Algebra.Group.Morphisms
open import Cubical.Algebra.Group.MorphismProperties
open import Cubical.Algebra.Group.Instances.Int
open import Cubical.CW.ChainComplex
open import Cubical.CW.Instances.Sn
open Iso
module _ (n : ℕ) where
ScardDiag : isContr (Fin (Scard (suc n) (suc n)))
ScardDiag with (n ≟ᵗ n)
... | lt x = ⊥.rec (¬m<ᵗm x)
... | eq x = inhProp→isContr fzero isPropFin1
... | gt x = ⊥.rec (¬m<ᵗm x)
HₙSⁿ→ℤ-fun : (a : Fin (Scard (suc n) (suc n)) → ℤ) → ℤ
HₙSⁿ→ℤ-fun a = a (ScardDiag .fst)
HₙSⁿ→ℤ-coh :
(a b : Fin (Scard (suc n) (suc n)) → ℤ)
→ (aker : ∂ (Sˢᵏᵉˡ (suc n)) n .fst a ≡ λ _ → 0)
→ (bker : ∂ (Sˢᵏᵉˡ (suc n)) n .fst b ≡ λ _ → 0)
→ (r : Σ[ t ∈ (Fin (Scard (suc n) (suc (suc n))) → ℤ) ]
∂ (Sˢᵏᵉˡ (suc n)) (suc n) .fst t ≡ λ q → a q - b q)
→ HₙSⁿ→ℤ-fun a ≡ HₙSⁿ→ℤ-fun b
HₙSⁿ→ℤ-coh a b aker bker r with (n ≟ᵗ n) | (suc n ≟ᵗ n)
... | lt x | t = ⊥.rec (¬m<ᵗm x)
... | eq x | lt x₁ = ⊥.rec (¬-suc-n<ᵗn x₁)
... | eq x | eq x₁ = ⊥.rec (sucn≠n x₁)
... | eq x | gt x₁ = sym (+Comm (b fzero) 0
∙ cong (_+ b fzero) (funExt⁻ (snd r) fzero)
∙ sym (+Assoc (a fzero) (- b fzero) (b fzero))
∙ cong (a fzero +_) (-Cancel' (b fzero)))
... | gt x | t = ⊥.rec (¬m<ᵗm x)
HₙSⁿ→ℤ : H̃ˢᵏᵉˡ (Sˢᵏᵉˡ (suc n)) (suc n) . fst → ℤ
HₙSⁿ→ℤ = SQ.elim (λ _ → isSetℤ) (λ a → HₙSⁿ→ℤ-fun (fst a))
λ a b → PT.elim (λ _ → isSetℤ _ _)
λ x → HₙSⁿ→ℤ-coh (fst a) (fst b) (snd a) (snd b) (fst x , cong fst (snd x))
∂VanishS : (n : ℕ) (t : _) → ∂ (Sˢᵏᵉˡ (suc n)) n .fst t ≡ λ _ → pos 0
∂VanishS zero t = funExt λ { (zero , p) → ·Comm (t fzero) (pos 0)}
∂VanishS (suc n) t = funExt λ y → ⊥.rec (¬Scard' n y)
ℤ→HₙSⁿ-fun : ℤ → H̃ˢᵏᵉˡ (Sˢᵏᵉˡ (suc n)) (suc n) . fst
ℤ→HₙSⁿ-fun z = [ (λ _ → z) , ∂VanishS n (λ _ → z) ]
ℤ→HₙSⁿ : GroupHom ℤGroup (H̃ˢᵏᵉˡ (Sˢᵏᵉˡ (suc n)) (suc n))
fst (ℤ→HₙSⁿ) = ℤ→HₙSⁿ-fun
snd (ℤ→HₙSⁿ) = makeIsGroupHom λ x y
→ cong [_] (Σ≡Prop (λ _ → isOfHLevelPath' 1 (isSetΠ (λ _ → isSetℤ)) _ _)
refl)
HₙSⁿ→ℤ→HₙSⁿ : (x : _) → ℤ→HₙSⁿ-fun (HₙSⁿ→ℤ x) ≡ x
HₙSⁿ→ℤ→HₙSⁿ =
SQ.elimProp (λ _ → GroupStr.is-set (snd (H̃ˢᵏᵉˡ (Sˢᵏᵉˡ (suc n)) (suc n))) _ _)
λ {(a , p) → cong [_] (Σ≡Prop (λ _ → isSetΠ (λ _ → isSetℤ) _ _)
(funExt λ t → cong a (ScardDiag .snd t)))}
ℤ≅HₙSⁿ : GroupIso ℤGroup (H̃ˢᵏᵉˡ (Sˢᵏᵉˡ (suc n)) (suc n))
fun (fst ℤ≅HₙSⁿ) = ℤ→HₙSⁿ .fst
inv (fst ℤ≅HₙSⁿ) = HₙSⁿ→ℤ
rightInv (fst ℤ≅HₙSⁿ) = HₙSⁿ→ℤ→HₙSⁿ
leftInv (fst ℤ≅HₙSⁿ) _ = refl
snd ℤ≅HₙSⁿ = ℤ→HₙSⁿ .snd
HₙSⁿ≅ℤ : GroupIso (H̃ˢᵏᵉˡ (Sˢᵏᵉˡ (suc n)) (suc n)) ℤGroup
HₙSⁿ≅ℤ = invGroupIso ℤ≅HₙSⁿ
genHₙSⁿ : H̃ˢᵏᵉˡ (Sˢᵏᵉˡ (suc n)) (suc n) .fst
genHₙSⁿ = [ (λ _ → 1) , (∂VanishS n (λ _ → 1)) ]