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 = Iso.injective 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 35 _β»ΒΉ
_β»ΒΉ : 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 2 group-str
The associativity and identity laws hold definitionally.
.assoc _ _ _ = trivial!
group-str .idl _ = trivial! 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) = ext (equivβunit eqv) group-str