module Algebra.Group where
Groupsπ
A group is a monoid that has inverses for every element. The inverse for an element is necessarily, unique; Thus, to say that β is a groupβ is a statement about having a certain property (namely, being a group), not structure on .
Furthermore, since group homomorphisms
automatically
preserve this structure, we are justified in calling this
property rather than property-like structure.
In particular, for a binary operator to be a group operator, it has
to be a monoid
, meaning it must have a
unit
.
record is-group {β} {A : Type β} (_*_ : A β A β A) : Type β where
no-eta-equality
field
: A unit
There is also a map which assigns to each element
its inverse
,
and this inverse must multiply with
to give the unit, both on the left and on the right:
: A β A
inverse
: is-monoid unit _*_
has-is-monoid : {x : A} β inverse x * x β‘ unit
inversel : {x : A} β x * inverse x β‘ unit
inverser
open is-monoid has-is-monoid public
Note that any element of determines two bijections on the underlying set of , by multiplication with on the left and on the right. The inverse of this bijection is given by multiplication with , and the proof that these are in fact inverse functions are given by the group laws:
: β x β is-equiv (x *_)
β-equivl = is-isoβis-equiv (iso (inverse x *_)
β-equivl x (Ξ» _ β cancell inverser) Ξ» _ β cancell inversel)
: β y β is-equiv (_* y)
β-equivr = is-isoβis-equiv (iso (_* inverse y)
β-equivr y (Ξ» _ β cancelr inversel) Ξ» _ β cancelr inverser)
is-group is propositionalπ
Showing that is-group
takes
values in propositions is straightforward, but, fortunately, very easy
to automate: Our automation takes care of all the propositional
components, and weβve already established that units and inverses (thus
inverse-assigning maps) are unique in a monoid.
private unquoteDecl eqv = declare-record-iso eqv (quote is-group)
: β {β} {A : Type β} {_*_ : A β A β A}
is-group-is-prop β is-prop (is-group _*_)
{A = A} x y = Equiv.injective (IsoβEquiv eqv) $
is-group-is-prop
1x=1y(Ξ» a β
,β funext .has-is-monoid a _ _
monoid-inverse-unique x.inversel
x(y.inverser β sym 1x=1y))
,β prop!where
module x = is-group x
module y = is-group y hiding (magma-hlevel)
: β {n} β H-Level A (2 + n)
A-hl = basic-instance {T = A} 2 (x .is-group.has-is-set)
A-hl = identities-equal _ _
1x=1y (is-monoidβis-unital-magma x.has-is-monoid)
(is-monoidβis-unital-magma y.has-is-monoid)
instance
H-Level-is-group: β {β} {G : Type β} {_+_ : G β G β G} {n}
β H-Level (is-group _+_) (suc n)
= prop-instance is-group-is-prop H-Level-is-group
Group homomorphismsπ
In contrast with monoid homomorphisms, for group homomorphisms, it is not necessary for the underlying map to explicitly preserve the unit (and the inverses); It is sufficient for the map to preserve the multiplication.
As a stepping stone, we define what it means to equip a type with a
group structure: a group structure on
a type.
record Group-on {β} (A : Type β) : Type β where
field
_β_ : A β A β A
: is-group _β_
has-is-group
infixr 20 _β_
infixl 30 _β»ΒΉ
_β»ΒΉ : A β A
= has-is-group .is-group.inverse x
x β»ΒΉ
open is-group has-is-group public
We have that a map is a group homomorphism
if it preserves the multiplication
.
record
is-group-hom{β β'} {A : Type β} {B : Type β'}
(G : Group-on A) (G' : Group-on B) (e : A β B) : Type (β β β') where
private
module A = Group-on G
module B = Group-on G'
field
: (x y : A) β e (x A.β y) β‘ e x B.β e y pres-β
A tedious calculation shows that this is sufficient to preserve the identity:
private
= A.unit
1A = B.unit
1B
: e 1A β‘ 1B
pres-id =
pres-id .idr β©
e 1A β‘β¨ sym B.β β 1B β β‘Λβ¨ apΒ‘ B.inverser β©
e 1A B.β (e 1A B.β e 1A) β‘β¨ B.associative β©
e 1A B.β e 1A β B.β e 1A β‘β¨ ap! (sym (pres-β _ _) β ap e A.idl) β©
β e 1A B.β e 1A β‘β¨ B.inverser β©
e 1A B
1B β
: β {x} β e (A.inverse x) β‘ B.inverse (e x)
pres-inv {x} =
pres-inv .has-is-monoid (e x) _ _
monoid-inverse-unique B(sym (pres-β _ _) Β·Β· ap e A.inversel Β·Β· pres-id)
.inverser
B
: β {x y} β e (x A.β y) β‘ e x B.β e y
pres-diff {x} {y} =
pres-diff (x A.β y) β‘β¨ pres-β _ _ β©
e .β β e (A.inverse y) β β‘β¨ ap! pres-inv β©
e x B.β e y β e x B
An equivalence
is
an equivalence of groups when its underlying map is a group
homomorphism.
Groupβ: β {β} (A B : Ξ£ (Type β) Group-on) (e : A .fst β B .fst) β Type β
(f , _) = is-group-hom (A .snd) (B .snd) f
Groupβ A B
_β_] : β {β} (A B : Ξ£ (Type β) Group-on) β Type β
Group[= Ξ£ (A .fst β B .fst) (is-group-hom (A .snd) (B .snd)) Group[ A β B ]
Making groupsπ
Since the interface of Group-on
is very deeply nested, we introduce a helper function for arranging the
data of a group into a record.
record make-group {β} (G : Type β) : Type β where
no-eta-equality
field
: is-set G
group-is-set : G
unit : G β G β G
mul : G β G
inv
: β x y z β mul x (mul y z) β‘ mul (mul x y) z
assoc : β x β mul (inv x) x β‘ unit
invl : β x β mul unit x β‘ x
idl
private
: β x β mul x (inv x) β‘ unit
inverser =
inverser x (inv x) β‘Λβ¨ idl _ β©
mul x (mul x (inv x)) β‘Λβ¨ apβ mul (invl _) refl β©
mul unit (mul (inv (inv x)) (inv x)) (mul x (inv x)) β‘Λβ¨ assoc _ _ _ β©
mul (inv (inv x)) (mul (inv x) (mul x (inv x))) β‘β¨ apβ mul refl (assoc _ _ _) β©
mul (inv (inv x)) (mul (mul (inv x) x) (inv x)) β‘β¨ apβ mul refl (apβ mul (invl _) refl) β©
mul (inv (inv x)) (mul unit (inv x)) β‘β¨ apβ mul refl (idl _) β©
mul (inv (inv x)) (inv x) β‘β¨ invl _ β©
mul
unit β
: Group-on G
to-group-on .Group-on._β_ = mul
to-group-on .Group-on.has-is-group .is-group.unit = unit
to-group-on .Group-on.has-is-group .is-group.inverse = inv
to-group-on .Group-on.has-is-group .is-group.inversel = invl _
to-group-on .Group-on.has-is-group .is-group.inverser = inverser _
to-group-on .Group-on.has-is-group .is-group.has-is-monoid .is-monoid.idl {x} = idl x
to-group-on .Group-on.has-is-group .is-group.has-is-monoid .is-monoid.idr {x} =
to-group-on (invl x) β©
mul x β unit β β‘Λβ¨ apΒ‘ (mul (inv x) x) β‘β¨ assoc _ _ _ β©
mul x (inv x) β x β‘β¨ ap! (inverser x) β©
mul β mul x
mul unit x β‘β¨ idl x β©
x β.Group-on.has-is-group .is-group.has-is-monoid .has-is-semigroup =
to-group-on record { has-is-magma = record { has-is-set = group-is-set }
; associative = Ξ» {x y z} β assoc x y z
}
open make-group using (to-group-on) public
Symmetric groupsπ
If is a set, then the type of all bijections is also a set, and it forms the carrier for a group: The symmetric group on .
: β {β} (X : Set β) β Group-on (β£ X β£ β β£ X β£)
Sym = to-group-on group-str where
Sym X open make-group
: make-group (β£ X β£ β β£ X β£)
group-str .mul g f = f βe g group-str
The group operation is composition of equivalences
; The identity element
is the identity equivalence
.
.unit = id , id-equiv group-str
This type is a set because
is a set (because
is a set by assumption), and being an equivalence is a proposition
.
.group-is-set = hlevel! group-str
The associativity and identity laws hold definitionally.
.assoc _ _ _ = Ξ£-prop-path is-equiv-is-prop refl
group-str .idl _ = Ξ£-prop-path is-equiv-is-prop refl group-str
The inverse is given by the inverse equivalence
, and the inverse
equations hold by the fact that the inverse of an equivalence is both a
section and a retraction.
.inv = _eβ»ΒΉ
group-str .invl (f , eqv) =
group-str (funext (equivβunit eqv)) Ξ£-prop-path is-equiv-is-prop