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

tactic: let sp : M → Submodule R M := fun a => span R {a}
state_before: R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.314027
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
⊢ FG s ↔ CompleteLattice.IsCompactElement s

tactic: have supr_rw : ∀ t : Finset M, (⨆ x ∈ t, sp x) = ⨆ x ∈ (↑t : Set M), sp x := fun t => by rfl
state_before: R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.314027
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
⊢ FG s ↔ CompleteLattice.IsCompactElement s

tactic: constructor
state_before: R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.314027
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), (⨆ (x : M) (_ : x ∈ t), sp x) = ⨆ (x : M) (_ : x ∈ ↑t), sp x
⊢ FG s ↔ CompleteLattice.IsCompactElement s

tactic: rfl
state_before: R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.314027
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
t : Finset M
⊢ (⨆ (x : M) (_ : x ∈ t), sp x) = ⨆ (x : M) (_ : x ∈ ↑t), sp x

tactic: rintro ⟨t, rfl⟩
state_before: case mp
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.314027
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), (⨆ (x : M) (_ : x ∈ t), sp x) = ⨆ (x : M) (_ : x ∈ ↑t), sp x
⊢ FG s → CompleteLattice.IsCompactElement s

tactic: rw [span_eq_iSup_of_singleton_spans, ← supr_rw, ← Finset.sup_eq_iSup t sp]
state_before: case mp.intro
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.314027
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), (⨆ (x : M) (_ : x ∈ t), sp x) = ⨆ (x : M) (_ : x ∈ ↑t), sp x
t : Finset M
⊢ CompleteLattice.IsCompactElement (span R ↑t)

tactic: apply CompleteLattice.finset_sup_compact_of_compact
state_before: case mp.intro
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.314027
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), (⨆ (x : M) (_ : x ∈ t), sp x) = ⨆ (x : M) (_ : x ∈ ↑t), sp x
t : Finset M
⊢ CompleteLattice.IsCompactElement (Finset.sup t sp)

tactic: exact fun n _ => singleton_span_isCompactElement n
state_before: case mp.intro.h
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.314027
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), (⨆ (x : M) (_ : x ∈ t), sp x) = ⨆ (x : M) (_ : x ∈ ↑t), sp x
t : Finset M
⊢ ∀ (x : M), x ∈ t → CompleteLattice.IsCompactElement (sp x)

tactic: intro h
state_before: case mpr
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.314027
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), (⨆ (x : M) (_ : x ∈ t), sp x) = ⨆ (x : M) (_ : x ∈ ↑t), sp x
⊢ CompleteLattice.IsCompactElement s → FG s

tactic: have sSup' : s = sSup (sp '' ↑s) := by
  rw [sSup_eq_iSup, iSup_image, ← span_eq_iSup_of_singleton_spans, eq_comm, span_eq]
state_before: case mpr
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.314027
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), (⨆ (x : M) (_ : x ∈ t), sp x) = ⨆ (x : M) (_ : x ∈ ↑t), sp x
h : CompleteLattice.IsCompactElement s
⊢ FG s

tactic: obtain ⟨u, ⟨huspan, husup⟩⟩ := h (sp '' ↑s) (le_of_eq sSup')
state_before: case mpr
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.314027
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), (⨆ (x : M) (_ : x ∈ t), sp x) = ⨆ (x : M) (_ : x ∈ ↑t), sp x
h : CompleteLattice.IsCompactElement s
sSup' : s = sSup (sp '' ↑s)
⊢ FG s

tactic: have ssup : s = u.sup id := by
  suffices : u.sup id ≤ s
  exact le_antisymm husup this
  rw [sSup', Finset.sup_id_eq_sSup]
  exact sSup_le_sSup huspan
state_before: case mpr.intro.intro
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.314027
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), (⨆ (x : M) (_ : x ∈ t), sp x) = ⨆ (x : M) (_ : x ∈ ↑t), sp x
h : CompleteLattice.IsCompactElement s
sSup' : s = sSup (sp '' ↑s)
u : Finset (Submodule R M)
huspan : ↑u ⊆ sp '' ↑s
husup : s ≤ Finset.sup u id
⊢ FG s

tactic: have := Finset.subset_image_iff.mp huspan
state_before: case mpr.intro.intro
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.314027
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), (⨆ (x : M) (_ : x ∈ t), sp x) = ⨆ (x : M) (_ : x ∈ ↑t), sp x
h : CompleteLattice.IsCompactElement s
sSup' : s = sSup (sp '' ↑s)
u : Finset (Submodule R M)
huspan : ↑u ⊆ sp '' ↑s
husup : s ≤ Finset.sup u id
ssup : s = Finset.sup u id
⊢ FG s

