author immler Tue, 18 Mar 2014 10:12:58 +0100 changeset 56189 c4daa97ac57a parent 56188 0268784f60da child 56190 f0d2609c4cdc
removed dependencies on theory Ordered_Euclidean_Space
```--- a/src/HOL/Multivariate_Analysis/Cartesian_Euclidean_Space.thy	Tue Mar 18 10:12:57 2014 +0100
+++ b/src/HOL/Multivariate_Analysis/Cartesian_Euclidean_Space.thy	Tue Mar 18 10:12:58 2014 +0100
@@ -331,25 +331,6 @@
using setsum_norm_allsubsets_bound[OF assms]

-instantiation vec :: (ordered_euclidean_space, finite) ordered_euclidean_space
-begin
-
-definition "inf x y = (\<chi> i. inf (x \$ i) (y \$ i))"
-definition "sup x y = (\<chi> i. sup (x \$ i) (y \$ i))"
-definition "Inf X = (\<chi> i. (INF x:X. x \$ i))"
-definition "Sup X = (\<chi> i. (SUP x:X. x \$ i))"
-definition "abs x = (\<chi> i. abs (x \$ i))"
-
-instance
-  apply default
-  unfolding euclidean_representation_setsum'
-  apply (auto simp: less_eq_vec_def inf_vec_def sup_vec_def Inf_vec_def Sup_vec_def inner_axis
-    Basis_vec_def inner_Basis_inf_left inner_Basis_sup_left inner_Basis_INF_left
-    inner_Basis_SUP_left eucl_le[where 'a='a] less_le_not_le abs_vec_def abs_inner)
-  done
-
-end
-
subsection {* Matrix operations *}

text{* Matrix notation. NB: an MxN matrix is of type @{typ "'a^'n^'m"}, not @{typ "'a^'m^'n"} *}```
```--- a/src/HOL/Multivariate_Analysis/Convex_Euclidean_Space.thy	Tue Mar 18 10:12:57 2014 +0100
+++ b/src/HOL/Multivariate_Analysis/Convex_Euclidean_Space.thy	Tue Mar 18 10:12:58 2014 +0100
@@ -7,7 +7,7 @@

theory Convex_Euclidean_Space
imports
-  Ordered_Euclidean_Space
+  Topology_Euclidean_Space
"~~/src/HOL/Library/Convex"
"~~/src/HOL/Library/Set_Algebras"
begin
@@ -3369,7 +3369,7 @@
have "box a b \<noteq> {}"
using assms
unfolding set_eq_iff
-    by (auto intro!: exI[of _ "(a + b) / 2"] simp: box)
+    by (auto intro!: exI[of _ "(a + b) / 2"] simp: box_def)
then show ?thesis
using interior_rel_interior_gen[of "cbox a b", symmetric]
by (simp split: split_if_asm del: box_real add: box_real[symmetric] interior_cbox)
@@ -5672,7 +5672,7 @@

lemma convex_box: "convex (cbox a b)" "convex (box a (b::'a::euclidean_space))"
apply (rule_tac[!] is_interval_convex)+
-  using is_interval_interval
+  using is_interval_box is_interval_cbox
apply auto
done
```
```--- a/src/HOL/Multivariate_Analysis/Fashoda.thy	Tue Mar 18 10:12:57 2014 +0100
+++ b/src/HOL/Multivariate_Analysis/Fashoda.thy	Tue Mar 18 10:12:58 2014 +0100
@@ -740,7 +740,7 @@
using ab startfin abab assms(3)
using assms(9-)
unfolding assms
-      apply (auto simp add: field_simps box)
+      apply (auto simp add: field_simps box_def)
done
then show "path_image ?P1 \<subseteq> cbox ?a ?b" .
have "path_image ?P2 \<subseteq> cbox ?a ?b"
@@ -752,7 +752,7 @@
using ab startfin abab assms(4)
using assms(9-)
unfolding assms
-      apply (auto simp add: field_simps box)
+      apply (auto simp add: field_simps box_def)
done
then show "path_image ?P2 \<subseteq> cbox ?a ?b" .
show "a \$ 1 - 2 = a \$ 1 - 2"```
```--- a/src/HOL/Multivariate_Analysis/Integration.thy	Tue Mar 18 10:12:57 2014 +0100
+++ b/src/HOL/Multivariate_Analysis/Integration.thy	Tue Mar 18 10:12:58 2014 +0100
@@ -223,9 +223,6 @@
using nonempty_Basis
by (fastforce simp add: set_eq_iff mem_box)

-lemma One_nonneg: "0 \<le> (One::'a::ordered_euclidean_space)"
-  by (auto intro: setsum_nonneg)
-
lemma interior_subset_union_intervals:
assumes "i = cbox a b"
and "j = cbox c d"
@@ -516,13 +513,6 @@
lemma content_real: "a \<le> b \<Longrightarrow> content {a..b} = b - a"
by (auto simp: interval_upperbound_def interval_lowerbound_def SUP_def INF_def content_def)

-lemma content_closed_interval:
-  fixes a :: "'a::ordered_euclidean_space"
-  assumes "a \<le> b"
-  shows "content {a .. b} = (\<Prod>i\<in>Basis. b\<bullet>i - a\<bullet>i)"
-  using content_cbox[of a b] assms
-  by (simp add: cbox_interval eucl_le[where 'a='a])
-
lemma content_singleton[simp]: "content {a} = 0"
proof -
have "content (cbox a a) = 0"
@@ -1173,7 +1163,7 @@
lemma elementary_bounded[dest]:
fixes s :: "'a::euclidean_space set"
shows "p division_of s \<Longrightarrow> bounded s"
-  unfolding division_of_def by (metis bounded_Union bounded_interval)
+  unfolding division_of_def by (metis bounded_Union bounded_cbox)

lemma elementary_subset_cbox:
"p division_of s \<Longrightarrow> \<exists>a b. s \<subseteq> cbox a (b::'a::euclidean_space)"
@@ -1998,7 +1988,7 @@
subsection {* The set we're concerned with must be closed. *}

lemma division_of_closed:
-  fixes i :: "'n::ordered_euclidean_space set"
+  fixes i :: "'n::euclidean_space set"
shows "s division_of i \<Longrightarrow> closed i"
unfolding division_of_def by fastforce

@@ -3759,7 +3749,7 @@
apply (rule tagged_division_union[OF assms(1-2)])
unfolding interval_split[OF k] interior_cbox
using k
-    apply (auto simp add: box elim!: ballE[where x=k])
+    apply (auto simp add: box_def elim!: ballE[where x=k])
done
qed

@@ -7131,12 +7121,6 @@
apply (rule has_integral_const)
done

-lemma integrable_const_ivl[intro]:
-  fixes a::"'a::ordered_euclidean_space"
-  shows "(\<lambda>x. c) integrable_on {a .. b}"
-  unfolding cbox_interval[symmetric]
-  by (rule integrable_const)
-
lemma integral_has_vector_derivative:
fixes f :: "real \<Rightarrow> 'a::banach"
assumes "continuous_on {a .. b} f"
@@ -9046,7 +9030,7 @@
}
assume "\<exists>a b. s = cbox a b"
then guess a b by (elim exE) note s=this
-  from bounded_interval[of a b, THEN conjunct1, unfolded bounded_pos] guess B ..
+  from bounded_cbox[of a b, unfolded bounded_pos] guess B ..
note B = conjunctD2[OF this,rule_format] show ?thesis
apply safe
proof -
@@ -9603,14 +9587,6 @@
apply auto
done

-lemma integrable_on_subinterval:
-  fixes f :: "'n::ordered_euclidean_space \<Rightarrow> 'a::banach"
-  assumes "f integrable_on s"
-    and "{a .. b} \<subseteq> s"
-  shows "f integrable_on {a .. b}"
-  using integrable_on_subcbox[of f s a b] assms
-

subsection {* A straddling criterion for integrability *}
```
```--- a/src/HOL/Multivariate_Analysis/Multivariate_Analysis.thy	Tue Mar 18 10:12:57 2014 +0100
+++ b/src/HOL/Multivariate_Analysis/Multivariate_Analysis.thy	Tue Mar 18 10:12:58 2014 +0100
@@ -1,5 +1,5 @@
theory Multivariate_Analysis
-imports Fashoda Extended_Real_Limits Determinants
+imports Fashoda Extended_Real_Limits Determinants Ordered_Euclidean_Space
begin

end```
```--- a/src/HOL/Multivariate_Analysis/Ordered_Euclidean_Space.thy	Tue Mar 18 10:12:57 2014 +0100
+++ b/src/HOL/Multivariate_Analysis/Ordered_Euclidean_Space.thy	Tue Mar 18 10:12:58 2014 +0100
@@ -1,6 +1,6 @@
theory Ordered_Euclidean_Space
imports
-  Topology_Euclidean_Space
+  Cartesian_Euclidean_Space
"~~/src/HOL/Library/Product_Order"
begin

@@ -174,707 +174,6 @@
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 {* Boxes *}
-
-lemma box:
-  fixes a :: "'a::euclidean_space"
-  shows "box a b = {x::'a. \<forall>i\<in>Basis. a\<bullet>i < x\<bullet>i \<and> x\<bullet>i < b\<bullet>i}"
-    and "cbox a b = {x::'a. \<forall>i\<in>Basis. a\<bullet>i \<le> x\<bullet>i \<and> x\<bullet>i \<le> b\<bullet>i}"
-  by (auto simp add:set_eq_iff box_def cbox_def)
-
-lemma mem_box:
-  fixes a :: "'a::euclidean_space"
-  shows "x \<in> box a b \<longleftrightarrow> (\<forall>i\<in>Basis. a\<bullet>i < x\<bullet>i \<and> x\<bullet>i < b\<bullet>i)"
-    and "x \<in> cbox a b \<longleftrightarrow> (\<forall>i\<in>Basis. a\<bullet>i \<le> x\<bullet>i \<and> x\<bullet>i \<le> b\<bullet>i)"
-  using box[of a b]
-  by auto
-
-lemma box_eq_empty:
-  fixes a :: "'a::euclidean_space"
-  shows "(box a b = {} \<longleftrightarrow> (\<exists>i\<in>Basis. b\<bullet>i \<le> a\<bullet>i))" (is ?th1)
-    and "(cbox a b = {} \<longleftrightarrow> (\<exists>i\<in>Basis. b\<bullet>i < a\<bullet>i))" (is ?th2)
-proof -
-  {
-    fix i x
-    assume i: "i\<in>Basis" and as:"b\<bullet>i \<le> a\<bullet>i" and x:"x\<in>box a b"
-    then have "a \<bullet> i < x \<bullet> i \<and> x \<bullet> i < b \<bullet> i"
-      unfolding mem_box by (auto simp: box_def)
-    then have "a\<bullet>i < b\<bullet>i" by auto
-    then have False using as by auto
-  }
-  moreover
-  {
-    assume as: "\<forall>i\<in>Basis. \<not> (b\<bullet>i \<le> a\<bullet>i)"
-    let ?x = "(1/2) *\<^sub>R (a + b)"
-    {
-      fix i :: 'a
-      assume i: "i \<in> Basis"
-      have "a\<bullet>i < b\<bullet>i"
-        using as[THEN bspec[where x=i]] i by auto
-      then have "a\<bullet>i < ((1/2) *\<^sub>R (a+b)) \<bullet> i" "((1/2) *\<^sub>R (a+b)) \<bullet> i < b\<bullet>i"
-    }
-    then have "box a b \<noteq> {}"
-      using mem_box(1)[of "?x" a b] by auto
-  }
-  ultimately show ?th1 by blast
-
-  {
-    fix i x
-    assume i: "i \<in> Basis" and as:"b\<bullet>i < a\<bullet>i" and x:"x\<in>cbox a b"
-    then have "a \<bullet> i \<le> x \<bullet> i \<and> x \<bullet> i \<le> b \<bullet> i"
-      unfolding mem_box by auto
-    then have "a\<bullet>i \<le> b\<bullet>i" by auto
-    then have False using as by auto
-  }
-  moreover
-  {
-    assume as:"\<forall>i\<in>Basis. \<not> (b\<bullet>i < a\<bullet>i)"
-    let ?x = "(1/2) *\<^sub>R (a + b)"
-    {
-      fix i :: 'a
-      assume i:"i \<in> Basis"
-      have "a\<bullet>i \<le> b\<bullet>i"
-        using as[THEN bspec[where x=i]] i by auto
-      then have "a\<bullet>i \<le> ((1/2) *\<^sub>R (a+b)) \<bullet> i" "((1/2) *\<^sub>R (a+b)) \<bullet> i \<le> b\<bullet>i"
-    }
-    then have "cbox a b \<noteq> {}"
-      using mem_box(2)[of "?x" a b] by auto
-  }
-  ultimately show ?th2 by blast
-qed
-
-lemma box_ne_empty:
-  fixes a :: "'a::euclidean_space"
-  shows "cbox a b \<noteq> {} \<longleftrightarrow> (\<forall>i\<in>Basis. a\<bullet>i \<le> b\<bullet>i)"
-  and "box a b \<noteq> {} \<longleftrightarrow> (\<forall>i\<in>Basis. a\<bullet>i < b\<bullet>i)"
-  unfolding box_eq_empty[of a b] by fastforce+
-
-lemma
-  fixes a :: "'a::euclidean_space"
-  shows cbox_sing: "cbox a a = {a}"
-    and box_sing: "box a a = {}"
-  unfolding set_eq_iff mem_box eq_iff [symmetric]
-  by (auto intro!: euclidean_eqI[where 'a='a])
-     (metis all_not_in_conv nonempty_Basis)
-
-lemma subset_box_imp:
-  fixes a :: "'a::euclidean_space"
-  shows "(\<forall>i\<in>Basis. a\<bullet>i \<le> c\<bullet>i \<and> d\<bullet>i \<le> b\<bullet>i) \<Longrightarrow> cbox c d \<subseteq> cbox a b"
-    and "(\<forall>i\<in>Basis. a\<bullet>i < c\<bullet>i \<and> d\<bullet>i < b\<bullet>i) \<Longrightarrow> cbox c d \<subseteq> box a b"
-    and "(\<forall>i\<in>Basis. a\<bullet>i \<le> c\<bullet>i \<and> d\<bullet>i \<le> b\<bullet>i) \<Longrightarrow> box c d \<subseteq> cbox a b"
-     and "(\<forall>i\<in>Basis. a\<bullet>i \<le> c\<bullet>i \<and> d\<bullet>i \<le> b\<bullet>i) \<Longrightarrow> box c d \<subseteq> box a b"
-  unfolding subset_eq[unfolded Ball_def] unfolding mem_box
-   by (best intro: order_trans less_le_trans le_less_trans less_imp_le)+
-
-lemma box_subset_cbox:
-  fixes a :: "'a::euclidean_space"
-  shows "box a b \<subseteq> cbox a b"
-  unfolding subset_eq [unfolded Ball_def] mem_box
-  by (fast intro: less_imp_le)
-
-lemma subset_box:
-  fixes a :: "'a::euclidean_space"
-  shows "cbox c d \<subseteq> cbox a b \<longleftrightarrow> (\<forall>i\<in>Basis. c\<bullet>i \<le> d\<bullet>i) --> (\<forall>i\<in>Basis. a\<bullet>i \<le> c\<bullet>i \<and> d\<bullet>i \<le> b\<bullet>i)" (is ?th1)
-    and "cbox c d \<subseteq> box a b \<longleftrightarrow> (\<forall>i\<in>Basis. c\<bullet>i \<le> d\<bullet>i) --> (\<forall>i\<in>Basis. a\<bullet>i < c\<bullet>i \<and> d\<bullet>i < b\<bullet>i)" (is ?th2)
-    and "box c d \<subseteq> cbox a b \<longleftrightarrow> (\<forall>i\<in>Basis. c\<bullet>i < d\<bullet>i) --> (\<forall>i\<in>Basis. a\<bullet>i \<le> c\<bullet>i \<and> d\<bullet>i \<le> b\<bullet>i)" (is ?th3)
-    and "box c d \<subseteq> box a b \<longleftrightarrow> (\<forall>i\<in>Basis. c\<bullet>i < d\<bullet>i) --> (\<forall>i\<in>Basis. a\<bullet>i \<le> c\<bullet>i \<and> d\<bullet>i \<le> b\<bullet>i)" (is ?th4)
-proof -
-  show ?th1
-    unfolding subset_eq and Ball_def and mem_box
-    by (auto intro: order_trans)
-  show ?th2
-    unfolding subset_eq and Ball_def and mem_box
-    by (auto intro: le_less_trans less_le_trans order_trans less_imp_le)
-  {
-    assume as: "box c d \<subseteq> cbox a b" "\<forall>i\<in>Basis. c\<bullet>i < d\<bullet>i"
-    then have "box c d \<noteq> {}"
-      unfolding box_eq_empty by auto
-    fix i :: 'a
-    assume i: "i \<in> Basis"
-    (** TODO combine the following two parts as done in the HOL_light version. **)
-    {
-      let ?x = "(\<Sum>j\<in>Basis. (if j=i then ((min (a\<bullet>j) (d\<bullet>j))+c\<bullet>j)/2 else (c\<bullet>j+d\<bullet>j)/2) *\<^sub>R j)::'a"
-      assume as2: "a\<bullet>i > c\<bullet>i"
-      {
-        fix j :: 'a
-        assume j: "j \<in> Basis"
-        then have "c \<bullet> j < ?x \<bullet> j \<and> ?x \<bullet> j < d \<bullet> j"
-          apply (cases "j = i")
-          using as(2)[THEN bspec[where x=j]] i
-          apply (auto simp add: as2)
-          done
-      }
-      then have "?x\<in>box c d"
-        using i unfolding mem_box by auto
-      moreover
-      have "?x \<notin> cbox a b"
-        unfolding mem_box
-        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\<bullet>i \<le> c\<bullet>i" by (rule ccontr) auto
-    moreover
-    {
-      let ?x = "(\<Sum>j\<in>Basis. (if j=i then ((max (b\<bullet>j) (c\<bullet>j))+d\<bullet>j)/2 else (c\<bullet>j+d\<bullet>j)/2) *\<^sub>R j)::'a"
-      assume as2: "b\<bullet>i < d\<bullet>i"
-      {
-        fix j :: 'a
-        assume "j\<in>Basis"
-        then have "d \<bullet> j > ?x \<bullet> j \<and> ?x \<bullet> j > c \<bullet> j"
-          apply (cases "j = i")
-          using as(2)[THEN bspec[where x=j]]
-          apply (auto simp add: as2)
-          done
-      }
-      then have "?x\<in>box c d"
-        unfolding mem_box by auto
-      moreover
-      have "?x\<notin>cbox a b"
-        unfolding mem_box
-        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\<bullet>i \<ge> d\<bullet>i" by (rule ccontr) auto
-    ultimately
-    have "a\<bullet>i \<le> c\<bullet>i \<and> d\<bullet>i \<le> b\<bullet>i" by auto
-  } note part1 = this
-  show ?th3
-    unfolding subset_eq and Ball_def and mem_box
-    apply (rule, rule, rule, rule)
-    apply (rule part1)
-    unfolding subset_eq and Ball_def and mem_box
-    prefer 4
-    apply auto
-    apply (erule_tac x=xa in allE, erule_tac x=xa in allE, fastforce)+
-    done
-  {
-    assume as: "box c d \<subseteq> box a b" "\<forall>i\<in>Basis. c\<bullet>i < d\<bullet>i"
-    fix i :: 'a
-    assume i:"i\<in>Basis"
-    from as(1) have "box c d \<subseteq> cbox a b"
-      using box_subset_cbox[of a b] by auto
-    then have "a\<bullet>i \<le> c\<bullet>i \<and> d\<bullet>i \<le> b\<bullet>i"
-      using part1 and as(2) using i by auto
-  } note * = this
-  show ?th4
-    unfolding subset_eq and Ball_def and mem_box
-    apply (rule, rule, rule, rule)
-    apply (rule *)
-    unfolding subset_eq and Ball_def and mem_box
-    prefer 4
-    apply auto
-    apply (erule_tac x=xa in allE, simp)+
-    done
-qed
-
-lemma inter_interval:
-  fixes a :: "'a::euclidean_space"
-  shows "cbox a b \<inter> cbox c d =
-    cbox (\<Sum>i\<in>Basis. max (a\<bullet>i) (c\<bullet>i) *\<^sub>R i) (\<Sum>i\<in>Basis. min (b\<bullet>i) (d\<bullet>i) *\<^sub>R i)"
-  unfolding set_eq_iff and Int_iff and mem_box
-  by auto
-
-lemma disjoint_interval:
-  fixes a::"'a::euclidean_space"
-  shows "cbox a b \<inter> cbox c d = {} \<longleftrightarrow> (\<exists>i\<in>Basis. (b\<bullet>i < a\<bullet>i \<or> d\<bullet>i < c\<bullet>i \<or> b\<bullet>i < c\<bullet>i \<or> d\<bullet>i < a\<bullet>i))" (is ?th1)
-    and "cbox a b \<inter> box c d = {} \<longleftrightarrow> (\<exists>i\<in>Basis. (b\<bullet>i < a\<bullet>i \<or> d\<bullet>i \<le> c\<bullet>i \<or> b\<bullet>i \<le> c\<bullet>i \<or> d\<bullet>i \<le> a\<bullet>i))" (is ?th2)
-    and "box a b \<inter> cbox c d = {} \<longleftrightarrow> (\<exists>i\<in>Basis. (b\<bullet>i \<le> a\<bullet>i \<or> d\<bullet>i < c\<bullet>i \<or> b\<bullet>i \<le> c\<bullet>i \<or> d\<bullet>i \<le> a\<bullet>i))" (is ?th3)
-    and "box a b \<inter> box c d = {} \<longleftrightarrow> (\<exists>i\<in>Basis. (b\<bullet>i \<le> a\<bullet>i \<or> d\<bullet>i \<le> c\<bullet>i \<or> b\<bullet>i \<le> c\<bullet>i \<or> d\<bullet>i \<le> a\<bullet>i))" (is ?th4)
-proof -
-  let ?z = "(\<Sum>i\<in>Basis. (((max (a\<bullet>i) (c\<bullet>i)) + (min (b\<bullet>i) (d\<bullet>i))) / 2) *\<^sub>R i)::'a"
-  have **: "\<And>P Q. (\<And>i :: 'a. i \<in> Basis \<Longrightarrow> Q ?z i \<Longrightarrow> P i) \<Longrightarrow>
-      (\<And>i x :: 'a. i \<in> Basis \<Longrightarrow> P i \<Longrightarrow> Q x i) \<Longrightarrow> (\<forall>x. \<exists>i\<in>Basis. Q x i) \<longleftrightarrow> (\<exists>i\<in>Basis. P i)"
-    by blast
-  note * = set_eq_iff Int_iff empty_iff mem_box 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 box_subset_cbox a bit upwards *)
-
-lemma open_box[intro]:
-  fixes a b :: "'a::euclidean_space"
-  shows "open (box a b)"
-proof -
-  have "open (\<Inter>i\<in>Basis. (\<lambda>x. x\<bullet>i) -` {a\<bullet>i<..<b\<bullet>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 "(\<Inter>i\<in>Basis. (\<lambda>x. x\<bullet>i) -` {a\<bullet>i<..<b\<bullet>i}) = box a b"
-    by (auto simp add: box)
-  finally show "open (box a b)" .
-qed
-
-lemma closed_cbox[intro]:
-  fixes a b :: "'a::euclidean_space"
-  shows "closed (cbox a b)"
-proof -
-  have "closed (\<Inter>i\<in>Basis. (\<lambda>x. x\<bullet>i) -` {a\<bullet>i .. b\<bullet>i})"
-    by (intro closed_INT ballI continuous_closed_vimage allI
-      linear_continuous_at closed_real_atLeastAtMost finite_Basis bounded_linear_inner_left)
-  also have "(\<Inter>i\<in>Basis. (\<lambda>x. x\<bullet>i) -` {a\<bullet>i .. b\<bullet>i}) = cbox a b"
-    by (auto simp add: cbox_def)
-  finally show "closed (cbox a b)" .
-qed
-
-lemma interior_cbox [intro]:
-  fixes a b :: "'a::euclidean_space"
-  shows "interior (cbox a b) = box a b" (is "?L = ?R")
-proof(rule subset_antisym)
-  show "?R \<subseteq> ?L"
-    using box_subset_cbox open_box
-    by (rule interior_maximal)
-  {
-    fix x
-    assume "x \<in> interior (cbox a b)"
-    then obtain s where s: "open s" "x \<in> s" "s \<subseteq> cbox a b" ..
-    then obtain e where "e>0" and e:"\<forall>x'. dist x' x < e \<longrightarrow> x' \<in> cbox a b"
-      unfolding open_dist and subset_eq by auto
-    {
-      fix i :: 'a
-      assume i: "i \<in> 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 \<bullet> i \<le> (x - (e / 2) *\<^sub>R i) \<bullet> i" and "(x + (e / 2) *\<^sub>R i) \<bullet> i \<le> b \<bullet> 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_box
-        using i
-        by blast+
-      then have "a \<bullet> i < x \<bullet> i" and "x \<bullet> i < b \<bullet> i"
-        using `e>0` i
-        by (auto simp: inner_diff_left inner_Basis inner_add_left)
-    }
-    then have "x \<in> box a b"
-      unfolding mem_box by auto
-  }
-  then show "?L \<subseteq> ?R" ..
-qed
-
-lemma bounded_cbox:
-  fixes a :: "'a::euclidean_space"
-  shows "bounded (cbox a b)"
-proof -
-  let ?b = "\<Sum>i\<in>Basis. \<bar>a\<bullet>i\<bar> + \<bar>b\<bullet>i\<bar>"
-  {
-    fix x :: "'a"
-    assume x: "\<forall>i\<in>Basis. a \<bullet> i \<le> x \<bullet> i \<and> x \<bullet> i \<le> b \<bullet> i"
-    {
-      fix i :: 'a
-      assume "i \<in> Basis"
-      then have "\<bar>x\<bullet>i\<bar> \<le> \<bar>a\<bullet>i\<bar> + \<bar>b\<bullet>i\<bar>"
-        using x[THEN bspec[where x=i]] by auto
-    }
-    then have "(\<Sum>i\<in>Basis. \<bar>x \<bullet> i\<bar>) \<le> ?b"
-      apply -
-      apply (rule setsum_mono)
-      apply auto
-      done
-    then have "norm x \<le> ?b"
-      using norm_le_l1[of x] by auto
-  }
-  then show ?thesis
-    unfolding box and bounded_iff by auto
-qed
-
-lemma bounded_interval:
-  fixes a :: "'a::euclidean_space"
-  shows "bounded (cbox a b) \<and> bounded (box a b)"
-  using bounded_cbox[of a b]
-  using box_subset_cbox[of a b]
-  using bounded_subset[of "cbox a b" "box a b"]
-  by simp
-
-lemma not_interval_univ:
-  fixes a :: "'a::euclidean_space"
-  shows "cbox a b \<noteq> UNIV \<and> box a b \<noteq> UNIV"
-  using bounded_interval[of a b] by auto
-
-lemma compact_cbox:
-  fixes a :: "'a::euclidean_space"
-  shows "compact (cbox a b)"
-  using bounded_closed_imp_seq_compact[of "cbox a b"] using bounded_interval[of a b]
-  by (auto simp: compact_eq_seq_compact_metric)
-
-lemma open_interval_midpoint:
-  fixes a :: "'a::euclidean_space"
-  assumes "box a b \<noteq> {}"
-  shows "((1/2) *\<^sub>R (a + b)) \<in> box a b"
-proof -
-  {
-    fix i :: 'a
-    assume "i \<in> Basis"
-    then have "a \<bullet> i < ((1 / 2) *\<^sub>R (a + b)) \<bullet> i \<and> ((1 / 2) *\<^sub>R (a + b)) \<bullet> i < b \<bullet> i"
-      using assms[unfolded box_ne_empty, THEN bspec[where x=i]] by (auto simp: inner_add_left)
-  }
-  then show ?thesis unfolding mem_box by auto
-qed
-
-lemma open_closed_interval_convex:
-  fixes x :: "'a::euclidean_space"
-  assumes x: "x \<in> box a b"
-    and y: "y \<in> cbox a b"
-    and e: "0 < e" "e \<le> 1"
-  shows "(e *\<^sub>R x + (1 - e) *\<^sub>R y) \<in> box a b"
-proof -
-  {
-    fix i :: 'a
-    assume i: "i \<in> Basis"
-    have "a \<bullet> i = e * (a \<bullet> i) + (1 - e) * (a \<bullet> i)"
-      unfolding left_diff_distrib by simp
-    also have "\<dots> < e * (x \<bullet> i) + (1 - e) * (y \<bullet> i)"
-      using e unfolding mult_less_cancel_left and mult_le_cancel_left
-      apply simp_all
-      using x unfolding mem_box using i
-      apply simp
-      using y unfolding mem_box using i
-      apply simp
-      done
-    finally have "a \<bullet> i < (e *\<^sub>R x + (1 - e) *\<^sub>R y) \<bullet> i"
-      unfolding inner_simps by auto
-    moreover
-    {
-      have "b \<bullet> i = e * (b\<bullet>i) + (1 - e) * (b\<bullet>i)"
-        unfolding left_diff_distrib by simp
-      also have "\<dots> > e * (x \<bullet> i) + (1 - e) * (y \<bullet> i)"
-        using e unfolding mult_less_cancel_left and mult_le_cancel_left
-        apply simp_all
-        using x
-        unfolding mem_box
-        using i
-        apply simp
-        using y
-        unfolding mem_box
-        using i
-        apply simp
-        done
-      finally have "(e *\<^sub>R x + (1 - e) *\<^sub>R y) \<bullet> i < b \<bullet> i"
-        unfolding inner_simps by auto
-    }
-    ultimately have "a \<bullet> i < (e *\<^sub>R x + (1 - e) *\<^sub>R y) \<bullet> i \<and> (e *\<^sub>R x + (1 - e) *\<^sub>R y) \<bullet> i < b \<bullet> i"
-      by auto
-  }
-  then show ?thesis
-    unfolding mem_box by auto
-qed
-
-notation
-  eucl_less (infix "<e" 50)
-
-lemma closure_open_interval:
-  fixes a :: "'a::euclidean_space"
-   assumes "box a b \<noteq> {}"
-  shows "closure (box a b) = cbox a b"
-proof -
-  have ab: "a <e b"
-    using assms by (simp add: eucl_less_def box_ne_empty)
-  let ?c = "(1 / 2) *\<^sub>R (a + b)"
-  {
-    fix x
-    assume as:"x \<in> cbox a b"
-    def f \<equiv> "\<lambda>n::nat. x + (inverse (real n + 1)) *\<^sub>R (?c - x)"
-    {
-      fix n
-      assume fn: "f n <e b \<longrightarrow> a <e f n \<longrightarrow> f n = x" and xc: "x \<noteq> ?c"
-      have *: "0 < inverse (real n + 1)" "inverse (real n + 1) \<le> 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 <e b" and "a <e f n"
-        using open_closed_interval_convex[OF open_interval_midpoint[OF assms] as *]
-        unfolding f_def by (auto simp: box eucl_less_def)
-      then have False
-        using fn unfolding f_def using xc by auto
-    }
-    moreover
-    {
-      assume "\<not> (f ---> x) sequentially"
-      {
-        fix e :: real
-        assume "e > 0"
-        then have "\<exists>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 "\<forall>n\<ge>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 "\<exists>N::nat. \<forall>n\<ge>N. inverse (real n + 1) < e" by auto
-      }
-      then have "((\<lambda>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 "\<lambda>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 "\<lambda>n::nat. inverse (real n + 1)" 0 sequentially "((1 / 2) *\<^sub>R (a + b) - x)"]
-        by auto
-    }
-    ultimately have "x \<in> 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 box_subset_cbox, of a b] by blast
-qed
-
-lemma bounded_subset_open_interval_symmetric:
-  fixes s::"('a::euclidean_space) set"
-  assumes "bounded s"
-  shows "\<exists>a. s \<subseteq> box (-a) a"
-proof -
-  obtain b where "b>0" and b: "\<forall>x\<in>s. norm x \<le> b"
-    using assms[unfolded bounded_pos] by auto
-  def a \<equiv> "(\<Sum>i\<in>Basis. (b + 1) *\<^sub>R i)::'a"
-  {
-    fix x
-    assume "x \<in> s"
-    fix i :: 'a
-    assume i: "i \<in> Basis"
-    then have "(-a)\<bullet>i < x\<bullet>i" and "x\<bullet>i < a\<bullet>i"
-      using b[THEN bspec[where x=x], OF `x\<in>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: box)
-qed
-
-lemma bounded_subset_open_interval:
-  fixes s :: "('a::euclidean_space) set"
-  shows "bounded s \<Longrightarrow> (\<exists>a b. s \<subseteq> box a b)"
-  by (auto dest!: bounded_subset_open_interval_symmetric)
-
-lemma bounded_subset_cbox_symmetric:
-  fixes s :: "('a::euclidean_space) set"
-   assumes "bounded s"
-  shows "\<exists>a. s \<subseteq> cbox (-a) a"
-proof -
-  obtain a where "s \<subseteq> box (-a) a"
-    using bounded_subset_open_interval_symmetric[OF assms] by auto
-  then show ?thesis
-    using box_subset_cbox[of "-a" a] by auto
-qed
-
-lemma bounded_subset_cbox:
-  fixes s :: "('a::euclidean_space) set"
-  shows "bounded s \<Longrightarrow> \<exists>a b. s \<subseteq> cbox a b"
-  using bounded_subset_cbox_symmetric[of s] by auto
-
-lemma frontier_closed_interval:
-  fixes a b :: "'a::euclidean_space"
-  shows "frontier (cbox a b) = cbox a b - box a b"
-  unfolding frontier_def unfolding interior_cbox and closure_closed[OF closed_cbox] ..
-
-lemma frontier_open_interval:
-  fixes a b :: "'a::euclidean_space"
-  shows "frontier (box a b) = (if box a b = {} then {} else cbox 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_box]
-    by auto
-qed
-
-lemma inter_interval_mixed_eq_empty:
-  fixes a :: "'a::euclidean_space"
-   assumes "box c d \<noteq> {}"
-  shows "box a b \<inter> cbox c d = {} \<longleftrightarrow> box a b \<inter> box c d = {}"
-  unfolding closure_open_interval[OF assms, symmetric]
-  unfolding open_inter_closure_eq_empty[OF open_box] ..
-
-lemma diameter_closed_interval:
-  fixes a b::"'a::ordered_euclidean_space"
-  shows "a \<le> b \<Longrightarrow> diameter {a..b} = dist a b"
-  by (force simp add: diameter_def SUP_def simp del: Sup_image_eq intro!: cSup_eq_maximum setL2_mono
-     simp: euclidean_dist_l2[where 'a='a] eucl_le[where 'a='a] dist_norm)
-
-text {* Intervals in general, including infinite and mixtures of open and closed. *}
-
-definition "is_interval (s::('a::euclidean_space) set) \<longleftrightarrow>
-  (\<forall>a\<in>s. \<forall>b\<in>s. \<forall>x. (\<forall>i\<in>Basis. ((a\<bullet>i \<le> x\<bullet>i \<and> x\<bullet>i \<le> b\<bullet>i) \<or> (b\<bullet>i \<le> x\<bullet>i \<and> x\<bullet>i \<le> a\<bullet>i))) \<longrightarrow> x \<in> s)"
-
-lemma is_interval_interval: "is_interval (cbox a (b::'a::euclidean_space))" (is ?th1)
-  "is_interval (box a b)" (is ?th2) proof -
-  show ?th1 ?th2  unfolding is_interval_def mem_box 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
-
-lemma mem_is_intervalI:
-  assumes "is_interval s"
-  assumes "a \<in> s" "b \<in> s"
-  assumes "\<And>i. i \<in> Basis \<Longrightarrow> a \<bullet> i \<le> x \<bullet> i \<and> x \<bullet> i \<le> b \<bullet> i \<or> b \<bullet> i \<le> x \<bullet> i \<and> x \<bullet> i \<le> a \<bullet> i"
-  shows "x \<in> s"
-  by (rule assms(1)[simplified is_interval_def, rule_format, OF assms(2,3,4)])
-
-lemma interval_subst:
-  fixes S::"'a::ordered_euclidean_space set"
-  assumes "is_interval S"
-  assumes "x \<in> S" "y j \<in> S"
-  assumes "j \<in> Basis"
-  shows "(\<Sum>i\<in>Basis. (if i = j then y i \<bullet> i else x \<bullet> i) *\<^sub>R i) \<in> S"
-  by (rule mem_is_intervalI[OF assms(1,2)]) (auto simp: assms)
-
-lemma mem_box_componentwiseI:
-  fixes S::"'a::ordered_euclidean_space set"
-  assumes "is_interval S"
-  assumes "\<And>i. i \<in> Basis \<Longrightarrow> x \<bullet> i \<in> ((\<lambda>x. x \<bullet> i) ` S)"
-  shows "x \<in> S"
-proof -
-  from assms have "\<forall>i \<in> Basis. \<exists>s \<in> S. x \<bullet> i = s \<bullet> i"
-    by auto
-  with finite_Basis obtain s and bs::"'a list" where
-    s: "\<And>i. i \<in> Basis \<Longrightarrow> x \<bullet> i = s i \<bullet> i" "\<And>i. i \<in> Basis \<Longrightarrow> s i \<in> S" and
-    bs: "set bs = Basis" "distinct bs"
-    by (metis finite_distinct_list)
-  from nonempty_Basis s obtain j where j: "j \<in> Basis" "s j \<in> S" by blast
-  def y \<equiv> "rec_list
-    (s j)
-    (\<lambda>j _ Y. (\<Sum>i\<in>Basis. (if i = j then s i \<bullet> i else Y \<bullet> i) *\<^sub>R i))"
-  have "x = (\<Sum>i\<in>Basis. (if i \<in> set bs then s i \<bullet> i else s j \<bullet> i) *\<^sub>R i)"
-    using bs by (auto simp add: s(1)[symmetric] euclidean_representation)
-  also have [symmetric]: "y bs = \<dots>"
-    using bs(2) bs(1)[THEN equalityD1]
-    by (induct bs) (auto simp: y_def euclidean_representation intro!: euclidean_eqI[where 'a='a])
-  also have "y bs \<in> S"
-    using bs(1)[THEN equalityD1]
-    apply (induct bs)
-    apply (auto simp: y_def j)
-    apply (rule interval_subst[OF assms(1)])
-    apply (auto simp: s)
-    done
-  finally show ?thesis .
-qed
-
-lemma eucl_less_eq_halfspaces:
-  fixes a :: "'a\<Colon>euclidean_space"
-  shows "{x. x <e a} = (\<Inter>i\<in>Basis. {x. x \<bullet> i < a \<bullet> i})"
-    "{x. a <e x} = (\<Inter>i\<in>Basis. {x. a \<bullet> i < x \<bullet> i})"
-  by (auto simp: eucl_less_def)
-
-lemma eucl_le_eq_halfspaces:
-  fixes a :: "'a\<Colon>euclidean_space"
-  shows "{x. \<forall>i\<in>Basis. x \<bullet> i \<le> a \<bullet> i} = (\<Inter>i\<in>Basis. {x. x \<bullet> i \<le> a \<bullet> i})"
-    "{x. \<forall>i\<in>Basis. a \<bullet> i \<le> x \<bullet> i} = (\<Inter>i\<in>Basis. {x. a \<bullet> i \<le> x \<bullet> i})"
-  by auto
-
-lemma open_Collect_eucl_less[simp, intro]:
-  fixes a :: "'a\<Colon>euclidean_space"
-  shows "open {x. x <e a}"
-    "open {x. a <e x}"
-  by (auto simp: eucl_less_eq_halfspaces open_halfspace_component_lt open_halfspace_component_gt)
-
-lemma closed_Collect_eucl_le[simp, intro]:
-  fixes a :: "'a\<Colon>euclidean_space"
-  shows "closed {x. \<forall>i\<in>Basis. a \<bullet> i \<le> x \<bullet> i}"
-    "closed {x. \<forall>i\<in>Basis. x \<bullet> i \<le> a \<bullet> i}"
-  unfolding eucl_le_eq_halfspaces
-  by (simp_all add: closed_INT closed_Collect_le)
-
-lemma image_affinity_cbox: fixes m::real
-  fixes a b c :: "'a::euclidean_space"
-  shows "(\<lambda>x. m *\<^sub>R x + c) ` cbox a b =
-    (if cbox a b = {} then {}
-     else (if 0 \<le> m then cbox (m *\<^sub>R a + c) (m *\<^sub>R b + c)
-     else cbox (m *\<^sub>R b + c) (m *\<^sub>R a + c)))"
-proof (cases "m = 0")
-  case True
-  {
-    fix x
-    assume "\<forall>i\<in>Basis. x \<bullet> i \<le> c \<bullet> i" "\<forall>i\<in>Basis. c \<bullet> i \<le> x \<bullet> i"
-    then have "x = c"
-      apply -
-      apply (subst euclidean_eq_iff)
-      apply (auto intro: order_antisym)
-      done
-  }
-  moreover have "c \<in> cbox (m *\<^sub>R a + c) (m *\<^sub>R b + c)"
-    unfolding True by (auto simp add: cbox_sing)
-  ultimately show ?thesis using True by (auto simp: cbox_def)
-next
-  case False
-  {
-    fix y
-    assume "\<forall>i\<in>Basis. a \<bullet> i \<le> y \<bullet> i" "\<forall>i\<in>Basis. y \<bullet> i \<le> b \<bullet> i" "m > 0"
-    then have "\<forall>i\<in>Basis. (m *\<^sub>R a + c) \<bullet> i \<le> (m *\<^sub>R y + c) \<bullet> i" and "\<forall>i\<in>Basis. (m *\<^sub>R y + c) \<bullet> i \<le> (m *\<^sub>R b + c) \<bullet> i"
-      by (auto simp: inner_distrib)
-  }
-  moreover
-  {
-    fix y
-    assume "\<forall>i\<in>Basis. a \<bullet> i \<le> y \<bullet> i" "\<forall>i\<in>Basis. y \<bullet> i \<le> b \<bullet> i" "m < 0"
-    then have "\<forall>i\<in>Basis. (m *\<^sub>R b + c) \<bullet> i \<le> (m *\<^sub>R y + c) \<bullet> i" and "\<forall>i\<in>Basis. (m *\<^sub>R y + c) \<bullet> i \<le> (m *\<^sub>R a + c) \<bullet> i"
-      by (auto simp add: mult_left_mono_neg inner_distrib)
-  }
-  moreover
-  {
-    fix y
-    assume "m > 0" and "\<forall>i\<in>Basis. (m *\<^sub>R a + c) \<bullet> i \<le> y \<bullet> i" and "\<forall>i\<in>Basis. y \<bullet> i \<le> (m *\<^sub>R b + c) \<bullet> i"
-    then have "y \<in> (\<lambda>x. m *\<^sub>R x + c) ` cbox a b"
-      unfolding image_iff Bex_def mem_box
-      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 "\<forall>i\<in>Basis. (m *\<^sub>R b + c) \<bullet> i \<le> y \<bullet> i" "\<forall>i\<in>Basis. y \<bullet> i \<le> (m *\<^sub>R a + c) \<bullet> i" "m < 0"
-    then have "y \<in> (\<lambda>x. m *\<^sub>R x + c) ` cbox a b"
-      unfolding image_iff Bex_def mem_box
-      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 simp: cbox_def)
-qed
-
-lemma image_smult_cbox:"(\<lambda>x. m *\<^sub>R (x::_::euclidean_space)) ` cbox a b =
-  (if cbox a b = {} then {} else if 0 \<le> m then cbox (m *\<^sub>R a) (m *\<^sub>R b) else cbox (m *\<^sub>R b) (m *\<^sub>R a))"
-  using image_affinity_cbox[of m 0 a b] by auto
-
text{* Instantiation for intervals on @{text ordered_euclidean_space} *}

lemma
@@ -900,6 +199,12 @@
shows "closed {a..}"

+lemma bounded_closed_interval:
+  fixes a :: "'a::ordered_euclidean_space"
+  shows "bounded {a .. b}"
+  using bounded_cbox[of a b]
+  by (metis interval_cbox)
+
lemma image_affinity_interval: fixes m::real
fixes a b c :: "'a::ordered_euclidean_space"
shows "(\<lambda>x. m *\<^sub>R x + c) ` {a..b} =
@@ -914,7 +219,55 @@
using image_smult_cbox[of m a b]

+lemma is_interval_closed_interval:
+  "is_interval {a .. (b::'a::ordered_euclidean_space)}"
+  by (metis cbox_interval is_interval_cbox)
+
no_notation
eucl_less (infix "<e" 50)

+lemma One_nonneg: "0 \<le> (\<Sum>Basis::'a::ordered_euclidean_space)"
+  by (auto intro: setsum_nonneg)
+
+lemma content_closed_interval:
+  fixes a :: "'a::ordered_euclidean_space"
+  assumes "a \<le> b"
+  shows "content {a .. b} = (\<Prod>i\<in>Basis. b\<bullet>i - a\<bullet>i)"
+  using content_cbox[of a b] assms
+  by (simp add: cbox_interval eucl_le[where 'a='a])
+
+lemma integrable_const_ivl[intro]:
+  fixes a::"'a::ordered_euclidean_space"
+  shows "(\<lambda>x. c) integrable_on {a .. b}"
+  unfolding cbox_interval[symmetric]
+  by (rule integrable_const)
+
+lemma integrable_on_subinterval:
+  fixes f :: "'n::ordered_euclidean_space \<Rightarrow> 'a::banach"
+  assumes "f integrable_on s"
+    and "{a .. b} \<subseteq> s"
+  shows "f integrable_on {a .. b}"
+  using integrable_on_subcbox[of f s a b] assms
+
+instantiation vec :: (ordered_euclidean_space, finite) ordered_euclidean_space
+begin
+
+definition "inf x y = (\<chi> i. inf (x \$ i) (y \$ i))"
+definition "sup x y = (\<chi> i. sup (x \$ i) (y \$ i))"
+definition "Inf X = (\<chi> i. (INF x:X. x \$ i))"
+definition "Sup X = (\<chi> i. (SUP x:X. x \$ i))"
+definition "abs x = (\<chi> i. abs (x \$ i))"
+
+instance
+  apply default
+  unfolding euclidean_representation_setsum'
+  apply (auto simp: less_eq_vec_def inf_vec_def sup_vec_def Inf_vec_def Sup_vec_def inner_axis
+    Basis_vec_def inner_Basis_inf_left inner_Basis_sup_left inner_Basis_INF_left
+    inner_Basis_SUP_left eucl_le[where 'a='a] less_le_not_le abs_vec_def abs_inner)
+  done
+
end
+
+end
+```
```--- a/src/HOL/Multivariate_Analysis/Topology_Euclidean_Space.thy	Tue Mar 18 10:12:57 2014 +0100
+++ b/src/HOL/Multivariate_Analysis/Topology_Euclidean_Space.thy	Tue Mar 18 10:12:58 2014 +0100
@@ -822,6 +822,9 @@
unfolding dist_norm norm_eq_sqrt_inner setL2_def
by (subst euclidean_inner) (simp add: power2_eq_square inner_diff_left)

+
+subsection {* Boxes *}
+
definition (in euclidean_space) eucl_less (infix "<e" 50)
where "eucl_less a b \<longleftrightarrow> (\<forall>i\<in>Basis. a \<bullet> i < b \<bullet> i)"

@@ -926,6 +929,285 @@
then show ?thesis by (auto simp: I_def)
qed

+lemma box_eq_empty:
+  fixes a :: "'a::euclidean_space"
+  shows "(box a b = {} \<longleftrightarrow> (\<exists>i\<in>Basis. b\<bullet>i \<le> a\<bullet>i))" (is ?th1)
+    and "(cbox a b = {} \<longleftrightarrow> (\<exists>i\<in>Basis. b\<bullet>i < a\<bullet>i))" (is ?th2)
+proof -
+  {
+    fix i x
+    assume i: "i\<in>Basis" and as:"b\<bullet>i \<le> a\<bullet>i" and x:"x\<in>box a b"
+    then have "a \<bullet> i < x \<bullet> i \<and> x \<bullet> i < b \<bullet> i"
+      unfolding mem_box by (auto simp: box_def)
+    then have "a\<bullet>i < b\<bullet>i" by auto
+    then have False using as by auto
+  }
+  moreover
+  {
+    assume as: "\<forall>i\<in>Basis. \<not> (b\<bullet>i \<le> a\<bullet>i)"
+    let ?x = "(1/2) *\<^sub>R (a + b)"
+    {
+      fix i :: 'a
+      assume i: "i \<in> Basis"
+      have "a\<bullet>i < b\<bullet>i"
+        using as[THEN bspec[where x=i]] i by auto
+      then have "a\<bullet>i < ((1/2) *\<^sub>R (a+b)) \<bullet> i" "((1/2) *\<^sub>R (a+b)) \<bullet> i < b\<bullet>i"
+    }
+    then have "box a b \<noteq> {}"
+      using mem_box(1)[of "?x" a b] by auto
+  }
+  ultimately show ?th1 by blast
+
+  {
+    fix i x
+    assume i: "i \<in> Basis" and as:"b\<bullet>i < a\<bullet>i" and x:"x\<in>cbox a b"
+    then have "a \<bullet> i \<le> x \<bullet> i \<and> x \<bullet> i \<le> b \<bullet> i"
+      unfolding mem_box by auto
+    then have "a\<bullet>i \<le> b\<bullet>i" by auto
+    then have False using as by auto
+  }
+  moreover
+  {
+    assume as:"\<forall>i\<in>Basis. \<not> (b\<bullet>i < a\<bullet>i)"
+    let ?x = "(1/2) *\<^sub>R (a + b)"
+    {
+      fix i :: 'a
+      assume i:"i \<in> Basis"
+      have "a\<bullet>i \<le> b\<bullet>i"
+        using as[THEN bspec[where x=i]] i by auto
+      then have "a\<bullet>i \<le> ((1/2) *\<^sub>R (a+b)) \<bullet> i" "((1/2) *\<^sub>R (a+b)) \<bullet> i \<le> b\<bullet>i"
+    }
+    then have "cbox a b \<noteq> {}"
+      using mem_box(2)[of "?x" a b] by auto
+  }
+  ultimately show ?th2 by blast
+qed
+
+lemma box_ne_empty:
+  fixes a :: "'a::euclidean_space"
+  shows "cbox a b \<noteq> {} \<longleftrightarrow> (\<forall>i\<in>Basis. a\<bullet>i \<le> b\<bullet>i)"
+  and "box a b \<noteq> {} \<longleftrightarrow> (\<forall>i\<in>Basis. a\<bullet>i < b\<bullet>i)"
+  unfolding box_eq_empty[of a b] by fastforce+
+
+lemma
+  fixes a :: "'a::euclidean_space"
+  shows cbox_sing: "cbox a a = {a}"
+    and box_sing: "box a a = {}"
+  unfolding set_eq_iff mem_box eq_iff [symmetric]
+  by (auto intro!: euclidean_eqI[where 'a='a])
+     (metis all_not_in_conv nonempty_Basis)
+
+lemma subset_box_imp:
+  fixes a :: "'a::euclidean_space"
+  shows "(\<forall>i\<in>Basis. a\<bullet>i \<le> c\<bullet>i \<and> d\<bullet>i \<le> b\<bullet>i) \<Longrightarrow> cbox c d \<subseteq> cbox a b"
+    and "(\<forall>i\<in>Basis. a\<bullet>i < c\<bullet>i \<and> d\<bullet>i < b\<bullet>i) \<Longrightarrow> cbox c d \<subseteq> box a b"
+    and "(\<forall>i\<in>Basis. a\<bullet>i \<le> c\<bullet>i \<and> d\<bullet>i \<le> b\<bullet>i) \<Longrightarrow> box c d \<subseteq> cbox a b"
+     and "(\<forall>i\<in>Basis. a\<bullet>i \<le> c\<bullet>i \<and> d\<bullet>i \<le> b\<bullet>i) \<Longrightarrow> box c d \<subseteq> box a b"
+  unfolding subset_eq[unfolded Ball_def] unfolding mem_box
+   by (best intro: order_trans less_le_trans le_less_trans less_imp_le)+
+
+lemma box_subset_cbox:
+  fixes a :: "'a::euclidean_space"
+  shows "box a b \<subseteq> cbox a b"
+  unfolding subset_eq [unfolded Ball_def] mem_box
+  by (fast intro: less_imp_le)
+
+lemma subset_box:
+  fixes a :: "'a::euclidean_space"
+  shows "cbox c d \<subseteq> cbox a b \<longleftrightarrow> (\<forall>i\<in>Basis. c\<bullet>i \<le> d\<bullet>i) --> (\<forall>i\<in>Basis. a\<bullet>i \<le> c\<bullet>i \<and> d\<bullet>i \<le> b\<bullet>i)" (is ?th1)
+    and "cbox c d \<subseteq> box a b \<longleftrightarrow> (\<forall>i\<in>Basis. c\<bullet>i \<le> d\<bullet>i) --> (\<forall>i\<in>Basis. a\<bullet>i < c\<bullet>i \<and> d\<bullet>i < b\<bullet>i)" (is ?th2)
+    and "box c d \<subseteq> cbox a b \<longleftrightarrow> (\<forall>i\<in>Basis. c\<bullet>i < d\<bullet>i) --> (\<forall>i\<in>Basis. a\<bullet>i \<le> c\<bullet>i \<and> d\<bullet>i \<le> b\<bullet>i)" (is ?th3)
+    and "box c d \<subseteq> box a b \<longleftrightarrow> (\<forall>i\<in>Basis. c\<bullet>i < d\<bullet>i) --> (\<forall>i\<in>Basis. a\<bullet>i \<le> c\<bullet>i \<and> d\<bullet>i \<le> b\<bullet>i)" (is ?th4)
+proof -
+  show ?th1
+    unfolding subset_eq and Ball_def and mem_box
+    by (auto intro: order_trans)
+  show ?th2
+    unfolding subset_eq and Ball_def and mem_box
+    by (auto intro: le_less_trans less_le_trans order_trans less_imp_le)
+  {
+    assume as: "box c d \<subseteq> cbox a b" "\<forall>i\<in>Basis. c\<bullet>i < d\<bullet>i"
+    then have "box c d \<noteq> {}"
+      unfolding box_eq_empty by auto
+    fix i :: 'a
+    assume i: "i \<in> Basis"
+    (** TODO combine the following two parts as done in the HOL_light version. **)
+    {
+      let ?x = "(\<Sum>j\<in>Basis. (if j=i then ((min (a\<bullet>j) (d\<bullet>j))+c\<bullet>j)/2 else (c\<bullet>j+d\<bullet>j)/2) *\<^sub>R j)::'a"
+      assume as2: "a\<bullet>i > c\<bullet>i"
+      {
+        fix j :: 'a
+        assume j: "j \<in> Basis"
+        then have "c \<bullet> j < ?x \<bullet> j \<and> ?x \<bullet> j < d \<bullet> j"
+          apply (cases "j = i")
+          using as(2)[THEN bspec[where x=j]] i
+          apply (auto simp add: as2)
+          done
+      }
+      then have "?x\<in>box c d"
+        using i unfolding mem_box by auto
+      moreover
+      have "?x \<notin> cbox a b"
+        unfolding mem_box
+        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\<bullet>i \<le> c\<bullet>i" by (rule ccontr) auto
+    moreover
+    {
+      let ?x = "(\<Sum>j\<in>Basis. (if j=i then ((max (b\<bullet>j) (c\<bullet>j))+d\<bullet>j)/2 else (c\<bullet>j+d\<bullet>j)/2) *\<^sub>R j)::'a"
+      assume as2: "b\<bullet>i < d\<bullet>i"
+      {
+        fix j :: 'a
+        assume "j\<in>Basis"
+        then have "d \<bullet> j > ?x \<bullet> j \<and> ?x \<bullet> j > c \<bullet> j"
+          apply (cases "j = i")
+          using as(2)[THEN bspec[where x=j]]
+          apply (auto simp add: as2)
+          done
+      }
+      then have "?x\<in>box c d"
+        unfolding mem_box by auto
+      moreover
+      have "?x\<notin>cbox a b"
+        unfolding mem_box
+        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\<bullet>i \<ge> d\<bullet>i" by (rule ccontr) auto
+    ultimately
+    have "a\<bullet>i \<le> c\<bullet>i \<and> d\<bullet>i \<le> b\<bullet>i" by auto
+  } note part1 = this
+  show ?th3
+    unfolding subset_eq and Ball_def and mem_box
+    apply (rule, rule, rule, rule)
+    apply (rule part1)
+    unfolding subset_eq and Ball_def and mem_box
+    prefer 4
+    apply auto
+    apply (erule_tac x=xa in allE, erule_tac x=xa in allE, fastforce)+
+    done
+  {
+    assume as: "box c d \<subseteq> box a b" "\<forall>i\<in>Basis. c\<bullet>i < d\<bullet>i"
+    fix i :: 'a
+    assume i:"i\<in>Basis"
+    from as(1) have "box c d \<subseteq> cbox a b"
+      using box_subset_cbox[of a b] by auto
+    then have "a\<bullet>i \<le> c\<bullet>i \<and> d\<bullet>i \<le> b\<bullet>i"
+      using part1 and as(2) using i by auto
+  } note * = this
+  show ?th4
+    unfolding subset_eq and Ball_def and mem_box
+    apply (rule, rule, rule, rule)
+    apply (rule *)
+    unfolding subset_eq and Ball_def and mem_box
+    prefer 4
+    apply auto
+    apply (erule_tac x=xa in allE, simp)+
+    done
+qed
+
+lemma inter_interval:
+  fixes a :: "'a::euclidean_space"
+  shows "cbox a b \<inter> cbox c d =
+    cbox (\<Sum>i\<in>Basis. max (a\<bullet>i) (c\<bullet>i) *\<^sub>R i) (\<Sum>i\<in>Basis. min (b\<bullet>i) (d\<bullet>i) *\<^sub>R i)"
+  unfolding set_eq_iff and Int_iff and mem_box
+  by auto
+
+lemma disjoint_interval:
+  fixes a::"'a::euclidean_space"
+  shows "cbox a b \<inter> cbox c d = {} \<longleftrightarrow> (\<exists>i\<in>Basis. (b\<bullet>i < a\<bullet>i \<or> d\<bullet>i < c\<bullet>i \<or> b\<bullet>i < c\<bullet>i \<or> d\<bullet>i < a\<bullet>i))" (is ?th1)
+    and "cbox a b \<inter> box c d = {} \<longleftrightarrow> (\<exists>i\<in>Basis. (b\<bullet>i < a\<bullet>i \<or> d\<bullet>i \<le> c\<bullet>i \<or> b\<bullet>i \<le> c\<bullet>i \<or> d\<bullet>i \<le> a\<bullet>i))" (is ?th2)
+    and "box a b \<inter> cbox c d = {} \<longleftrightarrow> (\<exists>i\<in>Basis. (b\<bullet>i \<le> a\<bullet>i \<or> d\<bullet>i < c\<bullet>i \<or> b\<bullet>i \<le> c\<bullet>i \<or> d\<bullet>i \<le> a\<bullet>i))" (is ?th3)
+    and "box a b \<inter> box c d = {} \<longleftrightarrow> (\<exists>i\<in>Basis. (b\<bullet>i \<le> a\<bullet>i \<or> d\<bullet>i \<le> c\<bullet>i \<or> b\<bullet>i \<le> c\<bullet>i \<or> d\<bullet>i \<le> a\<bullet>i))" (is ?th4)
+proof -
+  let ?z = "(\<Sum>i\<in>Basis. (((max (a\<bullet>i) (c\<bullet>i)) + (min (b\<bullet>i) (d\<bullet>i))) / 2) *\<^sub>R i)::'a"
+  have **: "\<And>P Q. (\<And>i :: 'a. i \<in> Basis \<Longrightarrow> Q ?z i \<Longrightarrow> P i) \<Longrightarrow>
+      (\<And>i x :: 'a. i \<in> Basis \<Longrightarrow> P i \<Longrightarrow> Q x i) \<Longrightarrow> (\<forall>x. \<exists>i\<in>Basis. Q x i) \<longleftrightarrow> (\<exists>i\<in>Basis. P i)"
+    by blast
+  note * = set_eq_iff Int_iff empty_iff mem_box 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
+
+text {* Intervals in general, including infinite and mixtures of open and closed. *}
+
+definition "is_interval (s::('a::euclidean_space) set) \<longleftrightarrow>
+  (\<forall>a\<in>s. \<forall>b\<in>s. \<forall>x. (\<forall>i\<in>Basis. ((a\<bullet>i \<le> x\<bullet>i \<and> x\<bullet>i \<le> b\<bullet>i) \<or> (b\<bullet>i \<le> x\<bullet>i \<and> x\<bullet>i \<le> a\<bullet>i))) \<longrightarrow> x \<in> s)"
+
+lemma is_interval_cbox: "is_interval (cbox a (b::'a::euclidean_space))" (is ?th1)
+  and is_interval_box: "is_interval (box a b)" (is ?th2)
+  unfolding is_interval_def mem_box Ball_def atLeastAtMost_iff
+  by (meson order_trans le_less_trans less_le_trans less_trans)+
+
+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
+
+lemma mem_is_intervalI:
+  assumes "is_interval s"
+  assumes "a \<in> s" "b \<in> s"
+  assumes "\<And>i. i \<in> Basis \<Longrightarrow> a \<bullet> i \<le> x \<bullet> i \<and> x \<bullet> i \<le> b \<bullet> i \<or> b \<bullet> i \<le> x \<bullet> i \<and> x \<bullet> i \<le> a \<bullet> i"
+  shows "x \<in> s"
+  by (rule assms(1)[simplified is_interval_def, rule_format, OF assms(2,3,4)])
+
+lemma interval_subst:
+  fixes S::"'a::euclidean_space set"
+  assumes "is_interval S"
+  assumes "x \<in> S" "y j \<in> S"
+  assumes "j \<in> Basis"
+  shows "(\<Sum>i\<in>Basis. (if i = j then y i \<bullet> i else x \<bullet> i) *\<^sub>R i) \<in> S"
+  by (rule mem_is_intervalI[OF assms(1,2)]) (auto simp: assms)
+
+lemma mem_box_componentwiseI:
+  fixes S::"'a::euclidean_space set"
+  assumes "is_interval S"
+  assumes "\<And>i. i \<in> Basis \<Longrightarrow> x \<bullet> i \<in> ((\<lambda>x. x \<bullet> i) ` S)"
+  shows "x \<in> S"
+proof -
+  from assms have "\<forall>i \<in> Basis. \<exists>s \<in> S. x \<bullet> i = s \<bullet> i"
+    by auto
+  with finite_Basis obtain s and bs::"'a list" where
+    s: "\<And>i. i \<in> Basis \<Longrightarrow> x \<bullet> i = s i \<bullet> i" "\<And>i. i \<in> Basis \<Longrightarrow> s i \<in> S" and
+    bs: "set bs = Basis" "distinct bs"
+    by (metis finite_distinct_list)
+  from nonempty_Basis s obtain j where j: "j \<in> Basis" "s j \<in> S" by blast
+  def y \<equiv> "rec_list
+    (s j)
+    (\<lambda>j _ Y. (\<Sum>i\<in>Basis. (if i = j then s i \<bullet> i else Y \<bullet> i) *\<^sub>R i))"
+  have "x = (\<Sum>i\<in>Basis. (if i \<in> set bs then s i \<bullet> i else s j \<bullet> i) *\<^sub>R i)"
+    using bs by (auto simp add: s(1)[symmetric] euclidean_representation)
+  also have [symmetric]: "y bs = \<dots>"
+    using bs(2) bs(1)[THEN equalityD1]
+    by (induct bs) (auto simp: y_def euclidean_representation intro!: euclidean_eqI[where 'a='a])
+  also have "y bs \<in> S"
+    using bs(1)[THEN equalityD1]
+    apply (induct bs)
+    apply (auto simp: y_def j)
+    apply (rule interval_subst[OF assms(1)])
+    apply (auto simp: s)
+    done
+  finally show ?thesis .
+qed
+

subsection{* Connectedness *}

@@ -5937,51 +6219,6 @@
done
qed

-subsection {* Intervals *}
-
-lemma open_box: "open (box a b)"
-proof -
-  have "open (\<Inter>i\<in>Basis. (op \<bullet> i) -` {a \<bullet> i <..< b \<bullet> i})"
-    by (auto intro!: continuous_open_vimage continuous_inner continuous_at_id continuous_const)
-  also have "(\<Inter>i\<in>Basis. (op \<bullet> i) -` {a \<bullet> i <..< b \<bullet> i}) = box a b"
-    by (auto simp add: box_def inner_commute)
-  finally show ?thesis .
-qed
-
-instance euclidean_space \<subseteq> second_countable_topology
-proof
-  def a \<equiv> "\<lambda>f :: 'a \<Rightarrow> (real \<times> real). \<Sum>i\<in>Basis. fst (f i) *\<^sub>R i"
-  then have a: "\<And>f. (\<Sum>i\<in>Basis. fst (f i) *\<^sub>R i) = a f"
-    by simp
-  def b \<equiv> "\<lambda>f :: 'a \<Rightarrow> (real \<times> real). \<Sum>i\<in>Basis. snd (f i) *\<^sub>R i"
-  then have b: "\<And>f. (\<Sum>i\<in>Basis. snd (f i) *\<^sub>R i) = b f"
-    by simp
-  def B \<equiv> "(\<lambda>f. box (a f) (b f)) ` (Basis \<rightarrow>\<^sub>E (\<rat> \<times> \<rat>))"
-
-  have "Ball B open" by (simp add: B_def open_box)
-  moreover have "(\<forall>A. open A \<longrightarrow> (\<exists>B'\<subseteq>B. \<Union>B' = A))"
-  proof safe
-    fix A::"'a set"
-    assume "open A"
-    show "\<exists>B'\<subseteq>B. \<Union>B' = A"
-      apply (rule exI[of _ "{b\<in>B. b \<subseteq> A}"])
-      apply (subst (3) open_UNION_box[OF `open A`])
-      apply (auto simp add: a b B_def)
-      done
-  qed
-  ultimately
-  have "topological_basis B"
-    unfolding topological_basis_def by blast
-  moreover
-  have "countable B"
-    unfolding B_def
-    by (intro countable_image countable_PiE finite_Basis countable_SIGMA countable_rat)
-  ultimately show "\<exists>B::'a set set. countable B \<and> open = generate_topology B"
-    by (blast intro: topological_basis_imp_subbasis)
-qed
-
-instance euclidean_space \<subseteq> polish_space ..
-

subsection {* Closure of halfspaces and hyperplanes *}

@@ -6175,6 +6412,441 @@
by (auto simp: inner_commute)

+subsection {* Intervals *}
+
+lemma open_box[intro]: "open (box a b)"
+proof -
+  have "open (\<Inter>i\<in>Basis. (op \<bullet> i) -` {a \<bullet> i <..< b \<bullet> i})"
+    by (auto intro!: continuous_open_vimage continuous_inner continuous_at_id continuous_const)
+  also have "(\<Inter>i\<in>Basis. (op \<bullet> i) -` {a \<bullet> i <..< b \<bullet> i}) = box a b"
+    by (auto simp add: box_def inner_commute)
+  finally show ?thesis .
+qed
+
+instance euclidean_space \<subseteq> second_countable_topology
+proof
+  def a \<equiv> "\<lambda>f :: 'a \<Rightarrow> (real \<times> real). \<Sum>i\<in>Basis. fst (f i) *\<^sub>R i"
+  then have a: "\<And>f. (\<Sum>i\<in>Basis. fst (f i) *\<^sub>R i) = a f"
+    by simp
+  def b \<equiv> "\<lambda>f :: 'a \<Rightarrow> (real \<times> real). \<Sum>i\<in>Basis. snd (f i) *\<^sub>R i"
+  then have b: "\<And>f. (\<Sum>i\<in>Basis. snd (f i) *\<^sub>R i) = b f"
+    by simp
+  def B \<equiv> "(\<lambda>f. box (a f) (b f)) ` (Basis \<rightarrow>\<^sub>E (\<rat> \<times> \<rat>))"
+
+  have "Ball B open" by (simp add: B_def open_box)
+  moreover have "(\<forall>A. open A \<longrightarrow> (\<exists>B'\<subseteq>B. \<Union>B' = A))"
+  proof safe
+    fix A::"'a set"
+    assume "open A"
+    show "\<exists>B'\<subseteq>B. \<Union>B' = A"
+      apply (rule exI[of _ "{b\<in>B. b \<subseteq> A}"])
+      apply (subst (3) open_UNION_box[OF `open A`])
+      apply (auto simp add: a b B_def)
+      done
+  qed
+  ultimately
+  have "topological_basis B"
+    unfolding topological_basis_def by blast
+  moreover
+  have "countable B"
+    unfolding B_def
+    by (intro countable_image countable_PiE finite_Basis countable_SIGMA countable_rat)
+  ultimately show "\<exists>B::'a set set. countable B \<and> open = generate_topology B"
+    by (blast intro: topological_basis_imp_subbasis)
+qed
+
+instance euclidean_space \<subseteq> polish_space ..
+
+lemma closed_cbox[intro]:
+  fixes a b :: "'a::euclidean_space"
+  shows "closed (cbox a b)"
+proof -
+  have "closed (\<Inter>i\<in>Basis. (\<lambda>x. x\<bullet>i) -` {a\<bullet>i .. b\<bullet>i})"
+    by (intro closed_INT ballI continuous_closed_vimage allI
+      linear_continuous_at closed_real_atLeastAtMost finite_Basis bounded_linear_inner_left)
+  also have "(\<Inter>i\<in>Basis. (\<lambda>x. x\<bullet>i) -` {a\<bullet>i .. b\<bullet>i}) = cbox a b"
+    by (auto simp add: cbox_def)
+  finally show "closed (cbox a b)" .
+qed
+
+lemma interior_cbox [intro]:
+  fixes a b :: "'a::euclidean_space"
+  shows "interior (cbox a b) = box a b" (is "?L = ?R")
+proof(rule subset_antisym)
+  show "?R \<subseteq> ?L"
+    using box_subset_cbox open_box
+    by (rule interior_maximal)
+  {
+    fix x
+    assume "x \<in> interior (cbox a b)"
+    then obtain s where s: "open s" "x \<in> s" "s \<subseteq> cbox a b" ..
+    then obtain e where "e>0" and e:"\<forall>x'. dist x' x < e \<longrightarrow> x' \<in> cbox a b"
+      unfolding open_dist and subset_eq by auto
+    {
+      fix i :: 'a
+      assume i: "i \<in> 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 \<bullet> i \<le> (x - (e / 2) *\<^sub>R i) \<bullet> i" and "(x + (e / 2) *\<^sub>R i) \<bullet> i \<le> b \<bullet> 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_box
+        using i
+        by blast+
+      then have "a \<bullet> i < x \<bullet> i" and "x \<bullet> i < b \<bullet> i"
+        using `e>0` i
+        by (auto simp: inner_diff_left inner_Basis inner_add_left)
+    }
+    then have "x \<in> box a b"
+      unfolding mem_box by auto
+  }
+  then show "?L \<subseteq> ?R" ..
+qed
+
+lemma bounded_cbox:
+  fixes a :: "'a::euclidean_space"
+  shows "bounded (cbox a b)"
+proof -
+  let ?b = "\<Sum>i\<in>Basis. \<bar>a\<bullet>i\<bar> + \<bar>b\<bullet>i\<bar>"
+  {
+    fix x :: "'a"
+    assume x: "\<forall>i\<in>Basis. a \<bullet> i \<le> x \<bullet> i \<and> x \<bullet> i \<le> b \<bullet> i"
+    {
+      fix i :: 'a
+      assume "i \<in> Basis"
+      then have "\<bar>x\<bullet>i\<bar> \<le> \<bar>a\<bullet>i\<bar> + \<bar>b\<bullet>i\<bar>"
+        using x[THEN bspec[where x=i]] by auto
+    }
+    then have "(\<Sum>i\<in>Basis. \<bar>x \<bullet> i\<bar>) \<le> ?b"
+      apply -
+      apply (rule setsum_mono)
+      apply auto
+      done
+    then have "norm x \<le> ?b"
+      using norm_le_l1[of x] by auto
+  }
+  then show ?thesis
+    unfolding cbox_def bounded_iff by auto
+qed
+
+lemma bounded_box:
+  fixes a :: "'a::euclidean_space"
+  shows "bounded (box a b)"
+  using bounded_cbox[of a b]
+  using box_subset_cbox[of a b]
+  using bounded_subset[of "cbox a b" "box a b"]
+  by simp
+
+lemma not_interval_univ:
+  fixes a :: "'a::euclidean_space"
+  shows "cbox a b \<noteq> UNIV" "box a b \<noteq> UNIV"
+  using bounded_box[of a b] bounded_cbox[of a b] by auto
+
+lemma compact_cbox:
+  fixes a :: "'a::euclidean_space"
+  shows "compact (cbox a b)"
+  using bounded_closed_imp_seq_compact[of "cbox a b"] using bounded_cbox[of a b]
+  by (auto simp: compact_eq_seq_compact_metric)
+
+lemma box_midpoint:
+  fixes a :: "'a::euclidean_space"
+  assumes "box a b \<noteq> {}"
+  shows "((1/2) *\<^sub>R (a + b)) \<in> box a b"
+proof -
+  {
+    fix i :: 'a
+    assume "i \<in> Basis"
+    then have "a \<bullet> i < ((1 / 2) *\<^sub>R (a + b)) \<bullet> i \<and> ((1 / 2) *\<^sub>R (a + b)) \<bullet> i < b \<bullet> i"
+      using assms[unfolded box_ne_empty, THEN bspec[where x=i]] by (auto simp: inner_add_left)
+  }
+  then show ?thesis unfolding mem_box by auto
+qed
+
+lemma open_cbox_convex:
+  fixes x :: "'a::euclidean_space"
+  assumes x: "x \<in> box a b"
+    and y: "y \<in> cbox a b"
+    and e: "0 < e" "e \<le> 1"
+  shows "(e *\<^sub>R x + (1 - e) *\<^sub>R y) \<in> box a b"
+proof -
+  {
+    fix i :: 'a
+    assume i: "i \<in> Basis"
+    have "a \<bullet> i = e * (a \<bullet> i) + (1 - e) * (a \<bullet> i)"
+      unfolding left_diff_distrib by simp
+    also have "\<dots> < e * (x \<bullet> i) + (1 - e) * (y \<bullet> i)"
+      using e unfolding mult_less_cancel_left and mult_le_cancel_left
+      apply simp_all
+      using x unfolding mem_box using i
+      apply simp
+      using y unfolding mem_box using i
+      apply simp
+      done
+    finally have "a \<bullet> i < (e *\<^sub>R x + (1 - e) *\<^sub>R y) \<bullet> i"
+      unfolding inner_simps by auto
+    moreover
+    {
+      have "b \<bullet> i = e * (b\<bullet>i) + (1 - e) * (b\<bullet>i)"
+        unfolding left_diff_distrib by simp
+      also have "\<dots> > e * (x \<bullet> i) + (1 - e) * (y \<bullet> i)"
+        using e unfolding mult_less_cancel_left and mult_le_cancel_left
+        apply simp_all
+        using x
+        unfolding mem_box
+        using i
+        apply simp
+        using y
+        unfolding mem_box
+        using i
+        apply simp
+        done
+      finally have "(e *\<^sub>R x + (1 - e) *\<^sub>R y) \<bullet> i < b \<bullet> i"
+        unfolding inner_simps by auto
+    }
+    ultimately have "a \<bullet> i < (e *\<^sub>R x + (1 - e) *\<^sub>R y) \<bullet> i \<and> (e *\<^sub>R x + (1 - e) *\<^sub>R y) \<bullet> i < b \<bullet> i"
+      by auto
+  }
+  then show ?thesis
+    unfolding mem_box by auto
+qed
+
+lemma closure_box:
+  fixes a :: "'a::euclidean_space"
+   assumes "box a b \<noteq> {}"
+  shows "closure (box a b) = cbox a b"
+proof -
+  have ab: "a <e b"
+    using assms by (simp add: eucl_less_def box_ne_empty)
+  let ?c = "(1 / 2) *\<^sub>R (a + b)"
+  {
+    fix x
+    assume as:"x \<in> cbox a b"
+    def f \<equiv> "\<lambda>n::nat. x + (inverse (real n + 1)) *\<^sub>R (?c - x)"
+    {
+      fix n
+      assume fn: "f n <e b \<longrightarrow> a <e f n \<longrightarrow> f n = x" and xc: "x \<noteq> ?c"
+      have *: "0 < inverse (real n + 1)" "inverse (real n + 1) \<le> 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 <e b" and "a <e f n"
+        using open_cbox_convex[OF box_midpoint[OF assms] as *]
+        unfolding f_def by (auto simp: box_def eucl_less_def)
+      then have False
+        using fn unfolding f_def using xc by auto
+    }
+    moreover
+    {
+      assume "\<not> (f ---> x) sequentially"
+      {
+        fix e :: real
+        assume "e > 0"
+        then have "\<exists>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 "\<forall>n\<ge>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 "\<exists>N::nat. \<forall>n\<ge>N. inverse (real n + 1) < e" by auto
+      }
+      then have "((\<lambda>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 "\<lambda>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 "\<lambda>n::nat. inverse (real n + 1)" 0 sequentially "((1 / 2) *\<^sub>R (a + b) - x)"]
+        by auto
+    }
+    ultimately have "x \<in> closure (box a b)"
+      using as and box_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 box_subset_cbox, of a b] by blast
+qed
+
+lemma bounded_subset_box_symmetric:
+  fixes s::"('a::euclidean_space) set"
+  assumes "bounded s"
+  shows "\<exists>a. s \<subseteq> box (-a) a"
+proof -
+  obtain b where "b>0" and b: "\<forall>x\<in>s. norm x \<le> b"
+    using assms[unfolded bounded_pos] by auto
+  def a \<equiv> "(\<Sum>i\<in>Basis. (b + 1) *\<^sub>R i)::'a"
+  {
+    fix x
+    assume "x \<in> s"
+    fix i :: 'a
+    assume i: "i \<in> Basis"
+    then have "(-a)\<bullet>i < x\<bullet>i" and "x\<bullet>i < a\<bullet>i"
+      using b[THEN bspec[where x=x], OF `x\<in>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: box_def)
+qed
+
+lemma bounded_subset_open_interval:
+  fixes s :: "('a::euclidean_space) set"
+  shows "bounded s \<Longrightarrow> (\<exists>a b. s \<subseteq> box a b)"
+  by (auto dest!: bounded_subset_box_symmetric)
+
+lemma bounded_subset_cbox_symmetric:
+  fixes s :: "('a::euclidean_space) set"
+   assumes "bounded s"
+  shows "\<exists>a. s \<subseteq> cbox (-a) a"
+proof -
+  obtain a where "s \<subseteq> box (-a) a"
+    using bounded_subset_box_symmetric[OF assms] by auto
+  then show ?thesis
+    using box_subset_cbox[of "-a" a] by auto
+qed
+
+lemma bounded_subset_cbox:
+  fixes s :: "('a::euclidean_space) set"
+  shows "bounded s \<Longrightarrow> \<exists>a b. s \<subseteq> cbox a b"
+  using bounded_subset_cbox_symmetric[of s] by auto
+
+lemma frontier_cbox:
+  fixes a b :: "'a::euclidean_space"
+  shows "frontier (cbox a b) = cbox a b - box a b"
+  unfolding frontier_def unfolding interior_cbox and closure_closed[OF closed_cbox] ..
+
+lemma frontier_box:
+  fixes a b :: "'a::euclidean_space"
+  shows "frontier (box a b) = (if box a b = {} then {} else cbox 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_box[OF False] and interior_open[OF open_box]
+    by auto
+qed
+
+lemma inter_interval_mixed_eq_empty:
+  fixes a :: "'a::euclidean_space"
+   assumes "box c d \<noteq> {}"
+  shows "box a b \<inter> cbox c d = {} \<longleftrightarrow> box a b \<inter> box c d = {}"
+  unfolding closure_box[OF assms, symmetric]
+  unfolding open_inter_closure_eq_empty[OF open_box] ..
+
+lemma diameter_cbox:
+  fixes a b::"'a::euclidean_space"
+  shows "(\<forall>i \<in> Basis. a \<bullet> i \<le> b \<bullet> i) \<Longrightarrow> diameter (cbox a b) = dist a b"
+  by (force simp add: diameter_def SUP_def simp del: Sup_image_eq intro!: cSup_eq_maximum setL2_mono
+     simp: euclidean_dist_l2[where 'a='a] cbox_def dist_norm)
+
+lemma eucl_less_eq_halfspaces:
+  fixes a :: "'a\<Colon>euclidean_space"
+  shows "{x. x <e a} = (\<Inter>i\<in>Basis. {x. x \<bullet> i < a \<bullet> i})"
+    "{x. a <e x} = (\<Inter>i\<in>Basis. {x. a \<bullet> i < x \<bullet> i})"
+  by (auto simp: eucl_less_def)
+
+lemma eucl_le_eq_halfspaces:
+  fixes a :: "'a\<Colon>euclidean_space"
+  shows "{x. \<forall>i\<in>Basis. x \<bullet> i \<le> a \<bullet> i} = (\<Inter>i\<in>Basis. {x. x \<bullet> i \<le> a \<bullet> i})"
+    "{x. \<forall>i\<in>Basis. a \<bullet> i \<le> x \<bullet> i} = (\<Inter>i\<in>Basis. {x. a \<bullet> i \<le> x \<bullet> i})"
+  by auto
+
+lemma open_Collect_eucl_less[simp, intro]:
+  fixes a :: "'a\<Colon>euclidean_space"
+  shows "open {x. x <e a}"
+    "open {x. a <e x}"
+  by (auto simp: eucl_less_eq_halfspaces open_halfspace_component_lt open_halfspace_component_gt)
+
+lemma closed_Collect_eucl_le[simp, intro]:
+  fixes a :: "'a\<Colon>euclidean_space"
+  shows "closed {x. \<forall>i\<in>Basis. a \<bullet> i \<le> x \<bullet> i}"
+    "closed {x. \<forall>i\<in>Basis. x \<bullet> i \<le> a \<bullet> i}"
+  unfolding eucl_le_eq_halfspaces
+  by (simp_all add: closed_INT closed_Collect_le)
+
+lemma image_affinity_cbox: fixes m::real
+  fixes a b c :: "'a::euclidean_space"
+  shows "(\<lambda>x. m *\<^sub>R x + c) ` cbox a b =
+    (if cbox a b = {} then {}
+     else (if 0 \<le> m then cbox (m *\<^sub>R a + c) (m *\<^sub>R b + c)
+     else cbox (m *\<^sub>R b + c) (m *\<^sub>R a + c)))"
+proof (cases "m = 0")
+  case True
+  {
+    fix x
+    assume "\<forall>i\<in>Basis. x \<bullet> i \<le> c \<bullet> i" "\<forall>i\<in>Basis. c \<bullet> i \<le> x \<bullet> i"
+    then have "x = c"
+      apply -
+      apply (subst euclidean_eq_iff)
+      apply (auto intro: order_antisym)
+      done
+  }
+  moreover have "c \<in> cbox (m *\<^sub>R a + c) (m *\<^sub>R b + c)"
+    unfolding True by (auto simp add: cbox_sing)
+  ultimately show ?thesis using True by (auto simp: cbox_def)
+next
+  case False
+  {
+    fix y
+    assume "\<forall>i\<in>Basis. a \<bullet> i \<le> y \<bullet> i" "\<forall>i\<in>Basis. y \<bullet> i \<le> b \<bullet> i" "m > 0"
+    then have "\<forall>i\<in>Basis. (m *\<^sub>R a + c) \<bullet> i \<le> (m *\<^sub>R y + c) \<bullet> i" and "\<forall>i\<in>Basis. (m *\<^sub>R y + c) \<bullet> i \<le> (m *\<^sub>R b + c) \<bullet> i"
+      by (auto simp: inner_distrib)
+  }
+  moreover
+  {
+    fix y
+    assume "\<forall>i\<in>Basis. a \<bullet> i \<le> y \<bullet> i" "\<forall>i\<in>Basis. y \<bullet> i \<le> b \<bullet> i" "m < 0"
+    then have "\<forall>i\<in>Basis. (m *\<^sub>R b + c) \<bullet> i \<le> (m *\<^sub>R y + c) \<bullet> i" and "\<forall>i\<in>Basis. (m *\<^sub>R y + c) \<bullet> i \<le> (m *\<^sub>R a + c) \<bullet> i"
+      by (auto simp add: mult_left_mono_neg inner_distrib)
+  }
+  moreover
+  {
+    fix y
+    assume "m > 0" and "\<forall>i\<in>Basis. (m *\<^sub>R a + c) \<bullet> i \<le> y \<bullet> i" and "\<forall>i\<in>Basis. y \<bullet> i \<le> (m *\<^sub>R b + c) \<bullet> i"
+    then have "y \<in> (\<lambda>x. m *\<^sub>R x + c) ` cbox a b"
+      unfolding image_iff Bex_def mem_box
+      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 "\<forall>i\<in>Basis. (m *\<^sub>R b + c) \<bullet> i \<le> y \<bullet> i" "\<forall>i\<in>Basis. y \<bullet> i \<le> (m *\<^sub>R a + c) \<bullet> i" "m < 0"
+    then have "y \<in> (\<lambda>x. m *\<^sub>R x + c) ` cbox a b"
+      unfolding image_iff Bex_def mem_box
+      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 simp: cbox_def)
+qed
+
+lemma image_smult_cbox:"(\<lambda>x. m *\<^sub>R (x::_::euclidean_space)) ` cbox a b =
+  (if cbox a b = {} then {} else if 0 \<le> m then cbox (m *\<^sub>R a) (m *\<^sub>R b) else cbox (m *\<^sub>R b) (m *\<^sub>R a))"
+  using image_affinity_cbox[of m 0 a b] by auto
+
+
subsection {* Homeomorphisms *}

definition "homeomorphism s t f g \<longleftrightarrow>```