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

tactic: induction x with
| zero => exact ⟨⊥, fg_bot, zero_le _, 0, rfl⟩
| tmul i m => exact ⟨R ∙ i.val, fg_span_singleton i.val,
    (span_singleton_le_iff_mem _ _).mpr i.property,
    ⟨i.val, mem_span_singleton_self _⟩ ⊗ₜ[R] m, rfl⟩
| add x₁ x₂ ihx₁ ihx₂ =>
  obtain ⟨J₁, hfg₁, hle₁, y₁, rfl⟩ := ihx₁
  obtain ⟨J₂, hfg₂, hle₂, y₂, rfl⟩ := ihx₂
  refine ⟨J₁ ⊔ J₂, hfg₁.sup hfg₂, sup_le hle₁ hle₂,
    rTensor M (J₁.inclusion (le_sup_left : J₁ ≤ J₁ ⊔ J₂)) y₁ +
      rTensor M (J₂.inclusion (le_sup_right : J₂ ≤ J₁ ⊔ J₂)) y₂, ?_⟩
  rewrite [map_add, ← rTensor_comp_apply, ← rTensor_comp_apply]
  rfl
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
N : Type u_6
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
I : Submodule R N
x : ↥I ⊗[R] M
⊢ ∃ J, ∃ (_ : J.FG) (hle : J ≤ I), ∃ y, x = (rTensor M (inclusion hle)) y
state_after: no goals

tactic: exact ⟨⊥, fg_bot, zero_le _, 0, rfl⟩
state_before: case zero
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
N : Type u_6
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
I : Submodule R N
⊢ ∃ J, ∃ (_ : J.FG) (hle : J ≤ I), ∃ y, 0 = (rTensor M (inclusion hle)) y
state_after: no goals

tactic: exact ⟨R ∙ i.val, fg_span_singleton i.val,
(span_singleton_le_iff_mem _ _).mpr i.property,
⟨i.val, mem_span_singleton_self _⟩ ⊗ₜ[R] m, rfl⟩
state_before: case tmul
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
N : Type u_6
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
I : Submodule R N
i : ↥I
m : M
⊢ ∃ J, ∃ (_ : J.FG) (hle : J ≤ I), ∃ y, i ⊗ₜ[R] m = (rTensor M (inclusion hle)) y
state_after: no goals

tactic: obtain ⟨J₁, hfg₁, hle₁, y₁, rfl⟩ := ihx₁
state_before: case add
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
N : Type u_6
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
I : Submodule R N
x₁ x₂ : ↥I ⊗[R] M
ihx₁ : ∃ J, ∃ (_ : J.FG) (hle : J ≤ I), ∃ y, x₁ = (rTensor M (inclusion hle)) y
ihx₂ : ∃ J, ∃ (_ : J.FG) (hle : J ≤ I), ∃ y, x₂ = (rTensor M (inclusion hle)) y
⊢ ∃ J, ∃ (_ : J.FG) (hle : J ≤ I), ∃ y, x₁ + x₂ = (rTensor M (inclusion hle)) y
state_after: case add.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_3
inst✝⁶ : AddCommMonoid P
inst✝⁵ : Module R✝ P
f : M✝ →ₗ[R✝] P
R : Type u_4
M : Type u_5
N : Type u_6
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
I : Submodule R N
x₂ : ↥I ⊗[R] M
ihx₂ : ∃ J, ∃ (_ : J.FG) (hle : J ≤ I), ∃ y, x₂ = (rTensor M (inclusion hle)) y
J₁ : Submodule R N
hfg₁ : J₁.FG
hle₁ : J₁ ≤ I
y₁ : ↥J₁ ⊗[R] M
⊢ ∃ J, ∃ (_ : J.FG) (hle : J ≤ I), ∃ y, (rTensor M (inclusion hle₁)) y₁ + x₂ = (rTensor M (inclusion hle)) y

tactic: obtain ⟨J₂, hfg₂, hle₂, y₂, rfl⟩ := ihx₂
state_before: case add.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_3
inst✝⁶ : AddCommMonoid P
inst✝⁵ : Module R✝ P
f : M✝ →ₗ[R✝] P
R : Type u_4
M : Type u_5
N : Type u_6
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
I : Submodule R N
x₂ : ↥I ⊗[R] M
ihx₂ : ∃ J, ∃ (_ : J.FG) (hle : J ≤ I), ∃ y, x₂ = (rTensor M (inclusion hle)) y
J₁ : Submodule R N
hfg₁ : J₁.FG
hle₁ : J₁ ≤ I
y₁ : ↥J₁ ⊗[R] M
⊢ ∃ J, ∃ (_ : J.FG) (hle : J ≤ I), ∃ y, (rTensor M (inclusion hle₁)) y₁ + x₂ = (rTensor M (inclusion hle)) y
state_after: case add.intro.intro.intro.intro.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_3
inst✝⁶ : AddCommMonoid P
inst✝⁵ : Module R✝ P
f : M✝ →ₗ[R✝] P
R : Type u_4
M : Type u_5
N : Type u_6
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
I J₁ : Submodule R N
hfg₁ : J₁.FG
hle₁ : J₁ ≤ I
y₁ : ↥J₁ ⊗[R] M
J₂ : Submodule R N
hfg₂ : J₂.FG
hle₂ : J₂ ≤ I
y₂ : ↥J₂ ⊗[R] M
⊢ ∃ J,
    ∃ (_ : J.FG) (hle : J ≤ I),
      ∃ y, (rTensor M (inclusion hle₁)) y₁ + (rTensor M (inclusion hle₂)) y₂ = (rTensor M (inclusion hle)) y

