Theorem: Subalgebra.finrank_sup_le_of_free
File: Mathlib/LinearAlgebra/TensorProduct/Subalgebra.lean

Proof steps:
state_before: R : Type u
S : Type v
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : Algebra R S
A B : Subalgebra R S
inst✝¹ : Module.Free R ↥A
inst✝ : Module.Free R ↥B
⊢ finrank R ↥(A ⊔ B) ≤ finrank R ↥A * finrank R ↥B
state_after: R : Type u
S : Type v
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : Algebra R S
A B : Subalgebra R S
inst✝¹ : Module.Free R ↥A
inst✝ : Module.Free R ↥B
a✝ : Nontrivial R
⊢ finrank R ↥(A ⊔ B) ≤ finrank R ↥A * finrank R ↥B
tactic: nontriviality R using finrank
state_before: R : Type u
S : Type v
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : Algebra R S
A B : Subalgebra R S
inst✝¹ : Module.Free R ↥A
inst✝ : Module.Free R ↥B
a✝ : Nontrivial R
⊢ finrank R ↥(A ⊔ B) ≤ finrank R ↥A * finrank R ↥B
state_after: case pos
R : Type u
S : Type v
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : Algebra R S
A B : Subalgebra R S
inst✝¹ : Module.Free R ↥A
inst✝ : Module.Free R ↥B
a✝ : Nontrivial R
h : Module.Finite R ↥A ∧ Module.Finite R ↥B
⊢ finrank R ↥(A ⊔ B) ≤ finrank R ↥A * finrank R ↥B

case neg
R : Type u
S : Type v
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : Algebra R S
A B : Subalgebra R S
inst✝¹ : Module.Free R ↥A
inst✝ : Module.Free R ↥B
a✝ : Nontrivial R
h : ¬(Module.Finite R ↥A ∧ Module.Finite R ↥B)
⊢ finrank R ↥(A ⊔ B) ≤ finrank R ↥A * finrank R ↥B
tactic: by_cases h : Module.Finite R A ∧ Module.Finite R B
state_before: case neg
R : Type u
S : Type v
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : Algebra R S
A B : Subalgebra R S
inst✝¹ : Module.Free R ↥A
inst✝ : Module.Free R ↥B
a✝ : Nontrivial R
h : ¬(Module.Finite R ↥A ∧ Module.Finite R ↥B)
⊢ finrank R ↥(A ⊔ B) ≤ finrank R ↥A * finrank R ↥B
state_after: case neg.inr
R : Type u
S : Type v
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : Algebra R S
A B : Subalgebra R S
inst✝¹ : Module.Free R ↥A
inst✝ : Module.Free R ↥B
a✝ : Nontrivial R
h : ¬(Module.Finite R ↥A ∧ Module.Finite R ↥B)
this :
  ∀ (A B : Subalgebra R S) [inst : Module.Free R ↥A] [inst : Module.Free R ↥B],
    ¬(Module.Finite R ↥A ∧ Module.Finite R ↥B) → ¬Module.Finite R ↥A → finrank R ↥(A ⊔ B) ≤ finrank R ↥A * finrank R ↥B
hA : ¬¬Module.Finite R ↥A
⊢ finrank R ↥(A ⊔ B) ≤ finrank R ↥A * finrank R ↥B

R : Type u
S : Type v
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : Algebra R S
A✝ B✝ : Subalgebra R S
a✝ : Nontrivial R
A B : Subalgebra R S
inst✝¹ : Module.Free R ↥A
inst✝ : Module.Free R ↥B
h : ¬(Module.Finite R ↥A ∧ Module.Finite R ↥B)
hA : ¬Module.Finite R ↥A
⊢ finrank R ↥(A ⊔ B) ≤ finrank R ↥A * finrank R ↥B
tactic: wlog hA : ¬ Module.Finite R A generalizing A B
state_before: R : Type u
S : Type v
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : Algebra R S
A✝ B✝ : Subalgebra R S
a✝ : Nontrivial R
A B : Subalgebra R S
inst✝¹ : Module.Free R ↥A
inst✝ : Module.Free R ↥B
h : ¬(Module.Finite R ↥A ∧ Module.Finite R ↥B)
hA : ¬Module.Finite R ↥A
⊢ finrank R ↥(A ⊔ B) ≤ finrank R ↥A * finrank R ↥B
state_after: R : Type u
S : Type v
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : Algebra R S
A✝ B✝ : Subalgebra R S
a✝ : Nontrivial R
A B : Subalgebra R S
inst✝¹ : Module.Free R ↥A
inst✝ : Module.Free R ↥B
h : ¬(Module.Finite R ↥A ∧ Module.Finite R ↥B)
hA : Cardinal.aleph0 ≤ Module.rank R ↥A
⊢ finrank R ↥(A ⊔ B) ≤ finrank R ↥A * finrank R ↥B
tactic: rw [← Module.rank_lt_alpeh0_iff, not_lt] at hA
state_before: R : Type u
S : Type v
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : Algebra R S
A✝ B✝ : Subalgebra R S
a✝ : Nontrivial R
A B : Subalgebra R S
inst✝¹ : Module.Free R ↥A
inst✝ : Module.Free R ↥B
h : ¬(Module.Finite R ↥A ∧ Module.Finite R ↥B)
hA : Cardinal.aleph0 ≤ Module.rank R ↥A
⊢ finrank R ↥(A ⊔ B) ≤ finrank R ↥A * finrank R ↥B
state_after: R : Type u
S : Type v
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : Algebra R S
A✝ B✝ : Subalgebra R S
a✝ : Nontrivial R
A B : Subalgebra R S
inst✝¹ : Module.Free R ↥A
inst✝ : Module.Free R ↥B
h : ¬(Module.Finite R ↥A ∧ Module.Finite R ↥B)
hA : Cardinal.aleph0 ≤ Module.rank R ↥A
this : Module.rank R ↥(toSubmodule A) ≤ Module.rank R ↥(toSubmodule (A ⊔ B))
⊢ finrank R ↥(A ⊔ B) ≤ finrank R ↥A * finrank R ↥B
tactic: have := LinearMap.rank_le_of_injective _ <| Submodule.inclusion_injective <|
    show toSubmodule A ≤ toSubmodule (A ⊔ B) by simp
state_before: R : Type u
S : Type v
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : Algebra R S
A✝ B✝ : Subalgebra R S
a✝ : Nontrivial R
A B : Subalgebra R S
inst✝¹ : Module.Free R ↥A
inst✝ : Module.Free R ↥B
h : ¬(Module.Finite R ↥A ∧ Module.Finite R ↥B)
hA : Cardinal.aleph0 ≤ Module.rank R ↥A
this : Module.rank R ↥(toSubmodule A) ≤ Module.rank R ↥(toSubmodule (A ⊔ B))
⊢ finrank R ↥(A ⊔ B) ≤ finrank R ↥A * finrank R ↥B
state_after: no goals
tactic: rw [show finrank R A = 0 from Cardinal.toNat_apply_of_aleph0_le hA,
    show finrank R ↥(A ⊔ B) = 0 from Cardinal.toNat_apply_of_aleph0_le (hA.trans this), zero_mul]