{-# OPTIONS --lossy-unification #-} module GpdCont.ActionContainer.Base where open import GpdCont.Prelude open import GpdCont.Univalence using (ua ; uaCompEquiv ; uaCompEquivSquare) open import GpdCont.Group.SymmetricGroup open import GpdCont.GroupAction.Base open import Cubical.Foundations.Equiv open import Cubical.Foundations.Function using (uncurry4 ; uncurry3) open import Cubical.Foundations.HLevels open import Cubical.Foundations.Isomorphism open import Cubical.Algebra.Group.Base open import Cubical.Algebra.Group.Properties using (isPropIsGroup) open import Cubical.Algebra.Group.Morphisms using (GroupHom ; IsGroupHom) open import Cubical.Algebra.Group.MorphismProperties using (makeIsGroupHom ; compGroupHom ; isPropIsGroupHom) record ActionContainer (ℓ : Level) : Type (ℓ-suc ℓ) where no-eta-equality field Shape : Type ℓ Pos : (s : Shape) → Type ℓ Symm : (s : Shape) → Type ℓ action : {s : Shape} → Symm s → (Pos s ≃ Pos s) field is-set-shape : isSet Shape is-set-pos : ∀ s → isSet (Pos s) PosSymGroup : (s : Shape) → Group ℓ PosSymGroup s = 𝔖 (Pos s , is-set-pos s) field symm-group-str : ∀ s → GroupStr (Symm s) is-group-hom-action : ∀ s → IsGroupHom (symm-group-str s) (action {s}) (str $ PosSymGroup s) ShapeSet : hSet ℓ ShapeSet .fst = Shape ShapeSet .snd = is-set-shape PosSet : (s : Shape) → hSet ℓ PosSet s .fst = Pos s PosSet s .snd = is-set-pos s SymmGroup : (s : Shape) → Group ℓ SymmGroup s .fst = Symm s SymmGroup s .snd = symm-group-str s isSetSymm : ∀ s → isSet (Symm s) isSetSymm s = symm-group-str s .GroupStr.is-set PosLoop : {s : Shape} → Symm s → PosSet s ≡ PosSet s PosLoop = TypeOfHLevel≡ 2 ∘ ua ∘ action _·_ : ∀ {s} → (g h : Symm s) → Symm s _·_ {s} = GroupStr._·_ (symm-group-str s) symm-id : ∀ {s} → Symm s symm-id {s} = GroupStr.1g (symm-group-str s) symm-inv : ∀ {s} → Symm s → Symm s symm-inv {s} = GroupStr.inv (symm-group-str s) opaque PosLoopCompSquare : {s : Shape} → (g h : Symm s) → compSquareFiller (PosLoop g) (PosLoop h) (PosLoop (g · h)) PosLoopCompSquare g h = ΣSquareSet (λ X → isProp→isSet isPropIsSet) goal where goal : compSquareFiller (ua $ action g) (ua $ action h) (ua $ action (g · h)) goal = coerceCompSquareFiller $ (ua $ action g) ∙ (ua $ action h) ≡⟨ sym $ uaCompEquiv (action g) (action h) ⟩ (ua $ action g ∙ₑ action h) ≡⟨ sym $ cong ua (IsGroupHom.pres· (is-group-hom-action _) g h) ⟩ (ua $ action (g · h)) ∎ actionHom : ∀ s → GroupHom (SymmGroup s) (PosSymGroup s) actionHom s .fst = action {s} actionHom s .snd = is-group-hom-action s symmAction : (s : Shape) → Action (SymmGroup s) (PosSet s) symmAction s = GroupHom→Action (actionHom s) action-pres-1 : ∀ {s} → action (GroupStr.1g (symm-group-str s)) ≡ idEquiv (Pos s) action-pres-1 = IsGroupHom.pres1 (is-group-hom-action _) action-pres-inv : ∀ {s} (g : Symm s) → action (symm-inv g) ≡ invEquiv (action g) action-pres-inv = IsGroupHom.presinv (is-group-hom-action _) action-pres-· : ∀ {s} (g h : Symm s) → action (g · h) ≡ action g ∙ₑ action h action-pres-· = IsGroupHom.pres· (is-group-hom-action _) open ActionContainer ActionContainer≡ : ∀ {ℓ} {C D : ActionContainer ℓ} → (shape : C .Shape ≡ D .Shape) → (pos : PathP (λ i → shape i → Type ℓ) (C .Pos) (D .Pos)) → (symm : PathP (λ i → shape i → Group ℓ) (SymmGroup C) (SymmGroup D)) → (action : PathP (λ i → ∀ {s : shape i} → ⟨ symm i s ⟩ → (pos i s ≃ pos i s)) (C .action) (D .action)) → C ≡ D ActionContainer≡ {C} {D} shape pos symm action′ = go where opaque go-is-set-shape : PathP (λ i → isSet (shape i)) (C .is-set-shape) (D .is-set-shape) go-is-set-shape = isProp→PathP (λ i → isPropIsSet {A = shape i}) _ _ go-is-set-pos : PathP (λ i → ∀ s → isSet (pos i s)) (C .is-set-pos) (D .is-set-pos) go-is-set-pos = isProp→PathP (λ i → isPropΠ λ s → isPropIsSet {A = pos i s}) _ _ go-is-group-hom-action : PathP (λ i → ∀ s → IsGroupHom (symm i s .snd) (action′ i {s}) (str (𝔖 (pos i s , go-is-set-pos i s)))) (C .is-group-hom-action) (D .is-group-hom-action) go-is-group-hom-action = isProp→PathP (λ i → isPropΠ λ _ → isPropIsGroupHom _ _) _ _ go : C ≡ D go i .Shape = shape i go i .Pos = pos i go i .Symm = fst ∘ symm i go i .action = action′ i go i .is-set-shape = go-is-set-shape i go i .is-set-pos = go-is-set-pos i go i .symm-group-str = snd ∘ symm i go i .is-group-hom-action = go-is-group-hom-action i mkActionContainer : ∀ {ℓ} (S : hSet ℓ) (P : ⟨ S ⟩ → hSet ℓ) (G : ⟨ S ⟩ → Group ℓ) (σ : ∀ s → Action (G s) (P s)) → ActionContainer ℓ mkActionContainer S P G σ .ActionContainer.Shape = ⟨ S ⟩ mkActionContainer S P G σ .ActionContainer.Pos = ⟨_⟩ ∘ P mkActionContainer S P G σ .ActionContainer.Symm = ⟨_⟩ ∘ G mkActionContainer S P G σ .ActionContainer.action {s} = σ s .Action.action mkActionContainer S P G σ .ActionContainer.is-set-shape = str S mkActionContainer S P G σ .ActionContainer.is-set-pos = str ∘ P mkActionContainer S P G σ .ActionContainer.symm-group-str = str ∘ G mkActionContainer S P G σ .ActionContainer.is-group-hom-action s = Action→GroupHom (σ s) .snd unbundleContainer : ∀ {ℓ} (C : ActionContainer ℓ) → Σ[ S ∈ hSet ℓ ] Σ[ P ∈ (⟨ S ⟩ → hSet ℓ) ] Σ[ G ∈ (⟨ S ⟩ → Group ℓ) ] ∀ s → Action (G s) (P s) unbundleContainer C = let module C = ActionContainer C in λ where .fst → C.ShapeSet .snd .fst → C.PosSet .snd .snd .fst → C.SymmGroup .snd .snd .snd → C.symmAction {-# INLINE unbundleContainer #-} ActionContainerIsoΣ : ∀ {ℓ} → Iso (ActionContainer ℓ) (Σ[ S ∈ hSet ℓ ] Σ[ P ∈ (⟨ S ⟩ → hSet ℓ) ] Σ[ G ∈ (⟨ S ⟩ → Group ℓ) ] ((s : ⟨ S ⟩) → Action (G s) (P s))) ActionContainerIsoΣ .Iso.fun = unbundleContainer ActionContainerIsoΣ .Iso.inv = uncurry3 mkActionContainer ActionContainerIsoΣ .Iso.rightInv _ = refl ActionContainerIsoΣ .Iso.leftInv C = ActionContainer≡ refl refl symm-group-path refl where module Symm s = GroupStr (str (SymmGroup C s)) symm-group-path : SymmGroup _ ≡ SymmGroup C symm-group-path i s .fst = Symm C s symm-group-path i s .snd .GroupStr.1g = Symm.1g s symm-group-path i s .snd .GroupStr._·_ = Symm._·_ s symm-group-path i s .snd .GroupStr.inv = Symm.inv s symm-group-path i s .snd .GroupStr.isGroup = Symm.isGroup s ActionContainer≃Σ : ∀ {ℓ} → (ActionContainer ℓ) ≃ (Σ[ S ∈ hSet ℓ ] Σ[ P ∈ (⟨ S ⟩ → hSet ℓ) ] Σ[ G ∈ (⟨ S ⟩ → Group ℓ) ] ((s : ⟨ S ⟩) → Action (G s) (P s))) ActionContainer≃Σ = isoToEquiv ActionContainerIsoΣ