[GOAL]
R : Type u_1
A : Type u_2
inst✝⁷ : Semiring R
inst✝⁶ : StarSemigroup R
inst✝⁵ : TrivialStar R
inst✝⁴ : AddCommGroup A
inst✝³ : Module R A
inst✝² : StarAddMonoid A
inst✝¹ : StarModule R A
inst✝ : Invertible 2
x : A
⊢ ⅟2 • (x + star x) ∈ selfAdjoint A
[PROOFSTEP]
simp only [selfAdjoint.mem_iff, star_smul, add_comm, StarAddMonoid.star_add, star_inv', star_bit0, star_one, star_star,
  star_invOf (2 : R), star_trivial]
[GOAL]
R : Type u_1
A : Type u_2
inst✝⁷ : Semiring R
inst✝⁶ : StarSemigroup R
inst✝⁵ : TrivialStar R
inst✝⁴ : AddCommGroup A
inst✝³ : Module R A
inst✝² : StarAddMonoid A
inst✝¹ : StarModule R A
inst✝ : Invertible 2
x y : A
⊢ (fun x => { val := ⅟2 • (x + star x), property := (_ : ⅟2 • (x + star x) ∈ selfAdjoint A) }) (x + y) =
    (fun x => { val := ⅟2 • (x + star x), property := (_ : ⅟2 • (x + star x) ∈ selfAdjoint A) }) x +
      (fun x => { val := ⅟2 • (x + star x), property := (_ : ⅟2 • (x + star x) ∈ selfAdjoint A) }) y
[PROOFSTEP]
ext
[GOAL]
case a
R : Type u_1
A : Type u_2
inst✝⁷ : Semiring R
inst✝⁶ : StarSemigroup R
inst✝⁵ : TrivialStar R
inst✝⁴ : AddCommGroup A
inst✝³ : Module R A
inst✝² : StarAddMonoid A
inst✝¹ : StarModule R A
inst✝ : Invertible 2
x y : A
⊢ ↑((fun x => { val := ⅟2 • (x + star x), property := (_ : ⅟2 • (x + star x) ∈ selfAdjoint A) }) (x + y)) =
    ↑((fun x => { val := ⅟2 • (x + star x), property := (_ : ⅟2 • (x + star x) ∈ selfAdjoint A) }) x +
        (fun x => { val := ⅟2 • (x + star x), property := (_ : ⅟2 • (x + star x) ∈ selfAdjoint A) }) y)
[PROOFSTEP]
simp [add_add_add_comm]
[GOAL]
R : Type u_1
A : Type u_2
inst✝⁷ : Semiring R
inst✝⁶ : StarSemigroup R
inst✝⁵ : TrivialStar R
inst✝⁴ : AddCommGroup A
inst✝³ : Module R A
inst✝² : StarAddMonoid A
inst✝¹ : StarModule R A
inst✝ : Invertible 2
r : R
x : A
⊢ AddHom.toFun
      { toFun := fun x => { val := ⅟2 • (x + star x), property := (_ : ⅟2 • (x + star x) ∈ selfAdjoint A) },
        map_add' :=
          (_ :
            ∀ (x y : A),
              (fun x => { val := ⅟2 • (x + star x), property := (_ : ⅟2 • (x + star x) ∈ selfAdjoint A) }) (x + y) =
                (fun x => { val := ⅟2 • (x + star x), property := (_ : ⅟2 • (x + star x) ∈ selfAdjoint A) }) x +
                  (fun x => { val := ⅟2 • (x + star x), property := (_ : ⅟2 • (x + star x) ∈ selfAdjoint A) }) y) }
      (r • x) =
    ↑(RingHom.id R) r •
      AddHom.toFun
        { toFun := fun x => { val := ⅟2 • (x + star x), property := (_ : ⅟2 • (x + star x) ∈ selfAdjoint A) },
          map_add' :=
            (_ :
              ∀ (x y : A),
                (fun x => { val := ⅟2 • (x + star x), property := (_ : ⅟2 • (x + star x) ∈ selfAdjoint A) }) (x + y) =
                  (fun x => { val := ⅟2 • (x + star x), property := (_ : ⅟2 • (x + star x) ∈ selfAdjoint A) }) x +
                    (fun x => { val := ⅟2 • (x + star x), property := (_ : ⅟2 • (x + star x) ∈ selfAdjoint A) }) y) }
        x
