Imports
/-
Copyright (c) 2025 Tomas Skrivan. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Tomas Skrivan
-/
module
public import Physlib.Mathematics.InnerProductSpace.Basic
public import Mathlib.Analysis.InnerProductSpace.AdjointAdjoint of a linear map
This module defines the adjoint of a linear map f : E → F where
E and F carry the instances of InnerProductSpace' over a field 𝕜.
This is a generalization of the usual adjoint defined on InnerProductSpace for
continuous linear maps.
@[expose] public sectionlocal notation "⟪" x ", " y "⟫" => inner 𝕜 x yAll goals completed! 🐙lemma HasAdjoint.adjoint_apply_zero {f : E → F} {f' : F → E}
(hf : HasAdjoint 𝕜 f f') : f' 0 = 0 := by 𝕜:Type u_1E:Type u_2F:Type u_3inst✝⁶:RCLike 𝕜inst✝⁵:NormedAddCommGroup Einst✝⁴:NormedSpace 𝕜 Einst✝³:InnerProductSpace' 𝕜 Einst✝²:NormedAddCommGroup Finst✝¹:NormedSpace 𝕜 Finst✝:InnerProductSpace' 𝕜 Ff:E → Ff':F → Ehf:HasAdjoint 𝕜 f f'⊢ f' 0 = 0
simpa using hf.adjoint_inner_left (f' 0) 0 All goals completed! 🐙lemma HasAdjoint.adjoint
{f : E → F} {f' : F → E}
(hf : HasAdjoint 𝕜 f f') : adjoint 𝕜 f = f' := by 𝕜:Type u_1E:Type u_2F:Type u_3inst✝⁶:RCLike 𝕜inst✝⁵:NormedAddCommGroup Einst✝⁴:NormedSpace 𝕜 Einst✝³:InnerProductSpace' 𝕜 Einst✝²:NormedAddCommGroup Finst✝¹:NormedSpace 𝕜 Finst✝:InnerProductSpace' 𝕜 Ff:E → Ff':F → Ehf:HasAdjoint 𝕜 f f'⊢ _root_.adjoint 𝕜 f = f'
funext y 𝕜:Type u_1E:Type u_2F:Type u_3inst✝⁶:RCLike 𝕜inst✝⁵:NormedAddCommGroup Einst✝⁴:NormedSpace 𝕜 Einst✝³:InnerProductSpace' 𝕜 Einst✝²:NormedAddCommGroup Finst✝¹:NormedSpace 𝕜 Finst✝:InnerProductSpace' 𝕜 Ff:E → Ff':F → Ehf:HasAdjoint 𝕜 f f'y:F⊢ _root_.adjoint 𝕜 f y = f' y
apply ext_inner_right' 𝕜 𝕜:Type u_1E:Type u_2F:Type u_3inst✝⁶:RCLike 𝕜inst✝⁵:NormedAddCommGroup Einst✝⁴:NormedSpace 𝕜 Einst✝³:InnerProductSpace' 𝕜 Einst✝²:NormedAddCommGroup Finst✝¹:NormedSpace 𝕜 Finst✝:InnerProductSpace' 𝕜 Ff:E → Ff':F → Ehf:HasAdjoint 𝕜 f f'y:F⊢ ∀ (v : E), ⟪_root_.adjoint 𝕜 f y, v⟫ = ⟪f' y, v⟫
unfold _root_.adjoint 𝕜:Type u_1E:Type u_2F:Type u_3inst✝⁶:RCLike 𝕜inst✝⁵:NormedAddCommGroup Einst✝⁴:NormedSpace 𝕜 Einst✝³:InnerProductSpace' 𝕜 Einst✝²:NormedAddCommGroup Finst✝¹:NormedSpace 𝕜 Finst✝:InnerProductSpace' 𝕜 Ff:E → Ff':F → Ehf:HasAdjoint 𝕜 f f'y:F⊢ ∀ (v : E), ⟪(if h : ∃ f', HasAdjoint 𝕜 f f' then Classical.choose h else 0) y, v⟫ = ⟪f' y, v⟫
have h : ∃ f', HasAdjoint 𝕜 f f' := ⟨f', hf⟩ 𝕜:Type u_1E:Type u_2F:Type u_3inst✝⁶:RCLike 𝕜inst✝⁵:NormedAddCommGroup Einst✝⁴:NormedSpace 𝕜 Einst✝³:InnerProductSpace' 𝕜 Einst✝²:NormedAddCommGroup Finst✝¹:NormedSpace 𝕜 Finst✝:InnerProductSpace' 𝕜 Ff:E → Ff':F → Ehf:HasAdjoint 𝕜 f f'y:Fh:∃ f', HasAdjoint 𝕜 f f'⊢ ∀ (v : E), ⟪(if h : ∃ f', HasAdjoint 𝕜 f f' then Classical.choose h else 0) y, v⟫ = ⟪f' y, v⟫
have := h.choose_spec.adjoint_inner_left 𝕜:Type u_1E:Type u_2F:Type u_3inst✝⁶:RCLike 𝕜inst✝⁵:NormedAddCommGroup Einst✝⁴:NormedSpace 𝕜 Einst✝³:InnerProductSpace' 𝕜 Einst✝²:NormedAddCommGroup Finst✝¹:NormedSpace 𝕜 Finst✝:InnerProductSpace' 𝕜 Ff:E → Ff':F → Ehf:HasAdjoint 𝕜 f f'y:Fh:∃ f', HasAdjoint 𝕜 f f'this:∀ (x : E) (y : F), ⟪h.choose y, x⟫ = ⟪y, f x⟫⊢ ∀ (v : E), ⟪(if h : ∃ f', HasAdjoint 𝕜 f f' then Classical.choose h else 0) y, v⟫ = ⟪f' y, v⟫
simp_all 𝕜:Type u_1E:Type u_2F:Type u_3inst✝⁶:RCLike 𝕜inst✝⁵:NormedAddCommGroup Einst✝⁴:NormedSpace 𝕜 Einst✝³:InnerProductSpace' 𝕜 Einst✝²:NormedAddCommGroup Finst✝¹:NormedSpace 𝕜 Finst✝:InnerProductSpace' 𝕜 Ff:E → Ff':F → Ehf:HasAdjoint 𝕜 f f'y:Fh:∃ f', HasAdjoint 𝕜 f f'this:∀ (x : E) (y : F), ⟪h.choose y, x⟫ = ⟪y, f x⟫⊢ ∀ (v : E), ⟪y, f v⟫ = ⟪f' y, v⟫
simp [hf.adjoint_inner_left] All goals completed! 🐙lemma HasAdjoint.congr_adj (f : E → F) (f' g')
(adjoint : HasAdjoint 𝕜 f g')
(eq : g' = f') : HasAdjoint 𝕜 f f' := by 𝕜:Type u_1E:Type u_2F:Type u_3inst✝⁶:RCLike 𝕜inst✝⁵:NormedAddCommGroup Einst✝⁴:NormedSpace 𝕜 Einst✝³:InnerProductSpace' 𝕜 Einst✝²:NormedAddCommGroup Finst✝¹:NormedSpace 𝕜 Finst✝:InnerProductSpace' 𝕜 Ff:E → Ff':F → Eg':F → Eadjoint:HasAdjoint 𝕜 f g'eq:g' = f'⊢ HasAdjoint 𝕜 f f' simp[← eq,adjoint] All goals completed! 🐙lemma hasAdjoint_id : HasAdjoint 𝕜 (fun x : E => x) (fun x => x) := by 𝕜:Type u_1E:Type u_2inst✝³:RCLike 𝕜inst✝²:NormedAddCommGroup Einst✝¹:NormedSpace 𝕜 Einst✝:InnerProductSpace' 𝕜 E⊢ HasAdjoint 𝕜 (fun x => x) fun x => x
constructor 𝕜:Type u_1E:Type u_2inst✝³:RCLike 𝕜inst✝²:NormedAddCommGroup Einst✝¹:NormedSpace 𝕜 Einst✝:InnerProductSpace' 𝕜 E⊢ ∀ (x y : E), ⟪y, x⟫ = ⟪y, x⟫; intros 𝕜:Type u_1E:Type u_2inst✝³:RCLike 𝕜inst✝²:NormedAddCommGroup Einst✝¹:NormedSpace 𝕜 Einst✝:InnerProductSpace' 𝕜 Ex✝:Ey✝:E⊢ ⟪y✝, x✝⟫ = ⟪y✝, x✝⟫; rfl All goals completed! 🐙lemma hasAdjoint_zero : HasAdjoint 𝕜 (fun _ : E => (0 : F)) (fun _ => 0) := by 𝕜:Type u_1E:Type u_2F:Type u_3inst✝⁶:RCLike 𝕜inst✝⁵:NormedAddCommGroup Einst✝⁴:NormedSpace 𝕜 Einst✝³:InnerProductSpace' 𝕜 Einst✝²:NormedAddCommGroup Finst✝¹:NormedSpace 𝕜 Finst✝:InnerProductSpace' 𝕜 F⊢ HasAdjoint 𝕜 (fun x => 0) fun x => 0
constructor 𝕜:Type u_1E:Type u_2F:Type u_3inst✝⁶:RCLike 𝕜inst✝⁵:NormedAddCommGroup Einst✝⁴:NormedSpace 𝕜 Einst✝³:InnerProductSpace' 𝕜 Einst✝²:NormedAddCommGroup Finst✝¹:NormedSpace 𝕜 Finst✝:InnerProductSpace' 𝕜 F⊢ ∀ (x : E) (y : F), ⟪0, x⟫ = ⟪y, 0⟫; intros 𝕜:Type u_1E:Type u_2F:Type u_3inst✝⁶:RCLike 𝕜inst✝⁵:NormedAddCommGroup Einst✝⁴:NormedSpace 𝕜 Einst✝³:InnerProductSpace' 𝕜 Einst✝²:NormedAddCommGroup Finst✝¹:NormedSpace 𝕜 Finst✝:InnerProductSpace' 𝕜 Fx✝:Ey✝:F⊢ ⟪0, x✝⟫ = ⟪y✝, 0⟫; simp All goals completed! 🐙lemma HasAdjoint.comp {f : F → G} {g : E → F} {f' g'}
(hf : HasAdjoint 𝕜 f f') (hg : HasAdjoint 𝕜 g g') :
HasAdjoint 𝕜 (fun x : E => f (g x)) (fun x => g' (f' x)) := by 𝕜:Type u_1E:Type u_2F:Type u_3G:Type u_4inst✝⁹:RCLike 𝕜inst✝⁸:NormedAddCommGroup Einst✝⁷:NormedSpace 𝕜 Einst✝⁶:InnerProductSpace' 𝕜 Einst✝⁵:NormedAddCommGroup Finst✝⁴:NormedSpace 𝕜 Finst✝³:InnerProductSpace' 𝕜 Finst✝²:NormedAddCommGroup Ginst✝¹:NormedSpace 𝕜 Ginst✝:InnerProductSpace' 𝕜 Gf:F → Gg:E → Ff':G → Fg':F → Ehf:HasAdjoint 𝕜 f f'hg:HasAdjoint 𝕜 g g'⊢ HasAdjoint 𝕜 (fun x => f (g x)) fun x => g' (f' x)
constructor 𝕜:Type u_1E:Type u_2F:Type u_3G:Type u_4inst✝⁹:RCLike 𝕜inst✝⁸:NormedAddCommGroup Einst✝⁷:NormedSpace 𝕜 Einst✝⁶:InnerProductSpace' 𝕜 Einst✝⁵:NormedAddCommGroup Finst✝⁴:NormedSpace 𝕜 Finst✝³:InnerProductSpace' 𝕜 Finst✝²:NormedAddCommGroup Ginst✝¹:NormedSpace 𝕜 Ginst✝:InnerProductSpace' 𝕜 Gf:F → Gg:E → Ff':G → Fg':F → Ehf:HasAdjoint 𝕜 f f'hg:HasAdjoint 𝕜 g g'⊢ ∀ (x : E) (y : G), ⟪g' (f' y), x⟫ = ⟪y, f (g x)⟫; intros 𝕜:Type u_1E:Type u_2F:Type u_3G:Type u_4inst✝⁹:RCLike 𝕜inst✝⁸:NormedAddCommGroup Einst✝⁷:NormedSpace 𝕜 Einst✝⁶:InnerProductSpace' 𝕜 Einst✝⁵:NormedAddCommGroup Finst✝⁴:NormedSpace 𝕜 Finst✝³:InnerProductSpace' 𝕜 Finst✝²:NormedAddCommGroup Ginst✝¹:NormedSpace 𝕜 Ginst✝:InnerProductSpace' 𝕜 Gf:F → Gg:E → Ff':G → Fg':F → Ehf:HasAdjoint 𝕜 f f'hg:HasAdjoint 𝕜 g g'x✝:Ey✝:G⊢ ⟪g' (f' y✝), x✝⟫ = ⟪y✝, f (g x✝)⟫; simp[hf.adjoint_inner_left, hg.adjoint_inner_left] All goals completed! 🐙set_option backward.isDefEq.respectTransparency false in
lemma HasAdjoint.prodMk {f : E → F} {g : E → G} {f' g'}
(hf : HasAdjoint 𝕜 f f') (hg : HasAdjoint 𝕜 g g') :
HasAdjoint 𝕜 (fun x : E => (f x, g x)) (fun yz => f' yz.1 + g' yz.2) := by 𝕜:Type u_1E:Type u_2F:Type u_3G:Type u_4inst✝⁹:RCLike 𝕜inst✝⁸:NormedAddCommGroup Einst✝⁷:NormedSpace 𝕜 Einst✝⁶:InnerProductSpace' 𝕜 Einst✝⁵:NormedAddCommGroup Finst✝⁴:NormedSpace 𝕜 Finst✝³:InnerProductSpace' 𝕜 Finst✝²:NormedAddCommGroup Ginst✝¹:NormedSpace 𝕜 Ginst✝:InnerProductSpace' 𝕜 Gf:E → Fg:E → Gf':F → Eg':G → Ehf:HasAdjoint 𝕜 f f'hg:HasAdjoint 𝕜 g g'⊢ HasAdjoint 𝕜 (fun x => (f x, g x)) fun yz => f' yz.1 + g' yz.2
constructor 𝕜:Type u_1E:Type u_2F:Type u_3G:Type u_4inst✝⁹:RCLike 𝕜inst✝⁸:NormedAddCommGroup Einst✝⁷:NormedSpace 𝕜 Einst✝⁶:InnerProductSpace' 𝕜 Einst✝⁵:NormedAddCommGroup Finst✝⁴:NormedSpace 𝕜 Finst✝³:InnerProductSpace' 𝕜 Finst✝²:NormedAddCommGroup Ginst✝¹:NormedSpace 𝕜 Ginst✝:InnerProductSpace' 𝕜 Gf:E → Fg:E → Gf':F → Eg':G → Ehf:HasAdjoint 𝕜 f f'hg:HasAdjoint 𝕜 g g'⊢ ∀ (x : E) (y : F × G), ⟪f' y.1 + g' y.2, x⟫ = ⟪y, (f x, g x)⟫; intros 𝕜:Type u_1E:Type u_2F:Type u_3G:Type u_4inst✝⁹:RCLike 𝕜inst✝⁸:NormedAddCommGroup Einst✝⁷:NormedSpace 𝕜 Einst✝⁶:InnerProductSpace' 𝕜 Einst✝⁵:NormedAddCommGroup Finst✝⁴:NormedSpace 𝕜 Finst✝³:InnerProductSpace' 𝕜 Finst✝²:NormedAddCommGroup Ginst✝¹:NormedSpace 𝕜 Ginst✝:InnerProductSpace' 𝕜 Gf:E → Fg:E → Gf':F → Eg':G → Ehf:HasAdjoint 𝕜 f f'hg:HasAdjoint 𝕜 g g'x✝:Ey✝:F × G⊢ ⟪f' y✝.1 + g' y✝.2, x✝⟫ = ⟪y✝, (f x✝, g x✝)⟫
simp [inner_add_left',
hf.adjoint_inner_left, hg.adjoint_inner_left] All goals completed! 🐙set_option backward.isDefEq.respectTransparency false in
lemma HasAdjoint.fst {f : E → F×G} {f'} (hf : HasAdjoint 𝕜 f f') :
HasAdjoint 𝕜 (fun x : E => (f x).1) (fun y => f' (y, 0)) := by 𝕜:Type u_1E:Type u_2F:Type u_3G:Type u_4inst✝⁹:RCLike 𝕜inst✝⁸:NormedAddCommGroup Einst✝⁷:NormedSpace 𝕜 Einst✝⁶:InnerProductSpace' 𝕜 Einst✝⁵:NormedAddCommGroup Finst✝⁴:NormedSpace 𝕜 Finst✝³:InnerProductSpace' 𝕜 Finst✝²:NormedAddCommGroup Ginst✝¹:NormedSpace 𝕜 Ginst✝:InnerProductSpace' 𝕜 Gf:E → F × Gf':F × G → Ehf:HasAdjoint 𝕜 f f'⊢ HasAdjoint 𝕜 (fun x => (f x).1) fun y => f' (y, 0)
constructor 𝕜:Type u_1E:Type u_2F:Type u_3G:Type u_4inst✝⁹:RCLike 𝕜inst✝⁸:NormedAddCommGroup Einst✝⁷:NormedSpace 𝕜 Einst✝⁶:InnerProductSpace' 𝕜 Einst✝⁵:NormedAddCommGroup Finst✝⁴:NormedSpace 𝕜 Finst✝³:InnerProductSpace' 𝕜 Finst✝²:NormedAddCommGroup Ginst✝¹:NormedSpace 𝕜 Ginst✝:InnerProductSpace' 𝕜 Gf:E → F × Gf':F × G → Ehf:HasAdjoint 𝕜 f f'⊢ ∀ (x : E) (y : F), ⟪f' (y, 0), x⟫ = ⟪y, (f x).1⟫; intros 𝕜:Type u_1E:Type u_2F:Type u_3G:Type u_4inst✝⁹:RCLike 𝕜inst✝⁸:NormedAddCommGroup Einst✝⁷:NormedSpace 𝕜 Einst✝⁶:InnerProductSpace' 𝕜 Einst✝⁵:NormedAddCommGroup Finst✝⁴:NormedSpace 𝕜 Finst✝³:InnerProductSpace' 𝕜 Finst✝²:NormedAddCommGroup Ginst✝¹:NormedSpace 𝕜 Ginst✝:InnerProductSpace' 𝕜 Gf:E → F × Gf':F × G → Ehf:HasAdjoint 𝕜 f f'x✝:Ey✝:F⊢ ⟪f' (y✝, 0), x✝⟫ = ⟪y✝, (f x✝).1⟫
simp[hf.adjoint_inner_left] All goals completed! 🐙set_option backward.isDefEq.respectTransparency false in
lemma HasAdjoint.snd {f : E → F×G} {f'} (hf : HasAdjoint 𝕜 f f') :
HasAdjoint 𝕜 (fun x : E => (f x).2) (fun z => f' (0, z)) := by 𝕜:Type u_1E:Type u_2F:Type u_3G:Type u_4inst✝⁹:RCLike 𝕜inst✝⁸:NormedAddCommGroup Einst✝⁷:NormedSpace 𝕜 Einst✝⁶:InnerProductSpace' 𝕜 Einst✝⁵:NormedAddCommGroup Finst✝⁴:NormedSpace 𝕜 Finst✝³:InnerProductSpace' 𝕜 Finst✝²:NormedAddCommGroup Ginst✝¹:NormedSpace 𝕜 Ginst✝:InnerProductSpace' 𝕜 Gf:E → F × Gf':F × G → Ehf:HasAdjoint 𝕜 f f'⊢ HasAdjoint 𝕜 (fun x => (f x).2) fun z => f' (0, z)
constructor 𝕜:Type u_1E:Type u_2F:Type u_3G:Type u_4inst✝⁹:RCLike 𝕜inst✝⁸:NormedAddCommGroup Einst✝⁷:NormedSpace 𝕜 Einst✝⁶:InnerProductSpace' 𝕜 Einst✝⁵:NormedAddCommGroup Finst✝⁴:NormedSpace 𝕜 Finst✝³:InnerProductSpace' 𝕜 Finst✝²:NormedAddCommGroup Ginst✝¹:NormedSpace 𝕜 Ginst✝:InnerProductSpace' 𝕜 Gf:E → F × Gf':F × G → Ehf:HasAdjoint 𝕜 f f'⊢ ∀ (x : E) (y : G), ⟪f' (0, y), x⟫ = ⟪y, (f x).2⟫; intros 𝕜:Type u_1E:Type u_2F:Type u_3G:Type u_4inst✝⁹:RCLike 𝕜inst✝⁸:NormedAddCommGroup Einst✝⁷:NormedSpace 𝕜 Einst✝⁶:InnerProductSpace' 𝕜 Einst✝⁵:NormedAddCommGroup Finst✝⁴:NormedSpace 𝕜 Finst✝³:InnerProductSpace' 𝕜 Finst✝²:NormedAddCommGroup Ginst✝¹:NormedSpace 𝕜 Ginst✝:InnerProductSpace' 𝕜 Gf:E → F × Gf':F × G → Ehf:HasAdjoint 𝕜 f f'x✝:Ey✝:G⊢ ⟪f' (0, y✝), x✝⟫ = ⟪y✝, (f x✝).2⟫
simp[hf.adjoint_inner_left] All goals completed! 🐙lemma HasAdjoint.neg {f : E → F} {f'} (hf : HasAdjoint 𝕜 f f') :
HasAdjoint 𝕜 (fun x : E => -f x) (fun y => -f' y) := by 𝕜:Type u_1E:Type u_2F:Type u_3inst✝⁶:RCLike 𝕜inst✝⁵:NormedAddCommGroup Einst✝⁴:NormedSpace 𝕜 Einst✝³:InnerProductSpace' 𝕜 Einst✝²:NormedAddCommGroup Finst✝¹:NormedSpace 𝕜 Finst✝:InnerProductSpace' 𝕜 Ff:E → Ff':F → Ehf:HasAdjoint 𝕜 f f'⊢ HasAdjoint 𝕜 (fun x => -f x) fun y => -f' y
constructor 𝕜:Type u_1E:Type u_2F:Type u_3inst✝⁶:RCLike 𝕜inst✝⁵:NormedAddCommGroup Einst✝⁴:NormedSpace 𝕜 Einst✝³:InnerProductSpace' 𝕜 Einst✝²:NormedAddCommGroup Finst✝¹:NormedSpace 𝕜 Finst✝:InnerProductSpace' 𝕜 Ff:E → Ff':F → Ehf:HasAdjoint 𝕜 f f'⊢ ∀ (x : E) (y : F), ⟪-f' y, x⟫ = ⟪y, -f x⟫; intros 𝕜:Type u_1E:Type u_2F:Type u_3inst✝⁶:RCLike 𝕜inst✝⁵:NormedAddCommGroup Einst✝⁴:NormedSpace 𝕜 Einst✝³:InnerProductSpace' 𝕜 Einst✝²:NormedAddCommGroup Finst✝¹:NormedSpace 𝕜 Finst✝:InnerProductSpace' 𝕜 Ff:E → Ff':F → Ehf:HasAdjoint 𝕜 f f'x✝:Ey✝:F⊢ ⟪-f' y✝, x✝⟫ = ⟪y✝, -f x✝⟫
simp[hf.adjoint_inner_left] All goals completed! 🐙lemma HasAdjoint.add {f g : E → F} {f' g'}
(hf : HasAdjoint 𝕜 f f') (hg : HasAdjoint 𝕜 g g') :
HasAdjoint 𝕜 (fun x : E => f x + g x) (fun y => f' y + g' y) := by 𝕜:Type u_1E:Type u_2F:Type u_3inst✝⁶:RCLike 𝕜inst✝⁵:NormedAddCommGroup Einst✝⁴:NormedSpace 𝕜 Einst✝³:InnerProductSpace' 𝕜 Einst✝²:NormedAddCommGroup Finst✝¹:NormedSpace 𝕜 Finst✝:InnerProductSpace' 𝕜 Ff:E → Fg:E → Ff':F → Eg':F → Ehf:HasAdjoint 𝕜 f f'hg:HasAdjoint 𝕜 g g'⊢ HasAdjoint 𝕜 (fun x => f x + g x) fun y => f' y + g' y
constructor 𝕜:Type u_1E:Type u_2F:Type u_3inst✝⁶:RCLike 𝕜inst✝⁵:NormedAddCommGroup Einst✝⁴:NormedSpace 𝕜 Einst✝³:InnerProductSpace' 𝕜 Einst✝²:NormedAddCommGroup Finst✝¹:NormedSpace 𝕜 Finst✝:InnerProductSpace' 𝕜 Ff:E → Fg:E → Ff':F → Eg':F → Ehf:HasAdjoint 𝕜 f f'hg:HasAdjoint 𝕜 g g'⊢ ∀ (x : E) (y : F), ⟪f' y + g' y, x⟫ = ⟪y, f x + g x⟫; intros 𝕜:Type u_1E:Type u_2F:Type u_3inst✝⁶:RCLike 𝕜inst✝⁵:NormedAddCommGroup Einst✝⁴:NormedSpace 𝕜 Einst✝³:InnerProductSpace' 𝕜 Einst✝²:NormedAddCommGroup Finst✝¹:NormedSpace 𝕜 Finst✝:InnerProductSpace' 𝕜 Ff:E → Fg:E → Ff':F → Eg':F → Ehf:HasAdjoint 𝕜 f f'hg:HasAdjoint 𝕜 g g'x✝:Ey✝:F⊢ ⟪f' y✝ + g' y✝, x✝⟫ = ⟪y✝, f x✝ + g x✝⟫
simp[inner_add_left', inner_add_right',
hf.adjoint_inner_left, hg.adjoint_inner_left] All goals completed! 🐙lemma HasAdjoint.sub {f g : E → F} {f' g'}
(hf : HasAdjoint 𝕜 f f') (hg : HasAdjoint 𝕜 g g') :
HasAdjoint 𝕜 (fun x : E => f x - g x) (fun y => f' y - g' y) := by 𝕜:Type u_1E:Type u_2F:Type u_3inst✝⁶:RCLike 𝕜inst✝⁵:NormedAddCommGroup Einst✝⁴:NormedSpace 𝕜 Einst✝³:InnerProductSpace' 𝕜 Einst✝²:NormedAddCommGroup Finst✝¹:NormedSpace 𝕜 Finst✝:InnerProductSpace' 𝕜 Ff:E → Fg:E → Ff':F → Eg':F → Ehf:HasAdjoint 𝕜 f f'hg:HasAdjoint 𝕜 g g'⊢ HasAdjoint 𝕜 (fun x => f x - g x) fun y => f' y - g' y
constructor 𝕜:Type u_1E:Type u_2F:Type u_3inst✝⁶:RCLike 𝕜inst✝⁵:NormedAddCommGroup Einst✝⁴:NormedSpace 𝕜 Einst✝³:InnerProductSpace' 𝕜 Einst✝²:NormedAddCommGroup Finst✝¹:NormedSpace 𝕜 Finst✝:InnerProductSpace' 𝕜 Ff:E → Fg:E → Ff':F → Eg':F → Ehf:HasAdjoint 𝕜 f f'hg:HasAdjoint 𝕜 g g'⊢ ∀ (x : E) (y : F), ⟪f' y - g' y, x⟫ = ⟪y, f x - g x⟫; intros 𝕜:Type u_1E:Type u_2F:Type u_3inst✝⁶:RCLike 𝕜inst✝⁵:NormedAddCommGroup Einst✝⁴:NormedSpace 𝕜 Einst✝³:InnerProductSpace' 𝕜 Einst✝²:NormedAddCommGroup Finst✝¹:NormedSpace 𝕜 Finst✝:InnerProductSpace' 𝕜 Ff:E → Fg:E → Ff':F → Eg':F → Ehf:HasAdjoint 𝕜 f f'hg:HasAdjoint 𝕜 g g'x✝:Ey✝:F⊢ ⟪f' y✝ - g' y✝, x✝⟫ = ⟪y✝, f x✝ - g x✝⟫
simp[sub_eq_add_neg, inner_add_left', inner_add_right',
hf.adjoint_inner_left, hg.adjoint_inner_left] All goals completed! 🐙