Theorem: LinearMap.ker_coprod_of_disjoint_range
File: Mathlib/LinearAlgebra/Prod.lean

tactic: apply le_antisymm _ (ker_prod_ker_le_ker_coprod f g)
state_before: R : Type u
K : Type u'
M : Type v
V : Type v'
M₂✝ : Type w
V₂ : Type w'
M₃✝ : Type y
V₃ : Type y'
M₄ : Type z
ι : Type x
M₅ : Type u_1
M₆ : Type u_2
inst✝¹² : Semiring R
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M₂✝
inst✝⁹ : AddCommMonoid M₃✝
inst✝⁸ : AddCommMonoid M₄
inst✝⁷ : Module R M
inst✝⁶ : Module R M₂✝
inst✝⁵ : Module R M₃✝
inst✝⁴ : Module R M₄
M₂ : Type u_3
inst✝³ : AddCommGroup M₂
inst✝² : Module R M₂
M₃ : Type u_4
inst✝¹ : AddCommGroup M₃
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
hd : Disjoint (range f) (range g)
⊢ ker (f.coprod g) = (ker f).prod (ker g)
state_after: R : Type u
K : Type u'
M : Type v
V : Type v'
M₂✝ : Type w
V₂ : Type w'
M₃✝ : Type y
V₃ : Type y'
M₄ : Type z
ι : Type x
M₅ : Type u_1
M₆ : Type u_2
inst✝¹² : Semiring R
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M₂✝
inst✝⁹ : AddCommMonoid M₃✝
inst✝⁸ : AddCommMonoid M₄
inst✝⁷ : Module R M
inst✝⁶ : Module R M₂✝
inst✝⁵ : Module R M₃✝
inst✝⁴ : Module R M₄
M₂ : Type u_3
inst✝³ : AddCommGroup M₂
inst✝² : Module R M₂
M₃ : Type u_4
inst✝¹ : AddCommGroup M₃
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
hd : Disjoint (range f) (range g)
⊢ ker (f.coprod g) ≤ (ker f).prod (ker g)

tactic: rintro ⟨y, z⟩ h
state_before: R : Type u
K : Type u'
M : Type v
V : Type v'
M₂✝ : Type w
V₂ : Type w'
M₃✝ : Type y
V₃ : Type y'
M₄ : Type z
ι : Type x
M₅ : Type u_1
M₆ : Type u_2
inst✝¹² : Semiring R
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M₂✝
inst✝⁹ : AddCommMonoid M₃✝
inst✝⁸ : AddCommMonoid M₄
inst✝⁷ : Module R M
inst✝⁶ : Module R M₂✝
inst✝⁵ : Module R M₃✝
inst✝⁴ : Module R M₄
M₂ : Type u_3
inst✝³ : AddCommGroup M₂
inst✝² : Module R M₂
M₃ : Type u_4
inst✝¹ : AddCommGroup M₃
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
hd : Disjoint (range f) (range g)
⊢ ker (f.coprod g) ≤ (ker f).prod (ker g)
state_after: case mk
R : Type u
K : Type u'
M : Type v
V : Type v'
M₂✝ : Type w
V₂ : Type w'
M₃✝ : Type y
V₃ : Type y'
M₄ : Type z
ι : Type x
M₅ : Type u_1
M₆ : Type u_2
inst✝¹² : Semiring R
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M₂✝
inst✝⁹ : AddCommMonoid M₃✝
inst✝⁸ : AddCommMonoid M₄
inst✝⁷ : Module R M
inst✝⁶ : Module R M₂✝
inst✝⁵ : Module R M₃✝
inst✝⁴ : Module R M₄
M₂ : Type u_3
inst✝³ : AddCommGroup M₂
inst✝² : Module R M₂
M₃ : Type u_4
inst✝¹ : AddCommGroup M₃
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
hd : Disjoint (range f) (range g)
y : M
z : M₂
h : (y, z) ∈ ker (f.coprod g)
⊢ (y, z) ∈ (ker f).prod (ker g)