[PROOFSTEP]
ext
[GOAL]
case a
R : Type u_1
A : Type u_2
inst✝⁷ : Semiring R
inst✝⁶ : StarSemigroup R
inst✝⁵ : TrivialStar R
inst✝⁴ : AddCommGroup A
inst✝³ : Module R A
inst✝² : StarAddMonoid A
inst✝¹ : StarModule R A
inst✝ : Invertible 2
r : R
x : A
⊢ ↑(AddHom.toFun
        { toFun := fun x => { val := ⅟2 • (x + star x), property := (_ : ⅟2 • (x + star x) ∈ selfAdjoint A) },
          map_add' :=
            (_ :
              ∀ (x y : A),
                (fun x => { val := ⅟2 • (x + star x), property := (_ : ⅟2 • (x + star x) ∈ selfAdjoint A) }) (x + y) =
                  (fun x => { val := ⅟2 • (x + star x), property := (_ : ⅟2 • (x + star x) ∈ selfAdjoint A) }) x +
                    (fun x => { val := ⅟2 • (x + star x), property := (_ : ⅟2 • (x + star x) ∈ selfAdjoint A) }) y) }
        (r • x)) =
    ↑(↑(RingHom.id R) r •
        AddHom.toFun
          { toFun := fun x => { val := ⅟2 • (x + star x), property := (_ : ⅟2 • (x + star x) ∈ selfAdjoint A) },
            map_add' :=
              (_ :
                ∀ (x y : A),
                  (fun x => { val := ⅟2 • (x + star x), property := (_ : ⅟2 • (x + star x) ∈ selfAdjoint A) }) (x + y) =
                    (fun x => { val := ⅟2 • (x + star x), property := (_ : ⅟2 • (x + star x) ∈ selfAdjoint A) }) x +
                      (fun x => { val := ⅟2 • (x + star x), property := (_ : ⅟2 • (x + star x) ∈ selfAdjoint A) }) y) }
          x)
[PROOFSTEP]
simp [← mul_smul, show ⅟2 * r = r * ⅟2 from Commute.invOf_left <| (2 : ℕ).cast_commute r]
[GOAL]
R : Type u_1
A : Type u_2
inst✝⁷ : Semiring R
inst✝⁶ : StarSemigroup R
inst✝⁵ : TrivialStar R
inst✝⁴ : AddCommGroup A
inst✝³ : Module R A
inst✝² : StarAddMonoid A
inst✝¹ : StarModule R A
inst✝ : Invertible 2
x : A
⊢ ⅟2 • (x - star x) ∈ skewAdjoint A
[PROOFSTEP]
simp only [skewAdjoint.mem_iff, star_smul, star_sub, star_star, star_trivial, ← smul_neg, neg_sub]
[GOAL]
R : Type u_1
A : Type u_2
inst✝⁷ : Semiring R
inst✝⁶ : StarSemigroup R
inst✝⁵ : TrivialStar R
inst✝⁴ : AddCommGroup A
inst✝³ : Module R A
inst✝² : StarAddMonoid A
inst✝¹ : StarModule R A
inst✝ : Invertible 2
x y : A
⊢ (fun x => { val := ⅟2 • (x - star x), property := (_ : ⅟2 • (x - star x) ∈ skewAdjoint A) }) (x + y) =
    (fun x => { val := ⅟2 • (x - star x), property := (_ : ⅟2 • (x - star x) ∈ skewAdjoint A) }) x +
      (fun x => { val := ⅟2 • (x - star x), property := (_ : ⅟2 • (x - star x) ∈ skewAdjoint A) }) y
