-- Mathlib/LinearAlgebra/Prod.lean
theorem map_coprod_prod (f : M →ₗ[R] M₃) (g : M₂ →ₗ[R] M₃) (p : Submodule R M)
    (q : Submodule R M₂) : map (coprod f g) (p.prod q) = map f p ⊔ map g q

Proof state:
R : Type u
M : Type v
M₂ : Type w
M₃ : Type y
inst✝⁶ : Semiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M₂
inst✝³ : AddCommMonoid M₃
inst✝² : Module R M
inst✝¹ : Module R M₂
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
p : Submodule R M
q : Submodule R M₂
x : M₂
hx : x ∈ q
⊢ (0, x) ∈ ↑(p.prod q) ∧ (f.coprod g) (0, x) = g x

Tactic:
simp [hx]

Result:
no goals

Proof state:
R : Type u
M : Type v
M₂ : Type w
M₃ : Type y
inst✝⁶ : Semiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M₂
inst✝³ : AddCommMonoid M₃
inst✝² : Module R M
inst✝¹ : Module R M₂
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
p : Submodule R M
q : Submodule R M₂
x : M
hx : x ∈ p
⊢ (x, 0) ∈ ↑(p.prod q) ∧ (f.coprod g) (x, 0) = f x

Tactic:
simp [hx]

Result:
no goals

Proof state:
case refine_2
R : Type u
M : Type v
M₂ : Type w
M₃ : Type y
inst✝⁶ : Semiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M₂
inst✝³ : AddCommMonoid M₃
inst✝² : Module R M
inst✝¹ : Module R M₂
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
p : Submodule R M
q : Submodule R M₂
⊢ p ≤ comap f (map (f.coprod g) (p.prod q))

Tactic:
exact fun x hx => ⟨(x, 0), by simp [hx]⟩

Result:
no goals

Proof state:
case refine_1
R : Type u
M : Type v
M₂ : Type w
M₃ : Type y
inst✝⁶ : Semiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M₂
inst✝³ : AddCommMonoid M₃
inst✝² : Module R M
inst✝¹ : Module R M₂
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
p : Submodule R M
q : Submodule R M₂
⊢ ∀ ⦃x : M₃⦄, x ∈ map (f.coprod g) (p.prod q) → x ∈ map f p ⊔ map g q

Tactic:
rintro _ ⟨x, ⟨h₁, h₂⟩, rfl⟩

Result:
case refine_1.intro.intro.intro
R : Type u
M : Type v
M₂ : Type w
M₃ : Type y
inst✝⁶ : Semiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M₂
inst✝³ : AddCommMonoid M₃
inst✝² : Module R M
inst✝¹ : Module R M₂
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
p : Submodule R M
q : Submodule R M₂
x : M × M₂
h₁ : x.1 ∈ ↑p
h₂ : x.2 ∈ ↑q
⊢ (f.coprod g) x ∈ map f p ⊔ map g q

Proof state:
case refine_1
R : Type u
M : Type v
M₂ : Type w
M₃ : Type y
inst✝⁶ : Semiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M₂
inst✝³ : AddCommMonoid M₃
inst✝² : Module R M
inst✝¹ : Module R M₂
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
p : Submodule R M
q : Submodule R M₂
⊢ map (f.coprod g) (p.prod q) ≤ map f p ⊔ map g q

Tactic:
rw [SetLike.le_def]

Result:
case refine_1
R : Type u
M : Type v
M₂ : Type w
M₃ : Type y
inst✝⁶ : Semiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M₂
inst✝³ : AddCommMonoid M₃
inst✝² : Module R M
inst✝¹ : Module R M₂
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
p : Submodule R M
q : Submodule R M₂
⊢ ∀ ⦃x : M₃⦄, x ∈ map (f.coprod g) (p.prod q) → x ∈ map f p ⊔ map g q

Proof state:
R : Type u
M : Type v
M₂ : Type w
M₃ : Type y
inst✝⁶ : Semiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M₂
inst✝³ : AddCommMonoid M₃
inst✝² : Module R M
inst✝¹ : Module R M₂
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
p : Submodule R M
q : Submodule R M₂
⊢ map (f.coprod g) (p.prod q) = map f p ⊔ map g q

Tactic:
refine le_antisymm ?_ (sup_le (map_le_iff_le_comap.2 ?_) (map_le_iff_le_comap.2 ?_))

Result:
case refine_1
R : Type u
M : Type v
M₂ : Type w
M₃ : Type y
inst✝⁶ : Semiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M₂
inst✝³ : AddCommMonoid M₃
inst✝² : Module R M
inst✝¹ : Module R M₂
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
p : Submodule R M
q : Submodule R M₂
⊢ map (f.coprod g) (p.prod q) ≤ map f p ⊔ map g q

case refine_2
R : Type u
M : Type v
M₂ : Type w
M₃ : Type y
inst✝⁶ : Semiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M₂
inst✝³ : AddCommMonoid M₃
inst✝² : Module R M
inst✝¹ : Module R M₂
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
p : Submodule R M
q : Submodule R M₂
⊢ p ≤ comap f (map (f.coprod g) (p.prod q))

case refine_3
R : Type u
M : Type v
M₂ : Type w
M₃ : Type y
inst✝⁶ : Semiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M₂
inst✝³ : AddCommMonoid M₃
inst✝² : Module R M
inst✝¹ : Module R M₂
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
p : Submodule R M
q : Submodule R M₂
⊢ q ≤ comap g (map (f.coprod g) (p.prod q))

Proof state:
case refine_1.intro.intro.intro
R : Type u
M : Type v
M₂ : Type w
M₃ : Type y
inst✝⁶ : Semiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M₂
inst✝³ : AddCommMonoid M₃
inst✝² : Module R M
inst✝¹ : Module R M₂
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
p : Submodule R M
q : Submodule R M₂
x : M × M₂
h₁ : x.1 ∈ ↑p
h₂ : x.2 ∈ ↑q
⊢ (f.coprod g) x ∈ map f p ⊔ map g q

Tactic:
exact mem_sup.2 ⟨_, ⟨_, h₁, rfl⟩, _, ⟨_, h₂, rfl⟩, rfl⟩

Result:
no goals

Proof state:
case refine_3
R : Type u
M : Type v
M₂ : Type w
M₃ : Type y
inst✝⁶ : Semiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M₂
inst✝³ : AddCommMonoid M₃
inst✝² : Module R M
inst✝¹ : Module R M₂
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
p : Submodule R M
q : Submodule R M₂
⊢ q ≤ comap g (map (f.coprod g) (p.prod q))

Tactic:
exact fun x hx => ⟨(0, x), by simp [hx]⟩

Result:
no goals