-- Mathlib/LinearAlgebra/Dimension/Localization.lean
lemma IsLocalizedModule.lift_rank_eq :
    Cardinal.lift.{v} (Module.rank S N) = Cardinal.lift.{v'} (Module.rank R M)

Proof state:
case inr
R : Type u
S : Type u'
M : Type v
N : Type v'
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : AddCommGroup M
inst✝⁷ : AddCommGroup N
inst✝⁶ : Module R M
inst✝⁵ : Module R N
inst✝⁴ : Algebra R S
inst✝³ : Module S N
inst✝² : IsScalarTower R S N
p : Submonoid R
inst✝¹ : IsLocalization p S
f : M →ₗ[R] N
inst✝ : IsLocalizedModule p f
hp : p ≤ R⁰
h✝ : Nontrivial R
⊢ Cardinal.lift.{v, v'} (Module.rank S N) = Cardinal.lift.{v', v} (Module.rank R M)

Tactic:
have := (IsLocalization.injective S hp).nontrivial

Result:
case inr
R : Type u
S : Type u'
M : Type v
N : Type v'
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : AddCommGroup M
inst✝⁷ : AddCommGroup N
inst✝⁶ : Module R M
inst✝⁵ : Module R N
inst✝⁴ : Algebra R S
inst✝³ : Module S N
inst✝² : IsScalarTower R S N
p : Submonoid R
inst✝¹ : IsLocalization p S
f : M →ₗ[R] N
inst✝ : IsLocalizedModule p f
hp : p ≤ R⁰
h✝ : Nontrivial R
this : Nontrivial S
⊢ Cardinal.lift.{v, v'} (Module.rank S N) = Cardinal.lift.{v', v} (Module.rank R M)

Proof state:
case h.e'_3
R : Type u
S : Type u'
M : Type v
N : Type v'
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : AddCommGroup M
inst✝⁷ : AddCommGroup N
inst✝⁶ : Module R M
inst✝⁵ : Module R N
inst✝⁴ : Algebra R S
inst✝³ : Module S N
inst✝² : IsScalarTower R S N
p : Submonoid R
inst✝¹ : IsLocalization p S
f : M →ₗ[R] N
inst✝ : IsLocalizedModule p f
hp : p ≤ R⁰
h✝ : Nontrivial R
this : Nontrivial S
s : Set M
hs : ∀ (s_1 : Finset ↑s) (g : ↑s → R), ∑ i ∈ s_1, g i • id ↑i = 0 → ∀ i ∈ s_1, g i = 0
sec : S → R × ↥p
hsec : ∀ (z : S), z * (algebraMap R S) ↑(sec z).2 = (algebraMap R S) (sec z).1
t : Finset ↑s
g : ↑s → S
hg : ∑ i ∈ t, g i • f ↑i = 0
i : ↑s
hit : i ∈ t
u : ↑s → ↥p := fun i => ∏ j ∈ t.erase i, (sec (g j)).2
⊢ f 0 = (∏ j ∈ t, (sec (g j)).2) • 0

Tactic:
rw [map_zero, smul_zero]

Result:
no goals

Proof state:
case inr.a.h
R : Type u
S : Type u'
M : Type v
N : Type v'
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : AddCommGroup M
inst✝⁷ : AddCommGroup N
inst✝⁶ : Module R M
inst✝⁵ : Module R N
inst✝⁴ : Algebra R S
inst✝³ : Module S N
inst✝² : IsScalarTower R S N
p : Submonoid R
inst✝¹ : IsLocalization p S
f : M →ₗ[R] N
inst✝ : IsLocalizedModule p f
hp : p ≤ R⁰
h✝ : Nontrivial R
this : Nontrivial S
s : Set M
hs : LinearIndependent R fun (x : ↑s) => id ↑x
sec : S → R × ↥p
hsec : ∀ (z : S), z * (algebraMap R S) ↑(sec z).2 = (algebraMap R S) (sec z).1
⊢ LinearIndependent S fun (i : ↑s) => f ↑i

Tactic:
rw [linearIndependent_iff'] at hs ⊢

Result:
case inr.a.h
R : Type u
S : Type u'
M : Type v
N : Type v'
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : AddCommGroup M
inst✝⁷ : AddCommGroup N
inst✝⁶ : Module R M
inst✝⁵ : Module R N
inst✝⁴ : Algebra R S
inst✝³ : Module S N
inst✝² : IsScalarTower R S N
p : Submonoid R
inst✝¹ : IsLocalization p S
f : M →ₗ[R] N
inst✝ : IsLocalizedModule p f
hp : p ≤ R⁰
h✝ : Nontrivial R
this : Nontrivial S
s : Set M
hs : ∀ (s_1 : Finset ↑s) (g : ↑s → R), ∑ i ∈ s_1, g i • id ↑i = 0 → ∀ i ∈ s_1, g i = 0
sec : S → R × ↥p
hsec : ∀ (z : S), z * (algebraMap R S) ↑(sec z).2 = (algebraMap R S) (sec z).1
⊢ ∀ (s_1 : Finset ↑s) (g : ↑s → S), ∑ i ∈ s_1, g i • f ↑i = 0 → ∀ i ∈ s_1, g i = 0

Proof state:
case h.e'_2
R : Type u
S : Type u'
M : Type v
N : Type v'
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : AddCommGroup M
inst✝⁷ : AddCommGroup N
inst✝⁶ : Module R M
inst✝⁵ : Module R N
inst✝⁴ : Algebra R S
inst✝³ : Module S N
inst✝² : IsScalarTower R S N
p : Submonoid R
inst✝¹ : IsLocalization p S
f : M →ₗ[R] N
inst✝ : IsLocalizedModule p f
hp : p ≤ R⁰
h✝ : Nontrivial R
this : Nontrivial S
s : Set M
hs : ∀ (s_1 : Finset ↑s) (g : ↑s → R), ∑ i ∈ s_1, g i • id ↑i = 0 → ∀ i ∈ s_1, g i = 0
sec : S → R × ↥p
hsec : ∀ (z : S), z * (algebraMap R S) ↑(sec z).2 = (algebraMap R S) (sec z).1
t : Finset ↑s
g : ↑s → S
hg : ∑ i ∈ t, g i • f ↑i = 0
i : ↑s
hit : i ∈ t
u : ↑s → ↥p := fun i => ∏ j ∈ t.erase i, (sec (g j)).2
⊢ ∑ x ∈ t, ↑(u x) • (sec (g x)).1 • f ↑x = ∑ x ∈ t, ↑(∏ j ∈ t, (sec (g j)).2) • g x • f ↑x

Tactic:
apply Finset.sum_congr rfl

Result:
case h.e'_2
R : Type u
S : Type u'
M : Type v
N : Type v'
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : AddCommGroup M
inst✝⁷ : AddCommGroup N
inst✝⁶ : Module R M
inst✝⁵ : Module R N
inst✝⁴ : Algebra R S
inst✝³ : Module S N
inst✝² : IsScalarTower R S N
p : Submonoid R
inst✝¹ : IsLocalization p S
f : M →ₗ[R] N
inst✝ : IsLocalizedModule p f
hp : p ≤ R⁰
h✝ : Nontrivial R
this : Nontrivial S
s : Set M
hs : ∀ (s_1 : Finset ↑s) (g : ↑s → R), ∑ i ∈ s_1, g i • id ↑i = 0 → ∀ i ∈ s_1, g i = 0
sec : S → R × ↥p
hsec : ∀ (z : S), z * (algebraMap R S) ↑(sec z).2 = (algebraMap R S) (sec z).1
t : Finset ↑s
g : ↑s → S
hg : ∑ i ∈ t, g i • f ↑i = 0
i : ↑s
hit : i ∈ t
u : ↑s → ↥p := fun i => ∏ j ∈ t.erase i, (sec (g j)).2
⊢ ∀ x ∈ t, ↑(u x) • (sec (g x)).1 • f ↑x = ↑(∏ j ∈ t, (sec (g j)).2) • g x • f ↑x

Proof state:
case h.e'_2
R : Type u
S : Type u'
M : Type v
N : Type v'
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : AddCommGroup M
inst✝⁷ : AddCommGroup N
inst✝⁶ : Module R M
inst✝⁵ : Module R N
inst✝⁴ : Algebra R S
inst✝³ : Module S N
inst✝² : IsScalarTower R S N
p : Submonoid R
inst✝¹ : IsLocalization p S
f : M →ₗ[R] N
inst✝ : IsLocalizedModule p f
hp : p ≤ R⁰
h✝ : Nontrivial R
this : Nontrivial S
s : Set M
hs : ∀ (s_1 : Finset ↑s) (g : ↑s → R), ∑ i ∈ s_1, g i • id ↑i = 0 → ∀ i ∈ s_1, g i = 0
sec : S → R × ↥p
hsec : ∀ (z : S), z * (algebraMap R S) ↑(sec z).2 = (algebraMap R S) (sec z).1
t : Finset ↑s
g : ↑s → S
hg : ∑ i ∈ t, g i • f ↑i = 0
i : ↑s
hit : i ∈ t
u : ↑s → ↥p := fun i => ∏ j ∈ t.erase i, (sec (g j)).2
j : ↑s
hj : j ∈ t
⊢ (∏ x ∈ t.erase j, (algebraMap R S) ↑(sec (g x)).2) • (algebraMap R S) (sec (g j)).1 • f ↑j =
    (∏ x ∈ t, (algebraMap R S) ↑(sec (g x)).2) • g j • f ↑j

Tactic:
rw [← hsec, mul_comm (g j), mul_smul, ← mul_smul, Finset.prod_erase_mul (h := hj)]

Result:
no goals

Proof state:
case inr
R : Type u
S : Type u'
M : Type v
N : Type v'
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : AddCommGroup M
inst✝⁷ : AddCommGroup N
inst✝⁶ : Module R M
inst✝⁵ : Module R N
inst✝⁴ : Algebra R S
inst✝³ : Module S N
inst✝² : IsScalarTower R S N
p : Submonoid R
inst✝¹ : IsLocalization p S
f : M →ₗ[R] N
inst✝ : IsLocalizedModule p f
hp : p ≤ R⁰
h✝ : Nontrivial R
this : Nontrivial S
⊢ Cardinal.lift.{v, v'} (Module.rank S N) = Cardinal.lift.{v', v} (Module.rank R M)

Tactic:
apply le_antisymm <;>
  rw [Module.rank_def, lift_iSup (bddAbove_range _)] <;>
  apply ciSup_le' <;>
  intro ⟨s, hs⟩

Result:
case inr.a.h
R : Type u
S : Type u'
M : Type v
N : Type v'
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : AddCommGroup M
inst✝⁷ : AddCommGroup N
inst✝⁶ : Module R M
inst✝⁵ : Module R N
inst✝⁴ : Algebra R S
inst✝³ : Module S N
inst✝² : IsScalarTower R S N
p : Submonoid R
inst✝¹ : IsLocalization p S
f : M →ₗ[R] N
inst✝ : IsLocalizedModule p f
hp : p ≤ R⁰
h✝ : Nontrivial R
this : Nontrivial S
s : Set N
hs : LinearIndepOn S id s
⊢ Cardinal.lift.{v, v'} #↑↑⟨s, hs⟩ ≤ Cardinal.lift.{v', v} (Module.rank R M)

case inr.a.h
R : Type u
S : Type u'
M : Type v
N : Type v'
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : AddCommGroup M
inst✝⁷ : AddCommGroup N
inst✝⁶ : Module R M
inst✝⁵ : Module R N
inst✝⁴ : Algebra R S
inst✝³ : Module S N
inst✝² : IsScalarTower R S N
p : Submonoid R
inst✝¹ : IsLocalization p S
f : M →ₗ[R] N
inst✝ : IsLocalizedModule p f
hp : p ≤ R⁰
h✝ : Nontrivial R
this : Nontrivial S
s : Set M
hs : LinearIndepOn R id s
⊢ Cardinal.lift.{v', v} #↑↑⟨s, hs⟩ ≤ Cardinal.lift.{v, v'} (Module.rank S N)