tactic: simp only [mem_ker, mem_prod, coprod_apply] at h ⊢
state_before: case mk
R : Type u
K : Type u'
M : Type v
V : Type v'
M₂✝ : Type w
V₂ : Type w'
M₃✝ : Type y
V₃ : Type y'
M₄ : Type z
ι : Type x
M₅ : Type u_1
M₆ : Type u_2
inst✝¹² : Semiring R
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M₂✝
inst✝⁹ : AddCommMonoid M₃✝
inst✝⁸ : AddCommMonoid M₄
inst✝⁷ : Module R M
inst✝⁶ : Module R M₂✝
inst✝⁵ : Module R M₃✝
inst✝⁴ : Module R M₄
M₂ : Type u_3
inst✝³ : AddCommGroup M₂
inst✝² : Module R M₂
M₃ : Type u_4
inst✝¹ : AddCommGroup M₃
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
hd : Disjoint (range f) (range g)
y : M
z : M₂
h : (y, z) ∈ ker (f.coprod g)
⊢ (y, z) ∈ (ker f).prod (ker g)
state_after: case mk
R : Type u
K : Type u'
M : Type v
V : Type v'
M₂✝ : Type w
V₂ : Type w'
M₃✝ : Type y
V₃ : Type y'
M₄ : Type z
ι : Type x
M₅ : Type u_1
M₆ : Type u_2
inst✝¹² : Semiring R
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M₂✝
inst✝⁹ : AddCommMonoid M₃✝
inst✝⁸ : AddCommMonoid M₄
inst✝⁷ : Module R M
inst✝⁶ : Module R M₂✝
inst✝⁵ : Module R M₃✝
inst✝⁴ : Module R M₄
M₂ : Type u_3
inst✝³ : AddCommGroup M₂
inst✝² : Module R M₂
M₃ : Type u_4
inst✝¹ : AddCommGroup M₃
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
hd : Disjoint (range f) (range g)
y : M
z : M₂
h : f y + g z = 0
⊢ f y = 0 ∧ g z = 0

tactic: have : f y ∈ (range f) ⊓ (range g) := by
  simp only [true_and_iff, mem_range, mem_inf, exists_apply_eq_apply]
  use -z
  rwa [eq_comm, map_neg, ← sub_eq_zero, sub_neg_eq_add]
state_before: case mk
R : Type u
K : Type u'
M : Type v
V : Type v'
M₂✝ : Type w
V₂ : Type w'
M₃✝ : Type y
V₃ : Type y'
M₄ : Type z
ι : Type x
M₅ : Type u_1
M₆ : Type u_2
inst✝¹² : Semiring R
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M₂✝
inst✝⁹ : AddCommMonoid M₃✝
inst✝⁸ : AddCommMonoid M₄
inst✝⁷ : Module R M
inst✝⁶ : Module R M₂✝
inst✝⁵ : Module R M₃✝
inst✝⁴ : Module R M₄
M₂ : Type u_3
inst✝³ : AddCommGroup M₂
inst✝² : Module R M₂
M₃ : Type u_4
inst✝¹ : AddCommGroup M₃
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
hd : Disjoint (range f) (range g)
y : M
z : M₂
h : f y + g z = 0
⊢ f y = 0 ∧ g z = 0
state_after: case mk
R : Type u
K : Type u'
M : Type v
V : Type v'
M₂✝ : Type w
V₂ : Type w'
M₃✝ : Type y
V₃ : Type y'
M₄ : Type z
ι : Type x
M₅ : Type u_1
M₆ : Type u_2
inst✝¹² : Semiring R
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M₂✝
inst✝⁹ : AddCommMonoid M₃✝
inst✝⁸ : AddCommMonoid M₄
inst✝⁷ : Module R M
inst✝⁶ : Module R M₂✝
inst✝⁵ : Module R M₃✝
inst✝⁴ : Module R M₄
M₂ : Type u_3
inst✝³ : AddCommGroup M₂
inst✝² : Module R M₂
M₃ : Type u_4
inst✝¹ : AddCommGroup M₃
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
hd : Disjoint (range f) (range g)
y : M
z : M₂
h : f y + g z = 0
this : f y ∈ range f ⊓ range g
⊢ f y = 0 ∧ g z = 0

