Theorem: exists_set_linearIndependent_of_isDomain
File: Mathlib/LinearAlgebra/Dimension/Localization.lean

Proof steps:
state_before: 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⁰
inst✝ : IsDomain R
⊢ ∃ s, #↑s = Module.rank R M ∧ LinearIndependent (ι := ↑s) R Subtype.val
state_after: case intro
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⁰
inst✝ : IsDomain R
w : Module.Free.ChooseBasisIndex (FractionRing R) (LocalizedModule R⁰ M) → M
hw : LinearIndependent R w
⊢ ∃ s, #↑s = Module.rank R M ∧ LinearIndependent (ι := ↑s) R Subtype.val
tactic: obtain ⟨w, hw⟩ :=
    IsLocalizedModule.linearIndependent_lift R⁰ (LocalizedModule.mkLinearMap R⁰ M) le_rfl
      (Module.Free.chooseBasis (FractionRing R) (LocalizedModule R⁰ M)).linearIndependent
state_before: case intro
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⁰
inst✝ : IsDomain R
w : Module.Free.ChooseBasisIndex (FractionRing R) (LocalizedModule R⁰ M) → M
hw : LinearIndependent R w
⊢ ∃ s, #↑s = Module.rank R M ∧ LinearIndependent (ι := ↑s) R Subtype.val
state_after: case intro
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⁰
inst✝ : IsDomain R
w : Module.Free.ChooseBasisIndex (FractionRing R) (LocalizedModule R⁰ M) → M
hw : LinearIndependent R w
⊢ #↑(Set.range w) = Module.rank R M
tactic: refine ⟨Set.range w, ?_, (linearIndependent_subtype_range hw.injective).mpr hw⟩
state_before: case intro
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⁰
inst✝ : IsDomain R
w : Module.Free.ChooseBasisIndex (FractionRing R) (LocalizedModule R⁰ M) → M
hw : LinearIndependent R w
⊢ #↑(Set.range w) = Module.rank R M
state_after: case intro.a
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⁰
inst✝ : IsDomain R
w : Module.Free.ChooseBasisIndex (FractionRing R) (LocalizedModule R⁰ M) → M
hw : LinearIndependent R w
⊢ lift.{max u v, v} #↑(Set.range w) = lift.{max u v, v} (Module.rank R M)
tactic: apply Cardinal.lift_injective.{max u v}
state_before: case intro.a
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⁰
inst✝ : IsDomain R
w : Module.Free.ChooseBasisIndex (FractionRing R) (LocalizedModule R⁰ M) → M
hw : LinearIndependent R w
⊢ lift.{max u v, v} #↑(Set.range w) = lift.{max u v, v} (Module.rank R M)
state_after: no goals
tactic: rw [Cardinal.mk_range_eq_of_injective hw.injective, ← Module.Free.rank_eq_card_chooseBasisIndex,
  IsLocalizedModule.lift_rank_eq (FractionRing R) R⁰ (LocalizedModule.mkLinearMap R⁰ M) le_rfl]