module Algebra.Group.Free whereFree groupsπ
We give a direct, higher-inductive constructor of the free group on a type of generators. While we allow the parameter to be any type, these are best behaved in the case where is a set; In this case, satisfies the expected universal property.
data Free-group (A : Type β) : Type β where
  inc : A β Free-group AThe higher-inductive presentation of free algebraic structures is very direct: There is no need to describe a set of words and then quotient by an appropriate (complicated) equivalence relation: we can define point constructors corresponding to the operations of a group, then add in the path constructors that make this into a group.
  _β_ : Free-group A β Free-group A β Free-group A
  inv : Free-group A β Free-group A
  nil : Free-group AWe postulate precisely the data that is needed by make-group. This is potentially more data
than is needed, but constructing maps out of Free-group is most conveniently done
using the universal property, and there, this redundancy doesnβt
matter.
  f-assoc : β x y z β x β (y β z) β‘ (x β y) β z
  f-invl : β x β inv x β x β‘ nil
  f-idl  : β x β nil β x β‘ x
  squash : is-set (Free-group A)We can package these constructors together to give a group with
underlying set Free-group. See what
was meant by βprecisely the data needed by make-groupβ?
Free-Group : Type β β Group β
Free-Group A = to-group fg where
  fg : make-group (Free-group A)
  fg .make-group.group-is-set = squash
  fg .make-group.unit = nil
  fg .make-group.mul = _β_
  fg .make-group.inv = inv
  fg .make-group.assoc = f-assoc
  fg .make-group.invl = f-invl
  fg .make-group.idl = f-idlThis lemma will be very useful later. It says that whenever you want
to prove a proposition by induction on Free-group, it suffices to address the
value constructors. This is because propositions automatically respect
(higher) path constructors.
Free-elim-prop
  : β {β} (B : Free-group A β Type β)
  β (β x β is-prop (B x))
  β (β x β B (inc x))
  β (β x β B x β β y β B y β B (x β y))
  β (β x β B x β B (inv x))
  β B nil
  β β x β B xThe proof of it is a direct (by which I mean repetitive) case analysis, so we let our reflection machinery handle it for us.
unquoteDef Free-elim-prop = make-elim-with (default-elim-visible into 1)
  Free-elim-prop (quote Free-group)Universal propertyπ
We now prove the universal property of Free-group, or, more specifically, of the
map inc: It gives a universal way of
mapping from the category of sets to an object in the category of
groups, in that any map from a set to (the underlying set of) a group
factors uniquely through inc. To
establish this result, we first implement a helper function, fold-free-group, which, given the data of
where to send the generators of a free group, determines a group
homomorphism.
fold-free-group
  : {A : Type β} {G : Group β}
  β (A β β G β) β Groups.Hom (Free-Group A) G
fold-free-group {A = A} {G = G , ggrp} map = total-hom go go-hom where
  module G = Group-on ggrpWhile it might seem that there are many cases to consider when
defining the function go, for most
of them, our hand is forced: For example, we must take multiplication in
the free group (the _β_
constructor) to multiplication in the codomain.
  go : Free-group A β β£ G β£
  go (inc x) = map x
  go (x β y) = go x G.β go y
  go (inv x) = go x G.β»ΒΉ
  go nil = G.unitSince _β_
is interpreted as multiplication in
itβs
associativity, identity and inverse laws that provide the cases for
Free-groupβs higher
constructors.
  go (f-assoc x y z i) = G.associative {x = go x} {y = go y} {z = go z} i
  go (f-invl x i) = G.inversel {x = go x} i
  go (f-idl x i) = G.idl {x = go x} i
  go (squash x y p q i j) =
    G.has-is-set (go x) (go y) (Ξ» i β go (p i)) (Ξ» i β go (q i)) i j
  open is-group-hom
  go-hom : is-group-hom _ _ go
  go-hom .pres-β x y = reflNow, given a set
we must come up with a group
with a map
(in
where
is the underlying set
functor), such that, for any other group
any map
can be factored uniquely as
As hinted above, we pick
the free group with
as its set of generators, and the universal map
is in fact inc.
make-free-group : β {β} (S : Set β) β Free-object GrpβͺSets S
make-free-group S .free = Free-Group β S β
make-free-group S .unit = inc
make-free-group S .fold = fold-free-group
make-free-group S .commute = refl
make-free-group S .unique {H} g p =
  ext $ Free-elim-prop _ (Ξ» _ β hlevel 1)
    (p #β_)
    (Ξ» a p b q β g.pres-β a b β apβ H._β_ p q)
    (Ξ» a p β g.pres-inv β ap H.inverse p)
    g.pres-id
  where
    module H = Group-on (H .snd)
    module g = is-group-hom (g .preserves)
module Free-groups {β} (S : Set β) = Free-object (make-free-group S)