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

tactic: obtain ⟨s, rfl⟩ := hN
state_before: R✝ : Type u_1
M✝ : Type u_2
inst✝⁷ : Semiring R✝
inst✝⁶ : AddCommMonoid M✝
inst✝⁵ : Module R✝ M✝
P✝ : Type u_3
inst✝⁴ : AddCommMonoid P✝
inst✝³ : Module R✝ P✝
f : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
P : Submodule R M → Prop
h₁ : ∀ (x : M), P (span R {x})
h₂ : ∀ (M₁ M₂ : Submodule R M), P M₁ → P M₂ → P (M₁ ⊔ M₂)
N : Submodule R M
hN : N.FG
⊢ P N
state_after: case intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁷ : Semiring R✝
inst✝⁶ : AddCommMonoid M✝
inst✝⁵ : Module R✝ M✝
P✝ : Type u_3
inst✝⁴ : AddCommMonoid P✝
inst✝³ : Module R✝ P✝
f : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
P : Submodule R M → Prop
h₁ : ∀ (x : M), P (span R {x})
h₂ : ∀ (M₁ M₂ : Submodule R M), P M₁ → P M₂ → P (M₁ ⊔ M₂)
s : Finset M
⊢ P (span R ↑s)

tactic: induction s using Finset.induction
state_before: case intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁷ : Semiring R✝
inst✝⁶ : AddCommMonoid M✝
inst✝⁵ : Module R✝ M✝
P✝ : Type u_3
inst✝⁴ : AddCommMonoid P✝
inst✝³ : Module R✝ P✝
f : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
P : Submodule R M → Prop
h₁ : ∀ (x : M), P (span R {x})
h₂ : ∀ (M₁ M₂ : Submodule R M), P M₁ → P M₂ → P (M₁ ⊔ M₂)
s : Finset M
⊢ P (span R ↑s)
state_after: case intro.empty
R✝ : Type u_1
M✝ : Type u_2
inst✝⁷ : Semiring R✝
inst✝⁶ : AddCommMonoid M✝
inst✝⁵ : Module R✝ M✝
P✝ : Type u_3
inst✝⁴ : AddCommMonoid P✝
inst✝³ : Module R✝ P✝
f : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
P : Submodule R M → Prop
h₁ : ∀ (x : M), P (span R {x})
h₂ : ∀ (M₁ M₂ : Submodule R M), P M₁ → P M₂ → P (M₁ ⊔ M₂)
⊢ P (span R ↑∅)

case intro.insert
R✝ : Type u_1
M✝ : Type u_2
inst✝⁷ : Semiring R✝
inst✝⁶ : AddCommMonoid M✝
inst✝⁵ : Module R✝ M✝
P✝ : Type u_3
inst✝⁴ : AddCommMonoid P✝
inst✝³ : Module R✝ P✝
f : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
P : Submodule R M → Prop
h₁ : ∀ (x : M), P (span R {x})
h₂ : ∀ (M₁ M₂ : Submodule R M), P M₁ → P M₂ → P (M₁ ⊔ M₂)
a✝² : M
s✝ : Finset M
a✝¹ : a✝² ∉ s✝
a✝ : P (span R ↑s✝)
⊢ P (span R ↑(insert a✝² s✝))

