src/HOL/Multivariate_Analysis/Gauge_Measure.thy
changeset 42523 32fe42892983
parent 41795 4638b1210d26
child 42524 95f851027a59
child 42528 a5d1b2df5e97
     1.1 --- a/src/HOL/Multivariate_Analysis/Gauge_Measure.thy	Fri Jan 14 16:00:13 2011 +0100
     1.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.3 @@ -1,3447 +0,0 @@
     1.4 -
     1.5 -header {* Lebsegue measure (defined via the gauge integral). *}
     1.6 -(*  Author:                     John Harrison
     1.7 -    Translation from HOL light: Robert Himmelmann, TU Muenchen *)
     1.8 -
     1.9 -theory Gauge_Measure
    1.10 -  imports Integration 
    1.11 -begin
    1.12 -
    1.13 -(* ------------------------------------------------------------------------- *)
    1.14 -(* Lebesgue measure (in the case where the measure is finite).               *)
    1.15 -(* For the non-finite version, please see Probability/Lebesgue_Measure.thy   *)
    1.16 -(* ------------------------------------------------------------------------- *)
    1.17 -
    1.18 -definition has_gmeasure (infixr "has'_gmeasure" 80) where
    1.19 -  "s has_gmeasure m \<equiv> ((\<lambda>x. 1::real) has_integral m) s"
    1.20 -
    1.21 -definition gmeasurable :: "('n::ordered_euclidean_space) set \<Rightarrow> bool" where 
    1.22 -  "gmeasurable s \<equiv> (\<exists>m. s has_gmeasure m)"
    1.23 -
    1.24 -lemma gmeasurableI[dest]:"s has_gmeasure m \<Longrightarrow> gmeasurable s"
    1.25 -  unfolding gmeasurable_def by auto
    1.26 -
    1.27 -definition gmeasure where
    1.28 -  "gmeasure s \<equiv> (if gmeasurable s then (SOME m. s has_gmeasure m) else 0)"
    1.29 -
    1.30 -lemma has_gmeasure_measure: "gmeasurable s \<longleftrightarrow> s has_gmeasure (gmeasure s)"
    1.31 -  unfolding gmeasure_def gmeasurable_def
    1.32 -  apply meson apply(subst if_P) defer apply(rule someI) by auto
    1.33 -
    1.34 -lemma has_gmeasure_measureI[intro]:"gmeasurable s \<Longrightarrow> s has_gmeasure (gmeasure s)"
    1.35 -  using has_gmeasure_measure by auto
    1.36 -  
    1.37 -lemma has_gmeasure_unique: "s has_gmeasure m1 \<Longrightarrow> s has_gmeasure m2 \<Longrightarrow> m1 = m2"
    1.38 -  unfolding has_gmeasure_def apply(rule has_integral_unique) by auto
    1.39 -
    1.40 -lemma measure_unique[intro]: assumes "s has_gmeasure m" shows "gmeasure s = m"
    1.41 -  apply(rule has_gmeasure_unique[OF _ assms]) using assms 
    1.42 -  unfolding has_gmeasure_measure[THEN sym] by auto
    1.43 -
    1.44 -lemma has_gmeasure_measurable_measure:
    1.45 - "s has_gmeasure m \<longleftrightarrow> gmeasurable s \<and> gmeasure s = m"
    1.46 -  by(auto intro!:measure_unique simp:has_gmeasure_measure[THEN sym])
    1.47 -
    1.48 -lemmas has_gmeasure_imp_measurable = gmeasurableI
    1.49 -
    1.50 -lemma has_gmeasure:
    1.51 - "s has_gmeasure m \<longleftrightarrow> ((\<lambda>x. if x \<in> s then 1 else 0) has_integral m) UNIV"
    1.52 -  unfolding has_integral_restrict_univ has_gmeasure_def ..
    1.53 -
    1.54 -lemma gmeasurable: "gmeasurable s \<longleftrightarrow> (\<lambda>x. 1::real) integrable_on s"
    1.55 -  unfolding gmeasurable_def integrable_on_def has_gmeasure_def by auto
    1.56 -
    1.57 -lemma gmeasurable_integrable:
    1.58 - "gmeasurable s \<longleftrightarrow> (\<lambda>x. if x \<in> s then 1 else (0::real)) integrable_on UNIV"
    1.59 -  unfolding gmeasurable_def integrable_on_def has_gmeasure ..
    1.60 -
    1.61 -lemma measure_integral:
    1.62 -  assumes "gmeasurable s" shows "gmeasure s = (integral s (\<lambda>x. 1))"
    1.63 -  apply(rule integral_unique[THEN sym])
    1.64 -  unfolding has_gmeasure_def[symmetric] using assms by auto 
    1.65 -
    1.66 -lemma measure_integral_univ: assumes "gmeasurable s"
    1.67 -  shows "gmeasure s = (integral UNIV (\<lambda>x. if x \<in> s then 1 else 0))"
    1.68 -  apply(rule integral_unique[THEN sym])
    1.69 -  using assms by(auto simp:has_gmeasure[THEN sym])
    1.70 -
    1.71 -lemmas integral_measure = measure_integral[THEN sym]
    1.72 -
    1.73 -lemmas integral_measure_univ = measure_integral_univ[THEN sym]
    1.74 -
    1.75 -lemma has_gmeasure_interval[intro]:
    1.76 -  "{a..b} has_gmeasure content{a..b}" (is ?t1)
    1.77 -  "{a<..<b} has_gmeasure content{a..b}" (is ?t2)
    1.78 -proof- show ?t1 unfolding has_gmeasure_def using has_integral_const[where c="1::real"] by auto
    1.79 -  show ?t2 unfolding has_gmeasure apply(rule has_integral_spike[of "{a..b} - {a<..<b}",
    1.80 -    where f="\<lambda>x. (if x \<in> {a..b} then 1 else 0)"]) apply(rule negligible_frontier_interval) 
    1.81 -    using interval_open_subset_closed[of a b]
    1.82 -    using `?t1` unfolding has_gmeasure by auto
    1.83 -qed
    1.84 -
    1.85 -lemma gmeasurable_interval[intro]: "gmeasurable {a..b}" "gmeasurable {a<..<b}"
    1.86 -  by(auto intro:gmeasurableI)
    1.87 -
    1.88 -lemma measure_interval[simp]: "gmeasure{a..b} = content{a..b}"  "gmeasure({a<..<b}) = content{a..b}"
    1.89 -  by(auto intro:measure_unique)
    1.90 -
    1.91 -lemma nonnegative_absolutely_integrable: fixes f::"'n::ordered_euclidean_space \<Rightarrow> 'm::ordered_euclidean_space"
    1.92 -  assumes "\<forall>x\<in>s. \<forall>i<DIM('m). 0 \<le> f(x)$$i" "f integrable_on s"
    1.93 -  shows "f absolutely_integrable_on s"
    1.94 -  unfolding absolutely_integrable_abs_eq apply rule defer
    1.95 -  apply(rule integrable_eq[of _ f]) using assms apply-apply(subst euclidean_eq) by auto
    1.96 -
    1.97 -lemma gmeasurable_inter[dest]: assumes "gmeasurable s" "gmeasurable t" shows "gmeasurable (s \<inter> t)"
    1.98 -proof- have *:"(\<lambda>x. if x \<in> s \<inter> t then 1 else (0::real)) =
    1.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))"
   1.100 -    apply(rule ext) by auto
   1.101 -  show ?thesis unfolding gmeasurable_integrable apply(rule absolutely_integrable_onD)
   1.102 -    unfolding * apply(rule absolutely_integrable_min)
   1.103 -    apply(rule_tac[!] nonnegative_absolutely_integrable)
   1.104 -    using assms unfolding gmeasurable_integrable by auto
   1.105 -qed
   1.106 -
   1.107 -lemma gmeasurable_union: assumes "gmeasurable s" "gmeasurable t"
   1.108 -  shows "gmeasurable (s \<union> t)"
   1.109 -proof- have *:"(\<lambda>x. if x \<in> s \<union> t then 1 else (0::real)) =
   1.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)) "
   1.111 -    by(rule ext,auto)
   1.112 -  show ?thesis unfolding gmeasurable_integrable apply(rule absolutely_integrable_onD)
   1.113 -    unfolding * apply(rule absolutely_integrable_max)
   1.114 -    apply(rule_tac[!]nonnegative_absolutely_integrable)
   1.115 -    using assms unfolding gmeasurable_integrable by auto
   1.116 -qed
   1.117 -
   1.118 -lemma has_gmeasure_disjoint_union: 
   1.119 -  assumes "s1 has_gmeasure m1" "s2 has_gmeasure m2" "s1 \<inter> s2 = {}"
   1.120 -  shows "(s1 \<union> s2) has_gmeasure (m1 + m2)"
   1.121 -proof- have *:"\<And>x. (if x \<in> s1 then 1 else 0) + (if x \<in> s2 then 1 else 0) =
   1.122 -    (if x \<in> s1 \<union> s2 then 1 else (0::real))" using assms(3) by auto
   1.123 -  show ?thesis using has_integral_add[OF assms(1-2)[unfolded has_gmeasure]]
   1.124 -    unfolding has_gmeasure * .
   1.125 -qed
   1.126 -
   1.127 -lemma measure_disjoint_union: assumes "gmeasurable s" "gmeasurable t" "s \<inter> t = {}"
   1.128 -  shows "gmeasure(s \<union> t) = gmeasure s + gmeasure t"
   1.129 -  apply rule apply(rule has_gmeasure_disjoint_union) using assms by auto
   1.130 -
   1.131 -lemma has_gmeasure_pos_le[dest]: assumes "s has_gmeasure m" shows "0 \<le> m"
   1.132 -  apply(rule has_integral_nonneg) using assms unfolding has_gmeasure by auto
   1.133 -
   1.134 -lemma not_measurable_measure:"\<not> gmeasurable s \<Longrightarrow> gmeasure s = 0"
   1.135 -  unfolding gmeasure_def if_not_P ..
   1.136 -
   1.137 -lemma measure_pos_le[intro]: "0 <= gmeasure s"
   1.138 -  apply(cases "gmeasurable s") unfolding not_measurable_measure
   1.139 -  unfolding has_gmeasure_measure by auto
   1.140 -
   1.141 -lemma has_gmeasure_subset[dest]:
   1.142 -  assumes "s1 has_gmeasure m1" "s2 has_gmeasure m2" "s1 \<subseteq> s2"
   1.143 -  shows "m1 <= m2"
   1.144 -  using has_integral_subset_le[OF assms(3,1,2)[unfolded has_gmeasure_def]] by auto
   1.145 -
   1.146 -lemma measure_subset[dest]: assumes "gmeasurable s" "gmeasurable t" "s \<subseteq> t"
   1.147 -  shows "gmeasure s \<le> gmeasure t"
   1.148 -  using assms unfolding has_gmeasure_measure by auto
   1.149 -
   1.150 -lemma has_gmeasure_0:"s has_gmeasure 0 \<longleftrightarrow> negligible s" (is "?l = ?r")
   1.151 -proof assume ?r thus ?l unfolding indicator_def_raw negligible apply(erule_tac x="UNIV" in allE)
   1.152 -    unfolding has_integral_restrict_univ has_gmeasure_def .
   1.153 -next assume ?l note this[unfolded has_gmeasure_def has_integral_alt']
   1.154 -  note * = conjunctD2[OF this,rule_format]
   1.155 -  show ?r unfolding negligible_def 
   1.156 -  proof safe case goal1
   1.157 -    from *(1)[of a b,unfolded integrable_on_def] guess y apply-
   1.158 -      apply(subst (asm) has_integral_restrict_univ[THEN sym]) by (erule exE) note y=this
   1.159 -    have "0 \<le> y" apply(rule has_integral_nonneg[OF y]) by auto
   1.160 -    moreover have "y \<le> 0" apply(rule has_integral_le[OF y]) 
   1.161 -      apply(rule `?l`[unfolded has_gmeasure_def has_integral_restrict_univ[THEN sym,of"\<lambda>x. 1"]]) by auto
   1.162 -    ultimately have "y = 0" by auto
   1.163 -    thus ?case using y unfolding has_integral_restrict_univ indicator_def_raw by auto
   1.164 -  qed
   1.165 -qed
   1.166 -
   1.167 -lemma measure_eq_0: "negligible s ==> gmeasure s = 0"
   1.168 -  apply(rule measure_unique) unfolding has_gmeasure_0 by auto
   1.169 -
   1.170 -lemma has_gmeasure_empty[intro]: "{} has_gmeasure 0"
   1.171 -  unfolding has_gmeasure_0 by auto
   1.172 -
   1.173 -lemma measure_empty[simp]: "gmeasure {} = 0"
   1.174 -  apply(rule measure_eq_0) by auto
   1.175 -
   1.176 -lemma gmeasurable_empty[intro]: "gmeasurable {}" by(auto intro:gmeasurableI)
   1.177 -
   1.178 -lemma gmeasurable_measure_eq_0:
   1.179 -  "gmeasurable s ==> (gmeasure s = 0 \<longleftrightarrow> negligible s)"
   1.180 -  unfolding has_gmeasure_measure has_gmeasure_0[THEN sym] by(auto intro:measure_unique)
   1.181 -
   1.182 -lemma gmeasurable_measure_pos_lt:
   1.183 - "gmeasurable s ==> (0 < gmeasure s \<longleftrightarrow> ~negligible s)"
   1.184 -  unfolding gmeasurable_measure_eq_0[THEN sym]
   1.185 -  using measure_pos_le[of s] unfolding le_less by fastsimp
   1.186 -
   1.187 -lemma negligible_interval:True .. (*
   1.188 - "(!a b. negligible{a..b} \<longleftrightarrow> {a<..<b} = {}) \<and>
   1.189 -   (!a b. negligible({a<..<b}) \<longleftrightarrow> {a<..<b} = {})"
   1.190 -qed   REWRITE_TAC[GSYM HAS_GMEASURE_0] THEN
   1.191 -  MESON_TAC[HAS_GMEASURE_INTERVAL; CONTENT_EQ_0_INTERIOR;
   1.192 -            INTERIOR_CLOSED_INTERVAL; HAS_GMEASURE_UNIQUE]);;*)
   1.193 -
   1.194 -lemma gmeasurable_finite_unions:
   1.195 -  assumes "finite f" "\<And>s. s \<in> f \<Longrightarrow> gmeasurable s"
   1.196 -  shows "gmeasurable (\<Union> f)" using assms(1,2) 
   1.197 -proof induct case (insert s F)
   1.198 -  show ?case unfolding Union_insert apply(rule gmeasurable_union)
   1.199 -    using insert by auto
   1.200 -qed auto  
   1.201 -
   1.202 -lemma has_gmeasure_diff_subset: assumes "s1 has_gmeasure m1" "s2 has_gmeasure m2" "s2 \<subseteq> s1"
   1.203 -  shows "(s1 - s2) has_gmeasure (m1 - m2)"
   1.204 -proof- have *:"(\<lambda>x. (if x \<in> s1 then 1 else 0) - (if x \<in> s2 then 1 else (0::real))) =
   1.205 -    (\<lambda>x. if x \<in> s1 - s2 then 1 else 0)" apply(rule ext) using assms(3) by auto
   1.206 -  show ?thesis using has_integral_sub[OF assms(1-2)[unfolded has_gmeasure]] 
   1.207 -    unfolding has_gmeasure * . 
   1.208 -qed
   1.209 -
   1.210 -lemma gmeasurable_diff: assumes "gmeasurable s" "gmeasurable t" 
   1.211 -  shows "gmeasurable (s - t)"
   1.212 -proof- have *:"\<And>s t. gmeasurable s \<Longrightarrow> gmeasurable t \<Longrightarrow> t \<subseteq> s ==> gmeasurable (s - t)"
   1.213 -    unfolding gmeasurable_def apply(erule exE)+ apply(rule,rule has_gmeasure_diff_subset)
   1.214 -    by assumption+
   1.215 -  have **:"s - t = s - (s \<inter> t)" by auto
   1.216 -  show ?thesis unfolding ** apply(rule *) using assms by auto
   1.217 -qed
   1.218 -
   1.219 -lemma measure_diff_subset: True .. (*
   1.220 - "!s t. gmeasurable s \<and> gmeasurable t \<and> t \<subseteq> s
   1.221 -         ==> measure(s DIFF t) = gmeasure s - gmeasure t"
   1.222 -qed   REPEAT STRIP_TAC THEN MATCH_MP_TAC MEASURE_UNIQUE THEN
   1.223 -  ASM_SIMP_TAC[HAS_GMEASURE_DIFF_SUBSET; GSYM HAS_GMEASURE_MEASURE]);; *)
   1.224 -
   1.225 -lemma has_gmeasure_union_negligible[dest]:
   1.226 -  assumes "s has_gmeasure m" "negligible t"
   1.227 -  shows "(s \<union> t) has_gmeasure m" unfolding has_gmeasure
   1.228 -  apply(rule has_integral_spike[OF assms(2) _ assms(1)[unfolded has_gmeasure]]) by auto
   1.229 -
   1.230 -lemma has_gmeasure_diff_negligible[dest]:
   1.231 -  assumes "s has_gmeasure m" "negligible t" 
   1.232 -  shows "(s - t) has_gmeasure m" unfolding has_gmeasure
   1.233 -  apply(rule has_integral_spike[OF assms(2) _ assms(1)[unfolded has_gmeasure]]) by auto
   1.234 -
   1.235 -lemma has_gmeasure_union_negligible_eq: True .. (*
   1.236 - "!s t:real^N->bool m.
   1.237 -     negligible t ==> ((s \<union> t) has_gmeasure m \<longleftrightarrow> s has_gmeasure m)"
   1.238 -qed   REPEAT STRIP_TAC THEN EQ_TAC THEN DISCH_TAC THEN
   1.239 -  ASM_SIMP_TAC[HAS_GMEASURE_UNION_NEGLIGIBLE] THEN
   1.240 -  SUBST1_TAC(SET_RULE `s:real^N->bool = (s \<union> t) DIFF (t DIFF s)`) THEN
   1.241 -  MATCH_MP_TAC HAS_GMEASURE_DIFF_NEGLIGIBLE THEN ASM_REWRITE_TAC[] THEN
   1.242 -  MATCH_MP_TAC NEGLIGIBLE_DIFF THEN ASM_REWRITE_TAC[]);; *)
   1.243 -
   1.244 -lemma has_gmeasure_diff_negligible_eq: True .. (*
   1.245 - "!s t:real^N->bool m.
   1.246 -     negligible t ==> ((s DIFF t) has_gmeasure m \<longleftrightarrow> s has_gmeasure m)"
   1.247 -qed   REPEAT STRIP_TAC THEN EQ_TAC THEN DISCH_TAC THEN
   1.248 -  ASM_SIMP_TAC[HAS_GMEASURE_DIFF_NEGLIGIBLE] THEN
   1.249 -  SUBST1_TAC(SET_RULE `s:real^N->bool = (s DIFF t) \<union> (t \<inter> s)`) THEN
   1.250 -  MATCH_MP_TAC HAS_GMEASURE_UNION_NEGLIGIBLE THEN
   1.251 -  ASM_SIMP_TAC[NEGLIGIBLE_INTER]);; *)
   1.252 -
   1.253 -lemma has_gmeasure_almost: assumes "s has_gmeasure m" "negligible t" "s \<union> t = s' \<union> t"
   1.254 -  shows "s' has_gmeasure m"
   1.255 -proof- have *:"s' \<union> t - (t - s') = s'" by blast
   1.256 -  show ?thesis using has_gmeasure_union_negligible[OF assms(1-2)] unfolding assms(3)
   1.257 -    apply-apply(drule has_gmeasure_diff_negligible[where t="t - s'"])
   1.258 -    apply(rule negligible_diff) using assms(2) unfolding * by auto
   1.259 -qed
   1.260 -
   1.261 -lemma has_gmeasure_almost_eq: True .. (*
   1.262 - "!s s' t. negligible t \<and> s \<union> t = s' \<union> t
   1.263 -            ==> (s has_gmeasure m \<longleftrightarrow> s' has_gmeasure m)"
   1.264 -qed   MESON_TAC[HAS_GMEASURE_ALMOST]);; *)
   1.265 -
   1.266 -lemma gmeasurable_almost: True .. (*
   1.267 - "!s s' t. gmeasurable s \<and> negligible t \<and> s \<union> t = s' \<union> t
   1.268 -            ==> gmeasurable s'"
   1.269 -qed   REWRITE_TAC[measurable] THEN MESON_TAC[HAS_GMEASURE_ALMOST]);; *)
   1.270 -
   1.271 -lemma has_gmeasure_negligible_union:
   1.272 -  assumes "s1 has_gmeasure m1" "s2 has_gmeasure m2" "negligible(s1 \<inter> s2)"
   1.273 -  shows "(s1 \<union> s2) has_gmeasure (m1 + m2)" 
   1.274 -  apply(rule has_gmeasure_almost[of "(s1 - (s1 \<inter> s2)) \<union> (s2 - (s1 \<inter> s2))" _ "s1 \<inter> s2"])
   1.275 -  apply(rule has_gmeasure_disjoint_union)
   1.276 -  apply(rule has_gmeasure_almost[of s1,OF _ assms(3)]) prefer 3
   1.277 -  apply(rule has_gmeasure_almost[of s2,OF _ assms(3)])
   1.278 -  using assms by auto
   1.279 -
   1.280 -lemma measure_negligible_union: True .. (*
   1.281 -  "!s t. gmeasurable s \<and> gmeasurable t \<and> negligible(s \<inter> t)
   1.282 -         ==> measure(s \<union> t) = gmeasure s + gmeasure t"
   1.283 -qed   REPEAT STRIP_TAC THEN MATCH_MP_TAC MEASURE_UNIQUE THEN
   1.284 -  ASM_SIMP_TAC[HAS_GMEASURE_NEGLIGIBLE_UNION; GSYM HAS_GMEASURE_MEASURE]);; *)
   1.285 -
   1.286 -lemma has_gmeasure_negligible_symdiff: True .. (*
   1.287 - "!s t:real^N->bool m.
   1.288 -        s has_gmeasure m \<and>
   1.289 -        negligible((s DIFF t) \<union> (t DIFF s))
   1.290 -        ==> t has_gmeasure m"
   1.291 -qed   REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_GMEASURE_ALMOST THEN
   1.292 -  MAP_EVERY EXISTS_TAC
   1.293 -   [`s:real^N->bool`; `(s DIFF t) \<union> (t DIFF s):real^N->bool`] THEN
   1.294 -  ASM_REWRITE_TAC[] THEN SET_TAC[]);; *)
   1.295 -
   1.296 -lemma gmeasurable_negligible_symdiff: True .. (*
   1.297 - "!s t:real^N->bool.
   1.298 -        gmeasurable s \<and> negligible((s DIFF t) \<union> (t DIFF s))
   1.299 -        ==> gmeasurable t"
   1.300 -qed   REWRITE_TAC[measurable] THEN
   1.301 -  MESON_TAC[HAS_GMEASURE_NEGLIGIBLE_SYMDIFF]);; *)
   1.302 -
   1.303 -lemma measure_negligible_symdiff: True .. (*
   1.304 - "!s t:real^N->bool.
   1.305 -        (measurable s \/ gmeasurable t) \<and>
   1.306 -        negligible((s DIFF t) \<union> (t DIFF s))
   1.307 -        ==> gmeasure s = gmeasure t"
   1.308 -qed   MESON_TAC[HAS_GMEASURE_NEGLIGIBLE_SYMDIFF; MEASURE_UNIQUE; UNION_COMM;
   1.309 -                HAS_GMEASURE_MEASURE]);; *)
   1.310 -
   1.311 -lemma has_gmeasure_negligible_unions: assumes "finite f"
   1.312 -  "\<And>s. s \<in> f ==> s has_gmeasure (m s)"
   1.313 -  "\<And>s t. s \<in> f \<Longrightarrow> t \<in> f \<Longrightarrow> ~(s = t) ==> negligible(s \<inter> t)"
   1.314 -  shows "(\<Union> f) has_gmeasure (setsum m f)" using assms
   1.315 -proof induct case (insert x s)
   1.316 -  have *:"(x \<inter> \<Union>s) = \<Union>{x \<inter> y| y. y\<in>s}"by auto
   1.317 -  show ?case unfolding Union_insert setsum.insert [OF insert(1-2)] 
   1.318 -    apply(rule has_gmeasure_negligible_union) unfolding *
   1.319 -    apply(rule insert) defer apply(rule insert) apply(rule insert) defer
   1.320 -    apply(rule insert) prefer 4 apply(rule negligible_unions)
   1.321 -    defer apply safe apply(rule insert) using insert by auto
   1.322 -qed auto
   1.323 -
   1.324 -lemma measure_negligible_unions: 
   1.325 -  assumes "finite f" "\<And>s. s \<in> f ==> s has_gmeasure (m s)"
   1.326 -  "\<And>s t. s \<in> f \<Longrightarrow> t \<in> f \<Longrightarrow> s \<noteq> t ==> negligible(s \<inter> t)"
   1.327 -  shows "gmeasure(\<Union> f) = setsum m f"
   1.328 -  apply rule apply(rule has_gmeasure_negligible_unions)
   1.329 -  using assms by auto
   1.330 -
   1.331 -lemma has_gmeasure_disjoint_unions:
   1.332 -  assumes"finite f" "\<And>s. s \<in> f ==> s has_gmeasure (m s)"
   1.333 -  "\<And>s t. s \<in> f \<Longrightarrow> t \<in> f \<Longrightarrow> s \<noteq> t ==> s \<inter> t = {}"
   1.334 -  shows "(\<Union> f) has_gmeasure (setsum m f)"
   1.335 -  apply(rule has_gmeasure_negligible_unions[OF assms(1-2)]) using assms(3) by auto
   1.336 -
   1.337 -lemma measure_disjoint_unions: 
   1.338 -  assumes "finite f" "\<And>s. s \<in> f ==> s has_gmeasure (m s)" 
   1.339 -  "\<And>s t. s \<in> f \<Longrightarrow> t \<in> f \<Longrightarrow> s \<noteq> t ==> s \<inter> t = {}"
   1.340 -  shows "gmeasure(\<Union> f) = setsum m f"
   1.341 -  apply rule apply(rule has_gmeasure_disjoint_unions[OF assms]) by auto
   1.342 -
   1.343 -lemma has_gmeasure_negligible_unions_image:
   1.344 -  assumes "finite s" "\<And>x. x \<in> s ==> gmeasurable(f x)"
   1.345 -  "\<And>x y. x \<in> s \<Longrightarrow> y \<in> s \<Longrightarrow> x \<noteq> y \<Longrightarrow> negligible((f x) \<inter> (f y))"
   1.346 -  shows "(\<Union> (f ` s)) has_gmeasure (setsum (\<lambda>x. gmeasure(f x)) s)"
   1.347 -proof- have *:"setsum (\<lambda>x. gmeasure(f x)) s = setsum gmeasure (f ` s)"
   1.348 -    apply(subst setsum_reindex_nonzero) defer
   1.349 -    apply(subst gmeasurable_measure_eq_0)
   1.350 -  proof- case goal2 thus ?case using assms(3)[of x y] by auto
   1.351 -  qed(insert assms, auto)
   1.352 -  show ?thesis unfolding * apply(rule has_gmeasure_negligible_unions) using assms by auto
   1.353 -qed
   1.354 -
   1.355 -lemma measure_negligible_unions_image: True .. (*
   1.356 - "!f:A->real^N->bool s.
   1.357 -        FINITE s \<and>
   1.358 -        (!x. x \<in> s ==> gmeasurable(f x)) \<and>
   1.359 -        (!x y. x \<in> s \<and> y \<in> s \<and> ~(x = y) ==> negligible((f x) \<inter> (f y)))
   1.360 -        ==> measure(UNIONS (IMAGE f s)) = sum s (\<lambda>x. measure(f x))"
   1.361 -qed   REPEAT STRIP_TAC THEN MATCH_MP_TAC MEASURE_UNIQUE THEN
   1.362 -  ASM_SIMP_TAC[HAS_GMEASURE_NEGLIGIBLE_UNIONS_IMAGE]);;*)
   1.363 -
   1.364 -lemma has_gmeasure_disjoint_unions_image: True .. (*
   1.365 - "!f:A->real^N->bool s.
   1.366 -        FINITE s \<and>
   1.367 -        (!x. x \<in> s ==> gmeasurable(f x)) \<and>
   1.368 -        (!x y. x \<in> s \<and> y \<in> s \<and> ~(x = y) ==> DISJOINT (f x) (f y))
   1.369 -        ==> (UNIONS (IMAGE f s)) has_gmeasure (sum s (\<lambda>x. measure(f x)))"
   1.370 -qed   REWRITE_TAC[DISJOINT] THEN REPEAT STRIP_TAC THEN
   1.371 -  MATCH_MP_TAC HAS_GMEASURE_NEGLIGIBLE_UNIONS_IMAGE THEN
   1.372 -  ASM_SIMP_TAC[NEGLIGIBLE_EMPTY]);;*)
   1.373 -
   1.374 -lemma measure_disjoint_unions_image: True .. (*
   1.375 - "!f:A->real^N->bool s.
   1.376 -        FINITE s \<and>
   1.377 -        (!x. x \<in> s ==> gmeasurable(f x)) \<and>
   1.378 -        (!x y. x \<in> s \<and> y \<in> s \<and> ~(x = y) ==> DISJOINT (f x) (f y))
   1.379 -        ==> measure(UNIONS (IMAGE f s)) = sum s (\<lambda>x. measure(f x))"
   1.380 -qed   REPEAT STRIP_TAC THEN MATCH_MP_TAC MEASURE_UNIQUE THEN
   1.381 -  ASM_SIMP_TAC[HAS_GMEASURE_DISJOINT_UNIONS_IMAGE]);;*)
   1.382 -
   1.383 -lemma has_gmeasure_negligible_unions_image_strong: True .. (*
   1.384 - "!f:A->real^N->bool s.
   1.385 -        FINITE {x | x \<in> s \<and> ~(f x = {})} \<and>
   1.386 -        (!x. x \<in> s ==> gmeasurable(f x)) \<and>
   1.387 -        (!x y. x \<in> s \<and> y \<in> s \<and> ~(x = y) ==> negligible((f x) \<inter> (f y)))
   1.388 -        ==> (UNIONS (IMAGE f s)) has_gmeasure (sum s (\<lambda>x. measure(f x)))"
   1.389 -qed   REPEAT STRIP_TAC THEN
   1.390 -  MP_TAC(ISPECL [`f:A->real^N->bool`;
   1.391 -                 `{x | x \<in> s \<and> ~((f:A->real^N->bool) x = {})}`]
   1.392 -        HAS_GMEASURE_NEGLIGIBLE_UNIONS_IMAGE) THEN
   1.393 -  ASM_SIMP_TAC[IN_ELIM_THM; FINITE_RESTRICT] THEN
   1.394 -  MATCH_MP_TAC EQ_IMP THEN BINOP_TAC THENL
   1.395 -   [GEN_REWRITE_TAC I [EXTENSION] THEN
   1.396 -    REWRITE_TAC[IN_UNIONS; IN_IMAGE; IN_ELIM_THM] THEN
   1.397 -    MESON_TAC[NOT_IN_EMPTY];
   1.398 -    CONV_TAC SYM_CONV THEN MATCH_MP_TAC SUM_SUPERSET THEN
   1.399 -    SIMP_TAC[SUBSET; IN_ELIM_THM; TAUT `a \<and> ~(a \<and> b) \<longleftrightarrow> a \<and> ~b`] THEN
   1.400 -    REWRITE_TAC[MEASURE_EMPTY]]);; *)
   1.401 -
   1.402 -lemma measure_negligible_unions_image_strong: True .. (*
   1.403 - "!f:A->real^N->bool s.
   1.404 -        FINITE {x | x \<in> s \<and> ~(f x = {})} \<and>
   1.405 -        (!x. x \<in> s ==> gmeasurable(f x)) \<and>
   1.406 -        (!x y. x \<in> s \<and> y \<in> s \<and> ~(x = y) ==> negligible((f x) \<inter> (f y)))
   1.407 -        ==> measure(UNIONS (IMAGE f s)) = sum s (\<lambda>x. measure(f x))"
   1.408 -qed   REPEAT STRIP_TAC THEN MATCH_MP_TAC MEASURE_UNIQUE THEN
   1.409 -  ASM_SIMP_TAC[HAS_GMEASURE_NEGLIGIBLE_UNIONS_IMAGE_STRONG]);; *)
   1.410 -
   1.411 -lemma has_gmeasure_disjoint_unions_image_strong: True .. (*
   1.412 - "!f:A->real^N->bool s.
   1.413 -        FINITE {x | x \<in> s \<and> ~(f x = {})} \<and>
   1.414 -        (!x. x \<in> s ==> gmeasurable(f x)) \<and>
   1.415 -        (!x y. x \<in> s \<and> y \<in> s \<and> ~(x = y) ==> DISJOINT (f x) (f y))
   1.416 -        ==> (UNIONS (IMAGE f s)) has_gmeasure (sum s (\<lambda>x. measure(f x)))"
   1.417 -qed   REWRITE_TAC[DISJOINT] THEN REPEAT STRIP_TAC THEN
   1.418 -  MATCH_MP_TAC HAS_GMEASURE_NEGLIGIBLE_UNIONS_IMAGE_STRONG THEN
   1.419 -  ASM_SIMP_TAC[NEGLIGIBLE_EMPTY]);; *)
   1.420 -
   1.421 -lemma measure_disjoint_unions_image_strong: True .. (*
   1.422 - "!f:A->real^N->bool s.
   1.423 -        FINITE {x | x \<in> s \<and> ~(f x = {})} \<and>
   1.424 -        (!x. x \<in> s ==> gmeasurable(f x)) \<and>
   1.425 -        (!x y. x \<in> s \<and> y \<in> s \<and> ~(x = y) ==> DISJOINT (f x) (f y))
   1.426 -        ==> measure(UNIONS (IMAGE f s)) = sum s (\<lambda>x. measure(f x))"
   1.427 -qed   REPEAT STRIP_TAC THEN MATCH_MP_TAC MEASURE_UNIQUE THEN
   1.428 -  ASM_SIMP_TAC[HAS_GMEASURE_DISJOINT_UNIONS_IMAGE_STRONG]);; *)
   1.429 -
   1.430 -lemma measure_union: True .. (*
   1.431 - "!s t:real^N->bool.
   1.432 -        gmeasurable s \<and> gmeasurable t
   1.433 -        ==> measure(s \<union> t) = measure(s) + measure(t) - measure(s \<inter> t)"
   1.434 -qed   REPEAT STRIP_TAC THEN
   1.435 -  ONCE_REWRITE_TAC[SET_RULE
   1.436 -   `s \<union> t = (s \<inter> t) \<union> (s DIFF t) \<union> (t DIFF s)`] THEN
   1.437 -  ONCE_REWRITE_TAC[REAL_ARITH `a + b - c = c + (a - c) + (b - c)`] THEN
   1.438 -  MP_TAC(ISPECL [`s DIFF t:real^N->bool`; `t DIFF s:real^N->bool`]
   1.439 -        MEASURE_DISJOINT_UNION) THEN
   1.440 -  ASM_SIMP_TAC[MEASURABLE_DIFF] THEN
   1.441 -  ANTS_TAC THENL [SET_TAC[]; ALL_TAC] THEN
   1.442 -  MP_TAC(ISPECL [`s \<inter> t:real^N->bool`;
   1.443 -                 `(s DIFF t) \<union> (t DIFF s):real^N->bool`]
   1.444 -                MEASURE_DISJOINT_UNION) THEN
   1.445 -  ASM_SIMP_TAC[MEASURABLE_DIFF; GMEASURABLE_UNION; GMEASURABLE_INTER] THEN
   1.446 -  ANTS_TAC THENL [SET_TAC[]; ALL_TAC] THEN
   1.447 -  REPEAT(DISCH_THEN SUBST1_TAC) THEN AP_TERM_TAC THEN BINOP_TAC THEN
   1.448 -  REWRITE_TAC[REAL_EQ_SUB_LADD] THEN MATCH_MP_TAC EQ_TRANS THENL
   1.449 -   [EXISTS_TAC `measure((s DIFF t) \<union> (s \<inter> t):real^N->bool)`;
   1.450 -    EXISTS_TAC `measure((t DIFF s) \<union> (s \<inter> t):real^N->bool)`] THEN
   1.451 -  (CONJ_TAC THENL
   1.452 -    [CONV_TAC SYM_CONV THEN MATCH_MP_TAC MEASURE_DISJOINT_UNION THEN
   1.453 -     ASM_SIMP_TAC[MEASURABLE_DIFF; GMEASURABLE_INTER];
   1.454 -     AP_TERM_TAC] THEN
   1.455 -   SET_TAC[]));; *)
   1.456 -
   1.457 -lemma measure_union_le: True .. (*
   1.458 - "!s t:real^N->bool.
   1.459 -        gmeasurable s \<and> gmeasurable t
   1.460 -        ==> measure(s \<union> t) <= gmeasure s + gmeasure t"
   1.461 -qed   REPEAT STRIP_TAC THEN ASM_SIMP_TAC[MEASURE_UNION] THEN
   1.462 -  REWRITE_TAC[REAL_ARITH `a + b - c <= a + b \<longleftrightarrow> 0 <= c`] THEN
   1.463 -  MATCH_MP_TAC MEASURE_POS_LE THEN ASM_SIMP_TAC[MEASURABLE_INTER]);; *)
   1.464 -
   1.465 -lemma measure_unions_le: True .. (*
   1.466 - "!f:(real^N->bool)->bool.
   1.467 -        FINITE f \<and> (!s. s \<in> f ==> gmeasurable s)
   1.468 -        ==> measure(UNIONS f) <= sum f (\<lambda>s. gmeasure s)"
   1.469 -qed   REWRITE_TAC[IMP_CONJ] THEN
   1.470 -  MATCH_MP_TAC FINITE_INDUCT_STRONG THEN
   1.471 -  SIMP_TAC[UNIONS_0; UNIONS_INSERT; SUM_CLAUSES] THEN
   1.472 -  REWRITE_TAC[MEASURE_EMPTY; REAL_LE_REFL] THEN
   1.473 -  MAP_EVERY X_GEN_TAC [`s:real^N->bool`; `f:(real^N->bool)->bool`] THEN
   1.474 -  REWRITE_TAC[IN_INSERT] THEN REPEAT STRIP_TAC THEN
   1.475 -  MATCH_MP_TAC REAL_LE_TRANS THEN
   1.476 -  EXISTS_TAC `measure(s:real^N->bool) + measure(UNIONS f:real^N->bool)` THEN
   1.477 -  ASM_SIMP_TAC[MEASURE_UNION_LE; GMEASURABLE_UNIONS] THEN
   1.478 -  REWRITE_TAC[REAL_LE_LADD] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
   1.479 -  ASM_SIMP_TAC[]);; *)
   1.480 -
   1.481 -lemma measure_unions_le_image: True .. (*
   1.482 - "!f:A->bool s:A->(real^N->bool).
   1.483 -        FINITE f \<and> (!a. a \<in> f ==> gmeasurable(s a))
   1.484 -        ==> measure(UNIONS (IMAGE s f)) <= sum f (\<lambda>a. measure(s a))"
   1.485 -qed   REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN
   1.486 -  EXISTS_TAC `sum (IMAGE s (f:A->bool)) (\<lambda>k:real^N->bool. gmeasure k)` THEN
   1.487 -  ASM_SIMP_TAC[MEASURE_UNIONS_LE; FORALL_IN_IMAGE; FINITE_IMAGE] THEN
   1.488 -  GEN_REWRITE_TAC (RAND_CONV o RAND_CONV) [GSYM o_DEF] THEN
   1.489 -  REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC SUM_IMAGE_LE THEN
   1.490 -  ASM_SIMP_TAC[MEASURE_POS_LE]);; *)
   1.491 -
   1.492 -lemma gmeasurable_inner_outer: True .. (*
   1.493 - "!s:real^N->bool.
   1.494 -        gmeasurable s \<longleftrightarrow>
   1.495 -                !e. 0 < e
   1.496 -                    ==> ?t u. t \<subseteq> s \<and> s \<subseteq> u \<and>
   1.497 -                              gmeasurable t \<and> gmeasurable u \<and>
   1.498 -                              abs(measure t - gmeasure u) < e"
   1.499 -qed   GEN_TAC THEN EQ_TAC THEN DISCH_TAC THENL
   1.500 -   [GEN_TAC THEN DISCH_TAC THEN REPEAT(EXISTS_TAC `s:real^N->bool`) THEN
   1.501 -    ASM_REWRITE_TAC[SUBSET_REFL; REAL_SUB_REFL; REAL_ABS_NUM];
   1.502 -    ALL_TAC] THEN
   1.503 -  REWRITE_TAC[MEASURABLE_INTEGRABLE] THEN MATCH_MP_TAC INTEGRABLE_STRADDLE THEN
   1.504 -  X_GEN_TAC `e:real` THEN DISCH_TAC THEN
   1.505 -  FIRST_X_ASSUM(MP_TAC o SPEC `e:real`) THEN
   1.506 -  ASM_REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
   1.507 -  MAP_EVERY X_GEN_TAC [`t:real^N->bool`; `u:real^N->bool`] THEN STRIP_TAC THEN
   1.508 -  MAP_EVERY EXISTS_TAC
   1.509 -   [`(\<lambda>x. if x \<in> t then 1 else 0):real^N->real^1`;
   1.510 -    `(\<lambda>x. if x \<in> u then 1 else 0):real^N->real^1`;
   1.511 -    `lift(measure(t:real^N->bool))`;
   1.512 -    `lift(measure(u:real^N->bool))`] THEN
   1.513 -  ASM_REWRITE_TAC[GSYM HAS_GMEASURE; GSYM HAS_GMEASURE_MEASURE] THEN
   1.514 -  ASM_REWRITE_TAC[GSYM LIFT_SUB; NORM_LIFT] THEN REPEAT STRIP_TAC THEN
   1.515 -  REPEAT(COND_CASES_TAC THEN
   1.516 -         ASM_REWRITE_TAC[_VEC; REAL_POS; REAL_LE_REFL]) THEN
   1.517 -  ASM SET_TAC[]);; *)
   1.518 -
   1.519 -lemma has_gmeasure_inner_outer: True .. (*
   1.520 - "!s:real^N->bool m.
   1.521 -        s has_gmeasure m \<longleftrightarrow>
   1.522 -                (!e. 0 < e ==> ?t. t \<subseteq> s \<and> gmeasurable t \<and>
   1.523 -                                    m - e < gmeasure t) \<and>
   1.524 -                (!e. 0 < e ==> ?u. s \<subseteq> u \<and> gmeasurable u \<and>
   1.525 -                                    gmeasure u < m + e)"
   1.526 -qed   REPEAT GEN_TAC THEN
   1.527 -  GEN_REWRITE_TAC LAND_CONV [HAS_GMEASURE_MEASURABLE_MEASURE] THEN EQ_TAC THENL
   1.528 -   [REPEAT STRIP_TAC THEN EXISTS_TAC `s:real^N->bool` THEN
   1.529 -    ASM_REWRITE_TAC[SUBSET_REFL] THEN ASM_REAL_ARITH_TAC;
   1.530 -    ALL_TAC] THEN
   1.531 -  DISCH_THEN(CONJUNCTS_THEN2 (LABEL_TAC "t") (LABEL_TAC "u")) THEN
   1.532 -  MATCH_MP_TAC(TAUT `a \<and> (a ==> b) ==> a \<and> b`) THEN CONJ_TAC THENL
   1.533 -   [GEN_REWRITE_TAC I [MEASURABLE_INNER_OUTER] THEN
   1.534 -    X_GEN_TAC `e:real` THEN DISCH_TAC THEN
   1.535 -    REMOVE_THEN "u" (MP_TAC o SPEC `e / 2`) THEN
   1.536 -    REMOVE_THEN "t" (MP_TAC o SPEC `e / 2`) THEN
   1.537 -    ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN
   1.538 -    REWRITE_TAC[IMP_IMP; LEFT_AND_EXISTS_THM] THEN
   1.539 -    REWRITE_TAC[RIGHT_AND_EXISTS_THM] THEN
   1.540 -    REPEAT(MATCH_MP_TAC MONO_EXISTS THEN GEN_TAC) THEN
   1.541 -    STRIP_TAC THEN ASM_REWRITE_TAC[] THEN MATCH_MP_TAC(REAL_ARITH
   1.542 -     `0 < e \<and> t <= u \<and> m - e / 2 < t \<and> u < m + e / 2
   1.543 -                          ==> abs(t - u) < e`) THEN
   1.544 -    ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MEASURE_SUBSET THEN
   1.545 -    ASM_REWRITE_TAC[] THEN ASM SET_TAC[];
   1.546 -    DISCH_TAC THEN MATCH_MP_TAC(REAL_ARITH
   1.547 -     `~(0 < x - y) \<and> ~(0 < y - x) ==> x = y`) THEN
   1.548 -    CONJ_TAC THEN DISCH_TAC THENL
   1.549 -     [REMOVE_THEN "u" (MP_TAC o SPEC `measure(s:real^N->bool) - m`) THEN
   1.550 -      ASM_REWRITE_TAC[REAL_SUB_ADD2; GSYM REAL_NOT_LE];
   1.551 -      REMOVE_THEN "t" (MP_TAC o SPEC `m - measure(s:real^N->bool)`) THEN
   1.552 -      ASM_REWRITE_TAC[REAL_SUB_SUB2; GSYM REAL_NOT_LE]] THEN
   1.553 -    ASM_MESON_TAC[MEASURE_SUBSET]]);; *)
   1.554 -
   1.555 -lemma has_gmeasure_inner_outer_le: True .. (*
   1.556 - "!s:real^N->bool m.
   1.557 -        s has_gmeasure m \<longleftrightarrow>
   1.558 -                (!e. 0 < e ==> ?t. t \<subseteq> s \<and> gmeasurable t \<and>
   1.559 -                                    m - e <= gmeasure t) \<and>
   1.560 -                (!e. 0 < e ==> ?u. s \<subseteq> u \<and> gmeasurable u \<and>
   1.561 -                                    gmeasure u <= m + e)"
   1.562 -qed   REWRITE_TAC[HAS_GMEASURE_INNER_OUTER] THEN
   1.563 -  MESON_TAC[REAL_ARITH `0 < e \<and> m - e / 2 <= t ==> m - e < t`;
   1.564 -            REAL_ARITH `0 < e \<and> u <= m + e / 2 ==> u < m + e`;
   1.565 -            REAL_ARITH `0 < e \<longleftrightarrow> 0 < e / 2`; REAL_LT_IMP_LE]);; *)
   1.566 -
   1.567 -lemma has_gmeasure_limit: True .. (*
   1.568 - "!s. s has_gmeasure m \<longleftrightarrow>
   1.569 -        !e. 0 < e
   1.570 -            ==> ?B. 0 < B \<and>
   1.571 -                    !a b. ball(0,B) \<subseteq> {a..b}
   1.572 -                          ==> ?z. (s \<inter> {a..b}) has_gmeasure z \<and>
   1.573 -                                  abs(z - m) < e"
   1.574 -qed   GEN_TAC THEN REWRITE_TAC[HAS_GMEASURE] THEN
   1.575 -  GEN_REWRITE_TAC LAND_CONV [HAS_INTEGRAL] THEN
   1.576 -  REWRITE_TAC[IN_UNIV] THEN
   1.577 -  GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV)
   1.578 -    [GSYM HAS_INTEGRAL_RESTRICT_UNIV] THEN
   1.579 -  REWRITE_TAC[MESON[IN_INTER]
   1.580 -        `(if x \<in> k \<inter> s then a else b) =
   1.581 -         (if x \<in> s then if x \<in> k then a else b else b)`] THEN
   1.582 -  REWRITE_TAC[EXISTS_LIFT; GSYM LIFT_SUB; NORM_LIFT]);; *)
   1.583 -
   1.584 -(* ------------------------------------------------------------------------- *)
   1.585 -(* properties of gmeasure under simple affine transformations.                *)
   1.586 -(* ------------------------------------------------------------------------- *)
   1.587 -
   1.588 -lemma has_gmeasure_affinity: True .. (*
   1.589 - "!s m c y. s has_gmeasure y
   1.590 -             ==> (IMAGE (\<lambda>x:real^N. m % x + c) s)
   1.591 -                 has_gmeasure abs(m) pow (dimindex(:N)) * y"
   1.592 -qed   REPEAT GEN_TAC THEN ASM_CASES_TAC `m = 0` THENL
   1.593 -   [ASM_REWRITE_TAC[REAL_ABS_NUM; VECTOR_ADD_LID; VECTOR_MUL_LZERO] THEN
   1.594 -    ONCE_REWRITE_TAC[MATCH_MP (ARITH_RULE `~(x = 0) ==> x = SUC(x - 1)`)
   1.595 -     (SPEC_ALL DIMINDEX_NONZERO)] THEN DISCH_TAC THEN
   1.596 -    REWRITE_TAC[real_pow; REAL_MUL_LZERO; HAS_GMEASURE_0] THEN
   1.597 -    MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN EXISTS_TAC `{c:real^N}` THEN
   1.598 -    SIMP_TAC[NEGLIGIBLE_FINITE; FINITE_RULES] THEN SET_TAC[];
   1.599 -    ALL_TAC] THEN
   1.600 -  REWRITE_TAC[HAS_GMEASURE] THEN
   1.601 -  ONCE_REWRITE_TAC[HAS_INTEGRAL] THEN REWRITE_TAC[IN_UNIV] THEN
   1.602 -  DISCH_TAC THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN
   1.603 -  FIRST_X_ASSUM(MP_TAC o SPEC `e:real / abs(m) pow dimindex(:N)`) THEN
   1.604 -  ASM_SIMP_TAC[REAL_LT_DIV; REAL_POW_LT; GSYM REAL_ABS_NZ; REAL_POW_LT] THEN
   1.605 -  DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC) THEN
   1.606 -  EXISTS_TAC `abs(m) * B + norm(c:real^N)` THEN
   1.607 -  ASM_SIMP_TAC[REAL_ARITH `0 < B \<and> 0 <= x ==> 0 < B + x`;
   1.608 -               NORM_POS_LE; REAL_LT_MUL; GSYM REAL_ABS_NZ; REAL_POW_LT] THEN
   1.609 -  MAP_EVERY X_GEN_TAC [`u:real^N`; `v:real^N`] THEN DISCH_TAC THEN
   1.610 -  REWRITE_TAC[IN_IMAGE] THEN
   1.611 -  ASM_SIMP_TAC[VECTOR_EQ_AFFINITY; UNWIND_THM1] THEN
   1.612 -  FIRST_X_ASSUM(MP_TAC o SPECL
   1.613 -    [`if 0 <= m then inv m % u + --(inv m % c):real^N
   1.614 -                 else inv m % v + --(inv m % c)`;
   1.615 -     `if 0 <= m then inv m % v + --(inv m % c):real^N
   1.616 -                 else inv m % u + --(inv m % c)`]) THEN
   1.617 -  MATCH_MP_TAC(TAUT `a \<and> (a ==> b ==> c) ==> (a ==> b) ==> c`) THEN
   1.618 -  CONJ_TAC THENL
   1.619 -   [REWRITE_TAC[SUBSET] THEN X_GEN_TAC `x:real^N` THEN
   1.620 -    FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
   1.621 -    DISCH_THEN(MP_TAC o SPEC `m % x + c:real^N`) THEN
   1.622 -    MATCH_MP_TAC MONO_IMP THEN REWRITE_TAC[IN_BALL; IN_INTERVAL] THEN
   1.623 -    CONJ_TAC THENL
   1.624 -     [REWRITE_TAC[NORM_ARITH `dist(0,x) = norm(x:real^N)`] THEN
   1.625 -      DISCH_TAC THEN MATCH_MP_TAC(NORM_ARITH
   1.626 -       `norm(x:real^N) < a ==> norm(x + y) < a + norm(y)`) THEN
   1.627 -      ASM_SIMP_TAC[NORM_MUL; REAL_LT_LMUL; GSYM REAL_ABS_NZ];
   1.628 -      ALL_TAC] THEN
   1.629 -    SIMP_TAC[VECTOR_ADD_COMPONENT; VECTOR_MUL_COMPONENT; VECTOR_NEG_COMPONENT;
   1.630 -             COND_COMPONENT] THEN
   1.631 -    MATCH_MP_TAC MONO_FORALL THEN GEN_TAC THEN MATCH_MP_TAC MONO_IMP THEN
   1.632 -    REWRITE_TAC[REAL_ARITH `m * u + --(m * c):real = (u - c) * m`] THEN
   1.633 -    SUBST1_TAC(REAL_ARITH
   1.634 -      `inv(m) = if 0 <= inv(m) then abs(inv m) else --(abs(inv m))`) THEN
   1.635 -    SIMP_TAC[REAL_LE_INV_EQ] THEN
   1.636 -    REWRITE_TAC[REAL_ARITH `(x - y:real) * --z = (y - x) * z`] THEN
   1.637 -    REWRITE_TAC[REAL_ABS_INV; GSYM real_div] THEN COND_CASES_TAC THEN
   1.638 -    ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_LE_RDIV_EQ; GSYM REAL_ABS_NZ] THEN
   1.639 -    ASM_REWRITE_TAC[real_abs] THEN REAL_ARITH_TAC;
   1.640 -    ALL_TAC] THEN
   1.641 -  REWRITE_TAC[SUBSET] THEN DISCH_THEN(MP_TAC o SPEC `0:real^N`) THEN
   1.642 -  ASM_REWRITE_TAC[CENTRE_IN_BALL] THEN DISCH_TAC THEN
   1.643 -  DISCH_THEN(X_CHOOSE_THEN `z:real^1`
   1.644 -   (fun th -> EXISTS_TAC `(abs m pow dimindex (:N)) % z:real^1` THEN
   1.645 -              MP_TAC th)) THEN
   1.646 -  DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
   1.647 -  FIRST_ASSUM(MP_TAC o MATCH_MP(REAL_FIELD `~(x = 0) ==> ~(inv x = 0)`)) THEN
   1.648 -  REWRITE_TAC[TAUT `a ==> b ==> c \<longleftrightarrow> b \<and> a ==> c`] THEN
   1.649 -  DISCH_THEN(MP_TAC o SPEC `--(inv m % c):real^N` o
   1.650 -    MATCH_MP HAS_INTEGRAL_AFFINITY) THEN
   1.651 -  ASM_REWRITE_TAC[IMAGE_AFFINITY_INTERVAL; REAL_INV_INV] THEN
   1.652 -  SIMP_TAC[COND_ID] THEN COND_CASES_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
   1.653 -  REWRITE_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC;
   1.654 -               VECTOR_MUL_LNEG; VECTOR_MUL_RNEG] THEN
   1.655 -  ASM_SIMP_TAC[REAL_MUL_RINV; VECTOR_MUL_LID; VECTOR_NEG_NEG] THEN
   1.656 -  REWRITE_TAC[VECTOR_ARITH `(u + --c) + c:real^N = u`] THEN
   1.657 -  REWRITE_TAC[REAL_ABS_INV; REAL_INV_INV; GSYM REAL_POW_INV] THEN
   1.658 -  DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN
   1.659 -  REWRITE_TAC[LIFT_CMUL; GSYM VECTOR_SUB_LDISTRIB] THEN
   1.660 -  REWRITE_TAC[NORM_MUL; REAL_ABS_POW; REAL_ABS_ABS] THEN
   1.661 -  ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
   1.662 -  ASM_SIMP_TAC[GSYM REAL_LT_RDIV_EQ; REAL_POW_LT; GSYM REAL_ABS_NZ]);; *)
   1.663 -
   1.664 -lemma stretch_galois: True .. (*
   1.665 - "!x:real^N y:real^N m.
   1.666 -        (!k. 1 <= k \<and> k <= dimindex(:N) ==>  ~(m k = 0))
   1.667 -        ==> ((y = (lambda k. m k * x$k)) \<longleftrightarrow> (lambda k. inv(m k) * y$k) = x)"
   1.668 -qed   REPEAT GEN_TAC THEN SIMP_TAC[CART_EQ; LAMBDA_BETA] THEN
   1.669 -  MATCH_MP_TAC(MESON[]
   1.670 -   `(!x. p x ==> (q x \<longleftrightarrow> r x))
   1.671 -    ==> (!x. p x) ==> ((!x. q x) \<longleftrightarrow> (!x. r x))`) THEN
   1.672 -  GEN_TAC THEN ASM_CASES_TAC `1 <= k \<and> k <= dimindex(:N)` THEN
   1.673 -  ASM_REWRITE_TAC[] THEN CONV_TAC REAL_FIELD);; *)
   1.674 -
   1.675 -lemma has_gmeasure_stretch: True .. (*
   1.676 - "!s m y. s has_gmeasure y
   1.677 -           ==> (IMAGE (\<lambda>x:real^N. lambda k. m k * x$k) s :real^N->bool)
   1.678 -               has_gmeasure abs(product (1..dimindex(:N)) m) * y"
   1.679 -qed   REPEAT STRIP_TAC THEN ASM_CASES_TAC
   1.680 -   `!k. 1 <= k \<and> k <= dimindex(:N) ==> ~(m k = 0)`
   1.681 -  THENL
   1.682 -   [ALL_TAC;
   1.683 -    FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [NOT_FORALL_THM]) THEN
   1.684 -    REWRITE_TAC[NOT_IMP; GSYM CONJ_ASSOC; LEFT_IMP_EXISTS_THM] THEN
   1.685 -    X_GEN_TAC `k:num` THEN STRIP_TAC THEN
   1.686 -    SUBGOAL_THEN `product(1..dimindex (:N)) m = 0` SUBST1_TAC THENL
   1.687 -     [ASM_MESON_TAC[PRODUCT_EQ_0_NUMSEG]; ALL_TAC] THEN
   1.688 -    REWRITE_TAC[REAL_ABS_NUM; REAL_MUL_LZERO; HAS_GMEASURE_0] THEN
   1.689 -    MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
   1.690 -    EXISTS_TAC `{x:real^N | x$k = 0}` THEN
   1.691 -    ASM_SIMP_TAC[NEGLIGIBLE_STANDARD_HYPERPLANE; SUBSET; FORALL_IN_IMAGE] THEN
   1.692 -    ASM_SIMP_TAC[IN_ELIM_THM; LAMBDA_BETA; REAL_MUL_LZERO]] THEN
   1.693 -  UNDISCH_TAC `(s:real^N->bool) has_gmeasure y` THEN
   1.694 -  REWRITE_TAC[HAS_GMEASURE] THEN
   1.695 -  ONCE_REWRITE_TAC[HAS_INTEGRAL] THEN REWRITE_TAC[IN_UNIV] THEN
   1.696 -  DISCH_TAC THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN
   1.697 -  SUBGOAL_THEN `0 < abs(product(1..dimindex(:N)) m)` ASSUME_TAC THENL
   1.698 -   [ASM_MESON_TAC[REAL_ABS_NZ; REAL_LT_DIV; PRODUCT_EQ_0_NUMSEG];
   1.699 -    ALL_TAC] THEN
   1.700 -  FIRST_X_ASSUM(MP_TAC o SPEC `e:real / abs(product(1..dimindex(:N)) m)`) THEN
   1.701 -  ASM_SIMP_TAC[REAL_LT_DIV] THEN
   1.702 -  DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC) THEN
   1.703 -  EXISTS_TAC `sup(IMAGE (\<lambda>k. abs(m k) * B) (1..dimindex(:N)))` THEN
   1.704 -  MATCH_MP_TAC(TAUT `a \<and> (a ==> b) ==> a \<and> b`) THEN CONJ_TAC THENL
   1.705 -   [ASM_SIMP_TAC[REAL_LT_SUP_FINITE; FINITE_IMAGE; NUMSEG_EMPTY; FINITE_NUMSEG;
   1.706 -                 IN_NUMSEG; GSYM NOT_LE; DIMINDEX_GE_1; IMAGE_EQ_EMPTY;
   1.707 -                 EXISTS_IN_IMAGE] THEN
   1.708 -    ASM_MESON_TAC[IN_NUMSEG; DIMINDEX_GE_1; LE_REFL; REAL_LT_MUL; REAL_ABS_NZ];
   1.709 -    DISCH_TAC] THEN
   1.710 -  MAP_EVERY X_GEN_TAC [`u:real^N`; `v:real^N`] THEN DISCH_TAC THEN
   1.711 -  ASM_SIMP_TAC[IN_IMAGE; STRETCH_GALOIS; UNWIND_THM1] THEN
   1.712 -  FIRST_X_ASSUM(MP_TAC o SPECL
   1.713 -    [`(lambda k. min (inv(m k) * (u:real^N)$k)
   1.714 -                     (inv(m k) * (v:real^N)$k)):real^N`;
   1.715 -     `(lambda k. max (inv(m k) * (u:real^N)$k)
   1.716 -                 (inv(m k) * (v:real^N)$k)):real^N`]) THEN
   1.717 -  MATCH_MP_TAC(TAUT `a \<and> (b ==> a ==> c) ==> (a ==> b) ==> c`) THEN
   1.718 -  CONJ_TAC THENL
   1.719 -   [ALL_TAC;
   1.720 -    REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN X_GEN_TAC `z:real^1` THEN
   1.721 -    DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
   1.722 -    SUBGOAL_THEN `!k. 1 <= k \<and> k <= dimindex (:N) ==> ~(inv(m k) = 0)`
   1.723 -    MP_TAC THENL [ASM_SIMP_TAC[REAL_INV_EQ_0]; ALL_TAC] THEN
   1.724 -    ONCE_REWRITE_TAC[GSYM IMP_CONJ_ALT] THEN
   1.725 -    DISCH_THEN(MP_TAC o MATCH_MP HAS_INTEGRAL_STRETCH)] THEN
   1.726 -  (MP_TAC(ISPECL [`u:real^N`; `v:real^N`; `\i:num. inv(m i)`]
   1.727 -    IMAGE_STRETCH_INTERVAL) THEN
   1.728 -   SUBGOAL_THEN `~(interval[u:real^N,v] = {})` ASSUME_TAC THENL
   1.729 -    [FIRST_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
   1.730 -      `s \<subseteq> t ==> ~(s = {}) ==> ~(t = {})`)) THEN
   1.731 -     ASM_REWRITE_TAC[BALL_EQ_EMPTY; GSYM REAL_NOT_LT];
   1.732 -     ALL_TAC] THEN
   1.733 -   ASM_REWRITE_TAC[] THEN DISCH_THEN(SUBST1_TAC o SYM))
   1.734 -  THENL
   1.735 -   [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
   1.736 -     `b \<subseteq> s ==> b' \<subseteq> IMAGE f b ==> b' \<subseteq> IMAGE f s`)) THEN
   1.737 -    REWRITE_TAC[IN_BALL; SUBSET; NORM_ARITH `dist(0,x) = norm x`;
   1.738 -                IN_IMAGE] THEN
   1.739 -    ASM_SIMP_TAC[STRETCH_GALOIS; REAL_INV_EQ_0; UNWIND_THM1; REAL_INV_INV] THEN
   1.740 -    X_GEN_TAC `x:real^N` THEN DISCH_TAC THEN
   1.741 -    MATCH_MP_TAC REAL_LET_TRANS THEN
   1.742 -    EXISTS_TAC
   1.743 -     `norm(sup(IMAGE(\<lambda>k. abs(m k)) (1..dimindex(:N))) % x:real^N)` THEN
   1.744 -    CONJ_TAC THENL
   1.745 -     [MATCH_MP_TAC NORM_LE_COMPONENTWISE THEN
   1.746 -      SIMP_TAC[LAMBDA_BETA; VECTOR_MUL_COMPONENT; REAL_ABS_MUL] THEN
   1.747 -      REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_RMUL THEN
   1.748 -      REWRITE_TAC[REAL_ABS_POS] THEN
   1.749 -      MATCH_MP_TAC(REAL_ARITH `x <= y ==> x <= abs y`) THEN
   1.750 -      ASM_SIMP_TAC[REAL_LE_SUP_FINITE; FINITE_IMAGE; IMAGE_EQ_EMPTY;
   1.751 -                  NUMSEG_EMPTY; FINITE_NUMSEG; GSYM NOT_LE; DIMINDEX_GE_1] THEN
   1.752 -      REWRITE_TAC[EXISTS_IN_IMAGE; IN_NUMSEG] THEN ASM_MESON_TAC[REAL_LE_REFL];
   1.753 -      ALL_TAC] THEN
   1.754 -    REWRITE_TAC[NORM_MUL] THEN MATCH_MP_TAC REAL_LTE_TRANS THEN
   1.755 -    EXISTS_TAC `abs(sup(IMAGE(\<lambda>k. abs(m k)) (1..dimindex(:N)))) * B` THEN
   1.756 -    SUBGOAL_THEN `0 < sup(IMAGE(\<lambda>k. abs(m k)) (1..dimindex(:N)))`
   1.757 -    ASSUME_TAC THENL
   1.758 -     [ASM_SIMP_TAC[REAL_LT_SUP_FINITE; FINITE_IMAGE; IMAGE_EQ_EMPTY;
   1.759 -                  NUMSEG_EMPTY; FINITE_NUMSEG; GSYM NOT_LE; DIMINDEX_GE_1] THEN
   1.760 -      REWRITE_TAC[EXISTS_IN_IMAGE; GSYM REAL_ABS_NZ; IN_NUMSEG] THEN
   1.761 -      ASM_MESON_TAC[DIMINDEX_GE_1; LE_REFL];
   1.762 -      ALL_TAC] THEN
   1.763 -    ASM_SIMP_TAC[REAL_LT_LMUL_EQ; REAL_ARITH `0 < x ==> 0 < abs x`] THEN
   1.764 -    MATCH_MP_TAC REAL_LE_TRANS THEN
   1.765 -    EXISTS_TAC `sup(IMAGE(\<lambda>k. abs(m k)) (1..dimindex(:N))) * B` THEN
   1.766 -    ASM_SIMP_TAC[REAL_LE_RMUL_EQ; REAL_ARITH `0 < x ==> abs x <= x`] THEN
   1.767 -    ASM_SIMP_TAC[REAL_LE_SUP_FINITE; FINITE_IMAGE; IMAGE_EQ_EMPTY;
   1.768 -                  NUMSEG_EMPTY; FINITE_NUMSEG; GSYM NOT_LE; DIMINDEX_GE_1] THEN
   1.769 -    ASM_SIMP_TAC[EXISTS_IN_IMAGE; REAL_LE_RMUL_EQ] THEN
   1.770 -    ASM_SIMP_TAC[REAL_SUP_LE_FINITE; FINITE_IMAGE; IMAGE_EQ_EMPTY;
   1.771 -                 NUMSEG_EMPTY; FINITE_NUMSEG; GSYM NOT_LE; DIMINDEX_GE_1] THEN
   1.772 -    MP_TAC(ISPEC `IMAGE (\<lambda>k. abs (m k)) (1..dimindex(:N))` SUP_FINITE) THEN
   1.773 -    REWRITE_TAC[FORALL_IN_IMAGE] THEN
   1.774 -    ASM_SIMP_TAC[FINITE_IMAGE; FINITE_NUMSEG; IMAGE_EQ_EMPTY; NUMSEG_EMPTY;
   1.775 -                 GSYM NOT_LE; DIMINDEX_GE_1] THEN
   1.776 -    REWRITE_TAC[IN_IMAGE] THEN MESON_TAC[];
   1.777 -
   1.778 -    MATCH_MP_TAC(MESON[]
   1.779 -     `s = t \<and> P z ==> (f has_integral z) s ==> Q
   1.780 -                       ==> ?w. (f has_integral w) t \<and> P w`) THEN
   1.781 -    SIMP_TAC[GSYM PRODUCT_INV; FINITE_NUMSEG; GSYM REAL_ABS_INV] THEN
   1.782 -    REWRITE_TAC[REAL_INV_INV] THEN CONJ_TAC THENL
   1.783 -     [REWRITE_TAC[GSYM IMAGE_o] THEN MATCH_MP_TAC(SET_RULE
   1.784 -       `(!x. f x = x) ==> IMAGE f s = s`) THEN
   1.785 -      SIMP_TAC[o_THM; LAMBDA_BETA; CART_EQ] THEN
   1.786 -      ASM_SIMP_TAC[REAL_MUL_ASSOC; REAL_MUL_RINV; REAL_MUL_LID];
   1.787 -      REWRITE_TAC[ABS_; _SUB; LIFT_; _CMUL] THEN
   1.788 -      REWRITE_TAC[GSYM REAL_SUB_LDISTRIB; ETA_AX] THEN
   1.789 -      REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_ABS] THEN
   1.790 -      ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
   1.791 -      ASM_SIMP_TAC[GSYM REAL_LT_RDIV_EQ] THEN
   1.792 -      ASM_MESON_TAC[ABS_; _SUB; LIFT_]]]);; *)
   1.793 -
   1.794 -lemma has_gmeasure_translation: True .. (*
   1.795 - "!s m a. s has_gmeasure m ==> (IMAGE (\<lambda>x:real^N. a + x) s) has_gmeasure m"
   1.796 -qed   REPEAT GEN_TAC THEN
   1.797 -  MP_TAC(ISPECL [`s:real^N->bool`; `1`; `a:real^N`; `m:real`]
   1.798 -                HAS_GMEASURE_AFFINITY) THEN
   1.799 -  REWRITE_TAC[VECTOR_MUL_LID; REAL_ABS_NUM; REAL_POW_ONE; REAL_MUL_LID] THEN
   1.800 -  REWRITE_TAC[VECTOR_ADD_SYM]);; *)
   1.801 -
   1.802 -lemma negligible_translation: True .. (*
   1.803 - "!s a. negligible s ==> negligible (IMAGE (\<lambda>x:real^N. a + x) s)"
   1.804 -qed   SIMP_TAC[GSYM HAS_GMEASURE_0; HAS_GMEASURE_TRANSLATION]);; *)
   1.805 -
   1.806 -lemma has_gmeasure_translation_eq: True .. (*
   1.807 - "!s m. (IMAGE (\<lambda>x:real^N. a + x) s) has_gmeasure m \<longleftrightarrow> s has_gmeasure m"
   1.808 -qed   REPEAT GEN_TAC THEN EQ_TAC THEN REWRITE_TAC[HAS_GMEASURE_TRANSLATION] THEN
   1.809 -  DISCH_THEN(MP_TAC o SPEC `--a:real^N` o
   1.810 -    MATCH_MP HAS_GMEASURE_TRANSLATION) THEN
   1.811 -  MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN
   1.812 -  REWRITE_TAC[GSYM IMAGE_o; o_DEF; VECTOR_ARITH `--a + a + b:real^N = b`] THEN
   1.813 -  SET_TAC[]);; *)
   1.814 -
   1.815 -lemma negligible_translation_rev: True .. (*
   1.816 - "!s a. negligible (IMAGE (\<lambda>x:real^N. a + x) s) ==> negligible s"
   1.817 -qed   SIMP_TAC[GSYM HAS_GMEASURE_0; HAS_GMEASURE_TRANSLATION_EQ]);; *)
   1.818 -
   1.819 -lemma negligible_translation_eq: True .. (*
   1.820 - "!s a. negligible (IMAGE (\<lambda>x:real^N. a + x) s) \<longleftrightarrow> negligible s"
   1.821 -qed   SIMP_TAC[GSYM HAS_GMEASURE_0; HAS_GMEASURE_TRANSLATION_EQ]);; *)
   1.822 -
   1.823 -lemma gmeasurable_translation: True .. (*
   1.824 - "!s. gmeasurable (IMAGE (\<lambda>x. a + x) s) \<longleftrightarrow> gmeasurable s"
   1.825 -qed   REWRITE_TAC[measurable; HAS_GMEASURE_TRANSLATION_EQ]);; *)
   1.826 -
   1.827 -lemma measure_translation: True .. (*
   1.828 - "!s. gmeasurable s ==> measure(IMAGE (\<lambda>x. a + x) s) = gmeasure s"
   1.829 -qed   REWRITE_TAC[HAS_GMEASURE_MEASURE] THEN REPEAT STRIP_TAC THEN
   1.830 -  MATCH_MP_TAC MEASURE_UNIQUE THEN
   1.831 -  ASM_REWRITE_TAC[HAS_GMEASURE_TRANSLATION_EQ]);; *)
   1.832 -
   1.833 -lemma has_gmeasure_scaling: True .. (*
   1.834 - "!s m c. s has_gmeasure m
   1.835 -           ==> (IMAGE (\<lambda>x:real^N. c % x) s) has_gmeasure
   1.836 -               (abs(c) pow dimindex(:N)) * m"
   1.837 -qed   REPEAT GEN_TAC THEN
   1.838 -  MP_TAC(ISPECL [`s:real^N->bool`; `c:real`; `0:real^N`; `m:real`]
   1.839 -                HAS_GMEASURE_AFFINITY) THEN
   1.840 -  REWRITE_TAC[VECTOR_ADD_RID]);; *)
   1.841 -
   1.842 -lemma has_gmeasure_scaling_eq: True .. (*
   1.843 - "!s m c. ~(c = 0)
   1.844 -           ==> (IMAGE (\<lambda>x:real^N. c % x) s
   1.845 -                  has_gmeasure (abs(c) pow dimindex(:N)) * m \<longleftrightarrow>
   1.846 -                s has_gmeasure m)"
   1.847 -qed   REPEAT STRIP_TAC THEN EQ_TAC THEN REWRITE_TAC[HAS_GMEASURE_SCALING] THEN
   1.848 -  DISCH_THEN(MP_TAC o SPEC `inv(c)` o MATCH_MP HAS_GMEASURE_SCALING) THEN
   1.849 -  REWRITE_TAC[GSYM IMAGE_o; o_DEF; GSYM REAL_ABS_MUL] THEN
   1.850 -  REWRITE_TAC[GSYM REAL_POW_MUL; VECTOR_MUL_ASSOC; REAL_MUL_ASSOC] THEN
   1.851 -  ASM_SIMP_TAC[GSYM REAL_ABS_MUL; REAL_MUL_LINV] THEN
   1.852 -  REWRITE_TAC[REAL_POW_ONE; REAL_ABS_NUM; REAL_MUL_LID; VECTOR_MUL_LID] THEN
   1.853 -  MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN SET_TAC[]);; *)
   1.854 -
   1.855 -lemma gmeasurable_scaling: True .. (*
   1.856 - "!s c. gmeasurable s ==> gmeasurable (IMAGE (\<lambda>x. c % x) s)"
   1.857 -qed   REWRITE_TAC[measurable] THEN MESON_TAC[HAS_GMEASURE_SCALING]);; *)
   1.858 -
   1.859 -lemma gmeasurable_scaling_eq: True .. (*
   1.860 - "!s c. ~(c = 0) ==> (measurable (IMAGE (\<lambda>x. c % x) s) \<longleftrightarrow> gmeasurable s)"
   1.861 -qed   REPEAT STRIP_TAC THEN EQ_TAC THEN REWRITE_TAC[MEASURABLE_SCALING] THEN
   1.862 -  DISCH_THEN(MP_TAC o SPEC `inv c` o MATCH_MP GMEASURABLE_SCALING) THEN
   1.863 -  REWRITE_TAC[GSYM IMAGE_o; o_DEF; GSYM REAL_ABS_MUL] THEN
   1.864 -  MATCH_MP_TAC EQ_IMP THEN AP_TERM_TAC THEN
   1.865 -  ASM_SIMP_TAC[VECTOR_MUL_ASSOC; REAL_MUL_LINV; VECTOR_MUL_LID] THEN
   1.866 -  SET_TAC[]);; *)
   1.867 -
   1.868 -lemma measure_scaling: True .. (*
   1.869 - "!s. gmeasurable s
   1.870 -       ==> measure(IMAGE (\<lambda>x:real^N. c % x) s) =
   1.871 -              (abs(c) pow dimindex(:N)) * gmeasure s"
   1.872 -qed   REWRITE_TAC[HAS_GMEASURE_MEASURE] THEN REPEAT STRIP_TAC THEN
   1.873 -  MATCH_MP_TAC MEASURE_UNIQUE THEN ASM_SIMP_TAC[HAS_GMEASURE_SCALING]);; *)
   1.874 -
   1.875 -(* ------------------------------------------------------------------------- *)
   1.876 -(* Measurability of countable unions and intersections of various kinds.     *)
   1.877 -(* ------------------------------------------------------------------------- *)
   1.878 -
   1.879 -lemma has_gmeasure_nested_unions:
   1.880 -  assumes "\<And>n. gmeasurable(s n)" "\<And>n. gmeasure(s n) \<le> B" "\<And>n. s(n) \<subseteq> s(Suc n)"
   1.881 -  shows "gmeasurable(\<Union> { s n | n. n \<in> UNIV }) \<and>
   1.882 -  (\<lambda>n. gmeasure(s n)) ----> gmeasure(\<Union> { s(n) | n. n \<in> UNIV })"
   1.883 -proof- let ?g = "\<lambda>x. if x \<in> \<Union>{s n |n. n \<in> UNIV} then 1 else (0::real)"
   1.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"
   1.885 -  proof(rule monotone_convergence_increasing)
   1.886 -    case goal1 show ?case using assms(1) unfolding gmeasurable_integrable by auto
   1.887 -    case goal2 show ?case using assms(3) by auto
   1.888 -    have "\<forall>m n. m\<le>n \<longrightarrow> s m \<subseteq> s n" apply(subst transitive_stepwise_le_eq)
   1.889 -      using assms(3) by auto note * = this[rule_format]
   1.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"
   1.891 -      apply(rule_tac x=n in exI) using * by auto 
   1.892 -    case goal3 show ?case unfolding Lim_sequentially by(auto intro!: **) 
   1.893 -    case goal4 show ?case unfolding bounded_def apply(rule_tac x=0 in exI)
   1.894 -      apply(rule_tac x=B in exI) unfolding dist_real_def apply safe
   1.895 -      unfolding measure_integral_univ[OF assms(1),THEN sym]
   1.896 -      apply(subst abs_of_nonpos) using assms(1,2) by auto
   1.897 -  qed note conjunctD2[OF this]
   1.898 -  thus ?thesis unfolding gmeasurable_integrable[THEN sym] measure_integral_univ[OF assms(1)]
   1.899 -    apply- unfolding measure_integral_univ by auto
   1.900 -qed
   1.901 -
   1.902 -lemmas gmeasurable_nested_unions = has_gmeasure_nested_unions(1)
   1.903 -
   1.904 -lemma sums_alt:"f sums s = (\<lambda>n. setsum f {0..n}) ----> s"
   1.905 -proof- have *:"\<And>n. {0..<Suc n} = {0..n}" by auto
   1.906 -  show ?thesis unfolding sums_def apply(subst LIMSEQ_Suc_iff[THEN sym]) unfolding * ..
   1.907 -qed
   1.908 -
   1.909 -lemma has_gmeasure_countable_negligible_unions: 
   1.910 -  assumes "\<And>n. gmeasurable(s n)" "\<And>m n. m \<noteq> n \<Longrightarrow> negligible(s m \<inter> s n)"
   1.911 -  "\<And>n. setsum (\<lambda>k. gmeasure(s k)) {0..n}  <= B"
   1.912 -  shows "gmeasurable(\<Union> { s(n) |n. n \<in> UNIV })" (is ?m)
   1.913 -  "((\<lambda>n. gmeasure(s n)) sums (gmeasure(\<Union> { s(n) |n. n \<in> UNIV })))" (is ?s)
   1.914 -proof- have *:"\<And>n. (\<Union> (s ` {0..n})) has_gmeasure (setsum (\<lambda>k. gmeasure(s k)) {0..n})"
   1.915 -    apply(rule has_gmeasure_negligible_unions_image) using assms by auto
   1.916 -  have **:"(\<Union>{\<Union>s ` {0..n} |n. n \<in> UNIV}) = (\<Union>{s n |n. n \<in> UNIV})" unfolding simple_image by fastsimp
   1.917 -  have "gmeasurable (\<Union>{\<Union>s ` {0..n} |n. n \<in> UNIV}) \<and>
   1.918 -    (\<lambda>n. gmeasure (\<Union>(s ` {0..n}))) ----> gmeasure (\<Union>{\<Union>s ` {0..n} |n. n \<in> UNIV})"
   1.919 -    apply(rule has_gmeasure_nested_unions) apply(rule gmeasurableI,rule *)
   1.920 -    unfolding measure_unique[OF *] defer apply(rule Union_mono,rule image_mono) using assms(3) by auto
   1.921 -  note lem = conjunctD2[OF this,unfolded **]
   1.922 -  show ?m using lem(1) .
   1.923 -  show ?s using lem(2) unfolding sums_alt measure_unique[OF *] .
   1.924 -qed     
   1.925 -
   1.926 -lemma negligible_countable_unions: True .. (*
   1.927 - "!s:num->real^N->bool.
   1.928 -        (!n. negligible(s n)) ==> negligible(UNIONS {s(n) | n \<in> (:num)})"
   1.929 -qed   REPEAT STRIP_TAC THEN
   1.930 -  MP_TAC(ISPECL [`s:num->real^N->bool`; `0`]
   1.931 -    HAS_GMEASURE_COUNTABLE_NEGLIGIBLE_UNIONS) THEN
   1.932 -  ASM_SIMP_TAC[MEASURE_EQ_0; SUM_0; REAL_LE_REFL; LIFT_NUM] THEN ANTS_TAC THENL
   1.933 -   [ASM_MESON_TAC[HAS_GMEASURE_0; gmeasurable; INTER_SUBSET; NEGLIGIBLE_SUBSET];
   1.934 -    ALL_TAC] THEN
   1.935 -  SIMP_TAC[GSYM GMEASURABLE_MEASURE_EQ_0] THEN
   1.936 -  STRIP_TAC THEN REWRITE_TAC[GSYM LIFT_EQ] THEN
   1.937 -  MATCH_MP_TAC SERIES_UNIQUE THEN REWRITE_TAC[LIFT_NUM] THEN
   1.938 -  MAP_EVERY EXISTS_TAC [`(\<lambda>k. 0):num->real^1`; `from 0`] THEN
   1.939 -  ASM_REWRITE_TAC[SERIES_0]);; *)
   1.940 -
   1.941 -lemma gmeasurable_countable_unions_strong:
   1.942 -  assumes "\<And>n. gmeasurable(s n)" "\<And>n::nat. gmeasure(\<Union>{s k |k. k \<le> n}) \<le> B"
   1.943 -  shows "gmeasurable(\<Union>{ s(n) |n. n \<in> UNIV })"
   1.944 -proof- have *:"\<Union>{\<Union>s ` {0..n} |n. n \<in> UNIV} = \<Union>range s" unfolding simple_image by fastsimp
   1.945 -  show ?thesis unfolding simple_image
   1.946 -    apply(rule gmeasurable_nested_unions[of "\<lambda>n. \<Union>(s ` {0..n})", THEN conjunct1,unfolded *])
   1.947 -  proof- fix n::nat show "gmeasurable (\<Union>s ` {0..n})"
   1.948 -      apply(rule gmeasurable_finite_unions) using assms(1) by auto
   1.949 -    show "gmeasure (\<Union>s ` {0..n}) \<le> B"
   1.950 -      using assms(2)[of n] unfolding simple_image[THEN sym] by auto
   1.951 -    show "\<Union>s ` {0..n} \<subseteq> \<Union>s ` {0..Suc n}" apply(rule Union_mono) by auto
   1.952 -  qed
   1.953 -qed
   1.954 -
   1.955 -lemma has_gmeasure_countable_negligible_unions_bounded: True .. (*
   1.956 - "!s:num->real^N->bool.
   1.957 -        (!n. gmeasurable(s n)) \<and>
   1.958 -        (!m n. ~(m = n) ==> negligible(s m \<inter> s n)) \<and>
   1.959 -        bounded(\<Union>{ s(n) | n \<in> (:num) })
   1.960 -        ==> gmeasurable(\<Union>{ s(n) | n \<in> (:num) }) \<and>
   1.961 -            ((\<lambda>n. lift(measure(s n))) sums
   1.962 -             lift(measure(\<Union>{ s(n) | n \<in> (:num) }))) (from 0)"
   1.963 -qed   REPEAT GEN_TAC THEN STRIP_TAC THEN
   1.964 -  FIRST_ASSUM(MP_TAC o MATCH_MP BOUNDED_SUBSET_CLOSED_INTERVAL) THEN
   1.965 -  REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
   1.966 -  MAP_EVERY X_GEN_TAC [`a:real^N`; `b:real^N`] THEN DISCH_TAC THEN
   1.967 -  MATCH_MP_TAC HAS_GMEASURE_COUNTABLE_NEGLIGIBLE_UNIONS THEN
   1.968 -  EXISTS_TAC `measure(interval[a:real^N,b])` THEN
   1.969 -  ASM_REWRITE_TAC[] THEN X_GEN_TAC `n:num` THEN MATCH_MP_TAC REAL_LE_TRANS THEN
   1.970 -  EXISTS_TAC `measure(UNIONS (IMAGE (s:num->real^N->bool) (0..n)))` THEN
   1.971 -  CONJ_TAC THENL
   1.972 -   [MATCH_MP_TAC REAL_EQ_IMP_LE THEN CONV_TAC SYM_CONV THEN
   1.973 -    MATCH_MP_TAC MEASURE_NEGLIGIBLE_UNIONS_IMAGE THEN
   1.974 -    ASM_SIMP_TAC[FINITE_NUMSEG];
   1.975 -    MATCH_MP_TAC MEASURE_SUBSET THEN REWRITE_TAC[MEASURABLE_INTERVAL] THEN
   1.976 -    CONJ_TAC THENL
   1.977 -     [MATCH_MP_TAC GMEASURABLE_UNIONS THEN
   1.978 -      ASM_SIMP_TAC[FINITE_IMAGE; FINITE_NUMSEG; FORALL_IN_IMAGE];
   1.979 -      ASM SET_TAC[]]]);; *)
   1.980 -
   1.981 -lemma gmeasurable_countable_negligible_unions_bounded: True .. (*
   1.982 - "!s:num->real^N->bool.
   1.983 -        (!n. gmeasurable(s n)) \<and>
   1.984 -        (!m n. ~(m = n) ==> negligible(s m \<inter> s n)) \<and>
   1.985 -        bounded(\<Union>{ s(n) | n \<in> (:num) })
   1.986 -        ==> gmeasurable(\<Union>{ s(n) | n \<in> (:num) })"
   1.987 -qed   SIMP_TAC[HAS_GMEASURE_COUNTABLE_NEGLIGIBLE_UNIONS_BOUNDED]);; *)
   1.988 -
   1.989 -lemma gmeasurable_countable_unions: True .. (*
   1.990 - "!s:num->real^N->bool B.
   1.991 -        (!n. gmeasurable(s n)) \<and>
   1.992 -        (!n. sum (0..n) (\<lambda>k. measure(s k)) \<le> B)
   1.993 -        ==> gmeasurable(\<Union>{ s(n) | n \<in> (:num) })"
   1.994 -qed   REPEAT STRIP_TAC THEN MATCH_MP_TAC GMEASURABLE_COUNTABLE_UNIONS_STRONG THEN
   1.995 -  EXISTS_TAC `B:real` THEN ASM_REWRITE_TAC[] THEN
   1.996 -  X_GEN_TAC `n:num` THEN MATCH_MP_TAC REAL_LE_TRANS THEN
   1.997 -  EXISTS_TAC `sum(0..n) (\<lambda>k. measure(s k:real^N->bool))` THEN
   1.998 -  ASM_REWRITE_TAC[] THEN
   1.999 -  W(MP_TAC o PART_MATCH (rand o rand) MEASURE_UNIONS_LE_IMAGE o
  1.1000 -       rand o snd) THEN
  1.1001 -  ASM_REWRITE_TAC[FINITE_NUMSEG] THEN
  1.1002 -  ONCE_REWRITE_TAC[GSYM SIMPLE_IMAGE] THEN
  1.1003 -  REWRITE_TAC[IN_NUMSEG; LE_0]);; *)
  1.1004 -
  1.1005 -lemma gmeasurable_countable_inters: True .. (*
  1.1006 - "!s:num->real^N->bool.
  1.1007 -        (!n. gmeasurable(s n))
  1.1008 -        ==> gmeasurable(INTERS { s(n) | n \<in> (:num) })"
  1.1009 -qed   REPEAT STRIP_TAC THEN
  1.1010 -  SUBGOAL_THEN `INTERS { s(n):real^N->bool | n \<in> (:num) } =
  1.1011 -                s 0 DIFF (\<Union>{s 0 DIFF s n | n \<in> (:num)})`
  1.1012 -  SUBST1_TAC THENL
  1.1013 -   [GEN_REWRITE_TAC I [EXTENSION] THEN
  1.1014 -    REWRITE_TAC[IN_INTERS; IN_DIFF; IN_UNIONS] THEN
  1.1015 -    REWRITE_TAC[SIMPLE_IMAGE; FORALL_IN_IMAGE; EXISTS_IN_IMAGE] THEN
  1.1016 -    ASM SET_TAC[];
  1.1017 -    ALL_TAC] THEN
  1.1018 -  MATCH_MP_TAC GMEASURABLE_DIFF THEN ASM_REWRITE_TAC[] THEN
  1.1019 -  MATCH_MP_TAC GMEASURABLE_COUNTABLE_UNIONS_STRONG THEN
  1.1020 -  EXISTS_TAC `measure(s 0:real^N->bool)` THEN
  1.1021 -  ASM_SIMP_TAC[MEASURABLE_DIFF; LE_0] THEN
  1.1022 -  GEN_TAC THEN MATCH_MP_TAC MEASURE_SUBSET THEN
  1.1023 -  ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
  1.1024 -   [ALL_TAC;
  1.1025 -    REWRITE_TAC[SUBSET; FORALL_IN_UNIONS; IN_ELIM_THM; IN_DIFF] THEN
  1.1026 -    MESON_TAC[IN_DIFF]] THEN
  1.1027 -  ONCE_REWRITE_TAC[GSYM IN_NUMSEG_0] THEN
  1.1028 -  ONCE_REWRITE_TAC[SIMPLE_IMAGE] THEN
  1.1029 -  ASM_SIMP_TAC[FORALL_IN_IMAGE; FINITE_IMAGE; FINITE_NUMSEG;
  1.1030 -               GMEASURABLE_DIFF; GMEASURABLE_UNIONS]);; *)
  1.1031 -
  1.1032 -(* ------------------------------------------------------------------------- *)
  1.1033 -(* measurability of compact and bounded open sets.                           *)
  1.1034 -(* ------------------------------------------------------------------------- *)
  1.1035 -
  1.1036 -lemma gmeasurable_compact: True .. (*
  1.1037 - "!s:real^N->bool. compact s ==> gmeasurable s"
  1.1038 -qed   lemma lemma = prove
  1.1039 -   (`!f s:real^N->bool.
  1.1040 -          (!n. FINITE(f n)) \<and>
  1.1041 -          (!n. s \<subseteq> UNIONS(f n)) \<and>
  1.1042 -          (!x. ~(x \<in> s) ==> ?n. ~(x \<in> UNIONS(f n))) \<and>
  1.1043 -          (!n a. a \<in> f(SUC n) ==> ?b. b \<in> f(n) \<and> a \<subseteq> b) \<and>
  1.1044 -          (!n a. a \<in> f(n) ==> gmeasurable a)
  1.1045 -          ==> gmeasurable s"
  1.1046 -qed     REPEAT STRIP_TAC THEN
  1.1047 -    SUBGOAL_THEN `!n. UNIONS(f(SUC n):(real^N->bool)->bool) \<subseteq> UNIONS(f n)`
  1.1048 -    ASSUME_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
  1.1049 -    SUBGOAL_THEN `s = INTERS { UNIONS(f n) | n \<in> (:num) }:real^N->bool`
  1.1050 -    SUBST1_TAC THENL
  1.1051 -     [ONCE_REWRITE_TAC[SIMPLE_IMAGE] THEN
  1.1052 -      MATCH_MP_TAC SUBSET_ANTISYM THEN CONJ_TAC THEN
  1.1053 -      REWRITE_TAC[SUBSET; IN_INTERS; FORALL_IN_IMAGE; IN_UNIV] THEN
  1.1054 -      REWRITE_TAC[IN_IMAGE] THEN ASM SET_TAC[];
  1.1055 -      MATCH_MP_TAC GMEASURABLE_COUNTABLE_INTERS THEN
  1.1056 -      ASM_REWRITE_TAC[] THEN GEN_TAC THEN
  1.1057 -      MATCH_MP_TAC GMEASURABLE_UNIONS THEN
  1.1058 -      ASM_MESON_TAC[]]) in
  1.1059 -  REPEAT STRIP_TAC THEN MATCH_MP_TAC lemma THEN
  1.1060 -  EXISTS_TAC
  1.1061 -   `\n. { k | ?u:real^N. (!i. 1 \<le> i \<and> i \<le> dimindex(:N)
  1.1062 -                              ==> integer(u$i)) \<and>
  1.1063 -                  k = { x:real^N | !i. 1 \<le> i \<and> i \<le> dimindex(:N)
  1.1064 -                                       ==> u$i / 2 pow n \<le> x$i \<and>
  1.1065 -                                           x$i < (u$i + 1) / 2 pow n } \<and>
  1.1066 -                  ~(s \<inter> k = {})}` THEN
  1.1067 -  REWRITE_TAC[IN_ELIM_THM] THEN REPEAT CONJ_TAC THENL
  1.1068 -   [X_GEN_TAC `n:num` THEN
  1.1069 -    SIMP_TAC[REAL_LE_LDIV_EQ; REAL_LT_RDIV_EQ; REAL_LT_POW2] THEN
  1.1070 -    SUBGOAL_THEN
  1.1071 -     `?N. !x:real^N i. x \<in> s \<and> 1 \<le> i \<and> i \<le> dimindex(:N)
  1.1072 -                       ==> abs(x$i * 2 pow n) < N`
  1.1073 -    STRIP_ASSUME_TAC THENL
  1.1074 -     [FIRST_ASSUM(MP_TAC o MATCH_MP COMPACT_IMP_BOUNDED) THEN
  1.1075 -      REWRITE_TAC[BOUNDED_POS; LEFT_IMP_EXISTS_THM] THEN
  1.1076 -      X_GEN_TAC `B:real` THEN STRIP_TAC THEN
  1.1077 -      MP_TAC(SPEC `B * 2 pow n` (MATCH_MP REAL_ARCH REAL_LT_01)) THEN
  1.1078 -      MATCH_MP_TAC MONO_EXISTS THEN REWRITE_TAC[REAL_MUL_RID] THEN
  1.1079 -      X_GEN_TAC `N:num` THEN
  1.1080 -      REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_POW; REAL_ABS_NUM] THEN
  1.1081 -      SIMP_TAC[GSYM REAL_LT_RDIV_EQ; REAL_LT_POW2] THEN
  1.1082 -      ASM_MESON_TAC[COMPONENT_LE_NORM; REAL_LE_TRANS; REAL_LET_TRANS];
  1.1083 -      ALL_TAC] THEN
  1.1084 -    MATCH_MP_TAC FINITE_SUBSET THEN
  1.1085 -    EXISTS_TAC
  1.1086 -     `IMAGE (\<lambda>u. {x | !i. 1 \<le> i \<and> i \<le> dimindex(:N)
  1.1087 -                          ==> (u:real^N)$i \<le> (x:real^N)$i * 2 pow n \<and>
  1.1088 -                              x$i * 2 pow n < u$i + 1})
  1.1089 -            {u | !i. 1 \<le> i \<and> i \<le> dimindex(:N) ==> integer (u$i) \<and>
  1.1090 -                                                     abs(u$i) \<le> N}` THEN
  1.1091 -    CONJ_TAC THENL
  1.1092 -     [MATCH_MP_TAC FINITE_IMAGE THEN MATCH_MP_TAC FINITE_CART THEN
  1.1093 -      REWRITE_TAC[GSYM REAL_BOUNDS_LE; FINITE_INTSEG];
  1.1094 -      REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_IMAGE] THEN
  1.1095 -      X_GEN_TAC `l:real^N->bool` THEN
  1.1096 -      MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `u:real^N` THEN
  1.1097 -      STRIP_TAC THEN FIRST_X_ASSUM SUBST_ALL_TAC THEN ASM_SIMP_TAC[] THEN
  1.1098 -      X_GEN_TAC `k:num` THEN STRIP_TAC THEN
  1.1099 -      MATCH_MP_TAC REAL_LE_REVERSE_INTEGERS THEN
  1.1100 -      ASM_SIMP_TAC[INTEGER_CLOSED] THEN
  1.1101 -      FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM MEMBER_NOT_EMPTY]) THEN
  1.1102 -      DISCH_THEN(X_CHOOSE_THEN `x:real^N` MP_TAC) THEN
  1.1103 -      REWRITE_TAC[IN_INTER; IN_ELIM_THM] THEN
  1.1104 -      DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC (MP_TAC o SPEC `k:num`)) THEN
  1.1105 -      ASM_REWRITE_TAC[] THEN
  1.1106 -      FIRST_X_ASSUM(MP_TAC o SPECL [`x:real^N`; `k:num`]) THEN
  1.1107 -      ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC];
  1.1108 -    X_GEN_TAC `n:num` THEN REWRITE_TAC[SUBSET; IN_UNIONS; IN_ELIM_THM] THEN
  1.1109 -    X_GEN_TAC `x:real^N` THEN DISCH_TAC THEN
  1.1110 -    REWRITE_TAC[LEFT_AND_EXISTS_THM] THEN
  1.1111 -    ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN
  1.1112 -    EXISTS_TAC `(lambda i. floor(2 pow n * (x:real^N)$i)):real^N` THEN
  1.1113 -    ONCE_REWRITE_TAC[TAUT `(a \<and> b \<and> c) \<and> d \<longleftrightarrow> b \<and> a \<and> c \<and> d`] THEN
  1.1114 -    REWRITE_TAC[UNWIND_THM2] THEN SIMP_TAC[LAMBDA_BETA; FLOOR] THEN
  1.1115 -    REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_INTER] THEN
  1.1116 -    REWRITE_TAC[LEFT_AND_EXISTS_THM] THEN EXISTS_TAC `x:real^N` THEN
  1.1117 -    ASM_REWRITE_TAC[IN_ELIM_THM] THEN
  1.1118 -    SIMP_TAC[REAL_LE_LDIV_EQ; REAL_LT_RDIV_EQ; REAL_LT_POW2] THEN
  1.1119 -    REWRITE_TAC[REAL_MUL_SYM; FLOOR];
  1.1120 -    X_GEN_TAC `x:real^N` THEN DISCH_TAC THEN
  1.1121 -    FIRST_ASSUM(MP_TAC o MATCH_MP COMPACT_IMP_CLOSED) THEN
  1.1122 -    REWRITE_TAC[closed; open_def] THEN
  1.1123 -    DISCH_THEN(MP_TAC o SPEC `x:real^N`) THEN
  1.1124 -    ASM_REWRITE_TAC[IN_DIFF; IN_UNIV] THEN
  1.1125 -    DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
  1.1126 -    MP_TAC(SPECL [`inv(2)`; `e / (dimindex(:N))`] REAL_ARCH_POW_INV) THEN
  1.1127 -    ASM_SIMP_TAC[REAL_LT_DIV; REAL_LT_RDIV_EQ; REAL_OF_NUM_LT;
  1.1128 -                 DIMINDEX_GE_1; ARITH_RULE `0 < x \<longleftrightarrow> 1 \<le> x`] THEN
  1.1129 -    CONV_TAC REAL_RAT_REDUCE_CONV THEN
  1.1130 -    MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN
  1.1131 -    REWRITE_TAC[IN_UNIONS; IN_ELIM_THM] THEN
  1.1132 -    REWRITE_TAC[LEFT_AND_EXISTS_THM] THEN
  1.1133 -    ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN
  1.1134 -    ONCE_REWRITE_TAC[TAUT `(a \<and> b \<and> c) \<and> d \<longleftrightarrow> b \<and> a \<and> c \<and> d`] THEN
  1.1135 -    REWRITE_TAC[UNWIND_THM2] THEN REWRITE_TAC[NOT_EXISTS_THM] THEN
  1.1136 -    X_GEN_TAC `u:real^N` THEN REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN
  1.1137 -    REWRITE_TAC[IN_INTER; IN_ELIM_THM] THEN
  1.1138 -    DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC o CONJUNCT2) THEN
  1.1139 -    DISCH_THEN(X_CHOOSE_THEN `y:real^N`
  1.1140 -     (CONJUNCTS_THEN2 MP_TAC ASSUME_TAC)) THEN
  1.1141 -    REWRITE_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
  1.1142 -    FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
  1.1143 -     `d < e ==> x \<le> d ==> x < e`)) THEN
  1.1144 -    REWRITE_TAC[dist] THEN
  1.1145 -    W(MP_TAC o PART_MATCH lhand NORM_LE_L1 o lhand o snd) THEN
  1.1146 -    MATCH_MP_TAC(REAL_ARITH `a \<le> b ==> x \<le> a ==> x \<le> b`) THEN
  1.1147 -    GEN_REWRITE_TAC (funpow 3 RAND_CONV) [GSYM CARD_NUMSEG_1] THEN
  1.1148 -    ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN MATCH_MP_TAC SUM_BOUND THEN
  1.1149 -    SIMP_TAC[FINITE_NUMSEG; IN_NUMSEG; VECTOR_SUB_COMPONENT] THEN
  1.1150 -    X_GEN_TAC `k:num` THEN STRIP_TAC THEN
  1.1151 -    REPEAT(FIRST_X_ASSUM(MP_TAC o SPEC `k:num`)) THEN
  1.1152 -    ASM_REWRITE_TAC[real_div; REAL_ADD_RDISTRIB] THEN
  1.1153 -    REWRITE_TAC[REAL_MUL_LID; GSYM REAL_POW_INV] THEN REAL_ARITH_TAC;
  1.1154 -    MAP_EVERY X_GEN_TAC [`n:num`; `a:real^N->bool`] THEN
  1.1155 -    DISCH_THEN(X_CHOOSE_THEN `u:real^N`
  1.1156 -     (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
  1.1157 -    DISCH_THEN(CONJUNCTS_THEN2 (ASSUME_TAC o SYM) ASSUME_TAC) THEN
  1.1158 -    REWRITE_TAC[LEFT_AND_EXISTS_THM] THEN
  1.1159 -    ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN
  1.1160 -    ONCE_REWRITE_TAC[TAUT `(a \<and> b \<and> c) \<and> d \<longleftrightarrow> b \<and> a \<and> c \<and> d`] THEN
  1.1161 -    REWRITE_TAC[UNWIND_THM2] THEN
  1.1162 -    EXISTS_TAC `(lambda i. floor((u:real^N)$i / 2)):real^N` THEN
  1.1163 -    ASM_SIMP_TAC[VECTOR_MUL_COMPONENT; LAMBDA_BETA; FLOOR] THEN
  1.1164 -    MATCH_MP_TAC(SET_RULE `~(s \<inter> a = {}) \<and> a \<subseteq> b
  1.1165 -                           ==> ~(s \<inter> b = {}) \<and> a \<subseteq> b`) THEN
  1.1166 -    ASM_REWRITE_TAC[] THEN EXPAND_TAC "a" THEN REWRITE_TAC[SUBSET] THEN
  1.1167 -    X_GEN_TAC `x:real^N` THEN REWRITE_TAC[IN_ELIM_THM] THEN
  1.1168 -    MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `k:num` THEN
  1.1169 -    DISCH_THEN(fun th -> STRIP_TAC THEN MP_TAC th) THEN ASM_REWRITE_TAC[] THEN
  1.1170 -    REWRITE_TAC[real_pow; real_div; REAL_INV_MUL; REAL_MUL_ASSOC] THEN
  1.1171 -    REWRITE_TAC[GSYM real_div] THEN
  1.1172 -    SIMP_TAC[REAL_LE_LDIV_EQ; REAL_LT_RDIV_EQ; REAL_LT_POW2] THEN
  1.1173 -    MP_TAC(SPEC `(u:real^N)$k / 2` FLOOR) THEN
  1.1174 -    REWRITE_TAC[REAL_ARITH `u / 2 < floor(u / 2) + 1 \<longleftrightarrow>
  1.1175 -                            u < 2 * floor(u / 2) + 2`] THEN
  1.1176 -    ASM_SIMP_TAC[REAL_LT_INTEGERS; INTEGER_CLOSED; FLOOR_FRAC] THEN
  1.1177 -    REAL_ARITH_TAC;
  1.1178 -    REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
  1.1179 -    MAP_EVERY X_GEN_TAC [`n:num`; `a:real^N->bool`; `u:real^N`] THEN
  1.1180 -    DISCH_THEN(SUBST1_TAC o CONJUNCT1 o CONJUNCT2) THEN
  1.1181 -    ONCE_REWRITE_TAC[MEASURABLE_INNER_OUTER] THEN
  1.1182 -    GEN_TAC THEN DISCH_TAC THEN
  1.1183 -    EXISTS_TAC `interval(inv(2 pow n) % u:real^N,
  1.1184 -                         inv(2 pow n) % (u + 1))` THEN
  1.1185 -    EXISTS_TAC `interval[inv(2 pow n) % u:real^N,
  1.1186 -                         inv(2 pow n) % (u + 1)]` THEN
  1.1187 -    REWRITE_TAC[MEASURABLE_INTERVAL; MEASURE_INTERVAL] THEN
  1.1188 -    ASM_REWRITE_TAC[REAL_SUB_REFL; REAL_ABS_0] THEN
  1.1189 -    REWRITE_TAC[SUBSET; IN_INTERVAL; IN_ELIM_THM] THEN
  1.1190 -    CONJ_TAC THEN X_GEN_TAC `y:real^N` THEN
  1.1191 -    MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `k:num` THEN
  1.1192 -    DISCH_THEN(fun th -> STRIP_TAC THEN MP_TAC th) THEN
  1.1193 -    ASM_SIMP_TAC[VECTOR_MUL_COMPONENT; VECTOR_ADD_COMPONENT;
  1.1194 -                 VEC_COMPONENT] THEN
  1.1195 -    REAL_ARITH_TAC]);; *)
  1.1196 -
  1.1197 -lemma gmeasurable_open: True .. (*
  1.1198 - "!s:real^N->bool. bounded s \<and> open s ==> gmeasurable s"
  1.1199 -qed   REPEAT STRIP_TAC THEN
  1.1200 -  FIRST_X_ASSUM(MP_TAC o MATCH_MP BOUNDED_SUBSET_CLOSED_INTERVAL) THEN
  1.1201 -  REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
  1.1202 -  MAP_EVERY X_GEN_TAC [`a:real^N`; `b:real^N`] THEN DISCH_TAC THEN
  1.1203 -  FIRST_ASSUM(SUBST1_TAC o MATCH_MP (SET_RULE
  1.1204 -   `s \<subseteq> t ==> s = t DIFF (t DIFF s)`)) THEN
  1.1205 -  MATCH_MP_TAC GMEASURABLE_DIFF THEN
  1.1206 -  REWRITE_TAC[MEASURABLE_INTERVAL] THEN
  1.1207 -  MATCH_MP_TAC GMEASURABLE_COMPACT THEN
  1.1208 -  SIMP_TAC[COMPACT_EQ_BOUNDED_CLOSED; BOUNDED_DIFF; BOUNDED_INTERVAL] THEN
  1.1209 -  MATCH_MP_TAC CLOSED_DIFF THEN ASM_REWRITE_TAC[CLOSED_INTERVAL]);; *)
  1.1210 -
  1.1211 -lemma gmeasurable_closure: True .. (*
  1.1212 - "!s. bounded s ==> gmeasurable(closure s)"
  1.1213 -qed   SIMP_TAC[MEASURABLE_COMPACT; COMPACT_EQ_BOUNDED_CLOSED; CLOSED_CLOSURE;
  1.1214 -           BOUNDED_CLOSURE]);; *)
  1.1215 -
  1.1216 -lemma gmeasurable_interior: True .. (*
  1.1217 - "!s. bounded s ==> gmeasurable(interior s)"
  1.1218 -qed   SIMP_TAC[MEASURABLE_OPEN; OPEN_INTERIOR; BOUNDED_INTERIOR]);; *)
  1.1219 -
  1.1220 -lemma gmeasurable_frontier: True .. (*
  1.1221 - "!s:real^N->bool. bounded s ==> gmeasurable(frontier s)"
  1.1222 -qed   REPEAT STRIP_TAC THEN REWRITE_TAC[frontier] THEN
  1.1223 -  MATCH_MP_TAC GMEASURABLE_DIFF THEN
  1.1224 -  ASM_SIMP_TAC[MEASURABLE_CLOSURE; GMEASURABLE_INTERIOR] THEN
  1.1225 -  MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `s:real^N->bool` THEN
  1.1226 -  REWRITE_TAC[INTERIOR_SUBSET; CLOSURE_SUBSET]);; *)
  1.1227 -
  1.1228 -lemma measure_frontier: True .. (*
  1.1229 - "!s:real^N->bool.
  1.1230 -        bounded s
  1.1231 -        ==> measure(frontier s) = measure(closure s) - measure(interior s)"
  1.1232 -qed   REPEAT STRIP_TAC THEN REWRITE_TAC[frontier] THEN
  1.1233 -  MATCH_MP_TAC MEASURE_DIFF_SUBSET THEN
  1.1234 -  ASM_SIMP_TAC[MEASURABLE_CLOSURE; GMEASURABLE_INTERIOR] THEN
  1.1235 -  MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `s:real^N->bool` THEN
  1.1236 -  REWRITE_TAC[INTERIOR_SUBSET; CLOSURE_SUBSET]);; *)
  1.1237 -
  1.1238 -lemma gmeasurable_jordan: True .. (*
  1.1239 - "!s:real^N->bool. bounded s \<and> negligible(frontier s) ==> gmeasurable s"
  1.1240 -qed   REPEAT STRIP_TAC THEN ONCE_REWRITE_TAC[MEASURABLE_INNER_OUTER] THEN
  1.1241 -  GEN_TAC THEN DISCH_TAC THEN
  1.1242 -  EXISTS_TAC `interior(s):real^N->bool` THEN
  1.1243 -  EXISTS_TAC `closure(s):real^N->bool` THEN
  1.1244 -  ASM_SIMP_TAC[MEASURABLE_INTERIOR; GMEASURABLE_CLOSURE] THEN
  1.1245 -  REWRITE_TAC[INTERIOR_SUBSET; CLOSURE_SUBSET] THEN
  1.1246 -  ONCE_REWRITE_TAC[REAL_ABS_SUB] THEN
  1.1247 -  ASM_SIMP_TAC[GSYM MEASURE_FRONTIER; REAL_ABS_NUM; MEASURE_EQ_0]);; *)
  1.1248 -
  1.1249 -lemma has_gmeasure_elementary: True .. (*
  1.1250 - "!d s. d division_of s ==> s has_gmeasure (sum d content)"
  1.1251 -qed   REPEAT STRIP_TAC THEN REWRITE_TAC[has_gmeasure] THEN
  1.1252 -  FIRST_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_FINITE) THEN
  1.1253 -  ASM_SIMP_TAC[LIFT_SUM] THEN
  1.1254 -  MATCH_MP_TAC HAS_INTEGRAL_COMBINE_DIVISION THEN
  1.1255 -  ASM_REWRITE_TAC[o_THM] THEN REWRITE_TAC[GSYM has_gmeasure] THEN
  1.1256 -  ASM_MESON_TAC[HAS_GMEASURE_INTERVAL; division_of]);; *)
  1.1257 -
  1.1258 -lemma gmeasurable_elementary: True .. (*
  1.1259 - "!d s. d division_of s ==> gmeasurable s"
  1.1260 -qed   REWRITE_TAC[measurable] THEN MESON_TAC[HAS_GMEASURE_ELEMENTARY]);; *)
  1.1261 -
  1.1262 -lemma measure_elementary: True .. (*
  1.1263 - "!d s. d division_of s ==> gmeasure s = sum d content"
  1.1264 -qed   MESON_TAC[HAS_GMEASURE_ELEMENTARY; MEASURE_UNIQUE]);; *)
  1.1265 -
  1.1266 -lemma gmeasurable_inter_interval: True .. (*
  1.1267 - "!s a b:real^N. gmeasurable s ==> gmeasurable (s \<inter> {a..b})"
  1.1268 -qed   SIMP_TAC[MEASURABLE_INTER; GMEASURABLE_INTERVAL]);; *)
  1.1269 -
  1.1270 -(* ------------------------------------------------------------------------- *)
  1.1271 -(* A nice lemma for negligibility proofs.                                    *)
  1.1272 -(* ------------------------------------------------------------------------- *)
  1.1273 -
  1.1274 -lemma STARLIKE_NEGLIGIBLE_BOUNDED_MEASURABLE: True .. (*
  1.1275 - "!s. gmeasurable s \<and> bounded s \<and>
  1.1276 -       (!c x:real^N. 0 \<le> c \<and> x \<in> s \<and> (c % x) \<in> s ==> c = 1)
  1.1277 -       ==> negligible s"
  1.1278 -qed   REPEAT STRIP_TAC THEN
  1.1279 -  SUBGOAL_THEN `~(0 < measure(s:real^N->bool))`
  1.1280 -   (fun th -> ASM_MESON_TAC[th; GMEASURABLE_MEASURE_POS_LT]) THEN
  1.1281 -  DISCH_TAC THEN
  1.1282 -  MP_TAC(SPEC `(0:real^N) INSERT s`
  1.1283 -      BOUNDED_SUBSET_CLOSED_INTERVAL_SYMMETRIC) THEN
  1.1284 -  ASM_SIMP_TAC[BOUNDED_INSERT; COMPACT_IMP_BOUNDED; NOT_EXISTS_THM] THEN
  1.1285 -  X_GEN_TAC `a:real^N` THEN REWRITE_TAC[INSERT_SUBSET] THEN STRIP_TAC THEN
  1.1286 -  SUBGOAL_THEN
  1.1287 -   `?N. EVEN N \<and> 0 < N \<and>
  1.1288 -        measure(interval[--a:real^N,a])
  1.1289 -         < (N * measure(s:real^N->bool)) / 4 pow dimindex (:N)`
  1.1290 -  STRIP_ASSUME_TAC THENL
  1.1291 -   [FIRST_ASSUM(MP_TAC o SPEC
  1.1292 -     `measure(interval[--a:real^N,a]) * 4 pow (dimindex(:N))` o
  1.1293 -     MATCH_MP REAL_ARCH) THEN
  1.1294 -    SIMP_TAC[REAL_LT_RDIV_EQ; REAL_POW_LT; REAL_OF_NUM_LT; ARITH] THEN
  1.1295 -    SIMP_TAC[GSYM REAL_LT_LDIV_EQ; ASSUME `0 < measure(s:real^N->bool)`] THEN
  1.1296 -    DISCH_THEN(X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC) THEN
  1.1297 -    EXISTS_TAC `2 * (N DIV 2 + 1)` THEN REWRITE_TAC[EVEN_MULT; ARITH] THEN
  1.1298 -    CONJ_TAC THENL [ARITH_TAC; ALL_TAC] THEN
  1.1299 -    FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
  1.1300 -     `x < a ==> a \<le> b ==> x < b`)) THEN
  1.1301 -    REWRITE_TAC[REAL_OF_NUM_LE] THEN ARITH_TAC;
  1.1302 -    ALL_TAC] THEN
  1.1303 -  MP_TAC(ISPECL [`\<Union>(IMAGE (\<lambda>m. IMAGE (\<lambda>x:real^N. (m / N) % x) s)
  1.1304 -                                (1..N))`;
  1.1305 -                  `interval[--a:real^N,a]`] MEASURE_SUBSET) THEN
  1.1306 -  MP_TAC(ISPECL [`measure:(real^N->bool)->real`;
  1.1307 -                 `IMAGE (\<lambda>m. IMAGE (\<lambda>x:real^N. (m / N) % x) s) (1..N)`]
  1.1308 -                HAS_GMEASURE_DISJOINT_UNIONS) THEN
  1.1309 -  SIMP_TAC[FINITE_IMAGE; FINITE_NUMSEG; IMP_CONJ] THEN
  1.1310 -  REWRITE_TAC[RIGHT_FORALL_IMP_THM; FORALL_IN_IMAGE] THEN ANTS_TAC THENL
  1.1311 -   [REPEAT STRIP_TAC THEN REWRITE_TAC[GSYM HAS_GMEASURE_MEASURE] THEN
  1.1312 -    MATCH_MP_TAC GMEASURABLE_SCALING THEN ASM_REWRITE_TAC[];
  1.1313 -    ALL_TAC] THEN
  1.1314 -  REWRITE_TAC[RIGHT_IMP_FORALL_THM; IMP_IMP] THEN
  1.1315 -  ONCE_REWRITE_TAC[TAUT `(a \<and> b) \<and> ~c ==> d \<longleftrightarrow> a \<and> b \<and> ~d ==> c`] THEN
  1.1316 -  SUBGOAL_THEN
  1.1317 -   `!m n. m \<in> 1..N \<and> n \<in> 1..N \<and>
  1.1318 -          ~(DISJOINT (IMAGE (\<lambda>x:real^N. m / N % x) s)
  1.1319 -                     (IMAGE (\<lambda>x. n / N % x) s))
  1.1320 -          ==> m = n`
  1.1321 -  ASSUME_TAC THENL
  1.1322 -   [MAP_EVERY X_GEN_TAC [`m:num`; `n:num`] THEN
  1.1323 -    REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
  1.1324 -    REWRITE_TAC[DISJOINT; GSYM MEMBER_NOT_EMPTY] THEN
  1.1325 -    REWRITE_TAC[EXISTS_IN_IMAGE; IN_INTER] THEN
  1.1326 -    DISCH_THEN(X_CHOOSE_THEN `x:real^N`
  1.1327 -     (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
  1.1328 -    REWRITE_TAC[IN_IMAGE] THEN
  1.1329 -    DISCH_THEN(X_CHOOSE_THEN `y:real^N`
  1.1330 -     (CONJUNCTS_THEN2 MP_TAC ASSUME_TAC)) THEN
  1.1331 -    DISCH_THEN(MP_TAC o AP_TERM `(%) (N / m) :real^N->real^N`) THEN
  1.1332 -    SUBGOAL_THEN `~(N = 0) \<and> ~(m = 0)` STRIP_ASSUME_TAC THENL
  1.1333 -     [REWRITE_TAC[REAL_OF_NUM_EQ] THEN
  1.1334 -      REPEAT(FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_NUMSEG])) THEN
  1.1335 -      ARITH_TAC;
  1.1336 -      ALL_TAC] THEN
  1.1337 -    FIRST_X_ASSUM(ASSUME_TAC o GEN_REWRITE_RULE (BINDER_CONV o BINDER_CONV)
  1.1338 -     [GSYM CONTRAPOS_THM]) THEN
  1.1339 -    ASM_SIMP_TAC[VECTOR_MUL_ASSOC; REAL_FIELD
  1.1340 -     `~(x = 0) \<and> ~(y = 0) ==> x / y * y / x = 1`] THEN
  1.1341 -    ASM_SIMP_TAC[REAL_FIELD
  1.1342 -     `~(x = 0) \<and> ~(y = 0) ==> x / y * z / x = z / y`] THEN
  1.1343 -    REWRITE_TAC[VECTOR_MUL_LID] THEN DISCH_THEN SUBST_ALL_TAC THEN
  1.1344 -    FIRST_X_ASSUM(MP_TAC o SPECL [`n / m`; `y:real^N`]) THEN
  1.1345 -    ASM_SIMP_TAC[REAL_LE_DIV; REAL_POS; REAL_FIELD
  1.1346 -     `~(y = 0) ==> (x / y = 1 \<longleftrightarrow> x = y)`] THEN
  1.1347 -    REWRITE_TAC[REAL_OF_NUM_EQ; EQ_SYM_EQ];
  1.1348 -    ALL_TAC] THEN
  1.1349 -  ANTS_TAC THENL [ASM_MESON_TAC[]; DISCH_TAC] THEN
  1.1350 -  REWRITE_TAC[NOT_IMP] THEN REPEAT CONJ_TAC THENL
  1.1351 -   [REWRITE_TAC[measurable] THEN ASM_MESON_TAC[];
  1.1352 -    REWRITE_TAC[MEASURABLE_INTERVAL];
  1.1353 -    REWRITE_TAC[UNIONS_SUBSET; FORALL_IN_IMAGE] THEN
  1.1354 -    REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN
  1.1355 -    X_GEN_TAC `n:num` THEN DISCH_TAC THEN X_GEN_TAC `x:real^N` THEN
  1.1356 -    DISCH_TAC THEN
  1.1357 -    MP_TAC(ISPECL [`--a:real^N`; `a:real^N`] CONVEX_INTERVAL) THEN
  1.1358 -    DISCH_THEN(MP_TAC o REWRITE_RULE[CONVEX_ALT] o CONJUNCT1) THEN
  1.1359 -    DISCH_THEN(MP_TAC o SPECL [`0:real^N`; `x:real^N`; `n / N`]) THEN
  1.1360 -    ASM_REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_ADD_LID] THEN
  1.1361 -    DISCH_THEN MATCH_MP_TAC THEN SIMP_TAC[REAL_LE_DIV; REAL_POS] THEN
  1.1362 -    CONJ_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
  1.1363 -    FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_NUMSEG]) THEN
  1.1364 -    DISCH_THEN(MP_TAC o MATCH_MP (ARITH_RULE
  1.1365 -     `1 \<le> n \<and> n \<le> N ==> 0 < N \<and> n \<le> N`)) THEN
  1.1366 -    SIMP_TAC[GSYM REAL_OF_NUM_LE; GSYM REAL_OF_NUM_LT; REAL_LE_LDIV_EQ] THEN
  1.1367 -    SIMP_TAC[REAL_MUL_LID];
  1.1368 -    ALL_TAC] THEN
  1.1369 -  FIRST_X_ASSUM(SUBST1_TAC o MATCH_MP MEASURE_UNIQUE) THEN
  1.1370 -  ASM_SIMP_TAC[MEASURE_SCALING; REAL_NOT_LE] THEN
  1.1371 -  FIRST_X_ASSUM(K ALL_TAC o SPEC `0`) THEN
  1.1372 -  MATCH_MP_TAC REAL_LTE_TRANS THEN EXISTS_TAC
  1.1373 -   `sum (1..N) (measure o (\<lambda>m. IMAGE (\<lambda>x:real^N. m / N % x) s))` THEN
  1.1374 -  CONJ_TAC THENL
  1.1375 -   [ALL_TAC;
  1.1376 -    MATCH_MP_TAC REAL_EQ_IMP_LE THEN CONV_TAC SYM_CONV THEN
  1.1377 -    MATCH_MP_TAC SUM_IMAGE THEN REWRITE_TAC[] THEN
  1.1378 -    REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
  1.1379 -    ASM_REWRITE_TAC[SET_RULE `DISJOINT s s \<longleftrightarrow> s = {}`; IMAGE_EQ_EMPTY] THEN
  1.1380 -    DISCH_THEN SUBST_ALL_TAC THEN
  1.1381 -    ASM_MESON_TAC[REAL_LT_REFL; MEASURE_EMPTY]] THEN
  1.1382 -  FIRST_X_ASSUM(K ALL_TAC o SPEC `0`) THEN
  1.1383 -  ASM_SIMP_TAC[o_DEF; MEASURE_SCALING; SUM_RMUL] THEN
  1.1384 -  FIRST_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
  1.1385 -   `x < a ==> a \<le> b ==> x < b`)) THEN
  1.1386 -  ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_POW_LT; REAL_OF_NUM_LT; ARITH] THEN
  1.1387 -  ONCE_REWRITE_TAC[REAL_ARITH `(a * b) * c:real = (a * c) * b`] THEN
  1.1388 -  ASM_SIMP_TAC[REAL_LE_RMUL_EQ] THEN REWRITE_TAC[GSYM SUM_RMUL] THEN
  1.1389 -  REWRITE_TAC[GSYM REAL_POW_MUL] THEN
  1.1390 -  REWRITE_TAC[REAL_ABS_DIV; REAL_ABS_NUM] THEN
  1.1391 -  FIRST_X_ASSUM(X_CHOOSE_THEN `M:num` SUBST_ALL_TAC o
  1.1392 -        GEN_REWRITE_RULE I [EVEN_EXISTS]) THEN
  1.1393 -  REWRITE_TAC[GSYM REAL_OF_NUM_MUL] THEN
  1.1394 -  RULE_ASSUM_TAC(REWRITE_RULE[GSYM REAL_OF_NUM_MUL]) THEN
  1.1395 -  RULE_ASSUM_TAC(REWRITE_RULE[REAL_ARITH `0 < 2 * x \<longleftrightarrow> 0 < x`]) THEN
  1.1396 -  ASM_SIMP_TAC[REAL_FIELD `0 < y ==> x / (2 * y) * 4 = x * 2 / y`] THEN
  1.1397 -  MATCH_MP_TAC REAL_LE_TRANS THEN
  1.1398 -  EXISTS_TAC `sum(M..(2*M)) (\<lambda>i. (i * 2 / M) pow dimindex (:N))` THEN
  1.1399 -  CONJ_TAC THENL
  1.1400 -   [ALL_TAC;
  1.1401 -    MATCH_MP_TAC SUM_SUBSET_SIMPLE THEN
  1.1402 -    SIMP_TAC[REAL_POW_LE; REAL_LE_MUL; REAL_LE_DIV; REAL_POS] THEN
  1.1403 -    REWRITE_TAC[IN_NUMSEG; FINITE_NUMSEG; SUBSET] THEN
  1.1404 -    FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [REAL_OF_NUM_LT]) THEN
  1.1405 -    ARITH_TAC] THEN
  1.1406 -  MATCH_MP_TAC REAL_LE_TRANS THEN
  1.1407 -  EXISTS_TAC `sum(M..(2*M)) (\<lambda>i. 2)` THEN CONJ_TAC THENL
  1.1408 -   [REWRITE_TAC[SUM_CONST_NUMSEG] THEN
  1.1409 -    REWRITE_TAC[ARITH_RULE `(2 * M + 1) - M = M + 1`] THEN
  1.1410 -    REWRITE_TAC[GSYM REAL_OF_NUM_ADD] THEN REAL_ARITH_TAC;
  1.1411 -    ALL_TAC] THEN
  1.1412 -  MATCH_MP_TAC SUM_LE THEN REWRITE_TAC[FINITE_NUMSEG; IN_NUMSEG] THEN
  1.1413 -  X_GEN_TAC `n:num` THEN STRIP_TAC THEN
  1.1414 -  MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `2 pow (dimindex(:N))` THEN
  1.1415 -  CONJ_TAC THENL
  1.1416 -   [GEN_REWRITE_TAC LAND_CONV [GSYM REAL_POW_1] THEN
  1.1417 -    MATCH_MP_TAC REAL_POW_MONO THEN REWRITE_TAC[DIMINDEX_GE_1] THEN
  1.1418 -    ARITH_TAC;
  1.1419 -    ALL_TAC] THEN
  1.1420 -  MATCH_MP_TAC REAL_POW_LE2 THEN
  1.1421 -  REWRITE_TAC[REAL_POS; ARITH; real_div; REAL_MUL_ASSOC] THEN
  1.1422 -  ASM_SIMP_TAC[GSYM real_div; REAL_LE_RDIV_EQ] THEN
  1.1423 -  REWRITE_TAC[REAL_OF_NUM_MUL; REAL_OF_NUM_LE] THEN
  1.1424 -  UNDISCH_TAC `M:num \<le> n` THEN ARITH_TAC);; *)
  1.1425 -
  1.1426 -lemma STARLIKE_NEGLIGIBLE_LEMMA: True .. (*
  1.1427 - "!s. compact s \<and>
  1.1428 -       (!c x:real^N. 0 \<le> c \<and> x \<in> s \<and> (c % x) \<in> s ==> c = 1)
  1.1429 -       ==> negligible s"
  1.1430 -qed   REPEAT STRIP_TAC THEN
  1.1431 -  MATCH_MP_TAC STARLIKE_NEGLIGIBLE_BOUNDED_MEASURABLE THEN
  1.1432 -  ASM_MESON_TAC[MEASURABLE_COMPACT; COMPACT_IMP_BOUNDED]);; *)
  1.1433 -
  1.1434 -lemma STARLIKE_NEGLIGIBLE: True .. (*
  1.1435 - "!s a. closed s \<and>
  1.1436 -         (!c x:real^N. 0 \<le> c \<and> (a + x) \<in> s \<and> (a + c % x) \<in> s ==> c = 1)
  1.1437 -         ==> negligible s"
  1.1438 -qed   REPEAT STRIP_TAC THEN MATCH_MP_TAC NEGLIGIBLE_TRANSLATION_REV THEN
  1.1439 -  EXISTS_TAC `--a:real^N` THEN ONCE_REWRITE_TAC[NEGLIGIBLE_ON_INTERVALS] THEN
  1.1440 -  MAP_EVERY X_GEN_TAC [`u:real^N`; `v:real^N`] THEN
  1.1441 -  MATCH_MP_TAC STARLIKE_NEGLIGIBLE_LEMMA THEN CONJ_TAC THENL
  1.1442 -   [MATCH_MP_TAC CLOSED_INTER_COMPACT THEN REWRITE_TAC[COMPACT_INTERVAL] THEN
  1.1443 -    ASM_SIMP_TAC[CLOSED_TRANSLATION];
  1.1444 -    REWRITE_TAC[IN_IMAGE; IN_INTER] THEN
  1.1445 -    ONCE_REWRITE_TAC[VECTOR_ARITH `x:real^N = --a + y \<longleftrightarrow> y = a + x`] THEN
  1.1446 -    REWRITE_TAC[UNWIND_THM2] THEN ASM MESON_TAC[]]);; *)
  1.1447 -
  1.1448 -lemma STARLIKE_NEGLIGIBLE_STRONG: True .. (*
  1.1449 - "!s a. closed s \<and>
  1.1450 -         (!c x:real^N. 0 \<le> c \<and> c < 1 \<and> (a + x) \<in> s
  1.1451 -                       ==> ~((a + c % x) \<in> s))
  1.1452 -         ==> negligible s"
  1.1453 -qed   REPEAT GEN_TAC THEN STRIP_TAC THEN MATCH_MP_TAC STARLIKE_NEGLIGIBLE THEN
  1.1454 -  EXISTS_TAC `a:real^N` THEN ASM_REWRITE_TAC[] THEN
  1.1455 -  MAP_EVERY X_GEN_TAC [`c:real`; `x:real^N`] THEN STRIP_TAC THEN
  1.1456 -  MATCH_MP_TAC(REAL_ARITH `~(x < y) \<and> ~(y < x) ==> x = y`) THEN
  1.1457 -  STRIP_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN DISCH_TAC THEN
  1.1458 -  FIRST_X_ASSUM(MP_TAC o SPECL [`inv c`; `c % x:real^N`]) THEN
  1.1459 -  ASM_REWRITE_TAC[REAL_LE_INV_EQ; VECTOR_MUL_ASSOC] THEN
  1.1460 -  ASM_SIMP_TAC[REAL_MUL_LINV; REAL_ARITH `1 < c ==> ~(c = 0)`] THEN
  1.1461 -  ASM_REWRITE_TAC[VECTOR_MUL_LID] THEN
  1.1462 -  GEN_REWRITE_TAC RAND_CONV [GSYM REAL_INV_1] THEN
  1.1463 -  MATCH_MP_TAC REAL_LT_INV2 THEN ASM_REWRITE_TAC[REAL_LT_01]);; *)
  1.1464 -
  1.1465 -(* ------------------------------------------------------------------------- *)
  1.1466 -(* In particular.                                                            *)
  1.1467 -(* ------------------------------------------------------------------------- *)
  1.1468 -
  1.1469 -lemma NEGLIGIBLE_HYPERPLANE: True .. (*
  1.1470 - "!a b. ~(a = 0 \<and> b = 0) ==> negligible {x:real^N | a dot x = b}"
  1.1471 -qed   REPEAT GEN_TAC THEN ASM_CASES_TAC `a:real^N = 0` THEN
  1.1472 -  ASM_SIMP_TAC[DOT_LZERO; SET_RULE `{x | F} = {}`; NEGLIGIBLE_EMPTY] THEN
  1.1473 -  MATCH_MP_TAC STARLIKE_NEGLIGIBLE THEN
  1.1474 -  SUBGOAL_THEN `?x:real^N. ~(a dot x = b)` MP_TAC THENL
  1.1475 -   [MATCH_MP_TAC(MESON[] `!a:real^N. P a \/ P(--a) ==> ?x. P x`) THEN
  1.1476 -    EXISTS_TAC `a:real^N` THEN REWRITE_TAC[DOT_RNEG] THEN
  1.1477 -    MATCH_MP_TAC(REAL_ARITH `~(a = 0) ==> ~(a = b) \/ ~(--a = b)`) THEN
  1.1478 -    ASM_REWRITE_TAC[DOT_EQ_0];
  1.1479 -    ALL_TAC] THEN
  1.1480 -  MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `c:real^N` THEN DISCH_TAC THEN
  1.1481 -  REWRITE_TAC[CLOSED_HYPERPLANE; IN_ELIM_THM; DOT_RADD; DOT_RMUL] THEN
  1.1482 -  MAP_EVERY X_GEN_TAC [`t:real`; `y:real^N`] THEN
  1.1483 -  DISCH_THEN(MP_TAC o MATCH_MP (REAL_ARITH
  1.1484 -   `0 \<le> t \<and> ac + ay = b \<and> ac + t * ay = b
  1.1485 -    ==> ((ay = 0 ==> ac = b) \<and> (t - 1) * ay = 0)`)) THEN
  1.1486 -  ASM_SIMP_TAC[REAL_ENTIRE; REAL_SUB_0] THEN CONV_TAC TAUT);; *)
  1.1487 -
  1.1488 -lemma NEGLIGIBLE_LOWDIM: True .. (*
  1.1489 - "!s:real^N->bool. dim(s) < dimindex(:N) ==> negligible s"
  1.1490 -qed   GEN_TAC THEN DISCH_THEN(MP_TAC o MATCH_MP LOWDIM_SUBSET_HYPERPLANE) THEN
  1.1491 -  DISCH_THEN(X_CHOOSE_THEN `a:real^N` STRIP_ASSUME_TAC) THEN
  1.1492 -  MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
  1.1493 -  EXISTS_TAC `span(s):real^N->bool` THEN REWRITE_TAC[SPAN_INC] THEN
  1.1494 -  MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
  1.1495 -  EXISTS_TAC `{x:real^N | a dot x = 0}` THEN
  1.1496 -  ASM_SIMP_TAC[NEGLIGIBLE_HYPERPLANE]);; *)
  1.1497 -
  1.1498 -(* ------------------------------------------------------------------------- *)
  1.1499 -(* Measurability of bounded convex sets.                                     *)
  1.1500 -(* ------------------------------------------------------------------------- *)
  1.1501 -
  1.1502 -lemma NEGLIGIBLE_CONVEX_FRONTIER: True .. (*
  1.1503 - "!s:real^N->bool. convex s ==> negligible(frontier s)"
  1.1504 -qed   SUBGOAL_THEN
  1.1505 -   `!s:real^N->bool. convex s \<and> (0) \<in> s ==> negligible(frontier s)`
  1.1506 -  ASSUME_TAC THENL
  1.1507 -   [ALL_TAC;
  1.1508 -    X_GEN_TAC `s:real^N->bool` THEN DISCH_TAC THEN
  1.1509 -    ASM_CASES_TAC `s:real^N->bool = {}` THEN
  1.1510 -    ASM_REWRITE_TAC[FRONTIER_EMPTY; NEGLIGIBLE_EMPTY] THEN
  1.1511 -    FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM MEMBER_NOT_EMPTY]) THEN
  1.1512 -    DISCH_THEN(X_CHOOSE_TAC `a:real^N`) THEN
  1.1513 -    FIRST_X_ASSUM(MP_TAC o SPEC `IMAGE (\<lambda>x:real^N. --a + x) s`) THEN
  1.1514 -    ASM_SIMP_TAC[CONVEX_TRANSLATION; IN_IMAGE] THEN
  1.1515 -    ASM_REWRITE_TAC[UNWIND_THM2;
  1.1516 -                    VECTOR_ARITH `0:real^N = --a + x \<longleftrightarrow> x = a`] THEN
  1.1517 -    REWRITE_TAC[FRONTIER_TRANSLATION; NEGLIGIBLE_TRANSLATION_EQ]] THEN
  1.1518 -  REPEAT STRIP_TAC THEN MP_TAC(ISPEC `s:real^N->bool` DIM_SUBSET_UNIV) THEN
  1.1519 -  REWRITE_TAC[ARITH_RULE `d:num \<le> e \<longleftrightarrow> d < e \/ d = e`] THEN STRIP_TAC THENL
  1.1520 -   [MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
  1.1521 -    EXISTS_TAC `closure s:real^N->bool` THEN
  1.1522 -    REWRITE_TAC[frontier; SUBSET_DIFF] THEN
  1.1523 -    MATCH_MP_TAC NEGLIGIBLE_LOWDIM THEN ASM_REWRITE_TAC[DIM_CLOSURE];
  1.1524 -    ALL_TAC] THEN
  1.1525 -  SUBGOAL_THEN `?a:real^N. a \<in> interior s` CHOOSE_TAC THENL
  1.1526 -   [X_CHOOSE_THEN `b:real^N->bool` STRIP_ASSUME_TAC
  1.1527 -     (ISPEC `s:real^N->bool` BASIS_EXISTS) THEN
  1.1528 -    FIRST_X_ASSUM SUBST_ALL_TAC THEN
  1.1529 -    MP_TAC(ISPEC `b:real^N->bool` INTERIOR_SIMPLEX_NONEMPTY) THEN
  1.1530 -    ASM_REWRITE_TAC[] THEN
  1.1531 -    MATCH_MP_TAC MONO_EXISTS THEN REWRITE_TAC[GSYM SUBSET] THEN
  1.1532 -    MATCH_MP_TAC SUBSET_INTERIOR THEN MATCH_MP_TAC HULL_MINIMAL THEN
  1.1533 -    ASM_REWRITE_TAC[INSERT_SUBSET];
  1.1534 -    ALL_TAC] THEN
  1.1535 -  MATCH_MP_TAC STARLIKE_NEGLIGIBLE_STRONG THEN
  1.1536 -  EXISTS_TAC `a:real^N` THEN REWRITE_TAC[FRONTIER_CLOSED] THEN
  1.1537 -  REPEAT GEN_TAC THEN STRIP_TAC THEN
  1.1538 -  REWRITE_TAC[frontier; IN_DIFF; DE_MORGAN_THM] THEN DISJ2_TAC THEN
  1.1539 -  SIMP_TAC[VECTOR_ARITH
  1.1540 -   `a + c % x:real^N = (a + x) - (1 - c) % ((a + x) - a)`] THEN
  1.1541 -  MATCH_MP_TAC IN_INTERIOR_CLOSURE_CONVEX_SHRINK THEN
  1.1542 -  RULE_ASSUM_TAC(REWRITE_RULE[frontier; IN_DIFF]) THEN
  1.1543 -  ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC);; *)
  1.1544 -
  1.1545 -lemma GMEASURABLE_CONVEX: True .. (*
  1.1546 - "!s:real^N->bool. convex s \<and> bounded s ==> gmeasurable s"
  1.1547 -qed   REPEAT STRIP_TAC THEN MATCH_MP_TAC GMEASURABLE_JORDAN THEN
  1.1548 -  ASM_SIMP_TAC[NEGLIGIBLE_CONVEX_FRONTIER]);; *)
  1.1549 -
  1.1550 -(* ------------------------------------------------------------------------- *)
  1.1551 -(* Various special cases.                                                    *)
  1.1552 -(* ------------------------------------------------------------------------- *)
  1.1553 -
  1.1554 -lemma NEGLIGIBLE_SPHERE: True .. (*
  1.1555 - "!a r. negligible {x:real^N | dist(a,x) = r}"
  1.1556 -qed   REWRITE_TAC[GSYM FRONTIER_CBALL] THEN
  1.1557 -  SIMP_TAC[NEGLIGIBLE_CONVEX_FRONTIER; CONVEX_CBALL]);; *)
  1.1558 -
  1.1559 -lemma GMEASURABLE_BALL: True .. (*
  1.1560 - "!a r. gmeasurable(ball(a,r))"
  1.1561 -qed   SIMP_TAC[MEASURABLE_OPEN; BOUNDED_BALL; OPEN_BALL]);; *)
  1.1562 -
  1.1563 -lemma GMEASURABLE_CBALL: True .. (*
  1.1564 - "!a r. gmeasurable(cball(a,r))"
  1.1565 -qed   SIMP_TAC[MEASURABLE_COMPACT; COMPACT_CBALL]);; *)
  1.1566 -
  1.1567 -(* ------------------------------------------------------------------------- *)
  1.1568 -(* Negligibility of image under non-injective linear map.                    *)
  1.1569 -(* ------------------------------------------------------------------------- *)
  1.1570 -
  1.1571 -lemma NEGLIGIBLE_LINEAR_SINGULAR_IMAGE: True .. (*
  1.1572 - "!f:real^N->real^N s.
  1.1573 -        linear f \<and> ~(!x y. f(x) = f(y) ==> x = y)
  1.1574 -        ==> negligible(IMAGE f s)"
  1.1575 -qed   REPEAT GEN_TAC THEN
  1.1576 -  DISCH_THEN(MP_TAC o MATCH_MP LINEAR_SINGULAR_IMAGE_HYPERPLANE) THEN
  1.1577 -  DISCH_THEN(X_CHOOSE_THEN `a:real^N` STRIP_ASSUME_TAC) THEN
  1.1578 -  MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
  1.1579 -  EXISTS_TAC `{x:real^N | a dot x = 0}` THEN
  1.1580 -  ASM_SIMP_TAC[NEGLIGIBLE_HYPERPLANE]);; *)
  1.1581 -
  1.1582 -(* ------------------------------------------------------------------------- *)
  1.1583 -(* Approximation of gmeasurable set by union of intervals.                    *)
  1.1584 -(* ------------------------------------------------------------------------- *)
  1.1585 -
  1.1586 -lemma COVERING_LEMMA: True .. (*
  1.1587 - "!a b:real^N s g.
  1.1588 -        s \<subseteq> {a..b} \<and> ~({a<..<b} = {}) \<and> gauge g
  1.1589 -        ==> ?d. COUNTABLE d \<and>
  1.1590 -                (!k. k \<in> d ==> k \<subseteq> {a..b} \<and> ~(k = {}) \<and>
  1.1591 -                                (\<exists>c d. k = {c..d})) \<and>
  1.1592 -                (!k1 k2. k1 \<in> d \<and> k2 \<in> d \<and> ~(k1 = k2)
  1.1593 -                         ==> interior k1 \<inter> interior k2 = {}) \<and>
  1.1594 -                (!k. k \<in> d ==> ?x. x \<in> (s \<inter> k) \<and> k \<subseteq> g(x)) \<and>
  1.1595 -                s \<subseteq> \<Union>d"
  1.1596 -qed   REPEAT STRIP_TAC THEN
  1.1597 -  SUBGOAL_THEN
  1.1598 -   `?d. COUNTABLE d \<and>
  1.1599 -        (!k. k \<in> d ==> k \<subseteq> {a..b} \<and> ~(k = {}) \<and>
  1.1600 -                        (\<exists>c d:real^N. k = {c..d})) \<and>
  1.1601 -        (!k1 k2. k1 \<in> d \<and> k2 \<in> d
  1.1602 -                 ==> k1 \<subseteq> k2 \/ k2 \<subseteq> k1 \/
  1.1603 -                     interior k1 \<inter> interior k2 = {}) \<and>
  1.1604 -        (!x. x \<in> s ==> ?k. k \<in> d \<and> x \<in> k \<and> k \<subseteq> g(x)) \<and>
  1.1605 -        (!k. k \<in> d ==> FINITE {l | l \<in> d \<and> k \<subseteq> l})`
  1.1606 -  ASSUME_TAC THENL
  1.1607 -   [EXISTS_TAC
  1.1608 -     `IMAGE (\<lambda>(n,v).
  1.1609 -             interval[(lambda i. a$i + (v$i) / 2 pow n *
  1.1610 -                                       ((b:real^N)$i - (a:real^N)$i)):real^N,
  1.1611 -                      (lambda i. a$i + ((v$i) + 1) / 2 pow n * (b$i - a$i))])
  1.1612 -            {n,v | n \<in> (:num) \<and>
  1.1613 -                   v \<in> {v:num^N | !i. 1 \<le> i \<and> i \<le> dimindex(:N)
  1.1614 -                                       ==> v$i < 2 EXP n}}` THEN
  1.1615 -    CONJ_TAC THENL
  1.1616 -     [MATCH_MP_TAC COUNTABLE_IMAGE THEN
  1.1617 -      MATCH_MP_TAC COUNTABLE_PRODUCT_DEPENDENT THEN
  1.1618 -      REWRITE_TAC[NUM_COUNTABLE; IN_UNIV] THEN
  1.1619 -      GEN_TAC THEN MATCH_MP_TAC FINITE_IMP_COUNTABLE THEN
  1.1620 -      MATCH_MP_TAC FINITE_CART THEN REWRITE_TAC[FINITE_NUMSEG_LT];
  1.1621 -      ALL_TAC] THEN
  1.1622 -    CONJ_TAC THENL
  1.1623 -     [REWRITE_TAC[FORALL_IN_IMAGE; FORALL_PAIR_THM] THEN
  1.1624 -      MAP_EVERY X_GEN_TAC [`n:num`; `v:num^N`] THEN
  1.1625 -      REWRITE_TAC[IN_ELIM_PAIR_THM] THEN
  1.1626 -      REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN DISCH_TAC THEN
  1.1627 -      REWRITE_TAC[CONJ_ASSOC] THEN CONJ_TAC THENL [ALL_TAC; MESON_TAC[]] THEN
  1.1628 -      SIMP_TAC[INTERVAL_NE_EMPTY; SUBSET_INTERVAL; LAMBDA_BETA] THEN
  1.1629 -      REWRITE_TAC[REAL_LE_LADD; REAL_LE_ADDR; REAL_ARITH
  1.1630 -        `a + x * (b - a) \<le> b \<longleftrightarrow> 0 \<le> (1 - x) * (b - a)`] THEN
  1.1631 -      RULE_ASSUM_TAC(REWRITE_RULE[INTERVAL_NE_EMPTY]) THEN
  1.1632 -      REPEAT STRIP_TAC THEN
  1.1633 -      (MATCH_MP_TAC REAL_LE_MUL ORELSE MATCH_MP_TAC REAL_LE_RMUL) THEN
  1.1634 -      ASM_SIMP_TAC[REAL_SUB_LE; REAL_LE_DIV2_EQ; REAL_LT_POW2] THEN
  1.1635 -      ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_LE_RDIV_EQ; REAL_LT_POW2] THEN
  1.1636 -      REWRITE_TAC[REAL_MUL_LZERO; REAL_POS; REAL_MUL_LID; REAL_LE_ADDR] THEN
  1.1637 -      SIMP_TAC[REAL_OF_NUM_ADD; REAL_OF_NUM_POW; REAL_OF_NUM_LE] THEN
  1.1638 -      ASM_SIMP_TAC[ARITH_RULE `x + 1 \<le> y \<longleftrightarrow> x < y`; REAL_LT_IMP_LE];
  1.1639 -      ALL_TAC] THEN
  1.1640 -    CONJ_TAC THENL
  1.1641 -     [ONCE_REWRITE_TAC[IMP_CONJ] THEN
  1.1642 -      REWRITE_TAC[FORALL_IN_IMAGE; FORALL_PAIR_THM; RIGHT_FORALL_IMP_THM] THEN
  1.1643 -      REWRITE_TAC[IN_ELIM_PAIR_THM; IN_UNIV] THEN REWRITE_TAC[IN_ELIM_THM] THEN
  1.1644 -      REWRITE_TAC[RIGHT_IMP_FORALL_THM] THEN
  1.1645 -      GEN_REWRITE_TAC BINDER_CONV [SWAP_FORALL_THM] THEN
  1.1646 -      MATCH_MP_TAC WLOG_LE THEN CONJ_TAC THENL
  1.1647 -       [REPEAT GEN_TAC THEN
  1.1648 -        GEN_REWRITE_TAC RAND_CONV [SWAP_FORALL_THM] THEN
  1.1649 -        REPEAT(AP_TERM_TAC THEN ABS_TAC) THEN SET_TAC[];
  1.1650 -        ALL_TAC] THEN
  1.1651 -      MAP_EVERY X_GEN_TAC [`m:num`; `n:num`] THEN DISCH_TAC THEN
  1.1652 -      MAP_EVERY X_GEN_TAC [`v:num^N`; `w:num^N`] THEN REPEAT DISCH_TAC THEN
  1.1653 -      REWRITE_TAC[INTERIOR_CLOSED_INTERVAL; SUBSET_INTERVAL] THEN
  1.1654 -      SIMP_TAC[DISJOINT_INTERVAL; LAMBDA_BETA] THEN
  1.1655 -      MATCH_MP_TAC(TAUT `p \/ q \/ r ==> (a ==> p) \/ (b ==> q) \/ r`) THEN
  1.1656 -      ONCE_REWRITE_TAC[TAUT `a \<and> b \<and> c \<longleftrightarrow> ~(a \<and> b ==> ~c)`] THEN
  1.1657 -      RULE_ASSUM_TAC(REWRITE_RULE[INTERVAL_NE_EMPTY]) THEN
  1.1658 -      ASM_SIMP_TAC[REAL_LE_LADD; REAL_LE_RMUL_EQ; REAL_SUB_LT; LAMBDA_BETA] THEN
  1.1659 -      REWRITE_TAC[NOT_IMP; REAL_LE_LADD] THEN
  1.1660 -      ASM_SIMP_TAC[REAL_LE_DIV2_EQ; REAL_LT_POW2] THEN
  1.1661 -      REWRITE_TAC[REAL_ARITH `~(x + 1 \<le> x)`] THEN DISJ2_TAC THEN
  1.1662 -      MATCH_MP_TAC(MESON[]
  1.1663 -       `(!i. ~P i ==> Q i) ==> (!i. Q i) \/ (\<exists>i. P i)`) THEN
  1.1664 -      X_GEN_TAC `i:num` THEN
  1.1665 -      DISCH_THEN(fun th -> STRIP_TAC THEN MP_TAC th) THEN
  1.1666 -      ASM_REWRITE_TAC[DE_MORGAN_THM; REAL_NOT_LE] THEN
  1.1667 -      UNDISCH_TAC `m:num \<le> n` THEN REWRITE_TAC[LE_EXISTS] THEN
  1.1668 -      DISCH_THEN(X_CHOOSE_THEN `p:num` SUBST1_TAC) THEN
  1.1669 -      ONCE_REWRITE_TAC[ADD_SYM] THEN
  1.1670 -      REWRITE_TAC[REAL_POW_ADD; real_div; REAL_INV_MUL] THEN
  1.1671 -      REWRITE_TAC[REAL_MUL_ASSOC] THEN REWRITE_TAC[GSYM real_div] THEN
  1.1672 -      ASM_SIMP_TAC[REAL_LE_DIV2_EQ; REAL_LT_POW2; REAL_LT_DIV2_EQ] THEN
  1.1673 -      ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_LE_RDIV_EQ; REAL_LT_POW2;
  1.1674 -                   REAL_LT_LDIV_EQ; REAL_LT_RDIV_EQ] THEN
  1.1675 -      SIMP_TAC[REAL_LT_INTEGERS; INTEGER_CLOSED] THEN REAL_ARITH_TAC;
  1.1676 -      ALL_TAC] THEN
  1.1677 -    CONJ_TAC THENL
  1.1678 -     [X_GEN_TAC `x:real^N` THEN DISCH_TAC THEN
  1.1679 -      SUBGOAL_THEN
  1.1680 -        `?e. 0 < e \<and> !y. (!i. 1 \<le> i \<and> i \<le> dimindex(:N)
  1.1681 -                                ==> abs((x:real^N)$i - (y:real^N)$i) \<le> e)
  1.1682 -                           ==> y \<in> g(x)`
  1.1683 -      STRIP_ASSUME_TAC THENL
  1.1684 -       [FIRST_ASSUM(MP_TAC o SPEC `x:real^N` o GEN_REWRITE_RULE I [gauge]) THEN
  1.1685 -        STRIP_TAC THEN
  1.1686 -        FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [OPEN_CONTAINS_BALL]) THEN
  1.1687 -        DISCH_THEN(MP_TAC o SPEC `x:real^N`) THEN ASM_REWRITE_TAC[] THEN
  1.1688 -        DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
  1.1689 -        EXISTS_TAC `e / 2 / (dimindex(:N))` THEN
  1.1690 -        ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; LE_1; DIMINDEX_GE_1;
  1.1691 -                     ARITH] THEN
  1.1692 -        X_GEN_TAC `y:real^N` THEN STRIP_TAC THEN
  1.1693 -        MATCH_MP_TAC(SET_RULE `!s. s \<subseteq> t \<and> x \<in> s ==> x \<in> t`) THEN
  1.1694 -        EXISTS_TAC `ball(x:real^N,e)` THEN ASM_REWRITE_TAC[IN_BALL] THEN
  1.1695 -        MATCH_MP_TAC(REAL_ARITH `0 < e \<and> x \<le> e / 2 ==> x < e`) THEN
  1.1696 -        ASM_REWRITE_TAC[dist] THEN MATCH_MP_TAC REAL_LE_TRANS THEN
  1.1697 -        EXISTS_TAC `sum(1..dimindex(:N)) (\<lambda>i. abs((x - y:real^N)$i))` THEN
  1.1698 -        REWRITE_TAC[NORM_LE_L1] THEN MATCH_MP_TAC SUM_BOUND_GEN THEN
  1.1699 -        ASM_SIMP_TAC[IN_NUMSEG; FINITE_NUMSEG; NUMSEG_EMPTY; NOT_LT;
  1.1700 -                     DIMINDEX_GE_1; VECTOR_SUB_COMPONENT; CARD_NUMSEG_1];
  1.1701 -        ALL_TAC] THEN
  1.1702 -      REWRITE_TAC[EXISTS_IN_IMAGE; EXISTS_PAIR_THM; IN_ELIM_PAIR_THM] THEN
  1.1703 -      MP_TAC(SPECL [`1 / 2`; `e / norm(b - a:real^N)`]
  1.1704 -        REAL_ARCH_POW_INV) THEN
  1.1705 -      SUBGOAL_THEN `0 < norm(b - a:real^N)` ASSUME_TAC THENL
  1.1706 -       [ASM_MESON_TAC[VECTOR_SUB_EQ; NORM_POS_LT; INTERVAL_SING]; ALL_TAC] THEN
  1.1707 -      CONV_TAC REAL_RAT_REDUCE_CONV THEN ASM_SIMP_TAC[REAL_LT_DIV] THEN
  1.1708 -      MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `n:num` THEN
  1.1709 -      REWRITE_TAC[real_div; REAL_MUL_LID; REAL_POW_INV] THEN DISCH_TAC THEN
  1.1710 -      SIMP_TAC[IN_ELIM_THM; IN_INTERVAL; SUBSET; LAMBDA_BETA] THEN
  1.1711 -      MATCH_MP_TAC(MESON[]
  1.1712 -       `(!x. Q x ==> R x) \<and> (\<exists>x. P x \<and> Q x) ==> ?x. P x \<and> Q x \<and> R x`) THEN
  1.1713 -      CONJ_TAC THENL
  1.1714 -       [REWRITE_TAC[RIGHT_IMP_FORALL_THM] THEN
  1.1715 -        MAP_EVERY X_GEN_TAC [`w:num^N`; `y:real^N`] THEN
  1.1716 -        REWRITE_TAC[IMP_IMP; AND_FORALL_THM] THEN
  1.1717 -        DISCH_THEN(fun th -> FIRST_X_ASSUM MATCH_MP_TAC THEN MP_TAC th) THEN
  1.1718 -        MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `i:num` THEN
  1.1719 -        DISCH_THEN(fun th -> STRIP_TAC THEN MP_TAC th) THEN
  1.1720 -        ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o MATCH_MP (REAL_ARITH
  1.1721 -         `(a + n \<le> x \<and> x \<le> a + m) \<and>
  1.1722 -          (a + n \<le> y \<and> y \<le> a + m) ==> abs(x - y) \<le> m - n`)) THEN
  1.1723 -        MATCH_MP_TAC(REAL_ARITH
  1.1724 -         `y * z \<le> e
  1.1725 -          ==> a \<le> ((x + 1) * y) * z - ((x * y) * z) ==> a \<le> e`) THEN
  1.1726 -        RULE_ASSUM_TAC(REWRITE_RULE[INTERVAL_NE_EMPTY]) THEN
  1.1727 -        ASM_SIMP_TAC[GSYM REAL_LE_RDIV_EQ; REAL_SUB_LT] THEN
  1.1728 -        FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
  1.1729 -        (REAL_ARITH `n < e * x ==> 0 \<le> e * (inv y - x) ==> n \<le> e / y`)) THEN
  1.1730 -        MATCH_MP_TAC REAL_LE_MUL THEN ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN
  1.1731 -        REWRITE_TAC[REAL_SUB_LE] THEN MATCH_MP_TAC REAL_LE_INV2 THEN
  1.1732 -        ASM_SIMP_TAC[REAL_SUB_LT] THEN
  1.1733 -        MP_TAC(SPECL [`b - a:real^N`; `i:num`] COMPONENT_LE_NORM) THEN
  1.1734 -        ASM_SIMP_TAC[VECTOR_SUB_COMPONENT] THEN REAL_ARITH_TAC;
  1.1735 -        ALL_TAC] THEN
  1.1736 -      REWRITE_TAC[IN_UNIV; AND_FORALL_THM] THEN
  1.1737 -      REWRITE_TAC[TAUT `(a ==> c) \<and> (a ==> b) \<longleftrightarrow> a ==> b \<and> c`] THEN
  1.1738 -      REWRITE_TAC[GSYM LAMBDA_SKOLEM] THEN X_GEN_TAC `i:num` THEN
  1.1739 -      STRIP_TAC THEN
  1.1740 -      SUBGOAL_THEN `(x:real^N) \<in> {a..b}` MP_TAC THENL
  1.1741 -       [ASM SET_TAC[]; ALL_TAC] THEN REWRITE_TAC[IN_INTERVAL] THEN
  1.1742 -      DISCH_THEN(MP_TAC o SPEC `i:num`) THEN ASM_REWRITE_TAC[] THEN
  1.1743 -      RULE_ASSUM_TAC(REWRITE_RULE[INTERVAL_NE_EMPTY]) THEN STRIP_TAC THEN
  1.1744 -      DISJ_CASES_TAC(MATCH_MP (REAL_ARITH `x \<le> y ==> x = y \/ x < y`)
  1.1745 -       (ASSUME `(x:real^N)$i \<le> (b:real^N)$i`))
  1.1746 -      THENL
  1.1747 -       [EXISTS_TAC `2 EXP n - 1` THEN
  1.1748 -        SIMP_TAC[GSYM REAL_OF_NUM_SUB; GSYM REAL_OF_NUM_LT;
  1.1749 -                 EXP_LT_0; LE_1; ARITH] THEN
  1.1750 -        ASM_REWRITE_TAC[REAL_SUB_ADD; REAL_ARITH `a - 1 < a`] THEN
  1.1751 -        MATCH_MP_TAC(REAL_ARITH
  1.1752 -         `1 * (b - a) = x \<and> y \<le> x ==> a + y \<le> b \<and> b \<le> a + x`) THEN
  1.1753 -        ASM_SIMP_TAC[REAL_EQ_MUL_RCANCEL; REAL_LT_IMP_NZ; REAL_LE_RMUL_EQ;
  1.1754 -                     REAL_SUB_LT; REAL_LT_INV_EQ; REAL_LT_POW2] THEN
  1.1755 -        SIMP_TAC[GSYM REAL_OF_NUM_POW; REAL_MUL_RINV; REAL_POW_EQ_0;
  1.1756 -                 REAL_OF_NUM_EQ; ARITH_EQ] THEN REAL_ARITH_TAC;
  1.1757 -        ALL_TAC] THEN
  1.1758 -      MP_TAC(SPEC `2 pow n * ((x:real^N)$i - (a:real^N)$i) /
  1.1759 -                              ((b:real^N)$i - (a:real^N)$i)` FLOOR_POS) THEN
  1.1760 -      ANTS_TAC THENL
  1.1761 -       [ASM_MESON_TAC[REAL_LE_MUL; REAL_LE_MUL; REAL_POW_LE; REAL_POS;
  1.1762 -                      REAL_SUB_LE; REAL_LT_IMP_LE; REAL_LE_DIV];
  1.1763 -        ALL_TAC] THEN
  1.1764 -      MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `m:num` THEN
  1.1765 -      REWRITE_TAC[GSYM REAL_OF_NUM_LT; GSYM REAL_OF_NUM_POW] THEN
  1.1766 -      DISCH_THEN(SUBST_ALL_TAC o SYM) THEN
  1.1767 -      REWRITE_TAC[REAL_ARITH `a + b * c \<le> x \<and> x \<le> a + b' * c \<longleftrightarrow>
  1.1768 -                              b * c \<le> x - a \<and> x - a \<le> b' * c`] THEN
  1.1769 -      ASM_SIMP_TAC[GSYM REAL_LE_LDIV_EQ; GSYM REAL_LE_RDIV_EQ;
  1.1770 -                   REAL_SUB_LT; GSYM real_div] THEN
  1.1771 -      ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
  1.1772 -      SIMP_TAC[REAL_LE_LDIV_EQ; REAL_LE_RDIV_EQ; REAL_LT_POW2] THEN
  1.1773 -      SIMP_TAC[FLOOR; REAL_LT_IMP_LE] THEN MATCH_MP_TAC REAL_LET_TRANS THEN
  1.1774 -      EXISTS_TAC `((x:real^N)$i - (a:real^N)$i) /
  1.1775 -                  ((b:real^N)$i - (a:real^N)$i) *
  1.1776 -                  2 pow n` THEN
  1.1777 -      REWRITE_TAC[FLOOR] THEN GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_LID] THEN
  1.1778 -      ASM_SIMP_TAC[REAL_LT_RMUL_EQ; REAL_LT_POW2] THEN
  1.1779 -      ASM_SIMP_TAC[REAL_LT_LDIV_EQ; REAL_MUL_LID; REAL_SUB_LT] THEN
  1.1780 -      ASM_REAL_ARITH_TAC;
  1.1781 -      ALL_TAC] THEN
  1.1782 -    REWRITE_TAC[FORALL_IN_IMAGE; FORALL_PAIR_THM; IN_ELIM_PAIR_THM] THEN
  1.1783 -    MAP_EVERY X_GEN_TAC [`n:num`; `v:num^N`] THEN
  1.1784 -    REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN DISCH_TAC THEN
  1.1785 -    MATCH_MP_TAC FINITE_SUBSET THEN EXISTS_TAC
  1.1786 -     `IMAGE (\<lambda>(n,v).
  1.1787 -            interval[(lambda i. a$i + (v$i) / 2 pow n *
  1.1788 -                                      ((b:real^N)$i - (a:real^N)$i)):real^N,
  1.1789 -                     (lambda i. a$i + ((v$i) + 1) / 2 pow n * (b$i - a$i))])
  1.1790 -            {m,v | m \<in> 0..n \<and>
  1.1791 -                   v \<in> {v:num^N | !i. 1 \<le> i \<and> i \<le> dimindex(:N)
  1.1792 -                                       ==> v$i < 2 EXP m}}` THEN
  1.1793 -    CONJ_TAC THENL
  1.1794 -     [MATCH_MP_TAC FINITE_IMAGE THEN
  1.1795 -      MATCH_MP_TAC FINITE_PRODUCT_DEPENDENT THEN
  1.1796 -      REWRITE_TAC[FINITE_NUMSEG] THEN REPEAT STRIP_TAC THEN
  1.1797 -      MATCH_MP_TAC FINITE_CART THEN REWRITE_TAC[FINITE_NUMSEG_LT];
  1.1798 -      ALL_TAC] THEN
  1.1799 -    GEN_REWRITE_TAC I [SUBSET] THEN
  1.1800 -    REWRITE_TAC[IN_ELIM_THM] THEN ONCE_REWRITE_TAC[IMP_CONJ] THEN
  1.1801 -    REWRITE_TAC[FORALL_IN_IMAGE; FORALL_PAIR_THM; IN_ELIM_PAIR_THM] THEN
  1.1802 -    MAP_EVERY X_GEN_TAC [`m:num`; `w:num^N`] THEN DISCH_TAC THEN
  1.1803 -    DISCH_TAC THEN SIMP_TAC[IN_IMAGE; EXISTS_PAIR_THM; IN_ELIM_PAIR_THM] THEN
  1.1804 -    MAP_EVERY EXISTS_TAC [`m:num`; `w:num^N`] THEN ASM_REWRITE_TAC[] THEN
  1.1805 -    REWRITE_TAC[IN_NUMSEG; GSYM NOT_LT; LT] THEN DISCH_TAC THEN
  1.1806 -    FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [SUBSET_INTERVAL]) THEN
  1.1807 -    SIMP_TAC[NOT_IMP; LAMBDA_BETA] THEN
  1.1808 -    RULE_ASSUM_TAC(REWRITE_RULE[INTERVAL_NE_EMPTY]) THEN
  1.1809 -    ASM_SIMP_TAC[REAL_LE_LADD; REAL_LE_RMUL_EQ; REAL_SUB_LT] THEN
  1.1810 -    ASM_SIMP_TAC[REAL_LE_DIV2_EQ; REAL_LT_POW2] THEN
  1.1811 -    REWRITE_TAC[REAL_ARITH `x \<le> x + 1`] THEN
  1.1812 -    DISCH_THEN(MP_TAC o SPEC `1`) THEN
  1.1813 -    REWRITE_TAC[LE_REFL; DIMINDEX_GE_1] THEN
  1.1814 -    DISCH_THEN(MP_TAC o MATCH_MP (REAL_ARITH
  1.1815 -     `w / m \<le> v / n \<and> (v + 1) / n \<le> (w + 1) / m
  1.1816 -      ==> inv n \<le> inv m`)) THEN
  1.1817 -    REWRITE_TAC[REAL_NOT_LE] THEN MATCH_MP_TAC REAL_LT_INV2 THEN
  1.1818 -    ASM_REWRITE_TAC[REAL_LT_POW2] THEN MATCH_MP_TAC REAL_POW_MONO_LT THEN
  1.1819 -    ASM_REWRITE_TAC[] THEN CONV_TAC REAL_RAT_REDUCE_CONV;
  1.1820 -    ALL_TAC] THEN
  1.1821 -  SUBGOAL_THEN
  1.1822 -   `?d. COUNTABLE d \<and>
  1.1823 -        (!k. k \<in> d ==> k \<subseteq> {a..b} \<and> ~(k = {}) \<and>
  1.1824 -                        (\<exists>c d:real^N. k = {c..d})) \<and>
  1.1825 -        (!k1 k2. k1 \<in> d \<and> k2 \<in> d
  1.1826 -                 ==> k1 \<subseteq> k2 \/ k2 \<subseteq> k1 \/
  1.1827 -                     interior k1 \<inter> interior k2 = {}) \<and>
  1.1828 -        (!k. k \<in> d ==> (\<exists>x. x \<in> s \<inter> k \<and> k \<subseteq> g x)) \<and>
  1.1829 -        (!k. k \<in> d ==> FINITE {l | l \<in> d \<and> k \<subseteq> l}) \<and>
  1.1830 -        s \<subseteq> \<Union>d`
  1.1831 -  MP_TAC THENL
  1.1832 -   [FIRST_X_ASSUM(X_CHOOSE_THEN `d:(real^N->bool)->bool` STRIP_ASSUME_TAC) THEN
  1.1833 -    EXISTS_TAC
  1.1834 -     `{k:real^N->bool | k \<in> d \<and> ?x. x \<in> (s \<inter> k) \<and> k \<subseteq> g x}` THEN
  1.1835 -    ASM_SIMP_TAC[IN_ELIM_THM] THEN REPEAT CONJ_TAC THENL
  1.1836 -     [MATCH_MP_TAC COUNTABLE_SUBSET THEN
  1.1837 -      EXISTS_TAC `d:(real^N->bool)->bool` THEN
  1.1838 -      ASM_REWRITE_TAC[] THEN SET_TAC[];
  1.1839 -      X_GEN_TAC `k:real^N->bool` THEN REPEAT STRIP_TAC THEN
  1.1840 -      MATCH_MP_TAC FINITE_SUBSET THEN
  1.1841 -      EXISTS_TAC `{l:real^N->bool | l \<in> d \<and> k \<subseteq> l}` THEN
  1.1842 -      ASM_REWRITE_TAC[] THEN SET_TAC[];
  1.1843 -      ASM SET_TAC[]];
  1.1844 -    ALL_TAC] THEN
  1.1845 -  DISCH_THEN(X_CHOOSE_THEN `d:(real^N->bool)->bool` STRIP_ASSUME_TAC) THEN
  1.1846 -  EXISTS_TAC
  1.1847 -   `{k:real^N->bool | k \<in> d \<and> !k'. k' \<in> d \<and> ~(k = k')
  1.1848 -                                     ==> ~(k \<subseteq> k')}` THEN
  1.1849 -  ASM_SIMP_TAC[IN_ELIM_THM] THEN REPEAT CONJ_TAC THENL
  1.1850 -   [MATCH_MP_TAC COUNTABLE_SUBSET THEN EXISTS_TAC `d:(real^N->bool)->bool` THEN
  1.1851 -    ASM_REWRITE_TAC[] THEN SET_TAC[];
  1.1852 -    ASM SET_TAC[];
  1.1853 -    ALL_TAC] THEN
  1.1854 -  FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
  1.1855 -   (REWRITE_RULE[IMP_CONJ] SUBSET_TRANS)) THEN
  1.1856 -  GEN_REWRITE_TAC I [SUBSET] THEN REWRITE_TAC[FORALL_IN_UNIONS] THEN
  1.1857 -  MAP_EVERY X_GEN_TAC [`k:real^N->bool`; `x:real^N`] THEN DISCH_TAC THEN
  1.1858 -  REWRITE_TAC[IN_UNIONS; IN_ELIM_THM] THEN
  1.1859 -  MP_TAC(ISPEC `\k l:real^N->bool. k \<in> d \<and> l \<in> d \<and> l \<subseteq> k \<and> ~(k = l)`
  1.1860 -     WF_FINITE) THEN
  1.1861 -  REWRITE_TAC[WF] THEN ANTS_TAC THENL
  1.1862 -   [CONJ_TAC THENL [SET_TAC[]; ALL_TAC] THEN X_GEN_TAC `l:real^N->bool` THEN
  1.1863 -    ASM_CASES_TAC `(l:real^N->bool) \<in> d` THEN
  1.1864 -    ASM_REWRITE_TAC[EMPTY_GSPEC; FINITE_RULES] THEN
  1.1865 -    MATCH_MP_TAC FINITE_SUBSET THEN
  1.1866 -    EXISTS_TAC `{m:real^N->bool | m \<in> d \<and> l \<subseteq> m}` THEN
  1.1867 -    ASM_SIMP_TAC[] THEN SET_TAC[];
  1.1868 -    ALL_TAC] THEN
  1.1869 -  DISCH_THEN(MP_TAC o SPEC `\l:real^N->bool. l \<in> d \<and> x \<in> l`) THEN
  1.1870 -  REWRITE_TAC[] THEN ANTS_TAC THENL [SET_TAC[]; ALL_TAC] THEN
  1.1871 -  MATCH_MP_TAC MONO_EXISTS THEN ASM SET_TAC[]);; *)
  1.1872 -
  1.1873 -lemma GMEASURABLE_OUTER_INTERVALS_BOUNDED: True .. (*
  1.1874 - "!s a b:real^N e.
  1.1875 -        gmeasurable s \<and> s \<subseteq> {a..b} \<and> 0 < e
  1.1876 -        ==> ?d. COUNTABLE d \<and>
  1.1877 -                (!k. k \<in> d ==> k \<subseteq> {a..b} \<and> ~(k = {}) \<and>
  1.1878 -                                (\<exists>c d. k = {c..d})) \<and>
  1.1879 -                (!k1 k2. k1 \<in> d \<and> k2 \<in> d \<and> ~(k1 = k2)
  1.1880 -                         ==> interior k1 \<inter> interior k2 = {}) \<and>
  1.1881 -                s \<subseteq> \<Union>d \<and>
  1.1882 -                gmeasurable (\<Union>d) \<and>
  1.1883 -                gmeasure (\<Union>d) \<le> gmeasure s + e"
  1.1884 -qed   lemma lemma = prove
  1.1885 -   (`(!x y. (x,y) \<in> IMAGE (\<lambda>z. f z,g z) s ==> P x y) \<longleftrightarrow>
  1.1886 -     (!z. z \<in> s ==> P (f z) (g z))"
  1.1887 -qed   REWRITE_TAC[IN_IMAGE; PAIR_EQ] THEN MESON_TAC[]) in
  1.1888 -  REPEAT GEN_TAC THEN
  1.1889 -  ASM_CASES_TAC `interval[a:real^N,b] = {}` THENL
  1.1890 -   [ASM_REWRITE_TAC[SUBSET_EMPTY] THEN STRIP_TAC THEN
  1.1891 -    EXISTS_TAC `{}:(real^N->bool)->bool` THEN
  1.1892 -    ASM_REWRITE_TAC[NOT_IN_EMPTY; UNIONS_0; MEASURE_EMPTY; REAL_ADD_LID;
  1.1893 -                    SUBSET_REFL; COUNTABLE_EMPTY; GMEASURABLE_EMPTY] THEN
  1.1894 -    ASM_SIMP_TAC[REAL_LT_IMP_LE];
  1.1895 -    ALL_TAC] THEN
  1.1896 -  STRIP_TAC THEN ASM_CASES_TAC `interval(a:real^N,b) = {}` THENL
  1.1897 -   [EXISTS_TAC `{interval[a:real^N,b]}` THEN
  1.1898 -    REWRITE_TAC[UNIONS_1; COUNTABLE_SING] THEN
  1.1899 -    ASM_REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM; FORALL_IN_INSERT;
  1.1900 -                    NOT_IN_EMPTY; SUBSET_REFL; GMEASURABLE_INTERVAL] THEN
  1.1901 -    CONJ_TAC THENL [MESON_TAC[]; ALL_TAC] THEN
  1.1902 -    SUBGOAL_THEN
  1.1903 -     `measure(interval[a:real^N,b]) = 0 \<and> measure(s:real^N->bool) = 0`
  1.1904 -     (fun th -> ASM_SIMP_TAC[th; REAL_LT_IMP_LE; REAL_ADD_LID]) THEN
  1.1905 -    SUBGOAL_THEN
  1.1906 -      `interval[a:real^N,b] has_gmeasure 0 \<and> (s:real^N->bool) has_gmeasure 0`
  1.1907 -      (fun th -> MESON_TAC[th; MEASURE_UNIQUE]) THEN
  1.1908 -    REWRITE_TAC[HAS_GMEASURE_0] THEN
  1.1909 -    MATCH_MP_TAC(TAUT `a \<and> (a ==> b) ==> a \<and> b`) THEN CONJ_TAC THENL
  1.1910 -     [ASM_REWRITE_TAC[NEGLIGIBLE_INTERVAL];
  1.1911 -      ASM_MESON_TAC[NEGLIGIBLE_SUBSET]];
  1.1912 -    ALL_TAC] THEN
  1.1913 -  FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [measurable]) THEN
  1.1914 -  DISCH_THEN(X_CHOOSE_TAC `m:real`) THEN
  1.1915 -  FIRST_ASSUM(ASSUME_TAC o MATCH_MP MEASURE_UNIQUE) THEN
  1.1916 -  SUBGOAL_THEN
  1.1917 -   `((\<lambda>x:real^N. if x \<in> s then 1 else 0) has_integral (lift m))
  1.1918 -    {a..b}`
  1.1919 -  ASSUME_TAC THENL
  1.1920 -   [ONCE_REWRITE_TAC[GSYM HAS_INTEGRAL_RESTRICT_UNIV] THEN
  1.1921 -    FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [HAS_GMEASURE]) THEN
  1.1922 -    MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] HAS_INTEGRAL_EQ) THEN
  1.1923 -    ASM SET_TAC[];
  1.1924 -    ALL_TAC] THEN
  1.1925 -  FIRST_ASSUM(ASSUME_TAC o MATCH_MP HAS_INTEGRAL_INTEGRABLE) THEN
  1.1926 -  FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [has_integral]) THEN
  1.1927 -  DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN
  1.1928 -  DISCH_THEN(X_CHOOSE_THEN `g:real^N->real^N->bool` STRIP_ASSUME_TAC) THEN
  1.1929 -  MP_TAC(SPECL [`a:real^N`; `b:real^N`; `s:real^N->bool`;
  1.1930 -                `g:real^N->real^N->bool`] COVERING_LEMMA) THEN
  1.1931 -  ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MONO_EXISTS THEN
  1.1932 -  X_GEN_TAC `d:(real^N->bool)->bool` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
  1.1933 -  MP_TAC(ISPECL [`(\<lambda>x. if x \<in> s then 1 else 0):real^N->real^1`;
  1.1934 -                 `a:real^N`; `b:real^N`; `g:real^N->real^N->bool`;
  1.1935 -                 `e:real`]
  1.1936 -                HENSTOCK_LEMMA_PART1) THEN
  1.1937 -  ASM_REWRITE_TAC[] THEN
  1.1938 -  FIRST_ASSUM(SUBST1_TAC o MATCH_MP INTEGRAL_UNIQUE) THEN
  1.1939 -  ASM_REWRITE_TAC[] THEN DISCH_THEN(LABEL_TAC "*") THEN
  1.1940 -  SUBGOAL_THEN
  1.1941 -   `!k l:real^N->bool. k \<in> d \<and> l \<in> d \<and> ~(k = l)
  1.1942 -                       ==> negligible(k \<inter> l)`
  1.1943 -  ASSUME_TAC THENL
  1.1944 -   [REPEAT STRIP_TAC THEN
  1.1945 -    FIRST_X_ASSUM(MP_TAC o SPECL [`k:real^N->bool`; `l:real^N->bool`]) THEN
  1.1946 -    ASM_SIMP_TAC[] THEN
  1.1947 -    SUBGOAL_THEN
  1.1948 -     `?x y:real^N u v:real^N. k = {x..y} \<and> l = {u..v}`
  1.1949 -    MP_TAC THENL [ASM_MESON_TAC[SUBSET]; ALL_TAC] THEN
  1.1950 -    DISCH_THEN(REPEAT_TCL CHOOSE_THEN (CONJUNCTS_THEN SUBST_ALL_TAC)) THEN
  1.1951 -    REWRITE_TAC[INTERIOR_CLOSED_INTERVAL] THEN DISCH_TAC THEN
  1.1952 -    MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
  1.1953 -    EXISTS_TAC `(interval[x:real^N,y] DIFF {x<..<y}) UNION
  1.1954 -                (interval[u:real^N,v] DIFF {u<..<v}) UNION
  1.1955 -                (interval (x,y) \<inter> interval (u,v))` THEN
  1.1956 -    CONJ_TAC THENL [ALL_TAC; SET_TAC[]] THEN
  1.1957 -    ASM_REWRITE_TAC[UNION_EMPTY] THEN
  1.1958 -    SIMP_TAC[NEGLIGIBLE_UNION; NEGLIGIBLE_FRONTIER_INTERVAL];
  1.1959 -    ALL_TAC] THEN
  1.1960 -  SUBGOAL_THEN
  1.1961 -   `!D. FINITE D \<and> D \<subseteq> d
  1.1962 -         ==> gmeasurable(\<Union>D :real^N->bool) \<and> measure(\<Union>D) \<le> m + e`
  1.1963 -  ASSUME_TAC THENL
  1.1964 -   [GEN_TAC THEN STRIP_TAC THEN
  1.1965 -    SUBGOAL_THEN
  1.1966 -     `?t:(real^N->bool)->real^N. !k. k \<in> D ==> t(k) \<in> (s \<inter> k) \<and>
  1.1967 -                                                k \<subseteq> (g(t k))`
  1.1968 -    (CHOOSE_THEN (LABEL_TAC "+")) THENL
  1.1969 -     [REWRITE_TAC[GSYM SKOLEM_THM] THEN ASM SET_TAC[]; ALL_TAC] THEN
  1.1970 -    REMOVE_THEN "*" (MP_TAC o SPEC
  1.1971 -     `IMAGE (\<lambda>k. (t:(real^N->bool)->real^N) k,k) D`) THEN
  1.1972 -    ASM_SIMP_TAC[VSUM_IMAGE; PAIR_EQ] THEN REWRITE_TAC[o_DEF] THEN
  1.1973 -    ANTS_TAC THENL
  1.1974 -     [REWRITE_TAC[tagged_partial_division_of; fine] THEN
  1.1975 -      ASM_SIMP_TAC[FINITE_IMAGE; FORALL_IN_IMAGE] THEN
  1.1976 -      REWRITE_TAC[lemma; RIGHT_FORALL_IMP_THM; IMP_CONJ; PAIR_EQ] THEN
  1.1977 -      ASM_SIMP_TAC[] THEN
  1.1978 -      CONJ_TAC THENL [ASM SET_TAC[]; ASM_MESON_TAC[SUBSET]];
  1.1979 -      ALL_TAC] THEN
  1.1980 -    USE_THEN "+" (MP_TAC o REWRITE_RULE[IN_INTER]) THEN
  1.1981 -    SIMP_TAC[] THEN DISCH_THEN(K ALL_TAC) THEN
  1.1982 -    ASM_SIMP_TAC[VSUM_SUB] THEN
  1.1983 -    SUBGOAL_THEN `D division_of (\<Union>D:real^N->bool)` ASSUME_TAC THENL
  1.1984 -     [REWRITE_TAC[division_of] THEN ASM SET_TAC[]; ALL_TAC] THEN
  1.1985 -    FIRST_ASSUM(ASSUME_TAC o MATCH_MP GMEASURABLE_ELEMENTARY) THEN
  1.1986 -    SUBGOAL_THEN `vsum D (\<lambda>k:real^N->bool. content k % 1) =
  1.1987 -                  lift(measure(\<Union>D))`
  1.1988 -    SUBST1_TAC THENL
  1.1989 -     [ONCE_REWRITE_TAC[GSYM _EQ] THEN
  1.1990 -      ASM_SIMP_TAC[LIFT_; _VSUM; o_DEF; _CMUL; _VEC] THEN
  1.1991 -      SIMP_TAC[REAL_MUL_RID; ETA_AX] THEN ASM_MESON_TAC[MEASURE_ELEMENTARY];
  1.1992 -      ALL_TAC] THEN
  1.1993 -    SUBGOAL_THEN
  1.1994 -     `vsum D (\<lambda>k. integral k (\<lambda>x:real^N. if x \<in> s then 1 else 0)) =
  1.1995 -      lift(sum D (\<lambda>k. measure(k \<inter> s)))`
  1.1996 -    SUBST1_TAC THENL
  1.1997 -     [ASM_SIMP_TAC[LIFT_SUM; o_DEF] THEN MATCH_MP_TAC VSUM_EQ THEN
  1.1998 -      X_GEN_TAC `k:real^N->bool` THEN DISCH_TAC THEN REWRITE_TAC[] THEN
  1.1999 -      SUBGOAL_THEN `measurable(k:real^N->bool)` ASSUME_TAC THENL
  1.2000 -       [ASM_MESON_TAC[SUBSET; GMEASURABLE_INTERVAL]; ALL_TAC] THEN
  1.2001 -      ASM_SIMP_TAC[GSYM INTEGRAL_MEASURE_UNIV; GMEASURABLE_INTER] THEN
  1.2002 -      REWRITE_TAC[MESON[IN_INTER]
  1.2003 -        `(if x \<in> k \<inter> s then a else b) =
  1.2004 -         (if x \<in> k then if x \<in> s then a else b else b)`] THEN
  1.2005 -      CONV_TAC SYM_CONV THEN MATCH_MP_TAC INTEGRAL_RESTRICT_UNIV THEN
  1.2006 -      ONCE_REWRITE_TAC[GSYM INTEGRABLE_RESTRICT_UNIV] THEN
  1.2007 -      REWRITE_TAC[MESON[IN_INTER]
  1.2008 -       `(if x \<in> k then if x \<in> s then a else b else b) =
  1.2009 -        (if x \<in> k \<inter> s then a else b)`] THEN
  1.2010 -      ASM_SIMP_TAC[GSYM GMEASURABLE_INTEGRABLE; GMEASURABLE_INTER];
  1.2011 -      ALL_TAC] THEN
  1.2012 -    ASM_REWRITE_TAC[GSYM LIFT_SUB; NORM_LIFT] THEN
  1.2013 -    MATCH_MP_TAC(REAL_ARITH `y \<le> m ==> abs(x - y) \<le> e ==> x \<le> m + e`) THEN
  1.2014 -    MATCH_MP_TAC REAL_LE_TRANS THEN
  1.2015 -    EXISTS_TAC `measure(\<Union>D \<inter> s:real^N->bool)` THEN
  1.2016 -    CONJ_TAC THENL
  1.2017 -     [ALL_TAC;
  1.2018 -      EXPAND_TAC "m" THEN MATCH_MP_TAC MEASURE_SUBSET THEN
  1.2019 -      ASM_REWRITE_TAC[] THEN CONJ_TAC THENL [ALL_TAC; SET_TAC[]] THEN
  1.2020 -      MATCH_MP_TAC GMEASURABLE_INTER THEN ASM_REWRITE_TAC[]] THEN
  1.2021 -    REWRITE_TAC[INTER_UNIONS] THEN MATCH_MP_TAC REAL_EQ_IMP_LE THEN
  1.2022 -    ONCE_REWRITE_TAC[SIMPLE_IMAGE] THEN CONV_TAC SYM_CONV THEN
  1.2023 -    MATCH_MP_TAC MEASURE_NEGLIGIBLE_UNIONS_IMAGE_STRONG THEN
  1.2024 -    ASM_SIMP_TAC[FINITE_RESTRICT] THEN CONJ_TAC THENL
  1.2025 -     [ASM_MESON_TAC[SUBSET; GMEASURABLE_INTERVAL; GMEASURABLE_INTER];
  1.2026 -      ALL_TAC] THEN
  1.2027 -    MAP_EVERY X_GEN_TAC [`k:real^N->bool`; `l:real^N->bool`] THEN
  1.2028 -    STRIP_TAC THEN MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
  1.2029 -    EXISTS_TAC `k \<inter> l:real^N->bool` THEN ASM_SIMP_TAC[] THEN SET_TAC[];
  1.2030 -    ALL_TAC] THEN
  1.2031 -  ASM_CASES_TAC `FINITE(d:(real^N->bool)->bool)` THENL
  1.2032 -   [ASM_MESON_TAC[SUBSET_REFL]; ALL_TAC] THEN
  1.2033 -  MP_TAC(ISPEC `d:(real^N->bool)->bool` COUNTABLE_AS_INJECTIVE_IMAGE) THEN
  1.2034 -  ASM_REWRITE_TAC[INFINITE] THEN
  1.2035 -  DISCH_THEN(X_CHOOSE_THEN `s:num->real^N->bool`
  1.2036 -   (CONJUNCTS_THEN2 SUBST_ALL_TAC ASSUME_TAC)) THEN
  1.2037 -  MP_TAC(ISPECL [`s:num->real^N->bool`; `m + e:real`]
  1.2038 -    HAS_GMEASURE_COUNTABLE_NEGLIGIBLE_UNIONS) THEN
  1.2039 -  MATCH_MP_TAC(TAUT `a \<and> (a \<and> b ==> c) ==> (a ==> b) ==> c`) THEN
  1.2040 -  REWRITE_TAC[GSYM CONJ_ASSOC] THEN
  1.2041 -  RULE_ASSUM_TAC(REWRITE_RULE[IMP_CONJ; RIGHT_FORALL_IMP_THM;
  1.2042 -                              FORALL_IN_IMAGE; IN_UNIV]) THEN
  1.2043 -  RULE_ASSUM_TAC(REWRITE_RULE[IMP_IMP; RIGHT_IMP_FORALL_THM]) THEN
  1.2044 -  REPEAT CONJ_TAC THENL
  1.2045 -   [ASM_MESON_TAC[MEASURABLE_INTERVAL; GMEASURABLE_INTER];
  1.2046 -    ASM_MESON_TAC[];
  1.2047 -    X_GEN_TAC `n:num` THEN
  1.2048 -    FIRST_X_ASSUM(MP_TAC o SPEC `IMAGE (s:num->real^N->bool) (0..n)`) THEN
  1.2049 -    SIMP_TAC[FINITE_IMAGE; FINITE_NUMSEG; IMAGE_SUBSET; SUBSET_UNIV] THEN
  1.2050 -    DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
  1.2051 -    MATCH_MP_TAC(REAL_ARITH `x = y ==> x \<le> e ==> y \<le> e`) THEN
  1.2052 -    MATCH_MP_TAC MEASURE_NEGLIGIBLE_UNIONS_IMAGE THEN
  1.2053 -    ASM_MESON_TAC[FINITE_NUMSEG; GMEASURABLE_INTERVAL];
  1.2054 -    ALL_TAC] THEN
  1.2055 -  ONCE_REWRITE_TAC[SIMPLE_IMAGE] THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
  1.2056 -  GEN_REWRITE_TAC LAND_CONV [GSYM(CONJUNCT2 LIFT_)] THEN
  1.2057 -  REWRITE_TAC[] THEN
  1.2058 -  MATCH_MP_TAC(ISPEC `sequentially` LIM_COMPONENT_UBOUND) THEN
  1.2059 -  EXISTS_TAC
  1.2060 -   `\n. vsum(from 0 \<inter> (0..n)) (\<lambda>n. lift(measure(s n:real^N->bool)))` THEN
  1.2061 -  ASM_REWRITE_TAC[GSYM sums; TRIVIAL_LIMIT_SEQUENTIALLY] THEN
  1.2062 -  REWRITE_TAC[DIMINDEX_1; ARITH; EVENTUALLY_SEQUENTIALLY] THEN
  1.2063 -  SIMP_TAC[VSUM_COMPONENT; ARITH; DIMINDEX_1] THEN
  1.2064 -  ASM_REWRITE_TAC[GSYM ; LIFT_; FROM_INTER_NUMSEG]);; *)
  1.2065 -
  1.2066 -(* ------------------------------------------------------------------------- *)
  1.2067 -(* Hence for linear transformation, suffices to check compact intervals.     *)
  1.2068 -(* ------------------------------------------------------------------------- *)
  1.2069 -
  1.2070 -lemma GMEASURABLE_LINEAR_IMAGE_INTERVAL: True .. (*
  1.2071 - "!f a b. linear f ==> gmeasurable(IMAGE f {a..b})"
  1.2072 -qed   REPEAT STRIP_TAC THEN MATCH_MP_TAC GMEASURABLE_CONVEX THEN CONJ_TAC THENL
  1.2073 -   [MATCH_MP_TAC CONVEX_LINEAR_IMAGE THEN
  1.2074 -    ASM_MESON_TAC[CONVEX_INTERVAL];
  1.2075 -    MATCH_MP_TAC BOUNDED_LINEAR_IMAGE THEN
  1.2076 -    ASM_MESON_TAC[BOUNDED_INTERVAL]]);; *)
  1.2077 -
  1.2078 -lemma HAS_GMEASURE_LINEAR_SUFFICIENT: True .. (*
  1.2079 - "!f:real^N->real^N m.
  1.2080 -        linear f \<and>
  1.2081 -        (!a b. IMAGE f {a..b} has_gmeasure
  1.2082 -               (m * measure{a..b}))
  1.2083 -        ==> !s. gmeasurable s ==> (IMAGE f s) has_gmeasure (m * gmeasure s)"
  1.2084 -qed   REPEAT GEN_TAC THEN STRIP_TAC THEN
  1.2085 -  DISJ_CASES_TAC(REAL_ARITH `m < 0 \/ 0 \<le> m`) THENL
  1.2086 -   [FIRST_X_ASSUM(MP_TAC o SPECL [`0:real^N`; `1:real^N`]) THEN
  1.2087 -    DISCH_THEN(MP_TAC o MATCH_MP HAS_GMEASURE_POS_LE) THEN
  1.2088 -    MATCH_MP_TAC(TAUT `~a ==> a ==> b`) THEN
  1.2089 -    MATCH_MP_TAC(REAL_ARITH `0 < --m * x ==> ~(0 \<le> m * x)`) THEN
  1.2090 -    MATCH_MP_TAC REAL_LT_MUL THEN ASM_REWRITE_TAC[REAL_NEG_GT0] THEN
  1.2091 -    REWRITE_TAC[MEASURE_INTERVAL] THEN MATCH_MP_TAC CONTENT_POS_LT THEN
  1.2092 -    SIMP_TAC[VEC_COMPONENT; REAL_LT_01];
  1.2093 -    ALL_TAC] THEN
  1.2094 -  ASM_CASES_TAC `!x y. (f:real^N->real^N) x = f y ==> x = y` THENL
  1.2095 -   [ALL_TAC;
  1.2096 -    SUBGOAL_THEN `!s. negligible(IMAGE (f:real^N->real^N) s)` ASSUME_TAC THENL
  1.2097 -     [ASM_MESON_TAC[NEGLIGIBLE_LINEAR_SINGULAR_IMAGE]; ALL_TAC] THEN
  1.2098 -    SUBGOAL_THEN `m * measure(interval[0:real^N,1]) = 0` MP_TAC THENL
  1.2099 -     [MATCH_MP_TAC(ISPEC `IMAGE (f:real^N->real^N) {0..1}`
  1.2100 -        HAS_GMEASURE_UNIQUE) THEN
  1.2101 -      ASM_REWRITE_TAC[HAS_GMEASURE_0];
  1.2102 -      REWRITE_TAC[REAL_ENTIRE; MEASURE_INTERVAL] THEN
  1.2103 -      MATCH_MP_TAC(TAUT `~b \<and> (a ==> c) ==> a \/ b ==> c`) THEN CONJ_TAC THENL
  1.2104 -       [SIMP_TAC[CONTENT_EQ_0_INTERIOR; INTERIOR_CLOSED_INTERVAL;
  1.2105 -                 INTERVAL_NE_EMPTY; VEC_COMPONENT; REAL_LT_01];
  1.2106 -        ASM_SIMP_TAC[REAL_MUL_LZERO; HAS_GMEASURE_0]]]] THEN
  1.2107 -  MP_TAC(ISPEC `f:real^N->real^N` LINEAR_INJECTIVE_ISOMORPHISM) THEN
  1.2108 -  ASM_REWRITE_TAC[] THEN
  1.2109 -  DISCH_THEN(X_CHOOSE_THEN `h:real^N->real^N` STRIP_ASSUME_TAC) THEN
  1.2110 -  UNDISCH_THEN `!x y. (f:real^N->real^N) x = f y ==> x = y` (K ALL_TAC) THEN
  1.2111 -  SUBGOAL_THEN
  1.2112 -   `!s. bounded s \<and> gmeasurable s
  1.2113 -        ==> (IMAGE (f:real^N->real^N) s) has_gmeasure (m * gmeasure s)`
  1.2114 -  ASSUME_TAC THENL
  1.2115 -   [REPEAT STRIP_TAC THEN
  1.2116 -    FIRST_ASSUM(MP_TAC o MATCH_MP BOUNDED_SUBSET_CLOSED_INTERVAL) THEN
  1.2117 -    REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
  1.2118 -    MAP_EVERY X_GEN_TAC [`a:real^N`; `b:real^N`] THEN DISCH_TAC THEN
  1.2119 -    SUBGOAL_THEN
  1.2120 -     `!d. COUNTABLE d \<and>
  1.2121 -          (!k. k \<in> d ==> k \<subseteq> {a..b} \<and> ~(k = {}) \<and>
  1.2122 -                          (\<exists>c d. k = {c..d})) \<and>
  1.2123 -          (!k1 k2. k1 \<in> d \<and> k2 \<in> d \<and> ~(k1 = k2)
  1.2124 -                   ==> interior k1 \<inter> interior k2 = {})
  1.2125 -          ==> IMAGE (f:real^N->real^N) (\<Union>d) has_gmeasure
  1.2126 -                    (m * measure(\<Union>d))`
  1.2127 -    ASSUME_TAC THENL
  1.2128 -     [REWRITE_TAC[IMAGE_UNIONS] THEN REPEAT STRIP_TAC THEN
  1.2129 -      SUBGOAL_THEN
  1.2130 -       `!g:real^N->real^N.
  1.2131 -          linear g
  1.2132 -          ==> !k l. k \<in> d \<and> l \<in> d \<and> ~(k = l)
  1.2133 -                    ==> negligible((IMAGE g k) \<inter> (IMAGE g l))`
  1.2134 -      MP_TAC THENL
  1.2135 -       [REPEAT STRIP_TAC THEN
  1.2136 -        ASM_CASES_TAC `!x y. (g:real^N->real^N) x = g y ==> x = y` THENL
  1.2137 -         [ALL_TAC;
  1.2138 -          ASM_MESON_TAC[NEGLIGIBLE_LINEAR_SINGULAR_IMAGE;
  1.2139 -                        NEGLIGIBLE_INTER]] THEN
  1.2140 -        MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
  1.2141 -        EXISTS_TAC `frontier(IMAGE (g:real^N->real^N) k \<inter> IMAGE g l) UNION
  1.2142 -                    interior(IMAGE g k \<inter> IMAGE g l)` THEN
  1.2143 -        CONJ_TAC THENL
  1.2144 -         [ALL_TAC;
  1.2145 -          REWRITE_TAC[frontier] THEN MATCH_MP_TAC(SET_RULE
  1.2146 -           `s \<subseteq> t ==> s \<subseteq> (t DIFF u) \<union> u`) THEN
  1.2147 -          REWRITE_TAC[CLOSURE_SUBSET]] THEN
  1.2148 -        MATCH_MP_TAC NEGLIGIBLE_UNION THEN CONJ_TAC THENL
  1.2149 -         [MATCH_MP_TAC NEGLIGIBLE_CONVEX_FRONTIER THEN
  1.2150 -          MATCH_MP_TAC CONVEX_INTER THEN CONJ_TAC THEN
  1.2151 -          MATCH_MP_TAC CONVEX_LINEAR_IMAGE THEN ASM_MESON_TAC[CONVEX_INTERVAL];
  1.2152 -          ALL_TAC] THEN
  1.2153 -        REWRITE_TAC[INTERIOR_INTER] THEN MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
  1.2154 -        EXISTS_TAC `IMAGE (g:real^N->real^N) (interior k) INTER
  1.2155 -                    IMAGE g (interior l)` THEN
  1.2156 -        CONJ_TAC THENL
  1.2157 -         [MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
  1.2158 -          EXISTS_TAC
  1.2159 -           `IMAGE (g:real^N->real^N) (interior k \<inter> interior l)` THEN
  1.2160 -          CONJ_TAC THENL
  1.2161 -           [ASM_SIMP_TAC[IMAGE_CLAUSES; NEGLIGIBLE_EMPTY]; SET_TAC[]];
  1.2162 -          MATCH_MP_TAC(SET_RULE
  1.2163 -           `s \<subseteq> u \<and> t \<subseteq> v ==> (s \<inter> t) \<subseteq> (u \<inter> v)`) THEN
  1.2164 -          CONJ_TAC THEN MATCH_MP_TAC INTERIOR_IMAGE_SUBSET THEN
  1.2165 -          ASM_MESON_TAC[LINEAR_CONTINUOUS_AT]];
  1.2166 -        ALL_TAC] THEN
  1.2167 -      DISCH_THEN(fun th -> MP_TAC(SPEC `f:real^N->real^N` th) THEN
  1.2168 -          MP_TAC(SPEC `\x:real^N. x` th)) THEN
  1.2169 -      ASM_REWRITE_TAC[LINEAR_ID; SET_RULE `IMAGE (\<lambda>x. x) s = s`] THEN
  1.2170 -      REPEAT STRIP_TAC THEN ASM_CASES_TAC `FINITE(d:(real^N->bool)->bool)` THENL
  1.2171 -       [MP_TAC(ISPECL [`IMAGE (f:real^N->real^N)`; `d:(real^N->bool)->bool`]
  1.2172 -                  HAS_GMEASURE_NEGLIGIBLE_UNIONS_IMAGE) THEN
  1.2173 -        ANTS_TAC THENL [ASM_MESON_TAC[measurable]; ALL_TAC] THEN
  1.2174 -        MATCH_MP_TAC EQ_IMP THEN AP_TERM_TAC THEN
  1.2175 -        MATCH_MP_TAC EQ_TRANS THEN
  1.2176 -        EXISTS_TAC `sum d (\<lambda>k:real^N->bool. m * gmeasure k)` THEN CONJ_TAC THENL
  1.2177 -         [MATCH_MP_TAC SUM_EQ THEN ASM_MESON_TAC[MEASURE_UNIQUE]; ALL_TAC] THEN
  1.2178 -        REWRITE_TAC[SUM_LMUL] THEN AP_TERM_TAC THEN
  1.2179 -        CONV_TAC SYM_CONV THEN MATCH_MP_TAC MEASURE_NEGLIGIBLE_UNIONS THEN
  1.2180 -        ASM_REWRITE_TAC[GSYM HAS_GMEASURE_MEASURE] THEN
  1.2181 -        ASM_MESON_TAC[MEASURABLE_INTERVAL];
  1.2182 -        ALL_TAC] THEN
  1.2183 -      MP_TAC(ISPEC `d:(real^N->bool)->bool` COUNTABLE_AS_INJECTIVE_IMAGE) THEN
  1.2184 -      ASM_REWRITE_TAC[INFINITE] THEN
  1.2185 -      DISCH_THEN(X_CHOOSE_THEN `s:num->real^N->bool`
  1.2186 -       (CONJUNCTS_THEN2 SUBST_ALL_TAC ASSUME_TAC)) THEN
  1.2187 -      MP_TAC(ISPEC `s:num->real^N->bool`
  1.2188 -        HAS_GMEASURE_COUNTABLE_NEGLIGIBLE_UNIONS_BOUNDED) THEN
  1.2189 -      MP_TAC(ISPEC `\n:num. IMAGE (f:real^N->real^N) (s n)`
  1.2190 -        HAS_GMEASURE_COUNTABLE_NEGLIGIBLE_UNIONS_BOUNDED) THEN
  1.2191 -      RULE_ASSUM_TAC(REWRITE_RULE[IMP_CONJ; RIGHT_FORALL_IMP_THM;
  1.2192 -                                  FORALL_IN_IMAGE; IN_UNIV]) THEN
  1.2193 -      RULE_ASSUM_TAC(REWRITE_RULE[IMP_IMP; RIGHT_IMP_FORALL_THM]) THEN
  1.2194 -      ASM_SIMP_TAC[] THEN ONCE_REWRITE_TAC[SIMPLE_IMAGE] THEN ANTS_TAC THENL
  1.2195 -       [REPEAT CONJ_TAC THENL
  1.2196 -         [ASM_MESON_TAC[MEASURABLE_LINEAR_IMAGE_INTERVAL];
  1.2197 -          ASM_MESON_TAC[];
  1.2198 -          ONCE_REWRITE_TAC[GSYM o_DEF] THEN
  1.2199 -          REWRITE_TAC[GSYM IMAGE_UNIONS; IMAGE_o] THEN
  1.2200 -          MATCH_MP_TAC BOUNDED_LINEAR_IMAGE THEN ASM_REWRITE_TAC[] THEN
  1.2201 -          MATCH_MP_TAC BOUNDED_SUBSET THEN REWRITE_TAC[UNIONS_SUBSET] THEN
  1.2202 -          EXISTS_TAC `interval[a:real^N,b]` THEN
  1.2203 -          REWRITE_TAC[BOUNDED_INTERVAL] THEN ASM SET_TAC[]];
  1.2204 -        ALL_TAC] THEN
  1.2205 -      STRIP_TAC THEN ANTS_TAC THENL
  1.2206 -       [REPEAT CONJ_TAC THENL
  1.2207 -         [ASM_MESON_TAC[MEASURABLE_INTERVAL];
  1.2208 -          ASM_MESON_TAC[];
  1.2209 -          MATCH_MP_TAC BOUNDED_SUBSET THEN REWRITE_TAC[UNIONS_SUBSET] THEN
  1.2210 -          EXISTS_TAC `interval[a:real^N,b]` THEN
  1.2211 -          REWRITE_TAC[BOUNDED_INTERVAL] THEN ASM SET_TAC[]];
  1.2212 -        ALL_TAC] THEN
  1.2213 -      STRIP_TAC THEN REWRITE_TAC[GSYM IMAGE_o; o_DEF] THEN
  1.2214 -      SUBGOAL_THEN `m * gmeasure (\<Union>(IMAGE s (:num)):real^N->bool) =
  1.2215 -             measure(\<Union>(IMAGE (\<lambda>x. IMAGE f (s x)) (:num)):real^N->bool)`
  1.2216 -       (fun th -> ASM_REWRITE_TAC[GSYM HAS_GMEASURE_MEASURE; th]) THEN
  1.2217 -      ONCE_REWRITE_TAC[GSYM LIFT_EQ] THEN
  1.2218 -      MATCH_MP_TAC SERIES_UNIQUE THEN
  1.2219 -      EXISTS_TAC `\n:num. lift(measure(IMAGE (f:real^N->real^N) (s n)))` THEN
  1.2220 -      EXISTS_TAC `from 0` THEN ASM_REWRITE_TAC[] THEN MATCH_MP_TAC SUMS_EQ THEN
  1.2221 -      EXISTS_TAC `\n:num. m % lift(measure(s n:real^N->bool))` THEN
  1.2222 -      CONJ_TAC THENL
  1.2223 -       [REWRITE_TAC[GSYM LIFT_CMUL; LIFT_EQ] THEN
  1.2224 -        ASM_MESON_TAC[MEASURE_UNIQUE];
  1.2225 -        REWRITE_TAC[LIFT_CMUL] THEN MATCH_MP_TAC SERIES_CMUL THEN
  1.2226 -        ASM_REWRITE_TAC[]];
  1.2227 -      ALL_TAC] THEN
  1.2228 -    REWRITE_TAC[HAS_GMEASURE_INNER_OUTER_LE] THEN CONJ_TAC THEN
  1.2229 -    X_GEN_TAC `e:real` THEN DISCH_TAC THENL
  1.2230 -     [MP_TAC(ISPECL [`{a..b} DIFF s:real^N->bool`; `a:real^N`;
  1.2231 -       `b:real^N`; `e / (1 + abs m)`] GMEASURABLE_OUTER_INTERVALS_BOUNDED) THEN
  1.2232 -      ANTS_TAC THENL
  1.2233 -       [ASM_SIMP_TAC[MEASURABLE_DIFF; GMEASURABLE_INTERVAL] THEN
  1.2234 -        ASM_SIMP_TAC[REAL_ARITH `0 < 1 + abs x`; REAL_LT_DIV] THEN SET_TAC[];
  1.2235 -        ALL_TAC] THEN
  1.2236 -      DISCH_THEN(X_CHOOSE_THEN `d:(real^N->bool)->bool` STRIP_ASSUME_TAC) THEN
  1.2237 -      EXISTS_TAC `IMAGE f {a..b} DIFF
  1.2238 -                  IMAGE (f:real^N->real^N) (\<Union>d)` THEN
  1.2239 -      FIRST_X_ASSUM(MP_TAC o SPEC `d:(real^N->bool)->bool`) THEN
  1.2240 -      ASM_SIMP_TAC[IMAGE_SUBSET] THEN DISCH_TAC THEN
  1.2241 -      CONJ_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN CONJ_TAC THENL
  1.2242 -       [ASM_MESON_TAC[MEASURABLE_DIFF; gmeasurable]; ALL_TAC] THEN
  1.2243 -      MATCH_MP_TAC REAL_LE_TRANS THEN
  1.2244 -      EXISTS_TAC `measure(IMAGE f {a..b}) -
  1.2245 -                  measure(IMAGE (f:real^N->real^N) (\<Union>d))` THEN
  1.2246 -      CONJ_TAC THENL
  1.2247 -       [ALL_TAC;
  1.2248 -        MATCH_MP_TAC REAL_EQ_IMP_LE THEN CONV_TAC SYM_CONV THEN
  1.2249 -        MATCH_MP_TAC MEASURE_DIFF_SUBSET THEN
  1.2250 -        REPEAT(CONJ_TAC THENL [ASM_MESON_TAC[measurable]; ALL_TAC]) THEN
  1.2251 -        MATCH_MP_TAC IMAGE_SUBSET THEN ASM_SIMP_TAC[UNIONS_SUBSET]] THEN
  1.2252 -      FIRST_ASSUM(ASSUME_TAC o SPECL [`a:real^N`; `b:real^N`]) THEN
  1.2253 -      REPEAT(FIRST_X_ASSUM(SUBST1_TAC o MATCH_MP MEASURE_UNIQUE)) THEN
  1.2254 -      MATCH_MP_TAC REAL_LE_TRANS THEN
  1.2255 -      EXISTS_TAC `m * measure(s:real^N->bool) - m * e / (1 + abs m)` THEN
  1.2256 -      CONJ_TAC THENL
  1.2257 -       [REWRITE_TAC[REAL_ARITH `a - x \<le> a - y \<longleftrightarrow> y \<le> x`] THEN
  1.2258 -        REWRITE_TAC[real_div; REAL_MUL_ASSOC] THEN
  1.2259 -        REWRITE_TAC[GSYM real_div] THEN
  1.2260 -        ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_ARITH `0 < 1 + abs x`] THEN
  1.2261 -        GEN_REWRITE_TAC RAND_CONV [REAL_MUL_SYM] THEN
  1.2262 -        ASM_SIMP_TAC[REAL_LE_RMUL_EQ] THEN REAL_ARITH_TAC;
  1.2263 -        ALL_TAC] THEN
  1.2264 -      REWRITE_TAC[GSYM REAL_SUB_LDISTRIB] THEN MATCH_MP_TAC REAL_LE_LMUL THEN
  1.2265 -      ASM_REWRITE_TAC[] THEN
  1.2266 -      FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
  1.2267 -        `d \<le> a + e ==> a = i - s ==> s - e \<le> i - d`)) THEN
  1.2268 -      MATCH_MP_TAC MEASURE_DIFF_SUBSET THEN
  1.2269 -      ASM_REWRITE_TAC[MEASURABLE_INTERVAL];
  1.2270 -      MP_TAC(ISPECL [`s:real^N->bool`; `a:real^N`; `b:real^N`;
  1.2271 -                `e / (1 + abs m)`] GMEASURABLE_OUTER_INTERVALS_BOUNDED) THEN
  1.2272 -      ASM_SIMP_TAC[REAL_LT_DIV; REAL_ARITH `0 < 1 + abs x`] THEN
  1.2273 -      DISCH_THEN(X_CHOOSE_THEN `d:(real^N->bool)->bool` STRIP_ASSUME_TAC) THEN
  1.2274 -      EXISTS_TAC `IMAGE (f:real^N->real^N) (\<Union>d)` THEN
  1.2275 -      FIRST_X_ASSUM(MP_TAC o SPEC `d:(real^N->bool)->bool`) THEN
  1.2276 -      ASM_SIMP_TAC[IMAGE_SUBSET] THEN
  1.2277 -      SIMP_TAC[HAS_GMEASURE_MEASURABLE_MEASURE] THEN STRIP_TAC THEN
  1.2278 -      MATCH_MP_TAC REAL_LE_TRANS THEN
  1.2279 -      EXISTS_TAC `m * measure(s:real^N->bool) + m * e / (1 + abs m)` THEN
  1.2280 -      CONJ_TAC THENL
  1.2281 -       [REWRITE_TAC[GSYM REAL_ADD_LDISTRIB] THEN ASM_SIMP_TAC[REAL_LE_LMUL];
  1.2282 -        REWRITE_TAC[REAL_LE_LADD] THEN
  1.2283 -        REWRITE_TAC[real_div; REAL_MUL_ASSOC] THEN
  1.2284 -        REWRITE_TAC[GSYM real_div] THEN
  1.2285 -        ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_ARITH `0 < 1 + abs x`] THEN
  1.2286 -        GEN_REWRITE_TAC RAND_CONV [REAL_MUL_SYM] THEN
  1.2287 -        ASM_SIMP_TAC[REAL_LE_RMUL_EQ] THEN REAL_ARITH_TAC]];
  1.2288 -      ALL_TAC] THEN
  1.2289 -  REPEAT STRIP_TAC THEN ONCE_REWRITE_TAC[HAS_GMEASURE_LIMIT] THEN
  1.2290 -  X_GEN_TAC `e:real` THEN DISCH_TAC THEN
  1.2291 -  FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [HAS_GMEASURE_MEASURE]) THEN
  1.2292 -  GEN_REWRITE_TAC LAND_CONV [HAS_GMEASURE_LIMIT] THEN
  1.2293 -  DISCH_THEN(MP_TAC o SPEC `e / (1 + abs m)`) THEN
  1.2294 -  ASM_SIMP_TAC[REAL_LT_DIV; REAL_ARITH `0 < 1 + abs x`] THEN
  1.2295 -  DISCH_THEN(X_CHOOSE_THEN `B:real`
  1.2296 -   (CONJUNCTS_THEN2 ASSUME_TAC (LABEL_TAC "*"))) THEN
  1.2297 -  MP_TAC(ISPEC `ball(0:real^N,B)` BOUNDED_SUBSET_CLOSED_INTERVAL) THEN
  1.2298 -  REWRITE_TAC[BOUNDED_BALL; LEFT_IMP_EXISTS_THM] THEN
  1.2299 -  REMOVE_THEN "*" MP_TAC THEN
  1.2300 -  MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `c:real^N` THEN
  1.2301 -  MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `d:real^N` THEN
  1.2302 -  DISCH_THEN(fun th -> DISCH_TAC THEN MP_TAC th) THEN ASM_REWRITE_TAC[] THEN
  1.2303 -  DISCH_THEN(X_CHOOSE_THEN `z:real` STRIP_ASSUME_TAC) THEN
  1.2304 -  MP_TAC(ISPECL [`interval[c:real^N,d]`; `0:real^N`]
  1.2305 -    BOUNDED_SUBSET_BALL) THEN
  1.2306 -  REWRITE_TAC[BOUNDED_INTERVAL] THEN
  1.2307 -  DISCH_THEN(X_CHOOSE_THEN `D:real` STRIP_ASSUME_TAC) THEN
  1.2308 -  MP_TAC(ISPEC `f:real^N->real^N` LINEAR_BOUNDED_POS) THEN
  1.2309 -  ASM_REWRITE_TAC[] THEN
  1.2310 -  DISCH_THEN(X_CHOOSE_THEN `C:real` STRIP_ASSUME_TAC) THEN
  1.2311 -
  1.2312 -  EXISTS_TAC `D * C` THEN ASM_SIMP_TAC[REAL_LT_MUL] THEN
  1.2313 -  MAP_EVERY X_GEN_TAC [`a:real^N`; `b:real^N`] THEN DISCH_TAC THEN
  1.2314 -  FIRST_X_ASSUM(MP_TAC o SPEC
  1.2315 -   `s \<inter> (IMAGE (h:real^N->real^N) {a..b})`) THEN
  1.2316 -  SUBGOAL_THEN
  1.2317 -   `IMAGE (f:real^N->real^N) (s \<inter> IMAGE h (interval [a,b])) =
  1.2318 -    (IMAGE f s) \<inter> {a..b}`
  1.2319 -  SUBST1_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN ANTS_TAC THENL
  1.2320 -   [ASM_SIMP_TAC[BOUNDED_INTER; BOUNDED_LINEAR_IMAGE; BOUNDED_INTERVAL] THEN
  1.2321 -    ASM_SIMP_TAC[MEASURABLE_INTER; GMEASURABLE_LINEAR_IMAGE_INTERVAL];
  1.2322 -    ALL_TAC] THEN
  1.2323 -  DISCH_TAC THEN EXISTS_TAC
  1.2324 -   `m * measure(s \<inter> (IMAGE (h:real^N->real^N) {a..b}))` THEN
  1.2325 -  ASM_REWRITE_TAC[] THEN
  1.2326 -  MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `m * e / (1 + abs m)` THEN
  1.2327 -  CONJ_TAC THENL
  1.2328 -   [ALL_TAC;
  1.2329 -    REWRITE_TAC[real_div; REAL_MUL_ASSOC] THEN REWRITE_TAC[GSYM real_div] THEN
  1.2330 -    ASM_SIMP_TAC[REAL_LT_LDIV_EQ; REAL_ARITH `0 < 1 + abs x`] THEN
  1.2331 -    GEN_REWRITE_TAC RAND_CONV [REAL_MUL_SYM] THEN
  1.2332 -    ASM_SIMP_TAC[REAL_LT_RMUL_EQ] THEN REAL_ARITH_TAC] THEN
  1.2333 -  REWRITE_TAC[GSYM REAL_SUB_LDISTRIB; REAL_ABS_MUL] THEN
  1.2334 -  GEN_REWRITE_TAC (LAND_CONV o LAND_CONV) [real_abs] THEN
  1.2335 -  ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_LE_LMUL THEN ASM_REWRITE_TAC[] THEN
  1.2336 -  FIRST_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
  1.2337 -   `abs(z - m) < e ==> z \<le> w \<and> w \<le> m ==> abs(w - m) \<le> e`)) THEN
  1.2338 -  SUBST1_TAC(SYM(MATCH_MP MEASURE_UNIQUE
  1.2339 -   (ASSUME `s \<inter> interval [c:real^N,d] has_gmeasure z`))) THEN
  1.2340 -  CONJ_TAC THEN MATCH_MP_TAC MEASURE_SUBSET THEN
  1.2341 -  ASM_SIMP_TAC[MEASURABLE_INTER; GMEASURABLE_LINEAR_IMAGE_INTERVAL;
  1.2342 -               GMEASURABLE_INTERVAL; INTER_SUBSET] THEN
  1.2343 -  MATCH_MP_TAC(SET_RULE
  1.2344 -   `!v. t \<subseteq> v \<and> v \<subseteq> u ==> s \<inter> t \<subseteq> s \<inter> u`) THEN
  1.2345 -  EXISTS_TAC `ball(0:real^N,D)` THEN ASM_REWRITE_TAC[] THEN
  1.2346 -  MATCH_MP_TAC(SET_RULE
  1.2347 -   `!f. (!x. h(f x) = x) \<and> IMAGE f s \<subseteq> t ==> s \<subseteq> IMAGE h t`) THEN
  1.2348 -  EXISTS_TAC `f:real^N->real^N` THEN ASM_REWRITE_TAC[] THEN
  1.2349 -  MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `ball(0:real^N,D * C)` THEN
  1.2350 -  ASM_REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_BALL_0] THEN
  1.2351 -  X_GEN_TAC `x:real^N` THEN DISCH_TAC THEN
  1.2352 -  MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `C * norm(x:real^N)` THEN
  1.2353 -  ASM_REWRITE_TAC[] THEN GEN_REWRITE_TAC RAND_CONV [REAL_MUL_SYM] THEN
  1.2354 -  ASM_SIMP_TAC[REAL_LT_LMUL_EQ]);; *)
  1.2355 -
  1.2356 -(* ------------------------------------------------------------------------- *)
  1.2357 -(* Some inductions by expressing mapping in terms of elementary matrices.    *)
  1.2358 -(* ------------------------------------------------------------------------- *)
  1.2359 -
  1.2360 -lemma INDUCT_MATRIX_ROW_OPERATIONS: True .. (*
  1.2361 - "!P:real^N^N->bool.
  1.2362 -        (!A i. 1 \<le> i \<and> i \<le> dimindex(:N) \<and> row i A = 0 ==> P A) \<and>
  1.2363 -        (!A. (!i j. 1 \<le> i \<and> i \<le> dimindex(:N) \<and>
  1.2364 -                    1 \<le> j \<and> j \<le> dimindex(:N) \<and> ~(i = j)
  1.2365 -                    ==> A$i$j = 0) ==> P A) \<and>
  1.2366 -        (!A m n. P A \<and> 1 \<le> m \<and> m \<le> dimindex(:N) \<and>
  1.2367 -                 1 \<le> n \<and> n \<le> dimindex(:N) \<and> ~(m = n)
  1.2368 -                 ==> P(lambda i j. A$i$(swap(m,n) j))) \<and>
  1.2369 -        (!A m n c. P A \<and> 1 \<le> m \<and> m \<le> dimindex(:N) \<and>
  1.2370 -                   1 \<le> n \<and> n \<le> dimindex(:N) \<and> ~(m = n)
  1.2371 -                   ==> P(lambda i. if i = m then row m A + c % row n A
  1.2372 -                                   else row i A))
  1.2373 -        ==> !A. P A"
  1.2374 -qed   GEN_TAC THEN
  1.2375 -  DISCH_THEN(CONJUNCTS_THEN2 (LABEL_TAC "zero_row") MP_TAC) THEN
  1.2376 -  DISCH_THEN(CONJUNCTS_THEN2 (LABEL_TAC "diagonal") MP_TAC) THEN
  1.2377 -  DISCH_THEN(CONJUNCTS_THEN2 (LABEL_TAC "swap_cols") (LABEL_TAC "row_op")) THEN
  1.2378 -  SUBGOAL_THEN
  1.2379 -   `!k A:real^N^N.
  1.2380 -        (!i j. 1 \<le> i \<and> i \<le> dimindex(:N) \<and>
  1.2381 -               k \<le> j \<and> j \<le> dimindex(:N) \<and> ~(i = j)
  1.2382 -               ==> A$i$j = 0)
  1.2383 -        ==> P A`
  1.2384 -   (fun th -> GEN_TAC THEN MATCH_MP_TAC th THEN
  1.2385 -              EXISTS_TAC `dimindex(:N) + 1` THEN ARITH_TAC) THEN
  1.2386 -  MATCH_MP_TAC num_INDUCTION THEN CONJ_TAC THENL
  1.2387 -   [REPEAT STRIP_TAC THEN USE_THEN "diagonal" MATCH_MP_TAC THEN
  1.2388 -    REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
  1.2389 -    ASM_REWRITE_TAC[LE_0];
  1.2390 -    ALL_TAC] THEN
  1.2391 -  X_GEN_TAC `k:num` THEN DISCH_THEN(LABEL_TAC "ind_hyp") THEN
  1.2392 -  DISJ_CASES_THEN2 SUBST1_TAC ASSUME_TAC (ARITH_RULE `k = 0 \/ 1 \<le> k`) THEN
  1.2393 -  ASM_REWRITE_TAC[ARITH] THEN
  1.2394 -  ASM_CASES_TAC `k \<le> dimindex(:N)` THENL
  1.2395 -   [ALL_TAC;
  1.2396 -    REPEAT STRIP_TAC THEN REMOVE_THEN "ind_hyp" MATCH_MP_TAC THEN
  1.2397 -    ASM_ARITH_TAC] THEN
  1.2398 -  SUBGOAL_THEN
  1.2399 -   `!A:real^N^N.
  1.2400 -        ~(A$k$k = 0) \<and>
  1.2401 -        (!i j. 1 \<le> i \<and> i \<le> dimindex (:N) \<and>
  1.2402 -               SUC k \<le> j \<and> j \<le> dimindex (:N) \<and> ~(i = j)
  1.2403 -               ==> A$i$j = 0)
  1.2404 -        ==> P A`
  1.2405 -  (LABEL_TAC "nonzero_hyp") THENL
  1.2406 -   [ALL_TAC;
  1.2407 -    X_GEN_TAC `A:real^N^N` THEN DISCH_TAC THEN
  1.2408 -    ASM_CASES_TAC `row k (A:real^N^N) = 0` THENL
  1.2409 -     [REMOVE_THEN "zero_row" MATCH_MP_TAC THEN ASM_MESON_TAC[];
  1.2410 -      ALL_TAC] THEN
  1.2411 -    FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE RAND_CONV [CART_EQ]) THEN
  1.2412 -    SIMP_TAC[VEC_COMPONENT; row; LAMBDA_BETA] THEN
  1.2413 -    REWRITE_TAC[NOT_FORALL_THM; NOT_IMP; LEFT_IMP_EXISTS_THM] THEN
  1.2414 -    X_GEN_TAC `l:num` THEN STRIP_TAC THEN
  1.2415 -    ASM_CASES_TAC `l:num = k` THENL
  1.2416 -     [REMOVE_THEN "nonzero_hyp" MATCH_MP_TAC THEN ASM_MESON_TAC[];
  1.2417 -      ALL_TAC] THEN
  1.2418 -    REMOVE_THEN "swap_cols" (MP_TAC o SPECL
  1.2419 -     [`(lambda i j. (A:real^N^N)$i$swap(k,l) j):real^N^N`;
  1.2420 -      `k:num`; `l:num`]) THEN
  1.2421 -    ASM_SIMP_TAC[LAMBDA_BETA] THEN ANTS_TAC THENL
  1.2422 -     [ALL_TAC;
  1.2423 -      MATCH_MP_TAC EQ_IMP THEN AP_TERM_TAC THEN
  1.2424 -      SIMP_TAC[CART_EQ; LAMBDA_BETA] THEN
  1.2425 -      REPEAT STRIP_TAC THEN REWRITE_TAC[swap] THEN
  1.2426 -      REPEAT(COND_CASES_TAC THEN ASM_SIMP_TAC[LAMBDA_BETA])] THEN
  1.2427 -    REMOVE_THEN "nonzero_hyp" MATCH_MP_TAC THEN
  1.2428 -    ONCE_REWRITE_TAC[ARITH_RULE `SUC k \<le> i \<longleftrightarrow> 1 \<le> i \<and> SUC k \<le> i`] THEN
  1.2429 -    ASM_SIMP_TAC[LAMBDA_BETA] THEN
  1.2430 -    ASM_REWRITE_TAC[swap] THEN MAP_EVERY X_GEN_TAC [`i:num`; `j:num`] THEN
  1.2431 -    STRIP_TAC THEN SUBGOAL_THEN `l:num \<le> k` ASSUME_TAC THENL
  1.2432 -     [FIRST_X_ASSUM(MP_TAC o SPECL [`k:num`; `l:num`]) THEN
  1.2433 -      ASM_REWRITE_TAC[] THEN ARITH_TAC;
  1.2434 -      ALL_TAC] THEN
  1.2435 -    REPEAT(COND_CASES_TAC THEN ASM_REWRITE_TAC[]) THEN
  1.2436 -    FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN
  1.2437 -    ASM_ARITH_TAC] THEN
  1.2438 -   SUBGOAL_THEN
  1.2439 -   `!l A:real^N^N.
  1.2440 -        ~(A$k$k = 0) \<and>
  1.2441 -        (!i j. 1 \<le> i \<and> i \<le> dimindex (:N) \<and>
  1.2442 -               SUC k \<le> j \<and> j \<le> dimindex (:N) \<and> ~(i = j)
  1.2443 -               ==> A$i$j = 0) \<and>
  1.2444 -        (!i. l \<le> i \<and> i \<le> dimindex(:N) \<and> ~(i = k) ==> A$i$k = 0)
  1.2445 -        ==> P A`
  1.2446 -   MP_TAC THENL
  1.2447 -    [ALL_TAC;
  1.2448 -     DISCH_THEN(MP_TAC o SPEC `dimindex(:N) + 1`) THEN
  1.2449 -     REWRITE_TAC[CONJ_ASSOC; ARITH_RULE `~(n + 1 \<le> i \<and> i \<le> n)`]] THEN
  1.2450 -   MATCH_MP_TAC num_INDUCTION THEN CONJ_TAC THENL
  1.2451 -    [GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
  1.2452 -     DISCH_THEN(CONJUNCTS_THEN2 (LABEL_TAC "main") (LABEL_TAC "aux")) THEN
  1.2453 -     USE_THEN "ind_hyp" MATCH_MP_TAC THEN
  1.2454 -     MAP_EVERY X_GEN_TAC [`i:num`; `j:num`] THEN STRIP_TAC THEN
  1.2455 -     ASM_CASES_TAC `j:num = k` THENL
  1.2456 -      [ASM_REWRITE_TAC[] THEN USE_THEN "aux" MATCH_MP_TAC THEN ASM_ARITH_TAC;
  1.2457 -       REMOVE_THEN "main" MATCH_MP_TAC THEN ASM_ARITH_TAC];
  1.2458 -    ALL_TAC] THEN
  1.2459 -  X_GEN_TAC `l:num` THEN DISCH_THEN(LABEL_TAC "inner_hyp") THEN
  1.2460 -  GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
  1.2461 -  DISCH_THEN(CONJUNCTS_THEN2 (LABEL_TAC "main") (LABEL_TAC "aux")) THEN
  1.2462 -  ASM_CASES_TAC `l:num = k` THENL
  1.2463 -   [REMOVE_THEN "inner_hyp" MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN
  1.2464 -    REPEAT STRIP_TAC THEN REMOVE_THEN "aux" MATCH_MP_TAC THEN ASM_ARITH_TAC;
  1.2465 -    ALL_TAC] THEN
  1.2466 -  DISJ_CASES_TAC(ARITH_RULE `l = 0 \/ 1 \<le> l`) THENL
  1.2467 -   [REMOVE_THEN "ind_hyp" MATCH_MP_TAC THEN
  1.2468 -    MAP_EVERY X_GEN_TAC [`i:num`; `j:num`] THEN STRIP_TAC THEN
  1.2469 -    ASM_CASES_TAC `j:num = k` THENL
  1.2470 -     [ASM_REWRITE_TAC[] THEN REMOVE_THEN "aux" MATCH_MP_TAC THEN ASM_ARITH_TAC;
  1.2471 -      REMOVE_THEN "main" MATCH_MP_TAC THEN ASM_ARITH_TAC];
  1.2472 -    ALL_TAC] THEN
  1.2473 -  ASM_CASES_TAC `l \<le> dimindex(:N)` THENL
  1.2474 -   [ALL_TAC;
  1.2475 -    REMOVE_THEN "inner_hyp" MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN
  1.2476 -    ASM_ARITH_TAC] THEN
  1.2477 -  REMOVE_THEN "inner_hyp" (MP_TAC o SPECL
  1.2478 -   [`(lambda i. if i = l then row l (A:real^N^N) + --(A$l$k/A$k$k) % row k A
  1.2479 -                else row i A):real^N^N`]) THEN
  1.2480 -  ANTS_TAC THENL
  1.2481 -   [SUBGOAL_THEN `!i. l \<le> i ==> 1 \<le> i` ASSUME_TAC THENL
  1.2482 -     [ASM_ARITH_TAC; ALL_TAC] THEN
  1.2483 -    ONCE_REWRITE_TAC[ARITH_RULE `SUC k \<le> j \<longleftrightarrow> 1 \<le> j \<and> SUC k \<le> j`] THEN
  1.2484 -    ASM_SIMP_TAC[LAMBDA_BETA; row; COND_COMPONENT;
  1.2485 -                 VECTOR_ADD_COMPONENT; VECTOR_MUL_COMPONENT] THEN
  1.2486 -    ASM_SIMP_TAC[REAL_FIELD `~(y = 0) ==> x + --(x / y) * y = 0`] THEN
  1.2487 -    REWRITE_TAC[AND_FORALL_THM] THEN X_GEN_TAC `i:num` THEN
  1.2488 -    ASM_CASES_TAC `i:num = l` THEN ASM_REWRITE_TAC[] THENL
  1.2489 -     [REPEAT STRIP_TAC THEN
  1.2490 -      MATCH_MP_TAC(REAL_RING `x = 0 \<and> y = 0 ==> x + z * y = 0`) THEN
  1.2491 -      CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC;
  1.2492 -      REPEAT STRIP_TAC THEN REMOVE_THEN "aux" MATCH_MP_TAC THEN ASM_ARITH_TAC];
  1.2493 -    ALL_TAC] THEN
  1.2494 -  DISCH_TAC THEN REMOVE_THEN "row_op" (MP_TAC o SPECL
  1.2495 -   [`(lambda i. if i = l then row l A + --(A$l$k / A$k$k) % row k A
  1.2496 -                else row i (A:real^N^N)):real^N^N`;
  1.2497 -    `l:num`; `k:num`; `(A:real^N^N)$l$k / A$k$k`]) THEN
  1.2498 -  ASM_REWRITE_TAC[] THEN MATCH_MP_TAC EQ_IMP THEN AP_TERM_TAC THEN
  1.2499 -  ASM_SIMP_TAC[CART_EQ; LAMBDA_BETA; VECTOR_ADD_COMPONENT;
  1.2500 -               VECTOR_MUL_COMPONENT; row; COND_COMPONENT] THEN
  1.2501 -  REPEAT STRIP_TAC THEN COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
  1.2502 -  REAL_ARITH_TAC);; *)
  1.2503 -
  1.2504 -lemma INDUCT_MATRIX_ELEMENTARY: True .. (*
  1.2505 - "!P:real^N^N->bool.
  1.2506 -        (!A B. P A \<and> P B ==> P(A ** B)) \<and>
  1.2507 -        (!A i. 1 \<le> i \<and> i \<le> dimindex(:N) \<and> row i A = 0 ==> P A) \<and>
  1.2508 -        (!A. (!i j. 1 \<le> i \<and> i \<le> dimindex(:N) \<and>
  1.2509 -                    1 \<le> j \<and> j \<le> dimindex(:N) \<and> ~(i = j)
  1.2510 -                    ==> A$i$j = 0) ==> P A) \<and>
  1.2511 -        (!m n. 1 \<le> m \<and> m \<le> dimindex(:N) \<and>
  1.2512 -               1 \<le> n \<and> n \<le> dimindex(:N) \<and> ~(m = n)
  1.2513 -               ==> P(lambda i j. (mat 1:real^N^N)$i$(swap(m,n) j))) \<and>
  1.2514 -        (!m n c. 1 \<le> m \<and> m \<le> dimindex(:N) \<and>
  1.2515 -                 1 \<le> n \<and> n \<le> dimindex(:N) \<and> ~(m = n)
  1.2516 -                 ==> P(lambda i j. if i = m \<and> j = n then c
  1.2517 -                                   else if i = j then 1 else 0))
  1.2518 -        ==> !A. P A"
  1.2519 -qed   GEN_TAC THEN
  1.2520 -  DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
  1.2521 -  DISCH_THEN(fun th ->
  1.2522 -    MATCH_MP_TAC INDUCT_MATRIX_ROW_OPERATIONS THEN MP_TAC th) THEN
  1.2523 -  REPEAT(MATCH_MP_TAC MONO_AND THEN CONJ_TAC) THEN REWRITE_TAC[] THEN
  1.2524 -  DISCH_THEN(fun th -> X_GEN_TAC `A:real^N^N` THEN MP_TAC th) THEN
  1.2525 -  REPEAT(MATCH_MP_TAC MONO_FORALL THEN GEN_TAC) THEN
  1.2526 -  DISCH_THEN(fun th -> STRIP_TAC THEN MP_TAC th) THEN ASM_REWRITE_TAC[] THEN
  1.2527 -  UNDISCH_TAC `(P:real^N^N->bool) A` THENL
  1.2528 -   [REWRITE_TAC[GSYM IMP_CONJ]; REWRITE_TAC[GSYM IMP_CONJ_ALT]] THEN
  1.2529 -  DISCH_THEN(ANTE_RES_THEN MP_TAC) THEN MATCH_MP_TAC EQ_IMP THEN
  1.2530 -  AP_TERM_TAC THEN REWRITE_TAC[CART_EQ] THEN
  1.2531 -  X_GEN_TAC `i:num` THEN STRIP_TAC THEN
  1.2532 -  X_GEN_TAC `j:num` THEN STRIP_TAC THEN
  1.2533 -  ASM_SIMP_TAC[CART_EQ; LAMBDA_BETA; matrix_mul; row] THENL
  1.2534 -   [ASM_SIMP_TAC[mat; IN_DIMINDEX_SWAP; LAMBDA_BETA] THEN
  1.2535 -    ONCE_REWRITE_TAC[COND_RAND] THEN
  1.2536 -    SIMP_TAC[SUM_DELTA; REAL_MUL_RZERO; REAL_MUL_RID] THEN
  1.2537 -    COND_CASES_TAC THEN REWRITE_TAC[] THEN
  1.2538 -    RULE_ASSUM_TAC(REWRITE_RULE[swap; IN_NUMSEG]) THEN ASM_ARITH_TAC;
  1.2539 -    ALL_TAC] THEN
  1.2540 -  ASM_CASES_TAC `i:num = m` THEN ASM_REWRITE_TAC[] THENL
  1.2541 -   [ALL_TAC;
  1.2542 -    ONCE_REWRITE_TAC[COND_RAND] THEN ONCE_REWRITE_TAC[COND_RATOR] THEN
  1.2543 -    REWRITE_TAC[REAL_MUL_LZERO] THEN
  1.2544 -    GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV) [EQ_SYM_EQ] THEN
  1.2545 -    ASM_SIMP_TAC[SUM_DELTA; LAMBDA_BETA; IN_NUMSEG; REAL_MUL_LID]] THEN
  1.2546 -  ASM_SIMP_TAC[VECTOR_ADD_COMPONENT; VECTOR_MUL_COMPONENT; LAMBDA_BETA] THEN
  1.2547 -  MATCH_MP_TAC EQ_TRANS THEN
  1.2548 -  EXISTS_TAC
  1.2549 -    `sum {m,n} (\<lambda>k. (if k = n then c else if m = k then 1 else 0) *
  1.2550 -                    (A:real^N^N)$k$j)` THEN
  1.2551 -  CONJ_TAC THENL
  1.2552 -   [MATCH_MP_TAC SUM_SUPERSET THEN
  1.2553 -    ASM_SIMP_TAC[SUBSET; IN_INSERT; NOT_IN_EMPTY; DE_MORGAN_THM;
  1.2554 -                 IN_NUMSEG; REAL_MUL_LZERO] THEN
  1.2555 -    ASM_ARITH_TAC;
  1.2556 -    ASM_SIMP_TAC[SUM_CLAUSES; FINITE_RULES; IN_INSERT; NOT_IN_EMPTY] THEN
  1.2557 -    REAL_ARITH_TAC]);; *)
  1.2558 -
  1.2559 -lemma INDUCT_MATRIX_ELEMENTARY_ALT: True .. (*
  1.2560 - "!P:real^N^N->bool.
  1.2561 -        (!A B. P A \<and> P B ==> P(A ** B)) \<and>
  1.2562 -        (!A i. 1 \<le> i \<and> i \<le> dimindex(:N) \<and> row i A = 0 ==> P A) \<and>
  1.2563 -        (!A. (!i j. 1 \<le> i \<and> i \<le> dimindex(:N) \<and>
  1.2564 -                    1 \<le> j \<and> j \<le> dimindex(:N) \<and> ~(i = j)
  1.2565 -                    ==> A$i$j = 0) ==> P A) \<and>
  1.2566 -        (!m n. 1 \<le> m \<and> m \<le> dimindex(:N) \<and>
  1.2567 -               1 \<le> n \<and> n \<le> dimindex(:N) \<and> ~(m = n)
  1.2568 -               ==> P(lambda i j. (mat 1:real^N^N)$i$(swap(m,n) j))) \<and>
  1.2569 -        (!m n. 1 \<le> m \<and> m \<le> dimindex(:N) \<and>
  1.2570 -               1 \<le> n \<and> n \<le> dimindex(:N) \<and> ~(m = n)
  1.2571 -               ==> P(lambda i j. if i = m \<and> j = n \/ i = j then 1 else 0))
  1.2572 -        ==> !A. P A"
  1.2573 -qed   GEN_TAC THEN STRIP_TAC THEN MATCH_MP_TAC INDUCT_MATRIX_ELEMENTARY THEN
  1.2574 -  ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN
  1.2575 -  ASM_CASES_TAC `c = 0` THENL
  1.2576 -   [FIRST_X_ASSUM(fun th -> MATCH_MP_TAC th THEN
  1.2577 -        MAP_EVERY X_GEN_TAC [`i:num`; `j:num`]) THEN
  1.2578 -    ASM_SIMP_TAC[LAMBDA_BETA; COND_ID];
  1.2579 -    ALL_TAC] THEN
  1.2580 -  SUBGOAL_THEN
  1.2581 -   `(lambda i j. if i = m \<and> j = n then c else if i = j then 1 else 0) =
  1.2582 -  ((lambda i j. if i = j then if j = n then inv c else 1 else 0):real^N^N) **
  1.2583 -    ((lambda i j. if i = m \<and> j = n \/ i = j then 1 else 0):real^N^N) **
  1.2584 -    ((lambda i j. if i = j then if j = n then c else 1 else 0):real^N^N)`
  1.2585 -  SUBST1_TAC THENL
  1.2586 -   [ALL_TAC;
  1.2587 -    REPEAT(MATCH_MP_TAC(ASSUME `!A B:real^N^N. P A \<and> P B ==> P(A ** B)`) THEN
  1.2588 -           CONJ_TAC) THEN
  1.2589 -    ASM_SIMP_TAC[] THEN FIRST_X_ASSUM(fun th -> MATCH_MP_TAC th THEN
  1.2590 -        MAP_EVERY X_GEN_TAC [`i:num`; `j:num`]) THEN
  1.2591 -    ASM_SIMP_TAC[LAMBDA_BETA]] THEN
  1.2592 -  SIMP_TAC[CART_EQ; matrix_mul; LAMBDA_BETA] THEN
  1.2593 -  X_GEN_TAC `i:num` THEN STRIP_TAC THEN
  1.2594 -  X_GEN_TAC `j:num` THEN STRIP_TAC THEN
  1.2595 -  ASM_SIMP_TAC[SUM_DELTA; IN_NUMSEG; REAL_ARITH
  1.2596 -       `(if p then 1 else 0) * (if q then c else 0) =
  1.2597 -        if q then if p then c else 0 else 0`] THEN
  1.2598 -  REWRITE_TAC[REAL_ARITH
  1.2599 -   `(if p then x else 0) * y = (if p then x * y else 0)`] THEN
  1.2600 -  GEN_REWRITE_TAC (RAND_CONV o ONCE_DEPTH_CONV) [EQ_SYM_EQ] THEN
  1.2601 -  ASM_SIMP_TAC[SUM_DELTA; IN_NUMSEG] THEN
  1.2602 -  ASM_CASES_TAC `i:num = m` THEN ASM_REWRITE_TAC[] THEN
  1.2603 -  ASM_CASES_TAC `j:num = n` THEN ASM_REWRITE_TAC[REAL_MUL_LID; EQ_SYM_EQ] THEN
  1.2604 -  ASM_CASES_TAC `i:num = n` THEN
  1.2605 -  ASM_SIMP_TAC[REAL_MUL_LINV; REAL_MUL_LID; REAL_MUL_RZERO]);; *)
  1.2606 -
  1.2607 -(* ------------------------------------------------------------------------- *)
  1.2608 -(* The same thing in mapping form (might have been easier all along).        *)
  1.2609 -(* ------------------------------------------------------------------------- *)
  1.2610 -
  1.2611 -lemma INDUCT_LINEAR_ELEMENTARY: True .. (*
  1.2612 - "!P. (!f g. linear f \<and> linear g \<and> P f \<and> P g ==> P(f o g)) \<and>
  1.2613 -       (!f i. linear f \<and> 1 \<le> i \<and> i \<le> dimindex(:N) \<and> (!x. (f x)$i = 0)
  1.2614 -              ==> P f) \<and>
  1.2615 -       (!c. P(\<lambda>x. lambda i. c i * x$i)) \<and>
  1.2616 -       (!m n. 1 \<le> m \<and> m \<le> dimindex(:N) \<and>
  1.2617 -              1 \<le> n \<and> n \<le> dimindex(:N) \<and> ~(m = n)
  1.2618 -              ==> P(\<lambda>x. lambda i. x$swap(m,n) i)) \<and>
  1.2619 -       (!m n. 1 \<le> m \<and> m \<le> dimindex(:N) \<and>
  1.2620 -              1 \<le> n \<and> n \<le> dimindex(:N) \<and> ~(m = n)
  1.2621 -              ==> P(\<lambda>x. lambda i. if i = m then x$m + x$n else x$i))
  1.2622 -       ==> !f:real^N->real^N. linear f ==> P f"
  1.2623 -qed   GEN_TAC THEN
  1.2624 -  MP_TAC(ISPEC `\A:real^N^N. P(\<lambda>x:real^N. A ** x):bool`
  1.2625 -    INDUCT_MATRIX_ELEMENTARY_ALT) THEN
  1.2626 -  REWRITE_TAC[] THEN MATCH_MP_TAC MONO_IMP THEN CONJ_TAC THENL
  1.2627 -   [ALL_TAC;
  1.2628 -    DISCH_TAC THEN X_GEN_TAC `f:real^N->real^N` THEN DISCH_TAC THEN
  1.2629 -    FIRST_X_ASSUM(MP_TAC o SPEC `matrix(f:real^N->real^N)`) THEN
  1.2630 -    ASM_SIMP_TAC[MATRIX_WORKS] THEN REWRITE_TAC[ETA_AX]] THEN
  1.2631 -  MATCH_MP_TAC MONO_AND THEN CONJ_TAC THENL
  1.2632 -   [DISCH_TAC THEN MAP_EVERY X_GEN_TAC [`A:real^N^N`; `B:real^N^N`] THEN
  1.2633 -    STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPECL
  1.2634 -     [`\x:real^N. (A:real^N^N) ** x`; `\x:real^N. (B:real^N^N) ** x`]) THEN
  1.2635 -    ASM_REWRITE_TAC[MATRIX_VECTOR_MUL_LINEAR; o_DEF] THEN
  1.2636 -    REWRITE_TAC[MATRIX_VECTOR_MUL_ASSOC];
  1.2637 -    ALL_TAC] THEN
  1.2638 -  MATCH_MP_TAC MONO_AND THEN CONJ_TAC THENL
  1.2639 -   [DISCH_TAC THEN MAP_EVERY X_GEN_TAC [`A:real^N^N`; `m:num`] THEN
  1.2640 -    STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPECL
  1.2641 -     [`\x:real^N. (A:real^N^N) ** x`; `m:num`]) THEN
  1.2642 -    ASM_REWRITE_TAC[MATRIX_VECTOR_MUL_LINEAR] THEN
  1.2643 -    DISCH_THEN MATCH_MP_TAC THEN
  1.2644 -    UNDISCH_TAC `row m (A:real^N^N) = 0` THEN
  1.2645 -    ASM_SIMP_TAC[CART_EQ; row; LAMBDA_BETA; VEC_COMPONENT; matrix_vector_mul;
  1.2646 -                 REAL_MUL_LZERO; SUM_0];
  1.2647 -    ALL_TAC] THEN
  1.2648 -  MATCH_MP_TAC MONO_AND THEN CONJ_TAC THENL
  1.2649 -   [DISCH_TAC THEN X_GEN_TAC `A:real^N^N` THEN STRIP_TAC THEN
  1.2650 -    FIRST_X_ASSUM(MP_TAC o SPEC `\i. (A:real^N^N)$i$i`) THEN
  1.2651 -    MATCH_MP_TAC EQ_IMP THEN AP_TERM_TAC THEN
  1.2652 -    ASM_SIMP_TAC[CART_EQ; matrix_vector_mul; FUN_EQ_THM; LAMBDA_BETA] THEN
  1.2653 -    MAP_EVERY X_GEN_TAC [`x:real^N`; `i:num`] THEN STRIP_TAC THEN
  1.2654 -    MATCH_MP_TAC EQ_TRANS THEN EXISTS_TAC
  1.2655 -     `sum(1..dimindex(:N)) (\<lambda>j. if j = i then (A:real^N^N)$i$j * (x:real^N)$j
  1.2656 -                                else 0)` THEN
  1.2657 -    CONJ_TAC THENL [ASM_SIMP_TAC[SUM_DELTA; IN_NUMSEG]; ALL_TAC] THEN
  1.2658 -    MATCH_MP_TAC SUM_EQ_NUMSEG THEN X_GEN_TAC `j:num` THEN STRIP_TAC THEN
  1.2659 -    ASM_SIMP_TAC[] THEN COND_CASES_TAC THEN ASM_SIMP_TAC[REAL_MUL_LZERO];
  1.2660 -    ALL_TAC] THEN
  1.2661 -  MATCH_MP_TAC MONO_AND THEN CONJ_TAC THEN
  1.2662 -  MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `m:num` THEN
  1.2663 -  MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `n:num` THEN
  1.2664 -  DISCH_THEN(fun th -> STRIP_TAC THEN MP_TAC th) THEN
  1.2665 -  ASM_REWRITE_TAC[] THEN MATCH_MP_TAC EQ_IMP THEN AP_TERM_TAC THEN
  1.2666 -  ASM_SIMP_TAC[CART_EQ; matrix_vector_mul; FUN_EQ_THM; LAMBDA_BETA;
  1.2667 -               mat; IN_DIMINDEX_SWAP]
  1.2668 -  THENL
  1.2669 -   [ONCE_REWRITE_TAC[SWAP_GALOIS] THEN ONCE_REWRITE_TAC[COND_RAND] THEN
  1.2670 -    ONCE_REWRITE_TAC[COND_RATOR] THEN
  1.2671 -    SIMP_TAC[SUM_DELTA; REAL_MUL_LID; REAL_MUL_LZERO; IN_NUMSEG] THEN
  1.2672 -    REPEAT STRIP_TAC THEN REWRITE_TAC[swap] THEN
  1.2673 -    COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN ASM_ARITH_TAC;
  1.2674 -    MAP_EVERY X_GEN_TAC [`x:real^N`; `i:num`] THEN STRIP_TAC THEN
  1.2675 -    ASM_CASES_TAC `i:num = m` THEN ASM_REWRITE_TAC[] THEN
  1.2676 -    ONCE_REWRITE_TAC[COND_RAND] THEN ONCE_REWRITE_TAC[COND_RATOR] THEN
  1.2677 -    GEN_REWRITE_TAC (RAND_CONV o ONCE_DEPTH_CONV) [EQ_SYM_EQ] THEN
  1.2678 -    ASM_SIMP_TAC[SUM_DELTA; REAL_MUL_LZERO; REAL_MUL_LID; IN_NUMSEG] THEN
  1.2679 -    MATCH_MP_TAC EQ_TRANS THEN EXISTS_TAC
  1.2680 -     `sum {m,n} (\<lambda>j. if n = j \/ j = m then (x:real^N)$j else 0)` THEN
  1.2681 -    CONJ_TAC THENL
  1.2682 -     [SIMP_TAC[SUM_CLAUSES; FINITE_RULES; IN_INSERT; NOT_IN_EMPTY] THEN
  1.2683 -      ASM_REWRITE_TAC[REAL_ADD_RID];
  1.2684 -      CONV_TAC SYM_CONV THEN MATCH_MP_TAC SUM_SUPERSET THEN
  1.2685 -      ASM_SIMP_TAC[SUBSET; IN_INSERT; NOT_IN_EMPTY; DE_MORGAN_THM;
  1.2686 -                   IN_NUMSEG; REAL_MUL_LZERO] THEN
  1.2687 -      ASM_ARITH_TAC]]);; *)
  1.2688 -
  1.2689 -(* ------------------------------------------------------------------------- *)
  1.2690 -(* Hence the effect of an arbitrary linear map on a gmeasurable set.          *)
  1.2691 -(* ------------------------------------------------------------------------- *)
  1.2692 -
  1.2693 -lemma LAMBDA_SWAP_GALOIS: True .. (*
  1.2694 - "!x:real^N y:real^N.
  1.2695 -        1 \<le> m \<and> m \<le> dimindex(:N) \<and> 1 \<le> n \<and> n \<le> dimindex(:N)
  1.2696 -        ==> (x = (lambda i. y$swap(m,n) i) \<longleftrightarrow>
  1.2697 -             (lambda i. x$swap(m,n) i) = y)"
  1.2698 -qed   SIMP_TAC[CART_EQ; LAMBDA_BETA; IN_DIMINDEX_SWAP] THEN
  1.2699 -  REPEAT GEN_TAC THEN STRIP_TAC THEN EQ_TAC THEN
  1.2700 -  DISCH_TAC THEN X_GEN_TAC `i:num` THEN STRIP_TAC THEN
  1.2701 -  FIRST_X_ASSUM(MP_TAC o SPEC `swap(m,n) (i:num)`) THEN
  1.2702 -  ASM_SIMP_TAC[IN_DIMINDEX_SWAP] THEN
  1.2703 -  ASM_MESON_TAC[REWRITE_RULE[FUN_EQ_THM; o_THM; I_THM] SWAP_IDEMPOTENT]);; *)
  1.2704 -
  1.2705 -lemma LAMBDA_ADD_GALOIS: True .. (*
  1.2706 - "!x:real^N y:real^N.
  1.2707 -        1 \<le> m \<and> m \<le> dimindex(:N) \<and> 1 \<le> n \<and> n \<le> dimindex(:N) \<and>
  1.2708 -        ~(m = n)
  1.2709 -        ==> (x = (lambda i. if i = m then y$m + y$n else y$i) \<longleftrightarrow>
  1.2710 -             (lambda i. if i = m then x$m - x$n else x$i) = y)"
  1.2711 -qed   SIMP_TAC[CART_EQ; LAMBDA_BETA] THEN
  1.2712 -  REPEAT GEN_TAC THEN STRIP_TAC THEN EQ_TAC THEN
  1.2713 -  DISCH_TAC THEN X_GEN_TAC `i:num` THEN STRIP_TAC THEN
  1.2714 -  FIRST_ASSUM(MP_TAC o SPEC `n:num`) THEN
  1.2715 -  FIRST_X_ASSUM(MP_TAC o SPEC `i:num`) THEN
  1.2716 -  ASM_REWRITE_TAC[] THEN COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
  1.2717 -  REAL_ARITH_TAC);; *)
  1.2718 -
  1.2719 -lemma HAS_GMEASURE_SHEAR_INTERVAL: True .. (*
  1.2720 - "!a b:real^N m n.
  1.2721 -        1 \<le> m \<and> m \<le> dimindex(:N) \<and>
  1.2722 -        1 \<le> n \<and> n \<le> dimindex(:N) \<and>
  1.2723 -        ~(m = n) \<and> ~({a..b} = {}) \<and>
  1.2724 -        0 \<le> a$n
  1.2725 -        ==> (IMAGE (\<lambda>x. (lambda i. if i = m then x$m + x$n else x$i))
  1.2726 -                   {a..b}:real^N->bool)
  1.2727 -            has_gmeasure gmeasure (interval [a,b])"
  1.2728 -qed   lemma lemma = prove
  1.2729 -   (`!s t u v:real^N->bool.
  1.2730 -          gmeasurable s \<and> gmeasurable t \<and> gmeasurable u \<and>
  1.2731 -          negligible(s \<inter> t) \<and> negligible(s \<inter> u) \<and>
  1.2732 -          negligible(t \<inter> u) \<and>
  1.2733 -          s \<union> t \<union> u = v
  1.2734 -          ==> v has_gmeasure (measure s) + (measure t) + (measure u)"
  1.2735 -qed     REPEAT STRIP_TAC THEN
  1.2736 -    ASM_SIMP_TAC[HAS_GMEASURE_MEASURABLE_MEASURE; GMEASURABLE_UNION] THEN
  1.2737 -    FIRST_X_ASSUM(SUBST1_TAC o SYM) THEN
  1.2738 -    ASM_SIMP_TAC[MEASURE_UNION; GMEASURABLE_UNION] THEN
  1.2739 -    ASM_SIMP_TAC[MEASURE_EQ_0; UNION_OVER_INTER; MEASURE_UNION;
  1.2740 -                 GMEASURABLE_UNION; NEGLIGIBLE_INTER; GMEASURABLE_INTER] THEN
  1.2741 -    REAL_ARITH_TAC)
  1.2742 -  and lemma' = prove
  1.2743 -   (`!s t u a.
  1.2744 -          gmeasurable s \<and> gmeasurable t \<and>
  1.2745 -          s \<union> (IMAGE (\<lambda>x. a + x) t) = u \<and>
  1.2746 -          negligible(s \<inter> (IMAGE (\<lambda>x. a + x) t))
  1.2747 -          ==> gmeasure s + gmeasure t = gmeasure u"
  1.2748 -qed     REPEAT STRIP_TAC THEN FIRST_X_ASSUM(SUBST_ALL_TAC o SYM) THEN
  1.2749 -    ASM_SIMP_TAC[MEASURE_NEGLIGIBLE_UNION; GMEASURABLE_TRANSLATION;
  1.2750 -                 MEASURE_TRANSLATION]) in
  1.2751 -  REWRITE_TAC[INTERVAL_NE_EMPTY] THEN REPEAT STRIP_TAC THEN
  1.2752 -  SUBGOAL_THEN
  1.2753 -   `linear((\<lambda>x. lambda i. if i = m then x$m + x$n else x$i):real^N->real^N)`
  1.2754 -  ASSUME_TAC THENL
  1.2755 -   [ASM_SIMP_TAC[linear; LAMBDA_BETA; VECTOR_ADD_COMPONENT;
  1.2756 -                 VECTOR_MUL_COMPONENT; CART_EQ] THEN REAL_ARITH_TAC;
  1.2757 -    ALL_TAC] THEN
  1.2758 -  MP_TAC(ISPECL
  1.2759 -   [`IMAGE (\<lambda>x. lambda i. if i = m then x$m + x$n else x$i)
  1.2760 -            (interval[a:real^N,b]):real^N->bool`;
  1.2761 -    `interval[a,(lambda i. if i = m then (b:real^N)$m + b$n else b$i)] INTER
  1.2762 -       {x:real^N | (basis m - basis n) dot x \<le> a$m}`;
  1.2763 -    `interval[a,(lambda i. if i = m then b$m + b$n else b$i)] INTER
  1.2764 -       {x:real^N | (basis m - basis n) dot x >= (b:real^N)$m}`;
  1.2765 -    `interval[a:real^N,
  1.2766 -              (lambda i. if i = m then (b:real^N)$m + b$n else b$i)]`]
  1.2767 -     lemma) THEN
  1.2768 -  ANTS_TAC THENL
  1.2769 -   [ASM_SIMP_TAC[CONVEX_LINEAR_IMAGE; CONVEX_INTERVAL;
  1.2770 -                 CONVEX_HALFSPACE_LE; CONVEX_HALFSPACE_GE;
  1.2771 -                 CONVEX_INTER; GMEASURABLE_CONVEX; BOUNDED_INTER;
  1.2772 -                 BOUNDED_LINEAR_IMAGE; BOUNDED_INTERVAL] THEN
  1.2773 -    REWRITE_TAC[INTER] THEN
  1.2774 -    REWRITE_TAC[EXTENSION; IN_UNION; IN_INTER; IN_IMAGE] THEN
  1.2775 -    ASM_SIMP_TAC[LAMBDA_ADD_GALOIS; UNWIND_THM1] THEN
  1.2776 -    ASM_SIMP_TAC[IN_INTERVAL; IN_ELIM_THM; LAMBDA_BETA;
  1.2777 -                 DOT_BASIS; DOT_LSUB] THEN
  1.2778 -    ONCE_REWRITE_TAC[MESON[]
  1.2779 -       `(!i:num. P i) \<longleftrightarrow> P m \<and> (!i. ~(i = m) ==> P i)`] THEN
  1.2780 -    ASM_SIMP_TAC[] THEN
  1.2781 -    REWRITE_TAC[TAUT `(p \<and> x) \<and> (q \<and> x) \<and> r \<longleftrightarrow> x \<and> p \<and> q \<and> r`;
  1.2782 -                TAUT `(p \<and> x) \<and> q \<and> (r \<and> x) \<longleftrightarrow> x \<and> p \<and> q \<and> r`;
  1.2783 -                TAUT `((p \<and> x) \<and> q) \<and> (r \<and> x) \<and> s \<longleftrightarrow>
  1.2784 -                            x \<and> p \<and> q \<and> r \<and> s`;
  1.2785 -            TAUT `(a \<and> x \/ (b \<and> x) \<and> c \/ (d \<and> x) \<and> e \<longleftrightarrow> f \<and> x) \<longleftrightarrow>
  1.2786 -                  x ==> (a \/ b \<and> c \/ d \<and> e \<longleftrightarrow> f)`] THEN
  1.2787 -    ONCE_REWRITE_TAC[SET_RULE
  1.2788 -     `{x | P x \<and> Q x} = {x | P x} \<inter> {x | Q x}`] THEN
  1.2789 -    REWRITE_TAC[CONJ_ASSOC] THEN CONJ_TAC THENL
  1.2790 -     [ALL_TAC;
  1.2791 -      GEN_TAC THEN DISCH_THEN(MP_TAC o SPEC `n:num`) THEN
  1.2792 -      ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC] THEN
  1.2793 -    REWRITE_TAC[GSYM CONJ_ASSOC] THEN REPEAT CONJ_TAC THEN
  1.2794 -    MATCH_MP_TAC NEGLIGIBLE_INTER THEN DISJ2_TAC THEN
  1.2795 -    MATCH_MP_TAC NEGLIGIBLE_SUBSET THENL
  1.2796 -     [EXISTS_TAC `{x:real^N | (basis m - basis n) dot x = (a:real^N)$m}`;
  1.2797 -      EXISTS_TAC `{x:real^N | (basis m - basis n) dot x = (b:real^N)$m}`;
  1.2798 -      EXISTS_TAC `{x:real^N | (basis m - basis n) dot x = (b:real^N)$m}`]
  1.2799 -    THEN (CONJ_TAC THENL
  1.2800 -      [MATCH_MP_TAC NEGLIGIBLE_HYPERPLANE THEN
  1.2801 -       REWRITE_TAC[VECTOR_SUB_EQ] THEN
  1.2802 -       ASM_MESON_TAC[BASIS_INJ];
  1.2803 -       ASM_SIMP_TAC[DOT_LSUB; DOT_BASIS; SUBSET; IN_ELIM_THM;
  1.2804 -                    NOT_IN_EMPTY] THEN
  1.2805 -       FIRST_X_ASSUM(MP_TAC o SPEC `m:num`) THEN ASM_REWRITE_TAC[] THEN
  1.2806 -       ASM_REAL_ARITH_TAC]);
  1.2807 -    ALL_TAC] THEN
  1.2808 -  ASM_SIMP_TAC[HAS_GMEASURE_MEASURABLE_MEASURE;
  1.2809 -               GMEASURABLE_LINEAR_IMAGE_INTERVAL;
  1.2810 -               GMEASURABLE_INTERVAL] THEN
  1.2811 -  MP_TAC(ISPECL
  1.2812 -   [`interval[a,(lambda i. if i = m then (b:real^N)$m + b$n else b$i)] INTER
  1.2813 -       {x:real^N | (basis m - basis n) dot x \<le> a$m}`;
  1.2814 -    `interval[a,(lambda i. if i = m then b$m + b$n else b$i)] INTER
  1.2815 -       {x:real^N | (basis m - basis n) dot x >= (b:real^N)$m}`;
  1.2816 -    `interval[a:real^N,
  1.2817 -              (lambda i. if i = m then (a:real^N)$m + b$n
  1.2818 -                         else (b:real^N)$i)]`;
  1.2819 -    `(lambda i. if i = m then (a:real^N)$m - (b:real^N)$m
  1.2820 -                else 0):real^N`]
  1.2821 -     lemma') THEN
  1.2822 -  ANTS_TAC THENL
  1.2823 -   [ASM_SIMP_TAC[CONVEX_LINEAR_IMAGE; CONVEX_INTERVAL;
  1.2824 -                 CONVEX_HALFSPACE_LE; CONVEX_HALFSPACE_GE;
  1.2825 -                 CONVEX_INTER; GMEASURABLE_CONVEX; BOUNDED_INTER;
  1.2826 -                 BOUNDED_LINEAR_IMAGE; BOUNDED_INTERVAL] THEN
  1.2827 -    REWRITE_TAC[INTER] THEN
  1.2828 -    REWRITE_TAC[EXTENSION; IN_UNION; IN_INTER; IN_IMAGE] THEN
  1.2829 -    ONCE_REWRITE_TAC[VECTOR_ARITH `x:real^N = (lambda i. p i) + y \<longleftrightarrow>
  1.2830 -                                   x - (lambda i. p i) = y`] THEN
  1.2831 -    ASM_SIMP_TAC[IN_INTERVAL; IN_ELIM_THM; LAMBDA_BETA;
  1.2832 -                 DOT_BASIS; DOT_LSUB; UNWIND_THM1;
  1.2833 -                 VECTOR_SUB_COMPONENT] THEN
  1.2834 -    ONCE_REWRITE_TAC[MESON[]
  1.2835 -       `(!i:num. P i) \<longleftrightarrow> P m \<and> (!i. ~(i = m) ==> P i)`] THEN
  1.2836 -    ASM_SIMP_TAC[REAL_SUB_RZERO] THEN CONJ_TAC THENL
  1.2837 -     [X_GEN_TAC `x:real^N` THEN
  1.2838 -      FIRST_ASSUM(MP_TAC o SPEC `n:num`) THEN
  1.2839 -      FIRST_X_ASSUM(MP_TAC o SPEC `m:num`) THEN
  1.2840 -      ASM_REWRITE_TAC[] THEN
  1.2841 -      ASM_CASES_TAC
  1.2842 -       `!i. ~(i = m)
  1.2843 -            ==> 1 \<le> i \<and> i \<le> dimindex (:N)
  1.2844 -                ==> (a:real^N)$i \<le> (x:real^N)$i \<and>
  1.2845 -                    x$i \<le> (b:real^N)$i` THEN
  1.2846 -      ASM_REWRITE_TAC[] THEN
  1.2847 -      FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN
  1.2848 -      ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC;
  1.2849 -      ONCE_REWRITE_TAC[TAUT `((a \<and> b) \<and> c) \<and> (d \<and> e) \<and> f \<longleftrightarrow>
  1.2850 -                             (b \<and> e) \<and> a \<and> c \<and> d \<and> f`] THEN
  1.2851 -      ONCE_REWRITE_TAC[SET_RULE
  1.2852 -       `{x | P x \<and> Q x} = {x | P x} \<inter> {x | Q x}`] THEN
  1.2853 -      MATCH_MP_TAC NEGLIGIBLE_INTER THEN DISJ2_TAC THEN
  1.2854 -      MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
  1.2855 -      EXISTS_TAC `{x:real^N | (basis m - basis n) dot x = (a:real^N)$m}`
  1.2856 -      THEN CONJ_TAC THENL
  1.2857 -       [MATCH_MP_TAC NEGLIGIBLE_HYPERPLANE THEN
  1.2858 -        REWRITE_TAC[VECTOR_SUB_EQ] THEN
  1.2859 -        ASM_MESON_TAC[BASIS_INJ];
  1.2860 -        ASM_SIMP_TAC[DOT_LSUB; DOT_BASIS; SUBSET; IN_ELIM_THM;
  1.2861 -                     NOT_IN_EMPTY] THEN
  1.2862 -        FIRST_ASSUM(MP_TAC o SPEC `n:num`) THEN
  1.2863 -        FIRST_X_ASSUM(MP_TAC o SPEC `m:num`) THEN
  1.2864 -        ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC]];
  1.2865 -    ALL_TAC] THEN
  1.2866 -  DISCH_THEN SUBST1_TAC THEN MATCH_MP_TAC(REAL_ARITH
  1.2867 -   `a = b + c ==> a = x + b ==> x = c`) THEN
  1.2868 -  ASM_SIMP_TAC[MEASURE_INTERVAL; CONTENT_CLOSED_INTERVAL_CASES;
  1.2869 -               LAMBDA_BETA] THEN
  1.2870 -  REPEAT(COND_CASES_TAC THENL
  1.2871 -   [ALL_TAC;
  1.2872 -    FIRST_X_ASSUM(MP_TAC o check (is_neg o concl)) THEN
  1.2873 -    MATCH_MP_TAC(TAUT `p ==> ~p ==> q`) THEN
  1.2874 -    X_GEN_TAC `i:num` THEN STRIP_TAC THEN
  1.2875 -    COND_CASES_TAC THEN ASM_SIMP_TAC[] THEN
  1.2876 -    FIRST_ASSUM(MP_TAC o SPEC `n:num`) THEN
  1.2877 -    FIRST_X_ASSUM(MP_TAC o SPEC `m:num`) THEN
  1.2878 -    ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC]) THEN
  1.2879 -  SUBGOAL_THEN `1..dimindex(:N) = m INSERT ((1..dimindex(:N)) DELETE m)`
  1.2880 -  SUBST1_TAC THENL
  1.2881 -   [REWRITE_TAC[EXTENSION; IN_INSERT; IN_DELETE; IN_NUMSEG] THEN
  1.2882 -    ASM_ARITH_TAC;
  1.2883 -    ALL_TAC] THEN
  1.2884 -  SIMP_TAC[PRODUCT_CLAUSES; FINITE_DELETE; FINITE_NUMSEG] THEN
  1.2885 -  ASM_SIMP_TAC[IN_DELETE] THEN
  1.2886 -  MATCH_MP_TAC(REAL_RING
  1.2887 -   `s1 = s3 \<and> s2 = s3
  1.2888 -    ==> ((bm + bn) - am) * s1 =
  1.2889 -        ((am + bn) - am) * s2 + (bm - am) * s3`) THEN
  1.2890 -  CONJ_TAC THEN MATCH_MP_TAC PRODUCT_EQ THEN
  1.2891 -  SIMP_TAC[IN_DELETE] THEN REAL_ARITH_TAC);; *)
  1.2892 -
  1.2893 -lemma HAS_GMEASURE_LINEAR_IMAGE: True .. (*
  1.2894 - "!f:real^N->real^N s.
  1.2895 -        linear f \<and> gmeasurable s
  1.2896 -        ==> (IMAGE f s) has_gmeasure (abs(det(matrix f)) * gmeasure s)"
  1.2897 -qed   REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN
  1.2898 -  MATCH_MP_TAC INDUCT_LINEAR_ELEMENTARY THEN REPEAT CONJ_TAC THENL
  1.2899 -   [MAP_EVERY X_GEN_TAC [`f:real^N->real^N`; `g:real^N->real^N`] THEN
  1.2900 -    REPLICATE_TAC 2 (DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
  1.2901 -    DISCH_THEN(fun th -> REPEAT STRIP_TAC THEN MP_TAC th) THEN
  1.2902 -    DISCH_THEN(CONJUNCTS_THEN2
  1.2903 -     (MP_TAC o SPEC `IMAGE (g:real^N->real^N) s`)
  1.2904 -     (MP_TAC o SPEC `s:real^N->bool`)) THEN
  1.2905 -    ASM_REWRITE_TAC[] THEN
  1.2906 -    GEN_REWRITE_TAC LAND_CONV [HAS_GMEASURE_MEASURABLE_MEASURE] THEN
  1.2907 -    STRIP_TAC THEN ASM_SIMP_TAC[MATRIX_COMPOSE; DET_MUL; REAL_ABS_MUL] THEN
  1.2908 -    REWRITE_TAC[IMAGE_o; GSYM REAL_MUL_ASSOC];
  1.2909 -
  1.2910 -    MAP_EVERY X_GEN_TAC [`f:real^N->real^N`; `m:num`] THEN STRIP_TAC THEN
  1.2911 -    SUBGOAL_THEN `~(!x y. (f:real^N->real^N) x = f y ==> x = y)`
  1.2912 -    ASSUME_TAC THENL
  1.2913 -     [ASM_SIMP_TAC[LINEAR_SINGULAR_INTO_HYPERPLANE] THEN
  1.2914 -      EXISTS_TAC `basis m:real^N` THEN
  1.2915 -      ASM_SIMP_TAC[BASIS_NONZERO; DOT_BASIS];
  1.2916 -      ALL_TAC] THEN
  1.2917 -    MP_TAC(ISPEC `matrix f:real^N^N` INVERTIBLE_DET_NZ) THEN
  1.2918 -    ASM_SIMP_TAC[INVERTIBLE_LEFT_INVERSE; MATRIX_LEFT_INVERTIBLE_INJECTIVE;
  1.2919 -                 MATRIX_WORKS; REAL_ABS_NUM; REAL_MUL_LZERO] THEN
  1.2920 -    DISCH_THEN(K ALL_TAC) THEN REWRITE_TAC[HAS_GMEASURE_0] THEN
  1.2921 -    ASM_SIMP_TAC[NEGLIGIBLE_LINEAR_SINGULAR_IMAGE];
  1.2922 -
  1.2923 -    MAP_EVERY X_GEN_TAC [`c:num->real`; `s:real^N->bool`] THEN
  1.2924 -    DISCH_TAC THEN
  1.2925 -    FIRST_ASSUM(ASSUME_TAC o REWRITE_RULE[HAS_GMEASURE_MEASURE]) THEN
  1.2926 -    FIRST_ASSUM(MP_TAC o SPEC `c:num->real` o
  1.2927 -     MATCH_MP HAS_GMEASURE_STRETCH) THEN
  1.2928 -    MATCH_MP_TAC EQ_IMP THEN AP_TERM_TAC THEN
  1.2929 -    AP_THM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN
  1.2930 -    SIMP_TAC[matrix; LAMBDA_BETA] THEN
  1.2931 -    W(MP_TAC o PART_MATCH (lhs o rand) DET_DIAGONAL o rand o snd) THEN
  1.2932 -    SIMP_TAC[LAMBDA_BETA; BASIS_COMPONENT; REAL_MUL_RZERO] THEN
  1.2933 -    DISCH_THEN(K ALL_TAC) THEN MATCH_MP_TAC PRODUCT_EQ_NUMSEG THEN
  1.2934 -    REWRITE_TAC[REAL_MUL_RID];
  1.2935 -
  1.2936 -    MAP_EVERY X_GEN_TAC [`m:num`; `n:num`] THEN STRIP_TAC THEN
  1.2937 -    MATCH_MP_TAC HAS_GMEASURE_LINEAR_SUFFICIENT THEN
  1.2938 -    ASM_SIMP_TAC[linear; LAMBDA_BETA; IN_DIMINDEX_SWAP; VECTOR_ADD_COMPONENT;
  1.2939 -                 VECTOR_MUL_COMPONENT; CART_EQ] THEN
  1.2940 -    MAP_EVERY X_GEN_TAC [`a:real^N`; `b:real^N`] THEN
  1.2941 -    SUBGOAL_THEN `matrix (\<lambda>x:real^N. lambda i. x$swap (m,n) i):real^N^N =
  1.2942 -                  transp(lambda i j. (mat 1:real^N^N)$i$swap (m,n) j)`
  1.2943 -    SUBST1_TAC THENL
  1.2944 -     [ASM_SIMP_TAC[MATRIX_EQ; LAMBDA_BETA; IN_DIMINDEX_SWAP;
  1.2945 -                    matrix_vector_mul; CART_EQ; matrix; mat; basis;
  1.2946 -                    COND_COMPONENT; transp] THEN
  1.2947 -      REWRITE_TAC[EQ_SYM_EQ];
  1.2948 -      ALL_TAC] THEN
  1.2949 -    REWRITE_TAC[DET_TRANSP] THEN
  1.2950 -    W(MP_TAC o PART_MATCH (lhs o rand) DET_PERMUTE_COLUMNS o
  1.2951 -        rand o lhand o rand o snd) THEN
  1.2952 -    ASM_SIMP_TAC[PERMUTES_SWAP; IN_NUMSEG; ETA_AX] THEN
  1.2953 -    DISCH_THEN(K ALL_TAC) THEN
  1.2954 -    REWRITE_TAC[DET_I; REAL_ABS_SIGN; REAL_MUL_RID; REAL_MUL_LID] THEN
  1.2955 -    ASM_CASES_TAC `interval[a:real^N,b] = {}` THENL
  1.2956 -     [ASM_SIMP_TAC[IMAGE_CLAUSES; HAS_GMEASURE_EMPTY; MEASURE_EMPTY];
  1.2957 -      ALL_TAC] THEN
  1.2958 -    SUBGOAL_THEN
  1.2959 -     `~(IMAGE (\<lambda>x:real^N. lambda i. x$swap (m,n) i)
  1.2960 -              {a..b}:real^N->bool = {})`
  1.2961 -    MP_TAC THENL [ASM_REWRITE_TAC[IMAGE_EQ_EMPTY]; ALL_TAC] THEN
  1.2962 -    SUBGOAL_THEN
  1.2963 -     `IMAGE (\<lambda>x:real^N. lambda i. x$swap (m,n) i)
  1.2964 -              {a..b}:real^N->bool =
  1.2965 -      interval[(lambda i. a$swap (m,n) i),
  1.2966 -               (lambda i. b$swap (m,n) i)]`
  1.2967 -    SUBST1_TAC THENL
  1.2968 -     [REWRITE_TAC[EXTENSION; IN_INTERVAL; IN_IMAGE] THEN
  1.2969 -      ASM_SIMP_TAC[LAMBDA_SWAP_GALOIS; UNWIND_THM1] THEN
  1.2970 -      SIMP_TAC[LAMBDA_BETA] THEN GEN_TAC THEN EQ_TAC THEN
  1.2971 -      DISCH_TAC THEN X_GEN_TAC `i:num` THEN STRIP_TAC THEN
  1.2972 -      FIRST_X_ASSUM(MP_TAC o SPEC `swap(m,n) (i:num)`) THEN
  1.2973 -      ASM_SIMP_TAC[IN_DIMINDEX_SWAP] THEN
  1.2974 -      ASM_MESON_TAC[REWRITE_RULE[FUN_EQ_THM; o_THM; I_THM] SWAP_IDEMPOTENT];
  1.2975 -      ALL_TAC] THEN
  1.2976 -    REWRITE_TAC[HAS_GMEASURE_MEASURABLE_MEASURE; GMEASURABLE_INTERVAL] THEN
  1.2977 -    REWRITE_TAC[MEASURE_INTERVAL] THEN
  1.2978 -    ASM_SIMP_TAC[CONTENT_CLOSED_INTERVAL; GSYM INTERVAL_NE_EMPTY] THEN
  1.2979 -    DISCH_THEN(K ALL_TAC) THEN SIMP_TAC[LAMBDA_BETA] THEN
  1.2980 -    ASM_SIMP_TAC[GSYM VECTOR_SUB_COMPONENT; IN_DIMINDEX_SWAP] THEN
  1.2981 -    MP_TAC(ISPECL [`\i. (b - a:real^N)$i`; `swap(m:num,n)`; `1..dimindex(:N)`]
  1.2982 -                (GSYM PRODUCT_PERMUTE)) THEN
  1.2983 -    REWRITE_TAC[o_DEF] THEN DISCH_THEN MATCH_MP_TAC THEN
  1.2984 -    ASM_SIMP_TAC[PERMUTES_SWAP; IN_NUMSEG];
  1.2985 -
  1.2986 -    MAP_EVERY X_GEN_TAC [`m:num`; `n:num`] THEN STRIP_TAC THEN
  1.2987 -    MATCH_MP_TAC HAS_GMEASURE_LINEAR_SUFFICIENT THEN
  1.2988 -    MATCH_MP_TAC(TAUT `a \<and> (a ==> b) ==> a \<and> b`) THEN CONJ_TAC THENL
  1.2989 -     [ASM_SIMP_TAC[linear; LAMBDA_BETA; VECTOR_ADD_COMPONENT;
  1.2990 -                   VECTOR_MUL_COMPONENT; CART_EQ] THEN REAL_ARITH_TAC;
  1.2991 -      DISCH_TAC] THEN
  1.2992 -    MAP_EVERY X_GEN_TAC [`a:real^N`; `b:real^N`] THEN
  1.2993 -    SUBGOAL_THEN
  1.2994 -      `det(matrix(\<lambda>x. lambda i. if i = m then (x:real^N)$m + x$n
  1.2995 -                                else x$i):real^N^N) = 1`
  1.2996 -    SUBST1_TAC THENL
  1.2997 -     [ASM_SIMP_TAC[matrix; basis; COND_COMPONENT; LAMBDA_BETA] THEN
  1.2998 -      FIRST_ASSUM(DISJ_CASES_TAC o MATCH_MP (ARITH_RULE
  1.2999 -       `~(m:num = n) ==> m < n \/ n < m`))
  1.3000 -      THENL
  1.3001 -       [W(MP_TAC o PART_MATCH (lhs o rand) DET_UPPERTRIANGULAR o lhs o snd);
  1.3002 -        W(MP_TAC o PART_MATCH (lhs o rand) DET_LOWERTRIANGULAR o lhs o snd)]
  1.3003 -      THEN ASM_SIMP_TAC[LAMBDA_BETA; BASIS_COMPONENT; COND_COMPONENT;
  1.3004 -                        matrix; REAL_ADD_RID; COND_ID;
  1.3005 -                        PRODUCT_CONST_NUMSEG; REAL_POW_ONE] THEN
  1.3006 -      DISCH_THEN MATCH_MP_TAC THEN
  1.3007 -      REPEAT GEN_TAC THEN REPEAT(COND_CASES_TAC THEN ASM_REWRITE_TAC[]) THEN
  1.3008 -      ASM_ARITH_TAC;
  1.3009 -      ALL_TAC] THEN
  1.3010 -    REWRITE_TAC[REAL_ABS_NUM; REAL_MUL_LID] THEN
  1.3011 -    ASM_CASES_TAC `interval[a:real^N,b] = {}` THENL
  1.3012 -     [ASM_SIMP_TAC[IMAGE_CLAUSES; HAS_GMEASURE_EMPTY; MEASURE_EMPTY];
  1.3013 -      ALL_TAC] THEN
  1.3014 -    SUBGOAL_THEN
  1.3015 -     `IMAGE (\<lambda>x. lambda i. if i = m then x$m + x$n else x$i) (interval [a,b]) =
  1.3016 -      IMAGE (\<lambda>x:real^N. (lambda i. if i = m \/ i = n then a$n else 0) +
  1.3017 -                        x)
  1.3018 -            (IMAGE (\<lambda>x:real^N. lambda i. if i = m then x$m + x$n else x$i)
  1.3019 -                   (IMAGE (\<lambda>x. (lambda i. if i = n then --(a$n) else 0) + x)
  1.3020 -                          {a..b}))`
  1.3021 -    SUBST1_TAC THENL
  1.3022 -     [REWRITE_TAC[GSYM IMAGE_o] THEN AP_THM_TAC THEN AP_TERM_TAC THEN
  1.3023 -      ASM_SIMP_TAC[FUN_EQ_THM; o_THM; VECTOR_ADD_COMPONENT; LAMBDA_BETA;
  1.3024 -                   CART_EQ] THEN
  1.3025 -      MAP_EVERY X_GEN_TAC [`x:real^N`; `i:num`] THEN
  1.3026 -      STRIP_TAC THEN ASM_CASES_TAC `i:num = m` THEN ASM_REWRITE_TAC[] THEN
  1.3027 -      ASM_CASES_TAC `i:num = n` THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC;
  1.3028 -      ALL_TAC] THEN
  1.3029 -    MATCH_MP_TAC HAS_GMEASURE_TRANSLATION THEN
  1.3030 -    SUBGOAL_THEN
  1.3031 -     `measure{a..b} =
  1.3032 -      measure(IMAGE (\<lambda>x:real^N. (lambda i. if i = n then --(a$n) else 0) + x)
  1.3033 -                    {a..b}:real^N->bool)`
  1.3034 -    SUBST1_TAC THENL
  1.3035 -     [CONV_TAC SYM_CONV THEN MATCH_MP_TAC MEASURE_TRANSLATION THEN
  1.3036 -      REWRITE_TAC[MEASURABLE_INTERVAL];
  1.3037 -      ALL_TAC] THEN
  1.3038 -    SUBGOAL_THEN
  1.3039 -     `~(IMAGE (\<lambda>x:real^N. (lambda i. if i = n then --(a$n) else 0) + x)
  1.3040 -                    {a..b}:real^N->bool = {})`
  1.3041 -    MP_TAC THENL [ASM_SIMP_TAC[IMAGE_EQ_EMPTY]; ALL_TAC] THEN
  1.3042 -    ONCE_REWRITE_TAC[VECTOR_ARITH `c + x = 1 % x + c`] THEN
  1.3043 -    ASM_REWRITE_TAC[IMAGE_AFFINITY_INTERVAL; REAL_POS] THEN
  1.3044 -    DISCH_TAC THEN MATCH_MP_TAC HAS_GMEASURE_SHEAR_INTERVAL THEN
  1.3045 -    ASM_SIMP_TAC[LAMBDA_BETA; VECTOR_ADD_COMPONENT; VECTOR_MUL_COMPONENT] THEN
  1.3046 -    REAL_ARITH_TAC]);; *)
  1.3047 -
  1.3048 -lemma GMEASURABLE_LINEAR_IMAGE: True .. (*
  1.3049 - "!f:real^N->real^N s.
  1.3050 -        linear f \<and> gmeasurable s ==> gmeasurable(IMAGE f s)"
  1.3051 -qed   REPEAT GEN_TAC THEN
  1.3052 -  DISCH_THEN(MP_TAC o MATCH_MP HAS_GMEASURE_LINEAR_IMAGE) THEN
  1.3053 -  SIMP_TAC[HAS_GMEASURE_MEASURABLE_MEASURE]);; *)
  1.3054 -
  1.3055 -lemma MEASURE_LINEAR_IMAGE: True .. (*
  1.3056 - "!f:real^N->real^N s.
  1.3057 -        linear f \<and> gmeasurable s
  1.3058 -        ==> measure(IMAGE f s) = abs(det(matrix f)) * gmeasure s"
  1.3059 -qed   REPEAT GEN_TAC THEN
  1.3060 -  DISCH_THEN(MP_TAC o MATCH_MP HAS_GMEASURE_LINEAR_IMAGE) THEN
  1.3061 -  SIMP_TAC[HAS_GMEASURE_MEASURABLE_MEASURE]);; *)
  1.3062 -
  1.3063 -lemma HAS_GMEASURE_LINEAR_IMAGE_SAME: True .. (*
  1.3064 - "!f s. linear f \<and> gmeasurable s \<and> abs(det(matrix f)) = 1
  1.3065 -         ==> (IMAGE f s) has_gmeasure (measure s)"
  1.3066 -qed   MESON_TAC[HAS_GMEASURE_LINEAR_IMAGE; REAL_MUL_LID]);; *)
  1.3067 -
  1.3068 -lemma MEASURE_LINEAR_IMAGE_SAME: True .. (*
  1.3069 - "!f:real^N->real^N s.
  1.3070 -        linear f \<and> gmeasurable s \<and> abs(det(matrix f)) = 1
  1.3071 -        ==> measure(IMAGE f s) = gmeasure s"
  1.3072 -qed   REPEAT GEN_TAC THEN
  1.3073 -  DISCH_THEN(MP_TAC o MATCH_MP HAS_GMEASURE_LINEAR_IMAGE_SAME) THEN
  1.3074 -  SIMP_TAC[HAS_GMEASURE_MEASURABLE_MEASURE]);; *)
  1.3075 -
  1.3076 -(* ------------------------------------------------------------------------- *)
  1.3077 -(* gmeasure of a standard simplex.                                            *)
  1.3078 -(* ------------------------------------------------------------------------- *)
  1.3079 -
  1.3080 -lemma CONGRUENT_IMAGE_STD_SIMPLEX: True .. (*
  1.3081 - "!p. p permutes 1..dimindex(:N)
  1.3082 -       ==> {x:real^N | 0 \<le> x$(p 1) \<and> x$(p(dimindex(:N))) \<le> 1 \<and>
  1.3083 -                       (!i. 1 \<le> i \<and> i < dimindex(:N)
  1.3084 -                            ==> x$(p i) \<le> x$(p(i + 1)))} =
  1.3085 -           IMAGE (\<lambda>x:real^N. lambda i. sum(1..inverse p(i)) (\<lambda>j. x$j))
  1.3086 -                 {x | (!i. 1 \<le> i \<and> i \<le> dimindex (:N) ==> 0 \<le> x$i) \<and>
  1.3087 -                      sum (1..dimindex (:N)) (\<lambda>i. x$i) \<le> 1}"
  1.3088 -qed   REPEAT STRIP_TAC THEN MATCH_MP_TAC SUBSET_ANTISYM THEN CONJ_TAC THENL
  1.3089 -   [ALL_TAC;
  1.3090 -    REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN X_GEN_TAC `x:real^N` THEN
  1.3091 -    ASM_SIMP_TAC[IN_ELIM_THM; LAMBDA_BETA; LAMBDA_BETA_PERM; LE_REFL;
  1.3092 -                 ARITH_RULE `i < n ==> i \<le> n \<and> i + 1 \<le> n`;
  1.3093 -                 ARITH_RULE `1 \<le> n + 1`; DIMINDEX_GE_1] THEN
  1.3094 -    STRIP_TAC THEN
  1.3095 -    FIRST_ASSUM(fun th -> REWRITE_TAC[MATCH_MP PERMUTES_INVERSES th]) THEN
  1.3096 -    ASM_SIMP_TAC[SUM_SING_NUMSEG; DIMINDEX_GE_1; LE_REFL] THEN
  1.3097 -    REWRITE_TAC[GSYM ADD1; SUM_CLAUSES_NUMSEG; ARITH_RULE `1 \<le> SUC n`] THEN
  1.3098 -    ASM_SIMP_TAC[REAL_LE_ADDR] THEN REPEAT STRIP_TAC THEN
  1.3099 -    FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC] THEN
  1.3100 -  REWRITE_TAC[SUBSET; IN_IMAGE; IN_ELIM_THM] THEN X_GEN_TAC `x:real^N` THEN
  1.3101 -  STRIP_TAC THEN
  1.3102 -  EXISTS_TAC `(lambda i. if i = 1 then x$(p 1)
  1.3103 -                         else (x:real^N)$p(i) - x$p(i - 1)):real^N` THEN
  1.3104 -  ASM_SIMP_TAC[IN_ELIM_THM; LAMBDA_BETA; LAMBDA_BETA_PERM; LE_REFL;
  1.3105 -               ARITH_RULE `i < n ==> i \<le> n \<and> i + 1 \<le> n`;
  1.3106 -               ARITH_RULE `1 \<le> n + 1`; DIMINDEX_GE_1; CART_EQ] THEN
  1.3107 -  REPEAT CONJ_TAC THENL
  1.3108 -   [X_GEN_TAC `i:num` THEN STRIP_TAC THEN
  1.3109 -    SUBGOAL_THEN `1 \<le> inverse (p:num->num) i \<and>
  1.3110 -                  !x. x \<le> inverse p i ==> x \<le> dimindex(:N)`
  1.3111 -    ASSUME_TAC THENL
  1.3112 -     [ASM_MESON_TAC[PERMUTES_INVERSE; IN_NUMSEG; LE_TRANS; PERMUTES_IN_IMAGE];
  1.3113 -      ASM_SIMP_TAC[LAMBDA_BETA] THEN ASM_SIMP_TAC[SUM_CLAUSES_LEFT; ARITH]] THEN
  1.3114 -    SIMP_TAC[ARITH_RULE `2 \<le> n ==> ~(n = 1)`] THEN
  1.3115 -    GEN_REWRITE_TAC (RAND_CONV o RAND_CONV o BINDER_CONV)
  1.3116 -                [GSYM REAL_MUL_LID] THEN
  1.3117 -    ONCE_REWRITE_TAC[SUM_PARTIAL_PRE] THEN
  1.3118 -    REWRITE_TAC[REAL_SUB_REFL; REAL_MUL_RZERO; SUM_0; COND_ID] THEN
  1.3119 -    REWRITE_TAC[REAL_MUL_LID; ARITH; REAL_SUB_RZERO] THEN
  1.3120 -    FIRST_ASSUM(DISJ_CASES_TAC o MATCH_MP (ARITH_RULE
  1.3121 -     `1 \<le> p ==> p = 1 \/ 2 \<le> p`) o CONJUNCT1) THEN
  1.3122 -    ASM_SIMP_TAC[ARITH] THEN
  1.3123 -    FIRST_ASSUM(fun th -> REWRITE_TAC[MATCH_MP PERMUTES_INVERSES th]) THEN
  1.3124 -    REWRITE_TAC[REAL_ADD_RID] THEN TRY REAL_ARITH_TAC THEN
  1.3125 -    ASM_MESON_TAC[PERMUTES_INVERSE_EQ; PERMUTES_INVERSE];
  1.3126 -
  1.3127 -    X_GEN_TAC `i:num` THEN STRIP_TAC THEN COND_CASES_TAC THEN
  1.3128 -    ASM_REWRITE_TAC[REAL_SUB_LE] THEN
  1.3129 -    FIRST_X_ASSUM(MP_TAC o SPEC `i - 1`) THEN
  1.3130 -    ASM_SIMP_TAC[SUB_ADD] THEN DISCH_THEN MATCH_MP_TAC THEN ASM_ARITH_TAC;
  1.3131 -
  1.3132 -    SIMP_TAC[SUM_CLAUSES_LEFT; DIMINDEX_GE_1; ARITH;
  1.3133 -             ARITH_RULE `2 \<le> n ==> ~(n = 1)`] THEN
  1.3134 -    GEN_REWRITE_TAC (LAND_CONV o RAND_CONV o RAND_CONV o BINDER_CONV)
  1.3135 -                [GSYM REAL_MUL_LID] THEN
  1.3136 -    ONCE_REWRITE_TAC[SUM_PARTIAL_PRE] THEN
  1.3137 -    REWRITE_TAC[REAL_SUB_REFL; REAL_MUL_RZERO; SUM_0; COND_ID] THEN
  1.3138 -    REWRITE_TAC[REAL_MUL_LID; ARITH; REAL_SUB_RZERO] THEN
  1.3139 -    COND_CASES_TAC THEN ASM_SIMP_TAC[REAL_ADD_RID] THEN
  1.3140 -    ASM_REWRITE_TAC[REAL_ARITH `x + y - x:real = y`] THEN
  1.3141 -    ASM_MESON_TAC[DIMINDEX_GE_1;
  1.3142 -                  ARITH_RULE `1 \<le> n \<and> ~(2 \<le> n) ==> n = 1`]]);; *)
  1.3143 -
  1.3144 -lemma HAS_GMEASURE_IMAGE_STD_SIMPLEX: True .. (*
  1.3145 - "!p. p permutes 1..dimindex(:N)
  1.3146 -       ==> {x:real^N | 0 \<le> x$(p 1) \<and> x$(p(dimindex(:N))) \<le> 1 \<and>
  1.3147 -                       (!i. 1 \<le> i \<and> i < dimindex(:N)
  1.3148 -                            ==> x$(p i) \<le> x$(p(i + 1)))}
  1.3149 -           has_gmeasure
  1.3150 -           (measure (convex hull
  1.3151 -             (0 INSERT {basis i:real^N | 1 \<le> i \<and> i \<le> dimindex(:N)})))"
  1.3152 -qed   REPEAT STRIP_TAC THEN ASM_SIMP_TAC[CONGRUENT_IMAGE_STD_SIMPLEX] THEN
  1.3153 -  ASM_SIMP_TAC[GSYM STD_SIMPLEX] THEN
  1.3154 -  MATCH_MP_TAC HAS_GMEASURE_LINEAR_IMAGE_SAME THEN
  1.3155 -  REPEAT CONJ_TAC THENL
  1.3156 -   [REWRITE_TAC[linear; CART_EQ] THEN
  1.3157 -    ASM_SIMP_TAC[LAMBDA_BETA; VECTOR_ADD_COMPONENT; VECTOR_MUL_COMPONENT;
  1.3158 -                 GSYM SUM_ADD_NUMSEG; GSYM SUM_LMUL] THEN
  1.3159 -    REPEAT STRIP_TAC THEN MATCH_MP_TAC SUM_EQ_NUMSEG THEN
  1.3160 -    REPEAT STRIP_TAC THEN REWRITE_TAC[] THENL
  1.3161 -     [MATCH_MP_TAC VECTOR_ADD_COMPONENT;
  1.3162 -      MATCH_MP_TAC VECTOR_MUL_COMPONENT] THEN
  1.3163 -    ASM_MESON_TAC[PERMUTES_INVERSE; IN_NUMSEG; LE_TRANS; PERMUTES_IN_IMAGE];
  1.3164 -    MATCH_MP_TAC GMEASURABLE_CONVEX THEN REWRITE_TAC[CONVEX_CONVEX_HULL] THEN
  1.3165 -    MATCH_MP_TAC BOUNDED_CONVEX_HULL THEN REWRITE_TAC[BOUNDED_INSERT] THEN
  1.3166 -    ONCE_REWRITE_TAC[SIMPLE_IMAGE_GEN] THEN
  1.3167 -    MATCH_MP_TAC FINITE_IMP_BOUNDED THEN MATCH_MP_TAC FINITE_IMAGE THEN
  1.3168 -    REWRITE_TAC[GSYM numseg; FINITE_NUMSEG];
  1.3169 -    MATCH_MP_TAC EQ_TRANS THEN EXISTS_TAC
  1.3170 -     `abs(det
  1.3171 -       ((lambda i. ((lambda i j. if j \<le> i then 1 else 0):real^N^N)
  1.3172 -                   $inverse p i)
  1.3173 -        :real^N^N))` THEN
  1.3174 -    CONJ_TAC THENL
  1.3175 -     [AP_TERM_TAC THEN AP_TERM_TAC THEN REWRITE_TAC[CART_EQ] THEN
  1.3176 -      ASM_SIMP_TAC[matrix; LAMBDA_BETA; BASIS_COMPONENT; COND_COMPONENT;
  1.3177 -                   LAMBDA_BETA_PERM; PERMUTES_INVERSE] THEN
  1.3178 -      X_GEN_TAC `i:num` THEN STRIP_TAC THEN
  1.3179 -      X_GEN_TAC `j:num` THEN STRIP_TAC THEN MATCH_MP_TAC EQ_TRANS THEN
  1.3180 -      EXISTS_TAC `sum (1..inverse (p:num->num) i)
  1.3181 -                      (\<lambda>k. if k = j then 1 else 0)` THEN
  1.3182 -      CONJ_TAC THENL
  1.3183 -       [MATCH_MP_TAC SUM_EQ THEN
  1.3184 -        ASM_SIMP_TAC[IN_NUMSEG; PERMUTES_IN_IMAGE; basis] THEN
  1.3185 -        REPEAT STRIP_TAC THEN MATCH_MP_TAC LAMBDA_BETA THEN
  1.3186 -        ASM_MESON_TAC[PERMUTES_IN_IMAGE; IN_NUMSEG; LE_TRANS;
  1.3187 -                      PERMUTES_INVERSE];
  1.3188 -        ASM_SIMP_TAC[SUM_DELTA; IN_NUMSEG]];
  1.3189 -      ALL_TAC] THEN
  1.3190 -    ASM_SIMP_TAC[PERMUTES_INVERSE; DET_PERMUTE_ROWS; ETA_AX] THEN
  1.3191 -    REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_SIGN; REAL_MUL_LID] THEN
  1.3192 -    MATCH_MP_TAC(REAL_ARITH `x = 1 ==> abs x = 1`) THEN
  1.3193 -    ASM_SIMP_TAC[DET_LOWERTRIANGULAR; GSYM NOT_LT; LAMBDA_BETA] THEN
  1.3194 -    REWRITE_TAC[LT_REFL; PRODUCT_CONST_NUMSEG; REAL_POW_ONE]]);; *)
  1.3195 -
  1.3196 -lemma HAS_GMEASURE_STD_SIMPLEX: True .. (*
  1.3197 - "(convex hull (0:real^N INSERT {basis i | 1 \<le> i \<and> i \<le> dimindex(:N)}))
  1.3198 -   has_gmeasure inv((FACT(dimindex(:N))))"
  1.3199 -qed   lemma lemma = prove
  1.3200 -   (`!f:num->real. (!i. 1 \<le> i \<and> i < n ==> f i \<le> f(i + 1)) \<longleftrightarrow>
  1.3201 -                   (!i j. 1 \<le> i \<and> i \<le> j \<and> j \<le> n ==> f i \<le> f j)"
  1.3202 -qed     GEN_TAC THEN EQ_TAC THEN DISCH_TAC THENL
  1.3203 -     [GEN_TAC THEN INDUCT_TAC THEN
  1.3204 -      SIMP_TAC[LE; REAL_LE_REFL] THEN
  1.3205 -      STRIP_TAC THEN ASM_SIMP_TAC[REAL_LE_REFL] THEN
  1.3206 -      MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `(f:num->real) j` THEN
  1.3207 -      ASM_SIMP_TAC[ARITH_RULE `SUC x \<le> y ==> x \<le> y`] THEN
  1.3208 -      REWRITE_TAC[ADD1] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC;
  1.3209 -      REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC]) in
  1.3210 -  MP_TAC(ISPECL
  1.3211 -   [`\p. {x:real^N | 0 \<le> x$(p 1) \<and> x$(p(dimindex(:N))) \<le> 1 \<and>
  1.3212 -                     (!i. 1 \<le> i \<and> i < dimindex(:N)
  1.3213 -                          ==> x$(p i) \<le> x$(p(i + 1)))}`;
  1.3214 -    `{p | p permutes 1..dimindex(:N)}`]
  1.3215 -    HAS_GMEASURE_NEGLIGIBLE_UNIONS_IMAGE) THEN
  1.3216 -  ASM_SIMP_TAC[REWRITE_RULE[HAS_GMEASURE_MEASURABLE_MEASURE]
  1.3217 -                            HAS_GMEASURE_IMAGE_STD_SIMPLEX; IN_ELIM_THM] THEN
  1.3218 -  ASM_SIMP_TAC[SUM_CONST; FINITE_PERMUTATIONS; FINITE_NUMSEG;
  1.3219 -               CARD_PERMUTATIONS; CARD_NUMSEG_1] THEN
  1.3220 -  ANTS_TAC THENL
  1.3221 -   [MAP_EVERY X_GEN_TAC [`p:num->num`; `q:num->num`] THEN STRIP_TAC THEN
  1.3222 -    SUBGOAL_THEN `?i. i \<in> 1..dimindex(:N) \<and> ~(p i:num = q i)` MP_TAC THENL
  1.3223 -     [ASM_MESON_TAC[permutes; FUN_EQ_THM]; ALL_TAC] THEN
  1.3224 -    GEN_REWRITE_TAC LAND_CONV [num_WOP] THEN
  1.3225 -    REWRITE_TAC[TAUT `a ==> ~(b \<and> ~c) \<longleftrightarrow> a \<and> b ==> c`] THEN
  1.3226 -    REWRITE_TAC[IN_NUMSEG] THEN
  1.3227 -    DISCH_THEN(X_CHOOSE_THEN `k:num` STRIP_ASSUME_TAC) THEN
  1.3228 -    MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
  1.3229 -    EXISTS_TAC `{x:real^N | (basis(p(k:num)) - basis(q k)) dot x = 0}` THEN
  1.3230 -    CONJ_TAC THENL
  1.3231 -     [MATCH_MP_TAC NEGLIGIBLE_HYPERPLANE THEN REWRITE_TAC[VECTOR_SUB_EQ] THEN
  1.3232 -      MATCH_MP_TAC BASIS_NE THEN ASM_MESON_TAC[PERMUTES_IN_IMAGE; IN_NUMSEG];
  1.3233 -      ALL_TAC] THEN
  1.3234 -    REWRITE_TAC[SUBSET; IN_INTER; IN_ELIM_THM; DOT_LSUB; VECTOR_SUB_EQ] THEN
  1.3235 -    ASM_SIMP_TAC[DOT_BASIS; GSYM IN_NUMSEG; PERMUTES_IN_IMAGE] THEN
  1.3236 -    SUBGOAL_THEN `?l. (q:num->num) l = p(k:num)` STRIP_ASSUME_TAC THENL
  1.3237 -     [ASM_MESON_TAC[permutes]; ALL_TAC] THEN
  1.3238 -    SUBGOAL_THEN `1 \<le> l \<and> l \<le> dimindex(:N)` STRIP_ASSUME_TAC THENL
  1.3239 -     [ASM_MESON_TAC[PERMUTES_IN_IMAGE; IN_NUMSEG]; ALL_TAC] THEN
  1.3240 -    SUBGOAL_THEN `k:num < l` ASSUME_TAC THENL
  1.3241 -     [REWRITE_TAC[GSYM NOT_LE] THEN REWRITE_TAC[LE_LT] THEN
  1.3242 -      ASM_MESON_TAC[PERMUTES_INJECTIVE; IN_NUMSEG];
  1.3243 -      ALL_TAC] THEN
  1.3244 -    SUBGOAL_THEN `?m. (p:num->num) m = q(k:num)` STRIP_ASSUME_TAC THENL
  1.3245 -     [ASM_MESON_TAC[permutes]; ALL_TAC] THEN
  1.3246 -    SUBGOAL_THEN `1 \<le> m \<and> m \<le> dimindex(:N)` STRIP_ASSUME_TAC THENL
  1.3247 -     [ASM_MESON_TAC[PERMUTES_IN_IMAGE; IN_NUMSEG]; ALL_TAC] THEN
  1.3248 -    SUBGOAL_THEN `k:num < m` ASSUME_TAC THENL
  1.3249 -     [REWRITE_TAC[GSYM NOT_LE] THEN REWRITE_TAC[LE_LT] THEN
  1.3250 -      ASM_MESON_TAC[PERMUTES_INJECTIVE; IN_NUMSEG];
  1.3251 -      ALL_TAC] THEN
  1.3252 -    X_GEN_TAC `x:real^N` THEN REWRITE_TAC[lemma] THEN STRIP_TAC THEN
  1.3253 -    FIRST_X_ASSUM(MP_TAC o SPECL [`k:num`; `l:num`]) THEN
  1.3254 -    FIRST_X_ASSUM(MP_TAC o SPECL [`k:num`; `m:num`]) THEN
  1.3255 -    ASM_SIMP_TAC[LT_IMP_LE; IMP_IMP; REAL_LE_ANTISYM; REAL_SUB_0] THEN
  1.3256 -    MATCH_MP_TAC EQ_IMP THEN BINOP_TAC THEN
  1.3257 -    ASM_MESON_TAC[PERMUTES_IN_IMAGE; IN_NUMSEG; DOT_BASIS];
  1.3258 -    ALL_TAC] THEN
  1.3259 -  REWRITE_TAC[HAS_GMEASURE_MEASURABLE_MEASURE] THEN
  1.3260 -  DISCH_THEN(ASSUME_TAC o CONJUNCT2) THEN CONJ_TAC THENL
  1.3261 -   [MATCH_MP_TAC GMEASURABLE_CONVEX THEN REWRITE_TAC[CONVEX_CONVEX_HULL] THEN
  1.3262 -    MATCH_MP_TAC BOUNDED_CONVEX_HULL THEN REWRITE_TAC[BOUNDED_INSERT] THEN
  1.3263 -    ONCE_REWRITE_TAC[SIMPLE_IMAGE_GEN] THEN
  1.3264 -    MATCH_MP_TAC FINITE_IMP_BOUNDED THEN MATCH_MP_TAC FINITE_IMAGE THEN
  1.3265 -    REWRITE_TAC[GSYM numseg; FINITE_NUMSEG];
  1.3266 -    ALL_TAC] THEN
  1.3267 -  ASM_SIMP_TAC[REAL_FIELD `~(y = 0) ==> (x = inv y \<longleftrightarrow> y * x = 1)`;
  1.3268 -               REAL_OF_NUM_EQ; FACT_NZ] THEN
  1.3269 -  FIRST_X_ASSUM(SUBST1_TAC o SYM) THEN MATCH_MP_TAC EQ_TRANS THEN
  1.3270 -  EXISTS_TAC `measure(interval[0:real^N,1])` THEN CONJ_TAC THENL
  1.3271 -   [AP_TERM_TAC; REWRITE_TAC[MEASURE_INTERVAL; CONTENT_UNIT]] THEN
  1.3272 -  REWRITE_TAC[lemma] THEN MATCH_MP_TAC SUBSET_ANTISYM THEN CONJ_TAC THENL
  1.3273 -   [REWRITE_TAC[SUBSET; FORALL_IN_UNIONS; FORALL_IN_IMAGE; IMP_CONJ;
  1.3274 -                RIGHT_FORALL_IMP_THM; IN_ELIM_THM] THEN
  1.3275 -    SIMP_TAC[IMP_IMP; IN_INTERVAL; LAMBDA_BETA; VEC_COMPONENT] THEN
  1.3276 -    X_GEN_TAC `p:num->num` THEN STRIP_TAC THEN X_GEN_TAC `x:real^N` THEN
  1.3277 -    STRIP_TAC THEN X_GEN_TAC `i:num` THEN REPEAT STRIP_TAC THEN
  1.3278 -    MATCH_MP_TAC REAL_LE_TRANS THENL
  1.3279 -     [EXISTS_TAC `(x:real^N)$(p 1)`;
  1.3280 -      EXISTS_TAC `(x:real^N)$(p(dimindex(:N)))`] THEN
  1.3281 -    ASM_REWRITE_TAC[] THEN
  1.3282 -    FIRST_ASSUM(MP_TAC o SPEC `i:num` o MATCH_MP PERMUTES_SURJECTIVE) THEN
  1.3283 -    ASM_MESON_TAC[LE_REFL; PERMUTES_IN_IMAGE; IN_NUMSEG];
  1.3284 -    ALL_TAC] THEN
  1.3285 -  REWRITE_TAC[SET_RULE `s \<subseteq> UNIONS(IMAGE f t) \<longleftrightarrow>
  1.3286 -                        !x. x \<in> s ==> ?y. y \<in> t \<and> x \<in> f y`] THEN
  1.3287 -  X_GEN_TAC `x:real^N` THEN REWRITE_TAC[IN_INTERVAL; IN_ELIM_THM] THEN
  1.3288 -  SIMP_TAC[VEC_COMPONENT] THEN DISCH_TAC THEN
  1.3289 -  MP_TAC(ISPEC `\i j. ~((x:real^N)$j \<le> x$i)` TOPOLOGICAL_SORT) THEN
  1.3290 -  REWRITE_TAC[REAL_NOT_LE; REAL_NOT_LT] THEN
  1.3291 -  ANTS_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN
  1.3292 -  DISCH_THEN(MP_TAC o SPECL [`dimindex(:N)`; `1..dimindex(:N)`]) THEN
  1.3293 -  REWRITE_TAC[HAS_SIZE_NUMSEG_1; EXTENSION; IN_IMAGE; IN_NUMSEG] THEN
  1.3294 -  DISCH_THEN(X_CHOOSE_THEN `f:num->num` (CONJUNCTS_THEN2
  1.3295 -   (ASSUME_TAC o GSYM) ASSUME_TAC)) THEN
  1.3296 -  EXISTS_TAC `\i. if i \<in> 1..dimindex(:N) then f(i) else i` THEN
  1.3297 -  REWRITE_TAC[] THEN ONCE_REWRITE_TAC[ARITH_RULE
  1.3298 -    `1 \<le> i \<and> i \<le> j \<and> j \<le> n \<longleftrightarrow>
  1.3299 -     1 \<le> i \<and> 1 \<le> j \<and> i \<le> n \<and> j \<le> n \<and> i \<le> j`] THEN
  1.3300 -  ASM_SIMP_TAC[IN_NUMSEG; LE_REFL; DIMINDEX_GE_1] THEN
  1.3301 -  CONJ_TAC THENL
  1.3302 -   [ALL_TAC;
  1.3303 -    ASM_MESON_TAC[LE_REFL; DIMINDEX_GE_1; LE_LT; REAL_LE_LT]] THEN
  1.3304 -  SIMP_TAC[PERMUTES_FINITE_SURJECTIVE; FINITE_NUMSEG] THEN
  1.3305 -  SIMP_TAC[IN_NUMSEG] THEN ASM_MESON_TAC[]);; *)
  1.3306 -
  1.3307 -(* ------------------------------------------------------------------------- *)
  1.3308 -(* Hence the gmeasure of a general simplex.                                   *)
  1.3309 -(* ------------------------------------------------------------------------- *)
  1.3310 -
  1.3311 -lemma HAS_GMEASURE_SIMPLEX_0: True .. (*
  1.3312 - "!l:(real^N)list.
  1.3313 -        LENGTH l = dimindex(:N)
  1.3314 -        ==> (convex hull (0 INSERT set_of_list l)) has_gmeasure
  1.3315 -            abs(det(vector l)) / (FACT(dimindex(:N)))"
  1.3316 -qed   REPEAT STRIP_TAC THEN
  1.3317 -  SUBGOAL_THEN
  1.3318 -   `0 INSERT (set_of_list l) =
  1.3319 -        IMAGE (\<lambda>x:real^N. transp(vector l:real^N^N) ** x)
  1.3320 -              (0 INSERT {basis i:real^N | 1 \<le> i \<and> i \<le> dimindex(:N)})`
  1.3321 -  SUBST1_TAC THENL
  1.3322 -   [ONCE_REWRITE_TAC[SIMPLE_IMAGE_GEN] THEN
  1.3323 -    REWRITE_TAC[IMAGE_CLAUSES; GSYM IMAGE_o; o_DEF] THEN
  1.3324 -    REWRITE_TAC[MATRIX_VECTOR_MUL_RZERO] THEN AP_TERM_TAC THEN
  1.3325 -    SIMP_TAC[matrix_vector_mul; vector; transp; LAMBDA_BETA; basis] THEN
  1.3326 -    ONCE_REWRITE_TAC[COND_RAND] THEN
  1.3327 -    SIMP_TAC[REAL_MUL_RZERO; SUM_DELTA] THEN
  1.3328 -    REWRITE_TAC[EXTENSION; IN_IMAGE; IN_ELIM_THM; IN_NUMSEG] THEN
  1.3329 -    ONCE_REWRITE_TAC[TAUT `a \<and> b \<and> c \<longleftrightarrow> ~(b \<and> c ==> ~a)`] THEN
  1.3330 -    X_GEN_TAC `y:real^N` THEN SIMP_TAC[LAMBDA_BETA; REAL_MUL_RID] THEN
  1.3331 -    SIMP_TAC[CART_EQ; LAMBDA_BETA] THEN
  1.3332 -    REWRITE_TAC[NOT_IMP; REAL_MUL_RID; GSYM CART_EQ] THEN
  1.3333 -    ASM_REWRITE_TAC[IN_SET_OF_LIST; MEM_EXISTS_EL] THEN
  1.3334 -    EQ_TAC THEN DISCH_THEN(X_CHOOSE_THEN `i:num` STRIP_ASSUME_TAC) THENL
  1.3335 -     [EXISTS_TAC `SUC i`; EXISTS_TAC `i - 1`] THEN
  1.3336 -    ASM_REWRITE_TAC[SUC_SUB1] THEN ASM_ARITH_TAC;
  1.3337 -    ALL_TAC] THEN
  1.3338 -  ASM_SIMP_TAC[GSYM CONVEX_HULL_LINEAR_IMAGE; MATRIX_VECTOR_MUL_LINEAR] THEN
  1.3339 -  SUBGOAL_THEN
  1.3340 -   `det(vector l:real^N^N) = det(matrix(\<lambda>x:real^N. transp(vector l) ** x))`
  1.3341 -  SUBST1_TAC THENL
  1.3342 -   [REWRITE_TAC[MATRIX_OF_MATRIX_VECTOR_MUL; DET_TRANSP]; ALL_TAC] THEN
  1.3343 -  REWRITE_TAC[real_div] THEN
  1.3344 -  ASM_SIMP_TAC[GSYM(REWRITE_RULE[HAS_GMEASURE_MEASURABLE_MEASURE]
  1.3345 -                 HAS_GMEASURE_STD_SIMPLEX)] THEN
  1.3346 -  MATCH_MP_TAC HAS_GMEASURE_LINEAR_IMAGE THEN
  1.3347 -  REWRITE_TAC[MATRIX_VECTOR_MUL_LINEAR] THEN
  1.3348 -  MATCH_MP_TAC GMEASURABLE_CONVEX THEN REWRITE_TAC[CONVEX_CONVEX_HULL] THEN
  1.3349 -  MATCH_MP_TAC BOUNDED_CONVEX_HULL THEN REWRITE_TAC[BOUNDED_INSERT] THEN
  1.3350 -  ONCE_REWRITE_TAC[SIMPLE_IMAGE_GEN] THEN
  1.3351 -  MATCH_MP_TAC FINITE_IMP_BOUNDED THEN MATCH_MP_TAC FINITE_IMAGE THEN
  1.3352 -  REWRITE_TAC[GSYM numseg; FINITE_NUMSEG]);; *)
  1.3353 -
  1.3354 -lemma HAS_GMEASURE_SIMPLEX: True .. (*
  1.3355 - "!a l:(real^N)list.
  1.3356 -        LENGTH l = dimindex(:N)
  1.3357 -        ==> (convex hull (set_of_list(CONS a l))) has_gmeasure
  1.3358 -            abs(det(vector(MAP (\<lambda>x. x - a) l))) / (FACT(dimindex(:N)))"
  1.3359 -qed   REPEAT STRIP_TAC THEN
  1.3360 -  MP_TAC(ISPEC `MAP (\<lambda>x:real^N. x - a) l` HAS_GMEASURE_SIMPLEX_0) THEN
  1.3361 -  ASM_REWRITE_TAC[LENGTH_MAP; set_of_list] THEN
  1.3362 -  DISCH_THEN(MP_TAC o SPEC `a:real^N` o MATCH_MP HAS_GMEASURE_TRANSLATION) THEN
  1.3363 -  REWRITE_TAC[GSYM CONVEX_HULL_TRANSLATION] THEN
  1.3364 -  MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN
  1.3365 -  REWRITE_TAC[IMAGE_CLAUSES; VECTOR_ADD_RID; SET_OF_LIST_MAP] THEN
  1.3366 -  REWRITE_TAC[GSYM IMAGE_o; o_DEF; VECTOR_ARITH `a + x - a:real^N = x`;
  1.3367 -              SET_RULE `IMAGE (\<lambda>x. x) s = s`]);; *)
  1.3368 -
  1.3369 -lemma GMEASURABLE_SIMPLEX: True .. (*
  1.3370 - "!l. gmeasurable(convex hull (set_of_list l))"
  1.3371 -qed   GEN_TAC THEN
  1.3372 -  MATCH_MP_TAC GMEASURABLE_CONVEX THEN REWRITE_TAC[CONVEX_CONVEX_HULL] THEN
  1.3373 -  MATCH_MP_TAC BOUNDED_CONVEX_HULL THEN
  1.3374 -  MATCH_MP_TAC FINITE_IMP_BOUNDED THEN REWRITE_TAC[FINITE_SET_OF_LIST]);; *)
  1.3375 -
  1.3376 -lemma MEASURE_SIMPLEX: True .. (*
  1.3377 - "!a l:(real^N)list.
  1.3378 -        LENGTH l = dimindex(:N)
  1.3379 -        ==> measure(convex hull (set_of_list(CONS a l))) =
  1.3380 -            abs(det(vector(MAP (\<lambda>x. x - a) l))) / (FACT(dimindex(:N)))"
  1.3381 -qed   MESON_TAC[HAS_GMEASURE_SIMPLEX; HAS_GMEASURE_MEASURABLE_MEASURE]);; *)
  1.3382 -
  1.3383 -(* ------------------------------------------------------------------------- *)
  1.3384 -(* Area of a triangle.                                                       *)
  1.3385 -(* ------------------------------------------------------------------------- *)
  1.3386 -
  1.3387 -lemma HAS_GMEASURE_TRIANGLE: True .. (*
  1.3388 - "!a b c:real^2.
  1.3389 -        convex hull {a,b,c} has_gmeasure
  1.3390 -        abs((b$1 - a$1) * (c$2 - a$2) - (b$2 - a$2) * (c$1 - a$1)) / 2"
  1.3391 -qed   REPEAT STRIP_TAC THEN
  1.3392 -  MP_TAC(ISPECL [`a:real^2`; `[b;c]:(real^2)list`] HAS_GMEASURE_SIMPLEX) THEN
  1.3393 -  REWRITE_TAC[LENGTH; DIMINDEX_2; ARITH; set_of_list; MAP] THEN
  1.3394 -  CONV_TAC NUM_REDUCE_CONV THEN SIMP_TAC[DET_2; VECTOR_2] THEN
  1.3395 -  SIMP_TAC[VECTOR_SUB_COMPONENT; DIMINDEX_2; ARITH]);; *)
  1.3396 -
  1.3397 -lemma GMEASURABLE_TRIANGLE: True .. (*
  1.3398 - "!a b c:real^N. gmeasurable(convex hull {a,b,c})"
  1.3399 -qed   REPEAT GEN_TAC THEN
  1.3400 -  MATCH_MP_TAC GMEASURABLE_CONVEX THEN REWRITE_TAC[CONVEX_CONVEX_HULL] THEN
  1.3401 -  MATCH_MP_TAC BOUNDED_CONVEX_HULL THEN MATCH_MP_TAC FINITE_IMP_BOUNDED THEN
  1.3402 -  REWRITE_TAC[FINITE_INSERT; FINITE_RULES]);; *)
  1.3403 -
  1.3404 -lemma MEASURE_TRIANGLE: True .. (*
  1.3405 - "!a b c:real^2.
  1.3406 -        measure(convex hull {a,b,c}) =
  1.3407 -        abs((b$1 - a$1) * (c$2 - a$2) - (b$2 - a$2) * (c$1 - a$1)) / 2"
  1.3408 -qed   REWRITE_TAC[REWRITE_RULE[HAS_GMEASURE_MEASURABLE_MEASURE]
  1.3409 -               HAS_GMEASURE_TRIANGLE]);; *)
  1.3410 -
  1.3411 -(* ------------------------------------------------------------------------- *)
  1.3412 -(* Volume of a tetrahedron.                                                  *)
  1.3413 -(* ------------------------------------------------------------------------- *)
  1.3414 -
  1.3415 -lemma HAS_GMEASURE_TETRAHEDRON: True .. (*
  1.3416 - "!a b c d:real^3.
  1.3417 -        convex hull {a,b,c,d} has_gmeasure
  1.3418 -        abs((b$1 - a$1) * (c$2 - a$2) * (d$3 - a$3) +
  1.3419 -            (b$2 - a$2) * (c$3 - a$3) * (d$1 - a$1) +
  1.3420 -            (b$3 - a$3) * (c$1 - a$1) * (d$2 - a$2) -
  1.3421 -            (b$1 - a$1) * (c$3 - a$3) * (d$2 - a$2) -
  1.3422 -            (b$2 - a$2) * (c$1 - a$1) * (d$3 - a$3) -
  1.3423 -            (b$3 - a$3) * (c$2 - a$2) * (d$1 - a$1)) /
  1.3424 -           6"
  1.3425 -qed   REPEAT STRIP_TAC THEN
  1.3426 -  MP_TAC(ISPECL [`a:real^3`; `[b;c;d]:(real^3)list`] HAS_GMEASURE_SIMPLEX) THEN
  1.3427 -  REWRITE_TAC[LENGTH; DIMINDEX_3; ARITH; set_of_list; MAP] THEN
  1.3428 -  CONV_TAC NUM_REDUCE_CONV THEN SIMP_TAC[DET_3; VECTOR_3] THEN
  1.3429 -  SIMP_TAC[VECTOR_SUB_COMPONENT; DIMINDEX_3; ARITH]);; *)
  1.3430 -
  1.3431 -lemma GMEASURABLE_TETRAHEDRON: True .. (*
  1.3432 - "!a b c d:real^N. gmeasurable(convex hull {a,b,c,d})"
  1.3433 -qed   REPEAT GEN_TAC THEN
  1.3434 -  MATCH_MP_TAC GMEASURABLE_CONVEX THEN REWRITE_TAC[CONVEX_CONVEX_HULL] THEN
  1.3435 -  MATCH_MP_TAC BOUNDED_CONVEX_HULL THEN MATCH_MP_TAC FINITE_IMP_BOUNDED THEN
  1.3436 -  REWRITE_TAC[FINITE_INSERT; FINITE_RULES]);; *)
  1.3437 -
  1.3438 -lemma MEASURE_TETRAHEDRON: True .. (*
  1.3439 - "!a b c d:real^3.
  1.3440 -        measure(convex hull {a,b,c,d}) =
  1.3441 -        abs((b$1 - a$1) * (c$2 - a$2) * (d$3 - a$3) +
  1.3442 -            (b$2 - a$2) * (c$3 - a$3) * (d$1 - a$1) +
  1.3443 -            (b$3 - a$3) * (c$1 - a$1) * (d$2 - a$2) -
  1.3444 -            (b$1 - a$1) * (c$3 - a$3) * (d$2 - a$2) -
  1.3445 -            (b$2 - a$2) * (c$1 - a$1) * (d$3 - a$3) -
  1.3446 -            (b$3 - a$3) * (c$2 - a$2) * (d$1 - a$1)) / 6"
  1.3447 -qed   REWRITE_TAC[REWRITE_RULE[HAS_GMEASURE_MEASURABLE_MEASURE]
  1.3448 -               HAS_GMEASURE_TETRAHEDRON]);; *)
  1.3449 -
  1.3450 -end