lebesgueScript.sml

1(* ------------------------------------------------------------------------- *)
2(* Lebesgue Integrals defined on the extended real numbers [2]               *)
3(* Authors: Tarek Mhamdi, Osman Hasan, Sofiene Tahar                         *)
4(* HVG Group, Concordia University, Montreal                                 *)
5(* ------------------------------------------------------------------------- *)
6(* Based on the work of Aaron Coble [7] (2010), Cambridge University         *)
7(* ------------------------------------------------------------------------- *)
8(* Updated by Chun Tian (2019 - 2025) using some materials from:             *)
9(*                                                                           *)
10(*        Lebesgue Measure Theory (lebesgue_measure_hvgScript.sml)           *)
11(*                                                                           *)
12(*        (c) Copyright 2015,                                                *)
13(*                       Muhammad Qasim,                                     *)
14(*                       Osman Hasan,                                        *)
15(*                       Hardware Verification Group,                        *)
16(*                       Concordia University                                *)
17(*                                                                           *)
18(*            Contact:  <m_qasi@ece.concordia.ca>                            *)
19(*                                                                           *)
20(* Note: The original work was inspired by Isabelle/HOL                      *)
21(* ------------------------------------------------------------------------- *)
22
23Theory lebesgue
24Ancestors
25  arithmetic prim_rec option pair combin pred_set res_quan list
26  real seq transc real_sigma cardinal iterate extreal_base
27  extreal sigma_algebra measure borel real_topology
28Libs
29  pred_setLib numLib res_quanTools realLib RealArith jrhUtils
30  hurdUtils
31
32val ASM_ARITH_TAC = rpt (POP_ASSUM MP_TAC) >> ARITH_TAC; (* numLib *)
33val DISC_RW_KILL = DISCH_TAC >> ONCE_ASM_REWRITE_TAC [] >> POP_ASSUM K_TAC;
34fun METIS ths tm = prove (tm, METIS_TAC ths);
35
36val _ = intLib.deprecate_int ();
37val _ = ratLib.deprecate_rat ();
38
39(* ************************************************************************* *)
40(* Basic Definitions                                                         *)
41(* ************************************************************************* *)
42
43(* This defines a simple function ‘f’ in measurable space m by (s,a,x):
44
45   s is a (finite) set of indices,
46   a_i (each i IN s) are mutually disjoint measurable sets in m,
47   x_i are (normal) reals indicating the "height" of each a(i).
48
49   Then `f(t) = SIGMA (\i. Normal (x i) * indicator_fn (a i) t) s` is a simple function.
50
51   BIGUNION and DISJOINT indicate that this is a standard representation.
52
53   NOTE: changed from `!t. 0 <= f t` to `!t. t IN m_space m ==> 0 <= f t`
54 *)
55Definition pos_simple_fn_def :
56    pos_simple_fn m f (s :num set) (a :num -> 'a set) (x :num -> real) =
57       ((!t. t IN m_space m ==> 0 <= f t) /\ (* was: !t. 0 <= f t *)
58        (!t. t IN m_space m ==>
59            (f t = SIGMA (\i. Normal (x i) * indicator_fn (a i) t) s)) /\
60        (!i. i IN s ==> a i IN measurable_sets m) /\
61        FINITE s /\ (!i. i IN s ==> 0 <= x i) /\
62        (!i j. i IN s /\ j IN s /\ (i <> j) ==> DISJOINT (a i) (a j)) /\
63        (BIGUNION (IMAGE a s) = m_space m))
64End
65
66(* The integral of a positive simple function: s is a set of indices,
67   a(n) is a sequence of disjoint sets, x(n) is a sequence of reals.
68
69   old definition: Normal (SIGMA (\i:num. (x i) * (measure m (a i))) s)
70 *)
71Definition pos_simple_fn_integral_def :
72    pos_simple_fn_integral (m :'a m_space)
73                           (s :num set) (a :num -> 'a set) (x :num -> real) =
74        SIGMA (\i:num. Normal (x i) * (measure m (a i))) s
75End
76
77(* ‘psfs m f’ is the set of all positive simple functions equivalent to f *)
78Definition psfs_def :
79    psfs m f = {(s,a,x) | pos_simple_fn m f s a x}
80End
81
82(* `psfis m f ` is the set of integrals of positive simple functions equivalent to f *)
83Definition psfis_def:
84    psfis m f = IMAGE (\(s,a,x). pos_simple_fn_integral m s a x) (psfs m f)
85End
86
87(* the integral of arbitrary positive function is the sup of integrals of all
88   positive simple functions smaller than f,
89
90   cf. "nnfis_def" in (old) real_lebesgueScript.sml
91
92   changed from `!x. g x <= fx` to `!x. x IN m_space m ==> g x <= f x`
93 *)
94Definition pos_fn_integral_def:
95    pos_fn_integral m f =
96      sup {r | ?g. r IN psfis m g /\ !x. x IN m_space m ==> g x <= f x}
97End
98
99(* INTEGRAL^+ *)
100val _ = Unicode.unicode_version {u = UTF8.chr 0x222B ^ Unicode.UChar.sup_plus,
101                                 tmnm = "pos_fn_integral"};
102
103val _ = TeX_notation {hol = UTF8.chr 0x222B ^ Unicode.UChar.sup_plus,
104                      TeX = ("\\HOLTokenIntegralPlus{}", 1)};
105
106val _ = hide "integral"; (* possibly integrationTheory.integral_def *)
107Definition integral_def :
108    integral m f = pos_fn_integral m (fn_plus f) - pos_fn_integral m (fn_minus f)
109End
110
111(* INTEGRAL *)
112val _ = Unicode.unicode_version {u = UTF8.chr 0x222B, tmnm = "integral"};
113val _ = TeX_notation {hol = UTF8.chr 0x222B, TeX = ("\\HOLTokenIntegral{}", 1)};
114
115(* Lebesgue integrable = the integral is specified (ie. no `PosInf - PosInf`) *)
116val _ = hide "integrable";
117
118(* NOTE: all integrable functions form the set ‘L1_space m’, i.e. set of integrable
119   measurable functions from arbitrary measure space ‘m’ to Borel measurable
120   space generated by extended reals. (cf. martingaleTheory.lp_space_def)
121 *)
122Definition integrable_def :
123    integrable m f =
124       (f IN measurable (m_space m,measurable_sets m) Borel /\
125        pos_fn_integral m (fn_plus f) <> PosInf /\
126        pos_fn_integral m (fn_minus f) <> PosInf)
127End
128
129Definition finite_space_integral_def :
130    finite_space_integral m f =
131      SIGMA (\r. r * measure m (PREIMAGE f {r} INTER m_space m)) (IMAGE f (m_space m))
132End
133
134(* The measure with density (function) f with respect to m, see [1, p.86-87]
135   from HVG's lebesgue_measureScript.sml, simplified.
136
137   The use of `density`, e.g. in RN_deriv_def, should guarantee that:
138
139   1) the involved function `f` is (AE) non-negative in measure space `m`.
140   2) the resulting `f * m` is only called on `s IN measurable_sets m`.
141 *)
142Definition density_measure_def:   (* or `f * m` *)
143    density_measure m f = \s. pos_fn_integral m (\x. f x * indicator_fn s x)
144End
145
146Definition density_def:   (* was: density *)
147    density m f = (m_space m, measurable_sets m, density_measure m f)
148End
149
150(* |- !m f.
151        density m f =
152        (m_space m,measurable_sets m,
153         (\s. pos_fn_integral m (\x. f x * indicator_fn s x)))
154 *)
155Theorem density = REWRITE_RULE [density_measure_def] density_def
156
157(* `v = density m f` is denoted by `v = f * m` (cf. "RN_deriv_def" below)
158
159   The idea is to syntactically have (`*` is not commutative here):
160
161      `(f * m = v) <=> (f = v / m)`     or      `v / m * m = v`
162 *)
163Overload "*" = ``\f m. density_measure m f``
164
165(* |- !m f s. (f * m) s = pos_fn_integral m (\x. f x * indicator_fn s x) *)
166Theorem density_measure = SIMP_RULE std_ss [FUN_EQ_THM] density_measure_def
167
168(* Theorem 7.6 [1, p.55]: let M, N be measurable spaces and f : M -> N be an
169   M/N-measurable map. For every `u` on `(m_space M,measurable_sets M)`,
170
171      u' = \A. u (PREIMAGE f A INTER m_space M)  (A IN measurable_sets N)
172
173   defines a measure on (m_space N,measurable_sets N).
174
175   Definition 7.7 [1, p.55]: The measure u' of Theorem 7.6 is called the
176   "image measure" or "push forward" of `u` under f.
177
178   cf. density_def, probabilityTheory.distribution_def (an application)
179 *)
180Definition distr_def:
181    distr m f = \s. measure m (PREIMAGE f s INTER m_space m)
182End
183
184(* unused for now:
185val diff_measure_space_def = Define
186   `diff_measure_space m v =
187      (m_space m, measurable_sets m, (\s. measure m s - v s))`;
188
189val _ = overload_on ("-", ``diff_measure_space``);
190 *)
191
192(*****************************************************************************)
193
194Theorem IN_MEASURABLE_BOREL_POS_SIMPLE_FN :
195    !m f. measure_space m /\ (?s a x. pos_simple_fn m f s a x) ==>
196          f IN measurable (m_space m,measurable_sets m) Borel
197Proof
198    RW_TAC std_ss [pos_simple_fn_def]
199 >> `!i. i IN s ==> indicator_fn (a i) IN measurable (m_space m,measurable_sets m) Borel`
200        by METIS_TAC [IN_MEASURABLE_BOREL_INDICATOR, measurable_sets_def, subsets_def,
201                      m_space_def, measure_space_def]
202 >> `!i x. i IN s ==> (\t. Normal (x i) * indicator_fn (a i) t) IN
203                      measurable (m_space m, measurable_sets m) Borel`
204        by (qx_genl_tac [`i`, `y`] >> DISCH_TAC \\
205            MATCH_MP_TAC IN_MEASURABLE_BOREL_CMUL \\
206            qexistsl_tac [`indicator_fn (a i)`, `y i`] \\
207            RW_TAC std_ss [] \\
208            FULL_SIMP_TAC std_ss [measure_space_def])
209 >> MATCH_MP_TAC (INST_TYPE [beta |-> ``:num``] IN_MEASURABLE_BOREL_SUM)
210 >> qexistsl_tac [`(\i. (\t. Normal (x i) * indicator_fn (a i) t))`, `s`]
211 >> RW_TAC std_ss [space_def]
212 >- FULL_SIMP_TAC std_ss [measure_space_def]
213 >> RW_TAC real_ss [indicator_fn_def, mul_rzero, mul_rone]
214 >> RW_TAC std_ss [extreal_of_num_def]
215QED
216
217(* z/z' c is the standard representation of f/g *)
218Theorem pos_simple_fn_integral_present :
219    !m f (s :num->bool) a x
220       g (s':num->bool) b y.
221       measure_space m /\ pos_simple_fn m f s a x /\ pos_simple_fn m g s' b y ==>
222       ?z z' c (k:num->bool).
223          (!t. t IN m_space m ==>
224               f t = SIGMA (\i. Normal (z  i) * indicator_fn (c i) t) k) /\
225          (!t. t IN m_space m ==>
226               g t = SIGMA (\i. Normal (z' i) * indicator_fn (c i) t) k) /\
227          (pos_simple_fn_integral m s  a x = pos_simple_fn_integral m k c z) /\
228          (pos_simple_fn_integral m s' b y = pos_simple_fn_integral m k c z') /\
229           FINITE k /\ (!i. i IN k ==> 0 <= z i) /\ (!i. i IN k ==> 0 <= z' i) /\
230          (!i j. i IN k /\ j IN k /\ i <> j ==> DISJOINT (c i) (c j)) /\
231          (!i. i IN k ==> c i IN measurable_sets m) /\
232          (BIGUNION (IMAGE c k) = m_space m)
233Proof
234    rpt STRIP_TAC
235 >> `?p n. BIJ p (count n) (s CROSS s')`
236        by FULL_SIMP_TAC std_ss [GSYM FINITE_BIJ_COUNT, pos_simple_fn_def,
237                                 FINITE_CROSS]
238 >> `?p'. BIJ p' (s CROSS s') (count n) /\
239          (!x. x IN (count n) ==> ((p' o p) x = x)) /\
240          (!x. x IN (s CROSS s') ==> ((p o p') x = x))`
241        by (MATCH_MP_TAC BIJ_INV >> RW_TAC std_ss [])
242 >> qexistsl_tac [`x o FST o p`, `y o SND o p`,
243                  `(\(i,j). a i INTER b j) o p`, `IMAGE p' (s CROSS s')`]
244 >> Q.ABBREV_TAC `G = IMAGE (\i j. p' (i,j)) s'`
245 >> Q.ABBREV_TAC `H = IMAGE (\j i. p' (i,j)) s`
246 >> CONJ_TAC
247 >- (RW_TAC std_ss [FUN_EQ_THM] \\
248     FULL_SIMP_TAC std_ss [pos_simple_fn_def] \\
249    `!i. i IN s ==> (\i. Normal (x i) * indicator_fn (a i) t) i <> NegInf`
250         by METIS_TAC [indicator_fn_def, mul_rzero, mul_rone, extreal_not_infty,
251                       extreal_of_num_def] \\
252     FULL_SIMP_TAC std_ss [(Once o UNDISCH o Q.ISPEC `(s :num -> bool)`)
253                               EXTREAL_SUM_IMAGE_IN_IF] \\
254    `(\x'. (if x' IN s then (\i. Normal (x i) * indicator_fn (a i) t) x' else 0)) =
255     (\x'. (if x' IN s then (\i. Normal (x i) *
256                SIGMA (\j. indicator_fn (a i INTER b j) t) s') x' else 0))`
257        by (RW_TAC std_ss [FUN_EQ_THM] \\
258            RW_TAC std_ss [] \\
259            FULL_SIMP_TAC std_ss [GSYM AND_IMP_INTRO] \\
260            (MP_TAC o Q.ISPEC `(a :num -> 'a set) (x' :num)` o
261             UNDISCH_ALL o REWRITE_RULE [GSYM AND_IMP_INTRO] o
262             Q.ISPECL [`(s' :num -> bool)`, `m_space (m: 'a m_space)`,
263                       `(b :num -> 'a set)`]) indicator_fn_split \\
264            Q.PAT_X_ASSUM `!i. i IN s ==> (a :num -> 'a set) i IN measurable_sets m`
265               (ASSUME_TAC o UNDISCH o Q.SPEC `x'`) \\
266           `!a m. measure_space m /\ a IN measurable_sets m ==> a SUBSET m_space m`
267               by RW_TAC std_ss [measure_space_def, sigma_algebra_def, algebra_def,
268                                 subset_class_def, subsets_def, space_def] \\
269            POP_ASSUM (ASSUME_TAC o UNDISCH_ALL o REWRITE_RULE [GSYM AND_IMP_INTRO] o
270                       Q.ISPECL [`(a :num -> 'a set) (x' :num)`, `(m :'a m_space)`]) \\
271            ASM_SIMP_TAC std_ss []) \\
272     FULL_SIMP_TAC std_ss [] \\
273    `!i j. j IN s' ==> (\j. indicator_fn (a i INTER b j) t) j <> NegInf`
274         by METIS_TAC [extreal_of_num_def, extreal_not_infty, indicator_fn_def] \\
275    `!(x':num) (i:num). Normal (x i) * SIGMA (\j. indicator_fn (a i INTER b j) t) s' =
276                        SIGMA (\j. Normal (x i) * indicator_fn (a i INTER b j) t) s'`
277         by (RW_TAC std_ss [] \\
278             (MP_TAC o UNDISCH o Q.SPEC `s'` o GSYM o INST_TYPE [alpha |-> ``:num``])
279                EXTREAL_SUM_IMAGE_CMUL \\
280             FULL_SIMP_TAC std_ss []) >> POP_ORW \\
281    `FINITE (s CROSS s')` by RW_TAC std_ss [FINITE_CROSS] \\
282    `INJ p' (s CROSS s') (IMAGE p' (s CROSS s'))`
283       by METIS_TAC [INJ_IMAGE_BIJ, BIJ_DEF] \\
284    (MP_TAC o Q.SPEC `\i:num. Normal (x (FST (p i))) *
285                            indicator_fn ((\(i:num,j:num). a i INTER b j) (p i)) t`
286            o UNDISCH o Q.SPEC `p'` o UNDISCH o Q.SPEC `s CROSS s'`
287            o INST_TYPE [alpha |-> ``:num#num``, beta |-> ``:num``])
288              EXTREAL_SUM_IMAGE_IMAGE \\
289    `!x'. Normal (x (FST (p x'))) *
290          indicator_fn ((\(i,j). a i INTER b j) (p x')) t <> NegInf`
291       by METIS_TAC [indicator_fn_def, mul_rzero, mul_rone, extreal_not_infty,
292                     extreal_of_num_def] \\
293     RW_TAC std_ss [] \\
294    `!x'. ((\i. Normal (x (FST (p i))) *
295                indicator_fn ((\(i,j). a i INTER b j) (p i)) t) o p') x' <> NegInf`
296          by (RW_TAC std_ss [indicator_fn_def, mul_rzero, mul_rone] \\
297              METIS_TAC [extreal_not_infty, extreal_of_num_def]) \\
298    (MP_TAC o Q.SPEC `((\i. Normal (x (FST ((p :num -> num # num) i))) *
299                            indicator_fn ((\(i,j). a i INTER b j) (p i)) t) o p')`
300            o UNDISCH o Q.ISPEC `(s :num set) CROSS (s' :num set)`)
301              EXTREAL_SUM_IMAGE_IN_IF \\
302     RW_TAC std_ss [] \\
303    `(\x'. if x' IN s CROSS s' then
304              Normal (x (FST x')) * indicator_fn ((\(i,j). a i INTER b j) x') t
305           else 0) =
306     (\x'. if x' IN s CROSS s' then
307              (\x'. Normal (x (FST x')) *
308                    indicator_fn ((\(i,j). a i INTER b j) x') t) x'
309           else 0)` by METIS_TAC [] >> POP_ORW \\
310    `!x'. (\x'. Normal (x (FST x')) *
311                indicator_fn ((\(i,j). a i INTER b j) x') t) x' <> NegInf`
312       by (RW_TAC std_ss [indicator_fn_def, mul_rzero, mul_rone] \\
313           METIS_TAC [extreal_not_infty, extreal_of_num_def]) \\
314    (MP_TAC o Q.SPEC `(\x'. Normal (x (FST x')) *
315                            indicator_fn ((\(i,j). a i INTER b j) x') t)`
316            o UNDISCH o Q.ISPEC `(s :num set) CROSS (s' :num set)`)
317       (GSYM EXTREAL_SUM_IMAGE_IN_IF) \\
318     RW_TAC std_ss [] \\
319    `!x'. NegInf <> (\i:num. SIGMA (\j:num. Normal (x i) *
320                             indicator_fn (a i INTER b j) t) s') x'`
321       by (RW_TAC std_ss [] \\
322          `!j. (\j. Normal (x x') * indicator_fn (a x' INTER b j) t) j <> NegInf`
323              by (RW_TAC std_ss [indicator_fn_def, mul_rzero, mul_rone] \\
324                  METIS_TAC [extreal_of_num_def, extreal_not_infty]) \\
325          FULL_SIMP_TAC std_ss [EXTREAL_SUM_IMAGE_NOT_INFTY]) \\
326    (MP_TAC o Q.SPEC `(\i:num. SIGMA (\j:num. Normal (x i) *
327                               indicator_fn (a i INTER b j) t) s')`
328            o UNDISCH o Q.ISPEC `(s :num -> bool)`) (GSYM EXTREAL_SUM_IMAGE_IN_IF) \\
329     RW_TAC std_ss [] \\
330    (MP_TAC o Q.ISPECL [`s:num->bool`,`s':num->bool`]) EXTREAL_SUM_IMAGE_SUM_IMAGE \\
331     RW_TAC std_ss [] \\
332     POP_ASSUM (MP_TAC o
333                Q.SPEC `(\i j. Normal (x i) * indicator_fn (a i INTER b j) t)`) \\
334    `!x'. Normal (x (FST x')) * indicator_fn (a (FST x') INTER b (SND x')) t <> NegInf`
335          by (RW_TAC std_ss [indicator_fn_def, mul_rzero, mul_rone] \\
336              METIS_TAC [extreal_of_num_def, extreal_not_infty]) \\
337     RW_TAC std_ss [] \\
338     Suff `(\i. Normal (x (FST i)) * indicator_fn (a (FST i) INTER b (SND i)) t) =
339           (\x'. Normal (x (FST x')) * indicator_fn ((\(i,j). a i INTER b j) x') t)`
340     >- RW_TAC std_ss [] \\
341     RW_TAC std_ss [FUN_EQ_THM] \\
342     Cases_on `x'` >> RW_TAC std_ss [FST, SND])
343 >> CONJ_TAC
344 >- (RW_TAC std_ss [FUN_EQ_THM] \\
345     FULL_SIMP_TAC std_ss [pos_simple_fn_def] \\
346     (MP_TAC o Q.SPEC `(\i. Normal (y i) * indicator_fn (b i) t)`
347             o UNDISCH o Q.ISPEC `s':num->bool`) EXTREAL_SUM_IMAGE_IN_IF \\
348    `!x. x IN s' ==> (\i. Normal (y i) * indicator_fn (b i) t) x <> NegInf`
349         by (RW_TAC std_ss [indicator_fn_def, mul_rzero, mul_rone] \\
350             METIS_TAC [extreal_of_num_def, extreal_not_infty]) \\
351     RW_TAC std_ss [] \\
352    `(\x. if x IN s' then Normal (y x) * indicator_fn (b x) t else 0) =
353     (\x. (if x IN s' then (\i. Normal (y i) * indicator_fn (b i) t) x else 0))`
354         by RW_TAC std_ss [] >> POP_ORW \\
355    `(\x. (if x IN s' then (\i. Normal (y i) * indicator_fn (b i) t) x else 0)) =
356     (\x. (if x IN s' then (\i. Normal (y i) *
357                SIGMA (\j. indicator_fn (a j INTER b i) t) s) x else 0))`
358         by (RW_TAC std_ss [FUN_EQ_THM] \\
359             RW_TAC std_ss [] \\
360             FULL_SIMP_TAC std_ss [GSYM AND_IMP_INTRO] \\
361             (MP_TAC o REWRITE_RULE [Once INTER_COMM] o
362              Q.ISPEC `(b :num -> 'a set) (x' :num)` o
363              UNDISCH_ALL o REWRITE_RULE [GSYM AND_IMP_INTRO] o
364              Q.ISPECL [`(s :num -> bool)`, `m_space (m :'a m_space)`,
365                        `(a :num -> 'a set)`]) indicator_fn_split \\
366             Q.PAT_X_ASSUM `!i. i IN s' ==> (b :num -> 'a set) i IN measurable_sets m`
367                (ASSUME_TAC o UNDISCH o Q.SPEC `x'`) \\
368             RW_TAC std_ss [MEASURE_SPACE_SUBSET_MSPACE]) >> POP_ORW \\
369    `!(x:num) (i:num). Normal (y i) * SIGMA (\j. indicator_fn (a j INTER b i) t) s =
370                       SIGMA (\j. Normal (y i) * indicator_fn (a j INTER b i) t) s`
371        by (RW_TAC std_ss [] \\
372          `!j. (\j. indicator_fn (a j INTER b i) t) j <> NegInf`
373              by RW_TAC std_ss [indicator_fn_def, extreal_of_num_def,
374                                extreal_not_infty] \\
375            FULL_SIMP_TAC std_ss [GSYM EXTREAL_SUM_IMAGE_CMUL]) >> POP_ORW \\
376    `FINITE (s CROSS s')` by RW_TAC std_ss [FINITE_CROSS] \\
377    `INJ p' (s CROSS s') (IMAGE p' (s CROSS s'))`
378        by METIS_TAC [INJ_IMAGE_BIJ, BIJ_DEF] \\
379    (MP_TAC o Q.SPEC `(\i:num. Normal (y (SND (p i))) *
380                               indicator_fn ((\(i:num,j:num). a i INTER b j) (p i)) t)`
381            o UNDISCH o Q.SPEC `p'` o UNDISCH o Q.SPEC `s CROSS s'`
382            o INST_TYPE [alpha |-> ``:num#num``, beta |-> ``:num``])
383              EXTREAL_SUM_IMAGE_IMAGE \\
384    `!x. (\i. Normal (y (SND (p i))) *
385              indicator_fn ((\(i,j). a i INTER b j) (p i)) t) x <> NegInf`
386         by METIS_TAC [indicator_fn_def, mul_rzero, mul_rone, extreal_not_infty,
387                       extreal_of_num_def] \\
388     RW_TAC std_ss [] \\
389    `!x'. ((\i. Normal (y (SND (p i))) *
390                indicator_fn ((\(i,j). a i INTER b j) (p i)) t) o p') x' <> NegInf`
391         by (RW_TAC std_ss [indicator_fn_def, mul_rzero, mul_rone] \\
392             METIS_TAC [extreal_not_infty, extreal_of_num_def]) \\
393    (MP_TAC o Q.SPEC `(\i. Normal (y (SND ((p :num -> num # num) i))) *
394                           indicator_fn ((\(i,j). a i INTER b j) (p i)) t) o p'`
395            o UNDISCH o Q.ISPEC `(s :num set) CROSS (s' :num set)`)
396              EXTREAL_SUM_IMAGE_IN_IF \\
397     RW_TAC std_ss [] \\
398    `(\x'. if x' IN s CROSS s' then
399              Normal (y (SND x')) * indicator_fn ((\(i,j). a i INTER b j) x') t
400           else 0) =
401     (\x'. if x' IN s CROSS s' then
402             (\x'. Normal (y (SND x')) *
403                   indicator_fn ((\(i,j). a i INTER b j) x') t) x'
404           else 0)` by METIS_TAC [] >> POP_ORW \\
405    `!x'. (\x'. Normal (y (SND x')) *
406                indicator_fn ((\(i,j). a i INTER b j) x') t) x' <> NegInf`
407         by (RW_TAC std_ss [indicator_fn_def, mul_rzero, mul_rone] \\
408             METIS_TAC [extreal_not_infty, extreal_of_num_def]) \\
409    (MP_TAC o Q.SPEC `(\x'. Normal (y (SND x')) *
410                            indicator_fn ((\(i,j). a i INTER b j) x') t)`
411            o UNDISCH o Q.ISPEC `(s :num set) CROSS (s' :num set)`)
412        (GSYM EXTREAL_SUM_IMAGE_IN_IF) \\
413     RW_TAC std_ss [] \\
414    `!x'. NegInf <> (\x:num. SIGMA (\j:num. Normal (y x) *
415                                            indicator_fn (a j INTER b x) t) s) x'`
416         by (RW_TAC std_ss [] \\
417            `!j. (\j. Normal (y x') * indicator_fn (a j INTER b x') t) j <> NegInf`
418                 by (RW_TAC std_ss [indicator_fn_def, mul_rzero, mul_rone] \\
419                     METIS_TAC [extreal_of_num_def, extreal_not_infty]) \\
420             FULL_SIMP_TAC std_ss [EXTREAL_SUM_IMAGE_NOT_INFTY]) \\
421    (MP_TAC o Q.SPEC `(\x:num. SIGMA (\j:num. Normal (y x) *
422                                              indicator_fn (a j INTER b x) t) s)`
423            o UNDISCH o Q.ISPEC `(s' :num -> bool)`) (GSYM EXTREAL_SUM_IMAGE_IN_IF) \\
424     RW_TAC std_ss [] \\
425    (MP_TAC o Q.ISPECL [`s':num->bool`,`s:num->bool`]) EXTREAL_SUM_IMAGE_SUM_IMAGE \\
426     RW_TAC std_ss [] \\
427     POP_ASSUM (MP_TAC o Q.SPEC `(\x j. Normal (y x) *
428                                        indicator_fn (a j INTER b x) t)`) \\
429    `!x. Normal (y x) * indicator_fn (a j INTER b x) t <> NegInf`
430         by (RW_TAC std_ss [indicator_fn_def, mul_rzero, mul_rone] \\
431             METIS_TAC [extreal_of_num_def, extreal_not_infty]) \\
432    `!x. Normal (y (FST x)) * indicator_fn (a (SND x) INTER b (FST x)) t <> NegInf`
433         by (RW_TAC std_ss [indicator_fn_def, mul_rzero, mul_rone] \\
434             METIS_TAC [extreal_of_num_def, extreal_not_infty]) \\
435     RW_TAC std_ss [] \\
436    `(s' CROSS s) = IMAGE (\x. (SND x, FST x)) (s CROSS s')`
437         by (RW_TAC std_ss [Once EXTENSION, IN_CROSS, IN_IMAGE] \\
438             (MP_TAC o Q.ISPEC `x':num#num`) pair_CASES \\
439             RW_TAC std_ss [] >> RW_TAC std_ss [FST,SND] \\
440             EQ_TAC
441             >- (STRIP_TAC >> Q.EXISTS_TAC `(r,q)` >> RW_TAC std_ss [FST, SND]) \\
442             RW_TAC std_ss [] >> RW_TAC std_ss []) >> POP_ORW \\
443    `INJ (\x. (SND x,FST x)) (s CROSS s')
444         (IMAGE (\x. (SND x,FST x)) (s CROSS s'))`
445         by (RW_TAC std_ss [INJ_DEF, IN_CROSS, IN_IMAGE] >- METIS_TAC [] \\
446             (MP_TAC o Q.ISPEC `x':num#num`) pair_CASES \\
447             (MP_TAC o Q.ISPEC `x'':num#num`) pair_CASES \\
448             RW_TAC std_ss [] \\
449             FULL_SIMP_TAC std_ss [FST,SND]) \\
450    (MP_TAC o Q.SPEC `(\x. Normal (y (FST x)) *
451                           indicator_fn (a (SND x) INTER b (FST x)) t)`
452            o UNDISCH o Q.SPEC `(\x. (SND x, FST x))` o UNDISCH
453            o Q.ISPEC `((s:num->bool) CROSS (s':num->bool))`
454            o INST_TYPE [``:'b``|->``:num#num``]) EXTREAL_SUM_IMAGE_IMAGE \\
455    `!x. (\x. Normal (y (FST x)) *
456              indicator_fn (a (SND x) INTER b (FST x)) t) x <> NegInf`
457         by (RW_TAC std_ss [indicator_fn_def, mul_rzero, mul_rone] \\
458             METIS_TAC [extreal_of_num_def, extreal_not_infty]) \\
459     RW_TAC std_ss [o_DEF] \\
460     Suff `(\x. Normal (y (SND x)) * indicator_fn (a (FST x) INTER b (SND x)) t) =
461           (\x. Normal (y (SND x)) * indicator_fn ((\(i,j). a i INTER b j) x) t)`
462     >- RW_TAC std_ss [] \\
463     RW_TAC std_ss [FUN_EQ_THM] \\
464     Cases_on `x'` >> RW_TAC std_ss [FST, SND])
465 >> CONJ_TAC
466 >- (RW_TAC std_ss [pos_simple_fn_integral_def] \\
467     FULL_SIMP_TAC std_ss [pos_simple_fn_def] \\
468     (MP_TAC o Q.ISPEC `(\i:num. Normal (x i) * measure m (a i))`
469             o UNDISCH o Q.ISPEC `(s :num -> bool)`) EXTREAL_SUM_IMAGE_IN_IF \\
470    `!x'. x' IN s ==> (\i. Normal (x i) * measure m (a i)) x' <> NegInf`
471         by (RW_TAC std_ss [] \\
472             METIS_TAC [positive_not_infty, mul_not_infty, measure_space_def]) \\
473     RW_TAC std_ss [] \\
474    `(\x'. if x' IN s then Normal (x x') * measure m (a x') else 0) =
475     (\x'. (if x' IN s then (\i. Normal (x i) * measure m (a i)) x' else 0))`
476         by METIS_TAC [] >> POP_ORW \\
477    `(\x'. (if x' IN s then (\i. Normal (x i) * measure m (a i)) x' else 0)) =
478     (\x'. (if x' IN s then (\i. Normal (x i) *
479                                 SIGMA (\j. measure m (a i INTER b j)) s') x' else 0))`
480         by (RW_TAC std_ss [FUN_EQ_THM] \\
481             RW_TAC std_ss [] \\
482             FULL_SIMP_TAC std_ss [GSYM AND_IMP_INTRO] \\
483             (MP_TAC o Q.SPEC `a (x' :num)` o
484              UNDISCH_ALL o REWRITE_RULE [GSYM AND_IMP_INTRO] o
485              Q.SPECL [`s'`, `b`, `m`]) measure_split \\
486             RW_TAC std_ss []) >> POP_ORW \\
487    `!i. i IN s ==> (Normal (x i) * SIGMA (\j. measure m (a i INTER b j)) s' =
488                     SIGMA (\j. Normal (x i) * measure m (a i INTER b j)) s')`
489         by (RW_TAC std_ss [] \\
490            `!j. j IN s' ==> (\j. measure m (a i INTER b j)) j <> NegInf`
491                by METIS_TAC [positive_not_infty, measure_space_def,
492                              MEASURE_SPACE_INTER] \\
493             FULL_SIMP_TAC std_ss [GSYM EXTREAL_SUM_IMAGE_CMUL]) \\
494     FULL_SIMP_TAC std_ss [] \\
495    `FINITE (s CROSS s')` by RW_TAC std_ss [FINITE_CROSS] \\
496    `INJ p' (s CROSS s') (IMAGE p' (s CROSS s'))`
497               by METIS_TAC [INJ_IMAGE_BIJ, BIJ_DEF] \\
498     (MP_TAC o Q.SPEC `(\i:num. Normal (x (FST (p i))) *
499                                measure m ((\(i:num, j:num). a i INTER b j) (p i)))`
500             o UNDISCH o Q.SPEC `p'` o UNDISCH o Q.SPEC `s CROSS s'`
501             o INST_TYPE [alpha |-> ``:num#num``, beta |-> ``:num``])
502        EXTREAL_SUM_IMAGE_IMAGE \\
503    `!x'. x' IN IMAGE p' (s CROSS s') ==>
504          Normal (x (FST (p x'))) * measure m ((\(i,j). a i INTER b j) (p x')) <> NegInf`
505         by (RW_TAC std_ss [] \\
506             Cases_on `p x'` \\
507             RW_TAC std_ss [] \\
508             FULL_SIMP_TAC std_ss [IN_IMAGE, IN_CROSS] \\
509            `q IN s` by METIS_TAC [BIJ_DEF, FST, SND] \\
510            `r IN s'` by METIS_TAC [BIJ_DEF, FST, SND] \\
511             METIS_TAC [positive_not_infty, measure_space_def, mul_not_infty,
512                        MEASURE_SPACE_INTER]) >> RW_TAC std_ss [] \\
513     (MP_TAC o Q.SPEC `((\i. Normal (x (FST ((p :num -> num # num) i))) *
514                             measure m ((\(i,j). a i INTER b j) (p i))) o p')`
515             o UNDISCH o Q.ISPEC `(s :num set) CROSS (s' :num set)`) EXTREAL_SUM_IMAGE_IN_IF \\
516    `!x'. x' IN s CROSS s' ==>
517          ((\i. Normal (x (FST (p i))) *
518                measure m ((\(i,j). a i INTER b j) (p i))) o p') x' <> NegInf`
519         by (RW_TAC std_ss [] \\
520             Cases_on `x'` \\
521             FULL_SIMP_TAC std_ss [IN_CROSS] \\
522             METIS_TAC [positive_not_infty, measure_space_def, mul_not_infty,
523                        MEASURE_SPACE_INTER]) >> RW_TAC std_ss [] \\
524    `(\x'. if x' IN s CROSS s' then
525              Normal (x (FST x')) * measure m ((\(i,j). a i INTER b j) x') else 0) =
526     (\x'. (if x' IN s CROSS s' then
527               (\x'. Normal (x (FST x')) * measure m ((\(i,j). a i INTER b j) x')) x' else 0))`
528         by METIS_TAC [] >> POP_ORW \\
529     (MP_TAC o Q.SPEC `(\x'. Normal (x (FST x')) * measure m ((\(i,j). a i INTER b j) x'))`
530             o UNDISCH o Q.ISPEC `(s :num set) CROSS (s' :num set)`)
531        (GSYM EXTREAL_SUM_IMAGE_IN_IF) \\
532    `!x'. x' IN s CROSS s' ==>
533          NegInf <> (\x'. Normal (x (FST x')) * measure m ((\(i,j). a i INTER b j) x')) x'`
534         by (RW_TAC std_ss [] \\
535             Cases_on `x'` \\
536             FULL_SIMP_TAC std_ss [IN_CROSS] \\
537             METIS_TAC [positive_not_infty, measure_space_def, mul_not_infty,
538                        MEASURE_SPACE_INTER]) >> RW_TAC std_ss [] \\
539    `!x'. x' IN s ==>
540          NegInf <> (\i:num. SIGMA (\j:num. Normal (x i) * measure m (a i INTER b j)) s') x'`
541         by (RW_TAC std_ss [] \\
542            `!j. j IN s' ==> (\j. Normal (x x') * measure m (a x' INTER b j)) j <> NegInf`
543                 by (RW_TAC std_ss [] \\
544                     METIS_TAC [positive_not_infty, measure_space_def, mul_not_infty,
545                                MEASURE_SPACE_INTER]) \\
546             FULL_SIMP_TAC std_ss [EXTREAL_SUM_IMAGE_NOT_INFTY]) \\
547     (MP_TAC o Q.SPEC `(\i:num. SIGMA (\j:num. Normal (x i) * measure m (a i INTER b j)) s')`
548             o UNDISCH o Q.ISPEC `(s :num -> bool)`) (GSYM EXTREAL_SUM_IMAGE_IN_IF) \\
549     RW_TAC std_ss [] \\
550     (MP_TAC o Q.ISPECL [`s:num->bool`,`s':num->bool`]) EXTREAL_SUM_IMAGE_SUM_IMAGE \\
551     RW_TAC std_ss [] \\
552     POP_ASSUM (MP_TAC o Q.SPEC `(\i j. Normal (x i) * measure m (a i INTER b j))`) \\
553    `!x'. x' IN s CROSS s' ==>
554          Normal (x (FST x')) * measure m (a (FST x') INTER b (SND x')) <> NegInf`
555         by (RW_TAC std_ss [] \\
556             Cases_on `x'` \\
557             FULL_SIMP_TAC std_ss [IN_CROSS] \\
558             METIS_TAC [positive_not_infty, measure_space_def, mul_not_infty,
559                        MEASURE_SPACE_INTER]) \\
560     RW_TAC std_ss [] \\
561     Suff `(\i. Normal (x (FST i)) * measure m (a (FST i) INTER b (SND i))) =
562           (\x'. Normal (x (FST x')) * measure m ((\(i,j). a i INTER b j) x'))`
563     >- RW_TAC std_ss [] \\
564     RW_TAC std_ss [FUN_EQ_THM] \\
565     Cases_on `x'` >> RW_TAC std_ss [FST, SND])
566 >> CONJ_TAC
567 >- (RW_TAC std_ss [pos_simple_fn_integral_def] \\
568     FULL_SIMP_TAC std_ss [pos_simple_fn_def] \\
569     (MP_TAC o Q.ISPEC `(\i:num. Normal (y i) * measure m (b i))`
570             o UNDISCH o Q.ISPEC `(s' :num -> bool)`) EXTREAL_SUM_IMAGE_IN_IF \\
571    `!x. x IN s' ==> (\i. Normal (y i) * measure m (b i)) x <> NegInf`
572        by (RW_TAC std_ss [] \\
573            METIS_TAC [positive_not_infty, mul_not_infty, measure_space_def]) \\
574     RW_TAC std_ss [] \\
575    `(\x'. if x' IN s' then Normal (y x') * measure m (b x') else 0) =
576     (\x'. (if x' IN s' then (\i. Normal (y i) * measure m (b i)) x' else 0))`
577        by METIS_TAC [] >> POP_ORW \\
578    `(\x'. (if x' IN s' then (\i. Normal (y i) * measure m (b i)) x' else 0)) =
579     (\x'. (if x' IN s' then (\i. Normal (y i) *
580               SIGMA (\j. measure m (b i INTER a j)) s) x' else 0))`
581        by (RW_TAC std_ss [FUN_EQ_THM] \\
582            RW_TAC std_ss [] \\
583            FULL_SIMP_TAC std_ss [GSYM AND_IMP_INTRO] \\
584            (MP_TAC o Q.SPEC `b (x' :num)` o
585             UNDISCH_ALL o REWRITE_RULE [GSYM AND_IMP_INTRO] o
586             Q.SPECL [`s`, `a`, `m`]) measure_split \\
587            RW_TAC std_ss []) >> POP_ORW \\
588    `!i. i IN s' ==> (Normal (y i) * SIGMA (\j. measure m (b i INTER a j)) s =
589                      SIGMA (\j. Normal (y i) * measure m (b i INTER a j)) s)`
590        by (RW_TAC std_ss [] \\
591           `!j. j IN s ==> (\j. measure m (b i INTER a j)) j <> NegInf`
592               by METIS_TAC [positive_not_infty, measure_space_def, MEASURE_SPACE_INTER] \\
593            FULL_SIMP_TAC std_ss [GSYM EXTREAL_SUM_IMAGE_CMUL]) \\
594     FULL_SIMP_TAC std_ss [] \\
595    `FINITE (s CROSS s')` by RW_TAC std_ss [FINITE_CROSS] \\
596    `INJ p' (s CROSS s') (IMAGE p' (s CROSS s'))` by METIS_TAC [INJ_IMAGE_BIJ, BIJ_DEF] \\
597     (MP_TAC o Q.SPEC `(\i:num. Normal (y (SND (p i))) *
598                                measure m ((\(i:num,j:num). a i INTER b j) (p i)))`
599             o UNDISCH o Q.SPEC `p'` o UNDISCH o Q.SPEC `s CROSS s'`
600             o INST_TYPE [alpha |-> ``:num#num``, beta |-> ``:num``])
601         EXTREAL_SUM_IMAGE_IMAGE \\
602    `!x'. x' IN IMAGE p' (s CROSS s') ==>
603          Normal (y (SND (p x'))) * measure m ((\(i,j). a i INTER b j) (p x')) <> NegInf`
604         by (RW_TAC std_ss [] \\
605             Cases_on `p x'` \\
606             RW_TAC std_ss [] \\
607             FULL_SIMP_TAC std_ss [IN_IMAGE,IN_CROSS] \\
608            `q IN s` by METIS_TAC [BIJ_DEF, FST, SND] \\
609            `r IN s'` by METIS_TAC [BIJ_DEF, FST, SND] \\
610             METIS_TAC [positive_not_infty, measure_space_def, mul_not_infty,
611                        MEASURE_SPACE_INTER]) >> RW_TAC std_ss [] \\
612     (MP_TAC o Q.SPEC `((\i. Normal (y (SND ((p :num -> num # num) i))) *
613                             measure m ((\(i,j). a i INTER b j) (p i))) o p')`
614             o UNDISCH o Q.ISPEC `(s :num set) CROSS (s' :num set)`)
615         EXTREAL_SUM_IMAGE_IN_IF \\
616    `!x'. x' IN s CROSS s' ==>
617          ((\i. Normal (y (SND (p i))) *
618                measure m ((\(i,j). a i INTER b j) (p i))) o p') x' <> NegInf`
619         by (RW_TAC std_ss [] \\
620             Cases_on `x'` \\
621             FULL_SIMP_TAC std_ss [IN_CROSS] \\
622             METIS_TAC [positive_not_infty, measure_space_def, mul_not_infty,
623                        MEASURE_SPACE_INTER]) >> RW_TAC std_ss [] \\
624    `(\x'. if x' IN s CROSS s' then
625              Normal (y (SND x')) * measure m ((\(i,j). a i INTER b j) x') else 0) =
626     (\x'. (if x' IN s CROSS s' then
627              (\x'. Normal (y (SND x')) * measure m ((\(i,j). a i INTER b j) x')) x' else 0))`
628         by METIS_TAC [] >> POP_ORW \\
629     (MP_TAC o Q.SPEC `(\x'. Normal (y (SND x')) * measure m ((\(i,j). a i INTER b j) x'))`
630             o UNDISCH o Q.ISPEC `(s :num set) CROSS (s' :num set)`)
631         (GSYM EXTREAL_SUM_IMAGE_IN_IF) \\
632    `!x'. x' IN s CROSS s' ==>
633          NegInf <> (\x'. Normal (y (SND x')) * measure m ((\(i,j). a i INTER b j) x')) x'`
634         by (RW_TAC std_ss [] \\
635             Cases_on `x'` \\
636             FULL_SIMP_TAC std_ss [IN_CROSS] \\
637             METIS_TAC [positive_not_infty, measure_space_def, mul_not_infty,
638                        MEASURE_SPACE_INTER]) >> RW_TAC std_ss [] \\
639    `!x'. x' IN s' ==>
640          NegInf <> (\i:num. SIGMA (\j:num. Normal (y i) * measure m (b i INTER a j)) s) x'`
641         by (RW_TAC std_ss [] \\
642            `!j. j IN s ==> (\j. Normal (y x') * measure m (b x' INTER a j)) j <> NegInf`
643                by (RW_TAC std_ss [] \\
644                    METIS_TAC [positive_not_infty, measure_space_def, mul_not_infty,
645                               MEASURE_SPACE_INTER]) \\
646             FULL_SIMP_TAC std_ss [EXTREAL_SUM_IMAGE_NOT_INFTY]) \\
647     (MP_TAC o Q.SPEC `(\i:num. SIGMA (\j:num. Normal (y i) * measure m (b i INTER a j)) s)`
648             o UNDISCH o Q.ISPEC `(s' :num -> bool)`) (GSYM EXTREAL_SUM_IMAGE_IN_IF) \\
649     RW_TAC std_ss [] \\
650     (MP_TAC o Q.ISPECL [`s':num->bool`,`s:num->bool`]) EXTREAL_SUM_IMAGE_SUM_IMAGE \\
651     RW_TAC std_ss [] \\
652     POP_ASSUM (MP_TAC o Q.SPEC `(\i j. Normal (y i) * measure m (b i INTER a j))`) \\
653    `!x'. x' IN s' CROSS s ==>
654          Normal (y (FST x')) * measure m (b (FST x') INTER a (SND x')) <> NegInf`
655         by (RW_TAC std_ss [] \\
656             Cases_on `x'` \\
657             FULL_SIMP_TAC std_ss [IN_CROSS] \\
658             METIS_TAC [positive_not_infty, measure_space_def, mul_not_infty,
659                        MEASURE_SPACE_INTER]) \\
660     RW_TAC std_ss [o_DEF] \\
661    `(s' CROSS s) = IMAGE (\x. (SND x, FST x)) (s CROSS s')`
662         by (RW_TAC std_ss [Once EXTENSION, IN_CROSS, IN_IMAGE] \\
663             (MP_TAC o Q.ISPEC `x':num#num`) pair_CASES \\
664             RW_TAC std_ss [] >> RW_TAC std_ss [FST,SND] \\
665             EQ_TAC >- (STRIP_TAC >> Q.EXISTS_TAC `(r,q)` >> RW_TAC std_ss [FST,SND]) \\
666             RW_TAC std_ss [] >> RW_TAC std_ss []) >> POP_ORW \\
667    `INJ (\x. (SND x,FST x)) (s CROSS s') (IMAGE (\x. (SND x,FST x)) (s CROSS s'))`
668         by (RW_TAC std_ss [INJ_DEF, IN_CROSS, IN_IMAGE]
669             >- METIS_TAC [] \\
670             (MP_TAC o Q.ISPEC `x':num#num`) pair_CASES \\
671             (MP_TAC o Q.ISPEC `x'':num#num`) pair_CASES \\
672             RW_TAC std_ss [] \\
673             FULL_SIMP_TAC std_ss [FST,SND]) \\
674     (MP_TAC o Q.SPEC `(\x. Normal (y (FST x)) * measure m (a (SND x) INTER b (FST x)))`
675             o UNDISCH o Q.SPEC `(\x. (SND x, FST x))` o UNDISCH
676             o Q.ISPEC `((s:num->bool) CROSS (s':num->bool))`
677             o INST_TYPE [``:'b``|->``:num#num``]) EXTREAL_SUM_IMAGE_IMAGE \\
678    `!x. x IN IMAGE (\x. (SND x,FST x)) (s CROSS s') ==>
679         (\x. Normal (y (FST x)) * measure m (a (SND x) INTER b (FST x))) x <> NegInf`
680         by (RW_TAC std_ss [] \\
681             Cases_on `x'` \\
682             FULL_SIMP_TAC std_ss [IN_CROSS,IN_IMAGE] \\
683             METIS_TAC [positive_not_infty, measure_space_def, mul_not_infty,
684                        MEASURE_SPACE_INTER]) \\
685     RW_TAC std_ss [o_DEF, INTER_COMM] \\
686     Suff `(\x. Normal (y (SND x)) * measure m (a (FST x) INTER b (SND x))) =
687           (\x. Normal (y (SND x)) * measure m ((\(i,j). a i INTER b j) x))`
688     >- RW_TAC std_ss [] \\
689     RW_TAC std_ss [FUN_EQ_THM] \\
690     Cases_on `x'` >> RW_TAC std_ss [FST, SND])
691 >> CONJ_TAC
692 >- FULL_SIMP_TAC std_ss [IMAGE_FINITE, FINITE_CROSS, pos_simple_fn_def]
693 >> CONJ_TAC
694 >- (RW_TAC std_ss [IN_IMAGE] \\
695     FULL_SIMP_TAC std_ss [o_DEF] \\
696     (MP_TAC o Q.ISPEC `x':num#num`) pair_CASES \\
697     (MP_TAC o Q.ISPEC `x'':num#num`) pair_CASES \\
698     RW_TAC std_ss [] \\
699     RW_TAC std_ss [] \\
700     METIS_TAC [IN_CROSS, pos_simple_fn_def, FST])
701 >> CONJ_TAC
702 >- (RW_TAC std_ss [IN_IMAGE] \\
703     FULL_SIMP_TAC std_ss [o_DEF] \\
704     (MP_TAC o Q.ISPEC `x':num#num`) pair_CASES \\
705     (MP_TAC o Q.ISPEC `x'':num#num`) pair_CASES \\
706     RW_TAC std_ss [] \\
707     RW_TAC std_ss [] \\
708     METIS_TAC [IN_CROSS, pos_simple_fn_def, SND])
709 >> CONJ_TAC
710 >- (RW_TAC std_ss [IN_DISJOINT, IN_IMAGE, EXTENSION, NOT_IN_EMPTY, IN_INTER] \\
711     FULL_SIMP_TAC std_ss [o_DEF] \\
712     (MP_TAC o Q.ISPEC `x':num#num`) pair_CASES \\
713     (MP_TAC o Q.ISPEC `x'':num#num`) pair_CASES \\
714     RW_TAC std_ss [] \\
715     RW_TAC std_ss [] \\
716     SPOSE_NOT_THEN STRIP_ASSUME_TAC \\
717     FULL_SIMP_TAC std_ss [IN_INTER, IN_CROSS, FST, SND, pos_simple_fn_def,
718                           DISJOINT_DEF] \\
719     METIS_TAC [EXTENSION, NOT_IN_EMPTY, IN_INTER])
720 >> CONJ_TAC
721 >- (RW_TAC std_ss [IN_IMAGE] \\
722     FULL_SIMP_TAC std_ss [o_DEF] \\
723     (MP_TAC o Q.ISPEC `x':num#num`) pair_CASES \\
724     RW_TAC std_ss [] \\
725     FULL_SIMP_TAC std_ss [IN_CROSS, FST, SND, pos_simple_fn_def] \\
726     METIS_TAC [ALGEBRA_INTER, subsets_def, space_def,
727                sigma_algebra_def, measure_space_def])
728 >> RW_TAC std_ss [Once EXTENSION, IN_BIGUNION, IN_IMAGE, IN_CROSS]
729 >> `!s'' x. (?x'. ((x = p' x') /\ FST x' IN s /\ SND x' IN s')) =
730             (?x1 x2. ((x = p' (x1,x2)) /\ x1 IN s /\ x2 IN s'))`
731      by METIS_TAC [PAIR, FST, SND]
732 >> POP_ORW
733 >> `!s''. (?x. (s'' = (\(i,j). a i INTER b j) (p x)) /\
734                ?x1 x2. (x = p' (x1,x2)) /\ x1 IN s /\ x2 IN s') <=>
735           (?x1 x2. (s'' = (\(i,j). a i INTER b j) (p (p' (x1,x2)))) /\
736                    x1 IN s /\ x2 IN s')`
737      by METIS_TAC []
738 >> POP_ORW
739 >> FULL_SIMP_TAC std_ss [o_DEF, IN_CROSS]
740 >> `!s''. (?x1 x2. (s'' = (\(i,j). a i INTER b j) (p (p' (x1,x2)))) /\
741                    x1 IN s /\ x2 IN s') <=>
742           (?x1 x2. (s'' = (\(i,j). a i INTER b j) (x1,x2)) /\
743                    x1 IN s /\ x2 IN s')`
744      by METIS_TAC [FST,SND]
745 >> POP_ORW
746 >> RW_TAC std_ss []
747 >> Suff `(?x1 x2. x' IN a x1 INTER b x2 /\ x1 IN s /\ x2 IN s') <=>
748          x' IN m_space m` >- METIS_TAC []
749 >> RW_TAC std_ss [IN_INTER]
750 >> FULL_SIMP_TAC std_ss [pos_simple_fn_def]
751 >> `m_space m = (BIGUNION (IMAGE a s)) INTER (BIGUNION (IMAGE b s'))`
752      by METIS_TAC [INTER_IDEMPOT]
753 >> POP_ORW
754 >> Q.PAT_X_ASSUM `BIGUNION (IMAGE b s') = m_space m` (K ALL_TAC)
755 >> Q.PAT_X_ASSUM `BIGUNION (IMAGE a s) = m_space m` (K ALL_TAC)
756 >> RW_TAC std_ss [IN_INTER, IN_BIGUNION, IN_IMAGE]
757 >> METIS_TAC []
758QED
759
760(* z/z' c is the standard representation of f/g *)
761Theorem psfis_present :
762    !m f g a b.
763       measure_space m /\
764       a IN psfis m f /\ b IN psfis m g ==>
765       ?z z' c (k:num->bool).
766          (!t. t IN m_space m ==> (f t = SIGMA (\i. Normal (z  i) * (indicator_fn (c i) t)) k)) /\
767          (!t. t IN m_space m ==> (g t = SIGMA (\i. Normal (z' i) * (indicator_fn (c i) t)) k)) /\
768          (a = pos_simple_fn_integral m k c z) /\
769          (b = pos_simple_fn_integral m k c z') /\
770          FINITE k /\ (!i. i IN k ==> 0 <= z i) /\ (!i. i IN k ==> 0 <= z' i) /\
771          (!i j. i IN k /\ j IN k /\ i <> j ==> DISJOINT (c i) (c j)) /\
772          (!i. i IN k ==> c i IN measurable_sets m) /\
773          (BIGUNION (IMAGE c k) = m_space m)
774Proof
775    RW_TAC std_ss [psfis_def, IN_IMAGE, psfs_def, GSPECIFICATION]
776 >> Cases_on `x'` >> Cases_on `x` >> Cases_on `x''` >> Cases_on `x'''`
777 >> Cases_on `r'` >> Cases_on `r` >> Cases_on `r''` >> Cases_on `r'''`
778 >> RW_TAC std_ss []
779 >> FULL_SIMP_TAC std_ss [PAIR_EQ]
780 >> MATCH_MP_TAC pos_simple_fn_integral_present >> art []
781QED
782
783(* ------------------------------------------------------ *)
784(*        Properties of POSTIVE SIMPLE FUNCTIONS          *)
785(* ------------------------------------------------------ *)
786
787Theorem pos_simple_fn_thm1:
788    !m f s a x i y. measure_space m /\ pos_simple_fn m f s a x /\
789                    i IN s /\ y IN a i ==> (f y = Normal (x i))
790Proof
791  RW_TAC std_ss [pos_simple_fn_def]
792  >> `y IN m_space m` by METIS_TAC [MEASURE_SPACE_SUBSET_MSPACE,SUBSET_DEF]
793  >> `FINITE (s DELETE i)` by RW_TAC std_ss [FINITE_DELETE]
794  >> (MP_TAC o Q.SPEC `i` o UNDISCH o
795      Q.SPECL [`(\i. Normal (x i) * indicator_fn (a i) y)`,`s DELETE i`])
796         (INST_TYPE [alpha |-> ``:num``] EXTREAL_SUM_IMAGE_PROPERTY)
797  >> `!x'. (\i. Normal (x i) * indicator_fn (a i) y) x' <> NegInf`
798        by (RW_TAC std_ss [indicator_fn_def,mul_rone,mul_rzero] \\
799            RW_TAC std_ss [extreal_of_num_def,extreal_not_infty])
800  >> RW_TAC std_ss [INSERT_DELETE,DELETE_DELETE]
801  >> `!j. j IN (s DELETE i) ==> ~(y IN a j)`
802            by (RW_TAC std_ss [IN_DELETE]
803                >> `DISJOINT (a i) (a j)` by METIS_TAC []
804                >> FULL_SIMP_TAC std_ss [DISJOINT_DEF,INTER_DEF,EXTENSION,GSPECIFICATION,NOT_IN_EMPTY]
805                >> METIS_TAC [])
806  >> (MP_TAC o Q.ISPEC `(\i:num. Normal (x i) * indicator_fn (a i) y)`
807      o UNDISCH o Q.SPEC `s DELETE i`) EXTREAL_SUM_IMAGE_IN_IF
808  >> `!x'. (\i. Normal (x i) * indicator_fn (a i) y) x' <> NegInf`
809        by (RW_TAC std_ss [indicator_fn_def,mul_rone,mul_rzero] \\
810            RW_TAC std_ss [extreal_of_num_def,extreal_not_infty])
811  >> RW_TAC std_ss []
812  >> `!j. j IN s DELETE i ==> (indicator_fn (a j) y = 0)`
813     by RW_TAC std_ss [indicator_fn_def,mul_rone,mul_rzero]
814  >> RW_TAC std_ss [mul_rzero,EXTREAL_SUM_IMAGE_ZERO,add_rzero,indicator_fn_def,mul_rone]
815QED
816
817Theorem pos_simple_fn_le :
818    !m f g s a x x' i. measure_space m /\
819                       pos_simple_fn m f s a x /\ pos_simple_fn m g s a x' /\
820                       (!x. x IN m_space m ==> g x <= f x) /\
821                       i IN s /\ ~(a i = {}) ==> (Normal (x' i) <= Normal (x i))
822Proof
823    RW_TAC std_ss []
824 >> `!t. t IN a i ==> (f t = Normal (x i))` by METIS_TAC [pos_simple_fn_thm1]
825 >> `!t. t IN a i ==> (g t = Normal (x' i))` by METIS_TAC [pos_simple_fn_thm1]
826 >> METIS_TAC [CHOICE_DEF, pos_simple_fn_def, MEASURE_SPACE_SUBSET_MSPACE, SUBSET_DEF]
827QED
828
829(* added some missing quantifiers *)
830Theorem pos_simple_fn_cmul :
831    !m f z s a x. measure_space m /\ pos_simple_fn m f s a x /\ 0 <= z ==>
832                  ?s' a' x'. pos_simple_fn m (\t. Normal z * f t) s' a' x'
833Proof
834    RW_TAC std_ss [pos_simple_fn_def]
835 >> Q.EXISTS_TAC `s` >> Q.EXISTS_TAC `a` >> Q.EXISTS_TAC `(\i. z * (x i))`
836 >> RW_TAC std_ss [REAL_LE_MUL, GSYM extreal_mul_def]
837 >- METIS_TAC [extreal_le_def, extreal_of_num_def, le_mul]
838 >> (MP_TAC o Q.SPECL [`(\i. Normal (x i) * indicator_fn (a i) t)`,`z`] o
839     UNDISCH o Q.ISPEC `s:num->bool`) EXTREAL_SUM_IMAGE_CMUL
840 >> `!x'. (\i. Normal (x i) * indicator_fn (a i) t) x' <> NegInf`
841        by (RW_TAC std_ss [indicator_fn_def,mul_rone,mul_rzero] \\
842            RW_TAC std_ss [extreal_of_num_def,extreal_not_infty])
843 >> FULL_SIMP_TAC std_ss [mul_assoc]
844QED
845
846Theorem pos_simple_fn_cmul_alt:
847    !m f s a x z. measure_space m /\ 0 <= z /\ pos_simple_fn m f s a x ==>
848                  pos_simple_fn m (\t. Normal z * f t) s a (\i. z * x i)
849Proof
850  RW_TAC std_ss [pos_simple_fn_def, REAL_LE_MUL, GSYM extreal_mul_def]
851  >- METIS_TAC [extreal_le_def, extreal_of_num_def, le_mul]
852  >> (MP_TAC o Q.SPECL [`(\i. Normal (x i) * indicator_fn (a i) t)`,`z`] o
853      UNDISCH o Q.ISPEC `s:num->bool`) EXTREAL_SUM_IMAGE_CMUL
854  >> `!x'. (\i. Normal (x i) * indicator_fn (a i) t) x' <> NegInf`
855        by (RW_TAC std_ss [indicator_fn_def, mul_rone, mul_rzero]
856            >> RW_TAC std_ss [extreal_of_num_def, extreal_not_infty])
857  >> FULL_SIMP_TAC std_ss [mul_assoc]
858QED
859
860(* added some missing quantifiers *)
861Theorem pos_simple_fn_add :
862    !m f g s a x s' a' x'.
863       measure_space m /\ pos_simple_fn m f s a x /\ pos_simple_fn m g s' a' x' ==>
864       ?s'' a'' x''. pos_simple_fn m (\t. f t + g t) s'' a'' x''
865Proof
866    rpt STRIP_TAC
867 >> (MP_TAC o Q.SPECL [`m`,`f`,`s`,`a`,`x`,`g`,`s'`,`a'`,`x'`]) pos_simple_fn_integral_present
868 >> RW_TAC std_ss []
869 >> Q.EXISTS_TAC `k`
870 >> Q.EXISTS_TAC `c` >> Q.EXISTS_TAC `(\i. z i + z' i)`
871 >> RW_TAC std_ss [pos_simple_fn_def, REAL_LE_ADD, GSYM extreal_add_def]
872 >- METIS_TAC [le_add, pos_simple_fn_def]
873 >> `!i. i IN k ==> Normal (z i) <> NegInf /\ Normal (z' i) <> NegInf /\
874                    0 <= Normal (z i) /\ 0 <= Normal (z' i)`
875         by METIS_TAC [extreal_not_infty,extreal_of_num_def,extreal_le_def]
876 >> `!i. i IN k ==> (\i. (Normal (z i) + Normal (z' i)) * indicator_fn (c i) t) i <> NegInf`
877         by METIS_TAC [extreal_add_def, indicator_fn_def, mul_rzero, mul_rone, extreal_of_num_def,
878                       extreal_not_infty]
879 >> (MP_TAC o Q.SPEC `(\i:num. (Normal (z i) + Normal (z' i)) *  indicator_fn (c i) t)`
880      o UNDISCH o Q.ISPEC `k:num->bool`) EXTREAL_SUM_IMAGE_IN_IF
881 >> RW_TAC std_ss [add_rdistrib]
882 >> (MP_TAC o Q.SPEC `(\x. Normal (z x) * indicator_fn (c x) t + Normal (z' x) * indicator_fn (c x) t)`
883      o UNDISCH o Q.ISPEC `k:num->bool` o GSYM) EXTREAL_SUM_IMAGE_IN_IF
884 >> `!x. x IN k ==> NegInf <>
885       (\x. Normal (z x) * indicator_fn (c x) t + Normal (z' x) * indicator_fn (c x) t) x`
886        by (RW_TAC std_ss [extreal_add_def,indicator_fn_def,mul_rzero,mul_rone,add_rzero]
887            >> METIS_TAC [extreal_of_num_def,extreal_not_infty])
888 >> RW_TAC std_ss []
889 >> `(\x. Normal (z x) * indicator_fn (c x) t + Normal (z' x) * indicator_fn (c x) t) =
890     (\x. (\x. Normal (z x) * indicator_fn (c x) t) x + (\x. Normal (z' x) * indicator_fn (c x) t) x)`
891        by METIS_TAC []
892 >> POP_ORW
893 >> (MP_TAC o Q.SPECL [`(\x:num. Normal (z x) * indicator_fn (c x) t)`,
894                       `(\x:num. Normal (z' x) * indicator_fn (c x) t)`]
895      o UNDISCH o Q.ISPEC `k:num->bool` o GSYM) EXTREAL_SUM_IMAGE_ADD
896 >> `!x:num. x IN k ==> NegInf <> (\x:num. Normal (z x) * indicator_fn (c x) t) x /\
897                        NegInf <> (\x:num. Normal (z' x) * indicator_fn (c x) t) x`
898        by (RW_TAC std_ss [indicator_fn_def, mul_rone, mul_rzero, add_rzero] \\
899            METIS_TAC [extreal_of_num_def, extreal_not_infty])
900 >> METIS_TAC []
901QED
902
903Theorem pos_simple_fn_add_alt:
904    !m f g s a x y. measure_space m /\
905                    pos_simple_fn m f s a x /\ pos_simple_fn m g s a y
906                ==> pos_simple_fn m (\t. f t + g t) s a (\i. x i + y i)
907Proof
908  RW_TAC std_ss [pos_simple_fn_def,REAL_LE_ADD,GSYM extreal_add_def,le_add]
909  >> `!i. i IN s ==> Normal (x i) <> NegInf /\ Normal (y i) <> NegInf /\ 0 <= Normal (x i) /\ 0 <= Normal (y i)`
910         by METIS_TAC [extreal_not_infty,extreal_of_num_def,extreal_le_def]
911  >> `!i. i IN s ==> (\i. (Normal (x i) + Normal (y i)) * indicator_fn (a i) t) i <> NegInf`
912         by METIS_TAC [extreal_add_def,indicator_fn_def,mul_rzero,mul_rone,extreal_of_num_def,extreal_not_infty]
913  >> (MP_TAC o Q.SPEC `(\i:num. (Normal (x i) + Normal (y i)) *  indicator_fn (a i) t)`
914      o UNDISCH o Q.ISPEC `s:num->bool`) EXTREAL_SUM_IMAGE_IN_IF
915  >> RW_TAC std_ss [add_rdistrib]
916  >> (MP_TAC o Q.SPEC `(\i. Normal (x i) * indicator_fn (a i) t + Normal (y i) * indicator_fn (a i) t)`
917      o UNDISCH o Q.ISPEC `s:num->bool` o GSYM) EXTREAL_SUM_IMAGE_IN_IF
918  >> `!i. i IN s ==>  NegInf <>
919       (\i. Normal (x i) * indicator_fn (a i) t + Normal (y i) * indicator_fn (a i) t) i`
920        by (RW_TAC std_ss [extreal_add_def,indicator_fn_def,mul_rzero,mul_rone,add_rzero]
921            >> METIS_TAC [extreal_of_num_def,extreal_not_infty])
922  >> RW_TAC std_ss []
923  >> `(\i. Normal (x i) * indicator_fn (a i) t + Normal (y i) * indicator_fn (a i) t) =
924      (\i. (\i. Normal (x i) * indicator_fn (a i) t) i + (\i. Normal (y i) * indicator_fn (a i) t) i)`
925           by METIS_TAC []
926  >> POP_ORW
927  >> (MP_TAC o Q.SPECL [`(\i:num. Normal (x i) * indicator_fn (a i) t)`,
928                        `(\i:num. Normal (y i) * indicator_fn (a i) t)`]
929      o UNDISCH o Q.ISPEC `s:num->bool` o GSYM) EXTREAL_SUM_IMAGE_ADD
930  >> `!i:num. i IN s ==> NegInf <> (\i:num. Normal (x i) * indicator_fn (a i) t) i /\
931                         NegInf <> (\i:num. Normal (y i) * indicator_fn (a i) t) i`
932        by (RW_TAC std_ss [indicator_fn_def,mul_rone,mul_rzero,add_rzero]
933            >> METIS_TAC [extreal_of_num_def,extreal_not_infty])
934  >> METIS_TAC []
935QED
936
937Theorem pos_simple_fn_indicator:
938    !m A. measure_space m /\ A IN measurable_sets m ==>
939          ?s a x. pos_simple_fn m (indicator_fn A) s a x
940Proof
941    RW_TAC std_ss []
942 >> `FINITE {0:num; 1:num}` by METIS_TAC [FINITE_INSERT, FINITE_SING]
943 >> Q.EXISTS_TAC `{0:num; 1:num}`
944 >> Q.EXISTS_TAC `(\i. if i = 0 then (m_space m DIFF A) else A)`
945 >> Q.EXISTS_TAC `(\i. if i = 0 then 0 else 1)`
946 >> RW_TAC std_ss [pos_simple_fn_def, indicator_fn_def, FINITE_SING, IN_SING,
947                   MEASURE_SPACE_MSPACE_MEASURABLE]
948 >| [ (* goal 1 (of 6) *)
949      METIS_TAC [le_01, le_refl],
950      (* goal 2 (of 6) *)
951     `FINITE {1:num}` by METIS_TAC [FINITE_SING] \\
952      Know `{1:num} DELETE 0 = {1}`
953      >- (RW_TAC std_ss [DELETE_DEF, DIFF_DEF, IN_SING] \\
954          RW_TAC std_ss [EXTENSION, IN_SING] \\
955          RW_TAC std_ss [GSPECIFICATION] \\
956          EQ_TAC >- RW_TAC arith_ss [] \\
957          RW_TAC arith_ss []) >> DISCH_TAC \\
958      (MP_TAC o Q.SPEC `0` o UNDISCH o
959       Q.ISPECL [`(\i:num. Normal (if i = 0 then 0 else 1) *
960                           if t IN if i = 0 then m_space m DIFF A else A then 1 else 0)`, `{1:num}`])
961          EXTREAL_SUM_IMAGE_PROPERTY \\
962     `!x. (\i:num. Normal (if i = 0 then 0 else 1) *
963                   if t IN if i = 0 then m_space m DIFF A else A then 1 else 0) x <> NegInf`
964           by (RW_TAC std_ss [mul_rone,mul_rzero] \\
965               RW_TAC std_ss [extreal_of_num_def,extreal_not_infty]) \\
966      RW_TAC real_ss [EXTREAL_SUM_IMAGE_SING, extreal_of_num_def, extreal_mul_def, extreal_add_def],
967      (* goal 3 (of 6) *)
968      METIS_TAC [MEASURE_SPACE_DIFF, MEASURE_SPACE_MSPACE_MEASURABLE],
969      (* goal 4 (of 6) *)
970      RW_TAC real_ss [],
971      (* goal 5 (of 6) *)
972      FULL_SIMP_TAC std_ss [DISJOINT_DEF, EXTENSION, GSPECIFICATION, IN_INTER, IN_DIFF,
973                            NOT_IN_EMPTY, IN_INSERT, IN_SING] \\
974      METIS_TAC [],
975      (* goal 6 (of 6) *)
976      RW_TAC std_ss [IMAGE_DEF] \\
977     `{if i:num = 0 then m_space m DIFF A else A | i IN {0; 1}} = {m_space m DIFF A; A}`
978             by (RW_TAC std_ss [EXTENSION, GSPECIFICATION, IN_INSERT, IN_SING] \\
979                 EQ_TAC >- METIS_TAC [] \\
980                 RW_TAC std_ss [] >- METIS_TAC [] \\
981                 Q.EXISTS_TAC `1:num` \\
982                 RW_TAC real_ss []) \\
983      RW_TAC std_ss [BIGUNION_INSERT, BIGUNION_SING] \\
984      METIS_TAC [UNION_DIFF, MEASURE_SPACE_SUBSET_MSPACE] ]
985QED
986
987Theorem pos_simple_fn_indicator_alt:
988    !m s. measure_space m /\ s IN measurable_sets m ==>
989          pos_simple_fn m (indicator_fn s) {0:num;1:num}
990                        (\i:num. if i = 0 then (m_space m DIFF s) else s)
991                        (\i. if i = 0 then 0 else 1)
992Proof
993    RW_TAC std_ss []
994 >> `FINITE {0:num;1:num}` by METIS_TAC [FINITE_INSERT, FINITE_SING]
995 >> RW_TAC real_ss [pos_simple_fn_def, indicator_fn_def, FINITE_SING, IN_SING,
996                    MEASURE_SPACE_MSPACE_MEASURABLE]
997 >| [ (* goal 1 (of 6) *)
998      METIS_TAC [le_01, le_refl],
999      (* goal 2 (of 6) *)
1000     `FINITE {1:num}` by METIS_TAC [FINITE_SING] \\
1001      Know `{1:num} DELETE 0 = {1}`
1002      >- (RW_TAC std_ss [DELETE_DEF, DIFF_DEF, IN_SING] \\
1003          RW_TAC std_ss [EXTENSION, IN_SING] \\
1004          RW_TAC std_ss [GSPECIFICATION] \\
1005          EQ_TAC >- RW_TAC arith_ss [] \\
1006          RW_TAC arith_ss []) >> DISCH_TAC \\
1007     (MP_TAC o Q.SPEC `0` o UNDISCH o
1008      Q.ISPECL [`(\i:num. Normal (if i = 0 then 0 else 1) *
1009                     if t IN if i = 0 then m_space m DIFF s else s then 1 else 0)`, `{1:num}`])
1010        EXTREAL_SUM_IMAGE_PROPERTY \\
1011     `!x. (\i:num. Normal (if i = 0 then 0 else 1) *
1012              if t IN if i = 0 then m_space m DIFF s else s then 1 else 0) x <> NegInf`
1013           by (RW_TAC std_ss [mul_rone,mul_rzero] \\
1014               RW_TAC std_ss [extreal_of_num_def, extreal_not_infty]) \\
1015      RW_TAC real_ss [EXTREAL_SUM_IMAGE_SING, extreal_of_num_def, extreal_mul_def,
1016                      extreal_add_def],
1017      (* goal 3 (of 6) *)
1018      METIS_TAC [MEASURE_SPACE_DIFF, MEASURE_SPACE_MSPACE_MEASURABLE],
1019      (* goal 4 (of 6) *)
1020      RW_TAC real_ss [],
1021      (* goal 5 (of 6) *)
1022      FULL_SIMP_TAC std_ss [DISJOINT_DEF, EXTENSION, GSPECIFICATION, IN_INTER, IN_DIFF,
1023                            NOT_IN_EMPTY, IN_INSERT, IN_SING] \\
1024      METIS_TAC [],
1025      (* goal 6 (of 6) *)
1026      RW_TAC std_ss [IMAGE_DEF] \\
1027     `{if i:num = 0 then m_space m DIFF s else s | i IN {0; 1}} = {m_space m DIFF s; s}`
1028             by (RW_TAC std_ss [EXTENSION, GSPECIFICATION, IN_INSERT, IN_SING]
1029                 >> EQ_TAC >- METIS_TAC []
1030                 >> RW_TAC std_ss [] >- METIS_TAC []
1031                 >> Q.EXISTS_TAC `1:num`
1032                 >> RW_TAC real_ss []) \\
1033      RW_TAC std_ss [BIGUNION_INSERT, BIGUNION_SING] \\
1034      METIS_TAC [UNION_DIFF, MEASURE_SPACE_SUBSET_MSPACE] ]
1035QED
1036
1037Theorem pos_simple_fn_max:
1038    !m f (s:num->bool) a x g (s':num->bool) b y.
1039         measure_space m /\ pos_simple_fn m f s a x /\ pos_simple_fn m g s' b y ==>
1040         ?s'' a'' x''. pos_simple_fn m (\x. max (f x) (g x)) s'' a'' x''
1041Proof
1042    RW_TAC std_ss []
1043 >> `?p n. BIJ p (count n) (s CROSS s')`
1044     by FULL_SIMP_TAC std_ss [GSYM FINITE_BIJ_COUNT, pos_simple_fn_def, FINITE_CROSS]
1045 >> `?p'. BIJ p' (s CROSS s') (count n) /\ (!x. x IN (count n) ==> ((p' o p) x = x))
1046           /\ (!x. x IN (s CROSS s') ==> ((p o p') x = x))`
1047     by (MATCH_MP_TAC BIJ_INV >> RW_TAC std_ss [])
1048 >> Q.EXISTS_TAC `IMAGE p' (s CROSS s')`
1049 >> Q.EXISTS_TAC `(\(i,j). a i INTER b j) o p`
1050 >> Q.EXISTS_TAC `(\n. max ((x o FST o p) n) ((y o SND o p)n))`
1051 >> RW_TAC std_ss [FUN_EQ_THM]
1052 >> FULL_SIMP_TAC std_ss [pos_simple_fn_def,extreal_max_def]
1053 >> `!i j. i IN IMAGE p' (s CROSS s') /\ j IN IMAGE p' (s CROSS s') /\ i <> j ==>
1054           DISJOINT (((\(i,j). a i INTER b j) o p) i) (((\(i,j). a i INTER b j) o p) j)`
1055    by (RW_TAC std_ss [DISJOINT_DEF, IN_IMAGE]
1056        >> RW_TAC std_ss [Once EXTENSION, NOT_IN_EMPTY, IN_INTER]
1057        >> FULL_SIMP_TAC std_ss [o_DEF]
1058        >> (MP_TAC o Q.ISPEC `x':num#num`) pair_CASES
1059        >> (MP_TAC o Q.ISPEC `x'':num#num`) pair_CASES
1060        >> RW_TAC std_ss []
1061        >> RW_TAC std_ss []
1062        >> SPOSE_NOT_THEN STRIP_ASSUME_TAC
1063        >> FULL_SIMP_TAC std_ss [IN_INTER, IN_CROSS, FST, SND, pos_simple_fn_def,DISJOINT_DEF]
1064        >> METIS_TAC [EXTENSION, NOT_IN_EMPTY, IN_INTER])
1065 >> `!i. i IN IMAGE p' (s CROSS s') ==>  ((\(i,j). a i INTER b j) o p) i IN measurable_sets m`
1066    by (RW_TAC std_ss [IN_IMAGE]
1067        >> FULL_SIMP_TAC std_ss [o_DEF]
1068        >> (MP_TAC o Q.ISPEC `x':num#num`) pair_CASES
1069               >> RW_TAC std_ss []
1070        >> FULL_SIMP_TAC std_ss [IN_CROSS, FST, SND, pos_simple_fn_def]
1071        >> METIS_TAC [ALGEBRA_INTER, subsets_def, space_def,sigma_algebra_def, measure_space_def])
1072 >> `BIGUNION (IMAGE ((\(i,j). a i INTER b j) o p) (IMAGE p' (s CROSS s'))) = m_space m`
1073    by (RW_TAC std_ss [Once EXTENSION, IN_BIGUNION, IN_IMAGE, IN_CROSS]
1074        >> `!s'' x. (?x'. ((x = p' x') /\ FST x' IN s /\ SND x' IN s')) <=>
1075                    (?x1 x2. ((x = p' (x1,x2)) /\ x1 IN s /\ x2 IN s'))`
1076            by METIS_TAC [PAIR, FST, SND]
1077        >> POP_ORW
1078        >> `!s''. (?x. (s'' = (\(i,j). a i INTER b j) (p x)) /\
1079                                       ?x1 x2. (x = p' (x1,x2)) /\ x1 IN s /\ x2 IN s') <=>
1080                  (?x1 x2. (s'' = (\(i,j). a i INTER b j) (p (p' (x1,x2)))) /\  x1 IN s /\ x2 IN s')`
1081            by METIS_TAC []
1082        >> POP_ORW
1083        >> FULL_SIMP_TAC std_ss [o_DEF, IN_CROSS]
1084        >> `!s''. (?x1 x2. (s'' = (\(i,j). a i INTER b j) (p (p' (x1,x2)))) /\ x1 IN s /\ x2 IN s') <=>
1085                  (?x1 x2. (s'' = (\(i,j). a i INTER b j) (x1,x2)) /\ x1 IN s /\ x2 IN s')`
1086            by METIS_TAC [FST,SND]
1087        >> POP_ORW
1088        >> RW_TAC std_ss []
1089        >> Suff `(?x1 x2. x' IN a x1 INTER b x2 /\ x1 IN s /\ x2 IN s') <=> x' IN m_space m`
1090        >- METIS_TAC []
1091        >> RW_TAC std_ss [IN_INTER]
1092        >> FULL_SIMP_TAC std_ss [pos_simple_fn_def]
1093        >> `m_space m = (BIGUNION (IMAGE a s)) INTER (BIGUNION (IMAGE b s'))`
1094            by METIS_TAC [INTER_IDEMPOT]
1095        >> POP_ORW
1096        >> Q.PAT_X_ASSUM `BIGUNION (IMAGE b s') = m_space m` (K ALL_TAC)
1097        >> Q.PAT_X_ASSUM `BIGUNION (IMAGE a s) = m_space m` (K ALL_TAC)
1098        >> RW_TAC std_ss [IN_INTER, IN_BIGUNION, IN_IMAGE]
1099        >> METIS_TAC [])
1100 >> `FINITE (s CROSS s')` by RW_TAC std_ss [FINITE_CROSS]
1101 >> `INJ p' (s CROSS s')(IMAGE p' (s CROSS s'))` by METIS_TAC [INJ_IMAGE_BIJ, BIJ_DEF]
1102 >> `FINITE (IMAGE p' (s CROSS s'))` by RW_TAC std_ss [IMAGE_FINITE]
1103 >> FULL_SIMP_TAC std_ss []
1104 >> CONJ_TAC >- METIS_TAC []
1105 >> reverse CONJ_TAC
1106 >- (RW_TAC std_ss [max_def] >> FULL_SIMP_TAC std_ss [IN_IMAGE,IN_CROSS])
1107 >> RW_TAC std_ss []
1108 >- ((MP_TAC o Q.SPEC `(\i. Normal (y i) * indicator_fn (b i) x')` o UNDISCH o
1109       Q.ISPEC `(s' :num -> bool)`) EXTREAL_SUM_IMAGE_IN_IF
1110     >> `!x. (\i. Normal (y i) * indicator_fn (b i) x') x <> NegInf`
1111           by (RW_TAC std_ss [indicator_fn_def,mul_rone,mul_rzero]
1112               >> RW_TAC std_ss [extreal_of_num_def,extreal_not_infty])
1113     >> RW_TAC std_ss []
1114     >> POP_ASSUM (K ALL_TAC)
1115     >> `(\x. (if x IN s' then (\i. Normal (y i) * indicator_fn (b i) x') x else 0)) =
1116         (\x. (if x IN s' then (\i. Normal (y i) *
1117                                     SIGMA (\j. indicator_fn (a j INTER b i) x') s) x else 0))`
1118          by (RW_TAC std_ss [FUN_EQ_THM]
1119              >> RW_TAC std_ss []
1120              >> FULL_SIMP_TAC std_ss [GSYM AND_IMP_INTRO]
1121              >> (MP_TAC o REWRITE_RULE [Once INTER_COMM] o Q.ISPEC `(b :num -> 'a set) (x'' :num)`
1122                  o UNDISCH_ALL o REWRITE_RULE [GSYM AND_IMP_INTRO]
1123                  o Q.ISPECL [`(s :num -> bool)`, `m_space (m: 'a m_space)`,
1124                              `(a :num -> 'a set)`]) indicator_fn_split
1125              >> Q.PAT_X_ASSUM `!i. i IN s' ==> (b:num->'a->bool) i IN measurable_sets m`
1126                     (ASSUME_TAC o UNDISCH o Q.SPEC `x''`)
1127              >> `!a m. measure_space m /\ a IN measurable_sets m ==> a SUBSET m_space m`
1128                  by RW_TAC std_ss [measure_space_def, sigma_algebra_def, algebra_def,
1129                                    subset_class_def, subsets_def, space_def]
1130              >> POP_ASSUM (ASSUME_TAC o UNDISCH_ALL o REWRITE_RULE [GSYM AND_IMP_INTRO] o
1131                            Q.ISPECL [`(b :num -> 'a set) (x'' :num)`,
1132                                      `(m :'a m_space)`])
1133              >> ASM_SIMP_TAC std_ss [])
1134     >> `(\x. if x IN s' then Normal (y x) * indicator_fn (b x) x' else 0) =
1135         (\x. if x IN s' then (\i. Normal (y i) * indicator_fn (b i) x') x else 0)`
1136          by METIS_TAC []
1137     >> POP_ORW
1138     >> POP_ORW
1139     >> `!(x:num) (i:num). Normal (y i) * SIGMA (\j. indicator_fn (a j INTER b i) x') s =
1140                            SIGMA (\j. Normal (y i) * indicator_fn (a j INTER b i) x') s`
1141           by (RW_TAC std_ss []
1142               >> (MP_TAC o Q.SPECL [`(\j. indicator_fn (a j INTER (b:num->'a->bool) i) x')`,`y (i:num)`]
1143                   o UNDISCH o Q.ISPEC `s:num->bool` o GSYM
1144                   o INST_TYPE [alpha |-> ``:num``, beta |-> ``:num``]) EXTREAL_SUM_IMAGE_CMUL
1145               >> `!x. NegInf <> (\j. indicator_fn (a j INTER b i) x') x`
1146                     by RW_TAC std_ss [indicator_fn_def,extreal_of_num_def,extreal_not_infty]
1147               >> RW_TAC std_ss [])
1148      >> POP_ORW
1149      >> (MP_TAC o Q.ISPEC `(\n':num. Normal (max (x (FST (p n'))) (y (SND (p n')))) *
1150                                      indicator_fn ((\(i:num,j:num). a i INTER b j) (p n')) x')`
1151          o UNDISCH o Q.SPEC `p'` o UNDISCH
1152          o (Q.ISPEC `((s:num->bool) CROSS (s':num->bool))`)
1153          o (INST_TYPE [``:'b``|->``:num``])) EXTREAL_SUM_IMAGE_IMAGE
1154      >> `!x''. (\n'. Normal (max (x (FST (p n'))) (y (SND (p n')))) *
1155                 indicator_fn ((\(i,j). a i INTER b j) (p n')) x') x'' <> NegInf`
1156                 by (RW_TAC std_ss [indicator_fn_def,mul_rone,mul_rzero]
1157                     >> RW_TAC std_ss [extreal_of_num_def,extreal_not_infty])
1158      >> RW_TAC std_ss [o_DEF]
1159      >> POP_ASSUM (K ALL_TAC)
1160      >> (MP_TAC o Q.SPEC `(\x''. Normal (max (x (FST ((p :num -> num # num) (p' x''))))
1161                                              (y (SND (p (p' x''))))) *
1162                                  indicator_fn ((\(i:num,j:num). a i INTER b j) (p (p' x''))) x')`
1163          o UNDISCH o Q.ISPEC `(s :num set) CROSS (s' :num set)`) EXTREAL_SUM_IMAGE_IN_IF
1164      >> `!x''. (\x''. Normal (max (x (FST (p (p' x'')))) (y (SND (p (p' x''))))) *
1165                      indicator_fn ((\(i,j). a i INTER b j) (p (p' x''))) x') x'' <> NegInf`
1166                 by (RW_TAC std_ss [indicator_fn_def,mul_rone,mul_rzero]
1167                     >> RW_TAC std_ss [extreal_of_num_def,extreal_not_infty])
1168      >> RW_TAC std_ss []
1169      >> NTAC 4 (POP_ASSUM (K ALL_TAC))
1170      >> `!x. (\j. Normal (y x) * indicator_fn (a j INTER b x) x') =
1171              (\x j. Normal (y x) * indicator_fn (a j INTER b x) x') x` by METIS_TAC []
1172      >> POP_ORW
1173      >> `!x. SIGMA ((\x j. Normal (y x) * indicator_fn (a j INTER b x) x') x) s <> NegInf`
1174            by (RW_TAC std_ss []
1175                >> `!j. Normal (y x'') * indicator_fn (a j INTER b x'') x' <> NegInf`
1176                      by (RW_TAC std_ss [indicator_fn_def,mul_rone,mul_rzero]
1177                          >> RW_TAC std_ss [extreal_of_num_def,extreal_not_infty])
1178                >> FULL_SIMP_TAC std_ss [EXTREAL_SUM_IMAGE_NOT_INFTY])
1179      >> RW_TAC std_ss [EXTREAL_SUM_IMAGE_IF_ELIM]
1180      >> (MP_TAC o Q.SPEC `(\x j. Normal (y x) * indicator_fn (a j INTER b x) x')`
1181          o Q.ISPECL [`s':num->bool`,`s:num->bool`]) EXTREAL_SUM_IMAGE_SUM_IMAGE
1182      >> `!x. NegInf <> (\x j. Normal (y x) * indicator_fn (a j INTER b x) x') (FST x) (SND x)`
1183              by (RW_TAC std_ss [indicator_fn_def,mul_rone,mul_rzero]
1184                  >> RW_TAC std_ss [extreal_of_num_def,extreal_not_infty])
1185      >> RW_TAC std_ss []
1186      >> `(s' CROSS s) = IMAGE (\x. (SND x, FST x)) (s CROSS s')`
1187              by (RW_TAC std_ss [Once EXTENSION, IN_CROSS, IN_IMAGE]
1188                  >> (MP_TAC o Q.ISPEC `x'':num#num`) pair_CASES
1189                  >> RW_TAC std_ss [] >> RW_TAC std_ss [FST,SND]
1190                  >> EQ_TAC
1191                  >- (STRIP_TAC >> Q.EXISTS_TAC `(r,q)` >> RW_TAC std_ss [FST,SND])
1192                  >> RW_TAC std_ss [] >> RW_TAC std_ss [])
1193      >> POP_ORW
1194      >> `INJ (\x. (SND x,FST x)) (s CROSS s') (IMAGE (\x. (SND x,FST x)) (s CROSS s'))`
1195              by (RW_TAC std_ss [INJ_DEF, IN_CROSS, IN_IMAGE]
1196                  >- METIS_TAC []
1197                  >> (MP_TAC o Q.ISPEC `x'':num#num`) pair_CASES
1198                  >> (MP_TAC o Q.ISPEC `x''':num#num`) pair_CASES
1199                  >> RW_TAC std_ss []
1200                  >> FULL_SIMP_TAC std_ss [FST,SND])
1201      >> (MP_TAC o Q.SPEC `(\x. Normal (y (FST x)) * indicator_fn (a (SND x) INTER b (FST x)) x')`
1202           o UNDISCH o Q.SPEC `(\x. (SND x, FST x))` o UNDISCH
1203           o Q.ISPEC `((s:num->bool) CROSS (s':num->bool))`
1204           o INST_TYPE [``:'b``|->``:num#num``]) EXTREAL_SUM_IMAGE_IMAGE
1205      >> `!x. (\x. Normal (y (FST x)) * indicator_fn (a (SND x) INTER b (FST x)) x') x <> NegInf`
1206              by (RW_TAC std_ss [indicator_fn_def,mul_rone,mul_rzero]
1207                  >> RW_TAC std_ss [extreal_of_num_def,extreal_not_infty])
1208      >> RW_TAC std_ss [o_DEF]
1209      >> Suff `!x'''. x''' IN (s CROSS s') ==>
1210                      ((\x. Normal (y (SND x)) * indicator_fn (a (FST x) INTER b (SND x)) x') x''' =
1211                       (\x''. if x'' IN s CROSS s' then
1212                                Normal (max (x (FST x'')) (y (SND x''))) *
1213                                indicator_fn ((\ (i,j). a i INTER b j) x'') x'
1214                              else 0) x''')`
1215      >- (RW_TAC std_ss []
1216           >> (MATCH_MP_TAC o UNDISCH o Q.ISPEC `(s:num->bool) CROSS (s':num->bool)`)
1217                 EXTREAL_SUM_IMAGE_EQ
1218           >> RW_TAC std_ss []
1219           >> DISJ1_TAC
1220           >> RW_TAC std_ss [indicator_fn_def,mul_rone,mul_rzero]
1221           >> RW_TAC std_ss [extreal_of_num_def,extreal_not_infty])
1222       >> RW_TAC std_ss [FUN_EQ_THM]
1223       >> Cases_on `x'''`
1224       >> RW_TAC real_ss [indicator_fn_def,mul_rone,mul_rzero]
1225       >> `q IN s` by METIS_TAC [IN_CROSS,FST,SND]
1226       >> `x' IN (a q)` by METIS_TAC [IN_INTER]
1227       >> `SIGMA (\i. Normal (x i) * indicator_fn (a i) x') s = Normal (x q)`
1228           by (`pos_simple_fn m f s a x` by FULL_SIMP_TAC std_ss [pos_simple_fn_def]
1229               >> METIS_TAC [pos_simple_fn_thm1])
1230       >> `r IN s'` by METIS_TAC [IN_CROSS,FST,SND]
1231       >> `x' IN (b r)` by METIS_TAC [IN_INTER]
1232       >> `SIGMA (\i. Normal (y i) * indicator_fn (b i) x') s' = Normal (y r)`
1233          by (`pos_simple_fn m g s' b y` by FULL_SIMP_TAC std_ss [pos_simple_fn_def]
1234              >> METIS_TAC [pos_simple_fn_thm1])
1235       >> FULL_SIMP_TAC std_ss [extreal_le_def,max_def])
1236  >> (MP_TAC o Q.SPEC `(\i. Normal (x i) * indicator_fn (a i) x')`
1237      o UNDISCH o Q.ISPEC `(s :num -> bool)`) EXTREAL_SUM_IMAGE_IN_IF
1238  >> `!x''. (\i. Normal (x i) * indicator_fn (a i) x') x'' <> NegInf`
1239         by (RW_TAC std_ss [indicator_fn_def,mul_rone,mul_rzero]
1240             >> RW_TAC std_ss [extreal_of_num_def,extreal_not_infty])
1241  >> RW_TAC std_ss []
1242  >> POP_ASSUM (K ALL_TAC)
1243  >> `(\x''. if x'' IN s then Normal (x x'') * indicator_fn (a x'') x' else 0) =
1244      (\x''. if x'' IN s then (\i. Normal (x i) * indicator_fn (a i) x') x'' else 0)`
1245          by METIS_TAC []
1246  >> POP_ORW
1247  >> `(\x''. (if x'' IN s then (\i. Normal (x i) * indicator_fn (a i) x') x'' else 0)) =
1248      (\x''. (if x'' IN s then (\i. Normal (x i) *
1249                                    SIGMA (\j. indicator_fn (a i INTER b j) x') s') x''
1250                          else 0))`
1251         by (RW_TAC std_ss [FUN_EQ_THM]
1252             >> RW_TAC std_ss []
1253             >> FULL_SIMP_TAC std_ss [GSYM AND_IMP_INTRO]
1254             >> (MP_TAC o Q.ISPEC `(a :num -> 'a set) (x'' :num)` o UNDISCH_ALL
1255                 o REWRITE_RULE [GSYM AND_IMP_INTRO]
1256                 o Q.ISPECL [`(s':num -> bool)`, `m_space (m :'a m_space)`,
1257                             `(b :num -> 'a set)`]) indicator_fn_split
1258             >> `a x'' SUBSET m_space m` by METIS_TAC [MEASURE_SPACE_SUBSET_MSPACE]
1259             >> RW_TAC std_ss [])
1260  >> POP_ORW
1261  >> `!(i:num). Normal (x i) * SIGMA (\j. indicator_fn (a i INTER b j) x') s' =
1262                SIGMA (\j. Normal (x i) * indicator_fn (a i INTER b j) x') s'`
1263         by (RW_TAC std_ss []
1264             >> (MP_TAC o
1265                 Q.SPECL [`(\j. indicator_fn ((a :num -> 'a set) i INTER b j) x')`, `x (i:num)`] o
1266                 UNDISCH o Q.ISPEC `s':num->bool` o GSYM o
1267                 INST_TYPE [alpha |-> ``:num``, beta |-> ``:num``]) EXTREAL_SUM_IMAGE_CMUL
1268             >> `!x. NegInf <> (\j. indicator_fn (a i INTER b j) x') x`
1269                    by RW_TAC std_ss [indicator_fn_def,extreal_of_num_def,extreal_not_infty]
1270             >> RW_TAC std_ss [])
1271  >> POP_ORW
1272  >> (MP_TAC o Q.ISPEC `(\n':num. Normal (max (x (FST (p n'))) (y (SND (p n')))) *
1273                         indicator_fn ((\(i:num,j:num). a i INTER b j) (p n')) x')` o
1274               UNDISCH o Q.SPEC `p'` o UNDISCH o
1275               Q.ISPEC `((s:num->bool) CROSS (s':num->bool))` o
1276               INST_TYPE [``:'b``|->``:num``]) EXTREAL_SUM_IMAGE_IMAGE
1277  >> `!x''. (\n'. Normal (max (x (FST (p n'))) (y (SND (p n')))) *
1278             indicator_fn ((\(i,j). a i INTER b j) (p n')) x') x'' <> NegInf`
1279              by (RW_TAC std_ss [indicator_fn_def,mul_rone,mul_rzero]
1280                  >> RW_TAC std_ss [extreal_of_num_def,extreal_not_infty])
1281  >> RW_TAC std_ss [o_DEF]
1282  >> POP_ASSUM (K ALL_TAC)
1283  >> (MP_TAC o Q.SPEC `(\x''. Normal (max (x (FST ((p :num -> num # num) (p' x''))))
1284                                          (y (SND (p (p' x''))))) *
1285                              indicator_fn ((\(i:num,j:num). a i INTER b j) (p (p' x''))) x')`
1286      o UNDISCH o Q.ISPEC `(s :num set) CROSS (s' :num set)`) EXTREAL_SUM_IMAGE_IN_IF
1287  >> `!x''. (\x''. Normal (max (x (FST (p (p' x'')))) (y (SND (p (p' x''))))) *
1288                   indicator_fn ((\(i,j). a i INTER b j) (p (p' x''))) x') x'' <> NegInf`
1289        by (RW_TAC std_ss [indicator_fn_def, mul_rone, mul_rzero] \\
1290            RW_TAC std_ss [extreal_of_num_def, extreal_not_infty])
1291  >> RW_TAC std_ss []
1292  >> NTAC 4 (POP_ASSUM (K ALL_TAC))
1293  >> `!x''. (\j. Normal (x x'') * indicator_fn (a x'' INTER b j) x') =
1294            (\x'' j. Normal (x x'') * indicator_fn (a x'' INTER b j) x') x''` by METIS_TAC []
1295  >> POP_ORW
1296  >> `!x''. SIGMA ((\x'' j. Normal (x x'') * indicator_fn (a x'' INTER b j) x') x'') s' <> NegInf`
1297        by (RW_TAC std_ss []
1298            >> `!j. Normal (x x'') * indicator_fn (a x'' INTER b j) x' <> NegInf`
1299                  by (RW_TAC std_ss [indicator_fn_def,mul_rone,mul_rzero]
1300                      >> RW_TAC std_ss [extreal_of_num_def,extreal_not_infty])
1301            >> FULL_SIMP_TAC std_ss [EXTREAL_SUM_IMAGE_NOT_INFTY])
1302  >> RW_TAC std_ss [EXTREAL_SUM_IMAGE_IF_ELIM]
1303  >> (MP_TAC o Q.SPEC `(\x'' j. Normal (x x'') * indicator_fn (a x'' INTER b j) x')`
1304      o Q.ISPECL [`s:num->bool`,`s':num->bool`]) EXTREAL_SUM_IMAGE_SUM_IMAGE
1305  >> `!x''. NegInf <> (\x'' j. Normal (x x'') * indicator_fn (a x'' INTER b j) x') (FST x'') (SND x'')`
1306            by (RW_TAC std_ss [indicator_fn_def,mul_rone,mul_rzero]
1307                >> RW_TAC std_ss [extreal_of_num_def,extreal_not_infty])
1308  >> RW_TAC std_ss []
1309  >> Suff `!x'''. x''' IN (s CROSS s') ==>
1310                 ((\x''. Normal (x (FST x'')) * indicator_fn (a (FST x'') INTER b (SND x'')) x') x''' =
1311                  (\x''. if x'' IN s CROSS s' then Normal (max (x (FST x'')) (y (SND x''))) *
1312                                                   indicator_fn ((\(i,j). a i INTER b j) x'') x'
1313                         else 0) x''')`
1314  >- (RW_TAC std_ss []
1315      >> (MATCH_MP_TAC o UNDISCH o Q.ISPEC `(s:num->bool) CROSS (s':num->bool)`) EXTREAL_SUM_IMAGE_EQ
1316      >> RW_TAC std_ss []
1317      >> DISJ1_TAC
1318      >> RW_TAC std_ss [indicator_fn_def,mul_rone,mul_rzero]
1319      >> RW_TAC std_ss [extreal_of_num_def,extreal_not_infty])
1320  >> RW_TAC std_ss [FUN_EQ_THM]
1321  >> Cases_on `x'''`
1322  >> RW_TAC real_ss [indicator_fn_def,mul_rone,mul_rzero]
1323  >> `q IN s` by METIS_TAC [IN_CROSS,FST,SND]
1324  >> `x' IN (a q)` by METIS_TAC [IN_INTER]
1325  >> `SIGMA (\i. Normal (x i) * indicator_fn (a i) x') s = Normal (x q)`
1326        by (`pos_simple_fn m f s a x` by FULL_SIMP_TAC std_ss [pos_simple_fn_def]
1327            >> METIS_TAC [pos_simple_fn_thm1])
1328  >> `r IN s'` by METIS_TAC [IN_CROSS,FST,SND]
1329  >> `x' IN (b r)` by METIS_TAC [IN_INTER]
1330  >> `SIGMA (\i. Normal (y i) * indicator_fn (b i) x') s' = Normal (y r)`
1331        by (`pos_simple_fn m g s' b y` by FULL_SIMP_TAC std_ss [pos_simple_fn_def]
1332            >> METIS_TAC [pos_simple_fn_thm1])
1333  >> FULL_SIMP_TAC std_ss [extreal_le_def,max_def]
1334QED
1335
1336Theorem pos_simple_fn_not_infty:
1337    !m f s a x. pos_simple_fn m f s a x ==>
1338                !x. x IN m_space m ==> f x <> NegInf /\ f x <> PosInf
1339Proof
1340    RW_TAC std_ss [pos_simple_fn_def]
1341 >> `(!i. i IN s ==> (\i. Normal (x i) * indicator_fn (a i) x') i <> NegInf)`
1342     by (RW_TAC std_ss [indicator_fn_def, mul_rzero, mul_rone] \\
1343         RW_TAC std_ss [extreal_of_num_def, extreal_not_infty])
1344 >> `(!i. i IN s ==> (\i. Normal (x i) * indicator_fn (a i) x') i <> PosInf)`
1345     by (RW_TAC std_ss [indicator_fn_def, mul_rzero, mul_rone] \\
1346         RW_TAC std_ss [extreal_of_num_def, extreal_not_infty])
1347 >> FULL_SIMP_TAC std_ss [EXTREAL_SUM_IMAGE_NOT_INFTY]
1348QED
1349
1350(* ************************************************************************* *)
1351(* Properties of Integrals of Positive Simple Functions                      *)
1352(* ************************************************************************* *)
1353
1354Theorem pos_simple_fn_integral_add :
1355    !m f (s :num -> bool) a x
1356       g (s':num -> bool) b y. measure_space m /\
1357                               pos_simple_fn m f s a x /\
1358                               pos_simple_fn m g s' b y ==>
1359       ?s'' c z. pos_simple_fn m (\x. f x + g x) s'' c z /\
1360                (pos_simple_fn_integral m s a x +
1361                 pos_simple_fn_integral m s' b y =
1362                 pos_simple_fn_integral m s'' c z)
1363Proof
1364    rpt STRIP_TAC
1365 >> (MP_TAC o Q.SPECL [`m`,`f`,`s`,`a`,`x`,`g`,`s'`,`b`,`y`]) pos_simple_fn_integral_present
1366 >> RW_TAC std_ss [] >> ASM_SIMP_TAC std_ss []
1367 >> qexistsl_tac [`k`, `c`, `\i. z i + z' i`]
1368 >> FULL_SIMP_TAC std_ss [pos_simple_fn_def, pos_simple_fn_integral_def]
1369 >> reverse CONJ_TAC
1370 >- (RW_TAC std_ss [GSYM extreal_add_def] \\
1371    `!i. i IN k ==> Normal (z i) <> NegInf /\ Normal (z' i) <> NegInf /\
1372                    0 <= Normal (z i) /\ 0 <= Normal (z' i)`
1373        by METIS_TAC [extreal_not_infty, extreal_of_num_def, extreal_le_def] \\
1374    `!i. i IN k ==> (\i. (Normal (z i) + Normal (z' i)) * measure m (c i)) i <> NegInf`
1375        by METIS_TAC [extreal_add_def, mul_not_infty, positive_not_infty, measure_space_def,
1376                      REAL_LE_ADD] \\
1377    (MP_TAC o Q.SPEC `\i:num. (Normal (z i) + Normal (z' i)) * measure m (c i)`
1378     o UNDISCH o Q.ISPEC `k:num->bool`) EXTREAL_SUM_IMAGE_IN_IF \\
1379     RW_TAC std_ss [add_rdistrib] \\
1380    (MP_TAC o Q.SPEC `\x. Normal (z x) * measure m (c x) + Normal (z' x) * measure m (c x)`
1381     o UNDISCH o Q.ISPEC `k:num->bool` o GSYM) EXTREAL_SUM_IMAGE_IN_IF \\
1382    `!x. x IN k ==>  NegInf <>
1383       (\x. Normal (z x) * measure m (c x) + Normal (z' x) * measure m (c x)) x`
1384        by METIS_TAC [extreal_add_def, mul_not_infty, positive_not_infty, measure_space_def,
1385                      REAL_LE_ADD, add_not_infty] \\
1386     RW_TAC std_ss [] \\
1387    `(\x. Normal (z x) * measure m (c x) + Normal (z' x) * measure m (c x)) =
1388     (\x. (\x. Normal (z x) * measure m (c x)) x + (\x. Normal (z' x) * measure m (c x)) x)`
1389        by METIS_TAC [] >> POP_ORW \\
1390    (MATCH_MP_TAC o UNDISCH o Q.ISPEC `k:num->bool` o GSYM) EXTREAL_SUM_IMAGE_ADD \\
1391     DISJ1_TAC \\
1392     METIS_TAC [mul_not_infty, positive_not_infty, measure_space_def, extreal_not_infty])
1393 (* applying le_add *)
1394 >> CONJ_TAC >- (Q.X_GEN_TAC `t` >> STRIP_TAC \\
1395                 MATCH_MP_TAC le_add >> METIS_TAC [])
1396 (* applying REAL_LE_ADD *)
1397 >> reverse CONJ_TAC
1398 >- (rpt STRIP_TAC >> MATCH_MP_TAC REAL_LE_ADD >> PROVE_TAC [])
1399 >> RW_TAC std_ss [GSYM extreal_add_def]
1400 >> `!i. i IN k ==> Normal (z i) <> NegInf /\ Normal (z' i) <> NegInf /\
1401                    0 <= Normal (z i) /\ 0 <= Normal (z' i)`
1402       by METIS_TAC [extreal_not_infty, extreal_of_num_def, extreal_le_def]
1403 >> `!i. i IN k ==> (\i. (Normal (z i) + Normal (z' i)) * indicator_fn (c i) x') i <> NegInf`
1404       by METIS_TAC [extreal_add_def, indicator_fn_def, mul_rzero, mul_rone, extreal_of_num_def,
1405                     extreal_not_infty]
1406 >> (MP_TAC o Q.SPEC `(\i:num. (Normal (z i) + Normal (z' i)) *  indicator_fn (c i) x')`
1407     o UNDISCH o Q.ISPEC `k:num->bool`) EXTREAL_SUM_IMAGE_IN_IF
1408 >> RW_TAC std_ss [add_rdistrib]
1409 >> (MP_TAC o Q.SPEC `(\x. Normal (z x) * indicator_fn (c x) x' + Normal (z' x) * indicator_fn (c x) x')`
1410     o UNDISCH o Q.ISPEC `k:num->bool` o GSYM) EXTREAL_SUM_IMAGE_IN_IF
1411 >> `!x. x IN k ==> NegInf <>
1412       (\x. Normal (z x) * indicator_fn (c x) x' + Normal (z' x) * indicator_fn (c x) x') x`
1413       by (RW_TAC std_ss [extreal_add_def, indicator_fn_def, mul_rzero, mul_rone, add_rzero] \\
1414           METIS_TAC [extreal_of_num_def, extreal_not_infty])
1415 >> RW_TAC std_ss []
1416 >> `(\x. Normal (z x) * indicator_fn (c x) x' + Normal (z' x) * indicator_fn (c x) x') =
1417     (\x. (\x. Normal (z x) * indicator_fn (c x) x') x + (\x. Normal (z' x) * indicator_fn (c x) x') x)`
1418       by METIS_TAC [] >> POP_ORW
1419 >> (MP_TAC o Q.SPECL [`\x:num. Normal (z x) * indicator_fn (c x) x'`,
1420                       `\x:num. Normal (z' x) * indicator_fn (c x) x'`]
1421     o UNDISCH o Q.ISPEC `k:num->bool` o GSYM) EXTREAL_SUM_IMAGE_ADD
1422 >> `!x:num. x IN k ==> NegInf <> (\x:num. Normal (z x) * indicator_fn (c x) x') x /\
1423                        NegInf <> (\x:num. Normal (z' x) * indicator_fn (c x) x') x`
1424       by (RW_TAC std_ss [indicator_fn_def, mul_rone, mul_rzero, add_rzero] \\
1425           METIS_TAC [extreal_of_num_def, extreal_not_infty])
1426 >> METIS_TAC []
1427QED
1428
1429Theorem pos_simple_fn_integral_add_alt :
1430    !m f s a x g y. measure_space m /\
1431           pos_simple_fn m f s a x /\ pos_simple_fn m g s a y ==>
1432          (pos_simple_fn_integral m s a x +
1433           pos_simple_fn_integral m s a y =
1434           pos_simple_fn_integral m s a (\i. x i + y i))
1435Proof
1436    RW_TAC std_ss [pos_simple_fn_def, pos_simple_fn_integral_def, GSYM extreal_add_def]
1437 >> `!i. i IN s ==> Normal (x i) <> NegInf /\ Normal (y i) <> NegInf /\
1438                    0 <= Normal (x i) /\ 0 <= Normal (y i)`
1439        by METIS_TAC [extreal_not_infty,extreal_of_num_def,extreal_le_def]
1440 >> `!i. i IN s ==> (\i. (Normal (x i) + Normal (y i)) * measure m (a i)) i <> NegInf`
1441        by METIS_TAC [extreal_add_def,mul_not_infty,positive_not_infty,measure_space_def,REAL_LE_ADD]
1442 >> (MP_TAC o Q.SPEC `(\i:num. (Normal (x i) + Normal (y i)) * measure m (a i))`
1443     o UNDISCH o Q.ISPEC `s:num->bool`) EXTREAL_SUM_IMAGE_IN_IF
1444 >> RW_TAC std_ss [add_rdistrib]
1445 >> (MP_TAC o Q.SPEC `(\i. Normal (x i) * measure m (a i) + Normal (y i) * measure m (a i))`
1446     o UNDISCH o Q.ISPEC `s:num->bool` o GSYM) EXTREAL_SUM_IMAGE_IN_IF
1447 >> `!i. i IN s ==> NegInf <> (\i. Normal (x i) * measure m (a i) + Normal (y i) * measure m (a i)) i`
1448        by METIS_TAC [extreal_add_def, mul_not_infty, positive_not_infty, measure_space_def,
1449                      REAL_LE_ADD, add_not_infty]
1450 >> RW_TAC std_ss []
1451 >> `(\i. Normal (x i) * measure m (a i) + Normal (y i) * measure m (a i)) =
1452     (\i. (\i. Normal (x i) * measure m (a i)) i + (\i. Normal (y i) * measure m (a i)) i)`
1453        by METIS_TAC []
1454 >> POP_ORW
1455 >> (MATCH_MP_TAC o UNDISCH o Q.ISPEC `s:num->bool` o GSYM) EXTREAL_SUM_IMAGE_ADD
1456 >> DISJ1_TAC
1457 >> METIS_TAC [mul_not_infty, positive_not_infty, measure_space_def, extreal_not_infty]
1458QED
1459
1460Theorem psfis_add :
1461    !m f g a b. measure_space m /\ a IN psfis m f /\ b IN psfis m g ==>
1462                (a + b) IN psfis m (\x. f x + g x)
1463Proof
1464    RW_TAC std_ss [psfis_def, IN_IMAGE, psfs_def, GSPECIFICATION]
1465 >> rename1 `(x,T) = (\(s,a,x). ((s,a,x),pos_simple_fn m f s a x)) f1`
1466 >> rename1 `(y,T) = (\(s,a,x). ((s,a,x),pos_simple_fn m g s a x)) f2`
1467 >> Cases_on `f1` >> Cases_on `r`
1468 >> rename1 `(x,T) = (\(s,a,x). ((s,a,x),pos_simple_fn m f s a x)) (s0,a0,x0)`
1469 >> Cases_on `f2` >> Cases_on `r`
1470 >> rename1 `(y,T) = (\(s,a,x). ((s,a,x),pos_simple_fn m g s a x)) (s1,a1,x1)`
1471 >> fs []
1472 >> Suff `?s a x. (pos_simple_fn_integral m s0 a0 x0 +
1473                   pos_simple_fn_integral m s1 a1 x1 =
1474                   pos_simple_fn_integral m s a x) /\ pos_simple_fn m (\x. f x + g x) s a x`
1475 >- (RW_TAC std_ss [] >> Q.EXISTS_TAC `(s,a,x)` \\
1476     RW_TAC std_ss [] >> Q.EXISTS_TAC `(s,a,x)` \\
1477     RW_TAC std_ss [PAIR_EQ])
1478 >> ONCE_REWRITE_TAC [CONJ_COMM]
1479 >> MATCH_MP_TAC pos_simple_fn_integral_add
1480 >> RW_TAC std_ss []
1481QED
1482
1483Theorem pos_simple_fn_integral_mono :
1484    !m f (s :num->bool) a x
1485       g (s':num->bool) b y.
1486       measure_space m /\ pos_simple_fn m f s a x /\ pos_simple_fn m g s' b y /\
1487      (!x. x IN m_space m ==> f x <= g x) ==>
1488       pos_simple_fn_integral m s a x <= pos_simple_fn_integral m s' b y
1489Proof
1490    rpt STRIP_TAC
1491 >> (MP_TAC o Q.SPECL [`m`,`f`,`s`,`a`,`x`,`g`,`s'`,`b`,`y`]) pos_simple_fn_integral_present
1492 >> RW_TAC std_ss [] >> ASM_SIMP_TAC std_ss []
1493 >> RW_TAC std_ss [pos_simple_fn_integral_def]
1494 >> (MATCH_MP_TAC o UNDISCH o Q.ISPEC `k:num->bool`) EXTREAL_SUM_IMAGE_MONO
1495 >> RW_TAC std_ss []
1496 >- (DISJ1_TAC \\
1497     RW_TAC std_ss [] \\
1498    `measure m (c x') <> NegInf` by METIS_TAC [measure_space_def, positive_not_infty] \\
1499     Cases_on `measure m (c x')` >> RW_TAC std_ss [extreal_mul_def, extreal_not_infty] \\
1500     METIS_TAC [real_lte, REAL_LE_ANTISYM])
1501 >> Cases_on `c x' = {}`
1502 >- RW_TAC real_ss [MEASURE_EMPTY, mul_rzero, le_refl]
1503 >> `pos_simple_fn m f k c z`
1504      by (FULL_SIMP_TAC std_ss [pos_simple_fn_def] >> METIS_TAC [])
1505 >> `pos_simple_fn m g k c z'`
1506      by (FULL_SIMP_TAC std_ss [pos_simple_fn_def] >> METIS_TAC [])
1507 >> `?t. t IN c x'` by METIS_TAC [CHOICE_DEF]
1508 >> `f t = Normal (z x')` by METIS_TAC [pos_simple_fn_thm1]
1509 >> `g t = Normal (z' x')` by METIS_TAC [pos_simple_fn_thm1]
1510 >> `Normal (z x') <= Normal (z' x')` by METIS_TAC [MEASURE_SPACE_SUBSET_MSPACE, SUBSET_DEF]
1511 >> Cases_on `measure m (c x') = 0` >- RW_TAC std_ss [mul_rzero,le_refl]
1512 >> MATCH_MP_TAC le_rmul_imp
1513 >> RW_TAC std_ss []
1514 >> METIS_TAC [MEASURE_SPACE_POSITIVE, positive_def, lt_le]
1515QED
1516
1517Theorem psfis_mono:
1518    !m f g a b. measure_space m /\ a IN psfis m f /\ b IN psfis m g /\
1519               (!x. x IN m_space m ==> f x <= g x) ==> a <= b
1520Proof
1521    RW_TAC std_ss [psfis_def, IN_IMAGE, psfs_def, GSPECIFICATION]
1522 >> Cases_on `x'` >> Cases_on `x` >> Cases_on `x''` >> Cases_on `x'''`
1523 >> Cases_on `r'` >> Cases_on `r` >> Cases_on `r''` >> Cases_on `r'''`
1524 >> RW_TAC std_ss []
1525 >> FULL_SIMP_TAC std_ss [PAIR_EQ]
1526 >> MATCH_MP_TAC pos_simple_fn_integral_mono
1527 >> METIS_TAC []
1528QED
1529
1530Theorem pos_simple_fn_integral_unique:
1531    !m f (s:num->bool) a x (s':num->bool) b y.
1532         measure_space m /\ pos_simple_fn m f s a x /\ pos_simple_fn m f s' b y ==>
1533        (pos_simple_fn_integral m s a x = pos_simple_fn_integral m s' b y)
1534Proof
1535    METIS_TAC [le_antisym, le_refl, pos_simple_fn_integral_mono]
1536QED
1537
1538Theorem psfis_unique:
1539    !m f a b. measure_space m /\ a IN psfis m f /\ b IN psfis m f ==> (a = b)
1540Proof
1541    METIS_TAC [le_antisym, le_refl, psfis_mono]
1542QED
1543
1544Theorem pos_simple_fn_integral_indicator:
1545    !m A. measure_space m /\ A IN measurable_sets m ==>
1546          ?s a x. pos_simple_fn m (indicator_fn A) s a x /\
1547                 (pos_simple_fn_integral m s a x = measure m A)
1548Proof
1549    RW_TAC std_ss []
1550 >> Q.EXISTS_TAC `{0;1}`
1551 >> Q.EXISTS_TAC `\i. if i = 0 then m_space m DIFF A else A`
1552 >> Q.EXISTS_TAC `\i. if i = 0 then 0 else 1`
1553 >> RW_TAC std_ss [pos_simple_fn_indicator_alt, pos_simple_fn_integral_def]
1554 >> (MP_TAC o Q.SPEC `0:num` o REWRITE_RULE [FINITE_SING]
1555     o Q.ISPECL [`(\i:num. Normal (if i = 0 then 0 else 1) *
1556                           measure m (if i = 0 then m_space m DIFF A else A))`,`{1:num}`])
1557         EXTREAL_SUM_IMAGE_PROPERTY
1558 >> `!x:num. x IN {0; 1} ==> (\i. Normal (if i = 0 then 0 else 1) *
1559             measure m (if i = 0 then m_space m DIFF A else A)) x <> NegInf`
1560      by (RW_TAC std_ss [GSYM extreal_of_num_def, mul_lzero, mul_lone] \\
1561          METIS_TAC [extreal_of_num_def, extreal_not_infty, positive_not_infty,
1562                     MEASURE_SPACE_POSITIVE])
1563 >> RW_TAC std_ss [GSYM extreal_of_num_def,mul_lzero,add_lzero]
1564 >> `{1:num} DELETE 0 = {1}`
1565        by RW_TAC real_ss [Once EXTENSION, IN_SING, IN_DELETE]
1566 >> RW_TAC std_ss [EXTREAL_SUM_IMAGE_SING, GSYM extreal_of_num_def, mul_lone]
1567QED
1568
1569Theorem psfis_indicator:
1570    !m A. measure_space m /\ A IN measurable_sets m ==>
1571          measure m A IN psfis m (indicator_fn A)
1572Proof
1573    RW_TAC std_ss [psfis_def, IN_IMAGE, psfs_def, GSPECIFICATION]
1574 >> Suff `?s a x. pos_simple_fn m (indicator_fn A) s a x /\
1575                  (pos_simple_fn_integral m s a x = measure m A)`
1576 >- (RW_TAC std_ss [] >> Q.EXISTS_TAC `(s,a,x)` \\
1577     RW_TAC std_ss [] >> Q.EXISTS_TAC `(s,a,x)` \\
1578     RW_TAC std_ss [PAIR_EQ])
1579 >> MATCH_MP_TAC pos_simple_fn_integral_indicator
1580 >> ASM_REWRITE_TAC []
1581QED
1582
1583Theorem pos_simple_fn_integral_cmul:
1584    !m f s a x z.
1585       measure_space m /\ pos_simple_fn m f s a x /\ 0 <= z ==>
1586      (pos_simple_fn m (\x. Normal z * f x) s a (\i. z * x i) /\
1587      (pos_simple_fn_integral m s a (\i. z * x i) =
1588       Normal z * pos_simple_fn_integral m s a x))
1589Proof
1590    RW_TAC std_ss [pos_simple_fn_integral_def, pos_simple_fn_def, REAL_LE_MUL,
1591                   GSYM extreal_mul_def]
1592 >| [ (* goal 1 *)
1593      METIS_TAC [le_mul, extreal_le_def, extreal_of_num_def],
1594      (* goal 2 *)
1595     `(\i. Normal z * Normal (x i) * indicator_fn (a i) x') =
1596      (\i. Normal z * (\i. Normal (x i) * indicator_fn (a i) x') i)`
1597         by METIS_TAC [mul_assoc] >> POP_ORW \\
1598     (MATCH_MP_TAC o UNDISCH o Q.ISPEC `s:num->bool` o GSYM) EXTREAL_SUM_IMAGE_CMUL \\
1599      DISJ1_TAC \\
1600      RW_TAC std_ss [indicator_fn_def, mul_rone, mul_rzero] \\
1601      RW_TAC std_ss [extreal_of_num_def, extreal_not_infty],
1602      (* goal 3 *)
1603     `(\i. Normal z * Normal (x i) * measure m (a i)) =
1604      (\i. Normal z * (\i. Normal (x i) * measure m (a i)) i)` by METIS_TAC [mul_assoc] \\
1605      POP_ORW \\
1606     (MATCH_MP_TAC o UNDISCH o Q.ISPEC `s:num->bool`) EXTREAL_SUM_IMAGE_CMUL \\
1607      DISJ1_TAC \\
1608      RW_TAC std_ss [] \\
1609      METIS_TAC [mul_not_infty, positive_not_infty, MEASURE_SPACE_POSITIVE] ]
1610QED
1611
1612Theorem psfis_cmul:
1613    !m f a z. measure_space m /\ a IN psfis m f /\ 0 <= z ==>
1614              Normal z * a IN psfis m (\x. Normal z * f x)
1615Proof
1616    RW_TAC std_ss [psfis_def, IN_IMAGE, psfs_def, GSPECIFICATION]
1617 >> Cases_on `x'`
1618 >> Cases_on `r`
1619 >> FULL_SIMP_TAC std_ss [PAIR_EQ]
1620 >> Q.EXISTS_TAC `(q,q',(\i. z * r' i))`
1621 >> RW_TAC std_ss []
1622 >- METIS_TAC [pos_simple_fn_integral_cmul]
1623 >> Q.EXISTS_TAC `(q,q',(\i. z * r' i))`
1624 >> RW_TAC std_ss []
1625 >> METIS_TAC [pos_simple_fn_integral_cmul]
1626QED
1627
1628Theorem pos_simple_fn_integral_cmul_alt:
1629    !m f s a x z. measure_space m /\ 0 <= z /\ pos_simple_fn m f s a x ==>
1630       ?s' a' x'. (pos_simple_fn m (\t. Normal z * f t) s' a' x') /\
1631                  (pos_simple_fn_integral m s' a' x' = Normal z * pos_simple_fn_integral m s a x)
1632Proof
1633    RW_TAC real_ss []
1634 >> Q.EXISTS_TAC `s`
1635 >> Q.EXISTS_TAC `a`
1636 >> Q.EXISTS_TAC `(\i. z * x i)`
1637 >> RW_TAC std_ss [pos_simple_fn_cmul_alt]
1638 >> FULL_SIMP_TAC real_ss [pos_simple_fn_integral_def, pos_simple_fn_def, mul_assoc,
1639                           GSYM extreal_mul_def]
1640 >> `(\i. Normal z * Normal (x i) * measure m (a i)) =
1641     (\j. Normal z * (\i. Normal (x i) * measure m (a i)) j)`
1642        by RW_TAC std_ss [FUN_EQ_THM,mul_assoc]
1643 >> POP_ORW
1644 >> (MATCH_MP_TAC o UNDISCH o Q.ISPEC `s:num->bool`) EXTREAL_SUM_IMAGE_CMUL
1645 >> DISJ1_TAC
1646 >> METIS_TAC [mul_not_infty, extreal_not_infty, positive_not_infty, MEASURE_SPACE_POSITIVE]
1647QED
1648
1649Theorem IN_psfis:
1650    !m r f. r IN psfis m f ==>
1651            ?s a x. pos_simple_fn m f s a x /\ (r = pos_simple_fn_integral m s a x)
1652Proof
1653    RW_TAC std_ss [psfis_def, IN_IMAGE, psfs_def, GSPECIFICATION]
1654 >> Cases_on `x'`>> Cases_on `x` >> Cases_on `r` >> Cases_on `r'`
1655 >> RW_TAC std_ss []
1656 >> FULL_SIMP_TAC std_ss [PAIR_EQ]
1657 >> METIS_TAC []
1658QED
1659
1660Theorem IN_psfis_eq:
1661    !m r f. r IN psfis m f <=>
1662            ?s a x. pos_simple_fn m f s a x /\ (r = pos_simple_fn_integral m s a x)
1663Proof
1664    RW_TAC std_ss []
1665 >> EQ_TAC >- RW_TAC std_ss [IN_psfis]
1666 >> RW_TAC std_ss [psfis_def,psfs_def,IN_IMAGE,GSPECIFICATION]
1667 >> Q.EXISTS_TAC `(s,a,x)`
1668 >> RW_TAC std_ss []
1669 >> Q.EXISTS_TAC `(s,a,x)`
1670 >> RW_TAC std_ss []
1671QED
1672
1673Theorem psfis_pos:
1674    !m f a. measure_space m /\ a IN psfis m f ==> (!x. x IN m_space m ==> 0 <= f x)
1675Proof
1676    RW_TAC std_ss [psfis_def, IN_IMAGE, psfs_def, GSPECIFICATION]
1677 >> Cases_on `x'`
1678 >> Cases_on `r`
1679 >> FULL_SIMP_TAC std_ss [PAIR_EQ, pos_simple_fn_def]
1680 >> MATCH_MP_TAC EXTREAL_SUM_IMAGE_POS
1681 >> RW_TAC std_ss [indicator_fn_def, mul_rzero, mul_rone, le_refl]
1682 >> RW_TAC std_ss [extreal_of_num_def, extreal_le_def]
1683QED
1684
1685Theorem pos_simple_fn_integral_zero:
1686    !m s a x. measure_space m /\ pos_simple_fn m (\t. 0) s a x ==>
1687             (pos_simple_fn_integral m s a x = 0)
1688Proof
1689    RW_TAC std_ss []
1690 >> `pos_simple_fn m (\t. 0) {1:num} (\i:num. if i=1 then (m_space m) else {}) (\i:num. 0) /\
1691    (pos_simple_fn_integral m  {1:num} (\i:num. if i=1 then (m_space m) else {}) (\i:num. 0) = 0)`
1692      by RW_TAC real_ss [pos_simple_fn_integral_def, pos_simple_fn_def,
1693                         FINITE_SING, EXTREAL_SUM_IMAGE_SING, EXTREAL_SUM_IMAGE_SING,
1694                         IMAGE_SING, BIGUNION_SING, IN_SING, MEASURE_SPACE_MSPACE_MEASURABLE,
1695                         GSYM extreal_of_num_def, mul_lzero, le_refl]
1696 >> METIS_TAC [pos_simple_fn_integral_unique]
1697QED
1698
1699(* added missing quantifier (g) *)
1700Theorem pos_simple_fn_integral_zero_alt:
1701    !m g s a x. measure_space m /\ pos_simple_fn m g s a x /\ (!x. x IN m_space m ==> (g x = 0))
1702         ==> (pos_simple_fn_integral m s a x = 0)
1703Proof
1704    RW_TAC std_ss [pos_simple_fn_integral_def]
1705 >> MATCH_MP_TAC EXTREAL_SUM_IMAGE_0
1706 >> CONJ_TAC >- FULL_SIMP_TAC std_ss [pos_simple_fn_def]
1707 >> RW_TAC std_ss []
1708 >> Cases_on `a x' = {}` >- FULL_SIMP_TAC std_ss [MEASURE_EMPTY,mul_rzero]
1709 >> Suff `Normal (x x') = 0` >- FULL_SIMP_TAC std_ss [mul_lzero]
1710 >> `?y. y IN a x'` by METIS_TAC [CHOICE_DEF]
1711 >> METIS_TAC [pos_simple_fn_thm1, MEASURE_SPACE_SUBSET_MSPACE, pos_simple_fn_def, SUBSET_DEF]
1712QED
1713
1714Theorem psfis_zero:   !m a. measure_space m ==> ((a IN psfis m (\x. 0)) <=> (a = 0))
1715Proof
1716    RW_TAC std_ss []
1717 >> EQ_TAC >- METIS_TAC [IN_psfis_eq, pos_simple_fn_integral_zero]
1718 >> RW_TAC std_ss [IN_psfis_eq]
1719 >> Q.EXISTS_TAC `{1}`
1720 >> Q.EXISTS_TAC `(\i. m_space m)`
1721 >> Q.EXISTS_TAC `(\i. 0)`
1722 >> RW_TAC real_ss [pos_simple_fn_integral_def, pos_simple_fn_def, FINITE_SING,
1723                    EXTREAL_SUM_IMAGE_SING, REAL_SUM_IMAGE_SING, IMAGE_SING, BIGUNION_SING,
1724                    IN_SING, MEASURE_SPACE_MSPACE_MEASURABLE, mul_lzero,
1725                    GSYM extreal_of_num_def, le_refl]
1726QED
1727
1728Theorem pos_simple_fn_integral_not_infty:
1729    !m f s a x. measure_space m /\ pos_simple_fn m f s a x
1730            ==> pos_simple_fn_integral m s a x <> NegInf
1731Proof
1732    RW_TAC std_ss [pos_simple_fn_integral_def,pos_simple_fn_def]
1733 >> Suff `!i. i IN s ==> (\i. Normal (x i) * measure m (a i)) i <> NegInf`
1734 >- FULL_SIMP_TAC std_ss [EXTREAL_SUM_IMAGE_NOT_INFTY]
1735 >> METIS_TAC [mul_not_infty, extreal_le_def, extreal_of_num_def, positive_not_infty,
1736               MEASURE_SPACE_POSITIVE]
1737QED
1738
1739Theorem psfis_not_infty:   !m f a. measure_space m  /\ a IN psfis m f ==> a <> NegInf
1740Proof
1741    METIS_TAC [IN_psfis_eq, pos_simple_fn_integral_not_infty]
1742QED
1743
1744Theorem pos_simple_fn_integral_sum:
1745    !m f s a x P. measure_space m /\
1746        (!i. i IN P ==> pos_simple_fn m (f i) s a (x i)) /\
1747        (!i t. i IN P ==> f i t <> NegInf) /\ FINITE P /\ P <> {} ==>
1748        (pos_simple_fn m (\t. SIGMA (\i. f i t) P) s a (\i. SIGMA (\j. x j i) P) /\
1749        (pos_simple_fn_integral m s a (\j. SIGMA (\i. x i j) P) =
1750           SIGMA (\i. pos_simple_fn_integral m s a (x i)) P))
1751Proof
1752    Suff `!P:'b->bool. FINITE P ==>
1753            (\P:'b->bool. !m f s a x. measure_space m /\
1754            (!i. i IN P ==> pos_simple_fn m (f i) s a (x i)) /\
1755            (!i t. i IN P ==> f i t <> NegInf) /\ P <> {} ==>
1756            (pos_simple_fn m (\t. SIGMA (\i. f i t) P) s a (\i. SIGMA (\j. x j i) P) /\
1757            (pos_simple_fn_integral m s a (\j. SIGMA (\i. x i j) P) =
1758               SIGMA (\i. pos_simple_fn_integral m s a (x i)) P))) P`
1759 >- METIS_TAC []
1760 >> MATCH_MP_TAC FINITE_INDUCT
1761 >> CONJ_TAC
1762 >- RW_TAC std_ss [NOT_IN_EMPTY,EXTREAL_SUM_IMAGE_EMPTY,REAL_SUM_IMAGE_THM]
1763 >> RW_TAC std_ss [REAL_SUM_IMAGE_THM,DELETE_NON_ELEMENT]
1764 >- (`(\t. SIGMA (\i. f i t) (e INSERT s)) = (\t. f e t + (\t. SIGMA (\i. f i t) s) t)`
1765          by (RW_TAC std_ss [FUN_EQ_THM]
1766             >> (MP_TAC o UNDISCH o Q.SPECL [`(\i. f i t)`,`s`] o INST_TYPE [alpha |-> beta])
1767                   EXTREAL_SUM_IMAGE_PROPERTY
1768             >> FULL_SIMP_TAC std_ss [DELETE_NON_ELEMENT]) >> POP_ORW \\
1769     `(\i. x e i + SIGMA (\j. x j i) s) = (\i. x e i + (\i. SIGMA (\j. x j i) s) i)`
1770          by METIS_TAC [] >> POP_ORW \\
1771     MATCH_MP_TAC pos_simple_fn_add_alt \\
1772     RW_TAC std_ss [] >- METIS_TAC [IN_INSERT] \\
1773     Q.PAT_X_ASSUM `!m f s' a x. Q` (MP_TAC o Q.SPECL [`m`,`f`,`s'`,`a`,`x`]) \\
1774     RW_TAC std_ss [] \\
1775     Cases_on `s <> {}` >- METIS_TAC [IN_INSERT] \\
1776     FULL_SIMP_TAC real_ss [EXTREAL_SUM_IMAGE_EMPTY, REAL_SUM_IMAGE_THM, pos_simple_fn_def,
1777                            IN_SING, le_refl, GSYM extreal_of_num_def, mul_lzero,
1778                            EXTREAL_SUM_IMAGE_0])
1779 >> (MP_TAC o Q.SPEC `e` o UNDISCH o Q.SPEC `s`
1780     o Q.SPEC `(\i. pos_simple_fn_integral m s' a (x i))`
1781     o INST_TYPE [alpha |-> beta]) EXTREAL_SUM_IMAGE_PROPERTY
1782 >> `!x'. x' IN e INSERT s ==> (\i. pos_simple_fn_integral m s' a (x i)) x' <> NegInf`
1783        by (RW_TAC std_ss [] \\
1784            METIS_TAC [IN_INSERT, pos_simple_fn_integral_not_infty])
1785 >> RW_TAC std_ss []
1786 >> Q.PAT_X_ASSUM `!n f s a z. Q` (MP_TAC o Q.SPECL [`m`,`f`,`s'`,`a`,`x`])
1787 >> FULL_SIMP_TAC std_ss [IN_INSERT]
1788 >> RW_TAC std_ss []
1789 >> Cases_on `s = {}`
1790 >- (RW_TAC real_ss [EXTREAL_SUM_IMAGE_EMPTY, REAL_SUM_IMAGE_THM, add_rzero] \\
1791     METIS_TAC [])
1792 >> FULL_SIMP_TAC std_ss []
1793 >> `SIGMA (\i. pos_simple_fn_integral m s' a (x i)) s =
1794     pos_simple_fn_integral m s' a (\j. SIGMA (\i. x i j) s)`
1795       by METIS_TAC [] >> POP_ORW
1796 >> `(\j. x e j + SIGMA (\i. x i j) s) =
1797     (\j. x e j + (\j. SIGMA (\i. x i j) s) j)` by METIS_TAC [] >> POP_ORW
1798 >> (MATCH_MP_TAC o GSYM) pos_simple_fn_integral_add_alt
1799 >> METIS_TAC []
1800QED
1801
1802Theorem pos_simple_fn_integral_sum_alt:
1803    !m f s a x P. measure_space m /\
1804        (!i. i IN P ==> pos_simple_fn m (f i) (s i) (a i) (x i)) /\
1805        (!i t. i IN P ==> f i t <> NegInf) /\ FINITE P /\ P <> {} ==>
1806        ?c k z. (pos_simple_fn m (\t. SIGMA (\i. f i t) P) k c z /\
1807                (pos_simple_fn_integral m k c z =
1808                 SIGMA (\i. pos_simple_fn_integral m (s i) (a i) (x i)) P))
1809Proof
1810    Suff `!P:'b->bool. FINITE P ==>
1811             (\P:'b->bool. !m f s a x. measure_space m /\
1812                                      (!i. i IN P ==> pos_simple_fn m (f i) (s i) (a i) (x i)) /\
1813                                      (!i t. i IN P ==> f i t <> NegInf) /\ P <> {} ==>
1814               ?c k z. (pos_simple_fn m (\t. SIGMA (\i. f i t) P) k c z /\
1815                        (pos_simple_fn_integral m k c z =
1816                         SIGMA (\i. pos_simple_fn_integral m (s i) (a i) (x i)) P))) P`
1817 >- METIS_TAC []
1818 >> MATCH_MP_TAC FINITE_INDUCT
1819 >> RW_TAC std_ss []
1820 >> Cases_on `s = {}` >- (RW_TAC std_ss [EXTREAL_SUM_IMAGE_SING] >> METIS_TAC [IN_SING])
1821 >> `?c k z. pos_simple_fn m (\t. SIGMA (\i. f i t) s) k c z /\
1822            (pos_simple_fn_integral m k c z =
1823               SIGMA (\i. pos_simple_fn_integral m (s' i) (a i) (x i)) s)`
1824        by METIS_TAC [IN_INSERT]
1825 >> `!i. i IN e INSERT s ==> (\i. pos_simple_fn_integral m (s' i) (a i) (x i)) i <> NegInf`
1826        by METIS_TAC [pos_simple_fn_integral_not_infty, IN_INSERT]
1827 >> FULL_SIMP_TAC std_ss [EXTREAL_SUM_IMAGE_PROPERTY]
1828 >> (MP_TAC o Q.SPECL [`m`,`f (e:'b)`,`s' (e:'b)`,`a (e:'b)`,`x (e:'b)`,
1829                       `(\t. SIGMA (\i:'b. f i t) s)`,`k`,`c`,`z`]) pos_simple_fn_integral_present
1830 >> FULL_SIMP_TAC std_ss [IN_INSERT, DELETE_NON_ELEMENT]
1831 >> RW_TAC std_ss []
1832 >> METIS_TAC [pos_simple_fn_integral_add]
1833QED
1834
1835Theorem psfis_sum:
1836    !m f a P. measure_space m /\ (!i. i IN P ==> a i IN psfis m (f i)) /\
1837             (!i t. i IN P ==> f i t <> NegInf) /\ FINITE P ==>
1838             (SIGMA a P) IN psfis m (\t. SIGMA (\i. f i t) P)
1839Proof
1840    Suff `!P:'b->bool. FINITE P ==>
1841             (\P:'b->bool. !m f a. measure_space m /\ (!i. i IN P ==> a i IN psfis m (f i)) /\
1842                                  (!i t. i IN P ==> f i t <> NegInf) ==>
1843                                  (SIGMA a P) IN psfis m (\t. SIGMA (\i. f i t) P)) P`
1844 >- METIS_TAC []
1845 >> MATCH_MP_TAC FINITE_INDUCT
1846 >> RW_TAC std_ss [EXTREAL_SUM_IMAGE_EMPTY, psfis_zero, DELETE_NON_ELEMENT, IN_INSERT]
1847 >> `!x. x IN e INSERT s ==> a x <> NegInf` by METIS_TAC [IN_INSERT, psfis_not_infty]
1848 >> `!x t. x IN e INSERT s ==> (\x. f x t) x <> NegInf` by METIS_TAC [IN_INSERT]
1849 >> `!t. (\i. f i t) = (\i. (\i. f i t) i)` by METIS_TAC [] >> POP_ORW
1850 >> RW_TAC std_ss [EXTREAL_SUM_IMAGE_PROPERTY]
1851 >> `(\t. f e t + SIGMA (\i. f i t) s) = (\t. f e t + (\t. SIGMA (\i. f i t) s) t)`
1852       by METIS_TAC [] >> POP_ORW
1853 >> MATCH_MP_TAC psfis_add
1854 >> RW_TAC std_ss []
1855QED
1856
1857Theorem psfis_intro:
1858    !m a x P. measure_space m /\ (!i. i IN P ==> a i IN measurable_sets m) /\
1859             (!i. i IN P ==> 0 <= x i) /\ FINITE P ==>
1860             (SIGMA (\i. Normal (x i) * measure m (a i)) P) IN
1861              psfis m (\t. SIGMA (\i. Normal (x i) * indicator_fn (a i) t) P)
1862Proof
1863    RW_TAC std_ss []
1864 >> `!t. (\i. Normal (x i) * indicator_fn (a i) t) =
1865         (\i. (\i t. Normal (x i) * indicator_fn (a i) t) i t)` by METIS_TAC [] >> POP_ORW
1866 >> MATCH_MP_TAC psfis_sum
1867 >> RW_TAC std_ss [] >- METIS_TAC [psfis_cmul, psfis_indicator]
1868 >> RW_TAC std_ss [indicator_fn_def, mul_rone, mul_rzero]
1869 >> METIS_TAC [extreal_of_num_def, extreal_not_infty]
1870QED
1871
1872(* added `x IN m_space m` *)
1873Theorem pos_simple_fn_integral_sub :
1874    !m f s a x g s' b y.
1875       measure_space m /\ (measure m (m_space m) <> PosInf) /\
1876       (!x. x IN m_space m ==> g x <= f x) /\
1877       (!x. x IN m_space m ==> g x <> PosInf) /\
1878       pos_simple_fn m f s  a x /\
1879       pos_simple_fn m g s' b y ==>
1880       ?s'' c z. pos_simple_fn m (\x. f x - g x) s'' c z /\
1881                (pos_simple_fn_integral m s   a x -
1882                 pos_simple_fn_integral m s'  b y =
1883                 pos_simple_fn_integral m s'' c z)
1884Proof
1885    rpt STRIP_TAC
1886 >> (MP_TAC o Q.SPECL [`m`,`f`,`s`,`a`,`x`,`g`,`s'`,`b`,`y`]) pos_simple_fn_integral_present
1887 >> RW_TAC std_ss []
1888 >> ASM_SIMP_TAC std_ss []
1889 >> qexistsl_tac [`k`,`c`,`(\i. if (i IN k /\ ~(c i = {})) then (z i - z' i) else 0)`]
1890 >> REV_FULL_SIMP_TAC std_ss [pos_simple_fn_integral_def]
1891 (* expand `pos_simple_fn` without touching the goal *)
1892 >> Q.PAT_X_ASSUM `pos_simple_fn m f s a x`
1893      (STRIP_ASSUME_TAC o (REWRITE_RULE [pos_simple_fn_def]))
1894 >> Q.PAT_X_ASSUM `pos_simple_fn m g s' b y`
1895      (STRIP_ASSUME_TAC o (REWRITE_RULE [pos_simple_fn_def]))
1896 >> `pos_simple_fn m f k c z`
1897       by (FULL_SIMP_TAC std_ss [pos_simple_fn_def] >> METIS_TAC [])
1898 >> `pos_simple_fn m g k c z'`
1899       by (FULL_SIMP_TAC std_ss [pos_simple_fn_def] >> METIS_TAC [])
1900 >> `!x. k x <=> x IN k` by METIS_TAC [SPECIFICATION]
1901 >> Know `!x. x IN k ==> Normal (z x - z' x) * measure m (c x) <> NegInf`
1902 >- (RW_TAC std_ss [] \\
1903     Cases_on `c x' = {}`
1904     >- METIS_TAC [MEASURE_EMPTY, mul_rzero, extreal_of_num_def, extreal_not_infty] \\
1905    `?y. y IN c x'` by METIS_TAC [CHOICE_DEF] \\
1906    `f y' = Normal (z  x')` by METIS_TAC [pos_simple_fn_def, pos_simple_fn_thm1] \\
1907    `g y' = Normal (z' x')` by METIS_TAC [pos_simple_fn_def, pos_simple_fn_thm1] \\
1908     Suff `y' IN m_space m`
1909     >- (DISCH_TAC \\
1910        `0 <= z x' - z' x'` by METIS_TAC [extreal_le_eq, REAL_SUB_LE, extreal_of_num_def] \\
1911         METIS_TAC [mul_not_infty, positive_not_infty, MEASURE_SPACE_POSITIVE]) \\
1912    `c x' IN measurable_sets m` by PROVE_TAC [] \\
1913     Suff `c x' SUBSET m_space m` >- METIS_TAC [SUBSET_DEF] \\
1914     fs [measure_space_def, sigma_algebra_def, algebra_def] \\
1915     METIS_TAC [subset_class_def])
1916 >> DISCH_TAC
1917 >> reverse CONJ_TAC
1918 >- (`!i. (Normal (if (i IN k /\ ~(c i = {})) then z i - z' i else 0) * measure m (c i)) =
1919          (Normal (if i IN k then z i - z' i else 0) * measure m (c i))`
1920         by (RW_TAC std_ss [] >> FULL_SIMP_TAC real_ss [MEASURE_EMPTY, mul_rzero]) \\
1921     POP_ORW \\
1922    `SIGMA (\i. Normal (if i IN k then z i - z' i else 0) * measure m (c i)) k =
1923     SIGMA (\i. Normal (z i - z' i) * measure m (c i)) k`
1924         by ((MP_TAC o REWRITE_RULE [SPECIFICATION]
1925              o Q.SPECL [`k`,`k`,`(\i. Normal (z i - z' i) * measure m (c i))`]
1926              o INST_TYPE [alpha |-> ``:num``]) EXTREAL_SUM_IMAGE_IF_ELIM \\
1927             RW_TAC real_ss [] \\
1928            `(\x. if x IN k then Normal (z x - z' x) * measure m (c x) else 0) =
1929             (\i. Normal (if i IN k then z i - z' i else 0) * measure m (c i))`
1930                by (RW_TAC real_ss [FUN_EQ_THM] \\
1931                    Cases_on `i IN k` >- METIS_TAC [] \\
1932                    RW_TAC real_ss [mul_lzero, GSYM extreal_of_num_def]) \\
1933             FULL_SIMP_TAC real_ss []) >> POP_ORW \\
1934     RW_TAC std_ss [GSYM extreal_sub_def] \\
1935    `!i. i IN k ==> measure m (c i) <= measure m (m_space m)`
1936         by METIS_TAC [INCREASING, MEASURE_SPACE_INCREASING, MEASURE_SPACE_MSPACE_MEASURABLE,
1937                       MEASURE_SPACE_SUBSET_MSPACE] \\
1938    `!i. i IN k ==> measure m (c i) <> PosInf` by METIS_TAC [le_infty] \\
1939     (MP_TAC o Q.SPEC `(\i. (Normal (z i) - Normal (z' i)) * measure m (c i))` o UNDISCH
1940      o Q.ISPEC `k:num->bool`) EXTREAL_SUM_IMAGE_IN_IF \\
1941    `!x. x IN k ==> (\i. (Normal (z i) - Normal (z' i)) * measure m (c i)) x <> NegInf`
1942         by RW_TAC std_ss [extreal_sub_def] \\
1943     RW_TAC std_ss [] \\
1944    `!x. x IN k ==> ((Normal (z x) - Normal (z' x)) * measure m (c x) =
1945                     Normal (z x) * measure m (c x) - Normal (z' x) *  measure m (c x))`
1946         by (RW_TAC std_ss [] \\
1947            `measure m (c x') <> NegInf` by METIS_TAC [positive_not_infty, MEASURE_SPACE_POSITIVE] \\
1948            `?r. measure m (c x') = Normal r` by METIS_TAC [extreal_cases] \\
1949             RW_TAC std_ss [extreal_sub_def, extreal_mul_def, REAL_SUB_RDISTRIB]) \\
1950     (MP_TAC o Q.SPECL [`k:num->bool`,`k`,
1951                        `(\x:num. Normal (z x) * measure m (c x) - Normal (z' x) * measure m (c x))`]
1952      o INST_TYPE [alpha |-> ``:num``]) EXTREAL_SUM_IMAGE_IF_ELIM \\
1953     RW_TAC std_ss [] \\
1954     FULL_SIMP_TAC std_ss [] \\
1955    `(\x. Normal (z x) * measure m (c x) - Normal (z' x) * measure m (c x)) =
1956     (\x. (\x. Normal (z x) * measure m (c x)) x - (\x. Normal (z' x) * measure m (c x)) x)`
1957          by METIS_TAC [] >> POP_ORW \\
1958     (MATCH_MP_TAC o UNDISCH o Q.SPEC `k` o GSYM o INST_TYPE [alpha |-> ``:num``])
1959        EXTREAL_SUM_IMAGE_SUB \\
1960     DISJ1_TAC >> RW_TAC std_ss []
1961     >- METIS_TAC [mul_not_infty, positive_not_infty, MEASURE_SPACE_POSITIVE] \\
1962     METIS_TAC [mul_not_infty])
1963 >> `!x. x IN m_space m ==> g x <> NegInf`
1964        by METIS_TAC [lt_infty, lte_trans, extreal_not_infty, extreal_of_num_def]
1965 >> SIMP_TAC std_ss [pos_simple_fn_def]
1966 >> CONJ_TAC
1967 >- METIS_TAC [le_sub_imp, add_lzero]
1968 >> reverse (RW_TAC real_ss [])
1969 >- (REWRITE_TAC [REAL_SUB_LE] \\
1970    `?q. q IN c i` by METIS_TAC [CHOICE_DEF] \\
1971     Suff `q IN m_space m`
1972     >- (METIS_TAC [pos_simple_fn_thm1, REAL_SUB_LE, extreal_le_def]) \\
1973    `c i IN measurable_sets m` by PROVE_TAC [] \\
1974     Suff `c i SUBSET m_space m` >- METIS_TAC [SUBSET_DEF] \\
1975     fs [measure_space_def, sigma_algebra_def, algebra_def] \\
1976     METIS_TAC [subset_class_def])
1977 >> `!i. (Normal (if (i IN k /\ ~(c i = {})) then z i - z' i else 0) * indicator_fn (c i) x') =
1978         (Normal (if i IN k then z i - z' i else 0) * indicator_fn (c i) x')`
1979        by (RW_TAC std_ss [] \\
1980            FULL_SIMP_TAC real_ss [indicator_fn_def, mul_rzero, mul_rone, NOT_IN_EMPTY])
1981 >> POP_ORW
1982 >> `SIGMA (\i. Normal (if i IN k then z i - z' i else 0) * indicator_fn (c i) x') k =
1983     SIGMA (\i. Normal (z i - z' i) * indicator_fn (c i) x') k`
1984        by ((MP_TAC o REWRITE_RULE [SPECIFICATION] o
1985             (Q.SPECL [`k`,`k`,`(\i. Normal (z i - z' i) * indicator_fn (c i) x')`]) o
1986             (INST_TYPE [alpha |-> ``:num``])) EXTREAL_SUM_IMAGE_IF_ELIM \\
1987            RW_TAC real_ss [] \\
1988           `!x. (\i. Normal (z i - z' i) * indicator_fn (c i) x') x <> NegInf`
1989                by (RW_TAC std_ss [indicator_fn_def, mul_rzero, mul_rone] \\
1990                    RW_TAC std_ss [extreal_of_num_def, extreal_not_infty]) \\
1991            RW_TAC std_ss [] \\
1992           `(\x. if x IN k then Normal (z x - z' x) * indicator_fn (c x) x' else 0) =
1993                 (\i. Normal (if i IN k then z i - z' i else 0) * indicator_fn (c i) x')`
1994                   by (RW_TAC real_ss [FUN_EQ_THM, indicator_fn_def, mul_rzero, mul_rone] \\
1995                       Cases_on `i IN k` >- METIS_TAC [] \\
1996                       RW_TAC real_ss [mul_lzero, GSYM extreal_of_num_def]) \\
1997            FULL_SIMP_TAC real_ss []) >> POP_ORW
1998 >> RW_TAC std_ss [GSYM extreal_sub_def]
1999 >> (MP_TAC o Q.SPEC `(\i. (Normal (z i) - Normal (z' i)) * indicator_fn (c i) x')`
2000     o UNDISCH o Q.ISPEC `k:num->bool`) EXTREAL_SUM_IMAGE_IN_IF
2001 >> `!x. x IN k ==> (\i. (Normal (z i) - Normal (z' i)) * indicator_fn (c i) x') x <> NegInf`
2002        by (RW_TAC std_ss [extreal_sub_def, indicator_fn_def, mul_rzero, mul_rone] \\
2003            RW_TAC std_ss [extreal_of_num_def, extreal_not_infty])
2004 >> RW_TAC std_ss []
2005 >> `!x. x IN k ==> ((Normal (z x) - Normal (z' x)) * indicator_fn (c x) x' =
2006                     Normal (z x) * indicator_fn (c x) x' - Normal (z' x) * indicator_fn (c x) x')`
2007        by (RW_TAC std_ss [indicator_fn_def, mul_rone, mul_rzero, sub_rzero])
2008 >> RW_TAC std_ss []
2009 >> NTAC 3 (POP_ASSUM (K ALL_TAC))
2010 >> (MP_TAC o
2011     (Q.SPEC `(\x:num. Normal (z x) * indicator_fn (c x) x' - Normal (z' x) * indicator_fn (c x) x')`) o
2012     UNDISCH o (Q.SPEC `k`) o GSYM o (INST_TYPE [alpha |-> ``:num``])) EXTREAL_SUM_IMAGE_IN_IF
2013 >> `!x. NegInf <> (\x. Normal (z x) * indicator_fn (c x) x' - Normal (z' x) * indicator_fn (c x) x') x`
2014        by (RW_TAC std_ss [indicator_fn_def, mul_rone, mul_rzero, sub_rzero, extreal_sub_def] \\
2015            RW_TAC std_ss [extreal_of_num_def, extreal_not_infty])
2016 >> RW_TAC std_ss []
2017 >> FULL_SIMP_TAC std_ss []
2018 >> `SIGMA (\i. Normal (x i) * indicator_fn (a i) x') s =
2019     SIGMA (\i. Normal (z i) * indicator_fn (c i) x') k` by METIS_TAC [] >> POP_ORW
2020 >> `SIGMA (\i. Normal (y i) * indicator_fn (b i) x') s' =
2021     SIGMA (\i. Normal (z' i) * indicator_fn (c i) x') k` by METIS_TAC [] >> POP_ORW
2022 >> `(\x. Normal (z x) * indicator_fn (c x) x' - Normal (z' x) * indicator_fn (c x) x') =
2023     (\x. (\x. Normal (z x) * indicator_fn (c x) x') x - (\x. Normal (z' x) * indicator_fn (c x) x') x)`
2024          by METIS_TAC [] >> POP_ORW
2025 >> (MATCH_MP_TAC o UNDISCH o Q.SPEC `k` o GSYM o INST_TYPE [alpha |-> ``:num``])
2026       EXTREAL_SUM_IMAGE_SUB
2027 >> DISJ1_TAC
2028 >> RW_TAC std_ss [indicator_fn_def, mul_rzero, mul_rone]
2029 >> RW_TAC std_ss [extreal_of_num_def, extreal_not_infty]
2030QED
2031
2032Theorem psfis_sub :
2033    !m f g a b. measure_space m /\ measure m (m_space m) <> PosInf /\
2034               (!x. x IN m_space m ==> g x <= f x) /\
2035               (!x. x IN m_space m ==> g x <> PosInf) /\
2036                a IN psfis m f /\ b IN psfis m g ==> (a - b) IN psfis m (\x. f x - g x)
2037Proof
2038    RW_TAC std_ss [psfis_def, IN_IMAGE, psfs_def, GSPECIFICATION]
2039 >> Cases_on `x'` >> Cases_on `x` >> Cases_on `x''` >> Cases_on `x'''`
2040 >> RW_TAC std_ss []
2041 >> Cases_on `r'` >> Cases_on `r` >> Cases_on `r''` >> Cases_on `r'''`
2042 >> RW_TAC std_ss []
2043 >> FULL_SIMP_TAC std_ss [PAIR_EQ]
2044 >> Suff `?s a x. (pos_simple_fn_integral m q q''''' r' -
2045                   pos_simple_fn_integral m q''' q''''''' r'' =
2046                   pos_simple_fn_integral m s a x) /\
2047                  pos_simple_fn m (\x. f x - g x) s a x`
2048 >- (RW_TAC std_ss [] >> Q.EXISTS_TAC `(s,a,x)` \\
2049     RW_TAC std_ss [] >> Q.EXISTS_TAC `(s,a,x)` >> RW_TAC std_ss [PAIR_EQ])
2050 >> ONCE_REWRITE_TAC [CONJ_COMM]
2051 >> MATCH_MP_TAC pos_simple_fn_integral_sub >> RW_TAC std_ss []
2052QED
2053
2054(* ---------------------------------------------------- *)
2055(* Properties of Integrals of Positive Functions        *)
2056(* ---------------------------------------------------- *)
2057
2058Theorem pos_fn_integral_pos_simple_fn :
2059    !m f s a x. measure_space m /\ pos_simple_fn m f s a x ==>
2060               (pos_fn_integral m f = pos_simple_fn_integral m s a x)
2061Proof
2062    RW_TAC std_ss [pos_fn_integral_def, sup_eq', IN_psfis_eq,
2063                   GSPECIFICATION]
2064 >- METIS_TAC [pos_simple_fn_integral_mono]
2065 >> POP_ASSUM MATCH_MP_TAC
2066 >> METIS_TAC [le_refl]
2067QED
2068
2069Theorem pos_fn_integral_mspace :
2070    !m f. measure_space m /\ (!x. x IN m_space m ==> 0 <= f x) ==>
2071         (pos_fn_integral m f = pos_fn_integral m (\x. f x * indicator_fn (m_space m) x))
2072Proof
2073    RW_TAC std_ss [pos_fn_integral_def,sup_eq]
2074 >- (RW_TAC real_ss [le_sup] \\
2075     POP_ASSUM MATCH_MP_TAC \\
2076     ONCE_REWRITE_TAC [GSYM SPECIFICATION] \\
2077     POP_ASSUM (MP_TAC o REWRITE_RULE [Once (GSYM SPECIFICATION)]) \\
2078     RW_TAC real_ss [GSPECIFICATION, indicator_fn_def] \\
2079     Q.EXISTS_TAC `(\x. g x * indicator_fn (m_space m) x)` \\
2080     reverse (RW_TAC real_ss [indicator_fn_def, IN_psfis_eq, mul_rone, mul_rzero, le_refl]) \\
2081     FULL_SIMP_TAC std_ss [IN_psfis_eq, pos_simple_fn_def] \\
2082     qexistsl_tac [`s`, `a`, `x`] \\
2083     RW_TAC real_ss [mul_rzero, le_refl, mul_rone] \\
2084     MATCH_MP_TAC EXTREAL_SUM_IMAGE_POS \\
2085     RW_TAC std_ss [mul_rzero,le_refl, mul_rone, indicator_fn_def] \\
2086     METIS_TAC [extreal_of_num_def, extreal_le_def])
2087 >> RW_TAC real_ss [sup_le]
2088 >> POP_ASSUM (MP_TAC o REWRITE_RULE [Once (GSYM SPECIFICATION)])
2089 >> RW_TAC real_ss [GSPECIFICATION]
2090 >> Q.PAT_X_ASSUM `!z. Q z ==> z <= y` MATCH_MP_TAC
2091 >> RW_TAC std_ss [Once (GSYM SPECIFICATION),GSPECIFICATION]
2092 >> Q.EXISTS_TAC `(\x. g x * indicator_fn (m_space m) x)`
2093 >> RW_TAC std_ss [IN_psfis_eq]
2094 >- (FULL_SIMP_TAC real_ss [IN_psfis_eq, pos_simple_fn_def, indicator_fn_def] \\
2095     qexistsl_tac [`s`, `a`, `x`] \\
2096     RW_TAC real_ss [le_refl, mul_rzero, mul_rone] \\
2097     MATCH_MP_TAC EXTREAL_SUM_IMAGE_POS \\
2098     RW_TAC std_ss [mul_rzero, le_refl, mul_rone, indicator_fn_def] \\
2099     METIS_TAC [extreal_of_num_def, extreal_le_def])
2100 >> FULL_SIMP_TAC std_ss [indicator_fn_def, le_refl, mul_rzero, mul_rone]
2101 >> METIS_TAC [mul_rone, mul_rzero]
2102QED
2103
2104Theorem pos_fn_integral_zero :
2105    !m. measure_space m ==> (pos_fn_integral m (\x. 0) = 0)
2106Proof
2107    RW_TAC std_ss [pos_fn_integral_def, sup_eq']
2108 >- (fs [GSPECIFICATION] \\
2109     MATCH_MP_TAC psfis_mono \\
2110     qexistsl_tac [`m`, `g`, `(\x. 0)`] \\
2111     RW_TAC std_ss [psfis_zero])
2112 >> POP_ASSUM MATCH_MP_TAC
2113 >> RW_TAC std_ss [GSPECIFICATION]
2114 >> Q.EXISTS_TAC `(\x. 0)`
2115 >> RW_TAC std_ss [le_refl, psfis_zero]
2116QED
2117
2118Theorem pos_fn_integral_mono :
2119    !m f g. (!x. x IN m_space m ==> 0 <= f x) /\
2120            (!x. x IN m_space m ==> f x <= g x) ==>
2121            pos_fn_integral m f <= pos_fn_integral m g
2122Proof
2123    RW_TAC std_ss [pos_fn_integral_def]
2124 >> MATCH_MP_TAC sup_le_sup_imp
2125 >> RW_TAC std_ss []
2126 >> Q.EXISTS_TAC `x`
2127 >> RW_TAC std_ss [le_refl]
2128 >> `x IN {r | ?g. r IN psfis m g /\ !x. x IN m_space m ==> g x <= f x}`
2129       by METIS_TAC [IN_DEF]
2130 >> ONCE_REWRITE_TAC [GSYM SPECIFICATION]
2131 >> `?g. x IN psfis m g /\ !x. x IN m_space m ==> g x <= f x`
2132       by (FULL_SIMP_TAC std_ss [GSPECIFICATION] >> METIS_TAC [])
2133 >> FULL_SIMP_TAC std_ss [GSPECIFICATION]
2134 >> METIS_TAC [le_trans]
2135QED
2136
2137val pos_fn_integral_mono_mspace = pos_fn_integral_mono;
2138
2139(* added `x IN m_space m` *)
2140Theorem pos_fn_integral_pos :
2141    !m f. measure_space m /\ (!x. x IN m_space m ==> 0 <= f x) ==>
2142          0 <= pos_fn_integral m f
2143Proof
2144    RW_TAC std_ss []
2145 >> `0 = pos_fn_integral m (\x. 0)` by METIS_TAC [pos_fn_integral_zero]
2146 >> POP_ORW
2147 >> MATCH_MP_TAC pos_fn_integral_mono
2148 >> RW_TAC std_ss [le_refl]
2149QED
2150
2151Theorem pos_fn_integral_cmul :
2152    !m f c. measure_space m /\ (!x. x IN m_space m ==> 0 <= f x) /\ 0 <= c ==>
2153           (pos_fn_integral m (\x. Normal c * f x) = Normal c * pos_fn_integral m f)
2154Proof
2155    RW_TAC std_ss []
2156 >> Cases_on `c = 0`
2157 >- RW_TAC std_ss [GSYM extreal_of_num_def,mul_lzero,pos_fn_integral_zero]
2158 >> `0 < c` by FULL_SIMP_TAC std_ss [REAL_LT_LE]
2159 >> RW_TAC std_ss [pos_fn_integral_def, sup_eq']
2160 >- (Suff `y / (Normal c) <= sup {r | ?g. r IN psfis m g /\ !x. x IN m_space m ==> g x <= f x}`
2161     >- METIS_TAC [le_ldiv, mul_comm] \\
2162     RW_TAC std_ss [le_sup'] \\
2163     POP_ASSUM MATCH_MP_TAC \\
2164     fs [GSPECIFICATION] \\
2165     Q.EXISTS_TAC `(\x. g x / (Normal c))` \\
2166     reverse (RW_TAC std_ss [])
2167     >- METIS_TAC [mul_comm, le_ldiv] \\
2168     RW_TAC std_ss [extreal_div_def] \\
2169    `inv (Normal c) * y IN psfis m (\x. inv (Normal c) * g x)`
2170       by METIS_TAC [psfis_cmul, extreal_inv_def, REAL_LE_INV] \\
2171    `(\x. g x * inv (Normal c)) = (\x. inv (Normal c) * g x)`
2172       by RW_TAC std_ss [FUN_EQ_THM, mul_comm] \\
2173     RW_TAC std_ss [Once mul_comm])
2174 >> Suff `sup {r | ?g. r IN psfis m g /\ !x. x IN m_space m ==> g x <= f x} <= y / Normal c`
2175 >- METIS_TAC [le_rdiv, extreal_not_infty, mul_comm]
2176 >> RW_TAC std_ss [sup_le']
2177 >> fs [GSPECIFICATION]
2178 >> Suff `y' * Normal c <= y` >- METIS_TAC [le_rdiv, extreal_not_infty]
2179 >> FIRST_X_ASSUM MATCH_MP_TAC
2180 >> Q.EXISTS_TAC `(\x. Normal c * g x)`
2181 >> RW_TAC std_ss []
2182 >- METIS_TAC [psfis_cmul, mul_comm, extreal_not_infty]
2183 >> METIS_TAC [le_lmul_imp, extreal_of_num_def, extreal_lt_eq, lt_le]
2184QED
2185
2186Theorem pos_fn_integral_indicator :
2187    !m s. measure_space m /\ s IN measurable_sets m ==>
2188         (pos_fn_integral m (indicator_fn s) = measure m s)
2189Proof
2190    METIS_TAC [pos_fn_integral_pos_simple_fn, pos_simple_fn_integral_indicator]
2191QED
2192
2193Theorem pos_fn_integral_cmul_indicator :
2194    !m s c. measure_space m /\ s IN measurable_sets m /\ 0 <= c ==>
2195           (pos_fn_integral m (\x. Normal c * indicator_fn s x) = Normal c * measure m s)
2196Proof
2197    RW_TAC std_ss []
2198 >> `!x. 0 <= indicator_fn s x`
2199       by RW_TAC std_ss [indicator_fn_def, le_refl, le_01]
2200 >> RW_TAC std_ss [pos_fn_integral_cmul]
2201 >> METIS_TAC [pos_fn_integral_pos_simple_fn, pos_simple_fn_integral_indicator]
2202QED
2203
2204(* NOTE: removed “measure m (m_space m) < PosInf” *)
2205Theorem pos_fn_integral_const :
2206    !m c. measure_space m /\ 0 <= c ==>
2207         (pos_fn_integral m (\x. Normal c) = Normal c * measure m (m_space m))
2208Proof
2209    rpt STRIP_TAC
2210 >> Know ‘pos_fn_integral m (\x. Normal c)  =
2211          pos_fn_integral m (\x. (\x. Normal c) x * indicator_fn (m_space m) x)’
2212 >- (MATCH_MP_TAC pos_fn_integral_mspace \\
2213     rw [extreal_of_num_def, extreal_le_eq])
2214 >> BETA_TAC >> Rewr'
2215 >> MATCH_MP_TAC pos_fn_integral_cmul_indicator
2216 >> simp [MEASURE_SPACE_MSPACE_MEASURABLE]
2217QED
2218
2219Theorem pos_fn_integral_sum_cmul_indicator :
2220    !m s a x. measure_space m /\ FINITE s /\ (!i:num. i IN s ==> 0 <= x i) /\
2221             (!i:num. i IN s ==> a i IN measurable_sets m) ==>
2222             (pos_fn_integral m (\t. SIGMA (\i:num. Normal (x i) * indicator_fn (a i) t) s) =
2223              SIGMA (\i. Normal (x i) * measure m (a i)) s)
2224Proof
2225    RW_TAC std_ss []
2226 >> Cases_on `s = {}`
2227 >- RW_TAC std_ss [EXTREAL_SUM_IMAGE_EMPTY, pos_fn_integral_zero]
2228 >> `!i. i IN s ==> pos_simple_fn m (indicator_fn (a i)) {0:num; 1}
2229                                    (\n. if n = 0 then m_space m DIFF (a i) else (a i))
2230                                    (\n:num. if n = 0 then 0 else 1)`
2231       by METIS_TAC [pos_simple_fn_indicator_alt]
2232 >> `!i. i IN s ==> pos_simple_fn m (\t. Normal (x i) * indicator_fn (a i) t) {0:num; 1}
2233                                    (\n:num. if n = 0 then m_space m DIFF (a i) else (a i))
2234                                    (\n:num. (x i) * (if n = 0 then 0 else 1))`
2235       by METIS_TAC [pos_simple_fn_cmul_alt]
2236 >> (MP_TAC o Q.SPECL [`m`,`(\i. (\t. Normal (x i) * indicator_fn (a i) t))`,
2237                       `(\i. {0; 1})`,
2238                       `(\i. (\n. if n = 0 then m_space m DIFF a i else a i))`,
2239                       `(\i. (\n. x i * if n = 0 then 0 else 1))`,`s`] o
2240     INST_TYPE [beta |-> ``:num``]) pos_simple_fn_integral_sum_alt
2241 >> `!i t. i IN s ==> Normal (x i) * indicator_fn (a i) t <> NegInf`
2242       by RW_TAC std_ss [indicator_fn_def, mul_rzero, mul_rone, num_not_infty]
2243 >> RW_TAC std_ss []
2244 >> `{1:num} DELETE 0 = {1}`
2245       by METIS_TAC [DELETE_NON_ELEMENT, EVAL ``0=1:num``, EXTENSION, IN_DELETE,
2246                     IN_SING, NOT_IN_EMPTY]
2247 >> `FINITE {1:num}` by RW_TAC std_ss [FINITE_SING]
2248 >> `!i:num. i IN s ==>
2249             (pos_simple_fn_integral m {0:num; 1}
2250                                       (\n:num. if n = 0 then m_space m DIFF a i else a i)
2251                                       (\n:num. x i * if n = 0 then 0 else 1) =
2252              Normal (x i) * measure m (a i))`
2253       by (RW_TAC real_ss [pos_simple_fn_integral_def] \\
2254          `!n:num. n IN {0;1} ==>
2255                   (\n. Normal (x i * if n = 0 then 0 else 1) *
2256                        measure m (if n = 0 then m_space m DIFF a i else a i)) n <> NegInf`
2257              by (RW_TAC real_ss [GSYM extreal_of_num_def, num_not_infty, mul_lzero] \\
2258                  METIS_TAC [mul_not_infty, positive_not_infty,
2259                             MEASURE_SPACE_POSITIVE, IN_INSERT]) \\
2260           (MP_TAC o Q.SPEC `0` o UNDISCH o
2261            Q.SPECL [`(\n. Normal (x (i:num) * if n = 0 then 0 else 1) *
2262                           measure m (if n = 0 then m_space m DIFF a i else a i))`,`{1}`] o
2263            INST_TYPE [alpha |-> ``:num``]) EXTREAL_SUM_IMAGE_PROPERTY \\
2264           RW_TAC real_ss [mul_lzero, add_lzero, EXTREAL_SUM_IMAGE_SING, GSYM extreal_of_num_def])
2265 >> (MP_TAC o Q.SPEC `(\i:num. pos_simple_fn_integral m {0:num; 1}
2266                               (\n:num. if n = 0 then m_space m DIFF a i else a i)
2267                               (\n:num. x i * if n = 0 then 0 else 1:real))` o
2268     UNDISCH o Q.SPEC `s` o INST_TYPE [alpha |-> ``:num``]) EXTREAL_SUM_IMAGE_IN_IF
2269 >> `!x'. x' IN s ==> (\i. pos_simple_fn_integral m {0; 1}
2270             (\n. if n = 0 then m_space m DIFF a i else a i)
2271             (\n. x i * if n = 0 then 0 else 1)) x' <> NegInf`
2272       by (RW_TAC std_ss [] \\
2273           METIS_TAC [mul_not_infty, positive_not_infty, MEASURE_SPACE_POSITIVE, IN_INSERT])
2274 >> RW_TAC std_ss []
2275 >> FULL_SIMP_TAC std_ss []
2276 >> (MP_TAC o Q.SPECL [`s:num->bool`,`s`,`(\i:num. Normal (x i) * measure m (a i))`] o
2277     INST_TYPE [alpha |-> ``:num``]) EXTREAL_SUM_IMAGE_IF_ELIM
2278 >> `!x'. x' IN s ==> Normal (x x') * measure m (a x') <> NegInf`
2279       by METIS_TAC [mul_not_infty, positive_not_infty, MEASURE_SPACE_POSITIVE, IN_INSERT]
2280 >> RW_TAC std_ss []
2281 >> FULL_SIMP_TAC std_ss [SPECIFICATION]
2282 >> NTAC 7 (POP_ASSUM (K ALL_TAC))
2283 >> POP_ASSUM (MP_TAC o GSYM)
2284 >> RW_TAC std_ss []
2285 >> RW_TAC std_ss [pos_fn_integral_def, sup_eq]
2286 >- (POP_ASSUM (MP_TAC o ONCE_REWRITE_RULE [GSYM SPECIFICATION]) \\
2287     RW_TAC std_ss [GSPECIFICATION, IN_psfis_eq] \\
2288     MATCH_MP_TAC pos_simple_fn_integral_mono \\
2289     Q.EXISTS_TAC `g` \\
2290     Q.EXISTS_TAC `(\t. SIGMA (\i. Normal (x i) * indicator_fn (a i) t) s)` \\
2291     RW_TAC std_ss [])
2292 >> POP_ASSUM MATCH_MP_TAC
2293 >> ONCE_REWRITE_TAC [GSYM SPECIFICATION]
2294 >> RW_TAC std_ss [GSPECIFICATION,IN_psfis_eq]
2295 >> Q.EXISTS_TAC `(\t. SIGMA (\i. Normal (x i) * indicator_fn (a i) t) s)`
2296 >> RW_TAC real_ss []
2297 >> METIS_TAC [le_refl]
2298QED
2299
2300(***************************************************************************)
2301(*                       Sequences - Convergence                           *)
2302(***************************************************************************)
2303
2304(* added `x IN m_space m` at various places *)
2305Theorem lebesgue_monotone_convergence_lemma[local] :
2306    !m f fi g r'.
2307        measure_space m /\
2308        (!i. fi i IN measurable (m_space m, measurable_sets m) Borel) /\
2309        (!x. x IN m_space m ==> mono_increasing (\i. fi i x)) /\
2310        (!x. x IN m_space m ==> (sup (IMAGE (\i. fi i x) UNIV) = f x)) /\
2311        (r' IN psfis m g) /\ (!x. x IN m_space m ==> g x <= f x) /\
2312        (!i x. x IN m_space m ==> 0 <= fi i x) ==>
2313         r' <= sup (IMAGE (\i. pos_fn_integral m (fi i)) UNIV)
2314Proof
2315    rpt STRIP_TAC
2316 >> Q.ABBREV_TAC `r = sup (IMAGE (\i. pos_fn_integral m (fi i)) UNIV)`
2317 >> Q.ABBREV_TAC `ri = (\i. pos_fn_integral m (fi i))`
2318 >> MATCH_MP_TAC le_mul_epsilon
2319 >> RW_TAC std_ss []
2320 >> (Cases_on `z` \\
2321     FULL_SIMP_TAC std_ss [le_infty, lt_infty, extreal_not_infty, extreal_of_num_def])
2322 >> FULL_SIMP_TAC std_ss [extreal_le_def, extreal_lt_eq]
2323 (* stage work *)
2324 >> Q.ABBREV_TAC `b = \n. {t | Normal r'' * g t <= (fi n) t}`
2325 >> `?s a x. pos_simple_fn m g s a x` by METIS_TAC [IN_psfis]
2326 >> `!i j. i <= j ==> ri i <= ri j`
2327      by (Q.UNABBREV_TAC `ri`
2328          >> RW_TAC std_ss []
2329          >> MATCH_MP_TAC pos_fn_integral_mono
2330          >> FULL_SIMP_TAC std_ss [ext_mono_increasing_def, GSYM extreal_of_num_def])
2331 >> `f IN measurable (m_space m, measurable_sets m) Borel`
2332      by (MATCH_MP_TAC IN_MEASURABLE_BOREL_MONO_SUP
2333          >> Q.EXISTS_TAC `fi`
2334          >> RW_TAC std_ss [space_def]
2335          >- FULL_SIMP_TAC std_ss [measure_space_def]
2336          >> FULL_SIMP_TAC std_ss [ext_mono_increasing_def,ext_mono_increasing_suc])
2337 >> `g IN measurable (m_space m, measurable_sets m) Borel`
2338      by METIS_TAC [IN_psfis_eq, IN_MEASURABLE_BOREL_POS_SIMPLE_FN]
2339 >> `(\t. Normal r'' * g t) IN measurable (m_space m, measurable_sets m) Borel`
2340      by (MATCH_MP_TAC IN_MEASURABLE_BOREL_CMUL \\
2341          qexistsl_tac [`g`, `r''`] \\
2342          RW_TAC real_ss [extreal_not_infty] \\
2343          METIS_TAC [measure_space_def])
2344 >> `!n:num. {t | Normal r'' * g t <= fi n t} INTER m_space m =
2345             {t | 0 <= (fi n t) - Normal r'' * (g t)} INTER m_space m`
2346      by (RW_TAC real_ss [EXTENSION, GSPECIFICATION, IN_INTER] \\
2347          METIS_TAC [pos_simple_fn_not_infty, mul_not_infty, add_lzero,
2348                     le_sub_eq, num_not_infty])
2349 >> `!n. (\t. fi n t - Normal r'' * g t) IN measurable (m_space m, measurable_sets m) Borel`
2350      by (RW_TAC std_ss [] \\
2351          MATCH_MP_TAC IN_MEASURABLE_BOREL_SUB \\
2352          Q.EXISTS_TAC `fi n` \\
2353          Q.EXISTS_TAC `(\t. Normal r'' * g t)` \\
2354          RW_TAC std_ss [space_def] >| (* 2 subgoals *)
2355          [ FULL_SIMP_TAC std_ss [measure_space_def],
2356            DISJ1_TAC \\
2357            CONJ_TAC >- (METIS_TAC [pos_not_neginf, GSYM extreal_of_num_def]) \\
2358            METIS_TAC [pos_simple_fn_not_infty, mul_not_infty] ])
2359 >> `!n. {t | Normal r'' * g t <= fi n t} INTER m_space m IN measurable_sets m`
2360      by METIS_TAC [IN_MEASURABLE_BOREL_ALL, m_space_def, space_def, subsets_def,
2361                    measurable_sets_def, measure_space_def, extreal_of_num_def]
2362 >> `!n. b n INTER m_space m IN measurable_sets m` by (Q.UNABBREV_TAC `b` >> METIS_TAC [])
2363 (* stage work *)
2364 >> Suff `r' = sup (IMAGE (\n. pos_fn_integral m
2365                                 (\x. g x * indicator_fn (b n INTER m_space m) x)) UNIV)`
2366 >- (Q.UNABBREV_TAC `r` \\
2367     RW_TAC std_ss [le_sup'] \\
2368     Cases_on `r'' = 0`
2369     >- (RW_TAC std_ss [mul_lzero, GSYM extreal_of_num_def] \\
2370         MATCH_MP_TAC le_trans >> Q.EXISTS_TAC `ri (1:num)` \\
2371         reverse CONJ_TAC
2372         >- (POP_ASSUM MATCH_MP_TAC \\
2373             RW_TAC std_ss [IN_IMAGE, IN_UNIV] >> METIS_TAC []) \\
2374         Q.UNABBREV_TAC `ri` \\
2375         RW_TAC std_ss [] \\
2376         METIS_TAC [pos_fn_integral_pos, extreal_of_num_def]) \\
2377    `0 < r''` by METIS_TAC [REAL_LT_LE] \\
2378    `0 < Normal r''` by METIS_TAC [extreal_lt_eq, extreal_of_num_def, REAL_LE_REFL] \\
2379     ONCE_REWRITE_TAC [mul_comm] \\
2380     RW_TAC std_ss [le_rdiv] \\
2381     RW_TAC std_ss [sup_le'] \\
2382     POP_ASSUM MP_TAC >> RW_TAC std_ss [IN_IMAGE, IN_UNIV] \\
2383     RW_TAC std_ss [GSYM le_rdiv] \\
2384     ONCE_REWRITE_TAC [mul_comm] \\
2385    `!x. x IN m_space m ==> 0 <= (\x. g x * indicator_fn (b n INTER m_space m) x) x`
2386        by (RW_TAC std_ss [indicator_fn_def, mul_rone, mul_rzero, le_refl] \\
2387            FULL_SIMP_TAC std_ss [pos_simple_fn_def]) \\
2388     FULL_SIMP_TAC std_ss [GSYM pos_fn_integral_cmul] \\
2389    `!x. x IN m_space m ==> (\x. Normal r'' * (g x * indicator_fn (b n INTER m_space m) x)) x <= fi n x`
2390        by (Q.UNABBREV_TAC `b` \\
2391            RW_TAC real_ss [indicator_fn_def, GSPECIFICATION, IN_INTER, mul_rzero, mul_rone] \\
2392            METIS_TAC [extreal_of_num_def]) \\
2393     MATCH_MP_TAC le_trans \\
2394     Q.EXISTS_TAC `pos_fn_integral m (fi n)` \\
2395     CONJ_TAC >- (MATCH_MP_TAC pos_fn_integral_mono >> METIS_TAC [le_mul, lt_le]) \\
2396     RW_TAC std_ss [] \\
2397     FIRST_X_ASSUM MATCH_MP_TAC \\
2398     RW_TAC std_ss [IN_IMAGE, IN_UNIV] \\
2399     Q.EXISTS_TAC `n` >> REWRITE_TAC [])
2400 >> `!n:num. (\x. g x * indicator_fn (b n INTER m_space m) x) =
2401             (\t. SIGMA (\i. Normal (x i) * indicator_fn (a i INTER (b n INTER m_space m)) t) s)`
2402      by (RW_TAC std_ss [] >> FUN_EQ_TAC \\
2403          RW_TAC std_ss [] \\
2404          Cases_on `~(x' IN m_space m)`
2405          >- (RW_TAC real_ss [indicator_fn_def, IN_INTER, mul_rone, mul_rzero] \\
2406              METIS_TAC [pos_simple_fn_def,EXTREAL_SUM_IMAGE_ZERO]) \\
2407          RW_TAC real_ss [indicator_fn_def, IN_INTER, mul_rone, mul_rzero]
2408          >- FULL_SIMP_TAC real_ss [pos_simple_fn_def, indicator_fn_def] \\
2409          FULL_SIMP_TAC std_ss [pos_simple_fn_def, EXTREAL_SUM_IMAGE_ZERO])
2410 >> RW_TAC std_ss []
2411 >> `!n:num i. i IN s ==> (a i INTER (b n INTER m_space m)) IN measurable_sets m`
2412      by METIS_TAC [MEASURE_SPACE_INTER,pos_simple_fn_def]
2413 >> `FINITE s` by FULL_SIMP_TAC std_ss [pos_simple_fn_def]
2414 >> `!n :num.
2415       (pos_fn_integral m (\t. SIGMA (\i. Normal (x i) *
2416                                          indicator_fn ((\i. a i INTER (b n INTER m_space m)) i) t) s) =
2417        SIGMA (\i. Normal (x i) * measure m ((\i. a i INTER (b n INTER m_space m)) i)) s)`
2418      by (RW_TAC std_ss [] \\
2419          (MP_TAC o Q.SPECL [`m`, `s:num->bool`,
2420                             `(\i:num. a i INTER (b (n:num) INTER m_space m))`,
2421                             `(x:num->real)`]) pos_fn_integral_sum_cmul_indicator \\
2422          FULL_SIMP_TAC std_ss [pos_simple_fn_def])
2423 >> FULL_SIMP_TAC std_ss []
2424 >> Know `!i. i IN s ==> !n.
2425            (\i n. Normal (x i) * measure m (a i INTER (b n INTER m_space m))) i n <=
2426            (\i n. Normal (x i) * measure m (a i INTER (b n INTER m_space m))) i (SUC n)`
2427 >- (RW_TAC std_ss [] \\
2428     MATCH_MP_TAC le_lmul_imp \\
2429     RW_TAC std_ss []
2430     >- METIS_TAC [pos_simple_fn_def, extreal_le_def, extreal_of_num_def] \\
2431     MATCH_MP_TAC INCREASING \\
2432     RW_TAC std_ss [MEASURE_SPACE_INCREASING] \\
2433     RW_TAC std_ss [SUBSET_DEF,IN_INTER] \\
2434     Q.UNABBREV_TAC `b` \\
2435     FULL_SIMP_TAC std_ss [GSPECIFICATION] \\
2436     MATCH_MP_TAC le_trans >> Q.EXISTS_TAC `fi n x'` \\
2437     RW_TAC real_ss [] \\
2438     FULL_SIMP_TAC real_ss [ext_mono_increasing_suc])
2439 >> `!i. i IN s ==> !n. 0 <= (\i n. Normal (x i) * measure m (a i INTER (b n INTER m_space m))) i n`
2440       by (RW_TAC std_ss [] \\
2441           METIS_TAC [le_mul, extreal_le_def, extreal_of_num_def, MEASURE_SPACE_POSITIVE,
2442                      positive_def, MEASURE_SPACE_INTER, pos_simple_fn_def])
2443 >> FULL_SIMP_TAC std_ss [sup_sum_mono]
2444 >> RW_TAC std_ss []
2445 >> `!i. i IN s ==>
2446        (sup (IMAGE (\n.  Normal (x i) * measure m (a i INTER (b n INTER m_space m))) UNIV) =
2447         Normal (x i) * sup (IMAGE (\n. measure m (a i INTER (b n INTER m_space m))) UNIV))`
2448      by METIS_TAC [sup_cmul, pos_simple_fn_def]
2449 >> (MP_TAC o Q.SPEC `(\i. sup (IMAGE (\n. Normal (x i) *
2450                                           measure m (a i INTER (b (n:num) INTER m_space m)))
2451                                      UNIV))` o
2452     UNDISCH o Q.SPEC `s` o INST_TYPE [alpha |-> ``:num``]) EXTREAL_SUM_IMAGE_IN_IF
2453 >> `!x':num. x' IN s ==>
2454              (\i:num. sup (IMAGE (\n. Normal (x i) *
2455                                       measure m (a i INTER (b (n:num) INTER m_space m))) UNIV)) x'
2456               <> NegInf`
2457      by (RW_TAC std_ss [lt_infty] \\
2458          MATCH_MP_TAC lte_trans >> Q.EXISTS_TAC `0` \\
2459          RW_TAC std_ss [] >- METIS_TAC [lt_infty, num_not_infty] \\
2460          RW_TAC std_ss [le_sup] \\
2461          MATCH_MP_TAC le_trans \\
2462          Q.EXISTS_TAC `Normal (x x') * measure m ((a x') INTER ((b 1) INTER m_space m))` \\
2463          RW_TAC std_ss [] \\
2464          MATCH_MP_TAC le_lmul_imp \\
2465          CONJ_TAC >- METIS_TAC [extreal_le_def, extreal_of_num_def, pos_simple_fn_def] \\
2466          RW_TAC std_ss [le_sup] \\
2467          POP_ASSUM MATCH_MP_TAC \\
2468          ONCE_REWRITE_TAC [GSYM SPECIFICATION] \\
2469          RW_TAC std_ss [IN_IMAGE, IN_UNIV] \\
2470          METIS_TAC [])
2471 >> RW_TAC std_ss []
2472 >> `!i. BIGUNION (IMAGE (\n. a i INTER (b n INTER m_space m)) UNIV) = a i INTER m_space m`
2473      by (RW_TAC std_ss [EXTENSION, IN_BIGUNION_IMAGE, IN_INTER, IN_UNIV] \\
2474          EQ_TAC >- METIS_TAC [] \\
2475          RW_TAC std_ss [] \\
2476          Q.UNABBREV_TAC `b` \\
2477          RW_TAC real_ss [GSPECIFICATION] \\
2478         `f x' = sup (IMAGE (\i. fi i x') UNIV)` by FULL_SIMP_TAC std_ss [] \\
2479          Cases_on `g x' = 0` >- METIS_TAC [mul_rzero,extreal_of_num_def] \\
2480         `Normal r'' * g x' < f x'`
2481            by (Cases_on `g x' = f x'`
2482                >- (`0 < f x'` by METIS_TAC [le_lt, pos_simple_fn_def] \\
2483                    METIS_TAC [lt_rmul, mul_lone, IN_psfis_eq, pos_simple_fn_not_infty,
2484                               extreal_lt_eq, extreal_of_num_def]) \\
2485               `g x' < f x'` by METIS_TAC [le_lt] \\
2486                METIS_TAC [lt_mul2, mul_lone, extreal_not_infty, pos_simple_fn_not_infty,
2487                           extreal_lt_eq, extreal_of_num_def, extreal_le_def, psfis_pos]) \\
2488          Suff `?n. Normal r'' * g x' <= (\n. fi n x') n` >- RW_TAC std_ss [] \\
2489          MATCH_MP_TAC sup_le_mono \\
2490          CONJ_TAC >- FULL_SIMP_TAC std_ss [ext_mono_increasing_def,
2491                                            ext_mono_increasing_suc] \\
2492          METIS_TAC [])
2493 >> `!i. i IN s==> (a i INTER m_space m = a i)`
2494      by METIS_TAC [pos_simple_fn_def,SUBSET_INTER1,MEASURE_SPACE_SUBSET_MSPACE]
2495 >> `!i. i IN s ==> (sup (IMAGE (measure m o (\n. a i INTER (b n INTER m_space m))) UNIV) =
2496                     measure m (a i))`
2497      by (RW_TAC std_ss [] \\
2498          MATCH_MP_TAC MONOTONE_CONVERGENCE \\
2499          RW_TAC std_ss [IN_FUNSET, IN_UNIV] \\
2500          RW_TAC std_ss [SUBSET_DEF, IN_INTER] \\
2501          Q.UNABBREV_TAC `b` \\
2502          FULL_SIMP_TAC std_ss [GSPECIFICATION] \\
2503          MATCH_MP_TAC le_trans >> Q.EXISTS_TAC `fi n x'` \\
2504          RW_TAC real_ss [] \\
2505          FULL_SIMP_TAC real_ss [ext_mono_increasing_suc])
2506 >> FULL_SIMP_TAC std_ss [o_DEF]
2507 >> `r' = SIGMA (\i. Normal (x i) * measure m (a i)) s`
2508      by METIS_TAC [IN_psfis_eq, psfis_unique, pos_simple_fn_integral_def,
2509                    pos_simple_fn_integral_unique]
2510 >> POP_ORW
2511 >> `!i. i IN s ==> (\i. Normal (x i) * measure m (a i)) i <> NegInf`
2512      by METIS_TAC []
2513 >> (MP_TAC o Q.SPEC `(\i. Normal (x i) * measure m (a i))` o
2514     UNDISCH o Q.ISPEC `s:num->bool`) EXTREAL_SUM_IMAGE_IN_IF
2515 >> RW_TAC std_ss []
2516QED
2517
2518(************************************************************)
2519(*     LEBESGUE MONOTONE CONVERGENCE (Beppo Levi)           *)
2520(************************************************************)
2521
2522(* NOTE: this is actually Theorem 9.6 (Beppo Levi) [1, p.75] for positive functions,
2523         the full version of "Monotone convergence" theroem for arbitrary integrable
2524         functions (Theorem 12.1 [1, p.96]) is not formalized yet.
2525
2526   This theorem is also named after Beppo Levi, an Italian mathematician [4].
2527
2528   Removed unnecessary ‘!x. x IN m_space m ==> 0 <= f x’ (Chun Tian)
2529 *)
2530Theorem lebesgue_monotone_convergence :
2531    !m f fi. measure_space m /\
2532        (!i. fi i IN measurable (m_space m, measurable_sets m) Borel) /\
2533        (!i x. x IN m_space m ==> 0 <= fi i x) /\
2534        (!x. x IN m_space m ==> mono_increasing (\i. fi i x)) /\
2535        (!x. x IN m_space m ==> (sup (IMAGE (\i. fi i x) UNIV) = f x)) ==>
2536        (pos_fn_integral m f = sup (IMAGE (\i. pos_fn_integral m (fi i)) UNIV))
2537Proof
2538    rpt STRIP_TAC
2539 >> Know ‘!x. x IN m_space m ==> 0 <= f x’
2540 >- (rpt STRIP_TAC \\
2541     Q.PAT_X_ASSUM ‘!x. x IN m_space m ==> _ = f x’ (MP_TAC o (Q.SPEC ‘x’)) \\
2542     RW_TAC std_ss [] \\
2543     POP_ASSUM (ONCE_REWRITE_TAC o wrap o SYM) \\
2544     rw [le_sup'] \\
2545     MATCH_MP_TAC le_trans >> Q.EXISTS_TAC ‘fi 0 x’ \\
2546     CONJ_TAC >- (FIRST_X_ASSUM MATCH_MP_TAC >> art []) \\
2547     POP_ASSUM MATCH_MP_TAC >> Q.EXISTS_TAC ‘0’ >> REWRITE_TAC [])
2548 >> POP_ASSUM MP_TAC
2549 >> reverse (RW_TAC std_ss [GSYM le_antisym])
2550 >- (RW_TAC std_ss [sup_le'] \\
2551     POP_ASSUM MP_TAC >> RW_TAC std_ss [IN_IMAGE, IN_UNIV] \\
2552     MATCH_MP_TAC pos_fn_integral_mono \\
2553     RW_TAC std_ss [] \\
2554     Q.PAT_X_ASSUM `!x. x IN m_space m ==> sup (IMAGE _ UNIV) <= f x /\ _`
2555        (MP_TAC o GSYM o UNDISCH o Q.SPEC `x`) \\
2556     RW_TAC std_ss [] \\
2557     FULL_SIMP_TAC std_ss [sup_le'] \\
2558     FIRST_X_ASSUM MATCH_MP_TAC \\
2559     RW_TAC std_ss [IN_IMAGE, IN_UNIV] \\
2560     Q.EXISTS_TAC `i` >> REWRITE_TAC [])
2561 >> Q.ABBREV_TAC `r = sup (IMAGE (\i. pos_fn_integral m (fi i)) UNIV)`
2562 >> RW_TAC std_ss [pos_fn_integral_def, sup_le]
2563 >> POP_ASSUM (MP_TAC o ONCE_REWRITE_RULE [GSYM SPECIFICATION])
2564 >> RW_TAC std_ss [GSPECIFICATION]
2565 >> METIS_TAC [lebesgue_monotone_convergence_lemma, le_antisym]
2566QED
2567
2568(* removed unnecessary ‘!x. x IN m_space m ==> 0 <= f x’ (Chun Tian) *)
2569Theorem lebesgue_monotone_convergence_subset :
2570    !m f fi A. measure_space m /\
2571        (!i. fi i IN measurable (m_space m, measurable_sets m) Borel) /\
2572        (!i x. x IN m_space m ==> 0 <= fi i x) /\
2573        (!x. x IN m_space m ==> (sup (IMAGE (\i. fi i x) UNIV) = f x)) /\
2574        (!x. x IN m_space m ==> mono_increasing (\i. fi i x)) /\
2575         A IN measurable_sets m ==>
2576        (pos_fn_integral m (\x. f x * indicator_fn A x) =
2577         sup (IMAGE (\i. pos_fn_integral m (\x. fi i x * indicator_fn A x)) UNIV))
2578Proof
2579    RW_TAC std_ss []
2580 >> (MP_TAC o Q.SPECL [`m`, `(\x. f x * indicator_fn A x)`,
2581                       `(\i. (\x. fi i x * indicator_fn A x))`])
2582       lebesgue_monotone_convergence
2583 >> RW_TAC std_ss []
2584 >> POP_ASSUM MATCH_MP_TAC
2585 >> CONJ_TAC
2586 >- METIS_TAC [IN_MEASURABLE_BOREL_MUL_INDICATOR, measure_space_def, subsets_def,
2587               measurable_sets_def]
2588 >> CONJ_TAC >- RW_TAC std_ss [indicator_fn_def,mul_rone,mul_rzero,le_refl]
2589 >> CONJ_TAC
2590 >- (RW_TAC std_ss [indicator_fn_def, mul_rone, mul_rzero, le_refl, ext_mono_increasing_def] \\
2591     FULL_SIMP_TAC std_ss [ext_mono_increasing_def])
2592 >> RW_TAC std_ss [indicator_fn_def,mul_rone,mul_rzero]
2593 >> Suff `IMAGE (\i:num. 0:extreal) UNIV = (\y. y = 0)` >- RW_TAC std_ss [sup_const]
2594 >> RW_TAC std_ss [EXTENSION, IN_ABS, IN_IMAGE, IN_UNIV]
2595QED
2596
2597(**********************************************************)
2598(*  Integration of convergent sequence (fn_seq_integral)  *)
2599(**********************************************************)
2600
2601(* NOTE: Given the following (s,a,x) for a sequence of positive simple function:
2602
2603   s = `count (4 ** n + 1)`
2604   a = `(\k. if k IN count (4 ** n) then
2605               {x | x IN m_space m /\ &k / 2 pow n <= f x /\ f x < (&k + 1) / 2 pow n}
2606             else
2607               {x | x IN m_space m /\ 2 pow n <= f x})`
2608   x = `(\k. if k IN count (4 ** n) then &k / 2 pow n else 2 pow n)`
2609
2610   We have (as part of lemma_fn_seq_in_psfis):
2611   |- fn_seq m f = \n t. SIGMA (\i. Normal (x i) * indicator_fn (a i) t) s)
2612   |- fn_seq_integral m f n = pos_simple_fn_integral m s a x
2613 *)
2614Definition fn_seq_integral_def :
2615    fn_seq_integral m f =
2616         (\n. SIGMA
2617                (\k. &k / 2 pow n *
2618                     measure m
2619                       {x | x IN m_space m /\ &k / 2 pow n <= f x /\
2620                            f x < (&k + 1) / 2 pow n}) (count (4 ** n)) +
2621              2 pow n * measure m {x | x IN m_space m /\ 2 pow n <= f x})
2622End
2623
2624(* SEQ Positive Simple Functions and Define Integral *)
2625Theorem lemma_fn_seq_measurable:
2626    !m f n. measure_space m /\ f IN Borel_measurable (measurable_space m) /\
2627           (!x. x IN m_space m ==> 0 <= f x) ==>
2628            fn_seq m f n IN measurable (m_space m,measurable_sets m) Borel
2629Proof
2630    RW_TAC std_ss [fn_seq_def]
2631 >> MATCH_MP_TAC IN_MEASURABLE_BOREL_ADD >> simp []
2632 >> qexistsl_tac [‘\x. SIGMA
2633                  (\k. &k / 2 pow n *
2634                       indicator_fn
2635                         {x | x IN m_space m /\ &k / 2 pow n <= f x /\
2636                              f x < (&k + 1) / 2 pow n} x) (count (4 ** n))’,
2637                  ‘\x. 2 pow n *
2638                       indicator_fn {x | x IN m_space m /\ 2 pow n <= f x} x’]
2639 >> ‘sigma_algebra (m_space m,measurable_sets m)’
2640       by FULL_SIMP_TAC std_ss [measure_space_def]
2641 >> ASM_SIMP_TAC std_ss []
2642 >> CONJ_TAC
2643 >- (MATCH_MP_TAC (INST_TYPE [“:'b” |-> “:num”] IN_MEASURABLE_BOREL_SUM) \\
2644     ASM_SIMP_TAC std_ss [space_def] \\
2645     qexistsl_tac [‘\k x. &k / 2 pow n *
2646                          indicator_fn {x | x IN m_space m /\ &k / 2 pow n <= f x /\
2647                                            f x < (&k + 1) / 2 pow n} x’,
2648                   ‘count (4 ** n)’] \\
2649     SIMP_TAC std_ss [FINITE_COUNT] \\
2650     reverse CONJ_TAC
2651     >- (rpt GEN_TAC >> STRIP_TAC \\
2652         rename1 ‘&i / 2 pow n * indicator_fn s x’ \\
2653        ‘?r. indicator_fn s x = Normal r’
2654           by METIS_TAC [indicator_fn_normal] >> POP_ORW \\
2655        ‘!n. 0:real < 2 pow n’ by RW_TAC real_ss [REAL_POW_LT] \\
2656        ‘!n. 0:real <> 2 pow n’ by RW_TAC real_ss [REAL_LT_IMP_NE] \\
2657        ‘!n k. &k / 2 pow n = Normal (&k / 2 pow n)’
2658            by METIS_TAC [extreal_of_num_def, extreal_pow_def, extreal_div_eq] \\
2659         rw [extreal_mul_def, extreal_not_infty]) \\
2660     rpt STRIP_TAC \\
2661     HO_MATCH_MP_TAC IN_MEASURABLE_BOREL_MUL_INDICATOR >> rw []
2662     >- (MATCH_MP_TAC IN_MEASURABLE_BOREL_CONST >> rw [] \\
2663         Q.EXISTS_TAC ‘&i / 2 pow n’ >> rw []) \\
2664    ‘{x | x IN m_space m /\ &i / 2 pow n <= f x /\ f x < (&i + 1) / 2 pow n} =
2665     {x | &i / 2 pow n <= f x /\ f x < (&i + 1) / 2 pow n} INTER m_space m’
2666        by SET_TAC [] >> POP_ORW \\
2667     METIS_TAC [IN_MEASURABLE_BOREL_ALL_MEASURE])
2668 >> CONJ_TAC
2669 >- (HO_MATCH_MP_TAC IN_MEASURABLE_BOREL_MUL_INDICATOR >> rw []
2670     >- (MATCH_MP_TAC IN_MEASURABLE_BOREL_CONST >> rw [] \\
2671         Q.EXISTS_TAC ‘2 pow n’ >> rw []) \\
2672    ‘{x | x IN m_space m /\ 2 pow n <= f x} =
2673     {x | 2 pow n <= f x} INTER m_space m’ by SET_TAC [] >> POP_ORW \\
2674      METIS_TAC [IN_MEASURABLE_BOREL_ALL_MEASURE])
2675 >> NTAC 2 STRIP_TAC >> DISJ1_TAC (* easier *)
2676 >> CONJ_TAC >> MATCH_MP_TAC pos_not_neginf
2677 >| [ (* goal 1 (of 2) *)
2678      MATCH_MP_TAC EXTREAL_SUM_IMAGE_POS >> SIMP_TAC std_ss [FINITE_COUNT] \\
2679      Q.X_GEN_TAC ‘i’ >> STRIP_TAC \\
2680      MATCH_MP_TAC le_mul >> rw [INDICATOR_FN_POS] \\
2681     ‘2 pow n = Normal (2 pow n)’
2682        by METIS_TAC [extreal_pow_def, extreal_of_num_def] >> POP_ORW \\
2683      MATCH_MP_TAC le_div \\
2684      reverse CONJ_TAC >- RW_TAC real_ss [REAL_POW_LT] \\
2685      rw [extreal_of_num_def, extreal_le_eq],
2686      (* goal 2 (of 2) *)
2687      MATCH_MP_TAC le_mul >> rw [INDICATOR_FN_POS] \\
2688      MATCH_MP_TAC pow_pos_le >> REWRITE_TAC [le_02] ]
2689QED
2690
2691Theorem lemma_fn_seq_in_psfis[local] :
2692    !m f n. measure_space m /\ f IN Borel_measurable (measurable_space m) /\
2693           (!x. x IN m_space m ==> 0 <= f x) ==>
2694            fn_seq_integral m f n IN psfis m (fn_seq m f n)
2695Proof
2696    RW_TAC std_ss [IN_psfis_eq, pos_simple_fn_def]
2697 >> qexistsl_tac [`count (4 ** n + 1)`,
2698                  `(\k. if k IN count (4 ** n) then
2699                          {x | x IN m_space m /\ &k / 2 pow n <= f x /\
2700                               f x < (&k + 1) / 2 pow n}
2701                        else {x | x IN m_space m /\ 2 pow n <= f x})`,
2702                  `(\k. if k IN count (4 ** n) then &k / 2 pow n else 2 pow n)`]
2703 >> `FINITE (count (4 ** n)) /\
2704     FINITE (count (4 ** n + 1))` by RW_TAC std_ss [FINITE_COUNT]
2705 >> `!n. 0:real < 2 pow n` by RW_TAC real_ss [REAL_POW_LT]
2706 >> `!n. 0:real <> 2 pow n` by RW_TAC real_ss [REAL_LT_IMP_NE]
2707 >> `!n k. &k / 2 pow n = Normal (&k / 2 pow n)`
2708      by METIS_TAC [extreal_of_num_def,extreal_pow_def,extreal_div_eq]
2709 >> `!n z. Normal z / 2 pow n = Normal (z / 2 pow n)`
2710      by METIS_TAC [extreal_pow_def,extreal_div_eq,extreal_of_num_def]
2711 >> ‘sigma_algebra (measurable_space m)’
2712      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA]
2713 (* flatten all CONJ *)
2714 >> ASM_SIMP_TAC std_ss [GSYM CONJ_ASSOC]
2715 >> CONJ_TAC >- RW_TAC std_ss [lemma_fn_seq_positive]
2716 >> CONJ_TAC
2717 >- (RW_TAC real_ss [fn_seq_def, IN_COUNT, GSYM ADD1, COUNT_SUC] \\
2718    `(\i. Normal (if i < 4 ** n then &i / 2 pow n else 2 pow n) *
2719          indicator_fn
2720            (if i < 4 ** n then
2721               {x | x IN m_space m /\ Normal (&i / 2 pow n) <= f x /\
2722                                      f x < (&i + 1) / 2 pow n}
2723             else {x | x IN m_space m /\ 2 pow n <= f x}) t) =
2724     (\i. if i < 4 ** n then &i / 2 pow n  *
2725             indicator_fn {x | x IN m_space m /\ &i / 2 pow n <= f x /\
2726                                              f x < (&i + 1) / 2 pow n} t
2727          else 2 pow n * indicator_fn {x | x IN m_space m /\ 2 pow n <= f x} t)`
2728        by (RW_TAC std_ss [FUN_EQ_THM] \\
2729            Cases_on `i < 4 ** n` >- RW_TAC std_ss [] \\
2730            RW_TAC std_ss [extreal_of_num_def, extreal_pow_def]) >> POP_ORW \\
2731    (MP_TAC o Q.SPEC `4 ** n` o UNDISCH o
2732     Q.SPECL [`(\i. if i < 4 ** n then
2733                       &i / 2 pow n *
2734                       indicator_fn
2735                         {x | x IN m_space m /\
2736                              &i / 2 pow n <= f x /\ f x < (&i + 1) / 2 pow n} t
2737                    else 2 pow n *
2738                         indicator_fn {x | x IN m_space m /\ 2 pow n <= f x} t)`,
2739              `count (4 ** n)`] o
2740     INST_TYPE [alpha |-> ``:num``]) EXTREAL_SUM_IMAGE_PROPERTY \\
2741    `!x. (\i. if i < 4 ** n then
2742                 &i / 2 pow n * indicator_fn
2743                   {x | x IN m_space m /\ &i / 2 pow n <= f x /\ f x < (&i + 1) / 2 pow n} t
2744              else 2 pow n * indicator_fn {x | x IN m_space m /\ 2 pow n <= f x} t) x <> NegInf`
2745       by (RW_TAC std_ss [indicator_fn_def,mul_rone,mul_rzero,num_not_infty] \\
2746           METIS_TAC [extreal_of_num_def,extreal_pow_def,extreal_not_infty]) \\
2747     RW_TAC std_ss [] \\
2748    `count (4 ** n) DELETE 4 ** n = count (4 ** n)`
2749       by METIS_TAC [DELETE_NON_ELEMENT,IN_COUNT,LESS_EQ_REFL,NOT_LESS] \\
2750     RW_TAC std_ss [] \\
2751     Q.PAT_X_ASSUM `SIGMA _ _ = _` (K ALL_TAC) \\
2752     FULL_SIMP_TAC std_ss [GSYM IN_COUNT] \\
2753    `!i. Normal (&i / 2 pow n) = &i / 2 pow n` by METIS_TAC [] >> POP_ORW \\
2754     Q.PAT_X_ASSUM `!n k. &k / 2 pow n = Normal (&k / 2 pow n)` (K ALL_TAC) \\
2755    `!i. (\i. &i / 2 pow n * indicator_fn
2756                {x | x IN m_space m /\ &i / 2 pow n <= f x /\ f x < (&i + 1) / 2 pow n} t) i <> NegInf`
2757        by (RW_TAC std_ss [indicator_fn_def,mul_rone,mul_rzero,num_not_infty] \\
2758            METIS_TAC [extreal_of_num_def,extreal_pow_def,extreal_not_infty]) \\
2759    (MP_TAC o
2760     Q.SPECL [`count (4 ** n)`,
2761              `(\k. &k / 2 pow n * indicator_fn
2762                     {x | x IN m_space m /\ &k / 2 pow n <= f x /\ f x < (&k + 1) / 2 pow n} t)`,
2763             `2 pow n * indicator_fn {x | x IN m_space m /\ 2 pow n <= f x} t`] o
2764     INST_TYPE [alpha |-> ``:num``] o GSYM) EXTREAL_SUM_IMAGE_IN_IF_ALT \\
2765     RW_TAC std_ss [] \\
2766     MATCH_MP_TAC add_comm >> DISJ1_TAC \\
2767     reverse CONJ_TAC
2768     >- (RW_TAC std_ss [indicator_fn_def,mul_rone,mul_rzero,num_not_infty] \\
2769         METIS_TAC [extreal_of_num_def,extreal_pow_def,extreal_not_infty]) \\
2770     FULL_SIMP_TAC std_ss [EXTREAL_SUM_IMAGE_NOT_INFTY])
2771 >> CONJ_TAC
2772 >- (RW_TAC real_ss [] >| (* 2 subgoals *)
2773     [ (* goal 1 (of 2) *)
2774      `{x | x IN m_space m /\ Normal (&i / 2 pow n) <= f x /\
2775                              f x < (&i + 1) / 2 pow n} =
2776       {x | Normal (&i / 2 pow n) <= f x /\ f x < Normal (&(i + 1) / 2 pow n)}
2777          INTER m_space m`
2778          by (RW_TAC std_ss [EXTENSION,GSPECIFICATION,IN_INTER,CONJ_COMM] \\
2779             `(&i + 1:extreal) = &(i + 1)`
2780                by RW_TAC std_ss [extreal_add_def,extreal_of_num_def,REAL_ADD] \\
2781              METIS_TAC []) >> POP_ORW \\
2782       METIS_TAC [IN_MEASURABLE_BOREL_ALL, m_space_def, measurable_sets_def,
2783                  space_def, subsets_def],
2784       (* goal 2 (of 2) *)
2785      `{x | x IN m_space m /\ 2 pow n <= f x} =
2786       {x | Normal (2 pow n) <= f x} INTER m_space m`
2787          by RW_TAC std_ss [EXTENSION, GSPECIFICATION, IN_INTER, CONJ_COMM,
2788                            extreal_of_num_def, extreal_pow_def] >> POP_ORW \\
2789       METIS_TAC [IN_MEASURABLE_BOREL_ALL, m_space_def, measurable_sets_def,
2790                  space_def, subsets_def] ])
2791 >> CONJ_TAC
2792 >- RW_TAC real_ss [extreal_of_num_def,extreal_pow_def,extreal_le_def,
2793                    REAL_LT_IMP_LE,POW_POS,REAL_LE_DIV]
2794 >> CONJ_TAC
2795 >- (RW_TAC real_ss [DISJOINT_DEF, IN_COUNT, IN_INTER, EXTENSION,
2796                     GSPECIFICATION] >| (* 3 subgoals *)
2797     [ (* goal 1 (of 3) *)
2798       reverse EQ_TAC >- RW_TAC std_ss [NOT_IN_EMPTY] \\
2799       RW_TAC real_ss [] \\
2800       RW_TAC std_ss [NOT_IN_EMPTY] \\
2801       Cases_on `i < j`
2802       >- (`i + 1 <= j` by RW_TAC real_ss [] \\
2803           `&(i + 1) / 2:real pow n <= &j / 2 pow n`
2804             by RW_TAC real_ss [REAL_LE_RDIV_EQ,REAL_POW_LT,REAL_DIV_RMUL,REAL_POS_NZ] \\
2805           `&(i + 1) / 2 pow n <= &j / 2 pow n`
2806             by RW_TAC std_ss [extreal_of_num_def, extreal_add_def, extreal_pow_def,
2807                               extreal_div_eq, extreal_lt_eq, extreal_le_def] \\
2808           `&j / 2 pow n <= f x` by METIS_TAC [] \\
2809           `(&i + 1) = &(i + 1)`
2810             by METIS_TAC [extreal_of_num_def,extreal_add_def,REAL_ADD] \\
2811           METIS_TAC [lte_trans,extreal_lt_def]) \\
2812      `j < i` by RW_TAC real_ss [LESS_OR_EQ] \\
2813      `j + 1 <= i` by RW_TAC real_ss [] \\
2814      `&(j + 1) / 2 pow n <= &i / 2:real pow n`
2815         by RW_TAC real_ss [REAL_LE_RDIV_EQ,REAL_POW_LT,REAL_DIV_RMUL,REAL_POS_NZ] \\
2816      `&(j + 1) / 2 pow n <= &i / 2 pow n`
2817         by RW_TAC std_ss [extreal_of_num_def, extreal_add_def, extreal_pow_def,
2818                           extreal_div_eq, extreal_lt_eq, extreal_le_def] \\
2819      `(&j + 1) = &(j + 1)`
2820         by METIS_TAC [extreal_of_num_def, extreal_add_def, REAL_ADD] \\
2821       METIS_TAC [lte_trans, extreal_lt_def],
2822       (* goal 2 (of 3) *)
2823       reverse EQ_TAC >- RW_TAC std_ss [NOT_IN_EMPTY] \\
2824       RW_TAC std_ss [] \\
2825       RW_TAC real_ss [NOT_IN_EMPTY] \\
2826      `&(i + 1) <= &(4 ** n):real` by RW_TAC real_ss [] \\
2827       FULL_SIMP_TAC std_ss [GSYM REAL_OF_NUM_POW] \\
2828      `&(i + 1) / 2 pow n <= 4 pow n / 2:real pow n`
2829         by RW_TAC real_ss [REAL_LE_RDIV_EQ,REAL_POW_LT,REAL_DIV_RMUL,REAL_POS_NZ] \\
2830      `&(i + 1) / 2 pow n <= 2:real pow n`
2831         by METIS_TAC [REAL_POW_DIV,EVAL ``4/2:real``] \\
2832      `&(i + 1) / 2 pow n <= 2 pow n`
2833         by RW_TAC std_ss [extreal_of_num_def, extreal_add_def, extreal_pow_def,
2834                           extreal_div_eq, extreal_lt_eq, extreal_le_def] \\
2835      `(&i + 1) = &(i + 1)`
2836         by METIS_TAC [extreal_of_num_def, extreal_add_def, REAL_ADD] \\
2837       METIS_TAC [le_trans, extreal_lt_def],
2838       (* goal 3 (of 3) *)
2839       reverse EQ_TAC >- RW_TAC std_ss [NOT_IN_EMPTY] \\
2840       RW_TAC real_ss [] \\
2841       RW_TAC std_ss [NOT_IN_EMPTY] \\
2842      `&(j + 1) <= &(4 ** n):real` by RW_TAC real_ss [] \\
2843       FULL_SIMP_TAC std_ss [GSYM REAL_OF_NUM_POW] \\
2844      `&(j + 1) / 2 pow n <= 4:real pow n / 2 pow n`
2845         by RW_TAC real_ss [REAL_LE_RDIV_EQ,REAL_POW_LT,REAL_DIV_RMUL,REAL_POS_NZ] \\
2846      `&(j + 1) / 2 pow n <= 2:real pow n`
2847         by METIS_TAC [REAL_POW_DIV,EVAL ``4/2:real``] \\
2848      `&(j + 1) / 2 pow n <= 2 pow n`
2849         by RW_TAC std_ss [extreal_of_num_def, extreal_add_def, extreal_pow_def,
2850                           extreal_div_eq, extreal_lt_eq, extreal_le_def] \\
2851      `(&j + 1) = &(j + 1)`
2852         by METIS_TAC [extreal_of_num_def, extreal_add_def, REAL_ADD] \\
2853       METIS_TAC [lte_trans,extreal_lt_def] ])
2854 (* BIGUNION (IMAGE ... = m_space m *)
2855 >> CONJ_TAC
2856 >- (RW_TAC std_ss [EXTENSION,IN_BIGUNION_IMAGE,GSPECIFICATION] \\
2857     EQ_TAC
2858     >- (RW_TAC std_ss []
2859         >> Cases_on `k IN count (4 ** n)`
2860         >- FULL_SIMP_TAC std_ss [GSPECIFICATION,lemma_fn_3]
2861         >> FULL_SIMP_TAC std_ss [GSPECIFICATION,lemma_fn_3])
2862     >> RW_TAC real_ss [IN_COUNT]
2863     >> `2 pow n <= f x \/
2864         ?k. k IN count (4 ** n) /\ &k / 2 pow n <= f x /\ f x < (&k + 1) / 2 pow n`
2865            by METIS_TAC [lemma_fn_3]
2866     >- (Q.EXISTS_TAC `4 ** n`
2867         >> RW_TAC real_ss [GSPECIFICATION])
2868     >> Q.EXISTS_TAC `k`
2869     >> FULL_SIMP_TAC real_ss [IN_COUNT,GSPECIFICATION]
2870     >> METIS_TAC [])
2871 (* fn_seq_integral m f n = pos_simple_fn_integral m (count (4 ** n + 1)) _ _ *)
2872  >> RW_TAC real_ss [pos_simple_fn_integral_def,fn_seq_integral_def]
2873  >> `4 ** n + 1 = SUC (4 ** n)` by RW_TAC real_ss []
2874  >> ASM_SIMP_TAC std_ss []
2875  >> RW_TAC std_ss [COUNT_SUC,IN_COUNT]
2876  >> `(\i. Normal (if i < 4 ** n then &i / 2 pow n else 2 pow n) *
2877           measure m (if i < 4 ** n then
2878                   {x | x IN m_space m /\ Normal (&i / 2 pow n) <= f x /\ f x < (&i + 1) / 2 pow n}
2879                   else {x | x IN m_space m /\ 2 pow n <= f x})) =
2880      (\i. if i < 4 ** n then
2881              &i / 2 pow n *
2882              measure m {x | x IN m_space m /\ &i / 2 pow n <= f x /\ f x < (&i + 1) / 2 pow n}
2883           else 2 pow n * measure m {x | x IN m_space m /\ 2 pow n <= f x})`
2884        by (RW_TAC std_ss [FUN_EQ_THM] \\
2885            Cases_on `i < 4 ** n` >- RW_TAC std_ss [] \\
2886            RW_TAC std_ss [extreal_of_num_def,extreal_pow_def])
2887  >> POP_ORW
2888  >> (MP_TAC o Q.SPEC `4 ** n` o UNDISCH o Q.SPECL
2889      [`(\i. if i < 4 ** n then
2890                &i / 2 pow n *
2891                measure m {x | x IN m_space m /\ &i / 2 pow n <= f x /\ f x < (&i + 1) / 2 pow n}
2892             else
2893                2 pow n * measure m {x | x IN m_space m /\ 2 pow n <= f x})`,
2894       `count (4 ** n)`]
2895      o INST_TYPE [alpha |-> ``:num``]) EXTREAL_SUM_IMAGE_PROPERTY
2896  >> `!x. (\i. if i < 4 ** n then &i / 2 pow n * measure m {x | x IN m_space m /\ &i / 2 pow n <= f x /\ f x < (&i + 1) / 2 pow n}
2897           else 2 pow n * measure m {x | x IN m_space m /\ 2 pow n <= f x}) x <> NegInf`
2898             by (RW_TAC std_ss []
2899                   >- (`0 <= &x / 2:real pow n` by RW_TAC real_ss [REAL_LE_DIV,REAL_LT_IMP_LE]
2900                       >> Suff `measure m {x' | x' IN m_space m /\ Normal (&x / 2 pow n) <= f x' /\ f x' < (&x + 1) / 2 pow n} <> NegInf`
2901                       >- METIS_TAC [mul_not_infty]
2902                       >> Suff `{x' | x' IN m_space m /\ Normal (&x / 2 pow n) <= f x' /\ f x' < (&x + 1) / 2 pow n} IN measurable_sets m`
2903                       >- METIS_TAC [positive_not_infty,MEASURE_SPACE_POSITIVE]
2904                       >> `{x' | x' IN m_space m /\ Normal (&x / 2 pow n) <= f x' /\ f x' < (&x + 1) / 2 pow n} =
2905                           {x' | Normal (&x / 2 pow n) <= f x' /\ f x' < (&x + 1) / 2 pow n} INTER m_space m`
2906                             by (RW_TAC std_ss [EXTENSION,GSPECIFICATION,IN_INTER] >> METIS_TAC [])
2907                       >> `!x. &x + 1 = &(x + 1)` by METIS_TAC [extreal_of_num_def,extreal_add_def,REAL_ADD]
2908                       >> METIS_TAC [IN_MEASURABLE_BOREL_ALL, measurable_sets_def,subsets_def,space_def,m_space_def])
2909                   >> RW_TAC std_ss [extreal_of_num_def,extreal_pow_def]
2910                   >> `0:real <= 2 pow n` by FULL_SIMP_TAC std_ss [REAL_LT_IMP_LE]
2911                   >> Suff `{x | x IN m_space m /\ Normal (2 pow n) <= f x} IN measurable_sets m`
2912                   >- METIS_TAC [mul_not_infty,positive_not_infty,MEASURE_SPACE_POSITIVE]
2913                   >> `{x | x IN m_space m /\ Normal (2 pow n) <= f x} = {x | Normal (2 pow n) <= f x} INTER m_space m`
2914                         by (RW_TAC std_ss [EXTENSION,GSPECIFICATION,IN_INTER] >> METIS_TAC [])
2915                   >> METIS_TAC [IN_MEASURABLE_BOREL_ALL, measurable_sets_def,subsets_def,space_def,m_space_def])
2916  >> RW_TAC std_ss []
2917  >> `count (4 ** n) DELETE 4 ** n = count (4 ** n)`
2918             by METIS_TAC [DELETE_NON_ELEMENT,IN_COUNT,LESS_EQ_REFL,NOT_LESS]
2919  >> RW_TAC std_ss []
2920  >> Q.PAT_X_ASSUM `SIGMA _ _ = _` (K ALL_TAC)
2921  >> FULL_SIMP_TAC std_ss [GSYM IN_COUNT]
2922  >> `!i. (\i. Normal (&i / 2 pow n) * measure m {x | x IN m_space m /\ Normal (&i / 2 pow n) <= f x /\ f x < (&i + 1) / 2 pow n}) i <> NegInf`
2923        by (RW_TAC std_ss []
2924            >> `0 <= &i / 2:real pow n` by RW_TAC real_ss [REAL_LE_DIV,REAL_LT_IMP_LE]
2925            >> Suff `{x | x IN m_space m /\ Normal (&i / 2 pow n) <= f x /\ f x < (&i + 1) / 2 pow n} IN measurable_sets m`
2926            >- METIS_TAC [mul_not_infty,positive_not_infty,MEASURE_SPACE_POSITIVE]
2927            >> `{x | x IN m_space m /\ Normal (&i / 2 pow n) <= f x /\ f x < (&i + 1) / 2 pow n} =
2928                {x | Normal (&i / 2 pow n) <= f x /\ f x < (&i + 1) / 2 pow n} INTER m_space m`
2929                    by (RW_TAC std_ss [EXTENSION,GSPECIFICATION,IN_INTER] >> METIS_TAC [])
2930            >> `!x. &x + 1 = &(x + 1)` by METIS_TAC [extreal_of_num_def,extreal_add_def,REAL_ADD]
2931            >> METIS_TAC [IN_MEASURABLE_BOREL_ALL, measurable_sets_def,subsets_def,space_def,m_space_def])
2932  >> (MP_TAC o
2933      Q.SPECL [`count (4 ** n)`,
2934               `(\k. &k / 2 pow n * measure m {x | x IN m_space m /\ &k / 2 pow n <= f x /\ f x < (&k + 1) / 2 pow n})`,
2935               ` 2 pow n * measure m {x | x IN m_space m /\ 2 pow n <= f x}`] o
2936      INST_TYPE [alpha |-> ``:num``] o GSYM) EXTREAL_SUM_IMAGE_IN_IF_ALT
2937  >> RW_TAC std_ss []
2938  >> FULL_SIMP_TAC std_ss []
2939  >> MATCH_MP_TAC add_comm
2940  >> DISJ1_TAC
2941  >> reverse CONJ_TAC
2942  >- (RW_TAC std_ss [extreal_of_num_def,extreal_pow_def]
2943      >> `0:real <= 2 pow n` by FULL_SIMP_TAC std_ss [REAL_LT_IMP_LE]
2944      >> Suff `{x | x IN m_space m /\ Normal (2 pow n) <= f x} IN measurable_sets m`
2945      >- METIS_TAC [mul_not_infty,positive_not_infty,MEASURE_SPACE_POSITIVE]
2946      >> `{x | x IN m_space m /\ Normal (2 pow n) <= f x} =
2947          {x | Normal (2 pow n) <= f x} INTER m_space m`
2948            by (RW_TAC std_ss [EXTENSION,GSPECIFICATION,IN_INTER] >> METIS_TAC [])
2949      >> METIS_TAC [IN_MEASURABLE_BOREL_ALL, measurable_sets_def, subsets_def,
2950                    space_def, m_space_def])
2951  >> FULL_SIMP_TAC std_ss [EXTREAL_SUM_IMAGE_NOT_INFTY]
2952QED
2953
2954(* This huge theorem (from HVG Concordia) cannot be put into borelTheory as it
2955   depends on several lemmas here.
2956 *)
2957Theorem BOREL_INDUCT : (* was: Induct_on_Borel_functions *)
2958  !f m P.
2959     measure_space m /\
2960     f IN measurable (m_space m, measurable_sets m) Borel /\ (!x. 0 <= f x) /\
2961     (!f g. f IN measurable (m_space m, measurable_sets m) Borel /\
2962            g IN measurable (m_space m, measurable_sets m) Borel /\
2963            (!x. x IN m_space m ==> (f x = g x)) /\ P f ==> P g) /\
2964     (!A. A IN measurable_sets m ==> P (indicator_fn A)) /\
2965     (!f c. f IN measurable (m_space m, measurable_sets m) Borel /\
2966            0 <= c /\ (!x. 0 <= f x) /\ P f ==> P (\x. c * f x)) /\
2967     (!f g. f IN measurable (m_space m, measurable_sets m) Borel /\
2968            g IN measurable (m_space m, measurable_sets m) Borel /\
2969            (!x. 0 <= f x) /\ P f /\ (!x. 0 <= g x) /\ P g ==>
2970            P (\x. f x + g x)) /\
2971     (!u. (!i:num. (u i) IN measurable (m_space m, measurable_sets m) Borel) /\
2972          (!i x. 0 <= u i x) /\ (!x. mono_increasing (\i. u i x)) /\
2973          (!i. P (u i)) ==> P (\x. sup (IMAGE (\i. u i x) UNIV))) ==> P f
2974Proof
2975    RW_TAC std_ss []
2976 >> ‘sigma_algebra (measurable_space m)’ by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA]
2977 >> FIRST_ASSUM MATCH_MP_TAC
2978 >> Q.EXISTS_TAC `(\x. sup (IMAGE (\i. fn_seq m f i x) univ(:num)))`
2979 >> ASM_SIMP_TAC std_ss [lemma_fn_seq_sup]
2980 THEN
2981  Know `!i. (\x. SIGMA
2982          (\k. &k / 2 pow i *
2983             indicator_fn {x |
2984                x IN m_space m /\ &k / 2 pow i <= f x /\
2985                f x < (&k + 1) / 2 pow i} x) (count (4 ** i)))
2986          IN measurable (m_space m, measurable_sets m) Borel` THEN1
2987  (Q.X_GEN_TAC `i` THEN
2988   Q.ABBREV_TAC `s = count (4 ** i)` THEN
2989   Q.ABBREV_TAC `g = (\k x. &k / 2 pow i *
2990        indicator_fn
2991          {x |
2992           x IN m_space m /\ &k / 2 pow i <= f x /\
2993           f x < (&k + 1) / 2 pow i} x)` THEN
2994
2995   Suff `FINITE s /\ sigma_algebra (m_space m, measurable_sets m) /\
2996     (!i. i IN s ==> g i IN measurable (m_space m, measurable_sets m) Borel) /\
2997     (!i x. i IN s /\ x IN space (m_space m, measurable_sets m) ==> g i x <> NegInf) /\
2998     (!x. x IN space (m_space m, measurable_sets m) ==>
2999      ((\x. SIGMA
3000     (\k. &k / 2 pow i *
3001        indicator_fn {x |
3002           x IN m_space m /\ &k / 2 pow i <= f x /\
3003           f x < (&k + 1) / 2 pow i} x) s) x = SIGMA (\i. g i x) s))` THEN1
3004   (DISCH_THEN (MP_TAC o MATCH_MP IN_MEASURABLE_BOREL_SUM) THEN
3005    SIMP_TAC std_ss []) THEN
3006
3007   Q.UNABBREV_TAC `s` THEN Q.UNABBREV_TAC `g` THEN
3008   FULL_SIMP_TAC std_ss [measure_space_def, FINITE_COUNT] THEN
3009   SIMP_TAC std_ss [space_def, IN_UNIV] THEN
3010
3011  `2 pow i <> NegInf /\ 2 pow i <> PosInf`
3012      by METIS_TAC [pow_not_infty, num_not_infty] THEN
3013   Know `real (2 pow i) <> 0`
3014   >- (ASM_SIMP_TAC std_ss [GSYM extreal_11, normal_real,
3015                            GSYM extreal_of_num_def] THEN
3016       Suff `(0 :extreal) < 2 pow i` >- METIS_TAC [lt_imp_ne] THEN
3017       METIS_TAC [lt_02, pow_pos_lt]) >> DISCH_TAC THEN
3018
3019   reverse CONJ_TAC THEN1
3020   (Q.X_GEN_TAC `n` THEN
3021    RW_TAC std_ss [lt_infty] THEN MATCH_MP_TAC lte_trans THEN
3022    Q.EXISTS_TAC `0` THEN SIMP_TAC std_ss [GSYM lt_infty, num_not_infty] THEN
3023    MATCH_MP_TAC le_mul THEN REWRITE_TAC [INDICATOR_FN_POS] THEN
3024    `2 pow i = Normal (real (2 pow i))` by METIS_TAC [normal_real] THEN
3025    POP_ASSUM (fn th => ONCE_REWRITE_TAC [th]) THEN
3026    ASM_SIMP_TAC std_ss [extreal_div_def] THEN
3027    MATCH_MP_TAC le_mul THEN SIMP_TAC std_ss [le_num] THEN
3028    ASM_SIMP_TAC real_ss [extreal_inv_def] THEN
3029    SIMP_TAC std_ss [extreal_of_num_def, extreal_le_def] THEN
3030    SIMP_TAC std_ss [REAL_LE_INV_EQ] THEN SIMP_TAC std_ss [GSYM extreal_le_def] THEN
3031    ASM_SIMP_TAC std_ss [normal_real, GSYM extreal_of_num_def] THEN
3032    METIS_TAC [le_02, pow_pos_le]) THEN
3033
3034   Q.X_GEN_TAC `n` THEN
3035   RW_TAC std_ss [] THEN MATCH_MP_TAC IN_MEASURABLE_BOREL_CMUL THEN
3036   qexistsl_tac
3037        [`(\x. indicator_fn
3038               {x | x IN m_space m /\ &n / 2 pow i <= f x /\ f x < (&n + 1) / 2 pow i} x)`,
3039         `real (&n / 2 pow i)`] THEN
3040
3041   Know `&n / 2 pow i <> NegInf /\ &n / 2 pow i <> PosInf` THEN1
3042   (`2 pow i = Normal (real (2 pow i))` by METIS_TAC [normal_real] THEN
3043    POP_ASSUM (fn th => ONCE_REWRITE_TAC [th]) THEN
3044    `&n = Normal (&n)` by PROVE_TAC [extreal_of_num_def] >> POP_ORW \\
3045    ASM_SIMP_TAC std_ss [extreal_div_eq, extreal_not_infty]) >> STRIP_TAC THEN
3046
3047   ASM_SIMP_TAC std_ss [normal_real] THEN
3048   MATCH_MP_TAC IN_MEASURABLE_BOREL_INDICATOR THEN
3049   Q.EXISTS_TAC `{x | x IN m_space m /\ &n / 2 pow i <= f x /\ f x < (&n + 1) / 2 pow i}` THEN
3050   ASM_SIMP_TAC std_ss [] THEN
3051   Q_TAC SUFF_TAC
3052   `{x | x IN m_space m /\ &n / 2 pow i <= f x /\ f x < (&n + 1) / 2 pow i} =
3053    PREIMAGE f {x | &n / 2 pow i <= x /\ x < (&n + 1) / 2 pow i} INTER
3054    space (m_space m, measurable_sets m)` THENL
3055   [DISC_RW_KILL,
3056    SIMP_TAC std_ss [PREIMAGE_def, space_def, INTER_UNIV] THEN
3057    SET_TAC []] THEN
3058   FULL_SIMP_TAC std_ss [IN_MEASURABLE] THEN
3059   FIRST_X_ASSUM MATCH_MP_TAC THEN
3060
3061   Suff `(&n + 1) / 2 pow i <> NegInf /\ (&n + 1) / 2 pow i <> PosInf`
3062   >- (STRIP_TAC THEN METIS_TAC [BOREL_MEASURABLE_SETS_CO, normal_real]) THEN
3063
3064   `2 pow i = Normal (real (2 pow i))` by METIS_TAC [normal_real] THEN
3065    POP_ASSUM (fn th => ONCE_REWRITE_TAC [th]) THEN
3066    Know `&n + 1 = Normal (&n + 1)`
3067    >- (REWRITE_TAC [extreal_of_num_def, extreal_add_def]) >> Rewr' THEN
3068    ASM_SIMP_TAC std_ss [extreal_div_eq, extreal_not_infty]
3069  ) THEN DISCH_TAC THEN
3070
3071  Know `!i. (\x. 2 pow i * indicator_fn {x | x IN m_space m /\ 2 pow i <= f x} x)
3072            IN measurable (m_space m, measurable_sets m) Borel` THEN1
3073  (GEN_TAC THEN MATCH_MP_TAC IN_MEASURABLE_BOREL_CMUL THEN
3074   `2 pow i <> NegInf /\ 2 pow i <> PosInf` by
3075    METIS_TAC [pow_not_infty, num_not_infty] THEN
3076   Q.EXISTS_TAC `(\x. indicator_fn {x | x IN m_space m /\ 2 pow i <= f x} x)` THEN
3077   Q.EXISTS_TAC `real (2 pow i)` THEN ASM_SIMP_TAC std_ss [normal_real] THEN
3078   FULL_SIMP_TAC std_ss [measure_space_def] THEN
3079   MATCH_MP_TAC IN_MEASURABLE_BOREL_INDICATOR THEN
3080   Q.EXISTS_TAC `{x | x IN m_space m /\ 2 pow i <= f x}` THEN
3081   ASM_SIMP_TAC std_ss [space_def, IN_UNIV] THEN
3082   Q_TAC SUFF_TAC `{x | x IN m_space m /\ 2 pow i <= f x} =
3083    PREIMAGE f {x | 2 pow i <= x} INTER space (m_space m,measurable_sets m)` THENL
3084   [DISC_RW_KILL,
3085    SIMP_TAC std_ss [PREIMAGE_def, space_def, INTER_UNIV] THEN
3086    SET_TAC []] THEN
3087   FULL_SIMP_TAC std_ss [IN_MEASURABLE] THEN
3088   FIRST_X_ASSUM MATCH_MP_TAC THEN METIS_TAC [BOREL_MEASURABLE_SETS_CR, normal_real]
3089   ) THEN DISCH_TAC THEN
3090
3091  Know `!i. fn_seq m f i IN measurable (m_space m,measurable_sets m) Borel` THEN1
3092  (SIMP_TAC std_ss [fn_seq_def] THEN GEN_TAC THEN
3093   MATCH_MP_TAC IN_MEASURABLE_BOREL_ADD THEN
3094   qexistsl_tac
3095        [`(\x. SIGMA
3096          (\k. &k / 2 pow i *
3097             indicator_fn {x |
3098                x IN m_space m /\ &k / 2 pow i <= f x /\
3099                f x < (&k + 1) / 2 pow i} x) (count (4 ** i)))`,
3100         `(\x. 2 pow i * indicator_fn {x | x IN m_space m /\ 2 pow i <= f x} x)`] THEN
3101   POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN FULL_SIMP_TAC std_ss [measure_space_def] THEN
3102
3103   `2 pow i <> NegInf /\ 2 pow i <> PosInf`
3104      by METIS_TAC [pow_not_infty, num_not_infty] THEN
3105    Know `real (2 pow i) <> 0`
3106    >- (ASM_SIMP_TAC std_ss [GSYM extreal_11, normal_real,
3107                             GSYM extreal_of_num_def] THEN
3108        Suff `(0 :extreal) < 2 pow i` >- METIS_TAC [lt_imp_ne] THEN
3109        METIS_TAC [lt_02, pow_pos_lt]) >> DISCH_TAC THEN
3110
3111   RW_TAC std_ss [] \\
3112   DISJ1_TAC \\
3113   reverse CONJ_TAC
3114   >- (MATCH_MP_TAC pos_not_neginf \\
3115       MATCH_MP_TAC le_mul >> rw [pow_pos_le, INDICATOR_FN_POS]) \\
3116   SIMP_TAC std_ss [lt_infty] THEN MATCH_MP_TAC lte_trans THEN
3117   Q.EXISTS_TAC `0` THEN SIMP_TAC std_ss [GSYM lt_infty, num_not_infty] THEN
3118   MATCH_MP_TAC EXTREAL_SUM_IMAGE_POS THEN REWRITE_TAC [FINITE_COUNT] THEN
3119   Q.X_GEN_TAC `n` THEN RW_TAC std_ss [IN_UNIV] THEN
3120   MATCH_MP_TAC le_mul THEN REWRITE_TAC [INDICATOR_FN_POS] THEN
3121   `2 pow i = Normal (real (2 pow i))` by METIS_TAC [normal_real] THEN
3122   POP_ASSUM (fn th => ONCE_REWRITE_TAC [th]) THEN
3123   ASM_SIMP_TAC std_ss [extreal_div_def] THEN
3124   MATCH_MP_TAC le_mul THEN SIMP_TAC std_ss [le_num] THEN
3125   ASM_SIMP_TAC real_ss [extreal_inv_def] THEN
3126   SIMP_TAC std_ss [extreal_of_num_def, extreal_le_def] THEN
3127   SIMP_TAC std_ss [REAL_LE_INV_EQ] THEN SIMP_TAC std_ss [GSYM extreal_le_def] THEN
3128   ASM_SIMP_TAC std_ss [normal_real, GSYM extreal_of_num_def] THEN
3129   METIS_TAC [le_02, pow_pos_le]) THEN DISCH_TAC THEN
3130
3131  CONJ_TAC THENL
3132  [MATCH_MP_TAC IN_MEASURABLE_BOREL_MONO_SUP THEN
3133   Q.EXISTS_TAC `fn_seq m f` THEN SIMP_TAC std_ss [] THEN
3134   CONJ_TAC THENL
3135   [METIS_TAC [measure_space_def], ALL_TAC] THEN
3136   CONJ_TAC THENL
3137   [ALL_TAC,
3138    GEN_TAC THEN GEN_TAC THEN
3139    `mono_increasing (\n. fn_seq m f n x)` by METIS_TAC [lemma_fn_seq_mono_increasing] THEN
3140    FULL_SIMP_TAC std_ss [ext_mono_increasing_def] THEN
3141    FIRST_X_ASSUM MATCH_MP_TAC] THEN ASM_SIMP_TAC std_ss [],
3142   ALL_TAC] THEN
3143
3144  FIRST_X_ASSUM MATCH_MP_TAC THEN
3145  ASM_SIMP_TAC std_ss [lemma_fn_seq_mono_increasing, lemma_fn_seq_positive] THEN
3146
3147  GEN_TAC THEN SIMP_TAC std_ss [fn_seq_def] THEN
3148  Suff `P (\x.
3149    (\x. SIGMA
3150      (\k. &k / 2 pow i *
3151         indicator_fn {x |
3152            x IN m_space m /\ &k / 2 pow i <= f x /\
3153            f x < (&k + 1) / 2 pow i} x) (count (4 ** i))) x +
3154    (\x. 2 pow i * indicator_fn {x | x IN m_space m /\ 2 pow i <= f x} x) x)`
3155  >- (SIMP_TAC std_ss []) THEN
3156  FIRST_ASSUM MATCH_MP_TAC THEN ASM_SIMP_TAC std_ss [IN_UNIV] THEN
3157  CONJ_TAC >-
3158  (GEN_TAC THEN
3159   MATCH_MP_TAC EXTREAL_SUM_IMAGE_POS THEN REWRITE_TAC [FINITE_COUNT] THEN
3160   Q.X_GEN_TAC `n` THEN RW_TAC std_ss [IN_COUNT] THEN
3161   MATCH_MP_TAC le_mul THEN REWRITE_TAC [INDICATOR_FN_POS] THEN
3162
3163   `2 pow i <> NegInf /\ 2 pow i <> PosInf`
3164      by METIS_TAC [pow_not_infty, num_not_infty] THEN
3165    Know `real (2 pow i) <> 0`
3166    >- (ASM_SIMP_TAC std_ss [GSYM extreal_11, normal_real,
3167                             GSYM extreal_of_num_def] THEN
3168        Suff `(0 :extreal) < 2 pow i` >- METIS_TAC [lt_imp_ne] THEN
3169        METIS_TAC [lt_02, pow_pos_lt]) >> DISCH_TAC THEN
3170
3171   `2 pow i = Normal (real (2 pow i))` by METIS_TAC [normal_real] THEN
3172    POP_ASSUM (fn th => ONCE_REWRITE_TAC [th]) THEN
3173    ASM_SIMP_TAC std_ss [extreal_div_def] THEN
3174    MATCH_MP_TAC le_mul THEN SIMP_TAC std_ss [le_num] THEN
3175    ASM_SIMP_TAC real_ss [extreal_inv_def] THEN
3176    SIMP_TAC std_ss [extreal_of_num_def, extreal_le_def] THEN
3177    SIMP_TAC std_ss [REAL_LE_INV_EQ] THEN SIMP_TAC std_ss [GSYM extreal_le_def] THEN
3178    ASM_SIMP_TAC std_ss [normal_real, GSYM extreal_of_num_def] THEN
3179    METIS_TAC [le_02, pow_pos_le]) THEN
3180
3181  CONJ_TAC THEN1
3182  (`FINITE (count (4 ** i))` by SIMP_TAC std_ss [FINITE_COUNT] THEN
3183   Suff `(\s. P
3184    (\x. SIGMA
3185       (\k. &k / 2 pow i *
3186          indicator_fn {x | x IN m_space m /\ &k / 2 pow i <= f x /\ f x < (&k + 1) / 2 pow i} x) (s)))
3187         (count (4 ** i))`
3188   >- (SIMP_TAC std_ss []) THEN
3189   POP_ASSUM MP_TAC THEN
3190   Q.ABBREV_TAC `s = count (4 ** i)` THEN Q.SPEC_TAC (`s`,`s`) THEN
3191   MATCH_MP_TAC FINITE_INDUCT THEN
3192   Q.UNABBREV_TAC `s` THEN SIMP_TAC std_ss [FINITE_COUNT] THEN
3193   SIMP_TAC std_ss [EXTREAL_SUM_IMAGE_EMPTY] THEN
3194   CONJ_TAC THEN1
3195   (FIRST_ASSUM MATCH_MP_TAC THEN Q.EXISTS_TAC `indicator_fn {}` THEN
3196    RW_TAC std_ss [] THENL
3197    [MATCH_MP_TAC IN_MEASURABLE_BOREL_INDICATOR THEN Q.EXISTS_TAC `{}` THEN
3198     FULL_SIMP_TAC std_ss [measure_space_def] THEN METIS_TAC [SIGMA_ALGEBRA],
3199     MATCH_MP_TAC IN_MEASURABLE_BOREL_CONST THEN Q.EXISTS_TAC `0` THEN
3200     FULL_SIMP_TAC std_ss [measure_space_def],
3201     SIMP_TAC std_ss [indicator_fn_def, NOT_IN_EMPTY],
3202     ALL_TAC] THEN
3203    FIRST_ASSUM MATCH_MP_TAC THEN
3204    FULL_SIMP_TAC std_ss [measure_space_def, SIGMA_ALGEBRA, subsets_def]) THEN
3205   RW_TAC std_ss [] THEN
3206   Know `!x.
3207     SIGMA
3208       (\k.
3209          &k / 2 pow i *
3210          indicator_fn
3211            {x | x IN m_space m /\ &k / 2 pow i <= f x /\ f x < (&k + 1) / 2 pow i} x)
3212       (e INSERT s) =
3213      (\k. &k / 2 pow i *
3214      indicator_fn {x | x IN m_space m /\ &k / 2 pow i <= f x /\ f x < (&k + 1) / 2 pow i} x) e +
3215      SIGMA
3216       (\k.
3217          &k / 2 pow i *
3218          indicator_fn
3219            {x | x IN m_space m /\ &k / 2 pow i <= f x /\ f x < (&k + 1) / 2 pow i} x)
3220       (s DELETE e)` THEN1
3221   (GEN_TAC THEN FIRST_ASSUM (MP_TAC o MATCH_MP EXTREAL_SUM_IMAGE_PROPERTY) THEN
3222    DISCH_THEN MATCH_MP_TAC THEN DISJ1_TAC THEN
3223    Q.X_GEN_TAC `n` THEN DISCH_TAC THEN
3224    SIMP_TAC std_ss [lt_infty] THEN MATCH_MP_TAC lte_trans THEN
3225    Q.EXISTS_TAC `0` THEN SIMP_TAC std_ss [GSYM lt_infty, num_not_infty] THEN
3226    MATCH_MP_TAC le_mul THEN REWRITE_TAC [INDICATOR_FN_POS] THEN
3227
3228   `2 pow i <> NegInf /\ 2 pow i <> PosInf`
3229       by METIS_TAC [pow_not_infty, num_not_infty] THEN
3230    Know `real (2 pow i) <> 0`
3231    >- (ASM_SIMP_TAC std_ss [GSYM extreal_11, normal_real,
3232                             GSYM extreal_of_num_def] THEN
3233        Suff `(0 :extreal) < 2 pow i` >- METIS_TAC [lt_imp_ne] THEN
3234        METIS_TAC [lt_02, pow_pos_lt]) >> DISCH_TAC THEN
3235
3236   `2 pow i = Normal (real (2 pow i))` by METIS_TAC [normal_real] THEN
3237    POP_ASSUM (fn th => ONCE_REWRITE_TAC [th]) THEN
3238    ASM_SIMP_TAC std_ss [extreal_div_def] THEN
3239    MATCH_MP_TAC le_mul THEN SIMP_TAC std_ss [le_num] THEN
3240    ASM_SIMP_TAC real_ss [extreal_inv_def] THEN
3241    SIMP_TAC std_ss [extreal_of_num_def, extreal_le_def] THEN
3242    SIMP_TAC std_ss [REAL_LE_INV_EQ] THEN SIMP_TAC std_ss [GSYM extreal_le_def] THEN
3243    ASM_SIMP_TAC std_ss [normal_real, GSYM extreal_of_num_def] THEN
3244    METIS_TAC [le_02, pow_pos_le]) THEN DISC_RW_KILL THEN
3245   ASM_SIMP_TAC std_ss [SET_RULE ``e NOTIN s ==> (s DELETE e = s)``] THEN
3246   Suff `P (\x.
3247     (\x. &e / 2 pow i *
3248     indicator_fn {x | x IN m_space m /\ &e / 2 pow i <= f x /\ f x < (&e + 1) / 2 pow i}
3249       x) x +
3250     (\x. SIGMA
3251       (\k. &k / 2 pow i *
3252     indicator_fn {x | x IN m_space m /\ &k / 2 pow i <= f x /\ f x < (&k + 1) / 2 pow i} x) s) x)`
3253   >- (SIMP_TAC std_ss []) THEN
3254   FIRST_ASSUM MATCH_MP_TAC THEN ASM_SIMP_TAC std_ss [] THEN
3255
3256   CONJ_TAC THEN1
3257   (MATCH_MP_TAC IN_MEASURABLE_BOREL_CMUL THEN
3258    Know `&e / 2 pow i <> NegInf /\ &e / 2 pow i <> PosInf` THEN1
3259    (`2 pow i <> NegInf /\ 2 pow i <> PosInf` by
3260     METIS_TAC [pow_not_infty, num_not_infty] THEN
3261     `2 pow i = Normal (real (2 pow i))` by METIS_TAC [normal_real] THEN
3262     POP_ASSUM (fn th => ONCE_REWRITE_TAC [th]) THEN
3263     Know `real (2 pow i) <> 0`
3264     >- (ASM_SIMP_TAC std_ss [GSYM extreal_11, normal_real,
3265                              GSYM extreal_of_num_def] THEN
3266         Suff `(0 :extreal) < 2 pow i` >- METIS_TAC [lt_imp_ne] THEN
3267         METIS_TAC [lt_02, pow_pos_lt]) >> DISCH_TAC THEN
3268     `&e = Normal (&e)` by PROVE_TAC [extreal_of_num_def] >> POP_ORW \\
3269     ASM_SIMP_TAC std_ss [extreal_div_eq, extreal_not_infty]) THEN STRIP_TAC THEN
3270
3271    qexistsl_tac
3272         [`(\x. indicator_fn
3273           {x | x IN m_space m /\ &e / 2 pow i <= f x /\ f x < (&e + 1) / 2 pow i} x)`,
3274          `real (&e / 2 pow i)`] THEN ASM_SIMP_TAC std_ss [normal_real] THEN
3275    FULL_SIMP_TAC std_ss [measure_space_def] THEN
3276    MATCH_MP_TAC IN_MEASURABLE_BOREL_INDICATOR THEN
3277    Q.EXISTS_TAC `{x | x IN m_space m /\ &e / 2 pow i <= f x /\ f x < (&e + 1) / 2 pow i}` THEN
3278    ASM_SIMP_TAC std_ss [space_def, IN_UNIV] THEN
3279    Q_TAC SUFF_TAC `{x | x IN m_space m /\ &e / 2 pow i <= f x /\ f x < (&e + 1) / 2 pow i} =
3280     PREIMAGE f {x | &e / 2 pow i <= x /\ x < (&e + 1) / 2 pow i} INTER
3281     space (m_space m, measurable_sets m)` THENL
3282    [DISC_RW_KILL,
3283     SIMP_TAC std_ss [PREIMAGE_def, space_def, INTER_UNIV] THEN
3284     SET_TAC []] THEN
3285    FULL_SIMP_TAC std_ss [IN_MEASURABLE] THEN
3286    FIRST_X_ASSUM MATCH_MP_TAC THEN
3287    REWRITE_TAC [BOREL_MEASURABLE_SETS_CO]) THEN
3288
3289   CONJ_TAC THEN1
3290   (Q.ABBREV_TAC `g = (\k x.
3291             &k / 2 pow i *
3292             indicator_fn
3293               {x | x IN m_space m /\ &k / 2 pow i <= f x /\ f x < (&k + 1) / 2 pow i} x)` THEN
3294
3295    Suff `FINITE s /\ sigma_algebra (m_space m, measurable_sets m) /\
3296     (!i. i IN s ==> g i IN measurable (m_space m, measurable_sets m) Borel) /\
3297     (!i x. i IN s /\ x IN space (m_space m, measurable_sets m) ==> g i x <> NegInf) /\
3298     (!x. x IN space (m_space m, measurable_sets m) ==>
3299      ((\x. SIGMA
3300     (\k.
3301        &k / 2 pow i *
3302        indicator_fn
3303          {x | x IN m_space m /\ &k / 2 pow i <= f x /\ f x < (&k + 1) / 2 pow i} x) s) x =
3304      SIGMA (\i. g i x) s))`
3305    >- (DISCH_THEN (MP_TAC o MATCH_MP IN_MEASURABLE_BOREL_SUM) THEN
3306        ASM_SIMP_TAC std_ss []) THEN
3307   Q.UNABBREV_TAC `g` THEN
3308   FULL_SIMP_TAC std_ss [measure_space_def, FINITE_COUNT] THEN
3309   SIMP_TAC std_ss [space_def, IN_UNIV] THEN
3310   reverse CONJ_TAC THEN1
3311   (Q.X_GEN_TAC `n` THEN
3312    RW_TAC std_ss [lt_infty] THEN MATCH_MP_TAC lte_trans THEN
3313    Q.EXISTS_TAC `0` THEN SIMP_TAC std_ss [GSYM lt_infty, num_not_infty] THEN
3314    MATCH_MP_TAC le_mul THEN REWRITE_TAC [INDICATOR_FN_POS] THEN
3315
3316   `2 pow i <> NegInf /\ 2 pow i <> PosInf`
3317       by METIS_TAC [pow_not_infty, num_not_infty] THEN
3318    Know `real (2 pow i) <> 0`
3319    >- (ASM_SIMP_TAC std_ss [GSYM extreal_11, normal_real,
3320                             GSYM extreal_of_num_def] THEN
3321        Suff `(0 :extreal) < 2 pow i` >- METIS_TAC [lt_imp_ne] THEN
3322        METIS_TAC [lt_02, pow_pos_lt]) >> DISCH_TAC THEN
3323
3324   `2 pow i = Normal (real (2 pow i))` by METIS_TAC [normal_real] THEN
3325    POP_ASSUM (fn th => ONCE_REWRITE_TAC [th]) THEN
3326    ASM_SIMP_TAC std_ss [extreal_div_def] THEN
3327    MATCH_MP_TAC le_mul THEN SIMP_TAC std_ss [le_num] THEN
3328    ASM_SIMP_TAC real_ss [extreal_inv_def] THEN
3329    SIMP_TAC std_ss [extreal_of_num_def, extreal_le_def] THEN
3330    SIMP_TAC std_ss [REAL_LE_INV_EQ] THEN SIMP_TAC std_ss [GSYM extreal_le_def] THEN
3331    ASM_SIMP_TAC std_ss [normal_real, GSYM extreal_of_num_def] THEN
3332    METIS_TAC [le_02, pow_pos_le]) THEN
3333   Q.X_GEN_TAC `n` THEN
3334   RW_TAC std_ss [] THEN MATCH_MP_TAC IN_MEASURABLE_BOREL_CMUL THEN
3335   qexistsl_tac
3336        [`(\x. indicator_fn
3337          {x | x IN m_space m /\ &n / 2 pow i <= f x /\ f x < (&n + 1) / 2 pow i} x)`,
3338         `real (&n / 2 pow i)`] THEN
3339
3340   Know `&n / 2 pow i <> NegInf /\ &n / 2 pow i <> PosInf` THEN1
3341   ( `2 pow i <> NegInf /\ 2 pow i <> PosInf` by
3342     METIS_TAC [pow_not_infty, num_not_infty] THEN
3343     `2 pow i = Normal (real (2 pow i))` by METIS_TAC [normal_real] THEN
3344     POP_ASSUM (fn th => ONCE_REWRITE_TAC [th]) THEN
3345     Know `real (2 pow i) <> 0`
3346     >- (ASM_SIMP_TAC std_ss [GSYM extreal_11, normal_real,
3347                              GSYM extreal_of_num_def] THEN
3348         Suff `(0 :extreal) < 2 pow i` >- METIS_TAC [lt_imp_ne] THEN
3349         METIS_TAC [lt_02, pow_pos_lt]) >> DISCH_TAC THEN
3350     `&n = Normal (&n)` by PROVE_TAC [extreal_of_num_def] >> POP_ORW \\
3351     ASM_SIMP_TAC std_ss [extreal_div_eq, extreal_not_infty] ) THEN STRIP_TAC THEN
3352
3353   ASM_SIMP_TAC std_ss [normal_real] THEN
3354   MATCH_MP_TAC IN_MEASURABLE_BOREL_INDICATOR THEN
3355   Q.EXISTS_TAC `{x | x IN m_space m /\ &n / 2 pow i <= f x /\ f x < (&n + 1) / 2 pow i}` THEN
3356   ASM_SIMP_TAC std_ss [] THEN
3357   Know
3358   `{x | x IN m_space m /\ &n / 2 pow i <= f x /\ f x < (&n + 1) / 2 pow i} =
3359    PREIMAGE f {x | &n / 2 pow i <= x /\ x < (&n + 1) / 2 pow i} INTER
3360    space (m_space m,measurable_sets m)`
3361   >- (SIMP_TAC std_ss [PREIMAGE_def, space_def, INTER_UNIV] THEN
3362       SET_TAC []) THEN DISC_RW_KILL THEN
3363
3364   FULL_SIMP_TAC std_ss [IN_MEASURABLE] THEN
3365   FIRST_X_ASSUM MATCH_MP_TAC THEN
3366   REWRITE_TAC [BOREL_MEASURABLE_SETS_CO] ) THEN
3367
3368   CONJ_TAC THEN1
3369   (Q.X_GEN_TAC `x` THEN
3370    MATCH_MP_TAC le_mul THEN REWRITE_TAC [INDICATOR_FN_POS] THEN
3371
3372   `2 pow i <> NegInf /\ 2 pow i <> PosInf`
3373       by METIS_TAC [pow_not_infty, num_not_infty] THEN
3374    Know `real (2 pow i) <> 0`
3375    >- (ASM_SIMP_TAC std_ss [GSYM extreal_11, normal_real,
3376                             GSYM extreal_of_num_def] THEN
3377        Suff `(0 :extreal) < 2 pow i` >- METIS_TAC [lt_imp_ne] THEN
3378        METIS_TAC [lt_02, pow_pos_lt]) >> DISCH_TAC THEN
3379
3380   `2 pow i = Normal (real (2 pow i))` by METIS_TAC [normal_real] THEN
3381    POP_ASSUM (fn th => ONCE_REWRITE_TAC [th]) THEN
3382    ASM_SIMP_TAC std_ss [extreal_div_def] THEN
3383    MATCH_MP_TAC le_mul THEN SIMP_TAC std_ss [le_num] THEN
3384    ASM_SIMP_TAC real_ss [extreal_inv_def] THEN
3385    SIMP_TAC std_ss [extreal_of_num_def, extreal_le_def] THEN
3386    SIMP_TAC std_ss [REAL_LE_INV_EQ] THEN SIMP_TAC std_ss [GSYM extreal_le_def] THEN
3387    ASM_SIMP_TAC std_ss [normal_real, GSYM extreal_of_num_def] THEN
3388    METIS_TAC [le_02, pow_pos_le] ) THEN
3389
3390   reverse CONJ_TAC THEN1
3391   (Q.X_GEN_TAC `x` THEN
3392    MATCH_MP_TAC EXTREAL_SUM_IMAGE_POS THEN ASM_REWRITE_TAC [] THEN
3393    Q.X_GEN_TAC `n` >> RW_TAC std_ss [FINITE_COUNT, IN_UNIV] THEN
3394    MATCH_MP_TAC le_mul THEN REWRITE_TAC [INDICATOR_FN_POS] THEN
3395
3396   `2 pow i <> NegInf /\ 2 pow i <> PosInf`
3397       by METIS_TAC [pow_not_infty, num_not_infty] THEN
3398    Know `real (2 pow i) <> 0`
3399    >- (ASM_SIMP_TAC std_ss [GSYM extreal_11, normal_real,
3400                             GSYM extreal_of_num_def] THEN
3401        Suff `(0 :extreal) < 2 pow i` >- METIS_TAC [lt_imp_ne] THEN
3402        METIS_TAC [lt_02, pow_pos_lt]) >> DISCH_TAC THEN
3403
3404   `2 pow i = Normal (real (2 pow i))` by METIS_TAC [normal_real] THEN
3405    POP_ASSUM (fn th => ONCE_REWRITE_TAC [th]) THEN
3406    ASM_SIMP_TAC std_ss [extreal_div_def] THEN
3407    MATCH_MP_TAC le_mul THEN SIMP_TAC std_ss [le_num] THEN
3408    ASM_SIMP_TAC real_ss [extreal_inv_def] THEN
3409    SIMP_TAC std_ss [extreal_of_num_def, extreal_le_def] THEN
3410    SIMP_TAC std_ss [REAL_LE_INV_EQ] THEN SIMP_TAC std_ss [GSYM extreal_le_def] THEN
3411    ASM_SIMP_TAC std_ss [normal_real, GSYM extreal_of_num_def] THEN
3412    METIS_TAC [le_02, pow_pos_le] ) THEN
3413
3414   Suff `P (\x. &e / 2 pow i *
3415     (\x. indicator_fn {x | x IN m_space m /\ &e / 2 pow i <= f x /\ f x < (&e + 1) / 2 pow i}
3416       x) x)`
3417   >- (SIMP_TAC std_ss []) THEN
3418   FIRST_ASSUM MATCH_MP_TAC THEN ASM_SIMP_TAC std_ss [] THEN
3419
3420   CONJ_TAC THEN1
3421   (MATCH_MP_TAC IN_MEASURABLE_BOREL_INDICATOR THEN
3422    Q.EXISTS_TAC `{x | x IN m_space m /\ &e / 2 pow i <= f x /\ f x < (&e + 1) / 2 pow i}` THEN
3423    ASM_SIMP_TAC std_ss [space_def, IN_UNIV] THEN
3424    Know `{x | x IN m_space m /\ &e / 2 pow i <= f x /\ f x < (&e + 1) / 2 pow i} =
3425     PREIMAGE f {x | &e / 2 pow i <= x /\ x < (&e + 1) / 2 pow i} INTER
3426     space (m_space m,measurable_sets m)`
3427    >- (SIMP_TAC std_ss [PREIMAGE_def, space_def, INTER_UNIV] THEN
3428        SET_TAC []) THEN DISC_RW_KILL THEN
3429
3430    FULL_SIMP_TAC std_ss [IN_MEASURABLE] THEN
3431    FIRST_X_ASSUM MATCH_MP_TAC THEN
3432    REWRITE_TAC [BOREL_MEASURABLE_SETS_CO] ) THEN
3433
3434   CONJ_TAC THEN1
3435   (`2 pow i <> NegInf /\ 2 pow i <> PosInf`
3436      by METIS_TAC [pow_not_infty, num_not_infty] THEN
3437    Know `real (2 pow i) <> 0`
3438    >- (ASM_SIMP_TAC std_ss [GSYM extreal_11, normal_real,
3439                             GSYM extreal_of_num_def] THEN
3440        Suff `(0 :extreal) < 2 pow i` >- METIS_TAC [lt_imp_ne] THEN
3441        METIS_TAC [lt_02, pow_pos_lt]) >> DISCH_TAC THEN
3442
3443   `2 pow i = Normal (real (2 pow i))` by METIS_TAC [normal_real] THEN
3444    POP_ASSUM (fn th => ONCE_REWRITE_TAC [th]) THEN
3445    ASM_SIMP_TAC std_ss [extreal_div_def] THEN
3446    MATCH_MP_TAC le_mul THEN SIMP_TAC std_ss [le_num] THEN
3447    ASM_SIMP_TAC real_ss [extreal_inv_def] THEN
3448    SIMP_TAC std_ss [extreal_of_num_def, extreal_le_def] THEN
3449    SIMP_TAC std_ss [REAL_LE_INV_EQ] THEN SIMP_TAC std_ss [GSYM extreal_le_def] THEN
3450    ASM_SIMP_TAC std_ss [normal_real, GSYM extreal_of_num_def] THEN
3451    METIS_TAC [le_02, pow_pos_le] ) THEN
3452
3453   CONJ_TAC THENL
3454   [GEN_TAC THEN SIMP_TAC std_ss [indicator_fn_def] THEN COND_CASES_TAC THEN
3455    SIMP_TAC real_ss [le_refl, extreal_le_def, extreal_of_num_def],
3456    ALL_TAC] THEN
3457   Q_TAC SUFF_TAC `P
3458     (indicator_fn {x | x IN m_space m /\ &e / 2 pow i <= f x /\ f x < (&e + 1) / 2 pow i})` THENL
3459   [METIS_TAC [ETA_AX], ALL_TAC] THEN
3460   FIRST_ASSUM MATCH_MP_TAC THEN
3461
3462   ONCE_REWRITE_TAC [METIS [subsets_def]
3463    ``measurable_sets m = subsets (m_space m, measurable_sets m)``] THEN
3464    Know `{x | x IN m_space m /\ &e / 2 pow i <= f x /\ f x < (&e + 1) / 2 pow i} =
3465     PREIMAGE f {x | &e / 2 pow i <= x /\ x < (&e + 1) / 2 pow i} INTER
3466     space (m_space m,measurable_sets m)`
3467    >- (SIMP_TAC std_ss [PREIMAGE_def, space_def, INTER_UNIV] THEN
3468        SET_TAC []) THEN DISC_RW_KILL THEN
3469    FULL_SIMP_TAC std_ss [IN_MEASURABLE] THEN
3470    FIRST_X_ASSUM MATCH_MP_TAC THEN
3471    REWRITE_TAC [BOREL_MEASURABLE_SETS_CO] ) THEN
3472
3473  CONJ_TAC THEN1
3474  (GEN_TAC THEN MATCH_MP_TAC le_mul THEN SIMP_TAC std_ss [indicator_fn_def] THEN
3475   CONJ_TAC THENL
3476   [ALL_TAC, COND_CASES_TAC THEN
3477    SIMP_TAC real_ss [le_refl, extreal_of_num_def, extreal_le_def]] THEN
3478   SIMP_TAC std_ss [extreal_of_num_def, extreal_pow_def, extreal_le_def] THEN
3479   MATCH_MP_TAC POW_POS THEN SIMP_TAC real_ss [] ) THEN
3480
3481  Suff `P (\x. 2 pow i *
3482     (\x. indicator_fn {x |  x IN m_space m /\ 2 pow i <= f x} x) x)`
3483  >- (SIMP_TAC std_ss []) THEN
3484  FIRST_ASSUM MATCH_MP_TAC THEN ASM_SIMP_TAC std_ss [] THEN
3485
3486  CONJ_TAC THENL
3487  [MATCH_MP_TAC IN_MEASURABLE_BOREL_INDICATOR THEN
3488   Q.EXISTS_TAC `{x | x IN m_space m /\ 2 pow i <= f x}` THEN
3489   ASM_SIMP_TAC std_ss [space_def, IN_UNIV] THEN
3490   Q_TAC SUFF_TAC `{x | x IN m_space m /\ 2 pow i <= f x} =
3491   PREIMAGE f {x | 2 pow i <= x} INTER
3492    space (m_space m,measurable_sets m)` THENL
3493   [DISC_RW_KILL,
3494    SIMP_TAC std_ss [PREIMAGE_def, space_def, INTER_UNIV] THEN
3495    SET_TAC []] THEN
3496   FULL_SIMP_TAC std_ss [IN_MEASURABLE] THEN
3497   FIRST_X_ASSUM MATCH_MP_TAC THEN
3498   `2 pow i <> NegInf /\ 2 pow i <> PosInf` by
3499    METIS_TAC [pow_not_infty, num_not_infty] THEN
3500   METIS_TAC [BOREL_MEASURABLE_SETS_CR, normal_real], ALL_TAC] THEN
3501  CONJ_TAC THENL
3502  [SIMP_TAC std_ss [extreal_of_num_def, extreal_pow_def, extreal_le_def] THEN
3503   MATCH_MP_TAC POW_POS THEN SIMP_TAC real_ss [], ALL_TAC] THEN
3504  CONJ_TAC THENL
3505  [GEN_TAC THEN SIMP_TAC std_ss [indicator_fn_def] THEN COND_CASES_TAC THEN
3506   SIMP_TAC real_ss [le_refl, extreal_of_num_def, extreal_le_def], ALL_TAC] THEN
3507  Q_TAC SUFF_TAC `P (indicator_fn {x | x IN m_space m /\ 2 pow i <= f x})` THENL
3508  [METIS_TAC [ETA_AX], ALL_TAC] THEN
3509  FIRST_ASSUM MATCH_MP_TAC THEN
3510  ONCE_REWRITE_TAC [METIS [subsets_def]
3511    ``measurable_sets m = subsets (m_space m, measurable_sets m)``] THEN
3512  Q_TAC SUFF_TAC `{x | x IN m_space m /\ 2 pow i <= f x} = PREIMAGE f {x | 2 pow i <= x} INTER
3513     space (m_space m,measurable_sets m)` THENL
3514  [DISC_RW_KILL,
3515   SIMP_TAC std_ss [PREIMAGE_def, space_def, INTER_UNIV] THEN
3516   SET_TAC []] THEN
3517  FULL_SIMP_TAC std_ss [IN_MEASURABLE] THEN
3518  FIRST_X_ASSUM MATCH_MP_TAC THEN
3519  `2 pow i <> NegInf /\ 2 pow i <> PosInf` by
3520    METIS_TAC [pow_not_infty, num_not_infty] THEN
3521  METIS_TAC [BOREL_MEASURABLE_SETS_CR, normal_real]
3522QED
3523
3524Theorem integral_sequence :
3525    !m f. measure_space m /\ f IN measurable (m_space m,measurable_sets m) Borel /\
3526         (!x. x IN m_space m ==> 0 <= f x) ==>
3527          pos_fn_integral m f =
3528          sup (IMAGE (\i. pos_fn_integral m (fn_seq m f i)) UNIV)
3529Proof
3530    RW_TAC std_ss []
3531 >> MATCH_MP_TAC lebesgue_monotone_convergence
3532 >> RW_TAC std_ss [lemma_fn_seq_sup, lemma_fn_seq_mono_increasing,
3533                   lemma_fn_seq_upper_bounded, lemma_fn_seq_positive]
3534 >> METIS_TAC [lemma_fn_seq_in_psfis, IN_MEASURABLE_BOREL_POS_SIMPLE_FN, IN_psfis_eq]
3535QED
3536
3537Theorem measurable_sequence :
3538    !m f. measure_space m /\ f IN measurable (m_space m,measurable_sets m) Borel ==>
3539         (?fi ri. (!x. mono_increasing (\i. fi i x)) /\
3540                  (!x. x IN m_space m ==>
3541                       sup (IMAGE (\i. fi i x) UNIV) = fn_plus f x) /\
3542                  (!i. ri i IN psfis m (fi i)) /\
3543                  (!i x. fi i x <= fn_plus f x) /\
3544                  (!i x. 0 <= fi i x) /\
3545                  (pos_fn_integral m (fn_plus f) =
3546                   sup (IMAGE (\i. pos_fn_integral m (fi i)) UNIV))) /\
3547         (?gi vi. (!x. mono_increasing (\i. gi i x)) /\
3548                  (!x. x IN m_space m ==>
3549                       sup (IMAGE (\i. gi i x) UNIV) = fn_minus f x) /\
3550                  (!i. vi i IN psfis m (gi i)) /\
3551                  (!i x. (gi i) x <= fn_minus f x) /\
3552                  (!i x. 0 <= gi i x) /\
3553                  (pos_fn_integral m (fn_minus f) =
3554                   sup (IMAGE (\i. pos_fn_integral m (gi i)) UNIV)))
3555Proof
3556    rpt GEN_TAC >> STRIP_TAC
3557 >> ‘sigma_algebra (measurable_space m)’
3558      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA]
3559 >> CONJ_TAC
3560 >- (Q.EXISTS_TAC `(\n. fn_seq m (fn_plus f) n)` \\
3561     Q.EXISTS_TAC `(\n. fn_seq_integral m (fn_plus f) n)` \\
3562     CONJ_TAC >- RW_TAC std_ss [FN_PLUS_POS, lemma_fn_seq_mono_increasing] \\
3563     CONJ_TAC >- RW_TAC std_ss [FN_PLUS_POS, lemma_fn_seq_sup] \\
3564     CONJ_TAC
3565     >- FULL_SIMP_TAC std_ss [FN_PLUS_POS, lemma_fn_seq_in_psfis,
3566                              IN_MEASURABLE_BOREL_FN_PLUS] \\
3567     CONJ_TAC >- METIS_TAC [FN_PLUS_POS, lemma_fn_seq_upper_bounded] \\
3568     CONJ_TAC >- METIS_TAC [FN_PLUS_POS, lemma_fn_seq_positive] \\
3569     METIS_TAC [FN_PLUS_POS, integral_sequence, IN_MEASURABLE_BOREL_FN_PLUS])
3570 >> Q.EXISTS_TAC `(\n. fn_seq m (fn_minus f) n)`
3571 >> Q.EXISTS_TAC `(\n. fn_seq_integral m (fn_minus f) n)`
3572 >> CONJ_TAC
3573 >- RW_TAC std_ss [FN_MINUS_POS, lemma_fn_seq_mono_increasing]
3574 >> CONJ_TAC
3575 >- RW_TAC std_ss [FN_MINUS_POS, lemma_fn_seq_sup]
3576 >> CONJ_TAC
3577 >- FULL_SIMP_TAC std_ss [FN_MINUS_POS, lemma_fn_seq_in_psfis,
3578                          IN_MEASURABLE_BOREL_FN_MINUS]
3579 >> CONJ_TAC
3580 >- METIS_TAC [FN_MINUS_POS, lemma_fn_seq_upper_bounded]
3581 >> CONJ_TAC
3582 >- METIS_TAC [FN_MINUS_POS, lemma_fn_seq_positive]
3583 >> METIS_TAC [FN_MINUS_POS, integral_sequence, IN_MEASURABLE_BOREL_FN_MINUS]
3584QED
3585
3586(* deep result. added `x IN m_space m` *)
3587Theorem pos_fn_integral_mono_AE : (* was: positive_integral_mono_AE *)
3588    !m u v. measure_space m /\
3589            (!x. x IN m_space m ==> 0 <= u x) /\
3590            (!x. x IN m_space m ==> 0 <= v x) /\
3591            (AE x::m. u x <= v x) ==>
3592            pos_fn_integral m u <= pos_fn_integral m v
3593Proof
3594    Q.X_GEN_TAC ‘M’
3595 >> RW_TAC std_ss [pos_fn_integral_def]
3596 >> MATCH_MP_TAC sup_le_sup_imp'
3597 >> RW_TAC std_ss [GSPECIFICATION]
3598 >> FULL_SIMP_TAC std_ss [GSPECIFICATION, IN_psfis_eq]
3599 >> FULL_SIMP_TAC std_ss [AE_ALT, GSPECIFICATION]
3600 >> `AE x::M. x NOTIN N`
3601      by (MATCH_MP_TAC AE_NOT_IN THEN ASM_SIMP_TAC std_ss [])
3602 >> Q.ABBREV_TAC `nn = (\x. g x * indicator_fn (m_space M DIFF N) x)`
3603 >> Know `AE x::M. g x <= nn x`
3604 >- (FULL_SIMP_TAC std_ss [AE_ALT, GSPECIFICATION] THEN Q.EXISTS_TAC `N'` THEN
3605     FULL_SIMP_TAC std_ss [SUBSET_DEF, GSPECIFICATION] THEN RW_TAC std_ss [] THEN
3606     FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM MP_TAC THEN
3607     Q.UNABBREV_TAC `nn` THEN ONCE_REWRITE_TAC [MONO_NOT_EQ] THEN
3608     RW_TAC std_ss [indicator_fn_def, mul_rzero, mul_rone, le_refl] THEN
3609     ASM_SET_TAC []) >> DISCH_TAC
3610 >> Know `!x. x IN m_space M ==> nn x <= v x`
3611 >- (Q.X_GEN_TAC ‘y’ >> DISCH_TAC >> Q.UNABBREV_TAC `nn` \\
3612     ASM_SIMP_TAC std_ss [indicator_fn_def] \\
3613     COND_CASES_TAC >> ASM_SIMP_TAC std_ss [mul_rone, mul_rzero] \\
3614     FULL_SIMP_TAC std_ss [SUBSET_DEF, GSPECIFICATION, IN_DIFF] \\
3615     POP_ASSUM MP_TAC >> ONCE_REWRITE_TAC [MONO_NOT_EQ] \\
3616     RW_TAC std_ss [] >> FIRST_ASSUM MATCH_MP_TAC \\
3617     FULL_SIMP_TAC std_ss [GSYM extreal_lt_def] >> METIS_TAC [lte_trans])
3618 >> DISCH_TAC
3619 >> FULL_SIMP_TAC std_ss [GSYM IN_NULL_SET, null_sets, GSPECIFICATION]
3620 >> `?e. e NOTIN s` by METIS_TAC [num_FINITE_AVOID, pos_simple_fn_def]
3621 >> Know `pos_simple_fn M nn (e INSERT s)
3622            (\i. if i = e then N else a i DIFF N)
3623            (\i. if i = e then 0 else x' i)`
3624 >- (FULL_SIMP_TAC std_ss [pos_simple_fn_def] \\
3625     Q.UNABBREV_TAC `nn` >> RW_TAC real_ss [] >> TRY (ASM_SET_TAC []) >|
3626     [ (* goal 1 (of 5) *)
3627       Q.PAT_X_ASSUM ‘!t. t IN m_space M ==> g t = _’
3628          (fn th => (ONCE_REWRITE_TAC [SYM (MATCH_MP th (ASSUME “t IN m_space M”))])) \\
3629       MATCH_MP_TAC le_mul >> ASM_SIMP_TAC std_ss [INDICATOR_FN_POS],
3630       (* goal 2 (of 5) *)
3631       ALL_TAC,
3632       (* goal 3 (of 5) *)
3633       ONCE_REWRITE_TAC [METIS [subsets_def]
3634         ``measurable_sets M = subsets (m_space M, measurable_sets M)``] \\
3635       MATCH_MP_TAC SIGMA_ALGEBRA_DIFF \\
3636      `i IN s` by ASM_SET_TAC [] \\
3637       fs [measure_space_def],
3638       (* goal 4 (of 5) *)
3639       METIS_TAC [FINITE_INSERT],
3640       (* goal 5 (of 5) *)
3641       SIMP_TAC std_ss [EXTENSION, IN_BIGUNION, IN_IMAGE, GSPECIFICATION, IN_DIFF] \\
3642       GEN_TAC >> EQ_TAC
3643       >- (RW_TAC std_ss [] THEN UNDISCH_TAC ``x IN s'`` THEN ASM_REWRITE_TAC [] THEN
3644          `N SUBSET m_space M`
3645             by (MATCH_MP_TAC MEASURABLE_SETS_SUBSET_SPACE THEN ASM_SIMP_TAC std_ss []) \\
3646          `!i. i IN s ==> a i SUBSET m_space M` by (RW_TAC std_ss [] THEN
3647           MATCH_MP_TAC MEASURABLE_SETS_SUBSET_SPACE THEN ASM_SIMP_TAC std_ss []) THEN
3648           ASM_SET_TAC []) \\
3649       DISCH_TAC >> `?i. x IN a i /\ i IN s` by ASM_SET_TAC [] \\
3650       ASM_CASES_TAC ``x IN N``
3651       >- (Q.EXISTS_TAC `N` THEN ASM_SIMP_TAC std_ss [] \\
3652           Q.EXISTS_TAC `e` THEN ASM_SET_TAC []) \\
3653       Q.EXISTS_TAC `a i DIFF N` \\
3654       CONJ_TAC >- ASM_SET_TAC [] \\
3655       Q.EXISTS_TAC `i` >> ASM_SET_TAC [] ] \\ (* end of 5 goals *)
3656     (* continue goal 2 (of 5) *)
3657     ASM_CASES_TAC ``t IN N`` >> ASM_SIMP_TAC std_ss [indicator_fn_def, IN_DIFF]
3658     >- (SIMP_TAC std_ss [mul_rzero] >> ONCE_REWRITE_TAC [EQ_SYM_EQ] \\
3659         MATCH_MP_TAC EXTREAL_SUM_IMAGE_0 >> ASM_SIMP_TAC std_ss [FINITE_INSERT] \\
3660         RW_TAC std_ss [IN_INSERT, GSYM extreal_of_num_def, mul_rzero, mul_lzero, mul_rone] \\
3661         ASM_SET_TAC []) \\
3662     ASM_SIMP_TAC std_ss [mul_rone] \\
3663     Q.ABBREV_TAC `f = (\i. Normal (if i = e then 0 else x' i) *
3664                            if t IN if i = e then N else a i DIFF N then 1 else 0)` \\
3665     ONCE_REWRITE_TAC [SET_RULE ``e INSERT s = {e} UNION s``] \\
3666     Know `(!x. x IN {e} UNION s ==> f x <> NegInf) \/
3667           (!x. x IN {e} UNION s ==> f x <> PosInf) ==>
3668           (SIGMA f ({e} UNION s) = SIGMA f {e} + SIGMA f s)`
3669     >- (MATCH_MP_TAC EXTREAL_SUM_IMAGE_DISJOINT_UNION \\
3670         ASM_SIMP_TAC std_ss [FINITE_SING] >> ASM_SET_TAC []) >> DISCH_TAC \\
3671     Know `(SIGMA f ({e} UNION s) = SIGMA f {e} + SIGMA f s)`
3672     >- (POP_ASSUM MATCH_MP_TAC THEN DISJ1_TAC THEN Q.UNABBREV_TAC `f` \\
3673         RW_TAC std_ss [IN_UNION] THENL
3674         [SIMP_TAC std_ss [GSYM extreal_of_num_def, mul_lzero, num_not_infty],
3675          SIMP_TAC std_ss [GSYM extreal_of_num_def, mul_lzero, num_not_infty],
3676          SIMP_TAC std_ss [mul_rone, extreal_not_infty],
3677          SIMP_TAC std_ss [mul_rone, extreal_not_infty],
3678          SIMP_TAC std_ss [mul_rzero, num_not_infty],
3679          SIMP_TAC std_ss [mul_rzero, num_not_infty]]) \\
3680     DISC_RW_KILL >> Q.UNABBREV_TAC `f` >> RW_TAC std_ss [EXTREAL_SUM_IMAGE_SING] \\
3681     SIMP_TAC std_ss [mul_rzero, add_lzero] \\
3682     FIRST_ASSUM (MATCH_MP_TAC o MATCH_MP EXTREAL_SUM_IMAGE_EQ) THEN RW_TAC std_ss [] >|
3683     [ALL_TAC, ASM_SET_TAC [], ASM_SET_TAC []] \\
3684     DISJ1_TAC >> RW_TAC std_ss [] >> `x <> e` by ASM_SET_TAC [] >|
3685     [SIMP_TAC std_ss [mul_rone, extreal_not_infty],
3686      SIMP_TAC std_ss [mul_rone, extreal_not_infty],
3687      SIMP_TAC std_ss [mul_rzero, num_not_infty],
3688      SIMP_TAC std_ss [mul_rzero, num_not_infty],
3689      SIMP_TAC std_ss [mul_rone, extreal_not_infty],
3690      ALL_TAC] \\
3691     SIMP_TAC std_ss [mul_rzero, num_not_infty]) >> DISCH_TAC
3692 (* stage work *)
3693 >> Q.EXISTS_TAC `pos_simple_fn_integral M (e INSERT s)
3694   (\i. if i = e then N else a i DIFF N) (\i. if i = e then 0 else x' i)` THEN
3695  CONJ_TAC THENL [METIS_TAC [], ALL_TAC] THEN
3696  SIMP_TAC std_ss [pos_simple_fn_integral_def] THEN
3697  Q.ABBREV_TAC `f = (\i. Normal (if i = e then 0 else x' i) *
3698     measure M (if i = e then N else a i DIFF N))` THEN
3699  ONCE_REWRITE_TAC [SET_RULE ``e INSERT s = {e} UNION s``] THEN
3700  Q_TAC SUFF_TAC `(!x. x IN {e} UNION s ==> f x <> NegInf) \/
3701                  (!x. x IN {e} UNION s ==> f x <> PosInf) ==>
3702                  (SIGMA f ({e} UNION s) = SIGMA f {e} + SIGMA f s)` THENL
3703  [ALL_TAC,
3704   MATCH_MP_TAC EXTREAL_SUM_IMAGE_DISJOINT_UNION THEN
3705   ASM_SIMP_TAC std_ss [FINITE_SING] THEN ASM_SET_TAC [pos_simple_fn_def]] THEN
3706  DISCH_TAC THEN Q_TAC SUFF_TAC `(SIGMA f ({e} UNION s) = SIGMA f {e} + SIGMA f s)` THENL
3707  [ALL_TAC,
3708   POP_ASSUM MATCH_MP_TAC THEN DISJ1_TAC THEN Q.UNABBREV_TAC `f` THEN
3709   RW_TAC std_ss [IN_UNION] THENL
3710   [SIMP_TAC std_ss [mul_rzero, num_not_infty], ASM_SET_TAC [],
3711    ALL_TAC] THEN
3712   SIMP_TAC std_ss [lt_infty] THEN MATCH_MP_TAC lte_trans THEN
3713   Q.EXISTS_TAC `0` THEN SIMP_TAC std_ss [GSYM lt_infty, num_not_infty] THEN
3714   MATCH_MP_TAC le_mul THEN SIMP_TAC std_ss [extreal_of_num_def, extreal_le_def] THEN
3715   FULL_SIMP_TAC std_ss [pos_simple_fn_def, measure_space_def, positive_def] THEN
3716   SIMP_TAC std_ss [GSYM extreal_of_num_def] THEN FIRST_ASSUM MATCH_MP_TAC THEN
3717   ONCE_REWRITE_TAC [METIS [subsets_def]
3718     ``measurable_sets M = subsets (m_space M, measurable_sets M)``] THEN
3719   MATCH_MP_TAC ALGEBRA_DIFF THEN
3720   FULL_SIMP_TAC std_ss [subsets_def, measure_space_def, sigma_algebra_def]] THEN
3721  DISC_RW_KILL THEN Q.UNABBREV_TAC `f` THEN RW_TAC std_ss [EXTREAL_SUM_IMAGE_SING] THEN
3722  SIMP_TAC std_ss [mul_rzero, add_lzero] THEN `FINITE s` by METIS_TAC [pos_simple_fn_def] THEN
3723  FIRST_ASSUM (MATCH_MP_TAC o MATCH_MP EXTREAL_SUM_IMAGE_MONO) THEN RW_TAC std_ss [] THENL
3724  [DISJ1_TAC THEN RW_TAC std_ss [] THENL
3725   [SIMP_TAC std_ss [lt_infty] THEN MATCH_MP_TAC lte_trans THEN
3726    Q.EXISTS_TAC `0` THEN SIMP_TAC std_ss [GSYM lt_infty, num_not_infty] THEN
3727    MATCH_MP_TAC le_mul THEN SIMP_TAC std_ss [extreal_of_num_def, extreal_le_def] THEN
3728    FULL_SIMP_TAC std_ss [pos_simple_fn_def, measure_space_def, positive_def] THEN
3729    SIMP_TAC std_ss [GSYM extreal_of_num_def] THEN FIRST_ASSUM MATCH_MP_TAC THEN
3730    ASM_SIMP_TAC std_ss [], ALL_TAC] THEN
3731   SIMP_TAC std_ss [lt_infty] THEN MATCH_MP_TAC lte_trans THEN
3732   Q.EXISTS_TAC `0` THEN SIMP_TAC std_ss [GSYM lt_infty, num_not_infty] THEN
3733   MATCH_MP_TAC le_mul THEN SIMP_TAC std_ss [extreal_of_num_def, extreal_le_def] THEN
3734   FULL_SIMP_TAC std_ss [pos_simple_fn_def, measure_space_def, positive_def] THEN
3735   SIMP_TAC std_ss [GSYM extreal_of_num_def] THEN FIRST_ASSUM MATCH_MP_TAC THEN
3736   ONCE_REWRITE_TAC [METIS [subsets_def]
3737     ``measurable_sets M = subsets (m_space M, measurable_sets M)``] THEN
3738   MATCH_MP_TAC ALGEBRA_DIFF THEN
3739   FULL_SIMP_TAC std_ss [subsets_def, measure_space_def, sigma_algebra_def],
3740   ALL_TAC] THEN
3741  ONCE_REWRITE_TAC [SET_RULE ``a DIFF b = a DIFF (a INTER b)``] THEN
3742  Q_TAC SUFF_TAC `measure M (a x DIFF a x INTER N) = measure M (a x) - measure M (a x INTER N)` THENL
3743  [ALL_TAC,
3744   MATCH_MP_TAC MEASURE_DIFF_SUBSET THEN FULL_SIMP_TAC std_ss [pos_simple_fn_def] THEN
3745   CONJ_TAC THENL
3746   [ONCE_REWRITE_TAC [METIS [subsets_def]
3747     ``measurable_sets M = subsets (m_space M, measurable_sets M)``] THEN
3748    MATCH_MP_TAC ALGEBRA_INTER THEN
3749    FULL_SIMP_TAC std_ss [subsets_def, measure_space_def, sigma_algebra_def],
3750    ALL_TAC] THEN
3751   CONJ_TAC THENL [ASM_SET_TAC [], ALL_TAC] THEN
3752   SIMP_TAC std_ss [lt_infty] THEN MATCH_MP_TAC let_trans THEN
3753   Q.EXISTS_TAC `measure M N` THEN CONJ_TAC THENL
3754   [ALL_TAC, METIS_TAC [lt_infty, num_not_infty]] THEN
3755   MATCH_MP_TAC INCREASING THEN ASM_SIMP_TAC std_ss [MEASURE_SPACE_INCREASING] THEN
3756   CONJ_TAC THENL [SET_TAC [], ALL_TAC] THEN
3757   ONCE_REWRITE_TAC [METIS [subsets_def]
3758     ``measurable_sets M = subsets (m_space M, measurable_sets M)``] THEN
3759   MATCH_MP_TAC ALGEBRA_INTER THEN
3760   FULL_SIMP_TAC std_ss [subsets_def, measure_space_def, sigma_algebra_def]] THEN
3761  DISC_RW_KILL THEN Q_TAC SUFF_TAC `measure M (a x INTER N) = 0` THENL
3762  [SIMP_TAC std_ss [le_refl, sub_rzero], ALL_TAC] THEN
3763  SIMP_TAC std_ss [GSYM le_antisym] THEN CONJ_TAC THENL
3764  [ALL_TAC,
3765   FULL_SIMP_TAC std_ss [measure_space_def, positive_def] THEN
3766   FIRST_ASSUM MATCH_MP_TAC THEN FULL_SIMP_TAC std_ss [pos_simple_fn_def] THEN
3767   ONCE_REWRITE_TAC [METIS [subsets_def]
3768     ``measurable_sets M = subsets (m_space M, measurable_sets M)``] THEN
3769   MATCH_MP_TAC ALGEBRA_INTER THEN
3770   FULL_SIMP_TAC std_ss [subsets_def, measure_space_def, sigma_algebra_def]] THEN
3771  `0 = measure M N` by METIS_TAC [] THEN FIRST_X_ASSUM (fn th => ONCE_REWRITE_TAC [th]) THEN
3772  MATCH_MP_TAC INCREASING THEN ASM_SIMP_TAC std_ss [MEASURE_SPACE_INCREASING] THEN
3773  CONJ_TAC THENL [SET_TAC [], ALL_TAC] THEN FULL_SIMP_TAC std_ss [pos_simple_fn_def] THEN
3774  ONCE_REWRITE_TAC [METIS [subsets_def]
3775    ``measurable_sets M = subsets (m_space M, measurable_sets M)``] THEN
3776  MATCH_MP_TAC ALGEBRA_INTER THEN
3777  FULL_SIMP_TAC std_ss [subsets_def, measure_space_def, sigma_algebra_def]
3778QED
3779
3780(* key result. added ‘x IN m_space m’ *)
3781Theorem pos_fn_integral_cong_AE : (* was: positive_integral_cong_AE *)
3782    !m u v. measure_space m /\
3783           (!x. x IN m_space m ==> 0 <= u x) /\
3784           (!x. x IN m_space m ==> 0 <= v x) /\
3785           (AE x::m. u x = v x) ==>
3786           (pos_fn_integral m u = pos_fn_integral m v)
3787Proof
3788    RW_TAC std_ss [GSYM le_antisym] (* 2 subgoals, same tactics *)
3789 >> MATCH_MP_TAC pos_fn_integral_mono_AE
3790 >> FULL_SIMP_TAC std_ss [AE_ALT, SUBSET_DEF, GSPECIFICATION]
3791 >> METIS_TAC []
3792QED
3793
3794(* common result. added ‘x IN m_space m’ *)
3795Theorem pos_fn_integral_cong : (* was: positive_integral_cong *)
3796    !m u v. measure_space m /\
3797           (!x. x IN m_space m ==> 0 <= u x) /\
3798           (!x. x IN m_space m ==> 0 <= v x) /\
3799           (!x. x IN m_space m ==> (u x = v x)) ==>
3800           (pos_fn_integral m u = pos_fn_integral m v)
3801Proof
3802    RW_TAC std_ss []
3803 >> MATCH_MP_TAC pos_fn_integral_cong_AE
3804 >> FULL_SIMP_TAC std_ss [AE_ALT, GSPECIFICATION]
3805 >> `{x | x IN m_space m /\ u x <> v x} = {}` by ASM_SET_TAC []
3806 >> Q.EXISTS_TAC `{}`
3807 >> ASM_SIMP_TAC std_ss [SUBSET_REFL, GSYM IN_NULL_SET, null_sets,
3808                         GSPECIFICATION]
3809 >> METIS_TAC [measure_space_def, positive_def, sigma_algebra_alt_pow]
3810QED
3811
3812Theorem pos_fn_integral_add :
3813    !m f g. measure_space m /\
3814           (!x. x IN m_space m ==> 0 <= f x) /\
3815           (!x. x IN m_space m ==> 0 <= g x) /\
3816            f IN measurable (m_space m,measurable_sets m) Borel /\
3817            g IN measurable (m_space m,measurable_sets m) Borel ==>
3818           (pos_fn_integral m (\x. f x + g x) = pos_fn_integral m f + pos_fn_integral m g)
3819Proof
3820    rpt STRIP_TAC
3821 >> `?fi ui.
3822       (!x. mono_increasing (\i. fi i x)) /\
3823       (!x. x IN m_space m ==> (sup (IMAGE (\i. fi i x) UNIV) = (fn_plus f) x)) /\
3824       (!i. ui i IN psfis m (fi i)) /\
3825       (!i x. fi i x <= (fn_plus f) x) /\
3826       (!i x. 0 <= fi i x) /\
3827       (pos_fn_integral m (fn_plus f) = sup (IMAGE (\i. pos_fn_integral m (fi i)) UNIV))`
3828            by METIS_TAC [measurable_sequence]
3829 >> `?gi vi.
3830       (!x. mono_increasing (\i. gi i x)) /\
3831       (!x. x IN m_space m ==> (sup (IMAGE (\i. gi i x) UNIV) = (fn_plus g) x)) /\
3832       (!i. vi i IN psfis m (gi i)) /\
3833       (!i x. gi i x <= (fn_plus g) x) /\
3834       (!i x. 0 <= gi i x) /\
3835       (pos_fn_integral m (fn_plus g) = sup (IMAGE (\i. pos_fn_integral m (gi i)) UNIV))`
3836            by METIS_TAC [measurable_sequence]
3837 >> Know ‘pos_fn_integral m f = pos_fn_integral m (fn_plus f)’
3838 >- (MATCH_MP_TAC pos_fn_integral_cong >> simp [FN_PLUS_POS] \\
3839     rpt STRIP_TAC >> rw []) >> Rewr'
3840 >> Know ‘pos_fn_integral m g = pos_fn_integral m (fn_plus g)’
3841 >- (MATCH_MP_TAC pos_fn_integral_cong >> simp [FN_PLUS_POS] \\
3842     rpt STRIP_TAC >> rw []) >> Rewr'
3843 >> `sup (IMAGE (\i. pos_fn_integral m (fi i)) UNIV) +
3844     sup (IMAGE (\i. pos_fn_integral m (gi i)) UNIV) =
3845     sup (IMAGE (\i. (\n. pos_fn_integral m (fi n)) i + (\n. pos_fn_integral m (gi n)) i) UNIV)`
3846       by (MATCH_MP_TAC (GSYM sup_add_mono) \\
3847           FULL_SIMP_TAC std_ss [pos_fn_integral_pos, ext_mono_increasing_suc, pos_fn_integral_mono])
3848 >> FULL_SIMP_TAC std_ss []
3849 >> `!i. (\x. fi i x + gi i x) IN measurable (m_space m,measurable_sets m) Borel`
3850       by METIS_TAC [IN_MEASURABLE_BOREL_POS_SIMPLE_FN, IN_psfis_eq, psfis_add]
3851 >> `!x. mono_increasing (\i. (\i x. fi i x + gi i x) i x)`
3852       by FULL_SIMP_TAC std_ss [ext_mono_increasing_def, le_add2]
3853 >> Know `!x. x IN m_space m ==> (sup (IMAGE (\i. fi i x + gi i x) UNIV) = f x + g x)`
3854 >- (rpt STRIP_TAC \\
3855    `f x = sup (IMAGE (\i. fi i x) UNIV)` by METIS_TAC [FN_PLUS_REDUCE] >> POP_ORW \\
3856    `g x = sup (IMAGE (\i. gi i x) UNIV)` by METIS_TAC [FN_PLUS_REDUCE] >> POP_ORW \\
3857     FULL_SIMP_TAC std_ss [pos_fn_integral_pos, sup_add_mono,
3858                           ext_mono_increasing_suc, pos_fn_integral_mono])
3859 >> DISCH_TAC
3860 >> (MP_TAC o Q.SPECL [`m`, `\x. f x + g x`, `\i. (\x. fi i x + gi i x)`])
3861       lebesgue_monotone_convergence
3862 >> RW_TAC std_ss []
3863 >> Suff `(\i. pos_fn_integral m (fi i) + pos_fn_integral m (gi i)) =
3864          (\i. pos_fn_integral m (\x. fi i x + gi i x))`
3865 >- RW_TAC std_ss [le_add]
3866 >> RW_TAC std_ss [FUN_EQ_THM]
3867 >> METIS_TAC [IN_psfis_eq, psfis_add, pos_fn_integral_pos_simple_fn]
3868QED
3869
3870(* added ‘x IN m_space m’. used by martingaleTheory.EXISTENCE_OF_PROD_MEASURE *)
3871Theorem pos_fn_integral_sub :
3872    !m f g. measure_space m /\
3873            f IN measurable (m_space m,measurable_sets m) Borel /\
3874            g IN measurable (m_space m,measurable_sets m) Borel /\
3875           (!x. x IN m_space m ==> 0 <= g x) /\
3876           (!x. x IN m_space m ==> g x <= f x) /\
3877           (!x. x IN m_space m ==> g x <> PosInf) /\
3878            pos_fn_integral m g <> PosInf ==>
3879           (pos_fn_integral m (\x. f x - g x) = pos_fn_integral m f - pos_fn_integral m g)
3880Proof
3881    rpt STRIP_TAC
3882 >> Know `pos_fn_integral m g <> NegInf /\ pos_fn_integral m g <> PosInf`
3883 >- (art [] >> MATCH_MP_TAC pos_not_neginf \\
3884     MATCH_MP_TAC pos_fn_integral_pos >> art [])
3885 >> DISCH_THEN (ONCE_REWRITE_TAC o wrap o (MATCH_MP eq_sub_ladd))
3886 >> Know `pos_fn_integral m (\x. f x - g x) + pos_fn_integral m g =
3887          pos_fn_integral m (\x. (\x. f x - g x) x + g x)`
3888 >- (MATCH_MP_TAC EQ_SYM \\
3889     MATCH_MP_TAC pos_fn_integral_add >> simp [] \\
3890     CONJ_TAC >- (rpt STRIP_TAC >> MATCH_MP_TAC le_sub_imp >> simp [add_lzero] \\
3891                  MATCH_MP_TAC pos_not_neginf \\
3892                  FIRST_X_ASSUM MATCH_MP_TAC >> art []) \\
3893     MATCH_MP_TAC IN_MEASURABLE_BOREL_SUB \\
3894     qexistsl_tac [`f`, `g`] >> fs [measure_space_def] \\
3895     GEN_TAC >> DISCH_TAC \\
3896     Suff ‘f x <> NegInf’ >- PROVE_TAC [] \\
3897     MATCH_MP_TAC pos_not_neginf >> simp [] \\
3898     MATCH_MP_TAC le_trans >> Q.EXISTS_TAC ‘g x’ \\
3899     CONJ_TAC >- (FIRST_X_ASSUM MATCH_MP_TAC >> art []) \\
3900     FIRST_X_ASSUM MATCH_MP_TAC >> art []) >> Rewr'
3901 >> BETA_TAC
3902 >> Suff `!x. x IN m_space m ==> f x - g x + g x = f x`
3903 >- (DISCH_TAC >> MATCH_MP_TAC pos_fn_integral_cong >> simp [] \\
3904     rpt STRIP_TAC \\
3905     MATCH_MP_TAC le_trans >> Q.EXISTS_TAC ‘g x’ \\
3906     CONJ_TAC >- (FIRST_X_ASSUM MATCH_MP_TAC >> art []) \\
3907     FIRST_X_ASSUM MATCH_MP_TAC >> art [])
3908 >> rpt STRIP_TAC
3909 >> MATCH_MP_TAC sub_add >> art []
3910 >> CONJ_TAC
3911 >- (MATCH_MP_TAC pos_not_neginf \\
3912     FIRST_X_ASSUM MATCH_MP_TAC >> art [])
3913 >> FIRST_X_ASSUM MATCH_MP_TAC >> art []
3914QED
3915
3916(* lebesgue_monotone_convergence for decreasing function sequences
3917
3918   The case for mono-decreasing functions can be derived as an easy corollary,
3919   because ‘\i x. f 0 x - f i x’ is mono-increasing, while assuming additionally
3920
3921   1. !i x. x IN m_space m ==> fi i x < PosInf
3922   2. !i. pos_fn_integral m (fi i) <> PosInf
3923 *)
3924Theorem lebesgue_monotone_convergence_decreasing :
3925    !m f fi. measure_space m /\
3926        (!i. fi i IN measurable (m_space m, measurable_sets m) Borel) /\
3927        (!i x. x IN m_space m ==> 0 <= fi i x /\ fi i x < PosInf) /\
3928        (!i. pos_fn_integral m (fi i) <> PosInf) /\
3929        (!x. x IN m_space m ==> mono_decreasing (\i. fi i x)) /\
3930        (!x. x IN m_space m ==> (inf (IMAGE (\i. fi i x) UNIV) = f x)) ==>
3931        (pos_fn_integral m f = inf (IMAGE (\i. pos_fn_integral m (fi i)) UNIV))
3932Proof
3933    rpt STRIP_TAC
3934 >> Know ‘!x. x IN m_space m ==> 0 <= f x’
3935 >- (rpt STRIP_TAC \\
3936     Q.PAT_X_ASSUM ‘!x. x IN m_space m ==> _ = f x’ (MP_TAC o (Q.SPEC ‘x’)) \\
3937     RW_TAC std_ss [] \\
3938     POP_ASSUM (ONCE_REWRITE_TAC o wrap o SYM) \\
3939     rw [le_inf'] >> PROVE_TAC []) >> DISCH_TAC
3940 >> Q.ABBREV_TAC ‘gi = \i x. fi 0 x - fi i x’
3941 >> Know ‘!i x. x IN m_space m ==> 0 <= gi i x’
3942 >- (rw [Abbr ‘gi’] \\
3943     Know ‘0 <= fi 0 x - fi i x <=> fi i x <= fi 0 x’
3944     >- (MATCH_MP_TAC EQ_SYM \\
3945         MATCH_MP_TAC sub_zero_le \\
3946         CONJ_TAC >- (MATCH_MP_TAC pos_not_neginf >> PROVE_TAC []) \\
3947         PROVE_TAC [lt_infty]) >> Rewr' \\
3948     fs [ext_mono_decreasing_def]) >> DISCH_TAC
3949 >> Know ‘!i x. x IN m_space m ==> gi i x <> PosInf’
3950 >- (rw [Abbr ‘gi’] \\
3951    ‘fi 0 x <> PosInf /\ fi i x <> PosInf’ by METIS_TAC [lt_infty] \\
3952    ‘fi 0 x <> NegInf /\ fi i x <> NegInf’ by METIS_TAC [pos_not_neginf] \\
3953    ‘?a. fi 0 x = Normal a’ by METIS_TAC [extreal_cases] \\
3954    ‘?b. fi i x = Normal b’ by METIS_TAC [extreal_cases] \\
3955     rw [extreal_sub_def, extreal_not_infty]) >> DISCH_TAC
3956 >> Know ‘!x. x IN m_space m ==> mono_increasing (\i. gi i x)’
3957 >- (rw [Abbr ‘gi’, ext_mono_increasing_def] \\
3958     MATCH_MP_TAC le_lsub_imp \\
3959     fs [ext_mono_decreasing_def]) >> DISCH_TAC
3960 >> Q.ABBREV_TAC ‘g = \x. sup (IMAGE (\i. gi i x) UNIV)’
3961 >> Know ‘!x. x IN m_space m ==> 0 <= g x’
3962 >- (rw [Abbr ‘g’, le_sup'] \\
3963     MATCH_MP_TAC le_trans >> Q.EXISTS_TAC ‘gi 0 x’ \\
3964     ASM_SIMP_TAC std_ss [] \\
3965     POP_ASSUM MATCH_MP_TAC >> Q.EXISTS_TAC ‘0’ >> REWRITE_TAC []) >> DISCH_TAC
3966 >> Know ‘!i. gi i IN Borel_measurable (m_space m,measurable_sets m)’
3967 >- (rw [Abbr ‘gi’] \\
3968     MATCH_MP_TAC IN_MEASURABLE_BOREL_SUB \\
3969     qexistsl_tac [‘fi 0’, ‘fi i’] >> fs [measure_space_def] \\
3970     rpt STRIP_TAC >> DISJ1_TAC \\
3971     reverse CONJ_TAC >- rw [lt_infty] \\
3972     MATCH_MP_TAC pos_not_neginf >> PROVE_TAC []) >> DISCH_TAC
3973 >> Know ‘!i x. x IN m_space m ==> (fi i x = fi 0 x - gi i x)’
3974 >- (rpt STRIP_TAC \\
3975     Know ‘fi i x = fi 0 x - gi i x <=> fi i x + gi i x = fi 0 x’
3976     >- (MATCH_MP_TAC eq_sub_ladd >> rw [] \\
3977         MATCH_MP_TAC pos_not_neginf >> rw []) >> Rewr' \\
3978     Know ‘fi i x + gi i x = gi i x + fi i x’
3979     >- (MATCH_MP_TAC add_comm >> DISJ2_TAC >> rw [] \\
3980         rw [lt_infty]) >> Rewr' \\
3981     rw [Abbr ‘gi’] >> MATCH_MP_TAC sub_add \\
3982     CONJ_TAC >- (MATCH_MP_TAC pos_not_neginf >> PROVE_TAC []) \\
3983     rw [lt_infty]) >> DISCH_TAC
3984 >> Know ‘!i. pos_fn_integral m (gi i) =
3985              pos_fn_integral m (fi 0) - pos_fn_integral m (fi i)’
3986 >- (GEN_TAC \\
3987     Know ‘pos_fn_integral m (gi i) = pos_fn_integral m (\x. fi 0 x - fi i x)’
3988     >- (MATCH_MP_TAC pos_fn_integral_cong >> rw []) >> Rewr' \\
3989     MATCH_MP_TAC pos_fn_integral_sub >> art [] \\
3990     CONJ_TAC >- METIS_TAC [] \\
3991     reverse CONJ_TAC >- METIS_TAC [lt_infty] \\
3992     rpt STRIP_TAC >> rfs [ext_mono_decreasing_def]) >> DISCH_TAC
3993 >> Know ‘!i. pos_fn_integral m (fi i) <> NegInf’
3994 >- (GEN_TAC \\
3995     MATCH_MP_TAC pos_not_neginf \\
3996     MATCH_MP_TAC pos_fn_integral_pos >> rw []) >> DISCH_TAC
3997 >> Know ‘!i. pos_fn_integral m (gi i) <> PosInf’
3998 >- (GEN_TAC \\
3999     Q.PAT_X_ASSUM ‘!i. pos_fn_integral m (gi i) = _’ (ONCE_REWRITE_TAC o wrap) \\
4000    ‘?a. pos_fn_integral m (fi 0) = Normal a’ by METIS_TAC [extreal_cases] \\
4001    ‘?b. pos_fn_integral m (fi i) = Normal b’ by METIS_TAC [extreal_cases] \\
4002     rw [extreal_sub_def, extreal_not_infty]) >> DISCH_TAC
4003 >> Know ‘!i. pos_fn_integral m (gi i) <> NegInf’
4004 >- (GEN_TAC \\
4005     MATCH_MP_TAC pos_not_neginf \\
4006     MATCH_MP_TAC pos_fn_integral_pos >> rw []) >> DISCH_TAC
4007 >> Know ‘!i. pos_fn_integral m (fi i) =
4008              pos_fn_integral m (fi 0) - pos_fn_integral m (gi i)’
4009 >- (GEN_TAC \\
4010     Know ‘pos_fn_integral m (fi i) =
4011           pos_fn_integral m (fi 0) - pos_fn_integral m (gi i) <=>
4012           pos_fn_integral m (fi i) + pos_fn_integral m (gi i) = pos_fn_integral m (fi 0)’
4013     >- (MATCH_MP_TAC eq_sub_ladd >> art []) >> Rewr' \\
4014     Know ‘pos_fn_integral m (fi i) + pos_fn_integral m (gi i) =
4015           pos_fn_integral m (gi i) + pos_fn_integral m (fi i)’
4016     >- (MATCH_MP_TAC add_comm >> DISJ2_TAC \\
4017         POP_ASSUM (REWRITE_TAC o wrap) >> art []) >> Rewr' >> art [] \\
4018     MATCH_MP_TAC sub_add >> art []) >> Rewr'
4019 (* stage work *)
4020 >> REWRITE_TAC [extreal_inf_def]
4021 >> Know ‘IMAGE numeric_negate
4022            (IMAGE (\i. pos_fn_integral m (fi 0) - pos_fn_integral m (gi i)) UNIV) =
4023          IMAGE (\i. pos_fn_integral m (gi i) - pos_fn_integral m (fi 0)) UNIV’
4024 >- (rw [Once EXTENSION, IN_IMAGE, IN_UNIV] \\
4025     EQ_TAC >> rpt STRIP_TAC >| (* 2 subgoals *)
4026     [ (* goal 1 (of 2) *)
4027       Q.EXISTS_TAC ‘i’ >> rename1 ‘x = -y’ \\
4028       Q.PAT_X_ASSUM ‘x = -y’ (ONCE_REWRITE_TAC o wrap) >> POP_ORW \\
4029      ‘?a. pos_fn_integral m (fi 0) = Normal a’ by METIS_TAC [extreal_cases] >> POP_ORW \\
4030      ‘?b. pos_fn_integral m (fi i) = Normal b’ by METIS_TAC [extreal_cases] >> POP_ORW \\
4031       rw [extreal_sub_def, extreal_ainv_def, extreal_11] \\
4032       REAL_ARITH_TAC,
4033       (* goal 2 (of 2) *)
4034       Q.EXISTS_TAC ‘pos_fn_integral m (fi 0) -
4035                       (pos_fn_integral m (fi 0) - pos_fn_integral m (fi i))’ \\
4036       reverse CONJ_TAC >- (Q.EXISTS_TAC ‘i’ >> REWRITE_TAC []) \\
4037       POP_ORW \\
4038      ‘?a. pos_fn_integral m (fi 0) = Normal a’ by METIS_TAC [extreal_cases] >> POP_ORW \\
4039      ‘?b. pos_fn_integral m (fi i) = Normal b’ by METIS_TAC [extreal_cases] >> POP_ORW \\
4040       rw [extreal_sub_def, extreal_ainv_def, extreal_11] \\
4041       REAL_ARITH_TAC ]) >> Rewr'
4042 >> Know ‘sup (IMAGE (\i. pos_fn_integral m (gi i) - pos_fn_integral m (fi 0)) UNIV) =
4043          sup (IMAGE (\i. pos_fn_integral m (gi i)) UNIV) - pos_fn_integral m (fi 0)’
4044 >- (RW_TAC std_ss [sup_eq', IN_IMAGE, IN_UNIV] >| (* 2 subgoals *)
4045     [ (* goal 1 (of 2) *)
4046       MATCH_MP_TAC le_rsub_imp \\
4047       RW_TAC std_ss [le_sup', IN_IMAGE, IN_UNIV] \\
4048       POP_ASSUM MATCH_MP_TAC >> Q.EXISTS_TAC ‘i’ >> REWRITE_TAC [],
4049       (* goal 2 (of 2) *)
4050       MATCH_MP_TAC sub_le_imp >> art [] \\
4051       RW_TAC std_ss [sup_le', IN_IMAGE, IN_UNIV] \\
4052       Know ‘pos_fn_integral m (fi 0) - pos_fn_integral m (fi i) <= y + pos_fn_integral m (fi 0) <=>
4053             pos_fn_integral m (fi 0) - pos_fn_integral m (fi i) - pos_fn_integral m (fi 0) <= y’
4054       >- (MATCH_MP_TAC EQ_SYM \\
4055           MATCH_MP_TAC sub_le_eq >> art []) >> Rewr' \\
4056       POP_ASSUM MATCH_MP_TAC >> Q.EXISTS_TAC ‘i’ >> REWRITE_TAC [] ]) >> Rewr'
4057 >> Know ‘-(sup (IMAGE (\i. pos_fn_integral m (gi i)) UNIV) - pos_fn_integral m (fi 0)) =
4058          pos_fn_integral m (fi 0) - sup (IMAGE (\i. pos_fn_integral m (gi i)) UNIV)’
4059 >- (MATCH_MP_TAC neg_sub >> DISJ2_TAC >> art []) >> Rewr'
4060 (* applying lebesgue_monotone_convergence *)
4061 >> Know ‘sup (IMAGE (\i. pos_fn_integral m (gi i)) UNIV) = pos_fn_integral m g’
4062 >- (MATCH_MP_TAC EQ_SYM \\
4063     MATCH_MP_TAC lebesgue_monotone_convergence >> art [] \\
4064     rpt STRIP_TAC >> METIS_TAC []) >> Rewr'
4065 >> Know ‘pos_fn_integral m f =
4066          pos_fn_integral m (\x. inf (IMAGE (\i. fi i x) UNIV))’
4067 >- (MATCH_MP_TAC pos_fn_integral_cong >> rw []) >> Rewr'
4068 >> REWRITE_TAC [extreal_inf_def]
4069 >> Know ‘pos_fn_integral m
4070            (\x. -sup (IMAGE numeric_negate (IMAGE (\i. fi i x) UNIV))) =
4071          pos_fn_integral m (\x. -sup (IMAGE (\i. gi i x - fi 0 x) UNIV))’
4072 >- (MATCH_MP_TAC pos_fn_integral_cong >> BETA_TAC >> art [] \\
4073     CONJ_TAC >- (rpt STRIP_TAC \\
4074                 ‘0 = --0’ by PROVE_TAC [neg_neg] >> POP_ORW \\
4075                  REWRITE_TAC [le_neg, neg_0] \\
4076                  SIMP_TAC std_ss [sup_le', IN_IMAGE, IN_UNIV] \\
4077                  rpt STRIP_TAC >> rename1 ‘y = -z’ \\
4078                  Q.PAT_X_ASSUM ‘y = -z’ (ONCE_REWRITE_TAC o wrap) \\
4079                 ‘0 = --0’ by PROVE_TAC [neg_neg] >> POP_ORW \\
4080                  REWRITE_TAC [le_neg, neg_0] \\
4081                  POP_ORW >> PROVE_TAC []) \\
4082     CONJ_TAC >- (rpt STRIP_TAC \\
4083                 ‘0 = --0’ by PROVE_TAC [neg_neg] >> POP_ORW \\
4084                  REWRITE_TAC [le_neg, neg_0] \\
4085                  SIMP_TAC std_ss [sup_le', IN_IMAGE, IN_UNIV] \\
4086                  rpt STRIP_TAC >> POP_ORW \\
4087                  Know ‘gi i x - fi 0 x = -(fi 0 x - gi i x)’
4088                  >- (MATCH_MP_TAC EQ_SYM \\
4089                      MATCH_MP_TAC neg_sub >> DISJ1_TAC \\
4090                      reverse CONJ_TAC >- rw [lt_infty] \\
4091                      MATCH_MP_TAC pos_not_neginf >> PROVE_TAC []) >> Rewr' \\
4092                 ‘0 = --0’ by PROVE_TAC [neg_neg] >> POP_ORW \\
4093                  REWRITE_TAC [le_neg, neg_0] \\
4094                  METIS_TAC []) \\
4095     rpt STRIP_TAC \\
4096     REWRITE_TAC [eq_neg] \\
4097     Suff ‘IMAGE numeric_negate (IMAGE (\i. fi i x) UNIV) =
4098           IMAGE (\i. gi i x - fi 0 x) UNIV’ >- Rewr \\
4099     SIMP_TAC std_ss [Once EXTENSION, IN_IMAGE, IN_UNIV] \\
4100     GEN_TAC >> EQ_TAC >> rpt STRIP_TAC >| (* 2 subgoals *)
4101     [ (* goal 1 (of 2) *)
4102       rename1 ‘y = -z’ >> Q.EXISTS_TAC ‘i’ \\
4103       Q.PAT_X_ASSUM ‘y = -z’ (ONCE_REWRITE_TAC o wrap) >> POP_ORW \\
4104       Know ‘gi i x - fi 0 x = -(fi 0 x - gi i x)’
4105       >- (MATCH_MP_TAC EQ_SYM \\
4106           MATCH_MP_TAC neg_sub >> DISJ1_TAC \\
4107           reverse CONJ_TAC >- rw [lt_infty] \\
4108           MATCH_MP_TAC pos_not_neginf >> PROVE_TAC []) >> Rewr' \\
4109       REWRITE_TAC [eq_neg] \\
4110       FIRST_X_ASSUM MATCH_MP_TAC >> art [],
4111       (* goal 2 (of 2) *)
4112       rename1 ‘y = gi i x - fi 0 x’ \\
4113       Q.EXISTS_TAC ‘fi 0 x - gi i x’ >> POP_ORW \\
4114       CONJ_TAC >- (MATCH_MP_TAC EQ_SYM \\
4115                    MATCH_MP_TAC neg_sub >> DISJ1_TAC \\
4116                    reverse CONJ_TAC >- rw [lt_infty] \\
4117                    MATCH_MP_TAC pos_not_neginf >> PROVE_TAC []) \\
4118       Q.EXISTS_TAC ‘i’ >> METIS_TAC [] ]) >> Rewr'
4119 >> Know ‘pos_fn_integral m (\x. -sup (IMAGE (\i. gi i x - fi 0 x) UNIV)) =
4120          pos_fn_integral m (\x. -(sup (IMAGE (\i. gi i x) UNIV) - fi 0 x))’
4121 >- (MATCH_MP_TAC pos_fn_integral_cong >> BETA_TAC >> art [] \\
4122     CONJ_TAC >- (rpt STRIP_TAC \\
4123                 ‘0 = --0’ by PROVE_TAC [neg_neg] >> POP_ORW \\
4124                  REWRITE_TAC [le_neg, neg_0] \\
4125                  SIMP_TAC std_ss [sup_le', IN_IMAGE, IN_UNIV] \\
4126                  rpt STRIP_TAC >> POP_ORW \\
4127                  Know ‘gi i x - fi 0 x = -(fi 0 x - gi i x)’
4128                  >- (MATCH_MP_TAC EQ_SYM \\
4129                      MATCH_MP_TAC neg_sub >> DISJ1_TAC \\
4130                      reverse CONJ_TAC >- rw [lt_infty] \\
4131                      MATCH_MP_TAC pos_not_neginf >> PROVE_TAC []) >> Rewr' \\
4132                 ‘0 = --0’ by PROVE_TAC [neg_neg] >> POP_ORW \\
4133                  REWRITE_TAC [le_neg, neg_0] \\
4134                  METIS_TAC []) \\
4135     CONJ_TAC >- (rpt STRIP_TAC \\
4136                 ‘0 = --0’ by PROVE_TAC [neg_neg] >> POP_ORW \\
4137                  REWRITE_TAC [le_neg, neg_0] \\
4138                  Know ‘sup (IMAGE (\i. gi i x) UNIV) - fi 0 x <= 0 <=>
4139                        sup (IMAGE (\i. gi i x) UNIV) <= fi 0 x’
4140                  >- (MATCH_MP_TAC EQ_SYM \\
4141                      MATCH_MP_TAC sub_le_zero \\
4142                      reverse CONJ_TAC >- rw [lt_infty] \\
4143                      MATCH_MP_TAC pos_not_neginf >> PROVE_TAC []) >> Rewr' \\
4144                  SIMP_TAC std_ss [sup_le', IN_IMAGE, IN_UNIV] \\
4145                  rpt STRIP_TAC >> POP_ORW \\
4146                  Q.UNABBREV_TAC ‘gi’ >> BETA_TAC \\
4147                  MATCH_MP_TAC sub_le_imp \\
4148                  CONJ_TAC >- (MATCH_MP_TAC pos_not_neginf >> PROVE_TAC []) \\
4149                  CONJ_TAC >- rw [lt_infty] \\
4150                  MATCH_MP_TAC le_addr_imp >> PROVE_TAC []) \\
4151     rpt STRIP_TAC \\
4152     REWRITE_TAC [eq_neg] \\
4153     SIMP_TAC std_ss [sup_eq', IN_IMAGE, IN_UNIV] \\
4154     rpt STRIP_TAC >- (POP_ORW >> MATCH_MP_TAC le_rsub_imp \\
4155                       SIMP_TAC std_ss [le_sup', IN_IMAGE, IN_UNIV] \\
4156                       rpt STRIP_TAC >> POP_ASSUM MATCH_MP_TAC \\
4157                       Q.EXISTS_TAC ‘i’ >> REWRITE_TAC []) \\
4158     MATCH_MP_TAC sub_le_imp \\
4159     CONJ_TAC >- (MATCH_MP_TAC pos_not_neginf >> PROVE_TAC []) \\
4160     CONJ_TAC >- rw [lt_infty] \\
4161     SIMP_TAC std_ss [sup_le', IN_IMAGE, IN_UNIV] \\
4162     rpt STRIP_TAC >> rename1 ‘z = gi i x’ \\
4163     Know ‘z <= y + fi 0 x <=> z - fi 0 x <= y’
4164     >- (MATCH_MP_TAC EQ_SYM \\
4165         MATCH_MP_TAC sub_le_eq \\
4166         CONJ_TAC >- (MATCH_MP_TAC pos_not_neginf >> PROVE_TAC []) \\
4167         rw [lt_infty]) >> Rewr' \\
4168     POP_ORW >> FIRST_X_ASSUM MATCH_MP_TAC \\
4169     Q.EXISTS_TAC ‘i’ >> REWRITE_TAC []) >> Rewr'
4170 >> Know ‘pos_fn_integral m (\x. -(sup (IMAGE (\i. gi i x) univ(:num)) - fi 0 x)) =
4171          pos_fn_integral m (\x. fi 0 x - sup (IMAGE (\i. gi i x) UNIV))’
4172 >- (MATCH_MP_TAC pos_fn_integral_cong >> BETA_TAC >> art [] \\
4173     CONJ_TAC >- (rpt STRIP_TAC \\
4174                 ‘0 = --0’ by PROVE_TAC [neg_neg] >> POP_ORW \\
4175                  REWRITE_TAC [le_neg, neg_0] \\
4176                  Know ‘sup (IMAGE (\i. gi i x) UNIV) - fi 0 x <= 0 <=>
4177                        sup (IMAGE (\i. gi i x) UNIV) <= fi 0 x’
4178                  >- (MATCH_MP_TAC EQ_SYM \\
4179                      MATCH_MP_TAC sub_le_zero \\
4180                      reverse CONJ_TAC >- rw [lt_infty] \\
4181                      MATCH_MP_TAC pos_not_neginf >> PROVE_TAC []) >> Rewr' \\
4182                  SIMP_TAC std_ss [sup_le', IN_IMAGE, IN_UNIV] \\
4183                  rpt STRIP_TAC >> POP_ORW \\
4184                  Q.UNABBREV_TAC ‘gi’ >> BETA_TAC \\
4185                  MATCH_MP_TAC sub_le_imp \\
4186                  CONJ_TAC >- (MATCH_MP_TAC pos_not_neginf >> PROVE_TAC []) \\
4187                  CONJ_TAC >- rw [lt_infty] \\
4188                  MATCH_MP_TAC le_addr_imp >> PROVE_TAC []) \\
4189     CONJ_TAC >- (rpt STRIP_TAC \\
4190                  MATCH_MP_TAC le_sub_imp2 >> REWRITE_TAC [add_lzero] \\
4191                  CONJ_TAC >- (MATCH_MP_TAC pos_not_neginf >> PROVE_TAC []) \\
4192                  CONJ_TAC >- rw [lt_infty] \\
4193                  SIMP_TAC std_ss [sup_le', IN_IMAGE, IN_UNIV] \\
4194                  rpt STRIP_TAC >> POP_ORW \\
4195                  Q.UNABBREV_TAC ‘gi’ >> BETA_TAC \\
4196                  MATCH_MP_TAC sub_le_imp \\
4197                  CONJ_TAC >- (MATCH_MP_TAC pos_not_neginf >> PROVE_TAC []) \\
4198                  CONJ_TAC >- rw [lt_infty] \\
4199                  MATCH_MP_TAC le_addr_imp >> PROVE_TAC []) \\
4200     rpt STRIP_TAC \\
4201     MATCH_MP_TAC neg_sub >> DISJ2_TAC \\
4202     CONJ_TAC >- (MATCH_MP_TAC pos_not_neginf >> PROVE_TAC []) \\
4203     rw [lt_infty]) >> Rewr'
4204 (* final stage, applying pos_fn_integral_sub *)
4205 >> ‘!x. sup (IMAGE (\i. gi i x) UNIV) = g x’ by METIS_TAC [] >> POP_ORW
4206 >> MATCH_MP_TAC pos_fn_integral_sub >> art []
4207 >> CONJ_TAC (* g IN Borel_measurable (m_space m,measurable_sets m) *)
4208 >- (MATCH_MP_TAC IN_MEASURABLE_BOREL_MONO_SUP \\
4209     Q.EXISTS_TAC ‘gi’ >> rfs [measure_space_def, ext_mono_increasing_def])
4210 >> STRONG_CONJ_TAC (* !x. x IN m_space m ==> g x <= fi 0 x *)
4211 >- (Q.UNABBREV_TAC ‘g’ >> BETA_TAC \\
4212     rpt STRIP_TAC \\
4213     SIMP_TAC std_ss [sup_le', IN_IMAGE, IN_UNIV] \\
4214     rpt STRIP_TAC >> POP_ORW \\
4215     Q.UNABBREV_TAC ‘gi’ >> BETA_TAC \\
4216     MATCH_MP_TAC sub_le_imp \\
4217     CONJ_TAC >- (MATCH_MP_TAC pos_not_neginf >> PROVE_TAC []) \\
4218     CONJ_TAC >- rw [lt_infty] \\
4219     MATCH_MP_TAC le_addr_imp >> PROVE_TAC []) >> DISCH_TAC
4220 >> CONJ_TAC (* !x. x IN m_space m ==> g x <> PosInf *)
4221 >- (GEN_TAC >> DISCH_TAC >> REWRITE_TAC [lt_infty] \\
4222     MATCH_MP_TAC let_trans >> Q.EXISTS_TAC ‘fi 0 x’ \\
4223     CONJ_TAC >- (FIRST_X_ASSUM MATCH_MP_TAC >> art []) \\
4224     PROVE_TAC [])
4225 >> REWRITE_TAC [lt_infty]
4226 >> MATCH_MP_TAC let_trans
4227 >> Q.EXISTS_TAC ‘pos_fn_integral m (fi 0)’
4228 >> reverse CONJ_TAC >- rw [GSYM lt_infty]
4229 >> MATCH_MP_TAC pos_fn_integral_mono >> art []
4230QED
4231
4232Theorem lebesgue_monotone_convergence_decreasing' :
4233    !m f fi A. measure_space m /\
4234        (!i. fi i IN measurable (m_space m, measurable_sets m) Borel) /\
4235        (!i x. x IN m_space m ==> 0 <= fi i x /\ fi i x < PosInf) /\
4236        (!i. pos_fn_integral m (fi i) <> PosInf) /\
4237        (!x. x IN m_space m ==> mono_decreasing (\i. fi i x)) /\
4238        (!x. x IN m_space m ==> inf (IMAGE (\i. fi i x) UNIV) = f x) /\
4239         A IN measurable_sets m ==>
4240        (pos_fn_integral m (\x. f x * indicator_fn A x) =
4241         inf (IMAGE (\i. pos_fn_integral m (\x. fi i x * indicator_fn A x)) UNIV))
4242Proof
4243    RW_TAC std_ss []
4244 >> (MP_TAC o Q.SPECL [`m`, `(\x. f x * indicator_fn A x)`,
4245                       `(\i. (\x. fi i x * indicator_fn A x))`])
4246       lebesgue_monotone_convergence_decreasing
4247 >> RW_TAC std_ss []
4248 >> POP_ASSUM MATCH_MP_TAC
4249 >> CONJ_TAC
4250 >- METIS_TAC [IN_MEASURABLE_BOREL_MUL_INDICATOR, measure_space_def, subsets_def,
4251               measurable_sets_def]
4252 >> CONJ_TAC
4253 >- (RW_TAC std_ss [GSYM lt_infty] >| (* 2 subgoals *)
4254     [ (* goal 1 (of 2) *)
4255       MATCH_MP_TAC le_mul >> rw [INDICATOR_FN_POS],
4256       (* goal 2 (of 2) *)
4257       STRIP_ASSUME_TAC (Q.SPECL [‘A’, ‘x’] indicator_fn_normal) \\
4258      ‘fi i x <> PosInf’ by METIS_TAC [lt_infty] \\
4259      ‘fi i x <> NegInf’ by METIS_TAC [pos_not_neginf] \\
4260      ‘?z. fi i x = Normal z’ by METIS_TAC [extreal_cases] \\
4261       rw [extreal_mul_eq] ])
4262 >> CONJ_TAC
4263 >- (rw [lt_infty] >> MATCH_MP_TAC let_trans \\
4264     Q.EXISTS_TAC ‘pos_fn_integral m (fi i)’ \\
4265     reverse CONJ_TAC >- rw [GSYM lt_infty] \\
4266     MATCH_MP_TAC pos_fn_integral_mono >> rw [] >| (* 2 subgoals *)
4267     [ (* goal 1 (of 2) *)
4268       MATCH_MP_TAC le_mul >> rw [INDICATOR_FN_POS],
4269       (* goal 1 (of 2) *)
4270       GEN_REWRITE_TAC (RAND_CONV o ONCE_DEPTH_CONV) empty_rewrites [GSYM mul_rone] \\
4271       MATCH_MP_TAC le_lmul_imp >> rw [INDICATOR_FN_LE_1] ])
4272 >> CONJ_TAC
4273 >- (RW_TAC std_ss [indicator_fn_def, mul_rone, mul_rzero, le_refl, ext_mono_decreasing_def] \\
4274     FULL_SIMP_TAC std_ss [ext_mono_decreasing_def])
4275 >> RW_TAC std_ss [indicator_fn_def, mul_rone, mul_rzero]
4276 >> Suff `IMAGE (\i:num. 0:extreal) UNIV = (\y. y = 0)` >- RW_TAC std_ss [inf_const]
4277 >> RW_TAC std_ss [EXTENSION, IN_ABS, IN_IMAGE, IN_UNIV]
4278QED
4279
4280Theorem pos_fn_integral_sum :
4281    !m f s. FINITE s /\ measure_space m /\
4282           (!i. i IN s ==> !x. x IN m_space m ==> 0 <= f i x) /\
4283           (!i. i IN s ==> f i IN measurable (m_space m,measurable_sets m) Borel) ==>
4284           (pos_fn_integral m (\x. SIGMA (\i. (f i) x) s) =
4285            SIGMA (\i. pos_fn_integral m (f i)) s)
4286Proof
4287    Suff `!s:'b->bool.
4288            FINITE s ==>
4289              (\s:'b->bool. !m f. measure_space m /\
4290                            (!i. i IN s ==> !x. x IN m_space m ==> 0 <= f i x) /\
4291                            (!i. i IN s ==> f i IN measurable (m_space m,measurable_sets m) Borel)
4292                        ==> (pos_fn_integral m (\x. SIGMA (\i. (f i) x) s) =
4293                             SIGMA (\i. pos_fn_integral m (f i)) s)) s`
4294 >- METIS_TAC []
4295 >> MATCH_MP_TAC FINITE_INDUCT
4296 >> RW_TAC std_ss [EXTREAL_SUM_IMAGE_EMPTY, pos_fn_integral_zero]
4297 >> `!x. x IN m_space m ==> SIGMA (\i. f i x) (e INSERT s) = f e x + SIGMA (\i. f i x) s`
4298      by (RW_TAC std_ss [] \\
4299          (MP_TAC o Q.SPEC `e` o UNDISCH o Q.SPECL [`(\i. f i x)`,`s`] o
4300           INST_TYPE [alpha |-> beta]) EXTREAL_SUM_IMAGE_PROPERTY \\
4301         `!i. i IN e INSERT s ==> (\i. f i x) i <> NegInf`
4302              by (RW_TAC std_ss [] \\
4303                  METIS_TAC [lt_infty, extreal_of_num_def, extreal_not_infty, lte_trans]) \\
4304          FULL_SIMP_TAC std_ss [DELETE_NON_ELEMENT])
4305 >> Know ‘pos_fn_integral m (\x. SIGMA (\i. f i x) (e INSERT s)) =
4306          pos_fn_integral m (\x. f e x + SIGMA (\i. f i x) s)’
4307 >- (MATCH_MP_TAC pos_fn_integral_cong >> simp [] \\
4308     rpt STRIP_TAC \\
4309     MATCH_MP_TAC le_add >> simp [] \\
4310     MATCH_MP_TAC EXTREAL_SUM_IMAGE_POS >> simp []) >> Rewr'
4311 >> `!i. i IN e INSERT s ==> (\i. pos_fn_integral m (f i)) i <> NegInf`
4312      by (RW_TAC std_ss [] \\
4313          METIS_TAC [lt_infty, extreal_of_num_def, extreal_not_infty, lte_trans,
4314                     pos_fn_integral_pos])
4315 >> (MP_TAC o Q.SPEC `e` o UNDISCH o Q.SPECL [`(\i. pos_fn_integral m (f i))`,`s`] o
4316     INST_TYPE [alpha |-> beta]) EXTREAL_SUM_IMAGE_PROPERTY
4317 >> RW_TAC std_ss []
4318 >> `SIGMA (\i. pos_fn_integral m (f i)) s = pos_fn_integral m (\x. SIGMA (\i. f i x) s)`
4319      by METIS_TAC [IN_INSERT]
4320 >> FULL_SIMP_TAC std_ss [DELETE_NON_ELEMENT]
4321 >> `(\x. f e x + SIGMA (\i. f i x) s) = (\x. f e x + (\x. SIGMA (\i. f i x) s) x)` by METIS_TAC []
4322 >> POP_ORW
4323 >> MATCH_MP_TAC pos_fn_integral_add
4324 >> FULL_SIMP_TAC std_ss [IN_INSERT]
4325 >> RW_TAC std_ss []
4326 >- FULL_SIMP_TAC std_ss [EXTREAL_SUM_IMAGE_POS]
4327 >> MATCH_MP_TAC IN_MEASURABLE_BOREL_SUM
4328 >> qexistsl_tac [`f`, `s`]
4329 >> METIS_TAC [measure_space_def, measurable_sets_def, subsets_def, m_space_def, space_def,
4330               extreal_of_num_def, extreal_not_infty, lt_infty, lte_trans]
4331QED
4332
4333Theorem pos_fn_integral_disjoint_sets :
4334    !m f s t. measure_space m /\
4335              DISJOINT s t /\ s IN measurable_sets m /\ t IN measurable_sets m /\
4336              f IN measurable (m_space m,measurable_sets m) Borel /\
4337             (!x. x IN m_space m ==> 0 <= f x) ==>
4338             (pos_fn_integral m (\x. f x * indicator_fn (s UNION t) x) =
4339              pos_fn_integral m (\x. f x * indicator_fn s x) +
4340              pos_fn_integral m (\x. f x * indicator_fn t x))
4341Proof
4342    RW_TAC std_ss []
4343 >> `(\x. f x * indicator_fn (s UNION t) x) =
4344     (\x. (\x. f x * indicator_fn s x) x + (\x. f x * indicator_fn t x) x)`
4345       by (RW_TAC std_ss [FUN_EQ_THM, indicator_fn_def, IN_DISJOINT, IN_UNION,
4346                          mul_rone, mul_rzero] \\
4347           Cases_on `x IN s`
4348           >- (RW_TAC std_ss [mul_rone, mul_rzero, add_rzero] \\
4349               METIS_TAC [EXTENSION, IN_DISJOINT]) \\
4350           RW_TAC std_ss [mul_rone, mul_rzero, add_lzero])
4351 >> POP_ORW
4352 >> `!s. s IN measurable_sets m ==>
4353        (\x. f x * indicator_fn s x) IN measurable (m_space m,measurable_sets m) Borel`
4354       by METIS_TAC [IN_MEASURABLE_BOREL_MUL_INDICATOR, measure_space_def,
4355                     subsets_def, space_def]
4356 >> MATCH_MP_TAC pos_fn_integral_add
4357 >> FULL_SIMP_TAC std_ss [indicator_fn_def, mul_rone, mul_rzero]
4358 >> RW_TAC std_ss [le_refl, mul_rzero, mul_rone]
4359QED
4360
4361Theorem pos_fn_integral_disjoint_sets_sum :
4362    !m f s a. FINITE s /\ measure_space m /\
4363             (!i. i IN s ==> a i IN measurable_sets m) /\
4364             (!x. x IN m_space m ==> 0 <= f x) /\
4365             (!i j. i IN s /\ j IN s /\ i <> j ==> DISJOINT (a i) (a j)) /\
4366              f IN measurable (m_space m,measurable_sets m) Borel ==>
4367             (pos_fn_integral m (\x. f x * indicator_fn (BIGUNION (IMAGE a s)) x) =
4368              SIGMA (\i. pos_fn_integral m (\x. f x * indicator_fn (a i) x)) s)
4369Proof
4370    Suff ‘!s. FINITE (s :'b set) ==>
4371             (\s. !m f a. measure_space m /\
4372                    (!i. i IN s ==> a i IN measurable_sets m) /\
4373                    (!x. x IN m_space m ==> 0 <= f x) /\
4374                    (!i j. i IN s /\ j IN s /\ i <> j ==> DISJOINT (a i) (a j)) /\
4375                     f IN measurable (m_space m,measurable_sets m) Borel ==>
4376               pos_fn_integral m (\x. f x * indicator_fn (BIGUNION (IMAGE a s)) x) =
4377               SIGMA (\i. pos_fn_integral m (\x. f x * indicator_fn (a i) x)) s) s’
4378 >- RW_TAC std_ss []
4379 >> MATCH_MP_TAC FINITE_INDUCT
4380 >> RW_TAC std_ss [EXTREAL_SUM_IMAGE_EMPTY, IMAGE_EMPTY, BIGUNION_EMPTY,
4381                   FINITE_INSERT, DELETE_NON_ELEMENT, IN_INSERT, BIGUNION_INSERT,
4382                   IMAGE_INSERT]
4383 >- RW_TAC std_ss [indicator_fn_def, mul_rzero, mul_rone, NOT_IN_EMPTY,
4384                   pos_fn_integral_zero]
4385 >> MP_TAC (Q.SPECL [‘\i. pos_fn_integral m (\x. f x * indicator_fn (a i) x)’, ‘s’]
4386                    (INST_TYPE [alpha |-> beta] EXTREAL_SUM_IMAGE_PROPERTY))
4387 >> simp []
4388 >> DISCH_THEN (MP_TAC o Q.SPEC ‘e’)
4389 >> Know ‘!i. pos_fn_integral m (\x. f x * indicator_fn (a i) x) <> NegInf’
4390 >- (Q.X_GEN_TAC ‘i’ \\
4391     MATCH_MP_TAC pos_not_neginf \\
4392     MATCH_MP_TAC pos_fn_integral_pos >> rw [le_mul, INDICATOR_FN_POS])
4393 >> RW_TAC std_ss []
4394 >> `e NOTIN s` by METIS_TAC [DELETE_NON_ELEMENT]
4395 >> `DISJOINT (a e) (BIGUNION (IMAGE a s))`
4396       by (RW_TAC std_ss [DISJOINT_BIGUNION, IN_IMAGE] >> METIS_TAC [])
4397 >> `(IMAGE a s) SUBSET measurable_sets m`
4398       by (RW_TAC std_ss [SUBSET_DEF, IMAGE_DEF, GSPECIFICATION] \\
4399           METIS_TAC [])
4400 >> `countable (IMAGE a s)` by METIS_TAC [image_countable, finite_countable]
4401 >> `BIGUNION (IMAGE a s) IN measurable_sets m`
4402       by METIS_TAC [sigma_algebra_def, measure_space_def, subsets_def,
4403                     measurable_sets_def]
4404 >> METIS_TAC [pos_fn_integral_disjoint_sets]
4405QED
4406
4407Theorem pos_fn_integral_split :
4408    !m f s. measure_space m /\ s IN measurable_sets m /\
4409           (!x. x IN m_space m ==> 0 <= f x) /\
4410            f IN measurable (m_space m,measurable_sets m) Borel ==>
4411           (pos_fn_integral m f = pos_fn_integral m (\x. f x * indicator_fn s x) +
4412                                  pos_fn_integral m (\x. f x * indicator_fn (m_space m DIFF s) x))
4413Proof
4414    RW_TAC std_ss []
4415 >> (MP_TAC o Q.SPECL [`m`,`f`,`s`,`m_space m DIFF s`]) pos_fn_integral_disjoint_sets
4416 >> RW_TAC std_ss [DISJOINT_DIFF, MEASURE_SPACE_DIFF, MEASURE_SPACE_MSPACE_MEASURABLE]
4417 >> `s UNION (m_space m DIFF s) = m_space m`
4418      by METIS_TAC [UNION_DIFF, MEASURE_SPACE_SUBSET_MSPACE]
4419 >> METIS_TAC [pos_fn_integral_mspace]
4420QED
4421
4422Theorem pos_fn_integral_cmul_infty :
4423    !m s. measure_space m /\ s IN measurable_sets m ==>
4424          pos_fn_integral m (\x. PosInf * indicator_fn s x) = PosInf * measure m s
4425Proof
4426    RW_TAC std_ss []
4427 >> Q.ABBREV_TAC `fi = (\i:num x. &i)`
4428 >> Q.ABBREV_TAC `f = (\x. PosInf)`
4429 >> `!x. x IN m_space m ==> (sup (IMAGE (\i. fi i x) UNIV) = f x)`
4430      by (RW_TAC std_ss [Abbr ‘fi’, Abbr ‘f’] \\
4431          Suff `IMAGE (\i. &i) univ(:num) = (\x. ?n. x = &n)`
4432          >- RW_TAC std_ss [sup_num] \\
4433          RW_TAC std_ss [EXTENSION, IN_IMAGE, IN_ABS, IN_UNIV])
4434 >> `!x. x IN m_space m ==> mono_increasing (\i. fi i x)`
4435      by (RW_TAC std_ss [ext_mono_increasing_def] \\
4436          RW_TAC real_ss [Abbr ‘fi’, extreal_of_num_def, extreal_le_def])
4437 >> `!i x. x IN m_space m ==> 0 <= fi i x`
4438      by RW_TAC real_ss [Abbr ‘fi’, extreal_of_num_def,extreal_le_def]
4439 >> `!x. x IN m_space m ==> 0 <= f x` by METIS_TAC [le_infty]
4440 >> `!i. fi i IN measurable (m_space m, measurable_sets m) Borel`
4441      by (RW_TAC std_ss [] \\
4442          MATCH_MP_TAC IN_MEASURABLE_BOREL_CONST \\
4443          METIS_TAC [measure_space_def])
4444 >> (MP_TAC o Q.SPECL [`m`,`f`,`fi`,`s`]) lebesgue_monotone_convergence_subset
4445 >> RW_TAC std_ss [Abbr ‘f’, Abbr ‘fi’]
4446 >> FULL_SIMP_TAC real_ss []
4447 >> RW_TAC real_ss [extreal_of_num_def, pos_fn_integral_cmul_indicator]
4448 >> RW_TAC std_ss [Once mul_comm]
4449 >> `0 <= measure m s` by METIS_TAC [MEASURE_SPACE_POSITIVE, positive_def]
4450 (* sup (IMAGE (\i. measure m s * Normal (&i)) UNIV (:num)) = PosInf * measure m s *)
4451 >> Know `!n. 0 <= Normal (&n)`
4452 >- (GEN_TAC >> `0 = Normal (&0)` by REWRITE_TAC [extreal_of_num_def] >> POP_ORW \\
4453     REWRITE_TAC [extreal_le_def] >> RW_TAC real_ss [])
4454 >> DISCH_TAC
4455 >> RW_TAC std_ss [sup_cmult]
4456 >> Suff `sup (IMAGE (\i. Normal (&i)) UNIV) = PosInf`
4457 >- METIS_TAC [mul_comm]
4458 >> Suff `IMAGE (\i:num. Normal (&i)) UNIV = (\x. ?n. x = &n)`
4459 >- RW_TAC std_ss [sup_num]
4460 >> RW_TAC std_ss [EXTENSION,IN_IMAGE,IN_ABS,IN_UNIV]
4461 >> METIS_TAC [extreal_of_num_def]
4462QED
4463
4464(* Corollary 9.9 of [1, p.77] *)
4465Theorem pos_fn_integral_suminf :
4466    !m f. measure_space m /\
4467         (!i x. x IN m_space m ==> 0 <= f i x) /\
4468         (!i. f i IN measurable (m_space m,measurable_sets m) Borel) ==>
4469         (pos_fn_integral m (\x. suminf (\i. f i x)) =
4470          suminf (\i. pos_fn_integral m (f i)))
4471Proof
4472    rpt STRIP_TAC
4473 >> Know `!n. 0 <= (\i. pos_fn_integral m (f i)) n`
4474 >- (RW_TAC std_ss [] \\
4475     MATCH_MP_TAC pos_fn_integral_pos >> art [])
4476 >> DISCH_THEN (MP_TAC o (MATCH_MP ext_suminf_def)) >> Rewr'
4477 >> Know `!x. x IN m_space m ==>
4478              suminf (\i. f i x) =
4479              sup (IMAGE (\n. SIGMA (\i. f i x) (count n)) UNIV)`
4480 >- (rpt STRIP_TAC >> MATCH_MP_TAC ext_suminf_def \\
4481     RW_TAC std_ss []) >> DISCH_TAC
4482 >> Know ‘pos_fn_integral m (\x. suminf (\i. f i x)) =
4483          pos_fn_integral m (\x. sup (IMAGE (\n. SIGMA (\i. f i x) (count n)) UNIV))’
4484 >- (MATCH_MP_TAC pos_fn_integral_cong >> simp [] \\
4485     rpt STRIP_TAC >> RW_TAC std_ss [le_sup', IN_IMAGE, IN_UNIV] \\
4486     POP_ASSUM MATCH_MP_TAC \\
4487     Q.EXISTS_TAC ‘0’ >> rw [EXTREAL_SUM_IMAGE_EMPTY]) >> Rewr'
4488 >> Know `!n. SIGMA (\i. pos_fn_integral m (f i)) (count n) =
4489              pos_fn_integral m (\x. SIGMA (\i. f i x) (count n))`
4490 >- (GEN_TAC >> MATCH_MP_TAC EQ_SYM \\
4491     MATCH_MP_TAC pos_fn_integral_sum >> rw [FINITE_COUNT]) >> Rewr'
4492 >> `(\n. pos_fn_integral m (\x. SIGMA (\i. f i x) (count n))) =
4493     (\n. pos_fn_integral m ((\n. (\x. SIGMA (\i. f i x) (count n))) n))`
4494      by METIS_TAC [] >> POP_ORW
4495 >> MATCH_MP_TAC lebesgue_monotone_convergence >> simp []
4496 >> CONJ_TAC
4497 >- (GEN_TAC \\
4498     MATCH_MP_TAC (INST_TYPE [beta |-> ``:num``] IN_MEASURABLE_BOREL_SUM) \\
4499     qexistsl_tac [`f`, `count i`] >> rw [FINITE_COUNT] \\
4500     METIS_TAC [lt_infty, lte_trans, num_not_infty])
4501 >> CONJ_TAC >- RW_TAC std_ss [FINITE_COUNT, EXTREAL_SUM_IMAGE_POS]
4502 >> RW_TAC std_ss [ext_mono_increasing_def]
4503 >> MATCH_MP_TAC EXTREAL_SUM_IMAGE_MONO_SET
4504 >> RW_TAC std_ss [FINITE_COUNT, SUBSET_DEF, IN_COUNT]
4505 >> DECIDE_TAC
4506QED
4507
4508(* added ‘x IN m_space m’, changed quantifiers' order *)
4509Theorem pos_fn_integral_null_set : (* was: positive_integral_null_set *)
4510    !m f N. measure_space m /\
4511           (!x. x IN m_space m ==> 0 <= f x) /\ N IN null_set m ==>
4512           (pos_fn_integral m (\x. f x * indicator_fn N x) = 0)
4513Proof
4514    RW_TAC std_ss [null_sets, GSPECIFICATION]
4515 >> Suff `pos_fn_integral m (\x. f x * indicator_fn N x) =
4516          pos_fn_integral m (\x. 0)`
4517 >- METIS_TAC [pos_fn_integral_zero]
4518 >> `!x. x IN m_space m ==> 0 <= f x * indicator_fn N x`
4519       by (rpt STRIP_TAC \\
4520           MATCH_MP_TAC le_mul >> ASM_SIMP_TAC std_ss [INDICATOR_FN_POS])
4521 >> SIMP_TAC std_ss [GSYM le_antisym]
4522 >> CONJ_TAC
4523 >- (MATCH_MP_TAC pos_fn_integral_mono_AE \\
4524     ASM_SIMP_TAC std_ss [le_refl] \\
4525     SIMP_TAC std_ss [AE_ALT, GSPECIFICATION] \\
4526     Q.EXISTS_TAC `N` \\
4527     ASM_SIMP_TAC std_ss [GSYM IN_NULL_SET, null_sets, GSPECIFICATION, SUBSET_DEF] \\
4528     GEN_TAC >> STRIP_TAC >> POP_ASSUM MP_TAC \\
4529     ONCE_REWRITE_TAC [MONO_NOT_EQ] >> SIMP_TAC std_ss [indicator_fn_def] \\
4530     SIMP_TAC std_ss [mul_rzero, le_refl])
4531 >> MATCH_MP_TAC pos_fn_integral_mono
4532 >> ASM_SIMP_TAC std_ss [le_refl]
4533QED
4534
4535(* key result *)
4536Theorem lebesgue_monotone_convergence_AE :
4537    !m f fi. measure_space m /\
4538        (!i. fi i IN measurable (m_space m,measurable_sets m) Borel) /\
4539        (AE x::m. !i. fi i x <= fi (SUC i) x /\ 0 <= fi i x) /\
4540        (!x. x IN m_space m ==> (sup (IMAGE (\i. fi i x) univ(:num)) = f x)) ==>
4541        (pos_fn_integral m (fn_plus f) =
4542         sup (IMAGE (\i. pos_fn_integral m (fn_plus (fi i))) univ(:num)))
4543Proof
4544    RW_TAC std_ss [FN_PLUS_ALT']
4545 >> ‘sigma_algebra (measurable_space m)’
4546      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA]
4547 >> FULL_SIMP_TAC std_ss [AE_ALT, GSPECIFICATION]
4548 >> Q.ABBREV_TAC `ff = (\i x. if x IN m_space m DIFF N then fi i x else 0)`
4549 >> Know `AE x::m. !i. ff i x = fi i x`
4550 >- (MATCH_MP_TAC
4551       (SIMP_RULE std_ss [AND_IMP_INTRO]
4552          (Q.SPECL [`N`, `m`, `\x. !i. ff i x = fi i x`] AE_I)) \\
4553     Q.UNABBREV_TAC `ff` \\
4554     ASM_SIMP_TAC std_ss [SUBSET_DEF, GSPECIFICATION, IN_DIFF] \\
4555     GEN_TAC THEN REWRITE_TAC [GSYM AND_IMP_INTRO] >> DISCH_TAC \\
4556     ASM_REWRITE_TAC [] >> ASM_CASES_TAC ``x NOTIN N`` >> METIS_TAC [])
4557 >> DISCH_TAC
4558 >> Know `pos_fn_integral m (\x. max 0 (f x)) =
4559          pos_fn_integral m (\x. max 0 (sup (IMAGE (\i. ff i x) univ(:num))))`
4560 >- (MATCH_MP_TAC pos_fn_integral_cong_AE >> ASM_SIMP_TAC std_ss [le_max1] \\
4561     FULL_SIMP_TAC std_ss [GSPECIFICATION, AE_ALT] \\
4562     Q.EXISTS_TAC `N'` >> Q.UNABBREV_TAC `ff` \\
4563     FULL_SIMP_TAC std_ss [SUBSET_DEF, GSPECIFICATION] \\
4564     RW_TAC std_ss [] >> FIRST_X_ASSUM MATCH_MP_TAC \\
4565     ASM_SIMP_TAC std_ss [] >> POP_ASSUM MP_TAC \\
4566     ONCE_REWRITE_TAC [MONO_NOT_EQ] >> RW_TAC std_ss [])
4567 >> DISC_RW_KILL
4568 >> Know `pos_fn_integral m (\x. max 0 (sup (IMAGE (\i. ff i x) univ(:num)))) =
4569          sup (IMAGE (\i. pos_fn_integral m ((\i x. max 0 (ff i x)) i)) univ(:num))`
4570 >- (MATCH_MP_TAC lebesgue_monotone_convergence \\
4571     ASM_SIMP_TAC std_ss [le_max1] \\
4572    `(\x. 0) IN measurable (m_space m,measurable_sets m) Borel`
4573        by (MATCH_MP_TAC IN_MEASURABLE_BOREL_CONST \\
4574            METIS_TAC [measure_space_def]) \\
4575     CONJ_TAC
4576     >- (GEN_TAC \\
4577         ONCE_REWRITE_TAC [METIS []
4578           ``!x. (\x. max 0 (ff i x)) = (\x. max ((\x. 0) x) ((\x. ff i x) x))``] \\
4579         MATCH_MP_TAC IN_MEASURABLE_BOREL_MAX >> Q.UNABBREV_TAC `ff` \\
4580         FULL_SIMP_TAC std_ss [measure_space_def] \\
4581         KNOW_TAC ``Borel = (m_space (space Borel, subsets Borel, (\x. 0)),
4582                             measurable_sets (space Borel, subsets Borel, (\x. 0)))`` >|
4583         [SIMP_TAC std_ss [m_space_def, measurable_sets_def, SPACE],
4584          DISC_RW_KILL] \\
4585         Suff `(\x. if x IN m_space m DIFF N then fi i x else 0) =
4586               (\x. if (\x. x IN m_space m DIFF N) x then (\x. fi i x) x else (\x. 0) x)` >|
4587         [DISC_RW_KILL, SIMP_TAC std_ss []] \\
4588         MATCH_MP_TAC MEASURABLE_IF \\
4589         ASM_SIMP_TAC std_ss [m_space_def, measurable_sets_def, SPACE, measure_space_def] \\
4590         CONJ_TAC >|
4591         [ ONCE_REWRITE_TAC [METIS [ETA_AX] ``(\x. fi i x) = fi i``] \\
4592           ASM_SIMP_TAC std_ss [], ALL_TAC ] \\
4593         ONCE_REWRITE_TAC [METIS [subsets_def]
4594           ``measurable_sets m = subsets (m_space m, measurable_sets m)``] \\
4595        `{x | x IN m_space m /\ x IN m_space m DIFF N} = m_space m DIFF N` by SET_TAC [] \\
4596         POP_ASSUM (fn th => REWRITE_TAC [th, SIGMA_ALGEBRA_BOREL]) \\
4597         MATCH_MP_TAC SIGMA_ALGEBRA_DIFF \\
4598         FULL_SIMP_TAC std_ss [subsets_def, GSYM IN_NULL_SET, null_sets, GSPECIFICATION] \\
4599         METIS_TAC [MEASURE_SPACE_MSPACE_MEASURABLE, measure_space_def]) \\
4600     CONJ_TAC
4601     >- (rpt STRIP_TAC \\
4602         Q.UNABBREV_TAC `ff` >> SIMP_TAC std_ss [ext_mono_increasing_def] \\
4603         RW_TAC std_ss [] >> MATCH_MP_TAC max_le2_imp >> SIMP_TAC std_ss [le_refl] \\
4604         POP_ASSUM MP_TAC \\
4605         UNDISCH_TAC ``{x | x IN m_space m /\
4606                            ?i. ~(fi i x <= fi (SUC i) x) \/ ~(0 <= fi i x)} SUBSET N`` \\
4607         FULL_SIMP_TAC std_ss [SUBSET_DEF, GSPECIFICATION, IN_DIFF] \\
4608         DISCH_THEN (MP_TAC o Q.SPEC `x`) >> FULL_SIMP_TAC std_ss [] \\
4609         DISCH_TAC >> Induct_on `i'` >> ASM_SIMP_TAC std_ss [le_refl] \\
4610         ASM_CASES_TAC ``i = SUC i'`` >> ASM_SIMP_TAC std_ss [le_refl] \\
4611         DISCH_TAC >> MATCH_MP_TAC le_trans >> Q.EXISTS_TAC `fi i' x` \\
4612         ASM_SIMP_TAC std_ss [] >> FIRST_X_ASSUM MATCH_MP_TAC \\
4613         ASM_SIMP_TAC arith_ss []) \\
4614     rpt STRIP_TAC \\
4615     Suff `!i:num. 0 <= ff i x` >|
4616     [ (* goal 1 (of 2) *)
4617       RW_TAC std_ss [extreal_max_def] THEN
4618       UNDISCH_TAC ``~(0 <= sup (IMAGE (\i. ff i x) univ(:num)))`` THEN
4619       ONCE_REWRITE_TAC [MONO_NOT_EQ] THEN RW_TAC std_ss [] THEN
4620       ASM_CASES_TAC ``!i:num. ff i x = 0`` THENL
4621       [ASM_SIMP_TAC std_ss [IMAGE_DEF, IN_UNIV] THEN
4622        ONCE_REWRITE_TAC [SET_RULE ``{0 | i | T} = {0}``] THEN
4623        SIMP_TAC std_ss [sup_sing, le_refl],
4624        ALL_TAC] THEN
4625       SIMP_TAC std_ss [le_lt] THEN DISJ1_TAC THEN
4626       SIMP_TAC std_ss [GSYM sup_lt] THEN FULL_SIMP_TAC std_ss [] THEN
4627       Q.EXISTS_TAC `ff i x` THEN CONJ_TAC THENL [ALL_TAC, METIS_TAC [le_lt]] THEN
4628       ONCE_REWRITE_TAC [GSYM SPECIFICATION] THEN SET_TAC [],
4629       (* goal 2 (of 2) *)
4630       Q.UNABBREV_TAC `ff` THEN SIMP_TAC std_ss [] ] \\
4631
4632     GEN_TAC >> ASM_CASES_TAC ``x IN m_space m DIFF N`` \\
4633     ASM_SIMP_TAC std_ss [le_refl] \\
4634     UNDISCH_TAC ``{x | x IN m_space m /\
4635                        ?i. ~(fi i x <= fi (SUC i) x) \/ ~(0 <= fi i x)} SUBSET N`` \\
4636     ONCE_REWRITE_TAC [MONO_NOT_EQ] >> RW_TAC std_ss [SUBSET_DEF, GSPECIFICATION] \\
4637     METIS_TAC [IN_DIFF])
4638 >> DISC_RW_KILL
4639 >> AP_TERM_TAC >> AP_THM_TAC >> AP_TERM_TAC >> ABS_TAC
4640 >> SIMP_TAC std_ss []
4641 >> MATCH_MP_TAC pos_fn_integral_cong_AE
4642 >> FULL_SIMP_TAC std_ss [le_max1, AE_ALT, GSPECIFICATION]
4643 >> Q.EXISTS_TAC `N'` >> FULL_SIMP_TAC std_ss [SUBSET_DEF, GSPECIFICATION]
4644 >> RW_TAC std_ss [] >> FIRST_X_ASSUM MATCH_MP_TAC
4645 >> METIS_TAC []
4646QED
4647
4648(* ------------------------------------------------------------------------- *)
4649(* Integral for arbitrary functions                                          *)
4650(* ------------------------------------------------------------------------- *)
4651
4652Theorem integral_pos_fn :
4653    !m f. measure_space m /\ (!x. x IN m_space m ==> 0 <= f x) ==>
4654          (integral m f = pos_fn_integral m f)
4655Proof
4656    RW_TAC std_ss [integral_def]
4657 >> Know ‘pos_fn_integral m (fn_minus f) = pos_fn_integral m (\x. 0)’
4658 >- (MATCH_MP_TAC pos_fn_integral_cong >> simp [FN_MINUS_POS] \\
4659     RW_TAC std_ss [fn_minus_def, GSYM le_antisym, le_refl] >|
4660     [ Suff ‘0 <= f x’ >- METIS_TAC [le_neg, neg_0] \\
4661       FIRST_X_ASSUM MATCH_MP_TAC >> art [],
4662       Suff ‘f x <= 0’ >- METIS_TAC [le_neg, neg_0] \\
4663       MATCH_MP_TAC lt_imp_le >> art [] ]) >> Rewr'
4664 >> simp [pos_fn_integral_zero, sub_rzero]
4665 >> MATCH_MP_TAC pos_fn_integral_cong >> simp []
4666QED
4667
4668Theorem integral_pos :
4669    !m f. measure_space m /\ (!x. x IN m_space m ==> 0 <= f x) ==> 0 <= integral m f
4670Proof
4671    rpt STRIP_TAC
4672 >> Know `integral m f = pos_fn_integral m f`
4673 >- (MATCH_MP_TAC integral_pos_fn >> art []) >> Rewr'
4674 >> MATCH_MP_TAC pos_fn_integral_pos >> art []
4675QED
4676
4677Theorem integral_neg :
4678    !m f. measure_space m /\ (!x. x IN m_space m ==> f x <= 0) ==> integral m f <= 0
4679Proof
4680    rw [integral_def]
4681 >> Know ‘pos_fn_integral m (fn_plus f) = pos_fn_integral m (\x. 0)’
4682 >- (MATCH_MP_TAC pos_fn_integral_cong \\
4683     rw [FN_PLUS_POS] \\
4684     MATCH_MP_TAC FN_PLUS_REDUCE' \\
4685     FIRST_X_ASSUM MATCH_MP_TAC >> art [])
4686 >> Rewr'
4687 >> rw [pos_fn_integral_zero]
4688 >> REWRITE_TAC [Once (GSYM le_neg), neg_0, neg_neg]
4689 >> MATCH_MP_TAC pos_fn_integral_pos >> rw [FN_MINUS_POS]
4690QED
4691
4692Theorem integral_abs_pos_fn :
4693    !m f. measure_space m ==> (integral m (abs o f) = pos_fn_integral m (abs o f))
4694Proof
4695    rpt STRIP_TAC
4696 >> MP_TAC (Q.SPECL [`m`, `abs o f`] integral_pos_fn)
4697 >> RW_TAC std_ss [o_DEF, abs_pos]
4698QED
4699
4700Theorem integral_split :
4701    !m f s. measure_space m /\ s IN measurable_sets m /\
4702           (!x. x IN m_space m ==> 0 <= f x) /\
4703            f IN measurable (m_space m,measurable_sets m) Borel ==>
4704           (integral m f = integral m (\x. f x * indicator_fn s x) +
4705                           integral m (\x. f x * indicator_fn (m_space m DIFF s) x))
4706Proof
4707    rpt STRIP_TAC
4708 >> Know `!s x. x IN m_space m ==> 0 <= (\x. f x * indicator_fn s x) x`
4709 >- (RW_TAC std_ss [] \\
4710     MATCH_MP_TAC le_mul >> art [INDICATOR_FN_POS] \\
4711     FIRST_X_ASSUM MATCH_MP_TAC >> art []) >> DISCH_TAC
4712 >> ASM_SIMP_TAC std_ss [integral_pos_fn]
4713 >> Know    `integral m (\x. f x * indicator_fn s x) =
4714      pos_fn_integral m (\x. f x * indicator_fn s x)`
4715 >- (MATCH_MP_TAC integral_pos_fn >> art []) >> Rewr'
4716 >> Know    `integral m (\x. f x * indicator_fn (m_space m DIFF s) x) =
4717      pos_fn_integral m (\x. f x * indicator_fn (m_space m DIFF s) x)`
4718 >- (MATCH_MP_TAC integral_pos_fn >> art []) >> Rewr'
4719 >> MATCH_MP_TAC pos_fn_integral_split >> art []
4720QED
4721
4722(* removed ‘!x. x IN m_space m ==> 0 <= f x’, added ‘integrable m f’ *)
4723Theorem integral_split' :
4724    !m f s. measure_space m /\ integrable m f /\ s IN measurable_sets m ==>
4725           (integral m f = integral m (\x. f x * indicator_fn s x) +
4726                           integral m (\x. f x * indicator_fn (m_space m DIFF s) x))
4727Proof
4728    RW_TAC std_ss [integrable_def, integral_def,
4729                   fn_plus_mul_indicator, fn_minus_mul_indicator]
4730 >> ‘sigma_algebra (measurable_space m)’
4731      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA]
4732 >> Know ‘pos_fn_integral m (fn_plus f) =
4733          pos_fn_integral m (\x. fn_plus f x * indicator_fn s x) +
4734          pos_fn_integral m (\x. fn_plus f x * indicator_fn (m_space m DIFF s) x)’
4735 >- (MATCH_MP_TAC pos_fn_integral_split >> rw [FN_PLUS_POS] \\
4736     MATCH_MP_TAC IN_MEASURABLE_BOREL_FN_PLUS >> art []) >> Rewr'
4737 >> Know ‘pos_fn_integral m (fn_minus f) =
4738          pos_fn_integral m (\x. fn_minus f x * indicator_fn s x) +
4739          pos_fn_integral m (\x. fn_minus f x * indicator_fn (m_space m DIFF s) x)’
4740 >- (MATCH_MP_TAC pos_fn_integral_split >> rw [FN_MINUS_POS] \\
4741     MATCH_MP_TAC IN_MEASURABLE_BOREL_FN_MINUS >> art []) >> Rewr'
4742 >> Q.ABBREV_TAC ‘A = pos_fn_integral m (\x. fn_plus f x * indicator_fn s x)’
4743 >> Q.ABBREV_TAC ‘B = pos_fn_integral m (\x. fn_minus f x * indicator_fn s x)’
4744 >> Q.ABBREV_TAC ‘C = pos_fn_integral m (\x. fn_plus f x * indicator_fn (m_space m DIFF s) x)’
4745 >> Q.ABBREV_TAC ‘D = pos_fn_integral m (\x. fn_minus f x * indicator_fn (m_space m DIFF s) x)’
4746 >> Know ‘A <> PosInf /\ C <> PosInf’
4747 >- (fs [Abbr ‘A’, Abbr ‘C’, lt_infty] \\
4748     CONJ_TAC \\
4749     ( MATCH_MP_TAC let_trans >> Q.EXISTS_TAC ‘pos_fn_integral m (fn_plus f)’ >> art [] \\
4750       MATCH_MP_TAC pos_fn_integral_mono \\
4751       rw [] >- (MATCH_MP_TAC le_mul >> rw [FN_PLUS_POS, INDICATOR_FN_POS]) \\
4752      ‘fn_plus f x = fn_plus f x * 1’ by PROVE_TAC [mul_rone] \\
4753       POP_ASSUM ((GEN_REWRITE_TAC (RAND_CONV o ONCE_DEPTH_CONV) empty_rewrites) o wrap) \\
4754       MATCH_MP_TAC le_lmul_imp >> rw [FN_PLUS_POS, INDICATOR_FN_LE_1] )) >> STRIP_TAC
4755 >> Know ‘B <> PosInf /\ D <> PosInf’
4756 >- (fs [Abbr ‘B’, Abbr ‘D’, lt_infty] \\
4757     CONJ_TAC \\
4758     ( MATCH_MP_TAC let_trans >> Q.EXISTS_TAC ‘pos_fn_integral m (fn_minus f)’ >> art [] \\
4759       MATCH_MP_TAC pos_fn_integral_mono \\
4760       rw [] >- (MATCH_MP_TAC le_mul >> rw [FN_MINUS_POS, INDICATOR_FN_POS]) \\
4761      ‘fn_minus f x = fn_minus f x * 1’ by PROVE_TAC [mul_rone] \\
4762       POP_ASSUM ((GEN_REWRITE_TAC (RAND_CONV o ONCE_DEPTH_CONV) empty_rewrites) o wrap) \\
4763       MATCH_MP_TAC le_lmul_imp >> rw [FN_MINUS_POS, INDICATOR_FN_LE_1] )) >> STRIP_TAC
4764 >> Know ‘A <> NegInf’
4765 >- (MATCH_MP_TAC pos_not_neginf >> Q.UNABBREV_TAC ‘A’ \\
4766     MATCH_MP_TAC pos_fn_integral_pos >> rw [] \\
4767     MATCH_MP_TAC le_mul >> rw [FN_PLUS_POS, INDICATOR_FN_POS]) >> DISCH_TAC
4768 >> Know ‘C <> NegInf’
4769 >- (MATCH_MP_TAC pos_not_neginf >> Q.UNABBREV_TAC ‘C’ \\
4770     MATCH_MP_TAC pos_fn_integral_pos >> rw [] \\
4771     MATCH_MP_TAC le_mul >> rw [FN_PLUS_POS, INDICATOR_FN_POS]) >> DISCH_TAC
4772 >> Know ‘B <> NegInf’
4773 >- (MATCH_MP_TAC pos_not_neginf >> Q.UNABBREV_TAC ‘B’ \\
4774     MATCH_MP_TAC pos_fn_integral_pos >> rw [] \\
4775     MATCH_MP_TAC le_mul >> rw [FN_MINUS_POS, INDICATOR_FN_POS]) >> DISCH_TAC
4776 >> Know ‘D <> NegInf’
4777 >- (MATCH_MP_TAC pos_not_neginf >> Q.UNABBREV_TAC ‘D’ \\
4778     MATCH_MP_TAC pos_fn_integral_pos >> rw [] \\
4779     MATCH_MP_TAC le_mul >> rw [FN_MINUS_POS, INDICATOR_FN_POS]) >> DISCH_TAC
4780 >> ‘?a. A = Normal a’ by METIS_TAC [extreal_cases] >> POP_ORW
4781 >> ‘?b. B = Normal b’ by METIS_TAC [extreal_cases] >> POP_ORW
4782 >> ‘?c. C = Normal c’ by METIS_TAC [extreal_cases] >> POP_ORW
4783 >> ‘?d. D = Normal d’ by METIS_TAC [extreal_cases] >> POP_ORW
4784 >> REWRITE_TAC [extreal_add_def, extreal_sub_def, extreal_11]
4785 >> REAL_ARITH_TAC
4786QED
4787
4788(* ------------------------------------------------------------------------- *)
4789(* Properties of integrable functions                                        *)
4790(* ------------------------------------------------------------------------- *)
4791
4792Theorem integrable_eq :
4793    !m f g. measure_space m /\ integrable m f /\
4794            (!x. x IN m_space m ==> (f x = g x)) ==> integrable m g
4795Proof
4796    RW_TAC std_ss [integrable_def, IN_MEASURABLE, space_def, subsets_def, IN_FUNSET]
4797 >| [ (* goal 1 (of 4) *)
4798      PROVE_TAC [],
4799      (* goal 2 (of 4) *)
4800      Know `PREIMAGE g s INTER m_space m = PREIMAGE f s INTER m_space m`
4801      >- (RW_TAC std_ss [EXTENSION, IN_INTER, IN_PREIMAGE] \\
4802          EQ_TAC >> RW_TAC std_ss [] \\
4803          PROVE_TAC []) >> Rewr \\
4804      FIRST_X_ASSUM MATCH_MP_TAC >> art [],
4805      (* goal 3 (of 4) *)
4806      Know `pos_fn_integral m (fn_plus g) =
4807            pos_fn_integral m (\x. (fn_plus g) x * indicator_fn (m_space m) x)`
4808      >- (MATCH_MP_TAC pos_fn_integral_mspace >> art [] \\
4809          REWRITE_TAC [FN_PLUS_POS]) >> Rewr \\
4810      Know `(\x. fn_plus g x * indicator_fn (m_space m) x) =
4811            (\x. fn_plus f x * indicator_fn (m_space m) x)`
4812      >- (FUN_EQ_TAC >> GEN_TAC >> BETA_TAC \\
4813          Cases_on `x IN m_space m`
4814          >- (ASM_SIMP_TAC std_ss [indicator_fn_def, mul_rone] \\
4815              SIMP_TAC std_ss [fn_plus_def] >> METIS_TAC []) \\
4816          ASM_SIMP_TAC std_ss [indicator_fn_def, mul_rzero]) >> Rewr \\
4817      Know `pos_fn_integral m (\x. fn_plus f x * indicator_fn (m_space m) x) =
4818            pos_fn_integral m (fn_plus f)`
4819      >- (MATCH_MP_TAC EQ_SYM \\
4820          MATCH_MP_TAC pos_fn_integral_mspace >> art [] \\
4821          REWRITE_TAC [FN_PLUS_POS]) >> Rewr \\
4822      ASM_REWRITE_TAC [],
4823      (* goal 4 (of 4) *)
4824      Know `pos_fn_integral m (fn_minus g) =
4825            pos_fn_integral m (\x. (fn_minus g) x * indicator_fn (m_space m) x)`
4826      >- (MATCH_MP_TAC pos_fn_integral_mspace >> art [] \\
4827          REWRITE_TAC [FN_MINUS_POS]) >> Rewr \\
4828      Know `(\x. fn_minus g x * indicator_fn (m_space m) x) =
4829            (\x. fn_minus f x * indicator_fn (m_space m) x)`
4830      >- (FUN_EQ_TAC >> GEN_TAC >> BETA_TAC \\
4831          Cases_on `x IN m_space m`
4832          >- (ASM_SIMP_TAC std_ss [indicator_fn_def, mul_rone] \\
4833              SIMP_TAC std_ss [fn_minus_def] >> METIS_TAC []) \\
4834          ASM_SIMP_TAC std_ss [indicator_fn_def, mul_rzero]) >> Rewr \\
4835      Know `pos_fn_integral m (\x. fn_minus f x * indicator_fn (m_space m) x) =
4836            pos_fn_integral m (fn_minus f)`
4837      >- (MATCH_MP_TAC EQ_SYM \\
4838          MATCH_MP_TAC pos_fn_integral_mspace >> art [] \\
4839          REWRITE_TAC [FN_MINUS_POS]) >> Rewr \\
4840      ASM_REWRITE_TAC [] ]
4841QED
4842
4843Theorem integrable_cong :
4844    !m f g. measure_space m /\ (!x. x IN m_space m ==> (f x = g x)) ==>
4845           (integrable m f <=> integrable m g)
4846Proof
4847    rpt STRIP_TAC
4848 >> EQ_TAC >> STRIP_TAC
4849 >| [ (* goal 1 (of 2) *)
4850      MATCH_MP_TAC integrable_eq >> Q.EXISTS_TAC ‘f’ >> art [],
4851      (* goal 2 (of 2) *)
4852      MATCH_MP_TAC integrable_eq >> Q.EXISTS_TAC ‘g’ >> rw [] ]
4853QED
4854
4855Theorem integrable_pos :
4856    !m f. measure_space m /\ (!x. x IN m_space m ==> 0 <= f x) ==>
4857         (integrable m f <=> f IN measurable (m_space m,measurable_sets m) Borel /\
4858                             pos_fn_integral m f <> PosInf)
4859Proof
4860    RW_TAC std_ss [integrable_def, GSYM fn_plus_def, GSYM fn_minus_def,
4861                   pos_fn_integral_zero, num_not_infty]
4862 >> Know ‘pos_fn_integral m (fn_plus f) = pos_fn_integral m f’
4863 >- (MATCH_MP_TAC pos_fn_integral_cong >> simp [FN_PLUS_POS] \\
4864     rpt STRIP_TAC >> rw []) >> Rewr'
4865 >> Know ‘pos_fn_integral m (fn_minus f) = pos_fn_integral m (\x. 0)’
4866 >- (MATCH_MP_TAC pos_fn_integral_cong >> simp [FN_MINUS_POS] \\
4867     rpt STRIP_TAC >> rw []) >> Rewr'
4868 >> rw [pos_fn_integral_zero]
4869QED
4870
4871Theorem integrable_infty:
4872    !m f s. measure_space m /\ integrable m f /\ s IN measurable_sets m /\
4873           (!x. x IN s ==> f x = PosInf) ==> measure m s = 0
4874Proof
4875    RW_TAC std_ss [integrable_def]
4876 >> ‘sigma_algebra (measurable_space m)’
4877      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA]
4878 >> (MP_TAC o Q.SPECL [`m`,`fn_plus f`,`s`]) pos_fn_integral_split
4879 >> RW_TAC std_ss [IN_MEASURABLE_BOREL_FN_PLUS, DISJOINT_DIFF, FN_PLUS_POS]
4880 >> `(\x. fn_plus f x * indicator_fn s x) = (\x. PosInf * indicator_fn s x)`
4881      by (RW_TAC std_ss [FUN_EQ_THM, indicator_fn_def, fn_plus_def, mul_rzero,
4882                         mul_rone] \\
4883          METIS_TAC [lt_infty, extreal_mul_def, mul_rone, mul_rzero])
4884 >> `pos_fn_integral m (\x. PosInf * indicator_fn s x) = PosInf * (measure m s)`
4885      by METIS_TAC [pos_fn_integral_cmul_infty]
4886 >> FULL_SIMP_TAC std_ss []
4887 >> `0 <= pos_fn_integral m (\x. fn_plus f x * indicator_fn (m_space m DIFF s) x)`
4888      by (MATCH_MP_TAC pos_fn_integral_pos \\
4889          RW_TAC std_ss [fn_plus_def, indicator_fn_def, mul_rzero, mul_rone,
4890                         lt_imp_le, le_refl])
4891 >> SPOSE_NOT_THEN ASSUME_TAC
4892 >> `0 < measure m s` by METIS_TAC [positive_def, MEASURE_SPACE_POSITIVE, lt_le]
4893 >> `pos_fn_integral m (\x. fn_plus f x * indicator_fn (m_space m DIFF s) x)
4894      <> NegInf`
4895      by METIS_TAC [lt_infty, lte_trans, num_not_infty]
4896 >> FULL_SIMP_TAC std_ss [mul_lposinf, lt_imp_ne, add_infty]
4897QED
4898
4899(* Dual version of the above theorem *)
4900Theorem integrable_infty' :
4901    !m f s. measure_space m /\ integrable m f /\ s IN measurable_sets m /\
4902           (!x. x IN s ==> f x = NegInf) ==> measure m s = 0
4903Proof
4904    RW_TAC std_ss [integrable_def]
4905 >> ‘sigma_algebra (measurable_space m)’
4906      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA]
4907 >> (MP_TAC o Q.SPECL [`m`,`fn_minus f`,`s`]) pos_fn_integral_split
4908 >> RW_TAC std_ss [IN_MEASURABLE_BOREL_FN_MINUS, DISJOINT_DIFF, FN_MINUS_POS]
4909 >> Know ‘(\x. fn_minus f x * indicator_fn s x) =
4910          (\x. PosInf * indicator_fn s x)’
4911 >- (rw [FUN_EQ_THM, indicator_fn_def, fn_minus_def, mul_rzero, mul_rone] \\
4912     Cases_on ‘x IN s’ >> simp [extreal_ainv_def])
4913 >> DISCH_TAC
4914 >> `pos_fn_integral m (\x. PosInf * indicator_fn s x) = PosInf * measure m s`
4915      by METIS_TAC [pos_fn_integral_cmul_infty]
4916 >> FULL_SIMP_TAC std_ss []
4917 >> Know ‘0 <= pos_fn_integral m
4918                (\x. fn_minus f x * indicator_fn (m_space m DIFF s) x)’
4919 >- (MATCH_MP_TAC pos_fn_integral_pos >> rw [] \\
4920     MATCH_MP_TAC le_mul >> simp [FN_MINUS_POS, INDICATOR_FN_POS])
4921 >> DISCH_TAC
4922 >> SPOSE_NOT_THEN ASSUME_TAC
4923 >> `0 < measure m s` by METIS_TAC [positive_def, MEASURE_SPACE_POSITIVE, lt_le]
4924 >> `pos_fn_integral m (\x. fn_minus f x * indicator_fn (m_space m DIFF s) x)
4925      <> NegInf`
4926      by METIS_TAC [lt_infty, lte_trans, num_not_infty]
4927 >> FULL_SIMP_TAC std_ss [mul_lposinf, lt_imp_ne, add_infty]
4928QED
4929
4930Theorem integrable_infty_null :
4931    !m f. measure_space m /\ integrable m f ==>
4932          null_set m {x | x IN m_space m /\ f x = PosInf}
4933Proof
4934    RW_TAC std_ss []
4935 >> Q.ABBREV_TAC `s = {x | x IN m_space m /\ f x = PosInf}`
4936 >> Suff `s IN measurable_sets m`
4937 >- (RW_TAC std_ss [null_set_def]
4938      >> MATCH_MP_TAC integrable_infty
4939      >> Q.EXISTS_TAC `f`
4940      >> RW_TAC std_ss []
4941      >> Q.UNABBREV_TAC `s`
4942      >> FULL_SIMP_TAC std_ss [GSPECIFICATION])
4943 >> `f IN measurable (m_space m, measurable_sets m) Borel`
4944      by FULL_SIMP_TAC std_ss [integrable_def]
4945 >> MP_TAC (Q.SPECL [`f`,`(m_space m, measurable_sets m)`] IN_MEASURABLE_BOREL_ALT8)
4946 >> rw [MEASURE_SPACE_SIGMA_ALGEBRA]
4947 >> POP_ASSUM (MP_TAC o (Q.SPEC `PosInf`))
4948 >> Suff `s = {x | f x = PosInf} INTER m_space m`
4949 >- METIS_TAC []
4950 >> Q.UNABBREV_TAC `s`
4951 >> RW_TAC std_ss [EXTENSION,IN_INTER,GSPECIFICATION]
4952 >> METIS_TAC []
4953QED
4954
4955(* Dual version of the above theorem *)
4956Theorem integrable_infty_null' :
4957    !m f. measure_space m /\ integrable m f ==>
4958          null_set m {x | x IN m_space m /\ f x = NegInf}
4959Proof
4960    RW_TAC std_ss []
4961 >> Q.ABBREV_TAC `s = {x | x IN m_space m /\ f x = NegInf}`
4962 >> Suff `s IN measurable_sets m`
4963 >- (RW_TAC std_ss [null_set_def] \\
4964     MATCH_MP_TAC integrable_infty' \\
4965     Q.EXISTS_TAC `f` >> RW_TAC std_ss [] \\
4966     Q.UNABBREV_TAC `s` \\
4967     FULL_SIMP_TAC std_ss [GSPECIFICATION])
4968 >> `f IN measurable (m_space m, measurable_sets m) Borel`
4969      by FULL_SIMP_TAC std_ss [integrable_def]
4970 >> MP_TAC (Q.SPECL [`f`,`(m_space m, measurable_sets m)`] IN_MEASURABLE_BOREL_ALT8)
4971 >> rw [MEASURE_SPACE_SIGMA_ALGEBRA]
4972 >> POP_ASSUM (MP_TAC o (Q.SPEC `NegInf`))
4973 >> Suff `s = {x | f x = NegInf} INTER m_space m` >- METIS_TAC []
4974 >> Q.UNABBREV_TAC `s`
4975 >> RW_TAC std_ss [EXTENSION, IN_INTER, GSPECIFICATION]
4976 >> METIS_TAC []
4977QED
4978
4979Theorem pos_fn_integral_infty_null :
4980    !m f. measure_space m /\ (!x. x IN m_space m ==> 0 <= f x) /\
4981          f IN measurable (m_space m,measurable_sets m) Borel /\
4982          pos_fn_integral m f <> PosInf ==>
4983          null_set m {x | x IN m_space m /\ (f x = PosInf)}
4984Proof
4985    rpt STRIP_TAC
4986 >> MATCH_MP_TAC integrable_infty_null
4987 >> simp [integrable_def]
4988 >> CONJ_TAC
4989 >- (Suff ‘pos_fn_integral m (fn_plus f) = pos_fn_integral m f’ >- rw [] \\
4990     MATCH_MP_TAC pos_fn_integral_cong >> rw [])
4991 >> Suff ‘pos_fn_integral m (fn_minus f) = pos_fn_integral m (\x. 0)’
4992 >- rw [pos_fn_integral_zero]
4993 >> MATCH_MP_TAC pos_fn_integral_cong >> rw []
4994QED
4995
4996(* The need of complete measure space comes from IN_MEASURABLE_BOREL_AE_EQ
4997
4998   NOTE: In general (unless the measure space is complete), a function g may not
4999   be integrable, when it is almost everywhere equal to an integrable function f.
5000 *)
5001Theorem integrable_eq_AE :
5002    !m f g. complete_measure_space m /\
5003            integrable m f /\ (AE x::m. f x = g x) ==> integrable m g
5004Proof
5005    rw [integrable_def]
5006 >| [ (* goal 1 (of 3) *)
5007      MATCH_MP_TAC IN_MEASURABLE_BOREL_AE_EQ \\
5008      Q.EXISTS_TAC ‘f’ >> art [],
5009      (* goal 2 (of 3) *)
5010      Suff ‘pos_fn_integral m (fn_plus f) = pos_fn_integral m (fn_plus g)’
5011      >- (DISCH_THEN (fs o wrap)) \\
5012      MATCH_MP_TAC pos_fn_integral_cong_AE \\
5013      fs [complete_measure_space_def, FN_PLUS_POS] \\
5014      fs [AE_DEF] \\
5015      Q.EXISTS_TAC ‘N’ >> rw [] \\
5016     ‘f x = g x’ by PROVE_TAC [] \\
5017      RW_TAC std_ss [fn_plus_def],
5018      (* goal 3 (of 3) *)
5019      Suff ‘pos_fn_integral m (fn_minus f) = pos_fn_integral m (fn_minus g)’
5020      >- (DISCH_THEN (fs o wrap)) \\
5021      MATCH_MP_TAC pos_fn_integral_cong_AE \\
5022      fs [complete_measure_space_def, FN_MINUS_POS] \\
5023      fs [AE_DEF] \\
5024      Q.EXISTS_TAC ‘N’ >> rw [] \\
5025     ‘f x = g x’ by PROVE_TAC [] \\
5026      RW_TAC std_ss [fn_minus_def] ]
5027QED
5028
5029(* Corollary 11.6 [1, p.91] *)
5030Theorem integrable_AE_normal:
5031    !m f. measure_space m /\ integrable m f ==> AE x::m. f x < PosInf
5032Proof
5033    RW_TAC std_ss [AE_ALT]
5034 >> Q.EXISTS_TAC `{x | x IN m_space m /\ (f x = PosInf)}`
5035 >> CONJ_TAC >- (MATCH_MP_TAC integrable_infty_null >> art [])
5036 >> REWRITE_TAC [GSYM lt_infty, SUBSET_REFL]
5037QED
5038
5039(* Full version of the above theorem *)
5040Theorem integrable_AE_normal_full :
5041    !m f. measure_space m /\ integrable m f ==>
5042          AE x::m. f x <> PosInf /\ f x <> NegInf
5043Proof
5044    RW_TAC std_ss [AE_ALT]
5045 >> Q.EXISTS_TAC ‘{x | x IN m_space m /\ f x = PosInf} UNION
5046                  {x | x IN m_space m /\ f x = NegInf}’
5047 >> reverse CONJ_TAC >- rw [SUBSET_DEF]
5048 >> MATCH_MP_TAC NULL_SET_UNION' >> art []
5049 >> CONJ_TAC
5050 >| [ MATCH_MP_TAC integrable_infty_null >> art [],
5051      MATCH_MP_TAC integrable_infty_null' >> art [] ]
5052QED
5053
5054Theorem integrable_normal_integral:
5055    !m f. measure_space m /\ integrable m f ==> ?r. (integral m f = Normal r)
5056Proof
5057    RW_TAC std_ss [integrable_def, integral_def]
5058 >> `0 <= pos_fn_integral m (fn_plus f)`
5059      by PROVE_TAC [pos_fn_integral_pos, FN_PLUS_POS]
5060 >> `0 <= pos_fn_integral m (fn_minus f)`
5061      by PROVE_TAC [pos_fn_integral_pos, FN_MINUS_POS]
5062 >> Q.ABBREV_TAC `a = pos_fn_integral m (fn_plus f)`
5063 >> Q.ABBREV_TAC `b = pos_fn_integral m (fn_minus f)`
5064 >> `a <> NegInf /\ b <> NegInf` by PROVE_TAC [pos_not_neginf]
5065 >> Know `a - b <> PosInf /\ a - b <> NegInf`
5066 >- (Cases_on `a` >> Cases_on `b` >> fs [extreal_sub_def])
5067 >> STRIP_TAC
5068 >> METIS_TAC [extreal_cases]
5069QED
5070
5071(* Updated with ‘!x. x IN m_space m ==> (abs (g x) <= f x)’ *)
5072Theorem integrable_bounded :
5073    !m f g. measure_space m /\ integrable m f /\
5074            g IN measurable (m_space m,measurable_sets m) Borel /\
5075            (!x. x IN m_space m ==> (abs (g x) <= f x))
5076        ==> integrable m g
5077Proof
5078    RW_TAC std_ss [integrable_def, abs_bounds, GSYM fn_plus_def, GSYM fn_minus_def]
5079 >- (`!x. x IN m_space m ==> fn_plus g x <= fn_plus f x`
5080       by (RW_TAC real_ss [fn_plus_def, lt_imp_le, le_refl] \\
5081           METIS_TAC [extreal_lt_def, lte_trans]) \\
5082     METIS_TAC [pos_fn_integral_mono, FN_PLUS_POS, lt_infty, let_trans])
5083 >> `!x. x IN m_space m ==> fn_minus g x <= fn_plus f x`
5084        by (RW_TAC real_ss [fn_minus_def, fn_plus_def, lt_imp_le, le_refl] \\
5085            METIS_TAC [let_trans, lt_neg, le_neg, neg_neg, neg_0])
5086 >> METIS_TAC [pos_fn_integral_mono, FN_PLUS_POS, FN_MINUS_POS, lt_infty, let_trans]
5087QED
5088
5089Theorem integrable_fn_plus :
5090    !m f. measure_space m /\ integrable m f ==> integrable m (fn_plus f)
5091Proof
5092    rpt STRIP_TAC >> POP_ASSUM MP_TAC
5093 >> ‘sigma_algebra (measurable_space m)’
5094      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA]
5095 >> RW_TAC std_ss [integrable_def, GSYM fn_plus_def, FN_PLUS_POS, FN_PLUS_POS_ID,
5096                   IN_MEASURABLE_BOREL_FN_PLUS, GSYM fn_minus_def, FN_MINUS_POS_ZERO,
5097                   pos_fn_integral_zero, num_not_infty]
5098QED
5099
5100Theorem integrable_fn_minus :
5101    !m f. measure_space m /\ integrable m f ==> integrable m (fn_minus f)
5102Proof
5103    rpt STRIP_TAC >> POP_ASSUM MP_TAC
5104 >> ‘sigma_algebra (measurable_space m)’
5105      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA]
5106 >> RW_TAC std_ss [integrable_def, GSYM fn_minus_def, FN_MINUS_POS, FN_PLUS_POS_ID,
5107                   IN_MEASURABLE_BOREL_FN_MINUS, GSYM fn_plus_def, FN_MINUS_POS_ZERO,
5108                   pos_fn_integral_zero, num_not_infty]
5109QED
5110
5111(* added `measure m (m_space m) < PosInf` into antecedents, otherwise not true *)
5112Theorem integrable_const:
5113    !m c. measure_space m /\ measure m (m_space m) < PosInf ==> integrable m (\x. Normal c)
5114Proof
5115    RW_TAC std_ss []
5116 >> `(\x. Normal c) IN measurable (m_space m,measurable_sets m) Borel`
5117      by (MATCH_MP_TAC IN_MEASURABLE_BOREL_CONST >> METIS_TAC [measure_space_def])
5118 >> RW_TAC real_ss [integrable_def, lt_antisym, pos_fn_integral_zero, fn_plus_def,
5119                    fn_minus_def, num_not_infty, extreal_ainv_def]
5120 >| [ (* goal 1 (of 4) *)
5121      METIS_TAC [lt_antisym],
5122      (* goal 2 (of 4) *)
5123      METIS_TAC [lt_antisym],
5124      (* goal 3 (of 4) *)
5125     (MP_TAC o Q.SPECL [`m`,`\x. Normal c`]) pos_fn_integral_mspace \\
5126      RW_TAC std_ss [lt_imp_le] \\
5127     `0 <= c` by METIS_TAC [REAL_LT_IMP_LE, extreal_of_num_def, extreal_lt_eq] \\
5128      Know `pos_fn_integral m (\x. Normal c * indicator_fn (m_space m) x) =
5129            Normal c * measure m (m_space m)`
5130      >- (MATCH_MP_TAC pos_fn_integral_cmul_indicator \\
5131          METIS_TAC [MEASURE_SPACE_MSPACE_MEASURABLE]) >> Rewr' \\
5132   (* Normal c * measure m (m_space m) <> PosInf *)
5133      PROVE_TAC [mul_not_infty, lt_infty],
5134      (* goal 4 (of 4), similar with previous goal *)
5135     (MP_TAC o Q.SPECL [`m`,`\x. Normal (-c)`]) pos_fn_integral_mspace \\
5136     `0 < Normal (-c)` by METIS_TAC [lt_neg,neg_0, extreal_ainv_def] \\
5137      RW_TAC std_ss [lt_imp_le] \\
5138     `0 <= -c` by METIS_TAC [REAL_LT_IMP_LE, extreal_of_num_def, extreal_lt_eq] \\
5139      Know `pos_fn_integral m (\x. Normal (-c) * indicator_fn (m_space m) x) =
5140            Normal (-c) * measure m (m_space m)`
5141      >- (MATCH_MP_TAC pos_fn_integral_cmul_indicator \\
5142          METIS_TAC [MEASURE_SPACE_MSPACE_MEASURABLE]) >> Rewr' \\
5143   (* Normal (-c) * measure m (m_space m) <> PosInf *)
5144      PROVE_TAC [mul_not_infty, lt_infty] ]
5145QED
5146
5147Theorem integrable_zero:   !m c. measure_space m ==> integrable m (\x. 0)
5148Proof
5149    RW_TAC std_ss []
5150 >> `(\x. 0) IN measurable (m_space m,measurable_sets m) Borel`
5151      by (MATCH_MP_TAC IN_MEASURABLE_BOREL_CONST \\
5152          METIS_TAC [measure_space_def])
5153 >> RW_TAC real_ss [integrable_def, fn_plus_def, fn_minus_def, lt_refl, neg_0,
5154                    pos_fn_integral_zero, num_not_infty]
5155QED
5156
5157(* Theorem 10.3 (i) <-> (ii) [1, p.84] *)
5158Theorem integrable_plus_minus :
5159    !m f. measure_space m ==>
5160         (integrable m f <=> f IN measurable (m_space m, measurable_sets m) Borel /\
5161                             integrable m (fn_plus f) /\ integrable m (fn_minus f))
5162Proof
5163    rpt STRIP_TAC
5164 >> ‘sigma_algebra (measurable_space m)’
5165      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA]
5166 >> RW_TAC std_ss [integrable_def, GSYM fn_plus_def, GSYM fn_minus_def]
5167 >> `fn_plus (fn_minus f) = fn_minus f` by METIS_TAC [FN_MINUS_POS, FN_PLUS_POS_ID]
5168 >> `fn_minus (fn_minus f) = (\x. 0)` by METIS_TAC [FN_MINUS_POS, FN_MINUS_POS_ZERO]
5169 >> `fn_plus (fn_plus f) = fn_plus f` by METIS_TAC [FN_PLUS_POS, FN_PLUS_POS_ID]
5170 >> `fn_minus (fn_plus f) = (\x. 0)` by METIS_TAC [FN_PLUS_POS, FN_MINUS_POS_ZERO]
5171 >> `(\x. fn_minus f x) = fn_minus f` by METIS_TAC []
5172 >> `(\x. fn_plus f x) = fn_plus f` by METIS_TAC []
5173 >> EQ_TAC
5174 >> RW_TAC std_ss [IN_MEASURABLE_BOREL_FN_PLUS, IN_MEASURABLE_BOREL_FN_MINUS,
5175                   pos_fn_integral_zero, num_not_infty]
5176QED
5177
5178Theorem integrable_add_pos :
5179    !m f g. measure_space m /\ integrable m f /\ integrable m g /\
5180           (!x. x IN m_space m ==> 0 <= f x) /\
5181           (!x. x IN m_space m ==> 0 <= g x) ==> integrable m (\x. f x + g x)
5182Proof
5183    rpt STRIP_TAC
5184 >> ‘sigma_algebra (measurable_space m)’
5185      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA]
5186 >> RW_TAC std_ss []
5187 >> `!x. x IN m_space m ==> 0 <= (\x. f x + g x) x` by RW_TAC real_ss [le_add]
5188 >> `f IN measurable (m_space m,measurable_sets m) Borel` by METIS_TAC [integrable_def]
5189 >> `g IN measurable (m_space m,measurable_sets m) Borel` by METIS_TAC [integrable_def]
5190 >> Know `(\x. f x + g x) IN measurable (m_space m,measurable_sets m) Borel`
5191 >- (MATCH_MP_TAC IN_MEASURABLE_BOREL_ADD \\
5192     qexistsl_tac [`f`, `g`] >> fs [measure_space_def] \\
5193     GEN_TAC >> DISCH_TAC >> DISJ1_TAC \\
5194     CONJ_TAC >> (MATCH_MP_TAC pos_not_neginf >> simp []))
5195 >> DISCH_TAC
5196 >> Suff `pos_fn_integral m (\x. f x + g x) <> PosInf`
5197 >- FULL_SIMP_TAC std_ss [integrable_pos]
5198 >> RW_TAC std_ss [pos_fn_integral_add]
5199 >> METIS_TAC [lt_add2, integrable_pos, lt_infty]
5200QED
5201
5202(* alternative definition of ‘integrable m (abs o f)’ w/o fn_plus, fn_minus *)
5203Theorem integrable_abs_alt :
5204    !m f. measure_space m /\ f IN Borel_measurable (measurable_space m) ==>
5205         (integrable m (abs o f) <=> pos_fn_integral m (abs o f) <> PosInf)
5206Proof
5207    rw [integrable_def, fn_plus_abs, fn_minus_abs, pos_fn_integral_zero]
5208 >> EQ_TAC >> rw []
5209 >> MATCH_MP_TAC IN_MEASURABLE_BOREL_ABS'
5210 >> rw [SIGMA_ALGEBRA_BOREL]
5211QED
5212
5213(* Theorem 10.3 (i) => (iii) [1, p.84], cf. integrable_from_abs *)
5214Theorem integrable_abs :
5215    !m f. measure_space m /\ integrable m f ==> integrable m (abs o f)
5216Proof
5217    RW_TAC std_ss [FN_ABS']
5218 >> MATCH_MP_TAC integrable_add_pos
5219 >> ASM_REWRITE_TAC [FN_PLUS_POS, FN_MINUS_POS]
5220 >> CONJ_TAC >- (MATCH_MP_TAC integrable_fn_plus >> art [])
5221 >> MATCH_MP_TAC integrable_fn_minus >> art []
5222QED
5223
5224(* Theorem 10.3 (ii) => (iii) [1, p.84] *)
5225Theorem integrable_abs_bound_exists :
5226    !m u. measure_space m /\ integrable m (abs o u) ==>
5227          ?w. integrable m w /\ (!x. x IN m_space m ==> 0 <= w x) /\
5228              !x. x IN m_space m ==> abs (u x) <= w x
5229Proof
5230    rpt STRIP_TAC
5231 >> Q.EXISTS_TAC `abs o u`
5232 >> RW_TAC std_ss [o_DEF, le_refl, abs_pos]
5233QED
5234
5235(* Theorem 10.3 (i) => (iv) [1, p.84] *)
5236Theorem integrable_bound_exists :
5237    !m u. measure_space m /\ integrable m u ==>
5238          ?w. integrable m w /\ (!x. x IN m_space m ==> 0 <= w x) /\
5239              !x. x IN m_space m ==> abs (u x) <= w x
5240Proof
5241    rpt STRIP_TAC
5242 >> MATCH_MP_TAC integrable_abs_bound_exists >> art []
5243 >> MATCH_MP_TAC integrable_abs >> art []
5244QED
5245
5246(* Theorem 10.3 (iv) => (i) [1, p.84] *)
5247Theorem integrable_from_bound_exists :
5248    !m u. measure_space m /\
5249          u IN measurable (m_space m,measurable_sets m) Borel /\
5250          (?w. integrable m w /\
5251               (!x. x IN m_space m ==> 0 <= w x) /\
5252               (!x. x IN m_space m ==> abs (u x) <= w x)) ==> integrable m u
5253Proof
5254    RW_TAC std_ss [integrable_def, lt_infty] (* 2 subgoals *)
5255 >| [ (* goal 1 (of 2) *)
5256      MATCH_MP_TAC let_trans \\
5257      Q.EXISTS_TAC `pos_fn_integral m w` \\
5258      Suff ‘pos_fn_integral m w = pos_fn_integral m (fn_plus w)’
5259      >- (Rewr' >> art [] \\
5260          MATCH_MP_TAC pos_fn_integral_mono >> rw [FN_PLUS_POS] \\
5261          MATCH_MP_TAC le_trans \\
5262          Q.EXISTS_TAC `abs (u x)` >> simp [] \\
5263          REWRITE_TAC [FN_PLUS_LE_ABS]) \\
5264      MATCH_MP_TAC pos_fn_integral_cong >> rw [],
5265      (* goal 2 (of 2) *)
5266      MATCH_MP_TAC let_trans \\
5267      Q.EXISTS_TAC `pos_fn_integral m w` \\
5268      Suff ‘pos_fn_integral m w = pos_fn_integral m (fn_plus w)’
5269      >- (Rewr' >> art [] \\
5270          MATCH_MP_TAC pos_fn_integral_mono >> rw [FN_MINUS_POS] \\
5271          MATCH_MP_TAC le_trans \\
5272          Q.EXISTS_TAC `abs (u x)` >> simp [] \\
5273          REWRITE_TAC [FN_MINUS_LE_ABS]) \\
5274      MATCH_MP_TAC pos_fn_integral_cong >> rw [] ]
5275QED
5276
5277(* Theorem 10.3 (iii) => (i) [1, p.84] *)
5278Theorem integrable_from_abs :
5279    !m u. measure_space m /\ u IN measurable (m_space m,measurable_sets m) Borel /\
5280          integrable m (abs o u) ==> integrable m u
5281Proof
5282    RW_TAC std_ss []
5283 >> MATCH_MP_TAC integrable_from_bound_exists >> art []
5284 >> MATCH_MP_TAC integrable_abs_bound_exists >> art []
5285QED
5286
5287Theorem integrable_abs_eq :
5288    !m f. measure_space m /\ f IN Borel_measurable (measurable_space m) ==>
5289         (integrable m (abs o f) <=> integrable m f)
5290Proof
5291    PROVE_TAC [integrable_abs, integrable_from_abs]
5292QED
5293
5294Theorem integral_abs_imp_integrable :
5295    !m f. measure_space m /\ f IN measurable (m_space m,measurable_sets m) Borel /\
5296         (integral m (abs o f) = 0) ==> integrable m f
5297Proof
5298    rpt STRIP_TAC
5299 >> MATCH_MP_TAC integrable_from_abs >> art []
5300 >> `sigma_algebra (m_space m,measurable_sets m)` by METIS_TAC [measure_space_def]
5301 >> `abs o f IN measurable (m_space m,measurable_sets m) Borel`
5302      by METIS_TAC [IN_MEASURABLE_BOREL_ABS']
5303 >> Q.ABBREV_TAC `g = abs o f`
5304 >> Know `nonneg g`
5305 >- (Q.UNABBREV_TAC `g` >> RW_TAC std_ss [nonneg_def, abs_pos]) >> DISCH_TAC
5306 >> RW_TAC std_ss [integrable_def]
5307 >| [ (* goal 1 (of 2) *)
5308      Know `integral m g = pos_fn_integral m g`
5309      >- (MATCH_MP_TAC integral_pos_fn >> fs [nonneg_def]) \\
5310      DISCH_THEN ((FULL_SIMP_TAC bool_ss) o wrap) \\
5311      Know `fn_plus g = g`
5312      >- (MATCH_MP_TAC nonneg_fn_plus >> art []) \\
5313      RW_TAC std_ss [extreal_of_num_def, extreal_not_infty],
5314      (* goal 2 (of 2) *)
5315      Know `fn_minus g = (\x. 0)`
5316      >- (MATCH_MP_TAC nonneg_fn_minus >> art []) >> Rewr' \\
5317      ASM_SIMP_TAC std_ss [pos_fn_integral_zero] \\
5318      RW_TAC std_ss [extreal_of_num_def, extreal_not_infty] ]
5319QED
5320
5321Theorem integrable_add_lemma:
5322    !m f g. measure_space m /\ integrable m f /\ integrable m g
5323        ==> (integrable m (\x. fn_plus f x + fn_plus g x) /\
5324             integrable m (\x. fn_minus f x + fn_minus g x))
5325Proof
5326    RW_TAC std_ss []
5327 >> METIS_TAC [integrable_add_pos, integrable_plus_minus, FN_PLUS_POS, FN_MINUS_POS]
5328QED
5329
5330Theorem integrable_add :
5331    !m f g. measure_space m /\ integrable m f /\ integrable m g /\
5332           (!x. x IN m_space m ==> (f x <> NegInf /\ g x <> NegInf) \/
5333                                   (f x <> PosInf /\ g x <> PosInf))
5334        ==> integrable m (\x. f x + g x)
5335Proof
5336    RW_TAC std_ss []
5337 >> ‘sigma_algebra (measurable_space m)’
5338      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA]
5339 >> Know `(\x. f x + g x) IN measurable (m_space m, measurable_sets m) Borel`
5340 >- (MATCH_MP_TAC IN_MEASURABLE_BOREL_ADD \\
5341     qexistsl_tac [`f`, `g`] >> simp [] \\
5342     METIS_TAC [measure_space_def, integrable_def])
5343 >> DISCH_TAC
5344 >> RW_TAC std_ss [Once integrable_plus_minus]
5345 >- (MATCH_MP_TAC integrable_bounded \\
5346     Q.EXISTS_TAC `(\x. fn_plus f x + fn_plus g x)` \\
5347     RW_TAC std_ss [IN_MEASURABLE_BOREL_FN_PLUS, integrable_add_lemma] \\
5348     METIS_TAC [abs_refl, FN_PLUS_POS, FN_PLUS_ADD_LE])
5349 >> MATCH_MP_TAC integrable_bounded
5350 >> Q.EXISTS_TAC `(\x. fn_minus f x + fn_minus g x)`
5351 >> RW_TAC std_ss [IN_MEASURABLE_BOREL_FN_MINUS, integrable_add_lemma]
5352 >> `abs (fn_minus (\x. f x + g x) x) = fn_minus (\x. f x + g x) x`
5353        by METIS_TAC [abs_refl, FN_MINUS_POS] >> POP_ORW
5354 >> MATCH_MP_TAC FN_MINUS_ADD_LE
5355 >> METIS_TAC []
5356QED
5357
5358Theorem integrable_cmul :
5359    !m f c. measure_space m /\ integrable m f ==> integrable m (\x. Normal c * f x)
5360Proof
5361    rpt STRIP_TAC
5362 >> ‘sigma_algebra (measurable_space m)’
5363      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA]
5364 >> Cases_on `c = 0`
5365 >- RW_TAC std_ss [integrable_zero, mul_lzero, GSYM extreal_of_num_def]
5366 >> `(\x. Normal c * f x) IN measurable (m_space m,measurable_sets m) Borel`
5367      by (MATCH_MP_TAC IN_MEASURABLE_BOREL_CMUL
5368          >> METIS_TAC [measure_space_def,integrable_def])
5369 >> RW_TAC std_ss [integrable_def, GSYM fn_plus_def, GSYM fn_minus_def]
5370 >- (Cases_on `0 <= c`
5371     >- (`fn_plus (\x. Normal c * f x) = (\x. Normal c * fn_plus f x)`
5372          by METIS_TAC [FN_PLUS_CMUL] \\
5373         POP_ORW \\
5374         FULL_SIMP_TAC std_ss [pos_fn_integral_cmul, integrable_def, FN_PLUS_POS,
5375                               GSYM fn_plus_def] \\
5376         METIS_TAC [mul_not_infty]) \\
5377    `c < 0` by METIS_TAC [real_lt] \\
5378    `fn_plus (\x. Normal c * f x) = (\x. -Normal c * fn_minus f x)`
5379            by METIS_TAC [FN_PLUS_CMUL, REAL_LT_IMP_LE] \\
5380     POP_ORW \\
5381     RW_TAC std_ss [extreal_ainv_def] \\
5382    `0 <= -c` by METIS_TAC [REAL_LT_NEG, REAL_NEG_0, REAL_LT_IMP_LE] \\
5383     FULL_SIMP_TAC std_ss [pos_fn_integral_cmul, integrable_def, FN_MINUS_POS,
5384                           GSYM fn_minus_def] \\
5385     METIS_TAC [mul_not_infty])
5386 >> Cases_on `0 <= c`
5387 >- (`fn_minus (\x. Normal c * f x) = (\x. Normal c * fn_minus f x)`
5388      by METIS_TAC [FN_MINUS_CMUL] \\
5389     POP_ORW \\
5390     FULL_SIMP_TAC std_ss [pos_fn_integral_cmul, integrable_def, FN_MINUS_POS,
5391                           GSYM fn_minus_def] \\
5392     METIS_TAC [mul_not_infty])
5393 >> `c < 0` by METIS_TAC [real_lt]
5394 >> `fn_minus (\x. Normal c * f x) = (\x. -Normal c * fn_plus f x)`
5395        by METIS_TAC [FN_MINUS_CMUL, REAL_LT_IMP_LE]
5396 >> POP_ORW
5397 >> RW_TAC std_ss [extreal_ainv_def]
5398 >> `0 <= -c` by METIS_TAC [REAL_LT_IMP_LE, REAL_LE_NEG, REAL_NEG_0]
5399 >> RW_TAC std_ss [pos_fn_integral_cmul, FN_PLUS_POS]
5400 >> METIS_TAC [mul_not_infty, integrable_def]
5401QED
5402
5403Theorem integrable_cdiv :
5404    !m f c. measure_space m /\ integrable m f /\ c <> 0 ==>
5405            integrable m (\x. f x / Normal c)
5406Proof
5407    rw [extreal_div_def, extreal_inv_def, Once mul_comm]
5408 >> MATCH_MP_TAC integrable_cmul >> art []
5409QED
5410
5411Theorem integrable_ainv :
5412    !m f. measure_space m /\ integrable m f ==> integrable m (\x. -f x)
5413Proof
5414    rpt STRIP_TAC
5415 >> REWRITE_TAC [Once neg_minus1, extreal_of_num_def, extreal_ainv_def]
5416 >> MATCH_MP_TAC integrable_cmul >> art []
5417QED
5418
5419Theorem integrable_sub :
5420    !m f g. measure_space m /\ integrable m f /\ integrable m g /\
5421            (!x. x IN m_space m ==> f x <> NegInf /\ g x <> PosInf)
5422        ==> integrable m (\x. f x - g x)
5423Proof
5424    rw [extreal_sub]
5425 >> ‘integrable m (\x. -g x)’ by METIS_TAC [integrable_ainv]
5426 >> HO_MATCH_MP_TAC integrable_add >> rw []
5427 >> Cases_on ‘g x’ >> METIS_TAC [extreal_ainv_def, extreal_distinct]
5428QED
5429
5430Theorem integrable_indicator:
5431    !m s. measure_space m /\ s IN measurable_sets m /\ measure m s < PosInf ==>
5432          integrable m (indicator_fn s)
5433Proof
5434    RW_TAC std_ss []
5435 >> `!x. 0 <= indicator_fn s x` by PROVE_TAC [INDICATOR_FN_POS]
5436 >> RW_TAC std_ss [integrable_pos, pos_fn_integral_indicator, lt_infty]
5437 >> MATCH_MP_TAC IN_MEASURABLE_BOREL_INDICATOR
5438 >> METIS_TAC [measure_space_def, subsets_def, space_def]
5439QED
5440
5441Theorem integrable_indicator_pow:
5442    !m s n. measure_space m /\ s IN measurable_sets m /\ measure m s < PosInf /\
5443            0 < n ==> integrable m (\x. (indicator_fn s x) pow n)
5444Proof
5445    rpt STRIP_TAC
5446 >> MATCH_MP_TAC integrable_eq
5447 >> Q.EXISTS_TAC `indicator_fn s`
5448 >> RW_TAC std_ss [integrable_indicator, indicator_fn_def, one_pow, zero_pow]
5449QED
5450
5451Theorem integrable_mul_indicator :
5452    !m s f. measure_space m /\ s IN measurable_sets m /\
5453            integrable m f ==> integrable m (\x. f x * indicator_fn s x)
5454Proof
5455    rpt STRIP_TAC
5456 >> MATCH_MP_TAC integrable_bounded
5457 >> Q.EXISTS_TAC `abs o f`
5458 >> ASM_SIMP_TAC std_ss [o_DEF]
5459 >> CONJ_TAC >- (MATCH_MP_TAC (REWRITE_RULE [o_DEF] integrable_abs) >> art [])
5460 >> reverse CONJ_TAC
5461 >- (RW_TAC std_ss [] \\
5462     Cases_on `x IN s` >- ASM_SIMP_TAC std_ss [indicator_fn_def, mul_rone, le_refl] \\
5463     ASM_SIMP_TAC std_ss [indicator_fn_def, mul_rzero, abs_0, abs_pos])
5464 >> MATCH_MP_TAC IN_MEASURABLE_BOREL_MUL_INDICATOR
5465 >> fs [measure_space_def, integrable_def]
5466QED
5467
5468(* IMPORTANT: all posinf-valued points (which forms a null set) in an integrable
5469   function can be safely removed without changing its overall integral.
5470 *)
5471Theorem integrable_not_infty_lemma[local] :
5472    !m f. measure_space m /\ integrable m f /\
5473         (!x. x IN m_space m ==> 0 <= f x) ==>
5474          ?g. integrable m g /\
5475             (!x. x IN m_space m ==> 0 <= g x) /\
5476             (!x. x IN m_space m ==> g x <> PosInf) /\
5477             (integral m f = integral m g)
5478Proof
5479    RW_TAC std_ss [integral_pos_fn, integrable_def]
5480 >> ‘sigma_algebra (measurable_space m)’ by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA]
5481 >> Q.ABBREV_TAC `g = (\x. if f x = PosInf then 0 else f x)`
5482 >> Q.EXISTS_TAC `g`
5483 >> `!x. x IN m_space m ==> 0 <= g x` by METIS_TAC [le_refl]
5484 >> `!x. x IN m_space m ==> g x <= f x` by METIS_TAC [le_refl,le_infty]
5485 >> `!x. x IN m_space m ==> g x <> PosInf` by METIS_TAC [num_not_infty]
5486 >> Know `g IN measurable (m_space m,measurable_sets m) Borel`
5487 >- (rw [IN_MEASURABLE_BOREL, space_def, subsets_def, IN_FUNSET, IN_UNIV] \\
5488     Cases_on `Normal c <= 0`
5489     >- (`{x | g x < Normal c} INTER m_space m = {}`
5490            by (rw [Once EXTENSION, GSPECIFICATION, NOT_IN_EMPTY] \\
5491                METIS_TAC [le_trans, extreal_lt_def]) \\
5492         METIS_TAC [MEASURE_SPACE_EMPTY_MEASURABLE]) \\
5493    `{x | g x < Normal c} = {x | f x < Normal c} UNION {x | f x = PosInf}`
5494       by (RW_TAC std_ss [EXTENSION, GSPECIFICATION, IN_UNION]
5495           >> Q.UNABBREV_TAC `g`
5496           >> RW_TAC std_ss []
5497           >> METIS_TAC [extreal_lt_def]) \\
5498     RW_TAC std_ss [Once INTER_COMM, UNION_OVER_INTER] \\
5499     MATCH_MP_TAC MEASURE_SPACE_UNION \\
5500     RW_TAC std_ss [] \\ (* 2 subgoals *)
5501     METIS_TAC [(REWRITE_RULE [space_def, subsets_def] o
5502                 Q.SPECL [`f`,`(m_space m, measurable_sets m)`])
5503                    IN_MEASURABLE_BOREL_ALL, integrable_def, INTER_COMM])
5504 >> DISCH_TAC
5505 >> CONJ_TAC
5506 >- (RW_TAC std_ss []
5507     >- (FULL_SIMP_TAC std_ss [lt_infty] \\
5508         MATCH_MP_TAC let_trans \\
5509         Q.EXISTS_TAC ‘pos_fn_integral m (fn_plus f)’ >> art [] \\
5510         MATCH_MP_TAC pos_fn_integral_mono >> rw [FN_PLUS_POS]) \\
5511     Know ‘pos_fn_integral m (fn_minus g) = pos_fn_integral m (\x. 0)’
5512     >- (MATCH_MP_TAC pos_fn_integral_cong >> rw [FN_MINUS_POS]) >> Rewr' \\
5513     RW_TAC std_ss [pos_fn_integral_zero, num_not_infty])
5514 >> RW_TAC std_ss []
5515 >> Q.ABBREV_TAC `h = (\x. f x - g x)`
5516 >> Know `!x. x IN m_space m ==> f x <> NegInf`
5517 >- (GEN_TAC >> DISCH_TAC >> MATCH_MP_TAC pos_not_neginf \\
5518     FIRST_X_ASSUM MATCH_MP_TAC >> art []) >> DISCH_TAC
5519 >> Know `h IN measurable (m_space m,measurable_sets m) Borel`
5520 >- (MATCH_MP_TAC IN_MEASURABLE_BOREL_SUB \\
5521     qexistsl_tac [‘f’, ‘g’] >> fs [measure_space_def]) >> DISCH_TAC
5522 >> `!x. x IN m_space m ==> 0 <= h x`
5523       by METIS_TAC [extreal_sub_def,le_infty,le_refl,extreal_of_num_def,sub_refl]
5524 >> Know `pos_fn_integral m f = pos_fn_integral m (\x. g x + h x)`
5525 >- (MATCH_MP_TAC pos_fn_integral_cong >> simp [] \\
5526     CONJ_TAC >- (rpt STRIP_TAC >> MATCH_MP_TAC le_add >> PROVE_TAC []) \\
5527     rw [Abbr ‘h’] \\
5528     Know ‘g x + (f x - g x) = f x - g x + g x’
5529     >- (MATCH_MP_TAC add_comm >> DISJ1_TAC \\
5530         CONJ_TAC >- (MATCH_MP_TAC pos_not_neginf >> simp []) \\
5531         MATCH_MP_TAC pos_not_neginf >> fs []) >> Rewr' \\
5532     MATCH_MP_TAC EQ_SYM \\
5533     MATCH_MP_TAC sub_add \\
5534     CONJ_TAC >- (MATCH_MP_TAC pos_not_neginf >> simp []) \\
5535     FIRST_X_ASSUM MATCH_MP_TAC >> art []) >> Rewr'
5536 >> (MP_TAC o Q.SPECL [`m`,`g`,`h`]) pos_fn_integral_add
5537 >> RW_TAC std_ss []
5538 >> Suff `pos_fn_integral m h = 0`
5539 >- RW_TAC std_ss [add_rzero, integral_pos_fn]
5540 >> POP_ASSUM K_TAC
5541 >> `integrable m f`
5542       by RW_TAC std_ss [integrable_def, GSYM fn_plus_def, GSYM fn_minus_def]
5543 >> `null_set m {x | x IN m_space m /\ (f x = PosInf)}`
5544       by METIS_TAC [integrable_infty_null]
5545 >> MP_TAC (Q.SPECL [`m`,`h`,`{x | x IN m_space m /\ (f x = PosInf)}`]
5546                    pos_fn_integral_split)
5547 >> FULL_SIMP_TAC std_ss [null_set_def]
5548 >> RW_TAC std_ss []
5549 >> `(\x. h x * indicator_fn {x | x IN m_space m /\ (f x = PosInf)} x) =
5550     (\x. PosInf * indicator_fn {x | x IN m_space m /\ (f x = PosInf)} x)`
5551       by (rw [FUN_EQ_THM, indicator_fn_def, Abbr ‘h’] \\
5552           RW_TAC std_ss [mul_rzero, mul_rone] \\
5553           METIS_TAC [extreal_sub_def,extreal_cases])
5554 >> RW_TAC std_ss [pos_fn_integral_cmul_infty, mul_rzero, add_lzero]
5555 >> `(\x. h x * indicator_fn (m_space m DIFF {x | x IN m_space m /\ (f x = PosInf)}) x) =
5556      (\x. 0)`
5557       by (rw [FUN_EQ_THM, indicator_fn_def, Abbr ‘h’] \\
5558           RW_TAC std_ss [mul_rzero, mul_rone] \\
5559           METIS_TAC [sub_refl])
5560 >> rw [pos_fn_integral_zero, GSYM extreal_of_num_def]
5561QED
5562
5563(* moved here as integrable_not_infty' needs it *)
5564Theorem integral_mspace:
5565    !m f. measure_space m ==>
5566         (integral m f = integral m (\x. f x * indicator_fn (m_space m) x))
5567Proof
5568    RW_TAC std_ss [integral_def]
5569 >> `(fn_plus (\x. f x * indicator_fn (m_space m) x)) =
5570     (\x. fn_plus f x * indicator_fn (m_space m) x)`
5571       by (RW_TAC std_ss [indicator_fn_def, fn_plus_def, FUN_EQ_THM] \\
5572           METIS_TAC [mul_rone, mul_lone, mul_rzero, mul_lzero])
5573 >> `fn_minus (\x. f x * indicator_fn (m_space m) x) =
5574     (\x. fn_minus f x * indicator_fn (m_space m) x)`
5575       by (RW_TAC std_ss [indicator_fn_def, fn_minus_def, FUN_EQ_THM] \\
5576           METIS_TAC [neg_0, neg_eq0, mul_rone, mul_lone, mul_rzero, mul_lzero])
5577 >> RW_TAC std_ss []
5578 >> METIS_TAC [pos_fn_integral_mspace, FN_PLUS_POS, FN_MINUS_POS]
5579QED
5580
5581Theorem integral_cong : (* was: integral_eq *)
5582    !m f g. measure_space m /\ (!x. x IN m_space m ==> (f x = g x)) ==>
5583           (integral m f = integral m g)
5584Proof
5585    rpt STRIP_TAC
5586 >> `(integral m f = integral m (\x. f x * indicator_fn (m_space m) x)) /\
5587     (integral m g = integral m (\x. g x * indicator_fn (m_space m) x))`
5588        by METIS_TAC [integral_mspace] >> art []
5589 >> Suff `(\x. f x * indicator_fn (m_space m) x) = (\x. g x * indicator_fn (m_space m) x)`
5590 >- RW_TAC std_ss []
5591 >> FUN_EQ_TAC >> RW_TAC std_ss [indicator_fn_def, GSPECIFICATION, mul_rzero]
5592QED
5593
5594Theorem integral_cong_AE :
5595    !m f g. measure_space m /\ (AE x::m. f x = g x) ==> (integral m f = integral m g)
5596Proof
5597    rw [AE_DEF, integral_def]
5598 >> Suff ‘(pos_fn_integral m (fn_plus f) = pos_fn_integral m (fn_plus g)) /\
5599          (pos_fn_integral m (fn_minus f) = pos_fn_integral m (fn_minus g))’
5600 >- Rewr
5601 >> CONJ_TAC
5602 >| [ (* goal 1 (of 2) *)
5603      MATCH_MP_TAC pos_fn_integral_cong_AE \\
5604      rw [FN_PLUS_POS, AE_DEF] \\
5605      Q.EXISTS_TAC ‘N’ >> rw [FN_PLUS_ALT],
5606      (* goal 2 (of 2) *)
5607      MATCH_MP_TAC pos_fn_integral_cong_AE \\
5608      rw [FN_MINUS_POS, AE_DEF] \\
5609      Q.EXISTS_TAC ‘N’ >> rw [FN_MINUS_ALT] ]
5610QED
5611
5612(* furthermore, ‘x IN m_space m’ can be removed from ‘g’ *)
5613Theorem integrable_not_infty :
5614    !m f. measure_space m /\ integrable m f /\
5615         (!x. x IN m_space m ==> 0 <= f x) ==>
5616          ?g. integrable m g /\ (!x. 0 <= g x) /\ (!x. g x <> PosInf) /\
5617             (integral m f = integral m g)
5618Proof
5619    rpt STRIP_TAC
5620 >> MP_TAC (Q.SPECL [‘m’, ‘f’] integrable_not_infty_lemma)
5621 >> RW_TAC std_ss []
5622 >> Q.EXISTS_TAC ‘\x. if x IN m_space m then g x else 0’
5623 >> CONJ_TAC
5624 >- (MATCH_MP_TAC integrable_eq >> Q.EXISTS_TAC ‘g’ >> simp [])
5625 >> rw []
5626 >> MATCH_MP_TAC integral_cong >> rw []
5627QED
5628
5629Theorem integrable_not_infty_alt :
5630    !m f. measure_space m /\ integrable m f /\
5631         (!x. x IN m_space m ==> 0 <= f x) ==>
5632          integrable m (\x. if f x = PosInf then 0 else f x) /\
5633         (integral m f = integral m (\x. if f x = PosInf then 0 else f x))
5634Proof
5635    rpt GEN_TAC >> STRIP_TAC
5636 >> ‘sigma_algebra (measurable_space m)’
5637      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA]
5638 >> Q.ABBREV_TAC `g = (\x. if f x = PosInf then 0 else f x)`
5639 >> `!x. x IN m_space m ==> 0 <= g x` by METIS_TAC [le_refl]
5640 >> `!x. x IN m_space m ==> g x <= f x` by METIS_TAC [le_refl, le_infty]
5641 >> `!x. x IN m_space m ==> g x <> PosInf` by METIS_TAC [num_not_infty]
5642 >> `!x. x IN m_space m ==> g x <> NegInf` by METIS_TAC [lt_infty, lte_trans, num_not_infty]
5643 >> `!x. x IN m_space m ==> f x <> NegInf` by METIS_TAC [lt_infty, lte_trans, num_not_infty]
5644 >> Know `g IN measurable (m_space m,measurable_sets m) Borel`
5645 >- (RW_TAC std_ss [IN_MEASURABLE_BOREL, space_def, subsets_def, IN_FUNSET, IN_UNIV] \\
5646     Cases_on `Normal c <= 0`
5647     >- (`{x | g x < Normal c} INTER m_space m = {}`
5648            by (RW_TAC std_ss [EXTENSION, GSPECIFICATION, NOT_IN_EMPTY, IN_INTER] \\
5649                METIS_TAC [le_trans, extreal_lt_def]) >> POP_ORW \\
5650         METIS_TAC [MEASURE_SPACE_EMPTY_MEASURABLE]) \\
5651    `{x | g x < Normal c} = {x | f x < Normal c} UNION {x | f x = PosInf}`
5652        by (RW_TAC std_ss [EXTENSION, GSPECIFICATION, IN_UNION] \\
5653            Q.UNABBREV_TAC `g` >> RW_TAC std_ss [] \\
5654            METIS_TAC [extreal_lt_def]) \\
5655     RW_TAC std_ss [Once INTER_COMM, UNION_OVER_INTER] \\
5656     MATCH_MP_TAC MEASURE_SPACE_UNION \\
5657     RW_TAC std_ss [] \\
5658     METIS_TAC [(REWRITE_RULE [space_def, subsets_def] o
5659                 Q.SPECL [`f`,`(m_space m, measurable_sets m)`])
5660                    IN_MEASURABLE_BOREL_ALL, integrable_def, INTER_COMM])
5661 >> DISCH_TAC
5662 >> Know `integrable m g`
5663 >- (RW_TAC std_ss [integrable_def, GSYM fn_plus_def, GSYM fn_minus_def]
5664     >- (fs [lt_infty, integrable_def, GSYM fn_plus_def] \\
5665         MATCH_MP_TAC let_trans \\
5666         Q.EXISTS_TAC ‘pos_fn_integral m (fn_plus f)’ >> art [] \\
5667         MATCH_MP_TAC pos_fn_integral_mono >> rw [FN_PLUS_POS]) \\
5668     Know ‘pos_fn_integral m (fn_minus g) = pos_fn_integral m (\x. 0)’
5669     >- (MATCH_MP_TAC pos_fn_integral_cong >> simp [FN_MINUS_POS]) >> Rewr' \\
5670     RW_TAC std_ss [pos_fn_integral_zero, num_not_infty])
5671 >> RW_TAC std_ss []
5672 >> Q.ABBREV_TAC `h = (\x. f x - g x)`
5673 >> Know `h IN measurable (m_space m,measurable_sets m) Borel`
5674 >- (MATCH_MP_TAC IN_MEASURABLE_BOREL_SUB \\
5675     qexistsl_tac [‘f’, ‘g’] >> fs [measure_space_def, integrable_def])
5676 >> RW_TAC std_ss [integral_pos_fn]
5677 >> `!x. x IN m_space m ==> 0 <= h x`
5678       by METIS_TAC [extreal_sub_def,le_infty,le_refl,extreal_of_num_def,sub_refl]
5679 >> Know `pos_fn_integral m f = pos_fn_integral m (\x. g x + h x)`
5680 >- (MATCH_MP_TAC pos_fn_integral_cong >> simp [] \\
5681     CONJ_TAC >- (rpt STRIP_TAC >> MATCH_MP_TAC le_add >> PROVE_TAC []) \\
5682     rw [Abbr ‘h’] \\
5683     Know ‘g x + (f x - g x) = f x - g x + g x’
5684     >- (MATCH_MP_TAC add_comm >> DISJ1_TAC \\
5685         CONJ_TAC >- (MATCH_MP_TAC pos_not_neginf >> simp []) \\
5686         MATCH_MP_TAC pos_not_neginf >> fs []) >> Rewr' \\
5687     MATCH_MP_TAC EQ_SYM \\
5688     MATCH_MP_TAC sub_add \\
5689     CONJ_TAC >- (MATCH_MP_TAC pos_not_neginf >> simp []) \\
5690     FIRST_X_ASSUM MATCH_MP_TAC >> art []) >> Rewr'
5691 >> (MP_TAC o Q.SPECL [`m`,`g`,`h`]) pos_fn_integral_add
5692 >> RW_TAC std_ss []
5693 >> Suff `pos_fn_integral m h = 0`
5694 >- RW_TAC std_ss [add_rzero]
5695 >> Q.ABBREV_TAC `f = (\x. g x + h x)`
5696 >> `integrable m f` by RW_TAC std_ss [integrable_def, GSYM fn_plus_def, GSYM fn_minus_def]
5697 >> `null_set m {x | x IN m_space m /\ (f x = PosInf)}` by METIS_TAC [integrable_infty_null]
5698 >> (MP_TAC o Q.SPECL [`m`,`h`,`{x | x IN m_space m /\ (f x = PosInf)}`]) pos_fn_integral_split
5699 >> FULL_SIMP_TAC std_ss [null_set_def]
5700 >> RW_TAC std_ss []
5701 >> `(\x. h x * indicator_fn {x | x IN m_space m /\ (f x = PosInf)} x) =
5702     (\x. PosInf * indicator_fn {x | x IN m_space m /\ (f x = PosInf)} x)`
5703       by (RW_TAC std_ss [FUN_EQ_THM, indicator_fn_def, mul_rzero, mul_rone, GSPECIFICATION]
5704           >> Q.UNABBREV_TAC `h`
5705           >> RW_TAC std_ss [mul_rzero, mul_rone]
5706           >> METIS_TAC [extreal_sub_def, extreal_cases])
5707 >> RW_TAC std_ss [pos_fn_integral_cmul_infty, mul_rzero, add_lzero]
5708 >> `(\x. h x * indicator_fn (m_space m DIFF {x | x IN m_space m /\ (f x = PosInf)}) x) =
5709     (\x. 0)`
5710       by (RW_TAC std_ss [FUN_EQ_THM,indicator_fn_def, mul_rzero, mul_rone, GSPECIFICATION,
5711                          IN_DIFF]
5712           >> Q.UNABBREV_TAC `h`
5713           >> RW_TAC std_ss [mul_rzero, mul_rone]
5714           >> METIS_TAC [sub_refl])
5715 >> RW_TAC std_ss [pos_fn_integral_zero, GSYM extreal_of_num_def, mul_rzero, add_rzero]
5716QED
5717
5718Theorem integrable_not_infty_alt2 :
5719    !m f. measure_space m /\ integrable m f /\
5720         (!x. x IN m_space m ==> 0 <= f x) ==>
5721          integrable m (\x. if f x = PosInf then 0 else f x) /\
5722         (pos_fn_integral m f = pos_fn_integral m (\x. if f x = PosInf then 0 else f x))
5723Proof
5724    RW_TAC std_ss []
5725 >- RW_TAC std_ss [integrable_not_infty_alt]
5726 >> `!x. x IN m_space m ==>
5727         0 <= (\x. if f x = PosInf then 0 else f x) x` by METIS_TAC [le_refl]
5728 >> FULL_SIMP_TAC std_ss [GSYM integral_pos_fn]
5729 >> METIS_TAC [integrable_not_infty_alt]
5730QED
5731
5732Theorem integrable_not_infty_alt3 :
5733    !m f. measure_space m /\ integrable m f ==>
5734          integrable m (\x. if ((f x = NegInf) \/ (f x = PosInf)) then 0 else f x) /\
5735         (integral m f =
5736          integral m (\x. if ((f x = NegInf) \/ (f x = PosInf)) then 0 else f x))
5737Proof
5738    NTAC 3 STRIP_TAC
5739 >> `fn_plus (\x. if (f x = NegInf) \/ (f x = PosInf) then 0 else f x) =
5740      (\x. if fn_plus f x = PosInf then 0 else fn_plus f x)`
5741      by (RW_TAC std_ss [fn_plus_def,FUN_EQ_THM]
5742          >> Cases_on `f x` >> METIS_TAC [lt_infty])
5743 >> `fn_minus (\x. if (f x = NegInf) \/ (f x = PosInf) then 0 else f x) =
5744      (\x. if fn_minus f x = PosInf then 0 else fn_minus f x)`
5745      by (RW_TAC std_ss [fn_minus_def,FUN_EQ_THM]
5746          >> Cases_on `f x`
5747          >> METIS_TAC [lt_infty, lt_refl, extreal_ainv_def, extreal_not_infty])
5748 >> `integrable m (fn_plus f)` by RW_TAC std_ss [integrable_fn_plus]
5749 >> `integrable m (fn_minus f)` by RW_TAC std_ss [integrable_fn_minus]
5750 >> `integrable m (\x. if fn_plus f x = PosInf then 0 else fn_plus f x)`
5751       by METIS_TAC [integrable_not_infty_alt2, FN_PLUS_POS, FN_MINUS_POS, integrable_pos]
5752 >> `integrable m (\x. if fn_minus f x = PosInf then 0 else fn_minus f x)`
5753       by METIS_TAC [integrable_not_infty_alt2, FN_PLUS_POS, FN_MINUS_POS, integrable_pos]
5754 >> reverse (RW_TAC std_ss [integral_def, integrable_def, GSYM fn_plus_def, GSYM fn_minus_def])
5755 >| [ (* goal 1 (of 4) *)
5756      METIS_TAC [integrable_not_infty_alt2, FN_PLUS_POS, FN_MINUS_POS],
5757      (* goal 2 (of 4) *)
5758      METIS_TAC [integrable_not_infty_alt2, FN_PLUS_POS, FN_MINUS_POS, integrable_pos],
5759      (* goal 3 (of 4) *)
5760      METIS_TAC [integrable_not_infty_alt2, FN_PLUS_POS, FN_MINUS_POS, integrable_pos],
5761      (* goal 4 (of 4) *)
5762     `(\x. if (f x = NegInf) \/ (f x = PosInf) then 0 else f x) =
5763       (\x. (\x. if fn_plus f x = PosInf then 0 else fn_plus f x) x -
5764       (\x. if fn_minus f x = PosInf then 0 else fn_minus f x) x)`
5765         by (RW_TAC std_ss [FUN_EQ_THM,fn_plus_def,fn_minus_def]
5766             >> Cases_on `f x`
5767             >> RW_TAC std_ss [lt_infty, extreal_sub_def, extreal_ainv_def, extreal_not_infty,
5768                               num_not_infty, sub_rzero]
5769             >> METIS_TAC [lt_infty, extreal_not_infty, num_not_infty, extreal_ainv_def,
5770                           lt_antisym, sub_lzero, neg_neg, extreal_lt_def, le_antisym]) \\
5771      POP_ORW \\
5772      MATCH_MP_TAC IN_MEASURABLE_BOREL_SUB \\
5773      Q.EXISTS_TAC `(\x. if fn_plus f x = PosInf then 0 else fn_plus f x)` \\
5774      Q.EXISTS_TAC `(\x. if fn_minus f x = PosInf then 0 else fn_minus f x)` \\
5775      FULL_SIMP_TAC std_ss [integrable_def, measure_space_def, space_def] \\
5776   (* additional steps added by Chun Tian *)
5777      GEN_TAC >> DISCH_TAC >> DISJ1_TAC \\
5778      CONJ_TAC >- (Cases_on `fn_plus f x = PosInf`
5779                   >- METIS_TAC [extreal_cases, extreal_of_num_def, extreal_not_infty] \\
5780                   ASM_SIMP_TAC std_ss [] \\
5781                   METIS_TAC [FN_PLUS_POS, pos_not_neginf]) \\
5782      Cases_on `fn_minus f x = PosInf`
5783      >- METIS_TAC [extreal_cases, extreal_of_num_def, extreal_not_infty] \\
5784      ASM_SIMP_TAC std_ss [] ]
5785QED
5786
5787(* ------------------------------------------------------------------------- *)
5788(* Properties of Integral                                                    *)
5789(* ------------------------------------------------------------------------- *)
5790
5791Theorem integral_indicator:
5792    !m s. measure_space m /\ s IN measurable_sets m ==>
5793          (integral m (indicator_fn s) = measure m s)
5794Proof
5795    RW_TAC std_ss []
5796 >> `!x. 0 <= indicator_fn s x`
5797     by RW_TAC std_ss [indicator_fn_def, mul_rone, mul_rzero, le_refl, le_01]
5798 >> METIS_TAC [pos_fn_integral_indicator, integral_pos_fn]
5799QED
5800
5801Theorem integral_add_lemma :
5802    !m f f1 f2.
5803       measure_space m /\ integrable m f /\
5804       integrable m f1 /\ integrable m f2 /\
5805      (!x. x IN m_space m ==> (f x = f1 x - f2 x)) /\
5806      (!x. x IN m_space m ==> 0 <= f1 x) /\
5807      (!x. x IN m_space m ==> 0 <= f2 x) /\
5808      (!x. x IN m_space m ==> f1 x <> PosInf \/ f2 x <> PosInf) ==>
5809      (integral m f = pos_fn_integral m f1 - pos_fn_integral m f2)
5810Proof
5811    rpt STRIP_TAC
5812 >> ‘sigma_algebra (measurable_space m)’
5813      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA]
5814 >> REWRITE_TAC [integral_def]
5815 >> `!x. x IN m_space m ==> f1 x <> NegInf` by METIS_TAC [pos_not_neginf]
5816 >> `!x. x IN m_space m ==> f2 x <> NegInf` by METIS_TAC [pos_not_neginf]
5817 >> Q.ABBREV_TAC `h1 = (\x. fn_plus f x + f2 x)`
5818 >> Q.ABBREV_TAC `h2 = (\x. fn_minus f x + f1 x)`
5819 >> Know `!x. x IN m_space m ==> (h1 x = h2 x)`
5820 >- (RW_TAC std_ss [Abbr ‘h1’, Abbr ‘h2’] \\
5821     Q.PAT_X_ASSUM ‘!x. x IN m_space m ==> P \/ Q’ (MP_TAC o (Q.SPEC ‘x’)) \\
5822     RW_TAC std_ss [] \\
5823     Cases_on ‘f2 x = PosInf’
5824     >- (‘?r. f1 x = Normal r’ by METIS_TAC [extreal_cases] \\
5825         ‘f x = NegInf’ by METIS_TAC [extreal_sub_def] \\
5826         ‘fn_minus f x = PosInf’ by METIS_TAC [FN_MINUS_ALT, min_infty, extreal_ainv_def] \\
5827         ‘fn_plus f x = 0’ by METIS_TAC [FN_MINUS_INFTY_IMP] \\
5828         rw [extreal_add_def]) \\
5829    ‘f1 x <> NegInf /\ f2 x <> NegInf’ by PROVE_TAC [] \\
5830     SIMP_TAC std_ss [fn_plus_def, fn_minus_def, add_lzero] \\
5831     Cases_on `f1 x` >> Cases_on `f2 x` \\
5832     FULL_SIMP_TAC std_ss [extreal_sub_def, extreal_add_def, extreal_ainv_def,
5833                           extreal_11, add_lzero, extreal_of_num_def, GSYM lt_infty,
5834                           extreal_lt_eq, extreal_not_infty] \\
5835     Cases_on ‘0 < r - r'’
5836     >- (‘~(r - r' < 0)’ by METIS_TAC [REAL_LT_ANTISYM] \\
5837         fs [extreal_add_def, extreal_sub_def, add_lzero] >> REAL_ARITH_TAC) \\
5838     Cases_on ‘r - r' < 0’
5839     >- (fs [extreal_add_def, extreal_sub_def, add_lzero] >> REAL_ARITH_TAC) \\
5840     fs [extreal_add_def, extreal_11] \\
5841    ‘r - r' = 0’ by METIS_TAC [REAL_LE_ANTISYM, real_lt] >> POP_ASSUM MP_TAC \\
5842     REAL_ARITH_TAC)
5843 >> DISCH_TAC
5844 >> Know `pos_fn_integral m h1 = pos_fn_integral m h2`
5845 >- (MATCH_MP_TAC pos_fn_integral_cong >> simp [] \\
5846     RW_TAC std_ss [Abbr ‘h2’] \\
5847     MATCH_MP_TAC le_add >> rw [FN_MINUS_POS]) >> DISCH_TAC
5848 >> `pos_fn_integral m h1 =
5849     pos_fn_integral m (fn_plus f) + pos_fn_integral m f2`
5850      by (Q.UNABBREV_TAC `h1`
5851          >> MATCH_MP_TAC pos_fn_integral_add
5852          >> FULL_SIMP_TAC std_ss [integrable_def]
5853          >> RW_TAC std_ss [le_refl, lt_le, IN_MEASURABLE_BOREL_FN_PLUS, FN_PLUS_POS])
5854 >> `pos_fn_integral m h2 =
5855     pos_fn_integral m (fn_minus f) + pos_fn_integral m f1`
5856      by (Q.UNABBREV_TAC `h2`
5857          >> MATCH_MP_TAC pos_fn_integral_add
5858          >> METIS_TAC [FN_MINUS_POS, IN_MEASURABLE_BOREL_FN_MINUS, integrable_def])
5859 >> `pos_fn_integral m f2 <> PosInf` by METIS_TAC [integrable_pos]
5860 >> `pos_fn_integral m (fn_minus f) <> PosInf`
5861      by METIS_TAC [integrable_def]
5862 >> `pos_fn_integral m f2 <> NegInf`
5863      by METIS_TAC [pos_fn_integral_pos, lt_infty, lte_trans, num_not_infty]
5864 >> `0 <= pos_fn_integral m (fn_minus f)`
5865      by METIS_TAC [pos_fn_integral_pos, FN_MINUS_POS]
5866 >> `pos_fn_integral m (fn_minus f) <> NegInf`
5867      by METIS_TAC [lt_infty, lte_trans, num_not_infty]
5868 >> METIS_TAC [eq_add_sub_switch]
5869QED
5870
5871(* an improved version without the following antecedents: (used by FUBINI)
5872
5873   !x. x IN m_space m ==> f1 x <> PosInf \/ f2 x <> PosInf
5874 *)
5875Theorem integral_add_lemma' :
5876    !m f f1 f2.
5877       measure_space m /\ integrable m f /\
5878       integrable m f1 /\ integrable m f2 /\
5879      (!x. x IN m_space m ==> (f x = f1 x - f2 x)) /\
5880      (!x. x IN m_space m ==> 0 <= f1 x) /\
5881      (!x. x IN m_space m ==> 0 <= f2 x) ==>
5882      (integral m f = pos_fn_integral m f1 - pos_fn_integral m f2)
5883Proof
5884    rpt STRIP_TAC
5885 >> Q.ABBREV_TAC ‘N1 = {x | x IN m_space m /\ f1 x = PosInf}’
5886 >> Q.ABBREV_TAC ‘N2 = {x | x IN m_space m /\ f2 x = PosInf}’
5887 >> ‘null_set m N1 /\ null_set m N2’ by METIS_TAC [integrable_infty_null]
5888 >> Q.ABBREV_TAC ‘g1 = \x. if f1 x = PosInf then 0 else f1 x’
5889 >> Q.ABBREV_TAC ‘g2 = \x. if f2 x = PosInf then 0 else f2 x’
5890 >> Know ‘integrable m g1 /\ pos_fn_integral m f1 = pos_fn_integral m g1’
5891 >- (Q.UNABBREV_TAC ‘g1’ \\
5892     MATCH_MP_TAC integrable_not_infty_alt2 >> rw [])
5893 >> STRIP_TAC >> POP_ORW
5894 >> Know ‘integrable m g2 /\ pos_fn_integral m f2 = pos_fn_integral m g2’
5895 >- (Q.UNABBREV_TAC ‘g2’ \\
5896     MATCH_MP_TAC integrable_not_infty_alt2 >> rw [])
5897 >> STRIP_TAC >> POP_ORW
5898 (* applying integral_add_lemma *)
5899 >> Q.ABBREV_TAC ‘g = \x. g1 x - g2 x’
5900 >> Know ‘integral m f = integral m g’
5901 >- (MATCH_MP_TAC integral_cong_AE >> art [] \\
5902     rw [AE_DEF] \\
5903     Q.EXISTS_TAC ‘N1 UNION N2’ \\
5904     CONJ_TAC >- METIS_TAC [NULL_SET_UNION, IN_APP] \\
5905     rw [Abbr ‘N1’, Abbr ‘N2’, Abbr ‘g’, Abbr ‘g1’, Abbr ‘g2’])
5906 >> Rewr'
5907 >> MATCH_MP_TAC integral_add_lemma >> simp []
5908 (* easy goals first *)
5909 >> reverse CONJ_TAC
5910 >- (rw [Abbr ‘g1’, Abbr ‘g2’])
5911 (* integrable m g *)
5912 >> Q.UNABBREV_TAC ‘g’
5913 >> MATCH_MP_TAC integrable_sub
5914 >> rw [Abbr ‘g1’, Abbr ‘g2’]
5915 >> MATCH_MP_TAC pos_not_neginf >> simp []
5916QED
5917
5918Theorem integral_add :
5919    !m f g. measure_space m /\ integrable m f /\ integrable m g /\
5920           (!x. x IN m_space m ==> (f x <> NegInf /\ g x <> NegInf) \/
5921                                   (f x <> PosInf /\ g x <> PosInf)) ==>
5922           (integral m (\x. f x + g x) = integral m f + integral m g)
5923Proof
5924    RW_TAC std_ss []
5925 >> ‘sigma_algebra (measurable_space m)’ by fs [measure_space_def]
5926 >> Know `integral m (\x. f x + g x) =
5927          pos_fn_integral m (\x. fn_plus f x + fn_plus g x) -
5928          pos_fn_integral m (\x. fn_minus f x + fn_minus g x)`
5929 >- (MATCH_MP_TAC integral_add_lemma \\
5930    `!x. 0 <= fn_minus f x + fn_minus g x` by METIS_TAC [FN_MINUS_POS, le_add] \\
5931    `!x. 0 <= fn_plus f x + fn_plus g x` by METIS_TAC [FN_PLUS_POS, le_add] \\
5932     RW_TAC std_ss [FUN_EQ_THM, add_rzero, add_lzero, lt_imp_le, le_refl, le_add,
5933                    integrable_add] >| (* 4 subgoals *)
5934     [ (* goal 1 (of 4) *)
5935       MATCH_MP_TAC integrable_add >> rw [integrable_fn_plus] \\
5936       Q.PAT_X_ASSUM ‘!x. x IN m_space m ==> P \/ Q’ (MP_TAC o (Q.SPEC ‘x’)) \\
5937       RW_TAC std_ss [] >| (* 2 subgoals *)
5938       [ (* goal 1.1 (of 2) *)
5939         DISJ1_TAC \\
5940         CONJ_TAC >> (MATCH_MP_TAC pos_not_neginf >> REWRITE_TAC [FN_PLUS_POS]),
5941         (* goal 1.2 (of 2) *)
5942         DISJ1_TAC \\
5943         CONJ_TAC >> (MATCH_MP_TAC pos_not_neginf >> REWRITE_TAC [FN_PLUS_POS]) ],
5944       (* goal 2 (of 4) *)
5945       METIS_TAC [integrable_fn_minus, integrable_add, FN_MINUS_POS, pos_not_neginf],
5946       (* goal 3 (of 4) *)
5947      `f x + g x = fn_plus f x - fn_minus f x + (fn_plus g x - fn_minus g x)`
5948         by PROVE_TAC [FN_DECOMP] >> POP_ORW \\
5949       Q.PAT_X_ASSUM ‘!x. x IN m_space m ==> P \/ Q’ (MP_TAC o (Q.SPEC ‘x’)) \\
5950       RW_TAC std_ss []
5951       >- (Know ‘fn_minus f x <> PosInf /\ fn_minus g x <> PosInf’
5952           >- (rw [fn_minus_def] >> METIS_TAC [neg_neg, extreal_ainv_def]) >> STRIP_TAC \\
5953          ‘fn_plus f x <> NegInf /\ fn_plus g x <> NegInf’
5954              by PROVE_TAC [FN_PLUS_POS, pos_not_neginf] \\
5955           MATCH_MP_TAC add2_sub2 >> art []) \\
5956       Cases_on ‘fn_minus f x = PosInf’
5957       >- (‘fn_plus f x = 0’ by METIS_TAC [FN_MINUS_INFTY_IMP] >> rw [extreal_ainv_def] \\
5958           ‘fn_plus g x <> PosInf’ by PROVE_TAC [FN_PLUS_NOT_INFTY] \\
5959           ‘fn_plus g x <> NegInf’ by METIS_TAC [pos_not_neginf, FN_PLUS_POS] \\
5960           ‘?r. fn_plus g x = Normal r’ by METIS_TAC [extreal_cases] >> POP_ORW \\
5961           Cases_on ‘fn_minus g x = PosInf’ >- (rw [extreal_sub_def, extreal_add_def]) \\
5962           ‘fn_minus g x <> NegInf’ by METIS_TAC [pos_not_neginf, FN_MINUS_POS] \\
5963           ‘?s. fn_minus g x = Normal s’ by METIS_TAC [extreal_cases] >> POP_ORW \\
5964           rw [extreal_sub_def, extreal_add_def]) \\
5965       Cases_on ‘fn_minus g x = PosInf’
5966       >- (‘fn_plus g x = 0’ by METIS_TAC [FN_MINUS_INFTY_IMP] >> rw [extreal_ainv_def] \\
5967           ‘fn_minus g x <> NegInf’ by METIS_TAC [pos_not_neginf, FN_MINUS_POS] \\
5968           ‘fn_minus f x <> NegInf’ by METIS_TAC [pos_not_neginf, FN_MINUS_POS] \\
5969           ‘?r. fn_minus f x = Normal r’ by METIS_TAC [extreal_cases] >> POP_ORW \\
5970           rw [extreal_add_def, extreal_ainv_def] \\
5971           ‘fn_plus f x <> PosInf’ by PROVE_TAC [FN_PLUS_NOT_INFTY] \\
5972           ‘fn_plus f x <> NegInf’ by METIS_TAC [pos_not_neginf, FN_PLUS_POS] \\
5973           ‘?s. fn_plus f x = Normal s’ by METIS_TAC [extreal_cases] >> POP_ORW \\
5974           rw [extreal_add_def, extreal_sub_def]) \\
5975      ‘fn_plus f x <> NegInf /\ fn_plus g x <> NegInf’
5976          by PROVE_TAC [FN_PLUS_POS, pos_not_neginf] \\
5977       MATCH_MP_TAC add2_sub2 >> art [],
5978       (* goal 4 (of 4) *)
5979       Q.PAT_X_ASSUM ‘!x. x IN m_space m ==> P \/ Q’ (MP_TAC o (Q.SPEC ‘x’)) \\
5980       RW_TAC std_ss [] >| (* 2 subgoals *)
5981       [ (* goal 4.1 (of 2) *)
5982         Know `fn_minus f x <> PosInf /\ fn_minus g x <> PosInf`
5983         >- (rw [fn_minus_def] >> METIS_TAC [neg_neg, extreal_ainv_def]) >> STRIP_TAC \\
5984         PROVE_TAC [add_not_infty],
5985         (* goal 4.2 (of 2) *)
5986         Cases_on ‘fn_minus f x = PosInf’
5987         >- (‘fn_plus f x = 0’ by METIS_TAC [FN_MINUS_INFTY_IMP] \\
5988             ‘fn_plus g x <> PosInf’ by METIS_TAC [FN_PLUS_NOT_INFTY] \\
5989             ‘fn_plus g x <> NegInf’ by METIS_TAC [pos_not_neginf, FN_PLUS_POS] \\
5990             ‘?r. fn_plus g x = Normal r’ by METIS_TAC [extreal_cases] \\
5991             fs [add_lzero]) \\
5992         Cases_on ‘fn_minus g x = PosInf’
5993         >- (‘fn_plus g x = 0’ by METIS_TAC [FN_MINUS_INFTY_IMP] \\
5994             ‘fn_plus f x <> PosInf’ by METIS_TAC [FN_PLUS_NOT_INFTY] \\
5995             ‘fn_plus f x <> NegInf’ by METIS_TAC [pos_not_neginf, FN_PLUS_POS] \\
5996             ‘?r. fn_plus f x = Normal r’ by METIS_TAC [extreal_cases] \\
5997             fs [add_rzero]) \\
5998         PROVE_TAC [add_not_infty] ] ])
5999 >> Rewr
6000 >> Know `pos_fn_integral m (\x. fn_plus f x + fn_plus g x) =
6001          pos_fn_integral m (fn_plus f) + pos_fn_integral m (fn_plus g)`
6002 >- (MATCH_MP_TAC pos_fn_integral_add \\
6003     FULL_SIMP_TAC std_ss [integrable_def] \\
6004     rw [FN_PLUS_POS, IN_MEASURABLE_BOREL_FN_PLUS])
6005 >> Rewr'
6006 >> Know `pos_fn_integral m (\x. fn_minus f x + fn_minus g x) =
6007          pos_fn_integral m (fn_minus f) + pos_fn_integral m (fn_minus g)`
6008 >- (MATCH_MP_TAC pos_fn_integral_add \\
6009     FULL_SIMP_TAC std_ss [integrable_def] \\
6010     rw [FN_MINUS_POS, IN_MEASURABLE_BOREL_FN_MINUS])
6011 >> Rewr'
6012 >> RW_TAC std_ss [integral_def]
6013 >> Know `pos_fn_integral m (fn_plus f) <> NegInf`
6014 >- (MATCH_MP_TAC pos_not_neginf \\
6015     MATCH_MP_TAC pos_fn_integral_pos >> art [FN_PLUS_POS]) >> DISCH_TAC
6016 >> Know `pos_fn_integral m (fn_minus f) <> NegInf`
6017 >- (MATCH_MP_TAC pos_not_neginf \\
6018     MATCH_MP_TAC pos_fn_integral_pos >> art [FN_MINUS_POS]) >> DISCH_TAC
6019 >> Know `pos_fn_integral m (fn_plus g) <> NegInf`
6020 >- (MATCH_MP_TAC pos_not_neginf \\
6021     MATCH_MP_TAC pos_fn_integral_pos >> art [FN_PLUS_POS]) >> DISCH_TAC
6022 >> Know `pos_fn_integral m (fn_minus g) <> NegInf`
6023 >- (MATCH_MP_TAC pos_not_neginf \\
6024     MATCH_MP_TAC pos_fn_integral_pos >> art [FN_MINUS_POS]) >> DISCH_TAC
6025 >> FULL_SIMP_TAC std_ss [integrable_def]
6026 >> Q.ABBREV_TAC `a = pos_fn_integral m (fn_plus f)`
6027 >> Q.ABBREV_TAC `b = pos_fn_integral m (fn_minus f)`
6028 >> Q.ABBREV_TAC `c = pos_fn_integral m (fn_plus g)`
6029 >> Q.ABBREV_TAC `d = pos_fn_integral m (fn_minus g)`
6030 >> ONCE_REWRITE_TAC [EQ_SYM_EQ]
6031 >> MATCH_MP_TAC add2_sub2 >> art []
6032QED
6033
6034(* cf. real_lebesgueTheory.integral_times *)
6035Theorem integral_cmul :
6036    !m f c. measure_space m /\ integrable m f ==>
6037           (integral m (\x. Normal c * f x) = Normal c * integral m f)
6038Proof
6039    RW_TAC std_ss [integral_def,GSYM fn_plus_def,GSYM fn_minus_def]
6040 >> `(\x. fn_plus f x) = fn_plus f` by METIS_TAC []
6041 >> `(\x. fn_minus f x) = fn_minus f` by METIS_TAC []
6042 >> Cases_on `0 <= c`
6043 >- (RW_TAC std_ss [FN_PLUS_CMUL, FN_MINUS_CMUL, FN_PLUS_POS, FN_MINUS_POS,
6044                    pos_fn_integral_cmul] \\
6045     MATCH_MP_TAC (GSYM sub_ldistrib) \\
6046     FULL_SIMP_TAC std_ss [extreal_not_infty, integrable_def, GSYM fn_plus_def,
6047                           GSYM fn_minus_def] \\
6048     METIS_TAC [pos_fn_integral_pos, FN_PLUS_POS, FN_MINUS_POS, lt_infty, lte_trans,
6049                extreal_of_num_def])
6050 >> `c <= 0` by METIS_TAC [REAL_LT_IMP_LE,real_lt]
6051 >> `0 <= -c` by METIS_TAC [REAL_LE_NEG,REAL_NEG_0]
6052 >> RW_TAC std_ss [FN_PLUS_CMUL, FN_MINUS_CMUL, FN_PLUS_POS, FN_MINUS_POS,
6053                   pos_fn_integral_cmul, extreal_ainv_def]
6054 >> RW_TAC std_ss [Once (GSYM eq_neg), GSYM mul_lneg, extreal_ainv_def]
6055 >> FULL_SIMP_TAC std_ss [integrable_def, GSYM fn_plus_def, GSYM fn_minus_def]
6056 >> `pos_fn_integral m (fn_plus f) <> NegInf`
6057      by METIS_TAC [pos_fn_integral_pos, FN_PLUS_POS, lt_infty, lte_trans, extreal_of_num_def]
6058 >> `pos_fn_integral m (fn_minus f) <> NegInf`
6059      by METIS_TAC [pos_fn_integral_pos, FN_MINUS_POS, lt_infty, lte_trans, extreal_of_num_def]
6060 >> FULL_SIMP_TAC std_ss [GSYM sub_ldistrib, extreal_not_infty, GSYM mul_rneg]
6061 >> METIS_TAC [neg_sub]
6062QED
6063
6064Theorem integrable_finite_integral :
6065    !m f. measure_space m /\ integrable m f ==>
6066          integral m f <> PosInf /\ integral m f <> NegInf
6067Proof
6068    rpt GEN_TAC
6069 >> SIMP_TAC std_ss [integral_def, integrable_def]
6070 >> STRIP_TAC
6071 >> Know `pos_fn_integral m (fn_plus f) <> NegInf`
6072 >- (MATCH_MP_TAC pos_not_neginf \\
6073     MATCH_MP_TAC pos_fn_integral_pos >> art [FN_PLUS_POS]) >> DISCH_TAC
6074 >> Know `pos_fn_integral m (fn_minus f) <> NegInf`
6075 >- (MATCH_MP_TAC pos_not_neginf \\
6076     MATCH_MP_TAC pos_fn_integral_pos >> art [FN_MINUS_POS]) >> DISCH_TAC
6077 >> `?r1. pos_fn_integral m (fn_plus f) = Normal r1` by PROVE_TAC [extreal_cases]
6078 >> `?r2. pos_fn_integral m (fn_minus f) = Normal r2` by PROVE_TAC [extreal_cases]
6079 >> ASM_REWRITE_TAC [extreal_sub_def, extreal_not_infty]
6080QED
6081
6082Theorem integral_sub :
6083    !m f g. measure_space m /\ integrable m f /\ integrable m g /\
6084           (!x. x IN m_space m ==> (f x <> NegInf /\ g x <> PosInf) \/
6085                                   (f x <> PosInf /\ g x <> NegInf)) ==>
6086           (integral m (\x. f x - g x) = integral m f - integral m g)
6087Proof
6088    rw [extreal_sub]
6089 >> ‘integrable m (\x. -g x)’ by METIS_TAC [integrable_ainv]
6090 >> Know ‘Normal (-1) * integral m g = integral m (\x. Normal (-1) * g x)’
6091 >- (ONCE_REWRITE_TAC [EQ_SYM_EQ] \\
6092     MATCH_MP_TAC integral_cmul >> art [])
6093 >> rw [GSYM neg_minus1, GSYM extreal_ainv_def, normal_1]
6094 >> HO_MATCH_MP_TAC integral_add >> rw []
6095 >> CCONTR_TAC
6096 >> Cases_on ‘g x’ >> METIS_TAC [extreal_ainv_def, extreal_distinct]
6097QED
6098
6099(* added `measure m s < PosInf` into antecedents, otherwise not true *)
6100Theorem integral_cmul_indicator:
6101    !m s c. measure_space m /\ s IN measurable_sets m /\ measure m s < PosInf ==>
6102           (integral m (\x. Normal c * indicator_fn s x) = Normal c * measure m s)
6103Proof
6104    METIS_TAC [integral_cmul, integral_indicator, integrable_indicator, extreal_mul_def]
6105QED
6106
6107Theorem integral_zero:   !m. measure_space m ==> (integral m (\x. 0) = 0)
6108Proof
6109    RW_TAC std_ss [integral_def, lt_refl, pos_fn_integral_zero, sub_lzero, neg_0,
6110                   fn_plus_def, fn_minus_def]
6111QED
6112
6113(* NOTE: removed “measure m (m_space m) < PosInf” *)
6114Theorem integral_const :
6115    !m c. measure_space m ==>
6116          integral m (\x. Normal c) = Normal c * measure m (m_space m)
6117Proof
6118    rpt STRIP_TAC
6119 >> ‘c = 0 \/ 0 < c \/ c < 0’ by PROVE_TAC [REAL_LT_TOTAL]
6120 >| [ (* goal 1 (of 3) *)
6121      simp [normal_0, integral_zero],
6122      (* goal 2 (of 3) *)
6123      REWRITE_TAC [integral_def] \\
6124     ‘0 <= c’ by simp [REAL_LT_IMP_LE] \\
6125      Know ‘(\x. Normal c)^+ = \x. Normal c’
6126      >- (PURE_REWRITE_TAC [FUN_EQ_THM] \\
6127          Q.X_GEN_TAC ‘x’ \\
6128          MATCH_MP_TAC FN_PLUS_REDUCE \\
6129          simp [extreal_of_num_def, extreal_le_eq]) >> Rewr' \\
6130      Know ‘(\x. Normal c)^- = \x. 0’
6131      >- (rw [FUN_EQ_THM] \\
6132          MATCH_MP_TAC FN_MINUS_REDUCE \\
6133          simp [extreal_of_num_def, extreal_le_eq]) >> Rewr' \\
6134      simp [pos_fn_integral_const, pos_fn_integral_zero],
6135      (* goal 3 (of 3) *)
6136      REWRITE_TAC [integral_def] \\
6137     ‘c <= 0’ by simp [REAL_LT_IMP_LE] \\
6138      Know ‘(\x. Normal c)^+ = \x. 0’
6139      >- (rw [FUN_EQ_THM] \\
6140          MATCH_MP_TAC FN_PLUS_REDUCE' \\
6141          simp [extreal_of_num_def, extreal_le_eq]) >> Rewr' \\
6142      Know ‘(\x. Normal c)^- = \x. Normal (-c)’
6143      >- (rw [FUN_EQ_THM, GSYM extreal_ainv_def] \\
6144         ‘-Normal c = -((\x. Normal c) x)’ by simp [] >> POP_ORW \\
6145          MATCH_MP_TAC FN_MINUS_REDUCE' \\
6146          simp [extreal_of_num_def, extreal_le_eq]) >> Rewr' \\
6147      simp [pos_fn_integral_const, pos_fn_integral_zero] \\
6148      simp [GSYM extreal_ainv_def, mul_lneg, neg_neg] ]
6149QED
6150
6151Theorem integral_cmul_infty:
6152    !m s. measure_space m /\ s IN measurable_sets m ==>
6153         (integral m (\x. PosInf * indicator_fn s x) = PosInf * (measure m s))
6154Proof
6155    rpt STRIP_TAC
6156 >> Know `integral m (\x. PosInf) = integral m (\x. (\x. PosInf) x * indicator_fn (m_space m) x)`
6157 >- (MATCH_MP_TAC integral_mspace >> art []) >> Rewr'
6158 >> Know `integral m (\x. PosInf * indicator_fn s x) =
6159   pos_fn_integral m (\x. PosInf * indicator_fn s x)`
6160 >- (MATCH_MP_TAC integral_pos_fn >> RW_TAC std_ss [] \\
6161     MATCH_MP_TAC le_mul >> REWRITE_TAC [INDICATOR_FN_POS] \\
6162     REWRITE_TAC [extreal_of_num_def, le_infty]) >> Rewr'
6163 >> MATCH_MP_TAC pos_fn_integral_cmul_infty >> art []
6164QED
6165
6166Theorem integral_cmul_infty' :
6167    !m s. measure_space m /\ s IN measurable_sets m ==>
6168         (integral m (\x. NegInf * indicator_fn s x) = NegInf * (measure m s))
6169Proof
6170    rpt STRIP_TAC
6171 >> Know `integral m (\x. PosInf) = integral m (\x. (\x. PosInf) x * indicator_fn (m_space m) x)`
6172 >- (MATCH_MP_TAC integral_mspace >> art [])
6173 >> Rewr'
6174 >> REWRITE_TAC [integral_def]
6175 >> Know ‘pos_fn_integral m (\x. NegInf * indicator_fn s x)^+ = pos_fn_integral m (\x. 0)’
6176 >- (MATCH_MP_TAC pos_fn_integral_cong \\
6177     rw [FN_PLUS_ALT, le_max] \\
6178     rw [indicator_fn_def])
6179 >> Rewr'
6180 >> Know ‘pos_fn_integral m (\x. NegInf * indicator_fn s x)^- =
6181          pos_fn_integral m (\x. PosInf * indicator_fn s x)’
6182 >- (MATCH_MP_TAC pos_fn_integral_cong \\
6183     rw [fn_minus_def, GSYM mul_lneg, extreal_ainv_def] >| (* 3 subgoals *)
6184     [ (* goal 1 (of 3) *)
6185       MATCH_MP_TAC le_mul >> rw [le_infty, INDICATOR_FN_POS],
6186       (* goal 2 (of 3) *)
6187       MATCH_MP_TAC le_mul >> rw [le_infty, INDICATOR_FN_POS],
6188       (* goal 3 (of 3) *)
6189       fs [extreal_lt_def] \\
6190       STRIP_ASSUME_TAC (Q.SPECL [‘s’, ‘x’] indicator_fn_normal) \\
6191       FULL_SIMP_TAC std_ss [extreal_mul_def, le_infty, extreal_of_num_def, extreal_11] \\
6192       Cases_on ‘r = 0’ >- rw [] \\
6193      ‘0 < r’ by PROVE_TAC [REAL_LE_LT] \\
6194       FULL_SIMP_TAC std_ss [le_infty, extreal_not_infty] ])
6195 >> Rewr'
6196 >> ASM_SIMP_TAC std_ss [pos_fn_integral_zero, sub_lzero]
6197 >> Know ‘pos_fn_integral m (\x. PosInf * indicator_fn s x) = PosInf * measure m s’
6198 >- (MATCH_MP_TAC pos_fn_integral_cmul_infty >> art [])
6199 >> Rewr'
6200 >> rw [GSYM mul_lneg, extreal_ainv_def]
6201QED
6202
6203Theorem integral_posinf:
6204    !m. measure_space m /\ 0 < measure m (m_space m) ==> (integral m (\x. PosInf) = PosInf)
6205Proof
6206    rpt STRIP_TAC
6207 >> Know `integral m (\x. PosInf) =
6208          integral m (\x. (\x. PosInf) x * indicator_fn (m_space m) x)`
6209 >- (MATCH_MP_TAC integral_mspace >> art [])
6210 >> Rewr' >> BETA_TAC
6211 >> Know `integral m (\x. PosInf * indicator_fn (m_space m) x) = PosInf * (measure m (m_space m))`
6212 >- (MATCH_MP_TAC integral_cmul_infty >> art [] \\
6213     MATCH_MP_TAC MEASURE_SPACE_MSPACE_MEASURABLE >> art []) >> Rewr'
6214 >> Cases_on `measure m (m_space m) = PosInf`
6215 >- (POP_ORW >> REWRITE_TAC [extreal_mul_def])
6216 >> METIS_TAC [mul_infty]
6217QED
6218
6219Theorem integral_neginf :
6220    !m. measure_space m /\ 0 < measure m (m_space m) ==> (integral m (\x. NegInf) = NegInf)
6221Proof
6222    rpt STRIP_TAC
6223 >> Know `integral m (\x. NegInf) =
6224          integral m (\x. (\x. NegInf) x * indicator_fn (m_space m) x)`
6225 >- (MATCH_MP_TAC integral_mspace >> art [])
6226 >> Rewr' >> BETA_TAC
6227 >> Know `integral m (\x. NegInf * indicator_fn (m_space m) x) = NegInf * (measure m (m_space m))`
6228 >- (MATCH_MP_TAC integral_cmul_infty' >> art [] \\
6229     MATCH_MP_TAC MEASURE_SPACE_MSPACE_MEASURABLE >> art [])
6230 >> Rewr'
6231 >> Cases_on `measure m (m_space m) = PosInf`
6232 >- (POP_ORW >> REWRITE_TAC [extreal_mul_def])
6233 >> METIS_TAC [mul_infty]
6234QED
6235
6236Theorem integral_indicator_pow_eq:
6237    !m s n. measure_space m /\ s IN measurable_sets m /\ 0 < n ==>
6238           (integral m (\x. (indicator_fn s x) pow n) = integral m (indicator_fn s))
6239Proof
6240    rpt STRIP_TAC
6241 >> MATCH_MP_TAC integral_cong
6242 >> RW_TAC std_ss [indicator_fn_def, one_pow, zero_pow]
6243QED
6244
6245Theorem integral_indicator_pow:
6246    !m s n. measure_space m /\ s IN measurable_sets m /\ 0 < n ==>
6247           (integral m (\x. (indicator_fn s x) pow n) = measure m s)
6248Proof
6249    rpt STRIP_TAC
6250 >> Suff `integral m (\x. (indicator_fn s x) pow n) = integral m (indicator_fn s)`
6251 >- (Rewr' >> MATCH_MP_TAC integral_indicator >> art [])
6252 >> MATCH_MP_TAC integral_indicator_pow_eq >> art []
6253QED
6254
6255(* added `integrable f1 /\ integrable f2` into antecedents *)
6256Theorem integral_mono :
6257    !m f1 f2. measure_space m /\ integrable m f1 /\ integrable m f2 /\
6258             (!x. x IN m_space m ==> f1 x <= f2 x) ==>
6259              integral m f1 <= integral m f2
6260Proof
6261    RW_TAC std_ss []
6262 >> ONCE_REWRITE_TAC [(UNDISCH o Q.SPECL [`m`,`f`]) integral_mspace]
6263 >> RW_TAC std_ss [integral_def]
6264 >> `!x. (fn_plus (\x. f1 x * indicator_fn (m_space m) x)) x <=
6265         (fn_plus (\x. f2 x * indicator_fn (m_space m) x)) x`
6266       by (RW_TAC real_ss [fn_plus_def, lt_imp_le, le_refl, indicator_fn_def, mul_rzero, mul_rone]
6267           >> METIS_TAC [extreal_lt_def, mul_rone, lt_imp_le, le_trans])
6268 >> `!x. (fn_minus (\x. f2 x * indicator_fn (m_space m) x)) x <=
6269         (fn_minus (\x. f1 x * indicator_fn (m_space m) x)) x`
6270       by (RW_TAC real_ss [fn_minus_def, lt_imp_le, le_refl, indicator_fn_def, mul_rzero,
6271                           mul_rone, neg_0, neg_eq0, le_neg]
6272           >> METIS_TAC [mul_rone, extreal_lt_def, le_trans, lt_neg, lt_imp_le, neg_0])
6273 >> fs [integrable_def]
6274 (* preparing for applying "extreal_sub_add" *)
6275 >> Know `pos_fn_integral m (fn_plus (\x. f1 x * indicator_fn (m_space m) x)) <> NegInf`
6276 >- (MATCH_MP_TAC pos_not_neginf \\
6277     MATCH_MP_TAC pos_fn_integral_pos >> art [] \\
6278     REWRITE_TAC [FN_PLUS_POS]) >> DISCH_TAC
6279 >> Know `pos_fn_integral m (fn_plus (\x. f2 x * indicator_fn (m_space m) x)) <> NegInf`
6280 >- (MATCH_MP_TAC pos_not_neginf \\
6281     MATCH_MP_TAC pos_fn_integral_pos >> art [] \\
6282     REWRITE_TAC [FN_PLUS_POS]) >> DISCH_TAC
6283 >> Know `pos_fn_integral m (fn_minus (\x. f1 x * indicator_fn (m_space m) x)) <> PosInf`
6284 >- (Suff `pos_fn_integral m (fn_minus (\x. f1 x * indicator_fn (m_space m) x)) =
6285           pos_fn_integral m (fn_minus f1)` >- METIS_TAC [] \\
6286     MATCH_MP_TAC EQ_SYM \\
6287     Suff `fn_minus (\x. f1 x * indicator_fn (m_space m) x) =
6288           (\x. fn_minus f1 x * indicator_fn (m_space m) x)`
6289     >- (Rewr >> MATCH_MP_TAC pos_fn_integral_mspace >> art [FN_MINUS_POS]) \\
6290     ONCE_REWRITE_TAC [mul_comm] \\
6291     MATCH_MP_TAC FN_MINUS_FMUL >> REWRITE_TAC [INDICATOR_FN_POS]) >> DISCH_TAC
6292 >> Know `pos_fn_integral m (fn_minus (\x. f2 x * indicator_fn (m_space m) x)) <> PosInf`
6293 >- (Suff `pos_fn_integral m (fn_minus (\x. f2 x * indicator_fn (m_space m) x)) =
6294           pos_fn_integral m (fn_minus f2)` >- METIS_TAC [] \\
6295     MATCH_MP_TAC EQ_SYM \\
6296     Suff `fn_minus (\x. f2 x * indicator_fn (m_space m) x) =
6297           (\x. fn_minus f2 x * indicator_fn (m_space m) x)`
6298     >- (Rewr >> MATCH_MP_TAC pos_fn_integral_mspace >> art [FN_MINUS_POS]) \\
6299     ONCE_REWRITE_TAC [mul_comm] \\
6300     MATCH_MP_TAC FN_MINUS_FMUL >> REWRITE_TAC [INDICATOR_FN_POS]) >> DISCH_TAC
6301 >> `pos_fn_integral m (fn_plus (\x. f1 x * indicator_fn (m_space m) x)) -
6302     pos_fn_integral m (fn_minus (\x. f1 x * indicator_fn (m_space m) x)) =
6303     pos_fn_integral m (fn_plus (\x. f1 x * indicator_fn (m_space m) x)) +
6304    -pos_fn_integral m (fn_minus (\x. f1 x * indicator_fn (m_space m) x))`
6305      by PROVE_TAC [extreal_sub_add] >> POP_ORW
6306 >> `pos_fn_integral m (fn_plus (\x. f2 x * indicator_fn (m_space m) x)) -
6307     pos_fn_integral m (fn_minus (\x. f2 x * indicator_fn (m_space m) x)) =
6308     pos_fn_integral m (fn_plus (\x. f2 x * indicator_fn (m_space m) x)) +
6309    -pos_fn_integral m (fn_minus (\x. f2 x * indicator_fn (m_space m) x))`
6310      by PROVE_TAC [extreal_sub_add] >> POP_ORW
6311 >> MATCH_MP_TAC le_add2
6312 >> CONJ_TAC
6313 >- (MATCH_MP_TAC pos_fn_integral_mono >> simp [FN_PLUS_POS])
6314 >> REWRITE_TAC [le_neg]
6315 >> MATCH_MP_TAC pos_fn_integral_mono
6316 >> simp [FN_MINUS_POS]
6317QED
6318
6319Theorem integrable_sum :
6320    !m f s. FINITE s /\ measure_space m /\ (!i. i IN s ==> integrable m (f i)) /\
6321            (!i x. i IN s /\ x IN m_space m ==>
6322                   f i x <> PosInf /\ f i x <> NegInf) ==>
6323            integrable m (\x. SIGMA (\i. f i x) s)
6324Proof
6325    Suff `!s:'b->bool.
6326            FINITE s ==>
6327              (\s:'b->bool. !m f. measure_space m /\ (!i. i IN s ==> integrable m (f i)) /\
6328                                  (!x i. i IN s /\ x IN m_space m ==>
6329                                         f i x <> PosInf /\ f i x <> NegInf)
6330                              ==> integrable m (\x. SIGMA (\i. f i x) s)) s`
6331 >- METIS_TAC []
6332 >> MATCH_MP_TAC FINITE_INDUCT
6333 >> RW_TAC std_ss [EXTREAL_SUM_IMAGE_EMPTY, integrable_zero]
6334 >> Know `!x. x IN m_space m ==>
6335              SIGMA (\i. f i x) (e INSERT s) = f e x + (\x. SIGMA (\i. f i x) s) x`
6336 >- (RW_TAC std_ss [] \\
6337     (MP_TAC o Q.SPEC `e` o UNDISCH o Q.SPECL [`(\i. f i x)`,`s`] o
6338      INST_TYPE [alpha |-> beta]) EXTREAL_SUM_IMAGE_PROPERTY \\
6339    `!i x. i IN e INSERT s /\ x IN m_space m ==> (\i. f i x) i <> NegInf`
6340        by RW_TAC std_ss [] \\
6341     FULL_SIMP_TAC std_ss [DELETE_NON_ELEMENT]) >> DISCH_TAC
6342 >> MATCH_MP_TAC integrable_eq
6343 >> Q.EXISTS_TAC ‘\x. f e x + (\x. SIGMA (\i. f i x) s) x’ >> art []
6344 >> reverse CONJ_TAC >- simp []
6345 >> MATCH_MP_TAC integrable_add >> art []
6346 >> CONJ_TAC >- fs [IN_INSERT]
6347 >> CONJ_TAC
6348 >- (FIRST_X_ASSUM MATCH_MP_TAC >> fs [IN_INSERT])
6349 >> RW_TAC std_ss [IN_INSERT]
6350 >> DISJ1_TAC
6351 >> MATCH_MP_TAC EXTREAL_SUM_IMAGE_NOT_NEGINF >> fs [IN_INSERT]
6352QED
6353
6354Theorem integral_sum :
6355    !m f s. FINITE s /\ measure_space m /\ (!i. i IN s ==> integrable m (f i)) /\
6356            (!x i. i IN s /\ x IN m_space m ==>
6357                   f i x <> PosInf /\ f i x <> NegInf) ==>
6358            (integral m (\x. SIGMA (\i. (f i) x) s) = SIGMA (\i. integral m (f i)) s)
6359Proof
6360    Suff `!s. FINITE (s :'b set) ==>
6361             (\s. !m f. measure_space m /\ (!i. i IN s ==> integrable m (f i)) /\
6362                       (!x i. i IN s /\ x IN m_space m ==>
6363                              f i x <> PosInf /\ f i x <> NegInf) ==>
6364                        integral m (\x. SIGMA (\i. (f i) x) s) =
6365                        SIGMA (\i. integral m (f i)) s) s`
6366 >- METIS_TAC []
6367 >> MATCH_MP_TAC FINITE_INDUCT
6368 >> RW_TAC std_ss [EXTREAL_SUM_IMAGE_EMPTY, integral_zero]
6369 >> Know `!x. x IN m_space m ==>
6370              SIGMA (\i. f i x) (e INSERT s) = f e x + SIGMA (\i. f i x) s`
6371 >- (RW_TAC std_ss [] \\
6372     (MP_TAC o Q.SPEC `e` o UNDISCH o Q.SPECL [`(\i. f i x)`,`s`] o
6373      INST_TYPE [alpha |-> beta]) EXTREAL_SUM_IMAGE_PROPERTY \\
6374    `!i. i IN e INSERT s ==> (\i. f i x) i <> NegInf` by RW_TAC std_ss [] \\
6375     FULL_SIMP_TAC std_ss [DELETE_NON_ELEMENT]) >> DISCH_TAC
6376 >> Know ‘integral m (\x. SIGMA (\i. f i x) (e INSERT s)) =
6377          integral m (\x. f e x + SIGMA (\i. f i x) s)’
6378 >- (MATCH_MP_TAC integral_cong >> simp []) >> Rewr'
6379 >> `integral m (\x. f e x + SIGMA (\i. f i x) s) =
6380     integral m (\x. f e x + (\x. SIGMA (\i. f i x) s) x)` by METIS_TAC [] >> POP_ORW
6381 >> Know `integral m (\x. f e x + (\x. SIGMA (\i. f i x) s) x) =
6382          integral m (f e) + integral m (\x. SIGMA (\i. f i x) s)`
6383 >- (MATCH_MP_TAC integral_add >> fs [IN_INSERT] \\
6384     MATCH_MP_TAC integrable_sum >> METIS_TAC []) >> Rewr'
6385 >> Know `integral m (\x. SIGMA (\i. f i x) s) = SIGMA (\i. integral m (f i)) s`
6386 >- (FIRST_X_ASSUM MATCH_MP_TAC >> fs [IN_INSERT]) >> Rewr'
6387 >> (MP_TAC o Q.SPEC `e` o UNDISCH o Q.SPECL [`(\i. integral m (f i))`,`s`] o
6388     INST_TYPE [alpha |-> beta]) EXTREAL_SUM_IMAGE_PROPERTY
6389 >> Know `!x. x IN e INSERT s ==> (\i. integral m (f i)) x <> NegInf`
6390 >- (RW_TAC std_ss [] >> METIS_TAC [integrable_finite_integral])
6391 >> RW_TAC std_ss []
6392 >> FULL_SIMP_TAC std_ss [DELETE_NON_ELEMENT]
6393QED
6394
6395(* general case: `(m_space m)` can be infinite but `IMAGE f (m_space)` is finite.
6396   e.g. m_space m = univ(:real) but f() only takes values from a finite set.
6397
6398   added `integrable m f` into antecedents, otherwise `integral m f` is not defined;
6399   added `measure m (m_space m) < PosInf` into antecedents
6400 *)
6401Theorem finite_support_integral_reduce :
6402    !m f. measure_space m /\ f IN measurable (m_space m,measurable_sets m) Borel /\
6403         (!x. x IN m_space m ==> f x <> NegInf /\ f x <> PosInf) /\
6404          FINITE (IMAGE f (m_space m)) /\
6405          integrable m f /\ measure m (m_space m) < PosInf ==>
6406         (integral m f = finite_space_integral m f)
6407Proof
6408    rpt STRIP_TAC
6409 >> ‘sigma_algebra (measurable_space m)’ by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA]
6410 >> `?c1 n. BIJ c1 (count n) (IMAGE f (m_space m))`
6411       by RW_TAC std_ss [GSYM FINITE_BIJ_COUNT_EQ]
6412 >> `?c. !i. (i IN count n ==> (c1 i = Normal (c i)))`
6413       by (Q.EXISTS_TAC `\i. @r. c1 i = Normal r`
6414           >> RW_TAC std_ss []
6415           >> SELECT_ELIM_TAC
6416           >> RW_TAC std_ss []
6417           >> FULL_SIMP_TAC std_ss [BIJ_DEF, INJ_DEF, SURJ_DEF, IN_IMAGE]
6418           >> `?t. (c1 i = f t) /\ t IN m_space m` by METIS_TAC []
6419           >> METIS_TAC [extreal_cases])
6420 >> `FINITE (count n)` by RW_TAC std_ss [FINITE_COUNT]
6421 >> `!i j. i <> j /\ (i IN count n) /\ (j IN count n) ==>
6422           DISJOINT (PREIMAGE f {Normal (c i)}) (PREIMAGE f {Normal (c j)})`
6423        by (RW_TAC std_ss [DISJOINT_DEF, EXTENSION, IN_PREIMAGE, IN_INTER, NOT_IN_EMPTY,
6424                           IN_SING]
6425            >> FULL_SIMP_TAC std_ss [BIJ_DEF, INJ_DEF, SURJ_DEF, IN_IMAGE]
6426            >> METIS_TAC [])
6427 >> `!i. PREIMAGE f {Normal (c i)} INTER m_space m IN measurable_sets m`
6428      by (RW_TAC std_ss []
6429          >> `PREIMAGE f {Normal (c i)} = {x | f x = Normal (c i)}`
6430              by RW_TAC std_ss [EXTENSION,IN_PREIMAGE,GSPECIFICATION,IN_SING]
6431          >> METIS_TAC [IN_MEASURABLE_BOREL_ALL, integrable_def, space_def, m_space_def,
6432                        subsets_def, measurable_sets_def])
6433 >> Know `pos_simple_fn m (fn_plus f)
6434            (count n) (\i. PREIMAGE f {Normal (c i)} INTER m_space m)
6435            (\i. if 0 <= (c i) then c i else 0)`
6436 >- (RW_TAC std_ss [pos_simple_fn_def, FINITE_COUNT, FN_PLUS_POS,
6437                    FN_MINUS_POS] >| (* 4 subgoals *)
6438     [ (* goal 1 (of 4) *)
6439       reverse (RW_TAC real_ss [fn_plus_def])
6440       >- (FULL_SIMP_TAC std_ss [extreal_lt_def, indicator_fn_def, IN_INTER]
6441           >> (MP_TAC o Q.SPEC `(\i. Normal (if 0 <= c i then c i else 0) *
6442                                    if t IN PREIMAGE f {Normal (c i)} then 1 else 0)` o
6443               UNDISCH o Q.ISPEC `count n`) EXTREAL_SUM_IMAGE_IN_IF
6444           >> Know `(!x. x IN count n ==>
6445                         (\i. Normal (if 0 <= c i then c i else 0) *
6446                              if t IN PREIMAGE f {Normal (c i)} then 1 else 0) x <> NegInf)`
6447           >- (GEN_TAC >> DISCH_TAC >> BETA_TAC \\
6448               MATCH_MP_TAC pos_not_neginf \\
6449               Cases_on `~(0 <= c x)` >- fs [GSYM extreal_of_num_def, mul_lzero, le_refl] \\
6450               fs [] \\
6451               Cases_on `t NOTIN (PREIMAGE f {Normal (c x)})` >- fs [mul_rzero, le_refl] \\
6452               fs [mul_rone] >> fs [extreal_le_eq, extreal_of_num_def])
6453           >> RW_TAC std_ss [] >> POP_ASSUM K_TAC
6454           >> Suff `(\x. if x IN count n then Normal (if 0 <= c x then c x else 0) *
6455                       if t IN PREIMAGE f {Normal (c x)} then 1 else 0 else 0) =
6456                    (\x. 0)`
6457           >- RW_TAC std_ss [EXTREAL_SUM_IMAGE_ZERO]
6458           >> RW_TAC std_ss [FUN_EQ_THM]
6459           >> Cases_on `~(x IN count n)` >- RW_TAC std_ss []
6460           >> reverse (RW_TAC std_ss [mul_rone, mul_rzero])
6461           >- RW_TAC std_ss [extreal_of_num_def]
6462           >> FULL_SIMP_TAC std_ss [BIJ_DEF, INJ_DEF, SURJ_DEF, IN_COUNT, IN_IMAGE,
6463                                    IN_PREIMAGE, IN_SING]
6464           >> METIS_TAC [le_antisym, extreal_le_def, extreal_of_num_def])
6465       >> FULL_SIMP_TAC std_ss [BIJ_DEF, INJ_DEF, SURJ_DEF, IN_IMAGE]
6466       >> `?i. i IN count n /\ (f t = Normal (c i))` by METIS_TAC []
6467       >> `count n = i INSERT ((count n) DELETE i)`
6468            by (RW_TAC std_ss [EXTENSION, IN_INSERT, IN_DELETE] >> METIS_TAC [])
6469       >> POP_ORW
6470       >> Know `!x. x IN (i INSERT count n DELETE i) ==>
6471                   (\i. Normal (if 0 <= c i then c i else 0) *
6472                        indicator_fn (PREIMAGE f {Normal (c i)} INTER m_space m) t) x <> NegInf`
6473       >- (GEN_TAC >> DISCH_TAC >> BETA_TAC \\
6474           MATCH_MP_TAC pos_not_neginf \\
6475          `0 <= indicator_fn (PREIMAGE f {Normal (c x)} INTER m_space m) t`
6476                by PROVE_TAC [INDICATOR_FN_POS] \\
6477           Suff `0 <= Normal (if 0 <= c x then c x else 0)` >- PROVE_TAC [le_mul] \\
6478           Suff `0 <= if 0 <= c x then c x else 0`
6479           >- PROVE_TAC [extreal_of_num_def, extreal_le_eq] \\
6480           Cases_on `0 <= c x` >> RW_TAC real_ss [])
6481       >> reverse (RW_TAC std_ss [EXTREAL_SUM_IMAGE_THM, FINITE_DELETE, GSYM extreal_of_num_def,
6482                   mul_lzero, DELETE_DELETE, add_lzero])
6483       >- METIS_TAC [extreal_of_num_def, extreal_lt_eq, lt_antisym, real_lt]
6484       >> RW_TAC std_ss [indicator_fn_def, IN_INTER, DELETE_DELETE, mul_rzero, add_lzero,
6485                         IN_PREIMAGE, IN_SING, mul_rone]
6486       >> Suff `SIGMA (\i'. Normal (if 0 <= c i' then c i' else 0) *
6487                            if c i = c i' then 1 else 0) (count n DELETE i) = 0`
6488       >- RW_TAC std_ss [add_rzero]
6489       >> MATCH_MP_TAC EXTREAL_SUM_IMAGE_0
6490       >> reverse (RW_TAC std_ss [FINITE_DELETE, mul_rone, mul_rzero])
6491       >- RW_TAC std_ss [extreal_of_num_def]
6492       >> METIS_TAC [IN_DELETE],
6493       (* goal 2 (of 4) *)
6494       RW_TAC real_ss [],
6495       (* goal 3 (of 4) *)
6496       FULL_SIMP_TAC std_ss [DISJOINT_DEF, IN_INTER, NOT_IN_EMPTY, IN_PREIMAGE, EXTENSION, IN_SING]
6497       >> METIS_TAC [],
6498       (* goal 4 (of 4) *)
6499       RW_TAC std_ss [EXTENSION, IN_BIGUNION_IMAGE, IN_PREIMAGE, IN_SING, IN_INTER]
6500       >> FULL_SIMP_TAC std_ss [BIJ_DEF, INJ_DEF, SURJ_DEF]
6501       >> METIS_TAC [IN_IMAGE] ])
6502 >> DISCH_TAC
6503 >> Know `pos_simple_fn m (fn_minus f)
6504            (count n) (\i. PREIMAGE f {Normal (c i)} INTER m_space m)
6505            (\i. if c i <= 0 then ~(c i) else 0)`
6506 >- (RW_TAC std_ss [pos_simple_fn_def, FINITE_COUNT, FN_PLUS_POS, FN_MINUS_POS] >| (* 4 subgoals *)
6507     [ (* goal 1 (of 4) *)
6508       reverse (RW_TAC real_ss [fn_minus_def])
6509       >- (FULL_SIMP_TAC std_ss [extreal_lt_def, indicator_fn_def, IN_INTER]
6510           >> (MP_TAC o Q.SPEC `(\i. Normal (if c i <= 0 then -c i else 0) *
6511                                     if t IN PREIMAGE f {Normal (c i)} then 1 else 0)` o
6512               UNDISCH o Q.ISPEC `count n`) EXTREAL_SUM_IMAGE_IN_IF
6513           >> Know `(!x. x IN count n ==>
6514                        (\i. Normal (if c i <= 0 then (-c i) else 0) *
6515                             if t IN PREIMAGE f {Normal (c i)} then 1 else 0) x <> NegInf)`
6516           >- (GEN_TAC >> DISCH_TAC >> BETA_TAC \\
6517               MATCH_MP_TAC pos_not_neginf \\
6518               Cases_on `~(c x <= 0)` >- fs [GSYM extreal_of_num_def, mul_lzero, le_refl] \\
6519               fs [] \\
6520               Cases_on `t NOTIN (PREIMAGE f {Normal (c x)})` >- fs [mul_rzero, le_refl] \\
6521               fs [mul_rone] >> fs [extreal_le_eq, extreal_of_num_def])
6522           >> RW_TAC std_ss [] >> POP_ASSUM K_TAC
6523           >> Suff `(\x. if x IN count n then Normal (if c x <= 0 then -c x else 0) *
6524                         if t IN PREIMAGE f {Normal (c x)} then 1 else 0 else 0) = (\x. 0)`
6525           >- RW_TAC std_ss [EXTREAL_SUM_IMAGE_ZERO]
6526           >> RW_TAC std_ss [FUN_EQ_THM]
6527           >> Cases_on `~(x IN count n)`
6528           >- RW_TAC std_ss []
6529           >> reverse (RW_TAC std_ss [mul_rone, mul_rzero])
6530           >- RW_TAC std_ss [extreal_of_num_def]
6531           >> FULL_SIMP_TAC std_ss [BIJ_DEF, INJ_DEF, SURJ_DEF, IN_COUNT, IN_IMAGE,
6532                                    IN_PREIMAGE, IN_SING]
6533           >> METIS_TAC [REAL_LE_ANTISYM, extreal_of_num_def, REAL_NEG_0,
6534                         extreal_le_def, IN_COUNT])
6535       >> FULL_SIMP_TAC std_ss [BIJ_DEF, INJ_DEF, SURJ_DEF, IN_IMAGE]
6536       >> `?i. i IN count n /\ (f t = Normal (c i))` by METIS_TAC []
6537       >> `count n = i INSERT ((count n) DELETE i)`
6538            by (RW_TAC std_ss [EXTENSION, IN_INSERT, IN_DELETE] >> METIS_TAC [])
6539       >> POP_ORW
6540       >> Know `!x. x IN (i INSERT count n DELETE i) ==>
6541                   (\i. Normal (if c i <= 0 then (-c i) else 0) *
6542                        indicator_fn (PREIMAGE f {Normal (c i)} INTER m_space m) t) x <> NegInf`
6543       >- (GEN_TAC >> DISCH_TAC >> BETA_TAC \\
6544           MATCH_MP_TAC pos_not_neginf \\
6545          `0 <= indicator_fn (PREIMAGE f {Normal (c x)} INTER m_space m) t`
6546                by PROVE_TAC [INDICATOR_FN_POS] \\
6547           Suff `0 <= Normal (if c x <= 0 then (-c x) else 0)` >- PROVE_TAC [le_mul] \\
6548           Suff `0 <= if c x <= 0 then (-c x) else 0`
6549           >- PROVE_TAC [extreal_of_num_def, extreal_le_eq] \\
6550           Cases_on `c x <= 0` >> fs [] >> PROVE_TAC [])
6551       >> reverse (RW_TAC std_ss [EXTREAL_SUM_IMAGE_THM, FINITE_DELETE, GSYM extreal_of_num_def,
6552                                  mul_lzero, DELETE_DELETE, add_lzero])
6553       >- METIS_TAC [extreal_lt_eq, real_lt, extreal_of_num_def, lt_antisym]
6554       >> RW_TAC std_ss [indicator_fn_def, IN_INTER, DELETE_DELETE, mul_rzero,
6555                         add_lzero, IN_PREIMAGE, IN_SING, mul_rone]
6556       >> Suff `SIGMA (\i'. Normal (if c i' <= 0 then -c i' else 0) *
6557                            if c i = c i' then 1 else 0) (count n DELETE i) = 0`
6558       >- METIS_TAC [add_rzero, extreal_ainv_def]
6559       >> MATCH_MP_TAC EXTREAL_SUM_IMAGE_0
6560       >> reverse (RW_TAC std_ss [FINITE_DELETE, mul_rone, mul_rzero])
6561       >- RW_TAC std_ss [extreal_of_num_def]
6562       >> METIS_TAC [IN_DELETE],
6563       (* goal 2 (of 4) *)
6564       RW_TAC real_ss [] >> METIS_TAC [REAL_LE_NEG, REAL_NEG_0],
6565       (* goal 3 (of 4) *)
6566       FULL_SIMP_TAC std_ss [DISJOINT_DEF, IN_INTER, NOT_IN_EMPTY, IN_PREIMAGE, EXTENSION, IN_SING]
6567       >> METIS_TAC [],
6568       (* goal 4 (of 4) *)
6569       RW_TAC std_ss [EXTENSION, IN_BIGUNION_IMAGE, IN_PREIMAGE, IN_SING, IN_INTER]
6570       >> FULL_SIMP_TAC std_ss [BIJ_DEF, INJ_DEF, SURJ_DEF]
6571       >> METIS_TAC [IN_IMAGE] ])
6572 >> DISCH_TAC
6573 >> RW_TAC std_ss [finite_space_integral_def]
6574 >> `pos_fn_integral m (fn_plus f) =
6575     pos_simple_fn_integral m (count n) (\i. PREIMAGE f {Normal (c i)} INTER m_space m)
6576                              (\i. if 0 <= c i then c i else 0)`
6577            by METIS_TAC [pos_fn_integral_pos_simple_fn]
6578 >> `pos_fn_integral m (fn_minus f) =
6579     pos_simple_fn_integral m (count n) (\i. PREIMAGE f {Normal (c i)} INTER m_space m)
6580                              (\i. if c i <= 0 then -c i else 0)`
6581            by METIS_TAC [pos_fn_integral_pos_simple_fn]
6582 >> FULL_SIMP_TAC std_ss [integral_def, pos_simple_fn_integral_def]
6583 >> Know `!x. (PREIMAGE f {x}) INTER (m_space m) IN (measurable_sets m)`
6584 >- (fs [IN_MEASURABLE, space_def, subsets_def] \\
6585     GEN_TAC >> FIRST_X_ASSUM MATCH_MP_TAC \\
6586     REWRITE_TAC [BOREL_MEASURABLE_SETS_SING])
6587 >> DISCH_TAC
6588 >> Know `!x. measure m (PREIMAGE f {x} INTER m_space m) < PosInf`
6589 >- (GEN_TAC >> MATCH_MP_TAC let_trans \\
6590     Q.EXISTS_TAC `measure m (m_space m)` >> art [] \\
6591     MATCH_MP_TAC INCREASING >> art [INTER_SUBSET] \\
6592     PROVE_TAC [MEASURE_SPACE_MSPACE_MEASURABLE, MEASURE_SPACE_INCREASING])
6593 >> DISCH_TAC
6594 (* applying EXTREAL_SUM_IMAGE_SUB *)
6595 >> Know `SIGMA (\i. Normal (if 0 <= c i then c i else 0) *
6596                     measure m (PREIMAGE f {Normal (c i)} INTER m_space m)) (count n) -
6597          SIGMA (\i. Normal (if c i <= 0 then (-c i) else 0) *
6598                     measure m (PREIMAGE f {Normal (c i)} INTER m_space m)) (count n) =
6599          SIGMA (\x. (\i. Normal (if 0 <= c i then c i else 0) *
6600                          measure m (PREIMAGE f {Normal (c i)} INTER m_space m)) x -
6601                     (\i. Normal (if c i <= 0 then (-c i) else 0) *
6602                          measure m (PREIMAGE f {Normal (c i)} INTER m_space m)) x) (count n)`
6603 >- (MATCH_MP_TAC EQ_SYM \\
6604     irule EXTREAL_SUM_IMAGE_SUB >> art [] \\
6605     DISJ1_TAC \\ (* or DISJ2_TAC, doesn't matter *)
6606     GEN_TAC >> DISCH_TAC >> BETA_TAC \\
6607     CONJ_TAC
6608     >- (MATCH_MP_TAC pos_not_neginf \\
6609        `0 <= if 0 <= c x then c x else 0` by SRW_TAC [] [] \\
6610        `0 <= Normal (if 0 <= c x then c x else 0)`
6611          by PROVE_TAC [extreal_of_num_def, extreal_le_eq] \\
6612         Suff `0 <= measure m (PREIMAGE f {Normal (c x)} INTER m_space m)` >- METIS_TAC [le_mul] \\
6613         Suff `(PREIMAGE f {Normal (c x)} INTER m_space m) IN measurable_sets m`
6614         >- PROVE_TAC [measure_space_def, positive_def, measure_def] \\
6615         fs [IN_MEASURABLE]) \\
6616     Cases_on `0 < c x`
6617     >- (`~(c x <= 0)` by METIS_TAC [real_lte] \\
6618         fs [GSYM extreal_of_num_def, mul_lzero] \\
6619         fs [extreal_of_num_def, extreal_not_infty]) \\
6620    `c x <= 0` by METIS_TAC [real_lte] >> fs [] \\
6621    `0 <= -c x` by PROVE_TAC [REAL_NEG_GE0] \\
6622     METIS_TAC [mul_not_infty, lt_infty]) >> Rewr'
6623 >> BETA_TAC
6624 >> Know `!x. Normal (if 0 <= c x then c x else 0) *
6625              measure m (PREIMAGE f {Normal (c x)} INTER m_space m) -
6626              Normal (if c x <= 0 then (-c x) else 0) *
6627              measure m (PREIMAGE f {Normal (c x)} INTER m_space m) =
6628              Normal ((if 0 <= c x then c x else 0) - if c x <= 0 then (-c x) else 0) *
6629              measure m (PREIMAGE f {Normal (c x)} INTER m_space m)`
6630 >- (GEN_TAC >> REWRITE_TAC [GSYM extreal_sub_def] \\
6631     MATCH_MP_TAC EQ_SYM \\
6632     MATCH_MP_TAC sub_rdistrib \\
6633     REWRITE_TAC [extreal_not_infty] \\
6634     CONJ_TAC
6635     >- (MATCH_MP_TAC pos_not_neginf \\
6636         IMP_RES_TAC MEASURE_SPACE_POSITIVE >> PROVE_TAC [positive_def]) \\
6637     PROVE_TAC [lt_infty]) >> Rewr'
6638 >> `!x. ((if 0 <= c x then c x else 0) - if c x <= 0 then -c x else 0) = c x`
6639      by (RW_TAC real_ss []
6640          >> METIS_TAC [REAL_LE_ANTISYM, REAL_ADD_RID, real_lt, REAL_LT_ANTISYM])
6641 >> POP_ORW
6642 >> (MP_TAC o Q.ISPEC `c1:num->extreal` o UNDISCH o Q.ISPEC `count n`)
6643        EXTREAL_SUM_IMAGE_IMAGE
6644 >> Know `INJ c1 (count n) (IMAGE c1 (count n))`
6645 >- (FULL_SIMP_TAC std_ss [BIJ_DEF, INJ_DEF, IN_IMAGE] >> METIS_TAC [])
6646 >> SIMP_TAC std_ss []
6647 >> NTAC 2 STRIP_TAC
6648 >> POP_ASSUM (MP_TAC o Q.SPEC `(\r. r * (measure m (PREIMAGE f {r} INTER m_space m)))`)
6649 >> SIMP_TAC std_ss [o_DEF]
6650 >> `(IMAGE c1 (count n)) = (IMAGE f (m_space m))`
6651     by (ONCE_REWRITE_TAC [EXTENSION] >> RW_TAC std_ss [IN_IMAGE]
6652         >> FULL_SIMP_TAC std_ss [BIJ_DEF, INJ_DEF, SURJ_DEF, IN_IMAGE]
6653         >> METIS_TAC []) >> art []
6654 >> Know `!x. x IN IMAGE f (m_space m) ==>
6655              x * measure m (PREIMAGE f {x} INTER m_space m) <> PosInf`
6656 >- (RW_TAC std_ss [IN_IMAGE] \\
6657     `f x' <> PosInf /\ f x' <> NegInf` by PROVE_TAC [] \\
6658     `?r. f x' = Normal r` by PROVE_TAC [extreal_cases] >> art [] \\
6659     Cases_on `0 <= r` >- METIS_TAC [mul_not_infty, lt_infty] \\
6660     `r <= 0` by PROVE_TAC [REAL_NOT_LE, REAL_LT_IMP_LE] \\
6661     Suff `measure m (PREIMAGE f {Normal r} INTER m_space m) <> NegInf`
6662     >- METIS_TAC [mul_not_infty] \\
6663     MATCH_MP_TAC pos_not_neginf \\
6664     IMP_RES_TAC MEASURE_SPACE_POSITIVE \\
6665     METIS_TAC [positive_def])
6666 >> RW_TAC std_ss []
6667 >> (MATCH_MP_TAC o UNDISCH o Q.SPEC `count n` o INST_TYPE [``:'a`` |-> ``:num``])
6668        EXTREAL_SUM_IMAGE_EQ
6669 >> RW_TAC std_ss []
6670 >> DISJ2_TAC >> GEN_TAC >> DISCH_TAC
6671 >> Cases_on `0 <= c x` >- METIS_TAC [mul_not_infty, lt_infty]
6672 >> `c x <= 0` by PROVE_TAC [REAL_NOT_LE, REAL_LT_IMP_LE]
6673 >> Suff `measure m (PREIMAGE f {Normal (c x)} INTER m_space m) <> NegInf`
6674 >- METIS_TAC [mul_not_infty]
6675 >> MATCH_MP_TAC pos_not_neginf
6676 >> Know ‘positive m’ >- simp [MEASURE_SPACE_POSITIVE]
6677 >> rw [positive_def]
6678QED
6679
6680(* special case of "finite_support_integral_reduce": (m_space m) is finite.
6681
6682   added `measure m (m_space m) < PosInf` into antecedents.
6683   FIXME: remove `integrable m f` and prove it.
6684 *)
6685Theorem finite_space_integral_reduce :
6686    !m f. measure_space m /\ f IN measurable (m_space m,measurable_sets m) Borel /\
6687          (!x. x IN m_space m ==> f x <> NegInf /\ f x <> PosInf) /\
6688          FINITE (m_space m) /\ measure m (m_space m) < PosInf /\
6689          integrable m f
6690      ==> (integral m f = finite_space_integral m f)
6691Proof
6692    rpt STRIP_TAC
6693 >> `FINITE (IMAGE f (m_space m))` by PROVE_TAC [IMAGE_FINITE]
6694 >> MATCH_MP_TAC finite_support_integral_reduce >> art []
6695QED
6696
6697(* No need to have PREIMAGE if `POW (m_space m) = measurable_sets m`.
6698
6699   Added `measure m (m_space m) < PosInf` into antecedents
6700 *)
6701Theorem finite_space_POW_integral_reduce :
6702    !m f. measure_space m /\ (POW (m_space m) = measurable_sets m) /\
6703          FINITE (m_space m) /\
6704         (!x. x IN m_space m ==> f x <> NegInf /\ f x <> PosInf) /\
6705          measure m (m_space m) < PosInf ==>
6706         (integral m f = SIGMA (\x. f x * (measure m {x})) (m_space m))
6707Proof
6708    RW_TAC std_ss []
6709 >> ‘sigma_algebra (measurable_space m)’
6710      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA]
6711 >> `f IN measurable (m_space m, measurable_sets m) Borel`
6712        by (RW_TAC std_ss [IN_MEASURABLE_BOREL,IN_FUNSET,IN_UNIV,space_def,subsets_def]
6713            >> METIS_TAC [INTER_SUBSET,IN_POW])
6714 >> `?c n. BIJ c (count n) (m_space m)` by RW_TAC std_ss [GSYM FINITE_BIJ_COUNT_EQ]
6715 >> `FINITE (count n)` by RW_TAC std_ss [FINITE_COUNT]
6716 >> `?x. !i. (i IN count n ==> (f (c i) = Normal (x i)))`
6717       by (Q.EXISTS_TAC `(\i. @r. f (c i) = Normal r)`
6718           >> RW_TAC std_ss []
6719           >> SELECT_ELIM_TAC
6720           >> RW_TAC std_ss []
6721           >> FULL_SIMP_TAC std_ss [BIJ_DEF, INJ_DEF, SURJ_DEF, IN_IMAGE]
6722           >> METIS_TAC [extreal_cases])
6723 >> `!i. i IN count n ==> {c i } IN measurable_sets m`
6724       by METIS_TAC [IN_POW, IN_SING, BIJ_DEF, SURJ_DEF, SUBSET_DEF]
6725 >> Know `pos_simple_fn m (fn_plus f)
6726            (count n) (\i. {c i}) (\i. if 0 <= x i then x i else 0)`
6727 >- (RW_TAC std_ss [pos_simple_fn_def, FINITE_COUNT, FN_PLUS_POS, FN_MINUS_POS] >| (* 4 subgoals *)
6728     [ (* goal 1 (of 4) *)
6729       reverse (RW_TAC real_ss [fn_plus_def])
6730       >- (FULL_SIMP_TAC std_ss [extreal_lt_def, IN_INTER] \\
6731           (MP_TAC o Q.SPEC `(\i. Normal (if 0 <= x i then x i else 0) *
6732                                  indicator_fn {c i} t)` o
6733               UNDISCH o Q.ISPEC `count n`) EXTREAL_SUM_IMAGE_IN_IF \\
6734           Know `!x'. x' IN count n ==>
6735                      (\i. Normal (if 0 <= x i then x i else 0) *
6736                           indicator_fn {c i} t) x' <> NegInf`
6737           >- (GEN_TAC >> DISCH_TAC >> BETA_TAC >> rename1 `i IN count n` \\
6738               MATCH_MP_TAC pos_not_neginf \\
6739               Cases_on `~(0 <= x i)` >- fs [GSYM extreal_of_num_def, mul_lzero, le_refl] \\
6740               fs [] \\
6741               MATCH_MP_TAC le_mul \\
6742               CONJ_TAC >- fs [extreal_le_eq, extreal_of_num_def] \\
6743               REWRITE_TAC [INDICATOR_FN_POS]) \\
6744           RW_TAC std_ss [] >> POP_ASSUM K_TAC \\
6745           Suff `(\x'. if x' IN count n then Normal (if 0 <= x x' then x x' else 0) *
6746                       indicator_fn {c x'} t else 0) = (\x. 0)`
6747           >- RW_TAC std_ss [EXTREAL_SUM_IMAGE_ZERO] \\
6748           RW_TAC std_ss [FUN_EQ_THM] \\
6749           Cases_on `~(x' IN count n)` >- RW_TAC std_ss [] \\
6750           reverse (RW_TAC std_ss [mul_rone, mul_rzero])
6751           >- RW_TAC std_ss [GSYM extreal_of_num_def, mul_lzero] \\
6752           rename1 `i IN count n` \\
6753           Cases_on `c i <> t` >- PROVE_TAC [INDICATOR_FN_SING_0, mul_rzero] \\
6754           fs [INDICATOR_FN_SING_1, mul_rone] \\
6755          `f t = Normal (x i)` by PROVE_TAC [] \\
6756          `0 <= f t` by PROVE_TAC [extreal_le_eq, extreal_of_num_def] \\
6757          `f t = 0` by PROVE_TAC [le_antisym, extreal_lt_def] \\
6758           fs [])
6759       >> FULL_SIMP_TAC std_ss [BIJ_DEF, INJ_DEF, SURJ_DEF, IN_IMAGE]
6760       >> `?i. i IN count n /\ (t = c i)` by METIS_TAC []
6761       >> FULL_SIMP_TAC std_ss []
6762       >> `count n = i INSERT ((count n) DELETE i)`
6763            by (RW_TAC std_ss [EXTENSION, IN_INSERT, IN_DELETE] >> METIS_TAC [])
6764       >> POP_ORW
6765       >> Know `!x'. x' IN (i INSERT count n DELETE i) ==>
6766                    (\i'. Normal (if 0 <= x i' then x i' else 0) *
6767                          indicator_fn {c i'} (c i)) x' <> NegInf`
6768       >- (GEN_TAC >> DISCH_TAC >> BETA_TAC \\
6769           MATCH_MP_TAC pos_not_neginf \\
6770           MATCH_MP_TAC le_mul >> REWRITE_TAC [INDICATOR_FN_POS] \\
6771           METIS_TAC [extreal_le_eq, extreal_of_num_def, le_refl])
6772       >> reverse (RW_TAC std_ss [EXTREAL_SUM_IMAGE_THM, FINITE_DELETE, GSYM extreal_of_num_def,
6773                                  mul_lzero, DELETE_DELETE, add_lzero])
6774       >- METIS_TAC [extreal_of_num_def, extreal_lt_eq, lt_antisym, real_lt]
6775       >> RW_TAC std_ss [indicator_fn_def, IN_INTER, DELETE_DELETE, mul_rzero, add_lzero,
6776                         IN_PREIMAGE, IN_SING, mul_rone]
6777       >> Suff `SIGMA (\i'. Normal (if 0 <= x i' then x i' else 0) *
6778                            if c i = c i' then 1 else 0) (count n DELETE i) = 0`
6779       >- RW_TAC std_ss [add_rzero]
6780       >> MATCH_MP_TAC EXTREAL_SUM_IMAGE_0
6781       >> reverse (RW_TAC std_ss [FINITE_DELETE, mul_rone, mul_rzero])
6782       >- RW_TAC std_ss [extreal_of_num_def]
6783       >> METIS_TAC [IN_DELETE],
6784       (* goal 2 (of 4) *)
6785       RW_TAC real_ss [],
6786       (* goal 3 (of 4) *)
6787       FULL_SIMP_TAC std_ss [DISJOINT_DEF, IN_INTER, NOT_IN_EMPTY, IN_PREIMAGE, EXTENSION,
6788                             IN_SING, BIJ_DEF, INJ_DEF]
6789       >> METIS_TAC [],
6790       (* goal 4 (of 4) *)
6791       RW_TAC std_ss [EXTENSION, IN_BIGUNION_IMAGE, IN_PREIMAGE, IN_SING, IN_INTER]
6792       >> FULL_SIMP_TAC std_ss [BIJ_DEF, INJ_DEF, SURJ_DEF]
6793       >> METIS_TAC [IN_IMAGE] ])
6794 >> DISCH_TAC
6795 >> Know `pos_simple_fn m (fn_minus f)
6796            (count n) (\i. {c i}) (\i. if x i <= 0 then -(x i) else 0)`
6797 >- (RW_TAC std_ss [pos_simple_fn_def, FINITE_COUNT, FN_MINUS_POS, FN_MINUS_POS] >| (* 4 subgoals *)
6798     [ (* goal 1 (of 4) *)
6799       reverse (RW_TAC real_ss [fn_minus_def])
6800       >- (FULL_SIMP_TAC std_ss [extreal_lt_def, IN_INTER]
6801           >> (MP_TAC o Q.SPEC `(\i. Normal (if x i <= 0 then -x i else 0) *
6802                                     indicator_fn {c i} t)` o
6803               UNDISCH o Q.ISPEC `count n`) EXTREAL_SUM_IMAGE_IN_IF
6804           >> Know `!x'. x' IN count n ==>
6805                         (\i. Normal (if x i <= 0 then (-x i) else 0) *
6806                              indicator_fn {c i} t) x' <> NegInf`
6807           >- (GEN_TAC >> DISCH_TAC >> BETA_TAC \\
6808               MATCH_MP_TAC pos_not_neginf \\
6809               Cases_on `~(x x' <= 0)` >- fs [GSYM extreal_of_num_def, mul_lzero, le_refl] \\
6810               fs [] \\
6811               MATCH_MP_TAC le_mul >> REWRITE_TAC [INDICATOR_FN_POS] \\
6812              `0 <= -(x x')` by PROVE_TAC [REAL_LE_NEG, REAL_NEG_0] \\
6813               fs [extreal_le_eq, extreal_of_num_def])
6814           >> RW_TAC std_ss [] >> POP_ASSUM K_TAC
6815           >> Suff `(\x'. if x' IN count n then Normal (if x x' <= 0 then -(x x') else 0) *
6816                          indicator_fn {c x'} t else 0) = (\x. 0)`
6817           >- RW_TAC std_ss [EXTREAL_SUM_IMAGE_ZERO]
6818           >> RW_TAC std_ss [FUN_EQ_THM]
6819           >> Cases_on `~(x' IN count n)` >- RW_TAC std_ss []
6820           >> reverse (RW_TAC std_ss [mul_rone, mul_rzero])
6821           >- RW_TAC std_ss [GSYM extreal_of_num_def, mul_lzero]
6822           >> rename1 `i IN count n`
6823           >> Cases_on `c i <> t` >- PROVE_TAC [INDICATOR_FN_SING_0, mul_rzero]
6824           >> fs [INDICATOR_FN_SING_1, mul_rone]
6825           >> `f t = Normal (x i)` by PROVE_TAC []
6826           >> `f t <= 0` by PROVE_TAC [extreal_le_eq, extreal_of_num_def]
6827           >> `f t = 0` by PROVE_TAC [le_antisym]
6828           >> `x i = 0` by PROVE_TAC [extreal_of_num_def, extreal_11]
6829           >> `-x i = 0` by PROVE_TAC [REAL_NEG_0]
6830           >> METIS_TAC [extreal_of_num_def])
6831       >> FULL_SIMP_TAC std_ss [BIJ_DEF, INJ_DEF, SURJ_DEF, IN_IMAGE]
6832       >> `?i. i IN count n /\ (t = c i)` by METIS_TAC []
6833       >> FULL_SIMP_TAC std_ss []
6834       >> `count n = i INSERT ((count n) DELETE i)`
6835            by (RW_TAC std_ss [EXTENSION, IN_INSERT, IN_DELETE] >> METIS_TAC [])
6836       >> POP_ORW
6837       >> Know `!x'. x' IN (i INSERT count n DELETE i) ==>
6838                    (\i'. Normal (if x i' <= 0 then -x i' else 0) *
6839                          indicator_fn {c i'} (c i)) x' <> NegInf`
6840       >- (GEN_TAC >> DISCH_TAC >> BETA_TAC \\
6841           MATCH_MP_TAC pos_not_neginf \\
6842           MATCH_MP_TAC le_mul >> REWRITE_TAC [INDICATOR_FN_POS] \\
6843           Cases_on `x x' <= 0`
6844           >- (ASM_SIMP_TAC std_ss [] \\
6845               `0 <= -x x'` by PROVE_TAC [REAL_LE_NEG, REAL_NEG_0] \\
6846               PROVE_TAC [extreal_of_num_def, extreal_le_eq]) \\
6847           ASM_SIMP_TAC std_ss [GSYM extreal_of_num_def, le_refl])
6848       >> reverse (RW_TAC std_ss [EXTREAL_SUM_IMAGE_THM, FINITE_DELETE, GSYM extreal_of_num_def,
6849                                  mul_lzero, DELETE_DELETE, add_lzero])
6850       >- METIS_TAC [extreal_of_num_def, extreal_lt_eq, lt_antisym, real_lt]
6851       >> RW_TAC std_ss [indicator_fn_def, IN_INTER, DELETE_DELETE, mul_rzero, add_lzero,
6852                         IN_PREIMAGE, IN_SING, mul_rone]
6853       >> Suff `SIGMA (\i'. Normal (if x i' <= 0 then -(x i') else 0) *
6854                      if c i = c i' then 1 else 0) (count n DELETE i) = 0`
6855       >- RW_TAC std_ss [add_rzero, extreal_ainv_def]
6856       >> MATCH_MP_TAC EXTREAL_SUM_IMAGE_0
6857       >> reverse (RW_TAC std_ss [FINITE_DELETE, mul_rone, mul_rzero])
6858       >- RW_TAC std_ss [extreal_of_num_def]
6859       >> METIS_TAC [IN_DELETE],
6860       (* goal 2 (of 4) *)
6861       METIS_TAC [REAL_LE_REFL, REAL_LE_NEG, REAL_NEG_0],
6862       (* goal 3 (of 4) *)
6863       FULL_SIMP_TAC std_ss [DISJOINT_DEF, IN_INTER, NOT_IN_EMPTY, IN_PREIMAGE, EXTENSION,
6864                             IN_SING, BIJ_DEF, INJ_DEF]
6865       >> METIS_TAC [],
6866       (* goal 4 (of 4) *)
6867       RW_TAC std_ss [EXTENSION, IN_BIGUNION_IMAGE, IN_PREIMAGE, IN_SING, IN_INTER]
6868       >> FULL_SIMP_TAC std_ss [BIJ_DEF, INJ_DEF, SURJ_DEF]
6869       >> METIS_TAC [IN_IMAGE] ])
6870 >> DISCH_TAC
6871 >> RW_TAC std_ss [integral_def]
6872 >> (MP_TAC o Q.SPECL [`m`,`fn_plus f`,`count n`,`(\i. {c i})`,
6873                       `(\i. if 0 <= x i then x i else 0)`]) pos_fn_integral_pos_simple_fn
6874 >> (MP_TAC o Q.SPECL [`m`,`fn_minus f`,`count n`,`(\i. {c i})`,
6875                       `(\i. if x i <= 0 then -(x i) else 0)`]) pos_fn_integral_pos_simple_fn
6876 >> RW_TAC std_ss [pos_simple_fn_integral_def, extreal_sub_def, GSYM REAL_SUM_IMAGE_SUB,
6877                   GSYM REAL_SUB_RDISTRIB]
6878 >> `!x. ((if 0 <= x i then x i else 0) - if x i <= 0:real then -(x i) else 0) = x i`
6879      by (RW_TAC real_ss [REAL_SUB_RNEG]
6880          >> METIS_TAC [REAL_LE_ANTISYM, REAL_ADD_RID, real_lt, REAL_LT_ANTISYM])
6881 >> RW_TAC std_ss []
6882 >> (MP_TAC o Q.ISPEC `c:num->'a` o UNDISCH o Q.ISPEC `count n`) EXTREAL_SUM_IMAGE_IMAGE
6883 >> Know `INJ c (count n) (IMAGE c (count n))`
6884 >- (FULL_SIMP_TAC std_ss [BIJ_DEF, INJ_DEF, IN_IMAGE] >> METIS_TAC [])
6885 >> `(IMAGE c (count n)) = (m_space m)`
6886        by (ONCE_REWRITE_TAC [EXTENSION] >> RW_TAC std_ss [IN_IMAGE]
6887            >> FULL_SIMP_TAC std_ss [BIJ_DEF, INJ_DEF, SURJ_DEF, IN_IMAGE]
6888            >> METIS_TAC [])
6889 >> RW_TAC std_ss []
6890 >> POP_ASSUM (MP_TAC o Q.SPEC `(\x. f x * (measure m {x}))`)
6891 >> Know `!x. x IN m_space m ==> f x * measure m {x} <> PosInf`
6892 >- (Q.PAT_ASSUM `IMAGE c (count n) = m_space m` (ONCE_REWRITE_TAC o wrap o SYM) \\
6893     RW_TAC std_ss [IN_IMAGE] >> rename1 `j IN count n` \\
6894     `{c j} IN measurable_sets m` by METIS_TAC [IN_POW, SUBSET_DEF, IN_SING, IN_IMAGE] \\
6895     `(c j) IN m_space m` by METIS_TAC [IN_IMAGE] \\
6896     Know `measure m {c j} <> NegInf`
6897     >- (MATCH_MP_TAC pos_not_neginf >> PROVE_TAC [measure_space_def, positive_def]) \\
6898     Know `measure m {c j} <> PosInf`
6899     >- (REWRITE_TAC [lt_infty] >> MATCH_MP_TAC let_trans \\
6900         Q.EXISTS_TAC `measure m (m_space m)` >> art [] \\
6901         MATCH_MP_TAC INCREASING >> art [] \\
6902         CONJ_TAC >- PROVE_TAC [MEASURE_SPACE_INCREASING] \\
6903         CONJ_TAC >- PROVE_TAC [SUBSET_DEF, IN_SING] \\
6904         IMP_RES_TAC MEASURE_SPACE_MSPACE_MEASURABLE) \\
6905     NTAC 2 DISCH_TAC \\
6906     METIS_TAC [mul_not_infty2])
6907 >> RW_TAC std_ss [o_DEF]
6908 (* applying EXTREAL_SUM_IMAGE_SUB *)
6909 >> Know `SIGMA (\i. Normal (if 0 <= x i then x i else 0) * measure m {c i}) (count n) -
6910          SIGMA (\i. Normal (if x i <= 0 then (-x i) else 0) * measure m {c i}) (count n) =
6911          SIGMA (\j. (\i. Normal (if 0 <= x i then x i else 0) * measure m {c i}) j -
6912                     (\i. Normal (if x i <= 0 then (-x i) else 0) *
6913                          measure m {c i}) j) (count n)`
6914 >- (MATCH_MP_TAC EQ_SYM \\
6915     irule EXTREAL_SUM_IMAGE_SUB >> art [] \\
6916     DISJ1_TAC \\ (* or DISJ2_TAC, doesn't matter *)
6917     GEN_TAC >> DISCH_TAC >> BETA_TAC >> rename1 `j IN count n` \\
6918     CONJ_TAC
6919     >- (MATCH_MP_TAC pos_not_neginf \\
6920        `0 <= if 0 <= x j then x j else 0` by SRW_TAC [] [] \\
6921        `0 <= Normal (if 0 <= x j then x j else 0)`
6922          by PROVE_TAC [extreal_of_num_def, extreal_le_eq] \\
6923         MATCH_MP_TAC le_mul >> art [] \\
6924         Suff `{c j} IN measurable_sets m`
6925         >- PROVE_TAC [measure_space_def, positive_def, measure_def] \\
6926         METIS_TAC [IN_POW, SUBSET_DEF, IN_SING, IN_IMAGE]) \\
6927     Cases_on `0 < x j`
6928     >- (`~(x j <= 0)` by METIS_TAC [real_lte] \\
6929         fs [GSYM extreal_of_num_def, mul_lzero] \\
6930         fs [extreal_of_num_def, extreal_not_infty]) \\
6931    `x j <= 0` by METIS_TAC [real_lte] >> fs [] \\
6932    `0 <= -x j` by PROVE_TAC [REAL_NEG_GE0] \\
6933     Suff `measure m {c j} <> PosInf` >- METIS_TAC [mul_not_infty] \\
6934     REWRITE_TAC [lt_infty] \\
6935     MATCH_MP_TAC let_trans \\
6936     Q.EXISTS_TAC `measure m (m_space m)` >> art [] \\
6937     MATCH_MP_TAC INCREASING >> art [] \\
6938     CONJ_TAC >- PROVE_TAC [MEASURE_SPACE_INCREASING] \\
6939     `(c j) IN m_space m` by METIS_TAC [IN_IMAGE, IN_COUNT] \\
6940     CONJ_TAC >- PROVE_TAC [SUBSET_DEF, IN_SING] \\
6941     CONJ_TAC >- METIS_TAC [IN_POW, SUBSET_DEF, IN_SING, IN_IMAGE] \\
6942     IMP_RES_TAC MEASURE_SPACE_MSPACE_MEASURABLE) >> Rewr'
6943 >> BETA_TAC
6944 >> Know `!j. j IN count n ==>
6945             (Normal (if 0 <= x j then x j else 0) * measure m {c j} -
6946              Normal (if x j <= 0 then (-x j) else 0) * measure m {c j} =
6947              Normal ((if 0 <= x j then x j else 0) - if x j <= 0 then (-x j) else 0) *
6948              measure m {c j})`
6949 >- (GEN_TAC >> DISCH_TAC \\
6950     REWRITE_TAC [GSYM extreal_sub_def] \\
6951     MATCH_MP_TAC EQ_SYM \\
6952     MATCH_MP_TAC sub_rdistrib \\
6953     REWRITE_TAC [extreal_not_infty] \\
6954    `{c j} IN measurable_sets m` by METIS_TAC [IN_POW, SUBSET_DEF, IN_SING, IN_IMAGE] \\
6955     CONJ_TAC
6956     >- (MATCH_MP_TAC pos_not_neginf \\
6957         IMP_RES_TAC MEASURE_SPACE_POSITIVE >> PROVE_TAC [positive_def]) \\
6958     REWRITE_TAC [lt_infty] \\
6959     MATCH_MP_TAC let_trans \\
6960     Q.EXISTS_TAC `measure m (m_space m)` >> art [] \\
6961     MATCH_MP_TAC INCREASING >> art [] \\
6962     CONJ_TAC >- PROVE_TAC [MEASURE_SPACE_INCREASING] \\
6963    `(c j) IN m_space m` by METIS_TAC [IN_IMAGE, IN_COUNT] \\
6964     CONJ_TAC >- PROVE_TAC [SUBSET_DEF, IN_SING] \\
6965     IMP_RES_TAC MEASURE_SPACE_MSPACE_MEASURABLE)
6966 >> DISCH_TAC
6967 >> `!j. ((if 0 <= x j then x j else 0) - if x j <= 0 then -x j else 0) = x j`
6968      by (RW_TAC real_ss []
6969          >> METIS_TAC [REAL_LE_ANTISYM, REAL_ADD_RID, real_lt, REAL_LT_ANTISYM])
6970 >> Know `SIGMA (\j. Normal (if 0 <= x j then x j else 0) * measure m {c j} -
6971                     Normal (if x j <= 0 then (-x j) else 0) * measure m {c j}) (count n) =
6972          SIGMA (\j. Normal ((if 0 <= x j then x j else 0) - if x j <= 0 then -x j else 0) *
6973                     measure m {c j}) (count n)`
6974 >- (irule EXTREAL_SUM_IMAGE_EQ >> BETA_TAC >> art [] \\
6975     DISJ2_TAC \\
6976     GEN_TAC >> DISCH_TAC >> rename1 `j IN count n` \\
6977     Q.PAT_X_ASSUM `!j. j IN count n ==> X`
6978       (fn th => (art [MATCH_MP th (ASSUME ``j IN count n``)])) \\
6979     Cases_on `0 <= x j`
6980     >- (Suff `measure m {c j} <> PosInf` >- METIS_TAC [mul_not_infty] \\
6981         REWRITE_TAC [lt_infty] \\
6982         MATCH_MP_TAC let_trans \\
6983         Q.EXISTS_TAC `measure m (m_space m)` >> art [] \\
6984         MATCH_MP_TAC INCREASING >> art [] \\
6985         CONJ_TAC >- PROVE_TAC [MEASURE_SPACE_INCREASING] \\
6986        `(c j) IN m_space m` by METIS_TAC [IN_IMAGE, IN_COUNT] \\
6987         CONJ_TAC >- PROVE_TAC [SUBSET_DEF, IN_SING] \\
6988         CONJ_TAC >- METIS_TAC [IN_POW, SUBSET_DEF, IN_SING, IN_IMAGE] \\
6989         IMP_RES_TAC MEASURE_SPACE_MSPACE_MEASURABLE) \\
6990    `x j <= 0` by PROVE_TAC [real_lte, REAL_LT_IMP_LE] \\
6991     Suff `measure m {c j} <> NegInf` >- METIS_TAC [mul_not_infty] \\
6992     MATCH_MP_TAC pos_not_neginf \\
6993    `{c j} IN measurable_sets m` by METIS_TAC [IN_POW, SUBSET_DEF, IN_SING, IN_IMAGE] \\
6994     IMP_RES_TAC MEASURE_SPACE_POSITIVE >> PROVE_TAC [positive_def])
6995 >> Rewr'
6996 >> ASM_REWRITE_TAC []
6997 >> (MATCH_MP_TAC o UNDISCH o Q.SPEC `count n` o INST_TYPE [``:'a`` |-> ``:num``])
6998        EXTREAL_SUM_IMAGE_EQ
6999 >> RW_TAC std_ss []
7000 >> DISJ2_TAC
7001 >> GEN_TAC >> DISCH_TAC >> rename1 `j IN count n`
7002 >> `{c j} IN measurable_sets m` by METIS_TAC [IN_POW, SUBSET_DEF, IN_SING, IN_IMAGE]
7003 >> `(c j) IN m_space m` by METIS_TAC [IN_IMAGE, IN_COUNT]
7004 >> Cases_on `0 <= x j`
7005 >- (Suff `measure m {c j} <> PosInf` >- METIS_TAC [mul_not_infty] \\
7006     REWRITE_TAC [lt_infty] \\
7007     MATCH_MP_TAC let_trans \\
7008     Q.EXISTS_TAC `measure m (m_space m)` >> art [] \\
7009     MATCH_MP_TAC INCREASING >> art [] \\
7010     CONJ_TAC >- PROVE_TAC [MEASURE_SPACE_INCREASING] \\
7011     CONJ_TAC >- PROVE_TAC [SUBSET_DEF, IN_SING] \\
7012     IMP_RES_TAC MEASURE_SPACE_MSPACE_MEASURABLE)
7013 >> `x j <= 0` by PROVE_TAC [real_lte, REAL_LT_IMP_LE]
7014 >> Suff `measure m {c j} <> NegInf` >- METIS_TAC [mul_not_infty]
7015 >> MATCH_MP_TAC pos_not_neginf
7016 >> IMP_RES_TAC MEASURE_SPACE_POSITIVE
7017 >> PROVE_TAC [positive_def]
7018QED
7019
7020Theorem measure_space_density :
7021    !m f. measure_space m /\ f IN measurable (m_space m,measurable_sets m) Borel /\
7022         (!x. x IN m_space m ==> 0 <= f x) ==> measure_space (density m f)
7023Proof
7024    Q.X_GEN_TAC ‘M’ >> rpt STRIP_TAC
7025 >> ‘sigma_algebra (measurable_space M)’
7026      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA]
7027 >> SIMP_TAC std_ss [measure_space_def, density_measure_def, density_def,
7028                     m_space_def, measurable_sets_def]
7029 >> Q.PAT_ASSUM `measure_space M`
7030      (STRIP_ASSUME_TAC o (REWRITE_RULE [measure_space_def]))
7031 >> RW_TAC std_ss []
7032 >- (FULL_SIMP_TAC std_ss [positive_def, measure_def, measurable_sets_def] \\
7033     CONJ_TAC
7034     >- (SIMP_TAC std_ss [indicator_fn_def, GSPECIFICATION, NOT_IN_EMPTY] \\
7035         ASM_SIMP_TAC std_ss [mul_rzero, pos_fn_integral_zero]) \\
7036     RW_TAC std_ss [] >> MATCH_MP_TAC pos_fn_integral_pos \\
7037     RW_TAC std_ss [] \\
7038     MATCH_MP_TAC le_mul >> ASM_SIMP_TAC std_ss [INDICATOR_FN_POS])
7039 (* countably_additive *)
7040 >> RW_TAC std_ss [countably_additive_def, measure_def, measurable_sets_def,
7041                   IN_FUNSET, IN_UNIV]
7042 >> rename1 `!x. A x IN measurable_sets M`
7043 >> Q.PAT_ASSUM `countably_additive M`
7044      (ASSUME_TAC o (ONCE_REWRITE_RULE [GSYM MEASURE_SPACE_REDUCE]))
7045 >> FULL_SIMP_TAC std_ss [countably_additive_alt_eq]
7046 >> `!i. A i IN measurable_sets M` by ASM_SET_TAC []
7047 >> Know `!i. (\x. f x * indicator_fn (A i) x) IN measurable (m_space M,measurable_sets M) Borel`
7048 >- (GEN_TAC \\
7049     MATCH_MP_TAC IN_MEASURABLE_BOREL_MUL_INDICATOR \\
7050     ASM_SIMP_TAC std_ss [subsets_def])
7051 >> RW_TAC std_ss [o_DEF]
7052 >> Know `suminf (\x. pos_fn_integral M ((\x x'. f x' * indicator_fn (A x) x') x)) =
7053          pos_fn_integral M (\x'. suminf (\x. (\x x'. f x' * indicator_fn (A x) x') x x'))`
7054 >- (MATCH_MP_TAC (GSYM pos_fn_integral_suminf) \\
7055     ASM_SIMP_TAC std_ss [] \\
7056     rpt STRIP_TAC >> MATCH_MP_TAC le_mul \\
7057     ASM_SIMP_TAC std_ss [INDICATOR_FN_POS])
7058 >> ASM_SIMP_TAC std_ss [] >> DISC_RW_KILL
7059 >> Know `!y. y IN m_space M ==>
7060             (suminf (\x. (f y) * (\x. indicator_fn (A x) y) x) =
7061              (f y) * suminf (\x. indicator_fn (A x) y))`
7062 >- (GEN_TAC >> DISCH_TAC >> MATCH_MP_TAC ext_suminf_cmul \\
7063     ASM_SIMP_TAC std_ss [INDICATOR_FN_POS])
7064 >> SIMP_TAC std_ss [] >> DISCH_TAC
7065 >> Know ‘pos_fn_integral M (\x'. suminf (\x. f x' * indicator_fn (A x) x')) =
7066          pos_fn_integral M (\y. f y * suminf (\x. indicator_fn (A x) y))’
7067 >- (MATCH_MP_TAC pos_fn_integral_cong >> simp [] \\
7068     rpt STRIP_TAC >> MATCH_MP_TAC le_mul >> simp [] \\
7069     MATCH_MP_TAC ext_suminf_pos >> rw [INDICATOR_FN_POS]) >> Rewr'
7070 >> Know  `!y. y IN m_space M ==>
7071              (suminf (\x. indicator_fn (A x) y) =
7072               indicator_fn (BIGUNION (IMAGE A UNIV)) y)`
7073 >- (GEN_TAC >> DISCH_TAC \\
7074     MATCH_MP_TAC indicator_fn_suminf >> art []) >> DISCH_TAC
7075 >> MATCH_MP_TAC pos_fn_integral_cong >> simp []
7076 >> rpt STRIP_TAC
7077 >> MATCH_MP_TAC le_mul >> simp [INDICATOR_FN_POS]
7078QED
7079
7080Theorem measure_space_density' :
7081    !M f. measure_space M /\ f IN measurable (m_space M,measurable_sets M) Borel
7082      ==> measure_space (density M (fn_plus f))
7083Proof
7084    rpt STRIP_TAC
7085 >> MATCH_MP_TAC measure_space_density >> art [FN_PLUS_POS]
7086 >> MATCH_MP_TAC IN_MEASURABLE_BOREL_FN_PLUS
7087 >> rw [MEASURE_SPACE_SIGMA_ALGEBRA]
7088QED
7089
7090(* ‘density_of’ is like ‘density’ but automatically apply ‘fn_plus’, and the measure
7091   part of the returned measure space is total returning 0 for non-measurable sets.
7092 *)
7093Definition density_of :
7094    density_of M f = (m_space M, measurable_sets M,
7095      (\A. if A IN measurable_sets M then
7096           pos_fn_integral M (\x. max 0 (f x * indicator_fn A x)) else 0))
7097End
7098
7099(* This was HVG's measure_space_density *)
7100Theorem measure_space_density_of :
7101    !M f. measure_space M /\ f IN measurable (m_space M, measurable_sets M) Borel
7102      ==> measure_space (density_of M f)
7103Proof
7104    rpt STRIP_TAC
7105 >> ‘measure_space (density M (fn_plus f))’ by PROVE_TAC [measure_space_density']
7106 >> MATCH_MP_TAC measure_space_eq
7107 >> Q.EXISTS_TAC ‘density M f^+’ >> art []
7108 >> simp [density_of, density_def, density_measure_def]
7109 >> rpt STRIP_TAC
7110 >> MATCH_MP_TAC pos_fn_integral_cong >> simp [le_max1]
7111 >> rpt STRIP_TAC
7112 >- (MATCH_MP_TAC le_mul >> simp [FN_PLUS_POS, INDICATOR_FN_POS])
7113 >> ‘max 0 (f x * indicator_fn s x) = (\x. f x * indicator_fn s x)^+ x’
7114       by rw [Once max_comm, FN_PLUS_ALT]
7115 >> POP_ORW
7116 >> ONCE_REWRITE_TAC [mul_comm]
7117 >> MATCH_MP_TAC fn_plus_fmul
7118 >> simp [INDICATOR_FN_POS]
7119QED
7120
7121Theorem suminf_measure[local]:
7122    !M A. measure_space M /\ IMAGE (\i:num. A i) UNIV SUBSET measurable_sets M /\
7123          disjoint_family A ==>
7124         (suminf (\i. measure M (A i)) = measure M (BIGUNION {A i | i IN UNIV}))
7125Proof
7126    RW_TAC std_ss [GSYM IMAGE_DEF]
7127 >> MATCH_MP_TAC (SIMP_RULE std_ss [o_DEF] MEASURE_COUNTABLY_ADDITIVE)
7128 >> FULL_SIMP_TAC std_ss [IN_FUNSET, disjoint_family_on]
7129 >> ASM_SET_TAC []
7130QED
7131
7132(* reduced ‘N’ (measure_space) to ‘B’ (sigma_algebra) *)
7133Theorem measure_space_distr :
7134    !M B f. measure_space M /\ sigma_algebra B /\
7135            f IN measurable (m_space M,measurable_sets M) B ==>
7136            measure_space (space B, subsets B, distr M f)
7137Proof
7138    qx_genl_tac [‘M’, ‘B’, ‘t’]
7139 >> RW_TAC std_ss [measure_space_def, m_space_def, measurable_sets_def, SPACE]
7140 >- (fs [positive_def, distr_def, measure_def, measurable_sets_def] \\
7141     rpt STRIP_TAC >> FIRST_X_ASSUM MATCH_MP_TAC \\
7142     fs [IN_MEASURABLE, space_def, subsets_def])
7143 >> FULL_SIMP_TAC std_ss [countably_additive_alt_eq, distr_def]
7144 >> RW_TAC std_ss []
7145 >> `!i. A i IN subsets B` by ASM_SET_TAC []
7146 >> `IMAGE (\i. PREIMAGE t (A i) INTER m_space M) UNIV SUBSET measurable_sets M`
7147      by (FULL_SIMP_TAC std_ss [IN_MEASURABLE, space_def, subsets_def, SUBSET_DEF] \\
7148          FULL_SIMP_TAC std_ss [IN_IMAGE, IN_UNIV] >> METIS_TAC [])
7149 >> `BIGUNION {PREIMAGE t (A i) INTER m_space M | i IN UNIV} IN measurable_sets M`
7150      by (FULL_SIMP_TAC std_ss [sigma_algebra_alt_eq])
7151 >> `disjoint_family (\i. PREIMAGE t (A i) INTER m_space M)`
7152      by (FULL_SIMP_TAC std_ss [disjoint_family_on, IN_UNIV] \\
7153          FULL_SIMP_TAC std_ss [PREIMAGE_def] THEN ASM_SET_TAC [])
7154 >> SIMP_TAC std_ss [PREIMAGE_BIGUNION, o_DEF]
7155 >> Know `IMAGE (PREIMAGE t) {A i | i IN univ(:num)} =
7156          IMAGE (\i. PREIMAGE t (A i)) UNIV` >- ASM_SET_TAC []
7157 >> ONCE_REWRITE_TAC [METIS [ETA_AX] ``PREIMAGE t = (\s. PREIMAGE t s)``]
7158 >> ONCE_REWRITE_TAC [METIS [ETA_AX] ``PREIMAGE t = (\s. PREIMAGE t s)``]
7159 >> SIMP_TAC std_ss [] >> DISC_RW_KILL
7160 >> Know `BIGUNION (IMAGE (\i. PREIMAGE t (A i)) univ(:num)) INTER m_space M =
7161          BIGUNION (IMAGE (\i. PREIMAGE t (A i) INTER m_space M) univ(:num))`
7162 >- (FULL_SIMP_TAC std_ss [EXTENSION, IN_INTER, IN_BIGUNION] \\
7163     RW_TAC std_ss [] >> EQ_TAC \\
7164     RW_TAC std_ss [IN_IMAGE, IN_UNIV, IN_INTER, IN_PREIMAGE] >|
7165     [ Q.EXISTS_TAC `PREIMAGE t (A i) INTER m_space M` \\
7166       FULL_SIMP_TAC std_ss [] >> ASM_SET_TAC [],
7167       FULL_SIMP_TAC std_ss [IN_INTER] >> METIS_TAC [],
7168       ALL_TAC ] \\
7169     FULL_SIMP_TAC std_ss [IN_INTER])
7170 >> SIMP_TAC std_ss [] >> DISC_RW_KILL
7171 >> Suff `measure M
7172           (BIGUNION (IMAGE (\i. PREIMAGE t (A i) INTER m_space M) univ(:num))) =
7173          suminf (\x. measure M ((\x. PREIMAGE t (A x) INTER m_space M) x))`
7174 >- SIMP_TAC std_ss []
7175 >> MATCH_MP_TAC (GSYM (REWRITE_RULE [GSYM IMAGE_DEF] suminf_measure))
7176 >> FULL_SIMP_TAC std_ss [measure_space_def]
7177 >> ONCE_REWRITE_TAC [GSYM MEASURE_SPACE_REDUCE]
7178 >> METIS_TAC [countably_additive_alt_eq, space_def, subsets_def]
7179QED
7180
7181Definition distr_of : (* was: distr *)
7182    distr_of M N (f :'a -> 'b) =
7183     (m_space N, measurable_sets N,
7184      \s. if s IN measurable_sets N then measure M (PREIMAGE f s INTER m_space M)
7185          else 0)
7186End
7187
7188Theorem distr_of_alt_distr :
7189    !M N f. distr_of M N f =
7190           (m_space N, measurable_sets N,
7191            \s. if s IN measurable_sets N then distr M f s else 0)
7192Proof
7193    rw [distr_of, distr_def]
7194QED
7195
7196(* NOTE: new proof by measure_space_distr *)
7197Theorem measure_space_distr_of :
7198    !M N f. measure_space M /\ measure_space N /\
7199            f IN measurable (measurable_space M) (measurable_space N) ==>
7200            measure_space (distr_of M N f)
7201Proof
7202    rw [distr_of_alt_distr]
7203 >> MATCH_MP_TAC measure_space_eq
7204 >> Q.EXISTS_TAC ‘(m_space N,measurable_sets N,distr M f)’
7205 >> simp [m_space_def, measurable_sets_def, measure_def]
7206 >> qabbrev_tac ‘B = measurable_space N’
7207 >> ‘m_space N = space B’ by rw [Abbr ‘B’] >> POP_ORW
7208 >> ‘measurable_sets N = subsets B’ by rw [Abbr ‘B’] >> POP_ORW
7209 >> MATCH_MP_TAC measure_space_distr
7210 >> rw [Abbr ‘B’, MEASURE_SPACE_SIGMA_ALGEBRA]
7211QED
7212
7213(* Proposition 11.5 [1, p.91]
7214
7215   NOTE: "markov_ineq" in real_lebesgueTheory is a variant [1, p.93] that we shall
7216   prove latter as a corollary (in extreals).
7217 *)
7218Theorem markov_inequality :
7219    !m f a c. measure_space m /\ integrable m f /\ a IN measurable_sets m /\ 0 < c ==>
7220              measure m ({x | c <= abs (f x)} INTER a) <=
7221                inv c * integral m (\x. abs (f x) * indicator_fn a x)
7222Proof
7223    rpt STRIP_TAC
7224 >> Know `{x | c <= abs (f x)} INTER a IN measurable_sets m`
7225 >- (`{x | c <= abs (f x)} = PREIMAGE (abs o f) {x | c <= x}`
7226        by (RW_TAC std_ss [EXTENSION, IN_PREIMAGE, o_DEF, GSPECIFICATION]) \\
7227     `a SUBSET m_space m`
7228        by (fs [measure_space_def, sigma_algebra_def, algebra_def, subset_class_def,
7229                space_def, subsets_def]) \\
7230     `a = m_space m INTER a` by PROVE_TAC [INTER_SUBSET_EQN] >> POP_ORW \\
7231     REWRITE_TAC [INTER_ASSOC] \\
7232     MATCH_MP_TAC MEASURE_SPACE_INTER >> art [] \\
7233     fs [integrable_def] \\
7234     Know `abs o f IN measurable (m_space m,measurable_sets m) Borel`
7235     >- (MATCH_MP_TAC IN_MEASURABLE_BOREL_ABS \\
7236         Q.EXISTS_TAC `f` >> RW_TAC std_ss [o_DEF, space_def] \\
7237         fs [measure_space_def]) \\
7238     DISCH_THEN (STRIP_ASSUME_TAC o
7239                 (SIMP_RULE std_ss [measurable_def, GSPECIFICATION, space_def,
7240                                    subsets_def])) \\
7241     FIRST_X_ASSUM MATCH_MP_TAC \\
7242     REWRITE_TAC [BOREL_MEASURABLE_SETS_CR])
7243 >> DISCH_TAC
7244 >> `integrable m (abs o f)` by PROVE_TAC [integrable_abs]
7245 (* special case: c = PosInf *)
7246 >> Cases_on `c = PosInf`
7247 >- (fs [extreal_inv_def, GSYM extreal_of_num_def, mul_lzero, le_infty] \\
7248     REWRITE_TAC [le_lt] >> DISJ2_TAC \\
7249     irule integrable_infty >> art [] \\
7250     Q.EXISTS_TAC `abs o f` >> art [] \\
7251     RW_TAC std_ss [GSPECIFICATION, IN_INTER, o_DEF])
7252 (* general case *)
7253 >> Know `measure m ({x | c <= abs (f x)} INTER a) =
7254          integral m (indicator_fn ({x | c <= abs (f x)} INTER a))`
7255 >- (MATCH_MP_TAC EQ_SYM \\
7256     MATCH_MP_TAC integral_indicator >> art []) >> Rewr'
7257 >> REWRITE_TAC [INDICATOR_FN_INTER]
7258 >> Know ‘integral m (\t. indicator_fn {x | c <= abs (f x)} t * indicator_fn a t) =
7259          integral m
7260            (\t. inv c *
7261                 (c * indicator_fn {x | c <= abs (f x)} t * indicator_fn a t))’
7262 >- (REWRITE_TAC [mul_assoc] \\
7263     `inv c * c = 1` by PROVE_TAC [mul_linv_pos] >> POP_ORW \\
7264     REWRITE_TAC [mul_lone]) >> Rewr'
7265 >> `c <> NegInf` by PROVE_TAC [pos_not_neginf, lt_imp_le]
7266 >> Cases_on `c` >> fs [extreal_of_num_def, extreal_lt_eq]
7267 >> `r <> 0` by PROVE_TAC [REAL_LT_LE]
7268 >> `inv (Normal r) = Normal (inv r)`
7269       by ASM_SIMP_TAC std_ss [extreal_inv_def] >> POP_ORW
7270 (* before further moves, we must convert all `integral`s into `pos_fn_intergral`s *)
7271 >> `0 <= inv r` by PROVE_TAC [REAL_LT_IMP_LE, REAL_LE_INV]
7272 >> Know ‘integral m
7273            (\t. Normal (inv r) *
7274                (Normal r * indicator_fn {x | Normal r <= abs (f x)} t *
7275                 indicator_fn a t)) =
7276          pos_fn_integral m
7277            (\t. Normal (inv r) *
7278                (Normal r * indicator_fn {x | Normal r <= abs (f x)} t *
7279                 indicator_fn a t))’
7280 >- (MATCH_MP_TAC integral_pos_fn >> RW_TAC std_ss [] \\
7281     MATCH_MP_TAC le_mul >> CONJ_TAC >- art [extreal_of_num_def, extreal_le_eq] \\
7282     MATCH_MP_TAC le_mul >> reverse CONJ_TAC >- REWRITE_TAC [INDICATOR_FN_POS] \\
7283     MATCH_MP_TAC le_mul >> reverse CONJ_TAC >- REWRITE_TAC [INDICATOR_FN_POS] \\
7284     REWRITE_TAC [extreal_of_num_def, extreal_le_eq] \\
7285     MATCH_MP_TAC REAL_LT_IMP_LE >> art []) >> Rewr'
7286 >> Know `integral m (\x. abs (f x) * indicator_fn a x) =
7287   pos_fn_integral m (\x. abs (f x) * indicator_fn a x)`
7288 >- (MATCH_MP_TAC integral_pos_fn >> art [] \\
7289     RW_TAC std_ss [] \\
7290     MATCH_MP_TAC le_mul >> reverse CONJ_TAC >- REWRITE_TAC [INDICATOR_FN_POS] \\
7291     REWRITE_TAC [abs_pos]) >> Rewr'
7292 >> Know ‘pos_fn_integral m
7293            (\x. Normal (inv r) *
7294                (\t. Normal r * indicator_fn {x | Normal r <= abs (f x)} t *
7295                 indicator_fn a t) x) =
7296          Normal (inv r) *
7297          pos_fn_integral m
7298            (\t. Normal r * indicator_fn {x | Normal r <= abs (f x)} t *
7299                 indicator_fn a t)’
7300 >- (MATCH_MP_TAC pos_fn_integral_cmul >> art [] \\
7301     RW_TAC std_ss [] \\
7302     MATCH_MP_TAC le_mul >> reverse CONJ_TAC >- REWRITE_TAC [INDICATOR_FN_POS] \\
7303     MATCH_MP_TAC le_mul >> reverse CONJ_TAC >- REWRITE_TAC [INDICATOR_FN_POS] \\
7304     REWRITE_TAC [extreal_of_num_def, extreal_le_eq] \\
7305     MATCH_MP_TAC REAL_LT_IMP_LE >> art []) >> BETA_TAC >> Rewr'
7306 >> MATCH_MP_TAC le_lmul_imp
7307 >> CONJ_TAC >- art [extreal_of_num_def, extreal_le_eq]
7308 (* now the core of proof: a smart application of `le_trans` *)
7309 >> MATCH_MP_TAC le_trans
7310 >> Q.EXISTS_TAC
7311     ‘pos_fn_integral m
7312        (\t. abs (f t) * indicator_fn {x | Normal r <= abs (f x)} t *
7313             indicator_fn a t)’
7314 >> CONJ_TAC
7315 >- (MATCH_MP_TAC pos_fn_integral_mono \\
7316     RW_TAC std_ss []
7317     >- (MATCH_MP_TAC le_mul >> reverse CONJ_TAC >- REWRITE_TAC [INDICATOR_FN_POS] \\
7318         MATCH_MP_TAC le_mul >> reverse CONJ_TAC >- REWRITE_TAC [INDICATOR_FN_POS] \\
7319         REWRITE_TAC [extreal_of_num_def, extreal_le_eq] \\
7320         MATCH_MP_TAC REAL_LT_IMP_LE >> art []) \\
7321     Cases_on `Normal r <= abs (f x)`
7322     >- (REWRITE_TAC [GSYM mul_assoc] \\
7323         MATCH_MP_TAC le_rmul_imp >> art [] \\
7324         MATCH_MP_TAC le_mul >> REWRITE_TAC [INDICATOR_FN_POS]) \\
7325     ASM_SIMP_TAC std_ss [indicator_fn_def, GSPECIFICATION, mul_lzero, mul_rzero,
7326                          le_refl])
7327 >> MATCH_MP_TAC pos_fn_integral_mono
7328 >> RW_TAC std_ss []
7329 >- (MATCH_MP_TAC le_mul >> reverse CONJ_TAC >- REWRITE_TAC [INDICATOR_FN_POS] \\
7330     MATCH_MP_TAC le_mul >> reverse CONJ_TAC >- REWRITE_TAC [INDICATOR_FN_POS] \\
7331     REWRITE_TAC [abs_pos])
7332 >> MATCH_MP_TAC le_rmul_imp
7333 >> REWRITE_TAC [INDICATOR_FN_POS]
7334 >> `abs (f x) = abs (f x) * 1` by PROVE_TAC [mul_rone]
7335 >> POP_ASSUM (GEN_REWRITE_TAC (RAND_CONV o ONCE_DEPTH_CONV) empty_rewrites o wrap)
7336 >> MATCH_MP_TAC le_lmul_imp
7337 >> REWRITE_TAC [abs_pos, INDICATOR_FN_LE_1]
7338QED
7339
7340(* The special version with `a = m_space m`, the part `INTER m_space m` cannot be
7341   removed, because in general the PREIMAGE of f may go outside of `m_space m`,
7342   even it's integrable.
7343 *)
7344Theorem markov_ineq :
7345    !m f c. measure_space m /\ integrable m f /\ 0 < c ==>
7346            measure m ({x | c <= abs (f x)} INTER m_space m) <=
7347            inv c * integral m (abs o f)
7348Proof
7349    RW_TAC std_ss [o_DEF]
7350 >> MP_TAC (Q.SPECL [`m`, `f`, `m_space m`, `c`] markov_inequality)
7351 >> Know `m_space m IN measurable_sets m`
7352 >- (MATCH_MP_TAC (REWRITE_RULE [space_def, subsets_def]
7353                    (Q.SPEC ‘(m_space m,measurable_sets m)’ ALGEBRA_SPACE)) \\
7354     fs [measure_space_def, sigma_algebra_def])
7355 >> RW_TAC std_ss []
7356 >> Know ‘integral m (\x. abs (f x)) =
7357          integral m (\t. (\x. abs (f x)) t * indicator_fn (m_space m) t)’
7358 >- (MATCH_MP_TAC integral_mspace >> art [])
7359 >> BETA_TAC >> Rewr' >> art []
7360QED
7361
7362(* This is not needed any more (but could be useful somewhere)
7363Theorem markov_inequality_AE : (* was: positive_integral_Markov_inequality *)
7364    !M A u c. measure_space M /\
7365              u IN measurable (m_space M, measurable_sets M) Borel /\
7366              (AE x::M. 0 <= u x) /\ A IN measurable_sets M ==>
7367       measure M ({x | x IN m_space M /\ 1 <= &c * u x} INTER A) <=
7368         &c * pos_fn_integral M (\x. u x * indicator_fn A x)
7369Proof
7370QED
7371*)
7372
7373(* Theorem 10.4 (v) [1, p.85] (Triangle Inequality) *)
7374Theorem integral_triangle_ineq :
7375    !m f. measure_space m /\ integrable m f ==>
7376          abs (integral m f) <= integral m (abs o f)
7377Proof
7378    RW_TAC std_ss [abs_max, Once neg_minus1, extreal_of_num_def, extreal_ainv_def]
7379 >> Know `Normal (-1) * integral m f = integral m (\x. Normal (-1) * f x)`
7380 >- (MATCH_MP_TAC EQ_SYM \\
7381     MATCH_MP_TAC integral_cmul >> art []) >> Rewr'
7382 >> Know `integral m (abs o f) = max (integral m (abs o f)) (integral m (abs o f))`
7383 >- REWRITE_TAC [max_refl] >> Rewr'
7384 >> MATCH_MP_TAC max_le2_imp
7385 >> CONJ_TAC
7386 >- (MATCH_MP_TAC integral_mono >> RW_TAC std_ss [le_abs] \\
7387     MATCH_MP_TAC integrable_abs >> art [])
7388 >> MATCH_MP_TAC integral_mono >> RW_TAC std_ss []
7389 >- (MATCH_MP_TAC integrable_cmul >> art [])
7390 >- (MATCH_MP_TAC integrable_abs >> art [])
7391 >> REWRITE_TAC [GSYM extreal_of_num_def, GSYM extreal_ainv_def, GSYM neg_minus1]
7392 >> REWRITE_TAC [le_abs]
7393QED
7394
7395(* special version, RHS is for `pos_fn_integral` *)
7396Theorem integral_triangle_ineq' :
7397    !m f. measure_space m /\ integrable m f ==>
7398          abs (integral m f) <= pos_fn_integral m (abs o f)
7399Proof
7400    rpt STRIP_TAC
7401 >> Suff `pos_fn_integral m (abs o f) = integral m (abs o f)`
7402 >- (Rewr' >> MATCH_MP_TAC integral_triangle_ineq >> art [])
7403 >> MATCH_MP_TAC EQ_SYM
7404 >> MATCH_MP_TAC integral_pos_fn
7405 >> RW_TAC std_ss [o_DEF, abs_pos]
7406QED
7407
7408(* Theorem 11.2 (ii) [1, p.89-90], cf. pos_fn_integral_null_set *)
7409Theorem integral_null_set :
7410    !m f N. measure_space m /\
7411            f IN measurable (m_space m, measurable_sets m) Borel /\
7412            N IN null_set m ==> integrable m (\x. f x * indicator_fn N x) /\
7413                                 (integral m (\x. f x * indicator_fn N x) = 0)
7414Proof
7415    rpt GEN_TAC
7416 >> SIMP_TAC std_ss [IN_NULL_SET, null_set_def] >> STRIP_TAC
7417 >> Q.ABBREV_TAC `fi = \i:num x. min ((abs o f) x) &i`
7418 >> Know `!i x. 0 <= fi i x`
7419 >- (rpt GEN_TAC >> Q.UNABBREV_TAC `fi` \\
7420     RW_TAC std_ss [le_min, abs_pos] \\
7421     RW_TAC real_ss [extreal_of_num_def, extreal_le_eq]) >> DISCH_TAC
7422 >> Know `!x. (abs o f) x = sup (IMAGE (\i. fi i x) univ(:num))`
7423 >- (GEN_TAC >> Q.UNABBREV_TAC `fi` \\
7424     SIMP_TAC std_ss [o_DEF] \\
7425     Cases_on `(f x = PosInf) \/ (f x = NegInf)` (* special case *)
7426     >- (POP_ASSUM STRIP_ASSUME_TAC \\ (* 2 subgoals, same tactics *)
7427         (ASM_SIMP_TAC std_ss [extreal_abs_def, min_infty] \\
7428          MATCH_MP_TAC EQ_SYM \\
7429          Suff `IMAGE (\i. &i) univ(:num) = \x. ?n. x = &n` >- rw [sup_num] \\
7430          RW_TAC std_ss [Once EXTENSION, IN_IMAGE, IN_UNIV, IN_APP])) >> fs [] \\
7431     MATCH_MP_TAC EQ_SYM >> RW_TAC std_ss [sup_eq'] \\
7432     POP_ASSUM (STRIP_ASSUME_TAC o BETA_RULE o
7433                (REWRITE_RULE [IN_IMAGE, IN_UNIV])) >| (* 2 subgoals *)
7434     [ (* goal 1 (of 2) *)
7435       Q.PAT_X_ASSUM `y = min (abs (f x)) (&x')` (ONCE_REWRITE_TAC o wrap) \\
7436       RW_TAC std_ss [min_le, le_refl],
7437       (* goal 2 (of 2) *)
7438      `abs (f x) <> PosInf` by PROVE_TAC [abs_not_infty] \\
7439       POP_ASSUM (STRIP_ASSUME_TAC o
7440                  (MATCH_MP (Q.SPEC `abs ((f :'a -> extreal) x)` SIMP_EXTREAL_ARCH))) \\
7441       Cases_on `&n <= y` (* easy case *)
7442       >- (MATCH_MP_TAC le_trans >> Q.EXISTS_TAC `&n` >> art []) \\
7443       Q.PAT_X_ASSUM `!z. P ==> z <= y` MATCH_MP_TAC \\
7444       Q.EXISTS_TAC `&n` >> PROVE_TAC [min_reduce] ]) >> DISCH_TAC
7445 >> Q.ABBREV_TAC `fi' = \i:num x. fi i x * indicator_fn N x`
7446 >> Know `!i x. 0 <= fi' i x`
7447 >- (rpt GEN_TAC >> Q.UNABBREV_TAC `fi'` >> BETA_TAC \\
7448     MATCH_MP_TAC le_mul >> art [INDICATOR_FN_POS]) >> DISCH_TAC
7449 >> Know `!x. (abs o f) x * indicator_fn N x = sup (IMAGE (\i. fi' i x) univ(:num))`
7450 >- (GEN_TAC >> Q.UNABBREV_TAC `fi'` >> BETA_TAC >> POP_ORW \\
7451    `indicator_fn N x <> PosInf /\ indicator_fn N x <> NegInf`
7452       by PROVE_TAC [INDICATOR_FN_NOT_INFTY] \\
7453    `0 <= indicator_fn N x` by PROVE_TAC [INDICATOR_FN_POS] \\
7454    `?r. indicator_fn N x = Normal r` by METIS_TAC [extreal_cases] \\
7455    `0 <= r` by METIS_TAC [extreal_of_num_def, extreal_le_eq] \\
7456     ONCE_REWRITE_TAC [mul_comm] \\
7457     Q.PAT_X_ASSUM `indicator_fn N x = Normal r` (ONCE_REWRITE_TAC o wrap) \\
7458     POP_ASSUM (rw o wrap o (MATCH_MP sup_cmul))) >> DISCH_TAC
7459 >> `sigma_algebra (m_space m,measurable_sets m)` by PROVE_TAC [measure_space_def]
7460 (* applying Beppo Levi *)
7461 >> Know `pos_fn_integral m (\x. (abs o f) x * indicator_fn N x) =
7462          sup (IMAGE (\i. pos_fn_integral m (fi' i)) univ(:num))`
7463 >- (MATCH_MP_TAC lebesgue_monotone_convergence >> art [] \\
7464     Q.UNABBREV_TAC `fi'` >> REV_FULL_SIMP_TAC bool_ss [] \\
7465     rpt STRIP_TAC >| (* 2 subgoals *)
7466     [ (* goal 1 (of 2) *)
7467       MATCH_MP_TAC IN_MEASURABLE_BOREL_MUL_INDICATOR \\
7468       ASM_SIMP_TAC std_ss [subsets_def] \\
7469       Q.UNABBREV_TAC `fi` >> BETA_TAC \\
7470      `(\x. min ((abs o f) x) (&i)) = (\x. min ((abs o f) x) ((\x. &i) x))`
7471          by METIS_TAC [] >> POP_ORW \\
7472       MATCH_MP_TAC IN_MEASURABLE_BOREL_MIN >> art [] \\
7473       CONJ_TAC >- (MATCH_MP_TAC IN_MEASURABLE_BOREL_ABS' >> art []) \\
7474       MATCH_MP_TAC IN_MEASURABLE_BOREL_CONST' >> art [],
7475       (* goal 2 (of 2) *)
7476       RW_TAC std_ss [ext_mono_increasing_suc] \\
7477       reverse (Cases_on `x IN N`)
7478       >- (ASM_SIMP_TAC std_ss [indicator_fn_def, mul_rzero, le_refl]) \\
7479       ASM_SIMP_TAC std_ss [indicator_fn_def, mul_rone] \\
7480       Q.UNABBREV_TAC `fi` >> BETA_TAC \\
7481      `(&i :real) < &(SUC i)` by RW_TAC real_ss [] \\
7482      `(&i :extreal) < &(SUC i)` by METIS_TAC [extreal_lt_eq, extreal_of_num_def] \\
7483       RW_TAC std_ss [o_DEF, extreal_min_def, le_refl] >| (* 3 subgoals *)
7484       [ (* goal 3.1 (of 3) *)
7485         REV_FULL_SIMP_TAC bool_ss [GSYM extreal_lt_def] \\
7486         METIS_TAC [let_trans, lt_antisym],
7487         (* goal 3.1 (of 3) *)
7488         REV_FULL_SIMP_TAC bool_ss [GSYM extreal_lt_def] \\
7489         MATCH_MP_TAC lt_imp_le >> art [],
7490         (* goal 3.3 (of 3) *)
7491         MATCH_MP_TAC lt_imp_le >> art [] ] ]) >> DISCH_TAC
7492 >> Know `!i. pos_fn_integral m (fi' i) <= pos_fn_integral m (\x. &i * indicator_fn N x)`
7493 >- (GEN_TAC >> MATCH_MP_TAC pos_fn_integral_mono \\
7494     RW_TAC std_ss [] >> qunabbrevl_tac [`fi'`, `fi`] >> BETA_TAC \\
7495     reverse (Cases_on `x IN N`)
7496     >- (ASM_SIMP_TAC std_ss [indicator_fn_def, mul_rzero, le_refl]) \\
7497     ASM_SIMP_TAC std_ss [indicator_fn_def, mul_rone, min_le2])
7498 >> Know `!i. pos_fn_integral m (\x. &i * indicator_fn N x) =
7499              &i * pos_fn_integral m (indicator_fn N)`
7500 >- (GEN_TAC >> SIMP_TAC std_ss [extreal_of_num_def] \\
7501     MATCH_MP_TAC pos_fn_integral_cmul \\
7502     RW_TAC real_ss [INDICATOR_FN_POS, extreal_of_num_def, extreal_lt_eq])
7503 >> ASM_SIMP_TAC std_ss [pos_fn_integral_indicator, mul_rzero]
7504 >> DISCH_THEN K_TAC >> DISCH_TAC
7505 >> Know `!i. pos_fn_integral m (fi' i) = 0`
7506 >- (GEN_TAC >> RW_TAC std_ss [GSYM le_antisym] \\
7507     MATCH_MP_TAC pos_fn_integral_pos >> art [])
7508 >> POP_ASSUM K_TAC >> DISCH_TAC
7509 >> Know `sup (IMAGE (\i. pos_fn_integral m (fi' i)) univ(:num)) = 0`
7510 >- (POP_ORW \\
7511     Suff `IMAGE (\i. (0 :extreal)) univ(:num) = (\y. y = 0)`
7512     >- (Rewr' >> REWRITE_TAC [sup_const]) \\
7513     RW_TAC std_ss [Once EXTENSION, IN_IMAGE, IN_UNIV] \\
7514     SIMP_TAC std_ss [IN_APP])
7515 >> POP_ASSUM K_TAC
7516 >> DISCH_THEN ((REV_FULL_SIMP_TAC bool_ss) o wrap)
7517 >> Know `pos_fn_integral m (\x. (abs o f) x * indicator_fn N x) = 0`
7518 >- (Q.PAT_X_ASSUM `!x. (abs o f) x = _` (ONCE_REWRITE_TAC o wrap) \\
7519     ASM_SIMP_TAC std_ss [])
7520 >> POP_ASSUM K_TAC >> DISCH_TAC
7521 >> Q.PAT_X_ASSUM `!i x. 0 <= fi' i x` K_TAC
7522 >> Q.UNABBREV_TAC `fi'`
7523 (* integrable m (\x. f x * indicator_fn N x) *)
7524 >> STRONG_CONJ_TAC
7525 >- (SIMP_TAC std_ss [integrable_def] \\
7526     CONJ_TAC >- (MATCH_MP_TAC IN_MEASURABLE_BOREL_MUL_INDICATOR \\
7527                  ASM_SIMP_TAC std_ss [subsets_def]) \\
7528     CONJ_TAC >| (* 2 subgoals *)
7529     [ (* goal 1 (of 2) *)
7530       Suff `pos_fn_integral m (fn_plus (\x. f x * indicator_fn N x)) <= 0`
7531       >- METIS_TAC [neg_not_posinf] \\
7532       POP_ASSUM (ONCE_REWRITE_TAC o wrap o SYM) \\
7533       REWRITE_TAC [GSYM INDICATOR_FN_ABS_MUL] \\
7534       MATCH_MP_TAC pos_fn_integral_mono \\
7535       RW_TAC std_ss [o_DEF, FN_PLUS_LE_ABS, FN_PLUS_POS],
7536       (* goal 2 (of 2) *)
7537       Suff `pos_fn_integral m (fn_minus (\x. f x * indicator_fn N x)) <= 0`
7538       >- METIS_TAC [neg_not_posinf] \\
7539       POP_ASSUM (ONCE_REWRITE_TAC o wrap o SYM) \\
7540       REWRITE_TAC [GSYM INDICATOR_FN_ABS_MUL] \\
7541       MATCH_MP_TAC pos_fn_integral_mono \\
7542       RW_TAC std_ss [o_DEF, FN_MINUS_LE_ABS, FN_MINUS_POS] ])
7543 >> DISCH_TAC
7544 >> REWRITE_TAC [GSYM abs_le_0]
7545 >> Q.PAT_X_ASSUM `_ = 0` (ONCE_REWRITE_TAC o wrap o SYM)
7546 >> REWRITE_TAC [GSYM INDICATOR_FN_ABS_MUL]
7547 >> MATCH_MP_TAC integral_triangle_ineq' >> art []
7548QED
7549
7550(* Theorem 11.2 (i) [1, p.89] *)
7551Theorem integral_abs_eq_0 :
7552    !m f. measure_space m /\
7553          f IN measurable (m_space m, measurable_sets m) Borel ==>
7554        ((integral m (abs o f) = 0) <=> AE x::m. (abs o f) x = 0) /\
7555        ((AE x::m. (abs o f) x = 0) <=> (measure m {x | x IN m_space m /\ f x <> 0} = 0))
7556Proof
7557    rpt GEN_TAC >> STRIP_TAC
7558 >> ‘sigma_algebra (measurable_space m)’
7559      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA]
7560 >> Know `{x | x IN m_space m /\ f x <> 0} IN measurable_sets m`
7561 >- (`{x | x IN m_space m /\ f x <> 0} = {x | f x <> 0} INTER m_space m` by SET_TAC [] \\
7562     POP_ORW >> METIS_TAC [IN_MEASURABLE_BOREL_ALL_MEASURE]) >> DISCH_TAC
7563 >> ONCE_REWRITE_TAC [CONJ_SYM]
7564 >> STRONG_CONJ_TAC (* by definition of AE and null_set *)
7565 >- (reverse EQ_TAC
7566     >- (RW_TAC std_ss [AE_ALT, null_set_def] \\
7567         Q.EXISTS_TAC `{x | x IN m_space m /\ f x <> 0}` \\
7568         ASM_REWRITE_TAC [SUBSET_REFL, abs_eq_0]) \\
7569     RW_TAC std_ss [AE_ALT, null_set_def] \\
7570     RW_TAC std_ss [Once CONJ_SYM, Once (GSYM le_antisym)] >| (* 2 subgoals *)
7571     [ (* goal 1 (of 2) *)
7572       IMP_RES_TAC MEASURE_SPACE_POSITIVE \\
7573       fs [positive_def, measure_def, measurable_sets_def],
7574       (* goal 2 (of 2) *)
7575       Q.PAT_X_ASSUM `measure m N = 0`
7576         ((GEN_REWRITE_TAC (RAND_CONV o ONCE_DEPTH_CONV) empty_rewrites) o wrap o SYM) \\
7577       IMP_RES_TAC MEASURE_SPACE_INCREASING \\
7578       MATCH_MP_TAC INCREASING >> fs [abs_eq_0] ]) >> DISCH_TAC
7579 (* RHS ==> LHS, by AE and integral_null_set *)
7580 >> reverse EQ_TAC
7581 >- (SIMP_TAC bool_ss [AE_ALT, GSYM IN_NULL_SET] >> STRIP_TAC \\
7582     Know `(abs o f) IN measurable (m_space m, measurable_sets m) Borel`
7583     >- (MATCH_MP_TAC IN_MEASURABLE_BOREL_ABS' >> art []) >> DISCH_TAC \\
7584    `!x. 0 <= (abs o f) x` by METIS_TAC [o_DEF, abs_pos] \\
7585    `N IN measurable_sets m /\ (measure m N = 0)` by METIS_TAC [IN_NULL_SET, null_set_def] \\
7586     Know `{x | x IN m_space m /\ (abs o f) x <> 0} IN measurable_sets m`
7587     >- (ASM_SIMP_TAC std_ss [o_DEF, abs_eq_0]) >> DISCH_TAC \\
7588     MP_TAC (Q.SPECL [`m`, `abs o f`,
7589                      `{x | x IN m_space m /\ (abs o f) x <> 0}`] integral_split) \\
7590     RW_TAC bool_ss [] >> POP_ASSUM K_TAC \\
7591     MP_TAC (Q.SPECL [`m`, `abs o f`,
7592                      `{x | x IN m_space m /\ (abs o f) x <> 0}`] integral_null_set) \\
7593     Know `{x | x IN m_space m /\ (abs o f) x <> 0} IN null_set m`
7594     >- (RW_TAC bool_ss [null_set_def, IN_NULL_SET] \\
7595         RW_TAC bool_ss [Once CONJ_SYM, Once (GSYM le_antisym)] >| (* 2 subgoals *)
7596         [ (* goal 1 (of 2) *)
7597           IMP_RES_TAC MEASURE_SPACE_POSITIVE \\
7598           fs [positive_def, measure_def, measurable_sets_def],
7599           (* goal 2 (of 2) *)
7600           Q.PAT_X_ASSUM `measure m N = 0`
7601             ((GEN_REWRITE_TAC (RAND_CONV o ONCE_DEPTH_CONV) empty_rewrites) o wrap o SYM) \\
7602           IMP_RES_TAC MEASURE_SPACE_INCREASING \\
7603           MATCH_MP_TAC INCREASING >> art [] ]) \\
7604     RW_TAC bool_ss [add_lzero] \\
7605     Suff `integral m
7606             (\x. (abs o f) x *
7607                  indicator_fn (m_space m DIFF {x | x IN m_space m /\ (abs o f) x <> 0}) x) =
7608           integral m (\x. 0)` >- (Rewr' >> MATCH_MP_TAC integral_zero >> art []) \\
7609     MATCH_MP_TAC integral_cong >> art [] \\
7610     RW_TAC bool_ss [] \\
7611     reverse (Cases_on `x IN (m_space m DIFF {x | x IN m_space m /\ (abs o f) x <> 0})`)
7612     >- (ASM_SIMP_TAC bool_ss [indicator_fn_def, mul_rzero]) \\
7613     POP_ASSUM MP_TAC \\
7614     RW_TAC bool_ss [IN_DIFF, GSPECIFICATION, mul_lzero])
7615 (* LHS ==> RHS, by markov_ineq *)
7616 >> DISCH_TAC >> Q.PAT_X_ASSUM `_ <=> (measure m _ = 0)` (ONCE_REWRITE_TAC o wrap)
7617 >> REWRITE_TAC [GSYM abs_gt_0]
7618 >> `{x | x IN m_space m /\ 0 < abs (f x)} = {x | 0 < abs (f x)} INTER m_space m`
7619       by SET_TAC [] >> POP_ORW
7620 >> Know `{x | 0 < abs (f x)} INTER m_space m =
7621          BIGUNION (IMAGE (\n. {x | 1 / &(SUC n) <= abs (f x)} INTER m_space m) UNIV)`
7622 >- (RW_TAC std_ss [Once EXTENSION, IN_INTER, IN_BIGUNION_IMAGE, IN_UNIV,
7623                    GSPECIFICATION] \\
7624     reverse EQ_TAC >> rpt STRIP_TAC >> RW_TAC std_ss []
7625     >- (MATCH_MP_TAC lte_trans >> Q.EXISTS_TAC `1 / &(SUC n)` >> art [] \\
7626        `&(SUC n) = Normal &(SUC n)` by METIS_TAC [extreal_of_num_def] >> POP_ORW \\
7627         MATCH_MP_TAC lt_div >> RW_TAC real_ss [lt_01]) \\
7628     MP_TAC (Q.SPEC `inv (abs (f x))` SIMP_EXTREAL_ARCH) \\
7629    `abs (f x) <> 0` by PROVE_TAC [lt_le] \\
7630    `inv (abs (f x)) <> PosInf` by PROVE_TAC [inv_not_infty] \\
7631     RW_TAC std_ss [] \\
7632     Q.EXISTS_TAC `n` \\
7633     Cases_on `abs (f x) = PosInf` >- art [le_infty] \\
7634    `&(SUC n) <> (0 :real)` by RW_TAC real_ss [] \\
7635    `&(SUC n) <> (0 :extreal)` by METIS_TAC [extreal_of_num_def, extreal_11] \\
7636    `abs (f x) <> NegInf` by METIS_TAC [pos_not_neginf, lt_imp_le] \\
7637    `?r. abs (f x) = Normal r` by METIS_TAC [extreal_cases] \\
7638     FULL_SIMP_TAC std_ss [extreal_of_num_def, extreal_div_eq,
7639                           extreal_11, extreal_le_eq, extreal_lt_eq] \\
7640     rfs [extreal_inv_eq, extreal_le_eq, REAL_INV_1OVER] \\
7641     rfs [REAL_LE_LDIV_EQ, REAL_LT_LDIV_EQ] \\
7642     MATCH_MP_TAC REAL_LE_TRANS \\
7643     Q.EXISTS_TAC `r * &n` >> art [] \\
7644    `(&n :real) < &SUC n` by RW_TAC real_ss [] \\
7645     ASM_SIMP_TAC real_ss [REAL_LE_LMUL]) >> DISCH_TAC
7646 >> Know `(abs o f) IN measurable (m_space m,measurable_sets m) Borel`
7647 >- (MATCH_MP_TAC IN_MEASURABLE_BOREL_ABS' >> art []) >> DISCH_TAC
7648 >> Know `{x | 0 < (abs o f) x} INTER m_space m IN measurable_sets m`
7649 >- METIS_TAC [IN_MEASURABLE_BOREL_ALL_MEASURE]
7650 >> ASM_SIMP_TAC std_ss [o_DEF] >> DISCH_TAC
7651 >> Know `!n. {x | 1 / &SUC n <= (abs o f) x} INTER m_space m IN measurable_sets m`
7652 >- METIS_TAC [IN_MEASURABLE_BOREL_ALL_MEASURE]
7653 >> ASM_SIMP_TAC std_ss [o_DEF] >> DISCH_TAC
7654 >> IMP_RES_TAC MEASURE_SPACE_COUNTABLY_SUBADDITIVE
7655 >> Q.ABBREV_TAC `g = \n. {x | 1 / &SUC n <= abs (f x)} INTER m_space m`
7656 >> RW_TAC std_ss [GSYM le_antisym, Once CONJ_SYM]
7657 >- (IMP_RES_TAC MEASURE_SPACE_POSITIVE \\
7658     fs [positive_def, measurable_sets_def, measure_def])
7659 >> Know `measure m (BIGUNION (IMAGE g UNIV)) <= suminf (measure m o g)`
7660 >- (MATCH_MP_TAC COUNTABLY_SUBADDITIVE >> art [] \\
7661     Q.UNABBREV_TAC `g` >> RW_TAC std_ss [IN_FUNSET, IN_UNIV]) >> DISCH_TAC
7662 >> MATCH_MP_TAC le_trans
7663 >> Q.EXISTS_TAC `suminf (measure m o g)` >> art []
7664 >> Know `!n. (measure m o g) n <= inv (1 / &SUC n) * integral m (abs o f)`
7665 >- (GEN_TAC >> Q.UNABBREV_TAC `g` \\
7666     GEN_REWRITE_TAC (RATOR_CONV o ONCE_DEPTH_CONV) empty_rewrites [o_DEF] \\
7667     SIMP_TAC std_ss [] \\
7668     MATCH_MP_TAC markov_ineq >> art [] \\
7669     reverse CONJ_TAC
7670     >- (`&(SUC n) = Normal &(SUC n)` by METIS_TAC [extreal_of_num_def] >> POP_ORW \\
7671         MATCH_MP_TAC lt_div >> art [lt_01] \\
7672         RW_TAC real_ss [extreal_of_num_def, extreal_lt_eq]) \\
7673     MATCH_MP_TAC integral_abs_imp_integrable >> art [])
7674 >> RW_TAC bool_ss [mul_rzero]
7675 >> Know `!n. (measure m o g) n = 0`
7676 >- (RW_TAC bool_ss [GSYM le_antisym, Once CONJ_SYM] \\
7677     IMP_RES_TAC MEASURE_SPACE_POSITIVE \\
7678     Q.UNABBREV_TAC `g` >> SIMP_TAC std_ss [o_DEF] \\
7679     fs [positive_def, measure_def, measurable_sets_def])
7680 >> POP_ASSUM K_TAC >> DISCH_TAC
7681 >> REWRITE_TAC [le_lt] >> DISJ2_TAC
7682 >> MATCH_MP_TAC ext_suminf_zero >> art []
7683QED
7684
7685(* NOTE: changed ‘nonneg f’ to ‘!x. x IN m_space m ==> 0 <= f x’ *)
7686Theorem pos_fn_integral_eq_0 : (* was: positive_integral_0_iff *)
7687    !m f. measure_space m /\ (!x. x IN m_space m ==> 0 <= f x) /\
7688          f IN measurable (m_space m, measurable_sets m) Borel ==>
7689        ((pos_fn_integral m f = 0) <=>
7690         (measure m {x | x IN m_space m /\ f x <> 0} = 0))
7691Proof
7692    rpt STRIP_TAC
7693 >> MP_TAC (Q.SPECL [`m`, `f`] integral_abs_eq_0)
7694 >> RW_TAC std_ss []
7695 >> POP_ASSUM (ONCE_REWRITE_TAC o wrap o SYM)
7696 >> POP_ASSUM (ONCE_REWRITE_TAC o wrap o SYM)
7697 >> Know `integral m (abs o f) = pos_fn_integral m (abs o f)`
7698 >- (MATCH_MP_TAC integral_pos_fn >> rw [abs_pos])
7699 >> Rewr'
7700 >> Suff ‘pos_fn_integral m f = pos_fn_integral m (abs o f)’ >- rw []
7701 >> MATCH_MP_TAC pos_fn_integral_cong
7702 >> rw [abs_pos]
7703 >> METIS_TAC [abs_refl]
7704QED
7705
7706Theorem integral_eq_0 :
7707    !m f. f IN measurable (m_space m, measurable_sets m) Borel /\
7708          measure_space m /\ (AE x::m. 0 <= f x) ==>
7709        ((integral m f = 0) <=> (measure m {x | x IN m_space m /\ f x <> 0} = 0))
7710Proof
7711    qx_genl_tac [‘M’, ‘u’] >> STRIP_TAC
7712 >> MP_TAC (Q.SPECL [`M`, `u`] integral_abs_eq_0) >> RW_TAC std_ss []
7713 >> POP_ASSUM (ONCE_REWRITE_TAC o wrap o SYM)
7714 >> POP_ASSUM (ONCE_REWRITE_TAC o wrap o SYM)
7715 >> REWRITE_TAC [integral_def]
7716 >> `nonneg (abs o u)` by PROVE_TAC [nonneg_abs]
7717 >> Know `fn_minus (abs o u) = (\x. 0)`
7718 >- (MATCH_MP_TAC nonneg_fn_minus >> art []) >> Rewr'
7719 >> Know `pos_fn_integral M (fn_plus u) = pos_fn_integral M (fn_plus (abs o u))`
7720 >- (MATCH_MP_TAC pos_fn_integral_cong_AE \\
7721     RW_TAC std_ss [FN_PLUS_POS] \\
7722     fs [AE_ALT, GSYM IN_NULL_SET] \\
7723     Q.EXISTS_TAC `N` >> art [] \\
7724     Suff `{x | x IN m_space M /\ u^+ x <> (abs o u)^+ x} =
7725           {x | x IN m_space M /\ ~(0 <= u x)}` >- rw [] \\
7726     RW_TAC std_ss [Once EXTENSION, GSPECIFICATION, fn_plus_def] \\
7727     reverse EQ_TAC >> rpt STRIP_TAC >> RW_TAC std_ss []
7728     >- (fs [GSYM extreal_lt_def] \\
7729         `~(0 < u x)` by METIS_TAC [lt_antisym] >> fs [] \\
7730         `u x <> 0` by METIS_TAC [lt_le] \\
7731         `0 < abs (u x)` by METIS_TAC [abs_gt_0] \\
7732          METIS_TAC [lt_le]) \\
7733     fs [le_lt] >- (fs [] >> `u x <> 0` by METIS_TAC [lt_le] \\
7734                   `0 < abs (u x)` by METIS_TAC [abs_gt_0] \\
7735                    fs [] >> METIS_TAC [abs_refl, lt_imp_le]) \\
7736     `~(0 < u x)` by METIS_TAC [lt_refl] \\
7737     `~(0 < abs (u x))` by METIS_TAC [abs_0] >> fs []) >> Rewr'
7738 >> Suff `pos_fn_integral M (fn_minus u) = pos_fn_integral M (\x. 0)` >- rw []
7739 >> MATCH_MP_TAC pos_fn_integral_cong_AE
7740 >> RW_TAC std_ss [FN_MINUS_POS, le_refl]
7741 >> fs [AE_ALT, GSYM IN_NULL_SET]
7742 >> Q.EXISTS_TAC `N` >> art []
7743 >> Suff `{x | x IN m_space M /\ u^- x <> 0} =
7744          {x | x IN m_space M /\ ~(0 <= u x)}` >- rw []
7745 >> RW_TAC std_ss [Once EXTENSION, GSPECIFICATION, fn_minus_def]
7746 >> reverse EQ_TAC >> rpt STRIP_TAC >> RW_TAC std_ss []
7747 >- (fs [GSYM extreal_lt_def] >> rfs [] \\
7748     `u x <> 0` by METIS_TAC [lt_le] >> METIS_TAC [neg_eq0])
7749 >> `~(u x < 0)` by METIS_TAC [extreal_lt_def] >> fs []
7750QED
7751
7752val indicator_fn_pos_le = INDICATOR_FN_POS;
7753
7754Theorem pos_fn_integral_cmult' :
7755    !f c m. measure_space m /\ 0 <= c /\
7756            f IN measurable (m_space m, measurable_sets m) Borel ==>
7757           (pos_fn_integral m (\x. max 0 (c * f x)) =
7758            c * pos_fn_integral m (\x. max 0 (f x)))
7759Proof
7760    RW_TAC std_ss []
7761 >> Q.ABBREV_TAC `g = (\x. max 0 (f x))`
7762 >> Know `!x. max 0 (c * f x) = c * g x`
7763 >- (RW_TAC std_ss [Abbr ‘g’, extreal_max_def, mul_rzero]
7764     >- (UNDISCH_TAC ``0 <= c * f x`` >> ONCE_REWRITE_TAC [MONO_NOT_EQ] \\
7765         RW_TAC std_ss [GSYM extreal_lt_def] >> ONCE_REWRITE_TAC [GSYM lt_neg] \\
7766         SIMP_TAC std_ss [neg_0, GSYM mul_rneg] >> MATCH_MP_TAC lt_mul \\
7767         CONJ_TAC
7768         >- (SIMP_TAC std_ss [extreal_lt_def] >> POP_ASSUM MP_TAC \\
7769             ONCE_REWRITE_TAC [MONO_NOT_EQ] >> RW_TAC std_ss [] \\
7770            `c = 0` by METIS_TAC [le_antisym] THEN ASM_SIMP_TAC std_ss [mul_lzero]) \\
7771         ONCE_REWRITE_TAC [GSYM lt_neg] \\
7772         ASM_SIMP_TAC std_ss [neg_0, extreal_lt_def, neg_neg]) \\
7773     REWRITE_TAC [GSYM le_antisym] \\
7774     CONJ_TAC >- METIS_TAC [le_mul] \\
7775     METIS_TAC [le_lt, extreal_lt_def]) >> DISC_RW_KILL
7776 >> Know `g IN measurable (m_space m,measurable_sets m) Borel`
7777 >- (Q.UNABBREV_TAC `g` THEN ONCE_REWRITE_TAC [METIS []
7778       ``!x. (\x. max 0 (f x)) = (\x. max ((\x. 0) x) ((\x. f x) x))``] \\
7779     MATCH_MP_TAC IN_MEASURABLE_BOREL_MAX \\
7780     ONCE_REWRITE_TAC [METIS [ETA_AX]  ``(\x. f x) = f``] \\
7781     FULL_SIMP_TAC std_ss [measure_space_def] \\
7782     MATCH_MP_TAC IN_MEASURABLE_BOREL_CONST >> METIS_TAC [])
7783 >> DISCH_TAC
7784 >> `!x. 0 <= g x` by METIS_TAC [le_max1]
7785 >> reverse (Cases_on `c = PosInf`)
7786 >- (`c <> NegInf` by METIS_TAC [le_infty, le_trans, num_not_infty] THEN
7787     `c = Normal (real c)` by METIS_TAC [normal_real] THEN
7788     POP_ASSUM (fn th => ONCE_REWRITE_TAC [th]) THEN
7789     MATCH_MP_TAC pos_fn_integral_cmul THEN ASM_SIMP_TAC std_ss [] THEN
7790     ASM_SIMP_TAC std_ss [GSYM extreal_le_def, normal_real, GSYM extreal_of_num_def] THEN
7791     METIS_TAC [normal_real])
7792 (* c = PosInf *)
7793 >> ASM_SIMP_TAC std_ss []
7794 >> Know `pos_fn_integral m (\x. (\x. c * g x) x *
7795            indicator_fn (({x | g x = 0} INTER m_space m) UNION ({x | 0 < g x} INTER m_space m)) x) =
7796          pos_fn_integral m (\x. (\x. c * g x) x * indicator_fn ({x | g x = 0} INTER m_space m) x) +
7797          pos_fn_integral m (\x. (\x. c * g x) x * indicator_fn ({x | 0 < g x} INTER m_space m) x)`
7798 >- (MATCH_MP_TAC pos_fn_integral_disjoint_sets \\
7799     ASM_SIMP_TAC std_ss [] \\
7800     CONJ_TAC
7801     >- (SIMP_TAC std_ss [DISJOINT_DEF, IN_INTER, EXTENSION, NOT_IN_EMPTY] \\
7802         GEN_TAC >> SIMP_TAC std_ss [GSPECIFICATION] \\
7803         ASM_CASES_TAC ``g (x:'a) <> 0:extreal`` >> FULL_SIMP_TAC std_ss [lt_refl]) \\
7804     CONJ_TAC
7805     >- (`{x | g x = 0} = PREIMAGE g {x | x = 0}` by SET_TAC [PREIMAGE_def] \\
7806         POP_ASSUM (fn th => REWRITE_TAC [th]) >> FULL_SIMP_TAC std_ss [IN_MEASURABLE] \\
7807         FULL_SIMP_TAC std_ss [space_def, subsets_def] \\
7808         FIRST_X_ASSUM MATCH_MP_TAC \\
7809         ONCE_REWRITE_TAC [SET_RULE ``{x | x = 0} = {0}``] \\
7810         SIMP_TAC std_ss [BOREL_MEASURABLE_SETS_SING, extreal_of_num_def]) \\
7811     CONJ_TAC
7812     >- (`{x | 0 < g x} = PREIMAGE g {x | 0 < x}` by SET_TAC [PREIMAGE_def] \\
7813         POP_ASSUM (fn th => REWRITE_TAC [th]) THEN FULL_SIMP_TAC std_ss [IN_MEASURABLE] \\
7814         FULL_SIMP_TAC std_ss [space_def, subsets_def] \\
7815         FIRST_X_ASSUM MATCH_MP_TAC \\
7816         SIMP_TAC std_ss [BOREL_MEASURABLE_SETS_OR, extreal_of_num_def]) \\
7817     CONJ_TAC
7818     >- (MATCH_MP_TAC IN_MEASURABLE_BOREL_TIMES >> Q.EXISTS_TAC `(\x. PosInf)` \\
7819         Q.EXISTS_TAC `g` >> ASM_SIMP_TAC std_ss [] \\
7820         MATCH_MP_TAC IN_MEASURABLE_BOREL_CONST >> Q.EXISTS_TAC `PosInf` \\
7821         METIS_TAC [measure_space_def]) \\
7822     rpt STRIP_TAC \\
7823     MATCH_MP_TAC le_mul >> ASM_SIMP_TAC std_ss [le_infty])
7824 >> RW_TAC std_ss []
7825 >> Know `pos_fn_integral m (\x. PosInf * g x) =
7826          pos_fn_integral m (\x. PosInf * g x *
7827           indicator_fn
7828             ({x | g x = 0} INTER m_space m UNION
7829              {x | 0 < g x} INTER m_space m) x)`
7830 >- (MATCH_MP_TAC pos_fn_integral_cong \\
7831     ASM_SIMP_TAC std_ss [le_mul, le_infty] \\
7832     CONJ_TAC
7833     >- (rpt STRIP_TAC \\
7834         MATCH_MP_TAC le_mul >> ASM_SIMP_TAC std_ss [le_mul, le_infty] \\
7835         SIMP_TAC std_ss [indicator_fn_pos_le]) \\
7836     RW_TAC std_ss [UNION_DEF, IN_INTER, GSPECIFICATION] \\
7837     ASM_SIMP_TAC std_ss [indicator_fn_def, GSPECIFICATION] \\
7838     ONCE_REWRITE_TAC [DISJ_COMM] \\
7839     GEN_REWR_TAC (RAND_CONV o ONCE_DEPTH_CONV) [EQ_SYM_EQ] \\
7840     ASM_SIMP_TAC std_ss [GSYM le_lt, mul_rone])
7841 >> DISC_RW_KILL
7842 >> ASM_SIMP_TAC std_ss []
7843 >> Know `pos_fn_integral m
7844            (\x. PosInf * g x * indicator_fn ({x | g x = 0} INTER m_space m) x) =
7845          pos_fn_integral m (\x. 0)`
7846 >- (MATCH_MP_TAC pos_fn_integral_cong >> ASM_SIMP_TAC std_ss [le_refl] \\
7847     CONJ_TAC
7848     >- (rpt STRIP_TAC >> MATCH_MP_TAC le_mul >> ASM_SIMP_TAC std_ss [le_infty, le_mul] \\
7849         SIMP_TAC std_ss [indicator_fn_pos_le]) \\
7850     RW_TAC std_ss [] >> ASM_SIMP_TAC std_ss [indicator_fn_def, GSPECIFICATION, IN_INTER] \\
7851     COND_CASES_TAC >> ASM_SIMP_TAC std_ss [mul_rone, mul_rzero])
7852 >> DISC_RW_KILL
7853 >> ASM_SIMP_TAC std_ss [pos_fn_integral_zero, add_lzero]
7854 >> Suff `pos_fn_integral m (\x. g x *
7855            indicator_fn (({x | g x = 0} INTER m_space m) UNION ({x | 0 < g x} INTER m_space m)) x) =
7856          pos_fn_integral m (\x. g x * indicator_fn (({x | g x = 0} INTER m_space m)) x) +
7857          pos_fn_integral m (\x. g x * indicator_fn (({x | 0 < g x} INTER m_space m)) x)` >|
7858  [ SIMP_TAC std_ss [] THEN DISCH_TAC,
7859    MATCH_MP_TAC pos_fn_integral_disjoint_sets THEN ASM_SIMP_TAC std_ss [] THEN
7860    CONJ_TAC THENL
7861    [SIMP_TAC std_ss [DISJOINT_DEF, IN_INTER, EXTENSION, NOT_IN_EMPTY] THEN
7862     GEN_TAC THEN SIMP_TAC std_ss [GSPECIFICATION] THEN
7863     ASM_CASES_TAC ``g (x:'a) <> 0:extreal`` THEN FULL_SIMP_TAC std_ss [lt_refl],
7864     ALL_TAC] THEN
7865    CONJ_TAC THENL
7866    [`{x | g x = 0} = PREIMAGE g {x | x = 0}` by SET_TAC [PREIMAGE_def] THEN
7867     POP_ASSUM (fn th => REWRITE_TAC [th]) THEN FULL_SIMP_TAC std_ss [IN_MEASURABLE] THEN
7868     FULL_SIMP_TAC std_ss [space_def, subsets_def] THEN
7869     FIRST_X_ASSUM MATCH_MP_TAC THEN
7870     ONCE_REWRITE_TAC [SET_RULE ``{x | x = 0} = {0}``] THEN
7871     SIMP_TAC std_ss [BOREL_MEASURABLE_SETS_SING, extreal_of_num_def],
7872     ALL_TAC] THEN
7873    `{x | 0 < g x} = PREIMAGE g {x | 0 < x}` by SET_TAC [PREIMAGE_def] THEN
7874    POP_ASSUM (fn th => REWRITE_TAC [th]) THEN FULL_SIMP_TAC std_ss [IN_MEASURABLE] THEN
7875    FULL_SIMP_TAC std_ss [space_def, subsets_def] THEN
7876    FIRST_X_ASSUM MATCH_MP_TAC THEN
7877    SIMP_TAC std_ss [BOREL_MEASURABLE_SETS_OR, extreal_of_num_def] ]
7878 >> Suff `pos_fn_integral m g =
7879          pos_fn_integral m (\x. g x *
7880           indicator_fn
7881             ({x | g x = 0} INTER m_space m UNION
7882              {x | 0 < g x} INTER m_space m) x)` THENL
7883   [DISC_RW_KILL,
7884    MATCH_MP_TAC pos_fn_integral_cong THEN ASM_SIMP_TAC std_ss [le_mul, indicator_fn_pos_le] THEN
7885    RW_TAC std_ss [] THEN
7886    ASM_SIMP_TAC std_ss [UNION_DEF, INTER_DEF, indicator_fn_def, GSPECIFICATION] THEN
7887    ONCE_REWRITE_TAC [DISJ_COMM] THEN
7888    GEN_REWR_TAC (RAND_CONV o ONCE_DEPTH_CONV) [EQ_SYM_EQ] THEN
7889    ASM_SIMP_TAC std_ss [GSYM le_lt, mul_rone]]
7890 >> ASM_SIMP_TAC std_ss []
7891 >> Suff `pos_fn_integral m
7892            (\x. g x * indicator_fn ({x | g x = 0} INTER m_space m) x) =
7893          pos_fn_integral m (\x. 0)` THENL
7894   [DISC_RW_KILL,
7895    MATCH_MP_TAC pos_fn_integral_cong THEN ASM_SIMP_TAC std_ss [le_refl] THEN
7896    CONJ_TAC THENL
7897    [rpt STRIP_TAC >> MATCH_MP_TAC le_mul THEN ASM_SIMP_TAC std_ss [le_infty, le_mul] THEN
7898     SIMP_TAC std_ss [indicator_fn_pos_le], ALL_TAC] THEN
7899    RW_TAC std_ss [] THEN ASM_SIMP_TAC std_ss [indicator_fn_def, GSPECIFICATION, IN_INTER] THEN
7900    COND_CASES_TAC THEN ASM_SIMP_TAC std_ss [mul_rone, mul_rzero]]
7901 >> ASM_SIMP_TAC std_ss [pos_fn_integral_zero, add_lzero]
7902 >> Suff `pos_fn_integral m
7903            (\x. PosInf * g x * indicator_fn ({x | 0 < g x} INTER m_space m) x) =
7904          pos_fn_integral m (\x. PosInf * indicator_fn ({x | 0 < g x} INTER m_space m) x)` THENL
7905   [DISC_RW_KILL,
7906    MATCH_MP_TAC pos_fn_integral_cong THEN ASM_SIMP_TAC std_ss [le_infty] THEN
7907    ASM_SIMP_TAC std_ss [le_mul, indicator_fn_pos_le, le_infty] THEN
7908    RW_TAC std_ss [] THEN ASM_SIMP_TAC std_ss [indicator_fn_def, GSPECIFICATION, IN_INTER] THEN
7909    COND_CASES_TAC THEN ASM_SIMP_TAC std_ss [mul_rone, mul_rzero] THEN
7910    `g x <> NegInf` by METIS_TAC [lt_infty, lte_trans, num_not_infty] THEN
7911    ASM_CASES_TAC ``g x = PosInf`` THEN ASM_SIMP_TAC std_ss [extreal_mul_def] THEN
7912    `g x = Normal (real (g x))` by ASM_SIMP_TAC std_ss [normal_real] THEN
7913    POP_ASSUM (fn th => ONCE_REWRITE_TAC [th]) THEN
7914    SIMP_TAC std_ss [extreal_mul_def, GSYM extreal_11, GSYM extreal_lt_eq] THEN
7915    ASM_SIMP_TAC std_ss [GSYM extreal_of_num_def, normal_real] THEN
7916    `g x <> 0` by METIS_TAC [lt_imp_ne] THEN ASM_SIMP_TAC std_ss []]
7917 >> Suff `{x | 0 < g x} INTER m_space m IN measurable_sets m` THENL
7918   [DISCH_TAC,
7919    `{x | 0 < g x} = PREIMAGE g {x | 0 < x}` by SET_TAC [PREIMAGE_def] THEN
7920    POP_ASSUM (fn th => REWRITE_TAC [th]) THEN FULL_SIMP_TAC std_ss [IN_MEASURABLE] THEN
7921    FULL_SIMP_TAC std_ss [space_def, subsets_def] THEN
7922    FIRST_X_ASSUM MATCH_MP_TAC THEN
7923    SIMP_TAC std_ss [BOREL_MEASURABLE_SETS_OR, extreal_of_num_def]]
7924 >> ASM_SIMP_TAC std_ss [pos_fn_integral_cmul_infty]
7925 >> ASM_CASES_TAC ``measure m ({x | 0 < g x} INTER m_space m) = 0``
7926 >- (Suff `pos_fn_integral m
7927             (\x. g x * indicator_fn ({x | 0 < g x} INTER m_space m) x) = 0` THENL
7928     [DISC_RW_KILL,
7929      MATCH_MP_TAC pos_fn_integral_null_set THEN
7930      ASM_SIMP_TAC std_ss [null_sets, GSPECIFICATION]] THEN
7931     SIMP_TAC std_ss [mul_rzero])
7932 >> Suff `measure m ({x | 0 < g x} INTER m_space m) =
7933          measure m ({x | x IN m_space m /\
7934                        (\x. g x * indicator_fn ({x | 0 < g x} INTER m_space m) x) x <> 0})` THENL
7935   [DISCH_TAC,
7936    AP_TERM_TAC THEN SIMP_TAC std_ss [EXTENSION, GSPECIFICATION, IN_INTER] THEN
7937    GEN_TAC THEN EQ_TAC THEN RW_TAC std_ss [] THENL
7938    [ASM_SIMP_TAC std_ss [indicator_fn_def, GSPECIFICATION, IN_INTER] THEN
7939     ASM_SIMP_TAC std_ss [lt_imp_ne, mul_rone], ALL_TAC] THEN
7940    POP_ASSUM MP_TAC THEN ONCE_REWRITE_TAC [MONO_NOT_EQ] THEN RW_TAC std_ss [] THEN
7941    FULL_SIMP_TAC std_ss [extreal_not_lt] THEN `g x = 0` by METIS_TAC [le_antisym] THEN
7942    ASM_SIMP_TAC std_ss [mul_lzero]]
7943 >> Q.ABBREV_TAC `ff = (\x. g x * indicator_fn ({x | 0 < g x} INTER m_space m) x)`
7944 >> `measure m {x | x IN m_space m /\ ff x <> 0} <> 0` by METIS_TAC []
7945 >> Know `measure m {x | x IN m_space m /\ ff x <> 0} <> 0 <=>
7946          pos_fn_integral m ff <> 0`
7947 >- (ONCE_REWRITE_TAC [METIS [] ``(a = b:bool) = (~b = ~a)``] THEN
7948    SIMP_TAC std_ss [] THEN
7949    Know `!x. 0 <= ff x`
7950    >- (Q.UNABBREV_TAC `ff` >> GEN_TAC >> BETA_TAC \\
7951        MATCH_MP_TAC le_mul >> art [INDICATOR_FN_POS]) >> DISCH_TAC \\
7952    Know `pos_fn_integral m ff = integral m ff`
7953    >- (MATCH_MP_TAC EQ_SYM \\
7954        MATCH_MP_TAC integral_pos_fn >> art []) >> Rewr' \\
7955    MATCH_MP_TAC integral_eq_0 THEN (* was: pos_fn_integral_eq_0 *)
7956    Q.UNABBREV_TAC `ff` THEN ASM_SIMP_TAC std_ss [le_mul, indicator_fn_pos_le] THEN
7957    CONJ_TAC THENL
7958    [ALL_TAC,
7959     SIMP_TAC std_ss [AE_ALT, GSYM IN_NULL_SET, GSPECIFICATION] THEN
7960     SIMP_TAC std_ss [GSPEC_F, EMPTY_SUBSET, null_sets, GSPECIFICATION] THEN
7961     Q.EXISTS_TAC `{}` THEN METIS_TAC [measure_space_def, SIGMA_ALGEBRA, positive_def, subsets_def]] THEN
7962    MATCH_MP_TAC IN_MEASURABLE_BOREL_TIMES THEN Q.EXISTS_TAC `g` THEN
7963    Q.EXISTS_TAC `indicator_fn ({x | 0 < g x} INTER m_space m)` THEN
7964    ASM_SIMP_TAC std_ss [] THEN MATCH_MP_TAC IN_MEASURABLE_BOREL_INDICATOR THEN
7965    Q.EXISTS_TAC `{x | 0 < g x} INTER m_space m` THEN
7966    CONJ_TAC THENL [METIS_TAC [measure_space_def], ALL_TAC] THEN
7967    ASM_SIMP_TAC std_ss [] THEN
7968    `{x | 0 < g x} = PREIMAGE g {x | 0 < x}` by SET_TAC [PREIMAGE_def] THEN
7969    POP_ASSUM (fn th => REWRITE_TAC [th]) THEN FULL_SIMP_TAC std_ss [IN_MEASURABLE] THEN
7970    FULL_SIMP_TAC std_ss [space_def, subsets_def] THEN
7971    FIRST_X_ASSUM MATCH_MP_TAC THEN
7972    SIMP_TAC std_ss [BOREL_MEASURABLE_SETS_OR, extreal_of_num_def])
7973 >> DISCH_TAC
7974 >> Suff `0 <= pos_fn_integral m ff` THENL
7975   [DISCH_TAC,
7976    MATCH_MP_TAC pos_fn_integral_pos THEN Q.UNABBREV_TAC `ff` THEN
7977    ASM_SIMP_TAC std_ss [le_mul, indicator_fn_pos_le]]
7978 >> `0 < pos_fn_integral m ff` by METIS_TAC [le_lt]
7979 >> `pos_fn_integral m ff <> NegInf` by METIS_TAC [lt_infty, num_not_infty, lte_trans]
7980 >> Suff `PosInf * pos_fn_integral m ff = PosInf` THENL
7981   [DISC_RW_KILL,
7982    ASM_CASES_TAC ``pos_fn_integral m ff = PosInf`` THEN ASM_SIMP_TAC std_ss [extreal_mul_def] THEN
7983    `pos_fn_integral m ff = Normal (real (pos_fn_integral m ff))` by METIS_TAC [normal_real] THEN
7984    POP_ASSUM (fn th => ONCE_REWRITE_TAC[th]) THEN REWRITE_TAC [extreal_mul_def] THEN
7985    ASM_SIMP_TAC std_ss [GSYM extreal_11, GSYM extreal_lt_eq, GSYM extreal_of_num_def] THEN
7986    ASM_SIMP_TAC std_ss [normal_real] THEN METIS_TAC []]
7987 >> Suff `0 <= measure m {x | x IN m_space m /\ ff x <> 0}` THENL
7988   [DISCH_TAC, FULL_SIMP_TAC std_ss [measure_space_def, positive_def] THEN
7989    FIRST_ASSUM MATCH_MP_TAC THEN
7990    Suff `{x | x IN m_space m /\ ff x <> 0} = PREIMAGE ff {x | x <> 0} INTER m_space m` THENL
7991    [DISC_RW_KILL, SIMP_TAC std_ss [PREIMAGE_def] THEN SET_TAC []] THEN
7992    Suff `ff IN measurable (m_space m,measurable_sets m) Borel` THENL
7993    [DISCH_TAC,
7994     Q.UNABBREV_TAC `ff` THEN MATCH_MP_TAC IN_MEASURABLE_BOREL_TIMES THEN Q.EXISTS_TAC `g` THEN
7995     Q.EXISTS_TAC `indicator_fn ({x | 0 < g x} INTER m_space m)` THEN
7996     ASM_SIMP_TAC std_ss [measure_space_def, positive_def] THEN
7997     MATCH_MP_TAC IN_MEASURABLE_BOREL_INDICATOR THEN
7998     Q.EXISTS_TAC `{x | 0 < g x} INTER m_space m` THEN
7999     CONJ_TAC THENL [METIS_TAC [measure_space_def], ALL_TAC] THEN
8000     ASM_SIMP_TAC std_ss [] THEN
8001     `{x | 0 < g x} = PREIMAGE g {x | 0 < x}` by SET_TAC [PREIMAGE_def] THEN
8002     POP_ASSUM (fn th => REWRITE_TAC [th]) THEN FULL_SIMP_TAC std_ss [IN_MEASURABLE] THEN
8003     FULL_SIMP_TAC std_ss [space_def, subsets_def] THEN
8004     FIRST_X_ASSUM MATCH_MP_TAC THEN
8005     SIMP_TAC std_ss [BOREL_MEASURABLE_SETS_OR, extreal_of_num_def]] THEN
8006    FULL_SIMP_TAC std_ss [IN_MEASURABLE, subsets_def, space_def] THEN
8007    FIRST_X_ASSUM MATCH_MP_TAC THEN
8008    ONCE_REWRITE_TAC [SET_RULE ``{x | x <> 0} = UNIV DIFF {0}``] THEN
8009    MATCH_MP_TAC ALGEBRA_DIFF THEN SIMP_TAC std_ss [extreal_of_num_def, GSYM SPACE_BOREL] THEN
8010    ASSUME_TAC SIGMA_ALGEBRA_BOREL THEN `algebra Borel` by METIS_TAC [sigma_algebra_def] THEN
8011    ASM_SIMP_TAC std_ss [ALGEBRA_SPACE, BOREL_MEASURABLE_SETS_SING]]
8012 >> `0 < measure m {x | x IN m_space m /\ ff x <> 0}` by METIS_TAC [le_lt]
8013 >> Q.ABBREV_TAC `gg = {x | x IN m_space m /\ ff x <> 0}`
8014 >> `measure m gg <> NegInf` by METIS_TAC [lt_infty, lte_trans, num_not_infty]
8015 >> ASM_CASES_TAC ``measure m gg = PosInf``
8016 >> ASM_SIMP_TAC std_ss [extreal_mul_def]
8017 >> `measure m gg = Normal (real (measure m gg))` by METIS_TAC [normal_real]
8018 >> POP_ASSUM (fn th => ONCE_REWRITE_TAC[th])
8019 >> SIMP_TAC std_ss [extreal_mul_def]
8020 >> ASM_SIMP_TAC std_ss [GSYM extreal_11, GSYM extreal_lt_eq, GSYM extreal_of_num_def]
8021 >> ASM_SIMP_TAC std_ss [normal_real]
8022QED
8023
8024Theorem pos_fn_integral_max_0 :
8025    !m f. measure_space m /\
8026         (!x. x IN m_space m ==> 0 <= f x) ==>
8027          pos_fn_integral m (\x. max 0 (f x)) = pos_fn_integral m f
8028Proof
8029    rpt STRIP_TAC
8030 >> MATCH_MP_TAC pos_fn_integral_cong >> rw [le_max]
8031 >> MATCH_MP_TAC max_0_reduce >> rw []
8032QED
8033
8034Theorem pos_fn_integral_cmult :
8035    !f c m. measure_space m /\ 0 <= c /\
8036            f IN measurable (m_space m, measurable_sets m) Borel ==>
8037            pos_fn_integral m (\x. c * fn_plus f x) =
8038            c * pos_fn_integral m (fn_plus f)
8039Proof
8040    rpt STRIP_TAC
8041 >> `(\x. c * fn_plus f x) = fn_plus (\x. c * f x)` by METIS_TAC [FN_PLUS_CMUL_full]
8042 >> POP_ORW >> SIMP_TAC std_ss [o_DEF, FN_PLUS_ALT']
8043 >> MATCH_MP_TAC pos_fn_integral_cmult' >> art []
8044QED
8045
8046Theorem pos_fn_integral_cmul_general :
8047    !m f c. measure_space m /\ 0 <= c /\
8048            f IN Borel_measurable (measurable_space m) /\
8049          (!x. x IN m_space m ==> 0 <= f x) ==>
8050            pos_fn_integral m (\x. c * f x) = c * pos_fn_integral m f
8051Proof
8052    rpt STRIP_TAC
8053 >> MP_TAC (Q.SPECL [‘f’, ‘c’, ‘m’] pos_fn_integral_cmult)
8054 >> simp []
8055 >> Know ‘pos_fn_integral m f^+ = pos_fn_integral m f’
8056 >- (MATCH_MP_TAC pos_fn_integral_cong >> rw [FN_PLUS_REDUCE])
8057 >> Rewr'
8058 >> DISCH_THEN (REWRITE_TAC o wrap o SYM)
8059 >> MATCH_MP_TAC pos_fn_integral_cong >> simp []
8060 >> rpt STRIP_TAC
8061 >> MATCH_MP_TAC le_mul >> rw []
8062QED
8063
8064Theorem density_fn_plus :
8065    !M f. density M (fn_plus f) =
8066           (m_space M, measurable_sets M,
8067            (\A. pos_fn_integral M (\x. max 0 (f x * indicator_fn A x))))
8068Proof
8069    RW_TAC std_ss [density_def, density_measure_def, FUN_EQ_THM]
8070 >> Suff `!x. fn_plus f x * indicator_fn A x = max 0 (f x * indicator_fn A x)`
8071 >- rw []
8072 >> RW_TAC std_ss [FN_PLUS_ALT']
8073 >> Cases_on `x IN A`
8074 >> ASM_SIMP_TAC std_ss [indicator_fn_def, mul_rzero, mul_rone, max_refl]
8075QED
8076
8077Theorem pos_fn_integral_density' :
8078    !f g M. measure_space M /\
8079            f IN measurable (m_space M, measurable_sets M) Borel /\
8080            g IN measurable (m_space M, measurable_sets M) Borel /\
8081           (AE x::M. 0 <= f x) /\ (!x. 0 <= g x) ==>
8082      ((pos_fn_integral (m_space M, measurable_sets M,
8083                         (\A. pos_fn_integral M (\x. max 0 (f x * indicator_fn A x))))
8084                        (\x. max 0 (g x)) =
8085        pos_fn_integral M (\x. max 0 (f x * g x))))
8086Proof
8087  RW_TAC std_ss [GSYM density_fn_plus] THEN
8088  Suff `(\g. pos_fn_integral (density M (fn_plus f)) (\x. max 0 (g x)) =
8089             pos_fn_integral M (\x. max 0 (f x * g x))) g`
8090  >- (SIMP_TAC std_ss []) THEN
8091  MATCH_MP_TAC BOREL_INDUCT THEN (* induction on Borel functions *)
8092  Q.EXISTS_TAC `M` THEN ASM_SIMP_TAC std_ss [] THEN
8093  CONJ_TAC THEN1 (* Part I *)
8094  (RW_TAC std_ss [] THEN
8095   Know `pos_fn_integral (density M (fn_plus f)) (\x. max 0 (g' x)) =
8096         pos_fn_integral (density M (fn_plus f)) (\x. max 0 (f' x))` THEN1
8097   (MATCH_MP_TAC pos_fn_integral_cong THEN ASM_SIMP_TAC std_ss [le_max1] THEN
8098    reverse CONJ_TAC
8099    >- (RW_TAC std_ss [density_def, density_measure_def, m_space_def]) \\
8100    MATCH_MP_TAC measure_space_density' >> art []) THEN DISC_RW_KILL THEN
8101   ASM_SIMP_TAC std_ss [] THEN MATCH_MP_TAC pos_fn_integral_cong THEN
8102   ASM_SIMP_TAC std_ss [le_max1]) THEN
8103  CONJ_TAC THEN1 (* Part II *)
8104  (GEN_TAC THEN ONCE_REWRITE_TAC [METIS [extreal_max_def, indicator_fn_pos_le]
8105    ``!x. max 0 (indicator_fn A x) = indicator_fn A x``] THEN
8106   ONCE_REWRITE_TAC [METIS [ETA_AX] ``(\x. indicator_fn A x) = indicator_fn A``] THEN
8107   DISCH_TAC THEN `A IN measurable_sets (density M (fn_plus f))` by
8108    ASM_SIMP_TAC std_ss [density_fn_plus, measurable_sets_def] THEN
8109   `measure_space (density M (fn_plus f))` by METIS_TAC [measure_space_density'] THEN
8110   ASM_SIMP_TAC std_ss [pos_fn_integral_indicator] THEN
8111   ASM_SIMP_TAC std_ss [density_fn_plus, measure_def]) THEN
8112  CONJ_TAC THEN1 (* Part III *)
8113  (RW_TAC std_ss [] THEN
8114   Suff `pos_fn_integral (density M (fn_plus f)) (\x. max 0 (c * f' x)) =
8115                   c * pos_fn_integral (density M (fn_plus f)) (\x. max 0 (f' x))` THENL
8116   [DISC_RW_KILL,
8117    MATCH_MP_TAC pos_fn_integral_cmult' THEN
8118    `measure_space (density M (fn_plus f))` by METIS_TAC [measure_space_density'] THEN
8119    ASM_SIMP_TAC std_ss [density_fn_plus, m_space_def, measurable_sets_def]] THEN
8120   ASM_SIMP_TAC std_ss [] THEN
8121   Suff `c * pos_fn_integral M (\x. max 0 ((\x. f x * f' x) x)) =
8122                   pos_fn_integral M (\x. max 0 (c * (\x. f x * f' x) x))` THENL
8123   [SIMP_TAC std_ss [] THEN DISC_RW_KILL,
8124    MATCH_MP_TAC (GSYM pos_fn_integral_cmult') THEN
8125    ASM_SIMP_TAC std_ss [] THEN MATCH_MP_TAC IN_MEASURABLE_BOREL_TIMES THEN
8126    METIS_TAC []] THEN
8127   AP_TERM_TAC THEN ABS_TAC THEN AP_TERM_TAC THEN
8128   METIS_TAC [mul_comm, mul_assoc]) THEN
8129  CONJ_TAC THEN1 (* Part IV *)
8130  (RW_TAC std_ss [] THEN ASM_SIMP_TAC std_ss [add_ldistrib_pos] THEN
8131   Suff `!x. max 0 (f' x + g' x) = max 0 (f' x) + max 0 (g' x)` THENL
8132   [DISC_RW_KILL, METIS_TAC [extreal_max_def, le_add]] THEN
8133   Suff `pos_fn_integral (density M (fn_plus f)) (\x. (\x. max 0 (f' x)) x + (\x. max 0 (g' x)) x) =
8134                   pos_fn_integral (density M (fn_plus f)) (\x. max 0 (f' x)) +
8135                   pos_fn_integral (density M (fn_plus f)) (\x. max 0 (g' x))` THENL
8136   [SIMP_TAC std_ss [] THEN DISC_RW_KILL,
8137    MATCH_MP_TAC pos_fn_integral_add THEN
8138    `measure_space (density M (fn_plus f))` by METIS_TAC [measure_space_density'] THEN
8139    ASM_SIMP_TAC std_ss [le_max1] THEN ASM_SIMP_TAC std_ss [extreal_max_def] THEN
8140    ASM_SIMP_TAC std_ss [ETA_AX, density_fn_plus, m_space_def, measurable_sets_def]] THEN
8141   Suff `pos_fn_integral M (\x. max 0 (f x * f' x + f x * g' x)) =
8142                   pos_fn_integral M (\x. (\x. max 0 (f x * f' x)) x + (\x. max 0 (f x * g' x)) x)` THENL
8143   [DISC_RW_KILL,
8144    MATCH_MP_TAC pos_fn_integral_cong_AE THEN
8145    ASM_SIMP_TAC std_ss [le_max1, le_mul, le_add] THEN
8146    FULL_SIMP_TAC std_ss [AE_ALT, GSPECIFICATION, null_set_def] THEN
8147    Q.EXISTS_TAC `N` THEN ASM_SIMP_TAC std_ss [] THEN
8148    FULL_SIMP_TAC std_ss [SUBSET_DEF, GSPECIFICATION] THEN RW_TAC std_ss [] THEN
8149    FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_SIMP_TAC std_ss [] THEN
8150    POP_ASSUM MP_TAC THEN ONCE_REWRITE_TAC [MONO_NOT_EQ] THEN
8151    RW_TAC std_ss [extreal_max_def, add_rzero, add_lzero] THEN
8152    TRY (METIS_TAC [le_mul, le_add])] THEN
8153   MATCH_MP_TAC (GSYM pos_fn_integral_add) THEN
8154   ASM_SIMP_TAC std_ss [le_max1] THEN
8155   ONCE_REWRITE_TAC [METIS []
8156     ``!g. (\x. max 0 (f x * g x)) = (\x. max ((\x. 0) x) ((\x. f x * g x) x))``] THEN
8157   `(\x. 0) IN measurable (m_space M,measurable_sets M) Borel` by
8158     (MATCH_MP_TAC IN_MEASURABLE_BOREL_CONST THEN
8159      METIS_TAC [measure_space_def]) THEN
8160   CONJ_TAC THEN MATCH_MP_TAC IN_MEASURABLE_BOREL_MAX THEN
8161   FULL_SIMP_TAC std_ss [measure_space_def] THEN
8162   MATCH_MP_TAC IN_MEASURABLE_BOREL_TIMES THEN METIS_TAC [measure_space_def]) THEN
8163  RW_TAC std_ss [] THEN (* Part V *)
8164  Suff `AE x::M. f x * sup (IMAGE (\i. u i x) UNIV) = sup (IMAGE (\i. f x * u i x) UNIV)` THENL
8165  [DISCH_TAC,
8166   FULL_SIMP_TAC std_ss [AE_ALT, GSPECIFICATION, null_set_def, SUBSET_DEF] THEN
8167   Q.EXISTS_TAC `N` THEN ASM_SIMP_TAC std_ss [] THEN RW_TAC std_ss [] THEN
8168   FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC [] THEN
8169   POP_ASSUM MP_TAC THEN ONCE_REWRITE_TAC [MONO_NOT_EQ] THEN
8170   RW_TAC std_ss [] THEN
8171   Suff `f x * sup (IMAGE (\i. u i x) UNIV) =
8172     sup (IMAGE (\i. f x * (\i. u i x) i) UNIV)` THENL
8173   [SIMP_TAC std_ss [], ALL_TAC] THEN
8174   MATCH_MP_TAC (GSYM sup_cmult) THEN ASM_SIMP_TAC std_ss []] THEN
8175  Suff `pos_fn_integral (density M (fn_plus f))
8176       (\x. max 0 (sup (IMAGE (\i. u i x) univ(:num)))) =
8177      sup (IMAGE (\i. pos_fn_integral (density M (fn_plus f)) ((\i x. max 0 (u i x)) i)) UNIV)` THENL
8178  [DISC_RW_KILL,
8179   MATCH_MP_TAC lebesgue_monotone_convergence THEN
8180   ASM_SIMP_TAC std_ss [measure_space_density', le_max1] THEN
8181   ASM_SIMP_TAC std_ss [m_space_def, measurable_sets_def, density_fn_plus] THEN
8182   CONJ_TAC THENL
8183   [GEN_TAC THEN
8184    Suff `!x. max 0 (u i x) = max ((\x. 0) x) ((\x. u i x) x)` THENL
8185    [DISC_RW_KILL, SIMP_TAC std_ss []] THEN
8186    MATCH_MP_TAC IN_MEASURABLE_BOREL_MAX THEN
8187    `(\x. 0) IN measurable (m_space M,measurable_sets M) Borel` by
8188     (MATCH_MP_TAC IN_MEASURABLE_BOREL_CONST THEN
8189      METIS_TAC [measure_space_def]) THEN
8190    ONCE_REWRITE_TAC [METIS [ETA_AX] ``(\x. u i x) = u i``] THEN
8191    METIS_TAC [measure_space_def], ALL_TAC] THEN
8192   ASM_SIMP_TAC std_ss [extreal_max_def] THEN
8193   GEN_TAC THEN ASM_CASES_TAC ``!i:num. u i x = 0`` THENL
8194   [ASM_SIMP_TAC std_ss [IMAGE_DEF, IN_UNIV] THEN
8195    DISCH_TAC THEN COND_CASES_TAC THEN ASM_SIMP_TAC std_ss [] THEN
8196    POP_ASSUM MP_TAC THEN ONCE_REWRITE_TAC [MONO_NOT_EQ] THEN
8197    RW_TAC std_ss [le_sup] THEN POP_ASSUM (MATCH_MP_TAC) THEN
8198    ONCE_REWRITE_TAC [GSYM SPECIFICATION] THEN SIMP_TAC std_ss [GSPECIFICATION] THEN
8199    ONCE_REWRITE_TAC [EQ_SYM_EQ] THEN METIS_TAC [],
8200    ALL_TAC] THEN
8201   FULL_SIMP_TAC std_ss [] THEN RW_TAC std_ss [] THEN
8202   UNDISCH_TAC ``~(0 <= sup (IMAGE (\i. u i x) univ(:num)))`` THEN
8203   ONCE_REWRITE_TAC [MONO_NOT_EQ] THEN RW_TAC std_ss [le_lt] THEN
8204   SIMP_TAC std_ss [GSYM sup_lt] THEN Q.EXISTS_TAC `u i x` THEN
8205   CONJ_TAC THENL [ALL_TAC, METIS_TAC [le_lt]] THEN
8206   ONCE_REWRITE_TAC [GSYM SPECIFICATION] THEN
8207   SIMP_TAC std_ss [IN_IMAGE, IN_UNIV] THEN METIS_TAC []] THEN
8208  ASM_SIMP_TAC std_ss [] THEN
8209  Suff `pos_fn_integral M (\x. max 0 (f x * sup (IMAGE (\i. u i x) univ(:num)))) =
8210                  pos_fn_integral M (\x. max 0 (sup (IMAGE (\i. f x * u i x) univ(:num))))` THENL
8211  [DISC_RW_KILL,
8212   MATCH_MP_TAC pos_fn_integral_cong_AE THEN ASM_SIMP_TAC std_ss [le_max1] THEN
8213   FULL_SIMP_TAC std_ss [AE_ALT, GSPECIFICATION, SUBSET_DEF, null_set_def] THEN
8214   Q.EXISTS_TAC `N'` THEN ASM_SIMP_TAC std_ss [] THEN RW_TAC std_ss [] THEN
8215   FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC [] THEN
8216   POP_ASSUM MP_TAC THEN ONCE_REWRITE_TAC [MONO_NOT_EQ] THEN RW_TAC std_ss []] THEN
8217  Suff
8218   `sup (IMAGE (\i. pos_fn_integral M (\x. max 0 ((\i x. f x * u i x) i x))) univ(:num)) =
8219    pos_fn_integral M (\x. max 0 ((\x. sup (IMAGE (\i. f x * u i x) univ(:num))) x))` THENL
8220  [SIMP_TAC std_ss [], ALL_TAC] THEN
8221  REWRITE_TAC [GSYM FN_PLUS_ALT'] THEN
8222  MATCH_MP_TAC (GSYM lebesgue_monotone_convergence_AE) THEN
8223  ASM_SIMP_TAC std_ss [] THEN CONJ_TAC THENL
8224  [GEN_TAC THEN MATCH_MP_TAC IN_MEASURABLE_BOREL_TIMES THEN
8225   Q.EXISTS_TAC `f` THEN Q.EXISTS_TAC `u i` THEN ASM_SIMP_TAC std_ss [],
8226   ALL_TAC] THEN
8227  FULL_SIMP_TAC std_ss [AE_ALT, GSYM IN_NULL_SET, GSPECIFICATION] THEN
8228  Q.EXISTS_TAC `N` THEN FULL_SIMP_TAC std_ss [SUBSET_DEF, GSPECIFICATION] THEN
8229  RW_TAC std_ss [] THEN FIRST_X_ASSUM MATCH_MP_TAC THENL
8230  [ASM_SIMP_TAC std_ss [] THEN POP_ASSUM MP_TAC THEN
8231   ONCE_REWRITE_TAC [MONO_NOT_EQ] THEN RW_TAC std_ss [] THEN
8232   MATCH_MP_TAC le_lmul_imp THEN FULL_SIMP_TAC std_ss [ext_mono_increasing_def],
8233   ALL_TAC] THEN
8234  ASM_SIMP_TAC std_ss [] THEN POP_ASSUM MP_TAC THEN
8235  ONCE_REWRITE_TAC [MONO_NOT_EQ] THEN RW_TAC std_ss [] THEN
8236  METIS_TAC [le_mul]
8237QED
8238
8239(**********************************************************)
8240(*  Radon-Nikodym Theorem                                 *)
8241(**********************************************************)
8242
8243Definition RADON_F_def:
8244    RADON_F m v =
8245      {f | f IN measurable (m_space m,measurable_sets m) Borel /\
8246           (!x. 0 <= f x) /\
8247           !A. A IN measurable_sets m ==>
8248               (pos_fn_integral m (\x. f x * indicator_fn A x) <= measure v A)}
8249End
8250
8251Definition RADON_F_integrals_def:
8252    RADON_F_integrals m v = {r | ?f. (r = pos_fn_integral m f) /\ f IN RADON_F m v}
8253End
8254
8255Theorem lemma_radon_max_in_F[local] :
8256    !f g m v. measure_space m /\ measure_space v /\
8257              (m_space v = m_space m) /\ (measurable_sets v = measurable_sets m) /\
8258              f IN RADON_F m v /\ g IN RADON_F m v
8259          ==> (\x. max (f x) (g x)) IN RADON_F m v
8260Proof
8261    RW_TAC real_ss [RADON_F_def, GSPECIFICATION, max_le, le_max]
8262 >> ‘sigma_algebra (measurable_space m)’
8263      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA]
8264 >- FULL_SIMP_TAC std_ss [IN_MEASURABLE_BOREL_MAX, measure_space_def]
8265 >> Q.ABBREV_TAC `A1 = {x | x IN A /\ g x < f x}`
8266 >> Q.ABBREV_TAC `A2 = {x | x IN A /\ f x <= g x}`
8267 >> `DISJOINT A1 A2`
8268       by (qunabbrevl_tac [`A1`, `A2`] \\
8269           RW_TAC std_ss [IN_DISJOINT, GSPECIFICATION] \\
8270           METIS_TAC [extreal_lt_def])
8271 >> `A1 UNION A2 = A`
8272       by (qunabbrevl_tac [`A1`, `A2`] \\
8273           RW_TAC std_ss [IN_UNION, EXTENSION, GSPECIFICATION] \\
8274           METIS_TAC [extreal_lt_def])
8275 >> `(\x. max (f x) (g x) * indicator_fn A x) =
8276     (\x. (\x. max (f x) (g x) * indicator_fn A1 x) x +
8277          (\x. max (f x) (g x) * indicator_fn A2 x) x)`
8278       by (qunabbrevl_tac [`A1`, `A2`] \\
8279           RW_TAC std_ss [indicator_fn_def, GSPECIFICATION, FUN_EQ_THM] \\
8280           Cases_on `g x < f x`
8281           >- (RW_TAC std_ss [mul_rone,mul_rzero,add_rzero] >> METIS_TAC [extreal_lt_def])
8282           >> RW_TAC real_ss [mul_rone,mul_rzero,add_lzero] >> METIS_TAC [extreal_lt_def])
8283 >> `additive v` by METIS_TAC [MEASURE_SPACE_ADDITIVE]
8284 >> `A SUBSET m_space m` by RW_TAC std_ss [MEASURE_SPACE_SUBSET_MSPACE]
8285 >> `A1 = ({x | g x < f x} INTER m_space m) INTER A`
8286       by (Q.UNABBREV_TAC `A1` \\
8287           RW_TAC std_ss [EXTENSION, IN_INTER, GSPECIFICATION, CONJ_SYM] \\
8288           METIS_TAC [SUBSET_DEF])
8289 >> `A2 = ({x | f x <= g x} INTER m_space m) INTER A`
8290       by (Q.UNABBREV_TAC `A2` \\
8291           RW_TAC std_ss [EXTENSION, IN_INTER, GSPECIFICATION, CONJ_SYM] \\
8292           METIS_TAC [SUBSET_DEF])
8293 >> `A1 IN measurable_sets m`
8294       by (ASM_SIMP_TAC std_ss [] \\
8295           MATCH_MP_TAC MEASURE_SPACE_INTER >> RW_TAC std_ss [] \\
8296           METIS_TAC [IN_MEASURABLE_BOREL_LT, m_space_def, space_def, subsets_def,
8297                      measurable_sets_def])
8298 >> `A2 IN measurable_sets m`
8299       by (ASM_SIMP_TAC std_ss [] \\
8300           MATCH_MP_TAC MEASURE_SPACE_INTER >> RW_TAC std_ss [] \\
8301           METIS_TAC [IN_MEASURABLE_BOREL_LE, m_space_def, space_def, subsets_def,
8302                      measurable_sets_def])
8303 >> `measure v A = measure v A1 + measure v A2` by METIS_TAC [ADDITIVE]
8304 >> Q.PAT_X_ASSUM `A1 = M` (K ALL_TAC)
8305 >> Q.PAT_X_ASSUM `A2 = M` (K ALL_TAC)
8306 >> `!x. max (f x) (g x) * indicator_fn A1 x = f x * indicator_fn A1 x`
8307       by (Q.UNABBREV_TAC `A1` \\
8308           RW_TAC std_ss [extreal_max_def, indicator_fn_def, GSPECIFICATION,
8309                          mul_rone, mul_rzero] \\
8310           METIS_TAC [extreal_lt_def])
8311 >> `!x. max (f x) (g x) * indicator_fn A2 x = g x * indicator_fn A2 x`
8312       by (Q.UNABBREV_TAC `A2` \\
8313           RW_TAC std_ss [extreal_max_def, indicator_fn_def, GSPECIFICATION,
8314                          mul_rone, mul_rzero] \\
8315           METIS_TAC [extreal_lt_def])
8316 >> ASM_SIMP_TAC std_ss []
8317 >> `(\x. f x * indicator_fn A1 x) IN measurable (m_space m,measurable_sets m) Borel`
8318       by METIS_TAC [IN_MEASURABLE_BOREL_MUL_INDICATOR, measure_space_def,
8319                     measurable_sets_def, subsets_def]
8320 >> `(\x. g x * indicator_fn A2 x) IN  measurable (m_space m,measurable_sets m) Borel`
8321       by METIS_TAC [IN_MEASURABLE_BOREL_MUL_INDICATOR, measure_space_def,
8322                     measurable_sets_def, subsets_def]
8323 >> `!x. x IN m_space m ==> 0 <= (\x. f x * indicator_fn A1 x) x`
8324       by RW_TAC std_ss [indicator_fn_def, mul_rone, mul_rzero, le_01, le_refl]
8325 >> `!x. x IN m_space m ==> 0 <= (\x. g x * indicator_fn A2 x) x`
8326       by RW_TAC std_ss [indicator_fn_def, mul_rone, mul_rzero, le_01, le_refl]
8327 >> FULL_SIMP_TAC std_ss [le_add2, pos_fn_integral_add]
8328QED
8329
8330Theorem lemma_radon_seq_conv_sup[local]:
8331    !f m v. (measure_space m /\ measure_space v /\
8332            (m_space v = m_space m) /\ (measurable_sets v = measurable_sets m)) /\
8333            (measure v (m_space v) <> PosInf) ==>
8334      ?f. (!n. f n IN RADON_F m v) /\ (!x n. f n x <= f (SUC n) x) /\
8335          (sup (IMAGE (\n. pos_fn_integral m (f n)) UNIV) = sup (RADON_F_integrals m v))
8336Proof
8337    RW_TAC std_ss [RADON_F_integrals_def]
8338 >> MATCH_MP_TAC EXTREAL_SUP_FUN_SEQ_MONO_IMAGE
8339 >> CONJ_TAC
8340 >- (Q.EXISTS_TAC `0` \\
8341     ONCE_REWRITE_TAC [GSYM SPECIFICATION] \\
8342     RW_TAC std_ss [GSPECIFICATION] \\
8343     Q.EXISTS_TAC `(\x. 0)` \\
8344     RW_TAC real_ss [RADON_F_def, GSPECIFICATION, pos_fn_integral_zero, mul_lzero, le_refl]
8345     >- (MATCH_MP_TAC IN_MEASURABLE_BOREL_CONST \\
8346         METIS_TAC [space_def, measure_space_def]) \\
8347     METIS_TAC [measure_space_def, positive_def])
8348 >> CONJ_TAC
8349 >- (Q.EXISTS_TAC `measure v (m_space v)` \\
8350     RW_TAC std_ss [] \\
8351     POP_ASSUM (MP_TAC o ONCE_REWRITE_RULE [GSYM SPECIFICATION]) \\
8352     RW_TAC std_ss [GSPECIFICATION, RADON_F_def] \\
8353     POP_ASSUM (MP_TAC o Q.SPEC `m_space m`) \\
8354     RW_TAC std_ss [MEASURE_SPACE_MSPACE_MEASURABLE, GSYM pos_fn_integral_mspace])
8355 >> CONJ_TAC
8356 >- RW_TAC std_ss [EXTENSION,GSPECIFICATION, IN_IMAGE, RADON_F_def]
8357 >> CONJ_TAC
8358 >- RW_TAC std_ss [RADON_F_def, GSPECIFICATION, pos_fn_integral_mono]
8359 >> RW_TAC std_ss [lemma_radon_max_in_F]
8360QED
8361
8362Theorem RN_lemma1[local]:
8363    !m v e. measure_space m /\ measure_space v /\ 0 < e /\
8364           (m_space v = m_space m) /\ (measurable_sets v = measurable_sets m) /\
8365            measure v (m_space m) <> PosInf /\
8366            measure m (m_space m) <> PosInf ==>
8367        ?A. A IN measurable_sets m /\
8368            measure m (m_space m) - measure v (m_space m) <= measure m A - measure v A /\
8369           !B. B IN measurable_sets m /\ B SUBSET A ==> -e < measure m B - measure v B
8370Proof
8371 (* proof *)
8372    RW_TAC std_ss []
8373 >> `!A. A IN measurable_sets m ==> measure m A <> NegInf`
8374       by METIS_TAC [MEASURE_SPACE_POSITIVE, positive_not_infty]
8375 >> `!A. A IN measurable_sets m ==> measure m A <=  measure m (m_space m)`
8376       by METIS_TAC [MEASURABLE_SETS_SUBSET_SPACE, MEASURE_SPACE_MSPACE_MEASURABLE,
8377                     INCREASING, MEASURE_SPACE_INCREASING]
8378 >> `!A. A IN measurable_sets m ==> measure m A <> PosInf` by METIS_TAC [lt_infty, let_trans]
8379 >> `!A. A IN measurable_sets m ==> measure v A <> NegInf`
8380       by METIS_TAC [MEASURE_SPACE_POSITIVE, positive_not_infty,
8381                     measure_def, measurable_sets_def]
8382 >> `!A. A IN measurable_sets m ==> measure v A <= measure v (m_space m)`
8383       by METIS_TAC [MEASURABLE_SETS_SUBSET_SPACE, MEASURE_SPACE_MSPACE_MEASURABLE,
8384                     INCREASING, MEASURE_SPACE_INCREASING]
8385 >> `!A. A IN measurable_sets m ==> measure v A <> PosInf` by METIS_TAC [lt_infty, let_trans]
8386 >> Q.ABBREV_TAC `d = (\A. measure m A - measure v A)`
8387 >> `!A. A IN measurable_sets m ==> d A <> NegInf` by METIS_TAC [sub_not_infty]
8388 >> `!A. A IN measurable_sets m ==> d A <> PosInf` by METIS_TAC [sub_not_infty]
8389 >> `e <> NegInf` by METIS_TAC [lt_infty, lt_trans, num_not_infty]
8390 >> Cases_on `e = PosInf`
8391 >- (Q.EXISTS_TAC `m_space m` \\
8392     METIS_TAC [MEASURE_SPACE_MSPACE_MEASURABLE, le_refl, lt_infty, extreal_ainv_def])
8393 >> Q.ABBREV_TAC
8394     `h = \A. if (!B. B IN measurable_sets m /\ B SUBSET (m_space m DIFF A) ==> -e < d B)
8395              then {}
8396              else @B. B IN measurable_sets m /\ B SUBSET (m_space m DIFF A) /\ d B <= -e`
8397 >> `!A. A IN measurable_sets m ==> h A  IN measurable_sets m`
8398       by (RW_TAC std_ss [] >> METIS_TAC [MEASURE_SPACE_EMPTY_MEASURABLE, extreal_lt_def])
8399 >> Q.ABBREV_TAC `A = SIMP_REC {} (\a. a UNION h a)`
8400 >> `A 0 = {}` by METIS_TAC [SIMP_REC_THM]
8401 >> `!n. A (SUC n) = (A n) UNION (h (A n))`
8402       by (Q.UNABBREV_TAC `A` >> RW_TAC std_ss [SIMP_REC_THM])
8403 >> `!n. A n IN measurable_sets m`
8404       by (Induct >- RW_TAC std_ss [MEASURE_SPACE_EMPTY_MEASURABLE] \\
8405           RW_TAC std_ss [MEASURE_SPACE_UNION])
8406 >> Know `!n. (?B. B IN measurable_sets m /\ B SUBSET (m_space m DIFF (A n)) /\ d B <= -e) ==>
8407              d (A (SUC n)) <= d (A n) - e`
8408 >- (RW_TAC std_ss [] \\
8409    `~(!B. B IN measurable_sets m /\ B SUBSET (m_space m DIFF (A n)) ==> -e < d B)`
8410           by METIS_TAC [extreal_lt_def] \\
8411    `h (A n) = (@B. B IN measurable_sets m /\ B SUBSET m_space m DIFF (A n) /\ d B <= -e)`
8412           by (Q.UNABBREV_TAC `h` >> RW_TAC std_ss []) >> POP_ORW \\
8413     SELECT_ELIM_TAC >> RW_TAC std_ss [] >- METIS_TAC [] \\
8414    `DISJOINT (A n) x`
8415           by (RW_TAC std_ss [DISJOINT_DEF, EXTENSION, IN_INTER, NOT_IN_EMPTY] \\
8416               METIS_TAC [SUBSET_DEF, IN_DIFF]) \\
8417     Know `d ((A n) UNION x) = d (A n) + d x`
8418     >- (Q.UNABBREV_TAC `d` \\
8419         RW_TAC std_ss [] \\
8420         Know `measure m (A n UNION x) = measure m (A n) + measure m x`
8421         >- (MATCH_MP_TAC MEASURE_ADDITIVE >> art []) >> Rewr' \\
8422         Know `measure v (A n UNION x) = measure v (A n) + measure v x`
8423         >- (MATCH_MP_TAC MEASURE_ADDITIVE >> art []) >> Rewr' \\
8424        `?r1. measure v (A n) = Normal r1` by METIS_TAC [extreal_cases] \\
8425        `?r2. measure v x = Normal r2` by METIS_TAC [extreal_cases] \\
8426         RW_TAC std_ss [extreal_add_def] \\
8427         Cases_on `measure m (A n)` \\
8428         Cases_on `measure m x` \\
8429         RW_TAC std_ss [extreal_add_def, extreal_sub_def, REAL_ADD2_SUB2] \\
8430         METIS_TAC []) >> Rewr' \\
8431        `d (A n) - e = d (A n) + -e` by METIS_TAC [extreal_sub_add] \\
8432         METIS_TAC [le_ladd])
8433 >> DISCH_TAC
8434 >> `!n. d (A (SUC n)) <= d (A n)`
8435        by (RW_TAC std_ss [] \\
8436            Cases_on `(?B. B IN measurable_sets m /\ B SUBSET m_space m DIFF A n /\ d B <= -e)`
8437            >- (`d (A n) <= d (A n) + e` by METIS_TAC [lt_le, le_addr_imp] \\
8438                `d (A n) - e <= d (A n)`
8439                   by (Cases_on `d (A n)` >> Cases_on `e` \\
8440                       RW_TAC std_ss [extreal_add_def, extreal_sub_def, extreal_le_def,
8441                                      extreal_not_infty, lt_infty, le_infty] \\
8442                       METIS_TAC [extreal_add_def, extreal_le_def, REAL_LE_SUB_RADD]) \\
8443                METIS_TAC [le_trans]) \\
8444           `!B. B IN measurable_sets m /\ B SUBSET m_space m DIFF A n ==> -e < d B`
8445               by METIS_TAC [extreal_lt_def] \\
8446            METIS_TAC [UNION_EMPTY, le_refl])
8447 >> Cases_on `?n. !B. ((B IN measurable_sets m /\ B SUBSET (m_space m DIFF (A n))) ==> -e < d B)`
8448 >- (Q.PAT_X_ASSUM `!n. A (SUC n) = a UNION b` (K ALL_TAC) \\
8449     FULL_SIMP_TAC std_ss [] \\
8450    `!n. m_space m DIFF (A n) IN measurable_sets m`
8451        by METIS_TAC [MEASURE_SPACE_DIFF, MEASURE_SPACE_MSPACE_MEASURABLE] \\
8452     Suff `!n. d (m_space m) <= d (m_space m DIFF (A n))`
8453     >- METIS_TAC [] \\
8454     Induct >- RW_TAC std_ss [DIFF_EMPTY, le_refl] \\
8455    `measure m (m_space m DIFF A (SUC n')) = measure m (m_space m) - measure m (A (SUC n'))`
8456        by METIS_TAC [MEASURE_SPACE_FINITE_DIFF] \\
8457    `measure v (m_space m DIFF A (SUC n')) = measure v (m_space m) - measure v (A (SUC n'))`
8458        by METIS_TAC [MEASURE_SPACE_FINITE_DIFF, measure_def, measurable_sets_def,
8459                      m_space_def] \\
8460    `measure m (m_space m DIFF A n') = measure m (m_space m) - measure m (A n')`
8461        by METIS_TAC [MEASURE_SPACE_FINITE_DIFF] \\
8462    `measure v (m_space m DIFF A n') = measure v (m_space m) - measure v (A n')`
8463        by METIS_TAC [MEASURE_SPACE_FINITE_DIFF, measure_def, measurable_sets_def,
8464                      m_space_def] \\
8465    `d (m_space m DIFF A n') = d (m_space m) - d (A n')`
8466        by (Q.UNABBREV_TAC `d` >> FULL_SIMP_TAC std_ss [] \\
8467           `?r1. measure m (m_space m) = Normal r1`
8468               by METIS_TAC [extreal_cases, MEASURE_SPACE_MSPACE_MEASURABLE] \\
8469           `?r2. measure v (m_space m) = Normal r2`
8470               by METIS_TAC [extreal_cases, MEASURE_SPACE_MSPACE_MEASURABLE] \\
8471           `?r3. measure m (A n') = Normal r3` by METIS_TAC [extreal_cases] \\
8472           `?r4. measure v (A n') = Normal r4` by METIS_TAC [extreal_cases] \\
8473            FULL_SIMP_TAC std_ss [extreal_add_def, extreal_sub_def, extreal_lt_def, extreal_11] \\
8474            REAL_ARITH_TAC) \\
8475    `d (m_space m DIFF A (SUC n')) = d (m_space m) - d (A (SUC n'))`
8476        by (Q.UNABBREV_TAC `d` >> FULL_SIMP_TAC std_ss [] \\
8477           `?r1. measure m (m_space m) = Normal r1`
8478               by METIS_TAC [extreal_cases, MEASURE_SPACE_MSPACE_MEASURABLE] \\
8479           `?r2. measure v (m_space m) = Normal r2`
8480               by METIS_TAC [extreal_cases, MEASURE_SPACE_MSPACE_MEASURABLE] \\
8481           `?r3. measure m (A (SUC n')) = Normal r3` by METIS_TAC [extreal_cases] \\
8482           `?r4. measure v (A (SUC n')) = Normal r4` by METIS_TAC [extreal_cases] \\
8483            FULL_SIMP_TAC std_ss [extreal_add_def, extreal_sub_def, extreal_lt_def, extreal_11] \\
8484            REAL_ARITH_TAC) \\
8485     FULL_SIMP_TAC std_ss [] \\
8486    `d (m_space m) - d (A n') <= d (m_space m) - d (A (SUC n'))`
8487        by METIS_TAC [extreal_sub_add, MEASURE_SPACE_MSPACE_MEASURABLE, le_ladd_imp, le_neg] \\
8488     METIS_TAC [le_trans])
8489 >> `!n. ?B. B IN measurable_sets m /\ B SUBSET (m_space m DIFF (A n)) /\ d B <= -e`
8490       by METIS_TAC [extreal_lt_def]
8491 >> `!n. d (A n) <= - &n * e`
8492       by (Induct
8493           >- METIS_TAC [mul_lzero,neg_0,le_refl,MEASURE_EMPTY,measure_def,sub_rzero]
8494           >> `d (A (SUC n)) <= d (A n) - e` by METIS_TAC []
8495           >> `?r1. d (A n) = Normal r1` by METIS_TAC [extreal_cases]
8496           >> `?r2. d (A (SUC n)) = Normal r2` by METIS_TAC [extreal_cases]
8497           >> `e <> PosInf` by ( METIS_TAC [extreal_sub_def,le_infty,extreal_not_infty])
8498           >> `?r3. e = Normal r3` by METIS_TAC [extreal_cases]
8499           >> FULL_SIMP_TAC std_ss [extreal_sub_def, extreal_le_def, extreal_ainv_def,
8500                                    extreal_of_num_def, extreal_mul_def]
8501           >> RW_TAC std_ss [ADD1, GSYM REAL_ADD, REAL_NEG_ADD, REAL_ADD_RDISTRIB,
8502                             GSYM REAL_NEG_MINUS1]
8503           >> `r1 + -r3 <= -&n * r3 + -r3` by METIS_TAC [REAL_LE_ADD2,REAL_LE_REFL]
8504           >> METIS_TAC [real_sub,REAL_LE_TRANS])
8505 >> `!n. - d (A n) <= - d (A (SUC n))` by METIS_TAC [le_neg]
8506 >> `!n. A n SUBSET A (SUC n)` by METIS_TAC [SUBSET_UNION]
8507 >> `sup (IMAGE (measure m o A) UNIV) = measure m (BIGUNION (IMAGE A UNIV))`
8508       by METIS_TAC [MONOTONE_CONVERGENCE2,IN_FUNSET,IN_UNIV,measure_def,measurable_sets_def]
8509 >> `sup (IMAGE (measure v o A) UNIV) = measure v (BIGUNION (IMAGE A UNIV))`
8510       by METIS_TAC [MONOTONE_CONVERGENCE2,IN_FUNSET,IN_UNIV,measure_def,measurable_sets_def]
8511 >> FULL_SIMP_TAC std_ss [o_DEF]
8512 >> `?r1. !n. measure m (A n) = Normal (r1 n)`
8513       by (Q.EXISTS_TAC `(\n. @r. measure m (A n) = Normal r)`
8514           >> RW_TAC std_ss []
8515           >> SELECT_ELIM_TAC
8516           >> METIS_TAC [extreal_cases])
8517 >> `?r2. !n. measure v (A n) = Normal (r2 n)`
8518       by (Q.EXISTS_TAC `(\n. @r. measure v (A n) = Normal r)`
8519           >> RW_TAC std_ss []
8520           >> SELECT_ELIM_TAC
8521           >> METIS_TAC [extreal_cases])
8522 >> `BIGUNION (IMAGE A UNIV) IN measurable_sets m`
8523       by METIS_TAC [SIGMA_ALGEBRA_ENUM, measure_space_def, subsets_def,
8524                     measurable_sets_def, IN_FUNSET, IN_UNIV]
8525 >> `?l1. measure m (BIGUNION (IMAGE A UNIV)) = Normal l1` by METIS_TAC [extreal_cases]
8526 >> `?l2. measure v (BIGUNION (IMAGE A UNIV)) = Normal l2` by METIS_TAC [extreal_cases]
8527 >> FULL_SIMP_TAC std_ss []
8528 >> `mono_increasing r1`
8529       by METIS_TAC [mono_increasing_def, mono_increasing_suc, MEASURE_SPACE_INCREASING,
8530                     increasing_def, extreal_le_def]
8531 >> `mono_increasing r2`
8532       by METIS_TAC [mono_increasing_def, mono_increasing_suc, MEASURE_SPACE_INCREASING,
8533                     increasing_def, extreal_le_def, measure_def, measurable_sets_def]
8534 >> FULL_SIMP_TAC std_ss [GSYM sup_seq]
8535 >> `!n. -d (A n) = Normal (r2 n - r1 n)`
8536        by (Q.UNABBREV_TAC `d`
8537            >> RW_TAC std_ss [extreal_sub_def,extreal_ainv_def,REAL_NEG_SUB])
8538 >> Q.ABBREV_TAC `r = (\n. r2 n - r1 n)`
8539 >> `mono_increasing r` by METIS_TAC [mono_increasing_suc, extreal_le_def]
8540 >> `r --> (l2 - l1)` by (Q.UNABBREV_TAC `r` >> METIS_TAC [SEQ_SUB])
8541 >> `sup (IMAGE (\n. Normal (r n)) UNIV) = Normal (l2 - l1)` by METIS_TAC [sup_seq]
8542 >> `sup (IMAGE (\n. -d (A n)) UNIV) = -d (BIGUNION (IMAGE A UNIV))`
8543        by (`(\n. -d (A n)) = (\n. Normal (r n))` by METIS_TAC []
8544            >> POP_ORW
8545            >> Q.UNABBREV_TAC `d`
8546            >> RW_TAC std_ss [extreal_sub_def, extreal_ainv_def, REAL_NEG_SUB])
8547 >> `d (BIGUNION (IMAGE A UNIV)) <> NegInf` by METIS_TAC []
8548 >> `- d (BIGUNION (IMAGE A UNIV)) <> PosInf`
8549      by METIS_TAC [extreal_ainv_def, extreal_cases, extreal_not_infty]
8550 >> `?n. - d (BIGUNION (IMAGE A UNIV)) < &n * e` by METIS_TAC [EXTREAL_ARCH]
8551 >> `&n * e <= -d (A n)` by METIS_TAC [le_neg,neg_neg,mul_lneg]
8552 >> `-d (BIGUNION (IMAGE A univ(:num))) < -d (A n)` by METIS_TAC [lte_trans]
8553 >> `-d (A n) <= - d (BIGUNION (IMAGE A UNIV))`
8554       by (RW_TAC std_ss []
8555           >> Q.PAT_X_ASSUM `sup P = -d Q` (MP_TAC o GSYM)
8556           >> DISCH_THEN (fn th => REWRITE_TAC [th])
8557           >> MATCH_MP_TAC le_sup_imp
8558           >> ONCE_REWRITE_TAC [GSYM SPECIFICATION]
8559           >> RW_TAC std_ss [IN_IMAGE,IN_UNIV]
8560           >> METIS_TAC [])
8561 >> METIS_TAC [extreal_lt_def]
8562QED
8563
8564Theorem RN_lemma2[local]:
8565    !m v. measure_space m /\ measure_space v /\
8566         (m_space v = m_space m) /\
8567         (measurable_sets v = measurable_sets m) /\
8568          measure v (m_space m) <> PosInf /\
8569          measure m (m_space m) <> PosInf ==>
8570      ?A. A IN measurable_sets m /\
8571          measure m (m_space m) - measure v (m_space m) <= measure m A - measure v A /\
8572         !B. B IN measurable_sets m /\ B SUBSET A ==> 0 <= measure m B - measure v B
8573Proof
8574 (* proof *)
8575    RW_TAC std_ss []
8576 >> Q.ABBREV_TAC `d = (\a. measure m a - measure v a)`
8577 >> Q.ABBREV_TAC
8578     `p = (\a b n. a IN measurable_sets m /\ a SUBSET b /\ d b <= d a /\
8579                  !c. c IN measurable_sets m /\ c SUBSET a ==> -(Normal ((1 / 2) pow n)) < d c)`
8580 >> Q.ABBREV_TAC `sts = (\s. IMAGE (\A. s INTER A) (measurable_sets m))`
8581 >> `!s t. s IN measurable_sets m /\ t IN sts s ==> t IN measurable_sets m`
8582        by (RW_TAC std_ss []
8583            >> Q.UNABBREV_TAC `sts`
8584            >> FULL_SIMP_TAC std_ss [IN_IMAGE, MEASURE_SPACE_INTER])
8585 >> `!s t. t IN sts s ==> t SUBSET s`
8586        by (RW_TAC std_ss []
8587            >> Q.UNABBREV_TAC `sts`
8588            >> FULL_SIMP_TAC std_ss [IN_IMAGE, INTER_SUBSET])
8589 >> `!s. s IN measurable_sets m ==> measure_space (s, sts s, measure m)`
8590        by METIS_TAC [MEASURE_SPACE_RESTRICTED]
8591 >> `!s. s IN measurable_sets m ==> measure_space (s, sts s, measure v)`
8592        by METIS_TAC [MEASURE_SPACE_RESTRICTED]
8593 >> `!n. 0 < Normal ((1 / 2) pow n)`
8594        by METIS_TAC [extreal_lt_eq, extreal_of_num_def, POW_HALF_POS]
8595 >> `!s. s IN measurable_sets m ==> measure m s <> PosInf`
8596        by METIS_TAC [MEASURE_SPACE_FINITE_MEASURE]
8597 >> `!s. s IN measurable_sets m ==> measure v s <> PosInf`
8598        by METIS_TAC [MEASURE_SPACE_FINITE_MEASURE]
8599 >> `!s. s IN measurable_sets m ==> measure m s <> NegInf`
8600        by METIS_TAC [MEASURE_SPACE_POSITIVE, positive_not_infty]
8601 >> `!s. s IN measurable_sets m ==> measure v s <> NegInf`
8602        by METIS_TAC [MEASURE_SPACE_POSITIVE, positive_not_infty]
8603 >> `!s n. s IN measurable_sets m ==> ?A. p A s n`
8604        by (RW_TAC std_ss [] \\
8605           `?A. A IN (sts s) /\ measure m s - measure v s <= measure m A - measure v A /\
8606               !B. B IN (sts s) /\ B SUBSET A ==>
8607                   -Normal ((1 / 2) pow n) < measure m B - measure v B`
8608               by (RW_TAC std_ss [] \\
8609                   (MP_TAC o Q.SPECL [`(s,sts s,measure m)`,
8610                                      `(s,sts s,measure v)`,
8611                                      `Normal ((1 / 2) pow n)`]) RN_lemma1 \\
8612                   RW_TAC std_ss [m_space_def, measure_def, measurable_sets_def]) \\
8613            Q.EXISTS_TAC `A` \\
8614            Q.UNABBREV_TAC `p` \\
8615            FULL_SIMP_TAC std_ss [measure_def] \\
8616            RW_TAC std_ss []
8617            >| [ (* goal 1 (of 3) *) METIS_TAC [],
8618                 (* goal 2 (of 3) *) METIS_TAC [],
8619                 (* goal 3 (of 3) *)
8620                 `A SUBSET s` by METIS_TAC []
8621                 >> Suff `c IN sts s` >- METIS_TAC []
8622                 >> Q.UNABBREV_TAC `sts`
8623                 >> FULL_SIMP_TAC std_ss [IN_IMAGE]
8624                 >> Q.EXISTS_TAC `c`
8625                 >> METIS_TAC [SUBSET_INTER2,SUBSET_TRANS] ])
8626 >> Q.ABBREV_TAC `A = PRIM_REC (m_space m) (\a n. @b. p b a n)`
8627 >> `A 0 = m_space m` by METIS_TAC [PRIM_REC_THM]
8628 >> `!n. A (SUC n) = @b. p b (A n) n`
8629        by (Q.UNABBREV_TAC `A` >> RW_TAC std_ss [PRIM_REC_THM])
8630 >> `!n. A n IN measurable_sets m`
8631       by (Induct >- METIS_TAC [MEASURE_SPACE_MSPACE_MEASURABLE]
8632           >> RW_TAC std_ss []
8633           >> SELECT_ELIM_TAC
8634           >> FULL_SIMP_TAC std_ss []
8635           >> METIS_TAC [])
8636 >> `!n. p (A (SUC n)) (A n) n` by METIS_TAC []
8637 >> `!n. A (SUC n) SUBSET (A n)` by METIS_TAC []
8638 >> `!n. d (A n) <= d (A (SUC n))` by METIS_TAC []
8639 >> `!n c. c IN measurable_sets m /\ c SUBSET (A (SUC n)) ==>
8640           -Normal ((1 / 2) pow n) < d c` by METIS_TAC []
8641 >> Q.EXISTS_TAC `BIGINTER (IMAGE A UNIV)`
8642 >> CONJ_TAC >- METIS_TAC [SIGMA_ALGEBRA_FN_BIGINTER, IN_UNIV, IN_FUNSET,
8643                           subsets_def, measurable_sets_def, measure_space_def]
8644 >> reverse CONJ_TAC
8645 >- (RW_TAC std_ss [] \\
8646     SPOSE_NOT_THEN ASSUME_TAC \\
8647     FULL_SIMP_TAC std_ss [GSYM extreal_lt_def] \\
8648    `0 < - (measure m B - measure v B)` by METIS_TAC [lt_neg, neg_0] \\
8649    `?n. measure m B - measure v B < -Normal ((1 / 2) pow n)`
8650         by METIS_TAC [EXTREAL_ARCH_POW2_INV, lt_neg, neg_neg] \\
8651    `d B < -Normal ((1 / 2) pow n)` by METIS_TAC [] \\
8652    `!n. B SUBSET A n` by METIS_TAC [SUBSET_BIGINTER, IN_IMAGE, IN_UNIV] \\
8653     METIS_TAC [lt_antisym])
8654 >> `measure m (BIGINTER (IMAGE A UNIV)) = inf (IMAGE (measure m o A) UNIV)`
8655       by (MATCH_MP_TAC (GSYM MONOTONE_CONVERGENCE_BIGINTER2)
8656           >> RW_TAC std_ss [IN_UNIV, IN_FUNSET])
8657 >> `measure v (BIGINTER (IMAGE A UNIV)) = inf (IMAGE (measure v o A) UNIV)`
8658       by (MATCH_MP_TAC (GSYM MONOTONE_CONVERGENCE_BIGINTER2)
8659           >> RW_TAC std_ss [IN_UNIV, IN_FUNSET])
8660 >> `?r1. !n. measure m (A n) = Normal (r1 n)`
8661       by (Q.EXISTS_TAC `(\n. @r. measure m (A n) = Normal r)`
8662           >> RW_TAC std_ss []
8663           >> SELECT_ELIM_TAC
8664           >> METIS_TAC [extreal_cases])
8665 >> `?r2. !n. measure v (A n) = Normal (r2 n)`
8666       by (Q.EXISTS_TAC `(\n. @r. measure v (A n) = Normal r)`
8667           >> RW_TAC std_ss []
8668           >> SELECT_ELIM_TAC
8669           >> METIS_TAC [extreal_cases])
8670 >> `BIGINTER (IMAGE A UNIV) IN measurable_sets m` by METIS_TAC [MEASURE_SPACE_BIGINTER]
8671 >> `?l1. measure m (BIGINTER (IMAGE A UNIV)) = Normal l1` by METIS_TAC [extreal_cases]
8672 >> `?l2. measure v (BIGINTER (IMAGE A UNIV)) = Normal l2` by METIS_TAC [extreal_cases]
8673 >> FULL_SIMP_TAC std_ss [o_DEF]
8674 >> Q.PAT_X_ASSUM `Normal l1 = Q` (MP_TAC o GSYM)
8675 >> Q.PAT_X_ASSUM `Normal l2 = Q` (MP_TAC o GSYM)
8676 >> RW_TAC std_ss [extreal_sub_def]
8677 >> `mono_decreasing r1`
8678       by METIS_TAC [mono_decreasing_def, mono_decreasing_suc, MEASURE_SPACE_INCREASING,
8679                     increasing_def, extreal_le_def]
8680 >> `mono_decreasing r2`
8681       by METIS_TAC [mono_decreasing_def, mono_decreasing_suc, MEASURE_SPACE_INCREASING,
8682                     increasing_def, extreal_le_def, measure_def, measurable_sets_def]
8683 >> FULL_SIMP_TAC std_ss [GSYM inf_seq]
8684 >> `!n. -d (A n) = Normal (r2 n - r1 n)`
8685       by (Q.UNABBREV_TAC `d` \\
8686           RW_TAC std_ss [extreal_sub_def, extreal_ainv_def, REAL_NEG_SUB])
8687 >> Q.ABBREV_TAC `r = (\n. r2 n - r1 n)`
8688 >> `!n. -d (A (SUC n)) <= -d (A n)` by METIS_TAC [le_neg]
8689 >> `mono_decreasing r` by METIS_TAC [mono_decreasing_suc, extreal_le_def,extreal_ainv_def]
8690 >> `r --> (l2 - l1)` by (Q.UNABBREV_TAC `r` >> METIS_TAC [SEQ_SUB])
8691 >> `inf (IMAGE (\n. Normal (r n)) UNIV) = Normal (l2 - l1)` by METIS_TAC [inf_seq]
8692 >> `inf (IMAGE (\n. -d (A n)) UNIV) = -d (BIGINTER (IMAGE A UNIV))`
8693       by (`(\n. -d (A n)) = (\n. Normal (r n))` by METIS_TAC [] \\
8694           POP_ORW >> Q.UNABBREV_TAC `d` \\
8695           RW_TAC std_ss [extreal_sub_def, extreal_ainv_def, REAL_NEG_SUB])
8696 >> FULL_SIMP_TAC std_ss [inf_eq]
8697 >> `-d (BIGINTER (IMAGE A univ(:num))) <= -d (A 0)`
8698       by (Q.PAT_X_ASSUM `!y. Q ==> -d (BIGINTER (IMAGE A univ(:num))) <= y` MATCH_MP_TAC
8699           >> ONCE_REWRITE_TAC [GSYM SPECIFICATION]
8700           >> RW_TAC std_ss [IN_IMAGE, IN_UNIV]
8701           >> METIS_TAC [])
8702 >> METIS_TAC [le_neg]
8703QED
8704
8705Theorem Radon_Nikodym_finite : (* was: Radon_Nikodym *)
8706    !M N. measure_space M /\ measure_space N /\
8707          measurable_sets M = measurable_sets N /\
8708          measure M (m_space M) <> PosInf /\
8709          measure N (m_space N) <> PosInf /\
8710          measure_absolutely_continuous (measure N) M ==>
8711         ?f. f IN measurable (m_space M,measurable_sets M) Borel /\
8712            (!x. 0 <= f x) /\
8713             !A. A IN measurable_sets M ==>
8714                 pos_fn_integral M (\x. f x * indicator_fn A x) = measure N A
8715Proof
8716    qx_genl_tac [`m`, `v`] >> rpt STRIP_TAC
8717 >> ‘m_space v = m_space m’ by PROVE_TAC [sets_eq_imp_space_eq]
8718 >> Q.PAT_X_ASSUM `measurable_sets m = measurable_sets v` (ASSUME_TAC o SYM)
8719 >> `?f_n. (!n. f_n n IN RADON_F m v) /\ (!x n. f_n n x <= f_n (SUC n) x) /\
8720           (sup (IMAGE (\n. pos_fn_integral m (f_n n)) univ(:num)) =
8721            sup (RADON_F_integrals m v))`
8722       by RW_TAC std_ss [lemma_radon_seq_conv_sup]
8723 >> Q.ABBREV_TAC `g = (\x. sup (IMAGE (\n. f_n n x) UNIV))`
8724 >> Q.EXISTS_TAC `g`
8725 >> `g IN measurable (m_space m,measurable_sets m) Borel`
8726       by (MATCH_MP_TAC IN_MEASURABLE_BOREL_MONO_SUP
8727           >> Q.EXISTS_TAC `f_n`
8728           >> FULL_SIMP_TAC std_ss [RADON_F_def, GSPECIFICATION, measure_space_def,
8729                                    space_def]
8730           >> RW_TAC std_ss [Abbr ‘g’])
8731 >> Know `!x. 0 <= g x`
8732 >- (RW_TAC std_ss [Abbr ‘g’, le_sup'] \\
8733     MATCH_MP_TAC le_trans >> Q.EXISTS_TAC `f_n 0 x` \\
8734     CONJ_TAC >- FULL_SIMP_TAC std_ss [RADON_F_def, GSPECIFICATION] \\
8735     POP_ASSUM MATCH_MP_TAC \\
8736     RW_TAC std_ss [IN_IMAGE, IN_UNIV] \\
8737     Q.EXISTS_TAC ‘0’ >> REWRITE_TAC []) >> DISCH_TAC
8738 >> RW_TAC std_ss []
8739 >> `!A. A IN measurable_sets m ==>
8740         (pos_fn_integral m (\x. g x * indicator_fn A x) =
8741          sup (IMAGE (\n. pos_fn_integral m (\x. f_n n x * indicator_fn A x)) UNIV))`
8742       by (RW_TAC std_ss []
8743           >> MATCH_MP_TAC lebesgue_monotone_convergence_subset
8744           >> FULL_SIMP_TAC std_ss [RADON_F_def, GSPECIFICATION,
8745                                    ext_mono_increasing_suc]
8746           >> RW_TAC std_ss [Abbr ‘g’]
8747           >> METIS_TAC [])
8748 >> `g IN RADON_F m v`
8749       by (FULL_SIMP_TAC std_ss [RADON_F_def,GSPECIFICATION,sup_le]
8750           >> RW_TAC std_ss []
8751           >> POP_ASSUM (MP_TAC o ONCE_REWRITE_RULE [GSYM SPECIFICATION])
8752           >> RW_TAC std_ss [IN_IMAGE,IN_UNIV]
8753           >> METIS_TAC [])
8754 >> `pos_fn_integral m g = sup (IMAGE (\n:num. pos_fn_integral m (f_n n)) UNIV)`
8755       by (MATCH_MP_TAC lebesgue_monotone_convergence
8756           >> FULL_SIMP_TAC std_ss [RADON_F_def, GSPECIFICATION, ext_mono_increasing_suc]
8757           >> Q.UNABBREV_TAC `g`
8758           >> METIS_TAC [])
8759 >> `pos_fn_integral m g = sup (RADON_F_integrals m v)` by FULL_SIMP_TAC std_ss []
8760 >> Q.ABBREV_TAC
8761     `nu = (\A. measure v A - pos_fn_integral m (\x. g x * indicator_fn A x))`
8762 >> `!A. A IN measurable_sets m ==>
8763         pos_fn_integral m (\x. g x * indicator_fn A x) <= measure v A`
8764       by FULL_SIMP_TAC std_ss [RADON_F_def, GSPECIFICATION]
8765 >> `!A. A IN measurable_sets m ==> measure v A <> PosInf`
8766       by METIS_TAC [lt_infty, INCREASING, MEASURE_SPACE_INCREASING, let_trans,
8767                     MEASURE_SPACE_SUBSET_MSPACE, MEASURE_SPACE_MSPACE_MEASURABLE]
8768 >> `!A. A IN measurable_sets m ==> measure m A <> PosInf`
8769       by METIS_TAC [lt_infty, INCREASING, MEASURE_SPACE_INCREASING, let_trans,
8770                     MEASURE_SPACE_SUBSET_MSPACE, MEASURE_SPACE_MSPACE_MEASURABLE]
8771 >> `!A x. 0 <= (\x. g x * indicator_fn A x) x`
8772       by RW_TAC std_ss [indicator_fn_def, mul_rzero, mul_rone, le_01, le_refl]
8773 >> `!A. A IN measurable_sets m ==>
8774         0 <= pos_fn_integral m (\x. g x * indicator_fn A x)`
8775       by (REPEAT STRIP_TAC >> MATCH_MP_TAC pos_fn_integral_pos >> METIS_TAC [])
8776 >> `!A. A IN measurable_sets m ==>
8777         pos_fn_integral m (\x. g x * indicator_fn A x) <> NegInf`
8778       by METIS_TAC [lt_infty, extreal_of_num_def, extreal_not_infty, lte_trans]
8779 >> `!A. A IN measurable_sets m ==>
8780         pos_fn_integral m (\x. g x * indicator_fn A x) <> PosInf`
8781       by METIS_TAC [let_trans, lt_infty]
8782 >> `!A. A IN measurable_sets m ==> 0 <= nu A`
8783       by (RW_TAC std_ss []
8784           >> FULL_SIMP_TAC std_ss [RADON_F_def, GSPECIFICATION]
8785           >> `pos_fn_integral m (\x. g x * indicator_fn A' x) <= measure v A'`
8786                by FULL_SIMP_TAC std_ss []
8787           >> `pos_fn_integral m (\x. g x * indicator_fn A' x) <> PosInf`
8788                by METIS_TAC [lt_infty, INCREASING, MEASURE_SPACE_INCREASING, let_trans,
8789                              MEASURE_SPACE_SUBSET_MSPACE, MEASURE_SPACE_MSPACE_MEASURABLE]
8790           >> Q.UNABBREV_TAC `nu` >> METIS_TAC [sub_zero_le])
8791 >> `positive (m_space m,measurable_sets m,nu)`
8792       by (RW_TAC std_ss [positive_def, measure_def, measurable_sets_def] \\
8793           Q.UNABBREV_TAC `nu` \\
8794           RW_TAC std_ss [MEASURE_EMPTY, indicator_fn_def, NOT_IN_EMPTY,
8795                          pos_fn_integral_zero, mul_rzero, mul_rone, sub_rzero])
8796 >> Q.PAT_X_ASSUM `!A. A IN measurable_sets m ==>
8797                      (pos_fn_integral m (\x. g x * indicator_fn A x) = Q)` (K ALL_TAC)
8798 >> RW_TAC std_ss []
8799 >> `measure_space (m_space m,measurable_sets m,nu)`
8800       by (FULL_SIMP_TAC std_ss [measure_space_def, m_space_def, measurable_sets_def,
8801                                 countably_additive_def, measure_def]
8802           >> Q.UNABBREV_TAC `nu`
8803           >> RW_TAC std_ss [o_DEF]
8804           >> `suminf (\x. measure v (f x)) = measure v (BIGUNION (IMAGE f univ(:num)))`
8805                 by METIS_TAC [o_DEF,countably_additive_def]
8806           >> `suminf (\x. measure v (f x)) <> PosInf` by METIS_TAC []
8807           >> `suminf (\x. measure v (f x) - pos_fn_integral m (\x'. g x' * indicator_fn (f x) x')) =
8808               suminf (\x. measure v (f x)) -
8809               suminf (\x. pos_fn_integral m (\x'. g x' * indicator_fn (f x) x'))`
8810                by  (`(\x. measure v (f x) - pos_fn_integral m (\x'. g x' * indicator_fn (f x) x')) =
8811                      (\x. (\x. measure v (f x)) x -
8812                           (\x. pos_fn_integral m (\x'. g x' * indicator_fn (f x) x')) x)`
8813                         by METIS_TAC []
8814                     >> POP_ORW
8815                     >> MATCH_MP_TAC ext_suminf_sub
8816                     >> RW_TAC std_ss []
8817                     >- (MATCH_MP_TAC pos_fn_integral_pos
8818                         >> RW_TAC std_ss [indicator_fn_def,mul_rzero,mul_rone,le_refl]
8819                         >> METIS_TAC [measure_space_def,countably_additive_def])
8820                     >> METIS_TAC [IN_FUNSET,IN_UNIV])
8821           >> POP_ORW
8822           >> Suff `pos_fn_integral m (\x. g x * indicator_fn (BIGUNION (IMAGE f univ(:num))) x) =
8823                    suminf (\x. pos_fn_integral m (\x'. g x' * indicator_fn (f x) x'))`
8824           >- RW_TAC std_ss []
8825           >> `measure_space m` by METIS_TAC [measure_space_def,countably_additive_def]
8826           >> `(!i x. 0 <= (\i x. g x * indicator_fn (f i) x) i x)`
8827                by RW_TAC std_ss [mul_rzero,mul_rone,indicator_fn_def,le_refl]
8828           >> `(!i. (\i x. g x * indicator_fn (f i) x) i IN measurable (m_space m,measurable_sets m) Borel)`
8829                by (RW_TAC std_ss [] \\
8830                    METIS_TAC [IN_MEASURABLE_BOREL_MUL_INDICATOR, IN_FUNSET,
8831                               IN_UNIV, measurable_sets_def, subsets_def])
8832           >> (MP_TAC o Q.SPECL [`m`,`(\i:num. (\x. g x * indicator_fn (f i) x))`])
8833                                pos_fn_integral_suminf
8834           >> RW_TAC std_ss []
8835           >> POP_ASSUM (MP_TAC o GSYM)
8836           >> RW_TAC std_ss []
8837           >> Suff `(\x. g x * indicator_fn (BIGUNION (IMAGE f univ(:num))) x) =
8838                    (\x'. suminf (\x. g x' * indicator_fn (f x) x'))`
8839           >- RW_TAC std_ss []
8840           >> RW_TAC std_ss [FUN_EQ_THM]
8841           >> `suminf (\x. g x' * (\x. indicator_fn (f x) x') x) =
8842               g x' * suminf (\x. indicator_fn (f x) x')`
8843                by (MATCH_MP_TAC ext_suminf_cmul \\
8844                    RW_TAC std_ss [mul_rone,mul_rzero,le_refl,indicator_fn_def,le_01])
8845           >> FULL_SIMP_TAC std_ss []
8846           >> Suff `suminf (\i. indicator_fn (f i) x') =
8847                    indicator_fn (BIGUNION (IMAGE f univ(:num))) x'`
8848           >- RW_TAC std_ss []
8849           >> FULL_SIMP_TAC std_ss [indicator_fn_suminf])
8850 >> `!A. A IN measurable_sets m ==> nu A <= nu (m_space m)`
8851       by METIS_TAC [MEASURE_SPACE_INCREASING, INCREASING,
8852                     MEASURE_SPACE_SUBSET_MSPACE,
8853                     measure_def, measurable_sets_def, m_space_def,
8854                     MEASURE_SPACE_MSPACE_MEASURABLE]
8855 >> Cases_on `nu A = 0` >- METIS_TAC [sub_0]
8856 >> `0 < nu A` by METIS_TAC [lt_le, MEASURE_SPACE_POSITIVE, positive_def]
8857 >> `0 < nu (m_space m)` by METIS_TAC [lte_trans]
8858 >> `0 <> measure m (m_space m)`
8859       by (SPOSE_NOT_THEN ASSUME_TAC
8860           >> `measure v (m_space m) = 0`
8861                 by METIS_TAC [MEASURE_SPACE_MSPACE_MEASURABLE,
8862                               measure_absolutely_continuous_def]
8863           >> `pos_fn_integral m (\x. g x * indicator_fn (m_space m) x) <= 0`
8864                 by METIS_TAC [MEASURE_SPACE_MSPACE_MEASURABLE]
8865           >> `pos_fn_integral m (\x. g x * indicator_fn (m_space m) x) =  0`
8866                 by METIS_TAC [le_antisym,MEASURE_SPACE_MSPACE_MEASURABLE]
8867           >> `nu (m_space m) = 0` by (Q.UNABBREV_TAC `nu` >> METIS_TAC [sub_rzero])
8868           >> METIS_TAC [lt_imp_ne])
8869 >> `0 < measure m (m_space m)`
8870       by METIS_TAC [lt_le, MEASURE_SPACE_POSITIVE, positive_def,
8871                     MEASURE_SPACE_MSPACE_MEASURABLE]
8872 >> Q.ABBREV_TAC `z = nu (m_space m) / (2 * measure m (m_space m)) `
8873 >> `nu (m_space m) <> NegInf` by METIS_TAC [lt_trans, lt_infty, num_not_infty]
8874 >> `measure m (m_space m) <> NegInf` by METIS_TAC [lt_trans, lt_infty, num_not_infty]
8875 >> `nu (m_space m) <> PosInf`
8876       by (Q.UNABBREV_TAC `nu`
8877           >> RW_TAC std_ss []
8878           >> METIS_TAC [sub_not_infty, MEASURE_SPACE_MSPACE_MEASURABLE])
8879 >> `?e. 0 < e /\ (z = Normal e)`
8880       by (Q.UNABBREV_TAC `z`
8881           >> `?r1. nu (m_space m) = Normal r1` by METIS_TAC [extreal_cases]
8882           >> `?r2. measure m (m_space m) = Normal r2` by METIS_TAC [extreal_cases]
8883           >> RW_TAC std_ss [extreal_mul_def,extreal_of_num_def]
8884           >> `0 < r1` by METIS_TAC [extreal_of_num_def,extreal_lt_eq]
8885           >> `0 < r2` by METIS_TAC [extreal_of_num_def,extreal_lt_eq]
8886           >> `0 < 2 * r2` by RW_TAC real_ss [REAL_LT_MUL]
8887           >> FULL_SIMP_TAC std_ss [extreal_div_eq,REAL_LT_IMP_NE]
8888           >> `0 < r1 / (2 * r2)` by RW_TAC std_ss [REAL_LT_DIV]
8889           >> METIS_TAC [])
8890 >> Q.ABBREV_TAC `snu = (\A. nu A - Normal e * (measure m A))`
8891 >> `?A'. A' IN measurable_sets m /\ snu(m_space m) <= snu (A') /\
8892         !B. B IN measurable_sets m /\ B SUBSET A' ==> 0 <= snu (B)`
8893       by (Q.UNABBREV_TAC `snu` >> RW_TAC std_ss [] \\
8894           MP_TAC
8895             (Q.SPECL [`(m_space m, measurable_sets m, nu)`,
8896                       `(m_space m, measurable_sets m, (\A. Normal e * measure m A))`]
8897                      RN_lemma2) \\
8898           RW_TAC std_ss [m_space_def, measurable_sets_def, measure_def] \\
8899           METIS_TAC [MEASURE_SPACE_CMUL, REAL_LT_IMP_LE, mul_not_infty,
8900                      extreal_not_infty])
8901 >> Q.ABBREV_TAC `g' = (\x. g x + Normal e * indicator_fn (A') x)`
8902 >> `!A. A IN measurable_sets m ==>
8903         pos_fn_integral m (\x. g' x * indicator_fn A x) =
8904         pos_fn_integral m (\x. g x * indicator_fn A x) +
8905         Normal e * measure m (A INTER A')`
8906   by (rpt STRIP_TAC
8907       >> `measure m (A'' INTER A') =
8908             pos_fn_integral m (indicator_fn (A'' INTER A'))`
8909         by METIS_TAC [pos_fn_integral_indicator,MEASURE_SPACE_INTER]
8910       >> POP_ORW
8911       >> `Normal e * pos_fn_integral m (indicator_fn (A'' INTER A')) =
8912             pos_fn_integral m (\x. Normal e * indicator_fn (A'' INTER A') x)`
8913         by ((MATCH_MP_TAC o GSYM) pos_fn_integral_cmul
8914             >> RW_TAC real_ss [REAL_LT_IMP_LE,indicator_fn_def,le_01,le_refl])
8915       >> POP_ORW
8916       >> Q.UNABBREV_TAC `g'`
8917       >> `(\x. (\x. g x + Normal e * indicator_fn A' x) x * indicator_fn A'' x)
8918              =
8919           (\x. (\x. g x * indicator_fn A'' x) x +
8920                (\x. Normal e * indicator_fn (A'' INTER A') x) x)`
8921         by (RW_TAC std_ss [FUN_EQ_THM, indicator_fn_def, IN_INTER] \\
8922             METIS_TAC [mul_rone, mul_rzero, add_rzero, indicator_fn_def,
8923                        IN_INTER])
8924       >> POP_ORW
8925       >> MATCH_MP_TAC pos_fn_integral_add
8926       >> FULL_SIMP_TAC std_ss []
8927       >> CONJ_TAC
8928       >- (RW_TAC std_ss [indicator_fn_def,le_01,le_refl,mul_rone,mul_rzero]
8929           >> FULL_SIMP_TAC std_ss [extreal_of_num_def,extreal_le_def,
8930                                    REAL_LT_IMP_LE])
8931       >> RW_TAC std_ss []
8932           >- METIS_TAC [IN_MEASURABLE_BOREL_MUL_INDICATOR, measure_space_def,
8933                         measurable_sets_def, subsets_def]
8934           >> MATCH_MP_TAC IN_MEASURABLE_BOREL_CMUL
8935           >> RW_TAC std_ss []
8936           >> Q.EXISTS_TAC `indicator_fn (A'' INTER A')`
8937           >> Q.EXISTS_TAC `e`
8938           >> RW_TAC std_ss []
8939           >- FULL_SIMP_TAC std_ss [measure_space_def]
8940           >> MATCH_MP_TAC IN_MEASURABLE_BOREL_INDICATOR
8941           >> METIS_TAC [measure_space_def, measurable_sets_def, subsets_def,
8942                         MEASURE_SPACE_INTER, space_def])
8943 >> `!A. A IN measurable_sets m ==> ((A INTER A') IN measurable_sets m /\ (A INTER A') SUBSET A')`
8944        by METIS_TAC [INTER_SUBSET, MEASURE_SPACE_INTER]
8945 >> `!A. A IN measurable_sets m ==> 0 <= nu (A INTER A') - Normal e * measure m (A INTER A')`
8946        by (Q.UNABBREV_TAC `snu` >> METIS_TAC [])
8947 >> `!A. A IN measurable_sets m ==> Normal e * measure m (A INTER A') <= nu (A INTER A')`
8948        by (RW_TAC std_ss [] \\
8949           `Normal e * measure m (A'' INTER A') <> PosInf`
8950               by FULL_SIMP_TAC std_ss [mul_not_infty, REAL_LT_IMP_LE, MEASURE_SPACE_INTER] \\
8951           `Normal e * measure m (A'' INTER A') <> NegInf`
8952               by METIS_TAC [mul_not_infty, REAL_LT_IMP_LE, MEASURE_SPACE_INTER,
8953                             MEASURE_SPACE_POSITIVE, positive_not_infty] \\
8954            METIS_TAC [sub_zero_le])
8955 >> `!A. A IN measurable_sets m ==>
8956         pos_fn_integral m (\x. g x * indicator_fn A x) + Normal e * measure m (A INTER A') <=
8957         pos_fn_integral m (\x. g x * indicator_fn A x) + nu (A INTER A')`
8958        by METIS_TAC [le_ladd_imp]
8959 >> `!A. A IN measurable_sets m ==> nu (A INTER A') <= nu A`
8960        by (RW_TAC std_ss [] \\
8961            (MATCH_MP_TAC o REWRITE_RULE [measurable_sets_def, measure_def] o
8962             Q.SPEC `(m_space m,measurable_sets m,nu)`) INCREASING \\
8963             METIS_TAC [MEASURE_SPACE_INCREASING, MEASURE_SPACE_INTER, INTER_SUBSET])
8964 >> `!A. A IN measurable_sets m ==>
8965         pos_fn_integral m (\x. g x * indicator_fn A x) + Normal e * measure m (A INTER A') <=
8966         pos_fn_integral m (\x. g x * indicator_fn A x) + nu (A)`
8967        by METIS_TAC [le_ladd_imp,le_trans]
8968 >> `!A. A IN measurable_sets m ==>
8969         pos_fn_integral m (\x. g x * indicator_fn A x) +
8970         Normal e * measure m (A INTER A') <= measure v A`
8971        by (Q.UNABBREV_TAC `nu` >> FULL_SIMP_TAC std_ss [] \\
8972            RW_TAC std_ss [] >> METIS_TAC [sub_add2])
8973 >> `!A. A IN measurable_sets m ==>
8974         pos_fn_integral m (\x. g' x * indicator_fn A x) <= measure v A`
8975        by METIS_TAC []
8976 >> `g' IN RADON_F m v`
8977        by (RW_TAC std_ss [RADON_F_def,GSPECIFICATION]
8978            >- (Q.UNABBREV_TAC `g'` \\
8979                MATCH_MP_TAC IN_MEASURABLE_BOREL_ADD \\
8980                Q.EXISTS_TAC `g` \\
8981                Q.EXISTS_TAC `(\x. Normal e * indicator_fn A' x)` \\
8982                CONJ_TAC >- FULL_SIMP_TAC std_ss [measure_space_def] \\
8983                FULL_SIMP_TAC std_ss [] \\
8984                CONJ_TAC
8985                >- (MATCH_MP_TAC IN_MEASURABLE_BOREL_CMUL \\
8986                    METIS_TAC [measure_space_def, subsets_def, measurable_sets_def,
8987                               IN_MEASURABLE_BOREL_INDICATOR]) \\
8988                RW_TAC std_ss [indicator_fn_def, mul_rone, mul_rzero, num_not_infty, space_def] \\
8989                METIS_TAC [lt_infty, lte_trans, num_not_infty]) \\
8990            Q.UNABBREV_TAC `g'` \\
8991            RW_TAC std_ss [indicator_fn_def, mul_rone, mul_rzero, add_rzero] \\
8992            METIS_TAC [le_add2, add_rzero, le_trans, lt_imp_le,
8993                       extreal_lt_eq, extreal_of_num_def])
8994 >> `pos_fn_integral m g' IN RADON_F_integrals m v`
8995       by (FULL_SIMP_TAC std_ss [RADON_F_integrals_def, GSPECIFICATION] \\
8996           METIS_TAC [])
8997 >> `pos_fn_integral m (\x. g' x * indicator_fn (m_space m) x) =
8998     pos_fn_integral m (\x. g x * indicator_fn (m_space m) x) + Normal e * measure m A'`
8999       by METIS_TAC [MEASURE_SPACE_MSPACE_MEASURABLE,
9000                     MEASURE_SPACE_SUBSET_MSPACE, SUBSET_INTER2]
9001 >> `!x. 0 <= g' x`
9002       by (Q.UNABBREV_TAC `g'` \\
9003           RW_TAC std_ss [indicator_fn_def, mul_rone, mul_rzero, add_rzero] \\
9004           METIS_TAC [le_add2, add_rzero, le_trans, lt_imp_le, extreal_lt_eq, extreal_of_num_def])
9005 >> `pos_fn_integral m g' = pos_fn_integral m g + Normal e * measure m A'`
9006       by METIS_TAC [pos_fn_integral_mspace]
9007 >> `0 < snu (m_space m)`
9008       by (Q.UNABBREV_TAC `snu` \\
9009           RW_TAC std_ss [] \\
9010          `?r1. nu (m_space m) = Normal r1` by METIS_TAC [extreal_cases] \\
9011          `?r2. measure m (m_space m) = Normal r2` by METIS_TAC [extreal_cases] \\
9012          `0 < r1` by METIS_TAC [extreal_of_num_def,extreal_lt_eq] \\
9013          `0 < r2` by METIS_TAC [extreal_of_num_def,extreal_lt_eq] \\
9014          `0 < 2 * r2` by RW_TAC real_ss [REAL_LT_MUL] \\
9015          `Normal e = nu (m_space m) / (2 * measure m (m_space m))`
9016             by RW_TAC std_ss [] >> POP_ORW \\
9017           REWRITE_TAC [extreal_of_num_def] \\
9018           FULL_SIMP_TAC std_ss [extreal_mul_def, extreal_div_eq, REAL_LT_IMP_NE,
9019                                 extreal_sub_def, extreal_lt_eq] \\
9020           RW_TAC real_ss [real_div, REAL_INV_MUL, REAL_LT_IMP_NE, REAL_MUL_ASSOC] \\
9021          `inv 2 * inv r2 * r2 = inv 2`
9022             by METIS_TAC [REAL_LT_IMP_NE, REAL_MUL_LINV, REAL_MUL_ASSOC,
9023                           REAL_MUL_RID] \\
9024          `r1 - r1 * inv 2 * inv r2 * r2 = r1 / 2`
9025             by METIS_TAC [REAL_NEG_HALF, real_div, REAL_MUL_ASSOC] \\
9026           FULL_SIMP_TAC real_ss [REAL_LT_DIV])
9027 >> `0 < snu A'` by METIS_TAC [lte_trans]
9028 >> `Normal e * measure m A' <> PosInf` by METIS_TAC [REAL_LT_IMP_LE,mul_not_infty]
9029 >> `Normal e * measure m A' <> NegInf`
9030       by METIS_TAC [REAL_LT_IMP_LE, mul_not_infty, MEASURE_SPACE_POSITIVE,
9031                     positive_not_infty]
9032 >> `Normal e * measure m A' < nu (A')` by METIS_TAC [sub_zero_lt2]
9033 >> `0 <= Normal e * measure m A'`
9034       by METIS_TAC [le_mul, REAL_LT_IMP_LE, extreal_le_def, MEASURE_SPACE_POSITIVE,
9035                     positive_def, extreal_of_num_def]
9036 >> `0 < nu A'` by METIS_TAC [let_trans]
9037 >> `0 <> measure m A'`
9038       by (SPOSE_NOT_THEN ASSUME_TAC \\
9039          `measure v A' = 0`
9040             by METIS_TAC [MEASURE_SPACE_MSPACE_MEASURABLE,
9041                           measure_absolutely_continuous_def] \\
9042          `pos_fn_integral m (\x. g x * indicator_fn A' x) <= 0` by METIS_TAC [] \\
9043          `pos_fn_integral m (\x. g x * indicator_fn A' x) =  0`
9044             by METIS_TAC [le_antisym] \\
9045          `nu A' = 0` by (Q.UNABBREV_TAC `nu` >> METIS_TAC [sub_rzero]) \\
9046           METIS_TAC [lt_imp_ne])
9047 >> `0 < measure m A'`
9048       by METIS_TAC [lt_le, MEASURE_SPACE_POSITIVE, positive_def,
9049                     MEASURE_SPACE_MSPACE_MEASURABLE]
9050 >> `0 < Normal e * measure m A'`
9051       by METIS_TAC [lt_mul, extreal_lt_eq, extreal_of_num_def]
9052 >> `pos_fn_integral m g <> NegInf`
9053       by METIS_TAC [pos_fn_integral_pos, lt_infty, num_not_infty, lte_trans]
9054 >> `pos_fn_integral m g <> PosInf`
9055       by METIS_TAC [MEASURE_SPACE_MSPACE_MEASURABLE, pos_fn_integral_mspace]
9056 >> `pos_fn_integral m g < pos_fn_integral m g'`
9057       by METIS_TAC [let_add2, le_refl, num_not_infty, add_rzero]
9058 >> `pos_fn_integral m g' <= pos_fn_integral m g`
9059       by METIS_TAC [le_sup_imp, SPECIFICATION]
9060 >> METIS_TAC [extreal_lt_def]
9061QED
9062
9063(* cf. measure_density_indicator for simplified statements *)
9064Theorem measure_restricted :
9065    !m s t. measure_space m /\
9066            s IN measurable_sets m /\ t IN measurable_sets m ==>
9067         (measure (m_space m, measurable_sets m,
9068           (\A. pos_fn_integral m (\x. indicator_fn s x * indicator_fn A x))) t =
9069          measure m (s INTER t))
9070Proof
9071  Q.X_GEN_TAC `M` THEN RW_TAC std_ss [] THEN
9072  `algebra (m_space M, measurable_sets M)` by
9073    METIS_TAC [measure_space_def, sigma_algebra_def] THEN
9074  `s INTER t IN measurable_sets M` by METIS_TAC [ALGEBRA_INTER, subsets_def] THEN
9075  Q.ABBREV_TAC `m = (m_space M,measurable_sets M,
9076          (\A. pos_fn_integral M (\x. indicator_fn s x * indicator_fn A x)))` THEN
9077
9078 Suff `measure_space m` THEN1
9079 ( DISCH_TAC THEN `t IN measurable_sets m` by METIS_TAC [measurable_sets_def] THEN
9080   ASM_SIMP_TAC std_ss [GSYM pos_fn_integral_indicator] THEN
9081   ONCE_REWRITE_TAC [METIS [INDICATOR_FN_MUL_INTER]
9082    ``indicator_fn (s INTER t) = (\x. indicator_fn s x * indicator_fn t x)``] THEN
9083   ASM_CASES_TAC ``m_space M = {}`` THENL
9084   [Suff `measurable_sets M = {{}}` THENL
9085    [DISCH_TAC,
9086     FULL_SIMP_TAC std_ss [measure_space_def, sigma_algebra_def, algebra_def] THEN
9087     FULL_SIMP_TAC std_ss [space_def, subsets_def, subset_class_def] THEN
9088     UNDISCH_TAC ``!x. x IN measurable_sets M ==> x SUBSET {}`` THEN
9089     SIMP_TAC std_ss [SUBSET_EMPTY, EXTENSION, IN_SING] THEN DISCH_TAC THEN
9090     GEN_TAC THEN EQ_TAC THEN ASM_SIMP_TAC std_ss [] THEN DISCH_TAC THEN
9091     `x = {}` by ASM_SET_TAC [] THEN METIS_TAC []] THEN
9092    FULL_SIMP_TAC std_ss [IN_SING] THEN
9093    SIMP_TAC std_ss [indicator_fn_def, NOT_IN_EMPTY, mul_rzero] THEN
9094    ASM_SIMP_TAC std_ss [pos_fn_integral_zero],
9095    ALL_TAC] THEN
9096   Q.UNABBREV_TAC `m` THEN
9097   Suff `pos_fn_integral
9098          (m_space M,measurable_sets M,
9099           (\A. pos_fn_integral M (\x. max 0 (indicator_fn s x * indicator_fn A x))))
9100          (\x. max 0 (indicator_fn t x)) =
9101         pos_fn_integral M (\x. max 0 (indicator_fn s x * indicator_fn t x))` THENL
9102   [SIMP_TAC std_ss [extreal_max_def, le_mul, indicator_fn_pos_le] THEN
9103    METIS_TAC [], ALL_TAC] THEN
9104   MATCH_MP_TAC pos_fn_integral_density' THEN
9105   ASM_SIMP_TAC std_ss [] THEN
9106   CONJ_TAC THENL
9107   [MATCH_MP_TAC IN_MEASURABLE_BOREL_INDICATOR THEN
9108    METIS_TAC [subsets_def, measure_space_def],
9109    ALL_TAC] THEN
9110   CONJ_TAC THENL
9111   [MATCH_MP_TAC IN_MEASURABLE_BOREL_INDICATOR THEN
9112    METIS_TAC [subsets_def, measure_space_def],
9113    ALL_TAC] THEN
9114   CONJ_TAC THENL
9115   [SIMP_TAC std_ss [AE_ALT, GSPECIFICATION, null_set_def] THEN
9116    SIMP_TAC std_ss [SUBSET_DEF, GSPECIFICATION] THEN Q.EXISTS_TAC `{}` THEN
9117    FULL_SIMP_TAC std_ss [measure_space_def, sigma_algebra_alt_pow] THEN
9118    FULL_SIMP_TAC std_ss [positive_def, NOT_IN_EMPTY] THEN
9119    GEN_TAC THEN DISJ2_TAC THEN
9120    SIMP_TAC std_ss [indicator_fn_def] THEN COND_CASES_TAC THEN
9121    SIMP_TAC real_ss [le_refl, extreal_of_num_def, extreal_le_def],
9122    ALL_TAC] THEN
9123   GEN_TAC THEN
9124   SIMP_TAC std_ss [indicator_fn_def] THEN COND_CASES_TAC THEN
9125   SIMP_TAC real_ss [le_refl, extreal_of_num_def, extreal_le_def]
9126 (* end of Suff *)
9127  ) THEN
9128  Q.UNABBREV_TAC `m` THEN
9129  FULL_SIMP_TAC std_ss [measure_space_def, m_space_def, measurable_sets_def] THEN
9130  CONJ_TAC THENL
9131  [SIMP_TAC std_ss [positive_def, measure_def, measurable_sets_def] THEN
9132   SIMP_TAC std_ss [indicator_fn_def, NOT_IN_EMPTY, mul_rzero] THEN
9133   FULL_SIMP_TAC std_ss [COND_ID, pos_fn_integral_zero, measure_space_def] THEN
9134   GEN_TAC THEN STRIP_TAC THEN MATCH_MP_TAC pos_fn_integral_pos THEN
9135   FULL_SIMP_TAC std_ss [measure_space_def] THEN GEN_TAC THEN
9136   REPEAT COND_CASES_TAC THEN
9137   SIMP_TAC real_ss [le_refl, extreal_of_num_def, extreal_le_def, mul_rone,
9138                     mul_rzero],
9139   ALL_TAC] THEN
9140  SIMP_TAC std_ss [countably_additive_alt_eq, INDICATOR_FN_MUL_INTER] THEN
9141  REPEAT STRIP_TAC THEN SIMP_TAC std_ss [o_DEF] THEN
9142  `!x. A x IN measurable_sets M` by ASM_SET_TAC [] THEN
9143  ASM_SIMP_TAC std_ss [INTER_BIGUNION, GSPECIFICATION, IN_UNIV] THEN
9144  REWRITE_TAC
9145    [SET_RULE ``{s INTER x | ?i'. x = A i'} = {s INTER A i' | i' IN UNIV}``] THEN
9146  SIMP_TAC std_ss [GSYM IMAGE_DEF] THEN
9147  Suff `!x. indicator_fn (BIGUNION (IMAGE (\i'. s INTER A i') univ(:num))) x =
9148   suminf (\j. indicator_fn ((\i'. s INTER A i') j) x)` THENL
9149  [DISCH_TAC THEN ASM_SIMP_TAC std_ss [],
9150   GEN_TAC THEN ONCE_REWRITE_TAC [EQ_SYM_EQ] THEN
9151   MATCH_MP_TAC indicator_fn_suminf THEN
9152  FULL_SIMP_TAC std_ss [disjoint_family_on, DISJOINT_DEF] THEN
9153  ASM_SET_TAC []] THEN ONCE_REWRITE_TAC [METIS [ETA_AX]
9154    “(\x'. indicator_fn (s INTER A x) x') = (\x. indicator_fn (s INTER A x)) x”] THEN
9155  ONCE_REWRITE_TAC [METIS [] ``suminf (\j. indicator_fn (s INTER A j) x) =
9156                       suminf (\j. (\k. indicator_fn (s INTER A k)) j x)``] THEN
9157  MATCH_MP_TAC pos_fn_integral_suminf THEN
9158  ASM_SIMP_TAC std_ss [measure_space_def] THEN
9159  CONJ_TAC THENL
9160  [SIMP_TAC std_ss [indicator_fn_def] THEN REPEAT GEN_TAC THEN COND_CASES_TAC THEN
9161   SIMP_TAC real_ss [le_refl, extreal_of_num_def, extreal_le_def], ALL_TAC] THEN
9162  GEN_TAC THEN MATCH_MP_TAC IN_MEASURABLE_BOREL_INDICATOR THEN
9163  Q.EXISTS_TAC `s INTER A i` THEN ASM_SIMP_TAC std_ss [] THEN
9164  MATCH_MP_TAC ALGEBRA_INTER THEN
9165  FULL_SIMP_TAC std_ss [sigma_algebra_def, subsets_def] THEN
9166  METIS_TAC []
9167QED
9168
9169(* |- !m s t.
9170          measure_space m /\ s IN measurable_sets m /\ t IN measurable_sets m ==>
9171          measure (density m (indicator_fn s)) t = measure m (s INTER t)
9172 *)
9173Theorem measure_density_indicator =
9174    REWRITE_RULE [GSYM density_def, GSYM density_measure_def] measure_restricted;
9175
9176(* M is finite, while N can be infinite *)
9177Theorem Radon_Nikodym_finite_arbitrary :
9178    !M N. measure_space M /\ measure_space N /\
9179         (m_space M = m_space N) /\ (measurable_sets M = measurable_sets N) /\
9180         (measure M (m_space M) <> PosInf) /\
9181          measure_absolutely_continuous (measure N) M ==>
9182      ?f. f IN measurable (m_space M,measurable_sets M) Borel /\ (!x. 0 <= f x) /\
9183          !A. A IN measurable_sets M ==>
9184             (pos_fn_integral M (\x. f x * indicator_fn A x) = measure N A)
9185Proof
9186  rpt GEN_TAC THEN DISCH_TAC THEN
9187  FIRST_ASSUM (MP_TAC o MATCH_MP split_space_into_finite_sets_and_rest) THEN
9188  DISCH_THEN (X_CHOOSE_TAC ``Q0:'a->bool``) THEN POP_ASSUM MP_TAC THEN
9189  DISCH_THEN (X_CHOOSE_TAC ``Q:num->'a->bool``) THEN FULL_SIMP_TAC std_ss [] THEN
9190  Q.PAT_X_ASSUM `m_space M = m_space N` (ASSUME_TAC o (MATCH_MP EQ_SYM)) THEN
9191  Q.PAT_X_ASSUM `measurable_sets M = measurable_sets N`
9192      (ASSUME_TAC o (MATCH_MP EQ_SYM)) THEN ASM_REWRITE_TAC [] THEN
9193  Know `!i. Q i IN measurable_sets M` >- ASM_SET_TAC [] THEN DISCH_TAC THEN
9194  Q.ABBREV_TAC `NN = (\i:num. (m_space M, measurable_sets M,
9195    (\A. pos_fn_integral N (\x. indicator_fn (Q i) x * indicator_fn A x))))` THEN
9196  Q.ABBREV_TAC `MM = (\i:num. (m_space M, measurable_sets M,
9197    (\A. pos_fn_integral M (\x. indicator_fn (Q i) x * indicator_fn A x))))` THEN
9198  Know `!i. ?f. f IN measurable (m_space (MM i), measurable_sets (MM i)) Borel /\
9199                (!x. 0 <= f x) /\ !A. A IN measurable_sets (MM i) ==>
9200                (pos_fn_integral (MM i) (\x. f x * indicator_fn A x) = measure (NN i) A)` >-
9201  (GEN_TAC THEN MATCH_MP_TAC Radon_Nikodym_finite THEN
9202   Know `measure (MM i) (m_space (MM i)) <> PosInf` >-
9203   ( Q.UNABBREV_TAC `MM` THEN
9204     SIMP_TAC std_ss [measure_def, m_space_def] THEN
9205     ASM_SIMP_TAC std_ss [MEASURE_SPACE_MSPACE_MEASURABLE] THEN
9206     SIMP_TAC std_ss [INDICATOR_FN_MUL_INTER] THEN
9207    `Q i SUBSET m_space M` by METIS_TAC [MEASURE_SPACE_SUBSET_MSPACE] THEN
9208     ASM_SIMP_TAC std_ss [SET_RULE ``a SUBSET b ==> (a INTER b = a)``] THEN
9209     REWRITE_TAC [METIS [ETA_AX] ``(\x. indicator_fn (Q i) x) = indicator_fn (Q i)``] THEN
9210     ASM_SIMP_TAC std_ss [pos_fn_integral_indicator] THEN
9211     SIMP_TAC std_ss [lt_infty] THEN MATCH_MP_TAC let_trans THEN
9212     Q.EXISTS_TAC `measure M (m_space M)` THEN ASM_REWRITE_TAC [GSYM lt_infty] THEN
9213     MATCH_MP_TAC INCREASING THEN ASM_SIMP_TAC std_ss [MEASURE_SPACE_MSPACE_MEASURABLE] THEN
9214     ASM_SIMP_TAC std_ss [MEASURE_SPACE_INCREASING] ) THEN
9215   DISCH_TAC THEN ASM_REWRITE_TAC [] THEN
9216   Know `measure (NN i) (m_space (NN i)) <> PosInf` >-
9217   ( Q.UNABBREV_TAC `NN` THEN
9218     SIMP_TAC std_ss [measure_def, m_space_def] THEN
9219     ASM_SIMP_TAC std_ss [MEASURE_SPACE_MSPACE_MEASURABLE] THEN
9220     SIMP_TAC std_ss [INDICATOR_FN_MUL_INTER] THEN
9221     `Q i SUBSET m_space M` by METIS_TAC [MEASURE_SPACE_SUBSET_MSPACE] THEN
9222     ASM_SIMP_TAC std_ss [SET_RULE ``a SUBSET b ==> (a INTER b = a)``] THEN
9223     REWRITE_TAC [METIS [ETA_AX] ``(\x. indicator_fn (Q i) x) = indicator_fn (Q i)``] THEN
9224     `pos_fn_integral N (indicator_fn (Q i)) = measure N (Q i)`
9225      by METIS_TAC [pos_fn_integral_indicator] THEN
9226     ASM_SIMP_TAC std_ss [] ) THEN
9227   DISCH_TAC THEN ASM_REWRITE_TAC [] THEN
9228   `measurable_sets (MM i) = measurable_sets (NN i)` by METIS_TAC [measurable_sets_def] THEN
9229   ASM_REWRITE_TAC [] THEN
9230   Know `measure_absolutely_continuous (measure (NN i)) (MM i)` >-
9231   (FULL_SIMP_TAC std_ss [measure_absolutely_continuous_def] THEN
9232    qunabbrevl_tac [`MM`, `NN`] THEN
9233    SIMP_TAC std_ss [measure_def, measurable_sets_def] THEN
9234    SIMP_TAC std_ss [INDICATOR_FN_MUL_INTER] THEN
9235    REWRITE_TAC [METIS [ETA_AX] ``(\x. indicator_fn (Q i) x) = indicator_fn (Q i)``] THEN
9236    GEN_TAC THEN STRIP_TAC THEN POP_ASSUM MP_TAC THEN
9237    FIRST_ASSUM (fn th => REWRITE_TAC [th]) THEN
9238    `Q i INTER s IN measurable_sets M` by
9239     METIS_TAC [ALGEBRA_INTER, measure_space_def, sigma_algebra_def, subsets_def] THEN
9240    FULL_SIMP_TAC std_ss [subsets_def, pos_fn_integral_indicator]) THEN
9241   DISCH_TAC THEN ASM_REWRITE_TAC [] THEN
9242   Know `m_space (MM i) = m_space (NN i)`
9243   >- (qunabbrevl_tac [`MM`, `NN`] >> SIMP_TAC std_ss [m_space_def]) THEN
9244   DISCH_TAC THEN ASM_REWRITE_TAC [] THEN
9245   FULL_SIMP_TAC std_ss [measure_space_def] THEN
9246   qunabbrevl_tac [`MM`, `NN`] THEN
9247   FULL_SIMP_TAC std_ss [m_space_def, measurable_sets_def, measure_def] THEN
9248   REWRITE_TAC [GSYM CONJ_ASSOC] THEN CONJ_TAC
9249   >- (SIMP_TAC std_ss [positive_def, measure_def, measurable_sets_def] THEN
9250      `{} IN measurable_sets N` by METIS_TAC [measure_space_def, sigma_algebra_alt_pow] THEN
9251       ASM_SIMP_TAC std_ss [] THEN CONJ_TAC
9252       >- (SIMP_TAC std_ss [indicator_fn_def, NOT_IN_EMPTY, mul_rzero] THEN
9253           METIS_TAC [pos_fn_integral_zero, measure_space_def]) THEN
9254       RW_TAC std_ss [] THEN MATCH_MP_TAC pos_fn_integral_pos THEN
9255       REWRITE_TAC [INDICATOR_FN_MUL_INTER] THEN ASM_SIMP_TAC std_ss [measure_space_def] THEN
9256       SIMP_TAC std_ss [indicator_fn_def] THEN GEN_TAC THEN COND_CASES_TAC THEN
9257       SIMP_TAC real_ss [le_refl, extreal_of_num_def, extreal_le_def]) THEN
9258   CONJ_TAC (* countably_additive *)
9259   >- (SIMP_TAC std_ss [countably_additive_alt_eq, INDICATOR_FN_MUL_INTER] THEN
9260       REPEAT STRIP_TAC THEN SIMP_TAC std_ss [o_DEF] THEN
9261      `!x. A x IN measurable_sets M` by ASM_SET_TAC [] THEN
9262       ASM_SIMP_TAC std_ss [INTER_BIGUNION, GSPECIFICATION, IN_UNIV] THEN
9263       REWRITE_TAC [SET_RULE ``{Q i INTER x | ?i'. x = A i'} = {Q i INTER A i' | i' IN UNIV}``] THEN
9264       SIMP_TAC std_ss [GSYM IMAGE_DEF] THEN
9265       Suff `!x. indicator_fn (BIGUNION (IMAGE (\i'. Q i INTER A i') univ(:num))) x =
9266          suminf (\j. indicator_fn ((\i'. Q i INTER A i') j) x)` THENL
9267       [DISCH_TAC THEN ASM_SIMP_TAC std_ss [],
9268        GEN_TAC THEN ONCE_REWRITE_TAC [EQ_SYM_EQ] THEN MATCH_MP_TAC indicator_fn_suminf THEN
9269        FULL_SIMP_TAC std_ss [disjoint_family_on, DISJOINT_DEF] THEN
9270        ASM_SET_TAC []] THEN ONCE_REWRITE_TAC [METIS [ETA_AX]
9271          ``(\x'. indicator_fn (Q i INTER A x) x') = (\x. indicator_fn (Q i INTER A x)) x``] THEN
9272       ONCE_REWRITE_TAC [METIS [] ``suminf (\j. indicator_fn (Q i INTER A j) x) =
9273                         suminf (\j. (\k. indicator_fn (Q i INTER A k)) j x)``] THEN
9274       MATCH_MP_TAC pos_fn_integral_suminf THEN ASM_SIMP_TAC std_ss [measure_space_def] THEN
9275       CONJ_TAC THENL
9276       [SIMP_TAC std_ss [indicator_fn_def] THEN REPEAT GEN_TAC THEN COND_CASES_TAC THEN
9277        SIMP_TAC real_ss [le_refl, extreal_of_num_def, extreal_le_def], ALL_TAC] THEN
9278       GEN_TAC THEN MATCH_MP_TAC IN_MEASURABLE_BOREL_INDICATOR THEN
9279       Q.EXISTS_TAC `Q i INTER A i'` THEN ASM_SIMP_TAC std_ss [] THEN
9280       MATCH_MP_TAC ALGEBRA_INTER THEN
9281       FULL_SIMP_TAC std_ss [sigma_algebra_def, subsets_def] THEN
9282       METIS_TAC []) THEN
9283   CONJ_TAC (* positive *)
9284   >- (SIMP_TAC std_ss [positive_def, measure_def, measurable_sets_def] THEN
9285      `{} IN measurable_sets M` by METIS_TAC [measure_space_def, sigma_algebra_alt_pow] THEN
9286       ASM_SIMP_TAC std_ss [] THEN CONJ_TAC THENL
9287       [SIMP_TAC std_ss [indicator_fn_def, NOT_IN_EMPTY, mul_rzero] THEN
9288        METIS_TAC [pos_fn_integral_zero, measure_space_def], ALL_TAC] THEN
9289       RW_TAC std_ss [] THEN MATCH_MP_TAC pos_fn_integral_pos THEN
9290       REWRITE_TAC [INDICATOR_FN_MUL_INTER] THEN ASM_SIMP_TAC std_ss [measure_space_def] THEN
9291       SIMP_TAC std_ss [indicator_fn_def] THEN GEN_TAC THEN COND_CASES_TAC THEN
9292       SIMP_TAC real_ss [le_refl, extreal_of_num_def, extreal_le_def]) THEN
9293   (* countably_additive *)
9294   SIMP_TAC std_ss [countably_additive_alt_eq, INDICATOR_FN_MUL_INTER] THEN
9295   REPEAT STRIP_TAC THEN SIMP_TAC std_ss [o_DEF] THEN
9296   `!x. A x IN measurable_sets M` by ASM_SET_TAC [] THEN
9297   ASM_SIMP_TAC std_ss [INTER_BIGUNION, GSPECIFICATION, IN_UNIV] THEN
9298   REWRITE_TAC [SET_RULE ``{Q i INTER x | ?i'. x = A i'} = {Q i INTER A i' | i' IN UNIV}``] THEN
9299   SIMP_TAC std_ss [GSYM IMAGE_DEF] THEN
9300   Suff `!x. indicator_fn (BIGUNION (IMAGE (\i'. Q i INTER A i') univ(:num))) x =
9301           suminf (\j. indicator_fn ((\i'. Q i INTER A i') j) x)` THENL
9302   [DISCH_TAC THEN ASM_SIMP_TAC std_ss [],
9303    GEN_TAC THEN ONCE_REWRITE_TAC [EQ_SYM_EQ] THEN MATCH_MP_TAC indicator_fn_suminf THEN
9304    FULL_SIMP_TAC std_ss [disjoint_family_on, DISJOINT_DEF] THEN
9305    ASM_SET_TAC []] THEN ONCE_REWRITE_TAC [METIS [ETA_AX]
9306     ``(\x'. indicator_fn (Q i INTER A x) x') = (\x. indicator_fn (Q i INTER A x)) x``] THEN
9307   ONCE_REWRITE_TAC [METIS [] ``suminf (\j. indicator_fn (Q i INTER A j) x) =
9308                           suminf (\j. (\k. indicator_fn (Q i INTER A k)) j x)``] THEN
9309   MATCH_MP_TAC pos_fn_integral_suminf THEN ASM_SIMP_TAC std_ss [measure_space_def] THEN
9310   CONJ_TAC THENL
9311   [SIMP_TAC std_ss [indicator_fn_def] THEN REPEAT GEN_TAC THEN COND_CASES_TAC THEN
9312    SIMP_TAC real_ss [le_refl, extreal_of_num_def, extreal_le_def], ALL_TAC] THEN
9313   GEN_TAC THEN MATCH_MP_TAC IN_MEASURABLE_BOREL_INDICATOR THEN
9314   Q.EXISTS_TAC `Q i INTER A i'` THEN ASM_SIMP_TAC std_ss [] THEN
9315   MATCH_MP_TAC ALGEBRA_INTER THEN
9316   FULL_SIMP_TAC std_ss [sigma_algebra_def, subsets_def] THEN
9317   METIS_TAC [] ) THEN DISCH_TAC THEN
9318  Suff `?f. (!i. f i IN measurable (m_space (MM i), measurable_sets (MM i)) Borel) /\
9319            (!i x. 0 <= f i x) /\ !i A. A IN measurable_sets (MM i) ==>
9320            (pos_fn_integral (MM i) (\x. (f i) x * indicator_fn A x) = measure (NN i) A)` THENL
9321  [STRIP_TAC, METIS_TAC []] THEN
9322  Q.ABBREV_TAC
9323     `ff = (\x. suminf (\i. f i x * indicator_fn (Q i) x) + PosInf * indicator_fn (Q0) x)` THEN
9324  Know `ff IN measurable (m_space M,measurable_sets M) Borel` >-
9325  (Know `ff = (\x. if x IN Q0 then (\x. PosInf) x
9326                   else (\x. suminf (\i. f i x * indicator_fn (Q i) x)) x)` >-
9327   (Q.UNABBREV_TAC `ff` THEN SIMP_TAC std_ss [FUN_EQ_THM] THEN GEN_TAC THEN
9328    COND_CASES_TAC THENL
9329    [POP_ASSUM (fn th => SIMP_TAC std_ss [indicator_fn_def, th, mul_rone]) THEN
9330     Suff `!x. 0 <= x ==> (x + PosInf = PosInf)`
9331     >- (DISCH_THEN (MATCH_MP_TAC) THEN
9332         Know `!n. 0 <= (\i. f i x * if x IN Q i then 1 else 0) n`
9333         >- (RW_TAC std_ss [mul_rone, mul_rzero, le_refl]) THEN
9334         DISCH_THEN (REWRITE_TAC o wrap o (MATCH_MP ext_suminf_def)) THEN
9335         SIMP_TAC std_ss [le_sup'] THEN
9336         GEN_TAC THEN DISCH_THEN (MATCH_MP_TAC) THEN
9337         SIMP_TAC std_ss [GSPECIFICATION, IN_IMAGE, IN_UNIV] THEN Q.EXISTS_TAC `0` THEN
9338         SIMP_TAC std_ss [count_def, GSPEC_F, EXTREAL_SUM_IMAGE_EMPTY]) THEN
9339     GEN_TAC THEN DISCH_TAC THEN
9340     `x <> NegInf` by METIS_TAC [lt_infty, lte_trans, num_not_infty] THEN
9341     ASM_CASES_TAC ``x = PosInf`` THENL [METIS_TAC [extreal_add_def], ALL_TAC] THEN
9342     METIS_TAC [extreal_cases, extreal_add_def], ALL_TAC] THEN
9343    POP_ASSUM (fn th => SIMP_TAC std_ss [indicator_fn_def, th, mul_rzero]) THEN
9344    SIMP_TAC std_ss [add_rzero]) THEN DISCH_TAC THEN
9345   ONCE_REWRITE_TAC [METIS [SPACE, m_space_def, measurable_sets_def]
9346    ``Borel = (m_space (space Borel, subsets Borel, (\x. 0)),
9347       measurable_sets (space Borel, subsets Borel, (\x. 0)))``] THEN
9348   FIRST_X_ASSUM (ASSUME_TAC o ONCE_REWRITE_RULE [SPECIFICATION]) THEN
9349   POP_ASSUM (fn th => ONCE_REWRITE_TAC [th]) THEN
9350   ONCE_REWRITE_TAC [METIS [] ``PosInf = (\x. PosInf) x``] THEN
9351   MATCH_MP_TAC MEASURABLE_IF >> rpt STRIP_TAC >| (* 5 subgoals *)
9352   [(* goal 1 (of 5) *)
9353    SIMP_TAC std_ss [SPACE, m_space_def, measurable_sets_def] THEN
9354    MATCH_MP_TAC IN_MEASURABLE_BOREL_CONST THEN Q.EXISTS_TAC `PosInf` THEN
9355    METIS_TAC [measure_space_def],
9356    (* goal 2 (of 5) *)
9357    ALL_TAC,
9358    (* goal 3 (of 5) *)
9359    ONCE_REWRITE_TAC [prove (``{x | x IN m_space M /\ Q0 x} = {x | x IN m_space M /\ x IN Q0}``,
9360     SIMP_TAC std_ss [SPECIFICATION])] THEN SIMP_TAC std_ss [GSYM INTER_DEF] THEN
9361    ONCE_REWRITE_TAC [METIS [subsets_def]
9362     ``measurable_sets M = subsets (m_space M, measurable_sets M)``] THEN
9363    MATCH_MP_TAC ALGEBRA_INTER THEN SIMP_TAC std_ss [subsets_def] THEN
9364    CONJ_TAC THENL [METIS_TAC [measure_space_def, sigma_algebra_def], ALL_TAC] THEN
9365    METIS_TAC [MEASURE_SPACE_MSPACE_MEASURABLE],
9366    (* goal 4 (of 5) *)
9367    ASM_REWRITE_TAC [],
9368    (* goal 5 (of 5) *)
9369    rw [SIGMA_ALGEBRA_BOREL] ] THEN
9370   Know `!x. suminf (\i. f i x * indicator_fn (Q i) x) =
9371             sup (IMAGE (\n. SIGMA (\i. f i x * indicator_fn (Q i) x)
9372                             (count n)) univ(:num))`
9373   >- (GEN_TAC >> MATCH_MP_TAC ext_suminf_def \\
9374       GEN_TAC >> BETA_TAC \\
9375       MATCH_MP_TAC le_mul >> art [INDICATOR_FN_POS]) >> Rewr' THEN
9376   SIMP_TAC std_ss [SPACE, m_space_def, measurable_sets_def] THEN
9377   Suff `!x. (\n. SIGMA (\i. f i x * indicator_fn (Q i) x) (count n)) =
9378                       (\n. (\n x. SIGMA (\i. f i x * indicator_fn (Q i) x) (count n)) n x)` THENL
9379   [DISC_RW_KILL, METIS_TAC []] THEN MATCH_MP_TAC IN_MEASURABLE_BOREL_MONO_SUP THEN
9380   Q.EXISTS_TAC `(\n x. SIGMA (\i. f i x * indicator_fn (Q i) x) (count n))` THEN
9381   SIMP_TAC std_ss [space_def] THEN
9382   CONJ_TAC >- METIS_TAC [measure_space_def] THEN
9383   reverse CONJ_TAC
9384   >- (rpt STRIP_TAC THEN MATCH_MP_TAC EXTREAL_SUM_IMAGE_MONO_SET THEN
9385       SIMP_TAC std_ss [FINITE_COUNT, count_def] THEN
9386       SIMP_TAC arith_ss [SUBSET_DEF, GSPECIFICATION] THEN
9387       rpt STRIP_TAC THEN MATCH_MP_TAC le_mul THEN art [INDICATOR_FN_POS]) THEN
9388   GEN_TAC THEN
9389   MP_TAC (ISPECL [``(m_space (M:('a->bool)#(('a->bool)->bool)#(('a->bool)->extreal)),
9390                      measurable_sets M)``,
9391                   ``(\i x. (f:num->'a->extreal) i x * indicator_fn (Q i) x)``,
9392                   ``(\x. SIGMA (\i. (f:num->'a->extreal) i x * indicator_fn (Q i) x) (count n))``,
9393                   ``count n``] IN_MEASURABLE_BOREL_SUM) THEN
9394   ASM_REWRITE_TAC [] THEN DISCH_THEN (MATCH_MP_TAC) THEN
9395   SIMP_TAC std_ss [FINITE_COUNT, space_def] THEN
9396   CONJ_TAC >- METIS_TAC [measure_space_def] THEN
9397   reverse CONJ_TAC
9398   >- (rpt GEN_TAC >> STRIP_TAC THEN MATCH_MP_TAC pos_not_neginf THEN
9399       MATCH_MP_TAC le_mul THEN art [INDICATOR_FN_POS]) THEN
9400   GEN_TAC THEN STRIP_TAC THEN MATCH_MP_TAC IN_MEASURABLE_BOREL_MUL_INDICATOR THEN
9401   METIS_TAC [subsets_def, measure_space_def, m_space_def, measurable_sets_def] ) THEN
9402  DISCH_TAC THEN
9403  Know `!x. 0 <= ff x` THEN1
9404  (Q.UNABBREV_TAC `ff` >> BETA_TAC THEN GEN_TAC THEN
9405   ASM_CASES_TAC ``(x:'a) IN Q0`` THENL
9406   [POP_ASSUM (fn th => SIMP_TAC std_ss [indicator_fn_def, th, mul_rone]) THEN
9407    Suff `suminf (\i. f i x * if x IN Q i then 1 else 0) + PosInf = PosInf` THENL
9408    [METIS_TAC [le_infty], ALL_TAC] THEN
9409    Suff `!x. 0 <= x ==> (x + PosInf = PosInf)` THENL
9410    [DISCH_THEN (MATCH_MP_TAC) THEN
9411     Know `!n. 0 <= (\i. f i x * if x IN Q i then 1 else 0) n`
9412     >- (RW_TAC std_ss [mul_rone, mul_rzero, le_refl]) THEN
9413     DISCH_THEN (REWRITE_TAC o wrap o (MATCH_MP ext_suminf_def)) THEN
9414     SIMP_TAC std_ss [le_sup'] THEN
9415     GEN_TAC THEN DISCH_THEN (MATCH_MP_TAC) THEN
9416     SIMP_TAC std_ss [GSPECIFICATION, IN_IMAGE, IN_UNIV] THEN Q.EXISTS_TAC `0` THEN
9417     SIMP_TAC std_ss [count_def, GSPEC_F, EXTREAL_SUM_IMAGE_EMPTY],
9418     ALL_TAC] THEN
9419    GEN_TAC THEN DISCH_TAC THEN
9420    `x <> NegInf` by METIS_TAC [lt_infty, lte_trans, num_not_infty] THEN
9421    ASM_CASES_TAC ``x = PosInf`` THENL [METIS_TAC [extreal_add_def], ALL_TAC] THEN
9422    METIS_TAC [extreal_cases, extreal_add_def], ALL_TAC] THEN
9423   POP_ASSUM (fn th => SIMP_TAC std_ss [indicator_fn_def, th, mul_rzero]) THEN
9424   SIMP_TAC std_ss [add_rzero] THEN
9425   MATCH_MP_TAC ext_suminf_pos THEN
9426   RW_TAC std_ss [mul_rone, mul_rzero, le_refl]) THEN DISCH_TAC THEN
9427  Q.EXISTS_TAC `ff` THEN ASM_SIMP_TAC std_ss [] THEN
9428  GEN_TAC THEN DISCH_TAC THEN
9429  ASM_CASES_TAC ``m_space M = {}`` THENL
9430  [`m_space M = m_space N` by METIS_TAC [sets_eq_imp_space_eq] THEN
9431   `A SUBSET m_space M` by METIS_TAC [MEASURE_SPACE_SUBSET_MSPACE] THEN
9432   `positive N` by METIS_TAC [MEASURE_SPACE_POSITIVE] THEN
9433   `A = {}` by ASM_SET_TAC [] THEN FULL_SIMP_TAC std_ss [positive_def] THEN
9434   SIMP_TAC std_ss [indicator_fn_def, NOT_IN_EMPTY, mul_rzero] THEN
9435   METIS_TAC [pos_fn_integral_zero],
9436   ALL_TAC] THEN
9437  Suff `(!i. (\x. f i x * indicator_fn (Q i INTER A) x) IN
9438                     measurable (m_space M, measurable_sets M) Borel) /\
9439                  (!i. ?x. x IN m_space M /\ 0 <= f i x * indicator_fn (Q i INTER A) x)` THENL
9440  [STRIP_TAC,
9441   CONJ_TAC THENL
9442   [ALL_TAC,
9443    GEN_TAC THEN FULL_SIMP_TAC std_ss [GSYM MEMBER_NOT_EMPTY] THEN
9444    Q.EXISTS_TAC `x` THEN ASM_SIMP_TAC std_ss [] THEN
9445    MATCH_MP_TAC le_mul THEN ASM_SIMP_TAC std_ss [indicator_fn_def] THEN
9446    COND_CASES_TAC THEN SIMP_TAC real_ss [le_refl, extreal_of_num_def, extreal_le_def]] THEN
9447   GEN_TAC THEN MATCH_MP_TAC IN_MEASURABLE_BOREL_MUL_INDICATOR THEN
9448   CONJ_TAC THENL [METIS_TAC [measure_space_def], ALL_TAC] THEN
9449   CONJ_TAC THENL [METIS_TAC [m_space_def, measurable_sets_def], ALL_TAC] THEN
9450   MATCH_MP_TAC ALGEBRA_INTER THEN CONJ_TAC THENL
9451   [ALL_TAC, METIS_TAC [subsets_def]] THEN
9452   METIS_TAC [measure_space_def, sigma_algebra_def]] THEN
9453  Know `pos_fn_integral M (\x. ff x * indicator_fn A x) =
9454        pos_fn_integral M (\x. suminf (\i. f i x * indicator_fn (Q i INTER A) x) +
9455        PosInf * indicator_fn (Q0 INTER A) x)` THEN1
9456  (Q.UNABBREV_TAC `ff` >> BETA_TAC THEN
9457   Know `!x. 0 <= suminf (\i. f i x * indicator_fn (Q i) x)`
9458   >- (GEN_TAC >> MATCH_MP_TAC ext_suminf_pos THEN
9459       RW_TAC std_ss [] THEN
9460       MATCH_MP_TAC le_mul >> art [INDICATOR_FN_POS]) THEN DISCH_TAC THEN
9461   Know `!x. 0 <= PosInf * indicator_fn Q0 x`
9462   >- (GEN_TAC >> MATCH_MP_TAC le_mul THEN
9463       SIMP_TAC std_ss [le_infty, INDICATOR_FN_POS]) THEN DISCH_TAC THEN
9464
9465   `!x. (suminf (\i. f i x * indicator_fn (Q i) x) +
9466        PosInf * indicator_fn Q0 x) * indicator_fn A x =
9467        (suminf (\i. f i x * indicator_fn (Q i) x) * indicator_fn A x) +
9468        ((PosInf * indicator_fn Q0 x) * indicator_fn A x)` by METIS_TAC [add_rdistrib] THEN
9469   POP_ASSUM (fn th => REWRITE_TAC [th]) THEN REWRITE_TAC [GSYM mul_assoc] THEN
9470   ONCE_REWRITE_TAC [METIS [INDICATOR_FN_MUL_INTER]
9471    ``indicator_fn Q0 x * indicator_fn A x = indicator_fn (Q0 INTER A) x``] THEN
9472   Suff `!x. suminf (\i. f i x * indicator_fn (Q i) x) * indicator_fn A x =
9473                       suminf (\i. f i x * indicator_fn (Q i INTER A) x)` THENL
9474   [DISCH_TAC THEN ASM_SIMP_TAC std_ss [], ALL_TAC] THEN
9475   GEN_TAC THEN
9476   ONCE_REWRITE_TAC [METIS [INDICATOR_FN_MUL_INTER]
9477    ``indicator_fn (Q i INTER A) x = indicator_fn (Q i) x * indicator_fn A x``] THEN
9478   ASM_CASES_TAC ``(x:'a) IN A`` THEN
9479   ASM_SIMP_TAC std_ss [indicator_fn_def, mul_rone, mul_rzero] THEN
9480   SIMP_TAC std_ss [ext_suminf_0] ) THEN DISCH_TAC THEN
9481 (* stage work *)
9482  Know `pos_fn_integral M (\x. suminf (\i. f i x * indicator_fn (Q i INTER A) x) +
9483          PosInf * indicator_fn (Q0 INTER A) x) =
9484        pos_fn_integral M (\x. suminf (\i. f i x * indicator_fn (Q i INTER A) x)) +
9485          PosInf * measure M (Q0 INTER A)` >-
9486  ( Suff `pos_fn_integral M (\x. (\x. suminf (\i. f i x * indicator_fn (Q i INTER A) x)) x +
9487                            (\x. PosInf * indicator_fn (Q0 INTER A) x) x) =
9488          pos_fn_integral M (\x. suminf (\i. f i x * indicator_fn (Q i INTER A) x)) +
9489          pos_fn_integral M (\x. PosInf * indicator_fn (Q0 INTER A) x)`
9490    >- (SIMP_TAC std_ss [] THEN DISCH_TAC THEN
9491        MATCH_MP_TAC (METIS [] ``(b = c) ==> (a + b = a + c)``) THEN
9492        MATCH_MP_TAC pos_fn_integral_cmul_infty THEN
9493        CONJ_TAC >- METIS_TAC [] THEN
9494        ONCE_REWRITE_TAC [METIS [subsets_def]
9495          ``measurable_sets M = subsets (m_space M, measurable_sets M)``] THEN
9496        METIS_TAC [measure_space_def, sigma_algebra_def, ALGEBRA_INTER, subsets_def]) \\
9497    MATCH_MP_TAC pos_fn_integral_add THEN SIMP_TAC std_ss [] THEN
9498    CONJ_TAC THENL [ASM_REWRITE_TAC [], ALL_TAC] THEN
9499    Know `!x. 0 <= suminf (\i. f i x * indicator_fn (Q i INTER A) x)`
9500    >- (GEN_TAC THEN MATCH_MP_TAC ext_suminf_pos THEN
9501        GEN_TAC THEN BETA_TAC THEN
9502        MATCH_MP_TAC le_mul >> art [INDICATOR_FN_POS]) THEN DISCH_TAC THEN
9503    Know `!x. 0 <= PosInf * indicator_fn (Q0 INTER A) x`
9504    >- (GEN_TAC THEN MATCH_MP_TAC le_mul THEN
9505        SIMP_TAC std_ss [le_infty, INDICATOR_FN_POS]) THEN DISCH_TAC THEN
9506    CONJ_TAC THENL [METIS_TAC [], ALL_TAC] THEN
9507    CONJ_TAC >- (simp []) \\
9508    CONJ_TAC THENL
9509    [Know `!x. suminf (\i. f i x * indicator_fn (Q i INTER A) x) =
9510               sup (IMAGE (\n. SIGMA (\i. f i x * indicator_fn (Q i INTER A) x)
9511                          (count n)) univ(:num))`
9512     >- (GEN_TAC >> MATCH_MP_TAC ext_suminf_def \\
9513         GEN_TAC >> BETA_TAC >> MATCH_MP_TAC le_mul >> art [INDICATOR_FN_POS]) THEN
9514     Rewr' >> SIMP_TAC std_ss [] THEN
9515     Suff `!x. (\n. SIGMA (\i. f i x * indicator_fn (Q i INTER A) x) (count n)) =
9516               (\n. (\n x. SIGMA (\i. f i x * indicator_fn (Q i INTER A) x) (count n)) n x)` THENL
9517     [DISC_RW_KILL, METIS_TAC []] THEN MATCH_MP_TAC IN_MEASURABLE_BOREL_MONO_SUP THEN
9518     Q.EXISTS_TAC `(\n x. SIGMA (\i. f i x * indicator_fn (Q i INTER A) x) (count n))` THEN
9519     SIMP_TAC std_ss [] THEN
9520     CONJ_TAC >- METIS_TAC [measure_space_def] THEN
9521     reverse CONJ_TAC
9522     >- (rpt STRIP_TAC THEN MATCH_MP_TAC EXTREAL_SUM_IMAGE_MONO_SET THEN
9523         SIMP_TAC std_ss [FINITE_COUNT] THEN
9524         CONJ_TAC >- (MATCH_MP_TAC COUNT_MONO >> RW_TAC arith_ss []) THEN
9525         SIMP_TAC arith_ss [IN_COUNT, SUBSET_DEF, GSPECIFICATION] THEN
9526         GEN_TAC THEN DISCH_TAC THEN
9527         MATCH_MP_TAC le_mul THEN ASM_SIMP_TAC std_ss [INDICATOR_FN_POS]) THEN
9528     GEN_TAC THEN
9529     MP_TAC (ISPECL [``(m_space (M:('a->bool)#(('a->bool)->bool)#(('a->bool)->extreal)),
9530                        measurable_sets M)``,
9531                     ``(\i x.  (f:num->'a->extreal) i x * indicator_fn (Q i INTER A) x)``,
9532                     ``(\x. SIGMA (\i. (f:num->'a->extreal) i x * indicator_fn (Q i INTER A) x) (count n))``,
9533                     ``count n``] IN_MEASURABLE_BOREL_SUM) THEN
9534     ASM_REWRITE_TAC [] THEN DISCH_THEN (MATCH_MP_TAC) THEN
9535     SIMP_TAC std_ss [FINITE_COUNT] THEN CONJ_TAC THENL [METIS_TAC [measure_space_def], ALL_TAC] THEN
9536     reverse CONJ_TAC
9537     >- (rpt GEN_TAC THEN STRIP_TAC THEN
9538         MATCH_MP_TAC pos_not_neginf THEN
9539         MATCH_MP_TAC le_mul THEN ASM_SIMP_TAC std_ss [INDICATOR_FN_POS]) THEN
9540     GEN_TAC THEN STRIP_TAC THEN MATCH_MP_TAC IN_MEASURABLE_BOREL_MUL_INDICATOR THEN
9541     METIS_TAC [subsets_def, measure_space_def, m_space_def, measurable_sets_def,
9542                ALGEBRA_INTER, sigma_algebra_def], ALL_TAC] THEN
9543    ONCE_REWRITE_TAC [METIS [] ``(\x. PosInf * indicator_fn (Q0 INTER A) x) =
9544                                 (\x. (\x. PosInf) x * indicator_fn (Q0 INTER A) x)``] THEN
9545    MATCH_MP_TAC IN_MEASURABLE_BOREL_MUL_INDICATOR THEN
9546    CONJ_TAC THENL [METIS_TAC [measure_space_def], ALL_TAC] THEN
9547    CONJ_TAC THENL
9548    [MATCH_MP_TAC IN_MEASURABLE_BOREL_CONST THEN Q.EXISTS_TAC `PosInf` THEN
9549     METIS_TAC [measure_space_def], ALL_TAC] THEN
9550    METIS_TAC [ALGEBRA_INTER, measure_space_def, sigma_algebra_def, subsets_def] ) THEN
9551  DISCH_TAC THEN
9552  Know `!A i. A IN measurable_sets M ==>
9553             (pos_fn_integral M (\x. f i x * indicator_fn (Q i INTER A) x) =
9554              measure (m_space (MM i), measurable_sets (MM i),
9555               (\A. pos_fn_integral (MM i) (\x. f i x * indicator_fn A x))) A)` >-
9556  (rpt GEN_TAC THEN SIMP_TAC std_ss [measure_def] THEN
9557   DISCH_TAC THEN
9558   Know `pos_fn_integral (MM i) (\x. f i x * indicator_fn A' x) =
9559         pos_fn_integral M (\x. indicator_fn (Q i) x * (\x. f i x * indicator_fn A' x) x)` >-
9560   (Q.UNABBREV_TAC `MM` THEN BETA_TAC THEN
9561    ONCE_REWRITE_TAC [METIS [] ``(\x. indicator_fn (Q i) x * (f i x * indicator_fn A' x)) =
9562                             (\x. indicator_fn (Q i) x * (\x. f i x * indicator_fn A' x) x)``] THEN
9563    Suff `pos_fn_integral
9564           (m_space M,measurable_sets M,
9565            (\A. pos_fn_integral M (\x. max 0 (indicator_fn (Q i) x * indicator_fn A x))))
9566           (\x. max 0 ((\x. f i x * indicator_fn A' x) x)) =
9567          pos_fn_integral M
9568           (\x. max 0 (indicator_fn (Q i) x * (\x. f i x * indicator_fn A' x) x))` THENL
9569    [ASM_SIMP_TAC std_ss [extreal_max_def, indicator_fn_pos_le, le_mul], ALL_TAC] THEN
9570    MATCH_MP_TAC pos_fn_integral_density' THEN ASM_SIMP_TAC std_ss [] THEN
9571    CONJ_TAC
9572    >- (MATCH_MP_TAC IN_MEASURABLE_BOREL_INDICATOR THEN Q.EXISTS_TAC `Q i` THEN
9573        ASM_SIMP_TAC std_ss [] THEN METIS_TAC [measure_space_def, subsets_def]) THEN
9574    CONJ_TAC
9575    >- (MATCH_MP_TAC IN_MEASURABLE_BOREL_MUL_INDICATOR THEN
9576        METIS_TAC [measure_space_def, subsets_def, m_space_def, measurable_sets_def]) THEN
9577    CONJ_TAC (* AE *)
9578    >- (SIMP_TAC std_ss [AE_ALT, GSPECIFICATION, null_set_def] THEN
9579        SIMP_TAC std_ss [SUBSET_DEF, GSPECIFICATION] THEN Q.EXISTS_TAC `{}` THEN
9580        FULL_SIMP_TAC std_ss [measure_space_def, sigma_algebra_alt_pow] THEN
9581        FULL_SIMP_TAC std_ss [positive_def, NOT_IN_EMPTY] THEN
9582        GEN_TAC THEN DISJ2_TAC THEN
9583        SIMP_TAC std_ss [indicator_fn_def] THEN COND_CASES_TAC THEN
9584        SIMP_TAC real_ss [le_refl, extreal_of_num_def, extreal_le_def]) THEN
9585    GEN_TAC THEN MATCH_MP_TAC le_mul THEN ASM_SIMP_TAC std_ss [INDICATOR_FN_POS]) THEN
9586   DISC_RW_KILL THEN SIMP_TAC std_ss [mul_assoc] THEN
9587   ONCE_REWRITE_TAC [mul_comm] THEN SIMP_TAC std_ss [mul_assoc] THEN
9588   ONCE_REWRITE_TAC [METIS [INDICATOR_FN_MUL_INTER]
9589    ``indicator_fn A' x * indicator_fn (Q i) x = indicator_fn (A' INTER Q i) x``] THEN
9590   METIS_TAC [INTER_COMM]) THEN
9591  DISCH_TAC THEN
9592  Know `!i. measure (m_space (MM i),measurable_sets (MM i),
9593                     (\A. pos_fn_integral (MM i) (\x. f i x * indicator_fn A x))) A =
9594            measure N (Q i INTER A)`
9595  >- (GEN_TAC THEN
9596      Know `measure N (Q i INTER A) =
9597            measure (m_space N,measurable_sets N,
9598                     (\s. pos_fn_integral N (\x. indicator_fn (Q i) x * indicator_fn s x))) A`
9599      >- (MATCH_MP_TAC (GSYM measure_restricted) THEN METIS_TAC []) THEN
9600      DISC_RW_KILL THEN SIMP_TAC std_ss [measure_def] THEN
9601     `measurable_sets (MM i) = measurable_sets (N)` by METIS_TAC [measurable_sets_def] THEN
9602      Know `pos_fn_integral (MM i) (\x. f i x * indicator_fn A x) = measure (NN i) A`
9603      >- (FIRST_X_ASSUM MATCH_MP_TAC >> PROVE_TAC []) >> Rewr' THEN
9604      Q.UNABBREV_TAC `NN` THEN SIMP_TAC std_ss [measure_def] ) THEN DISCH_TAC THEN
9605 `!i. measure N (Q i INTER A) =
9606      pos_fn_integral M (\x. f i x * indicator_fn (Q i INTER A) x)` by METIS_TAC [] THEN
9607  Know `pos_fn_integral M (\x. suminf (\i. f i x * indicator_fn (Q i INTER A) x)) +
9608        PosInf * measure M (Q0 INTER A) =
9609        suminf (\i. measure N (Q i INTER A)) + PosInf * measure M (Q0 INTER A)`
9610  >- (MATCH_MP_TAC (METIS [] ``(b = c) ==> (b + a = c + a)``) THEN
9611      Know `pos_fn_integral M (\x. suminf (\i. (\i x. f i x * indicator_fn (Q i INTER A) x) i x)) =
9612            suminf (\i. pos_fn_integral M ((\i x. f i x * indicator_fn (Q i INTER A) x) i))`
9613      >- (MATCH_MP_TAC pos_fn_integral_suminf >> ASM_SIMP_TAC std_ss [] \\
9614          rpt STRIP_TAC >> MATCH_MP_TAC le_mul \\
9615          ASM_SIMP_TAC std_ss [INDICATOR_FN_POS]) \\
9616      SIMP_TAC std_ss [] THEN DISC_RW_KILL THEN REWRITE_TAC [] ) >> DISCH_TAC THEN
9617  Suff `suminf (\i. measure N (Q i INTER A)) =
9618       measure N (BIGUNION {Q i | i IN UNIV} INTER A)` THENL
9619  [DISCH_TAC,
9620   SIMP_TAC std_ss [INTER_BIGUNION, GSPECIFICATION, IN_UNIV] THEN
9621   ONCE_REWRITE_TAC [SET_RULE ``BIGUNION {x INTER A | ?i. x = Q i} =
9622                                BIGUNION {Q i INTER A | i IN UNIV}``] THEN
9623   ONCE_REWRITE_TAC [EQ_SYM_EQ] THEN
9624   `countably_additive N` by METIS_TAC [measure_space_def] THEN
9625   POP_ASSUM MP_TAC THEN SIMP_TAC std_ss [countably_additive_def] THEN
9626   SIMP_TAC std_ss [GSYM IMAGE_DEF] THEN
9627   DISCH_THEN (MP_TAC o Q.SPEC `(\i. Q i INTER A)`) THEN
9628   SIMP_TAC std_ss [o_DEF] THEN DISCH_THEN (MATCH_MP_TAC) THEN
9629   CONJ_TAC THENL
9630   [EVAL_TAC THEN ASM_SIMP_TAC std_ss [IN_DEF,IN_FUNSET] THEN SRW_TAC[][] THEN
9631     ONCE_REWRITE_TAC [GSYM SPECIFICATION] THEN
9632    METIS_TAC [ALGEBRA_INTER, subsets_def, measure_space_def, sigma_algebra_def],
9633    ALL_TAC] THEN
9634   CONJ_TAC THENL
9635   [ASM_SET_TAC [DISJOINT_DEF, disjoint_family_on], ALL_TAC] THEN
9636   ONCE_REWRITE_TAC [METIS [subsets_def] ``measurbale_sets M =
9637                       subsets (m_space M, measurbale_sets M)``] THEN
9638   MATCH_MP_TAC SIGMA_ALGEBRA_COUNTABLE_UNION THEN
9639   CONJ_TAC THENL [METIS_TAC [measure_space_def], ALL_TAC] THEN
9640   CONJ_TAC THENL
9641   [MATCH_MP_TAC image_countable THEN
9642    SIMP_TAC std_ss [pred_setTheory.COUNTABLE_NUM], ALL_TAC] THEN
9643   ASM_SIMP_TAC std_ss [SUBSET_DEF, IN_IMAGE] THEN GEN_TAC THEN
9644   METIS_TAC [ALGEBRA_INTER, measure_space_def, sigma_algebra_def, subsets_def]] THEN
9645  Know `PosInf * measure M (Q0 INTER A) = measure N (Q0 INTER A)` >-
9646  (UNDISCH_TAC ``!A.
9647        A IN measurable_sets M /\ A SUBSET Q0 ==>
9648        (measure M A = 0) /\ (measure N A = 0) \/
9649        0 < measure M A /\ (measure N A = PosInf)`` THEN
9650   DISCH_THEN (MP_TAC o Q.SPEC `Q0 INTER A`) THEN
9651   `Q0 INTER A SUBSET Q0` by SET_TAC [] THEN
9652   `Q0 INTER A IN measurable_sets M` by
9653    METIS_TAC [ALGEBRA_INTER, subsets_def, measure_space_def, sigma_algebra_def] THEN
9654   POP_ASSUM (fn th => REWRITE_TAC [th]) THEN POP_ASSUM (fn th => REWRITE_TAC [th]) THEN
9655   STRIP_TAC THEN ASM_SIMP_TAC std_ss [mul_rzero] THEN
9656   Suff `(m_space M DIFF BIGUNION {Q i | i IN univ(:num)}) INTER A
9657     IN measurable_sets M` THENL
9658   [DISCH_TAC,
9659    ONCE_REWRITE_TAC [METIS [subsets_def]
9660     ``measurable_sets M = subsets (m_space M, measurable_sets M)``] THEN
9661    MATCH_MP_TAC ALGEBRA_INTER THEN
9662    CONJ_TAC THENL [METIS_TAC [measure_space_def, sigma_algebra_def], ALL_TAC] THEN
9663    CONJ_TAC THENL [ALL_TAC, ASM_SIMP_TAC std_ss [subsets_def]] THEN
9664    MATCH_MP_TAC ALGEBRA_DIFF THEN
9665    CONJ_TAC THENL [METIS_TAC [measure_space_def, sigma_algebra_def], ALL_TAC] THEN
9666    CONJ_TAC THENL [METIS_TAC [subsets_def, MEASURE_SPACE_MSPACE_MEASURABLE], ALL_TAC] THEN
9667    MATCH_MP_TAC SIGMA_ALGEBRA_COUNTABLE_UNION THEN
9668    CONJ_TAC THENL [METIS_TAC [measure_space_def], ALL_TAC] THEN
9669    CONJ_TAC THENL
9670    [SIMP_TAC std_ss [GSYM IMAGE_DEF] THEN
9671     MATCH_MP_TAC image_countable THEN
9672     SIMP_TAC std_ss [pred_setTheory.COUNTABLE_NUM], ALL_TAC] THEN
9673    ASM_SIMP_TAC std_ss [SUBSET_DEF, GSPECIFICATION, IN_UNIV] THEN GEN_TAC THEN
9674    METIS_TAC [subsets_def]] THEN
9675   `!A. A IN measurable_sets M ==> 0 <= measure M A`
9676     by METIS_TAC [measure_space_def, positive_def] THEN
9677   POP_ASSUM (MP_TAC o Q.SPEC `(m_space M DIFF BIGUNION {Q i | i IN univ(:num)}) INTER A`) THEN
9678   ASM_REWRITE_TAC [] THEN DISCH_TAC THEN
9679   Suff `0 < measure M ((m_space M DIFF BIGUNION {Q i | i IN univ(:num)}) INTER A)` THENL
9680   [DISCH_TAC,
9681    MATCH_MP_TAC lte_trans THEN Q.EXISTS_TAC `measure M (Q0 INTER A)` THEN
9682    ASM_SIMP_TAC std_ss [le_refl]] THEN
9683   `measure M ((m_space M DIFF BIGUNION {Q i | i IN univ(:num)}) INTER A) <> NegInf` by
9684     METIS_TAC [lte_trans, lt_infty, num_not_infty] THEN
9685   ASM_CASES_TAC ``measure M ((m_space M DIFF BIGUNION {Q i | i IN univ(:num)}) INTER A) = PosInf`` THENL
9686   [ASM_SIMP_TAC std_ss [extreal_mul_def], ALL_TAC] THEN
9687   `?r. measure M ((m_space M DIFF BIGUNION {Q i | i IN univ(:num)}) INTER A) = Normal r` by
9688     METIS_TAC [extreal_cases] THEN FULL_SIMP_TAC std_ss [] THEN
9689   SIMP_TAC std_ss [extreal_mul_def] THEN
9690   `0 < r` by METIS_TAC [extreal_lt_eq, extreal_of_num_def] THEN
9691   METIS_TAC [REAL_LT_IMP_NE] ) THEN DISCH_TAC THEN
9692  Suff `Q0 INTER A IN measurable_sets M /\
9693                  (BIGUNION {Q i | i IN UNIV} INTER A) IN measurable_sets M` THENL
9694  [DISCH_TAC,
9695   CONJ_TAC THENL
9696   [METIS_TAC [ALGEBRA_INTER, subsets_def, measure_space_def, sigma_algebra_def],
9697    ALL_TAC] THEN
9698   ONCE_REWRITE_TAC [METIS [subsets_def] ``measurbale_sets M =
9699                       subsets (m_space M, measurbale_sets M)``] THEN
9700   MATCH_MP_TAC ALGEBRA_INTER THEN CONJ_TAC THENL
9701   [METIS_TAC [measure_space_def, sigma_algebra_def], ALL_TAC] THEN
9702   CONJ_TAC THENL [ALL_TAC, METIS_TAC [subsets_def]] THEN
9703   MATCH_MP_TAC SIGMA_ALGEBRA_COUNTABLE_UNION THEN
9704   CONJ_TAC THENL [METIS_TAC [measure_space_def], ALL_TAC] THEN
9705   CONJ_TAC THENL
9706   [SIMP_TAC std_ss [GSYM IMAGE_DEF] THEN
9707    MATCH_MP_TAC image_countable THEN
9708    SIMP_TAC std_ss [pred_setTheory.COUNTABLE_NUM], ALL_TAC] THEN
9709   ASM_SIMP_TAC std_ss [SUBSET_DEF, GSPECIFICATION, IN_UNIV] THEN GEN_TAC THEN
9710   METIS_TAC [subsets_def]] THEN
9711  Suff `((BIGUNION {Q i | i IN UNIV} INTER A) UNION (Q0 INTER A) = A) /\
9712                  ((BIGUNION {Q i | i IN UNIV} INTER A) INTER (Q0 INTER A) = {})` THENL
9713  [DISCH_TAC,
9714   CONJ_TAC THENL [ALL_TAC, ASM_SET_TAC [disjoint_family_on]] THEN
9715   UNDISCH_TAC ``Q0 = m_space M DIFF BIGUNION {Q i | i IN univ(:num)}`` THEN
9716   UNDISCH_TAC ``disjoint_family (Q:num->'a->bool)`` THEN
9717   SIMP_TAC std_ss [disjoint_family_on, IN_UNIV] THEN
9718   FULL_SIMP_TAC std_ss [measure_space_def, sigma_algebra_alt_pow, POW_DEF] THEN
9719   ASM_SET_TAC []] THEN
9720  ONCE_REWRITE_TAC [EQ_SYM_EQ] THEN ASM_REWRITE_TAC [] THEN
9721  MATCH_MP_TAC ADDITIVE THEN
9722  CONJ_TAC THENL [METIS_TAC [MEASURE_SPACE_ADDITIVE], ALL_TAC] THEN
9723  CONJ_TAC THENL [METIS_TAC [], ALL_TAC] THEN
9724  CONJ_TAC THENL [METIS_TAC [], ALL_TAC] THEN ASM_SET_TAC [DISJOINT_DEF]
9725QED
9726
9727Theorem finite_integrable_function_exists : (* was: Ex_finite_integrable_function *)
9728    !m. measure_space m /\ sigma_finite m ==>
9729        ?h. h IN measurable (m_space m, measurable_sets m) Borel /\
9730           (pos_fn_integral m h <> PosInf) /\
9731           (!x. x IN m_space m ==> 0 < h x /\ h x < PosInf) /\
9732           (!x. 0 <= h x)
9733Proof
9734  GEN_TAC THEN DISCH_TAC THEN
9735  FIRST_ASSUM (ASSUME_TAC o MATCH_MP sigma_finite_disjoint) THEN
9736  FULL_SIMP_TAC std_ss [] THEN
9737  Q.ABBREV_TAC `B = (\i. 2 pow (SUC i) * measure m (A i))` THEN
9738  Q.ABBREV_TAC `inv' = \x. if (x = 0) then PosInf else inv x` THEN
9739  Know `!x. 0 < inv' x <=> x <> PosInf /\ 0 <= x` (* inv_pos_eq' *)
9740  >- (GEN_TAC \\
9741      Cases_on `x = 0`
9742      >- (Q.UNABBREV_TAC `inv'` \\
9743          ASM_SIMP_TAC std_ss [le_refl, num_not_infty, lt_infty]) \\
9744      Q.UNABBREV_TAC `inv'` >> ASM_SIMP_TAC std_ss [] \\
9745      POP_ASSUM (REWRITE_TAC o wrap o (MATCH_MP inv_pos_eq))) THEN
9746  DISCH_TAC THEN
9747  Know `!i:num. ?x. 0 < x /\ x < inv' (B i)` >-
9748  (GEN_TAC THEN Q.UNABBREV_TAC `B` THEN BETA_TAC THEN
9749   Suff `0 < inv' (2 pow SUC i * measure m (A i))`
9750   >- (DISCH_THEN (MP_TAC o MATCH_MP Q_DENSE_IN_R) THEN METIS_TAC []) THEN
9751   POP_ORW THEN
9752   `(2 pow SUC i <> NegInf) /\ (2 pow SUC i <> PosInf)`
9753    by METIS_TAC [pow_not_infty, num_not_infty] THEN
9754   KNOW_TAC ``measure m ((A:num->'a->bool) i) <> NegInf`` THENL
9755   [FULL_SIMP_TAC std_ss [measure_space_def, positive_def, lt_infty] THEN
9756    MATCH_MP_TAC lte_trans THEN Q.EXISTS_TAC `0` THEN
9757    SIMP_TAC std_ss [num_not_infty,  GSYM lt_infty] THEN
9758    FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_SET_TAC [],
9759    DISCH_TAC] THEN CONJ_TAC THENL
9760   [`?r. measure m (A i) = Normal r` by METIS_TAC [extreal_cases] THEN
9761    ASM_REWRITE_TAC [] THEN KNOW_TAC ``0:real <= r`` THENL
9762    [REWRITE_TAC [GSYM extreal_le_def] THEN
9763     FIRST_X_ASSUM (ASSUME_TAC o ONCE_REWRITE_RULE [EQ_SYM_EQ]) THEN
9764     ASM_SIMP_TAC std_ss [GSYM extreal_of_num_def] THEN
9765     FULL_SIMP_TAC std_ss [measure_space_def, positive_def] THEN
9766     FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_SET_TAC [], DISCH_TAC] THEN
9767    ONCE_REWRITE_TAC [mul_comm] THEN METIS_TAC [mul_not_infty],
9768    ALL_TAC] THEN
9769   `2 pow SUC i = Normal (real (2 pow SUC i))` by METIS_TAC [normal_real] THEN
9770   `measure m (A i) = Normal (real (measure m (A i)))` by METIS_TAC [normal_real] THEN
9771   MATCH_MP_TAC le_mul THEN CONJ_TAC THENL
9772   [ALL_TAC,
9773   FULL_SIMP_TAC std_ss [measure_space_def, positive_def] THEN
9774   FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_SET_TAC []] THEN
9775   MATCH_MP_TAC pow_pos_le THEN
9776   SIMP_TAC real_ss [extreal_le_def, extreal_of_num_def]) THEN DISCH_TAC THEN
9777  Know `?f. !x. 0 < f x /\ f x < inv' (2 pow SUC x * measure m (A x))`
9778  >- (METIS_TAC []) THEN STRIP_TAC THEN
9779  Know `!x. 0 <= f x` >- (ASM_SIMP_TAC std_ss [le_lt]) THEN DISCH_TAC THEN
9780  Q.ABBREV_TAC `h = (\x. suminf (\i. f i * indicator_fn (A i) x))` THEN
9781  Know `!i. A i IN measurable_sets m` >- ASM_SET_TAC [] THEN DISCH_TAC THEN
9782  Know `pos_fn_integral m h = suminf (\i. f i * measure m (A i))` >-
9783  (Q.UNABBREV_TAC `h` THEN
9784   Know `pos_fn_integral m (\x. suminf (\i. (\i x. f i * indicator_fn (A i) x) i x)) =
9785         suminf (\i. pos_fn_integral m ((\i x. f i * indicator_fn (A i) x) i))` >-
9786   (MATCH_MP_TAC pos_fn_integral_suminf THEN RW_TAC std_ss [] THENL
9787    [MATCH_MP_TAC le_mul THEN ASM_SIMP_TAC std_ss [indicator_fn_def] THEN
9788     COND_CASES_TAC THEN SIMP_TAC std_ss [le_refl] THEN
9789     SIMP_TAC real_ss [extreal_le_def, extreal_of_num_def], ALL_TAC] THEN
9790    ONCE_REWRITE_TAC [METIS [] ``(\x. f i * indicator_fn (A i) x) =
9791                         (\x. (\x. f i) x * indicator_fn (A i) x)``] THEN
9792    MATCH_MP_TAC IN_MEASURABLE_BOREL_MUL_INDICATOR THEN
9793    FULL_SIMP_TAC std_ss [measure_space_def, subsets_def] THEN
9794    MATCH_MP_TAC IN_MEASURABLE_BOREL_CONST THEN Q.EXISTS_TAC `f i` THEN
9795    ASM_SIMP_TAC std_ss [] ) THEN
9796   RW_TAC std_ss [] THEN POP_ASSUM K_TAC THEN AP_TERM_TAC THEN ABS_TAC THEN
9797   Suff `(f i <> NegInf) /\ (f i <> PosInf)` THENL
9798   [STRIP_TAC THEN `f i = Normal (real (f i))` by METIS_TAC [GSYM normal_real] THEN
9799    ONCE_ASM_REWRITE_TAC [] THEN MATCH_MP_TAC pos_fn_integral_cmul_indicator THEN
9800    POP_ASSUM K_TAC THEN ASM_SIMP_TAC std_ss [] THEN
9801    SIMP_TAC std_ss [GSYM extreal_le_def, GSYM extreal_of_num_def] THEN
9802    ASM_SIMP_TAC std_ss [normal_real], ALL_TAC] THEN
9803   CONJ_TAC THENL
9804   [SIMP_TAC std_ss [lt_infty] THEN MATCH_MP_TAC lte_trans THEN
9805    Q.EXISTS_TAC `0` THEN ASM_SIMP_TAC std_ss [num_not_infty, GSYM lt_infty],
9806    ALL_TAC] THEN SIMP_TAC std_ss [lt_infty] THEN
9807   Cases_on `measure m (A i) = 0`
9808   >- (POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
9809       POP_ASSUM (MP_TAC o Q.SPEC `i`) THEN
9810       qunabbrevl_tac [`inv'`, `B`] THEN RW_TAC std_ss [] THEN
9811       FULL_SIMP_TAC std_ss [mul_rzero]) THEN
9812   MATCH_MP_TAC lt_trans THEN
9813   Q.EXISTS_TAC `inv' (2 pow SUC i * measure m (A i))` THEN
9814   ASM_SIMP_TAC std_ss [] THEN
9815   `(2 pow SUC i <> NegInf) /\ (2 pow SUC i <> PosInf)`
9816       by METIS_TAC [pow_not_infty, num_not_infty] THEN
9817   Know `measure m ((A:num->'a->bool) i) <> NegInf`
9818   >- (IMP_RES_TAC MEASURE_SPACE_POSITIVE \\
9819       POP_ASSUM (MATCH_MP_TAC o (MATCH_MP positive_not_infty)) >> art []) THEN
9820   DISCH_TAC THEN
9821   `?r. 2 pow SUC i = Normal r` by METIS_TAC [extreal_cases] THEN
9822   `?a. measure m (A i) = Normal a` by METIS_TAC [extreal_cases] THEN
9823   qunabbrevl_tac [`inv'`, `B`] THEN BETA_TAC THEN
9824   ONCE_ASM_REWRITE_TAC [] THEN
9825   SIMP_TAC std_ss [extreal_mul_def, extreal_of_num_def, extreal_11] THEN
9826   `(0 :extreal) < 2 pow (SUC i)` by METIS_TAC [pow_pos_lt, lt_02] THEN
9827   `a <> 0` by METIS_TAC [extreal_of_num_def, extreal_11] THEN
9828   `0 < r` by METIS_TAC [extreal_of_num_def, extreal_lt_eq] THEN
9829   Know `r * a <> 0`
9830   >- (`r <> 0` by METIS_TAC [REAL_LT_LE] \\
9831       CCONTR_TAC >> METIS_TAC [REAL_ENTIRE]) THEN DISCH_TAC THEN
9832   ASM_SIMP_TAC std_ss [extreal_inv_eq, lt_infty] ) THEN DISCH_TAC THEN
9833  Know `suminf (\i. f i * measure m (A i)) <= suminf (\i. (1 / 2) pow SUC i)` >-
9834  (MATCH_MP_TAC ext_suminf_mono THEN RW_TAC std_ss [lt_infty]
9835   >- (MATCH_MP_TAC le_mul THEN
9836       FULL_SIMP_TAC std_ss [measure_space_def, positive_def]) THEN
9837   MATCH_MP_TAC le_trans THEN
9838   Q.EXISTS_TAC `inv' (2 pow SUC n * measure m (A n)) * measure m (A n)` THEN
9839   CONJ_TAC
9840   >- (Cases_on `measure m (A n) = 0`
9841       >- (ASM_SIMP_TAC std_ss [mul_rzero, le_refl]) THEN
9842       MATCH_MP_TAC le_rmul_imp THEN FULL_SIMP_TAC std_ss [measure_space_def, le_lt] THEN
9843       FULL_SIMP_TAC std_ss [positive_def, le_lt] THEN METIS_TAC []) THEN
9844   `(2 pow SUC n <> NegInf) /\ (2 pow SUC n <> PosInf)`
9845      by METIS_TAC [pow_not_infty, num_not_infty] THEN
9846   KNOW_TAC ``measure m ((A:num->'a->bool) n) <> NegInf`` THENL
9847   [FULL_SIMP_TAC std_ss [measure_space_def, positive_def, lt_infty] THEN
9848    MATCH_MP_TAC lte_trans THEN Q.EXISTS_TAC `0` THEN
9849    SIMP_TAC std_ss [num_not_infty,  GSYM lt_infty] THEN
9850    FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_SET_TAC [],
9851    DISCH_TAC] THEN
9852   Cases_on `measure m (A n) = 0`
9853   >- (ASM_SIMP_TAC std_ss [mul_rzero] THEN MATCH_MP_TAC pow_pos_le THEN
9854       SIMP_TAC std_ss [half_between]) THEN
9855   `?r. 2 pow SUC n = Normal r` by METIS_TAC [extreal_cases] THEN
9856   `?a. measure m (A n) = Normal a` by METIS_TAC [extreal_cases] THEN
9857   ONCE_ASM_REWRITE_TAC [] THEN SIMP_TAC std_ss [extreal_mul_def] THEN
9858   `(0 :extreal) < 2 pow (SUC n)` by METIS_TAC [pow_pos_lt, lt_02] THEN
9859   `a <> 0` by METIS_TAC [extreal_of_num_def, extreal_11] THEN
9860   `0 < r` by METIS_TAC [extreal_of_num_def, extreal_lt_eq] THEN
9861   Know `r * a <> 0`
9862   >- (`r <> 0` by METIS_TAC [REAL_LT_LE] \\
9863       CCONTR_TAC >> METIS_TAC [REAL_ENTIRE]) THEN DISCH_TAC THEN
9864   Q.UNABBREV_TAC `inv'` >> BETA_TAC THEN
9865   `Normal (r * a) <> 0` by METIS_TAC [extreal_of_num_def, extreal_11] THEN
9866   ASM_SIMP_TAC std_ss [extreal_inv_eq] THEN
9867   `r <> 0` by METIS_TAC [REAL_LT_LE] THEN
9868   ASM_SIMP_TAC std_ss [REAL_INV_MUL, GSYM extreal_mul_def] THEN
9869   Know `Normal (inv a) * Normal a = 1`
9870   >- (SIMP_TAC std_ss [extreal_mul_def] THEN
9871       GEN_REWR_TAC RAND_CONV [extreal_of_num_def] THEN
9872       SIMP_TAC std_ss [extreal_11] THEN ASM_SIMP_TAC std_ss [REAL_MUL_LINV]) THEN
9873   ONCE_REWRITE_TAC [GSYM mul_assoc] THEN Rewr' THEN
9874   RW_TAC std_ss [mul_rone] THEN
9875   ASM_SIMP_TAC std_ss [normal_inv_eq] THEN
9876   GEN_REWR_TAC LAND_CONV [GSYM mul_lone] THEN
9877   ASM_SIMP_TAC std_ss [GSYM extreal_div_def] THEN
9878   ASM_SIMP_TAC std_ss [GSYM le_ldiv] THEN
9879   Q.PAT_ASSUM `_ = Normal r` (ONCE_REWRITE_TAC o wrap o SYM) THEN
9880   ASM_SIMP_TAC std_ss [GSYM pow_mul] THEN
9881   MATCH_MP_TAC le_trans THEN Q.EXISTS_TAC `(1 / 2 * 2) pow 0` THEN
9882   CONJ_TAC >- (SIMP_TAC std_ss [pow_0, le_lt]) THEN
9883   MATCH_MP_TAC pow_le_mono THEN SIMP_TAC arith_ss [] THEN
9884   SIMP_TAC real_ss [extreal_le_def, extreal_of_num_def, extreal_div_eq,
9885                     extreal_mul_def, GSYM REAL_LE_LDIV_EQ] ) THEN
9886  RW_TAC std_ss [pow_half_ser'] THEN
9887 `pos_fn_integral m h <> PosInf`
9888    by METIS_TAC [lt_infty, num_not_infty, let_trans] THEN
9889  Know `!x. x IN m_space m ==> ?i. x IN A i`
9890  >- (RULE_ASSUM_TAC (ONCE_REWRITE_RULE [EQ_SYM_EQ]) THEN
9891      FULL_SIMP_TAC std_ss [IN_BIGUNION, IN_UNIV, GSPECIFICATION] THEN
9892      METIS_TAC []) THEN DISCH_TAC THEN
9893  Know `!x i. x IN A i ==> (h x = f i)`
9894  >- (RW_TAC std_ss [] \\
9895      Q.UNABBREV_TAC `h` >> BETA_TAC \\
9896      MATCH_MP_TAC ext_suminf_cmult_indicator \\
9897      ASM_SIMP_TAC std_ss []) THEN DISCH_TAC THEN
9898  Know `!x. x IN m_space m ==> 0 < h x /\ h x < PosInf`
9899  >- (RW_TAC std_ss []
9900      >- (FIRST_X_ASSUM (MP_TAC o Q.SPEC `x`) THEN
9901          FIRST_X_ASSUM (MP_TAC o Q.SPEC `x`) THEN ASM_REWRITE_TAC [] THEN
9902          STRIP_TAC THEN DISCH_THEN (MP_TAC o Q.SPEC `i`) THEN
9903          ASM_REWRITE_TAC [] THEN RW_TAC std_ss []) THEN
9904      FIRST_X_ASSUM (MP_TAC o Q.SPEC `x`) THEN
9905      FIRST_X_ASSUM (MP_TAC o Q.SPEC `x`) THEN ASM_REWRITE_TAC [] THEN
9906      STRIP_TAC THEN DISCH_THEN (MP_TAC o Q.SPEC `i`) THEN
9907      ASM_REWRITE_TAC [] THEN RW_TAC std_ss [] THEN
9908      UNDISCH_TAC ``!x. 0 < f x /\ f x < inv' (2 pow SUC x * measure m (A x))`` THEN
9909      DISCH_THEN (MP_TAC o Q.SPEC `i`) THEN
9910      Cases_on `measure m (A i) = 0`
9911      >- (POP_ORW THEN SIMP_TAC std_ss [mul_rzero] THEN
9912          Q.UNABBREV_TAC `inv'` THEN METIS_TAC []) THEN
9913      STRIP_TAC THEN MATCH_MP_TAC lte_trans THEN
9914      Q.EXISTS_TAC `inv' (2 pow SUC i * measure m (A i))` THEN
9915      ASM_REWRITE_TAC [le_infty]) THEN DISCH_TAC THEN
9916  Know `!x. 0 <= h x`
9917  >- (GEN_TAC >> Q.UNABBREV_TAC `h` >> BETA_TAC \\
9918      MATCH_MP_TAC ext_suminf_pos >> RW_TAC std_ss [] \\
9919      MATCH_MP_TAC le_mul >> art [INDICATOR_FN_POS]) THEN DISCH_TAC THEN
9920  Q.EXISTS_TAC `h` THEN ASM_SIMP_TAC std_ss [] THEN
9921 (* h IN Borel_measurable (m_space m,measurable_sets m) *)
9922  Q.UNABBREV_TAC `h` \\
9923  MATCH_MP_TAC IN_MEASURABLE_BOREL_SUMINF \\
9924  Q.EXISTS_TAC `\i x. f i * indicator_fn (A i) x` \\
9925  STRONG_CONJ_TAC >- PROVE_TAC [measure_space_def] >> DISCH_TAC \\
9926  RW_TAC std_ss [space_def] >| (* 2 subgoals *)
9927  [ (* goal 1 (of 2) *)
9928    MATCH_MP_TAC
9929     (BETA_RULE (Q.SPECL [`(m_space m,measurable_sets m)`, `\x. f n`, `A n`]
9930                 IN_MEASURABLE_BOREL_MUL_INDICATOR)) \\
9931    RW_TAC std_ss [subsets_def] \\
9932    MATCH_MP_TAC IN_MEASURABLE_BOREL_CONST' >> art [],
9933    (* goal 2 (of 2) *)
9934    MATCH_MP_TAC le_mul >> art [INDICATOR_FN_POS] ]
9935QED
9936
9937(* The most general version (M: sigma-finite, N: arbitrary). *)
9938Theorem Radon_Nikodym_sigma_finite :
9939    !M N. measure_space M /\ measure_space N /\
9940          measurable_sets M = measurable_sets N /\
9941          sigma_finite M /\ measure_absolutely_continuous (measure N) M ==>
9942      ?f. f IN measurable (m_space M,measurable_sets M) Borel /\ (!x. 0 <= f x) /\
9943          !A. A IN measurable_sets M ==>
9944             (pos_fn_integral M (\x. f x * indicator_fn A x) = measure N A)
9945Proof
9946    rpt STRIP_TAC
9947 >> `m_space M = m_space N` by METIS_TAC [sets_eq_imp_space_eq]
9948 >> ‘sigma_algebra (measurable_space M) /\ sigma_algebra (measurable_space N)’
9949      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA]
9950 >> Q.PAT_X_ASSUM `m_space M = m_space N` (ASSUME_TAC o SYM)
9951 >> Q.PAT_X_ASSUM `measurable_sets M = measurable_sets N` (ASSUME_TAC o SYM)
9952 >> ASM_REWRITE_TAC []
9953 >> `{PosInf} IN subsets Borel` by METIS_TAC [BOREL_MEASURABLE_INFINITY]
9954 >> `?h. h IN measurable (m_space M,measurable_sets M) Borel /\
9955         pos_fn_integral M h <> PosInf /\
9956         (!x. x IN m_space M ==> 0 < h x /\ h x < PosInf) /\ !x. 0 <= h x`
9957     by METIS_TAC [finite_integrable_function_exists]
9958 >> Q.ABBREV_TAC `t = \A. pos_fn_integral M (\x. h x * indicator_fn A x)`
9959 >> Q.ABBREV_TAC `mt = (m_space M, measurable_sets M,
9960                        (\A. pos_fn_integral M (\x. h x * indicator_fn A x)))`
9961 >> Know `measure mt (m_space mt) <> PosInf`
9962 >- (Q.UNABBREV_TAC `mt` THEN
9963     SIMP_TAC std_ss [measure_def, m_space_def] THEN
9964     ASM_SIMP_TAC std_ss [MEASURE_SPACE_MSPACE_MEASURABLE] THEN
9965     Suff `pos_fn_integral M (\x. h x * indicator_fn (m_space M) x) =
9966           pos_fn_integral M h` >- METIS_TAC [] THEN
9967     MATCH_MP_TAC (GSYM pos_fn_integral_mspace) THEN ASM_SIMP_TAC std_ss [])
9968 >> DISCH_TAC
9969 >> Know `measure_space mt`
9970 >- (Q.UNABBREV_TAC `mt` THEN
9971     FULL_SIMP_TAC std_ss [measure_space_def, m_space_def, measurable_sets_def] THEN
9972     CONJ_TAC (* positive *)
9973     >- (SIMP_TAC std_ss [positive_def, measure_def, measurable_sets_def] \\
9974         Q.UNABBREV_TAC `t` >> BETA_TAC \\
9975         CONJ_TAC
9976         >- (SIMP_TAC std_ss [indicator_fn_def, NOT_IN_EMPTY, mul_rzero] \\
9977             ASM_SIMP_TAC std_ss [pos_fn_integral_zero, measure_space_def]) \\
9978         rpt STRIP_TAC >> MATCH_MP_TAC pos_fn_integral_pos \\
9979         ASM_SIMP_TAC std_ss [measure_space_def] \\
9980         rpt STRIP_TAC >> MATCH_MP_TAC le_mul >> art [INDICATOR_FN_POS]) \\
9981     SIMP_TAC std_ss [countably_additive_alt_eq] \\
9982     rpt STRIP_TAC >> SIMP_TAC std_ss [o_DEF] \\
9983    `!x. A x IN measurable_sets M` by ASM_SET_TAC [] \\
9984     ASM_SIMP_TAC std_ss [GSYM IMAGE_DEF] \\
9985     Q.UNABBREV_TAC `t` >> BETA_TAC \\
9986     Know `!x. indicator_fn (BIGUNION (IMAGE A univ(:num))) x =
9987               suminf (\j. indicator_fn (A j) x)`
9988     >- (GEN_TAC >> ONCE_REWRITE_TAC [EQ_SYM_EQ] \\
9989         MATCH_MP_TAC indicator_fn_suminf \\
9990         FULL_SIMP_TAC std_ss [disjoint_family_on, DISJOINT_DEF] \\
9991         ASM_SET_TAC []) \\
9992     DISCH_TAC >> ASM_SIMP_TAC std_ss [] \\
9993     Know `!x. h x * suminf (\j. indicator_fn (A j) x) =
9994               suminf (\j. h x * (\j. indicator_fn (A j) x) j)`
9995     >- (GEN_TAC >> MATCH_MP_TAC (GSYM ext_suminf_cmul) \\
9996         ASM_SIMP_TAC std_ss [INDICATOR_FN_POS]) >> DISC_RW_KILL \\
9997     SIMP_TAC std_ss [] \\
9998     ONCE_REWRITE_TAC [METIS [] ``(\x'. h x' * indicator_fn (A x) x') =
9999                             (\x. (\x'. h x' * indicator_fn (A x) x')) x``] \\
10000     ONCE_REWRITE_TAC
10001       [METIS [] ``suminf (\j. h x * indicator_fn (A j) x) =
10002                   suminf (\j. (\x x'. h x' * indicator_fn (A x) x') j x)``] \\
10003     MATCH_MP_TAC pos_fn_integral_suminf \\
10004     ASM_SIMP_TAC std_ss [measure_space_def] \\
10005     CONJ_TAC >- (RW_TAC std_ss [] \\
10006                  MATCH_MP_TAC le_mul >> art [INDICATOR_FN_POS]) \\
10007     GEN_TAC >> MATCH_MP_TAC IN_MEASURABLE_BOREL_MUL_INDICATOR \\
10008     METIS_TAC [subsets_def, measurable_sets_def])
10009 >> DISCH_TAC
10010 >> Q.UNABBREV_TAC `t` (* not needed any more *)
10011 >> Cases_on `m_space M = {}`
10012 >- (Know `measurable_sets M = {{}}`
10013     >- (FULL_SIMP_TAC std_ss [measure_space_def, sigma_algebra_alt_pow, POW_DEF] \\
10014         FULL_SIMP_TAC std_ss [SUBSET_EMPTY] \\
10015         UNDISCH_TAC ``measurable_sets M SUBSET {s:'a->bool | s = {}}`` \\
10016         SIMP_TAC std_ss [SUBSET_DEF, GSPECIFICATION, EXTENSION, IN_SING] \\
10017         SIMP_TAC std_ss [NOT_IN_EMPTY] \\
10018         ONCE_REWRITE_TAC [SET_RULE ``(!x'. x' NOTIN x) = (x = {})``] \\
10019         DISCH_TAC >> GEN_TAC >> POP_ASSUM (MP_TAC o Q.SPEC `x`) \\
10020         STRIP_TAC >> EQ_TAC >| [ASM_SET_TAC [], METIS_TAC []]) \\
10021     DISCH_TAC \\
10022     Q.EXISTS_TAC `(\x. 0)` >> ASM_SIMP_TAC std_ss [le_refl, IN_SING] \\
10023     FULL_SIMP_TAC std_ss [mul_lzero, measure_space_def, positive_def] \\
10024     reverse CONJ_TAC
10025     >- (MATCH_MP_TAC pos_fn_integral_zero \\
10026         METIS_TAC [measure_space_def, positive_def]) \\
10027     ASM_SIMP_TAC std_ss [IN_MEASURABLE_BOREL] \\
10028     ASM_SIMP_TAC std_ss [space_def, INTER_EMPTY, subsets_def] \\
10029     SRW_TAC [] [IN_DEF, IN_FUNSET])
10030 >> Suff `measure_absolutely_continuous (measure N) mt`
10031 >- (STRIP_TAC \\
10032     MP_TAC (Q.SPECL [`mt`, `N`] Radon_Nikodym_finite_arbitrary) \\
10033    `m_space mt = m_space M` by METIS_TAC [m_space_def] \\
10034    `measurable_sets mt = measurable_sets M` by METIS_TAC [measurable_sets_def] \\
10035     RW_TAC std_ss [] >> POP_ASSUM MP_TAC \\
10036     Know `!A. A IN measurable_sets mt ==>
10037              (pos_fn_integral mt (\x. f x * indicator_fn A x) =
10038               pos_fn_integral M (\x. h x * (\x. f x * indicator_fn A x) x))`
10039     >- (GEN_TAC THEN DISCH_TAC THEN
10040         Q.UNABBREV_TAC `mt` THEN
10041         ONCE_REWRITE_TAC [METIS []
10042           “pos_fn_integral M (\x. h x * (f x * indicator_fn A x)) =
10043            pos_fn_integral M (\x. h x * (\x. f x * indicator_fn A x) x)”] \\
10044         Suff `pos_fn_integral
10045                (m_space M,measurable_sets M,
10046                 (\A. pos_fn_integral M (\x. max 0 (h x * indicator_fn A x))))
10047                (\x. max 0 ((\x. f x * indicator_fn A x) x)) =
10048               pos_fn_integral M (\x. max 0 (h x * (\x. f x * indicator_fn A x) x))`
10049         >- (ASM_SIMP_TAC std_ss [extreal_max_def, le_mul, indicator_fn_pos_le] \\
10050             METIS_TAC []) \\
10051         MATCH_MP_TAC pos_fn_integral_density' THEN ASM_SIMP_TAC std_ss [] \\
10052         CONJ_TAC
10053         >- (MATCH_MP_TAC IN_MEASURABLE_BOREL_MUL_INDICATOR \\
10054             METIS_TAC [subsets_def, measure_space_def, measurable_sets_def,
10055                        m_space_def]) \\
10056         CONJ_TAC
10057         >- (SIMP_TAC std_ss [AE_ALT, GSPECIFICATION, null_set_def, GSPEC_T] \\
10058             Q.EXISTS_TAC `{}` >> SIMP_TAC std_ss [IN_UNIV, GSPEC_F, SUBSET_REFL] \\
10059             METIS_TAC [measure_space_def, sigma_algebra_alt_pow, positive_def]) \\
10060         GEN_TAC >> MATCH_MP_TAC le_mul \\
10061         ASM_SIMP_TAC std_ss [INDICATOR_FN_POS]) \\
10062     NTAC 2 (DISCH_TAC) \\
10063     Q.EXISTS_TAC `(\x. h x * f x)` \\
10064     CONJ_TAC (* (\x. h x * f x) is borel-measurable *)
10065     >- (MATCH_MP_TAC IN_MEASURABLE_BOREL_TIMES \\
10066         qexistsl_tac [`h`, `f`] >> ASM_SIMP_TAC std_ss []) \\
10067     CONJ_TAC (* 0 <= h x * f x *)
10068     >- (GEN_TAC >> BETA_TAC >> MATCH_MP_TAC le_mul >> art []) \\
10069     RW_TAC std_ss [] >> REV_FULL_SIMP_TAC std_ss [mul_assoc])
10070 (* below was reworked by Chun Tian without using null_sets_density_iff (nonsense) *)
10071 >> FULL_SIMP_TAC std_ss [measure_absolutely_continuous_def]
10072 >> rpt STRIP_TAC
10073 >> `measurable_sets mt = measurable_sets M`
10074       by METIS_TAC [measurable_sets_def] THEN FULL_SIMP_TAC std_ss []
10075 >> rename1 `measure N A = 0`
10076 >> FIRST_X_ASSUM MATCH_MP_TAC >> art []
10077 >> Q.PAT_X_ASSUM `measure mt A = 0` MP_TAC
10078 >> Q.UNABBREV_TAC `mt`
10079 >> FULL_SIMP_TAC std_ss [m_space_def, measurable_sets_def, measure_def]
10080 >> MP_TAC (Q.SPECL [`M`, `\x. h x * indicator_fn A x`] pos_fn_integral_eq_0)
10081 >> ASM_SIMP_TAC std_ss []
10082 >> Know ‘!x. x IN m_space M ==> 0 <= h x * indicator_fn A x’
10083 >- rw [le_mul, INDICATOR_FN_POS]
10084 >> Know `(\x. h x * indicator_fn A x) IN Borel_measurable (measurable_space M)`
10085 >- (MATCH_MP_TAC IN_MEASURABLE_BOREL_MUL_INDICATOR \\
10086     fs [measure_space_def, subsets_def])
10087 >> RW_TAC std_ss []
10088 >> Suff `A = {x | x IN m_space M /\ h x * indicator_fn A x <> 0}`
10089 >- (Rewr' >> art [])
10090 >> RW_TAC std_ss [Once EXTENSION, GSPECIFICATION, indicator_fn_def]
10091 >> Cases_on `x IN A` >> ASM_SIMP_TAC std_ss [mul_rone, mul_rzero]
10092 >> STRONG_CONJ_TAC >- METIS_TAC [MEASURE_SPACE_IN_MSPACE]
10093 >> METIS_TAC [lt_le]
10094QED
10095
10096(* This version has “!x. x IN m_space M ==> 0 <= f x” instead of “!x. 0 <= f x” *)
10097Theorem RADON_NIKODYM :
10098    !M N. measure_space M /\ measure_space N /\
10099          measurable_sets M = measurable_sets N /\
10100          sigma_finite M /\ measure_absolutely_continuous (measure N) M ==>
10101      ?f. f IN measurable (m_space M,measurable_sets M) Borel /\
10102          (!x. x IN m_space M ==> 0 <= f x) /\
10103          !A. A IN measurable_sets M ==>
10104             (pos_fn_integral M (\x. f x * indicator_fn A x) = measure N A)
10105Proof
10106    rpt STRIP_TAC
10107 >> MP_TAC (Q.SPECL [‘M’, ‘N’] Radon_Nikodym_sigma_finite) >> rw []
10108 >> Q.EXISTS_TAC ‘f’ >> rw []
10109QED
10110
10111(* Final version: more compact using of "<<" and "*" (density_measure_def) *)
10112Theorem Radon_Nikodym :
10113    !m v. measure_space m /\ sigma_finite m /\
10114          measure_space (m_space m,measurable_sets m,v) /\
10115          measure_absolutely_continuous v m ==>
10116      ?f. f IN measurable (m_space m,measurable_sets m) Borel /\ (!x. 0 <= f x) /\
10117          !s. s IN (measurable_sets m) ==> ((f * m) s = v s)
10118Proof
10119    RW_TAC std_ss [density_measure_def]
10120 >> MP_TAC (REWRITE_RULE [m_space_def, measurable_sets_def, measure_def]
10121              (Q.SPECL [`m`, `(m_space m,measurable_sets m,v)`]
10122                       Radon_Nikodym_sigma_finite))
10123 >> RW_TAC std_ss []
10124QED
10125
10126(* A variant with ‘x IN m_space m’ added, aligned with ‘RN_deriv’. *)
10127Theorem Radon_Nikodym' :
10128    !m v. measure_space m /\ sigma_finite m /\
10129          measure_space (m_space m,measurable_sets m,v) /\
10130          measure_absolutely_continuous v m ==>
10131      ?f. f IN measurable (m_space m,measurable_sets m) Borel /\
10132         (!x. x IN m_space m ==> 0 <= f x) /\
10133          !s. s IN (measurable_sets m) ==> ((f * m) s = v s)
10134Proof
10135    rpt STRIP_TAC
10136 >> ‘?f. f IN measurable (m_space m,measurable_sets m) Borel /\ (!x. 0 <= f x) /\
10137         !s. s IN (measurable_sets m) ==> ((f * m) s = v s)’
10138      by METIS_TAC [Radon_Nikodym]
10139 >> Q.EXISTS_TAC ‘f’ >> rw []
10140QED
10141
10142(* Helper simps for later results *)
10143
10144Theorem m_space_density[simp]:
10145    !m f. m_space (density m f) = m_space m
10146Proof
10147    simp[density_def]
10148QED
10149
10150Theorem measurable_sets_density[simp]:
10151    !m f. measurable_sets (density m f) = measurable_sets m
10152Proof
10153    simp[density_def]
10154QED
10155
10156Theorem measurable_space_density[simp] :
10157    measurable_space (density m f) = measurable_space m
10158Proof
10159    simp [density_def]
10160QED
10161
10162(* References:
10163
10164  [1] Schilling, R.L.: Measures, Integrals and Martingales (Second Edition).
10165      Cambridge University Press (2017).
10166  [2] Mhamdi, T., Hasan, O., Tahar, S.: Formalization of Measure Theory and Lebesgue
10167      Integration for Probabilistic Analysis in HOL. ACM Trans. Embedded Comput. Syst.
10168      12, 1-23 (2013). DOI:10.1145/2406336.2406349
10169  [4] Wikipedia: https://en.wikipedia.org/wiki/Beppo_Levi
10170  [5] Wikipedia: https://en.wikipedia.org/wiki/Giuseppe_Vitali
10171  [6] Shiryaev, A.N.: Probability-1. Springer-Verlag New York (2016).
10172  [7] Coble, A.R.: Anonymity, information, and machine-assisted proof.
10173      University of Cambridge (2010).
10174 *)