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

Proof steps:
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✝¹¹ : StrongRankCondition R
inst✝¹⁰ : StrongRankCondition S
inst✝⁹ : Module S M
inst✝⁸ : Module.Free S M
inst✝⁷ : Module S M'
inst✝⁶ : Module.Free S M'
inst✝⁵ : Module S M₁
inst✝⁴ : Module.Free S M₁
inst✝³ : Algebra S R
inst✝² : Module R M
inst✝¹ : IsScalarTower S R M
inst✝ : Module.Free R M
⊢ Module.rank R (M ⊗[S] M') = Cardinal.lift.{v', v} (Module.rank R M) * Cardinal.lift.{v, v'} (Module.rank S M')
state_after: case intro.mk
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✝¹¹ : StrongRankCondition R
inst✝¹⁰ : StrongRankCondition S
inst✝⁹ : Module S M
inst✝⁸ : Module.Free S M
inst✝⁷ : Module S M'
inst✝⁶ : Module.Free S M'
inst✝⁵ : Module S M₁
inst✝⁴ : Module.Free S M₁
inst✝³ : Algebra S R
inst✝² : Module R M
inst✝¹ : IsScalarTower S R M
inst✝ : Module.Free R M
fst✝ : Type v
bM : Basis fst✝ R M
⊢ Module.rank R (M ⊗[S] M') = Cardinal.lift.{v', v} (Module.rank R M) * Cardinal.lift.{v, v'} (Module.rank S M')
tactic: obtain ⟨⟨_, bM⟩⟩ := Module.Free.exists_basis (R := R) (M := M)
state_before: case intro.mk
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✝¹¹ : StrongRankCondition R
inst✝¹⁰ : StrongRankCondition S
inst✝⁹ : Module S M
inst✝⁸ : Module.Free S M
inst✝⁷ : Module S M'
inst✝⁶ : Module.Free S M'
inst✝⁵ : Module S M₁
inst✝⁴ : Module.Free S M₁
inst✝³ : Algebra S R
inst✝² : Module R M
inst✝¹ : IsScalarTower S R M
inst✝ : Module.Free R M
fst✝ : Type v
bM : Basis fst✝ R M
⊢ Module.rank R (M ⊗[S] M') = Cardinal.lift.{v', v} (Module.rank R M) * Cardinal.lift.{v, v'} (Module.rank S M')
state_after: case intro.mk.intro.mk
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✝¹¹ : StrongRankCondition R
inst✝¹⁰ : StrongRankCondition S
inst✝⁹ : Module S M
inst✝⁸ : Module.Free S M
inst✝⁷ : Module S M'
inst✝⁶ : Module.Free S M'
inst✝⁵ : Module S M₁
inst✝⁴ : Module.Free S M₁
inst✝³ : Algebra S R
inst✝² : Module R M
inst✝¹ : IsScalarTower S R M
inst✝ : Module.Free R M
fst✝¹ : Type v
bM : Basis fst✝¹ R M
fst✝ : Type v'
bN : Basis fst✝ S M'
⊢ Module.rank R (M ⊗[S] M') = Cardinal.lift.{v', v} (Module.rank R M) * Cardinal.lift.{v, v'} (Module.rank S M')
tactic: obtain ⟨⟨_, bN⟩⟩ := Module.Free.exists_basis (R := S) (M := M')
state_before: case intro.mk.intro.mk
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✝¹¹ : StrongRankCondition R
inst✝¹⁰ : StrongRankCondition S
inst✝⁹ : Module S M
inst✝⁸ : Module.Free S M
inst✝⁷ : Module S M'
inst✝⁶ : Module.Free S M'
inst✝⁵ : Module S M₁
inst✝⁴ : Module.Free S M₁
inst✝³ : Algebra S R
inst✝² : Module R M
inst✝¹ : IsScalarTower S R M
inst✝ : Module.Free R M
fst✝¹ : Type v
bM : Basis fst✝¹ R M
fst✝ : Type v'
bN : Basis fst✝ S M'
⊢ Module.rank R (M ⊗[S] M') = Cardinal.lift.{v', v} (Module.rank R M) * Cardinal.lift.{v, v'} (Module.rank S M')
state_after: no goals
tactic: rw [← bM.mk_eq_rank'', ← bN.mk_eq_rank'', ← (bM.tensorProduct bN).mk_eq_rank'', Cardinal.mk_prod]