src/HOL/Real/HahnBanach/HahnBanach_h0_lemmas.thy
changeset 7808 fd019ac3485f
parent 7656 2f18c0ffc348
equal deleted inserted replaced
7807:6a102f74ad0a 7808:fd019ac3485f
     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; 
   285       qed; 
   295       qed; 
   286     qed;
   296     qed;
   287   qed; 
   297   qed; 
   288 qed blast+;
   298 qed blast+;
   289 
   299 
   290 
       
   291 end;
   300 end;