module GpdCont.ActionContainer.Constant where open import GpdCont.Prelude open import GpdCont.HomotopySet open import GpdCont.Group.DirProd using (module DirProd) renaming (DirProd to _×Group_) open import GpdCont.GroupAction.Base using (Action) open import GpdCont.GroupAction.Trivial using (trivialAction) open import GpdCont.GroupAction.Pi using (ΠActionΣ) open import GpdCont.ActionContainer.Base open import GpdCont.ActionContainer.Morphism open import GpdCont.ActionContainer.Category open import GpdCont.ActionContainer.DirectProduct using (_⊗_ ; binProducts) open import Cubical.Foundations.HLevels open import Cubical.Foundations.Equiv open import Cubical.Foundations.Function using (flip) open import Cubical.Foundations.Isomorphism open import Cubical.Functions.FunExtEquiv using (funExt₂) open import Cubical.Data.Sum as Sum using (_⊎_) open import Cubical.Data.Empty using (⊥*) open import Cubical.Algebra.Group.Base open import Cubical.Algebra.Group.Morphisms open import Cubical.Algebra.Group.MorphismProperties using (GroupIso→GroupHom ; invGroupIso ; makeIsGroupHom) renaming (compGroupHom to _⋆Group_) open import Cubical.Algebra.Group.Instances.Unit using (UnitGroup ; lUnitGroupIso^) open import Cubical.Algebra.Group.Instances.Pi using (ΠGroup) open import Cubical.Categories.Exponentials open import Cubical.Categories.Presheaf.Representable using (UniversalElement) private variable ℓ : Level projΠGroupHom : ∀ {ℓK} {K : Type ℓK} (G : K → Group ℓ) → ∀ k → GroupHom (ΠGroup G) (G k) projΠGroupHom G k .fst = _$ k projΠGroupHom G k .snd .IsGroupHom.pres· _ _ = refl projΠGroupHom G k .snd .IsGroupHom.pres1 = refl projΠGroupHom G k .snd .IsGroupHom.presinv _ = refl lUnitHom : (G : Group ℓ) → GroupHom (UnitGroup {ℓ} ×Group G) G lUnitHom G = GroupIso→GroupHom lUnitGroupIso^ lUnitInv : (G : Group ℓ) → GroupHom G (UnitGroup {ℓ} ×Group G) lUnitInv G = GroupIso→GroupHom $ invGroupIso lUnitGroupIso^ pointwise : ∀ {ℓK} (K : Type ℓK) (H : Group ℓ) → Group (ℓ-max ℓK ℓ) pointwise K H = ind where module H = GroupStr (str H) ind : Group _ ind .fst = K → ⟨ H ⟩ ind .snd .GroupStr.1g = const H.1g ind .snd .GroupStr._·_ = λ f g k → f k H.· g k ind .snd .GroupStr.inv = λ f k → H.inv (f k) ind .snd .GroupStr.isGroup = makeIsGroup {! !} {! !} {! !} {! !} {! !} {! !} konst : (S : hSet ℓ) → ActionContainer ℓ konst {ℓ} S = mkActionContainer S 𝟘 𝟙 triv where 𝟘 : ⟨ S ⟩ → hSet ℓ 𝟘 _ = EmptySet ℓ 𝟙 : ⟨ S ⟩ → Group ℓ 𝟙 _ = UnitGroup triv : ∀ s → Action (𝟙 s) (𝟘 s) triv s = trivialAction (𝟙 s) (𝟘 s) [konst_,_] : (K : hSet ℓ) → (C : ActionContainer ℓ) → ActionContainer ℓ [konst K , C ] using (S , P , G , σ) ← unbundleContainer C = mkActionContainer S* P* G* σ* where S* : hSet _ S* = K →Set S P* : ⟨ S* ⟩ → hSet _ P* f = ΣSet K (P ∘ f) G* : ⟨ S* ⟩ → Group _ G* f = ΠGroup (G ∘ f) σ* : ∀ f → Action (G* f) (P* f) σ* f = ΠActionΣ K (P ∘ f) (σ ∘ f) eval : {K : hSet ℓ} {C : ActionContainer ℓ} → Morphism (konst K ⊗ [konst K , C ]) C eval {K} {C} using (S , P , G , σ) ← unbundleContainer C = mkMorphismBundled _ _ eval-shape eval-hom (eval-pos , eval-pos-is-eqva) where module C = ActionContainer C Thunk = ⟨ K ⟩ × (⟨ K ⟩ → ⟨ S ⟩) eval-shape : Thunk → ⟨ S ⟩ eval-shape (k , f) = f k eval-hom : ∀ ((k , f) : Thunk) → GroupHom (UnitGroup ×Group ΠGroup (G ∘ f)) (G (f k)) eval-hom (k , f) = lUnitHom (ΠGroup (G ∘ f)) ⋆Group (projΠGroupHom (G ∘ f) k) eval-pos : ((k , f) : Thunk) → C.Pos (f k) → ⊥* ⊎ (Σ[ k ∈ ⟨ K ⟩ ] ⟨ P (f k) ⟩) eval-pos (k , f) p = Sum.inr (k , p) eval-pos-is-eqva : isEquivariantPosMap (konst K ⊗ [konst K , C ]) C eval-pos (fst ∘ eval-hom) eval-pos-is-eqva (f , k) g* = refl module _ (K : hSet ℓ) (C Z : ActionContainer ℓ) where private module C = ActionContainer C module Z = ActionContainer Z open Morphism open Morphismᴰ ⊥-⊎-Pos-Iso : ∀ z → Iso (⊥* {ℓ = ℓ} ⊎ Z.Pos z) (Z.Pos z) ⊥-⊎-Pos-Iso z = Sum.⊎-IdL-⊥*-Iso konst-uncurry : Morphism Z [konst K , C ] → Morphism (konst K ⊗ Z) C konst-uncurry f = go where module f = Morphism f uncurry-shape : ⟨ K ⟩ × Z.Shape → C.Shape uncurry-shape = uncurry $ flip f.shape-map uncurry-hom' : ∀ ((k , z) : ⟨ K ⟩ × Z.Shape) → GroupHom (Z.SymmGroup z) (C.SymmGroup (f.shape-map z k)) uncurry-hom' (k , z) = f.symm-hom z ⋆Group projΠGroupHom (C.SymmGroup ∘ f.shape-map z) k uncurry-hom : ∀ ((k , z) : ⟨ K ⟩ × Z.Shape) → GroupHom (UnitGroup ×Group (Z.SymmGroup z)) (C.SymmGroup (f.shape-map z k)) uncurry-hom (k , z) = lUnitHom _ ⋆Group uncurry-hom' (k , z) uncurry-pos : ∀ ((k , z) : ⟨ K ⟩ × Z.Shape) → C.Pos (f.shape-map z k) → ⊥* ⊎ Z.Pos z uncurry-pos (k , z) p = ⊥-⊎-Pos-Iso z .Iso.inv (f.pos-map z (k , p)) uncurry-pos-is-equivariant : isEquivariantPosMap (konst K ⊗ Z) C uncurry-pos (fst ∘ uncurry-hom) uncurry-pos-is-equivariant (k , z) (_ , g) = funExt λ p → cong (⊥-⊎-Pos-Iso z .Iso.inv) $ funExt⁻ (f.is-equivariant-pos-map z g) (k , p) go : Morphism (konst K ⊗ Z) C go = mkMorphismBundled (konst K ⊗ Z) C uncurry-shape uncurry-hom (uncurry-pos , uncurry-pos-is-equivariant) konst-curry : Morphism (konst K ⊗ Z) C → Morphism Z [konst K , C ] konst-curry f = mkMorphismBundled Z [konst K , C ] curry-shape curry-hom (curry-pos , curry-pos-is-equivariant) where module f = Morphism f curry-shape : Z.Shape → ⟨ K ⟩ → C.Shape curry-shape = flip $ curry f.shape-map module Gᶻ {z} = GroupStr (str (Z.SymmGroup z)) module Gᶜ {c} = GroupStr (str (C.SymmGroup c)) curry-hom : ∀ z → GroupHom (Z.SymmGroup z) (ΠGroup (C.SymmGroup ∘ curry-shape z)) curry-hom z .fst gᶻ k = f.symm-map (k , z) (tt* , gᶻ) curry-hom z .snd = makeIsGroupHom λ gᶻ hᶻ → funExt λ k → let φ = f.symm-map (k , z) in φ (tt* , gᶻ Gᶻ.· hᶻ) ≡⟨ f.is-group-hom-symm-map (k , z) .IsGroupHom.pres· (tt* , gᶻ) (tt* , hᶻ) ⟩ (φ (tt* , gᶻ)) Gᶜ.· (φ (tt* , hᶻ)) ∎ curry-pos : ∀ z → Σ[ k ∈ ⟨ K ⟩ ] C.Pos (f.shape-map (k , z)) → Z.Pos z curry-pos z (k , p) = del-⊥ (f.pos-map (k , z) p) where del-⊥ : ⊥* ⊎ Z.Pos z → Z.Pos z del-⊥ = Sum.⊎-IdL-⊥*-Iso .Iso.fun curry-pos-is-equivariant : isEquivariantPosMap Z [konst K , C ] curry-pos (fst ∘ curry-hom) curry-pos-is-equivariant z gᶻ = funExt λ where (k , c-pos) → equivFun (Z.action gᶻ) (curry-pos z (k , c-pos)) ≡[ i ]⟨ {! !} ⟩ curry-pos z (k , equivFun (C.action (f.symm-map (k , z) (tt* , gᶻ))) c-pos) ∎ konst-curry-Iso : Iso (Morphism Z [konst K , C ]) (Morphism (konst K ⊗ Z) C) konst-curry-Iso .Iso.fun = konst-uncurry konst-curry-Iso .Iso.inv = konst-curry konst-curry-Iso .Iso.rightInv f× = Morphism≡ _ _ refl (funExt₂ pos-path) refl where pos-path : ∀ ((k , z) : ⟨ K ⟩ × ⟨ Z.ShapeSet ⟩) (c-pos : C.Pos (shape-map f× (k , z))) → Sum.inr (pos-map (konst-curry f×) z (k , c-pos)) ≡ pos-map f× (k , z) c-pos pos-path (k , z) c-pos = Sum.⊎-IdL-⊥*-Iso .Iso.leftInv (pos-map (mor-str f×) (k , z) c-pos) konst-curry-Iso .Iso.leftInv f→ = Morphism≡ _ _ refl refl refl konst-exponential : (K : hSet ℓ) (C : ActionContainer ℓ) → Exponential (Act {ℓ}) (konst K) C (binProducts $ konst K) konst-exponential K C = K⇒C where uncurry' : ∀ Z → Morphism Z [konst K , C ] → Morphism (konst K ⊗ Z) C uncurry' Z f .Morphism.shape-map = λ z → Morphism.shape-map f (z .snd) (z .fst) uncurry' Z f .Morphism.mor-str .Morphismᴰ.pos-map = λ s z → Sum.inr ((Morphism.pos-map f) (snd s) (fst s , z)) uncurry' Z f .Morphism.mor-str .Morphismᴰ.symm-map = λ s z → Morphism.symm-map f (snd s) (snd z) (fst s) uncurry' Z f .Morphism.mor-str .Morphismᴰ.is-group-hom-symm-map = _ uncurry' Z f .Morphism.mor-str .Morphismᴰ.is-equivariant-pos-map = _ konst-universal : ∀ (Z : ActionContainer _) → isEquiv (konst-uncurry K C Z) konst-universal Z = isoToIsEquiv (konst-curry-Iso K C Z) opaque p : ∀ Z → konst-uncurry K C Z ≡ uncurry' Z p Z = funExt λ f → Morphism≡ _ _ refl refl refl universal : ∀ (Z : ActionContainer _) → isEquiv (uncurry' Z) universal Z = subst isEquiv (p Z) (konst-universal Z) K⇒C : Exponential Act (konst K) C (binProducts $ konst K) K⇒C .UniversalElement.vertex = [konst K , C ] K⇒C .UniversalElement.element = eval {K = K} {C = C} K⇒C .UniversalElement.universal = universal