Zulip Chat Archive
Stream: maths
Topic: JordanHolderLattice for Subgroup
Marcus Camilus (May 28 2025 at 13:37):
Hi, everyone. I am trying to find a subgroup Lattice instance of JordanHolderLattice. However, I found it is hard toconsruct a appropriate quotient group for iso case.
since the common subgroup is not necessarily normal so Lean fail to failed to synthesize
HasQuotient (↥K₁) (Subgroup G) in Iso part. Is there a way to slove this?
variable (G : Type*) [Group G]
instance : JordanHolderLattice (Subgroup G) where
IsMaximal := fun H K => H.Normal ∧ H < K ∧
∀ L : Subgroup G, L.Normal → H < L → L ≤ K → L = K
Iso := fun (H₁, K₁) (H₂, K₂) =>
Nonempty (K₁ ⧸ H₁ ≃* K₂ ⧸ H₂)
lt_of_isMaximal := by
intros H K h
exact h.2.1
sup_eq_of_isMaximal := by
sorry
isMaximal_inf_left_of_isMaximal_sup := by
sorry
iso_symm := by
sorry
iso_trans := by
sorry
second_iso := by
sorry
Kenny Lau (May 28 2025 at 13:39):
you usually use (object : typeYouWant) to force coercion
Marcus Camilus (May 28 2025 at 13:41):
Kenny Lau said:
you usually use
(object : typeYouWant)to force coercion
How does that works?
Kenny Lau (May 28 2025 at 13:45):
Lean searches the typeclass database for a coercion
Marcus Camilus (May 28 2025 at 13:48):
Kenny Lau said:
Lean searches the typeclass database for a coercion
I tried, but I do not know how to convert the type of H1 to the normal subgroup of K1
Kenny Lau (May 28 2025 at 14:00):
@Marcus Camilus right, that's because you can't (think about what this means in maths)
Kenny Lau (May 28 2025 at 14:00):
Kenny Lau (May 28 2025 at 14:01):
you can look at a working implementation to see how they do it
Marcus Camilus (May 28 2025 at 14:08):
Kenny Lau said:
Marcus Camilus right, that's because you can't (think about what this means in maths)
```Kenny Lau said:
Kenny Lau
Thanks.
Marcus Camilus (May 28 2025 at 16:07):
Kenny Lau said:
Lean searches the typeclass database for a coercion
Kenny Lau said:
Marcus Camilus right, that's because you can't (think about what this means in maths)
Actually, I found a way to solve it.
def Iso1 (X Y : Subgroup G × Subgroup G) : Prop :=
(Nonempty <| (X.2 ⧸ (X.1.comap X.2.subtype).normalCore) ≃* (Y.2 ⧸ (Y.1.comap Y.2.subtype).normalCore))
But then I encounter another question: it is hard to apply second isomorphism theorem to:
theorem second_iso1 {X Y : Subgroup G} (_ : X ⋖ X ⊔ Y) :
Iso1 (X,X ⊔ Y) (X ⊓ Y,Y) := by
constructor
rw [sup_comm, inf_comm]
dsimp
symm
sorry
Marcus Camilus (May 28 2025 at 16:12):
Marcus Camilus said:
Kenny Lau said:
Lean searches the typeclass database for a coercion
Kenny Lau said:
Marcus Camilus right, that's because you can't (think about what this means in maths)
Actually, I found a way to solve it.
def Iso1 (X Y : Subgroup G × Subgroup G) : Prop := (Nonempty <| (X.2 ⧸ (X.1.comap X.2.subtype).normalCore) ≃* (Y.2 ⧸ (Y.1.comap Y.2.subtype).normalCore))But then I encounter another question: it is hard to apply second isomorphism theorem to:
theorem second_iso1 {X Y : Subgroup G} (_ : X ⋖ X ⊔ Y) : Iso1 (X,X ⊔ Y) (X ⊓ Y,Y) := by constructor rw [sup_comm, inf_comm] dsimp symm sorry
When I add .normalcore, it is hard to prove the second_iso1. Is there a hint?
Junyan Xu (May 28 2025 at 20:42):
fun H K => H.Normal ∧ H < K ∧ looks too restrictive since H is usually only required to be normal in K rather than in the whole group G. And you can use the Subgroup.subgroupOf API instead of using comap subtype directly. You can also include the normal hypotheses when defining Iso.
The following might be a better start; notice I'm not using pattern matches when defining Iso which is a habit from Lean 3; maybe in Lean 4 they work well now. BTW you might be interested in the discussions at .
import Mathlib
variable (G : Type*) [Group G]
instance : JordanHolderLattice (Subgroup G) where
IsMaximal H K := H < K ∧ (H.subgroupOf K).Normal ∧
∀ L : Subgroup G, (L.subgroupOf K).Normal → H < L → L ≤ K → L = K
Iso HK₁ HK₂ :=
∃ (_ : (HK₁.1.subgroupOf HK₁.2).Normal) (_ : (HK₂.1.subgroupOf HK₂.2).Normal),
Nonempty (HK₁.2 ⧸ HK₁.1.subgroupOf HK₁.2 ≃* HK₂.2 ⧸ HK₂.1.subgroupOf HK₂.2)
lt_of_isMaximal h := h.1
sup_eq_of_isMaximal := by
sorry
isMaximal_inf_left_of_isMaximal_sup := by
sorry
iso_symm := by
sorry
iso_trans := by
sorry
second_iso := by
sorry
Junyan Xu (May 28 2025 at 20:52):
And why are you replacing IsMaximal by ⋖? I don't think they're equivalent.
Last updated: Dec 20 2025 at 21:32 UTC