tactic: refine ⟨J₁ ⊔ J₂, hfg₁.sup hfg₂, sup_le hle₁ hle₂,
  rTensor M (J₁.inclusion (le_sup_left : J₁ ≤ J₁ ⊔ J₂)) y₁ +
    rTensor M (J₂.inclusion (le_sup_right : J₂ ≤ J₁ ⊔ J₂)) y₂, ?_⟩
state_before: case add.intro.intro.intro.intro.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_3
inst✝⁶ : AddCommMonoid P
inst✝⁵ : Module R✝ P
f : M✝ →ₗ[R✝] P
R : Type u_4
M : Type u_5
N : Type u_6
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
I J₁ : Submodule R N
hfg₁ : J₁.FG
hle₁ : J₁ ≤ I
y₁ : ↥J₁ ⊗[R] M
J₂ : Submodule R N
hfg₂ : J₂.FG
hle₂ : J₂ ≤ I
y₂ : ↥J₂ ⊗[R] M
⊢ ∃ J,
    ∃ (_ : J.FG) (hle : J ≤ I),
      ∃ y, (rTensor M (inclusion hle₁)) y₁ + (rTensor M (inclusion hle₂)) y₂ = (rTensor M (inclusion hle)) y
state_after: case add.intro.intro.intro.intro.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_3
inst✝⁶ : AddCommMonoid P
inst✝⁵ : Module R✝ P
f : M✝ →ₗ[R✝] P
R : Type u_4
M : Type u_5
N : Type u_6
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
I J₁ : Submodule R N
hfg₁ : J₁.FG
hle₁ : J₁ ≤ I
y₁ : ↥J₁ ⊗[R] M
J₂ : Submodule R N
hfg₂ : J₂.FG
hle₂ : J₂ ≤ I
y₂ : ↥J₂ ⊗[R] M
⊢ (rTensor M (inclusion hle₁)) y₁ + (rTensor M (inclusion hle₂)) y₂ =
    (rTensor M (inclusion ⋯)) ((rTensor M (inclusion ⋯)) y₁ + (rTensor M (inclusion ⋯)) y₂)

tactic: rewrite [map_add, ← rTensor_comp_apply, ← rTensor_comp_apply]
state_before: case add.intro.intro.intro.intro.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_3
inst✝⁶ : AddCommMonoid P
inst✝⁵ : Module R✝ P
f : M✝ →ₗ[R✝] P
R : Type u_4
M : Type u_5
N : Type u_6
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
I J₁ : Submodule R N
hfg₁ : J₁.FG
hle₁ : J₁ ≤ I
y₁ : ↥J₁ ⊗[R] M
J₂ : Submodule R N
hfg₂ : J₂.FG
hle₂ : J₂ ≤ I
y₂ : ↥J₂ ⊗[R] M
⊢ (rTensor M (inclusion hle₁)) y₁ + (rTensor M (inclusion hle₂)) y₂ =
    (rTensor M (inclusion ⋯)) ((rTensor M (inclusion ⋯)) y₁ + (rTensor M (inclusion ⋯)) y₂)
state_after: case add.intro.intro.intro.intro.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_3
inst✝⁶ : AddCommMonoid P
inst✝⁵ : Module R✝ P
f : M✝ →ₗ[R✝] P
R : Type u_4
M : Type u_5
N : Type u_6
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
I J₁ : Submodule R N
hfg₁ : J₁.FG
hle₁ : J₁ ≤ I
y₁ : ↥J₁ ⊗[R] M
J₂ : Submodule R N
hfg₂ : J₂.FG
hle₂ : J₂ ≤ I
y₂ : ↥J₂ ⊗[R] M
⊢ (rTensor M (inclusion hle₁)) y₁ + (rTensor M (inclusion hle₂)) y₂ =
    (rTensor M (inclusion ⋯ ∘ₗ inclusion ⋯)) y₁ + (rTensor M (inclusion ⋯ ∘ₗ inclusion ⋯)) y₂

tactic: rfl
state_before: case add.intro.intro.intro.intro.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_3
inst✝⁶ : AddCommMonoid P
inst✝⁵ : Module R✝ P
f : M✝ →ₗ[R✝] P
R : Type u_4
M : Type u_5
N : Type u_6
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
I J₁ : Submodule R N
hfg₁ : J₁.FG
hle₁ : J₁ ≤ I
y₁ : ↥J₁ ⊗[R] M
J₂ : Submodule R N
hfg₂ : J₂.FG
hle₂ : J₂ ≤ I
y₂ : ↥J₂ ⊗[R] M
⊢ (rTensor M (inclusion hle₁)) y₁ + (rTensor M (inclusion hle₂)) y₂ =
    (rTensor M (inclusion ⋯ ∘ₗ inclusion ⋯)) y₁ + (rTensor M (inclusion ⋯ ∘ₗ inclusion ⋯)) y₂
state_after: no goals