Zulip Chat Archive
Stream: Is there code for X?
Topic: induction lemmas for semidirect product
Edward van de Meent (May 24 2024 at 19:02):
i have defined a GroupHom
using SemidirectProduct.lift
, and i'd like to prove that it is injective by using the fact that the maps i used to define it are injective, and that the only overlap in the codomain is 1
. I had guessed that to do this i could use some kind of closure-induction argument for the semidirect product, but i found none...
a first thing that would help is the following lemma:
import Mathlib.GroupTheory.SemidirectProduct
variable {N G : Type*} [Group N] [Group G] (hom : G →* MulAut N)
lemma SemidirectProduct.is_closure :
Subgroup.closure ((Set.range SemidirectProduct.inl : Set (N ⋊[hom] G)) ∪ (Set.range SemidirectProduct.inr : Set (N ⋊[hom] G))) = ⊤ := sorry
ultimately, my goal is this:
variable {H:Type*} [Group H] (f₁ : N →* H) (f₂ : G →* H)
(h : ∀ (g : G), f₁.comp (MulEquiv.toMonoidHom (φ g)) = (MulEquiv.toMonoidHom (MulAut.conj (f₂ g))).comp f₁))
lemma SemidirectProduct.lift_inj (hf₁ : Function.Injective f₁) (hf2 : Function.Injective f₂)
(hindep : f₁.range ⊓ f₂.range = ⊥)
:
Function.Injective (SemidirectProduct.lift f₁ f₂ h ) := sorry
Edward van de Meent (May 24 2024 at 19:03):
solution to second part
Kevin Buzzard (May 25 2024 at 07:07):
I would prove the stronger theorem that every element of a semidirect product is equal to a product g*n. A general element of a Subgroup.closure is a random finite product so the stronger theorem looks easier to prove. You can then just use the fact that injective iff trivial kernel
Edward van de Meent (May 25 2024 at 07:12):
so you suggest using something like this?
lemma SemidirectProduct.factor (x : N ⋊[φ] G) :
∃ n g, x = SemidirectProduct.inl n * SemidirectProduct.inr g := by
obtain ⟨n,g⟩ := x
simp only [mk_eq_inl_mul_inr]
use n,g
Edward van de Meent (May 25 2024 at 07:14):
my point is mostly that proving this closure property opens up the use of Subgroup.induction
and variants
Edward van de Meent (May 25 2024 at 07:14):
which i imagine wouldn't be harmful
Kevin Buzzard (May 25 2024 at 07:16):
Sure, but now proving the closure property is easy
Edward van de Meent (May 25 2024 at 07:16):
ah, i see
Kevin Buzzard (May 25 2024 at 07:16):
(hopefully!)
Kevin Buzzard (May 25 2024 at 07:17):
I guess you just need to prove that the product of two things in S is in closure S, which could be a lemma in its own right
Edward van de Meent (May 25 2024 at 07:35):
it already is (sort of): docs#Subgroup.mul_mem_sup
Edward van de Meent (May 25 2024 at 07:36):
at least, the form i need
Eric Wieser (May 25 2024 at 09:45):
Edward van de Meent said:
so you suggest using something like this?
lemma SemidirectProduct.factor (x : N ⋊[φ] G) : ∃ n g, x = SemidirectProduct.inl n * SemidirectProduct.inr g := by obtain ⟨n,g⟩ := x simp only [mk_eq_inl_mul_inr] use n,g
This should be phrased as an induction principle
Edward van de Meent (May 25 2024 at 09:46):
protected lemma SemidirectProduct.induction {motive : N ⋊[φ] G → Prop} (x : N ⋊[φ] G)
(left : ∀ n, motive (inl n))
(right : ∀ g, motive (inr g))
(mul : ∀ (n : N) (g : G), motive (inl n) → motive (inr g) → motive (inl n * inr g)) :
motive x := by
obtain ⟨x₁,x₂⟩ := x
simp only [mk_eq_inl_mul_inr]
exact mul _ _ (left x₁) (right x₂)
you mean like this?
Edward van de Meent (May 25 2024 at 09:47):
or like this:
protected lemma SemidirectProduct.induction' {motive : N ⋊[φ] G → Prop} (x : N ⋊[φ] G)
(mul : ∀ (n : N) (g : G),motive (inl n * inr g)) :
motive x := by
obtain ⟨x₁,x₂⟩ := x
simp only [mk_eq_inl_mul_inr]
exact mul x₁ x₂
Eric Wieser (May 25 2024 at 17:46):
I meant the second one
Eric Wieser (May 25 2024 at 17:47):
But with @[elab_as_elim]
Last updated: May 02 2025 at 03:31 UTC