tactic: rw [hd.eq_bot, mem_bot] at this
state_before: case mk
R : Type u
K : Type u'
M : Type v
V : Type v'
M₂✝ : Type w
V₂ : Type w'
M₃✝ : Type y
V₃ : Type y'
M₄ : Type z
ι : Type x
M₅ : Type u_1
M₆ : Type u_2
inst✝¹² : Semiring R
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M₂✝
inst✝⁹ : AddCommMonoid M₃✝
inst✝⁸ : AddCommMonoid M₄
inst✝⁷ : Module R M
inst✝⁶ : Module R M₂✝
inst✝⁵ : Module R M₃✝
inst✝⁴ : Module R M₄
M₂ : Type u_3
inst✝³ : AddCommGroup M₂
inst✝² : Module R M₂
M₃ : Type u_4
inst✝¹ : AddCommGroup M₃
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
hd : Disjoint (range f) (range g)
y : M
z : M₂
h : f y + g z = 0
this : f y ∈ range f ⊓ range g
⊢ f y = 0 ∧ g z = 0
state_after: case mk
R : Type u
K : Type u'
M : Type v
V : Type v'
M₂✝ : Type w
V₂ : Type w'
M₃✝ : Type y
V₃ : Type y'
M₄ : Type z
ι : Type x
M₅ : Type u_1
M₆ : Type u_2
inst✝¹² : Semiring R
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M₂✝
inst✝⁹ : AddCommMonoid M₃✝
inst✝⁸ : AddCommMonoid M₄
inst✝⁷ : Module R M
inst✝⁶ : Module R M₂✝
inst✝⁵ : Module R M₃✝
inst✝⁴ : Module R M₄
M₂ : Type u_3
inst✝³ : AddCommGroup M₂
inst✝² : Module R M₂
M₃ : Type u_4
inst✝¹ : AddCommGroup M₃
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
hd : Disjoint (range f) (range g)
y : M
z : M₂
h : f y + g z = 0
this : f y = 0
⊢ f y = 0 ∧ g z = 0

tactic: rw [this] at h
state_before: case mk
R : Type u
K : Type u'
M : Type v
V : Type v'
M₂✝ : Type w
V₂ : Type w'
M₃✝ : Type y
V₃ : Type y'
M₄ : Type z
ι : Type x
M₅ : Type u_1
M₆ : Type u_2
inst✝¹² : Semiring R
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M₂✝
inst✝⁹ : AddCommMonoid M₃✝
inst✝⁸ : AddCommMonoid M₄
inst✝⁷ : Module R M
inst✝⁶ : Module R M₂✝
inst✝⁵ : Module R M₃✝
inst✝⁴ : Module R M₄
M₂ : Type u_3
inst✝³ : AddCommGroup M₂
inst✝² : Module R M₂
M₃ : Type u_4
inst✝¹ : AddCommGroup M₃
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
hd : Disjoint (range f) (range g)
y : M
z : M₂
h : f y + g z = 0
this : f y = 0
⊢ f y = 0 ∧ g z = 0
state_after: case mk
R : Type u
K : Type u'
M : Type v
V : Type v'
M₂✝ : Type w
V₂ : Type w'
M₃✝ : Type y
V₃ : Type y'
M₄ : Type z
ι : Type x
M₅ : Type u_1
M₆ : Type u_2
inst✝¹² : Semiring R
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M₂✝
inst✝⁹ : AddCommMonoid M₃✝
inst✝⁸ : AddCommMonoid M₄
inst✝⁷ : Module R M
inst✝⁶ : Module R M₂✝
inst✝⁵ : Module R M₃✝
inst✝⁴ : Module R M₄
M₂ : Type u_3
inst✝³ : AddCommGroup M₂
inst✝² : Module R M₂
M₃ : Type u_4
inst✝¹ : AddCommGroup M₃
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
hd : Disjoint (range f) (range g)
y : M
z : M₂
h : 0 + g z = 0
this : f y = 0
⊢ f y = 0 ∧ g z = 0

tactic: simpa [this] using h
state_before: case mk
R : Type u
K : Type u'
M : Type v
V : Type v'
M₂✝ : Type w
V₂ : Type w'
M₃✝ : Type y
V₃ : Type y'
M₄ : Type z
ι : Type x
M₅ : Type u_1
M₆ : Type u_2
inst✝¹² : Semiring R
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M₂✝
inst✝⁹ : AddCommMonoid M₃✝
inst✝⁸ : AddCommMonoid M₄
inst✝⁷ : Module R M
inst✝⁶ : Module R M₂✝
inst✝⁵ : Module R M₃✝
inst✝⁴ : Module R M₄
M₂ : Type u_3
inst✝³ : AddCommGroup M₂
inst✝² : Module R M₂
M₃ : Type u_4
inst✝¹ : AddCommGroup M₃
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
hd : Disjoint (range f) (range g)
y : M
z : M₂
h : 0 + g z = 0
this : f y = 0
⊢ f y = 0 ∧ g z = 0
state_after: no goals

