module GpdCont.GroupAction.Faithful where
open import GpdCont.Prelude
open import GpdCont.Univalence
open import GpdCont.HomotopySet
open import GpdCont.SetTruncation using (isEmbeddingCong→hasSetFibers)
open import GpdCont.Group.SymmetricGroup using (𝔖)
open import GpdCont.GroupAction.Base
open import GpdCont.GroupAction.AssociatedBundle using (associatedBundle ; associatedBundle-loop)
import GpdCont.Delooping
open import Cubical.Foundations.Equiv.Properties
open import Cubical.Foundations.Equiv
open import Cubical.Foundations.HLevels
open import Cubical.Foundations.Isomorphism
open import Cubical.Functions.Embedding as Embedding using (isEmbedding)
open import Cubical.Data.Sigma
open import Cubical.Algebra.Group.Base
open import Cubical.Algebra.Group.Morphisms using (isMono)
{-# INJECTIVE_FOR_INFERENCE hSet≡ #-}
private
variable
ℓ : Level
G : Group ℓ
X : hSet ℓ
σ : Action G X
isFaithful : (σ : Action G X) → Type _
isFaithful {G} σ = ∀ {g h : ⟨ G ⟩} → action g ≡ action h → g ≡ h where
open Action σ using (action)
isPropIsFaithful : (σ : Action G X) → isProp (isFaithful σ)
isPropIsFaithful {G} σ = isPropImplicitΠ2 λ g h → isProp→ (G.is-set g h) where
module G = GroupStr (str G)
isFaithful→isGroupHomMono : isFaithful σ → isMono (Action→GroupHom σ)
isFaithful→isGroupHomMono ff = ff
module _ {G : Group ℓ} {X : hSet ℓ} {σ : Action G X} (ff : isFaithful σ) where
open Action σ using (action)
private
module 𝔹G = GpdCont.Delooping G
module G = GroupStr (str G)
module 𝔖 = GroupStr (str $ 𝔖 X)
isFaithful→isEmbeddingCong⟨-⟩∘AssocBundle : (x y : 𝔹G.𝔹) → isEmbedding (cong {x = x} {y = y} (⟨_⟩ ∘ associatedBundle σ))
isFaithful→isEmbeddingCong⟨-⟩∘AssocBundle = goal where
has-prop-fibers-σ : Embedding.hasPropFibers action
has-prop-fibers-σ = Embedding.injective→hasPropFibers 𝔖.is-set ff
is-embedding-σ : isEmbedding action
is-embedding-σ = Embedding.hasPropFibers→isEmbedding has-prop-fibers-σ
cong-assoc : (x y : 𝔹G.𝔹) → x ≡ y → ⟨ associatedBundle σ x ⟩ ≡ ⟨ associatedBundle σ y ⟩
cong-assoc x y = cong {x = x} {y = y} (⟨_⟩ ∘ associatedBundle σ)
comm' : cong-assoc 𝔹G.⋆ 𝔹G.⋆ ∘ 𝔹G.loop ≡ ua ∘ action
comm' = funExt $ associatedBundle-loop σ
comm : ua ∘ action ∘ 𝔹G.unloop ≡ cong-assoc 𝔹G.⋆ 𝔹G.⋆
comm =
ua ∘ action ∘ 𝔹G.unloop ≡[ i ]⟨ comm' i ∘ 𝔹G.unloop ⟩
cong-assoc _ _ ∘ 𝔹G.loop ∘ 𝔹G.unloop ≡[ i ]⟨ cong-assoc 𝔹G.⋆ 𝔹G.⋆ ∘ (λ p → retEq 𝔹G.ΩDelooping≃ p i) ⟩
cong-assoc 𝔹G.⋆ 𝔹G.⋆ ∎
goal : ∀ (x y : 𝔹G.𝔹) → isEmbedding (cong-assoc x y)
goal = 𝔹G.elimProp2 (λ _ _ → Embedding.isPropIsEmbedding) $
subst isEmbedding comm $
(Embedding.isEmbedding-∘ {f = ua}
(Embedding.isEquiv→isEmbedding (isoToIsEquiv $ invIso univalenceIso))
(Embedding.isEmbedding-∘ is-embedding-σ (Embedding.isEquiv→isEmbedding $ equivIsEquiv 𝔹G.ΩDelooping≃))
)
isFaithful→isEmbeddingCongAssocBundle : (x y : 𝔹G.𝔹) → isEmbedding (cong {x = x} {y = y} (associatedBundle σ))
isFaithful→isEmbeddingCongAssocBundle x y = subst isEmbedding comm isEmbedding-composite where
bundle≡ = hSet≡ {X = associatedBundle σ x} {Y = associatedBundle σ y}
cong⟨-⟩∘associatedBundle = cong {x = x} {y = y} (⟨_⟩ ∘ associatedBundle σ)
comm : bundle≡ ∘ cong⟨-⟩∘associatedBundle ≡ (cong {x = x} {y = y} (associatedBundle σ))
comm =
hSet≡ ∘ cong {x = x} {y = y} (⟨_⟩ ∘ associatedBundle σ) ≡⟨⟩
hSet≡ ∘ cong ⟨_⟩ ∘ cong (associatedBundle σ) ≡[ i ]⟨ (λ p → hSet≡-section p i) ∘ cong (associatedBundle σ) ⟩
(cong {x = x} {y = y} (associatedBundle σ)) ∎
isEmbedding-bundle≡ : isEmbedding bundle≡
isEmbedding-bundle≡ = Embedding.isEquiv→isEmbedding (equivIsEquiv hSet≡Equiv)
isEmbedding-cong-assocBundle : isEmbedding cong⟨-⟩∘associatedBundle
isEmbedding-cong-assocBundle = isFaithful→isEmbeddingCong⟨-⟩∘AssocBundle x y
isEmbedding-composite : isEmbedding (bundle≡ ∘ cong {x = x} {y = y} (⟨_⟩ ∘ associatedBundle σ))
isEmbedding-composite = Embedding.isEmbedding-∘ isEmbedding-bundle≡ isEmbedding-cong-assocBundle
isFaithful→isSetTruncAssociatedBundle : (Y : hSet ℓ) → isSet (fiber (associatedBundle σ) Y)
isFaithful→isSetTruncAssociatedBundle = isEmbeddingCong→hasSetFibers (associatedBundle σ) isFaithful→isEmbeddingCongAssocBundle