[PROOFSTEP]
ext
[GOAL]
case a
R : Type u_1
A : Type u_2
inst✝⁷ : Semiring R
inst✝⁶ : StarSemigroup R
inst✝⁵ : TrivialStar R
inst✝⁴ : AddCommGroup A
inst✝³ : Module R A
inst✝² : StarAddMonoid A
inst✝¹ : StarModule R A
inst✝ : Invertible 2
x y : A
⊢ ↑((fun x => { val := ⅟2 • (x - star x), property := (_ : ⅟2 • (x - star x) ∈ skewAdjoint A) }) (x + y)) =
    ↑((fun x => { val := ⅟2 • (x - star x), property := (_ : ⅟2 • (x - star x) ∈ skewAdjoint A) }) x +
        (fun x => { val := ⅟2 • (x - star x), property := (_ : ⅟2 • (x - star x) ∈ skewAdjoint A) }) y)
[PROOFSTEP]
simp only [sub_add, ← smul_add, sub_sub_eq_add_sub, star_add, AddSubgroup.coe_mk, AddSubgroup.coe_add]
[GOAL]
R : Type u_1
A : Type u_2
inst✝⁷ : Semiring R
inst✝⁶ : StarSemigroup R
inst✝⁵ : TrivialStar R
inst✝⁴ : AddCommGroup A
inst✝³ : Module R A
inst✝² : StarAddMonoid A
inst✝¹ : StarModule R A
inst✝ : Invertible 2
r : R
x : A
⊢ AddHom.toFun
      { toFun := fun x => { val := ⅟2 • (x - star x), property := (_ : ⅟2 • (x - star x) ∈ skewAdjoint A) },
        map_add' :=
          (_ :
            ∀ (x y : A),
              (fun x => { val := ⅟2 • (x - star x), property := (_ : ⅟2 • (x - star x) ∈ skewAdjoint A) }) (x + y) =
                (fun x => { val := ⅟2 • (x - star x), property := (_ : ⅟2 • (x - star x) ∈ skewAdjoint A) }) x +
                  (fun x => { val := ⅟2 • (x - star x), property := (_ : ⅟2 • (x - star x) ∈ skewAdjoint A) }) y) }
      (r • x) =
    ↑(RingHom.id R) r •
      AddHom.toFun
        { toFun := fun x => { val := ⅟2 • (x - star x), property := (_ : ⅟2 • (x - star x) ∈ skewAdjoint A) },
          map_add' :=
            (_ :
              ∀ (x y : A),
                (fun x => { val := ⅟2 • (x - star x), property := (_ : ⅟2 • (x - star x) ∈ skewAdjoint A) }) (x + y) =
                  (fun x => { val := ⅟2 • (x - star x), property := (_ : ⅟2 • (x - star x) ∈ skewAdjoint A) }) x +
                    (fun x => { val := ⅟2 • (x - star x), property := (_ : ⅟2 • (x - star x) ∈ skewAdjoint A) }) y) }
        x
[PROOFSTEP]
ext
[GOAL]
case a
R : Type u_1
A : Type u_2
inst✝⁷ : Semiring R
inst✝⁶ : StarSemigroup R
inst✝⁵ : TrivialStar R
inst✝⁴ : AddCommGroup A
inst✝³ : Module R A
inst✝² : StarAddMonoid A
inst✝¹ : StarModule R A
inst✝ : Invertible 2
r : R
x : A
⊢ ↑(AddHom.toFun
        { toFun := fun x => { val := ⅟2 • (x - star x), property := (_ : ⅟2 • (x - star x) ∈ skewAdjoint A) },
          map_add' :=
            (_ :
              ∀ (x y : A),
                (fun x => { val := ⅟2 • (x - star x), property := (_ : ⅟2 • (x - star x) ∈ skewAdjoint A) }) (x + y) =
                  (fun x => { val := ⅟2 • (x - star x), property := (_ : ⅟2 • (x - star x) ∈ skewAdjoint A) }) x +
                    (fun x => { val := ⅟2 • (x - star x), property := (_ : ⅟2 • (x - star x) ∈ skewAdjoint A) }) y) }
        (r • x)) =
    ↑(↑(RingHom.id R) r •
        AddHom.toFun
          { toFun := fun x => { val := ⅟2 • (x - star x), property := (_ : ⅟2 • (x - star x) ∈ skewAdjoint A) },
            map_add' :=
              (_ :
                ∀ (x y : A),
                  (fun x => { val := ⅟2 • (x - star x), property := (_ : ⅟2 • (x - star x) ∈ skewAdjoint A) }) (x + y) =
                    (fun x => { val := ⅟2 • (x - star x), property := (_ : ⅟2 • (x - star x) ∈ skewAdjoint A) }) x +
                      (fun x => { val := ⅟2 • (x - star x), property := (_ : ⅟2 • (x - star x) ∈ skewAdjoint A) }) y) }
          x)
