Theorem: Submodule.fg_unit
File: Mathlib/RingTheory/Finiteness.lean

tactic: have : (1 : A) ∈ (I * ↑I⁻¹ : Submodule R A) := by
  rw [I.mul_inv]
  exact one_le.mp le_rfl
state_before: R✝ : Type ?u.75765
M : Type ?u.75768
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_1
A : Type u_2
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
I : (Submodule R A)ˣ
⊢ FG ↑I

tactic: obtain ⟨T, T', hT, hT', one_mem⟩ := mem_span_mul_finite_of_mem_mul this
state_before: R✝ : Type ?u.75765
M : Type ?u.75768
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_1
A : Type u_2
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
I : (Submodule R A)ˣ
this : 1 ∈ ↑I * ↑I⁻¹
⊢ FG ↑I

tactic: refine' ⟨T, span_eq_of_le _ hT _⟩
state_before: case intro.intro.intro.intro
R✝ : Type ?u.75765
M : Type ?u.75768
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_1
A : Type u_2
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
I : (Submodule R A)ˣ
this : 1 ∈ ↑I * ↑I⁻¹
T T' : Finset A
hT : ↑T ⊆ ↑↑I
hT' : ↑T' ⊆ ↑↑I⁻¹
one_mem : 1 ∈ span R (↑T * ↑T')
⊢ FG ↑I

tactic: rw [← one_mul I, ← mul_one (span R (T : Set A))]
state_before: case intro.intro.intro.intro
R✝ : Type ?u.75765
M : Type ?u.75768
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_1
A : Type u_2
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
I : (Submodule R A)ˣ
this : 1 ∈ ↑I * ↑I⁻¹
T T' : Finset A
hT : ↑T ⊆ ↑↑I
hT' : ↑T' ⊆ ↑↑I⁻¹
one_mem : 1 ∈ span R (↑T * ↑T')
⊢ ↑I ≤ span R ↑T

tactic: conv_rhs => rw [← I.inv_mul, ← mul_assoc]
state_before: case intro.intro.intro.intro
R✝ : Type ?u.75765
M : Type ?u.75768
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_1
A : Type u_2
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
I : (Submodule R A)ˣ
this : 1 ∈ ↑I * ↑I⁻¹
T T' : Finset A
hT : ↑T ⊆ ↑↑I
hT' : ↑T' ⊆ ↑↑I⁻¹
one_mem : 1 ∈ span R (↑T * ↑T')
⊢ ↑(1 * I) ≤ span R ↑T * 1

tactic: refine' mul_le_mul_left (le_trans _ <| mul_le_mul_right <| span_le.mpr hT')
state_before: case intro.intro.intro.intro
R✝ : Type ?u.75765
M : Type ?u.75768
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_1
A : Type u_2
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
I : (Submodule R A)ˣ
this : 1 ∈ ↑I * ↑I⁻¹
T T' : Finset A
hT : ↑T ⊆ ↑↑I
hT' : ↑T' ⊆ ↑↑I⁻¹
one_mem : 1 ∈ span R (↑T * ↑T')
⊢ ↑(1 * I) ≤ span R ↑T * ↑I⁻¹ * ↑I

tactic: simp only [Units.val_one, span_mul_span]
state_before: case intro.intro.intro.intro
R✝ : Type ?u.75765
M : Type ?u.75768
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_1
A : Type u_2
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
I : (Submodule R A)ˣ
this : 1 ∈ ↑I * ↑I⁻¹
T T' : Finset A
hT : ↑T ⊆ ↑↑I
hT' : ↑T' ⊆ ↑↑I⁻¹
one_mem : 1 ∈ span R (↑T * ↑T')
⊢ ↑1 ≤ span R ↑T * span R ↑T'

tactic: rwa [one_le]
state_before: case intro.intro.intro.intro
R✝ : Type ?u.75765
M : Type ?u.75768
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_1
A : Type u_2
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
I : (Submodule R A)ˣ
this : 1 ∈ ↑I * ↑I⁻¹
T T' : Finset A
hT : ↑T ⊆ ↑↑I
hT' : ↑T' ⊆ ↑↑I⁻¹
one_mem : 1 ∈ span R (↑T * ↑T')
⊢ 1 ≤ span R (↑T * ↑T')

tactic: rw [I.mul_inv]
state_before: R✝ : Type ?u.75765
M : Type ?u.75768
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_1
A : Type u_2
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
I : (Submodule R A)ˣ
⊢ 1 ∈ ↑I * ↑I⁻¹

tactic: exact one_le.mp le_rfl
state_before: R✝ : Type ?u.75765
M : Type ?u.75768
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_1
A : Type u_2
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
I : (Submodule R A)ˣ
⊢ 1 ∈ 1