Theorem: rank_add_rank_split
File: Mathlib/LinearAlgebra/Dimension.lean

tactic: have hf : Surjective (coprod db eb) := by rwa [← range_eq_top, range_coprod, eq_top_iff]
state_before: K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type ?u.595193
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
⊢ Module.rank K V + Module.rank K V₁ = Module.rank K V₂ + Module.rank K V₃

tactic: conv =>
  rhs
  rw [← rank_prod', rank_eq_of_surjective _ hf]
state_before: K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type ?u.595193
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
⊢ Module.rank K V + Module.rank K V₁ = Module.rank K V₂ + Module.rank K V₃

tactic: congr 1
state_before: K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type ?u.595193
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
⊢ Module.rank K V + Module.rank K V₁ = Module.rank K V + Module.rank K { x // x ∈ ker (coprod db eb) }

tactic: apply LinearEquiv.rank_eq
state_before: case e_a
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type ?u.595193
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
⊢ Module.rank K V₁ = Module.rank K { x // x ∈ ker (coprod db eb) }

tactic: refine' LinearEquiv.ofBijective L ⟨_, _⟩
state_before: case e_a.f
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type ?u.595193
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
L : V₁ →ₗ[K] { x // x ∈ ker (coprod db eb) } :=
  LinearMap.codRestrict (ker (coprod db eb)) (LinearMap.prod cd (-ce))
    (_ : ∀ (c : V₁), ↑(LinearMap.prod cd (-ce)) c ∈ ker (coprod db eb))
⊢ V₁ ≃ₗ[K] { x // x ∈ ker (coprod db eb) }

tactic: rwa [← range_eq_top, range_coprod, eq_top_iff]
state_before: K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type ?u.595193
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
⊢ Surjective ↑(coprod db eb)

tactic: refine' LinearMap.codRestrict _ (prod cd (-ce)) _
state_before: K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type ?u.595193
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
⊢ V₁ →ₗ[K] { x // x ∈ ker (coprod db eb) }

tactic: intro c
state_before: K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type ?u.595193
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
⊢ ∀ (c : V₁), ↑(LinearMap.prod cd (-ce)) c ∈ ker (coprod db eb)

tactic: simp only [add_eq_zero_iff_eq_neg, LinearMap.prod_apply, mem_ker, Pi.prod, coprod_apply,
  neg_neg, map_neg, neg_apply]
state_before: K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type ?u.595193
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
c : V₁
⊢ ↑(LinearMap.prod cd (-ce)) c ∈ ker (coprod db eb)

tactic: exact LinearMap.ext_iff.1 eq c
state_before: K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type ?u.595193
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
c : V₁
⊢ ↑db (↑cd c) = ↑eb (↑ce c)

tactic: rw [← ker_eq_bot, ker_codRestrict, ker_prod, hgd, bot_inf_eq]
state_before: case e_a.f.refine'_1
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type ?u.595193
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
L : V₁ →ₗ[K] { x // x ∈ ker (coprod db eb) } :=
  LinearMap.codRestrict (ker (coprod db eb)) (LinearMap.prod cd (-ce))
    (_ : ∀ (c : V₁), ↑(LinearMap.prod cd (-ce)) c ∈ ker (coprod db eb))
⊢ Injective ↑L

tactic: rw [← range_eq_top, eq_top_iff, range_codRestrict, ← map_le_iff_le_comap, Submodule.map_top,
  range_subtype]
state_before: case e_a.f.refine'_2
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type ?u.595193
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
L : V₁ →ₗ[K] { x // x ∈ ker (coprod db eb) } :=
  LinearMap.codRestrict (ker (coprod db eb)) (LinearMap.prod cd (-ce))
    (_ : ∀ (c : V₁), ↑(LinearMap.prod cd (-ce)) c ∈ ker (coprod db eb))
⊢ Surjective ↑L

tactic: rintro ⟨d, e⟩
state_before: case e_a.f.refine'_2
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type ?u.595193
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
L : V₁ →ₗ[K] { x // x ∈ ker (coprod db eb) } :=
  LinearMap.codRestrict (ker (coprod db eb)) (LinearMap.prod cd (-ce))
    (_ : ∀ (c : V₁), ↑(LinearMap.prod cd (-ce)) c ∈ ker (coprod db eb))
⊢ ker (coprod db eb) ≤ LinearMap.range (LinearMap.prod cd (-ce))

tactic: have h := eq₂ d (-e)
state_before: case e_a.f.refine'_2.mk
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type ?u.595193
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
L : V₁ →ₗ[K] { x // x ∈ ker (coprod db eb) } :=
  LinearMap.codRestrict (ker (coprod db eb)) (LinearMap.prod cd (-ce))
    (_ : ∀ (c : V₁), ↑(LinearMap.prod cd (-ce)) c ∈ ker (coprod db eb))
d : V₂
e : V₃
⊢ (d, e) ∈ ker (coprod db eb) → (d, e) ∈ LinearMap.range (LinearMap.prod cd (-ce))

tactic: simp only [add_eq_zero_iff_eq_neg, LinearMap.prod_apply, mem_ker, SetLike.mem_coe,
  Prod.mk.inj_iff, coprod_apply, map_neg, neg_apply, LinearMap.mem_range, Pi.prod] at h⊢
state_before: case e_a.f.refine'_2.mk
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type ?u.595193
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
L : V₁ →ₗ[K] { x // x ∈ ker (coprod db eb) } :=
  LinearMap.codRestrict (ker (coprod db eb)) (LinearMap.prod cd (-ce))
    (_ : ∀ (c : V₁), ↑(LinearMap.prod cd (-ce)) c ∈ ker (coprod db eb))
d : V₂
e : V₃
h : ↑db d = ↑eb (-e) → ∃ c, ↑cd c = d ∧ ↑ce c = -e
⊢ (d, e) ∈ ker (coprod db eb) → (d, e) ∈ LinearMap.range (LinearMap.prod cd (-ce))

tactic: intro hde
state_before: case e_a.f.refine'_2.mk
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type ?u.595193
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
L : V₁ →ₗ[K] { x // x ∈ ker (coprod db eb) } :=
  LinearMap.codRestrict (ker (coprod db eb)) (LinearMap.prod cd (-ce))
    (_ : ∀ (c : V₁), ↑(LinearMap.prod cd (-ce)) c ∈ ker (coprod db eb))
d : V₂
e : V₃
h : ↑db d = -↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = -e
⊢ ↑db d = -↑eb e → ∃ y, ↑cd y = d ∧ -↑ce y = e

tactic: rcases h hde with ⟨c, h₁, h₂⟩
state_before: case e_a.f.refine'_2.mk
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type ?u.595193
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde✝ : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
L : V₁ →ₗ[K] { x // x ∈ ker (coprod db eb) } :=
  LinearMap.codRestrict (ker (coprod db eb)) (LinearMap.prod cd (-ce))
    (_ : ∀ (c : V₁), ↑(LinearMap.prod cd (-ce)) c ∈ ker (coprod db eb))
d : V₂
e : V₃
h : ↑db d = -↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = -e
hde : ↑db d = -↑eb e
⊢ ∃ y, ↑cd y = d ∧ -↑ce y = e

tactic: refine' ⟨c, h₁, _⟩
state_before: case e_a.f.refine'_2.mk.intro.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type ?u.595193
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde✝ : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
L : V₁ →ₗ[K] { x // x ∈ ker (coprod db eb) } :=
  LinearMap.codRestrict (ker (coprod db eb)) (LinearMap.prod cd (-ce))
    (_ : ∀ (c : V₁), ↑(LinearMap.prod cd (-ce)) c ∈ ker (coprod db eb))
d : V₂
e : V₃
h : ↑db d = -↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = -e
hde : ↑db d = -↑eb e
c : V₁
h₁ : ↑cd c = d
h₂ : ↑ce c = -e
⊢ ∃ y, ↑cd y = d ∧ -↑ce y = e

tactic: rw [h₂, _root_.neg_neg]
state_before: case e_a.f.refine'_2.mk.intro.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type ?u.595193
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde✝ : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
L : V₁ →ₗ[K] { x // x ∈ ker (coprod db eb) } :=
  LinearMap.codRestrict (ker (coprod db eb)) (LinearMap.prod cd (-ce))
    (_ : ∀ (c : V₁), ↑(LinearMap.prod cd (-ce)) c ∈ ker (coprod db eb))
d : V₂
e : V₃
h : ↑db d = -↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = -e
hde : ↑db d = -↑eb e
c : V₁
h₁ : ↑cd c = d
h₂ : ↑ce c = -e
⊢ -↑ce c = e