1 (* Title: HOL/Real/HahnBanach/HahnBanach_h0_lemmas.thy |
1 (* Title: HOL/Real/HahnBanach/HahnBanach_h0_lemmas.thy |
2 ID: $Id$ |
2 ID: $Id$ |
3 Author: Gertrud Bauer, TU Munich |
3 Author: Gertrud Bauer, TU Munich |
4 *) |
4 *) |
5 |
5 |
|
6 header {* Lemmas about the extension of a non-maximal function *}; |
|
7 |
6 theory HahnBanach_h0_lemmas = FunctionNorm:; |
8 theory HahnBanach_h0_lemmas = FunctionNorm:; |
7 |
9 |
8 |
10 lemma ex_xi: |
9 lemma ex_xi: "[| is_vectorspace F; (!! u v. [| u:F; v:F |] ==> a u <= b v )|] |
11 "[| is_vectorspace F; (!! u v. [| u:F; v:F |] ==> a u <= b v )|] |
10 ==> EX xi::real. (ALL y:F. (a::'a => real) y <= xi) & (ALL y:F. xi <= b y)"; |
12 ==> EX xi::real. (ALL y:F. (a::'a => real) y <= xi) |
|
13 & (ALL y:F. xi <= b y)"; |
11 proof -; |
14 proof -; |
12 assume vs: "is_vectorspace F"; |
15 assume vs: "is_vectorspace F"; |
13 assume r: "(!! u v. [| u:F; v:F |] ==> a u <= (b v::real))"; |
16 assume r: "(!! u v. [| u:F; v:F |] ==> a u <= (b v::real))"; |
14 have "EX t. isLub UNIV {s::real . EX u:F. s = a u} t"; |
17 have "EX t. isLub UNIV {s::real . EX u:F. s = a u} t"; |
15 proof (rule reals_complete); |
18 proof (rule reals_complete); |
72 qed; |
75 qed; |
73 qed; |
76 qed; |
74 qed; |
77 qed; |
75 qed; |
78 qed; |
76 |
79 |
77 |
|
78 lemma h0_lf: |
80 lemma h0_lf: |
79 "[| h0 = (%x. let (y, a) = @ (y, a). (x = y [+] a [*] x0 & y:H) in (h y) + a * xi); |
81 "[| h0 = (%x. let (y, a) = @ (y, a). (x = y [+] a [*] x0 & y:H) |
80 H0 = vectorspace_sum H (lin x0); is_subspace H E; is_linearform H h; x0 ~: H; |
82 in (h y) + a * xi); |
81 x0 : E; x0 ~= <0>; is_vectorspace E |] |
83 H0 = vectorspace_sum H (lin x0); is_subspace H E; is_linearform H h; |
82 ==> is_linearform H0 h0"; |
84 x0 ~: H; x0 : E; x0 ~= <0>; is_vectorspace E |] |
|
85 ==> is_linearform H0 h0"; |
83 proof -; |
86 proof -; |
84 assume h0_def: "h0 = (%x. let (y, a) = @ (y, a). (x = y [+] a [*] x0 & y:H) in (h y) + a * xi)" |
87 assume h0_def: |
85 and H0_def: "H0 = vectorspace_sum H (lin x0)" |
88 "h0 = (%x. let (y, a) = @ (y, a). (x = y [+] a [*] x0 & y:H) |
86 and vs: "is_subspace H E" "is_linearform H h" "x0 ~: H" "x0 ~= <0>" "x0 : E" |
89 in (h y) + a * xi)" |
87 "is_vectorspace E"; |
90 and H0_def: "H0 = vectorspace_sum H (lin x0)" |
|
91 and vs: "is_subspace H E" "is_linearform H h" "x0 ~: H" "x0 ~= <0>" |
|
92 "x0 : E" "is_vectorspace E"; |
88 |
93 |
89 have h0: "is_vectorspace H0"; |
94 have h0: "is_vectorspace H0"; |
90 proof (simp only: H0_def, rule vs_sum_vs); |
95 proof (simp only: H0_def, rule vs_sum_vs); |
91 show "is_subspace (lin x0) E"; by (rule lin_subspace); |
96 show "is_subspace (lin x0) E"; by (rule lin_subspace); |
92 qed; |
97 qed; |
99 |
104 |
100 from x1; have ex_x1: "? y1 a1. (x1 = y1 [+] a1 [*] x0 & y1 : H)"; |
105 from x1; have ex_x1: "? y1 a1. (x1 = y1 [+] a1 [*] x0 & y1 : H)"; |
101 by (simp add: H0_def vectorspace_sum_def lin_def) blast; |
106 by (simp add: H0_def vectorspace_sum_def lin_def) blast; |
102 from x2; have ex_x2: "? y2 a2. (x2 = y2 [+] a2 [*] x0 & y2 : H)"; |
107 from x2; have ex_x2: "? y2 a2. (x2 = y2 [+] a2 [*] x0 & y2 : H)"; |
103 by (simp add: H0_def vectorspace_sum_def lin_def) blast; |
108 by (simp add: H0_def vectorspace_sum_def lin_def) blast; |
104 from x1x2; have ex_x1x2: "? y a. (x1 [+] x2 = y [+] a [*] x0 & y : H)"; |
109 from x1x2; have ex_x1x2: "? y a. (x1 [+] x2 = y [+] a [*] x0 & y : H)"; |
105 by (simp add: H0_def vectorspace_sum_def lin_def) force; |
110 by (simp add: H0_def vectorspace_sum_def lin_def) force; |
106 from ex_x1 ex_x2 ex_x1x2; |
111 from ex_x1 ex_x2 ex_x1x2; |
107 show "h0 (x1 [+] x2) = h0 x1 + h0 x2"; |
112 show "h0 (x1 [+] x2) = h0 x1 + h0 x2"; |
108 proof (elim exE conjE); |
113 proof (elim exE conjE); |
109 fix y1 y2 y a1 a2 a; |
114 fix y1 y2 y a1 a2 a; |
114 have ya: "y1 [+] y2 = y & a1 + a2 = a"; |
119 have ya: "y1 [+] y2 = y & a1 + a2 = a"; |
115 proof (rule decomp4); |
120 proof (rule decomp4); |
116 show "y1 [+] y2 [+] (a1 + a2) [*] x0 = y [+] a [*] x0"; |
121 show "y1 [+] y2 [+] (a1 + a2) [*] x0 = y [+] a [*] x0"; |
117 proof -; |
122 proof -; |
118 have "y [+] a [*] x0 = x1 [+] x2"; by (rule sym); |
123 have "y [+] a [*] x0 = x1 [+] x2"; by (rule sym); |
119 also; from y1 y2; have "... = y1 [+] a1 [*] x0 [+] (y2 [+] a2 [*] x0)"; by simp; |
124 also; from y1 y2; |
120 also; from vs y1' y2'; have "... = y1 [+] y2 [+] (a1 [*] x0 [+] a2 [*] x0)"; by simp; |
125 have "... = y1 [+] a1 [*] x0 [+] (y2 [+] a2 [*] x0)"; by simp; |
121 also; from vs y1' y2'; have "... = y1 [+] y2 [+] (a1 + a2) [*] x0"; |
126 also; from vs y1' y2'; |
|
127 have "... = y1 [+] y2 [+] (a1 [*] x0 [+] a2 [*] x0)"; by simp; |
|
128 also; from vs y1' y2'; |
|
129 have "... = y1 [+] y2 [+] (a1 + a2) [*] x0"; |
122 by (simp add: vs_add_mult_distrib2[of E]); |
130 by (simp add: vs_add_mult_distrib2[of E]); |
123 finally; show ?thesis; by (rule sym); |
131 finally; show ?thesis; by (rule sym); |
124 qed; |
132 qed; |
125 show "y1 [+] y2 : H"; ..; |
133 show "y1 [+] y2 : H"; ..; |
126 qed; |
134 qed; |
143 |
151 |
144 have ax1: "c [*] x1 : H0"; |
152 have ax1: "c [*] x1 : H0"; |
145 by (rule vs_mult_closed, rule h0); |
153 by (rule vs_mult_closed, rule h0); |
146 from x1; have ex_x1: "? y1 a1. (x1 = y1 [+] a1 [*] x0 & y1 : H)"; |
154 from x1; have ex_x1: "? y1 a1. (x1 = y1 [+] a1 [*] x0 & y1 : H)"; |
147 by (simp add: H0_def vectorspace_sum_def lin_def, fast); |
155 by (simp add: H0_def vectorspace_sum_def lin_def, fast); |
148 from x1; have ex_x: "!! x. x: H0 ==> ? y a. (x = y [+] a [*] x0 & y : H)"; |
156 from x1; |
|
157 have ex_x: "!! x. x: H0 ==> ? y a. (x = y [+] a [*] x0 & y : H)"; |
149 by (simp add: H0_def vectorspace_sum_def lin_def, fast); |
158 by (simp add: H0_def vectorspace_sum_def lin_def, fast); |
150 note ex_ax1 = ex_x [of "c [*] x1", OF ax1]; |
159 note ex_ax1 = ex_x [of "c [*] x1", OF ax1]; |
151 from ex_x1 ex_ax1; show "h0 (c [*] x1) = c * (h0 x1)"; |
160 from ex_x1 ex_ax1; show "h0 (c [*] x1) = c * (h0 x1)"; |
152 proof (elim exE conjE); |
161 proof (elim exE conjE); |
153 fix y1 y a1 a; |
162 fix y1 y a1 a; |
160 proof -; |
169 proof -; |
161 have "y [+] a [*] x0 = c [*] x1"; by (rule sym); |
170 have "y [+] a [*] x0 = c [*] x1"; by (rule sym); |
162 also; from y1; have "... = c [*] (y1 [+] a1 [*] x0)"; by simp; |
171 also; from y1; have "... = c [*] (y1 [+] a1 [*] x0)"; by simp; |
163 also; from vs y1'; have "... = c [*] y1 [+] c [*] (a1 [*] x0)"; |
172 also; from vs y1'; have "... = c [*] y1 [+] c [*] (a1 [*] x0)"; |
164 by (simp add: vs_add_mult_distrib1); |
173 by (simp add: vs_add_mult_distrib1); |
165 also; from vs y1'; have "... = c [*] y1 [+] (c * a1) [*] x0"; by simp; |
174 also; from vs y1'; have "... = c [*] y1 [+] (c * a1) [*] x0"; |
|
175 by simp; |
166 finally; show ?thesis; by (rule sym); |
176 finally; show ?thesis; by (rule sym); |
167 qed; |
177 qed; |
168 show "c [*] y1: H"; ..; |
178 show "c [*] y1: H"; ..; |
169 qed; |
179 qed; |
170 have y: "c [*] y1 = y"; by (rule conjunct1 [OF ya]); |
180 have y: "c [*] y1 = y"; by (rule conjunct1 [OF ya]); |
182 finally; show ?thesis; .; |
192 finally; show ?thesis; .; |
183 qed; |
193 qed; |
184 qed; |
194 qed; |
185 qed; |
195 qed; |
186 |
196 |
187 |
|
188 theorem real_linear_split: |
|
189 "[| x < a ==> Q; x = a ==> Q; a < (x::real) ==> Q |] ==> Q"; |
|
190 by (rule real_linear [of x a, elimify], elim disjE, force+); |
|
191 |
|
192 theorem linorder_linear_split: |
|
193 "[| x < a ==> Q; x = a ==> Q; a < (x::'a::linorder) ==> Q |] ==> Q"; |
|
194 by (rule linorder_less_linear [of x a, elimify], elim disjE, force+); |
|
195 |
|
196 |
|
197 lemma h0_norm_pres: |
197 lemma h0_norm_pres: |
198 "[| h0 = (%x. let (y, a) = @ (y, a). (x = y [+] a [*] x0 & y:H) in (h y) + a * xi); |
198 "[| h0 = (%x. let (y, a) = @ (y, a). (x = y [+] a [*] x0 & y:H) |
199 H0 = vectorspace_sum H (lin x0); x0 ~: H; x0 : E; x0 ~= <0>; is_vectorspace E; |
199 in (h y) + a * xi); |
200 is_subspace H E; is_quasinorm E p; is_linearform H h; ALL y:H. h y <= p y; |
200 H0 = vectorspace_sum H (lin x0); x0 ~: H; x0 : E; x0 ~= <0>; |
201 (ALL y:H. - p (y [+] x0) - h y <= xi) & (ALL y:H. xi <= p (y [+] x0) - h y)|] |
201 is_vectorspace E; is_subspace H E; is_quasinorm E p; is_linearform H h; |
|
202 ALL y:H. h y <= p y; |
|
203 (ALL y:H. - p (y [+] x0) - h y <= xi) |
|
204 & (ALL y:H. xi <= p (y [+] x0) - h y)|] |
202 ==> ALL x:H0. h0 x <= p x"; |
205 ==> ALL x:H0. h0 x <= p x"; |
203 proof; |
206 proof; |
204 assume h0_def: "h0 = (%x. let (y, a) = @ (y, a). (x = y [+] a [*] x0 & y:H) in (h y) + a * xi)" |
207 assume h0_def: |
205 and H0_def: "H0 = vectorspace_sum H (lin x0)" |
208 "h0 = (%x. let (y, a) = @ (y, a). (x = y [+] a [*] x0 & y:H) |
206 and vs: "x0 ~: H" "x0 : E" "x0 ~= <0>" "is_vectorspace E" |
209 in (h y) + a * xi)" |
207 "is_subspace H E" "is_quasinorm E p" "is_linearform H h" |
210 and H0_def: "H0 = vectorspace_sum H (lin x0)" |
208 and a: " ALL y:H. h y <= p y"; |
211 and vs: "x0 ~: H" "x0 : E" "x0 ~= <0>" "is_vectorspace E" |
|
212 "is_subspace H E" "is_quasinorm E p" "is_linearform H h" |
|
213 and a: " ALL y:H. h y <= p y"; |
209 presume a1: "(ALL y:H. - p (y [+] x0) - h y <= xi)"; |
214 presume a1: "(ALL y:H. - p (y [+] x0) - h y <= xi)"; |
210 presume a2: "(ALL y:H. xi <= p (y [+] x0) - h y)"; |
215 presume a2: "(ALL y:H. xi <= p (y [+] x0) - h y)"; |
211 fix x; assume "x : H0"; |
216 fix x; assume "x : H0"; |
212 show "h0 x <= p x"; |
217 show "h0 x <= p x"; |
213 proof -; |
218 proof -; |
225 also; have "... <= p (y [+] a [*] x0)"; |
230 also; have "... <= p (y [+] a [*] x0)"; |
226 proof (rule real_linear_split [of a "0r"]); (*** case analysis ***) |
231 proof (rule real_linear_split [of a "0r"]); (*** case analysis ***) |
227 assume lz: "a < 0r"; hence nz: "a ~= 0r"; by force; |
232 assume lz: "a < 0r"; hence nz: "a ~= 0r"; by force; |
228 show ?thesis; |
233 show ?thesis; |
229 proof -; |
234 proof -; |
230 from a1; have "- p (rinv a [*] y [+] x0) - h (rinv a [*] y) <= xi"; |
235 from a1; |
|
236 have "- p (rinv a [*] y [+] x0) - h (rinv a [*] y) <= xi"; |
231 by (rule bspec, simp!); |
237 by (rule bspec, simp!); |
232 |
238 |
233 with lz; have "a * xi <= a * (- p (rinv a [*] y [+] x0) - h (rinv a [*] y))"; |
239 with lz; |
|
240 have "a * xi <= a * (- p (rinv a [*] y [+] x0) - h (rinv a [*] y))"; |
234 by (rule real_mult_less_le_anti); |
241 by (rule real_mult_less_le_anti); |
235 also; have "... = - a * (p (rinv a [*] y [+] x0)) - a * (h (rinv a [*] y))"; |
242 also; have "... = - a * (p (rinv a [*] y [+] x0)) - a * (h (rinv a [*] y))"; |
236 by (rule real_mult_diff_distrib); |
243 by (rule real_mult_diff_distrib); |
237 also; from lz vs y; |
244 also; from lz vs y; |
238 have "- a * (p (rinv a [*] y [+] x0)) = p (a [*] (rinv a [*] y [+] x0))"; |
245 have "- a * (p (rinv a [*] y [+] x0)) = p (a [*] (rinv a [*] y [+] x0))"; |
255 |
262 |
256 next; |
263 next; |
257 assume gz: "0r < a"; hence nz: "a ~= 0r"; by force; |
264 assume gz: "0r < a"; hence nz: "a ~= 0r"; by force; |
258 show ?thesis; |
265 show ?thesis; |
259 proof -; |
266 proof -; |
260 from a2; have "xi <= p (rinv a [*] y [+] x0) - h (rinv a [*] y)"; |
267 from a2; |
261 by (rule bspec, simp!); |
268 have "xi <= p (rinv a [*] y [+] x0) - h (rinv a [*] y)"; |
262 |
269 by (rule bspec, simp!); |
263 with gz; have "a * xi <= a * (p (rinv a [*] y [+] x0) - h (rinv a [*] y))"; |
270 |
|
271 with gz; |
|
272 have "a * xi <= a * (p (rinv a [*] y [+] x0) - h (rinv a [*] y))"; |
264 by (rule real_mult_less_le_mono); |
273 by (rule real_mult_less_le_mono); |
265 also; have "... = a * (p (rinv a [*] y [+] x0)) - a * (h (rinv a [*] y))"; |
274 also; |
|
275 have "... = a * (p (rinv a [*] y [+] x0)) - a * (h (rinv a [*] y))"; |
266 by (rule real_mult_diff_distrib2); |
276 by (rule real_mult_diff_distrib2); |
267 also; from gz vs y; |
277 also; from gz vs y; |
268 have "a * (p (rinv a [*] y [+] x0)) = p (a [*] (rinv a [*] y [+] x0))"; |
278 have "a * (p (rinv a [*] y [+] x0)) = p (a [*] (rinv a [*] y [+] x0))"; |
269 by (simp add: quasinorm_mult_distrib rabs_eqI2); |
279 by (simp add: quasinorm_mult_distrib rabs_eqI2); |
270 also; from nz vs y; |
280 also; from nz vs y; |