Theorem: LinearMap.eventually_iSup_ker_pow_eq
File: Mathlib/RingTheory/Noetherian.lean

tactic: obtain ⟨n, hn : ∀ m, n ≤ m → ker (f ^ n) = ker (f ^ m)⟩ :=
  monotone_stabilizes_iff_noetherian.mpr inferInstance f.iterateKer
state_before: R : Type u_1
M : Type u_2
P : Type u_3
N : Type w
inst✝⁷ : Ring R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup P
inst✝¹ : Module R P
inst✝ : IsNoetherian R M
f : M →ₗ[R] M
⊢ ∀ᶠ (n : ℕ) in atTop, ⨆ m, ker (f ^ m) = ker (f ^ n)
state_after: case intro
R : Type u_1
M : Type u_2
P : Type u_3
N : Type w
inst✝⁷ : Ring R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup P
inst✝¹ : Module R P
inst✝ : IsNoetherian R M
f : M →ₗ[R] M
n : ℕ
hn : ∀ (m : ℕ), n ≤ m → ker (f ^ n) = ker (f ^ m)
⊢ ∀ᶠ (n : ℕ) in atTop, ⨆ m, ker (f ^ m) = ker (f ^ n)

tactic: refine eventually_atTop.mpr ⟨n, fun m hm ↦ ?_⟩
state_before: case intro
R : Type u_1
M : Type u_2
P : Type u_3
N : Type w
inst✝⁷ : Ring R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup P
inst✝¹ : Module R P
inst✝ : IsNoetherian R M
f : M →ₗ[R] M
n : ℕ
hn : ∀ (m : ℕ), n ≤ m → ker (f ^ n) = ker (f ^ m)
⊢ ∀ᶠ (n : ℕ) in atTop, ⨆ m, ker (f ^ m) = ker (f ^ n)
state_after: case intro
R : Type u_1
M : Type u_2
P : Type u_3
N : Type w
inst✝⁷ : Ring R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup P
inst✝¹ : Module R P
inst✝ : IsNoetherian R M
f : M →ₗ[R] M
n : ℕ
hn : ∀ (m : ℕ), n ≤ m → ker (f ^ n) = ker (f ^ m)
m : ℕ
hm : m ≥ n
⊢ ⨆ m, ker (f ^ m) = ker (f ^ m)

tactic: refine le_antisymm (iSup_le fun l ↦ ?_) (le_iSup (fun i ↦ LinearMap.ker (f ^ i)) m)
state_before: case intro
R : Type u_1
M : Type u_2
P : Type u_3
N : Type w
inst✝⁷ : Ring R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup P
inst✝¹ : Module R P
inst✝ : IsNoetherian R M
f : M →ₗ[R] M
n : ℕ
hn : ∀ (m : ℕ), n ≤ m → ker (f ^ n) = ker (f ^ m)
m : ℕ
hm : m ≥ n
⊢ ⨆ m, ker (f ^ m) = ker (f ^ m)
state_after: case intro
R : Type u_1
M : Type u_2
P : Type u_3
N : Type w
inst✝⁷ : Ring R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup P
inst✝¹ : Module R P
inst✝ : IsNoetherian R M
f : M →ₗ[R] M
n : ℕ
hn : ∀ (m : ℕ), n ≤ m → ker (f ^ n) = ker (f ^ m)
m : ℕ
hm : m ≥ n
l : ℕ
⊢ ker (f ^ l) ≤ ker (f ^ m)

tactic: rcases le_or_lt m l with h | h
state_before: case intro
R : Type u_1
M : Type u_2
P : Type u_3
N : Type w
inst✝⁷ : Ring R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup P
inst✝¹ : Module R P
inst✝ : IsNoetherian R M
f : M →ₗ[R] M
n : ℕ
hn : ∀ (m : ℕ), n ≤ m → ker (f ^ n) = ker (f ^ m)
m : ℕ
hm : m ≥ n
l : ℕ
⊢ ker (f ^ l) ≤ ker (f ^ m)
state_after: case intro.inl
R : Type u_1
M : Type u_2
P : Type u_3
N : Type w
inst✝⁷ : Ring R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup P
inst✝¹ : Module R P
inst✝ : IsNoetherian R M
f : M →ₗ[R] M
n : ℕ
hn : ∀ (m : ℕ), n ≤ m → ker (f ^ n) = ker (f ^ m)
m : ℕ
hm : m ≥ n
l : ℕ
h : m ≤ l
⊢ ker (f ^ l) ≤ ker (f ^ m)

case intro.inr
R : Type u_1
M : Type u_2
P : Type u_3
N : Type w
inst✝⁷ : Ring R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup P
inst✝¹ : Module R P
inst✝ : IsNoetherian R M
f : M →ₗ[R] M
n : ℕ
hn : ∀ (m : ℕ), n ≤ m → ker (f ^ n) = ker (f ^ m)
m : ℕ
hm : m ≥ n
l : ℕ
h : l < m
⊢ ker (f ^ l) ≤ ker (f ^ m)

tactic: rw [← hn _ (hm.trans h), hn _ hm]
state_before: case intro.inl
R : Type u_1
M : Type u_2
P : Type u_3
N : Type w
inst✝⁷ : Ring R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup P
inst✝¹ : Module R P
inst✝ : IsNoetherian R M
f : M →ₗ[R] M
n : ℕ
hn : ∀ (m : ℕ), n ≤ m → ker (f ^ n) = ker (f ^ m)
m : ℕ
hm : m ≥ n
l : ℕ
h : m ≤ l
⊢ ker (f ^ l) ≤ ker (f ^ m)
state_after: no goals

tactic: exact f.iterateKer.monotone h.le
state_before: case intro.inr
R : Type u_1
M : Type u_2
P : Type u_3
N : Type w
inst✝⁷ : Ring R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup P
inst✝¹ : Module R P
inst✝ : IsNoetherian R M
f : M →ₗ[R] M
n : ℕ
hn : ∀ (m : ℕ), n ≤ m → ker (f ^ n) = ker (f ^ m)
m : ℕ
hm : m ≥ n
l : ℕ
h : l < m
⊢ ker (f ^ l) ≤ ker (f ^ m)
state_after: no goals