Theorem: Submodule.finrank_add_inf_finrank_orthogonal
File: Mathlib/Analysis/InnerProductSpace/Projection.lean

tactic: haveI : FiniteDimensional 𝕜 K₁ := Submodule.finiteDimensional_of_le h
state_before: 𝕜 : Type u_1
E : Type u_2
F : Type ?u.988806
inst✝⁵ : IsROrC 𝕜
inst✝⁴ : NormedAddCommGroup E
inst✝³ : NormedAddCommGroup F
inst✝² : InnerProductSpace 𝕜 E
inst✝¹ : InnerProductSpace ℝ F
K K₁ K₂ : Submodule 𝕜 E
inst✝ : FiniteDimensional 𝕜 { x // x ∈ K₂ }
h : K₁ ≤ K₂
⊢ finrank 𝕜 { x // x ∈ K₁ } + finrank 𝕜 { x // x ∈ K₁ᗮ ⊓ K₂ } = finrank 𝕜 { x // x ∈ K₂ }

tactic: haveI := proper_isROrC 𝕜 K₁
state_before: 𝕜 : Type u_1
E : Type u_2
F : Type ?u.988806
inst✝⁵ : IsROrC 𝕜
inst✝⁴ : NormedAddCommGroup E
inst✝³ : NormedAddCommGroup F
inst✝² : InnerProductSpace 𝕜 E
inst✝¹ : InnerProductSpace ℝ F
K K₁ K₂ : Submodule 𝕜 E
inst✝ : FiniteDimensional 𝕜 { x // x ∈ K₂ }
h : K₁ ≤ K₂
this : FiniteDimensional 𝕜 { x // x ∈ K₁ }
⊢ finrank 𝕜 { x // x ∈ K₁ } + finrank 𝕜 { x // x ∈ K₁ᗮ ⊓ K₂ } = finrank 𝕜 { x // x ∈ K₂ }

tactic: have hd := Submodule.finrank_sup_add_finrank_inf_eq K₁ (K₁ᗮ ⊓ K₂)
state_before: 𝕜 : Type u_1
E : Type u_2
F : Type ?u.988806
inst✝⁵ : IsROrC 𝕜
inst✝⁴ : NormedAddCommGroup E
inst✝³ : NormedAddCommGroup F
inst✝² : InnerProductSpace 𝕜 E
inst✝¹ : InnerProductSpace ℝ F
K K₁ K₂ : Submodule 𝕜 E
inst✝ : FiniteDimensional 𝕜 { x // x ∈ K₂ }
h : K₁ ≤ K₂
this✝ : FiniteDimensional 𝕜 { x // x ∈ K₁ }
this : ProperSpace { x // x ∈ K₁ }
⊢ finrank 𝕜 { x // x ∈ K₁ } + finrank 𝕜 { x // x ∈ K₁ᗮ ⊓ K₂ } = finrank 𝕜 { x // x ∈ K₂ }

tactic: rw [← inf_assoc, (Submodule.orthogonal_disjoint K₁).eq_bot, bot_inf_eq, finrank_bot,
  Submodule.sup_orthogonal_inf_of_completeSpace h] at hd
state_before: 𝕜 : Type u_1
E : Type u_2
F : Type ?u.988806
inst✝⁵ : IsROrC 𝕜
inst✝⁴ : NormedAddCommGroup E
inst✝³ : NormedAddCommGroup F
inst✝² : InnerProductSpace 𝕜 E
inst✝¹ : InnerProductSpace ℝ F
K K₁ K₂ : Submodule 𝕜 E
inst✝ : FiniteDimensional 𝕜 { x // x ∈ K₂ }
h : K₁ ≤ K₂
this✝ : FiniteDimensional 𝕜 { x // x ∈ K₁ }
this : ProperSpace { x // x ∈ K₁ }
hd :
  finrank 𝕜 { x // x ∈ K₁ ⊔ K₁ᗮ ⊓ K₂ } + finrank 𝕜 { x // x ∈ K₁ ⊓ (K₁ᗮ ⊓ K₂) } =
    finrank 𝕜 { x // x ∈ K₁ } + finrank 𝕜 { x // x ∈ K₁ᗮ ⊓ K₂ }
⊢ finrank 𝕜 { x // x ∈ K₁ } + finrank 𝕜 { x // x ∈ K₁ᗮ ⊓ K₂ } = finrank 𝕜 { x // x ∈ K₂ }

tactic: rw [add_zero] at hd
state_before: 𝕜 : Type u_1
E : Type u_2
F : Type ?u.988806
inst✝⁵ : IsROrC 𝕜
inst✝⁴ : NormedAddCommGroup E
inst✝³ : NormedAddCommGroup F
inst✝² : InnerProductSpace 𝕜 E
inst✝¹ : InnerProductSpace ℝ F
K K₁ K₂ : Submodule 𝕜 E
inst✝ : FiniteDimensional 𝕜 { x // x ∈ K₂ }
h : K₁ ≤ K₂
this✝ : FiniteDimensional 𝕜 { x // x ∈ K₁ }
this : ProperSpace { x // x ∈ K₁ }
hd : finrank 𝕜 { x // x ∈ K₂ } + 0 = finrank 𝕜 { x // x ∈ K₁ } + finrank 𝕜 { x // x ∈ K₁ᗮ ⊓ K₂ }
⊢ finrank 𝕜 { x // x ∈ K₁ } + finrank 𝕜 { x // x ∈ K₁ᗮ ⊓ K₂ } = finrank 𝕜 { x // x ∈ K₂ }

tactic: exact hd.symm
state_before: 𝕜 : Type u_1
E : Type u_2
F : Type ?u.988806
inst✝⁵ : IsROrC 𝕜
inst✝⁴ : NormedAddCommGroup E
inst✝³ : NormedAddCommGroup F
inst✝² : InnerProductSpace 𝕜 E
inst✝¹ : InnerProductSpace ℝ F
K K₁ K₂ : Submodule 𝕜 E
inst✝ : FiniteDimensional 𝕜 { x // x ∈ K₂ }
h : K₁ ≤ K₂
this✝ : FiniteDimensional 𝕜 { x // x ∈ K₁ }
this : ProperSpace { x // x ∈ K₁ }
hd : finrank 𝕜 { x // x ∈ K₂ } = finrank 𝕜 { x // x ∈ K₁ } + finrank 𝕜 { x // x ∈ K₁ᗮ ⊓ K₂ }
⊢ finrank 𝕜 { x // x ∈ K₁ } + finrank 𝕜 { x // x ∈ K₁ᗮ ⊓ K₂ } = finrank 𝕜 { x // x ∈ K₂ }