ProCGroups.ReidemeisterSchreier.Discrete.ReidemeisterSchreier.FiniteQuotient.CleanedSymbols
This module separates degenerate Schreier symbols from genuine generators and sets up the relator families needed to delete the trivial generators from the finite-quotient presentation.
imports
omit [DecidableEq X] in
def IsDegenerateSchreierSymbol (z : FiniteSchreierSymbol X Q) : Prop :=
D.quotientSection (D.transition z.1 z.2) =
D.quotientSection z.1 * FreeGroup.of z.2Predicate saying that a finite Schreier symbol is degenerate and should be deleted from the cleaned presentation.
omit [DecidableEq X] in
def degenerateSchreierRelators :
Set (FreeGroup (FiniteSchreierSymbol X Q)) :=
{ q | ∃ s : Q, ∃ x : X,
D.quotientSection (D.transition s x) = D.quotientSection s * FreeGroup.of x ∧
q = FreeGroup.of (s, x) }The set of degenerate finite-quotient Schreier relators killed when deleting degenerate symbols.
def presentationRelators (R : Set (FreeGroup X)) :
Set (FreeGroup (FiniteSchreierSymbol X Q)) :=
D.schreierRelators R ∪ D.degenerateSchreierRelatorsThe finite-quotient presentation relators are the Schreier relators together with the degenerate Schreier-generator relators.
omit [DecidableEq X] in
abbrev NondegenerateSchreierSymbol :=
Presented.GeneratorPartition.Kept D.IsDegenerateSchreierSymbolThe type of finite Schreier symbols kept after deleting degenerate symbols.
omit [DecidableEq X] in
abbrev DegenerateSchreierSymbol :=
Presented.GeneratorPartition.Deleted D.IsDegenerateSchreierSymbolThe type of finite Schreier symbols marked for deletion as degenerate.
omit [DecidableEq X] in
theorem trivialGeneratorRelatorsOfPredicate_isDegenerateSchreierSymbol
[DecidablePred D.IsDegenerateSchreierSymbol] :
Presented.trivialGeneratorRelatorsOfPredicate D.IsDegenerateSchreierSymbol =
D.degenerateSchreierRelatorsThe trivial-generator relators selected by the degeneracy predicate are exactly the degenerate Schreier relators.
Show Lean proof
by
ext q
constructor
· intro hq
rcases hq with ⟨p, hp, hpq⟩
rcases hp with ⟨y, rfl⟩
rcases y with ⟨⟨s, x⟩, hy⟩
refine ⟨s, x, hy, ?_⟩
rw [← hpq]
simp only [FreeGroup.freeGroupCongr, MulEquiv.symm_mk, MulEquiv.coe_mk, Equiv.coe_fn_symm_mk,
FreeGroup.map.of, Presented.GeneratorPartition.equiv_symm_inr]
· rintro ⟨s, x, hdeg, rfl⟩
refine ⟨FreeGroup.of (Sum.inr
(⟨(s, x), hdeg⟩ : D.DegenerateSchreierSymbol)), ?_, ?_⟩
· exact ⟨⟨(s, x), hdeg⟩, rfl⟩
· simp only [FreeGroup.freeGroupCongr, MulEquiv.symm_mk, MulEquiv.coe_mk, Equiv.coe_fn_symm_mk,
FreeGroup.map.of, Presented.GeneratorPartition.equiv_symm_inr]
theorem relatorsWithTrivialGeneratorsOfPredicate_isDegenerateSchreierSymbol
(R : Set (FreeGroup X))
[DecidablePred D.IsDegenerateSchreierSymbol] :
Presented.relatorsWithTrivialGeneratorsOfPredicate
(D.schreierRelators R) D.IsDegenerateSchreierSymbol =
D.presentationRelators RAdding trivial-generator relators for degenerate Schreier symbols gives the presentation relators.
Show Lean proof
by
change D.schreierRelators R ∪
Presented.trivialGeneratorRelatorsOfPredicate D.IsDegenerateSchreierSymbol =
D.schreierRelators R ∪ D.degenerateSchreierRelators
rw [D.trivialGeneratorRelatorsOfPredicate_isDegenerateSchreierSymbol]
def presentationRelatorsAfterDeletingDegenerateSchreierGenerators
(R : Set (FreeGroup X))
[DecidablePred D.IsDegenerateSchreierSymbol] :
Set (FreeGroup D.NondegenerateSchreierSymbol) :=
Presented.relatorsAfterDeletingTrivialGeneratorsOfPredicate
(D.schreierRelators R) D.IsDegenerateSchreierSymbolThe raw finite Reidemeister--Schreier relators after deleting the degenerate Schreier generators with relators \(s(q,x)=1\).
def deleteDegenerateSchreierGeneratorsScript
(R : Set (FreeGroup X))
[DecidablePred D.IsDegenerateSchreierSymbol] :
VerifiedTietzeScript
(Presentation.ofRelators (D.presentationRelators R))
(Presentation.ofRelators
(D.presentationRelatorsAfterDeletingDegenerateSchreierGenerators R)) := by
let hRelators :=
D.relatorsWithTrivialGeneratorsOfPredicate_isDegenerateSchreierSymbol R
exact
(VerifiedTietzeScript.replaceRelators
(fun r hr => RelatorEquivalent.of_mem (by simpa only [hRelators] using hr))
(fun r hr => RelatorEquivalent.of_mem (by simpa only [hRelators] using hr))).trans
(VerifiedTietzeScript.deleteTrivialGeneratorsOfPredicate
(D.schreierRelators R) D.IsDegenerateSchreierSymbol)Deleting degenerate finite Schreier generators gives a Tietze equivalence with the cleaned presentation.
theorem deleteDegenerateSchreierGeneratorsScript_trace
(R : Set (FreeGroup X))
[DecidablePred D.IsDegenerateSchreierSymbol] :
(D.deleteDegenerateSchreierGeneratorsScript R).trace =
[ElementaryTietzeMove.Kind.replaceRelators,
ElementaryTietzeMove.Kind.deleteTrivialGenerators]The cleaned-symbol construction first identifies the proved-equal relator families and then performs one indexed generator-deletion move. This theorem makes the maintained concrete consumer visible to trace and cost clients.
Show Lean proof
by
simp [deleteDegenerateSchreierGeneratorsScript,
VerifiedTietzeScript.replaceRelators,
VerifiedTietzeScript.deleteTrivialGeneratorsOfPredicate,
VerifiedTietzeScript.deleteTrivialGeneratorsAlongEquiv,
VerifiedTietzeScript.singleton, VerifiedTietzeScript.trans,
VerifiedTietzeScript.trace,
ElementaryTietzeMove.kind]
theorem deleteDegenerateSchreierGeneratorsScript_cost
(R : Set (FreeGroup X))
[DecidablePred D.IsDegenerateSchreierSymbol]
(weight : ElementaryTietzeMove.Kind → ℕ) :
(D.deleteDegenerateSchreierGeneratorsScript R).cost weight =
weight ElementaryTietzeMove.Kind.replaceRelators +
weight ElementaryTietzeMove.Kind.deleteTrivialGeneratorsThe deletion script's weighted cost is the cost of replacing relators plus the weighted cost of deleting each degenerate Schreier generator.
Show Lean proof
by
simp [deleteDegenerateSchreierGeneratorsScript,
VerifiedTietzeScript.replaceRelators,
VerifiedTietzeScript.deleteTrivialGeneratorsOfPredicate,
VerifiedTietzeScript.deleteTrivialGeneratorsAlongEquiv,
VerifiedTietzeScript.singleton, VerifiedTietzeScript.trans,
VerifiedTietzeScript.cost,
VerifiedTietzeScript.trace, ElementaryTietzeMove.kind]
noncomputable def deleteDegenerateSchreierGenerators
(R : Set (FreeGroup X))
[DecidablePred D.IsDegenerateSchreierSymbol] :
PresentedGroup (D.presentationRelators R) ≃*
PresentedGroup
(D.presentationRelatorsAfterDeletingDegenerateSchreierGenerators R) :=
(D.deleteDegenerateSchreierGeneratorsScript R).toCertificate.presentedEquivDeleting degenerate finite Schreier generators produces the cleaned presentation on nondegenerate Schreier symbols.
def deleteDegenerateSchreierGeneratorHom
[DecidablePred D.IsDegenerateSchreierSymbol] :
FreeGroup (FiniteSchreierSymbol X Q) →*
FreeGroup D.NondegenerateSchreierSymbol :=
(Presented.trivializeGeneratorsHom
D.NondegenerateSchreierSymbol D.DegenerateSchreierSymbol).comp
(FreeGroup.freeGroupCongr
(Presented.GeneratorPartition.equiv D.IsDegenerateSchreierSymbol))The homomorphism that deletes degenerate finite Schreier generators. A nondegenerate generator is kept, and a degenerate generator is sent to \(1\).
omit [DecidableEq X] in
@[simp]
theorem deleteDegenerateSchreierGeneratorHom_of_not_degenerate
[DecidablePred D.IsDegenerateSchreierSymbol]
{z : FiniteSchreierSymbol X Q} (hz : ¬ D.IsDegenerateSchreierSymbol z) :
D.deleteDegenerateSchreierGeneratorHom (FreeGroup.of z) =
FreeGroup.of (⟨z, hz⟩ : D.NondegenerateSchreierSymbol)The generator-deletion homomorphism sends a nondegenerate finite Schreier generator to the corresponding nondegenerate generator.
Show Lean proof
by
simp only [deleteDegenerateSchreierGeneratorHom, MonoidHom.coe_comp, MonoidHom.coe_coe,
Function.comp_apply,
FreeGroup.freeGroupCongr_apply, FreeGroup.map.of,
Presented.GeneratorPartition.equiv_apply_of_not_delete D.IsDegenerateSchreierSymbol hz]
exact Presented.trivializeGeneratorsHom_inl
(X := D.NondegenerateSchreierSymbol)
(Y := D.DegenerateSchreierSymbol)
(⟨z, hz⟩ : D.NondegenerateSchreierSymbol)
omit [DecidableEq X] in
@[simp]
theorem deleteDegenerateSchreierGeneratorHom_of_degenerate
[DecidablePred D.IsDegenerateSchreierSymbol]
{z : FiniteSchreierSymbol X Q} (hz : D.IsDegenerateSchreierSymbol z) :
D.deleteDegenerateSchreierGeneratorHom (FreeGroup.of z) = 1The generator-deletion homomorphism sends a degenerate finite Schreier generator to the identity.
Show Lean proof
by
simp only [deleteDegenerateSchreierGeneratorHom, MonoidHom.coe_comp, MonoidHom.coe_coe,
Function.comp_apply,
FreeGroup.freeGroupCongr_apply, FreeGroup.map.of,
Presented.GeneratorPartition.equiv_apply_of_delete D.IsDegenerateSchreierSymbol hz]
exact Presented.trivializeGeneratorsHom_inr
(X := D.NondegenerateSchreierSymbol)
(Y := D.DegenerateSchreierSymbol)
(⟨z, hz⟩ : D.DegenerateSchreierSymbol)
omit [DecidableEq X] in
theorem symbolEval_eq_one_of_isDegenerateSchreierSymbol
{z : FiniteSchreierSymbol X Q} (hz : D.IsDegenerateSchreierSymbol z) :
D.symbolEval z = 1A degenerate Schreier symbol evaluates to the identity.
Show Lean proof
by
rcases z with ⟨q, x⟩
simp only [IsDegenerateSchreierSymbol, transition_eq, symbolEval, schreierGenerator] at hz ⊢
rw [hz]
group
def nondegenerateSymbolEval
(z : D.NondegenerateSchreierSymbol) : FreeGroup X :=
D.symbolEval z.1The evaluation map on the nondegenerate finite Schreier generators.
def nondegenerateSymbolEvalHom :
FreeGroup D.NondegenerateSchreierSymbol →* FreeGroup X :=
FreeGroup.lift D.nondegenerateSymbolEvalThe evaluation homomorphism on nondegenerate finite Schreier symbols.
omit [DecidableEq X] in
theorem nondegenerateSymbolEvalHom_deleteDegenerateSchreierGeneratorHom
[DecidablePred D.IsDegenerateSchreierSymbol]
(w : FreeGroup (FiniteSchreierSymbol X Q)) :
D.nondegenerateSymbolEvalHom
(D.deleteDegenerateSchreierGeneratorHom w) =
D.symbolEvalHom wEvaluating after deleting degenerate Schreier generators agrees with ordinary symbol evaluation.
Show Lean proof
by
let F : FreeGroup (FiniteSchreierSymbol X Q) →* FreeGroup X :=
D.nondegenerateSymbolEvalHom.comp D.deleteDegenerateSchreierGeneratorHom
have hF : F = D.symbolEvalHom := by
ext z
by_cases hz : D.IsDegenerateSchreierSymbol z
· simp only [MonoidHom.coe_comp, Function.comp_apply,
D.deleteDegenerateSchreierGeneratorHom_of_degenerate hz,
map_one, symbolEvalHom_of, D.symbolEval_eq_one_of_isDegenerateSchreierSymbol hz, F]
· simp only [MonoidHom.coe_comp, Function.comp_apply,
D.deleteDegenerateSchreierGeneratorHom_of_not_degenerate hz,
symbolEvalHom_of, F]
change D.nondegenerateSymbolEvalHom (FreeGroup.of ⟨z, hz⟩) =
D.symbolEval z
rw [nondegenerateSymbolEvalHom, FreeGroup.lift_apply_of]
rfl
exact congrArg (fun f : FreeGroup (FiniteSchreierSymbol X Q) →* FreeGroup X => f w) hF
def cleanedSchreierSymbolWord
[DecidablePred D.IsDegenerateSchreierSymbol]
(z : FiniteSchreierSymbol X Q) :
FreeGroup D.NondegenerateSchreierSymbol :=
if hz : D.IsDegenerateSchreierSymbol z then
1
else
FreeGroup.of (⟨z, hz⟩ : D.NondegenerateSchreierSymbol)A single finite Schreier generator after deleting degenerate generators.
omit [DecidableEq X] in
@[simp]
theorem cleanedSchreierSymbolWord_of_degenerate
[DecidablePred D.IsDegenerateSchreierSymbol]
{z : FiniteSchreierSymbol X Q} (hz : D.IsDegenerateSchreierSymbol z) :
D.cleanedSchreierSymbolWord z = 1A degenerate Schreier symbol is deleted by the cleaned Schreier-symbol word map.
Show Lean proof
by
simp only [cleanedSchreierSymbolWord, hz, ↓reduceDIte]
omit [DecidableEq X] in
@[simp]
theorem cleanedSchreierSymbolWord_of_not_degenerate
[DecidablePred D.IsDegenerateSchreierSymbol]
{z : FiniteSchreierSymbol X Q} (hz : ¬ D.IsDegenerateSchreierSymbol z) :
D.cleanedSchreierSymbolWord z =
FreeGroup.of (⟨z, hz⟩ : D.NondegenerateSchreierSymbol)A nondegenerate Schreier symbol is kept as the corresponding generator by the cleaned Schreier-symbol word map.
Show Lean proof
by
simp only [cleanedSchreierSymbolWord, hz, ↓reduceDIte]
congr
omit [DecidableEq X] in
@[simp]
theorem deleteDegenerateSchreierGeneratorHom_of
[DecidablePred D.IsDegenerateSchreierSymbol]
(z : FiniteSchreierSymbol X Q) :
D.deleteDegenerateSchreierGeneratorHom (FreeGroup.of z) =
D.cleanedSchreierSymbolWord zThe generator-deletion homomorphism sends a finite Schreier generator to its cleaned Schreier-symbol word.
Show Lean proof
by
by_cases hz : D.IsDegenerateSchreierSymbol z
· simp only [hz, deleteDegenerateSchreierGeneratorHom_of_degenerate,
cleanedSchreierSymbolWord_of_degenerate]
· simp only [hz, not_false_eq_true, deleteDegenerateSchreierGeneratorHom_of_not_degenerate,
cleanedSchreierSymbolWord_of_not_degenerate]