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