[GOAL]
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
μ : 𝕜
v : E
hv : v ∈ (eigenspace T μ)ᗮ
⊢ ↑T v ∈ (eigenspace T μ)ᗮ
[PROOFSTEP]
intro w hw
[GOAL]
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
μ : 𝕜
v : E
hv : v ∈ (eigenspace T μ)ᗮ
w : E
hw : w ∈ eigenspace T μ
⊢ inner w (↑T v) = 0
[PROOFSTEP]
have : T w = (μ : 𝕜) • w := by rwa [mem_eigenspace_iff] at hw
[GOAL]
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
μ : 𝕜
v : E
hv : v ∈ (eigenspace T μ)ᗮ
w : E
hw : w ∈ eigenspace T μ
⊢ ↑T w = μ • w
[PROOFSTEP]
rwa [mem_eigenspace_iff] at hw
[GOAL]
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
μ : 𝕜
v : E
hv : v ∈ (eigenspace T μ)ᗮ
w : E
hw : w ∈ eigenspace T μ
this : ↑T w = μ • w
⊢ inner w (↑T v) = 0
[PROOFSTEP]
simp [← hT w, this, inner_smul_left, hv w hw]
[GOAL]
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
μ : 𝕜
hμ : HasEigenvalue T μ
⊢ ↑(starRingEnd 𝕜) μ = μ
[PROOFSTEP]
obtain ⟨v, hv₁, hv₂⟩ := hμ.exists_hasEigenvector
[GOAL]
case intro.intro
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
μ : 𝕜
hμ : HasEigenvalue T μ
v : E
hv₁ : v ∈ eigenspace T μ
hv₂ : v ≠ 0
⊢ ↑(starRingEnd 𝕜) μ = μ
[PROOFSTEP]
rw [mem_eigenspace_iff] at hv₁
[GOAL]
case intro.intro
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
μ : 𝕜
hμ : HasEigenvalue T μ
v : E
hv₁ : ↑T v = μ • v
hv₂ : v ≠ 0
⊢ ↑(starRingEnd 𝕜) μ = μ
[PROOFSTEP]
simpa [hv₂, inner_smul_left, inner_smul_right, hv₁] using hT v v
[GOAL]
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
⊢ OrthogonalFamily 𝕜 (fun μ => { x // x ∈ eigenspace T μ }) fun μ => Submodule.subtypeₗᵢ (eigenspace T μ)
[PROOFSTEP]
rintro μ ν hμν ⟨v, hv⟩ ⟨w, hw⟩
[GOAL]
case mk.mk
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
μ ν : 𝕜
hμν : μ ≠ ν
v : E
hv : v ∈ eigenspace T μ
w : E
hw : w ∈ eigenspace T ν
⊢ inner (↑((fun μ => Submodule.subtypeₗᵢ (eigenspace T μ)) μ) { val := v, property := hv })
      (↑((fun μ => Submodule.subtypeₗᵢ (eigenspace T μ)) ν) { val := w, property := hw }) =
    0
[PROOFSTEP]
by_cases hv' : v = 0
[GOAL]
case pos
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
μ ν : 𝕜
hμν : μ ≠ ν
v : E
hv : v ∈ eigenspace T μ
w : E
hw : w ∈ eigenspace T ν
hv' : v = 0
⊢ inner (↑((fun μ => Submodule.subtypeₗᵢ (eigenspace T μ)) μ) { val := v, property := hv })
      (↑((fun μ => Submodule.subtypeₗᵢ (eigenspace T μ)) ν) { val := w, property := hw }) =
    0
[PROOFSTEP]
simp [hv']
[GOAL]
case neg
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
μ ν : 𝕜
hμν : μ ≠ ν
v : E
hv : v ∈ eigenspace T μ
w : E
hw : w ∈ eigenspace T ν
hv' : ¬v = 0
⊢ inner (↑((fun μ => Submodule.subtypeₗᵢ (eigenspace T μ)) μ) { val := v, property := hv })
      (↑((fun μ => Submodule.subtypeₗᵢ (eigenspace T μ)) ν) { val := w, property := hw }) =
    0
[PROOFSTEP]
have H := hT.conj_eigenvalue_eq_self (hasEigenvalue_of_hasEigenvector ⟨hv, hv'⟩)
[GOAL]
case neg
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
μ ν : 𝕜
hμν : μ ≠ ν
v : E
hv : v ∈ eigenspace T μ
w : E
hw : w ∈ eigenspace T ν
hv' : ¬v = 0
H : ↑(starRingEnd 𝕜) μ = μ
⊢ inner (↑((fun μ => Submodule.subtypeₗᵢ (eigenspace T μ)) μ) { val := v, property := hv })
      (↑((fun μ => Submodule.subtypeₗᵢ (eigenspace T μ)) ν) { val := w, property := hw }) =
    0
[PROOFSTEP]
rw [mem_eigenspace_iff] at hv hw
[GOAL]
case neg
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
μ ν : 𝕜
hμν : μ ≠ ν
v : E
hv✝ : v ∈ eigenspace T μ
hv : ↑T v = μ • v
w : E
hw✝ : w ∈ eigenspace T ν
hw : ↑T w = ν • w
hv' : ¬v = 0
H : ↑(starRingEnd 𝕜) μ = μ
⊢ inner (↑((fun μ => Submodule.subtypeₗᵢ (eigenspace T μ)) μ) { val := v, property := hv✝ })
      (↑((fun μ => Submodule.subtypeₗᵢ (eigenspace T μ)) ν) { val := w, property := hw✝ }) =
    0
[PROOFSTEP]
refine' Or.resolve_left _ hμν.symm
[GOAL]
case neg
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
μ ν : 𝕜
hμν : μ ≠ ν
v : E
hv✝ : v ∈ eigenspace T μ
hv : ↑T v = μ • v
w : E
hw✝ : w ∈ eigenspace T ν
hw : ↑T w = ν • w
hv' : ¬v = 0
H : ↑(starRingEnd 𝕜) μ = μ
⊢ ν = μ ∨
    inner (↑((fun μ => Submodule.subtypeₗᵢ (eigenspace T μ)) μ) { val := v, property := hv✝ })
        (↑((fun μ => Submodule.subtypeₗᵢ (eigenspace T μ)) ν) { val := w, property := hw✝ }) =
      0
[PROOFSTEP]
simpa [inner_smul_left, inner_smul_right, hv, hw, H] using (hT v w).symm
[GOAL]
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
v : E
hv : v ∈ (⨆ (μ : 𝕜), eigenspace T μ)ᗮ
⊢ ↑T v ∈ (⨆ (μ : 𝕜), eigenspace T μ)ᗮ
[PROOFSTEP]
rw [← Submodule.iInf_orthogonal] at hv ⊢
[GOAL]
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
v : E
hv : v ∈ ⨅ (i : 𝕜), (eigenspace T i)ᗮ
⊢ ↑T v ∈ ⨅ (i : 𝕜), (eigenspace T i)ᗮ
[PROOFSTEP]
exact T.iInf_invariant hT.invariant_orthogonalComplement_eigenspace v hv
[GOAL]
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
μ : 𝕜
⊢ eigenspace (restrict T (_ : ∀ ⦃v : E⦄, v ∈ (⨆ (μ : 𝕜), eigenspace T μ)ᗮ → ↑T v ∈ (⨆ (μ : 𝕜), eigenspace T μ)ᗮ)) μ = ⊥
[PROOFSTEP]
set p : Submodule 𝕜 E := (⨆ μ, eigenspace T μ)ᗮ
[GOAL]
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
μ : 𝕜
p : Submodule 𝕜 E := (⨆ (μ : 𝕜), eigenspace T μ)ᗮ
⊢ eigenspace (restrict T (_ : ∀ ⦃v : E⦄, v ∈ (⨆ (μ : 𝕜), eigenspace T μ)ᗮ → ↑T v ∈ (⨆ (μ : 𝕜), eigenspace T μ)ᗮ)) μ = ⊥
[PROOFSTEP]
refine' eigenspace_restrict_eq_bot hT.orthogonalComplement_iSup_eigenspaces_invariant _
[GOAL]
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
μ : 𝕜
p : Submodule 𝕜 E := (⨆ (μ : 𝕜), eigenspace T μ)ᗮ
⊢ Disjoint (eigenspace T μ) (⨆ (μ : 𝕜), eigenspace T μ)ᗮ
[PROOFSTEP]
have H₂ : eigenspace T μ ⟂ p := (Submodule.isOrtho_orthogonal_right _).mono_left (le_iSup _ _)
[GOAL]
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
μ : 𝕜
p : Submodule 𝕜 E := (⨆ (μ : 𝕜), eigenspace T μ)ᗮ
H₂ : eigenspace T μ ⟂ p
⊢ Disjoint (eigenspace T μ) (⨆ (μ : 𝕜), eigenspace T μ)ᗮ
[PROOFSTEP]
exact H₂.disjoint
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
⊢ (⨆ (μ : 𝕜), eigenspace T μ)ᗮ = ⊥
[PROOFSTEP]
have hT' : IsSymmetric _ := hT.restrict_invariant hT.orthogonalComplement_iSup_eigenspaces_invariant
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
hT' : IsSymmetric (restrict T (_ : ∀ ⦃v : E⦄, v ∈ (⨆ (μ : 𝕜), eigenspace T μ)ᗮ → ↑T v ∈ (⨆ (μ : 𝕜), eigenspace T μ)ᗮ))
⊢ (⨆ (μ : 𝕜), eigenspace T μ)ᗮ = ⊥
[PROOFSTEP]
haveI := hT'.subsingleton_of_no_eigenvalue_finiteDimensional hT.orthogonalComplement_iSup_eigenspaces
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
hT' : IsSymmetric (restrict T (_ : ∀ ⦃v : E⦄, v ∈ (⨆ (μ : 𝕜), eigenspace T μ)ᗮ → ↑T v ∈ (⨆ (μ : 𝕜), eigenspace T μ)ᗮ))
this : Subsingleton { x // x ∈ (⨆ (μ : 𝕜), eigenspace T μ)ᗮ }
⊢ (⨆ (μ : 𝕜), eigenspace T μ)ᗮ = ⊥
[PROOFSTEP]
exact Submodule.eq_bot_of_subsingleton _
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
⊢ (⨆ (μ : { μ // eigenspace T μ ≠ ⊥ }), eigenspace T ↑μ)ᗮ = ⊥
[PROOFSTEP]
rw [iSup_ne_bot_subtype, hT.orthogonalComplement_iSup_eigenspaces_eq_bot]
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT✝ : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
hT : Fact (IsSymmetric T)
μ : Eigenvalues T
⊢ CompleteSpace { x // x ∈ eigenspace T (↑T μ) }
[PROOFSTEP]
infer_instance
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
v : E
μ : Eigenvalues T
⊢ ↑(diagonalization hT) (↑T v) μ = ↑T μ • ↑(diagonalization hT) v μ
[PROOFSTEP]
suffices
  ∀ w : PiLp 2 fun μ : Eigenvalues T => eigenspace T μ,
    T (hT.diagonalization.symm w) = hT.diagonalization.symm fun μ => (μ : 𝕜) • w μ
  by
  simpa only [LinearIsometryEquiv.symm_apply_apply, LinearIsometryEquiv.apply_symm_apply] using
    congr_arg (fun w => hT.diagonalization w μ) (this (hT.diagonalization v))
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
v : E
μ : Eigenvalues T
this :
  ∀ (w : PiLp 2 fun μ => { x // x ∈ eigenspace T (↑T μ) }),
    ↑T (↑(LinearIsometryEquiv.symm (diagonalization hT)) w) =
      ↑(LinearIsometryEquiv.symm (diagonalization hT)) fun μ => ↑T μ • w μ
⊢ ↑(diagonalization hT) (↑T v) μ = ↑T μ • ↑(diagonalization hT) v μ
[PROOFSTEP]
simpa only [LinearIsometryEquiv.symm_apply_apply, LinearIsometryEquiv.apply_symm_apply] using
  congr_arg (fun w => hT.diagonalization w μ) (this (hT.diagonalization v))
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
v : E
μ : Eigenvalues T
⊢ ∀ (w : PiLp 2 fun μ => { x // x ∈ eigenspace T (↑T μ) }),
    ↑T (↑(LinearIsometryEquiv.symm (diagonalization hT)) w) =
      ↑(LinearIsometryEquiv.symm (diagonalization hT)) fun μ => ↑T μ • w μ
[PROOFSTEP]
intro w
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
v : E
μ : Eigenvalues T
w : PiLp 2 fun μ => { x // x ∈ eigenspace T (↑T μ) }
⊢ ↑T (↑(LinearIsometryEquiv.symm (diagonalization hT)) w) =
    ↑(LinearIsometryEquiv.symm (diagonalization hT)) fun μ => ↑T μ • w μ
[PROOFSTEP]
have hwT : ∀ μ, T (w μ) = (μ : 𝕜) • w μ := fun μ => mem_eigenspace_iff.1 (w μ).2
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
v : E
μ : Eigenvalues T
w : PiLp 2 fun μ => { x // x ∈ eigenspace T (↑T μ) }
hwT : ∀ (μ : Eigenvalues T), ↑T ↑(w μ) = ↑(↑T μ • w μ)
⊢ ↑T (↑(LinearIsometryEquiv.symm (diagonalization hT)) w) =
    ↑(LinearIsometryEquiv.symm (diagonalization hT)) fun μ => ↑T μ • w μ
[PROOFSTEP]
simp only [hwT, diagonalization_symm_apply, map_sum, Submodule.coe_smul_of_tower]
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
n : ℕ
hn : FiniteDimensional.finrank 𝕜 E = n
i : Fin n
⊢ HasEigenvector T (↑(eigenvalues hT hn i)) (↑(eigenvectorBasis hT hn) i)
[PROOFSTEP]
let v : E := hT.eigenvectorBasis hn i
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
n : ℕ
hn : FiniteDimensional.finrank 𝕜 E = n
i : Fin n
v : E := ↑(eigenvectorBasis hT hn) i
⊢ HasEigenvector T (↑(eigenvalues hT hn i)) (↑(eigenvectorBasis hT hn) i)
[PROOFSTEP]
let μ : 𝕜 := (hT.direct_sum_isInternal.subordinateOrthonormalBasisIndex hn i hT.orthogonalFamily_eigenspaces').val
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
n : ℕ
hn : FiniteDimensional.finrank 𝕜 E = n
i : Fin n
v : E := ↑(eigenvectorBasis hT hn) i
μ : 𝕜 :=
  ↑T
    (DirectSum.IsInternal.subordinateOrthonormalBasisIndex hn (_ : DirectSum.IsInternal fun μ => eigenspace T (↑T μ)) i
      (_ :
        OrthogonalFamily 𝕜 (fun μ => { x // x ∈ eigenspace T (↑T μ) }) fun μ =>
          Submodule.subtypeₗᵢ (eigenspace T (↑T μ))))
⊢ HasEigenvector T (↑(eigenvalues hT hn i)) (↑(eigenvectorBasis hT hn) i)
[PROOFSTEP]
simp_rw [eigenvalues]
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
n : ℕ
hn : FiniteDimensional.finrank 𝕜 E = n
i : Fin n
v : E := ↑(eigenvectorBasis hT hn) i
μ : 𝕜 :=
  ↑T
    (DirectSum.IsInternal.subordinateOrthonormalBasisIndex hn (_ : DirectSum.IsInternal fun μ => eigenspace T (↑T μ)) i
      (_ :
        OrthogonalFamily 𝕜 (fun μ => { x // x ∈ eigenspace T (↑T μ) }) fun μ =>
          Submodule.subtypeₗᵢ (eigenspace T (↑T μ))))
⊢ HasEigenvector T
    (↑(↑IsROrC.re
        (↑T
          (DirectSum.IsInternal.subordinateOrthonormalBasisIndex hn
            (_ : DirectSum.IsInternal fun μ => eigenspace T (↑T μ)) i
            (_ :
              OrthogonalFamily 𝕜 (fun μ => { x // x ∈ eigenspace T (↑T μ) }) fun μ =>
                Submodule.subtypeₗᵢ (eigenspace T (↑T μ)))))))
    (↑(eigenvectorBasis hT hn) i)
[PROOFSTEP]
change HasEigenvector T (IsROrC.re μ) v
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
n : ℕ
hn : FiniteDimensional.finrank 𝕜 E = n
i : Fin n
v : E := ↑(eigenvectorBasis hT hn) i
μ : 𝕜 :=
  ↑T
    (DirectSum.IsInternal.subordinateOrthonormalBasisIndex hn (_ : DirectSum.IsInternal fun μ => eigenspace T (↑T μ)) i
      (_ :
        OrthogonalFamily 𝕜 (fun μ => { x // x ∈ eigenspace T (↑T μ) }) fun μ =>
          Submodule.subtypeₗᵢ (eigenspace T (↑T μ))))
⊢ HasEigenvector T (↑(↑IsROrC.re μ)) v
[PROOFSTEP]
have key : HasEigenvector T μ v :=
  by
  have H₁ : v ∈ eigenspace T μ := by
    simp_rw [eigenvectorBasis]
    exact hT.direct_sum_isInternal.subordinateOrthonormalBasis_subordinate hn i hT.orthogonalFamily_eigenspaces'
  have H₂ : v ≠ 0 := by simpa using (hT.eigenvectorBasis hn).toBasis.ne_zero i
  exact ⟨H₁, H₂⟩
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
n : ℕ
hn : FiniteDimensional.finrank 𝕜 E = n
i : Fin n
v : E := ↑(eigenvectorBasis hT hn) i
μ : 𝕜 :=
  ↑T
    (DirectSum.IsInternal.subordinateOrthonormalBasisIndex hn (_ : DirectSum.IsInternal fun μ => eigenspace T (↑T μ)) i
      (_ :
        OrthogonalFamily 𝕜 (fun μ => { x // x ∈ eigenspace T (↑T μ) }) fun μ =>
          Submodule.subtypeₗᵢ (eigenspace T (↑T μ))))
⊢ HasEigenvector T μ v
[PROOFSTEP]
have H₁ : v ∈ eigenspace T μ := by
  simp_rw [eigenvectorBasis]
  exact hT.direct_sum_isInternal.subordinateOrthonormalBasis_subordinate hn i hT.orthogonalFamily_eigenspaces'
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
n : ℕ
hn : FiniteDimensional.finrank 𝕜 E = n
i : Fin n
v : E := ↑(eigenvectorBasis hT hn) i
μ : 𝕜 :=
  ↑T
    (DirectSum.IsInternal.subordinateOrthonormalBasisIndex hn (_ : DirectSum.IsInternal fun μ => eigenspace T (↑T μ)) i
      (_ :
        OrthogonalFamily 𝕜 (fun μ => { x // x ∈ eigenspace T (↑T μ) }) fun μ =>
          Submodule.subtypeₗᵢ (eigenspace T (↑T μ))))
⊢ v ∈ eigenspace T μ
[PROOFSTEP]
simp_rw [eigenvectorBasis]
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
n : ℕ
hn : FiniteDimensional.finrank 𝕜 E = n
i : Fin n
v : E := ↑(eigenvectorBasis hT hn) i
μ : 𝕜 :=
  ↑T
    (DirectSum.IsInternal.subordinateOrthonormalBasisIndex hn (_ : DirectSum.IsInternal fun μ => eigenspace T (↑T μ)) i
      (_ :
        OrthogonalFamily 𝕜 (fun μ => { x // x ∈ eigenspace T (↑T μ) }) fun μ =>
          Submodule.subtypeₗᵢ (eigenspace T (↑T μ))))
⊢ ↑(DirectSum.IsInternal.subordinateOrthonormalBasis hn (_ : DirectSum.IsInternal fun μ => eigenspace T (↑T μ))
          (_ :
            OrthogonalFamily 𝕜 (fun μ => { x // x ∈ eigenspace T (↑T μ) }) fun μ =>
              Submodule.subtypeₗᵢ (eigenspace T (↑T μ))))
      i ∈
    eigenspace T
      (↑T
        (DirectSum.IsInternal.subordinateOrthonormalBasisIndex hn
          (_ : DirectSum.IsInternal fun μ => eigenspace T (↑T μ)) i
          (_ :
            OrthogonalFamily 𝕜 (fun μ => { x // x ∈ eigenspace T (↑T μ) }) fun μ =>
              Submodule.subtypeₗᵢ (eigenspace T (↑T μ)))))
[PROOFSTEP]
exact hT.direct_sum_isInternal.subordinateOrthonormalBasis_subordinate hn i hT.orthogonalFamily_eigenspaces'
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
n : ℕ
hn : FiniteDimensional.finrank 𝕜 E = n
i : Fin n
v : E := ↑(eigenvectorBasis hT hn) i
μ : 𝕜 :=
  ↑T
    (DirectSum.IsInternal.subordinateOrthonormalBasisIndex hn (_ : DirectSum.IsInternal fun μ => eigenspace T (↑T μ)) i
      (_ :
        OrthogonalFamily 𝕜 (fun μ => { x // x ∈ eigenspace T (↑T μ) }) fun μ =>
          Submodule.subtypeₗᵢ (eigenspace T (↑T μ))))
H₁ : v ∈ eigenspace T μ
⊢ HasEigenvector T μ v
[PROOFSTEP]
have H₂ : v ≠ 0 := by simpa using (hT.eigenvectorBasis hn).toBasis.ne_zero i
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
n : ℕ
hn : FiniteDimensional.finrank 𝕜 E = n
i : Fin n
v : E := ↑(eigenvectorBasis hT hn) i
μ : 𝕜 :=
  ↑T
    (DirectSum.IsInternal.subordinateOrthonormalBasisIndex hn (_ : DirectSum.IsInternal fun μ => eigenspace T (↑T μ)) i
      (_ :
        OrthogonalFamily 𝕜 (fun μ => { x // x ∈ eigenspace T (↑T μ) }) fun μ =>
          Submodule.subtypeₗᵢ (eigenspace T (↑T μ))))
H₁ : v ∈ eigenspace T μ
⊢ v ≠ 0
[PROOFSTEP]
simpa using (hT.eigenvectorBasis hn).toBasis.ne_zero i
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
n : ℕ
hn : FiniteDimensional.finrank 𝕜 E = n
i : Fin n
v : E := ↑(eigenvectorBasis hT hn) i
μ : 𝕜 :=
  ↑T
    (DirectSum.IsInternal.subordinateOrthonormalBasisIndex hn (_ : DirectSum.IsInternal fun μ => eigenspace T (↑T μ)) i
      (_ :
        OrthogonalFamily 𝕜 (fun μ => { x // x ∈ eigenspace T (↑T μ) }) fun μ =>
          Submodule.subtypeₗᵢ (eigenspace T (↑T μ))))
H₁ : v ∈ eigenspace T μ
H₂ : v ≠ 0
⊢ HasEigenvector T μ v
[PROOFSTEP]
exact ⟨H₁, H₂⟩
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
n : ℕ
hn : FiniteDimensional.finrank 𝕜 E = n
i : Fin n
v : E := ↑(eigenvectorBasis hT hn) i
μ : 𝕜 :=
  ↑T
    (DirectSum.IsInternal.subordinateOrthonormalBasisIndex hn (_ : DirectSum.IsInternal fun μ => eigenspace T (↑T μ)) i
      (_ :
        OrthogonalFamily 𝕜 (fun μ => { x // x ∈ eigenspace T (↑T μ) }) fun μ =>
          Submodule.subtypeₗᵢ (eigenspace T (↑T μ))))
key : HasEigenvector T μ v
⊢ HasEigenvector T (↑(↑IsROrC.re μ)) v
[PROOFSTEP]
have re_μ : ↑(IsROrC.re μ) = μ := by
  rw [← IsROrC.conj_eq_iff_re]
  exact hT.conj_eigenvalue_eq_self (hasEigenvalue_of_hasEigenvector key)
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
n : ℕ
hn : FiniteDimensional.finrank 𝕜 E = n
i : Fin n
v : E := ↑(eigenvectorBasis hT hn) i
μ : 𝕜 :=
  ↑T
    (DirectSum.IsInternal.subordinateOrthonormalBasisIndex hn (_ : DirectSum.IsInternal fun μ => eigenspace T (↑T μ)) i
      (_ :
        OrthogonalFamily 𝕜 (fun μ => { x // x ∈ eigenspace T (↑T μ) }) fun μ =>
          Submodule.subtypeₗᵢ (eigenspace T (↑T μ))))
key : HasEigenvector T μ v
⊢ ↑(↑IsROrC.re μ) = μ
[PROOFSTEP]
rw [← IsROrC.conj_eq_iff_re]
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
n : ℕ
hn : FiniteDimensional.finrank 𝕜 E = n
i : Fin n
v : E := ↑(eigenvectorBasis hT hn) i
μ : 𝕜 :=
  ↑T
    (DirectSum.IsInternal.subordinateOrthonormalBasisIndex hn (_ : DirectSum.IsInternal fun μ => eigenspace T (↑T μ)) i
      (_ :
        OrthogonalFamily 𝕜 (fun μ => { x // x ∈ eigenspace T (↑T μ) }) fun μ =>
          Submodule.subtypeₗᵢ (eigenspace T (↑T μ))))
key : HasEigenvector T μ v
⊢ ↑(starRingEnd 𝕜) μ = μ
[PROOFSTEP]
exact hT.conj_eigenvalue_eq_self (hasEigenvalue_of_hasEigenvector key)
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
n : ℕ
hn : FiniteDimensional.finrank 𝕜 E = n
i : Fin n
v : E := ↑(eigenvectorBasis hT hn) i
μ : 𝕜 :=
  ↑T
    (DirectSum.IsInternal.subordinateOrthonormalBasisIndex hn (_ : DirectSum.IsInternal fun μ => eigenspace T (↑T μ)) i
      (_ :
        OrthogonalFamily 𝕜 (fun μ => { x // x ∈ eigenspace T (↑T μ) }) fun μ =>
          Submodule.subtypeₗᵢ (eigenspace T (↑T μ))))
key : HasEigenvector T μ v
re_μ : ↑(↑IsROrC.re μ) = μ
⊢ HasEigenvector T (↑(↑IsROrC.re μ)) v
[PROOFSTEP]
simpa [re_μ] using key
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
n : ℕ
hn : FiniteDimensional.finrank 𝕜 E = n
v : E
i : Fin n
⊢ ↑(eigenvectorBasis hT hn).repr (↑T v) i = ↑(eigenvalues hT hn i) * ↑(eigenvectorBasis hT hn).repr v i
[PROOFSTEP]
suffices
  ∀ w : EuclideanSpace 𝕜 (Fin n),
    T ((hT.eigenvectorBasis hn).repr.symm w) = (hT.eigenvectorBasis hn).repr.symm fun i => hT.eigenvalues hn i * w i
  by
  simpa [OrthonormalBasis.sum_repr_symm] using
    congr_arg (fun v => (hT.eigenvectorBasis hn).repr v i) (this ((hT.eigenvectorBasis hn).repr v))
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
n : ℕ
hn : FiniteDimensional.finrank 𝕜 E = n
v : E
i : Fin n
this :
  ∀ (w : EuclideanSpace 𝕜 (Fin n)),
    ↑T (↑(LinearIsometryEquiv.symm (eigenvectorBasis hT hn).repr) w) =
      ↑(LinearIsometryEquiv.symm (eigenvectorBasis hT hn).repr) fun i => ↑(eigenvalues hT hn i) * w i
⊢ ↑(eigenvectorBasis hT hn).repr (↑T v) i = ↑(eigenvalues hT hn i) * ↑(eigenvectorBasis hT hn).repr v i
[PROOFSTEP]
simpa [OrthonormalBasis.sum_repr_symm] using
  congr_arg (fun v => (hT.eigenvectorBasis hn).repr v i) (this ((hT.eigenvectorBasis hn).repr v))
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
n : ℕ
hn : FiniteDimensional.finrank 𝕜 E = n
v : E
i : Fin n
⊢ ∀ (w : EuclideanSpace 𝕜 (Fin n)),
    ↑T (↑(LinearIsometryEquiv.symm (eigenvectorBasis hT hn).repr) w) =
      ↑(LinearIsometryEquiv.symm (eigenvectorBasis hT hn).repr) fun i => ↑(eigenvalues hT hn i) * w i
[PROOFSTEP]
intro w
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
n : ℕ
hn : FiniteDimensional.finrank 𝕜 E = n
v : E
i : Fin n
w : EuclideanSpace 𝕜 (Fin n)
⊢ ↑T (↑(LinearIsometryEquiv.symm (eigenvectorBasis hT hn).repr) w) =
    ↑(LinearIsometryEquiv.symm (eigenvectorBasis hT hn).repr) fun i => ↑(eigenvalues hT hn i) * w i
[PROOFSTEP]
simp_rw [← OrthonormalBasis.sum_repr_symm, LinearMap.map_sum, LinearMap.map_smul, apply_eigenvectorBasis]
[GOAL]
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
n : ℕ
hn : FiniteDimensional.finrank 𝕜 E = n
v : E
i : Fin n
w : EuclideanSpace 𝕜 (Fin n)
⊢ ∑ x : Fin n, w x • ↑(eigenvalues hT hn x) • ↑(eigenvectorBasis hT hn) x =
    ∑ x : Fin n, (↑(eigenvalues hT hn x) * w x) • ↑(eigenvectorBasis hT hn) x
[PROOFSTEP]
apply Fintype.sum_congr
[GOAL]
case h
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
n : ℕ
hn : FiniteDimensional.finrank 𝕜 E = n
v : E
i : Fin n
w : EuclideanSpace 𝕜 (Fin n)
⊢ ∀ (a : Fin n),
    w a • ↑(eigenvalues hT hn a) • ↑(eigenvectorBasis hT hn) a =
      (↑(eigenvalues hT hn a) * w a) • ↑(eigenvectorBasis hT hn) a
[PROOFSTEP]
intro a
[GOAL]
case h
𝕜 : Type u_1
inst✝³ : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
T : E →ₗ[𝕜] E
hT : IsSymmetric T
inst✝ : FiniteDimensional 𝕜 E
n : ℕ
hn : FiniteDimensional.finrank 𝕜 E = n
v : E
i : Fin n
w : EuclideanSpace 𝕜 (Fin n)
a : Fin n
⊢ w a • ↑(eigenvalues hT hn a) • ↑(eigenvectorBasis hT hn) a =
    (↑(eigenvalues hT hn a) * w a) • ↑(eigenvectorBasis hT hn) a
[PROOFSTEP]
rw [smul_smul, mul_comm]
[GOAL]
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
μ : 𝕜
v : E
T : E →ₗ[𝕜] E
h : v ∈ eigenspace T μ
⊢ inner v (↑T v) = μ * ↑‖v‖ ^ 2
[PROOFSTEP]
simp only [mem_eigenspace_iff.mp h, inner_smul_right, inner_self_eq_norm_sq_to_K]
[GOAL]
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
μ : ℝ
T : E →ₗ[𝕜] E
hμ : HasEigenvalue T ↑μ
hnn : ∀ (x : E), 0 ≤ ↑IsROrC.re (inner x (↑T x))
⊢ 0 ≤ μ
[PROOFSTEP]
obtain ⟨v, hv⟩ := hμ.exists_hasEigenvector
[GOAL]
case intro
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
μ : ℝ
T : E →ₗ[𝕜] E
hμ : HasEigenvalue T ↑μ
hnn : ∀ (x : E), 0 ≤ ↑IsROrC.re (inner x (↑T x))
v : E
hv : HasEigenvector T (↑μ) v
⊢ 0 ≤ μ
[PROOFSTEP]
have hpos : (0 : ℝ) < ‖v‖ ^ 2 := by simpa only [sq_pos_iff, norm_ne_zero_iff] using hv.2
[GOAL]
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
μ : ℝ
T : E →ₗ[𝕜] E
hμ : HasEigenvalue T ↑μ
hnn : ∀ (x : E), 0 ≤ ↑IsROrC.re (inner x (↑T x))
v : E
hv : HasEigenvector T (↑μ) v
⊢ 0 < ‖v‖ ^ 2
[PROOFSTEP]
simpa only [sq_pos_iff, norm_ne_zero_iff] using hv.2
[GOAL]
case intro
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
μ : ℝ
T : E →ₗ[𝕜] E
hμ : HasEigenvalue T ↑μ
hnn : ∀ (x : E), 0 ≤ ↑IsROrC.re (inner x (↑T x))
v : E
hv : HasEigenvector T (↑μ) v
hpos : 0 < ‖v‖ ^ 2
⊢ 0 ≤ μ
[PROOFSTEP]
have : IsROrC.re ⟪v, T v⟫ = μ * ‖v‖ ^ 2 :=
  by
  have :=
    congr_arg IsROrC.re
      (inner_product_apply_eigenvector hv.1)
        -- porting note: why can't `exact_mod_cast` do this? These lemmas are marked `norm_cast`
  rw [← IsROrC.ofReal_pow, ← IsROrC.ofReal_mul] at this
  exact_mod_cast this
[GOAL]
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
μ : ℝ
T : E →ₗ[𝕜] E
hμ : HasEigenvalue T ↑μ
hnn : ∀ (x : E), 0 ≤ ↑IsROrC.re (inner x (↑T x))
v : E
hv : HasEigenvector T (↑μ) v
hpos : 0 < ‖v‖ ^ 2
⊢ ↑IsROrC.re (inner v (↑T v)) = μ * ‖v‖ ^ 2
[PROOFSTEP]
have :=
  congr_arg IsROrC.re
    (inner_product_apply_eigenvector hv.1)
      -- porting note: why can't `exact_mod_cast` do this? These lemmas are marked `norm_cast`
[GOAL]
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
μ : ℝ
T : E →ₗ[𝕜] E
hμ : HasEigenvalue T ↑μ
hnn : ∀ (x : E), 0 ≤ ↑IsROrC.re (inner x (↑T x))
v : E
hv : HasEigenvector T (↑μ) v
hpos : 0 < ‖v‖ ^ 2
this : ↑IsROrC.re (inner v (↑T v)) = ↑IsROrC.re (↑μ * ↑‖v‖ ^ 2)
⊢ ↑IsROrC.re (inner v (↑T v)) = μ * ‖v‖ ^ 2
[PROOFSTEP]
rw [← IsROrC.ofReal_pow, ← IsROrC.ofReal_mul] at this
[GOAL]
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
μ : ℝ
T : E →ₗ[𝕜] E
hμ : HasEigenvalue T ↑μ
hnn : ∀ (x : E), 0 ≤ ↑IsROrC.re (inner x (↑T x))
v : E
hv : HasEigenvector T (↑μ) v
hpos : 0 < ‖v‖ ^ 2
this : ↑IsROrC.re (inner v (↑T v)) = ↑IsROrC.re ↑(μ * ‖v‖ ^ 2)
⊢ ↑IsROrC.re (inner v (↑T v)) = μ * ‖v‖ ^ 2
[PROOFSTEP]
exact_mod_cast this
[GOAL]
case intro
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
μ : ℝ
T : E →ₗ[𝕜] E
hμ : HasEigenvalue T ↑μ
hnn : ∀ (x : E), 0 ≤ ↑IsROrC.re (inner x (↑T x))
v : E
hv : HasEigenvector T (↑μ) v
hpos : 0 < ‖v‖ ^ 2
this : ↑IsROrC.re (inner v (↑T v)) = μ * ‖v‖ ^ 2
⊢ 0 ≤ μ
[PROOFSTEP]
exact (zero_le_mul_right hpos).mp (this ▸ hnn v)
[GOAL]
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
μ : ℝ
T : E →ₗ[𝕜] E
hμ : HasEigenvalue T ↑μ
hnn : ∀ (x : E), 0 < ↑IsROrC.re (inner x (↑T x))
⊢ 0 < μ
[PROOFSTEP]
obtain ⟨v, hv⟩ := hμ.exists_hasEigenvector
[GOAL]
case intro
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
μ : ℝ
T : E →ₗ[𝕜] E
hμ : HasEigenvalue T ↑μ
hnn : ∀ (x : E), 0 < ↑IsROrC.re (inner x (↑T x))
v : E
hv : HasEigenvector T (↑μ) v
⊢ 0 < μ
[PROOFSTEP]
have hpos : (0 : ℝ) < ‖v‖ ^ 2 := by simpa only [sq_pos_iff, norm_ne_zero_iff] using hv.2
[GOAL]
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
μ : ℝ
T : E →ₗ[𝕜] E
hμ : HasEigenvalue T ↑μ
hnn : ∀ (x : E), 0 < ↑IsROrC.re (inner x (↑T x))
v : E
hv : HasEigenvector T (↑μ) v
⊢ 0 < ‖v‖ ^ 2
[PROOFSTEP]
simpa only [sq_pos_iff, norm_ne_zero_iff] using hv.2
[GOAL]
case intro
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
μ : ℝ
T : E →ₗ[𝕜] E
hμ : HasEigenvalue T ↑μ
hnn : ∀ (x : E), 0 < ↑IsROrC.re (inner x (↑T x))
v : E
hv : HasEigenvector T (↑μ) v
hpos : 0 < ‖v‖ ^ 2
⊢ 0 < μ
[PROOFSTEP]
have : IsROrC.re ⟪v, T v⟫ = μ * ‖v‖ ^ 2 :=
  by
  have :=
    congr_arg IsROrC.re
      (inner_product_apply_eigenvector hv.1)
        -- porting note: why can't `exact_mod_cast` do this? These lemmas are marked `norm_cast`
  rw [← IsROrC.ofReal_pow, ← IsROrC.ofReal_mul] at this
  exact_mod_cast this
[GOAL]
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
μ : ℝ
T : E →ₗ[𝕜] E
hμ : HasEigenvalue T ↑μ
hnn : ∀ (x : E), 0 < ↑IsROrC.re (inner x (↑T x))
v : E
hv : HasEigenvector T (↑μ) v
hpos : 0 < ‖v‖ ^ 2
⊢ ↑IsROrC.re (inner v (↑T v)) = μ * ‖v‖ ^ 2
[PROOFSTEP]
have :=
  congr_arg IsROrC.re
    (inner_product_apply_eigenvector hv.1)
      -- porting note: why can't `exact_mod_cast` do this? These lemmas are marked `norm_cast`
[GOAL]
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
μ : ℝ
T : E →ₗ[𝕜] E
hμ : HasEigenvalue T ↑μ
hnn : ∀ (x : E), 0 < ↑IsROrC.re (inner x (↑T x))
v : E
hv : HasEigenvector T (↑μ) v
hpos : 0 < ‖v‖ ^ 2
this : ↑IsROrC.re (inner v (↑T v)) = ↑IsROrC.re (↑μ * ↑‖v‖ ^ 2)
⊢ ↑IsROrC.re (inner v (↑T v)) = μ * ‖v‖ ^ 2
[PROOFSTEP]
rw [← IsROrC.ofReal_pow, ← IsROrC.ofReal_mul] at this
[GOAL]
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
μ : ℝ
T : E →ₗ[𝕜] E
hμ : HasEigenvalue T ↑μ
hnn : ∀ (x : E), 0 < ↑IsROrC.re (inner x (↑T x))
v : E
hv : HasEigenvector T (↑μ) v
hpos : 0 < ‖v‖ ^ 2
this : ↑IsROrC.re (inner v (↑T v)) = ↑IsROrC.re ↑(μ * ‖v‖ ^ 2)
⊢ ↑IsROrC.re (inner v (↑T v)) = μ * ‖v‖ ^ 2
[PROOFSTEP]
exact_mod_cast this
[GOAL]
case intro
𝕜 : Type u_1
inst✝² : IsROrC 𝕜
dec_𝕜 : DecidableEq 𝕜
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace 𝕜 E
μ : ℝ
T : E →ₗ[𝕜] E
hμ : HasEigenvalue T ↑μ
hnn : ∀ (x : E), 0 < ↑IsROrC.re (inner x (↑T x))
v : E
hv : HasEigenvector T (↑μ) v
hpos : 0 < ‖v‖ ^ 2
this : ↑IsROrC.re (inner v (↑T v)) = μ * ‖v‖ ^ 2
⊢ 0 < μ
[PROOFSTEP]
exact (zero_lt_mul_right hpos).mp (this ▸ hnn v)


[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsIrrefl α r
inst✝ : IsIrrefl β s
⊢ ∀ (a : α ⊕ β), ¬LiftRel r s a a
[PROOFSTEP]
rintro _ (⟨h⟩ | ⟨h⟩)
[GOAL]
case inl
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsIrrefl α r
inst✝ : IsIrrefl β s
a✝ : α
h : r a✝ a✝
⊢ False
[PROOFSTEP]
exact irrefl _ h
[GOAL]
case inr
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsIrrefl α r
inst✝ : IsIrrefl β s
b✝ : β
h : s b✝ b✝
⊢ False
[PROOFSTEP]
exact irrefl _ h
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsAntisymm α r
inst✝ : IsAntisymm β s
⊢ ∀ (a b : α ⊕ β), LiftRel r s a b → LiftRel r s b a → a = b
[PROOFSTEP]
rintro _ _ (⟨hab⟩ | ⟨hab⟩) (⟨hba⟩ | ⟨hba⟩)
[GOAL]
case inl.inl
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsAntisymm α r
inst✝ : IsAntisymm β s
a✝ c✝ : α
hab : r a✝ c✝
hba : r c✝ a✝
⊢ inl a✝ = inl c✝
[PROOFSTEP]
rw [antisymm hab hba]
[GOAL]
case inr.inr
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsAntisymm α r
inst✝ : IsAntisymm β s
b✝ d✝ : β
hab : s b✝ d✝
hba : s d✝ b✝
⊢ inr b✝ = inr d✝
[PROOFSTEP]
rw [antisymm hab hba]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsRefl α r
inst✝ : IsRefl β s
⊢ ∀ (a : α ⊕ β), Lex r s a a
[PROOFSTEP]
rintro (a | a)
[GOAL]
case inl
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsRefl α r
inst✝ : IsRefl β s
a : α
⊢ Lex r s (inl a) (inl a)
case inr
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsRefl α r
inst✝ : IsRefl β s
a : β
⊢ Lex r s (inr a) (inr a)
[PROOFSTEP]
exacts [Lex.inl (refl _), Lex.inr (refl _)]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsIrrefl α r
inst✝ : IsIrrefl β s
⊢ ∀ (a : α ⊕ β), ¬Lex r s a a
[PROOFSTEP]
rintro _ (⟨h⟩ | ⟨h⟩)
[GOAL]
case inl
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsIrrefl α r
inst✝ : IsIrrefl β s
a₁✝ : α
h : r a₁✝ a₁✝
⊢ False
[PROOFSTEP]
exact irrefl _ h
[GOAL]
case inr
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsIrrefl α r
inst✝ : IsIrrefl β s
b₁✝ : β
h : s b₁✝ b₁✝
⊢ False
[PROOFSTEP]
exact irrefl _ h
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsTrans α r
inst✝ : IsTrans β s
⊢ ∀ (a b c : α ⊕ β), Lex r s a b → Lex r s b c → Lex r s a c
[PROOFSTEP]
rintro _ _ _ (⟨hab⟩ | ⟨hab⟩) (⟨hbc⟩ | ⟨hbc⟩)
[GOAL]
case inl.inl
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsTrans α r
inst✝ : IsTrans β s
a₁✝ a₂✝¹ : α
hab : r a₁✝ a₂✝¹
a₂✝ : α
hbc : r a₂✝¹ a₂✝
⊢ Lex r s (inl a₁✝) (inl a₂✝)
case inl.sep
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsTrans α r
inst✝ : IsTrans β s
a₁✝ a₂✝ : α
hab : r a₁✝ a₂✝
b✝ : β
⊢ Lex r s (inl a₁✝) (inr b✝)
case inr.inr
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsTrans α r
inst✝ : IsTrans β s
b₁✝ b₂✝¹ : β
hab : s b₁✝ b₂✝¹
b₂✝ : β
hbc : s b₂✝¹ b₂✝
⊢ Lex r s (inr b₁✝) (inr b₂✝)
case sep.inr
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsTrans α r
inst✝ : IsTrans β s
a✝ : α
b✝ b₂✝ : β
hbc : s b✝ b₂✝
⊢ Lex r s (inl a✝) (inr b₂✝)
[PROOFSTEP]
exacts [.inl (_root_.trans hab hbc), .sep _ _, .inr (_root_.trans hab hbc), .sep _ _]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsAntisymm α r
inst✝ : IsAntisymm β s
⊢ ∀ (a b : α ⊕ β), Lex r s a b → Lex r s b a → a = b
[PROOFSTEP]
rintro _ _ (⟨hab⟩ | ⟨hab⟩) (⟨hba⟩ | ⟨hba⟩)
[GOAL]
case inl.inl
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsAntisymm α r
inst✝ : IsAntisymm β s
a₁✝ a₂✝ : α
hab : r a₁✝ a₂✝
hba : r a₂✝ a₁✝
⊢ inl a₁✝ = inl a₂✝
[PROOFSTEP]
rw [antisymm hab hba]
[GOAL]
case inr.inr
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsAntisymm α r
inst✝ : IsAntisymm β s
b₁✝ b₂✝ : β
hab : s b₁✝ b₂✝
hba : s b₂✝ b₁✝
⊢ inr b₁✝ = inr b₂✝
[PROOFSTEP]
rw [antisymm hab hba]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Preorder α
inst✝ : Preorder β
src✝¹ : LE (α ⊕ β) := instLESum
src✝ : LT (α ⊕ β) := instLTSum
a b : α ⊕ β
⊢ a < b ↔ a ≤ b ∧ ¬b ≤ a
[PROOFSTEP]
refine' ⟨fun hab => ⟨hab.mono (fun _ _ => le_of_lt) fun _ _ => le_of_lt, _⟩, _⟩
[GOAL]
case refine'_1
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Preorder α
inst✝ : Preorder β
src✝¹ : LE (α ⊕ β) := instLESum
src✝ : LT (α ⊕ β) := instLTSum
a b : α ⊕ β
hab : a < b
⊢ ¬b ≤ a
[PROOFSTEP]
rintro (⟨hba⟩ | ⟨hba⟩)
[GOAL]
case refine'_1.inl
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Preorder α
inst✝ : Preorder β
src✝¹ : LE (α ⊕ β) := instLESum
src✝ : LT (α ⊕ β) := instLTSum
a✝ c✝ : α
hba : a✝ ≤ c✝
hab : inl c✝ < inl a✝
⊢ False
[PROOFSTEP]
exact hba.not_lt (inl_lt_inl_iff.1 hab)
[GOAL]
case refine'_1.inr
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Preorder α
inst✝ : Preorder β
src✝¹ : LE (α ⊕ β) := instLESum
src✝ : LT (α ⊕ β) := instLTSum
b✝ d✝ : β
hba : b✝ ≤ d✝
hab : inr d✝ < inr b✝
⊢ False
[PROOFSTEP]
exact hba.not_lt (inr_lt_inr_iff.1 hab)
[GOAL]
case refine'_2
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Preorder α
inst✝ : Preorder β
src✝¹ : LE (α ⊕ β) := instLESum
src✝ : LT (α ⊕ β) := instLTSum
a b : α ⊕ β
⊢ a ≤ b ∧ ¬b ≤ a → a < b
[PROOFSTEP]
rintro ⟨⟨hab⟩ | ⟨hab⟩, hba⟩
[GOAL]
case refine'_2.intro.inl
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Preorder α
inst✝ : Preorder β
src✝¹ : LE (α ⊕ β) := instLESum
src✝ : LT (α ⊕ β) := instLTSum
a✝ c✝ : α
hab : a✝ ≤ c✝
hba : ¬inl c✝ ≤ inl a✝
⊢ inl a✝ < inl c✝
[PROOFSTEP]
exact LiftRel.inl (hab.lt_of_not_le fun h => hba <| LiftRel.inl h)
[GOAL]
case refine'_2.intro.inr
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Preorder α
inst✝ : Preorder β
src✝¹ : LE (α ⊕ β) := instLESum
src✝ : LT (α ⊕ β) := instLTSum
b✝ d✝ : β
hab : b✝ ≤ d✝
hba : ¬inr d✝ ≤ inr b✝
⊢ inr b✝ < inr d✝
[PROOFSTEP]
exact LiftRel.inr (hab.lt_of_not_le fun h => hba <| LiftRel.inr h)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : LT α
inst✝ : LT β
x✝ : NoMinOrder (α ⊕ β)
a : α
⊢ ∃ b, b < a
[PROOFSTEP]
obtain ⟨b | b, h⟩ := exists_lt (inl a : Sum α β)
[GOAL]
case intro.inl
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : LT α
inst✝ : LT β
x✝ : NoMinOrder (α ⊕ β)
a b : α
h : inl b < inl a
⊢ ∃ b, b < a
[PROOFSTEP]
exact ⟨b, inl_lt_inl_iff.1 h⟩
[GOAL]
case intro.inr
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : LT α
inst✝ : LT β
x✝ : NoMinOrder (α ⊕ β)
a : α
b : β
h : inr b < inl a
⊢ ∃ b, b < a
[PROOFSTEP]
exact (not_inr_lt_inl h).elim
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : LT α
inst✝ : LT β
x✝ : NoMinOrder (α ⊕ β)
a : β
⊢ ∃ b, b < a
[PROOFSTEP]
obtain ⟨b | b, h⟩ := exists_lt (inr a : Sum α β)
[GOAL]
case intro.inl
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : LT α
inst✝ : LT β
x✝ : NoMinOrder (α ⊕ β)
a : β
b : α
h : inl b < inr a
⊢ ∃ b, b < a
[PROOFSTEP]
exact (not_inl_lt_inr h).elim
[GOAL]
case intro.inr
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : LT α
inst✝ : LT β
x✝ : NoMinOrder (α ⊕ β)
a b : β
h : inr b < inr a
⊢ ∃ b, b < a
[PROOFSTEP]
exact ⟨b, inr_lt_inr_iff.1 h⟩
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : LT α
inst✝ : LT β
x✝ : NoMaxOrder (α ⊕ β)
a : α
⊢ ∃ b, a < b
[PROOFSTEP]
obtain ⟨b | b, h⟩ := exists_gt (inl a : Sum α β)
[GOAL]
case intro.inl
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : LT α
inst✝ : LT β
x✝ : NoMaxOrder (α ⊕ β)
a b : α
h : inl a < inl b
⊢ ∃ b, a < b
[PROOFSTEP]
exact ⟨b, inl_lt_inl_iff.1 h⟩
[GOAL]
case intro.inr
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : LT α
inst✝ : LT β
x✝ : NoMaxOrder (α ⊕ β)
a : α
b : β
h : inl a < inr b
⊢ ∃ b, a < b
[PROOFSTEP]
exact (not_inl_lt_inr h).elim
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : LT α
inst✝ : LT β
x✝ : NoMaxOrder (α ⊕ β)
a : β
⊢ ∃ b, a < b
[PROOFSTEP]
obtain ⟨b | b, h⟩ := exists_gt (inr a : Sum α β)
[GOAL]
case intro.inl
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : LT α
inst✝ : LT β
x✝ : NoMaxOrder (α ⊕ β)
a : β
b : α
h : inr a < inl b
⊢ ∃ b, a < b
[PROOFSTEP]
exact (not_inr_lt_inl h).elim
[GOAL]
case intro.inr
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : LT α
inst✝ : LT β
x✝ : NoMaxOrder (α ⊕ β)
a b : β
h : inr a < inr b
⊢ ∃ b, a < b
[PROOFSTEP]
exact ⟨b, inr_lt_inr_iff.1 h⟩
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : LT α
inst✝ : LT β
x✝ : DenselyOrdered (α ⊕ β)
a b : α
h : a < b
⊢ ∃ a_1, a < a_1 ∧ a_1 < b
[PROOFSTEP]
obtain ⟨c | c, ha, hb⟩ := @exists_between (Sum α β) _ _ _ _ (inl_lt_inl_iff.2 h)
[GOAL]
case intro.inl.intro
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : LT α
inst✝ : LT β
x✝ : DenselyOrdered (α ⊕ β)
a b : α
h : a < b
c : α
ha : inl a < inl c
hb : inl c < inl b
⊢ ∃ a_1, a < a_1 ∧ a_1 < b
[PROOFSTEP]
exact ⟨c, inl_lt_inl_iff.1 ha, inl_lt_inl_iff.1 hb⟩
[GOAL]
case intro.inr.intro
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : LT α
inst✝ : LT β
x✝ : DenselyOrdered (α ⊕ β)
a b : α
h : a < b
c : β
ha : inl a < inr c
hb : inr c < inl b
⊢ ∃ a_1, a < a_1 ∧ a_1 < b
[PROOFSTEP]
exact (not_inl_lt_inr ha).elim
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : LT α
inst✝ : LT β
x✝ : DenselyOrdered (α ⊕ β)
a b : β
h : a < b
⊢ ∃ a_1, a < a_1 ∧ a_1 < b
[PROOFSTEP]
obtain ⟨c | c, ha, hb⟩ := @exists_between (Sum α β) _ _ _ _ (inr_lt_inr_iff.2 h)
[GOAL]
case intro.inl.intro
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : LT α
inst✝ : LT β
x✝ : DenselyOrdered (α ⊕ β)
a b : β
h : a < b
c : α
ha : inr a < inl c
hb : inl c < inr b
⊢ ∃ a_1, a < a_1 ∧ a_1 < b
[PROOFSTEP]
exact (not_inl_lt_inr hb).elim
[GOAL]
case intro.inr.intro
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : LT α
inst✝ : LT β
x✝ : DenselyOrdered (α ⊕ β)
a b : β
h : a < b
c : β
ha : inr a < inr c
hb : inr c < inr b
⊢ ∃ a_1, a < a_1 ∧ a_1 < b
[PROOFSTEP]
exact ⟨c, inr_lt_inr_iff.1 ha, inr_lt_inr_iff.1 hb⟩
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Preorder α
inst✝ : Preorder β
src✝¹ : LE (_root_.Lex (α ⊕ β)) := Lex.LE
src✝ : LT (_root_.Lex (α ⊕ β)) := Lex.LT
a b : _root_.Lex (α ⊕ β)
⊢ a < b ↔ a ≤ b ∧ ¬b ≤ a
[PROOFSTEP]
refine' ⟨fun hab => ⟨hab.mono (fun _ _ => le_of_lt) fun _ _ => le_of_lt, _⟩, _⟩
[GOAL]
case refine'_1
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Preorder α
inst✝ : Preorder β
src✝¹ : LE (_root_.Lex (α ⊕ β)) := Lex.LE
src✝ : LT (_root_.Lex (α ⊕ β)) := Lex.LT
a b : _root_.Lex (α ⊕ β)
hab : a < b
⊢ ¬b ≤ a
[PROOFSTEP]
rintro (⟨hba⟩ | ⟨hba⟩ | ⟨b, a⟩)
[GOAL]
case refine'_1.inl
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Preorder α
inst✝ : Preorder β
src✝¹ : LE (_root_.Lex (α ⊕ β)) := Lex.LE
src✝ : LT (_root_.Lex (α ⊕ β)) := Lex.LT
a₁✝ a₂✝ : α
hba : a₁✝ ≤ a₂✝
hab : inl a₂✝ < inl a₁✝
⊢ False
[PROOFSTEP]
exact hba.not_lt (inl_lt_inl_iff.1 hab)
[GOAL]
case refine'_1.inr
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Preorder α
inst✝ : Preorder β
src✝¹ : LE (_root_.Lex (α ⊕ β)) := Lex.LE
src✝ : LT (_root_.Lex (α ⊕ β)) := Lex.LT
b₁✝ b₂✝ : β
hba : b₁✝ ≤ b₂✝
hab : inr b₂✝ < inr b₁✝
⊢ False
[PROOFSTEP]
exact hba.not_lt (inr_lt_inr_iff.1 hab)
[GOAL]
case refine'_1.sep
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Preorder α
inst✝ : Preorder β
src✝¹ : LE (_root_.Lex (α ⊕ β)) := Lex.LE
src✝ : LT (_root_.Lex (α ⊕ β)) := Lex.LT
b : α
a : β
hab : inr a < inl b
⊢ False
[PROOFSTEP]
exact not_inr_lt_inl hab
[GOAL]
case refine'_2
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Preorder α
inst✝ : Preorder β
src✝¹ : LE (_root_.Lex (α ⊕ β)) := Lex.LE
src✝ : LT (_root_.Lex (α ⊕ β)) := Lex.LT
a b : _root_.Lex (α ⊕ β)
⊢ a ≤ b ∧ ¬b ≤ a → a < b
[PROOFSTEP]
rintro ⟨⟨hab⟩ | ⟨hab⟩ | ⟨a, b⟩, hba⟩
[GOAL]
case refine'_2.intro.inl
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Preorder α
inst✝ : Preorder β
src✝¹ : LE (_root_.Lex (α ⊕ β)) := Lex.LE
src✝ : LT (_root_.Lex (α ⊕ β)) := Lex.LT
a₁✝ a₂✝ : α
hab : a₁✝ ≤ a₂✝
hba : ¬inl a₂✝ ≤ inl a₁✝
⊢ inl a₁✝ < inl a₂✝
[PROOFSTEP]
exact Lex.inl (hab.lt_of_not_le fun h => hba <| Lex.inl h)
[GOAL]
case refine'_2.intro.inr
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Preorder α
inst✝ : Preorder β
src✝¹ : LE (_root_.Lex (α ⊕ β)) := Lex.LE
src✝ : LT (_root_.Lex (α ⊕ β)) := Lex.LT
b₁✝ b₂✝ : β
hab : b₁✝ ≤ b₂✝
hba : ¬inr b₂✝ ≤ inr b₁✝
⊢ inr b₁✝ < inr b₂✝
[PROOFSTEP]
exact Lex.inr (hab.lt_of_not_le fun h => hba <| Lex.inr h)
[GOAL]
case refine'_2.intro.sep
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Preorder α
inst✝ : Preorder β
src✝¹ : LE (_root_.Lex (α ⊕ β)) := Lex.LE
src✝ : LT (_root_.Lex (α ⊕ β)) := Lex.LT
a : α
b : β
hba : ¬inr b ≤ inl a
⊢ inl a < inr b
[PROOFSTEP]
exact Lex.sep _ _
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝² : LE α
inst✝¹ : OrderBot α
inst✝ : LE β
⊢ ∀ (a : _root_.Lex (α ⊕ β)), ⊥ ≤ a
[PROOFSTEP]
rintro (a | b)
[GOAL]
case inl
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝² : LE α
inst✝¹ : OrderBot α
inst✝ : LE β
a : α
⊢ ⊥ ≤ inl a
[PROOFSTEP]
exact Lex.inl bot_le
[GOAL]
case inr
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝² : LE α
inst✝¹ : OrderBot α
inst✝ : LE β
b : β
⊢ ⊥ ≤ inr b
[PROOFSTEP]
exact Lex.sep _ _
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝² : LE α
inst✝¹ : LE β
inst✝ : OrderTop β
⊢ ∀ (a : _root_.Lex (α ⊕ β)), a ≤ ⊤
[PROOFSTEP]
rintro (a | b)
[GOAL]
case inl
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝² : LE α
inst✝¹ : LE β
inst✝ : OrderTop β
a : α
⊢ inl a ≤ ⊤
[PROOFSTEP]
exact Lex.sep _ _
[GOAL]
case inr
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝² : LE α
inst✝¹ : LE β
inst✝ : OrderTop β
b : β
⊢ inr b ≤ ⊤
[PROOFSTEP]
exact Lex.inr le_top
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
δ : Type u_4
inst✝⁵ : LE α✝
inst✝⁴ : LE β✝
inst✝³ : LE γ✝
a✝ : α✝
b✝ : β✝
c : γ✝
α : Type u_5
β : Type u_6
γ : Type u_7
inst✝² : LE α
inst✝¹ : LE β
inst✝ : LE γ
src✝ : (α ⊕ β) ⊕ γ ≃ α ⊕ β ⊕ γ := Equiv.sumAssoc α β γ
a b : (α ⊕ β) ⊕ γ
⊢ ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        a ≤
      ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        b ↔
    a ≤ b
[PROOFSTEP]
rcases a with ((_ | _) | _)
[GOAL]
case inl.inl
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
δ : Type u_4
inst✝⁵ : LE α✝
inst✝⁴ : LE β✝
inst✝³ : LE γ✝
a : α✝
b✝ : β✝
c : γ✝
α : Type u_5
β : Type u_6
γ : Type u_7
inst✝² : LE α
inst✝¹ : LE β
inst✝ : LE γ
src✝ : (α ⊕ β) ⊕ γ ≃ α ⊕ β ⊕ γ := Equiv.sumAssoc α β γ
b : (α ⊕ β) ⊕ γ
val✝ : α
⊢ ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inl (inl val✝)) ≤
      ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        b ↔
    inl (inl val✝) ≤ b
[PROOFSTEP]
rcases b with ((_ | _) | _)
[GOAL]
case inl.inr
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
δ : Type u_4
inst✝⁵ : LE α✝
inst✝⁴ : LE β✝
inst✝³ : LE γ✝
a : α✝
b✝ : β✝
c : γ✝
α : Type u_5
β : Type u_6
γ : Type u_7
inst✝² : LE α
inst✝¹ : LE β
inst✝ : LE γ
src✝ : (α ⊕ β) ⊕ γ ≃ α ⊕ β ⊕ γ := Equiv.sumAssoc α β γ
b : (α ⊕ β) ⊕ γ
val✝ : β
⊢ ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inl (inr val✝)) ≤
      ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        b ↔
    inl (inr val✝) ≤ b
[PROOFSTEP]
rcases b with ((_ | _) | _)
[GOAL]
case inr
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
δ : Type u_4
inst✝⁵ : LE α✝
inst✝⁴ : LE β✝
inst✝³ : LE γ✝
a : α✝
b✝ : β✝
c : γ✝
α : Type u_5
β : Type u_6
γ : Type u_7
inst✝² : LE α
inst✝¹ : LE β
inst✝ : LE γ
src✝ : (α ⊕ β) ⊕ γ ≃ α ⊕ β ⊕ γ := Equiv.sumAssoc α β γ
b : (α ⊕ β) ⊕ γ
val✝ : γ
⊢ ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inr val✝) ≤
      ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        b ↔
    inr val✝ ≤ b
[PROOFSTEP]
rcases b with ((_ | _) | _)
[GOAL]
case inl.inl.inl.inl
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
δ : Type u_4
inst✝⁵ : LE α✝
inst✝⁴ : LE β✝
inst✝³ : LE γ✝
a : α✝
b : β✝
c : γ✝
α : Type u_5
β : Type u_6
γ : Type u_7
inst✝² : LE α
inst✝¹ : LE β
inst✝ : LE γ
src✝ : (α ⊕ β) ⊕ γ ≃ α ⊕ β ⊕ γ := Equiv.sumAssoc α β γ
val✝¹ val✝ : α
⊢ ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inl (inl val✝¹)) ≤
      ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inl (inl val✝)) ↔
    inl (inl val✝¹) ≤ inl (inl val✝)
[PROOFSTEP]
simp [Equiv.sumAssoc]
[GOAL]
case inl.inl.inl.inr
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
δ : Type u_4
inst✝⁵ : LE α✝
inst✝⁴ : LE β✝
inst✝³ : LE γ✝
a : α✝
b : β✝
c : γ✝
α : Type u_5
β : Type u_6
γ : Type u_7
inst✝² : LE α
inst✝¹ : LE β
inst✝ : LE γ
src✝ : (α ⊕ β) ⊕ γ ≃ α ⊕ β ⊕ γ := Equiv.sumAssoc α β γ
val✝¹ : α
val✝ : β
⊢ ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inl (inl val✝¹)) ≤
      ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inl (inr val✝)) ↔
    inl (inl val✝¹) ≤ inl (inr val✝)
[PROOFSTEP]
simp [Equiv.sumAssoc]
[GOAL]
case inl.inl.inr
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
δ : Type u_4
inst✝⁵ : LE α✝
inst✝⁴ : LE β✝
inst✝³ : LE γ✝
a : α✝
b : β✝
c : γ✝
α : Type u_5
β : Type u_6
γ : Type u_7
inst✝² : LE α
inst✝¹ : LE β
inst✝ : LE γ
src✝ : (α ⊕ β) ⊕ γ ≃ α ⊕ β ⊕ γ := Equiv.sumAssoc α β γ
val✝¹ : α
val✝ : γ
⊢ ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inl (inl val✝¹)) ≤
      ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inr val✝) ↔
    inl (inl val✝¹) ≤ inr val✝
[PROOFSTEP]
simp [Equiv.sumAssoc]
[GOAL]
case inl.inr.inl.inl
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
δ : Type u_4
inst✝⁵ : LE α✝
inst✝⁴ : LE β✝
inst✝³ : LE γ✝
a : α✝
b : β✝
c : γ✝
α : Type u_5
β : Type u_6
γ : Type u_7
inst✝² : LE α
inst✝¹ : LE β
inst✝ : LE γ
src✝ : (α ⊕ β) ⊕ γ ≃ α ⊕ β ⊕ γ := Equiv.sumAssoc α β γ
val✝¹ : β
val✝ : α
⊢ ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inl (inr val✝¹)) ≤
      ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inl (inl val✝)) ↔
    inl (inr val✝¹) ≤ inl (inl val✝)
[PROOFSTEP]
simp [Equiv.sumAssoc]
[GOAL]
case inl.inr.inl.inr
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
δ : Type u_4
inst✝⁵ : LE α✝
inst✝⁴ : LE β✝
inst✝³ : LE γ✝
a : α✝
b : β✝
c : γ✝
α : Type u_5
β : Type u_6
γ : Type u_7
inst✝² : LE α
inst✝¹ : LE β
inst✝ : LE γ
src✝ : (α ⊕ β) ⊕ γ ≃ α ⊕ β ⊕ γ := Equiv.sumAssoc α β γ
val✝¹ val✝ : β
⊢ ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inl (inr val✝¹)) ≤
      ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inl (inr val✝)) ↔
    inl (inr val✝¹) ≤ inl (inr val✝)
[PROOFSTEP]
simp [Equiv.sumAssoc]
[GOAL]
case inl.inr.inr
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
δ : Type u_4
inst✝⁵ : LE α✝
inst✝⁴ : LE β✝
inst✝³ : LE γ✝
a : α✝
b : β✝
c : γ✝
α : Type u_5
β : Type u_6
γ : Type u_7
inst✝² : LE α
inst✝¹ : LE β
inst✝ : LE γ
src✝ : (α ⊕ β) ⊕ γ ≃ α ⊕ β ⊕ γ := Equiv.sumAssoc α β γ
val✝¹ : β
val✝ : γ
⊢ ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inl (inr val✝¹)) ≤
      ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inr val✝) ↔
    inl (inr val✝¹) ≤ inr val✝
[PROOFSTEP]
simp [Equiv.sumAssoc]
[GOAL]
case inr.inl.inl
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
δ : Type u_4
inst✝⁵ : LE α✝
inst✝⁴ : LE β✝
inst✝³ : LE γ✝
a : α✝
b : β✝
c : γ✝
α : Type u_5
β : Type u_6
γ : Type u_7
inst✝² : LE α
inst✝¹ : LE β
inst✝ : LE γ
src✝ : (α ⊕ β) ⊕ γ ≃ α ⊕ β ⊕ γ := Equiv.sumAssoc α β γ
val✝¹ : γ
val✝ : α
⊢ ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inr val✝¹) ≤
      ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inl (inl val✝)) ↔
    inr val✝¹ ≤ inl (inl val✝)
[PROOFSTEP]
simp [Equiv.sumAssoc]
[GOAL]
case inr.inl.inr
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
δ : Type u_4
inst✝⁵ : LE α✝
inst✝⁴ : LE β✝
inst✝³ : LE γ✝
a : α✝
b : β✝
c : γ✝
α : Type u_5
β : Type u_6
γ : Type u_7
inst✝² : LE α
inst✝¹ : LE β
inst✝ : LE γ
src✝ : (α ⊕ β) ⊕ γ ≃ α ⊕ β ⊕ γ := Equiv.sumAssoc α β γ
val✝¹ : γ
val✝ : β
⊢ ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inr val✝¹) ≤
      ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inl (inr val✝)) ↔
    inr val✝¹ ≤ inl (inr val✝)
[PROOFSTEP]
simp [Equiv.sumAssoc]
[GOAL]
case inr.inr
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
δ : Type u_4
inst✝⁵ : LE α✝
inst✝⁴ : LE β✝
inst✝³ : LE γ✝
a : α✝
b : β✝
c : γ✝
α : Type u_5
β : Type u_6
γ : Type u_7
inst✝² : LE α
inst✝¹ : LE β
inst✝ : LE γ
src✝ : (α ⊕ β) ⊕ γ ≃ α ⊕ β ⊕ γ := Equiv.sumAssoc α β γ
val✝¹ val✝ : γ
⊢ ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inr val✝¹) ≤
      ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inr val✝) ↔
    inr val✝¹ ≤ inr val✝
[PROOFSTEP]
simp [Equiv.sumAssoc]
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
inst✝⁴ : LE α✝
inst✝³ : LE β✝
inst✝² : LE γ
a : α✝
b : β✝
c : γ
α : Type u_5
β : Type u_6
inst✝¹ : LE α
inst✝ : LE β
src✝ : (α ⊕ β)ᵒᵈ ≃ (α ⊕ β)ᵒᵈ := Equiv.refl (α ⊕ β)ᵒᵈ
⊢ ∀ {a b : (α ⊕ β)ᵒᵈ},
    ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
              right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
          a ≤
        ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
              right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
          b ↔
      a ≤ b
[PROOFSTEP]
rintro (a | a) (b | b)
[GOAL]
case inl.inl
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
inst✝⁴ : LE α✝
inst✝³ : LE β✝
inst✝² : LE γ
a✝ : α✝
b✝ : β✝
c : γ
α : Type u_5
β : Type u_6
inst✝¹ : LE α
inst✝ : LE β
src✝ : (α ⊕ β)ᵒᵈ ≃ (α ⊕ β)ᵒᵈ := Equiv.refl (α ⊕ β)ᵒᵈ
a b : α
⊢ ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inl a) ≤
      ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inl b) ↔
    inl a ≤ inl b
[PROOFSTEP]
change inl (toDual a) ≤ inl (toDual b) ↔ toDual (inl a) ≤ toDual (inl b)
[GOAL]
case inl.inl
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
inst✝⁴ : LE α✝
inst✝³ : LE β✝
inst✝² : LE γ
a✝ : α✝
b✝ : β✝
c : γ
α : Type u_5
β : Type u_6
inst✝¹ : LE α
inst✝ : LE β
src✝ : (α ⊕ β)ᵒᵈ ≃ (α ⊕ β)ᵒᵈ := Equiv.refl (α ⊕ β)ᵒᵈ
a b : α
⊢ inl (↑toDual a) ≤ inl (↑toDual b) ↔ ↑toDual (inl a) ≤ ↑toDual (inl b)
[PROOFSTEP]
simp [toDual_le_toDual, inl_le_inl_iff]
[GOAL]
case inl.inr
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
inst✝⁴ : LE α✝
inst✝³ : LE β✝
inst✝² : LE γ
a✝ : α✝
b✝ : β✝
c : γ
α : Type u_5
β : Type u_6
inst✝¹ : LE α
inst✝ : LE β
src✝ : (α ⊕ β)ᵒᵈ ≃ (α ⊕ β)ᵒᵈ := Equiv.refl (α ⊕ β)ᵒᵈ
a : α
b : β
⊢ ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inl a) ≤
      ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inr b) ↔
    inl a ≤ inr b
[PROOFSTEP]
exact iff_of_false (@not_inl_le_inr (OrderDual β) (OrderDual α) _ _ _ _) not_inr_le_inl
[GOAL]
case inr.inl
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
inst✝⁴ : LE α✝
inst✝³ : LE β✝
inst✝² : LE γ
a✝ : α✝
b✝ : β✝
c : γ
α : Type u_5
β : Type u_6
inst✝¹ : LE α
inst✝ : LE β
src✝ : (α ⊕ β)ᵒᵈ ≃ (α ⊕ β)ᵒᵈ := Equiv.refl (α ⊕ β)ᵒᵈ
a : β
b : α
⊢ ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inr a) ≤
      ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inl b) ↔
    inr a ≤ inl b
[PROOFSTEP]
exact iff_of_false (@not_inr_le_inl (OrderDual α) (OrderDual β) _ _ _ _) not_inl_le_inr
[GOAL]
case inr.inr
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
inst✝⁴ : LE α✝
inst✝³ : LE β✝
inst✝² : LE γ
a✝ : α✝
b✝ : β✝
c : γ
α : Type u_5
β : Type u_6
inst✝¹ : LE α
inst✝ : LE β
src✝ : (α ⊕ β)ᵒᵈ ≃ (α ⊕ β)ᵒᵈ := Equiv.refl (α ⊕ β)ᵒᵈ
a b : β
⊢ ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inr a) ≤
      ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inr b) ↔
    inr a ≤ inr b
[PROOFSTEP]
change inr (toDual a) ≤ inr (toDual b) ↔ toDual (inr a) ≤ toDual (inr b)
[GOAL]
case inr.inr
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
inst✝⁴ : LE α✝
inst✝³ : LE β✝
inst✝² : LE γ
a✝ : α✝
b✝ : β✝
c : γ
α : Type u_5
β : Type u_6
inst✝¹ : LE α
inst✝ : LE β
src✝ : (α ⊕ β)ᵒᵈ ≃ (α ⊕ β)ᵒᵈ := Equiv.refl (α ⊕ β)ᵒᵈ
a b : β
⊢ inr (↑toDual a) ≤ inr (↑toDual b) ↔ ↑toDual (inr a) ≤ ↑toDual (inr b)
[PROOFSTEP]
simp [toDual_le_toDual, inr_le_inr_iff]
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
inst✝⁴ : LE α✝
inst✝³ : LE β✝
inst✝² : LE γ
a✝ : α✝
b✝ : β✝
c : γ
α : Type u_5
β : Type u_6
inst✝¹ : LE α
inst✝ : LE β
src✝ : α ⊕ β ≃ β ⊕ α := Equiv.sumComm α β
a b : (_root_.Lex (α ⊕ β))ᵒᵈ
⊢ ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        a ≤
      ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        b ↔
    a ≤ b
[PROOFSTEP]
rcases a with (a | a)
[GOAL]
case inl
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
inst✝⁴ : LE α✝
inst✝³ : LE β✝
inst✝² : LE γ
a✝ : α✝
b✝ : β✝
c : γ
α : Type u_5
β : Type u_6
inst✝¹ : LE α
inst✝ : LE β
src✝ : α ⊕ β ≃ β ⊕ α := Equiv.sumComm α β
b : (_root_.Lex (α ⊕ β))ᵒᵈ
a : α
⊢ ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inl a) ≤
      ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        b ↔
    inl a ≤ b
[PROOFSTEP]
rcases b with (b | b)
[GOAL]
case inr
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
inst✝⁴ : LE α✝
inst✝³ : LE β✝
inst✝² : LE γ
a✝ : α✝
b✝ : β✝
c : γ
α : Type u_5
β : Type u_6
inst✝¹ : LE α
inst✝ : LE β
src✝ : α ⊕ β ≃ β ⊕ α := Equiv.sumComm α β
b : (_root_.Lex (α ⊕ β))ᵒᵈ
a : β
⊢ ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inr a) ≤
      ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        b ↔
    inr a ≤ b
[PROOFSTEP]
rcases b with (b | b)
[GOAL]
case inl.inl
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
inst✝⁴ : LE α✝
inst✝³ : LE β✝
inst✝² : LE γ
a✝ : α✝
b✝ : β✝
c : γ
α : Type u_5
β : Type u_6
inst✝¹ : LE α
inst✝ : LE β
src✝ : α ⊕ β ≃ β ⊕ α := Equiv.sumComm α β
a b : α
⊢ ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inl a) ≤
      ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inl b) ↔
    inl a ≤ inl b
case inl.inr
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
inst✝⁴ : LE α✝
inst✝³ : LE β✝
inst✝² : LE γ
a✝ : α✝
b✝ : β✝
c : γ
α : Type u_5
β : Type u_6
inst✝¹ : LE α
inst✝ : LE β
src✝ : α ⊕ β ≃ β ⊕ α := Equiv.sumComm α β
a : α
b : β
⊢ ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inl a) ≤
      ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inr b) ↔
    inl a ≤ inr b
case inr.inl
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
inst✝⁴ : LE α✝
inst✝³ : LE β✝
inst✝² : LE γ
a✝ : α✝
b✝ : β✝
c : γ
α : Type u_5
β : Type u_6
inst✝¹ : LE α
inst✝ : LE β
src✝ : α ⊕ β ≃ β ⊕ α := Equiv.sumComm α β
a : β
b : α
⊢ ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inr a) ≤
      ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inl b) ↔
    inr a ≤ inl b
case inr.inr
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
inst✝⁴ : LE α✝
inst✝³ : LE β✝
inst✝² : LE γ
a✝ : α✝
b✝ : β✝
c : γ
α : Type u_5
β : Type u_6
inst✝¹ : LE α
inst✝ : LE β
src✝ : α ⊕ β ≃ β ⊕ α := Equiv.sumComm α β
a b : β
⊢ ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inr a) ≤
      ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inr b) ↔
    inr a ≤ inr b
[PROOFSTEP]
simp
[GOAL]
case inl.inl
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
inst✝⁴ : LE α✝
inst✝³ : LE β✝
inst✝² : LE γ
a✝ : α✝
b✝ : β✝
c : γ
α : Type u_5
β : Type u_6
inst✝¹ : LE α
inst✝ : LE β
src✝ : α ⊕ β ≃ β ⊕ α := Equiv.sumComm α β
a b : α
⊢ inr a ≤ inr b ↔ inl a ≤ inl b
[PROOFSTEP]
change toLex (inr <| toDual a) ≤ toLex (inr <| toDual b) ↔ toDual (toLex <| inl a) ≤ toDual (toLex <| inl b)
[GOAL]
case inl.inl
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
inst✝⁴ : LE α✝
inst✝³ : LE β✝
inst✝² : LE γ
a✝ : α✝
b✝ : β✝
c : γ
α : Type u_5
β : Type u_6
inst✝¹ : LE α
inst✝ : LE β
src✝ : α ⊕ β ≃ β ⊕ α := Equiv.sumComm α β
a b : α
⊢ ↑toLex (inr (↑toDual a)) ≤ ↑toLex (inr (↑toDual b)) ↔ ↑toDual (↑toLex (inl a)) ≤ ↑toDual (↑toLex (inl b))
[PROOFSTEP]
simp [toDual_le_toDual, Lex.inl_le_inl_iff, Lex.inr_le_inr_iff]
[GOAL]
case inl.inr
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
inst✝⁴ : LE α✝
inst✝³ : LE β✝
inst✝² : LE γ
a✝ : α✝
b✝ : β✝
c : γ
α : Type u_5
β : Type u_6
inst✝¹ : LE α
inst✝ : LE β
src✝ : α ⊕ β ≃ β ⊕ α := Equiv.sumComm α β
a : α
b : β
⊢ ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inl a) ≤
      ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inr b) ↔
    inl a ≤ inr b
[PROOFSTEP]
exact iff_of_false (@Lex.not_inr_le_inl (OrderDual β) (OrderDual α) _ _ _ _) Lex.not_inr_le_inl
[GOAL]
case inr.inl
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
inst✝⁴ : LE α✝
inst✝³ : LE β✝
inst✝² : LE γ
a✝ : α✝
b✝ : β✝
c : γ
α : Type u_5
β : Type u_6
inst✝¹ : LE α
inst✝ : LE β
src✝ : α ⊕ β ≃ β ⊕ α := Equiv.sumComm α β
a : β
b : α
⊢ ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inr a) ≤
      ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inl b) ↔
    inr a ≤ inl b
[PROOFSTEP]
exact iff_of_true (@Lex.inl_le_inr (OrderDual β) (OrderDual α) _ _ _ _) (Lex.inl_le_inr _ _)
[GOAL]
case inr.inr
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
inst✝⁴ : LE α✝
inst✝³ : LE β✝
inst✝² : LE γ
a✝ : α✝
b✝ : β✝
c : γ
α : Type u_5
β : Type u_6
inst✝¹ : LE α
inst✝ : LE β
src✝ : α ⊕ β ≃ β ⊕ α := Equiv.sumComm α β
a b : β
⊢ ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inr a) ≤
      ↑{ toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : Function.LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (inr b) ↔
    inr a ≤ inr b
[PROOFSTEP]
change toLex (inl <| toDual a) ≤ toLex (inl <| toDual b) ↔ toDual (toLex <| inr a) ≤ toDual (toLex <| inr b)
[GOAL]
case inr.inr
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
inst✝⁴ : LE α✝
inst✝³ : LE β✝
inst✝² : LE γ
a✝ : α✝
b✝ : β✝
c : γ
α : Type u_5
β : Type u_6
inst✝¹ : LE α
inst✝ : LE β
src✝ : α ⊕ β ≃ β ⊕ α := Equiv.sumComm α β
a b : β
⊢ ↑toLex (inl (↑toDual a)) ≤ ↑toLex (inl (↑toDual b)) ↔ ↑toDual (↑toLex (inr a)) ≤ ↑toDual (↑toLex (inr b))
[PROOFSTEP]
simp [toDual_le_toDual, Lex.inl_le_inl_iff, Lex.inr_le_inr_iff]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝ : LE α
a b : WithBot α
⊢ ↑((Equiv.optionEquivSumPUnit α).trans ((Equiv.sumComm α PUnit).trans toLex)) a ≤
      ↑((Equiv.optionEquivSumPUnit α).trans ((Equiv.sumComm α PUnit).trans toLex)) b ↔
    a ≤ b
[PROOFSTEP]
rcases a with (a | _)
[GOAL]
case none
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝ : LE α
b : WithBot α
⊢ ↑((Equiv.optionEquivSumPUnit α).trans ((Equiv.sumComm α PUnit).trans toLex)) none ≤
      ↑((Equiv.optionEquivSumPUnit α).trans ((Equiv.sumComm α PUnit).trans toLex)) b ↔
    none ≤ b
[PROOFSTEP]
rcases b with (b | _)
[GOAL]
case some
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝ : LE α
b : WithBot α
val✝ : α
⊢ ↑((Equiv.optionEquivSumPUnit α).trans ((Equiv.sumComm α PUnit).trans toLex)) (Option.some val✝) ≤
      ↑((Equiv.optionEquivSumPUnit α).trans ((Equiv.sumComm α PUnit).trans toLex)) b ↔
    Option.some val✝ ≤ b
[PROOFSTEP]
rcases b with (b | _)
[GOAL]
case none.none
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝ : LE α
⊢ ↑((Equiv.optionEquivSumPUnit α).trans ((Equiv.sumComm α PUnit).trans toLex)) none ≤
      ↑((Equiv.optionEquivSumPUnit α).trans ((Equiv.sumComm α PUnit).trans toLex)) none ↔
    none ≤ none
[PROOFSTEP]
simp [swap, Equiv.optionEquivSumPUnit]
[GOAL]
case none.some
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝ : LE α
val✝ : α
⊢ ↑((Equiv.optionEquivSumPUnit α).trans ((Equiv.sumComm α PUnit).trans toLex)) none ≤
      ↑((Equiv.optionEquivSumPUnit α).trans ((Equiv.sumComm α PUnit).trans toLex)) (Option.some val✝) ↔
    none ≤ Option.some val✝
[PROOFSTEP]
simp [swap, Equiv.optionEquivSumPUnit]
[GOAL]
case some.none
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝ : LE α
val✝ : α
⊢ ↑((Equiv.optionEquivSumPUnit α).trans ((Equiv.sumComm α PUnit).trans toLex)) (Option.some val✝) ≤
      ↑((Equiv.optionEquivSumPUnit α).trans ((Equiv.sumComm α PUnit).trans toLex)) none ↔
    Option.some val✝ ≤ none
[PROOFSTEP]
simp [swap, Equiv.optionEquivSumPUnit]
[GOAL]
case some.some
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝ : LE α
val✝¹ val✝ : α
⊢ ↑((Equiv.optionEquivSumPUnit α).trans ((Equiv.sumComm α PUnit).trans toLex)) (Option.some val✝¹) ≤
      ↑((Equiv.optionEquivSumPUnit α).trans ((Equiv.sumComm α PUnit).trans toLex)) (Option.some val✝) ↔
    Option.some val✝¹ ≤ Option.some val✝
[PROOFSTEP]
simp [swap, Equiv.optionEquivSumPUnit]
[GOAL]
case some.none
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝ : LE α
val✝ : α
⊢ ¬Option.some val✝ ≤ none
[PROOFSTEP]
exact not_coe_le_bot _
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝ : LE α
a b : WithTop α
⊢ ↑((Equiv.optionEquivSumPUnit α).trans toLex) a ≤ ↑((Equiv.optionEquivSumPUnit α).trans toLex) b ↔ a ≤ b
[PROOFSTEP]
rcases a with (a | _)
[GOAL]
case none
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝ : LE α
b : WithTop α
⊢ ↑((Equiv.optionEquivSumPUnit α).trans toLex) none ≤ ↑((Equiv.optionEquivSumPUnit α).trans toLex) b ↔ none ≤ b
[PROOFSTEP]
rcases b with (b | _)
[GOAL]
case some
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝ : LE α
b : WithTop α
val✝ : α
⊢ ↑((Equiv.optionEquivSumPUnit α).trans toLex) (Option.some val✝) ≤ ↑((Equiv.optionEquivSumPUnit α).trans toLex) b ↔
    Option.some val✝ ≤ b
[PROOFSTEP]
rcases b with (b | _)
[GOAL]
case none.none
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝ : LE α
⊢ ↑((Equiv.optionEquivSumPUnit α).trans toLex) none ≤ ↑((Equiv.optionEquivSumPUnit α).trans toLex) none ↔ none ≤ none
[PROOFSTEP]
simp [swap, Equiv.optionEquivSumPUnit]
[GOAL]
case none.some
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝ : LE α
val✝ : α
⊢ ↑((Equiv.optionEquivSumPUnit α).trans toLex) none ≤ ↑((Equiv.optionEquivSumPUnit α).trans toLex) (Option.some val✝) ↔
    none ≤ Option.some val✝
[PROOFSTEP]
simp [swap, Equiv.optionEquivSumPUnit]
[GOAL]
case some.none
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝ : LE α
val✝ : α
⊢ ↑((Equiv.optionEquivSumPUnit α).trans toLex) (Option.some val✝) ≤ ↑((Equiv.optionEquivSumPUnit α).trans toLex) none ↔
    Option.some val✝ ≤ none
[PROOFSTEP]
simp [swap, Equiv.optionEquivSumPUnit]
[GOAL]
case some.some
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝ : LE α
val✝¹ val✝ : α
⊢ ↑((Equiv.optionEquivSumPUnit α).trans toLex) (Option.some val✝¹) ≤
      ↑((Equiv.optionEquivSumPUnit α).trans toLex) (Option.some val✝) ↔
    Option.some val✝¹ ≤ Option.some val✝
[PROOFSTEP]
simp [swap, Equiv.optionEquivSumPUnit]
[GOAL]
case none.some
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝ : LE α
val✝ : α
⊢ ¬none ≤ Option.some val✝
[PROOFSTEP]
exact not_top_le_coe _


[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : MulZeroClass M₀
a✝ b✝ a b : M₀
h : a ≠ 0 → b = 0
ha : a = 0
⊢ a * b = 0
[PROOFSTEP]
rw [ha, zero_mul]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : MulZeroClass M₀
a✝ b✝ a b : M₀
h : a ≠ 0 → b = 0
ha : ¬a = 0
⊢ a * b = 0
[PROOFSTEP]
rw [h ha, mul_zero]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : MulZeroOneClass M₀
h : 0 = 1
a : M₀
⊢ a = 0
[PROOFSTEP]
rw [← mul_one a, ← h, mul_zero]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : CancelMonoidWithZero M₀
a b c : M₀
⊢ a * c = b * c ↔ a = b ∨ c = 0
[PROOFSTEP]
by_cases hc : c = 0 <;> [simp [hc]; simp [mul_left_inj', hc]]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : CancelMonoidWithZero M₀
a b c : M₀
⊢ a * c = b * c ↔ a = b ∨ c = 0
[PROOFSTEP]
by_cases hc : c = 0
[GOAL]
case pos
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : CancelMonoidWithZero M₀
a b c : M₀
hc : c = 0
⊢ a * c = b * c ↔ a = b ∨ c = 0
[PROOFSTEP]
simp [hc]
[GOAL]
case neg
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : CancelMonoidWithZero M₀
a b c : M₀
hc : ¬c = 0
⊢ a * c = b * c ↔ a = b ∨ c = 0
[PROOFSTEP]
simp [mul_left_inj', hc]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : CancelMonoidWithZero M₀
a b c : M₀
⊢ a * b = a * c ↔ b = c ∨ a = 0
[PROOFSTEP]
by_cases ha : a = 0 <;> [simp [ha]; simp [mul_right_inj', ha]]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : CancelMonoidWithZero M₀
a b c : M₀
⊢ a * b = a * c ↔ b = c ∨ a = 0
[PROOFSTEP]
by_cases ha : a = 0
[GOAL]
case pos
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : CancelMonoidWithZero M₀
a b c : M₀
ha : a = 0
⊢ a * b = a * c ↔ b = c ∨ a = 0
[PROOFSTEP]
simp [ha]
[GOAL]
case neg
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : CancelMonoidWithZero M₀
a b c : M₀
ha : ¬a = 0
⊢ a * b = a * c ↔ b = c ∨ a = 0
[PROOFSTEP]
simp [mul_right_inj', ha]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : CancelMonoidWithZero M₀
a b c : M₀
⊢ a * b = a ↔ a * b = a * 1
[PROOFSTEP]
rw [mul_one]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : CancelMonoidWithZero M₀
a b c : M₀
⊢ a * b = b ↔ a * b = 1 * b
[PROOFSTEP]
rw [one_mul]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : CancelMonoidWithZero M₀
a b c : M₀
ha : a ≠ 0
⊢ a * b = a ↔ b = 1
[PROOFSTEP]
rw [Iff.comm, ← mul_right_inj' ha, mul_one]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : CancelMonoidWithZero M₀
a b c : M₀
hb : b ≠ 0
⊢ a * b = b ↔ a = 1
[PROOFSTEP]
rw [Iff.comm, ← mul_left_inj' hb, one_mul]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : CancelMonoidWithZero M₀
a b c : M₀
ha : a ≠ 0
⊢ a = a * b ↔ b = 1
[PROOFSTEP]
rw [eq_comm, mul_eq_left₀ ha]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : CancelMonoidWithZero M₀
a b c : M₀
hb : b ≠ 0
⊢ b = a * b ↔ a = 1
[PROOFSTEP]
rw [eq_comm, mul_eq_right₀ hb]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b c g h✝ x : G₀
h : b ≠ 0
a : G₀
⊢ a * (b * b⁻¹) = a
[PROOFSTEP]
simp [h]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a b✝ c g h✝ x : G₀
h : a ≠ 0
b : G₀
⊢ a * a⁻¹ * b = b
[PROOFSTEP]
simp [h]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a b c g h✝ x : G₀
h : a ≠ 0
a_eq_0 : a⁻¹ = 0
⊢ False
[PROOFSTEP]
have := mul_inv_cancel h
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a b c g h✝ x : G₀
h : a ≠ 0
a_eq_0 : a⁻¹ = 0
this : a * a⁻¹ = 1
⊢ False
[PROOFSTEP]
simp [a_eq_0] at this
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a b c g h✝ x : G₀
h : a ≠ 0
⊢ a⁻¹ * a = a⁻¹ * a * a⁻¹ * a⁻¹⁻¹
[PROOFSTEP]
simp [inv_ne_zero h]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a b c g h✝ x : G₀
h : a ≠ 0
⊢ a⁻¹ * a * a⁻¹ * a⁻¹⁻¹ = a⁻¹ * a⁻¹⁻¹
[PROOFSTEP]
simp [h]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a b c g h✝ x : G₀
h : a ≠ 0
⊢ a⁻¹ * a⁻¹⁻¹ = 1
[PROOFSTEP]
simp [inv_ne_zero h]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a b c g h✝ x : G₀
h : x ≠ 0
y y' : G₀
w : (fun y => x * y) y = (fun y => x * y) y'
⊢ y = y'
[PROOFSTEP]
simpa only [← mul_assoc, inv_mul_cancel h, one_mul] using congr_arg (fun y => x⁻¹ * y) w
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a b c g h✝ x : G₀
h : x ≠ 0
y y' : G₀
w : (fun y => y * x) y = (fun y => y * x) y'
⊢ y = y'
[PROOFSTEP]
simpa only [mul_assoc, mul_inv_cancel _ h, mul_one] using congr_arg (fun y => y * x⁻¹) w
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b c g h✝ x : G₀
h : b ≠ 0
a : G₀
⊢ a * (b⁻¹ * b) = a
[PROOFSTEP]
simp [h]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a b✝ c g h✝ x : G₀
h : a ≠ 0
b : G₀
⊢ a⁻¹ * a * b = b
[PROOFSTEP]
simp [h]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a b c g h✝ x : G₀
h : a * b = 1
⊢ a⁻¹ = b
[PROOFSTEP]
rw [← inv_mul_cancel_left₀ (left_ne_zero_of_mul_eq_one h) b, h, mul_one]
  -- See note [lower instance priority]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b c g h x : G₀
src✝ : GroupWithZero G₀ := inst✝
a : G₀
⊢ a⁻¹⁻¹ = a
[PROOFSTEP]
by_cases h : a = 0
[GOAL]
case pos
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b c g h✝ x : G₀
src✝ : GroupWithZero G₀ := inst✝
a : G₀
h : a = 0
⊢ a⁻¹⁻¹ = a
[PROOFSTEP]
simp [h]
[GOAL]
case neg
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b c g h✝ x : G₀
src✝ : GroupWithZero G₀ := inst✝
a : G₀
h : ¬a = 0
⊢ a⁻¹⁻¹ = a
[PROOFSTEP]
exact left_inv_eq_right_inv (inv_mul_cancel <| inv_ne_zero h) (inv_mul_cancel h)
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b✝ c g h x : G₀
src✝ : GroupWithZero G₀ := inst✝
a b : G₀
⊢ (a * b)⁻¹ = b⁻¹ * a⁻¹
[PROOFSTEP]
by_cases ha : a = 0
[GOAL]
case pos
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b✝ c g h x : G₀
src✝ : GroupWithZero G₀ := inst✝
a b : G₀
ha : a = 0
⊢ (a * b)⁻¹ = b⁻¹ * a⁻¹
[PROOFSTEP]
simp [ha]
[GOAL]
case neg
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b✝ c g h x : G₀
src✝ : GroupWithZero G₀ := inst✝
a b : G₀
ha : ¬a = 0
⊢ (a * b)⁻¹ = b⁻¹ * a⁻¹
[PROOFSTEP]
by_cases hb : b = 0
[GOAL]
case pos
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b✝ c g h x : G₀
src✝ : GroupWithZero G₀ := inst✝
a b : G₀
ha : ¬a = 0
hb : b = 0
⊢ (a * b)⁻¹ = b⁻¹ * a⁻¹
[PROOFSTEP]
simp [hb]
[GOAL]
case neg
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b✝ c g h x : G₀
src✝ : GroupWithZero G₀ := inst✝
a b : G₀
ha : ¬a = 0
hb : ¬b = 0
⊢ (a * b)⁻¹ = b⁻¹ * a⁻¹
[PROOFSTEP]
refine' inv_eq_of_mul _
[GOAL]
case neg
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b✝ c g h x : G₀
src✝ : GroupWithZero G₀ := inst✝
a b : G₀
ha : ¬a = 0
hb : ¬b = 0
⊢ a * b * (b⁻¹ * a⁻¹) = 1
[PROOFSTEP]
simp [mul_assoc, ha, hb]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a b c g h✝ x✝ : G₀
src✝ : GroupWithZero G₀ := inst✝
x y z : G₀
hx : x ≠ 0
h : x * y = x * z
⊢ y = z
[PROOFSTEP]
rw [← inv_mul_cancel_left₀ hx y, h, inv_mul_cancel_left₀ hx z]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a b c g h✝ x✝ : G₀
src✝ : GroupWithZero G₀ := inst✝
x y z : G₀
hy : y ≠ 0
h : x * y = z * y
⊢ x = z
[PROOFSTEP]
rw [← mul_inv_cancel_right₀ hy x, h, mul_inv_cancel_right₀ hy z]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b c a : G₀
⊢ 0 / a = 0
[PROOFSTEP]
rw [div_eq_mul_inv, zero_mul]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b c a : G₀
⊢ a / 0 = 0
[PROOFSTEP]
rw [div_eq_mul_inv, inv_zero, mul_zero]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b c a : G₀
⊢ a * a * a⁻¹ = a
[PROOFSTEP]
by_cases h : a = 0
[GOAL]
case pos
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b c a : G₀
h : a = 0
⊢ a * a * a⁻¹ = a
[PROOFSTEP]
rw [h, inv_zero, mul_zero]
[GOAL]
case neg
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b c a : G₀
h : ¬a = 0
⊢ a * a * a⁻¹ = a
[PROOFSTEP]
rw [mul_assoc, mul_inv_cancel h, mul_one]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b c a : G₀
⊢ a * a⁻¹ * a = a
[PROOFSTEP]
by_cases h : a = 0
[GOAL]
case pos
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b c a : G₀
h : a = 0
⊢ a * a⁻¹ * a = a
[PROOFSTEP]
rw [h, inv_zero, mul_zero]
[GOAL]
case neg
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b c a : G₀
h : ¬a = 0
⊢ a * a⁻¹ * a = a
[PROOFSTEP]
rw [mul_inv_cancel h, one_mul]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b c a : G₀
⊢ a⁻¹ * a * a = a
[PROOFSTEP]
by_cases h : a = 0
[GOAL]
case pos
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b c a : G₀
h : a = 0
⊢ a⁻¹ * a * a = a
[PROOFSTEP]
rw [h, inv_zero, mul_zero]
[GOAL]
case neg
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b c a : G₀
h : ¬a = 0
⊢ a⁻¹ * a * a = a
[PROOFSTEP]
rw [inv_mul_cancel h, one_mul]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b c a : G₀
⊢ a * a / a = a
[PROOFSTEP]
rw [div_eq_mul_inv, mul_self_mul_inv a]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b c a : G₀
⊢ a / a * a = a
[PROOFSTEP]
rw [div_eq_mul_inv, mul_inv_mul_self a]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b c a : G₀
⊢ a / (a * a) = a⁻¹⁻¹ * a⁻¹ * a⁻¹
[PROOFSTEP]
simp [mul_inv_rev]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b c a : G₀
h : a ≠ 0
⊢ 1 / a ≠ 0
[PROOFSTEP]
simpa only [one_div] using inv_ne_zero h
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b c a : G₀
⊢ a⁻¹ = 0 ↔ a = 0
[PROOFSTEP]
rw [inv_eq_iff_eq_inv, inv_zero]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b c a : G₀
⊢ a / (a / a) = a
[PROOFSTEP]
rw [div_div_eq_mul_div]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b c a : G₀
⊢ a * a / a = a
[PROOFSTEP]
exact mul_self_div_self a
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b c a : G₀
h : 1 / a ≠ 0
ha : a = 0
⊢ False
[PROOFSTEP]
rw [ha, div_zero] at h
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b c a : G₀
h : 0 ≠ 0
ha : a = 0
⊢ False
[PROOFSTEP]
contradiction
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b c a : G₀
h : a ≠ 0
g : G₀
⊢ (fun g => a * g) (a⁻¹ * g) = g
[PROOFSTEP]
simp [← mul_assoc, mul_inv_cancel h]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : GroupWithZero G₀
a✝ b c a : G₀
h : a ≠ 0
g : G₀
⊢ (fun g => g * a) (g * a⁻¹) = g
[PROOFSTEP]
simp [mul_assoc, inv_mul_cancel h]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : CommGroupWithZero G₀
a✝ b✝ c✝ d a b c : G₀
⊢ a / c * b = a * b / c
[PROOFSTEP]
simp_rw [div_eq_mul_inv, mul_assoc, mul_comm c⁻¹]