[PROOFSTEP]
simp [← mul_smul, ← smul_sub, show r * ⅟2 = ⅟2 * r from Commute.invOf_right <| (2 : ℕ).commute_cast r]
[GOAL]
R : Type u_1
A : Type u_2
inst✝⁷ : Semiring R
inst✝⁶ : StarSemigroup R
inst✝⁵ : TrivialStar R
inst✝⁴ : AddCommGroup A
inst✝³ : Module R A
inst✝² : StarAddMonoid A
inst✝¹ : StarModule R A
inst✝ : Invertible 2
x : A
⊢ ↑(↑(selfAdjointPart R) x) + ↑(↑(skewAdjointPart R) x) = x
[PROOFSTEP]
simp only [smul_sub, selfAdjointPart_apply_coe, smul_add, skewAdjointPart_apply_coe, add_add_sub_cancel,
  invOf_two_smul_add_invOf_two_smul]
[GOAL]
R : Type u_1
A : Type u_2
inst✝⁷ : Semiring R
inst✝⁶ : StarSemigroup R
inst✝⁵ : TrivialStar R
inst✝⁴ : AddCommGroup A
inst✝³ : Module R A
inst✝² : StarAddMonoid A
inst✝¹ : StarModule R A
inst✝ : Invertible 2
x : A
hx : IsSelfAdjoint x
⊢ ↑(↑(selfAdjointPart R) x) = x
[PROOFSTEP]
rw [selfAdjointPart_apply_coe, hx.star_eq, smul_add, invOf_two_smul_add_invOf_two_smul]
[GOAL]
R : Type u_1
A : Type u_2
inst✝⁷ : Semiring R
inst✝⁶ : StarSemigroup R
inst✝⁵ : TrivialStar R
inst✝⁴ : AddCommGroup A
inst✝³ : Module R A
inst✝² : StarAddMonoid A
inst✝¹ : StarModule R A
inst✝ : Invertible 2
x : A
hx : IsSelfAdjoint x
⊢ ↑(↑(skewAdjointPart R) x) = ↑0
[PROOFSTEP]
rw [skewAdjointPart_apply_coe, hx.star_eq, sub_self, smul_zero, ZeroMemClass.coe_zero]
  -- porting note: todo: make it a `simp`
