Built with Alectryon. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
From HoTT Require Import Basics Types.From HoTT Require Import Basics Types.Require Import Truncations.Core.Require Import Algebra.Groups.Group.Require Import Algebra.Groups.FreeGroup.Require Import Algebra.Groups.GroupCoeq.Require Import Spaces.Finite Spaces.List.Core.From HoTT.WildCat Require Import Core Equiv Yoneda.LocalOpen Scope mc_scope.LocalOpen Scope mc_mult_scope.(** In this file we develop presentations of groups. *)(** The data of a group presentation *)RecordGroupPresentation := {
(** We have a type of generators *)
gp_generators : Type ;
(** An indexing type for relators *)
gp_rel_index : Type ;
(** The relators are picked out amongst elements of the free group on the generators. *)
gp_relators : gp_rel_index -> FreeGroup gp_generators;
}.(** Note: A relator is a relation in the form of "w = 1", any relation "w = v" can become a relator "wv^-1 = 1" for words v and w. *)(** Given the data of a group presentation we can construct the group. This is sometimes called the presented group. *)
GroupPresentation -> Group
GroupPresentation -> Group
X, I: Type R: I -> FreeGroup X
Group
exact (GroupCoeq
(FreeGroup_rec R)
(FreeGroup_rec (funx => @group_unit (FreeGroup X)))).Defined.(** A group [G] has a presentation if there exists a group presentation whose presented group is isomorphic to [G]. *)ClassHasPresentation (G : Group) := {
presentation : GroupPresentation;
grp_iso_presentation : GroupIsomorphism (group_gp presentation) G;
}.Coercionpresentation : HasPresentation >-> GroupPresentation.(** Here are a few finiteness properties of group presentations. *)(** A group presentation is finitely generated if its generating set is finite. *)ClassFinitelyGeneratedPresentation (P : GroupPresentation)
:= finite_gp_generators : Finite (gp_generators P).(** A group presentation is finitely related if its relators indexing set is finite. *)ClassFinitelyRelatedPresentation (P : GroupPresentation)
:= finite_gp_relators : Finite (gp_rel_index P).(** A group presentation is a finite presentation if it is finitely generated and related. *)ClassFinitePresentation (P : GroupPresentation) := {
fp_generators : FinitelyGeneratedPresentation P;
fp_relators : FinitelyRelatedPresentation P;
}.(** These directly translate into properties of groups. *)(** A group is finitely generated if it has a finitely generated presentation. *)ClassIsFinitelyGenerated (G : Group) := {
fg_presentation : HasPresentation G;
fg_presentation_fg : FinitelyGeneratedPresentation fg_presentation;
}.(** A group is finitely related if it has a finitely related presentation. *)ClassIsFinitelyRelated (G : Group) := {
fr_presentation : HasPresentation G;
fr_presentation_fr : FinitelyRelatedPresentation fr_presentation;
}.ClassIsFinitelyPresented (G : Group) := {
fp_presentation : HasPresentation G;
fp_presentation_fp : FinitePresentation fp_presentation;
}.(** ** Fundamental theorem of presentations of groups *)(** A group homomorphism from a presented group is determined with how the underlying map acts on generators subject to the condition that relators are sent to the unit. *)
funext: Funext G: Group P: HasPresentation G H: Group
{f : gp_generators P -> H &
forallr : gp_rel_index P, FreeGroup_rec f (gp_relators P r) = group_unit} <~>
GroupHomomorphism G H
funext: Funext G: Group P: HasPresentation G H: Group
{f : gp_generators P -> H &
forallr : gp_rel_index P, FreeGroup_rec f (gp_relators P r) = group_unit} <~>
GroupHomomorphism G H
funext: Funext G: Group P: HasPresentation G H: Group
{f : gp_generators P -> H &
forallr : gp_rel_index P, FreeGroup_rec f (gp_relators P r) = group_unit} <~>
(group_gp P $-> H)
funext: Funext G: Group P: HasPresentation G H: Group
{f : gp_generators P -> H &
forallr : gp_rel_index P, FreeGroup_rec f (gp_relators P r) = group_unit} <~>
{h : FreeGroup (gp_generators P) $-> H &
h $o FreeGroup_rec (gp_relators P) $==
h $o FreeGroup_rec (fun_ : gp_rel_index P => group_unit)}
funext: Funext G: Group P: HasPresentation G H: Group
Type
funext: Funext G: Group P: HasPresentation G H: Group
?A <~> (FreeGroup (gp_generators P) $-> H)
funext: Funext G: Group P: HasPresentation G H: Group
{f : gp_generators P -> H &
forallr : gp_rel_index P, FreeGroup_rec f (gp_relators P r) = group_unit} <~>
{x : _ &
((funh : FreeGroup (gp_generators P) $-> H =>
h $o FreeGroup_rec (gp_relators P) $==
h $o FreeGroup_rec (fun_ : gp_rel_index P => group_unit))
o ?f) x}
funext: Funext G: Group P: HasPresentation G H: Group
{f : gp_generators P -> H &
forallr : gp_rel_index P, FreeGroup_rec f (gp_relators P r) = group_unit} <~>
{x : _ &
((funh : FreeGroup (gp_generators P) $-> H =>
h $o FreeGroup_rec (gp_relators P) $==
h $o FreeGroup_rec (fun_ : gp_rel_index P => group_unit))
o equiv_freegroup_rec H (gp_generators P)) x}
funext: Funext G: Group P: HasPresentation G H: Group
foralla : gp_generators P -> H,
(forallr : gp_rel_index P, FreeGroup_rec a (gp_relators P r) = group_unit) <~>
equiv_freegroup_rec H (gp_generators P) a $o FreeGroup_rec (gp_relators P) $==
equiv_freegroup_rec H (gp_generators P) a $o
FreeGroup_rec (fun_ : gp_rel_index P => group_unit)
funext: Funext G: Group P: HasPresentation G H: Group f: gp_generators P -> H
(forallr : gp_rel_index P, FreeGroup_rec f (gp_relators P r) = group_unit) <~>
equiv_freegroup_rec H (gp_generators P) f $o FreeGroup_rec (gp_relators P) $==
equiv_freegroup_rec H (gp_generators P) f $o
FreeGroup_rec (fun_ : gp_rel_index P => group_unit)
funext: Funext G: Group P: HasPresentation G H: Group f: gp_generators P -> H
(forallr : gp_rel_index P, FreeGroup_rec f (gp_relators P r) = group_unit) ->
equiv_freegroup_rec H (gp_generators P) f $o FreeGroup_rec (gp_relators P) $==
equiv_freegroup_rec H (gp_generators P) f $o
FreeGroup_rec (fun_ : gp_rel_index P => group_unit)
funext: Funext G: Group P: HasPresentation G H: Group f: gp_generators P -> H
equiv_freegroup_rec H (gp_generators P) f $o FreeGroup_rec (gp_relators P) $==
equiv_freegroup_rec H (gp_generators P) f $o
FreeGroup_rec (fun_ : gp_rel_index P => group_unit) ->
forallr : gp_rel_index P, FreeGroup_rec f (gp_relators P r) = group_unit
funext: Funext G: Group P: HasPresentation G H: Group f: gp_generators P -> H
(forallr : gp_rel_index P, FreeGroup_rec f (gp_relators P r) = group_unit) ->
equiv_freegroup_rec H (gp_generators P) f $o FreeGroup_rec (gp_relators P) $==
equiv_freegroup_rec H (gp_generators P) f $o
FreeGroup_rec (fun_ : gp_rel_index P => group_unit)
funext: Funext G: Group P: HasPresentation G H: Group f: gp_generators P -> H p: forallr : gp_rel_index P, FreeGroup_rec f (gp_relators P r) = group_unit
equiv_freegroup_rec H (gp_generators P) f $o FreeGroup_rec (gp_relators P) $==
equiv_freegroup_rec H (gp_generators P) f $o
FreeGroup_rec (fun_ : gp_rel_index P => group_unit)
funext: Funext G: Group P: HasPresentation G H: Group f: gp_generators P -> H p: forallr : gp_rel_index P, FreeGroup_rec f (gp_relators P r) = group_unit
equiv_freegroup_rec H (gp_generators P) f $o FreeGroup_rec (gp_relators P) $==
equiv_freegroup_rec H (gp_generators P) f $o
FreeGroup_rec (fun_ : gp_rel_index P => group_unit)
funext: Funext G: Group P: HasPresentation G H: Group f: gp_generators P -> H p: forallr : gp_rel_index P, FreeGroup_rec f (gp_relators P r) = group_unit
forallx : gp_rel_index P,
(equiv_freegroup_rec H (gp_generators P) f $o FreeGroup_rec (gp_relators P))
(freegroup_in x) =
(equiv_freegroup_rec H (gp_generators P) f $o
FreeGroup_rec (fun_ : gp_rel_index P => group_unit))
(freegroup_in x)
exact p.
funext: Funext G: Group P: HasPresentation G H: Group f: gp_generators P -> H
equiv_freegroup_rec H (gp_generators P) f $o FreeGroup_rec (gp_relators P) $==
equiv_freegroup_rec H (gp_generators P) f $o
FreeGroup_rec (fun_ : gp_rel_index P => group_unit) ->
forallr : gp_rel_index P, FreeGroup_rec f (gp_relators P r) = group_unit
funext: Funext G: Group P: HasPresentation G H: Group f: gp_generators P -> H p: equiv_freegroup_rec H (gp_generators P) f $o FreeGroup_rec (gp_relators P) $==
equiv_freegroup_rec H (gp_generators P) f $o
FreeGroup_rec (fun_ : gp_rel_index P => group_unit) r: gp_rel_index P
FreeGroup_rec f (gp_relators P r) = group_unit
funext: Funext G: Group P: HasPresentation G H: Group f: gp_generators P -> H p: forallx : FreeGroup (gp_rel_index P),
(equiv_freegroup_rec H (gp_generators P) f $o FreeGroup_rec (gp_relators P))
x =
(equiv_freegroup_rec H (gp_generators P) f $o
FreeGroup_rec (fun_ : gp_rel_index P => group_unit)) x r: gp_rel_index P
FreeGroup_rec f (gp_relators P r) = group_unit
exact (p (freegroup_in r)).Defined.(** ** Constructors for finite presentations *)
n, m: nat f: FinSeq m (FreeGroup (Fin n))
GroupPresentation
n, m: nat f: FinSeq m (FreeGroup (Fin n))
GroupPresentation
n, m: nat f: FinSeq m (FreeGroup (Fin n))
Type
n, m: nat f: FinSeq m (FreeGroup (Fin n))
Type
n, m: nat f: FinSeq m (FreeGroup (Fin n))
?gp_rel_index -> FreeGroup ?gp_generators
n, m: nat f: FinSeq m (FreeGroup (Fin n))
Type
exact (Fin n).
n, m: nat f: FinSeq m (FreeGroup (Fin n))
Type
exact (Fin m).
n, m: nat f: FinSeq m (FreeGroup (Fin n))
Fin m -> FreeGroup (Fin n)
exact f.Defined.
n, m: nat f: FinSeq m (FreeGroup (Fin n))
FinitelyGeneratedPresentation (Build_Finite_GroupPresentation n m f)
n, m: nat f: FinSeq m (FreeGroup (Fin n))
FinitelyGeneratedPresentation (Build_Finite_GroupPresentation n m f)
n, m: nat f: FinSeq m (FreeGroup (Fin n))
nat
n, m: nat f: FinSeq m (FreeGroup (Fin n))
merely (gp_generators (Build_Finite_GroupPresentation n m f) <~> Fin ?fcard)
2: simpl; apply tr; reflexivity.Defined.
n, m: nat f: FinSeq m (FreeGroup (Fin n))
FinitelyRelatedPresentation (Build_Finite_GroupPresentation n m f)
n, m: nat f: FinSeq m (FreeGroup (Fin n))
FinitelyRelatedPresentation (Build_Finite_GroupPresentation n m f)
n, m: nat f: FinSeq m (FreeGroup (Fin n))
nat
n, m: nat f: FinSeq m (FreeGroup (Fin n))
merely (gp_rel_index (Build_Finite_GroupPresentation n m f) <~> Fin ?fcard)
2: simpl; apply tr; reflexivity.Defined.(** ** Notations for presentations *)(** Convenient abbreviation when defining notations. *)Local Notationff := (freegroup_in o fin_nat).(** TODO: I haven't worked out how to generalize to any number of binders, so we explicitly list the first few levels. *)LocalOpen Scope nat_scope.(** One generator *)Notation"⟨ x | F , .. , G ⟩" :=
(Build_Finite_GroupPresentation 1 _
(fscons ((fun (x : FreeGroup (Fin 1))
=> F : FreeGroup (Fin _)) (ff 0%nat))
.. (fscons ((fun (x : FreeGroup (Fin 1))
=> G : FreeGroup (Fin _)) (ff 0)) fsnil) ..))
(at level200, x binder).(** Two generators *)Notation"⟨ x , y | F , .. , G ⟩" :=
(Build_Finite_GroupPresentation 2 _
(fscons ((fun (xy : FreeGroup (Fin 2))
=> F : FreeGroup (Fin _)) (ff 0) (ff 1))
.. (fscons ((fun (xy : FreeGroup (Fin 2))
=> G : FreeGroup (Fin _)) (ff 0) (ff 1)) fsnil) ..))
(at level200, x binder, y binder).(** Three generators *)Notation"⟨ x , y , z | F , .. , G ⟩" :=
(Build_Finite_GroupPresentation 3 _
(fscons ((fun (xyz : FreeGroup (Fin 3))
=> F : FreeGroup (Fin _)) (ff 0) (ff 1) (ff 2))
.. (fscons ((fun (xyz : FreeGroup (Fin 3))
=> G : FreeGroup (Fin _)) (ff 0) (ff 1) (ff 2)) fsnil) ..))
(at level200, x binder, y binder, z binder).