tactic: rw [Finset.coe_empty, Submodule.span_empty, ← Submodule.span_zero_singleton]
state_before: case intro.empty
R✝ : Type u_1
M✝ : Type u_2
inst✝⁷ : Semiring R✝
inst✝⁶ : AddCommMonoid M✝
inst✝⁵ : Module R✝ M✝
P✝ : Type u_3
inst✝⁴ : AddCommMonoid P✝
inst✝³ : Module R✝ P✝
f : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
P : Submodule R M → Prop
h₁ : ∀ (x : M), P (span R {x})
h₂ : ∀ (M₁ M₂ : Submodule R M), P M₁ → P M₂ → P (M₁ ⊔ M₂)
⊢ P (span R ↑∅)
state_after: case intro.empty
R✝ : Type u_1
M✝ : Type u_2
inst✝⁷ : Semiring R✝
inst✝⁶ : AddCommMonoid M✝
inst✝⁵ : Module R✝ M✝
P✝ : Type u_3
inst✝⁴ : AddCommMonoid P✝
inst✝³ : Module R✝ P✝
f : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
P : Submodule R M → Prop
h₁ : ∀ (x : M), P (span R {x})
h₂ : ∀ (M₁ M₂ : Submodule R M), P M₁ → P M₂ → P (M₁ ⊔ M₂)
⊢ P (span R {0})

tactic: apply h₁
state_before: case intro.empty
R✝ : Type u_1
M✝ : Type u_2
inst✝⁷ : Semiring R✝
inst✝⁶ : AddCommMonoid M✝
inst✝⁵ : Module R✝ M✝
P✝ : Type u_3
inst✝⁴ : AddCommMonoid P✝
inst✝³ : Module R✝ P✝
f : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
P : Submodule R M → Prop
h₁ : ∀ (x : M), P (span R {x})
h₂ : ∀ (M₁ M₂ : Submodule R M), P M₁ → P M₂ → P (M₁ ⊔ M₂)
⊢ P (span R {0})
state_after: no goals

tactic: rw [Finset.coe_insert, Submodule.span_insert]
state_before: case intro.insert
R✝ : Type u_1
M✝ : Type u_2
inst✝⁷ : Semiring R✝
inst✝⁶ : AddCommMonoid M✝
inst✝⁵ : Module R✝ M✝
P✝ : Type u_3
inst✝⁴ : AddCommMonoid P✝
inst✝³ : Module R✝ P✝
f : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
P : Submodule R M → Prop
h₁ : ∀ (x : M), P (span R {x})
h₂ : ∀ (M₁ M₂ : Submodule R M), P M₁ → P M₂ → P (M₁ ⊔ M₂)
a✝² : M
s✝ : Finset M
a✝¹ : a✝² ∉ s✝
a✝ : P (span R ↑s✝)
⊢ P (span R ↑(insert a✝² s✝))
state_after: case intro.insert
R✝ : Type u_1
M✝ : Type u_2
inst✝⁷ : Semiring R✝
inst✝⁶ : AddCommMonoid M✝
inst✝⁵ : Module R✝ M✝
P✝ : Type u_3
inst✝⁴ : AddCommMonoid P✝
inst✝³ : Module R✝ P✝
f : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
P : Submodule R M → Prop
h₁ : ∀ (x : M), P (span R {x})
h₂ : ∀ (M₁ M₂ : Submodule R M), P M₁ → P M₂ → P (M₁ ⊔ M₂)
a✝² : M
s✝ : Finset M
a✝¹ : a✝² ∉ s✝
a✝ : P (span R ↑s✝)
⊢ P (span R {a✝²} ⊔ span R ↑s✝)

tactic: apply h₂ <;> apply_assumption
state_before: case intro.insert
R✝ : Type u_1
M✝ : Type u_2
inst✝⁷ : Semiring R✝
inst✝⁶ : AddCommMonoid M✝
inst✝⁵ : Module R✝ M✝
P✝ : Type u_3
inst✝⁴ : AddCommMonoid P✝
inst✝³ : Module R✝ P✝
f : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
P : Submodule R M → Prop
h₁ : ∀ (x : M), P (span R {x})
h₂ : ∀ (M₁ M₂ : Submodule R M), P M₁ → P M₂ → P (M₁ ⊔ M₂)
a✝² : M
s✝ : Finset M
a✝¹ : a✝² ∉ s✝
a✝ : P (span R ↑s✝)
⊢ P (span R {a✝²} ⊔ span R ↑s✝)
state_after: no goals