ProCGroups.ReidemeisterSchreier.Discrete.Presentations.Relators.Operations
This module proves invariance and closure lemmas for changing relator sets, conjugating and cyclically rotating words, products of lists, and ordered finite products.
imports
- Mathlib.Tactic.Group
- ProCGroups.ReidemeisterSchreier.Discrete.Presentations.Relators.Basic
Imported by
- ProCGroups.ReidemeisterSchreier.Discrete.Presentations.Relators
- ProCGroups.ReidemeisterSchreier.Discrete.Presentations.Relators.Presentation
- ProCGroups.ReidemeisterSchreier.Discrete.Presentations.Tietze.RelatorQuotientMutualMapData
- ProCGroups.ReidemeisterSchreier.Discrete.ReidemeisterSchreier.Rewriting
theorem normalClosure_eq_of_relatorEquivalent
(hR_to_S : ∀ r ∈ R, RelatorEquivalent S r 1)
(hS_to_R : ∀ s ∈ S, RelatorEquivalent R s 1) :
Subgroup.normalClosure R = Subgroup.normalClosure SIf every relator on each side is trivial modulo the other side, the normal closures are equal.
Show Lean proof
by
apply le_antisymm
· refine Subgroup.normalClosure_le_normal ?_
intro r hr
exact RelatorEquivalent.mem_normalClosure_of_eq_one (hR_to_S r hr)
· refine Subgroup.normalClosure_le_normal ?_
intro s hs
exact RelatorEquivalent.mem_normalClosure_of_eq_one (hS_to_R s hs)
theorem normalClosure_insert_eq_of_mem
(hr : r ∈ Subgroup.normalClosure R) :
Subgroup.normalClosure (insert r R) = Subgroup.normalClosure RInserting an element already in the normal closure does not change the normal closure.
Show Lean proof
by
apply le_antisymm
· refine Subgroup.normalClosure_le_normal ?_
intro x hx
rcases hx with rfl | hx
· exact hr
· exact Subgroup.subset_normalClosure hx
· exact Subgroup.normalClosure_mono (by
intro x hx
exact Set.mem_insert_of_mem r hx)
theorem normalClosure_diff_singleton_eq_of_mem
(hr : r ∈ Subgroup.normalClosure (R \ {r})) :
Subgroup.normalClosure R = Subgroup.normalClosure (R \ {r})Removing a relator that already lies in the normal closure of the remaining relators does not change the normal closure.
Show Lean proof
by
apply le_antisymm
· refine Subgroup.normalClosure_le_normal ?_
intro x hx
by_cases hxr : x = r
· simpa [hxr] using hr
· exact Subgroup.subset_normalClosure ⟨hx, by simpa [Set.mem_singleton_iff] using hxr⟩
· exact Subgroup.normalClosure_mono (by
intro x hx
exact hx.1)
theorem normalClosure_eq_of_subset_normalClosure
(hR_to_S : R ⊆ Subgroup.normalClosure S)
(hS_to_R : S ⊆ Subgroup.normalClosure R) :
Subgroup.normalClosure R = Subgroup.normalClosure STwo relator normal closures are equal when each relator family is contained in the normal closure generated by the other.
Show Lean proof
by
apply le_antisymm
· exact Subgroup.normalClosure_le_normal hR_to_S
· exact Subgroup.normalClosure_le_normal hS_to_R
theorem conjugate_mem_normalClosure_of_mem
(hr : r ∈ R) (a : G) :
a * r * a⁻¹ ∈ Subgroup.normalClosure REvery conjugate of a relator belongs to the normal closure of the relator set.
Show Lean proof
by
simpa [mul_assoc] using
(Subgroup.normalClosure_normal.conj_mem r
(Subgroup.subset_normalClosure hr) a)
theorem conjugate_mem_normalClosure
(hr : r ∈ Subgroup.normalClosure R) (a : G) :
a * r * a⁻¹ ∈ Subgroup.normalClosure RA conjugate of a relator belongs to the normal closure of the relator set.
Show Lean proof
by
simpa [mul_assoc] using
(Subgroup.normalClosure_normal.conj_mem r hr a)
theorem cyclic_rotation_mem_normalClosure
(h : a * b ∈ Subgroup.normalClosure R) :
b * a ∈ Subgroup.normalClosure RCyclically rotating a relator keeps it in the same normal closure.
Show Lean proof
by
have hc := conjugate_mem_normalClosure (R := R) h b
simpa [mul_assoc] using hc
theorem mem_of_left_mul_mem_normalClosure
{a b : G}
(ha : a ∈ Subgroup.normalClosure R)
(hab : a * b ∈ Subgroup.normalClosure R) :
b ∈ Subgroup.normalClosure RIf left multiplication by a relator-normal-closure element gives membership, then the original element has the same membership property.
Show Lean proof
by
let N : Subgroup G := Subgroup.normalClosure R
have h : a⁻¹ * (a * b) ∈ N := N.mul_mem (N.inv_mem ha) hab
simpa [N, mul_assoc] using h
theorem cyclic_rotation_pow_mem_normalClosure
{a b : G} {n : ℕ}
(h : (a * b) ^ n ∈ Subgroup.normalClosure R) :
(b * a) ^ n ∈ Subgroup.normalClosure RA cyclic rotation of a power relator belongs to the normal closure of the original relator set.
Show Lean proof
by
let N : Subgroup G := Subgroup.normalClosure R
have hconj : b * ((a * b) ^ n) * b⁻¹ ∈ N := by
simpa [N, MulAut.conj_apply] using
(Subgroup.normalClosure_normal.conj_mem ((a * b) ^ n) h b)
have hpow : b * ((a * b) ^ n) * b⁻¹ = (b * a) ^ n := by
clear h hconj
induction n with
| zero =>
simp only [pow_zero, mul_one, mul_inv_cancel]
| succ n ih =>
rw [pow_succ, pow_succ, ← ih]
group
simpa [hpow] using hconj
theorem pow_mem_normalClosure_of_mul_inv_mem
{u v : G} {n : ℕ}
(huv : u * v⁻¹ ∈ Subgroup.normalClosure R)
(hv : v ^ n ∈ Subgroup.normalClosure R) :
u ^ n ∈ Subgroup.normalClosure RIf u and v are congruent modulo the normal closure and a power of v lies in it, then the same power of u lies in it.
Show Lean proof
by
let N : Subgroup G := Subgroup.normalClosure R
let q : G →* G ⧸ N := QuotientGroup.mk' N
have hq : q u = q v := by
exact
(QuotientGroup.eq_iff_div_mem (N := N) (x := u) (y := v)).2
(by simpa [N, div_eq_mul_inv] using huv)
have hqv : q (v ^ n) = 1 :=
(QuotientGroup.eq_one_iff (N := N) (v ^ n)).2 hv
have hqu : q (u ^ n) = 1 := by
rw [map_pow, hq, ← map_pow]
exact hqv
exact (QuotientGroup.eq_one_iff (N := N) (u ^ n)).1 hqu
theorem list_prod_mem_normalClosure
{l : List G}
(h : ∀ x ∈ l, x ∈ Subgroup.normalClosure R) :
l.prod ∈ Subgroup.normalClosure RThe product of a list of relators belongs to the normal closure of the relator set.
Show Lean proof
by
induction l with
| nil =>
simp only [List.prod_nil, one_mem]
| cons x xs ih =>
simp only [List.mem_cons] at h
exact Subgroup.mul_mem (Subgroup.normalClosure R)
(h x (Or.inl rfl))
(ih (by
intro y hy
exact h y (Or.inr hy)))
theorem list_prod_map_relatorEquivalent
{ι : Type*} (l : List ι) {f g : ι → G}
(h : ∀ i ∈ l, RelatorEquivalent R (f i) (g i)) :
RelatorEquivalent R (l.map f).prod (l.map g).prodMapping a list through relator-equivalent entries preserves relator equivalence of the product.
Show Lean proof
by
induction l with
| nil =>
exact RelatorEquivalent.refl R 1
| cons i is ih =>
simp only [List.mem_cons] at h
simpa using RelatorEquivalent.mul
(h i (Or.inl rfl))
(ih (by
intro j hj
exact h j (Or.inr hj)))
theorem list_prod_map_relatorEquivalent_one
{ι : Type*} (l : List ι) {f : ι → G}
(h : ∀ i ∈ l, RelatorEquivalent R (f i) 1) :
RelatorEquivalent R (l.map f).prod 1A list product is relator-equivalent to the identity when every mapped entry is relator-equivalent to the identity.
Show Lean proof
by
simpa using
list_prod_map_relatorEquivalent (R := R) l
(f := f) (g := fun _ => (1 : G)) h
theorem list_prod_map_inv_reverse (l : List G) :
(l.map Inv.inv).reverse.prod = l.prod⁻¹Mapping inversion over a list and then reversing it gives a product equal to the inverse product.
Show Lean proof
by
induction l with
| nil =>
simp only [List.map_nil, List.reverse_nil, List.prod_nil, inv_one]
| cons x xs ih =>
simp only [List.map_cons, List.reverse_cons, List.prod_append, ih, List.prod_cons,
List.prod_nil, mul_one,
mul_inv_rev]
theorem list_prod_reverse_map_inv (l : List G) :
(l.reverse.map Inv.inv).prod = l.prod⁻¹Reversing a list and then inverting its entries gives a product equal to the inverse product.
Show Lean proof
by
simpa [List.map_reverse] using list_prod_map_inv_reverse (G := G) l
theorem list_prod_reverse_inv_relatorEquivalent
{l m : List G}
(h : RelatorEquivalent R l.prod m.prod) :
RelatorEquivalent R (l.reverse.map Inv.inv).prod
(m.reverse.map Inv.inv).prodA list product is relator-equivalent to the inverse of the reversed inverse list product.
Show Lean proof
by
simpa [List.map_reverse, list_prod_map_inv_reverse] using
RelatorEquivalent.inv h
theorem list_prod_append_relatorEquivalent
{l₁ l₂ m₁ m₂ : List G}
(h₁ : RelatorEquivalent R l₁.prod m₁.prod)
(h₂ : RelatorEquivalent R l₂.prod m₂.prod) :
RelatorEquivalent R (l₁ ++ l₂).prod (m₁ ++ m₂).prodAppending relator-equivalent list products preserves relator equivalence.
Show Lean proof
by
simpa using RelatorEquivalent.mul h₁ h₂
theorem list_prod_append_left_relatorEquivalent
(l : List G) {m n : List G}
(h : RelatorEquivalent R m.prod n.prod) :
RelatorEquivalent R (l ++ m).prod (l ++ n).prodLeft-appending the same list product preserves relator equivalence.
Show Lean proof
by
exact list_prod_append_relatorEquivalent
(R := R) (l₁ := l) (l₂ := m) (m₁ := l) (m₂ := n)
(RelatorEquivalent.refl R l.prod) h
theorem list_prod_middle_eq_one_relatorEquivalent
(l m : List G) {u : G}
(h : RelatorEquivalent R u 1) :
RelatorEquivalent R (l ++ u :: m).prod (l ++ m).prodRemoving a middle subproduct equal to one preserves relator equivalence of the list product.
Show Lean proof
by
have htail :
RelatorEquivalent R (u :: m).prod m.prod := by
simpa using RelatorEquivalent.mul h (RelatorEquivalent.refl R m.prod)
simpa [List.singleton_append] using
list_prod_append_left_relatorEquivalent (R := R) l htail
theorem list_prod_middle_mul_inv_relatorEquivalent
(l m : List G) {u v : G}
(h : RelatorEquivalent R u v) :
RelatorEquivalent R (l ++ (u * v⁻¹) :: m).prod
(l ++ m).prodInserting or removing a middle product multiplied by its inverse preserves relator equivalence.
Show Lean proof
list_prod_middle_eq_one_relatorEquivalent (R := R) l m
(RelatorEquivalent.mul_inv_eq_one h)
theorem list_prod_append_rotate_mem_normalClosure
{l m : List G}
(h : (l ++ m).prod ∈ Subgroup.normalClosure R) :
(m ++ l).prod ∈ Subgroup.normalClosure RRotating an appended list product gives an element of the relator normal closure.
Show Lean proof
by
have hprod : l.prod * m.prod ∈ Subgroup.normalClosure R := by
simpa using h
have hrot :
m.prod * l.prod ∈ Subgroup.normalClosure R :=
cyclic_rotation_mem_normalClosure (R := R)
(a := l.prod) (b := m.prod) hprod
simpa using hrot
theorem list_prod_append_rotate_relatorEquivalent
{l m : List G}
(h : RelatorEquivalent R (l ++ m).prod 1) :
RelatorEquivalent R (m ++ l).prod 1A rotated append decomposition of a list product is relator-equivalent to the original product.
Show Lean proof
by
exact RelatorEquivalent.of_mem_normalClosure
(list_prod_append_rotate_mem_normalClosure (R := R)
(by simpa [RelatorEquivalent] using h))
theorem list_prod_take_drop_rotate_relatorEquivalent
(l : List G) (n : ℕ)
(h : RelatorEquivalent R l.prod 1) :
RelatorEquivalent R ((l.drop n) ++ (l.take n)).prod 1The take/drop rotation of a list product is relator-equivalent to the original product.
Show Lean proof
by
have hsplit :
RelatorEquivalent R ((l.take n) ++ (l.drop n)).prod 1 := by
simpa [List.take_append_drop] using h
exact list_prod_append_rotate_relatorEquivalent (R := R) hsplit
theorem list_prod_take_drop_rotate_mem_normalClosure
(l : List G) (n : ℕ)
(h : l.prod ∈ Subgroup.normalClosure R) :
((l.drop n) ++ (l.take n)).prod ∈ Subgroup.normalClosure RA take-drop rotation of a list product belongs to the relator normal closure.
Show Lean proof
RelatorEquivalent.mem_normalClosure_of_eq_one
(list_prod_take_drop_rotate_relatorEquivalent (R := R) l n
(RelatorEquivalent.of_mem_normalClosure (by simpa [RelatorEquivalent] using h)))
def orderedFinsetProduct (s : Finset ι) (f : ι → G) : G :=
((s.sort (· ≤ ·)).map f).prodA noncommutative product indexed by a finite set, with multiplication ordered by the ambient \(LinearOrder\).
theorem orderedFinsetProduct_mem_normalClosure
(s : Finset ι) {f : ι → G}
(h : ∀ i ∈ s, f i ∈ Subgroup.normalClosure R) :
orderedFinsetProduct s f ∈ Subgroup.normalClosure RAn ordered finite product of relators belongs to the normal closure of the relator set.
Show Lean proof
by
unfold orderedFinsetProduct
exact list_prod_mem_normalClosure (R := R) (by
intro x hx
rcases List.mem_map.1 hx with ⟨i, hi, rfl⟩
exact h i (by
exact (Finset.mem_sort (s := s) (r := fun a b : ι => a ≤ b)).1 hi))
theorem orderedFinsetProduct_relatorEquivalent
(s : Finset ι) {f g : ι → G}
(h : ∀ i ∈ s, RelatorEquivalent R (f i) (g i)) :
RelatorEquivalent R (orderedFinsetProduct s f)
(orderedFinsetProduct s g)Replacing each term of an ordered finite product by a relator-equivalent term preserves relator equivalence.
Show Lean proof
by
unfold orderedFinsetProduct
exact list_prod_map_relatorEquivalent (R := R) (s.sort (· ≤ ·))
(f := f) (g := g) (by
intro i hi
exact h i (by
exact (Finset.mem_sort (s := s) (r := fun a b : ι => a ≤ b)).1 hi))
theorem orderedFinsetProduct_relatorEquivalent_one
(s : Finset ι) {f : ι → G}
(h : ∀ i ∈ s, RelatorEquivalent R (f i) 1) :
RelatorEquivalent R (orderedFinsetProduct s f) 1An ordered finite product is relator-equivalent to the identity when every term is relator-equivalent to the identity.
Show Lean proof
by
unfold orderedFinsetProduct
simpa using
list_prod_map_relatorEquivalent_one (R := R) (s.sort (· ≤ ·))
(f := f) (by
intro i hi
exact h i (by
exact (Finset.mem_sort (s := s) (r := fun a b : ι => a ≤ b)).1 hi))
theorem orderedFinsetProduct_congr
(s : Finset ι) {f g : ι → G}
(h : ∀ i ∈ s, f i = g i) :
orderedFinsetProduct s f = orderedFinsetProduct s gPointwise equality on a finite index set gives equality of the corresponding ordered products.
Show Lean proof
by
unfold orderedFinsetProduct
congr 1
apply List.map_congr_left
intro i hi
exact h i ((Finset.mem_sort (s := s) (r := fun a b : ι => a ≤ b)).1 hi)