Theorem: lift_rank_add_lift_rank_le_rank_prod
File: Mathlib/LinearAlgebra/Dimension/Constructions.lean

tactic: convert rank_quotient_add_rank_le (ker <| LinearMap.fst R M M')
state_before: R S : Type u
M : Type v
M' : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁸ : Ring R
inst✝⁷ : CommRing S
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup M'
inst✝⁴ : AddCommGroup M₁
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
⊢ lift.{v', v} (Module.rank R M) + lift.{v, v'} (Module.rank R M') ≤ Module.rank R (M × M')
state_after: case h.e'_3.h.e'_5
R S : Type u
M : Type v
M' : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁸ : Ring R
inst✝⁷ : CommRing S
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup M'
inst✝⁴ : AddCommGroup M₁
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
⊢ lift.{v', v} (Module.rank R M) = Module.rank R ((M × M') ⧸ ker (LinearMap.fst R M M'))

case h.e'_3.h.e'_6
R S : Type u
M : Type v
M' : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁸ : Ring R
inst✝⁷ : CommRing S
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup M'
inst✝⁴ : AddCommGroup M₁
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
⊢ lift.{v, v'} (Module.rank R M') = Module.rank R ↥(ker (LinearMap.fst R M M'))

tactic: refine Eq.trans ?_ (lift_id'.{v, v'} _)
state_before: case h.e'_3.h.e'_5
R S : Type u
M : Type v
M' : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁸ : Ring R
inst✝⁷ : CommRing S
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup M'
inst✝⁴ : AddCommGroup M₁
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
⊢ lift.{v', v} (Module.rank R M) = Module.rank R ((M × M') ⧸ ker (LinearMap.fst R M M'))
state_after: case h.e'_3.h.e'_5
R S : Type u
M : Type v
M' : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁸ : Ring R
inst✝⁷ : CommRing S
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup M'
inst✝⁴ : AddCommGroup M₁
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
⊢ lift.{v', v} (Module.rank R M) = lift.{v, max v v'} (Module.rank R ((M × M') ⧸ ker (LinearMap.fst R M M')))

tactic: rw [(quotKerEquivRange _).lift_rank_eq,
    rank_range_of_surjective _ fst_surjective, lift_umax.{v, v'}]
state_before: case h.e'_3.h.e'_5
R S : Type u
M : Type v
M' : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁸ : Ring R
inst✝⁷ : CommRing S
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup M'
inst✝⁴ : AddCommGroup M₁
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
⊢ lift.{v', v} (Module.rank R M) = lift.{v, max v v'} (Module.rank R ((M × M') ⧸ ker (LinearMap.fst R M M')))
state_after: no goals

tactic: refine Eq.trans ?_ (lift_id'.{v', v} _)
state_before: case h.e'_3.h.e'_6
R S : Type u
M : Type v
M' : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁸ : Ring R
inst✝⁷ : CommRing S
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup M'
inst✝⁴ : AddCommGroup M₁
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
⊢ lift.{v, v'} (Module.rank R M') = Module.rank R ↥(ker (LinearMap.fst R M M'))
state_after: case h.e'_3.h.e'_6
R S : Type u
M : Type v
M' : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁸ : Ring R
inst✝⁷ : CommRing S
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup M'
inst✝⁴ : AddCommGroup M₁
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
⊢ lift.{v, v'} (Module.rank R M') = lift.{v', max v' v} (Module.rank R ↥(ker (LinearMap.fst R M M')))

tactic: rw [ker_fst, ← (LinearEquiv.ofInjective _ <| inr_injective (M := M) (M₂ := M')).lift_rank_eq,
    lift_umax.{v', v}]
state_before: case h.e'_3.h.e'_6
R S : Type u
M : Type v
M' : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁸ : Ring R
inst✝⁷ : CommRing S
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup M'
inst✝⁴ : AddCommGroup M₁
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
⊢ lift.{v, v'} (Module.rank R M') = lift.{v', max v' v} (Module.rank R ↥(ker (LinearMap.fst R M M')))
state_after: no goals