# HG changeset patch # User wenzelm # Date 1030042183 -7200 # Node ID a6a7025fd7e83fb3474ac70b52f22fcb2f0d34fd # Parent cc3bbaf1b8d3c8faae21e0bcd3a40699588acf2b updated to use locales (still some rough edges); diff -r cc3bbaf1b8d3 -r a6a7025fd7e8 src/HOL/Real/HahnBanach/Aux.thy --- a/src/HOL/Real/HahnBanach/Aux.thy Thu Aug 22 12:28:41 2002 +0200 +++ b/src/HOL/Real/HahnBanach/Aux.thy Thu Aug 22 20:49:43 2002 +0200 @@ -3,25 +3,15 @@ Author: Gertrud Bauer, TU Munich *) -header {* Auxiliary theorems *} +header {* Auxiliary theorems *} (* FIXME clean *) -theory Aux = Real + Zorn: +theory Aux = Real + Bounds + Zorn: text {* Some existing theorems are declared as extra introduction or elimination rules, respectively. *} -lemmas [intro?] = isLub_isUb -lemmas [intro?] = chainD -lemmas chainE2 = chainD2 [elim_format, standard] - - -text {* \medskip Lemmas about sets. *} - -lemma Int_singletonD: "A \ B = {v} \ x \ A \ x \ B \ x = v" - by (fast elim: equalityE) - -lemma set_less_imp_diff_not_empty: "H < E \ \x0 \ E. x0 \ H" - by (auto simp add: psubset_eq) +lemmas [dest?] = chainD +lemmas chainE2 [elim?] = chainD2 [elim_format, standard] text{* \medskip Some lemmas about orders. *} diff -r cc3bbaf1b8d3 -r a6a7025fd7e8 src/HOL/Real/HahnBanach/Bounds.thy --- a/src/HOL/Real/HahnBanach/Bounds.thy Thu Aug 22 12:28:41 2002 +0200 +++ b/src/HOL/Real/HahnBanach/Bounds.thy Thu Aug 22 20:49:43 2002 +0200 @@ -7,47 +7,71 @@ theory Bounds = Main + Real: -text {* - A supremum\footnote{The definition of the supremum is based on one - in \url{http://isabelle.in.tum.de/library/HOL/HOL-Real/Lubs.html}} - of an ordered set @{text B} w.~r.~t. @{text A} is defined as a least - upper bound of @{text B}, which lies in @{text A}. -*} - -text {* - If a supremum exists, then @{text "Sup A B"} is equal to the - supremum. *} +locale lub = + fixes A and x + assumes least [intro?]: "(\a. a \ A \ a \ b) \ x \ b" + and upper [intro?]: "a \ A \ a \ x" + +lemmas [elim?] = lub.least lub.upper + +syntax (xsymbols) + the_lub :: "'a::order set \ 'a" ("\_" [90] 90) constdefs - is_Sup :: "('a::order) set \ 'a set \ 'a \ bool" - "is_Sup A B x \ isLub A B x" - - Sup :: "('a::order) set \ 'a set \ 'a" - "Sup A B \ Eps (is_Sup A B)" + the_lub :: "'a::order set \ 'a" + "\A \ The (lub A)" -text {* - The supremum of @{text B} is less than any upper bound of - @{text B}. *} - -lemma sup_le_ub: "isUb A B y \ is_Sup A B s \ s \ y" - by (unfold is_Sup_def, rule isLub_le_isUb) - -text {* The supremum @{text B} is an upper bound for @{text B}. *} +lemma the_lub_equality [elim?]: + includes lub + shows "\A = (x::'a::order)" +proof (unfold the_lub_def) + from lub_axioms show "The (lub A) = x" + proof + fix x' assume lub': "lub A x'" + show "x' = x" + proof (rule order_antisym) + from lub' show "x' \ x" + proof + fix a assume "a \ A" + then show "a \ x" .. + qed + show "x \ x'" + proof + fix a assume "a \ A" + with lub' show "a \ x'" .. + qed + qed + qed +qed -lemma sup_ub: "y \ B \ is_Sup A B s \ y \ s" - by (unfold is_Sup_def, rule isLubD2) - -text {* - The supremum of a non-empty set @{text B} is greater than a lower - bound of @{text B}. *} +lemma the_lubI_ex: + assumes ex: "\x. lub A x" + shows "lub A (\A)" +proof - + from ex obtain x where x: "lub A x" .. + also from x have [symmetric]: "\A = x" .. + finally show ?thesis . +qed -lemma sup_ub1: - "\y \ B. a \ y \ is_Sup A B s \ x \ B \ a \ s" -proof - - assume "\y \ B. a \ y" "is_Sup A B s" "x \ B" - have "a \ x" by (rule bspec) - also have "x \ s" by (rule sup_ub) - finally show "a \ s" . +lemma lub_compat: "lub A x = isLub UNIV A x" +proof - + have "isUb UNIV A = (\x. A *<= x \ x \ UNIV)" + by (rule ext) (simp only: isUb_def) + then show ?thesis + by (simp only: lub_def isLub_def leastP_def setge_def setle_def) blast qed - + +lemma real_complete: + fixes A :: "real set" + assumes nonempty: "\a. a \ A" + and ex_upper: "\y. \a \ A. a \ y" + shows "\x. lub A x" +proof - + from ex_upper have "\y. isUb UNIV A y" + by (unfold isUb_def setle_def) blast + with nonempty have "\x. isLub UNIV A x" + by (rule reals_complete) + then show ?thesis by (simp only: lub_compat) +qed + end diff -r cc3bbaf1b8d3 -r a6a7025fd7e8 src/HOL/Real/HahnBanach/FunctionNorm.thy --- a/src/HOL/Real/HahnBanach/FunctionNorm.thy Thu Aug 22 12:28:41 2002 +0200 +++ b/src/HOL/Real/HahnBanach/FunctionNorm.thy Thu Aug 22 20:49:43 2002 +0200 @@ -11,7 +11,7 @@ text {* A linear form @{text f} on a normed vector space @{text "(V, \\\)"} - is \emph{continuous}, iff it is bounded, i.~e. + is \emph{continuous}, iff it is bounded, i.e. \begin{center} @{text "\c \ R. \x \ V. \f x\ \ c \ \x\"} \end{center} @@ -20,28 +20,21 @@ linear forms: *} -constdefs - is_continuous :: - "'a::{plus, minus, zero} set \ ('a \ real) \ ('a \ real) \ bool" - "is_continuous V norm f \ - is_linearform V f \ (\c. \x \ V. \f x\ \ c * norm x)" +locale continuous = var V + norm_syntax + linearform + + assumes bounded: "\c. \x \ V. \f x\ \ c * \x\" lemma continuousI [intro]: - "is_linearform V f \ (\x. x \ V \ \f x\ \ c * norm x) - \ is_continuous V norm f" - by (unfold is_continuous_def) blast - -lemma continuous_linearform [intro?]: - "is_continuous V norm f \ is_linearform V f" - by (unfold is_continuous_def) blast - -lemma continuous_bounded [intro?]: - "is_continuous V norm f - \ \c. \x \ V. \f x\ \ c * norm x" - by (unfold is_continuous_def) blast + includes norm_syntax + linearform + assumes r: "\x. x \ V \ \f x\ \ c * \x\" + shows "continuous V norm f" +proof + show "linearform V f" . + from r have "\c. \x\V. \f x\ \ c * \x\" by blast + then show "continuous_axioms V norm f" .. +qed -subsection{* The norm of a linear form *} +subsection {* The norm of a linear form *} text {* The least real number @{text c} for which holds @@ -62,174 +55,133 @@ element in this set. This element must be @{text "{} \ 0"} so that @{text function_norm} has the norm properties. Furthermore it does not have to change the norm in all other cases, so it must - be @{text 0}, as all other elements of are @{text "{} \ 0"}. + be @{text 0}, as all other elements are @{text "{} \ 0"}. - Thus we define the set @{text B} the supremum is taken from as + Thus we define the set @{text B} where the supremum is taken from as + follows: \begin{center} @{text "{0} \ {\f x\ / \x\. x \ 0 \ x \ F}"} \end{center} -*} -constdefs - B :: "'a set \ ('a \ real) \ ('a::{plus, minus, zero} \ real) \ real set" - "B V norm f \ - {0} \ {\f x\ * inverse (norm x) | x. x \ 0 \ x \ V}" - -text {* - @{text n} is the function norm of @{text f}, iff @{text n} is the - supremum of @{text B}. + @{text function_norm} is equal to the supremum of @{text B}, if the + supremum exists (otherwise it is undefined). *} -constdefs - is_function_norm :: - "('a::{minus,plus,zero} \ real) \ 'a set \ ('a \ real) \ real \ bool" - "is_function_norm f V norm fn \ is_Sup UNIV (B V norm f) fn" - -text {* - @{text function_norm} is equal to the supremum of @{text B}, if the - supremum exists. Otherwise it is undefined. -*} +locale function_norm = norm_syntax + + fixes B + defines "B V f \ {0} \ {\f x\ / \x\ | x. x \ 0 \ x \ V}" + fixes function_norm ("\_\\_" [0, 1000] 999) + defines "\f\\V \ \(B V f)" -constdefs - function_norm :: "('a::{minus,plus,zero} \ real) \ 'a set \ ('a \ real) \ real" - "function_norm f V norm \ Sup UNIV (B V norm f)" +lemma (in function_norm) B_not_empty [intro]: "0 \ B V f" + by (unfold B_def) simp -syntax - function_norm :: "('a \ real) \ 'a set \ ('a \ real) \ real" ("\_\_,_") - -lemma B_not_empty: "0 \ B V norm f" - by (unfold B_def) blast +locale (open) functional_vectorspace = + normed_vectorspace + function_norm + + fixes cont + defines "cont f \ continuous V norm f" text {* The following lemma states that every continuous linear form on a normed space @{text "(V, \\\)"} has a function norm. *} -lemma ex_fnorm [intro?]: - "is_normed_vectorspace V norm \ is_continuous V norm f - \ is_function_norm f V norm \f\V,norm" -proof (unfold function_norm_def is_function_norm_def - is_continuous_def Sup_def, elim conjE, rule someI2_ex) - assume "is_normed_vectorspace V norm" - assume "is_linearform V f" - and e: "\c. \x \ V. \f x\ \ c * norm x" - +lemma (in functional_vectorspace) function_norm_works: + includes continuous + shows "lub (B V f) (\f\\V)" +proof - txt {* The existence of the supremum is shown using the - completeness of the reals. Completeness means, that - every non-empty bounded set of reals has a - supremum. *} - show "\a. is_Sup UNIV (B V norm f) a" - proof (unfold is_Sup_def, rule reals_complete) - + completeness of the reals. Completeness means, that every + non-empty bounded set of reals has a supremum. *} + have "\a. lub (B V f) a" + proof (rule real_complete) txt {* First we have to show that @{text B} is non-empty: *} - - show "\X. X \ B V norm f" - proof - show "0 \ (B V norm f)" by (unfold B_def) blast - qed + have "0 \ B V f" .. + thus "\x. x \ B V f" .. txt {* Then we have to show that @{text B} is bounded: *} - - from e show "\Y. isUb UNIV (B V norm f) Y" - proof - + show "\c. \y \ B V f. y \ c" + proof - txt {* We know that @{text f} is bounded by some value @{text c}. *} - - fix c assume a: "\x \ V. \f x\ \ c * norm x" - def b \ "max c 0" + from bounded obtain c where c: "\x \ V. \f x\ \ c * \x\" .. - show "?thesis" - proof (intro exI isUbI setleI ballI, unfold B_def, - elim UnE CollectE exE conjE singletonE) - - txt {* To proof the thesis, we have to show that there is some - constant @{text b}, such that @{text "y \ b"} for all - @{text "y \ B"}. Due to the definition of @{text B} there are - two cases for @{text "y \ B"}. If @{text "y = 0"} then - @{text "y \ max c 0"}: *} - - fix y assume "y = (0::real)" - show "y \ b" by (simp! add: le_maxI2) - - txt {* The second case is @{text "y = \f x\ / \x\"} for some - @{text "x \ V"} with @{text "x \ 0"}. *} + txt {* To prove the thesis, we have to show that there is some + @{text b}, such that @{text "y \ b"} for all @{text "y \ + B"}. Due to the definition of @{text B} there are two cases. *} - next - fix x y - assume "x \ V" "x \ 0" - - txt {* The thesis follows by a short calculation using the - fact that @{text f} is bounded. *} + def b \ "max c 0" + have "\y \ B V f. y \ b" + proof + fix y assume y: "y \ B V f" + show "y \ b" + proof cases + assume "y = 0" + thus ?thesis by (unfold b_def) arith + next + txt {* The second case is @{text "y = \f x\ / \x\"} for some + @{text "x \ V"} with @{text "x \ 0"}. *} + assume "y \ 0" + with y obtain x where y_rep: "y = \f x\ * inverse \x\" + and x: "x \ V" and neq: "x \ 0" + by (auto simp add: B_def real_divide_def) + from x neq have gt: "0 < \x\" .. - assume "y = \f x\ * inverse (norm x)" - also have "... \ c * norm x * inverse (norm x)" - proof (rule real_mult_le_le_mono2) - show "0 \ inverse (norm x)" - by (rule order_less_imp_le, rule real_inverse_gt_0, - rule normed_vs_norm_gt_zero) - from a show "\f x\ \ c * norm x" .. + txt {* The thesis follows by a short calculation using the + fact that @{text f} is bounded. *} + + note y_rep + also have "\f x\ * inverse \x\ \ (c * \x\) * inverse \x\" + proof (rule real_mult_le_le_mono2) + from c show "\f x\ \ c * \x\" .. + from gt have "0 < inverse \x\" by (rule real_inverse_gt_0) + thus "0 \ inverse \x\" by (rule order_less_imp_le) + qed + also have "\ = c * (\x\ * inverse \x\)" + by (rule real_mult_assoc) + also + from gt have "\x\ \ 0" by simp + hence "\x\ * inverse \x\ = 1" by (simp add: real_mult_inv_right1) + also have "c * 1 \ b" by (simp add: b_def le_maxI1) + finally show "y \ b" . qed - also have "... = c * (norm x * inverse (norm x))" - by (rule real_mult_assoc) - also have "(norm x * inverse (norm x)) = (1::real)" - proof (rule real_mult_inv_right1) - show nz: "norm x \ 0" - by (rule not_sym, rule lt_imp_not_eq, - rule normed_vs_norm_gt_zero) - qed - also have "c * ... \ b " by (simp! add: le_maxI1) - finally show "y \ b" . - qed simp + qed + thus ?thesis .. qed qed + then show ?thesis + by (unfold function_norm_def) (rule the_lubI_ex) +qed + +lemma (in functional_vectorspace) function_norm_ub [intro?]: + includes continuous + assumes b: "b \ B V f" + shows "b \ \f\\V" +proof - + have "lub (B V f) (\f\\V)" by (rule function_norm_works) + from this and b show ?thesis .. +qed + +lemma (in functional_vectorspace) function_norm_least [intro?]: + includes continuous + assumes b: "\b. b \ B V f \ b \ y" + shows "\f\\V \ y" +proof - + have "lub (B V f) (\f\\V)" by (rule function_norm_works) + from this and b show ?thesis .. qed text {* The norm of a continuous function is always @{text "\ 0"}. *} -lemma fnorm_ge_zero [intro?]: - "is_continuous V norm f \ is_normed_vectorspace V norm - \ 0 \ \f\V,norm" +lemma (in functional_vectorspace) function_norm_ge_zero [iff]: + includes continuous + shows "0 \ \f\\V" proof - - assume c: "is_continuous V norm f" - and n: "is_normed_vectorspace V norm" - txt {* The function norm is defined as the supremum of @{text B}. - So it is @{text "\ 0"} if all elements in @{text B} are - @{text "\ 0"}, provided the supremum exists and @{text B} is not - empty. *} - - show ?thesis - proof (unfold function_norm_def, rule sup_ub1) - show "\x \ (B V norm f). 0 \ x" - proof (intro ballI, unfold B_def, - elim UnE singletonE CollectE exE conjE) - fix x r - assume "x \ V" "x \ 0" - and r: "r = \f x\ * inverse (norm x)" - - have ge: "0 \ \f x\" by (simp! only: abs_ge_zero) - have "0 \ inverse (norm x)" - by (rule order_less_imp_le, rule real_inverse_gt_0, rule)(*** - proof (rule order_less_imp_le); - show "0 < inverse (norm x)"; - proof (rule real_inverse_gt_zero); - show "0 < norm x"; ..; - qed; - qed; ***) - with ge show "0 \ r" - by (simp only: r, rule real_le_mult_order1a) - qed (simp!) - - txt {* Since @{text f} is continuous the function norm exists: *} - - have "is_function_norm f V norm \f\V,norm" .. - thus "is_Sup UNIV (B V norm f) (Sup UNIV (B V norm f))" - by (unfold is_function_norm_def function_norm_def) - - txt {* @{text B} is non-empty by construction: *} - - show "0 \ B V norm f" by (rule B_not_empty) - qed + So it is @{text "\ 0"} if all elements in @{text B} are @{text "\ + 0"}, provided the supremum exists and @{text B} is not empty. *} + have "lub (B V f) (\f\\V)" by (rule function_norm_works) + moreover have "0 \ B V f" .. + ultimately show ?thesis .. qed text {* @@ -239,141 +191,79 @@ \end{center} *} -lemma norm_fx_le_norm_f_norm_x: - "is_continuous V norm f \ is_normed_vectorspace V norm \ x \ V - \ \f x\ \ \f\V,norm * norm x" -proof - - assume "is_normed_vectorspace V norm" "x \ V" - and c: "is_continuous V norm f" - have v: "is_vectorspace V" .. - - txt{* The proof is by case analysis on @{text x}. *} - - show ?thesis - proof cases - - txt {* For the case @{text "x = 0"} the thesis follows from the - linearity of @{text f}: for every linear function holds - @{text "f 0 = 0"}. *} - - assume "x = 0" - have "\f x\ = \f 0\" by (simp!) - also from v continuous_linearform have "f 0 = 0" .. - also note abs_zero - also have "0 \ \f\V,norm * norm x" - proof (rule real_le_mult_order1a) - show "0 \ \f\V,norm" .. - show "0 \ norm x" .. +lemma (in functional_vectorspace) function_norm_le_cong: + includes continuous + vectorspace_linearform + assumes x: "x \ V" + shows "\f x\ \ \f\\V * \x\" +proof cases + assume "x = 0" + then have "\f x\ = \f 0\" by simp + also have "f 0 = 0" .. + also have "\\\ = 0" by simp + also have "\ \ \f\\V * \x\" + proof (rule real_le_mult_order1a) + show "0 \ \f\\V" .. + show "0 \ norm x" .. + qed + finally show "\f x\ \ \f\\V * \x\" . +next + assume "x \ 0" + with x have neq: "\x\ \ 0" by simp + then have "\f x\ = (\f x\ * inverse \x\) * \x\" by simp + also have "\ \ \f\\V * \x\" + proof (rule real_mult_le_le_mono2) + from x show "0 \ \x\" .. + show "\f x\ * inverse \x\ \ \f\\V" + proof + from x and neq show "\f x\ * inverse \x\ \ B V f" + by (auto simp add: B_def real_divide_def) qed - finally - show "\f x\ \ \f\V,norm * norm x" . - - next - assume "x \ 0" - have n: "0 < norm x" .. - hence nz: "norm x \ 0" - by (simp only: lt_imp_not_eq) - - txt {* For the case @{text "x \ 0"} we derive the following fact - from the definition of the function norm:*} - - have l: "\f x\ * inverse (norm x) \ \f\V,norm" - proof (unfold function_norm_def, rule sup_ub) - from ex_fnorm [OF _ c] - show "is_Sup UNIV (B V norm f) (Sup UNIV (B V norm f))" - by (simp! add: is_function_norm_def function_norm_def) - show "\f x\ * inverse (norm x) \ B V norm f" - by (unfold B_def, intro UnI2 CollectI exI [of _ x] - conjI, simp) - qed - - txt {* The thesis now follows by a short calculation: *} - - have "\f x\ = \f x\ * 1" by (simp!) - also from nz have "1 = inverse (norm x) * norm x" - by (simp add: real_mult_inv_left1) - also have "\f x\ * ... = \f x\ * inverse (norm x) * norm x" - by (simp! add: real_mult_assoc) - also from n l have "... \ \f\V,norm * norm x" - by (simp add: real_mult_le_le_mono2) - finally show "\f x\ \ \f\V,norm * norm x" . qed + finally show ?thesis . qed text {* \medskip The function norm is the least positive real number for which the following inequation holds: \begin{center} - @{text "\f x\ \ c \ \x\"} + @{text "\f x\ \ c \ \x\"} \end{center} *} -lemma fnorm_le_ub: - "is_continuous V norm f \ is_normed_vectorspace V norm \ - \x \ V. \f x\ \ c * norm x \ 0 \ c - \ \f\V,norm \ c" -proof (unfold function_norm_def) - assume "is_normed_vectorspace V norm" - assume c: "is_continuous V norm f" - assume fb: "\x \ V. \f x\ \ c * norm x" - and "0 \ c" - - txt {* Suppose the inequation holds for some @{text "c \ 0"}. If - @{text c} is an upper bound of @{text B}, then @{text c} is greater - than the function norm since the function norm is the least upper - bound. *} - - show "Sup UNIV (B V norm f) \ c" - proof (rule sup_le_ub) - from ex_fnorm [OF _ c] - show "is_Sup UNIV (B V norm f) (Sup UNIV (B V norm f))" - by (simp! add: is_function_norm_def function_norm_def) - - txt {* @{text c} is an upper bound of @{text B}, i.e. every - @{text "y \ B"} is less than @{text c}. *} - - show "isUb UNIV (B V norm f) c" - proof (intro isUbI setleI ballI) - fix y assume "y \ B V norm f" - thus le: "y \ c" - proof (unfold B_def, elim UnE CollectE exE conjE singletonE) - - txt {* The first case for @{text "y \ B"} is @{text "y = 0"}. *} - - assume "y = 0" - show "y \ c" by (blast!) - - txt{* The second case is @{text "y = \f x\ / \x\"} for some - @{text "x \ V"} with @{text "x \ 0"}. *} - - next - fix x - assume "x \ V" "x \ 0" - - have lz: "0 < norm x" - by (simp! add: normed_vs_norm_gt_zero) - - have nz: "norm x \ 0" - proof (rule not_sym) - from lz show "0 \ norm x" - by (simp! add: order_less_imp_not_eq) - qed - - from lz have "0 < inverse (norm x)" - by (simp! add: real_inverse_gt_0) - hence inverse_gez: "0 \ inverse (norm x)" - by (rule order_less_imp_le) - - assume "y = \f x\ * inverse (norm x)" - also from inverse_gez have "... \ c * norm x * inverse (norm x)" - proof (rule real_mult_le_le_mono2) - show "\f x\ \ c * norm x" by (rule bspec) - qed - also have "... \ c" by (simp add: nz real_mult_assoc) - finally show ?thesis . - qed - qed blast +lemma (in functional_vectorspace) function_norm_least [intro?]: + includes continuous + assumes ineq: "\x \ V. \f x\ \ c * \x\" and ge: "0 \ c" + shows "\f\\V \ c" +proof (rule function_norm_least) + fix b assume b: "b \ B V f" + show "b \ c" + proof cases + assume "b = 0" + with ge show ?thesis by simp + next + assume "b \ 0" + with b obtain x where b_rep: "b = \f x\ * inverse \x\" + and x_neq: "x \ 0" and x: "x \ V" + by (auto simp add: B_def real_divide_def) + note b_rep + also have "\f x\ * inverse \x\ \ (c * \x\) * inverse \x\" + proof (rule real_mult_le_le_mono2) + have "0 < \x\" .. + then show "0 \ inverse \x\" by simp + from ineq and x show "\f x\ \ c * \x\" .. + qed + also have "\ = c" + proof - + from x_neq and x have "\x\ \ 0" by simp + then show ?thesis by simp + qed + finally show ?thesis . qed qed +lemmas [iff?] = + functional_vectorspace.function_norm_ge_zero + functional_vectorspace.function_norm_le_cong + functional_vectorspace.function_norm_least + end diff -r cc3bbaf1b8d3 -r a6a7025fd7e8 src/HOL/Real/HahnBanach/FunctionOrder.thy --- a/src/HOL/Real/HahnBanach/FunctionOrder.thy Thu Aug 22 12:28:41 2002 +0200 +++ b/src/HOL/Real/HahnBanach/FunctionOrder.thy Thu Aug 22 20:49:43 2002 +0200 @@ -20,79 +20,78 @@ graph. *} -types 'a graph = "('a * real) set" +types 'a graph = "('a \ real) set" constdefs - graph :: "'a set \ ('a \ real) \ 'a graph " + graph :: "'a set \ ('a \ real) \ 'a graph" "graph F f \ {(x, f x) | x. x \ F}" -lemma graphI [intro?]: "x \ F \ (x, f x) \ graph F f" +lemma graphI [intro]: "x \ F \ (x, f x) \ graph F f" by (unfold graph_def) blast -lemma graphI2 [intro?]: "x \ F \ \t\ (graph F f). t = (x, f x)" +lemma graphI2 [intro?]: "x \ F \ \t \ graph F f. t = (x, f x)" by (unfold graph_def) blast -lemma graphD1 [intro?]: "(x, y) \ graph F f \ x \ F" - by (unfold graph_def) blast - -lemma graphD2 [intro?]: "(x, y) \ graph H h \ y = h x" +lemma graphE [elim?]: + "(x, y) \ graph F f \ (x \ F \ y = f x \ C) \ C" by (unfold graph_def) blast subsection {* Functions ordered by domain extension *} -text {* A function @{text h'} is an extension of @{text h}, iff the - graph of @{text h} is a subset of the graph of @{text h'}. *} +text {* + A function @{text h'} is an extension of @{text h}, iff the graph of + @{text h} is a subset of the graph of @{text h'}. +*} lemma graph_extI: "(\x. x \ H \ h x = h' x) \ H \ H' - \ graph H h \ graph H' h'" + \ graph H h \ graph H' h'" by (unfold graph_def) blast -lemma graph_extD1 [intro?]: +lemma graph_extD1 [dest?]: "graph H h \ graph H' h' \ x \ H \ h x = h' x" by (unfold graph_def) blast -lemma graph_extD2 [intro?]: +lemma graph_extD2 [dest?]: "graph H h \ graph H' h' \ H \ H'" by (unfold graph_def) blast + subsection {* Domain and function of a graph *} text {* - The inverse functions to @{text graph} are @{text domain} and - @{text funct}. + The inverse functions to @{text graph} are @{text domain} and @{text + funct}. *} constdefs - domain :: "'a graph \ 'a set" + "domain" :: "'a graph \ 'a set" "domain g \ {x. \y. (x, y) \ g}" funct :: "'a graph \ ('a \ real)" "funct g \ \x. (SOME y. (x, y) \ g)" - text {* The following lemma states that @{text g} is the graph of a function if the relation induced by @{text g} is unique. *} lemma graph_domain_funct: - "(\x y z. (x, y) \ g \ (x, z) \ g \ z = y) - \ graph (domain g) (funct g) = g" -proof (unfold domain_def funct_def graph_def, auto) + assumes uniq: "\x y z. (x, y) \ g \ (x, z) \ g \ z = y" + shows "graph (domain g) (funct g) = g" +proof (unfold domain_def funct_def graph_def, auto) (* FIXME !? *) fix a b assume "(a, b) \ g" show "(a, SOME y. (a, y) \ g) \ g" by (rule someI2) show "\y. (a, y) \ g" .. - assume uniq: "\x y z. (x, y) \ g \ (x, z) \ g \ z = y" show "b = (SOME y. (a, y) \ g)" proof (rule some_equality [symmetric]) - fix y assume "(a, y) \ g" show "y = b" by (rule uniq) + fix y assume "(a, y) \ g" + show "y = b" by (rule uniq) qed qed - subsection {* Norm-preserving extensions of a function *} text {* @@ -105,39 +104,35 @@ constdefs norm_pres_extensions :: "'a::{plus, minus, zero} set \ ('a \ real) \ 'a set \ ('a \ real) - \ 'a graph set" + \ 'a graph set" "norm_pres_extensions E p F f - \ {g. \H h. graph H h = g - \ is_linearform H h - \ is_subspace H E - \ is_subspace F H - \ graph F f \ graph H h - \ (\x \ H. h x \ p x)}" + \ {g. \H h. g = graph H h + \ linearform H h + \ H \ E + \ F \ H + \ graph F f \ graph H h + \ (\x \ H. h x \ p x)}" -lemma norm_pres_extension_D: +lemma norm_pres_extensionE [elim]: "g \ norm_pres_extensions E p F f - \ \H h. graph H h = g - \ is_linearform H h - \ is_subspace H E - \ is_subspace F H - \ graph F f \ graph H h - \ (\x \ H. h x \ p x)" + \ (\H h. g = graph H h \ linearform H h + \ H \ E \ F \ H \ graph F f \ graph H h + \ \x \ H. h x \ p x \ C) \ C" by (unfold norm_pres_extensions_def) blast lemma norm_pres_extensionI2 [intro]: - "is_linearform H h \ is_subspace H E \ is_subspace F H \ - graph F f \ graph H h \ \x \ H. h x \ p x - \ (graph H h \ norm_pres_extensions E p F f)" - by (unfold norm_pres_extensions_def) blast + "linearform H h \ H \ E \ F \ H + \ graph F f \ graph H h \ \x \ H. h x \ p x + \ graph H h \ norm_pres_extensions E p F f" + by (unfold norm_pres_extensions_def) blast -lemma norm_pres_extensionI [intro]: - "\H h. graph H h = g - \ is_linearform H h - \ is_subspace H E - \ is_subspace F H - \ graph F f \ graph H h - \ (\x \ H. h x \ p x) - \ g \ norm_pres_extensions E p F f" +lemma norm_pres_extensionI: (* FIXME ? *) + "\H h. g = graph H h + \ linearform H h + \ H \ E + \ F \ H + \ graph F f \ graph H h + \ (\x \ H. h x \ p x) \ g \ norm_pres_extensions E p F f" by (unfold norm_pres_extensions_def) blast end diff -r cc3bbaf1b8d3 -r a6a7025fd7e8 src/HOL/Real/HahnBanach/HahnBanach.thy --- a/src/HOL/Real/HahnBanach/HahnBanach.thy Thu Aug 22 12:28:41 2002 +0200 +++ b/src/HOL/Real/HahnBanach/HahnBanach.thy Thu Aug 22 20:49:43 2002 +0200 @@ -49,251 +49,235 @@ \item Thus @{text g} can not be maximal. Contradiction! \end{itemize} - \end{enumerate} *} theorem HahnBanach: - "is_vectorspace E \ is_subspace F E \ is_seminorm E p - \ is_linearform F f \ \x \ F. f x \ p x - \ \h. is_linearform E h \ (\x \ F. h x = f x) \ (\x \ E. h x \ p x)" + includes vectorspace E + subvectorspace F E + + seminorm_vectorspace E p + linearform F f + assumes fp: "\x \ F. f x \ p x" + shows "\h. linearform E h \ (\x \ F. h x = f x) \ (\x \ E. h x \ p x)" -- {* Let @{text E} be a vector space, @{text F} a subspace of @{text E}, @{text p} a seminorm on @{text E}, *} -- {* and @{text f} a linear form on @{text F} such that @{text f} is bounded by @{text p}, *} -- {* then @{text f} can be extended to a linear form @{text h} on @{text E} in a norm-preserving way. \skp *} proof - - assume "is_vectorspace E" "is_subspace F E" "is_seminorm E p" - and "is_linearform F f" "\x \ F. f x \ p x" - -- {* Assume the context of the theorem. \skp *} def M \ "norm_pres_extensions E p F f" - -- {* Define @{text M} as the set of all norm-preserving extensions of @{text F}. \skp *} + hence M: "M = \" by (simp only:) + have F: "vectorspace F" .. { - fix c assume "c \ chain M" "\x. x \ c" + fix c assume cM: "c \ chain M" and ex: "\x. x \ c" have "\c \ M" - -- {* Show that every non-empty chain @{text c} of @{text M} has an upper bound in @{text M}: *} - -- {* @{text "\c"} is greater than any element of the chain @{text c}, so it suffices to show @{text "\c \ M"}. *} + -- {* Show that every non-empty chain @{text c} of @{text M} has an upper bound in @{text M}: *} + -- {* @{text "\c"} is greater than any element of the chain @{text c}, so it suffices to show @{text "\c \ M"}. *} proof (unfold M_def, rule norm_pres_extensionI) - show "\H h. graph H h = \c - \ is_linearform H h - \ is_subspace H E - \ is_subspace F H - \ graph F f \ graph H h - \ (\x \ H. h x \ p x)" - proof (intro exI conjI) - let ?H = "domain (\c)" - let ?h = "funct (\c)" + let ?H = "domain (\c)" + let ?h = "funct (\c)" - show a: "graph ?H ?h = \c" - proof (rule graph_domain_funct) - fix x y z assume "(x, y) \ \c" "(x, z) \ \c" - show "z = y" by (rule sup_definite) - qed - show "is_linearform ?H ?h" - by (simp! add: sup_lf a) - show "is_subspace ?H E" - by (rule sup_subE, rule a) (simp!)+ - show "is_subspace F ?H" - by (rule sup_supF, rule a) (simp!)+ - show "graph F f \ graph ?H ?h" - by (rule sup_ext, rule a) (simp!)+ - show "\x \ ?H. ?h x \ p x" - by (rule sup_norm_pres, rule a) (simp!)+ + have a: "graph ?H ?h = \c" + proof (rule graph_domain_funct) + fix x y z assume "(x, y) \ \c" and "(x, z) \ \c" + with M_def cM show "z = y" by (rule sup_definite) qed + moreover from M cM a have "linearform ?H ?h" + by (rule sup_lf) + moreover from a M cM ex have "?H \ E" + by (rule sup_subE) + moreover from a M cM ex have "F \ ?H" + by (rule sup_supF) + moreover from a M cM ex have "graph F f \ graph ?H ?h" + by (rule sup_ext) + moreover from a M cM have "\x \ ?H. ?h x \ p x" + by (rule sup_norm_pres) + ultimately show "\H h. \c = graph H h + \ linearform H h + \ H \ E + \ F \ H + \ graph F f \ graph H h + \ (\x \ H. h x \ p x)" by blast qed - } hence "\g \ M. \x \ M. g \ x \ g = x" -- {* With Zorn's Lemma we can conclude that there is a maximal element in @{text M}. \skp *} proof (rule Zorn's_Lemma) - -- {* We show that @{text M} is non-empty: *} - have "graph F f \ norm_pres_extensions E p F f" - proof (rule norm_pres_extensionI2) - have "is_vectorspace F" .. - thus "is_subspace F F" .. - qed (blast!)+ - thus "graph F f \ M" by (simp!) + -- {* We show that @{text M} is non-empty: *} + show "graph F f \ M" + proof (unfold M_def, rule norm_pres_extensionI2) + show "linearform F f" . + show "F \ E" . + from F show "F \ F" by (rule vectorspace.subspace_refl) + show "graph F f \ graph F f" .. + show "\x\F. f x \ p x" . + qed qed - thus ?thesis - proof - fix g assume "g \ M" "\x \ M. g \ x \ g = x" - -- {* We consider such a maximal element @{text "g \ M"}. \skp *} - obtain H h where "graph H h = g" "is_linearform H h" - "is_subspace H E" "is_subspace F H" "graph F f \ graph H h" - "\x \ H. h x \ p x" + then obtain g where gM: "g \ M" and "\x \ M. g \ x \ g = x" + by blast + from gM [unfolded M_def] obtain H h where + g_rep: "g = graph H h" + and linearform: "linearform H h" + and HE: "H \ E" and FH: "F \ H" + and graphs: "graph F f \ graph H h" + and hp: "\x \ H. h x \ p x" .. -- {* @{text g} is a norm-preserving extension of @{text f}, in other words: *} -- {* @{text g} is the graph of some linear form @{text h} defined on a subspace @{text H} of @{text E}, *} -- {* and @{text h} is an extension of @{text f} that is again bounded by @{text p}. \skp *} - proof - - have "\H h. graph H h = g \ is_linearform H h - \ is_subspace H E \ is_subspace F H - \ graph F f \ graph H h - \ (\x \ H. h x \ p x)" - by (simp! add: norm_pres_extension_D) - with that show ?thesis by blast - qed - have h: "is_vectorspace H" .. - have "H = E" + from HE have H: "vectorspace H" + by (rule subvectorspace.vectorspace) + + have HE_eq: "H = E" -- {* We show that @{text h} is defined on whole @{text E} by classical contradiction. \skp *} - proof (rule classical) - assume "H \ E" + proof (rule classical) + assume neq: "H \ E" -- {* Assume @{text h} is not defined on whole @{text E}. Then show that @{text h} can be extended *} -- {* in a norm-preserving way to a function @{text h'} with the graph @{text g'}. \skp *} - have "\g' \ M. g \ g' \ g \ g'" - proof - - obtain x' where "x' \ E" "x' \ H" - -- {* Pick @{text "x' \ E - H"}. \skp *} - proof - - have "\x' \ E. x' \ H" - proof (rule set_less_imp_diff_not_empty) - have "H \ E" .. - thus "H \ E" .. - qed - with that show ?thesis by blast + have "\g' \ M. g \ g' \ g \ g'" + proof - + from HE have "H \ E" .. + with neq obtain x' where x'E: "x' \ E" and "x' \ H" by blast + obtain x': "x' \ 0" + proof + show "x' \ 0" + proof + assume "x' = 0" + with H have "x' \ H" by (simp only: vectorspace.zero) + then show False by contradiction qed - have x': "x' \ 0" - proof (rule classical) - presume "x' = 0" - with h have "x' \ H" by simp - thus ?thesis by contradiction - qed blast - def H' \ "H + lin x'" + qed + + def H' \ "H + lin x'" -- {* Define @{text H'} as the direct sum of @{text H} and the linear closure of @{text x'}. \skp *} - obtain xi where "\y \ H. - p (y + x') - h y \ xi - \ xi \ p (y + x') - h y" + have HH': "H \ H'" + proof (unfold H'_def) + have "vectorspace (lin x')" .. + with H show "H \ H + lin x'" .. + qed + + obtain xi where + "\y \ H. - p (y + x') - h y \ xi + \ xi \ p (y + x') - h y" -- {* Pick a real number @{text \} that fulfills certain inequations; this will *} -- {* be used to establish that @{text h'} is a norm-preserving extension of @{text h}. \label{ex-xi-use}\skp *} + proof - + from H have "\xi. \y \ H. - p (y + x') - h y \ xi + \ xi \ p (y + x') - h y" + proof (rule ex_xi) + fix u v assume u: "u \ H" and v: "v \ H" + with HE have uE: "u \ E" and vE: "v \ E" by auto + from H u v linearform have "h v - h u = h (v - u)" + by (simp add: vectorspace_linearform.diff) + also from hp and H u v have "\ \ p (v - u)" + by (simp only: vectorspace.diff_closed) + also from x'E uE vE have "v - u = x' + - x' + v + - u" + by (simp add: diff_eq1) + also from x'E uE vE have "\ = v + x' + - (u + x')" + by (simp add: add_ac) + also from x'E uE vE have "\ = (v + x') - (u + x')" + by (simp add: diff_eq1) + also from x'E uE vE have "p \ \ p (v + x') + p (u + x')" + by (simp add: diff_subadditive) + finally have "h v - h u \ p (v + x') + p (u + x')" . + then show "- p (u + x') - h u \ p (v + x') - h v" + by simp + qed + then show ?thesis .. + qed + + def h' \ "\x. let (y, a) = + SOME (y, a). x = y + a \ x' \ y \ H in h y + a * xi" + -- {* Define the extension @{text h'} of @{text h} to @{text H'} using @{text \}. \skp *} + + have "g \ graph H' h' \ g \ graph H' h'" + -- {* @{text h'} is an extension of @{text h} \dots \skp *} + proof + show "g \ graph H' h'" proof - - from h have "\xi. \y \ H. - p (y + x') - h y \ xi - \ xi \ p (y + x') - h y" - proof (rule ex_xi) - fix u v assume "u \ H" "v \ H" - from h have "h v - h u = h (v - u)" - by (simp! add: linearform_diff) - also have "... \ p (v - u)" - by (simp!) - also have "v - u = x' + - x' + v + - u" - by (simp! add: diff_eq1) - also have "... = v + x' + - (u + x')" - by (simp!) - also have "... = (v + x') - (u + x')" - by (simp! add: diff_eq1) - also have "p ... \ p (v + x') + p (u + x')" - by (rule seminorm_diff_subadditive) (simp_all!) - finally have "h v - h u \ p (v + x') + p (u + x')" . - - thus "- p (u + x') - h u \ p (v + x') - h v" - by (rule real_diff_ineq_swap) + have "graph H h \ graph H' h'" + proof (rule graph_extI) + fix t assume t: "t \ H" + have "(SOME (y, a). t = y + a \ x' \ y \ H) = (t, 0)" + by (rule decomp_H'_H) + with h'_def show "h t = h' t" by (simp add: Let_def) + next + from HH' show "H \ H'" .. qed - thus ?thesis .. + with g_rep show ?thesis by (simp only:) qed - def h' \ "\x. let (y, a) = SOME (y, a). x = y + a \ x' \ y \ H - in h y + a * xi" - -- {* Define the extension @{text h'} of @{text h} to @{text H'} using @{text \}. \skp *} - show ?thesis - proof - show "g \ graph H' h' \ g \ graph H' h'" - -- {* Show that @{text h'} is an extension of @{text h} \dots \skp *} + show "g \ graph H' h'" + proof - + have "graph H h \ graph H' h'" proof - show "g \ graph H' h'" - proof - - have "graph H h \ graph H' h'" - proof (rule graph_extI) - fix t assume "t \ H" - have "(SOME (y, a). t = y + a \ x' \ y \ H) - = (t, 0)" - by (rule decomp_H'_H) (assumption+, rule x') - thus "h t = h' t" by (simp! add: Let_def) - next - show "H \ H'" - proof (rule subspace_subset) - show "is_subspace H H'" - proof (unfold H'_def, rule subspace_vs_sum1) - show "is_vectorspace H" .. - show "is_vectorspace (lin x')" .. - qed - qed - qed - thus ?thesis by (simp!) + assume eq: "graph H h = graph H' h'" + have "x' \ H'" + proof (unfold H'_def, rule) + from H show "0 \ H" by (rule vectorspace.zero) + from x'E show "x' \ lin x'" by (rule x_lin_x) + from x'E show "x' = 0 + x'" by simp qed - show "g \ graph H' h'" - proof - - have "graph H h \ graph H' h'" - proof - assume e: "graph H h = graph H' h'" - have "x' \ H'" - proof (unfold H'_def, rule vs_sumI) - show "x' = 0 + x'" by (simp!) - from h show "0 \ H" .. - show "x' \ lin x'" by (rule x_lin_x) - qed - hence "(x', h' x') \ graph H' h'" .. - with e have "(x', h' x') \ graph H h" by simp - hence "x' \ H" .. - thus False by contradiction - qed - thus ?thesis by (simp!) - qed + hence "(x', h' x') \ graph H' h'" .. + with eq have "(x', h' x') \ graph H h" by (simp only:) + hence "x' \ H" .. + thus False by contradiction qed - show "graph H' h' \ M" - -- {* and @{text h'} is norm-preserving. \skp *} - proof - - have "graph H' h' \ norm_pres_extensions E p F f" - proof (rule norm_pres_extensionI2) - show "is_linearform H' h'" - by (rule h'_lf) (simp! add: x')+ - show "is_subspace H' E" - by (unfold H'_def) - (rule vs_sum_subspace [OF _ lin_subspace]) - have "is_subspace F H" . - also from h lin_vs - have [folded H'_def]: "is_subspace H (H + lin x')" .. - finally (subspace_trans [OF _ h]) - show f_h': "is_subspace F H'" . - - show "graph F f \ graph H' h'" - proof (rule graph_extI) - fix x assume "x \ F" - have "f x = h x" .. - also have " ... = h x + 0 * xi" by simp - also - have "... = (let (y, a) = (x, 0) in h y + a * xi)" - by (simp add: Let_def) - also have - "(x, 0) = (SOME (y, a). x = y + a \ x' \ y \ H)" - by (rule decomp_H'_H [symmetric]) (simp! add: x')+ - also have - "(let (y, a) = (SOME (y, a). x = y + a \ x' \ y \ H) - in h y + a * xi) = h' x" by (simp!) - finally show "f x = h' x" . - next - from f_h' show "F \ H'" .. - qed - - show "\x \ H'. h' x \ p x" - by (rule h'_norm_pres) (assumption+, rule x') - qed - thus "graph H' h' \ M" by (simp!) - qed + with g_rep show ?thesis by simp qed qed - hence "\ (\x \ M. g \ x \ g = x)" by simp - -- {* So the graph @{text g} of @{text h} cannot be maximal. Contradiction! \skp *} - thus "H = E" by contradiction + moreover have "graph H' h' \ M" + -- {* and @{text h'} is norm-preserving. \skp *} + proof (unfold M_def) + show "graph H' h' \ norm_pres_extensions E p F f" + proof (rule norm_pres_extensionI2) + show "linearform H' h'" by (rule h'_lf) + show "H' \ E" + proof (unfold H'_def, rule) + show "H \ E" . + show "vectorspace E" . + from x'E show "lin x' \ E" .. + qed + have "F \ H" . + from H this HH' show FH': "F \ H'" + by (rule vectorspace.subspace_trans) + show "graph F f \ graph H' h'" + proof (rule graph_extI) + fix x assume x: "x \ F" + with graphs have "f x = h x" .. + also have "\ = h x + 0 * xi" by simp + also have "\ = (let (y, a) = (x, 0) in h y + a * xi)" + by (simp add: Let_def) + also have "(x, 0) = + (SOME (y, a). x = y + a \ x' \ y \ H)" + proof (rule decomp_H'_H [symmetric]) + from FH x show "x \ H" .. + from x' show "x' \ 0" . + qed + also have + "(let (y, a) = (SOME (y, a). x = y + a \ x' \ y \ H) + in h y + a * xi) = h' x" by (simp only: h'_def) + finally show "f x = h' x" . + next + from FH' show "F \ H'" .. + qed + show "\x \ H'. h' x \ p x" by (rule h'_norm_pres) + qed + qed + ultimately show ?thesis .. qed - thus "\h. is_linearform E h \ (\x \ F. h x = f x) - \ (\x \ E. h x \ p x)" - proof (intro exI conjI) - assume eq: "H = E" - from eq show "is_linearform E h" by (simp!) - show "\x \ F. h x = f x" - proof - fix x assume "x \ F" have "f x = h x " .. - thus "h x = f x" .. - qed - from eq show "\x \ E. h x \ p x" by (blast!) - qed + hence "\ (\x \ M. g \ x \ g = x)" by simp + -- {* So the graph @{text g} of @{text h} cannot be maximal. Contradiction! \skp *} + then show "H = E" by contradiction qed + + from HE_eq and linearform have "linearform E h" + by (simp only:) + moreover have "\x \ F. h x = f x" + proof + fix x assume "x \ F" + with graphs have "f x = h x" .. + then show "h x = f x" .. + qed + moreover from HE_eq and hp have "\x \ E. h x \ p x" + by (simp only:) + ultimately show ?thesis by blast qed @@ -314,26 +298,28 @@ *} theorem abs_HahnBanach: - "is_vectorspace E \ is_subspace F E \ is_linearform F f - \ is_seminorm E p \ \x \ F. \f x\ \ p x - \ \g. is_linearform E g \ (\x \ F. g x = f x) + includes vectorspace E + subvectorspace F E + + linearform F f + seminorm_vectorspace E p + assumes fp: "\x \ F. \f x\ \ p x" + shows "\g. linearform E g + \ (\x \ F. g x = f x) \ (\x \ E. \g x\ \ p x)" proof - -assume "is_vectorspace E" "is_subspace F E" "is_seminorm E p" -"is_linearform F f" "\x \ F. \f x\ \ p x" -have "\x \ F. f x \ p x" by (rule abs_ineq_iff [THEN iffD1]) -hence "\g. is_linearform E g \ (\x \ F. g x = f x) - \ (\x \ E. g x \ p x)" -by (simp! only: HahnBanach) -thus ?thesis -proof (elim exE conjE) -fix g assume "is_linearform E g" "\x \ F. g x = f x" - "\x \ E. g x \ p x" -hence "\x \ E. \g x\ \ p x" - by (simp! add: abs_ineq_iff [OF subspace_refl]) -thus ?thesis by (intro exI conjI) + have "\g. linearform E g \ (\x \ F. g x = f x) + \ (\x \ E. g x \ p x)" + proof (rule HahnBanach) + show "\x \ F. f x \ p x" + by (rule abs_ineq_iff [THEN iffD1]) + qed + then obtain g where * : "linearform E g" "\x \ F. g x = f x" + and "\x \ E. g x \ p x" by blast + have "\x \ E. \g x\ \ p x" + proof (rule abs_ineq_iff [THEN iffD2]) + show "E \ E" .. + qed + with * show ?thesis by blast qed -qed + subsection {* The Hahn-Banach Theorem for normed spaces *} @@ -344,126 +330,108 @@ *} theorem norm_HahnBanach: - "is_normed_vectorspace E norm \ is_subspace F E - \ is_linearform F f \ is_continuous F norm f - \ \g. is_linearform E g - \ is_continuous E norm g + includes functional_vectorspace E + subvectorspace F E + + linearform F f + continuous F norm f + shows "\g. linearform E g + \ continuous E norm g \ (\x \ F. g x = f x) - \ \g\E,norm = \f\F,norm" -proof - -assume e_norm: "is_normed_vectorspace E norm" -assume f: "is_subspace F E" "is_linearform F f" -assume f_cont: "is_continuous F norm f" -have e: "is_vectorspace E" .. -hence f_norm: "is_normed_vectorspace F norm" .. - -txt{* - We define a function @{text p} on @{text E} as follows: - @{text "p x = \f\ \ \x\"} -*} - -def p \ "\x. \f\F,norm * norm x" - -txt {* @{text p} is a seminorm on @{text E}: *} - -have q: "is_seminorm E p" -proof -fix x y a assume "x \ E" "y \ E" - -txt {* @{text p} is positive definite: *} - -show "0 \ p x" -proof (unfold p_def, rule real_le_mult_order1a) - from f_cont f_norm show "0 \ \f\F,norm" .. - show "0 \ norm x" .. -qed - -txt {* @{text p} is absolutely homogenous: *} - -show "p (a \ x) = \a\ * p x" -proof - - have "p (a \ x) = \f\F,norm * norm (a \ x)" - by (simp!) - also have "norm (a \ x) = \a\ * norm x" - by (rule normed_vs_norm_abs_homogenous) - also have "\f\F,norm * (\a\ * norm x ) - = \a\ * (\f\F,norm * norm x)" - by (simp! only: real_mult_left_commute) - also have "... = \a\ * p x" by (simp!) - finally show ?thesis . -qed - -txt {* Furthermore, @{text p} is subadditive: *} - -show "p (x + y) \ p x + p y" + \ \g\\E = \f\\F" proof - - have "p (x + y) = \f\F,norm * norm (x + y)" - by (simp!) - also - have "... \ \f\F,norm * (norm x + norm y)" - proof (rule real_mult_le_le_mono1a) - from f_cont f_norm show "0 \ \f\F,norm" .. - show "norm (x + y) \ norm x + norm y" .. - qed - also have "... = \f\F,norm * norm x - + \f\F,norm * norm y" - by (simp! only: real_add_mult_distrib2) - finally show ?thesis by (simp!) -qed -qed + have E: "vectorspace E" . + have E_norm: "normed_vectorspace E norm" .. + have FE: "F \ E" . + have F: "vectorspace F" .. + have linearform: "linearform F f" . + have F_norm: "normed_vectorspace F norm" .. + + txt {* We define a function @{text p} on @{text E} as follows: + @{text "p x = \f\ \ \x\"} *} + def p \ "\x. \f\\F * \x\" + + txt {* @{text p} is a seminorm on @{text E}: *} + have q: "seminorm E p" + proof + fix x y a assume x: "x \ E" and y: "y \ E" -txt {* @{text f} is bounded by @{text p}. *} + txt {* @{text p} is positive definite: *} + show "0 \ p x" + proof (unfold p_def, rule real_le_mult_order1a) + show "0 \ \f\\F" + apply (unfold function_norm_def B_def) + using normed_vectorspace.axioms [OF F_norm] .. + from x show "0 \ \x\" .. + qed + + txt {* @{text p} is absolutely homogenous: *} -have "\x \ F. \f x\ \ p x" -proof -fix x assume "x \ F" - from f_norm show "\f x\ \ p x" - by (simp! add: norm_fx_le_norm_f_norm_x) -qed + show "p (a \ x) = \a\ * p x" + proof - + have "p (a \ x) = \f\\F * \a \ x\" + by (simp only: p_def) + also from x have "\a \ x\ = \a\ * \x\" + by (rule abs_homogenous) + also have "\f\\F * (\a\ * \x\) = \a\ * (\f\\F * \x\)" + by simp + also have "\ = \a\ * p x" + by (simp only: p_def) + finally show ?thesis . + qed + + txt {* Furthermore, @{text p} is subadditive: *} -txt {* - Using the fact that @{text p} is a seminorm and @{text f} is bounded - by @{text p} we can apply the Hahn-Banach Theorem for real vector - spaces. So @{text f} can be extended in a norm-preserving way to - some function @{text g} on the whole vector space @{text E}. -*} + show "p (x + y) \ p x + p y" + proof - + have "p (x + y) = \f\\F * \x + y\" + by (simp only: p_def) + also have "\ \ \f\\F * (\x\ + \y\)" + proof (rule real_mult_le_le_mono1a) + show "0 \ \f\\F" + apply (unfold function_norm_def B_def) + using normed_vectorspace.axioms [OF F_norm] .. (* FIXME *) + from x y show "\x + y\ \ \x\ + \y\" .. + qed + also have "\ = \f\\F * \x\ + \f\\F * \y\" + by (simp only: real_add_mult_distrib2) + also have "\ = p x + p y" + by (simp only: p_def) + finally show ?thesis . + qed + qed -with e f q -have "\g. is_linearform E g \ (\x \ F. g x = f x) - \ (\x \ E. \g x\ \ p x)" -by (simp! add: abs_HahnBanach) + txt {* @{text f} is bounded by @{text p}. *} -thus ?thesis -proof (elim exE conjE) -fix g -assume "is_linearform E g" and a: "\x \ F. g x = f x" - and b: "\x \ E. \g x\ \ p x" + have "\x \ F. \f x\ \ p x" + proof + fix x assume "x \ F" + show "\f x\ \ p x" + apply (unfold p_def function_norm_def B_def) + using normed_vectorspace.axioms [OF F_norm] .. (* FIXME *) + qed -show "\g. is_linearform E g - \ is_continuous E norm g - \ (\x \ F. g x = f x) - \ \g\E,norm = \f\F,norm" -proof (intro exI conjI) + txt {* Using the fact that @{text p} is a seminorm and @{text f} is bounded + by @{text p} we can apply the Hahn-Banach Theorem for real vector + spaces. So @{text f} can be extended in a norm-preserving way to + some function @{text g} on the whole vector space @{text E}. *} -txt {* - We furthermore have to show that @{text g} is also continuous: -*} + with E FE linearform q obtain g where + linearformE: "linearform E g" + and a: "\x \ F. g x = f x" + and b: "\x \ E. \g x\ \ p x" + by (rule abs_HahnBanach [elim_format]) rules - show g_cont: "is_continuous E norm g" + txt {* We furthermore have to show that @{text g} is also continuous: *} + + have g_cont: "continuous E norm g" using linearformE proof fix x assume "x \ E" - with b show "\g x\ \ \f\F,norm * norm x" - by (simp add: p_def) + with b show "\g x\ \ \f\\F * \x\" + by (simp only: p_def) qed - txt {* - To complete the proof, we show that - @{text "\g\ = \f\"}. \label{order_antisym} *} + txt {* To complete the proof, we show that @{text "\g\ = \f\"}. *} - show "\g\E,norm = \f\F,norm" - (is "?L = ?R") + have "\g\\E = \f\\F" proof (rule order_antisym) - txt {* First we show @{text "\g\ \ \f\"}. The function norm @{text "\g\"} is defined as the smallest @{text "c \ \"} such that @@ -480,40 +448,51 @@ \end{center} *} - have "\x \ E. \g x\ \ \f\F,norm * norm x" + have "\x \ E. \g x\ \ \f\\F * \x\" proof fix x assume "x \ E" - show "\g x\ \ \f\F,norm * norm x" - by (simp!) - qed - - with g_cont e_norm show "?L \ ?R" - proof (rule fnorm_le_ub) - from f_cont f_norm show "0 \ \f\F,norm" .. + with b show "\g x\ \ \f\\F * \x\" + by (simp only: p_def) qed - - txt{* The other direction is achieved by a similar - argument. *} + show "\g\\E \ \f\\F" + apply (unfold function_norm_def B_def) + apply rule + apply (rule normed_vectorspace.axioms [OF E_norm])+ + apply (rule continuous.axioms [OF g_cont])+ + apply (rule b [unfolded p_def function_norm_def B_def]) + using normed_vectorspace.axioms [OF F_norm] .. (* FIXME *) - have "\x \ F. \f x\ \ \g\E,norm * norm x" + txt {* The other direction is achieved by a similar argument. *} + + have ** : "\x \ F. \f x\ \ \g\\E * \x\" proof - fix x assume "x \ F" + fix x assume x: "x \ F" from a have "g x = f x" .. - hence "\f x\ = \g x\" by simp - also from g_cont - have "... \ \g\E,norm * norm x" - proof (rule norm_fx_le_norm_f_norm_x) - show "x \ E" .. + hence "\f x\ = \g x\" by (simp only:) + also have "\ \ \g\\E * \x\" + apply (unfold function_norm_def B_def) + apply rule + apply (rule normed_vectorspace.axioms [OF E_norm])+ + apply (rule continuous.axioms [OF g_cont])+ + proof - + from FE x show "x \ E" .. qed - finally show "\f x\ \ \g\E,norm * norm x" . + finally show "\f x\ \ \g\\E * \x\" . qed - thus "?R \ ?L" - proof (rule fnorm_le_ub [OF f_cont f_norm]) - from g_cont show "0 \ \g\E,norm" .. - qed + show "\f\\F \ \g\\E" + apply (unfold function_norm_def B_def) + apply rule + apply (rule normed_vectorspace.axioms [OF F_norm])+ + apply assumption+ + apply (rule ** [unfolded function_norm_def B_def]) + apply rule + apply assumption+ + apply (rule continuous.axioms [OF g_cont])+ + done (* FIXME *) qed -qed -qed + + with linearformE a g_cont show ?thesis + by blast qed end diff -r cc3bbaf1b8d3 -r a6a7025fd7e8 src/HOL/Real/HahnBanach/HahnBanachExtLemmas.thy --- a/src/HOL/Real/HahnBanach/HahnBanachExtLemmas.thy Thu Aug 22 12:28:41 2002 +0200 +++ b/src/HOL/Real/HahnBanach/HahnBanachExtLemmas.thy Thu Aug 22 20:49:43 2002 +0200 @@ -17,17 +17,15 @@ an element in @{text "E - H"}. @{text H} is extended to the direct sum @{text "H' = H + lin x\<^sub>0"}, so for any @{text "x \ H'"} the decomposition of @{text "x = y + a \ x"} with @{text "y \ H"} is - unique. @{text h'} is defined on @{text H'} by - @{text "h' x = h y + a \ \"} for a certain @{text \}. + unique. @{text h'} is defined on @{text H'} by @{text "h' x = h y + + a \ \"} for a certain @{text \}. Subsequently we show some properties of this extension @{text h'} of @{text h}. -*} -text {* - This lemma will be used to show the existence of a linear extension - of @{text f} (see page \pageref{ex-xi-use}). It is a consequence of - the completeness of @{text \}. To show + \medskip This lemma will be used to show the existence of a linear + extension of @{text f} (see page \pageref{ex-xi-use}). It is a + consequence of the completeness of @{text \}. To show \begin{center} \begin{tabular}{l} @{text "\\. \y \ F. a y \ \ \ \ \ b y"} @@ -42,307 +40,227 @@ *} lemma ex_xi: - "is_vectorspace F \ (\u v. u \ F \ v \ F \ a u \ b v) - \ \xi::real. \y \ F. a y \ xi \ xi \ b y" + includes vectorspace F + assumes r: "\u v. u \ F \ v \ F \ a u \ b v" + shows "\xi::real. \y \ F. a y \ xi \ xi \ b y" proof - - assume vs: "is_vectorspace F" - assume r: "(\u v. u \ F \ v \ F \ a u \ (b v::real))" - txt {* From the completeness of the reals follows: - The set @{text "S = {a u. u \ F}"} has a supremum, if - it is non-empty and has an upper bound. *} - - let ?S = "{a u :: real | u. u \ F}" - - have "\xi. isLub UNIV ?S xi" - proof (rule reals_complete) - - txt {* The set @{text S} is non-empty, since @{text "a 0 \ S"}: *} - - from vs have "a 0 \ ?S" by blast - thus "\X. X \ ?S" .. - - txt {* @{text "b 0"} is an upper bound of @{text S}: *} - - show "\Y. isUb UNIV ?S Y" - proof - show "isUb UNIV ?S (b 0)" - proof (intro isUbI setleI ballI) - show "b 0 \ UNIV" .. - next - - txt {* Every element @{text "y \ S"} is less than @{text "b 0"}: *} + The set @{text "S = {a u. u \ F}"} has a supremum, if it is + non-empty and has an upper bound. *} - fix y assume y: "y \ ?S" - from y have "\u \ F. y = a u" by fast - thus "y \ b 0" - proof - fix u assume "u \ F" - assume "y = a u" - also have "a u \ b 0" by (rule r) (simp!)+ - finally show ?thesis . - qed - qed + let ?S = "{a u | u. u \ F}" + have "\xi. lub ?S xi" + proof (rule real_complete) + have "a 0 \ ?S" by blast + then show "\X. X \ ?S" .. + have "\y \ ?S. y \ b 0" + proof + fix y assume y: "y \ ?S" + then obtain u where u: "u \ F" and y: "y = a u" by blast + from u and zero have "a u \ b 0" by (rule r) + with y show "y \ b 0" by (simp only:) qed + then show "\u. \y \ ?S. y \ u" .. qed - - thus "\xi. \y \ F. a y \ xi \ xi \ b y" - proof (elim exE) - fix xi assume "isLub UNIV ?S xi" - show ?thesis - proof (intro exI conjI ballI) - - txt {* For all @{text "y \ F"} holds @{text "a y \ \"}: *} - - fix y assume y: "y \ F" - show "a y \ xi" - proof (rule isUbD) - show "isUb UNIV ?S xi" .. - qed (blast!) - next - - txt {* For all @{text "y \ F"} holds @{text "\ \ b y"}: *} - - fix y assume "y \ F" - show "xi \ b y" - proof (intro isLub_le_isUb isUbI setleI) - show "b y \ UNIV" .. - show "\ya \ ?S. ya \ b y" - proof - fix au assume au: "au \ ?S " - hence "\u \ F. au = a u" by fast - thus "au \ b y" - proof - fix u assume "u \ F" assume "au = a u" - also have "... \ b y" by (rule r) - finally show ?thesis . - qed - qed - qed + then obtain xi where xi: "lub ?S xi" .. + { + fix y assume "y \ F" + then have "a y \ ?S" by blast + with xi have "a y \ xi" by (rule lub.upper) + } moreover { + fix y assume y: "y \ F" + from xi have "xi \ b y" + proof (rule lub.least) + fix au assume "au \ ?S" + then obtain u where u: "u \ F" and au: "au = a u" by blast + from u y have "a u \ b y" by (rule r) + with au show "au \ b y" by (simp only:) qed - qed + } ultimately show "\xi. \y \ F. a y \ xi \ xi \ b y" by blast qed text {* - \medskip The function @{text h'} is defined as a - @{text "h' x = h y + a \ \"} where @{text "x = y + a \ \"} is a - linear extension of @{text h} to @{text H'}. *} + \medskip The function @{text h'} is defined as a @{text "h' x = h y + + a \ \"} where @{text "x = y + a \ \"} is a linear extension of + @{text h} to @{text H'}. +*} lemma h'_lf: - "h' \ \x. let (y, a) = SOME (y, a). x = y + a \ x0 \ y \ H in h y + a * xi - \ H' \ H + lin x0 \ is_subspace H E \ is_linearform H h \ x0 \ H - \ x0 \ E \ x0 \ 0 \ is_vectorspace E - \ is_linearform H' h'" -proof - - assume h'_def: - "h' \ (\x. let (y, a) = SOME (y, a). x = y + a \ x0 \ y \ H - in h y + a * xi)" + includes var H + var h + var E + assumes h'_def: "h' \ \x. let (y, a) = + SOME (y, a). x = y + a \ x0 \ y \ H in h y + a * xi" and H'_def: "H' \ H + lin x0" - and vs: "is_subspace H E" "is_linearform H h" "x0 \ H" - "x0 \ 0" "x0 \ E" "is_vectorspace E" - - have h': "is_vectorspace H'" - proof (unfold H'_def, rule vs_sum_vs) - show "is_subspace (lin x0) E" .. + and HE: "H \ E" + includes linearform H h + assumes x0: "x0 \ H" "x0 \ E" "x0 \ 0" + includes vectorspace E + shows "linearform H' h'" +proof + have H': "vectorspace H'" + proof (unfold H'_def) + have "x0 \ E" . + then have "lin x0 \ E" .. + with HE show "vectorspace (H + lin x0)" .. qed - - show ?thesis - proof + { fix x1 x2 assume x1: "x1 \ H'" and x2: "x2 \ H'" - - txt {* We now have to show that @{text h'} is additive, i.~e.\ - @{text "h' (x\<^sub>1 + x\<^sub>2) = h' x\<^sub>1 + h' x\<^sub>2"} for - @{text "x\<^sub>1, x\<^sub>2 \ H"}. *} + show "h' (x1 + x2) = h' x1 + h' x2" + proof - + from H' x1 x2 have "x1 + x2 \ H'" + by (rule vectorspace.add_closed) + with x1 x2 obtain y y1 y2 a a1 a2 where + x1x2: "x1 + x2 = y + a \ x0" and y: "y \ H" + and x1_rep: "x1 = y1 + a1 \ x0" and y1: "y1 \ H" + and x2_rep: "x2 = y2 + a2 \ x0" and y2: "y2 \ H" + by (unfold H'_def sum_def lin_def) blast - have x1x2: "x1 + x2 \ H'" - by (rule vs_add_closed, rule h') - from x1 - have ex_x1: "\y1 a1. x1 = y1 + a1 \ x0 \ y1 \ H" - by (unfold H'_def vs_sum_def lin_def) fast - from x2 - have ex_x2: "\y2 a2. x2 = y2 + a2 \ x0 \ y2 \ H" - by (unfold H'_def vs_sum_def lin_def) fast - from x1x2 - have ex_x1x2: "\y a. x1 + x2 = y + a \ x0 \ y \ H" - by (unfold H'_def vs_sum_def lin_def) fast - - from ex_x1 ex_x2 ex_x1x2 - show "h' (x1 + x2) = h' x1 + h' x2" - proof (elim exE conjE) - fix y1 y2 y a1 a2 a - assume y1: "x1 = y1 + a1 \ x0" and y1': "y1 \ H" - and y2: "x2 = y2 + a2 \ x0" and y2': "y2 \ H" - and y: "x1 + x2 = y + a \ x0" and y': "y \ H" - txt {* \label{decomp-H-use}*} - have ya: "y1 + y2 = y \ a1 + a2 = a" - proof (rule decomp_H') - show "y1 + y2 + (a1 + a2) \ x0 = y + a \ x0" - by (simp! add: vs_add_mult_distrib2 [of E]) - show "y1 + y2 \ H" .. + have ya: "y1 + y2 = y \ a1 + a2 = a" using _ HE _ y x0 + proof (rule decomp_H') txt_raw {* \label{decomp-H-use} *} + from HE y1 y2 show "y1 + y2 \ H" + by (rule subspace.add_closed) + from x0 and HE y y1 y2 + have "x0 \ E" "y \ E" "y1 \ E" "y2 \ E" by auto + with x1_rep x2_rep have "(y1 + y2) + (a1 + a2) \ x0 = x1 + x2" + by (simp add: add_ac add_mult_distrib2) + also note x1x2 + finally show "(y1 + y2) + (a1 + a2) \ x0 = y + a \ x0" . qed + from h'_def x1x2 _ HE y x0 have "h' (x1 + x2) = h y + a * xi" by (rule h'_definite) - also have "... = h (y1 + y2) + (a1 + a2) * xi" - by (simp add: ya) - also from vs y1' y2' - have "... = h y1 + h y2 + a1 * xi + a2 * xi" - by (simp add: linearform_add [of H] - real_add_mult_distrib) - also have "... = (h y1 + a1 * xi) + (h y2 + a2 * xi)" + also have "\ = h (y1 + y2) + (a1 + a2) * xi" + by (simp only: ya) + also from y1 y2 have "h (y1 + y2) = h y1 + h y2" by simp - also have "h y1 + a1 * xi = h' x1" + also have "\ + (a1 + a2) * xi = (h y1 + a1 * xi) + (h y2 + a2 * xi)" + by (simp add: real_add_mult_distrib) + also from h'_def x1_rep _ HE y1 x0 + have "h y1 + a1 * xi = h' x1" by (rule h'_definite [symmetric]) - also have "h y2 + a2 * xi = h' x2" + also from h'_def x2_rep _ HE y2 x0 + have "h y2 + a2 * xi = h' x2" by (rule h'_definite [symmetric]) finally show ?thesis . qed - - txt {* We further have to show that @{text h'} is multiplicative, - i.~e.\ @{text "h' (c \ x\<^sub>1) = c \ h' x\<^sub>1"} for @{text "x \ H"} - and @{text "c \ \"}. *} - next - fix c x1 assume x1: "x1 \ H'" - have ax1: "c \ x1 \ H'" - by (rule vs_mult_closed, rule h') - from x1 - have ex_x: "\x. x\ H' \ \y a. x = y + a \ x0 \ y \ H" - by (unfold H'_def vs_sum_def lin_def) fast + fix x1 c assume x1: "x1 \ H'" + show "h' (c \ x1) = c * (h' x1)" + proof - + from H' x1 have ax1: "c \ x1 \ H'" + by (rule vectorspace.mult_closed) + with x1 obtain y a y1 a1 where + cx1_rep: "c \ x1 = y + a \ x0" and y: "y \ H" + and x1_rep: "x1 = y1 + a1 \ x0" and y1: "y1 \ H" + by (unfold H'_def sum_def lin_def) blast - from x1 have ex_x1: "\y1 a1. x1 = y1 + a1 \ x0 \ y1 \ H" - by (unfold H'_def vs_sum_def lin_def) fast - with ex_x [of "c \ x1", OF ax1] - show "h' (c \ x1) = c * (h' x1)" - proof (elim exE conjE) - fix y1 y a1 a - assume y1: "x1 = y1 + a1 \ x0" and y1': "y1 \ H" - and y: "c \ x1 = y + a \ x0" and y': "y \ H" - - have ya: "c \ y1 = y \ c * a1 = a" + have ya: "c \ y1 = y \ c * a1 = a" using _ HE _ y x0 proof (rule decomp_H') - show "c \ y1 + (c * a1) \ x0 = y + a \ x0" - by (simp! add: vs_add_mult_distrib1) - show "c \ y1 \ H" .. + from HE y1 show "c \ y1 \ H" + by (rule subspace.mult_closed) + from x0 and HE y y1 + have "x0 \ E" "y \ E" "y1 \ E" by auto + with x1_rep have "c \ y1 + (c * a1) \ x0 = c \ x1" + by (simp add: mult_assoc add_mult_distrib1) + also note cx1_rep + finally show "c \ y1 + (c * a1) \ x0 = y + a \ x0" . qed - have "h' (c \ x1) = h y + a * xi" + from h'_def cx1_rep _ HE y x0 have "h' (c \ x1) = h y + a * xi" by (rule h'_definite) - also have "... = h (c \ y1) + (c * a1) * xi" - by (simp add: ya) - also from vs y1' have "... = c * h y1 + c * a1 * xi" - by (simp add: linearform_mult [of H]) - also from vs y1' have "... = c * (h y1 + a1 * xi)" - by (simp add: real_add_mult_distrib2 real_mult_assoc) - also have "h y1 + a1 * xi = h' x1" + also have "\ = h (c \ y1) + (c * a1) * xi" + by (simp only: ya) + also from y1 have "h (c \ y1) = c * h y1" + by simp + also have "\ + (c * a1) * xi = c * (h y1 + a1 * xi)" + by (simp only: real_add_mult_distrib2) + also from h'_def x1_rep _ HE y1 x0 have "h y1 + a1 * xi = h' x1" by (rule h'_definite [symmetric]) finally show ?thesis . qed - qed + } qed text {* \medskip The linear extension @{text h'} of @{text h} -is bounded by the seminorm @{text p}. *} + is bounded by the seminorm @{text p}. *} lemma h'_norm_pres: - "h' \ \x. let (y, a) = SOME (y, a). x = y + a \ x0 \ y \ H in h y + a * xi - \ H' \ H + lin x0 \ x0 \ H \ x0 \ E \ x0 \ 0 \ is_vectorspace E - \ is_subspace H E \ is_seminorm E p \ is_linearform H h - \ \y \ H. h y \ p y - \ \y \ H. - p (y + x0) - h y \ xi \ xi \ p (y + x0) - h y - \ \x \ H'. h' x \ p x" -proof - assume h'_def: - "h' \ (\x. let (y, a) = SOME (y, a). x = y + a \ x0 \ y \ H - in (h y) + a * xi)" + includes var H + var h + var E + assumes h'_def: "h' \ \x. let (y, a) = + SOME (y, a). x = y + a \ x0 \ y \ H in h y + a * xi" and H'_def: "H' \ H + lin x0" - and vs: "x0 \ H" "x0 \ E" "x0 \ 0" "is_vectorspace E" - "is_subspace H E" "is_seminorm E p" "is_linearform H h" - and a: "\y \ H. h y \ p y" - presume a1: "\ya \ H. - p (ya + x0) - h ya \ xi" - presume a2: "\ya \ H. xi \ p (ya + x0) - h ya" - fix x assume "x \ H'" - have ex_x: - "\x. x \ H' \ \y a. x = y + a \ x0 \ y \ H" - by (unfold H'_def vs_sum_def lin_def) fast - have "\y a. x = y + a \ x0 \ y \ H" - by (rule ex_x) - thus "h' x \ p x" - proof (elim exE conjE) - fix y a assume x: "x = y + a \ x0" and y: "y \ H" - have "h' x = h y + a * xi" + and x0: "x0 \ H" "x0 \ E" "x0 \ 0" + includes vectorspace E + subvectorspace H E + + seminorm E p + linearform H h + assumes a: "\y \ H. h y \ p y" + and a': "\y \ H. - p (y + x0) - h y \ xi \ xi \ p (y + x0) - h y" + shows "\x \ H'. h' x \ p x" +proof + fix x assume x': "x \ H'" + show "h' x \ p x" + proof - + from a' have a1: "\ya \ H. - p (ya + x0) - h ya \ xi" + and a2: "\ya \ H. xi \ p (ya + x0) - h ya" by auto + from x' obtain y a where + x_rep: "x = y + a \ x0" and y: "y \ H" + by (unfold H'_def sum_def lin_def) blast + from y have y': "y \ E" .. + from y have ay: "inverse a \ y \ H" by simp + + from h'_def x_rep _ _ y x0 have "h' x = h y + a * xi" by (rule h'_definite) - - txt {* Now we show @{text "h y + a \ \ \ p (y + a \ x\<^sub>0)"} - by case analysis on @{text a}. *} - - also have "... \ p (y + a \ x0)" + also have "\ \ p (y + a \ x0)" proof (rule linorder_cases) - assume z: "a = 0" - with vs y a show ?thesis by simp - - txt {* In the case @{text "a < 0"}, we use @{text "a\<^sub>1"} - with @{text ya} taken as @{text "y / a"}: *} - + then have "h y + a * xi = h y" by simp + also from a y have "\ \ p y" .. + also from x0 y' z have "p y = p (y + a \ x0)" by simp + finally show ?thesis . next + txt {* In the case @{text "a < 0"}, we use @{text "a\<^sub>1"} + with @{text ya} taken as @{text "y / a"}: *} assume lz: "a < 0" hence nz: "a \ 0" by simp - from a1 - have "- p (inverse a \ y + x0) - h (inverse a \ y) \ xi" - by (rule bspec) (simp!) - - txt {* The thesis for this case now follows by a short - calculation. *} - hence "a * xi \ a * (- p (inverse a \ y + x0) - h (inverse a \ y))" - by (rule real_mult_less_le_anti [OF lz]) - also - have "... = - a * (p (inverse a \ y + x0)) - a * (h (inverse a \ y))" + from a1 ay + have "- p (inverse a \ y + x0) - h (inverse a \ y) \ xi" .. + with lz have "a * xi \ + a * (- p (inverse a \ y + x0) - h (inverse a \ y))" + by (rule real_mult_less_le_anti) + also have "\ = + - a * (p (inverse a \ y + x0)) - a * (h (inverse a \ y))" by (rule real_mult_diff_distrib) - also from lz vs y - have "- a * (p (inverse a \ y + x0)) = p (a \ (inverse a \ y + x0))" - by (simp add: seminorm_abs_homogenous abs_minus_eqI2) - also from nz vs y have "... = p (y + a \ x0)" - by (simp add: vs_add_mult_distrib1) - also from nz vs y have "a * (h (inverse a \ y)) = h y" - by (simp add: linearform_mult [symmetric]) + also from lz x0 y' have "- a * (p (inverse a \ y + x0)) = + p (a \ (inverse a \ y + x0))" + by (simp add: abs_homogenous abs_minus_eqI2) + also from nz x0 y' have "\ = p (y + a \ x0)" + by (simp add: add_mult_distrib1 mult_assoc [symmetric]) + also from nz y have "a * (h (inverse a \ y)) = h y" + by simp finally have "a * xi \ p (y + a \ x0) - h y" . - - hence "h y + a * xi \ h y + p (y + a \ x0) - h y" - by (simp add: real_add_left_cancel_le) - thus ?thesis by simp - + then show ?thesis by simp + next txt {* In the case @{text "a > 0"}, we use @{text "a\<^sub>2"} with @{text ya} taken as @{text "y / a"}: *} - - next assume gz: "0 < a" hence nz: "a \ 0" by simp - from a2 have "xi \ p (inverse a \ y + x0) - h (inverse a \ y)" - by (rule bspec) (simp!) - - txt {* The thesis for this case follows by a short - calculation: *} - - with gz - have "a * xi \ a * (p (inverse a \ y + x0) - h (inverse a \ y))" + from a2 ay + have "xi \ p (inverse a \ y + x0) - h (inverse a \ y)" .. + with gz have "a * xi \ + a * (p (inverse a \ y + x0) - h (inverse a \ y))" by (rule real_mult_less_le_mono) also have "... = a * p (inverse a \ y + x0) - a * h (inverse a \ y)" by (rule real_mult_diff_distrib2) - also from gz vs y + also from gz x0 y' have "a * p (inverse a \ y + x0) = p (a \ (inverse a \ y + x0))" - by (simp add: seminorm_abs_homogenous abs_eqI2) - also from nz vs y have "... = p (y + a \ x0)" - by (simp add: vs_add_mult_distrib1) - also from nz vs y have "a * h (inverse a \ y) = h y" - by (simp add: linearform_mult [symmetric]) + by (simp add: abs_homogenous abs_eqI2) + also from nz x0 y' have "\ = p (y + a \ x0)" + by (simp add: add_mult_distrib1 mult_assoc [symmetric]) + also from nz y have "a * h (inverse a \ y) = h y" + by simp finally have "a * xi \ p (y + a \ x0) - h y" . - - hence "h y + a * xi \ h y + (p (y + a \ x0) - h y)" - by (simp add: real_add_left_cancel_le) - thus ?thesis by simp + then show ?thesis by simp qed - also from x have "... = p x" by simp + also from x_rep have "\ = p x" by (simp only:) finally show ?thesis . qed -qed blast+ +qed end diff -r cc3bbaf1b8d3 -r a6a7025fd7e8 src/HOL/Real/HahnBanach/HahnBanachSupLemmas.thy --- a/src/HOL/Real/HahnBanach/HahnBanachSupLemmas.thy Thu Aug 22 12:28:41 2002 +0200 +++ b/src/HOL/Real/HahnBanach/HahnBanachSupLemmas.thy Thu Aug 22 20:49:43 2002 +0200 @@ -13,62 +13,43 @@ presumed. Let @{text E} be a real vector space with a seminorm @{text p} on @{text E}. @{text F} is a subspace of @{text E} and @{text f} a linear form on @{text F}. We consider a chain @{text c} - of norm-preserving extensions of @{text f}, such that - @{text "\c = graph H h"}. We will show some properties about the - limit function @{text h}, i.e.\ the supremum of the chain @{text c}. -*} + of norm-preserving extensions of @{text f}, such that @{text "\c = + graph H h"}. We will show some properties about the limit function + @{text h}, i.e.\ the supremum of the chain @{text c}. -text {* - Let @{text c} be a chain of norm-preserving extensions of the - function @{text f} and let @{text "graph H h"} be the supremum of - @{text c}. Every element in @{text H} is member of one of the + \medskip Let @{text c} be a chain of norm-preserving extensions of + the function @{text f} and let @{text "graph H h"} be the supremum + of @{text c}. Every element in @{text H} is member of one of the elements of the chain. *} lemma some_H'h't: - "M = norm_pres_extensions E p F f \ c \ chain M \ - graph H h = \c \ x \ H - \ \H' h'. graph H' h' \ c \ (x, h x) \ graph H' h' - \ is_linearform H' h' \ is_subspace H' E - \ is_subspace F H' \ graph F f \ graph H' h' - \ (\x \ H'. h' x \ p x)" + assumes M: "M = norm_pres_extensions E p F f" + and cM: "c \ chain M" + and u: "graph H h = \c" + and x: "x \ H" + shows "\H' h'. graph H' h' \ c + \ (x, h x) \ graph H' h' + \ linearform H' h' \ H' \ E + \ F \ H' \ graph F f \ graph H' h' + \ (\x \ H'. h' x \ p x)" proof - - assume m: "M = norm_pres_extensions E p F f" and "c \ chain M" - and u: "graph H h = \c" "x \ H" + from x have "(x, h x) \ graph H h" .. + also from u have "\ = \c" . + finally obtain g where gc: "g \ c" and gh: "(x, h x) \ g" by blast - have h: "(x, h x) \ graph H h" .. - with u have "(x, h x) \ \c" by simp - hence ex1: "\g \ c. (x, h x) \ g" - by (simp only: Union_iff) - thus ?thesis - proof (elim bexE) - fix g assume g: "g \ c" "(x, h x) \ g" - have "c \ M" by (rule chainD2) - hence "g \ M" .. - hence "g \ norm_pres_extensions E p F f" by (simp only: m) - hence "\H' h'. graph H' h' = g - \ is_linearform H' h' - \ is_subspace H' E - \ is_subspace F H' - \ graph F f \ graph H' h' - \ (\x \ H'. h' x \ p x)" - by (rule norm_pres_extension_D) - thus ?thesis - proof (elim exE conjE) - fix H' h' - assume "graph H' h' = g" "is_linearform H' h'" - "is_subspace H' E" "is_subspace F H'" - "graph F f \ graph H' h'" "\x \ H'. h' x \ p x" - show ?thesis - proof (intro exI conjI) - show "graph H' h' \ c" by (simp!) - show "(x, h x) \ graph H' h'" by (simp!) - qed - qed - qed + from cM have "c \ M" .. + with gc have "g \ M" .. + also from M have "\ = norm_pres_extensions E p F f" . + finally obtain H' and h' where g: "g = graph H' h'" + and * : "linearform H' h'" "H' \ E" "F \ H'" + "graph F f \ graph H' h'" "\x \ H'. h' x \ p x" .. + + from gc and g have "graph H' h' \ c" by (simp only:) + moreover from gh and g have "(x, h x) \ graph H' h'" by (simp only:) + ultimately show ?thesis using * by blast qed - text {* \medskip Let @{text c} be a chain of norm-preserving extensions of the function @{text f} and let @{text "graph H h"} be the supremum @@ -78,35 +59,26 @@ *} lemma some_H'h': - "M = norm_pres_extensions E p F f \ c \ chain M \ - graph H h = \c \ x \ H - \ \H' h'. x \ H' \ graph H' h' \ graph H h - \ is_linearform H' h' \ is_subspace H' E \ is_subspace F H' - \ graph F f \ graph H' h' \ (\x \ H'. h' x \ p x)" + assumes M: "M = norm_pres_extensions E p F f" + and cM: "c \ chain M" + and u: "graph H h = \c" + and x: "x \ H" + shows "\H' h'. x \ H' \ graph H' h' \ graph H h + \ linearform H' h' \ H' \ E \ F \ H' + \ graph F f \ graph H' h' \ (\x \ H'. h' x \ p x)" proof - - assume "M = norm_pres_extensions E p F f" and cM: "c \ chain M" - and u: "graph H h = \c" "x \ H" - - have "\H' h'. graph H' h' \ c \ (x, h x) \ graph H' h' - \ is_linearform H' h' \ is_subspace H' E - \ is_subspace F H' \ graph F f \ graph H' h' - \ (\x \ H'. h' x \ p x)" - by (rule some_H'h't) - thus ?thesis - proof (elim exE conjE) - fix H' h' assume "(x, h x) \ graph H' h'" "graph H' h' \ c" - "is_linearform H' h'" "is_subspace H' E" "is_subspace F H'" + from M cM u x obtain H' h' where + x_hx: "(x, h x) \ graph H' h'" + and c: "graph H' h' \ c" + and * : "linearform H' h'" "H' \ E" "F \ H'" "graph F f \ graph H' h'" "\x \ H'. h' x \ p x" - show ?thesis - proof (intro exI conjI) - show "x \ H'" by (rule graphD1) - from cM u show "graph H' h' \ graph H h" - by (simp! only: chain_ball_Union_upper) - qed - qed + by (rule some_H'h't [elim_format]) blast + from x_hx have "x \ H'" .. + moreover from cM u c have "graph H' h' \ graph H h" + by (simp only: chain_ball_Union_upper) + ultimately show ?thesis using * by blast qed - text {* \medskip Any two elements @{text x} and @{text y} in the domain @{text H} of the supremum function @{text h} are both in the domain @@ -115,136 +87,116 @@ *} lemma some_H'h'2: - "M = norm_pres_extensions E p F f \ c \ chain M \ - graph H h = \c \ x \ H \ y \ H - \ \H' h'. x \ H' \ y \ H' \ graph H' h' \ graph H h - \ is_linearform H' h' \ is_subspace H' E \ is_subspace F H' - \ graph F f \ graph H' h' \ (\x \ H'. h' x \ p x)" + assumes M: "M = norm_pres_extensions E p F f" + and cM: "c \ chain M" + and u: "graph H h = \c" + and x: "x \ H" + and y: "y \ H" + shows "\H' h'. x \ H' \ y \ H' + \ graph H' h' \ graph H h + \ linearform H' h' \ H' \ E \ F \ H' + \ graph F f \ graph H' h' \ (\x \ H'. h' x \ p x)" proof - - assume "M = norm_pres_extensions E p F f" "c \ chain M" - "graph H h = \c" "x \ H" "y \ H" - - txt {* - @{text x} is in the domain @{text H'} of some function @{text h'}, - such that @{text h} extends @{text h'}. *} - - have e1: "\H' h'. graph H' h' \ c \ (x, h x) \ graph H' h' - \ is_linearform H' h' \ is_subspace H' E - \ is_subspace F H' \ graph F f \ graph H' h' - \ (\x \ H'. h' x \ p x)" - by (rule some_H'h't) - txt {* @{text y} is in the domain @{text H''} of some function @{text h''}, such that @{text h} extends @{text h''}. *} - have e2: "\H'' h''. graph H'' h'' \ c \ (y, h y) \ graph H'' h'' - \ is_linearform H'' h'' \ is_subspace H'' E - \ is_subspace F H'' \ graph F f \ graph H'' h'' - \ (\x \ H''. h'' x \ p x)" - by (rule some_H'h't) + from M cM u and y obtain H' h' where + y_hy: "(y, h y) \ graph H' h'" + and c': "graph H' h' \ c" + and * : + "linearform H' h'" "H' \ E" "F \ H'" + "graph F f \ graph H' h'" "\x \ H'. h' x \ p x" + by (rule some_H'h't [elim_format]) blast + + txt {* @{text x} is in the domain @{text H'} of some function @{text h'}, + such that @{text h} extends @{text h'}. *} - from e1 e2 show ?thesis - proof (elim exE conjE) - fix H' h' assume "(y, h y) \ graph H' h'" "graph H' h' \ c" - "is_linearform H' h'" "is_subspace H' E" "is_subspace F H'" - "graph F f \ graph H' h'" "\x \ H'. h' x \ p x" + from M cM u and x obtain H'' h'' where + x_hx: "(x, h x) \ graph H'' h''" + and c'': "graph H'' h'' \ c" + and ** : + "linearform H'' h''" "H'' \ E" "F \ H''" + "graph F f \ graph H'' h''" "\x \ H''. h'' x \ p x" + by (rule some_H'h't [elim_format]) blast - fix H'' h'' assume "(x, h x) \ graph H'' h''" "graph H'' h'' \ c" - "is_linearform H'' h''" "is_subspace H'' E" "is_subspace F H''" - "graph F f \ graph H'' h''" "\x \ H''. h'' x \ p x" - - txt {* Since both @{text h'} and @{text h''} are elements of the chain, - @{text h''} is an extension of @{text h'} or vice versa. Thus both - @{text x} and @{text y} are contained in the greater one. \label{cases1}*} + txt {* Since both @{text h'} and @{text h''} are elements of the chain, + @{text h''} is an extension of @{text h'} or vice versa. Thus both + @{text x} and @{text y} are contained in the greater + one. \label{cases1}*} - have "graph H'' h'' \ graph H' h' \ graph H' h' \ graph H'' h''" - (is "?case1 \ ?case2") - by (rule chainD) - thus ?thesis - proof - assume ?case1 - show ?thesis - proof (intro exI conjI) - have "(x, h x) \ graph H'' h''" . - also have "... \ graph H' h'" . - finally have xh:"(x, h x) \ graph H' h'" . - thus x: "x \ H'" .. - show y: "y \ H'" .. - show "graph H' h' \ graph H h" - by (simp! only: chain_ball_Union_upper) - qed - next - assume ?case2 - show ?thesis - proof (intro exI conjI) - show x: "x \ H''" .. - have "(y, h y) \ graph H' h'" by (simp!) - also have "... \ graph H'' h''" . - finally have yh: "(y, h y) \ graph H'' h''" . - thus y: "y \ H''" .. - show "graph H'' h'' \ graph H h" - by (simp! only: chain_ball_Union_upper) - qed - qed + from cM have "graph H'' h'' \ graph H' h' \ graph H' h' \ graph H'' h''" + (is "?case1 \ ?case2") .. + then show ?thesis + proof + assume ?case1 + have "(x, h x) \ graph H'' h''" . + also have "... \ graph H' h'" . + finally have xh:"(x, h x) \ graph H' h'" . + then have "x \ H'" .. + moreover from y_hy have "y \ H'" .. + moreover from cM u and c' have "graph H' h' \ graph H h" + by (simp only: chain_ball_Union_upper) + ultimately show ?thesis using * by blast + next + assume ?case2 + from x_hx have "x \ H''" .. + moreover { + from y_hy have "(y, h y) \ graph H' h'" . + also have "\ \ graph H'' h''" . + finally have "(y, h y) \ graph H'' h''" . + } then have "y \ H''" .. + moreover from cM u and c'' have "graph H'' h'' \ graph H h" + by (simp only: chain_ball_Union_upper) + ultimately show ?thesis using ** by blast qed qed - - text {* \medskip The relation induced by the graph of the supremum of a - chain @{text c} is definite, i.~e.~t is the graph of a function. *} + chain @{text c} is definite, i.~e.~t is the graph of a function. +*} lemma sup_definite: - "M \ norm_pres_extensions E p F f \ c \ chain M \ - (x, y) \ \c \ (x, z) \ \c \ z = y" + assumes M_def: "M \ norm_pres_extensions E p F f" + and cM: "c \ chain M" + and xy: "(x, y) \ \c" + and xz: "(x, z) \ \c" + shows "z = y" proof - - assume "c \ chain M" "M \ norm_pres_extensions E p F f" - "(x, y) \ \c" "(x, z) \ \c" - thus ?thesis - proof (elim UnionE chainE2) + from cM have c: "c \ M" .. + from xy obtain G1 where xy': "(x, y) \ G1" and G1: "G1 \ c" .. + from xz obtain G2 where xz': "(x, z) \ G2" and G2: "G2 \ c" .. - txt {* Since both @{text "(x, y) \ \c"} and @{text "(x, z) \ \c"} - they are members of some graphs @{text "G\<^sub>1"} and @{text - "G\<^sub>2"}, resp., such that both @{text "G\<^sub>1"} and @{text - "G\<^sub>2"} are members of @{text c}.*} + from G1 c have "G1 \ M" .. + then obtain H1 h1 where G1_rep: "G1 = graph H1 h1" + by (unfold M_def) blast - fix G1 G2 assume - "(x, y) \ G1" "G1 \ c" "(x, z) \ G2" "G2 \ c" "c \ M" + from G2 c have "G2 \ M" .. + then obtain H2 h2 where G2_rep: "G2 = graph H2 h2" + by (unfold M_def) blast - have "G1 \ M" .. - hence e1: "\H1 h1. graph H1 h1 = G1" - by (blast! dest: norm_pres_extension_D) - have "G2 \ M" .. - hence e2: "\H2 h2. graph H2 h2 = G2" - by (blast! dest: norm_pres_extension_D) - from e1 e2 show ?thesis - proof (elim exE) - fix H1 h1 H2 h2 - assume "graph H1 h1 = G1" "graph H2 h2 = G2" - - txt {* @{text "G\<^sub>1"} is contained in @{text "G\<^sub>2"} - or vice versa, since both @{text "G\<^sub>1"} and @{text - "G\<^sub>2"} are members of @{text c}. \label{cases2}*} + txt {* @{text "G\<^sub>1"} is contained in @{text "G\<^sub>2"} + or vice versa, since both @{text "G\<^sub>1"} and @{text + "G\<^sub>2"} are members of @{text c}. \label{cases2}*} - have "G1 \ G2 \ G2 \ G1" (is "?case1 \ ?case2") .. - thus ?thesis - proof - assume ?case1 - have "(x, y) \ graph H2 h2" by (blast!) - hence "y = h2 x" .. - also have "(x, z) \ graph H2 h2" by (simp!) - hence "z = h2 x" .. - finally show ?thesis . - next - assume ?case2 - have "(x, y) \ graph H1 h1" by (simp!) - hence "y = h1 x" .. - also have "(x, z) \ graph H1 h1" by (blast!) - hence "z = h1 x" .. - finally show ?thesis . - qed - qed + from cM G1 G2 have "G1 \ G2 \ G2 \ G1" (is "?case1 \ ?case2") .. + then show ?thesis + proof + assume ?case1 + with xy' G2_rep have "(x, y) \ graph H2 h2" by blast + hence "y = h2 x" .. + also + from xz' G2_rep have "(x, z) \ graph H2 h2" by (simp only:) + hence "z = h2 x" .. + finally show ?thesis . + next + assume ?case2 + with xz' G1_rep have "(x, z) \ graph H1 h1" by blast + hence "z = h1 x" .. + also + from xy' G1_rep have "(x, y) \ graph H1 h1" by (simp only:) + hence "y = h1 x" .. + finally show ?thesis .. qed qed @@ -258,58 +210,48 @@ *} lemma sup_lf: - "M = norm_pres_extensions E p F f \ c \ chain M \ - graph H h = \c \ is_linearform H h" -proof - - assume "M = norm_pres_extensions E p F f" "c \ chain M" - "graph H h = \c" - - show "is_linearform H h" - proof - fix x y assume "x \ H" "y \ H" - have "\H' h'. x \ H' \ y \ H' \ graph H' h' \ graph H h - \ is_linearform H' h' \ is_subspace H' E - \ is_subspace F H' \ graph F f \ graph H' h' - \ (\x \ H'. h' x \ p x)" - by (rule some_H'h'2) - - txt {* We have to show that @{text h} is additive. *} + assumes M: "M = norm_pres_extensions E p F f" + and cM: "c \ chain M" + and u: "graph H h = \c" + shows "linearform H h" +proof + fix x y assume x: "x \ H" and y: "y \ H" + with M cM u obtain H' h' where + x': "x \ H'" and y': "y \ H'" + and b: "graph H' h' \ graph H h" + and linearform: "linearform H' h'" + and subspace: "H' \ E" + by (rule some_H'h'2 [elim_format]) blast - thus "h (x + y) = h x + h y" - proof (elim exE conjE) - fix H' h' assume "x \ H'" "y \ H'" - and b: "graph H' h' \ graph H h" - and "is_linearform H' h'" "is_subspace H' E" - have "h' (x + y) = h' x + h' y" - by (rule linearform_add) - also have "h' x = h x" .. - also have "h' y = h y" .. - also have "x + y \ H'" .. - with b have "h' (x + y) = h (x + y)" .. - finally show ?thesis . - qed - next - fix a x assume "x \ H" - have "\H' h'. x \ H' \ graph H' h' \ graph H h - \ is_linearform H' h' \ is_subspace H' E - \ is_subspace F H' \ graph F f \ graph H' h' - \ (\x \ H'. h' x \ p x)" - by (rule some_H'h') + show "h (x + y) = h x + h y" + proof - + from linearform x' y' have "h' (x + y) = h' x + h' y" + by (rule linearform.add) + also from b x' have "h' x = h x" .. + also from b y' have "h' y = h y" .. + also from subspace x' y' have "x + y \ H'" + by (rule subspace.add_closed) + with b have "h' (x + y) = h (x + y)" .. + finally show ?thesis . + qed +next + fix x a assume x: "x \ H" + with M cM u obtain H' h' where + x': "x \ H'" + and b: "graph H' h' \ graph H h" + and linearform: "linearform H' h'" + and subspace: "H' \ E" + by (rule some_H'h' [elim_format]) blast - txt{* We have to show that @{text h} is multiplicative. *} - - thus "h (a \ x) = a * h x" - proof (elim exE conjE) - fix H' h' assume "x \ H'" - and b: "graph H' h' \ graph H h" - and "is_linearform H' h'" "is_subspace H' E" - have "h' (a \ x) = a * h' x" - by (rule linearform_mult) - also have "h' x = h x" .. - also have "a \ x \ H'" .. - with b have "h' (a \ x) = h (a \ x)" .. - finally show ?thesis . - qed + show "h (a \ x) = a * h x" + proof - + from linearform x' have "h' (a \ x) = a * h' x" + by (rule linearform.mult) + also from b x' have "h' x = h x" .. + also from subspace x' have "a \ x \ H'" + by (rule subspace.mult_closed) + with b have "h' (a \ x) = h (a \ x)" .. + finally show ?thesis . qed qed @@ -321,37 +263,22 @@ *} lemma sup_ext: - "graph H h = \c \ M = norm_pres_extensions E p F f \ - c \ chain M \ \x. x \ c \ graph F f \ graph H h" + assumes graph: "graph H h = \c" + and M: "M = norm_pres_extensions E p F f" + and cM: "c \ chain M" + and ex: "\x. x \ c" + shows "graph F f \ graph H h" proof - - assume "M = norm_pres_extensions E p F f" "c \ chain M" - "graph H h = \c" - assume "\x. x \ c" - thus ?thesis - proof - fix x assume "x \ c" - have "c \ M" by (rule chainD2) - hence "x \ M" .. - hence "x \ norm_pres_extensions E p F f" by (simp!) - - hence "\G g. graph G g = x - \ is_linearform G g - \ is_subspace G E - \ is_subspace F G - \ graph F f \ graph G g - \ (\x \ G. g x \ p x)" - by (simp! add: norm_pres_extension_D) - - thus ?thesis - proof (elim exE conjE) - fix G g assume "graph F f \ graph G g" - also assume "graph G g = x" - also have "... \ c" . - hence "x \ \c" by fast - also have [symmetric]: "graph H h = \c" . - finally show ?thesis . - qed - qed + from ex obtain x where xc: "x \ c" .. + from cM have "c \ M" .. + with xc have "x \ M" .. + with M have "x \ norm_pres_extensions E p F f" + by (simp only:) + then obtain G g where "x = graph G g" and "graph F f \ graph G g" .. + then have "graph F f \ x" by (simp only:) + also from xc have "\ \ \c" by blast + also from graph have "\ = graph H h" .. + finally show ?thesis . qed text {* @@ -362,32 +289,21 @@ *} lemma sup_supF: - "graph H h = \c \ M = norm_pres_extensions E p F f \ - c \ chain M \ \x. x \ c \ is_subspace F E \ is_vectorspace E - \ is_subspace F H" -proof - - assume "M = norm_pres_extensions E p F f" "c \ chain M" "\x. x \ c" - "graph H h = \c" "is_subspace F E" "is_vectorspace E" - - show ?thesis - proof - show "0 \ F" .. - show "F \ H" - proof (rule graph_extD2) - show "graph F f \ graph H h" - by (rule sup_ext) - qed - show "\x \ F. \y \ F. x + y \ F" - proof (intro ballI) - fix x y assume "x \ F" "y \ F" - show "x + y \ F" by (simp!) - qed - show "\x \ F. \a. a \ x \ F" - proof (intro ballI allI) - fix x a assume "x\F" - show "a \ x \ F" by (simp!) - qed - qed + assumes graph: "graph H h = \c" + and M: "M = norm_pres_extensions E p F f" + and cM: "c \ chain M" + and ex: "\x. x \ c" + and FE: "F \ E" + shows "F \ H" +proof + from FE show "F \ {}" by (rule subspace.non_empty) + from graph M cM ex have "graph F f \ graph H h" by (rule sup_ext) + then show "F \ H" .. + fix x y assume "x \ F" and "y \ F" + with FE show "x + y \ F" by (rule subspace.add_closed) +next + fix x a assume "x \ F" + with FE show "a \ x \ F" by (rule subspace.mult_closed) qed text {* @@ -396,81 +312,53 @@ *} lemma sup_subE: - "graph H h = \c \ M = norm_pres_extensions E p F f \ - c \ chain M \ \x. x \ c \ is_subspace F E \ is_vectorspace E - \ is_subspace H E" -proof - - assume "M = norm_pres_extensions E p F f" "c \ chain M" "\x. x \ c" - "graph H h = \c" "is_subspace F E" "is_vectorspace E" - show ?thesis + assumes graph: "graph H h = \c" + and M: "M = norm_pres_extensions E p F f" + and cM: "c \ chain M" + and ex: "\x. x \ c" + and FE: "F \ E" + and E: "vectorspace E" + shows "H \ E" +proof + show "H \ {}" + proof - + from FE E have "0 \ F" by (rule subvectorspace.zero) + also from graph M cM ex FE have "F \ H" by (rule sup_supF) + then have "F \ H" .. + finally show ?thesis by blast + qed + show "H \ E" proof - - txt {* The @{text 0} element is in @{text H}, as @{text F} is a - subset of @{text H}: *} - - have "0 \ F" .. - also have "is_subspace F H" by (rule sup_supF) - hence "F \ H" .. - finally show "0 \ H" . - - txt {* @{text H} is a subset of @{text E}: *} - - show "H \ E" - proof - fix x assume "x \ H" - have "\H' h'. x \ H' \ graph H' h' \ graph H h - \ is_linearform H' h' \ is_subspace H' E - \ is_subspace F H' \ graph F f \ graph H' h' - \ (\x \ H'. h' x \ p x)" - by (rule some_H'h') - thus "x \ E" - proof (elim exE conjE) - fix H' h' assume "x \ H'" "is_subspace H' E" - have "H' \ E" .. - thus "x \ E" .. - qed - qed - - txt {* @{text H} is closed under addition: *} - - show "\x \ H. \y \ H. x + y \ H" - proof (intro ballI) - fix x y assume "x \ H" "y \ H" - have "\H' h'. x \ H' \ y \ H' \ graph H' h' \ graph H h - \ is_linearform H' h' \ is_subspace H' E - \ is_subspace F H' \ graph F f \ graph H' h' - \ (\x \ H'. h' x \ p x)" - by (rule some_H'h'2) - thus "x + y \ H" - proof (elim exE conjE) - fix H' h' - assume "x \ H'" "y \ H'" "is_subspace H' E" - "graph H' h' \ graph H h" - have "x + y \ H'" .. - also have "H' \ H" .. - finally show ?thesis . - qed - qed - - txt {* @{text H} is closed under scalar multiplication: *} - - show "\x \ H. \a. a \ x \ H" - proof (intro ballI allI) - fix x a assume "x \ H" - have "\H' h'. x \ H' \ graph H' h' \ graph H h - \ is_linearform H' h' \ is_subspace H' E - \ is_subspace F H' \ graph F f \ graph H' h' - \ (\x \ H'. h' x \ p x)" - by (rule some_H'h') - thus "a \ x \ H" - proof (elim exE conjE) - fix H' h' - assume "x \ H'" "is_subspace H' E" "graph H' h' \ graph H h" - have "a \ x \ H'" .. - also have "H' \ H" .. - finally show ?thesis . - qed - qed + fix x assume "x \ H" + with M cM graph + obtain H' h' where x: "x \ H'" and H'E: "H' \ E" + by (rule some_H'h' [elim_format]) blast + from H'E have "H' \ E" .. + with x show "x \ E" .. + qed + fix x y assume x: "x \ H" and y: "y \ H" + show "x + y \ H" + proof - + from M cM graph x y obtain H' h' where + x': "x \ H'" and y': "y \ H'" and H'E: "H' \ E" + and graphs: "graph H' h' \ graph H h" + by (rule some_H'h'2 [elim_format]) blast + from H'E x' y' have "x + y \ H'" + by (rule subspace.add_closed) + also from graphs have "H' \ H" .. + finally show ?thesis . + qed +next + fix x a assume x: "x \ H" + show "a \ x \ H" + proof - + from M cM graph x + obtain H' h' where x': "x \ H'" and H'E: "H' \ E" + and graphs: "graph H' h' \ graph H h" + by (rule some_H'h' [elim_format]) blast + from H'E x' have "a \ x \ H'" by (rule subspace.mult_closed) + also from graphs have "H' \ H" .. + finally show ?thesis . qed qed @@ -480,28 +368,21 @@ *} lemma sup_norm_pres: - "graph H h = \c \ M = norm_pres_extensions E p F f \ - c \ chain M \ \x \ H. h x \ p x" + assumes graph: "graph H h = \c" + and M: "M = norm_pres_extensions E p F f" + and cM: "c \ chain M" + shows "\x \ H. h x \ p x" proof - assume "M = norm_pres_extensions E p F f" "c \ chain M" - "graph H h = \c" fix x assume "x \ H" - have "\H' h'. x \ H' \ graph H' h' \ graph H h - \ is_linearform H' h' \ is_subspace H' E \ is_subspace F H' - \ graph F f \ graph H' h' \ (\x \ H'. h' x \ p x)" - by (rule some_H'h') - thus "h x \ p x" - proof (elim exE conjE) - fix H' h' - assume "x \ H'" "graph H' h' \ graph H h" + with M cM graph obtain H' h' where x': "x \ H'" + and graphs: "graph H' h' \ graph H h" and a: "\x \ H'. h' x \ p x" - have [symmetric]: "h' x = h x" .. - also from a have "h' x \ p x " .. - finally show ?thesis . - qed + by (rule some_H'h' [elim_format]) blast + from graphs x' have [symmetric]: "h' x = h x" .. + also from a x' have "h' x \ p x " .. + finally show "h x \ p x" . qed - text {* \medskip The following lemma is a property of linear forms on real vector spaces. It will be used for the lemma @{text abs_HahnBanach} @@ -516,45 +397,41 @@ *} lemma abs_ineq_iff: - "is_subspace H E \ is_vectorspace E \ is_seminorm E p \ - is_linearform H h - \ (\x \ H. \h x\ \ p x) = (\x \ H. h x \ p x)" - (concl is "?L = ?R") -proof - - assume "is_subspace H E" "is_vectorspace E" "is_seminorm E p" - "is_linearform H h" - have h: "is_vectorspace H" .. - show ?thesis - proof + includes subvectorspace H E + seminorm E p + linearform H h + shows "(\x \ H. \h x\ \ p x) = (\x \ H. h x \ p x)" (is "?L = ?R") +proof + have h: "vectorspace H" by (rule vectorspace) + { assume l: ?L show ?R proof fix x assume x: "x \ H" - have "h x \ \h x\" by (rule abs_ge_self) - also from l have "... \ p x" .. + have "h x \ \h x\" by arith + also from l x have "\ \ p x" .. finally show "h x \ p x" . qed next assume r: ?R show ?L proof - fix x assume "x \ H" + fix x assume x: "x \ H" show "\a b :: real. - a \ b \ b \ a \ \b\ \ a" by arith show "- p x \ h x" proof (rule real_minus_le) - from h have "- h x = h (- x)" - by (rule linearform_neg [symmetric]) - also from r have "... \ p (- x)" by (simp!) - also have "... = p x" - proof (rule seminorm_minus) + have "linearform H h" . + from h this x have "- h x = h (- x)" + by (rule vectorspace_linearform.neg [symmetric]) + also from r x have "\ \ p (- x)" by simp + also have "\ = p x" + proof (rule seminorm_vectorspace.minus) show "x \ E" .. qed finally show "- h x \ p x" . qed - from r show "h x \ p x" .. + from r x show "h x \ p x" .. qed - qed + } qed end diff -r cc3bbaf1b8d3 -r a6a7025fd7e8 src/HOL/Real/HahnBanach/Linearform.thy --- a/src/HOL/Real/HahnBanach/Linearform.thy Thu Aug 22 12:28:41 2002 +0200 +++ b/src/HOL/Real/HahnBanach/Linearform.thy Thu Aug 22 20:49:43 2002 +0200 @@ -12,60 +12,43 @@ that is additive and multiplicative. *} -constdefs - is_linearform :: "'a::{plus, minus, zero} set \ ('a \ real) \ bool" - "is_linearform V f \ - (\x \ V. \y \ V. f (x + y) = f x + f y) \ - (\x \ V. \a. f (a \ x) = a * (f x))" +locale linearform = var V + var f + + assumes add [iff]: "x \ V \ y \ V \ f (x + y) = f x + f y" + and mult [iff]: "x \ V \ f (a \ x) = a * f x" -lemma is_linearformI [intro]: - "(\x y. x \ V \ y \ V \ f (x + y) = f x + f y) \ - (\x c. x \ V \ f (c \ x) = c * f x) - \ is_linearform V f" - by (unfold is_linearform_def) blast +locale (open) vectorspace_linearform = + vectorspace + linearform -lemma linearform_add [intro?]: - "is_linearform V f \ x \ V \ y \ V \ f (x + y) = f x + f y" - by (unfold is_linearform_def) blast - -lemma linearform_mult [intro?]: - "is_linearform V f \ x \ V \ f (a \ x) = a * (f x)" - by (unfold is_linearform_def) blast - -lemma linearform_neg [intro?]: - "is_vectorspace V \ is_linearform V f \ x \ V - \ f (- x) = - f x" +lemma (in vectorspace_linearform) neg [iff]: + "x \ V \ f (- x) = - f x" proof - - assume "is_linearform V f" "is_vectorspace V" "x \ V" - have "f (- x) = f ((- 1) \ x)" by (simp! add: negate_eq1) - also have "... = (- 1) * (f x)" by (rule linearform_mult) - also have "... = - (f x)" by (simp!) + assume x: "x \ V" + hence "f (- x) = f ((- 1) \ x)" by (simp add: negate_eq1) + also from x have "... = (- 1) * (f x)" by (rule mult) + also from x have "... = - (f x)" by simp finally show ?thesis . qed -lemma linearform_diff [intro?]: - "is_vectorspace V \ is_linearform V f \ x \ V \ y \ V - \ f (x - y) = f x - f y" +lemma (in vectorspace_linearform) diff [iff]: + "x \ V \ y \ V \ f (x - y) = f x - f y" proof - - assume "is_vectorspace V" "is_linearform V f" "x \ V" "y \ V" - have "f (x - y) = f (x + - y)" by (simp! only: diff_eq1) - also have "... = f x + f (- y)" - by (rule linearform_add) (simp!)+ - also have "f (- y) = - f y" by (rule linearform_neg) - finally show "f (x - y) = f x - f y" by (simp!) + assume x: "x \ V" and y: "y \ V" + hence "x - y = x + - y" by (rule diff_eq1) + also have "f ... = f x + f (- y)" + by (rule add) (simp_all add: x y) + also from y have "f (- y) = - f y" by (rule neg) + finally show ?thesis by simp qed text {* Every linear form yields @{text 0} for the @{text 0} vector. *} -lemma linearform_zero [intro?, simp]: - "is_vectorspace V \ is_linearform V f \ f 0 = 0" +lemma (in vectorspace_linearform) linearform_zero [iff]: + "f 0 = 0" proof - - assume "is_vectorspace V" "is_linearform V f" - have "f 0 = f (0 - 0)" by (simp!) - also have "... = f 0 - f 0" - by (rule linearform_diff) (simp!)+ - also have "... = 0" by simp - finally show "f 0 = 0" . + have "f 0 = f (0 - 0)" by simp + also have "\ = f 0 - f 0" by (rule diff) simp_all + also have "\ = 0" by simp + finally show ?thesis . qed end diff -r cc3bbaf1b8d3 -r a6a7025fd7e8 src/HOL/Real/HahnBanach/NormedSpace.thy --- a/src/HOL/Real/HahnBanach/NormedSpace.thy Thu Aug 22 12:28:41 2002 +0200 +++ b/src/HOL/Real/HahnBanach/NormedSpace.thy Thu Aug 22 20:49:43 2002 +0200 @@ -15,59 +15,40 @@ definite, absolute homogenous and subadditive. *} -constdefs - is_seminorm :: "'a::{plus, minus, zero} set \ ('a \ real) \ bool" - "is_seminorm V norm \ \x \ V. \y \ V. \a. - 0 \ norm x - \ norm (a \ x) = \a\ * norm x - \ norm (x + y) \ norm x + norm y" +locale norm_syntax = + fixes norm :: "'a \ real" ("\_\") -lemma is_seminormI [intro]: - "(\x y a. x \ V \ y \ V \ 0 \ norm x) \ - (\x a. x \ V \ norm (a \ x) = \a\ * norm x) \ - (\x y. x \ V \ y \ V \ norm (x + y) \ norm x + norm y) - \ is_seminorm V norm" - by (unfold is_seminorm_def) auto +locale seminorm = var V + norm_syntax + + assumes ge_zero [iff?]: "x \ V \ 0 \ \x\" + and abs_homogenous [iff?]: "x \ V \ \a \ x\ = \a\ * \x\" + and subadditive [iff?]: "x \ V \ y \ V \ \x + y\ \ \x\ + \y\" -lemma seminorm_ge_zero [intro?]: - "is_seminorm V norm \ x \ V \ 0 \ norm x" - by (unfold is_seminorm_def) blast +locale (open) seminorm_vectorspace = + seminorm + vectorspace -lemma seminorm_abs_homogenous: - "is_seminorm V norm \ x \ V - \ norm (a \ x) = \a\ * norm x" - by (unfold is_seminorm_def) blast - -lemma seminorm_subadditive: - "is_seminorm V norm \ x \ V \ y \ V - \ norm (x + y) \ norm x + norm y" - by (unfold is_seminorm_def) blast - -lemma seminorm_diff_subadditive: - "is_seminorm V norm \ x \ V \ y \ V \ is_vectorspace V - \ norm (x - y) \ norm x + norm y" +lemma (in seminorm_vectorspace) diff_subadditive: + "x \ V \ y \ V \ \x - y\ \ \x\ + \y\" proof - - assume "is_seminorm V norm" "x \ V" "y \ V" "is_vectorspace V" - have "norm (x - y) = norm (x + - 1 \ y)" - by (simp! add: diff_eq2 negate_eq2a) - also have "... \ norm x + norm (- 1 \ y)" - by (simp! add: seminorm_subadditive) - also have "norm (- 1 \ y) = \- 1\ * norm y" - by (rule seminorm_abs_homogenous) - also have "\- 1\ = (1::real)" by (rule abs_minus_one) - finally show "norm (x - y) \ norm x + norm y" by simp + assume x: "x \ V" and y: "y \ V" + hence "x - y = x + - 1 \ y" + by (simp add: diff_eq2 negate_eq2a) + also from x y have "\\\ \ \x\ + \- 1 \ y\" + by (simp add: subadditive) + also from y have "\- 1 \ y\ = \- 1\ * \y\" + by (rule abs_homogenous) + also have "\ = \y\" by simp + finally show ?thesis . qed -lemma seminorm_minus: - "is_seminorm V norm \ x \ V \ is_vectorspace V - \ norm (- x) = norm x" +lemma (in seminorm_vectorspace) minus: + "x \ V \ \- x\ = \x\" proof - - assume "is_seminorm V norm" "x \ V" "is_vectorspace V" - have "norm (- x) = norm (- 1 \ x)" by (simp! only: negate_eq1) - also have "... = \- 1\ * norm x" - by (rule seminorm_abs_homogenous) - also have "\- 1\ = (1::real)" by (rule abs_minus_one) - finally show "norm (- x) = norm x" by simp + assume x: "x \ V" + hence "- x = - 1 \ x" by (simp only: negate_eq1) + also from x have "\\\ = \- 1\ * \x\" + by (rule abs_homogenous) + also have "\ = \x\" by simp + finally show ?thesis . qed @@ -78,110 +59,46 @@ @{text 0} vector to @{text 0}. *} -constdefs - is_norm :: "'a::{plus, minus, zero} set \ ('a \ real) \ bool" - "is_norm V norm \ \x \ V. is_seminorm V norm - \ (norm x = 0) = (x = 0)" - -lemma is_normI [intro]: - "\x \ V. is_seminorm V norm \ (norm x = 0) = (x = 0) - \ is_norm V norm" by (simp only: is_norm_def) - -lemma norm_is_seminorm [intro?]: - "is_norm V norm \ x \ V \ is_seminorm V norm" - by (unfold is_norm_def) blast - -lemma norm_zero_iff: - "is_norm V norm \ x \ V \ (norm x = 0) = (x = 0)" - by (unfold is_norm_def) blast - -lemma norm_ge_zero [intro?]: - "is_norm V norm \ x \ V \ 0 \ norm x" - by (unfold is_norm_def is_seminorm_def) blast +locale norm = seminorm + + assumes zero_iff [iff]: "x \ V \ (\x\ = 0) = (x = 0)" subsection {* Normed vector spaces *} -text{* A vector space together with a norm is called -a \emph{normed space}. *} - -constdefs - is_normed_vectorspace :: - "'a::{plus, minus, zero} set \ ('a \ real) \ bool" - "is_normed_vectorspace V norm \ - is_vectorspace V \ is_norm V norm" +text {* + A vector space together with a norm is called a \emph{normed + space}. +*} -lemma normed_vsI [intro]: - "is_vectorspace V \ is_norm V norm - \ is_normed_vectorspace V norm" - by (unfold is_normed_vectorspace_def) blast - -lemma normed_vs_vs [intro?]: - "is_normed_vectorspace V norm \ is_vectorspace V" - by (unfold is_normed_vectorspace_def) blast +locale normed_vectorspace = vectorspace + seminorm_vectorspace + norm -lemma normed_vs_norm [intro?]: - "is_normed_vectorspace V norm \ is_norm V norm" - by (unfold is_normed_vectorspace_def) blast - -lemma normed_vs_norm_ge_zero [intro?]: - "is_normed_vectorspace V norm \ x \ V \ 0 \ norm x" - by (unfold is_normed_vectorspace_def) (fast elim: norm_ge_zero) - -lemma normed_vs_norm_gt_zero [intro?]: - "is_normed_vectorspace V norm \ x \ V \ x \ 0 \ 0 < norm x" -proof (unfold is_normed_vectorspace_def, elim conjE) - assume "x \ V" "x \ 0" "is_vectorspace V" "is_norm V norm" - have "0 \ norm x" .. - also have "0 \ norm x" +lemma (in normed_vectorspace) gt_zero [intro?]: + "x \ V \ x \ 0 \ 0 < \x\" +proof - + assume x: "x \ V" and neq: "x \ 0" + from x have "0 \ \x\" .. + also have [symmetric]: "\ \ 0" proof - presume "norm x = 0" - also have "?this = (x = 0)" by (rule norm_zero_iff) - finally have "x = 0" . - thus "False" by contradiction - qed (rule sym) - finally show "0 < norm x" . + assume "\x\ = 0" + with x have "x = 0" by simp + with neq show False by contradiction + qed + finally show ?thesis . qed -lemma normed_vs_norm_abs_homogenous [intro?]: - "is_normed_vectorspace V norm \ x \ V - \ norm (a \ x) = \a\ * norm x" - by (rule seminorm_abs_homogenous, rule norm_is_seminorm, - rule normed_vs_norm) - -lemma normed_vs_norm_subadditive [intro?]: - "is_normed_vectorspace V norm \ x \ V \ y \ V - \ norm (x + y) \ norm x + norm y" - by (rule seminorm_subadditive, rule norm_is_seminorm, - rule normed_vs_norm) - -text{* Any subspace of a normed vector space is again a -normed vectorspace.*} +text {* + Any subspace of a normed vector space is again a normed vectorspace. +*} lemma subspace_normed_vs [intro?]: - "is_vectorspace E \ is_subspace F E \ - is_normed_vectorspace E norm \ is_normed_vectorspace F norm" -proof (rule normed_vsI) - assume "is_subspace F E" "is_vectorspace E" - "is_normed_vectorspace E norm" - show "is_vectorspace F" .. - show "is_norm F norm" - proof (intro is_normI ballI conjI) - show "is_seminorm F norm" - proof - fix x y a presume "x \ E" - show "0 \ norm x" .. - show "norm (a \ x) = \a\ * norm x" .. - presume "y \ E" - show "norm (x + y) \ norm x + norm y" .. - qed (simp!)+ - - fix x assume "x \ F" - show "(norm x = 0) = (x = 0)" - proof (rule norm_zero_iff) - show "is_norm E norm" .. - qed (simp!) - qed + includes subvectorspace F E + normed_vectorspace E + shows "normed_vectorspace F norm" +proof + show "vectorspace F" by (rule vectorspace) + have "seminorm E norm" . with subset show "seminorm F norm" + by (simp add: seminorm_def) + have "norm_axioms E norm" . with subset show "norm_axioms F norm" + by (simp add: norm_axioms_def) qed end diff -r cc3bbaf1b8d3 -r a6a7025fd7e8 src/HOL/Real/HahnBanach/Subspace.thy --- a/src/HOL/Real/HahnBanach/Subspace.thy Thu Aug 22 12:28:41 2002 +0200 +++ b/src/HOL/Real/HahnBanach/Subspace.thy Thu Aug 22 20:49:43 2002 +0200 @@ -16,122 +16,109 @@ and scalar multiplication. *} -constdefs - is_subspace :: "'a::{plus, minus, zero} set \ 'a set \ bool" - "is_subspace U V \ U \ {} \ U \ V - \ (\x \ U. \y \ U. \a. x + y \ U \ a \ x \ U)" +locale subspace = var U + var V + + assumes non_empty [iff, intro]: "U \ {}" + and subset [iff]: "U \ V" + and add_closed [iff]: "x \ U \ y \ U \ x + y \ U" + and mult_closed [iff]: "x \ U \ a \ x \ U" -lemma subspaceI [intro]: - "0 \ U \ U \ V \ \x \ U. \y \ U. (x + y \ U) \ - \x \ U. \a. a \ x \ U - \ is_subspace U V" -proof (unfold is_subspace_def, intro conjI) - assume "0 \ U" thus "U \ {}" by fast -qed (simp+) +syntax (symbols) + subspace :: "'a set \ 'a set \ bool" (infix "\" 50) -lemma subspace_not_empty [intro?]: "is_subspace U V \ U \ {}" - by (unfold is_subspace_def) blast +lemma subspace_subset [elim]: "U \ V \ U \ V" + by (rule subspace.subset) -lemma subspace_subset [intro?]: "is_subspace U V \ U \ V" - by (unfold is_subspace_def) blast +lemma (in subspace) subsetD [iff]: "x \ U \ x \ V" + using subset by blast -lemma subspace_subsetD [simp, intro?]: - "is_subspace U V \ x \ U \ x \ V" - by (unfold is_subspace_def) blast +lemma subspaceD [elim]: "U \ V \ x \ U \ x \ V" + by (rule subspace.subsetD) -lemma subspace_add_closed [simp, intro?]: - "is_subspace U V \ x \ U \ y \ U \ x + y \ U" - by (unfold is_subspace_def) blast +lemma rev_subspaceD [elim?]: "x \ U \ U \ V \ x \ V" + by (rule subspace.subsetD) + -lemma subspace_mult_closed [simp, intro?]: - "is_subspace U V \ x \ U \ a \ x \ U" - by (unfold is_subspace_def) blast +locale (open) subvectorspace = + subspace + vectorspace -lemma subspace_diff_closed [simp, intro?]: - "is_subspace U V \ is_vectorspace V \ x \ U \ y \ U - \ x - y \ U" +lemma (in subvectorspace) diff_closed [iff]: + "x \ U \ y \ U \ x - y \ U" by (simp add: diff_eq1 negate_eq1) -text {* Similar as for linear spaces, the existence of the -zero element in every subspace follows from the non-emptiness -of the carrier set and by vector space laws.*} -lemma zero_in_subspace [intro?]: - "is_subspace U V \ is_vectorspace V \ 0 \ U" +text {* + \medskip Similar as for linear spaces, the existence of the zero + element in every subspace follows from the non-emptiness of the + carrier set and by vector space laws. +*} + +lemma (in subvectorspace) zero [intro]: "0 \ U" proof - - assume "is_subspace U V" and v: "is_vectorspace V" - have "U \ {}" .. - hence "\x. x \ U" by blast - thus ?thesis - proof - fix x assume u: "x \ U" - hence "x \ V" by (simp!) - with v have "0 = x - x" by (simp!) - also have "... \ U" by (rule subspace_diff_closed) - finally show ?thesis . - qed + have "U \ {}" by (rule U_V.non_empty) + then obtain x where x: "x \ U" by blast + hence "x \ V" .. hence "0 = x - x" by simp + also have "... \ U" by (rule U_V.diff_closed) + finally show ?thesis . qed -lemma subspace_neg_closed [simp, intro?]: - "is_subspace U V \ is_vectorspace V \ x \ U \ - x \ U" +lemma (in subvectorspace) neg_closed [iff]: "x \ U \ - x \ U" by (simp add: negate_eq1) + text {* \medskip Further derived laws: every subspace is a vector space. *} -lemma subspace_vs [intro?]: - "is_subspace U V \ is_vectorspace V \ is_vectorspace U" -proof - - assume "is_subspace U V" "is_vectorspace V" - show ?thesis - proof - show "0 \ U" .. - show "\x \ U. \a. a \ x \ U" by (simp!) - show "\x \ U. \y \ U. x + y \ U" by (simp!) - show "\x \ U. - x = - 1 \ x" by (simp! add: negate_eq1) - show "\x \ U. \y \ U. x - y = x + - y" - by (simp! add: diff_eq1) - qed (simp! add: vs_add_mult_distrib1 vs_add_mult_distrib2)+ +lemma (in subvectorspace) vectorspace [iff]: + "vectorspace U" +proof + show "U \ {}" .. + fix x y z assume x: "x \ U" and y: "y \ U" and z: "z \ U" + fix a b :: real + from x y show "x + y \ U" by simp + from x show "a \ x \ U" by simp + from x y z show "(x + y) + z = x + (y + z)" by (simp add: add_ac) + from x y show "x + y = y + x" by (simp add: add_ac) + from x show "x - x = 0" by simp + from x show "0 + x = x" by simp + from x y show "a \ (x + y) = a \ x + a \ y" by (simp add: distrib) + from x show "(a + b) \ x = a \ x + b \ x" by (simp add: distrib) + from x show "(a * b) \ x = a \ b \ x" by (simp add: mult_assoc) + from x show "1 \ x = x" by simp + from x show "- x = - 1 \ x" by (simp add: negate_eq1) + from x y show "x - y = x + - y" by (simp add: diff_eq1) qed + text {* The subspace relation is reflexive. *} -lemma subspace_refl [intro]: "is_vectorspace V \ is_subspace V V" +lemma (in vectorspace) subspace_refl [intro]: "V \ V" proof - assume "is_vectorspace V" - show "0 \ V" .. + show "V \ {}" .. show "V \ V" .. - show "\x \ V. \y \ V. x + y \ V" by (simp!) - show "\x \ V. \a. a \ x \ V" by (simp!) + fix x y assume x: "x \ V" and y: "y \ V" + fix a :: real + from x y show "x + y \ V" by simp + from x show "a \ x \ V" by simp qed text {* The subspace relation is transitive. *} -lemma subspace_trans: - "is_subspace U V \ is_vectorspace V \ is_subspace V W - \ is_subspace U W" +lemma (in vectorspace) subspace_trans [trans]: + "U \ V \ V \ W \ U \ W" proof - assume "is_subspace U V" "is_subspace V W" "is_vectorspace V" - show "0 \ U" .. - - have "U \ V" .. - also have "V \ W" .. - finally show "U \ W" . - - show "\x \ U. \y \ U. x + y \ U" - proof (intro ballI) - fix x y assume "x \ U" "y \ U" - show "x + y \ U" by (simp!) + assume uv: "U \ V" and vw: "V \ W" + from uv show "U \ {}" by (rule subspace.non_empty) + show "U \ W" + proof - + from uv have "U \ V" by (rule subspace.subset) + also from vw have "V \ W" by (rule subspace.subset) + finally show ?thesis . qed - - show "\x \ U. \a. a \ x \ U" - proof (intro ballI allI) - fix x a assume "x \ U" - show "a \ x \ U" by (simp!) - qed + fix x y assume x: "x \ U" and y: "y \ U" + from uv and x y show "x + y \ U" by (rule subspace.add_closed) + from uv and x show "\a. a \ x \ U" by (rule subspace.mult_closed) qed - subsection {* Linear closure *} text {* @@ -140,73 +127,75 @@ *} constdefs - lin :: "('a::{minus,plus,zero}) \ 'a set" + lin :: "('a::{minus, plus, zero}) \ 'a set" "lin x \ {a \ x | a. True}" -lemma linD: "(x \ lin v) = (\a::real. x = a \ v)" - by (unfold lin_def) fast +lemma linI [intro]: "y = a \ x \ y \ lin x" + by (unfold lin_def) blast -lemma linI [intro?]: "a \ x0 \ lin x0" - by (unfold lin_def) fast +lemma linI' [iff]: "a \ x \ lin x" + by (unfold lin_def) blast + +lemma linE [elim]: + "x \ lin v \ (\a::real. x = a \ v \ C) \ C" + by (unfold lin_def) blast + text {* Every vector is contained in its linear closure. *} -lemma x_lin_x: "is_vectorspace V \ x \ V \ x \ lin x" -proof (unfold lin_def, intro CollectI exI conjI) - assume "is_vectorspace V" "x \ V" - show "x = 1 \ x" by (simp!) -qed simp +lemma (in vectorspace) x_lin_x [iff]: "x \ V \ x \ lin x" +proof - + assume "x \ V" + hence "x = 1 \ x" by simp + also have "\ \ lin x" .. + finally show ?thesis . +qed + +lemma (in vectorspace) "0_lin_x" [iff]: "x \ V \ 0 \ lin x" +proof + assume "x \ V" + thus "0 = 0 \ x" by simp +qed text {* Any linear closure is a subspace. *} -lemma lin_subspace [intro?]: - "is_vectorspace V \ x \ V \ is_subspace (lin x) V" +lemma (in vectorspace) lin_subspace [intro]: + "x \ V \ lin x \ V" proof - assume "is_vectorspace V" "x \ V" - show "0 \ lin x" - proof (unfold lin_def, intro CollectI exI conjI) - show "0 = (0::real) \ x" by (simp!) - qed simp - + assume x: "x \ V" + thus "lin x \ {}" by (auto simp add: x_lin_x) show "lin x \ V" - proof (unfold lin_def, intro subsetI, elim CollectE exE conjE) - fix xa a assume "xa = a \ x" - show "xa \ V" by (simp!) + proof + fix x' assume "x' \ lin x" + then obtain a where "x' = a \ x" .. + with x show "x' \ V" by simp qed - - show "\x1 \ lin x. \x2 \ lin x. x1 + x2 \ lin x" - proof (intro ballI) - fix x1 x2 assume "x1 \ lin x" "x2 \ lin x" - thus "x1 + x2 \ lin x" - proof (unfold lin_def, elim CollectE exE conjE, - intro CollectI exI conjI) - fix a1 a2 assume "x1 = a1 \ x" "x2 = a2 \ x" - show "x1 + x2 = (a1 + a2) \ x" - by (simp! add: vs_add_mult_distrib2) - qed simp + fix x' x'' assume x': "x' \ lin x" and x'': "x'' \ lin x" + show "x' + x'' \ lin x" + proof - + from x' obtain a' where "x' = a' \ x" .. + moreover from x'' obtain a'' where "x'' = a'' \ x" .. + ultimately have "x' + x'' = (a' + a'') \ x" + using x by (simp add: distrib) + also have "\ \ lin x" .. + finally show ?thesis . qed - - show "\xa \ lin x. \a. a \ xa \ lin x" - proof (intro ballI allI) - fix x1 a assume "x1 \ lin x" - thus "a \ x1 \ lin x" - proof (unfold lin_def, elim CollectE exE conjE, - intro CollectI exI conjI) - fix a1 assume "x1 = a1 \ x" - show "a \ x1 = (a * a1) \ x" by (simp!) - qed simp + fix a :: real + show "a \ x' \ lin x" + proof - + from x' obtain a' where "x' = a' \ x" .. + with x have "a \ x' = (a * a') \ x" by (simp add: mult_assoc) + also have "\ \ lin x" .. + finally show ?thesis . qed qed + text {* Any linear closure is a vector space. *} -lemma lin_vs [intro?]: - "is_vectorspace V \ x \ V \ is_vectorspace (lin x)" -proof (rule subspace_vs) - assume "is_vectorspace V" "x \ V" - show "is_subspace (lin x) V" .. -qed - +lemma (in vectorspace) lin_vectorspace [intro]: + "x \ V \ vectorspace (lin x)" + by (rule subvectorspace.vectorspace) (rule lin_subspace) subsection {* Sum of two vectorspaces *} @@ -219,101 +208,92 @@ instance set :: (plus) plus .. defs (overloaded) - vs_sum_def: "U + V \ {u + v | u v. u \ U \ v \ V}" + sum_def: "U + V \ {u + v | u v. u \ U \ v \ V}" -lemma vs_sumD: - "(x \ U + V) = (\u \ U. \v \ V. x = u + v)" - by (unfold vs_sum_def) fast +lemma sumE [elim]: + "x \ U + V \ (\u v. x = u + v \ u \ U \ v \ V \ C) \ C" + by (unfold sum_def) blast -lemmas vs_sumE = vs_sumD [THEN iffD1, elim_format, standard] +lemma sumI [intro]: + "u \ U \ v \ V \ x = u + v \ x \ U + V" + by (unfold sum_def) blast -lemma vs_sumI [intro?]: - "x \ U \ y \ V \ t = x + y \ t \ U + V" - by (unfold vs_sum_def) fast +lemma sumI' [intro]: + "u \ U \ v \ V \ u + v \ U + V" + by (unfold sum_def) blast text {* @{text U} is a subspace of @{text "U + V"}. *} -lemma subspace_vs_sum1 [intro?]: - "is_vectorspace U \ is_vectorspace V - \ is_subspace U (U + V)" +lemma subspace_sum1 [iff]: + includes vectorspace U + vectorspace V + shows "U \ U + V" proof - assume "is_vectorspace U" "is_vectorspace V" - show "0 \ U" .. + show "U \ {}" .. show "U \ U + V" - proof (intro subsetI vs_sumI) - fix x assume "x \ U" - show "x = x + 0" by (simp!) - show "0 \ V" by (simp!) + proof + fix x assume x: "x \ U" + moreover have "0 \ V" .. + ultimately have "x + 0 \ U + V" .. + with x show "x \ U + V" by simp qed - show "\x \ U. \y \ U. x + y \ U" - proof (intro ballI) - fix x y assume "x \ U" "y \ U" show "x + y \ U" by (simp!) - qed - show "\x \ U. \a. a \ x \ U" - proof (intro ballI allI) - fix x a assume "x \ U" show "a \ x \ U" by (simp!) - qed + fix x y assume x: "x \ U" and "y \ U" + thus "x + y \ U" by simp + from x show "\a. a \ x \ U" by simp qed -text{* The sum of two subspaces is again a subspace.*} +text {* The sum of two subspaces is again a subspace. *} -lemma vs_sum_subspace [intro?]: - "is_subspace U E \ is_subspace V E \ is_vectorspace E - \ is_subspace (U + V) E" +lemma sum_subspace [intro?]: + includes subvectorspace U E + subvectorspace V E + shows "U + V \ E" proof - assume "is_subspace U E" "is_subspace V E" "is_vectorspace E" - show "0 \ U + V" - proof (intro vs_sumI) + have "0 \ U + V" + proof show "0 \ U" .. show "0 \ V" .. - show "(0::'a) = 0 + 0" by (simp!) + show "(0::'a) = 0 + 0" by simp qed - + thus "U + V \ {}" by blast show "U + V \ E" - proof (intro subsetI, elim vs_sumE bexE) - fix x u v assume "u \ U" "v \ V" "x = u + v" - show "x \ E" by (simp!) + proof + fix x assume "x \ U + V" + then obtain u v where x: "x = u + v" and + u: "u \ U" and v: "v \ V" .. + have "U \ E" . with u have "u \ E" .. + moreover have "V \ E" . with v have "v \ E" .. + ultimately show "x \ E" using x by simp qed - - show "\x \ U + V. \y \ U + V. x + y \ U + V" - proof (intro ballI) - fix x y assume "x \ U + V" "y \ U + V" - thus "x + y \ U + V" - proof (elim vs_sumE bexE, intro vs_sumI) - fix ux vx uy vy - assume "ux \ U" "vx \ V" "x = ux + vx" - and "uy \ U" "vy \ V" "y = uy + vy" - show "x + y = (ux + uy) + (vx + vy)" by (simp!) - qed (simp_all!) + fix x y assume x: "x \ U + V" and y: "y \ U + V" + show "x + y \ U + V" + proof - + from x obtain ux vx where "x = ux + vx" and "ux \ U" and "vx \ V" .. + moreover + from y obtain uy vy where "y = uy + vy" and "uy \ U" and "vy \ V" .. + ultimately + have "ux + uy \ U" + and "vx + vy \ V" + and "x + y = (ux + uy) + (vx + vy)" + using x y by (simp_all add: add_ac) + thus ?thesis .. qed - - show "\x \ U + V. \a. a \ x \ U + V" - proof (intro ballI allI) - fix x a assume "x \ U + V" - thus "a \ x \ U + V" - proof (elim vs_sumE bexE, intro vs_sumI) - fix a x u v assume "u \ U" "v \ V" "x = u + v" - show "a \ x = (a \ u) + (a \ v)" - by (simp! add: vs_add_mult_distrib1) - qed (simp_all!) + fix a show "a \ x \ U + V" + proof - + from x obtain u v where "x = u + v" and "u \ U" and "v \ V" .. + hence "a \ u \ U" and "a \ v \ V" + and "a \ x = (a \ u) + (a \ v)" by (simp_all add: distrib) + thus ?thesis .. qed qed text{* The sum of two subspaces is a vectorspace. *} -lemma vs_sum_vs [intro?]: - "is_subspace U E \ is_subspace V E \ is_vectorspace E - \ is_vectorspace (U + V)" -proof (rule subspace_vs) - assume "is_subspace U E" "is_subspace V E" "is_vectorspace E" - show "is_subspace (U + V) E" .. -qed - +lemma sum_vs [intro?]: + "U \ E \ V \ E \ vectorspace E \ vectorspace (U + V)" + by (rule subvectorspace.vectorspace) (rule sum_subspace) subsection {* Direct sums *} - text {* The sum of @{text U} and @{text V} is called \emph{direct}, iff the zero element is the only common element of @{text U} and @{text @@ -323,31 +303,35 @@ *} lemma decomp: - "is_vectorspace E \ is_subspace U E \ is_subspace V E \ - U \ V = {0} \ u1 \ U \ u2 \ U \ v1 \ V \ v2 \ V \ - u1 + v1 = u2 + v2 \ u1 = u2 \ v1 = v2" + includes vectorspace E + subspace U E + subspace V E + assumes direct: "U \ V = {0}" + and u1: "u1 \ U" and u2: "u2 \ U" + and v1: "v1 \ V" and v2: "v2 \ V" + and sum: "u1 + v1 = u2 + v2" + shows "u1 = u2 \ v1 = v2" proof - assume "is_vectorspace E" "is_subspace U E" "is_subspace V E" - "U \ V = {0}" "u1 \ U" "u2 \ U" "v1 \ V" "v2 \ V" - "u1 + v1 = u2 + v2" - have eq: "u1 - u2 = v2 - v1" by (simp! add: vs_add_diff_swap) - have u: "u1 - u2 \ U" by (simp!) - with eq have v': "v2 - v1 \ U" by simp - have v: "v2 - v1 \ V" by (simp!) - with eq have u': "u1 - u2 \ V" by simp + have U: "vectorspace U" by (rule subvectorspace.vectorspace) + have V: "vectorspace V" by (rule subvectorspace.vectorspace) + from u1 u2 v1 v2 and sum have eq: "u1 - u2 = v2 - v1" + by (simp add: add_diff_swap) + from u1 u2 have u: "u1 - u2 \ U" + by (rule vectorspace.diff_closed [OF U]) + with eq have v': "v2 - v1 \ U" by (simp only:) + from v2 v1 have v: "v2 - v1 \ V" + by (rule vectorspace.diff_closed [OF V]) + with eq have u': " u1 - u2 \ V" by (simp only:) show "u1 = u2" - proof (rule vs_add_minus_eq) - show "u1 - u2 = 0" by (rule Int_singletonD [OF _ u u']) + proof (rule add_minus_eq) show "u1 \ E" .. show "u2 \ E" .. + from u u' and direct show "u1 - u2 = 0" by blast qed - show "v1 = v2" - proof (rule vs_add_minus_eq [symmetric]) - show "v2 - v1 = 0" by (rule Int_singletonD [OF _ v' v]) + proof (rule add_minus_eq [symmetric]) show "v1 \ E" .. show "v2 \ E" .. + from v v' and direct show "v2 - v1 = 0" by blast qed qed @@ -361,58 +345,48 @@ *} lemma decomp_H': - "is_vectorspace E \ is_subspace H E \ y1 \ H \ y2 \ H \ - x' \ H \ x' \ E \ x' \ 0 \ y1 + a1 \ x' = y2 + a2 \ x' - \ y1 = y2 \ a1 = a2" + includes vectorspace E + subvectorspace H E + assumes y1: "y1 \ H" and y2: "y2 \ H" + and x': "x' \ H" "x' \ E" "x' \ 0" + and eq: "y1 + a1 \ x' = y2 + a2 \ x'" + shows "y1 = y2 \ a1 = a2" proof - assume "is_vectorspace E" and h: "is_subspace H E" - and "y1 \ H" "y2 \ H" "x' \ H" "x' \ E" "x' \ 0" - "y1 + a1 \ x' = y2 + a2 \ x'" - have c: "y1 = y2 \ a1 \ x' = a2 \ x'" proof (rule decomp) show "a1 \ x' \ lin x'" .. show "a2 \ x' \ lin x'" .. - show "H \ (lin x') = {0}" + show "H \ lin x' = {0}" proof show "H \ lin x' \ {0}" - proof (intro subsetI, elim IntE, rule singleton_iff [THEN iffD2]) - fix x assume "x \ H" "x \ lin x'" - thus "x = 0" - proof (unfold lin_def, elim CollectE exE conjE) - fix a assume "x = a \ x'" - show ?thesis - proof cases - assume "a = (0::real)" show ?thesis by (simp!) - next - assume "a \ (0::real)" - from h have "inverse a \ a \ x' \ H" - by (rule subspace_mult_closed) (simp!) - also have "inverse a \ a \ x' = x'" by (simp!) - finally have "x' \ H" . - thus ?thesis by contradiction - qed - qed + proof + fix x assume x: "x \ H \ lin x'" + then obtain a where xx': "x = a \ x'" + by blast + have "x = 0" + proof cases + assume "a = 0" + with xx' and x' show ?thesis by simp + next + assume a: "a \ 0" + from x have "x \ H" .. + with xx' have "inverse a \ a \ x' \ H" by simp + with a and x' have "x' \ H" by (simp add: mult_assoc2) + thus ?thesis by contradiction + qed + thus "x \ {0}" .. qed show "{0} \ H \ lin x'" proof - - have "0 \ H \ lin x'" - proof (rule IntI) - show "0 \ H" .. - from lin_vs show "0 \ lin x'" .. - qed - thus ?thesis by simp + have "0 \ H" .. + moreover have "0 \ lin x'" .. + ultimately show ?thesis by blast qed qed - show "is_subspace (lin x') E" .. + show "lin x' \ E" .. qed - - from c show "y1 = y2" by simp - - show "a1 = a2" - proof (rule vs_mult_right_cancel [THEN iffD1]) - from c show "a1 \ x' = a2 \ x'" by simp - qed + thus "y1 = y2" .. + from c have "a1 \ x' = a2 \ x'" .. + with x' show "a1 = a2" by (simp add: mult_right_cancel) qed text {* @@ -423,18 +397,20 @@ *} lemma decomp_H'_H: - "is_vectorspace E \ is_subspace H E \ t \ H \ x' \ H \ x' \ E - \ x' \ 0 - \ (SOME (y, a). t = y + a \ x' \ y \ H) = (t, (0::real))" -proof (rule, unfold split_tupled_all) - assume "is_vectorspace E" "is_subspace H E" "t \ H" "x' \ H" "x' \ E" - "x' \ 0" - have h: "is_vectorspace H" .. - fix y a presume t1: "t = y + a \ x'" and "y \ H" - have "y = t \ a = (0::real)" - by (rule decomp_H') (auto!) - thus "(y, a) = (t, (0::real))" by (simp!) -qed (simp_all!) + includes vectorspace E + subvectorspace H E + assumes t: "t \ H" + and x': "x' \ H" "x' \ E" "x' \ 0" + shows "(SOME (y, a). t = y + a \ x' \ y \ H) = (t, 0)" +proof (rule, simp_all only: split_paired_all split_conv) + from t x' show "t = t + 0 \ x' \ t \ H" by simp + fix y and a assume ya: "t = y + a \ x' \ y \ H" + have "y = t \ a = 0" + proof (rule decomp_H') + from ya x' show "y + a \ x' = t + 0 \ x'" by simp + from ya show "y \ H" .. + qed + with t x' show "(y, a) = (y + a \ x', 0)" by simp +qed text {* The components @{text "y \ H"} and @{text a} in @{text "y + a \ x'"} @@ -443,42 +419,41 @@ *} lemma h'_definite: - "h' \ (\x. let (y, a) = SOME (y, a). (x = y + a \ x' \ y \ H) - in (h y) + a * xi) \ - x = y + a \ x' \ is_vectorspace E \ is_subspace H E \ - y \ H \ x' \ H \ x' \ E \ x' \ 0 - \ h' x = h y + a * xi" + includes var H + assumes h'_def: + "h' \ (\x. let (y, a) = SOME (y, a). (x = y + a \ x' \ y \ H) + in (h y) + a * xi)" + and x: "x = y + a \ x'" + includes vectorspace E + subvectorspace H E + assumes y: "y \ H" + and x': "x' \ H" "x' \ E" "x' \ 0" + shows "h' x = h y + a * xi" proof - - assume - "h' \ (\x. let (y, a) = SOME (y, a). (x = y + a \ x' \ y \ H) - in (h y) + a * xi)" - "x = y + a \ x'" "is_vectorspace E" "is_subspace H E" - "y \ H" "x' \ H" "x' \ E" "x' \ 0" - hence "x \ H + (lin x')" - by (auto simp add: vs_sum_def lin_def) - have "\! xa. ((\(y, a). x = y + a \ x' \ y \ H) xa)" + from x y x' have "x \ H + lin x'" by auto + have "\!p. (\(y, a). x = y + a \ x' \ y \ H) p" (is "\!p. ?P p") proof - show "\xa. ((\(y, a). x = y + a \ x' \ y \ H) xa)" - by (blast!) - next - fix xa ya - assume "(\(y,a). x = y + a \ x' \ y \ H) xa" - "(\(y,a). x = y + a \ x' \ y \ H) ya" - show "xa = ya" + from x y show "\p. ?P p" by blast + fix p q assume p: "?P p" and q: "?P q" + show "p = q" proof - - show "fst xa = fst ya \ snd xa = snd ya \ xa = ya" - by (simp add: Pair_fst_snd_eq) - have x: "x = fst xa + snd xa \ x' \ fst xa \ H" - by (auto!) - have y: "x = fst ya + snd ya \ x' \ fst ya \ H" - by (auto!) - from x y show "fst xa = fst ya \ snd xa = snd ya" - by (elim conjE) (rule decomp_H', (simp!)+) + from p have xp: "x = fst p + snd p \ x' \ fst p \ H" + by (cases p) simp + from q have xq: "x = fst q + snd q \ x' \ fst q \ H" + by (cases q) simp + have "fst p = fst q \ snd p = snd q" + proof (rule decomp_H') + from xp show "fst p \ H" .. + from xq show "fst q \ H" .. + from xp and xq show "fst p + snd p \ x' = fst q + snd q \ x'" + by simp + apply_end assumption+ + qed + thus ?thesis by (cases p, cases q) simp qed qed hence eq: "(SOME (y, a). x = y + a \ x' \ y \ H) = (y, a)" - by (rule some1_equality) (blast!) - thus "h' x = h y + a * xi" by (simp! add: Let_def) + by (rule some1_equality) (simp add: x y) + with h'_def show "h' x = h y + a * xi" by (simp add: Let_def) qed end diff -r cc3bbaf1b8d3 -r a6a7025fd7e8 src/HOL/Real/HahnBanach/VectorSpace.thy --- a/src/HOL/Real/HahnBanach/VectorSpace.thy Thu Aug 22 12:28:41 2002 +0200 +++ b/src/HOL/Real/HahnBanach/VectorSpace.thy Thu Aug 22 20:49:43 2002 +0200 @@ -5,7 +5,7 @@ header {* Vector spaces *} -theory VectorSpace = Bounds + Aux: +theory VectorSpace = Aux: subsection {* Signature *} @@ -35,459 +35,379 @@ the neutral element of scalar multiplication. *} -constdefs - is_vectorspace :: "('a::{plus, minus, zero}) set \ bool" - "is_vectorspace V \ V \ {} - \ (\x \ V. \y \ V. \z \ V. \a b. - x + y \ V - \ a \ x \ V - \ (x + y) + z = x + (y + z) - \ x + y = y + x - \ x - x = 0 - \ 0 + x = x - \ a \ (x + y) = a \ x + a \ y - \ (a + b) \ x = a \ x + b \ x - \ (a * b) \ x = a \ b \ x - \ 1 \ x = x - \ - x = (- 1) \ x - \ x - y = x + - y)" - - -text {* \medskip The corresponding introduction rule is:*} - -lemma vsI [intro]: - "0 \ V \ - \x \ V. \y \ V. x + y \ V \ - \x \ V. \a. a \ x \ V \ - \x \ V. \y \ V. \z \ V. (x + y) + z = x + (y + z) \ - \x \ V. \y \ V. x + y = y + x \ - \x \ V. x - x = 0 \ - \x \ V. 0 + x = x \ - \x \ V. \y \ V. \a. a \ (x + y) = a \ x + a \ y \ - \x \ V. \a b. (a + b) \ x = a \ x + b \ x \ - \x \ V. \a b. (a * b) \ x = a \ b \ x \ - \x \ V. 1 \ x = x \ - \x \ V. - x = (- 1) \ x \ - \x \ V. \y \ V. x - y = x + - y \ is_vectorspace V" - by (unfold is_vectorspace_def) auto +locale vectorspace = var V + + assumes non_empty [iff, intro?]: "V \ {}" + and add_closed [iff]: "x \ V \ y \ V \ x + y \ V" + and mult_closed [iff]: "x \ V \ a \ x \ V" + and add_assoc: "x \ V \ y \ V \ z \ V \ (x + y) + z = x + (y + z)" + and add_commute: "x \ V \ y \ V \ x + y = y + x" + and diff_self [simp]: "x \ V \ x - x = 0" + and add_zero_left [simp]: "x \ V \ 0 + x = x" + and add_mult_distrib1: "x \ V \ y \ V \ a \ (x + y) = a \ x + a \ y" + and add_mult_distrib2: "x \ V \ (a + b) \ x = a \ x + b \ x" + and mult_assoc: "x \ V \ (a * b) \ x = a \ (b \ x)" + and mult_1 [simp]: "x \ V \ 1 \ x = x" + and negate_eq1: "x \ V \ - x = (- 1) \ x" + and diff_eq1: "x \ V \ y \ V \ x - y = x + - y" -text {* \medskip The corresponding destruction rules are: *} - -lemma negate_eq1: - "is_vectorspace V \ x \ V \ - x = (- 1) \ x" - by (unfold is_vectorspace_def) simp - -lemma diff_eq1: - "is_vectorspace V \ x \ V \ y \ V \ x - y = x + - y" - by (unfold is_vectorspace_def) simp - -lemma negate_eq2: - "is_vectorspace V \ x \ V \ (- 1) \ x = - x" - by (unfold is_vectorspace_def) simp - -lemma negate_eq2a: - "is_vectorspace V \ x \ V \ -1 \ x = - x" - by (unfold is_vectorspace_def) simp +lemma (in vectorspace) negate_eq2: "x \ V \ (- 1) \ x = - x" + by (rule negate_eq1 [symmetric]) -lemma diff_eq2: - "is_vectorspace V \ x \ V \ y \ V \ x + - y = x - y" - by (unfold is_vectorspace_def) simp - -lemma vs_not_empty [intro?]: "is_vectorspace V \ (V \ {})" - by (unfold is_vectorspace_def) simp +lemma (in vectorspace) negate_eq2a: "x \ V \ -1 \ x = - x" + by (simp add: negate_eq1) -lemma vs_add_closed [simp, intro?]: - "is_vectorspace V \ x \ V \ y \ V \ x + y \ V" - by (unfold is_vectorspace_def) simp +lemma (in vectorspace) diff_eq2: "x \ V \ y \ V \ x + - y = x - y" + by (rule diff_eq1 [symmetric]) -lemma vs_mult_closed [simp, intro?]: - "is_vectorspace V \ x \ V \ a \ x \ V" - by (unfold is_vectorspace_def) simp - -lemma vs_diff_closed [simp, intro?]: - "is_vectorspace V \ x \ V \ y \ V \ x - y \ V" +lemma (in vectorspace) diff_closed [iff]: "x \ V \ y \ V \ x - y \ V" by (simp add: diff_eq1 negate_eq1) -lemma vs_neg_closed [simp, intro?]: - "is_vectorspace V \ x \ V \ - x \ V" +lemma (in vectorspace) neg_closed [iff]: "x \ V \ - x \ V" by (simp add: negate_eq1) -lemma vs_add_assoc [simp]: - "is_vectorspace V \ x \ V \ y \ V \ z \ V - \ (x + y) + z = x + (y + z)" - by (unfold is_vectorspace_def) blast - -lemma vs_add_commute [simp]: - "is_vectorspace V \ x \ V \ y \ V \ y + x = x + y" - by (unfold is_vectorspace_def) blast - -lemma vs_add_left_commute [simp]: - "is_vectorspace V \ x \ V \ y \ V \ z \ V - \ x + (y + z) = y + (x + z)" +lemma (in vectorspace) add_left_commute: + "x \ V \ y \ V \ z \ V \ x + (y + z) = y + (x + z)" proof - - assume "is_vectorspace V" "x \ V" "y \ V" "z \ V" + assume xyz: "x \ V" "y \ V" "z \ V" hence "x + (y + z) = (x + y) + z" - by (simp only: vs_add_assoc) - also have "... = (y + x) + z" by (simp! only: vs_add_commute) - also have "... = y + (x + z)" by (simp! only: vs_add_assoc) + by (simp only: add_assoc) + also from xyz have "... = (y + x) + z" by (simp only: add_commute) + also from xyz have "... = y + (x + z)" by (simp only: add_assoc) finally show ?thesis . qed -theorems vs_add_ac = vs_add_assoc vs_add_commute vs_add_left_commute +theorems (in vectorspace) add_ac = + add_assoc add_commute add_left_commute -lemma vs_diff_self [simp]: - "is_vectorspace V \ x \ V \ x - x = 0" - by (unfold is_vectorspace_def) simp text {* The existence of the zero element of a vector space -follows from the non-emptiness of carrier set. *} + follows from the non-emptiness of carrier set. *} -lemma zero_in_vs [simp, intro]: "is_vectorspace V \ 0 \ V" +lemma (in vectorspace) zero [iff]: "0 \ V" proof - - assume "is_vectorspace V" - have "V \ {}" .. - then obtain x where "x \ V" by blast - have "0 = x - x" by (simp!) - also have "... \ V" by (simp! only: vs_diff_closed) + from non_empty obtain x where x: "x \ V" by blast + then have "0 = x - x" by (rule diff_self [symmetric]) + also from x have "... \ V" by (rule diff_closed) finally show ?thesis . qed -lemma vs_add_zero_left [simp]: - "is_vectorspace V \ x \ V \ 0 + x = x" - by (unfold is_vectorspace_def) simp - -lemma vs_add_zero_right [simp]: - "is_vectorspace V \ x \ V \ x + 0 = x" +lemma (in vectorspace) add_zero_right [simp]: + "x \ V \ x + 0 = x" proof - - assume "is_vectorspace V" "x \ V" - hence "x + 0 = 0 + x" by simp - also have "... = x" by (simp!) + assume x: "x \ V" + from this and zero have "x + 0 = 0 + x" by (rule add_commute) + also from x have "... = x" by (rule add_zero_left) finally show ?thesis . qed -lemma vs_add_mult_distrib1: - "is_vectorspace V \ x \ V \ y \ V - \ a \ (x + y) = a \ x + a \ y" - by (unfold is_vectorspace_def) simp +lemma (in vectorspace) mult_assoc2: + "x \ V \ a \ b \ x = (a * b) \ x" + by (simp only: mult_assoc) -lemma vs_add_mult_distrib2: - "is_vectorspace V \ x \ V - \ (a + b) \ x = a \ x + b \ x" - by (unfold is_vectorspace_def) simp - -lemma vs_mult_assoc: - "is_vectorspace V \ x \ V \ (a * b) \ x = a \ (b \ x)" - by (unfold is_vectorspace_def) simp - -lemma vs_mult_assoc2 [simp]: - "is_vectorspace V \ x \ V \ a \ b \ x = (a * b) \ x" - by (simp only: vs_mult_assoc) +lemma (in vectorspace) diff_mult_distrib1: + "x \ V \ y \ V \ a \ (x - y) = a \ x - a \ y" + by (simp add: diff_eq1 negate_eq1 add_mult_distrib1 mult_assoc2) -lemma vs_mult_1 [simp]: - "is_vectorspace V \ x \ V \ 1 \ x = x" - by (unfold is_vectorspace_def) simp - -lemma vs_diff_mult_distrib1: - "is_vectorspace V \ x \ V \ y \ V - \ a \ (x - y) = a \ x - a \ y" - by (simp add: diff_eq1 negate_eq1 vs_add_mult_distrib1) - -lemma vs_diff_mult_distrib2: - "is_vectorspace V \ x \ V - \ (a - b) \ x = a \ x - (b \ x)" +lemma (in vectorspace) diff_mult_distrib2: + "x \ V \ (a - b) \ x = a \ x - (b \ x)" proof - - assume "is_vectorspace V" "x \ V" + assume x: "x \ V" have " (a - b) \ x = (a + - b) \ x" - by (unfold real_diff_def, simp) + by (simp add: real_diff_def) also have "... = a \ x + (- b) \ x" - by (rule vs_add_mult_distrib2) - also have "... = a \ x + - (b \ x)" - by (simp! add: negate_eq1) - also have "... = a \ x - (b \ x)" - by (simp! add: diff_eq1) + by (rule add_mult_distrib2) + also from x have "... = a \ x + - (b \ x)" + by (simp add: negate_eq1 mult_assoc2) + also from x have "... = a \ x - (b \ x)" + by (simp add: diff_eq1) finally show ?thesis . qed +lemmas (in vectorspace) distrib = + add_mult_distrib1 add_mult_distrib2 + diff_mult_distrib1 diff_mult_distrib2 + text {* \medskip Further derived laws: *} -lemma vs_mult_zero_left [simp]: - "is_vectorspace V \ x \ V \ 0 \ x = 0" +lemma (in vectorspace) mult_zero_left [simp]: + "x \ V \ 0 \ x = 0" proof - - assume "is_vectorspace V" "x \ V" - have "0 \ x = (1 - 1) \ x" by simp + assume x: "x \ V" + have "0 \ x = (1 - 1) \ x" by simp also have "... = (1 + - 1) \ x" by simp also have "... = 1 \ x + (- 1) \ x" - by (rule vs_add_mult_distrib2) - also have "... = x + (- 1) \ x" by (simp!) - also have "... = x + - x" by (simp! add: negate_eq2a) - also have "... = x - x" by (simp! add: diff_eq2) - also have "... = 0" by (simp!) + by (rule add_mult_distrib2) + also from x have "... = x + (- 1) \ x" by simp + also from x have "... = x + - x" by (simp add: negate_eq2a) + also from x have "... = x - x" by (simp add: diff_eq2) + also from x have "... = 0" by simp finally show ?thesis . qed -lemma vs_mult_zero_right [simp]: - "is_vectorspace (V:: 'a::{plus, minus, zero} set) - \ a \ 0 = (0::'a)" +lemma (in vectorspace) mult_zero_right [simp]: + "a \ 0 = (0::'a)" proof - - assume "is_vectorspace V" - have "a \ 0 = a \ (0 - (0::'a))" by (simp!) + have "a \ 0 = a \ (0 - (0::'a))" by simp also have "... = a \ 0 - a \ 0" - by (rule vs_diff_mult_distrib1) (simp!)+ - also have "... = 0" by (simp!) + by (rule diff_mult_distrib1) simp_all + also have "... = 0" by simp finally show ?thesis . qed -lemma vs_minus_mult_cancel [simp]: - "is_vectorspace V \ x \ V \ (- a) \ - x = a \ x" - by (simp add: negate_eq1) +lemma (in vectorspace) minus_mult_cancel [simp]: + "x \ V \ (- a) \ - x = a \ x" + by (simp add: negate_eq1 mult_assoc2) -lemma vs_add_minus_left_eq_diff: - "is_vectorspace V \ x \ V \ y \ V \ - x + y = y - x" +lemma (in vectorspace) add_minus_left_eq_diff: + "x \ V \ y \ V \ - x + y = y - x" proof - - assume "is_vectorspace V" "x \ V" "y \ V" - hence "- x + y = y + - x" - by (simp add: vs_add_commute) - also have "... = y - x" by (simp! add: diff_eq1) + assume xy: "x \ V" "y \ V" + hence "- x + y = y + - x" by (simp add: add_commute) + also from xy have "... = y - x" by (simp add: diff_eq1) finally show ?thesis . qed -lemma vs_add_minus [simp]: - "is_vectorspace V \ x \ V \ x + - x = 0" - by (simp! add: diff_eq2) +lemma (in vectorspace) add_minus [simp]: + "x \ V \ x + - x = 0" + by (simp add: diff_eq2) -lemma vs_add_minus_left [simp]: - "is_vectorspace V \ x \ V \ - x + x = 0" - by (simp! add: diff_eq2) +lemma (in vectorspace) add_minus_left [simp]: + "x \ V \ - x + x = 0" + by (simp add: diff_eq2 add_commute) -lemma vs_minus_minus [simp]: - "is_vectorspace V \ x \ V \ - (- x) = x" +lemma (in vectorspace) minus_minus [simp]: + "x \ V \ - (- x) = x" + by (simp add: negate_eq1 mult_assoc2) + +lemma (in vectorspace) minus_zero [simp]: + "- (0::'a) = 0" by (simp add: negate_eq1) -lemma vs_minus_zero [simp]: - "is_vectorspace (V::'a::{plus, minus, zero} set) \ - (0::'a) = 0" - by (simp add: negate_eq1) - -lemma vs_minus_zero_iff [simp]: - "is_vectorspace V \ x \ V \ (- x = 0) = (x = 0)" - (concl is "?L = ?R") -proof - - assume "is_vectorspace V" "x \ V" - show "?L = ?R" - proof - have "x = - (- x)" by (simp! add: vs_minus_minus) - also assume ?L - also have "- ... = 0" by (rule vs_minus_zero) - finally show ?R . - qed (simp!) +lemma (in vectorspace) minus_zero_iff [simp]: + "x \ V \ (- x = 0) = (x = 0)" +proof + assume x: "x \ V" + { + from x have "x = - (- x)" by (simp add: minus_minus) + also assume "- x = 0" + also have "- ... = 0" by (rule minus_zero) + finally show "x = 0" . + next + assume "x = 0" + then show "- x = 0" by simp + } qed -lemma vs_add_minus_cancel [simp]: - "is_vectorspace V \ x \ V \ y \ V \ x + (- x + y) = y" - by (simp add: vs_add_assoc [symmetric] del: vs_add_commute) +lemma (in vectorspace) add_minus_cancel [simp]: + "x \ V \ y \ V \ x + (- x + y) = y" + by (simp add: add_assoc [symmetric] del: add_commute) -lemma vs_minus_add_cancel [simp]: - "is_vectorspace V \ x \ V \ y \ V \ - x + (x + y) = y" - by (simp add: vs_add_assoc [symmetric] del: vs_add_commute) +lemma (in vectorspace) minus_add_cancel [simp]: + "x \ V \ y \ V \ - x + (x + y) = y" + by (simp add: add_assoc [symmetric] del: add_commute) -lemma vs_minus_add_distrib [simp]: - "is_vectorspace V \ x \ V \ y \ V - \ - (x + y) = - x + - y" - by (simp add: negate_eq1 vs_add_mult_distrib1) +lemma (in vectorspace) minus_add_distrib [simp]: + "x \ V \ y \ V \ - (x + y) = - x + - y" + by (simp add: negate_eq1 add_mult_distrib1) -lemma vs_diff_zero [simp]: - "is_vectorspace V \ x \ V \ x - 0 = x" +lemma (in vectorspace) diff_zero [simp]: + "x \ V \ x - 0 = x" + by (simp add: diff_eq1) + +lemma (in vectorspace) diff_zero_right [simp]: + "x \ V \ 0 - x = - x" by (simp add: diff_eq1) -lemma vs_diff_zero_right [simp]: - "is_vectorspace V \ x \ V \ 0 - x = - x" - by (simp add:diff_eq1) - -lemma vs_add_left_cancel: - "is_vectorspace V \ x \ V \ y \ V \ z \ V - \ (x + y = x + z) = (y = z)" - (concl is "?L = ?R") +lemma (in vectorspace) add_left_cancel: + "x \ V \ y \ V \ z \ V \ (x + y = x + z) = (y = z)" proof - assume "is_vectorspace V" "x \ V" "y \ V" "z \ V" - have "y = 0 + y" by (simp!) - also have "... = - x + x + y" by (simp!) - also have "... = - x + (x + y)" - by (simp! only: vs_add_assoc vs_neg_closed) - also assume "x + y = x + z" - also have "- x + (x + z) = - x + x + z" - by (simp! only: vs_add_assoc [symmetric] vs_neg_closed) - also have "... = z" by (simp!) - finally show ?R . -qed blast + assume x: "x \ V" and y: "y \ V" and z: "z \ V" + { + from y have "y = 0 + y" by simp + also from x y have "... = (- x + x) + y" by simp + also from x y have "... = - x + (x + y)" + by (simp add: add_assoc neg_closed) + also assume "x + y = x + z" + also from x z have "- x + (x + z) = - x + x + z" + by (simp add: add_assoc [symmetric] neg_closed) + also from x z have "... = z" by simp + finally show "y = z" . + next + assume "y = z" + then show "x + y = x + z" by (simp only:) + } +qed -lemma vs_add_right_cancel: - "is_vectorspace V \ x \ V \ y \ V \ z \ V - \ (y + x = z + x) = (y = z)" - by (simp only: vs_add_commute vs_add_left_cancel) +lemma (in vectorspace) add_right_cancel: + "x \ V \ y \ V \ z \ V \ (y + x = z + x) = (y = z)" + by (simp only: add_commute add_left_cancel) -lemma vs_add_assoc_cong: - "is_vectorspace V \ x \ V \ y \ V \ x' \ V \ y' \ V \ z \ V - \ x + y = x' + y' \ x + (y + z) = x' + (y' + z)" - by (simp only: vs_add_assoc [symmetric]) +lemma (in vectorspace) add_assoc_cong: + "x \ V \ y \ V \ x' \ V \ y' \ V \ z \ V + \ x + y = x' + y' \ x + (y + z) = x' + (y' + z)" + by (simp only: add_assoc [symmetric]) -lemma vs_mult_left_commute: - "is_vectorspace V \ x \ V \ y \ V \ z \ V - \ x \ y \ z = y \ x \ z" - by (simp add: real_mult_commute) +lemma (in vectorspace) mult_left_commute: + "x \ V \ a \ b \ x = b \ a \ x" + by (simp add: real_mult_commute mult_assoc2) -lemma vs_mult_zero_uniq: - "is_vectorspace V \ x \ V \ x \ 0 \ a \ x = 0 \ a = 0" +lemma (in vectorspace) mult_zero_uniq: + "x \ V \ x \ 0 \ a \ x = 0 \ a = 0" proof (rule classical) - assume "is_vectorspace V" "x \ V" "a \ x = 0" "x \ 0" - assume "a \ 0" - have "x = (inverse a * a) \ x" by (simp!) - also have "... = inverse a \ (a \ x)" by (rule vs_mult_assoc) - also have "... = inverse a \ 0" by (simp!) - also have "... = 0" by (simp!) + assume a: "a \ 0" + assume x: "x \ V" "x \ 0" and ax: "a \ x = 0" + from x a have "x = (inverse a * a) \ x" by simp + also have "... = inverse a \ (a \ x)" by (rule mult_assoc) + also from ax have "... = inverse a \ 0" by simp + also have "... = 0" by simp finally have "x = 0" . thus "a = 0" by contradiction qed -lemma vs_mult_left_cancel: - "is_vectorspace V \ x \ V \ y \ V \ a \ 0 \ - (a \ x = a \ y) = (x = y)" - (concl is "?L = ?R") +lemma (in vectorspace) mult_left_cancel: + "x \ V \ y \ V \ a \ 0 \ (a \ x = a \ y) = (x = y)" proof - assume "is_vectorspace V" "x \ V" "y \ V" "a \ 0" - have "x = 1 \ x" by (simp!) - also have "... = (inverse a * a) \ x" by (simp!) - also have "... = inverse a \ (a \ x)" - by (simp! only: vs_mult_assoc) - also assume ?L - also have "inverse a \ ... = y" by (simp!) - finally show ?R . -qed simp + assume x: "x \ V" and y: "y \ V" and a: "a \ 0" + from x have "x = 1 \ x" by simp + also from a have "... = (inverse a * a) \ x" by simp + also from x have "... = inverse a \ (a \ x)" + by (simp only: mult_assoc) + also assume "a \ x = a \ y" + also from a y have "inverse a \ ... = y" + by (simp add: mult_assoc2) + finally show "x = y" . +next + assume "x = y" + then show "a \ x = a \ y" by (simp only:) +qed -lemma vs_mult_right_cancel: (*** forward ***) - "is_vectorspace V \ x \ V \ x \ 0 - \ (a \ x = b \ x) = (a = b)" (concl is "?L = ?R") +lemma (in vectorspace) mult_right_cancel: + "x \ V \ x \ 0 \ (a \ x = b \ x) = (a = b)" proof - assume v: "is_vectorspace V" "x \ V" "x \ 0" - have "(a - b) \ x = a \ x - b \ x" - by (simp! add: vs_diff_mult_distrib2) - also assume ?L hence "a \ x - b \ x = 0" by (simp!) - finally have "(a - b) \ x = 0" . - from v this have "a - b = 0" by (rule vs_mult_zero_uniq) - thus "a = b" by simp -qed simp + assume x: "x \ V" and neq: "x \ 0" + { + from x have "(a - b) \ x = a \ x - b \ x" + by (simp add: diff_mult_distrib2) + also assume "a \ x = b \ x" + with x have "a \ x - b \ x = 0" by simp + finally have "(a - b) \ x = 0" . + with x neq have "a - b = 0" by (rule mult_zero_uniq) + thus "a = b" by simp + next + assume "a = b" + then show "a \ x = b \ x" by (simp only:) + } +qed -lemma vs_eq_diff_eq: - "is_vectorspace V \ x \ V \ y \ V \ z \ V \ - (x = z - y) = (x + y = z)" - (concl is "?L = ?R" ) -proof - - assume vs: "is_vectorspace V" "x \ V" "y \ V" "z \ V" - show "?L = ?R" - proof - assume ?L +lemma (in vectorspace) eq_diff_eq: + "x \ V \ y \ V \ z \ V \ (x = z - y) = (x + y = z)" +proof + assume x: "x \ V" and y: "y \ V" and z: "z \ V" + { + assume "x = z - y" hence "x + y = z - y + y" by simp - also have "... = z + - y + y" by (simp! add: diff_eq1) + also from y z have "... = z + - y + y" + by (simp add: diff_eq1) also have "... = z + (- y + y)" - by (rule vs_add_assoc) (simp!)+ - also from vs have "... = z + 0" - by (simp only: vs_add_minus_left) - also from vs have "... = z" by (simp only: vs_add_zero_right) - finally show ?R . + by (rule add_assoc) (simp_all add: y z) + also from y z have "... = z + 0" + by (simp only: add_minus_left) + also from z have "... = z" + by (simp only: add_zero_right) + finally show "x + y = z" . next - assume ?R + assume "x + y = z" hence "z - y = (x + y) - y" by simp - also from vs have "... = x + y + - y" + also from x y have "... = x + y + - y" by (simp add: diff_eq1) also have "... = x + (y + - y)" - by (rule vs_add_assoc) (simp!)+ - also have "... = x" by (simp!) - finally show ?L by (rule sym) - qed + by (rule add_assoc) (simp_all add: x y) + also from x y have "... = x" by simp + finally show "x = z - y" .. + } qed -lemma vs_add_minus_eq_minus: - "is_vectorspace V \ x \ V \ y \ V \ x + y = 0 \ x = - y" +lemma (in vectorspace) add_minus_eq_minus: + "x \ V \ y \ V \ x + y = 0 \ x = - y" proof - - assume "is_vectorspace V" "x \ V" "y \ V" - have "x = (- y + y) + x" by (simp!) - also have "... = - y + (x + y)" by (simp!) + assume x: "x \ V" and y: "y \ V" + from x y have "x = (- y + y) + x" by simp + also from x y have "... = - y + (x + y)" by (simp add: add_ac) also assume "x + y = 0" - also have "- y + 0 = - y" by (simp!) + also from y have "- y + 0 = - y" by simp finally show "x = - y" . qed -lemma vs_add_minus_eq: - "is_vectorspace V \ x \ V \ y \ V \ x - y = 0 \ x = y" +lemma (in vectorspace) add_minus_eq: + "x \ V \ y \ V \ x - y = 0 \ x = y" proof - - assume "is_vectorspace V" "x \ V" "y \ V" "x - y = 0" + assume x: "x \ V" and y: "y \ V" assume "x - y = 0" - hence e: "x + - y = 0" by (simp! add: diff_eq1) - with _ _ _ have "x = - (- y)" - by (rule vs_add_minus_eq_minus) (simp!)+ - thus "x = y" by (simp!) + with x y have eq: "x + - y = 0" by (simp add: diff_eq1) + with _ _ have "x = - (- y)" + by (rule add_minus_eq_minus) (simp_all add: x y) + with x y show "x = y" by simp qed -lemma vs_add_diff_swap: - "is_vectorspace V \ a \ V \ b \ V \ c \ V \ d \ V \ a + b = c + d - \ a - c = d - b" +lemma (in vectorspace) add_diff_swap: + "a \ V \ b \ V \ c \ V \ d \ V \ a + b = c + d + \ a - c = d - b" proof - - assume vs: "is_vectorspace V" "a \ V" "b \ V" "c \ V" "d \ V" + assume vs: "a \ V" "b \ V" "c \ V" "d \ V" and eq: "a + b = c + d" - have "- c + (a + b) = - c + (c + d)" - by (simp! add: vs_add_left_cancel) - also have "... = d" by (rule vs_minus_add_cancel) + then have "- c + (a + b) = - c + (c + d)" + by (simp add: add_left_cancel) + also have "... = d" by (rule minus_add_cancel) finally have eq: "- c + (a + b) = d" . from vs have "a - c = (- c + (a + b)) + - b" - by (simp add: vs_add_ac diff_eq1) - also from eq have "... = d + - b" - by (simp! add: vs_add_right_cancel) - also have "... = d - b" by (simp! add: diff_eq2) + by (simp add: add_ac diff_eq1) + also from vs eq have "... = d + - b" + by (simp add: add_right_cancel) + also from vs have "... = d - b" by (simp add: diff_eq2) finally show "a - c = d - b" . qed -lemma vs_add_cancel_21: - "is_vectorspace V \ x \ V \ y \ V \ z \ V \ u \ V - \ (x + (y + z) = y + u) = ((x + z) = u)" - (concl is "?L = ?R") -proof - - assume "is_vectorspace V" "x \ V" "y \ V" "z \ V" "u \ V" - show "?L = ?R" - proof - have "x + z = - y + y + (x + z)" by (simp!) +lemma (in vectorspace) vs_add_cancel_21: + "x \ V \ y \ V \ z \ V \ u \ V + \ (x + (y + z) = y + u) = (x + z = u)" +proof + assume vs: "x \ V" "y \ V" "z \ V" "u \ V" + { + from vs have "x + z = - y + y + (x + z)" by simp also have "... = - y + (y + (x + z))" - by (rule vs_add_assoc) (simp!)+ - also have "y + (x + z) = x + (y + z)" by (simp!) - also assume ?L - also have "- y + (y + u) = u" by (simp!) - finally show ?R . - qed (simp! only: vs_add_left_commute [of V x]) + by (rule add_assoc) (simp_all add: vs) + also from vs have "y + (x + z) = x + (y + z)" + by (simp add: add_ac) + also assume "x + (y + z) = y + u" + also from vs have "- y + (y + u) = u" by simp + finally show "x + z = u" . + next + assume "x + z = u" + with vs show "x + (y + z) = y + u" + by (simp only: add_left_commute [of x]) + } qed -lemma vs_add_cancel_end: - "is_vectorspace V \ x \ V \ y \ V \ z \ V - \ (x + (y + z) = y) = (x = - z)" - (concl is "?L = ?R" ) -proof - - assume "is_vectorspace V" "x \ V" "y \ V" "z \ V" - show "?L = ?R" - proof - assume l: ?L - have "x + z = 0" - proof (rule vs_add_left_cancel [THEN iffD1]) - have "y + (x + z) = x + (y + z)" by (simp!) - also note l - also have "y = y + 0" by (simp!) - finally show "y + (x + z) = y + 0" . - qed (simp!)+ - thus "x = - z" by (simp! add: vs_add_minus_eq_minus) +lemma (in vectorspace) add_cancel_end: + "x \ V \ y \ V \ z \ V \ (x + (y + z) = y) = (x = - z)" +proof + assume vs: "x \ V" "y \ V" "z \ V" + { + assume "x + (y + z) = y" + with vs have "(x + z) + y = 0 + y" + by (simp add: add_ac) + with vs have "x + z = 0" + by (simp only: add_right_cancel add_closed zero) + with vs show "x = - z" by (simp add: add_minus_eq_minus) next - assume r: ?R + assume eq: "x = - z" hence "x + (y + z) = - z + (y + z)" by simp also have "... = y + (- z + z)" - by (simp! only: vs_add_left_commute) - also have "... = y" by (simp!) - finally show ?L . - qed + by (rule add_left_commute) (simp_all add: vs) + also from vs have "... = y" by simp + finally show "x + (y + z) = y" . + } qed end diff -r cc3bbaf1b8d3 -r a6a7025fd7e8 src/HOL/Real/HahnBanach/ZornLemma.thy --- a/src/HOL/Real/HahnBanach/ZornLemma.thy Thu Aug 22 12:28:41 2002 +0200 +++ b/src/HOL/Real/HahnBanach/ZornLemma.thy Thu Aug 22 20:49:43 2002 +0200 @@ -19,23 +19,22 @@ *} theorem Zorn's_Lemma: - "(\c. c \ chain S \ \x. x \ c \ \c \ S) \ a \ S - \ \y \ S. \z \ S. y \ z \ y = z" + assumes r: "\c. c \ chain S \ \x. x \ c \ \c \ S" + and aS: "a \ S" + shows "\y \ S. \z \ S. y \ z \ y = z" proof (rule Zorn_Lemma2) txt_raw {* \footnote{See \url{http://isabelle.in.tum.de/library/HOL/HOL-Real/Zorn.html}} \isanewline *} - assume r: "\c. c \ chain S \ \x. x \ c \ \c \ S" - assume aS: "a \ S" show "\c \ chain S. \y \ S. \z \ c. z \ y" proof fix c assume "c \ chain S" show "\y \ S. \z \ c. z \ y" proof cases - + txt {* If @{text c} is an empty chain, then every element in @{text S} is an upper bound of @{text c}. *} - assume "c = {}" + assume "c = {}" with aS show ?thesis by fast txt {* If @{text c} is non-empty, then @{text "\c"} is an upper @@ -43,12 +42,12 @@ next assume c: "c \ {}" - show ?thesis - proof + show ?thesis + proof show "\z \ c. z \ \c" by fast - show "\c \ S" + show "\c \ S" proof (rule r) - from c show "\x. x \ c" by fast + from c show "\x. x \ c" by fast qed qed qed