tactic: obtain ⟨t, ⟨-, rfl⟩⟩ := this
state_before: case mpr.intro.intro
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.314027
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), (⨆ (x : M) (_ : x ∈ t), sp x) = ⨆ (x : M) (_ : x ∈ ↑t), sp x
h : CompleteLattice.IsCompactElement s
sSup' : s = sSup (sp '' ↑s)
u : Finset (Submodule R M)
huspan : ↑u ⊆ sp '' ↑s
husup : s ≤ Finset.sup u id
ssup : s = Finset.sup u id
this : ∃ s', ↑s' ⊆ ↑s ∧ Finset.image sp s' = u
⊢ FG s

tactic: rw [Finset.sup_image, Function.comp.left_id, Finset.sup_eq_iSup, supr_rw, ←
  span_eq_iSup_of_singleton_spans, eq_comm] at ssup
state_before: case mpr.intro.intro.intro.intro
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.314027
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), (⨆ (x : M) (_ : x ∈ t), sp x) = ⨆ (x : M) (_ : x ∈ ↑t), sp x
h : CompleteLattice.IsCompactElement s
sSup' : s = sSup (sp '' ↑s)
t : Finset M
huspan : ↑(Finset.image sp t) ⊆ sp '' ↑s
husup : s ≤ Finset.sup (Finset.image sp t) id
ssup : s = Finset.sup (Finset.image sp t) id
⊢ FG s

tactic: exact ⟨t, ssup⟩
state_before: case mpr.intro.intro.intro.intro
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.314027
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), (⨆ (x : M) (_ : x ∈ t), sp x) = ⨆ (x : M) (_ : x ∈ ↑t), sp x
h : CompleteLattice.IsCompactElement s
sSup' : s = sSup (sp '' ↑s)
t : Finset M
huspan : ↑(Finset.image sp t) ⊆ sp '' ↑s
husup : s ≤ Finset.sup (Finset.image sp t) id
ssup : span R ↑t = s
⊢ FG s

tactic: rw [sSup_eq_iSup, iSup_image, ← span_eq_iSup_of_singleton_spans, eq_comm, span_eq]
state_before: R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.314027
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), (⨆ (x : M) (_ : x ∈ t), sp x) = ⨆ (x : M) (_ : x ∈ ↑t), sp x
h : CompleteLattice.IsCompactElement s
⊢ s = sSup (sp '' ↑s)

tactic: suffices : u.sup id ≤ s
state_before: R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.314027
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), (⨆ (x : M) (_ : x ∈ t), sp x) = ⨆ (x : M) (_ : x ∈ ↑t), sp x
h : CompleteLattice.IsCompactElement s
sSup' : s = sSup (sp '' ↑s)
u : Finset (Submodule R M)
huspan : ↑u ⊆ sp '' ↑s
husup : s ≤ Finset.sup u id
⊢ s = Finset.sup u id

tactic: exact le_antisymm husup this
state_before: R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.314027
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), (⨆ (x : M) (_ : x ∈ t), sp x) = ⨆ (x : M) (_ : x ∈ ↑t), sp x
h : CompleteLattice.IsCompactElement s
sSup' : s = sSup (sp '' ↑s)
u : Finset (Submodule R M)
huspan : ↑u ⊆ sp '' ↑s
husup : s ≤ Finset.sup u id
this : Finset.sup u id ≤ s
⊢ s = Finset.sup u id

case this
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.314027
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), (⨆ (x : M) (_ : x ∈ t), sp x) = ⨆ (x : M) (_ : x ∈ ↑t), sp x
h : CompleteLattice.IsCompactElement s
sSup' : s = sSup (sp '' ↑s)
u : Finset (Submodule R M)
huspan : ↑u ⊆ sp '' ↑s
husup : s ≤ Finset.sup u id
⊢ Finset.sup u id ≤ s

tactic: rw [sSup', Finset.sup_id_eq_sSup]
state_before: case this
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.314027
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), (⨆ (x : M) (_ : x ∈ t), sp x) = ⨆ (x : M) (_ : x ∈ ↑t), sp x
h : CompleteLattice.IsCompactElement s
sSup' : s = sSup (sp '' ↑s)
u : Finset (Submodule R M)
huspan : ↑u ⊆ sp '' ↑s
husup : s ≤ Finset.sup u id
⊢ Finset.sup u id ≤ s

tactic: exact sSup_le_sSup huspan
state_before: case this
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.314027
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), (⨆ (x : M) (_ : x ∈ t), sp x) = ⨆ (x : M) (_ : x ∈ ↑t), sp x
h : CompleteLattice.IsCompactElement s
sSup' : s = sSup (sp '' ↑s)
u : Finset (Submodule R M)
huspan : ↑u ⊆ sp '' ↑s
husup : s ≤ Finset.sup u id
⊢ sSup ↑u ≤ sSup (sp '' ↑s)