|
| 1 | +/- |
| 2 | +Copyright (c) 2019 Michael Howes. All rights reserved. |
| 3 | +Released under Apache 2.0 license as described in the file LICENSE. |
| 4 | +Authors: Michael Howes |
| 5 | +
|
| 6 | +! This file was ported from Lean 3 source module group_theory.presented_group |
| 7 | +! leanprover-community/mathlib commit d90e4e186f1d18e375dcd4e5b5f6364b01cb3e46 |
| 8 | +! Please do not edit these lines, except to modify the commit id |
| 9 | +! if you have ported upstream changes. |
| 10 | +-/ |
| 11 | +import Mathlib.GroupTheory.FreeGroup |
| 12 | +import Mathlib.GroupTheory.QuotientGroup |
| 13 | + |
| 14 | +/-! |
| 15 | +# Defining a group given by generators and relations |
| 16 | +
|
| 17 | +Given a subset `rels` of relations of the free group on a type `α`, this file constructs the group |
| 18 | +given by generators `x : α` and relations `r ∈ rels`. |
| 19 | +
|
| 20 | +## Main definitions |
| 21 | +
|
| 22 | +* `PresentedGroup rels`: the quotient group of the free group on a type `α` by a subset `rels` of |
| 23 | + relations of the free group on `α`. |
| 24 | +* `of`: The canonical map from `α` to a presented group with generators `α`. |
| 25 | +* `toGroup f`: the canonical group homomorphism `PresentedGroup rels → G`, given a function |
| 26 | + `f : α → G` from a type `α` to a group `G` which satisfies the relations `rels`. |
| 27 | +
|
| 28 | +## Tags |
| 29 | +
|
| 30 | +generators, relations, group presentations |
| 31 | +-/ |
| 32 | + |
| 33 | + |
| 34 | +variable {α : Type _} |
| 35 | + |
| 36 | +/-- Given a set of relations, `rels`, over a type `α`, `PresentedGroup` constructs the group with |
| 37 | +generators `x : α` and relations `rels` as a quotient of `FreeGroup α`. -/ |
| 38 | +def PresentedGroup (rels : Set (FreeGroup α)) := |
| 39 | + FreeGroup α ⧸ Subgroup.normalClosure rels |
| 40 | +#align presented_group PresentedGroup |
| 41 | + |
| 42 | +namespace PresentedGroup |
| 43 | + |
| 44 | +instance (rels : Set (FreeGroup α)) : Group (PresentedGroup rels) := |
| 45 | + QuotientGroup.Quotient.group _ |
| 46 | + |
| 47 | +/-- `of` is the canonical map from `α` to a presented group with generators `x : α`. The term `x` is |
| 48 | +mapped to the equivalence class of the image of `x` in `FreeGroup α`. -/ |
| 49 | +def of {rels : Set (FreeGroup α)} (x : α) : PresentedGroup rels := |
| 50 | + QuotientGroup.mk (FreeGroup.of x) |
| 51 | +#align presented_group.of PresentedGroup.of |
| 52 | + |
| 53 | +section ToGroup |
| 54 | + |
| 55 | +/- |
| 56 | +Presented groups satisfy a universal property. If `G` is a group and `f : α → G` is a map such that |
| 57 | +the images of `f` satisfy all the given relations, then `f` extends uniquely to a group homomorphism |
| 58 | +from `PresentedGroup rels` to `G`. |
| 59 | +-/ |
| 60 | +variable {G : Type _} [Group G] {f : α → G} {rels : Set (FreeGroup α)} |
| 61 | + |
| 62 | +-- mathport name: exprF |
| 63 | +local notation "F" => FreeGroup.lift f |
| 64 | + |
| 65 | +-- Porting note: `F` has been expanded, because `F r = 1` produces a sorry. |
| 66 | +variable (h : ∀ r ∈ rels, FreeGroup.lift f r = 1) |
| 67 | + |
| 68 | +theorem closure_rels_subset_ker : Subgroup.normalClosure rels ≤ MonoidHom.ker F := |
| 69 | + Subgroup.normalClosure_le_normal fun x w ↦ (MonoidHom.mem_ker _).2 (h x w) |
| 70 | +#align presented_group.closure_rels_subset_ker PresentedGroup.closure_rels_subset_ker |
| 71 | + |
| 72 | +theorem to_group_eq_one_of_mem_closure : ∀ x ∈ Subgroup.normalClosure rels, F x = 1 := |
| 73 | + fun _ w ↦ (MonoidHom.mem_ker _).1 <| closure_rels_subset_ker h w |
| 74 | +#align presented_group.to_group_eq_one_of_mem_closure PresentedGroup.to_group_eq_one_of_mem_closure |
| 75 | + |
| 76 | +/-- The extension of a map `f : α → G` that satisfies the given relations to a group homomorphism |
| 77 | +from `PresentedGroup rels → G`. -/ |
| 78 | +def toGroup : PresentedGroup rels →* G := |
| 79 | + QuotientGroup.lift (Subgroup.normalClosure rels) F (to_group_eq_one_of_mem_closure h) |
| 80 | +#align presented_group.to_group PresentedGroup.toGroup |
| 81 | + |
| 82 | +@[simp] |
| 83 | +theorem toGroup.of {x : α} : toGroup h (of x) = f x := |
| 84 | + FreeGroup.lift.of |
| 85 | +#align presented_group.to_group.of PresentedGroup.toGroup.of |
| 86 | + |
| 87 | +theorem toGroup.unique (g : PresentedGroup rels →* G) |
| 88 | + (hg : ∀ x : α, g (PresentedGroup.of x) = f x) : ∀ {x}, g x = toGroup h x := by |
| 89 | + intro x |
| 90 | + refine' QuotientGroup.induction_on x _ |
| 91 | + exact fun _ ↦ FreeGroup.lift.unique (g.comp (QuotientGroup.mk' _)) hg |
| 92 | +#align presented_group.to_group.unique PresentedGroup.toGroup.unique |
| 93 | + |
| 94 | +end ToGroup |
| 95 | + |
| 96 | +instance (rels : Set (FreeGroup α)) : Inhabited (PresentedGroup rels) := |
| 97 | + ⟨1⟩ |
| 98 | + |
| 99 | +end PresentedGroup |
0 commit comments