Gauge measure removed
authorhoelzl
Tue, 18 Jan 2011 21:37:23 +0100
changeset 4252332fe42892983
parent 41795 4638b1210d26
child 42524 95f851027a59
child 42528 a5d1b2df5e97
Gauge measure removed
src/HOL/IsaMakefile
src/HOL/Multivariate_Analysis/Gauge_Measure.thy
src/HOL/Multivariate_Analysis/Multivariate_Analysis.thy
src/HOL/Probability/Lebesgue_Measure.thy
     1.1 --- a/src/HOL/IsaMakefile	Fri Jan 14 16:00:13 2011 +0100
     1.2 +++ b/src/HOL/IsaMakefile	Tue Jan 18 21:37:23 2011 +0100
     1.3 @@ -1,4 +1,3 @@
     1.4 -
     1.5  #
     1.6  # IsaMakefile for HOL
     1.7  #
     1.8 @@ -1150,7 +1149,6 @@
     1.9    Multivariate_Analysis/Finite_Cartesian_Product.thy			\
    1.10    Multivariate_Analysis/Integration.certs				\
    1.11    Multivariate_Analysis/Integration.thy					\
    1.12 -  Multivariate_Analysis/Gauge_Measure.thy				\
    1.13    Multivariate_Analysis/L2_Norm.thy					\
    1.14    Multivariate_Analysis/Multivariate_Analysis.thy			\
    1.15    Multivariate_Analysis/Operator_Norm.thy				\
     2.1 --- a/src/HOL/Multivariate_Analysis/Gauge_Measure.thy	Fri Jan 14 16:00:13 2011 +0100
     2.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.3 @@ -1,3447 +0,0 @@
     2.4 -
     2.5 -header {* Lebsegue measure (defined via the gauge integral). *}
     2.6 -(*  Author:                     John Harrison
     2.7 -    Translation from HOL light: Robert Himmelmann, TU Muenchen *)
     2.8 -
     2.9 -theory Gauge_Measure
    2.10 -  imports Integration 
    2.11 -begin
    2.12 -
    2.13 -(* ------------------------------------------------------------------------- *)
    2.14 -(* Lebesgue measure (in the case where the measure is finite).               *)
    2.15 -(* For the non-finite version, please see Probability/Lebesgue_Measure.thy   *)
    2.16 -(* ------------------------------------------------------------------------- *)
    2.17 -
    2.18 -definition has_gmeasure (infixr "has'_gmeasure" 80) where
    2.19 -  "s has_gmeasure m \<equiv> ((\<lambda>x. 1::real) has_integral m) s"
    2.20 -
    2.21 -definition gmeasurable :: "('n::ordered_euclidean_space) set \<Rightarrow> bool" where 
    2.22 -  "gmeasurable s \<equiv> (\<exists>m. s has_gmeasure m)"
    2.23 -
    2.24 -lemma gmeasurableI[dest]:"s has_gmeasure m \<Longrightarrow> gmeasurable s"
    2.25 -  unfolding gmeasurable_def by auto
    2.26 -
    2.27 -definition gmeasure where
    2.28 -  "gmeasure s \<equiv> (if gmeasurable s then (SOME m. s has_gmeasure m) else 0)"
    2.29 -
    2.30 -lemma has_gmeasure_measure: "gmeasurable s \<longleftrightarrow> s has_gmeasure (gmeasure s)"
    2.31 -  unfolding gmeasure_def gmeasurable_def
    2.32 -  apply meson apply(subst if_P) defer apply(rule someI) by auto
    2.33 -
    2.34 -lemma has_gmeasure_measureI[intro]:"gmeasurable s \<Longrightarrow> s has_gmeasure (gmeasure s)"
    2.35 -  using has_gmeasure_measure by auto
    2.36 -  
    2.37 -lemma has_gmeasure_unique: "s has_gmeasure m1 \<Longrightarrow> s has_gmeasure m2 \<Longrightarrow> m1 = m2"
    2.38 -  unfolding has_gmeasure_def apply(rule has_integral_unique) by auto
    2.39 -
    2.40 -lemma measure_unique[intro]: assumes "s has_gmeasure m" shows "gmeasure s = m"
    2.41 -  apply(rule has_gmeasure_unique[OF _ assms]) using assms 
    2.42 -  unfolding has_gmeasure_measure[THEN sym] by auto
    2.43 -
    2.44 -lemma has_gmeasure_measurable_measure:
    2.45 - "s has_gmeasure m \<longleftrightarrow> gmeasurable s \<and> gmeasure s = m"
    2.46 -  by(auto intro!:measure_unique simp:has_gmeasure_measure[THEN sym])
    2.47 -
    2.48 -lemmas has_gmeasure_imp_measurable = gmeasurableI
    2.49 -
    2.50 -lemma has_gmeasure:
    2.51 - "s has_gmeasure m \<longleftrightarrow> ((\<lambda>x. if x \<in> s then 1 else 0) has_integral m) UNIV"
    2.52 -  unfolding has_integral_restrict_univ has_gmeasure_def ..
    2.53 -
    2.54 -lemma gmeasurable: "gmeasurable s \<longleftrightarrow> (\<lambda>x. 1::real) integrable_on s"
    2.55 -  unfolding gmeasurable_def integrable_on_def has_gmeasure_def by auto
    2.56 -
    2.57 -lemma gmeasurable_integrable:
    2.58 - "gmeasurable s \<longleftrightarrow> (\<lambda>x. if x \<in> s then 1 else (0::real)) integrable_on UNIV"
    2.59 -  unfolding gmeasurable_def integrable_on_def has_gmeasure ..
    2.60 -
    2.61 -lemma measure_integral:
    2.62 -  assumes "gmeasurable s" shows "gmeasure s = (integral s (\<lambda>x. 1))"
    2.63 -  apply(rule integral_unique[THEN sym])
    2.64 -  unfolding has_gmeasure_def[symmetric] using assms by auto 
    2.65 -
    2.66 -lemma measure_integral_univ: assumes "gmeasurable s"
    2.67 -  shows "gmeasure s = (integral UNIV (\<lambda>x. if x \<in> s then 1 else 0))"
    2.68 -  apply(rule integral_unique[THEN sym])
    2.69 -  using assms by(auto simp:has_gmeasure[THEN sym])
    2.70 -
    2.71 -lemmas integral_measure = measure_integral[THEN sym]
    2.72 -
    2.73 -lemmas integral_measure_univ = measure_integral_univ[THEN sym]
    2.74 -
    2.75 -lemma has_gmeasure_interval[intro]:
    2.76 -  "{a..b} has_gmeasure content{a..b}" (is ?t1)
    2.77 -  "{a<..<b} has_gmeasure content{a..b}" (is ?t2)
    2.78 -proof- show ?t1 unfolding has_gmeasure_def using has_integral_const[where c="1::real"] by auto
    2.79 -  show ?t2 unfolding has_gmeasure apply(rule has_integral_spike[of "{a..b} - {a<..<b}",
    2.80 -    where f="\<lambda>x. (if x \<in> {a..b} then 1 else 0)"]) apply(rule negligible_frontier_interval) 
    2.81 -    using interval_open_subset_closed[of a b]
    2.82 -    using `?t1` unfolding has_gmeasure by auto
    2.83 -qed
    2.84 -
    2.85 -lemma gmeasurable_interval[intro]: "gmeasurable {a..b}" "gmeasurable {a<..<b}"
    2.86 -  by(auto intro:gmeasurableI)
    2.87 -
    2.88 -lemma measure_interval[simp]: "gmeasure{a..b} = content{a..b}"  "gmeasure({a<..<b}) = content{a..b}"
    2.89 -  by(auto intro:measure_unique)
    2.90 -
    2.91 -lemma nonnegative_absolutely_integrable: fixes f::"'n::ordered_euclidean_space \<Rightarrow> 'm::ordered_euclidean_space"
    2.92 -  assumes "\<forall>x\<in>s. \<forall>i<DIM('m). 0 \<le> f(x)$$i" "f integrable_on s"
    2.93 -  shows "f absolutely_integrable_on s"
    2.94 -  unfolding absolutely_integrable_abs_eq apply rule defer
    2.95 -  apply(rule integrable_eq[of _ f]) using assms apply-apply(subst euclidean_eq) by auto
    2.96 -
    2.97 -lemma gmeasurable_inter[dest]: assumes "gmeasurable s" "gmeasurable t" shows "gmeasurable (s \<inter> t)"
    2.98 -proof- have *:"(\<lambda>x. if x \<in> s \<inter> t then 1 else (0::real)) =
    2.99 -    (\<lambda>x. \<chi>\<chi> i. min (((if x \<in> s then 1 else 0)::real)$$i) (((if x \<in> t then 1 else 0)::real)$$i))"
   2.100 -    apply(rule ext) by auto
   2.101 -  show ?thesis unfolding gmeasurable_integrable apply(rule absolutely_integrable_onD)
   2.102 -    unfolding * apply(rule absolutely_integrable_min)
   2.103 -    apply(rule_tac[!] nonnegative_absolutely_integrable)
   2.104 -    using assms unfolding gmeasurable_integrable by auto
   2.105 -qed
   2.106 -
   2.107 -lemma gmeasurable_union: assumes "gmeasurable s" "gmeasurable t"
   2.108 -  shows "gmeasurable (s \<union> t)"
   2.109 -proof- have *:"(\<lambda>x. if x \<in> s \<union> t then 1 else (0::real)) =
   2.110 -    (\<lambda>x. \<chi>\<chi> i. max (((if x \<in> s then 1 else 0)::real)$$i) (((if x \<in> t then 1 else 0)::real)$$i)) "
   2.111 -    by(rule ext,auto)
   2.112 -  show ?thesis unfolding gmeasurable_integrable apply(rule absolutely_integrable_onD)
   2.113 -    unfolding * apply(rule absolutely_integrable_max)
   2.114 -    apply(rule_tac[!]nonnegative_absolutely_integrable)
   2.115 -    using assms unfolding gmeasurable_integrable by auto
   2.116 -qed
   2.117 -
   2.118 -lemma has_gmeasure_disjoint_union: 
   2.119 -  assumes "s1 has_gmeasure m1" "s2 has_gmeasure m2" "s1 \<inter> s2 = {}"
   2.120 -  shows "(s1 \<union> s2) has_gmeasure (m1 + m2)"
   2.121 -proof- have *:"\<And>x. (if x \<in> s1 then 1 else 0) + (if x \<in> s2 then 1 else 0) =
   2.122 -    (if x \<in> s1 \<union> s2 then 1 else (0::real))" using assms(3) by auto
   2.123 -  show ?thesis using has_integral_add[OF assms(1-2)[unfolded has_gmeasure]]
   2.124 -    unfolding has_gmeasure * .
   2.125 -qed
   2.126 -
   2.127 -lemma measure_disjoint_union: assumes "gmeasurable s" "gmeasurable t" "s \<inter> t = {}"
   2.128 -  shows "gmeasure(s \<union> t) = gmeasure s + gmeasure t"
   2.129 -  apply rule apply(rule has_gmeasure_disjoint_union) using assms by auto
   2.130 -
   2.131 -lemma has_gmeasure_pos_le[dest]: assumes "s has_gmeasure m" shows "0 \<le> m"
   2.132 -  apply(rule has_integral_nonneg) using assms unfolding has_gmeasure by auto
   2.133 -
   2.134 -lemma not_measurable_measure:"\<not> gmeasurable s \<Longrightarrow> gmeasure s = 0"
   2.135 -  unfolding gmeasure_def if_not_P ..
   2.136 -
   2.137 -lemma measure_pos_le[intro]: "0 <= gmeasure s"
   2.138 -  apply(cases "gmeasurable s") unfolding not_measurable_measure
   2.139 -  unfolding has_gmeasure_measure by auto
   2.140 -
   2.141 -lemma has_gmeasure_subset[dest]:
   2.142 -  assumes "s1 has_gmeasure m1" "s2 has_gmeasure m2" "s1 \<subseteq> s2"
   2.143 -  shows "m1 <= m2"
   2.144 -  using has_integral_subset_le[OF assms(3,1,2)[unfolded has_gmeasure_def]] by auto
   2.145 -
   2.146 -lemma measure_subset[dest]: assumes "gmeasurable s" "gmeasurable t" "s \<subseteq> t"
   2.147 -  shows "gmeasure s \<le> gmeasure t"
   2.148 -  using assms unfolding has_gmeasure_measure by auto
   2.149 -
   2.150 -lemma has_gmeasure_0:"s has_gmeasure 0 \<longleftrightarrow> negligible s" (is "?l = ?r")
   2.151 -proof assume ?r thus ?l unfolding indicator_def_raw negligible apply(erule_tac x="UNIV" in allE)
   2.152 -    unfolding has_integral_restrict_univ has_gmeasure_def .
   2.153 -next assume ?l note this[unfolded has_gmeasure_def has_integral_alt']
   2.154 -  note * = conjunctD2[OF this,rule_format]
   2.155 -  show ?r unfolding negligible_def 
   2.156 -  proof safe case goal1
   2.157 -    from *(1)[of a b,unfolded integrable_on_def] guess y apply-
   2.158 -      apply(subst (asm) has_integral_restrict_univ[THEN sym]) by (erule exE) note y=this
   2.159 -    have "0 \<le> y" apply(rule has_integral_nonneg[OF y]) by auto
   2.160 -    moreover have "y \<le> 0" apply(rule has_integral_le[OF y]) 
   2.161 -      apply(rule `?l`[unfolded has_gmeasure_def has_integral_restrict_univ[THEN sym,of"\<lambda>x. 1"]]) by auto
   2.162 -    ultimately have "y = 0" by auto
   2.163 -    thus ?case using y unfolding has_integral_restrict_univ indicator_def_raw by auto
   2.164 -  qed
   2.165 -qed
   2.166 -
   2.167 -lemma measure_eq_0: "negligible s ==> gmeasure s = 0"
   2.168 -  apply(rule measure_unique) unfolding has_gmeasure_0 by auto
   2.169 -
   2.170 -lemma has_gmeasure_empty[intro]: "{} has_gmeasure 0"
   2.171 -  unfolding has_gmeasure_0 by auto
   2.172 -
   2.173 -lemma measure_empty[simp]: "gmeasure {} = 0"
   2.174 -  apply(rule measure_eq_0) by auto
   2.175 -
   2.176 -lemma gmeasurable_empty[intro]: "gmeasurable {}" by(auto intro:gmeasurableI)
   2.177 -
   2.178 -lemma gmeasurable_measure_eq_0:
   2.179 -  "gmeasurable s ==> (gmeasure s = 0 \<longleftrightarrow> negligible s)"
   2.180 -  unfolding has_gmeasure_measure has_gmeasure_0[THEN sym] by(auto intro:measure_unique)
   2.181 -
   2.182 -lemma gmeasurable_measure_pos_lt:
   2.183 - "gmeasurable s ==> (0 < gmeasure s \<longleftrightarrow> ~negligible s)"
   2.184 -  unfolding gmeasurable_measure_eq_0[THEN sym]
   2.185 -  using measure_pos_le[of s] unfolding le_less by fastsimp
   2.186 -
   2.187 -lemma negligible_interval:True .. (*
   2.188 - "(!a b. negligible{a..b} \<longleftrightarrow> {a<..<b} = {}) \<and>
   2.189 -   (!a b. negligible({a<..<b}) \<longleftrightarrow> {a<..<b} = {})"
   2.190 -qed   REWRITE_TAC[GSYM HAS_GMEASURE_0] THEN
   2.191 -  MESON_TAC[HAS_GMEASURE_INTERVAL; CONTENT_EQ_0_INTERIOR;
   2.192 -            INTERIOR_CLOSED_INTERVAL; HAS_GMEASURE_UNIQUE]);;*)
   2.193 -
   2.194 -lemma gmeasurable_finite_unions:
   2.195 -  assumes "finite f" "\<And>s. s \<in> f \<Longrightarrow> gmeasurable s"
   2.196 -  shows "gmeasurable (\<Union> f)" using assms(1,2) 
   2.197 -proof induct case (insert s F)
   2.198 -  show ?case unfolding Union_insert apply(rule gmeasurable_union)
   2.199 -    using insert by auto
   2.200 -qed auto  
   2.201 -
   2.202 -lemma has_gmeasure_diff_subset: assumes "s1 has_gmeasure m1" "s2 has_gmeasure m2" "s2 \<subseteq> s1"
   2.203 -  shows "(s1 - s2) has_gmeasure (m1 - m2)"
   2.204 -proof- have *:"(\<lambda>x. (if x \<in> s1 then 1 else 0) - (if x \<in> s2 then 1 else (0::real))) =
   2.205 -    (\<lambda>x. if x \<in> s1 - s2 then 1 else 0)" apply(rule ext) using assms(3) by auto
   2.206 -  show ?thesis using has_integral_sub[OF assms(1-2)[unfolded has_gmeasure]] 
   2.207 -    unfolding has_gmeasure * . 
   2.208 -qed
   2.209 -
   2.210 -lemma gmeasurable_diff: assumes "gmeasurable s" "gmeasurable t" 
   2.211 -  shows "gmeasurable (s - t)"
   2.212 -proof- have *:"\<And>s t. gmeasurable s \<Longrightarrow> gmeasurable t \<Longrightarrow> t \<subseteq> s ==> gmeasurable (s - t)"
   2.213 -    unfolding gmeasurable_def apply(erule exE)+ apply(rule,rule has_gmeasure_diff_subset)
   2.214 -    by assumption+
   2.215 -  have **:"s - t = s - (s \<inter> t)" by auto
   2.216 -  show ?thesis unfolding ** apply(rule *) using assms by auto
   2.217 -qed
   2.218 -
   2.219 -lemma measure_diff_subset: True .. (*
   2.220 - "!s t. gmeasurable s \<and> gmeasurable t \<and> t \<subseteq> s
   2.221 -         ==> measure(s DIFF t) = gmeasure s - gmeasure t"
   2.222 -qed   REPEAT STRIP_TAC THEN MATCH_MP_TAC MEASURE_UNIQUE THEN
   2.223 -  ASM_SIMP_TAC[HAS_GMEASURE_DIFF_SUBSET; GSYM HAS_GMEASURE_MEASURE]);; *)
   2.224 -
   2.225 -lemma has_gmeasure_union_negligible[dest]:
   2.226 -  assumes "s has_gmeasure m" "negligible t"
   2.227 -  shows "(s \<union> t) has_gmeasure m" unfolding has_gmeasure
   2.228 -  apply(rule has_integral_spike[OF assms(2) _ assms(1)[unfolded has_gmeasure]]) by auto
   2.229 -
   2.230 -lemma has_gmeasure_diff_negligible[dest]:
   2.231 -  assumes "s has_gmeasure m" "negligible t" 
   2.232 -  shows "(s - t) has_gmeasure m" unfolding has_gmeasure
   2.233 -  apply(rule has_integral_spike[OF assms(2) _ assms(1)[unfolded has_gmeasure]]) by auto
   2.234 -
   2.235 -lemma has_gmeasure_union_negligible_eq: True .. (*
   2.236 - "!s t:real^N->bool m.
   2.237 -     negligible t ==> ((s \<union> t) has_gmeasure m \<longleftrightarrow> s has_gmeasure m)"
   2.238 -qed   REPEAT STRIP_TAC THEN EQ_TAC THEN DISCH_TAC THEN
   2.239 -  ASM_SIMP_TAC[HAS_GMEASURE_UNION_NEGLIGIBLE] THEN
   2.240 -  SUBST1_TAC(SET_RULE `s:real^N->bool = (s \<union> t) DIFF (t DIFF s)`) THEN
   2.241 -  MATCH_MP_TAC HAS_GMEASURE_DIFF_NEGLIGIBLE THEN ASM_REWRITE_TAC[] THEN
   2.242 -  MATCH_MP_TAC NEGLIGIBLE_DIFF THEN ASM_REWRITE_TAC[]);; *)
   2.243 -
   2.244 -lemma has_gmeasure_diff_negligible_eq: True .. (*
   2.245 - "!s t:real^N->bool m.
   2.246 -     negligible t ==> ((s DIFF t) has_gmeasure m \<longleftrightarrow> s has_gmeasure m)"
   2.247 -qed   REPEAT STRIP_TAC THEN EQ_TAC THEN DISCH_TAC THEN
   2.248 -  ASM_SIMP_TAC[HAS_GMEASURE_DIFF_NEGLIGIBLE] THEN
   2.249 -  SUBST1_TAC(SET_RULE `s:real^N->bool = (s DIFF t) \<union> (t \<inter> s)`) THEN
   2.250 -  MATCH_MP_TAC HAS_GMEASURE_UNION_NEGLIGIBLE THEN
   2.251 -  ASM_SIMP_TAC[NEGLIGIBLE_INTER]);; *)
   2.252 -
   2.253 -lemma has_gmeasure_almost: assumes "s has_gmeasure m" "negligible t" "s \<union> t = s' \<union> t"
   2.254 -  shows "s' has_gmeasure m"
   2.255 -proof- have *:"s' \<union> t - (t - s') = s'" by blast
   2.256 -  show ?thesis using has_gmeasure_union_negligible[OF assms(1-2)] unfolding assms(3)
   2.257 -    apply-apply(drule has_gmeasure_diff_negligible[where t="t - s'"])
   2.258 -    apply(rule negligible_diff) using assms(2) unfolding * by auto
   2.259 -qed
   2.260 -
   2.261 -lemma has_gmeasure_almost_eq: True .. (*
   2.262 - "!s s' t. negligible t \<and> s \<union> t = s' \<union> t
   2.263 -            ==> (s has_gmeasure m \<longleftrightarrow> s' has_gmeasure m)"
   2.264 -qed   MESON_TAC[HAS_GMEASURE_ALMOST]);; *)
   2.265 -
   2.266 -lemma gmeasurable_almost: True .. (*
   2.267 - "!s s' t. gmeasurable s \<and> negligible t \<and> s \<union> t = s' \<union> t
   2.268 -            ==> gmeasurable s'"
   2.269 -qed   REWRITE_TAC[measurable] THEN MESON_TAC[HAS_GMEASURE_ALMOST]);; *)
   2.270 -
   2.271 -lemma has_gmeasure_negligible_union:
   2.272 -  assumes "s1 has_gmeasure m1" "s2 has_gmeasure m2" "negligible(s1 \<inter> s2)"
   2.273 -  shows "(s1 \<union> s2) has_gmeasure (m1 + m2)" 
   2.274 -  apply(rule has_gmeasure_almost[of "(s1 - (s1 \<inter> s2)) \<union> (s2 - (s1 \<inter> s2))" _ "s1 \<inter> s2"])
   2.275 -  apply(rule has_gmeasure_disjoint_union)
   2.276 -  apply(rule has_gmeasure_almost[of s1,OF _ assms(3)]) prefer 3
   2.277 -  apply(rule has_gmeasure_almost[of s2,OF _ assms(3)])
   2.278 -  using assms by auto
   2.279 -
   2.280 -lemma measure_negligible_union: True .. (*
   2.281 -  "!s t. gmeasurable s \<and> gmeasurable t \<and> negligible(s \<inter> t)
   2.282 -         ==> measure(s \<union> t) = gmeasure s + gmeasure t"
   2.283 -qed   REPEAT STRIP_TAC THEN MATCH_MP_TAC MEASURE_UNIQUE THEN
   2.284 -  ASM_SIMP_TAC[HAS_GMEASURE_NEGLIGIBLE_UNION; GSYM HAS_GMEASURE_MEASURE]);; *)
   2.285 -
   2.286 -lemma has_gmeasure_negligible_symdiff: True .. (*
   2.287 - "!s t:real^N->bool m.
   2.288 -        s has_gmeasure m \<and>
   2.289 -        negligible((s DIFF t) \<union> (t DIFF s))
   2.290 -        ==> t has_gmeasure m"
   2.291 -qed   REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_GMEASURE_ALMOST THEN
   2.292 -  MAP_EVERY EXISTS_TAC
   2.293 -   [`s:real^N->bool`; `(s DIFF t) \<union> (t DIFF s):real^N->bool`] THEN
   2.294 -  ASM_REWRITE_TAC[] THEN SET_TAC[]);; *)
   2.295 -
   2.296 -lemma gmeasurable_negligible_symdiff: True .. (*
   2.297 - "!s t:real^N->bool.
   2.298 -        gmeasurable s \<and> negligible((s DIFF t) \<union> (t DIFF s))
   2.299 -        ==> gmeasurable t"
   2.300 -qed   REWRITE_TAC[measurable] THEN
   2.301 -  MESON_TAC[HAS_GMEASURE_NEGLIGIBLE_SYMDIFF]);; *)
   2.302 -
   2.303 -lemma measure_negligible_symdiff: True .. (*
   2.304 - "!s t:real^N->bool.
   2.305 -        (measurable s \/ gmeasurable t) \<and>
   2.306 -        negligible((s DIFF t) \<union> (t DIFF s))
   2.307 -        ==> gmeasure s = gmeasure t"
   2.308 -qed   MESON_TAC[HAS_GMEASURE_NEGLIGIBLE_SYMDIFF; MEASURE_UNIQUE; UNION_COMM;
   2.309 -                HAS_GMEASURE_MEASURE]);; *)
   2.310 -
   2.311 -lemma has_gmeasure_negligible_unions: assumes "finite f"
   2.312 -  "\<And>s. s \<in> f ==> s has_gmeasure (m s)"
   2.313 -  "\<And>s t. s \<in> f \<Longrightarrow> t \<in> f \<Longrightarrow> ~(s = t) ==> negligible(s \<inter> t)"
   2.314 -  shows "(\<Union> f) has_gmeasure (setsum m f)" using assms
   2.315 -proof induct case (insert x s)
   2.316 -  have *:"(x \<inter> \<Union>s) = \<Union>{x \<inter> y| y. y\<in>s}"by auto
   2.317 -  show ?case unfolding Union_insert setsum.insert [OF insert(1-2)] 
   2.318 -    apply(rule has_gmeasure_negligible_union) unfolding *
   2.319 -    apply(rule insert) defer apply(rule insert) apply(rule insert) defer
   2.320 -    apply(rule insert) prefer 4 apply(rule negligible_unions)
   2.321 -    defer apply safe apply(rule insert) using insert by auto
   2.322 -qed auto
   2.323 -
   2.324 -lemma measure_negligible_unions: 
   2.325 -  assumes "finite f" "\<And>s. s \<in> f ==> s has_gmeasure (m s)"
   2.326 -  "\<And>s t. s \<in> f \<Longrightarrow> t \<in> f \<Longrightarrow> s \<noteq> t ==> negligible(s \<inter> t)"
   2.327 -  shows "gmeasure(\<Union> f) = setsum m f"
   2.328 -  apply rule apply(rule has_gmeasure_negligible_unions)
   2.329 -  using assms by auto
   2.330 -
   2.331 -lemma has_gmeasure_disjoint_unions:
   2.332 -  assumes"finite f" "\<And>s. s \<in> f ==> s has_gmeasure (m s)"
   2.333 -  "\<And>s t. s \<in> f \<Longrightarrow> t \<in> f \<Longrightarrow> s \<noteq> t ==> s \<inter> t = {}"
   2.334 -  shows "(\<Union> f) has_gmeasure (setsum m f)"
   2.335 -  apply(rule has_gmeasure_negligible_unions[OF assms(1-2)]) using assms(3) by auto
   2.336 -
   2.337 -lemma measure_disjoint_unions: 
   2.338 -  assumes "finite f" "\<And>s. s \<in> f ==> s has_gmeasure (m s)" 
   2.339 -  "\<And>s t. s \<in> f \<Longrightarrow> t \<in> f \<Longrightarrow> s \<noteq> t ==> s \<inter> t = {}"
   2.340 -  shows "gmeasure(\<Union> f) = setsum m f"
   2.341 -  apply rule apply(rule has_gmeasure_disjoint_unions[OF assms]) by auto
   2.342 -
   2.343 -lemma has_gmeasure_negligible_unions_image:
   2.344 -  assumes "finite s" "\<And>x. x \<in> s ==> gmeasurable(f x)"
   2.345 -  "\<And>x y. x \<in> s \<Longrightarrow> y \<in> s \<Longrightarrow> x \<noteq> y \<Longrightarrow> negligible((f x) \<inter> (f y))"
   2.346 -  shows "(\<Union> (f ` s)) has_gmeasure (setsum (\<lambda>x. gmeasure(f x)) s)"
   2.347 -proof- have *:"setsum (\<lambda>x. gmeasure(f x)) s = setsum gmeasure (f ` s)"
   2.348 -    apply(subst setsum_reindex_nonzero) defer
   2.349 -    apply(subst gmeasurable_measure_eq_0)
   2.350 -  proof- case goal2 thus ?case using assms(3)[of x y] by auto
   2.351 -  qed(insert assms, auto)
   2.352 -  show ?thesis unfolding * apply(rule has_gmeasure_negligible_unions) using assms by auto
   2.353 -qed
   2.354 -
   2.355 -lemma measure_negligible_unions_image: True .. (*
   2.356 - "!f:A->real^N->bool s.
   2.357 -        FINITE s \<and>
   2.358 -        (!x. x \<in> s ==> gmeasurable(f x)) \<and>
   2.359 -        (!x y. x \<in> s \<and> y \<in> s \<and> ~(x = y) ==> negligible((f x) \<inter> (f y)))
   2.360 -        ==> measure(UNIONS (IMAGE f s)) = sum s (\<lambda>x. measure(f x))"
   2.361 -qed   REPEAT STRIP_TAC THEN MATCH_MP_TAC MEASURE_UNIQUE THEN
   2.362 -  ASM_SIMP_TAC[HAS_GMEASURE_NEGLIGIBLE_UNIONS_IMAGE]);;*)
   2.363 -
   2.364 -lemma has_gmeasure_disjoint_unions_image: True .. (*
   2.365 - "!f:A->real^N->bool s.
   2.366 -        FINITE s \<and>
   2.367 -        (!x. x \<in> s ==> gmeasurable(f x)) \<and>
   2.368 -        (!x y. x \<in> s \<and> y \<in> s \<and> ~(x = y) ==> DISJOINT (f x) (f y))
   2.369 -        ==> (UNIONS (IMAGE f s)) has_gmeasure (sum s (\<lambda>x. measure(f x)))"
   2.370 -qed   REWRITE_TAC[DISJOINT] THEN REPEAT STRIP_TAC THEN
   2.371 -  MATCH_MP_TAC HAS_GMEASURE_NEGLIGIBLE_UNIONS_IMAGE THEN
   2.372 -  ASM_SIMP_TAC[NEGLIGIBLE_EMPTY]);;*)
   2.373 -
   2.374 -lemma measure_disjoint_unions_image: True .. (*
   2.375 - "!f:A->real^N->bool s.
   2.376 -        FINITE s \<and>
   2.377 -        (!x. x \<in> s ==> gmeasurable(f x)) \<and>
   2.378 -        (!x y. x \<in> s \<and> y \<in> s \<and> ~(x = y) ==> DISJOINT (f x) (f y))
   2.379 -        ==> measure(UNIONS (IMAGE f s)) = sum s (\<lambda>x. measure(f x))"
   2.380 -qed   REPEAT STRIP_TAC THEN MATCH_MP_TAC MEASURE_UNIQUE THEN
   2.381 -  ASM_SIMP_TAC[HAS_GMEASURE_DISJOINT_UNIONS_IMAGE]);;*)
   2.382 -
   2.383 -lemma has_gmeasure_negligible_unions_image_strong: True .. (*
   2.384 - "!f:A->real^N->bool s.
   2.385 -        FINITE {x | x \<in> s \<and> ~(f x = {})} \<and>
   2.386 -        (!x. x \<in> s ==> gmeasurable(f x)) \<and>
   2.387 -        (!x y. x \<in> s \<and> y \<in> s \<and> ~(x = y) ==> negligible((f x) \<inter> (f y)))
   2.388 -        ==> (UNIONS (IMAGE f s)) has_gmeasure (sum s (\<lambda>x. measure(f x)))"
   2.389 -qed   REPEAT STRIP_TAC THEN
   2.390 -  MP_TAC(ISPECL [`f:A->real^N->bool`;
   2.391 -                 `{x | x \<in> s \<and> ~((f:A->real^N->bool) x = {})}`]
   2.392 -        HAS_GMEASURE_NEGLIGIBLE_UNIONS_IMAGE) THEN
   2.393 -  ASM_SIMP_TAC[IN_ELIM_THM; FINITE_RESTRICT] THEN
   2.394 -  MATCH_MP_TAC EQ_IMP THEN BINOP_TAC THENL
   2.395 -   [GEN_REWRITE_TAC I [EXTENSION] THEN
   2.396 -    REWRITE_TAC[IN_UNIONS; IN_IMAGE; IN_ELIM_THM] THEN
   2.397 -    MESON_TAC[NOT_IN_EMPTY];
   2.398 -    CONV_TAC SYM_CONV THEN MATCH_MP_TAC SUM_SUPERSET THEN
   2.399 -    SIMP_TAC[SUBSET; IN_ELIM_THM; TAUT `a \<and> ~(a \<and> b) \<longleftrightarrow> a \<and> ~b`] THEN
   2.400 -    REWRITE_TAC[MEASURE_EMPTY]]);; *)
   2.401 -
   2.402 -lemma measure_negligible_unions_image_strong: True .. (*
   2.403 - "!f:A->real^N->bool s.
   2.404 -        FINITE {x | x \<in> s \<and> ~(f x = {})} \<and>
   2.405 -        (!x. x \<in> s ==> gmeasurable(f x)) \<and>
   2.406 -        (!x y. x \<in> s \<and> y \<in> s \<and> ~(x = y) ==> negligible((f x) \<inter> (f y)))
   2.407 -        ==> measure(UNIONS (IMAGE f s)) = sum s (\<lambda>x. measure(f x))"
   2.408 -qed   REPEAT STRIP_TAC THEN MATCH_MP_TAC MEASURE_UNIQUE THEN
   2.409 -  ASM_SIMP_TAC[HAS_GMEASURE_NEGLIGIBLE_UNIONS_IMAGE_STRONG]);; *)
   2.410 -
   2.411 -lemma has_gmeasure_disjoint_unions_image_strong: True .. (*
   2.412 - "!f:A->real^N->bool s.
   2.413 -        FINITE {x | x \<in> s \<and> ~(f x = {})} \<and>
   2.414 -        (!x. x \<in> s ==> gmeasurable(f x)) \<and>
   2.415 -        (!x y. x \<in> s \<and> y \<in> s \<and> ~(x = y) ==> DISJOINT (f x) (f y))
   2.416 -        ==> (UNIONS (IMAGE f s)) has_gmeasure (sum s (\<lambda>x. measure(f x)))"
   2.417 -qed   REWRITE_TAC[DISJOINT] THEN REPEAT STRIP_TAC THEN
   2.418 -  MATCH_MP_TAC HAS_GMEASURE_NEGLIGIBLE_UNIONS_IMAGE_STRONG THEN
   2.419 -  ASM_SIMP_TAC[NEGLIGIBLE_EMPTY]);; *)
   2.420 -
   2.421 -lemma measure_disjoint_unions_image_strong: True .. (*
   2.422 - "!f:A->real^N->bool s.
   2.423 -        FINITE {x | x \<in> s \<and> ~(f x = {})} \<and>
   2.424 -        (!x. x \<in> s ==> gmeasurable(f x)) \<and>
   2.425 -        (!x y. x \<in> s \<and> y \<in> s \<and> ~(x = y) ==> DISJOINT (f x) (f y))
   2.426 -        ==> measure(UNIONS (IMAGE f s)) = sum s (\<lambda>x. measure(f x))"
   2.427 -qed   REPEAT STRIP_TAC THEN MATCH_MP_TAC MEASURE_UNIQUE THEN
   2.428 -  ASM_SIMP_TAC[HAS_GMEASURE_DISJOINT_UNIONS_IMAGE_STRONG]);; *)
   2.429 -
   2.430 -lemma measure_union: True .. (*
   2.431 - "!s t:real^N->bool.
   2.432 -        gmeasurable s \<and> gmeasurable t
   2.433 -        ==> measure(s \<union> t) = measure(s) + measure(t) - measure(s \<inter> t)"
   2.434 -qed   REPEAT STRIP_TAC THEN
   2.435 -  ONCE_REWRITE_TAC[SET_RULE
   2.436 -   `s \<union> t = (s \<inter> t) \<union> (s DIFF t) \<union> (t DIFF s)`] THEN
   2.437 -  ONCE_REWRITE_TAC[REAL_ARITH `a + b - c = c + (a - c) + (b - c)`] THEN
   2.438 -  MP_TAC(ISPECL [`s DIFF t:real^N->bool`; `t DIFF s:real^N->bool`]
   2.439 -        MEASURE_DISJOINT_UNION) THEN
   2.440 -  ASM_SIMP_TAC[MEASURABLE_DIFF] THEN
   2.441 -  ANTS_TAC THENL [SET_TAC[]; ALL_TAC] THEN
   2.442 -  MP_TAC(ISPECL [`s \<inter> t:real^N->bool`;
   2.443 -                 `(s DIFF t) \<union> (t DIFF s):real^N->bool`]
   2.444 -                MEASURE_DISJOINT_UNION) THEN
   2.445 -  ASM_SIMP_TAC[MEASURABLE_DIFF; GMEASURABLE_UNION; GMEASURABLE_INTER] THEN
   2.446 -  ANTS_TAC THENL [SET_TAC[]; ALL_TAC] THEN
   2.447 -  REPEAT(DISCH_THEN SUBST1_TAC) THEN AP_TERM_TAC THEN BINOP_TAC THEN
   2.448 -  REWRITE_TAC[REAL_EQ_SUB_LADD] THEN MATCH_MP_TAC EQ_TRANS THENL
   2.449 -   [EXISTS_TAC `measure((s DIFF t) \<union> (s \<inter> t):real^N->bool)`;
   2.450 -    EXISTS_TAC `measure((t DIFF s) \<union> (s \<inter> t):real^N->bool)`] THEN
   2.451 -  (CONJ_TAC THENL
   2.452 -    [CONV_TAC SYM_CONV THEN MATCH_MP_TAC MEASURE_DISJOINT_UNION THEN
   2.453 -     ASM_SIMP_TAC[MEASURABLE_DIFF; GMEASURABLE_INTER];
   2.454 -     AP_TERM_TAC] THEN
   2.455 -   SET_TAC[]));; *)
   2.456 -
   2.457 -lemma measure_union_le: True .. (*
   2.458 - "!s t:real^N->bool.
   2.459 -        gmeasurable s \<and> gmeasurable t
   2.460 -        ==> measure(s \<union> t) <= gmeasure s + gmeasure t"
   2.461 -qed   REPEAT STRIP_TAC THEN ASM_SIMP_TAC[MEASURE_UNION] THEN
   2.462 -  REWRITE_TAC[REAL_ARITH `a + b - c <= a + b \<longleftrightarrow> 0 <= c`] THEN
   2.463 -  MATCH_MP_TAC MEASURE_POS_LE THEN ASM_SIMP_TAC[MEASURABLE_INTER]);; *)
   2.464 -
   2.465 -lemma measure_unions_le: True .. (*
   2.466 - "!f:(real^N->bool)->bool.
   2.467 -        FINITE f \<and> (!s. s \<in> f ==> gmeasurable s)
   2.468 -        ==> measure(UNIONS f) <= sum f (\<lambda>s. gmeasure s)"
   2.469 -qed   REWRITE_TAC[IMP_CONJ] THEN
   2.470 -  MATCH_MP_TAC FINITE_INDUCT_STRONG THEN
   2.471 -  SIMP_TAC[UNIONS_0; UNIONS_INSERT; SUM_CLAUSES] THEN
   2.472 -  REWRITE_TAC[MEASURE_EMPTY; REAL_LE_REFL] THEN
   2.473 -  MAP_EVERY X_GEN_TAC [`s:real^N->bool`; `f:(real^N->bool)->bool`] THEN
   2.474 -  REWRITE_TAC[IN_INSERT] THEN REPEAT STRIP_TAC THEN
   2.475 -  MATCH_MP_TAC REAL_LE_TRANS THEN
   2.476 -  EXISTS_TAC `measure(s:real^N->bool) + measure(UNIONS f:real^N->bool)` THEN
   2.477 -  ASM_SIMP_TAC[MEASURE_UNION_LE; GMEASURABLE_UNIONS] THEN
   2.478 -  REWRITE_TAC[REAL_LE_LADD] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
   2.479 -  ASM_SIMP_TAC[]);; *)
   2.480 -
   2.481 -lemma measure_unions_le_image: True .. (*
   2.482 - "!f:A->bool s:A->(real^N->bool).
   2.483 -        FINITE f \<and> (!a. a \<in> f ==> gmeasurable(s a))
   2.484 -        ==> measure(UNIONS (IMAGE s f)) <= sum f (\<lambda>a. measure(s a))"
   2.485 -qed   REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN
   2.486 -  EXISTS_TAC `sum (IMAGE s (f:A->bool)) (\<lambda>k:real^N->bool. gmeasure k)` THEN
   2.487 -  ASM_SIMP_TAC[MEASURE_UNIONS_LE; FORALL_IN_IMAGE; FINITE_IMAGE] THEN
   2.488 -  GEN_REWRITE_TAC (RAND_CONV o RAND_CONV) [GSYM o_DEF] THEN
   2.489 -  REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC SUM_IMAGE_LE THEN
   2.490 -  ASM_SIMP_TAC[MEASURE_POS_LE]);; *)
   2.491 -
   2.492 -lemma gmeasurable_inner_outer: True .. (*
   2.493 - "!s:real^N->bool.
   2.494 -        gmeasurable s \<longleftrightarrow>
   2.495 -                !e. 0 < e
   2.496 -                    ==> ?t u. t \<subseteq> s \<and> s \<subseteq> u \<and>
   2.497 -                              gmeasurable t \<and> gmeasurable u \<and>
   2.498 -                              abs(measure t - gmeasure u) < e"
   2.499 -qed   GEN_TAC THEN EQ_TAC THEN DISCH_TAC THENL
   2.500 -   [GEN_TAC THEN DISCH_TAC THEN REPEAT(EXISTS_TAC `s:real^N->bool`) THEN
   2.501 -    ASM_REWRITE_TAC[SUBSET_REFL; REAL_SUB_REFL; REAL_ABS_NUM];
   2.502 -    ALL_TAC] THEN
   2.503 -  REWRITE_TAC[MEASURABLE_INTEGRABLE] THEN MATCH_MP_TAC INTEGRABLE_STRADDLE THEN
   2.504 -  X_GEN_TAC `e:real` THEN DISCH_TAC THEN
   2.505 -  FIRST_X_ASSUM(MP_TAC o SPEC `e:real`) THEN
   2.506 -  ASM_REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
   2.507 -  MAP_EVERY X_GEN_TAC [`t:real^N->bool`; `u:real^N->bool`] THEN STRIP_TAC THEN
   2.508 -  MAP_EVERY EXISTS_TAC
   2.509 -   [`(\<lambda>x. if x \<in> t then 1 else 0):real^N->real^1`;
   2.510 -    `(\<lambda>x. if x \<in> u then 1 else 0):real^N->real^1`;
   2.511 -    `lift(measure(t:real^N->bool))`;
   2.512 -    `lift(measure(u:real^N->bool))`] THEN
   2.513 -  ASM_REWRITE_TAC[GSYM HAS_GMEASURE; GSYM HAS_GMEASURE_MEASURE] THEN
   2.514 -  ASM_REWRITE_TAC[GSYM LIFT_SUB; NORM_LIFT] THEN REPEAT STRIP_TAC THEN
   2.515 -  REPEAT(COND_CASES_TAC THEN
   2.516 -         ASM_REWRITE_TAC[_VEC; REAL_POS; REAL_LE_REFL]) THEN
   2.517 -  ASM SET_TAC[]);; *)
   2.518 -
   2.519 -lemma has_gmeasure_inner_outer: True .. (*
   2.520 - "!s:real^N->bool m.
   2.521 -        s has_gmeasure m \<longleftrightarrow>
   2.522 -                (!e. 0 < e ==> ?t. t \<subseteq> s \<and> gmeasurable t \<and>
   2.523 -                                    m - e < gmeasure t) \<and>
   2.524 -                (!e. 0 < e ==> ?u. s \<subseteq> u \<and> gmeasurable u \<and>
   2.525 -                                    gmeasure u < m + e)"
   2.526 -qed   REPEAT GEN_TAC THEN
   2.527 -  GEN_REWRITE_TAC LAND_CONV [HAS_GMEASURE_MEASURABLE_MEASURE] THEN EQ_TAC THENL
   2.528 -   [REPEAT STRIP_TAC THEN EXISTS_TAC `s:real^N->bool` THEN
   2.529 -    ASM_REWRITE_TAC[SUBSET_REFL] THEN ASM_REAL_ARITH_TAC;
   2.530 -    ALL_TAC] THEN
   2.531 -  DISCH_THEN(CONJUNCTS_THEN2 (LABEL_TAC "t") (LABEL_TAC "u")) THEN
   2.532 -  MATCH_MP_TAC(TAUT `a \<and> (a ==> b) ==> a \<and> b`) THEN CONJ_TAC THENL
   2.533 -   [GEN_REWRITE_TAC I [MEASURABLE_INNER_OUTER] THEN
   2.534 -    X_GEN_TAC `e:real` THEN DISCH_TAC THEN
   2.535 -    REMOVE_THEN "u" (MP_TAC o SPEC `e / 2`) THEN
   2.536 -    REMOVE_THEN "t" (MP_TAC o SPEC `e / 2`) THEN
   2.537 -    ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN
   2.538 -    REWRITE_TAC[IMP_IMP; LEFT_AND_EXISTS_THM] THEN
   2.539 -    REWRITE_TAC[RIGHT_AND_EXISTS_THM] THEN
   2.540 -    REPEAT(MATCH_MP_TAC MONO_EXISTS THEN GEN_TAC) THEN
   2.541 -    STRIP_TAC THEN ASM_REWRITE_TAC[] THEN MATCH_MP_TAC(REAL_ARITH
   2.542 -     `0 < e \<and> t <= u \<and> m - e / 2 < t \<and> u < m + e / 2
   2.543 -                          ==> abs(t - u) < e`) THEN
   2.544 -    ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MEASURE_SUBSET THEN
   2.545 -    ASM_REWRITE_TAC[] THEN ASM SET_TAC[];
   2.546 -    DISCH_TAC THEN MATCH_MP_TAC(REAL_ARITH
   2.547 -     `~(0 < x - y) \<and> ~(0 < y - x) ==> x = y`) THEN
   2.548 -    CONJ_TAC THEN DISCH_TAC THENL
   2.549 -     [REMOVE_THEN "u" (MP_TAC o SPEC `measure(s:real^N->bool) - m`) THEN
   2.550 -      ASM_REWRITE_TAC[REAL_SUB_ADD2; GSYM REAL_NOT_LE];
   2.551 -      REMOVE_THEN "t" (MP_TAC o SPEC `m - measure(s:real^N->bool)`) THEN
   2.552 -      ASM_REWRITE_TAC[REAL_SUB_SUB2; GSYM REAL_NOT_LE]] THEN
   2.553 -    ASM_MESON_TAC[MEASURE_SUBSET]]);; *)
   2.554 -
   2.555 -lemma has_gmeasure_inner_outer_le: True .. (*
   2.556 - "!s:real^N->bool m.
   2.557 -        s has_gmeasure m \<longleftrightarrow>
   2.558 -                (!e. 0 < e ==> ?t. t \<subseteq> s \<and> gmeasurable t \<and>
   2.559 -                                    m - e <= gmeasure t) \<and>
   2.560 -                (!e. 0 < e ==> ?u. s \<subseteq> u \<and> gmeasurable u \<and>
   2.561 -                                    gmeasure u <= m + e)"
   2.562 -qed   REWRITE_TAC[HAS_GMEASURE_INNER_OUTER] THEN
   2.563 -  MESON_TAC[REAL_ARITH `0 < e \<and> m - e / 2 <= t ==> m - e < t`;
   2.564 -            REAL_ARITH `0 < e \<and> u <= m + e / 2 ==> u < m + e`;
   2.565 -            REAL_ARITH `0 < e \<longleftrightarrow> 0 < e / 2`; REAL_LT_IMP_LE]);; *)
   2.566 -
   2.567 -lemma has_gmeasure_limit: True .. (*
   2.568 - "!s. s has_gmeasure m \<longleftrightarrow>
   2.569 -        !e. 0 < e
   2.570 -            ==> ?B. 0 < B \<and>
   2.571 -                    !a b. ball(0,B) \<subseteq> {a..b}
   2.572 -                          ==> ?z. (s \<inter> {a..b}) has_gmeasure z \<and>
   2.573 -                                  abs(z - m) < e"
   2.574 -qed   GEN_TAC THEN REWRITE_TAC[HAS_GMEASURE] THEN
   2.575 -  GEN_REWRITE_TAC LAND_CONV [HAS_INTEGRAL] THEN
   2.576 -  REWRITE_TAC[IN_UNIV] THEN
   2.577 -  GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV)
   2.578 -    [GSYM HAS_INTEGRAL_RESTRICT_UNIV] THEN
   2.579 -  REWRITE_TAC[MESON[IN_INTER]
   2.580 -        `(if x \<in> k \<inter> s then a else b) =
   2.581 -         (if x \<in> s then if x \<in> k then a else b else b)`] THEN
   2.582 -  REWRITE_TAC[EXISTS_LIFT; GSYM LIFT_SUB; NORM_LIFT]);; *)
   2.583 -
   2.584 -(* ------------------------------------------------------------------------- *)
   2.585 -(* properties of gmeasure under simple affine transformations.                *)
   2.586 -(* ------------------------------------------------------------------------- *)
   2.587 -
   2.588 -lemma has_gmeasure_affinity: True .. (*
   2.589 - "!s m c y. s has_gmeasure y
   2.590 -             ==> (IMAGE (\<lambda>x:real^N. m % x + c) s)
   2.591 -                 has_gmeasure abs(m) pow (dimindex(:N)) * y"
   2.592 -qed   REPEAT GEN_TAC THEN ASM_CASES_TAC `m = 0` THENL
   2.593 -   [ASM_REWRITE_TAC[REAL_ABS_NUM; VECTOR_ADD_LID; VECTOR_MUL_LZERO] THEN
   2.594 -    ONCE_REWRITE_TAC[MATCH_MP (ARITH_RULE `~(x = 0) ==> x = SUC(x - 1)`)
   2.595 -     (SPEC_ALL DIMINDEX_NONZERO)] THEN DISCH_TAC THEN
   2.596 -    REWRITE_TAC[real_pow; REAL_MUL_LZERO; HAS_GMEASURE_0] THEN
   2.597 -    MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN EXISTS_TAC `{c:real^N}` THEN
   2.598 -    SIMP_TAC[NEGLIGIBLE_FINITE; FINITE_RULES] THEN SET_TAC[];
   2.599 -    ALL_TAC] THEN
   2.600 -  REWRITE_TAC[HAS_GMEASURE] THEN
   2.601 -  ONCE_REWRITE_TAC[HAS_INTEGRAL] THEN REWRITE_TAC[IN_UNIV] THEN
   2.602 -  DISCH_TAC THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN
   2.603 -  FIRST_X_ASSUM(MP_TAC o SPEC `e:real / abs(m) pow dimindex(:N)`) THEN
   2.604 -  ASM_SIMP_TAC[REAL_LT_DIV; REAL_POW_LT; GSYM REAL_ABS_NZ; REAL_POW_LT] THEN
   2.605 -  DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC) THEN
   2.606 -  EXISTS_TAC `abs(m) * B + norm(c:real^N)` THEN
   2.607 -  ASM_SIMP_TAC[REAL_ARITH `0 < B \<and> 0 <= x ==> 0 < B + x`;
   2.608 -               NORM_POS_LE; REAL_LT_MUL; GSYM REAL_ABS_NZ; REAL_POW_LT] THEN
   2.609 -  MAP_EVERY X_GEN_TAC [`u:real^N`; `v:real^N`] THEN DISCH_TAC THEN
   2.610 -  REWRITE_TAC[IN_IMAGE] THEN
   2.611 -  ASM_SIMP_TAC[VECTOR_EQ_AFFINITY; UNWIND_THM1] THEN
   2.612 -  FIRST_X_ASSUM(MP_TAC o SPECL
   2.613 -    [`if 0 <= m then inv m % u + --(inv m % c):real^N
   2.614 -                 else inv m % v + --(inv m % c)`;
   2.615 -     `if 0 <= m then inv m % v + --(inv m % c):real^N
   2.616 -                 else inv m % u + --(inv m % c)`]) THEN
   2.617 -  MATCH_MP_TAC(TAUT `a \<and> (a ==> b ==> c) ==> (a ==> b) ==> c`) THEN
   2.618 -  CONJ_TAC THENL
   2.619 -   [REWRITE_TAC[SUBSET] THEN X_GEN_TAC `x:real^N` THEN
   2.620 -    FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
   2.621 -    DISCH_THEN(MP_TAC o SPEC `m % x + c:real^N`) THEN
   2.622 -    MATCH_MP_TAC MONO_IMP THEN REWRITE_TAC[IN_BALL; IN_INTERVAL] THEN
   2.623 -    CONJ_TAC THENL
   2.624 -     [REWRITE_TAC[NORM_ARITH `dist(0,x) = norm(x:real^N)`] THEN
   2.625 -      DISCH_TAC THEN MATCH_MP_TAC(NORM_ARITH
   2.626 -       `norm(x:real^N) < a ==> norm(x + y) < a + norm(y)`) THEN
   2.627 -      ASM_SIMP_TAC[NORM_MUL; REAL_LT_LMUL; GSYM REAL_ABS_NZ];
   2.628 -      ALL_TAC] THEN
   2.629 -    SIMP_TAC[VECTOR_ADD_COMPONENT; VECTOR_MUL_COMPONENT; VECTOR_NEG_COMPONENT;
   2.630 -             COND_COMPONENT] THEN
   2.631 -    MATCH_MP_TAC MONO_FORALL THEN GEN_TAC THEN MATCH_MP_TAC MONO_IMP THEN
   2.632 -    REWRITE_TAC[REAL_ARITH `m * u + --(m * c):real = (u - c) * m`] THEN
   2.633 -    SUBST1_TAC(REAL_ARITH
   2.634 -      `inv(m) = if 0 <= inv(m) then abs(inv m) else --(abs(inv m))`) THEN
   2.635 -    SIMP_TAC[REAL_LE_INV_EQ] THEN
   2.636 -    REWRITE_TAC[REAL_ARITH `(x - y:real) * --z = (y - x) * z`] THEN
   2.637 -    REWRITE_TAC[REAL_ABS_INV; GSYM real_div] THEN COND_CASES_TAC THEN
   2.638 -    ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_LE_RDIV_EQ; GSYM REAL_ABS_NZ] THEN
   2.639 -    ASM_REWRITE_TAC[real_abs] THEN REAL_ARITH_TAC;
   2.640 -    ALL_TAC] THEN
   2.641 -  REWRITE_TAC[SUBSET] THEN DISCH_THEN(MP_TAC o SPEC `0:real^N`) THEN
   2.642 -  ASM_REWRITE_TAC[CENTRE_IN_BALL] THEN DISCH_TAC THEN
   2.643 -  DISCH_THEN(X_CHOOSE_THEN `z:real^1`
   2.644 -   (fun th -> EXISTS_TAC `(abs m pow dimindex (:N)) % z:real^1` THEN
   2.645 -              MP_TAC th)) THEN
   2.646 -  DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
   2.647 -  FIRST_ASSUM(MP_TAC o MATCH_MP(REAL_FIELD `~(x = 0) ==> ~(inv x = 0)`)) THEN
   2.648 -  REWRITE_TAC[TAUT `a ==> b ==> c \<longleftrightarrow> b \<and> a ==> c`] THEN
   2.649 -  DISCH_THEN(MP_TAC o SPEC `--(inv m % c):real^N` o
   2.650 -    MATCH_MP HAS_INTEGRAL_AFFINITY) THEN
   2.651 -  ASM_REWRITE_TAC[IMAGE_AFFINITY_INTERVAL; REAL_INV_INV] THEN
   2.652 -  SIMP_TAC[COND_ID] THEN COND_CASES_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
   2.653 -  REWRITE_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC;
   2.654 -               VECTOR_MUL_LNEG; VECTOR_MUL_RNEG] THEN
   2.655 -  ASM_SIMP_TAC[REAL_MUL_RINV; VECTOR_MUL_LID; VECTOR_NEG_NEG] THEN
   2.656 -  REWRITE_TAC[VECTOR_ARITH `(u + --c) + c:real^N = u`] THEN
   2.657 -  REWRITE_TAC[REAL_ABS_INV; REAL_INV_INV; GSYM REAL_POW_INV] THEN
   2.658 -  DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN
   2.659 -  REWRITE_TAC[LIFT_CMUL; GSYM VECTOR_SUB_LDISTRIB] THEN
   2.660 -  REWRITE_TAC[NORM_MUL; REAL_ABS_POW; REAL_ABS_ABS] THEN
   2.661 -  ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
   2.662 -  ASM_SIMP_TAC[GSYM REAL_LT_RDIV_EQ; REAL_POW_LT; GSYM REAL_ABS_NZ]);; *)
   2.663 -
   2.664 -lemma stretch_galois: True .. (*
   2.665 - "!x:real^N y:real^N m.
   2.666 -        (!k. 1 <= k \<and> k <= dimindex(:N) ==>  ~(m k = 0))
   2.667 -        ==> ((y = (lambda k. m k * x$k)) \<longleftrightarrow> (lambda k. inv(m k) * y$k) = x)"
   2.668 -qed   REPEAT GEN_TAC THEN SIMP_TAC[CART_EQ; LAMBDA_BETA] THEN
   2.669 -  MATCH_MP_TAC(MESON[]
   2.670 -   `(!x. p x ==> (q x \<longleftrightarrow> r x))
   2.671 -    ==> (!x. p x) ==> ((!x. q x) \<longleftrightarrow> (!x. r x))`) THEN
   2.672 -  GEN_TAC THEN ASM_CASES_TAC `1 <= k \<and> k <= dimindex(:N)` THEN
   2.673 -  ASM_REWRITE_TAC[] THEN CONV_TAC REAL_FIELD);; *)
   2.674 -
   2.675 -lemma has_gmeasure_stretch: True .. (*
   2.676 - "!s m y. s has_gmeasure y
   2.677 -           ==> (IMAGE (\<lambda>x:real^N. lambda k. m k * x$k) s :real^N->bool)
   2.678 -               has_gmeasure abs(product (1..dimindex(:N)) m) * y"
   2.679 -qed   REPEAT STRIP_TAC THEN ASM_CASES_TAC
   2.680 -   `!k. 1 <= k \<and> k <= dimindex(:N) ==> ~(m k = 0)`
   2.681 -  THENL
   2.682 -   [ALL_TAC;
   2.683 -    FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [NOT_FORALL_THM]) THEN
   2.684 -    REWRITE_TAC[NOT_IMP; GSYM CONJ_ASSOC; LEFT_IMP_EXISTS_THM] THEN
   2.685 -    X_GEN_TAC `k:num` THEN STRIP_TAC THEN
   2.686 -    SUBGOAL_THEN `product(1..dimindex (:N)) m = 0` SUBST1_TAC THENL
   2.687 -     [ASM_MESON_TAC[PRODUCT_EQ_0_NUMSEG]; ALL_TAC] THEN
   2.688 -    REWRITE_TAC[REAL_ABS_NUM; REAL_MUL_LZERO; HAS_GMEASURE_0] THEN
   2.689 -    MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
   2.690 -    EXISTS_TAC `{x:real^N | x$k = 0}` THEN
   2.691 -    ASM_SIMP_TAC[NEGLIGIBLE_STANDARD_HYPERPLANE; SUBSET; FORALL_IN_IMAGE] THEN
   2.692 -    ASM_SIMP_TAC[IN_ELIM_THM; LAMBDA_BETA; REAL_MUL_LZERO]] THEN
   2.693 -  UNDISCH_TAC `(s:real^N->bool) has_gmeasure y` THEN
   2.694 -  REWRITE_TAC[HAS_GMEASURE] THEN
   2.695 -  ONCE_REWRITE_TAC[HAS_INTEGRAL] THEN REWRITE_TAC[IN_UNIV] THEN
   2.696 -  DISCH_TAC THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN
   2.697 -  SUBGOAL_THEN `0 < abs(product(1..dimindex(:N)) m)` ASSUME_TAC THENL
   2.698 -   [ASM_MESON_TAC[REAL_ABS_NZ; REAL_LT_DIV; PRODUCT_EQ_0_NUMSEG];
   2.699 -    ALL_TAC] THEN
   2.700 -  FIRST_X_ASSUM(MP_TAC o SPEC `e:real / abs(product(1..dimindex(:N)) m)`) THEN
   2.701 -  ASM_SIMP_TAC[REAL_LT_DIV] THEN
   2.702 -  DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC) THEN
   2.703 -  EXISTS_TAC `sup(IMAGE (\<lambda>k. abs(m k) * B) (1..dimindex(:N)))` THEN
   2.704 -  MATCH_MP_TAC(TAUT `a \<and> (a ==> b) ==> a \<and> b`) THEN CONJ_TAC THENL
   2.705 -   [ASM_SIMP_TAC[REAL_LT_SUP_FINITE; FINITE_IMAGE; NUMSEG_EMPTY; FINITE_NUMSEG;
   2.706 -                 IN_NUMSEG; GSYM NOT_LE; DIMINDEX_GE_1; IMAGE_EQ_EMPTY;
   2.707 -                 EXISTS_IN_IMAGE] THEN
   2.708 -    ASM_MESON_TAC[IN_NUMSEG; DIMINDEX_GE_1; LE_REFL; REAL_LT_MUL; REAL_ABS_NZ];
   2.709 -    DISCH_TAC] THEN
   2.710 -  MAP_EVERY X_GEN_TAC [`u:real^N`; `v:real^N`] THEN DISCH_TAC THEN
   2.711 -  ASM_SIMP_TAC[IN_IMAGE; STRETCH_GALOIS; UNWIND_THM1] THEN
   2.712 -  FIRST_X_ASSUM(MP_TAC o SPECL
   2.713 -    [`(lambda k. min (inv(m k) * (u:real^N)$k)
   2.714 -                     (inv(m k) * (v:real^N)$k)):real^N`;
   2.715 -     `(lambda k. max (inv(m k) * (u:real^N)$k)
   2.716 -                 (inv(m k) * (v:real^N)$k)):real^N`]) THEN
   2.717 -  MATCH_MP_TAC(TAUT `a \<and> (b ==> a ==> c) ==> (a ==> b) ==> c`) THEN
   2.718 -  CONJ_TAC THENL
   2.719 -   [ALL_TAC;
   2.720 -    REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN X_GEN_TAC `z:real^1` THEN
   2.721 -    DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
   2.722 -    SUBGOAL_THEN `!k. 1 <= k \<and> k <= dimindex (:N) ==> ~(inv(m k) = 0)`
   2.723 -    MP_TAC THENL [ASM_SIMP_TAC[REAL_INV_EQ_0]; ALL_TAC] THEN
   2.724 -    ONCE_REWRITE_TAC[GSYM IMP_CONJ_ALT] THEN
   2.725 -    DISCH_THEN(MP_TAC o MATCH_MP HAS_INTEGRAL_STRETCH)] THEN
   2.726 -  (MP_TAC(ISPECL [`u:real^N`; `v:real^N`; `\i:num. inv(m i)`]
   2.727 -    IMAGE_STRETCH_INTERVAL) THEN
   2.728 -   SUBGOAL_THEN `~(interval[u:real^N,v] = {})` ASSUME_TAC THENL
   2.729 -    [FIRST_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
   2.730 -      `s \<subseteq> t ==> ~(s = {}) ==> ~(t = {})`)) THEN
   2.731 -     ASM_REWRITE_TAC[BALL_EQ_EMPTY; GSYM REAL_NOT_LT];
   2.732 -     ALL_TAC] THEN
   2.733 -   ASM_REWRITE_TAC[] THEN DISCH_THEN(SUBST1_TAC o SYM))
   2.734 -  THENL
   2.735 -   [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
   2.736 -     `b \<subseteq> s ==> b' \<subseteq> IMAGE f b ==> b' \<subseteq> IMAGE f s`)) THEN
   2.737 -    REWRITE_TAC[IN_BALL; SUBSET; NORM_ARITH `dist(0,x) = norm x`;
   2.738 -                IN_IMAGE] THEN
   2.739 -    ASM_SIMP_TAC[STRETCH_GALOIS; REAL_INV_EQ_0; UNWIND_THM1; REAL_INV_INV] THEN
   2.740 -    X_GEN_TAC `x:real^N` THEN DISCH_TAC THEN
   2.741 -    MATCH_MP_TAC REAL_LET_TRANS THEN
   2.742 -    EXISTS_TAC
   2.743 -     `norm(sup(IMAGE(\<lambda>k. abs(m k)) (1..dimindex(:N))) % x:real^N)` THEN
   2.744 -    CONJ_TAC THENL
   2.745 -     [MATCH_MP_TAC NORM_LE_COMPONENTWISE THEN
   2.746 -      SIMP_TAC[LAMBDA_BETA; VECTOR_MUL_COMPONENT; REAL_ABS_MUL] THEN
   2.747 -      REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_RMUL THEN
   2.748 -      REWRITE_TAC[REAL_ABS_POS] THEN
   2.749 -      MATCH_MP_TAC(REAL_ARITH `x <= y ==> x <= abs y`) THEN
   2.750 -      ASM_SIMP_TAC[REAL_LE_SUP_FINITE; FINITE_IMAGE; IMAGE_EQ_EMPTY;
   2.751 -                  NUMSEG_EMPTY; FINITE_NUMSEG; GSYM NOT_LE; DIMINDEX_GE_1] THEN
   2.752 -      REWRITE_TAC[EXISTS_IN_IMAGE; IN_NUMSEG] THEN ASM_MESON_TAC[REAL_LE_REFL];
   2.753 -      ALL_TAC] THEN
   2.754 -    REWRITE_TAC[NORM_MUL] THEN MATCH_MP_TAC REAL_LTE_TRANS THEN
   2.755 -    EXISTS_TAC `abs(sup(IMAGE(\<lambda>k. abs(m k)) (1..dimindex(:N)))) * B` THEN
   2.756 -    SUBGOAL_THEN `0 < sup(IMAGE(\<lambda>k. abs(m k)) (1..dimindex(:N)))`
   2.757 -    ASSUME_TAC THENL
   2.758 -     [ASM_SIMP_TAC[REAL_LT_SUP_FINITE; FINITE_IMAGE; IMAGE_EQ_EMPTY;
   2.759 -                  NUMSEG_EMPTY; FINITE_NUMSEG; GSYM NOT_LE; DIMINDEX_GE_1] THEN
   2.760 -      REWRITE_TAC[EXISTS_IN_IMAGE; GSYM REAL_ABS_NZ; IN_NUMSEG] THEN
   2.761 -      ASM_MESON_TAC[DIMINDEX_GE_1; LE_REFL];
   2.762 -      ALL_TAC] THEN
   2.763 -    ASM_SIMP_TAC[REAL_LT_LMUL_EQ; REAL_ARITH `0 < x ==> 0 < abs x`] THEN
   2.764 -    MATCH_MP_TAC REAL_LE_TRANS THEN
   2.765 -    EXISTS_TAC `sup(IMAGE(\<lambda>k. abs(m k)) (1..dimindex(:N))) * B` THEN
   2.766 -    ASM_SIMP_TAC[REAL_LE_RMUL_EQ; REAL_ARITH `0 < x ==> abs x <= x`] THEN
   2.767 -    ASM_SIMP_TAC[REAL_LE_SUP_FINITE; FINITE_IMAGE; IMAGE_EQ_EMPTY;
   2.768 -                  NUMSEG_EMPTY; FINITE_NUMSEG; GSYM NOT_LE; DIMINDEX_GE_1] THEN
   2.769 -    ASM_SIMP_TAC[EXISTS_IN_IMAGE; REAL_LE_RMUL_EQ] THEN
   2.770 -    ASM_SIMP_TAC[REAL_SUP_LE_FINITE; FINITE_IMAGE; IMAGE_EQ_EMPTY;
   2.771 -                 NUMSEG_EMPTY; FINITE_NUMSEG; GSYM NOT_LE; DIMINDEX_GE_1] THEN
   2.772 -    MP_TAC(ISPEC `IMAGE (\<lambda>k. abs (m k)) (1..dimindex(:N))` SUP_FINITE) THEN
   2.773 -    REWRITE_TAC[FORALL_IN_IMAGE] THEN
   2.774 -    ASM_SIMP_TAC[FINITE_IMAGE; FINITE_NUMSEG; IMAGE_EQ_EMPTY; NUMSEG_EMPTY;
   2.775 -                 GSYM NOT_LE; DIMINDEX_GE_1] THEN
   2.776 -    REWRITE_TAC[IN_IMAGE] THEN MESON_TAC[];
   2.777 -
   2.778 -    MATCH_MP_TAC(MESON[]
   2.779 -     `s = t \<and> P z ==> (f has_integral z) s ==> Q
   2.780 -                       ==> ?w. (f has_integral w) t \<and> P w`) THEN
   2.781 -    SIMP_TAC[GSYM PRODUCT_INV; FINITE_NUMSEG; GSYM REAL_ABS_INV] THEN
   2.782 -    REWRITE_TAC[REAL_INV_INV] THEN CONJ_TAC THENL
   2.783 -     [REWRITE_TAC[GSYM IMAGE_o] THEN MATCH_MP_TAC(SET_RULE
   2.784 -       `(!x. f x = x) ==> IMAGE f s = s`) THEN
   2.785 -      SIMP_TAC[o_THM; LAMBDA_BETA; CART_EQ] THEN
   2.786 -      ASM_SIMP_TAC[REAL_MUL_ASSOC; REAL_MUL_RINV; REAL_MUL_LID];
   2.787 -      REWRITE_TAC[ABS_; _SUB; LIFT_; _CMUL] THEN
   2.788 -      REWRITE_TAC[GSYM REAL_SUB_LDISTRIB; ETA_AX] THEN
   2.789 -      REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_ABS] THEN
   2.790 -      ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
   2.791 -      ASM_SIMP_TAC[GSYM REAL_LT_RDIV_EQ] THEN
   2.792 -      ASM_MESON_TAC[ABS_; _SUB; LIFT_]]]);; *)
   2.793 -
   2.794 -lemma has_gmeasure_translation: True .. (*
   2.795 - "!s m a. s has_gmeasure m ==> (IMAGE (\<lambda>x:real^N. a + x) s) has_gmeasure m"
   2.796 -qed   REPEAT GEN_TAC THEN
   2.797 -  MP_TAC(ISPECL [`s:real^N->bool`; `1`; `a:real^N`; `m:real`]
   2.798 -                HAS_GMEASURE_AFFINITY) THEN
   2.799 -  REWRITE_TAC[VECTOR_MUL_LID; REAL_ABS_NUM; REAL_POW_ONE; REAL_MUL_LID] THEN
   2.800 -  REWRITE_TAC[VECTOR_ADD_SYM]);; *)
   2.801 -
   2.802 -lemma negligible_translation: True .. (*
   2.803 - "!s a. negligible s ==> negligible (IMAGE (\<lambda>x:real^N. a + x) s)"
   2.804 -qed   SIMP_TAC[GSYM HAS_GMEASURE_0; HAS_GMEASURE_TRANSLATION]);; *)
   2.805 -
   2.806 -lemma has_gmeasure_translation_eq: True .. (*
   2.807 - "!s m. (IMAGE (\<lambda>x:real^N. a + x) s) has_gmeasure m \<longleftrightarrow> s has_gmeasure m"
   2.808 -qed   REPEAT GEN_TAC THEN EQ_TAC THEN REWRITE_TAC[HAS_GMEASURE_TRANSLATION] THEN
   2.809 -  DISCH_THEN(MP_TAC o SPEC `--a:real^N` o
   2.810 -    MATCH_MP HAS_GMEASURE_TRANSLATION) THEN
   2.811 -  MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN
   2.812 -  REWRITE_TAC[GSYM IMAGE_o; o_DEF; VECTOR_ARITH `--a + a + b:real^N = b`] THEN
   2.813 -  SET_TAC[]);; *)
   2.814 -
   2.815 -lemma negligible_translation_rev: True .. (*
   2.816 - "!s a. negligible (IMAGE (\<lambda>x:real^N. a + x) s) ==> negligible s"
   2.817 -qed   SIMP_TAC[GSYM HAS_GMEASURE_0; HAS_GMEASURE_TRANSLATION_EQ]);; *)
   2.818 -
   2.819 -lemma negligible_translation_eq: True .. (*
   2.820 - "!s a. negligible (IMAGE (\<lambda>x:real^N. a + x) s) \<longleftrightarrow> negligible s"
   2.821 -qed   SIMP_TAC[GSYM HAS_GMEASURE_0; HAS_GMEASURE_TRANSLATION_EQ]);; *)
   2.822 -
   2.823 -lemma gmeasurable_translation: True .. (*
   2.824 - "!s. gmeasurable (IMAGE (\<lambda>x. a + x) s) \<longleftrightarrow> gmeasurable s"
   2.825 -qed   REWRITE_TAC[measurable; HAS_GMEASURE_TRANSLATION_EQ]);; *)
   2.826 -
   2.827 -lemma measure_translation: True .. (*
   2.828 - "!s. gmeasurable s ==> measure(IMAGE (\<lambda>x. a + x) s) = gmeasure s"
   2.829 -qed   REWRITE_TAC[HAS_GMEASURE_MEASURE] THEN REPEAT STRIP_TAC THEN
   2.830 -  MATCH_MP_TAC MEASURE_UNIQUE THEN
   2.831 -  ASM_REWRITE_TAC[HAS_GMEASURE_TRANSLATION_EQ]);; *)
   2.832 -
   2.833 -lemma has_gmeasure_scaling: True .. (*
   2.834 - "!s m c. s has_gmeasure m
   2.835 -           ==> (IMAGE (\<lambda>x:real^N. c % x) s) has_gmeasure
   2.836 -               (abs(c) pow dimindex(:N)) * m"
   2.837 -qed   REPEAT GEN_TAC THEN
   2.838 -  MP_TAC(ISPECL [`s:real^N->bool`; `c:real`; `0:real^N`; `m:real`]
   2.839 -                HAS_GMEASURE_AFFINITY) THEN
   2.840 -  REWRITE_TAC[VECTOR_ADD_RID]);; *)
   2.841 -
   2.842 -lemma has_gmeasure_scaling_eq: True .. (*
   2.843 - "!s m c. ~(c = 0)
   2.844 -           ==> (IMAGE (\<lambda>x:real^N. c % x) s
   2.845 -                  has_gmeasure (abs(c) pow dimindex(:N)) * m \<longleftrightarrow>
   2.846 -                s has_gmeasure m)"
   2.847 -qed   REPEAT STRIP_TAC THEN EQ_TAC THEN REWRITE_TAC[HAS_GMEASURE_SCALING] THEN
   2.848 -  DISCH_THEN(MP_TAC o SPEC `inv(c)` o MATCH_MP HAS_GMEASURE_SCALING) THEN
   2.849 -  REWRITE_TAC[GSYM IMAGE_o; o_DEF; GSYM REAL_ABS_MUL] THEN
   2.850 -  REWRITE_TAC[GSYM REAL_POW_MUL; VECTOR_MUL_ASSOC; REAL_MUL_ASSOC] THEN
   2.851 -  ASM_SIMP_TAC[GSYM REAL_ABS_MUL; REAL_MUL_LINV] THEN
   2.852 -  REWRITE_TAC[REAL_POW_ONE; REAL_ABS_NUM; REAL_MUL_LID; VECTOR_MUL_LID] THEN
   2.853 -  MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN SET_TAC[]);; *)
   2.854 -
   2.855 -lemma gmeasurable_scaling: True .. (*
   2.856 - "!s c. gmeasurable s ==> gmeasurable (IMAGE (\<lambda>x. c % x) s)"
   2.857 -qed   REWRITE_TAC[measurable] THEN MESON_TAC[HAS_GMEASURE_SCALING]);; *)
   2.858 -
   2.859 -lemma gmeasurable_scaling_eq: True .. (*
   2.860 - "!s c. ~(c = 0) ==> (measurable (IMAGE (\<lambda>x. c % x) s) \<longleftrightarrow> gmeasurable s)"
   2.861 -qed   REPEAT STRIP_TAC THEN EQ_TAC THEN REWRITE_TAC[MEASURABLE_SCALING] THEN
   2.862 -  DISCH_THEN(MP_TAC o SPEC `inv c` o MATCH_MP GMEASURABLE_SCALING) THEN
   2.863 -  REWRITE_TAC[GSYM IMAGE_o; o_DEF; GSYM REAL_ABS_MUL] THEN
   2.864 -  MATCH_MP_TAC EQ_IMP THEN AP_TERM_TAC THEN
   2.865 -  ASM_SIMP_TAC[VECTOR_MUL_ASSOC; REAL_MUL_LINV; VECTOR_MUL_LID] THEN
   2.866 -  SET_TAC[]);; *)
   2.867 -
   2.868 -lemma measure_scaling: True .. (*
   2.869 - "!s. gmeasurable s
   2.870 -       ==> measure(IMAGE (\<lambda>x:real^N. c % x) s) =
   2.871 -              (abs(c) pow dimindex(:N)) * gmeasure s"
   2.872 -qed   REWRITE_TAC[HAS_GMEASURE_MEASURE] THEN REPEAT STRIP_TAC THEN
   2.873 -  MATCH_MP_TAC MEASURE_UNIQUE THEN ASM_SIMP_TAC[HAS_GMEASURE_SCALING]);; *)
   2.874 -
   2.875 -(* ------------------------------------------------------------------------- *)
   2.876 -(* Measurability of countable unions and intersections of various kinds.     *)
   2.877 -(* ------------------------------------------------------------------------- *)
   2.878 -
   2.879 -lemma has_gmeasure_nested_unions:
   2.880 -  assumes "\<And>n. gmeasurable(s n)" "\<And>n. gmeasure(s n) \<le> B" "\<And>n. s(n) \<subseteq> s(Suc n)"
   2.881 -  shows "gmeasurable(\<Union> { s n | n. n \<in> UNIV }) \<and>
   2.882 -  (\<lambda>n. gmeasure(s n)) ----> gmeasure(\<Union> { s(n) | n. n \<in> UNIV })"
   2.883 -proof- let ?g = "\<lambda>x. if x \<in> \<Union>{s n |n. n \<in> UNIV} then 1 else (0::real)"
   2.884 -  have "?g integrable_on UNIV \<and> (\<lambda>k. integral UNIV (\<lambda>x. if x \<in> s k then 1 else 0)) ----> integral UNIV ?g"
   2.885 -  proof(rule monotone_convergence_increasing)
   2.886 -    case goal1 show ?case using assms(1) unfolding gmeasurable_integrable by auto
   2.887 -    case goal2 show ?case using assms(3) by auto
   2.888 -    have "\<forall>m n. m\<le>n \<longrightarrow> s m \<subseteq> s n" apply(subst transitive_stepwise_le_eq)
   2.889 -      using assms(3) by auto note * = this[rule_format]
   2.890 -    have **:"\<And>x e n. \<lbrakk>x \<in> s n; 0 < e\<rbrakk> \<Longrightarrow> \<exists>N. \<forall>n. x \<notin> s n \<longrightarrow> N \<le> n \<longrightarrow> dist 0 1 < e"
   2.891 -      apply(rule_tac x=n in exI) using * by auto 
   2.892 -    case goal3 show ?case unfolding Lim_sequentially by(auto intro!: **) 
   2.893 -    case goal4 show ?case unfolding bounded_def apply(rule_tac x=0 in exI)
   2.894 -      apply(rule_tac x=B in exI) unfolding dist_real_def apply safe
   2.895 -      unfolding measure_integral_univ[OF assms(1),THEN sym]
   2.896 -      apply(subst abs_of_nonpos) using assms(1,2) by auto
   2.897 -  qed note conjunctD2[OF this]
   2.898 -  thus ?thesis unfolding gmeasurable_integrable[THEN sym] measure_integral_univ[OF assms(1)]
   2.899 -    apply- unfolding measure_integral_univ by auto
   2.900 -qed
   2.901 -
   2.902 -lemmas gmeasurable_nested_unions = has_gmeasure_nested_unions(1)
   2.903 -
   2.904 -lemma sums_alt:"f sums s = (\<lambda>n. setsum f {0..n}) ----> s"
   2.905 -proof- have *:"\<And>n. {0..<Suc n} = {0..n}" by auto
   2.906 -  show ?thesis unfolding sums_def apply(subst LIMSEQ_Suc_iff[THEN sym]) unfolding * ..
   2.907 -qed
   2.908 -
   2.909 -lemma has_gmeasure_countable_negligible_unions: 
   2.910 -  assumes "\<And>n. gmeasurable(s n)" "\<And>m n. m \<noteq> n \<Longrightarrow> negligible(s m \<inter> s n)"
   2.911 -  "\<And>n. setsum (\<lambda>k. gmeasure(s k)) {0..n}  <= B"
   2.912 -  shows "gmeasurable(\<Union> { s(n) |n. n \<in> UNIV })" (is ?m)
   2.913 -  "((\<lambda>n. gmeasure(s n)) sums (gmeasure(\<Union> { s(n) |n. n \<in> UNIV })))" (is ?s)
   2.914 -proof- have *:"\<And>n. (\<Union> (s ` {0..n})) has_gmeasure (setsum (\<lambda>k. gmeasure(s k)) {0..n})"
   2.915 -    apply(rule has_gmeasure_negligible_unions_image) using assms by auto
   2.916 -  have **:"(\<Union>{\<Union>s ` {0..n} |n. n \<in> UNIV}) = (\<Union>{s n |n. n \<in> UNIV})" unfolding simple_image by fastsimp
   2.917 -  have "gmeasurable (\<Union>{\<Union>s ` {0..n} |n. n \<in> UNIV}) \<and>
   2.918 -    (\<lambda>n. gmeasure (\<Union>(s ` {0..n}))) ----> gmeasure (\<Union>{\<Union>s ` {0..n} |n. n \<in> UNIV})"
   2.919 -    apply(rule has_gmeasure_nested_unions) apply(rule gmeasurableI,rule *)
   2.920 -    unfolding measure_unique[OF *] defer apply(rule Union_mono,rule image_mono) using assms(3) by auto
   2.921 -  note lem = conjunctD2[OF this,unfolded **]
   2.922 -  show ?m using lem(1) .
   2.923 -  show ?s using lem(2) unfolding sums_alt measure_unique[OF *] .
   2.924 -qed     
   2.925 -
   2.926 -lemma negligible_countable_unions: True .. (*
   2.927 - "!s:num->real^N->bool.
   2.928 -        (!n. negligible(s n)) ==> negligible(UNIONS {s(n) | n \<in> (:num)})"
   2.929 -qed   REPEAT STRIP_TAC THEN
   2.930 -  MP_TAC(ISPECL [`s:num->real^N->bool`; `0`]
   2.931 -    HAS_GMEASURE_COUNTABLE_NEGLIGIBLE_UNIONS) THEN
   2.932 -  ASM_SIMP_TAC[MEASURE_EQ_0; SUM_0; REAL_LE_REFL; LIFT_NUM] THEN ANTS_TAC THENL
   2.933 -   [ASM_MESON_TAC[HAS_GMEASURE_0; gmeasurable; INTER_SUBSET; NEGLIGIBLE_SUBSET];
   2.934 -    ALL_TAC] THEN
   2.935 -  SIMP_TAC[GSYM GMEASURABLE_MEASURE_EQ_0] THEN
   2.936 -  STRIP_TAC THEN REWRITE_TAC[GSYM LIFT_EQ] THEN
   2.937 -  MATCH_MP_TAC SERIES_UNIQUE THEN REWRITE_TAC[LIFT_NUM] THEN
   2.938 -  MAP_EVERY EXISTS_TAC [`(\<lambda>k. 0):num->real^1`; `from 0`] THEN
   2.939 -  ASM_REWRITE_TAC[SERIES_0]);; *)
   2.940 -
   2.941 -lemma gmeasurable_countable_unions_strong:
   2.942 -  assumes "\<And>n. gmeasurable(s n)" "\<And>n::nat. gmeasure(\<Union>{s k |k. k \<le> n}) \<le> B"
   2.943 -  shows "gmeasurable(\<Union>{ s(n) |n. n \<in> UNIV })"
   2.944 -proof- have *:"\<Union>{\<Union>s ` {0..n} |n. n \<in> UNIV} = \<Union>range s" unfolding simple_image by fastsimp
   2.945 -  show ?thesis unfolding simple_image
   2.946 -    apply(rule gmeasurable_nested_unions[of "\<lambda>n. \<Union>(s ` {0..n})", THEN conjunct1,unfolded *])
   2.947 -  proof- fix n::nat show "gmeasurable (\<Union>s ` {0..n})"
   2.948 -      apply(rule gmeasurable_finite_unions) using assms(1) by auto
   2.949 -    show "gmeasure (\<Union>s ` {0..n}) \<le> B"
   2.950 -      using assms(2)[of n] unfolding simple_image[THEN sym] by auto
   2.951 -    show "\<Union>s ` {0..n} \<subseteq> \<Union>s ` {0..Suc n}" apply(rule Union_mono) by auto
   2.952 -  qed
   2.953 -qed
   2.954 -
   2.955 -lemma has_gmeasure_countable_negligible_unions_bounded: True .. (*
   2.956 - "!s:num->real^N->bool.
   2.957 -        (!n. gmeasurable(s n)) \<and>
   2.958 -        (!m n. ~(m = n) ==> negligible(s m \<inter> s n)) \<and>
   2.959 -        bounded(\<Union>{ s(n) | n \<in> (:num) })
   2.960 -        ==> gmeasurable(\<Union>{ s(n) | n \<in> (:num) }) \<and>
   2.961 -            ((\<lambda>n. lift(measure(s n))) sums
   2.962 -             lift(measure(\<Union>{ s(n) | n \<in> (:num) }))) (from 0)"
   2.963 -qed   REPEAT GEN_TAC THEN STRIP_TAC THEN
   2.964 -  FIRST_ASSUM(MP_TAC o MATCH_MP BOUNDED_SUBSET_CLOSED_INTERVAL) THEN
   2.965 -  REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
   2.966 -  MAP_EVERY X_GEN_TAC [`a:real^N`; `b:real^N`] THEN DISCH_TAC THEN
   2.967 -  MATCH_MP_TAC HAS_GMEASURE_COUNTABLE_NEGLIGIBLE_UNIONS THEN
   2.968 -  EXISTS_TAC `measure(interval[a:real^N,b])` THEN
   2.969 -  ASM_REWRITE_TAC[] THEN X_GEN_TAC `n:num` THEN MATCH_MP_TAC REAL_LE_TRANS THEN
   2.970 -  EXISTS_TAC `measure(UNIONS (IMAGE (s:num->real^N->bool) (0..n)))` THEN
   2.971 -  CONJ_TAC THENL
   2.972 -   [MATCH_MP_TAC REAL_EQ_IMP_LE THEN CONV_TAC SYM_CONV THEN
   2.973 -    MATCH_MP_TAC MEASURE_NEGLIGIBLE_UNIONS_IMAGE THEN
   2.974 -    ASM_SIMP_TAC[FINITE_NUMSEG];
   2.975 -    MATCH_MP_TAC MEASURE_SUBSET THEN REWRITE_TAC[MEASURABLE_INTERVAL] THEN
   2.976 -    CONJ_TAC THENL
   2.977 -     [MATCH_MP_TAC GMEASURABLE_UNIONS THEN
   2.978 -      ASM_SIMP_TAC[FINITE_IMAGE; FINITE_NUMSEG; FORALL_IN_IMAGE];
   2.979 -      ASM SET_TAC[]]]);; *)
   2.980 -
   2.981 -lemma gmeasurable_countable_negligible_unions_bounded: True .. (*
   2.982 - "!s:num->real^N->bool.
   2.983 -        (!n. gmeasurable(s n)) \<and>
   2.984 -        (!m n. ~(m = n) ==> negligible(s m \<inter> s n)) \<and>
   2.985 -        bounded(\<Union>{ s(n) | n \<in> (:num) })
   2.986 -        ==> gmeasurable(\<Union>{ s(n) | n \<in> (:num) })"
   2.987 -qed   SIMP_TAC[HAS_GMEASURE_COUNTABLE_NEGLIGIBLE_UNIONS_BOUNDED]);; *)
   2.988 -
   2.989 -lemma gmeasurable_countable_unions: True .. (*
   2.990 - "!s:num->real^N->bool B.
   2.991 -        (!n. gmeasurable(s n)) \<and>
   2.992 -        (!n. sum (0..n) (\<lambda>k. measure(s k)) \<le> B)
   2.993 -        ==> gmeasurable(\<Union>{ s(n) | n \<in> (:num) })"
   2.994 -qed   REPEAT STRIP_TAC THEN MATCH_MP_TAC GMEASURABLE_COUNTABLE_UNIONS_STRONG THEN
   2.995 -  EXISTS_TAC `B:real` THEN ASM_REWRITE_TAC[] THEN
   2.996 -  X_GEN_TAC `n:num` THEN MATCH_MP_TAC REAL_LE_TRANS THEN
   2.997 -  EXISTS_TAC `sum(0..n) (\<lambda>k. measure(s k:real^N->bool))` THEN
   2.998 -  ASM_REWRITE_TAC[] THEN
   2.999 -  W(MP_TAC o PART_MATCH (rand o rand) MEASURE_UNIONS_LE_IMAGE o
  2.1000 -       rand o snd) THEN
  2.1001 -  ASM_REWRITE_TAC[FINITE_NUMSEG] THEN
  2.1002 -  ONCE_REWRITE_TAC[GSYM SIMPLE_IMAGE] THEN
  2.1003 -  REWRITE_TAC[IN_NUMSEG; LE_0]);; *)
  2.1004 -
  2.1005 -lemma gmeasurable_countable_inters: True .. (*
  2.1006 - "!s:num->real^N->bool.
  2.1007 -        (!n. gmeasurable(s n))
  2.1008 -        ==> gmeasurable(INTERS { s(n) | n \<in> (:num) })"
  2.1009 -qed   REPEAT STRIP_TAC THEN
  2.1010 -  SUBGOAL_THEN `INTERS { s(n):real^N->bool | n \<in> (:num) } =
  2.1011 -                s 0 DIFF (\<Union>{s 0 DIFF s n | n \<in> (:num)})`
  2.1012 -  SUBST1_TAC THENL
  2.1013 -   [GEN_REWRITE_TAC I [EXTENSION] THEN
  2.1014 -    REWRITE_TAC[IN_INTERS; IN_DIFF; IN_UNIONS] THEN
  2.1015 -    REWRITE_TAC[SIMPLE_IMAGE; FORALL_IN_IMAGE; EXISTS_IN_IMAGE] THEN
  2.1016 -    ASM SET_TAC[];
  2.1017 -    ALL_TAC] THEN
  2.1018 -  MATCH_MP_TAC GMEASURABLE_DIFF THEN ASM_REWRITE_TAC[] THEN
  2.1019 -  MATCH_MP_TAC GMEASURABLE_COUNTABLE_UNIONS_STRONG THEN
  2.1020 -  EXISTS_TAC `measure(s 0:real^N->bool)` THEN
  2.1021 -  ASM_SIMP_TAC[MEASURABLE_DIFF; LE_0] THEN
  2.1022 -  GEN_TAC THEN MATCH_MP_TAC MEASURE_SUBSET THEN
  2.1023 -  ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
  2.1024 -   [ALL_TAC;
  2.1025 -    REWRITE_TAC[SUBSET; FORALL_IN_UNIONS; IN_ELIM_THM; IN_DIFF] THEN
  2.1026 -    MESON_TAC[IN_DIFF]] THEN
  2.1027 -  ONCE_REWRITE_TAC[GSYM IN_NUMSEG_0] THEN
  2.1028 -  ONCE_REWRITE_TAC[SIMPLE_IMAGE] THEN
  2.1029 -  ASM_SIMP_TAC[FORALL_IN_IMAGE; FINITE_IMAGE; FINITE_NUMSEG;
  2.1030 -               GMEASURABLE_DIFF; GMEASURABLE_UNIONS]);; *)
  2.1031 -
  2.1032 -(* ------------------------------------------------------------------------- *)
  2.1033 -(* measurability of compact and bounded open sets.                           *)
  2.1034 -(* ------------------------------------------------------------------------- *)
  2.1035 -
  2.1036 -lemma gmeasurable_compact: True .. (*
  2.1037 - "!s:real^N->bool. compact s ==> gmeasurable s"
  2.1038 -qed   lemma lemma = prove
  2.1039 -   (`!f s:real^N->bool.
  2.1040 -          (!n. FINITE(f n)) \<and>
  2.1041 -          (!n. s \<subseteq> UNIONS(f n)) \<and>
  2.1042 -          (!x. ~(x \<in> s) ==> ?n. ~(x \<in> UNIONS(f n))) \<and>
  2.1043 -          (!n a. a \<in> f(SUC n) ==> ?b. b \<in> f(n) \<and> a \<subseteq> b) \<and>
  2.1044 -          (!n a. a \<in> f(n) ==> gmeasurable a)
  2.1045 -          ==> gmeasurable s"
  2.1046 -qed     REPEAT STRIP_TAC THEN
  2.1047 -    SUBGOAL_THEN `!n. UNIONS(f(SUC n):(real^N->bool)->bool) \<subseteq> UNIONS(f n)`
  2.1048 -    ASSUME_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
  2.1049 -    SUBGOAL_THEN `s = INTERS { UNIONS(f n) | n \<in> (:num) }:real^N->bool`
  2.1050 -    SUBST1_TAC THENL
  2.1051 -     [ONCE_REWRITE_TAC[SIMPLE_IMAGE] THEN
  2.1052 -      MATCH_MP_TAC SUBSET_ANTISYM THEN CONJ_TAC THEN
  2.1053 -      REWRITE_TAC[SUBSET; IN_INTERS; FORALL_IN_IMAGE; IN_UNIV] THEN
  2.1054 -      REWRITE_TAC[IN_IMAGE] THEN ASM SET_TAC[];
  2.1055 -      MATCH_MP_TAC GMEASURABLE_COUNTABLE_INTERS THEN
  2.1056 -      ASM_REWRITE_TAC[] THEN GEN_TAC THEN
  2.1057 -      MATCH_MP_TAC GMEASURABLE_UNIONS THEN
  2.1058 -      ASM_MESON_TAC[]]) in
  2.1059 -  REPEAT STRIP_TAC THEN MATCH_MP_TAC lemma THEN
  2.1060 -  EXISTS_TAC
  2.1061 -   `\n. { k | ?u:real^N. (!i. 1 \<le> i \<and> i \<le> dimindex(:N)
  2.1062 -                              ==> integer(u$i)) \<and>
  2.1063 -                  k = { x:real^N | !i. 1 \<le> i \<and> i \<le> dimindex(:N)
  2.1064 -                                       ==> u$i / 2 pow n \<le> x$i \<and>
  2.1065 -                                           x$i < (u$i + 1) / 2 pow n } \<and>
  2.1066 -                  ~(s \<inter> k = {})}` THEN
  2.1067 -  REWRITE_TAC[IN_ELIM_THM] THEN REPEAT CONJ_TAC THENL
  2.1068 -   [X_GEN_TAC `n:num` THEN
  2.1069 -    SIMP_TAC[REAL_LE_LDIV_EQ; REAL_LT_RDIV_EQ; REAL_LT_POW2] THEN
  2.1070 -    SUBGOAL_THEN
  2.1071 -     `?N. !x:real^N i. x \<in> s \<and> 1 \<le> i \<and> i \<le> dimindex(:N)
  2.1072 -                       ==> abs(x$i * 2 pow n) < N`
  2.1073 -    STRIP_ASSUME_TAC THENL
  2.1074 -     [FIRST_ASSUM(MP_TAC o MATCH_MP COMPACT_IMP_BOUNDED) THEN
  2.1075 -      REWRITE_TAC[BOUNDED_POS; LEFT_IMP_EXISTS_THM] THEN
  2.1076 -      X_GEN_TAC `B:real` THEN STRIP_TAC THEN
  2.1077 -      MP_TAC(SPEC `B * 2 pow n` (MATCH_MP REAL_ARCH REAL_LT_01)) THEN
  2.1078 -      MATCH_MP_TAC MONO_EXISTS THEN REWRITE_TAC[REAL_MUL_RID] THEN
  2.1079 -      X_GEN_TAC `N:num` THEN
  2.1080 -      REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_POW; REAL_ABS_NUM] THEN
  2.1081 -      SIMP_TAC[GSYM REAL_LT_RDIV_EQ; REAL_LT_POW2] THEN
  2.1082 -      ASM_MESON_TAC[COMPONENT_LE_NORM; REAL_LE_TRANS; REAL_LET_TRANS];
  2.1083 -      ALL_TAC] THEN
  2.1084 -    MATCH_MP_TAC FINITE_SUBSET THEN
  2.1085 -    EXISTS_TAC
  2.1086 -     `IMAGE (\<lambda>u. {x | !i. 1 \<le> i \<and> i \<le> dimindex(:N)
  2.1087 -                          ==> (u:real^N)$i \<le> (x:real^N)$i * 2 pow n \<and>
  2.1088 -                              x$i * 2 pow n < u$i + 1})
  2.1089 -            {u | !i. 1 \<le> i \<and> i \<le> dimindex(:N) ==> integer (u$i) \<and>
  2.1090 -                                                     abs(u$i) \<le> N}` THEN
  2.1091 -    CONJ_TAC THENL
  2.1092 -     [MATCH_MP_TAC FINITE_IMAGE THEN MATCH_MP_TAC FINITE_CART THEN
  2.1093 -      REWRITE_TAC[GSYM REAL_BOUNDS_LE; FINITE_INTSEG];
  2.1094 -      REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_IMAGE] THEN
  2.1095 -      X_GEN_TAC `l:real^N->bool` THEN
  2.1096 -      MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `u:real^N` THEN
  2.1097 -      STRIP_TAC THEN FIRST_X_ASSUM SUBST_ALL_TAC THEN ASM_SIMP_TAC[] THEN
  2.1098 -      X_GEN_TAC `k:num` THEN STRIP_TAC THEN
  2.1099 -      MATCH_MP_TAC REAL_LE_REVERSE_INTEGERS THEN
  2.1100 -      ASM_SIMP_TAC[INTEGER_CLOSED] THEN
  2.1101 -      FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM MEMBER_NOT_EMPTY]) THEN
  2.1102 -      DISCH_THEN(X_CHOOSE_THEN `x:real^N` MP_TAC) THEN
  2.1103 -      REWRITE_TAC[IN_INTER; IN_ELIM_THM] THEN
  2.1104 -      DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC (MP_TAC o SPEC `k:num`)) THEN
  2.1105 -      ASM_REWRITE_TAC[] THEN
  2.1106 -      FIRST_X_ASSUM(MP_TAC o SPECL [`x:real^N`; `k:num`]) THEN
  2.1107 -      ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC];
  2.1108 -    X_GEN_TAC `n:num` THEN REWRITE_TAC[SUBSET; IN_UNIONS; IN_ELIM_THM] THEN
  2.1109 -    X_GEN_TAC `x:real^N` THEN DISCH_TAC THEN
  2.1110 -    REWRITE_TAC[LEFT_AND_EXISTS_THM] THEN
  2.1111 -    ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN
  2.1112 -    EXISTS_TAC `(lambda i. floor(2 pow n * (x:real^N)$i)):real^N` THEN
  2.1113 -    ONCE_REWRITE_TAC[TAUT `(a \<and> b \<and> c) \<and> d \<longleftrightarrow> b \<and> a \<and> c \<and> d`] THEN
  2.1114 -    REWRITE_TAC[UNWIND_THM2] THEN SIMP_TAC[LAMBDA_BETA; FLOOR] THEN
  2.1115 -    REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_INTER] THEN
  2.1116 -    REWRITE_TAC[LEFT_AND_EXISTS_THM] THEN EXISTS_TAC `x:real^N` THEN
  2.1117 -    ASM_REWRITE_TAC[IN_ELIM_THM] THEN
  2.1118 -    SIMP_TAC[REAL_LE_LDIV_EQ; REAL_LT_RDIV_EQ; REAL_LT_POW2] THEN
  2.1119 -    REWRITE_TAC[REAL_MUL_SYM; FLOOR];
  2.1120 -    X_GEN_TAC `x:real^N` THEN DISCH_TAC THEN
  2.1121 -    FIRST_ASSUM(MP_TAC o MATCH_MP COMPACT_IMP_CLOSED) THEN
  2.1122 -    REWRITE_TAC[closed; open_def] THEN
  2.1123 -    DISCH_THEN(MP_TAC o SPEC `x:real^N`) THEN
  2.1124 -    ASM_REWRITE_TAC[IN_DIFF; IN_UNIV] THEN
  2.1125 -    DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
  2.1126 -    MP_TAC(SPECL [`inv(2)`; `e / (dimindex(:N))`] REAL_ARCH_POW_INV) THEN
  2.1127 -    ASM_SIMP_TAC[REAL_LT_DIV; REAL_LT_RDIV_EQ; REAL_OF_NUM_LT;
  2.1128 -                 DIMINDEX_GE_1; ARITH_RULE `0 < x \<longleftrightarrow> 1 \<le> x`] THEN
  2.1129 -    CONV_TAC REAL_RAT_REDUCE_CONV THEN
  2.1130 -    MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN
  2.1131 -    REWRITE_TAC[IN_UNIONS; IN_ELIM_THM] THEN
  2.1132 -    REWRITE_TAC[LEFT_AND_EXISTS_THM] THEN
  2.1133 -    ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN
  2.1134 -    ONCE_REWRITE_TAC[TAUT `(a \<and> b \<and> c) \<and> d \<longleftrightarrow> b \<and> a \<and> c \<and> d`] THEN
  2.1135 -    REWRITE_TAC[UNWIND_THM2] THEN REWRITE_TAC[NOT_EXISTS_THM] THEN
  2.1136 -    X_GEN_TAC `u:real^N` THEN REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN
  2.1137 -    REWRITE_TAC[IN_INTER; IN_ELIM_THM] THEN
  2.1138 -    DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC o CONJUNCT2) THEN
  2.1139 -    DISCH_THEN(X_CHOOSE_THEN `y:real^N`
  2.1140 -     (CONJUNCTS_THEN2 MP_TAC ASSUME_TAC)) THEN
  2.1141 -    REWRITE_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
  2.1142 -    FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
  2.1143 -     `d < e ==> x \<le> d ==> x < e`)) THEN
  2.1144 -    REWRITE_TAC[dist] THEN
  2.1145 -    W(MP_TAC o PART_MATCH lhand NORM_LE_L1 o lhand o snd) THEN
  2.1146 -    MATCH_MP_TAC(REAL_ARITH `a \<le> b ==> x \<le> a ==> x \<le> b`) THEN
  2.1147 -    GEN_REWRITE_TAC (funpow 3 RAND_CONV) [GSYM CARD_NUMSEG_1] THEN
  2.1148 -    ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN MATCH_MP_TAC SUM_BOUND THEN
  2.1149 -    SIMP_TAC[FINITE_NUMSEG; IN_NUMSEG; VECTOR_SUB_COMPONENT] THEN
  2.1150 -    X_GEN_TAC `k:num` THEN STRIP_TAC THEN
  2.1151 -    REPEAT(FIRST_X_ASSUM(MP_TAC o SPEC `k:num`)) THEN
  2.1152 -    ASM_REWRITE_TAC[real_div; REAL_ADD_RDISTRIB] THEN
  2.1153 -    REWRITE_TAC[REAL_MUL_LID; GSYM REAL_POW_INV] THEN REAL_ARITH_TAC;
  2.1154 -    MAP_EVERY X_GEN_TAC [`n:num`; `a:real^N->bool`] THEN
  2.1155 -    DISCH_THEN(X_CHOOSE_THEN `u:real^N`
  2.1156 -     (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
  2.1157 -    DISCH_THEN(CONJUNCTS_THEN2 (ASSUME_TAC o SYM) ASSUME_TAC) THEN
  2.1158 -    REWRITE_TAC[LEFT_AND_EXISTS_THM] THEN
  2.1159 -    ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN
  2.1160 -    ONCE_REWRITE_TAC[TAUT `(a \<and> b \<and> c) \<and> d \<longleftrightarrow> b \<and> a \<and> c \<and> d`] THEN
  2.1161 -    REWRITE_TAC[UNWIND_THM2] THEN
  2.1162 -    EXISTS_TAC `(lambda i. floor((u:real^N)$i / 2)):real^N` THEN
  2.1163 -    ASM_SIMP_TAC[VECTOR_MUL_COMPONENT; LAMBDA_BETA; FLOOR] THEN
  2.1164 -    MATCH_MP_TAC(SET_RULE `~(s \<inter> a = {}) \<and> a \<subseteq> b
  2.1165 -                           ==> ~(s \<inter> b = {}) \<and> a \<subseteq> b`) THEN
  2.1166 -    ASM_REWRITE_TAC[] THEN EXPAND_TAC "a" THEN REWRITE_TAC[SUBSET] THEN
  2.1167 -    X_GEN_TAC `x:real^N` THEN REWRITE_TAC[IN_ELIM_THM] THEN
  2.1168 -    MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `k:num` THEN
  2.1169 -    DISCH_THEN(fun th -> STRIP_TAC THEN MP_TAC th) THEN ASM_REWRITE_TAC[] THEN
  2.1170 -    REWRITE_TAC[real_pow; real_div; REAL_INV_MUL; REAL_MUL_ASSOC] THEN
  2.1171 -    REWRITE_TAC[GSYM real_div] THEN
  2.1172 -    SIMP_TAC[REAL_LE_LDIV_EQ; REAL_LT_RDIV_EQ; REAL_LT_POW2] THEN
  2.1173 -    MP_TAC(SPEC `(u:real^N)$k / 2` FLOOR) THEN
  2.1174 -    REWRITE_TAC[REAL_ARITH `u / 2 < floor(u / 2) + 1 \<longleftrightarrow>
  2.1175 -                            u < 2 * floor(u / 2) + 2`] THEN
  2.1176 -    ASM_SIMP_TAC[REAL_LT_INTEGERS; INTEGER_CLOSED; FLOOR_FRAC] THEN
  2.1177 -    REAL_ARITH_TAC;
  2.1178 -    REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
  2.1179 -    MAP_EVERY X_GEN_TAC [`n:num`; `a:real^N->bool`; `u:real^N`] THEN
  2.1180 -    DISCH_THEN(SUBST1_TAC o CONJUNCT1 o CONJUNCT2) THEN
  2.1181 -    ONCE_REWRITE_TAC[MEASURABLE_INNER_OUTER] THEN
  2.1182 -    GEN_TAC THEN DISCH_TAC THEN
  2.1183 -    EXISTS_TAC `interval(inv(2 pow n) % u:real^N,
  2.1184 -                         inv(2 pow n) % (u + 1))` THEN
  2.1185 -    EXISTS_TAC `interval[inv(2 pow n) % u:real^N,
  2.1186 -                         inv(2 pow n) % (u + 1)]` THEN
  2.1187 -    REWRITE_TAC[MEASURABLE_INTERVAL; MEASURE_INTERVAL] THEN
  2.1188 -    ASM_REWRITE_TAC[REAL_SUB_REFL; REAL_ABS_0] THEN
  2.1189 -    REWRITE_TAC[SUBSET; IN_INTERVAL; IN_ELIM_THM] THEN
  2.1190 -    CONJ_TAC THEN X_GEN_TAC `y:real^N` THEN
  2.1191 -    MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `k:num` THEN
  2.1192 -    DISCH_THEN(fun th -> STRIP_TAC THEN MP_TAC th) THEN
  2.1193 -    ASM_SIMP_TAC[VECTOR_MUL_COMPONENT; VECTOR_ADD_COMPONENT;
  2.1194 -                 VEC_COMPONENT] THEN
  2.1195 -    REAL_ARITH_TAC]);; *)
  2.1196 -
  2.1197 -lemma gmeasurable_open: True .. (*
  2.1198 - "!s:real^N->bool. bounded s \<and> open s ==> gmeasurable s"
  2.1199 -qed   REPEAT STRIP_TAC THEN
  2.1200 -  FIRST_X_ASSUM(MP_TAC o MATCH_MP BOUNDED_SUBSET_CLOSED_INTERVAL) THEN
  2.1201 -  REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
  2.1202 -  MAP_EVERY X_GEN_TAC [`a:real^N`; `b:real^N`] THEN DISCH_TAC THEN
  2.1203 -  FIRST_ASSUM(SUBST1_TAC o MATCH_MP (SET_RULE
  2.1204 -   `s \<subseteq> t ==> s = t DIFF (t DIFF s)`)) THEN
  2.1205 -  MATCH_MP_TAC GMEASURABLE_DIFF THEN
  2.1206 -  REWRITE_TAC[MEASURABLE_INTERVAL] THEN
  2.1207 -  MATCH_MP_TAC GMEASURABLE_COMPACT THEN
  2.1208 -  SIMP_TAC[COMPACT_EQ_BOUNDED_CLOSED; BOUNDED_DIFF; BOUNDED_INTERVAL] THEN
  2.1209 -  MATCH_MP_TAC CLOSED_DIFF THEN ASM_REWRITE_TAC[CLOSED_INTERVAL]);; *)
  2.1210 -
  2.1211 -lemma gmeasurable_closure: True .. (*
  2.1212 - "!s. bounded s ==> gmeasurable(closure s)"
  2.1213 -qed   SIMP_TAC[MEASURABLE_COMPACT; COMPACT_EQ_BOUNDED_CLOSED; CLOSED_CLOSURE;
  2.1214 -           BOUNDED_CLOSURE]);; *)
  2.1215 -
  2.1216 -lemma gmeasurable_interior: True .. (*
  2.1217 - "!s. bounded s ==> gmeasurable(interior s)"
  2.1218 -qed   SIMP_TAC[MEASURABLE_OPEN; OPEN_INTERIOR; BOUNDED_INTERIOR]);; *)
  2.1219 -
  2.1220 -lemma gmeasurable_frontier: True .. (*
  2.1221 - "!s:real^N->bool. bounded s ==> gmeasurable(frontier s)"
  2.1222 -qed   REPEAT STRIP_TAC THEN REWRITE_TAC[frontier] THEN
  2.1223 -  MATCH_MP_TAC GMEASURABLE_DIFF THEN
  2.1224 -  ASM_SIMP_TAC[MEASURABLE_CLOSURE; GMEASURABLE_INTERIOR] THEN
  2.1225 -  MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `s:real^N->bool` THEN
  2.1226 -  REWRITE_TAC[INTERIOR_SUBSET; CLOSURE_SUBSET]);; *)
  2.1227 -
  2.1228 -lemma measure_frontier: True .. (*
  2.1229 - "!s:real^N->bool.
  2.1230 -        bounded s
  2.1231 -        ==> measure(frontier s) = measure(closure s) - measure(interior s)"
  2.1232 -qed   REPEAT STRIP_TAC THEN REWRITE_TAC[frontier] THEN
  2.1233 -  MATCH_MP_TAC MEASURE_DIFF_SUBSET THEN
  2.1234 -  ASM_SIMP_TAC[MEASURABLE_CLOSURE; GMEASURABLE_INTERIOR] THEN
  2.1235 -  MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `s:real^N->bool` THEN
  2.1236 -  REWRITE_TAC[INTERIOR_SUBSET; CLOSURE_SUBSET]);; *)
  2.1237 -
  2.1238 -lemma gmeasurable_jordan: True .. (*
  2.1239 - "!s:real^N->bool. bounded s \<and> negligible(frontier s) ==> gmeasurable s"
  2.1240 -qed   REPEAT STRIP_TAC THEN ONCE_REWRITE_TAC[MEASURABLE_INNER_OUTER] THEN
  2.1241 -  GEN_TAC THEN DISCH_TAC THEN
  2.1242 -  EXISTS_TAC `interior(s):real^N->bool` THEN
  2.1243 -  EXISTS_TAC `closure(s):real^N->bool` THEN
  2.1244 -  ASM_SIMP_TAC[MEASURABLE_INTERIOR; GMEASURABLE_CLOSURE] THEN
  2.1245 -  REWRITE_TAC[INTERIOR_SUBSET; CLOSURE_SUBSET] THEN
  2.1246 -  ONCE_REWRITE_TAC[REAL_ABS_SUB] THEN
  2.1247 -  ASM_SIMP_TAC[GSYM MEASURE_FRONTIER; REAL_ABS_NUM; MEASURE_EQ_0]);; *)
  2.1248 -
  2.1249 -lemma has_gmeasure_elementary: True .. (*
  2.1250 - "!d s. d division_of s ==> s has_gmeasure (sum d content)"
  2.1251 -qed   REPEAT STRIP_TAC THEN REWRITE_TAC[has_gmeasure] THEN
  2.1252 -  FIRST_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_FINITE) THEN
  2.1253 -  ASM_SIMP_TAC[LIFT_SUM] THEN
  2.1254 -  MATCH_MP_TAC HAS_INTEGRAL_COMBINE_DIVISION THEN
  2.1255 -  ASM_REWRITE_TAC[o_THM] THEN REWRITE_TAC[GSYM has_gmeasure] THEN
  2.1256 -  ASM_MESON_TAC[HAS_GMEASURE_INTERVAL; division_of]);; *)
  2.1257 -
  2.1258 -lemma gmeasurable_elementary: True .. (*
  2.1259 - "!d s. d division_of s ==> gmeasurable s"
  2.1260 -qed   REWRITE_TAC[measurable] THEN MESON_TAC[HAS_GMEASURE_ELEMENTARY]);; *)
  2.1261 -
  2.1262 -lemma measure_elementary: True .. (*
  2.1263 - "!d s. d division_of s ==> gmeasure s = sum d content"
  2.1264 -qed   MESON_TAC[HAS_GMEASURE_ELEMENTARY; MEASURE_UNIQUE]);; *)
  2.1265 -
  2.1266 -lemma gmeasurable_inter_interval: True .. (*
  2.1267 - "!s a b:real^N. gmeasurable s ==> gmeasurable (s \<inter> {a..b})"
  2.1268 -qed   SIMP_TAC[MEASURABLE_INTER; GMEASURABLE_INTERVAL]);; *)
  2.1269 -
  2.1270 -(* ------------------------------------------------------------------------- *)
  2.1271 -(* A nice lemma for negligibility proofs.                                    *)
  2.1272 -(* ------------------------------------------------------------------------- *)
  2.1273 -
  2.1274 -lemma STARLIKE_NEGLIGIBLE_BOUNDED_MEASURABLE: True .. (*
  2.1275 - "!s. gmeasurable s \<and> bounded s \<and>
  2.1276 -       (!c x:real^N. 0 \<le> c \<and> x \<in> s \<and> (c % x) \<in> s ==> c = 1)
  2.1277 -       ==> negligible s"
  2.1278 -qed   REPEAT STRIP_TAC THEN
  2.1279 -  SUBGOAL_THEN `~(0 < measure(s:real^N->bool))`
  2.1280 -   (fun th -> ASM_MESON_TAC[th; GMEASURABLE_MEASURE_POS_LT]) THEN
  2.1281 -  DISCH_TAC THEN
  2.1282 -  MP_TAC(SPEC `(0:real^N) INSERT s`
  2.1283 -      BOUNDED_SUBSET_CLOSED_INTERVAL_SYMMETRIC) THEN
  2.1284 -  ASM_SIMP_TAC[BOUNDED_INSERT; COMPACT_IMP_BOUNDED; NOT_EXISTS_THM] THEN
  2.1285 -  X_GEN_TAC `a:real^N` THEN REWRITE_TAC[INSERT_SUBSET] THEN STRIP_TAC THEN
  2.1286 -  SUBGOAL_THEN
  2.1287 -   `?N. EVEN N \<and> 0 < N \<and>
  2.1288 -        measure(interval[--a:real^N,a])
  2.1289 -         < (N * measure(s:real^N->bool)) / 4 pow dimindex (:N)`
  2.1290 -  STRIP_ASSUME_TAC THENL
  2.1291 -   [FIRST_ASSUM(MP_TAC o SPEC
  2.1292 -     `measure(interval[--a:real^N,a]) * 4 pow (dimindex(:N))` o
  2.1293 -     MATCH_MP REAL_ARCH) THEN
  2.1294 -    SIMP_TAC[REAL_LT_RDIV_EQ; REAL_POW_LT; REAL_OF_NUM_LT; ARITH] THEN
  2.1295 -    SIMP_TAC[GSYM REAL_LT_LDIV_EQ; ASSUME `0 < measure(s:real^N->bool)`] THEN
  2.1296 -    DISCH_THEN(X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC) THEN
  2.1297 -    EXISTS_TAC `2 * (N DIV 2 + 1)` THEN REWRITE_TAC[EVEN_MULT; ARITH] THEN
  2.1298 -    CONJ_TAC THENL [ARITH_TAC; ALL_TAC] THEN
  2.1299 -    FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
  2.1300 -     `x < a ==> a \<le> b ==> x < b`)) THEN
  2.1301 -    REWRITE_TAC[REAL_OF_NUM_LE] THEN ARITH_TAC;
  2.1302 -    ALL_TAC] THEN
  2.1303 -  MP_TAC(ISPECL [`\<Union>(IMAGE (\<lambda>m. IMAGE (\<lambda>x:real^N. (m / N) % x) s)
  2.1304 -                                (1..N))`;
  2.1305 -                  `interval[--a:real^N,a]`] MEASURE_SUBSET) THEN
  2.1306 -  MP_TAC(ISPECL [`measure:(real^N->bool)->real`;
  2.1307 -                 `IMAGE (\<lambda>m. IMAGE (\<lambda>x:real^N. (m / N) % x) s) (1..N)`]
  2.1308 -                HAS_GMEASURE_DISJOINT_UNIONS) THEN
  2.1309 -  SIMP_TAC[FINITE_IMAGE; FINITE_NUMSEG; IMP_CONJ] THEN
  2.1310 -  REWRITE_TAC[RIGHT_FORALL_IMP_THM; FORALL_IN_IMAGE] THEN ANTS_TAC THENL
  2.1311 -   [REPEAT STRIP_TAC THEN REWRITE_TAC[GSYM HAS_GMEASURE_MEASURE] THEN
  2.1312 -    MATCH_MP_TAC GMEASURABLE_SCALING THEN ASM_REWRITE_TAC[];
  2.1313 -    ALL_TAC] THEN
  2.1314 -  REWRITE_TAC[RIGHT_IMP_FORALL_THM; IMP_IMP] THEN
  2.1315 -  ONCE_REWRITE_TAC[TAUT `(a \<and> b) \<and> ~c ==> d \<longleftrightarrow> a \<and> b \<and> ~d ==> c`] THEN
  2.1316 -  SUBGOAL_THEN
  2.1317 -   `!m n. m \<in> 1..N \<and> n \<in> 1..N \<and>
  2.1318 -          ~(DISJOINT (IMAGE (\<lambda>x:real^N. m / N % x) s)
  2.1319 -                     (IMAGE (\<lambda>x. n / N % x) s))
  2.1320 -          ==> m = n`
  2.1321 -  ASSUME_TAC THENL
  2.1322 -   [MAP_EVERY X_GEN_TAC [`m:num`; `n:num`] THEN
  2.1323 -    REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
  2.1324 -    REWRITE_TAC[DISJOINT; GSYM MEMBER_NOT_EMPTY] THEN
  2.1325 -    REWRITE_TAC[EXISTS_IN_IMAGE; IN_INTER] THEN
  2.1326 -    DISCH_THEN(X_CHOOSE_THEN `x:real^N`
  2.1327 -     (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
  2.1328 -    REWRITE_TAC[IN_IMAGE] THEN
  2.1329 -    DISCH_THEN(X_CHOOSE_THEN `y:real^N`
  2.1330 -     (CONJUNCTS_THEN2 MP_TAC ASSUME_TAC)) THEN
  2.1331 -    DISCH_THEN(MP_TAC o AP_TERM `(%) (N / m) :real^N->real^N`) THEN
  2.1332 -    SUBGOAL_THEN `~(N = 0) \<and> ~(m = 0)` STRIP_ASSUME_TAC THENL
  2.1333 -     [REWRITE_TAC[REAL_OF_NUM_EQ] THEN
  2.1334 -      REPEAT(FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_NUMSEG])) THEN
  2.1335 -      ARITH_TAC;
  2.1336 -      ALL_TAC] THEN
  2.1337 -    FIRST_X_ASSUM(ASSUME_TAC o GEN_REWRITE_RULE (BINDER_CONV o BINDER_CONV)
  2.1338 -     [GSYM CONTRAPOS_THM]) THEN
  2.1339 -    ASM_SIMP_TAC[VECTOR_MUL_ASSOC; REAL_FIELD
  2.1340 -     `~(x = 0) \<and> ~(y = 0) ==> x / y * y / x = 1`] THEN
  2.1341 -    ASM_SIMP_TAC[REAL_FIELD
  2.1342 -     `~(x = 0) \<and> ~(y = 0) ==> x / y * z / x = z / y`] THEN
  2.1343 -    REWRITE_TAC[VECTOR_MUL_LID] THEN DISCH_THEN SUBST_ALL_TAC THEN
  2.1344 -    FIRST_X_ASSUM(MP_TAC o SPECL [`n / m`; `y:real^N`]) THEN
  2.1345 -    ASM_SIMP_TAC[REAL_LE_DIV; REAL_POS; REAL_FIELD
  2.1346 -     `~(y = 0) ==> (x / y = 1 \<longleftrightarrow> x = y)`] THEN
  2.1347 -    REWRITE_TAC[REAL_OF_NUM_EQ; EQ_SYM_EQ];
  2.1348 -    ALL_TAC] THEN
  2.1349 -  ANTS_TAC THENL [ASM_MESON_TAC[]; DISCH_TAC] THEN
  2.1350 -  REWRITE_TAC[NOT_IMP] THEN REPEAT CONJ_TAC THENL
  2.1351 -   [REWRITE_TAC[measurable] THEN ASM_MESON_TAC[];
  2.1352 -    REWRITE_TAC[MEASURABLE_INTERVAL];
  2.1353 -    REWRITE_TAC[UNIONS_SUBSET; FORALL_IN_IMAGE] THEN
  2.1354 -    REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN
  2.1355 -    X_GEN_TAC `n:num` THEN DISCH_TAC THEN X_GEN_TAC `x:real^N` THEN
  2.1356 -    DISCH_TAC THEN
  2.1357 -    MP_TAC(ISPECL [`--a:real^N`; `a:real^N`] CONVEX_INTERVAL) THEN
  2.1358 -    DISCH_THEN(MP_TAC o REWRITE_RULE[CONVEX_ALT] o CONJUNCT1) THEN
  2.1359 -    DISCH_THEN(MP_TAC o SPECL [`0:real^N`; `x:real^N`; `n / N`]) THEN
  2.1360 -    ASM_REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_ADD_LID] THEN
  2.1361 -    DISCH_THEN MATCH_MP_TAC THEN SIMP_TAC[REAL_LE_DIV; REAL_POS] THEN
  2.1362 -    CONJ_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
  2.1363 -    FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_NUMSEG]) THEN
  2.1364 -    DISCH_THEN(MP_TAC o MATCH_MP (ARITH_RULE
  2.1365 -     `1 \<le> n \<and> n \<le> N ==> 0 < N \<and> n \<le> N`)) THEN
  2.1366 -    SIMP_TAC[GSYM REAL_OF_NUM_LE; GSYM REAL_OF_NUM_LT; REAL_LE_LDIV_EQ] THEN
  2.1367 -    SIMP_TAC[REAL_MUL_LID];
  2.1368 -    ALL_TAC] THEN
  2.1369 -  FIRST_X_ASSUM(SUBST1_TAC o MATCH_MP MEASURE_UNIQUE) THEN
  2.1370 -  ASM_SIMP_TAC[MEASURE_SCALING; REAL_NOT_LE] THEN
  2.1371 -  FIRST_X_ASSUM(K ALL_TAC o SPEC `0`) THEN
  2.1372 -  MATCH_MP_TAC REAL_LTE_TRANS THEN EXISTS_TAC
  2.1373 -   `sum (1..N) (measure o (\<lambda>m. IMAGE (\<lambda>x:real^N. m / N % x) s))` THEN
  2.1374 -  CONJ_TAC THENL
  2.1375 -   [ALL_TAC;
  2.1376 -    MATCH_MP_TAC REAL_EQ_IMP_LE THEN CONV_TAC SYM_CONV THEN
  2.1377 -    MATCH_MP_TAC SUM_IMAGE THEN REWRITE_TAC[] THEN
  2.1378 -    REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
  2.1379 -    ASM_REWRITE_TAC[SET_RULE `DISJOINT s s \<longleftrightarrow> s = {}`; IMAGE_EQ_EMPTY] THEN
  2.1380 -    DISCH_THEN SUBST_ALL_TAC THEN
  2.1381 -    ASM_MESON_TAC[REAL_LT_REFL; MEASURE_EMPTY]] THEN
  2.1382 -  FIRST_X_ASSUM(K ALL_TAC o SPEC `0`) THEN
  2.1383 -  ASM_SIMP_TAC[o_DEF; MEASURE_SCALING; SUM_RMUL] THEN
  2.1384 -  FIRST_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
  2.1385 -   `x < a ==> a \<le> b ==> x < b`)) THEN
  2.1386 -  ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_POW_LT; REAL_OF_NUM_LT; ARITH] THEN
  2.1387 -  ONCE_REWRITE_TAC[REAL_ARITH `(a * b) * c:real = (a * c) * b`] THEN
  2.1388 -  ASM_SIMP_TAC[REAL_LE_RMUL_EQ] THEN REWRITE_TAC[GSYM SUM_RMUL] THEN
  2.1389 -  REWRITE_TAC[GSYM REAL_POW_MUL] THEN
  2.1390 -  REWRITE_TAC[REAL_ABS_DIV; REAL_ABS_NUM] THEN
  2.1391 -  FIRST_X_ASSUM(X_CHOOSE_THEN `M:num` SUBST_ALL_TAC o
  2.1392 -        GEN_REWRITE_RULE I [EVEN_EXISTS]) THEN
  2.1393 -  REWRITE_TAC[GSYM REAL_OF_NUM_MUL] THEN
  2.1394 -  RULE_ASSUM_TAC(REWRITE_RULE[GSYM REAL_OF_NUM_MUL]) THEN
  2.1395 -  RULE_ASSUM_TAC(REWRITE_RULE[REAL_ARITH `0 < 2 * x \<longleftrightarrow> 0 < x`]) THEN
  2.1396 -  ASM_SIMP_TAC[REAL_FIELD `0 < y ==> x / (2 * y) * 4 = x * 2 / y`] THEN
  2.1397 -  MATCH_MP_TAC REAL_LE_TRANS THEN
  2.1398 -  EXISTS_TAC `sum(M..(2*M)) (\<lambda>i. (i * 2 / M) pow dimindex (:N))` THEN
  2.1399 -  CONJ_TAC THENL
  2.1400 -   [ALL_TAC;
  2.1401 -    MATCH_MP_TAC SUM_SUBSET_SIMPLE THEN
  2.1402 -    SIMP_TAC[REAL_POW_LE; REAL_LE_MUL; REAL_LE_DIV; REAL_POS] THEN
  2.1403 -    REWRITE_TAC[IN_NUMSEG; FINITE_NUMSEG; SUBSET] THEN
  2.1404 -    FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [REAL_OF_NUM_LT]) THEN
  2.1405 -    ARITH_TAC] THEN
  2.1406 -  MATCH_MP_TAC REAL_LE_TRANS THEN
  2.1407 -  EXISTS_TAC `sum(M..(2*M)) (\<lambda>i. 2)` THEN CONJ_TAC THENL
  2.1408 -   [REWRITE_TAC[SUM_CONST_NUMSEG] THEN
  2.1409 -    REWRITE_TAC[ARITH_RULE `(2 * M + 1) - M = M + 1`] THEN
  2.1410 -    REWRITE_TAC[GSYM REAL_OF_NUM_ADD] THEN REAL_ARITH_TAC;
  2.1411 -    ALL_TAC] THEN
  2.1412 -  MATCH_MP_TAC SUM_LE THEN REWRITE_TAC[FINITE_NUMSEG; IN_NUMSEG] THEN
  2.1413 -  X_GEN_TAC `n:num` THEN STRIP_TAC THEN
  2.1414 -  MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `2 pow (dimindex(:N))` THEN
  2.1415 -  CONJ_TAC THENL
  2.1416 -   [GEN_REWRITE_TAC LAND_CONV [GSYM REAL_POW_1] THEN
  2.1417 -    MATCH_MP_TAC REAL_POW_MONO THEN REWRITE_TAC[DIMINDEX_GE_1] THEN
  2.1418 -    ARITH_TAC;
  2.1419 -    ALL_TAC] THEN
  2.1420 -  MATCH_MP_TAC REAL_POW_LE2 THEN
  2.1421 -  REWRITE_TAC[REAL_POS; ARITH; real_div; REAL_MUL_ASSOC] THEN
  2.1422 -  ASM_SIMP_TAC[GSYM real_div; REAL_LE_RDIV_EQ] THEN
  2.1423 -  REWRITE_TAC[REAL_OF_NUM_MUL; REAL_OF_NUM_LE] THEN
  2.1424 -  UNDISCH_TAC `M:num \<le> n` THEN ARITH_TAC);; *)
  2.1425 -
  2.1426 -lemma STARLIKE_NEGLIGIBLE_LEMMA: True .. (*
  2.1427 - "!s. compact s \<and>
  2.1428 -       (!c x:real^N. 0 \<le> c \<and> x \<in> s \<and> (c % x) \<in> s ==> c = 1)
  2.1429 -       ==> negligible s"
  2.1430 -qed   REPEAT STRIP_TAC THEN
  2.1431 -  MATCH_MP_TAC STARLIKE_NEGLIGIBLE_BOUNDED_MEASURABLE THEN
  2.1432 -  ASM_MESON_TAC[MEASURABLE_COMPACT; COMPACT_IMP_BOUNDED]);; *)
  2.1433 -
  2.1434 -lemma STARLIKE_NEGLIGIBLE: True .. (*
  2.1435 - "!s a. closed s \<and>
  2.1436 -         (!c x:real^N. 0 \<le> c \<and> (a + x) \<in> s \<and> (a + c % x) \<in> s ==> c = 1)
  2.1437 -         ==> negligible s"
  2.1438 -qed   REPEAT STRIP_TAC THEN MATCH_MP_TAC NEGLIGIBLE_TRANSLATION_REV THEN
  2.1439 -  EXISTS_TAC `--a:real^N` THEN ONCE_REWRITE_TAC[NEGLIGIBLE_ON_INTERVALS] THEN
  2.1440 -  MAP_EVERY X_GEN_TAC [`u:real^N`; `v:real^N`] THEN
  2.1441 -  MATCH_MP_TAC STARLIKE_NEGLIGIBLE_LEMMA THEN CONJ_TAC THENL
  2.1442 -   [MATCH_MP_TAC CLOSED_INTER_COMPACT THEN REWRITE_TAC[COMPACT_INTERVAL] THEN
  2.1443 -    ASM_SIMP_TAC[CLOSED_TRANSLATION];
  2.1444 -    REWRITE_TAC[IN_IMAGE; IN_INTER] THEN
  2.1445 -    ONCE_REWRITE_TAC[VECTOR_ARITH `x:real^N = --a + y \<longleftrightarrow> y = a + x`] THEN
  2.1446 -    REWRITE_TAC[UNWIND_THM2] THEN ASM MESON_TAC[]]);; *)
  2.1447 -
  2.1448 -lemma STARLIKE_NEGLIGIBLE_STRONG: True .. (*
  2.1449 - "!s a. closed s \<and>
  2.1450 -         (!c x:real^N. 0 \<le> c \<and> c < 1 \<and> (a + x) \<in> s
  2.1451 -                       ==> ~((a + c % x) \<in> s))
  2.1452 -         ==> negligible s"
  2.1453 -qed   REPEAT GEN_TAC THEN STRIP_TAC THEN MATCH_MP_TAC STARLIKE_NEGLIGIBLE THEN
  2.1454 -  EXISTS_TAC `a:real^N` THEN ASM_REWRITE_TAC[] THEN
  2.1455 -  MAP_EVERY X_GEN_TAC [`c:real`; `x:real^N`] THEN STRIP_TAC THEN
  2.1456 -  MATCH_MP_TAC(REAL_ARITH `~(x < y) \<and> ~(y < x) ==> x = y`) THEN
  2.1457 -  STRIP_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN DISCH_TAC THEN
  2.1458 -  FIRST_X_ASSUM(MP_TAC o SPECL [`inv c`; `c % x:real^N`]) THEN
  2.1459 -  ASM_REWRITE_TAC[REAL_LE_INV_EQ; VECTOR_MUL_ASSOC] THEN
  2.1460 -  ASM_SIMP_TAC[REAL_MUL_LINV; REAL_ARITH `1 < c ==> ~(c = 0)`] THEN
  2.1461 -  ASM_REWRITE_TAC[VECTOR_MUL_LID] THEN
  2.1462 -  GEN_REWRITE_TAC RAND_CONV [GSYM REAL_INV_1] THEN
  2.1463 -  MATCH_MP_TAC REAL_LT_INV2 THEN ASM_REWRITE_TAC[REAL_LT_01]);; *)
  2.1464 -
  2.1465 -(* ------------------------------------------------------------------------- *)
  2.1466 -(* In particular.                                                            *)
  2.1467 -(* ------------------------------------------------------------------------- *)
  2.1468 -
  2.1469 -lemma NEGLIGIBLE_HYPERPLANE: True .. (*
  2.1470 - "!a b. ~(a = 0 \<and> b = 0) ==> negligible {x:real^N | a dot x = b}"
  2.1471 -qed   REPEAT GEN_TAC THEN ASM_CASES_TAC `a:real^N = 0` THEN
  2.1472 -  ASM_SIMP_TAC[DOT_LZERO; SET_RULE `{x | F} = {}`; NEGLIGIBLE_EMPTY] THEN
  2.1473 -  MATCH_MP_TAC STARLIKE_NEGLIGIBLE THEN
  2.1474 -  SUBGOAL_THEN `?x:real^N. ~(a dot x = b)` MP_TAC THENL
  2.1475 -   [MATCH_MP_TAC(MESON[] `!a:real^N. P a \/ P(--a) ==> ?x. P x`) THEN
  2.1476 -    EXISTS_TAC `a:real^N` THEN REWRITE_TAC[DOT_RNEG] THEN
  2.1477 -    MATCH_MP_TAC(REAL_ARITH `~(a = 0) ==> ~(a = b) \/ ~(--a = b)`) THEN
  2.1478 -    ASM_REWRITE_TAC[DOT_EQ_0];
  2.1479 -    ALL_TAC] THEN
  2.1480 -  MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `c:real^N` THEN DISCH_TAC THEN
  2.1481 -  REWRITE_TAC[CLOSED_HYPERPLANE; IN_ELIM_THM; DOT_RADD; DOT_RMUL] THEN
  2.1482 -  MAP_EVERY X_GEN_TAC [`t:real`; `y:real^N`] THEN
  2.1483 -  DISCH_THEN(MP_TAC o MATCH_MP (REAL_ARITH
  2.1484 -   `0 \<le> t \<and> ac + ay = b \<and> ac + t * ay = b
  2.1485 -    ==> ((ay = 0 ==> ac = b) \<and> (t - 1) * ay = 0)`)) THEN
  2.1486 -  ASM_SIMP_TAC[REAL_ENTIRE; REAL_SUB_0] THEN CONV_TAC TAUT);; *)
  2.1487 -
  2.1488 -lemma NEGLIGIBLE_LOWDIM: True .. (*
  2.1489 - "!s:real^N->bool. dim(s) < dimindex(:N) ==> negligible s"
  2.1490 -qed   GEN_TAC THEN DISCH_THEN(MP_TAC o MATCH_MP LOWDIM_SUBSET_HYPERPLANE) THEN
  2.1491 -  DISCH_THEN(X_CHOOSE_THEN `a:real^N` STRIP_ASSUME_TAC) THEN
  2.1492 -  MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
  2.1493 -  EXISTS_TAC `span(s):real^N->bool` THEN REWRITE_TAC[SPAN_INC] THEN
  2.1494 -  MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
  2.1495 -  EXISTS_TAC `{x:real^N | a dot x = 0}` THEN
  2.1496 -  ASM_SIMP_TAC[NEGLIGIBLE_HYPERPLANE]);; *)
  2.1497 -
  2.1498 -(* ------------------------------------------------------------------------- *)
  2.1499 -(* Measurability of bounded convex sets.                                     *)
  2.1500 -(* ------------------------------------------------------------------------- *)
  2.1501 -
  2.1502 -lemma NEGLIGIBLE_CONVEX_FRONTIER: True .. (*
  2.1503 - "!s:real^N->bool. convex s ==> negligible(frontier s)"
  2.1504 -qed   SUBGOAL_THEN
  2.1505 -   `!s:real^N->bool. convex s \<and> (0) \<in> s ==> negligible(frontier s)`
  2.1506 -  ASSUME_TAC THENL
  2.1507 -   [ALL_TAC;
  2.1508 -    X_GEN_TAC `s:real^N->bool` THEN DISCH_TAC THEN
  2.1509 -    ASM_CASES_TAC `s:real^N->bool = {}` THEN
  2.1510 -    ASM_REWRITE_TAC[FRONTIER_EMPTY; NEGLIGIBLE_EMPTY] THEN
  2.1511 -    FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM MEMBER_NOT_EMPTY]) THEN
  2.1512 -    DISCH_THEN(X_CHOOSE_TAC `a:real^N`) THEN
  2.1513 -    FIRST_X_ASSUM(MP_TAC o SPEC `IMAGE (\<lambda>x:real^N. --a + x) s`) THEN
  2.1514 -    ASM_SIMP_TAC[CONVEX_TRANSLATION; IN_IMAGE] THEN
  2.1515 -    ASM_REWRITE_TAC[UNWIND_THM2;
  2.1516 -                    VECTOR_ARITH `0:real^N = --a + x \<longleftrightarrow> x = a`] THEN
  2.1517 -    REWRITE_TAC[FRONTIER_TRANSLATION; NEGLIGIBLE_TRANSLATION_EQ]] THEN
  2.1518 -  REPEAT STRIP_TAC THEN MP_TAC(ISPEC `s:real^N->bool` DIM_SUBSET_UNIV) THEN
  2.1519 -  REWRITE_TAC[ARITH_RULE `d:num \<le> e \<longleftrightarrow> d < e \/ d = e`] THEN STRIP_TAC THENL
  2.1520 -   [MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
  2.1521 -    EXISTS_TAC `closure s:real^N->bool` THEN
  2.1522 -    REWRITE_TAC[frontier; SUBSET_DIFF] THEN
  2.1523 -    MATCH_MP_TAC NEGLIGIBLE_LOWDIM THEN ASM_REWRITE_TAC[DIM_CLOSURE];
  2.1524 -    ALL_TAC] THEN
  2.1525 -  SUBGOAL_THEN `?a:real^N. a \<in> interior s` CHOOSE_TAC THENL
  2.1526 -   [X_CHOOSE_THEN `b:real^N->bool` STRIP_ASSUME_TAC
  2.1527 -     (ISPEC `s:real^N->bool` BASIS_EXISTS) THEN
  2.1528 -    FIRST_X_ASSUM SUBST_ALL_TAC THEN
  2.1529 -    MP_TAC(ISPEC `b:real^N->bool` INTERIOR_SIMPLEX_NONEMPTY) THEN
  2.1530 -    ASM_REWRITE_TAC[] THEN
  2.1531 -    MATCH_MP_TAC MONO_EXISTS THEN REWRITE_TAC[GSYM SUBSET] THEN
  2.1532 -    MATCH_MP_TAC SUBSET_INTERIOR THEN MATCH_MP_TAC HULL_MINIMAL THEN
  2.1533 -    ASM_REWRITE_TAC[INSERT_SUBSET];
  2.1534 -    ALL_TAC] THEN
  2.1535 -  MATCH_MP_TAC STARLIKE_NEGLIGIBLE_STRONG THEN
  2.1536 -  EXISTS_TAC `a:real^N` THEN REWRITE_TAC[FRONTIER_CLOSED] THEN
  2.1537 -  REPEAT GEN_TAC THEN STRIP_TAC THEN
  2.1538 -  REWRITE_TAC[frontier; IN_DIFF; DE_MORGAN_THM] THEN DISJ2_TAC THEN
  2.1539 -  SIMP_TAC[VECTOR_ARITH
  2.1540 -   `a + c % x:real^N = (a + x) - (1 - c) % ((a + x) - a)`] THEN
  2.1541 -  MATCH_MP_TAC IN_INTERIOR_CLOSURE_CONVEX_SHRINK THEN
  2.1542 -  RULE_ASSUM_TAC(REWRITE_RULE[frontier; IN_DIFF]) THEN
  2.1543 -  ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC);; *)
  2.1544 -
  2.1545 -lemma GMEASURABLE_CONVEX: True .. (*
  2.1546 - "!s:real^N->bool. convex s \<and> bounded s ==> gmeasurable s"
  2.1547 -qed   REPEAT STRIP_TAC THEN MATCH_MP_TAC GMEASURABLE_JORDAN THEN
  2.1548 -  ASM_SIMP_TAC[NEGLIGIBLE_CONVEX_FRONTIER]);; *)
  2.1549 -
  2.1550 -(* ------------------------------------------------------------------------- *)
  2.1551 -(* Various special cases.                                                    *)
  2.1552 -(* ------------------------------------------------------------------------- *)
  2.1553 -
  2.1554 -lemma NEGLIGIBLE_SPHERE: True .. (*
  2.1555 - "!a r. negligible {x:real^N | dist(a,x) = r}"
  2.1556 -qed   REWRITE_TAC[GSYM FRONTIER_CBALL] THEN
  2.1557 -  SIMP_TAC[NEGLIGIBLE_CONVEX_FRONTIER; CONVEX_CBALL]);; *)
  2.1558 -
  2.1559 -lemma GMEASURABLE_BALL: True .. (*
  2.1560 - "!a r. gmeasurable(ball(a,r))"
  2.1561 -qed   SIMP_TAC[MEASURABLE_OPEN; BOUNDED_BALL; OPEN_BALL]);; *)
  2.1562 -
  2.1563 -lemma GMEASURABLE_CBALL: True .. (*
  2.1564 - "!a r. gmeasurable(cball(a,r))"
  2.1565 -qed   SIMP_TAC[MEASURABLE_COMPACT; COMPACT_CBALL]);; *)
  2.1566 -
  2.1567 -(* ------------------------------------------------------------------------- *)
  2.1568 -(* Negligibility of image under non-injective linear map.                    *)
  2.1569 -(* ------------------------------------------------------------------------- *)
  2.1570 -
  2.1571 -lemma NEGLIGIBLE_LINEAR_SINGULAR_IMAGE: True .. (*
  2.1572 - "!f:real^N->real^N s.
  2.1573 -        linear f \<and> ~(!x y. f(x) = f(y) ==> x = y)
  2.1574 -        ==> negligible(IMAGE f s)"
  2.1575 -qed   REPEAT GEN_TAC THEN
  2.1576 -  DISCH_THEN(MP_TAC o MATCH_MP LINEAR_SINGULAR_IMAGE_HYPERPLANE) THEN
  2.1577 -  DISCH_THEN(X_CHOOSE_THEN `a:real^N` STRIP_ASSUME_TAC) THEN
  2.1578 -  MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
  2.1579 -  EXISTS_TAC `{x:real^N | a dot x = 0}` THEN
  2.1580 -  ASM_SIMP_TAC[NEGLIGIBLE_HYPERPLANE]);; *)
  2.1581 -
  2.1582 -(* ------------------------------------------------------------------------- *)
  2.1583 -(* Approximation of gmeasurable set by union of intervals.                    *)
  2.1584 -(* ------------------------------------------------------------------------- *)
  2.1585 -
  2.1586 -lemma COVERING_LEMMA: True .. (*
  2.1587 - "!a b:real^N s g.
  2.1588 -        s \<subseteq> {a..b} \<and> ~({a<..<b} = {}) \<and> gauge g
  2.1589 -        ==> ?d. COUNTABLE d \<and>
  2.1590 -                (!k. k \<in> d ==> k \<subseteq> {a..b} \<and> ~(k = {}) \<and>
  2.1591 -                                (\<exists>c d. k = {c..d})) \<and>
  2.1592 -                (!k1 k2. k1 \<in> d \<and> k2 \<in> d \<and> ~(k1 = k2)
  2.1593 -                         ==> interior k1 \<inter> interior k2 = {}) \<and>
  2.1594 -                (!k. k \<in> d ==> ?x. x \<in> (s \<inter> k) \<and> k \<subseteq> g(x)) \<and>
  2.1595 -                s \<subseteq> \<Union>d"
  2.1596 -qed   REPEAT STRIP_TAC THEN
  2.1597 -  SUBGOAL_THEN
  2.1598 -   `?d. COUNTABLE d \<and>
  2.1599 -        (!k. k \<in> d ==> k \<subseteq> {a..b} \<and> ~(k = {}) \<and>
  2.1600 -                        (\<exists>c d:real^N. k = {c..d})) \<and>
  2.1601 -        (!k1 k2. k1 \<in> d \<and> k2 \<in> d
  2.1602 -                 ==> k1 \<subseteq> k2 \/ k2 \<subseteq> k1 \/
  2.1603 -                     interior k1 \<inter> interior k2 = {}) \<and>
  2.1604 -        (!x. x \<in> s ==> ?k. k \<in> d \<and> x \<in> k \<and> k \<subseteq> g(x)) \<and>
  2.1605 -        (!k. k \<in> d ==> FINITE {l | l \<in> d \<and> k \<subseteq> l})`
  2.1606 -  ASSUME_TAC THENL
  2.1607 -   [EXISTS_TAC
  2.1608 -     `IMAGE (\<lambda>(n,v).
  2.1609 -             interval[(lambda i. a$i + (v$i) / 2 pow n *
  2.1610 -                                       ((b:real^N)$i - (a:real^N)$i)):real^N,
  2.1611 -                      (lambda i. a$i + ((v$i) + 1) / 2 pow n * (b$i - a$i))])
  2.1612 -            {n,v | n \<in> (:num) \<and>
  2.1613 -                   v \<in> {v:num^N | !i. 1 \<le> i \<and> i \<le> dimindex(:N)
  2.1614 -                                       ==> v$i < 2 EXP n}}` THEN
  2.1615 -    CONJ_TAC THENL
  2.1616 -     [MATCH_MP_TAC COUNTABLE_IMAGE THEN
  2.1617 -      MATCH_MP_TAC COUNTABLE_PRODUCT_DEPENDENT THEN
  2.1618 -      REWRITE_TAC[NUM_COUNTABLE; IN_UNIV] THEN
  2.1619 -      GEN_TAC THEN MATCH_MP_TAC FINITE_IMP_COUNTABLE THEN
  2.1620 -      MATCH_MP_TAC FINITE_CART THEN REWRITE_TAC[FINITE_NUMSEG_LT];
  2.1621 -      ALL_TAC] THEN
  2.1622 -    CONJ_TAC THENL
  2.1623 -     [REWRITE_TAC[FORALL_IN_IMAGE; FORALL_PAIR_THM] THEN
  2.1624 -      MAP_EVERY X_GEN_TAC [`n:num`; `v:num^N`] THEN
  2.1625 -      REWRITE_TAC[IN_ELIM_PAIR_THM] THEN
  2.1626 -      REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN DISCH_TAC THEN
  2.1627 -      REWRITE_TAC[CONJ_ASSOC] THEN CONJ_TAC THENL [ALL_TAC; MESON_TAC[]] THEN
  2.1628 -      SIMP_TAC[INTERVAL_NE_EMPTY; SUBSET_INTERVAL; LAMBDA_BETA] THEN
  2.1629 -      REWRITE_TAC[REAL_LE_LADD; REAL_LE_ADDR; REAL_ARITH
  2.1630 -        `a + x * (b - a) \<le> b \<longleftrightarrow> 0 \<le> (1 - x) * (b - a)`] THEN
  2.1631 -      RULE_ASSUM_TAC(REWRITE_RULE[INTERVAL_NE_EMPTY]) THEN
  2.1632 -      REPEAT STRIP_TAC THEN
  2.1633 -      (MATCH_MP_TAC REAL_LE_MUL ORELSE MATCH_MP_TAC REAL_LE_RMUL) THEN
  2.1634 -      ASM_SIMP_TAC[REAL_SUB_LE; REAL_LE_DIV2_EQ; REAL_LT_POW2] THEN
  2.1635 -      ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_LE_RDIV_EQ; REAL_LT_POW2] THEN
  2.1636 -      REWRITE_TAC[REAL_MUL_LZERO; REAL_POS; REAL_MUL_LID; REAL_LE_ADDR] THEN
  2.1637 -      SIMP_TAC[REAL_OF_NUM_ADD; REAL_OF_NUM_POW; REAL_OF_NUM_LE] THEN
  2.1638 -      ASM_SIMP_TAC[ARITH_RULE `x + 1 \<le> y \<longleftrightarrow> x < y`; REAL_LT_IMP_LE];
  2.1639 -      ALL_TAC] THEN
  2.1640 -    CONJ_TAC THENL
  2.1641 -     [ONCE_REWRITE_TAC[IMP_CONJ] THEN
  2.1642 -      REWRITE_TAC[FORALL_IN_IMAGE; FORALL_PAIR_THM; RIGHT_FORALL_IMP_THM] THEN
  2.1643 -      REWRITE_TAC[IN_ELIM_PAIR_THM; IN_UNIV] THEN REWRITE_TAC[IN_ELIM_THM] THEN
  2.1644 -      REWRITE_TAC[RIGHT_IMP_FORALL_THM] THEN
  2.1645 -      GEN_REWRITE_TAC BINDER_CONV [SWAP_FORALL_THM] THEN
  2.1646 -      MATCH_MP_TAC WLOG_LE THEN CONJ_TAC THENL
  2.1647 -       [REPEAT GEN_TAC THEN
  2.1648 -        GEN_REWRITE_TAC RAND_CONV [SWAP_FORALL_THM] THEN
  2.1649 -        REPEAT(AP_TERM_TAC THEN ABS_TAC) THEN SET_TAC[];
  2.1650 -        ALL_TAC] THEN
  2.1651 -      MAP_EVERY X_GEN_TAC [`m:num`; `n:num`] THEN DISCH_TAC THEN
  2.1652 -      MAP_EVERY X_GEN_TAC [`v:num^N`; `w:num^N`] THEN REPEAT DISCH_TAC THEN
  2.1653 -      REWRITE_TAC[INTERIOR_CLOSED_INTERVAL; SUBSET_INTERVAL] THEN
  2.1654 -      SIMP_TAC[DISJOINT_INTERVAL; LAMBDA_BETA] THEN
  2.1655 -      MATCH_MP_TAC(TAUT `p \/ q \/ r ==> (a ==> p) \/ (b ==> q) \/ r`) THEN
  2.1656 -      ONCE_REWRITE_TAC[TAUT `a \<and> b \<and> c \<longleftrightarrow> ~(a \<and> b ==> ~c)`] THEN
  2.1657 -      RULE_ASSUM_TAC(REWRITE_RULE[INTERVAL_NE_EMPTY]) THEN
  2.1658 -      ASM_SIMP_TAC[REAL_LE_LADD; REAL_LE_RMUL_EQ; REAL_SUB_LT; LAMBDA_BETA] THEN
  2.1659 -      REWRITE_TAC[NOT_IMP; REAL_LE_LADD] THEN
  2.1660 -      ASM_SIMP_TAC[REAL_LE_DIV2_EQ; REAL_LT_POW2] THEN
  2.1661 -      REWRITE_TAC[REAL_ARITH `~(x + 1 \<le> x)`] THEN DISJ2_TAC THEN
  2.1662 -      MATCH_MP_TAC(MESON[]
  2.1663 -       `(!i. ~P i ==> Q i) ==> (!i. Q i) \/ (\<exists>i. P i)`) THEN
  2.1664 -      X_GEN_TAC `i:num` THEN
  2.1665 -      DISCH_THEN(fun th -> STRIP_TAC THEN MP_TAC th) THEN
  2.1666 -      ASM_REWRITE_TAC[DE_MORGAN_THM; REAL_NOT_LE] THEN
  2.1667 -      UNDISCH_TAC `m:num \<le> n` THEN REWRITE_TAC[LE_EXISTS] THEN
  2.1668 -      DISCH_THEN(X_CHOOSE_THEN `p:num` SUBST1_TAC) THEN
  2.1669 -      ONCE_REWRITE_TAC[ADD_SYM] THEN
  2.1670 -      REWRITE_TAC[REAL_POW_ADD; real_div; REAL_INV_MUL] THEN
  2.1671 -      REWRITE_TAC[REAL_MUL_ASSOC] THEN REWRITE_TAC[GSYM real_div] THEN
  2.1672 -      ASM_SIMP_TAC[REAL_LE_DIV2_EQ; REAL_LT_POW2; REAL_LT_DIV2_EQ] THEN
  2.1673 -      ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_LE_RDIV_EQ; REAL_LT_POW2;
  2.1674 -                   REAL_LT_LDIV_EQ; REAL_LT_RDIV_EQ] THEN
  2.1675 -      SIMP_TAC[REAL_LT_INTEGERS; INTEGER_CLOSED] THEN REAL_ARITH_TAC;
  2.1676 -      ALL_TAC] THEN
  2.1677 -    CONJ_TAC THENL
  2.1678 -     [X_GEN_TAC `x:real^N` THEN DISCH_TAC THEN
  2.1679 -      SUBGOAL_THEN
  2.1680 -        `?e. 0 < e \<and> !y. (!i. 1 \<le> i \<and> i \<le> dimindex(:N)
  2.1681 -                                ==> abs((x:real^N)$i - (y:real^N)$i) \<le> e)
  2.1682 -                           ==> y \<in> g(x)`
  2.1683 -      STRIP_ASSUME_TAC THENL
  2.1684 -       [FIRST_ASSUM(MP_TAC o SPEC `x:real^N` o GEN_REWRITE_RULE I [gauge]) THEN
  2.1685 -        STRIP_TAC THEN
  2.1686 -        FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
  2.1687 -        DISCH_THEN(MP_TAC o SPEC `x:real^N`) THEN ASM_REWRITE_TAC[] THEN
  2.1688 -        DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
  2.1689 -        EXISTS_TAC `e / 2 / (dimindex(:N))` THEN
  2.1690 -        ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; LE_1; DIMINDEX_GE_1;
  2.1691 -                     ARITH] THEN
  2.1692 -        X_GEN_TAC `y:real^N` THEN STRIP_TAC THEN
  2.1693 -        MATCH_MP_TAC(SET_RULE `!s. s \<subseteq> t \<and> x \<in> s ==> x \<in> t`) THEN
  2.1694 -        EXISTS_TAC `ball(x:real^N,e)` THEN ASM_REWRITE_TAC[IN_BALL] THEN
  2.1695 -        MATCH_MP_TAC(REAL_ARITH `0 < e \<and> x \<le> e / 2 ==> x < e`) THEN
  2.1696 -        ASM_REWRITE_TAC[dist] THEN MATCH_MP_TAC REAL_LE_TRANS THEN
  2.1697 -        EXISTS_TAC `sum(1..dimindex(:N)) (\<lambda>i. abs((x - y:real^N)$i))` THEN
  2.1698 -        REWRITE_TAC[NORM_LE_L1] THEN MATCH_MP_TAC SUM_BOUND_GEN THEN
  2.1699 -        ASM_SIMP_TAC[IN_NUMSEG; FINITE_NUMSEG; NUMSEG_EMPTY; NOT_LT;
  2.1700 -                     DIMINDEX_GE_1; VECTOR_SUB_COMPONENT; CARD_NUMSEG_1];
  2.1701 -        ALL_TAC] THEN
  2.1702 -      REWRITE_TAC[EXISTS_IN_IMAGE; EXISTS_PAIR_THM; IN_ELIM_PAIR_THM] THEN
  2.1703 -      MP_TAC(SPECL [`1 / 2`; `e / norm(b - a:real^N)`]
  2.1704 -        REAL_ARCH_POW_INV) THEN
  2.1705 -      SUBGOAL_THEN `0 < norm(b - a:real^N)` ASSUME_TAC THENL
  2.1706 -       [ASM_MESON_TAC[VECTOR_SUB_EQ; NORM_POS_LT; INTERVAL_SING]; ALL_TAC] THEN
  2.1707 -      CONV_TAC REAL_RAT_REDUCE_CONV THEN ASM_SIMP_TAC[REAL_LT_DIV] THEN
  2.1708 -      MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `n:num` THEN
  2.1709 -      REWRITE_TAC[real_div; REAL_MUL_LID; REAL_POW_INV] THEN DISCH_TAC THEN
  2.1710 -      SIMP_TAC[IN_ELIM_THM; IN_INTERVAL; SUBSET; LAMBDA_BETA] THEN
  2.1711 -      MATCH_MP_TAC(MESON[]
  2.1712 -       `(!x. Q x ==> R x) \<and> (\<exists>x. P x \<and> Q x) ==> ?x. P x \<and> Q x \<and> R x`) THEN
  2.1713 -      CONJ_TAC THENL
  2.1714 -       [REWRITE_TAC[RIGHT_IMP_FORALL_THM] THEN
  2.1715 -        MAP_EVERY X_GEN_TAC [`w:num^N`; `y:real^N`] THEN
  2.1716 -        REWRITE_TAC[IMP_IMP; AND_FORALL_THM] THEN
  2.1717 -        DISCH_THEN(fun th -> FIRST_X_ASSUM MATCH_MP_TAC THEN MP_TAC th) THEN
  2.1718 -        MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `i:num` THEN
  2.1719 -        DISCH_THEN(fun th -> STRIP_TAC THEN MP_TAC th) THEN
  2.1720 -        ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o MATCH_MP (REAL_ARITH
  2.1721 -         `(a + n \<le> x \<and> x \<le> a + m) \<and>
  2.1722 -          (a + n \<le> y \<and> y \<le> a + m) ==> abs(x - y) \<le> m - n`)) THEN
  2.1723 -        MATCH_MP_TAC(REAL_ARITH
  2.1724 -         `y * z \<le> e
  2.1725 -          ==> a \<le> ((x + 1) * y) * z - ((x * y) * z) ==> a \<le> e`) THEN
  2.1726 -        RULE_ASSUM_TAC(REWRITE_RULE[INTERVAL_NE_EMPTY]) THEN
  2.1727 -        ASM_SIMP_TAC[GSYM REAL_LE_RDIV_EQ; REAL_SUB_LT] THEN
  2.1728 -        FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
  2.1729 -        (REAL_ARITH `n < e * x ==> 0 \<le> e * (inv y - x) ==> n \<le> e / y`)) THEN
  2.1730 -        MATCH_MP_TAC REAL_LE_MUL THEN ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN
  2.1731 -        REWRITE_TAC[REAL_SUB_LE] THEN MATCH_MP_TAC REAL_LE_INV2 THEN
  2.1732 -        ASM_SIMP_TAC[REAL_SUB_LT] THEN
  2.1733 -        MP_TAC(SPECL [`b - a:real^N`; `i:num`] COMPONENT_LE_NORM) THEN
  2.1734 -        ASM_SIMP_TAC[VECTOR_SUB_COMPONENT] THEN REAL_ARITH_TAC;
  2.1735 -        ALL_TAC] THEN
  2.1736 -      REWRITE_TAC[IN_UNIV; AND_FORALL_THM] THEN
  2.1737 -      REWRITE_TAC[TAUT `(a ==> c) \<and> (a ==> b) \<longleftrightarrow> a ==> b \<and> c`] THEN
  2.1738 -      REWRITE_TAC[GSYM LAMBDA_SKOLEM] THEN X_GEN_TAC `i:num` THEN
  2.1739 -      STRIP_TAC THEN
  2.1740 -      SUBGOAL_THEN `(x:real^N) \<in> {a..b}` MP_TAC THENL
  2.1741 -       [ASM SET_TAC[]; ALL_TAC] THEN REWRITE_TAC[IN_INTERVAL] THEN
  2.1742 -      DISCH_THEN(MP_TAC o SPEC `i:num`) THEN ASM_REWRITE_TAC[] THEN
  2.1743 -      RULE_ASSUM_TAC(REWRITE_RULE[INTERVAL_NE_EMPTY]) THEN STRIP_TAC THEN
  2.1744 -      DISJ_CASES_TAC(MATCH_MP (REAL_ARITH `x \<le> y ==> x = y \/ x < y`)
  2.1745 -       (ASSUME `(x:real^N)$i \<le> (b:real^N)$i`))
  2.1746 -      THENL
  2.1747 -       [EXISTS_TAC `2 EXP n - 1` THEN
  2.1748 -        SIMP_TAC[GSYM REAL_OF_NUM_SUB; GSYM REAL_OF_NUM_LT;
  2.1749 -                 EXP_LT_0; LE_1; ARITH] THEN
  2.1750 -        ASM_REWRITE_TAC[REAL_SUB_ADD; REAL_ARITH `a - 1 < a`] THEN
  2.1751 -        MATCH_MP_TAC(REAL_ARITH
  2.1752 -         `1 * (b - a) = x \<and> y \<le> x ==> a + y \<le> b \<and> b \<le> a + x`) THEN
  2.1753 -        ASM_SIMP_TAC[REAL_EQ_MUL_RCANCEL; REAL_LT_IMP_NZ; REAL_LE_RMUL_EQ;
  2.1754 -                     REAL_SUB_LT; REAL_LT_INV_EQ; REAL_LT_POW2] THEN
  2.1755 -        SIMP_TAC[GSYM REAL_OF_NUM_POW; REAL_MUL_RINV; REAL_POW_EQ_0;
  2.1756 -                 REAL_OF_NUM_EQ; ARITH_EQ] THEN REAL_ARITH_TAC;
  2.1757 -        ALL_TAC] THEN
  2.1758 -      MP_TAC(SPEC `2 pow n * ((x:real^N)$i - (a:real^N)$i) /
  2.1759 -                              ((b:real^N)$i - (a:real^N)$i)` FLOOR_POS) THEN
  2.1760 -      ANTS_TAC THENL
  2.1761 -       [ASM_MESON_TAC[REAL_LE_MUL; REAL_LE_MUL; REAL_POW_LE; REAL_POS;
  2.1762 -                      REAL_SUB_LE; REAL_LT_IMP_LE; REAL_LE_DIV];
  2.1763 -        ALL_TAC] THEN
  2.1764 -      MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `m:num` THEN
  2.1765 -      REWRITE_TAC[GSYM REAL_OF_NUM_LT; GSYM REAL_OF_NUM_POW] THEN
  2.1766 -      DISCH_THEN(SUBST_ALL_TAC o SYM) THEN
  2.1767 -      REWRITE_TAC[REAL_ARITH `a + b * c \<le> x \<and> x \<le> a + b' * c \<longleftrightarrow>
  2.1768 -                              b * c \<le> x - a \<and> x - a \<le> b' * c`] THEN
  2.1769 -      ASM_SIMP_TAC[GSYM REAL_LE_LDIV_EQ; GSYM REAL_LE_RDIV_EQ;
  2.1770 -                   REAL_SUB_LT; GSYM real_div] THEN
  2.1771 -      ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
  2.1772 -      SIMP_TAC[REAL_LE_LDIV_EQ; REAL_LE_RDIV_EQ; REAL_LT_POW2] THEN
  2.1773 -      SIMP_TAC[FLOOR; REAL_LT_IMP_LE] THEN MATCH_MP_TAC REAL_LET_TRANS THEN
  2.1774 -      EXISTS_TAC `((x:real^N)$i - (a:real^N)$i) /
  2.1775 -                  ((b:real^N)$i - (a:real^N)$i) *
  2.1776 -                  2 pow n` THEN
  2.1777 -      REWRITE_TAC[FLOOR] THEN GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_LID] THEN
  2.1778 -      ASM_SIMP_TAC[REAL_LT_RMUL_EQ; REAL_LT_POW2] THEN
  2.1779 -      ASM_SIMP_TAC[REAL_LT_LDIV_EQ; REAL_MUL_LID; REAL_SUB_LT] THEN
  2.1780 -      ASM_REAL_ARITH_TAC;
  2.1781 -      ALL_TAC] THEN
  2.1782 -    REWRITE_TAC[FORALL_IN_IMAGE; FORALL_PAIR_THM; IN_ELIM_PAIR_THM] THEN
  2.1783 -    MAP_EVERY X_GEN_TAC [`n:num`; `v:num^N`] THEN
  2.1784 -    REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN DISCH_TAC THEN
  2.1785 -    MATCH_MP_TAC FINITE_SUBSET THEN EXISTS_TAC
  2.1786 -     `IMAGE (\<lambda>(n,v).
  2.1787 -            interval[(lambda i. a$i + (v$i) / 2 pow n *
  2.1788 -                                      ((b:real^N)$i - (a:real^N)$i)):real^N,
  2.1789 -                     (lambda i. a$i + ((v$i) + 1) / 2 pow n * (b$i - a$i))])
  2.1790 -            {m,v | m \<in> 0..n \<and>
  2.1791 -                   v \<in> {v:num^N | !i. 1 \<le> i \<and> i \<le> dimindex(:N)
  2.1792 -                                       ==> v$i < 2 EXP m}}` THEN
  2.1793 -    CONJ_TAC THENL
  2.1794 -     [MATCH_MP_TAC FINITE_IMAGE THEN
  2.1795 -      MATCH_MP_TAC FINITE_PRODUCT_DEPENDENT THEN
  2.1796 -      REWRITE_TAC[FINITE_NUMSEG] THEN REPEAT STRIP_TAC THEN
  2.1797 -      MATCH_MP_TAC FINITE_CART THEN REWRITE_TAC[FINITE_NUMSEG_LT];
  2.1798 -      ALL_TAC] THEN
  2.1799 -    GEN_REWRITE_TAC I [SUBSET] THEN
  2.1800 -    REWRITE_TAC[IN_ELIM_THM] THEN ONCE_REWRITE_TAC[IMP_CONJ] THEN
  2.1801 -    REWRITE_TAC[FORALL_IN_IMAGE; FORALL_PAIR_THM; IN_ELIM_PAIR_THM] THEN
  2.1802 -    MAP_EVERY X_GEN_TAC [`m:num`; `w:num^N`] THEN DISCH_TAC THEN
  2.1803 -    DISCH_TAC THEN SIMP_TAC[IN_IMAGE; EXISTS_PAIR_THM; IN_ELIM_PAIR_THM] THEN
  2.1804 -    MAP_EVERY EXISTS_TAC [`m:num`; `w:num^N`] THEN ASM_REWRITE_TAC[] THEN
  2.1805 -    REWRITE_TAC[IN_NUMSEG; GSYM NOT_LT; LT] THEN DISCH_TAC THEN
  2.1806 -    FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [SUBSET_INTERVAL]) THEN
  2.1807 -    SIMP_TAC[NOT_IMP; LAMBDA_BETA] THEN
  2.1808 -    RULE_ASSUM_TAC(REWRITE_RULE[INTERVAL_NE_EMPTY]) THEN
  2.1809 -    ASM_SIMP_TAC[REAL_LE_LADD; REAL_LE_RMUL_EQ; REAL_SUB_LT] THEN
  2.1810 -    ASM_SIMP_TAC[REAL_LE_DIV2_EQ; REAL_LT_POW2] THEN
  2.1811 -    REWRITE_TAC[REAL_ARITH `x \<le> x + 1`] THEN
  2.1812 -    DISCH_THEN(MP_TAC o SPEC `1`) THEN
  2.1813 -    REWRITE_TAC[LE_REFL; DIMINDEX_GE_1] THEN
  2.1814 -    DISCH_THEN(MP_TAC o MATCH_MP (REAL_ARITH
  2.1815 -     `w / m \<le> v / n \<and> (v + 1) / n \<le> (w + 1) / m
  2.1816 -      ==> inv n \<le> inv m`)) THEN
  2.1817 -    REWRITE_TAC[REAL_NOT_LE] THEN MATCH_MP_TAC REAL_LT_INV2 THEN
  2.1818 -    ASM_REWRITE_TAC[REAL_LT_POW2] THEN MATCH_MP_TAC REAL_POW_MONO_LT THEN
  2.1819 -    ASM_REWRITE_TAC[] THEN CONV_TAC REAL_RAT_REDUCE_CONV;
  2.1820 -    ALL_TAC] THEN
  2.1821 -  SUBGOAL_THEN
  2.1822 -   `?d. COUNTABLE d \<and>
  2.1823 -        (!k. k \<in> d ==> k \<subseteq> {a..b} \<and> ~(k = {}) \<and>
  2.1824 -                        (\<exists>c d:real^N. k = {c..d})) \<and>
  2.1825 -        (!k1 k2. k1 \<in> d \<and> k2 \<in> d
  2.1826 -                 ==> k1 \<subseteq> k2 \/ k2 \<subseteq> k1 \/
  2.1827 -                     interior k1 \<inter> interior k2 = {}) \<and>
  2.1828 -        (!k. k \<in> d ==> (\<exists>x. x \<in> s \<inter> k \<and> k \<subseteq> g x)) \<and>
  2.1829 -        (!k. k \<in> d ==> FINITE {l | l \<in> d \<and> k \<subseteq> l}) \<and>
  2.1830 -        s \<subseteq> \<Union>d`
  2.1831 -  MP_TAC THENL
  2.1832 -   [FIRST_X_ASSUM(X_CHOOSE_THEN `d:(real^N->bool)->bool` STRIP_ASSUME_TAC) THEN
  2.1833 -    EXISTS_TAC
  2.1834 -     `{k:real^N->bool | k \<in> d \<and> ?x. x \<in> (s \<inter> k) \<and> k \<subseteq> g x}` THEN
  2.1835 -    ASM_SIMP_TAC[IN_ELIM_THM] THEN REPEAT CONJ_TAC THENL
  2.1836 -     [MATCH_MP_TAC COUNTABLE_SUBSET THEN
  2.1837 -      EXISTS_TAC `d:(real^N->bool)->bool` THEN
  2.1838 -      ASM_REWRITE_TAC[] THEN SET_TAC[];
  2.1839 -      X_GEN_TAC `k:real^N->bool` THEN REPEAT STRIP_TAC THEN
  2.1840 -      MATCH_MP_TAC FINITE_SUBSET THEN
  2.1841 -      EXISTS_TAC `{l:real^N->bool | l \<in> d \<and> k \<subseteq> l}` THEN
  2.1842 -      ASM_REWRITE_TAC[] THEN SET_TAC[];
  2.1843 -      ASM SET_TAC[]];
  2.1844 -    ALL_TAC] THEN
  2.1845 -  DISCH_THEN(X_CHOOSE_THEN `d:(real^N->bool)->bool` STRIP_ASSUME_TAC) THEN
  2.1846 -  EXISTS_TAC
  2.1847 -   `{k:real^N->bool | k \<in> d \<and> !k'. k' \<in> d \<and> ~(k = k')
  2.1848 -                                     ==> ~(k \<subseteq> k')}` THEN
  2.1849 -  ASM_SIMP_TAC[IN_ELIM_THM] THEN REPEAT CONJ_TAC THENL
  2.1850 -   [MATCH_MP_TAC COUNTABLE_SUBSET THEN EXISTS_TAC `d:(real^N->bool)->bool` THEN
  2.1851 -    ASM_REWRITE_TAC[] THEN SET_TAC[];
  2.1852 -    ASM SET_TAC[];
  2.1853 -    ALL_TAC] THEN
  2.1854 -  FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
  2.1855 -   (REWRITE_RULE[IMP_CONJ] SUBSET_TRANS)) THEN
  2.1856 -  GEN_REWRITE_TAC I [SUBSET] THEN REWRITE_TAC[FORALL_IN_UNIONS] THEN
  2.1857 -  MAP_EVERY X_GEN_TAC [`k:real^N->bool`; `x:real^N`] THEN DISCH_TAC THEN
  2.1858 -  REWRITE_TAC[IN_UNIONS; IN_ELIM_THM] THEN
  2.1859 -  MP_TAC(ISPEC `\k l:real^N->bool. k \<in> d \<and> l \<in> d \<and> l \<subseteq> k \<and> ~(k = l)`
  2.1860 -     WF_FINITE) THEN
  2.1861 -  REWRITE_TAC[WF] THEN ANTS_TAC THENL
  2.1862 -   [CONJ_TAC THENL [SET_TAC[]; ALL_TAC] THEN X_GEN_TAC `l:real^N->bool` THEN
  2.1863 -    ASM_CASES_TAC `(l:real^N->bool) \<in> d` THEN
  2.1864 -    ASM_REWRITE_TAC[EMPTY_GSPEC; FINITE_RULES] THEN
  2.1865 -    MATCH_MP_TAC FINITE_SUBSET THEN
  2.1866 -    EXISTS_TAC `{m:real^N->bool | m \<in> d \<and> l \<subseteq> m}` THEN
  2.1867 -    ASM_SIMP_TAC[] THEN SET_TAC[];
  2.1868 -    ALL_TAC] THEN
  2.1869 -  DISCH_THEN(MP_TAC o SPEC `\l:real^N->bool. l \<in> d \<and> x \<in> l`) THEN
  2.1870 -  REWRITE_TAC[] THEN ANTS_TAC THENL [SET_TAC[]; ALL_TAC] THEN
  2.1871 -  MATCH_MP_TAC MONO_EXISTS THEN ASM SET_TAC[]);; *)
  2.1872 -
  2.1873 -lemma GMEASURABLE_OUTER_INTERVALS_BOUNDED: True .. (*
  2.1874 - "!s a b:real^N e.
  2.1875 -        gmeasurable s \<and> s \<subseteq> {a..b} \<and> 0 < e
  2.1876 -        ==> ?d. COUNTABLE d \<and>
  2.1877 -                (!k. k \<in> d ==> k \<subseteq> {a..b} \<and> ~(k = {}) \<and>
  2.1878 -                                (\<exists>c d. k = {c..d})) \<and>
  2.1879 -                (!k1 k2. k1 \<in> d \<and> k2 \<in> d \<and> ~(k1 = k2)
  2.1880 -                         ==> interior k1 \<inter> interior k2 = {}) \<and>
  2.1881 -                s \<subseteq> \<Union>d \<and>
  2.1882 -                gmeasurable (\<Union>d) \<and>
  2.1883 -                gmeasure (\<Union>d) \<le> gmeasure s + e"
  2.1884 -qed   lemma lemma = prove
  2.1885 -   (`(!x y. (x,y) \<in> IMAGE (\<lambda>z. f z,g z) s ==> P x y) \<longleftrightarrow>
  2.1886 -     (!z. z \<in> s ==> P (f z) (g z))"
  2.1887 -qed   REWRITE_TAC[IN_IMAGE; PAIR_EQ] THEN MESON_TAC[]) in
  2.1888 -  REPEAT GEN_TAC THEN
  2.1889 -  ASM_CASES_TAC `interval[a:real^N,b] = {}` THENL
  2.1890 -   [ASM_REWRITE_TAC[SUBSET_EMPTY] THEN STRIP_TAC THEN
  2.1891 -    EXISTS_TAC `{}:(real^N->bool)->bool` THEN
  2.1892 -    ASM_REWRITE_TAC[NOT_IN_EMPTY; UNIONS_0; MEASURE_EMPTY; REAL_ADD_LID;
  2.1893 -                    SUBSET_REFL; COUNTABLE_EMPTY; GMEASURABLE_EMPTY] THEN
  2.1894 -    ASM_SIMP_TAC[REAL_LT_IMP_LE];
  2.1895 -    ALL_TAC] THEN
  2.1896 -  STRIP_TAC THEN ASM_CASES_TAC `interval(a:real^N,b) = {}` THENL
  2.1897 -   [EXISTS_TAC `{interval[a:real^N,b]}` THEN
  2.1898 -    REWRITE_TAC[UNIONS_1; COUNTABLE_SING] THEN
  2.1899 -    ASM_REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM; FORALL_IN_INSERT;
  2.1900 -                    NOT_IN_EMPTY; SUBSET_REFL; GMEASURABLE_INTERVAL] THEN
  2.1901 -    CONJ_TAC THENL [MESON_TAC[]; ALL_TAC] THEN
  2.1902 -    SUBGOAL_THEN
  2.1903 -     `measure(interval[a:real^N,b]) = 0 \<and> measure(s:real^N->bool) = 0`
  2.1904 -     (fun th -> ASM_SIMP_TAC[th; REAL_LT_IMP_LE; REAL_ADD_LID]) THEN
  2.1905 -    SUBGOAL_THEN
  2.1906 -      `interval[a:real^N,b] has_gmeasure 0 \<and> (s:real^N->bool) has_gmeasure 0`
  2.1907 -      (fun th -> MESON_TAC[th; MEASURE_UNIQUE]) THEN
  2.1908 -    REWRITE_TAC[HAS_GMEASURE_0] THEN
  2.1909 -    MATCH_MP_TAC(TAUT `a \<and> (a ==> b) ==> a \<and> b`) THEN CONJ_TAC THENL
  2.1910 -     [ASM_REWRITE_TAC[NEGLIGIBLE_INTERVAL];
  2.1911 -      ASM_MESON_TAC[NEGLIGIBLE_SUBSET]];
  2.1912 -    ALL_TAC] THEN
  2.1913 -  FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [measurable]) THEN
  2.1914 -  DISCH_THEN(X_CHOOSE_TAC `m:real`) THEN
  2.1915 -  FIRST_ASSUM(ASSUME_TAC o MATCH_MP MEASURE_UNIQUE) THEN
  2.1916 -  SUBGOAL_THEN
  2.1917 -   `((\<lambda>x:real^N. if x \<in> s then 1 else 0) has_integral (lift m))
  2.1918 -    {a..b}`
  2.1919 -  ASSUME_TAC THENL
  2.1920 -   [ONCE_REWRITE_TAC[GSYM HAS_INTEGRAL_RESTRICT_UNIV] THEN
  2.1921 -    FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [HAS_GMEASURE]) THEN
  2.1922 -    MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] HAS_INTEGRAL_EQ) THEN
  2.1923 -    ASM SET_TAC[];
  2.1924 -    ALL_TAC] THEN
  2.1925 -  FIRST_ASSUM(ASSUME_TAC o MATCH_MP HAS_INTEGRAL_INTEGRABLE) THEN
  2.1926 -  FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [has_integral]) THEN
  2.1927 -  DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN
  2.1928 -  DISCH_THEN(X_CHOOSE_THEN `g:real^N->real^N->bool` STRIP_ASSUME_TAC) THEN
  2.1929 -  MP_TAC(SPECL [`a:real^N`; `b:real^N`; `s:real^N->bool`;
  2.1930 -                `g:real^N->real^N->bool`] COVERING_LEMMA) THEN
  2.1931 -  ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MONO_EXISTS THEN
  2.1932 -  X_GEN_TAC `d:(real^N->bool)->bool` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
  2.1933 -  MP_TAC(ISPECL [`(\<lambda>x. if x \<in> s then 1 else 0):real^N->real^1`;
  2.1934 -                 `a:real^N`; `b:real^N`; `g:real^N->real^N->bool`;
  2.1935 -                 `e:real`]
  2.1936 -                HENSTOCK_LEMMA_PART1) THEN
  2.1937 -  ASM_REWRITE_TAC[] THEN
  2.1938 -  FIRST_ASSUM(SUBST1_TAC o MATCH_MP INTEGRAL_UNIQUE) THEN
  2.1939 -  ASM_REWRITE_TAC[] THEN DISCH_THEN(LABEL_TAC "*") THEN
  2.1940 -  SUBGOAL_THEN
  2.1941 -   `!k l:real^N->bool. k \<in> d \<and> l \<in> d \<and> ~(k = l)
  2.1942 -                       ==> negligible(k \<inter> l)`
  2.1943 -  ASSUME_TAC THENL
  2.1944 -   [REPEAT STRIP_TAC THEN
  2.1945 -    FIRST_X_ASSUM(MP_TAC o SPECL [`k:real^N->bool`; `l:real^N->bool`]) THEN
  2.1946 -    ASM_SIMP_TAC[] THEN
  2.1947 -    SUBGOAL_THEN
  2.1948 -     `?x y:real^N u v:real^N. k = {x..y} \<and> l = {u..v}`
  2.1949 -    MP_TAC THENL [ASM_MESON_TAC[SUBSET]; ALL_TAC] THEN
  2.1950 -    DISCH_THEN(REPEAT_TCL CHOOSE_THEN (CONJUNCTS_THEN SUBST_ALL_TAC)) THEN
  2.1951 -    REWRITE_TAC[INTERIOR_CLOSED_INTERVAL] THEN DISCH_TAC THEN
  2.1952 -    MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
  2.1953 -    EXISTS_TAC `(interval[x:real^N,y] DIFF {x<..<y}) UNION
  2.1954 -                (interval[u:real^N,v] DIFF {u<..<v}) UNION
  2.1955 -                (interval (x,y) \<inter> interval (u,v))` THEN
  2.1956 -    CONJ_TAC THENL [ALL_TAC; SET_TAC[]] THEN
  2.1957 -    ASM_REWRITE_TAC[UNION_EMPTY] THEN
  2.1958 -    SIMP_TAC[NEGLIGIBLE_UNION; NEGLIGIBLE_FRONTIER_INTERVAL];
  2.1959 -    ALL_TAC] THEN
  2.1960 -  SUBGOAL_THEN
  2.1961 -   `!D. FINITE D \<and> D \<subseteq> d
  2.1962 -         ==> gmeasurable(\<Union>D :real^N->bool) \<and> measure(\<Union>D) \<le> m + e`
  2.1963 -  ASSUME_TAC THENL
  2.1964 -   [GEN_TAC THEN STRIP_TAC THEN
  2.1965 -    SUBGOAL_THEN
  2.1966 -     `?t:(real^N->bool)->real^N. !k. k \<in> D ==> t(k) \<in> (s \<inter> k) \<and>
  2.1967 -                                                k \<subseteq> (g(t k))`
  2.1968 -    (CHOOSE_THEN (LABEL_TAC "+")) THENL
  2.1969 -     [REWRITE_TAC[GSYM SKOLEM_THM] THEN ASM SET_TAC[]; ALL_TAC] THEN
  2.1970 -    REMOVE_THEN "*" (MP_TAC o SPEC
  2.1971 -     `IMAGE (\<lambda>k. (t:(real^N->bool)->real^N) k,k) D`) THEN
  2.1972 -    ASM_SIMP_TAC[VSUM_IMAGE; PAIR_EQ] THEN REWRITE_TAC[o_DEF] THEN
  2.1973 -    ANTS_TAC THENL
  2.1974 -     [REWRITE_TAC[tagged_partial_division_of; fine] THEN
  2.1975 -      ASM_SIMP_TAC[FINITE_IMAGE; FORALL_IN_IMAGE] THEN
  2.1976 -      REWRITE_TAC[lemma; RIGHT_FORALL_IMP_THM; IMP_CONJ; PAIR_EQ] THEN
  2.1977 -      ASM_SIMP_TAC[] THEN
  2.1978 -      CONJ_TAC THENL [ASM SET_TAC[]; ASM_MESON_TAC[SUBSET]];
  2.1979 -      ALL_TAC] THEN
  2.1980 -    USE_THEN "+" (MP_TAC o REWRITE_RULE[IN_INTER]) THEN
  2.1981 -    SIMP_TAC[] THEN DISCH_THEN(K ALL_TAC) THEN
  2.1982 -    ASM_SIMP_TAC[VSUM_SUB] THEN
  2.1983 -    SUBGOAL_THEN `D division_of (\<Union>D:real^N->bool)` ASSUME_TAC THENL
  2.1984 -     [REWRITE_TAC[division_of] THEN ASM SET_TAC[]; ALL_TAC] THEN
  2.1985 -    FIRST_ASSUM(ASSUME_TAC o MATCH_MP GMEASURABLE_ELEMENTARY) THEN
  2.1986 -    SUBGOAL_THEN `vsum D (\<lambda>k:real^N->bool. content k % 1) =
  2.1987 -                  lift(measure(\<Union>D))`
  2.1988 -    SUBST1_TAC THENL
  2.1989 -     [ONCE_REWRITE_TAC[GSYM _EQ] THEN
  2.1990 -      ASM_SIMP_TAC[LIFT_; _VSUM; o_DEF; _CMUL; _VEC] THEN
  2.1991 -      SIMP_TAC[REAL_MUL_RID; ETA_AX] THEN ASM_MESON_TAC[MEASURE_ELEMENTARY];
  2.1992 -      ALL_TAC] THEN
  2.1993 -    SUBGOAL_THEN
  2.1994 -     `vsum D (\<lambda>k. integral k (\<lambda>x:real^N. if x \<in> s then 1 else 0)) =
  2.1995 -      lift(sum D (\<lambda>k. measure(k \<inter> s)))`
  2.1996 -    SUBST1_TAC THENL
  2.1997 -     [ASM_SIMP_TAC[LIFT_SUM; o_DEF] THEN MATCH_MP_TAC VSUM_EQ THEN
  2.1998 -      X_GEN_TAC `k:real^N->bool` THEN DISCH_TAC THEN REWRITE_TAC[] THEN
  2.1999 -      SUBGOAL_THEN `measurable(k:real^N->bool)` ASSUME_TAC THENL
  2.2000 -       [ASM_MESON_TAC[SUBSET; GMEASURABLE_INTERVAL]; ALL_TAC] THEN
  2.2001 -      ASM_SIMP_TAC[GSYM INTEGRAL_MEASURE_UNIV; GMEASURABLE_INTER] THEN
  2.2002 -      REWRITE_TAC[MESON[IN_INTER]
  2.2003 -        `(if x \<in> k \<inter> s then a else b) =
  2.2004 -         (if x \<in> k then if x \<in> s then a else b else b)`] THEN
  2.2005 -      CONV_TAC SYM_CONV THEN MATCH_MP_TAC INTEGRAL_RESTRICT_UNIV THEN
  2.2006 -      ONCE_REWRITE_TAC[GSYM INTEGRABLE_RESTRICT_UNIV] THEN
  2.2007 -      REWRITE_TAC[MESON[IN_INTER]
  2.2008 -       `(if x \<in> k then if x \<in> s then a else b else b) =
  2.2009 -        (if x \<in> k \<inter> s then a else b)`] THEN
  2.2010 -      ASM_SIMP_TAC[GSYM GMEASURABLE_INTEGRABLE; GMEASURABLE_INTER];
  2.2011 -      ALL_TAC] THEN
  2.2012 -    ASM_REWRITE_TAC[GSYM LIFT_SUB; NORM_LIFT] THEN
  2.2013 -    MATCH_MP_TAC(REAL_ARITH `y \<le> m ==> abs(x - y) \<le> e ==> x \<le> m + e`) THEN
  2.2014 -    MATCH_MP_TAC REAL_LE_TRANS THEN
  2.2015 -    EXISTS_TAC `measure(\<Union>D \<inter> s:real^N->bool)` THEN
  2.2016 -    CONJ_TAC THENL
  2.2017 -     [ALL_TAC;
  2.2018 -      EXPAND_TAC "m" THEN MATCH_MP_TAC MEASURE_SUBSET THEN
  2.2019 -      ASM_REWRITE_TAC[] THEN CONJ_TAC THENL [ALL_TAC; SET_TAC[]] THEN
  2.2020 -      MATCH_MP_TAC GMEASURABLE_INTER THEN ASM_REWRITE_TAC[]] THEN
  2.2021 -    REWRITE_TAC[INTER_UNIONS] THEN MATCH_MP_TAC REAL_EQ_IMP_LE THEN
  2.2022 -    ONCE_REWRITE_TAC[SIMPLE_IMAGE] THEN CONV_TAC SYM_CONV THEN
  2.2023 -    MATCH_MP_TAC MEASURE_NEGLIGIBLE_UNIONS_IMAGE_STRONG THEN
  2.2024 -    ASM_SIMP_TAC[FINITE_RESTRICT] THEN CONJ_TAC THENL
  2.2025 -     [ASM_MESON_TAC[SUBSET; GMEASURABLE_INTERVAL; GMEASURABLE_INTER];
  2.2026 -      ALL_TAC] THEN
  2.2027 -    MAP_EVERY X_GEN_TAC [`k:real^N->bool`; `l:real^N->bool`] THEN
  2.2028 -    STRIP_TAC THEN MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
  2.2029 -    EXISTS_TAC `k \<inter> l:real^N->bool` THEN ASM_SIMP_TAC[] THEN SET_TAC[];
  2.2030 -    ALL_TAC] THEN
  2.2031 -  ASM_CASES_TAC `FINITE(d:(real^N->bool)->bool)` THENL
  2.2032 -   [ASM_MESON_TAC[SUBSET_REFL]; ALL_TAC] THEN
  2.2033 -  MP_TAC(ISPEC `d:(real^N->bool)->bool` COUNTABLE_AS_INJECTIVE_IMAGE) THEN
  2.2034 -  ASM_REWRITE_TAC[INFINITE] THEN
  2.2035 -  DISCH_THEN(X_CHOOSE_THEN `s:num->real^N->bool`
  2.2036 -   (CONJUNCTS_THEN2 SUBST_ALL_TAC ASSUME_TAC)) THEN
  2.2037 -  MP_TAC(ISPECL [`s:num->real^N->bool`; `m + e:real`]
  2.2038 -    HAS_GMEASURE_COUNTABLE_NEGLIGIBLE_UNIONS) THEN
  2.2039 -  MATCH_MP_TAC(TAUT `a \<and> (a \<and> b ==> c) ==> (a ==> b) ==> c`) THEN
  2.2040 -  REWRITE_TAC[GSYM CONJ_ASSOC] THEN
  2.2041 -  RULE_ASSUM_TAC(REWRITE_RULE[IMP_CONJ; RIGHT_FORALL_IMP_THM;
  2.2042 -                              FORALL_IN_IMAGE; IN_UNIV]) THEN
  2.2043 -  RULE_ASSUM_TAC(REWRITE_RULE[IMP_IMP; RIGHT_IMP_FORALL_THM]) THEN
  2.2044 -  REPEAT CONJ_TAC THENL
  2.2045 -   [ASM_MESON_TAC[MEASURABLE_INTERVAL; GMEASURABLE_INTER];
  2.2046 -    ASM_MESON_TAC[];
  2.2047 -    X_GEN_TAC `n:num` THEN
  2.2048 -    FIRST_X_ASSUM(MP_TAC o SPEC `IMAGE (s:num->real^N->bool) (0..n)`) THEN
  2.2049 -    SIMP_TAC[FINITE_IMAGE; FINITE_NUMSEG; IMAGE_SUBSET; SUBSET_UNIV] THEN
  2.2050 -    DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
  2.2051 -    MATCH_MP_TAC(REAL_ARITH `x = y ==> x \<le> e ==> y \<le> e`) THEN
  2.2052 -    MATCH_MP_TAC MEASURE_NEGLIGIBLE_UNIONS_IMAGE THEN
  2.2053 -    ASM_MESON_TAC[FINITE_NUMSEG; GMEASURABLE_INTERVAL];
  2.2054 -    ALL_TAC] THEN
  2.2055 -  ONCE_REWRITE_TAC[SIMPLE_IMAGE] THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
  2.2056 -  GEN_REWRITE_TAC LAND_CONV [GSYM(CONJUNCT2 LIFT_)] THEN
  2.2057 -  REWRITE_TAC[] THEN
  2.2058 -  MATCH_MP_TAC(ISPEC `sequentially` LIM_COMPONENT_UBOUND) THEN
  2.2059 -  EXISTS_TAC
  2.2060 -   `\n. vsum(from 0 \<inter> (0..n)) (\<lambda>n. lift(measure(s n:real^N->bool)))` THEN
  2.2061 -  ASM_REWRITE_TAC[GSYM sums; TRIVIAL_LIMIT_SEQUENTIALLY] THEN
  2.2062 -  REWRITE_TAC[DIMINDEX_1; ARITH; EVENTUALLY_SEQUENTIALLY] THEN
  2.2063 -  SIMP_TAC[VSUM_COMPONENT; ARITH; DIMINDEX_1] THEN
  2.2064 -  ASM_REWRITE_TAC[GSYM ; LIFT_; FROM_INTER_NUMSEG]);; *)
  2.2065 -
  2.2066 -(* ------------------------------------------------------------------------- *)
  2.2067 -(* Hence for linear transformation, suffices to check compact intervals.     *)
  2.2068 -(* ------------------------------------------------------------------------- *)
  2.2069 -
  2.2070 -lemma GMEASURABLE_LINEAR_IMAGE_INTERVAL: True .. (*
  2.2071 - "!f a b. linear f ==> gmeasurable(IMAGE f {a..b})"
  2.2072 -qed   REPEAT STRIP_TAC THEN MATCH_MP_TAC GMEASURABLE_CONVEX THEN CONJ_TAC THENL
  2.2073 -   [MATCH_MP_TAC CONVEX_LINEAR_IMAGE THEN
  2.2074 -    ASM_MESON_TAC[CONVEX_INTERVAL];
  2.2075 -    MATCH_MP_TAC BOUNDED_LINEAR_IMAGE THEN
  2.2076 -    ASM_MESON_TAC[BOUNDED_INTERVAL]]);; *)
  2.2077 -
  2.2078 -lemma HAS_GMEASURE_LINEAR_SUFFICIENT: True .. (*
  2.2079 - "!f:real^N->real^N m.
  2.2080 -        linear f \<and>
  2.2081 -        (!a b. IMAGE f {a..b} has_gmeasure
  2.2082 -               (m * measure{a..b}))
  2.2083 -        ==> !s. gmeasurable s ==> (IMAGE f s) has_gmeasure (m * gmeasure s)"
  2.2084 -qed   REPEAT GEN_TAC THEN STRIP_TAC THEN
  2.2085 -  DISJ_CASES_TAC(REAL_ARITH `m < 0 \/ 0 \<le> m`) THENL
  2.2086 -   [FIRST_X_ASSUM(MP_TAC o SPECL [`0:real^N`; `1:real^N`]) THEN
  2.2087 -    DISCH_THEN(MP_TAC o MATCH_MP HAS_GMEASURE_POS_LE) THEN
  2.2088 -    MATCH_MP_TAC(TAUT `~a ==> a ==> b`) THEN
  2.2089 -    MATCH_MP_TAC(REAL_ARITH `0 < --m * x ==> ~(0 \<le> m * x)`) THEN
  2.2090 -    MATCH_MP_TAC REAL_LT_MUL THEN ASM_REWRITE_TAC[REAL_NEG_GT0] THEN
  2.2091 -    REWRITE_TAC[MEASURE_INTERVAL] THEN MATCH_MP_TAC CONTENT_POS_LT THEN
  2.2092 -    SIMP_TAC[VEC_COMPONENT; REAL_LT_01];
  2.2093 -    ALL_TAC] THEN
  2.2094 -  ASM_CASES_TAC `!x y. (f:real^N->real^N) x = f y ==> x = y` THENL
  2.2095 -   [ALL_TAC;
  2.2096 -    SUBGOAL_THEN `!s. negligible(IMAGE (f:real^N->real^N) s)` ASSUME_TAC THENL
  2.2097 -     [ASM_MESON_TAC[NEGLIGIBLE_LINEAR_SINGULAR_IMAGE]; ALL_TAC] THEN
  2.2098 -    SUBGOAL_THEN `m * measure(interval[0:real^N,1]) = 0` MP_TAC THENL
  2.2099 -     [MATCH_MP_TAC(ISPEC `IMAGE (f:real^N->real^N) {0..1}`
  2.2100 -        HAS_GMEASURE_UNIQUE) THEN
  2.2101 -      ASM_REWRITE_TAC[HAS_GMEASURE_0];
  2.2102 -      REWRITE_TAC[REAL_ENTIRE; MEASURE_INTERVAL] THEN
  2.2103 -      MATCH_MP_TAC(TAUT `~b \<and> (a ==> c) ==> a \/ b ==> c`) THEN CONJ_TAC THENL
  2.2104 -       [SIMP_TAC[CONTENT_EQ_0_INTERIOR; INTERIOR_CLOSED_INTERVAL;
  2.2105 -                 INTERVAL_NE_EMPTY; VEC_COMPONENT; REAL_LT_01];
  2.2106 -        ASM_SIMP_TAC[REAL_MUL_LZERO; HAS_GMEASURE_0]]]] THEN
  2.2107 -  MP_TAC(ISPEC `f:real^N->real^N` LINEAR_INJECTIVE_ISOMORPHISM) THEN
  2.2108 -  ASM_REWRITE_TAC[] THEN
  2.2109 -  DISCH_THEN(X_CHOOSE_THEN `h:real^N->real^N` STRIP_ASSUME_TAC) THEN
  2.2110 -  UNDISCH_THEN `!x y. (f:real^N->real^N) x = f y ==> x = y` (K ALL_TAC) THEN
  2.2111 -  SUBGOAL_THEN
  2.2112 -   `!s. bounded s \<and> gmeasurable s
  2.2113 -        ==> (IMAGE (f:real^N->real^N) s) has_gmeasure (m * gmeasure s)`
  2.2114 -  ASSUME_TAC THENL
  2.2115 -   [REPEAT STRIP_TAC THEN
  2.2116 -    FIRST_ASSUM(MP_TAC o MATCH_MP BOUNDED_SUBSET_CLOSED_INTERVAL) THEN
  2.2117 -    REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
  2.2118 -    MAP_EVERY X_GEN_TAC [`a:real^N`; `b:real^N`] THEN DISCH_TAC THEN
  2.2119 -    SUBGOAL_THEN
  2.2120 -     `!d. COUNTABLE d \<and>
  2.2121 -          (!k. k \<in> d ==> k \<subseteq> {a..b} \<and> ~(k = {}) \<and>
  2.2122 -                          (\<exists>c d. k = {c..d})) \<and>
  2.2123 -          (!k1 k2. k1 \<in> d \<and> k2 \<in> d \<and> ~(k1 = k2)
  2.2124 -                   ==> interior k1 \<inter> interior k2 = {})
  2.2125 -          ==> IMAGE (f:real^N->real^N) (\<Union>d) has_gmeasure
  2.2126 -                    (m * measure(\<Union>d))`
  2.2127 -    ASSUME_TAC THENL
  2.2128 -     [REWRITE_TAC[IMAGE_UNIONS] THEN REPEAT STRIP_TAC THEN
  2.2129 -      SUBGOAL_THEN
  2.2130 -       `!g:real^N->real^N.
  2.2131 -          linear g
  2.2132 -          ==> !k l. k \<in> d \<and> l \<in> d \<and> ~(k = l)
  2.2133 -                    ==> negligible((IMAGE g k) \<inter> (IMAGE g l))`
  2.2134 -      MP_TAC THENL
  2.2135 -       [REPEAT STRIP_TAC THEN
  2.2136 -        ASM_CASES_TAC `!x y. (g:real^N->real^N) x = g y ==> x = y` THENL
  2.2137 -         [ALL_TAC;
  2.2138 -          ASM_MESON_TAC[NEGLIGIBLE_LINEAR_SINGULAR_IMAGE;
  2.2139 -                        NEGLIGIBLE_INTER]] THEN
  2.2140 -        MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
  2.2141 -        EXISTS_TAC `frontier(IMAGE (g:real^N->real^N) k \<inter> IMAGE g l) UNION
  2.2142 -                    interior(IMAGE g k \<inter> IMAGE g l)` THEN
  2.2143 -        CONJ_TAC THENL
  2.2144 -         [ALL_TAC;
  2.2145 -          REWRITE_TAC[frontier] THEN MATCH_MP_TAC(SET_RULE
  2.2146 -           `s \<subseteq> t ==> s \<subseteq> (t DIFF u) \<union> u`) THEN
  2.2147 -          REWRITE_TAC[CLOSURE_SUBSET]] THEN
  2.2148 -        MATCH_MP_TAC NEGLIGIBLE_UNION THEN CONJ_TAC THENL
  2.2149 -         [MATCH_MP_TAC NEGLIGIBLE_CONVEX_FRONTIER THEN
  2.2150 -          MATCH_MP_TAC CONVEX_INTER THEN CONJ_TAC THEN
  2.2151 -          MATCH_MP_TAC CONVEX_LINEAR_IMAGE THEN ASM_MESON_TAC[CONVEX_INTERVAL];
  2.2152 -          ALL_TAC] THEN
  2.2153 -        REWRITE_TAC[INTERIOR_INTER] THEN MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
  2.2154 -        EXISTS_TAC `IMAGE (g:real^N->real^N) (interior k) INTER
  2.2155 -                    IMAGE g (interior l)` THEN
  2.2156 -        CONJ_TAC THENL
  2.2157 -         [MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
  2.2158 -          EXISTS_TAC
  2.2159 -           `IMAGE (g:real^N->real^N) (interior k \<inter> interior l)` THEN
  2.2160 -          CONJ_TAC THENL
  2.2161 -           [ASM_SIMP_TAC[IMAGE_CLAUSES; NEGLIGIBLE_EMPTY]; SET_TAC[]];
  2.2162 -          MATCH_MP_TAC(SET_RULE
  2.2163 -           `s \<subseteq> u \<and> t \<subseteq> v ==> (s \<inter> t) \<subseteq> (u \<inter> v)`) THEN
  2.2164 -          CONJ_TAC THEN MATCH_MP_TAC INTERIOR_IMAGE_SUBSET THEN
  2.2165 -          ASM_MESON_TAC[LINEAR_CONTINUOUS_AT]];
  2.2166 -        ALL_TAC] THEN
  2.2167 -      DISCH_THEN(fun th -> MP_TAC(SPEC `f:real^N->real^N` th) THEN
  2.2168 -          MP_TAC(SPEC `\x:real^N. x` th)) THEN
  2.2169 -      ASM_REWRITE_TAC[LINEAR_ID; SET_RULE `IMAGE (\<lambda>x. x) s = s`] THEN
  2.2170 -      REPEAT STRIP_TAC THEN ASM_CASES_TAC `FINITE(d:(real^N->bool)->bool)` THENL
  2.2171 -       [MP_TAC(ISPECL [`IMAGE (f:real^N->real^N)`; `d:(real^N->bool)->bool`]
  2.2172 -                  HAS_GMEASURE_NEGLIGIBLE_UNIONS_IMAGE) THEN
  2.2173 -        ANTS_TAC THENL [ASM_MESON_TAC[measurable]; ALL_TAC] THEN
  2.2174 -        MATCH_MP_TAC EQ_IMP THEN AP_TERM_TAC THEN
  2.2175 -        MATCH_MP_TAC EQ_TRANS THEN
  2.2176 -        EXISTS_TAC `sum d (\<lambda>k:real^N->bool. m * gmeasure k)` THEN CONJ_TAC THENL
  2.2177 -         [MATCH_MP_TAC SUM_EQ THEN ASM_MESON_TAC[MEASURE_UNIQUE]; ALL_TAC] THEN
  2.2178 -        REWRITE_TAC[SUM_LMUL] THEN AP_TERM_TAC THEN
  2.2179 -        CONV_TAC SYM_CONV THEN MATCH_MP_TAC MEASURE_NEGLIGIBLE_UNIONS THEN
  2.2180 -        ASM_REWRITE_TAC[GSYM HAS_GMEASURE_MEASURE] THEN
  2.2181 -        ASM_MESON_TAC[MEASURABLE_INTERVAL];
  2.2182 -        ALL_TAC] THEN
  2.2183 -      MP_TAC(ISPEC `d:(real^N->bool)->bool` COUNTABLE_AS_INJECTIVE_IMAGE) THEN
  2.2184 -      ASM_REWRITE_TAC[INFINITE] THEN
  2.2185 -      DISCH_THEN(X_CHOOSE_THEN `s:num->real^N->bool`
  2.2186 -       (CONJUNCTS_THEN2 SUBST_ALL_TAC ASSUME_TAC)) THEN
  2.2187 -      MP_TAC(ISPEC `s:num->real^N->bool`
  2.2188 -        HAS_GMEASURE_COUNTABLE_NEGLIGIBLE_UNIONS_BOUNDED) THEN
  2.2189 -      MP_TAC(ISPEC `\n:num. IMAGE (f:real^N->real^N) (s n)`
  2.2190 -        HAS_GMEASURE_COUNTABLE_NEGLIGIBLE_UNIONS_BOUNDED) THEN
  2.2191 -      RULE_ASSUM_TAC(REWRITE_RULE[IMP_CONJ; RIGHT_FORALL_IMP_THM;
  2.2192 -                                  FORALL_IN_IMAGE; IN_UNIV]) THEN
  2.2193 -      RULE_ASSUM_TAC(REWRITE_RULE[IMP_IMP; RIGHT_IMP_FORALL_THM]) THEN
  2.2194 -      ASM_SIMP_TAC[] THEN ONCE_REWRITE_TAC[SIMPLE_IMAGE] THEN ANTS_TAC THENL
  2.2195 -       [REPEAT CONJ_TAC THENL
  2.2196 -         [ASM_MESON_TAC[MEASURABLE_LINEAR_IMAGE_INTERVAL];
  2.2197 -          ASM_MESON_TAC[];
  2.2198 -          ONCE_REWRITE_TAC[GSYM o_DEF] THEN
  2.2199 -          REWRITE_TAC[GSYM IMAGE_UNIONS; IMAGE_o] THEN
  2.2200 -          MATCH_MP_TAC BOUNDED_LINEAR_IMAGE THEN ASM_REWRITE_TAC[] THEN
  2.2201 -          MATCH_MP_TAC BOUNDED_SUBSET THEN REWRITE_TAC[UNIONS_SUBSET] THEN
  2.2202 -          EXISTS_TAC `interval[a:real^N,b]` THEN
  2.2203 -          REWRITE_TAC[BOUNDED_INTERVAL] THEN ASM SET_TAC[]];
  2.2204 -        ALL_TAC] THEN
  2.2205 -      STRIP_TAC THEN ANTS_TAC THENL
  2.2206 -       [REPEAT CONJ_TAC THENL
  2.2207 -         [ASM_MESON_TAC[MEASURABLE_INTERVAL];
  2.2208 -          ASM_MESON_TAC[];
  2.2209 -          MATCH_MP_TAC BOUNDED_SUBSET THEN REWRITE_TAC[UNIONS_SUBSET] THEN
  2.2210 -          EXISTS_TAC `interval[a:real^N,b]` THEN
  2.2211 -          REWRITE_TAC[BOUNDED_INTERVAL] THEN ASM SET_TAC[]];
  2.2212 -        ALL_TAC] THEN
  2.2213 -      STRIP_TAC THEN REWRITE_TAC[GSYM IMAGE_o; o_DEF] THEN
  2.2214 -      SUBGOAL_THEN `m * gmeasure (\<Union>(IMAGE s (:num)):real^N->bool) =
  2.2215 -             measure(\<Union>(IMAGE (\<lambda>x. IMAGE f (s x)) (:num)):real^N->bool)`
  2.2216 -       (fun th -> ASM_REWRITE_TAC[GSYM HAS_GMEASURE_MEASURE; th]) THEN
  2.2217 -      ONCE_REWRITE_TAC[GSYM LIFT_EQ] THEN
  2.2218 -      MATCH_MP_TAC SERIES_UNIQUE THEN
  2.2219 -      EXISTS_TAC `\n:num. lift(measure(IMAGE (f:real^N->real^N) (s n)))` THEN
  2.2220 -      EXISTS_TAC `from 0` THEN ASM_REWRITE_TAC[] THEN MATCH_MP_TAC SUMS_EQ THEN
  2.2221 -      EXISTS_TAC `\n:num. m % lift(measure(s n:real^N->bool))` THEN
  2.2222 -      CONJ_TAC THENL
  2.2223 -       [REWRITE_TAC[GSYM LIFT_CMUL; LIFT_EQ] THEN
  2.2224 -        ASM_MESON_TAC[MEASURE_UNIQUE];
  2.2225 -        REWRITE_TAC[LIFT_CMUL] THEN MATCH_MP_TAC SERIES_CMUL THEN
  2.2226 -        ASM_REWRITE_TAC[]];
  2.2227 -      ALL_TAC] THEN
  2.2228 -    REWRITE_TAC[HAS_GMEASURE_INNER_OUTER_LE] THEN CONJ_TAC THEN
  2.2229 -    X_GEN_TAC `e:real` THEN DISCH_TAC THENL
  2.2230 -     [MP_TAC(ISPECL [`{a..b} DIFF s:real^N->bool`; `a:real^N`;
  2.2231 -       `b:real^N`; `e / (1 + abs m)`] GMEASURABLE_OUTER_INTERVALS_BOUNDED) THEN
  2.2232 -      ANTS_TAC THENL
  2.2233 -       [ASM_SIMP_TAC[MEASURABLE_DIFF; GMEASURABLE_INTERVAL] THEN
  2.2234 -        ASM_SIMP_TAC[REAL_ARITH `0 < 1 + abs x`; REAL_LT_DIV] THEN SET_TAC[];
  2.2235 -        ALL_TAC] THEN
  2.2236 -      DISCH_THEN(X_CHOOSE_THEN `d:(real^N->bool)->bool` STRIP_ASSUME_TAC) THEN
  2.2237 -      EXISTS_TAC `IMAGE f {a..b} DIFF
  2.2238 -                  IMAGE (f:real^N->real^N) (\<Union>d)` THEN
  2.2239 -      FIRST_X_ASSUM(MP_TAC o SPEC `d:(real^N->bool)->bool`) THEN
  2.2240 -      ASM_SIMP_TAC[IMAGE_SUBSET] THEN DISCH_TAC THEN
  2.2241 -      CONJ_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN CONJ_TAC THENL
  2.2242 -       [ASM_MESON_TAC[MEASURABLE_DIFF; gmeasurable]; ALL_TAC] THEN
  2.2243 -      MATCH_MP_TAC REAL_LE_TRANS THEN
  2.2244 -      EXISTS_TAC `measure(IMAGE f {a..b}) -
  2.2245 -                  measure(IMAGE (f:real^N->real^N) (\<Union>d))` THEN
  2.2246 -      CONJ_TAC THENL
  2.2247 -       [ALL_TAC;
  2.2248 -        MATCH_MP_TAC REAL_EQ_IMP_LE THEN CONV_TAC SYM_CONV THEN
  2.2249 -        MATCH_MP_TAC MEASURE_DIFF_SUBSET THEN
  2.2250 -        REPEAT(CONJ_TAC THENL [ASM_MESON_TAC[measurable]; ALL_TAC]) THEN
  2.2251 -        MATCH_MP_TAC IMAGE_SUBSET THEN ASM_SIMP_TAC[UNIONS_SUBSET]] THEN
  2.2252 -      FIRST_ASSUM(ASSUME_TAC o SPECL [`a:real^N`; `b:real^N`]) THEN
  2.2253 -      REPEAT(FIRST_X_ASSUM(SUBST1_TAC o MATCH_MP MEASURE_UNIQUE)) THEN
  2.2254 -      MATCH_MP_TAC REAL_LE_TRANS THEN
  2.2255 -      EXISTS_TAC `m * measure(s:real^N->bool) - m * e / (1 + abs m)` THEN
  2.2256 -      CONJ_TAC THENL
  2.2257 -       [REWRITE_TAC[REAL_ARITH `a - x \<le> a - y \<longleftrightarrow> y \<le> x`] THEN
  2.2258 -        REWRITE_TAC[real_div; REAL_MUL_ASSOC] THEN
  2.2259 -        REWRITE_TAC[GSYM real_div] THEN
  2.2260 -        ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_ARITH `0 < 1 + abs x`] THEN
  2.2261 -        GEN_REWRITE_TAC RAND_CONV [REAL_MUL_SYM] THEN
  2.2262 -        ASM_SIMP_TAC[REAL_LE_RMUL_EQ] THEN REAL_ARITH_TAC;
  2.2263 -        ALL_TAC] THEN
  2.2264 -      REWRITE_TAC[GSYM REAL_SUB_LDISTRIB] THEN MATCH_MP_TAC REAL_LE_LMUL THEN
  2.2265 -      ASM_REWRITE_TAC[] THEN
  2.2266 -      FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
  2.2267 -        `d \<le> a + e ==> a = i - s ==> s - e \<le> i - d`)) THEN
  2.2268 -      MATCH_MP_TAC MEASURE_DIFF_SUBSET THEN
  2.2269 -      ASM_REWRITE_TAC[MEASURABLE_INTERVAL];
  2.2270 -      MP_TAC(ISPECL [`s:real^N->bool`; `a:real^N`; `b:real^N`;
  2.2271 -                `e / (1 + abs m)`] GMEASURABLE_OUTER_INTERVALS_BOUNDED) THEN
  2.2272 -      ASM_SIMP_TAC[REAL_LT_DIV; REAL_ARITH `0 < 1 + abs x`] THEN
  2.2273 -      DISCH_THEN(X_CHOOSE_THEN `d:(real^N->bool)->bool` STRIP_ASSUME_TAC) THEN
  2.2274 -      EXISTS_TAC `IMAGE (f:real^N->real^N) (\<Union>d)` THEN
  2.2275 -      FIRST_X_ASSUM(MP_TAC o SPEC `d:(real^N->bool)->bool`) THEN
  2.2276 -      ASM_SIMP_TAC[IMAGE_SUBSET] THEN
  2.2277 -      SIMP_TAC[HAS_GMEASURE_MEASURABLE_MEASURE] THEN STRIP_TAC THEN
  2.2278 -      MATCH_MP_TAC REAL_LE_TRANS THEN
  2.2279 -      EXISTS_TAC `m * measure(s:real^N->bool) + m * e / (1 + abs m)` THEN
  2.2280 -      CONJ_TAC THENL
  2.2281 -       [REWRITE_TAC[GSYM REAL_ADD_LDISTRIB] THEN ASM_SIMP_TAC[REAL_LE_LMUL];
  2.2282 -        REWRITE_TAC[REAL_LE_LADD] THEN
  2.2283 -        REWRITE_TAC[real_div; REAL_MUL_ASSOC] THEN
  2.2284 -        REWRITE_TAC[GSYM real_div] THEN
  2.2285 -        ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_ARITH `0 < 1 + abs x`] THEN
  2.2286 -        GEN_REWRITE_TAC RAND_CONV [REAL_MUL_SYM] THEN
  2.2287 -        ASM_SIMP_TAC[REAL_LE_RMUL_EQ] THEN REAL_ARITH_TAC]];
  2.2288 -      ALL_TAC] THEN
  2.2289 -  REPEAT STRIP_TAC THEN ONCE_REWRITE_TAC[HAS_GMEASURE_LIMIT] THEN
  2.2290 -  X_GEN_TAC `e:real` THEN DISCH_TAC THEN
  2.2291 -  FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [HAS_GMEASURE_MEASURE]) THEN
  2.2292 -  GEN_REWRITE_TAC LAND_CONV [HAS_GMEASURE_LIMIT] THEN
  2.2293 -  DISCH_THEN(MP_TAC o SPEC `e / (1 + abs m)`) THEN
  2.2294 -  ASM_SIMP_TAC[REAL_LT_DIV; REAL_ARITH `0 < 1 + abs x`] THEN
  2.2295 -  DISCH_THEN(X_CHOOSE_THEN `B:real`
  2.2296 -   (CONJUNCTS_THEN2 ASSUME_TAC (LABEL_TAC "*"))) THEN
  2.2297 -  MP_TAC(ISPEC `ball(0:real^N,B)` BOUNDED_SUBSET_CLOSED_INTERVAL) THEN
  2.2298 -  REWRITE_TAC[BOUNDED_BALL; LEFT_IMP_EXISTS_THM] THEN
  2.2299 -  REMOVE_THEN "*" MP_TAC THEN
  2.2300 -  MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `c:real^N` THEN
  2.2301 -  MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `d:real^N` THEN
  2.2302 -  DISCH_THEN(fun th -> DISCH_TAC THEN MP_TAC th) THEN ASM_REWRITE_TAC[] THEN
  2.2303 -  DISCH_THEN(X_CHOOSE_THEN `z:real` STRIP_ASSUME_TAC) THEN
  2.2304 -  MP_TAC(ISPECL [`interval[c:real^N,d]`; `0:real^N`]
  2.2305 -    BOUNDED_SUBSET_BALL) THEN
  2.2306 -  REWRITE_TAC[BOUNDED_INTERVAL] THEN
  2.2307 -  DISCH_THEN(X_CHOOSE_THEN `D:real` STRIP_ASSUME_TAC) THEN
  2.2308 -  MP_TAC(ISPEC `f:real^N->real^N` LINEAR_BOUNDED_POS) THEN
  2.2309 -  ASM_REWRITE_TAC[] THEN
  2.2310 -  DISCH_THEN(X_CHOOSE_THEN `C:real` STRIP_ASSUME_TAC) THEN
  2.2311 -
  2.2312 -  EXISTS_TAC `D * C` THEN ASM_SIMP_TAC[REAL_LT_MUL] THEN
  2.2313 -  MAP_EVERY X_GEN_TAC [`a:real^N`; `b:real^N`] THEN DISCH_TAC THEN
  2.2314 -  FIRST_X_ASSUM(MP_TAC o SPEC
  2.2315 -   `s \<inter> (IMAGE (h:real^N->real^N) {a..b})`) THEN
  2.2316 -  SUBGOAL_THEN
  2.2317 -   `IMAGE (f:real^N->real^N) (s \<inter> IMAGE h (interval [a,b])) =
  2.2318 -    (IMAGE f s) \<inter> {a..b}`
  2.2319 -  SUBST1_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN ANTS_TAC THENL
  2.2320 -   [ASM_SIMP_TAC[BOUNDED_INTER; BOUNDED_LINEAR_IMAGE; BOUNDED_INTERVAL] THEN
  2.2321 -    ASM_SIMP_TAC[MEASURABLE_INTER; GMEASURABLE_LINEAR_IMAGE_INTERVAL];
  2.2322 -    ALL_TAC] THEN
  2.2323 -  DISCH_TAC THEN EXISTS_TAC
  2.2324 -   `m * measure(s \<inter> (IMAGE (h:real^N->real^N) {a..b}))` THEN
  2.2325 -  ASM_REWRITE_TAC[] THEN
  2.2326 -  MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `m * e / (1 + abs m)` THEN
  2.2327 -  CONJ_TAC THENL
  2.2328 -   [ALL_TAC;
  2.2329 -    REWRITE_TAC[real_div; REAL_MUL_ASSOC] THEN REWRITE_TAC[GSYM real_div] THEN
  2.2330 -    ASM_SIMP_TAC[REAL_LT_LDIV_EQ; REAL_ARITH `0 < 1 + abs x`] THEN
  2.2331 -    GEN_REWRITE_TAC RAND_CONV [REAL_MUL_SYM] THEN
  2.2332 -    ASM_SIMP_TAC[REAL_LT_RMUL_EQ] THEN REAL_ARITH_TAC] THEN
  2.2333 -  REWRITE_TAC[GSYM REAL_SUB_LDISTRIB; REAL_ABS_MUL] THEN
  2.2334 -  GEN_REWRITE_TAC (LAND_CONV o LAND_CONV) [real_abs] THEN
  2.2335 -  ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_LE_LMUL THEN ASM_REWRITE_TAC[] THEN
  2.2336 -  FIRST_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
  2.2337 -   `abs(z - m) < e ==> z \<le> w \<and> w \<le> m ==> abs(w - m) \<le> e`)) THEN
  2.2338 -  SUBST1_TAC(SYM(MATCH_MP MEASURE_UNIQUE
  2.2339 -   (ASSUME `s \<inter> interval [c:real^N,d] has_gmeasure z`))) THEN
  2.2340 -  CONJ_TAC THEN MATCH_MP_TAC MEASURE_SUBSET THEN
  2.2341 -  ASM_SIMP_TAC[MEASURABLE_INTER; GMEASURABLE_LINEAR_IMAGE_INTERVAL;
  2.2342 -               GMEASURABLE_INTERVAL; INTER_SUBSET] THEN
  2.2343 -  MATCH_MP_TAC(SET_RULE
  2.2344 -   `!v. t \<subseteq> v \<and> v \<subseteq> u ==> s \<inter> t \<subseteq> s \<inter> u`) THEN
  2.2345 -  EXISTS_TAC `ball(0:real^N,D)` THEN ASM_REWRITE_TAC[] THEN
  2.2346 -  MATCH_MP_TAC(SET_RULE
  2.2347 -   `!f. (!x. h(f x) = x) \<and> IMAGE f s \<subseteq> t ==> s \<subseteq> IMAGE h t`) THEN
  2.2348 -  EXISTS_TAC `f:real^N->real^N` THEN ASM_REWRITE_TAC[] THEN
  2.2349 -  MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `ball(0:real^N,D * C)` THEN
  2.2350 -  ASM_REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_BALL_0] THEN
  2.2351 -  X_GEN_TAC `x:real^N` THEN DISCH_TAC THEN
  2.2352 -  MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `C * norm(x:real^N)` THEN
  2.2353 -  ASM_REWRITE_TAC[] THEN GEN_REWRITE_TAC RAND_CONV [REAL_MUL_SYM] THEN
  2.2354 -  ASM_SIMP_TAC[REAL_LT_LMUL_EQ]);; *)
  2.2355 -
  2.2356 -(* ------------------------------------------------------------------------- *)
  2.2357 -(* Some inductions by expressing mapping in terms of elementary matrices.    *)
  2.2358 -(* ------------------------------------------------------------------------- *)
  2.2359 -
  2.2360 -lemma INDUCT_MATRIX_ROW_OPERATIONS: True .. (*
  2.2361 - "!P:real^N^N->bool.
  2.2362 -        (!A i. 1 \<le> i \<and> i \<le> dimindex(:N) \<and> row i A = 0 ==> P A) \<and>
  2.2363 -        (!A. (!i j. 1 \<le> i \<and> i \<le> dimindex(:N) \<and>
  2.2364 -                    1 \<le> j \<and> j \<le> dimindex(:N) \<and> ~(i = j)
  2.2365 -                    ==> A$i$j = 0) ==> P A) \<and>
  2.2366 -        (!A m n. P A \<and> 1 \<le> m \<and> m \<le> dimindex(:N) \<and>
  2.2367 -                 1 \<le> n \<and> n \<le> dimindex(:N) \<and> ~(m = n)
  2.2368 -                 ==> P(lambda i j. A$i$(swap(m,n) j))) \<and>
  2.2369 -        (!A m n c. P A \<and> 1 \<le> m \<and> m \<le> dimindex(:N) \<and>
  2.2370 -                   1 \<le> n \<and> n \<le> dimindex(:N) \<and> ~(m = n)
  2.2371 -                   ==> P(lambda i. if i = m then row m A + c % row n A
  2.2372 -                                   else row i A))
  2.2373 -        ==> !A. P A"
  2.2374 -qed   GEN_TAC THEN
  2.2375 -  DISCH_THEN(CONJUNCTS_THEN2 (LABEL_TAC "zero_row") MP_TAC) THEN
  2.2376 -  DISCH_THEN(CONJUNCTS_THEN2 (LABEL_TAC "diagonal") MP_TAC) THEN
  2.2377 -  DISCH_THEN(CONJUNCTS_THEN2 (LABEL_TAC "swap_cols") (LABEL_TAC "row_op")) THEN
  2.2378 -  SUBGOAL_THEN
  2.2379 -   `!k A:real^N^N.
  2.2380 -        (!i j. 1 \<le> i \<and> i \<le> dimindex(:N) \<and>
  2.2381 -               k \<le> j \<and> j \<le> dimindex(:N) \<and> ~(i = j)
  2.2382 -               ==> A$i$j = 0)
  2.2383 -        ==> P A`
  2.2384 -   (fun th -> GEN_TAC THEN MATCH_MP_TAC th THEN
  2.2385 -              EXISTS_TAC `dimindex(:N) + 1` THEN ARITH_TAC) THEN
  2.2386 -  MATCH_MP_TAC num_INDUCTION THEN CONJ_TAC THENL
  2.2387 -   [REPEAT STRIP_TAC THEN USE_THEN "diagonal" MATCH_MP_TAC THEN
  2.2388 -    REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
  2.2389 -    ASM_REWRITE_TAC[LE_0];
  2.2390 -    ALL_TAC] THEN
  2.2391 -  X_GEN_TAC `k:num` THEN DISCH_THEN(LABEL_TAC "ind_hyp") THEN
  2.2392 -  DISJ_CASES_THEN2 SUBST1_TAC ASSUME_TAC (ARITH_RULE `k = 0 \/ 1 \<le> k`) THEN
  2.2393 -  ASM_REWRITE_TAC[ARITH] THEN
  2.2394 -  ASM_CASES_TAC `k \<le> dimindex(:N)` THENL
  2.2395 -   [ALL_TAC;
  2.2396 -    REPEAT STRIP_TAC THEN REMOVE_THEN "ind_hyp" MATCH_MP_TAC THEN
  2.2397 -    ASM_ARITH_TAC] THEN
  2.2398 -  SUBGOAL_THEN
  2.2399 -   `!A:real^N^N.
  2.2400 -        ~(A$k$k = 0) \<and>
  2.2401 -        (!i j. 1 \<le> i \<and> i \<le> dimindex (:N) \<and>
  2.2402 -               SUC k \<le> j \<and> j \<le> dimindex (:N) \<and> ~(i = j)
  2.2403 -               ==> A$i$j = 0)
  2.2404 -        ==> P A`
  2.2405 -  (LABEL_TAC "nonzero_hyp") THENL
  2.2406 -   [ALL_TAC;
  2.2407 -    X_GEN_TAC `A:real^N^N` THEN DISCH_TAC THEN
  2.2408 -    ASM_CASES_TAC `row k (A:real^N^N) = 0` THENL
  2.2409 -     [REMOVE_THEN "zero_row" MATCH_MP_TAC THEN ASM_MESON_TAC[];
  2.2410 -      ALL_TAC] THEN
  2.2411 -    FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE RAND_CONV [CART_EQ]) THEN
  2.2412 -    SIMP_TAC[VEC_COMPONENT; row; LAMBDA_BETA] THEN
  2.2413 -    REWRITE_TAC[NOT_FORALL_THM; NOT_IMP; LEFT_IMP_EXISTS_THM] THEN
  2.2414 -    X_GEN_TAC `l:num` THEN STRIP_TAC THEN
  2.2415 -    ASM_CASES_TAC `l:num = k` THENL
  2.2416 -     [REMOVE_THEN "nonzero_hyp" MATCH_MP_TAC THEN ASM_MESON_TAC[];
  2.2417 -      ALL_TAC] THEN
  2.2418 -    REMOVE_THEN "swap_cols" (MP_TAC o SPECL
  2.2419 -     [`(lambda i j. (A:real^N^N)$i$swap(k,l) j):real^N^N`;
  2.2420 -      `k:num`; `l:num`]) THEN
  2.2421 -    ASM_SIMP_TAC[LAMBDA_BETA] THEN ANTS_TAC THENL
  2.2422 -     [ALL_TAC;
  2.2423 -      MATCH_MP_TAC EQ_IMP THEN AP_TERM_TAC THEN
  2.2424 -      SIMP_TAC[CART_EQ; LAMBDA_BETA] THEN
  2.2425 -      REPEAT STRIP_TAC THEN REWRITE_TAC[swap] THEN
  2.2426 -      REPEAT(COND_CASES_TAC THEN ASM_SIMP_TAC[LAMBDA_BETA])] THEN
  2.2427 -    REMOVE_THEN "nonzero_hyp" MATCH_MP_TAC THEN
  2.2428 -    ONCE_REWRITE_TAC[ARITH_RULE `SUC k \<le> i \<longleftrightarrow> 1 \<le> i \<and> SUC k \<le> i`] THEN
  2.2429 -    ASM_SIMP_TAC[LAMBDA_BETA] THEN
  2.2430 -    ASM_REWRITE_TAC[swap] THEN MAP_EVERY X_GEN_TAC [`i:num`; `j:num`] THEN
  2.2431 -    STRIP_TAC THEN SUBGOAL_THEN `l:num \<le> k` ASSUME_TAC THENL
  2.2432 -     [FIRST_X_ASSUM(MP_TAC o SPECL [`k:num`; `l:num`]) THEN
  2.2433 -      ASM_REWRITE_TAC[] THEN ARITH_TAC;
  2.2434 -      ALL_TAC] THEN
  2.2435 -    REPEAT(COND_CASES_TAC THEN ASM_REWRITE_TAC[]) THEN
  2.2436 -    FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN
  2.2437 -    ASM_ARITH_TAC] THEN
  2.2438 -   SUBGOAL_THEN
  2.2439 -   `!l A:real^N^N.
  2.2440 -        ~(A$k$k = 0) \<and>
  2.2441 -        (!i j. 1 \<le> i \<and> i \<le> dimindex (:N) \<and>
  2.2442 -               SUC k \<le> j \<and> j \<le> dimindex (:N) \<and> ~(i = j)
  2.2443 -               ==> A$i$j = 0) \<and>
  2.2444 -        (!i. l \<le> i \<and> i \<le> dimindex(:N) \<and> ~(i = k) ==> A$i$k = 0)
  2.2445 -        ==> P A`
  2.2446 -   MP_TAC THENL
  2.2447 -    [ALL_TAC;
  2.2448 -     DISCH_THEN(MP_TAC o SPEC `dimindex(:N) + 1`) THEN
  2.2449 -     REWRITE_TAC[CONJ_ASSOC; ARITH_RULE `~(n + 1 \<le> i \<and> i \<le> n)`]] THEN
  2.2450 -   MATCH_MP_TAC num_INDUCTION THEN CONJ_TAC THENL
  2.2451 -    [GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
  2.2452 -     DISCH_THEN(CONJUNCTS_THEN2 (LABEL_TAC "main") (LABEL_TAC "aux")) THEN
  2.2453 -     USE_THEN "ind_hyp" MATCH_MP_TAC THEN
  2.2454 -     MAP_EVERY X_GEN_TAC [`i:num`; `j:num`] THEN STRIP_TAC THEN
  2.2455 -     ASM_CASES_TAC `j:num = k` THENL
  2.2456 -      [ASM_REWRITE_TAC[] THEN USE_THEN "aux" MATCH_MP_TAC THEN ASM_ARITH_TAC;
  2.2457 -       REMOVE_THEN "main" MATCH_MP_TAC THEN ASM_ARITH_TAC];
  2.2458 -    ALL_TAC] THEN
  2.2459 -  X_GEN_TAC `l:num` THEN DISCH_THEN(LABEL_TAC "inner_hyp") THEN
  2.2460 -  GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
  2.2461 -  DISCH_THEN(CONJUNCTS_THEN2 (LABEL_TAC "main") (LABEL_TAC "aux")) THEN
  2.2462 -  ASM_CASES_TAC `l:num = k` THENL
  2.2463 -   [REMOVE_THEN "inner_hyp" MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN
  2.2464 -    REPEAT STRIP_TAC THEN REMOVE_THEN "aux" MATCH_MP_TAC THEN ASM_ARITH_TAC;
  2.2465 -    ALL_TAC] THEN
  2.2466 -  DISJ_CASES_TAC(ARITH_RULE `l = 0 \/ 1 \<le> l`) THENL
  2.2467 -   [REMOVE_THEN "ind_hyp" MATCH_MP_TAC THEN
  2.2468 -    MAP_EVERY X_GEN_TAC [`i:num`; `j:num`] THEN STRIP_TAC THEN
  2.2469 -    ASM_CASES_TAC `j:num = k` THENL
  2.2470 -     [ASM_REWRITE_TAC[] THEN REMOVE_THEN "aux" MATCH_MP_TAC THEN ASM_ARITH_TAC;
  2.2471 -      REMOVE_THEN "main" MATCH_MP_TAC THEN ASM_ARITH_TAC];
  2.2472 -    ALL_TAC] THEN
  2.2473 -  ASM_CASES_TAC `l \<le> dimindex(:N)` THENL
  2.2474 -   [ALL_TAC;
  2.2475 -    REMOVE_THEN "inner_hyp" MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN
  2.2476 -    ASM_ARITH_TAC] THEN
  2.2477 -  REMOVE_THEN "inner_hyp" (MP_TAC o SPECL
  2.2478 -   [`(lambda i. if i = l then row l (A:real^N^N) + --(A$l$k/A$k$k) % row k A
  2.2479 -                else row i A):real^N^N`]) THEN
  2.2480 -  ANTS_TAC THENL
  2.2481 -   [SUBGOAL_THEN `!i. l \<le> i ==> 1 \<le> i` ASSUME_TAC THENL
  2.2482 -     [ASM_ARITH_TAC; ALL_TAC] THEN
  2.2483 -    ONCE_REWRITE_TAC[ARITH_RULE `SUC k \<le> j \<longleftrightarrow> 1 \<le> j \<and> SUC k \<le> j`] THEN
  2.2484 -    ASM_SIMP_TAC[LAMBDA_BETA; row; COND_COMPONENT;
  2.2485 -                 VECTOR_ADD_COMPONENT; VECTOR_MUL_COMPONENT] THEN
  2.2486 -    ASM_SIMP_TAC[REAL_FIELD `~(y = 0) ==> x + --(x / y) * y = 0`] THEN
  2.2487 -    REWRITE_TAC[AND_FORALL_THM] THEN X_GEN_TAC `i:num` THEN
  2.2488 -    ASM_CASES_TAC `i:num = l` THEN ASM_REWRITE_TAC[] THENL
  2.2489 -     [REPEAT STRIP_TAC THEN
  2.2490 -      MATCH_MP_TAC(REAL_RING `x = 0 \<and> y = 0 ==> x + z * y = 0`) THEN
  2.2491 -      CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC;
  2.2492 -      REPEAT STRIP_TAC THEN REMOVE_THEN "aux" MATCH_MP_TAC THEN ASM_ARITH_TAC];
  2.2493 -    ALL_TAC] THEN
  2.2494 -  DISCH_TAC THEN REMOVE_THEN "row_op" (MP_TAC o SPECL
  2.2495 -   [`(lambda i. if i = l then row l A + --(A$l$k / A$k$k) % row k A
  2.2496 -                else row i (A:real^N^N)):real^N^N`;
  2.2497 -    `l:num`; `k:num`; `(A:real^N^N)$l$k / A$k$k`]) THEN
  2.2498 -  ASM_REWRITE_TAC[] THEN MATCH_MP_TAC EQ_IMP THEN AP_TERM_TAC THEN
  2.2499 -  ASM_SIMP_TAC[CART_EQ; LAMBDA_BETA; VECTOR_ADD_COMPONENT;
  2.2500 -               VECTOR_MUL_COMPONENT; row; COND_COMPONENT] THEN
  2.2501 -  REPEAT STRIP_TAC THEN COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
  2.2502 -  REAL_ARITH_TAC);; *)
  2.2503 -
  2.2504 -lemma INDUCT_MATRIX_ELEMENTARY: True .. (*
  2.2505 - "!P:real^N^N->bool.
  2.2506 -        (!A B. P A \<and> P B ==> P(A ** B)) \<and>
  2.2507 -        (!A i. 1 \<le> i \<and> i \<le> dimindex(:N) \<and> row i A = 0 ==> P A) \<and>
  2.2508 -        (!A. (!i j. 1 \<le> i \<and> i \<le> dimindex(:N) \<and>
  2.2509 -                    1 \<le> j \<and> j \<le> dimindex(:N) \<and> ~(i = j)
  2.2510 -                    ==> A$i$j = 0) ==> P A) \<and>
  2.2511 -        (!m n. 1 \<le> m \<and> m \<le> dimindex(:N) \<and>
  2.2512 -               1 \<le> n \<and> n \<le> dimindex(:N) \<and> ~(m = n)
  2.2513 -               ==> P(lambda i j. (mat 1:real^N^N)$i$(swap(m,n) j))) \<and>
  2.2514 -        (!m n c. 1 \<le> m \<and> m \<le> dimindex(:N) \<and>
  2.2515 -                 1 \<le> n \<and> n \<le> dimindex(:N) \<and> ~(m = n)
  2.2516 -                 ==> P(lambda i j. if i = m \<and> j = n then c
  2.2517 -                                   else if i = j then 1 else 0))
  2.2518 -        ==> !A. P A"
  2.2519 -qed   GEN_TAC THEN
  2.2520 -  DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
  2.2521 -  DISCH_THEN(fun th ->
  2.2522 -    MATCH_MP_TAC INDUCT_MATRIX_ROW_OPERATIONS THEN MP_TAC th) THEN
  2.2523 -  REPEAT(MATCH_MP_TAC MONO_AND THEN CONJ_TAC) THEN REWRITE_TAC[] THEN
  2.2524 -  DISCH_THEN(fun th -> X_GEN_TAC `A:real^N^N` THEN MP_TAC th) THEN
  2.2525 -  REPEAT(MATCH_MP_TAC MONO_FORALL THEN GEN_TAC) THEN
  2.2526 -  DISCH_THEN(fun th -> STRIP_TAC THEN MP_TAC th) THEN ASM_REWRITE_TAC[] THEN
  2.2527 -  UNDISCH_TAC `(P:real^N^N->bool) A` THENL
  2.2528 -   [REWRITE_TAC[GSYM IMP_CONJ]; REWRITE_TAC[GSYM IMP_CONJ_ALT]] THEN
  2.2529 -  DISCH_THEN(ANTE_RES_THEN MP_TAC) THEN MATCH_MP_TAC EQ_IMP THEN
  2.2530 -  AP_TERM_TAC THEN REWRITE_TAC[CART_EQ] THEN
  2.2531 -  X_GEN_TAC `i:num` THEN STRIP_TAC THEN
  2.2532 -  X_GEN_TAC `j:num` THEN STRIP_TAC THEN
  2.2533 -  ASM_SIMP_TAC[CART_EQ; LAMBDA_BETA; matrix_mul; row] THENL
  2.2534 -   [ASM_SIMP_TAC[mat; IN_DIMINDEX_SWAP; LAMBDA_BETA] THEN
  2.2535 -    ONCE_REWRITE_TAC[COND_RAND] THEN
  2.2536 -    SIMP_TAC[SUM_DELTA; REAL_MUL_RZERO; REAL_MUL_RID] THEN
  2.2537 -    COND_CASES_TAC THEN REWRITE_TAC[] THEN
  2.2538 -    RULE_ASSUM_TAC(REWRITE_RULE[swap; IN_NUMSEG]) THEN ASM_ARITH_TAC;
  2.2539 -    ALL_TAC] THEN
  2.2540 -  ASM_CASES_TAC `i:num = m` THEN ASM_REWRITE_TAC[] THENL
  2.2541 -   [ALL_TAC;
  2.2542 -    ONCE_REWRITE_TAC[COND_RAND] THEN ONCE_REWRITE_TAC[COND_RATOR] THEN
  2.2543 -    REWRITE_TAC[REAL_MUL_LZERO] THEN
  2.2544 -    GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV) [EQ_SYM_EQ] THEN
  2.2545 -    ASM_SIMP_TAC[SUM_DELTA; LAMBDA_BETA; IN_NUMSEG; REAL_MUL_LID]] THEN
  2.2546 -  ASM_SIMP_TAC[VECTOR_ADD_COMPONENT; VECTOR_MUL_COMPONENT; LAMBDA_BETA] THEN
  2.2547 -  MATCH_MP_TAC EQ_TRANS THEN
  2.2548 -  EXISTS_TAC
  2.2549 -    `sum {m,n} (\<lambda>k. (if k = n then c else if m = k then 1 else 0) *
  2.2550 -                    (A:real^N^N)$k$j)` THEN
  2.2551 -  CONJ_TAC THENL
  2.2552 -   [MATCH_MP_TAC SUM_SUPERSET THEN
  2.2553 -    ASM_SIMP_TAC[SUBSET; IN_INSERT; NOT_IN_EMPTY; DE_MORGAN_THM;
  2.2554 -                 IN_NUMSEG; REAL_MUL_LZERO] THEN
  2.2555 -    ASM_ARITH_TAC;
  2.2556 -    ASM_SIMP_TAC[SUM_CLAUSES; FINITE_RULES; IN_INSERT; NOT_IN_EMPTY] THEN
  2.2557 -    REAL_ARITH_TAC]);; *)
  2.2558 -
  2.2559 -lemma INDUCT_MATRIX_ELEMENTARY_ALT: True .. (*
  2.2560 - "!P:real^N^N->bool.
  2.2561 -        (!A B. P A \<and> P B ==> P(A ** B)) \<and>
  2.2562 -        (!A i. 1 \<le> i \<and> i \<le> dimindex(:N) \<and> row i A = 0 ==> P A) \<and>
  2.2563 -        (!A. (!i j. 1 \<le> i \<and> i \<le> dimindex(:N) \<and>
  2.2564 -                    1 \<le> j \<and> j \<le> dimindex(:N) \<and> ~(i = j)
  2.2565 -                    ==> A$i$j = 0) ==> P A) \<and>
  2.2566 -        (!m n. 1 \<le> m \<and> m \<le> dimindex(:N) \<and>
  2.2567 -               1 \<le> n \<and> n \<le> dimindex(:N) \<and> ~(m = n)
  2.2568 -               ==> P(lambda i j. (mat 1:real^N^N)$i$(swap(m,n) j))) \<and>
  2.2569 -        (!m n. 1 \<le> m \<and> m \<le> dimindex(:N) \<and>
  2.2570 -               1 \<le> n \<and> n \<le> dimindex(:N) \<and> ~(m = n)
  2.2571 -               ==> P(lambda i j. if i = m \<and> j = n \/ i = j then 1 else 0))
  2.2572 -        ==> !A. P A"
  2.2573 -qed   GEN_TAC THEN STRIP_TAC THEN MATCH_MP_TAC INDUCT_MATRIX_ELEMENTARY THEN
  2.2574 -  ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN
  2.2575 -  ASM_CASES_TAC `c = 0` THENL
  2.2576 -   [FIRST_X_ASSUM(fun th -> MATCH_MP_TAC th THEN
  2.2577 -        MAP_EVERY X_GEN_TAC [`i:num`; `j:num`]) THEN
  2.2578 -    ASM_SIMP_TAC[LAMBDA_BETA; COND_ID];
  2.2579 -    ALL_TAC] THEN
  2.2580 -  SUBGOAL_THEN
  2.2581 -   `(lambda i j. if i = m \<and> j = n then c else if i = j then 1 else 0) =
  2.2582 -  ((lambda i j. if i = j then if j = n then inv c else 1 else 0):real^N^N) **
  2.2583 -    ((lambda i j. if i = m \<and> j = n \/ i = j then 1 else 0):real^N^N) **
  2.2584 -    ((lambda i j. if i = j then if j = n then c else 1 else 0):real^N^N)`
  2.2585 -  SUBST1_TAC THENL
  2.2586 -   [ALL_TAC;
  2.2587 -    REPEAT(MATCH_MP_TAC(ASSUME `!A B:real^N^N. P A \<and> P B ==> P(A ** B)`) THEN
  2.2588 -           CONJ_TAC) THEN
  2.2589 -    ASM_SIMP_TAC[] THEN FIRST_X_ASSUM(fun th -> MATCH_MP_TAC th THEN
  2.2590 -        MAP_EVERY X_GEN_TAC [`i:num`; `j:num`]) THEN
  2.2591 -    ASM_SIMP_TAC[LAMBDA_BETA]] THEN
  2.2592 -  SIMP_TAC[CART_EQ; matrix_mul; LAMBDA_BETA] THEN
  2.2593 -  X_GEN_TAC `i:num` THEN STRIP_TAC THEN
  2.2594 -  X_GEN_TAC `j:num` THEN STRIP_TAC THEN
  2.2595 -  ASM_SIMP_TAC[SUM_DELTA; IN_NUMSEG; REAL_ARITH
  2.2596 -       `(if p then 1 else 0) * (if q then c else 0) =
  2.2597 -        if q then if p then c else 0 else 0`] THEN
  2.2598 -  REWRITE_TAC[REAL_ARITH
  2.2599 -   `(if p then x else 0) * y = (if p then x * y else 0)`] THEN
  2.2600 -  GEN_REWRITE_TAC (RAND_CONV o ONCE_DEPTH_CONV) [EQ_SYM_EQ] THEN
  2.2601 -  ASM_SIMP_TAC[SUM_DELTA; IN_NUMSEG] THEN
  2.2602 -  ASM_CASES_TAC `i:num = m` THEN ASM_REWRITE_TAC[] THEN
  2.2603 -  ASM_CASES_TAC `j:num = n` THEN ASM_REWRITE_TAC[REAL_MUL_LID; EQ_SYM_EQ] THEN
  2.2604 -  ASM_CASES_TAC `i:num = n` THEN
  2.2605 -  ASM_SIMP_TAC[REAL_MUL_LINV; REAL_MUL_LID; REAL_MUL_RZERO]);; *)
  2.2606 -
  2.2607 -(* ------------------------------------------------------------------------- *)
  2.2608 -(* The same thing in mapping form (might have been easier all along).        *)
  2.2609 -(* ------------------------------------------------------------------------- *)
  2.2610 -
  2.2611 -lemma INDUCT_LINEAR_ELEMENTARY: True .. (*
  2.2612 - "!P. (!f g. linear f \<and> linear g \<and> P f \<and> P g ==> P(f o g)) \<and>
  2.2613 -       (!f i. linear f \<and> 1 \<le> i \<and> i \<le> dimindex(:N) \<and> (!x. (f x)$i = 0)
  2.2614 -              ==> P f) \<and>
  2.2615 -       (!c. P(\<lambda>x. lambda i. c i * x$i)) \<and>
  2.2616 -       (!m n. 1 \<le> m \<and> m \<le> dimindex(:N) \<and>
  2.2617 -              1 \<le> n \<and> n \<le> dimindex(:N) \<and> ~(m = n)
  2.2618 -              ==> P(\<lambda>x. lambda i. x$swap(m,n) i)) \<and>
  2.2619 -       (!m n. 1 \<le> m \<and> m \<le> dimindex(:N) \<and>
  2.2620 -              1 \<le> n \<and> n \<le> dimindex(:N) \<and> ~(m = n)
  2.2621 -              ==> P(\<lambda>x. lambda i. if i = m then x$m + x$n else x$i))
  2.2622 -       ==> !f:real^N->real^N. linear f ==> P f"
  2.2623 -qed   GEN_TAC THEN
  2.2624 -  MP_TAC(ISPEC `\A:real^N^N. P(\<lambda>x:real^N. A ** x):bool`
  2.2625 -    INDUCT_MATRIX_ELEMENTARY_ALT) THEN
  2.2626 -  REWRITE_TAC[] THEN MATCH_MP_TAC MONO_IMP THEN CONJ_TAC THENL
  2.2627 -   [ALL_TAC;
  2.2628 -    DISCH_TAC THEN X_GEN_TAC `f:real^N->real^N` THEN DISCH_TAC THEN
  2.2629 -    FIRST_X_ASSUM(MP_TAC o SPEC `matrix(f:real^N->real^N)`) THEN
  2.2630 -    ASM_SIMP_TAC[MATRIX_WORKS] THEN REWRITE_TAC[ETA_AX]] THEN
  2.2631 -  MATCH_MP_TAC MONO_AND THEN CONJ_TAC THENL
  2.2632 -   [DISCH_TAC THEN MAP_EVERY X_GEN_TAC [`A:real^N^N`; `B:real^N^N`] THEN
  2.2633 -    STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPECL
  2.2634 -     [`\x:real^N. (A:real^N^N) ** x`; `\x:real^N. (B:real^N^N) ** x`]) THEN
  2.2635 -    ASM_REWRITE_TAC[MATRIX_VECTOR_MUL_LINEAR; o_DEF] THEN
  2.2636 -    REWRITE_TAC[MATRIX_VECTOR_MUL_ASSOC];
  2.2637 -    ALL_TAC] THEN
  2.2638 -  MATCH_MP_TAC MONO_AND THEN CONJ_TAC THENL
  2.2639 -   [DISCH_TAC THEN MAP_EVERY X_GEN_TAC [`A:real^N^N`; `m:num`] THEN
  2.2640 -    STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPECL
  2.2641 -     [`\x:real^N. (A:real^N^N) ** x`; `m:num`]) THEN
  2.2642 -    ASM_REWRITE_TAC[MATRIX_VECTOR_MUL_LINEAR] THEN
  2.2643 -    DISCH_THEN MATCH_MP_TAC THEN
  2.2644 -    UNDISCH_TAC `row m (A:real^N^N) = 0` THEN
  2.2645 -    ASM_SIMP_TAC[CART_EQ; row; LAMBDA_BETA; VEC_COMPONENT; matrix_vector_mul;
  2.2646 -                 REAL_MUL_LZERO; SUM_0];
  2.2647 -    ALL_TAC] THEN
  2.2648 -  MATCH_MP_TAC MONO_AND THEN CONJ_TAC THENL
  2.2649 -   [DISCH_TAC THEN X_GEN_TAC `A:real^N^N` THEN STRIP_TAC THEN
  2.2650 -    FIRST_X_ASSUM(MP_TAC o SPEC `\i. (A:real^N^N)$i$i`) THEN
  2.2651 -    MATCH_MP_TAC EQ_IMP THEN AP_TERM_TAC THEN
  2.2652 -    ASM_SIMP_TAC[CART_EQ; matrix_vector_mul; FUN_EQ_THM; LAMBDA_BETA] THEN
  2.2653 -    MAP_EVERY X_GEN_TAC [`x:real^N`; `i:num`] THEN STRIP_TAC THEN
  2.2654 -    MATCH_MP_TAC EQ_TRANS THEN EXISTS_TAC
  2.2655 -     `sum(1..dimindex(:N)) (\<lambda>j. if j = i then (A:real^N^N)$i$j * (x:real^N)$j
  2.2656 -                                else 0)` THEN
  2.2657 -    CONJ_TAC THENL [ASM_SIMP_TAC[SUM_DELTA; IN_NUMSEG]; ALL_TAC] THEN
  2.2658 -    MATCH_MP_TAC SUM_EQ_NUMSEG THEN X_GEN_TAC `j:num` THEN STRIP_TAC THEN
  2.2659 -    ASM_SIMP_TAC[] THEN COND_CASES_TAC THEN ASM_SIMP_TAC[REAL_MUL_LZERO];
  2.2660 -    ALL_TAC] THEN
  2.2661 -  MATCH_MP_TAC MONO_AND THEN CONJ_TAC THEN
  2.2662 -  MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `m:num` THEN
  2.2663 -  MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `n:num` THEN
  2.2664 -  DISCH_THEN(fun th -> STRIP_TAC THEN MP_TAC th) THEN
  2.2665 -  ASM_REWRITE_TAC[] THEN MATCH_MP_TAC EQ_IMP THEN AP_TERM_TAC THEN
  2.2666 -  ASM_SIMP_TAC[CART_EQ; matrix_vector_mul; FUN_EQ_THM; LAMBDA_BETA;
  2.2667 -               mat; IN_DIMINDEX_SWAP]
  2.2668 -  THENL
  2.2669 -   [ONCE_REWRITE_TAC[SWAP_GALOIS] THEN ONCE_REWRITE_TAC[COND_RAND] THEN
  2.2670 -    ONCE_REWRITE_TAC[COND_RATOR] THEN
  2.2671 -    SIMP_TAC[SUM_DELTA; REAL_MUL_LID; REAL_MUL_LZERO; IN_NUMSEG] THEN
  2.2672 -    REPEAT STRIP_TAC THEN REWRITE_TAC[swap] THEN
  2.2673 -    COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN ASM_ARITH_TAC;
  2.2674 -    MAP_EVERY X_GEN_TAC [`x:real^N`; `i:num`] THEN STRIP_TAC THEN
  2.2675 -    ASM_CASES_TAC `i:num = m` THEN ASM_REWRITE_TAC[] THEN
  2.2676 -    ONCE_REWRITE_TAC[COND_RAND] THEN ONCE_REWRITE_TAC[COND_RATOR] THEN
  2.2677 -    GEN_REWRITE_TAC (RAND_CONV o ONCE_DEPTH_CONV) [EQ_SYM_EQ] THEN
  2.2678 -    ASM_SIMP_TAC[SUM_DELTA; REAL_MUL_LZERO; REAL_MUL_LID; IN_NUMSEG] THEN
  2.2679 -    MATCH_MP_TAC EQ_TRANS THEN EXISTS_TAC
  2.2680 -     `sum {m,n} (\<lambda>j. if n = j \/ j = m then (x:real^N)$j else 0)` THEN
  2.2681 -    CONJ_TAC THENL
  2.2682 -     [SIMP_TAC[SUM_CLAUSES; FINITE_RULES; IN_INSERT; NOT_IN_EMPTY] THEN
  2.2683 -      ASM_REWRITE_TAC[REAL_ADD_RID];
  2.2684 -      CONV_TAC SYM_CONV THEN MATCH_MP_TAC SUM_SUPERSET THEN
  2.2685 -      ASM_SIMP_TAC[SUBSET; IN_INSERT; NOT_IN_EMPTY; DE_MORGAN_THM;
  2.2686 -                   IN_NUMSEG; REAL_MUL_LZERO] THEN
  2.2687 -      ASM_ARITH_TAC]]);; *)
  2.2688 -
  2.2689 -(* ------------------------------------------------------------------------- *)
  2.2690 -(* Hence the effect of an arbitrary linear map on a gmeasurable set.          *)
  2.2691 -(* ------------------------------------------------------------------------- *)
  2.2692 -
  2.2693 -lemma LAMBDA_SWAP_GALOIS: True .. (*
  2.2694 - "!x:real^N y:real^N.
  2.2695 -        1 \<le> m \<and> m \<le> dimindex(:N) \<and> 1 \<le> n \<and> n \<le> dimindex(:N)
  2.2696 -        ==> (x = (lambda i. y$swap(m,n) i) \<longleftrightarrow>
  2.2697 -             (lambda i. x$swap(m,n) i) = y)"
  2.2698 -qed   SIMP_TAC[CART_EQ; LAMBDA_BETA; IN_DIMINDEX_SWAP] THEN
  2.2699 -  REPEAT GEN_TAC THEN STRIP_TAC THEN EQ_TAC THEN
  2.2700 -  DISCH_TAC THEN X_GEN_TAC `i:num` THEN STRIP_TAC THEN
  2.2701 -  FIRST_X_ASSUM(MP_TAC o SPEC `swap(m,n) (i:num)`) THEN
  2.2702 -  ASM_SIMP_TAC[IN_DIMINDEX_SWAP] THEN
  2.2703 -  ASM_MESON_TAC[REWRITE_RULE[FUN_EQ_THM; o_THM; I_THM] SWAP_IDEMPOTENT]);; *)
  2.2704 -
  2.2705 -lemma LAMBDA_ADD_GALOIS: True .. (*
  2.2706 - "!x:real^N y:real^N.
  2.2707 -        1 \<le> m \<and> m \<le> dimindex(:N) \<and> 1 \<le> n \<and> n \<le> dimindex(:N) \<and>
  2.2708 -        ~(m = n)
  2.2709 -        ==> (x = (lambda i. if i = m then y$m + y$n else y$i) \<longleftrightarrow>
  2.2710 -             (lambda i. if i = m then x$m - x$n else x$i) = y)"
  2.2711 -qed   SIMP_TAC[CART_EQ; LAMBDA_BETA] THEN
  2.2712 -  REPEAT GEN_TAC THEN STRIP_TAC THEN EQ_TAC THEN
  2.2713 -  DISCH_TAC THEN X_GEN_TAC `i:num` THEN STRIP_TAC THEN
  2.2714 -  FIRST_ASSUM(MP_TAC o SPEC `n:num`) THEN
  2.2715 -  FIRST_X_ASSUM(MP_TAC o SPEC `i:num`) THEN
  2.2716 -  ASM_REWRITE_TAC[] THEN COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
  2.2717 -  REAL_ARITH_TAC);; *)
  2.2718 -
  2.2719 -lemma HAS_GMEASURE_SHEAR_INTERVAL: True .. (*
  2.2720 - "!a b:real^N m n.
  2.2721 -        1 \<le> m \<and> m \<le> dimindex(:N) \<and>
  2.2722 -        1 \<le> n \<and> n \<le> dimindex(:N) \<and>
  2.2723 -        ~(m = n) \<and> ~({a..b} = {}) \<and>
  2.2724 -        0 \<le> a$n
  2.2725 -        ==> (IMAGE (\<lambda>x. (lambda i. if i = m then x$m + x$n else x$i))
  2.2726 -                   {a..b}:real^N->bool)
  2.2727 -            has_gmeasure gmeasure (interval [a,b])"
  2.2728 -qed   lemma lemma = prove
  2.2729 -   (`!s t u v:real^N->bool.
  2.2730 -          gmeasurable s \<and> gmeasurable t \<and> gmeasurable u \<and>
  2.2731 -          negligible(s \<inter> t) \<and> negligible(s \<inter> u) \<and>
  2.2732 -          negligible(t \<inter> u) \<and>
  2.2733 -          s \<union> t \<union> u = v
  2.2734 -          ==> v has_gmeasure (measure s) + (measure t) + (measure u)"
  2.2735 -qed     REPEAT STRIP_TAC THEN
  2.2736 -    ASM_SIMP_TAC[HAS_GMEASURE_MEASURABLE_MEASURE; GMEASURABLE_UNION] THEN
  2.2737 -    FIRST_X_ASSUM(SUBST1_TAC o SYM) THEN
  2.2738 -    ASM_SIMP_TAC[MEASURE_UNION; GMEASURABLE_UNION] THEN
  2.2739 -    ASM_SIMP_TAC[MEASURE_EQ_0; UNION_OVER_INTER; MEASURE_UNION;
  2.2740 -                 GMEASURABLE_UNION; NEGLIGIBLE_INTER; GMEASURABLE_INTER] THEN
  2.2741 -    REAL_ARITH_TAC)
  2.2742 -  and lemma' = prove
  2.2743 -   (`!s t u a.
  2.2744 -          gmeasurable s \<and> gmeasurable t \<and>
  2.2745 -          s \<union> (IMAGE (\<lambda>x. a + x) t) = u \<and>
  2.2746 -          negligible(s \<inter> (IMAGE (\<lambda>x. a + x) t))
  2.2747 -          ==> gmeasure s + gmeasure t = gmeasure u"
  2.2748 -qed     REPEAT STRIP_TAC THEN FIRST_X_ASSUM(SUBST_ALL_TAC o SYM) THEN
  2.2749 -    ASM_SIMP_TAC[MEASURE_NEGLIGIBLE_UNION; GMEASURABLE_TRANSLATION;
  2.2750 -                 MEASURE_TRANSLATION]) in
  2.2751 -  REWRITE_TAC[INTERVAL_NE_EMPTY] THEN REPEAT STRIP_TAC THEN
  2.2752 -  SUBGOAL_THEN
  2.2753 -   `linear((\<lambda>x. lambda i. if i = m then x$m + x$n else x$i):real^N->real^N)`
  2.2754 -  ASSUME_TAC THENL
  2.2755 -   [ASM_SIMP_TAC[linear; LAMBDA_BETA; VECTOR_ADD_COMPONENT;
  2.2756 -                 VECTOR_MUL_COMPONENT; CART_EQ] THEN REAL_ARITH_TAC;
  2.2757 -    ALL_TAC] THEN
  2.2758 -  MP_TAC(ISPECL
  2.2759 -   [`IMAGE (\<lambda>x. lambda i. if i = m then x$m + x$n else x$i)
  2.2760 -            (interval[a:real^N,b]):real^N->bool`;
  2.2761 -    `interval[a,(lambda i. if i = m then (b:real^N)$m + b$n else b$i)] INTER
  2.2762 -       {x:real^N | (basis m - basis n) dot x \<le> a$m}`;
  2.2763 -    `interval[a,(lambda i. if i = m then b$m + b$n else b$i)] INTER
  2.2764 -       {x:real^N | (basis m - basis n) dot x >= (b:real^N)$m}`;
  2.2765 -    `interval[a:real^N,
  2.2766 -              (lambda i. if i = m then (b:real^N)$m + b$n else b$i)]`]
  2.2767 -     lemma) THEN
  2.2768 -  ANTS_TAC THENL
  2.2769 -   [ASM_SIMP_TAC[CONVEX_LINEAR_IMAGE; CONVEX_INTERVAL;
  2.2770 -                 CONVEX_HALFSPACE_LE; CONVEX_HALFSPACE_GE;
  2.2771 -                 CONVEX_INTER; GMEASURABLE_CONVEX; BOUNDED_INTER;
  2.2772 -                 BOUNDED_LINEAR_IMAGE; BOUNDED_INTERVAL] THEN
  2.2773 -    REWRITE_TAC[INTER] THEN
  2.2774 -    REWRITE_TAC[EXTENSION; IN_UNION; IN_INTER; IN_IMAGE] THEN
  2.2775 -    ASM_SIMP_TAC[LAMBDA_ADD_GALOIS; UNWIND_THM1] THEN
  2.2776 -    ASM_SIMP_TAC[IN_INTERVAL; IN_ELIM_THM; LAMBDA_BETA;
  2.2777 -                 DOT_BASIS; DOT_LSUB] THEN
  2.2778 -    ONCE_REWRITE_TAC[MESON[]
  2.2779 -       `(!i:num. P i) \<longleftrightarrow> P m \<and> (!i. ~(i = m) ==> P i)`] THEN
  2.2780 -    ASM_SIMP_TAC[] THEN
  2.2781 -    REWRITE_TAC[TAUT `(p \<and> x) \<and> (q \<and> x) \<and> r \<longleftrightarrow> x \<and> p \<and> q \<and> r`;
  2.2782 -                TAUT `(p \<and> x) \<and> q \<and> (r \<and> x) \<longleftrightarrow> x \<and> p \<and> q \<and> r`;
  2.2783 -                TAUT `((p \<and> x) \<and> q) \<and> (r \<and> x) \<and> s \<longleftrightarrow>
  2.2784 -                            x \<and> p \<and> q \<and> r \<and> s`;
  2.2785 -            TAUT `(a \<and> x \/ (b \<and> x) \<and> c \/ (d \<and> x) \<and> e \<longleftrightarrow> f \<and> x) \<longleftrightarrow>
  2.2786 -                  x ==> (a \/ b \<and> c \/ d \<and> e \<longleftrightarrow> f)`] THEN
  2.2787 -    ONCE_REWRITE_TAC[SET_RULE
  2.2788 -     `{x | P x \<and> Q x} = {x | P x} \<inter> {x | Q x}`] THEN
  2.2789 -    REWRITE_TAC[CONJ_ASSOC] THEN CONJ_TAC THENL
  2.2790 -     [ALL_TAC;
  2.2791 -      GEN_TAC THEN DISCH_THEN(MP_TAC o SPEC `n:num`) THEN
  2.2792 -      ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC] THEN
  2.2793 -    REWRITE_TAC[GSYM CONJ_ASSOC] THEN REPEAT CONJ_TAC THEN
  2.2794 -    MATCH_MP_TAC NEGLIGIBLE_INTER THEN DISJ2_TAC THEN
  2.2795 -    MATCH_MP_TAC NEGLIGIBLE_SUBSET THENL
  2.2796 -     [EXISTS_TAC `{x:real^N | (basis m - basis n) dot x = (a:real^N)$m}`;
  2.2797 -      EXISTS_TAC `{x:real^N | (basis m - basis n) dot x = (b:real^N)$m}`;
  2.2798 -      EXISTS_TAC `{x:real^N | (basis m - basis n) dot x = (b:real^N)$m}`]
  2.2799 -    THEN (CONJ_TAC THENL
  2.2800 -      [MATCH_MP_TAC NEGLIGIBLE_HYPERPLANE THEN
  2.2801 -       REWRITE_TAC[VECTOR_SUB_EQ] THEN
  2.2802 -       ASM_MESON_TAC[BASIS_INJ];
  2.2803 -       ASM_SIMP_TAC[DOT_LSUB; DOT_BASIS; SUBSET; IN_ELIM_THM;
  2.2804 -                    NOT_IN_EMPTY] THEN
  2.2805 -       FIRST_X_ASSUM(MP_TAC o SPEC `m:num`) THEN ASM_REWRITE_TAC[] THEN
  2.2806 -       ASM_REAL_ARITH_TAC]);
  2.2807 -    ALL_TAC] THEN
  2.2808 -  ASM_SIMP_TAC[HAS_GMEASURE_MEASURABLE_MEASURE;
  2.2809 -               GMEASURABLE_LINEAR_IMAGE_INTERVAL;
  2.2810 -               GMEASURABLE_INTERVAL] THEN
  2.2811 -  MP_TAC(ISPECL
  2.2812 -   [`interval[a,(lambda i. if i = m then (b:real^N)$m + b$n else b$i)] INTER
  2.2813 -       {x:real^N | (basis m - basis n) dot x \<le> a$m}`;
  2.2814 -    `interval[a,(lambda i. if i = m then b$m + b$n else b$i)] INTER
  2.2815 -       {x:real^N | (basis m - basis n) dot x >= (b:real^N)$m}`;
  2.2816 -    `interval[a:real^N,
  2.2817 -              (lambda i. if i = m then (a:real^N)$m + b$n
  2.2818 -                         else (b:real^N)$i)]`;
  2.2819 -    `(lambda i. if i = m then (a:real^N)$m - (b:real^N)$m
  2.2820 -                else 0):real^N`]
  2.2821 -     lemma') THEN
  2.2822 -  ANTS_TAC THENL
  2.2823 -   [ASM_SIMP_TAC[CONVEX_LINEAR_IMAGE; CONVEX_INTERVAL;
  2.2824 -                 CONVEX_HALFSPACE_LE; CONVEX_HALFSPACE_GE;
  2.2825 -                 CONVEX_INTER; GMEASURABLE_CONVEX; BOUNDED_INTER;
  2.2826 -                 BOUNDED_LINEAR_IMAGE; BOUNDED_INTERVAL] THEN
  2.2827 -    REWRITE_TAC[INTER] THEN
  2.2828 -    REWRITE_TAC[EXTENSION; IN_UNION; IN_INTER; IN_IMAGE] THEN
  2.2829 -    ONCE_REWRITE_TAC[VECTOR_ARITH `x:real^N = (lambda i. p i) + y \<longleftrightarrow>
  2.2830 -                                   x - (lambda i. p i) = y`] THEN
  2.2831 -    ASM_SIMP_TAC[IN_INTERVAL; IN_ELIM_THM; LAMBDA_BETA;
  2.2832 -                 DOT_BASIS; DOT_LSUB; UNWIND_THM1;
  2.2833 -                 VECTOR_SUB_COMPONENT] THEN
  2.2834 -    ONCE_REWRITE_TAC[MESON[]
  2.2835 -       `(!i:num. P i) \<longleftrightarrow> P m \<and> (!i. ~(i = m) ==> P i)`] THEN
  2.2836 -    ASM_SIMP_TAC[REAL_SUB_RZERO] THEN CONJ_TAC THENL
  2.2837 -     [X_GEN_TAC `x:real^N` THEN
  2.2838 -      FIRST_ASSUM(MP_TAC o SPEC `n:num`) THEN
  2.2839 -      FIRST_X_ASSUM(MP_TAC o SPEC `m:num`) THEN
  2.2840 -      ASM_REWRITE_TAC[] THEN
  2.2841 -      ASM_CASES_TAC
  2.2842 -       `!i. ~(i = m)
  2.2843 -            ==> 1 \<le> i \<and> i \<le> dimindex (:N)
  2.2844 -                ==> (a:real^N)$i \<le> (x:real^N)$i \<and>
  2.2845 -                    x$i \<le> (b:real^N)$i` THEN
  2.2846 -      ASM_REWRITE_TAC[] THEN
  2.2847 -      FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN
  2.2848 -      ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC;
  2.2849 -      ONCE_REWRITE_TAC[TAUT `((a \<and> b) \<and> c) \<and> (d \<and> e) \<and> f \<longleftrightarrow>
  2.2850 -                             (b \<and> e) \<and> a \<and> c \<and> d \<and> f`] THEN
  2.2851 -      ONCE_REWRITE_TAC[SET_RULE
  2.2852 -       `{x | P x \<and> Q x} = {x | P x} \<inter> {x | Q x}`] THEN
  2.2853 -      MATCH_MP_TAC NEGLIGIBLE_INTER THEN DISJ2_TAC THEN
  2.2854 -      MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
  2.2855 -      EXISTS_TAC `{x:real^N | (basis m - basis n) dot x = (a:real^N)$m}`
  2.2856 -      THEN CONJ_TAC THENL
  2.2857 -       [MATCH_MP_TAC NEGLIGIBLE_HYPERPLANE THEN
  2.2858 -        REWRITE_TAC[VECTOR_SUB_EQ] THEN
  2.2859 -        ASM_MESON_TAC[BASIS_INJ];
  2.2860 -        ASM_SIMP_TAC[DOT_LSUB; DOT_BASIS; SUBSET; IN_ELIM_THM;
  2.2861 -                     NOT_IN_EMPTY] THEN
  2.2862 -        FIRST_ASSUM(MP_TAC o SPEC `n:num`) THEN
  2.2863 -        FIRST_X_ASSUM(MP_TAC o SPEC `m:num`) THEN
  2.2864 -        ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC]];
  2.2865 -    ALL_TAC] THEN
  2.2866 -  DISCH_THEN SUBST1_TAC THEN MATCH_MP_TAC(REAL_ARITH
  2.2867 -   `a = b + c ==> a = x + b ==> x = c`) THEN
  2.2868 -  ASM_SIMP_TAC[MEASURE_INTERVAL; CONTENT_CLOSED_INTERVAL_CASES;
  2.2869 -               LAMBDA_BETA] THEN
  2.2870 -  REPEAT(COND_CASES_TAC THENL
  2.2871 -   [ALL_TAC;
  2.2872 -    FIRST_X_ASSUM(MP_TAC o check (is_neg o concl)) THEN
  2.2873 -    MATCH_MP_TAC(TAUT `p ==> ~p ==> q`) THEN
  2.2874 -    X_GEN_TAC `i:num` THEN STRIP_TAC THEN
  2.2875 -    COND_CASES_TAC THEN ASM_SIMP_TAC[] THEN
  2.2876 -    FIRST_ASSUM(MP_TAC o SPEC `n:num`) THEN
  2.2877 -    FIRST_X_ASSUM(MP_TAC o SPEC `m:num`) THEN
  2.2878 -    ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC]) THEN
  2.2879 -  SUBGOAL_THEN `1..dimindex(:N) = m INSERT ((1..dimindex(:N)) DELETE m)`
  2.2880 -  SUBST1_TAC THENL
  2.2881 -   [REWRITE_TAC[EXTENSION; IN_INSERT; IN_DELETE; IN_NUMSEG] THEN
  2.2882 -    ASM_ARITH_TAC;
  2.2883 -    ALL_TAC] THEN
  2.2884 -  SIMP_TAC[PRODUCT_CLAUSES; FINITE_DELETE; FINITE_NUMSEG] THEN
  2.2885 -  ASM_SIMP_TAC[IN_DELETE] THEN
  2.2886 -  MATCH_MP_TAC(REAL_RING
  2.2887 -   `s1 = s3 \<and> s2 = s3
  2.2888 -    ==> ((bm + bn) - am) * s1 =
  2.2889 -        ((am + bn) - am) * s2 + (bm - am) * s3`) THEN
  2.2890 -  CONJ_TAC THEN MATCH_MP_TAC PRODUCT_EQ THEN
  2.2891 -  SIMP_TAC[IN_DELETE] THEN REAL_ARITH_TAC);; *)
  2.2892 -
  2.2893 -lemma HAS_GMEASURE_LINEAR_IMAGE: True .. (*
  2.2894 - "!f:real^N->real^N s.
  2.2895 -        linear f \<and> gmeasurable s
  2.2896 -        ==> (IMAGE f s) has_gmeasure (abs(det(matrix f)) * gmeasure s)"
  2.2897 -qed   REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN
  2.2898 -  MATCH_MP_TAC INDUCT_LINEAR_ELEMENTARY THEN REPEAT CONJ_TAC THENL
  2.2899 -   [MAP_EVERY X_GEN_TAC [`f:real^N->real^N`; `g:real^N->real^N`] THEN
  2.2900 -    REPLICATE_TAC 2 (DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
  2.2901 -    DISCH_THEN(fun th -> REPEAT STRIP_TAC THEN MP_TAC th) THEN
  2.2902 -    DISCH_THEN(CONJUNCTS_THEN2
  2.2903 -     (MP_TAC o SPEC `IMAGE (g:real^N->real^N) s`)
  2.2904 -     (MP_TAC o SPEC `s:real^N->bool`)) THEN
  2.2905 -    ASM_REWRITE_TAC[] THEN
  2.2906 -    GEN_REWRITE_TAC LAND_CONV [HAS_GMEASURE_MEASURABLE_MEASURE] THEN
  2.2907 -    STRIP_TAC THEN ASM_SIMP_TAC[MATRIX_COMPOSE; DET_MUL; REAL_ABS_MUL] THEN
  2.2908 -    REWRITE_TAC[IMAGE_o; GSYM REAL_MUL_ASSOC];
  2.2909 -
  2.2910 -    MAP_EVERY X_GEN_TAC [`f:real^N->real^N`; `m:num`] THEN STRIP_TAC THEN
  2.2911 -    SUBGOAL_THEN `~(!x y. (f:real^N->real^N) x = f y ==> x = y)`
  2.2912 -    ASSUME_TAC THENL
  2.2913 -     [ASM_SIMP_TAC[LINEAR_SINGULAR_INTO_HYPERPLANE] THEN
  2.2914 -      EXISTS_TAC `basis m:real^N` THEN
  2.2915 -      ASM_SIMP_TAC[BASIS_NONZERO; DOT_BASIS];
  2.2916 -      ALL_TAC] THEN
  2.2917 -    MP_TAC(ISPEC `matrix f:real^N^N` INVERTIBLE_DET_NZ) THEN
  2.2918 -    ASM_SIMP_TAC[INVERTIBLE_LEFT_INVERSE; MATRIX_LEFT_INVERTIBLE_INJECTIVE;
  2.2919 -                 MATRIX_WORKS; REAL_ABS_NUM; REAL_MUL_LZERO] THEN
  2.2920 -    DISCH_THEN(K ALL_TAC) THEN REWRITE_TAC[HAS_GMEASURE_0] THEN
  2.2921 -    ASM_SIMP_TAC[NEGLIGIBLE_LINEAR_SINGULAR_IMAGE];
  2.2922 -
  2.2923 -    MAP_EVERY X_GEN_TAC [`c:num->real`; `s:real^N->bool`] THEN
  2.2924 -    DISCH_TAC THEN
  2.2925 -    FIRST_ASSUM(ASSUME_TAC o REWRITE_RULE[HAS_GMEASURE_MEASURE]) THEN
  2.2926 -    FIRST_ASSUM(MP_TAC o SPEC `c:num->real` o
  2.2927 -     MATCH_MP HAS_GMEASURE_STRETCH) THEN
  2.2928 -    MATCH_MP_TAC EQ_IMP THEN AP_TERM_TAC THEN
  2.2929 -    AP_THM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN
  2.2930 -    SIMP_TAC[matrix; LAMBDA_BETA] THEN
  2.2931 -    W(MP_TAC o PART_MATCH (lhs o rand) DET_DIAGONAL o rand o snd) THEN
  2.2932 -    SIMP_TAC[LAMBDA_BETA; BASIS_COMPONENT; REAL_MUL_RZERO] THEN
  2.2933 -    DISCH_THEN(K ALL_TAC) THEN MATCH_MP_TAC PRODUCT_EQ_NUMSEG THEN
  2.2934 -    REWRITE_TAC[REAL_MUL_RID];
  2.2935 -
  2.2936 -    MAP_EVERY X_GEN_TAC [`m:num`; `n:num`] THEN STRIP_TAC THEN
  2.2937 -    MATCH_MP_TAC HAS_GMEASURE_LINEAR_SUFFICIENT THEN
  2.2938 -    ASM_SIMP_TAC[linear; LAMBDA_BETA; IN_DIMINDEX_SWAP; VECTOR_ADD_COMPONENT;
  2.2939 -                 VECTOR_MUL_COMPONENT; CART_EQ] THEN
  2.2940 -    MAP_EVERY X_GEN_TAC [`a:real^N`; `b:real^N`] THEN
  2.2941 -    SUBGOAL_THEN `matrix (\<lambda>x:real^N. lambda i. x$swap (m,n) i):real^N^N =
  2.2942 -                  transp(lambda i j. (mat 1:real^N^N)$i$swap (m,n) j)`
  2.2943 -    SUBST1_TAC THENL
  2.2944 -     [ASM_SIMP_TAC[MATRIX_EQ; LAMBDA_BETA; IN_DIMINDEX_SWAP;
  2.2945 -                    matrix_vector_mul; CART_EQ; matrix; mat; basis;
  2.2946 -                    COND_COMPONENT; transp] THEN
  2.2947 -      REWRITE_TAC[EQ_SYM_EQ];
  2.2948 -      ALL_TAC] THEN
  2.2949 -    REWRITE_TAC[DET_TRANSP] THEN
  2.2950 -    W(MP_TAC o PART_MATCH (lhs o rand) DET_PERMUTE_COLUMNS o
  2.2951 -        rand o lhand o rand o snd) THEN
  2.2952 -    ASM_SIMP_TAC[PERMUTES_SWAP; IN_NUMSEG; ETA_AX] THEN
  2.2953 -    DISCH_THEN(K ALL_TAC) THEN
  2.2954 -    REWRITE_TAC[DET_I; REAL_ABS_SIGN; REAL_MUL_RID; REAL_MUL_LID] THEN
  2.2955 -    ASM_CASES_TAC `interval[a:real^N,b] = {}` THENL
  2.2956 -     [ASM_SIMP_TAC[IMAGE_CLAUSES; HAS_GMEASURE_EMPTY; MEASURE_EMPTY];
  2.2957 -      ALL_TAC] THEN
  2.2958 -    SUBGOAL_THEN
  2.2959 -     `~(IMAGE (\<lambda>x:real^N. lambda i. x$swap (m,n) i)
  2.2960 -              {a..b}:real^N->bool = {})`
  2.2961 -    MP_TAC THENL [ASM_REWRITE_TAC[IMAGE_EQ_EMPTY]; ALL_TAC] THEN
  2.2962 -    SUBGOAL_THEN
  2.2963 -     `IMAGE (\<lambda>x:real^N. lambda i. x$swap (m,n) i)
  2.2964 -              {a..b}:real^N->bool =
  2.2965 -      interval[(lambda i. a$swap (m,n) i),
  2.2966 -               (lambda i. b$swap (m,n) i)]`
  2.2967 -    SUBST1_TAC THENL
  2.2968 -     [REWRITE_TAC[EXTENSION; IN_INTERVAL; IN_IMAGE] THEN
  2.2969 -      ASM_SIMP_TAC[LAMBDA_SWAP_GALOIS; UNWIND_THM1] THEN
  2.2970 -      SIMP_TAC[LAMBDA_BETA] THEN GEN_TAC THEN EQ_TAC THEN
  2.2971 -      DISCH_TAC THEN X_GEN_TAC `i:num` THEN STRIP_TAC THEN
  2.2972 -      FIRST_X_ASSUM(MP_TAC o SPEC `swap(m,n) (i:num)`) THEN
  2.2973 -      ASM_SIMP_TAC[IN_DIMINDEX_SWAP] THEN
  2.2974 -      ASM_MESON_TAC[REWRITE_RULE[FUN_EQ_THM; o_THM; I_THM] SWAP_IDEMPOTENT];
  2.2975 -      ALL_TAC] THEN
  2.2976 -    REWRITE_TAC[HAS_GMEASURE_MEASURABLE_MEASURE; GMEASURABLE_INTERVAL] THEN
  2.2977 -    REWRITE_TAC[MEASURE_INTERVAL] THEN
  2.2978 -    ASM_SIMP_TAC[CONTENT_CLOSED_INTERVAL; GSYM INTERVAL_NE_EMPTY] THEN
  2.2979 -    DISCH_THEN(K ALL_TAC) THEN SIMP_TAC[LAMBDA_BETA] THEN
  2.2980 -    ASM_SIMP_TAC[GSYM VECTOR_SUB_COMPONENT; IN_DIMINDEX_SWAP] THEN
  2.2981 -    MP_TAC(ISPECL [`\i. (b - a:real^N)$i`; `swap(m:num,n)`; `1..dimindex(:N)`]
  2.2982 -                (GSYM PRODUCT_PERMUTE)) THEN
  2.2983 -    REWRITE_TAC[o_DEF] THEN DISCH_THEN MATCH_MP_TAC THEN
  2.2984 -    ASM_SIMP_TAC[PERMUTES_SWAP; IN_NUMSEG];
  2.2985 -
  2.2986 -    MAP_EVERY X_GEN_TAC [`m:num`; `n:num`] THEN STRIP_TAC THEN
  2.2987 -    MATCH_MP_TAC HAS_GMEASURE_LINEAR_SUFFICIENT THEN
  2.2988 -    MATCH_MP_TAC(TAUT `a \<and> (a ==> b) ==> a \<and> b`) THEN CONJ_TAC THENL
  2.2989 -     [ASM_SIMP_TAC[linear; LAMBDA_BETA; VECTOR_ADD_COMPONENT;
  2.2990 -                   VECTOR_MUL_COMPONENT; CART_EQ] THEN REAL_ARITH_TAC;
  2.2991 -      DISCH_TAC] THEN
  2.2992 -    MAP_EVERY X_GEN_TAC [`a:real^N`; `b:real^N`] THEN
  2.2993 -    SUBGOAL_THEN
  2.2994 -      `det(matrix(\<lambda>x. lambda i. if i = m then (x:real^N)$m + x$n
  2.2995 -                                else x$i):real^N^N) = 1`
  2.2996 -    SUBST1_TAC THENL
  2.2997 -     [ASM_SIMP_TAC[matrix; basis; COND_COMPONENT; LAMBDA_BETA] THEN
  2.2998 -      FIRST_ASSUM(DISJ_CASES_TAC o MATCH_MP (ARITH_RULE
  2.2999 -       `~(m:num = n) ==> m < n \/ n < m`))
  2.3000 -      THENL
  2.3001 -       [W(MP_TAC o PART_MATCH (lhs o rand) DET_UPPERTRIANGULAR o lhs o snd);
  2.3002 -        W(MP_TAC o PART_MATCH (lhs o rand) DET_LOWERTRIANGULAR o lhs o snd)]
  2.3003 -      THEN ASM_SIMP_TAC[LAMBDA_BETA; BASIS_COMPONENT; COND_COMPONENT;
  2.3004 -                        matrix; REAL_ADD_RID; COND_ID;
  2.3005 -                        PRODUCT_CONST_NUMSEG; REAL_POW_ONE] THEN
  2.3006 -      DISCH_THEN MATCH_MP_TAC THEN
  2.3007 -      REPEAT GEN_TAC THEN REPEAT(COND_CASES_TAC THEN ASM_REWRITE_TAC[]) THEN
  2.3008 -      ASM_ARITH_TAC;
  2.3009 -      ALL_TAC] THEN
  2.3010 -    REWRITE_TAC[REAL_ABS_NUM; REAL_MUL_LID] THEN
  2.3011 -    ASM_CASES_TAC `interval[a:real^N,b] = {}` THENL
  2.3012 -     [ASM_SIMP_TAC[IMAGE_CLAUSES; HAS_GMEASURE_EMPTY; MEASURE_EMPTY];
  2.3013 -      ALL_TAC] THEN
  2.3014 -    SUBGOAL_THEN
  2.3015 -     `IMAGE (\<lambda>x. lambda i. if i = m then x$m + x$n else x$i) (interval [a,b]) =
  2.3016 -      IMAGE (\<lambda>x:real^N. (lambda i. if i = m \/ i = n then a$n else 0) +
  2.3017 -                        x)
  2.3018 -            (IMAGE (\<lambda>x:real^N. lambda i. if i = m then x$m + x$n else x$i)
  2.3019 -                   (IMAGE (\<lambda>x. (lambda i. if i = n then --(a$n) else 0) + x)
  2.3020 -                          {a..b}))`
  2.3021 -    SUBST1_TAC THENL
  2.3022 -     [REWRITE_TAC[GSYM IMAGE_o] THEN AP_THM_TAC THEN AP_TERM_TAC THEN
  2.3023 -      ASM_SIMP_TAC[FUN_EQ_THM; o_THM; VECTOR_ADD_COMPONENT; LAMBDA_BETA;
  2.3024 -                   CART_EQ] THEN
  2.3025 -      MAP_EVERY X_GEN_TAC [`x:real^N`; `i:num`] THEN
  2.3026 -      STRIP_TAC THEN ASM_CASES_TAC `i:num = m` THEN ASM_REWRITE_TAC[] THEN
  2.3027 -      ASM_CASES_TAC `i:num = n` THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC;
  2.3028 -      ALL_TAC] THEN
  2.3029 -    MATCH_MP_TAC HAS_GMEASURE_TRANSLATION THEN
  2.3030 -    SUBGOAL_THEN
  2.3031 -     `measure{a..b} =
  2.3032 -      measure(IMAGE (\<lambda>x:real^N. (lambda i. if i = n then --(a$n) else 0) + x)
  2.3033 -                    {a..b}:real^N->bool)`
  2.3034 -    SUBST1_TAC THENL
  2.3035 -     [CONV_TAC SYM_CONV THEN MATCH_MP_TAC MEASURE_TRANSLATION THEN
  2.3036 -      REWRITE_TAC[MEASURABLE_INTERVAL];
  2.3037 -      ALL_TAC] THEN
  2.3038 -    SUBGOAL_THEN
  2.3039 -     `~(IMAGE (\<lambda>x:real^N. (lambda i. if i = n then --(a$n) else 0) + x)
  2.3040 -                    {a..b}:real^N->bool = {})`
  2.3041 -    MP_TAC THENL [ASM_SIMP_TAC[IMAGE_EQ_EMPTY]; ALL_TAC] THEN
  2.3042 -    ONCE_REWRITE_TAC[VECTOR_ARITH `c + x = 1 % x + c`] THEN
  2.3043 -    ASM_REWRITE_TAC[IMAGE_AFFINITY_INTERVAL; REAL_POS] THEN
  2.3044 -    DISCH_TAC THEN MATCH_MP_TAC HAS_GMEASURE_SHEAR_INTERVAL THEN
  2.3045 -    ASM_SIMP_TAC[LAMBDA_BETA; VECTOR_ADD_COMPONENT; VECTOR_MUL_COMPONENT] THEN
  2.3046 -    REAL_ARITH_TAC]);; *)
  2.3047 -
  2.3048 -lemma GMEASURABLE_LINEAR_IMAGE: True .. (*
  2.3049 - "!f:real^N->real^N s.
  2.3050 -        linear f \<and> gmeasurable s ==> gmeasurable(IMAGE f s)"
  2.3051 -qed   REPEAT GEN_TAC THEN
  2.3052 -  DISCH_THEN(MP_TAC o MATCH_MP HAS_GMEASURE_LINEAR_IMAGE) THEN
  2.3053 -  SIMP_TAC[HAS_GMEASURE_MEASURABLE_MEASURE]);; *)
  2.3054 -
  2.3055 -lemma MEASURE_LINEAR_IMAGE: True .. (*
  2.3056 - "!f:real^N->real^N s.
  2.3057 -        linear f \<and> gmeasurable s
  2.3058 -        ==> measure(IMAGE f s) = abs(det(matrix f)) * gmeasure s"
  2.3059 -qed   REPEAT GEN_TAC THEN
  2.3060 -  DISCH_THEN(MP_TAC o MATCH_MP HAS_GMEASURE_LINEAR_IMAGE) THEN
  2.3061 -  SIMP_TAC[HAS_GMEASURE_MEASURABLE_MEASURE]);; *)
  2.3062 -
  2.3063 -lemma HAS_GMEASURE_LINEAR_IMAGE_SAME: True .. (*
  2.3064 - "!f s. linear f \<and> gmeasurable s \<and> abs(det(matrix f)) = 1
  2.3065 -         ==> (IMAGE f s) has_gmeasure (measure s)"
  2.3066 -qed   MESON_TAC[HAS_GMEASURE_LINEAR_IMAGE; REAL_MUL_LID]);; *)
  2.3067 -
  2.3068 -lemma MEASURE_LINEAR_IMAGE_SAME: True .. (*
  2.3069 - "!f:real^N->real^N s.
  2.3070 -        linear f \<and> gmeasurable s \<and> abs(det(matrix f)) = 1
  2.3071 -        ==> measure(IMAGE f s) = gmeasure s"
  2.3072 -qed   REPEAT GEN_TAC THEN
  2.3073 -  DISCH_THEN(MP_TAC o MATCH_MP HAS_GMEASURE_LINEAR_IMAGE_SAME) THEN
  2.3074 -  SIMP_TAC[HAS_GMEASURE_MEASURABLE_MEASURE]);; *)
  2.3075 -
  2.3076 -(* ------------------------------------------------------------------------- *)
  2.3077 -(* gmeasure of a standard simplex.                                            *)
  2.3078 -(* ------------------------------------------------------------------------- *)
  2.3079 -
  2.3080 -lemma CONGRUENT_IMAGE_STD_SIMPLEX: True .. (*
  2.3081 - "!p. p permutes 1..dimindex(:N)
  2.3082 -       ==> {x:real^N | 0 \<le> x$(p 1) \<and> x$(p(dimindex(:N))) \<le> 1 \<and>
  2.3083 -                       (!i. 1 \<le> i \<and> i < dimindex(:N)
  2.3084 -                            ==> x$(p i) \<le> x$(p(i + 1)))} =
  2.3085 -           IMAGE (\<lambda>x:real^N. lambda i. sum(1..inverse p(i)) (\<lambda>j. x$j))
  2.3086 -                 {x | (!i. 1 \<le> i \<and> i \<le> dimindex (:N) ==> 0 \<le> x$i) \<and>
  2.3087 -                      sum (1..dimindex (:N)) (\<lambda>i. x$i) \<le> 1}"
  2.3088 -qed   REPEAT STRIP_TAC THEN MATCH_MP_TAC SUBSET_ANTISYM THEN CONJ_TAC THENL
  2.3089 -   [ALL_TAC;
  2.3090 -    REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN X_GEN_TAC `x:real^N` THEN
  2.3091 -    ASM_SIMP_TAC[IN_ELIM_THM; LAMBDA_BETA; LAMBDA_BETA_PERM; LE_REFL;
  2.3092 -                 ARITH_RULE `i < n ==> i \<le> n \<and> i + 1 \<le> n`;
  2.3093 -                 ARITH_RULE `1 \<le> n + 1`; DIMINDEX_GE_1] THEN
  2.3094 -    STRIP_TAC THEN
  2.3095 -    FIRST_ASSUM(fun th -> REWRITE_TAC[MATCH_MP PERMUTES_INVERSES th]) THEN
  2.3096 -    ASM_SIMP_TAC[SUM_SING_NUMSEG; DIMINDEX_GE_1; LE_REFL] THEN
  2.3097 -    REWRITE_TAC[GSYM ADD1; SUM_CLAUSES_NUMSEG; ARITH_RULE `1 \<le> SUC n`] THEN
  2.3098 -    ASM_SIMP_TAC[REAL_LE_ADDR] THEN REPEAT STRIP_TAC THEN
  2.3099 -    FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC] THEN
  2.3100 -  REWRITE_TAC[SUBSET; IN_IMAGE; IN_ELIM_THM] THEN X_GEN_TAC `x:real^N` THEN
  2.3101 -  STRIP_TAC THEN
  2.3102 -  EXISTS_TAC `(lambda i. if i = 1 then x$(p 1)
  2.3103 -                         else (x:real^N)$p(i) - x$p(i - 1)):real^N` THEN
  2.3104 -  ASM_SIMP_TAC[IN_ELIM_THM; LAMBDA_BETA; LAMBDA_BETA_PERM; LE_REFL;
  2.3105 -               ARITH_RULE `i < n ==> i \<le> n \<and> i + 1 \<le> n`;
  2.3106 -               ARITH_RULE `1 \<le> n + 1`; DIMINDEX_GE_1; CART_EQ] THEN
  2.3107 -  REPEAT CONJ_TAC THENL
  2.3108 -   [X_GEN_TAC `i:num` THEN STRIP_TAC THEN
  2.3109 -    SUBGOAL_THEN `1 \<le> inverse (p:num->num) i \<and>
  2.3110 -                  !x. x \<le> inverse p i ==> x \<le> dimindex(:N)`
  2.3111 -    ASSUME_TAC THENL
  2.3112 -     [ASM_MESON_TAC[PERMUTES_INVERSE; IN_NUMSEG; LE_TRANS; PERMUTES_IN_IMAGE];
  2.3113 -      ASM_SIMP_TAC[LAMBDA_BETA] THEN ASM_SIMP_TAC[SUM_CLAUSES_LEFT; ARITH]] THEN
  2.3114 -    SIMP_TAC[ARITH_RULE `2 \<le> n ==> ~(n = 1)`] THEN
  2.3115 -    GEN_REWRITE_TAC (RAND_CONV o RAND_CONV o BINDER_CONV)
  2.3116 -                [GSYM REAL_MUL_LID] THEN
  2.3117 -    ONCE_REWRITE_TAC[SUM_PARTIAL_PRE] THEN
  2.3118 -    REWRITE_TAC[REAL_SUB_REFL; REAL_MUL_RZERO; SUM_0; COND_ID] THEN
  2.3119 -    REWRITE_TAC[REAL_MUL_LID; ARITH; REAL_SUB_RZERO] THEN
  2.3120 -    FIRST_ASSUM(DISJ_CASES_TAC o MATCH_MP (ARITH_RULE
  2.3121 -     `1 \<le> p ==> p = 1 \/ 2 \<le> p`) o CONJUNCT1) THEN
  2.3122 -    ASM_SIMP_TAC[ARITH] THEN
  2.3123 -    FIRST_ASSUM(fun th -> REWRITE_TAC[MATCH_MP PERMUTES_INVERSES th]) THEN
  2.3124 -    REWRITE_TAC[REAL_ADD_RID] THEN TRY REAL_ARITH_TAC THEN
  2.3125 -    ASM_MESON_TAC[PERMUTES_INVERSE_EQ; PERMUTES_INVERSE];
  2.3126 -
  2.3127 -    X_GEN_TAC `i:num` THEN STRIP_TAC THEN COND_CASES_TAC THEN
  2.3128 -    ASM_REWRITE_TAC[REAL_SUB_LE] THEN
  2.3129 -    FIRST_X_ASSUM(MP_TAC o SPEC `i - 1`) THEN
  2.3130 -    ASM_SIMP_TAC[SUB_ADD] THEN DISCH_THEN MATCH_MP_TAC THEN ASM_ARITH_TAC;
  2.3131 -
  2.3132 -    SIMP_TAC[SUM_CLAUSES_LEFT; DIMINDEX_GE_1; ARITH;
  2.3133 -             ARITH_RULE `2 \<le> n ==> ~(n = 1)`] THEN
  2.3134 -    GEN_REWRITE_TAC (LAND_CONV o RAND_CONV o RAND_CONV o BINDER_CONV)
  2.3135 -                [GSYM REAL_MUL_LID] THEN
  2.3136 -    ONCE_REWRITE_TAC[SUM_PARTIAL_PRE] THEN
  2.3137 -    REWRITE_TAC[REAL_SUB_REFL; REAL_MUL_RZERO; SUM_0; COND_ID] THEN
  2.3138 -    REWRITE_TAC[REAL_MUL_LID; ARITH; REAL_SUB_RZERO] THEN
  2.3139 -    COND_CASES_TAC THEN ASM_SIMP_TAC[REAL_ADD_RID] THEN
  2.3140 -    ASM_REWRITE_TAC[REAL_ARITH `x + y - x:real = y`] THEN
  2.3141 -    ASM_MESON_TAC[DIMINDEX_GE_1;
  2.3142 -                  ARITH_RULE `1 \<le> n \<and> ~(2 \<le> n) ==> n = 1`]]);; *)
  2.3143 -
  2.3144 -lemma HAS_GMEASURE_IMAGE_STD_SIMPLEX: True .. (*
  2.3145 - "!p. p permutes 1..dimindex(:N)
  2.3146 -       ==> {x:real^N | 0 \<le> x$(p 1) \<and> x$(p(dimindex(:N))) \<le> 1 \<and>
  2.3147 -                       (!i. 1 \<le> i \<and> i < dimindex(:N)
  2.3148 -                            ==> x$(p i) \<le> x$(p(i + 1)))}
  2.3149 -           has_gmeasure
  2.3150 -           (measure (convex hull
  2.3151 -             (0 INSERT {basis i:real^N | 1 \<le> i \<and> i \<le> dimindex(:N)})))"
  2.3152 -qed   REPEAT STRIP_TAC THEN ASM_SIMP_TAC[CONGRUENT_IMAGE_STD_SIMPLEX] THEN
  2.3153 -  ASM_SIMP_TAC[GSYM STD_SIMPLEX] THEN
  2.3154 -  MATCH_MP_TAC HAS_GMEASURE_LINEAR_IMAGE_SAME THEN
  2.3155 -  REPEAT CONJ_TAC THENL
  2.3156 -   [REWRITE_TAC[linear; CART_EQ] THEN
  2.3157 -    ASM_SIMP_TAC[LAMBDA_BETA; VECTOR_ADD_COMPONENT; VECTOR_MUL_COMPONENT;
  2.3158 -                 GSYM SUM_ADD_NUMSEG; GSYM SUM_LMUL] THEN
  2.3159 -    REPEAT STRIP_TAC THEN MATCH_MP_TAC SUM_EQ_NUMSEG THEN
  2.3160 -    REPEAT STRIP_TAC THEN REWRITE_TAC[] THENL
  2.3161 -     [MATCH_MP_TAC VECTOR_ADD_COMPONENT;
  2.3162 -      MATCH_MP_TAC VECTOR_MUL_COMPONENT] THEN
  2.3163 -    ASM_MESON_TAC[PERMUTES_INVERSE; IN_NUMSEG; LE_TRANS; PERMUTES_IN_IMAGE];
  2.3164 -    MATCH_MP_TAC GMEASURABLE_CONVEX THEN REWRITE_TAC[CONVEX_CONVEX_HULL] THEN
  2.3165 -    MATCH_MP_TAC BOUNDED_CONVEX_HULL THEN REWRITE_TAC[BOUNDED_INSERT] THEN
  2.3166 -    ONCE_REWRITE_TAC[SIMPLE_IMAGE_GEN] THEN
  2.3167 -    MATCH_MP_TAC FINITE_IMP_BOUNDED THEN MATCH_MP_TAC FINITE_IMAGE THEN
  2.3168 -    REWRITE_TAC[GSYM numseg; FINITE_NUMSEG];
  2.3169 -    MATCH_MP_TAC EQ_TRANS THEN EXISTS_TAC
  2.3170 -     `abs(det
  2.3171 -       ((lambda i. ((lambda i j. if j \<le> i then 1 else 0):real^N^N)
  2.3172 -                   $inverse p i)
  2.3173 -        :real^N^N))` THEN
  2.3174 -    CONJ_TAC THENL
  2.3175 -     [AP_TERM_TAC THEN AP_TERM_TAC THEN REWRITE_TAC[CART_EQ] THEN
  2.3176 -      ASM_SIMP_TAC[matrix; LAMBDA_BETA; BASIS_COMPONENT; COND_COMPONENT;
  2.3177 -                   LAMBDA_BETA_PERM; PERMUTES_INVERSE] THEN
  2.3178 -      X_GEN_TAC `i:num` THEN STRIP_TAC THEN
  2.3179 -      X_GEN_TAC `j:num` THEN STRIP_TAC THEN MATCH_MP_TAC EQ_TRANS THEN
  2.3180 -      EXISTS_TAC `sum (1..inverse (p:num->num) i)
  2.3181 -                      (\<lambda>k. if k = j then 1 else 0)` THEN
  2.3182 -      CONJ_TAC THENL
  2.3183 -       [MATCH_MP_TAC SUM_EQ THEN
  2.3184 -        ASM_SIMP_TAC[IN_NUMSEG; PERMUTES_IN_IMAGE; basis] THEN
  2.3185 -        REPEAT STRIP_TAC THEN MATCH_MP_TAC LAMBDA_BETA THEN
  2.3186 -        ASM_MESON_TAC[PERMUTES_IN_IMAGE; IN_NUMSEG; LE_TRANS;
  2.3187 -                      PERMUTES_INVERSE];
  2.3188 -        ASM_SIMP_TAC[SUM_DELTA; IN_NUMSEG]];
  2.3189 -      ALL_TAC] THEN
  2.3190 -    ASM_SIMP_TAC[PERMUTES_INVERSE; DET_PERMUTE_ROWS; ETA_AX] THEN
  2.3191 -    REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_SIGN; REAL_MUL_LID] THEN
  2.3192 -    MATCH_MP_TAC(REAL_ARITH `x = 1 ==> abs x = 1`) THEN
  2.3193 -    ASM_SIMP_TAC[DET_LOWERTRIANGULAR; GSYM NOT_LT; LAMBDA_BETA] THEN
  2.3194 -    REWRITE_TAC[LT_REFL; PRODUCT_CONST_NUMSEG; REAL_POW_ONE]]);; *)
  2.3195 -
  2.3196 -lemma HAS_GMEASURE_STD_SIMPLEX: True .. (*
  2.3197 - "(convex hull (0:real^N INSERT {basis i | 1 \<le> i \<and> i \<le> dimindex(:N)}))
  2.3198 -   has_gmeasure inv((FACT(dimindex(:N))))"
  2.3199 -qed   lemma lemma = prove
  2.3200 -   (`!f:num->real. (!i. 1 \<le> i \<and> i < n ==> f i \<le> f(i + 1)) \<longleftrightarrow>
  2.3201 -                   (!i j. 1 \<le> i \<and> i \<le> j \<and> j \<le> n ==> f i \<le> f j)"
  2.3202 -qed     GEN_TAC THEN EQ_TAC THEN DISCH_TAC THENL
  2.3203 -     [GEN_TAC THEN INDUCT_TAC THEN
  2.3204 -      SIMP_TAC[LE; REAL_LE_REFL] THEN
  2.3205 -      STRIP_TAC THEN ASM_SIMP_TAC[REAL_LE_REFL] THEN
  2.3206 -      MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `(f:num->real) j` THEN
  2.3207 -      ASM_SIMP_TAC[ARITH_RULE `SUC x \<le> y ==> x \<le> y`] THEN
  2.3208 -      REWRITE_TAC[ADD1] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC;
  2.3209 -      REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC]) in
  2.3210 -  MP_TAC(ISPECL
  2.3211 -   [`\p. {x:real^N | 0 \<le> x$(p 1) \<and> x$(p(dimindex(:N))) \<le> 1 \<and>
  2.3212 -                     (!i. 1 \<le> i \<and> i < dimindex(:N)
  2.3213 -                          ==> x$(p i) \<le> x$(p(i + 1)))}`;
  2.3214 -    `{p | p permutes 1..dimindex(:N)}`]
  2.3215 -    HAS_GMEASURE_NEGLIGIBLE_UNIONS_IMAGE) THEN
  2.3216 -  ASM_SIMP_TAC[REWRITE_RULE[HAS_GMEASURE_MEASURABLE_MEASURE]
  2.3217 -                            HAS_GMEASURE_IMAGE_STD_SIMPLEX; IN_ELIM_THM] THEN
  2.3218 -  ASM_SIMP_TAC[SUM_CONST; FINITE_PERMUTATIONS; FINITE_NUMSEG;
  2.3219 -               CARD_PERMUTATIONS; CARD_NUMSEG_1] THEN
  2.3220 -  ANTS_TAC THENL
  2.3221 -   [MAP_EVERY X_GEN_TAC [`p:num->num`; `q:num->num`] THEN STRIP_TAC THEN
  2.3222 -    SUBGOAL_THEN `?i. i \<in> 1..dimindex(:N) \<and> ~(p i:num = q i)` MP_TAC THENL
  2.3223 -     [ASM_MESON_TAC[permutes; FUN_EQ_THM]; ALL_TAC] THEN
  2.3224 -    GEN_REWRITE_TAC LAND_CONV [num_WOP] THEN
  2.3225 -    REWRITE_TAC[TAUT `a ==> ~(b \<and> ~c) \<longleftrightarrow> a \<and> b ==> c`] THEN
  2.3226 -    REWRITE_TAC[IN_NUMSEG] THEN
  2.3227 -    DISCH_THEN(X_CHOOSE_THEN `k:num` STRIP_ASSUME_TAC) THEN
  2.3228 -    MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
  2.3229 -    EXISTS_TAC `{x:real^N | (basis(p(k:num)) - basis(q k)) dot x = 0}` THEN
  2.3230 -    CONJ_TAC THENL
  2.3231 -     [MATCH_MP_TAC NEGLIGIBLE_HYPERPLANE THEN REWRITE_TAC[VECTOR_SUB_EQ] THEN
  2.3232 -      MATCH_MP_TAC BASIS_NE THEN ASM_MESON_TAC[PERMUTES_IN_IMAGE; IN_NUMSEG];
  2.3233 -      ALL_TAC] THEN
  2.3234 -    REWRITE_TAC[SUBSET; IN_INTER; IN_ELIM_THM; DOT_LSUB; VECTOR_SUB_EQ] THEN
  2.3235 -    ASM_SIMP_TAC[DOT_BASIS; GSYM IN_NUMSEG; PERMUTES_IN_IMAGE] THEN
  2.3236 -    SUBGOAL_THEN `?l. (q:num->num) l = p(k:num)` STRIP_ASSUME_TAC THENL
  2.3237 -     [ASM_MESON_TAC[permutes]; ALL_TAC] THEN
  2.3238 -    SUBGOAL_THEN `1 \<le> l \<and> l \<le> dimindex(:N)` STRIP_ASSUME_TAC THENL
  2.3239 -     [ASM_MESON_TAC[PERMUTES_IN_IMAGE; IN_NUMSEG]; ALL_TAC] THEN
  2.3240 -    SUBGOAL_THEN `k:num < l` ASSUME_TAC THENL
  2.3241 -     [REWRITE_TAC[GSYM NOT_LE] THEN REWRITE_TAC[LE_LT] THEN
  2.3242 -      ASM_MESON_TAC[PERMUTES_INJECTIVE; IN_NUMSEG];
  2.3243 -      ALL_TAC] THEN
  2.3244 -    SUBGOAL_THEN `?m. (p:num->num) m = q(k:num)` STRIP_ASSUME_TAC THENL
  2.3245 -     [ASM_MESON_TAC[permutes]; ALL_TAC] THEN
  2.3246 -    SUBGOAL_THEN `1 \<le> m \<and> m \<le> dimindex(:N)` STRIP_ASSUME_TAC THENL
  2.3247 -     [ASM_MESON_TAC[PERMUTES_IN_IMAGE; IN_NUMSEG]; ALL_TAC] THEN
  2.3248 -    SUBGOAL_THEN `k:num < m` ASSUME_TAC THENL
  2.3249 -     [REWRITE_TAC[GSYM NOT_LE] THEN REWRITE_TAC[LE_LT] THEN
  2.3250 -      ASM_MESON_TAC[PERMUTES_INJECTIVE; IN_NUMSEG];
  2.3251 -      ALL_TAC] THEN
  2.3252 -    X_GEN_TAC `x:real^N` THEN REWRITE_TAC[lemma] THEN STRIP_TAC THEN
  2.3253 -    FIRST_X_ASSUM(MP_TAC o SPECL [`k:num`; `l:num`]) THEN
  2.3254 -    FIRST_X_ASSUM(MP_TAC o SPECL [`k:num`; `m:num`]) THEN
  2.3255 -    ASM_SIMP_TAC[LT_IMP_LE; IMP_IMP; REAL_LE_ANTISYM; REAL_SUB_0] THEN
  2.3256 -    MATCH_MP_TAC EQ_IMP THEN BINOP_TAC THEN
  2.3257 -    ASM_MESON_TAC[PERMUTES_IN_IMAGE; IN_NUMSEG; DOT_BASIS];
  2.3258 -    ALL_TAC] THEN
  2.3259 -  REWRITE_TAC[HAS_GMEASURE_MEASURABLE_MEASURE] THEN
  2.3260 -  DISCH_THEN(ASSUME_TAC o CONJUNCT2) THEN CONJ_TAC THENL
  2.3261 -   [MATCH_MP_TAC GMEASURABLE_CONVEX THEN REWRITE_TAC[CONVEX_CONVEX_HULL] THEN
  2.3262 -    MATCH_MP_TAC BOUNDED_CONVEX_HULL THEN REWRITE_TAC[BOUNDED_INSERT] THEN
  2.3263 -    ONCE_REWRITE_TAC[SIMPLE_IMAGE_GEN] THEN
  2.3264 -    MATCH_MP_TAC FINITE_IMP_BOUNDED THEN MATCH_MP_TAC FINITE_IMAGE THEN
  2.3265 -    REWRITE_TAC[GSYM numseg; FINITE_NUMSEG];
  2.3266 -    ALL_TAC] THEN
  2.3267 -  ASM_SIMP_TAC[REAL_FIELD `~(y = 0) ==> (x = inv y \<longleftrightarrow> y * x = 1)`;
  2.3268 -               REAL_OF_NUM_EQ; FACT_NZ] THEN
  2.3269 -  FIRST_X_ASSUM(SUBST1_TAC o SYM) THEN MATCH_MP_TAC EQ_TRANS THEN
  2.3270 -  EXISTS_TAC `measure(interval[0:real^N,1])` THEN CONJ_TAC THENL
  2.3271 -   [AP_TERM_TAC; REWRITE_TAC[MEASURE_INTERVAL; CONTENT_UNIT]] THEN
  2.3272 -  REWRITE_TAC[lemma] THEN MATCH_MP_TAC SUBSET_ANTISYM THEN CONJ_TAC THENL
  2.3273 -   [REWRITE_TAC[SUBSET; FORALL_IN_UNIONS; FORALL_IN_IMAGE; IMP_CONJ;
  2.3274 -                RIGHT_FORALL_IMP_THM; IN_ELIM_THM] THEN
  2.3275 -    SIMP_TAC[IMP_IMP; IN_INTERVAL; LAMBDA_BETA; VEC_COMPONENT] THEN
  2.3276 -    X_GEN_TAC `p:num->num` THEN STRIP_TAC THEN X_GEN_TAC `x:real^N` THEN
  2.3277 -    STRIP_TAC THEN X_GEN_TAC `i:num` THEN REPEAT STRIP_TAC THEN
  2.3278 -    MATCH_MP_TAC REAL_LE_TRANS THENL
  2.3279 -     [EXISTS_TAC `(x:real^N)$(p 1)`;
  2.3280 -      EXISTS_TAC `(x:real^N)$(p(dimindex(:N)))`] THEN
  2.3281 -    ASM_REWRITE_TAC[] THEN
  2.3282 -    FIRST_ASSUM(MP_TAC o SPEC `i:num` o MATCH_MP PERMUTES_SURJECTIVE) THEN
  2.3283 -    ASM_MESON_TAC[LE_REFL; PERMUTES_IN_IMAGE; IN_NUMSEG];
  2.3284 -    ALL_TAC] THEN
  2.3285 -  REWRITE_TAC[SET_RULE `s \<subseteq> UNIONS(IMAGE f t) \<longleftrightarrow>
  2.3286 -                        !x. x \<in> s ==> ?y. y \<in> t \<and> x \<in> f y`] THEN
  2.3287 -  X_GEN_TAC `x:real^N` THEN REWRITE_TAC[IN_INTERVAL; IN_ELIM_THM] THEN
  2.3288 -  SIMP_TAC[VEC_COMPONENT] THEN DISCH_TAC THEN
  2.3289 -  MP_TAC(ISPEC `\i j. ~((x:real^N)$j \<le> x$i)` TOPOLOGICAL_SORT) THEN
  2.3290 -  REWRITE_TAC[REAL_NOT_LE; REAL_NOT_LT] THEN
  2.3291 -  ANTS_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN
  2.3292 -  DISCH_THEN(MP_TAC o SPECL [`dimindex(:N)`; `1..dimindex(:N)`]) THEN
  2.3293 -  REWRITE_TAC[HAS_SIZE_NUMSEG_1; EXTENSION; IN_IMAGE; IN_NUMSEG] THEN
  2.3294 -  DISCH_THEN(X_CHOOSE_THEN `f:num->num` (CONJUNCTS_THEN2
  2.3295 -   (ASSUME_TAC o GSYM) ASSUME_TAC)) THEN
  2.3296 -  EXISTS_TAC `\i. if i \<in> 1..dimindex(:N) then f(i) else i` THEN
  2.3297 -  REWRITE_TAC[] THEN ONCE_REWRITE_TAC[ARITH_RULE
  2.3298 -    `1 \<le> i \<and> i \<le> j \<and> j \<le> n \<longleftrightarrow>
  2.3299 -     1 \<le> i \<and> 1 \<le> j \<and> i \<le> n \<and> j \<le> n \<and> i \<le> j`] THEN
  2.3300 -  ASM_SIMP_TAC[IN_NUMSEG; LE_REFL; DIMINDEX_GE_1] THEN
  2.3301 -  CONJ_TAC THENL
  2.3302 -   [ALL_TAC;
  2.3303 -    ASM_MESON_TAC[LE_REFL; DIMINDEX_GE_1; LE_LT; REAL_LE_LT]] THEN
  2.3304 -  SIMP_TAC[PERMUTES_FINITE_SURJECTIVE; FINITE_NUMSEG] THEN
  2.3305 -  SIMP_TAC[IN_NUMSEG] THEN ASM_MESON_TAC[]);; *)
  2.3306 -
  2.3307 -(* ------------------------------------------------------------------------- *)
  2.3308 -(* Hence the gmeasure of a general simplex.                                   *)
  2.3309 -(* ------------------------------------------------------------------------- *)
  2.3310 -
  2.3311 -lemma HAS_GMEASURE_SIMPLEX_0: True .. (*
  2.3312 - "!l:(real^N)list.
  2.3313 -        LENGTH l = dimindex(:N)
  2.3314 -        ==> (convex hull (0 INSERT set_of_list l)) has_gmeasure
  2.3315 -            abs(det(vector l)) / (FACT(dimindex(:N)))"
  2.3316 -qed   REPEAT STRIP_TAC THEN
  2.3317 -  SUBGOAL_THEN
  2.3318 -   `0 INSERT (set_of_list l) =
  2.3319 -        IMAGE (\<lambda>x:real^N. transp(vector l:real^N^N) ** x)
  2.3320 -              (0 INSERT {basis i:real^N | 1 \<le> i \<and> i \<le> dimindex(:N)})`
  2.3321 -  SUBST1_TAC THENL
  2.3322 -   [ONCE_REWRITE_TAC[SIMPLE_IMAGE_GEN] THEN
  2.3323 -    REWRITE_TAC[IMAGE_CLAUSES; GSYM IMAGE_o; o_DEF] THEN
  2.3324 -    REWRITE_TAC[MATRIX_VECTOR_MUL_RZERO] THEN AP_TERM_TAC THEN
  2.3325 -    SIMP_TAC[matrix_vector_mul; vector; transp; LAMBDA_BETA; basis] THEN
  2.3326 -    ONCE_REWRITE_TAC[COND_RAND] THEN
  2.3327 -    SIMP_TAC[REAL_MUL_RZERO; SUM_DELTA] THEN
  2.3328 -    REWRITE_TAC[EXTENSION; IN_IMAGE; IN_ELIM_THM; IN_NUMSEG] THEN
  2.3329 -    ONCE_REWRITE_TAC[TAUT `a \<and> b \<and> c \<longleftrightarrow> ~(b \<and> c ==> ~a)`] THEN
  2.3330 -    X_GEN_TAC `y:real^N` THEN SIMP_TAC[LAMBDA_BETA; REAL_MUL_RID] THEN
  2.3331 -    SIMP_TAC[CART_EQ; LAMBDA_BETA] THEN
  2.3332 -    REWRITE_TAC[NOT_IMP; REAL_MUL_RID; GSYM CART_EQ] THEN
  2.3333 -    ASM_REWRITE_TAC[IN_SET_OF_LIST; MEM_EXISTS_EL] THEN
  2.3334 -    EQ_TAC THEN DISCH_THEN(X_CHOOSE_THEN `i:num` STRIP_ASSUME_TAC) THENL
  2.3335 -     [EXISTS_TAC `SUC i`; EXISTS_TAC `i - 1`] THEN
  2.3336 -    ASM_REWRITE_TAC[SUC_SUB1] THEN ASM_ARITH_TAC;
  2.3337 -    ALL_TAC] THEN
  2.3338 -  ASM_SIMP_TAC[GSYM CONVEX_HULL_LINEAR_IMAGE; MATRIX_VECTOR_MUL_LINEAR] THEN
  2.3339 -  SUBGOAL_THEN
  2.3340 -   `det(vector l:real^N^N) = det(matrix(\<lambda>x:real^N. transp(vector l) ** x))`
  2.3341 -  SUBST1_TAC THENL
  2.3342 -   [REWRITE_TAC[MATRIX_OF_MATRIX_VECTOR_MUL; DET_TRANSP]; ALL_TAC] THEN
  2.3343 -  REWRITE_TAC[real_div] THEN
  2.3344 -  ASM_SIMP_TAC[GSYM(REWRITE_RULE[HAS_GMEASURE_MEASURABLE_MEASURE]
  2.3345 -                 HAS_GMEASURE_STD_SIMPLEX)] THEN
  2.3346 -  MATCH_MP_TAC HAS_GMEASURE_LINEAR_IMAGE THEN
  2.3347 -  REWRITE_TAC[MATRIX_VECTOR_MUL_LINEAR] THEN
  2.3348 -  MATCH_MP_TAC GMEASURABLE_CONVEX THEN REWRITE_TAC[CONVEX_CONVEX_HULL] THEN
  2.3349 -  MATCH_MP_TAC BOUNDED_CONVEX_HULL THEN REWRITE_TAC[BOUNDED_INSERT] THEN
  2.3350 -  ONCE_REWRITE_TAC[SIMPLE_IMAGE_GEN] THEN
  2.3351 -  MATCH_MP_TAC FINITE_IMP_BOUNDED THEN MATCH_MP_TAC FINITE_IMAGE THEN
  2.3352 -  REWRITE_TAC[GSYM numseg; FINITE_NUMSEG]);; *)
  2.3353 -
  2.3354 -lemma HAS_GMEASURE_SIMPLEX: True .. (*
  2.3355 - "!a l:(real^N)list.
  2.3356 -        LENGTH l = dimindex(:N)
  2.3357 -        ==> (convex hull (set_of_list(CONS a l))) has_gmeasure
  2.3358 -            abs(det(vector(MAP (\<lambda>x. x - a) l))) / (FACT(dimindex(:N)))"
  2.3359 -qed   REPEAT STRIP_TAC THEN
  2.3360 -  MP_TAC(ISPEC `MAP (\<lambda>x:real^N. x - a) l` HAS_GMEASURE_SIMPLEX_0) THEN
  2.3361 -  ASM_REWRITE_TAC[LENGTH_MAP; set_of_list] THEN
  2.3362 -  DISCH_THEN(MP_TAC o SPEC `a:real^N` o MATCH_MP HAS_GMEASURE_TRANSLATION) THEN
  2.3363 -  REWRITE_TAC[GSYM CONVEX_HULL_TRANSLATION] THEN
  2.3364 -  MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN
  2.3365 -  REWRITE_TAC[IMAGE_CLAUSES; VECTOR_ADD_RID; SET_OF_LIST_MAP] THEN
  2.3366 -  REWRITE_TAC[GSYM IMAGE_o; o_DEF; VECTOR_ARITH `a + x - a:real^N = x`;
  2.3367 -              SET_RULE `IMAGE (\<lambda>x. x) s = s`]);; *)
  2.3368 -
  2.3369 -lemma GMEASURABLE_SIMPLEX: True .. (*
  2.3370 - "!l. gmeasurable(convex hull (set_of_list l))"
  2.3371 -qed   GEN_TAC THEN
  2.3372 -  MATCH_MP_TAC GMEASURABLE_CONVEX THEN REWRITE_TAC[CONVEX_CONVEX_HULL] THEN
  2.3373 -  MATCH_MP_TAC BOUNDED_CONVEX_HULL THEN
  2.3374 -  MATCH_MP_TAC FINITE_IMP_BOUNDED THEN REWRITE_TAC[FINITE_SET_OF_LIST]);; *)
  2.3375 -
  2.3376 -lemma MEASURE_SIMPLEX: True .. (*
  2.3377 - "!a l:(real^N)list.
  2.3378 -        LENGTH l = dimindex(:N)
  2.3379 -        ==> measure(convex hull (set_of_list(CONS a l))) =
  2.3380 -            abs(det(vector(MAP (\<lambda>x. x - a) l))) / (FACT(dimindex(:N)))"
  2.3381 -qed   MESON_TAC[HAS_GMEASURE_SIMPLEX; HAS_GMEASURE_MEASURABLE_MEASURE]);; *)
  2.3382 -
  2.3383 -(* ------------------------------------------------------------------------- *)
  2.3384 -(* Area of a triangle.                                                       *)
  2.3385 -(* ------------------------------------------------------------------------- *)
  2.3386 -
  2.3387 -lemma HAS_GMEASURE_TRIANGLE: True .. (*
  2.3388 - "!a b c:real^2.
  2.3389 -        convex hull {a,b,c} has_gmeasure
  2.3390 -        abs((b$1 - a$1) * (c$2 - a$2) - (b$2 - a$2) * (c$1 - a$1)) / 2"
  2.3391 -qed   REPEAT STRIP_TAC THEN
  2.3392 -  MP_TAC(ISPECL [`a:real^2`; `[b;c]:(real^2)list`] HAS_GMEASURE_SIMPLEX) THEN
  2.3393 -  REWRITE_TAC[LENGTH; DIMINDEX_2; ARITH; set_of_list; MAP] THEN
  2.3394 -  CONV_TAC NUM_REDUCE_CONV THEN SIMP_TAC[DET_2; VECTOR_2] THEN
  2.3395 -  SIMP_TAC[VECTOR_SUB_COMPONENT; DIMINDEX_2; ARITH]);; *)
  2.3396 -
  2.3397 -lemma GMEASURABLE_TRIANGLE: True .. (*
  2.3398 - "!a b c:real^N. gmeasurable(convex hull {a,b,c})"
  2.3399 -qed   REPEAT GEN_TAC THEN
  2.3400 -  MATCH_MP_TAC GMEASURABLE_CONVEX THEN REWRITE_TAC[CONVEX_CONVEX_HULL] THEN
  2.3401 -  MATCH_MP_TAC BOUNDED_CONVEX_HULL THEN MATCH_MP_TAC FINITE_IMP_BOUNDED THEN
  2.3402 -  REWRITE_TAC[FINITE_INSERT; FINITE_RULES]);; *)
  2.3403 -
  2.3404 -lemma MEASURE_TRIANGLE: True .. (*
  2.3405 - "!a b c:real^2.
  2.3406 -        measure(convex hull {a,b,c}) =
  2.3407 -        abs((b$1 - a$1) * (c$2 - a$2) - (b$2 - a$2) * (c$1 - a$1)) / 2"
  2.3408 -qed   REWRITE_TAC[REWRITE_RULE[HAS_GMEASURE_MEASURABLE_MEASURE]
  2.3409 -               HAS_GMEASURE_TRIANGLE]);; *)
  2.3410 -
  2.3411 -(* ------------------------------------------------------------------------- *)
  2.3412 -(* Volume of a tetrahedron.                                                  *)
  2.3413 -(* ------------------------------------------------------------------------- *)
  2.3414 -
  2.3415 -lemma HAS_GMEASURE_TETRAHEDRON: True .. (*
  2.3416 - "!a b c d:real^3.
  2.3417 -        convex hull {a,b,c,d} has_gmeasure
  2.3418 -        abs((b$1 - a$1) * (c$2 - a$2) * (d$3 - a$3) +
  2.3419 -            (b$2 - a$2) * (c$3 - a$3) * (d$1 - a$1) +
  2.3420 -            (b$3 - a$3) * (c$1 - a$1) * (d$2 - a$2) -
  2.3421 -            (b$1 - a$1) * (c$3 - a$3) * (d$2 - a$2) -
  2.3422 -            (b$2 - a$2) * (c$1 - a$1) * (d$3 - a$3) -
  2.3423 -            (b$3 - a$3) * (c$2 - a$2) * (d$1 - a$1)) /
  2.3424 -           6"
  2.3425 -qed   REPEAT STRIP_TAC THEN
  2.3426 -  MP_TAC(ISPECL [`a:real^3`; `[b;c;d]:(real^3)list`] HAS_GMEASURE_SIMPLEX) THEN
  2.3427 -  REWRITE_TAC[LENGTH; DIMINDEX_3; ARITH; set_of_list; MAP] THEN
  2.3428 -  CONV_TAC NUM_REDUCE_CONV THEN SIMP_TAC[DET_3; VECTOR_3] THEN
  2.3429 -  SIMP_TAC[VECTOR_SUB_COMPONENT; DIMINDEX_3; ARITH]);; *)
  2.3430 -
  2.3431 -lemma GMEASURABLE_TETRAHEDRON: True .. (*
  2.3432 - "!a b c d:real^N. gmeasurable(convex hull {a,b,c,d})"
  2.3433 -qed   REPEAT GEN_TAC THEN
  2.3434 -  MATCH_MP_TAC GMEASURABLE_CONVEX THEN REWRITE_TAC[CONVEX_CONVEX_HULL] THEN
  2.3435 -  MATCH_MP_TAC BOUNDED_CONVEX_HULL THEN MATCH_MP_TAC FINITE_IMP_BOUNDED THEN
  2.3436 -  REWRITE_TAC[FINITE_INSERT; FINITE_RULES]);; *)
  2.3437 -
  2.3438 -lemma MEASURE_TETRAHEDRON: True .. (*
  2.3439 - "!a b c d:real^3.
  2.3440 -        measure(convex hull {a,b,c,d}) =
  2.3441 -        abs((b$1 - a$1) * (c$2 - a$2) * (d$3 - a$3) +
  2.3442 -            (b$2 - a$2) * (c$3 - a$3) * (d$1 - a$1) +
  2.3443 -            (b$3 - a$3) * (c$1 - a$1) * (d$2 - a$2) -
  2.3444 -            (b$1 - a$1) * (c$3 - a$3) * (d$2 - a$2) -
  2.3445 -            (b$2 - a$2) * (c$1 - a$1) * (d$3 - a$3) -
  2.3446 -            (b$3 - a$3) * (c$2 - a$2) * (d$1 - a$1)) / 6"
  2.3447 -qed   REWRITE_TAC[REWRITE_RULE[HAS_GMEASURE_MEASURABLE_MEASURE]
  2.3448 -               HAS_GMEASURE_TETRAHEDRON]);; *)
  2.3449 -
  2.3450 -end
     3.1 --- a/src/HOL/Multivariate_Analysis/Multivariate_Analysis.thy	Fri Jan 14 16:00:13 2011 +0100
     3.2 +++ b/src/HOL/Multivariate_Analysis/Multivariate_Analysis.thy	Tue Jan 18 21:37:23 2011 +0100
     3.3 @@ -1,5 +1,5 @@
     3.4  theory Multivariate_Analysis
     3.5 -imports Fashoda Gauge_Measure
     3.6 +imports Fashoda
     3.7  begin
     3.8  
     3.9  end
     4.1 --- a/src/HOL/Probability/Lebesgue_Measure.thy	Fri Jan 14 16:00:13 2011 +0100
     4.2 +++ b/src/HOL/Probability/Lebesgue_Measure.thy	Tue Jan 18 21:37:23 2011 +0100
     4.3 @@ -1,7 +1,7 @@
     4.4  (*  Author: Robert Himmelmann, TU Muenchen *)
     4.5  header {* Lebsegue measure *}
     4.6  theory Lebesgue_Measure
     4.7 -  imports Product_Measure Gauge_Measure Complete_Measure
     4.8 +  imports Product_Measure Complete_Measure
     4.9  begin
    4.10  
    4.11  subsection {* Standard Cubes *}
    4.12 @@ -42,144 +42,165 @@
    4.13      by (auto simp add:dist_norm)
    4.14  qed
    4.15  
    4.16 -lemma Union_inter_cube:"\<Union>{s \<inter> cube n |n. n \<in> UNIV} = s"
    4.17 -proof safe case goal1
    4.18 -  from mem_big_cube[of x] guess n . note n=this
    4.19 -  show ?case unfolding Union_iff apply(rule_tac x="s \<inter> cube n" in bexI)
    4.20 -    using n goal1 by auto
    4.21 +definition lebesgue :: "'a::ordered_euclidean_space algebra" where
    4.22 +  "lebesgue = \<lparr> space = UNIV, sets = {A. \<forall>n. (indicator A :: 'a \<Rightarrow> real) integrable_on cube n} \<rparr>"
    4.23 +
    4.24 +lemma space_lebesgue[simp]: "space lebesgue = UNIV"
    4.25 +  unfolding lebesgue_def by simp
    4.26 +
    4.27 +lemma lebesgueD: "A \<in> sets lebesgue \<Longrightarrow> (indicator A :: _ \<Rightarrow> real) integrable_on cube n"
    4.28 +  unfolding lebesgue_def by simp
    4.29 +
    4.30 +lemma lebesgueI: "(\<And>n. (indicator A :: _ \<Rightarrow> real) integrable_on cube n) \<Longrightarrow> A \<in> sets lebesgue"
    4.31 +  unfolding lebesgue_def by simp
    4.32 +
    4.33 +lemma absolutely_integrable_on_indicator[simp]:
    4.34 +  fixes A :: "'a::ordered_euclidean_space set"
    4.35 +  shows "((indicator A :: _ \<Rightarrow> real) absolutely_integrable_on X) \<longleftrightarrow>
    4.36 +    (indicator A :: _ \<Rightarrow> real) integrable_on X"
    4.37 +  unfolding absolutely_integrable_on_def by simp
    4.38 +
    4.39 +lemma LIMSEQ_indicator_UN:
    4.40 +  "(\<lambda>k. indicator (\<Union> i<k. A i) x) ----> (indicator (\<Union>i. A i) x :: real)"
    4.41 +proof cases
    4.42 +  assume "\<exists>i. x \<in> A i" then guess i .. note i = this
    4.43 +  then have *: "\<And>n. (indicator (\<Union> i<n + Suc i. A i) x :: real) = 1"
    4.44 +    "(indicator (\<Union> i. A i) x :: real) = 1" by (auto simp: indicator_def)
    4.45 +  show ?thesis
    4.46 +    apply (rule LIMSEQ_offset[of _ "Suc i"]) unfolding * by auto
    4.47 +qed (auto simp: indicator_def)
    4.48 +
    4.49 +lemma indicator_add:
    4.50 +  "A \<inter> B = {} \<Longrightarrow> (indicator A x::_::monoid_add) + indicator B x = indicator (A \<union> B) x"
    4.51 +  unfolding indicator_def by auto
    4.52 +
    4.53 +interpretation lebesgue: sigma_algebra lebesgue
    4.54 +proof (intro sigma_algebra_iff2[THEN iffD2] conjI allI ballI impI lebesgueI)
    4.55 +  fix A n assume A: "A \<in> sets lebesgue"
    4.56 +  have "indicator (space lebesgue - A) = (\<lambda>x. 1 - indicator A x :: real)"
    4.57 +    by (auto simp: fun_eq_iff indicator_def)
    4.58 +  then show "(indicator (space lebesgue - A) :: _ \<Rightarrow> real) integrable_on cube n"
    4.59 +    using A by (auto intro!: integrable_sub dest: lebesgueD simp: cube_def)
    4.60 +next
    4.61 +  fix n show "(indicator {} :: _\<Rightarrow>real) integrable_on cube n"
    4.62 +    by (auto simp: cube_def indicator_def_raw)
    4.63 +next
    4.64 +  fix A :: "nat \<Rightarrow> 'a set" and n ::nat assume "range A \<subseteq> sets lebesgue"
    4.65 +  then have A: "\<And>i. (indicator (A i) :: _ \<Rightarrow> real) integrable_on cube n"
    4.66 +    by (auto dest: lebesgueD)
    4.67 +  show "(indicator (\<Union>i. A i) :: _ \<Rightarrow> real) integrable_on cube n" (is "?g integrable_on _")
    4.68 +  proof (intro dominated_convergence[where g="?g"] ballI)
    4.69 +    fix k show "(indicator (\<Union>i<k. A i) :: _ \<Rightarrow> real) integrable_on cube n"
    4.70 +    proof (induct k)
    4.71 +      case (Suc k)
    4.72 +      have *: "(\<Union> i<Suc k. A i) = (\<Union> i<k. A i) \<union> A k"
    4.73 +        unfolding lessThan_Suc UN_insert by auto
    4.74 +      have *: "(\<lambda>x. max (indicator (\<Union> i<k. A i) x) (indicator (A k) x) :: real) =
    4.75 +          indicator (\<Union> i<Suc k. A i)" (is "(\<lambda>x. max (?f x) (?g x)) = _")
    4.76 +        by (auto simp: fun_eq_iff * indicator_def)
    4.77 +      show ?case
    4.78 +        using absolutely_integrable_max[of ?f "cube n" ?g] A Suc by (simp add: *)
    4.79 +    qed auto
    4.80 +  qed (auto intro: LIMSEQ_indicator_UN simp: cube_def)
    4.81 +qed simp
    4.82 +
    4.83 +definition "lmeasure A = (SUP n. Real (integral (cube n) (indicator A)))"
    4.84 +
    4.85 +interpretation lebesgue: measure_space lebesgue lmeasure
    4.86 +proof
    4.87 +  have *: "indicator {} = (\<lambda>x. 0 :: real)" by (simp add: fun_eq_iff)
    4.88 +  show "lmeasure {} = 0" by (simp add: integral_0 * lmeasure_def)
    4.89 +next
    4.90 +  show "countably_additive lebesgue lmeasure"
    4.91 +  proof (intro countably_additive_def[THEN iffD2] allI impI)
    4.92 +    fix A :: "nat \<Rightarrow> 'b set" assume rA: "range A \<subseteq> sets lebesgue" "disjoint_family A"
    4.93 +    then have A[simp, intro]: "\<And>i n. (indicator (A i) :: _ \<Rightarrow> real) integrable_on cube n"
    4.94 +      by (auto dest: lebesgueD)
    4.95 +    let "?m n i" = "integral (cube n) (indicator (A i) :: _\<Rightarrow>real)"
    4.96 +    let "?M n I" = "integral (cube n) (indicator (\<Union>i\<in>I. A i) :: _\<Rightarrow>real)"
    4.97 +    have nn[simp, intro]: "\<And>i n. 0 \<le> ?m n i" by (auto intro!: integral_nonneg)
    4.98 +    assume "(\<Union>i. A i) \<in> sets lebesgue"
    4.99 +    then have UN_A[simp, intro]: "\<And>i n. (indicator (\<Union>i. A i) :: _ \<Rightarrow> real) integrable_on cube n"
   4.100 +      by (auto dest: lebesgueD)
   4.101 +    show "(\<Sum>\<^isub>\<infinity>n. lmeasure (A n)) = lmeasure (\<Union>i. A i)" unfolding lmeasure_def
   4.102 +    proof (subst psuminf_SUP_eq)
   4.103 +      fix n i show "Real (?m n i) \<le> Real (?m (Suc n) i)"
   4.104 +        using cube_subset[of n "Suc n"] by (auto intro!: integral_subset_le)
   4.105 +    next
   4.106 +      show "(SUP n. \<Sum>\<^isub>\<infinity>i. Real (?m n i)) = (SUP n. Real (?M n UNIV))"
   4.107 +        unfolding psuminf_def
   4.108 +      proof (subst setsum_Real, (intro arg_cong[where f="SUPR UNIV"] ext ballI nn SUP_eq_LIMSEQ[THEN iffD2])+)
   4.109 +        fix n :: nat show "mono (\<lambda>m. \<Sum>x<m. ?m n x)"
   4.110 +        proof (intro mono_iff_le_Suc[THEN iffD2] allI)
   4.111 +          fix m show "(\<Sum>x<m. ?m n x) \<le> (\<Sum>x<Suc m. ?m n x)"
   4.112 +            using nn[of n m] by auto
   4.113 +        qed
   4.114 +        show "0 \<le> ?M n UNIV"
   4.115 +          using UN_A by (auto intro!: integral_nonneg)
   4.116 +        fix m show "0 \<le> (\<Sum>x<m. ?m n x)" by (auto intro!: setsum_nonneg)
   4.117 +      next
   4.118 +        fix n
   4.119 +        have "\<And>m. (UNION {..<m} A) \<in> sets lebesgue" using rA by auto
   4.120 +        from lebesgueD[OF this]
   4.121 +        have "(\<lambda>m. ?M n {..< m}) ----> ?M n UNIV"
   4.122 +          (is "(\<lambda>m. integral _ (?A m)) ----> ?I")
   4.123 +          by (intro dominated_convergence(2)[where f="?A" and h="\<lambda>x. 1::real"])
   4.124 +             (auto intro: LIMSEQ_indicator_UN simp: cube_def)
   4.125 +        moreover
   4.126 +        { fix m have *: "(\<Sum>x<m. ?m n x) = ?M n {..< m}"
   4.127 +          proof (induct m)
   4.128 +            case (Suc m)
   4.129 +            have "(\<Union>i<m. A i) \<in> sets lebesgue" using rA by auto
   4.130 +            then have "(indicator (\<Union>i<m. A i) :: _\<Rightarrow>real) integrable_on (cube n)"
   4.131 +              by (auto dest!: lebesgueD)
   4.132 +            moreover
   4.133 +            have "(\<Union>i<m. A i) \<inter> A m = {}"
   4.134 +              using rA(2)[unfolded disjoint_family_on_def, THEN bspec, of m]
   4.135 +              by auto
   4.136 +            then have "\<And>x. indicator (\<Union>i<Suc m. A i) x =
   4.137 +              indicator (\<Union>i<m. A i) x + (indicator (A m) x :: real)"
   4.138 +              by (auto simp: indicator_add lessThan_Suc ac_simps)
   4.139 +            ultimately show ?case
   4.140 +              using Suc A by (simp add: integral_add[symmetric])
   4.141 +          qed auto }
   4.142 +        ultimately show "(\<lambda>m. \<Sum>x<m. ?m n x) ----> ?M n UNIV"
   4.143 +          by simp
   4.144 +      qed
   4.145 +    qed
   4.146 +  qed
   4.147  qed
   4.148  
   4.149 -lemma gmeasurable_cube[intro]:"gmeasurable (cube n)"
   4.150 -  unfolding cube_def by auto
   4.151 -
   4.152 -lemma gmeasure_le_inter_cube[intro]: fixes s::"'a::ordered_euclidean_space set"
   4.153 -  assumes "gmeasurable (s \<inter> cube n)" shows "gmeasure (s \<inter> cube n) \<le> gmeasure (cube n::'a set)"
   4.154 -  apply(rule has_gmeasure_subset[of "s\<inter>cube n" _ "cube n"])
   4.155 -  unfolding has_gmeasure_measure[THEN sym] using assms by auto
   4.156 -
   4.157 -lemma has_gmeasure_cube[intro]: "(cube n::('a::ordered_euclidean_space) set)
   4.158 -  has_gmeasure ((2 * real n) ^ (DIM('a)))"
   4.159 -proof-
   4.160 -  have "content {\<chi>\<chi> i. - real n..(\<chi>\<chi> i. real n)::'a} = (2 * real n) ^ (DIM('a))"
   4.161 -    apply(subst content_closed_interval) defer
   4.162 -    by (auto simp add:setprod_constant)
   4.163 -  thus ?thesis unfolding cube_def
   4.164 -    using has_gmeasure_interval(1)[of "(\<chi>\<chi> i. - real n)::'a" "(\<chi>\<chi> i. real n)::'a"]
   4.165 -    by auto
   4.166 +lemma has_integral_interval_cube:
   4.167 +  fixes a b :: "'a::ordered_euclidean_space"
   4.168 +  shows "(indicator {a .. b} has_integral
   4.169 +    content ({\<chi>\<chi> i. max (- real n) (a $$ i) .. \<chi>\<chi> i. min (real n) (b $$ i)} :: 'a set)) (cube n)"
   4.170 +    (is "(?I has_integral content ?R) (cube n)")
   4.171 +proof -
   4.172 +  let "{?N .. ?P}" = ?R
   4.173 +  have [simp]: "(\<lambda>x. if x \<in> cube n then ?I x else 0) = indicator ?R"
   4.174 +    by (auto simp: indicator_def cube_def fun_eq_iff eucl_le[where 'a='a])
   4.175 +  have "(?I has_integral content ?R) (cube n) \<longleftrightarrow> (indicator ?R has_integral content ?R) UNIV"
   4.176 +    unfolding has_integral_restrict_univ[where s="cube n", symmetric] by simp
   4.177 +  also have "\<dots> \<longleftrightarrow> ((\<lambda>x. 1) has_integral content ?R) ?R"
   4.178 +    unfolding indicator_def_raw has_integral_restrict_univ ..
   4.179 +  finally show ?thesis
   4.180 +    using has_integral_const[of "1::real" "?N" "?P"] by simp
   4.181  qed
   4.182  
   4.183 -lemma gmeasure_cube_eq[simp]:
   4.184 -  "gmeasure (cube n::('a::ordered_euclidean_space) set) = (2 * real n) ^ DIM('a)"
   4.185 -  by (intro measure_unique) auto
   4.186 -
   4.187 -lemma gmeasure_cube_ge_n: "gmeasure (cube n::('a::ordered_euclidean_space) set) \<ge> real n"
   4.188 -proof cases
   4.189 -  assume "n = 0" then show ?thesis by simp
   4.190 -next
   4.191 -  assume "n \<noteq> 0"
   4.192 -  have "real n \<le> (2 * real n)^1" by simp
   4.193 -  also have "\<dots> \<le> (2 * real n)^DIM('a)"
   4.194 -    using DIM_positive[where 'a='a] `n \<noteq> 0`
   4.195 -    by (intro power_increasing) auto
   4.196 -  also have "\<dots> = gmeasure (cube n::'a set)" by simp
   4.197 -  finally show ?thesis .
   4.198 -qed
   4.199 -
   4.200 -lemma gmeasure_setsum:
   4.201 -  assumes "finite A" and "\<And>s t. s \<in> A \<Longrightarrow> t \<in> A \<Longrightarrow> s \<noteq> t \<Longrightarrow> f s \<inter> f t = {}"
   4.202 -    and "\<And>i. i \<in> A \<Longrightarrow> gmeasurable (f i)"
   4.203 -  shows "gmeasure (\<Union>i\<in>A. f i) = (\<Sum>i\<in>A. gmeasure (f i))"
   4.204 +lemma lebesgueI_borel[intro, simp]:
   4.205 +  fixes s::"'a::ordered_euclidean_space set"
   4.206 +  assumes "s \<in> sets borel" shows "s \<in> sets lebesgue"
   4.207  proof -
   4.208 -  have "gmeasure (\<Union>i\<in>A. f i) = gmeasure (\<Union>f ` A)" by auto
   4.209 -  also have "\<dots> = setsum gmeasure (f ` A)" using assms
   4.210 -  proof (intro measure_negligible_unions)
   4.211 -    fix X Y assume "X \<in> f`A" "Y \<in> f`A" "X \<noteq> Y"
   4.212 -    then have "X \<inter> Y = {}" using assms by auto
   4.213 -    then show "negligible (X \<inter> Y)" by auto
   4.214 -  qed auto
   4.215 -  also have "\<dots> = setsum gmeasure (f ` A - {{}})"
   4.216 -    using assms by (intro setsum_mono_zero_cong_right) auto
   4.217 -  also have "\<dots> = (\<Sum>i\<in>A - {i. f i = {}}. gmeasure (f i))"
   4.218 -  proof (intro setsum_reindex_cong inj_onI)
   4.219 -    fix s t assume *: "s \<in> A - {i. f i = {}}" "t \<in> A - {i. f i = {}}" "f s = f t"
   4.220 -    show "s = t"
   4.221 -    proof (rule ccontr)
   4.222 -      assume "s \<noteq> t" with assms(2)[of s t] * show False by auto
   4.223 -    qed
   4.224 -  qed auto
   4.225 -  also have "\<dots> = (\<Sum>i\<in>A. gmeasure (f i))"
   4.226 -    using assms by (intro setsum_mono_zero_cong_left) auto
   4.227 -  finally show ?thesis .
   4.228 -qed
   4.229 -
   4.230 -lemma gmeasurable_finite_UNION[intro]:
   4.231 -  assumes "\<And>i. i \<in> S \<Longrightarrow> gmeasurable (A i)" "finite S"
   4.232 -  shows "gmeasurable (\<Union>i\<in>S. A i)"
   4.233 -  unfolding UNION_eq_Union_image using assms
   4.234 -  by (intro gmeasurable_finite_unions) auto
   4.235 -
   4.236 -lemma gmeasurable_countable_UNION[intro]:
   4.237 -  fixes A :: "nat \<Rightarrow> ('a::ordered_euclidean_space) set"
   4.238 -  assumes measurable: "\<And>i. gmeasurable (A i)"
   4.239 -    and finite: "\<And>n. gmeasure (UNION {.. n} A) \<le> B"
   4.240 -  shows "gmeasurable (\<Union>i. A i)"
   4.241 -proof -
   4.242 -  have *: "\<And>n. \<Union>{A k |k. k \<le> n} = (\<Union>i\<le>n. A i)"
   4.243 -    "(\<Union>{A n |n. n \<in> UNIV}) = (\<Union>i. A i)" by auto
   4.244 -  show ?thesis
   4.245 -    by (rule gmeasurable_countable_unions_strong[of A B, unfolded *, OF assms])
   4.246 -qed
   4.247 -
   4.248 -subsection {* Measurability *}
   4.249 -
   4.250 -definition lebesgue :: "'a::ordered_euclidean_space algebra" where
   4.251 -  "lebesgue = \<lparr> space = UNIV, sets = {A. \<forall>n. gmeasurable (A \<inter> cube n)} \<rparr>"
   4.252 -
   4.253 -lemma space_lebesgue[simp]:"space lebesgue = UNIV"
   4.254 -  unfolding lebesgue_def by auto
   4.255 -
   4.256 -lemma lebesgueD[dest]: assumes "S \<in> sets lebesgue"
   4.257 -  shows "\<And>n. gmeasurable (S \<inter> cube n)"
   4.258 -  using assms unfolding lebesgue_def by auto
   4.259 -
   4.260 -lemma lebesgueI[intro]: assumes "gmeasurable S"
   4.261 -  shows "S \<in> sets lebesgue" unfolding lebesgue_def cube_def
   4.262 -  using assms gmeasurable_interval by auto
   4.263 -
   4.264 -lemma lebesgueI2: "(\<And>n. gmeasurable (S \<inter> cube n)) \<Longrightarrow> S \<in> sets lebesgue"
   4.265 -  using assms unfolding lebesgue_def by auto
   4.266 -
   4.267 -interpretation lebesgue: sigma_algebra lebesgue
   4.268 -proof
   4.269 -  show "sets lebesgue \<subseteq> Pow (space lebesgue)"
   4.270 -    unfolding lebesgue_def by auto
   4.271 -  show "{} \<in> sets lebesgue"
   4.272 -    using gmeasurable_empty by auto
   4.273 -  { fix A B :: "'a set" assume "A \<in> sets lebesgue" "B \<in> sets lebesgue"
   4.274 -    then show "A \<union> B \<in> sets lebesgue"
   4.275 -      by (auto intro: gmeasurable_union simp: lebesgue_def Int_Un_distrib2) }
   4.276 -  { fix A :: "nat \<Rightarrow> 'a set" assume A: "range A \<subseteq> sets lebesgue"
   4.277 -    show "(\<Union>i. A i) \<in> sets lebesgue"
   4.278 -    proof (rule lebesgueI2)
   4.279 -      fix n show "gmeasurable ((\<Union>i. A i) \<inter> cube n)" unfolding UN_extend_simps
   4.280 -        using A
   4.281 -        by (intro gmeasurable_countable_UNION[where B="gmeasure (cube n::'a set)"])
   4.282 -           (auto intro!: measure_subset gmeasure_setsum simp: UN_extend_simps simp del: gmeasure_cube_eq UN_simps)
   4.283 -    qed }
   4.284 -  { fix A assume A: "A \<in> sets lebesgue" show "space lebesgue - A \<in> sets lebesgue"
   4.285 -    proof (rule lebesgueI2)
   4.286 -      fix n
   4.287 -      have *: "(space lebesgue - A) \<inter> cube n = cube n - (A \<inter> cube n)"
   4.288 -        unfolding lebesgue_def by auto
   4.289 -      show "gmeasurable ((space lebesgue - A) \<inter> cube n)" unfolding *
   4.290 -        using A by (auto intro!: gmeasurable_diff)
   4.291 -    qed }
   4.292 -qed
   4.293 -
   4.294 -lemma lebesgueI_borel[intro, simp]: fixes s::"'a::ordered_euclidean_space set"
   4.295 -  assumes "s \<in> sets borel" shows "s \<in> sets lebesgue"
   4.296 -proof- let ?S = "range (\<lambda>(a, b). {a .. (b :: 'a\<Colon>ordered_euclidean_space)})"
   4.297 -  have *:"?S \<subseteq> sets lebesgue" by auto
   4.298 +  let ?S = "range (\<lambda>(a, b). {a .. (b :: 'a\<Colon>ordered_euclidean_space)})"
   4.299 +  have *:"?S \<subseteq> sets lebesgue"
   4.300 +  proof (safe intro!: lebesgueI)
   4.301 +    fix n :: nat and a b :: 'a
   4.302 +    let ?N = "\<chi>\<chi> i. max (- real n) (a $$ i)"
   4.303 +    let ?P = "\<chi>\<chi> i. min (real n) (b $$ i)"
   4.304 +    show "(indicator {a..b} :: 'a\<Rightarrow>real) integrable_on cube n"
   4.305 +      unfolding integrable_on_def
   4.306 +      using has_integral_interval_cube[of a b] by auto
   4.307 +  qed
   4.308    have "s \<in> sigma_sets UNIV ?S" using assms
   4.309      unfolding borel_eq_atLeastAtMost by (simp add: sigma_def)
   4.310    thus ?thesis
   4.311 @@ -189,171 +210,153 @@
   4.312  
   4.313  lemma lebesgueI_negligible[dest]: fixes s::"'a::ordered_euclidean_space set"
   4.314    assumes "negligible s" shows "s \<in> sets lebesgue"
   4.315 -proof (rule lebesgueI2)
   4.316 -  fix n
   4.317 -  have *:"\<And>x. (if x \<in> cube n then indicator s x else 0) = (if x \<in> s \<inter> cube n then 1 else 0)"
   4.318 -    unfolding indicator_def_raw by auto
   4.319 -  note assms[unfolded negligible_def,rule_format,of "(\<chi>\<chi> i. - real n)::'a" "\<chi>\<chi> i. real n"]
   4.320 -  thus "gmeasurable (s \<inter> cube n)" apply-apply(rule gmeasurableI[of _ 0]) unfolding has_gmeasure_def
   4.321 -    apply(subst(asm) has_integral_restrict_univ[THEN sym]) unfolding cube_def[symmetric]
   4.322 -    apply(subst has_integral_restrict_univ[THEN sym]) unfolding * .
   4.323 -qed
   4.324 +  using assms by (force simp: cube_def integrable_on_def negligible_def intro!: lebesgueI)
   4.325  
   4.326 -section {* The Lebesgue Measure *}
   4.327 -
   4.328 -definition "lmeasure A = (SUP n. Real (gmeasure (A \<inter> cube n)))"
   4.329 -
   4.330 -lemma lmeasure_eq_0: assumes "negligible S" shows "lmeasure S = 0"
   4.331 +lemma lmeasure_eq_0:
   4.332 +  fixes S :: "'a::ordered_euclidean_space set" assumes "negligible S" shows "lmeasure S = 0"
   4.333  proof -
   4.334 -  from lebesgueI_negligible[OF assms]
   4.335 -  have "\<And>n. gmeasurable (S \<inter> cube n)" by auto
   4.336 -  from gmeasurable_measure_eq_0[OF this]
   4.337 -  have "\<And>n. gmeasure (S \<inter> cube n) = 0" using assms by auto
   4.338 -  then show ?thesis unfolding lmeasure_def by simp
   4.339 +  have "\<And>n. integral (cube n) (indicator S :: 'a\<Rightarrow>real) = 0"
   4.340 +    unfolding integral_def using assms
   4.341 +    by (intro some1_equality ex_ex1I has_integral_unique)
   4.342 +       (auto simp: cube_def negligible_def intro: )
   4.343 +  then show ?thesis unfolding lmeasure_def by auto
   4.344  qed
   4.345  
   4.346  lemma lmeasure_iff_LIMSEQ:
   4.347    assumes "A \<in> sets lebesgue" "0 \<le> m"
   4.348 -  shows "lmeasure A = Real m \<longleftrightarrow> (\<lambda>n. (gmeasure (A \<inter> cube n))) ----> m"
   4.349 -  unfolding lmeasure_def using assms cube_subset[where 'a='a]
   4.350 -  by (intro SUP_eq_LIMSEQ monoI measure_subset) force+
   4.351 +  shows "lmeasure A = Real m \<longleftrightarrow> (\<lambda>n. integral (cube n) (indicator A :: _ \<Rightarrow> real)) ----> m"
   4.352 +  unfolding lmeasure_def
   4.353 +proof (intro SUP_eq_LIMSEQ)
   4.354 +  show "mono (\<lambda>n. integral (cube n) (indicator A::_=>real))"
   4.355 +    using cube_subset assms by (intro monoI integral_subset_le) (auto dest!: lebesgueD)
   4.356 +  fix n show "0 \<le> integral (cube n) (indicator A::_=>real)"
   4.357 +    using assms by (auto dest!: lebesgueD intro!: integral_nonneg)
   4.358 +qed fact
   4.359  
   4.360 -interpretation lebesgue: measure_space lebesgue lmeasure
   4.361 -proof
   4.362 -  show "lmeasure {} = 0"
   4.363 -    by (auto intro!: lmeasure_eq_0)
   4.364 -  show "countably_additive lebesgue lmeasure"
   4.365 -  proof (unfold countably_additive_def, intro allI impI conjI)
   4.366 -    fix A :: "nat \<Rightarrow> 'b set" assume "range A \<subseteq> sets lebesgue" "disjoint_family A"
   4.367 -    then have A: "\<And>i. A i \<in> sets lebesgue" by auto
   4.368 -    show "(\<Sum>\<^isub>\<infinity>n. lmeasure (A n)) = lmeasure (\<Union>i. A i)" unfolding lmeasure_def
   4.369 -    proof (subst psuminf_SUP_eq)
   4.370 -      { fix i n
   4.371 -        have "gmeasure (A i \<inter> cube n) \<le> gmeasure (A i \<inter> cube (Suc n))"
   4.372 -          using A cube_subset[of n "Suc n"] by (auto intro!: measure_subset)
   4.373 -        then show "Real (gmeasure (A i \<inter> cube n)) \<le> Real (gmeasure (A i \<inter> cube (Suc n)))"
   4.374 -          by auto }
   4.375 -      show "(SUP n. \<Sum>\<^isub>\<infinity>i. Real (gmeasure (A i \<inter> cube n))) = (SUP n. Real (gmeasure ((\<Union>i. A i) \<inter> cube n)))"
   4.376 -      proof (intro arg_cong[where f="SUPR UNIV"] ext)
   4.377 -        fix n
   4.378 -        have sums: "(\<lambda>i. gmeasure (A i \<inter> cube n)) sums gmeasure (\<Union>{A i \<inter> cube n |i. i \<in> UNIV})"
   4.379 -        proof (rule has_gmeasure_countable_negligible_unions(2))
   4.380 -          fix i show "gmeasurable (A i \<inter> cube n)" using A by auto
   4.381 -        next
   4.382 -          fix i m :: nat assume "m \<noteq> i"
   4.383 -          then have "A m \<inter> cube n \<inter> (A i \<inter> cube n) = {}"
   4.384 -            using `disjoint_family A` unfolding disjoint_family_on_def by auto
   4.385 -          then show "negligible (A m \<inter> cube n \<inter> (A i \<inter> cube n))" by auto
   4.386 -        next
   4.387 -          fix i
   4.388 -          have "(\<Sum>k = 0..i. gmeasure (A k \<inter> cube n)) = gmeasure (\<Union>k\<le>i . A k \<inter> cube n)"
   4.389 -            unfolding atLeast0AtMost using A
   4.390 -          proof (intro gmeasure_setsum[symmetric])
   4.391 -            fix s t :: nat assume "s \<noteq> t" then have "A t \<inter> A s = {}"
   4.392 -              using `disjoint_family A` unfolding disjoint_family_on_def by auto
   4.393 -            then show "A s \<inter> cube n \<inter> (A t \<inter> cube n) = {}" by auto
   4.394 -          qed auto
   4.395 -          also have "\<dots> \<le> gmeasure (cube n :: 'b set)" using A
   4.396 -            by (intro measure_subset gmeasurable_finite_UNION) auto
   4.397 -          finally show "(\<Sum>k = 0..i. gmeasure (A k \<inter> cube n)) \<le> gmeasure (cube n :: 'b set)" .
   4.398 -        qed
   4.399 -        show "(\<Sum>\<^isub>\<infinity>i. Real (gmeasure (A i \<inter> cube n))) = Real (gmeasure ((\<Union>i. A i) \<inter> cube n))"
   4.400 -          unfolding psuminf_def
   4.401 -          apply (subst setsum_Real)
   4.402 -          apply (simp add: measure_pos_le)
   4.403 -        proof (rule SUP_eq_LIMSEQ[THEN iffD2])
   4.404 -          have "(\<Union>{A i \<inter> cube n |i. i \<in> UNIV}) = (\<Union>i. A i) \<inter> cube n" by auto
   4.405 -          with sums show "(\<lambda>i. \<Sum>k<i. gmeasure (A k \<inter> cube n)) ----> gmeasure ((\<Union>i. A i) \<inter> cube n)"
   4.406 -            unfolding sums_def atLeast0LessThan by simp
   4.407 -        qed (auto intro!: monoI setsum_nonneg setsum_mono2)
   4.408 -      qed
   4.409 -    qed
   4.410 -  qed
   4.411 +lemma has_integral_indicator_UNIV:
   4.412 +  fixes s A :: "'a::ordered_euclidean_space set" and x :: real
   4.413 +  shows "((indicator (s \<inter> A) :: 'a\<Rightarrow>real) has_integral x) UNIV = ((indicator s :: _\<Rightarrow>real) has_integral x) A"
   4.414 +proof -
   4.415 +  have "(\<lambda>x. if x \<in> A then indicator s x else 0) = (indicator (s \<inter> A) :: _\<Rightarrow>real)"
   4.416 +    by (auto simp: fun_eq_iff indicator_def)
   4.417 +  then show ?thesis
   4.418 +    unfolding has_integral_restrict_univ[where s=A, symmetric] by simp
   4.419  qed
   4.420  
   4.421 -lemma lmeasure_finite_has_gmeasure: assumes "s \<in> sets lebesgue" "lmeasure s = Real m" "0 \<le> m"
   4.422 -  shows "s has_gmeasure m"
   4.423 -proof-
   4.424 -  have *:"(\<lambda>n. (gmeasure (s \<inter> cube n))) ----> m"
   4.425 -    using `lmeasure s = Real m` unfolding lmeasure_iff_LIMSEQ[OF `s \<in> sets lebesgue` `0 \<le> m`] .
   4.426 -  have s: "\<And>n. gmeasurable (s \<inter> cube n)" using assms by auto
   4.427 -  have "(\<lambda>x. if x \<in> s then 1 else (0::real)) integrable_on UNIV \<and>
   4.428 -    (\<lambda>k. integral UNIV (\<lambda>x. if x \<in> s \<inter> cube k then 1 else (0::real)))
   4.429 -    ----> integral UNIV (\<lambda>x. if x \<in> s then 1 else 0)"
   4.430 -  proof(rule monotone_convergence_increasing)
   4.431 -    have "lmeasure s \<le> Real m" using `lmeasure s = Real m` by simp
   4.432 -    then have "\<forall>n. gmeasure (s \<inter> cube n) \<le> m"
   4.433 -      unfolding lmeasure_def complete_lattice_class.SUP_le_iff
   4.434 -      using `0 \<le> m` by (auto simp: measure_pos_le)
   4.435 -    thus *:"bounded {integral UNIV (\<lambda>x. if x \<in> s \<inter> cube k then 1 else (0::real)) |k. True}"
   4.436 -      unfolding integral_measure_univ[OF s] bounded_def apply-
   4.437 -      apply(rule_tac x=0 in exI,rule_tac x=m in exI) unfolding dist_real_def
   4.438 -      by (auto simp: measure_pos_le)
   4.439 -    show "\<forall>k. (\<lambda>x. if x \<in> s \<inter> cube k then (1::real) else 0) integrable_on UNIV"
   4.440 -      unfolding integrable_restrict_univ
   4.441 -      using s unfolding gmeasurable_def has_gmeasure_def by auto
   4.442 -    have *:"\<And>n. n \<le> Suc n" by auto
   4.443 -    show "\<forall>k. \<forall>x\<in>UNIV. (if x \<in> s \<inter> cube k then 1 else 0) \<le> (if x \<in> s \<inter> cube (Suc k) then 1 else (0::real))"
   4.444 -      using cube_subset[OF *] by fastsimp
   4.445 -    show "\<forall>x\<in>UNIV. (\<lambda>k. if x \<in> s \<inter> cube k then 1 else 0) ----> (if x \<in> s then 1 else (0::real))"
   4.446 -      unfolding Lim_sequentially
   4.447 -    proof safe case goal1 from real_arch_lt[of "norm x"] guess N .. note N = this
   4.448 -      show ?case apply(rule_tac x=N in exI)
   4.449 -      proof safe case goal1
   4.450 -        have "x \<in> cube n" using cube_subset[OF goal1] N
   4.451 -          using ball_subset_cube[of N] by(auto simp: dist_norm)
   4.452 -        thus ?case using `e>0` by auto
   4.453 -      qed
   4.454 -    qed
   4.455 -  qed note ** = conjunctD2[OF this]
   4.456 -  hence *:"m = integral UNIV (\<lambda>x. if x \<in> s then 1 else 0)" apply-
   4.457 -    apply(rule LIMSEQ_unique[OF _ **(2)]) unfolding measure_integral_univ[THEN sym,OF s] using * .
   4.458 -  show ?thesis unfolding has_gmeasure * apply(rule integrable_integral) using ** by auto
   4.459 +lemma
   4.460 +  fixes s a :: "'a::ordered_euclidean_space set"
   4.461 +  shows integral_indicator_UNIV:
   4.462 +    "integral UNIV (indicator (s \<inter> A) :: 'a\<Rightarrow>real) = integral A (indicator s :: _\<Rightarrow>real)"
   4.463 +  and integrable_indicator_UNIV:
   4.464 +    "(indicator (s \<inter> A) :: 'a\<Rightarrow>real) integrable_on UNIV \<longleftrightarrow> (indicator s :: 'a\<Rightarrow>real) integrable_on A"
   4.465 +  unfolding integral_def integrable_on_def has_integral_indicator_UNIV by auto
   4.466 +
   4.467 +lemma lmeasure_finite_has_integral:
   4.468 +  fixes s :: "'a::ordered_euclidean_space set"
   4.469 +  assumes "s \<in> sets lebesgue" "lmeasure s = Real m" "0 \<le> m"
   4.470 +  shows "(indicator s has_integral m) UNIV"
   4.471 +proof -
   4.472 +  let ?I = "indicator :: 'a set \<Rightarrow> 'a \<Rightarrow> real"
   4.473 +  have **: "(?I s) integrable_on UNIV \<and> (\<lambda>k. integral UNIV (?I (s \<inter> cube k))) ----> integral UNIV (?I s)"
   4.474 +  proof (intro monotone_convergence_increasing allI ballI)
   4.475 +    have LIMSEQ: "(\<lambda>n. integral (cube n) (?I s)) ----> m"
   4.476 +      using assms(2) unfolding lmeasure_iff_LIMSEQ[OF assms(1, 3)] .
   4.477 +    { fix n have "integral (cube n) (?I s) \<le> m"
   4.478 +        using cube_subset assms
   4.479 +        by (intro incseq_le[where L=m] LIMSEQ incseq_def[THEN iffD2] integral_subset_le allI impI)
   4.480 +           (auto dest!: lebesgueD) }
   4.481 +    moreover
   4.482 +    { fix n have "0 \<le> integral (cube n) (?I s)"
   4.483 +      using assms by (auto dest!: lebesgueD intro!: integral_nonneg) }
   4.484 +    ultimately
   4.485 +    show "bounded {integral UNIV (?I (s \<inter> cube k)) |k. True}"
   4.486 +      unfolding bounded_def
   4.487 +      apply (rule_tac exI[of _ 0])
   4.488 +      apply (rule_tac exI[of _ m])
   4.489 +      by (auto simp: dist_real_def integral_indicator_UNIV)
   4.490 +    fix k show "?I (s \<inter> cube k) integrable_on UNIV"
   4.491 +      unfolding integrable_indicator_UNIV using assms by (auto dest!: lebesgueD)
   4.492 +    fix x show "?I (s \<inter> cube k) x \<le> ?I (s \<inter> cube (Suc k)) x"
   4.493 +      using cube_subset[of k "Suc k"] by (auto simp: indicator_def)
   4.494 +  next
   4.495 +    fix x :: 'a
   4.496 +    from mem_big_cube obtain k where k: "x \<in> cube k" .
   4.497 +    { fix n have "?I (s \<inter> cube (n + k)) x = ?I s x"
   4.498 +      using k cube_subset[of k "n + k"] by (auto simp: indicator_def) }
   4.499 +    note * = this
   4.500 +    show "(\<lambda>k. ?I (s \<inter> cube k) x) ----> ?I s x"
   4.501 +      by (rule LIMSEQ_offset[where k=k]) (auto simp: *)
   4.502 +  qed
   4.503 +  note ** = conjunctD2[OF this]
   4.504 +  have m: "m = integral UNIV (?I s)"
   4.505 +    apply (intro LIMSEQ_unique[OF _ **(2)])
   4.506 +    using assms(2) unfolding lmeasure_iff_LIMSEQ[OF assms(1,3)] integral_indicator_UNIV .
   4.507 +  show ?thesis
   4.508 +    unfolding m by (intro integrable_integral **)
   4.509  qed
   4.510  
   4.511 -lemma lmeasure_finite_gmeasurable: assumes "s \<in> sets lebesgue" "lmeasure s \<noteq> \<omega>"
   4.512 -  shows "gmeasurable s"
   4.513 +lemma lmeasure_finite_integrable: assumes "s \<in> sets lebesgue" "lmeasure s \<noteq> \<omega>"
   4.514 +  shows "(indicator s :: _ \<Rightarrow> real) integrable_on UNIV"
   4.515  proof (cases "lmeasure s")
   4.516 -  case (preal m) from lmeasure_finite_has_gmeasure[OF `s \<in> sets lebesgue` this]
   4.517 -  show ?thesis unfolding gmeasurable_def by auto
   4.518 +  case (preal m) from lmeasure_finite_has_integral[OF `s \<in> sets lebesgue` this]
   4.519 +  show ?thesis unfolding integrable_on_def by auto
   4.520  qed (insert assms, auto)
   4.521  
   4.522 -lemma has_gmeasure_lmeasure: assumes "s has_gmeasure m"
   4.523 -  shows "lmeasure s = Real m"
   4.524 -proof-
   4.525 -  have gmea:"gmeasurable s" using assms by auto
   4.526 -  then have s: "s \<in> sets lebesgue" by auto
   4.527 -  have m:"m \<ge> 0" using assms by auto
   4.528 -  have *:"m = gmeasure (\<Union>{s \<inter> cube n |n. n \<in> UNIV})" unfolding Union_inter_cube
   4.529 -    using assms by(rule measure_unique[THEN sym])
   4.530 -  show ?thesis
   4.531 -    unfolding lmeasure_iff_LIMSEQ[OF s `0 \<le> m`] unfolding *
   4.532 -    apply(rule gmeasurable_nested_unions[THEN conjunct2, where B1="gmeasure s"])
   4.533 -  proof- fix n::nat show *:"gmeasurable (s \<inter> cube n)"
   4.534 -      using gmeasurable_inter[OF gmea gmeasurable_cube] .
   4.535 -    show "gmeasure (s \<inter> cube n) \<le> gmeasure s" apply(rule measure_subset)
   4.536 -      apply(rule * gmea)+ by auto
   4.537 -    show "s \<inter> cube n \<subseteq> s \<inter> cube (Suc n)" using cube_subset[of n "Suc n"] by auto
   4.538 -  qed
   4.539 +lemma has_integral_lebesgue: assumes "((indicator s :: _\<Rightarrow>real) has_integral m) UNIV"
   4.540 +  shows "s \<in> sets lebesgue"
   4.541 +proof (intro lebesgueI)
   4.542 +  let ?I = "indicator :: 'a set \<Rightarrow> 'a \<Rightarrow> real"
   4.543 +  fix n show "(?I s) integrable_on cube n" unfolding cube_def
   4.544 +  proof (intro integrable_on_subinterval)
   4.545 +    show "(?I s) integrable_on UNIV"
   4.546 +      unfolding integrable_on_def using assms by auto
   4.547 +  qed auto
   4.548  qed
   4.549  
   4.550 -lemma has_gmeasure_iff_lmeasure:
   4.551 -  "A has_gmeasure m \<longleftrightarrow> (A \<in> sets lebesgue \<and> 0 \<le> m \<and> lmeasure A = Real m)"
   4.552 +lemma has_integral_lmeasure: assumes "((indicator s :: _\<Rightarrow>real) has_integral m) UNIV"
   4.553 +  shows "lmeasure s = Real m"
   4.554 +proof (intro lmeasure_iff_LIMSEQ[THEN iffD2])
   4.555 +  let ?I = "indicator :: 'a set \<Rightarrow> 'a \<Rightarrow> real"
   4.556 +  show "s \<in> sets lebesgue" using has_integral_lebesgue[OF assms] .
   4.557 +  show "0 \<le> m" using assms by (rule has_integral_nonneg) auto
   4.558 +  have "(\<lambda>n. integral UNIV (?I (s \<inter> cube n))) ----> integral UNIV (?I s)"
   4.559 +  proof (intro dominated_convergence(2) ballI)
   4.560 +    show "(?I s) integrable_on UNIV" unfolding integrable_on_def using assms by auto
   4.561 +    fix n show "?I (s \<inter> cube n) integrable_on UNIV"
   4.562 +      unfolding integrable_indicator_UNIV using `s \<in> sets lebesgue` by (auto dest: lebesgueD)
   4.563 +    fix x show "norm (?I (s \<inter> cube n) x) \<le> ?I s x" by (auto simp: indicator_def)
   4.564 +  next
   4.565 +    fix x :: 'a
   4.566 +    from mem_big_cube obtain k where k: "x \<in> cube k" .
   4.567 +    { fix n have "?I (s \<inter> cube (n + k)) x = ?I s x"
   4.568 +      using k cube_subset[of k "n + k"] by (auto simp: indicator_def) }
   4.569 +    note * = this
   4.570 +    show "(\<lambda>k. ?I (s \<inter> cube k) x) ----> ?I s x"
   4.571 +      by (rule LIMSEQ_offset[where k=k]) (auto simp: *)
   4.572 +  qed
   4.573 +  then show "(\<lambda>n. integral (cube n) (?I s)) ----> m"
   4.574 +    unfolding integral_unique[OF assms] integral_indicator_UNIV by simp
   4.575 +qed
   4.576 +
   4.577 +lemma has_integral_iff_lmeasure:
   4.578 +  "(indicator A has_integral m) UNIV \<longleftrightarrow> (A \<in> sets lebesgue \<and> 0 \<le> m \<and> lmeasure A = Real m)"
   4.579  proof
   4.580 -  assume "A has_gmeasure m"
   4.581 -  with has_gmeasure_lmeasure[OF this]
   4.582 -  have "gmeasurable A" "0 \<le> m" "lmeasure A = Real m" by auto
   4.583 -  then show "A \<in> sets lebesgue \<and> 0 \<le> m \<and> lmeasure A = Real m" by auto
   4.584 +  assume "(indicator A has_integral m) UNIV"
   4.585 +  with has_integral_lmeasure[OF this] has_integral_lebesgue[OF this]
   4.586 +  show "A \<in> sets lebesgue \<and> 0 \<le> m \<and> lmeasure A = Real m"
   4.587 +    by (auto intro: has_integral_nonneg)
   4.588  next
   4.589    assume "A \<in> sets lebesgue \<and> 0 \<le> m \<and> lmeasure A = Real m"
   4.590 -  then show "A has_gmeasure m" by (intro lmeasure_finite_has_gmeasure) auto
   4.591 +  then show "(indicator A has_integral m) UNIV" by (intro lmeasure_finite_has_integral) auto
   4.592  qed
   4.593  
   4.594 -lemma gmeasure_lmeasure: assumes "gmeasurable s" shows "lmeasure s = Real (gmeasure s)"
   4.595 -proof -
   4.596 -  note has_gmeasure_measureI[OF assms]
   4.597 -  note has_gmeasure_lmeasure[OF this]
   4.598 -  thus ?thesis .
   4.599 +lemma lmeasure_eq_integral: assumes "(indicator s::_\<Rightarrow>real) integrable_on UNIV"
   4.600 +  shows "lmeasure s = Real (integral UNIV (indicator s))"
   4.601 +  using assms unfolding integrable_on_def
   4.602 +proof safe
   4.603 +  fix y :: real assume "(indicator s has_integral y) UNIV"
   4.604 +  from this[unfolded has_integral_iff_lmeasure] integral_unique[OF this]
   4.605 +  show "lmeasure s = Real (integral UNIV (indicator s))" by simp
   4.606  qed
   4.607  
   4.608  lemma lebesgue_simple_function_indicator:
   4.609 @@ -362,12 +365,12 @@
   4.610    shows "f = (\<lambda>x. (\<Sum>y \<in> f ` UNIV. y * indicator (f -` {y}) x))"
   4.611    apply(rule,subst lebesgue.simple_function_indicator_representation[OF f]) by auto
   4.612  
   4.613 -lemma lmeasure_gmeasure:
   4.614 -  "gmeasurable s \<Longrightarrow> gmeasure s = real (lmeasure s)"
   4.615 -  by (subst gmeasure_lmeasure) auto
   4.616 +lemma integral_eq_lmeasure:
   4.617 +  "(indicator s::_\<Rightarrow>real) integrable_on UNIV \<Longrightarrow> integral UNIV (indicator s) = real (lmeasure s)"
   4.618 +  by (subst lmeasure_eq_integral) (auto intro!: integral_nonneg)
   4.619  
   4.620 -lemma lmeasure_finite: assumes "gmeasurable s" shows "lmeasure s \<noteq> \<omega>"
   4.621 -  using gmeasure_lmeasure[OF assms] by auto
   4.622 +lemma lmeasure_finite: assumes "(indicator s::_\<Rightarrow>real) integrable_on UNIV" shows "lmeasure s \<noteq> \<omega>"
   4.623 +  using lmeasure_eq_integral[OF assms] by auto
   4.624  
   4.625  lemma negligible_iff_lebesgue_null_sets:
   4.626    "negligible A \<longleftrightarrow> A \<in> lebesgue.null_sets"
   4.627 @@ -377,35 +380,65 @@
   4.628    show "A \<in> lebesgue.null_sets" by auto
   4.629  next
   4.630    assume A: "A \<in> lebesgue.null_sets"
   4.631 -  then have *:"gmeasurable A" using lmeasure_finite_gmeasurable[of A] by auto
   4.632 -  show "negligible A"
   4.633 -    unfolding gmeasurable_measure_eq_0[OF *, symmetric]
   4.634 -    unfolding lmeasure_gmeasure[OF *] using A by auto
   4.635 +  then have *:"((indicator A) has_integral (0::real)) UNIV" using lmeasure_finite_has_integral[of A] by auto
   4.636 +  show "negligible A" unfolding negligible_def
   4.637 +  proof (intro allI)
   4.638 +    fix a b :: 'a
   4.639 +    have integrable: "(indicator A :: _\<Rightarrow>real) integrable_on {a..b}"
   4.640 +      by (intro integrable_on_subinterval has_integral_integrable) (auto intro: *)
   4.641 +    then have "integral {a..b} (indicator A) \<le> (integral UNIV (indicator A) :: real)"
   4.642 +      using * by (auto intro!: integral_subset_le has_integral_integrable)
   4.643 +    moreover have "(0::real) \<le> integral {a..b} (indicator A)"
   4.644 +      using integrable by (auto intro!: integral_nonneg)
   4.645 +    ultimately have "integral {a..b} (indicator A) = (0::real)"
   4.646 +      using integral_unique[OF *] by auto
   4.647 +    then show "(indicator A has_integral (0::real)) {a..b}"
   4.648 +      using integrable_integral[OF integrable] by simp
   4.649 +  qed
   4.650 +qed
   4.651 +
   4.652 +lemma integral_const[simp]:
   4.653 +  fixes a b :: "'a::ordered_euclidean_space"
   4.654 +  shows "integral {a .. b} (\<lambda>x. c) = content {a .. b} *\<^sub>R c"
   4.655 +  by (rule integral_unique) (rule has_integral_const)
   4.656 +
   4.657 +lemma lmeasure_UNIV[intro]: "lmeasure (UNIV::'a::ordered_euclidean_space set) = \<omega>"
   4.658 +  unfolding lmeasure_def SUP_\<omega>
   4.659 +proof (intro allI impI)
   4.660 +  fix x assume "x < \<omega>"
   4.661 +  then obtain r where r: "x = Real r" "0 \<le> r" by (cases x) auto
   4.662 +  then obtain n where n: "r < of_nat n" using ex_less_of_nat by auto
   4.663 +  show "\<exists>i\<in>UNIV. x < Real (integral (cube i) (indicator UNIV::'a\<Rightarrow>real))"
   4.664 +  proof (intro bexI[of _ n])
   4.665 +    have [simp]: "indicator UNIV = (\<lambda>x. 1)" by (auto simp: fun_eq_iff)
   4.666 +    { fix m :: nat assume "0 < m" then have "real n \<le> (\<Prod>x<m. 2 * real n)"
   4.667 +      proof (induct m)
   4.668 +        case (Suc m)
   4.669 +        show ?case
   4.670 +        proof cases
   4.671 +          assume "m = 0" then show ?thesis by (simp add: lessThan_Suc)
   4.672 +        next
   4.673 +          assume "m \<noteq> 0" then have "real n \<le> (\<Prod>x<m. 2 * real n)" using Suc by auto
   4.674 +          then show ?thesis
   4.675 +            by (auto simp: lessThan_Suc field_simps mult_le_cancel_left1)
   4.676 +        qed
   4.677 +      qed auto } note this[OF DIM_positive[where 'a='a], simp]
   4.678 +    then have [simp]: "0 \<le> (\<Prod>x<DIM('a). 2 * real n)" using real_of_nat_ge_zero by arith
   4.679 +    have "x < Real (of_nat n)" using n r by auto
   4.680 +    also have "Real (of_nat n) \<le> Real (integral (cube n) (indicator UNIV::'a\<Rightarrow>real))"
   4.681 +      by (auto simp: real_eq_of_nat[symmetric] cube_def content_closed_interval_cases)
   4.682 +    finally show "x < Real (integral (cube n) (indicator UNIV::'a\<Rightarrow>real))" .
   4.683 +  qed auto
   4.684  qed
   4.685  
   4.686  lemma
   4.687    fixes a b ::"'a::ordered_euclidean_space"
   4.688    shows lmeasure_atLeastAtMost[simp]: "lmeasure {a..b} = Real (content {a..b})"
   4.689 -    and lmeasure_greaterThanLessThan[simp]: "lmeasure {a <..< b} = Real (content {a..b})"
   4.690 -  using has_gmeasure_interval[of a b] by (auto intro!: has_gmeasure_lmeasure)
   4.691 -
   4.692 -lemma lmeasure_cube:
   4.693 -  "lmeasure (cube n::('a::ordered_euclidean_space) set) = (Real ((2 * real n) ^ (DIM('a))))"
   4.694 -  by (intro has_gmeasure_lmeasure) auto
   4.695 -
   4.696 -lemma lmeasure_UNIV[intro]: "lmeasure UNIV = \<omega>"
   4.697 -  unfolding lmeasure_def SUP_\<omega>
   4.698 -proof (intro allI impI)
   4.699 -  fix x assume "x < \<omega>"
   4.700 -  then obtain r where r: "x = Real r" "0 \<le> r" by (cases x) auto
   4.701 -  then obtain n where n: "r < of_nat n" using ex_less_of_nat by auto
   4.702 -  show "\<exists>i\<in>UNIV. x < Real (gmeasure (UNIV \<inter> cube i))"
   4.703 -  proof (intro bexI[of _ n])
   4.704 -    have "x < Real (of_nat n)" using n r by auto
   4.705 -    also have "Real (of_nat n) \<le> Real (gmeasure (UNIV \<inter> cube n))"
   4.706 -      using gmeasure_cube_ge_n[of n] by (auto simp: real_eq_of_nat[symmetric])
   4.707 -    finally show "x < Real (gmeasure (UNIV \<inter> cube n))" .
   4.708 -  qed auto
   4.709 +proof -
   4.710 +  have "(indicator (UNIV \<inter> {a..b})::_\<Rightarrow>real) integrable_on UNIV"
   4.711 +    unfolding integrable_indicator_UNIV by (simp add: integrable_const indicator_def_raw)
   4.712 +  from lmeasure_eq_integral[OF this] show ?thesis unfolding integral_indicator_UNIV
   4.713 +    by (simp add: indicator_def_raw)
   4.714  qed
   4.715  
   4.716  lemma atLeastAtMost_singleton_euclidean[simp]:
   4.717 @@ -421,9 +454,7 @@
   4.718  
   4.719  lemma lmeasure_singleton[simp]:
   4.720    fixes a :: "'a::ordered_euclidean_space" shows "lmeasure {a} = 0"
   4.721 -  using has_gmeasure_interval[of a a] unfolding zero_pextreal_def
   4.722 -  by (intro has_gmeasure_lmeasure)
   4.723 -     (simp add: content_closed_interval DIM_positive)
   4.724 +  using lmeasure_atLeastAtMost[of a a] by simp
   4.725  
   4.726  declare content_real[simp]
   4.727  
   4.728 @@ -433,21 +464,33 @@
   4.729      "lmeasure {a <.. b} = Real (if a \<le> b then b - a else 0)"
   4.730  proof cases
   4.731    assume "a < b"
   4.732 -  then have "lmeasure {a <.. b} = lmeasure {a <..< b} + lmeasure {b}"
   4.733 -    by (subst lebesgue.measure_additive)
   4.734 -       (auto intro!: lebesgueI_borel arg_cong[where f=lmeasure])
   4.735 +  then have "lmeasure {a <.. b} = lmeasure {a .. b} - lmeasure {a}"
   4.736 +    by (subst lebesgue.measure_Diff[symmetric])
   4.737 +       (auto intro!: arg_cong[where f=lmeasure])
   4.738    then show ?thesis by auto
   4.739  qed auto
   4.740  
   4.741  lemma
   4.742    fixes a b :: real
   4.743    shows lmeasure_real_atLeastLessThan[simp]:
   4.744 -    "lmeasure {a ..< b} = Real (if a \<le> b then b - a else 0)" (is ?eqlt)
   4.745 +    "lmeasure {a ..< b} = Real (if a \<le> b then b - a else 0)"
   4.746  proof cases
   4.747    assume "a < b"
   4.748 -  then have "lmeasure {a ..< b} = lmeasure {a} + lmeasure {a <..< b}"
   4.749 -    by (subst lebesgue.measure_additive)
   4.750 -       (auto intro!: lebesgueI_borel arg_cong[where f=lmeasure])
   4.751 +  then have "lmeasure {a ..< b} = lmeasure {a .. b} - lmeasure {b}"
   4.752 +    by (subst lebesgue.measure_Diff[symmetric])
   4.753 +       (auto intro!: arg_cong[where f=lmeasure])
   4.754 +  then show ?thesis by auto
   4.755 +qed auto
   4.756 +
   4.757 +lemma
   4.758 +  fixes a b :: real
   4.759 +  shows lmeasure_real_greaterThanLessThan[simp]:
   4.760 +    "lmeasure {a <..< b} = Real (if a \<le> b then b - a else 0)"
   4.761 +proof cases
   4.762 +  assume "a < b"
   4.763 +  then have "lmeasure {a <..< b} = lmeasure {a <.. b} - lmeasure {b}"
   4.764 +    by (subst lebesgue.measure_Diff[symmetric])
   4.765 +       (auto intro!: arg_cong[where f=lmeasure])
   4.766    then show ?thesis by auto
   4.767  qed auto
   4.768  
   4.769 @@ -463,7 +506,7 @@
   4.770    show "range cube \<subseteq> sets borel" by (auto intro: borel_closed)
   4.771    { fix x have "\<exists>n. x\<in>cube n" using mem_big_cube by auto }
   4.772    thus "(\<Union>i. cube i) = space borel" by auto
   4.773 -  show "\<forall>i. lmeasure (cube i) \<noteq> \<omega>" unfolding lmeasure_cube by auto
   4.774 +  show "\<forall>i. lmeasure (cube i) \<noteq> \<omega>" unfolding cube_def by auto
   4.775  qed
   4.776  
   4.777  interpretation lebesgue: sigma_finite_measure lebesgue lmeasure
   4.778 @@ -482,7 +525,8 @@
   4.779    shows "((\<lambda>x. real (f x)) has_integral (real (lebesgue.simple_integral f))) UNIV"
   4.780    unfolding lebesgue.simple_integral_def
   4.781    apply(subst lebesgue_simple_function_indicator[OF f])
   4.782 -proof- case goal1
   4.783 +proof -
   4.784 +  case goal1
   4.785    have *:"\<And>x. \<forall>y\<in>range f. y * indicator (f -` {y}) x \<noteq> \<omega>"
   4.786      "\<forall>x\<in>range f. x * lmeasure (f -` {x} \<inter> UNIV) \<noteq> \<omega>"
   4.787      using f' om unfolding indicator_def by auto
   4.788 @@ -494,16 +538,19 @@
   4.789      fix y::'a show "((\<lambda>x. real (f y * indicator (f -` {f y}) x)) has_integral
   4.790        real (f y * lmeasure (f -` {f y} \<inter> UNIV))) UNIV"
   4.791      proof(cases "f y = 0") case False
   4.792 -      have mea:"gmeasurable (f -` {f y})" apply(rule lmeasure_finite_gmeasurable)
   4.793 +      have mea:"(indicator (f -` {f y}) ::_\<Rightarrow>real) integrable_on UNIV"
   4.794 +        apply(rule lmeasure_finite_integrable)
   4.795          using assms unfolding lebesgue.simple_function_def using False by auto
   4.796 -      have *:"\<And>x. real (indicator (f -` {f y}) x::pextreal) = (if x \<in> f -` {f y} then 1 else 0)" by auto
   4.797 +      have *:"\<And>x. real (indicator (f -` {f y}) x::pextreal) = (indicator (f -` {f y}) x)"
   4.798 +        by (auto simp: indicator_def)
   4.799        show ?thesis unfolding real_of_pextreal_mult[THEN sym]
   4.800          apply(rule has_integral_cmul[where 'b=real, unfolded real_scaleR_def])
   4.801 -        unfolding Int_UNIV_right lmeasure_gmeasure[OF mea,THEN sym]
   4.802 -        unfolding measure_integral_univ[OF mea] * apply(rule integrable_integral)
   4.803 -        unfolding gmeasurable_integrable[THEN sym] using mea .
   4.804 +        unfolding Int_UNIV_right lmeasure_eq_integral[OF mea,THEN sym]
   4.805 +        unfolding integral_eq_lmeasure[OF mea, symmetric] *
   4.806 +        apply(rule integrable_integral) using mea .
   4.807      qed auto
   4.808 -  qed qed
   4.809 +  qed
   4.810 +qed
   4.811  
   4.812  lemma bounded_realI: assumes "\<forall>x\<in>s. abs (x::real) \<le> B" shows "bounded s"
   4.813    unfolding bounded_def dist_real_def apply(rule_tac x=0 in exI)
   4.814 @@ -826,7 +873,7 @@
   4.815    show "Int_stable \<lparr> space = UNIV :: 'a set, sets = range (\<lambda>(a,b). {a..b}) \<rparr>"
   4.816      (is "Int_stable ?E" ) using Int_stable_cuboids' .
   4.817    show "borel = sigma ?E" using borel_eq_atLeastAtMost .
   4.818 -  show "\<And>i. lmeasure (cube i) \<noteq> \<omega>" unfolding lmeasure_cube by auto
   4.819 +  show "\<And>i. lmeasure (cube i) \<noteq> \<omega>" unfolding cube_def by auto
   4.820    show "\<And>X. X \<in> sets ?E \<Longrightarrow>
   4.821      lmeasure X = borel_product.product_measure {..<DIM('a)} (e2p ` X :: (nat \<Rightarrow> real) set)"
   4.822    proof- case goal1 then obtain a b where X:"X = {a..b}" by auto