Theorem: LieSubalgebra.isCartanSubalgebra_iff_isUcsLimit
File: Mathlib/Algebra/Lie/CartanSubalgebra.lean

tactic: constructor
state_before: R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
⊢ IsCartanSubalgebra H ↔ LieSubmodule.IsUcsLimit (toLieSubmodule H)

tactic: intro h
state_before: case mp
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
⊢ IsCartanSubalgebra H → LieSubmodule.IsUcsLimit (toLieSubmodule H)

tactic: have h₁ : LieAlgebra.IsNilpotent R H := by infer_instance
state_before: case mp
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
h : IsCartanSubalgebra H
⊢ LieSubmodule.IsUcsLimit (toLieSubmodule H)

tactic: obtain ⟨k, hk⟩ := H.toLieSubmodule.isNilpotent_iff_exists_self_le_ucs.mp h₁
state_before: case mp
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
h : IsCartanSubalgebra H
h₁ : LieAlgebra.IsNilpotent R { x // x ∈ H }
⊢ LieSubmodule.IsUcsLimit (toLieSubmodule H)

tactic: replace hk : H.toLieSubmodule = LieSubmodule.ucs k ⊥ :=
  le_antisymm hk
    (LieSubmodule.ucs_le_of_normalizer_eq_self H.normalizer_eq_self_of_isCartanSubalgebra k)
state_before: case mp.intro
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
h : IsCartanSubalgebra H
h₁ : LieAlgebra.IsNilpotent R { x // x ∈ H }
k : ℕ
hk : toLieSubmodule H ≤ LieSubmodule.ucs k ⊥
⊢ LieSubmodule.IsUcsLimit (toLieSubmodule H)

tactic: refine' ⟨k, fun l hl => _⟩
state_before: case mp.intro
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
h : IsCartanSubalgebra H
h₁ : LieAlgebra.IsNilpotent R { x // x ∈ H }
k : ℕ
hk : toLieSubmodule H = LieSubmodule.ucs k ⊥
⊢ LieSubmodule.IsUcsLimit (toLieSubmodule H)

tactic: rw [← Nat.sub_add_cancel hl, LieSubmodule.ucs_add, ← hk,
  LieSubalgebra.ucs_eq_self_of_isCartanSubalgebra]
state_before: case mp.intro
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
h : IsCartanSubalgebra H
h₁ : LieAlgebra.IsNilpotent R { x // x ∈ H }
k : ℕ
hk : toLieSubmodule H = LieSubmodule.ucs k ⊥
l : ℕ
hl : k ≤ l
⊢ LieSubmodule.ucs l ⊥ = toLieSubmodule H

tactic: infer_instance
state_before: R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
h : IsCartanSubalgebra H
⊢ LieAlgebra.IsNilpotent R { x // x ∈ H }

tactic: rintro ⟨k, hk⟩
state_before: case mpr
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
⊢ LieSubmodule.IsUcsLimit (toLieSubmodule H) → IsCartanSubalgebra H

tactic: exact
  { nilpotent := by
      dsimp only [LieAlgebra.IsNilpotent]
      erw [H.toLieSubmodule.isNilpotent_iff_exists_lcs_eq_bot]
      use k
      rw [_root_.eq_bot_iff, LieSubmodule.lcs_le_iff, hk k (le_refl k)]
    self_normalizing := by
      have hk' := hk (k + 1) k.le_succ
      rw [LieSubmodule.ucs_succ, hk k (le_refl k)] at hk'
      rw [← LieSubalgebra.coe_to_submodule_eq_iff, ← LieSubalgebra.coe_normalizer_eq_normalizer,
        hk', LieSubalgebra.coe_toLieSubmodule] }
state_before: case mpr.intro
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
k : ℕ
hk : ∀ (l : ℕ), k ≤ l → LieSubmodule.ucs l ⊥ = toLieSubmodule H
⊢ IsCartanSubalgebra H

tactic: dsimp only [LieAlgebra.IsNilpotent]
state_before: R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
k : ℕ
hk : ∀ (l : ℕ), k ≤ l → LieSubmodule.ucs l ⊥ = toLieSubmodule H
⊢ LieAlgebra.IsNilpotent R { x // x ∈ H }

tactic: erw [H.toLieSubmodule.isNilpotent_iff_exists_lcs_eq_bot]
state_before: R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
k : ℕ
hk : ∀ (l : ℕ), k ≤ l → LieSubmodule.ucs l ⊥ = toLieSubmodule H
⊢ LieModule.IsNilpotent R { x // x ∈ H } { x // x ∈ H }

tactic: use k
state_before: R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
k : ℕ
hk : ∀ (l : ℕ), k ≤ l → LieSubmodule.ucs l ⊥ = toLieSubmodule H
⊢ ∃ k, LieSubmodule.lcs k (toLieSubmodule H) = ⊥

tactic: rw [_root_.eq_bot_iff, LieSubmodule.lcs_le_iff, hk k (le_refl k)]
state_before: R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
k : ℕ
hk : ∀ (l : ℕ), k ≤ l → LieSubmodule.ucs l ⊥ = toLieSubmodule H
⊢ LieSubmodule.lcs k (toLieSubmodule H) = ⊥

tactic: have hk' := hk (k + 1) k.le_succ
state_before: R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
k : ℕ
hk : ∀ (l : ℕ), k ≤ l → LieSubmodule.ucs l ⊥ = toLieSubmodule H
⊢ normalizer H = H

tactic: rw [LieSubmodule.ucs_succ, hk k (le_refl k)] at hk'
state_before: R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
k : ℕ
hk : ∀ (l : ℕ), k ≤ l → LieSubmodule.ucs l ⊥ = toLieSubmodule H
hk' : LieSubmodule.ucs (k + 1) ⊥ = toLieSubmodule H
⊢ normalizer H = H

tactic: rw [← LieSubalgebra.coe_to_submodule_eq_iff, ← LieSubalgebra.coe_normalizer_eq_normalizer,
  hk', LieSubalgebra.coe_toLieSubmodule]
state_before: R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
k : ℕ
hk : ∀ (l : ℕ), k ≤ l → LieSubmodule.ucs l ⊥ = toLieSubmodule H
hk' : LieSubmodule.normalizer (toLieSubmodule H) = toLieSubmodule H
⊢ normalizer H = H