--------------------------------------------------------------------------------
Ettore Aldrovandi ealdrovandi@fsu.edu
Keri D'Angelo kd349@cornell.edu
June 2022
--------------------------------------------------------------------------------
Group actions on sets and Torsors, following the UniMath blueprint. We
add a couple of things:
1. actions give homomorphisms into groups of automorphisms and
viceversa.
2. pullbacks of actions.
3. G Sets
Torsors are in their own file Torsos.lagda
\begin{code}
{-# OPTIONS --safe --without-K #-}
open import Groups.Type renaming (_β
_ to _β£_)
open import MLTT.Spartan
open import UF.Base hiding (_β_)
open import UF.Embeddings
open import UF.Equiv
open import UF.Equiv-FunExt
open import UF.FunExt
open import UF.Sets
open import UF.Sets-Properties
open import UF.Subsingletons
open import UF.Subsingletons-FunExt
open import UF.Subsingletons-Properties
open import UF.UA-FunExt
open import UF.Univalence
module Groups.GroupActions where
module _ (G : Group π€) where
action-structure : π€ Μ β π€ Μ
action-structure X = β¨ G β© β X β X
action-axioms : (X : π€ Μ ) β action-structure X β π€ Μ
action-axioms X _Β·_ = is-set X Γ
((g h : β¨ G β©)(x : X) β (g Β·β¨ G β© h) Β· x οΌ g Β· (h Β· x)) Γ
((x : X) β (unit G) Β· x οΌ x)
Action-structure : π€ Μ β π€ Μ
Action-structure X = Ξ£ _Β·_ κ action-structure X , (action-axioms X _Β·_)
Action : π€ βΊ Μ
Action = Ξ£ X κ π€ Μ , Action-structure X
action-carrier : Action β π€ Μ
action-carrier (X , _ ) = X
action-op : (π : Action) β action-structure β¨ π β©
action-op (X , op , _) = op
carrier-is-set : (π : Action) β is-set (action-carrier π)
carrier-is-set (X , op , i , _) = i
action-assoc : (π : Action) (g h : β¨ G β©) (x : β¨ π β©)
β (action-op π) (g Β·β¨ G β© h) x οΌ (action-op π) g ((action-op π) h x)
action-assoc (X , op , i , a , u) = a
action-unit : (π : Action) (x : β¨ π β©)
β (action-op π) (unit G) x οΌ x
action-unit (X , op , i , a , u) = u
action-tofun : (π : Action) (g : β¨ G β©) β β¨ π β© β β¨ π β©
action-tofun π g = Ξ» x β action-op π g x
action-to-fun = action-tofun
action-tofun-is-equiv : (π : Action) (g : β¨ G β©) β is-equiv (action-tofun π g)
action-tofun-is-equiv π g =
(fβ»ΒΉ , Ξ» x β (f (fβ»ΒΉ x) οΌβ¨ (action-assoc π _ _ _) β»ΒΉ β©
(g Β·β¨ G β© (inv G g)) ββ¨ π β© x οΌβ¨ ap (Ξ» v β v ββ¨ π β© x) (inv-right G g) β©
(unit G) ββ¨ π β© x οΌβ¨ action-unit π x β©
x β)) ,
(fβ»ΒΉ , Ξ» x β (fβ»ΒΉ (f x) οΌβ¨ (action-assoc π _ _ _) β»ΒΉ β©
((inv G g) Β·β¨ G β© g) ββ¨ π β© x οΌβ¨ ap (Ξ» v β v ββ¨ π β© x) (inv-left G g) β©
(unit G) ββ¨ π β© x οΌβ¨ action-unit π x β©
x β))
where
_ββ¨_β©_ : β¨ G β© β (π : Action) β β¨ π β© β β¨ π β©
g ββ¨ π β© x = action-op π g x
f : β¨ π β© β β¨ π β©
f = action-tofun π g
fβ»ΒΉ : β¨ π β© β β¨ π β©
fβ»ΒΉ = action-tofun π (inv G g)
action-to-fun-is-equiv = action-tofun-is-equiv
action-to-Aut : (π : Action) (g : β¨ G β©) β Aut β¨ π β©
action-to-Aut π g = (action-to-fun π g) , action-to-fun-is-equiv π g
left-mult = action-to-fun
right-mult : (π : Action) (x : β¨ π β©) β β¨ G β© β β¨ π β©
right-mult π x = Ξ» g β action-op π g x
mult : (π : Action)
β β¨ G β© Γ β¨ π β© β β¨ π β© Γ β¨ π β©
mult π (g , x) = action-op π g x , x
\end{code}
In this submodule we prove that an action as defined above induces a
homomorphism from the group G to the automorphism group of the carrier
set. It requires funext π€ π€ because Aut (X) (as a group)
does. Conversely, a homomorphism to Aut (X) gives an action.
\begin{code}
module to-automorphism (fe : funext π€ π€)
(π : Action)
where
open import Groups.Aut
open import Groups.Opposite
is-hom-action-to-fun : is-hom G ((πΈut fe β¨ π β© (carrier-is-set π)) α΅α΅) (action-to-Aut π)
is-hom-action-to-fun {g} {h} =
to-Ξ£-οΌ ((dfunext fe (Ξ» x β action-assoc π g h x)) ,
being-equiv-is-prop'' fe (Ξ» x β g Β· (h Β· x)) _ _)
where
_Β·_ : β¨ G β© β β¨ π β© β β¨ π β©
_Β·_ = action-op π
module from-automorphism (fe : funext π€ π€)
(X : π€ Μ )(i : is-set X)
(Ο : β¨ G β© β Aut X)
where
open import Groups.Aut
open import Groups.Opposite
hom-to-Aut-gives-action : is-hom G ((πΈut fe X i) α΅α΅ ) Ο β Action
hom-to-Aut-gives-action is = X , ((Ξ» g β prβ (Ο g)) ,
(i , (Ξ» g h β happly (ap prβ (is {g} {h}))) ,
Ξ» x β ( prβ (Ο (unit G)) x οΌβ¨ happly (ap prβ t) x β©
prβ (unit πΈutX) x οΌβ¨ happly' id id refl x β©
x β ) ) )
where
πΈutX : Group π€
πΈutX = πΈut fe X i
t : Ο (unit G) οΌ unit πΈutX
t = homs-preserve-unit G ((πΈut fe X i) α΅α΅ ) Ο is
\end{code}
Resuming the general theory, the group action axioms form a proposition
and the Action-structure is a set.
\begin{code}
action-axioms-is-prop : funext π€ π€
β (X : π€ Μ)
β (_Β·_ : action-structure X)
β is-prop (action-axioms X _Β·_)
action-axioms-is-prop fe X _Β·_ s = Ξ³ s
where
i : is-set X
i = prβ s
Ξ³ : is-prop (action-axioms X _Β·_)
Ξ³ = Γ-is-prop (being-set-is-prop fe)
(Γ-is-prop (Ξ -is-prop fe
(Ξ» g β Ξ -is-prop fe
(Ξ» h β Ξ -is-prop fe
(Ξ» x β i))))
(Ξ -is-prop fe (Ξ» x β i)))
Action-structure-is-set : funext π€ π€
β (X : π€ Μ)
β is-set (Action-structure X)
Action-structure-is-set fe X {s} = Ξ³ {s}
where
i : is-set X
i = prβ (prβ s)
Ξ³ : is-set (Action-structure X)
Ξ³ = Ξ£-is-set (Ξ -is-set fe
(Ξ» g β Ξ -is-set fe
(Ξ» x β i)))
Ξ» op β props-are-sets (action-axioms-is-prop fe X op)
\end{code}
Equivariant maps.
\begin{code}
is-equivariant : (π π : Action) (f : β¨ π β© β β¨ π β©) β π€ Μ
is-equivariant π π f = β g x β f (g Β· x) οΌ g * (f x)
where
_Β·_ = action-op π
_*_ = action-op π
is-equivariant-is-prop : funext π€ π€
β (π π : Action) β (f : β¨ π β© β β¨ π β©)
β is-prop (is-equivariant π π f)
is-equivariant-is-prop fe π π f s = Ξ³ s
where
i : is-set (action-carrier π)
i = carrier-is-set π
Ξ³ : is-prop (is-equivariant π π f)
Ξ³ = Ξ -is-prop fe
(Ξ» g β Ξ -is-prop fe
(Ξ» x β i))
is-equivariant-comp : (π π β€ : Action)
β (p : β¨ π β© β β¨ π β©) (i : is-equivariant π π p)
β (q : β¨ π β© β β¨ β€ β©) (j : is-equivariant π β€ q)
β (is-equivariant π β€ (q β p))
is-equivariant-comp π π β€ p i q j g x = q (p (g Β· x)) οΌβ¨ ap q (i g x) β©
q (g * (p x)) οΌβ¨ j g (p x) β©
g β΅ (q (p x)) β
where
_Β·_ = action-op π
_*_ = action-op π
_β΅_ = action-op β€
\end{code}
The following "fundamental" fact from UniMath is that an
identification p : β¨ π β© οΌ β¨ π β© between the carriers of two actions
essentially gives rise to an equivariant map. More precisely,
equivariance of the identity is the same as the identification of the
structures.
\begin{code}
οΌ-is-equivariant : funext π€ π€
β (π π : Action)
β (p : β¨ π β© οΌ β¨ π β©)
β (transport Action-structure p (prβ π) οΌ prβ π ) β
is-equivariant π π (idtofun β¨ π β© β¨ π β© p)
prβ (οΌ-is-equivariant fe (X , as) (.X , .as) refl) refl = Ξ» g x β refl
prβ (οΌ-is-equivariant fe (X , as) (.X , as') refl) =
logical-equivs-of-props-are-equivs
is (is-equivariant-is-prop fe ((X , as)) (X , as') id)
(prβ (οΌ-is-equivariant fe (X , as) (X , as') refl))
Ξ» i β to-Ξ£-οΌ ((Ξ³ i) , (action-axioms-is-prop fe X _Β·'_ _ _))
where
_Β·_ _Β·'_ : action-structure X
_Β·_ = prβ as
_Β·'_ = prβ as'
is : is-prop (as οΌ as')
is = Action-structure-is-set fe X {as} {as'}
Ξ³ : is-equivariant (X , as) (X , as') id β _Β·_ οΌ _Β·'_
Ξ³ = Ξ» i β dfunext fe
(Ξ» g β dfunext fe Ξ» x β i g x)
\end{code}
The above function is called is_equivariant_identity in UniMath.
\begin{code}
Action-Map : (π π : Action) β π€ Μ
Action-Map π π = Ξ£ f κ (β¨ π β© β β¨ π β©) , is-equivariant π π f
underlying-function : (π π : Action) (u : Action-Map π π) β β¨ π β© β β¨ π β©
underlying-function _ _ u = prβ u
equivariance : {π π : Action} (u : Action-Map π π) β
is-equivariant π π (underlying-function π π u)
equivariance u = prβ u
Action-Map-is-set : funext π€ π€
β (π π : Action)
β is-set (Action-Map π π)
Action-Map-is-set fe π π {s} = Ξ³ {s}
where
Ξ³ : is-set (Action-Map π π)
Ξ³ = Ξ£-is-set (Ξ -is-set fe
(Ξ» u β carrier-is-set π))
Ξ» f β props-are-sets (is-equivariant-is-prop fe π π f)
compose-Action-Map : {π π β€ : Action}
β (Action-Map π π) β (Action-Map π β€)
β (Action-Map π β€)
compose-Action-Map {π} {π} {β€} (p , i) (q , j) =
(q β p) , (is-equivariant-comp π π β€ p i q j)
Action-Iso : (π π : Action) β π€ Μ
Action-Iso π π = Ξ£ f κ β¨ π β© β β¨ π β© , is-equivariant π π (eqtofun f)
Action-Iso-is-set : funext π€ π€
β (π π : Action)
β is-set (Action-Iso π π)
Action-Iso-is-set fe π π {s} = Ξ³ {s}
where
Ξ³ : is-set (Action-Iso π π)
Ξ³ = Ξ£-is-set (Ξ£-is-set (Ξ -is-set fe (Ξ» _ β carrier-is-set π))
Ξ» f β props-are-sets (being-equiv-is-prop'' fe f))
Ξ» u β props-are-sets (is-equivariant-is-prop fe π π (prβ u))
underlying-iso : (π π : Action) β Action-Iso π π β β¨ π β© β β¨ π β©
underlying-iso π π u = prβ u
underlying-iso-is-embedding : funext π€ π€
β (π π : Action)
β is-embedding (underlying-iso π π)
underlying-iso-is-embedding fe π π =
prβ-is-embedding (Ξ» f β is-equivariant-is-prop fe π π (prβ f))
underlying-iso-injectivity : funext π€ π€
β (π π : Action)
β (u v : Action-Iso π π)
β (u οΌ v) β (underlying-iso π π u οΌ underlying-iso π π v)
underlying-iso-injectivity fe π π u v =
β-sym (embedding-criterion-converse
(underlying-iso π π)
(underlying-iso-is-embedding fe π π) u v)
underlying-Action-Map : (π π : Action) β Action-Iso π π
β Action-Map π π
underlying-Action-Map _ _ ((f , _) , is) = f , is
id-Action-Iso : (π : Action) β Action-Iso π π
id-Action-Iso π = (id , (id-is-equiv β¨ π β©)) , (Ξ» g x β refl)
οΌ-to-Action-Iso : {π π : Action}
β π οΌ π β Action-Iso π π
οΌ-to-Action-Iso {π} {π} p = transport (Action-Iso π) p (id-Action-Iso π)
οΌ-to-Action-Isoβ : {π π : Action}
β π οΌ π β Action-Iso π π
οΌ-to-Action-Isoβ {π} {.π} refl = id-Action-Iso π
οΌ-to-Action-Iso-compare : {π π : Action} β (u : π οΌ π)
β οΌ-to-Action-Iso {π} {π} u οΌ οΌ-to-Action-Isoβ {π} {π} u
οΌ-to-Action-Iso-compare {π} {.π} refl = refl
compose-Action-Iso : {π π β€ : Action}
β Action-Iso π π β Action-Iso π β€
β Action-Iso π β€
compose-Action-Iso {π} {π} {β€} (f , i) (g , j) =
(f β g) , (is-equivariant-comp π π β€ (prβ f) i (prβ g) j)
compose-Action-Iso-id : funext π€ π€
β {π π : Action} β (u : Action-Iso π π)
β compose-Action-Iso {π} {π} {π} u (id-Action-Iso π) οΌ u
compose-Action-Iso-id fe {π} {π} u = to-subtype-οΌ
(Ξ» f β is-equivariant-is-prop fe π π (eqtofun f))
(β-refl-right' fe fe fe (prβ u))
compose-id-Action-Iso : funext π€ π€
β {π π : Action} β (u : Action-Iso π π)
β compose-Action-Iso {π} {π} {π} (id-Action-Iso π) u οΌ u
compose-id-Action-Iso fe {π} {π} u = to-subtype-οΌ
(Ξ» f β is-equivariant-is-prop fe π π (eqtofun f))
(β-refl-left' fe fe fe (prβ u))
\end{code}
Univalence for group actions. The abstract clause below is to speed up
type-checking.
\begin{code}
module _ (ua : is-univalent π€) where
private
fe : funext π€ π€
fe = univalence-gives-funext ua
Id-equiv-Action-Iso_prelim : (π π : Action)
β (π οΌ π) β (Action-Iso π π)
Id-equiv-Action-Iso_prelim π π = β-comp (Ξ¦ , ll) (Ξ¨ , ii)
where
T : (π π : Action) β (π€ βΊ) Μ
T π π = Ξ£ u κ β¨ π β© οΌ β¨ π β© , transport Action-structure u (prβ π) οΌ prβ π
Ξ¦ : (π οΌ π) β T π π
Ξ¦ = from-Ξ£-οΌ
Ξ¦' : T π π β (π οΌ π)
Ξ¦' = to-Ξ£-οΌ
Ξ¨ : T π π β Action-Iso π π
Ξ¨ (p , is) = (idtoeq β¨ π β© β¨ π β© p) , prβ (οΌ-is-equivariant fe π π p) is
abstract
Ξ¨' : Action-Iso π π β T π π
Ξ¨' (e , is) = p , prβ (β-sym (οΌ-is-equivariant fe π π p)) i
where
p : β¨ π β© οΌ β¨ π β©
p = eqtoid ua β¨ π β© β¨ π β© e
i : is-equivariant π π (idtofun β¨ π β© β¨ π β© p)
i = transport (is-equivariant π π) (t β»ΒΉ) is
where
t : idtofun β¨ π β© β¨ π β© p οΌ eqtofun e
t = idtofun-eqtoid ua e
Ξ¨'Ξ¨-id : (Ο : T π π) β Ξ¨' (Ξ¨ Ο) οΌ Ο
Ξ¨'Ξ¨-id (p , is) = to-Ξ£-οΌ (eqtoid-idtoeq ua β¨ π β© β¨ π β© p ,
Action-structure-is-set fe _ _ _)
ΨΨ'-id : (u : Action-Iso π π) β Ξ¨ (Ξ¨' u) οΌ u
ΨΨ'-id (e , is) = to-Ξ£-οΌ ((idtoeq-eqtoid ua β¨ π β© β¨ π β© e) ,
(is-equivariant-is-prop fe π π _ _ _))
ii : is-equiv Ξ¨
ii = qinvs-are-equivs Ξ¨ inv-Ξ¨
where
inv-Ξ¨ : invertible Ξ¨
inv-Ψ = Ψ' , (Ψ'Ψ-id , ΨΨ'-id)
ll : is-equiv Ξ¦
ll = qinvs-are-equivs Ξ¦ inv-Ξ¦
where
inv-Ξ¦ : invertible Ξ¦
inv-Ξ¦ = Ξ¦' , (tofrom-Ξ£-οΌ , fromto-Ξ£-οΌ)
οΌ-to-Action-Iso-is-equiv : {π π : Action}
β is-equiv (οΌ-to-Action-Iso {π} {π})
οΌ-to-Action-Iso-is-equiv {π} {π} = equiv-closed-under-βΌ'
(prβ (Id-equiv-Action-Iso_prelim π π)) h
where
f = prβ (Id-equiv-Action-Iso π prelim π)
g = οΌ-to-Action-Iso
h : f βΌ g
h refl = refl
Id-equiv-Action-Iso : (π π : Action)
β (π οΌ π) β (Action-Iso π π)
Id-equiv-Action-Iso π π = οΌ-to-Action-Iso , οΌ-to-Action-Iso-is-equiv
\end{code}
A shorthand for the action structure. Convenient in function signature types.
\begin{code}
action-op-syntax : (G : Group π€) (π : Action G) β action-structure G β¨ π β©
action-op-syntax G π = action-op G π
syntax action-op-syntax G π g x = g ββ¨ G β£ π β© x
\end{code}
When explicitly expressed in terms of a group G, the type Action is
just that of G-Sets, so we also use this notation.
\begin{code}
_Sets : Group π€ β π€ βΊ Μ
G Sets = Action G
\end{code}
For a group homomorphism Ο : H β G the action pulls back, because it
is a functor from the one-object category G[1] to sets.
\begin{code}
action-pullback : {H G : Group π€}
β (f : β¨ H β© β β¨ G β©) β is-hom H G f
β G Sets β H Sets
action-pullback {H = H} {G} f i Ο = (action-carrier G Ο) ,
(Ξ» h x β (f h) Β· x) ,
(carrier-is-set G Ο) ,
((Ξ» h hβ β Ξ» x β (f (h Β·β¨ H β© hβ) Β· x οΌβ¨ ap (_Β· x) i β©
((f h) Β·β¨ G β© (f hβ)) Β· x οΌβ¨ action-assoc G Ο _ _ _ β©
(f h Β· (f hβ Β· x)) β )) ,
Ξ» x β (f (unit H) Β· x οΌβ¨ ap (_Β· x) p β©
unit G Β· x οΌβ¨ action-unit G Ο x β©
x β))
where
_Β·_ = action-op G Ο
p = homs-preserve-unit H G f i
\end{code}
TODO: The left adjoint, that is, the map H Sets β G Sets along the
homomorphism H β G. It uses the quotient module.