41 using inner_add_left [of x "- x" y] by simp |
41 using inner_add_left [of x "- x" y] by simp |
42 |
42 |
43 lemma inner_diff_left: "inner (x - y) z = inner x z - inner y z" |
43 lemma inner_diff_left: "inner (x - y) z = inner x z - inner y z" |
44 by (simp add: diff_minus inner_add_left) |
44 by (simp add: diff_minus inner_add_left) |
45 |
45 |
|
46 lemma inner_setsum_left: "inner (\<Sum>x\<in>A. f x) y = (\<Sum>x\<in>A. inner (f x) y)" |
|
47 by (cases "finite A", induct set: finite, simp_all add: inner_add_left) |
|
48 |
46 text {* Transfer distributivity rules to right argument. *} |
49 text {* Transfer distributivity rules to right argument. *} |
47 |
50 |
48 lemma inner_add_right: "inner x (y + z) = inner x y + inner x z" |
51 lemma inner_add_right: "inner x (y + z) = inner x y + inner x z" |
49 using inner_add_left [of y z x] by (simp only: inner_commute) |
52 using inner_add_left [of y z x] by (simp only: inner_commute) |
50 |
53 |
57 lemma inner_minus_right [simp]: "inner x (- y) = - inner x y" |
60 lemma inner_minus_right [simp]: "inner x (- y) = - inner x y" |
58 using inner_minus_left [of y x] by (simp only: inner_commute) |
61 using inner_minus_left [of y x] by (simp only: inner_commute) |
59 |
62 |
60 lemma inner_diff_right: "inner x (y - z) = inner x y - inner x z" |
63 lemma inner_diff_right: "inner x (y - z) = inner x y - inner x z" |
61 using inner_diff_left [of y z x] by (simp only: inner_commute) |
64 using inner_diff_left [of y z x] by (simp only: inner_commute) |
|
65 |
|
66 lemma inner_setsum_right: "inner x (\<Sum>y\<in>A. f y) = (\<Sum>y\<in>A. inner x (f y))" |
|
67 using inner_setsum_left [of f A x] by (simp only: inner_commute) |
62 |
68 |
63 lemmas inner_add [algebra_simps] = inner_add_left inner_add_right |
69 lemmas inner_add [algebra_simps] = inner_add_left inner_add_right |
64 lemmas inner_diff [algebra_simps] = inner_diff_left inner_diff_right |
70 lemmas inner_diff [algebra_simps] = inner_diff_left inner_diff_right |
65 lemmas inner_scaleR = inner_scaleR_left inner_scaleR_right |
71 lemmas inner_scaleR = inner_scaleR_left inner_scaleR_right |
66 |
72 |
146 (@{const_name dist}, SOME @{typ "'a::metric_space \<Rightarrow> 'a \<Rightarrow> real"}) *} |
152 (@{const_name dist}, SOME @{typ "'a::metric_space \<Rightarrow> 'a \<Rightarrow> real"}) *} |
147 |
153 |
148 setup {* Sign.add_const_constraint |
154 setup {* Sign.add_const_constraint |
149 (@{const_name norm}, SOME @{typ "'a::real_normed_vector \<Rightarrow> real"}) *} |
155 (@{const_name norm}, SOME @{typ "'a::real_normed_vector \<Rightarrow> real"}) *} |
150 |
156 |
151 interpretation inner: |
157 lemma bounded_bilinear_inner: |
152 bounded_bilinear "inner::'a::real_inner \<Rightarrow> 'a \<Rightarrow> real" |
158 "bounded_bilinear (inner::'a::real_inner \<Rightarrow> 'a \<Rightarrow> real)" |
153 proof |
159 proof |
154 fix x y z :: 'a and r :: real |
160 fix x y z :: 'a and r :: real |
155 show "inner (x + y) z = inner x z + inner y z" |
161 show "inner (x + y) z = inner x z + inner y z" |
156 by (rule inner_add_left) |
162 by (rule inner_add_left) |
157 show "inner x (y + z) = inner x y + inner x z" |
163 show "inner x (y + z) = inner x y + inner x z" |
165 show "\<forall>x y::'a. norm (inner x y) \<le> norm x * norm y * 1" |
171 show "\<forall>x y::'a. norm (inner x y) \<le> norm x * norm y * 1" |
166 by (simp add: Cauchy_Schwarz_ineq2) |
172 by (simp add: Cauchy_Schwarz_ineq2) |
167 qed |
173 qed |
168 qed |
174 qed |
169 |
175 |
170 interpretation inner_left: |
176 lemmas tendsto_inner [tendsto_intros] = |
171 bounded_linear "\<lambda>x::'a::real_inner. inner x y" |
177 bounded_bilinear.tendsto [OF bounded_bilinear_inner] |
172 by (rule inner.bounded_linear_left) |
178 |
173 |
179 lemmas isCont_inner [simp] = |
174 interpretation inner_right: |
180 bounded_bilinear.isCont [OF bounded_bilinear_inner] |
175 bounded_linear "\<lambda>y::'a::real_inner. inner x y" |
181 |
176 by (rule inner.bounded_linear_right) |
182 lemmas FDERIV_inner = |
177 |
183 bounded_bilinear.FDERIV [OF bounded_bilinear_inner] |
178 declare inner.isCont [simp] |
184 |
|
185 lemmas bounded_linear_inner_left = |
|
186 bounded_bilinear.bounded_linear_left [OF bounded_bilinear_inner] |
|
187 |
|
188 lemmas bounded_linear_inner_right = |
|
189 bounded_bilinear.bounded_linear_right [OF bounded_bilinear_inner] |
179 |
190 |
180 |
191 |
181 subsection {* Class instances *} |
192 subsection {* Class instances *} |
182 |
193 |
183 instantiation real :: real_inner |
194 instantiation real :: real_inner |
258 |
269 |
259 lemma GDERIV_subst: "\<lbrakk>GDERIV f x :> df; df = d\<rbrakk> \<Longrightarrow> GDERIV f x :> d" |
270 lemma GDERIV_subst: "\<lbrakk>GDERIV f x :> df; df = d\<rbrakk> \<Longrightarrow> GDERIV f x :> d" |
260 by simp |
271 by simp |
261 |
272 |
262 lemma GDERIV_const: "GDERIV (\<lambda>x. k) x :> 0" |
273 lemma GDERIV_const: "GDERIV (\<lambda>x. k) x :> 0" |
263 unfolding gderiv_def inner_right.zero by (rule FDERIV_const) |
274 unfolding gderiv_def inner_zero_right by (rule FDERIV_const) |
264 |
275 |
265 lemma GDERIV_add: |
276 lemma GDERIV_add: |
266 "\<lbrakk>GDERIV f x :> df; GDERIV g x :> dg\<rbrakk> |
277 "\<lbrakk>GDERIV f x :> df; GDERIV g x :> dg\<rbrakk> |
267 \<Longrightarrow> GDERIV (\<lambda>x. f x + g x) x :> df + dg" |
278 \<Longrightarrow> GDERIV (\<lambda>x. f x + g x) x :> df + dg" |
268 unfolding gderiv_def inner_right.add by (rule FDERIV_add) |
279 unfolding gderiv_def inner_add_right by (rule FDERIV_add) |
269 |
280 |
270 lemma GDERIV_minus: |
281 lemma GDERIV_minus: |
271 "GDERIV f x :> df \<Longrightarrow> GDERIV (\<lambda>x. - f x) x :> - df" |
282 "GDERIV f x :> df \<Longrightarrow> GDERIV (\<lambda>x. - f x) x :> - df" |
272 unfolding gderiv_def inner_right.minus by (rule FDERIV_minus) |
283 unfolding gderiv_def inner_minus_right by (rule FDERIV_minus) |
273 |
284 |
274 lemma GDERIV_diff: |
285 lemma GDERIV_diff: |
275 "\<lbrakk>GDERIV f x :> df; GDERIV g x :> dg\<rbrakk> |
286 "\<lbrakk>GDERIV f x :> df; GDERIV g x :> dg\<rbrakk> |
276 \<Longrightarrow> GDERIV (\<lambda>x. f x - g x) x :> df - dg" |
287 \<Longrightarrow> GDERIV (\<lambda>x. f x - g x) x :> df - dg" |
277 unfolding gderiv_def inner_right.diff by (rule FDERIV_diff) |
288 unfolding gderiv_def inner_diff_right by (rule FDERIV_diff) |
278 |
289 |
279 lemma GDERIV_scaleR: |
290 lemma GDERIV_scaleR: |
280 "\<lbrakk>DERIV f x :> df; GDERIV g x :> dg\<rbrakk> |
291 "\<lbrakk>DERIV f x :> df; GDERIV g x :> dg\<rbrakk> |
281 \<Longrightarrow> GDERIV (\<lambda>x. scaleR (f x) (g x)) x |
292 \<Longrightarrow> GDERIV (\<lambda>x. scaleR (f x) (g x)) x |
282 :> (scaleR (f x) dg + scaleR df (g x))" |
293 :> (scaleR (f x) dg + scaleR df (g x))" |
283 unfolding gderiv_def deriv_fderiv inner_right.add inner_right.scaleR |
294 unfolding gderiv_def deriv_fderiv inner_add_right inner_scaleR_right |
284 apply (rule FDERIV_subst) |
295 apply (rule FDERIV_subst) |
285 apply (erule (1) scaleR.FDERIV) |
296 apply (erule (1) FDERIV_scaleR) |
286 apply (simp add: mult_ac) |
297 apply (simp add: mult_ac) |
287 done |
298 done |
288 |
299 |
289 lemma GDERIV_mult: |
300 lemma GDERIV_mult: |
290 "\<lbrakk>GDERIV f x :> df; GDERIV g x :> dg\<rbrakk> |
301 "\<lbrakk>GDERIV f x :> df; GDERIV g x :> dg\<rbrakk> |
304 |
315 |
305 lemma GDERIV_norm: |
316 lemma GDERIV_norm: |
306 assumes "x \<noteq> 0" shows "GDERIV (\<lambda>x. norm x) x :> sgn x" |
317 assumes "x \<noteq> 0" shows "GDERIV (\<lambda>x. norm x) x :> sgn x" |
307 proof - |
318 proof - |
308 have 1: "FDERIV (\<lambda>x. inner x x) x :> (\<lambda>h. inner x h + inner h x)" |
319 have 1: "FDERIV (\<lambda>x. inner x x) x :> (\<lambda>h. inner x h + inner h x)" |
309 by (intro inner.FDERIV FDERIV_ident) |
320 by (intro FDERIV_inner FDERIV_ident) |
310 have 2: "(\<lambda>h. inner x h + inner h x) = (\<lambda>h. inner h (scaleR 2 x))" |
321 have 2: "(\<lambda>h. inner x h + inner h x) = (\<lambda>h. inner h (scaleR 2 x))" |
311 by (simp add: fun_eq_iff inner_commute) |
322 by (simp add: fun_eq_iff inner_commute) |
312 have "0 < inner x x" using `x \<noteq> 0` by simp |
323 have "0 < inner x x" using `x \<noteq> 0` by simp |
313 then have 3: "DERIV sqrt (inner x x) :> (inverse (sqrt (inner x x)) / 2)" |
324 then have 3: "DERIV sqrt (inner x x) :> (inverse (sqrt (inner x x)) / 2)" |
314 by (rule DERIV_real_sqrt) |
325 by (rule DERIV_real_sqrt) |