tactic: simp only [true_and_iff, mem_range, mem_inf, exists_apply_eq_apply]
state_before: R : Type u
K : Type u'
M : Type v
V : Type v'
M₂✝ : Type w
V₂ : Type w'
M₃✝ : Type y
V₃ : Type y'
M₄ : Type z
ι : Type x
M₅ : Type u_1
M₆ : Type u_2
inst✝¹² : Semiring R
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M₂✝
inst✝⁹ : AddCommMonoid M₃✝
inst✝⁸ : AddCommMonoid M₄
inst✝⁷ : Module R M
inst✝⁶ : Module R M₂✝
inst✝⁵ : Module R M₃✝
inst✝⁴ : Module R M₄
M₂ : Type u_3
inst✝³ : AddCommGroup M₂
inst✝² : Module R M₂
M₃ : Type u_4
inst✝¹ : AddCommGroup M₃
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
hd : Disjoint (range f) (range g)
y : M
z : M₂
h : f y + g z = 0
⊢ f y ∈ range f ⊓ range g
state_after: R : Type u
K : Type u'
M : Type v
V : Type v'
M₂✝ : Type w
V₂ : Type w'
M₃✝ : Type y
V₃ : Type y'
M₄ : Type z
ι : Type x
M₅ : Type u_1
M₆ : Type u_2
inst✝¹² : Semiring R
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M₂✝
inst✝⁹ : AddCommMonoid M₃✝
inst✝⁸ : AddCommMonoid M₄
inst✝⁷ : Module R M
inst✝⁶ : Module R M₂✝
inst✝⁵ : Module R M₃✝
inst✝⁴ : Module R M₄
M₂ : Type u_3
inst✝³ : AddCommGroup M₂
inst✝² : Module R M₂
M₃ : Type u_4
inst✝¹ : AddCommGroup M₃
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
hd : Disjoint (range f) (range g)
y : M
z : M₂
h : f y + g z = 0
⊢ ∃ y_1, g y_1 = f y

tactic: use -z
state_before: R : Type u
K : Type u'
M : Type v
V : Type v'
M₂✝ : Type w
V₂ : Type w'
M₃✝ : Type y
V₃ : Type y'
M₄ : Type z
ι : Type x
M₅ : Type u_1
M₆ : Type u_2
inst✝¹² : Semiring R
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M₂✝
inst✝⁹ : AddCommMonoid M₃✝
inst✝⁸ : AddCommMonoid M₄
inst✝⁷ : Module R M
inst✝⁶ : Module R M₂✝
inst✝⁵ : Module R M₃✝
inst✝⁴ : Module R M₄
M₂ : Type u_3
inst✝³ : AddCommGroup M₂
inst✝² : Module R M₂
M₃ : Type u_4
inst✝¹ : AddCommGroup M₃
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
hd : Disjoint (range f) (range g)
y : M
z : M₂
h : f y + g z = 0
⊢ ∃ y_1, g y_1 = f y
state_after: case h
R : Type u
K : Type u'
M : Type v
V : Type v'
M₂✝ : Type w
V₂ : Type w'
M₃✝ : Type y
V₃ : Type y'
M₄ : Type z
ι : Type x
M₅ : Type u_1
M₆ : Type u_2
inst✝¹² : Semiring R
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M₂✝
inst✝⁹ : AddCommMonoid M₃✝
inst✝⁸ : AddCommMonoid M₄
inst✝⁷ : Module R M
inst✝⁶ : Module R M₂✝
inst✝⁵ : Module R M₃✝
inst✝⁴ : Module R M₄
M₂ : Type u_3
inst✝³ : AddCommGroup M₂
inst✝² : Module R M₂
M₃ : Type u_4
inst✝¹ : AddCommGroup M₃
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
hd : Disjoint (range f) (range g)
y : M
z : M₂
h : f y + g z = 0
⊢ g (-z) = f y

tactic: rwa [eq_comm, map_neg, ← sub_eq_zero, sub_neg_eq_add]
state_before: case h
R : Type u
K : Type u'
M : Type v
V : Type v'
M₂✝ : Type w
V₂ : Type w'
M₃✝ : Type y
V₃ : Type y'
M₄ : Type z
ι : Type x
M₅ : Type u_1
M₆ : Type u_2
inst✝¹² : Semiring R
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M₂✝
inst✝⁹ : AddCommMonoid M₃✝
inst✝⁸ : AddCommMonoid M₄
inst✝⁷ : Module R M
inst✝⁶ : Module R M₂✝
inst✝⁵ : Module R M₃✝
inst✝⁴ : Module R M₄
M₂ : Type u_3
inst✝³ : AddCommGroup M₂
inst✝² : Module R M₂
M₃ : Type u_4
inst✝¹ : AddCommGroup M₃
inst✝ : Module R M₃
f : M →ₗ[R] M₃
g : M₂ →ₗ[R] M₃
hd : Disjoint (range f) (range g)
y : M
z : M₂
h : f y + g z = 0
⊢ g (-z) = f y
state_after: no goals