# HG changeset patch # User immler # Date 1387210102 -3600 # Node ID 6fae499e08272d4eeb98a32a3f8bd0d1c5d9243a # Parent d9edb711ef31474661aa958f6bca1aaf3cc259e1 summarized notions related to ordered_euclidean_space and intervals in separate theory diff -r d9edb711ef31 -r 6fae499e0827 src/HOL/Multivariate_Analysis/Convex_Euclidean_Space.thy --- a/src/HOL/Multivariate_Analysis/Convex_Euclidean_Space.thy Mon Dec 16 17:08:22 2013 +0100 +++ b/src/HOL/Multivariate_Analysis/Convex_Euclidean_Space.thy Mon Dec 16 17:08:22 2013 +0100 @@ -7,7 +7,7 @@ theory Convex_Euclidean_Space imports - Topology_Euclidean_Space + Ordered_Euclidean_Space "~~/src/HOL/Library/Convex" "~~/src/HOL/Library/Set_Algebras" begin @@ -343,11 +343,6 @@ lemma if_smult: "(if P then x else (y::real)) *\<^sub>R v = (if P then x *\<^sub>R v else y *\<^sub>R v)" by auto -lemma image_smult_interval: - "(\x. m *\<^sub>R (x::'a::ordered_euclidean_space)) ` {a..b} = - (if {a..b} = {} then {} else if 0 \ m then {m *\<^sub>R a..m *\<^sub>R b} else {m *\<^sub>R b..m *\<^sub>R a})" - using image_affinity_interval[of m 0 a b] by auto - lemma dist_triangle_eq: fixes x y z :: "'a::real_inner" shows "dist x z = dist x y + dist y z \ diff -r d9edb711ef31 -r 6fae499e0827 src/HOL/Multivariate_Analysis/Linear_Algebra.thy --- a/src/HOL/Multivariate_Analysis/Linear_Algebra.thy Mon Dec 16 17:08:22 2013 +0100 +++ b/src/HOL/Multivariate_Analysis/Linear_Algebra.thy Mon Dec 16 17:08:22 2013 +0100 @@ -8,7 +8,6 @@ imports Euclidean_Space "~~/src/HOL/Library/Infinite_Set" - "~~/src/HOL/Library/Product_Order" begin lemma cond_application_beta: "(if b then f else g) x = (if b then f x else g x)" @@ -3109,110 +3108,5 @@ apply simp done - -subsection {* An ordering on euclidean spaces that will allow us to talk about intervals *} - -class ordered_euclidean_space = ord + inf + sup + abs + Inf + Sup + euclidean_space + - assumes eucl_le: "x \ y \ (\i\Basis. x \ i \ y \ i)" - assumes eucl_less_le_not_le: "x < y \ x \ y \ \ y \ x" - assumes eucl_inf: "inf x y = (\i\Basis. inf (x \ i) (y \ i) *\<^sub>R i)" - assumes eucl_sup: "sup x y = (\i\Basis. sup (x \ i) (y \ i) *\<^sub>R i)" - assumes eucl_Inf: "Inf X = (\i\Basis. (INF x:X. x \ i) *\<^sub>R i)" - assumes eucl_Sup: "Sup X = (\i\Basis. (SUP x:X. x \ i) *\<^sub>R i)" - assumes eucl_abs: "abs x = (\i\Basis. abs (x \ i) *\<^sub>R i)" -begin - -subclass order - by default - (auto simp: eucl_le eucl_less_le_not_le intro!: euclidean_eqI antisym intro: order.trans) - -subclass ordered_ab_group_add_abs - by default (auto simp: eucl_le inner_add_left eucl_abs abs_leI) - -subclass ordered_real_vector - by default (auto simp: eucl_le intro!: mult_left_mono mult_right_mono) - -subclass lattice - by default (auto simp: eucl_inf eucl_sup eucl_le) - -subclass distrib_lattice - by default (auto simp: eucl_inf eucl_sup sup_inf_distrib1 intro!: euclidean_eqI) - -subclass conditionally_complete_lattice -proof - fix z::'a and X::"'a set" - assume "X \ {}" - hence "\i. (\x. x \ i) ` X \ {}" by simp - thus "(\x. x \ X \ z \ x) \ z \ Inf X" "(\x. x \ X \ x \ z) \ Sup X \ z" - by (auto simp: eucl_Inf eucl_Sup eucl_le Inf_class.INF_def Sup_class.SUP_def - intro!: cInf_greatest cSup_least) -qed (force intro!: cInf_lower cSup_upper - simp: bdd_below_def bdd_above_def preorder_class.bdd_below_def preorder_class.bdd_above_def - eucl_Inf eucl_Sup eucl_le Inf_class.INF_def Sup_class.SUP_def)+ - -lemma inner_Basis_inf_left: "i \ Basis \ inf x y \ i = inf (x \ i) (y \ i)" - and inner_Basis_sup_left: "i \ Basis \ sup x y \ i = sup (x \ i) (y \ i)" - by (simp_all add: eucl_inf eucl_sup inner_setsum_left inner_Basis if_distrib setsum_delta - cong: if_cong) - -lemma inner_Basis_INF_left: "i \ Basis \ (INF x:X. f x) \ i = (INF x:X. f x \ i)" - and inner_Basis_SUP_left: "i \ Basis \ (SUP x:X. f x) \ i = (SUP x:X. f x \ i)" - by (simp_all add: INF_def SUP_def eucl_Sup eucl_Inf) - -lemma abs_inner: "i \ Basis \ abs x \ i = abs (x \ i)" - by (auto simp: eucl_abs) - -lemma - abs_scaleR: "\a *\<^sub>R b\ = \a\ *\<^sub>R \b\" - by (auto simp: eucl_abs abs_mult intro!: euclidean_eqI) - -lemma interval_inner_leI: - assumes "x \ {a .. b}" "0 \ i" - shows "a\i \ x\i" "x\i \ b\i" - using assms - unfolding euclidean_inner[of a i] euclidean_inner[of x i] euclidean_inner[of b i] - by (auto intro!: setsum_mono mult_right_mono simp: eucl_le) - -lemma inner_nonneg_nonneg: - shows "0 \ a \ 0 \ b \ 0 \ a \ b" - using interval_inner_leI[of a 0 a b] - by auto - -lemma inner_Basis_mono: - shows "a \ b \ c \ Basis \ a \ c \ b \ c" - by (simp add: eucl_le) - -lemma Basis_nonneg[intro, simp]: "i \ Basis \ 0 \ i" - by (auto simp: eucl_le inner_Basis) - end -lemma (in order) atLeastatMost_empty'[simp]: - "(~ a <= b) \ {a..b} = {}" - by (auto) - -instance real :: ordered_euclidean_space - by default (auto simp: INF_def SUP_def) - -lemma in_Basis_prod_iff: - fixes i::"'a::euclidean_space*'b::euclidean_space" - shows "i \ Basis \ fst i = 0 \ snd i \ Basis \ snd i = 0 \ fst i \ Basis" - by (cases i) (auto simp: Basis_prod_def) - -instantiation prod::(abs, abs) abs -begin - -definition "abs x = (abs (fst x), abs (snd x))" - -instance proof qed -end - -instance prod :: (ordered_euclidean_space, ordered_euclidean_space) ordered_euclidean_space - by default - (auto intro!: add_mono simp add: euclidean_representation_setsum' Ball_def inner_prod_def - in_Basis_prod_iff inner_Basis_inf_left inner_Basis_sup_left inner_Basis_INF_left Inf_prod_def - inner_Basis_SUP_left Sup_prod_def less_prod_def less_eq_prod_def eucl_le[where 'a='a] - eucl_le[where 'a='b] abs_prod_def abs_inner) - -end - diff -r d9edb711ef31 -r 6fae499e0827 src/HOL/Multivariate_Analysis/Ordered_Euclidean_Space.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/Multivariate_Analysis/Ordered_Euclidean_Space.thy Mon Dec 16 17:08:22 2013 +0100 @@ -0,0 +1,783 @@ +theory Ordered_Euclidean_Space +imports + Topology_Euclidean_Space + "~~/src/HOL/Library/Product_Order" +begin + +subsection {* An ordering on euclidean spaces that will allow us to talk about intervals *} + +class ordered_euclidean_space = ord + inf + sup + abs + Inf + Sup + euclidean_space + + assumes eucl_le: "x \ y \ (\i\Basis. x \ i \ y \ i)" + assumes eucl_less_le_not_le: "x < y \ x \ y \ \ y \ x" + assumes eucl_inf: "inf x y = (\i\Basis. inf (x \ i) (y \ i) *\<^sub>R i)" + assumes eucl_sup: "sup x y = (\i\Basis. sup (x \ i) (y \ i) *\<^sub>R i)" + assumes eucl_Inf: "Inf X = (\i\Basis. (INF x:X. x \ i) *\<^sub>R i)" + assumes eucl_Sup: "Sup X = (\i\Basis. (SUP x:X. x \ i) *\<^sub>R i)" + assumes eucl_abs: "abs x = (\i\Basis. abs (x \ i) *\<^sub>R i)" +begin + +subclass order + by default + (auto simp: eucl_le eucl_less_le_not_le intro!: euclidean_eqI antisym intro: order.trans) + +subclass ordered_ab_group_add_abs + by default (auto simp: eucl_le inner_add_left eucl_abs abs_leI) + +subclass ordered_real_vector + by default (auto simp: eucl_le intro!: mult_left_mono mult_right_mono) + +subclass lattice + by default (auto simp: eucl_inf eucl_sup eucl_le) + +subclass distrib_lattice + by default (auto simp: eucl_inf eucl_sup sup_inf_distrib1 intro!: euclidean_eqI) + +subclass conditionally_complete_lattice +proof + fix z::'a and X::"'a set" + assume "X \ {}" + hence "\i. (\x. x \ i) ` X \ {}" by simp + thus "(\x. x \ X \ z \ x) \ z \ Inf X" "(\x. x \ X \ x \ z) \ Sup X \ z" + by (auto simp: eucl_Inf eucl_Sup eucl_le Inf_class.INF_def Sup_class.SUP_def + intro!: cInf_greatest cSup_least) +qed (force intro!: cInf_lower cSup_upper + simp: bdd_below_def bdd_above_def preorder_class.bdd_below_def preorder_class.bdd_above_def + eucl_Inf eucl_Sup eucl_le Inf_class.INF_def Sup_class.SUP_def)+ + +lemma inner_Basis_inf_left: "i \ Basis \ inf x y \ i = inf (x \ i) (y \ i)" + and inner_Basis_sup_left: "i \ Basis \ sup x y \ i = sup (x \ i) (y \ i)" + by (simp_all add: eucl_inf eucl_sup inner_setsum_left inner_Basis if_distrib setsum_delta + cong: if_cong) + +lemma inner_Basis_INF_left: "i \ Basis \ (INF x:X. f x) \ i = (INF x:X. f x \ i)" + and inner_Basis_SUP_left: "i \ Basis \ (SUP x:X. f x) \ i = (SUP x:X. f x \ i)" + by (simp_all add: INF_def SUP_def eucl_Sup eucl_Inf) + +lemma abs_inner: "i \ Basis \ abs x \ i = abs (x \ i)" + by (auto simp: eucl_abs) + +lemma + abs_scaleR: "\a *\<^sub>R b\ = \a\ *\<^sub>R \b\" + by (auto simp: eucl_abs abs_mult intro!: euclidean_eqI) + +lemma interval_inner_leI: + assumes "x \ {a .. b}" "0 \ i" + shows "a\i \ x\i" "x\i \ b\i" + using assms + unfolding euclidean_inner[of a i] euclidean_inner[of x i] euclidean_inner[of b i] + by (auto intro!: setsum_mono mult_right_mono simp: eucl_le) + +lemma inner_nonneg_nonneg: + shows "0 \ a \ 0 \ b \ 0 \ a \ b" + using interval_inner_leI[of a 0 a b] + by auto + +lemma inner_Basis_mono: + shows "a \ b \ c \ Basis \ a \ c \ b \ c" + by (simp add: eucl_le) + +lemma Basis_nonneg[intro, simp]: "i \ Basis \ 0 \ i" + by (auto simp: eucl_le inner_Basis) + +end + +lemma (in order) atLeastatMost_empty'[simp]: + "(~ a <= b) \ {a..b} = {}" + by (auto) + +instance real :: ordered_euclidean_space + by default (auto simp: INF_def SUP_def) + +lemma in_Basis_prod_iff: + fixes i::"'a::euclidean_space*'b::euclidean_space" + shows "i \ Basis \ fst i = 0 \ snd i \ Basis \ snd i = 0 \ fst i \ Basis" + by (cases i) (auto simp: Basis_prod_def) + +instantiation prod::(abs, abs) abs +begin + +definition "abs x = (abs (fst x), abs (snd x))" + +instance proof qed +end + +instance prod :: (ordered_euclidean_space, ordered_euclidean_space) ordered_euclidean_space + by default + (auto intro!: add_mono simp add: euclidean_representation_setsum' Ball_def inner_prod_def + in_Basis_prod_iff inner_Basis_inf_left inner_Basis_sup_left inner_Basis_INF_left Inf_prod_def + inner_Basis_SUP_left Sup_prod_def less_prod_def less_eq_prod_def eucl_le[where 'a='a] + eucl_le[where 'a='b] abs_prod_def abs_inner) + + +subsection {* Intervals *} + +lemma interval: + fixes a :: "'a::ordered_euclidean_space" + shows "box a b = {x::'a. \i\Basis. a\i < x\i \ x\i < b\i}" + and "{a .. b} = {x::'a. \i\Basis. a\i \ x\i \ x\i \ b\i}" + by (auto simp add:set_eq_iff eucl_le[where 'a='a] box_def) + +lemma mem_interval: + fixes a :: "'a::ordered_euclidean_space" + shows "x \ box a b \ (\i\Basis. a\i < x\i \ x\i < b\i)" + and "x \ {a .. b} \ (\i\Basis. a\i \ x\i \ x\i \ b\i)" + using interval[of a b] + by auto + +lemma interval_eq_empty: + fixes a :: "'a::ordered_euclidean_space" + shows "(box a b = {} \ (\i\Basis. b\i \ a\i))" (is ?th1) + and "({a .. b} = {} \ (\i\Basis. b\i < a\i))" (is ?th2) +proof - + { + fix i x + assume i: "i\Basis" and as:"b\i \ a\i" and x:"x\box a b" + then have "a \ i < x \ i \ x \ i < b \ i" + unfolding mem_interval by auto + then have "a\i < b\i" by auto + then have False using as by auto + } + moreover + { + assume as: "\i\Basis. \ (b\i \ a\i)" + let ?x = "(1/2) *\<^sub>R (a + b)" + { + fix i :: 'a + assume i: "i \ Basis" + have "a\i < b\i" + using as[THEN bspec[where x=i]] i by auto + then have "a\i < ((1/2) *\<^sub>R (a+b)) \ i" "((1/2) *\<^sub>R (a+b)) \ i < b\i" + by (auto simp: inner_add_left) + } + then have "box a b \ {}" + using mem_interval(1)[of "?x" a b] by auto + } + ultimately show ?th1 by blast + + { + fix i x + assume i: "i \ Basis" and as:"b\i < a\i" and x:"x\{a .. b}" + then have "a \ i \ x \ i \ x \ i \ b \ i" + unfolding mem_interval by auto + then have "a\i \ b\i" by auto + then have False using as by auto + } + moreover + { + assume as:"\i\Basis. \ (b\i < a\i)" + let ?x = "(1/2) *\<^sub>R (a + b)" + { + fix i :: 'a + assume i:"i \ Basis" + have "a\i \ b\i" + using as[THEN bspec[where x=i]] i by auto + then have "a\i \ ((1/2) *\<^sub>R (a+b)) \ i" "((1/2) *\<^sub>R (a+b)) \ i \ b\i" + by (auto simp: inner_add_left) + } + then have "{a .. b} \ {}" + using mem_interval(2)[of "?x" a b] by auto + } + ultimately show ?th2 by blast +qed + +lemma interval_ne_empty: + fixes a :: "'a::ordered_euclidean_space" + shows "{a .. b} \ {} \ (\i\Basis. a\i \ b\i)" + and "box a b \ {} \ (\i\Basis. a\i < b\i)" + unfolding interval_eq_empty[of a b] by fastforce+ + +lemma interval_sing: + fixes a :: "'a::ordered_euclidean_space" + shows "{a .. a} = {a}" + and "box a a = {}" + unfolding set_eq_iff mem_interval eq_iff [symmetric] + by (auto intro: euclidean_eqI simp: ex_in_conv) + +lemma subset_interval_imp: + fixes a :: "'a::ordered_euclidean_space" + shows "(\i\Basis. a\i \ c\i \ d\i \ b\i) \ {c .. d} \ {a .. b}" + and "(\i\Basis. a\i < c\i \ d\i < b\i) \ {c .. d} \ box a b" + and "(\i\Basis. a\i \ c\i \ d\i \ b\i) \ box c d \ {a .. b}" + and "(\i\Basis. a\i \ c\i \ d\i \ b\i) \ box c d \ box a b" + unfolding subset_eq[unfolded Ball_def] unfolding mem_interval + by (best intro: order_trans less_le_trans le_less_trans less_imp_le)+ + +lemma interval_open_subset_closed: + fixes a :: "'a::ordered_euclidean_space" + shows "box a b \ {a .. b}" + unfolding subset_eq [unfolded Ball_def] mem_interval + by (fast intro: less_imp_le) + +lemma subset_interval: + fixes a :: "'a::ordered_euclidean_space" + shows "{c .. d} \ {a .. b} \ (\i\Basis. c\i \ d\i) --> (\i\Basis. a\i \ c\i \ d\i \ b\i)" (is ?th1) + and "{c .. d} \ box a b \ (\i\Basis. c\i \ d\i) --> (\i\Basis. a\i < c\i \ d\i < b\i)" (is ?th2) + and "box c d \ {a .. b} \ (\i\Basis. c\i < d\i) --> (\i\Basis. a\i \ c\i \ d\i \ b\i)" (is ?th3) + and "box c d \ box a b \ (\i\Basis. c\i < d\i) --> (\i\Basis. a\i \ c\i \ d\i \ b\i)" (is ?th4) +proof - + show ?th1 + unfolding subset_eq and Ball_def and mem_interval + by (auto intro: order_trans) + show ?th2 + unfolding subset_eq and Ball_def and mem_interval + by (auto intro: le_less_trans less_le_trans order_trans less_imp_le) + { + assume as: "box c d \ {a .. b}" "\i\Basis. c\i < d\i" + then have "box c d \ {}" + unfolding interval_eq_empty by auto + fix i :: 'a + assume i: "i \ Basis" + (** TODO combine the following two parts as done in the HOL_light version. **) + { + let ?x = "(\j\Basis. (if j=i then ((min (a\j) (d\j))+c\j)/2 else (c\j+d\j)/2) *\<^sub>R j)::'a" + assume as2: "a\i > c\i" + { + fix j :: 'a + assume j: "j \ Basis" + then have "c \ j < ?x \ j \ ?x \ j < d \ j" + apply (cases "j = i") + using as(2)[THEN bspec[where x=j]] i + apply (auto simp add: as2) + done + } + then have "?x\box c d" + using i unfolding mem_interval by auto + moreover + have "?x \ {a .. b}" + unfolding mem_interval + apply auto + apply (rule_tac x=i in bexI) + using as(2)[THEN bspec[where x=i]] and as2 i + apply auto + done + ultimately have False using as by auto + } + then have "a\i \ c\i" by (rule ccontr) auto + moreover + { + let ?x = "(\j\Basis. (if j=i then ((max (b\j) (c\j))+d\j)/2 else (c\j+d\j)/2) *\<^sub>R j)::'a" + assume as2: "b\i < d\i" + { + fix j :: 'a + assume "j\Basis" + then have "d \ j > ?x \ j \ ?x \ j > c \ j" + apply (cases "j = i") + using as(2)[THEN bspec[where x=j]] + apply (auto simp add: as2) + done + } + then have "?x\box c d" + unfolding mem_interval by auto + moreover + have "?x\{a .. b}" + unfolding mem_interval + apply auto + apply (rule_tac x=i in bexI) + using as(2)[THEN bspec[where x=i]] and as2 using i + apply auto + done + ultimately have False using as by auto + } + then have "b\i \ d\i" by (rule ccontr) auto + ultimately + have "a\i \ c\i \ d\i \ b\i" by auto + } note part1 = this + show ?th3 + unfolding subset_eq and Ball_def and mem_interval + apply (rule, rule, rule, rule) + apply (rule part1) + unfolding subset_eq and Ball_def and mem_interval + prefer 4 + apply auto + apply (erule_tac x=xa in allE, erule_tac x=xa in allE, fastforce)+ + done + { + assume as: "box c d \ box a b" "\i\Basis. c\i < d\i" + fix i :: 'a + assume i:"i\Basis" + from as(1) have "box c d \ {a..b}" + using interval_open_subset_closed[of a b] by auto + then have "a\i \ c\i \ d\i \ b\i" + using part1 and as(2) using i by auto + } note * = this + show ?th4 + unfolding subset_eq and Ball_def and mem_interval + apply (rule, rule, rule, rule) + apply (rule *) + unfolding subset_eq and Ball_def and mem_interval + prefer 4 + apply auto + apply (erule_tac x=xa in allE, simp)+ + done +qed + +lemma inter_interval: + fixes a :: "'a::ordered_euclidean_space" + shows "{a .. b} \ {c .. d} = + {(\i\Basis. max (a\i) (c\i) *\<^sub>R i) .. (\i\Basis. min (b\i) (d\i) *\<^sub>R i)}" + unfolding set_eq_iff and Int_iff and mem_interval + by auto + +lemma disjoint_interval: + fixes a::"'a::ordered_euclidean_space" + shows "{a .. b} \ {c .. d} = {} \ (\i\Basis. (b\i < a\i \ d\i < c\i \ b\i < c\i \ d\i < a\i))" (is ?th1) + and "{a .. b} \ box c d = {} \ (\i\Basis. (b\i < a\i \ d\i \ c\i \ b\i \ c\i \ d\i \ a\i))" (is ?th2) + and "box a b \ {c .. d} = {} \ (\i\Basis. (b\i \ a\i \ d\i < c\i \ b\i \ c\i \ d\i \ a\i))" (is ?th3) + and "box a b \ box c d = {} \ (\i\Basis. (b\i \ a\i \ d\i \ c\i \ b\i \ c\i \ d\i \ a\i))" (is ?th4) +proof - + let ?z = "(\i\Basis. (((max (a\i) (c\i)) + (min (b\i) (d\i))) / 2) *\<^sub>R i)::'a" + have **: "\P Q. (\i :: 'a. i \ Basis \ Q ?z i \ P i) \ + (\i x :: 'a. i \ Basis \ P i \ Q x i) \ (\x. \i\Basis. Q x i) \ (\i\Basis. P i)" + by blast + note * = set_eq_iff Int_iff empty_iff mem_interval ball_conj_distrib[symmetric] eq_False ball_simps(10) + show ?th1 unfolding * by (intro **) auto + show ?th2 unfolding * by (intro **) auto + show ?th3 unfolding * by (intro **) auto + show ?th4 unfolding * by (intro **) auto +qed + +(* Moved interval_open_subset_closed a bit upwards *) + +lemma open_interval[intro]: + fixes a b :: "'a::ordered_euclidean_space" + shows "open (box a b)" +proof - + have "open (\i\Basis. (\x. x\i) -` {a\i<..i})" + by (intro open_INT finite_lessThan ballI continuous_open_vimage allI + linear_continuous_at open_real_greaterThanLessThan finite_Basis bounded_linear_inner_left) + also have "(\i\Basis. (\x. x\i) -` {a\i<..i}) = box a b" + by (auto simp add: interval) + finally show "open (box a b)" . +qed + +lemma closed_interval[intro]: + fixes a b :: "'a::ordered_euclidean_space" + shows "closed {a .. b}" +proof - + have "closed (\i\Basis. (\x. x\i) -` {a\i .. b\i})" + by (intro closed_INT ballI continuous_closed_vimage allI + linear_continuous_at closed_real_atLeastAtMost finite_Basis bounded_linear_inner_left) + also have "(\i\Basis. (\x. x\i) -` {a\i .. b\i}) = {a .. b}" + by (auto simp add: eucl_le [where 'a='a]) + finally show "closed {a .. b}" . +qed + +lemma interior_closed_interval [intro]: + fixes a b :: "'a::ordered_euclidean_space" + shows "interior {a..b} = box a b" (is "?L = ?R") +proof(rule subset_antisym) + show "?R \ ?L" + using interval_open_subset_closed open_interval + by (rule interior_maximal) + { + fix x + assume "x \ interior {a..b}" + then obtain s where s: "open s" "x \ s" "s \ {a..b}" .. + then obtain e where "e>0" and e:"\x'. dist x' x < e \ x' \ {a..b}" + unfolding open_dist and subset_eq by auto + { + fix i :: 'a + assume i: "i \ Basis" + have "dist (x - (e / 2) *\<^sub>R i) x < e" + and "dist (x + (e / 2) *\<^sub>R i) x < e" + unfolding dist_norm + apply auto + unfolding norm_minus_cancel + using norm_Basis[OF i] `e>0` + apply auto + done + then have "a \ i \ (x - (e / 2) *\<^sub>R i) \ i" and "(x + (e / 2) *\<^sub>R i) \ i \ b \ i" + using e[THEN spec[where x="x - (e/2) *\<^sub>R i"]] + and e[THEN spec[where x="x + (e/2) *\<^sub>R i"]] + unfolding mem_interval + using i + by blast+ + then have "a \ i < x \ i" and "x \ i < b \ i" + using `e>0` i + by (auto simp: inner_diff_left inner_Basis inner_add_left) + } + then have "x \ box a b" + unfolding mem_interval by auto + } + then show "?L \ ?R" .. +qed + +lemma bounded_closed_interval: + fixes a :: "'a::ordered_euclidean_space" + shows "bounded {a .. b}" +proof - + let ?b = "\i\Basis. \a\i\ + \b\i\" + { + fix x :: "'a" + assume x: "\i\Basis. a \ i \ x \ i \ x \ i \ b \ i" + { + fix i :: 'a + assume "i \ Basis" + then have "\x\i\ \ \a\i\ + \b\i\" + using x[THEN bspec[where x=i]] by auto + } + then have "(\i\Basis. \x \ i\) \ ?b" + apply - + apply (rule setsum_mono) + apply auto + done + then have "norm x \ ?b" + using norm_le_l1[of x] by auto + } + then show ?thesis + unfolding interval and bounded_iff by auto +qed + +lemma bounded_interval: + fixes a :: "'a::ordered_euclidean_space" + shows "bounded {a .. b} \ bounded (box a b)" + using bounded_closed_interval[of a b] + using interval_open_subset_closed[of a b] + using bounded_subset[of "{a..b}" "box a b"] + by simp + +lemma not_interval_univ: + fixes a :: "'a::ordered_euclidean_space" + shows "{a .. b} \ UNIV \ box a b \ UNIV" + using bounded_interval[of a b] by auto + +lemma compact_interval: + fixes a :: "'a::ordered_euclidean_space" + shows "compact {a .. b}" + using bounded_closed_imp_seq_compact[of "{a..b}"] using bounded_interval[of a b] + by (auto simp: compact_eq_seq_compact_metric) + +lemma open_interval_midpoint: + fixes a :: "'a::ordered_euclidean_space" + assumes "box a b \ {}" + shows "((1/2) *\<^sub>R (a + b)) \ box a b" +proof - + { + fix i :: 'a + assume "i \ Basis" + then have "a \ i < ((1 / 2) *\<^sub>R (a + b)) \ i \ ((1 / 2) *\<^sub>R (a + b)) \ i < b \ i" + using assms[unfolded interval_ne_empty, THEN bspec[where x=i]] by (auto simp: inner_add_left) + } + then show ?thesis unfolding mem_interval by auto +qed + +lemma open_closed_interval_convex: + fixes x :: "'a::ordered_euclidean_space" + assumes x: "x \ box a b" + and y: "y \ {a .. b}" + and e: "0 < e" "e \ 1" + shows "(e *\<^sub>R x + (1 - e) *\<^sub>R y) \ box a b" +proof - + { + fix i :: 'a + assume i: "i \ Basis" + have "a \ i = e * (a \ i) + (1 - e) * (a \ i)" + unfolding left_diff_distrib by simp + also have "\ < e * (x \ i) + (1 - e) * (y \ i)" + apply (rule add_less_le_mono) + using e unfolding mult_less_cancel_left and mult_le_cancel_left + apply simp_all + using x unfolding mem_interval using i + apply simp + using y unfolding mem_interval using i + apply simp + done + finally have "a \ i < (e *\<^sub>R x + (1 - e) *\<^sub>R y) \ i" + unfolding inner_simps by auto + moreover + { + have "b \ i = e * (b\i) + (1 - e) * (b\i)" + unfolding left_diff_distrib by simp + also have "\ > e * (x \ i) + (1 - e) * (y \ i)" + apply (rule add_less_le_mono) + using e unfolding mult_less_cancel_left and mult_le_cancel_left + apply simp_all + using x + unfolding mem_interval + using i + apply simp + using y + unfolding mem_interval + using i + apply simp + done + finally have "(e *\<^sub>R x + (1 - e) *\<^sub>R y) \ i < b \ i" + unfolding inner_simps by auto + } + ultimately have "a \ i < (e *\<^sub>R x + (1 - e) *\<^sub>R y) \ i \ (e *\<^sub>R x + (1 - e) *\<^sub>R y) \ i < b \ i" + by auto + } + then show ?thesis + unfolding mem_interval by auto +qed + +notation + eucl_less (infix " {}" + shows "closure (box a b) = {a .. b}" +proof - + have ab: "a {a .. b}" + def f \ "\n::nat. x + (inverse (real n + 1)) *\<^sub>R (?c - x)" + { + fix n + assume fn: "f n a f n = x" and xc: "x \ ?c" + have *: "0 < inverse (real n + 1)" "inverse (real n + 1) \ 1" + unfolding inverse_le_1_iff by auto + have "(inverse (real n + 1)) *\<^sub>R ((1 / 2) *\<^sub>R (a + b)) + (1 - inverse (real n + 1)) *\<^sub>R x = + x + (inverse (real n + 1)) *\<^sub>R (((1 / 2) *\<^sub>R (a + b)) - x)" + by (auto simp add: algebra_simps) + then have "f n (f ---> x) sequentially" + { + fix e :: real + assume "e > 0" + then have "\N::nat. inverse (real (N + 1)) < e" + using real_arch_inv[of e] + apply (auto simp add: Suc_pred') + apply (rule_tac x="n - 1" in exI) + apply auto + done + then obtain N :: nat where "inverse (real (N + 1)) < e" + by auto + then have "\n\N. inverse (real n + 1) < e" + apply auto + apply (metis Suc_le_mono le_SucE less_imp_inverse_less nat_le_real_less order_less_trans + real_of_nat_Suc real_of_nat_Suc_gt_zero) + done + then have "\N::nat. \n\N. inverse (real n + 1) < e" by auto + } + then have "((\n. inverse (real n + 1)) ---> 0) sequentially" + unfolding LIMSEQ_def by(auto simp add: dist_norm) + then have "(f ---> x) sequentially" + unfolding f_def + using tendsto_add[OF tendsto_const, of "\n::nat. (inverse (real n + 1)) *\<^sub>R ((1 / 2) *\<^sub>R (a + b) - x)" 0 sequentially x] + using tendsto_scaleR [OF _ tendsto_const, of "\n::nat. inverse (real n + 1)" 0 sequentially "((1 / 2) *\<^sub>R (a + b) - x)"] + by auto + } + ultimately have "x \ closure (box a b)" + using as and open_interval_midpoint[OF assms] + unfolding closure_def + unfolding islimpt_sequential + by (cases "x=?c") (auto simp: in_box_eucl_less) + } + then show ?thesis + using closure_minimal[OF interval_open_subset_closed closed_interval, of a b] by blast +qed + +lemma bounded_subset_open_interval_symmetric: + fixes s::"('a::ordered_euclidean_space) set" + assumes "bounded s" + shows "\a. s \ box (-a) a" +proof - + obtain b where "b>0" and b: "\x\s. norm x \ b" + using assms[unfolded bounded_pos] by auto + def a \ "(\i\Basis. (b + 1) *\<^sub>R i)::'a" + { + fix x + assume "x \ s" + fix i :: 'a + assume i: "i \ Basis" + then have "(-a)\i < x\i" and "x\i < a\i" + using b[THEN bspec[where x=x], OF `x\s`] + using Basis_le_norm[OF i, of x] + unfolding inner_simps and a_def + by auto + } + then show ?thesis + by (auto intro: exI[where x=a] simp add: interval) +qed + +lemma bounded_subset_open_interval: + fixes s :: "('a::ordered_euclidean_space) set" + shows "bounded s \ (\a b. s \ box a b)" + by (auto dest!: bounded_subset_open_interval_symmetric) + +lemma bounded_subset_closed_interval_symmetric: + fixes s :: "('a::ordered_euclidean_space) set" + assumes "bounded s" + shows "\a. s \ {-a .. a}" +proof - + obtain a where "s \ box (-a) a" + using bounded_subset_open_interval_symmetric[OF assms] by auto + then show ?thesis + using interval_open_subset_closed[of "-a" a] by auto +qed + +lemma bounded_subset_closed_interval: + fixes s :: "('a::ordered_euclidean_space) set" + shows "bounded s \ \a b. s \ {a .. b}" + using bounded_subset_closed_interval_symmetric[of s] by auto + +lemma frontier_closed_interval: + fixes a b :: "'a::ordered_euclidean_space" + shows "frontier {a .. b} = {a .. b} - box a b" + unfolding frontier_def unfolding interior_closed_interval and closure_closed[OF closed_interval] .. + +lemma frontier_open_interval: + fixes a b :: "'a::ordered_euclidean_space" + shows "frontier (box a b) = (if box a b = {} then {} else {a .. b} - box a b)" +proof (cases "box a b = {}") + case True + then show ?thesis + using frontier_empty by auto +next + case False + then show ?thesis + unfolding frontier_def and closure_open_interval[OF False] and interior_open[OF open_interval] + by auto +qed + +lemma inter_interval_mixed_eq_empty: + fixes a :: "'a::ordered_euclidean_space" + assumes "box c d \ {}" + shows "box a b \ {c .. d} = {} \ box a b \ box c d = {}" + unfolding closure_open_interval[OF assms, symmetric] + unfolding open_inter_closure_eq_empty[OF open_interval] .. + +text {* Intervals in general, including infinite and mixtures of open and closed. *} + +definition "is_interval (s::('a::euclidean_space) set) \ + (\a\s. \b\s. \x. (\i\Basis. ((a\i \ x\i \ x\i \ b\i) \ (b\i \ x\i \ x\i \ a\i))) \ x \ s)" + +lemma is_interval_interval: "is_interval {a .. b::'a::ordered_euclidean_space}" (is ?th1) + "is_interval (box a b)" (is ?th2) proof - + show ?th1 ?th2 unfolding is_interval_def mem_interval Ball_def atLeastAtMost_iff + by(meson order_trans le_less_trans less_le_trans less_trans)+ qed + +lemma is_interval_empty: + "is_interval {}" + unfolding is_interval_def + by simp + +lemma is_interval_univ: + "is_interval UNIV" + unfolding is_interval_def + by simp + +text{* Instantiation for intervals on @{text ordered_euclidean_space} *} + +lemma eucl_lessThan_eq_halfspaces: + fixes a :: "'a\ordered_euclidean_space" + shows "{x. x i\Basis. {x. x \ i < a \ i})" + by (auto simp: eucl_less_def) + +lemma eucl_greaterThan_eq_halfspaces: + fixes a :: "'a\ordered_euclidean_space" + shows "{x. a i\Basis. {x. a \ i < x \ i})" + by (auto simp: eucl_less_def) + +lemma eucl_atMost_eq_halfspaces: + fixes a :: "'a\ordered_euclidean_space" + shows "{.. a} = (\i\Basis. {x. x \ i \ a \ i})" + by (auto simp: eucl_le[where 'a='a]) + +lemma eucl_atLeast_eq_halfspaces: + fixes a :: "'a\ordered_euclidean_space" + shows "{a ..} = (\i\Basis. {x. a \ i \ x \ i})" + by (auto simp: eucl_le[where 'a='a]) + +lemma open_eucl_lessThan[simp, intro]: + fixes a :: "'a\ordered_euclidean_space" + shows "open {x. x ordered_euclidean_space" + shows "open {x. a ordered_euclidean_space" + shows "closed {.. a}" + unfolding eucl_atMost_eq_halfspaces + by (simp add: closed_INT closed_Collect_le) + +lemma closed_eucl_atLeast[simp, intro]: + fixes a :: "'a\ordered_euclidean_space" + shows "closed {a ..}" + unfolding eucl_atLeast_eq_halfspaces + by (simp add: closed_INT closed_Collect_le) + + +lemma image_affinity_interval: fixes m::real + fixes a b c :: "'a::ordered_euclidean_space" + shows "(\x. m *\<^sub>R x + c) ` {a .. b} = + (if {a .. b} = {} then {} + else (if 0 \ m then {m *\<^sub>R a + c .. m *\<^sub>R b + c} + else {m *\<^sub>R b + c .. m *\<^sub>R a + c}))" +proof (cases "m = 0") + case True + { + fix x + assume "x \ c" "c \ x" + then have "x = c" + unfolding eucl_le[where 'a='a] + apply - + apply (subst euclidean_eq_iff) + apply (auto intro: order_antisym) + done + } + moreover have "c \ {m *\<^sub>R a + c..m *\<^sub>R b + c}" + unfolding True by (auto simp add: eucl_le[where 'a='a]) + ultimately show ?thesis using True by auto +next + case False + { + fix y + assume "a \ y" "y \ b" "m > 0" + then have "m *\<^sub>R a + c \ m *\<^sub>R y + c" and "m *\<^sub>R y + c \ m *\<^sub>R b + c" + unfolding eucl_le[where 'a='a] by (auto simp: inner_distrib) + } + moreover + { + fix y + assume "a \ y" "y \ b" "m < 0" + then have "m *\<^sub>R b + c \ m *\<^sub>R y + c" and "m *\<^sub>R y + c \ m *\<^sub>R a + c" + unfolding eucl_le[where 'a='a] by (auto simp add: mult_left_mono_neg inner_distrib) + } + moreover + { + fix y + assume "m > 0" and "m *\<^sub>R a + c \ y" and "y \ m *\<^sub>R b + c" + then have "y \ (\x. m *\<^sub>R x + c) ` {a..b}" + unfolding image_iff Bex_def mem_interval eucl_le[where 'a='a] + apply (intro exI[where x="(1 / m) *\<^sub>R (y - c)"]) + apply (auto simp add: pos_le_divide_eq pos_divide_le_eq mult_commute diff_le_iff inner_distrib inner_diff_left) + done + } + moreover + { + fix y + assume "m *\<^sub>R b + c \ y" "y \ m *\<^sub>R a + c" "m < 0" + then have "y \ (\x. m *\<^sub>R x + c) ` {a..b}" + unfolding image_iff Bex_def mem_interval eucl_le[where 'a='a] + apply (intro exI[where x="(1 / m) *\<^sub>R (y - c)"]) + apply (auto simp add: neg_le_divide_eq neg_divide_le_eq mult_commute diff_le_iff inner_distrib inner_diff_left) + done + } + ultimately show ?thesis using False by auto +qed + +lemma image_smult_interval:"(\x. m *\<^sub>R (x::_::ordered_euclidean_space)) ` {a..b} = + (if {a..b} = {} then {} else if 0 \ m then {m *\<^sub>R a..m *\<^sub>R b} else {m *\<^sub>R b..m *\<^sub>R a})" + using image_affinity_interval[of m 0 a b] by auto + +no_notation + eucl_less (infix "i\Basis. a\i < x\i \ x\i < b\i}" - and "{a .. b} = {x::'a. \i\Basis. a\i \ x\i \ x\i \ b\i}" - by (auto simp add:set_eq_iff eucl_le[where 'a='a] box_def) - -lemma mem_interval: - fixes a :: "'a::ordered_euclidean_space" - shows "x \ box a b \ (\i\Basis. a\i < x\i \ x\i < b\i)" - and "x \ {a .. b} \ (\i\Basis. a\i \ x\i \ x\i \ b\i)" - using interval[of a b] - by auto - -lemma interval_eq_empty: - fixes a :: "'a::ordered_euclidean_space" - shows "(box a b = {} \ (\i\Basis. b\i \ a\i))" (is ?th1) - and "({a .. b} = {} \ (\i\Basis. b\i < a\i))" (is ?th2) -proof - - { - fix i x - assume i: "i\Basis" and as:"b\i \ a\i" and x:"x\box a b" - then have "a \ i < x \ i \ x \ i < b \ i" - unfolding mem_interval by auto - then have "a\i < b\i" by auto - then have False using as by auto - } - moreover - { - assume as: "\i\Basis. \ (b\i \ a\i)" - let ?x = "(1/2) *\<^sub>R (a + b)" - { - fix i :: 'a - assume i: "i \ Basis" - have "a\i < b\i" - using as[THEN bspec[where x=i]] i by auto - then have "a\i < ((1/2) *\<^sub>R (a+b)) \ i" "((1/2) *\<^sub>R (a+b)) \ i < b\i" - by (auto simp: inner_add_left) - } - then have "box a b \ {}" - using mem_interval(1)[of "?x" a b] by auto - } - ultimately show ?th1 by blast - - { - fix i x - assume i: "i \ Basis" and as:"b\i < a\i" and x:"x\{a .. b}" - then have "a \ i \ x \ i \ x \ i \ b \ i" - unfolding mem_interval by auto - then have "a\i \ b\i" by auto - then have False using as by auto - } - moreover - { - assume as:"\i\Basis. \ (b\i < a\i)" - let ?x = "(1/2) *\<^sub>R (a + b)" - { - fix i :: 'a - assume i:"i \ Basis" - have "a\i \ b\i" - using as[THEN bspec[where x=i]] i by auto - then have "a\i \ ((1/2) *\<^sub>R (a+b)) \ i" "((1/2) *\<^sub>R (a+b)) \ i \ b\i" - by (auto simp: inner_add_left) - } - then have "{a .. b} \ {}" - using mem_interval(2)[of "?x" a b] by auto - } - ultimately show ?th2 by blast -qed - -lemma interval_ne_empty: - fixes a :: "'a::ordered_euclidean_space" - shows "{a .. b} \ {} \ (\i\Basis. a\i \ b\i)" - and "box a b \ {} \ (\i\Basis. a\i < b\i)" - unfolding interval_eq_empty[of a b] by fastforce+ - -lemma interval_sing: - fixes a :: "'a::ordered_euclidean_space" - shows "{a .. a} = {a}" - and "box a a = {}" - unfolding set_eq_iff mem_interval eq_iff [symmetric] - by (auto intro: euclidean_eqI simp: ex_in_conv) - -lemma subset_interval_imp: - fixes a :: "'a::ordered_euclidean_space" - shows "(\i\Basis. a\i \ c\i \ d\i \ b\i) \ {c .. d} \ {a .. b}" - and "(\i\Basis. a\i < c\i \ d\i < b\i) \ {c .. d} \ box a b" - and "(\i\Basis. a\i \ c\i \ d\i \ b\i) \ box c d \ {a .. b}" - and "(\i\Basis. a\i \ c\i \ d\i \ b\i) \ box c d \ box a b" - unfolding subset_eq[unfolded Ball_def] unfolding mem_interval - by (best intro: order_trans less_le_trans le_less_trans less_imp_le)+ - -lemma interval_open_subset_closed: - fixes a :: "'a::ordered_euclidean_space" - shows "box a b \ {a .. b}" - unfolding subset_eq [unfolded Ball_def] mem_interval - by (fast intro: less_imp_le) - -lemma subset_interval: - fixes a :: "'a::ordered_euclidean_space" - shows "{c .. d} \ {a .. b} \ (\i\Basis. c\i \ d\i) --> (\i\Basis. a\i \ c\i \ d\i \ b\i)" (is ?th1) - and "{c .. d} \ box a b \ (\i\Basis. c\i \ d\i) --> (\i\Basis. a\i < c\i \ d\i < b\i)" (is ?th2) - and "box c d \ {a .. b} \ (\i\Basis. c\i < d\i) --> (\i\Basis. a\i \ c\i \ d\i \ b\i)" (is ?th3) - and "box c d \ box a b \ (\i\Basis. c\i < d\i) --> (\i\Basis. a\i \ c\i \ d\i \ b\i)" (is ?th4) -proof - - show ?th1 - unfolding subset_eq and Ball_def and mem_interval - by (auto intro: order_trans) - show ?th2 - unfolding subset_eq and Ball_def and mem_interval - by (auto intro: le_less_trans less_le_trans order_trans less_imp_le) - { - assume as: "box c d \ {a .. b}" "\i\Basis. c\i < d\i" - then have "box c d \ {}" - unfolding interval_eq_empty by auto - fix i :: 'a - assume i: "i \ Basis" - (** TODO combine the following two parts as done in the HOL_light version. **) - { - let ?x = "(\j\Basis. (if j=i then ((min (a\j) (d\j))+c\j)/2 else (c\j+d\j)/2) *\<^sub>R j)::'a" - assume as2: "a\i > c\i" - { - fix j :: 'a - assume j: "j \ Basis" - then have "c \ j < ?x \ j \ ?x \ j < d \ j" - apply (cases "j = i") - using as(2)[THEN bspec[where x=j]] i - apply (auto simp add: as2) - done - } - then have "?x\box c d" - using i unfolding mem_interval by auto - moreover - have "?x \ {a .. b}" - unfolding mem_interval - apply auto - apply (rule_tac x=i in bexI) - using as(2)[THEN bspec[where x=i]] and as2 i - apply auto - done - ultimately have False using as by auto - } - then have "a\i \ c\i" by (rule ccontr) auto - moreover - { - let ?x = "(\j\Basis. (if j=i then ((max (b\j) (c\j))+d\j)/2 else (c\j+d\j)/2) *\<^sub>R j)::'a" - assume as2: "b\i < d\i" - { - fix j :: 'a - assume "j\Basis" - then have "d \ j > ?x \ j \ ?x \ j > c \ j" - apply (cases "j = i") - using as(2)[THEN bspec[where x=j]] - apply (auto simp add: as2) - done - } - then have "?x\box c d" - unfolding mem_interval by auto - moreover - have "?x\{a .. b}" - unfolding mem_interval - apply auto - apply (rule_tac x=i in bexI) - using as(2)[THEN bspec[where x=i]] and as2 using i - apply auto - done - ultimately have False using as by auto - } - then have "b\i \ d\i" by (rule ccontr) auto - ultimately - have "a\i \ c\i \ d\i \ b\i" by auto - } note part1 = this - show ?th3 - unfolding subset_eq and Ball_def and mem_interval - apply (rule, rule, rule, rule) - apply (rule part1) - unfolding subset_eq and Ball_def and mem_interval - prefer 4 - apply auto - apply (erule_tac x=xa in allE, erule_tac x=xa in allE, fastforce)+ - done - { - assume as: "box c d \ box a b" "\i\Basis. c\i < d\i" - fix i :: 'a - assume i:"i\Basis" - from as(1) have "box c d \ {a..b}" - using interval_open_subset_closed[of a b] by auto - then have "a\i \ c\i \ d\i \ b\i" - using part1 and as(2) using i by auto - } note * = this - show ?th4 - unfolding subset_eq and Ball_def and mem_interval - apply (rule, rule, rule, rule) - apply (rule *) - unfolding subset_eq and Ball_def and mem_interval - prefer 4 - apply auto - apply (erule_tac x=xa in allE, simp)+ - done -qed - -lemma inter_interval: - fixes a :: "'a::ordered_euclidean_space" - shows "{a .. b} \ {c .. d} = - {(\i\Basis. max (a\i) (c\i) *\<^sub>R i) .. (\i\Basis. min (b\i) (d\i) *\<^sub>R i)}" - unfolding set_eq_iff and Int_iff and mem_interval - by auto - -lemma disjoint_interval: - fixes a::"'a::ordered_euclidean_space" - shows "{a .. b} \ {c .. d} = {} \ (\i\Basis. (b\i < a\i \ d\i < c\i \ b\i < c\i \ d\i < a\i))" (is ?th1) - and "{a .. b} \ box c d = {} \ (\i\Basis. (b\i < a\i \ d\i \ c\i \ b\i \ c\i \ d\i \ a\i))" (is ?th2) - and "box a b \ {c .. d} = {} \ (\i\Basis. (b\i \ a\i \ d\i < c\i \ b\i \ c\i \ d\i \ a\i))" (is ?th3) - and "box a b \ box c d = {} \ (\i\Basis. (b\i \ a\i \ d\i \ c\i \ b\i \ c\i \ d\i \ a\i))" (is ?th4) -proof - - let ?z = "(\i\Basis. (((max (a\i) (c\i)) + (min (b\i) (d\i))) / 2) *\<^sub>R i)::'a" - have **: "\P Q. (\i :: 'a. i \ Basis \ Q ?z i \ P i) \ - (\i x :: 'a. i \ Basis \ P i \ Q x i) \ (\x. \i\Basis. Q x i) \ (\i\Basis. P i)" - by blast - note * = set_eq_iff Int_iff empty_iff mem_interval ball_conj_distrib[symmetric] eq_False ball_simps(10) - show ?th1 unfolding * by (intro **) auto - show ?th2 unfolding * by (intro **) auto - show ?th3 unfolding * by (intro **) auto - show ?th4 unfolding * by (intro **) auto -qed - -(* Moved interval_open_subset_closed a bit upwards *) - -lemma open_interval[intro]: - fixes a b :: "'a::ordered_euclidean_space" - shows "open (box a b)" -proof - - have "open (\i\Basis. (\x. x\i) -` {a\i<..i})" - by (intro open_INT finite_lessThan ballI continuous_open_vimage allI - linear_continuous_at open_real_greaterThanLessThan finite_Basis bounded_linear_inner_left) - also have "(\i\Basis. (\x. x\i) -` {a\i<..i}) = box a b" - by (auto simp add: interval) - finally show "open (box a b)" . -qed - -lemma closed_interval[intro]: - fixes a b :: "'a::ordered_euclidean_space" - shows "closed {a .. b}" -proof - - have "closed (\i\Basis. (\x. x\i) -` {a\i .. b\i})" - by (intro closed_INT ballI continuous_closed_vimage allI - linear_continuous_at closed_real_atLeastAtMost finite_Basis bounded_linear_inner_left) - also have "(\i\Basis. (\x. x\i) -` {a\i .. b\i}) = {a .. b}" - by (auto simp add: eucl_le [where 'a='a]) - finally show "closed {a .. b}" . -qed - -lemma interior_closed_interval [intro]: - fixes a b :: "'a::ordered_euclidean_space" - shows "interior {a..b} = box a b" (is "?L = ?R") -proof(rule subset_antisym) - show "?R \ ?L" - using interval_open_subset_closed open_interval - by (rule interior_maximal) - { - fix x - assume "x \ interior {a..b}" - then obtain s where s: "open s" "x \ s" "s \ {a..b}" .. - then obtain e where "e>0" and e:"\x'. dist x' x < e \ x' \ {a..b}" - unfolding open_dist and subset_eq by auto - { - fix i :: 'a - assume i: "i \ Basis" - have "dist (x - (e / 2) *\<^sub>R i) x < e" - and "dist (x + (e / 2) *\<^sub>R i) x < e" - unfolding dist_norm - apply auto - unfolding norm_minus_cancel - using norm_Basis[OF i] `e>0` - apply auto - done - then have "a \ i \ (x - (e / 2) *\<^sub>R i) \ i" and "(x + (e / 2) *\<^sub>R i) \ i \ b \ i" - using e[THEN spec[where x="x - (e/2) *\<^sub>R i"]] - and e[THEN spec[where x="x + (e/2) *\<^sub>R i"]] - unfolding mem_interval - using i - by blast+ - then have "a \ i < x \ i" and "x \ i < b \ i" - using `e>0` i - by (auto simp: inner_diff_left inner_Basis inner_add_left) - } - then have "x \ box a b" - unfolding mem_interval by auto - } - then show "?L \ ?R" .. -qed - -lemma bounded_closed_interval: - fixes a :: "'a::ordered_euclidean_space" - shows "bounded {a .. b}" -proof - - let ?b = "\i\Basis. \a\i\ + \b\i\" - { - fix x :: "'a" - assume x: "\i\Basis. a \ i \ x \ i \ x \ i \ b \ i" - { - fix i :: 'a - assume "i \ Basis" - then have "\x\i\ \ \a\i\ + \b\i\" - using x[THEN bspec[where x=i]] by auto - } - then have "(\i\Basis. \x \ i\) \ ?b" - apply - - apply (rule setsum_mono) - apply auto - done - then have "norm x \ ?b" - using norm_le_l1[of x] by auto - } - then show ?thesis - unfolding interval and bounded_iff by auto -qed - -lemma bounded_interval: - fixes a :: "'a::ordered_euclidean_space" - shows "bounded {a .. b} \ bounded (box a b)" - using bounded_closed_interval[of a b] - using interval_open_subset_closed[of a b] - using bounded_subset[of "{a..b}" "box a b"] - by simp - -lemma not_interval_univ: - fixes a :: "'a::ordered_euclidean_space" - shows "{a .. b} \ UNIV \ box a b \ UNIV" - using bounded_interval[of a b] by auto - -lemma compact_interval: - fixes a :: "'a::ordered_euclidean_space" - shows "compact {a .. b}" - using bounded_closed_imp_seq_compact[of "{a..b}"] using bounded_interval[of a b] - by (auto simp: compact_eq_seq_compact_metric) - -lemma open_interval_midpoint: - fixes a :: "'a::ordered_euclidean_space" - assumes "box a b \ {}" - shows "((1/2) *\<^sub>R (a + b)) \ box a b" -proof - - { - fix i :: 'a - assume "i \ Basis" - then have "a \ i < ((1 / 2) *\<^sub>R (a + b)) \ i \ ((1 / 2) *\<^sub>R (a + b)) \ i < b \ i" - using assms[unfolded interval_ne_empty, THEN bspec[where x=i]] by (auto simp: inner_add_left) - } - then show ?thesis unfolding mem_interval by auto -qed - -lemma open_closed_interval_convex: - fixes x :: "'a::ordered_euclidean_space" - assumes x: "x \ box a b" - and y: "y \ {a .. b}" - and e: "0 < e" "e \ 1" - shows "(e *\<^sub>R x + (1 - e) *\<^sub>R y) \ box a b" -proof - - { - fix i :: 'a - assume i: "i \ Basis" - have "a \ i = e * (a \ i) + (1 - e) * (a \ i)" - unfolding left_diff_distrib by simp - also have "\ < e * (x \ i) + (1 - e) * (y \ i)" - apply (rule add_less_le_mono) - using e unfolding mult_less_cancel_left and mult_le_cancel_left - apply simp_all - using x unfolding mem_interval using i - apply simp - using y unfolding mem_interval using i - apply simp - done - finally have "a \ i < (e *\<^sub>R x + (1 - e) *\<^sub>R y) \ i" - unfolding inner_simps by auto - moreover - { - have "b \ i = e * (b\i) + (1 - e) * (b\i)" - unfolding left_diff_distrib by simp - also have "\ > e * (x \ i) + (1 - e) * (y \ i)" - apply (rule add_less_le_mono) - using e unfolding mult_less_cancel_left and mult_le_cancel_left - apply simp_all - using x - unfolding mem_interval - using i - apply simp - using y - unfolding mem_interval - using i - apply simp - done - finally have "(e *\<^sub>R x + (1 - e) *\<^sub>R y) \ i < b \ i" - unfolding inner_simps by auto - } - ultimately have "a \ i < (e *\<^sub>R x + (1 - e) *\<^sub>R y) \ i \ (e *\<^sub>R x + (1 - e) *\<^sub>R y) \ i < b \ i" - by auto - } - then show ?thesis - unfolding mem_interval by auto -qed - -lemma closure_open_interval: - fixes a :: "'a::ordered_euclidean_space" - assumes "box a b \ {}" - shows "closure (box a b) = {a .. b}" -proof - - have ab: "a {a .. b}" - def f \ "\n::nat. x + (inverse (real n + 1)) *\<^sub>R (?c - x)" - { - fix n - assume fn: "f n a f n = x" and xc: "x \ ?c" - have *: "0 < inverse (real n + 1)" "inverse (real n + 1) \ 1" - unfolding inverse_le_1_iff by auto - have "(inverse (real n + 1)) *\<^sub>R ((1 / 2) *\<^sub>R (a + b)) + (1 - inverse (real n + 1)) *\<^sub>R x = - x + (inverse (real n + 1)) *\<^sub>R (((1 / 2) *\<^sub>R (a + b)) - x)" - by (auto simp add: algebra_simps) - then have "f n (f ---> x) sequentially" - { - fix e :: real - assume "e > 0" - then have "\N::nat. inverse (real (N + 1)) < e" - using real_arch_inv[of e] - apply (auto simp add: Suc_pred') - apply (rule_tac x="n - 1" in exI) - apply auto - done - then obtain N :: nat where "inverse (real (N + 1)) < e" - by auto - then have "\n\N. inverse (real n + 1) < e" - apply auto - apply (metis Suc_le_mono le_SucE less_imp_inverse_less nat_le_real_less order_less_trans - real_of_nat_Suc real_of_nat_Suc_gt_zero) - done - then have "\N::nat. \n\N. inverse (real n + 1) < e" by auto - } - then have "((\n. inverse (real n + 1)) ---> 0) sequentially" - unfolding LIMSEQ_def by(auto simp add: dist_norm) - then have "(f ---> x) sequentially" - unfolding f_def - using tendsto_add[OF tendsto_const, of "\n::nat. (inverse (real n + 1)) *\<^sub>R ((1 / 2) *\<^sub>R (a + b) - x)" 0 sequentially x] - using tendsto_scaleR [OF _ tendsto_const, of "\n::nat. inverse (real n + 1)" 0 sequentially "((1 / 2) *\<^sub>R (a + b) - x)"] - by auto - } - ultimately have "x \ closure (box a b)" - using as and open_interval_midpoint[OF assms] - unfolding closure_def - unfolding islimpt_sequential - by (cases "x=?c") (auto simp: in_box_eucl_less) - } - then show ?thesis - using closure_minimal[OF interval_open_subset_closed closed_interval, of a b] by blast -qed - -lemma bounded_subset_open_interval_symmetric: - fixes s::"('a::ordered_euclidean_space) set" - assumes "bounded s" - shows "\a. s \ box (-a) a" -proof - - obtain b where "b>0" and b: "\x\s. norm x \ b" - using assms[unfolded bounded_pos] by auto - def a \ "(\i\Basis. (b + 1) *\<^sub>R i)::'a" - { - fix x - assume "x \ s" - fix i :: 'a - assume i: "i \ Basis" - then have "(-a)\i < x\i" and "x\i < a\i" - using b[THEN bspec[where x=x], OF `x\s`] - using Basis_le_norm[OF i, of x] - unfolding inner_simps and a_def - by auto - } - then show ?thesis - by (auto intro: exI[where x=a] simp add: interval) -qed - -lemma bounded_subset_open_interval: - fixes s :: "('a::ordered_euclidean_space) set" - shows "bounded s \ (\a b. s \ box a b)" - by (auto dest!: bounded_subset_open_interval_symmetric) - -lemma bounded_subset_closed_interval_symmetric: - fixes s :: "('a::ordered_euclidean_space) set" - assumes "bounded s" - shows "\a. s \ {-a .. a}" -proof - - obtain a where "s \ box (-a) a" - using bounded_subset_open_interval_symmetric[OF assms] by auto - then show ?thesis - using interval_open_subset_closed[of "-a" a] by auto -qed - -lemma bounded_subset_closed_interval: - fixes s :: "('a::ordered_euclidean_space) set" - shows "bounded s \ \a b. s \ {a .. b}" - using bounded_subset_closed_interval_symmetric[of s] by auto - -lemma frontier_closed_interval: - fixes a b :: "'a::ordered_euclidean_space" - shows "frontier {a .. b} = {a .. b} - box a b" - unfolding frontier_def unfolding interior_closed_interval and closure_closed[OF closed_interval] .. - -lemma frontier_open_interval: - fixes a b :: "'a::ordered_euclidean_space" - shows "frontier (box a b) = (if box a b = {} then {} else {a .. b} - box a b)" -proof (cases "box a b = {}") - case True - then show ?thesis - using frontier_empty by auto -next - case False - then show ?thesis - unfolding frontier_def and closure_open_interval[OF False] and interior_open[OF open_interval] - by auto -qed - -lemma inter_interval_mixed_eq_empty: - fixes a :: "'a::ordered_euclidean_space" - assumes "box c d \ {}" - shows "box a b \ {c .. d} = {} \ box a b \ box c d = {}" - unfolding closure_open_interval[OF assms, symmetric] - unfolding open_inter_closure_eq_empty[OF open_interval] .. - lemma open_box: "open (box a b)" proof - have "open (\i\Basis. (op \ i) -` {a \ i <..< b \ i})" @@ -6574,26 +6038,6 @@ instance euclidean_space \ polish_space .. -text {* Intervals in general, including infinite and mixtures of open and closed. *} - -definition "is_interval (s::('a::euclidean_space) set) \ - (\a\s. \b\s. \x. (\i\Basis. ((a\i \ x\i \ x\i \ b\i) \ (b\i \ x\i \ x\i \ a\i))) \ x \ s)" - -lemma is_interval_interval: "is_interval {a .. b::'a::ordered_euclidean_space}" (is ?th1) - "is_interval (box a b)" (is ?th2) proof - - show ?th1 ?th2 unfolding is_interval_def mem_interval Ball_def atLeastAtMost_iff - by(meson order_trans le_less_trans less_le_trans less_trans)+ qed - -lemma is_interval_empty: - "is_interval {}" - unfolding is_interval_def - by simp - -lemma is_interval_univ: - "is_interval UNIV" - unfolding is_interval_def - by simp - subsection {* Closure of halfspaces and hyperplanes *} @@ -6704,50 +6148,6 @@ lemma open_halfspace_component_gt: "open {x::'a::euclidean_space. x\i > a}" by (simp add: open_Collect_less) -text{* Instantiation for intervals on @{text ordered_euclidean_space} *} - -lemma eucl_lessThan_eq_halfspaces: - fixes a :: "'a\ordered_euclidean_space" - shows "{x. x i\Basis. {x. x \ i < a \ i})" - by (auto simp: eucl_less_def) - -lemma eucl_greaterThan_eq_halfspaces: - fixes a :: "'a\ordered_euclidean_space" - shows "{x. a i\Basis. {x. a \ i < x \ i})" - by (auto simp: eucl_less_def) - -lemma eucl_atMost_eq_halfspaces: - fixes a :: "'a\ordered_euclidean_space" - shows "{.. a} = (\i\Basis. {x. x \ i \ a \ i})" - by (auto simp: eucl_le[where 'a='a]) - -lemma eucl_atLeast_eq_halfspaces: - fixes a :: "'a\ordered_euclidean_space" - shows "{a ..} = (\i\Basis. {x. a \ i \ x \ i})" - by (auto simp: eucl_le[where 'a='a]) - -lemma open_eucl_lessThan[simp, intro]: - fixes a :: "'a\ordered_euclidean_space" - shows "open {x. x ordered_euclidean_space" - shows "open {x. a ordered_euclidean_space" - shows "closed {.. a}" - unfolding eucl_atMost_eq_halfspaces - by (simp add: closed_INT closed_Collect_le) - -lemma closed_eucl_atLeast[simp, intro]: - fixes a :: "'a\ordered_euclidean_space" - shows "closed {a ..}" - unfolding eucl_atLeast_eq_halfspaces - by (simp add: closed_INT closed_Collect_le) - text {* This gives a simple derivation of limit component bounds. *} lemma Lim_component_le: @@ -7339,69 +6739,6 @@ "(m::'a::linordered_field) \ 0 \ (y = m * x + c \ inverse(m) * y + -(c / m) = x)" by (simp add: field_simps inverse_eq_divide) -lemma image_affinity_interval: fixes m::real - fixes a b c :: "'a::ordered_euclidean_space" - shows "(\x. m *\<^sub>R x + c) ` {a .. b} = - (if {a .. b} = {} then {} - else (if 0 \ m then {m *\<^sub>R a + c .. m *\<^sub>R b + c} - else {m *\<^sub>R b + c .. m *\<^sub>R a + c}))" -proof (cases "m = 0") - case True - { - fix x - assume "x \ c" "c \ x" - then have "x = c" - unfolding eucl_le[where 'a='a] - apply - - apply (subst euclidean_eq_iff) - apply (auto intro: order_antisym) - done - } - moreover have "c \ {m *\<^sub>R a + c..m *\<^sub>R b + c}" - unfolding True by (auto simp add: eucl_le[where 'a='a]) - ultimately show ?thesis using True by auto -next - case False - { - fix y - assume "a \ y" "y \ b" "m > 0" - then have "m *\<^sub>R a + c \ m *\<^sub>R y + c" and "m *\<^sub>R y + c \ m *\<^sub>R b + c" - unfolding eucl_le[where 'a='a] by (auto simp: inner_distrib) - } - moreover - { - fix y - assume "a \ y" "y \ b" "m < 0" - then have "m *\<^sub>R b + c \ m *\<^sub>R y + c" and "m *\<^sub>R y + c \ m *\<^sub>R a + c" - unfolding eucl_le[where 'a='a] by (auto simp add: mult_left_mono_neg inner_distrib) - } - moreover - { - fix y - assume "m > 0" and "m *\<^sub>R a + c \ y" and "y \ m *\<^sub>R b + c" - then have "y \ (\x. m *\<^sub>R x + c) ` {a..b}" - unfolding image_iff Bex_def mem_interval eucl_le[where 'a='a] - apply (intro exI[where x="(1 / m) *\<^sub>R (y - c)"]) - apply (auto simp add: pos_le_divide_eq pos_divide_le_eq mult_commute diff_le_iff inner_distrib inner_diff_left) - done - } - moreover - { - fix y - assume "m *\<^sub>R b + c \ y" "y \ m *\<^sub>R a + c" "m < 0" - then have "y \ (\x. m *\<^sub>R x + c) ` {a..b}" - unfolding image_iff Bex_def mem_interval eucl_le[where 'a='a] - apply (intro exI[where x="(1 / m) *\<^sub>R (y - c)"]) - apply (auto simp add: neg_le_divide_eq neg_divide_le_eq mult_commute diff_le_iff inner_distrib inner_diff_left) - done - } - ultimately show ?thesis using False by auto -qed - -lemma image_smult_interval:"(\x. m *\<^sub>R (x::_::ordered_euclidean_space)) ` {a..b} = - (if {a..b} = {} then {} else if 0 \ m then {m *\<^sub>R a..m *\<^sub>R b} else {m *\<^sub>R b..m *\<^sub>R a})" - using image_affinity_interval[of m 0 a b] by auto - subsection {* Banach fixed point theorem (not really topological...) *}