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

tactic: conv_lhs => simp only [Module.rank_def]
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
M' : Submodule R M
⊢ Module.rank R (M ⧸ M') + Module.rank R ↥M' ≤ Module.rank R M
state_after: 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
M' : Submodule R M
⊢ (⨆ ι, #↑↑ι) + ⨆ ι, #↑↑ι ≤ Module.rank R M

tactic: have := nonempty_linearIndependent_set 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
M' : Submodule R M
⊢ (⨆ ι, #↑↑ι) + ⨆ ι, #↑↑ι ≤ Module.rank R M
state_after: 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
M' : Submodule R M
this : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
⊢ (⨆ ι, #↑↑ι) + ⨆ ι, #↑↑ι ≤ Module.rank R M

tactic: have := nonempty_linearIndependent_set R 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
M' : Submodule R M
this : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
⊢ (⨆ ι, #↑↑ι) + ⨆ ι, #↑↑ι ≤ Module.rank R M
state_after: 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
M' : Submodule R M
this✝ : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
this : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
⊢ (⨆ ι, #↑↑ι) + ⨆ ι, #↑↑ι ≤ Module.rank R M

tactic: rw [Cardinal.ciSup_add_ciSup _ (bddAbove_range.{v, v} _) _ (bddAbove_range.{v, v} _)]
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
M' : Submodule R M
this✝ : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
this : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
⊢ (⨆ ι, #↑↑ι) + ⨆ ι, #↑↑ι ≤ Module.rank R M
state_after: 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
M' : Submodule R M
this✝ : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
this : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
⊢ ⨆ i, ⨆ j, #↑↑i + #↑↑j ≤ Module.rank R M

tactic: refine ciSup_le fun ⟨s, hs⟩ ↦ ciSup_le fun ⟨t, ht⟩ ↦ ?_
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
M' : Submodule R M
this✝ : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
this : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
⊢ ⨆ i, ⨆ j, #↑↑i + #↑↑j ≤ Module.rank R M
state_after: 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
M' : Submodule R M
this✝ : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
this : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
x✝¹ : { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
s : Set (M ⧸ M')
hs : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
x✝ : { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
t : Set ↥M'
ht : LinearIndependent (ι := { x // x ∈ t }) R Subtype.val
⊢ #↑↑⟨s, hs⟩ + #↑↑⟨t, ht⟩ ≤ Module.rank R M

tactic: choose f hf using Quotient.mk_surjective 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
M' : Submodule R M
this✝ : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
this : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
x✝¹ : { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
s : Set (M ⧸ M')
hs : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
x✝ : { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
t : Set ↥M'
ht : LinearIndependent (ι := { x // x ∈ t }) R Subtype.val
⊢ #↑↑⟨s, hs⟩ + #↑↑⟨t, ht⟩ ≤ Module.rank R M
state_after: 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
M' : Submodule R M
this✝ : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
this : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
x✝¹ : { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
s : Set (M ⧸ M')
hs : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
x✝ : { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
t : Set ↥M'
ht : LinearIndependent (ι := { x // x ∈ t }) R Subtype.val
f : M ⧸ M' → M
hf : ∀ (b : M ⧸ M'), Submodule.Quotient.mk (f b) = b
⊢ #↑↑⟨s, hs⟩ + #↑↑⟨t, ht⟩ ≤ Module.rank R M

tactic: simpa [add_comm] using (LinearIndependent.sum_elim_of_quotient ht (fun (i : s) ↦ f i)
  (by simpa [Function.comp, hf] using hs)).cardinal_le_rank
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
M' : Submodule R M
this✝ : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
this : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
x✝¹ : { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
s : Set (M ⧸ M')
hs : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
x✝ : { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
t : Set ↥M'
ht : LinearIndependent (ι := { x // x ∈ t }) R Subtype.val
f : M ⧸ M' → M
hf : ∀ (b : M ⧸ M'), Submodule.Quotient.mk (f b) = b
⊢ #↑↑⟨s, hs⟩ + #↑↑⟨t, ht⟩ ≤ Module.rank R M
state_after: no goals

tactic: simpa [Function.comp, hf] using hs
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
M' : Submodule R M
this✝ : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
this : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
x✝¹ : { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
s : Set (M ⧸ M')
hs : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
x✝ : { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
t : Set ↥M'
ht : LinearIndependent (ι := { x // x ∈ t }) R Subtype.val
f : M ⧸ M' → M
hf : ∀ (b : M ⧸ M'), Submodule.Quotient.mk (f b) = b
⊢ LinearIndependent (ι := ↑s) R (Submodule.Quotient.mk ∘ fun i => f ↑i)
state_after: no goals