module GpdCont.GroupAction.Base where open import GpdCont.Prelude hiding (_▷_) open import GpdCont.Univalence open import GpdCont.Group.SymmetricGroup using (𝔖) open import Cubical.Foundations.Equiv open import Cubical.Foundations.HLevels open import Cubical.Foundations.Isomorphism open import Cubical.Functions.FunExtEquiv using (funExtEquiv) open import Cubical.Data.Sigma.Properties using (Σ-cong-iso-snd) open import Cubical.Algebra.Group.Base open import Cubical.Algebra.Group.Morphisms open import Cubical.Algebra.Group.MorphismProperties using (makeIsGroupHom ; isPropIsGroupHom ; compGroupHom) record Action {ℓG ℓX} (G : Group ℓG) (X : hSet ℓX) : Type (ℓ-max ℓG ℓX) where private open module G = GroupStr (str G) using (_·_) field action : ⟨ G ⟩ → ⟨ 𝔖 X ⟩ pres· : ∀ g h → action (g · h) ≡ action g ∙ₑ (action h) _▷_ : (g : ⟨ G ⟩) → ⟨ X ⟩ → ⟨ X ⟩ _▷_ g = equivFun (action g) open Action using (action ; pres·) unquoteDecl ActionIsoΣ = declareRecordIsoΣ ActionIsoΣ (quote Action) private variable ℓ : Level G H : Group ℓ X : hSet ℓ _⁺_ : Action G X → ⟨ G ⟩ → ⟨ X ⟩ → ⟨ X ⟩ _⁺_ σ = _▷_ where open Action σ ActionGroupHomIso : Iso (Action G X) (GroupHom G (𝔖 X)) ActionGroupHomIso {G} {X} = Action G X Iso⟨ ActionIsoΣ ⟩ Σ[ φ ∈ (⟨ G ⟩ → ⟨ 𝔖 X ⟩) ] (∀ g h → φ (g · h) ≡ φ g ∙ₑ φ h) Iso⟨ Σ-cong-iso-snd recover-1-inv ⟩ GroupHom G (𝔖 X) Iso∎ where open module G = GroupStr (str G) using (_·_) module 𝔖X = GroupStr (str $ 𝔖 X) recover-1-inv : (φ : ⟨ G ⟩ → ⟨ 𝔖 X ⟩) → Iso (∀ g h → φ (g · h) ≡ φ g ∙ₑ φ h) (IsGroupHom (str G) φ (str $ 𝔖 X)) recover-1-inv φ = isProp→Iso (isPropΠ2 λ g h → 𝔖X.is-set _ _) (isPropIsGroupHom _ _) makeIsGroupHom IsGroupHom.pres· GroupHom→Action : GroupHom G (𝔖 X) → Action G X GroupHom→Action = ActionGroupHomIso .Iso.inv Action→GroupHom : Action G X → GroupHom G (𝔖 X) Action→GroupHom = ActionGroupHomIso .Iso.fun GroupHomPreCompAction : (φ : GroupHom G H) → Action H X → Action G X GroupHomPreCompAction {G} {X} φ σ = GroupHom→Action φ*σ where φ*σ : GroupHom G (𝔖 X) φ*σ = compGroupHom φ $ Action→GroupHom σ module ActionProperties {ℓX} {G : Group ℓ} {X : hSet ℓX} (σ : Action G X) where private open module G = GroupStr (str G) using (_·_) module σ = Action σ open IsGroupHom (Action→GroupHom σ .snd) using (pres1 ; presinv) public action-1-id : σ ⁺ G.1g ≡ id ⟨ X ⟩ action-1-id = cong equivFun pres1 action-comp : ∀ g h → σ ⁺ (g · h) ≡ σ ⁺ h ∘ σ ⁺ g action-comp g h = cong equivFun $ σ.pres· g h action-inv : ∀ g → (σ ⁺ G.inv g) ≡ invEq (σ.action g) action-inv g = cong equivFun (presinv g) action-cancel-right : ∀ g → (σ ⁺ g) ⋆ (σ ⁺ G.inv g) ≡ id ⟨ X ⟩ action-cancel-right g = (σ ⁺ g) ⋆ (σ ⁺ G.inv g) ≡⟨ cong (σ ⁺ g ⋆_) (action-inv g) ⟩ (σ ⁺ g) ⋆ invEq (σ.action g) ≡⟨ funExt (λ x → retEq (σ.action g) x) ⟩ id ⟨ X ⟩ ∎ uaExtEquiv : ∀ {Y : hSet ℓ} {f₀ f₁ : ⟨ X ⟩ → ⟨ Y ⟩} (g : ⟨ G ⟩) → (f₀ ≡ f₁ ∘ (σ ⁺ g)) ≃ PathP (λ i → ua (σ.action g) i → ⟨ Y ⟩) f₀ f₁ uaExtEquiv g = invEquiv funExtEquiv ∙ₑ ua→Equiv