[GOAL]
R : Type u_1
A : Type u_2
inst✝⁷ : Semiring R
inst✝⁶ : StarSemigroup R
inst✝⁵ : TrivialStar R
inst✝⁴ : AddCommGroup A
inst✝³ : Module R A
inst✝² : StarAddMonoid A
inst✝¹ : StarModule R A
inst✝ : Invertible 2
x✝ : { x // x ∈ skewAdjoint.submodule R A }
x : A
hx : star x = -x
⊢ ↑(↑(LinearMap.comp (selfAdjointPart R) (Submodule.subtype (skewAdjoint.submodule R A)))
        { val := x, property := hx }) =
    ↑(↑0 { val := x, property := hx })
[PROOFSTEP]
simp [hx]
  -- porting note: todo: make it a `simp`
[GOAL]
R : Type u_1
A : Type u_2
inst✝⁷ : Semiring R
inst✝⁶ : StarSemigroup R
inst✝⁵ : TrivialStar R
inst✝⁴ : AddCommGroup A
inst✝³ : Module R A
inst✝² : StarAddMonoid A
inst✝¹ : StarModule R A
inst✝ : Invertible 2
x✝ : { x // x ∈ skewAdjoint.submodule R A }
x : A
hx : star x = -x
⊢ ↑(↑(LinearMap.comp (skewAdjointPart R) (Submodule.subtype (skewAdjoint.submodule R A)))
        { val := x, property := hx }) =
    ↑(↑LinearMap.id { val := x, property := hx })
[PROOFSTEP]
simp only [LinearMap.comp_apply, Submodule.subtype_apply, skewAdjointPart_apply_coe, hx, sub_neg_eq_add, smul_add,
  invOf_two_smul_add_invOf_two_smul]
[GOAL]
R : Type u_1
A : Type u_2
inst✝⁷ : Semiring R
inst✝⁶ : StarSemigroup R
inst✝⁵ : TrivialStar R
inst✝⁴ : AddCommGroup A
inst✝³ : Module R A
inst✝² : StarAddMonoid A
inst✝¹ : StarModule R A
inst✝ : Invertible 2
x✝ : { x // x ∈ skewAdjoint.submodule R A }
x : A
hx : star x = -x
⊢ x = ↑(↑LinearMap.id { val := x, property := hx })
[PROOFSTEP]
rfl
[GOAL]
R : Type u_1
A : Type u_2
inst✝⁷ : Semiring R
inst✝⁶ : StarSemigroup R
inst✝⁵ : TrivialStar R
inst✝⁴ : AddCommGroup A
inst✝³ : Module R A
inst✝² : StarAddMonoid A
inst✝¹ : StarModule R A
inst✝ : Invertible 2
⊢ A ≃ₗ[R] { x // x ∈ selfAdjoint A } × { x // x ∈ skewAdjoint A }
[PROOFSTEP]
refine
  LinearEquiv.ofLinear ((selfAdjointPart R).prod (skewAdjointPart R))
    (LinearMap.coprod ((selfAdjoint.submodule R A).subtype) (skewAdjoint.submodule R A).subtype) ?_
    (LinearMap.ext <| StarModule.selfAdjointPart_add_skewAdjointPart R)
[GOAL]
R : Type u_1
A : Type u_2
inst✝⁷ : Semiring R
inst✝⁶ : StarSemigroup R
inst✝⁵ : TrivialStar R
inst✝⁴ : AddCommGroup A
inst✝³ : Module R A
inst✝² : StarAddMonoid A
inst✝¹ : StarModule R A
inst✝ : Invertible 2
⊢ LinearMap.comp (LinearMap.prod (selfAdjointPart R) (skewAdjointPart R))
      (LinearMap.coprod (Submodule.subtype (selfAdjoint.submodule R A))
        (Submodule.subtype (skewAdjoint.submodule R A))) =
    LinearMap.id
[PROOFSTEP]
ext
[GOAL]
case hl.h.h₁.a
R : Type u_1
A : Type u_2
inst✝⁷ : Semiring R
inst✝⁶ : StarSemigroup R
inst✝⁵ : TrivialStar R
inst✝⁴ : AddCommGroup A
inst✝³ : Module R A
inst✝² : StarAddMonoid A
inst✝¹ : StarModule R A
inst✝ : Invertible 2
x✝ : { x // x ∈ selfAdjoint A }
⊢ ↑(↑(LinearMap.comp
              (LinearMap.comp (LinearMap.prod (selfAdjointPart R) (skewAdjointPart R))
                (LinearMap.coprod (Submodule.subtype (selfAdjoint.submodule R A))
                  (Submodule.subtype (skewAdjoint.submodule R A))))
              (LinearMap.inl R { x // x ∈ selfAdjoint A } { x // x ∈ skewAdjoint A }))
          x✝).fst =
    ↑(↑(LinearMap.comp LinearMap.id (LinearMap.inl R { x // x ∈ selfAdjoint A } { x // x ∈ skewAdjoint A })) x✝).fst
[PROOFSTEP]
simp
[GOAL]
case hl.h.h₂.a
R : Type u_1
A : Type u_2
inst✝⁷ : Semiring R
inst✝⁶ : StarSemigroup R
inst✝⁵ : TrivialStar R
inst✝⁴ : AddCommGroup A
inst✝³ : Module R A
inst✝² : StarAddMonoid A
inst✝¹ : StarModule R A
inst✝ : Invertible 2
x✝ : { x // x ∈ selfAdjoint A }
⊢ ↑(↑(LinearMap.comp
              (LinearMap.comp (LinearMap.prod (selfAdjointPart R) (skewAdjointPart R))
                (LinearMap.coprod (Submodule.subtype (selfAdjoint.submodule R A))
                  (Submodule.subtype (skewAdjoint.submodule R A))))
              (LinearMap.inl R { x // x ∈ selfAdjoint A } { x // x ∈ skewAdjoint A }))
          x✝).snd =
    ↑(↑(LinearMap.comp LinearMap.id (LinearMap.inl R { x // x ∈ selfAdjoint A } { x // x ∈ skewAdjoint A })) x✝).snd
[PROOFSTEP]
simp
[GOAL]
case hr.h.h₁.a
R : Type u_1
A : Type u_2
inst✝⁷ : Semiring R
inst✝⁶ : StarSemigroup R
inst✝⁵ : TrivialStar R
inst✝⁴ : AddCommGroup A
inst✝³ : Module R A
inst✝² : StarAddMonoid A
inst✝¹ : StarModule R A
inst✝ : Invertible 2
x✝ : { x // x ∈ skewAdjoint A }
⊢ ↑(↑(LinearMap.comp
              (LinearMap.comp (LinearMap.prod (selfAdjointPart R) (skewAdjointPart R))
                (LinearMap.coprod (Submodule.subtype (selfAdjoint.submodule R A))
                  (Submodule.subtype (skewAdjoint.submodule R A))))
              (LinearMap.inr R { x // x ∈ selfAdjoint A } { x // x ∈ skewAdjoint A }))
          x✝).fst =
    ↑(↑(LinearMap.comp LinearMap.id (LinearMap.inr R { x // x ∈ selfAdjoint A } { x // x ∈ skewAdjoint A })) x✝).fst
[PROOFSTEP]
simp
[GOAL]
case hr.h.h₂.a
R : Type u_1
A : Type u_2
inst✝⁷ : Semiring R
inst✝⁶ : StarSemigroup R
inst✝⁵ : TrivialStar R
inst✝⁴ : AddCommGroup A
inst✝³ : Module R A
inst✝² : StarAddMonoid A
inst✝¹ : StarModule R A
inst✝ : Invertible 2
x✝ : { x // x ∈ skewAdjoint A }
⊢ ↑(↑(LinearMap.comp
              (LinearMap.comp (LinearMap.prod (selfAdjointPart R) (skewAdjointPart R))
                (LinearMap.coprod (Submodule.subtype (selfAdjoint.submodule R A))
                  (Submodule.subtype (skewAdjoint.submodule R A))))
              (LinearMap.inr R { x // x ∈ selfAdjoint A } { x // x ∈ skewAdjoint A }))
          x✝).snd =
    ↑(↑(LinearMap.comp LinearMap.id (LinearMap.inr R { x // x ∈ selfAdjoint A } { x // x ∈ skewAdjoint A })) x✝).snd
[PROOFSTEP]
simp
[GOAL]
R✝ : Type u_1
A✝ : Type u_2
inst✝¹³ : Semiring R✝
inst✝¹² : StarSemigroup R✝
inst✝¹¹ : TrivialStar R✝
inst✝¹⁰ : AddCommGroup A✝
inst✝⁹ : Module R✝ A✝
inst✝⁸ : StarAddMonoid A✝
inst✝⁷ : StarModule R✝ A✝
inst✝⁶ : Invertible 2
R : Type u_3
A : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : StarRing R
inst✝³ : Semiring A
inst✝² : StarSemigroup A
inst✝¹ : Algebra R A
inst✝ : StarModule R A
r : R
⊢ ↑(algebraMap R A) (star r) = star (↑(algebraMap R A) r)
[PROOFSTEP]
simp only [Algebra.algebraMap_eq_smul_one, star_smul, star_one]