Skip to content

Commit bb78855

Browse files
committed
feat: port Algebra.Lie.Solvable (#4634)
1 parent 6cb58e7 commit bb78855

File tree

2 files changed

+379
-0
lines changed

2 files changed

+379
-0
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ import Mathlib.Algebra.Lie.IdealOperations
208208
import Mathlib.Algebra.Lie.Matrix
209209
import Mathlib.Algebra.Lie.NonUnitalNonAssocAlgebra
210210
import Mathlib.Algebra.Lie.OfAssociative
211+
import Mathlib.Algebra.Lie.Solvable
211212
import Mathlib.Algebra.Lie.Subalgebra
212213
import Mathlib.Algebra.Lie.Submodule
213214
import Mathlib.Algebra.Lie.TensorProduct

Mathlib/Algebra/Lie/Solvable.lean

Lines changed: 378 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,378 @@
1+
/-
2+
Copyright (c) 2021 Oliver Nash. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Oliver Nash
5+
6+
! This file was ported from Lean 3 source module algebra.lie.solvable
7+
! leanprover-community/mathlib commit a50170a88a47570ed186b809ca754110590f9476
8+
! Please do not edit these lines, except to modify the commit id
9+
! if you have ported upstream changes.
10+
-/
11+
import Mathlib.Algebra.Lie.Abelian
12+
import Mathlib.Algebra.Lie.IdealOperations
13+
import Mathlib.Order.Hom.Basic
14+
15+
/-!
16+
# Solvable Lie algebras
17+
18+
Like groups, Lie algebras admit a natural concept of solvability. We define this here via the
19+
derived series and prove some related results. We also define the radical of a Lie algebra and
20+
prove that it is solvable when the Lie algebra is Noetherian.
21+
22+
## Main definitions
23+
24+
* `LieAlgebra.derivedSeriesOfIdeal`
25+
* `LieAlgebra.derivedSeries`
26+
* `LieAlgebra.IsSolvable`
27+
* `LieAlgebra.isSolvableAdd`
28+
* `LieAlgebra.radical`
29+
* `LieAlgebra.radicalIsSolvable`
30+
* `LieAlgebra.derivedLengthOfIdeal`
31+
* `LieAlgebra.derivedLength`
32+
* `LieAlgebra.derivedAbelianOfIdeal`
33+
34+
## Tags
35+
36+
lie algebra, derived series, derived length, solvable, radical
37+
-/
38+
39+
40+
universe u v w w₁ w₂
41+
42+
variable (R : Type u) (L : Type v) (M : Type w) {L' : Type w₁}
43+
44+
variable [CommRing R] [LieRing L] [LieAlgebra R L] [LieRing L'] [LieAlgebra R L']
45+
46+
variable (I J : LieIdeal R L) {f : L' →ₗ⁅R⁆ L}
47+
48+
namespace LieAlgebra
49+
50+
/-- A generalisation of the derived series of a Lie algebra, whose zeroth term is a specified ideal.
51+
52+
It can be more convenient to work with this generalisation when considering the derived series of
53+
an ideal since it provides a type-theoretic expression of the fact that the terms of the ideal's
54+
derived series are also ideals of the enclosing algebra.
55+
56+
See also `LieIdeal.derivedSeries_eq_derivedSeriesOfIdeal_comap` and
57+
`LieIdeal.derivedSeries_eq_derivedSeriesOfIdeal_map` below. -/
58+
def derivedSeriesOfIdeal (k : ℕ) : LieIdeal R L → LieIdeal R L :=
59+
(fun I => ⁅I, I⁆)^[k]
60+
#align lie_algebra.derived_series_of_ideal LieAlgebra.derivedSeriesOfIdeal
61+
62+
@[simp]
63+
theorem derivedSeriesOfIdeal_zero : derivedSeriesOfIdeal R L 0 I = I :=
64+
rfl
65+
#align lie_algebra.derived_series_of_ideal_zero LieAlgebra.derivedSeriesOfIdeal_zero
66+
67+
@[simp]
68+
theorem derivedSeriesOfIdeal_succ (k : ℕ) :
69+
derivedSeriesOfIdeal R L (k + 1) I =
70+
⁅derivedSeriesOfIdeal R L k I, derivedSeriesOfIdeal R L k I⁆ :=
71+
Function.iterate_succ_apply' (fun I => ⁅I, I⁆) k I
72+
#align lie_algebra.derived_series_of_ideal_succ LieAlgebra.derivedSeriesOfIdeal_succ
73+
74+
/-- The derived series of Lie ideals of a Lie algebra. -/
75+
abbrev derivedSeries (k : ℕ) : LieIdeal R L :=
76+
derivedSeriesOfIdeal R L k ⊤
77+
#align lie_algebra.derived_series LieAlgebra.derivedSeries
78+
79+
theorem derivedSeries_def (k : ℕ) : derivedSeries R L k = derivedSeriesOfIdeal R L k ⊤ :=
80+
rfl
81+
#align lie_algebra.derived_series_def LieAlgebra.derivedSeries_def
82+
83+
variable {R L}
84+
85+
local notation "D" => derivedSeriesOfIdeal R L
86+
87+
theorem derivedSeriesOfIdeal_add (k l : ℕ) : D (k + l) I = D k (D l I) := by
88+
induction' k with k ih
89+
· rw [Nat.zero_add, derivedSeriesOfIdeal_zero]
90+
· rw [Nat.succ_add k l, derivedSeriesOfIdeal_succ, derivedSeriesOfIdeal_succ, ih]
91+
#align lie_algebra.derived_series_of_ideal_add LieAlgebra.derivedSeriesOfIdeal_add
92+
93+
@[mono]
94+
theorem derivedSeriesOfIdeal_le {I J : LieIdeal R L} {k l : ℕ} (h₁ : I ≤ J) (h₂ : l ≤ k) :
95+
D k I ≤ D l J := by
96+
revert l; induction' k with k ih <;> intro l h₂
97+
· rw [Nat.zero_eq, le_zero_iff] at h₂ ; rw [h₂, derivedSeriesOfIdeal_zero]; exact h₁
98+
· have h : l = k.succ ∨ l ≤ k := by rwa [le_iff_eq_or_lt, Nat.lt_succ_iff] at h₂
99+
cases' h with h h
100+
· rw [h, derivedSeriesOfIdeal_succ, derivedSeriesOfIdeal_succ]
101+
exact LieSubmodule.mono_lie _ _ _ _ (ih (le_refl k)) (ih (le_refl k))
102+
· rw [derivedSeriesOfIdeal_succ]; exact le_trans (LieSubmodule.lie_le_left _ _) (ih h)
103+
#align lie_algebra.derived_series_of_ideal_le LieAlgebra.derivedSeriesOfIdeal_le
104+
105+
theorem derivedSeriesOfIdeal_succ_le (k : ℕ) : D (k + 1) I ≤ D k I :=
106+
derivedSeriesOfIdeal_le (le_refl I) k.le_succ
107+
#align lie_algebra.derived_series_of_ideal_succ_le LieAlgebra.derivedSeriesOfIdeal_succ_le
108+
109+
theorem derivedSeriesOfIdeal_le_self (k : ℕ) : D k I ≤ I :=
110+
derivedSeriesOfIdeal_le (le_refl I) (zero_le k)
111+
#align lie_algebra.derived_series_of_ideal_le_self LieAlgebra.derivedSeriesOfIdeal_le_self
112+
113+
theorem derivedSeriesOfIdeal_mono {I J : LieIdeal R L} (h : I ≤ J) (k : ℕ) : D k I ≤ D k J :=
114+
derivedSeriesOfIdeal_le h (le_refl k)
115+
#align lie_algebra.derived_series_of_ideal_mono LieAlgebra.derivedSeriesOfIdeal_mono
116+
117+
theorem derivedSeriesOfIdeal_antitone {k l : ℕ} (h : l ≤ k) : D k I ≤ D l I :=
118+
derivedSeriesOfIdeal_le (le_refl I) h
119+
#align lie_algebra.derived_series_of_ideal_antitone LieAlgebra.derivedSeriesOfIdeal_antitone
120+
121+
theorem derivedSeriesOfIdeal_add_le_add (J : LieIdeal R L) (k l : ℕ) :
122+
D (k + l) (I + J) ≤ D k I + D l J := by
123+
let D₁ : LieIdeal R L →o LieIdeal R L :=
124+
{ toFun := fun I => ⁅I, I⁆
125+
monotone' := fun I J h => LieSubmodule.mono_lie I J I J h h }
126+
have h₁ : ∀ I J : LieIdeal R L, D₁ (I ⊔ J) ≤ D₁ I ⊔ J := by
127+
simp [LieSubmodule.lie_le_right, LieSubmodule.lie_le_left, le_sup_of_le_right]
128+
rw [← D₁.iterate_sup_le_sup_iff] at h₁
129+
exact h₁ k l I J
130+
#align lie_algebra.derived_series_of_ideal_add_le_add LieAlgebra.derivedSeriesOfIdeal_add_le_add
131+
132+
theorem derivedSeries_of_bot_eq_bot (k : ℕ) : derivedSeriesOfIdeal R L k ⊥ = ⊥ := by
133+
rw [eq_bot_iff]; exact derivedSeriesOfIdeal_le_self ⊥ k
134+
#align lie_algebra.derived_series_of_bot_eq_bot LieAlgebra.derivedSeries_of_bot_eq_bot
135+
136+
theorem abelian_iff_derived_one_eq_bot : IsLieAbelian I ↔ derivedSeriesOfIdeal R L 1 I = ⊥ := by
137+
rw [derivedSeriesOfIdeal_succ, derivedSeriesOfIdeal_zero,
138+
LieSubmodule.lie_abelian_iff_lie_self_eq_bot]
139+
#align lie_algebra.abelian_iff_derived_one_eq_bot LieAlgebra.abelian_iff_derived_one_eq_bot
140+
141+
theorem abelian_iff_derived_succ_eq_bot (I : LieIdeal R L) (k : ℕ) :
142+
IsLieAbelian (derivedSeriesOfIdeal R L k I) ↔ derivedSeriesOfIdeal R L (k + 1) I = ⊥ := by
143+
rw [add_comm, derivedSeriesOfIdeal_add I 1 k, abelian_iff_derived_one_eq_bot]
144+
#align lie_algebra.abelian_iff_derived_succ_eq_bot LieAlgebra.abelian_iff_derived_succ_eq_bot
145+
146+
end LieAlgebra
147+
148+
namespace LieIdeal
149+
150+
open LieAlgebra
151+
152+
variable {R L}
153+
154+
theorem derivedSeries_eq_derivedSeriesOfIdeal_comap (k : ℕ) :
155+
derivedSeries R I k = (derivedSeriesOfIdeal R L k I).comap I.incl := by
156+
induction' k with k ih
157+
· simp only [Nat.zero_eq, derivedSeries_def, comap_incl_self, derivedSeriesOfIdeal_zero]
158+
· simp only [derivedSeries_def, derivedSeriesOfIdeal_succ] at ih ⊢; rw [ih]
159+
exact comap_bracket_incl_of_le I
160+
(derivedSeriesOfIdeal_le_self I k) (derivedSeriesOfIdeal_le_self I k)
161+
#align lie_ideal.derived_series_eq_derived_series_of_ideal_comap LieIdeal.derivedSeries_eq_derivedSeriesOfIdeal_comap
162+
163+
theorem derivedSeries_eq_derivedSeriesOfIdeal_map (k : ℕ) :
164+
(derivedSeries R I k).map I.incl = derivedSeriesOfIdeal R L k I := by
165+
rw [derivedSeries_eq_derivedSeriesOfIdeal_comap, map_comap_incl, inf_eq_right]
166+
apply derivedSeriesOfIdeal_le_self
167+
#align lie_ideal.derived_series_eq_derived_series_of_ideal_map LieIdeal.derivedSeries_eq_derivedSeriesOfIdeal_map
168+
169+
theorem derivedSeries_eq_bot_iff (k : ℕ) :
170+
derivedSeries R I k = ⊥ ↔ derivedSeriesOfIdeal R L k I = ⊥ := by
171+
rw [← derivedSeries_eq_derivedSeriesOfIdeal_map, map_eq_bot_iff, ker_incl, eq_bot_iff]
172+
#align lie_ideal.derived_series_eq_bot_iff LieIdeal.derivedSeries_eq_bot_iff
173+
174+
theorem derivedSeries_add_eq_bot {k l : ℕ} {I J : LieIdeal R L} (hI : derivedSeries R I k = ⊥)
175+
(hJ : derivedSeries R J l = ⊥) : derivedSeries R (I + J) (k + l) = ⊥ := by
176+
rw [LieIdeal.derivedSeries_eq_bot_iff] at hI hJ ⊢
177+
rw [← le_bot_iff]
178+
let D := derivedSeriesOfIdeal R L; change D k I = ⊥ at hI ; change D l J = ⊥ at hJ
179+
calc
180+
D (k + l) (I + J) ≤ D k I + D l J := derivedSeriesOfIdeal_add_le_add I J k l
181+
_ ≤ ⊥ := by rw [hI, hJ]; simp
182+
#align lie_ideal.derived_series_add_eq_bot LieIdeal.derivedSeries_add_eq_bot
183+
184+
theorem derivedSeries_map_le (k : ℕ) : (derivedSeries R L' k).map f ≤ derivedSeries R L k := by
185+
induction' k with k ih
186+
· simp only [Nat.zero_eq, derivedSeries_def, derivedSeriesOfIdeal_zero, le_top]
187+
· simp only [derivedSeries_def, derivedSeriesOfIdeal_succ] at ih ⊢
188+
exact le_trans (map_bracket_le f) (LieSubmodule.mono_lie _ _ _ _ ih ih)
189+
#align lie_ideal.derived_series_map_le LieIdeal.derivedSeries_map_le
190+
191+
theorem derivedSeries_map_eq (k : ℕ) (h : Function.Surjective f) :
192+
(derivedSeries R L' k).map f = derivedSeries R L k := by
193+
induction' k with k ih
194+
· change (⊤ : LieIdeal R L').map f = ⊤
195+
rw [← f.idealRange_eq_map]
196+
exact f.idealRange_eq_top_of_surjective h
197+
· simp only [derivedSeries_def, map_bracket_eq f h, ih, derivedSeriesOfIdeal_succ]
198+
#align lie_ideal.derived_series_map_eq LieIdeal.derivedSeries_map_eq
199+
200+
end LieIdeal
201+
202+
namespace LieAlgebra
203+
204+
/-- A Lie algebra is solvable if its derived series reaches 0 (in a finite number of steps). -/
205+
class IsSolvable : Prop where
206+
solvable : ∃ k, derivedSeries R L k = ⊥
207+
#align lie_algebra.is_solvable LieAlgebra.IsSolvable
208+
209+
instance isSolvableBot : IsSolvable R (↥(⊥ : LieIdeal R L)) :=
210+
⟨⟨0, Subsingleton.elim _ ⊥⟩⟩
211+
#align lie_algebra.is_solvable_bot LieAlgebra.isSolvableBot
212+
213+
instance isSolvableAdd {I J : LieIdeal R L} [hI : IsSolvable R I] [hJ : IsSolvable R J] :
214+
IsSolvable R (↥(I + J)) := by
215+
obtain ⟨k, hk⟩ := id hI; obtain ⟨l, hl⟩ := id hJ
216+
exact ⟨⟨k + l, LieIdeal.derivedSeries_add_eq_bot hk hl⟩⟩
217+
#align lie_algebra.is_solvable_add LieAlgebra.isSolvableAdd
218+
219+
end LieAlgebra
220+
221+
variable {R L}
222+
223+
namespace Function
224+
225+
open LieAlgebra
226+
227+
theorem Injective.lieAlgebra_isSolvable [h₁ : IsSolvable R L] (h₂ : Injective f) :
228+
IsSolvable R L' := by
229+
obtain ⟨k, hk⟩ := id h₁
230+
use k
231+
apply LieIdeal.bot_of_map_eq_bot h₂; rw [eq_bot_iff, ← hk]
232+
apply LieIdeal.derivedSeries_map_le
233+
#align function.injective.lie_algebra_is_solvable Function.Injective.lieAlgebra_isSolvable
234+
235+
theorem Surjective.lieAlgebra_isSolvable [h₁ : IsSolvable R L'] (h₂ : Surjective f) :
236+
IsSolvable R L := by
237+
obtain ⟨k, hk⟩ := id h₁
238+
use k
239+
rw [← LieIdeal.derivedSeries_map_eq k h₂, hk]
240+
simp only [LieIdeal.map_eq_bot_iff, bot_le]
241+
#align function.surjective.lie_algebra_is_solvable Function.Surjective.lieAlgebra_isSolvable
242+
243+
end Function
244+
245+
theorem LieHom.isSolvable_range (f : L' →ₗ⁅R⁆ L) [LieAlgebra.IsSolvable R L'] :
246+
LieAlgebra.IsSolvable R f.range :=
247+
f.surjective_rangeRestrict.lieAlgebra_isSolvable
248+
#align lie_hom.is_solvable_range LieHom.isSolvable_range
249+
250+
namespace LieAlgebra
251+
252+
theorem solvable_iff_equiv_solvable (e : L' ≃ₗ⁅R⁆ L) : IsSolvable R L' ↔ IsSolvable R L := by
253+
constructor <;> intro h
254+
· exact e.symm.injective.lieAlgebra_isSolvable
255+
· exact e.injective.lieAlgebra_isSolvable
256+
#align lie_algebra.solvable_iff_equiv_solvable LieAlgebra.solvable_iff_equiv_solvable
257+
258+
theorem le_solvable_ideal_solvable {I J : LieIdeal R L} (h₁ : I ≤ J) (_ : IsSolvable R J) :
259+
IsSolvable R I :=
260+
(LieIdeal.homOfLe_injective h₁).lieAlgebra_isSolvable
261+
#align lie_algebra.le_solvable_ideal_solvable LieAlgebra.le_solvable_ideal_solvable
262+
263+
variable (R L)
264+
265+
instance (priority := 100) ofAbelianIsSolvable [IsLieAbelian L] : IsSolvable R L := by
266+
use 1
267+
rw [← abelian_iff_derived_one_eq_bot, lie_abelian_iff_equiv_lie_abelian LieIdeal.topEquiv]
268+
infer_instance
269+
#align lie_algebra.of_abelian_is_solvable LieAlgebra.ofAbelianIsSolvable
270+
271+
/-- The (solvable) radical of Lie algebra is the `sSup` of all solvable ideals. -/
272+
def radical :=
273+
sSup { I : LieIdeal R L | IsSolvable R I }
274+
#align lie_algebra.radical LieAlgebra.radical
275+
276+
/-- The radical of a Noetherian Lie algebra is solvable. -/
277+
instance radicalIsSolvable [IsNoetherian R L] : IsSolvable R (radical R L) := by
278+
have hwf := LieSubmodule.wellFounded_of_noetherian R L L
279+
rw [← CompleteLattice.isSupClosedCompact_iff_wellFounded] at hwf
280+
refine' hwf { I : LieIdeal R L | IsSolvable R I } ⟨⊥, _⟩ fun I hI J hJ => _
281+
· exact LieAlgebra.isSolvableBot R L
282+
· rw [Set.mem_setOf_eq] at hI hJ ⊢
283+
apply LieAlgebra.isSolvableAdd R L
284+
#align lie_algebra.radical_is_solvable LieAlgebra.radicalIsSolvable
285+
286+
/-- The `→` direction of this lemma is actually true without the `IsNoetherian` assumption. -/
287+
theorem LieIdeal.solvable_iff_le_radical [IsNoetherian R L] (I : LieIdeal R L) :
288+
IsSolvable R I ↔ I ≤ radical R L :=
289+
fun h => le_sSup h, fun h => le_solvable_ideal_solvable h inferInstance⟩
290+
#align lie_algebra.lie_ideal.solvable_iff_le_radical LieAlgebra.LieIdeal.solvable_iff_le_radical
291+
292+
theorem center_le_radical : center R L ≤ radical R L :=
293+
have h : IsSolvable R (center R L) := inferInstance
294+
le_sSup h
295+
#align lie_algebra.center_le_radical LieAlgebra.center_le_radical
296+
297+
/-- Given a solvable Lie ideal `I` with derived series `I = D₀ ≥ D₁ ≥ ⋯ ≥ Dₖ = ⊥`, this is the
298+
natural number `k` (the number of inclusions).
299+
300+
For a non-solvable ideal, the value is 0. -/
301+
noncomputable def derivedLengthOfIdeal (I : LieIdeal R L) : ℕ :=
302+
sInf { k | derivedSeriesOfIdeal R L k I = ⊥ }
303+
#align lie_algebra.derived_length_of_ideal LieAlgebra.derivedLengthOfIdeal
304+
305+
/-- The derived length of a Lie algebra is the derived length of its 'top' Lie ideal.
306+
307+
See also `LieAlgebra.derivedLength_eq_derivedLengthOfIdeal`. -/
308+
noncomputable abbrev derivedLength : ℕ :=
309+
derivedLengthOfIdeal R L ⊤
310+
#align lie_algebra.derived_length LieAlgebra.derivedLength
311+
312+
theorem derivedSeries_of_derivedLength_succ (I : LieIdeal R L) (k : ℕ) :
313+
derivedLengthOfIdeal R L I = k + 1
314+
IsLieAbelian (derivedSeriesOfIdeal R L k I) ∧ derivedSeriesOfIdeal R L k I ≠ ⊥ := by
315+
rw [abelian_iff_derived_succ_eq_bot]
316+
let s := { k | derivedSeriesOfIdeal R L k I = ⊥ }
317+
change sInf s = k + 1 ↔ k + 1 ∈ s ∧ k ∉ s
318+
have hs : ∀ k₁ k₂ : ℕ, k₁ ≤ k₂ → k₁ ∈ s → k₂ ∈ s := by
319+
intro k₁ k₂ h₁₂ h₁
320+
suffices derivedSeriesOfIdeal R L k₂ I ≤ ⊥ by exact eq_bot_iff.mpr this
321+
change derivedSeriesOfIdeal R L k₁ I = ⊥ at h₁ ; rw [← h₁]
322+
exact derivedSeriesOfIdeal_antitone I h₁₂
323+
exact Nat.sInf_upward_closed_eq_succ_iff hs k
324+
#align lie_algebra.derived_series_of_derived_length_succ LieAlgebra.derivedSeries_of_derivedLength_succ
325+
326+
theorem derivedLength_eq_derivedLengthOfIdeal (I : LieIdeal R L) :
327+
derivedLength R I = derivedLengthOfIdeal R L I := by
328+
let s₁ := { k | derivedSeries R I k = ⊥ }
329+
let s₂ := { k | derivedSeriesOfIdeal R L k I = ⊥ }
330+
change sInf s₁ = sInf s₂
331+
congr; ext k; exact I.derivedSeries_eq_bot_iff k
332+
#align lie_algebra.derived_length_eq_derived_length_of_ideal LieAlgebra.derivedLength_eq_derivedLengthOfIdeal
333+
334+
variable {R L}
335+
336+
/-- Given a solvable Lie ideal `I` with derived series `I = D₀ ≥ D₁ ≥ ⋯ ≥ Dₖ = ⊥`, this is the
337+
`k-1`th term in the derived series (and is therefore an Abelian ideal contained in `I`).
338+
339+
For a non-solvable ideal, this is the zero ideal, `⊥`. -/
340+
noncomputable def derivedAbelianOfIdeal (I : LieIdeal R L) : LieIdeal R L :=
341+
match derivedLengthOfIdeal R L I with
342+
| 0 => ⊥
343+
| k + 1 => derivedSeriesOfIdeal R L k I
344+
#align lie_algebra.derived_abelian_of_ideal LieAlgebra.derivedAbelianOfIdeal
345+
346+
theorem abelian_derivedAbelianOfIdeal (I : LieIdeal R L) :
347+
IsLieAbelian (derivedAbelianOfIdeal I) := by
348+
dsimp only [derivedAbelianOfIdeal]
349+
cases' h : derivedLengthOfIdeal R L I with k
350+
· exact isLieAbelian_bot R L
351+
· rw [derivedSeries_of_derivedLength_succ] at h ; exact h.1
352+
#align lie_algebra.abelian_derived_abelian_of_ideal LieAlgebra.abelian_derivedAbelianOfIdeal
353+
354+
theorem derivedLength_zero (I : LieIdeal R L) [hI : IsSolvable R I] :
355+
derivedLengthOfIdeal R L I = 0 ↔ I = ⊥ := by
356+
let s := { k | derivedSeriesOfIdeal R L k I = ⊥ }
357+
change sInf s = 0 ↔ _
358+
have hne : s ≠ ∅ := by
359+
obtain ⟨k, hk⟩ := id hI
360+
refine' Set.Nonempty.ne_empty ⟨k, _⟩
361+
rw [derivedSeries_def, LieIdeal.derivedSeries_eq_bot_iff] at hk ; exact hk
362+
simp [hne]
363+
#align lie_algebra.derived_length_zero LieAlgebra.derivedLength_zero
364+
365+
theorem abelian_of_solvable_ideal_eq_bot_iff (I : LieIdeal R L) [h : IsSolvable R I] :
366+
derivedAbelianOfIdeal I = ⊥ ↔ I = ⊥ := by
367+
dsimp only [derivedAbelianOfIdeal]
368+
split -- Porting note: Original tactic was `cases' h : derivedAbelianOfIdeal R L I with k`
369+
· rename_i h
370+
rw [derivedLength_zero] at h
371+
rw [h]
372+
· rename_i k h
373+
obtain ⟨_, h₂⟩ := (derivedSeries_of_derivedLength_succ R L I k).mp h
374+
have h₃ : I ≠ ⊥ := by intro contra; apply h₂; rw [contra]; apply derivedSeries_of_bot_eq_bot
375+
simp only [h₂, h₃]
376+
#align lie_algebra.abelian_of_solvable_ideal_eq_bot_iff LieAlgebra.abelian_of_solvable_ideal_eq_bot_iff
377+
378+
end LieAlgebra

0 commit comments

Comments
 (0)