integrationScript.sml

1(* ========================================================================= *)
2(*                                                                           *)
3(*           Henstock-Kurzweil (gauge) Integration (univariate) [1]          *)
4(*                                                                           *)
5(*        (c) Copyright, John Harrison 1998-2008                             *)
6(*        (c) Copyright, Marco Maggesi 2014                                  *)
7(*        (c) Copyright 2015,                                                *)
8(*                       Muhammad Qasim,                                     *)
9(*                       Osman Hasan,                                        *)
10(*                       Hardware Verification Group,                        *)
11(*                       Concordia University                                *)
12(*            Contact:  <m_qasi@ece.concordia.ca>                            *)
13(*                                                                           *)
14(*    Note: This theory was ported from HOL Light                            *)
15(*                                                                           *)
16(* ========================================================================= *)
17Theory integration
18Ancestors
19  num prim_rec pair combin quotient arithmetic pred_set real list
20  real_sigma metric topology option cardinal nets iterate
21  real_topology derivative
22Libs
23  numLib unwindLib tautLib Arith realLib jrhUtils mesonLib
24  pred_setLib hurdUtils schneiderUtils
25
26
27val std_ss = std_ss -* ["lift_disj_eq", "lift_imp_disj"]
28val real_ss = real_ss -* ["lift_disj_eq", "lift_imp_disj"]
29val _ = temp_delsimps ["lift_disj_eq", "lift_imp_disj"]
30
31fun METIS ths tm = prove(tm,METIS_TAC ths);
32
33val DISC_RW_KILL = DISCH_TAC THEN ONCE_ASM_REWRITE_TAC [] THEN
34                   POP_ASSUM K_TAC;
35
36fun ASSERT_TAC tm = SUBGOAL_THEN tm STRIP_ASSUME_TAC;
37val ASM_ARITH_TAC = REPEAT (POP_ASSUM MP_TAC) THEN ARITH_TAC;
38
39(* Minimal hol-light compatibility layer *)
40val ASM_REAL_ARITH_TAC = REAL_ASM_ARITH_TAC; (* realLib *)
41val IMP_CONJ           = CONJ_EQ_IMP;        (* cardinalTheory *)
42val FINITE_SUBSET      = SUBSET_FINITE_I;    (* pred_setTheory *)
43val SUM_0              = SUM_0';             (* iterateTheory *)
44val SUM_ABS            = SUM_ABS';           (* iterateTheory *)
45val SUM_ABS_LE         = SUM_ABS_LE';        (* iterateTheory *)
46val SUM_ADD            = SUM_ADD';           (* iterateTheory *)
47val SUM_EQ             = SUM_EQ';            (* iterateTheory *)
48val SUM_EQ_0           = SUM_EQ_0';          (* iterateTheory *)
49val SUM_LE             = SUM_LE';            (* iterateTheory *)
50val SUM_SUB            = SUM_SUB';           (* iterateTheory *)
51val cauchy             = cauchy_def;         (* real_topologyTheory *)
52val LIM                = LIM_DEF;            (* real_topologyTheory *)
53
54(* ------------------------------------------------------------------------- *)
55(* Some useful lemmas about intervals.                                       *)
56(* ------------------------------------------------------------------------- *)
57
58Theorem INTERIOR_SUBSET_UNION_INTERVALS:
59   !s i j. (?a b:real. i = interval[a,b]) /\ (?c d. j = interval[c,d]) /\
60           ~(interior j = {}) /\
61           i SUBSET j UNION s /\
62           (interior(i) INTER interior(j) = {})
63           ==> interior i SUBSET interior s
64Proof
65  REPEAT STRIP_TAC THEN FULL_SIMP_TAC std_ss [] THEN
66  MATCH_MP_TAC INTERIOR_MAXIMAL THEN REWRITE_TAC[OPEN_INTERIOR] THEN
67  POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
68  ASM_REWRITE_TAC [] THEN REPEAT STRIP_TAC THEN
69  RULE_ASSUM_TAC(REWRITE_RULE[INTERIOR_CLOSED_INTERVAL]) THEN
70  SUBGOAL_THEN ``interval(a:real,b) INTER interval[c,d] = {}`` ASSUME_TAC THENL
71   [ASM_SIMP_TAC std_ss [INTER_INTERVAL_MIXED_EQ_EMPTY],
72    MP_TAC(ISPECL [``a:real``, ``b:real``] INTERVAL_OPEN_SUBSET_CLOSED) THEN
73    REWRITE_TAC[INTERIOR_CLOSED_INTERVAL] THEN
74    REPEAT(POP_ASSUM MP_TAC) THEN SET_TAC[]]
75QED
76
77Theorem lemma1[local]:
78    (abs(d:real) = e / &2) ==>
79        dist(x + d,y) < e / &2 ==> dist(x,y) < e
80Proof
81  GEN_REWR_TAC LAND_CONV [EQ_SYM_EQ] THEN DISCH_TAC THEN
82  GEN_REWR_TAC (RAND_CONV o RAND_CONV) [GSYM REAL_HALF_DOUBLE] THEN
83  ASM_REWRITE_TAC [dist] THEN REAL_ARITH_TAC
84QED
85
86Theorem lemma2[local]:
87    !x:real. (-x/2) = -(x/2)
88Proof
89 GEN_TAC THEN ONCE_REWRITE_TAC [REAL_NEG_MINUS1] THEN
90 REWRITE_TAC [real_div, REAL_MUL_ASSOC]
91QED
92
93Theorem INTER_INTERIOR_BIGUNION_INTERVALS:
94   !s f. FINITE f /\ open s /\
95         (!t. t IN f ==> ?a b:real. (t = interval[a,b])) /\
96         (!t. t IN f ==> (s INTER (interior t) = {}))
97         ==> (s INTER interior(BIGUNION f) = {})
98Proof
99  ONCE_REWRITE_TAC[TAUT
100    `a /\ b /\ c /\ d ==> e <=> a /\ b /\ c ==> ~e ==> ~d`] THEN
101  SIMP_TAC std_ss [NOT_FORALL_THM, NOT_IMP, GSYM MEMBER_NOT_EMPTY] THEN
102  SIMP_TAC std_ss [OPEN_CONTAINS_BALL_EQ, OPEN_INTER, OPEN_INTERIOR] THEN
103  SIMP_TAC std_ss [OPEN_SUBSET_INTERIOR, OPEN_BALL, SUBSET_INTER] THEN
104  REWRITE_TAC[GSYM SUBSET_INTER] THEN
105  GEN_TAC THEN ONCE_REWRITE_TAC[GSYM AND_IMP_INTRO] THEN GEN_TAC THEN
106  KNOW_TAC ``(open s /\ (!t. t IN f ==> ?a b. t = interval [(a,b)]) ==>
107        (?x e. 0 < e /\ ball (x,e) SUBSET s INTER BIGUNION f) ==>
108          ?t. t IN f /\ ?x e. 0 < e /\ ball (x,e) SUBSET s INTER t) =
109        (\f. (open s /\ (!t. t IN f ==> ?a b. t = interval [(a,b)]) ==>
110        (?x e. 0 < e /\ ball (x,e) SUBSET s INTER BIGUNION f) ==>
111          ?t. t IN f /\ ?x e. 0 < e /\ ball (x,e) SUBSET s INTER t))f`` THENL
112  [FULL_SIMP_TAC std_ss [], ALL_TAC] THEN DISC_RW_KILL THEN
113  MATCH_MP_TAC FINITE_INDUCT THEN BETA_TAC THEN CONJ_TAC THENL
114   [REWRITE_TAC[BIGUNION_EMPTY, INTER_EMPTY, SUBSET_EMPTY] THEN
115    MESON_TAC[CENTRE_IN_BALL, NOT_IN_EMPTY],
116    ALL_TAC] THEN
117  SIMP_TAC std_ss [GSYM RIGHT_FORALL_IMP_THM] THEN
118  MAP_EVERY X_GEN_TAC [``f:(real->bool)->bool``, ``i:real->bool``] THEN
119  DISCH_TAC THEN DISCH_TAC THEN
120  REWRITE_TAC[BIGUNION_INSERT, IN_INSERT] THEN
121  REWRITE_TAC[TAUT `(a \/ b) ==> c <=> (a ==> c) /\ (b ==> c)`] THEN
122  SIMP_TAC std_ss [RIGHT_AND_OVER_OR, FORALL_AND_THM, EXISTS_OR_THM] THEN
123  SIMP_TAC std_ss [GSYM CONJ_ASSOC, UNWIND_THM2] THEN
124  DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
125  DISCH_THEN(CONJUNCTS_THEN2 MP_TAC STRIP_ASSUME_TAC) THEN
126  DISCH_THEN(X_CHOOSE_THEN ``a:real`` (X_CHOOSE_THEN ``b:real``
127    SUBST_ALL_TAC)) THEN
128  FIRST_X_ASSUM(CONJUNCTS_THEN2 STRIP_ASSUME_TAC MP_TAC) THEN
129  ASM_REWRITE_TAC[] THEN MATCH_MP_TAC(TAUT
130   `(r ==> s \/ p) ==> (p ==> q) ==> r ==> s \/ q`) THEN
131  POP_ASSUM_LIST(K ALL_TAC) THEN
132  DISCH_THEN (X_CHOOSE_TAC ``x:real``) THEN POP_ASSUM MP_TAC THEN
133  DISCH_THEN (X_CHOOSE_TAC ``e:real``) THEN FULL_SIMP_TAC std_ss [] THEN
134  ASM_CASES_TAC ``(x:real) IN interval[a,b]`` THENL
135   [ALL_TAC,
136    SUBGOAL_THEN
137     ``?d. &0 < d /\ ball(x,d) SUBSET (univ(:real) DIFF interval[a,b])``
138    STRIP_ASSUME_TAC THENL
139     [ASM_MESON_TAC[closed_def, OPEN_CONTAINS_BALL, CLOSED_INTERVAL,
140                    IN_DIFF, IN_UNIV], ALL_TAC] THEN
141    DISJ2_TAC THEN MAP_EVERY EXISTS_TAC [``x:real``, ``min d e:real``] THEN
142    ASM_REWRITE_TAC[REAL_LT_MIN, SUBSET_DEF] THEN
143    POP_ASSUM MP_TAC THEN GEN_REWR_TAC LAND_CONV [SUBSET_DEF] THEN
144    UNDISCH_TAC ``ball (x,e) SUBSET s INTER (interval [(a,b)] UNION BIGUNION f)`` THEN
145    GEN_REWR_TAC LAND_CONV [SUBSET_DEF] THEN
146    SIMP_TAC std_ss [IN_BALL, REAL_LT_MIN, IN_DIFF, IN_INTER, IN_UNIV, IN_UNION] THEN
147    ASM_MESON_TAC[]] THEN
148  ASM_CASES_TAC ``(x:real) IN interval(a,b)`` THENL
149   [DISJ1_TAC THEN
150    SUBGOAL_THEN
151     ``?d. &0 < d /\ ball(x:real,d) SUBSET interval(a,b)``
152    STRIP_ASSUME_TAC THENL
153     [ASM_MESON_TAC[OPEN_CONTAINS_BALL, OPEN_INTERVAL], ALL_TAC] THEN
154    MAP_EVERY EXISTS_TAC [``x:real``, ``min d e:real``] THEN
155    ASM_REWRITE_TAC[REAL_LT_MIN, SUBSET_DEF] THEN
156    POP_ASSUM MP_TAC THEN GEN_REWR_TAC LAND_CONV [SUBSET_DEF] THEN
157    UNDISCH_TAC ``ball (x,e) SUBSET s INTER (interval [(a,b)] UNION BIGUNION f)`` THEN
158    GEN_REWR_TAC LAND_CONV [SUBSET_DEF] THEN
159    SIMP_TAC std_ss [IN_BALL, REAL_LT_MIN, IN_DIFF, IN_INTER, IN_UNIV, IN_UNION] THEN
160    ASM_MESON_TAC[INTERVAL_OPEN_SUBSET_CLOSED, SUBSET_DEF],
161    ALL_TAC] THEN
162  POP_ASSUM MP_TAC THEN GEN_REWR_TAC (LAND_CONV o RAND_CONV) [IN_INTERVAL] THEN
163  RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN
164  REWRITE_TAC[GSYM REAL_LT_LE, DE_MORGAN_THM] THEN
165  STRIP_TAC THEN DISJ2_TAC THENL
166   [EXISTS_TAC ``x + -e / &2:real``,
167    EXISTS_TAC ``x + e / &2:real``] THEN
168  EXISTS_TAC ``e / &2:real`` THEN ASM_REWRITE_TAC[REAL_LT_HALF1] THEN
169  FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
170   ``b1 SUBSET k INTER (i UNION s)
171    ==> b2 SUBSET b1 /\ (b2 INTER i = {})
172        ==> b2 SUBSET k INTER s``)) THEN
173  (CONJ_TAC THENL
174    [REWRITE_TAC[SUBSET_DEF, IN_BALL] THEN
175     GEN_TAC THEN MATCH_MP_TAC lemma1 THEN REWRITE_TAC [lemma2, ABS_NEG, ABS_REFL] THEN
176     UNDISCH_TAC ``&0 < e:real`` THEN ONCE_REWRITE_TAC [GSYM REAL_LT_HALF1] THEN
177     ASM_SIMP_TAC std_ss [REAL_LE_LT],
178     ALL_TAC]) THEN
179  REWRITE_TAC[EXTENSION, IN_INTER, IN_INTERVAL, NOT_IN_EMPTY] THEN
180  X_GEN_TAC ``y:real`` THEN REWRITE_TAC[IN_BALL, dist] THEN
181  DISCH_TAC THEN FULL_SIMP_TAC std_ss [REAL_NOT_LT, lemma2] THEN
182  POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN REWRITE_TAC [AND_IMP_INTRO] THEN
183  POP_ASSUM MP_TAC THEN UNDISCH_TAC ``0 < e:real`` THENL
184  [KNOW_TAC ``a = x:real`` THENL [METIS_TAC [REAL_LE_ANTISYM], ALL_TAC],
185   KNOW_TAC ``b = x:real`` THENL [METIS_TAC [REAL_LE_ANTISYM], ALL_TAC]] THEN
186  DISC_RW_KILL THEN REAL_ARITH_TAC
187QED
188
189(* ------------------------------------------------------------------------- *)
190(* The notion of a gauge --- simply an open set containing the point.        *)
191(* ------------------------------------------------------------------------- *)
192
193(* ‘gauge :(real -> (real set)) -> bool’         (integrationTheory)
194   ‘gauge :(real set -> (real -> real) -> bool)’ (integralTheory)
195
196   cf. integralTheory.gauge, integralTheory.gauge_univ_alt (bridging theorem)
197
198   It seems that the present definition of gauge is more general than guage of
199   integralTheory, since ‘d(x)’ can be arbitrary open set containing x. On the
200   other hand, the present definition is "less" general, in the sense that the
201   domain of gauge is implicitly univ(:real).  I guess this is not a big issue
202   when calculating the integral of a partial function which has no definition
203   on certain points: an indicator function can be used to replace unspecified
204   fuction values to zero.                        -- Chun Tian, April 16, 2022
205 *)
206Definition gauge_def :
207   Gauge d <=> !x. x IN d(x) /\ open(d(x))
208End
209Overload gauge = “Gauge”
210
211Theorem GAUGE_BALL_DEPENDENT:
212   !e. (!x. &0 < e(x)) ==> gauge(\x. ball(x,e(x)))
213Proof
214  SIMP_TAC std_ss [gauge_def, OPEN_BALL, CENTRE_IN_BALL]
215QED
216
217(* constant gauge *)
218Theorem GAUGE_BALL:
219   !e. &0 < e ==> gauge (\x. ball(x,e))
220Proof
221  SIMP_TAC std_ss [gauge_def, OPEN_BALL, CENTRE_IN_BALL]
222QED
223
224Theorem GAUGE_TRIVIAL:
225   gauge (\x. ball(x,&1))
226Proof
227  SIMP_TAC std_ss [GAUGE_BALL, REAL_LT_01]
228QED
229
230Theorem GAUGE_INTER:
231   !d1 d2. gauge d1 /\ gauge d2 ==> gauge (\x. (d1 x) INTER (d2 x))
232Proof
233  SIMP_TAC std_ss [gauge_def, IN_INTER, OPEN_INTER]
234QED
235
236Theorem GAUGE_BIGINTER :
237    !f s. FINITE s /\ (!d. d IN s ==> gauge (f d)) ==>
238          gauge (\x. BIGINTER {f d x | d IN s})
239Proof
240    SIMP_TAC std_ss [gauge_def, IN_BIGINTER]
241 >> REWRITE_TAC[SET_RULE ``{f d x | d IN s} = IMAGE (\d. f d x) s``]
242 >> SIMP_TAC std_ss [FORALL_IN_IMAGE, OPEN_BIGINTER, IMAGE_FINITE]
243QED
244
245Theorem GAUGE_EXISTENCE_LEMMA :
246    !p q. (!x:real. ?d:real. p x ==> &0 < d /\ q d x) <=>
247          (!x:real. ?d:real. &0 < d /\ (p x ==> q d x))
248Proof
249    MESON_TAC [REAL_LT_01]
250QED
251
252(* ------------------------------------------------------------------------- *)
253(* Divisions.                                                                *)
254(* ------------------------------------------------------------------------- *)
255
256val _ = set_fixity "division_of" (Infix(NONASSOC, 450));
257
258Definition division_of[nocompute]:
259 s division_of i <=>
260        FINITE s /\
261        (!k. k IN s
262             ==> k SUBSET i /\ ~(k = {}) /\ ?a b. k = interval[a,b]) /\
263        (!k1 k2. k1 IN s /\ k2 IN s /\ ~(k1 = k2)
264                 ==> (interior(k1) INTER interior(k2) = {})) /\
265        (BIGUNION s = i)
266End
267
268Theorem DIVISION_OF :
269    !s i. s division_of i <=>
270        FINITE s /\
271        (!k. k IN s ==> ~(k = {}) /\ ?a b. k = interval[a,b]) /\
272        (!k1 k2. k1 IN s /\ k2 IN s /\ ~(k1 = k2)
273                 ==> (interior(k1) INTER interior(k2) = {})) /\
274        (BIGUNION s = i)
275Proof
276    NTAC 2 GEN_TAC
277 >> REWRITE_TAC [division_of] >> SET_TAC []
278QED
279
280Theorem DIVISION_OF_FINITE:
281   !s i. s division_of i ==> FINITE s
282Proof
283  MESON_TAC[division_of]
284QED
285
286Theorem DIVISION_OF_SELF:
287   !a b. ~(interval[a,b] = {}) ==> {interval[a,b]} division_of interval[a,b]
288Proof
289  REWRITE_TAC[division_of, FINITE_INSERT, FINITE_EMPTY, IN_SING, BIGUNION_SING] THEN
290  MESON_TAC[SUBSET_REFL]
291QED
292
293Theorem DIVISION_OF_TRIVIAL:
294   !s. s division_of {} <=> (s = {})
295Proof
296  REWRITE_TAC[division_of, SUBSET_EMPTY, CONJ_ASSOC] THEN
297  REWRITE_TAC[TAUT `~(p /\ ~p)`] THEN REWRITE_TAC [GSYM CONJ_ASSOC] THEN
298  REWRITE_TAC [METIS [GSYM NOT_EXISTS_THM, MEMBER_NOT_EMPTY]
299                      ``(!k. k NOTIN s) = (s = {})``] THEN
300  METIS_TAC[FINITE_EMPTY, FINITE_INSERT, BIGUNION_EMPTY, NOT_IN_EMPTY]
301QED
302
303Theorem EMPTY_DIVISION_OF:
304   !s. {} division_of s <=> (s = {})
305Proof
306  REWRITE_TAC[division_of, BIGUNION_EMPTY, FINITE_EMPTY, NOT_IN_EMPTY] THEN
307  MESON_TAC[]
308QED
309
310Theorem lemma[local]:
311    s SUBSET {{a}} /\ p /\ (BIGUNION s = {a}) <=> (s = {{a}}) /\ p
312Proof
313    EQ_TAC THEN STRIP_TAC THEN
314    ASM_REWRITE_TAC[SET_RULE ``BIGUNION {a} = a``] THEN
315    REPEAT (POP_ASSUM MP_TAC) THEN SET_TAC[]
316QED
317
318Theorem DIVISION_OF_SING:
319   !s a. s division_of interval[a,a] <=> (s = {interval[a,a]})
320Proof
321  REWRITE_TAC[division_of, INTERVAL_SING] THEN
322  REWRITE_TAC[SET_RULE ``k SUBSET {a} /\ ~(k = {}) /\ p <=> (k = {a}) /\ p``] THEN
323  REWRITE_TAC[GSYM INTERVAL_SING] THEN
324  REWRITE_TAC[MESON[] ``((k = interval[a,b]) /\ ?c d. (k = interval[c,d])) <=>
325                        ((k = interval[a,b]))``] THEN
326  REWRITE_TAC[SET_RULE ``(!k. k IN s ==> (k = a)) <=> s SUBSET {a}``] THEN
327  REWRITE_TAC[INTERVAL_SING, lemma] THEN MESON_TAC[FINITE_EMPTY, FINITE_INSERT, IN_SING]
328QED
329
330Theorem ELEMENTARY_EMPTY:
331   ?p. p division_of {}
332Proof
333  REWRITE_TAC[DIVISION_OF_TRIVIAL, EXISTS_REFL]
334QED
335
336Theorem ELEMENTARY_INTERVAL:
337   !a b. ?p. p division_of interval[a,b]
338Proof
339  MESON_TAC[DIVISION_OF_TRIVIAL, DIVISION_OF_SELF]
340QED
341
342Theorem DIVISION_CONTAINS:
343   !s i. s division_of i ==> !x. x IN i ==> ?k. x IN k /\ k IN s
344Proof
345  REWRITE_TAC[division_of, EXTENSION, IN_BIGUNION] THEN MESON_TAC[]
346QED
347
348Theorem FORALL_IN_DIVISION:
349   !P d i. d division_of i
350           ==> ((!x. x IN d ==> P x) <=>
351               (!a b. interval[a,b] IN d ==> P(interval[a,b])))
352Proof
353  REWRITE_TAC[division_of] THEN MESON_TAC[]
354QED
355
356Theorem FORALL_IN_DIVISION_NONEMPTY:
357   !P d i.
358         d division_of i
359         ==> ((!x. x IN d ==> P x) <=>
360              (!a b. interval [a,b] IN d /\ ~(interval[a,b] = {})
361                     ==> P (interval [a,b])))
362Proof
363  REWRITE_TAC[division_of] THEN MESON_TAC[]
364QED
365
366Theorem DIVISION_OF_SUBSET:
367   !p q:(real->bool)->bool.
368        p division_of (BIGUNION p) /\ q SUBSET p ==> q division_of (BIGUNION q)
369Proof
370  REPEAT GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
371  REWRITE_TAC[division_of] THEN
372  REPEAT(MATCH_MP_TAC MONO_AND THEN CONJ_TAC) THENL
373   [ASM_MESON_TAC[SUBSET_FINITE], POP_ASSUM MP_TAC THEN SET_TAC[],
374    POP_ASSUM MP_TAC THEN SET_TAC[]]
375QED
376
377Theorem DIVISION_OF_UNION_SELF:
378   !p s. p division_of s ==> p division_of (BIGUNION p)
379Proof
380  REWRITE_TAC[division_of] THEN MESON_TAC[]
381QED
382
383Theorem DIVISION_OF_CONTENT_0:
384   !a b d. (content(interval[a,b]) = &0) /\ d division_of interval[a,b]
385           ==> !k. k IN d ==> (content k = &0)
386Proof
387  REPEAT GEN_TAC THEN STRIP_TAC THEN
388  KNOW_TAC ``!k. (content k = 0) = (\k. content k = 0) k`` THENL
389  [FULL_SIMP_TAC std_ss [], ALL_TAC] THEN DISC_RW_KILL THEN
390  FIRST_ASSUM(fn th => REWRITE_TAC[MATCH_MP FORALL_IN_DIVISION th]) THEN
391  BETA_TAC THEN
392  REWRITE_TAC[GSYM REAL_LE_ANTISYM, CONTENT_POS_LE] THEN
393  METIS_TAC[CONTENT_SUBSET, division_of]
394QED
395
396Theorem lemma[local]:
397    {k1 INTER k2 | k1 IN p1 /\ k2 IN p2 /\ ~(k1 INTER k2 = {})} =
398        {s | s IN IMAGE (\(k1,k2). k1 INTER k2) (p1 CROSS p2) /\
399             ~(s = {})}
400Proof
401    REWRITE_TAC[EXTENSION] THEN
402    SIMP_TAC std_ss [IN_IMAGE, GSPECIFICATION, EXISTS_PROD, IN_CROSS] THEN
403    MESON_TAC[]
404QED
405
406Theorem DIVISION_INTER:
407   !s1 s2:real->bool p1 p2.
408        p1 division_of s1 /\
409        p2 division_of s2
410        ==> {k1 INTER k2 | k1 IN p1 /\ k2 IN p2 /\ ~(k1 INTER k2 = {})}
411            division_of (s1 INTER s2)
412Proof
413  REPEAT GEN_TAC THEN REWRITE_TAC[DIVISION_OF] THEN STRIP_TAC THEN
414  ASM_SIMP_TAC std_ss [lemma, FINITE_RESTRICT, FINITE_CROSS, IMAGE_FINITE] THEN
415  SIMP_TAC std_ss [GSPECIFICATION] THEN
416  SIMP_TAC std_ss [GSYM AND_IMP_INTRO, FORALL_IN_IMAGE, RIGHT_FORALL_IMP_THM] THEN
417  SIMP_TAC std_ss [FORALL_PROD, IN_CROSS] THEN REPEAT CONJ_TAC THENL
418   [ASM_MESON_TAC[INTER_INTERVAL],
419    REPEAT STRIP_TAC THEN
420    MATCH_MP_TAC(SET_RULE
421    ``((interior x1 INTER interior x2 = {}) \/
422       (interior y1 INTER interior y2 = {})) /\
423      interior(x1 INTER y1) SUBSET interior(x1) /\
424      interior(x1 INTER y1) SUBSET interior(y1) /\
425      interior(x2 INTER y2) SUBSET interior(x2) /\
426      interior(x2 INTER y2) SUBSET interior(y2)
427      ==> (interior(x1 INTER y1) INTER interior(x2 INTER y2) = {})``) THEN
428    CONJ_TAC THENL [ASM_MESON_TAC[], ALL_TAC] THEN
429    REPEAT CONJ_TAC THEN MATCH_MP_TAC SUBSET_INTERIOR THEN SET_TAC[],
430    REWRITE_TAC[SET_RULE ``BIGUNION {x | x IN s /\ ~(x = {})} = BIGUNION s``] THEN
431    REPEAT(FIRST_X_ASSUM(SUBST_ALL_TAC o SYM)) THEN
432    GEN_REWR_TAC I [EXTENSION] THEN
433    SIMP_TAC std_ss [IN_BIGUNION, IN_IMAGE, EXISTS_PROD, IN_CROSS, IN_INTER] THEN
434    MESON_TAC[IN_INTER]]
435QED
436
437Theorem DIVISION_INTER_1:
438   !d i a b:real.
439        d division_of i /\ interval[a,b] SUBSET i
440        ==> { interval[a,b] INTER k | k |
441                 k IN d /\ ~(interval[a,b] INTER k = {}) }
442            division_of interval[a,b]
443Proof
444  REPEAT STRIP_TAC THEN
445  ASM_CASES_TAC ``interval[a:real,b] = {}`` THEN
446  ASM_SIMP_TAC std_ss [INTER_EMPTY, DIVISION_OF_TRIVIAL] THENL
447  [SET_TAC [],
448  MP_TAC(ISPECL [``interval[a:real,b]``, ``i:real->bool``,
449                 ``{interval[a:real,b]}``, ``d:(real->bool)->bool``]
450                DIVISION_INTER) THEN
451  ASM_SIMP_TAC std_ss [DIVISION_OF_SELF, SET_RULE ``s SUBSET t ==> (s INTER t = s)``] THEN
452  MATCH_MP_TAC EQ_IMPLIES THEN AP_THM_TAC THEN AP_TERM_TAC THEN
453  SIMP_TAC std_ss [EXTENSION, EXISTS_PROD, GSPECIFICATION] THEN SET_TAC[]]
454QED
455
456Theorem ELEMENTARY_INTER:
457   !s t. (?p. p division_of s) /\ (?p. p division_of t)
458         ==> ?p. p division_of (s INTER t)
459Proof
460  METIS_TAC[DIVISION_INTER]
461QED
462
463Theorem ELEMENTARY_BIGINTER:
464   !f:(real->bool)->bool.
465        FINITE f /\ ~(f = {}) /\
466        (!s. s IN f ==> ?p. p division_of s)
467        ==> ?p. p division_of (BIGINTER f)
468Proof
469  REWRITE_TAC[GSYM AND_IMP_INTRO] THEN GEN_TAC THEN
470  KNOW_TAC ``(f <> {} ==>
471             (!s. s IN f ==> ?p. p division_of s) ==>
472             ?p. p division_of BIGINTER f) =
473             (\f:(real->bool)->bool. (f <> {}) ==>
474             (!s. s IN f ==> ?p. p division_of s) ==>
475             ?p. p division_of BIGINTER f) f`` THENL
476  [FULL_SIMP_TAC std_ss [], ALL_TAC] THEN DISC_RW_KILL THEN
477  MATCH_MP_TAC FINITE_INDUCT THEN BETA_TAC THEN
478  REWRITE_TAC[BIGINTER_INSERT] THEN SIMP_TAC std_ss [GSYM RIGHT_FORALL_IMP_THM] THEN
479  MAP_EVERY X_GEN_TAC [``s:(real->bool)->bool``, ``s:real->bool``] THEN
480  ASM_CASES_TAC ``s:(real->bool)->bool = {}`` THEN ASM_REWRITE_TAC[] THENL
481   [REWRITE_TAC[BIGINTER_EMPTY, INTER_UNIV, IN_SING] THEN MESON_TAC[],
482    REWRITE_TAC[IN_INSERT] THEN REPEAT STRIP_TAC THEN
483    MATCH_MP_TAC ELEMENTARY_INTER THEN ASM_MESON_TAC[]]
484QED
485
486Theorem DIVISION_DISJOINT_UNION:
487   !s1 s2:real->bool p1 p2.
488    p1 division_of s1 /\ p2 division_of s2 /\
489    (interior s1 INTER interior s2 = {})
490    ==> (p1 UNION p2) division_of (s1 UNION s2)
491Proof
492  REPEAT GEN_TAC THEN REWRITE_TAC[division_of] THEN STRIP_TAC THEN
493  ASM_REWRITE_TAC[FINITE_UNION, IN_UNION, EXISTS_OR_THM, SET_RULE
494   ``BIGUNION {x | P x \/ Q x} = BIGUNION {x | P x} UNION BIGUNION {x | Q x}``] THEN
495  CONJ_TAC THENL [ASM_SET_TAC[], ALL_TAC] THEN
496  CONJ_TAC THENL [ALL_TAC, ASM_SET_TAC[]] THEN
497  REPEAT STRIP_TAC THENL
498  [ASM_SET_TAC[], ALL_TAC, ALL_TAC, ASM_SET_TAC[]] THEN
499  MATCH_MP_TAC(SET_RULE ``!s' t'. s SUBSET s' /\ t SUBSET t' /\
500   (s' INTER t' = {}) ==> (s INTER t = {})``)
501  THENL
502  [MAP_EVERY EXISTS_TAC
503   [``interior s1:real->bool``, ``interior s2:real->bool``],
504   MAP_EVERY EXISTS_TAC
505   [``interior s2:real->bool``, ``interior s1:real->bool``]] THEN
506  REPEAT CONJ_TAC THEN TRY(MATCH_MP_TAC SUBSET_INTERIOR) THEN
507  ASM_SET_TAC[]
508QED
509
510Theorem PARTIAL_DIVISION_EXTEND_1:
511  !a b c d:real.
512    interval[c,d] SUBSET interval[a,b] /\ ~(interval[c,d] = {})
513   ==>
514    ?p. p division_of interval[a,b] /\ interval[c,d] IN p
515Proof
516  REPEAT STRIP_TAC THEN ASM_CASES_TAC “interval[a:real,b] = {}” THENL
517  [ASM_SET_TAC[], ALL_TAC] THEN
518  POP_ASSUM (MP_TAC o REWRITE_RULE [INTERVAL_NE_EMPTY]) THEN
519  POP_ASSUM (MP_TAC o REWRITE_RULE [INTERVAL_NE_EMPTY]) THEN
520  REPEAT STRIP_TAC THEN
521  EXISTS_TAC
522   “{interval
523    [(@f. f = if 1:num < l then (c:real) else (a:real)):real,
524     (@f. f = if 1:num < l then d else if 1:num = l then c else b)] |
525      l IN {1..1+1}} UNION
526     {interval
527    [(@f. f = if 1:num < l then c else if 1:num = l then d else a),
528     (@f. f = if 1:num < l then (d:real) else (b:real)):real] |
529      l IN {1..1+1}}” THEN
530  MATCH_MP_TAC(TAUT ‘b /\ (b ==> a) ==> a /\ b’) THEN CONJ_TAC THENL
531  [REWRITE_TAC[IN_UNION] THEN DISJ1_TAC THEN
532   SIMP_TAC std_ss [GSPECIFICATION] THEN EXISTS_TAC “1+1:num” THEN
533  SIMP_TAC std_ss [IN_NUMSEG, LESS_EQ_REFL, ARITH_PROVE “1 <= n + 1:num”],
534  DISCH_TAC] THEN
535  UNDISCH_TAC “interval [(c,d)] SUBSET interval [(a,b)]” THEN
536  GEN_REWR_TAC LAND_CONV [SUBSET_INTERVAL] THEN
537  ASM_REWRITE_TAC[DIVISION_OF] THEN DISCH_TAC THEN REPEAT CONJ_TAC THENL [
538    SIMP_TAC std_ss [GSYM IMAGE_DEF] THEN
539    SIMP_TAC std_ss [FINITE_UNION, IMAGE_FINITE, FINITE_NUMSEG]
540    ,
541    REWRITE_TAC[IN_UNION, TAUT ‘a \/ b ==> c <=> (a ==> c) /\ (b ==> c)’] THEN
542    SIMP_TAC std_ss [GSYM IMAGE_DEF, FORALL_AND_THM, FORALL_IN_IMAGE] THEN
543    ASM_SIMP_TAC std_ss [IN_NUMSEG, INTERVAL_NE_EMPTY] THEN
544    CONJ_TAC THEN X_GEN_TAC “l:num” THEN DISCH_TAC THEN
545    (CONJ_TAC THENL [ALL_TAC, MESON_TAC[]]) THEN
546    REPEAT STRIP_TAC THEN
547    REPEAT (COND_CASES_TAC THEN ASM_SIMP_TAC std_ss [])
548    ,
549    SIMP_TAC std_ss [IN_UNION, IMP_CONJ, RIGHT_FORALL_IMP_THM] THEN
550    SIMP_TAC std_ss [
551        SET_RULE “(!y. y IN {f x | x IN s} \/ y IN {g x | x IN s} ==> P y) <=>
552                  (!x. x IN s ==> P(f x) /\ P(g x))”
553      ] THEN
554    SIMP_TAC std_ss [GSYM FORALL_AND_THM, IN_NUMSEG] THEN
555    REWRITE_TAC[TAUT ‘(a ==> b) /\ (a ==> c) <=> a ==> b /\ c’] THEN
556    SIMP_TAC std_ss [GSYM RIGHT_FORALL_IMP_THM] THEN
557    ‘!l l'. (\l l'.
558               1:num <= l /\ l <= 2:num ==>
559               1:num <= l' /\ l' <= 2:num ==>
560               ((interval
561                 [(if 1 < l then c else a,
562                   if 1 < l then d else if 1 = l then c else b)] <>
563                 interval
564                 [(if 1 < l' then c else a,
565                   if 1 < l' then d else if 1 = l' then c else b)] ==>
566                 (interior
567                  (interval
568                   [(if 1 < l then c else a,
569                     if 1 < l then d else if 1 = l then c else b)]) INTER
570                  interior
571                  (interval
572                   [(if 1 < l' then c else a,
573                     if 1 < l' then d else if 1 = l' then c else b)]) =
574                  {})) /\
575                (interval
576                 [(if 1 < l then c else a,
577                   if 1 < l then d else if 1 = l then c else b)] <>
578                 interval
579                 [(if 1 < l' then c else if 1 = l' then d else a,
580                   if 1 < l' then d else b)] ==>
581                 (interior
582                  (interval
583                   [(if 1 < l then c else a,
584                     if 1 < l then d else if 1 = l then c else b)]) INTER
585                  interior
586                  (interval
587                   [(if 1 < l' then c else if 1 = l' then d else a,
588                     if 1 < l' then d else b)]) =
589                  {}))) /\
590               (interval
591                [(if 1 < l then c else if 1 = l then d else a,
592                  if 1 < l then d else b)] <>
593                interval
594                [(if 1 < l' then c else a,
595                  if 1 < l' then d else if 1 = l' then c else b)] ==>
596                (interior
597                 (interval
598                  [(if 1 < l then c else if 1 = l then d else a,
599                    if 1 < l then d else b)]) INTER
600                 interior
601                 (interval
602                  [(if 1 < l' then c else a,
603                    if 1 < l' then d else if 1 = l' then c else b)]) =
604                 {})) /\
605               (interval
606                [(if 1 < l then c else if 1 = l then d else a,
607                  if 1 < l then d else b)] <>
608                interval
609                [(if 1 < l' then c else if 1 = l' then d else a,
610                  if 1 < l' then d else b)] ==>
611                (interior
612                 (interval
613                  [(if 1 < l then c else if 1 = l then d else a,
614                    if 1 < l then d else b)]) INTER
615                 interior
616                 (interval
617                  [(if 1 < l' then c else if 1 = l' then d else a,
618                    if 1 < l' then d else b)]) = {}))) l l'’
619      suffices_by SIMP_TAC std_ss [] >>
620    MATCH_MP_TAC WLOG_LE THEN CONJ_TAC
621    >- (SIMP_TAC std_ss [] THEN REPEAT GEN_TAC THEN
622        ONCE_REWRITE_TAC[TAUT ‘a ==> b ==> c <=> b ==> a ==> c’] THEN
623        SIMP_TAC std_ss [simpLib.AC INTER_ASSOC INTER_COMM,
624                         simpLib.AC CONJ_ASSOC CONJ_COMM] THEN
625        MESON_TAC[]) >>
626    MAP_EVERY X_GEN_TAC [“l:num”, “m:num”] THEN
627    SIMP_TAC std_ss [] THEN
628    DISCH_TAC THEN STRIP_TAC THEN STRIP_TAC THEN
629    ONCE_REWRITE_TAC[TAUT ‘(~p ==> q) <=> (~q ==> p)’,
630                     METIS [] “(a <> b) = ~(a = b:real)”] THEN
631    REWRITE_TAC[INTERIOR_CLOSED_INTERVAL] THEN
632    REWRITE_TAC[
633        SET_RULE “(s INTER t = {}) <=> !x. ~(x IN s /\ x IN t)”,
634        METIS [] “(a <> b) = ~(a = b:real)”
635      ] THEN
636    ASM_SIMP_TAC std_ss [IN_NUMSEG, INTERVAL_NE_EMPTY, IN_INTERVAL,
637                         INTERIOR_CLOSED_INTERVAL] THEN
638    SIMP_TAC std_ss [GSYM FORALL_AND_THM] THEN
639    REWRITE_TAC[TAUT ‘(a ==> b) /\ (a ==> c) <=> a ==> b /\ c’] THEN
640    SIMP_TAC std_ss [NOT_FORALL_THM] THEN REPEAT CONJ_TAC THEN
641    DISCH_THEN(X_CHOOSE_TAC “x:real”) THEN
642    AP_TERM_TAC THEN SIMP_TAC std_ss [CONS_11, PAIR_EQ] THENL [
643        UNDISCH_TAC “l:num <= m” THEN GEN_REWR_TAC LAND_CONV [LESS_OR_EQ] THEN
644        STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
645        UNDISCH_TAC
646        “((if 1:num < l then c else a) < x:real ∧
647          x:real < if 1:num < l then d else if 1 = l then c else b) ∧
648         (if 1:num < m then c else a) < x:real ∧
649         x:real < if 1:num < m then d else if 1 = m then c else b” THEN
650        ASM_SIMP_TAC arith_ss [] THEN METIS_TAC [REAL_LT_ANTISYM]
651        ,
652        UNDISCH_TAC “l:num <= m” THEN GEN_REWR_TAC LAND_CONV [LESS_OR_EQ] THEN
653        STRIP_TAC THEN ASM_REWRITE_TAC[] THENL [
654            UNDISCH_TAC
655            “((if 1:num < l then c else a) < x:real /\
656              x:real < if 1:num < l then d else if 1 = l then c else b) /\
657             (if 1:num < m then c else if 1 = m then d else a) < x:real /\
658             x:real < if 1:num < m then d else b” THEN
659            ASM_SIMP_TAC arith_ss [] THEN METIS_TAC [REAL_LT_ANTISYM],
660            ALL_TAC] THEN
661        FIRST_X_ASSUM(SUBST_ALL_TAC o SYM) THEN
662        CONJ_TAC THEN ASM_CASES_TAC “1:num = l” THEN
663        ASM_SIMP_TAC arith_ss [LESS_REFL] THEN FIRST_X_ASSUM SUBST_ALL_TAC THEN
664        UNDISCH_TAC
665        “((if l:num < l then c else a) < x:real /\
666          x:real < if l:num < l then d else if l = l then c else b) /\
667         (if l:num < l then c else if l = l then d else a) < x:real /\
668         x:real < if l:num < l then d else b” THEN
669        ASM_SIMP_TAC arith_ss [LESS_REFL] THEN
670        ASM_REAL_ARITH_TAC
671        ,
672        UNDISCH_TAC “l:num <= m” THEN GEN_REWR_TAC LAND_CONV [LESS_OR_EQ] THEN
673        STRIP_TAC THEN ASM_REWRITE_TAC[] THENL [
674            UNDISCH_TAC
675            “((if 1:num < l then c else if 1 = l then d else a) < x:real /\
676              x:real < if 1:num < l then d else b) /\
677             (if 1:num < m then c else a) < x:real /\
678             x:real < if 1:num < m then d else if 1 = m then c else b” THEN
679            ASM_SIMP_TAC arith_ss [] THEN METIS_TAC [REAL_LT_ANTISYM],
680            ALL_TAC
681          ] THEN
682        FIRST_X_ASSUM(SUBST_ALL_TAC o SYM) THEN
683        CONJ_TAC THEN ASM_CASES_TAC “1:num = l” THEN
684        ASM_SIMP_TAC arith_ss [LESS_REFL] THEN FIRST_X_ASSUM SUBST_ALL_TAC THEN
685        UNDISCH_TAC
686        “((if l:num < l then c else if l = l then d else a) < x:real /\
687          x:real < if l:num < l then d else b) /\
688         (if l:num < l then c else a) < x:real /\
689         x:real < if l:num < l then d else if l = l then c else b” THEN
690        ASM_SIMP_TAC arith_ss [LESS_REFL] THEN
691        ASM_REAL_ARITH_TAC
692        ,
693        UNDISCH_TAC “l:num <= m” THEN GEN_REWR_TAC LAND_CONV [LESS_OR_EQ] THEN
694        STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
695        UNDISCH_TAC
696        “((if 1:num < l then c else if 1 = l then d else a) < x:real /\
697          x:real < if 1:num < l then d else b) /\
698         (if 1:num < m then c else if 1 = m then d else a) < x:real /\
699         x:real < if 1:num < m then d else b” THEN
700        ASM_SIMP_TAC arith_ss [] THEN METIS_TAC [REAL_LT_ANTISYM]
701      ]
702    ,
703    MATCH_MP_TAC SUBSET_ANTISYM THEN CONJ_TAC
704    >- (SIMP_TAC std_ss [IMP_CONJ, SUBSET_DEF, FORALL_IN_BIGUNION,
705                         GSYM IMAGE_DEF] THEN
706        SIMP_TAC std_ss [IN_BIGUNION, IN_INSERT, IN_UNION, FORALL_IN_IMAGE,
707                         RIGHT_FORALL_IMP_THM, FORALL_AND_THM,
708                         TAUT ‘(a \/ b ==> c) <=> (a ==> c) /\ (b ==> c)’] THEN
709        ASM_SIMP_TAC std_ss [IN_INTERVAL, IN_NUMSEG] THEN
710        REPEAT CONJ_TAC THEN GEN_TAC THEN DISCH_TAC THEN GEN_TAC THEN
711        METIS_TAC[REAL_LE_TRANS]) >>
712    FIRST_ASSUM(MATCH_MP_TAC o
713                MATCH_MP (SET_RULE “a IN s ==> (c DIFF a) SUBSET BIGUNION s ==>
714                                    c SUBSET BIGUNION s”)) THEN
715    REWRITE_TAC[SUBSET_DEF, IN_DIFF, IN_INTERVAL] THEN X_GEN_TAC “x:real” THEN
716    DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
717    SIMP_TAC std_ss [NOT_FORALL_THM, NOT_IMP] THEN
718    REWRITE_TAC [GSYM DE_MORGAN_THM] THEN DISCH_TAC THEN
719    SIMP_TAC std_ss [IN_BIGUNION] THEN ONCE_REWRITE_TAC [CONJ_SYM] THEN
720    SIMP_TAC std_ss [IN_BIGUNION, GSYM IMAGE_DEF, EXISTS_IN_IMAGE, IN_UNION,
721                     EXISTS_OR_THM, RIGHT_AND_OVER_OR] THEN
722    SIMP_TAC std_ss [GSYM EXISTS_OR_THM] THEN EXISTS_TAC “1:num” THEN
723    ASM_SIMP_TAC std_ss [IN_NUMSEG, IN_INTERVAL,
724                         ARITH_PROVE “x <= n ==> x <= n + 1:num”] THEN
725    POP_ASSUM (MP_TAC o REWRITE_RULE [DE_MORGAN_THM]) THEN
726    MATCH_MP_TAC MONO_OR THEN REWRITE_TAC[REAL_NOT_LE] THEN
727    METIS_TAC [REAL_LE_LT]
728  ]
729QED
730
731Theorem PARTIAL_DIVISION_EXTEND_INTERVAL:
732   !p a b:real.
733    p division_of (BIGUNION p) /\ (BIGUNION p) SUBSET interval[a,b]
734    ==> ?q. p SUBSET q /\ q division_of interval[a,b]
735Proof
736  REPEAT GEN_TAC THEN ASM_CASES_TAC ``p:(real->bool)->bool = {}`` THEN
737  ASM_REWRITE_TAC[EMPTY_SUBSET] THENL
738  [MESON_TAC[ELEMENTARY_INTERVAL], STRIP_TAC] THEN
739  FIRST_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_FINITE) THEN
740  SUBGOAL_THEN ``!k:real->bool. k IN p ==> ?q. q division_of interval[a,b] /\
741   k IN q`` MP_TAC THENL
742  [X_GEN_TAC ``k:real->bool`` THEN DISCH_TAC THEN
743   UNDISCH_TAC ``p division_of BIGUNION p`` THEN DISCH_TAC THEN
744   FIRST_ASSUM(MP_TAC o REWRITE_RULE [division_of]) THEN
745   ASM_REWRITE_TAC [] THEN STRIP_TAC THEN
746   UNDISCH_TAC ``(!k. k IN p ==>
747    k SUBSET BIGUNION p /\ k <> {} /\ ?a b. k = interval [(a,b)])`` THEN
748   DISCH_THEN (MP_TAC o SPEC ``k:real->bool``) THEN
749   ASM_REWRITE_TAC[] THEN STRIP_TAC THEN FIRST_X_ASSUM SUBST_ALL_TAC THEN
750   MATCH_MP_TAC PARTIAL_DIVISION_EXTEND_1 THEN ASM_SET_TAC[],
751   ALL_TAC] THEN
752  KNOW_TAC ``(!(k :real -> bool). ?(q :(real -> bool) -> bool).
753   k IN (p :(real -> bool) -> bool) ==>
754    q division_of interval [((a :real),(b :real))] /\ k IN q) ==>
755   ?(q :(real -> bool) -> bool).
756    p SUBSET q /\ q division_of interval [(a,b)]`` THENL
757  [ALL_TAC, METIS_TAC [GSYM RIGHT_EXISTS_IMP_THM]] THEN
758  SIMP_TAC std_ss [SKOLEM_THM] THEN
759  DISCH_THEN(X_CHOOSE_TAC ``q:(real->bool)->(real->bool)->bool``) THEN
760  SUBGOAL_THEN
761   ``?d. d division_of BIGINTER {BIGUNION (q i DELETE i) | (i:real->bool) IN p}``
762    MP_TAC THENL
763  [MATCH_MP_TAC ELEMENTARY_BIGINTER THEN SIMP_TAC std_ss [GSYM IMAGE_DEF] THEN
764   ASM_SIMP_TAC std_ss [IMAGE_EQ_EMPTY, IMAGE_FINITE] THEN
765   SIMP_TAC std_ss [FORALL_IN_IMAGE] THEN X_GEN_TAC ``k:real->bool`` THEN
766   DISCH_TAC THEN EXISTS_TAC ``(q k) DELETE (k:real->bool)`` THEN
767   MATCH_MP_TAC DIVISION_OF_SUBSET THEN
768   EXISTS_TAC ``(q:(real->bool)->(real->bool)->bool) k`` THEN
769   REWRITE_TAC[DELETE_SUBSET] THEN ASM_MESON_TAC[division_of],
770   ALL_TAC] THEN
771  DISCH_THEN(X_CHOOSE_TAC ``d:(real->bool)->bool``) THEN
772  EXISTS_TAC ``(d UNION p):(real->bool)->bool`` THEN
773  REWRITE_TAC[SUBSET_UNION] THEN
774  SUBGOAL_THEN ``interval[a:real,b] =
775   BIGINTER {BIGUNION (q i DELETE i) | i IN p} UNION
776   BIGUNION p`` SUBST1_TAC THENL
777  [SIMP_TAC std_ss [GSYM IMAGE_DEF] THEN MATCH_MP_TAC(SET_RULE
778   ``~(s = {}) /\ (!i. i IN s ==> (f i UNION i = t))
779    ==> (t = BIGINTER (IMAGE f s) UNION (BIGUNION s))``) THEN
780  ASM_REWRITE_TAC[] THEN X_GEN_TAC ``k:real->bool`` THEN DISCH_TAC THEN
781  BETA_TAC THEN MATCH_MP_TAC(SET_RULE
782   ``(BIGUNION k = s) /\ i IN k ==> (BIGUNION (k DELETE i) UNION i = s)``) THEN
783  ASM_MESON_TAC[division_of], ALL_TAC] THEN
784  MATCH_MP_TAC DIVISION_DISJOINT_UNION THEN ASM_REWRITE_TAC[] THEN
785  MATCH_MP_TAC INTER_INTERIOR_BIGUNION_INTERVALS THEN
786  ASM_REWRITE_TAC[OPEN_INTERIOR] THEN
787  CONJ_TAC THENL [ASM_MESON_TAC[division_of], ALL_TAC] THEN
788  X_GEN_TAC ``k:real->bool`` THEN DISCH_TAC THEN
789  MATCH_MP_TAC(SET_RULE
790   ``!s. u SUBSET s /\ (s INTER t = {}) ==> (u INTER t = {})``) THEN
791  EXISTS_TAC ``interior(BIGUNION(q k DELETE (k:real->bool)))`` THEN
792  CONJ_TAC THENL
793  [MATCH_MP_TAC SUBSET_INTERIOR THEN
794   MATCH_MP_TAC(SET_RULE ``x IN s ==> BIGINTER s SUBSET x``) THEN ASM_SET_TAC[],
795   ALL_TAC] THEN
796  ONCE_REWRITE_TAC[INTER_COMM] THEN
797  MATCH_MP_TAC INTER_INTERIOR_BIGUNION_INTERVALS THEN
798  REWRITE_TAC[OPEN_INTERIOR, FINITE_DELETE, IN_DELETE] THEN
799  ASM_MESON_TAC[division_of]
800QED
801
802Theorem ELEMENTARY_BOUNDED:
803   !s. (?p. p division_of s) ==> bounded s
804Proof
805  REWRITE_TAC[division_of] THEN
806  METIS_TAC[BOUNDED_BIGUNION, BOUNDED_INTERVAL]
807QED
808
809Theorem ELEMENTARY_SUBSET_INTERVAL:
810   !s. (?p. p division_of s) ==> ?a b. s SUBSET interval[a,b]
811Proof
812  MESON_TAC[ELEMENTARY_BOUNDED, BOUNDED_SUBSET_CLOSED_INTERVAL]
813QED
814
815Theorem DIVISION_UNION_INTERVALS_EXISTS:
816   !a b c d:real. ~(interval[a,b] = {})
817   ==> ?p. (interval[a,b] INSERT p) division_of
818   (interval[a,b] UNION interval[c,d])
819Proof
820  REPEAT STRIP_TAC THEN
821  ASM_CASES_TAC ``interval[c:real,d] = {}`` THENL
822  [ASM_REWRITE_TAC[UNION_EMPTY] THEN ASM_MESON_TAC[DIVISION_OF_SELF],
823   ALL_TAC] THEN
824  ASM_CASES_TAC ``interval[a:real,b] INTER interval[c,d] = {}`` THENL
825  [EXISTS_TAC ``{interval[c:real,d]}`` THEN
826   ONCE_REWRITE_TAC[SET_RULE ``{a;b} = {a} UNION {b}``] THEN
827   MATCH_MP_TAC DIVISION_DISJOINT_UNION THEN
828   ASM_SIMP_TAC std_ss [DIVISION_OF_SELF] THEN
829   MATCH_MP_TAC(SET_RULE
830   ``interior s SUBSET s /\ interior t SUBSET t /\ (s INTER t = {})
831     ==> (interior s INTER interior t = {})``) THEN
832   ASM_REWRITE_TAC[INTERIOR_SUBSET], ALL_TAC] THEN
833  SUBGOAL_THEN
834  ``?u v:real. interval[a,b] INTER interval[c,d] = interval[u,v]``
835   STRIP_ASSUME_TAC THENL [MESON_TAC[INTER_INTERVAL], ALL_TAC] THEN
836  MP_TAC(ISPECL [``c:real``, ``d:real``, ``u:real``, ``v:real``]
837   PARTIAL_DIVISION_EXTEND_1) THEN
838  KNOW_TAC ``interval [(u,v)] SUBSET interval [(c,d)] /\
839            (interval [(u,v)] <> {})`` THENL
840  [ASM_MESON_TAC[INTER_SUBSET], DISCH_TAC THEN ASM_REWRITE_TAC []] THEN
841  DISCH_THEN(X_CHOOSE_THEN ``p:(real->bool)->bool`` STRIP_ASSUME_TAC) THEN
842  EXISTS_TAC ``p DELETE interval[u:real,v]`` THEN
843  SUBGOAL_THEN ``interval[a:real,b] UNION interval[c,d] =
844   interval[a,b] UNION BIGUNION (p DELETE interval[u,v])``
845   SUBST1_TAC THENL
846  [UNDISCH_TAC ``p division_of interval [c,d]`` THEN DISCH_TAC THEN
847   FIRST_ASSUM(SUBST1_TAC o SYM o last o CONJUNCTS o
848   REWRITE_RULE [division_of]) THEN
849   ASM_SET_TAC[], ALL_TAC] THEN
850  ONCE_REWRITE_TAC[SET_RULE ``x INSERT s = {x} UNION s``] THEN
851  MATCH_MP_TAC DIVISION_DISJOINT_UNION THEN
852  ASM_SIMP_TAC std_ss [DIVISION_OF_SELF] THEN CONJ_TAC THENL
853  [MATCH_MP_TAC DIVISION_OF_SUBSET THEN
854   EXISTS_TAC ``p:(real->bool)->bool`` THEN
855   ASM_MESON_TAC[DIVISION_OF_UNION_SELF, DELETE_SUBSET],
856   ALL_TAC] THEN
857  REWRITE_TAC[GSYM INTERIOR_INTER] THEN
858  MATCH_MP_TAC EQ_TRANS THEN
859  EXISTS_TAC ``interior(interval[u:real,v] INTER
860   BIGUNION (p DELETE interval[u,v]))`` THEN
861  CONJ_TAC THENL
862  [AP_TERM_TAC THEN MATCH_MP_TAC(SET_RULE
863    ``!cd. p SUBSET cd /\ (uv = ab INTER cd)
864    ==> (ab INTER p = uv INTER p)``) THEN
865  EXISTS_TAC ``interval[c:real,d]`` THEN
866  ASM_REWRITE_TAC[BIGUNION_SUBSET, IN_DELETE] THEN
867  ASM_MESON_TAC[division_of],
868  REWRITE_TAC[INTERIOR_INTER] THEN
869  MATCH_MP_TAC INTER_INTERIOR_BIGUNION_INTERVALS THEN
870  REWRITE_TAC[IN_DELETE, OPEN_INTERIOR, FINITE_DELETE] THEN
871  ASM_MESON_TAC[division_of]]
872QED
873
874Theorem DIVISION_OF_BIGUNION:
875   !f. FINITE f /\
876  (!p. p IN f ==> p division_of (BIGUNION p)) /\
877  (!k1 k2. k1 IN BIGUNION f /\ k2 IN BIGUNION f /\ ~(k1 = k2)
878  ==> (interior k1 INTER interior k2 = {}))
879    ==> (BIGUNION f) division_of BIGUNION (BIGUNION f)
880Proof
881REWRITE_TAC[division_of] THEN
882SIMP_TAC std_ss [FINITE_BIGUNION] THEN SIMP_TAC std_ss [FORALL_IN_BIGUNION] THEN
883GEN_TAC THEN SET_TAC[]
884QED
885
886Theorem ELEMENTARY_UNION_INTERVAL_STRONG:
887   !p a b:real. p division_of (BIGUNION p)
888    ==> ?q. p SUBSET q /\ q division_of (interval[a,b] UNION BIGUNION p)
889Proof
890  REPEAT STRIP_TAC THEN ASM_CASES_TAC ``p:(real->bool)->bool = {}`` THENL
891  [ASM_REWRITE_TAC[BIGUNION_EMPTY, UNION_EMPTY, EMPTY_SUBSET] THEN
892   MESON_TAC[ELEMENTARY_INTERVAL],
893   ALL_TAC] THEN
894  ASM_CASES_TAC ``interval[a:real,b] = {}`` THEN
895  ASM_REWRITE_TAC[UNION_EMPTY] THENL [ASM_MESON_TAC[SUBSET_REFL], ALL_TAC] THEN
896  ASM_CASES_TAC ``interior(interval[a:real,b]) = {}`` THENL
897  [EXISTS_TAC ``interval[a:real,b] INSERT p`` THEN
898   REWRITE_TAC[division_of] THEN
899   UNDISCH_TAC ``p division_of BIGUNION p`` THEN DISCH_TAC THEN
900   FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [division_of]) THEN
901   SIMP_TAC std_ss [FINITE_INSERT, BIGUNION_INSERT] THEN ASM_SET_TAC[],
902   ALL_TAC] THEN
903  ASM_CASES_TAC ``interval[a:real,b] SUBSET BIGUNION p`` THENL
904  [ASM_SIMP_TAC std_ss [SET_RULE ``s SUBSET t ==> (s UNION t = t)``] THEN
905   ASM_MESON_TAC[SUBSET_REFL], ALL_TAC] THEN
906  SUBGOAL_THEN
907   ``!k:real->bool. k IN p
908     ==> ?q. ~(k IN q) /\ ~(q = {}) /\
909        (k INSERT q) division_of (interval[a,b] UNION k)``
910     MP_TAC THENL
911  [X_GEN_TAC ``k:real->bool`` THEN DISCH_TAC THEN
912   UNDISCH_TAC ``p division_of BIGUNION p`` THEN DISCH_TAC THEN
913   FIRST_ASSUM(MP_TAC o REWRITE_RULE [division_of]) THEN
914   DISCH_THEN(MP_TAC o SPEC ``k:real->bool`` o CONJUNCT1 o CONJUNCT2) THEN
915   ASM_REWRITE_TAC[] THEN
916   REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
917   SIMP_TAC std_ss [LEFT_IMP_EXISTS_THM] THEN
918   MAP_EVERY X_GEN_TAC [``c:real``, ``d:real``] THEN
919   DISCH_THEN SUBST_ALL_TAC THEN
920   ONCE_REWRITE_TAC[UNION_COMM] THEN
921   MP_TAC(ISPECL [``c:real``, ``d:real``, ``a:real``, ``b:real``]
922    DIVISION_UNION_INTERVALS_EXISTS) THEN
923   ASM_REWRITE_TAC[] THEN
924   DISCH_THEN(X_CHOOSE_TAC ``q:(real->bool)->bool``) THEN
925   EXISTS_TAC ``q DELETE interval[c:real,d]`` THEN
926   ASM_REWRITE_TAC[IN_DELETE, SET_RULE
927    ``x INSERT (q DELETE x) = x INSERT q``] THEN
928   DISCH_TAC THEN
929   UNDISCH_TAC ``(interval[c:real,d] INSERT q) division_of
930    (interval [c,d] UNION interval [a,b])`` THEN
931   ASM_SIMP_TAC std_ss [SET_RULE ``(s DELETE x = {}) ==> (x INSERT s = {x})``] THEN
932   REWRITE_TAC[division_of, BIGUNION_SING] THEN ASM_SET_TAC[], ALL_TAC] THEN
933  KNOW_TAC ``(!(k :real -> bool). ?(q :(real -> bool) -> bool).
934                k IN (p :(real -> bool) -> bool) ==>
935                k NOTIN q /\ q <> ({} :(real -> bool) -> bool) /\
936                k INSERT q division_of
937                 interval [((a :real),(b :real))] UNION k) ==>
938              ?(q :(real -> bool) -> bool).
939       p SUBSET q /\ q division_of interval [(a,b)] UNION BIGUNION p`` THENL
940  [ALL_TAC, METIS_TAC [GSYM RIGHT_EXISTS_IMP_THM]] THEN SIMP_TAC std_ss [SKOLEM_THM] THEN
941  DISCH_THEN(X_CHOOSE_TAC ``q:(real->bool)->(real->bool)->bool``) THEN
942  MP_TAC(ISPEC ``IMAGE (BIGUNION o (q:(real->bool)->(real->bool)->bool)) p``
943   ELEMENTARY_BIGINTER) THEN
944  FIRST_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_FINITE) THEN
945  ASM_SIMP_TAC std_ss [IMAGE_FINITE, IMAGE_EQ_EMPTY, FORALL_IN_IMAGE] THEN
946  KNOW_TAC ``(!(x :real -> bool).
947    x IN (p :(real -> bool) -> bool) ==> ?(p' :(real -> bool) -> bool).
948      p' division_of BIGUNION ((q :(real -> bool) -> (real -> bool) -> bool) x))`` THENL
949  [X_GEN_TAC ``k:real->bool`` THEN DISCH_TAC THEN
950   EXISTS_TAC ``(q:(real->bool)->(real->bool)->bool) k`` THEN
951   SIMP_TAC std_ss [o_THM] THEN MATCH_MP_TAC DIVISION_OF_SUBSET THEN
952   EXISTS_TAC ``(k:real->bool) INSERT q k`` THEN
953   CONJ_TAC THENL [ASM_MESON_TAC[DIVISION_OF_UNION_SELF], SET_TAC[]],
954   DISCH_TAC THEN ASM_REWRITE_TAC [] THEN
955   DISCH_THEN(X_CHOOSE_TAC ``r:(real->bool)->bool``)] THEN
956   EXISTS_TAC ``p UNION r:(real->bool)->bool`` THEN SIMP_TAC std_ss [SUBSET_UNION] THEN
957   SUBGOAL_THEN
958    ``interval[a:real,b] UNION BIGUNION p =
959     BIGUNION p UNION BIGINTER (IMAGE (BIGUNION o q) p)``
960     SUBST1_TAC THENL
961   [GEN_REWR_TAC I [EXTENSION] THEN X_GEN_TAC ``y:real`` THEN
962    REWRITE_TAC[IN_UNION] THEN
963    ASM_CASES_TAC ``(y:real) IN BIGUNION p`` THEN ASM_REWRITE_TAC[IN_BIGINTER] THEN
964    SIMP_TAC std_ss [FORALL_IN_BIGUNION, IMP_CONJ, FORALL_IN_IMAGE,
965     RIGHT_FORALL_IMP_THM] THEN
966    SUBGOAL_THEN
967    ``!k. k IN p ==> (BIGUNION(k INSERT q k) = interval[a:real,b] UNION k)``
968     MP_TAC THENL [ASM_MESON_TAC[division_of], ALL_TAC] THEN
969     SIMP_TAC std_ss [BIGUNION_INSERT, o_THM] THEN
970     GEN_REWR_TAC (LAND_CONV o ONCE_DEPTH_CONV) [EXTENSION] THEN
971     SIMP_TAC std_ss [GSYM RIGHT_FORALL_IMP_THM, IN_UNION] THEN
972    KNOW_TAC ``(!(x :real) (k :real -> bool).
973               k IN (p :(real -> bool) -> bool) ==>
974         (x IN k \/
975          x IN BIGUNION ((q :(real -> bool) -> (real -> bool) -> bool) k) <=>
976          x IN interval [((a :real),(b :real))] \/ x IN k)) ==>
977        ((y :real) IN interval [(a,b)] <=>
978        !(x :real -> bool). x IN p ==> y IN BIGUNION (q x))`` THENL
979   [ALL_TAC, METIS_TAC [SWAP_FORALL_THM]] THEN
980  DISCH_THEN(MP_TAC o SPEC ``y:real``) THEN
981  UNDISCH_TAC ``~((y:real) IN BIGUNION p)`` THEN
982  SIMP_TAC std_ss [IN_BIGUNION, NOT_EXISTS_THM, TAUT `~(a /\ b) <=> a ==> ~b`] THEN
983  ASM_CASES_TAC ``(y:real) IN interval[a,b]`` THEN
984  ASM_REWRITE_TAC[] THEN ASM_SET_TAC[], ALL_TAC] THEN
985  MATCH_MP_TAC DIVISION_DISJOINT_UNION THEN
986  ASM_REWRITE_TAC[] THEN ONCE_REWRITE_TAC[INTER_COMM] THEN
987  MATCH_MP_TAC INTER_INTERIOR_BIGUNION_INTERVALS THEN
988  ASM_REWRITE_TAC[OPEN_INTERIOR] THEN
989  CONJ_TAC THENL [ASM_MESON_TAC[division_of], ALL_TAC] THEN
990  X_GEN_TAC ``k:real->bool`` THEN DISCH_TAC THEN
991  ASM_SIMP_TAC std_ss [INTERIOR_FINITE_BIGINTER, IMAGE_FINITE] THEN
992  MATCH_MP_TAC(SET_RULE ``(?x. x IN p /\ (f x INTER s = {}))
993   ==> (BIGINTER (IMAGE f p) INTER s = {})``) THEN
994  SIMP_TAC std_ss [EXISTS_IN_IMAGE, o_THM] THEN EXISTS_TAC ``k:real->bool`` THEN
995  ASM_REWRITE_TAC[] THEN
996  ONCE_REWRITE_TAC[INTER_COMM] THEN
997  MATCH_MP_TAC INTER_INTERIOR_BIGUNION_INTERVALS THEN
998  ASM_REWRITE_TAC[OPEN_INTERIOR] THEN REPEAT CONJ_TAC THENL
999  [ASM_MESON_TAC[division_of, FINITE_INSERT, IN_INSERT],
1000   ASM_MESON_TAC[division_of, FINITE_INSERT, IN_INSERT],
1001   ALL_TAC] THEN
1002  UNDISCH_TAC ``!k. k IN p ==> k NOTIN q k /\ q k <> {} /\
1003          k INSERT q k division_of interval [(a,b)] UNION k`` THEN DISCH_TAC THEN
1004  FIRST_X_ASSUM(MP_TAC o SPEC ``k:real->bool``) THEN
1005  ASM_REWRITE_TAC[division_of, IN_INSERT] THEN
1006REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_MESON_TAC[]
1007QED
1008
1009Theorem ELEMENTARY_UNION_INTERVAL:
1010   !p a b:real. p division_of (BIGUNION p)
1011   ==> ?q. q division_of (interval[a,b] UNION BIGUNION p)
1012Proof
1013 MESON_TAC[ELEMENTARY_UNION_INTERVAL_STRONG]
1014QED
1015
1016Theorem ELEMENTARY_BIGUNION_INTERVALS:
1017   !f. FINITE f /\
1018  (!s. s IN f ==> ?a b:real. s = interval[a,b])
1019    ==> (?p. p division_of (BIGUNION f))
1020Proof
1021  REWRITE_TAC[IMP_CONJ] THEN
1022  KNOW_TAC ``!f. ((!s. s IN f ==> ?a b. s = interval [(a,b)]) ==>
1023            ?p. p division_of BIGUNION f) =
1024             (\f. (!s. s IN f ==> ?a b. s = interval [(a,b)]) ==>
1025            ?p. p division_of BIGUNION f) f`` THENL
1026  [SIMP_TAC std_ss [], DISC_RW_KILL] THEN
1027  MATCH_MP_TAC FINITE_INDUCT THEN BETA_TAC THEN
1028  SIMP_TAC std_ss [BIGUNION_EMPTY, BIGUNION_INSERT, ELEMENTARY_EMPTY] THEN
1029  SIMP_TAC std_ss [GSYM RIGHT_FORALL_IMP_THM] THEN
1030  SIMP_TAC std_ss [IN_INSERT, TAUT `a \/ b ==> c <=> (a ==> c) /\ (b ==> c)`] THEN
1031  SIMP_TAC std_ss [FORALL_AND_THM, LEFT_FORALL_IMP_THM, EXISTS_REFL] THEN
1032  REPEAT GEN_TAC THEN ONCE_REWRITE_TAC [METIS [] ``(a ==> b ==> c ==> d) =
1033    (c ==> a ==> b ==> d)``] THEN STRIP_TAC THEN
1034  ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN
1035  SUBGOAL_THEN ``BIGUNION s:real->bool = BIGUNION p`` SUBST1_TAC THENL
1036  [METIS_TAC[division_of], ALL_TAC] THEN
1037  MATCH_MP_TAC ELEMENTARY_UNION_INTERVAL THEN ASM_MESON_TAC[division_of]
1038QED
1039
1040Theorem ELEMENTARY_UNION:
1041   !s t:real->bool.
1042   (?p. p division_of s) /\ (?p. p division_of t)
1043   ==> (?p. p division_of (s UNION t))
1044Proof
1045  REPEAT GEN_TAC THEN DISCH_THEN
1046  (CONJUNCTS_THEN2 (X_CHOOSE_TAC ``p1:(real->bool)->bool``)
1047  (X_CHOOSE_TAC ``p2:(real->bool)->bool``)) THEN
1048  SUBGOAL_THEN ``s UNION t :real->bool = BIGUNION p1 UNION BIGUNION p2``
1049   SUBST1_TAC THENL [ASM_MESON_TAC[division_of], ALL_TAC] THEN
1050  REWRITE_TAC[SET_RULE ``BIGUNION p1 UNION BIGUNION p2 = BIGUNION (p1 UNION p2)``] THEN
1051  MATCH_MP_TAC ELEMENTARY_BIGUNION_INTERVALS THEN
1052  REWRITE_TAC[IN_UNION, FINITE_UNION] THEN
1053  ASM_MESON_TAC[division_of]
1054QED
1055
1056Theorem PARTIAL_DIVISION_EXTEND:
1057   !p q s t:real->bool.
1058    p division_of s /\ q division_of t /\ s SUBSET t
1059    ==> ?r. p SUBSET r /\ r division_of t
1060Proof
1061  REPEAT STRIP_TAC THEN
1062  SUBGOAL_THEN ``?a b:real. t SUBSET interval[a,b]`` MP_TAC THENL
1063  [ASM_MESON_TAC[ELEMENTARY_SUBSET_INTERVAL], ALL_TAC] THEN
1064  SIMP_TAC std_ss [LEFT_IMP_EXISTS_THM] THEN
1065  MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``] THEN DISCH_TAC THEN
1066  SUBGOAL_THEN ``?r1. p SUBSET r1 /\ r1 division_of interval[a:real,b]``
1067   STRIP_ASSUME_TAC THENL
1068  [MATCH_MP_TAC PARTIAL_DIVISION_EXTEND_INTERVAL THEN
1069   ASM_MESON_TAC[division_of, SUBSET_TRANS], ALL_TAC] THEN
1070  SUBGOAL_THEN ``?r2:(real->bool)->bool.
1071    r2 division_of (BIGUNION (r1 DIFF p)) INTER (BIGUNION q)``
1072    STRIP_ASSUME_TAC THENL
1073  [MATCH_MP_TAC ELEMENTARY_INTER THEN
1074   ASM_MESON_TAC[FINITE_DIFF, IN_DIFF, division_of,
1075    ELEMENTARY_BIGUNION_INTERVALS], ALL_TAC] THEN
1076  EXISTS_TAC ``p UNION r2:(real->bool)->bool`` THEN
1077  CONJ_TAC THENL [SET_TAC[], ALL_TAC] THEN
1078  SUBGOAL_THEN
1079   ``t:real->bool = BIGUNION p UNION (BIGUNION (r1 DIFF p) INTER BIGUNION q)``
1080   SUBST1_TAC THENL
1081  [REPEAT(FIRST_X_ASSUM(MP_TAC o last o CONJUNCTS o
1082    REWRITE_RULE [division_of])) THEN
1083  REPEAT(POP_ASSUM MP_TAC) THEN SET_TAC[],
1084  MATCH_MP_TAC DIVISION_DISJOINT_UNION THEN ASM_REWRITE_TAC[] THEN
1085  CONJ_TAC THENL [ASM_MESON_TAC[division_of], ALL_TAC] THEN
1086  MATCH_MP_TAC(SET_RULE
1087   ``!t'. t SUBSET t' /\ (s INTER t' = {}) ==> (s INTER t = {})``) THEN
1088  EXISTS_TAC ``interior(BIGUNION (r1 DIFF p)):real->bool`` THEN
1089  CONJ_TAC THENL [MATCH_MP_TAC SUBSET_INTERIOR THEN SET_TAC[], ALL_TAC] THEN
1090  REPEAT(MATCH_MP_TAC INTER_INTERIOR_BIGUNION_INTERVALS THEN
1091  REWRITE_TAC[OPEN_INTERIOR] THEN REPEAT(CONJ_TAC THENL
1092  [ASM_MESON_TAC[IN_DIFF, FINITE_DIFF, division_of], ALL_TAC]) THEN
1093  REWRITE_TAC[IN_DIFF] THEN REPEAT STRIP_TAC THEN
1094  ONCE_REWRITE_TAC[INTER_COMM]) THEN
1095  ASM_MESON_TAC[division_of, SUBSET_DEF]]
1096QED
1097
1098Theorem INTERVAL_SUBDIVISION:
1099   !a b c:real. c IN interval[a,b]
1100   ==> (IMAGE (\s. interval[(@f. f = if 1:num IN s then c else a),
1101                            (@f. f = if 1:num IN s then b else c)])
1102        {s | s SUBSET {1:num..1:num}}) division_of interval[a,b]
1103Proof
1104  REPEAT STRIP_TAC THEN
1105  FIRST_ASSUM(ASSUME_TAC o REWRITE_RULE [IN_INTERVAL]) THEN
1106  REWRITE_TAC[DIVISION_OF] THEN
1107  SIMP_TAC std_ss [IMAGE_FINITE, FINITE_POWERSET, FINITE_NUMSEG] THEN
1108  SIMP_TAC std_ss [IMP_CONJ, RIGHT_FORALL_IMP_THM, FORALL_IN_IMAGE] THEN
1109  SIMP_TAC std_ss [FORALL_IN_GSPEC, SUBSET_INTERVAL, INTERVAL_NE_EMPTY] THEN
1110  REWRITE_TAC[INTERIOR_CLOSED_INTERVAL] THEN REPEAT CONJ_TAC THENL
1111  [METIS_TAC[REAL_LE_TRANS],
1112   X_GEN_TAC ``s:num->bool`` THEN DISCH_TAC THEN
1113   X_GEN_TAC ``s':num->bool`` THEN DISCH_TAC THEN
1114   REWRITE_TAC[SET_RULE
1115    ``(~p ==> (s INTER t = {})) <=> (!x. x IN s /\ x IN t ==> p)``,
1116      METIS [] ``(a <> b) = ~(a = b)``] THEN
1117   X_GEN_TAC ``x:real`` THEN SIMP_TAC std_ss [IN_INTERVAL, GSYM FORALL_AND_THM] THEN
1118   ASM_CASES_TAC ``s':num->bool = s`` THEN ASM_REWRITE_TAC[] THEN
1119   FIRST_X_ASSUM(MP_TAC o MATCH_MP (SET_RULE
1120    ``~(s' = s) ==> ?x. x IN s' /\ ~(x IN s) \/ x IN s /\ ~(x IN s')``)) THEN
1121  FULL_SIMP_TAC std_ss [NUMSEG_SING, IN_SING, SUBSET_DEF] THEN
1122  DISCH_THEN(X_CHOOSE_THEN ``k:num`` STRIP_ASSUME_TAC) THEN
1123  (POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
1124  POP_ASSUM (MP_TAC o Q.SPEC `k:num`) THEN POP_ASSUM (MP_TAC o Q.SPEC `k:num`) THEN
1125  DISCH_TAC THEN DISCH_TAC THEN DISCH_TAC THEN DISCH_TAC THEN
1126  FULL_SIMP_TAC std_ss [] THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
1127  ASM_REWRITE_TAC [] THEN DISCH_TAC THEN DISCH_TAC THEN
1128  ASM_REWRITE_TAC [] THEN METIS_TAC [REAL_LT_ANTISYM]),
1129  MATCH_MP_TAC SUBSET_ANTISYM THEN CONJ_TAC THEN
1130  GEN_REWR_TAC I [SUBSET_DEF] THENL
1131  [SIMP_TAC std_ss [FORALL_IN_BIGUNION] THEN
1132   KNOW_TAC ``(!(x :real) (t :real -> bool).
1133                 t IN IMAGE (\(s :num -> bool).
1134       interval
1135         [(if  1n IN s then (c :real) else (a :real),
1136           if  1n IN s then (b :real) else c)])
1137    {s | s SUBSET { 1n ..  1n}} /\ x IN t ==>
1138                                  x IN interval [(a,b)])`` THENL
1139  [ALL_TAC, METIS_TAC [SWAP_FORALL_THM]] THEN
1140  SIMP_TAC std_ss [IMP_CONJ, FORALL_IN_IMAGE, FORALL_IN_GSPEC] THEN
1141  KNOW_TAC ``(!(s :num -> bool) (x :real).
1142          s SUBSET { 1n ..  1n} ==>
1143          x IN interval
1144    [(if  1n IN s then (c :real) else (a :real),
1145      if  1n IN s then (b :real) else c)] ==>
1146                                x IN interval [(a,b)])`` THENL
1147   [ALL_TAC, METIS_TAC [SWAP_FORALL_THM]] THEN
1148   SIMP_TAC std_ss [RIGHT_FORALL_IMP_THM, GSYM SUBSET_DEF] THEN
1149   SIMP_TAC std_ss [SUBSET_INTERVAL] THEN
1150   METIS_TAC[REAL_LE_TRANS, REAL_LE_REFL],
1151   X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN
1152   REWRITE_TAC [IN_BIGUNION] THEN ONCE_REWRITE_TAC [CONJ_SYM] THEN
1153   SIMP_TAC std_ss [EXISTS_IN_IMAGE, EXISTS_IN_GSPEC] THEN
1154   EXISTS_TAC ``{i | i IN {1:num..1:num} /\ (c:real) <= (x:real)}`` THEN
1155   CONJ_TAC THENL [SET_TAC[], REWRITE_TAC[IN_INTERVAL]] THEN
1156   SIMP_TAC std_ss [GSPECIFICATION, IN_NUMSEG] THEN
1157   RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN
1158   METIS_TAC[REAL_LE_TOTAL]]]
1159QED
1160
1161Theorem DIVISION_OF_NONTRIVIAL:
1162   !s a b:real.
1163    s division_of interval[a,b] /\ ~(content(interval[a,b]) = &0)
1164    ==> {k | k IN s /\ ~(content k = &0)} division_of interval[a,b]
1165Proof
1166  REPEAT GEN_TAC THEN completeInduct_on `CARD(s:(real->bool)->bool)` THEN
1167  GEN_TAC THEN DISCH_TAC THEN FULL_SIMP_TAC std_ss [] THEN POP_ASSUM K_TAC THEN
1168  REPEAT STRIP_TAC THEN
1169  ASM_CASES_TAC ``{k:real->bool | k IN s /\ ~(content k = &0)} = s`` THEN
1170  ASM_REWRITE_TAC[] THEN
1171  FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [EXTENSION]) THEN
1172  SIMP_TAC std_ss [GSPECIFICATION, NOT_FORALL_THM, LEFT_IMP_EXISTS_THM] THEN
1173  REWRITE_TAC[TAUT `~(a /\ ~b <=> a) <=> a /\ b`] THEN
1174  X_GEN_TAC ``k:real->bool`` THEN STRIP_TAC THEN
1175  FIRST_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_FINITE) THEN
1176  UNDISCH_TAC `` !(m :num).
1177        m < CARD (s :(real -> bool) -> bool) ==>
1178        !(s :(real -> bool) -> bool).
1179          (m = CARD s) ==>
1180          s division_of interval [((a :real),(b :real))] /\
1181          content (interval [(a,b)]) <> (0 :real) ==>
1182          {k | k IN s /\ content k <> (0 :real)} division_of
1183          interval [(a,b)]`` THEN DISCH_TAC THEN
1184  FIRST_X_ASSUM(MP_TAC o SPEC ``CARD (s DELETE (k:real->bool))``) THEN
1185  ASM_SIMP_TAC std_ss [CARD_DELETE, ARITH_PROVE ``n - 1 < n <=> ~(n = 0:num)``] THEN
1186  ASM_SIMP_TAC std_ss [CARD_EQ_0] THEN
1187  KNOW_TAC ``(s :(real -> bool) -> bool) <> {}`` THENL [ASM_SET_TAC[],
1188   DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
1189  DISCH_THEN (MP_TAC o SPEC ``(s :(real -> bool) -> bool) DELETE k``) THEN
1190  ASM_SIMP_TAC std_ss [CARD_DELETE, ARITH_PROVE ``n - 1 < n <=> ~(n = 0:num)``] THEN
1191  KNOW_TAC ``s DELETE (k:real->bool) division_of interval [(a,b)]`` THENL
1192  [ALL_TAC,
1193   DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
1194   MATCH_MP_TAC EQ_IMPLIES THEN AP_THM_TAC THEN AP_TERM_TAC THEN
1195   ASM_SET_TAC[]] THEN
1196  REWRITE_TAC[DIVISION_OF] THEN
1197  UNDISCH_TAC ``s division_of interval [(a,b)]`` THEN DISCH_TAC THEN
1198  FIRST_X_ASSUM(STRIP_ASSUME_TAC o REWRITE_RULE [division_of]) THEN
1199  ASM_SIMP_TAC std_ss [FINITE_DELETE, IN_DELETE] THEN
1200  FIRST_ASSUM(MP_TAC o C MATCH_MP (ASSUME ``(k:real->bool) IN s``)) THEN
1201  REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
1202  SIMP_TAC std_ss [LEFT_IMP_EXISTS_THM] THEN
1203  MAP_EVERY X_GEN_TAC [``c:real``, ``d:real``] THEN
1204  DISCH_THEN SUBST_ALL_TAC THEN
1205  MATCH_MP_TAC(SET_RULE
1206   ``(BIGUNION s = i) /\ k SUBSET BIGUNION(s DELETE k)
1207   ==> (BIGUNION(s DELETE k) = i)``) THEN
1208  ASM_REWRITE_TAC[] THEN MATCH_MP_TAC(MESON[CLOSED_LIMPT, SUBSET_DEF]
1209   ``closed s /\ (!x. x IN k ==> x limit_point_of s) ==> k SUBSET s``) THEN
1210  CONJ_TAC THENL
1211  [MATCH_MP_TAC CLOSED_BIGUNION THEN
1212   ASM_REWRITE_TAC[FINITE_DELETE, IN_DELETE] THEN
1213   ASM_MESON_TAC[CLOSED_INTERVAL],
1214   ALL_TAC] THEN
1215  X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN REWRITE_TAC[LIMPT_APPROACHABLE] THEN
1216  X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN REWRITE_TAC[dist] THEN
1217  SUBGOAL_THEN ``?y:real. y IN BIGUNION s /\ ~(y IN interval[c,d]) /\
1218   ~(y = x) /\ abs(y - x) < e``
1219  MP_TAC THENL [ALL_TAC, SET_TAC[]] THEN ASM_REWRITE_TAC[] THEN
1220  MAP_EVERY UNDISCH_TAC
1221  [``~(content(interval[a:real,b]) = &0)``,
1222     ``content(interval[c:real,d]) = &0``] THEN
1223  SIMP_TAC std_ss [CONTENT_EQ_0, NOT_EXISTS_THM] THEN
1224  DISCH_TAC THEN ASM_REWRITE_TAC[REAL_NOT_LE] THEN
1225  DISCH_TAC THEN UNDISCH_TAC ``~(interval[c:real,d] = {})`` THEN
1226  SIMP_TAC std_ss [GSYM INTERVAL_EQ_EMPTY, NOT_EXISTS_THM] THEN
1227  ASM_REWRITE_TAC[REAL_NOT_LT] THEN
1228  ASM_SIMP_TAC std_ss [REAL_ARITH ``a <= b ==> (b <= a <=> (a = b:real))``] THEN
1229  DISCH_THEN(fn th => SUBST_ALL_TAC th THEN ASSUME_TAC th) THEN
1230  UNDISCH_TAC ``interval[c:real,c] SUBSET interval[a,b]`` THEN
1231  REWRITE_TAC[SUBSET_DEF] THEN DISCH_THEN(MP_TAC o SPEC ``x:real``) THEN
1232  ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
1233  MP_TAC(ASSUME ``(x:real) IN interval[c,c]``) THEN
1234  GEN_REWR_TAC LAND_CONV [IN_INTERVAL] THEN
1235  ASM_REWRITE_TAC[] THEN
1236  ASM_SIMP_TAC std_ss [REAL_ARITH ``(d = c) ==> (c <= x /\ x <= d <=> (x = c:real))``] THEN
1237  DISCH_TAC THEN
1238  MP_TAC(ASSUME ``(x:real) IN interval[a,b]``) THEN
1239  GEN_REWR_TAC LAND_CONV [IN_INTERVAL] THEN ASM_REWRITE_TAC[] THEN
1240  STRIP_TAC THEN EXISTS_TAC
1241  ``(@f. f = if (c:real) <= ((a:real) + (b:real)) / &2
1242             then c + min e (b - c) / &2
1243             else c - min e (c - a) / &2)`` THEN
1244  SIMP_TAC std_ss [IN_INTERVAL] THEN REPEAT CONJ_TAC THENL
1245  [FULL_SIMP_TAC std_ss [IN_INTERVAL, min_def] THEN
1246   REPEAT COND_CASES_TAC THEN
1247   FULL_SIMP_TAC real_ss [REAL_ARITH ``a <= b - c / 2 <=> c / 2 <= b - a:real``,
1248    REAL_ARITH ``a <= b + c / 2 <=> a - b <= c / 2:real``,
1249    REAL_ARITH ``c + e / 2 <= b <=> e / 2 <= b - c:real``,
1250    REAL_ARITH ``c - e / 2 <= b <=> c - b <= e / 2:real``,
1251    REAL_LE_RDIV_EQ, REAL_LE_LDIV_EQ] THEN
1252   UNDISCH_TAC ``0 < e:real`` THEN POP_ASSUM MP_TAC THEN
1253   POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
1254   POP_ASSUM MP_TAC THEN REAL_ARITH_TAC,
1255   FULL_SIMP_TAC std_ss [IN_INTERVAL, min_def] THEN
1256   REPEAT COND_CASES_TAC THEN
1257   FULL_SIMP_TAC real_ss [REAL_ARITH ``a <= b - c / 2 <=> c / 2 <= b - a:real``,
1258    REAL_ARITH ``a <= b + c / 2 <=> a - b <= c / 2:real``,
1259    REAL_ARITH ``c + e / 2 <= b <=> e / 2 <= b - c:real``,
1260    REAL_ARITH ``c - e / 2 <= b <=> c - b <= e / 2:real``,
1261    REAL_LE_RDIV_EQ, REAL_LE_LDIV_EQ] THEN
1262   UNDISCH_TAC ``0 < e:real`` THEN POP_ASSUM MP_TAC THEN
1263   POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
1264   POP_ASSUM MP_TAC THEN REAL_ARITH_TAC,
1265   FULL_SIMP_TAC std_ss [IN_INTERVAL, min_def] THEN
1266   REPEAT COND_CASES_TAC THEN
1267   FULL_SIMP_TAC real_ss [REAL_ARITH ``a <= b - c / 2 <=> c / 2 <= b - a:real``,
1268    REAL_ARITH ``a <= b + c / 2 <=> a - b <= c / 2:real``,
1269    REAL_ARITH ``c + e / 2 <= b <=> e / 2 <= b - c:real``,
1270    REAL_ARITH ``c - e / 2 <= b <=> c - b <= e / 2:real``,
1271    REAL_LE_RDIV_EQ, REAL_LE_LDIV_EQ] THENL
1272    [ASM_REWRITE_TAC [REAL_NOT_LE],
1273     REWRITE_TAC [REAL_NOT_LE] THEN
1274     POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
1275     POP_ASSUM MP_TAC THEN UNDISCH_TAC ``a < b:real`` THEN
1276     UNDISCH_TAC ``0 < e:real`` THEN REAL_ARITH_TAC,
1277     ASM_REWRITE_TAC [REAL_NOT_LE],
1278     REWRITE_TAC [REAL_NOT_LE] THEN
1279     POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
1280     POP_ASSUM MP_TAC THEN UNDISCH_TAC ``a < b:real`` THEN
1281     UNDISCH_TAC ``0 < e:real`` THEN REAL_ARITH_TAC],
1282    FULL_SIMP_TAC std_ss [IN_INTERVAL, min_def] THEN
1283    REPEAT COND_CASES_TAC THEN
1284    FULL_SIMP_TAC real_ss [REAL_ARITH ``a <= b - c / 2 <=> c / 2 <= b - a:real``,
1285     REAL_ARITH ``a <= b + c / 2 <=> a - b <= c / 2:real``,
1286     REAL_ARITH ``c + e / 2 <= b <=> e / 2 <= b - c:real``,
1287     REAL_ARITH ``c - e / 2 <= b <=> c - b <= e / 2:real``,
1288     REAL_LE_RDIV_EQ, REAL_LE_LDIV_EQ] THENL
1289    [REWRITE_TAC [REAL_ARITH ``(a + b <> a) <=> (0 <> b:real)``] THEN
1290     ASM_SIMP_TAC std_ss [REAL_LT_IMP_NE, REAL_HALF],
1291     REWRITE_TAC [REAL_ARITH ``(a + b <> a) <=> (0 <> b:real)``] THEN
1292     MATCH_MP_TAC REAL_LT_IMP_NE THEN SIMP_TAC real_ss [REAL_LT_RDIV_EQ] THEN
1293     POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
1294     POP_ASSUM MP_TAC THEN UNDISCH_TAC ``a < b:real`` THEN
1295     UNDISCH_TAC ``0 < e:real`` THEN REAL_ARITH_TAC,
1296     REWRITE_TAC [REAL_ARITH ``(a - b <> a) <=> (0 <> b:real)``] THEN
1297     ASM_SIMP_TAC std_ss [REAL_LT_IMP_NE, REAL_HALF],
1298     REWRITE_TAC [REAL_ARITH ``(a - b <> a) <=> (0 <> b:real)``] THEN
1299     MATCH_MP_TAC REAL_LT_IMP_NE THEN SIMP_TAC real_ss [REAL_LT_RDIV_EQ] THEN
1300     POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
1301     POP_ASSUM MP_TAC THEN UNDISCH_TAC ``a < b:real`` THEN
1302     UNDISCH_TAC ``0 < e:real`` THEN REAL_ARITH_TAC],
1303   FULL_SIMP_TAC std_ss [IN_INTERVAL, min_def, abs] THEN
1304   REPEAT COND_CASES_TAC THEN
1305   FULL_SIMP_TAC real_ss [REAL_ARITH ``a <= b - c / 2 <=> c / 2 <= b - a:real``,
1306    REAL_ARITH ``a <= b + c / 2 <=> a - b <= c / 2:real``,
1307    REAL_ARITH ``c + e / 2 <= b <=> e / 2 <= b - c:real``,
1308    REAL_ARITH ``c - e / 2 <= b <=> c - b <= e / 2:real``,
1309    REAL_LE_RDIV_EQ, REAL_LE_LDIV_EQ, REAL_LT_RDIV_EQ, REAL_LT_LDIV_EQ] THENL
1310   [UNDISCH_TAC ``0 < e:real`` THEN REAL_ARITH_TAC,
1311    POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
1312     POP_ASSUM MP_TAC THEN UNDISCH_TAC ``a < b:real`` THEN
1313     UNDISCH_TAC ``0 < e:real`` THEN REAL_ARITH_TAC,
1314    REWRITE_TAC [REAL_ARITH ``a - b - a < e <=> -e < b:real``] THEN
1315    SIMP_TAC real_ss [REAL_LT_RDIV_EQ] THEN
1316    UNDISCH_TAC ``0 < e:real`` THEN REAL_ARITH_TAC,
1317    REWRITE_TAC [REAL_ARITH ``a - b - a < e <=> -e < b:real``] THEN
1318    SIMP_TAC real_ss [REAL_LT_RDIV_EQ] THEN
1319     POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
1320     POP_ASSUM MP_TAC THEN UNDISCH_TAC ``a < b:real`` THEN
1321     UNDISCH_TAC ``0 < e:real`` THEN REAL_ARITH_TAC,
1322    REWRITE_TAC [REAL_ARITH ``a - (a + b) < e <=> -e < b:real``] THEN
1323     SIMP_TAC real_ss [REAL_LT_RDIV_EQ] THEN
1324    UNDISCH_TAC ``0 < e:real`` THEN REAL_ARITH_TAC,
1325    REWRITE_TAC [REAL_ARITH ``a - (a + b) < e <=> -e < b:real``] THEN
1326     SIMP_TAC real_ss [REAL_LT_RDIV_EQ] THEN
1327    POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
1328     POP_ASSUM MP_TAC THEN UNDISCH_TAC ``a < b:real`` THEN
1329     UNDISCH_TAC ``0 < e:real`` THEN REAL_ARITH_TAC,
1330     UNDISCH_TAC ``0 < e:real`` THEN REAL_ARITH_TAC,
1331     POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
1332     POP_ASSUM MP_TAC THEN UNDISCH_TAC ``a < b:real`` THEN
1333     UNDISCH_TAC ``0 < e:real`` THEN REAL_ARITH_TAC]]
1334QED
1335
1336Theorem DIVISION_OF_AFFINITY:
1337   !d s:real->bool m c.
1338    IMAGE (IMAGE (\x. m * x + c)) d division_of (IMAGE (\x. m * x + c) s) <=>
1339    if m = &0 then if s = {} then (d = {})
1340                   else ~(d = {}) /\ !k. k IN d ==> ~(k = {})
1341    else d division_of s
1342Proof
1343  REPEAT GEN_TAC THEN ASM_CASES_TAC ``m = &0:real`` THEN ASM_REWRITE_TAC[] THENL
1344  [ASM_CASES_TAC ``s:real->bool = {}`` THEN
1345   ASM_REWRITE_TAC[IMAGE_EMPTY, IMAGE_INSERT, DIVISION_OF_TRIVIAL, IMAGE_EQ_EMPTY] THEN
1346   ASM_CASES_TAC ``d:(real->bool)->bool = {}`` THEN
1347   ASM_REWRITE_TAC[IMAGE_EMPTY, IMAGE_INSERT, EMPTY_DIVISION_OF, BIGUNION_EMPTY,
1348    IMAGE_EQ_EMPTY] THEN
1349   REWRITE_TAC[REAL_MUL_LZERO, REAL_ADD_LID] THEN
1350   ASM_SIMP_TAC std_ss [SET_RULE ``~(s = {}) ==> (IMAGE (\x. c) s = {c})``] THEN
1351   ASM_CASES_TAC ``!k:real->bool. k IN d ==> ~(k = {})`` THEN
1352   ASM_REWRITE_TAC[division_of] THENL
1353   [ALL_TAC,
1354    SIMP_TAC std_ss [FORALL_IN_IMAGE] THEN ASM_MESON_TAC[IMAGE_EQ_EMPTY]] THEN
1355   SUBGOAL_THEN
1356    ``IMAGE (IMAGE ((\x. c):real->real)) d = {{c}}``
1357    SUBST1_TAC THENL
1358   [GEN_REWR_TAC I [EXTENSION] THEN
1359    REWRITE_TAC[IN_IMAGE, IN_SING] THEN ASM_SET_TAC[],
1360    SIMP_TAC std_ss [BIGUNION_SING, FINITE_SING, IN_SING, IMP_CONJ] THEN
1361    REWRITE_TAC[SUBSET_REFL, NOT_INSERT_EMPTY] THEN
1362    METIS_TAC[INTERVAL_SING]],
1363  REWRITE_TAC[division_of] THEN
1364  SIMP_TAC std_ss [IMP_CONJ, RIGHT_FORALL_IMP_THM, FORALL_IN_IMAGE] THEN
1365  REWRITE_TAC[IMAGE_EQ_EMPTY, GSYM INTERIOR_INTER] THEN
1366  ASM_SIMP_TAC std_ss [FINITE_IMAGE_INJ_EQ, GSYM IMAGE_BIGUNION,
1367   REAL_ARITH ``(x + a:real = y + a) <=> (x = y)``, REAL_EQ_LMUL,
1368   SET_RULE ``(!x y. (f x = f y) <=> (x = y))
1369    ==> (IMAGE f s SUBSET IMAGE f t <=> s SUBSET t) /\
1370        ((IMAGE f s = IMAGE f t) <=> (s = t)) /\
1371         (IMAGE f s INTER IMAGE f t = IMAGE f (s INTER t))``] THEN
1372  AP_TERM_TAC THEN BINOP_TAC THENL
1373  [AP_TERM_TAC THEN ABS_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN
1374   EQ_TAC THEN SIMP_TAC std_ss [LEFT_IMP_EXISTS_THM] THEN
1375   MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``] THEN DISCH_TAC THEN
1376   ASM_SIMP_TAC std_ss [IMAGE_AFFINITY_INTERVAL] THENL [ALL_TAC, METIS_TAC[]] THEN
1377   FIRST_X_ASSUM(MP_TAC o AP_TERM
1378   ``IMAGE (\x:real. inv m * x + -(inv m * c))``) THEN
1379   ASM_SIMP_TAC std_ss [GSYM IMAGE_COMPOSE, AFFINITY_INVERSES] THEN
1380   ASM_REWRITE_TAC[IMAGE_ID, IMAGE_AFFINITY_INTERVAL] THEN METIS_TAC[],
1381   SUBGOAL_THEN ``(\x:real. m * x + c) = (\x. c + x) o (\x. m * x)``
1382   SUBST1_TAC THENL
1383   [SIMP_TAC std_ss [FUN_EQ_THM, o_THM] THEN REAL_ARITH_TAC,
1384    ASM_SIMP_TAC std_ss [IMAGE_COMPOSE, INTERIOR_TRANSLATION] THEN
1385    ASM_SIMP_TAC std_ss [INTERIOR_INJECTIVE_LINEAR_IMAGE, LINEAR_SCALING,
1386    REAL_EQ_LMUL, IMAGE_EQ_EMPTY]]]]
1387QED
1388
1389Theorem DIVISION_OF_TRANSLATION:
1390   !d s:real->bool.
1391    IMAGE (IMAGE (\x. a + x)) d division_of (IMAGE (\x. a + x) s) <=>
1392     d division_of s
1393Proof
1394  ONCE_REWRITE_TAC[REAL_ARITH ``a + x:real = &1 * x + a:real``] THEN
1395  SIMP_TAC real_ss [DIVISION_OF_AFFINITY]
1396QED
1397
1398Theorem DIVISION_OF_REFLECT:
1399  !d s:real->bool.
1400  IMAGE (IMAGE (\x. -x)) d division_of IMAGE (\x. -x) s <=>
1401   d division_of s
1402Proof
1403  REPEAT GEN_TAC THEN SUBGOAL_THEN ``(\x. -x) = \x:real. -(&1) * x + 0``
1404  SUBST1_TAC THENL
1405  [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC,
1406   SIMP_TAC real_ss [DIVISION_OF_AFFINITY]]
1407QED
1408
1409Theorem ELEMENTARY_COMPACT:
1410   !s. (?d. d division_of s) ==> compact s
1411Proof
1412  REWRITE_TAC[division_of] THEN
1413  MESON_TAC[COMPACT_BIGUNION, COMPACT_INTERVAL]
1414QED
1415
1416Theorem DIVISION_1_SORT :
1417    !d s:real->bool. d division_of s /\
1418     (!k. k IN d ==> ~(interior k = {}))
1419      ==> ?n t. (IMAGE t { 1n..n} = d) /\
1420      !i j. i IN { 1n..n} /\ j IN { 1n..n} /\ i < j
1421      ==> ~(t i = t j) /\
1422     !x y. x IN t i /\ y IN t j ==> x <= y
1423Proof
1424  REPEAT STRIP_TAC THEN EXISTS_TAC ``CARD(d:(real->bool)->bool)`` THEN
1425  MP_TAC(ISPEC ``\i j:real->bool. i IN d /\ j IN d /\
1426   (interval_lowerbound i) <= (interval_lowerbound j)``
1427   TOPOLOGICAL_SORT) THEN
1428  SIMP_TAC std_ss [] THEN
1429  KNOW_TAC ``(!(x :real -> bool) (y :real -> bool).
1430    (x IN (d :(real -> bool) -> bool) /\ y IN d /\
1431     interval_lowerbound x <= interval_lowerbound y) /\ y IN d /\
1432    x IN d /\ interval_lowerbound y <= interval_lowerbound x ==>
1433    (x = y)) /\
1434 (!(x :real -> bool) (y :real -> bool) (z :real -> bool).
1435    (x IN d /\ y IN d /\
1436     interval_lowerbound x <= interval_lowerbound y) /\ y IN d /\
1437    z IN d /\ interval_lowerbound y <= interval_lowerbound z ==>
1438    interval_lowerbound x <= interval_lowerbound z)`` THENL
1439  [CONJ_TAC THENL [ALL_TAC, MESON_TAC[REAL_LE_TRANS]] THEN
1440   SIMP_TAC std_ss [IMP_CONJ, RIGHT_FORALL_IMP_THM],
1441   DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
1442   DISCH_THEN(MP_TAC o SPECL
1443   [``CARD(d:(real->bool)->bool)``, ``d:(real->bool)->bool``]) THEN
1444   FIRST_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_FINITE) THEN
1445   ASM_REWRITE_TAC[GSYM FINITE_HAS_SIZE] THEN
1446   DISCH_THEN (X_CHOOSE_TAC ``f:num->real->bool``) THEN
1447   EXISTS_TAC ``f:num->real->bool`` THEN POP_ASSUM MP_TAC THEN
1448   DISCH_THEN(STRIP_ASSUME_TAC o GSYM) THEN
1449   SUBGOAL_THEN
1450    ``!k l. k IN d /\ l IN d /\
1451     ~((interval_lowerbound l) <= (interval_lowerbound k))
1452      ==> ~(k = l) /\
1453      !x y. x IN k /\ y IN l ==> x <= y`` MP_TAC THENL
1454   [ALL_TAC,
1455    DISCH_TAC THEN
1456    CONJ_TAC THENL [ASM_SET_TAC[], REPEAT GEN_TAC THEN STRIP_TAC] THEN
1457    FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_SET_TAC[]] THEN
1458    SIMP_TAC std_ss [IMP_CONJ, RIGHT_FORALL_IMP_THM]] THEN
1459    UNDISCH_TAC ``d division_of s`` THEN DISCH_TAC THEN
1460    FIRST_ASSUM(fn th =>
1461    SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION_NONEMPTY th]) THEN
1462    SIMP_TAC std_ss [INTERVAL_LOWERBOUND_NONEMPTY] THEN
1463    REWRITE_TAC[INTERVAL_NE_EMPTY, IN_INTERVAL] THEN
1464    MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``] THEN STRIP_TAC THEN
1465    MAP_EVERY X_GEN_TAC [``a':real``, ``b':real``] THEN STRIP_TAC THEN
1466    REPEAT STRIP_TAC THEN
1467    UNDISCH_TAC ``d division_of s`` THEN DISCH_TAC THEN
1468    FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [division_of]) THEN
1469    DISCH_THEN (CONJUNCTS_THEN2 K_TAC MP_TAC) THEN
1470    DISCH_THEN (CONJUNCTS_THEN2 K_TAC MP_TAC) THEN
1471    DISCH_THEN (CONJUNCTS_THEN2 MP_TAC K_TAC) THEN
1472    DISCH_THEN(MP_TAC o SPECL
1473     [``interval[a:real,b]``, ``interval[a':real,b']``]) THEN
1474    (SUBGOAL_THEN
1475     ``~(interior(interval[a:real,b]) = {}) /\
1476       ~(interior(interval[a':real,b']) = {})``
1477     MP_TAC THENL [ASM_MESON_TAC[], ALL_TAC]) THEN
1478    ASM_REWRITE_TAC [EQ_INTERVAL, GSYM INTERIOR_INTER] THEN
1479    REWRITE_TAC [INTER_INTERVAL, INTERIOR_INTERVAL, GSYM INTERVAL_EQ_EMPTY] THEN
1480    ASM_SIMP_TAC real_ss [min_def, max_def] THENL
1481   [ (* goal 1 (of 3) *)
1482     Cases_on `b <= b'` >> rw [] \\
1483     Cases_on `(a = a') /\ (b = b')` >- rw [] \\
1484     ONCE_REWRITE_TAC [DISJ_COMM] >> RIGHT_DISJ_TAC \\
1485    `b <= a'` by PROVE_TAC [real_lte] \\
1486     METIS_TAC [REAL_LE_ANTISYM],
1487     (* goal 2 (of 3) *)
1488     rw [GSYM real_lte] \\
1489     RIGHT_DISJ_TAC >> CCONTR_TAC >> fs [GSYM real_lte],
1490     (* goal 3 (of 3) *)
1491     rpt STRIP_TAC \\
1492     MATCH_MP_TAC REAL_LE_TRANS \\
1493     Q.EXISTS_TAC `b` >> art [] \\
1494     MATCH_MP_TAC REAL_LE_TRANS \\
1495     Q.EXISTS_TAC `a'` >> art [] \\
1496     Cases_on `b <= b'` >> Cases_on `a <= a'` >> fs [] (* 4 goals *)
1497     >- (FIRST_X_ASSUM MATCH_MP_TAC \\
1498         CONJ_TAC >- (DISJ1_TAC >> rw [GSYM real_lte]) \\
1499         RIGHT_DISJ_TAC >> CCONTR_TAC >> fs [GSYM real_lte])
1500     >> (fs [real_lte] >> PROVE_TAC [REAL_LT_ANTISYM]) ]
1501QED
1502
1503(* ------------------------------------------------------------------------- *)
1504(* Tagged (partial) divisions.                                               *)
1505(* ------------------------------------------------------------------------- *)
1506
1507val _ = set_fixity "tagged_partial_division_of" (Infix(NONASSOC, 450));
1508val _ = set_fixity "tagged_division_of" (Infix(NONASSOC, 450));
1509
1510(* ‘s’ is a set of pair of tags x and non-overlapping closed intervals k *)
1511Definition tagged_partial_division_of[nocompute]:
1512  s tagged_partial_division_of i <=>
1513        FINITE s /\
1514        (!x k. (x,k) IN s
1515               ==> x IN k /\ k SUBSET i /\ ?a b. k = interval[a,b]) /\
1516        (!x1 k1 x2 k2. (x1,k1) IN s /\ (x2,k2) IN s /\ ~((x1,k1) = (x2,k2))
1517                       ==> (interior(k1) INTER interior(k2) = {}))
1518End
1519
1520(* A partial tagged division becomes total when all closed intervals cover i *)
1521Definition tagged_division_of[nocompute]:
1522  s tagged_division_of i <=>
1523        s tagged_partial_division_of i /\ (BIGUNION {k | ?x. (x,k) IN s} = i)
1524End
1525
1526Theorem TAGGED_DIVISION_OF_FINITE:
1527   !s i. s tagged_division_of i ==> FINITE s
1528Proof
1529  SIMP_TAC std_ss [tagged_division_of, tagged_partial_division_of]
1530QED
1531
1532Theorem TAGGED_DIVISION_OF :
1533    !s i. s tagged_division_of i <=>
1534        FINITE s /\
1535        (!x k. (x,k) IN s
1536               ==> x IN k /\ k SUBSET i /\ ?a b. k = interval[a,b]) /\
1537        (!x1 k1 x2 k2. (x1,k1) IN s /\ (x2,k2) IN s /\ ~((x1,k1) = (x2,k2))
1538                       ==> (interior(k1) INTER interior(k2) = {})) /\
1539        (BIGUNION {k | ?x. (x,k) IN s} = i)
1540Proof
1541    REWRITE_TAC[tagged_division_of, tagged_partial_division_of, CONJ_ASSOC]
1542QED
1543
1544Theorem DIVISION_OF_TAGGED_DIVISION:
1545   !s i. s tagged_division_of i ==> (IMAGE SND s) division_of i
1546Proof
1547  REWRITE_TAC[TAGGED_DIVISION_OF, division_of] THEN
1548  ASM_SIMP_TAC std_ss [IMAGE_FINITE, FORALL_IN_IMAGE, FORALL_PROD, PAIR_EQ] THEN
1549  SIMP_TAC std_ss [IN_IMAGE, EXISTS_PROD] THEN
1550  REPEAT GEN_TAC THEN STRIP_TAC THEN REPEAT CONJ_TAC THENL
1551   [ASM_MESON_TAC[MEMBER_NOT_EMPTY],
1552    REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
1553    FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_MESON_TAC[],
1554    SIMP_TAC std_ss [EXTENSION, GSPECIFICATION, IN_IMAGE, IN_BIGUNION] THEN
1555    SIMP_TAC std_ss [FORALL_PROD, EXISTS_PROD] THEN MESON_TAC[]]
1556QED
1557
1558Theorem PARTIAL_DIVISION_OF_TAGGED_DIVISION:
1559   !s i. s tagged_partial_division_of i
1560         ==> (IMAGE SND s) division_of BIGUNION(IMAGE SND s)
1561Proof
1562  REWRITE_TAC[tagged_partial_division_of, division_of] THEN
1563  SIMP_TAC std_ss [GSYM AND_IMP_INTRO, RIGHT_FORALL_IMP_THM, FORALL_IN_IMAGE] THEN
1564  SIMP_TAC std_ss [FORALL_PROD, PAIR_EQ, DE_MORGAN_THM] THEN
1565  GEN_TAC THEN DISCH_TAC THEN GEN_TAC THEN REPEAT DISCH_TAC THEN
1566  REPEAT CONJ_TAC THENL
1567   [ASM_MESON_TAC[IMAGE_FINITE],
1568    ALL_TAC,
1569    ASM_MESON_TAC[]] THEN
1570  REPEAT GEN_TAC THEN STRIP_TAC THEN CONJ_TAC THENL
1571   [ALL_TAC, ASM_MESON_TAC[MEMBER_NOT_EMPTY]] THEN
1572  SIMP_TAC std_ss [SUBSET_DEF, IN_BIGUNION, IN_IMAGE, EXISTS_PROD] THEN
1573  REPEAT (POP_ASSUM MP_TAC) THEN SET_TAC[]
1574QED
1575
1576Theorem TAGGED_PARTIAL_DIVISION_SUBSET:
1577   !s t i. s tagged_partial_division_of i /\ t SUBSET s
1578           ==> t tagged_partial_division_of i
1579Proof
1580  REWRITE_TAC[tagged_partial_division_of] THEN
1581  MESON_TAC[SUBSET_FINITE, SUBSET_DEF]
1582QED
1583
1584Theorem SUM_OVER_TAGGED_PARTIAL_DIVISION_LEMMA:
1585   !d:(real->bool)->real p i.
1586        p tagged_partial_division_of i /\
1587        (!u v. ~(interval[u,v] = {}) /\ (content(interval[u,v]) = &0)
1588               ==> (d(interval[u,v]) = &0))
1589        ==> (sum p (\(x,k). d k) = sum (IMAGE SND p) d)
1590Proof
1591  REWRITE_TAC[CONTENT_EQ_0_INTERIOR] THEN REPEAT STRIP_TAC THEN
1592  SUBGOAL_THEN ``(\(x:real,k:real->bool). d k:real) = d o SND``
1593  SUBST1_TAC THENL [SIMP_TAC std_ss [FUN_EQ_THM, FORALL_PROD, o_THM], ALL_TAC] THEN
1594  CONV_TAC SYM_CONV THEN MATCH_MP_TAC SUM_IMAGE_NONZERO THEN
1595  UNDISCH_TAC ``p tagged_partial_division_of i`` THEN
1596  REWRITE_TAC [tagged_partial_division_of] THEN
1597  MATCH_MP_TAC MONO_AND THEN SIMP_TAC std_ss [FORALL_PROD] THEN
1598  DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN DISCH_TAC THEN
1599  X_GEN_TAC ``x:real`` THEN X_GEN_TAC ``k:real->bool`` THEN
1600  X_GEN_TAC ``y:real`` THEN
1601  POP_ASSUM (MP_TAC o Q.SPECL [`x:real`, `k:real->bool`, `y:real`, `k:real->bool`]) THEN
1602  ASM_REWRITE_TAC[PAIR_EQ, INTER_IDEMPOT] THEN
1603  RULE_ASSUM_TAC(REWRITE_RULE[GSYM MEMBER_NOT_EMPTY]) THEN
1604  ASM_MESON_TAC[]
1605QED
1606
1607Theorem SUM_OVER_TAGGED_DIVISION_LEMMA:
1608   !d:(real->bool)->real p i.
1609        p tagged_division_of i /\
1610        (!u v. ~(interval[u,v] = {}) /\ (content(interval[u,v]) = &0)
1611               ==> (d(interval[u,v]) = &0))
1612        ==> (sum p (\(x,k). d k) = sum (IMAGE SND p) d)
1613Proof
1614  REWRITE_TAC[tagged_division_of] THEN REPEAT STRIP_TAC THEN
1615  MATCH_MP_TAC SUM_OVER_TAGGED_PARTIAL_DIVISION_LEMMA THEN
1616  EXISTS_TAC ``i:real->bool`` THEN ASM_REWRITE_TAC[]
1617QED
1618
1619Theorem TAG_IN_INTERVAL:
1620   !p i k. p tagged_division_of i /\ (x,k) IN p ==> x IN i
1621Proof
1622  REWRITE_TAC[TAGGED_DIVISION_OF] THEN SET_TAC[]
1623QED
1624
1625Theorem TAGGED_DIVISION_OF_EMPTY:
1626   {} tagged_division_of {}
1627Proof
1628  REWRITE_TAC[tagged_division_of, tagged_partial_division_of] THEN
1629  SIMP_TAC std_ss [FINITE_EMPTY, EXTENSION, NOT_IN_EMPTY, IN_BIGUNION, GSPECIFICATION]
1630QED
1631
1632Theorem TAGGED_PARTIAL_DIVISION_OF_TRIVIAL:
1633   !p. p tagged_partial_division_of {} <=> (p = {})
1634Proof
1635  REWRITE_TAC[tagged_partial_division_of, SUBSET_EMPTY, CONJ_ASSOC] THEN
1636  REWRITE_TAC[SET_RULE ``x IN k /\ (k = {}) <=> F``] THEN
1637  SIMP_TAC std_ss [GSYM FORALL_PROD] THEN
1638  REWRITE_TAC [GSYM NOT_EXISTS_THM, MEMBER_NOT_EMPTY] THEN
1639  REWRITE_TAC[METIS [] ``(a /\ b) /\ c <=> b /\ a /\ c``] THEN
1640  REWRITE_TAC [METIS [GSYM NOT_EXISTS_THM, MEMBER_NOT_EMPTY]
1641                      ``(!k. k NOTIN s) = (s = {})``] THEN
1642  GEN_TAC THEN MATCH_MP_TAC(TAUT `(a ==> b) ==> (a /\ b <=> a)`) THEN
1643  DISCH_THEN SUBST1_TAC THEN
1644  REWRITE_TAC[FINITE_EMPTY, BIGUNION_EMPTY, NOT_IN_EMPTY]
1645QED
1646
1647Theorem TAGGED_DIVISION_OF_TRIVIAL:
1648   !p. p tagged_division_of {} <=> (p = {})
1649Proof
1650  REWRITE_TAC[tagged_division_of, TAGGED_PARTIAL_DIVISION_OF_TRIVIAL] THEN
1651  GEN_TAC THEN MATCH_MP_TAC(TAUT `(a ==> b) ==> (a /\ b <=> a)`) THEN
1652  DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[NOT_IN_EMPTY] THEN SET_TAC[]
1653QED
1654
1655Theorem TAGGED_DIVISION_OF_SELF:
1656   !x a b. x IN interval[a,b]
1657           ==> {(x,interval[a,b])} tagged_division_of interval[a,b]
1658Proof
1659  REWRITE_TAC[TAGGED_DIVISION_OF, FINITE_INSERT, FINITE_EMPTY, IN_SING] THEN
1660  SIMP_TAC std_ss [FORALL_PROD, PAIR_EQ] THEN REPEAT STRIP_TAC THEN
1661  ASM_REWRITE_TAC[SUBSET_REFL, UNWIND_THM2, SET_RULE ``{k | k = a} = {a}``] THEN
1662  REWRITE_TAC[BIGUNION_SING] THEN ASM_MESON_TAC[]
1663QED
1664
1665Theorem TAGGED_DIVISION_UNION:
1666   !s1 s2:real->bool p1 p2.
1667        p1 tagged_division_of s1 /\
1668        p2 tagged_division_of s2 /\
1669        (interior s1 INTER interior s2 = {})
1670        ==> (p1 UNION p2) tagged_division_of (s1 UNION s2)
1671Proof
1672  REPEAT GEN_TAC THEN REWRITE_TAC[TAGGED_DIVISION_OF] THEN STRIP_TAC THEN
1673  ASM_REWRITE_TAC[FINITE_UNION, IN_UNION, EXISTS_OR_THM, SET_RULE
1674   ``BIGUNION {x | P x \/ Q x} = BIGUNION {x | P x} UNION BIGUNION {x | Q x}``] THEN
1675  CONJ_TAC THENL [REPEAT (POP_ASSUM MP_TAC) THEN SET_TAC[], ALL_TAC] THEN
1676  REPEAT STRIP_TAC THENL
1677   [ASM_MESON_TAC[], ALL_TAC, ALL_TAC, ASM_MESON_TAC[],
1678    REPEAT (POP_ASSUM MP_TAC) THEN SET_TAC []] THEN
1679  MATCH_MP_TAC(SET_RULE
1680   ``!s' t'. s SUBSET s' /\ t SUBSET t' /\ (s' INTER t' = {})
1681            ==> (s INTER t = {})``) THENL
1682  [MAP_EVERY EXISTS_TAC
1683   [``interior s1:real->bool``, ``interior s2:real->bool``],
1684   MAP_EVERY EXISTS_TAC
1685   [``interior s2:real->bool``, ``interior s1:real->bool``]] THEN
1686  ASM_SIMP_TAC std_ss[INTER_COMM] THEN CONJ_TAC THEN MATCH_MP_TAC SUBSET_INTERIOR THEN
1687  ASM_MESON_TAC[]
1688QED
1689
1690Theorem lemma1[local]:
1691    !x' k. (?s. (x',k) IN s /\ ?x. (s = pfn x) /\ x IN iset) <=>
1692           (?x. x IN iset /\ (x',k) IN pfn x)
1693Proof
1694    MESON_TAC []
1695QED
1696
1697Theorem lemma2[local]:
1698    !s1 t1 s2 t2. s1 SUBSET t1 /\ s2 SUBSET t2 /\ (t1 INTER t2 = {})
1699                   ==> (s1 INTER s2 = {})
1700Proof
1701    SET_TAC []
1702QED
1703
1704Theorem TAGGED_DIVISION_BIGUNION:
1705   !iset pfn. FINITE iset /\
1706              (!i:real->bool. i IN iset ==> pfn(i) tagged_division_of i) /\
1707              (!i1 i2. i1 IN iset /\ i2 IN iset /\ ~(i1 = i2)
1708                       ==> (interior(i1) INTER interior(i2) = {}))
1709              ==> BIGUNION(IMAGE pfn iset) tagged_division_of (BIGUNION iset)
1710Proof
1711  REPEAT GEN_TAC THEN
1712  REWRITE_TAC[ONCE_REWRITE_RULE[EXTENSION] tagged_division_of] THEN
1713  SIMP_TAC std_ss [tagged_partial_division_of, IN_BIGUNION, GSPECIFICATION] THEN
1714  SIMP_TAC std_ss [SUBSET_DEF, GSPECIFICATION, IN_BIGUNION, IN_IMAGE] THEN
1715  SIMP_TAC std_ss [FINITE_BIGUNION, IMAGE_FINITE, FORALL_IN_IMAGE] THEN
1716  STRIP_TAC THEN REPEAT CONJ_TAC THENL
1717   [ASM_MESON_TAC[], ALL_TAC, ASM_MESON_TAC[]] THEN
1718  REPEAT GEN_TAC THEN REWRITE_TAC[lemma1] THEN
1719  SIMP_TAC std_ss [GSYM LEFT_EXISTS_AND_THM] THEN
1720  SIMP_TAC std_ss [GSYM RIGHT_EXISTS_AND_THM] THEN
1721  RW_TAC std_ss [] THENL [ASM_CASES_TAC ``x = x':real->bool`` THENL
1722   [ASM_MESON_TAC[], ALL_TAC], ASM_CASES_TAC ``x = x':real->bool`` THENL
1723   [ASM_MESON_TAC[], ALL_TAC]] THEN MATCH_MP_TAC lemma2 THEN
1724  MAP_EVERY EXISTS_TAC
1725   [``interior(x:real->bool)``, ``interior(x':real->bool)``] THEN
1726  ASM_MESON_TAC[SUBSET_DEF, SUBSET_INTERIOR]
1727QED
1728
1729Theorem TAGGED_PARTIAL_DIVISION_OF_UNION_SELF:
1730   !p s. p tagged_partial_division_of s
1731         ==> p tagged_division_of (BIGUNION(IMAGE SND p))
1732Proof
1733  SIMP_TAC std_ss [tagged_partial_division_of, TAGGED_DIVISION_OF] THEN
1734  REPEAT GEN_TAC THEN STRIP_TAC THEN REPEAT CONJ_TAC THENL
1735   [REPEAT STRIP_TAC THENL [ALL_TAC, ASM_MESON_TAC[]] THEN
1736    SIMP_TAC std_ss [SUBSET_DEF, IN_BIGUNION, IN_IMAGE, EXISTS_PROD] THEN
1737    ASM_MESON_TAC[], ASM_MESON_TAC[],
1738    AP_TERM_TAC THEN GEN_REWR_TAC I [EXTENSION] THEN
1739    SIMP_TAC std_ss [GSPECIFICATION, IN_IMAGE, EXISTS_PROD] THEN MESON_TAC[]]
1740QED
1741
1742Theorem TAGGED_DIVISION_OF_UNION_SELF:
1743   !p s. p tagged_division_of s
1744         ==> p tagged_division_of (BIGUNION(IMAGE SND p))
1745Proof
1746  SIMP_TAC std_ss [TAGGED_DIVISION_OF] THEN REPEAT GEN_TAC THEN STRIP_TAC THEN
1747  MATCH_MP_TAC(TAUT `(c ==> a /\ b) /\ c ==> a /\ b /\ c`) THEN CONJ_TAC THENL
1748   [DISCH_THEN(SUBST1_TAC o SYM) THEN ASM_SIMP_TAC std_ss [] THEN ASM_MESON_TAC[],
1749    AP_TERM_TAC THEN GEN_REWR_TAC I [EXTENSION] THEN
1750    SIMP_TAC std_ss [GSPECIFICATION, IN_IMAGE, EXISTS_PROD]]
1751QED
1752
1753Theorem TAGGED_DIVISION_UNION_IMAGE_SND:
1754   !p s. p tagged_division_of s ==> (s = BIGUNION(IMAGE SND p))
1755Proof
1756  METIS_TAC[TAGGED_PARTIAL_DIVISION_OF_UNION_SELF, tagged_division_of]
1757QED
1758
1759Theorem TAGGED_DIVISION_OF_ALT:
1760   !p s. p tagged_division_of s <=>
1761         p tagged_partial_division_of s /\
1762         (!x. x IN s ==> ?t k. (t,k) IN p /\ x IN k)
1763Proof
1764  REWRITE_TAC[tagged_division_of, GSYM SUBSET_ANTISYM] THEN
1765  SIMP_TAC std_ss [SUBSET_DEF, GSPECIFICATION] THEN
1766  SIMP_TAC std_ss [IN_BIGUNION, EXISTS_PROD, GSPECIFICATION] THEN
1767  REWRITE_TAC[tagged_partial_division_of, SUBSET_DEF] THEN SET_TAC[]
1768QED
1769
1770Theorem TAGGED_DIVISION_OF_ANOTHER:
1771   !p s s'.
1772        p tagged_partial_division_of s' /\
1773        (!t k. (t,k) IN p ==> k SUBSET s) /\
1774        (!x. x IN s ==> ?t k. (t,k) IN p /\ x IN k)
1775        ==> p tagged_division_of s
1776Proof
1777  REWRITE_TAC[TAGGED_DIVISION_OF_ALT, tagged_partial_division_of] THEN
1778  SET_TAC[]
1779QED
1780
1781Theorem TAGGED_PARTIAL_DIVISION_OF_SUBSET:
1782   !p s t. p tagged_partial_division_of s /\ s SUBSET t
1783           ==> p tagged_partial_division_of t
1784Proof
1785  REWRITE_TAC[tagged_partial_division_of] THEN SET_TAC[]
1786QED
1787
1788Theorem TAGGED_DIVISION_OF_NONTRIVIAL:
1789   !s a b:real.
1790        s tagged_division_of interval[a,b] /\ ~(content(interval[a,b]) = &0)
1791        ==> {(x,k) | (x,k) IN s /\ ~(content k = &0)}
1792            tagged_division_of interval[a,b]
1793Proof
1794  REPEAT STRIP_TAC THEN REWRITE_TAC[TAGGED_DIVISION_OF_ALT] THEN
1795  CONJ_TAC THENL
1796   [MATCH_MP_TAC TAGGED_PARTIAL_DIVISION_SUBSET THEN
1797    EXISTS_TAC ``s:(real#(real->bool))->bool`` THEN
1798    RULE_ASSUM_TAC(REWRITE_RULE[tagged_division_of]) THEN
1799    ASM_REWRITE_TAC[] THEN SRW_TAC [][SUBSET_DEF] THEN ASM_REWRITE_TAC [],
1800    FIRST_ASSUM(MP_TAC o MATCH_MP DIVISION_OF_TAGGED_DIVISION) THEN
1801    DISCH_THEN(MP_TAC o
1802     MATCH_MP(REWRITE_RULE[GSYM AND_IMP_INTRO] DIVISION_OF_NONTRIVIAL)) THEN
1803    ASM_SIMP_TAC std_ss [] THEN
1804    REWRITE_TAC[division_of] THEN DISCH_THEN(MP_TAC o last o CONJUNCTS) THEN
1805    SIMP_TAC std_ss [GSYM SUBSET_ANTISYM_EQ, SUBSET_DEF, IN_ELIM_PAIR_THM] THEN
1806    SIMP_TAC real_ss [BIGUNION, EXISTS_IN_IMAGE, EXISTS_PROD, GSPECIFICATION,
1807                GSYM CONJ_ASSOC, LAMBDA_PROD]]
1808QED
1809
1810(* ------------------------------------------------------------------------- *)
1811(* Fine-ness of a partition w.r.t. a gauge.                                  *)
1812(* ------------------------------------------------------------------------- *)
1813
1814val _ = set_fixity "FINE" (Infix(NONASSOC, 450));
1815
1816(* ‘d’ is a guage, ‘s’ is a tagged division *)
1817Definition FINE[nocompute]:
1818  d FINE s <=> !x k. (x,k) IN s ==> k SUBSET d(x)
1819End
1820
1821Theorem FINE_INTER:
1822   !p d1 d2. (\x. d1(x) INTER d2(x)) FINE p <=> d1 FINE p /\ d2 FINE p
1823Proof
1824  KNOW_TAC ``s SUBSET (t INTER u) <=> s SUBSET t /\ s SUBSET u`` THEN
1825  SIMP_TAC std_ss [FINE, IN_INTER, SUBSET_INTER] THEN MESON_TAC[]
1826QED
1827
1828Theorem FINE_BIGINTER:
1829   !f s p. (\x. BIGINTER {f d x | d IN s}) FINE p <=>
1830           !d. d IN s ==> (f d) FINE p
1831Proof
1832  SIMP_TAC std_ss [FINE, SET_RULE ``s SUBSET BIGINTER u <=> !t. t IN u ==> s SUBSET t``,
1833              GSPECIFICATION] THEN MESON_TAC[]
1834QED
1835
1836Theorem FINE_UNION:
1837   !d p1 p2. d FINE p1 /\ d FINE p2 ==> d FINE (p1 UNION p2)
1838Proof
1839  REWRITE_TAC[FINE, IN_UNION] THEN MESON_TAC[]
1840QED
1841
1842Theorem FINE_BIGUNION:
1843   !d ps. (!p. p IN ps ==> d FINE p) ==> d FINE (BIGUNION ps)
1844Proof
1845  REWRITE_TAC[FINE, IN_BIGUNION] THEN MESON_TAC[]
1846QED
1847
1848Theorem FINE_SUBSET:
1849   !d p q. p SUBSET q /\ d FINE q ==> d FINE p
1850Proof
1851  REWRITE_TAC[FINE, SUBSET_DEF] THEN MESON_TAC[]
1852QED
1853
1854(* ------------------------------------------------------------------------- *)
1855(* Gauge integral. Define on compact intervals first, then use a limit.      *)
1856(* ------------------------------------------------------------------------- *)
1857
1858val _ = set_fixity "has_integral_compact_interval" (Infix(NONASSOC, 450));
1859val _ = set_fixity "has_integral" (Infix(NONASSOC, 450));
1860val _ = set_fixity "integrable_on" (Infix(NONASSOC, 450));
1861
1862Definition has_integral_compact_interval :
1863   (f has_integral_compact_interval y) i <=>
1864        !e. &0 < e
1865            ==> ?d. gauge d /\
1866                    !p. p tagged_division_of i /\ d FINE p
1867                        ==> abs(sum p (\(x,k). content(k) * f(x)) - y) < e
1868End
1869
1870Definition has_integral_def :
1871   (f has_integral y) i <=>
1872        if ?a b. i = interval[a,b] then (f has_integral_compact_interval y) i
1873        else !e. &0 < e
1874                 ==> ?B. &0 < B /\
1875                         !a b. ball(0,B) SUBSET interval[a,b]
1876                               ==> ?z. ((\x. if x IN i then f(x) else 0)
1877                                        has_integral_compact_interval z)
1878                                        (interval[a,b]) /\ abs(z - y) < e
1879End
1880
1881Theorem has_integral :
1882   !f y a b.
1883     (f has_integral y) (interval[a,b]) <=>
1884        !e. &0 < e
1885            ==> ?d. gauge d /\
1886                    !p. p tagged_division_of interval[a,b] /\ d FINE p
1887                        ==> abs(sum p (\(x,k). content(k) * f(x)) - y) < e
1888Proof
1889  REPEAT GEN_TAC THEN
1890  REWRITE_TAC[has_integral_def, has_integral_compact_interval] THEN
1891  METIS_TAC[]
1892QED
1893
1894Theorem has_integral_alt :
1895   !f i y.
1896     (f has_integral y) i <=>
1897        if ?a b. i = interval[a,b] then (f has_integral y) i
1898        else !e. &0 < e
1899                 ==> ?B. &0 < B /\
1900                         !a b. ball(0,B) SUBSET interval[a,b]
1901                               ==> ?z. ((\x. if x IN i then f(x) else 0)
1902                                        has_integral z) (interval[a,b]) /\
1903                                       abs(z - y) < e
1904Proof
1905  REPEAT GEN_TAC THEN GEN_REWR_TAC LAND_CONV [has_integral_def] THEN
1906  COND_CASES_TAC THEN ASM_REWRITE_TAC[] THENL
1907   [POP_ASSUM(REPEAT_TCL CHOOSE_THEN SUBST1_TAC), ALL_TAC] THEN
1908  REWRITE_TAC[has_integral_compact_interval, has_integral]
1909QED
1910
1911Definition integrable_on :
1912   f integrable_on i <=> ?y. (f has_integral y) i
1913End
1914
1915val _ = hide "integral";
1916Definition integral_def : (* was: integral *)
1917    integral i f = @y. (f has_integral y) i
1918End
1919val integral = integral_def;
1920
1921Theorem INTEGRABLE_INTEGRAL:
1922   !f i. f integrable_on i ==> (f has_integral (integral i f)) i
1923Proof
1924  REPEAT GEN_TAC THEN REWRITE_TAC[integrable_on, integral] THEN
1925  CONV_TAC(RAND_CONV SELECT_CONV) THEN REWRITE_TAC[]
1926QED
1927
1928Theorem HAS_INTEGRAL_INTEGRABLE:
1929   !f i s. (f has_integral i) s ==> f integrable_on s
1930Proof
1931  REWRITE_TAC[integrable_on] THEN MESON_TAC[]
1932QED
1933
1934Theorem HAS_INTEGRAL_INTEGRAL:
1935   !f s. f integrable_on s <=> (f has_integral (integral s f)) s
1936Proof
1937  MESON_TAC[INTEGRABLE_INTEGRAL, HAS_INTEGRAL_INTEGRABLE]
1938QED
1939
1940Theorem SUM_CONTENT_NULL:
1941   !f:real->real a b p.
1942        (content (interval[a,b]) = &0) /\
1943        (p tagged_division_of interval[a,b])
1944        ==> (sum p (\(x,k). content k * f x) = &0)
1945Proof
1946  REPEAT STRIP_TAC THEN MATCH_MP_TAC SUM_EQ_0 THEN
1947  SIMP_TAC std_ss [FORALL_PROD] THEN
1948  MAP_EVERY X_GEN_TAC [``p:real``, ``k:real->bool``] THEN
1949  DISCH_TAC THEN REWRITE_TAC[REAL_ENTIRE] THEN DISJ1_TAC THEN
1950  UNDISCH_TAC ``(p :real # (real -> bool) -> bool) tagged_division_of
1951          interval [(a,b)]`` THEN REWRITE_TAC [TAGGED_DIVISION_OF] THEN
1952  DISCH_THEN(MP_TAC o CONJUNCT1 o CONJUNCT2) THEN
1953  DISCH_THEN(MP_TAC o SPECL [``p:real``, ``k:real->bool``]) THEN
1954  ASM_MESON_TAC[CONTENT_SUBSET, CONTENT_POS_LE, REAL_ARITH
1955   ``&0 <= x /\ x <= y /\ (y = &0) ==> (x:real = &0)``]
1956QED
1957
1958(* ------------------------------------------------------------------------- *)
1959(* Some basic combining lemmas.                                              *)
1960(* ------------------------------------------------------------------------- *)
1961
1962Theorem TAGGED_DIVISION_BIGUNION_EXISTS:
1963   !d iset i:real->bool.
1964        FINITE iset /\
1965        (!i. i IN iset ==> ?p. p tagged_division_of i /\ d FINE p) /\
1966        (!i1 i2. i1 IN iset /\ i2 IN iset /\ ~(i1 = i2)
1967                 ==> (interior(i1) INTER interior(i2) = {})) /\
1968        (BIGUNION iset = i)
1969        ==> ?p. p tagged_division_of i /\ d FINE p
1970Proof
1971  REPEAT GEN_TAC THEN
1972  KNOW_TAC ``(!i. i IN iset ==> ?p. p tagged_division_of i /\ d FINE p) =
1973             (!i. ?p. i IN iset ==> p tagged_division_of i /\ d FINE p)`` THENL
1974  [SIMP_TAC std_ss [RIGHT_EXISTS_IMP_THM], ALL_TAC] THEN DISC_RW_KILL THEN
1975  SIMP_TAC std_ss [SKOLEM_THM, LEFT_EXISTS_AND_THM, GSYM LEFT_EXISTS_IMP_THM] THEN
1976  REPEAT STRIP_TAC THEN FIRST_X_ASSUM(SUBST_ALL_TAC o SYM) THEN
1977  EXISTS_TAC ``BIGUNION (IMAGE(f:(real->bool)->((real#(real->bool))->bool))
1978                      iset)`` THEN
1979  ASM_SIMP_TAC std_ss [TAGGED_DIVISION_BIGUNION] THEN
1980  ASM_MESON_TAC[FINE_BIGUNION, IN_IMAGE]
1981QED
1982
1983(* ------------------------------------------------------------------------- *)
1984(* The set we're concerned with must be closed.                              *)
1985(* ------------------------------------------------------------------------- *)
1986
1987Theorem DIVISION_OF_CLOSED:
1988   !s i. s division_of i ==> closed i
1989Proof
1990  REWRITE_TAC[division_of] THEN MESON_TAC[CLOSED_BIGUNION, CLOSED_INTERVAL]
1991QED
1992
1993(* ------------------------------------------------------------------------- *)
1994(* General bisection principle for intervals; might be useful elsewhere.     *)
1995(* ------------------------------------------------------------------------- *)
1996
1997Theorem FINITE_POWERSET:
1998    !s. FINITE s ==> FINITE {t | t SUBSET s}
1999Proof
2000  METIS_TAC [FINITE_POW, POW_DEF]
2001QED
2002
2003Theorem lemma1[local]:
2004    !a b:real. ((a + b) / 2 - a) = ((a + b) - (a + a)) / 2
2005Proof
2006  REPEAT GEN_TAC THEN
2007  KNOW_TAC ``((a + b) / 2 - a) = ((a + b) / 2 - a / 1:real)`` THENL
2008  [METIS_TAC [REAL_OVER1], ALL_TAC] THEN DISC_RW_KILL THEN
2009  SIMP_TAC std_ss [REAL_ARITH ``1 <> 0:real /\ 2 <> 0:real``, REAL_SUB_RAT] THEN
2010  REWRITE_TAC [REAL_MUL_RID] THEN REWRITE_TAC [GSYM REAL_DOUBLE]
2011QED
2012
2013Theorem lemma2[local]:
2014    !a b:real. (b - (a + b) / 2) = ((b + b) - (a + b)) / 2
2015Proof
2016  REPEAT GEN_TAC THEN
2017  KNOW_TAC ``(b - (a + b) / 2) = (b / 1 - (a + b) / 2:real)`` THENL
2018  [METIS_TAC [REAL_OVER1], ALL_TAC] THEN DISC_RW_KILL THEN
2019  SIMP_TAC std_ss [REAL_ARITH ``1 <> 0:real /\ 2 <> 0:real``, REAL_SUB_RAT] THEN
2020  REWRITE_TAC [REAL_MUL_LID] THEN METIS_TAC[REAL_MUL_SYM, GSYM REAL_DOUBLE]
2021QED
2022
2023Theorem INTERVAL_BISECTION_STEP:
2024   !P. P {} /\
2025       (!s t. P s /\ P t /\ (interior(s) INTER interior(t) = {})
2026              ==> P(s UNION t))
2027       ==> !a b:real.
2028                ~(P(interval[a,b]))
2029                ==> ?c d. ~(P(interval[c,d])) /\
2030                          a <= c /\ c <= d /\ d <= b /\
2031                                  &2 * (d - c) <= b - a
2032Proof
2033  REPEAT GEN_TAC THEN STRIP_TAC THEN REPEAT GEN_TAC THEN
2034  ASM_CASES_TAC ``(a:real) <= (b:real)`` THENL
2035   [ALL_TAC,
2036    RULE_ASSUM_TAC(REWRITE_RULE[GSYM INTERVAL_NE_EMPTY]) THEN
2037    ASM_REWRITE_TAC[]] THEN
2038  SUBGOAL_THEN
2039   ``!f. FINITE f /\
2040        (!s:real->bool. s IN f ==> P s) /\
2041        (!s:real->bool. s IN f ==> ?a b. s = interval[a,b]) /\
2042        (!s t. s IN f /\ t IN f /\ ~(s = t)
2043               ==> (interior(s) INTER interior(t) = {}))
2044        ==> P(BIGUNION f)``
2045  ASSUME_TAC THENL
2046   [ONCE_REWRITE_TAC[GSYM AND_IMP_INTRO] THEN GEN_TAC THEN
2047    KNOW_TAC ``((!s. s IN f ==> P s) /\ (!s. s IN f ==> ?a b. s = interval [(a,b)]) /\
2048    (!s t. s IN f /\ t IN f /\ s <> t ==>
2049       (interior s INTER interior t = {})) ==> P (BIGUNION f)) =
2050               (\f. (!s. s IN f ==> P s) /\ (!s. s IN f ==> ?a b. s = interval [(a,b)]) /\
2051    (!s t. s IN f /\ t IN f /\ s <> t ==>
2052       (interior s INTER interior t = {})) ==> P (BIGUNION f)) f`` THENL
2053   [FULL_SIMP_TAC std_ss [], ALL_TAC] THEN DISC_RW_KILL THEN
2054   MATCH_MP_TAC FINITE_INDUCT THEN BETA_TAC THEN
2055    ASM_SIMP_TAC std_ss [BIGUNION_EMPTY, BIGUNION_INSERT, NOT_IN_EMPTY, FORALL_IN_INSERT] THEN
2056    SIMP_TAC std_ss [GSYM RIGHT_FORALL_IMP_THM] THEN REWRITE_TAC[AND_IMP_INTRO] THEN
2057    X_GEN_TAC ``f :(real -> bool) -> bool`` THEN X_GEN_TAC ``x:real->bool`` THEN
2058    REPEAT GEN_TAC THEN DISCH_THEN(fn th =>
2059      FIRST_X_ASSUM MATCH_MP_TAC THEN STRIP_ASSUME_TAC th) THEN
2060    ASM_REWRITE_TAC[] THEN CONJ_TAC THENL [REPEAT (POP_ASSUM MP_TAC) THEN SET_TAC[], ALL_TAC] THEN
2061    MATCH_MP_TAC INTER_INTERIOR_BIGUNION_INTERVALS THEN
2062    ASM_REWRITE_TAC[OPEN_INTERIOR] THEN REPEAT STRIP_TAC THEN
2063    FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[IN_INSERT] THEN
2064    ASM_MESON_TAC[], ALL_TAC] THEN
2065  DISCH_TAC THEN
2066  FIRST_X_ASSUM(MP_TAC o SPEC
2067   ``{ interval[c,d] |
2068       ((c:real) = (a:real)) /\ (d = (a + b) / &2) \/
2069              (c = (a + b) / &2) /\ ((d:real) = (b:real))}``) THEN
2070  ONCE_REWRITE_TAC[GSYM AND_IMP_INTRO] THEN
2071  KNOW_TAC ``FINITE {interval [(c,d)] |
2072        (c = a) /\ (d = (a + b) / 2) \/ (c = (a + b) / 2) /\ (d = b)}`` THENL
2073  [MATCH_MP_TAC FINITE_SUBSET THEN
2074   EXISTS_TAC
2075     ``IMAGE (\s. interval
2076       [(@f. f = if  1n IN s then (a:real) else (a + b) / &2):real,
2077        (@f. f = if  1n IN s then (a + b) / &2 else (b:real))])
2078         {s | s SUBSET {1:num..1:num}}`` THEN
2079    CONJ_TAC THENL
2080     [SIMP_TAC std_ss [FINITE_POWERSET, IMAGE_FINITE, FINITE_NUMSEG], ALL_TAC] THEN
2081    SIMP_TAC std_ss [SUBSET_DEF, GSPECIFICATION, IN_IMAGE, EXISTS_PROD] THEN
2082    X_GEN_TAC ``k:real->bool`` THEN
2083    DISCH_THEN(X_CHOOSE_THEN ``c:real`` (X_CHOOSE_THEN ``d:real``
2084      (CONJUNCTS_THEN2 SUBST1_TAC ASSUME_TAC))) THEN
2085    EXISTS_TAC ``{i | (i = 1:num) /\ ((c:real) = (a:real))}`` THEN
2086    CONJ_TAC THENL [ALL_TAC, SIMP_TAC std_ss [GSPECIFICATION, IN_NUMSEG]] THEN
2087    AP_TERM_TAC THEN REWRITE_TAC[CONS_11, PAIR_EQ] THEN
2088    SIMP_TAC std_ss [GSPECIFICATION] THEN POP_ASSUM MP_TAC THEN
2089    UNDISCH_TAC ``a <= b:real`` THEN REWRITE_TAC [AND_IMP_INTRO] THEN
2090    COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
2091    SIMP_TAC arith_ss [REAL_EQ_RDIV_EQ, REAL_LT] THEN
2092    REAL_ARITH_TAC, ALL_TAC] THEN
2093  DISCH_TAC THEN ASM_SIMP_TAC std_ss [] THEN
2094  GEN_REWR_TAC LAND_CONV [MONO_NOT_EQ] THEN
2095  KNOW_TAC `` (~(P :(real -> bool) -> bool)
2096        (BIGUNION {interval [(c,d)] |
2097            (c = (a :real)) /\ (d = (a + (b :real)) / (2 :real)) \/
2098            (c = (a + b) / (2 :real)) /\ (d = b)}))`` THENL
2099   [UNDISCH_TAC ``~(P :(real -> bool) -> bool)(interval[a:real,b])`` THEN
2100    MATCH_MP_TAC EQ_IMPLIES THEN
2101    AP_TERM_TAC THEN AP_TERM_TAC THEN CONV_TAC SYM_CONV THEN
2102    GEN_REWR_TAC I [EXTENSION] THEN
2103    SIMP_TAC std_ss [IN_BIGUNION, GSPECIFICATION, EXISTS_PROD] THEN
2104    ONCE_REWRITE_TAC [CONJ_SYM] THEN X_GEN_TAC ``x:real`` THEN
2105    SIMP_TAC std_ss [GSYM LEFT_EXISTS_AND_THM] THEN
2106    ONCE_REWRITE_TAC[CONJ_SYM] THEN
2107    REWRITE_TAC[UNWIND_THM2, IN_INTERVAL] THEN
2108    ONCE_REWRITE_TAC[TAUT `c /\ (a \/ b) <=> ~(a ==> ~c) \/ ~(b ==> ~c)`] THEN
2109    REWRITE_TAC[TAUT `~(a ==> ~b) <=> a /\ b`, GSYM CONJ_ASSOC] THEN
2110    SIMP_TAC std_ss [EXISTS_OR_THM, RIGHT_EXISTS_AND_THM] THEN
2111    SIMP_TAC arith_ss [REAL_LE_LDIV_EQ, REAL_LE_RDIV_EQ, REAL_LT] THEN
2112    REAL_ARITH_TAC, ALL_TAC] THEN
2113  DISCH_TAC THEN ASM_REWRITE_TAC [] THEN
2114  KNOW_TAC ``
2115      (!(s :real -> bool). s IN {interval [(c,d)] |
2116          (c = a) /\ (d = (a + b) / (2 :real)) \/
2117          (c = (a + b) / (2 :real)) /\ (d = b)} ==>
2118         ?(a :real) (b :real). s = interval [(a,b)]) =
2119     (!c d. (c = a) /\ (d = (a + b) / 2) \/
2120            (c = (a + b) / 2) /\ (d = b) ==>
2121       ?a b. interval [(c,d)] = interval [(a,b)])`` THENL
2122  [SIMP_TAC std_ss [FORALL_IN_GSPEC], ALL_TAC] THEN DISC_RW_KILL THEN
2123  KNOW_TAC ``(!(s :real -> bool). s IN {interval [(c,d)] |
2124          (c = (a :real)) /\ (d = (a + (b :real)) / (2 :real)) \/
2125          (c = (a + b) / (2 :real)) /\ (d = b)} ==>
2126         (P :(real -> bool) -> bool) s) =
2127       (!c d. (c = a) /\ (d = (a + b) / 2) \/
2128              (c = (a + b) / 2) /\ (d = b) ==>
2129       (P :(real -> bool) -> bool) (interval [(c,d)])) `` THENL
2130  [SIMP_TAC std_ss [FORALL_IN_GSPEC], ALL_TAC] THEN DISC_RW_KILL THEN
2131  MATCH_MP_TAC(TAUT `b /\ (~a ==> e) /\ c ==> ~(a /\ b /\ c) ==> e`) THEN
2132  CONJ_TAC THENL [MESON_TAC[], ALL_TAC] THEN CONJ_TAC THENL
2133   [SIMP_TAC std_ss [NOT_FORALL_THM, NOT_IMP] THEN
2134    DISCH_THEN (X_CHOOSE_TAC ``c:real``) THEN EXISTS_TAC ``c:real`` THEN
2135    POP_ASSUM MP_TAC THEN DISCH_THEN (X_CHOOSE_TAC ``d:real``) THEN
2136    EXISTS_TAC ``d:real`` THEN POP_ASSUM MP_TAC THEN
2137    DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN ASM_REWRITE_TAC[] THEN
2138    ASSUME_TAC REAL_MIDDLE1 THEN ASSUME_TAC REAL_MIDDLE2 THEN
2139    RW_TAC std_ss [] THENL [REAL_ARITH_TAC, METIS_TAC [], METIS_TAC [],
2140    ONCE_REWRITE_TAC [REAL_MUL_SYM] THEN SIMP_TAC std_ss [lemma1,
2141    REAL_DIV_RMUL, REAL_ARITH ``2 <> 0:real``] THEN REAL_ARITH_TAC,
2142    METIS_TAC [], METIS_TAC [], REAL_ARITH_TAC, ONCE_REWRITE_TAC [REAL_MUL_SYM] THEN
2143    SIMP_TAC std_ss [lemma2, REAL_DIV_RMUL, REAL_ARITH ``2 <> 0:real``] THEN
2144    REAL_ARITH_TAC], ALL_TAC] THEN
2145  SIMP_TAC std_ss [GSYM AND_IMP_INTRO, RIGHT_FORALL_IMP_THM, FORALL_IN_GSPEC] THEN
2146  REWRITE_TAC[AND_IMP_INTRO, INTERIOR_CLOSED_INTERVAL] THEN
2147  SIMP_TAC std_ss [GSYM RIGHT_FORALL_IMP_THM] THEN
2148  MAP_EVERY X_GEN_TAC
2149   [``c1:real``, ``d1:real``, ``c2:real``, ``d2:real``] THEN
2150  ASM_CASES_TAC ``(c1 = c2:real) /\ (d1 = d2:real)`` THENL
2151   [ASM_REWRITE_TAC[], ALL_TAC] THEN
2152  DISCH_THEN(fn th =>
2153    DISCH_THEN(CONJUNCTS_THEN2 MP_TAC (K ALL_TAC)) THEN MP_TAC th) THEN
2154  REWRITE_TAC[AND_IMP_INTRO] THEN
2155  UNDISCH_TAC ``~((c1 = c2:real) /\ (d1 = d2:real))`` THEN
2156  ASM_REWRITE_TAC[AND_IMP_INTRO] THEN
2157  DISCH_THEN(CONJUNCTS_THEN2 MP_TAC STRIP_ASSUME_TAC) THEN
2158  ASM_REWRITE_TAC[EXTENSION, IN_INTERVAL, NOT_IN_EMPTY, IN_INTER] THEN
2159  SIMP_TAC arith_ss [REAL_EQ_RDIV_EQ, REAL_EQ_LDIV_EQ, REAL_LT] THEN
2160  REWRITE_TAC[
2161    REAL_ARITH ``((a * &2 <> a + b) \/ (a + b <> b * &2)) <=> ~(a = b:real)``,
2162    REAL_ARITH ``((a + b <> a * &2) \/ (b * &2 <> a + b)) <=> ~(a = b:real)``] THEN
2163  DISCH_THEN(fn th => X_GEN_TAC ``x:real`` THEN MP_TAC th) THEN
2164  REAL_ARITH_TAC
2165QED
2166
2167Theorem lemma1[local]:
2168   !n. 2 pow n <> 0:real
2169Proof
2170  GEN_TAC THEN ONCE_REWRITE_TAC [EQ_SYM_EQ] THEN
2171  MATCH_MP_TAC REAL_LT_IMP_NE THEN MATCH_MP_TAC REAL_LET_TRANS THEN
2172  EXISTS_TAC ``&n:real`` THEN SIMP_TAC std_ss [REAL_POS, POW_2_LT]
2173QED
2174
2175Theorem INTERVAL_BISECTION:
2176 !P. P {} /\
2177     (!s t. P s /\ P t /\ (interior(s) INTER interior(t) = {})
2178            ==> P(s UNION t))
2179     ==> !a b:real.
2180           ~(P(interval[a,b]))
2181           ==> ?x. x IN interval[a,b] /\
2182                   !e. &0 < e
2183                       ==> ?c d. x IN interval[c,d] /\
2184                                 interval[c,d] SUBSET ball(x,e) /\
2185                                 interval[c,d] SUBSET interval[a,b] /\
2186                                 ~P(interval[c,d])
2187Proof
2188  REPEAT STRIP_TAC THEN
2189  SUBGOAL_THEN
2190   ``?A B. (A(0) = a:real) /\ (B(0) = b) /\
2191          !n. ~(P(interval[A(SUC n), B(SUC n)])) /\
2192            A(n) <= A(SUC n) /\ A(SUC n) <= B(SUC n) /\
2193            B(SUC n) <= B(n) /\
2194            &2 * (B(SUC n) - A(SUC n)) <= B(n) - A(n)``
2195  STRIP_ASSUME_TAC THENL
2196   [MP_TAC(ISPEC ``P:(real->bool)->bool`` INTERVAL_BISECTION_STEP) THEN
2197    ASM_REWRITE_TAC[] THEN
2198  KNOW_TAC ``((!a b. ~P (interval [(a,b)]) ==>
2199       ?c d. ~P (interval [(c,d)]) /\ a <= c /\ c <= d /\ d <= b /\
2200                            2 * (d - c) <= b - a)) =
2201           ((!a b. ?c d. ~P (interval [(a,b)]) ==>
2202             ~P (interval [(c,d)]) /\ a <= c /\ c <= d /\ d <= b /\
2203                            2 * (d - c) <= b - a))`` THENL
2204    [SIMP_TAC std_ss [GSYM RIGHT_EXISTS_IMP_THM], ALL_TAC] THEN
2205    DISC_RW_KILL THEN SIMP_TAC std_ss [SKOLEM_THM] THEN
2206    DISCH_THEN(X_CHOOSE_THEN ``C:real->real->real``
2207     (X_CHOOSE_THEN ``D:real->real->real`` ASSUME_TAC)) THEN
2208    KNOW_TAC ``?E. ((E  0n = (a:real,b:real)) /\
2209                (!n. E(SUC n) = (C (FST(E n)) (SND(E n)),
2210                                 D (FST(E n)) (SND(E n)))))`` THENL
2211    [RW_TAC real_ss [num_Axiom], ALL_TAC] THEN
2212    DISCH_THEN(X_CHOOSE_THEN ``E:num->real#real`` STRIP_ASSUME_TAC) THEN
2213    EXISTS_TAC ``\n. FST((E:num->real#real) n)`` THEN
2214    EXISTS_TAC ``\n. SND((E:num->real#real) n)`` THEN BETA_TAC THEN
2215    ASM_REWRITE_TAC[] THEN INDUCT_TAC THEN ASM_SIMP_TAC std_ss [],
2216    ALL_TAC] THEN
2217  SUBGOAL_THEN ``!e. &0 < e
2218        ==> ?n:num. !x y. x IN interval[A(n),B(n)] /\ y IN interval[A(n),B(n)]
2219                          ==> dist(x,y:real) < e`` ASSUME_TAC THENL
2220   [X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN MP_TAC(SPEC
2221     ``sum{1:num..1:num} (\i. (b:real) - (a:real)) / e``
2222     REAL_ARCH_POW2) THEN STRIP_TAC THEN EXISTS_TAC ``n:num`` THEN
2223    MAP_EVERY X_GEN_TAC [``x:real``, ``y:real``] THEN STRIP_TAC THEN
2224    MATCH_MP_TAC REAL_LET_TRANS THEN
2225    EXISTS_TAC ``sum{1:num..1:num}(\i. abs((x - y:real)))`` THEN
2226    CONJ_TAC THENL [REWRITE_TAC [NUMSEG_SING, SUM_SING, REAL_LE_REFL, dist] THEN
2227     REAL_ARITH_TAC, ALL_TAC] THEN
2228    MATCH_MP_TAC REAL_LET_TRANS THEN
2229    EXISTS_TAC ``sum{1:num..1:num}
2230                   (\i. (B:num->real)(n) - (A:num->real)(n))`` THEN
2231    CONJ_TAC THENL
2232     [MATCH_MP_TAC SUM_LE_NUMSEG THEN REPEAT STRIP_TAC THEN BETA_TAC THEN
2233      MATCH_MP_TAC(REAL_ARITH ``a <= x /\ x <= b /\ a <= y /\ y <= b
2234                               ==> abs(x - y) <= b - a:real``) THEN
2235      UNDISCH_TAC ``x IN interval[(A:num->real) n,B n]`` THEN
2236      UNDISCH_TAC ``y IN interval[(A:num->real) n,B n]`` THEN
2237      REWRITE_TAC[IN_INTERVAL] THEN ASM_SIMP_TAC std_ss [],
2238      ALL_TAC] THEN
2239    MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC
2240     ``sum{1:num..1:num} (\i. (b:real) - (a:real)) / (2:real) pow n`` THEN
2241    CONJ_TAC THENL
2242     [ALL_TAC,
2243      SIMP_TAC arith_ss [REAL_LT_LDIV_EQ, REAL_POW_LT, REAL_LT] THEN
2244      ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
2245      ASM_SIMP_TAC std_ss [GSYM REAL_LT_LDIV_EQ]] THEN
2246    REWRITE_TAC[real_div] THEN ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
2247    REWRITE_TAC[GSYM SUM_LMUL] THEN MATCH_MP_TAC SUM_LE_NUMSEG THEN
2248    X_GEN_TAC ``j:num`` THEN STRIP_TAC THEN REWRITE_TAC[] THEN
2249    ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN REWRITE_TAC[GSYM real_div] THEN
2250    SPEC_TAC(``n:num``,``m:num``) THEN INDUCT_TAC THEN
2251    ASM_REWRITE_TAC[pow, REAL_OVER1, REAL_LE_REFL] THEN
2252    ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
2253    SIMP_TAC arith_ss [real_div, REAL_INV_MUL, REAL_MUL_ASSOC, lemma1,
2254                       REAL_ARITH ``2 <> 0:real``] THEN
2255    SIMP_TAC arith_ss [GSYM real_div, REAL_LE_RDIV_EQ, REAL_LT] THEN
2256    ASM_MESON_TAC[REAL_LE_TRANS, REAL_MUL_SYM], ALL_TAC] THEN
2257  SUBGOAL_THEN ``?a:real. !n:num. a IN interval[A(n),B(n)]`` MP_TAC THENL
2258   [ONCE_REWRITE_TAC [METIS [] ``!a n. interval [(A n,B n)] =
2259                                  (\n. interval [(A n,B n)]) n``] THEN
2260    MATCH_MP_TAC DECREASING_CLOSED_NEST THEN
2261    ASM_SIMP_TAC std_ss [CLOSED_INTERVAL] THEN CONJ_TAC THENL
2262     [REWRITE_TAC[GSYM INTERVAL_EQ_EMPTY] THEN
2263      METIS_TAC[REAL_NOT_LT, REAL_LE_TRANS],
2264      ALL_TAC] THEN
2265    REWRITE_TAC[LE_EXISTS] THEN SIMP_TAC std_ss [LEFT_IMP_EXISTS_THM] THEN
2266    X_GEN_TAC ``m:num`` THEN
2267    SIMP_TAC std_ss [GSYM LEFT_IMP_EXISTS_THM, EXISTS_REFL] THEN
2268    INDUCT_TAC THEN REWRITE_TAC[ADD_CLAUSES, SUBSET_REFL] THEN
2269    MATCH_MP_TAC SUBSET_TRANS THEN
2270    first_assum $ irule_at Any THEN
2271    ASM_REWRITE_TAC[] THEN
2272    REWRITE_TAC[SUBSET_DEF, IN_INTERVAL] THEN ASM_MESON_TAC[REAL_LE_TRANS],
2273    ALL_TAC] THEN
2274  DISCH_THEN (X_CHOOSE_TAC ``x0:real``) THEN EXISTS_TAC ``x0:real`` THEN
2275  CONJ_TAC THENL [ASM_MESON_TAC[], ALL_TAC] THEN
2276  X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
2277  FIRST_X_ASSUM(MP_TAC o SPEC ``e:real``) THEN ASM_REWRITE_TAC[] THEN
2278  DISCH_THEN(X_CHOOSE_TAC ``n:num``) THEN
2279  MAP_EVERY EXISTS_TAC [``(A:num->real) n``, ``(B:num->real) n``] THEN
2280  ASM_REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL
2281   [REWRITE_TAC[SUBSET_DEF, IN_BALL] THEN ASM_MESON_TAC[],
2282    ALL_TAC,
2283    SPEC_TAC(``n:num``,``p:num``) THEN INDUCT_TAC THEN ASM_REWRITE_TAC[]] THEN
2284  SUBGOAL_THEN
2285   ``!m n. m <= n ==> interval[(A:num->real) n,B n] SUBSET interval[A m,B m]``
2286    (fn th => ASM_MESON_TAC[SUBSET_DEF, LE_0, th]) THEN
2287  ONCE_REWRITE_TAC [METIS [] ``!m n. (interval [(A n,B n)] SUBSET
2288                                      interval [(A m,B m)]) =
2289                               (\m n. interval [(A n,B n)] SUBSET
2290                                      interval [(A m,B m)]) m n``] THEN
2291  MATCH_MP_TAC TRANSITIVE_STEPWISE_LE THEN
2292  REPEAT(CONJ_TAC THENL [SET_TAC[], ALL_TAC]) THEN
2293  REWRITE_TAC[SUBSET_INTERVAL] THEN ASM_MESON_TAC[]
2294QED
2295
2296(* ------------------------------------------------------------------------- *)
2297(* Cousin's lemma.                                                           *)
2298(* ------------------------------------------------------------------------- *)
2299
2300Theorem FINE_DIVISION_EXISTS:
2301   !g a b:real.
2302        gauge g ==> ?p. p tagged_division_of (interval[a,b]) /\ g FINE p
2303Proof
2304  REPEAT STRIP_TAC THEN
2305  MP_TAC(ISPEC ``\s:real->bool. ?p. p tagged_division_of s /\ g FINE p``
2306        INTERVAL_BISECTION) THEN
2307  SIMP_TAC std_ss [] THEN
2308  KNOW_TAC ``(?p. p tagged_division_of {} /\ g FINE p) /\
2309 (!s t.
2310    (?p. p tagged_division_of s /\ g FINE p) /\
2311    (?p. p tagged_division_of t /\ g FINE p) /\
2312    (interior s INTER interior t = {}) ==>
2313    ?p. p tagged_division_of s UNION t /\ g FINE p)`` THENL
2314   [MESON_TAC[TAGGED_DIVISION_UNION, FINE_UNION,
2315              TAGGED_DIVISION_OF_EMPTY, FINE, NOT_IN_EMPTY],
2316    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN
2317    DISCH_THEN(MP_TAC o SPECL [``a:real``, ``b:real``])] THEN
2318  GEN_REWR_TAC LAND_CONV [MONO_NOT_EQ] THEN
2319  REWRITE_TAC [GSYM DE_MORGAN_THM] THEN
2320  REWRITE_TAC [METIS [] ``( ~!p. ~(p tagged_division_of interval [(a,b)] /\ g FINE p)) =
2321                          ( ?p. (p tagged_division_of interval [(a,b)] /\ g FINE p))``] THEN
2322  DISCH_THEN MATCH_MP_TAC THEN
2323  DISCH_THEN(X_CHOOSE_THEN ``x:real`` (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
2324  FIRST_ASSUM(MP_TAC o SPEC ``x:real`` o REWRITE_RULE[gauge_def]) THEN
2325  DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
2326  SIMP_TAC std_ss [OPEN_CONTAINS_BALL, NOT_FORALL_THM] THEN
2327  DISCH_THEN(MP_TAC o SPEC ``x:real``) THEN ASM_REWRITE_TAC[] THEN
2328  STRIP_TAC THEN EXISTS_TAC ``e:real`` THEN
2329  ASM_SIMP_TAC std_ss [NOT_EXISTS_THM] THEN
2330  MAP_EVERY X_GEN_TAC [``c:real``, ``d:real``] THEN
2331  CCONTR_TAC THEN FULL_SIMP_TAC std_ss [] THEN
2332  FIRST_X_ASSUM(MP_TAC o SPEC ``{(x:real,interval[c:real,d])}``) THEN
2333  ASM_SIMP_TAC std_ss [TAGGED_DIVISION_OF_SELF] THEN
2334  SIMP_TAC std_ss [FINE, IN_SING, PAIR_EQ] THEN ASM_MESON_TAC[SUBSET_TRANS]
2335QED
2336
2337(* ------------------------------------------------------------------------- *)
2338(* Basic theorems about integrals.                                           *)
2339(* ------------------------------------------------------------------------- *)
2340
2341Theorem HAS_INTEGRAL_UNIQUE:
2342   !f:real->real i k1 k2.
2343        (f has_integral k1) i /\ (f has_integral k2) i ==> (k1 = k2)
2344Proof
2345  REPEAT GEN_TAC THEN
2346  SUBGOAL_THEN
2347   ``!f:real->real a b k1 k2.
2348       (f has_integral k1) (interval[a,b]) /\
2349       (f has_integral k2) (interval[a,b])
2350       ==> (k1 = k2)``
2351  MP_TAC THENL
2352   [REPEAT GEN_TAC THEN REWRITE_TAC[has_integral] THEN
2353    SIMP_TAC std_ss [GSYM FORALL_AND_THM] THEN
2354    REWRITE_TAC[TAUT `(a ==> b) /\ (a ==> c) <=> a ==> b /\ c`] THEN
2355    ONCE_REWRITE_TAC[MONO_NOT_EQ] THEN
2356    ONCE_REWRITE_TAC[GSYM REAL_SUB_0] THEN
2357    REWRITE_TAC[REAL_ARITH ``!x. ~(x:real = &0) <=> &0 < abs x``] THEN DISCH_TAC THEN
2358    DISCH_THEN(MP_TAC o SPEC ``abs(k1 - k2 :real) / &2``) THEN
2359    ASM_REWRITE_TAC[REAL_LT_HALF1] THEN
2360    DISCH_THEN(CONJUNCTS_THEN2
2361     (X_CHOOSE_THEN ``d1:real->real->bool`` STRIP_ASSUME_TAC)
2362     (X_CHOOSE_THEN ``d2:real->real->bool`` STRIP_ASSUME_TAC)) THEN
2363    MP_TAC(ISPEC ``\x. ((d1:real->real->bool) x) INTER (d2 x)``
2364                 FINE_DIVISION_EXISTS) THEN
2365    DISCH_THEN(MP_TAC o SPECL [``a:real``, ``b:real``]) THEN
2366    ASM_SIMP_TAC std_ss [GAUGE_INTER] THEN
2367    KNOW_TAC ``(?p. p tagged_division_of interval [a,b] /\
2368               (\x. d1 x INTER d2 x) FINE p) ==> F`` THENL
2369    [ALL_TAC,METIS_TAC []] THEN POP_ASSUM MP_TAC THEN
2370    UNDISCH_TAC `` !p.
2371        p tagged_division_of interval [(a,b)] /\ d1 FINE p ==>
2372        abs (sum p (\(x,k). content k * f x) - k1) < abs (k1 - k2) / 2`` THEN
2373    REWRITE_TAC [] THEN SIMP_TAC std_ss [AND_IMP_INTRO, NOT_EXISTS_THM] THEN
2374    SIMP_TAC std_ss [GSYM FORALL_AND_THM] THEN DISCH_TAC THEN
2375    GEN_TAC THEN POP_ASSUM (MP_TAC o Q.SPEC `(p :real # (real -> bool) -> bool)`) THEN
2376    REWRITE_TAC [GSYM DE_MORGAN_THM] THEN
2377    MATCH_MP_TAC(TAUT
2378     `(f0 ==> f1 /\ f2) /\ ~(n1 /\ n2)
2379      ==> (t /\ f1 ==> n1) /\ (t /\ f2 ==> n2) ==> ~(t /\ f0)`) THEN
2380    CONJ_TAC THENL [SIMP_TAC std_ss [FINE, SUBSET_INTER], ALL_TAC] THEN
2381    MATCH_MP_TAC(METIS [REAL_HALF, REAL_LT_ADD2, REAL_NOT_LE]
2382      ``c:real <= a + b ==> ~(a < c / &2 /\ b < c / &2)``) THEN
2383    MESON_TAC[ABS_SUB, ABS_TRIANGLE, REAL_ARITH
2384     ``k1 - k2:real = (k1 - x) + (x - k2)``],
2385    ALL_TAC] THEN
2386  DISCH_TAC THEN ONCE_REWRITE_TAC[has_integral_alt] THEN
2387  COND_CASES_TAC THEN ASM_REWRITE_TAC[] THENL
2388   [ASM_MESON_TAC[], ALL_TAC] THEN
2389  DISCH_TAC THEN MATCH_MP_TAC(REAL_ARITH
2390   ``~(&0:real < abs(x - y)) ==> (x = y)``) THEN
2391  DISCH_TAC THEN
2392  FIRST_X_ASSUM(CONJUNCTS_THEN (MP_TAC o SPEC ``abs(k1 - k2:real) / &2``)) THEN
2393  ASM_REWRITE_TAC[REAL_HALF] THEN
2394  DISCH_THEN(X_CHOOSE_THEN ``B1:real`` STRIP_ASSUME_TAC) THEN
2395  DISCH_THEN(X_CHOOSE_THEN ``B2:real`` STRIP_ASSUME_TAC) THEN
2396  MP_TAC(ISPEC
2397   ``ball(0,B1) UNION ball(0:real,B2)``
2398   BOUNDED_SUBSET_CLOSED_INTERVAL) THEN
2399  SIMP_TAC std_ss [BOUNDED_UNION, BOUNDED_BALL, UNION_SUBSET, NOT_EXISTS_THM] THEN
2400  MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``] THEN
2401  REWRITE_TAC [GSYM DE_MORGAN_THM] THEN
2402  DISCH_THEN(CONJUNCTS_THEN(ANTE_RES_THEN MP_TAC)) THEN
2403  DISCH_THEN(X_CHOOSE_THEN ``w:real`` STRIP_ASSUME_TAC) THEN
2404  DISCH_THEN(X_CHOOSE_THEN ``z:real`` STRIP_ASSUME_TAC) THEN
2405  SUBGOAL_THEN ``w:real = z:real`` SUBST_ALL_TAC THENL
2406  [METIS_TAC [], ALL_TAC] THEN
2407  KNOW_TAC ``~(abs(z - k1) < abs(k1 - k2) / &2:real /\
2408               abs(z - k2) < abs(k1 - k2) / &2:real)`` THENL
2409  [SIMP_TAC arith_ss [REAL_LT_RDIV_EQ, REAL_ARITH ``0 < 2:real``] THEN
2410   REWRITE_TAC [GSYM REAL_DOUBLE] THEN REAL_ARITH_TAC, ALL_TAC] THEN
2411  METIS_TAC[]
2412QED
2413
2414Theorem INTEGRAL_UNIQUE:
2415   !f y k.
2416      (f has_integral y) k ==> (integral k f = y)
2417Proof
2418  REPEAT STRIP_TAC THEN REWRITE_TAC[integral] THEN
2419  MATCH_MP_TAC SELECT_UNIQUE THEN ASM_MESON_TAC[HAS_INTEGRAL_UNIQUE]
2420QED
2421
2422Theorem HAS_INTEGRAL_INTEGRABLE_INTEGRAL:
2423   !f:real->real i s.
2424        (f has_integral i) s <=> f integrable_on s /\ (integral s f = i)
2425Proof
2426  MESON_TAC[INTEGRABLE_INTEGRAL, INTEGRAL_UNIQUE, integrable_on]
2427QED
2428
2429Theorem INTEGRAL_EQ_HAS_INTEGRAL:
2430   !s f y. f integrable_on s ==> ((integral s f = y) <=> (f has_integral y) s)
2431Proof
2432  MESON_TAC[INTEGRABLE_INTEGRAL, INTEGRAL_UNIQUE]
2433QED
2434
2435Theorem HAS_INTEGRAL_IS_0:
2436   !f:real->real s.
2437        (!x. x IN s ==> (f(x) = 0)) ==> (f has_integral 0) s
2438Proof
2439  SUBGOAL_THEN
2440   ``!f:real->real a b.
2441        (!x. x IN interval[a,b] ==> (f(x) = 0))
2442        ==> (f has_integral 0) (interval[a,b])``
2443  ASSUME_TAC THENL
2444   [REPEAT STRIP_TAC THEN REWRITE_TAC[has_integral] THEN
2445    REPEAT STRIP_TAC THEN EXISTS_TAC ``\x:real. ball(x,&1)`` THEN
2446    SIMP_TAC std_ss [gauge_def, OPEN_BALL, CENTRE_IN_BALL, REAL_LT_01] THEN
2447    REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_SUB_RZERO] THEN
2448    UNDISCH_TAC ``&0 < e:real`` THEN MATCH_MP_TAC(TAUT `(a <=> b) ==> b ==> a`) THEN
2449    AP_THM_TAC THEN AP_TERM_TAC THEN
2450    REWRITE_TAC[ABS_ZERO, REAL_SUB_0, REAL_ADD_LID] THEN
2451    MATCH_MP_TAC SUM_EQ_0 THEN SIMP_TAC std_ss [FORALL_PROD] THEN
2452    X_GEN_TAC ``x:real`` THEN REPEAT STRIP_TAC THEN
2453    SUBGOAL_THEN ``(x:real) IN interval[a,b]``
2454     (fn th => ASM_SIMP_TAC std_ss [th, REAL_MUL_RZERO]) THEN
2455    UNDISCH_TAC ``p tagged_division_of interval [(a,b)]`` THEN DISCH_TAC THEN
2456    FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [tagged_division_of]) THEN
2457    REWRITE_TAC[tagged_partial_division_of, SUBSET_DEF] THEN ASM_MESON_TAC[],
2458    ALL_TAC] THEN
2459  REPEAT STRIP_TAC THEN ONCE_REWRITE_TAC[has_integral_alt] THEN
2460  COND_CASES_TAC THEN ASM_REWRITE_TAC[] THENL
2461   [ASM_MESON_TAC[], ALL_TAC] THEN
2462  GEN_TAC THEN DISCH_TAC THEN EXISTS_TAC ``&1:real`` THEN REWRITE_TAC[REAL_LT_01] THEN
2463  REPEAT STRIP_TAC THEN EXISTS_TAC ``0:real`` THEN
2464  ASM_REWRITE_TAC[REAL_SUB_REFL, ABS_0] THEN
2465  FIRST_X_ASSUM MATCH_MP_TAC THEN METIS_TAC[]
2466QED
2467
2468Theorem HAS_INTEGRAL_0:
2469   !s. ((\x. 0) has_integral 0) s
2470Proof
2471  SIMP_TAC std_ss [HAS_INTEGRAL_IS_0]
2472QED
2473
2474Theorem HAS_INTEGRAL_0_EQ:
2475   !i s. ((\x. 0) has_integral i) s <=> (i = 0)
2476Proof
2477  MESON_TAC[HAS_INTEGRAL_UNIQUE, HAS_INTEGRAL_0]
2478QED
2479
2480Theorem HAS_INTEGRAL_LINEAR:
2481   !f:real->real y s h:real->real.
2482        (f has_integral y) s /\ linear h ==> ((h o f) has_integral h(y)) s
2483Proof
2484  SUBGOAL_THEN
2485    ``!f:real->real y a b h:real->real.
2486          (f has_integral y) (interval[a,b]) /\ linear h
2487          ==> ((h o f) has_integral h(y)) (interval[a,b])``
2488  MP_TAC THENL
2489   [REPEAT GEN_TAC THEN REWRITE_TAC[has_integral] THEN STRIP_TAC THEN
2490    FIRST_ASSUM(MP_TAC o MATCH_MP LINEAR_BOUNDED_POS) THEN
2491    DISCH_THEN(X_CHOOSE_THEN ``B:real`` STRIP_ASSUME_TAC) THEN
2492    X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
2493    UNDISCH_TAC ``!e.
2494        0 < e ==> ?d. gauge d /\
2495          !p. p tagged_division_of interval [(a,b)] /\ d FINE p ==>
2496            abs (sum p (\(x,k). content k * f x) - y) < e`` THEN
2497    DISCH_TAC THEN
2498    FIRST_X_ASSUM(MP_TAC o SPEC ``e:real / B``) THEN
2499    ASM_SIMP_TAC std_ss [REAL_LT_DIV] THEN
2500    STRIP_TAC THEN EXISTS_TAC ``d:real -> real -> bool`` THEN
2501    ASM_SIMP_TAC std_ss [] THEN
2502    X_GEN_TAC ``p:real#(real->bool)->bool`` THEN STRIP_TAC THEN
2503    FIRST_X_ASSUM(MP_TAC o SPEC ``p:real#(real->bool)->bool``) THEN
2504    ASM_SIMP_TAC std_ss [REAL_LT_RDIV_EQ] THEN ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
2505    MATCH_MP_TAC(REAL_ARITH ``x <= y ==> y < e ==> x < e:real``) THEN
2506    FIRST_ASSUM(fn th => W(fn (asl,w) =>
2507      MP_TAC(PART_MATCH rand th (rand w)))) THEN
2508    MATCH_MP_TAC(REAL_ARITH ``x <= y ==> y <= e ==> x <= e:real``) THEN
2509    FIRST_ASSUM(ASSUME_TAC o MATCH_MP TAGGED_DIVISION_OF_FINITE) THEN
2510    ASM_SIMP_TAC std_ss [LINEAR_SUB, LINEAR_SUM, o_DEF, LAMBDA_PROD,
2511                 REAL_MUL_SYM, LINEAR_CMUL, REAL_LE_REFL], ALL_TAC] THEN
2512  DISCH_TAC THEN REPEAT GEN_TAC THEN
2513  DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
2514  ONCE_REWRITE_TAC[has_integral_alt] THEN
2515  COND_CASES_TAC THEN ASM_REWRITE_TAC[] THENL
2516   [ASM_MESON_TAC[], ALL_TAC] THEN
2517  DISCH_TAC THEN
2518  FIRST_ASSUM(X_CHOOSE_THEN ``B:real`` STRIP_ASSUME_TAC o MATCH_MP
2519    LINEAR_BOUNDED_POS) THEN
2520  X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
2521  UNDISCH_TAC ``!e.
2522        0 < e ==> ?B. 0 < B /\
2523          !a b. ball (0,B) SUBSET interval [(a,b)] ==>
2524            ?z. ((\x. if x IN s then f x else 0) has_integral z)
2525                (interval [(a,b)]) /\ abs (z - y) < e`` THEN
2526  DISCH_TAC THEN
2527  FIRST_X_ASSUM(MP_TAC o SPEC ``e / B:real``) THEN
2528  ASM_SIMP_TAC std_ss [REAL_LT_DIV] THEN
2529  DISCH_THEN (X_CHOOSE_TAC ``M:real``) THEN
2530  EXISTS_TAC ``M:real`` THEN POP_ASSUM MP_TAC THEN
2531  MATCH_MP_TAC MONO_AND THEN REWRITE_TAC[] THEN
2532  DISCH_TAC THEN MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``] THEN
2533  POP_ASSUM (MP_TAC o Q.SPECL [`a:real`, `b:real`]) THEN
2534  MATCH_MP_TAC MONO_IMP THEN REWRITE_TAC[] THEN
2535  DISCH_THEN(X_CHOOSE_THEN ``z:real`` STRIP_ASSUME_TAC) THEN
2536  EXISTS_TAC ``(h:real->real) z`` THEN
2537  SUBGOAL_THEN
2538   ``(\x. if x IN s then (h:real->real) ((f:real->real) x) else 0)
2539    = h o (\x. if x IN s then f x else 0)``
2540  SUBST1_TAC THENL
2541   [SIMP_TAC std_ss [FUN_EQ_THM, o_THM] THEN METIS_TAC[LINEAR_0], ALL_TAC] THEN
2542  ASM_SIMP_TAC std_ss [GSYM LINEAR_SUB] THEN
2543  MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC ``B * abs(z - y:real)`` THEN
2544  ASM_REWRITE_TAC[] THEN ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
2545  ASM_SIMP_TAC std_ss [GSYM REAL_LT_RDIV_EQ]
2546QED
2547
2548Theorem HAS_INTEGRAL_CMUL:
2549   !(f:real->real) k s c.
2550        (f has_integral k) s
2551        ==> ((\x. c * f(x)) has_integral (c * k)) s
2552Proof
2553  REPEAT STRIP_TAC THEN MATCH_MP_TAC
2554   (REWRITE_RULE[o_DEF] HAS_INTEGRAL_LINEAR) THEN
2555  ASM_REWRITE_TAC[linear] THEN CONJ_TAC THEN REAL_ARITH_TAC
2556QED
2557
2558Theorem HAS_INTEGRAL_NEG:
2559   !f k s. (f has_integral k) s ==> ((\x. -(f x)) has_integral (-k)) s
2560Proof
2561  ONCE_REWRITE_TAC[REAL_NEG_MINUS1] THEN REWRITE_TAC[HAS_INTEGRAL_CMUL]
2562QED
2563
2564Theorem HAS_INTEGRAL_ADD:
2565   !f:real->real g s k l.
2566        (f has_integral k) s /\ (g has_integral l) s
2567        ==> ((\x. f(x) + g(x)) has_integral (k + l)) s
2568Proof
2569  SUBGOAL_THEN
2570   ``!f:real->real g k l a b.
2571        (f has_integral k) (interval[a,b]) /\
2572        (g has_integral l) (interval[a,b])
2573        ==> ((\x. f(x) + g(x)) has_integral (k + l)) (interval[a,b])``
2574  ASSUME_TAC THENL
2575   [REPEAT GEN_TAC THEN SIMP_TAC std_ss [has_integral, GSYM FORALL_AND_THM] THEN
2576    DISCH_TAC THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
2577    FIRST_X_ASSUM(MP_TAC o SPEC ``e / &2:real``) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
2578    DISCH_THEN(CONJUNCTS_THEN2
2579     (X_CHOOSE_THEN ``d1:real->real->bool`` STRIP_ASSUME_TAC)
2580     (X_CHOOSE_THEN ``d2:real->real->bool`` STRIP_ASSUME_TAC)) THEN
2581    EXISTS_TAC ``\x. ((d1:real->real->bool) x) INTER (d2 x)`` THEN
2582    ASM_SIMP_TAC std_ss [GAUGE_INTER] THEN
2583    REWRITE_TAC[tagged_division_of, tagged_partial_division_of] THEN
2584    SIMP_TAC std_ss [SUM_ADD, REAL_ADD_LDISTRIB, LAMBDA_PAIR] THEN
2585    SIMP_TAC std_ss [GSYM LAMBDA_PAIR] THEN
2586    REWRITE_TAC [METIS [] ``(a <> b) = ~(a = b)``, GSYM DE_MORGAN_THM] THEN
2587    REWRITE_TAC [GSYM PAIR_EQ] THEN
2588    SIMP_TAC std_ss [GSYM tagged_partial_division_of] THEN
2589    REWRITE_TAC[GSYM tagged_division_of, FINE_INTER] THEN
2590    SIMP_TAC std_ss [REAL_ARITH ``(a + b) - (c + d) = (a - c) + (b - d):real``] THEN
2591    REPEAT STRIP_TAC THEN MATCH_MP_TAC ABS_TRIANGLE_LT THEN
2592    MATCH_MP_TAC(METIS [REAL_HALF, REAL_LT_ADD2]
2593     ``x < e / &2 /\ y < e / &2 ==> x + y < e:real``) THEN
2594    ASM_SIMP_TAC std_ss [], ALL_TAC] THEN
2595  REPEAT GEN_TAC THEN ONCE_REWRITE_TAC[has_integral_alt] THEN
2596  COND_CASES_TAC THEN ASM_REWRITE_TAC[] THENL
2597   [METIS_TAC[], ALL_TAC] THEN
2598  DISCH_TAC THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
2599  FIRST_X_ASSUM(CONJUNCTS_THEN (MP_TAC o SPEC ``e / &2:real``)) THEN
2600  ASM_REWRITE_TAC[REAL_HALF] THEN
2601  DISCH_THEN(X_CHOOSE_THEN ``B1:real`` STRIP_ASSUME_TAC) THEN
2602  DISCH_THEN(X_CHOOSE_THEN ``B2:real`` STRIP_ASSUME_TAC) THEN
2603  EXISTS_TAC ``max B1 B2:real`` THEN ASM_REWRITE_TAC[REAL_LT_MAX] THEN
2604  REWRITE_TAC[BALL_MAX_UNION, UNION_SUBSET] THEN
2605  MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``] THEN
2606  DISCH_THEN(CONJUNCTS_THEN(ANTE_RES_THEN MP_TAC)) THEN
2607  DISCH_THEN(X_CHOOSE_THEN ``w:real`` STRIP_ASSUME_TAC) THEN
2608  DISCH_THEN(X_CHOOSE_THEN ``z:real`` STRIP_ASSUME_TAC) THEN
2609  EXISTS_TAC ``w + z:real`` THEN BETA_TAC THEN
2610  SUBGOAL_THEN
2611    ``(\x. if x IN s then (f:real->real) x + g x else 0) =
2612      (\x. (if x IN s then f x else 0) + (if x IN s then g x else 0))``
2613  SUBST1_TAC THENL
2614   [SIMP_TAC std_ss [FUN_EQ_THM] THEN GEN_TAC THEN COND_CASES_TAC THEN
2615    ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC,
2616    ALL_TAC] THEN
2617  ASM_SIMP_TAC std_ss [] THEN
2618  REWRITE_TAC [REAL_ARITH ``(w + z - (k + l)) = ((w - k) + (z - l):real)``] THEN
2619  METIS_TAC [ABS_TRIANGLE_LT, REAL_HALF, REAL_LT_ADD2]
2620QED
2621
2622Theorem HAS_INTEGRAL_SUB:
2623   !f:real->real g s k l.
2624        (f has_integral k) s /\ (g has_integral l) s
2625        ==> ((\x. f(x) - g(x)) has_integral (k - l)) s
2626Proof
2627  SIMP_TAC std_ss [real_sub, HAS_INTEGRAL_NEG, HAS_INTEGRAL_ADD]
2628QED
2629
2630Theorem INTEGRAL_0:
2631   !s. integral s (\x. 0) = 0
2632Proof
2633  MESON_TAC[INTEGRAL_UNIQUE, HAS_INTEGRAL_0]
2634QED
2635
2636Theorem INTEGRAL_ADD:
2637   !f:real->real g s.
2638        f integrable_on s /\ g integrable_on s
2639        ==> (integral s (\x. f x + g x) = integral s f + integral s g)
2640Proof
2641  REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRAL_UNIQUE THEN
2642  MATCH_MP_TAC HAS_INTEGRAL_ADD THEN ASM_SIMP_TAC std_ss [INTEGRABLE_INTEGRAL]
2643QED
2644
2645Theorem INTEGRAL_CMUL:
2646   !f:real->real c s.
2647        f integrable_on s ==> (integral s (\x. c * f(x)) = c * integral s f)
2648Proof
2649  REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRAL_UNIQUE THEN
2650  MATCH_MP_TAC HAS_INTEGRAL_CMUL THEN ASM_SIMP_TAC std_ss [INTEGRABLE_INTEGRAL]
2651QED
2652
2653Theorem INTEGRAL_NEG:
2654   !f:real->real s.
2655        f integrable_on s ==> (integral s (\x. -f(x)) = -integral s f)
2656Proof
2657  REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRAL_UNIQUE THEN
2658  MATCH_MP_TAC HAS_INTEGRAL_NEG THEN ASM_SIMP_TAC std_ss [INTEGRABLE_INTEGRAL]
2659QED
2660
2661Theorem INTEGRAL_SUB:
2662   !(f :real -> real) g s.
2663        f integrable_on s /\ g integrable_on s
2664        ==> (integral s (\x. f x - g x) = integral s f - integral s g)
2665Proof
2666  REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRAL_UNIQUE THEN
2667  MATCH_MP_TAC HAS_INTEGRAL_SUB THEN ASM_SIMP_TAC std_ss [INTEGRABLE_INTEGRAL]
2668QED
2669
2670Theorem INTEGRABLE_0:
2671   !s. (\x. 0) integrable_on s
2672Proof
2673  REWRITE_TAC[integrable_on] THEN MESON_TAC[HAS_INTEGRAL_0]
2674QED
2675
2676Theorem INTEGRABLE_ADD:
2677   !f:real->real g s.
2678        f integrable_on s /\ g integrable_on s
2679        ==> (\x. f x + g x) integrable_on s
2680Proof
2681  REWRITE_TAC[integrable_on] THEN METIS_TAC[HAS_INTEGRAL_ADD]
2682QED
2683
2684Theorem INTEGRABLE_CMUL:
2685   !f:real->real c s.
2686        f integrable_on s ==> (\x. c * f(x)) integrable_on s
2687Proof
2688  REWRITE_TAC[integrable_on] THEN METIS_TAC[HAS_INTEGRAL_CMUL]
2689QED
2690
2691Theorem INTEGRABLE_CMUL_EQ:
2692   !f:real->real s c.
2693      (\x. c * f x) integrable_on s <=> (c = &0) \/ f integrable_on s
2694Proof
2695  REPEAT(STRIP_TAC ORELSE EQ_TAC) THEN
2696  ASM_SIMP_TAC std_ss [INTEGRABLE_CMUL, REAL_MUL_LZERO, INTEGRABLE_0] THEN
2697  ASM_CASES_TAC ``c = &0:real`` THEN ASM_REWRITE_TAC[] THEN
2698  FIRST_X_ASSUM(MP_TAC o SPEC ``inv c:real`` o MATCH_MP INTEGRABLE_CMUL) THEN
2699  ASM_SIMP_TAC std_ss [REAL_MUL_ASSOC, REAL_MUL_LID, REAL_MUL_LINV, ETA_AX]
2700QED
2701
2702Theorem INTEGRABLE_NEG:
2703   !f:real->real s.
2704        f integrable_on s ==> (\x. -f(x)) integrable_on s
2705Proof
2706  REWRITE_TAC[integrable_on] THEN METIS_TAC[HAS_INTEGRAL_NEG]
2707QED
2708
2709Theorem INTEGRABLE_SUB:
2710   !f:real->real g s.
2711        f integrable_on s /\ g integrable_on s
2712        ==> (\x. f x - g x) integrable_on s
2713Proof
2714  REWRITE_TAC[integrable_on] THEN METIS_TAC[HAS_INTEGRAL_SUB]
2715QED
2716
2717Theorem INTEGRABLE_LINEAR:
2718   !f h s. f integrable_on s /\ linear h ==> (h o f) integrable_on s
2719Proof
2720  REWRITE_TAC[integrable_on] THEN METIS_TAC[HAS_INTEGRAL_LINEAR]
2721QED
2722
2723Theorem INTEGRAL_LINEAR:
2724   !f:real->real s h:real->real.
2725        f integrable_on s /\ linear h
2726        ==> (integral s (h o f) = h(integral s f))
2727Proof
2728  REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_INTEGRAL_UNIQUE THEN
2729  MAP_EVERY EXISTS_TAC
2730   [``(h:real->real) o (f:real->real)``, ``s:real->bool``] THEN
2731  CONJ_TAC THENL [ALL_TAC, MATCH_MP_TAC HAS_INTEGRAL_LINEAR] THEN
2732  ASM_SIMP_TAC std_ss [GSYM HAS_INTEGRAL_INTEGRAL, INTEGRABLE_LINEAR]
2733QED
2734
2735Theorem HAS_INTEGRAL_SUM:
2736   !f:'a->real->real s t.
2737        FINITE t /\
2738        (!a. a IN t ==> ((f a) has_integral (i a)) s)
2739        ==> ((\x. sum t (\a. f a x)) has_integral (sum t i)) s
2740Proof
2741  GEN_TAC THEN GEN_TAC THEN REWRITE_TAC[IMP_CONJ] THEN
2742  KNOW_TAC ``!t. ((!a. a IN t ==> ((f:'a->real->real) a has_integral i a) s) ==>
2743          ((\x. sum t (\a. f a x)) has_integral sum t i) s) =
2744             (\t. (!a. a IN t ==> (f a has_integral i a) s) ==>
2745          ((\x. sum t (\a. f a x)) has_integral sum t i) s) t`` THENL
2746  [FULL_SIMP_TAC std_ss [], ALL_TAC] THEN DISC_RW_KILL THEN
2747  MATCH_MP_TAC FINITE_INDUCT THEN BETA_TAC THEN
2748  SIMP_TAC std_ss [SUM_CLAUSES, HAS_INTEGRAL_0, IN_INSERT] THEN
2749  REPEAT STRIP_TAC THEN
2750  ONCE_REWRITE_TAC [METIS [] ``!x.  sum s' (\a. f a x) =
2751                               (\x. sum s' (\a. f a x)) x``] THEN
2752  MATCH_MP_TAC HAS_INTEGRAL_ADD THEN
2753  ASM_SIMP_TAC std_ss [ETA_AX] THEN CONJ_TAC THEN
2754  FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_SIMP_TAC std_ss []
2755QED
2756
2757Theorem INTEGRAL_SUM:
2758   !f:'a->real->real s t.
2759        FINITE t /\
2760        (!a. a IN t ==> (f a) integrable_on s)
2761        ==> (integral s (\x. sum t (\a. f a x)) =
2762                  sum t (\a. integral s (f a)))
2763Proof
2764  REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRAL_UNIQUE THEN
2765  MATCH_MP_TAC HAS_INTEGRAL_SUM THEN ASM_SIMP_TAC std_ss [INTEGRABLE_INTEGRAL]
2766QED
2767
2768Theorem INTEGRABLE_SUM:
2769   !f:'a->real->real s t.
2770        FINITE t /\
2771        (!a. a IN t ==> (f a) integrable_on s)
2772        ==>  (\x. sum t (\a. f a x)) integrable_on s
2773Proof
2774  REWRITE_TAC[integrable_on] THEN METIS_TAC[HAS_INTEGRAL_SUM]
2775QED
2776
2777Theorem HAS_INTEGRAL_EQ:
2778   !f:real->real g k s.
2779        (!x. x IN s ==> (f(x) = g(x))) /\
2780        (f has_integral k) s
2781        ==> (g has_integral k) s
2782Proof
2783  REPEAT GEN_TAC THEN ONCE_REWRITE_TAC[GSYM REAL_SUB_0] THEN
2784  ONCE_REWRITE_TAC [METIS [] ``(!x:real. x IN s ==> (f x - g x = 0:real)) =
2785                       (!x:real. x IN s ==> ((\x. f x - g x) x = 0:real))``] THEN
2786  DISCH_THEN(CONJUNCTS_THEN2 (MP_TAC o MATCH_MP HAS_INTEGRAL_IS_0) MP_TAC) THEN
2787  REWRITE_TAC[AND_IMP_INTRO] THEN DISCH_THEN(MP_TAC o MATCH_MP HAS_INTEGRAL_SUB) THEN
2788  SIMP_TAC std_ss [REAL_ARITH ``x - (x - y:real) = y``, ETA_AX, REAL_SUB_RZERO]
2789QED
2790
2791Theorem INTEGRABLE_EQ:
2792   !f:real->real g s.
2793        (!x. x IN s ==> (f(x) = g(x))) /\
2794        f integrable_on s
2795        ==> g integrable_on s
2796Proof
2797  REWRITE_TAC[integrable_on] THEN METIS_TAC[HAS_INTEGRAL_EQ]
2798QED
2799
2800Theorem INTEGRABLE_EQ_EQ:
2801   !f:real->real g s.
2802        (!x. x IN s ==> (f(x) = g(x))) ==>
2803        (f integrable_on s <=> g integrable_on s)
2804Proof
2805  METIS_TAC[INTEGRABLE_EQ]
2806QED
2807
2808Theorem HAS_INTEGRAL_EQ_EQ:
2809   !f:real->real g k s.
2810        (!x. x IN s ==> (f(x) = g(x)))
2811        ==> ((f has_integral k) s <=> (g has_integral k) s)
2812Proof
2813  METIS_TAC[HAS_INTEGRAL_EQ]
2814QED
2815
2816Theorem HAS_INTEGRAL_NULL:
2817   !f:real->real a b.
2818    (content(interval[a,b]) = &0) ==> (f has_integral 0) (interval[a,b])
2819Proof
2820  REPEAT STRIP_TAC THEN REWRITE_TAC[has_integral] THEN
2821  X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
2822  EXISTS_TAC ``\x:real. ball(x,&1)`` THEN REWRITE_TAC[GAUGE_TRIVIAL] THEN
2823  REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_SUB_RZERO] THEN
2824  MATCH_MP_TAC(REAL_ARITH ``(x = &0) /\ &0 < e ==> x < e:real``) THEN
2825  ASM_REWRITE_TAC[ABS_ZERO] THEN METIS_TAC[SUM_CONTENT_NULL]
2826QED
2827
2828Theorem HAS_INTEGRAL_NULL_EQ:
2829   !f a b i. (content(interval[a,b]) = &0)
2830             ==> ((f has_integral i) (interval[a,b]) <=> (i = 0))
2831Proof
2832  METIS_TAC[INTEGRAL_UNIQUE, HAS_INTEGRAL_NULL]
2833QED
2834
2835Theorem INTEGRAL_NULL:
2836   !f a b. (content(interval[a,b]) = &0)
2837           ==> (integral(interval[a,b]) f = 0)
2838Proof
2839  REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRAL_UNIQUE THEN
2840  METIS_TAC[HAS_INTEGRAL_NULL]
2841QED
2842
2843Theorem INTEGRABLE_ON_NULL:
2844   !f a b. (content(interval[a,b]) = &0)
2845           ==> f integrable_on interval[a,b]
2846Proof
2847  REWRITE_TAC[integrable_on] THEN METIS_TAC[HAS_INTEGRAL_NULL]
2848QED
2849
2850Theorem HAS_INTEGRAL_EMPTY:
2851   !f. (f has_integral 0) {}
2852Proof
2853  METIS_TAC[HAS_INTEGRAL_NULL, CONTENT_EMPTY, EMPTY_AS_INTERVAL]
2854QED
2855
2856Theorem HAS_INTEGRAL_EMPTY_EQ:
2857   !f i. (f has_integral i) {} <=> (i = 0)
2858Proof
2859  MESON_TAC[HAS_INTEGRAL_UNIQUE, HAS_INTEGRAL_EMPTY]
2860QED
2861
2862Theorem INTEGRABLE_ON_EMPTY:
2863   !f. f integrable_on {}
2864Proof
2865  REWRITE_TAC[integrable_on] THEN MESON_TAC[HAS_INTEGRAL_EMPTY]
2866QED
2867
2868Theorem INTEGRAL_EMPTY:
2869   !f. integral {} f = 0
2870Proof
2871  MESON_TAC[EMPTY_AS_INTERVAL, INTEGRAL_UNIQUE, HAS_INTEGRAL_EMPTY]
2872QED
2873
2874Theorem HAS_INTEGRAL_REFL:
2875   !f a. (f has_integral 0) (interval[a,a])
2876Proof
2877  REPEAT GEN_TAC THEN MATCH_MP_TAC HAS_INTEGRAL_NULL THEN
2878  SIMP_TAC std_ss [INTERVAL_SING, INTERIOR_CLOSED_INTERVAL, CONTENT_EQ_0_INTERIOR]
2879QED
2880
2881Theorem INTEGRABLE_ON_REFL:
2882   !f a. f integrable_on interval[a,a]
2883Proof
2884  REWRITE_TAC[integrable_on] THEN MESON_TAC[HAS_INTEGRAL_REFL]
2885QED
2886
2887Theorem INTEGRAL_REFL:
2888   !f a. integral (interval[a,a]) f = 0
2889Proof
2890  MESON_TAC[INTEGRAL_UNIQUE, HAS_INTEGRAL_REFL]
2891QED
2892
2893(* ------------------------------------------------------------------------- *)
2894(* Cauchy-type criterion for integrability.                                  *)
2895(* ------------------------------------------------------------------------- *)
2896
2897Theorem INTEGRABLE_CAUCHY:
2898   !f:real->real a b.
2899    f integrable_on interval[a,b] <=>
2900   !e. &0 < e ==> ?d. gauge d /\
2901   !p1 p2. p1 tagged_division_of interval[a,b] /\ d FINE p1 /\
2902       p2 tagged_division_of interval[a,b] /\ d FINE p2
2903       ==> abs (sum p1 (\(x,k). content k * f x) -
2904           sum p2 (\(x,k). content k * f x)) < e
2905Proof
2906  REPEAT GEN_TAC THEN REWRITE_TAC[integrable_on, has_integral] THEN
2907  EQ_TAC THEN DISCH_TAC THENL
2908  [X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
2909   FIRST_X_ASSUM(X_CHOOSE_THEN ``y:real`` (MP_TAC o SPEC ``e / &2:real``)) THEN
2910   ASM_REWRITE_TAC[REAL_HALF] THEN
2911   DISCH_THEN (X_CHOOSE_TAC ``d:real->real->bool``) THEN
2912   EXISTS_TAC ``d:real->real->bool`` THEN POP_ASSUM MP_TAC THEN
2913   REWRITE_TAC[GSYM dist] THEN MESON_TAC[DIST_TRIANGLE_HALF_L],
2914   ALL_TAC] THEN
2915  FIRST_X_ASSUM(MP_TAC o GEN ``n:num`` o SPEC ``inv(&n + &1:real)``) THEN
2916  SIMP_TAC std_ss [REAL_LT_INV_EQ, METIS [REAL_LT, REAL_OF_NUM_ADD, GSYM ADD1, LESS_0]
2917    ``&0 < &n + &1:real``, SKOLEM_THM] THEN
2918  DISCH_THEN(X_CHOOSE_THEN ``d:num->real->real->bool`` MP_TAC) THEN
2919  SIMP_TAC std_ss [FORALL_AND_THM] THEN STRIP_TAC THEN
2920  MP_TAC(GEN ``n:num``
2921   (ISPECL [``\x. BIGINTER {(d:num->real->real->bool) i x | i IN {0..n}}``,
2922    ``a:real``, ``b:real``] FINE_DIVISION_EXISTS)) THEN
2923  ASM_SIMP_TAC std_ss [GAUGE_BIGINTER, FINE_BIGINTER, FINITE_NUMSEG, SKOLEM_THM] THEN
2924  SIMP_TAC std_ss [IN_NUMSEG, LE_0, FORALL_AND_THM] THEN
2925  DISCH_THEN(X_CHOOSE_THEN ``p:num->(real#(real->bool))->bool``
2926   STRIP_ASSUME_TAC) THEN
2927  SUBGOAL_THEN
2928  ``cauchy (\n. sum (p n)
2929    (\(x,k:real->bool). content k * (f:real->real) x))``
2930    MP_TAC THENL
2931  [REWRITE_TAC[cauchy] THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
2932   POP_ASSUM MP_TAC THEN GEN_REWR_TAC LAND_CONV [REAL_ARCH_INV] THEN
2933   DISCH_THEN (X_CHOOSE_TAC ``N:num``) THEN EXISTS_TAC ``N:num`` THEN
2934   POP_ASSUM MP_TAC THEN STRIP_TAC THEN
2935   KNOW_TAC ``!m n. (\m n.
2936   m >= (N :num) /\ n >= N ==>
2937   (dist
2938     ((\(n :num).
2939         sum ((p :num -> real # (real -> bool) -> bool) n)
2940           (\((x :real),(k :real -> bool)).
2941              content k * (f :real -> real) x)) m,
2942      (\(n :num).
2943         sum (p n) (\((x :real),(k :real -> bool)). content k * f x))
2944        n) :real) < (e :real)) m n`` THENL
2945   [ALL_TAC, SIMP_TAC std_ss []] THEN MATCH_MP_TAC WLOG_LE THEN CONJ_TAC THENL
2946   [MESON_TAC[DIST_SYM], ALL_TAC] THEN
2947   MAP_EVERY X_GEN_TAC [``m:num``, ``n:num``] THEN REWRITE_TAC[GE] THEN
2948   SIMP_TAC std_ss [] THEN REPEAT STRIP_TAC THEN
2949   MATCH_MP_TAC REAL_LTE_TRANS THEN EXISTS_TAC ``inv(&m + &1:real)`` THEN
2950   CONJ_TAC THENL
2951   [REWRITE_TAC[dist] THEN ASM_MESON_TAC[LESS_EQ_REFL], ALL_TAC] THEN
2952   MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC ``inv(&N:real)`` THEN
2953   ASM_SIMP_TAC std_ss [REAL_LT_IMP_LE] THEN MATCH_MP_TAC REAL_LE_INV2 THEN
2954   ASM_SIMP_TAC arith_ss [REAL_OF_NUM_ADD, REAL_OF_NUM_LE, REAL_LT],
2955   ALL_TAC] THEN
2956  REWRITE_TAC[GSYM CONVERGENT_EQ_CAUCHY, LIM_SEQUENTIALLY] THEN
2957  DISCH_THEN (X_CHOOSE_TAC ``y:real``) THEN EXISTS_TAC ``y:real`` THEN
2958  POP_ASSUM MP_TAC THEN REWRITE_TAC[dist] THEN STRIP_TAC THEN
2959  X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
2960  MP_TAC(SPEC ``e / &2:real`` REAL_ARCH_INV) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
2961  DISCH_THEN(X_CHOOSE_THEN ``N1:num`` STRIP_ASSUME_TAC) THEN
2962  FIRST_X_ASSUM(MP_TAC o SPEC ``e / &2:real``) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
2963  DISCH_THEN(X_CHOOSE_TAC ``N2:num``) THEN EXISTS_TAC
2964   ``(d:num->real->real->bool) (N1 + N2)`` THEN
2965  ASM_REWRITE_TAC[] THEN
2966  X_GEN_TAC ``q:(real#(real->bool))->bool`` THEN STRIP_TAC THEN
2967  REWRITE_TAC[GSYM dist] THEN MATCH_MP_TAC DIST_TRIANGLE_HALF_L THEN
2968  EXISTS_TAC ``sum (p(N1+N2:num))
2969   (\(x,k:real->bool). content k * (f:real->real) x)`` THEN
2970  CONJ_TAC THENL
2971  [REWRITE_TAC[dist] THEN MATCH_MP_TAC REAL_LTE_TRANS THEN
2972  EXISTS_TAC ``inv(&(N1 + N2) + &1:real)`` THEN CONJ_TAC THENL
2973  [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_MESON_TAC[LESS_EQ_REFL], ALL_TAC] THEN
2974  MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC ``inv(&N1:real)`` THEN
2975  ASM_SIMP_TAC std_ss [REAL_LT_IMP_LE] THEN MATCH_MP_TAC REAL_LE_INV2 THEN
2976  ASM_SIMP_TAC arith_ss [REAL_OF_NUM_ADD, REAL_OF_NUM_LE, REAL_LT],
2977  ONCE_REWRITE_TAC[DIST_SYM] THEN REWRITE_TAC[dist] THEN
2978  FULL_SIMP_TAC std_ss []]
2979QED
2980
2981(* ------------------------------------------------------------------------- *)
2982(* Additivity of integral on abutting intervals.                             *)
2983(* ------------------------------------------------------------------------- *)
2984
2985Theorem INTERVAL_SPLIT:
2986   !a b:real c. (interval[a,b] INTER {x | x <= c} = interval[a,min b c]) /\
2987                (interval[a,b] INTER {x | x >= c} = interval[max a c,b])
2988Proof
2989  REPEAT STRIP_TAC THEN
2990  SIMP_TAC std_ss [EXTENSION, IN_INTERVAL, IN_INTER, GSPECIFICATION] THEN
2991  X_GEN_TAC ``y:real`` THEN
2992  MATCH_MP_TAC(TAUT `(c ==> b) /\ (c ==> a) /\ (a /\ b ==> c)
2993                      ==> (a /\ b <=> c)`) THEN
2994  (CONJ_TAC THENL
2995  [ASM_MESON_TAC[REAL_MAX_LE, REAL_LE_MIN, real_ge], ALL_TAC]) THEN
2996  SIMP_TAC std_ss [LEFT_AND_FORALL_THM, real_ge] THEN CONJ_TAC THEN
2997  ASM_MESON_TAC[REAL_MAX_LE, REAL_LE_MIN]
2998QED
2999
3000Theorem CONTENT_SPLIT :
3001    !a b:real k. content(interval[a,b]) =
3002                 content(interval[a,b] INTER {x | x <= c}) +
3003                 content(interval[a,b] INTER {x | x >= c})
3004Proof
3005    rpt GEN_TAC
3006 >> SIMP_TAC std_ss [INTERVAL_SPLIT, CONTENT_CLOSED_INTERVAL_CASES,
3007                     min_def, max_def]
3008 >> rpt COND_CASES_TAC
3009 >> TRY (fs [] >> rfs [] >> rpt (POP_ASSUM MP_TAC) >> REAL_ARITH_TAC)
3010 >> (Cases_on `b <= c` >> fs [] >> rfs [])
3011QED
3012
3013Theorem lemma[local]:
3014    !a b:real c.
3015      ((content(interval[a,b] INTER {x | x <= c}) = &0) <=>
3016       (interior(interval[a,b] INTER {x | x <= c}) = {})) /\
3017      ((content(interval[a,b] INTER {x | x >= c}) = &0) <=>
3018       (interior(interval[a,b] INTER {x | x >= c}) = {}))
3019Proof
3020    SIMP_TAC std_ss [INTERVAL_SPLIT, CONTENT_EQ_0_INTERIOR]
3021QED
3022
3023Theorem DIVISION_SPLIT_LEFT_RIGHT_INJ:
3024   (!d i k1 k2 k c.
3025     d division_of i /\
3026     k1 IN d /\ k2 IN d /\ ~(k1 = k2) /\
3027     (k1 INTER {x | x <= c} = k2 INTER {x | x <= c})
3028     ==> (content(k1 INTER {x:real | x <= c}) = &0)) /\
3029   (!d i k1 k2 k c.
3030     d division_of i /\
3031     k1 IN d /\ k2 IN d /\ ~(k1 = k2) /\
3032     (k1 INTER {x | x >= c} = k2 INTER {x | x >= c})
3033     ==> (content(k1 INTER {x:real | x >= c}) = &0))
3034Proof
3035  REPEAT STRIP_TAC THEN
3036  REWRITE_TAC[CONTENT_EQ_0_INTERIOR] THEN
3037  UNDISCH_TAC ``d division_of i`` THEN GEN_REWR_TAC LAND_CONV [division_of] THEN
3038  DISCH_THEN(CONJUNCTS_THEN2 MP_TAC (MP_TAC o CONJUNCT1) o CONJUNCT2) THEN
3039  DISCH_THEN(MP_TAC o SPECL
3040  [``k1:real->bool``, ``k2:real->bool``]) THEN
3041  ASM_REWRITE_TAC[PAIR_EQ] THEN DISCH_TAC THEN
3042  DISCH_THEN(MP_TAC o SPEC ``k2:real->bool``) THEN
3043  ASM_REWRITE_TAC[] THEN
3044  REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
3045  DISCH_THEN(X_CHOOSE_THEN ``u:real`` (X_CHOOSE_THEN ``v:real``
3046   SUBST_ALL_TAC)) THEN
3047  ASM_SIMP_TAC std_ss [lemma] THEN
3048  FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
3049   ``(s INTER t = {})
3050     ==> u SUBSET s /\ u SUBSET t ==> (u = {})``)) THEN
3051  CONJ_TAC THEN MATCH_MP_TAC SUBSET_INTERIOR THEN ASM_SET_TAC[]
3052QED
3053
3054Theorem DIVISION_SPLIT_LEFT_INJ:
3055    (!d i k1 k2 k c.
3056     d division_of i /\
3057     k1 IN d /\ k2 IN d /\ ~(k1 = k2) /\
3058     (k1 INTER {x | x <= c} = k2 INTER {x | x <= c})
3059     ==> (content(k1 INTER {x:real | x <= c}) = &0))
3060Proof
3061  REWRITE_TAC [DIVISION_SPLIT_LEFT_RIGHT_INJ]
3062QED
3063
3064Theorem DIVISION_SPLIT_RIGHT_INJ:
3065   (!d i k1 k2 k c.
3066     d division_of i /\
3067     k1 IN d /\ k2 IN d /\ ~(k1 = k2) /\
3068     (k1 INTER {x | x >= c} = k2 INTER {x | x >= c})
3069     ==> (content(k1 INTER {x:real | x >= c}) = &0))
3070Proof
3071  REWRITE_TAC [DIVISION_SPLIT_LEFT_RIGHT_INJ]
3072QED
3073
3074Theorem TAGGED_DIVISION_SPLIT_LEFT_INJ:
3075   !d i x1 k1 x2 k2 c.
3076  d tagged_division_of i /\
3077  (x1,k1) IN d /\ (x2,k2) IN d /\ ~(k1 = k2) /\
3078  (k1 INTER {x | x <= c} = k2 INTER {x | x <= c})
3079  ==> (content(k1 INTER {x:real | x <= c}) = &0)
3080Proof
3081  REPEAT STRIP_TAC THEN
3082  FIRST_X_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_TAGGED_DIVISION) THEN
3083  MATCH_MP_TAC DIVISION_SPLIT_LEFT_INJ THEN
3084  EXISTS_TAC ``IMAGE SND (d:(real#(real->bool))->bool)`` THEN
3085  ASM_REWRITE_TAC[IN_IMAGE] THEN ASM_MESON_TAC[SND]
3086QED
3087
3088Theorem TAGGED_DIVISION_SPLIT_RIGHT_INJ:
3089   !d i x1 k1 x2 k2 c.
3090  d tagged_division_of i /\
3091  (x1,k1) IN d /\ (x2,k2) IN d /\ ~(k1 = k2) /\
3092  (k1 INTER {x | x >= c} = k2 INTER {x | x >= c})
3093   ==> (content(k1 INTER {x:real | x >= c}) = &0)
3094Proof
3095  REPEAT STRIP_TAC THEN
3096  FIRST_X_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_TAGGED_DIVISION) THEN
3097  MATCH_MP_TAC DIVISION_SPLIT_RIGHT_INJ THEN
3098  EXISTS_TAC ``IMAGE SND (d:(real#(real->bool))->bool)`` THEN
3099  ASM_REWRITE_TAC[IN_IMAGE] THEN ASM_MESON_TAC[SND]
3100QED
3101
3102Theorem DIVISION_SPLIT:
3103   !p a b:real c.
3104    p division_of interval[a,b]
3105    ==> {l INTER {x | x <= c} |l| l IN p /\ ~(l INTER {x | x <= c} = {})}
3106   division_of (interval[a,b] INTER {x | x <= c}) /\
3107   {l INTER {x | x >= c} |l| l IN p /\ ~(l INTER {x | x >= c} = {})}
3108   division_of (interval[a,b] INTER {x | x >= c})
3109Proof
3110  REPEAT GEN_TAC THEN
3111  SIMP_TAC std_ss [division_of, IMAGE_FINITE] THEN
3112  SIMP_TAC std_ss [SET_RULE ``(!x. x IN {f x | P x} ==> Q x) <=> (!x. P x ==> Q (f x))``,
3113   MESON[] ``(!x y. x IN s /\ y IN t /\ Q x y ==> P x y) <=>
3114               (!x. x IN s ==> !y. y IN t ==> Q x y ==> P x y)``,
3115   RIGHT_FORALL_IMP_THM] THEN
3116  REPEAT(MATCH_MP_TAC(TAUT
3117   `(a ==> a' /\ a'') /\ (b ==> b' /\ b'')
3118    ==> a /\ b ==> (a' /\ b') /\ (a'' /\ b'')`) THEN CONJ_TAC) THENL
3119  [KNOW_TAC ``FINITE p
3120 ==> FINITE {y | y IN IMAGE (\l. l INTER {x | x <= c:real}) p /\ ~(y = {})} /\
3121     FINITE {y | y IN IMAGE (\l. l INTER {x | x >= c:real}) p /\ ~(y = {})}`` THENL
3122   [ALL_TAC, METIS_TAC [SET_RULE
3123   ``{f x |x| x IN s /\ ~(f x = {})} = {y | y IN IMAGE f s /\ ~(y = {})}``]] THEN
3124   SIMP_TAC std_ss [FINITE_RESTRICT, IMAGE_FINITE],
3125   SIMP_TAC std_ss [GSYM FORALL_AND_THM] THEN
3126   DISCH_TAC THEN STRIP_TAC THEN POP_ASSUM (MP_TAC o Q.SPEC `l:real->bool`) THEN
3127   DISCH_THEN(fn th => CONJ_TAC THEN STRIP_TAC THEN MP_TAC th) THEN
3128  (ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MONO_AND THEN
3129   CONJ_TAC THENL [SET_TAC[], ALL_TAC] THEN
3130   STRIP_TAC THEN METIS_TAC[INTERVAL_SPLIT]),
3131   DISCH_THEN(fn th => CONJ_TAC THEN MP_TAC th) THEN
3132  (DISCH_TAC THEN X_GEN_TAC ``K1:real->bool`` THEN
3133   POP_ASSUM (MP_TAC o Q.SPEC `K1:real->bool`) THEN
3134   DISCH_THEN(fn th => STRIP_TAC THEN MP_TAC th) THEN ASM_SIMP_TAC std_ss [] THEN
3135   DISCH_TAC THEN X_GEN_TAC ``K2:real->bool`` THEN
3136   POP_ASSUM (MP_TAC o Q.SPEC `K2:real->bool`) THEN
3137   DISCH_THEN(fn th => STRIP_TAC THEN MP_TAC th) THEN ASM_SIMP_TAC std_ss [] THEN
3138   DISCH_THEN(fn th => STRIP_TAC THEN MP_TAC th) THEN ASM_SIMP_TAC std_ss [] THEN
3139   KNOW_TAC ``(K1 <> K2:real->bool)`` THENL [ASM_MESON_TAC[PAIR_EQ],
3140    DISCH_TAC THEN ASM_REWRITE_TAC []] THEN
3141   MATCH_MP_TAC(SET_RULE
3142   ``s SUBSET s' /\ t SUBSET t'
3143     ==> (s' INTER t' = {}) ==> (s INTER t = {})``) THEN
3144   CONJ_TAC THEN MATCH_MP_TAC SUBSET_INTERIOR THEN SET_TAC[]),
3145  DISCH_THEN(SUBST1_TAC o SYM) THEN REWRITE_TAC[INTER_BIGUNION] THEN
3146  ONCE_REWRITE_TAC[EXTENSION] THEN REWRITE_TAC[IN_BIGUNION] THEN
3147  CONJ_TAC THEN GEN_TAC THEN AP_TERM_TAC THEN
3148  GEN_REWR_TAC I [FUN_EQ_THM] THEN GEN_TAC THEN
3149  SIMP_TAC std_ss [GSPECIFICATION, PAIR_EQ] THEN MESON_TAC[NOT_IN_EMPTY]]
3150QED
3151
3152Theorem lemma1[local]:
3153   (!x k. (x,k) IN {x,f k | P x k} ==> Q x k) <=>
3154   (!x k. P x k ==> Q x (f k))
3155Proof
3156  SIMP_TAC std_ss [GSPECIFICATION, PAIR_EQ, EXISTS_PROD] THEN SET_TAC[]
3157QED
3158
3159Theorem lemma2[local]:
3160    !f:'b->'b s:('a#'b)->bool.
3161    FINITE s ==> FINITE {x,f k | (x,k) IN s /\ P x k}
3162Proof
3163  REPEAT STRIP_TAC THEN MATCH_MP_TAC FINITE_SUBSET THEN
3164  EXISTS_TAC ``IMAGE (\(x:'a,k:'b). x,(f k:'b)) s`` THEN
3165  ASM_SIMP_TAC std_ss [IMAGE_FINITE] THEN
3166  SIMP_TAC std_ss [SUBSET_DEF, FORALL_PROD, lemma1, IN_IMAGE] THEN
3167  SIMP_TAC std_ss [EXISTS_PROD, PAIR_EQ] THEN MESON_TAC[]
3168QED
3169
3170Theorem lemma3[local]:
3171    !f:real->real g:(real->bool)->(real->bool) p.
3172  FINITE p
3173  ==> (sum {x,g k |x,k| (x,k) IN p /\ ~(g k = {})} (\(x,k). content k * f x) =
3174       sum (IMAGE (\(x,k). x,g k) p) (\(x,k). content k * f x))
3175Proof
3176  REPEAT STRIP_TAC THEN CONV_TAC SYM_CONV THEN MATCH_MP_TAC SUM_SUPERSET THEN
3177  ASM_SIMP_TAC std_ss [IMAGE_FINITE, lemma2] THEN
3178  SIMP_TAC std_ss [IMP_CONJ, FORALL_IN_IMAGE] THEN
3179  SIMP_TAC std_ss [FORALL_PROD, SUBSET_DEF, IN_IMAGE, EXISTS_PROD] THEN
3180  SIMP_TAC std_ss [GSPECIFICATION, PAIR_EQ, REAL_ENTIRE, EXISTS_PROD] THEN
3181  METIS_TAC[CONTENT_EMPTY]
3182QED
3183
3184Theorem lemma4[local]:
3185   (\(x,l). content (g l) * f x) =
3186   (\(x,l). content l * f x) o (\(x,l). x,g l)
3187Proof
3188  SIMP_TAC std_ss [FUN_EQ_THM, o_THM, FORALL_PROD]
3189QED
3190
3191Theorem HAS_INTEGRAL_SPLIT:
3192   !f:real->real a b c.
3193   (f has_integral i) (interval[a,b] INTER {x | x <= c}) /\
3194   (f has_integral j) (interval[a,b] INTER {x | x >= c})
3195   ==> (f has_integral (i + j)) (interval[a,b])
3196Proof
3197  REPEAT GEN_TAC THEN
3198  ASM_SIMP_TAC std_ss [INTERVAL_SPLIT] THEN REWRITE_TAC[has_integral] THEN
3199  ASM_SIMP_TAC std_ss [GSYM INTERVAL_SPLIT] THEN
3200  DISCH_TAC THEN X_GEN_TAC ``e:real`` THEN STRIP_TAC THEN
3201  FIRST_X_ASSUM(CONJUNCTS_THEN2 (MP_TAC o SPEC ``e / &2:real``) STRIP_ASSUME_TAC) THEN
3202  FIRST_X_ASSUM(MP_TAC o SPEC ``e / &2:real``) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
3203  DISCH_THEN(X_CHOOSE_THEN ``d2:real->real->bool``
3204   (CONJUNCTS_THEN2 ASSUME_TAC ASSUME_TAC)) THEN
3205  DISCH_THEN(X_CHOOSE_THEN ``d1:real->real->bool``
3206   (CONJUNCTS_THEN2 ASSUME_TAC ASSUME_TAC)) THEN
3207  EXISTS_TAC ``\x. if x = c then (d1(x:real) INTER d2(x)):real->bool
3208                 else ball(x,abs(x - c)) INTER d1(x) INTER d2(x)`` THEN
3209  CONJ_TAC THENL
3210  [REWRITE_TAC[gauge_def] THEN GEN_TAC THEN
3211   RULE_ASSUM_TAC(REWRITE_RULE[gauge_def]) THEN BETA_TAC THEN COND_CASES_TAC THEN
3212   ASM_SIMP_TAC std_ss [OPEN_INTER, IN_INTER, OPEN_BALL, IN_BALL] THEN
3213   ASM_REWRITE_TAC[DIST_REFL, GSYM ABS_NZ, REAL_SUB_0], ALL_TAC] THEN
3214  X_GEN_TAC ``p:(real#(real->bool))->bool`` THEN STRIP_TAC THEN
3215  SUBGOAL_THEN
3216   ``(!x:real kk. (x,kk) IN p /\ ~(kk INTER {x:real | x <= c} = {})
3217      ==> x <= c) /\
3218     (!x:real kk. (x,kk) IN p /\ ~(kk INTER {x:real | x >= c} = {})
3219      ==> x >= c)``
3220  STRIP_ASSUME_TAC THENL
3221  [CONJ_TAC THEN FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [FINE]) THEN
3222   DISCH_TAC THEN GEN_TAC THEN GEN_TAC THEN
3223   POP_ASSUM (MP_TAC o Q.SPECL [`x:real`, `kk:real->bool`]) THEN
3224   DISCH_THEN(fn th => STRIP_TAC THEN MP_TAC th) THEN ASM_SIMP_TAC std_ss [] THEN
3225   COND_CASES_TAC THEN ASM_REWRITE_TAC[REAL_LE_REFL, real_ge] THEN DISCH_THEN
3226    (MP_TAC o MATCH_MP (SET_RULE ``k SUBSET (a INTER b) ==> k SUBSET a``)) THEN
3227   DISCH_THEN
3228    (MP_TAC o MATCH_MP (SET_RULE ``k SUBSET (a INTER b) ==> k SUBSET a``)) THEN
3229   SIMP_TAC std_ss [SUBSET_DEF, IN_BALL, dist] THEN DISCH_TAC THENL
3230   [UNDISCH_TAC ``kk INTER {x:real | x <= c} <> {}``,
3231    UNDISCH_TAC ``kk INTER {x:real | x >= c} <> {}``] THEN DISCH_TAC THEN
3232   FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [GSYM MEMBER_NOT_EMPTY]) THEN
3233   DISCH_THEN(X_CHOOSE_THEN ``u:real`` MP_TAC) THEN
3234   SIMP_TAC std_ss [IN_INTER, GSPECIFICATION] THEN REPEAT STRIP_TAC THEN
3235   FIRST_X_ASSUM(MP_TAC o SPEC ``u:real``) THEN ASM_REWRITE_TAC[] THEN
3236   ONCE_REWRITE_TAC[MONO_NOT_EQ] THEN
3237   REWRITE_TAC[REAL_NOT_LE, REAL_NOT_LT] THEN STRIP_TAC THEN
3238   MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC ``abs(x - u:real)`` THEN
3239   ASM_SIMP_TAC std_ss [REAL_LE_REFL] THEN REWRITE_TAC [abs] THEN
3240   REPEAT COND_CASES_TAC THENL
3241   [ASM_REWRITE_TAC [real_sub, REAL_LE_LADD, REAL_LE_NEG],
3242    FULL_SIMP_TAC std_ss [REAL_SUB_LE] THEN
3243    FULL_SIMP_TAC std_ss [REAL_NOT_LE] THEN CCONTR_TAC THEN
3244    UNDISCH_TAC ``x < u:real`` THEN REWRITE_TAC [REAL_NOT_LT] THEN
3245    MATCH_MP_TAC REAL_LE_TRANS THEN
3246    EXISTS_TAC ``c:real`` THEN ASM_REWRITE_TAC [REAL_LE_LT],
3247    FULL_SIMP_TAC std_ss [REAL_SUB_LE] THEN
3248    FULL_SIMP_TAC std_ss [REAL_NOT_LE] THEN METIS_TAC [REAL_LT_ANTISYM],
3249    FULL_SIMP_TAC std_ss [REAL_SUB_LE] THEN
3250    FULL_SIMP_TAC std_ss [REAL_NOT_LE] THEN METIS_TAC [REAL_LT_ANTISYM],
3251    FULL_SIMP_TAC std_ss [REAL_SUB_LE] THEN
3252    FULL_SIMP_TAC std_ss [REAL_NOT_LE] THEN METIS_TAC [REAL_LET_ANTISYM],
3253    FULL_SIMP_TAC std_ss [REAL_SUB_LE] THEN
3254    FULL_SIMP_TAC std_ss [REAL_NOT_LE] THEN METIS_TAC [REAL_LET_ANTISYM],
3255    FULL_SIMP_TAC std_ss [REAL_SUB_LE, real_ge] THEN CCONTR_TAC THEN
3256    UNDISCH_TAC ``x < c:real`` THEN REWRITE_TAC [REAL_NOT_LT] THEN
3257    MATCH_MP_TAC REAL_LE_TRANS THEN
3258    EXISTS_TAC ``u:real`` THEN ASM_REWRITE_TAC [REAL_LE_LT],
3259    ASM_REWRITE_TAC [REAL_LE_NEG, real_sub, REAL_LE_LADD] THEN
3260    ASM_REWRITE_TAC [GSYM real_ge]], ALL_TAC] THEN
3261   UNDISCH_TAC ``!p.
3262       p tagged_division_of interval [(a,b)] INTER {x | x >= c} /\
3263       d2 FINE p ==>
3264       abs (sum p (\(x,k). content k * f x) - j) < e / 2:real`` THEN
3265   DISCH_TAC THEN POP_ASSUM (MP_TAC o SPEC
3266   ``{(x:real,kk INTER {x:real | x >= c}) |(x,kk)|
3267     (x,kk) IN p /\ ~(kk INTER {x:real | x >= c} = {})}``) THEN
3268   UNDISCH_TAC ``!p.
3269       p tagged_division_of interval [(a,b)] INTER {x | x <= c} /\
3270       d1 FINE p ==>
3271       abs (sum p (\(x,k). content k * f x) - i) < e / 2:real`` THEN
3272   DISCH_TAC THEN POP_ASSUM (MP_TAC o SPEC
3273   ``{(x:real,kk INTER {x:real | x <= c}) |(x,kk)|
3274     (x,kk) IN p /\ ~(kk INTER {x:real | x <= c} = {})}``) THEN
3275   MATCH_MP_TAC(TAUT
3276   `(a /\ b) /\ (a' /\ b' ==> c) ==> (a ==> a') ==> (b ==> b') ==> c`) THEN
3277   CONJ_TAC THENL
3278   [UNDISCH_TAC ``p tagged_division_of interval [(a,b)]`` THEN DISCH_TAC THEN
3279    FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [TAGGED_DIVISION_OF]) THEN
3280    REWRITE_TAC[TAGGED_DIVISION_OF] THEN
3281    REPEAT(MATCH_MP_TAC(TAUT
3282    `(a ==> (a' /\ a'')) /\ (b ==> (b' /\ d) /\ (b'' /\ e))
3283        ==> a /\ b ==> ((a' /\ b') /\ d) /\ ((a'' /\ b'') /\ e)`) THEN
3284    CONJ_TAC) THEN
3285    SIMP_TAC std_ss [IMP_CONJ, RIGHT_FORALL_IMP_THM] THEN
3286    SIMP_TAC std_ss [lemma1] THEN REWRITE_TAC[AND_IMP_INTRO] THENL
3287   [SIMP_TAC std_ss [lemma2],
3288    SIMP_TAC std_ss [GSYM FORALL_AND_THM] THEN
3289    DISCH_TAC THEN GEN_TAC THEN GEN_TAC THEN
3290    POP_ASSUM (MP_TAC o Q.SPECL [`x:real`, `kk:real->bool`]) THEN
3291    DISCH_THEN(fn th => CONJ_TAC THEN STRIP_TAC THEN MP_TAC th) THEN
3292    (ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MONO_AND THEN CONJ_TAC THENL
3293     [SIMP_TAC std_ss [IN_INTER, GSPECIFICATION] THEN METIS_TAC[], ALL_TAC]) THEN
3294    (MATCH_MP_TAC MONO_AND THEN CONJ_TAC THENL [SET_TAC[], ALL_TAC]) THEN
3295    METIS_TAC[INTERVAL_SPLIT],
3296   DISCH_THEN(fn th => CONJ_TAC THEN MP_TAC th) THEN
3297   (REPEAT (DISCH_TAC THEN GEN_TAC THEN GEN_TAC THEN
3298    POP_ASSUM (MP_TAC o Q.SPECL [`x1:real`, `kk:real->bool`])) THEN
3299    DISCH_THEN(fn th => STRIP_TAC THEN MP_TAC th) THEN ASM_SIMP_TAC std_ss [] THEN
3300    REPEAT (DISCH_TAC THEN GEN_TAC THEN GEN_TAC THEN
3301    POP_ASSUM (MP_TAC o Q.SPECL [`x2:real`, `kk':real->bool`])) THEN
3302    DISCH_THEN(fn th => STRIP_TAC THEN MP_TAC th) THEN ASM_SIMP_TAC std_ss []) THENL
3303    [ALL_TAC, KNOW_TAC ``kk <> kk':real->bool`` THENL
3304     [CCONTR_TAC THEN UNDISCH_TAC ``kk:real->bool INTER {x | x <= c} <> kk' INTER {x | x <= c}`` THEN
3305      REWRITE_TAC [] THEN AP_THM_TAC THEN AP_TERM_TAC THEN FULL_SIMP_TAC std_ss [],
3306      DISCH_TAC THEN ASM_REWRITE_TAC []],
3307     ALL_TAC, KNOW_TAC ``kk <> kk':real->bool`` THENL
3308     [CCONTR_TAC THEN UNDISCH_TAC ``kk:real->bool INTER {x | x >= c} <> kk' INTER {x | x >= c}`` THEN
3309      REWRITE_TAC [] THEN AP_THM_TAC THEN AP_TERM_TAC THEN FULL_SIMP_TAC std_ss [],
3310      DISCH_TAC THEN ASM_REWRITE_TAC []]] THEN
3311    MATCH_MP_TAC(SET_RULE
3312    ``s SUBSET s' /\ t SUBSET t'
3313     ==> (s' INTER t' = {}) ==> (s INTER t = {})``) THEN
3314    CONJ_TAC THEN MATCH_MP_TAC SUBSET_INTERIOR THEN SET_TAC[],
3315  MATCH_MP_TAC(TAUT `(a ==> b /\ c) /\ d /\ e
3316   ==> (a ==> (b /\ d) /\ (c /\ e))`) THEN
3317  CONJ_TAC THENL
3318  [DISCH_THEN(fn th => CONJ_TAC THEN MP_TAC th) THEN
3319   DISCH_THEN(SUBST1_TAC o SYM) THEN REWRITE_TAC[INTER_BIGUNION] THEN
3320   ONCE_REWRITE_TAC[EXTENSION] THEN REWRITE_TAC[IN_BIGUNION] THEN
3321   X_GEN_TAC ``x:real`` THEN AP_TERM_TAC THEN
3322   GEN_REWR_TAC I [FUN_EQ_THM] THEN X_GEN_TAC ``kk:real->bool`` THEN
3323   SIMP_TAC std_ss [GSPECIFICATION, PAIR_EQ, EXISTS_PROD] THEN MESON_TAC[NOT_IN_EMPTY],
3324   ALL_TAC] THEN
3325   UNDISCH_TAC `` (\x. if x = c then d1 x INTER d2 x
3326         else ball (x,abs (x - c)) INTER d1 x INTER d2 x) FINE p`` THEN
3327   DISCH_TAC THEN
3328   CONJ_TAC THEN FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [FINE]) THEN
3329   SIMP_TAC std_ss [FINE, lemma1] THEN
3330   REPEAT (DISCH_TAC THEN GEN_TAC THEN GEN_TAC THEN
3331    POP_ASSUM (MP_TAC o Q.SPECL [`x:real`, `kk:real->bool`])) THEN
3332   DISCH_THEN(fn th => STRIP_TAC THEN MP_TAC th) THEN
3333   ASM_SIMP_TAC std_ss [] THEN SET_TAC[]], ALL_TAC] THEN
3334   DISCH_THEN(MP_TAC o MATCH_MP (METIS [REAL_HALF, REAL_LT_ADD2]
3335     ``x < e / &2 /\ y < e / &2 ==> x + y < e:real``)) THEN
3336   DISCH_THEN(MP_TAC o MATCH_MP ABS_TRIANGLE_LT) THEN
3337   MATCH_MP_TAC EQ_IMPLIES THEN AP_THM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN
3338   REWRITE_TAC[REAL_ARITH
3339   ``((a - i) + (b - j) = c - (i + j)) <=> (a + b = c:real)``] THEN
3340   FIRST_ASSUM(ASSUME_TAC o MATCH_MP TAGGED_DIVISION_OF_FINITE) THEN
3341   MATCH_MP_TAC EQ_TRANS THEN
3342   EXISTS_TAC
3343   ``sum p (\(x,l). content (l INTER {x:real | x <= c}) *
3344     (f:real->real) x) +
3345     sum p (\(x,l). content (l INTER {x:real | x >= c}) *
3346     (f:real->real) x)`` THEN CONJ_TAC THENL
3347  [ALL_TAC,
3348   ASM_SIMP_TAC std_ss [GSYM SUM_ADD] THEN MATCH_MP_TAC SUM_EQ THEN
3349   SIMP_TAC std_ss [FORALL_PROD, GSYM REAL_ADD_RDISTRIB] THEN
3350   MAP_EVERY X_GEN_TAC [``x:real``, ``l:real->bool``] THEN
3351   DISCH_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN
3352   UNDISCH_TAC ``p tagged_division_of interval [(a,b)]`` THEN DISCH_TAC THEN
3353   FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [TAGGED_DIVISION_OF]) THEN
3354   ASM_REWRITE_TAC [] THEN STRIP_TAC THEN UNDISCH_TAC
3355    ``!x k. (x,k) IN p ==>
3356         x IN k /\ k SUBSET interval [(a,b)] /\
3357         ?a b. k = interval [(a,b)]`` THEN DISCH_TAC THEN
3358   POP_ASSUM (MP_TAC o Q.SPECL [`x:real`, `l:real->bool`]) THEN
3359   ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
3360   ASM_SIMP_TAC std_ss [GSYM CONTENT_SPLIT]] THEN
3361  ASM_SIMP_TAC std_ss [lemma3] THEN BINOP_TAC THEN
3362  (ONCE_REWRITE_TAC [METIS [] ``!x:real l:real->bool.
3363    ((l INTER {x | x <= c}) = (\l. l INTER {x | x <= c}) l) /\
3364    ((l INTER {x | x >= c}) = (\l. l INTER {x | x >= c}) l)``] THEN
3365   GEN_REWR_TAC (RAND_CONV o RAND_CONV) [lemma4] THEN
3366   MATCH_MP_TAC SUM_IMAGE_NONZERO THEN ASM_SIMP_TAC std_ss [FORALL_PROD] THEN
3367   REWRITE_TAC[PAIR_EQ] THEN
3368   METIS_TAC [TAGGED_DIVISION_SPLIT_LEFT_INJ, REAL_MUL_LZERO,
3369    TAGGED_DIVISION_SPLIT_RIGHT_INJ])
3370QED
3371
3372(* ------------------------------------------------------------------------- *)
3373(* A sort of converse, integrability on subintervals.                        *)
3374(* ------------------------------------------------------------------------- *)
3375
3376Theorem TAGGED_DIVISION_UNION_INTERVAL:
3377   !a b:real p1 p2 c.
3378   p1 tagged_division_of (interval[a,b] INTER {x | x <= c}) /\
3379   p2 tagged_division_of (interval[a,b] INTER {x | x >= c})
3380   ==> (p1 UNION p2) tagged_division_of (interval[a,b])
3381Proof
3382  REPEAT STRIP_TAC THEN SUBGOAL_THEN
3383  ``(interval[a,b] = (interval[a,b] INTER {x:real | x <= c}) UNION
3384                     (interval[a,b] INTER {x:real | x >= c}))``
3385                       SUBST1_TAC THENL
3386  [MATCH_MP_TAC(SET_RULE
3387   ``(t UNION u = UNIV) ==> (s = (s INTER t) UNION (s INTER u))``) THEN
3388   SIMP_TAC std_ss [EXTENSION, IN_UNIV, IN_UNION, GSPECIFICATION] THEN
3389   REAL_ARITH_TAC, ALL_TAC] THEN
3390  MATCH_MP_TAC TAGGED_DIVISION_UNION THEN ASM_REWRITE_TAC[] THEN
3391  ASM_SIMP_TAC std_ss [INTERVAL_SPLIT, INTERIOR_CLOSED_INTERVAL] THEN
3392  SIMP_TAC std_ss [EXTENSION, IN_INTER, NOT_IN_EMPTY, IN_INTERVAL] THEN
3393  GEN_TAC THEN REWRITE_TAC [GSYM DE_MORGAN_THM] THEN
3394  DISCH_THEN(CONJUNCTS_THEN (MP_TAC)) THEN REWRITE_TAC [min_def, max_def] THEN
3395  REPEAT COND_CASES_TAC THENL
3396  [STRIP_TAC THEN SIMP_TAC std_ss [REAL_NOT_LT] THEN DISJ2_TAC THEN
3397   MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC ``c:real`` THEN
3398   ASM_SIMP_TAC arith_ss [REAL_LE_LT],
3399   SIMP_TAC std_ss [REAL_NOT_LT, REAL_LE_LT],
3400   STRIP_TAC THEN KNOW_TAC ``a < b /\ b < a:real`` THENL [CONJ_TAC THENL
3401   [MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC ``x:real`` THEN ASM_REWRITE_TAC [],
3402    MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC ``c:real`` THEN
3403    FULL_SIMP_TAC std_ss [REAL_NOT_LE]], SIMP_TAC std_ss [REAL_LT_ANTISYM]],
3404   STRIP_TAC THEN FULL_SIMP_TAC std_ss [REAL_NOT_LE, REAL_NOT_LT] THEN
3405   DISJ2_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC ``a:real`` THEN
3406   ASM_SIMP_TAC std_ss [REAL_LE_LT]]
3407QED
3408
3409Theorem HAS_INTEGRAL_SEPARATE_SIDES:
3410   !f:real->real i a b.
3411   (f has_integral i) (interval[a,b])
3412   ==> !e. &0 < e ==> ?d. gauge d /\
3413       !p1 p2. p1 tagged_division_of
3414        (interval[a,b] INTER {x | x <= c}) /\ d FINE p1 /\
3415           p2 tagged_division_of
3416        (interval[a,b] INTER {x | x >= c}) /\ d FINE p2
3417       ==> abs ((sum p1 (\(x,k). content k * f x) +
3418                 sum p2 (\(x,k). content k * f x)) - i) < e
3419Proof
3420  REWRITE_TAC[has_integral] THEN REPEAT GEN_TAC THEN
3421  DISCH_TAC THEN GEN_TAC THEN POP_ASSUM (MP_TAC o Q.SPEC `e:real`) THEN
3422  ASM_CASES_TAC ``&0 < e:real`` THEN ASM_REWRITE_TAC[] THEN
3423  DISCH_THEN (X_CHOOSE_TAC ``d:real->real->bool``) THEN
3424  EXISTS_TAC ``d:real->real->bool`` THEN POP_ASSUM MP_TAC THEN
3425  STRIP_TAC THEN ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN
3426  SUBGOAL_THEN
3427   ``sum p1 (\(x,k). content k * f x) + sum p2 (\(x,k). content k * f x) =
3428     sum (p1 UNION p2) (\(x,k:real->bool). content k * (f:real->real) x)``
3429    SUBST1_TAC THENL
3430  [ALL_TAC, METIS_TAC[TAGGED_DIVISION_UNION_INTERVAL, FINE_UNION]] THEN
3431  CONV_TAC SYM_CONV THEN MATCH_MP_TAC SUM_UNION_NONZERO THEN
3432  UNDISCH_TAC ``p2 tagged_division_of interval [(a,b)] INTER {x | x >= c}`` THEN
3433  DISCH_TAC THEN FIRST_X_ASSUM(STRIP_ASSUME_TAC o REWRITE_RULE [TAGGED_DIVISION_OF]) THEN
3434  UNDISCH_TAC ``p1 tagged_division_of interval [(a,b)] INTER {x | x <= c}`` THEN
3435  DISCH_TAC THEN  FIRST_X_ASSUM(STRIP_ASSUME_TAC o REWRITE_RULE [TAGGED_DIVISION_OF]) THEN
3436  ASM_SIMP_TAC std_ss [FORALL_PROD] THEN
3437  MAP_EVERY X_GEN_TAC [``x:real``, ``l:real->bool``] THEN
3438  REWRITE_TAC [IN_INTER, REAL_ENTIRE] THEN STRIP_TAC THEN DISJ1_TAC THEN
3439  SUBGOAL_THEN
3440  ``(?a b:real. l = interval[a,b]) /\
3441    l SUBSET (interval[a,b] INTER {x | x <= c}) /\
3442    l SUBSET (interval[a,b] INTER {x | x >= c})``
3443   MP_TAC THENL [ASM_MESON_TAC[], ALL_TAC] THEN
3444  DISCH_THEN(CONJUNCTS_THEN2 STRIP_ASSUME_TAC MP_TAC) THEN
3445  ASM_REWRITE_TAC[SET_RULE
3446  ``s SUBSET t /\ s SUBSET u <=> s SUBSET (t INTER u)``] THEN
3447  ASM_SIMP_TAC std_ss [INTERVAL_SPLIT, INTER_INTERVAL] THEN
3448  DISCH_THEN(MP_TAC o MATCH_MP SUBSET_INTERIOR) THEN
3449  REWRITE_TAC[INTERIOR_CLOSED_INTERVAL, CONTENT_EQ_0_INTERIOR] THEN
3450  MATCH_MP_TAC(SET_RULE ``(t = {}) ==> s SUBSET t ==> (s = {})``) THEN
3451  SIMP_TAC std_ss [GSYM INTERVAL_EQ_EMPTY] THEN
3452  RW_TAC std_ss [REAL_MIN_LE, REAL_LE_MAX] THEN REAL_ARITH_TAC
3453QED
3454
3455Theorem lemma[local]:
3456    (b - a = c) ==>
3457     abs (a:real) < e / &2 ==> abs (b) < e / &2 ==> abs (c) < e
3458Proof
3459  DISCH_THEN(SUBST1_TAC o SYM) THEN REWRITE_TAC[GSYM dist] THEN
3460  REPEAT STRIP_TAC THEN MATCH_MP_TAC DIST_TRIANGLE_HALF_L THEN
3461  EXISTS_TAC ``0:real`` THEN
3462  ASM_SIMP_TAC std_ss [dist, REAL_SUB_LZERO, REAL_SUB_RZERO, ABS_NEG]
3463QED
3464
3465Theorem INTEGRABLE_SPLIT:
3466   !f:real->real a b.
3467    f integrable_on (interval[a,b])
3468    ==> f integrable_on (interval[a,b] INTER {x | x <= c}) /\
3469        f integrable_on (interval[a,b] INTER {x | x >= c})
3470Proof
3471  REPEAT GEN_TAC THEN
3472  GEN_REWR_TAC (LAND_CONV o ONCE_DEPTH_CONV) [integrable_on] THEN
3473  SIMP_TAC std_ss [LEFT_IMP_EXISTS_THM, GSYM LEFT_EXISTS_AND_THM] THEN
3474  X_GEN_TAC ``y:real`` THEN DISCH_TAC THEN CONJ_TAC THEN
3475  ASM_SIMP_TAC std_ss [INTERVAL_SPLIT, INTEGRABLE_CAUCHY] THEN
3476  X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
3477  FIRST_ASSUM(MP_TAC o SPEC ``e / &2:real`` o
3478   MATCH_MP HAS_INTEGRAL_SEPARATE_SIDES) THEN
3479  MAP_EVERY ABBREV_TAC
3480  [``b' = min (b:real) c``, ``a' = max (a:real) c``] THEN
3481  ASM_SIMP_TAC std_ss [REAL_HALF, INTERVAL_SPLIT] THEN
3482  DISCH_THEN (X_CHOOSE_TAC ``d:real->real->bool``) THEN
3483  EXISTS_TAC ``d:real->real->bool`` THEN POP_ASSUM MP_TAC THEN
3484  STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
3485  FIRST_ASSUM(MP_TAC o MATCH_MP FINE_DIVISION_EXISTS) THENL
3486  [DISCH_THEN(MP_TAC o SPECL [``a':real``, ``b:real``]) THEN
3487   KNOW_TAC ``! (p2 :real # (real -> bool) -> bool)
3488                (p1 :real # (real -> bool) -> bool).
3489        p1 tagged_division_of interval [((a :real),(b' :real))] /\
3490        (d :real -> real -> bool) FINE p1 /\
3491        p2 tagged_division_of interval [((a' :real),(b :real))] /\
3492        d FINE p2 ==>
3493        abs (sum p1 (\((x :real),(k :real -> bool)).
3494                content k * (f :real -> real) x) +
3495           sum p2 (\((x :real),(k :real -> bool)). content k * f x) -
3496           (y :real)) < (e :real) / (2 :real)`` THENL
3497   [METIS_TAC [SWAP_FORALL_THM], POP_ASSUM K_TAC THEN DISCH_TAC],
3498   DISCH_THEN(MP_TAC o SPECL [``a:real``, ``b':real``])] THEN
3499  DISCH_THEN(X_CHOOSE_THEN ``p:(real#(real->bool))->bool``
3500   STRIP_ASSUME_TAC) THEN
3501  REPEAT STRIP_TAC THEN FIRST_X_ASSUM(fn th =>
3502   MP_TAC(SPECL [``p:(real#(real->bool))->bool``,
3503   ``p1:(real#(real->bool))->bool``] th) THEN
3504   MP_TAC(SPECL [``p:(real#(real->bool))->bool``,
3505   ``p2:(real#(real->bool))->bool``] th)) THEN
3506  ASM_REWRITE_TAC[] THEN MATCH_MP_TAC lemma THEN REAL_ARITH_TAC
3507QED
3508
3509(* ------------------------------------------------------------------------- *)
3510(* Generalized notion of additivity.                                         *)
3511(* ------------------------------------------------------------------------- *)
3512
3513Definition operative[nocompute]:
3514 operative op (f:(real->bool)->'a) <=>
3515  (!a b. (content(interval[a,b]) = &0) ==> (f(interval[a,b]) = neutral(op))) /\
3516  (!a b c. (f(interval[a,b]) = op (f(interval[a,b] INTER {x | x <= c}))
3517                                  (f(interval[a,b] INTER {x | x >= c}))))
3518End
3519
3520Theorem OPERATIVE_TRIVIAL:
3521   !op f a b.
3522  operative op f /\ (content(interval[a,b]) = &0)
3523  ==> (f(interval[a,b]) = neutral op)
3524Proof
3525 REWRITE_TAC[operative] THEN MESON_TAC[]
3526QED
3527
3528Theorem PROPERTY_EMPTY_INTERVAL:
3529   !P. (!a b:real. (content(interval[a,b]) = &0)
3530   ==> P(interval[a,b])) ==> P {}
3531Proof
3532  MESON_TAC[EMPTY_AS_INTERVAL, CONTENT_EMPTY]
3533QED
3534
3535Theorem OPERATIVE_EMPTY:
3536   !op f:(real->bool)->'a. operative op f ==> (f {} = neutral op)
3537Proof
3538  REPEAT GEN_TAC THEN REWRITE_TAC[operative] THEN
3539  DISCH_THEN (CONJUNCTS_THEN2 (MP_TAC o SPECL [``1:real``, ``0:real``]) ASSUME_TAC) THEN
3540  ASSUME_TAC INTERVAL_EQ_EMPTY THEN POP_ASSUM (MP_TAC o Q.SPECL [`1:real`, `0:real`]) THEN
3541  REWRITE_TAC [REAL_ARITH ``0 < 1:real``] THEN STRIP_TAC THEN
3542  ASM_REWRITE_TAC [CONTENT_EMPTY] THEN METIS_TAC []
3543QED
3544
3545(* ------------------------------------------------------------------------- *)
3546(* Two key instances of additivity.                                          *)
3547(* ------------------------------------------------------------------------- *)
3548
3549Theorem OPERATIVE_CONTENT:
3550   operative(+) content
3551Proof
3552  REWRITE_TAC[operative, NEUTRAL_REAL_ADD, CONTENT_SPLIT]
3553QED
3554
3555Theorem OPERATIVE_INTEGRAL:
3556   !f:real->real. operative(lifted(+))
3557   (\i. if f integrable_on i then SOME(integral i f) else NONE)
3558Proof
3559  SIMP_TAC std_ss [operative, NEUTRAL_LIFTED, MONOIDAL_REAL_ADD] THEN
3560  SIMP_TAC std_ss [NEUTRAL_REAL_ADD] THEN
3561  REPEAT STRIP_TAC THEN REPEAT(COND_CASES_TAC THEN ASM_SIMP_TAC std_ss []) THEN
3562  REWRITE_TAC[lifted, NOT_NONE_SOME, option_CLAUSES] THENL
3563  [REWRITE_TAC [integrable_on] THEN
3564   ASM_MESON_TAC[HAS_INTEGRAL_NULL],
3565   REWRITE_TAC[integral] THEN METIS_TAC[HAS_INTEGRAL_NULL_EQ],
3566   REPEAT(FIRST_X_ASSUM(MP_TAC o MATCH_MP INTEGRABLE_INTEGRAL)) THEN
3567   METIS_TAC[HAS_INTEGRAL_SPLIT, HAS_INTEGRAL_UNIQUE],
3568   METIS_TAC[INTEGRABLE_SPLIT, integrable_on],
3569   METIS_TAC[INTEGRABLE_SPLIT],
3570   METIS_TAC[INTEGRABLE_SPLIT],
3571   RULE_ASSUM_TAC(REWRITE_RULE[integrable_on]) THEN
3572   METIS_TAC[HAS_INTEGRAL_SPLIT]]
3573QED
3574
3575(* ------------------------------------------------------------------------- *)
3576(* Points of division of a partition.                                        *)
3577(* ------------------------------------------------------------------------- *)
3578
3579val _ = hide "division_points";
3580
3581(* NOTE: ‘(j <= 1:num)’ was ‘j <= dimindex(:'N)’ for multivariate calculus *)
3582Definition division_points[nocompute]:
3583 division_points (k:real->bool) (d:(real->bool)->bool) =
3584   {(j,x) | (1:num <= j) /\ (j <= 1:num) /\ (interval_lowerbound k) < x /\
3585                          x < (interval_upperbound k) /\
3586        ?i. i IN d /\ ((interval_lowerbound i = x) \/
3587                       (interval_upperbound i = x))}
3588End
3589
3590Theorem DIVISION_POINTS_FINITE:
3591   !d i:real->bool. d division_of i ==> FINITE(division_points i d)
3592Proof
3593  REWRITE_TAC[division_of, division_points] THEN
3594  REPEAT STRIP_TAC THEN REWRITE_TAC[CONJ_ASSOC, GSYM IN_NUMSEG] THEN
3595  REWRITE_TAC[SPECIFICATION, GSYM CONJ_ASSOC] THEN
3596  KNOW_TAC ``FINITE {(\j x. (j,x)) j x |
3597   j IN {1 .. 1} /\ x IN (\j x. interval_lowerbound i < x /\
3598                     x < interval_upperbound i /\ ?i. d i /\
3599     ((interval_lowerbound i = x) \/ (interval_upperbound i = x))) j }`` THENL
3600  [ALL_TAC, BETA_TAC THEN SIMP_TAC std_ss [SPECIFICATION]] THEN
3601  MATCH_MP_TAC FINITE_PRODUCT_DEPENDENT THEN
3602  SIMP_TAC std_ss [ETA_AX, FINITE_NUMSEG] THEN
3603  X_GEN_TAC ``j:num`` THEN
3604  REWRITE_TAC[IN_NUMSEG] THEN STRIP_TAC THEN
3605  MATCH_MP_TAC FINITE_SUBSET THEN EXISTS_TAC
3606   ``IMAGE (\i:real->bool. (interval_lowerbound i)) d UNION
3607     IMAGE (\i:real->bool. (interval_upperbound i)) d`` THEN
3608  ASM_SIMP_TAC std_ss [FINITE_UNION, IMAGE_FINITE] THEN
3609  SIMP_TAC std_ss [SUBSET_DEF, IN_IMAGE, IN_UNION, GSPECIFICATION] THEN
3610  REWRITE_TAC [SPECIFICATION] THEN BETA_TAC THEN
3611  MESON_TAC[SPECIFICATION]
3612QED
3613
3614Theorem DIVISION_POINTS_SUBSET:
3615   !a b:real c d k.
3616      d division_of interval[a,b] /\ a < b /\ a < c /\ c < b
3617    ==> division_points (interval[a,b] INTER {x | x <= c})
3618         {l INTER {x | x <= c} | l |
3619          l IN d /\ ~(l INTER {x | x <= c} = {})}
3620   SUBSET division_points (interval[a,b]) d /\
3621          division_points (interval[a,b] INTER {x | x >= c})
3622         {l INTER {x | x >= c} | l |
3623          l IN d /\ ~(l INTER {x | x >= c} = {})}
3624   SUBSET division_points (interval[a,b]) d
3625Proof
3626  REPEAT STRIP_TAC THEN
3627  (SIMP_TAC std_ss [SUBSET_DEF, division_points, FORALL_PROD] THEN
3628   MAP_EVERY X_GEN_TAC [``j:num``, ``x:real``] THEN
3629   SIMP_TAC std_ss [IN_ELIM_PAIR_THM] THEN SIMP_TAC std_ss [GSPECIFICATION] THEN
3630   ASM_SIMP_TAC std_ss [INTERVAL_SPLIT, INTERVAL_LOWERBOUND, INTERVAL_UPPERBOUND,
3631    REAL_LT_IMP_LE] THEN
3632   ASM_SIMP_TAC std_ss [METIS [max_def, REAL_LT_IMP_LE] ``a < c ==> (max a c = c:real)``,
3633                        METIS [min_def, REAL_NOT_LE] ``c < b ==> (min b c = c:real)``] THEN
3634  DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
3635  DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
3636  ASM_SIMP_TAC std_ss [INTERVAL_UPPERBOUND, INTERVAL_LOWERBOUND,
3637   REAL_LT_IMP_LE, COND_ID,
3638  METIS [] ``(a <= if p then x else y) <=> (if p then a <= x else a <= y)``,
3639  METIS [] ``(if p then x else y) <= a <=> (if p then x <= a else y <= a)``] THEN
3640  DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
3641  DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
3642  DISCH_THEN(fn th => CONJ_TAC THEN MP_TAC th) THENL
3643  [DISCH_THEN(K ALL_TAC) THEN REPEAT(POP_ASSUM MP_TAC) THEN
3644   ASM_SIMP_TAC arith_ss [] THEN REAL_ARITH_TAC, ALL_TAC]) THENL
3645  [KNOW_TAC ``!l. (?i. ((l IN d /\ ~(l INTER {x | x <= c} = {})) /\
3646            (i = l INTER {x | x <= c})) /\
3647           ((interval_lowerbound i = x) \/ (interval_upperbound i = x)))
3648          ==> l IN d /\
3649         ((interval_lowerbound l = x) \/ (interval_upperbound l = x))`` THENL
3650  [ALL_TAC, METIS_TAC [GSYM LEFT_EXISTS_AND_THM, SWAP_EXISTS_THM, MONO_EXISTS]],
3651   KNOW_TAC ``!l. (?i. ((l IN d /\ ~(l INTER {x | x >= c} = {})) /\
3652            (i = l INTER {x | x >= c})) /\
3653           ((interval_lowerbound i = x) \/ (interval_upperbound i = x)))
3654          ==> l IN d /\
3655         ((interval_lowerbound l = x) \/ (interval_upperbound l = x))`` THENL
3656  [ALL_TAC, METIS_TAC [GSYM LEFT_EXISTS_AND_THM, SWAP_EXISTS_THM, MONO_EXISTS]]] THEN
3657  (ONCE_REWRITE_TAC[TAUT `(a /\ b) /\ c <=> b /\ a /\ c`]) THENL
3658  [KNOW_TAC ``!l. (l IN d /\ ~(l INTER {x | x <= c} = {})) /\
3659     ((interval_lowerbound (l INTER {x | x <= c}) = x) \/
3660      (interval_upperbound (l INTER {x | x <= c}) = x))
3661     ==> l IN d /\
3662         ((interval_lowerbound l = x) \/ (interval_upperbound l = x))`` THENL
3663  [ALL_TAC, METIS_TAC [UNWIND_THM2]] THEN SIMP_TAC std_ss [GSYM CONJ_ASSOC],
3664   KNOW_TAC ``!l. (l IN d /\ ~(l INTER {x | x >= c} = {})) /\
3665     ((interval_lowerbound (l INTER {x | x >= c}) = x) \/
3666      (interval_upperbound (l INTER {x | x >= c}) = x))
3667     ==> l IN d /\
3668         ((interval_lowerbound l = x) \/ (interval_upperbound l = x))`` THENL
3669  [ALL_TAC, METIS_TAC [UNWIND_THM2]] THEN SIMP_TAC std_ss [GSYM CONJ_ASSOC]] THEN
3670  (ONCE_REWRITE_TAC[IMP_CONJ] THEN
3671  FIRST_ASSUM(fn th => SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION th]) THEN
3672  MAP_EVERY X_GEN_TAC [``u:real``, ``v:real``] THEN DISCH_TAC THEN
3673  ASM_SIMP_TAC std_ss [INTERVAL_SPLIT] THEN
3674  SUBGOAL_THEN
3675  ``(u:real) <= (v:real)`` ASSUME_TAC THENL
3676  [SIMP_TAC std_ss [GSYM INTERVAL_NE_EMPTY] THEN ASM_MESON_TAC[division_of],
3677   ALL_TAC] THEN
3678  REWRITE_TAC[INTERVAL_NE_EMPTY] THEN
3679  DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
3680  ASM_SIMP_TAC std_ss [INTERVAL_UPPERBOUND, INTERVAL_LOWERBOUND] THEN
3681  POP_ASSUM MP_TAC THEN REWRITE_TAC [min_def, max_def] THEN
3682  REPEAT (COND_CASES_TAC) THEN FULL_SIMP_TAC arith_ss [] THEN
3683  REPEAT STRIP_TAC THEN FULL_SIMP_TAC std_ss [REAL_LT_REFL])
3684QED
3685
3686Theorem DIVISION_POINTS_PSUBSET:
3687   !a b:real c d.
3688   d division_of interval[a,b] /\ a < b /\ a < c /\ c < b /\
3689   (?l. l IN d /\
3690   ((interval_lowerbound l = c) \/ (interval_upperbound l = c)))
3691   ==> division_points (interval[a,b] INTER {x | x <= c})
3692       {l INTER {x | x <= c} | l |
3693        l IN d /\ ~(l INTER {x | x <= c} = {})}
3694       PSUBSET division_points (interval[a,b]) d /\
3695       division_points (interval[a,b] INTER {x | x >= c})
3696       {l INTER {x | x >= c} | l |
3697        l IN d /\ ~(l INTER {x | x >= c} = {})}
3698       PSUBSET division_points (interval[a,b]) d
3699Proof
3700  REPEAT STRIP_TAC THEN
3701  ASM_SIMP_TAC std_ss [PSUBSET_MEMBER, DIVISION_POINTS_SUBSET] THENL
3702  [EXISTS_TAC ``1:num,(interval_lowerbound l:real)``,
3703   EXISTS_TAC ``1:num,(interval_lowerbound l:real)``,
3704   EXISTS_TAC ``1:num,(interval_upperbound l:real)``,
3705   EXISTS_TAC ``1:num,(interval_upperbound l:real)``] THEN
3706  ASM_SIMP_TAC std_ss [division_points, IN_ELIM_PAIR_THM] THEN
3707  ASM_SIMP_TAC std_ss [INTERVAL_LOWERBOUND, INTERVAL_UPPERBOUND, REAL_LT_IMP_LE] THEN
3708  (CONJ_TAC THENL [ASM_MESON_TAC[], ALL_TAC]) THEN
3709  ASM_SIMP_TAC std_ss [INTERVAL_SPLIT, INTERVAL_LOWERBOUND, INTERVAL_UPPERBOUND,
3710   REAL_LT_IMP_LE] THEN
3711  ASM_SIMP_TAC std_ss [METIS [max_def, REAL_LT_IMP_LE] ``a < c ==> (max a c = c:real)``,
3712                       METIS [min_def, REAL_NOT_LE] ``c < b ==> (min b c = c:real)``] THEN
3713  ASM_SIMP_TAC std_ss [INTERVAL_UPPERBOUND, INTERVAL_LOWERBOUND, REAL_LT_IMP_LE, COND_ID,
3714   METIS [] ``(a <= if p then x else y) <=> (if p then a <= x else a <= y)``,
3715   METIS [] ``(if p then x else y) <= a <=> (if p then x <= a else y <= a)``] THEN
3716  REWRITE_TAC[REAL_LT_REFL]
3717QED
3718
3719(* ------------------------------------------------------------------------- *)
3720(* Preservation by divisions and tagged divisions.                           *)
3721(* ------------------------------------------------------------------------- *)
3722
3723Theorem OPERATIVE_DIVISION :
3724    !op d a b f:(real->bool)->'a.
3725        monoidal op /\ operative op f /\ d division_of interval[a,b]
3726    ==> (iterate(op) d f = f(interval[a,b]))
3727Proof
3728  REPEAT GEN_TAC THEN CONV_TAC(RAND_CONV SYM_CONV) THEN
3729  completeInduct_on
3730   `CARD (division_points (interval[a,b]:real->bool) d)` THEN
3731  REPEAT GEN_TAC THEN DISCH_TAC THEN FULL_SIMP_TAC std_ss [] THEN
3732  POP_ASSUM K_TAC THEN
3733  POP_ASSUM(fn th => REPEAT STRIP_TAC THEN MP_TAC th) THEN
3734  ASM_REWRITE_TAC[] THEN
3735   ASM_CASES_TAC ``content(interval[a:real,b]) = &0`` THENL
3736  [SUBGOAL_THEN ``iterate op d (f:(real->bool)->'a) = neutral op``
3737   (fn th => METIS_TAC[th, operative]) THEN
3738   MATCH_MP_TAC(SIMP_RULE std_ss [RIGHT_IMP_FORALL_THM, AND_IMP_INTRO]
3739   ITERATE_EQ_NEUTRAL) THEN
3740   UNDISCH_TAC ``d division_of interval [(a,b)]`` THEN DISCH_TAC THEN
3741   FIRST_ASSUM(fn th => SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION th]) THEN
3742   ASM_MESON_TAC[operative, DIVISION_OF_CONTENT_0],
3743   ALL_TAC] THEN
3744  FIRST_ASSUM(MP_TAC o REWRITE_RULE [GSYM CONTENT_LT_NZ]) THEN
3745  REWRITE_TAC[CONTENT_POS_LT_EQ] THEN STRIP_TAC THEN
3746  UNDISCH_TAC ``d division_of interval [(a,b)]`` THEN DISCH_TAC THEN
3747  FIRST_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_FINITE) THEN
3748  ASM_CASES_TAC ``division_points (interval[a,b]:real->bool) d = {}`` >-
3749  ( DISCH_THEN(K ALL_TAC) THEN
3750     SUBGOAL_THEN
3751    “!i. i IN d
3752     ==> ?u v:real. (i = interval[u,v]) /\
3753         ((u = (a:real)) /\ (v = a) \/
3754          (u = (b:real)) /\ (v = b) \/
3755          (u = a) /\ (v = b))”
3756    (ASSUME_TAC) THENL
3757    [FIRST_ASSUM(fn th => SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION th]) THEN
3758     MAP_EVERY X_GEN_TAC [``u:real``, ``v:real``] THEN DISCH_TAC THEN
3759     MAP_EVERY EXISTS_TAC [``u:real``, ``v:real``] THEN REWRITE_TAC[] THEN
3760     UNDISCH_TAC ``d division_of interval [(a,b)]`` THEN DISCH_TAC THEN
3761     FIRST_ASSUM(MP_TAC o REWRITE_RULE [division_of]) THEN
3762     ASM_REWRITE_TAC[] THEN
3763     DISCH_THEN(MP_TAC o SPEC ``interval[u:real,v]`` o CONJUNCT1) THEN
3764     ASM_REWRITE_TAC[INTERVAL_NE_EMPTY] THEN
3765     DISCH_THEN(CONJUNCTS_THEN2 MP_TAC (ASSUME_TAC o CONJUNCT1)) THEN
3766     ASM_REWRITE_TAC[SUBSET_INTERVAL] THEN STRIP_TAC THEN
3767     MATCH_MP_TAC(REAL_ARITH
3768     ``a <= u /\ u <= v /\ v <= b /\ ~(a < u /\ u < b \/ a < v /\ v < b:real)
3769       ==> (u = a) /\ (v = a) \/ (u = b) /\ (v = b) \/ (u = a) /\ (v = b)``) THEN
3770     ASM_REWRITE_TAC [] THEN DISCH_TAC THEN
3771     UNDISCH_TAC ``division_points (interval [(a,b)]) d = {}`` THEN DISCH_TAC THEN
3772     FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [EXTENSION]) THEN
3773     DISCH_THEN (MP_TAC o SIMP_RULE std_ss [division_points, NOT_IN_EMPTY, FORALL_PROD]) THEN
3774     SIMP_TAC std_ss [IN_ELIM_PAIR_THM] THEN EXISTS_TAC ``1:num`` THEN
3775     REWRITE_TAC [LESS_EQ_REFL] THEN SIMP_TAC std_ss [GSYM RIGHT_EXISTS_AND_THM] THEN
3776     SIMP_TAC std_ss [NOT_EXISTS_THM] THEN
3777     KNOW_TAC ``?(i :real -> bool)(p_2 :real).
3778      interval_lowerbound (interval [((a :real),(b :real))]) < p_2 /\
3779      p_2 < interval_upperbound (interval [(a,b)]) /\
3780      i IN (d :(real -> bool) -> bool) /\
3781      ((interval_lowerbound i = p_2) \/ (interval_upperbound i = p_2))`` THENL
3782     [ALL_TAC, METIS_TAC [SWAP_EXISTS_THM]] THEN
3783     EXISTS_TAC ``interval[u:real,v]`` THEN
3784     ASM_SIMP_TAC std_ss [INTERVAL_UPPERBOUND, INTERVAL_LOWERBOUND, REAL_LT_IMP_LE] THEN
3785     KNOW_TAC ``~(!p_2:real. ~(a < p_2 /\ p_2 < b /\ ((u = p_2) \/ (v = p_2))))`` THENL
3786     [ALL_TAC, SIMP_TAC std_ss []] THEN
3787     DISCH_THEN(fn th =>
3788      MP_TAC(SPEC ``(u:real)`` th) THEN
3789      MP_TAC(SPEC ``(v:real)`` th)) THEN
3790     FIRST_X_ASSUM(DISJ_CASES_THEN MP_TAC) THEN REAL_ARITH_TAC,
3791     ALL_TAC] THEN
3792    SUBGOAL_THEN ``interval[a:real,b] IN d`` MP_TAC THENL
3793    [UNDISCH_TAC ``d division_of interval [(a,b)]`` THEN DISCH_TAC THEN
3794     FIRST_ASSUM(MP_TAC o REWRITE_RULE [division_of]) THEN
3795     ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o last o CONJUNCTS) THEN
3796     REWRITE_TAC[EXTENSION, IN_INTERVAL, IN_BIGUNION] THEN
3797     DISCH_THEN(MP_TAC o SPEC ``inv(&2) * (a + b:real)``) THEN
3798     MATCH_MP_TAC(TAUT `b /\ (a ==> c) ==> (a <=> b) ==> c`) THEN
3799     CONJ_TAC THENL
3800     [ONCE_REWRITE_TAC [REAL_MUL_SYM] THEN REWRITE_TAC [GSYM real_div] THEN
3801      SIMP_TAC real_ss [REAL_LE_RDIV_EQ, REAL_LE_LDIV_EQ] THEN
3802      UNDISCH_TAC ``a < b:real`` THEN REAL_ARITH_TAC,
3803      ALL_TAC] THEN
3804     DISCH_THEN(X_CHOOSE_THEN ``i:real->bool``
3805     (CONJUNCTS_THEN2 MP_TAC ASSUME_TAC)) THEN
3806     UNDISCH_TAC ``!i. i IN d ==>
3807        ?u v:real. (i = interval [(u,v)]) /\
3808          ((u = a) /\ (v = a) \/ (u = b) /\ (v = b) \/ (u = a) /\ (v = b))`` THEN
3809     DISCH_THEN (MP_TAC o SPEC ``i:real->bool``) THEN
3810     ASM_REWRITE_TAC[] THEN SIMP_TAC std_ss [LEFT_IMP_EXISTS_THM] THEN
3811     MAP_EVERY X_GEN_TAC [``u:real``, ``v:real``] THEN
3812     DISCH_THEN(CONJUNCTS_THEN2 SUBST_ALL_TAC MP_TAC) THEN
3813     SIMP_TAC std_ss [IN_INTERVAL] THEN
3814     SIMP_TAC std_ss [AND_IMP_INTRO, GSYM FORALL_AND_THM] THEN
3815     ONCE_REWRITE_TAC [REAL_MUL_SYM] THEN REWRITE_TAC [GSYM real_div] THEN
3816      SIMP_TAC real_ss [REAL_LE_RDIV_EQ, REAL_LE_LDIV_EQ] THEN
3817     ASM_SIMP_TAC std_ss [REAL_ARITH
3818      ``a < b
3819       ==> (((u = a) /\ (v = a) \/ (u = b) /\ (v = b) \/ (u = a) /\ (v = b)) /\
3820       u * 2 <= (a + b) /\ (a + b) <= v * 2 <=>
3821       (u = a) /\ (v = b:real))``] THEN
3822     ASM_MESON_TAC[],
3823     ALL_TAC] THEN
3824    DISCH_THEN(fn th => ASSUME_TAC th THEN MP_TAC th) THEN
3825    DISCH_THEN(SUBST1_TAC o MATCH_MP (SET_RULE
3826    ``a IN d ==> (d = a INSERT (d DELETE a))``)) THEN
3827    ASM_SIMP_TAC std_ss [ITERATE_CLAUSES, FINITE_DELETE, IN_DELETE] THEN
3828    SUBGOAL_THEN
3829    ``iterate op (d DELETE interval[a,b]) (f:(real->bool)->'a) = neutral op``
3830     (fn th => METIS_TAC[th, monoidal]) THEN
3831    MATCH_MP_TAC(SIMP_RULE std_ss [RIGHT_IMP_FORALL_THM, AND_IMP_INTRO]
3832     ITERATE_EQ_NEUTRAL) THEN
3833    ASM_REWRITE_TAC[] THEN X_GEN_TAC ``l:real->bool`` THEN
3834    REWRITE_TAC[IN_DELETE] THEN STRIP_TAC THEN
3835    SUBGOAL_THEN ``content(l:real->bool) = &0``
3836     (fn th => METIS_TAC[th, operative]) THEN
3837    UNDISCH_TAC ``!i. i IN d ==>
3838        ?u v:real. (i = interval [(u,v)]) /\
3839          ((u = a) /\ (v = a) \/ (u = b) /\ (v = b) \/ (u = a) /\ (v = b))`` THEN
3840    DISCH_THEN (MP_TAC o SPEC ``l:real->bool``) THEN
3841    ASM_SIMP_TAC std_ss [LEFT_IMP_EXISTS_THM] THEN
3842    MAP_EVERY X_GEN_TAC [``u:real``, ``v:real``] THEN
3843    DISCH_THEN(CONJUNCTS_THEN2 SUBST_ALL_TAC MP_TAC) THEN
3844    UNDISCH_TAC ``~(interval[u:real,v] = interval[a,b])`` THEN
3845    ONCE_REWRITE_TAC[MONO_NOT_EQ] THEN
3846    REWRITE_TAC[] THEN DISCH_THEN(fn th => AP_TERM_TAC THEN MP_TAC th) THEN
3847    SIMP_TAC std_ss [CONS_11, PAIR_EQ, CONTENT_EQ_0] THEN
3848    REAL_ARITH_TAC ) \\
3849 (* stage work *)
3850  KNOW_TAC ``
3851   (!(a' :real) (b' :real) (d' :(real -> bool) -> bool).
3852     (CARD (division_points (interval [(a',b')]) d') < CARD
3853     (division_points (interval [((a :real),(b :real))])
3854        (d :(real -> bool) -> bool))) ==>
3855     d' division_of interval [(a',b')] ==>
3856     ((f :(real -> bool) -> 'a) (interval [(a',b')]) =
3857      iterate (op :'a -> 'a -> 'a) d' f)) ==>
3858     (f (interval [(a,b)]) = iterate op d f)`` THENL
3859  [ALL_TAC, METIS_TAC []] THEN
3860  FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [GSYM MEMBER_NOT_EMPTY]) THEN
3861  GEN_REWR_TAC (LAND_CONV o ONCE_DEPTH_CONV) [division_points] THEN
3862  SIMP_TAC std_ss [GSPECIFICATION, LEFT_IMP_EXISTS_THM, EXISTS_PROD] THEN
3863  MAP_EVERY X_GEN_TAC [``k:num``, ``c:real``] THEN
3864  ASM_SIMP_TAC std_ss [INTERVAL_LOWERBOUND, INTERVAL_UPPERBOUND, REAL_LT_IMP_LE] THEN
3865  DISCH_THEN(REPEAT_TCL CONJUNCTS_THEN ASSUME_TAC) THEN
3866  MP_TAC(ISPECL [``a:real``, ``b:real``, ``c:real``, ``d:(real->bool)->bool``]
3867   DIVISION_POINTS_PSUBSET) THEN
3868  ASM_REWRITE_TAC[] THEN
3869  DISCH_THEN(CONJUNCTS_THEN
3870  (MP_TAC o MATCH_MP (SIMP_RULE std_ss [IMP_CONJ]
3871   (METIS [CARD_PSUBSET] ``!a b. a PSUBSET b /\ FINITE b ==>
3872                           CARD a < CARD b``)))) THEN
3873  MP_TAC(ISPECL [``d:(real->bool)->bool``, ``a:real``, ``b:real``, ``c:real``]
3874   DIVISION_SPLIT) THEN
3875  ASM_SIMP_TAC std_ss [DIVISION_POINTS_FINITE] THEN
3876  ASM_SIMP_TAC std_ss [INTERVAL_SPLIT] THEN
3877  KNOW_TAC ``(max a c = c:real) /\ (min b c = c:real)`` THENL
3878  [ CONJ_TAC >- (Suff `a <= c` >- METIS_TAC [REAL_MAX_ALT] \\
3879                 MATCH_MP_TAC REAL_LT_IMP_LE >> art []) \\
3880    Suff `c <= b` >- METIS_TAC [REAL_MIN_ALT] \\
3881    MATCH_MP_TAC REAL_LT_IMP_LE >> art [], STRIP_TAC ] THEN
3882  ASM_SIMP_TAC std_ss [] THEN POP_ASSUM K_TAC THEN POP_ASSUM K_TAC THEN
3883  MAP_EVERY ABBREV_TAC
3884  [``d1:(real->bool)->bool =
3885   {l INTER {x | x <= c} | l | l IN d /\ ~(l INTER {x | x <= c} = {})}``,
3886   ``d2:(real->bool)->bool =
3887   {l INTER {x | x >= c} | l | l IN d /\ ~(l INTER {x | x >= c} = {})}``,
3888   ``cb:real = c``,
3889   ``ca:real = c``] THEN
3890  STRIP_TAC THEN STRIP_TAC THEN STRIP_TAC THEN
3891  DISCH_THEN(fn th =>
3892   MP_TAC(SPECL [``a:real``, ``cb:real``, ``d1:(real->bool)->bool``] th) THEN
3893   MP_TAC(SPECL [``ca:real``, ``b:real``, ``d2:(real->bool)->bool``] th)) THEN
3894  ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN
3895  MATCH_MP_TAC EQ_TRANS THEN
3896  EXISTS_TAC ``op (iterate op d1 (f:(real->bool)->'a))
3897                  (iterate op d2 (f:(real->bool)->'a))`` THEN
3898  CONJ_TAC THENL
3899  [FIRST_ASSUM(MP_TAC o CONJUNCT2 o REWRITE_RULE [operative]) THEN
3900   DISCH_THEN(MP_TAC o SPECL [``a:real``, ``b:real``, ``c:real``]) THEN
3901   ASM_SIMP_TAC std_ss [INTERVAL_SPLIT] THEN
3902   KNOW_TAC ``(max a cb = cb:real) /\ (min b cb = cb:real)`` THENL
3903   [ CONJ_TAC >- (Suff `a <= cb` >- METIS_TAC [REAL_MAX_ALT] \\
3904                  MATCH_MP_TAC REAL_LT_IMP_LE >> art []) \\
3905     Suff `cb <= b` >- METIS_TAC [REAL_MIN_ALT] \\
3906     MATCH_MP_TAC REAL_LT_IMP_LE >> art [], STRIP_TAC ] THEN
3907   ASM_SIMP_TAC std_ss [],
3908   ALL_TAC] THEN
3909  MATCH_MP_TAC EQ_TRANS THEN
3910  EXISTS_TAC
3911  ``op (iterate op d (\l. f(l INTER {x | x <= c}):'a))
3912  (iterate op d (\l. f(l INTER {x:real | x >= c})))`` THEN
3913  CONJ_TAC THENL
3914  [ALL_TAC,
3915   ASM_SIMP_TAC std_ss [GSYM ITERATE_OP] THEN
3916   MATCH_MP_TAC(SIMP_RULE std_ss [RIGHT_IMP_FORALL_THM, AND_IMP_INTRO]
3917    ITERATE_EQ) THEN
3918   ASM_SIMP_TAC std_ss[MATCH_MP FORALL_IN_DIVISION
3919   (ASSUME ``d division_of interval[a:real,b]``)] THEN
3920   METIS_TAC[operative]] THEN
3921  ASM_SIMP_TAC std_ss [] THEN
3922  MAP_EVERY EXPAND_TAC ["d1", "d2"] THEN BINOP_TAC THEN
3923  (KNOW_TAC ``(iterate op d (\l. f (l INTER {x | x <= cb})) =
3924              iterate op d (f o (\l:real->bool. (l INTER {x | x <= cb})))) /\
3925             (iterate op d (\l. f (l INTER {x | x >= cb})) =
3926              iterate op d (f o (\l:real->bool. (l INTER {x | x >= cb}))))`` THENL
3927   [SIMP_TAC std_ss [o_DEF], DISCH_THEN (fn th => SIMP_TAC std_ss [th])]) THENL
3928 [KNOW_TAC ``iterate (op :'a -> 'a -> 'a)
3929  {l INTER {x | x <= (cb :real)} |
3930   l |
3931   l IN (d :(real -> bool) -> bool) /\
3932   l INTER {x | x <= cb} <> ({} :real -> bool)}
3933  (f :(real -> bool) -> 'a) =
3934             iterate (op :'a -> 'a -> 'a)
3935  {(\l. l INTER {x | x <= (cb :real)}) l |
3936   l |
3937   l IN (d :(real -> bool) -> bool) /\
3938   (\l. l INTER {x | x <= cb}) l <> ({} :real -> bool)}
3939  (f :(real -> bool) -> 'a)`` THENL
3940  [METIS_TAC [], DISCH_THEN (fn th => ONCE_REWRITE_TAC [th])],
3941  KNOW_TAC ``iterate (op :'a -> 'a -> 'a)
3942  {l INTER {x | x >= (cb :real)} |
3943   l |
3944   l IN (d :(real -> bool) -> bool) /\
3945   l INTER {x | x >= cb} <> ({} :real -> bool)}
3946  (f :(real -> bool) -> 'a) =
3947             iterate (op :'a -> 'a -> 'a)
3948  {(\l. l INTER {x | x >= (cb :real)}) l |
3949   l |
3950   l IN (d :(real -> bool) -> bool) /\
3951   (\l. l INTER {x | x >= cb}) l <> ({} :real -> bool)}
3952  (f :(real -> bool) -> 'a)`` THENL
3953  [METIS_TAC [], DISCH_THEN (fn th => ONCE_REWRITE_TAC [th])]] THEN
3954  MATCH_MP_TAC ITERATE_NONZERO_IMAGE_LEMMA THEN ASM_SIMP_TAC std_ss [] THEN
3955  (CONJ_TAC THENL [ASM_MESON_TAC[OPERATIVE_EMPTY], ALL_TAC] THEN
3956  MAP_EVERY X_GEN_TAC [``l:real->bool``, ``m:real->bool``] THEN STRIP_TAC THEN
3957  MATCH_MP_TAC(MESON[OPERATIVE_TRIVIAL]
3958  ``operative op f /\ (?a b. l = interval[a,b]) /\ (content l = &0)
3959    ==> (f l = neutral op)``) THEN
3960   ASM_SIMP_TAC std_ss [] THEN CONJ_TAC THENL
3961   [ALL_TAC, METIS_TAC[DIVISION_SPLIT_LEFT_INJ,
3962                           DIVISION_SPLIT_RIGHT_INJ]] THEN
3963   SUBGOAL_THEN ``?a b:real. m = interval[a,b]`` STRIP_ASSUME_TAC THENL
3964   [METIS_TAC[division_of], ALL_TAC] THEN
3965   ASM_SIMP_TAC std_ss [INTERVAL_SPLIT] THEN MESON_TAC[])
3966QED
3967
3968Theorem lemma[local]:
3969    (\(x,l). f l) = (f o SND)
3970Proof
3971    SIMP_TAC std_ss [FUN_EQ_THM, o_THM, FORALL_PROD]
3972QED
3973
3974Theorem OPERATIVE_TAGGED_DIVISION:
3975   !op d a b f:(real->bool)->'a.
3976    monoidal op /\ operative op f /\ d tagged_division_of interval[a,b]
3977    ==> (iterate(op) d (\(x,l). f l) = f(interval[a,b]))
3978Proof
3979  REPEAT STRIP_TAC THEN MATCH_MP_TAC EQ_TRANS THEN EXISTS_TAC
3980  ``iterate op (IMAGE SND (d:(real#(real->bool)->bool))) f :'a`` THEN
3981  CONJ_TAC THENL
3982  [ALL_TAC,
3983   ASM_MESON_TAC[DIVISION_OF_TAGGED_DIVISION, OPERATIVE_DIVISION]] THEN
3984  REWRITE_TAC[lemma] THEN CONV_TAC SYM_CONV THEN
3985  KNOW_TAC ``monoidal (op:'a->'a->'a) /\ FINITE (d :real # (real -> bool) -> bool) /\
3986            (!x y.  x IN d /\ y IN d /\ ~(x = y) /\ (SND x = SND y)
3987                ==> ((f:(real -> bool) -> 'a) (SND x) = neutral op))`` THENL
3988  [ALL_TAC, METIS_TAC [RIGHT_IMP_FORALL_THM, AND_IMP_INTRO, ITERATE_IMAGE_NONZERO]] THEN
3989   ASM_SIMP_TAC std_ss [FORALL_PROD] THEN CONJ_TAC THENL
3990   [ASM_MESON_TAC[TAGGED_DIVISION_OF_FINITE], ALL_TAC] THEN
3991  FIRST_ASSUM(MP_TAC o REWRITE_RULE [TAGGED_DIVISION_OF]) THEN
3992  DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC (MP_TAC o CONJUNCT1 o CONJUNCT2)) THEN
3993  DISCH_TAC THEN X_GEN_TAC ``x1:real`` THEN X_GEN_TAC ``k:real->bool`` THEN X_GEN_TAC ``x2:real`` THEN
3994  POP_ASSUM (MP_TAC o Q.SPECL [`x1:real`,`k:real->bool`,`x2:real`, `k:real->bool`]) THEN
3995  REWRITE_TAC[PAIR_EQ] THEN DISCH_THEN(fn th => STRIP_TAC THEN MP_TAC th) THEN
3996  ASM_SIMP_TAC std_ss [INTER_ACI] THEN
3997  ASM_MESON_TAC[CONTENT_EQ_0_INTERIOR, OPERATIVE_TRIVIAL,
3998   TAGGED_DIVISION_OF]
3999QED
4000
4001(* ------------------------------------------------------------------------- *)
4002(* Additivity of content.                                                    *)
4003(* ------------------------------------------------------------------------- *)
4004
4005Theorem ADDITIVE_CONTENT_DIVISION:
4006   !d a b:real. d division_of interval[a,b]
4007    ==> (sum d content = content(interval[a,b]))
4008Proof
4009  REPEAT GEN_TAC THEN DISCH_THEN(MP_TAC o MATCH_MP
4010  (MATCH_MP (REWRITE_RULE[TAUT `a /\ b /\ c ==> d <=> a /\ b ==> c ==> d`]
4011   OPERATIVE_DIVISION) (CONJ MONOIDAL_REAL_ADD OPERATIVE_CONTENT))) THEN
4012  REWRITE_TAC[sum_def]
4013QED
4014
4015Theorem ADDITIVE_CONTENT_TAGGED_DIVISION:
4016   !d a b:real.
4017    d tagged_division_of interval[a,b]
4018    ==> (sum d (\(x,l). content l) = content(interval[a,b]))
4019Proof
4020  REPEAT GEN_TAC THEN DISCH_THEN(MP_TAC o MATCH_MP
4021  (MATCH_MP
4022  (REWRITE_RULE[TAUT `a /\ b /\ c ==> d <=> a /\ b ==> c ==> d`]
4023    OPERATIVE_TAGGED_DIVISION)
4024  (CONJ MONOIDAL_REAL_ADD OPERATIVE_CONTENT))) THEN
4025  REWRITE_TAC[sum_def]
4026QED
4027
4028Theorem SUBADDITIVE_CONTENT_DIVISION:
4029   !d s a b:real.
4030    d division_of s /\ s SUBSET interval[a,b]
4031    ==> sum d content <= content(interval[a,b])
4032Proof
4033  REPEAT STRIP_TAC THEN
4034  MP_TAC(ISPECL [``d:(real->bool)->bool``, ``a:real``, ``b:real``]
4035   PARTIAL_DIVISION_EXTEND_INTERVAL) THEN
4036  KNOW_TAC ``(d :(real -> bool) -> bool) division_of BIGUNION d /\
4037     BIGUNION d SUBSET interval [((a :real),(b :real))]`` THENL
4038  [REWRITE_TAC[BIGUNION_SUBSET] THEN
4039   ASM_MESON_TAC[division_of, DIVISION_OF_UNION_SELF, SUBSET_TRANS],
4040   DISCH_TAC THEN ASM_REWRITE_TAC [] THEN
4041   DISCH_THEN(X_CHOOSE_THEN ``p:(real->bool)->bool`` STRIP_ASSUME_TAC) THEN
4042   MATCH_MP_TAC REAL_LE_TRANS THEN
4043   EXISTS_TAC ``sum (p:(real->bool)->bool) content`` THEN CONJ_TAC THENL
4044   [MATCH_MP_TAC SUM_SUBSET_SIMPLE THEN
4045    ASM_MESON_TAC [division_of, CONTENT_POS_LE, IN_DIFF],
4046    ASM_MESON_TAC[ADDITIVE_CONTENT_DIVISION, REAL_LE_REFL]]]
4047QED
4048
4049(* ------------------------------------------------------------------------- *)
4050(* Finally, the integral of a constant!                                      *)
4051(* ------------------------------------------------------------------------- *)
4052
4053Theorem HAS_INTEGRAL_CONST:
4054   !a b:real c:real.
4055  ((\x. c) has_integral (content(interval[a,b]) * c)) (interval[a,b])
4056Proof
4057  REWRITE_TAC[has_integral] THEN REPEAT STRIP_TAC THEN
4058  EXISTS_TAC ``\x:real. ball(x,&1)`` THEN REWRITE_TAC[GAUGE_TRIVIAL] THEN
4059  REPEAT STRIP_TAC THEN
4060  FIRST_ASSUM(ASSUME_TAC o MATCH_MP TAGGED_DIVISION_OF_FINITE) THEN
4061  FIRST_X_ASSUM(fn th =>
4062   ONCE_REWRITE_TAC[GSYM(MATCH_MP ADDITIVE_CONTENT_TAGGED_DIVISION th)]) THEN
4063  KNOW_TAC ``(abs
4064      (sum (p :real # (real -> bool) -> bool)
4065         (\((x :real),(k :real -> bool)). content k * (c :real)) -
4066       sum p (\((x :real),(l :real -> bool)). content l) * c) = (0:real))`` THENL
4067  [ALL_TAC, METIS_TAC []] THEN SIMP_TAC std_ss [ABS_ZERO, REAL_SUB_0] THEN
4068  REWRITE_TAC [SET_RULE `` (\(x,k). content k) = (\(x,k). (\p. content (SND p)) (x,k))``] THEN
4069  REWRITE_TAC [SET_RULE `` (\(x,k). content k * c) =
4070               (\(x,k). (\k. content (SND k)  * c) (x,k))``] THEN
4071  REWRITE_TAC [GSYM LAMBDA_PROD] THEN SIMP_TAC std_ss [SUM_RMUL]
4072QED
4073
4074Theorem INTEGRABLE_CONST:
4075   !a b:real c:real. (\x. c) integrable_on interval[a,b]
4076Proof
4077  REPEAT STRIP_TAC THEN REWRITE_TAC[integrable_on] THEN
4078  EXISTS_TAC ``content(interval[a:real,b]) * c:real`` THEN
4079  REWRITE_TAC[HAS_INTEGRAL_CONST]
4080QED
4081
4082Theorem INTEGRAL_CONST:
4083   !a b c. integral (interval[a,b]) (\x. c) = content(interval[a,b]) * c
4084Proof
4085  REPEAT GEN_TAC THEN MATCH_MP_TAC INTEGRAL_UNIQUE THEN
4086  REWRITE_TAC[HAS_INTEGRAL_CONST]
4087QED
4088
4089(* ------------------------------------------------------------------------- *)
4090(* Bounds on the norm of Riemann sums and the integral itself.               *)
4091(* ------------------------------------------------------------------------- *)
4092
4093Theorem DSUM_BOUND:
4094   !p a b:real c:real e.
4095       p division_of interval[a,b] /\ abs (c) <= e
4096       ==> abs (sum p (\l. content l * c)) <= e * content(interval[a,b])
4097Proof
4098  REPEAT STRIP_TAC THEN
4099  FIRST_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_FINITE) THEN
4100  W(MP_TAC o PART_MATCH (lhand o rand) SUM_ABS o lhand o snd) THEN
4101  ASM_SIMP_TAC std_ss [] THEN MATCH_MP_TAC(REAL_ARITH
4102   ``y <= e ==> x <= y ==> x <= e:real``) THEN
4103  SIMP_TAC std_ss [LAMBDA_PROD, ABS_MUL] THEN
4104  MATCH_MP_TAC REAL_LE_TRANS THEN
4105  EXISTS_TAC ``sum p (\k:real->bool. content k * e)`` THEN
4106  CONJ_TAC THENL
4107   [MATCH_MP_TAC SUM_LE THEN ASM_SIMP_TAC std_ss [FORALL_PROD] THEN
4108    X_GEN_TAC ``l:real->bool`` THEN DISCH_TAC THEN
4109    MATCH_MP_TAC REAL_LE_MUL2 THEN SIMP_TAC std_ss [REAL_ABS_POS, ABS_POS] THEN
4110    ASM_REWRITE_TAC[] THEN
4111    MATCH_MP_TAC(REAL_ARITH ``&0 <= x ==> abs(x) <= x:real``) THEN
4112    ASM_MESON_TAC[DIVISION_OF, CONTENT_POS_LE],
4113    SIMP_TAC std_ss [SUM_RMUL, ETA_AX] THEN
4114    ASM_MESON_TAC[ADDITIVE_CONTENT_DIVISION, REAL_LE_REFL, REAL_MUL_SYM]]
4115QED
4116
4117Theorem RSUM_BOUND:
4118   !p a b f:real->real e.
4119       p tagged_division_of interval[a,b] /\
4120       (!x. x IN interval[a,b] ==> abs(f x) <= e)
4121       ==> abs(sum p (\(x,k). content k * f x))
4122            <= e * content(interval[a,b])
4123Proof
4124  REPEAT STRIP_TAC THEN
4125  FIRST_ASSUM(ASSUME_TAC o MATCH_MP TAGGED_DIVISION_OF_FINITE) THEN
4126  W(MP_TAC o PART_MATCH (lhand o rand) SUM_ABS o lhand o snd) THEN
4127  ASM_REWRITE_TAC[] THEN MATCH_MP_TAC(REAL_ARITH
4128   ``y <= e ==> x <= y ==> x <= e:real``) THEN
4129  SIMP_TAC std_ss [LAMBDA_PROD, ABS_MUL] THEN
4130  MATCH_MP_TAC REAL_LE_TRANS THEN
4131  EXISTS_TAC ``sum p (\(x:real,k:real->bool). content k * e)`` THEN
4132  CONJ_TAC THENL
4133   [MATCH_MP_TAC SUM_LE THEN ASM_SIMP_TAC std_ss [FORALL_PROD] THEN
4134    MAP_EVERY X_GEN_TAC [``x:real``, ``l:real->bool``] THEN DISCH_TAC THEN
4135    MATCH_MP_TAC REAL_LE_MUL2 THEN SIMP_TAC std_ss [REAL_ABS_POS, ABS_POS] THEN
4136    CONJ_TAC THENL
4137     [ASM_MESON_TAC[TAGGED_DIVISION_OF, CONTENT_POS_LE, ABS_REFL,
4138                    REAL_LE_REFL],
4139      ASM_MESON_TAC[TAG_IN_INTERVAL]],
4140    FIRST_ASSUM(fn th => REWRITE_TAC
4141     [GSYM(MATCH_MP ADDITIVE_CONTENT_TAGGED_DIVISION th)]) THEN
4142    SIMP_TAC std_ss [GSYM SUM_LMUL, LAMBDA_PROD] THEN
4143    SIMP_TAC std_ss [REAL_MUL_ASSOC, REAL_MUL_SYM, REAL_LE_REFL]]
4144QED
4145
4146Theorem RSUM_DIFF_BOUND:
4147   !e p a b f g:real->real.
4148       p tagged_division_of interval[a,b] /\
4149       (!x. x IN interval[a,b] ==> abs(f x - g x) <= e)
4150       ==> abs(sum p (\(x,k). content k * f x) -
4151               sum p (\(x,k). content k * g x))
4152           <= e * content(interval[a,b])
4153Proof
4154  REPEAT STRIP_TAC THEN
4155  UNDISCH_TAC ``p tagged_division_of interval [(a,b)]`` THEN DISCH_TAC THEN
4156  FIRST_ASSUM(ASSUME_TAC o MATCH_MP TAGGED_DIVISION_OF_FINITE) THEN
4157  MATCH_MP_TAC REAL_LE_TRANS THEN
4158  EXISTS_TAC
4159   ``abs(sum p (\(x,k).
4160      content(k:real->bool) * ((f:real->real) x - g x)))`` THEN
4161  CONJ_TAC THENL
4162   [ASM_SIMP_TAC std_ss [GSYM SUM_SUB, REAL_SUB_LDISTRIB] THEN
4163    SIMP_TAC std_ss [LAMBDA_PROD, REAL_LE_REFL],
4164    ASM_SIMP_TAC std_ss [RSUM_BOUND]]
4165QED
4166
4167Theorem lemma[local]:
4168    abs(s) <= B ==> ~(abs(s - i) < abs(i) - B:real)
4169Proof
4170  MATCH_MP_TAC (REAL_ARITH ``n1 <= n + n2 ==> n <= B:real ==> ~(n2 < n1 - B)``) THEN
4171    ONCE_REWRITE_TAC[ABS_SUB] THEN REWRITE_TAC[ABS_TRIANGLE_SUB]
4172QED
4173
4174Theorem HAS_INTEGRAL_BOUND:
4175   !f:real->real a b i B.
4176        &0 <= B /\
4177        (f has_integral i) (interval[a,b]) /\
4178        (!x. x IN interval[a,b] ==> abs(f x) <= B)
4179        ==> abs i <= B * content(interval[a,b])
4180Proof
4181  REPEAT STRIP_TAC THEN
4182  ASM_CASES_TAC ``&0 < content(interval[a:real,b])`` THENL
4183   [ALL_TAC,
4184    SUBGOAL_THEN ``i:real = 0`` SUBST1_TAC THEN
4185    ASM_SIMP_TAC std_ss [REAL_LE_MUL, ABS_0, CONTENT_POS_LE] THEN
4186    ASM_MESON_TAC[HAS_INTEGRAL_NULL_EQ, CONTENT_LT_NZ]] THEN
4187  ONCE_REWRITE_TAC[GSYM REAL_NOT_LT] THEN DISCH_TAC THEN
4188  UNDISCH_TAC ``(f has_integral i) (interval [(a,b)])`` THEN DISCH_TAC THEN
4189  FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [has_integral]) THEN
4190  DISCH_THEN(MP_TAC o SPEC
4191    ``abs(i:real) - B * content(interval[a:real,b])``) THEN
4192  ASM_REWRITE_TAC[REAL_SUB_LT] THEN
4193  DISCH_THEN(X_CHOOSE_THEN ``d:real->real->bool`` STRIP_ASSUME_TAC) THEN
4194  MP_TAC(SPECL [``d:real->real->bool``, ``a:real``, ``b:real``]
4195        FINE_DIVISION_EXISTS) THEN
4196  ASM_REWRITE_TAC[] THEN DISCH_THEN
4197   (X_CHOOSE_THEN ``p:(real#(real->bool)->bool)`` STRIP_ASSUME_TAC) THEN
4198  FIRST_X_ASSUM(MP_TAC o SPEC ``p:(real#(real->bool)->bool)``) THEN
4199  METIS_TAC[lemma, RSUM_BOUND]
4200QED
4201
4202(* ------------------------------------------------------------------------- *)
4203(* Similar theorems about relationship among components.                     *)
4204(* ------------------------------------------------------------------------- *)
4205
4206Theorem RSUM_COMPONENT_LE:
4207   !p a b f:real->real g:real->real.
4208       p tagged_division_of interval[a,b] /\
4209       (!x. x IN interval[a,b] ==> (f x) <= (g x))
4210       ==> sum p (\(x,k). content k * f x) <=
4211           sum p (\(x,k). content k * g x)
4212Proof
4213  REPEAT STRIP_TAC THEN MATCH_MP_TAC SUM_LE THEN
4214  ASM_SIMP_TAC std_ss [FORALL_PROD] THEN
4215  FIRST_ASSUM(ASSUME_TAC o MATCH_MP TAGGED_DIVISION_OF_FINITE) THEN
4216  REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
4217  UNDISCH_TAC `` p tagged_division_of interval [(a,b)]`` THEN DISCH_TAC THEN
4218  FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [TAGGED_DIVISION_OF]) THEN
4219  ASM_REWRITE_TAC [] THEN STRIP_TAC THEN POP_ASSUM MP_TAC THEN
4220  POP_ASSUM MP_TAC THEN
4221  POP_ASSUM (MP_TAC o Q.SPECL [`p_1:real`,`p_2:real->bool`]) THEN
4222  ASM_REWRITE_TAC [SUBSET_DEF] THEN REPEAT STRIP_TAC THEN
4223  ASM_REWRITE_TAC [] THEN Cases_on `content (interval [(a',b')]) = 0` THENL
4224  [ASM_REWRITE_TAC [] THEN REAL_ARITH_TAC, ALL_TAC] THEN
4225  MP_TAC(SPECL [``a':real``, ``b':real``] CONTENT_POS_LE) THEN
4226  GEN_REWR_TAC LAND_CONV [REAL_LE_LT] THEN
4227  GEN_REWR_TAC (LAND_CONV o RAND_CONV) [EQ_SYM_EQ] THEN ASM_REWRITE_TAC [] THEN
4228  DISCH_TAC THEN ASM_SIMP_TAC std_ss [REAL_LE_LMUL]
4229QED
4230
4231Theorem HAS_INTEGRAL_COMPONENT_LE:
4232   !f:real->real g:real->real s i j.
4233        (f has_integral i) s /\ (g has_integral j) s /\
4234        (!x. x IN s ==> (f x) <= (g x))
4235        ==> i <= j
4236Proof
4237  SUBGOAL_THEN
4238   ``!f:real->real g:real->real a b i j.
4239        (f has_integral i) (interval[a,b]) /\
4240        (g has_integral j) (interval[a,b]) /\
4241        (!x. x IN interval[a,b] ==> (f x) <= (g x))
4242        ==> i <= j``
4243  ASSUME_TAC THENL
4244   [REPEAT STRIP_TAC THEN
4245    MATCH_MP_TAC(REAL_ARITH ``~(&0 < i - j) ==> i <= j:real``) THEN DISCH_TAC THEN
4246    UNDISCH_TAC ``((f :real -> real) has_integral (i :real))
4247            (interval [((a :real),(b :real))])`` THEN DISCH_TAC THEN
4248    UNDISCH_TAC ``((g :real -> real) has_integral (j :real))
4249            (interval [((a :real),(b :real))])`` THEN DISCH_TAC THEN
4250    FIRST_X_ASSUM(MP_TAC o SPEC ``((i:real) - (j:real)) / &3`` o
4251       REWRITE_RULE [has_integral]) THEN
4252    FIRST_X_ASSUM(MP_TAC o SPEC ``((i:real) - (j:real)) / &3`` o
4253       REWRITE_RULE [has_integral]) THEN
4254    ASM_SIMP_TAC arith_ss [REAL_LT_DIV, REAL_LT] THEN
4255    DISCH_THEN(X_CHOOSE_THEN ``d1:real->real->bool`` STRIP_ASSUME_TAC) THEN
4256    X_GEN_TAC ``d2:real->real->bool`` THEN CCONTR_TAC THEN FULL_SIMP_TAC std_ss [] THEN
4257    SUBGOAL_THEN ``?((p:real#(real->bool)->bool)). p tagged_division_of interval[a:real,b] /\
4258                      d1 FINE p /\ d2 FINE p``
4259    STRIP_ASSUME_TAC THENL
4260     [SIMP_TAC std_ss [GSYM FINE_INTER] THEN MATCH_MP_TAC FINE_DIVISION_EXISTS THEN
4261      ASM_SIMP_TAC std_ss [GAUGE_INTER], ALL_TAC] THEN
4262    REPEAT
4263     (FIRST_X_ASSUM(MP_TAC o SPEC ``p:real#(real->bool)->bool``) THEN
4264      ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o MATCH_MP REAL_LT_IMP_LE) THEN
4265      ASM_SIMP_TAC std_ss []) THEN
4266    SUBGOAL_THEN
4267     ``sum p (\(x,l:real->bool). content l * (f:real->real) x) <=
4268       sum p (\(x,l). content l * (g:real->real) x)``
4269    MP_TAC THENL
4270     [MATCH_MP_TAC RSUM_COMPONENT_LE THEN METIS_TAC[],
4271      UNDISCH_TAC ``&0 < (i:real) - (j:real)`` THEN
4272      SPEC_TAC(``sum p (\(x:real,l:real->bool).
4273                                content l * (f x):real)``,
4274               ``fs:real``) THEN
4275      SPEC_TAC(``sum p (\(x:real,l:real->bool).
4276                                content l * (g x):real)``,
4277               ``gs:real``) THEN
4278      SIMP_TAC std_ss [REAL_LE_RDIV_EQ, REAL_ARITH ``0 < 3:real``] THEN
4279      REAL_ARITH_TAC], ALL_TAC] THEN
4280  REPEAT GEN_TAC THEN ONCE_REWRITE_TAC[has_integral_alt] THEN
4281  COND_CASES_TAC THEN ASM_REWRITE_TAC[] THENL [ASM_MESON_TAC[], ALL_TAC] THEN
4282  STRIP_TAC THEN REWRITE_TAC[GSYM REAL_NOT_LT] THEN DISCH_TAC THEN
4283  UNDISCH_TAC ``!e. 0 < e ==> ?B. 0 < B /\
4284              !a b. ball (0,B) SUBSET interval [(a,b)] ==>
4285                ?z. ((\x. if x IN s then g x else 0) has_integral z)
4286                    (interval [(a,b)]) /\ abs (z - j) < e:real`` THEN
4287  UNDISCH_TAC ``!e. 0 < e ==> ?B. 0 < B /\
4288              !a b. ball (0,B) SUBSET interval [(a,b)] ==>
4289                ?z. ((\x. if x IN s then f x else 0) has_integral z)
4290                    (interval [(a,b)]) /\ abs (z - i) < e:real`` THEN
4291  DISCH_TAC THEN DISCH_TAC THEN
4292  UNDISCH_TAC ``!x:real. x IN s ==> f x <= (g x):real`` THEN
4293  REPEAT (FIRST_X_ASSUM(MP_TAC o SPEC ``((i:real) - (j:real)) / &2``)) THEN
4294  ASM_SIMP_TAC std_ss [REAL_HALF, REAL_SUB_LT] THEN
4295  DISCH_THEN(X_CHOOSE_THEN ``B1:real`` STRIP_ASSUME_TAC) THEN
4296  DISCH_THEN(X_CHOOSE_THEN ``B2:real`` STRIP_ASSUME_TAC) THEN
4297  CCONTR_TAC THEN FULL_SIMP_TAC std_ss [] THEN
4298  MP_TAC(ISPEC
4299   ``ball(0,B1) UNION ball(0:real,B2)``
4300   BOUNDED_SUBSET_CLOSED_INTERVAL) THEN
4301  SIMP_TAC std_ss [BOUNDED_UNION, BOUNDED_BALL, UNION_SUBSET, NOT_EXISTS_THM] THEN
4302  MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``] THEN REWRITE_TAC [GSYM DE_MORGAN_THM] THEN
4303  DISCH_THEN(CONJUNCTS_THEN(ANTE_RES_THEN MP_TAC)) THEN
4304  DISCH_THEN(X_CHOOSE_THEN ``w:real`` STRIP_ASSUME_TAC) THEN
4305  DISCH_THEN(X_CHOOSE_THEN ``z:real`` STRIP_ASSUME_TAC) THEN
4306  SUBGOAL_THEN ``(z:real) <= (w:real)`` MP_TAC THENL
4307   [FIRST_X_ASSUM MATCH_MP_TAC THEN
4308    MAP_EVERY EXISTS_TAC
4309     [``(\x. if x IN s then f x else 0):real->real``,
4310      ``(\x. if x IN s then g x else 0):real->real``,
4311      ``a:real``, ``b:real``] THEN
4312    METIS_TAC[REAL_LE_REFL],
4313    UNDISCH_TAC ``abs (z - i) < (i - j) / 2:real`` THEN
4314    UNDISCH_TAC ``abs (w - j) < (i - j) / 2:real`` THEN
4315    UNDISCH_TAC ``j < i:real`` THEN
4316    REWRITE_TAC [GSYM REAL_NOT_LE] THEN
4317    SIMP_TAC std_ss [REAL_LE_LDIV_EQ, REAL_ARITH ``0 < 2:real``] THEN
4318    REAL_ARITH_TAC]
4319QED
4320
4321Theorem INTEGRAL_COMPONENT_LE:
4322   !f:real->real g:real->real s.
4323        f integrable_on s /\ g integrable_on s /\
4324        (!x. x IN s ==> (f x) <= (g x))
4325        ==> (integral s f) <= (integral s g)
4326Proof
4327  REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_INTEGRAL_COMPONENT_LE THEN
4328  ASM_MESON_TAC[INTEGRABLE_INTEGRAL]
4329QED
4330
4331Theorem HAS_INTEGRAL_DROP_LE:
4332   !f:real->real g:real->real s i j.
4333        (f has_integral i) s /\ (g has_integral j) s /\
4334        (!x. x IN s ==> (f x) <= (g x))
4335        ==> i <= j
4336Proof
4337  REWRITE_TAC[HAS_INTEGRAL_COMPONENT_LE]
4338QED
4339
4340Theorem INTEGRAL_DROP_LE:
4341   !f:real->real g:real->real s.
4342        f integrable_on s /\ g integrable_on s /\
4343        (!x. x IN s ==> (f x) <= (g x))
4344        ==> (integral s f) <= (integral s g)
4345Proof
4346  REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_INTEGRAL_DROP_LE THEN
4347  ASM_MESON_TAC[INTEGRABLE_INTEGRAL]
4348QED
4349
4350Theorem HAS_INTEGRAL_COMPONENT_POS:
4351   !f:real->real s i.
4352        (f has_integral i) s /\
4353        (!x. x IN s ==> &0 <= (f x))
4354        ==> &0 <= i
4355Proof
4356  REPEAT STRIP_TAC THEN
4357  MP_TAC(ISPECL [``(\x. 0):real->real``, ``f:real->real``,
4358                 ``s:real->bool``, ``0:real``,
4359                 ``i:real``] HAS_INTEGRAL_COMPONENT_LE) THEN
4360  ASM_SIMP_TAC std_ss [HAS_INTEGRAL_0]
4361QED
4362
4363Theorem INTEGRAL_COMPONENT_POS:
4364   !f:real->real s.
4365        f integrable_on s /\
4366        (!x. x IN s ==> &0 <= (f x))
4367        ==> &0 <= (integral s f)
4368Proof
4369  REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_INTEGRAL_COMPONENT_POS THEN
4370  ASM_MESON_TAC[INTEGRABLE_INTEGRAL]
4371QED
4372
4373Theorem HAS_INTEGRAL_DROP_POS:
4374   !f:real->real s i.
4375        (f has_integral i) s /\
4376        (!x. x IN s ==> &0 <= (f x))
4377        ==> &0 <= i
4378Proof
4379  REWRITE_TAC [HAS_INTEGRAL_COMPONENT_POS]
4380QED
4381
4382Theorem INTEGRAL_DROP_POS:
4383   !f:real->real s.
4384        f integrable_on s /\
4385        (!x. x IN s ==> &0 <= (f x))
4386        ==> &0 <= (integral s f)
4387Proof
4388  REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_INTEGRAL_DROP_POS THEN
4389  ASM_MESON_TAC[INTEGRABLE_INTEGRAL]
4390QED
4391
4392Theorem HAS_INTEGRAL_COMPONENT_NEG:
4393   !f:real->real s i.
4394        (f has_integral i) s /\
4395        (!x. x IN s ==> (f x) <= &0)
4396        ==> i <= &0
4397Proof
4398  REPEAT STRIP_TAC THEN
4399  MP_TAC(ISPECL [``f:real->real``, ``(\x. 0):real->real``,
4400                 ``s:real->bool``, ``i:real``, ``0:real``]
4401                 HAS_INTEGRAL_COMPONENT_LE) THEN
4402  ASM_SIMP_TAC std_ss [HAS_INTEGRAL_0]
4403QED
4404
4405Theorem HAS_INTEGRAL_DROP_NEG:
4406   !f:real->real s i.
4407        (f has_integral i) s /\
4408        (!x. x IN s ==> (f x) <= &0)
4409        ==> i <= &0
4410Proof
4411  REWRITE_TAC [HAS_INTEGRAL_COMPONENT_NEG]
4412QED
4413
4414Theorem HAS_INTEGRAL_COMPONENT_LBOUND:
4415   !f:real->real a b i.
4416        (f has_integral i) (interval[a,b]) /\
4417        (!x. x IN interval[a,b] ==> B <= f(x))
4418        ==> B * content(interval[a,b]) <= i
4419Proof
4420  REPEAT STRIP_TAC THEN
4421  MP_TAC(ISPECL [``(\x. @f. f = B):real->real``, ``f:real->real``,
4422                 ``interval[a:real,b]``,
4423                 ``content(interval[a:real,b]) * (@f. f = B):real``,
4424                 ``i:real``] HAS_INTEGRAL_COMPONENT_LE) THEN
4425  ASM_SIMP_TAC std_ss [HAS_INTEGRAL_CONST] THEN
4426  SIMP_TAC std_ss [REAL_MUL_ASSOC, REAL_MUL_SYM]
4427QED
4428
4429Theorem HAS_INTEGRAL_COMPONENT_UBOUND:
4430   !f:real->real a b i.
4431        (f has_integral i) (interval[a,b]) /\
4432        (!x. x IN interval[a,b] ==> f(x) <= B)
4433        ==> i <= B * content(interval[a,b])
4434Proof
4435  REPEAT STRIP_TAC THEN
4436  MP_TAC(ISPECL [``f:real->real``, ``(\x. @f. f = B):real->real``,
4437                 ``interval[a:real,b]``, ``i:real``,
4438                 ``content(interval[a:real,b]) * (@f. f = B):real``]
4439                HAS_INTEGRAL_COMPONENT_LE) THEN
4440  ASM_SIMP_TAC std_ss [HAS_INTEGRAL_CONST] THEN
4441  SIMP_TAC std_ss [REAL_MUL_ASSOC, REAL_MUL_SYM]
4442QED
4443
4444Theorem INTEGRAL_COMPONENT_LBOUND:
4445   !f:real->real a b.
4446        f integrable_on interval[a,b] /\
4447        (!x. x IN interval[a,b] ==> B <= f(x))
4448        ==> B * content(interval[a,b]) <= (integral(interval[a,b]) f)
4449Proof
4450  REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_INTEGRAL_COMPONENT_LBOUND THEN
4451  EXISTS_TAC ``f:real->real`` THEN
4452  ASM_REWRITE_TAC[GSYM HAS_INTEGRAL_INTEGRAL]
4453QED
4454
4455Theorem INTEGRAL_COMPONENT_UBOUND:
4456   !f:real->real a b.
4457        f integrable_on interval[a,b] /\
4458        (!x. x IN interval[a,b] ==> f(x) <= B)
4459        ==> (integral(interval[a,b]) f) <= B * content(interval[a,b])
4460Proof
4461  REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_INTEGRAL_COMPONENT_UBOUND THEN
4462  EXISTS_TAC ``f:real->real`` THEN
4463  ASM_REWRITE_TAC[GSYM HAS_INTEGRAL_INTEGRAL]
4464QED
4465
4466(* ------------------------------------------------------------------------- *)
4467(* Uniform limit of integrable functions is integrable.                      *)
4468(* ------------------------------------------------------------------------- *)
4469
4470Theorem lemma[local]:
4471    x:real <= abs(a + b) + c ==> x <= abs(a) + abs(b) + c
4472Proof
4473    MESON_TAC[REAL_ADD_ASSOC, REAL_ADD_SYM, ABS_TRIANGLE, REAL_LE_TRANS, REAL_LE_RADD]
4474QED
4475
4476Theorem lemma12[local]:
4477   (abs(s2 - s1) <= e / &2:real /\
4478    abs(s1 - i1) < e / &4:real /\ abs(s2 - i2) < e / &4:real
4479    ==> abs(i1 - i2) < e) /\
4480   (abs(sf - sg) <= e / &3:real
4481    ==> abs(i - s) < e / &3:real ==> abs(sg - i) < e / &3:real ==> abs(sf - s) < e)
4482Proof
4483    CONJ_TAC THENL
4484     [REWRITE_TAC[CONJ_ASSOC] THEN
4485      GEN_REWR_TAC (LAND_CONV o LAND_CONV o ONCE_DEPTH_CONV) [ABS_SUB] THEN
4486      SIMP_TAC std_ss [REAL_LT_RDIV_EQ, REAL_LE_RDIV_EQ,
4487       REAL_ARITH ``0 < 2:real``, REAL_ARITH ``0 < 4:real``] THEN
4488      REAL_ARITH_TAC,
4489      SIMP_TAC std_ss [REAL_LT_RDIV_EQ, REAL_LE_RDIV_EQ,
4490       REAL_ARITH ``0 < 3:real``] THEN REAL_ARITH_TAC]
4491QED
4492
4493Theorem lemma1[local]:
4494   (abs(s2 - s1) <= e / &2:real /\
4495    abs(s1 - i1) < e / &4:real /\ abs(s2 - i2) < e / &4:real
4496    ==> abs(i1 - i2) < e)
4497Proof
4498 REWRITE_TAC [lemma12]
4499QED
4500
4501Theorem lemma2[local]:
4502    (abs(sf - sg) <= e / &3:real
4503    ==> abs(i - s) < e / &3:real ==> abs(sg - i) < e / &3:real ==> abs(sf - s) < e)
4504Proof
4505  REWRITE_TAC [lemma12]
4506QED
4507
4508Theorem INTEGRABLE_UNIFORM_LIMIT:
4509   !f a b. (!e. &0 < e
4510                ==> ?g. (!x. x IN interval[a,b] ==> abs(f x - g x) <= e) /\
4511                        g integrable_on interval[a,b] )
4512           ==> (f:real->real) integrable_on interval[a,b]
4513Proof
4514  REPEAT STRIP_TAC THEN
4515  ASM_CASES_TAC ``&0 < content(interval[a:real,b])`` THENL
4516   [ALL_TAC,
4517    ASM_MESON_TAC[HAS_INTEGRAL_NULL, CONTENT_LT_NZ, integrable_on]] THEN
4518  FIRST_X_ASSUM(MP_TAC o GEN ``n:num`` o SPEC ``inv(&n + &1:real)``) THEN
4519  SIMP_TAC std_ss [REAL_LT_INV_EQ, METIS
4520   [ADD1, LESS_0, REAL_OF_NUM_ADD, REAL_LT] ``&0 < &n + &1:real``] THEN
4521  SIMP_TAC std_ss [FORALL_AND_THM, SKOLEM_THM, integrable_on] THEN
4522  DISCH_THEN(X_CHOOSE_THEN ``g:num->real->real`` (CONJUNCTS_THEN2
4523   ASSUME_TAC (X_CHOOSE_TAC ``i:num->real``))) THEN
4524  SUBGOAL_THEN ``cauchy(i:num->real)`` MP_TAC THENL
4525   [REWRITE_TAC[cauchy] THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
4526    MP_TAC(SPEC ``e / &4 / content(interval[a:real,b])``
4527        REAL_ARCH_INV) THEN
4528    ASM_SIMP_TAC arith_ss [REAL_LT_DIV, REAL_LT] THEN
4529    DISCH_THEN (X_CHOOSE_TAC ``N:num``) THEN
4530    EXISTS_TAC ``N:num`` THEN POP_ASSUM MP_TAC THEN STRIP_TAC THEN
4531    MAP_EVERY X_GEN_TAC [``m:num``, ``n:num``] THEN REWRITE_TAC[GE] THEN
4532    STRIP_TAC THEN
4533    UNDISCH_TAC ``!n:num. (g n has_integral i n) (interval [(a,b)])`` THEN
4534    DISCH_TAC THEN FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [has_integral]) THEN
4535    KNOW_TAC ``(!(e :real)(n :num).
4536       (0 :real) < e ==>
4537       ?(d :real -> real -> bool).
4538         (gauge d :bool) /\
4539         !(p :real # (real -> bool) -> bool).
4540           p tagged_division_of interval [((a :real),(b :real))] /\
4541           d FINE p ==>
4542           abs
4543             (sum p
4544                (\((x :real),(k :real -> bool)).
4545                   content k * (g :num -> real -> real) n x) -
4546              (i :num -> real) n) < e) ==>
4547    (dist (i (m :num),i (n :num)) :real) < (e :real)`` THENL
4548    [ALL_TAC, METIS_TAC [SWAP_FORALL_THM]] THEN
4549    DISCH_THEN(MP_TAC o SPEC ``e / &4:real``) THEN
4550    ASM_SIMP_TAC arith_ss [REAL_LT_DIV, REAL_LT] THEN
4551    DISCH_THEN(fn th => MP_TAC(SPEC ``m:num`` th) THEN
4552      MP_TAC(SPEC ``n:num`` th)) THEN
4553    DISCH_THEN(X_CHOOSE_THEN ``gn:real->real->bool`` STRIP_ASSUME_TAC) THEN
4554    DISCH_THEN(X_CHOOSE_THEN ``gm:real->real->bool`` STRIP_ASSUME_TAC) THEN
4555    MP_TAC(ISPECL [``(\x. gm(x) INTER gn(x)):real->real->bool``,
4556                   ``a:real``, ``b:real``] FINE_DIVISION_EXISTS) THEN
4557    ASM_SIMP_TAC std_ss [GAUGE_INTER, LEFT_IMP_EXISTS_THM] THEN
4558    X_GEN_TAC ``p:(real#(real->bool))->bool`` THEN STRIP_TAC THEN
4559    REPEAT(FIRST_X_ASSUM(MP_TAC o SPEC ``p:(real#(real->bool))->bool``)) THEN
4560    FIRST_ASSUM(fn th => REWRITE_TAC[CONV_RULE(REWR_CONV FINE_INTER) th]) THEN
4561    SUBGOAL_THEN ``abs(sum p (\(x,k:real->bool). content k * g (n:num) x) -
4562                       sum p (\(x:real,k). content k * g m x :real))
4563                  <= e / &2:real`` MP_TAC THENL
4564    [ALL_TAC, ASM_REWRITE_TAC[dist] THEN MESON_TAC[lemma1]] THEN
4565    MATCH_MP_TAC REAL_LE_TRANS THEN
4566    EXISTS_TAC ``&2 / &N * content(interval[a:real,b])`` THEN CONJ_TAC THENL
4567     [MATCH_MP_TAC RSUM_DIFF_BOUND,
4568      ASM_SIMP_TAC std_ss [GSYM REAL_LE_RDIV_EQ] THEN
4569      KNOW_TAC ``0 < &N:real`` THENL
4570          [METIS_TAC [REAL_LT, ZERO_LESS_EQ, LESS_OR_EQ], DISCH_TAC] THEN
4571      GEN_REWR_TAC RAND_CONV [GSYM REAL_HALF] THEN
4572      REWRITE_TAC [real_div] THEN
4573          REWRITE_TAC [REAL_ARITH ``a * b * c * d = a * (b * d) * c:real``] THEN
4574      SIMP_TAC std_ss [GSYM REAL_INV_MUL, REAL_ARITH ``0 <> 2:real``] THEN
4575      REWRITE_TAC [REAL_ARITH ``2 * 2 = 4:real``] THEN REWRITE_TAC [GSYM real_div] THEN
4576      MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC ``inv (&N) + inv (&N:real)`` THEN
4577      CONJ_TAC THENL [SIMP_TAC std_ss [REAL_DOUBLE, GSYM real_div, REAL_LE_REFL],
4578      MATCH_MP_TAC REAL_LE_ADD2 THEN ASM_REWRITE_TAC [REAL_LE_LT]]] THEN
4579    ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN
4580    FIRST_X_ASSUM(fn th => MP_TAC(SPECL [``n:num``, ``x:real``] th) THEN
4581      MP_TAC(SPECL [``m:num``, ``x:real``] th)) THEN
4582    ASM_REWRITE_TAC[AND_IMP_INTRO] THEN
4583    GEN_REWR_TAC (LAND_CONV o RAND_CONV o LAND_CONV) [ABS_SUB] THEN
4584    DISCH_THEN(MP_TAC o MATCH_MP REAL_LE_ADD2) THEN
4585    DISCH_THEN(MP_TAC o MATCH_MP ABS_TRIANGLE_LE) THEN
4586    KNOW_TAC ``!u v a b x. (u = v) /\ a <= inv(x) /\ b <= inv(x) ==>
4587                                u <= a + b ==> v <= &2 / x:real`` THENL
4588    [REPEAT GEN_TAC THEN STRIP_TAC THEN DISCH_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN
4589     EXISTS_TAC ``a' + b':real`` THEN UNDISCH_TAC ``u = v:real`` THEN
4590     GEN_REWR_TAC LAND_CONV [EQ_SYM_EQ] THEN DISCH_TAC THEN
4591     ASM_SIMP_TAC std_ss [EQ_SYM_EQ, real_div, GSYM REAL_DOUBLE] THEN
4592     MATCH_MP_TAC REAL_LE_ADD2 THEN ASM_SIMP_TAC std_ss [],
4593     DISCH_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC] THEN
4594    CONJ_TAC THENL [AP_TERM_TAC THEN REAL_ARITH_TAC, ALL_TAC] THEN
4595    CONJ_TAC THEN MATCH_MP_TAC REAL_LE_INV2 THEN
4596    ASM_SIMP_TAC arith_ss [REAL_OF_NUM_ADD, REAL_OF_NUM_LE, REAL_LT],
4597    ALL_TAC] THEN
4598  REWRITE_TAC[GSYM CONVERGENT_EQ_CAUCHY] THEN
4599  DISCH_THEN (X_CHOOSE_TAC ``s:real``) THEN EXISTS_TAC ``s:real`` THEN
4600  REWRITE_TAC[has_integral] THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
4601  FIRST_X_ASSUM(MP_TAC o SPEC ``e / &3:real`` o REWRITE_RULE [LIM_SEQUENTIALLY]) THEN
4602  ASM_SIMP_TAC arith_ss [dist, REAL_LT_DIV, REAL_LT] THEN
4603  DISCH_THEN(X_CHOOSE_TAC ``N1:num``) THEN
4604  MP_TAC(SPEC ``e / &3 / content(interval[a:real,b])`` REAL_ARCH_INV) THEN
4605  ASM_SIMP_TAC arith_ss [REAL_LT_DIV, REAL_LT] THEN
4606  DISCH_THEN(X_CHOOSE_THEN ``N2:num`` STRIP_ASSUME_TAC) THEN
4607  UNDISCH_TAC ``!n:num. (g n has_integral i n) (interval [(a,b)])`` THEN
4608  DISCH_TAC THEN FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [has_integral]) THEN
4609  DISCH_THEN(MP_TAC o SPECL [``N1 + N2:num``, ``e / &3:real``]) THEN
4610  ASM_SIMP_TAC arith_ss [REAL_LT_DIV, REAL_LT] THEN
4611  DISCH_THEN (X_CHOOSE_TAC ``g:real->real->bool``) THEN
4612  EXISTS_TAC ``g:real->real->bool`` THEN POP_ASSUM MP_TAC THEN
4613  STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
4614  X_GEN_TAC ``p:real#(real->bool)->bool`` THEN STRIP_TAC THEN
4615  FIRST_X_ASSUM(MP_TAC o SPEC ``p:real#(real->bool)->bool``) THEN
4616  ASM_REWRITE_TAC[] THEN
4617  FIRST_X_ASSUM(MP_TAC o C MATCH_MP (ARITH_PROVE ``N1:num <= N1 + N2``)) THEN
4618  MATCH_MP_TAC lemma2 THEN MATCH_MP_TAC REAL_LE_TRANS THEN
4619  EXISTS_TAC ``inv(&(N1 + N2) + &1) * content(interval[a:real,b])`` THEN
4620  CONJ_TAC THENL
4621   [MATCH_MP_TAC RSUM_DIFF_BOUND THEN ASM_REWRITE_TAC[], ALL_TAC] THEN
4622  ASM_SIMP_TAC std_ss [GSYM REAL_LE_RDIV_EQ] THEN
4623  FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
4624   ``x < a ==> y <= x ==> y <= a:real``)) THEN
4625  MATCH_MP_TAC REAL_LE_INV2 THEN
4626  ASM_SIMP_TAC arith_ss [REAL_OF_NUM_ADD, REAL_OF_NUM_LE, REAL_LT]
4627QED
4628
4629(* ------------------------------------------------------------------------- *)
4630(* Negligible sets.                                                          *)
4631(* ------------------------------------------------------------------------- *)
4632
4633Definition negligible[nocompute]:
4634 negligible s <=> !a b. (indicator s has_integral (0)) (interval[a,b])
4635End
4636
4637(* ------------------------------------------------------------------------- *)
4638(* Negligibility of hyperplane.                                              *)
4639(* ------------------------------------------------------------------------- *)
4640
4641Theorem SUM_NONZERO_IMAGE_LEMMA:
4642   !s f:'a->'b g:'b->real a.
4643        FINITE s /\ (g(a) = 0) /\
4644        (!x y. x IN s /\ y IN s /\ (f x = f y) /\ ~(x = y) ==> (g(f x) = 0))
4645       ==> (sum {f x | x | x IN s /\ ~(f x = a)} g =
4646            sum s (g o f))
4647Proof
4648  REPEAT STRIP_TAC THEN
4649  SUBGOAL_THEN ``FINITE {(f:'a->'b) x |x| x IN s /\ ~(f x = a)}``
4650  ASSUME_TAC THENL
4651   [MATCH_MP_TAC FINITE_SUBSET THEN EXISTS_TAC ``IMAGE (f:'a->'b) s`` THEN
4652    ASM_SIMP_TAC std_ss [IMAGE_FINITE, SUBSET_DEF, IN_IMAGE, GSPECIFICATION] THEN MESON_TAC[],
4653    ASM_SIMP_TAC std_ss [sum_def] THEN MATCH_MP_TAC ITERATE_NONZERO_IMAGE_LEMMA THEN
4654    ASM_REWRITE_TAC[NEUTRAL_REAL_ADD, MONOIDAL_REAL_ADD]]
4655QED
4656
4657Theorem INTERVAL_DOUBLESPLIT :
4658    !e a b c. interval[a,b] INTER {x:real | abs(x - c) <= e} =
4659              interval[(max (a) (c - e)), (min (b) (c + e))]
4660Proof
4661   REWRITE_TAC[REAL_ARITH ``abs(x - c) <= e <=> x >= c - e /\ x <= c + e:real``] THEN
4662   ONCE_REWRITE_TAC [METIS [] ``x >= c - e <=> (\x. x >= c - e:real) x``] THEN
4663   ONCE_REWRITE_TAC [METIS [] ``x <= c + e <=> (\x. x <= c + e:real) x``] THEN
4664   REWRITE_TAC[SET_RULE ``s INTER {x | P x /\ Q x} =
4665                         (s INTER {x | Q x}) INTER {x | P x}``] THEN
4666   SIMP_TAC std_ss [INTERVAL_SPLIT]
4667QED
4668
4669Theorem DIVISION_DOUBLESPLIT:
4670   !p a b:real c e.
4671        p division_of interval[a,b]
4672        ==> {l INTER {x | abs(x - c) <= e} |l|
4673                l IN p /\ ~(l INTER {x | abs(x - c) <= e} = {})}
4674            division_of (interval[a,b] INTER {x | abs(x - c) <= e})
4675Proof
4676  REPEAT GEN_TAC THEN DISCH_TAC THEN
4677  FIRST_ASSUM(MP_TAC o SPEC ``c + e:real`` o MATCH_MP DIVISION_SPLIT) THEN
4678  DISCH_THEN(MP_TAC o CONJUNCT1) THEN
4679  ASM_SIMP_TAC std_ss [INTERVAL_SPLIT] THEN
4680  FIRST_ASSUM MP_TAC THEN REWRITE_TAC[AND_IMP_INTRO] THEN
4681  DISCH_THEN(MP_TAC o MATCH_MP (TAUT
4682   `(a) /\ d ==> d`)) THEN
4683  DISCH_THEN(MP_TAC o CONJUNCT2 o SPEC ``c - e:real`` o
4684    MATCH_MP DIVISION_SPLIT) THEN
4685  ASM_SIMP_TAC std_ss [INTERVAL_DOUBLESPLIT, INTERVAL_SPLIT] THEN
4686  MATCH_MP_TAC EQ_IMPLIES THEN AP_THM_TAC THEN AP_TERM_TAC THEN
4687  REWRITE_TAC[REAL_ARITH ``abs(x - c) <= e <=> x >= c - e /\ x <= c + e:real``] THEN
4688  GEN_REWR_TAC I [EXTENSION] THEN SIMP_TAC std_ss [IN_INTER, GSPECIFICATION] THEN
4689  GEN_TAC THEN ONCE_REWRITE_TAC [CONJ_SYM] THEN SIMP_TAC std_ss [GSYM LEFT_EXISTS_AND_THM] THEN
4690  ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN REWRITE_TAC[GSYM CONJ_ASSOC] THEN
4691  ONCE_REWRITE_TAC[TAUT `a /\ b /\ c /\ d <=> c /\ a /\ b /\ d`] THEN
4692  SIMP_TAC std_ss [UNWIND_THM2] THEN AP_TERM_TAC THEN ABS_TAC THEN SET_TAC[]
4693QED
4694
4695Theorem CONTENT_DOUBLESPLIT :
4696    !a b:real c e.
4697        &0 < e ==> ?d. &0 < d /\
4698                content(interval[a,b] INTER {x | abs(x - c) <= d}) < e
4699Proof
4700  REPEAT STRIP_TAC THEN
4701  ASM_CASES_TAC ``content(interval[a:real,b]) = &0`` THENL
4702   [EXISTS_TAC ``&1:real`` THEN REWRITE_TAC[REAL_LT_01] THEN
4703    MATCH_MP_TAC REAL_LET_TRANS THEN
4704    EXISTS_TAC ``content(interval[a:real,b])`` THEN
4705    CONJ_TAC THENL [FIRST_X_ASSUM(K ALL_TAC o SYM), ASM_SIMP_TAC std_ss []] THEN
4706    ASM_SIMP_TAC std_ss [INTERVAL_DOUBLESPLIT] THEN MATCH_MP_TAC CONTENT_SUBSET THEN
4707    ASM_SIMP_TAC std_ss [GSYM INTERVAL_DOUBLESPLIT] THEN SET_TAC[], ALL_TAC] THEN
4708  FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [CONTENT_EQ_0]) THEN
4709  REWRITE_TAC[REAL_NOT_LE] THEN DISCH_TAC THEN
4710  SUBGOAL_THEN ``&0 < (b:real) - (a:real)`` ASSUME_TAC THENL
4711   [ASM_REAL_ARITH_TAC, ALL_TAC] THEN
4712  ABBREV_TAC ``d = e / &3:real`` THEN
4713  EXISTS_TAC ``d:real`` THEN SUBGOAL_THEN ``&0 < d:real`` ASSUME_TAC THENL
4714   [EXPAND_TAC "d" THEN
4715    ASM_SIMP_TAC arith_ss [REAL_LT_DIV, REAL_LT],
4716    ALL_TAC] THEN
4717  ASM_SIMP_TAC std_ss [content, INTERVAL_DOUBLESPLIT] THEN
4718  COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
4719  FIRST_X_ASSUM(ASSUME_TAC o REWRITE_RULE [INTERVAL_NE_EMPTY]) THEN
4720  ASM_SIMP_TAC std_ss [INTERVAL_LOWERBOUND, INTERVAL_UPPERBOUND, REAL_LT_IMP_LE] THEN
4721  MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC ``&2 * d:real`` THEN
4722  reverse CONJ_TAC
4723  >- (MATCH_MP_TAC(REAL_ARITH ``&0 < d /\ &3 * d <= x ==> &2 * d < x:real``) THEN
4724      ASM_REWRITE_TAC[] THEN
4725      FULL_SIMP_TAC std_ss [REAL_EQ_LDIV_EQ, REAL_ARITH ``0 < 3:real``] THEN
4726      REAL_ARITH_TAC) THEN
4727  fs [min_def, max_def] THEN
4728  Cases_on `a <= c - d` >> Cases_on `b <= c + d` >> fs [] THEN
4729  REAL_ASM_ARITH_TAC
4730QED
4731
4732Theorem NEGLIGIBLE_STANDARD_HYPERPLANE:
4733   !c. negligible {x:real | x = c}
4734Proof
4735  REPEAT STRIP_TAC THEN REWRITE_TAC[negligible, has_integral] THEN
4736  REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_SUB_RZERO] THEN
4737  MP_TAC(ISPECL [``a:real``, ``b:real``,  ``c:real``, ``e:real``]
4738        CONTENT_DOUBLESPLIT) THEN
4739  ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
4740  EXISTS_TAC ``\x:real. ball(x,d)`` THEN ASM_SIMP_TAC std_ss [GAUGE_BALL] THEN
4741  ABBREV_TAC ``i = indicator {x:real | x = c}`` THEN REPEAT STRIP_TAC THEN
4742  SUBGOAL_THEN
4743   ``sum p (\(x,l). content l * i x) =
4744     sum p (\(x,l). content(l INTER {x:real | abs(x - c) <= d}) *
4745                    (i:real->real) x)`` SUBST1_TAC THENL
4746
4747   [MATCH_MP_TAC SUM_EQ THEN SIMP_TAC std_ss [FORALL_PROD] THEN
4748    MAP_EVERY X_GEN_TAC [``x:real``, ``l:real->bool``] THEN
4749    DISCH_TAC THEN EXPAND_TAC "i" THEN REWRITE_TAC[indicator] THEN
4750    SIMP_TAC std_ss [GSPECIFICATION] THEN
4751    COND_CASES_TAC THEN ASM_REWRITE_TAC[REAL_MUL_RZERO] THEN
4752    AP_THM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN
4753    UNDISCH_TAC ``(\x. ball (x,d)) FINE p`` THEN DISCH_TAC THEN
4754    FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [FINE]) THEN
4755    DISCH_THEN(MP_TAC o SPECL [``x:real``, ``l:real->bool``]) THEN
4756    ASM_REWRITE_TAC[] THEN
4757    MATCH_MP_TAC(SET_RULE ``s SUBSET t ==> l SUBSET s ==> (l = l INTER t)``) THEN
4758    SIMP_TAC std_ss [SUBSET_DEF, IN_BALL, GSPECIFICATION, dist] THEN
4759    UNDISCH_THEN ``(x:real) = c`` (SUBST1_TAC o SYM) THEN
4760    GEN_REWR_TAC (QUANT_CONV o LAND_CONV o LAND_CONV) [ABS_SUB] THEN
4761    METIS_TAC[REAL_LE_TRANS, REAL_LT_IMP_LE], ALL_TAC] THEN
4762  MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC
4763   ``abs(sum p (\(x:real,l).
4764          content(l INTER {x:real | abs(x - c) <= d}) * 1:real))`` THEN
4765  CONJ_TAC THENL
4766   [UNDISCH_TAC ``p tagged_division_of interval [(a,b)]`` THEN DISCH_TAC THEN
4767    FIRST_ASSUM(ASSUME_TAC o MATCH_MP TAGGED_DIVISION_OF_FINITE) THEN
4768    MATCH_MP_TAC(REAL_ARITH ``&0:real <= x /\ x <= y ==> abs(x) <= abs(y)``) THEN
4769    CONJ_TAC THENL [MATCH_MP_TAC SUM_POS_LE, MATCH_MP_TAC SUM_LE] THEN
4770    ASM_SIMP_TAC std_ss [FORALL_PROD] THEN
4771    MAP_EVERY X_GEN_TAC [``x:real``, ``l:real->bool``] THEN STRIP_TAC THENL
4772     [MATCH_MP_TAC REAL_LE_MUL, MATCH_MP_TAC REAL_LE_LMUL1] THEN
4773    EXPAND_TAC "i" THEN
4774    SIMP_TAC std_ss [DROP_INDICATOR_POS_LE, DROP_INDICATOR_LE_1] THEN
4775    UNDISCH_TAC ``p tagged_division_of interval [(a,b)]`` THEN DISCH_TAC THEN
4776    FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [TAGGED_DIVISION_OF]) THEN
4777    ASM_REWRITE_TAC [] THEN
4778    DISCH_THEN(MP_TAC o SPECL [``x:real``, ``l:real->bool``] o
4779        el 1 o CONJUNCTS) THEN
4780    ASM_REWRITE_TAC[] THEN
4781    STRIP_TAC THEN ASM_SIMP_TAC std_ss [INTERVAL_DOUBLESPLIT, CONTENT_POS_LE],
4782    ALL_TAC] THEN
4783  MP_TAC(ISPECL [``(\l. content (l INTER {x | abs (x - c) <= d}) * 1):
4784                  (real->bool)->real``,
4785                 ``p:real#(real->bool)->bool``,
4786                 ``interval[a:real,b]``]
4787        SUM_OVER_TAGGED_DIVISION_LEMMA) THEN
4788  ASM_REWRITE_TAC[] THEN KNOW_TAC ``(!u v.
4789        interval [(u,v)] <> {} /\ (content (interval [(u,v)]) = 0) ==>
4790        ((\l. content (l INTER {x | abs (x - c) <= d}) * 1)
4791           (interval [(u,v)]) = 0))`` THENL
4792   [MAP_EVERY X_GEN_TAC [``u:real``, ``v:real``] THEN STRIP_TAC THEN
4793    SIMP_TAC std_ss [REAL_ENTIRE] THEN DISJ1_TAC THEN
4794    MATCH_MP_TAC(REAL_ARITH ``!x. (x = &0) /\ &0 <= y /\ y <= x ==> (y = &0:real)``) THEN
4795    EXISTS_TAC ``content(interval[u:real,v])`` THEN
4796    CONJ_TAC THEN POP_ASSUM MP_TAC THEN REWRITE_TAC[] THEN
4797    DISCH_THEN(K ALL_TAC) THEN
4798    ASM_SIMP_TAC std_ss [CONTENT_POS_LE, INTERVAL_DOUBLESPLIT] THEN
4799    MATCH_MP_TAC CONTENT_SUBSET THEN
4800    ASM_SIMP_TAC std_ss [GSYM INTERVAL_DOUBLESPLIT] THEN SET_TAC[],
4801    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
4802  SIMP_TAC std_ss [] THEN DISCH_THEN SUBST1_TAC THEN
4803  MP_TAC(ISPECL
4804     [``IMAGE SND (p:real#(real->bool)->bool)``,
4805      ``\l. l INTER {x:real | abs (x - c) <= d}``,
4806      ``\l:real->bool. content l * 1 :real``,
4807      ``{}:real->bool``] SUM_NONZERO_IMAGE_LEMMA) THEN
4808    SIMP_TAC std_ss [o_DEF] THEN
4809  FIRST_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_TAGGED_DIVISION) THEN
4810  KNOW_TAC ``FINITE
4811       (IMAGE (SND :real # (real -> bool) -> real -> bool)
4812          (p :real # (real -> bool) -> bool)) /\
4813     (content ({} :real -> bool) * (1 :real) = (0 :real)) /\
4814     (!(x :real -> bool) (y :real -> bool).
4815        x IN IMAGE (SND :real # (real -> bool) -> real -> bool) p /\
4816        y IN IMAGE (SND :real # (real -> bool) -> real -> bool) p /\
4817        (x INTER {x | abs (x - (c :real)) <= (d :real)} =
4818         y INTER {x | abs (x - c) <= d}) /\ x <> y ==>
4819        (content (y INTER {x | abs (x - c) <= d}) * (1 :real) =
4820         (0 : real)))`` THENL
4821   [CONJ_TAC THENL [ASM_MESON_TAC[DIVISION_OF_FINITE], ALL_TAC] THEN
4822    REWRITE_TAC[CONTENT_EMPTY, REAL_MUL_LZERO] THEN
4823    ONCE_REWRITE_TAC[IMP_CONJ] THEN
4824    SIMP_TAC std_ss [RIGHT_FORALL_IMP_THM] THEN
4825    FIRST_ASSUM(fn th => SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION th]) THEN
4826    MAP_EVERY X_GEN_TAC [``u:real``, ``v:real``] THEN DISCH_TAC THEN
4827    X_GEN_TAC ``m:real->bool`` THEN STRIP_TAC THEN
4828    REWRITE_TAC[REAL_ENTIRE] THEN DISJ1_TAC THEN
4829    POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
4830    GEN_REWR_TAC LAND_CONV [EQ_SYM_EQ] THEN DISCH_TAC THEN DISCH_TAC THEN
4831    ASM_REWRITE_TAC [] THEN
4832    SIMP_TAC std_ss [INTERVAL_DOUBLESPLIT] THEN
4833    SIMP_TAC std_ss [CONTENT_EQ_0_INTERIOR] THEN
4834    ASM_SIMP_TAC std_ss [GSYM INTERVAL_DOUBLESPLIT] THEN
4835    UNDISCH_TAC `` IMAGE (SND :real # (real -> bool) -> real -> bool)
4836            (p :real # (real -> bool) -> bool) division_of
4837          interval [((a :real),(b :real))]`` THEN DISCH_TAC THEN
4838    FIRST_ASSUM(MP_TAC o REWRITE_RULE [division_of]) THEN
4839    DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
4840    DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
4841    DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
4842    DISCH_THEN (MP_TAC o SPECL [``interval[u:real,v]``, ``m:real->bool``]) THEN
4843    ASM_REWRITE_TAC[] THEN
4844    UNDISCH_TAC `` (m :real -> bool) INTER {x | abs (x - (c :real)) <= (d :real)} =
4845          interval [((u :real),(v :real))] INTER {x | abs (x - c) <= d}`` THEN
4846    GEN_REWR_TAC LAND_CONV [EQ_SYM_EQ] THEN DISCH_TAC THEN ASM_REWRITE_TAC [] THEN
4847    MATCH_MP_TAC(SET_RULE
4848      ``u SUBSET s /\ u SUBSET t ==> (s INTER t = {}) ==> (u = {})``) THEN
4849    CONJ_TAC THEN MATCH_MP_TAC SUBSET_INTERIOR THEN ASM_SET_TAC[],
4850    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
4851  SIMP_TAC std_ss [o_DEF] THEN DISCH_THEN(SUBST1_TAC o SYM) THEN
4852  MATCH_MP_TAC REAL_LET_TRANS THEN
4853  EXISTS_TAC
4854   ``&1 * content(interval[a,b] INTER {x:real | abs (x - c) <= d})`` THEN
4855  CONJ_TAC THENL [ALL_TAC, ASM_REWRITE_TAC[REAL_MUL_LID]] THEN
4856  FIRST_ASSUM(MP_TAC o MATCH_MP(REWRITE_RULE[IMP_CONJ]
4857    DIVISION_DOUBLESPLIT)) THEN
4858  DISCH_THEN(MP_TAC o SPECL [``c:real``, ``d:real``]) THEN
4859  ASM_SIMP_TAC std_ss [INTERVAL_DOUBLESPLIT] THEN DISCH_TAC THEN
4860  MATCH_MP_TAC DSUM_BOUND THEN
4861  ASM_SIMP_TAC std_ss [LESS_EQ_REFL] THEN
4862  REAL_ARITH_TAC
4863QED
4864
4865(* ------------------------------------------------------------------------- *)
4866(* A technical lemma about "refinement" of division.                         *)
4867(* ------------------------------------------------------------------------- *)
4868
4869Theorem lemma1[local]:
4870    {k | ?x. (x,k) IN p} = IMAGE SND p
4871Proof
4872  SIMP_TAC std_ss [EXTENSION, EXISTS_PROD, IN_IMAGE, GSPECIFICATION] THEN
4873    METIS_TAC[]
4874QED
4875
4876Theorem TAGGED_DIVISION_FINER:
4877   !p a b:real d. p tagged_division_of interval[a,b] /\ gauge d
4878             ==> ?q. q tagged_division_of interval[a,b] /\ d FINE q /\
4879                     !x k. (x,k) IN p /\ k SUBSET d(x) ==> (x,k) IN q
4880Proof
4881  SUBGOAL_THEN
4882   ``!a b:real d p.
4883       FINITE p
4884       ==> p tagged_partial_division_of interval[a,b] /\ gauge d
4885           ==> ?q. q tagged_division_of (BIGUNION {k | ?x. (x,k) IN p}) /\
4886                   d FINE q /\
4887                   !x k. (x,k) IN p /\ k SUBSET d(x) ==> (x,k) IN q``
4888  ASSUME_TAC THENL
4889   [ALL_TAC,
4890    REPEAT GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
4891    GEN_REWR_TAC LAND_CONV [tagged_division_of] THEN
4892    DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC (SUBST1_TAC o SYM)) THEN
4893    FIRST_ASSUM(MATCH_MP_TAC o REWRITE_RULE [AND_IMP_INTRO]) THEN
4894    ASM_MESON_TAC[tagged_partial_division_of]] THEN
4895  GEN_TAC THEN GEN_TAC THEN GEN_TAC THEN
4896  ONCE_REWRITE_TAC [ METIS []
4897          ``!p. (p tagged_partial_division_of interval [(a,b)] /\ gauge d ==>
4898      ?q. q tagged_division_of BIGUNION {k | ?x. (x,k) IN p} /\ d FINE q /\
4899        !x k. (x,k) IN p /\ k SUBSET d x ==> (x,k) IN q) =
4900           (\p. ( p tagged_partial_division_of interval [(a,b)] /\ gauge d ==>
4901      ?q. q tagged_division_of BIGUNION {k | ?x. (x,k) IN p} /\ d FINE q /\
4902        !x k. (x,k) IN p /\ k SUBSET d x ==> (x,k) IN q)) p ``] THEN
4903  MATCH_MP_TAC FINITE_INDUCT THEN BETA_TAC THEN CONJ_TAC THENL
4904   [DISCH_THEN(K ALL_TAC) THEN
4905    REWRITE_TAC[SET_RULE ``BIGUNION {k | ?x. (x,k) IN {}} = {}``] THEN
4906    EXISTS_TAC ``{}:real#(real->bool)->bool`` THEN
4907    REWRITE_TAC[FINE, NOT_IN_EMPTY, TAGGED_DIVISION_OF_EMPTY],
4908    ALL_TAC] THEN
4909  SIMP_TAC std_ss [RIGHT_IMP_FORALL_THM] THEN
4910  SIMP_TAC std_ss [FORALL_PROD] THEN MAP_EVERY X_GEN_TAC
4911   [``p:real#(real->bool)->bool``, ``x:real``, ``k:real->bool``] THEN
4912  DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
4913  DISCH_THEN(fn th => STRIP_TAC THEN MP_TAC th) THEN
4914  DISCH_THEN(fn th => STRIP_TAC THEN MP_TAC th) THEN
4915  KNOW_TAC ``p tagged_partial_division_of interval [(a,b)] /\ gauge d`` THENL
4916   [ASM_REWRITE_TAC[] THEN MATCH_MP_TAC TAGGED_PARTIAL_DIVISION_SUBSET THEN
4917    EXISTS_TAC ``(x:real,k:real->bool) INSERT p`` THEN ASM_SET_TAC[],
4918    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
4919  DISCH_THEN(X_CHOOSE_THEN ``q1:real#(real->bool)->bool``
4920    STRIP_ASSUME_TAC) THEN
4921  SUBGOAL_THEN
4922   ``BIGUNION {l:real->bool | ?y:real. (y,l) IN (x,k) INSERT p} =
4923    k UNION BIGUNION {l | ?y. (y,l) IN p}``
4924  SUBST1_TAC THENL
4925   [GEN_REWR_TAC I [EXTENSION] THEN REWRITE_TAC[IN_UNION, IN_BIGUNION] THEN
4926    SIMP_TAC std_ss [GSPECIFICATION, IN_INSERT, PAIR_EQ] THEN MESON_TAC[],
4927    ALL_TAC] THEN
4928  SUBGOAL_THEN ``?u v:real. k = interval[u,v]`` MP_TAC THENL
4929   [ASM_MESON_TAC[IN_INSERT, tagged_partial_division_of], ALL_TAC] THEN
4930  DISCH_THEN(REPEAT_TCL CHOOSE_THEN SUBST_ALL_TAC) THEN
4931  ASM_CASES_TAC ``interval[u,v] SUBSET ((d:real->real->bool) x)`` THENL
4932   [EXISTS_TAC ``{(x:real,interval[u:real,v])} UNION q1`` THEN CONJ_TAC THENL
4933     [MATCH_MP_TAC TAGGED_DIVISION_UNION THEN ASM_SIMP_TAC std_ss [] THEN
4934      CONJ_TAC THENL
4935       [MATCH_MP_TAC TAGGED_DIVISION_OF_SELF THEN
4936        UNDISCH_TAC `` (x,interval [(u,v)]) INSERT p tagged_partial_division_of
4937          interval [(a,b)]`` THEN DISCH_TAC THEN
4938        FIRST_X_ASSUM(MP_TAC o REWRITE_RULE
4939         [tagged_partial_division_of]) THEN
4940        SIMP_TAC std_ss [IN_INSERT, PAIR_EQ] THEN METIS_TAC[],
4941        ALL_TAC],
4942      CONJ_TAC THENL
4943       [MATCH_MP_TAC FINE_UNION THEN ASM_REWRITE_TAC[] THEN
4944        SIMP_TAC std_ss [FINE, IN_SING, PAIR_EQ] THEN METIS_TAC[],
4945        ALL_TAC] THEN
4946      ASM_SIMP_TAC std_ss [IN_INSERT, PAIR_EQ, IN_UNION, IN_SING] THEN
4947      METIS_TAC[]],
4948    FIRST_ASSUM(MP_TAC o SPECL [``u:real``, ``v:real``] o MATCH_MP
4949      FINE_DIVISION_EXISTS) THEN
4950    DISCH_THEN(X_CHOOSE_THEN ``q2:real#(real->bool)->bool``
4951      STRIP_ASSUME_TAC) THEN
4952    EXISTS_TAC ``q2 UNION q1:real#(real->bool)->bool`` THEN CONJ_TAC THENL
4953     [MATCH_MP_TAC TAGGED_DIVISION_UNION THEN ASM_REWRITE_TAC[],
4954      ASM_SIMP_TAC std_ss [FINE_UNION] THEN
4955      ASM_SIMP_TAC std_ss [IN_INSERT, PAIR_EQ, IN_UNION, IN_SING] THEN
4956      METIS_TAC[]]] THEN
4957  (MATCH_MP_TAC INTER_INTERIOR_BIGUNION_INTERVALS THEN
4958   SIMP_TAC std_ss [lemma1, GSPECIFICATION, LEFT_IMP_EXISTS_THM] THEN
4959   UNDISCH_TAC ``(x,interval [(u,v)]) INSERT p tagged_partial_division_of
4960          interval [(a,b)]`` THEN DISCH_TAC THEN
4961   FIRST_X_ASSUM(MP_TAC o REWRITE_RULE
4962      [tagged_partial_division_of]) THEN
4963   SIMP_TAC std_ss [IN_INSERT, FINITE_INSERT, PAIR_EQ] THEN
4964   STRIP_TAC THEN ASM_SIMP_TAC std_ss [IMAGE_FINITE] THEN CONJ_TAC THENL
4965    [SIMP_TAC std_ss [INTERIOR_CLOSED_INTERVAL, OPEN_INTERVAL], ALL_TAC] THEN
4966   CONJ_TAC THENL [ASM_MESON_TAC[], ALL_TAC] THEN
4967   REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
4968   ASM_MESON_TAC[])
4969QED
4970
4971(* ------------------------------------------------------------------------- *)
4972(* Hence the main theorem about negligible sets.                             *)
4973(* ------------------------------------------------------------------------- *)
4974
4975Theorem lemma[local]:
4976     !f:'b->real g:'a#'b->real s t.
4977          FINITE s /\ FINITE t /\
4978          (!x y. (x,y) IN t ==> &0 <= g(x,y)) /\
4979          (!y. y IN s ==> ?x. (x,y) IN t /\ f(y) <= g(x,y))
4980          ==> sum s f <= sum t g
4981Proof
4982    REPEAT STRIP_TAC THEN MATCH_MP_TAC SUM_LE_INCLUDED THEN
4983    EXISTS_TAC ``SND:'a#'b->'b`` THEN
4984    SIMP_TAC std_ss [EXISTS_PROD, FORALL_PROD] THEN
4985    ASM_MESON_TAC[]
4986QED
4987
4988Theorem HAS_INTEGRAL_NEGLIGIBLE:
4989   !f:real->real s t.
4990        negligible s /\ (!x. x IN (t DIFF s) ==> (f x = 0))
4991        ==> (f has_integral (0)) t
4992Proof
4993  SUBGOAL_THEN
4994   ``!f:real->real s a b.
4995        negligible s /\ (!x. ~(x IN s) ==> (f x = 0))
4996        ==> (f has_integral (0)) (interval[a,b])``
4997  ASSUME_TAC THENL
4998   [ALL_TAC,
4999    REWRITE_TAC[IN_DIFF] THEN REPEAT STRIP_TAC THEN
5000    ONCE_REWRITE_TAC[has_integral_alt] THEN COND_CASES_TAC THENL
5001     [MATCH_MP_TAC HAS_INTEGRAL_EQ THEN
5002      EXISTS_TAC ``\x. if x IN t then (f:real->real) x else 0`` THEN
5003      SIMP_TAC std_ss [] THEN
5004      FIRST_X_ASSUM(CHOOSE_THEN(CHOOSE_THEN SUBST_ALL_TAC)) THEN
5005      FIRST_X_ASSUM MATCH_MP_TAC THEN METIS_TAC[],
5006      ALL_TAC] THEN
5007    GEN_TAC THEN DISCH_TAC THEN EXISTS_TAC ``&1:real`` THEN
5008    REWRITE_TAC[REAL_LT_01] THEN
5009    REPEAT STRIP_TAC THEN EXISTS_TAC ``0:real`` THEN
5010    ASM_REWRITE_TAC[ABS_0, REAL_SUB_REFL] THEN
5011    FIRST_X_ASSUM MATCH_MP_TAC THEN
5012    EXISTS_TAC ``s:real->bool`` THEN METIS_TAC[]] THEN
5013  SIMP_TAC std_ss [negligible, has_integral, RIGHT_FORALL_IMP_THM] THEN
5014  REPEAT GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
5015  DISCH_TAC THEN GEN_TAC THEN GEN_TAC THEN
5016  POP_ASSUM (MP_TAC o Q.SPECL [`a:real`,`b:real`]) THEN
5017  REWRITE_TAC[REAL_SUB_RZERO] THEN DISCH_TAC THEN
5018  X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
5019  FIRST_X_ASSUM(MP_TAC o GEN ``n:num`` o
5020      SPEC ``e / &2 / ((&n + &1:real) * &2 pow n)``) THEN
5021  REWRITE_TAC[real_div, REAL_MUL_POS_LT] THEN REWRITE_TAC[GSYM real_div] THEN
5022  ASM_SIMP_TAC arith_ss [REAL_LT_INV_EQ, REAL_LT_MUL, REAL_POW_LT, REAL_LT,
5023           FORALL_AND_THM, METIS [REAL_LT, REAL_OF_NUM_ADD, GSYM ADD1, LESS_0]
5024                            ``&0 < &n + &1:real``, SKOLEM_THM] THEN
5025  DISCH_THEN(X_CHOOSE_THEN ``d:num->real->real->bool`` STRIP_ASSUME_TAC) THEN
5026  EXISTS_TAC ``\x. (d:num->real->real->bool) (flr(abs(f x:real))) x`` THEN
5027  CONJ_TAC THENL [REWRITE_TAC[gauge_def] THEN METIS_TAC[gauge_def], ALL_TAC] THEN
5028  X_GEN_TAC ``p:real#(real->bool)->bool`` THEN STRIP_TAC THEN
5029  FIRST_ASSUM(ASSUME_TAC o MATCH_MP TAGGED_DIVISION_OF_FINITE) THEN
5030  ASM_CASES_TAC ``p:real#(real->bool)->bool = {}`` THEN
5031  ASM_REWRITE_TAC[SUM_CLAUSES, ABS_0] THEN
5032  MP_TAC(SPEC ``sup(IMAGE (\(x,k:real->bool). abs((f:real->real) x)) p)``
5033    SIMP_REAL_ARCH) THEN
5034  ASM_SIMP_TAC std_ss [REAL_SUP_LE_FINITE, IMAGE_FINITE, IMAGE_EQ_EMPTY] THEN
5035  SIMP_TAC std_ss [FORALL_IN_IMAGE, FORALL_PROD] THEN
5036  DISCH_THEN(X_CHOOSE_TAC ``N:num``) THEN
5037  MP_TAC(GEN ``i:num``
5038   (ISPECL [``p:real#(real->bool)->bool``, ``a:real``, ``b:real``,
5039                ``(d:num->real->real->bool) i``] TAGGED_DIVISION_FINER)) THEN
5040  ASM_SIMP_TAC std_ss [SKOLEM_THM, RIGHT_IMP_EXISTS_THM, FORALL_AND_THM] THEN
5041  DISCH_THEN(X_CHOOSE_THEN ``q:num->real#(real->bool)->bool``
5042        STRIP_ASSUME_TAC) THEN
5043  MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC
5044   ``sum{ 0n..N+1:num} (\i. (&i + &1) *
5045                     abs(sum (q i) (\(x:real,k:real->bool).
5046                                            content k * indicator s x)))`` THEN
5047  CONJ_TAC THENL
5048   [ALL_TAC,
5049    MATCH_MP_TAC REAL_LET_TRANS THEN
5050    EXISTS_TAC ``sum { 0n..N+1:num} (\i. e / &2 / (&2:real) pow i)`` THEN CONJ_TAC THENL
5051     [ALL_TAC,
5052      SIMP_TAC std_ss [real_div, SUM_LMUL, GSYM REAL_POW_INV] THEN
5053      SIMP_TAC std_ss [SUM_GP, LT] THEN
5054      SIMP_TAC std_ss [METIS [REAL_ARITH ``1 <> 2:real``, REAL_INV_1OVER, REAL_EQ_LDIV_EQ,
5055                               REAL_ARITH ``0 < 2:real``, REAL_MUL_LID] ``inv 2 <> 1:real``,
5056                        pow, REAL_INV_1OVER] THEN
5057      SIMP_TAC std_ss [METIS [REAL_HALF_DOUBLE, REAL_EQ_SUB_RADD] ``1 - 1 / 2 = 1 / 2:real``] THEN
5058      REWRITE_TAC [METIS [GSYM pow] ``(1 / 2) * (1 / 2:real) pow (N + 1:num) =
5059                                      (1 / 2) pow SUC (N + 1)``] THEN
5060      KNOW_TAC ``!e x. e * (&1 / &2) * ((&1 - x) / (&1 / &2)) < e <=>
5061                                &0 < e * x:real`` THENL
5062      [GEN_TAC THEN GEN_TAC THEN REWRITE_TAC [real_div, REAL_MUL_LID, REAL_INV_INV] THEN
5063       ONCE_REWRITE_TAC [REAL_ARITH ``a * b * (c * d) = (a * (b * d)) * c:real``] THEN
5064       SIMP_TAC std_ss [REAL_MUL_LID, REAL_ARITH ``2 <> 0:real``,
5065        REAL_MUL_LINV, REAL_MUL_RID] THEN REAL_ARITH_TAC, ALL_TAC] THEN
5066      DISCH_TAC THEN ASM_SIMP_TAC std_ss [REAL_MUL_LID, REAL_INV_INV] THEN
5067      KNOW_TAC ``&0 < &1 / &2:real`` THENL
5068       [SIMP_TAC std_ss [REAL_LT_RDIV_EQ, REAL_ARITH ``0 < 2:real``] THEN
5069        REAL_ARITH_TAC, DISCH_TAC] THEN
5070      ASM_SIMP_TAC std_ss [REAL_LT_MUL, REAL_POW_LT, REAL_INV_1OVER]] THEN
5071    MATCH_MP_TAC SUM_LE_NUMSEG THEN REPEAT STRIP_TAC THEN
5072    SIMP_TAC std_ss [] THEN ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
5073    ASM_SIMP_TAC std_ss [GSYM REAL_LE_RDIV_EQ, METIS
5074     [ADD1, LESS_0, REAL_OF_NUM_ADD, REAL_LT] ``&0 < &n + &1:real``] THEN
5075    REWRITE_TAC[real_div] THEN ONCE_REWRITE_TAC[GSYM REAL_MUL_ASSOC] THEN
5076    KNOW_TAC ``(2 pow i) <> 0:real /\ (&i + 1) <> 0:real`` THENL
5077    [CONJ_TAC THENL [MATCH_MP_TAC POW_NZ THEN REAL_ARITH_TAC, ALL_TAC] THEN
5078     REWRITE_TAC [REAL_OF_NUM_ADD, GSYM ADD1] THEN
5079     REWRITE_TAC [REAL_LT_NZ, REAL_LT, LESS_0], STRIP_TAC] THEN
5080    ASM_SIMP_TAC std_ss [GSYM REAL_INV_MUL] THEN REWRITE_TAC[GSYM real_div] THEN
5081    GEN_REWR_TAC (RAND_CONV o ONCE_DEPTH_CONV) [REAL_MUL_SYM] THEN
5082    MATCH_MP_TAC REAL_LT_IMP_LE THEN
5083    FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]] THEN
5084  FIRST_ASSUM(ASSUME_TAC o GEN ``i:num`` o
5085    MATCH_MP TAGGED_DIVISION_OF_FINITE o SPEC ``i:num``) THEN
5086  GEN_REWR_TAC (RAND_CONV o ONCE_DEPTH_CONV) [abs] THEN
5087  SUBGOAL_THEN
5088   ``!i:num. &0 <= sum (q i) (\(x:real,y:real->bool).
5089              content y * (indicator s x))``
5090  ASSUME_TAC THENL
5091   [REPEAT GEN_TAC THEN MATCH_MP_TAC SUM_POS_LE THEN
5092    ASM_SIMP_TAC std_ss [FORALL_PROD] THEN
5093    REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_LE_MUL THEN
5094    REWRITE_TAC[DROP_INDICATOR_POS_LE] THEN
5095    ASM_MESON_TAC[TAGGED_DIVISION_OF, CONTENT_POS_LE],
5096    ALL_TAC] THEN
5097  ASM_REWRITE_TAC[GSYM SUM_LMUL] THEN
5098  SIMP_TAC std_ss [LAMBDA_PROD] THEN
5099  W(MP_TAC o PART_MATCH (lhand o rand) SUM_ABS o lhand o snd) THEN
5100  ASM_REWRITE_TAC[] THEN
5101  MATCH_MP_TAC(REAL_ARITH ``x <= y ==> n <= x ==> n <= y:real``) THEN
5102  ASM_SIMP_TAC std_ss [SUM_SUM_PRODUCT, FINITE_NUMSEG] THEN
5103  MATCH_MP_TAC lemma THEN
5104  ASM_SIMP_TAC std_ss [FINITE_PRODUCT_DEPENDENT, FORALL_PROD, FINITE_NUMSEG] THEN
5105  SIMP_TAC std_ss [IN_ELIM_PAIR_THM] THEN CONJ_TAC THENL
5106   [REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_MUL THEN
5107    CONJ_TAC THENL [METIS_TAC [ADD1, LESS_0, REAL_OF_NUM_ADD, REAL_LT, REAL_LE_LT],
5108                    MATCH_MP_TAC REAL_LE_MUL] THEN
5109    REWRITE_TAC[DROP_INDICATOR_POS_LE] THEN
5110    ASM_MESON_TAC[TAGGED_DIVISION_OF, CONTENT_POS_LE],
5111    ALL_TAC] THEN
5112  MAP_EVERY X_GEN_TAC [``x:real``, ``k:real->bool``] THEN DISCH_TAC THEN
5113  UNDISCH_TAC ``(\(x :real).
5114             (d :num -> real -> real -> bool)
5115               (flr (abs ((f :real -> real) x))) x) FINE
5116          (p :real # (real -> bool) -> bool)`` THEN DISCH_TAC THEN
5117  FIRST_ASSUM(MP_TAC o REWRITE_RULE [FINE]) THEN
5118  DISCH_THEN(MP_TAC o SPECL [``x:real``, ``k:real->bool``]) THEN
5119  ASM_SIMP_TAC std_ss [] THEN ABBREV_TAC
5120   ``n = (flr(abs((f:real->real) x)))`` THEN
5121  SUBGOAL_THEN ``&n <= abs((f:real->real) x) /\
5122                abs(f x) < &n + &1``
5123  STRIP_ASSUME_TAC THENL
5124   [EXPAND_TAC "n" THEN
5125    SIMP_TAC std_ss [NUM_FLOOR_LE, ABS_POS] THEN
5126    REWRITE_TAC [REAL_OF_NUM_ADD] THEN
5127    REWRITE_TAC [METIS [REAL_OVER1, REAL_MUL_RID]
5128                 ``&(flr (abs ((f :real -> real) x)) + 1):real =
5129                   &(flr ((abs (f x)) / 1) + 1) * 1``] THEN
5130    MATCH_MP_TAC NUM_FLOOR_DIV_LOWERBOUND THEN REAL_ARITH_TAC, ALL_TAC] THEN
5131  DISCH_TAC THEN EXISTS_TAC ``n:num`` THEN ASM_SIMP_TAC std_ss [] THEN CONJ_TAC THENL
5132   [ASM_SIMP_TAC std_ss [IN_NUMSEG, LE_0] THEN
5133    REWRITE_TAC[GSYM REAL_OF_NUM_LE, GSYM REAL_OF_NUM_ADD] THEN
5134    MATCH_MP_TAC REAL_LE_TRANS THEN
5135    EXISTS_TAC ``abs((f:real->real) x)`` THEN ASM_REWRITE_TAC[] THEN
5136    MATCH_MP_TAC(REAL_ARITH ``x <= n ==> x <= n + &1:real``) THEN
5137    ASM_MESON_TAC[], ALL_TAC] THEN
5138  ASM_CASES_TAC ``(x:real) IN s`` THEN ASM_SIMP_TAC std_ss [indicator] THEN
5139  SIMP_TAC std_ss [REAL_MUL_RZERO, ABS_0,
5140              REAL_MUL_RZERO, REAL_LE_REFL] THEN
5141  ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
5142  REWRITE_TAC[REAL_MUL_RID, ABS_MUL] THEN
5143  SUBGOAL_THEN ``&0 <= content(k:real->bool)`` ASSUME_TAC THENL
5144   [ASM_MESON_TAC[TAGGED_DIVISION_OF, CONTENT_POS_LE], ALL_TAC] THEN
5145  ASM_REWRITE_TAC[abs] THEN GEN_REWR_TAC LAND_CONV [REAL_MUL_SYM] THEN
5146  POP_ASSUM MP_TAC THEN GEN_REWR_TAC LAND_CONV [REAL_LE_LT] THEN
5147  STRIP_TAC THENL [ASM_SIMP_TAC std_ss [REAL_LE_LMUL] THEN
5148   REWRITE_TAC [GSYM abs] THEN ASM_REWRITE_TAC [REAL_LE_LT],
5149   POP_ASSUM (MP_TAC o ONCE_REWRITE_RULE [EQ_SYM_EQ]) THEN DISCH_TAC THEN
5150   ASM_REWRITE_TAC []] THEN REAL_ARITH_TAC
5151QED
5152
5153Theorem HAS_INTEGRAL_SPIKE:
5154   !f:real->real g s t y.
5155        negligible s /\ (!x. x IN (t DIFF s) ==> (g x = f x)) /\
5156        (f has_integral y) t ==> (g has_integral y) t
5157Proof
5158  SUBGOAL_THEN
5159   ``!f:real->real g s a b y.
5160        negligible s /\ (!x. x IN (interval[a,b] DIFF s) ==> (g x = f x))
5161        ==> (f has_integral y) (interval[a,b])
5162            ==> (g has_integral y) (interval[a,b])``
5163  ASSUME_TAC THENL
5164   [REPEAT STRIP_TAC THEN
5165    SUBGOAL_THEN
5166     ``((\x. (f:real->real)(x) + (g(x) - f(x))) has_integral (y + 0))
5167      (interval[a,b])``
5168    MP_TAC THENL
5169     [ALL_TAC,
5170      SIMP_TAC std_ss [REAL_ARITH ``((f:real->real) x + (g x - f x) = g x) /\
5171                                     (f x + 0 = f x)``, ETA_AX, REAL_ADD_RID]] THEN
5172    ONCE_REWRITE_TAC [METIS [] ``(g x - (f:real->real) x) = (\x. g x - f x) x``] THEN
5173    MATCH_MP_TAC HAS_INTEGRAL_ADD THEN ASM_REWRITE_TAC[] THEN
5174    MATCH_MP_TAC HAS_INTEGRAL_NEGLIGIBLE THEN
5175    EXISTS_TAC ``s:real->bool`` THEN ASM_SIMP_TAC std_ss [REAL_SUB_0],
5176    ALL_TAC] THEN
5177  REPEAT GEN_TAC THEN
5178  REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
5179  ONCE_REWRITE_TAC[has_integral_alt] THEN COND_CASES_TAC THEN
5180  ASM_REWRITE_TAC[] THENL
5181   [FIRST_X_ASSUM(CHOOSE_THEN(CHOOSE_THEN SUBST_ALL_TAC)) THEN ASM_MESON_TAC[],
5182    ALL_TAC] THEN
5183  DISCH_TAC THEN GEN_TAC THEN POP_ASSUM (MP_TAC o Q.SPEC `e:real`) THEN
5184  MATCH_MP_TAC MONO_IMP THEN
5185  REWRITE_TAC[] THEN DISCH_THEN (X_CHOOSE_TAC ``B:real``) THEN
5186  EXISTS_TAC ``B:real`` THEN POP_ASSUM MP_TAC THEN
5187  MATCH_MP_TAC MONO_AND THEN REWRITE_TAC[] THEN
5188  DISCH_TAC THEN GEN_TAC THEN GEN_TAC THEN
5189  POP_ASSUM (MP_TAC o Q.SPECL [`a:real`,`b:real`]) THEN
5190  MATCH_MP_TAC MONO_IMP THEN REWRITE_TAC[] THEN
5191  DISCH_THEN (X_CHOOSE_TAC ``z:real``) THEN EXISTS_TAC ``z:real`` THEN
5192  POP_ASSUM MP_TAC THEN
5193  MATCH_MP_TAC MONO_AND THEN REWRITE_TAC[] THEN
5194  FIRST_X_ASSUM MATCH_MP_TAC THEN EXISTS_TAC ``s:real->bool`` THEN
5195  ASM_REWRITE_TAC[] THEN ASM_SET_TAC[]
5196QED
5197
5198Theorem HAS_INTEGRAL_SPIKE_EQ:
5199   !f:real->real g s t y.
5200        negligible s /\ (!x. x IN (t DIFF s) ==> (g x = f x))
5201        ==> ((f has_integral y) t <=> (g has_integral y) t)
5202Proof
5203  REPEAT STRIP_TAC THEN EQ_TAC THEN DISCH_TAC THEN
5204  MATCH_MP_TAC HAS_INTEGRAL_SPIKE THENL
5205   [EXISTS_TAC ``f:real->real``, EXISTS_TAC ``g:real->real``] THEN
5206  EXISTS_TAC ``s:real->bool`` THEN ASM_SIMP_TAC std_ss [] THEN
5207  ASM_MESON_TAC[ABS_SUB]
5208QED
5209
5210Theorem INTEGRABLE_SPIKE:
5211   !f:real->real g s t.
5212        negligible s /\ (!x. x IN (t DIFF s) ==> (g x = f x))
5213        ==> f integrable_on t ==> g integrable_on  t
5214Proof
5215  REPEAT GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[integrable_on] THEN
5216  STRIP_TAC THEN EXISTS_TAC ``y:real`` THEN POP_ASSUM (MP_TAC) THEN
5217  MP_TAC(SPEC_ALL HAS_INTEGRAL_SPIKE) THEN ASM_REWRITE_TAC[]
5218QED
5219
5220Theorem INTEGRABLE_SPIKE_EQ:
5221   !f:real->real g s t.
5222        negligible s /\ (!x. x IN t DIFF s ==> (g x = f x))
5223        ==> (f integrable_on t <=> g integrable_on t)
5224Proof
5225  MESON_TAC[INTEGRABLE_SPIKE]
5226QED
5227
5228Theorem INTEGRAL_SPIKE:
5229   !f:real->real g s t.
5230        negligible s /\ (!x. x IN (t DIFF s) ==> (g x = f x))
5231        ==> (integral t f = integral t g)
5232Proof
5233  REPEAT STRIP_TAC THEN REWRITE_TAC[integral] THEN
5234  AP_TERM_TAC THEN ABS_TAC THEN MATCH_MP_TAC HAS_INTEGRAL_SPIKE_EQ THEN
5235  ASM_MESON_TAC[]
5236QED
5237
5238(* ------------------------------------------------------------------------- *)
5239(* Some other trivialities about negligible sets.                            *)
5240(* ------------------------------------------------------------------------- *)
5241
5242Theorem NEGLIGIBLE_SUBSET:
5243   !s:real->bool t:real->bool.
5244        negligible s /\ t SUBSET s ==> negligible t
5245Proof
5246  REPEAT STRIP_TAC THEN REWRITE_TAC[negligible] THEN
5247  MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``] THEN
5248  MATCH_MP_TAC HAS_INTEGRAL_SPIKE THEN
5249  MAP_EVERY EXISTS_TAC [``(\x. 0):real->real``, ``s:real->bool``] THEN
5250  ASM_REWRITE_TAC[HAS_INTEGRAL_0] THEN
5251  REWRITE_TAC[indicator] THEN ASM_SET_TAC[]
5252QED
5253
5254Theorem NEGLIGIBLE_DIFF:
5255   !s t:real->bool. negligible s ==> negligible(s DIFF t)
5256Proof
5257  REPEAT STRIP_TAC THEN MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
5258  EXISTS_TAC ``s:real->bool`` THEN ASM_SIMP_TAC std_ss [DIFF_SUBSET]
5259QED
5260
5261Theorem NEGLIGIBLE_INTER:
5262   !s t. negligible s \/ negligible t ==> negligible(s INTER t)
5263Proof
5264  METIS_TAC [NEGLIGIBLE_SUBSET, INTER_SUBSET]
5265QED
5266
5267Theorem NEGLIGIBLE_UNION:
5268   !s t:real->bool.
5269        negligible s /\ negligible t ==> negligible (s UNION t)
5270Proof
5271  REPEAT GEN_TAC THEN DISCH_TAC THEN FIRST_ASSUM MP_TAC THEN
5272  SIMP_TAC std_ss [negligible, GSYM FORALL_AND_THM] THEN
5273  DISCH_TAC THEN GEN_TAC THEN GEN_TAC THEN
5274  POP_ASSUM (MP_TAC o Q.SPECL [`a:real`,`b:real`]) THEN
5275  DISCH_THEN(MP_TAC o MATCH_MP HAS_INTEGRAL_ADD) THEN
5276  REWRITE_TAC[REAL_ADD_LID] THEN MATCH_MP_TAC EQ_IMPLIES THEN
5277  MATCH_MP_TAC HAS_INTEGRAL_SPIKE_EQ THEN
5278  EXISTS_TAC ``s:real->bool`` THEN ASM_SIMP_TAC std_ss [] THEN
5279  SIMP_TAC std_ss [indicator, IN_UNION, IN_DIFF, REAL_ADD_LID]
5280QED
5281
5282Theorem NEGLIGIBLE_UNION_EQ:
5283   !s t:real->bool.
5284        negligible (s UNION t) <=> negligible s /\ negligible t
5285Proof
5286  METIS_TAC[NEGLIGIBLE_UNION, SUBSET_UNION, NEGLIGIBLE_SUBSET]
5287QED
5288
5289Theorem NEGLIGIBLE_SING:
5290   !a:real. negligible {a}
5291Proof
5292  GEN_TAC THEN MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
5293  EXISTS_TAC ``{x | (x:real) = (a:real)}`` THEN
5294  SIMP_TAC std_ss [NEGLIGIBLE_STANDARD_HYPERPLANE, LESS_EQ_REFL] THEN
5295  SET_TAC[]
5296QED
5297
5298Theorem NEGLIGIBLE_INSERT:
5299   !a:real s. negligible(a INSERT s) <=> negligible s
5300Proof
5301  ONCE_REWRITE_TAC[SET_RULE ``a INSERT s = {a} UNION s``] THEN
5302  REWRITE_TAC[NEGLIGIBLE_UNION_EQ, NEGLIGIBLE_SING]
5303QED
5304
5305Theorem NEGLIGIBLE_EMPTY:
5306   negligible {}
5307Proof
5308  METIS_TAC [EMPTY_SUBSET, NEGLIGIBLE_SUBSET, NEGLIGIBLE_SING]
5309QED
5310
5311Theorem NEGLIGIBLE_FINITE:
5312   !s. FINITE s ==> negligible s
5313Proof
5314  ONCE_REWRITE_TAC [METIS [] ``!s. (negligible s) = (\s. negligible s) s``] THEN
5315  MATCH_MP_TAC FINITE_INDUCT THEN BETA_TAC THEN
5316  SIMP_TAC std_ss [NEGLIGIBLE_EMPTY, NEGLIGIBLE_INSERT]
5317QED
5318
5319Theorem NEGLIGIBLE_BIGUNION:
5320   !s. FINITE s /\ (!t. t IN s ==> negligible t)
5321       ==> negligible(BIGUNION s)
5322Proof
5323  REWRITE_TAC[IMP_CONJ] THEN
5324  ONCE_REWRITE_TAC [METIS []
5325  ``!s. ((!t. t IN s ==> negligible t) ==> negligible(BIGUNION s)) =
5326    (\s. (!t. t IN s ==> negligible t) ==> negligible(BIGUNION s)) s``] THEN
5327  MATCH_MP_TAC FINITE_INDUCT THEN BETA_TAC THEN
5328  SIMP_TAC std_ss [BIGUNION_EMPTY, BIGUNION_INSERT, NEGLIGIBLE_EMPTY, IN_INSERT] THEN
5329  SIMP_TAC std_ss [NEGLIGIBLE_UNION]
5330QED
5331
5332Theorem NEGLIGIBLE:
5333   !s:real->bool. negligible s <=> !t. (indicator s has_integral 0) t
5334Proof
5335  GEN_TAC THEN EQ_TAC THENL
5336   [ALL_TAC, REWRITE_TAC[negligible] THEN SIMP_TAC std_ss []] THEN
5337  DISCH_TAC THEN GEN_TAC THEN ONCE_REWRITE_TAC[has_integral_alt] THEN
5338  COND_CASES_TAC THENL [ASM_MESON_TAC[negligible], ALL_TAC] THEN
5339  GEN_TAC THEN DISCH_TAC THEN EXISTS_TAC ``&1:real`` THEN REWRITE_TAC[REAL_LT_01] THEN
5340  REPEAT STRIP_TAC THEN EXISTS_TAC ``0:real`` THEN
5341  MP_TAC(ISPECL [``s:real->bool``, ``s INTER t:real->bool``]
5342        NEGLIGIBLE_SUBSET) THEN
5343  ASM_SIMP_TAC std_ss [INTER_SUBSET, negligible, REAL_SUB_REFL, ABS_0] THEN
5344  DISCH_TAC THEN POP_ASSUM (MP_TAC o Q.SPECL [`a:real`,`b:real`]) THEN
5345  SIMP_TAC std_ss [indicator, IN_INTER] THEN MATCH_MP_TAC EQ_IMPLIES THEN
5346  AP_THM_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN SET_TAC []
5347QED
5348
5349(* ------------------------------------------------------------------------- *)
5350(* Finite or empty cases of the spike theorem are quite commonly needed.     *)
5351(* ------------------------------------------------------------------------- *)
5352
5353Theorem HAS_INTEGRAL_SPIKE_FINITE:
5354   !f:real->real g s t y.
5355        FINITE s /\ (!x. x IN (t DIFF s) ==> (g x = f x)) /\
5356        (f has_integral y) t
5357        ==> (g has_integral y) t
5358Proof
5359  MESON_TAC [HAS_INTEGRAL_SPIKE, NEGLIGIBLE_FINITE]
5360QED
5361
5362Theorem HAS_INTEGRAL_SPIKE_FINITE_EQ:
5363   !f:real->real g s t y.
5364        FINITE s /\ (!x. x IN (t DIFF s) ==> (g x = f x))
5365        ==> ((f has_integral y) t <=> (g has_integral y) t)
5366Proof
5367  MESON_TAC[HAS_INTEGRAL_SPIKE_FINITE]
5368QED
5369
5370Theorem INTEGRABLE_SPIKE_FINITE:
5371   !f:real->real g s.
5372        FINITE s /\ (!x. x IN (t DIFF s) ==> (g x = f x))
5373        ==> f integrable_on t
5374            ==> g integrable_on  t
5375Proof
5376  REPEAT GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[integrable_on] THEN
5377  STRIP_TAC THEN EXISTS_TAC ``y:real`` THEN POP_ASSUM MP_TAC THEN
5378  MP_TAC(SPEC_ALL HAS_INTEGRAL_SPIKE_FINITE) THEN ASM_REWRITE_TAC[]
5379QED
5380
5381Theorem INTEGRAL_EQ:
5382   !f:real->real g s.
5383        (!x. x IN s ==> (f x = g x)) ==> (integral s f = integral s g)
5384Proof
5385  REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRAL_SPIKE THEN
5386  EXISTS_TAC ``{}:real->bool`` THEN ASM_SIMP_TAC std_ss [NEGLIGIBLE_EMPTY, IN_DIFF]
5387QED
5388
5389Theorem INTEGRAL_EQ_0:
5390   !f:real->real s. (!x. x IN s ==> (f x = 0)) ==> (integral s f = 0)
5391Proof
5392  REPEAT STRIP_TAC THEN MATCH_MP_TAC EQ_TRANS THEN
5393  EXISTS_TAC ``integral s ((\x. 0):real->real)`` THEN
5394  CONJ_TAC THENL
5395   [MATCH_MP_TAC INTEGRAL_EQ THEN ASM_REWRITE_TAC[],
5396    REWRITE_TAC[INTEGRAL_0]]
5397QED
5398
5399(* ------------------------------------------------------------------------- *)
5400(* In particular, the boundary of an interval is negligible.                 *)
5401(* ------------------------------------------------------------------------- *)
5402
5403Theorem NEGLIGIBLE_FRONTIER_INTERVAL:
5404   !a b:real. negligible(interval[a,b] DIFF interval(a,b))
5405Proof
5406  REPEAT GEN_TAC THEN MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
5407  EXISTS_TAC ``BIGUNION ({{x:real | x = (a:real)} UNION
5408                                 {x:real | x = (b:real)}})`` THEN
5409  CONJ_TAC THENL
5410   [MATCH_MP_TAC NEGLIGIBLE_BIGUNION THEN
5411    SRW_TAC [][] THEN MATCH_MP_TAC NEGLIGIBLE_UNION THEN
5412    REWRITE_TAC [NEGLIGIBLE_SING],
5413    SIMP_TAC std_ss [SUBSET_DEF, IN_DIFF, IN_INTERVAL, IN_BIGUNION, EXISTS_IN_IMAGE] THEN
5414    SIMP_TAC std_ss [IN_NUMSEG, IN_UNION, GSPECIFICATION, REAL_LT_LE] THEN
5415    SRW_TAC [][]]
5416QED
5417
5418Theorem HAS_INTEGRAL_SPIKE_INTERIOR:
5419   !f:real->real g a b y.
5420        (!x. x IN interval(a,b) ==> (g x = f x)) /\
5421        (f has_integral y) (interval[a,b])
5422        ==> (g has_integral y) (interval[a,b])
5423Proof
5424  REPEAT GEN_TAC THEN REWRITE_TAC[IMP_CONJ] THEN DISCH_TAC THEN
5425  MATCH_MP_TAC(REWRITE_RULE[TAUT `a /\ b /\ c ==> d <=> a /\ b ==> c ==> d`]
5426                           HAS_INTEGRAL_SPIKE) THEN
5427  EXISTS_TAC ``interval[a:real,b] DIFF interval(a,b)`` THEN
5428  REWRITE_TAC[NEGLIGIBLE_FRONTIER_INTERVAL] THEN ASM_SET_TAC[]
5429QED
5430
5431Theorem HAS_INTEGRAL_SPIKE_INTERIOR_EQ:
5432   !f:real->real g a b y.
5433        (!x. x IN interval(a,b) ==> (g x = f x))
5434        ==> ((f has_integral y) (interval[a,b]) <=>
5435             (g has_integral y) (interval[a,b]))
5436Proof
5437  MESON_TAC[HAS_INTEGRAL_SPIKE_INTERIOR]
5438QED
5439
5440Theorem INTEGRABLE_SPIKE_INTERIOR:
5441   !f:real->real g a b.
5442        (!x. x IN interval(a,b) ==> (g x = f x))
5443        ==> f integrable_on (interval[a,b])
5444            ==> g integrable_on  (interval[a,b])
5445Proof
5446  REPEAT GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[integrable_on] THEN
5447  STRIP_TAC THEN EXISTS_TAC ``y:real`` THEN POP_ASSUM MP_TAC THEN
5448  MP_TAC(SPEC_ALL HAS_INTEGRAL_SPIKE_INTERIOR) THEN ASM_REWRITE_TAC[]
5449QED
5450
5451(* ------------------------------------------------------------------------- *)
5452(* Integrability of continuous functions.                                    *)
5453(* ------------------------------------------------------------------------- *)
5454
5455Theorem OPERATIVE_DIVISION_AND:
5456   !P d a b. operative(/\) P /\ d division_of interval[a,b]
5457             ==> ((!i. i IN d ==> P i) <=> P(interval[a,b]))
5458Proof
5459  REPEAT GEN_TAC THEN DISCH_THEN(ASSUME_TAC o CONJ MONOIDAL_AND) THEN
5460  FIRST_ASSUM(MP_TAC o MATCH_MP OPERATIVE_DIVISION) THEN
5461  ASM_MESON_TAC[ITERATE_AND, DIVISION_OF_FINITE]
5462QED
5463
5464Theorem OPERATIVE_APPROXIMABLE:
5465   !f:real->real e.
5466        &0 <= e
5467        ==> operative(/\)
5468               (\i. ?g. (!x. x IN i ==> abs (f x - g x) <= e) /\
5469                        g integrable_on i)
5470Proof
5471  REPEAT STRIP_TAC THEN REWRITE_TAC[operative, NEUTRAL_AND] THEN CONJ_TAC THENL
5472   [REPEAT STRIP_TAC THEN BETA_TAC THEN EXISTS_TAC ``f:real->real`` THEN
5473    ASM_SIMP_TAC std_ss [REAL_SUB_REFL, ABS_0, integrable_on] THEN
5474    METIS_TAC[HAS_INTEGRAL_NULL],
5475    ALL_TAC] THEN
5476  MAP_EVERY X_GEN_TAC [``u:real``, ``v:real``, ``c:real``] THEN EQ_TAC THENL
5477   [METIS_TAC[INTEGRABLE_SPLIT, IN_INTER], ALL_TAC] THEN BETA_TAC THEN
5478  DISCH_THEN(CONJUNCTS_THEN2
5479   (X_CHOOSE_THEN ``g1:real->real`` STRIP_ASSUME_TAC)
5480   (X_CHOOSE_THEN ``g2:real->real`` STRIP_ASSUME_TAC)) THEN
5481  EXISTS_TAC ``\x. if x = c then (f:real->real)(x) else
5482                   if x <= c then g1(x) else g2(x)`` THEN
5483  CONJ_TAC THENL
5484   [GEN_TAC THEN STRIP_TAC THEN SIMP_TAC std_ss [] THEN
5485    COND_CASES_TAC THEN ASM_REWRITE_TAC[REAL_SUB_REFL, ABS_0] THEN
5486    RULE_ASSUM_TAC(SIMP_RULE std_ss [IN_INTER, GSPECIFICATION]) THEN
5487    METIS_TAC[REAL_ARITH ``x <= c \/ x >= c:real``],
5488    ALL_TAC] THEN
5489  SUBGOAL_THEN
5490   ``(\x:real. if x = c then f x else if x <= c then g1 x else g2 x)
5491    integrable_on (interval[u,v] INTER {x | x <= c}) /\
5492    (\x. if x = c then f x :real else if x <= c then g1 x else g2 x)
5493    integrable_on (interval[u,v] INTER {x | x >= c})``
5494  MP_TAC THENL
5495   [ALL_TAC,
5496    REWRITE_TAC[integrable_on] THEN METIS_TAC[HAS_INTEGRAL_SPLIT]] THEN
5497  CONJ_TAC THENL
5498   [UNDISCH_TAC
5499     ``(g1:real->real) integrable_on (interval[u,v] INTER {x | x <= c})``,
5500    UNDISCH_TAC
5501    ``(g2:real->real) integrable_on (interval[u,v] INTER {x | x >= c})``] THEN
5502  ASM_SIMP_TAC std_ss [INTERVAL_SPLIT] THEN MATCH_MP_TAC INTEGRABLE_SPIKE THEN
5503  ASM_SIMP_TAC std_ss [GSYM INTERVAL_SPLIT] THEN
5504  EXISTS_TAC ``{x:real | x = c}`` THEN
5505  ASM_SIMP_TAC std_ss [NEGLIGIBLE_STANDARD_HYPERPLANE, IN_DIFF, IN_INTER, GSPECIFICATION,
5506               REAL_ARITH ``x >= c /\ ~(x = c) ==> ~(x <= c:real)``]
5507QED
5508
5509Theorem APPROXIMABLE_ON_DIVISION:
5510   !f:real->real d a b e.
5511        &0 <= e /\
5512        (d division_of interval[a,b]) /\
5513        (!i. i IN d
5514             ==> ?g. (!x. x IN i ==> abs (f x - g x) <= e) /\
5515                     g integrable_on i)
5516        ==> ?g. (!x. x IN interval[a,b] ==> abs (f x - g x) <= e) /\
5517                g integrable_on interval[a,b]
5518Proof
5519  REPEAT STRIP_TAC THEN
5520  MP_TAC(ISPECL [``(/\)``, ``d:(real->bool)->bool``,
5521                 ``a:real``, ``b:real``,
5522                 ``\i. ?g:real->real.
5523                       (!x. x IN i ==> abs (f x - g x) <= e) /\
5524                       g integrable_on i``]
5525                OPERATIVE_DIVISION) THEN
5526  ASM_SIMP_TAC std_ss [OPERATIVE_APPROXIMABLE, MONOIDAL_AND] THEN
5527  DISCH_THEN(SUBST1_TAC o SYM) THEN
5528  FIRST_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_FINITE) THEN
5529  ASM_SIMP_TAC std_ss [ITERATE_AND]
5530QED
5531
5532Theorem INTEGRABLE_CONTINUOUS:
5533   !f:real->real a b.
5534        f continuous_on interval[a,b] ==> f integrable_on interval[a,b]
5535Proof
5536  REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRABLE_UNIFORM_LIMIT THEN
5537  X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
5538  MATCH_MP_TAC APPROXIMABLE_ON_DIVISION THEN
5539  ASM_SIMP_TAC std_ss [REAL_LT_IMP_LE] THEN
5540  FIRST_ASSUM(MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
5541    COMPACT_UNIFORMLY_CONTINUOUS)) THEN
5542  REWRITE_TAC[COMPACT_INTERVAL, uniformly_continuous_on] THEN
5543  DISCH_THEN(MP_TAC o SPEC ``e:real``) THEN ASM_REWRITE_TAC[dist] THEN
5544  DISCH_THEN(X_CHOOSE_THEN ``d:real`` STRIP_ASSUME_TAC) THEN
5545  SUBGOAL_THEN
5546   ``?p. p tagged_division_of interval[a:real,b] /\ (\x. ball(x,d)) FINE p``
5547  STRIP_ASSUME_TAC THENL
5548   [METIS_TAC[FINE_DIVISION_EXISTS, GAUGE_BALL], ALL_TAC] THEN
5549  EXISTS_TAC ``IMAGE SND (p:real#(real->bool)->bool)`` THEN
5550  ASM_SIMP_TAC std_ss [DIVISION_OF_TAGGED_DIVISION] THEN
5551  SIMP_TAC std_ss [FORALL_IN_IMAGE, FORALL_PROD] THEN
5552  MAP_EVERY X_GEN_TAC [``x:real``, ``l:real->bool``] THEN
5553  DISCH_TAC THEN EXISTS_TAC ``\y:real. (f:real->real) x`` THEN
5554  UNDISCH_TAC `` p tagged_division_of interval [(a,b)]`` THEN DISCH_TAC THEN
5555  FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [TAGGED_DIVISION_OF]) THEN
5556  DISCH_THEN (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
5557  DISCH_THEN (CONJUNCTS_THEN2 MP_TAC STRIP_ASSUME_TAC) THEN
5558  DISCH_THEN(MP_TAC o
5559    SPECL [``x:real``, ``l:real->bool``]) THEN
5560  ASM_REWRITE_TAC[SUBSET_DEF] THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
5561  UNDISCH_TAC ``(\x. ball (x,d)) FINE p`` THEN DISCH_TAC THEN
5562  FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [FINE]) THEN BETA_TAC THEN
5563  REWRITE_TAC[SUBSET_DEF, IN_BALL, dist] THEN
5564   FIRST_X_ASSUM SUBST_ALL_TAC THEN REPEAT STRIP_TAC THENL
5565   [METIS_TAC[REAL_LT_IMP_LE, ABS_SUB],
5566    REWRITE_TAC[integrable_on] THEN
5567    EXISTS_TAC ``content(interval[a':real,b']) * (f:real->real) x`` THEN
5568    REWRITE_TAC[HAS_INTEGRAL_CONST]]
5569QED
5570
5571(* ------------------------------------------------------------------------- *)
5572(* Specialization of additivity to one dimension.                            *)
5573(* ------------------------------------------------------------------------- *)
5574
5575Theorem OPERATIVE_1_LT:
5576   !op. monoidal op
5577        ==> !f. operative op f <=>
5578                (!a b. b <= a ==> (f(interval[a,b]) = neutral op)) /\
5579                (!a b c. a < c /\ c < b
5580                         ==> (op (f(interval[a,c])) (f(interval[c,b])) =
5581                              f(interval[a,b])))
5582Proof
5583  REPEAT STRIP_TAC THEN REWRITE_TAC[operative, CONTENT_EQ_0] THEN
5584  MATCH_MP_TAC(TAUT `(a ==> (b <=> c)) ==> (a /\ b <=> a /\ c)`) THEN
5585  DISCH_TAC THEN
5586  AP_TERM_TAC THEN SIMP_TAC std_ss [FUN_EQ_THM] THEN X_GEN_TAC ``a:real`` THEN
5587  AP_TERM_TAC THEN SIMP_TAC std_ss [FUN_EQ_THM] THEN X_GEN_TAC ``b:real`` THEN
5588  EQ_TAC THEN DISCH_TAC THENL
5589   [X_GEN_TAC ``c:real`` THEN FIRST_ASSUM(SUBST1_TAC o SPEC ``c:real``) THEN
5590    DISCH_TAC THEN FIRST_ASSUM(ASSUME_TAC o MATCH_MP REAL_LT_TRANS) THEN
5591    ASM_SIMP_TAC std_ss [INTERVAL_SPLIT, LESS_EQ_REFL, REAL_LT_IMP_LE] THEN
5592    BINOP_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN
5593    SIMP_TAC std_ss [CONS_11, PAIR_EQ] THEN
5594    SIMP_TAC std_ss [LESS_EQ_REFL, min_def, max_def] THENL
5595    [FULL_SIMP_TAC std_ss [GSYM REAL_NOT_LE],
5596     ASM_SIMP_TAC std_ss [REAL_LE_LT]], ALL_TAC] THEN
5597  X_GEN_TAC ``c:real`` THEN
5598  SIMP_TAC std_ss [INTERVAL_SPLIT, LESS_EQ_REFL] THEN
5599  DISJ_CASES_TAC(REAL_ARITH ``c <= a \/ a < c:real``) THENL
5600   [SUBGOAL_THEN
5601     ``(content(interval [(a,min b c)]) = &0) /\
5602       (interval [(max a c,b)] = interval[a,b])``
5603    (CONJUNCTS_THEN2 MP_TAC SUBST1_TAC) THENL
5604     [CONJ_TAC THENL
5605       [SIMP_TAC std_ss [CONTENT_EQ_0, min_def] THEN METIS_TAC [REAL_LE_TRANS],
5606        AP_TERM_TAC THEN SIMP_TAC std_ss [CONS_11, PAIR_EQ, max_def] THEN
5607        METIS_TAC [REAL_LE_ANTISYM]],
5608      REWRITE_TAC[CONTENT_EQ_0] THEN
5609      DISCH_THEN(ANTE_RES_THEN SUBST1_TAC) THEN METIS_TAC[monoidal]],
5610    ALL_TAC] THEN
5611  DISJ_CASES_TAC(REAL_ARITH ``b <= c \/ c < b:real``) THENL
5612   [SUBGOAL_THEN
5613     ``(interval [(a,min b c)] = interval[a,b]) /\
5614       (content(interval [(max a c,b)]) = &0)``
5615      (CONJUNCTS_THEN2 SUBST1_TAC MP_TAC) THENL
5616     [CONJ_TAC THENL
5617       [AP_TERM_TAC THEN SIMP_TAC std_ss [CONS_11, PAIR_EQ] THEN METIS_TAC [min_def],
5618        SIMP_TAC std_ss [CONTENT_EQ_0, max_def] THEN METIS_TAC [REAL_LE_LT]],
5619      REWRITE_TAC[CONTENT_EQ_0] THEN
5620      DISCH_THEN(ANTE_RES_THEN SUBST1_TAC) THEN ASM_MESON_TAC[monoidal]],
5621    ALL_TAC] THEN
5622  SUBGOAL_THEN
5623   ``(min b c = c:real) /\ (max a c = c:real)``
5624   (fn th => REWRITE_TAC[th] THEN ASM_MESON_TAC[]) THEN
5625  SIMP_TAC std_ss [LESS_EQ_REFL, min_def, max_def] THEN
5626  FULL_SIMP_TAC std_ss [GSYM REAL_NOT_LE] THEN
5627  FULL_SIMP_TAC std_ss [REAL_NOT_LE, REAL_LE_LT]
5628QED
5629
5630Theorem OPERATIVE_1_LE:
5631   !op. monoidal op
5632        ==> !f. operative op f <=>
5633                (!a b. b <= a ==> (f(interval[a,b]) = neutral op)) /\
5634                (!a b c. a <= c /\ c <= b
5635                         ==> (op (f(interval[a,c])) (f(interval[c,b])) =
5636                              f(interval[a,b])))
5637Proof
5638  GEN_TAC THEN DISCH_TAC THEN GEN_TAC THEN EQ_TAC THENL
5639   [ALL_TAC, ASM_SIMP_TAC std_ss [OPERATIVE_1_LT] THEN MESON_TAC[REAL_LT_IMP_LE]] THEN
5640  REWRITE_TAC[operative, CONTENT_EQ_0] THEN
5641  DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN ASM_REWRITE_TAC[] THEN
5642  DISCH_TAC THEN GEN_TAC THEN GEN_TAC THEN
5643  POP_ASSUM (MP_TAC o Q.SPECL [`a:real`,`b:real`]) THEN DISCH_TAC THEN
5644  X_GEN_TAC ``c:real`` THEN FIRST_ASSUM(SUBST1_TAC o SPEC ``c:real``) THEN
5645  DISCH_TAC THEN FIRST_ASSUM(ASSUME_TAC o MATCH_MP REAL_LE_TRANS) THEN
5646  ASM_SIMP_TAC std_ss [INTERVAL_SPLIT, LESS_EQ_REFL] THEN
5647  BINOP_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN
5648  SIMP_TAC std_ss [CONS_11, PAIR_EQ] THEN
5649  SIMP_TAC std_ss [LESS_EQ_REFL, min_def, max_def] THEN
5650  METIS_TAC [REAL_LE_ANTISYM]
5651QED
5652
5653(* ------------------------------------------------------------------------- *)
5654(* Special case of additivity we need for the FTC.                           *)
5655(* ------------------------------------------------------------------------- *)
5656
5657Theorem ADDITIVE_TAGGED_DIVISION_1:
5658   !f:real->real p a b.
5659        a <= b /\
5660        p tagged_division_of interval[a,b]
5661        ==> (sum p
5662             (\(x,k). f(interval_upperbound k) - f(interval_lowerbound k)) =
5663            f b - f a)
5664Proof
5665  REPEAT STRIP_TAC THEN
5666  MP_TAC(ISPECL
5667   [``(+):real->real->real``,
5668    ``p:(real#(real->bool)->bool)``,
5669    ``a:real``, ``b:real``,
5670    ``(\k. if k = {} then 0
5671          else f(interval_upperbound k) - f(interval_lowerbound k)):
5672     ((real->bool)->real)``] OPERATIVE_TAGGED_DIVISION) THEN
5673  ASM_SIMP_TAC std_ss [MONOIDAL_REAL_ADD, OPERATIVE_1_LT, NEUTRAL_REAL_ADD,
5674               INTERVAL_LOWERBOUND, INTERVAL_UPPERBOUND] THEN
5675  KNOW_TAC ``(!(a' :real) (b' :real).
5676        b' <= a' ==>
5677        ((if interval [(a',b')] = ({} :real -> bool) then (0 :real)
5678          else
5679            (f :real -> real) (interval_upperbound (interval [(a',b')])) -
5680            f (interval_lowerbound (interval [(a',b')]))) =
5681         (0 :
5682         real))) /\
5683     (!(a :real) (b :real) (c :real).
5684        a < c /\ c < b ==>
5685        ((if interval [(a,c)] = ({} :real -> bool) then (0 :real)
5686          else
5687            f (interval_upperbound (interval [(a,c)])) -
5688            f (interval_lowerbound (interval [(a,c)]))) +
5689         (if interval [(c,b)] = ({} :real -> bool) then (0 :real)
5690          else
5691            f (interval_upperbound (interval [(c,b)])) -
5692            f (interval_lowerbound (interval [(c,b)]))) =
5693         if interval [(a,b)] = ({} :real -> bool) then (0 :real)
5694         else
5695           f (interval_upperbound (interval [(a,b)])) -
5696           f (interval_lowerbound (interval [(a,b)]))))`` THENL
5697   [ASM_SIMP_TAC std_ss [GSYM INTERVAL_EQ_EMPTY, REAL_ARITH ``a <= b ==> ~(b < a:real)``,
5698                 REAL_LT_IMP_LE, CONTENT_EQ_0,
5699                 INTERVAL_LOWERBOUND, INTERVAL_UPPERBOUND] THEN
5700    SIMP_TAC std_ss [REAL_ARITH ``b <= a ==> (b < a <=> ~(b = a:real))``] THEN
5701    SIMP_TAC std_ss [METIS [] ``(if ~p then x else y) = (if p then y else x)``] THEN
5702    SIMP_TAC std_ss [INTERVAL_LOWERBOUND, INTERVAL_UPPERBOUND, REAL_LE_REFL] THEN
5703    SIMP_TAC std_ss [REAL_SUB_REFL, COND_ID] THEN
5704    REPEAT GEN_TAC THEN DISCH_TAC THEN ONCE_REWRITE_TAC [EQ_SYM_EQ] THEN
5705    FIRST_ASSUM(ASSUME_TAC o MATCH_MP REAL_LT_TRANS) THEN
5706    ASM_SIMP_TAC std_ss [INTERVAL_LOWERBOUND, INTERVAL_UPPERBOUND,
5707                 REAL_ARITH ``b < a ==> ~(a < b:real)``, REAL_LT_IMP_LE] THEN
5708    MESON_TAC[REAL_ARITH ``(c - a) + (b - c):real = b - a``],
5709    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
5710  ASM_SIMP_TAC std_ss [GSYM INTERVAL_EQ_EMPTY, GSYM REAL_NOT_LE] THEN
5711  DISCH_THEN(SUBST1_TAC o SYM) THEN
5712  FIRST_ASSUM(ASSUME_TAC o MATCH_MP TAGGED_DIVISION_OF_FINITE) THEN
5713  ASM_SIMP_TAC std_ss [GSYM sum_def] THEN MATCH_MP_TAC SUM_EQ THEN
5714  SIMP_TAC std_ss [FORALL_PROD] THEN
5715  METIS_TAC[TAGGED_DIVISION_OF, MEMBER_NOT_EMPTY]
5716QED
5717
5718(* ------------------------------------------------------------------------- *)
5719(* A useful lemma allowing us to factor out the content size.                *)
5720(* ------------------------------------------------------------------------- *)
5721
5722Theorem HAS_INTEGRAL_FACTOR_CONTENT:
5723   !f:real->real i a b.
5724      (f has_integral i) (interval[a,b]) <=>
5725      (!e. &0 < e
5726           ==> ?d. gauge d /\
5727                   (!p. p tagged_division_of interval[a,b] /\ d FINE p
5728                        ==> abs (sum p (\(x,k). content k * f x) - i)
5729                            <= e * content(interval[a,b])))
5730Proof
5731  REPEAT GEN_TAC THEN
5732  ASM_CASES_TAC ``content(interval[a:real,b]) = &0`` THENL
5733   [MP_TAC(SPECL [``f:real->real``, ``a:real``, ``b:real``]
5734     SUM_CONTENT_NULL) THEN
5735    ASM_SIMP_TAC std_ss [HAS_INTEGRAL_NULL_EQ, REAL_SUB_LZERO, ABS_NEG] THEN
5736    DISCH_TAC THEN REWRITE_TAC[REAL_MUL_RZERO, ABS_LE_0] THEN
5737    METIS_TAC[FINE_DIVISION_EXISTS, GAUGE_TRIVIAL, REAL_LT_01],
5738    ALL_TAC] THEN
5739  REWRITE_TAC[has_integral] THEN EQ_TAC THEN DISCH_TAC THEN
5740  X_GEN_TAC ``e:real`` THEN DISCH_TAC THENL
5741   [FIRST_X_ASSUM(MP_TAC o SPEC ``e * content(interval[a:real,b])``) THEN
5742    ASM_SIMP_TAC std_ss [REAL_LT_MUL, CONTENT_LT_NZ] THEN METIS_TAC[REAL_LT_IMP_LE],
5743    ALL_TAC] THEN
5744  FIRST_X_ASSUM(MP_TAC o SPEC ``e / &2 / content(interval[a:real,b])``) THEN
5745  ASM_SIMP_TAC arith_ss [REAL_LT_DIV, CONTENT_LT_NZ, REAL_LT] THEN
5746  ASM_SIMP_TAC std_ss [REAL_DIV_RMUL] THEN
5747  KNOW_TAC ``!e x:real. &0 < e /\ x <= e / &2 ==> x < e`` THENL
5748  [SIMP_TAC std_ss [REAL_LE_RDIV_EQ, REAL_ARITH ``0 < 2:real``] THEN
5749   REAL_ARITH_TAC, DISCH_TAC] THEN METIS_TAC[]
5750QED
5751
5752(* ------------------------------------------------------------------------- *)
5753(* Attempt a systematic general set of "offset" results for components.      *)
5754(* ------------------------------------------------------------------------- *)
5755
5756Theorem GAUGE_MODIFY:
5757   !f:real->real.
5758      (!s. open s ==> open {x | f(x) IN s})
5759      ==> !d. gauge d ==> gauge (\x y. d (f x) (f y))
5760Proof
5761  GEN_TAC THEN DISCH_TAC THEN GEN_TAC THEN
5762  SIMP_TAC std_ss [gauge_def, IN_DEF] THEN DISCH_TAC THEN
5763  X_GEN_TAC ``x:real`` THEN
5764  FIRST_X_ASSUM(MP_TAC o SPEC ``(f:real->real) x``) THEN
5765  DISCH_THEN(ANTE_RES_THEN MP_TAC o CONJUNCT2) THEN
5766  MATCH_MP_TAC EQ_IMPLIES THEN
5767  AP_TERM_TAC THEN SIMP_TAC std_ss [EXTENSION, GSPECIFICATION] THEN
5768  SIMP_TAC std_ss [IN_DEF]
5769QED
5770
5771(* ------------------------------------------------------------------------- *)
5772(* Integrabibility on subintervals.                                          *)
5773(* ------------------------------------------------------------------------- *)
5774
5775Theorem OPERATIVE_INTEGRABLE:
5776   !f. operative (/\) (\i. f integrable_on i)
5777Proof
5778  GEN_TAC THEN REWRITE_TAC[operative, NEUTRAL_AND] THEN CONJ_TAC THENL
5779   [REWRITE_TAC[integrable_on] THEN MESON_TAC[HAS_INTEGRAL_NULL_EQ],
5780    REPEAT STRIP_TAC THEN EQ_TAC THEN ASM_SIMP_TAC std_ss [INTEGRABLE_SPLIT] THEN
5781    REWRITE_TAC[integrable_on] THEN METIS_TAC[HAS_INTEGRAL_SPLIT]]
5782QED
5783
5784Theorem INTEGRABLE_SUBINTERVAL:
5785   !f:real->real a b c d.
5786        f integrable_on interval[a,b] /\
5787        interval[c,d] SUBSET interval[a,b]
5788        ==> f integrable_on interval[c,d]
5789Proof
5790  REPEAT STRIP_TAC THEN
5791  ASM_CASES_TAC ``interval[c:real,d] = {}`` THENL
5792   [ASM_REWRITE_TAC[integrable_on] THEN
5793    METIS_TAC[HAS_INTEGRAL_NULL, CONTENT_EMPTY, EMPTY_AS_INTERVAL],
5794    METIS_TAC[OPERATIVE_INTEGRABLE, OPERATIVE_DIVISION_AND,
5795                  PARTIAL_DIVISION_EXTEND_1]]
5796QED
5797
5798(* ------------------------------------------------------------------------- *)
5799(* Combining adjacent intervals in 1 dimension.                              *)
5800(* ------------------------------------------------------------------------- *)
5801
5802Theorem HAS_INTEGRAL_COMBINE:
5803   !f i:real j a b c.
5804        a <= c /\ c <= b /\
5805        (f has_integral i) (interval[a,c]) /\
5806        (f has_integral j) (interval[c,b])
5807        ==> (f has_integral (i + j)) (interval[a,b])
5808Proof
5809  REPEAT STRIP_TAC THEN MP_TAC
5810   ((CONJUNCT2 o REWRITE_RULE
5811     [MATCH_MP OPERATIVE_1_LE(MATCH_MP MONOIDAL_LIFTED MONOIDAL_REAL_ADD)])
5812    (ISPEC ``f:real->real`` OPERATIVE_INTEGRAL)) THEN
5813  DISCH_THEN(MP_TAC o SPECL [``a:real``, ``b:real``, ``c:real``]) THEN
5814  ASM_REWRITE_TAC[] THEN BETA_TAC THEN
5815  REPEAT(COND_CASES_TAC THEN
5816   ASM_SIMP_TAC std_ss [lifted, NOT_NONE_SOME, SOME_11, option_CLAUSES]) THEN
5817  METIS_TAC[INTEGRABLE_INTEGRAL, HAS_INTEGRAL_UNIQUE, integrable_on,
5818                INTEGRAL_UNIQUE]
5819QED
5820
5821Theorem INTEGRAL_COMBINE:
5822   !f:real->real a b c.
5823        a <= c /\ c <= b /\ f integrable_on (interval[a,b])
5824        ==> (integral(interval[a,c]) f + integral(interval[c,b]) f =
5825             integral(interval[a,b]) f)
5826Proof
5827  REPEAT STRIP_TAC THEN CONV_TAC SYM_CONV THEN
5828  MATCH_MP_TAC INTEGRAL_UNIQUE THEN MATCH_MP_TAC HAS_INTEGRAL_COMBINE THEN
5829  EXISTS_TAC ``c:real`` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THEN
5830  MATCH_MP_TAC INTEGRABLE_INTEGRAL THEN
5831  MATCH_MP_TAC INTEGRABLE_SUBINTERVAL THEN
5832  MAP_EVERY EXISTS_TAC [``a:real``, ``b:real``] THEN
5833  ASM_REWRITE_TAC[SUBSET_INTERVAL, REAL_LE_REFL]
5834QED
5835
5836Theorem INTEGRABLE_COMBINE:
5837   !f a b c.
5838        a <= c /\ c <= b /\
5839        f integrable_on interval[a,c] /\
5840        f integrable_on interval[c,b]
5841        ==> f integrable_on interval[a,b]
5842Proof
5843  REWRITE_TAC[integrable_on] THEN MESON_TAC[HAS_INTEGRAL_COMBINE]
5844QED
5845
5846(* ------------------------------------------------------------------------- *)
5847(* Reduce integrability to "local" integrability.                            *)
5848(* ------------------------------------------------------------------------- *)
5849
5850Theorem INTEGRABLE_ON_LITTLE_SUBINTERVALS:
5851   !f:real->real a b.
5852        (!x. x IN interval[a,b]
5853             ==> ?d. &0 < d /\
5854                     !u v. x IN interval[u,v] /\
5855                           interval[u,v] SUBSET ball(x,d) /\
5856                           interval[u,v] SUBSET interval[a,b]
5857                           ==> f integrable_on interval[u,v])
5858        ==> f integrable_on interval[a,b]
5859Proof
5860  REPEAT GEN_TAC THEN
5861  SIMP_TAC std_ss [RIGHT_IMP_EXISTS_THM, GAUGE_EXISTENCE_LEMMA] THEN
5862  SIMP_TAC std_ss [SKOLEM_THM, FORALL_AND_THM] THEN
5863  DISCH_THEN(X_CHOOSE_THEN ``d:real->real`` STRIP_ASSUME_TAC) THEN
5864  MP_TAC(ISPECL [``\x:real. ball(x,d x)``, ``a:real``, ``b:real``]
5865                FINE_DIVISION_EXISTS) THEN
5866  ASM_SIMP_TAC std_ss [GAUGE_BALL_DEPENDENT, LEFT_IMP_EXISTS_THM] THEN
5867  X_GEN_TAC ``p:real#(real->bool)->bool`` THEN STRIP_TAC THEN
5868  MP_TAC(MATCH_MP (REWRITE_RULE[IMP_CONJ] OPERATIVE_DIVISION_AND)
5869         (ISPEC ``f:real->real`` OPERATIVE_INTEGRABLE)) THEN
5870  DISCH_THEN(MP_TAC o SPECL
5871   [``IMAGE SND (p:real#(real->bool)->bool)``, ``a:real``, ``b:real``]) THEN
5872  ASM_SIMP_TAC std_ss [DIVISION_OF_TAGGED_DIVISION] THEN
5873  DISCH_THEN(SUBST1_TAC o SYM) THEN REWRITE_TAC[FORALL_IN_IMAGE] THEN
5874  SIMP_TAC std_ss [FORALL_PROD] THEN
5875  MAP_EVERY X_GEN_TAC [``x:real``, ``k:real->bool``] THEN DISCH_TAC THEN
5876  UNDISCH_TAC `` p tagged_division_of interval [(a,b)]`` THEN DISCH_TAC THEN
5877  FIRST_ASSUM(MP_TAC o REWRITE_RULE [TAGGED_DIVISION_OF]) THEN
5878  STRIP_TAC THEN UNDISCH_TAC `` !(x :real) (k :real -> bool).
5879            (x,k) IN (p :real # (real -> bool) -> bool) ==>
5880            x IN k /\ k SUBSET interval [((a :real),(b :real))] /\
5881            ?(a :real) (b :real). k = interval [(a,b)]`` THEN
5882  UNDISCH_TAC ``(\x. ball (x,d x)) FINE p`` THEN DISCH_TAC THEN
5883  FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [FINE]) THEN
5884  SIMP_TAC std_ss [AND_IMP_INTRO, GSYM FORALL_AND_THM] THEN
5885  DISCH_THEN(MP_TAC o SPECL [``x:real``, ``k:real->bool``]) THEN
5886  ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[SUBSET_DEF]
5887QED
5888
5889(* ------------------------------------------------------------------------- *)
5890(* Second FTC or existence of antiderivative.                                *)
5891(* ------------------------------------------------------------------------- *)
5892
5893Theorem INTEGRAL_HAS_VECTOR_DERIVATIVE_POINTWISE:
5894   !f:real->real a b x.
5895        f integrable_on interval[a,b] /\ x IN interval[a,b] /\
5896        f continuous (at x within interval[a,b])
5897        ==> ((\u. integral (interval [a,u]) f) has_vector_derivative f x)
5898            (at x within interval [a,b])
5899Proof
5900  REWRITE_TAC[IN_INTERVAL] THEN REPEAT STRIP_TAC THEN
5901  REWRITE_TAC[has_vector_derivative, HAS_DERIVATIVE_WITHIN_ALT] THEN
5902  CONJ_TAC
5903  >- (ONCE_REWRITE_TAC [REAL_MUL_COMM] \\
5904      HO_MATCH_MP_TAC LINEAR_COMPOSE_CMUL \\
5905      REWRITE_TAC [LINEAR_ID]) \\
5906  X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN REWRITE_TAC[IN_INTERVAL] THEN
5907  Q.PAT_X_ASSUM ‘f continuous (at x within interval [a,b])’
5908    (MP_TAC o REWRITE_RULE [continuous_within]) THEN
5909  DISCH_THEN(MP_TAC o SPEC ``e:real``) THEN
5910  ASM_REWRITE_TAC[IN_INTERVAL, dist] THEN
5911  STRIP_TAC THEN EXISTS_TAC ``d:real`` THEN
5912  ASM_REWRITE_TAC[] THEN X_GEN_TAC ``y:real`` THEN STRIP_TAC THEN
5913  SIMP_TAC std_ss [] THEN
5914 (* stage work *)
5915  DISJ_CASES_TAC(REAL_ARITH ``x <= y \/ y <= x:real``) THENL
5916  [ (* goal 1 (of 2) *)
5917    ASM_SIMP_TAC std_ss [REAL_ARITH ``x <= y ==> (abs(y - x) = y - x:real)``],
5918    (* goal 2 (of 2) *)
5919    ONCE_REWRITE_TAC[REAL_ARITH
5920     ``fy - fx - (x - y) * c:real = -(fx - fy - (y - x) * c)``] THEN
5921    ASM_SIMP_TAC std_ss [ABS_NEG,
5922                         REAL_ARITH ``x <= y ==> (abs(x - y) = y - x:real)``]
5923  ] THEN
5924 (* shared tactics *)
5925  ASM_SIMP_TAC std_ss [GSYM CONTENT_CLOSED_INTERVAL] THEN
5926 (* applying a key theorem *)
5927  MATCH_MP_TAC HAS_INTEGRAL_BOUND THEN
5928  EXISTS_TAC ``(\u. f(u) - f(x)):real->real`` THEN
5929  (ASM_SIMP_TAC std_ss [REAL_LT_IMP_LE] THEN
5930   reverse CONJ_TAC
5931   >- (Q.X_GEN_TAC ‘z’ THEN REPEAT STRIP_TAC THEN
5932       MATCH_MP_TAC REAL_LT_IMP_LE THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
5933       REPEAT(POP_ASSUM MP_TAC) THEN
5934       SIMP_TAC std_ss [IN_INTERVAL] THEN
5935       REAL_ARITH_TAC) THEN
5936   HO_MATCH_MP_TAC HAS_INTEGRAL_SUB THEN REWRITE_TAC[HAS_INTEGRAL_CONST]) THENL
5937   [ (* goal 1 (of 2) *)
5938     SUBGOAL_THEN
5939      ``(integral(interval[a,x]) f + integral(interval[x,y]) f =
5940         integral(interval[a,y]) f) /\
5941       ((f:real->real) has_integral integral(interval[x,y]) f)
5942        (interval[x,y])``
5943      (fn th => METIS_TAC[th, REAL_ARITH ``(a + b = c:real) ==> (c - a = b:real)``]),
5944     (* goal 2 (of 2) *)
5945     SUBGOAL_THEN
5946      ``(integral(interval[a,y]) f + integral(interval[y,x]) f =
5947         integral(interval[a,x]) f) /\
5948       ((f:real->real) has_integral integral(interval[y,x]) f)
5949        (interval[y,x])``
5950      (fn th => METIS_TAC[th,REAL_ARITH ``(a + b = c:real) ==> (c - a = b:real)``])
5951   ] THEN
5952 (* shared tactics, again *)
5953   (CONJ_TAC THENL
5954     [MATCH_MP_TAC INTEGRAL_COMBINE,
5955      MATCH_MP_TAC INTEGRABLE_INTEGRAL] THEN
5956    ASM_REWRITE_TAC[] THEN
5957    MATCH_MP_TAC INTEGRABLE_SUBINTERVAL THEN
5958    MAP_EVERY EXISTS_TAC [``a:real``, ``b:real``] THEN
5959    ASM_SIMP_TAC std_ss [INTEGRABLE_CONTINUOUS, SUBSET_INTERVAL, REAL_LE_REFL] THEN
5960    ASM_REAL_ARITH_TAC)
5961QED
5962
5963Theorem INTEGRAL_HAS_VECTOR_DERIVATIVE_NEG_POINTWISE:
5964   !f:real->real a b x.
5965        f integrable_on interval[a,b] /\ x IN interval[a,b] /\
5966        f continuous (at x within interval[a,b])
5967        ==> ((\u. integral (interval [u,b]) f) has_vector_derivative -f x)
5968            (at x within interval [a,b])
5969Proof
5970  REWRITE_TAC[IN_INTERVAL] THEN REPEAT STRIP_TAC THEN
5971  REWRITE_TAC[has_vector_derivative, HAS_DERIVATIVE_WITHIN_ALT] THEN
5972  CONJ_TAC
5973  >- (ONCE_REWRITE_TAC [REAL_MUL_COMM] \\
5974      HO_MATCH_MP_TAC LINEAR_COMPOSE_CMUL \\
5975      REWRITE_TAC [LINEAR_ID]) \\
5976  X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN REWRITE_TAC[IN_INTERVAL] THEN
5977  Q.PAT_X_ASSUM ‘f continuous (at x within interval [a,b])’
5978    (MP_TAC o REWRITE_RULE [continuous_within]) THEN
5979  DISCH_THEN(MP_TAC o SPEC ``e:real``) THEN
5980  ASM_REWRITE_TAC[IN_INTERVAL, dist] THEN
5981  STRIP_TAC THEN EXISTS_TAC ``d:real`` THEN
5982  ASM_REWRITE_TAC[] THEN X_GEN_TAC ``y:real`` THEN STRIP_TAC THEN
5983  SIMP_TAC std_ss [] THEN
5984 (* stage work *)
5985  DISJ_CASES_TAC(REAL_ARITH ``x <= y \/ y <= x:real``) THENL
5986  [ (* goal 1 (of 2) *)
5987    ASM_SIMP_TAC std_ss [REAL_ARITH ``x <= y ==> (abs(y - x) = y - x:real)``],
5988    (* goal 2 (of 2) *)
5989    ONCE_REWRITE_TAC[REAL_ARITH
5990     ``fy - fx - (x - y) * c:real = -(fx - fy - (y - x) * c)``] THEN
5991    ASM_SIMP_TAC std_ss [ABS_NEG,
5992                         REAL_ARITH ``x <= y ==> (abs(x - y) = y - x:real)``]
5993  ] THEN
5994 (* shared tactics *)
5995  ASM_SIMP_TAC std_ss [GSYM CONTENT_CLOSED_INTERVAL] THEN
5996 (* applying a key theorem *)
5997  MATCH_MP_TAC HAS_INTEGRAL_BOUND THEN
5998  EXISTS_TAC ``(\u. f(x) - f(u)):real->real`` THEN
5999  (ASM_SIMP_TAC std_ss [REAL_LT_IMP_LE] THEN
6000   reverse CONJ_TAC
6001   >- (Q.X_GEN_TAC ‘z’ >> rpt STRIP_TAC \\
6002       MATCH_MP_TAC REAL_LT_IMP_LE \\
6003       ONCE_REWRITE_TAC [ABS_SUB] \\
6004       FIRST_X_ASSUM MATCH_MP_TAC \\
6005       REPEAT(POP_ASSUM MP_TAC) \\
6006       SIMP_TAC std_ss [IN_INTERVAL] \\
6007       REAL_ARITH_TAC) \\
6008   REWRITE_TAC [REAL_MUL_RNEG, REAL_SUB_RNEG,
6009                REAL_ARITH “a - b + c = c - (b - a :real)”] \\
6010   HO_MATCH_MP_TAC HAS_INTEGRAL_SUB THEN REWRITE_TAC[HAS_INTEGRAL_CONST]) THENL
6011   [ (* goal 1 (of 2) *)
6012     SUBGOAL_THEN
6013      ``(integral(interval[x,y]) f + integral(interval[y,b]) f =
6014         integral(interval[x,b]) f) /\
6015       ((f:real->real) has_integral integral(interval[x,y]) f)
6016        (interval[x,y])``
6017      (fn th => METIS_TAC[th, REAL_ARITH ``(a + b = c:real) ==> (c - b = a:real)``]),
6018     (* goal 2 (of 2) *)
6019     SUBGOAL_THEN
6020      ``(integral(interval[y,x]) f + integral(interval[x,b]) f =
6021         integral(interval[y,b]) f) /\
6022       ((f:real->real) has_integral integral(interval[y,x]) f)
6023        (interval[y,x])``
6024      (fn th => METIS_TAC[th,REAL_ARITH ``(a + b = c:real) ==> (c - b = a:real)``])
6025   ] THEN
6026 (* shared tactics, again *)
6027   (CONJ_TAC THENL
6028     [MATCH_MP_TAC INTEGRAL_COMBINE,
6029      MATCH_MP_TAC INTEGRABLE_INTEGRAL] THEN
6030    ASM_REWRITE_TAC[] THEN
6031    MATCH_MP_TAC INTEGRABLE_SUBINTERVAL THEN
6032    MAP_EVERY EXISTS_TAC [``a:real``, ``b:real``] THEN
6033    ASM_SIMP_TAC std_ss [INTEGRABLE_CONTINUOUS, SUBSET_INTERVAL, REAL_LE_REFL] THEN
6034    ASM_REAL_ARITH_TAC)
6035QED
6036
6037Theorem INTEGRAL_HAS_VECTOR_DERIVATIVE:
6038   !f:real->real a b.
6039     f continuous_on interval[a,b]
6040     ==> !x. x IN interval[a,b]
6041             ==> ((\u. integral (interval[a,u]) f) has_vector_derivative f(x))
6042                 (at x within interval[a,b])
6043Proof
6044  REPEAT STRIP_TAC THEN
6045  MATCH_MP_TAC INTEGRAL_HAS_VECTOR_DERIVATIVE_POINTWISE THEN
6046  ASM_MESON_TAC[INTEGRABLE_CONTINUOUS, CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN]
6047QED
6048
6049Theorem INTEGRAL_HAS_VECTOR_DERIVATIVE_NEG:
6050   !f:real->real a b.
6051     f continuous_on interval[a,b]
6052     ==> !x. x IN interval[a,b]
6053             ==> ((\u. integral (interval[u,b]) f) has_vector_derivative -f(x))
6054                 (at x within interval[a,b])
6055Proof
6056  REPEAT STRIP_TAC THEN
6057  MATCH_MP_TAC INTEGRAL_HAS_VECTOR_DERIVATIVE_NEG_POINTWISE THEN
6058  ASM_MESON_TAC[INTEGRABLE_CONTINUOUS, CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN]
6059QED
6060
6061Theorem ANTIDERIVATIVE_CONTINUOUS:
6062   !f:real->real a b.
6063     f continuous_on interval[a,b]
6064     ==> ?g. !x. x IN interval[a,b]
6065                 ==> (g has_vector_derivative f(x))
6066                          (at x within interval[a,b])
6067Proof
6068  METIS_TAC[INTEGRAL_HAS_VECTOR_DERIVATIVE]
6069QED
6070
6071(* ------------------------------------------------------------------------- *)
6072(* General "twiddling" for interval-to-interval function image.              *)
6073(* ------------------------------------------------------------------------- *)
6074
6075Theorem lemma0[local]:
6076    (!x k. (x,k) IN IMAGE (\(x,k). f x,g k) p ==> P x k) <=>
6077    (!x k. (x,k) IN p ==> P (f x) (g k))
6078Proof
6079    SIMP_TAC std_ss [IN_IMAGE, EXISTS_PROD, PAIR_EQ] THEN MESON_TAC[]
6080QED
6081
6082Theorem lemma1[local]:
6083    {k | ?x. (x,k) IN p} = IMAGE SND p
6084Proof
6085    SIMP_TAC std_ss [EXTENSION, EXISTS_PROD, IN_IMAGE, GSPECIFICATION] THEN
6086    MESON_TAC[]
6087QED
6088
6089Theorem lemma2[local]:
6090    (SND o (\(x,k). f x,g k)) = (g o SND)
6091Proof
6092    SIMP_TAC std_ss [FUN_EQ_THM, FORALL_PROD, o_DEF]
6093QED
6094
6095Theorem HAS_INTEGRAL_TWIDDLE:
6096   !f:real->real (g:real->real) h r i a b.
6097      &0 < r /\
6098      (!x. h(g x) = x) /\ (!x. g(h x) = x) /\ (!x. g continuous at x) /\
6099      (!u v. ?w z. IMAGE g (interval[u,v]) = interval[w,z]) /\
6100      (!u v. ?w z. IMAGE h (interval[u,v]) = interval[w,z]) /\
6101      (!u v. content(IMAGE g (interval[u,v])) = r * content(interval[u,v])) /\
6102      (f has_integral i) (interval[a,b])
6103      ==> ((\x. f(g x)) has_integral (inv r) * i) (IMAGE h (interval[a,b]))
6104Proof
6105  REPEAT GEN_TAC THEN ASM_CASES_TAC ``interval[a:real,b] = {}`` THEN
6106  ASM_SIMP_TAC std_ss [IMAGE_EMPTY, IMAGE_INSERT, HAS_INTEGRAL_EMPTY_EQ, REAL_MUL_RZERO] THEN
6107  REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
6108  REWRITE_TAC[has_integral] THEN
6109  ASM_REWRITE_TAC[has_integral_def, has_integral_compact_interval] THEN
6110  DISCH_TAC THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
6111  FIRST_X_ASSUM(MP_TAC o SPEC ``e * r:real``) THEN
6112  ASM_SIMP_TAC std_ss [REAL_LT_MUL] THEN
6113  DISCH_THEN(X_CHOOSE_THEN ``d:real->real->bool`` STRIP_ASSUME_TAC) THEN
6114  EXISTS_TAC ``\x y:real. (d:real->real->bool) (g x) (g y)`` THEN
6115  CONJ_TAC THENL
6116   [UNDISCH_TAC ``gauge d`` THEN DISCH_TAC THEN
6117    FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [gauge_def]) THEN
6118    SIMP_TAC std_ss [gauge_def, IN_DEF, FORALL_AND_THM] THEN
6119    STRIP_TAC THEN X_GEN_TAC ``x:real`` THEN
6120    SUBGOAL_THEN ``(\y:real. (d:real->real->bool) (g x) (g y)) =
6121                  {y | g y IN (d (g x))}`` SUBST1_TAC
6122    THENL [SET_TAC[], ASM_SIMP_TAC std_ss [CONTINUOUS_OPEN_PREIMAGE_UNIV]],
6123    ALL_TAC] THEN
6124  X_GEN_TAC ``p:real#(real->bool)->bool`` THEN STRIP_TAC THEN
6125  FIRST_X_ASSUM(MP_TAC o SPEC
6126   ``IMAGE (\(x,k). (g:real->real) x, IMAGE g k) p``) THEN
6127  KNOW_TAC ``IMAGE (\((x :real),(k :real -> bool)). ((g :real -> real) x,IMAGE g k))
6128       (p :real # (real -> bool) -> bool) tagged_division_of
6129     interval [((a :real),(b :real))] /\
6130     (d :real -> real -> bool) FINE
6131     IMAGE (\((x :real),(k :real -> bool)). (g x,IMAGE g k)) p `` THENL
6132   [CONJ_TAC THENL
6133     [ALL_TAC,
6134      UNDISCH_TAC ``(\(x :real) (y :real).
6135              (d :real -> real -> bool) ((g :real -> real) x) (g y)) FINE
6136           (p :real # (real -> bool) -> bool)`` THEN DISCH_TAC THEN
6137      FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [FINE]) THEN
6138      SIMP_TAC std_ss [FINE, lemma0] THEN
6139      STRIP_TAC THEN REPEAT GEN_TAC THEN DISCH_THEN(ANTE_RES_THEN MP_TAC) THEN
6140      ASM_SET_TAC[]] THEN
6141    SUBGOAL_THEN
6142     ``interval[a,b] = IMAGE ((g:real->real) o h) (interval[a,b])``
6143    SUBST1_TAC THENL [SIMP_TAC std_ss [o_DEF] THEN ASM_SET_TAC[], ALL_TAC] THEN
6144    SUBGOAL_THEN ``?u v. IMAGE (h:real->real) (interval[a,b]) =
6145                        interval[u,v]``
6146    (REPEAT_TCL CHOOSE_THEN
6147      (fn th => SUBST_ALL_TAC th THEN ASSUME_TAC th)) THENL
6148      [METIS_TAC[], ALL_TAC] THEN
6149    UNDISCH_TAC ``p tagged_division_of interval [(u,v)]`` THEN DISCH_TAC THEN
6150    FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [TAGGED_DIVISION_OF]) THEN
6151    SIMP_TAC std_ss [TAGGED_DIVISION_OF, IMP_CONJ, RIGHT_FORALL_IMP_THM] THEN
6152    SIMP_TAC std_ss [lemma0] THEN REWRITE_TAC[AND_IMP_INTRO, GSYM CONJ_ASSOC] THEN
6153    REPEAT GEN_TAC THEN STRIP_TAC THEN CONJ_TAC THENL
6154     [ASM_SIMP_TAC std_ss [IMAGE_FINITE], ALL_TAC] THEN
6155    CONJ_TAC THENL
6156     [MAP_EVERY X_GEN_TAC [``x:real``, ``k:real->bool``] THEN
6157      DISCH_TAC THEN
6158      UNDISCH_TAC
6159       `` !x:real k.
6160             (x,k) IN p ==>
6161             x IN k /\ k SUBSET interval [(u,v)] /\
6162             ?a b. k = interval [(a,b)]`` THEN
6163      DISCH_THEN(MP_TAC o SPECL [``x:real``, ``k:real->bool``]) THEN
6164      ASM_SIMP_TAC std_ss [] THEN
6165      REPEAT(MATCH_MP_TAC MONO_AND THEN CONJ_TAC) THENL
6166       [SET_TAC[],
6167        REWRITE_TAC[IMAGE_COMPOSE] THEN ASM_SET_TAC[],
6168        STRIP_TAC THEN ASM_REWRITE_TAC[]],
6169      ALL_TAC] THEN
6170    CONJ_TAC THENL
6171     [ALL_TAC,
6172      ASM_REWRITE_TAC[IMAGE_COMPOSE] THEN FIRST_X_ASSUM(SUBST1_TAC o SYM) THEN
6173      SIMP_TAC std_ss [lemma1, GSYM IMAGE_COMPOSE, lemma2] THEN
6174      METIS_TAC [IMAGE_COMPOSE, GSYM IMAGE_BIGUNION, ETA_AX]] THEN
6175    MAP_EVERY X_GEN_TAC [``x1:real``, ``k1:real->bool``] THEN DISCH_TAC THEN
6176    ONCE_REWRITE_TAC [REAL_ARITH ``(a <> b) = ~(a = b:real)``, GSYM DE_MORGAN_THM] THEN
6177    MAP_EVERY X_GEN_TAC [``x2:real``, ``k2:real->bool``] THEN
6178    DISCH_THEN (CONJUNCTS_THEN2 ASSUME_TAC (MP_TAC o REWRITE_RULE [GSYM PAIR_EQ])) THEN
6179    DISCH_TAC THEN
6180    UNDISCH_TAC
6181     ``!x1:real k1:real->bool.
6182              (x1,k1) IN p ==>
6183             !x2 k2.
6184               (x2,k2) IN p /\ (x1 <> x2 \/ k1 <> k2) ==>
6185               (interior k1 INTER interior k2 = {})`` THEN
6186    DISCH_THEN(MP_TAC o SPECL [``x1:real``, ``k1:real->bool``]) THEN
6187    ASM_REWRITE_TAC[] THEN
6188    DISCH_THEN(MP_TAC o SPECL [``x2:real``, ``k2:real->bool``]) THEN
6189    ASM_REWRITE_TAC[] THEN
6190    KNOW_TAC ``((x1 :real) <> (x2 :real)) \/
6191               ((k1 :real -> bool) <> (k2 :real -> bool))`` THENL
6192     [METIS_TAC[PAIR_EQ], DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
6193    MATCH_MP_TAC(SET_RULE
6194     ``interior(IMAGE f s) SUBSET IMAGE f (interior s) /\
6195      interior(IMAGE f t) SUBSET IMAGE f (interior t) /\
6196      (!x y. (f x = f y) ==> (x = y))
6197      ==> (interior s INTER interior t = {})
6198          ==> (interior(IMAGE f s) INTER interior(IMAGE f t) = {})``) THEN
6199    REPEAT CONJ_TAC THEN TRY(MATCH_MP_TAC INTERIOR_IMAGE_SUBSET) THEN
6200    ASM_MESON_TAC[], DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
6201  W(fn (asl,w) => MP_TAC(PART_MATCH (lhand o rand) SUM_IMAGE
6202                (lhand(rand(lhand(lhand w)))))) THEN
6203  KNOW_TAC ``(!(x :real # (real -> bool)) (y :real # (real -> bool)).
6204        x IN (p :real # (real -> bool) -> bool) /\ y IN p /\
6205        ((\((x :real),(k :real -> bool)). ((g :real -> real) x,IMAGE g k))
6206           x =
6207         (\((x :real),(k :real -> bool)). (g x,IMAGE g k)) y) ==>
6208        (x = y))`` THENL
6209   [FIRST_ASSUM(ASSUME_TAC o MATCH_MP TAGGED_DIVISION_OF_FINITE) THEN
6210    ASM_SIMP_TAC std_ss [FORALL_PROD, PAIR_EQ] THEN
6211    REPEAT GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
6212    DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
6213    MATCH_MP_TAC MONO_AND THEN CONJ_TAC THEN ASM_SET_TAC[],
6214    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
6215  DISCH_THEN SUBST1_TAC THEN SIMP_TAC std_ss [o_DEF, LAMBDA_PROD] THEN
6216  DISCH_TAC THEN MATCH_MP_TAC REAL_LT_LCANCEL_IMP THEN
6217  EXISTS_TAC ``abs r:real`` THEN ASM_SIMP_TAC std_ss [REAL_ARITH ``&0 < x ==> &0 < abs x:real``] THEN
6218  REWRITE_TAC[GSYM ABS_MUL] THEN ASM_SIMP_TAC std_ss [REAL_LT_IMP_LE,
6219   REAL_ARITH ``0 < r ==> (abs r = r:real)``] THEN
6220  FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
6221   ``x < a * b ==> (x = y) ==> y < b * a:real``)) THEN
6222  AP_TERM_TAC THEN REWRITE_TAC[REAL_SUB_LDISTRIB] THEN
6223  ASM_SIMP_TAC std_ss [REAL_MUL_ASSOC, REAL_MUL_RINV, REAL_LT_IMP_NE] THEN
6224  REWRITE_TAC[REAL_MUL_LID, GSYM SUM_LMUL] THEN
6225  AP_THM_TAC THEN AP_TERM_TAC THEN MATCH_MP_TAC SUM_EQ THEN
6226  SIMP_TAC std_ss [FORALL_PROD, REAL_MUL_ASSOC] THEN
6227  REPEAT STRIP_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN
6228  METIS_TAC[TAGGED_DIVISION_OF]
6229QED
6230
6231(* ------------------------------------------------------------------------- *)
6232(* Special case of a basic affine transformation.                            *)
6233(* ------------------------------------------------------------------------- *)
6234
6235Theorem INTERVAL_IMAGE_AFFINITY_INTERVAL:
6236   !a b m c. ?u v. IMAGE (\x. m * x + c) (interval[a,b]) = interval[u,v]
6237Proof
6238  REWRITE_TAC[IMAGE_AFFINITY_INTERVAL] THEN
6239  METIS_TAC[EMPTY_AS_INTERVAL]
6240QED
6241
6242Theorem CONTENT_IMAGE_AFFINITY_INTERVAL:
6243   !a b:real m c.
6244        content(IMAGE (\x. m * x + c) (interval[a,b])) =
6245        (abs m) pow  1n * content(interval[a,b])
6246Proof
6247  REPEAT STRIP_TAC THEN REWRITE_TAC[IMAGE_AFFINITY_INTERVAL] THEN
6248  COND_CASES_TAC THEN ASM_REWRITE_TAC[CONTENT_EMPTY, REAL_MUL_RZERO] THEN
6249  RULE_ASSUM_TAC(REWRITE_RULE[INTERVAL_NE_EMPTY]) THEN COND_CASES_TAC THEN
6250  W(fn (asl,w) => MP_TAC(PART_MATCH (lhand o rand) CONTENT_CLOSED_INTERVAL
6251                (lhs w))) THENL
6252  [KNOW_TAC ``m * a + c <= m * b + c:real`` THENL
6253     [MATCH_MP_TAC REAL_LE_ADD2 THEN REWRITE_TAC [REAL_LE_REFL] THEN
6254      MATCH_MP_TAC REAL_LE_LMUL_IMP THEN ASM_REWRITE_TAC [],
6255      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
6256  DISCH_THEN SUBST1_TAC THEN ASM_SIMP_TAC std_ss [abs, CONTENT_CLOSED_INTERVAL, POW_1] THEN
6257  REAL_ARITH_TAC, ALL_TAC] THEN
6258   KNOW_TAC ``m * b + c <= m * a + c:real`` THENL
6259   [MATCH_MP_TAC REAL_LE_ADD2 THEN REWRITE_TAC [REAL_LE_REFL] THEN
6260    ONCE_REWRITE_TAC[REAL_ARITH ``m * b <= m * a <=> -m * a <= -m * b:real``] THEN
6261    MATCH_MP_TAC REAL_LE_LMUL_IMP THEN ASM_REAL_ARITH_TAC,
6262      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
6263    DISCH_THEN SUBST1_TAC THEN
6264        ASM_SIMP_TAC std_ss [abs, CONTENT_CLOSED_INTERVAL, POW_1] THEN
6265    REAL_ARITH_TAC
6266QED
6267
6268Theorem HAS_INTEGRAL_AFFINITY:
6269   !f:real->real i a b m c.
6270        (f has_integral i) (interval[a,b]) /\ ~(m = &0)
6271        ==> ((\x. f(m * x + c)) has_integral
6272             (inv(abs(m) pow  1n) * i))
6273            (IMAGE (\x. inv m * x + -(inv(m) * c)) (interval[a,b]))
6274Proof
6275  REPEAT STRIP_TAC THEN
6276  ONCE_REWRITE_TAC [METIS [] ``(m * x + c) = (\x:real. (m * x + c)) x``] THEN
6277  MATCH_MP_TAC HAS_INTEGRAL_TWIDDLE THEN
6278  ASM_SIMP_TAC std_ss [INTERVAL_IMAGE_AFFINITY_INTERVAL, GSYM ABS_NZ,
6279        REAL_POW_LT, CONTENT_IMAGE_AFFINITY_INTERVAL] THEN
6280  ASM_SIMP_TAC std_ss [CONTINUOUS_CMUL, CONTINUOUS_AT_ID, CONTINUOUS_CONST,
6281                       CONTINUOUS_ADD] THEN
6282  REWRITE_TAC[REAL_ADD_LDISTRIB, REAL_MUL_ASSOC, REAL_MUL_RNEG] THEN
6283  ASM_SIMP_TAC std_ss [REAL_MUL_LINV, REAL_MUL_RINV] THEN
6284  CONJ_TAC THEN REAL_ARITH_TAC
6285QED
6286
6287Theorem INTEGRABLE_AFFINITY:
6288   !f:real->real a b m c.
6289        f integrable_on interval[a,b] /\ ~(m = &0)
6290        ==> (\x. f(m * x + c)) integrable_on
6291            (IMAGE (\x. inv m * x + -(inv(m) * c)) (interval[a,b]))
6292Proof
6293  REWRITE_TAC[integrable_on] THEN METIS_TAC[HAS_INTEGRAL_AFFINITY]
6294QED
6295
6296(* ------------------------------------------------------------------------- *)
6297(* Special case of stretching coordinate axes separately.                    *)
6298(* ------------------------------------------------------------------------- *)
6299
6300Theorem CONTENT_IMAGE_STRETCH_INTERVAL :
6301    !a b:real m.
6302        content(IMAGE (\x. m 1 * x) (interval[a,b]):real->bool) =
6303        abs(product{ 1n.. 1n} m) * content(interval[a,b])
6304Proof
6305    rpt GEN_TAC
6306 >> REWRITE_TAC [content, IMAGE_EQ_EMPTY]
6307 >> COND_CASES_TAC >> ASM_REWRITE_TAC [REAL_MUL_RZERO]
6308 >> ASM_SIMP_TAC std_ss [SIMP_RULE std_ss [] IMAGE_STRETCH_INTERVAL]
6309 >> RULE_ASSUM_TAC (REWRITE_RULE [INTERVAL_NE_EMPTY])
6310 >> ASSUME_TAC (Q.SPECL [`(m :num->real) 1 * a`,
6311                         `(m :num->real) 1 * b`]
6312                        REAL_MIN_LE_MAX) (* new *)
6313 >> ASM_SIMP_TAC std_ss [INTERVAL_UPPERBOUND, INTERVAL_LOWERBOUND]
6314 >> ASM_REWRITE_TAC [GSYM REAL_SUB_LDISTRIB, ABS_MUL,
6315                     REAL_MAX_SUB_MIN (* new *)]
6316 >> ASM_SIMP_TAC std_ss [NUMSEG_SING, PRODUCT_SING, FINITE_NUMSEG,
6317                         REAL_ARITH ``a <= b ==> (abs(b - a) = b - a:real)``]
6318QED
6319
6320Theorem HAS_INTEGRAL_STRETCH :
6321    !f:real->real i m a b.
6322        (f has_integral i) (interval[a,b]) /\
6323        ~(m  1n = &0)
6324        ==> ((\x:real. f(m  1n * x)) has_integral
6325             (inv(abs(product{ 1n.. 1n} m)) * i))
6326            (IMAGE (\x. inv(m 1) * x) (interval[a,b]))
6327Proof
6328  REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_INTEGRAL_TWIDDLE THEN
6329  SIMP_TAC std_ss [] THEN
6330  ASM_SIMP_TAC real_ss [REAL_MUL_ASSOC, REAL_MUL_LINV, REAL_MUL_RINV, REAL_MUL_LID] THEN
6331  ASM_SIMP_TAC real_ss [GSYM ABS_NZ, PRODUCT_EQ_0_NUMSEG] THEN
6332  CONJ_TAC THENL [GEN_TAC THEN ASM_CASES_TAC ``x = 1:num`` THENL
6333   [ASM_SIMP_TAC arith_ss [], ALL_TAC] THEN
6334   ONCE_REWRITE_TAC [TAUT `a \/ b \/ c <=> c \/ a \/ b`] THEN DISJ2_TAC THEN
6335   POP_ASSUM MP_TAC THEN SIMP_TAC arith_ss [NOT_LESS_EQUAL], ALL_TAC] THEN
6336  CONJ_TAC THENL
6337   [GEN_TAC THEN MATCH_MP_TAC LINEAR_CONTINUOUS_AT THEN
6338    SIMP_TAC std_ss [linear] THEN REAL_ARITH_TAC, ALL_TAC] THEN
6339   KNOW_TAC ``!(u :real) (v :real).
6340  content (IMAGE ($* (m  1n)) (interval [(u,v)])) =
6341  abs (product { 1n ..  1n} m) * content (interval [(u,v)])`` THENL
6342   [SIMP_TAC std_ss [GSYM CONTENT_IMAGE_STRETCH_INTERVAL] THEN
6343    METIS_TAC [], DISCH_TAC] THEN ASM_REWRITE_TAC [] THEN
6344   REPEAT STRIP_TAC THENL
6345   [ALL_TAC,
6346    SIMP_TAC std_ss [SIMP_RULE std_ss [] IMAGE_STRETCH_INTERVAL] THEN
6347    METIS_TAC[EMPTY_AS_INTERVAL]] THEN
6348    METIS_TAC [SIMP_RULE std_ss [] IMAGE_STRETCH_INTERVAL]
6349QED
6350
6351Theorem INTEGRABLE_STRETCH:
6352   !f:real->real m a b.
6353        f integrable_on interval[a,b] /\ ~(m  1n = &0)
6354        ==> (\x:real. f(m  1n * x)) integrable_on
6355            (IMAGE (\x. inv(m 1) * x) (interval[a,b]))
6356Proof
6357  REWRITE_TAC[integrable_on] THEN METIS_TAC[HAS_INTEGRAL_STRETCH]
6358QED
6359
6360(* ------------------------------------------------------------------------- *)
6361(* Even more special cases.                                                  *)
6362(* ------------------------------------------------------------------------- *)
6363
6364Theorem HAS_INTEGRAL_REFLECT_LEMMA:
6365   !f:real->real i a b.
6366     (f has_integral i) (interval[a,b])
6367     ==> ((\x. f(-x)) has_integral i) (interval[-b,-a])
6368Proof
6369  REPEAT STRIP_TAC THEN
6370  FIRST_ASSUM(MP_TAC o C CONJ (REAL_ARITH ``~(- &1 = &0:real)``)) THEN
6371  DISCH_THEN(MP_TAC o MATCH_MP HAS_INTEGRAL_AFFINITY) THEN
6372  DISCH_THEN(MP_TAC o SPEC ``0:real``) THEN
6373  REWRITE_TAC[IMAGE_AFFINITY_INTERVAL] THEN
6374  SIMP_TAC std_ss [REAL_MUL_RZERO, ABS_NEG, ABS_1] THEN
6375  KNOW_TAC ``~(&0 <= inv (- &1:real))`` THENL
6376  [KNOW_TAC ``-1 <> 0:real`` THENL [REAL_ARITH_TAC, DISCH_TAC] THEN
6377   REWRITE_TAC [REAL_NOT_LE] THEN
6378   ONCE_REWRITE_TAC [GSYM REAL_LT_NEG] THEN ASM_SIMP_TAC std_ss [REAL_NEG_INV] THEN
6379   SIMP_TAC std_ss [REAL_NEG_NEG, REAL_NEG_0, REAL_INV1] THEN REAL_ARITH_TAC,
6380   DISCH_TAC] THEN FULL_SIMP_TAC std_ss [] THEN
6381  KNOW_TAC ``inv (-1) = -1:real`` THENL
6382  [KNOW_TAC ``-1 <> 0:real`` THENL [REAL_ARITH_TAC, DISCH_TAC] THEN
6383   ONCE_REWRITE_TAC [GSYM REAL_EQ_NEG] THEN ASM_SIMP_TAC std_ss [REAL_NEG_INV] THEN
6384   SIMP_TAC std_ss [REAL_NEG_NEG, REAL_NEG_0, REAL_INV1] THEN REAL_ARITH_TAC,
6385   DISCH_TAC] THEN
6386  ASM_REWRITE_TAC[ABS_NEG, ABS_N, POW_ONE] THEN
6387  REWRITE_TAC[REAL_MUL_RZERO, REAL_NEG_0] THEN
6388  REWRITE_TAC[REAL_NEG_INV, REAL_INV1] THEN
6389  REWRITE_TAC[REAL_ARITH ``- &1 * x + 0 = -x:real``] THEN
6390  REWRITE_TAC[REAL_MUL_LID] THEN MATCH_MP_TAC EQ_IMPLIES THEN
6391  AP_TERM_TAC THEN POP_ASSUM(K ALL_TAC) THEN
6392  COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN CONV_TAC SYM_CONV THEN
6393  POP_ASSUM MP_TAC THEN SIMP_TAC std_ss [GSYM INTERVAL_EQ_EMPTY] THEN
6394  REWRITE_TAC[TAUT `a /\ b /\ c <=> ~(a /\ b ==> ~c)`] THEN
6395  SIMP_TAC std_ss [REAL_LT_NEG]
6396QED
6397
6398Theorem HAS_INTEGRAL_REFLECT:
6399   !f:real->real i a b.
6400     ((\x. f(-x)) has_integral i) (interval[-b,-a]) <=>
6401     (f has_integral i) (interval[a,b])
6402Proof
6403  REPEAT GEN_TAC THEN EQ_TAC THEN
6404  DISCH_THEN(MP_TAC o MATCH_MP HAS_INTEGRAL_REFLECT_LEMMA) THEN
6405  SIMP_TAC std_ss [REAL_NEG_NEG, ETA_AX]
6406QED
6407
6408Theorem INTEGRABLE_REFLECT:
6409   !f:real->real a b.
6410     (\x. f(-x)) integrable_on (interval[-b,-a]) <=>
6411     f integrable_on (interval[a,b])
6412Proof
6413  SIMP_TAC std_ss [integrable_on, HAS_INTEGRAL_REFLECT]
6414QED
6415
6416Theorem INTEGRAL_REFLECT:
6417   !f:real->real a b.
6418     integral (interval[-b,-a]) (\x. f(-x)) =
6419     integral (interval[a,b]) f
6420Proof
6421  SIMP_TAC std_ss [integral, HAS_INTEGRAL_REFLECT]
6422QED
6423
6424(* ------------------------------------------------------------------------- *)
6425(* Technical lemmas about how many non-trivial intervals of a division a     *)
6426(* point can be in (we sometimes need this for bounding sums).               *)
6427(* ------------------------------------------------------------------------- *)
6428
6429Theorem lemma[local]:
6430    !f s. (!x y. x IN s /\ y IN s /\ (f x = f y) ==> (x = y)) /\
6431           FINITE s /\ CARD(IMAGE f s) <= n
6432           ==> CARD(s) <= n
6433Proof
6434    MESON_TAC[CARD_IMAGE_INJ]
6435QED
6436
6437Theorem DIVISION_COMMON_POINT_BOUND :
6438    !d s:real->bool x.
6439        d division_of s
6440        ==> CARD {k | k IN d /\ ~(content k = &0) /\ x IN k}
6441            <= 2 EXP  1n
6442Proof
6443  REPEAT STRIP_TAC THEN
6444  SUBGOAL_THEN ``!k. k IN d ==> ?a b:real. interval[a,b] = k`` MP_TAC THENL
6445   [ASM_MESON_TAC[division_of], ALL_TAC] THEN
6446  SIMP_TAC std_ss [RIGHT_IMP_EXISTS_THM, SKOLEM_THM, LEFT_IMP_EXISTS_THM] THEN
6447  MAP_EVERY X_GEN_TAC
6448   [``A:(real->bool)->real``, ``B:(real->bool)->real``] THEN
6449  STRIP_TAC THEN MATCH_MP_TAC(ISPEC
6450   ``\d. ((x:real) = (A:(real->bool)->real)(d)):bool``
6451   lemma) THEN
6452  REPEAT CONJ_TAC THENL
6453  [ (* goal 1 (of 3) *)
6454    ALL_TAC,
6455    (* goal 2 (of 3) *)
6456    ONCE_REWRITE_TAC [METIS [] ``{k | k IN d /\ content k <> 0 /\ x IN k} =
6457                            {k | k IN d /\ (\k. content k <> 0 /\ x IN k) k}``] THEN
6458    MATCH_MP_TAC FINITE_RESTRICT THEN ASM_MESON_TAC[division_of],
6459    (* goal 3 (of 3) *)
6460    MATCH_MP_TAC LESS_EQ_TRANS THEN EXISTS_TAC ``CARD univ(:bool)`` THEN CONJ_TAC THENL
6461    [ (* goal 3.1 (of 2) *)
6462      KNOW_TAC ``(IMAGE (\(d :real -> bool). (x :real) = (A :(real -> bool) -> real) d)
6463         {k | k IN (d :(real -> bool) -> bool) /\ content k <> (0 :real) /\
6464          x IN k}) SUBSET univ(:bool)`` THENL [REWRITE_TAC [SUBSET_UNIV], ALL_TAC] THEN
6465      MATCH_MP_TAC CARD_SUBSET THEN
6466      SIMP_TAC std_ss [FINITE_BOOL],
6467      (* goal 3.2 (of 2) *)
6468      SIMP_TAC std_ss [FINITE_BOOL, CARD_BOOL, LESS_EQ_REFL] ] ] THEN
6469 (* NOTE: below are tactics for goal 1 *)
6470  MAP_EVERY X_GEN_TAC [``k:real->bool``, ``l:real->bool``] THEN
6471  SIMP_TAC std_ss [GSPECIFICATION] THEN STRIP_TAC THEN
6472  UNDISCH_TAC ``d division_of s`` THEN DISCH_TAC THEN
6473  FIRST_ASSUM(MP_TAC o REWRITE_RULE [division_of]) THEN
6474  DISCH_THEN (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
6475  DISCH_THEN (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
6476  DISCH_THEN (CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
6477  DISCH_THEN(MP_TAC o SPECL [``k:real->bool``, ``l:real->bool``]) THEN
6478  ASM_REWRITE_TAC[GSYM INTERIOR_INTER] THEN
6479  MATCH_MP_TAC(TAUT `~q ==> (~p ==> q) ==> p`) THEN
6480  MAP_EVERY UNDISCH_TAC
6481   [``(x:real) IN k``, ``(x:real) IN l``,
6482    ``~(content(k:real->bool) = &0)``,
6483    ``~(content(l:real->bool) = &0)``] THEN
6484  SUBGOAL_THEN
6485   ``(k = interval[A k:real,B k]) /\ (l = interval[A l,B l])``
6486   (CONJUNCTS_THEN SUBST1_TAC)
6487  THENL [ASM_MESON_TAC[], REWRITE_TAC[INTER_INTERVAL]] THEN
6488  SIMP_TAC std_ss [CONTENT_EQ_0_INTERIOR, INTERIOR_CLOSED_INTERVAL] THEN
6489  SIMP_TAC std_ss [IN_INTERVAL, INTERVAL_NE_EMPTY] THEN
6490  UNDISCH_TAC ``(x = A k) <=> (x = (A:(real->bool)->real) l)`` THEN
6491  REWRITE_TAC[min_def, max_def] THEN
6492  Cases_on `A k <= A l` >> Cases_on `B k <= B l` >> rw []
6493  >- (`A l < x \/ (A l = x)` by PROVE_TAC [REAL_LE_LT]
6494      >- (MATCH_MP_TAC REAL_LTE_TRANS >> Q.EXISTS_TAC `x` >> art []) \\
6495      METIS_TAC []) \\
6496  `A k < x \/ (A k = x)` by PROVE_TAC [REAL_LE_LT]
6497  >- (MATCH_MP_TAC REAL_LTE_TRANS >> Q.EXISTS_TAC `x` >> art []) \\
6498  METIS_TAC []
6499QED
6500
6501Theorem lemma[local]:
6502    !f s. (!x y. x IN s /\ y IN s /\ (f x = f y) ==> (x = y)) /\
6503           FINITE s /\ CARD(IMAGE f s) <= n
6504           ==> CARD(s) <= n
6505Proof
6506    MESON_TAC[CARD_IMAGE_INJ]
6507QED
6508
6509Theorem TAGGED_PARTIAL_DIVISION_COMMON_POINT_BOUND:
6510   !p s:real->bool y.
6511        p tagged_partial_division_of s
6512        ==> CARD {(x,k) | (x,k) IN p /\ y IN k /\ ~(content k = &0)}
6513            <= 2 EXP  1n
6514Proof
6515  REPEAT STRIP_TAC THEN MATCH_MP_TAC(ISPEC ``SND`` lemma) THEN
6516  REPEAT CONJ_TAC THENL
6517   [SIMP_TAC std_ss [IMP_CONJ, FORALL_IN_GSPEC, RIGHT_FORALL_IMP_THM, PAIR_EQ] THEN
6518    MAP_EVERY X_GEN_TAC [``x1:real``, ``k1:real->bool``] THEN
6519    REPEAT DISCH_TAC THEN X_GEN_TAC ``x2:real`` THEN
6520    REPEAT DISCH_TAC THEN
6521    UNDISCH_TAC ``p tagged_partial_division_of s`` THEN DISCH_TAC THEN
6522    FIRST_ASSUM(MP_TAC o REWRITE_RULE [tagged_partial_division_of]) THEN
6523    DISCH_THEN(MP_TAC o SPECL
6524     [``x1:real``, ``k1:real->bool``, ``x2:real``, ``k1:real->bool``] o
6525     CONJUNCT2 o CONJUNCT2) THEN
6526    ASM_SIMP_TAC std_ss [PAIR_EQ] THEN
6527    MATCH_MP_TAC(TAUT `~q ==> (~p ==> q) ==> p`) THEN
6528    SIMP_TAC std_ss [INTER_ACI] THEN
6529    ASM_MESON_TAC[CONTENT_EQ_0_INTERIOR, tagged_partial_division_of],
6530    MATCH_MP_TAC FINITE_SUBSET THEN
6531    EXISTS_TAC ``p:real#(real->bool)->bool`` THEN CONJ_TAC THENL
6532     [ASM_MESON_TAC[tagged_partial_division_of],
6533      SIMP_TAC std_ss [LAMBDA_PAIR] THEN SET_TAC[]],
6534    FIRST_ASSUM(MP_TAC o MATCH_MP PARTIAL_DIVISION_OF_TAGGED_DIVISION) THEN
6535    DISCH_THEN(MP_TAC o SPEC ``y:real`` o
6536      MATCH_MP DIVISION_COMMON_POINT_BOUND) THEN
6537    MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] LESS_EQ_TRANS) THEN
6538    KNOW_TAC ``(IMAGE (SND :real # (real -> bool) -> real -> bool)
6539         {(x,k) | (x,k) IN (p :real # (real -> bool) -> bool) /\ (y :real) IN k /\
6540          content k <> (0 :real)}) SUBSET
6541             {k | k IN IMAGE (SND :real # (real -> bool) -> real -> bool) p /\
6542       content k <> (0 :real) /\ y IN k}`` THENL
6543    [SIMP_TAC std_ss [SUBSET_DEF, FORALL_IN_IMAGE, FORALL_IN_GSPEC] THEN
6544     SIMP_TAC std_ss [GSPECIFICATION, IN_IMAGE, EXISTS_PROD] THEN MESON_TAC[],
6545     ALL_TAC] THEN
6546    MATCH_MP_TAC CARD_SUBSET THEN
6547    ONCE_REWRITE_TAC [METIS []
6548        ``{k | k IN IMAGE SND p /\ content k <> 0 /\ y IN k} =
6549      {k | k IN IMAGE SND p /\ (\k. content k <> 0 /\ y IN k) k}``] THEN
6550      MATCH_MP_TAC FINITE_RESTRICT THEN MATCH_MP_TAC IMAGE_FINITE THEN
6551      ASM_MESON_TAC[tagged_partial_division_of]]
6552QED
6553
6554Theorem TAGGED_PARTIAL_DIVISION_COMMON_TAGS:
6555   !p s:real->bool x.
6556        p tagged_partial_division_of s
6557        ==> CARD {(x,k) | k | (x,k) IN p /\ ~(content k = &0)}
6558            <= 2 EXP  1n
6559Proof
6560  REPEAT STRIP_TAC THEN FIRST_ASSUM(MP_TAC o SPEC ``x:real`` o
6561   MATCH_MP TAGGED_PARTIAL_DIVISION_COMMON_POINT_BOUND) THEN
6562  MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] LESS_EQ_TRANS) THEN
6563  KNOW_TAC ``{((x :real),k) |
6564       k | (x,k) IN (p :real # (real -> bool) -> bool) /\
6565       content k <> (0 :real)} SUBSET
6566       {(x',k) | (x',k) IN p /\ x IN k /\ content k <> (0 :real)}`` THENL
6567  [SIMP_TAC std_ss [SUBSET_DEF, FORALL_IN_GSPEC, IN_ELIM_PAIR_THM] THEN
6568    ASM_MESON_TAC[tagged_partial_division_of], ALL_TAC] THEN
6569  MATCH_MP_TAC CARD_SUBSET THEN
6570    MATCH_MP_TAC FINITE_SUBSET THEN
6571    EXISTS_TAC ``p:real#(real->bool)->bool`` THEN CONJ_TAC THENL
6572     [ASM_MESON_TAC[tagged_partial_division_of],
6573      SIMP_TAC std_ss [LAMBDA_PAIR] THEN SET_TAC[]]
6574QED
6575
6576(* ------------------------------------------------------------------------- *)
6577(* Integrating characteristic function of an interval.                       *)
6578(* ------------------------------------------------------------------------- *)
6579
6580Theorem HAS_INTEGRAL_RESTRICT_OPEN_SUBINTERVAL:
6581   !f:real->real a b c d i.
6582        (f has_integral i) (interval[c,d]) /\
6583        interval[c,d] SUBSET interval[a,b]
6584        ==> ((\x. if x IN interval(c,d) then f x else 0) has_integral i)
6585             (interval[a,b])
6586Proof
6587  REPEAT GEN_TAC THEN ASM_CASES_TAC ``interval[c:real,d] = {}`` THENL
6588   [FIRST_ASSUM(MP_TAC o AP_TERM
6589     ``interior:(real->bool)->(real->bool)``) THEN
6590    SIMP_TAC std_ss [INTERIOR_CLOSED_INTERVAL, INTERIOR_EMPTY] THEN
6591    ASM_SIMP_TAC std_ss [NOT_IN_EMPTY, HAS_INTEGRAL_0_EQ, HAS_INTEGRAL_EMPTY_EQ],
6592    ALL_TAC] THEN
6593  ABBREV_TAC ``g:real->real =
6594                 \x. if x IN interval(c,d) then f x else 0`` THEN
6595  DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
6596  UNDISCH_TAC ``interval [(c,d)] <> {}`` THEN
6597  REWRITE_TAC[TAUT `a ==> b ==> c <=> b /\ a ==> c`] THEN
6598  DISCH_THEN(MP_TAC o MATCH_MP PARTIAL_DIVISION_EXTEND_1) THEN
6599  DISCH_THEN(X_CHOOSE_THEN ``p:(real->bool)->bool`` STRIP_ASSUME_TAC) THEN
6600  MP_TAC(ISPECL
6601   [``lifted((+):real->real->real)``,
6602    ``p:(real->bool)->bool``,
6603    ``a:real``, ``b:real``,
6604    ``\i. if (g:real->real) integrable_on i
6605         then SOME (integral i g) else NONE``]
6606   OPERATIVE_DIVISION) THEN
6607  ASM_SIMP_TAC std_ss [OPERATIVE_INTEGRAL, MONOIDAL_LIFTED, MONOIDAL_REAL_ADD] THEN
6608  SUBGOAL_THEN
6609   ``iterate (lifted (+)) p
6610     (\i. if (g:real->real) integrable_on i
6611          then SOME (integral i g) else NONE) =
6612    SOME i``
6613  SUBST1_TAC THENL
6614   [ALL_TAC,
6615    COND_CASES_TAC THEN
6616    SIMP_TAC std_ss [FORALL_OPTION, lifted, NOT_NONE_SOME, option_CLAUSES] THEN
6617    ASM_MESON_TAC[INTEGRABLE_INTEGRAL]] THEN
6618  FIRST_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_FINITE) THEN
6619  FIRST_ASSUM(SUBST1_TAC o MATCH_MP (SET_RULE
6620   ``x IN s ==> (s = x INSERT (s DELETE x))``)) THEN
6621  ASM_SIMP_TAC std_ss [ITERATE_CLAUSES, MONOIDAL_LIFTED, MONOIDAL_REAL_ADD,
6622               FINITE_DELETE, IN_DELETE] THEN
6623  SUBGOAL_THEN ``(g:real->real) integrable_on interval[c,d]``
6624  ASSUME_TAC THENL
6625   [FIRST_ASSUM(MP_TAC o MATCH_MP HAS_INTEGRAL_INTEGRABLE) THEN
6626    MATCH_MP_TAC INTEGRABLE_SPIKE_INTERIOR THEN
6627    EXPAND_TAC "g" THEN SIMP_TAC std_ss [],
6628    ALL_TAC] THEN
6629  ASM_REWRITE_TAC[] THEN
6630  SUBGOAL_THEN
6631   ``iterate (lifted (+)) (p DELETE interval[c,d])
6632      (\i. if (g:real->real) integrable_on i
6633           then SOME (integral i g) else NONE) = SOME(0)``
6634  SUBST1_TAC THENL
6635   [ALL_TAC,
6636    REWRITE_TAC[lifted, REAL_ADD_RID] THEN AP_TERM_TAC THEN
6637    MATCH_MP_TAC INTEGRAL_UNIQUE THEN
6638    MATCH_MP_TAC HAS_INTEGRAL_SPIKE_INTERIOR THEN
6639    EXISTS_TAC ``f:real->real`` THEN
6640    EXPAND_TAC "g" THEN ASM_SIMP_TAC std_ss []] THEN
6641  SIMP_TAC std_ss [GSYM NEUTRAL_REAL_ADD, GSYM NEUTRAL_LIFTED,
6642           MONOIDAL_REAL_ADD] THEN
6643  MATCH_MP_TAC(MATCH_MP ITERATE_EQ_NEUTRAL
6644        (MATCH_MP MONOIDAL_LIFTED(SPEC_ALL MONOIDAL_REAL_ADD))) THEN
6645  SIMP_TAC std_ss [NEUTRAL_LIFTED, NEUTRAL_REAL_ADD, MONOIDAL_REAL_ADD] THEN
6646  X_GEN_TAC ``k:real->bool`` THEN REWRITE_TAC[IN_DELETE] THEN STRIP_TAC THEN
6647  SUBGOAL_THEN ``((g:real->real) has_integral (0)) k``
6648   (fn th => METIS_TAC[th, integrable_on, INTEGRAL_UNIQUE]) THEN
6649  SUBGOAL_THEN ``?u v:real. k = interval[u,v]`` MP_TAC THENL
6650   [ASM_MESON_TAC[division_of], ALL_TAC] THEN
6651  DISCH_THEN(REPEAT_TCL CHOOSE_THEN SUBST_ALL_TAC) THEN
6652  MATCH_MP_TAC HAS_INTEGRAL_SPIKE_INTERIOR THEN
6653  EXISTS_TAC ``(\x. 0):real->real`` THEN
6654  REWRITE_TAC[HAS_INTEGRAL_0] THEN X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN
6655  UNDISCH_TAC ``p division_of interval [(a,b)]`` THEN DISCH_TAC THEN
6656  FIRST_ASSUM(MP_TAC o REWRITE_RULE [division_of]) THEN
6657  STRIP_TAC THEN UNDISCH_TAC `` !(k1 :real -> bool) (k2 :real -> bool).
6658             k1 IN (p :(real -> bool) -> bool) /\ k2 IN p /\ k1 <> k2 ==>
6659             (interior k1 INTER interior k2 = ({} :real -> bool))`` THEN
6660  DISCH_THEN(MP_TAC o SPECL
6661   [``interval[c:real,d]``, ``interval[u:real,v]``]) THEN
6662  ASM_REWRITE_TAC[INTERIOR_CLOSED_INTERVAL] THEN
6663  EXPAND_TAC "g" THEN REWRITE_TAC[] THEN COND_CASES_TAC THEN ASM_SET_TAC[]
6664QED
6665
6666Theorem HAS_INTEGRAL_RESTRICT_CLOSED_SUBINTERVAL:
6667   !f:real->real a b c d i.
6668        (f has_integral i) (interval[c,d]) /\
6669        interval[c,d] SUBSET interval[a,b]
6670        ==> ((\x. if x IN interval[c,d] then f x else 0) has_integral i)
6671             (interval[a,b])
6672Proof
6673  REPEAT GEN_TAC THEN
6674  DISCH_THEN(MP_TAC o MATCH_MP HAS_INTEGRAL_RESTRICT_OPEN_SUBINTERVAL) THEN
6675  MATCH_MP_TAC(REWRITE_RULE[TAUT `a /\ b /\ c ==> d <=> a /\ b ==> c ==> d`]
6676    HAS_INTEGRAL_SPIKE) THEN
6677  EXISTS_TAC ``interval[c:real,d] DIFF interval(c,d)`` THEN
6678  REWRITE_TAC[NEGLIGIBLE_FRONTIER_INTERVAL] THEN REWRITE_TAC[IN_DIFF] THEN
6679  MP_TAC(ISPECL [``c:real``, ``d:real``] INTERVAL_OPEN_SUBSET_CLOSED) THEN
6680  SET_TAC[]
6681QED
6682
6683Theorem HAS_INTEGRAL_RESTRICT_CLOSED_SUBINTERVALS_EQ:
6684   !f:real->real a b c d i.
6685        interval[c,d] SUBSET interval[a,b]
6686        ==> (((\x. if x IN interval[c,d] then f x else 0) has_integral i)
6687              (interval[a,b]) <=>
6688             (f has_integral i) (interval[c,d]))
6689Proof
6690  REPEAT STRIP_TAC THEN ASM_CASES_TAC ``interval[c:real,d] = {}`` THENL
6691   [ASM_SIMP_TAC std_ss [NOT_IN_EMPTY, HAS_INTEGRAL_0_EQ, HAS_INTEGRAL_EMPTY_EQ],
6692    ALL_TAC] THEN
6693  EQ_TAC THEN DISCH_TAC THEN
6694  ASM_SIMP_TAC std_ss [HAS_INTEGRAL_RESTRICT_CLOSED_SUBINTERVAL] THEN
6695  SUBGOAL_THEN ``(f:real->real) integrable_on interval[c,d]`` MP_TAC THENL
6696   [MATCH_MP_TAC INTEGRABLE_EQ THEN
6697    EXISTS_TAC ``\x. if x IN interval[c:real,d]
6698                    then f x:real else 0`` THEN
6699    SIMP_TAC std_ss [] THEN MATCH_MP_TAC INTEGRABLE_SUBINTERVAL THEN
6700    ASM_MESON_TAC[integrable_on],
6701    ALL_TAC] THEN
6702  DISCH_THEN(fn th => ASSUME_TAC th THEN MP_TAC th) THEN
6703  DISCH_THEN(MP_TAC o MATCH_MP INTEGRABLE_INTEGRAL) THEN
6704  MP_TAC(ASSUME ``interval[c:real,d] SUBSET interval[a,b]``) THEN
6705  REWRITE_TAC[AND_IMP_INTRO] THEN ONCE_REWRITE_TAC[CONJ_SYM] THEN
6706  DISCH_THEN(MP_TAC o MATCH_MP HAS_INTEGRAL_RESTRICT_CLOSED_SUBINTERVAL) THEN
6707  ASM_MESON_TAC[HAS_INTEGRAL_UNIQUE, INTEGRABLE_INTEGRAL]
6708QED
6709
6710(* ------------------------------------------------------------------------- *)
6711(* Hence we can apply the limit process uniformly to all integrals.          *)
6712(* ------------------------------------------------------------------------- *)
6713
6714Theorem HAS_INTEGRAL:
6715   !f:real->real i s.
6716     (f has_integral i) s <=>
6717        !e. &0 < e
6718            ==> ?B. &0 < B /\
6719                    !a b. ball(0,B) SUBSET interval[a,b]
6720                          ==> ?z. ((\x. if x IN s then f(x) else 0)
6721                                   has_integral z) (interval[a,b]) /\
6722                                  abs(z - i) < e
6723Proof
6724  REPEAT GEN_TAC THEN GEN_REWR_TAC LAND_CONV [has_integral_alt] THEN
6725  COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
6726  POP_ASSUM(X_CHOOSE_THEN ``a:real`` (X_CHOOSE_THEN ``b:real``
6727   SUBST_ALL_TAC)) THEN
6728  MP_TAC(ISPECL [``a:real``, ``b:real``] (CONJUNCT1 BOUNDED_INTERVAL)) THEN
6729  REWRITE_TAC[BOUNDED_POS] THEN
6730  DISCH_THEN(X_CHOOSE_THEN ``B:real`` STRIP_ASSUME_TAC) THEN EQ_TAC THENL
6731   [DISCH_TAC THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
6732    EXISTS_TAC ``B + &1:real`` THEN ASM_SIMP_TAC std_ss [REAL_LT_ADD, REAL_LT_01] THEN
6733    MAP_EVERY X_GEN_TAC [``c:real``, ``d:real``] THEN
6734    SIMP_TAC std_ss [SUBSET_DEF, IN_BALL, DIST_0] THEN
6735    DISCH_TAC THEN EXISTS_TAC ``i:real`` THEN
6736    ASM_REWRITE_TAC[REAL_SUB_REFL, ABS_0] THEN
6737    MATCH_MP_TAC HAS_INTEGRAL_RESTRICT_CLOSED_SUBINTERVAL THEN
6738    ASM_MESON_TAC[SUBSET_DEF, REAL_ARITH ``n <= B ==> n < B + &1:real``],
6739    ALL_TAC] THEN
6740  DISCH_TAC THEN
6741  SUBGOAL_THEN ``?y. ((f:real->real) has_integral y) (interval[a,b])``
6742  MP_TAC THENL
6743   [SUBGOAL_THEN
6744     ``?c d. interval[a,b] SUBSET interval[c,d] /\
6745            (\x. if x IN interval[a,b] then (f:real->real) x
6746                 else 0) integrable_on interval[c,d]``
6747    STRIP_ASSUME_TAC THENL
6748     [FIRST_X_ASSUM(MP_TAC o C MATCH_MP REAL_LT_01) THEN
6749      DISCH_THEN(X_CHOOSE_THEN ``C:real`` STRIP_ASSUME_TAC) THEN
6750      ABBREV_TAC ``c:real = @f. f = -(max B C)`` THEN
6751      ABBREV_TAC ``d:real = @f. f = max B C`` THEN
6752      MAP_EVERY EXISTS_TAC [``c:real``, ``d:real``] THEN CONJ_TAC THENL
6753       [REWRITE_TAC[SUBSET_DEF] THEN X_GEN_TAC ``x:real`` THEN
6754        DISCH_TAC THEN REWRITE_TAC[IN_INTERVAL] THEN
6755        MAP_EVERY EXPAND_TAC ["c", "d"] THEN
6756        SIMP_TAC std_ss [GSYM ABS_BOUNDS] THEN
6757        MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC ``abs(x:real)`` THEN
6758        ASM_SIMP_TAC std_ss [REAL_LE_REFL] THEN
6759        MATCH_MP_TAC(METIS [REAL_LE_MAX] ``x <= B ==> (x:real) <= max B C``) THEN
6760        ASM_SIMP_TAC std_ss [],
6761        ALL_TAC] THEN
6762      FIRST_X_ASSUM(MP_TAC o SPECL [``c:real``, ``d:real``]) THEN
6763      KNOW_TAC ``ball (0,C) SUBSET interval [(c,d)]`` THENL
6764       [REWRITE_TAC[SUBSET_DEF, IN_BALL, DIST_0] THEN
6765        X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN REWRITE_TAC[IN_INTERVAL] THEN
6766        MAP_EVERY EXPAND_TAC ["c", "d"] THEN SIMP_TAC std_ss [GSYM ABS_BOUNDS] THEN
6767        MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC ``abs(x:real)`` THEN
6768        ASM_SIMP_TAC std_ss [REAL_LE_REFL] THEN
6769        MATCH_MP_TAC(METIS [REAL_LE_MAX, REAL_LT_IMP_LE]
6770         ``x < C ==> x:real <= max B C``) THEN
6771        ASM_SIMP_TAC std_ss [],
6772        ALL_TAC] THEN
6773      MESON_TAC[integrable_on],
6774      FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [integrable_on]) THEN
6775      ASM_SIMP_TAC std_ss [HAS_INTEGRAL_RESTRICT_CLOSED_SUBINTERVALS_EQ]],
6776    ALL_TAC] THEN
6777  DISCH_THEN(X_CHOOSE_TAC ``y:real``) THEN
6778  SUBGOAL_THEN ``i:real = y`` ASSUME_TAC THEN ASM_REWRITE_TAC[] THEN
6779  MATCH_MP_TAC(REAL_ARITH ``~(&0 < abs(y - i)) ==> (i = y:real)``) THEN
6780  DISCH_TAC THEN FIRST_X_ASSUM(MP_TAC o SPEC ``abs(y - i:real)``) THEN
6781  ASM_SIMP_TAC std_ss [NOT_EXISTS_THM] THEN X_GEN_TAC ``C:real`` THEN
6782  CCONTR_TAC THEN FULL_SIMP_TAC std_ss [] THEN POP_ASSUM MP_TAC THEN
6783  SIMP_TAC std_ss [NOT_FORALL_THM, NOT_IMP] THEN
6784  ABBREV_TAC ``c:real = @f. f = -(max B C)`` THEN
6785  ABBREV_TAC ``d:real = @f. f = max B C`` THEN
6786  MAP_EVERY EXISTS_TAC [``c:real``, ``d:real``] THEN CONJ_TAC THENL
6787   [REWRITE_TAC[SUBSET_DEF, IN_BALL, DIST_0] THEN
6788    X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN REWRITE_TAC[IN_INTERVAL] THEN
6789    MAP_EVERY EXPAND_TAC ["c", "d"] THEN
6790    SIMP_TAC std_ss [GSYM ABS_BOUNDS] THEN
6791    MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC ``abs(x:real)`` THEN
6792    ASM_SIMP_TAC std_ss [REAL_LE_REFL] THEN
6793    MATCH_MP_TAC(METIS [REAL_LE_MAX, REAL_LT_IMP_LE]
6794     ``x < C ==> x:real <= max B C``) THEN
6795    ASM_SIMP_TAC std_ss [],
6796    ALL_TAC] THEN
6797  SUBGOAL_THEN ``interval[a:real,b] SUBSET interval[c,d]`` ASSUME_TAC THENL
6798   [REWRITE_TAC[SUBSET_DEF] THEN X_GEN_TAC ``x:real`` THEN
6799    DISCH_TAC THEN REWRITE_TAC[IN_INTERVAL] THEN
6800    MAP_EVERY EXPAND_TAC ["c", "d"] THEN SIMP_TAC std_ss [GSYM ABS_BOUNDS] THEN
6801    MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC ``abs(x:real)`` THEN
6802    ASM_SIMP_TAC std_ss [REAL_LE_REFL] THEN
6803    MATCH_MP_TAC(METIS [REAL_LE_MAX] ``x <= B ==> x:real <= max B C``) THEN
6804    ASM_SIMP_TAC std_ss [],
6805    ALL_TAC] THEN
6806  ASM_SIMP_TAC std_ss [HAS_INTEGRAL_RESTRICT_CLOSED_SUBINTERVALS_EQ] THEN
6807  ASM_MESON_TAC[REAL_LT_REFL, HAS_INTEGRAL_UNIQUE]
6808QED
6809
6810(* ------------------------------------------------------------------------- *)
6811(* Hence a general restriction property.                 5952                *)
6812(* ------------------------------------------------------------------------- *)
6813
6814Theorem HAS_INTEGRAL_RESTRICT:
6815   !f:real->real s t i.
6816        s SUBSET t
6817        ==> (((\x. if x IN s then f x else 0) has_integral i) t <=>
6818             (f has_integral i) s)
6819Proof
6820  REWRITE_TAC[SUBSET_DEF] THEN REPEAT STRIP_TAC THEN
6821  ONCE_REWRITE_TAC[HAS_INTEGRAL] THEN SIMP_TAC std_ss [] THEN
6822  ONCE_REWRITE_TAC[METIS [] ``(if p then if q then x else y else y) =
6823                             (if q then if p then x else y else y)``] THEN
6824  ASM_SIMP_TAC std_ss []
6825QED
6826
6827Theorem INTEGRAL_RESTRICT:
6828   !f:real->real s t.
6829        s SUBSET t
6830        ==> (integral t (\x. if x IN s then f x else 0) =
6831             integral s f)
6832Proof
6833  SIMP_TAC std_ss [integral, HAS_INTEGRAL_RESTRICT]
6834QED
6835
6836Theorem INTEGRABLE_RESTRICT:
6837   !f:real->real s t.
6838        s SUBSET t
6839        ==> (((\x. if x IN s then f x else 0) integrable_on t <=>
6840              f integrable_on s))
6841Proof
6842  SIMP_TAC std_ss [integrable_on, HAS_INTEGRAL_RESTRICT]
6843QED
6844
6845Theorem HAS_INTEGRAL_RESTRICT_UNIV:
6846   !f:real->real s i.
6847        ((\x. if x IN s then f x else 0) has_integral i) univ(:real) <=>
6848         (f has_integral i) s
6849Proof
6850  SIMP_TAC std_ss [HAS_INTEGRAL_RESTRICT, SUBSET_UNIV]
6851QED
6852
6853Theorem INTEGRAL_RESTRICT_UNIV:
6854   !f:real->real s.
6855        integral univ(:real) (\x. if x IN s then f x else 0) =
6856        integral s f
6857Proof
6858  REWRITE_TAC[integral, HAS_INTEGRAL_RESTRICT_UNIV]
6859QED
6860
6861Theorem INTEGRABLE_RESTRICT_UNIV:
6862   !f s. (\x. if x IN s then f x else 0) integrable_on univ(:real) <=>
6863         f integrable_on s
6864Proof
6865  REWRITE_TAC[integrable_on, HAS_INTEGRAL_RESTRICT_UNIV]
6866QED
6867
6868(* NOTE: These are modern version of the above "RESTRICT_UNIV" theorems *)
6869Theorem HAS_INTEGRAL_MUL_INDICATOR :
6870    !f s l. ((\x. f x * indicator s x) has_integral l) UNIV <=>
6871            (f has_integral l) s
6872Proof
6873    rpt GEN_TAC
6874 >> ONCE_REWRITE_TAC [GSYM HAS_INTEGRAL_RESTRICT_UNIV]
6875 >> simp []
6876 >> MATCH_MP_TAC HAS_INTEGRAL_EQ_EQ >> rw [indicator]
6877QED
6878
6879Theorem INTEGRAL_MUL_INDICATOR :
6880    !f s. integral UNIV (\x. f x * indicator s x) = integral s f
6881Proof
6882    rpt GEN_TAC
6883 >> ONCE_REWRITE_TAC [GSYM INTEGRAL_RESTRICT_UNIV]
6884 >> simp []
6885 >> MATCH_MP_TAC INTEGRAL_EQ >> rw [indicator]
6886QED
6887
6888Theorem INTEGRABLE_MUL_INDICATOR :
6889    !f s. (\x. f x * indicator s x) integrable_on UNIV <=> f integrable_on s
6890Proof
6891    rpt GEN_TAC
6892 >> ONCE_REWRITE_TAC [GSYM INTEGRABLE_RESTRICT_UNIV]
6893 >> simp []
6894 >> MATCH_MP_TAC INTEGRABLE_EQ_EQ >> rw [indicator]
6895QED
6896
6897Theorem HAS_INTEGRAL_RESTRICT_INTER:
6898   !f:real->real s t.
6899        ((\x. if x IN s then f x else 0) has_integral i) t <=>
6900        (f has_integral i) (s INTER t)
6901Proof
6902  REPEAT GEN_TAC THEN ONCE_REWRITE_TAC[GSYM HAS_INTEGRAL_RESTRICT_UNIV] THEN
6903  REWRITE_TAC[IN_INTER] THEN AP_THM_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN
6904  REWRITE_TAC[FUN_EQ_THM] THEN METIS_TAC[]
6905QED
6906
6907Theorem INTEGRAL_RESTRICT_INTER:
6908   !f:real->real s t.
6909        integral t (\x. if x IN s then f x else 0) =
6910        integral (s INTER t) f
6911Proof
6912  REWRITE_TAC[integral, HAS_INTEGRAL_RESTRICT_INTER]
6913QED
6914
6915Theorem INTEGRABLE_RESTRICT_INTER:
6916   !f:real->real s t.
6917        (\x. if x IN s then f x else 0) integrable_on t <=>
6918        f integrable_on (s INTER t)
6919Proof
6920  REWRITE_TAC[integrable_on, HAS_INTEGRAL_RESTRICT_INTER]
6921QED
6922
6923Theorem HAS_INTEGRAL_ON_SUPERSET:
6924   !f s t i.
6925        (!x. ~(x IN s) ==> (f x = 0)) /\ s SUBSET t /\ (f has_integral i) s
6926        ==> (f has_integral i) t
6927Proof
6928  REPEAT GEN_TAC THEN REWRITE_TAC[SUBSET_DEF] THEN
6929  REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
6930  ONCE_REWRITE_TAC[GSYM HAS_INTEGRAL_RESTRICT_UNIV] THEN
6931  MATCH_MP_TAC EQ_IMPLIES THEN AP_THM_TAC THEN AP_THM_TAC THEN
6932  AP_TERM_TAC THEN ABS_TAC THEN METIS_TAC[]
6933QED
6934
6935Theorem INTEGRABLE_ON_SUPERSET:
6936   !f s t.
6937        (!x. ~(x IN s) ==> (f x = 0)) /\ s SUBSET t /\ f integrable_on s
6938        ==> f integrable_on t
6939Proof
6940  REWRITE_TAC[integrable_on] THEN MESON_TAC[HAS_INTEGRAL_ON_SUPERSET]
6941QED
6942
6943Theorem NEGLIGIBLE_ON_INTERVALS:
6944   !s. negligible s <=> !a b:real. negligible(s INTER interval[a,b])
6945Proof
6946  GEN_TAC THEN EQ_TAC THEN REPEAT STRIP_TAC THENL
6947   [MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN EXISTS_TAC ``s:real->bool`` THEN
6948    ASM_REWRITE_TAC[] THEN SET_TAC[],
6949    ALL_TAC] THEN
6950  REWRITE_TAC[negligible] THEN
6951  MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``] THEN
6952  FIRST_ASSUM(ASSUME_TAC o SPECL [``a:real``, ``b:real``]) THEN
6953  MATCH_MP_TAC HAS_INTEGRAL_NEGLIGIBLE THEN
6954  EXISTS_TAC ``s INTER interval[a:real,b]`` THEN
6955  ASM_REWRITE_TAC[] THEN SIMP_TAC std_ss [indicator, IN_DIFF, IN_INTER] THEN
6956  METIS_TAC[]
6957QED
6958
6959Theorem NEGLIGIBLE_BOUNDED_SUBSETS:
6960   !s:real->bool.
6961    negligible s <=> !t. bounded t /\ t SUBSET s ==> negligible t
6962Proof
6963  METIS_TAC[NEGLIGIBLE_ON_INTERVALS, INTER_SUBSET, BOUNDED_SUBSET,
6964            BOUNDED_INTERVAL, NEGLIGIBLE_SUBSET]
6965QED
6966
6967Theorem NEGLIGIBLE_ON_COUNTABLE_INTERVALS:
6968   !s:real->bool.
6969        negligible s <=>
6970        !n. negligible (s INTER interval[-n, n])
6971Proof
6972  GEN_TAC THEN GEN_REWR_TAC LAND_CONV [NEGLIGIBLE_ON_INTERVALS] THEN
6973  EQ_TAC THEN SIMP_TAC std_ss [] THEN REPEAT STRIP_TAC THEN
6974  SUBGOAL_THEN
6975   ``!a b:real. ?n. s INTER interval[a,b] =
6976                     ((s INTER interval[-n,n]) INTER interval[a,b])``
6977   (fn th => METIS_TAC[th, NEGLIGIBLE_ON_INTERVALS]) THEN
6978  REPEAT GEN_TAC THEN
6979  MP_TAC(ISPECL [``interval[a:real,b]``, ``0:real``]
6980        BOUNDED_SUBSET_CBALL) THEN
6981  REWRITE_TAC[BOUNDED_INTERVAL] THEN
6982  DISCH_THEN(X_CHOOSE_THEN ``r:real`` STRIP_ASSUME_TAC) THEN
6983  MP_TAC(SPEC ``r:real`` SIMP_REAL_ARCH) THEN
6984  STRIP_TAC THEN EXISTS_TAC ``&n:real`` THEN
6985  FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
6986   ``i SUBSET b ==> b SUBSET n ==> (s INTER i = (s INTER n) INTER i)``)) THEN
6987  REWRITE_TAC[SUBSET_DEF, IN_CBALL_0, IN_INTERVAL, GSYM ABS_BOUNDS]  THEN
6988  METIS_TAC[REAL_LE_TRANS]
6989QED
6990
6991Theorem HAS_INTEGRAL_SPIKE_SET_EQ:
6992   !f:real->real s t y.
6993        negligible((s DIFF t) UNION (t DIFF s))
6994        ==> ((f has_integral y) s <=> (f has_integral y) t)
6995Proof
6996  REPEAT STRIP_TAC THEN  ONCE_REWRITE_TAC[GSYM HAS_INTEGRAL_RESTRICT_UNIV] THEN
6997  MATCH_MP_TAC HAS_INTEGRAL_SPIKE_EQ THEN
6998  EXISTS_TAC ``(s DIFF t) UNION (t DIFF s:real->bool)`` THEN
6999  ASM_SIMP_TAC std_ss [] THEN SET_TAC[]
7000QED
7001
7002Theorem HAS_INTEGRAL_SPIKE_SET:
7003   !f:real->real s t y.
7004        negligible((s DIFF t) UNION (t DIFF s)) /\
7005        (f has_integral y) s
7006        ==> (f has_integral y) t
7007Proof
7008  MESON_TAC[HAS_INTEGRAL_SPIKE_SET_EQ]
7009QED
7010
7011Theorem INTEGRABLE_SPIKE_SET:
7012   !f:real->real s t.
7013        negligible(s DIFF t UNION (t DIFF s))
7014        ==> f integrable_on s ==> f integrable_on t
7015Proof
7016  REWRITE_TAC[integrable_on] THEN MESON_TAC[HAS_INTEGRAL_SPIKE_SET_EQ]
7017QED
7018
7019Theorem INTEGRABLE_SPIKE_SET_EQ:
7020   !f:real->real s t.
7021        negligible(s DIFF t UNION (t DIFF s))
7022        ==> (f integrable_on s <=> f integrable_on t)
7023Proof
7024  MESON_TAC[INTEGRABLE_SPIKE_SET, UNION_COMM]
7025QED
7026
7027Theorem INTEGRAL_SPIKE_SET:
7028   !f:real->real s t.
7029        negligible(s DIFF t UNION (t DIFF s))
7030        ==> (integral s f = integral t f)
7031Proof
7032  REPEAT STRIP_TAC THEN REWRITE_TAC[integral] THEN
7033  AP_TERM_TAC THEN ABS_TAC THEN MATCH_MP_TAC HAS_INTEGRAL_SPIKE_SET_EQ THEN
7034  ASM_MESON_TAC[]
7035QED
7036
7037Theorem HAS_INTEGRAL_INTERIOR:
7038   !f:real->real y s.
7039        negligible(frontier s)
7040        ==> ((f has_integral y) (interior s) <=> (f has_integral y) s)
7041Proof
7042  REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_INTEGRAL_SPIKE_SET_EQ THEN
7043  FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
7044    NEGLIGIBLE_SUBSET)) THEN
7045  REWRITE_TAC[frontier] THEN
7046  MP_TAC(ISPEC ``s:real->bool`` INTERIOR_SUBSET) THEN
7047  MP_TAC(ISPEC ``s:real->bool`` CLOSURE_SUBSET) THEN
7048  SET_TAC[]
7049QED
7050
7051Theorem HAS_INTEGRAL_CLOSURE:
7052   !f:real->real y s.
7053        negligible(frontier s)
7054        ==> ((f has_integral y) (closure s) <=> (f has_integral y) s)
7055Proof
7056  REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_INTEGRAL_SPIKE_SET_EQ THEN
7057  FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
7058    NEGLIGIBLE_SUBSET)) THEN
7059  REWRITE_TAC[frontier] THEN
7060  MP_TAC(ISPEC ``s:real->bool`` INTERIOR_SUBSET) THEN
7061  MP_TAC(ISPEC ``s:real->bool`` CLOSURE_SUBSET) THEN
7062  SET_TAC[]
7063QED
7064
7065Theorem INTEGRABLE_CASES:
7066   !P f g:real->real s.
7067        f integrable_on {x | x IN s /\ P x} /\
7068        g integrable_on {x | x IN s /\ ~P x}
7069        ==> (\x. if P x then f x else g x) integrable_on s
7070Proof
7071  REPEAT GEN_TAC THEN
7072  ONCE_REWRITE_TAC[GSYM INTEGRABLE_RESTRICT_UNIV] THEN
7073  DISCH_THEN(MP_TAC o MATCH_MP INTEGRABLE_ADD) THEN
7074  MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] INTEGRABLE_EQ) THEN
7075  SIMP_TAC std_ss [IN_UNIV, GSPECIFICATION] THEN
7076  METIS_TAC[REAL_ADD_LID, REAL_ADD_RID]
7077QED
7078
7079(* ------------------------------------------------------------------------- *)
7080(* More lemmas that are useful later.                                        *)
7081(* ------------------------------------------------------------------------- *)
7082
7083Theorem HAS_INTEGRAL_DROP_POS_AE:
7084   !f:real->real s t i.
7085        (f has_integral i) s /\
7086        negligible t /\ (!x. x IN s DIFF t ==> &0 <= f x)
7087        ==> &0 <= i
7088Proof
7089  REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_INTEGRAL_DROP_POS THEN
7090  EXISTS_TAC ``f:real->real`` THEN EXISTS_TAC ``s DIFF t:real->bool`` THEN
7091  ASM_REWRITE_TAC[] THEN MATCH_MP_TAC HAS_INTEGRAL_SPIKE_SET THEN
7092  EXISTS_TAC ``s:real->bool`` THEN ASM_REWRITE_TAC[] THEN
7093  FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
7094        NEGLIGIBLE_SUBSET)) THEN
7095  SET_TAC[]
7096QED
7097
7098Theorem INTEGRAL_DROP_POS_AE:
7099   !f:real->real s t.
7100        f integrable_on s /\
7101        negligible t /\ (!x. x IN s DIFF t ==> &0 <=(f x))
7102        ==> &0 <= (integral s f)
7103Proof
7104  REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_INTEGRAL_DROP_POS_AE THEN
7105  ASM_MESON_TAC[INTEGRABLE_INTEGRAL]
7106QED
7107
7108Theorem HAS_INTEGRAL_SUBSET_COMPONENT_LE:
7109   !f:real->real s t i j.
7110        s SUBSET t /\ (f has_integral i) s /\ (f has_integral j) t /\
7111        (!x. x IN t ==> &0 <= f(x))
7112        ==> i <= j
7113Proof
7114  REPEAT GEN_TAC THEN ONCE_REWRITE_TAC[GSYM HAS_INTEGRAL_RESTRICT_UNIV] THEN
7115  STRIP_TAC THEN MATCH_MP_TAC HAS_INTEGRAL_COMPONENT_LE THEN
7116  MAP_EVERY EXISTS_TAC
7117   [``(\x. if x IN s then f x else 0):real->real``,
7118    ``(\x. if x IN t then f x else 0):real->real``,
7119    ``univ(:real)``] THEN
7120  ASM_SIMP_TAC std_ss [] THEN
7121  REPEAT STRIP_TAC THEN
7122  REPEAT(COND_CASES_TAC THEN ASM_REWRITE_TAC[REAL_LE_REFL]) THEN
7123  ASM_SET_TAC[]
7124QED
7125
7126Theorem INTEGRAL_SUBSET_COMPONENT_LE:
7127   !f:real->real s t.
7128        s SUBSET t /\ f integrable_on s /\ f integrable_on t /\
7129        (!x. x IN t ==> &0 <= f(x))
7130        ==> (integral s f) <= (integral t f)
7131Proof
7132  REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_INTEGRAL_SUBSET_COMPONENT_LE THEN
7133  ASM_MESON_TAC[INTEGRABLE_INTEGRAL]
7134QED
7135
7136Theorem HAS_INTEGRAL_SUBSET_DROP_LE:
7137   !f:real->real s t i j.
7138        s SUBSET t /\ (f has_integral i) s /\ (f has_integral j) t /\
7139        (!x. x IN t ==> &0 <= (f x))
7140        ==> i <= j
7141Proof
7142  REPEAT STRIP_TAC THEN
7143  MATCH_MP_TAC HAS_INTEGRAL_SUBSET_COMPONENT_LE THEN
7144  REWRITE_TAC[LESS_EQ_REFL] THEN ASM_MESON_TAC[]
7145QED
7146
7147Theorem INTEGRAL_SUBSET_DROP_LE:
7148   !f:real->real s t.
7149        s SUBSET t /\ f integrable_on s /\ f integrable_on t /\
7150        (!x. x IN t ==> &0 <= (f(x)))
7151        ==> (integral s f) <= (integral t f)
7152Proof
7153  REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_INTEGRAL_SUBSET_DROP_LE THEN
7154  ASM_MESON_TAC[INTEGRABLE_INTEGRAL]
7155QED
7156
7157Theorem HAS_INTEGRAL_ALT:
7158   !f:real->real s i.
7159        (f has_integral i) s <=>
7160            (!a b. (\x. if x IN s then f x else 0)
7161                   integrable_on interval[a,b]) /\
7162            (!e. &0 < e
7163                 ==> ?B. &0 < B /\
7164                         !a b. ball (0,B) SUBSET interval[a,b]
7165                               ==> abs(integral(interval[a,b])
7166                                          (\x. if x IN s then f x else 0) -
7167                                        i) < e)
7168Proof
7169  REPEAT GEN_TAC THEN GEN_REWR_TAC LAND_CONV [HAS_INTEGRAL] THEN
7170  SPEC_TAC(``\x. if x IN s then (f:real->real) x else 0``,
7171           ``f:real->real``) THEN
7172  GEN_TAC THEN EQ_TAC THENL
7173   [ALL_TAC, MESON_TAC[INTEGRAL_UNIQUE, integrable_on]] THEN
7174  DISCH_TAC THEN CONJ_TAC THENL
7175   [ALL_TAC, ASM_MESON_TAC[INTEGRAL_UNIQUE]] THEN
7176  MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``] THEN
7177  POP_ASSUM(MP_TAC o C MATCH_MP REAL_LT_01) THEN
7178  DISCH_THEN(X_CHOOSE_THEN ``B:real`` STRIP_ASSUME_TAC) THEN
7179  MATCH_MP_TAC INTEGRABLE_SUBINTERVAL THEN
7180  EXISTS_TAC ``(@f. f = min ((a:real)) (-B)):real`` THEN
7181  EXISTS_TAC ``(@f. f = max ((b:real)) B):real`` THEN CONJ_TAC THENL
7182   [FIRST_X_ASSUM(MP_TAC o SPECL
7183     [``(@f. f = min ((a:real)) (-B)):real``,
7184      ``(@f. f = max ((b:real)) B):real``]) THEN
7185    KNOW_TAC ``ball ((0 :real),(B :real)) SUBSET
7186     interval
7187       [((@(f :real). f = min (a :real) (-B)),
7188         @(f :real). f = max (b :real) B)]`` THENL
7189    [ALL_TAC, MESON_TAC[integrable_on]], ALL_TAC] THEN
7190    SIMP_TAC std_ss [SUBSET_DEF, IN_INTERVAL, IN_BALL,
7191             REAL_MIN_LE, REAL_LE_MAX] THEN REWRITE_TAC [dist] THEN REAL_ARITH_TAC
7192QED
7193
7194Theorem INTEGRABLE_ALT:
7195   !f:real->real s.
7196        f integrable_on s <=>
7197          (!a b. (\x. if x IN s then f x else 0) integrable_on
7198                 interval[a,b]) /\
7199          (!e. &0 < e
7200               ==> ?B. &0 < B /\
7201                       !a b c d.
7202                          ball(0,B) SUBSET interval[a,b] /\
7203                          ball(0,B) SUBSET interval[c,d]
7204                          ==> abs(integral (interval[a,b])
7205                                    (\x. if x IN s then f x else 0) -
7206                                   integral (interval[c,d])
7207                                    (\x. if x IN s then f x else 0)) < e)
7208Proof
7209  REPEAT GEN_TAC THEN
7210  GEN_REWR_TAC LAND_CONV [integrable_on] THEN
7211  ONCE_REWRITE_TAC[HAS_INTEGRAL_ALT] THEN
7212  SIMP_TAC std_ss [RIGHT_EXISTS_AND_THM] THEN
7213  MATCH_MP_TAC(TAUT `(a ==> (b <=> c)) ==> (a /\ b <=> a /\ c)`) THEN
7214  DISCH_TAC THEN EQ_TAC THENL
7215   [DISCH_THEN(X_CHOOSE_THEN ``y:real`` STRIP_ASSUME_TAC) THEN
7216    X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
7217    FIRST_X_ASSUM(MP_TAC o SPEC ``e / &2:real``) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
7218    DISCH_THEN (X_CHOOSE_TAC ``B:real``) THEN EXISTS_TAC ``B:real`` THEN
7219    METIS_TAC[REAL_ARITH ``abs(a - y) < e / (&2:real) /\ abs(b - y) < e / &2
7220                          ==> abs(a - b) < e / &2 + e / &2``, REAL_HALF],
7221    ALL_TAC] THEN
7222  DISCH_TAC THEN
7223  SUBGOAL_THEN
7224   ``cauchy (\n. integral (interval[(@f. f = -(&n)),(@f. f = &n)])
7225                         (\x. if x IN s then (f:real->real) x else 0))``
7226  MP_TAC THENL
7227   [REWRITE_TAC[cauchy] THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
7228    FIRST_X_ASSUM(MP_TAC o SPEC ``e:real``) THEN ASM_REWRITE_TAC[] THEN
7229    DISCH_THEN(X_CHOOSE_THEN ``B:real`` STRIP_ASSUME_TAC) THEN
7230    MP_TAC(SPEC ``B:real`` SIMP_REAL_ARCH) THEN
7231    DISCH_THEN (X_CHOOSE_TAC ``N:num``) THEN EXISTS_TAC ``N:num`` THEN
7232    REPEAT STRIP_TAC THEN REWRITE_TAC[dist] THEN BETA_TAC THEN
7233    FIRST_X_ASSUM MATCH_MP_TAC THEN
7234    REWRITE_TAC[SUBSET_DEF, IN_BALL, DIST_0] THEN
7235    CONJ_TAC,
7236    REWRITE_TAC[GSYM CONVERGENT_EQ_CAUCHY] THEN
7237    DISCH_THEN (X_CHOOSE_TAC ``i:real``) THEN EXISTS_TAC ``i:real`` THEN
7238    POP_ASSUM MP_TAC THEN REWRITE_TAC[LIM_SEQUENTIALLY] THEN DISCH_TAC THEN
7239    X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
7240    UNDISCH_TAC ``!(e :real). (0 :real) < e ==>
7241            ?(N :num). !(n :num).  N <= n ==>
7242                (dist ((\(n :num).
7243                       integral (interval
7244                            [((@(f :real). f = -((&n) :real)),
7245                              @(f :real). f = ((&n) :real))])
7246                         (\(x :real).
7247                            if x IN (s :real -> bool) then
7248                              (f :real -> real) x
7249                            else (0 :real))) n,(i :real)) :real) < e`` THEN
7250    DISCH_TAC THEN
7251    FIRST_X_ASSUM (MP_TAC o SPEC ``e / &2:real``) THEN
7252    FIRST_X_ASSUM(MP_TAC o SPEC ``e / &2:real``) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
7253    DISCH_THEN(X_CHOOSE_THEN ``B:real`` STRIP_ASSUME_TAC) THEN
7254    DISCH_THEN(X_CHOOSE_THEN ``N:num`` ASSUME_TAC) THEN
7255    MP_TAC(SPEC ``max (&N) B:real`` SIMP_REAL_ARCH) THEN
7256    REWRITE_TAC[REAL_MAX_LE, REAL_OF_NUM_LE] THEN
7257    DISCH_THEN(X_CHOOSE_THEN ``n:num`` STRIP_ASSUME_TAC) THEN
7258    EXISTS_TAC ``&n:real`` THEN CONJ_TAC THENL
7259     [METIS_TAC [REAL_LTE_TRANS], ALL_TAC] THEN
7260    MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``] THEN STRIP_TAC THEN
7261    FIRST_X_ASSUM(MP_TAC o SPEC ``n:num``) THEN ASM_SIMP_TAC std_ss [] THEN
7262    GEN_REWR_TAC (RAND_CONV o RAND_CONV) [GSYM REAL_HALF] THEN
7263        REWRITE_TAC [dist] THEN
7264    MATCH_MP_TAC(REAL_ARITH
7265     ``abs(i1 - i2) < e / &2 ==> abs(i1 - i) < e / &2 ==>
7266       abs(i2 - i) < e / &2 + e / &2:real``) THEN
7267    FIRST_X_ASSUM MATCH_MP_TAC THEN CONJ_TAC THEN
7268    MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC ``ball(0:real,&n)`` THEN
7269    ASM_SIMP_TAC std_ss [SUBSET_BALL] THEN
7270    REWRITE_TAC[SUBSET_DEF, IN_BALL, DIST_0]] THEN
7271  X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN
7272  SIMP_TAC std_ss [IN_INTERVAL] THEN REPEAT GEN_TAC THEN
7273  REWRITE_TAC[GSYM ABS_BOUNDS] THEN MATCH_MP_TAC REAL_LE_TRANS THEN
7274  EXISTS_TAC ``abs(x:real)`` THEN ASM_SIMP_TAC std_ss [REAL_LE_REFL] THEN
7275  REPEAT(POP_ASSUM MP_TAC) THEN REWRITE_TAC[GSYM REAL_OF_NUM_GE, real_ge] THEN
7276  METIS_TAC [REAL_LE_TRANS, REAL_LE_LT]
7277QED
7278
7279Theorem INTEGRABLE_ALT_SUBSET:
7280   !f:real->real s.
7281        f integrable_on s <=>
7282          (!a b. (\x. if x IN s then f x else 0) integrable_on
7283                 interval[a,b]) /\
7284          (!e. &0 < e
7285               ==> ?B. &0 < B /\
7286                       !a b c d.
7287                          ball(0,B) SUBSET interval[a,b] /\
7288                          interval[a,b] SUBSET interval[c,d]
7289                          ==> abs(integral (interval[a,b])
7290                                    (\x. if x IN s then f x else 0) -
7291                                   integral (interval[c,d])
7292                                    (\x. if x IN s then f x else 0)) < e)
7293Proof
7294  REPEAT GEN_TAC THEN GEN_REWR_TAC LAND_CONV [INTEGRABLE_ALT] THEN
7295  ABBREV_TAC ``g:real->real = \x. if x IN s then f x else 0`` THEN
7296  POP_ASSUM(K ALL_TAC) THEN
7297  MATCH_MP_TAC(TAUT `(a ==> (b <=> c)) ==> (a /\ b <=> a /\ c)`) THEN
7298  DISCH_TAC THEN EQ_TAC THENL [MESON_TAC[SUBSET_TRANS], ALL_TAC] THEN
7299  DISCH_TAC THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
7300  FIRST_X_ASSUM(MP_TAC o SPEC ``e / &2:real``) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
7301  STRIP_TAC THEN EXISTS_TAC ``B:real`` THEN
7302  ASM_REWRITE_TAC[] THEN
7303  MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``, ``c:real``, ``d:real``] THEN
7304  STRIP_TAC THEN
7305  FIRST_X_ASSUM(MP_TAC o SPECL
7306   [``(@f. f = max ((a:real)) ((c:real))):real``,
7307    ``(@f. f = min ((b:real)) ((d:real))):real``]) THEN
7308  ASM_SIMP_TAC std_ss [GSYM INTER_INTERVAL, SUBSET_INTER] THEN
7309  DISCH_THEN(fn th =>
7310    MP_TAC(ISPECL [``a:real``, ``b:real``] th) THEN
7311    MP_TAC(ISPECL [``c:real``, ``d:real``] th)) THEN
7312  ASM_SIMP_TAC std_ss [INTER_SUBSET] THEN
7313  GEN_REWR_TAC (RAND_CONV o RAND_CONV o RAND_CONV) [GSYM REAL_HALF] THEN REAL_ARITH_TAC
7314QED
7315
7316Theorem INTEGRABLE_ON_SUBINTERVAL:
7317   !f:real->real s a b.
7318        f integrable_on s /\ interval[a,b] SUBSET s
7319        ==> f integrable_on interval[a,b]
7320Proof
7321  REPEAT GEN_TAC THEN
7322  GEN_REWR_TAC (LAND_CONV o LAND_CONV) [INTEGRABLE_ALT] THEN
7323  DISCH_THEN(CONJUNCTS_THEN2 (MP_TAC o CONJUNCT1) ASSUME_TAC) THEN
7324  DISCH_THEN(MP_TAC o SPECL [``a:real``, ``b:real``]) THEN
7325  MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] INTEGRABLE_EQ) THEN
7326  ASM_SET_TAC[]
7327QED
7328
7329Theorem INTEGRAL_SPLIT :
7330    !f:real->real a b t.
7331        f integrable_on interval[a,b]
7332        ==> (integral (interval[a,b]) f =
7333                integral(interval [a,(@f. f = min (b) t)]) f +
7334                integral(interval [(@f. f = max (a) t),b]) f)
7335Proof
7336    rpt STRIP_TAC THEN MATCH_MP_TAC INTEGRAL_UNIQUE
7337 >> MATCH_MP_TAC HAS_INTEGRAL_SPLIT THEN EXISTS_TAC ``t:real``
7338 >> ASM_SIMP_TAC std_ss [INTERVAL_SPLIT, GSYM HAS_INTEGRAL_INTEGRAL]
7339 >> CONJ_TAC THEN MATCH_MP_TAC INTEGRABLE_ON_SUBINTERVAL
7340 >> EXISTS_TAC ``interval[a:real,b]``
7341 >> ASM_SIMP_TAC std_ss [SUBSET_INTERVAL, min_def, max_def]
7342 >> TRY COND_CASES_TAC
7343 >> rpt STRIP_TAC >> ASM_REAL_ARITH_TAC
7344QED
7345
7346Theorem INTEGRAL_SPLIT_SIGNED :
7347    !f:real->real a b t.
7348        a <= t /\ a <= b /\
7349        f integrable_on interval[a,(@f. f = max (b) t)]
7350        ==> (integral (interval[a,b]) f =
7351                integral(interval
7352                 [a,(@f. f = t)]) f +
7353                (if b < t then -&1 else &1) *
7354                integral(interval [(@f. f = min (b) t), (@f. f = max (b) t)]) f)
7355Proof
7356  REPEAT STRIP_TAC THEN COND_CASES_TAC THEN ASM_SIMP_TAC std_ss [] THENL
7357  [ (* goal 1 (of 2) *)
7358    MP_TAC(ISPECL
7359    [``f:real->real``, ``a:real``,
7360     ``(@f. f = t):real``, ``(b:real)``] INTEGRAL_SPLIT) THEN
7361    ASM_SIMP_TAC std_ss [] THEN KNOW_TAC ``f integrable_on interval [(a,t)]`` THENL
7362     [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
7363       (REWRITE_RULE[IMP_CONJ] INTEGRABLE_ON_SUBINTERVAL)) THEN
7364      ASM_SIMP_TAC std_ss [SUBSET_INTERVAL] THEN
7365      REPEAT STRIP_TAC THEN TRY COND_CASES_TAC THEN
7366      ASM_SIMP_TAC std_ss [max_def, REAL_LE_REFL] THEN
7367(* HOL's REAL_ASM_ARITH_TAC failed to solve:
7368
7369        t <= if b <= t then t else b
7370   ------------------------------------
7371    0.  a <= t
7372    1.  a <= b
7373    2.  b < t
7374 *)
7375     `b <= t` by PROVE_TAC [REAL_LT_IMP_LE] >> fs [REAL_LE_REFL],
7376
7377      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
7378      DISCH_THEN SUBST1_TAC THEN MATCH_MP_TAC(REAL_ARITH
7379       ``(x = y) /\ (w = z)
7380        ==> (x:real = (y + z) + -(&1) * w)``) THEN
7381      CONJ_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN
7382      SIMP_TAC std_ss [CONS_11, PAIR_EQ] THEN TRY CONJ_TAC THEN
7383      ASM_SIMP_TAC std_ss [min_def, max_def] THEN
7384      COND_CASES_TAC >> ASM_REAL_ARITH_TAC],
7385    (* goal 2 (of 2) *)
7386    MP_TAC(ISPECL
7387    [``f:real->real``, ``a:real``,
7388     ``b:real``, ``t:real``] INTEGRAL_SPLIT) THEN
7389    ASM_SIMP_TAC std_ss [] THEN KNOW_TAC ``f integrable_on interval [(a,b)]`` THENL
7390     [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
7391       (REWRITE_RULE[IMP_CONJ] INTEGRABLE_ON_SUBINTERVAL)) THEN
7392      ASM_SIMP_TAC std_ss [SUBSET_INTERVAL] THEN
7393      REPEAT STRIP_TAC THEN TRY COND_CASES_TAC THEN
7394      ASM_REWRITE_TAC[min_def, max_def, REAL_LE_REFL] THEN
7395      COND_CASES_TAC >> ASM_REAL_ARITH_TAC,
7396
7397      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
7398      DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[REAL_MUL_LID] THEN
7399      BINOP_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN
7400      SIMP_TAC std_ss [CONS_11, PAIR_EQ] THEN TRY CONJ_TAC THEN
7401      ASM_SIMP_TAC std_ss [min_def, max_def] THEN
7402      COND_CASES_TAC >> ASM_REAL_ARITH_TAC ] ]
7403QED
7404
7405Theorem lemma1[local]:
7406     !f:(num->bool)->real n.
7407          sum {s | s SUBSET { 1n..SUC n}} f =
7408          sum {s | s SUBSET { 1n..n}} f +
7409          sum {s | s SUBSET { 1n..n}} (\s. f(SUC n INSERT s))
7410Proof
7411    REPEAT STRIP_TAC THEN
7412    REWRITE_TAC[NUMSEG_CLAUSES, ARITH_PROVE ``1 <= SUC n``, POWERSET_CLAUSES] THEN
7413    W(MP_TAC o PART_MATCH (lhs o rand) SUM_UNION o lhs o snd) THEN
7414    KNOW_TAC ``FINITE {s | s SUBSET {1 .. n}} /\
7415     FINITE
7416       (IMAGE (\(s :num -> bool). SUC n INSERT s)
7417          {s | s SUBSET { 1 .. n}}) /\
7418     DISJOINT {s | s SUBSET { 1 .. n}}
7419       (IMAGE (\(s :num -> bool). SUC n INSERT s)
7420          {s | s SUBSET { 1 .. n}}) `` THENL
7421     [ASM_SIMP_TAC std_ss [IMAGE_FINITE, FINITE_POWERSET, FINITE_NUMSEG] THEN
7422      REWRITE_TAC[SET_RULE
7423       ``DISJOINT s (IMAGE f t) <=> !x. x IN t ==> ~(f x IN s)``] THEN
7424      GEN_TAC THEN DISCH_TAC THEN SIMP_TAC std_ss [GSPECIFICATION, SUBSET_DEF] THEN
7425      EXISTS_TAC ``SUC n`` THEN
7426      REWRITE_TAC[IN_INSERT, IN_NUMSEG] THEN ARITH_TAC,
7427      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
7428      DISCH_THEN SUBST1_TAC THEN AP_TERM_TAC THEN
7429      REWRITE_TAC [METIS [o_DEF] `` (\s. f (SUC n INSERT s)) = f o (\s. SUC n INSERT s)``]
7430      THEN MATCH_MP_TAC (SUM_IMAGE) THEN
7431      SIMP_TAC std_ss [FINITE_POWERSET, FINITE_NUMSEG] THEN
7432      MAP_EVERY X_GEN_TAC [``s:num->bool``, ``t:num->bool``] THEN
7433      SIMP_TAC std_ss [GSPECIFICATION] THEN MATCH_MP_TAC(SET_RULE
7434       ``~(a IN i)
7435        ==> s SUBSET i /\ t SUBSET i /\ (a INSERT s = a INSERT t)
7436            ==> (s = t)``) THEN
7437      REWRITE_TAC[IN_NUMSEG] THEN ARITH_TAC]
7438QED
7439
7440Theorem lemma2[local]:
7441     !f:real->real m a:real c:real d:real.
7442          f integrable_on univ(:real) /\ m <= 1n /\
7443          ((a = c) \/ (d = c)) /\
7444          ((a = c) ==> (a = d)) /\ ((a <= c) /\ (a <= d))
7445          ==> (integral(interval[a,d]) f =
7446                sum {s | s SUBSET {1..m}}
7447                 (\s. -(&1) pow CARD {i | i IN s /\ d < c} *
7448                   integral
7449                    (interval[(@f. f = if  1n IN s then min c d else a:real),
7450                              (@f. f = if  1n IN s then max c d else c:real)]) f))
7451Proof
7452    GEN_TAC THEN INDUCT_TAC THENL
7453     [SIMP_TAC arith_ss [NUMSEG_CLAUSES, SUBSET_EMPTY, GSPEC_EQ, GSPEC_EQ2] THEN
7454      SIMP_TAC std_ss [SUM_SING, NOT_IN_EMPTY, GSPEC_F, CARD_EMPTY, CARD_INSERT] THEN
7455      REWRITE_TAC[pow, REAL_MUL_LID] THEN REPEAT GEN_TAC THEN
7456      REWRITE_TAC [IMP_CONJ] THEN REPEAT DISCH_TAC THEN
7457      ASM_CASES_TAC ``((a:real) = (c:real))``
7458      THENL
7459       [MATCH_MP_TAC(MESON[] ``(i = 0) /\ (j = 0) ==> (i:real = j)``) THEN
7460        CONJ_TAC THEN MATCH_MP_TAC INTEGRAL_NULL THEN
7461        REWRITE_TAC [CONTENT_EQ_0] THEN ASM_MESON_TAC[],
7462        SUBGOAL_THEN ``d:real = c:real`` (fn th => REWRITE_TAC[th]) THEN
7463        ASM_MESON_TAC[]],
7464      ALL_TAC] THEN
7465    REPEAT GEN_TAC THEN REWRITE_TAC [IMP_CONJ] THEN
7466    REPEAT DISCH_TAC THEN SIMP_TAC std_ss [lemma1] THEN
7467    SUBGOAL_THEN
7468     ``!s. s SUBSET { 1n..m}
7469          ==> (-(&1:real) pow CARD {i | i IN SUC m INSERT s /\ d < c} =
7470              (if (d:real) < (c:real) then -&1 else &1) *
7471              -(&1:real) pow CARD {i | i IN s /\ d < c})``
7472     (fn th => SIMP_TAC std_ss [th, GSPECIFICATION]) THENL
7473     [X_GEN_TAC ``s:num->bool`` THEN DISCH_TAC THEN
7474      SUBGOAL_THEN ``FINITE(s:num->bool)`` ASSUME_TAC THENL
7475       [ASM_MESON_TAC[FINITE_NUMSEG, FINITE_SUBSET], ALL_TAC] THEN
7476      COND_CASES_TAC THENL
7477       [ASM_SIMP_TAC std_ss [CARD_INSERT, FINITE_RESTRICT, SET_RULE
7478         ``({x | x IN a INSERT s} = a INSERT {x | x IN s})``,
7479         SET_RULE ``{x | x IN s} = s``] THEN
7480        RULE_ASSUM_TAC (SIMP_RULE arith_ss [ARITH_PROVE ``SUC m <= 1 <=> (m = 0)``]) THEN
7481        UNDISCH_TAC ``s SUBSET { 1n .. m}`` THEN
7482        ASM_REWRITE_TAC [NUMSEG_CLAUSES] THEN DISCH_TAC THEN
7483        RULE_ASSUM_TAC (SIMP_RULE arith_ss [SUBSET_DEF, NOT_IN_EMPTY]) THEN
7484        FIRST_ASSUM (ASSUME_TAC o SPEC ``1:num``) THEN ASM_SIMP_TAC arith_ss [pow],
7485        ASM_SIMP_TAC std_ss [REAL_MUL_LID, SET_RULE
7486         ``{x | x IN a INSERT s /\ F} = {x | x IN s /\ F}``]],
7487      ALL_TAC] THEN
7488    MP_TAC(ISPECL
7489     [``f:real->real``, ``a:real``, ``d:real``, ``(c:real)``]
7490         INTEGRAL_SPLIT_SIGNED) THEN SIMP_TAC std_ss [] THEN
7491    KNOW_TAC ``a <= c /\ a <= d:real /\ f integrable_on interval [(a,max d c)]`` THENL
7492     [ASM_MESON_TAC[ARITH_PROVE ``1 <= SUC n``, INTEGRABLE_ON_SUBINTERVAL,
7493                    SUBSET_UNIV], DISCH_TAC THEN ASM_REWRITE_TAC [] THEN
7494      POP_ASSUM K_TAC THEN DISCH_THEN SUBST1_TAC] THEN
7495    RULE_ASSUM_TAC (SIMP_RULE arith_ss [ARITH_PROVE ``SUC m <= 1 <=> (m = 0)``]) THEN
7496    ASM_SIMP_TAC arith_ss [NUMSEG_CLAUSES, SUBSET_DEF, NOT_IN_EMPTY] THEN
7497    SIMP_TAC std_ss [SET_RULE ``!s.  1n IN 1 INSERT s``] THEN
7498    KNOW_TAC ``!s. {(s:num->bool) | !x. x NOTIN s} = {{}}`` THENL
7499    [GEN_TAC THEN SIMP_TAC std_ss [EXTENSION, GSPECIFICATION, IN_SING, NOT_IN_EMPTY] THEN
7500     GEN_TAC THEN EQ_TAC THEN STRIP_TAC THENL [METIS_TAC [], ALL_TAC] THEN
7501     EXISTS_TAC ``x:num->bool`` THEN METIS_TAC [], DISCH_TAC] THEN
7502    ASM_SIMP_TAC std_ss [SUM_SING, IN_SING, NOT_IN_EMPTY] THEN BINOP_TAC THENL
7503    [SIMP_TAC real_ss [GSPEC_F, CARD_EMPTY, pow], ALL_TAC] THEN
7504    ASM_CASES_TAC ``d < c:real`` THENL [UNDISCH_TAC ``(a = c) ==> (c = d:real)`` THEN
7505     UNDISCH_TAC ``(a = c) \/ (d = c:real)`` THEN POP_ASSUM MP_TAC THEN
7506     REAL_ARITH_TAC, ALL_TAC] THEN
7507    ASM_SIMP_TAC std_ss [] THEN KNOW_TAC ``(c = d:real)`` THENL
7508    [UNDISCH_TAC ``(a = c) ==> (c = d:real)`` THEN
7509     UNDISCH_TAC ``(a = c) \/ (d = c:real)`` THEN POP_ASSUM MP_TAC THEN
7510     REAL_ARITH_TAC, SIMP_TAC real_ss [REAL_LE_LT, min_def, max_def]] THEN
7511     DISCH_TAC THEN SIMP_TAC real_ss [GSPEC_F, CARD_EMPTY, pow]
7512QED
7513
7514Theorem HAS_INTEGRAL_REFLECT_GEN:
7515   !f:real->real i s.
7516     ((\x. f(-x)) has_integral i) s <=> (f has_integral i) (IMAGE (\x. -x) s)
7517Proof
7518  REPEAT GEN_TAC THEN ONCE_REWRITE_TAC[HAS_INTEGRAL_ALT] THEN
7519  SIMP_TAC std_ss [] THEN
7520  GEN_REWR_TAC (LAND_CONV o ONCE_DEPTH_CONV)
7521   [GSYM INTEGRABLE_REFLECT, GSYM INTEGRAL_REFLECT] THEN
7522  SIMP_TAC std_ss [IN_IMAGE, REAL_NEG_NEG] THEN
7523  REWRITE_TAC[UNWIND_THM1, REAL_ARITH ``(x:real = -y) <=> (-x = y)``] THEN
7524  KNOW_TAC ``!x:real. ?x'. -x = x'`` THENL
7525  [GEN_TAC THEN EXISTS_TAC ``-x:real`` THEN SIMP_TAC std_ss [],
7526   DISCH_TAC] THEN ASM_SIMP_TAC std_ss [] THEN
7527  ONCE_REWRITE_TAC [METIS []
7528       ``((\x. if -x IN s then f x else 0) integrable_on interval [(-b,-a)]) =
7529   (\a b. (\x. if -x IN s then f x else 0) integrable_on interval [(-b,-a)]) a b``] THEN
7530  ONCE_REWRITE_TAC [METIS []
7531   ``( ball (0,B) SUBSET interval [(a,b)] ==>
7532           abs
7533             (integral (interval [(-b,-a)])
7534                (\x. if -x IN s then f x else 0) - i) < e) =
7535     (\a b.  ball (0,B) SUBSET interval [(a,b)] ==>
7536           abs
7537             (integral (interval [(-b,-a)])
7538                (\x. if -x IN s then f x else 0) - i) < e) a b``] THEN
7539  GEN_REWR_TAC (LAND_CONV o ONCE_DEPTH_CONV) [METIS [REAL_NEG_NEG]
7540   ``(!x:real y:real. P x y) <=> (!x y. P (-y) (-x))``] THEN
7541  SIMP_TAC std_ss [REAL_NEG_NEG] THEN
7542  SIMP_TAC std_ss [SUBSET_DEF, IN_BALL_0, GSYM REFLECT_INTERVAL, IN_IMAGE] THEN
7543  SIMP_TAC std_ss [UNWIND_THM1, REAL_ARITH ``(x:real = -y) <=> (-x = y)``] THEN
7544  ONCE_REWRITE_TAC[GSYM ABS_NEG] THEN
7545  ONCE_REWRITE_TAC [METIS []
7546       ``(abs (-x') < B ==> -x' IN interval [(x,y)]) =
7547    (\x'. abs (-x') < B ==> -x' IN interval [(x,y)]) x'``] THEN
7548  SIMP_TAC std_ss [METIS [REAL_NEG_NEG] ``(!x:real. P (-x)) <=> (!x. P x)``] THEN
7549  SIMP_TAC std_ss [ABS_NEG]
7550QED
7551
7552Theorem INTEGRABLE_REFLECT_GEN:
7553   !f:real->real s.
7554        (\x. f(-x)) integrable_on s <=> f integrable_on (IMAGE (\x. -x) s)
7555Proof
7556  REWRITE_TAC[integrable_on, HAS_INTEGRAL_REFLECT_GEN]
7557QED
7558
7559Theorem INTEGRAL_REFLECT_GEN:
7560   !f:real->real s.
7561        integral s (\x. f(-x)) = integral (IMAGE (\x. -x) s) f
7562Proof
7563   REWRITE_TAC[integral, HAS_INTEGRAL_REFLECT_GEN]
7564QED
7565
7566(* ------------------------------------------------------------------------- *)
7567(* A straddling criterion for integrability.                                 *)
7568(* ------------------------------------------------------------------------- *)
7569
7570Theorem INTEGRABLE_STRADDLE_INTERVAL:
7571    !f:real->real a b.
7572        (!e. &0 < e
7573             ==> ?g h i j. (g has_integral i) (interval[a,b]) /\
7574                           (h has_integral j) (interval[a,b]) /\
7575                           abs(i - j) < e /\
7576                           !x. x IN interval[a,b]
7577                               ==> (g x) <= (f x) /\
7578                                   (f x) <= (h x))
7579        ==> f integrable_on interval[a,b]
7580Proof
7581  REPEAT STRIP_TAC THEN REWRITE_TAC[INTEGRABLE_CAUCHY] THEN
7582  X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
7583  FIRST_X_ASSUM(MP_TAC o SPEC ``e / &3:real``) THEN
7584  ASM_SIMP_TAC arith_ss [REAL_LT_DIV, REAL_LT, LEFT_IMP_EXISTS_THM] THEN
7585  MAP_EVERY X_GEN_TAC
7586   [``g:real->real``, ``h:real->real``, ``i:real``, ``j:real``] THEN
7587  REWRITE_TAC[has_integral] THEN REWRITE_TAC[IMP_CONJ] THEN
7588  DISCH_THEN(MP_TAC o SPEC ``e / &3:real``) THEN
7589  ASM_SIMP_TAC arith_ss [REAL_LT_DIV, REAL_LT] THEN
7590  DISCH_THEN(X_CHOOSE_THEN ``d1:real->real->bool`` STRIP_ASSUME_TAC) THEN
7591  DISCH_THEN(MP_TAC o SPEC ``e / &3:real``) THEN
7592  ASM_SIMP_TAC arith_ss [REAL_LT_DIV, REAL_LT] THEN
7593  DISCH_THEN(X_CHOOSE_THEN ``d2:real->real->bool`` STRIP_ASSUME_TAC) THEN
7594  DISCH_TAC THEN DISCH_TAC THEN
7595  EXISTS_TAC ``(\x. d1 x INTER d2 x):real->real->bool`` THEN
7596  ASM_SIMP_TAC std_ss [GAUGE_INTER, FINE_INTER] THEN
7597  MAP_EVERY X_GEN_TAC
7598   [``p1:(real#(real->bool))->bool``,
7599    ``p2:(real#(real->bool))->bool``] THEN
7600  REPEAT STRIP_TAC THEN
7601  REPEAT(FIRST_X_ASSUM(fn th =>
7602   MP_TAC(SPEC ``p1:(real#(real->bool))->bool`` th) THEN
7603   MP_TAC(SPEC ``p2:(real#(real->bool))->bool`` th))) THEN
7604  UNDISCH_TAC ``(p2 :real # (real -> bool) -> bool) tagged_division_of
7605          interval [((a :real),(b :real))]`` THEN DISCH_TAC THEN
7606  FIRST_ASSUM (fn th => ASSUME_TAC(MATCH_MP TAGGED_DIVISION_OF_FINITE th)) THEN
7607  UNDISCH_TAC ``(p1 :real # (real -> bool) -> bool) tagged_division_of
7608          interval [((a :real),(b :real))]`` THEN DISCH_TAC THEN
7609  FIRST_ASSUM (fn th => ASSUME_TAC(MATCH_MP TAGGED_DIVISION_OF_FINITE th)) THEN
7610  ASM_SIMP_TAC std_ss [LAMBDA_PROD] THEN
7611  KNOW_TAC ``!f1 f2 g1 g2 h1 h2 i j.
7612             (g1 - h2 <= f1 - f2) /\ (f1 - f2 <= h1 - g2) /\
7613    abs(i - j) < e / &3
7614    ==> abs(g2 - i) < e / &3
7615        ==> abs(g1 - i) < e / &3
7616            ==> abs(h2 - j) < e / &3
7617                ==> abs(h1 - j) < e / &3
7618                    ==> abs(f1 - f2) < e:real`` THENL
7619  [REPEAT GEN_TAC THEN SIMP_TAC std_ss [REAL_LT_RDIV_EQ, REAL_ARITH ``0 < &3:real``] THEN
7620   REAL_ARITH_TAC, DISCH_TAC] THEN
7621  FIRST_X_ASSUM (MATCH_MP_TAC) THEN
7622  ASM_SIMP_TAC std_ss [] THEN CONJ_TAC THEN
7623  MATCH_MP_TAC(REAL_ARITH ``x <= x' /\ y' <= y ==> x - y <= x' - y':real``) THEN
7624  CONJ_TAC THEN MATCH_MP_TAC SUM_LE THEN
7625  SIMP_TAC std_ss [FORALL_PROD] THEN REPEAT STRIP_TAC THEN
7626  ASM_SIMP_TAC std_ss [] THEN MATCH_MP_TAC REAL_LE_LMUL_IMP THEN
7627  METIS_TAC[TAGGED_DIVISION_OF, CONTENT_POS_LE, SUBSET_DEF]
7628QED
7629
7630Theorem lemma[local]:
7631    &0:real <= x /\ x <= y ==> abs x <= abs y
7632Proof
7633   REAL_ARITH_TAC
7634QED
7635
7636Theorem INTEGRABLE_STRADDLE :
7637    !f:real->real s.
7638        (!e. &0 < e
7639             ==> ?g h i j. (g has_integral i) s /\
7640                           (h has_integral j) s /\
7641                           abs(i - j) < e /\
7642                           !x. x IN s
7643                               ==> (g x) <= (f x) /\
7644                                   (f x) <= (h x))
7645        ==> f integrable_on s
7646Proof
7647  REPEAT STRIP_TAC THEN
7648  SUBGOAL_THEN
7649   ``!a b. (\x. if x IN s then (f:real->real) x else 0)
7650          integrable_on interval[a,b]``
7651  ASSUME_TAC THENL (* 2 subgoals *)
7652  [ (* goal 1 (of 2) *)
7653    RULE_ASSUM_TAC(REWRITE_RULE[HAS_INTEGRAL_ALT]) THEN
7654    MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``] THEN
7655    MATCH_MP_TAC INTEGRABLE_STRADDLE_INTERVAL THEN
7656    X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
7657    FIRST_X_ASSUM(MP_TAC o SPEC ``e / &4:real``) THEN
7658    ASM_SIMP_TAC arith_ss [REAL_LT_DIV, REAL_LT] THEN
7659    SIMP_TAC std_ss [LEFT_IMP_EXISTS_THM] THEN
7660    MAP_EVERY X_GEN_TAC
7661     [``g:real->real``, ``h:real->real``, ``i:real``, ``j:real``] THEN
7662    REWRITE_TAC[GSYM CONJ_ASSOC] THEN
7663    DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
7664    DISCH_THEN(CONJUNCTS_THEN2 (MP_TAC o SPEC ``e / &4:real``) MP_TAC) THEN
7665    DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
7666    DISCH_THEN(CONJUNCTS_THEN2 (MP_TAC o SPEC ``e / &4:real``) STRIP_ASSUME_TAC) THEN
7667    ASM_SIMP_TAC arith_ss [REAL_LT_DIV, REAL_LT] THEN
7668    DISCH_THEN(X_CHOOSE_THEN ``B2:real``
7669     (ASSUME_TAC)) THEN
7670    DISCH_THEN(X_CHOOSE_THEN ``B1:real``
7671     (ASSUME_TAC)) THEN
7672    MAP_EVERY EXISTS_TAC
7673     [``\x. if x IN s then (g:real->real) x else 0``,
7674      ``\x. if x IN s then (h:real->real) x else 0``,
7675      ``integral(interval[a:real,b])
7676         (\x. if x IN s then (g:real->real) x else 0:real)``,
7677      ``integral(interval[a:real,b])
7678         (\x. if x IN s then (h:real->real) x else 0:real)``] THEN
7679    ASM_SIMP_TAC std_ss [INTEGRABLE_INTEGRAL] THEN
7680    CONJ_TAC THENL [ALL_TAC, METIS_TAC[REAL_LE_REFL]] THEN
7681    ABBREV_TAC ``c:real = @f. f = min ((a:real)) (-(max B1 B2))`` THEN
7682    ABBREV_TAC ``d:real = @f. f = max ((b:real)) (max B1 B2)`` THEN
7683    UNDISCH_TAC `` 0 < B2 /\
7684          !a b.
7685            ball (0,B2) SUBSET interval [(a,b)] ==>
7686            abs
7687              (integral (interval [(a,b)]) (\x. if x IN s then h x else 0) -
7688               j) < e / 4:real`` THEN STRIP_TAC THEN
7689    POP_ASSUM (MP_TAC o SPECL [``c:real``, ``d:real``]) THEN
7690    UNDISCH_TAC ``0 < B1 /\
7691          !a b.
7692            ball (0,B1) SUBSET interval [(a,b)] ==>
7693            abs
7694              (integral (interval [(a,b)]) (\x. if x IN s then g x else 0) -
7695               i) < e / 4:real`` THEN STRIP_TAC THEN
7696    POP_ASSUM (MP_TAC o SPECL [``c:real``, ``d:real``]) THEN
7697    MATCH_MP_TAC(TAUT
7698        `(a /\ c) /\ (b /\ d ==> e) ==> (a ==> b) ==> (c ==> d) ==> e`) THEN
7699    CONJ_TAC THENL
7700    [ CONJ_TAC THEN MAP_EVERY EXPAND_TAC ["c", "d"] THEN
7701      SIMP_TAC std_ss [SUBSET_DEF, IN_BALL, IN_INTERVAL] THEN
7702      GEN_TAC THEN REWRITE_TAC[DIST_0] THEN DISCH_TAC THEN (* 2 goals *)
7703      MATCH_MP_TAC ABS_BOUNDS_MIN_MAX THEN
7704      MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC ``abs(x:real)`` THEN
7705      ASM_SIMP_TAC std_ss [REAL_LT_IMP_LE, REAL_LE_MAX, REAL_LE_REFL],
7706      ALL_TAC ] THEN
7707
7708    KNOW_TAC ``!ah ag ch cg.
7709            abs(i - j) < e / &4:real /\
7710         abs(ah - ag) <= abs(ch - cg)
7711        ==> abs(cg - i) < e / &4 /\
7712            abs(ch - j) < e / &4
7713            ==> abs(ag - ah) < e`` THENL
7714    [REPEAT GEN_TAC THEN
7715         SIMP_TAC std_ss [REAL_LT_RDIV_EQ, REAL_ARITH ``0 < 4:real``] THEN
7716     REAL_ARITH_TAC, DISCH_TAC] THEN
7717    FIRST_X_ASSUM (MATCH_MP_TAC) THEN
7718    ASM_SIMP_TAC std_ss [] THEN ASM_SIMP_TAC std_ss [GSYM INTEGRAL_SUB] THEN
7719    MATCH_MP_TAC lemma THEN CONJ_TAC THENL
7720    [ MATCH_MP_TAC(HAS_INTEGRAL_DROP_POS) THEN
7721      MAP_EVERY EXISTS_TAC
7722       [``(\x. (if x IN s then h x else 0) - (if x IN s then g x else 0))
7723         :real->real``,
7724        ``interval[a:real,b]``] THEN
7725      ASM_SIMP_TAC std_ss [INTEGRABLE_INTEGRAL, HAS_INTEGRAL_SUB] THEN
7726      ASM_SIMP_TAC std_ss [INTEGRABLE_SUB, INTEGRABLE_INTEGRAL] THEN
7727      REPEAT STRIP_TAC THEN COND_CASES_TAC THEN
7728      ASM_SIMP_TAC std_ss [REAL_SUB_LE, REAL_POS] THEN
7729      ASM_MESON_TAC[REAL_LE_TRANS],
7730      ALL_TAC] THEN
7731    MATCH_MP_TAC (HAS_INTEGRAL_SUBSET_DROP_LE) THEN
7732    MAP_EVERY EXISTS_TAC
7733     [``(\x. (if x IN s then h x else 0) - (if x IN s then g x else 0))
7734       :real->real``,
7735      ``interval[a:real,b]``, ``interval[c:real,d]``] THEN
7736    ASM_SIMP_TAC std_ss [INTEGRABLE_SUB, INTEGRABLE_INTEGRAL] THEN CONJ_TAC THENL
7737    [ REWRITE_TAC[SUBSET_INTERVAL] THEN DISCH_TAC THEN
7738      MAP_EVERY EXPAND_TAC ["c", "d"] THEN
7739      SIMP_TAC std_ss [] \\
7740      PROVE_TAC [REAL_MIN_LE, REAL_LE_MAX, REAL_LE_REFL],
7741      ALL_TAC ] THEN
7742    REPEAT STRIP_TAC THEN COND_CASES_TAC THEN
7743    ASM_SIMP_TAC std_ss [REAL_SUB_LE, REAL_POS] THEN
7744    ASM_MESON_TAC[REAL_LE_TRANS],
7745  ALL_TAC] THEN
7746
7747  ONCE_REWRITE_TAC[INTEGRABLE_ALT] THEN ASM_REWRITE_TAC[] THEN
7748  X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
7749  UNDISCH_TAC`` !(e :real). (0 :real) < e ==>
7750            ?(g :real -> real) (h :real -> real) (i :real) (j :real).
7751              (g has_integral i) (s :real -> bool) /\
7752              (h has_integral j) s /\ abs (i - j) < e /\
7753              !(x :real).
7754                x IN s ==> g x <= (f :real -> real) x /\ f x <= h x`` THEN DISCH_TAC THEN
7755  FIRST_X_ASSUM(MP_TAC o SPEC ``e / &3:real``) THEN
7756  ASM_SIMP_TAC arith_ss [REAL_LT_DIV, REAL_LT] THEN
7757  ASM_SIMP_TAC std_ss [LEFT_IMP_EXISTS_THM, HAS_INTEGRAL_ALT] THEN
7758  MAP_EVERY X_GEN_TAC
7759   [``g:real->real``, ``h:real->real``, ``i:real``, ``j:real``] THEN
7760  DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
7761  DISCH_THEN(CONJUNCTS_THEN2 MP_TAC STRIP_ASSUME_TAC) THEN
7762  DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC (MP_TAC o SPEC ``e / &3:real``)) THEN
7763  FIRST_X_ASSUM(CONJUNCTS_THEN2 ASSUME_TAC (MP_TAC o SPEC ``e / &3:real``)) THEN
7764  ASM_SIMP_TAC arith_ss [REAL_LT_DIV, REAL_LT] THEN
7765  DISCH_THEN(X_CHOOSE_THEN ``B1:real`` (ASSUME_TAC)) THEN
7766  DISCH_THEN(X_CHOOSE_THEN ``B2:real`` (ASSUME_TAC)) THEN
7767  EXISTS_TAC ``max B1 B2:real`` THEN
7768  ASM_SIMP_TAC std_ss [REAL_LT_MAX, BALL_MAX_UNION, UNION_SUBSET] THEN
7769  MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``, ``c:real``, ``d:real``] THEN
7770  STRIP_TAC THEN REWRITE_TAC[] THEN
7771  KNOW_TAC ``e = e / &3 + e / &3 + e / &3:real`` THENL
7772  [REWRITE_TAC [GSYM REAL_ADD_RDISTRIB, real_div] THEN REWRITE_TAC [GSYM real_div] THEN
7773   SIMP_TAC std_ss [REAL_EQ_RDIV_EQ, REAL_ARITH ``0 < 3:real``] THEN REAL_ARITH_TAC,
7774   DISCH_TAC THEN ONCE_ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
7775  MATCH_MP_TAC(REAL_ARITH
7776   ``!ga gc ha hc i j.
7777        ga <= fa /\ fa <= ha /\
7778        gc <= fc /\ fc <= hc /\
7779        abs(ga - i) < e / &3 /\
7780        abs(gc - i) < e / &3 /\
7781        abs(ha - j) < e / &3 /\
7782        abs(hc - j) < e / &3 /\
7783        abs(i - j) < e / &3
7784        ==> abs(fa - fc) < e / &3 + e / &3 + e / &3:real``) THEN
7785  MAP_EVERY EXISTS_TAC
7786   [``(integral(interval[a:real,b]) (\x. if x IN s then g x else 0))``,
7787    ``(integral(interval[c:real,d]) (\x. if x IN s then g x else 0))``,
7788    ``(integral(interval[a:real,b]) (\x. if x IN s then h x else 0))``,
7789    ``(integral(interval[c:real,d]) (\x. if x IN s then h x else 0))``,
7790    ``i:real``, ``j:real``] THEN
7791  ASM_SIMP_TAC std_ss [] THEN
7792  REPEAT CONJ_TAC THEN MATCH_MP_TAC INTEGRAL_DROP_LE THEN
7793  ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN BETA_TAC THEN
7794  COND_CASES_TAC THEN ASM_SIMP_TAC std_ss [REAL_LE_REFL]
7795QED
7796
7797Theorem HAS_INTEGRAL_STRADDLE_NULL:
7798   !f g:real->real s.
7799        (!x. x IN s ==> &0 <= (f x) /\ (f x) <= (g x)) /\
7800        (g has_integral (0)) s
7801        ==> (f has_integral (0)) s
7802Proof
7803  REPEAT STRIP_TAC THEN REWRITE_TAC[HAS_INTEGRAL_INTEGRABLE_INTEGRAL] THEN
7804  MATCH_MP_TAC(TAUT `a /\ (a ==> b) ==> a /\ b`) THEN CONJ_TAC THENL
7805   [MATCH_MP_TAC INTEGRABLE_STRADDLE THEN
7806    GEN_TAC THEN DISCH_TAC THEN
7807    MAP_EVERY EXISTS_TAC
7808     [``(\x. 0):real->real``, ``g:real->real``,
7809      ``0:real``, ``0:real``] THEN
7810    ASM_SIMP_TAC std_ss [HAS_INTEGRAL_0, REAL_SUB_REFL, ABS_0],
7811    DISCH_TAC THEN
7812    REWRITE_TAC[GSYM REAL_LE_ANTISYM] THEN CONJ_TAC THENL
7813     [MATCH_MP_TAC(ISPECL [``f:real->real``, ``g:real->real``]
7814        HAS_INTEGRAL_DROP_LE),
7815      MATCH_MP_TAC(ISPECL [``(\x. 0):real->real``, ``f:real->real``]
7816        HAS_INTEGRAL_DROP_LE)] THEN
7817    EXISTS_TAC ``s:real->bool`` THEN
7818    ASM_SIMP_TAC std_ss [GSYM HAS_INTEGRAL_INTEGRAL, HAS_INTEGRAL_0]]
7819QED
7820
7821(* ------------------------------------------------------------------------- *)
7822(* Adding integrals over several sets.                                       *)
7823(* ------------------------------------------------------------------------- *)
7824
7825Theorem HAS_INTEGRAL_UNION:
7826   !f:real->real i j s t.
7827        (f has_integral i) s /\ (f has_integral j) t /\ negligible(s INTER t)
7828        ==> (f has_integral (i + j)) (s UNION t)
7829Proof
7830  REPEAT GEN_TAC THEN ONCE_REWRITE_TAC[GSYM HAS_INTEGRAL_RESTRICT_UNIV] THEN
7831  REWRITE_TAC[CONJ_ASSOC] THEN DISCH_THEN(CONJUNCTS_THEN ASSUME_TAC) THEN
7832  MATCH_MP_TAC HAS_INTEGRAL_SPIKE THEN
7833  EXISTS_TAC ``(\x. if x IN (s INTER t) then (&2:real) * f(x)
7834                   else if x IN (s UNION t) then f(x)
7835                   else 0:real):real->real`` THEN
7836  EXISTS_TAC ``s INTER t:real->bool`` THEN
7837  ASM_SIMP_TAC std_ss [IN_DIFF, IN_UNION, IN_INTER, IN_UNIV] THEN
7838  CONJ_TAC THENL [METIS_TAC[], ALL_TAC] THEN
7839  FIRST_X_ASSUM(MP_TAC o MATCH_MP HAS_INTEGRAL_ADD) THEN
7840  MATCH_MP_TAC EQ_IMPLIES THEN AP_THM_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN
7841  REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN
7842  MAP_EVERY ASM_CASES_TAC [``(x:real) IN s``, ``(x:real) IN t``] THEN
7843  ASM_SIMP_TAC std_ss[] THEN REAL_ARITH_TAC
7844QED
7845
7846Theorem INTEGRAL_UNION:
7847   !f:real->real s t.
7848        f integrable_on s /\ f integrable_on t /\ negligible(s INTER t)
7849        ==> (integral (s UNION t) f = integral s f + integral t f)
7850Proof
7851  REPEAT STRIP_TAC THEN
7852  MATCH_MP_TAC INTEGRAL_UNIQUE THEN
7853  MATCH_MP_TAC HAS_INTEGRAL_UNION THEN
7854  ASM_SIMP_TAC std_ss [GSYM HAS_INTEGRAL_INTEGRAL]
7855QED
7856
7857Theorem HAS_INTEGRAL_BIGUNION:
7858   !f:real->real i t.
7859        FINITE t /\
7860        (!s. s IN t ==> (f has_integral (i s)) s) /\
7861        (!s s'. s IN t /\ s' IN t /\ ~(s = s') ==> negligible(s INTER s'))
7862        ==> (f has_integral (sum t i)) (BIGUNION t)
7863Proof
7864  REPEAT GEN_TAC THEN ONCE_REWRITE_TAC[GSYM HAS_INTEGRAL_RESTRICT_UNIV] THEN
7865  REWRITE_TAC[CONJ_ASSOC] THEN DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
7866  DISCH_TAC THEN POP_ASSUM (MP_TAC o ONCE_REWRITE_RULE [METIS []
7867   ``!s:real->bool. (\x. if x IN s then (f:real->real) x else 0:real) =
7868               (\s. (\x. if x IN s then f x else 0:real)) s``]) THEN DISCH_TAC THEN
7869  FIRST_ASSUM(MP_TAC o MATCH_MP HAS_INTEGRAL_SUM) THEN SIMP_TAC std_ss [] THEN
7870  MATCH_MP_TAC(REWRITE_RULE[TAUT `a /\ b /\ c ==> d <=> a /\ b ==> c ==> d`]
7871                HAS_INTEGRAL_SPIKE) THEN
7872  EXISTS_TAC ``BIGUNION (IMAGE (\(a,b). a INTER b :real->bool)
7873                  {(a,b) | a IN t /\ b IN {y | y IN t /\ ~(a = y)}})`` THEN
7874  CONJ_TAC THENL
7875   [MATCH_MP_TAC NEGLIGIBLE_BIGUNION THEN CONJ_TAC THENL
7876     [MATCH_MP_TAC IMAGE_FINITE THEN
7877      ONCE_REWRITE_TAC [METIS []
7878      `` {(a,b) | a IN t /\ b IN {y | y IN t /\ a <> y}} =
7879    {(\a b. (a,b)) a b | a IN t /\ b IN (\a. {y | y IN t /\ a <> y}) a}``] THEN
7880     MATCH_MP_TAC FINITE_PRODUCT_DEPENDENT THEN
7881      ASM_SIMP_TAC std_ss [FINITE_RESTRICT],
7882      SIMP_TAC std_ss [FORALL_IN_IMAGE, FORALL_PROD, IN_ELIM_PAIR_THM] THEN
7883      ASM_SIMP_TAC std_ss [GSPECIFICATION]],
7884    X_GEN_TAC ``x:real`` THEN REWRITE_TAC[IN_UNIV, IN_DIFF] THEN
7885    ASM_CASES_TAC ``(x:real) IN BIGUNION t`` THEN ASM_SIMP_TAC std_ss [] THENL
7886     [ALL_TAC,
7887      RULE_ASSUM_TAC(REWRITE_RULE[SET_RULE
7888       ``~(x IN BIGUNION t) <=> !s. s IN t ==> ~(x IN s)``]) THEN
7889       DISCH_TAC THEN ONCE_REWRITE_TAC [METIS [SUM_0]
7890        ``0 = sum (t :(real -> bool) -> bool) (\(a :real -> bool). 0)``] THEN
7891        MATCH_MP_TAC SUM_EQ THEN GEN_TAC THEN DISCH_TAC THEN
7892                ASM_SIMP_TAC std_ss [SUM_0]] THEN
7893    FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [IN_BIGUNION]) THEN
7894    DISCH_THEN(X_CHOOSE_THEN ``a:real->bool`` STRIP_ASSUME_TAC) THEN
7895    REWRITE_TAC [IN_BIGUNION] THEN ONCE_REWRITE_TAC [CONJ_SYM] THEN
7896    ONCE_REWRITE_TAC [METIS [SPECIFICATION]
7897         ``x IN (s:real->bool) <=> (\s. x IN s) s``] THEN
7898    REWRITE_TAC [EXISTS_IN_IMAGE] THEN BETA_TAC THEN
7899    ONCE_REWRITE_TAC [METIS []
7900         ``(x' IN {(a,b) | a IN t /\ b IN {y | y IN t /\ a <> y}} /\
7901        x IN (\(a,b). a INTER b) x') <=>
7902        (\x'. x' IN {(a,b) | a IN t /\ b IN {y | y IN t /\ a <> y}} /\
7903        x IN (\(a,b). a INTER b) x') x'``] THEN
7904    REWRITE_TAC [EXISTS_PROD] THEN BETA_TAC THEN
7905    REWRITE_TAC [LAMBDA_PAIR] THEN BETA_TAC THEN REWRITE_TAC [FST, SND] THEN
7906    SIMP_TAC std_ss [IN_ELIM_PAIR_THM, NOT_EXISTS_THM] THEN
7907    ONCE_REWRITE_TAC [METIS [] ``a NOTIN b <=> ~(a IN b)``, GSYM DE_MORGAN_THM] THEN
7908    ONCE_REWRITE_TAC [METIS [] ``a NOTIN b <=> ~(a IN b)``, GSYM DE_MORGAN_THM] THEN
7909    DISCH_THEN(MP_TAC o SPEC ``a:real->bool``) THEN
7910    ASM_SIMP_TAC std_ss [GSPECIFICATION, IN_INTER] THEN
7911    ONCE_REWRITE_TAC [METIS [] ``a NOTIN b <=> ~(a IN b)``, GSYM DE_MORGAN_THM,
7912                      METIS [] ``(a = b) <=> ~(a <> b)``] THEN
7913    ONCE_REWRITE_TAC [METIS [] ``a NOTIN b <=> ~(a IN b)``, GSYM DE_MORGAN_THM,
7914                      METIS [] ``(a = b) <=> ~(a <> b)``] THEN
7915    ONCE_REWRITE_TAC [METIS [] ``a NOTIN b <=> ~(a IN b)``, GSYM DE_MORGAN_THM,
7916                      METIS [] ``(a = b) <=> ~(a <> b)``] THEN
7917     ASM_SIMP_TAC std_ss [METIS[]
7918     ``x IN a /\ a IN t
7919      ==> ((!b. ~((b IN t /\ ~(a = b)) /\ x IN b)) <=>
7920           (!b. b IN t ==> (x IN b <=> (b = a))))``] THEN DISCH_TAC THEN
7921    KNOW_TAC ``sum (t :(real -> bool) -> bool)
7922      (\(a :real -> bool). if x IN a then f x else (0 :real)) =
7923      sum (t :(real -> bool) -> bool)
7924      (\(b :real -> bool). if (b :real -> bool) = a then f x else (0 :real))`` THENL
7925    [MATCH_MP_TAC SUM_EQ THEN METIS_TAC [], DISCH_TAC THEN ASM_REWRITE_TAC []] THEN
7926    ASM_SIMP_TAC std_ss [SUM_DELTA]]
7927QED
7928
7929Theorem HAS_INTEGRAL_DIFF:
7930   !f:real->real i j s t.
7931    (f has_integral i) s /\
7932    (f has_integral j) t /\
7933    negligible (t DIFF s)
7934    ==> (f has_integral (i - j)) (s DIFF t)
7935Proof
7936  REPEAT GEN_TAC THEN ONCE_REWRITE_TAC[GSYM HAS_INTEGRAL_RESTRICT_UNIV] THEN
7937  REWRITE_TAC[CONJ_ASSOC] THEN DISCH_THEN(CONJUNCTS_THEN ASSUME_TAC) THEN
7938  MATCH_MP_TAC HAS_INTEGRAL_SPIKE THEN
7939  EXISTS_TAC ``(\x. if x IN (t DIFF s) then -(f x)
7940                   else if x IN (s DIFF t) then f x
7941                   else 0):real->real`` THEN
7942  EXISTS_TAC ``t DIFF s:real->bool`` THEN
7943  ASM_REWRITE_TAC[IN_DIFF, IN_UNION, IN_INTER, IN_UNIV] THEN
7944  CONJ_TAC THENL [METIS_TAC[], ALL_TAC] THEN
7945  FIRST_X_ASSUM(MP_TAC o MATCH_MP HAS_INTEGRAL_SUB) THEN
7946  MATCH_MP_TAC EQ_IMPLIES THEN AP_THM_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN
7947  REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN
7948  MAP_EVERY ASM_CASES_TAC [``(x:real) IN s``, ``(x:real) IN t``] THEN
7949  ASM_SIMP_TAC std_ss [] THEN REAL_ARITH_TAC
7950QED
7951
7952Theorem INTEGRAL_DIFF:
7953   !f:real->real s t.
7954        f integrable_on s /\ f integrable_on t /\ negligible(t DIFF s)
7955        ==> (integral (s DIFF t) f = integral s f - integral t f)
7956Proof
7957  REPEAT STRIP_TAC THEN
7958  MATCH_MP_TAC INTEGRAL_UNIQUE THEN
7959  MATCH_MP_TAC HAS_INTEGRAL_DIFF THEN
7960  ASM_SIMP_TAC std_ss [GSYM HAS_INTEGRAL_INTEGRAL]
7961QED
7962
7963(* ------------------------------------------------------------------------------ *)
7964(* In particular adding integrals over a division, maybe not of an interval. 7044 *)
7965(* ------------------------------------------------------------------------------ *)
7966
7967Theorem HAS_INTEGRAL_COMBINE_DIVISION:
7968   !f:real->real s d i.
7969        d division_of s /\
7970        (!k. k IN d ==> (f has_integral (i k)) k)
7971        ==> (f has_integral (sum d i)) s
7972Proof
7973  REPEAT STRIP_TAC THEN
7974  UNDISCH_TAC ``d division_of s`` THEN DISCH_TAC THEN
7975  FIRST_ASSUM(SUBST1_TAC o SYM o last o CONJUNCTS o
7976              REWRITE_RULE [division_of]) THEN
7977  MATCH_MP_TAC HAS_INTEGRAL_BIGUNION THEN ASM_REWRITE_TAC[] THEN
7978  CONJ_TAC THENL [ASM_MESON_TAC[DIVISION_OF_FINITE], ALL_TAC] THEN
7979  MAP_EVERY X_GEN_TAC [``k1:real->bool``, ``k2:real->bool``] THEN
7980  STRIP_TAC THEN
7981  SUBGOAL_THEN ``?u v:real x y:real.
7982                (k1 = interval[u,v]) /\ (k2 = interval[x,y])``
7983   (REPEAT_TCL CHOOSE_THEN (CONJUNCTS_THEN SUBST_ALL_TAC))
7984  THENL [ASM_MESON_TAC[division_of], ALL_TAC] THEN
7985  UNDISCH_TAC ``d division_of s`` THEN GEN_REWR_TAC LAND_CONV [division_of] THEN
7986  DISCH_THEN (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
7987  DISCH_THEN (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
7988  DISCH_THEN (CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
7989  DISCH_THEN(MP_TAC o SPECL
7990   [``interval[u:real,v]``, ``interval[x:real,y]``]) THEN
7991  ASM_REWRITE_TAC[INTERIOR_CLOSED_INTERVAL] THEN DISCH_TAC THEN
7992  MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
7993  EXISTS_TAC ``(interval[u,v:real] DIFF interval(u,v)) UNION
7994               (interval[x,y] DIFF interval(x,y))`` THEN
7995  SIMP_TAC std_ss [NEGLIGIBLE_FRONTIER_INTERVAL, NEGLIGIBLE_UNION] THEN
7996  ASM_SET_TAC[]
7997QED
7998
7999Theorem INTEGRAL_COMBINE_DIVISION_BOTTOMUP:
8000   !f:real->real d s.
8001        d division_of s /\ (!k. k IN d ==> f integrable_on k)
8002        ==> (integral s f = sum d (\i. integral i f))
8003Proof
8004  REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRAL_UNIQUE THEN
8005  MATCH_MP_TAC HAS_INTEGRAL_COMBINE_DIVISION THEN
8006  ASM_SIMP_TAC std_ss [GSYM HAS_INTEGRAL_INTEGRAL]
8007QED
8008
8009Theorem HAS_INTEGRAL_COMBINE_DIVISION_TOPDOWN:
8010   !f:real->real s d k.
8011        f integrable_on s /\ d division_of k /\ k SUBSET s
8012        ==> (f has_integral (sum d (\i. integral i f))) k
8013Proof
8014  REPEAT STRIP_TAC THEN
8015  MATCH_MP_TAC HAS_INTEGRAL_COMBINE_DIVISION THEN
8016  ASM_SIMP_TAC std_ss [GSYM HAS_INTEGRAL_INTEGRAL] THEN
8017  FIRST_ASSUM(fn th => REWRITE_TAC[MATCH_MP FORALL_IN_DIVISION th]) THEN
8018  REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRABLE_ON_SUBINTERVAL THEN
8019  EXISTS_TAC ``s:real->bool`` THEN ASM_SIMP_TAC std_ss [] THEN
8020  METIS_TAC[division_of, SUBSET_TRANS]
8021QED
8022
8023Theorem INTEGRAL_COMBINE_DIVISION_TOPDOWN:
8024   !f:real->real d s.
8025        f integrable_on s /\ d division_of s
8026        ==> (integral s f = sum d (\i. integral i f))
8027Proof
8028  REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRAL_UNIQUE THEN
8029  MATCH_MP_TAC HAS_INTEGRAL_COMBINE_DIVISION_TOPDOWN THEN
8030  EXISTS_TAC ``s:real->bool`` THEN ASM_SIMP_TAC std_ss [SUBSET_REFL]
8031QED
8032
8033Theorem INTEGRABLE_COMBINE_DIVISION:
8034   !f d s.
8035        d division_of s /\ (!i. i IN d ==> f integrable_on i)
8036        ==> f integrable_on s
8037Proof
8038  REWRITE_TAC[integrable_on] THEN MESON_TAC[HAS_INTEGRAL_COMBINE_DIVISION]
8039QED
8040
8041Theorem INTEGRABLE_ON_SUBDIVISION:
8042   !f:real->real s d i.
8043        d division_of i /\
8044        f integrable_on s /\ i SUBSET s
8045        ==> f integrable_on i
8046Proof
8047  REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRABLE_COMBINE_DIVISION THEN
8048  EXISTS_TAC ``d:(real->bool)->bool`` THEN ASM_REWRITE_TAC[] THEN
8049  FIRST_ASSUM(fn th => REWRITE_TAC[MATCH_MP FORALL_IN_DIVISION th]) THEN
8050  REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRABLE_ON_SUBINTERVAL THEN
8051  ASM_MESON_TAC[division_of, BIGUNION_SUBSET]
8052QED
8053
8054(* ------------------------------------------------------------------------- *)
8055(* Also tagged divisions.                                                    *)
8056(* ------------------------------------------------------------------------- *)
8057
8058Theorem HAS_INTEGRAL_COMBINE_TAGGED_DIVISION:
8059   !f:real->real s p i.
8060        p tagged_division_of s /\
8061        (!x k. (x,k) IN p ==> (f has_integral (i k)) k)
8062        ==> (f has_integral (sum p (\(x,k). i k))) s
8063Proof
8064  REPEAT STRIP_TAC THEN
8065  SUBGOAL_THEN
8066   ``!x:real k:real->bool.
8067      (x,k) IN p ==> ((f:real->real) has_integral integral k f) k``
8068  ASSUME_TAC THENL
8069   [ASM_MESON_TAC[HAS_INTEGRAL_INTEGRAL, integrable_on], ALL_TAC] THEN
8070  SUBGOAL_THEN
8071   ``((f:real->real) has_integral
8072     (sum (IMAGE SND (p:real#(real->bool)->bool))
8073           (\k. integral k f))) s``
8074  MP_TAC THENL
8075   [MATCH_MP_TAC HAS_INTEGRAL_COMBINE_DIVISION THEN
8076    ASM_SIMP_TAC std_ss [FORALL_IN_IMAGE, FORALL_PROD] THEN
8077    ASM_SIMP_TAC std_ss [DIVISION_OF_TAGGED_DIVISION] THEN METIS_TAC [],
8078    ALL_TAC] THEN
8079  MATCH_MP_TAC EQ_IMPLIES THEN AP_THM_TAC THEN
8080  AP_TERM_TAC THEN CONV_TAC SYM_CONV THEN
8081  MATCH_MP_TAC EQ_TRANS THEN
8082  EXISTS_TAC ``sum p (\(x:real,k:real->bool). integral k f:real)`` THEN
8083  CONJ_TAC THENL
8084   [MATCH_MP_TAC SUM_EQ THEN SIMP_TAC std_ss [FORALL_PROD] THEN
8085    ASM_MESON_TAC[HAS_INTEGRAL_UNIQUE],
8086    GEN_REWR_TAC (LAND_CONV o ONCE_DEPTH_CONV)
8087     [METIS [] ``integral (k :real -> bool) f = (\k. integral k f) k``] THEN
8088    MATCH_MP_TAC SUM_OVER_TAGGED_DIVISION_LEMMA THEN
8089    EXISTS_TAC ``s:real->bool`` THEN ASM_SIMP_TAC std_ss [INTEGRAL_NULL]]
8090QED
8091
8092Theorem INTEGRAL_COMBINE_TAGGED_DIVISION_BOTTOMUP:
8093   !f:real->real p a b.
8094        p tagged_division_of interval[a,b] /\
8095        (!x k. (x,k) IN p ==> f integrable_on k)
8096        ==> (integral (interval[a,b]) f = sum p (\(x,k). integral k f))
8097Proof
8098  REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRAL_UNIQUE THEN
8099  ONCE_REWRITE_TAC
8100     [METIS [] ``integral (k :real -> bool) f = (\k. integral k f) k``] THEN
8101  MATCH_MP_TAC HAS_INTEGRAL_COMBINE_TAGGED_DIVISION THEN
8102  ASM_SIMP_TAC std_ss [GSYM HAS_INTEGRAL_INTEGRAL] THEN METIS_TAC []
8103QED
8104
8105Theorem HAS_INTEGRAL_COMBINE_TAGGED_DIVISION_TOPDOWN:
8106   !f:real->real a b p.
8107        f integrable_on interval[a,b] /\ p tagged_division_of interval[a,b]
8108        ==> (f has_integral (sum p (\(x,k). integral k f))) (interval[a,b])
8109Proof
8110  REPEAT STRIP_TAC THEN
8111  ONCE_REWRITE_TAC
8112     [METIS [] ``integral (k :real -> bool) f = (\k. integral k f) k``] THEN
8113  MATCH_MP_TAC HAS_INTEGRAL_COMBINE_TAGGED_DIVISION THEN
8114  ASM_SIMP_TAC std_ss [GSYM HAS_INTEGRAL_INTEGRAL] THEN
8115  ASM_MESON_TAC[INTEGRABLE_SUBINTERVAL, TAGGED_DIVISION_OF]
8116QED
8117
8118Theorem INTEGRAL_COMBINE_TAGGED_DIVISION_TOPDOWN:
8119   !f:real->real a b p.
8120        f integrable_on interval[a,b] /\ p tagged_division_of interval[a,b]
8121        ==> (integral (interval[a,b]) f = sum p (\(x,k). integral k f))
8122Proof
8123  REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRAL_UNIQUE THEN
8124  MATCH_MP_TAC HAS_INTEGRAL_COMBINE_TAGGED_DIVISION_TOPDOWN THEN
8125  ASM_SIMP_TAC std_ss []
8126QED
8127
8128(* ------------------------------------------------------------------------- *)
8129(* Henstock's lemma.                          7180                           *)
8130(* ------------------------------------------------------------------------- *)
8131
8132Theorem lemma[local]:
8133    (!k. &0 < k ==> x <= e + k) ==> x <= e:real
8134Proof
8135   DISCH_THEN(MP_TAC o SPEC ``(x - e) / &2:real``) THEN
8136   ONCE_REWRITE_TAC [REAL_ADD_SYM] THEN REWRITE_TAC [GSYM REAL_LE_SUB_RADD] THEN
8137   SIMP_TAC std_ss [REAL_LE_RDIV_EQ, REAL_LT_RDIV_EQ, REAL_ARITH ``0 < 2:real``] THEN
8138   REAL_ARITH_TAC
8139QED
8140
8141Theorem HENSTOCK_LEMMA_PART1:
8142   !f:real->real a b d e.
8143        f integrable_on interval[a,b] /\
8144        &0 < e /\ gauge d /\
8145        (!p. p tagged_division_of interval[a,b] /\ d FINE p
8146             ==> abs (sum p (\(x,k). content k * f x) -
8147                       integral(interval[a,b]) f) < e)
8148        ==> !p. p tagged_partial_division_of interval[a,b] /\ d FINE p
8149                            ==> abs(sum p (\(x,k). content k * f x -
8150                                                     integral k f)) <= e
8151Proof
8152  REPEAT GEN_TAC THEN STRIP_TAC THEN GEN_TAC THEN STRIP_TAC THEN
8153  MATCH_MP_TAC lemma THEN X_GEN_TAC ``k:real`` THEN DISCH_TAC THEN
8154  MP_TAC(ISPECL
8155    [``IMAGE SND (p:(real#(real->bool))->bool)``, ``a:real``, ``b:real``]
8156    PARTIAL_DIVISION_EXTEND_INTERVAL) THEN
8157  KNOW_TAC ``IMAGE (SND :real # (real -> bool) -> real -> bool)
8158       (p :real # (real -> bool) -> bool) division_of
8159     BIGUNION (IMAGE (SND :real # (real -> bool) -> real -> bool) p) /\
8160     BIGUNION (IMAGE (SND :real # (real -> bool) -> real -> bool) p) SUBSET
8161     interval [((a :real),(b :real))]`` THENL
8162   [CONJ_TAC THENL
8163     [ASM_MESON_TAC[PARTIAL_DIVISION_OF_TAGGED_DIVISION], ALL_TAC] THEN
8164    SIMP_TAC std_ss [SUBSET_DEF, FORALL_IN_BIGUNION] THEN
8165    SIMP_TAC std_ss [IMP_CONJ, RIGHT_FORALL_IMP_THM, FORALL_IN_IMAGE] THEN
8166    SIMP_TAC std_ss [FORALL_PROD] THEN
8167    ASM_MESON_TAC[tagged_partial_division_of, SUBSET_DEF],
8168    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
8169  SUBGOAL_THEN ``FINITE(p:(real#(real->bool))->bool)`` ASSUME_TAC THENL
8170   [ASM_MESON_TAC[tagged_partial_division_of], ALL_TAC] THEN
8171  DISCH_THEN(X_CHOOSE_THEN ``q:(real->bool)->bool`` STRIP_ASSUME_TAC) THEN
8172  FIRST_X_ASSUM(MP_TAC o MATCH_MP(SET_RULE
8173   ``s SUBSET t ==> (t = s UNION (t DIFF s))``)) THEN
8174  ABBREV_TAC ``r = q DIFF IMAGE SND (p:(real#(real->bool))->bool)`` THEN
8175  SUBGOAL_THEN ``IMAGE SND (p:(real#(real->bool))->bool) INTER r = {}``
8176  ASSUME_TAC THENL [EXPAND_TAC "r" THEN SET_TAC[], ALL_TAC] THEN
8177  DISCH_THEN SUBST_ALL_TAC THEN
8178  SUBGOAL_THEN ``FINITE(r:(real->bool)->bool)`` ASSUME_TAC THENL
8179   [ASM_MESON_TAC[division_of, FINITE_UNION], ALL_TAC] THEN
8180  SUBGOAL_THEN
8181   ``!i. i IN r
8182        ==> ?p. p tagged_division_of i /\ d FINE p /\
8183                abs(sum p (\(x,j). content j * f x) -
8184                     integral i (f:real->real))
8185                < k / (&(CARD(r:(real->bool)->bool)) + &1)``
8186  MP_TAC THENL
8187   [X_GEN_TAC ``i:real->bool`` THEN DISCH_TAC THEN
8188    SUBGOAL_THEN ``(i:real->bool) SUBSET interval[a,b]`` ASSUME_TAC THENL
8189     [ASM_MESON_TAC[division_of, IN_UNION], ALL_TAC] THEN
8190    SUBGOAL_THEN ``?u v:real. i = interval[u,v]``
8191     (REPEAT_TCL CHOOSE_THEN SUBST_ALL_TAC)
8192    THENL [ASM_MESON_TAC[division_of, IN_UNION], ALL_TAC] THEN
8193    SUBGOAL_THEN ``(f:real->real) integrable_on interval[u,v]`` MP_TAC THENL
8194     [ASM_MESON_TAC[INTEGRABLE_SUBINTERVAL], ALL_TAC] THEN
8195    DISCH_THEN(MP_TAC o MATCH_MP INTEGRABLE_INTEGRAL) THEN
8196    REWRITE_TAC[has_integral] THEN
8197    DISCH_THEN(MP_TAC o SPEC ``k / (&(CARD(r:(real->bool)->bool)) + &1:real)``) THEN
8198    ASM_SIMP_TAC std_ss [REAL_LT_DIV,
8199     METIS [REAL_LT, REAL_OF_NUM_ADD, GSYM ADD1, LESS_0] ``&0 < &n + &1:real``] THEN
8200    DISCH_THEN(X_CHOOSE_THEN ``dd:real->real->bool`` MP_TAC) THEN
8201    DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
8202    MP_TAC(ISPECL [``d:real->real->bool``, ``dd:real->real->bool``]
8203      GAUGE_INTER) THEN
8204    ASM_REWRITE_TAC[] THEN
8205    DISCH_THEN(MP_TAC o MATCH_MP FINE_DIVISION_EXISTS) THEN
8206    DISCH_THEN(MP_TAC o SPECL [``u:real``, ``v:real``]) THEN
8207    REWRITE_TAC[FINE_INTER] THEN MESON_TAC[],
8208    ALL_TAC] THEN
8209  SIMP_TAC std_ss [RIGHT_IMP_EXISTS_THM, SKOLEM_THM] THEN
8210  REWRITE_TAC[TAUT `(a ==> b /\ c) <=> (a ==> b) /\ (a ==> c)`] THEN
8211  SIMP_TAC std_ss [FORALL_AND_THM] THEN
8212  DISCH_THEN(X_CHOOSE_THEN ``q:(real->bool)->(real#(real->bool))->bool``
8213    STRIP_ASSUME_TAC) THEN
8214  FIRST_X_ASSUM(MP_TAC o SPEC
8215    ``p UNION BIGUNION {q (i:real->bool) | i IN r}
8216     :(real#(real->bool))->bool``) THEN
8217  KNOW_TAC ``(p :real # (real -> bool) -> bool) UNION
8218     BIGUNION
8219       {(q :(real -> bool) -> real # (real -> bool) -> bool) i |
8220        i IN (r :(real -> bool) -> bool)} tagged_division_of
8221     interval [((a :real),(b :real))] /\
8222     (d :real -> real -> bool) FINE p UNION BIGUNION {q i | i IN r}`` THENL
8223   [CONJ_TAC THENL
8224     [ALL_TAC,
8225      MATCH_MP_TAC FINE_UNION THEN ASM_REWRITE_TAC[] THEN
8226      MATCH_MP_TAC FINE_BIGUNION THEN ONCE_REWRITE_TAC[GSYM IMAGE_DEF] THEN
8227      ASM_SIMP_TAC std_ss [FORALL_IN_IMAGE]] THEN
8228    UNDISCH_TAC ``IMAGE (SND :real # (real -> bool) -> real -> bool)
8229            (p :real # (real -> bool) -> bool) UNION
8230          (r :(real -> bool) -> bool) division_of
8231          interval [((a :real),(b :real))]`` THEN DISCH_TAC THEN
8232    FIRST_ASSUM(SUBST1_TAC o SYM o last o CONJUNCTS o
8233                REWRITE_RULE [division_of]) THEN
8234    REWRITE_TAC[BIGUNION_UNION] THEN
8235    MATCH_MP_TAC TAGGED_DIVISION_UNION THEN CONJ_TAC THENL
8236     [ASM_MESON_TAC[TAGGED_PARTIAL_DIVISION_OF_UNION_SELF], ALL_TAC] THEN
8237    CONJ_TAC THENL
8238     [ONCE_REWRITE_TAC[GSYM IMAGE_DEF] THEN
8239      MATCH_MP_TAC TAGGED_DIVISION_BIGUNION THEN
8240      FIRST_ASSUM(MP_TAC o REWRITE_RULE [division_of]) THEN
8241      SIMP_TAC std_ss [FINITE_UNION, IN_UNION] THEN ASM_MESON_TAC[],
8242      ALL_TAC] THEN
8243    MATCH_MP_TAC INTER_INTERIOR_BIGUNION_INTERVALS THEN
8244    REWRITE_TAC[OPEN_INTERIOR] THEN
8245    REPEAT(CONJ_TAC THENL
8246            [ASM_MESON_TAC[division_of, FINITE_UNION, IN_UNION], ALL_TAC]) THEN
8247    X_GEN_TAC ``k:real->bool`` THEN DISCH_TAC THEN
8248    ONCE_REWRITE_TAC[INTER_COMM] THEN
8249    MATCH_MP_TAC INTER_INTERIOR_BIGUNION_INTERVALS THEN
8250    SIMP_TAC std_ss [FORALL_IN_IMAGE, FORALL_PROD, OPEN_INTERIOR] THEN
8251    REPEAT(CONJ_TAC THENL
8252     [ASM_MESON_TAC[tagged_partial_division_of, IMAGE_FINITE], ALL_TAC]) THEN
8253    REPEAT STRIP_TAC THEN
8254    UNDISCH_TAC ``IMAGE (SND :real # (real -> bool) -> real -> bool)
8255            (p :real # (real -> bool) -> bool) UNION
8256          (r :(real -> bool) -> bool) division_of
8257          interval [((a :real),(b :real))]`` THEN DISCH_TAC THEN
8258    FIRST_ASSUM(MP_TAC o REWRITE_RULE [division_of]) THEN
8259    DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
8260    DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
8261    DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
8262    DISCH_THEN (MATCH_MP_TAC) THEN
8263    UNDISCH_TAC `` IMAGE (SND :real # (real -> bool) -> real -> bool)
8264            (p :real # (real -> bool) -> bool) INTER
8265          (r :(real -> bool) -> bool) =
8266          ({} :(real -> bool) -> bool)`` THEN DISCH_TAC THEN
8267    FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [EXTENSION]) THEN
8268    REWRITE_TAC [NOT_IN_EMPTY, GSYM NOT_EXISTS_THM] THEN
8269    REWRITE_TAC [METIS [NOT_EXISTS_THM] ``(!x. x NOTIN s) = ~(?x. x IN s)``] THEN
8270    ASM_SIMP_TAC std_ss [EXISTS_PROD, IN_IMAGE, IN_INTER, IN_UNION] THEN
8271    ASM_MESON_TAC[],
8272    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
8273  SUBGOAL_THEN
8274   ``sum (p UNION BIGUNION {q i | i IN r}) (\(x,k). content k * f x) =
8275     sum p (\(x:real,k:real->bool). content k * f x:real) +
8276     sum (BIGUNION {q i | (i:real->bool) IN r}) (\(x,k). content k * f x)``
8277  SUBST1_TAC THENL
8278   [MATCH_MP_TAC SUM_UNION_NONZERO THEN ASM_SIMP_TAC std_ss [] THEN
8279    ONCE_REWRITE_TAC[GSYM IMAGE_DEF] THEN
8280    ASM_SIMP_TAC std_ss [FINITE_BIGUNION_EQ, IMAGE_FINITE, FORALL_IN_IMAGE] THEN
8281    CONJ_TAC THENL [METIS_TAC [TAGGED_DIVISION_OF_FINITE], ALL_TAC] THEN
8282    REWRITE_TAC[IN_INTER] THEN ONCE_REWRITE_TAC[CONJ_SYM] THEN
8283    SIMP_TAC std_ss [IMP_CONJ, FORALL_IN_BIGUNION, FORALL_IN_IMAGE] THEN
8284    SIMP_TAC std_ss [FORALL_PROD, FORALL_IN_IMAGE, RIGHT_FORALL_IMP_THM] THEN
8285    X_GEN_TAC ``k:real->bool`` THEN DISCH_TAC THEN
8286    MAP_EVERY X_GEN_TAC [``x:real``, ``l:real->bool``] THEN
8287    DISCH_TAC THEN
8288    SUBGOAL_THEN ``(l:real->bool) SUBSET k`` ASSUME_TAC THENL
8289     [ASM_MESON_TAC[TAGGED_DIVISION_OF], ALL_TAC] THEN DISCH_TAC THEN
8290    UNDISCH_TAC ``IMAGE (SND :real # (real -> bool) -> real -> bool)
8291            (p :real # (real -> bool) -> bool) UNION
8292          (r :(real -> bool) -> bool) division_of
8293          interval [((a :real),(b :real))]`` THEN DISCH_TAC THEN
8294    FIRST_ASSUM(MP_TAC o REWRITE_RULE [division_of]) THEN
8295    DISCH_THEN (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
8296    DISCH_THEN (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
8297    DISCH_THEN (CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
8298    DISCH_THEN(MP_TAC o SPECL [``k:real->bool``, ``l:real->bool``]) THEN
8299    KNOW_TAC ``(k :real -> bool) IN
8300     IMAGE (SND :real # (real -> bool) -> real -> bool)
8301       (p :real # (real -> bool) -> bool) UNION
8302     (r :(real -> bool) -> bool) /\
8303     (l :real -> bool) IN
8304     IMAGE (SND :real # (real -> bool) -> real -> bool) p UNION r /\
8305     k <> l`` THENL
8306     [ASM_SIMP_TAC std_ss [IN_UNION, IN_IMAGE, EXISTS_PROD] THEN
8307      CONJ_TAC THENL [ASM_MESON_TAC[], ALL_TAC] THEN
8308      DISCH_THEN(SUBST_ALL_TAC o SYM) THEN
8309      UNDISCH_TAC `` IMAGE (SND :real # (real -> bool) -> real -> bool)
8310            (p :real # (real -> bool) -> bool) INTER
8311          (r :(real -> bool) -> bool) =
8312          ({} :(real -> bool) -> bool)`` THEN DISCH_TAC THEN
8313      FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [EXTENSION]) THEN
8314      REWRITE_TAC[NOT_IN_EMPTY, GSYM NOT_EXISTS_THM] THEN
8315      REWRITE_TAC [METIS [NOT_EXISTS_THM] ``(~!x. x NOTIN s) = (?x. x IN s)``] THEN
8316      ASM_SIMP_TAC std_ss [EXISTS_PROD, IN_IMAGE, IN_INTER, IN_UNION] THEN
8317      ASM_MESON_TAC[],
8318      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
8319    ASM_SIMP_TAC std_ss [SUBSET_INTERIOR,
8320     SET_RULE ``s SUBSET t ==> (t INTER s = s)``] THEN
8321    SUBGOAL_THEN ``?u v:real. l = interval[u,v]``
8322     (fn th => REPEAT_TCL CHOOSE_THEN SUBST1_TAC th THEN
8323                SIMP_TAC std_ss [REAL_MUL_LZERO, GSYM CONTENT_EQ_0_INTERIOR]) THEN
8324    ASM_MESON_TAC[tagged_partial_division_of],
8325    ALL_TAC] THEN
8326  W(MP_TAC o PART_MATCH (lhand o rand) SUM_BIGUNION_NONZERO o
8327    rand o lhand o rand o lhand o lhand o snd) THEN
8328  KNOW_TAC ``FINITE
8329       {(q :(real -> bool) -> real # (real -> bool) -> bool) i |
8330        i IN (r :(real -> bool) -> bool)} /\
8331     (!(t :real # (real -> bool) -> bool).
8332        t IN {q i | i IN r} ==> FINITE t) /\
8333     (!(t1 :real # (real -> bool) -> bool)
8334         (t2 :real # (real -> bool) -> bool) (x :real # (real -> bool)).
8335        t1 IN {q i | i IN r} /\ t2 IN {q i | i IN r} /\ t1 <> t2 /\
8336        x IN t1 /\ x IN t2 ==>
8337        ((\((x :real),(k :real -> bool)). content k * (f :real -> real) x)
8338           x = (0 : real)))`` THENL
8339   [ONCE_REWRITE_TAC[GSYM IMAGE_DEF] THEN ASM_SIMP_TAC std_ss [IMAGE_FINITE] THEN
8340    SIMP_TAC std_ss [IMP_CONJ, FORALL_IN_IMAGE, RIGHT_FORALL_IMP_THM] THEN
8341    CONJ_TAC THENL [ASM_MESON_TAC[TAGGED_DIVISION_OF, IN_UNION], ALL_TAC] THEN
8342    X_GEN_TAC ``k:real->bool`` THEN DISCH_TAC THEN
8343    X_GEN_TAC ``l:real->bool`` THEN DISCH_TAC THEN
8344    DISCH_TAC THEN SIMP_TAC std_ss [FORALL_PROD] THEN
8345    MAP_EVERY X_GEN_TAC [``x:real``, ``m:real->bool``] THEN
8346    DISCH_TAC THEN DISCH_TAC THEN
8347    REWRITE_TAC[REAL_ENTIRE] THEN DISJ1_TAC THEN
8348    SUBGOAL_THEN ``?u v:real. m = interval[u,v]``
8349     (REPEAT_TCL CHOOSE_THEN SUBST_ALL_TAC)
8350    THENL [ASM_MESON_TAC[TAGGED_DIVISION_OF, IN_UNION], ALL_TAC] THEN
8351    REWRITE_TAC[CONTENT_EQ_0_INTERIOR] THEN
8352    MATCH_MP_TAC(SET_RULE ``!t. s SUBSET t /\ (t = {}) ==> (s = {})``) THEN
8353    EXISTS_TAC ``interior(k INTER l:real->bool)`` THEN CONJ_TAC THENL
8354     [MATCH_MP_TAC SUBSET_INTERIOR THEN REWRITE_TAC[SUBSET_INTER] THEN
8355      ASM_MESON_TAC[TAGGED_DIVISION_OF],
8356      ALL_TAC] THEN
8357    UNDISCH_TAC `` IMAGE (SND :real # (real -> bool) -> real -> bool)
8358            (p :real # (real -> bool) -> bool) UNION
8359          (r :(real -> bool) -> bool) division_of
8360          interval [((a :real),(b :real))]`` THEN DISCH_TAC THEN
8361    FIRST_ASSUM(MP_TAC o REWRITE_RULE [division_of]) THEN
8362    REWRITE_TAC[INTERIOR_INTER] THEN
8363    DISCH_THEN (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
8364    DISCH_THEN (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
8365    DISCH_THEN (CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
8366    DISCH_THEN(MATCH_MP_TAC o SPECL [``k:real->bool``, ``l:real->bool``]) THEN
8367    SIMP_TAC std_ss [IN_IMAGE, EXISTS_PROD, IN_UNION] THEN ASM_MESON_TAC[],
8368    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
8369  DISCH_THEN SUBST1_TAC THEN ONCE_REWRITE_TAC[GSYM IMAGE_DEF] THEN
8370  W(MP_TAC o PART_MATCH (lhand o rand) SUM_IMAGE_NONZERO o
8371    rand o lhand o rand o lhand o lhand o snd) THEN
8372  ASM_SIMP_TAC std_ss [o_DEF] THEN
8373  KNOW_TAC ``(!(x :real -> bool) (y :real -> bool).
8374        x IN (r :(real -> bool) -> bool) /\ y IN r /\ x <> y /\
8375        ((q :(real -> bool) -> real # (real -> bool) -> bool) x = q y) ==>
8376        (sum (q y)
8377           (\((x :real),(k :real -> bool)).
8378              content k * (f :real -> real) x) = (0 : real)))`` THENL
8379   [MAP_EVERY X_GEN_TAC [``k:real->bool``, ``l:real->bool``] THEN
8380    STRIP_TAC THEN MATCH_MP_TAC SUM_EQ_0 THEN
8381    SIMP_TAC std_ss [FORALL_PROD] THEN
8382    MAP_EVERY X_GEN_TAC [``x:real``, ``m:real->bool``] THEN DISCH_TAC THEN
8383    MP_TAC(ASSUME ``!i:real->bool. i IN r ==> q i tagged_division_of i``) THEN
8384    DISCH_TAC THEN FIRST_ASSUM (MP_TAC o SPEC ``l:real->bool``) THEN
8385    FIRST_ASSUM (MP_TAC o SPEC ``k:real->bool``) THEN POP_ASSUM K_TAC THEN
8386    REWRITE_TAC[tagged_division_of] THEN ASM_REWRITE_TAC [] THEN METIS_TAC[],
8387    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
8388  DISCH_THEN SUBST1_TAC THEN
8389  SUBGOAL_THEN
8390   ``sum p (\(x,k). content k * (f:real->real) x - integral k f) =
8391     sum p (\(x,k). content k * f x) - sum p (\(x,k). integral k f)``
8392  SUBST1_TAC THENL [ASM_SIMP_TAC std_ss [GSYM SUM_SUB, LAMBDA_PROD], ALL_TAC] THEN
8393  MATCH_MP_TAC(REAL_ARITH
8394   ``!ir:real. (ip + ir = i) /\
8395         abs(cr - ir) < k
8396         ==> abs((cp + cr) - i) < e ==> abs(cp - ip) <= e + k``) THEN
8397  EXISTS_TAC ``sum r (\k. integral k (f:real->real))`` THEN CONJ_TAC THENL
8398   [MATCH_MP_TAC EQ_TRANS THEN
8399    EXISTS_TAC ``sum (IMAGE SND (p:(real#(real->bool))->bool) UNION r)
8400                     (\k. integral k (f:real->real))`` THEN
8401    CONJ_TAC THENL
8402     [ALL_TAC, METIS_TAC[INTEGRAL_COMBINE_DIVISION_TOPDOWN]] THEN
8403    MATCH_MP_TAC EQ_TRANS THEN
8404    EXISTS_TAC ``sum (IMAGE SND (p:(real#(real->bool))->bool))
8405                     (\k. integral k (f:real->real)) +
8406                 sum r (\k. integral k f)`` THEN
8407    CONJ_TAC THENL
8408     [ALL_TAC,
8409      CONV_TAC SYM_CONV THEN MATCH_MP_TAC SUM_UNION_NONZERO THEN
8410      ASM_SIMP_TAC std_ss [IMAGE_FINITE, NOT_IN_EMPTY]] THEN
8411    AP_THM_TAC THEN AP_TERM_TAC THEN
8412    SUBGOAL_THEN ``(\(x:real,k). integral k (f:real->real)) =
8413                   (\k. integral k f) o SND``
8414    SUBST1_TAC THENL
8415     [SIMP_TAC std_ss [o_THM, FUN_EQ_THM, FORALL_PROD], ALL_TAC] THEN
8416    CONV_TAC SYM_CONV THEN REWRITE_TAC [REAL_EQ_RADD] THEN
8417    MATCH_MP_TAC SUM_IMAGE_NONZERO THEN
8418    ASM_SIMP_TAC std_ss [FORALL_PROD] THEN
8419    MAP_EVERY X_GEN_TAC
8420     [``x:real``, ``l:real->bool``, ``y:real``] THEN
8421    REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
8422    DISCH_TAC THEN
8423    UNDISCH_TAC ``p tagged_partial_division_of interval [(a,b)]`` THEN DISCH_TAC THEN
8424    FIRST_X_ASSUM(MP_TAC o
8425      REWRITE_RULE [tagged_partial_division_of]) THEN
8426    DISCH_THEN(CONJUNCTS_THEN MP_TAC o CONJUNCT2) THEN
8427    DISCH_THEN(MP_TAC o SPECL
8428     [``x:real``, ``l:real->bool``, ``y:real``, ``l:real->bool``]) THEN
8429    ASM_REWRITE_TAC[INTER_IDEMPOT] THEN DISCH_TAC THEN
8430    DISCH_THEN(MP_TAC o SPECL [``x:real``, ``l:real->bool``]) THEN
8431    ASM_REWRITE_TAC[] THEN
8432    DISCH_THEN(REPEAT_TCL CHOOSE_THEN SUBST_ALL_TAC o last o CONJUNCTS) THEN
8433    MATCH_MP_TAC INTEGRAL_UNIQUE THEN MATCH_MP_TAC HAS_INTEGRAL_NULL THEN
8434    ASM_SIMP_TAC std_ss [CONTENT_EQ_0_INTERIOR],
8435    ALL_TAC] THEN
8436  ASM_SIMP_TAC std_ss [GSYM SUM_SUB] THEN MATCH_MP_TAC REAL_LET_TRANS THEN
8437  EXISTS_TAC ``sum (r:(real->bool)->bool) (\x. k / (&(CARD r) + &1))`` THEN
8438  CONJ_TAC THENL
8439   [MATCH_MP_TAC SUM_ABS_LE THEN ASM_SIMP_TAC std_ss [REAL_LT_IMP_LE],
8440    ASM_SIMP_TAC std_ss [SUM_CONST] THEN
8441    REWRITE_TAC[real_div, REAL_MUL_ASSOC] THEN
8442    SIMP_TAC std_ss [GSYM real_div, REAL_LT_LDIV_EQ,
8443     METIS [REAL_LT, REAL_OF_NUM_ADD, GSYM ADD1, LESS_0]
8444    ``&0 < &n + &1:real``] THEN
8445    REWRITE_TAC[REAL_ARITH ``a * k < k * b <=> &0 < k * (b - a:real)``] THEN
8446    MATCH_MP_TAC REAL_LT_MUL THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]
8447QED
8448
8449Theorem ABS_LE_L1[local] :
8450    !x:real. abs x <= sum{ 1n.. 1n} (\i. abs(x))
8451Proof
8452  REWRITE_TAC [NUMSEG_SING, SUM_SING, REAL_LE_REFL]
8453QED
8454
8455Theorem SUM_ABS_ALLSUBSETS_BOUND:
8456   !f:'a->real p e.
8457        FINITE p /\
8458        (!q. q SUBSET p ==> abs(sum q f) <= e)
8459        ==> sum p (\x. abs(f x)) <= &2 * & 1n:real * e
8460Proof
8461  REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN
8462  EXISTS_TAC
8463   ``sum p (\x:'a. sum { 1n.. 1n} ((\x i. abs((f x:real))) x))`` THEN
8464  CONJ_TAC THENL
8465   [MATCH_MP_TAC SUM_LE THEN ASM_SIMP_TAC std_ss [ABS_LE_L1], ALL_TAC] THEN
8466  W(MP_TAC o PART_MATCH (lhand o rand) SUM_SWAP o lhand o snd) THEN
8467  ASM_REWRITE_TAC[FINITE_NUMSEG] THEN DISCH_THEN SUBST1_TAC THEN
8468  ONCE_REWRITE_TAC[REAL_ARITH ``&2 * &n * e = &n * &2 * e:real``] THEN
8469  BETA_TAC THEN
8470  GEN_REWR_TAC (RAND_CONV o ONCE_DEPTH_CONV)
8471   [METIS [GSYM CARD_NUMSEG_1] ``1:real = &CARD { 1n.. 1n}``] THEN
8472  REWRITE_TAC [GSYM REAL_MUL_ASSOC] THEN
8473  MATCH_MP_TAC SUM_BOUND' THEN REWRITE_TAC[FINITE_NUMSEG, IN_NUMSEG] THEN
8474  X_GEN_TAC ``k:num`` THEN STRIP_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN
8475  EXISTS_TAC ``sum {x:'a | x IN p /\ &0 <= (f x:real)} (\x. abs((f x))) +
8476               sum {x | x IN p /\ (f x) < &0} (\x. abs((f x)))`` THEN
8477  CONJ_TAC THENL
8478   [MATCH_MP_TAC(REAL_ARITH ``(a = b) ==> b <= a:real``) THEN
8479    MATCH_MP_TAC SUM_UNION_EQ THEN
8480    ASM_SIMP_TAC std_ss [EXTENSION, NOT_IN_EMPTY, IN_INTER,
8481                         IN_UNION, GSPECIFICATION] THEN
8482    CONJ_TAC THEN X_GEN_TAC ``x:'a`` THEN ASM_CASES_TAC ``(x:'a) IN p`` THEN
8483    ASM_SIMP_TAC std_ss [] THEN REAL_ARITH_TAC,
8484    ALL_TAC] THEN
8485  MATCH_MP_TAC(REAL_ARITH ``x <= e /\ y <= e ==> x + y <= &2 * e:real``) THEN
8486  GEN_REWR_TAC (RAND_CONV o ONCE_DEPTH_CONV) [GSYM ABS_NEG] THEN
8487  CONJ_TAC THEN MATCH_MP_TAC(REAL_ARITH
8488   ``!g. (sum s g = sum s f) /\ sum s g <= e ==> sum s f <= e:real``)
8489  THENL
8490   [EXISTS_TAC ``\x. ((f:'a->real) x)``,
8491    EXISTS_TAC ``\x. -(((f:'a->real) x))``] THEN
8492  (CONJ_TAC THENL
8493    [MATCH_MP_TAC SUM_EQ THEN SIMP_TAC std_ss [GSPECIFICATION] THEN REAL_ARITH_TAC,
8494     ALL_TAC]) THEN
8495  ASM_SIMP_TAC std_ss [SUM_NEG', FINITE_RESTRICT] THEN
8496  MATCH_MP_TAC(REAL_ARITH ``abs(x) <= e ==> x <= e:real``) THEN
8497  SIMP_TAC std_ss [ABS_NEG, ETA_AX] THEN
8498  FIRST_X_ASSUM MATCH_MP_TAC THEN SET_TAC[]
8499QED
8500
8501Theorem HENSTOCK_LEMMA_PART2:
8502   !f:real->real a b d e.
8503        f integrable_on interval[a,b] /\
8504        &0 < e /\ gauge d /\
8505        (!p. p tagged_division_of interval[a,b] /\ d FINE p
8506             ==> abs (sum p (\(x,k). content k * f x) -
8507                       integral(interval[a,b]) f) < e)
8508        ==> !p. p tagged_partial_division_of interval[a,b] /\ d FINE p
8509                            ==> sum p (\(x,k). abs(content k * f x -
8510                                                    integral k f))
8511                                <= &2 * & 1n:real * e
8512Proof
8513  REPEAT STRIP_TAC THEN SIMP_TAC std_ss [LAMBDA_PAIR] THEN
8514  ONCE_REWRITE_TAC [METIS []
8515   ``(content (SND p) * f (FST p) - integral (SND p) f) =
8516     (\p. (content (SND p) * f (FST p) - integral (SND p) f)) p``] THEN
8517  MATCH_MP_TAC SUM_ABS_ALLSUBSETS_BOUND THEN
8518  SIMP_TAC std_ss [LAMBDA_PROD] THEN
8519  CONJ_TAC THENL [ASM_MESON_TAC[tagged_partial_division_of], ALL_TAC] THEN
8520  X_GEN_TAC ``q:(real#(real->bool))->bool`` THEN DISCH_TAC THEN
8521  MATCH_MP_TAC(SIMP_RULE std_ss [RIGHT_IMP_FORALL_THM, AND_IMP_INTRO]
8522    HENSTOCK_LEMMA_PART1) THEN
8523  MAP_EVERY EXISTS_TAC
8524   [``a:real``, ``b:real``, ``d:real->real->bool``] THEN
8525  ASM_SIMP_TAC std_ss [] THEN
8526  ASM_MESON_TAC[FINE_SUBSET, TAGGED_PARTIAL_DIVISION_SUBSET]
8527QED
8528
8529Theorem HENSTOCK_LEMMA:
8530   !f:real->real a b.
8531        f integrable_on interval[a,b]
8532        ==> !e. &0 < e
8533                ==> ?d. gauge d /\
8534                        !p. p tagged_partial_division_of interval[a,b] /\
8535                            d FINE p
8536                            ==> sum p (\(x,k). abs(content k * f x -
8537                                                    integral k f)) < e
8538Proof
8539  MP_TAC HENSTOCK_LEMMA_PART2 THEN
8540  DISCH_TAC THEN REPEAT GEN_TAC THEN
8541  POP_ASSUM (MP_TAC o Q.SPECL [`(f :real -> real)`, `(a :real)`, `(b :real)`]) THEN
8542  DISCH_THEN(fn th => STRIP_TAC THEN X_GEN_TAC ``e:real`` THEN
8543                       STRIP_TAC THEN MP_TAC th) THEN
8544  FIRST_ASSUM(MP_TAC o MATCH_MP INTEGRABLE_INTEGRAL) THEN
8545  GEN_REWR_TAC LAND_CONV [has_integral] THEN
8546  DISCH_THEN(MP_TAC o SPEC ``e / (&2 * (& 1n + &1:real))``) THEN
8547  ASM_SIMP_TAC std_ss [REAL_LT_DIV, REAL_ARITH ``&0 < &2 * (&1 + &1:real)``] THEN
8548  DISCH_THEN(X_CHOOSE_THEN ``d:real->real->bool`` STRIP_ASSUME_TAC) THEN
8549  DISCH_THEN(MP_TAC o SPECL
8550   [``d:real->real->bool``, ``e / (&2 * (& 1n + &1:real))``]) THEN
8551  ASM_SIMP_TAC std_ss [REAL_LT_DIV, REAL_ARITH ``&0 < &2 * (&1 + &1:real)``] THEN
8552  DISCH_THEN(fn th => EXISTS_TAC ``d:real->real->bool`` THEN MP_TAC th) THEN
8553  ASM_SIMP_TAC std_ss [] THEN DISCH_TAC THEN GEN_TAC THEN
8554  POP_ASSUM (MP_TAC o Q.SPEC `(p :real # (real -> bool) -> bool)`) THEN
8555  MATCH_MP_TAC MONO_IMP THEN SIMP_TAC std_ss [] THEN
8556  MATCH_MP_TAC(REAL_ARITH ``d < e ==> x <= d ==> x < e:real``) THEN
8557  SIMP_TAC std_ss [real_div, REAL_INV_MUL, REAL_INV_INV, REAL_MUL_ASSOC] THEN
8558  SIMP_TAC std_ss [GSYM real_div, REAL_LT_LDIV_EQ,
8559   METIS [REAL_LT, REAL_OF_NUM_ADD, GSYM ADD1, LESS_0]  ``&0 < &n + &1:real``] THEN
8560  SIMP_TAC std_ss [REAL_LT_LDIV_EQ, REAL_ARITH ``0:real < (2 * (1 + 1))``] THEN
8561  UNDISCH_TAC ``&0 < e:real`` THEN REAL_ARITH_TAC
8562QED
8563
8564(* ------------------------------------------------------------------------- *)
8565(* Monotone convergence (bounded interval first).                            *)
8566(* ------------------------------------------------------------------------- *)
8567
8568Theorem lemma[local]:
8569    {(x,y) | P x y} = {p | P (FST p) (SND p)}
8570Proof
8571  SIMP_TAC std_ss [EXTENSION, FORALL_PROD, IN_ELIM_PAIR_THM, GSPECIFICATION]
8572QED
8573
8574Theorem MONOTONE_CONVERGENCE_INTERVAL:
8575   !f:num->real->real g a b.
8576        (!k. (f k) integrable_on interval[a,b]) /\
8577        (!k x. x IN interval[a,b] ==> (f k x) <= (f (SUC k) x)) /\
8578        (!x. x IN interval[a,b] ==> ((\k. f k x) --> g x) sequentially) /\
8579        bounded {integral (interval[a,b]) (f k) | k IN univ(:num)}
8580        ==> g integrable_on interval[a,b] /\
8581            ((\k. integral (interval[a,b]) (f k))
8582             --> integral (interval[a,b]) g) sequentially
8583Proof
8584  REPEAT GEN_TAC THEN STRIP_TAC THEN
8585  ASM_CASES_TAC ``content(interval[a:real,b]) = &0`` THENL
8586   [ASM_SIMP_TAC std_ss [INTEGRAL_NULL, INTEGRABLE_ON_NULL, LIM_CONST],
8587    RULE_ASSUM_TAC(REWRITE_RULE[GSYM CONTENT_LT_NZ])] THEN
8588  SUBGOAL_THEN
8589   ``!x:real k:num. x IN interval[a,b] ==> (f k x) <= (g x):real``
8590  ASSUME_TAC THENL
8591   [REPEAT STRIP_TAC THEN
8592    MATCH_MP_TAC(ISPEC ``sequentially`` LIM_DROP_LBOUND) THEN
8593    EXISTS_TAC ``\k. (f:num->real->real) k x`` THEN
8594    ASM_SIMP_TAC std_ss [TRIVIAL_LIMIT_SEQUENTIALLY, EVENTUALLY_SEQUENTIALLY] THEN
8595    EXISTS_TAC ``k:num`` THEN SPEC_TAC(``k:num``,``k:num``) THEN
8596    ONCE_REWRITE_TAC [METIS []
8597     ``!k x'. ((f:num->real->real) k x <= f x' x) =
8598          (\k x'. f k x <= f x' x) k x'``] THEN
8599    MATCH_MP_TAC TRANSITIVE_STEPWISE_LE THEN SIMP_TAC std_ss [REAL_LE_TRANS] THEN
8600    ASM_SIMP_TAC std_ss [REAL_LE_REFL] THEN METIS_TAC [REAL_LE_TRANS],
8601    ALL_TAC] THEN
8602  SUBGOAL_THEN
8603   ``?i. ((\k. integral (interval[a,b]) (f k:real->real)) --> i)
8604        sequentially``
8605  CHOOSE_TAC THENL
8606   [MATCH_MP_TAC BOUNDED_INCREASING_CONVERGENT THEN ASM_SIMP_TAC std_ss [] THEN
8607    GEN_TAC THEN MATCH_MP_TAC INTEGRAL_DROP_LE THEN ASM_REWRITE_TAC[],
8608    ALL_TAC] THEN
8609  SUBGOAL_THEN
8610   ``!k. (integral(interval[a,b]) ((f:num->real->real) k)) <= i``
8611  ASSUME_TAC THENL
8612    [GEN_TAC THEN MATCH_MP_TAC(ISPEC ``sequentially`` LIM_DROP_LBOUND) THEN
8613     EXISTS_TAC ``\k. integral(interval[a,b]) ((f:num->real->real) k)`` THEN
8614     ASM_SIMP_TAC std_ss [TRIVIAL_LIMIT_SEQUENTIALLY, EVENTUALLY_SEQUENTIALLY] THEN
8615     EXISTS_TAC ``k:num`` THEN SPEC_TAC(``k:num``,``k:num``) THEN
8616     ONCE_REWRITE_TAC [METIS []
8617      ``(integral (interval [(a,b)]) (f k) <= integral (interval [(a,b)]) (f x)) =
8618       (\k x. integral (interval [(a,b)]) (f k) <=
8619                  integral (interval [(a,b)]) (f x)) k x``] THEN
8620     MATCH_MP_TAC TRANSITIVE_STEPWISE_LE THEN
8621     ASM_SIMP_TAC std_ss [REAL_LE_REFL, REAL_LE_TRANS] THEN
8622     CONJ_TAC THENL [METIS_TAC [REAL_LE_TRANS], ALL_TAC] THEN
8623     GEN_TAC THEN MATCH_MP_TAC INTEGRAL_DROP_LE THEN ASM_REWRITE_TAC[],
8624     ALL_TAC] THEN
8625  SUBGOAL_THEN
8626   ``((g:real->real) has_integral i) (interval[a,b])``
8627  ASSUME_TAC THENL
8628   [REWRITE_TAC[has_integral] THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
8629    UNDISCH_TAC ``!k:num. f k integrable_on interval [(a,b)]`` THEN DISCH_TAC THEN
8630    FIRST_ASSUM(MP_TAC o REWRITE_RULE [HAS_INTEGRAL_INTEGRAL]) THEN
8631    REWRITE_TAC[has_integral] THEN
8632    DISCH_THEN(MP_TAC o GEN ``k:num`` o
8633      SPECL [``k:num``, ``e / (&2:real) pow (k + 2)``]) THEN
8634    ASM_SIMP_TAC arith_ss [REAL_LT_DIV, REAL_POW_LT, REAL_LT] THEN
8635    DISCH_TAC THEN POP_ASSUM (MP_TAC o SIMP_RULE std_ss [SKOLEM_THM]) THEN
8636    SIMP_TAC std_ss [LEFT_IMP_EXISTS_THM, FORALL_AND_THM] THEN
8637    X_GEN_TAC ``b:num->real->real->bool`` THEN STRIP_TAC THEN
8638    SUBGOAL_THEN
8639     ``?r. !k. r:num <= k
8640               ==> &0 <= i - (integral(interval[a:real,b]) (f k)) /\
8641                   i - (integral(interval[a,b]) (f k)) < e / &4``
8642    STRIP_ASSUME_TAC THENL
8643     [UNDISCH_TAC `` ((\k. integral (interval [(a,b)]) (f k)) --> i) sequentially`` THEN
8644      DISCH_TAC THEN
8645      FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [LIM_SEQUENTIALLY]) THEN
8646      DISCH_THEN(MP_TAC o SPEC ``e / &4:real``) THEN
8647      ASM_SIMP_TAC arith_ss [REAL_LT_DIV, REAL_LT] THEN
8648      DISCH_THEN (X_CHOOSE_TAC ``N:num``) THEN EXISTS_TAC ``N:num`` THEN
8649      X_GEN_TAC ``n:num`` THEN POP_ASSUM (MP_TAC o Q.SPEC `n:num`) THEN
8650      MATCH_MP_TAC MONO_IMP THEN REWRITE_TAC[dist] THEN
8651      MATCH_MP_TAC(REAL_ARITH
8652       ``x <= y ==> abs(x - y) < e ==> &0 <= y - x /\ y - x < e:real``) THEN
8653      ASM_REWRITE_TAC[],
8654      ALL_TAC] THEN
8655    SUBGOAL_THEN
8656     ``!x. x IN interval[a:real,b]
8657          ==> ?n. r:num <= n /\
8658                  !k. n <= k ==> &0 <= (g x) - (f k x) /\
8659                                 (g x) - (f k x) <
8660                                   e / (&4 * content(interval[a,b]))``
8661    MP_TAC THENL
8662     [X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN
8663      UNDISCH_TAC ``!x. x IN interval [(a,b)] ==>
8664                        ((\k. f k x) --> g x) sequentially`` THEN
8665      DISCH_TAC THEN
8666      FIRST_X_ASSUM(MP_TAC o REWRITE_RULE[LIM_SEQUENTIALLY]) THEN
8667      DISCH_THEN(MP_TAC o SPEC ``x:real``) THEN ASM_SIMP_TAC std_ss [REAL_SUB_LE] THEN
8668      DISCH_THEN(MP_TAC o SPEC ``e / (&4 * content(interval[a:real,b]))``) THEN
8669      ASM_SIMP_TAC arith_ss [REAL_LT_DIV, REAL_LT_MUL, REAL_LT] THEN
8670      REWRITE_TAC[dist] THEN
8671      ASM_SIMP_TAC std_ss [REAL_ARITH ``f <= g ==> (abs(f - g) = g - f:real)``] THEN
8672      DISCH_THEN(X_CHOOSE_TAC ``N:num``) THEN
8673      EXISTS_TAC ``N + r:num`` THEN CONJ_TAC THENL [ARITH_TAC, ALL_TAC] THEN
8674      ASM_MESON_TAC[ARITH_PROVE ``N + r:num <= k ==> N <= k``],
8675      ALL_TAC] THEN
8676    DISCH_TAC THEN POP_ASSUM (MP_TAC o SIMP_RULE std_ss [RIGHT_IMP_EXISTS_THM]) THEN
8677    SIMP_TAC std_ss [SKOLEM_THM] THEN
8678    SIMP_TAC std_ss [FORALL_AND_THM, TAUT
8679     `a ==> b /\ c <=> (a ==> b) /\ (a ==> c)`] THEN
8680    SIMP_TAC std_ss [RIGHT_IMP_FORALL_THM, AND_IMP_INTRO] THEN
8681    DISCH_THEN(X_CHOOSE_THEN ``m:real->num`` STRIP_ASSUME_TAC) THEN
8682    ABBREV_TAC ``d:real->real->bool = \x. b(m x:num) x`` THEN
8683    EXISTS_TAC ``d:real->real->bool`` THEN CONJ_TAC THENL
8684     [EXPAND_TAC "d" THEN REWRITE_TAC[gauge_def] THEN
8685      UNDISCH_TAC ``!k:num. gauge (b k)`` THEN DISCH_TAC THEN
8686      FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [gauge_def]) THEN
8687      SIMP_TAC std_ss [],
8688      ALL_TAC] THEN
8689    X_GEN_TAC ``p:(real#(real->bool))->bool`` THEN STRIP_TAC THEN
8690    GEN_REWR_TAC (RAND_CONV) [GSYM REAL_HALF] THEN
8691    GEN_REWR_TAC (RAND_CONV o RAND_CONV) [GSYM REAL_HALF] THEN
8692    REWRITE_TAC [METIS [real_div, GSYM REAL_INV_MUL, REAL_ARITH ``0 <> 2:real``,
8693     REAL_ARITH ``2 * 2 = 4:real``, GSYM REAL_MUL_ASSOC]
8694           ``e / 2 / 2 = e / 4:real``] THEN
8695    MATCH_MP_TAC(REAL_ARITH
8696     ``!b c. abs(a - b) <= e / &4 /\
8697            abs(b - c) < e / &2 /\
8698            abs(c - d) < e / &4
8699            ==> abs(a - d) < e:real / 2 + (e / 4 + e / 4)``) THEN
8700    EXISTS_TAC ``sum p (\(x:real,k:real->bool).
8701                  content k * (f:num->real->real) (m x) x)`` THEN
8702    EXISTS_TAC ``sum p (\(x:real,k:real->bool).
8703                  integral k ((f:num->real->real) (m x)))`` THEN
8704    FIRST_ASSUM(ASSUME_TAC o MATCH_MP TAGGED_DIVISION_OF_FINITE) THEN
8705    SUBGOAL_THEN ``?s:num. !t:real#(real->bool). t IN p ==> m(FST t) <= s``
8706    MP_TAC THENL [ASM_SIMP_TAC std_ss [UPPER_BOUND_FINITE_SET], ALL_TAC] THEN
8707    SIMP_TAC std_ss [FORALL_PROD] THEN DISCH_THEN(X_CHOOSE_TAC ``s:num``) THEN
8708    REPEAT CONJ_TAC THENL
8709     [ASM_SIMP_TAC std_ss [GSYM SUM_SUB] THEN SIMP_TAC std_ss [LAMBDA_PROD] THEN
8710      SIMP_TAC std_ss [GSYM REAL_SUB_LDISTRIB] THEN
8711      W(MP_TAC o PART_MATCH (lhand o rand) SUM_ABS o lhand o snd) THEN
8712      ASM_SIMP_TAC std_ss [] THEN
8713      MATCH_MP_TAC(REAL_ARITH ``y <= e ==> x <= y ==> x <= e:real``) THEN
8714      SIMP_TAC std_ss [LAMBDA_PROD] THEN MATCH_MP_TAC REAL_LE_TRANS THEN
8715      EXISTS_TAC
8716       ``sum p (\(x:real,k:real->bool).
8717                 content k * e / (&4 * content (interval[a:real,b])))`` THEN
8718      CONJ_TAC THENL
8719       [MATCH_MP_TAC SUM_LE THEN ASM_SIMP_TAC std_ss [FORALL_PROD] THEN
8720        MAP_EVERY X_GEN_TAC [``x:real``, ``k:real->bool``] THEN
8721        DISCH_TAC THEN SIMP_TAC std_ss [ABS_MUL, GSYM REAL_SUB_LDISTRIB] THEN
8722        REWRITE_TAC [real_div, GSYM REAL_MUL_ASSOC] THEN
8723                REWRITE_TAC [GSYM real_div] THEN
8724        MATCH_MP_TAC REAL_LE_MUL2 THEN
8725        SIMP_TAC std_ss [REAL_ABS_POS, ABS_POS] THEN
8726        REWRITE_TAC[REAL_ARITH ``abs(x) <= x <=> &0 <= x:real``] THEN CONJ_TAC THENL
8727         [ASM_MESON_TAC[CONTENT_POS_LE, TAGGED_DIVISION_OF], ALL_TAC] THEN
8728        MATCH_MP_TAC(REAL_ARITH
8729         ``&0 <= g - f /\ g - f < e ==> abs(g - f) <= e:real``) THEN
8730        CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
8731        REWRITE_TAC[LESS_EQ_REFL] THEN ASM_MESON_TAC[TAGGED_DIVISION_OF, SUBSET_DEF],
8732        ALL_TAC] THEN
8733      SIMP_TAC std_ss [LAMBDA_PAIR] THEN
8734      ONCE_REWRITE_TAC [METIS [] ``content (SND p) = (\p. content (SND p)) p``] THEN
8735      REWRITE_TAC [real_div, GSYM REAL_MUL_ASSOC] THEN
8736          REWRITE_TAC [GSYM real_div] THEN
8737      REWRITE_TAC [SUM_RMUL] THEN SIMP_TAC std_ss [LAMBDA_PROD] THEN
8738      UNDISCH_TAC ``p tagged_division_of interval [(a,b)]`` THEN DISCH_TAC THEN
8739      FIRST_ASSUM(fn th => SIMP_TAC std_ss [MATCH_MP
8740       ADDITIVE_CONTENT_TAGGED_DIVISION th]) THEN
8741      MATCH_MP_TAC REAL_EQ_IMP_LE THEN
8742      UNDISCH_TAC ``&0 < content(interval[a:real,b])`` THEN
8743      REWRITE_TAC [real_div, REAL_MUL_ASSOC] THEN
8744      SIMP_TAC std_ss [REAL_LT_IMP_NE, REAL_INV_MUL, REAL_ARITH ``4 <> 0:real``] THEN
8745      REWRITE_TAC [REAL_MUL_ASSOC] THEN
8746      ONCE_REWRITE_TAC [REAL_ARITH ``a * b * c * d = (a * d) * b * c:real``] THEN
8747      SIMP_TAC std_ss [REAL_LT_IMP_NE, REAL_MUL_RINV, REAL_MUL_LID],
8748      ASM_SIMP_TAC std_ss [GSYM SUM_SUB] THEN SIMP_TAC std_ss [LAMBDA_PAIR] THEN
8749      MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC
8750        ``abs(sum { 0n..s}
8751               (\j. sum {(x:real,k:real->bool) | (x,k) IN p /\ (m(x) = j)}
8752                         (\(x,k). content k * f (m x) x :real -
8753                                  integral k (f (m x)))))`` THEN
8754      CONJ_TAC THENL
8755       [MATCH_MP_TAC REAL_EQ_IMP_LE THEN SIMP_TAC std_ss [lemma] THEN
8756        AP_TERM_TAC THEN SIMP_TAC std_ss [LAMBDA_PAIR] THEN
8757        REWRITE_TAC [SET_RULE ``{p' | p' IN p /\ (m (FST p') = j)} =
8758                       {p' | p' IN p /\ ((\p'. m (FST p')) p' = j)}``] THEN
8759        MATCH_MP_TAC(GSYM SUM_GROUP') THEN
8760        ASM_SIMP_TAC std_ss [SUBSET_DEF, FORALL_IN_IMAGE, IN_NUMSEG, LE_0] THEN
8761        ASM_SIMP_TAC std_ss [FORALL_PROD] THEN METIS_TAC [],
8762        ALL_TAC] THEN
8763      MATCH_MP_TAC REAL_LET_TRANS THEN
8764      EXISTS_TAC ``sum { 0n..s} (\i. e / &2 pow (i + 2))`` THEN CONJ_TAC THENL
8765       [ALL_TAC,
8766        SIMP_TAC std_ss [real_div, GSYM REAL_POW_INV, SUM_LMUL] THEN
8767        SIMP_TAC std_ss [REAL_POW_ADD, SUM_RMUL] THEN REWRITE_TAC[SUM_GP] THEN
8768        KNOW_TAC ``inv 2 <> 1:real`` THENL
8769        [SIMP_TAC std_ss [REAL_INV_1OVER, REAL_EQ_LDIV_EQ,
8770                 REAL_ARITH ``0 < 2:real``] THEN
8771         REAL_ARITH_TAC, DISCH_TAC] THEN
8772        ASM_SIMP_TAC std_ss [pow, REAL_LT_LMUL] THEN
8773        SIMP_TAC std_ss [METIS [REAL_HALF_DOUBLE,
8774                 REAL_EQ_SUB_RADD, REAL_INV_1OVER]
8775         ``1 - inv 2 = inv 2:real``] THEN
8776        REWRITE_TAC [real_div, REAL_INV_INV, POW_2] THEN
8777        ONCE_REWRITE_TAC [REAL_ARITH
8778                 ``a * b * (c * d) = a * (b * c) * d:real``] THEN
8779        REWRITE_TAC [METIS [REAL_MUL_RINV, REAL_ARITH ``2 <> 0:real``]
8780         ``2 * inv 2 = 1:real``] THEN
8781        GEN_REWR_TAC RAND_CONV [GSYM REAL_MUL_LID] THEN
8782        SIMP_TAC std_ss [REAL_LT_RMUL, REAL_INV_POS,
8783                 REAL_ARITH ``0 < 2:real``] THEN
8784        REWRITE_TAC [REAL_MUL_RID, real_sub] THEN
8785                GEN_REWR_TAC RAND_CONV [GSYM REAL_ADD_RID] THEN
8786        REWRITE_TAC [REAL_LT_LADD] THEN REWRITE_TAC [GSYM pow] THEN
8787        ONCE_REWRITE_TAC [GSYM REAL_LT_NEG] THEN
8788                REWRITE_TAC [REAL_NEG_0, REAL_NEG_NEG] THEN
8789        MATCH_MP_TAC POW_POS_LT THEN
8790        SIMP_TAC std_ss [REAL_INV_1OVER, REAL_LT_RDIV_EQ,
8791                REAL_ARITH ``0 < 2:real``] THEN
8792        REAL_ARITH_TAC] THEN
8793      MATCH_MP_TAC SUM_ABS_LE THEN REWRITE_TAC[FINITE_NUMSEG] THEN
8794      X_GEN_TAC ``t:num`` THEN REWRITE_TAC[IN_NUMSEG, LE_0] THEN DISCH_TAC THEN
8795      MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC
8796       ``abs(sum {x:real,k:real->bool | (x,k) IN p /\ (m x:num = t)}
8797                  (\(x,k). content k * f t x - integral k (f t)):real)`` THEN
8798      CONJ_TAC THENL
8799       [MATCH_MP_TAC REAL_EQ_IMP_LE THEN AP_TERM_TAC THEN BETA_TAC THEN
8800        MATCH_MP_TAC SUM_EQ THEN SIMP_TAC std_ss [FORALL_PROD, IN_ELIM_PAIR_THM],
8801        ALL_TAC] THEN
8802      MATCH_MP_TAC(SIMP_RULE std_ss [RIGHT_IMP_FORALL_THM, AND_IMP_INTRO]
8803        HENSTOCK_LEMMA_PART1) THEN
8804      MAP_EVERY EXISTS_TAC
8805       [``a:real``, ``b:real``, ``(b(t:num)):real->real->bool``] THEN
8806      ASM_SIMP_TAC std_ss [] THEN
8807      ASM_SIMP_TAC arith_ss [REAL_LT_DIV, REAL_POW_LT, REAL_LT] THEN
8808      CONJ_TAC THENL
8809       [MATCH_MP_TAC TAGGED_PARTIAL_DIVISION_SUBSET THEN
8810        EXISTS_TAC ``p:(real#(real->bool))->bool`` THEN
8811        SIMP_TAC std_ss [SUBSET_DEF, FORALL_PROD, IN_ELIM_PAIR_THM] THEN
8812        ASM_MESON_TAC[tagged_division_of],
8813        ALL_TAC] THEN
8814      UNDISCH_TAC
8815      ``(d :real -> real -> bool) FINE (p :real # (real -> bool) -> bool)`` THEN
8816      DISCH_TAC THEN
8817      FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [FINE]) THEN
8818      EXPAND_TAC "d" THEN SIMP_TAC std_ss [FINE, IN_ELIM_PAIR_THM] THEN MESON_TAC[],
8819      MP_TAC(ISPECL [``(f:num->real->real) s``, ``a:real``, ``b:real``,
8820                     ``p:(real#(real->bool))->bool``]
8821                    INTEGRAL_COMBINE_TAGGED_DIVISION_TOPDOWN) THEN
8822      MP_TAC(ISPECL [``(f:num->real->real) r``, ``a:real``, ``b:real``,
8823                     ``p:(real#(real->bool))->bool``]
8824                    INTEGRAL_COMBINE_TAGGED_DIVISION_TOPDOWN) THEN
8825      ASM_SIMP_TAC std_ss  [] THEN
8826      SIMP_TAC std_ss [o_DEF, LAMBDA_PROD] THEN MATCH_MP_TAC(REAL_ARITH
8827       ``sr <= sx /\ sx <= ss /\ ks <= i /\ &0 <= i - kr /\ i - kr < e
8828        ==> (kr = sr) ==> (ks = ss) ==> abs(sx - i) < e:real``) THEN
8829      ASM_SIMP_TAC std_ss [LESS_EQ_REFL] THEN CONJ_TAC THEN MATCH_MP_TAC SUM_LE THEN
8830      ASM_SIMP_TAC std_ss [FORALL_PROD] THEN
8831      MAP_EVERY X_GEN_TAC [``x:real``, ``i:real->bool``] THEN DISCH_TAC THEN
8832      (SUBGOAL_THEN ``i SUBSET interval[a:real,b]`` ASSUME_TAC THENL
8833        [METIS_TAC[TAGGED_DIVISION_OF], ALL_TAC] THEN
8834       SUBGOAL_THEN ``?u v:real. i = interval[u,v]``
8835        (REPEAT_TCL CHOOSE_THEN SUBST_ALL_TAC)
8836       THENL [METIS_TAC[TAGGED_DIVISION_OF], ALL_TAC]) THEN
8837      MATCH_MP_TAC INTEGRAL_DROP_LE THEN
8838      REPEAT(CONJ_TAC THENL
8839       [ASM_MESON_TAC[INTEGRABLE_SUBINTERVAL], ALL_TAC]) THEN
8840      X_GEN_TAC ``y:real`` THEN DISCH_TAC THEN
8841      MP_TAC(ISPEC
8842        ``\m n:num. (f m (y:real)) <= (f n y):real``
8843        TRANSITIVE_STEPWISE_LE) THEN
8844      SIMP_TAC std_ss [REAL_LE_TRANS, REAL_LE_REFL] THEN
8845      (KNOW_TAC ``(!(x :num) (y' :num) (z :num).
8846        (f :num -> real -> real) x (y :real) <= f y' y /\
8847        f y' y <= f z y ==> f x y <= f z y)`` THENL
8848     [SRW_TAC [][] THEN METIS_TAC [REAL_LE_TRANS, REAL_LE_REFL],
8849      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC]) THEN
8850      (KNOW_TAC
8851          ``!(n :num). (f :num -> real -> real) n (y :real) <= f (SUC n) y`` THENL
8852      [METIS_TAC[SUBSET_DEF], DISCH_TAC THEN ASM_REWRITE_TAC []]) THEN
8853      DISCH_THEN MATCH_MP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
8854      ASM_MESON_TAC[TAGGED_DIVISION_OF, SUBSET_DEF]],
8855    ALL_TAC] THEN
8856  CONJ_TAC THENL [ASM_MESON_TAC[integrable_on], ALL_TAC] THEN
8857  FIRST_ASSUM(SUBST1_TAC o MATCH_MP INTEGRAL_UNIQUE) THEN
8858  ASM_SIMP_TAC std_ss []
8859QED
8860
8861Theorem MONOTONE_CONVERGENCE_INCREASING :
8862    !f:num->real->real g s.
8863        (!k. (f k) integrable_on s) /\
8864        (!k x. x IN s ==> (f k x) <= (f (SUC k) x)) /\
8865        (!x. x IN s ==> ((\k. f k x) --> g x) sequentially) /\
8866        bounded {integral s (f k) | k IN univ(:num)}
8867        ==> g integrable_on s /\
8868            ((\k. integral s (f k)) --> integral s g) sequentially
8869Proof
8870  SUBGOAL_THEN
8871   ``!f:num->real->real g s.
8872        (!k x. x IN s ==> &0 <= (f k x)) /\
8873        (!k. (f k) integrable_on s) /\
8874        (!k x. x IN s ==> (f k x) <= (f (SUC k) x)) /\
8875        (!x. x IN s ==> ((\k. f k x) --> (g x):real) sequentially) /\
8876        bounded {integral s (f k) | k IN univ(:num)}
8877        ==> g integrable_on s /\
8878            ((\k. integral s (f k)) --> integral s g) sequentially``
8879  ASSUME_TAC THENL
8880  [ ALL_TAC,
8881    REPEAT GEN_TAC THEN STRIP_TAC THEN
8882    FIRST_X_ASSUM(MP_TAC o ISPECL
8883     [``\n x:real. f(SUC n) x - f  0n x:real``,
8884      ``\x. (g:real->real) x - f  0n x``, ``s:real->bool``]) THEN
8885    SIMP_TAC std_ss [] THEN
8886    KNOW_TAC ``(!(k :num) (x :real).
8887        x IN (s :real -> bool) ==>
8888        (0 :real) <= (f :num -> real -> real) (SUC k) x - f  0n x) /\
8889     (!(k :num).
8890        (\(x :real). f (SUC k) x - f  0n x) integrable_on s) /\
8891     (!(k :num) (x :real).
8892        x IN s ==>
8893        f (SUC k) x - f  0n x <= f (SUC (SUC k)) x - f  0n x) /\
8894     (!(x :real).
8895        x IN s ==>
8896        (((\(k :num). f (SUC k) x - f  0n x) -->
8897          ((g :real -> real) x - f  0n x)) sequentially :bool)) /\
8898     (bounded
8899        {integral s (\(x :real). f (SUC k) x - f  0n x) |
8900         k IN univ((:num) :num itself)} :bool)`` THEN REPEAT CONJ_TAC THENL
8901     [(* goal 1 (of 6) *)
8902      REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_SUB_LE] THEN
8903      MP_TAC(ISPEC
8904        ``\m n:num. (f m (x:real)) <= (f n x):real``
8905        TRANSITIVE_STEPWISE_LE) THEN
8906      SIMP_TAC std_ss [REAL_LE_TRANS, REAL_LE_REFL] THEN
8907      METIS_TAC[REAL_LE_TRANS, LE_0],
8908      (* goal 2 (of 6) *)
8909      GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_SUB THEN ASM_SIMP_TAC std_ss [ETA_AX],
8910      (* goal 3 (of 6) *)
8911      REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_SUB_LE] THEN
8912      ASM_SIMP_TAC std_ss [REAL_ARITH ``x - a <= y - a <=> x <= y:real``],
8913      (* goal 4 (of 6) *)
8914      REPEAT STRIP_TAC THEN
8915      ONCE_REWRITE_TAC [METIS [] ``!k. (f (SUC k) x - (f:num->real->real) 0 x) =
8916                               ((\k. f (SUC k) x) k - (\k. f 0 x) k)``] THEN
8917      MATCH_MP_TAC LIM_SUB THEN SIMP_TAC std_ss [LIM_CONST] THEN
8918      REWRITE_TAC[ADD1] THEN
8919      ONCE_REWRITE_TAC [METIS []
8920          ``(\k. f (k + 1) x) = (\k. (\a. f (a) x) (k + 1:num))``] THEN
8921      MATCH_MP_TAC(ISPECL[``f:num->real``, ``l:real``, ``1:num``] SEQ_OFFSET) THEN
8922      ASM_SIMP_TAC std_ss [],
8923      (* goal 5 (of 6) *)
8924      FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [bounded_def]) THEN
8925      SIMP_TAC std_ss [bounded_def] THEN
8926      ONCE_REWRITE_TAC [METIS []
8927      ``(\x:real. f (SUC k) x - (f 0 x):real) =
8928            (\x. (\x. f (SUC k) x) x - (\x. f 0 x) x)``] THEN
8929      UNDISCH_TAC ``!k. (f:num->real->real) k integrable_on s`` THEN DISCH_TAC THEN
8930      FIRST_ASSUM (MP_TAC o ONCE_REWRITE_RULE [METIS []
8931       ``!k. (f:num->real->real) k = (\x. f k x)``]) THEN DISCH_TAC THEN
8932      ASM_SIMP_TAC std_ss [INTEGRAL_SUB, ETA_AX, METIS []
8933       ``!k. (\x. f k x) = f k``] THEN
8934      ONCE_REWRITE_TAC [METIS []
8935          ``(integral s (f (SUC k)) - integral s ((f:num->real->real) 0)) =
8936        (\k. integral s (f (SUC k)) - integral s (f 0)) k``] THEN
8937      ONCE_REWRITE_TAC [METIS []
8938          ``integral s (f k) = (\k. integral s (f k)) k``] THEN
8939      ONCE_REWRITE_TAC [GSYM IMAGE_DEF] THEN BETA_TAC THEN
8940      SIMP_TAC std_ss [FORALL_IN_IMAGE, IN_UNIV] THEN
8941      DISCH_THEN(X_CHOOSE_THEN ``B:real``
8942        (fn th => EXISTS_TAC ``(B:real) + abs(integral s (f  0n:real->real))`` THEN
8943                   X_GEN_TAC ``k:num`` THEN MP_TAC(SPEC ``SUC k`` th))) THEN
8944      REAL_ARITH_TAC,
8945      (* goal 6 (of 6) *)
8946      ASM_SIMP_TAC std_ss [] THEN DISCH_TAC THEN POP_ASSUM K_TAC THEN
8947      ONCE_REWRITE_TAC [METIS []
8948      ``(\x:real. f (SUC k) x - (f 0 x):real) =
8949            (\x. (\x. f (SUC k) x) x - (\x. f 0 x) x)``] THEN
8950      UNDISCH_TAC ``!k. (f:num->real->real) k integrable_on s`` THEN DISCH_TAC THEN
8951      FIRST_ASSUM (MP_TAC o ONCE_REWRITE_RULE [METIS []
8952       ``!k. (f:num->real->real) k = (\x. f k x)``]) THEN DISCH_TAC THEN
8953      ASM_SIMP_TAC std_ss [INTEGRAL_SUB, ETA_AX, METIS []
8954       ``!k. (\x. f k x) = f k``] THEN ASM_SIMP_TAC std_ss [IMP_CONJ] THEN
8955      SUBGOAL_THEN ``(f  0n:real->real) integrable_on s`` MP_TAC THENL
8956       [ASM_SIMP_TAC std_ss [], ONCE_REWRITE_TAC[AND_IMP_INTRO]] THEN
8957      DISCH_THEN(MP_TAC o MATCH_MP INTEGRABLE_ADD) THEN
8958      SIMP_TAC std_ss [ETA_AX, REAL_ARITH ``f + (g - f):real = g``] THEN
8959      DISCH_TAC THEN
8960      ONCE_REWRITE_TAC [METIS []
8961      ``(\x:real. g x - (f 0 x):real) =
8962            (\x. g x - (\x. (f:num->real->real) 0 x) x)``] THEN
8963      ASM_SIMP_TAC std_ss [INTEGRAL_SUB, ETA_AX] THEN
8964      MP_TAC(ISPECL [``sequentially``, ``integral s (f  0n:real->real)``]
8965                    LIM_CONST) THEN
8966      REWRITE_TAC[AND_IMP_INTRO] THEN DISCH_THEN(MP_TAC o MATCH_MP LIM_ADD) THEN
8967      SIMP_TAC std_ss [ETA_AX, REAL_ARITH ``f + (g - f):real = g``, METIS []
8968       ``(\x. f 0 x) = (f:num->real->real) 0``] THEN
8969      REWRITE_TAC[ADD1] THEN
8970      ONCE_REWRITE_TAC [METIS [] ``(\x. integral s ((f:num->real->real) (x + 1))) =
8971                                   (\x. (\a. integral s (f (a))) (x + 1))``] THEN
8972      SIMP_TAC std_ss [ISPECL[``f:num->real``, ``l:real``, ``1:num``] SEQ_OFFSET_REV]
8973      ] ]
8974  THEN REPEAT GEN_TAC THEN STRIP_TAC THEN
8975  SUBGOAL_THEN
8976   ``!x:real k:num. x IN s ==> (f k x) <= (g x):real``
8977  ASSUME_TAC THENL
8978   [REPEAT STRIP_TAC THEN
8979    MATCH_MP_TAC(ISPEC ``sequentially`` LIM_DROP_LBOUND) THEN
8980    EXISTS_TAC ``\k. (f:num->real->real) k x`` THEN
8981    ASM_SIMP_TAC std_ss [TRIVIAL_LIMIT_SEQUENTIALLY, EVENTUALLY_SEQUENTIALLY] THEN
8982    EXISTS_TAC ``k:num`` THEN SPEC_TAC(``k:num``,``k:num``) THEN
8983    ONCE_REWRITE_TAC [METIS [] ``f k x <= (f:num->real->real) x' x <=>
8984                         (\k x'. f k x <= f x' x) k x'``] THEN
8985    MATCH_MP_TAC TRANSITIVE_STEPWISE_LE THEN
8986    SIMP_TAC std_ss [REAL_LE_TRANS, REAL_LE_REFL] THEN
8987    CONJ_TAC THENL [METIS_TAC [REAL_LE_TRANS], ALL_TAC] THEN
8988    ASM_SIMP_TAC std_ss [REAL_LE_REFL],
8989    ALL_TAC] THEN
8990  SUBGOAL_THEN
8991   ``?i. ((\k:num. integral s (f k:real->real)) --> i)
8992        sequentially``
8993  CHOOSE_TAC THENL
8994   [MATCH_MP_TAC BOUNDED_INCREASING_CONVERGENT THEN ASM_SIMP_TAC std_ss [] THEN
8995    GEN_TAC THEN MATCH_MP_TAC INTEGRAL_DROP_LE THEN ASM_SIMP_TAC std_ss [],
8996    ALL_TAC] THEN
8997  SUBGOAL_THEN
8998   ``!k. (integral s ((f:num->real->real) k)) <= i``
8999  ASSUME_TAC THENL
9000    [GEN_TAC THEN MATCH_MP_TAC(ISPEC ``sequentially`` LIM_DROP_LBOUND) THEN
9001     EXISTS_TAC ``\k. integral(s) ((f:num->real->real) k)`` THEN
9002     ASM_SIMP_TAC std_ss [TRIVIAL_LIMIT_SEQUENTIALLY, EVENTUALLY_SEQUENTIALLY] THEN
9003     EXISTS_TAC ``k:num`` THEN SPEC_TAC(``k:num``,``k:num``) THEN
9004     ONCE_REWRITE_TAC [METIS []
9005     ``(integral s (f k) <= integral s ((f:num->real->real) x)) <=>
9006       (\k x. integral s (f k) <= integral s (f x)) k x``] THEN
9007     MATCH_MP_TAC TRANSITIVE_STEPWISE_LE THEN
9008     ASM_SIMP_TAC std_ss [REAL_LE_REFL, REAL_LE_TRANS] THEN CONJ_TAC THENL
9009     [METIS_TAC [REAL_LE_TRANS], ALL_TAC] THEN
9010     GEN_TAC THEN MATCH_MP_TAC INTEGRAL_DROP_LE THEN ASM_SIMP_TAC std_ss [],
9011     ALL_TAC] THEN
9012  SUBGOAL_THEN ``((g:real->real) has_integral i) s`` ASSUME_TAC THENL
9013   [ALL_TAC,
9014    CONJ_TAC THENL [ASM_MESON_TAC[integrable_on], ALL_TAC] THEN
9015    FIRST_ASSUM(SUBST1_TAC o MATCH_MP INTEGRAL_UNIQUE) THEN
9016    ASM_REWRITE_TAC[]] THEN
9017  REWRITE_TAC[HAS_INTEGRAL_ALT] THEN
9018  MP_TAC(ISPECL
9019   [``\k x. if x IN s then (f:num->real->real) k x else 0``,
9020    ``\x. if x IN s then (g:real->real) x else 0``] MONOTONE_CONVERGENCE_INTERVAL) THEN
9021  DISCH_TAC THEN
9022  KNOW_TAC ``(!(a :real) (b :real).
9023       (!(k :num).
9024          (\(k :num) (x :real).
9025             if x IN (s :real -> bool) then (f :num -> real -> real) k x
9026             else (0 :real)) k integrable_on interval [(a,b)]) /\
9027       (!(k :num) (x :real).
9028          x IN interval [(a,b)] ==>
9029          (\(k :num) (x :real). if x IN s then f k x else (0 :real)) k x <=
9030          (\(k :num) (x :real). if x IN s then f k x else (0 :real)) (SUC k)
9031            x) /\
9032       (!(x :real).
9033          x IN interval [(a,b)] ==>
9034          (((\(k :num).
9035               (\(k :num) (x :real). if x IN s then f k x else (0 :real)) k
9036                 x) -->
9037            (\(x :real). if x IN s then (g :real -> real) x else (0 :real))
9038              x) sequentially :bool)) /\
9039       (bounded
9040          {integral (interval [(a,b)])
9041             ((\(k :num) (x :real). if x IN s then f k x else (0 :real))
9042                k) |
9043           k IN univ((:num) :num itself)} :bool)) ==>
9044           (!(a :real) (b :real).
9045       (\(x :real). if x IN s then g x else (0 :real)) integrable_on
9046       interval [(a,b)] /\
9047       (((\(k :num).
9048            integral (interval [(a,b)])
9049              ((\(k :num) (x :real). if x IN s then f k x else (0 :real))
9050                 k)) -->
9051         integral (interval [(a,b)])
9052           (\(x :real). if x IN s then g x else (0 :real))) sequentially :
9053          bool))`` THENL [METIS_TAC [], POP_ASSUM K_TAC] THEN
9054  KNOW_TAC ``(!(a :real) (b :real).
9055       (!(k :num).
9056          (\(k :num) (x :real).
9057             if x IN (s :real -> bool) then (f :num -> real -> real) k x
9058             else (0 :real)) k integrable_on interval [(a,b)]) /\
9059       (!(k :num) (x :real).
9060          x IN interval [(a,b)] ==>
9061          (\(k :num) (x :real). if x IN s then f k x else (0 :real)) k x <=
9062          (\(k :num) (x :real). if x IN s then f k x else (0 :real)) (SUC k)
9063            x) /\
9064       (!(x :real).
9065          x IN interval [(a,b)] ==>
9066          (((\(k :num).
9067               (\(k :num) (x :real). if x IN s then f k x else (0 :real)) k
9068                 x) -->
9069            (\(x :real). if x IN s then (g :real -> real) x else (0 :real))
9070              x) sequentially :bool)) /\
9071       (bounded
9072          {integral (interval [(a,b)])
9073             ((\(k :num) (x :real). if x IN s then f k x else (0 :real))
9074                k) |
9075           k IN univ((:num) :num itself)} :bool))`` THENL
9076   [REPEAT GEN_TAC THEN SIMP_TAC std_ss [] THEN
9077    MATCH_MP_TAC(TAUT `a /\ (a ==> b) ==> a /\ b`) THEN CONJ_TAC THENL
9078     [UNDISCH_TAC ``!k. (f:num->real->real) k integrable_on s`` THEN DISCH_TAC THEN
9079      FIRST_ASSUM(MP_TAC o ONCE_REWRITE_RULE [INTEGRABLE_ALT]) THEN
9080      SIMP_TAC std_ss [],
9081      DISCH_TAC] THEN
9082    CONJ_TAC THENL
9083     [REPEAT STRIP_TAC THEN COND_CASES_TAC THEN ASM_SIMP_TAC std_ss [REAL_LE_REFL],
9084      ALL_TAC] THEN
9085    CONJ_TAC THENL
9086     [REPEAT STRIP_TAC THEN COND_CASES_TAC THEN ASM_SIMP_TAC std_ss [LIM_CONST],
9087      ALL_TAC] THEN
9088     UNDISCH_TAC
9089     ``bounded {integral s ((f:num->real->real) k) | k IN univ(:num)}`` THEN
9090    DISCH_TAC THEN
9091    FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [bounded_def]) THEN
9092    ONCE_REWRITE_TAC [METIS [] ``integral s (f k) = (\k. integral s (f k)) k``] THEN
9093    ONCE_REWRITE_TAC [METIS []
9094        ``integral (interval [(a,b)]) (\x. if x IN s then f k x else 0) =
9095          (\k. integral (interval [(a,b)]) (\x. if x IN s then f k x else 0))k``] THEN
9096    ONCE_REWRITE_TAC[GSYM IMAGE_DEF] THEN BETA_TAC THEN
9097    SIMP_TAC std_ss [bounded_def, FORALL_IN_IMAGE, IN_UNIV] THEN
9098    DISCH_THEN (X_CHOOSE_TAC ``x:real``) THEN EXISTS_TAC ``x:real`` THEN
9099    X_GEN_TAC ``k:num`` THEN POP_ASSUM (MP_TAC o Q.SPEC `k:num`) THEN
9100    MATCH_MP_TAC(REAL_ARITH
9101     ``&0 <= y /\ y <= x ==> abs(x) <= a ==> abs(y) <= a:real``) THEN
9102    CONJ_TAC THENL
9103     [MATCH_MP_TAC INTEGRAL_DROP_POS THEN ASM_SIMP_TAC std_ss [] THEN
9104      REPEAT STRIP_TAC THEN COND_CASES_TAC THEN
9105      ASM_SIMP_TAC std_ss [REAL_LE_REFL],
9106      ALL_TAC] THEN
9107    GEN_REWR_TAC (RAND_CONV) [GSYM INTEGRAL_RESTRICT_UNIV] THEN
9108    MATCH_MP_TAC INTEGRAL_SUBSET_DROP_LE THEN
9109    ASM_SIMP_TAC std_ss [SUBSET_UNIV, IN_UNIV] THEN
9110    ASM_SIMP_TAC std_ss [INTEGRABLE_RESTRICT_UNIV, ETA_AX, METIS []
9111     ``(\x. f k x) = (f:num->real->real) k``] THEN
9112    GEN_TAC THEN COND_CASES_TAC THEN
9113    ASM_SIMP_TAC std_ss [REAL_LE_REFL, REAL_LE_REFL],
9114    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
9115  SIMP_TAC std_ss [FORALL_AND_THM] THEN STRIP_TAC THEN ASM_SIMP_TAC std_ss [] THEN
9116  X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
9117  UNDISCH_TAC ``((\k. integral s ((f:num->real->real) k)) --> i) sequentially`` THEN
9118  DISCH_TAC THEN
9119  FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [LIM_SEQUENTIALLY]) THEN
9120  DISCH_THEN(MP_TAC o SPEC ``e / &4:real``) THEN
9121  ASM_SIMP_TAC arith_ss [dist, REAL_LT_DIV, REAL_LT] THEN
9122  DISCH_THEN(X_CHOOSE_THEN ``N:num`` STRIP_ASSUME_TAC) THEN
9123  UNDISCH_TAC ``!k. (f:num->real->real) k integrable_on s`` THEN DISCH_TAC THEN
9124  FIRST_ASSUM(MP_TAC o REWRITE_RULE [HAS_INTEGRAL_INTEGRAL]) THEN
9125  GEN_REWR_TAC (LAND_CONV o BINDER_CONV) [HAS_INTEGRAL_ALT] THEN
9126  SIMP_TAC std_ss [FORALL_AND_THM] THEN
9127  DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
9128  DISCH_THEN(MP_TAC o SPECL [``N:num``, ``e / &4:real``]) THEN
9129  ASM_SIMP_TAC arith_ss [dist, REAL_LT_DIV, REAL_LT] THEN
9130  STRIP_TAC THEN EXISTS_TAC ``B:real`` THEN ASM_SIMP_TAC std_ss [] THEN
9131  MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``] THEN DISCH_TAC THEN
9132  FIRST_X_ASSUM(MP_TAC o SPECL [``a:real``, ``b:real``]) THEN
9133  ASM_REWRITE_TAC[] THEN
9134  FIRST_ASSUM(MP_TAC o C MATCH_MP (ARITH_PROVE ``N:num <= N``)) THEN
9135  REWRITE_TAC[AND_IMP_INTRO] THEN
9136  DISCH_THEN(MP_TAC o MATCH_MP (REAL_ARITH
9137   ``abs(x - y) < e / &4 /\ abs(z - x) < e / &4
9138    ==> abs(z - y) < e / &4 + e / &4:real``)) THEN
9139  UNDISCH_TAC `` !a b.
9140            ((\k.
9141                integral (interval [(a,b)])
9142                  (\x. if x IN s then (f:num->real->real) k x else 0)) -->
9143             integral (interval [(a,b)]) (\x. if x IN s then g x else 0))
9144              sequentially`` THEN DISCH_TAC THEN
9145  FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [LIM_SEQUENTIALLY]) THEN
9146  DISCH_THEN(MP_TAC o SPECL [``a:real``, ``b:real``, ``e / &4 + e / &4:real``]) THEN
9147  KNOW_TAC ``e / &4 + e / &4:real = e / &2:real`` THENL
9148  [REWRITE_TAC [REAL_DOUBLE, real_div, REAL_MUL_ASSOC] THEN
9149   REWRITE_TAC [GSYM real_div] THEN
9150   SIMP_TAC std_ss [REAL_EQ_RDIV_EQ, REAL_ARITH ``0 < 2:real``] THEN
9151   ONCE_REWRITE_TAC [real_div] THEN
9152   ONCE_REWRITE_TAC [REAL_ARITH ``a * b * c * d =((a * d) * c) * b:real``] THEN
9153   REWRITE_TAC [REAL_ARITH ``2 * 2 = 4:real``] THEN
9154   SIMP_TAC std_ss [REAL_MUL_RINV, REAL_ARITH ``4 <> 0:real``] THEN REAL_ARITH_TAC,
9155   DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
9156  ASM_SIMP_TAC std_ss [dist, REAL_HALF] THEN
9157  DISCH_THEN(X_CHOOSE_THEN ``M:num`` (MP_TAC o SPEC ``M + N:num``)) THEN
9158  REWRITE_TAC[LE_ADD] THEN
9159  GEN_REWR_TAC (RAND_CONV o RAND_CONV o RAND_CONV) [GSYM REAL_HALF] THEN
9160  MATCH_MP_TAC(REAL_ARITH
9161   ``f1 <= f2 /\ f2 <= i
9162    ==> abs(f2 - g) < e / &2 ==> abs(f1 - i) < e / &2 ==>
9163        abs(g - i) < e / &2 + e / &2:real``) THEN
9164  CONJ_TAC THENL
9165   [MATCH_MP_TAC INTEGRAL_DROP_LE THEN ASM_SIMP_TAC std_ss [] THEN
9166    X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN
9167    COND_CASES_TAC THEN ASM_REWRITE_TAC[REAL_LE_REFL] THEN
9168    MP_TAC(ISPEC
9169        ``\m n:num. (f m (x:real)) <= (f n x):real``
9170        TRANSITIVE_STEPWISE_LE) THEN
9171    SIMP_TAC std_ss [REAL_LE_REFL, REAL_LE_TRANS] THEN
9172    KNOW_TAC ``(!(x' :num) (y :num) (z :num).
9173        (f :num -> real -> real) x' (x :real) <= f y x /\ f y x <= f z x ==>
9174        f x' x <= f z x) /\ (!(n :num). f n x <= f (SUC n) x)`` THENL
9175    [METIS_TAC [REAL_LE_TRANS], DISCH_TAC THEN
9176     ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
9177    DISCH_THEN MATCH_MP_TAC THEN ARITH_TAC,
9178    ALL_TAC] THEN
9179  MATCH_MP_TAC REAL_LE_TRANS THEN
9180  EXISTS_TAC ``(integral s ((f:num->real->real) (M + N)))`` THEN
9181  ASM_SIMP_TAC std_ss [] THEN
9182  GEN_REWR_TAC (RAND_CONV) [GSYM INTEGRAL_RESTRICT_UNIV] THEN
9183  MATCH_MP_TAC INTEGRAL_SUBSET_DROP_LE THEN
9184  ASM_SIMP_TAC std_ss [SUBSET_UNIV, IN_UNIV] THEN
9185  ASM_SIMP_TAC std_ss [INTEGRABLE_RESTRICT_UNIV, ETA_AX, METIS []
9186   ``(\x. f (M + N) x) = (f:num->real->real) (M + N)``] THEN
9187  GEN_TAC THEN COND_CASES_TAC THEN
9188  ASM_SIMP_TAC std_ss [REAL_LE_REFL]
9189QED
9190
9191Theorem MONOTONE_CONVERGENCE_DECREASING:
9192   !f:num->real->real g s.
9193        (!k. (f k) integrable_on s) /\
9194        (!k x. x IN s ==> (f (SUC k) x) <= (f k x)) /\
9195        (!x. x IN s ==> ((\k. f k x) --> g x) sequentially) /\
9196        bounded {integral s (f k) | k IN univ(:num)}
9197        ==> g integrable_on s /\
9198            ((\k. integral s (f k)) --> integral s g) sequentially
9199Proof
9200  REPEAT GEN_TAC THEN DISCH_TAC THEN
9201  MP_TAC(ISPECL
9202   [``(\k x. -(f k x)):num->real->real``,
9203    ``(\x. -(g x)):real->real``, ``s:real->bool``]
9204        MONOTONE_CONVERGENCE_INCREASING) THEN
9205  FIRST_ASSUM MP_TAC THEN
9206  MATCH_MP_TAC(TAUT `(a ==> b) /\ (c ==> d) ==> a ==> (b ==> c) ==> d`) THEN
9207  SIMP_TAC std_ss [] THEN CONJ_TAC THENL
9208   [REPEAT(MATCH_MP_TAC MONO_AND THEN CONJ_TAC) THENL
9209     [DISCH_TAC THEN GEN_TAC THEN POP_ASSUM (MP_TAC o Q.SPEC `k:num`) THEN
9210      DISCH_THEN(MP_TAC o MATCH_MP INTEGRABLE_NEG) THEN SIMP_TAC std_ss [],
9211      SIMP_TAC std_ss [REAL_LE_NEG2],
9212      REPEAT STRIP_TAC THEN
9213      ONCE_REWRITE_TAC [METIS []
9214      ``(\k. -f k x) = (\k. -((\k. (f:num->real->real) k x) k))``] THEN
9215      MATCH_MP_TAC LIM_NEG THEN ASM_SIMP_TAC std_ss [],
9216      ALL_TAC] THEN
9217    DISCH_TAC THEN MATCH_MP_TAC BOUNDED_SUBSET THEN
9218    EXISTS_TAC ``IMAGE (\x. -x)
9219                      {integral s (f k:real->real) | k IN univ(:num)}`` THEN
9220    CONJ_TAC THENL
9221     [MATCH_MP_TAC BOUNDED_LINEAR_IMAGE THEN
9222      ASM_SIMP_TAC std_ss [LINEAR_COMPOSE_NEG, LINEAR_ID],
9223      ONCE_REWRITE_TAC [METIS [] ``integral s (f k) = (\k. integral s (f k)) k``] THEN
9224      ONCE_REWRITE_TAC [METIS [] ``integral s (\x. -f k x) =
9225                              (\k. integral s (\x. -f k x)) k``] THEN
9226      ONCE_REWRITE_TAC[GSYM IMAGE_DEF] THEN REWRITE_TAC[GSYM IMAGE_COMPOSE] THEN
9227      REWRITE_TAC[SUBSET_DEF, IN_IMAGE] THEN
9228      GEN_TAC THEN STRIP_TAC THEN EXISTS_TAC ``x':num`` THEN
9229      REPEAT STRIP_TAC THEN ASM_SIMP_TAC std_ss [o_THM] THEN
9230      ONCE_ASM_REWRITE_TAC [] THEN BETA_TAC THEN
9231      MATCH_MP_TAC INTEGRAL_NEG THEN ASM_REWRITE_TAC[]],
9232    ALL_TAC] THEN
9233  DISCH_THEN(CONJUNCTS_THEN2
9234   (MP_TAC o MATCH_MP INTEGRABLE_NEG) (MP_TAC o MATCH_MP LIM_NEG)) THEN
9235  SIMP_TAC std_ss [REAL_NEG_NEG, ETA_AX] THEN
9236  DISCH_THEN(fn th => STRIP_TAC THEN MP_TAC th) THEN
9237  ASM_SIMP_TAC std_ss [] THEN MATCH_MP_TAC EQ_IMPLIES THEN AP_THM_TAC THEN
9238  BINOP_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN TRY GEN_TAC THEN BETA_TAC THEN
9239  MATCH_MP_TAC(REAL_ARITH ``(x:real = -y) ==> (-x = y)``) THEN
9240  MATCH_MP_TAC INTEGRAL_NEG THEN ASM_REWRITE_TAC[]
9241QED
9242
9243Theorem MONOTONE_CONVERGENCE_INCREASING_AE:
9244   !f:num->real->real g s t.
9245        (!k. (f k) integrable_on s) /\
9246        negligible t /\
9247        (!k x. x IN s DIFF t ==> (f k x) <= (f (SUC k) x)) /\
9248        (!x. x IN s DIFF t ==> ((\k. f k x) --> g x) sequentially) /\
9249        bounded {integral s (f k) | k IN univ(:num)}
9250        ==> g integrable_on s /\
9251            ((\k. integral s (f k)) --> integral s g) sequentially
9252Proof
9253  REPEAT GEN_TAC THEN STRIP_TAC THEN
9254  MP_TAC(ISPECL
9255   [``\n x. if x IN t then 0
9256           else (f:num->real->real) n x``,
9257    ``\x. if x IN t then 0
9258           else (g:real->real) x``, ``s:real->bool``]
9259        MONOTONE_CONVERGENCE_INCREASING) THEN
9260  ASM_SIMP_TAC std_ss [] THEN
9261  KNOW_TAC ``(!(k :num).
9262        (\(x :real).
9263           if x IN (t :real -> bool) then (0 :real)
9264           else (f :num -> real -> real) k x) integrable_on
9265        (s :real -> bool)) /\
9266     (!(k :num) (x :real).
9267        x IN s ==>
9268        (if x IN t then (0 :real) else f k x) <=
9269        if x IN t then (0 :real) else f (SUC k) x) /\
9270     (!(x :real).
9271        x IN s ==>
9272        (((\(k :num). if x IN t then (0 :real) else f k x) -->
9273          if x IN t then (0 :real) else (g :real -> real) x) sequentially :
9274           bool)) /\
9275     (bounded
9276        {integral s (\(x :real). if x IN t then (0 :real) else f k x) |
9277         k IN univ((:num) :num itself)} :bool)`` THENL
9278   [REPEAT CONJ_TAC THENL
9279     [X_GEN_TAC ``k:num`` THEN
9280      MATCH_MP_TAC(REWRITE_RULE[AND_IMP_INTRO] INTEGRABLE_SPIKE) THEN
9281      EXISTS_TAC ``(f:num->real->real) k`` THEN
9282      EXISTS_TAC ``t:real->bool`` THEN
9283      ASM_SIMP_TAC std_ss [IN_DIFF],
9284      REPEAT STRIP_TAC THEN COND_CASES_TAC THEN
9285      ASM_REWRITE_TAC[REAL_LE_REFL] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
9286      ASM_SET_TAC[],
9287      X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN
9288      ASM_CASES_TAC ``(x:real) IN t`` THEN ASM_REWRITE_TAC[LIM_CONST] THEN
9289      FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[IN_DIFF],
9290      FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
9291        BOUNDED_SUBSET)) THEN
9292      ONCE_REWRITE_TAC [METIS []
9293         ``integral s (f k) = (\k. integral s (f k)) k``] THEN
9294      ONCE_REWRITE_TAC [METIS [] ``integral (s :real -> bool)
9295       (\(x :real). if x IN (t :real -> bool) then (0 :real)
9296                    else (f :num -> real -> real) k x) =
9297          (\k. integral (s :real -> bool)
9298       (\(x :real). if x IN (t :real -> bool) then (0 :real)
9299                    else (f :num -> real -> real) k x)) k``] THEN
9300      MATCH_MP_TAC(SET_RULE
9301       ``(!x. x IN s ==> (f x = g x))
9302        ==> {f x | x IN s} SUBSET {g x | x IN s}``) THEN
9303      BETA_TAC THEN REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRAL_SPIKE THEN
9304      EXISTS_TAC ``t:real->bool`` THEN
9305      ASM_SIMP_TAC std_ss [IN_DIFF]],
9306      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
9307    MATCH_MP_TAC MONO_AND THEN CONJ_TAC THENL
9308     [MATCH_MP_TAC INTEGRABLE_SPIKE THEN EXISTS_TAC ``t:real->bool`` THEN
9309      ASM_SIMP_TAC std_ss [IN_DIFF],
9310      MATCH_MP_TAC EQ_IMPLIES THEN AP_THM_TAC THEN BINOP_TAC THEN
9311      REWRITE_TAC[FUN_EQ_THM] THEN REPEAT GEN_TAC THEN BETA_TAC THEN
9312      MATCH_MP_TAC INTEGRAL_SPIKE THEN EXISTS_TAC ``t:real->bool`` THEN
9313      ASM_SIMP_TAC std_ss [IN_DIFF]]]
9314QED
9315
9316Theorem MONOTONE_CONVERGENCE_DECREASING_AE:
9317   !f:num->real->real g s t.
9318        (!k. (f k) integrable_on s) /\
9319        negligible t /\
9320        (!k x. x IN s DIFF t ==> (f (SUC k) x) <= (f k x)) /\
9321        (!x. x IN s DIFF t ==> ((\k. f k x) --> g x) sequentially) /\
9322        bounded {integral s (f k) | k IN univ(:num)}
9323        ==> g integrable_on s /\
9324            ((\k. integral s (f k)) --> integral s g) sequentially
9325Proof
9326  REPEAT GEN_TAC THEN STRIP_TAC THEN
9327  MP_TAC(ISPECL
9328   [``\n x. if x IN t then 0
9329           else (f:num->real->real) n x``,
9330    ``\x. if x IN t then 0
9331           else (g:real->real) x``, ``s:real->bool``]
9332        MONOTONE_CONVERGENCE_DECREASING) THEN
9333  ASM_SIMP_TAC std_ss [] THEN
9334  KNOW_TAC ``(!(k :num).
9335        (\(x :real).
9336           if x IN (t :real -> bool) then (0 :real)
9337           else (f :num -> real -> real) k x) integrable_on
9338        (s :real -> bool)) /\
9339     (!(k :num) (x :real).
9340        x IN s ==>
9341        (if x IN t then (0 :real) else f (SUC k) x) <=
9342        if x IN t then (0 :real) else f k x) /\
9343     (!(x :real).
9344        x IN s ==>
9345        (((\(k :num). if x IN t then (0 :real) else f k x) -->
9346          if x IN t then (0 :real) else (g :real -> real) x) sequentially :
9347           bool)) /\
9348     (bounded
9349        {integral s (\(x :real). if x IN t then (0 :real) else f k x) |
9350         k IN univ((:num) :num itself)} :bool)`` THENL
9351   [REPEAT CONJ_TAC THENL
9352     [X_GEN_TAC ``k:num`` THEN
9353      MATCH_MP_TAC(REWRITE_RULE[AND_IMP_INTRO] INTEGRABLE_SPIKE) THEN
9354      EXISTS_TAC ``(f:num->real->real) k`` THEN
9355      EXISTS_TAC ``t:real->bool`` THEN
9356      ASM_SIMP_TAC std_ss [IN_DIFF],
9357      REPEAT STRIP_TAC THEN COND_CASES_TAC THEN
9358      ASM_REWRITE_TAC[REAL_LE_REFL] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
9359      ASM_SET_TAC[],
9360      X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN
9361      ASM_CASES_TAC ``(x:real) IN t`` THEN ASM_REWRITE_TAC[LIM_CONST] THEN
9362      FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[IN_DIFF],
9363      FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
9364        BOUNDED_SUBSET)) THEN
9365      ONCE_REWRITE_TAC [METIS []
9366          ``integral s (f k) = (\k. integral s (f k)) k``] THEN
9367      ONCE_REWRITE_TAC [METIS [] ``integral (s :real -> bool)
9368       (\(x :real). if x IN (t :real -> bool) then (0 :real)
9369                    else (f :num -> real -> real) k x) =
9370          (\k. integral (s :real -> bool)
9371       (\(x :real). if x IN (t :real -> bool) then (0 :real)
9372                    else (f :num -> real -> real) k x)) k``] THEN
9373      MATCH_MP_TAC(SET_RULE
9374       ``(!x. x IN s ==> (f x = g x))
9375        ==> {f x | x IN s} SUBSET {g x | x IN s}``) THEN BETA_TAC THEN
9376      REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRAL_SPIKE THEN
9377      EXISTS_TAC ``t:real->bool`` THEN
9378      ASM_SIMP_TAC std_ss [IN_DIFF]],
9379    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
9380    MATCH_MP_TAC MONO_AND THEN CONJ_TAC THENL
9381     [MATCH_MP_TAC INTEGRABLE_SPIKE THEN EXISTS_TAC ``t:real->bool`` THEN
9382      ASM_SIMP_TAC std_ss [IN_DIFF],
9383      MATCH_MP_TAC EQ_IMPLIES THEN AP_THM_TAC THEN BINOP_TAC THEN
9384      REWRITE_TAC[FUN_EQ_THM] THEN REPEAT GEN_TAC THEN BETA_TAC THEN
9385      MATCH_MP_TAC INTEGRAL_SPIKE THEN EXISTS_TAC ``t:real->bool`` THEN
9386      ASM_SIMP_TAC std_ss [IN_DIFF]]]
9387QED
9388
9389(* ------------------------------------------------------------------------- *)
9390(* More lemmas about existence and bounds between integrals.                 *)
9391(* ------------------------------------------------------------------------- *)
9392
9393Theorem lemma[local]:
9394   (!e:real. &0 < e ==> x < y + e) ==> x <= y
9395Proof
9396   DISCH_THEN(MP_TAC o SPEC ``x - y:real``) THEN REAL_ARITH_TAC
9397QED
9398
9399Theorem INTEGRAL_ABS_BOUND_INTEGRAL:
9400   !f:real->real g s.
9401        f integrable_on s /\ g integrable_on s /\
9402        (!x. x IN s ==> abs(f x) <= (g x))
9403        ==> abs(integral s f) <= (integral s g)
9404Proof
9405  SUBGOAL_THEN
9406   ``!f:real->real g a b.
9407        f integrable_on interval[a,b] /\ g integrable_on interval[a,b] /\
9408        (!x. x IN interval[a,b] ==> abs(f x) <= (g x))
9409        ==> abs(integral(interval[a,b]) f) <= (integral(interval[a,b]) g)``
9410  ASSUME_TAC THENL
9411   [REPEAT STRIP_TAC THEN MATCH_MP_TAC lemma THEN
9412    X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
9413    UNDISCH_TAC ``(f:real->real) integrable_on interval[a,b]`` THEN
9414    DISCH_THEN(MP_TAC o MATCH_MP INTEGRABLE_INTEGRAL) THEN
9415    FIRST_X_ASSUM(MP_TAC o MATCH_MP INTEGRABLE_INTEGRAL) THEN
9416    REWRITE_TAC[has_integral] THEN DISCH_THEN(MP_TAC o SPEC ``e / &2:real``) THEN
9417    ASM_SIMP_TAC std_ss [REAL_HALF, LEFT_IMP_EXISTS_THM] THEN
9418    X_GEN_TAC ``d1:real->real->bool`` THEN STRIP_TAC THEN
9419    DISCH_THEN(MP_TAC o SPEC ``e / &2:real``) THEN
9420    ASM_SIMP_TAC std_ss [REAL_HALF, LEFT_IMP_EXISTS_THM] THEN
9421    X_GEN_TAC ``d2:real->real->bool`` THEN
9422    DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
9423    MP_TAC(ISPECL [``d1:real->real->bool``, ``d2:real->real->bool``]
9424                  GAUGE_INTER) THEN
9425    ASM_REWRITE_TAC[] THEN
9426    DISCH_THEN(MP_TAC o MATCH_MP FINE_DIVISION_EXISTS) THEN
9427    DISCH_THEN(MP_TAC o SPECL [``a:real``, ``b:real``]) THEN
9428    SIMP_TAC std_ss [FINE_INTER, LEFT_IMP_EXISTS_THM] THEN
9429    X_GEN_TAC ``p:(real#(real->bool))->bool`` THEN STRIP_TAC THEN
9430    DISCH_THEN(MP_TAC o SPEC ``p:(real#(real->bool))->bool``) THEN
9431    FIRST_X_ASSUM(MP_TAC o SPEC ``p:(real#(real->bool))->bool``) THEN
9432    ASM_REWRITE_TAC[] THEN
9433    SIMP_TAC std_ss [REAL_LT_RDIV_EQ, REAL_ARITH ``0 < 2:real``] THEN
9434    MATCH_MP_TAC(REAL_ARITH
9435     ``abs(sg) <= dsa
9436      ==> abs(dsa - dia) * &2 < e ==> abs(sg - ig) * &2 < e
9437          ==> abs(ig) < dia + e:real``) THEN
9438    FIRST_ASSUM(ASSUME_TAC o MATCH_MP TAGGED_DIVISION_OF_FINITE) THEN
9439    ASM_SIMP_TAC std_ss [] THEN MATCH_MP_TAC SUM_ABS_LE THEN
9440    ASM_SIMP_TAC std_ss [o_DEF, FORALL_PROD] THEN
9441    MAP_EVERY X_GEN_TAC [``x:real``, ``k:real->bool``] THEN DISCH_TAC THEN
9442    REWRITE_TAC[ABS_MUL] THEN
9443    MATCH_MP_TAC REAL_LE_MUL2 THEN REWRITE_TAC[ABS_POS] THEN
9444    REWRITE_TAC[REAL_ARITH ``abs x <= x <=> &0 <= x:real``] THEN
9445    ASM_MESON_TAC[CONTENT_POS_LE, TAGGED_DIVISION_OF, SUBSET_DEF],
9446    ALL_TAC] THEN
9447  REPEAT GEN_TAC THEN REWRITE_TAC[CONJ_ASSOC] THEN
9448  DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
9449  DISCH_THEN(CONJUNCTS_THEN (fn th =>
9450     ASSUME_TAC(CONJUNCT1(ONCE_REWRITE_RULE [INTEGRABLE_ALT] th)) THEN
9451     MP_TAC(MATCH_MP INTEGRABLE_INTEGRAL th))) THEN
9452  ONCE_REWRITE_TAC[HAS_INTEGRAL] THEN
9453  DISCH_TAC THEN DISCH_TAC THEN MATCH_MP_TAC lemma THEN
9454  X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
9455  UNDISCH_TAC ``!e:real. 0 < e ==>
9456        ?B. 0 < B /\ !a b. ball (0,B) SUBSET interval [(a,b)] ==>
9457            ?z. ((\x. if x IN s then g x else 0) has_integral z)
9458                (interval [(a,b)]) /\ abs (z - integral s g) < e`` THEN DISCH_TAC THEN
9459  FIRST_X_ASSUM (MP_TAC o SPEC ``e / &2:real``) THEN
9460  FIRST_X_ASSUM(MP_TAC o SPEC ``e / &2:real``) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
9461  DISCH_THEN(X_CHOOSE_THEN ``B1:real``
9462   (CONJUNCTS_THEN2 ASSUME_TAC ASSUME_TAC)) THEN
9463  DISCH_THEN(X_CHOOSE_THEN ``B2:real``
9464   (CONJUNCTS_THEN2 ASSUME_TAC ASSUME_TAC)) THEN
9465  MP_TAC(ISPEC ``ball(0,max B1 B2:real):real->bool``
9466    BOUNDED_SUBSET_CLOSED_INTERVAL) THEN
9467  SIMP_TAC std_ss [BOUNDED_BALL, LEFT_IMP_EXISTS_THM] THEN
9468  REWRITE_TAC[BALL_MAX_UNION, UNION_SUBSET] THEN
9469  MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``] THEN
9470  DISCH_THEN(CONJUNCTS_THEN(ANTE_RES_THEN MP_TAC)) THEN
9471  DISCH_THEN(X_CHOOSE_THEN ``z:real`` (CONJUNCTS_THEN2 ASSUME_TAC
9472     (fn th => DISCH_THEN(X_CHOOSE_THEN ``w:real``
9473                (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN MP_TAC th))) THEN
9474  ASM_REWRITE_TAC[] THEN
9475  SIMP_TAC std_ss [REAL_LT_RDIV_EQ, REAL_ARITH ``0 < 2:real``] THEN
9476  MATCH_MP_TAC(REAL_ARITH
9477     ``abs(sg) <= dsa
9478      ==> abs(dsa - dia) * &2 < e ==> abs(sg - ig) * &2 < e
9479          ==> abs(ig) < dia + e:real``) THEN
9480  REPEAT(FIRST_X_ASSUM(SUBST1_TAC o SYM o MATCH_MP INTEGRAL_UNIQUE)) THEN
9481  FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN
9482  REPEAT STRIP_TAC THEN SIMP_TAC std_ss [] THEN
9483  COND_CASES_TAC THEN ASM_SIMP_TAC std_ss [ABS_0, REAL_LE_REFL]
9484QED
9485
9486Theorem INTEGRAL_ABS_BOUND_INTEGRAL_COMPONENT:
9487   !f:real->real g:real->real s.
9488        f integrable_on s /\ g integrable_on s /\
9489        (!x. x IN s ==> abs(f x) <= (g x))
9490        ==> abs(integral s f) <= (integral s g)
9491Proof
9492  REPEAT STRIP_TAC THEN
9493  MATCH_MP_TAC REAL_LE_TRANS THEN
9494  EXISTS_TAC ``(integral s ((\y. (y)) o (g:real->real)))`` THEN
9495  SUBGOAL_THEN ``linear(\y:real. (y))`` ASSUME_TAC THENL
9496   [ASM_SIMP_TAC std_ss [linear], ALL_TAC] THEN
9497  CONJ_TAC THENL
9498   [MATCH_MP_TAC INTEGRAL_ABS_BOUND_INTEGRAL THEN
9499    ASM_SIMP_TAC std_ss [o_THM] THEN MATCH_MP_TAC INTEGRABLE_LINEAR THEN
9500    ASM_SIMP_TAC std_ss [], ALL_TAC] THEN
9501  SUBGOAL_THEN
9502   ``integral s ((\y. (y)) o (g:real->real)) =
9503        (\y. (y)) (integral s g)``
9504  SUBST1_TAC THENL
9505   [MATCH_MP_TAC INTEGRAL_LINEAR THEN ASM_REWRITE_TAC[],
9506    SIMP_TAC std_ss [REAL_LE_REFL]]
9507QED
9508
9509Theorem HAS_INTEGRAL_ABS_BOUND_INTEGRAL_COMPONENT:
9510   !f:real->real g:real->real s i j.
9511        (f has_integral i) s /\ (g has_integral j) s /\
9512        (!x. x IN s ==> abs(f x) <= (g x))
9513        ==> abs(i) <= j
9514Proof
9515  REPEAT STRIP_TAC THEN
9516  REPEAT(FIRST_X_ASSUM(fn th =>
9517   SUBST1_TAC(SYM(MATCH_MP INTEGRAL_UNIQUE th)) THEN
9518   ASSUME_TAC(MATCH_MP HAS_INTEGRAL_INTEGRABLE th))) THEN
9519  MATCH_MP_TAC INTEGRAL_ABS_BOUND_INTEGRAL_COMPONENT THEN
9520  ASM_SIMP_TAC std_ss []
9521QED
9522
9523Theorem lemma[local]:
9524     !f:real->real g.
9525          (!a b. f integrable_on interval[a,b]) /\
9526          (!x. abs(f x) <= (g x)) /\
9527          g integrable_on univ(:real)
9528          ==> f integrable_on univ(:real)
9529Proof
9530    REPEAT GEN_TAC THEN
9531    REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
9532    ONCE_REWRITE_TAC[INTEGRABLE_ALT_SUBSET] THEN
9533    ASM_SIMP_TAC std_ss [IN_UNIV, ETA_AX] THEN
9534    DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
9535    DISCH_TAC THEN GEN_TAC THEN POP_ASSUM (MP_TAC o SPEC ``e:real``) THEN
9536    ASM_CASES_TAC ``&0 < e:real`` THEN ASM_REWRITE_TAC[] THEN
9537    DISCH_THEN (X_CHOOSE_TAC ``B:real``) THEN EXISTS_TAC ``B:real`` THEN
9538    POP_ASSUM MP_TAC THEN MATCH_MP_TAC MONO_AND THEN REWRITE_TAC[] THEN
9539    DISCH_TAC THEN REPEAT GEN_TAC THEN
9540    POP_ASSUM (MP_TAC o SPECL [``a:real``,``b:real``,``c:real``,``d:real``]) THEN
9541    DISCH_THEN(fn th => STRIP_TAC THEN MP_TAC th) THEN ASM_REWRITE_TAC[] THEN
9542    MATCH_MP_TAC(REAL_ARITH ``a <= b ==> b < c ==> a < c:real``) THEN
9543    ONCE_REWRITE_TAC[ABS_SUB] THEN
9544    ASM_SIMP_TAC std_ss [GSYM INTEGRAL_DIFF, NEGLIGIBLE_EMPTY,
9545     METIS [SUBSET_DEF, IN_DIFF, NOT_IN_EMPTY, EXTENSION]
9546      ``s SUBSET t ==> (s DIFF t = {})``] THEN
9547    SIMP_TAC std_ss [] THEN
9548    MATCH_MP_TAC(REAL_ARITH ``x <= y ==> x <= abs y:real``) THEN
9549    MATCH_MP_TAC INTEGRAL_ABS_BOUND_INTEGRAL THEN
9550    METIS_TAC[integrable_on, HAS_INTEGRAL_DIFF, NEGLIGIBLE_EMPTY,
9551                 SET_RULE ``s SUBSET t ==> (s DIFF t = {})``]
9552QED
9553
9554Theorem INTEGRABLE_ON_ALL_INTERVALS_INTEGRABLE_BOUND:
9555   !f:real->real g s.
9556        (!a b. (\x. if x IN s then f x else 0)
9557               integrable_on interval[a,b]) /\
9558        (!x. x IN s ==> abs(f x) <= (g x)) /\
9559        g integrable_on s
9560        ==> f integrable_on s
9561Proof
9562  REPEAT GEN_TAC THEN
9563  REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
9564  ONCE_REWRITE_TAC[GSYM INTEGRABLE_RESTRICT_UNIV] THEN
9565  DISCH_TAC THEN MATCH_MP_TAC lemma THEN
9566  EXISTS_TAC ``(\x. if x IN s then g x else 0):real->real`` THEN
9567  ASM_SIMP_TAC std_ss [] THEN
9568  GEN_TAC THEN COND_CASES_TAC THEN ASM_SIMP_TAC std_ss [ABS_0, REAL_POS]
9569QED
9570
9571(* ------------------------------------------------------------------------- *)
9572(* Explicit limit statement for integrals over [0,inf].                      *)
9573(* ------------------------------------------------------------------------- *)
9574
9575Theorem HAS_INTEGRAL_LIM_AT_POSINFINITY :
9576    !f l:real.
9577        (f has_integral l) {t | &0 <= t} <=>
9578        (!a. f integrable_on interval[0,a]) /\
9579        ((\a. integral (interval[0,a]) f) --> l) at_posinfinity
9580Proof
9581  REPEAT GEN_TAC THEN
9582  GEN_REWR_TAC LAND_CONV [HAS_INTEGRAL_ALT] THEN
9583  SIMP_TAC std_ss [INTEGRAL_RESTRICT_INTER, INTEGRABLE_RESTRICT_INTER] THEN
9584  SUBGOAL_THEN
9585   ``!a b. {t | &0 <= t} INTER interval[a,b] =
9586          interval[(max (&0) (a:real)),b]``
9587   (fn th => REWRITE_TAC[th])
9588  THENL
9589   [SIMP_TAC std_ss [EXTENSION, IN_INTER, IN_INTERVAL, GSPECIFICATION, max_def] THEN
9590    rpt GEN_TAC >> EQ_TAC >> Cases_on `0 <= a` >> rw [] \\
9591    REAL_ASM_ARITH_TAC,
9592    ALL_TAC] THEN
9593  REWRITE_TAC[LIM_AT_POSINFINITY, dist, real_ge] THEN
9594  EQ_TAC THEN STRIP_TAC THEN CONJ_TAC THENL (* 4 subgoals *)
9595  [ (* goal 1 (of 4) *)
9596    X_GEN_TAC ``a:real`` THEN
9597    FIRST_X_ASSUM(MP_TAC o SPECL [``0:real``, ``a:real``]) THEN
9598    REWRITE_TAC[REAL_MAX_REFL],
9599    (* goal 2 (of 4) *)
9600    X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
9601    FIRST_X_ASSUM(MP_TAC o SPEC ``e:real``) THEN ASM_SIMP_TAC std_ss [] THEN
9602    DISCH_THEN (X_CHOOSE_TAC ``B:real``) THEN EXISTS_TAC ``B:real`` THEN
9603    POP_ASSUM MP_TAC THEN
9604    DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC ASSUME_TAC) THEN
9605    X_GEN_TAC ``b:real`` THEN DISCH_TAC THEN
9606    UNDISCH_TAC `` !a b:real.
9607        ball (0,B) SUBSET interval [(a,b)] ==>
9608        abs (integral (interval [(max 0 a,b)]) f - l) < e`` THEN DISCH_TAC THEN
9609    FIRST_X_ASSUM (MP_TAC o SPECL [``(-b:real)``, ``b:real``]) THEN
9610    REWRITE_TAC[] THEN
9611    SUBGOAL_THEN ``max (&0) (-b) = &0:real`` SUBST1_TAC THENL
9612    [ Suff `-b <= 0` >- rw [REAL_MAX_ALT] >> rw [] \\
9613      MATCH_MP_TAC REAL_LT_IMP_LE \\
9614      MATCH_MP_TAC REAL_LTE_TRANS \\
9615      Q.EXISTS_TAC `B` >> art [], SIMP_TAC std_ss []] THEN
9616    DISCH_THEN MATCH_MP_TAC THEN
9617    REWRITE_TAC[BALL, SUBSET_INTERVAL] THEN POP_ASSUM MP_TAC THEN
9618    POP_ASSUM MP_TAC THEN REAL_ARITH_TAC,
9619    (* goal 3 (of 4) *)
9620    MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``] THEN
9621    UNDISCH_TAC ``!a. f integrable_on interval [(0,a)]`` THEN DISCH_TAC THEN
9622    FIRST_X_ASSUM(MP_TAC o SPEC ``b:real``) THEN
9623    MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] INTEGRABLE_SUBINTERVAL) THEN
9624    SIMP_TAC std_ss [SUBSET_INTERVAL, REAL_LE_REFL] THEN
9625    rw [REAL_MAX_LE, REAL_LE_MAX],
9626    (* goal 4 (of 4) *)
9627    X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
9628    FIRST_X_ASSUM(MP_TAC o SPEC ``e:real``) THEN ASM_REWRITE_TAC[] THEN
9629    DISCH_THEN(X_CHOOSE_THEN ``B:real`` ASSUME_TAC) THEN
9630    EXISTS_TAC ``abs B + &1:real`` THEN
9631    STRONG_CONJ_TAC (* 0 < abs B + 1 *)
9632    >- (`0 <= abs B` by PROVE_TAC [ABS_POS] >> POP_ASSUM MP_TAC \\
9633        REAL_ARITH_TAC) \\
9634    DISCH_TAC \\
9635    MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``] THEN
9636    SIMP_TAC std_ss [BALL, SUBSET_INTERVAL] THEN STRIP_TAC THEN
9637    (* stage work *)
9638    POP_ASSUM MP_TAC \\
9639    Know `0 - (abs B + 1) < 0 + (abs B + 1)`
9640    >- (rw [] >> Q.PAT_X_ASSUM `0 < abs B + 1` MP_TAC \\
9641        REAL_ARITH_TAC) >> rw [] \\
9642    Know `max (&0) (a) = &0:real`
9643    >- (Suff `a <= 0` >- rw [REAL_MAX_ALT] \\
9644        MATCH_MP_TAC REAL_LE_TRANS \\
9645        Q.EXISTS_TAC `-(abs B + 1)` >> art [] \\
9646        MATCH_MP_TAC REAL_LT_IMP_LE \\
9647        Q.PAT_X_ASSUM `0 < abs B + 1` MP_TAC \\
9648        REAL_ARITH_TAC) >> Rewr' \\
9649    fs [] >> FIRST_X_ASSUM MATCH_MP_TAC \\
9650    POP_ASSUM MP_TAC \\
9651    REAL_ARITH_TAC ]
9652QED
9653
9654Theorem FLOOR_POS:
9655   !x. &0 <= x ==> (?n. flr x = &n)
9656Proof
9657  GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC [NUM_FLOOR_def] THEN
9658  METIS_TAC []
9659QED
9660
9661Theorem HAS_INTEGRAL_LIM_SEQUENTIALLY :
9662    !f:real->real l.
9663           (f --> 0) at_posinfinity /\
9664           (!n. f integrable_on interval[0,&n]) /\
9665           ((\n:num. (integral (interval[0,&n]) f)) --> l) sequentially
9666           ==> (f has_integral l) {t | &0 <= t}
9667Proof
9668  REPEAT STRIP_TAC THEN
9669  ONCE_REWRITE_TAC[HAS_INTEGRAL_LIM_AT_POSINFINITY] THEN
9670  MATCH_MP_TAC(TAUT `p /\ (p ==> q) ==> p /\ q`) THEN CONJ_TAC THENL
9671   [X_GEN_TAC ``a:real`` THEN MP_TAC(SPEC ``a:real`` SIMP_REAL_ARCH) THEN
9672    DISCH_THEN(X_CHOOSE_TAC ``n:num``) THEN
9673    FIRST_X_ASSUM(MP_TAC o SPEC ``n:num``) THEN
9674    MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] INTEGRABLE_SUBINTERVAL) THEN
9675    REWRITE_TAC[SUBSET_INTERVAL, REAL_LE_REFL] THEN rw [],
9676    DISCH_TAC] THEN
9677  REWRITE_TAC[LIM_AT_POSINFINITY, real_ge] THEN
9678  X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
9679  UNDISCH_TAC ``(f --> 0) at_posinfinity`` THEN DISCH_TAC THEN
9680  FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [LIM_AT_POSINFINITY]) THEN
9681  DISCH_THEN(MP_TAC o SPEC ``e / &2:real``) THEN
9682  ASM_REWRITE_TAC[REAL_HALF, o_THM, real_ge] THEN
9683  SIMP_TAC std_ss [DIST_0, LEFT_IMP_EXISTS_THM] THEN
9684  X_GEN_TAC ``B:real`` THEN DISCH_TAC THEN
9685  UNDISCH_TAC ``((\n. integral (interval [(0,&n)]) f) --> l) sequentially`` THEN
9686  DISCH_TAC THEN
9687  FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [LIM_SEQUENTIALLY]) THEN
9688  DISCH_THEN(MP_TAC o SPEC ``e / &2:real``) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
9689  DISCH_THEN(X_CHOOSE_TAC ``N:num``) THEN EXISTS_TAC ``max (&N) B + &1:real`` THEN
9690  X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN MP_TAC(SPEC ``x:real`` FLOOR_POS) THEN
9691  KNOW_TAC ``0 <= x:real`` THENL
9692  [POP_ASSUM (MP_TAC o REWRITE_RULE [max_def]) THEN COND_CASES_TAC THEN STRIP_TAC THENL
9693   [MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC ``B + 1:real`` THEN
9694    ASM_REWRITE_TAC [] THEN MATCH_MP_TAC REAL_LE_TRANS THEN
9695    EXISTS_TAC ``B:real`` THEN REWRITE_TAC [REAL_ARITH ``B <= B + 1:real``] THEN
9696    MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC ``&N:real`` THEN
9697    ASM_REWRITE_TAC [REAL_POS], MATCH_MP_TAC REAL_LE_TRANS THEN
9698    EXISTS_TAC ``&N + 1:real`` THEN ASM_REWRITE_TAC [] THEN
9699    MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC ``&N:real`` THEN
9700    ASM_REWRITE_TAC [REAL_POS] THEN REAL_ARITH_TAC],
9701    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
9702  DISCH_THEN(X_CHOOSE_TAC ``n:num``) THEN
9703  SUBGOAL_THEN
9704   ``integral(interval[0,x]) (f:real->real) =
9705     integral(interval[0,&n]) f + integral(interval[&n,x]) f``
9706  SUBST1_TAC THENL
9707   [CONV_TAC SYM_CONV THEN MATCH_MP_TAC INTEGRAL_COMBINE THEN
9708    ASM_REWRITE_TAC[REAL_POS] THEN
9709    POP_ASSUM (MP_TAC o REWRITE_RULE [GSYM REAL_OF_NUM_EQ] o SYM) THEN
9710    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN MATCH_MP_TAC NUM_FLOOR_LE THEN
9711    UNDISCH_TAC ``max (&N) B + 1 <= x:real`` THEN REWRITE_TAC [max_def] THEN
9712    COND_CASES_TAC THEN STRIP_TAC THENL [MATCH_MP_TAC REAL_LE_TRANS THEN
9713    EXISTS_TAC ``B + 1:real`` THEN
9714    ASM_REWRITE_TAC [] THEN MATCH_MP_TAC REAL_LE_TRANS THEN
9715    EXISTS_TAC ``B:real`` THEN REWRITE_TAC [REAL_ARITH ``B <= B + 1:real``] THEN
9716    MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC ``&N:real`` THEN
9717    ASM_REWRITE_TAC [REAL_POS], MATCH_MP_TAC REAL_LE_TRANS THEN
9718    EXISTS_TAC ``&N + 1:real`` THEN ASM_REWRITE_TAC [] THEN
9719    MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC ``&N:real`` THEN
9720    ASM_REWRITE_TAC [REAL_POS] THEN REAL_ARITH_TAC],
9721    ALL_TAC] THEN
9722  GEN_REWR_TAC RAND_CONV [GSYM REAL_HALF] THEN REWRITE_TAC [dist] THEN
9723  MATCH_MP_TAC(REAL_ARITH
9724   ``abs(a:real - l) < e / &2 /\ abs b <= e / &2 ==>
9725     abs(a + b - l) < e / 2 + e / 2:real``) THEN
9726  REWRITE_TAC [GSYM dist] THEN CONJ_TAC THENL
9727   [FULL_SIMP_TAC std_ss [] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
9728    REWRITE_TAC[GSYM REAL_OF_NUM_LE] THEN
9729    POP_ASSUM (MP_TAC o REWRITE_RULE [GSYM REAL_OF_NUM_EQ] o SYM) THEN
9730    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN KNOW_TAC ``0 <= x:real`` THENL
9731    [UNDISCH_TAC ``max (&N) B + 1 <= x:real`` THEN REWRITE_TAC [max_def] THEN
9732     COND_CASES_TAC THEN STRIP_TAC THENL
9733     [MATCH_MP_TAC REAL_LE_TRANS THEN
9734      EXISTS_TAC ``B + 1:real`` THEN
9735      ASM_REWRITE_TAC [] THEN MATCH_MP_TAC REAL_LE_TRANS THEN
9736      EXISTS_TAC ``B:real`` THEN REWRITE_TAC [REAL_ARITH ``B <= B + 1:real``] THEN
9737      MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC ``&N:real`` THEN
9738      ASM_REWRITE_TAC [REAL_POS], MATCH_MP_TAC REAL_LE_TRANS THEN
9739      EXISTS_TAC ``&N + 1:real`` THEN ASM_REWRITE_TAC [] THEN
9740      MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC ``&N:real`` THEN
9741      ASM_REWRITE_TAC [REAL_POS] THEN REAL_ARITH_TAC],
9742     DISCH_TAC THEN ASM_SIMP_TAC std_ss [REAL_OF_NUM_LE, NUM_FLOOR_LE2]] THEN
9743     UNDISCH_TAC ``max (&N) B + 1 <= x:real`` THEN REWRITE_TAC [max_def] THEN
9744     Cases_on `&N <= B` >> rw []
9745     >- (MATCH_MP_TAC REAL_LE_TRANS >> Q.EXISTS_TAC `B` >> art [] \\
9746         POP_ASSUM MP_TAC >> REAL_ARITH_TAC) \\
9747     `B < &N` by PROVE_TAC [real_lte] \\
9748     MATCH_MP_TAC REAL_LE_TRANS >> Q.EXISTS_TAC `&(N + 1)` >> art [] \\
9749     fs [], ALL_TAC] THEN
9750  MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC
9751    ``(integral(interval[&n:real,x]) (\x. (e / &2)))`` THEN
9752  CONJ_TAC THENL
9753   [MATCH_MP_TAC INTEGRAL_ABS_BOUND_INTEGRAL THEN
9754    ASM_REWRITE_TAC[INTEGRABLE_CONST, IN_INTERVAL] THEN
9755    CONJ_TAC THENL
9756     [MATCH_MP_TAC INTEGRABLE_ON_SUBINTERVAL THEN
9757      EXISTS_TAC ``interval[0:real,x]`` THEN
9758      ASM_REWRITE_TAC[SUBSET_INTERVAL] THEN REWRITE_TAC [REAL_LE_REFL, REAL_POS],
9759      REPEAT STRIP_TAC THEN
9760      MATCH_MP_TAC REAL_LT_IMP_LE THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
9761      UNDISCH_TAC ``max (&N) B + 1 <= x:real`` THEN REWRITE_TAC [max_def] THEN
9762      COND_CASES_TAC THEN STRIP_TAC THENL
9763      [MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC ``x - 1:real`` THEN
9764       CONJ_TAC THENL [POP_ASSUM MP_TAC THEN REAL_ARITH_TAC, ALL_TAC] THEN
9765       MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC ``&n:real`` THEN
9766       ASM_REWRITE_TAC [] THEN
9767       MATCH_MP_TAC (REAL_ARITH ``x < b + 1 ==> (x - 1 <= b:real)``) THEN
9768       REWRITE_TAC [GSYM NUM_FLOOR_LET] THEN ASM_SIMP_TAC std_ss [REAL_LE_LT],
9769       FULL_SIMP_TAC std_ss [REAL_NOT_LE] THEN MATCH_MP_TAC REAL_LE_TRANS THEN
9770       EXISTS_TAC ``&n:real`` THEN ASM_REWRITE_TAC [] THEN
9771       MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC ``&N:real`` THEN
9772       ASM_REWRITE_TAC [REAL_LE_LT] THEN SIMP_TAC real_ss [GSYM REAL_LE_LT] THEN
9773       UNDISCH_TAC ``flr x = n:num`` THEN DISCH_THEN
9774        (fn th => REWRITE_TAC [ONCE_REWRITE_RULE [EQ_SYM_EQ] th]) THEN
9775       KNOW_TAC ``0 <= x:real`` THENL
9776       [MATCH_MP_TAC REAL_LE_TRANS THEN
9777        EXISTS_TAC ``&N + 1:real`` THEN ASM_REWRITE_TAC [] THEN
9778        MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC ``&N:real`` THEN
9779        ASM_REWRITE_TAC [REAL_POS] THEN REAL_ARITH_TAC, DISCH_TAC] THEN
9780       ASM_SIMP_TAC std_ss [NUM_FLOOR_LE2] THEN UNDISCH_TAC ``&N + 1 <= x:real`` THEN
9781       REAL_ARITH_TAC]],
9782     REWRITE_TAC[INTEGRAL_CONST] THEN KNOW_TAC ``0 <= x:real`` THENL
9783     [UNDISCH_TAC ``max (&N) B + 1 <= x:real`` THEN REWRITE_TAC [max_def] THEN
9784      COND_CASES_TAC THEN STRIP_TAC THENL
9785      [MATCH_MP_TAC REAL_LE_TRANS THEN
9786       EXISTS_TAC ``B + 1:real`` THEN
9787       ASM_REWRITE_TAC [] THEN MATCH_MP_TAC REAL_LE_TRANS THEN
9788       EXISTS_TAC ``B:real`` THEN REWRITE_TAC [REAL_ARITH ``B <= B + 1:real``] THEN
9789       MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC ``&N:real`` THEN
9790       ASM_REWRITE_TAC [REAL_POS], MATCH_MP_TAC REAL_LE_TRANS THEN
9791       EXISTS_TAC ``&N + 1:real`` THEN ASM_REWRITE_TAC [] THEN
9792       MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC ``&N:real`` THEN
9793       ASM_REWRITE_TAC [REAL_POS] THEN REAL_ARITH_TAC], DISCH_TAC] THEN
9794    FIRST_ASSUM (MP_TAC o MATCH_MP NUM_FLOOR_LE) THEN
9795    RULE_ASSUM_TAC (REWRITE_RULE [GSYM REAL_OF_NUM_EQ]) THEN ASM_REWRITE_TAC [] THEN
9796    DISCH_TAC THEN ASM_SIMP_TAC real_ss [CONTENT_CLOSED_INTERVAL] THEN
9797    GEN_REWR_TAC RAND_CONV [GSYM REAL_MUL_LID] THEN
9798    MATCH_MP_TAC REAL_LE_RMUL_IMP THEN ASM_REWRITE_TAC [REAL_HALF, REAL_LE_LT] THEN
9799    REWRITE_TAC [GSYM REAL_LE_LT] THEN
9800    MATCH_MP_TAC (REAL_ARITH ``x < &n + 1 ==> x - &n <= 1:real``) THEN
9801    REWRITE_TAC [GSYM NUM_FLOOR_LET] THEN REWRITE_TAC [GSYM REAL_OF_NUM_LE] THEN
9802    ASM_SIMP_TAC std_ss [REAL_LE_LT]]
9803QED
9804
9805(* ------------------------------------------------------------------------- *)
9806(* Interval functions of bounded variation on a set.                         *)
9807(* ------------------------------------------------------------------------- *)
9808
9809val _ = set_fixity "has_bounded_setvariation_on" (Infix(NONASSOC, 450));
9810
9811Definition set_variation[nocompute]:
9812 set_variation s (f:(real->bool)->real) =
9813        sup { sum d (\k. abs(f k)) | ?t. d division_of t /\ t SUBSET s}
9814End
9815
9816Definition has_bounded_setvariation_on[nocompute]:
9817  (f:(real->bool)->real) has_bounded_setvariation_on s <=>
9818        ?B. !d t. d division_of t /\ t SUBSET s
9819                  ==> sum d (\k. abs(f k)) <= B
9820End
9821
9822Theorem HAS_BOUNDED_SETVARIATION_ON:
9823   !f:(real->bool)->real s.
9824        f  has_bounded_setvariation_on s <=>
9825        ?B. &0 < B /\ !d t. d division_of t /\ t SUBSET s
9826                            ==> sum d (\k. abs(f k)) <= B
9827Proof
9828  REWRITE_TAC[has_bounded_setvariation_on] THEN
9829  MESON_TAC[REAL_ARITH ``&0 < abs B + &1 /\ (x <= B ==> x <= abs B + &1:real)``]
9830QED
9831
9832Theorem HAS_BOUNDED_SETVARIATION_ON_EQ:
9833   !f g:(real->bool)->real s.
9834        (!a b. ~(interval[a,b] = {}) /\ interval[a,b] SUBSET s
9835               ==> (f(interval[a,b]) = g(interval[a,b]))) /\
9836        f has_bounded_setvariation_on s
9837        ==> g has_bounded_setvariation_on s
9838Proof
9839  REPEAT GEN_TAC THEN
9840  DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
9841  REWRITE_TAC[has_bounded_setvariation_on] THEN
9842  DISCH_THEN (X_CHOOSE_TAC ``B:real``) THEN EXISTS_TAC ``B:real`` THEN
9843  POP_ASSUM MP_TAC THEN DISCH_TAC THEN GEN_TAC THEN GEN_TAC THEN
9844  POP_ASSUM (MP_TAC o SPECL [``d:(real->bool)->bool``,``t:real->bool``]) THEN
9845  DISCH_THEN(fn th => STRIP_TAC THEN MP_TAC th) THEN ASM_REWRITE_TAC[] THEN
9846  MATCH_MP_TAC(REAL_ARITH ``(x = y) ==> x <= B ==> y <= B:real``) THEN
9847  MATCH_MP_TAC SUM_EQ THEN UNDISCH_TAC ``d division_of t`` THEN
9848  DISCH_TAC THEN FIRST_ASSUM(fn th =>
9849  ONCE_REWRITE_TAC [MATCH_MP FORALL_IN_DIVISION_NONEMPTY th]) THEN
9850  REPEAT STRIP_TAC THEN SIMP_TAC std_ss [] THEN AP_TERM_TAC THEN
9851  METIS_TAC[division_of, SUBSET_TRANS]
9852QED
9853
9854Theorem SET_VARIATION_EQ:
9855   !f g:(real->bool)->real s.
9856        (!a b. ~(interval[a,b] = {}) /\ interval[a,b] SUBSET s
9857               ==> (f(interval[a,b]) = g(interval[a,b])))
9858        ==> (set_variation s f = set_variation s g)
9859Proof
9860  REPEAT STRIP_TAC THEN REWRITE_TAC[set_variation] THEN AP_TERM_TAC THEN
9861  ONCE_REWRITE_TAC [METIS []
9862   ``{sum d (\k. abs (f k)) | ?t. d division_of t /\ t SUBSET s} =
9863     {(\d. sum d (\k. abs (f k))) d | (\d. ?t. d division_of t /\ t SUBSET s) d}``] THEN
9864  MATCH_MP_TAC(SET_RULE
9865   ``(!x. P x ==> (f x = g x)) ==> ({f x | P x} = {g x | P x})``) THEN
9866  X_GEN_TAC ``d:(real->bool)->bool`` THEN SIMP_TAC std_ss [] THEN
9867  DISCH_THEN(X_CHOOSE_THEN ``t:real->bool`` STRIP_ASSUME_TAC) THEN
9868  MATCH_MP_TAC SUM_EQ THEN UNDISCH_TAC ``d division_of t`` THEN
9869  DISCH_TAC THEN FIRST_ASSUM(fn th =>
9870  ONCE_REWRITE_TAC [MATCH_MP FORALL_IN_DIVISION_NONEMPTY th]) THEN
9871  REPEAT STRIP_TAC THEN SIMP_TAC std_ss [] THEN AP_TERM_TAC THEN
9872  METIS_TAC[division_of, SUBSET_TRANS]
9873QED
9874
9875Theorem HAS_BOUNDED_SETVARIATION_ON_COMPONENTWISE:
9876   !f:(real->bool)->real s.
9877        f has_bounded_setvariation_on s <=>
9878            (\k. f k) has_bounded_setvariation_on s
9879Proof
9880  METIS_TAC []
9881QED
9882
9883Theorem HAS_BOUNDED_SETVARIATION_COMPARISON:
9884   !f:(real->bool)->real g:(real->bool)->real s.
9885        f has_bounded_setvariation_on s /\
9886        (!a b. ~(interval[a,b] = {}) /\ interval[a,b] SUBSET s
9887               ==> abs(g(interval[a,b])) <= abs(f(interval[a,b])))
9888        ==> g has_bounded_setvariation_on s
9889Proof
9890  REPEAT GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
9891  REWRITE_TAC[has_bounded_setvariation_on] THEN
9892  DISCH_THEN (X_CHOOSE_TAC ``B:real``) THEN EXISTS_TAC ``B:real`` THEN
9893  GEN_TAC THEN GEN_TAC THEN POP_ASSUM (MP_TAC o SPECL
9894   [``d:(real -> bool) -> bool``,``t:real -> bool``]) THEN
9895  DISCH_THEN(fn th => STRIP_TAC THEN MP_TAC th) THEN
9896  ASM_REWRITE_TAC[] THEN
9897  MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] REAL_LE_TRANS) THEN
9898  MATCH_MP_TAC SUM_LE THEN
9899  CONJ_TAC THENL [ASM_MESON_TAC[division_of], ALL_TAC] THEN
9900  SIMP_TAC std_ss [] THEN METIS_TAC[division_of, SUBSET_TRANS]
9901QED
9902
9903Theorem HAS_BOUNDED_SETVARIATION_ON_ABS:
9904  !f:(real->bool)->real s.
9905    (\x. (abs(f x))) has_bounded_setvariation_on s <=>
9906    f has_bounded_setvariation_on s
9907Proof
9908  REWRITE_TAC[has_bounded_setvariation_on] THEN
9909  SIMP_TAC std_ss [ABS_ABS]
9910QED
9911
9912Theorem SETVARIATION_EQUAL_LEMMA:
9913   !mf:((real->bool)->real)->((real->bool)->real) ms ms'.
9914        (!s. (ms'(ms s) = s) /\ (ms(ms' s) = s)) /\
9915        (!f a b. ~(interval[a,b] = {})
9916                 ==> (mf f (ms (interval[a,b])) = f (interval[a,b])) /\
9917                     ?a' b'. ~(interval[a',b'] = {}) /\
9918                             (ms' (interval[a,b]) = interval[a',b'])) /\
9919        (!t u. t SUBSET u ==> ms t SUBSET ms u /\ ms' t SUBSET ms' u) /\
9920        (!d t. d division_of t
9921               ==> (IMAGE ms d) division_of ms t /\
9922                   (IMAGE ms' d) division_of ms' t)
9923   ==> (!f s. (mf f) has_bounded_setvariation_on (ms s) <=>
9924              f has_bounded_setvariation_on s) /\
9925       (!f s. set_variation (ms s) (mf f) = set_variation s f)
9926Proof
9927  REPEAT GEN_TAC THEN STRIP_TAC THEN
9928  REWRITE_TAC[has_bounded_setvariation_on, set_variation] THEN
9929  KNOW_TAC `` ((!(f :(real -> bool) -> real) (s :real -> bool).
9930  ({sum d (\(k :real -> bool). abs (mf f k)) |
9931     ?(t :real -> bool). d division_of t /\ t SUBSET ms s} =
9932   {sum d (\(k :real -> bool). abs (f k)) |
9933     ?(t :real -> bool). d division_of t /\ t SUBSET s})) ==>
9934  (!(f :(real -> bool) -> real) (s :real -> bool).
9935   (?(B :real).
9936      !(d :(real -> bool) -> bool) (t :real -> bool).
9937        d division_of t /\
9938        t SUBSET (ms :(real -> bool) -> real -> bool) s ==>
9939        sum d (\(k :real -> bool).
9940         abs ((mf :((real->bool)->real)->(real->bool)->real) f k)) <= B) <=>
9941   ?(B :real).
9942     !(d :(real -> bool) -> bool) (t :real -> bool).
9943       d division_of t /\ t SUBSET s ==>
9944       sum d (\(k :real -> bool). abs (f k)) <= B)) /\
9945  (!(f :(real -> bool) -> real) (s :real -> bool).
9946  ({sum d (\(k :real -> bool). abs (mf f k)) |
9947     ?(t :real -> bool). d division_of t /\ t SUBSET ms s} =
9948   {sum d (\(k :real -> bool). abs (f k)) |
9949     ?(t :real -> bool). d division_of t /\ t SUBSET s}))`` THENL
9950  [ALL_TAC, METIS_TAC []] THEN CONJ_TAC THENL
9951   [SIMP_TAC std_ss [EXTENSION, GSPECIFICATION] THEN
9952    METIS_TAC [], ALL_TAC] THEN
9953  SIMP_TAC std_ss [EXTENSION, GSPECIFICATION] THEN REPEAT GEN_TAC THEN EQ_TAC THEN
9954  STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ONCE_REWRITE_TAC [CONJ_SYM] THENL
9955   [EXISTS_TAC ``IMAGE (ms':(real->bool)->real->bool) d``,
9956    EXISTS_TAC ``IMAGE (ms:(real->bool)->real->bool) d``] THENL
9957  [CONJ_TAC THENL [METIS_TAC[], ALL_TAC] THEN
9958   W(MP_TAC o PART_MATCH (lhand o rand) SUM_IMAGE o rand o snd) THEN
9959   KNOW_TAC ``(!(x :real -> bool) (y :real -> bool).
9960    x IN (d :(real -> bool) -> bool) /\ y IN d /\
9961    ((ms' :(real -> bool) -> real -> bool) x = ms' y) ==>
9962    (x = y))`` THENL
9963    [ASM_MESON_TAC[], DISCH_TAC THEN ASM_REWRITE_TAC [] THEN
9964     POP_ASSUM K_TAC THEN DISCH_THEN SUBST1_TAC],
9965    CONJ_TAC THENL [METIS_TAC[], ALL_TAC] THEN
9966   W(MP_TAC o PART_MATCH (lhand o rand) SUM_IMAGE o rand o snd) THEN
9967   KNOW_TAC ``(!(x :real -> bool) (y :real -> bool).
9968    x IN (d :(real -> bool) -> bool) /\ y IN d /\
9969    ((ms :(real -> bool) -> real -> bool) x = ms y) ==>
9970    (x = y))`` THENL
9971    [ASM_MESON_TAC[], DISCH_TAC THEN ASM_REWRITE_TAC [] THEN
9972     POP_ASSUM K_TAC THEN DISCH_THEN SUBST1_TAC]] THEN
9973  MATCH_MP_TAC SUM_EQ THEN REWRITE_TAC[o_THM] THEN
9974  UNDISCH_TAC ``d division_of t`` THEN DISCH_TAC THEN FIRST_ASSUM
9975   (fn th => SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION_NONEMPTY th]) THEN
9976  MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``] THEN STRIP_TAC THEN
9977  AP_TERM_TAC THEN ASM_SIMP_TAC std_ss [] THEN
9978  SUBGOAL_THEN ``?a' b':real. ~(interval[a',b'] = {}) /\
9979                        (ms' (interval[a:real,b]) = interval[a',b'])``
9980  STRIP_ASSUME_TAC THENL [ASM_MESON_TAC[], ALL_TAC] THEN
9981  ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]
9982QED
9983
9984Theorem HAS_BOUNDED_SETVARIATION_ON_ELEMENTARY:
9985   !f:(real->bool)->real s.
9986        (?d. d division_of s)
9987        ==> (f has_bounded_setvariation_on s <=>
9988             ?B. !d. d division_of s ==> sum d (\k. abs(f k)) <= B)
9989Proof
9990  REPEAT GEN_TAC THEN DISCH_TAC THEN
9991  REWRITE_TAC[has_bounded_setvariation_on] THEN EQ_TAC THEN
9992  DISCH_THEN (X_CHOOSE_TAC ``B:real``) THEN EXISTS_TAC ``B:real`` THEN
9993  POP_ASSUM MP_TAC THENL [MESON_TAC[SUBSET_REFL], ALL_TAC] THEN
9994  DISCH_TAC THEN
9995  MAP_EVERY X_GEN_TAC [``d:(real->bool)->bool``, ``t:real->bool``] THEN
9996  STRIP_TAC THEN FIRST_X_ASSUM(X_CHOOSE_TAC ``d':(real->bool)->bool``) THEN
9997  MP_TAC(ISPECL [``d:(real->bool)->bool``, ``d':(real->bool)->bool``,
9998             ``t:real->bool``, ``s:real->bool``] PARTIAL_DIVISION_EXTEND) THEN
9999  ASM_REWRITE_TAC[] THEN
10000  DISCH_THEN(X_CHOOSE_TAC ``d'':(real->bool)->bool``) THEN
10001  MATCH_MP_TAC REAL_LE_TRANS THEN
10002  EXISTS_TAC ``sum d'' (\k:real->bool. abs(f k:real))`` THEN
10003  ASM_SIMP_TAC std_ss [] THEN MATCH_MP_TAC SUM_SUBSET_SIMPLE THEN
10004  ASM_SIMP_TAC std_ss [ABS_POS] THEN ASM_MESON_TAC[DIVISION_OF_FINITE]
10005QED
10006
10007Theorem HAS_BOUNDED_SETVARIATION_ON_INTERVAL:
10008   !f:(real->bool)->real a b.
10009        f has_bounded_setvariation_on interval[a,b] <=>
10010        ?B. !d. d division_of interval[a,b] ==> sum d (\k. abs(f k)) <= B
10011Proof
10012  REPEAT GEN_TAC THEN MATCH_MP_TAC HAS_BOUNDED_SETVARIATION_ON_ELEMENTARY THEN
10013  REWRITE_TAC[ELEMENTARY_INTERVAL]
10014QED
10015
10016Theorem HAS_BOUNDED_SETVARIATION_ON_UNIV:
10017   !f:(real->bool)->real.
10018        f has_bounded_setvariation_on univ(:real) <=>
10019        ?B. !d. d division_of BIGUNION d ==> sum d (\k. abs(f k)) <= B
10020Proof
10021  REPEAT GEN_TAC THEN
10022  REWRITE_TAC[has_bounded_setvariation_on, SUBSET_UNIV] THEN
10023  MESON_TAC[DIVISION_OF_UNION_SELF]
10024QED
10025
10026Theorem HAS_BOUNDED_SETVARIATION_ON_SUBSET:
10027   !f:(real->bool)->real s t.
10028        f has_bounded_setvariation_on s /\ t SUBSET s
10029        ==> f has_bounded_setvariation_on t
10030Proof
10031  REPEAT GEN_TAC THEN
10032  DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
10033  REWRITE_TAC[has_bounded_setvariation_on] THEN
10034  METIS_TAC[SUBSET_TRANS]
10035QED
10036
10037Theorem HAS_BOUNDED_SETVARIATION_ON_IMP_BOUNDED_ON_SUBINTERVALS :
10038    !f:(real->bool)->real s.
10039        f has_bounded_setvariation_on s
10040        ==> bounded { f(interval[c,d]) | interval[c,d] SUBSET s}
10041Proof
10042    rpt GEN_TAC >> REWRITE_TAC[has_bounded_setvariation_on, bounded_def]
10043 >> DISCH_THEN (X_CHOOSE_TAC ``B:real``)
10044 >> EXISTS_TAC ``max (abs B) (abs((f:(real->bool)->real) {}))``
10045 >> SIMP_TAC std_ss [FORALL_IN_GSPEC]
10046 >> MAP_EVERY X_GEN_TAC [``c:real``, ``d:real``] THEN DISCH_TAC
10047 >> ASM_CASES_TAC ``interval[c:real,d] = {}`` (* 2 subgoals *)
10048 >> ASM_REWRITE_TAC [REAL_LE_MAX2]
10049 >> FIRST_X_ASSUM (MP_TAC o SPECL
10050   [``{interval[c:real,d]}``, ``interval[c:real,d]``])
10051 >> ASM_SIMP_TAC std_ss [DIVISION_OF_SELF, SUM_SING, max_def]
10052 >> DISCH_TAC
10053 >> reverse (Cases_on `abs B <= abs (f {})`) >> fs []
10054 >- (MATCH_MP_TAC REAL_LE_TRANS \\
10055     Q.EXISTS_TAC `B` >> art [ABS_LE])
10056 >> MATCH_MP_TAC REAL_LE_TRANS
10057 >> Q.EXISTS_TAC `B` >> art []
10058 >> MATCH_MP_TAC REAL_LE_TRANS
10059 >> Q.EXISTS_TAC `abs B` >> art [ABS_LE]
10060QED
10061
10062Theorem HAS_BOUNDED_SETVARIATION_ON_COMPOSE_LINEAR:
10063   !f:(real->bool)->real g:real->real s.
10064        f has_bounded_setvariation_on s /\ linear g
10065        ==> (g o f) has_bounded_setvariation_on s
10066Proof
10067  REPEAT GEN_TAC THEN
10068  REWRITE_TAC[HAS_BOUNDED_SETVARIATION_ON] THEN
10069  DISCH_THEN(CONJUNCTS_THEN2 (X_CHOOSE_TAC ``B:real``) ASSUME_TAC) THEN
10070  FIRST_X_ASSUM(X_CHOOSE_TAC ``C:real`` o MATCH_MP LINEAR_BOUNDED_POS) THEN
10071  EXISTS_TAC ``B * C:real`` THEN ASM_SIMP_TAC std_ss [REAL_LT_MUL] THEN
10072  MAP_EVERY X_GEN_TAC [``d:(real->bool)->bool``, ``t:real->bool``] THEN
10073  STRIP_TAC THEN REWRITE_TAC[o_THM] THEN MATCH_MP_TAC REAL_LE_TRANS THEN
10074  EXISTS_TAC ``sum d (\k. C * abs((f:(real->bool)->real) k))`` THEN
10075  CONJ_TAC THENL
10076   [MATCH_MP_TAC SUM_LE THEN ASM_MESON_TAC[DIVISION_OF_FINITE],
10077    GEN_REWR_TAC RAND_CONV [REAL_MUL_SYM] THEN
10078    SIMP_TAC std_ss [SUM_LMUL] THEN ASM_SIMP_TAC std_ss [REAL_LE_LMUL] THEN
10079    ASM_MESON_TAC[]]
10080QED
10081
10082Theorem HAS_BOUNDED_SETVARIATION_ON_0:
10083   !s:real->bool. (\x. 0) has_bounded_setvariation_on s
10084Proof
10085  REWRITE_TAC[has_bounded_setvariation_on, ABS_0, SUM_0] THEN
10086  MESON_TAC[REAL_LE_REFL]
10087QED
10088
10089Theorem SET_VARIATION_0:
10090   !s:real->bool. set_variation s (\x. 0) = &0
10091Proof
10092  GEN_TAC THEN REWRITE_TAC[set_variation, ABS_0, SUM_0] THEN
10093  GEN_REWR_TAC RAND_CONV [GSYM SUP_SING] THEN
10094  AP_TERM_TAC THEN SIMP_TAC std_ss [EXTENSION, GSPECIFICATION, IN_SING] THEN
10095  MESON_TAC[ELEMENTARY_EMPTY, EMPTY_SUBSET]
10096QED
10097
10098Theorem HAS_BOUNDED_SETVARIATION_ON_CMUL:
10099   !f:(real->bool)->real c s.
10100        f has_bounded_setvariation_on s
10101        ==> (\x. c * f x) has_bounded_setvariation_on s
10102Proof
10103  REPEAT GEN_TAC THEN
10104  MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT, o_DEF]
10105     HAS_BOUNDED_SETVARIATION_ON_COMPOSE_LINEAR) THEN
10106  REWRITE_TAC[linear] THEN REAL_ARITH_TAC
10107QED
10108
10109Theorem HAS_BOUNDED_SETVARIATION_ON_NEG:
10110   !f:(real->bool)->real s.
10111        (\x. -(f x)) has_bounded_setvariation_on s <=>
10112        f has_bounded_setvariation_on s
10113Proof
10114  SIMP_TAC std_ss [has_bounded_setvariation_on, ABS_NEG]
10115QED
10116
10117Theorem HAS_BOUNDED_SETVARIATION_ON_ADD:
10118   !f:(real->bool)->real g s.
10119        f has_bounded_setvariation_on s /\
10120        g has_bounded_setvariation_on s
10121        ==> (\x. f x + g x) has_bounded_setvariation_on s
10122Proof
10123  REPEAT GEN_TAC THEN REWRITE_TAC[has_bounded_setvariation_on] THEN
10124  DISCH_THEN(CONJUNCTS_THEN2
10125   (X_CHOOSE_THEN ``B:real`` STRIP_ASSUME_TAC)
10126   (X_CHOOSE_THEN ``C:real`` STRIP_ASSUME_TAC)) THEN
10127  EXISTS_TAC ``B + C:real`` THEN
10128  MAP_EVERY X_GEN_TAC [``d:(real->bool)->bool``, ``t:real->bool``] THEN
10129  STRIP_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN
10130  EXISTS_TAC ``sum d (\k. abs((f:(real->bool)->real) k)) +
10131               sum d (\k. abs((g:(real->bool)->real) k))`` THEN
10132  CONJ_TAC THENL [ALL_TAC, ASM_MESON_TAC[REAL_LE_ADD2]] THEN
10133  FIRST_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_FINITE) THEN
10134  ASM_SIMP_TAC std_ss [GSYM SUM_ADD] THEN
10135  MATCH_MP_TAC SUM_LE THEN ASM_SIMP_TAC std_ss [ABS_TRIANGLE]
10136QED
10137
10138Theorem HAS_BOUNDED_SETVARIATION_ON_SUB:
10139   !f:(real->bool)->real g s.
10140        f has_bounded_setvariation_on s /\
10141        g has_bounded_setvariation_on s
10142        ==> (\x. f x - g x) has_bounded_setvariation_on s
10143Proof
10144  REWRITE_TAC[REAL_ARITH ``x - y:real = x + -y``] THEN
10145  SIMP_TAC std_ss [HAS_BOUNDED_SETVARIATION_ON_ADD, HAS_BOUNDED_SETVARIATION_ON_NEG]
10146QED
10147
10148Theorem HAS_BOUNDED_SETVARIATION_ON_NULL:
10149   !f:(real->bool)->real s.
10150        (!a b. (content(interval[a,b]) = &0) ==> (f(interval[a,b]) = 0)) /\
10151        (content s = &0) /\ bounded s
10152        ==> f has_bounded_setvariation_on s
10153Proof
10154  REPEAT STRIP_TAC THEN REWRITE_TAC[has_bounded_setvariation_on] THEN
10155  EXISTS_TAC ``&0:real`` THEN REPEAT STRIP_TAC THEN
10156  MATCH_MP_TAC(REAL_ARITH ``(x = &0) ==> x <= &0:real``) THEN
10157  MATCH_MP_TAC SUM_EQ_0 THEN SIMP_TAC std_ss [ABS_ZERO] THEN
10158  UNDISCH_TAC ``d division_of t`` THEN DISCH_TAC THEN
10159  FIRST_ASSUM(fn th => SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION th]) THEN
10160  REPEAT STRIP_TAC THEN FIRST_ASSUM MATCH_MP_TAC THEN
10161  MATCH_MP_TAC CONTENT_0_SUBSET_GEN THEN
10162  EXISTS_TAC ``s:real->bool`` THEN ASM_REWRITE_TAC[] THEN
10163  ASM_MESON_TAC[division_of, SUBSET_TRANS]
10164QED
10165
10166Theorem SET_VARIATION_ELEMENTARY_LEMMA:
10167   !f:(real->bool)->real s b.
10168        (?d. d division_of s)
10169        ==> ((!d t. d division_of t /\ t SUBSET s
10170                    ==> sum d (\k. abs(f k)) <= b) <=>
10171             (!d. d division_of s ==> sum d (\k. abs(f k)) <= b))
10172Proof
10173  REPEAT GEN_TAC THEN DISCH_THEN(X_CHOOSE_TAC ``d1:(real->bool)->bool``) THEN
10174  EQ_TAC THENL [MESON_TAC[SUBSET_REFL], ALL_TAC] THEN
10175  DISCH_TAC THEN X_GEN_TAC ``d2:(real->bool)->bool`` THEN
10176  X_GEN_TAC ``t:real->bool`` THEN STRIP_TAC THEN MP_TAC(ISPECL
10177   [``d2:(real->bool)->bool``, ``d1:(real->bool)->bool``,
10178    ``t:real->bool``, ``s:real->bool``] PARTIAL_DIVISION_EXTEND) THEN
10179  ASM_REWRITE_TAC[] THEN
10180  DISCH_THEN(X_CHOOSE_TAC ``d3:(real->bool)->bool``) THEN
10181  MATCH_MP_TAC REAL_LE_TRANS THEN
10182  EXISTS_TAC ``sum d3 (\k:real->bool. abs(f k:real))`` THEN
10183  ASM_SIMP_TAC std_ss [] THEN MATCH_MP_TAC SUM_SUBSET_SIMPLE THEN
10184  ASM_SIMP_TAC std_ss [ABS_POS] THEN ASM_MESON_TAC[DIVISION_OF_FINITE]
10185QED
10186
10187Theorem SET_VARIATION_ON_ELEMENTARY:
10188   !f:(real->bool)->real s.
10189        (?d. d division_of s)
10190        ==> (set_variation s f =
10191             sup { sum d (\k. abs(f k)) | d division_of s})
10192Proof
10193  REPEAT GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[set_variation, sup_alt] THEN
10194  SIMP_TAC std_ss [FORALL_IN_GSPEC, LEFT_IMP_EXISTS_THM] THEN
10195  ASM_SIMP_TAC std_ss [SET_VARIATION_ELEMENTARY_LEMMA]
10196QED
10197
10198Theorem SET_VARIATION_ON_INTERVAL:
10199   !f:(real->bool)->real a b.
10200        set_variation (interval[a,b]) f =
10201        sup { sum d (\k. abs(f k)) | d division_of interval[a,b]}
10202Proof
10203  REPEAT GEN_TAC THEN MATCH_MP_TAC SET_VARIATION_ON_ELEMENTARY THEN
10204  REWRITE_TAC[ELEMENTARY_INTERVAL]
10205QED
10206
10207Theorem HAS_BOUNDED_SETVARIATION_WORKS:
10208   !f:(real->bool)->real s.
10209        f has_bounded_setvariation_on s
10210        ==> (!d t. d division_of t /\ t SUBSET s
10211                   ==> sum d (\k. abs(f k)) <= set_variation s f) /\
10212            (!B. (!d t. d division_of t /\ t SUBSET s
10213                        ==> sum d (\k. abs (f k)) <= B)
10214                 ==> set_variation s f <= B)
10215Proof
10216  REPEAT GEN_TAC THEN REWRITE_TAC[has_bounded_setvariation_on] THEN
10217  DISCH_TAC THEN
10218  MP_TAC(ISPEC ``{ sum d (\k. abs((f:(real->bool)->real) k)) |
10219                  ?t. d division_of t /\ t SUBSET s}``
10220         SUP) THEN
10221  SIMP_TAC std_ss [FORALL_IN_GSPEC, LEFT_IMP_EXISTS_THM] THEN
10222  REWRITE_TAC[set_variation] THEN DISCH_THEN MATCH_MP_TAC THEN
10223  ASM_SIMP_TAC std_ss [GSYM MEMBER_NOT_EMPTY, GSPECIFICATION] THEN
10224  MAP_EVERY EXISTS_TAC [``{}:(real->bool)->bool``] THEN
10225  REWRITE_TAC[SUM_CLAUSES] THEN EXISTS_TAC ``{}:real->bool`` THEN
10226  SIMP_TAC std_ss [division_of, EMPTY_SUBSET, NOT_IN_EMPTY, FINITE_EMPTY,
10227                   BIGUNION_EMPTY]
10228QED
10229
10230Theorem HAS_BOUNDED_SETVARIATION_WORKS_ON_ELEMENTARY:
10231   !f:(real->bool)->real s.
10232        f has_bounded_setvariation_on s /\ (?d. d division_of s)
10233        ==> (!d. d division_of s
10234                 ==> sum d (\k. abs(f k)) <= set_variation s f) /\
10235            (!B. (!d. d division_of s ==> sum d (\k. abs(f k)) <= B)
10236                 ==> set_variation s f <= B)
10237Proof
10238  SIMP_TAC std_ss [GSYM SET_VARIATION_ELEMENTARY_LEMMA] THEN
10239  METIS_TAC[HAS_BOUNDED_SETVARIATION_WORKS]
10240QED
10241
10242Theorem HAS_BOUNDED_SETVARIATION_WORKS_ON_INTERVAL:
10243   !f:(real->bool)->real a b.
10244      f has_bounded_setvariation_on interval[a,b]
10245      ==> (!d. d division_of interval[a,b]
10246               ==> sum d (\k. abs(f k)) <= set_variation (interval[a,b]) f) /\
10247          (!B. (!d. d division_of interval[a,b]
10248                    ==> sum d (\k. abs(f k)) <= B)
10249               ==> set_variation (interval[a,b]) f <= B)
10250Proof
10251  SIMP_TAC std_ss [HAS_BOUNDED_SETVARIATION_WORKS_ON_ELEMENTARY, ELEMENTARY_INTERVAL]
10252QED
10253
10254Theorem SET_VARIATION_UBOUND:
10255   !f:(real->bool)->real s B.
10256        f has_bounded_setvariation_on s /\
10257        (!d t. d division_of t /\ t SUBSET s ==> sum d (\k. abs(f k)) <= B)
10258        ==> set_variation s f <= B
10259Proof
10260  METIS_TAC[HAS_BOUNDED_SETVARIATION_WORKS]
10261QED
10262
10263Theorem SET_VARIATION_UBOUND_ON_INTERVAL:
10264   !f:(real->bool)->real a b B.
10265        f has_bounded_setvariation_on interval[a,b] /\
10266        (!d. d division_of interval[a,b] ==> sum d (\k. abs(f k)) <= B)
10267        ==> set_variation (interval[a,b]) f <= B
10268Proof
10269  SIMP_TAC std_ss [GSYM SET_VARIATION_ELEMENTARY_LEMMA, ELEMENTARY_INTERVAL] THEN
10270  METIS_TAC[SET_VARIATION_UBOUND]
10271QED
10272
10273Theorem SET_VARIATION_LBOUND:
10274   !f:(real->bool)->real s B.
10275        f has_bounded_setvariation_on s /\
10276        (?d t. d division_of t /\ t SUBSET s /\ B <= sum d (\k. abs(f k)))
10277        ==> B <= set_variation s f
10278Proof
10279  METIS_TAC[HAS_BOUNDED_SETVARIATION_WORKS, REAL_LE_TRANS]
10280QED
10281
10282Theorem SET_VARIATION_LBOUND_ON_INTERVAL:
10283   !f:(real->bool)->real a b B.
10284        f has_bounded_setvariation_on interval[a,b] /\
10285        (?d. d division_of interval[a,b] /\ B <= sum d (\k. abs(f k)))
10286        ==> B <= set_variation (interval[a,b]) f
10287Proof
10288  METIS_TAC[HAS_BOUNDED_SETVARIATION_WORKS_ON_INTERVAL, REAL_LE_TRANS]
10289QED
10290
10291Theorem SET_VARIATION:
10292   !f:(real->bool)->real s d t.
10293        f has_bounded_setvariation_on s /\ d division_of t /\ t SUBSET s
10294        ==> sum d (\k. abs(f k)) <= set_variation s f
10295Proof
10296  METIS_TAC[HAS_BOUNDED_SETVARIATION_WORKS]
10297QED
10298
10299Theorem SET_VARIATION_WORKS_ON_INTERVAL:
10300   !f:(real->bool)->real a b d.
10301        f has_bounded_setvariation_on interval[a,b] /\
10302        d division_of interval[a,b]
10303        ==> sum d (\k. abs(f k)) <= set_variation (interval[a,b]) f
10304Proof
10305  METIS_TAC[HAS_BOUNDED_SETVARIATION_WORKS_ON_INTERVAL]
10306QED
10307
10308Theorem SET_VARIATION_POS_LE:
10309   !f:(real->bool)->real s.
10310        f has_bounded_setvariation_on s ==> &0 <= set_variation s f
10311Proof
10312  REPEAT STRIP_TAC THEN
10313  FIRST_ASSUM(MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ] SET_VARIATION)) THEN
10314  DISCH_THEN(MP_TAC o SPECL[``{}:(real->bool)->bool``, ``{}:real->bool``]) THEN
10315  REWRITE_TAC[EMPTY_SUBSET, SUM_CLAUSES, DIVISION_OF_TRIVIAL]
10316QED
10317
10318Theorem SET_VARIATION_COMPARISON:
10319   !f:(real->bool)->real g:(real->bool)->real s.
10320        f has_bounded_setvariation_on s /\
10321        (!a b. ~(interval[a,b] = {}) /\ interval[a,b] SUBSET s
10322               ==> abs(g(interval[a,b])) <= abs(f(interval[a,b])))
10323        ==> set_variation s g <= set_variation s f
10324Proof
10325  REPEAT STRIP_TAC THEN MATCH_MP_TAC SET_VARIATION_UBOUND THEN CONJ_TAC THENL
10326   [ASM_MESON_TAC[HAS_BOUNDED_SETVARIATION_COMPARISON], ALL_TAC] THEN
10327  UNDISCH_TAC ``f has_bounded_setvariation_on s`` THEN DISCH_TAC THEN
10328  FIRST_ASSUM(MP_TAC o CONJUNCT1 o MATCH_MP
10329   HAS_BOUNDED_SETVARIATION_WORKS) THEN
10330  DISCH_TAC THEN GEN_TAC THEN GEN_TAC THEN
10331  POP_ASSUM (MP_TAC o SPECL [``d:(real -> bool) -> bool``,``t:real -> bool``]) THEN
10332  DISCH_THEN(fn th => STRIP_TAC THEN MP_TAC th) THEN
10333  ASM_REWRITE_TAC[] THEN
10334  MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] REAL_LE_TRANS) THEN
10335  MATCH_MP_TAC SUM_LE THEN
10336  CONJ_TAC THENL [ASM_MESON_TAC[division_of], ALL_TAC] THEN
10337  UNDISCH_TAC ``d division_of t`` THEN DISCH_TAC THEN FIRST_ASSUM
10338   (fn th => SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION_NONEMPTY th]) THEN
10339  REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
10340  METIS_TAC[division_of, SUBSET_TRANS]
10341QED
10342
10343Theorem SET_VARIATION_GE_FUNCTION:
10344   !f:(real->bool)->real s a b.
10345        f has_bounded_setvariation_on s /\
10346        interval[a,b] SUBSET s /\ ~(interval[a,b] = {})
10347        ==> abs(f(interval[a,b])) <= set_variation s f
10348Proof
10349  REPEAT STRIP_TAC THEN MATCH_MP_TAC SET_VARIATION_LBOUND THEN
10350  ASM_SIMP_TAC std_ss [] THEN EXISTS_TAC ``{interval[a:real,b]}`` THEN
10351  EXISTS_TAC ``interval[a:real,b]`` THEN
10352  ASM_SIMP_TAC std_ss [SUM_SING, REAL_LE_REFL] THEN
10353  ASM_SIMP_TAC std_ss [DIVISION_OF_SELF]
10354QED
10355
10356Theorem SET_VARIATION_ON_NULL:
10357   !f:(real->bool)->real s.
10358        (!a b. (content(interval[a,b]) = &0) ==> (f(interval[a,b]) = 0)) /\
10359        (content s = &0) /\ bounded s
10360        ==> (set_variation s f = &0)
10361Proof
10362  REPEAT STRIP_TAC THEN
10363  ONCE_REWRITE_TAC[GSYM REAL_LE_ANTISYM] THEN CONJ_TAC THENL
10364   [MATCH_MP_TAC SET_VARIATION_UBOUND THEN
10365    ASM_SIMP_TAC std_ss [HAS_BOUNDED_SETVARIATION_ON_NULL] THEN
10366    REPEAT STRIP_TAC THEN
10367    MATCH_MP_TAC(REAL_ARITH ``(x = &0) ==> x <= &0:real``) THEN
10368    MATCH_MP_TAC SUM_EQ_0 THEN SIMP_TAC std_ss [ABS_ZERO] THEN
10369    UNDISCH_TAC ``d division_of t`` THEN DISCH_TAC THEN
10370    FIRST_ASSUM(fn th => SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION th]) THEN
10371    REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
10372    MATCH_MP_TAC CONTENT_0_SUBSET_GEN THEN
10373    EXISTS_TAC ``s:real->bool`` THEN ASM_REWRITE_TAC[] THEN
10374    ASM_MESON_TAC[division_of, SUBSET_TRANS],
10375    MATCH_MP_TAC SET_VARIATION_POS_LE THEN
10376    ASM_SIMP_TAC std_ss [HAS_BOUNDED_SETVARIATION_ON_NULL]]
10377QED
10378
10379Theorem SET_VARIATION_TRIANGLE:
10380   !f:(real->bool)->real g s.
10381        f has_bounded_setvariation_on s /\
10382        g has_bounded_setvariation_on s
10383        ==> set_variation s (\x. f x + g x)
10384             <= set_variation s f + set_variation s g
10385Proof
10386  REPEAT STRIP_TAC THEN MATCH_MP_TAC SET_VARIATION_UBOUND THEN
10387  ASM_SIMP_TAC std_ss [HAS_BOUNDED_SETVARIATION_ON_ADD] THEN
10388  MAP_EVERY X_GEN_TAC [``d:(real->bool)->bool``, ``t:real->bool``] THEN
10389  STRIP_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN
10390  EXISTS_TAC ``sum d (\k. abs((f:(real->bool)->real) k)) +
10391              sum d (\k. abs((g:(real->bool)->real) k))`` THEN
10392  CONJ_TAC THENL
10393   [FIRST_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_FINITE) THEN
10394    ASM_SIMP_TAC std_ss [GSYM SUM_ADD] THEN
10395    MATCH_MP_TAC SUM_LE THEN ASM_SIMP_TAC std_ss [ABS_TRIANGLE],
10396    MATCH_MP_TAC REAL_LE_ADD2 THEN
10397    CONJ_TAC THEN MATCH_MP_TAC SET_VARIATION THEN ASM_MESON_TAC[]]
10398QED
10399
10400Theorem HAS_BOUNDED_SETVARIATION_ON_SUM_AND_SET_VARIATION_SUM_LE:
10401   (!f:'a->(real->bool)->real s k.
10402        FINITE k /\
10403        (!i. i IN k ==> f i has_bounded_setvariation_on s)
10404        ==> (\x. sum k (\i. f i x)) has_bounded_setvariation_on s) /\
10405   (!f:'a->(real->bool)->real s k.
10406        FINITE k /\
10407        (!i. i IN k ==> f i has_bounded_setvariation_on s)
10408        ==> set_variation s (\x. sum k (\i. f i x))
10409            <= sum k (\i. set_variation s (f i)))
10410Proof
10411  SIMP_TAC std_ss [GSYM FORALL_AND_THM, TAUT
10412   `(p ==> q) /\ (p ==> r) <=> p ==> q /\ r`] THEN
10413  GEN_TAC THEN GEN_TAC THEN REWRITE_TAC[IMP_CONJ] THEN
10414  ONCE_REWRITE_TAC [METIS []
10415   ``!k. ((!i. i IN k ==> f i has_bounded_setvariation_on s) ==>
10416         (\x. sum k (\i. f i x)) has_bounded_setvariation_on s /\
10417          set_variation s (\x. sum k (\i. f i x)) <=
10418          sum k (\i. set_variation s (f i))) =
10419    (\k. (!i. i IN k ==> f i has_bounded_setvariation_on s) ==>
10420         (\x. sum k (\i. f i x)) has_bounded_setvariation_on s /\
10421          set_variation s (\x. sum k (\i. f i x)) <=
10422          sum k (\i. set_variation s (f i))) k``] THEN
10423  MATCH_MP_TAC FINITE_INDUCT THEN BETA_TAC THEN
10424  SIMP_TAC std_ss [SUM_CLAUSES, FORALL_IN_INSERT] THEN
10425  SIMP_TAC std_ss [SET_VARIATION_0, REAL_LE_REFL, HAS_BOUNDED_SETVARIATION_ON_0,
10426           HAS_BOUNDED_SETVARIATION_ON_ADD, ETA_AX] THEN
10427  REPEAT STRIP_TAC THENL
10428  [ONCE_REWRITE_TAC [METIS [] ``(\x. f e x + sum s' (\i. f i x)) =
10429                   (\x. (\x. f e x) x + (\x. sum s' (\i. f i x)) x)``] THEN
10430   MATCH_MP_TAC HAS_BOUNDED_SETVARIATION_ON_ADD THEN METIS_TAC [ETA_AX],
10431  ALL_TAC] THEN
10432  ONCE_REWRITE_TAC [METIS [] ``(\x. f e x + sum s' (\i. f i x)) =
10433                   (\x. (\x. f e x) x + (\x. sum s' (\i. f i x)) x)``] THEN
10434  W(MP_TAC o PART_MATCH (lhand o rand)
10435    SET_VARIATION_TRIANGLE o lhand o snd) THEN
10436  ASM_SIMP_TAC std_ss [METIS [ETA_AX] ``(\x. f e x) = f e``] THEN
10437  MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] REAL_LE_TRANS) THEN
10438  ASM_SIMP_TAC std_ss [REAL_LE_LADD]
10439QED
10440
10441Theorem HAS_BOUNDED_SETVARIATION_ON_SUM:
10442   (!f:'a->(real->bool)->real s k.
10443        FINITE k /\
10444        (!i. i IN k ==> f i has_bounded_setvariation_on s)
10445        ==> (\x. sum k (\i. f i x)) has_bounded_setvariation_on s)
10446Proof
10447  REWRITE_TAC [HAS_BOUNDED_SETVARIATION_ON_SUM_AND_SET_VARIATION_SUM_LE]
10448QED
10449
10450Theorem SET_VARIATION_SUM_LE:
10451   (!f:'a->(real->bool)->real s k.
10452        FINITE k /\
10453        (!i. i IN k ==> f i has_bounded_setvariation_on s)
10454        ==> set_variation s (\x. sum k (\i. f i x))
10455            <= sum k (\i. set_variation s (f i)))
10456Proof
10457  REWRITE_TAC [HAS_BOUNDED_SETVARIATION_ON_SUM_AND_SET_VARIATION_SUM_LE]
10458QED
10459
10460Theorem lemma1[local]:
10461     !f:(real->bool)->real B1 B2 a b.
10462      (!a b. (content(interval[a,b]) = &0) ==> (f(interval[a,b]) = &0)) /\
10463      (!a b c. f(interval[a,b]) <=
10464               f(interval[a,b] INTER {x | x <= c}) +
10465               f(interval[a,b] INTER {x | x >= c})) /\
10466      (!d. d division_of (interval[a,b] INTER {x | x <= c})
10467           ==> sum d f <= B1) /\
10468      (!d. d division_of (interval[a,b] INTER {x | x >= c})
10469           ==> sum d f <= B2)
10470      ==> !d. d division_of interval[a,b] ==> sum d f <= B1 + B2
10471Proof
10472    REPEAT GEN_TAC THEN
10473    DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
10474    DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
10475    DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
10476    DISCH_TAC THEN
10477    GEN_TAC THEN DISCH_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN
10478    EXISTS_TAC
10479     ``sum {l INTER {x:real | x <= c} | l | l IN d /\
10480                                        ~(l INTER {x | x <= c} = {})} f +
10481      sum {l INTER {x | x >= c} | l | l IN d /\
10482                                        ~(l INTER {x | x >= c} = {})} f`` THEN
10483    CONJ_TAC THENL
10484     [ALL_TAC,
10485      MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC THEN
10486      FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_SIMP_TAC std_ss [DIVISION_SPLIT]] THEN
10487    ONCE_REWRITE_TAC [METIS [SIMPLE_IMAGE_GEN]
10488     ``{l INTER {x | x <= c:real} | l | l IN d /\ l INTER {x | x <= c} <> {}} =
10489       IMAGE (\l. l INTER {x | x <= c})
10490        {l | l IN d /\ l INTER {x | x <= c} <> {}}``] THEN
10491    ONCE_REWRITE_TAC [METIS [SIMPLE_IMAGE_GEN]
10492     ``{l INTER {x | x >= c:real} | l | l IN d /\ l INTER {x | x >= c} <> {}} =
10493       IMAGE (\l. l INTER {x | x >= c})
10494        {l | l IN d /\ l INTER {x | x >= c} <> {}}``] THEN
10495    FIRST_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_FINITE) THEN
10496    W(fn (asl,w) =>
10497         MP_TAC(PART_MATCH (lhs o rand) SUM_IMAGE_NONZERO (lhand(rand w))) THEN
10498         MP_TAC(PART_MATCH (lhs o rand) SUM_IMAGE_NONZERO (rand(rand w)))) THEN
10499    MATCH_MP_TAC(TAUT
10500     `(a1 /\ a2) /\ (b1 /\ b2 ==> c)
10501      ==> (a1 ==> b1) ==> (a2 ==> b2) ==> c`) THEN
10502    CONJ_TAC THENL
10503     [ASM_SIMP_TAC std_ss [FINITE_RESTRICT, IMP_CONJ, RIGHT_FORALL_IMP_THM] THEN
10504      SIMP_TAC std_ss [FORALL_IN_GSPEC, IMP_CONJ] THEN
10505      UNDISCH_TAC ``d division_of interval [(a,b)]`` THEN DISCH_TAC THEN
10506      FIRST_ASSUM(fn th => SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION th]) THEN
10507      REPEAT STRIP_TAC THEN ASM_SIMP_TAC std_ss [INTERVAL_SPLIT] THEN
10508      FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_SIMP_TAC std_ss [GSYM INTERVAL_SPLIT] THENL
10509       [MATCH_MP_TAC DIVISION_SPLIT_RIGHT_INJ,
10510        MATCH_MP_TAC DIVISION_SPLIT_LEFT_INJ] THEN
10511      ASM_MESON_TAC[],
10512      DISCH_THEN(CONJUNCTS_THEN SUBST1_TAC)] THEN
10513    MATCH_MP_TAC REAL_LE_TRANS THEN
10514    EXISTS_TAC
10515     ``sum d (f o (\l. l INTER {x | x <= c})) +
10516       sum d (f o (\l. l INTER {x:real | x >= c}))`` THEN
10517    CONJ_TAC THENL
10518     [ASM_SIMP_TAC std_ss [GSYM SUM_ADD] THEN MATCH_MP_TAC SUM_LE THEN
10519      ASM_REWRITE_TAC[o_THM] THEN
10520      UNDISCH_TAC ``d division_of interval [(a,b)]`` THEN DISCH_TAC THEN
10521      FIRST_ASSUM(fn th => ASM_SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION th]),
10522      MATCH_MP_TAC(REAL_ARITH ``(x = y) /\ (w = z) ==> x + w <= y + z:real``) THEN
10523      CONJ_TAC THEN MATCH_MP_TAC SUM_SUPERSET THEN
10524      ONCE_REWRITE_TAC [METIS [] ``({l | l IN d /\ l INTER {x | x <= c:real} <> {}}) =
10525                               {l | l IN d /\ (\l. l INTER {x | x <= c} <> {}) l}``] THEN
10526      ONCE_REWRITE_TAC [METIS [] ``({l | l IN d /\ l INTER {x | x >= c:real} <> {}}) =
10527                               {l | l IN d /\ (\l. l INTER {x | x >= c} <> {}) l}``] THEN
10528      REWRITE_TAC[SET_RULE ``{x | x IN s /\ P x} SUBSET s``] THEN
10529      ONCE_REWRITE_TAC [METIS [] ``((f o (\l. l INTER {x | x <= c:real})) x = 0) =
10530       (\x. ((f:(real -> bool) -> real o (\l. l INTER {x | x <= c})) x = 0)) x``] THEN
10531      ONCE_REWRITE_TAC [METIS [] ``((f o (\l. l INTER {x | x >= c:real})) x = 0) =
10532       (\x. ((f:(real -> bool) -> real o (\l. l INTER {x | x >= c})) x = 0)) x``] THEN
10533      REWRITE_TAC[SET_RULE ``(x IN s /\ ~(x IN {l | l IN s /\ P l}) ==> Q x) <=>
10534                             (x IN s ==> ~P x ==> Q x)``] THEN
10535      SIMP_TAC std_ss [o_THM] THEN ASM_MESON_TAC[EMPTY_AS_INTERVAL, CONTENT_EMPTY]]
10536QED
10537
10538Theorem lemma2[local]:
10539     !f:(real->bool)->real B.
10540      (!a b. (content(interval[a,b]) = &0) ==> (f(interval[a,b]) = &0)) /\
10541      (!d. d division_of interval[a,b] ==> sum d f <= B)
10542      ==> !d1 d2. d1 division_of (interval[a,b] INTER {x | x <= c}) /\
10543                  d2 division_of (interval[a,b] INTER {x | x >= c})
10544                  ==> sum d1 f + sum d2 f <= B
10545Proof
10546    REPEAT STRIP_TAC THEN
10547    FIRST_X_ASSUM(MP_TAC o SPEC ``d1 UNION d2:(real->bool)->bool``) THEN
10548    KNOW_TAC ``(d1:(real->bool)->bool) UNION d2 division_of interval [(a,b)]`` THENL
10549    [ (* goal 1 (of 2) *)
10550      SUBGOAL_THEN
10551       ``interval[a,b] = (interval[a,b] INTER {x:real | x <= c}) UNION
10552                        (interval[a,b] INTER {x:real | x >= c})``
10553      SUBST1_TAC THENL
10554       [MATCH_MP_TAC(SET_RULE
10555         ``(!x. x IN t \/ x IN u) ==> (s = s INTER t UNION s INTER u)``) THEN
10556        SIMP_TAC std_ss [GSPECIFICATION] THEN REAL_ARITH_TAC,
10557        MATCH_MP_TAC DIVISION_DISJOINT_UNION THEN ASM_REWRITE_TAC[] THEN
10558        REWRITE_TAC[GSYM INTERIOR_INTER] THEN
10559        MATCH_MP_TAC(SET_RULE
10560         ``!t. interior s SUBSET interior t /\ (interior t = {})
10561              ==> (interior s = {})``) THEN
10562        EXISTS_TAC ``{x:real | x = c}`` THEN CONJ_TAC THENL
10563         [ALL_TAC, REWRITE_TAC[INTERIOR_STANDARD_HYPERPLANE]] THEN
10564        MATCH_MP_TAC SUBSET_INTERIOR THEN
10565        SIMP_TAC std_ss [SUBSET_DEF, IN_INTER, GSPECIFICATION] THEN REAL_ARITH_TAC],
10566      (* goal 2 (of 2) *)
10567      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
10568      MATCH_MP_TAC(REAL_ARITH ``(x = y) ==> x <= b ==> y <= b:real``) THEN
10569      MATCH_MP_TAC SUM_UNION_NONZERO THEN
10570      REPEAT(CONJ_TAC THENL [ASM_MESON_TAC[DIVISION_OF_FINITE], ALL_TAC]) THEN
10571      X_GEN_TAC ``k:real->bool`` THEN REWRITE_TAC[IN_INTER] THEN STRIP_TAC THEN
10572      SUBGOAL_THEN ``?u v:real. k = interval[u,v]``
10573        (REPEAT_TCL CHOOSE_THEN SUBST_ALL_TAC)
10574      THENL [ASM_MESON_TAC[division_of], ALL_TAC] THEN
10575      FIRST_X_ASSUM MATCH_MP_TAC THEN MATCH_MP_TAC CONTENT_0_SUBSET_GEN THEN
10576      EXISTS_TAC ``interval[a,b] INTER {x:real | x = c}`` THEN CONJ_TAC THENL
10577      [ (* goal 2.1 (of 2) *)
10578        MATCH_MP_TAC SUBSET_TRANS THEN
10579        EXISTS_TAC ``(interval[a,b] INTER {x:real | x <= c}) INTER
10580                     (interval[a,b] INTER {x:real | x >= c})`` THEN
10581        CONJ_TAC THENL
10582        [ ONCE_REWRITE_TAC[SUBSET_INTER] THEN ASM_MESON_TAC[division_of],
10583          REWRITE_TAC[SET_RULE
10584            ``(s INTER t) INTER (s INTER u) = s INTER t INTER u``] THEN
10585          SIMP_TAC std_ss [SUBSET_DEF, IN_INTER, GSPECIFICATION] THEN
10586          RW_TAC std_ss [] \\
10587          REWRITE_TAC [GSYM REAL_LE_ANTISYM] >> fs [real_ge] ],
10588        (* goal 2.2 (of 2) *)
10589        SIMP_TAC std_ss [BOUNDED_INTER, BOUNDED_INTERVAL] THEN
10590        GEN_REWR_TAC (LAND_CONV o ONCE_DEPTH_CONV)
10591         [REAL_ARITH ``(x = y) <=> x <= y /\ x >= y:real``] THEN
10592        REWRITE_TAC[SET_RULE
10593         ``{x | x <= c /\ x >= c} = {x | x <= c} INTER {x | x >= c}``] THEN
10594        ASM_SIMP_TAC std_ss [INTER_ASSOC, INTERVAL_SPLIT] THEN
10595        SIMP_TAC std_ss [CONTENT_EQ_0, min_def, max_def] THEN KILL_TAC THEN
10596        rpt COND_CASES_TAC >> fs [REAL_LE_REFL] >> REAL_ASM_ARITH_TAC
10597   ] ]
10598QED
10599
10600Theorem OPERATIVE_LIFTED_SETVARIATION:
10601   !f:(real->bool)->real.
10602        operative(+) f
10603        ==> operative (lifted(+))
10604                      (\i. if f has_bounded_setvariation_on i
10605                           then SOME(set_variation i f) else NONE)
10606Proof
10607  REWRITE_TAC[operative, NEUTRAL_REAL_ADD] THEN REPEAT GEN_TAC THEN
10608  DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC (ASSUME_TAC o GSYM)) THEN
10609  ASM_SIMP_TAC std_ss [HAS_BOUNDED_SETVARIATION_ON_NULL, BOUNDED_INTERVAL,
10610   MONOIDAL_REAL_ADD, SET_VARIATION_ON_NULL, NEUTRAL_LIFTED,
10611   NEUTRAL_REAL_ADD] THEN
10612  MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``, ``c:real``] THEN
10613  ASM_CASES_TAC
10614   ``(f:(real->bool)->real) has_bounded_setvariation_on interval[a,b]`` THEN
10615  ASM_REWRITE_TAC[] THENL
10616   [SUBGOAL_THEN
10617     ``(f:(real->bool)->real) has_bounded_setvariation_on
10618       interval[a,b] INTER {x | x <= c} /\
10619       (f:(real->bool)->real) has_bounded_setvariation_on
10620       interval[a,b] INTER {x | x >= c}``
10621    ASSUME_TAC THENL
10622     [CONJ_TAC THEN FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
10623       (REWRITE_RULE[IMP_CONJ] HAS_BOUNDED_SETVARIATION_ON_SUBSET)) THEN
10624      REWRITE_TAC[INTER_SUBSET],
10625      ALL_TAC] THEN
10626    ASM_REWRITE_TAC[lifted] THEN AP_TERM_TAC THEN
10627    REWRITE_TAC[GSYM REAL_LE_ANTISYM] THEN CONJ_TAC THENL
10628     [MATCH_MP_TAC SET_VARIATION_UBOUND_ON_INTERVAL THEN ASM_REWRITE_TAC[] THEN
10629      REPEAT STRIP_TAC THEN MATCH_MP_TAC
10630       (SIMP_RULE std_ss [AND_IMP_INTRO, RIGHT_IMP_FORALL_THM] lemma1) THEN
10631      MAP_EVERY EXISTS_TAC [``a:real``, ``b:real``] THEN
10632      ASM_SIMP_TAC std_ss [ABS_0] THEN CONJ_TAC THENL
10633       [REPEAT GEN_TAC THEN
10634        MATCH_MP_TAC(REAL_ARITH
10635          ``(x:real = y + z) ==> abs(x) <= abs y + abs z``) THEN
10636        ASM_SIMP_TAC std_ss [],
10637        FIRST_X_ASSUM(fn th => MP_TAC th THEN MATCH_MP_TAC MONO_AND) THEN
10638        ASM_SIMP_TAC std_ss [INTERVAL_SPLIT, SET_VARIATION_WORKS_ON_INTERVAL]],
10639      ONCE_REWRITE_TAC[REAL_ARITH ``x + y <= z <=> x <= z - y:real``] THEN
10640      ASM_SIMP_TAC std_ss [INTERVAL_SPLIT] THEN
10641      MATCH_MP_TAC SET_VARIATION_UBOUND_ON_INTERVAL THEN
10642      ASM_SIMP_TAC std_ss [GSYM INTERVAL_SPLIT] THEN
10643      X_GEN_TAC ``d1:(real->bool)->bool`` THEN STRIP_TAC THEN
10644      ONCE_REWRITE_TAC[REAL_ARITH ``x <= y - z <=> z <= y - x:real``] THEN
10645      ASM_SIMP_TAC std_ss [INTERVAL_SPLIT] THEN
10646      MATCH_MP_TAC SET_VARIATION_UBOUND_ON_INTERVAL THEN
10647      ASM_SIMP_TAC std_ss [GSYM INTERVAL_SPLIT] THEN
10648      X_GEN_TAC ``d2:(real->bool)->bool`` THEN STRIP_TAC THEN
10649      REWRITE_TAC[REAL_ARITH ``x <= y - z <=> z + x <= y:real``] THEN
10650      REPEAT STRIP_TAC THEN MATCH_MP_TAC
10651       (SIMP_RULE std_ss [AND_IMP_INTRO, RIGHT_IMP_FORALL_THM] lemma2) THEN
10652      ASM_SIMP_TAC std_ss [ABS_0, SET_VARIATION_WORKS_ON_INTERVAL]],
10653    REPEAT(COND_CASES_TAC THEN ASM_REWRITE_TAC[lifted]) THEN
10654    UNDISCH_TAC ``~(f has_bounded_setvariation_on interval [(a,b)])`` THEN
10655    MATCH_MP_TAC(TAUT `p ==> ~p ==> q`) THEN
10656    REWRITE_TAC[HAS_BOUNDED_SETVARIATION_ON_INTERVAL] THEN
10657    EXISTS_TAC ``set_variation (interval[a,b] INTER {x | x <= c})
10658                              (f:(real->bool)->real) +
10659                set_variation (interval[a,b] INTER {x | x >= c}) f`` THEN
10660    REPEAT STRIP_TAC THEN MATCH_MP_TAC
10661       (SIMP_RULE std_ss [AND_IMP_INTRO, RIGHT_IMP_FORALL_THM] lemma1) THEN
10662      MAP_EVERY EXISTS_TAC [``a:real``, ``b:real``] THEN
10663      ASM_SIMP_TAC std_ss [ABS_0] THEN REPEAT CONJ_TAC THENL
10664       [REPEAT GEN_TAC THEN
10665        MATCH_MP_TAC(REAL_ARITH
10666          ``(x:real = y + z) ==> abs(x) <= abs y + abs z``) THEN
10667        ASM_SIMP_TAC std_ss [],
10668        UNDISCH_TAC
10669         ``(f:(real->bool)->real) has_bounded_setvariation_on
10670          (interval[a,b] INTER {x | x <= c})`` THEN
10671        ASM_SIMP_TAC std_ss [INTERVAL_SPLIT, SET_VARIATION_WORKS_ON_INTERVAL],
10672        UNDISCH_TAC
10673         ``(f:(real->bool)->real) has_bounded_setvariation_on
10674          (interval[a,b] INTER {x | x >= c})`` THEN
10675        ASM_SIMP_TAC std_ss [INTERVAL_SPLIT, SET_VARIATION_WORKS_ON_INTERVAL]]]
10676QED
10677
10678Theorem HAS_BOUNDED_SETVARIATION_ON_DIVISION:
10679   !f:(real->bool)->real a b d.
10680        operative (+) f /\ d division_of interval[a,b]
10681        ==> ((!k. k IN d ==> f has_bounded_setvariation_on k) <=>
10682             f has_bounded_setvariation_on interval[a,b])
10683Proof
10684  REPEAT STRIP_TAC THEN MATCH_MP_TAC OPERATIVE_DIVISION_AND THEN
10685  ASM_REWRITE_TAC[operative, NEUTRAL_AND] THEN CONJ_TAC THENL
10686   [RULE_ASSUM_TAC(REWRITE_RULE[operative, NEUTRAL_REAL_ADD]) THEN
10687    ASM_SIMP_TAC std_ss [HAS_BOUNDED_SETVARIATION_ON_NULL, BOUNDED_INTERVAL],
10688    FIRST_ASSUM(MP_TAC o MATCH_MP OPERATIVE_LIFTED_SETVARIATION) THEN
10689    REWRITE_TAC[operative] THEN DISCH_THEN(MP_TAC o CONJUNCT2) THEN
10690    POP_ASSUM K_TAC THEN DISCH_TAC THEN REPEAT GEN_TAC THEN
10691    POP_ASSUM (MP_TAC o SPECL [``a:real``,``b:real``,``c:real``]) THEN
10692    SIMP_TAC std_ss [] THEN
10693    REPEAT(COND_CASES_TAC THEN
10694           ASM_SIMP_TAC std_ss [lifted, NOT_NONE_SOME, option_CLAUSES])]
10695QED
10696
10697Theorem lemma0[local]:
10698     !op x y. ((lifted op (SOME x) y = SOME z) <=> ?w. (y = SOME w) /\ (op x w = z))
10699Proof
10700    GEN_TAC THEN GEN_TAC THEN ONCE_REWRITE_TAC [METIS []
10701     ``((lifted op (SOME x) y = SOME z) <=> ?w. (y = SOME w) /\ (op x w = z)) =
10702  (\y. (lifted op (SOME x) y = SOME z) <=> ?w. (y = SOME w) /\ (op x w = z)) y``] THEN
10703    MATCH_MP_TAC option_induction THEN
10704    SIMP_TAC std_ss [lifted, NOT_NONE_SOME, SOME_11] THEN
10705    MESON_TAC[]
10706QED
10707
10708Theorem lemma[local]:
10709     !P op f s z.
10710          monoidal op /\ FINITE s /\
10711          (iterate(lifted op) s (\i. if P i then SOME(f i) else NONE) = SOME z)
10712          ==> (iterate op s f = z)
10713Proof
10714    SIMP_TAC std_ss [IMP_CONJ, RIGHT_FORALL_IMP_THM] THEN
10715    REPEAT GEN_TAC THEN DISCH_TAC THEN GEN_TAC THEN
10716    ONCE_REWRITE_TAC [METIS []
10717     ``!s. (!z. (iterate (lifted op) s (\i. if P i then SOME (f i) else NONE) =
10718     SOME z) ==> (iterate op s f = z)) =
10719       (\s. !z. (iterate (lifted op) s (\i. if P i then SOME (f i) else NONE) =
10720     SOME z) ==> (iterate op s f = z)) s``] THEN
10721    MATCH_MP_TAC FINITE_INDUCT THEN BETA_TAC THEN
10722    ASM_SIMP_TAC std_ss [ITERATE_CLAUSES, MONOIDAL_LIFTED, NEUTRAL_LIFTED] THEN
10723    SIMP_TAC std_ss [SOME_11] THEN REPEAT GEN_TAC THEN
10724    STRIP_TAC THEN GEN_TAC THEN COND_CASES_TAC THEN
10725    SIMP_TAC std_ss [lifted, NOT_NONE_SOME] THEN ASM_MESON_TAC[lemma0]
10726QED
10727
10728Theorem SET_VARIATION_ON_DIVISION:
10729   !f:(real->bool)->real a b d.
10730        operative (+) f /\ d division_of interval[a,b] /\
10731        f has_bounded_setvariation_on interval[a,b]
10732        ==> (sum d (\k. set_variation k f) = set_variation (interval[a,b]) f)
10733Proof
10734  REPEAT STRIP_TAC THEN
10735  FIRST_ASSUM(MP_TAC o MATCH_MP OPERATIVE_LIFTED_SETVARIATION) THEN
10736  DISCH_THEN(MP_TAC o SPECL[``d:(real->bool)->bool``, ``a:real``, ``b:real``] o
10737    MATCH_MP (REWRITE_RULE [TAUT `a /\ b /\ c ==> d <=> b ==> a /\ c ==> d`]
10738        OPERATIVE_DIVISION)) THEN
10739  ASM_SIMP_TAC std_ss [MONOIDAL_LIFTED, MONOIDAL_REAL_ADD] THEN
10740  MP_TAC(ISPECL
10741   [``\k. (f:(real->bool)->real) has_bounded_setvariation_on k``,
10742    ``(+):real->real->real``,
10743    ``\k. set_variation k (f:(real->bool)->real)``,
10744    ``d:(real->bool)->bool``,
10745    ``set_variation (interval[a,b]) (f:(real->bool)->real)``]
10746   lemma) THEN
10747  FIRST_X_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_FINITE) THEN
10748  ASM_SIMP_TAC std_ss [sum_def, MONOIDAL_REAL_ADD]
10749QED
10750
10751Theorem SET_VARIATION_MONOTONE:
10752   !f:(real->bool)->real s t.
10753        f has_bounded_setvariation_on s /\ t SUBSET s
10754        ==> set_variation t f <= set_variation s f
10755Proof
10756  REPEAT STRIP_TAC THEN REWRITE_TAC[set_variation] THEN
10757  MATCH_MP_TAC REAL_SUP_LE_SUBSET THEN REPEAT CONJ_TAC THENL
10758   [SIMP_TAC std_ss [GSYM MEMBER_NOT_EMPTY, GSPECIFICATION] THEN
10759    MAP_EVERY EXISTS_TAC [``{}:(real->bool)->bool``] THEN
10760    REWRITE_TAC[SUM_CLAUSES] THEN EXISTS_TAC ``{}:real->bool`` THEN
10761    REWRITE_TAC[EMPTY_SUBSET, DIVISION_OF_TRIVIAL],
10762    ONCE_REWRITE_TAC [METIS []
10763     ``{sum d (\k. abs (f k)) | ?t. d division_of t /\ t SUBSET s} =
10764  {(\d. sum d (\k. abs (f k))) d | (\d. ?t. d division_of t /\ t SUBSET s) d}``] THEN
10765    MATCH_MP_TAC(SET_RULE
10766     ``(!d. P d ==> Q d) ==> {f d | P d} SUBSET {f d | Q d}``) THEN
10767    ASM_MESON_TAC[SUBSET_TRANS],
10768    SIMP_TAC std_ss [FORALL_IN_GSPEC, LEFT_IMP_EXISTS_THM] THEN
10769    ASM_REWRITE_TAC[GSYM has_bounded_setvariation_on]]
10770QED
10771
10772Theorem HAS_BOUNDED_SETVARIATION_REFLECT2_EQ_AND_SET_VARIATION_REFLECT2:
10773   (!f:(real->bool)->real s.
10774        (\k. f(IMAGE (\x. -x) k)) has_bounded_setvariation_on (IMAGE (\x. -x) s) <=>
10775        f has_bounded_setvariation_on s) /\
10776   (!f:(real->bool)->real s.
10777        set_variation (IMAGE (\x. -x) s) (\k. f(IMAGE (\x. -x) k)) =
10778        set_variation s f)
10779Proof
10780  ONCE_REWRITE_TAC [METIS [] ``(IMAGE (\x. -x) s) = (\s. (IMAGE (\x. -x) s)) s:real->bool``] THEN
10781  ONCE_REWRITE_TAC [METIS [] ``(\k. f ((\s. IMAGE (\x. -x) s) k)) =
10782                          (\f. (\k. f ((\s. IMAGE (\x. -x) s) k))) f:(real->bool)->real``] THEN
10783  MATCH_MP_TAC SETVARIATION_EQUAL_LEMMA THEN
10784  EXISTS_TAC ``IMAGE ((\x. -x):real->real)`` THEN
10785  SIMP_TAC std_ss [IMAGE_SUBSET, GSYM IMAGE_COMPOSE, o_DEF] THEN
10786  SIMP_TAC std_ss [REAL_NEG_NEG, IMAGE_ID, REFLECT_INTERVAL] THEN
10787  SIMP_TAC std_ss [ETA_AX, DIVISION_OF_REFLECT] THEN
10788  SIMP_TAC std_ss [EQ_INTERVAL, TAUT `~q /\ (p /\ q \/ r) <=> ~q /\ r`] THEN
10789  REWRITE_TAC[TAUT `p /\ q /\ r <=> r /\ q /\ p`] THEN
10790  SIMP_TAC std_ss [UNWIND_THM1, GSYM MONO_NOT_EQ] THEN
10791  SIMP_TAC std_ss [GSYM INTERVAL_EQ_EMPTY, REAL_LT_NEG] THEN
10792  METIS_TAC [ETA_AX, DIVISION_OF_REFLECT]
10793QED
10794
10795Theorem HAS_BOUNDED_SETVARIATION_REFLECT2_EQ:
10796    (!f:(real->bool)->real s.
10797        (\k. f(IMAGE (\x. -x) k)) has_bounded_setvariation_on (IMAGE (\x. -x) s) <=>
10798        f has_bounded_setvariation_on s)
10799Proof
10800  REWRITE_TAC [HAS_BOUNDED_SETVARIATION_REFLECT2_EQ_AND_SET_VARIATION_REFLECT2]
10801QED
10802
10803Theorem SET_VARIATION_REFLECT2:
10804    (!f:(real->bool)->real s.
10805        set_variation (IMAGE (\x. -x) s) (\k. f(IMAGE (\x. -x) k)) =
10806        set_variation s f)
10807Proof
10808  REWRITE_TAC [HAS_BOUNDED_SETVARIATION_REFLECT2_EQ_AND_SET_VARIATION_REFLECT2]
10809QED
10810
10811Theorem HAS_BOUNDED_SETVARIATION_TRANSLATION2_EQ_AND_SET_VARIATION_TRANSLATION2:
10812   (!a f:(real->bool)->real s.
10813          (\k. f(IMAGE (\x. a + x) k))
10814          has_bounded_setvariation_on (IMAGE (\x. -a + x) s) <=>
10815          f has_bounded_setvariation_on s) /\
10816   (!a f:(real->bool)->real s.
10817          set_variation (IMAGE (\x. -a + x) s) (\k. f(IMAGE (\x. a + x) k)) =
10818          set_variation s f)
10819Proof
10820  SIMP_TAC std_ss [GSYM FORALL_AND_THM] THEN X_GEN_TAC ``a:real`` THEN
10821  SIMP_TAC std_ss [FORALL_AND_THM] THEN
10822  ONCE_REWRITE_TAC [METIS [] ``(IMAGE (\x. -a + x) s) =
10823                          (\s. (IMAGE (\x. -a + x) s)) s:real->bool``] THEN
10824  ONCE_REWRITE_TAC [METIS [] ``(\k. f (IMAGE (\x. a + x) k)) =
10825                         (\f. ((\k. f (IMAGE (\x. a + x) k)))) (f:(real->bool)->real)``] THEN
10826  MATCH_MP_TAC SETVARIATION_EQUAL_LEMMA THEN
10827  EXISTS_TAC ``\s. IMAGE (\x:real. a + x) s`` THEN
10828  SIMP_TAC std_ss [IMAGE_SUBSET, GSYM IMAGE_COMPOSE, o_DEF] THEN
10829  REWRITE_TAC[REAL_ARITH ``a + -a + x:real = x``, IMAGE_ID,
10830              REAL_ARITH ``-a + a + x:real = x``] THEN
10831  SIMP_TAC std_ss [GSYM INTERVAL_TRANSLATION] THEN
10832  SIMP_TAC std_ss [EQ_INTERVAL, TAUT `~q /\ (p /\ q \/ r) <=> ~q /\ r`] THEN
10833  ONCE_REWRITE_TAC[TAUT `p /\ q /\ r <=> r /\ q /\ p`] THEN
10834  SIMP_TAC std_ss [UNWIND_THM1, GSYM MONO_NOT_EQ] THEN
10835  REWRITE_TAC[GSYM INTERVAL_EQ_EMPTY, REAL_LT_LADD] THEN
10836  REPEAT STRIP_TAC THEN
10837  SIMP_TAC std_ss [REAL_ARITH ``a + (-a + x) = x:real``, IMAGE_ID] THEN
10838  SIMP_TAC std_ss [REAL_ARITH ``-a + (a + x) = x:real``, IMAGE_ID] THEN
10839  (GEN_REWR_TAC (LAND_CONV o LAND_CONV) [ETA_AX] THEN
10840   ASM_SIMP_TAC std_ss [DIVISION_OF_TRANSLATION])
10841QED
10842
10843Theorem HAS_BOUNDED_SETVARIATION_TRANSLATION2_EQ:
10844   (!a f:(real->bool)->real s.
10845          (\k. f(IMAGE (\x. a + x) k))
10846          has_bounded_setvariation_on (IMAGE (\x. -a + x) s) <=>
10847          f has_bounded_setvariation_on s)
10848Proof
10849  REWRITE_TAC [HAS_BOUNDED_SETVARIATION_TRANSLATION2_EQ_AND_SET_VARIATION_TRANSLATION2]
10850QED
10851
10852Theorem SET_VARIATION_TRANSLATION2:
10853   (!a f:(real->bool)->real s.
10854          set_variation (IMAGE (\x. -a + x) s) (\k. f(IMAGE (\x. a + x) k)) =
10855          set_variation s f)
10856Proof
10857  REWRITE_TAC [HAS_BOUNDED_SETVARIATION_TRANSLATION2_EQ_AND_SET_VARIATION_TRANSLATION2]
10858QED
10859
10860Theorem HAS_BOUNDED_SETVARIATION_TRANSLATION:
10861   !f:(real->bool)->real s a.
10862        f has_bounded_setvariation_on s
10863        ==> (\k. f(IMAGE (\x. a + x) k))
10864            has_bounded_setvariation_on (IMAGE (\x. -a + x) s)
10865Proof
10866  SIMP_TAC real_ss [HAS_BOUNDED_SETVARIATION_TRANSLATION2_EQ]
10867QED
10868
10869(* ------------------------------------------------------------------------- *)
10870(* Absolute integrability (this is the same as Lebesgue integrability).      *)
10871(* ------------------------------------------------------------------------- *)
10872
10873val _ = set_fixity "absolutely_integrable_on" (Infix(NONASSOC, 450));
10874
10875Definition absolutely_integrable_on[nocompute]:
10876 f absolutely_integrable_on s <=>
10877        f integrable_on s /\ (\x. abs(f x)) integrable_on s
10878End
10879
10880Theorem ABSOLUTELY_INTEGRABLE_IMP_INTEGRABLE:
10881   !f s. f absolutely_integrable_on s ==> f integrable_on s
10882Proof
10883  SIMP_TAC std_ss [absolutely_integrable_on]
10884QED
10885
10886Theorem ABSOLUTELY_INTEGRABLE_IMP_ABS_INTEGRABLE:
10887   !f:real->real s.
10888     f absolutely_integrable_on s ==> (\x. abs (f x)) integrable_on s
10889Proof
10890  REWRITE_TAC[absolutely_integrable_on] THEN MESON_TAC[]
10891QED
10892
10893Theorem ABSOLUTELY_INTEGRABLE_LE:
10894   !f:real->real s.
10895        f absolutely_integrable_on s
10896        ==> abs(integral s f) <= (integral s (\x. abs(f x)))
10897Proof
10898  REWRITE_TAC[absolutely_integrable_on] THEN
10899  REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRAL_ABS_BOUND_INTEGRAL THEN
10900  ASM_SIMP_TAC std_ss [REAL_LE_REFL]
10901QED
10902
10903Theorem ABSOLUTELY_INTEGRABLE_ON_NULL:
10904   !f a b. (content(interval[a,b]) = &0)
10905           ==> f absolutely_integrable_on interval[a,b]
10906Proof
10907  SIMP_TAC std_ss [absolutely_integrable_on, INTEGRABLE_ON_NULL]
10908QED
10909
10910Theorem ABSOLUTELY_INTEGRABLE_0:
10911   !s. (\x. 0) absolutely_integrable_on s
10912Proof
10913  REWRITE_TAC[absolutely_integrable_on, ABS_0, INTEGRABLE_0]
10914QED
10915
10916Theorem ABSOLUTELY_INTEGRABLE_CMUL:
10917   !f s c. f absolutely_integrable_on s
10918           ==> (\x. c * f(x)) absolutely_integrable_on s
10919Proof
10920  SIMP_TAC std_ss [absolutely_integrable_on, INTEGRABLE_CMUL, ABS_MUL]
10921QED
10922
10923Theorem ABSOLUTELY_INTEGRABLE_NEG:
10924   !f s. f absolutely_integrable_on s
10925         ==> (\x. -f(x)) absolutely_integrable_on s
10926Proof
10927  SIMP_TAC std_ss [absolutely_integrable_on, INTEGRABLE_NEG, ABS_NEG]
10928QED
10929
10930Theorem ABSOLUTELY_INTEGRABLE_ABS:
10931   !f s. f absolutely_integrable_on s
10932         ==> (\x. abs(f x)) absolutely_integrable_on s
10933Proof
10934  SIMP_TAC std_ss [absolutely_integrable_on, ABS_ABS]
10935QED
10936
10937Theorem ABSOLUTELY_INTEGRABLE_ON_SUBINTERVAL:
10938   !f:real->real s a b.
10939        f absolutely_integrable_on s /\ interval[a,b] SUBSET s
10940        ==> f absolutely_integrable_on interval[a,b]
10941Proof
10942  REWRITE_TAC[absolutely_integrable_on] THEN
10943  MESON_TAC[INTEGRABLE_ON_SUBINTERVAL]
10944QED
10945
10946Theorem ABSOLUTELY_INTEGRABLE_SPIKE:
10947   !f:real->real g s t.
10948        negligible s /\ (!x. x IN t DIFF s ==> (g x = f x))
10949        ==> f absolutely_integrable_on t ==> g absolutely_integrable_on t
10950Proof
10951  REPEAT GEN_TAC THEN STRIP_TAC THEN
10952  REWRITE_TAC[absolutely_integrable_on] THEN MATCH_MP_TAC MONO_AND THEN
10953  CONJ_TAC THEN MATCH_MP_TAC INTEGRABLE_SPIKE THEN
10954  EXISTS_TAC ``s:real->bool`` THEN ASM_SIMP_TAC std_ss []
10955QED
10956
10957Theorem ABSOLUTELY_INTEGRABLE_RESTRICT_INTER:
10958   !f:real->real s t.
10959        (\x. if x IN s then f x else 0) absolutely_integrable_on t <=>
10960        f absolutely_integrable_on (s INTER t)
10961Proof
10962  SIMP_TAC std_ss [absolutely_integrable_on, GSYM INTEGRABLE_RESTRICT_INTER] THEN
10963  SIMP_TAC std_ss [COND_RAND, ABS_0]
10964QED
10965
10966Theorem HAS_ABSOLUTE_INTEGRAL :
10967   !(f :real->real) s y.
10968        f absolutely_integrable_on s /\ integral s f = y <=>
10969        f absolutely_integrable_on s /\ (f has_integral y) s
10970Proof
10971  MESON_TAC[ABSOLUTELY_INTEGRABLE_IMP_INTEGRABLE,
10972            HAS_INTEGRAL_INTEGRABLE_INTEGRAL]
10973QED
10974
10975Theorem ABSOLUTELY_INTEGRABLE_EQ:
10976   !f:real->real g s.
10977        (!x. x IN s ==> (f x = g x)) /\ f absolutely_integrable_on s
10978        ==> g absolutely_integrable_on s
10979Proof
10980  REWRITE_TAC[absolutely_integrable_on] THEN REPEAT STRIP_TAC THEN
10981  MATCH_MP_TAC INTEGRABLE_EQ THENL
10982   [EXISTS_TAC ``f:real->real``,
10983    EXISTS_TAC ``\x. abs((f:real->real) x)``] THEN
10984  ASM_SIMP_TAC std_ss []
10985QED
10986
10987Theorem ABSOLUTELY_INTEGRABLE_EQ_EQ:
10988   !f:real->real g s.
10989        (!x. x IN s ==> (f x = g x)) ==>
10990        (f absolutely_integrable_on s <=> g absolutely_integrable_on s)
10991Proof
10992  METIS_TAC [ABSOLUTELY_INTEGRABLE_EQ]
10993QED
10994
10995Theorem ABSOLUTELY_INTEGRABLE_BOUNDED_SETVARIATION:
10996   !f:real->real s.
10997        f absolutely_integrable_on s
10998        ==> (\k. integral k f) has_bounded_setvariation_on s
10999Proof
11000  REWRITE_TAC[has_bounded_setvariation_on] THEN REPEAT STRIP_TAC THEN
11001  EXISTS_TAC
11002   ``integral (s:real->bool) (\x. abs(f x:real))`` THEN
11003  X_GEN_TAC ``d:(real->bool)->bool`` THEN
11004  X_GEN_TAC ``t:real->bool`` THEN STRIP_TAC THEN
11005  SUBGOAL_THEN ``(BIGUNION d:real->bool) SUBSET s`` ASSUME_TAC THENL
11006   [METIS_TAC[SUBSET_TRANS, division_of], ALL_TAC] THEN
11007  MATCH_MP_TAC REAL_LE_TRANS THEN
11008  EXISTS_TAC
11009   ``integral (BIGUNION d) (\x. abs((f:real->real) x))`` THEN
11010  CONJ_TAC THENL
11011   [ALL_TAC,
11012    MATCH_MP_TAC INTEGRAL_SUBSET_DROP_LE THEN
11013    ASM_SIMP_TAC real_ss [ABS_POS] THEN CONJ_TAC THENL
11014     [MATCH_MP_TAC INTEGRABLE_ON_SUBDIVISION THEN
11015      EXISTS_TAC ``s:real->bool`` THEN
11016      EXISTS_TAC ``d:(real->bool)->bool`` THEN CONJ_TAC THENL
11017       [ASM_MESON_TAC[DIVISION_OF_SUBSET, division_of], ALL_TAC] THEN
11018      ASM_SIMP_TAC std_ss [],
11019      ALL_TAC] THEN
11020    MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_IMP_INTEGRABLE THEN
11021    MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_ABS THEN ASM_REWRITE_TAC[]] THEN
11022  MATCH_MP_TAC REAL_LE_TRANS THEN
11023  EXISTS_TAC
11024   ``sum d (\i. integral i (\x:real. abs(f x:real)))`` THEN
11025  CONJ_TAC THENL
11026   [FIRST_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_FINITE) THEN
11027    ASM_SIMP_TAC std_ss [] THEN MATCH_MP_TAC SUM_LE THEN
11028    ASM_REWRITE_TAC[o_THM] THEN
11029    FIRST_ASSUM(fn th => SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION th]) THEN
11030    MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``] THEN DISCH_TAC THEN
11031    MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_LE THEN
11032    MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_ON_SUBINTERVAL THEN
11033    EXISTS_TAC ``s:real->bool`` THEN METIS_TAC[division_of, SUBSET_TRANS],
11034    MATCH_MP_TAC REAL_EQ_IMP_LE THEN
11035    CONV_TAC SYM_CONV THEN MATCH_MP_TAC INTEGRAL_COMBINE_DIVISION_TOPDOWN THEN
11036    CONJ_TAC THENL [ALL_TAC, ASM_MESON_TAC[DIVISION_OF_UNION_SELF]] THEN
11037    MATCH_MP_TAC INTEGRABLE_ON_SUBDIVISION THEN
11038    MAP_EVERY EXISTS_TAC [``s:real->bool``, ``d:(real->bool)->bool``] THEN
11039    CONJ_TAC THENL [ASM_MESON_TAC[DIVISION_OF_UNION_SELF], ALL_TAC] THEN
11040    ASM_REWRITE_TAC[] THEN
11041    MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_IMP_INTEGRABLE THEN
11042    MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_ABS THEN ASM_SIMP_TAC real_ss []]
11043QED
11044
11045Theorem lemma[local]:
11046   !f:'a->real g s e.
11047        sum s (\x. abs(f x - g x)) < e
11048        ==> FINITE s
11049            ==> abs(sum s (\x. abs(f x)) - sum s (\x. abs(g x))) < e
11050Proof
11051  REPEAT GEN_TAC THEN SIMP_TAC std_ss [GSYM SUM_SUB] THEN
11052  DISCH_THEN(fn th => DISCH_TAC THEN MP_TAC th) THEN
11053  MATCH_MP_TAC(REAL_ARITH ``x <= y ==> y < e ==> x < e:real``) THEN
11054  W(MP_TAC o PART_MATCH (lhand o rand) SUM_ABS o lhand o snd) THEN
11055  ASM_SIMP_TAC std_ss [] THEN
11056  MATCH_MP_TAC(REAL_ARITH ``y <= z ==> x <= y ==> x <= z:real``) THEN
11057  MATCH_MP_TAC SUM_LE THEN ASM_SIMP_TAC std_ss [] THEN
11058  REPEAT STRIP_TAC THEN REAL_ARITH_TAC
11059QED
11060
11061Theorem BOUNDED_SETVARIATION_ABSOLUTELY_INTEGRABLE_INTERVAL :
11062    !f:real->real a b.
11063        f integrable_on interval[a,b] /\
11064        (\k. integral k f) has_bounded_setvariation_on interval[a,b]
11065        ==> f absolutely_integrable_on interval[a,b]
11066Proof
11067  REWRITE_TAC[HAS_BOUNDED_SETVARIATION_ON_INTERVAL] THEN
11068  REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[absolutely_integrable_on] THEN
11069  MP_TAC(ISPEC ``IMAGE (\d. sum d (\k. abs(integral k (f:real->real))))
11070                      {d | d division_of interval[a,b] }``
11071         SUP) THEN
11072  SIMP_TAC std_ss [FORALL_IN_IMAGE, IMAGE_EQ_EMPTY] THEN
11073  SIMP_TAC std_ss [GSYM MEMBER_NOT_EMPTY, GSPECIFICATION] THEN
11074  ABBREV_TAC
11075   ``i = sup (IMAGE (\d. sum d (\k. abs(integral k (f:real->real))))
11076                      {d | d division_of interval[a,b] })`` THEN
11077  KNOW_TAC ``(?(x :(real -> bool) -> bool).
11078    x division_of interval [((a :real),(b :real))]) /\
11079 (?(b' :real). !(d :(real -> bool) -> bool).
11080      d division_of interval [(a,b)] ==>
11081      sum d (\(k :real -> bool). abs (integral k (f :real -> real))) <=
11082      b')`` THENL
11083   [REWRITE_TAC[ELEMENTARY_INTERVAL] THEN ASM_MESON_TAC[],
11084    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
11085  STRIP_TAC THEN REWRITE_TAC[integrable_on] THEN EXISTS_TAC ``i:real`` THEN
11086  REWRITE_TAC[has_integral] THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
11087  FIRST_X_ASSUM(MP_TAC o SPEC ``i - e / &2:real``) THEN
11088  ASM_SIMP_TAC std_ss [REAL_ARITH
11089   ``&0 < e / &2 ==> ~(i <= i - e / &2:real)``, REAL_HALF] THEN
11090  SIMP_TAC std_ss [NOT_FORALL_THM, NOT_IMP, REAL_NOT_LE, LEFT_IMP_EXISTS_THM] THEN
11091  X_GEN_TAC ``d:(real->bool)->bool`` THEN STRIP_TAC THEN
11092  FIRST_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_FINITE) THEN
11093  SUBGOAL_THEN
11094   ``!x. ?e. &0 < e /\
11095            !i. i IN d /\ ~(x IN i) ==> (ball(x:real,e) INTER i = {})``
11096  MP_TAC THENL
11097   [X_GEN_TAC ``x:real`` THEN MP_TAC(ISPECL
11098     [``BIGUNION {i:real->bool | i IN d /\ ~(x IN i)}``, ``x:real``]
11099     SEPARATE_POINT_CLOSED) THEN
11100    KNOW_TAC ``(closed
11101    (BIGUNION
11102       {i | i IN (d :(real -> bool) -> bool) /\ (x :real) NOTIN i}) :
11103    bool) /\ x NOTIN BIGUNION {i | i IN d /\ x NOTIN i}`` THENL
11104     [CONJ_TAC THENL [ALL_TAC, SET_TAC[]] THEN
11105      MATCH_MP_TAC CLOSED_BIGUNION THEN
11106      ASM_SIMP_TAC std_ss [FINITE_RESTRICT, GSPECIFICATION, IMP_CONJ] THEN
11107      FIRST_ASSUM(fn t => SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION t]) THEN
11108      REWRITE_TAC[CLOSED_INTERVAL],
11109      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
11110    DISCH_THEN (X_CHOOSE_TAC ``k:real``) THEN EXISTS_TAC ``k:real`` THEN
11111    POP_ASSUM MP_TAC THEN
11112    SIMP_TAC std_ss [FORALL_IN_BIGUNION, EXTENSION, IN_INTER, NOT_IN_EMPTY, IN_BALL] THEN
11113    SIMP_TAC std_ss [GSPECIFICATION, DE_MORGAN_THM, REAL_NOT_LT] THEN MESON_TAC[],
11114    ALL_TAC] THEN
11115  SIMP_TAC std_ss [SKOLEM_THM, LEFT_IMP_EXISTS_THM, FORALL_AND_THM] THEN
11116  X_GEN_TAC ``k:real->real`` THEN STRIP_TAC THEN
11117  FIRST_ASSUM(MP_TAC o SPEC ``e / &2:real`` o MATCH_MP HENSTOCK_LEMMA) THEN
11118  ASM_REWRITE_TAC[REAL_HALF] THEN
11119  DISCH_THEN(X_CHOOSE_THEN ``g:real->real->bool`` STRIP_ASSUME_TAC) THEN
11120  EXISTS_TAC ``\x:real. g(x) INTER ball(x,k x)`` THEN CONJ_TAC THENL
11121   [ONCE_REWRITE_TAC [METIS [] ``(\x. g x INTER ball (x,k x)) =
11122                                 (\x. g x INTER (\x. ball (x,k x)) x)``] THEN
11123    MATCH_MP_TAC GAUGE_INTER THEN ASM_REWRITE_TAC[] THEN
11124    ASM_SIMP_TAC std_ss [gauge_def, CENTRE_IN_BALL, OPEN_BALL],
11125    ALL_TAC] THEN
11126  ONCE_REWRITE_TAC [METIS [] ``(\x. g x INTER ball (x,k x)) =
11127                               (\x. g x INTER (\x. ball (x,k x)) x)``] THEN
11128  REWRITE_TAC[FINE_INTER] THEN X_GEN_TAC ``p:(real#(real->bool))->bool`` THEN
11129  STRIP_TAC THEN
11130  FIRST_ASSUM(ASSUME_TAC o MATCH_MP TAGGED_DIVISION_OF_FINITE) THEN
11131  ABBREV_TAC
11132   ``p' = {(x:real,k:real->bool) |
11133                ?i l. x IN i /\ i IN d /\ (x,l) IN p /\ (k = i INTER l)}`` THEN
11134  SUBGOAL_THEN ``g FINE (p':(real#(real->bool))->bool)`` ASSUME_TAC THENL
11135   [EXPAND_TAC "p'" THEN
11136    MP_TAC(ASSUME ``g FINE (p:(real#(real->bool))->bool)``) THEN
11137    SIMP_TAC std_ss [FINE, IN_ELIM_PAIR_THM] THEN
11138    MESON_TAC[SET_RULE ``k SUBSET l ==> (i INTER k) SUBSET l``],
11139    ALL_TAC] THEN
11140  SUBGOAL_THEN ``p' tagged_division_of interval[a:real,b]`` ASSUME_TAC THENL
11141  [ (* goal 1 (of 2) *)
11142    REWRITE_TAC[TAGGED_DIVISION_OF] THEN EXPAND_TAC "p'" THEN
11143    SIMP_TAC std_ss [IN_ELIM_PAIR_THM] THEN
11144    UNDISCH_TAC ``p tagged_division_of interval [(a,b)]`` THEN DISCH_TAC THEN
11145    FIRST_ASSUM(MP_TAC o REWRITE_RULE [TAGGED_DIVISION_OF]) THEN
11146    MATCH_MP_TAC MONO_AND THEN CONJ_TAC THENL
11147     [DISCH_TAC THEN MATCH_MP_TAC FINITE_SUBSET THEN
11148      EXISTS_TAC
11149       ``IMAGE (\(k,(x,l)). x,k INTER l)
11150              {k,xl | k IN (d:(real->bool)->bool) /\
11151                      xl IN (p:(real#(real->bool))->bool)}`` THEN
11152      ASM_SIMP_TAC std_ss [IMAGE_FINITE, FINITE_PRODUCT] THEN
11153      EXPAND_TAC "p'" THEN SIMP_TAC std_ss [SUBSET_DEF, FORALL_PROD] THEN
11154      SIMP_TAC std_ss [IN_ELIM_PAIR_THM, IN_IMAGE, EXISTS_PROD, PAIR_EQ] THEN
11155      MESON_TAC[],
11156      ALL_TAC] THEN
11157    MATCH_MP_TAC MONO_AND THEN CONJ_TAC THENL
11158     [DISCH_TAC THEN MAP_EVERY X_GEN_TAC [``x:real``, ``k:real->bool``] THEN
11159      SIMP_TAC std_ss [LEFT_IMP_EXISTS_THM] THEN
11160      MAP_EVERY X_GEN_TAC [``i:real->bool``, ``l:real->bool``] THEN
11161      STRIP_TAC THEN FIRST_X_ASSUM SUBST_ALL_TAC THEN
11162      ASM_SIMP_TAC std_ss [IN_INTER] THEN CONJ_TAC THENL
11163       [MATCH_MP_TAC(SET_RULE ``l SUBSET s ==> (k INTER l) SUBSET s``) THEN
11164        ASM_MESON_TAC[],
11165        ALL_TAC] THEN
11166      FIRST_X_ASSUM(MP_TAC o SPECL [``x:real``, ``l:real->bool``]) THEN
11167      ASM_SIMP_TAC std_ss [] THEN STRIP_TAC THEN ASM_SIMP_TAC std_ss [] THEN
11168      UNDISCH_TAC ``d division_of interval [(a,b)]`` THEN DISCH_TAC THEN
11169      FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [division_of]) THEN
11170      DISCH_THEN (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
11171      DISCH_THEN (CONJUNCTS_THEN2 (MP_TAC o SPEC ``i:real->bool``) ASSUME_TAC) THEN
11172      ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
11173      ASM_REWRITE_TAC[INTER_INTERVAL] THEN MESON_TAC[],
11174      ALL_TAC] THEN
11175    MATCH_MP_TAC MONO_AND THEN CONJ_TAC THENL
11176     [DISCH_TAC THEN MAP_EVERY X_GEN_TAC
11177       [``x1:real``, ``k1:real->bool``, ``x2:real``, ``k2:real->bool``] THEN
11178      DISCH_THEN(CONJUNCTS_THEN2
11179       (X_CHOOSE_THEN ``i1:real->bool`` (X_CHOOSE_THEN ``l1:real->bool``
11180          STRIP_ASSUME_TAC)) MP_TAC) THEN
11181      ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
11182      DISCH_THEN(CONJUNCTS_THEN2
11183       (X_CHOOSE_THEN ``i2:real->bool`` (X_CHOOSE_THEN ``l2:real->bool``
11184          STRIP_ASSUME_TAC)) ASSUME_TAC) THEN
11185      ASM_REWRITE_TAC [] THEN
11186      RULE_ASSUM_TAC (REWRITE_RULE [GSYM DE_MORGAN_THM, GSYM PAIR_EQ]) THEN
11187      MATCH_MP_TAC(SET_RULE
11188       ``((interior(i1) INTER interior(i2) = {}) \/
11189         (interior(l1) INTER interior(l2) = {})) /\
11190        interior(i1 INTER l1) SUBSET interior(i1) /\
11191        interior(i2 INTER l2) SUBSET interior(i2) /\
11192        interior(i1 INTER l1) SUBSET interior(l1) /\
11193        interior(i2 INTER l2) SUBSET interior(l2)
11194        ==> (interior(i1 INTER l1) INTER interior(i2 INTER l2) = {})``) THEN
11195      SIMP_TAC std_ss [SUBSET_INTERIOR, INTER_SUBSET] THEN
11196      FIRST_X_ASSUM(MP_TAC o SPECL
11197       [``x1:real``, ``l1:real->bool``, ``x2:real``, ``l2:real->bool``]) THEN
11198      ASM_SIMP_TAC std_ss [] THEN
11199      UNDISCH_TAC ``d division_of interval [(a,b)]`` THEN DISCH_TAC THEN
11200      FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [division_of]) THEN
11201      DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
11202      DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
11203      DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
11204      DISCH_THEN(MP_TAC o SPECL [``i1:real->bool``, ``i2:real->bool``]) THEN
11205      ASM_REWRITE_TAC[] THEN
11206      UNDISCH_TAC ``((x1 :real),(i1 :real -> bool) INTER (l1 :real -> bool)) <>
11207       ((x2 :real),(k2 :real -> bool))`` THEN
11208      ASM_REWRITE_TAC[PAIR_EQ] THEN MESON_TAC[],
11209      ALL_TAC] THEN
11210    DISCH_TAC THEN MATCH_MP_TAC SUBSET_ANTISYM THEN CONJ_TAC THENL
11211     [SIMP_TAC std_ss [BIGUNION_SUBSET, GSPECIFICATION] THEN
11212      REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
11213      MATCH_MP_TAC(SET_RULE ``i SUBSET s ==> (i INTER k) SUBSET s``) THEN
11214      ASM_MESON_TAC[division_of],
11215      ALL_TAC] THEN
11216    REWRITE_TAC[SUBSET_DEF] THEN X_GEN_TAC ``y:real`` THEN DISCH_TAC THEN
11217    SIMP_TAC std_ss [IN_BIGUNION, GSPECIFICATION] THEN
11218    SIMP_TAC std_ss [GSYM LEFT_EXISTS_AND_THM, GSYM CONJ_ASSOC] THEN
11219    KNOW_TAC ``?(l :real -> bool) (x :real) (i :real -> bool) (s :real -> bool).
11220      (s = i INTER l) /\ x IN i /\  i IN (d :(real -> bool) -> bool) /\
11221      (x,l) IN (p :real # (real -> bool) -> bool) /\ (y :real) IN (i INTER l)`` THENL
11222    [ALL_TAC, METIS_TAC []] THEN
11223    SIMP_TAC std_ss [IN_INTER, UNWIND_THM2] THEN
11224    UNDISCH_TAC ``BIGUNION {k | ?x. (x:real,k) IN p} = interval [(a,b)]`` THEN
11225    DISCH_TAC THEN
11226    FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [EXTENSION]) THEN
11227    DISCH_THEN(MP_TAC o SPEC ``y:real``) THEN ASM_REWRITE_TAC[] THEN
11228    SIMP_TAC std_ss [IN_BIGUNION, GSPECIFICATION, GSYM RIGHT_EXISTS_AND_THM] THEN
11229    DISCH_THEN (X_CHOOSE_THEN ``l:real->bool`` (X_CHOOSE_TAC ``x:real``)) THEN
11230    EXISTS_TAC ``l:real->bool`` THEN EXISTS_TAC ``x:real`` THEN POP_ASSUM MP_TAC THEN
11231    STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
11232    UNDISCH_TAC ``d division_of interval [(a,b)]`` THEN DISCH_TAC THEN
11233    FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [division_of]) THEN
11234    DISCH_THEN (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
11235    DISCH_THEN (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
11236    DISCH_THEN (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
11237    REWRITE_TAC[EXTENSION] THEN DISCH_THEN(MP_TAC o SPEC ``y:real``) THEN
11238    ASM_REWRITE_TAC[IN_BIGUNION] THEN
11239    DISCH_THEN (X_CHOOSE_TAC ``k:real->bool``) THEN EXISTS_TAC ``k:real->bool`` THEN
11240    POP_ASSUM MP_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
11241    FIRST_X_ASSUM(MP_TAC o SPECL [``x:real``, ``k:real->bool``]) THEN
11242    GEN_REWR_TAC LAND_CONV [MONO_NOT_EQ] THEN
11243    ASM_REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN
11244    REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN
11245    EXISTS_TAC ``y:real`` THEN ASM_SIMP_TAC std_ss [INTER_DEF, GSPECIFICATION] THEN
11246    UNDISCH_TAC ``(\x:real. ball (x,k x)) FINE p`` THEN
11247    REWRITE_TAC[FINE, SUBSET_DEF] THEN ASM_MESON_TAC[],
11248    ALL_TAC] THEN
11249  FIRST_X_ASSUM(MP_TAC o SPEC ``p':(real#(real->bool))->bool``) THEN
11250  ASM_REWRITE_TAC[] THEN
11251  KNOW_TAC ``p' tagged_partial_division_of interval [(a,b)]`` THENL
11252  [ASM_MESON_TAC[tagged_division_of],
11253   DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
11254  FIRST_ASSUM(ASSUME_TAC o MATCH_MP TAGGED_DIVISION_OF_FINITE) THEN
11255  SIMP_TAC std_ss [LAMBDA_PAIR] THEN
11256  ONCE_REWRITE_TAC [METIS []
11257   ``(\p. abs (content (SND p) * f (FST p) - integral (SND p) f)) =
11258     (\p. abs ((\p. content (SND p) * f (FST p)) p - (\p. integral (SND p) f) p))``] THEN
11259  DISCH_THEN(MP_TAC o MATCH_MP lemma) THEN
11260  ASM_SIMP_TAC std_ss [o_DEF, SUM_SUB] THEN
11261  SIMP_TAC std_ss [LAMBDA_PROD, ABS_MUL] THEN
11262  GEN_REWR_TAC (RAND_CONV o RAND_CONV) [GSYM REAL_HALF] THEN
11263  MATCH_MP_TAC(REAL_ARITH
11264    ``!sni. i - e / &2 < sni /\
11265           sni' <= i /\ sni <= sni' /\ (sf' = sf)
11266              ==> abs(sf' - sni') < e / &2
11267                  ==> abs(sf - i) < e / 2 + e / 2:real``) THEN
11268  EXISTS_TAC ``sum d (\k. abs (integral k (f:real->real)))`` THEN
11269  ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
11270   [MP_TAC(ISPECL [``\k. abs(integral k (f:real->real))``,
11271                   ``p':(real#(real->bool))->bool``,
11272                   ``interval[a:real,b]``] SUM_OVER_TAGGED_DIVISION_LEMMA) THEN
11273    ASM_SIMP_TAC std_ss [INTEGRAL_NULL, ABS_0] THEN DISCH_THEN SUBST1_TAC THEN
11274    FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_MESON_TAC[DIVISION_OF_TAGGED_DIVISION],
11275    ALL_TAC] THEN
11276  SUBGOAL_THEN
11277   ``p' = {x:real,(i INTER l:real->bool) |
11278            (x,l) IN p /\ i IN d /\ ~(i INTER l = {})}``
11279  (ASSUME_TAC) THENL
11280  [ EXPAND_TAC "p'" THEN GEN_REWR_TAC I [EXTENSION] THEN
11281    SIMP_TAC std_ss [FORALL_PROD, IN_ELIM_PAIR_THM] THEN
11282    SIMP_TAC std_ss [GSPECIFICATION, EXISTS_PROD] THEN
11283    MAP_EVERY X_GEN_TAC [``x:real``, ``k':real->bool``] THEN
11284    SIMP_TAC std_ss [PAIR_EQ, GSYM CONJ_ASSOC] THEN
11285    AP_TERM_TAC THEN GEN_REWR_TAC I [FUN_EQ_THM] THEN
11286    X_GEN_TAC ``i':real->bool`` THEN SIMP_TAC std_ss [] THEN
11287    GEN_REWR_TAC (RAND_CONV o ONCE_DEPTH_CONV)
11288     [TAUT `A /\ B /\ C /\ D <=> B /\ C /\ D /\ A`] THEN
11289    AP_TERM_TAC THEN GEN_REWR_TAC I [FUN_EQ_THM] THEN
11290    X_GEN_TAC ``l:real->bool`` THEN SIMP_TAC std_ss [] THEN
11291    ASM_CASES_TAC ``k':real->bool = i' INTER l`` THEN ASM_SIMP_TAC real_ss [] THEN
11292    ASM_SIMP_TAC std_ss [IN_INTER, GSYM MEMBER_NOT_EMPTY] THEN
11293    EQ_TAC THENL [METIS_TAC[TAGGED_DIVISION_OF], ALL_TAC] THEN
11294    REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
11295    DISCH_THEN(X_CHOOSE_THEN ``y:real`` STRIP_ASSUME_TAC) THEN
11296    ASM_REWRITE_TAC[] THEN
11297    FIRST_X_ASSUM(MP_TAC o SPECL [``x:real``, ``i':real->bool``]) THEN
11298    GEN_REWR_TAC LAND_CONV [MONO_NOT_EQ] THEN
11299    ASM_REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN
11300    REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN
11301    EXISTS_TAC ``y:real`` THEN ASM_SIMP_TAC std_ss [INTER_DEF, GSPECIFICATION] THEN
11302    UNDISCH_TAC ``(\x:real. ball (x,k x)) FINE p`` THEN
11303    REWRITE_TAC[FINE, SUBSET_DEF] THEN ASM_MESON_TAC[],
11304    ALL_TAC] THEN
11305  CONJ_TAC THENL
11306   [MP_TAC(ISPECL
11307     [``\y. abs(integral y (f:real->real))``,
11308      ``p':(real#(real->bool))->bool``,
11309      ``interval[a:real,b]``]
11310     SUM_OVER_TAGGED_DIVISION_LEMMA) THEN
11311    ASM_SIMP_TAC std_ss [INTEGRAL_NULL, ABS_0] THEN DISCH_THEN SUBST1_TAC THEN
11312    MATCH_MP_TAC REAL_LE_TRANS THEN
11313    EXISTS_TAC ``sum {i INTER l | i IN d /\
11314                 (l IN IMAGE SND (p:(real#(real->bool))->bool))}
11315                    (\k. abs(integral k (f:real->real)))`` THEN
11316    CONJ_TAC THENL
11317     [ALL_TAC,
11318      MATCH_MP_TAC REAL_EQ_IMP_LE THEN MATCH_MP_TAC SUM_SUPERSET THEN
11319      CONJ_TAC THENL
11320       [SIMP_TAC std_ss [SUBSET_DEF, FORALL_IN_IMAGE] THEN
11321        SIMP_TAC std_ss [FORALL_PROD] THEN
11322        SIMP_TAC std_ss [GSPECIFICATION, IN_IMAGE, PAIR_EQ, EXISTS_PROD] THEN
11323        MESON_TAC[],
11324        ALL_TAC] THEN
11325      SIMP_TAC std_ss [GSPECIFICATION, GSYM LEFT_EXISTS_AND_THM, LEFT_IMP_EXISTS_THM,
11326        EXISTS_PROD] THEN MAP_EVERY X_GEN_TAC [``i:real->bool``, ``l:real->bool``] THEN
11327      SIMP_TAC std_ss [IN_IMAGE, EXISTS_PROD, UNWIND_THM1] THEN
11328      DISCH_THEN(CONJUNCTS_THEN2
11329       (CONJUNCTS_THEN2 ASSUME_TAC (X_CHOOSE_TAC ``x:real``)) MP_TAC) THEN
11330      SIMP_TAC std_ss [GSPECIFICATION, PAIR_EQ, NOT_EXISTS_THM, EXISTS_PROD] THEN
11331      DISCH_THEN(MP_TAC o SPECL
11332       [``x:real``, ``i:real->bool``, ``l:real->bool``]) THEN
11333      ASM_SIMP_TAC std_ss [INTEGRAL_EMPTY, ABS_0]] THEN
11334    SUBGOAL_THEN
11335     ``{k INTER l | k IN d /\ l IN IMAGE SND (p:(real#(real->bool))->bool)} =
11336      IMAGE (\(k,l). k INTER l) {k,l | k IN d /\ l IN IMAGE SND p}``
11337    SUBST1_TAC THENL
11338     [GEN_REWR_TAC I [EXTENSION] THEN
11339      SIMP_TAC std_ss [GSPECIFICATION, IN_IMAGE, EXISTS_PROD, FORALL_PROD],
11340      ALL_TAC] THEN
11341    W(MP_TAC o PART_MATCH (lhand o rand) SUM_IMAGE_NONZERO o rand o snd) THEN
11342    KNOW_TAC ``FINITE
11343   {(k,l) |
11344    k IN (d :(real -> bool) -> bool) /\
11345    l IN IMAGE (SND :real # (real -> bool) -> real -> bool)
11346      (p :real # (real -> bool) -> bool)} /\ (!(x :(real -> bool) # (real -> bool))
11347     (y :(real -> bool) # (real -> bool)). x IN {(k,l) | k IN d /\
11348     l IN IMAGE (SND :real # (real -> bool) -> real -> bool) p} /\
11349     y IN {(k,l) | k IN d /\
11350     l IN IMAGE (SND :real # (real -> bool) -> real -> bool) p} /\ x <> y /\
11351    ((\((k :real -> bool),(l :real -> bool)). k INTER l) x =
11352     (\((k :real -> bool),(l :real -> bool)). k INTER l) y) ==>
11353    ((\(k :real -> bool). abs (integral k (f :real -> real)))
11354       ((\((k :real -> bool),(l :real -> bool)). k INTER l) x) = (0 : real)))`` THENL
11355     [ASSUME_TAC(MATCH_MP DIVISION_OF_TAGGED_DIVISION
11356        (ASSUME ``p tagged_division_of interval[a:real,b]``)) THEN
11357      ASM_SIMP_TAC std_ss [FINITE_PRODUCT, IMAGE_FINITE] THEN
11358      SIMP_TAC std_ss [FORALL_PROD, IN_ELIM_PAIR_THM] THEN
11359      MAP_EVERY X_GEN_TAC
11360       [``l1:real->bool``, ``k1:real->bool``,
11361        ``l2:real->bool``, ``k2:real->bool``] THEN
11362      REWRITE_TAC [GSYM DE_MORGAN_THM] THEN STRIP_TAC THEN
11363      SUBGOAL_THEN ``interior(l2 INTER k2:real->bool) = {}`` MP_TAC THENL
11364       [ALL_TAC,
11365        MP_TAC(ASSUME ``d division_of interval[a:real,b]``) THEN
11366        REWRITE_TAC[division_of] THEN
11367        DISCH_THEN (CONJUNCTS_THEN2 K_TAC MP_TAC) THEN
11368        DISCH_THEN (CONJUNCTS_THEN2 (MP_TAC o SPEC ``l2:real->bool``) K_TAC) THEN
11369        ASM_REWRITE_TAC[] THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
11370        MP_TAC(ASSUME
11371         ``(IMAGE SND (p:(real#(real->bool))->bool))
11372                division_of interval[a:real,b]``) THEN
11373        REWRITE_TAC[division_of] THEN
11374        DISCH_THEN (CONJUNCTS_THEN2 K_TAC MP_TAC) THEN
11375        DISCH_THEN (CONJUNCTS_THEN2 (MP_TAC o SPEC ``k2:real->bool``) K_TAC) THEN
11376        ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
11377        ASM_REWRITE_TAC[INTER_INTERVAL] THEN DISCH_TAC THEN
11378        REWRITE_TAC[ABS_ZERO] THEN
11379        MATCH_MP_TAC INTEGRAL_NULL THEN
11380        ASM_REWRITE_TAC[CONTENT_EQ_0_INTERIOR]] THEN
11381      MATCH_MP_TAC(SET_RULE
11382       ``((interior(k1) INTER interior(k2) = {}) \/
11383          (interior(l1) INTER interior(l2) = {})) /\
11384        interior(l1 INTER k1) SUBSET interior(k1) /\
11385        interior(l2 INTER k2) SUBSET interior(k2) /\
11386        interior(l1 INTER k1) SUBSET interior(l1) /\
11387        interior(l2 INTER k2) SUBSET interior(l2) /\
11388        (interior(l1 INTER k1) = interior(l2 INTER k2))
11389        ==> (interior(l2 INTER k2) = {})``) THEN
11390      SIMP_TAC std_ss [SUBSET_INTERIOR, INTER_SUBSET] THEN ASM_REWRITE_TAC[] THEN
11391      MP_TAC(ASSUME ``d division_of interval[a:real,b]``) THEN
11392      REWRITE_TAC[division_of] THEN
11393      DISCH_THEN (CONJUNCTS_THEN2 K_TAC MP_TAC) THEN
11394      DISCH_THEN (CONJUNCTS_THEN2 K_TAC MP_TAC) THEN
11395      DISCH_THEN (CONJUNCTS_THEN2 MP_TAC K_TAC) THEN
11396      DISCH_THEN(MP_TAC o SPECL [``l1:real->bool``, ``l2:real->bool``]) THEN
11397      ASM_REWRITE_TAC[] THEN
11398      MP_TAC(ASSUME
11399       ``(IMAGE SND (p:(real#(real->bool))->bool))
11400              division_of interval[a:real,b]``) THEN
11401      REWRITE_TAC[division_of] THEN
11402      DISCH_THEN (CONJUNCTS_THEN2 K_TAC MP_TAC) THEN
11403      DISCH_THEN (CONJUNCTS_THEN2 K_TAC MP_TAC) THEN
11404      DISCH_THEN (CONJUNCTS_THEN2 MP_TAC K_TAC) THEN
11405      DISCH_THEN(MP_TAC o SPECL [``k1:real->bool``, ``k2:real->bool``]) THEN
11406      ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[],
11407      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
11408    DISCH_THEN SUBST1_TAC THEN
11409    GEN_REWR_TAC (RAND_CONV o RAND_CONV) [GSYM ETA_AX] THEN
11410    GEN_REWR_TAC (RAND_CONV o RAND_CONV) [LAMBDA_PROD] THEN
11411    ASM_SIMP_TAC std_ss [GSYM SUM_SUM_PRODUCT, IMAGE_FINITE] THEN
11412    MATCH_MP_TAC SUM_LE THEN ASM_REWRITE_TAC[] THEN
11413    X_GEN_TAC ``k:real->bool`` THEN DISCH_TAC THEN REWRITE_TAC[o_DEF] THEN
11414    MATCH_MP_TAC REAL_LE_TRANS THEN
11415    EXISTS_TAC
11416     ``sum { k INTER l |
11417             l IN IMAGE SND (p:(real#(real->bool))->bool)}
11418          (\k. abs(integral k (f:real->real)))`` THEN
11419    CONJ_TAC THENL
11420     [ALL_TAC,
11421      SIMP_TAC real_ss [GSYM IMAGE_DEF] THEN
11422      W(MP_TAC o PART_MATCH (lhs o rand) SUM_IMAGE_NONZERO o lhand o snd) THEN
11423      KNOW_TAC ``FINITE (IMAGE (SND :real # (real -> bool) -> real -> bool)
11424        (p :real # (real -> bool) -> bool)) /\
11425       (!(x :real -> bool) (y :real -> bool).
11426         x IN IMAGE (SND :real # (real -> bool) -> real -> bool) p /\
11427         y IN IMAGE (SND :real # (real -> bool) -> real -> bool) p /\ x <> y /\
11428      ((\(l :real -> bool). (k :real -> bool) INTER l) x =
11429       (\(l :real -> bool). k INTER l) y) ==>
11430      ((\(k :real -> bool). abs (integral k (f :real -> real)))
11431       ((\(l :real -> bool). k INTER l) x) = (0 : real)))`` THENL
11432      [ALL_TAC, DISCH_TAC THEN ASM_REWRITE_TAC [] THEN
11433       SIMP_TAC std_ss [o_DEF, REAL_LE_REFL]] THEN
11434      ASM_SIMP_TAC std_ss [IMAGE_FINITE] THEN
11435      MAP_EVERY X_GEN_TAC [``k1:real->bool``, ``k2:real->bool``] THEN
11436      STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
11437      SUBGOAL_THEN ``interior(k INTER k2:real->bool) = {}`` MP_TAC THENL
11438       [ALL_TAC,
11439        MP_TAC(MATCH_MP DIVISION_OF_TAGGED_DIVISION
11440         (ASSUME ``p tagged_division_of interval[a:real,b]``)) THEN
11441        MP_TAC(ASSUME ``d division_of interval[a:real,b]``) THEN
11442        REWRITE_TAC[division_of] THEN
11443        DISCH_THEN (CONJUNCTS_THEN2 K_TAC MP_TAC) THEN
11444        DISCH_THEN (CONJUNCTS_THEN2 MP_TAC K_TAC) THEN
11445        DISCH_THEN(MP_TAC o SPEC ``k:real->bool``) THEN
11446        ASM_REWRITE_TAC[] THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
11447        DISCH_THEN (CONJUNCTS_THEN2 K_TAC MP_TAC) THEN
11448        DISCH_THEN (CONJUNCTS_THEN2 MP_TAC K_TAC) THEN
11449        DISCH_THEN(MP_TAC o SPEC ``k2:real->bool``) THEN
11450        ASM_SIMP_TAC std_ss [INTER_INTERVAL, GSYM CONTENT_EQ_0_INTERIOR] THEN
11451        STRIP_TAC THEN ASM_REWRITE_TAC[INTER_INTERVAL] THEN
11452        SIMP_TAC std_ss [GSYM CONTENT_EQ_0_INTERIOR, INTEGRAL_NULL, ABS_0]] THEN
11453      MATCH_MP_TAC(SET_RULE
11454       ``interior(k INTER k2) SUBSET interior(k1 INTER k2) /\
11455        (interior(k1 INTER k2) = {})
11456        ==> (interior(k INTER k2) = {})``) THEN
11457      CONJ_TAC THENL
11458       [MATCH_MP_TAC SUBSET_INTERIOR THEN ASM_SET_TAC[], ALL_TAC] THEN
11459      MP_TAC(MATCH_MP DIVISION_OF_TAGGED_DIVISION
11460         (ASSUME ``p tagged_division_of interval[a:real,b]``)) THEN
11461      REWRITE_TAC[division_of] THEN
11462      DISCH_THEN (CONJUNCTS_THEN2 K_TAC MP_TAC) THEN
11463      DISCH_THEN (CONJUNCTS_THEN2 K_TAC MP_TAC) THEN
11464      DISCH_THEN (CONJUNCTS_THEN2 MP_TAC K_TAC) THEN
11465      REWRITE_TAC[INTERIOR_INTER] THEN DISCH_THEN MATCH_MP_TAC THEN
11466      ASM_REWRITE_TAC[]] THEN
11467    SUBGOAL_THEN ``?u v:real. k = interval[u,v]``
11468     (REPEAT_TCL CHOOSE_THEN SUBST_ALL_TAC)
11469    THENL [ASM_MESON_TAC[division_of], ALL_TAC] THEN
11470    SUBGOAL_THEN ``interval[u:real,v] SUBSET interval[a,b]`` ASSUME_TAC THENL
11471     [ASM_MESON_TAC[division_of], ALL_TAC] THEN SIMP_TAC std_ss [] THEN
11472    ABBREV_TAC ``d' =
11473        {interval[u,v] INTER l |l|
11474                l IN IMAGE SND (p:(real#(real->bool))->bool) /\
11475                ~(interval[u,v] INTER l = {})}`` THEN
11476    MATCH_MP_TAC REAL_LE_TRANS THEN
11477    EXISTS_TAC
11478     ``sum d' (\k. abs (integral k (f:real->real)))`` THEN
11479    CONJ_TAC THENL
11480     [ALL_TAC,
11481      MATCH_MP_TAC REAL_EQ_IMP_LE THEN CONV_TAC SYM_CONV THEN
11482      MATCH_MP_TAC SUM_SUPERSET THEN
11483      EXPAND_TAC "d'" THEN REWRITE_TAC[SUBSET_DEF, SET_RULE
11484       ``a IN {f x |x| x IN s /\ ~(f x = b)} <=>
11485        a IN {f x | x IN s} /\ ~(a = b)``] THEN
11486      SIMP_TAC std_ss [IMP_CONJ, INTEGRAL_EMPTY, ABS_0]] THEN
11487    SIMP_TAC std_ss [] THEN
11488    SUBGOAL_THEN ``d' division_of interval[u:real,v]`` ASSUME_TAC THENL
11489     [EXPAND_TAC "d'" THEN MATCH_MP_TAC DIVISION_INTER_1 THEN
11490      EXISTS_TAC ``interval[a:real,b]`` THEN
11491      ASM_SIMP_TAC std_ss [DIVISION_OF_TAGGED_DIVISION],
11492      ALL_TAC] THEN
11493    MATCH_MP_TAC REAL_LE_TRANS THEN
11494    EXISTS_TAC ``abs(sum d' (\i. integral i (f:real->real)))`` THEN
11495    CONJ_TAC THENL
11496     [MATCH_MP_TAC REAL_EQ_IMP_LE THEN AP_TERM_TAC THEN
11497      MATCH_MP_TAC INTEGRAL_COMBINE_DIVISION_TOPDOWN THEN
11498      ASM_MESON_TAC[INTEGRABLE_ON_SUBINTERVAL],
11499      ALL_TAC] THEN
11500    MATCH_MP_TAC SUM_ABS_LE THEN
11501    SIMP_TAC std_ss [REAL_LE_REFL] THEN METIS_TAC[division_of],
11502    ALL_TAC] THEN
11503  FIRST_X_ASSUM SUBST_ALL_TAC THEN
11504  MATCH_MP_TAC EQ_TRANS THEN
11505  EXISTS_TAC ``sum {x,i INTER l | (x,l) IN p /\ i IN d}
11506                  (\(x,k:real->bool).
11507                      abs(content k) * abs((f:real->real) x))`` THEN
11508  CONJ_TAC THENL
11509   [CONV_TAC SYM_CONV THEN MATCH_MP_TAC SUM_SUPERSET THEN
11510    CONJ_TAC THENL [SET_TAC[], ALL_TAC] THEN
11511    SIMP_TAC std_ss [FORALL_PROD] THEN
11512    MAP_EVERY X_GEN_TAC [``x:real``, ``i:real->bool``] THEN
11513    ASM_CASES_TAC ``i:real->bool = {}`` THEN
11514    ASM_SIMP_TAC std_ss [CONTENT_EMPTY, ABS_N, REAL_MUL_LZERO] THEN
11515    MATCH_MP_TAC(TAUT `(a <=> b) ==> a /\ ~b ==> c`) THEN
11516    SIMP_TAC std_ss [GSPECIFICATION, EXISTS_PROD] THEN
11517    REPEAT(AP_TERM_TAC THEN ABS_TAC) THEN
11518    SIMP_TAC std_ss [PAIR_EQ] THEN ASM_MESON_TAC[],
11519    ALL_TAC] THEN
11520  SUBGOAL_THEN
11521   ``{(x,i INTER l) | (x,l) IN (p:(real#(real->bool))->bool) /\ i IN d} =
11522    IMAGE (\((x,l),k). (x,k INTER l)) {(m,k) | m IN p /\ k IN d}``
11523  SUBST1_TAC THENL
11524   [GEN_REWR_TAC I [EXTENSION] THEN
11525    SIMP_TAC std_ss [GSPECIFICATION, IN_IMAGE, EXISTS_PROD, FORALL_PROD] THEN
11526    SIMP_TAC std_ss [PAIR_EQ] THEN METIS_TAC [],
11527    ALL_TAC] THEN
11528  W(MP_TAC o PART_MATCH (lhand o rand) SUM_IMAGE_NONZERO o lhand o snd) THEN
11529  KNOW_TAC ``FINITE
11530   {(m,k) | m IN (p :real # (real -> bool) -> bool) /\
11531    k IN (d :(real -> bool) -> bool)} /\
11532   (!(x :(real # (real -> bool)) # (real -> bool))
11533     (y :(real # (real -> bool)) # (real -> bool)).
11534    x IN {(m,k) | m IN p /\ k IN d} /\
11535    y IN {(m,k) | m IN p /\ k IN d} /\ x <> y /\
11536    ((\(((x :real),(l :real -> bool)),(k :real -> bool)). (x,k INTER l))
11537       x = (\(((x :real),(l :real -> bool)),(k :real -> bool)). (x,k INTER l)) y) ==>
11538    ((\((x :real),(k :real -> bool)).
11539        abs (content k) * abs ((f :real -> real) x))
11540       ((\(((x :real),(l :real -> bool)),(k :real -> bool)).
11541           (x,k INTER l)) x) = (0 : real)))`` THENL
11542   [ASM_SIMP_TAC std_ss [FINITE_PRODUCT] THEN
11543    SIMP_TAC std_ss [FORALL_PROD, IN_ELIM_PAIR_THM] THEN
11544    MAP_EVERY X_GEN_TAC
11545     [``x1:real``, ``l1:real->bool``, ``k1:real->bool``,
11546      ``l2:real->bool``, ``k2:real->bool``] THEN
11547    SIMP_TAC std_ss [PAIR_EQ] THEN REWRITE_TAC [GSYM DE_MORGAN_THM] THEN
11548    STRIP_TAC THEN
11549    REWRITE_TAC[REAL_ENTIRE] THEN DISJ1_TAC THEN
11550    REWRITE_TAC[ABS_ZERO] THEN
11551    SUBGOAL_THEN ``interior(k2 INTER l2:real->bool) = {}`` MP_TAC THENL
11552     [ALL_TAC,
11553      UNDISCH_TAC ``d division_of interval [(a,b)]`` THEN DISCH_TAC THEN
11554      FIRST_ASSUM(MP_TAC o REWRITE_RULE [division_of]) THEN
11555      DISCH_THEN (CONJUNCTS_THEN2 K_TAC MP_TAC) THEN
11556      DISCH_THEN (CONJUNCTS_THEN2 MP_TAC K_TAC) THEN
11557      DISCH_THEN(MP_TAC o SPEC ``k2:real->bool``) THEN
11558      ASM_REWRITE_TAC[] THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
11559      MP_TAC(ASSUME ``p tagged_division_of interval[a:real,b]``) THEN
11560      REWRITE_TAC[TAGGED_DIVISION_OF] THEN
11561      DISCH_THEN (CONJUNCTS_THEN2 K_TAC MP_TAC) THEN
11562      DISCH_THEN (CONJUNCTS_THEN2 MP_TAC K_TAC) THEN
11563      DISCH_THEN(MP_TAC o SPECL [``x1:real``, ``l2:real->bool``]) THEN
11564      ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
11565      ASM_SIMP_TAC std_ss [INTER_INTERVAL, CONTENT_EQ_0_INTERIOR]] THEN
11566    MATCH_MP_TAC(SET_RULE
11567     ``((interior(k1) INTER interior(k2) = {}) \/
11568        (interior(l1) INTER interior(l2) = {})) /\
11569      interior(k1 INTER l1) SUBSET interior(k1) /\
11570      interior(k2 INTER l2) SUBSET interior(k2) /\
11571      interior(k1 INTER l1) SUBSET interior(l1) /\
11572      interior(k2 INTER l2) SUBSET interior(l2) /\
11573      (interior(k1 INTER l1) = interior(k2 INTER l2))
11574      ==> (interior(k2 INTER l2) = {})``) THEN
11575    SIMP_TAC std_ss [SUBSET_INTERIOR, INTER_SUBSET] THEN ASM_REWRITE_TAC[] THEN
11576    UNDISCH_TAC ``d division_of interval [(a,b)]`` THEN DISCH_TAC THEN
11577    FIRST_ASSUM(MP_TAC o REWRITE_RULE [division_of]) THEN
11578    DISCH_THEN (CONJUNCTS_THEN2 K_TAC MP_TAC) THEN
11579    DISCH_THEN (CONJUNCTS_THEN2 K_TAC MP_TAC) THEN
11580    DISCH_THEN (CONJUNCTS_THEN2 MP_TAC K_TAC) THEN
11581    DISCH_THEN(MP_TAC o SPECL [``k1:real->bool``, ``k2:real->bool``]) THEN
11582    MP_TAC(ASSUME ``p tagged_division_of interval[a:real,b]``) THEN
11583    REWRITE_TAC[TAGGED_DIVISION_OF] THEN
11584    DISCH_THEN (CONJUNCTS_THEN2 K_TAC MP_TAC) THEN
11585    DISCH_THEN (CONJUNCTS_THEN2 K_TAC MP_TAC) THEN
11586    DISCH_THEN (CONJUNCTS_THEN2 MP_TAC K_TAC) THEN
11587    DISCH_THEN(MP_TAC o SPECL
11588     [``x1:real``, ``l1:real->bool``, ``x1:real``, ``l2:real->bool``]) THEN
11589    ASM_SIMP_TAC std_ss [PAIR_EQ] THEN ASM_MESON_TAC[],
11590    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
11591  DISCH_THEN SUBST1_TAC THEN
11592  GEN_REWR_TAC (LAND_CONV o RAND_CONV) [GSYM ETA_AX] THEN
11593  GEN_REWR_TAC (LAND_CONV o RAND_CONV) [LAMBDA_PROD] THEN
11594  ASM_SIMP_TAC std_ss [GSYM SUM_SUM_PRODUCT] THEN
11595  MATCH_MP_TAC SUM_EQ THEN SIMP_TAC std_ss [FORALL_PROD] THEN
11596  MAP_EVERY X_GEN_TAC [``x:real``, ``l:real->bool``] THEN
11597  DISCH_TAC THEN SIMP_TAC std_ss [o_THM, SUM_RMUL] THEN
11598  AP_THM_TAC THEN AP_TERM_TAC THEN
11599  SUBGOAL_THEN ``?u v:real. l = interval[u,v]``
11600   (REPEAT_TCL CHOOSE_THEN SUBST_ALL_TAC)
11601  THENL [ASM_MESON_TAC[TAGGED_DIVISION_OF], ALL_TAC] THEN
11602  MATCH_MP_TAC EQ_TRANS THEN
11603  EXISTS_TAC ``sum d (\k. content(k INTER interval[u:real,v]))`` THEN
11604  CONJ_TAC THENL
11605   [MATCH_MP_TAC SUM_EQ THEN REWRITE_TAC[abs] THEN
11606    X_GEN_TAC ``k:real->bool`` THEN DISCH_TAC THEN
11607    SUBGOAL_THEN ``?w z:real. k = interval[w,z]``
11608      (REPEAT_TCL CHOOSE_THEN SUBST_ALL_TAC)
11609    THENL [ASM_MESON_TAC[division_of], ALL_TAC] THEN
11610    SIMP_TAC std_ss [INTER_INTERVAL, CONTENT_POS_LE],
11611    ALL_TAC] THEN
11612  MATCH_MP_TAC EQ_TRANS THEN
11613  EXISTS_TAC ``sum {k INTER interval[u:real,v] | k IN d} content`` THEN
11614  CONJ_TAC THENL
11615   [SIMP_TAC real_ss [GSYM IMAGE_DEF] THEN SIMP_TAC std_ss [GSYM o_DEF] THEN
11616    CONV_TAC SYM_CONV THEN MATCH_MP_TAC SUM_IMAGE_NONZERO THEN
11617    ASM_SIMP_TAC std_ss [] THEN
11618    MAP_EVERY X_GEN_TAC [``k1:real->bool``, ``k2:real->bool``] THEN
11619    STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
11620    SUBGOAL_THEN ``interior(k2 INTER interval[u:real,v]) = {}`` MP_TAC THENL
11621     [ALL_TAC,
11622      UNDISCH_TAC ``d division_of interval [(a,b)]`` THEN DISCH_TAC THEN
11623      FIRST_ASSUM(MP_TAC o REWRITE_RULE [division_of]) THEN
11624      DISCH_THEN (CONJUNCTS_THEN2 K_TAC MP_TAC) THEN
11625      DISCH_THEN (CONJUNCTS_THEN2 MP_TAC K_TAC) THEN
11626      DISCH_THEN(MP_TAC o SPEC ``k2:real->bool``) THEN
11627      ASM_REWRITE_TAC[] THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
11628      ASM_REWRITE_TAC[INTER_INTERVAL, CONTENT_EQ_0_INTERIOR]] THEN
11629    MATCH_MP_TAC(SET_RULE
11630     ``interior(k2 INTER i) SUBSET interior(k1 INTER k2) /\
11631      (interior(k1 INTER k2) = {})
11632      ==> (interior(k2 INTER i) = {})``) THEN
11633    CONJ_TAC THENL
11634     [MATCH_MP_TAC SUBSET_INTERIOR THEN ASM_SET_TAC[], ALL_TAC] THEN
11635    UNDISCH_TAC ``d division_of interval [(a,b)]`` THEN DISCH_TAC THEN
11636    FIRST_ASSUM(MP_TAC o REWRITE_RULE [division_of]) THEN
11637    DISCH_THEN (CONJUNCTS_THEN2 K_TAC MP_TAC) THEN
11638    DISCH_THEN (CONJUNCTS_THEN2 K_TAC MP_TAC) THEN
11639    DISCH_THEN (CONJUNCTS_THEN2 MP_TAC K_TAC) THEN
11640    SIMP_TAC std_ss [INTERIOR_INTER] THEN DISCH_THEN MATCH_MP_TAC THEN
11641    ASM_REWRITE_TAC[],
11642    ALL_TAC] THEN
11643  SUBGOAL_THEN ``interval[u:real,v] SUBSET interval[a,b]`` ASSUME_TAC THENL
11644   [ASM_MESON_TAC[TAGGED_DIVISION_OF], ALL_TAC] THEN
11645  MATCH_MP_TAC EQ_TRANS THEN
11646  EXISTS_TAC ``sum {k INTER interval[u:real,v] |k|
11647                      k IN d /\ ~(k INTER interval[u,v] = {})} content`` THEN
11648  CONJ_TAC THENL
11649   [MATCH_MP_TAC SUM_SUPERSET THEN
11650    SIMP_TAC std_ss [SUBSET_DEF, SET_RULE
11651     ``a IN {f x |x| x IN s /\ ~(f x = b)} <=>
11652       a IN {f x | x IN s} /\ ~(a = b)``] THEN
11653    SIMP_TAC std_ss [IMP_CONJ, CONTENT_EMPTY],
11654    ALL_TAC] THEN
11655  MATCH_MP_TAC ADDITIVE_CONTENT_DIVISION THEN
11656  ONCE_REWRITE_TAC[INTER_COMM] THEN MATCH_MP_TAC DIVISION_INTER_1 THEN
11657  EXISTS_TAC ``interval[a:real,b]`` THEN ASM_REWRITE_TAC[]
11658QED
11659
11660Theorem BOUNDED_SETVARIATION_ABSOLUTELY_INTEGRABLE:
11661   !f:real->real.
11662        f integrable_on UNIV /\
11663        (\k. integral k f) has_bounded_setvariation_on univ(:real)
11664        ==> f absolutely_integrable_on UNIV
11665Proof
11666  REWRITE_TAC[HAS_BOUNDED_SETVARIATION_ON_UNIV] THEN
11667  REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[absolutely_integrable_on] THEN
11668  MP_TAC(ISPEC ``IMAGE (\d. sum d (\k. abs(integral k (f:real->real))))
11669                      {d | d division_of (BIGUNION d) }``
11670         SUP) THEN
11671  SIMP_TAC std_ss [FORALL_IN_IMAGE, IMAGE_EQ_EMPTY] THEN
11672  SIMP_TAC std_ss [GSYM MEMBER_NOT_EMPTY, GSPECIFICATION] THEN
11673  ABBREV_TAC
11674   ``i = sup (IMAGE (\d. sum d (\k. abs(integral k (f:real->real))))
11675                      {d | d division_of (BIGUNION d) })`` THEN
11676  KNOW_TAC ``(?(x :(real -> bool) -> bool). x division_of BIGUNION x) /\
11677 (?(b :real). !(d :(real -> bool) -> bool).
11678      d division_of BIGUNION d ==>
11679      sum d (\(k :real -> bool). abs (integral k (f :real -> real))) <= b)`` THENL
11680   [CONJ_TAC THENL [ALL_TAC, ASM_MESON_TAC[]] THEN
11681    EXISTS_TAC ``{}:(real->bool)->bool`` THEN
11682    REWRITE_TAC[BIGUNION_EMPTY, DIVISION_OF_TRIVIAL],
11683    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
11684  STRIP_TAC THEN REWRITE_TAC[integrable_on] THEN EXISTS_TAC ``i:real`` THEN
11685  REWRITE_TAC[HAS_INTEGRAL_ALT, IN_UNIV] THEN
11686  MATCH_MP_TAC(TAUT `a /\ (a ==> b) ==> a /\ b`) THEN CONJ_TAC THENL
11687   [MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``] THEN
11688    MP_TAC(ISPECL [``f:real->real``, ``a:real``, ``b:real``]
11689      (REWRITE_RULE[HAS_BOUNDED_SETVARIATION_ON_INTERVAL]
11690       BOUNDED_SETVARIATION_ABSOLUTELY_INTEGRABLE_INTERVAL)) THEN
11691    KNOW_TAC ``(f :real -> real) integrable_on interval [((a :real),(b :real))] /\
11692 (?(B :real). !(d :(real -> bool) -> bool).
11693      d division_of interval [(a,b)] ==>
11694      sum d (\(k :real -> bool).
11695           abs ((\(k :real -> bool). integral k f) k)) <= B)`` THENL
11696    [ALL_TAC, DISCH_TAC THEN ASM_REWRITE_TAC [] THEN
11697     SIMP_TAC std_ss [absolutely_integrable_on]] THEN
11698    CONJ_TAC THENL
11699     [MATCH_MP_TAC INTEGRABLE_ON_SUBINTERVAL THEN EXISTS_TAC ``univ(:real)`` THEN
11700      ASM_REWRITE_TAC[SUBSET_UNIV],
11701      ALL_TAC] THEN
11702    EXISTS_TAC ``B:real`` THEN REPEAT STRIP_TAC THEN
11703    FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_MESON_TAC[DIVISION_OF_UNION_SELF],
11704    ALL_TAC] THEN
11705  SIMP_TAC std_ss [] THEN
11706  DISCH_TAC THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
11707  UNDISCH_TAC ``!b.
11708        (!d. d division_of BIGUNION d ==>
11709           sum d (\k. abs (integral k f)) <= b) ==>
11710        i <= b`` THEN DISCH_TAC THEN
11711  FIRST_X_ASSUM(MP_TAC o SPEC ``i - e:real``) THEN
11712  ASM_SIMP_TAC std_ss [REAL_ARITH ``&0 < e ==> ~(i <= i - e:real)``] THEN
11713  SIMP_TAC std_ss [NOT_FORALL_THM, NOT_IMP, REAL_NOT_LE, LEFT_IMP_EXISTS_THM] THEN
11714  X_GEN_TAC ``d:(real->bool)->bool`` THEN STRIP_TAC THEN
11715  SUBGOAL_THEN ``bounded(BIGUNION d:real->bool)`` MP_TAC THENL
11716   [ASM_MESON_TAC[ELEMENTARY_BOUNDED], ALL_TAC] THEN
11717  REWRITE_TAC[BOUNDED_POS] THEN
11718  DISCH_THEN(X_CHOOSE_THEN ``kk:real`` STRIP_ASSUME_TAC) THEN
11719  EXISTS_TAC ``kk + &1:real`` THEN ASM_SIMP_TAC std_ss [REAL_LT_ADD, REAL_LT_01] THEN
11720  MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``] THEN DISCH_TAC THEN
11721  SIMP_TAC std_ss [] THEN
11722  MATCH_MP_TAC(REAL_ARITH
11723   ``!s1. i - e < s1 /\ s1 <= s /\ s < i + e ==> abs(s - i) < e:real``) THEN
11724  EXISTS_TAC ``sum (d:(real->bool)->bool) (\k. abs (integral k
11725                    (f:real->real)))`` THEN
11726  FIRST_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_FINITE) THEN
11727  ASM_SIMP_TAC std_ss [] THEN CONJ_TAC THENL
11728   [MATCH_MP_TAC REAL_LE_TRANS THEN
11729    EXISTS_TAC ``sum d
11730      (\k. integral k (\x. abs((f:real->real) x)))`` THEN
11731    CONJ_TAC THENL
11732     [MATCH_MP_TAC SUM_LE THEN
11733      UNDISCH_TAC ``d division_of BIGUNION d`` THEN DISCH_TAC THEN
11734      FIRST_ASSUM(fn t => ASM_SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION t]) THEN
11735      REPEAT STRIP_TAC THEN SIMP_TAC std_ss [] THEN
11736      MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_LE THEN
11737      ASM_SIMP_TAC std_ss [absolutely_integrable_on] THEN
11738      MATCH_MP_TAC INTEGRABLE_ON_SUBINTERVAL THEN
11739      EXISTS_TAC ``univ(:real)`` THEN ASM_REWRITE_TAC[SUBSET_UNIV],
11740      ALL_TAC] THEN
11741    MATCH_MP_TAC REAL_LE_TRANS THEN
11742    EXISTS_TAC ``integral (BIGUNION d)
11743                      (\x. abs((f:real->real) x))`` THEN
11744    CONJ_TAC THENL
11745     [MATCH_MP_TAC(METIS[REAL_LE_LT]
11746       ``(x = y) ==> x <= y:real``) THEN
11747      ASM_SIMP_TAC std_ss [o_DEF] THEN CONV_TAC SYM_CONV THEN
11748      MATCH_MP_TAC INTEGRAL_COMBINE_DIVISION_BOTTOMUP THEN
11749      FIRST_ASSUM(fn t => ASM_REWRITE_TAC[MATCH_MP FORALL_IN_DIVISION t]),
11750      ALL_TAC] THEN
11751    MATCH_MP_TAC INTEGRAL_SUBSET_DROP_LE THEN
11752    ASM_SIMP_TAC std_ss [ABS_POS] THEN
11753    MATCH_MP_TAC(TAUT `a /\ (a ==> b) ==> a /\ b`) THEN CONJ_TAC THENL
11754     [MATCH_MP_TAC SUBSET_TRANS THEN
11755      EXISTS_TAC ``ball(0:real,kk + &1)`` THEN
11756      ASM_REWRITE_TAC[] THEN REWRITE_TAC[SUBSET_DEF, IN_BALL, dist] THEN
11757      ASM_SIMP_TAC std_ss [REAL_ARITH ``abs(x) <= kk ==> abs(0 - x) < kk + &1:real``],
11758      ALL_TAC] THEN
11759    DISCH_TAC THEN SIMP_TAC std_ss [] THEN
11760    MATCH_MP_TAC INTEGRABLE_ON_SUBDIVISION THEN
11761    EXISTS_TAC ``interval[a:real,b]`` THEN
11762    EXISTS_TAC ``d:(real->bool)->bool`` THEN ASM_REWRITE_TAC[],
11763    ALL_TAC] THEN
11764  FIRST_X_ASSUM(MP_TAC o SPECL [``a:real``, ``b:real``]) THEN
11765  REWRITE_TAC[HAS_INTEGRAL_INTEGRAL, has_integral] THEN
11766  DISCH_THEN(MP_TAC o SPEC ``e / &2:real``) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
11767  DISCH_THEN(X_CHOOSE_THEN ``d1:real->real->bool`` MP_TAC) THEN
11768  DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC ASSUME_TAC) THEN
11769  MP_TAC(ISPECL [``f:real->real``, ``a:real``, ``b:real``]
11770                HENSTOCK_LEMMA) THEN
11771  KNOW_TAC ``(f :real -> real) integrable_on interval [((a :real),(b :real))]`` THENL
11772   [MATCH_MP_TAC INTEGRABLE_ON_SUBINTERVAL THEN
11773    EXISTS_TAC ``univ(:real)`` THEN ASM_SIMP_TAC std_ss [SUBSET_UNIV],
11774    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
11775  DISCH_THEN(MP_TAC o SPEC ``e / &2:real``) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
11776  DISCH_THEN(X_CHOOSE_THEN ``d2:real->real->bool`` MP_TAC) THEN
11777  DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC ASSUME_TAC) THEN
11778  SUBGOAL_THEN ``?p. p tagged_division_of interval[a:real,b] /\
11779                    d1 FINE p /\ d2 FINE p``
11780  STRIP_ASSUME_TAC THENL
11781   [REWRITE_TAC[GSYM FINE_INTER] THEN MATCH_MP_TAC FINE_DIVISION_EXISTS THEN
11782    ASM_SIMP_TAC std_ss [GAUGE_INTER],
11783    ALL_TAC] THEN FULL_SIMP_TAC std_ss [] THEN
11784  UNDISCH_TAC `` !p'. p' tagged_division_of interval [(a,b)] /\ d1 FINE p' ==>
11785    abs (sum p' (\(x,k). content k * abs (f x)) -
11786     integral (interval [(a,b)]) (\x. abs (f x))) < e / 2`` THEN DISCH_TAC THEN
11787  FIRST_X_ASSUM (MP_TAC o SPEC ``p:(real#(real->bool)->bool)``) THEN
11788  FIRST_X_ASSUM (MP_TAC o SPEC ``p:(real#(real->bool)->bool)``) THEN
11789  ASM_SIMP_TAC std_ss [] THEN
11790  KNOW_TAC ``p tagged_partial_division_of interval [(a,b)]`` THENL
11791   [METIS_TAC[tagged_division_of],
11792    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
11793  SIMP_TAC std_ss [LAMBDA_PAIR] THEN
11794  ONCE_REWRITE_TAC [METIS []
11795   ``(\p. abs (content (SND p) * f (FST p) - integral (SND p) f)) =
11796     (\p. abs ((\p. content (SND p) * f (FST p)) p - (\p. integral (SND p) f) p))``] THEN
11797 DISCH_THEN(MP_TAC o MATCH_MP lemma) THEN
11798  FIRST_ASSUM(ASSUME_TAC o MATCH_MP TAGGED_DIVISION_OF_FINITE) THEN
11799  ASM_SIMP_TAC std_ss [o_DEF, SUM_SUB] THEN
11800  SIMP_TAC std_ss [LAMBDA_PROD, ABS_MUL] THEN
11801  GEN_REWR_TAC (RAND_CONV o RAND_CONV o RAND_CONV o RAND_CONV) [GSYM REAL_HALF] THEN
11802  MATCH_MP_TAC(REAL_ARITH
11803   ``(sf' = sf) /\ si <= i
11804    ==> abs(sf - si) < e / &2
11805        ==> abs(sf' - di) < e / &2
11806            ==> di < i + (e / 2 + e / 2:real)``) THEN
11807  CONJ_TAC THENL
11808   [MATCH_MP_TAC SUM_EQ THEN SIMP_TAC std_ss [FORALL_PROD, abs] THEN
11809    METIS_TAC[CONTENT_POS_LE, TAGGED_DIVISION_OF],
11810    ALL_TAC] THEN
11811  SUBGOAL_THEN
11812   ``sum p (\(x:real,k). abs(integral k f)) =
11813    sum (IMAGE SND p) (\k. abs(integral k (f:real->real)))``
11814  SUBST1_TAC THENL
11815   [ONCE_REWRITE_TAC [METIS [] ``(\(x,k). abs (integral k f)) =
11816                             (\(x,k).(\k. abs(integral k (f:real->real))) k)``] THEN
11817    MATCH_MP_TAC SUM_OVER_TAGGED_DIVISION_LEMMA THEN
11818    EXISTS_TAC ``interval[a:real,b]`` THEN ASM_SIMP_TAC std_ss [] THEN
11819    SIMP_TAC std_ss [INTEGRAL_NULL, ABS_0],
11820    ALL_TAC] THEN
11821  FIRST_X_ASSUM MATCH_MP_TAC THEN
11822  MATCH_MP_TAC PARTIAL_DIVISION_OF_TAGGED_DIVISION THEN
11823  EXISTS_TAC ``interval[a:real,b]`` THEN ASM_MESON_TAC[tagged_division_of]
11824QED
11825
11826Theorem ABSOLUTELY_INTEGRABLE_BOUNDED_SETVARIATION_UNIV_EQ:
11827   !f:real->real.
11828        f absolutely_integrable_on univ(:real) <=>
11829        f integrable_on univ(:real) /\
11830        (\k. integral k f) has_bounded_setvariation_on univ(:real)
11831Proof
11832  GEN_TAC THEN EQ_TAC THEN
11833  SIMP_TAC std_ss [ABSOLUTELY_INTEGRABLE_BOUNDED_SETVARIATION,
11834           BOUNDED_SETVARIATION_ABSOLUTELY_INTEGRABLE,
11835           ABSOLUTELY_INTEGRABLE_IMP_INTEGRABLE]
11836QED
11837
11838Theorem ABSOLUTELY_INTEGRABLE_BOUNDED_SETVARIATION_EQ:
11839   !f:real->real a b.
11840        f absolutely_integrable_on interval[a,b] <=>
11841        f integrable_on interval[a,b] /\
11842        (\k. integral k f) has_bounded_setvariation_on interval[a,b]
11843Proof
11844  REPEAT GEN_TAC THEN EQ_TAC THEN
11845  SIMP_TAC std_ss [ABSOLUTELY_INTEGRABLE_BOUNDED_SETVARIATION,
11846           BOUNDED_SETVARIATION_ABSOLUTELY_INTEGRABLE_INTERVAL,
11847           ABSOLUTELY_INTEGRABLE_IMP_INTEGRABLE]
11848QED
11849
11850Theorem ABSOLUTELY_INTEGRABLE_SET_VARIATION:
11851   !f:real->real a b.
11852        f absolutely_integrable_on interval[a,b]
11853        ==> (set_variation (interval[a,b]) (\k. integral k f) =
11854                  integral (interval[a,b]) (\x. abs(f x)))
11855Proof
11856  REPEAT STRIP_TAC THEN REWRITE_TAC[set_variation] THEN
11857  MATCH_MP_TAC REAL_SUP_UNIQUE THEN
11858  SIMP_TAC std_ss [FORALL_IN_GSPEC, EXISTS_IN_GSPEC] THEN CONJ_TAC THENL
11859   [X_GEN_TAC ``d:(real->bool)->bool`` THEN
11860    DISCH_THEN(X_CHOOSE_THEN ``s:real->bool`` STRIP_ASSUME_TAC) THEN
11861    MATCH_MP_TAC REAL_LE_TRANS THEN
11862    EXISTS_TAC ``integral s (\x. abs((f:real->real) x))`` THEN
11863    CONJ_TAC THENL
11864     [MP_TAC(ISPECL [``\x. abs((f:real->real) x)``,
11865                     ``d:(real->bool)->bool``, ``s:real->bool``]
11866        INTEGRAL_COMBINE_DIVISION_TOPDOWN) THEN
11867      ASM_SIMP_TAC std_ss [] THEN
11868      KNOW_TAC ``(\(x :real). abs ((f :real -> real) x)) integrable_on
11869                 (s :real -> bool)`` THENL
11870       [RULE_ASSUM_TAC(REWRITE_RULE[absolutely_integrable_on]) THEN
11871        ASM_REWRITE_TAC[] THEN
11872        MATCH_MP_TAC INTEGRABLE_ON_SUBDIVISION THEN
11873        EXISTS_TAC ``interval[a:real,b]`` THEN ASM_MESON_TAC[],
11874        DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
11875        DISCH_THEN SUBST1_TAC] THEN
11876      FIRST_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_FINITE) THEN
11877      ASM_SIMP_TAC std_ss [] THEN MATCH_MP_TAC SUM_LE THEN
11878      ASM_REWRITE_TAC[o_THM] THEN
11879      REPEAT STRIP_TAC THEN BETA_TAC THEN MATCH_MP_TAC INTEGRAL_ABS_BOUND_INTEGRAL THEN
11880      SIMP_TAC std_ss [REAL_LE_REFL, GSYM absolutely_integrable_on] THEN
11881      RULE_ASSUM_TAC(REWRITE_RULE[division_of]) THEN
11882      ASM_MESON_TAC[ABSOLUTELY_INTEGRABLE_ON_SUBINTERVAL, SUBSET_TRANS],
11883      MATCH_MP_TAC INTEGRAL_SUBSET_DROP_LE THEN
11884      ASM_SIMP_TAC std_ss [ABS_POS] THEN
11885      RULE_ASSUM_TAC(REWRITE_RULE[absolutely_integrable_on]) THEN
11886      ASM_REWRITE_TAC[] THEN
11887      MATCH_MP_TAC INTEGRABLE_ON_SUBDIVISION THEN
11888      EXISTS_TAC ``interval[a:real,b]`` THEN ASM_MESON_TAC[]],
11889    X_GEN_TAC ``B:real`` THEN ONCE_REWRITE_TAC[GSYM REAL_SUB_LT] THEN
11890    ABBREV_TAC ``e = integral (interval [a,b]) (\x. abs((f:real->real) x)) - B`` THEN
11891    DISCH_TAC THEN
11892    FIRST_ASSUM(MP_TAC o MATCH_MP ABSOLUTELY_INTEGRABLE_IMP_INTEGRABLE) THEN
11893    DISCH_THEN(MP_TAC o SPEC ``e / &2:real`` o MATCH_MP HENSTOCK_LEMMA) THEN
11894    ASM_REWRITE_TAC[REAL_HALF] THEN
11895    DISCH_THEN(X_CHOOSE_THEN ``d1:real->real->bool``
11896     (CONJUNCTS_THEN2 ASSUME_TAC ASSUME_TAC)) THEN
11897    UNDISCH_TAC ``f absolutely_integrable_on interval [(a,b)]`` THEN DISCH_TAC THEN
11898    FIRST_ASSUM(MP_TAC o REWRITE_RULE [absolutely_integrable_on]) THEN
11899    DISCH_THEN(MP_TAC o CONJUNCT2) THEN
11900    REWRITE_TAC[HAS_INTEGRAL_INTEGRAL, has_integral] THEN
11901    DISCH_THEN(MP_TAC o SPEC ``e / &2:real``) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
11902    DISCH_THEN(X_CHOOSE_THEN ``d2:real->real->bool``
11903     (CONJUNCTS_THEN2 ASSUME_TAC ASSUME_TAC)) THEN
11904    MP_TAC(ISPECL
11905     [``\x. (d1:real->real->bool) x INTER d2 x``,
11906      ``a:real``, ``b:real``]
11907     FINE_DIVISION_EXISTS) THEN
11908    ASM_SIMP_TAC std_ss [GAUGE_INTER, FINE_INTER] THEN
11909    DISCH_THEN(X_CHOOSE_THEN ``p:real#(real->bool)->bool``
11910        STRIP_ASSUME_TAC) THEN
11911    FIRST_X_ASSUM (MP_TAC o SPEC  ``p:real#(real->bool)->bool``) THEN
11912    FIRST_X_ASSUM (MP_TAC o SPEC  ``p:real#(real->bool)->bool``) THEN
11913    ASM_SIMP_TAC std_ss [] THEN
11914    KNOW_TAC ``p tagged_partial_division_of interval [(a,b)]`` THENL
11915    [ASM_MESON_TAC[tagged_division_of],
11916     DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
11917    MP_TAC(ISPECL
11918     [``\x. abs((f:real->real) x)``,
11919      ``a:real``, ``b:real``, ``p:real#(real->bool)->bool``]
11920      INTEGRAL_COMBINE_TAGGED_DIVISION_TOPDOWN) THEN
11921     KNOW_TAC ``(\(x :real). abs ((f :real -> real) x)) integrable_on
11922      interval [((a :real),(b :real))] /\
11923       (p :real # (real -> bool) -> bool) tagged_division_of
11924      interval [(a,b)]`` THENL
11925     [RULE_ASSUM_TAC(SIMP_RULE std_ss [absolutely_integrable_on]) THEN
11926      ASM_REWRITE_TAC[], DISCH_TAC THEN ASM_REWRITE_TAC [] THEN
11927      POP_ASSUM K_TAC THEN DISCH_THEN SUBST_ALL_TAC] THEN
11928    FIRST_ASSUM(ASSUME_TAC o MATCH_MP TAGGED_DIVISION_OF_FINITE) THEN
11929    DISCH_TAC THEN
11930    SUBGOAL_THEN
11931     ``abs(sum p (\(x,k). content k * abs((f:real->real) x)) -
11932          sum p (\(x,k:real->bool). abs(integral k f))) < e / &2``
11933    MP_TAC THENL
11934     [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT]
11935        REAL_LET_TRANS)) THEN
11936      ASM_SIMP_TAC std_ss [GSYM SUM_SUB] THEN MATCH_MP_TAC SUM_ABS_LE THEN
11937      ASM_SIMP_TAC std_ss [FORALL_PROD] THEN REPEAT STRIP_TAC THEN
11938      MATCH_MP_TAC(REAL_ARITH
11939       ``(x = abs u) ==> abs(x - abs v) <= abs(u - v:real)``) THEN
11940      SIMP_TAC std_ss [ABS_MUL, abs] THEN
11941      METIS_TAC[CONTENT_POS_LE, TAGGED_DIVISION_OF],
11942      ALL_TAC] THEN
11943    ASM_SIMP_TAC std_ss [] THEN
11944    SIMP_TAC std_ss [LAMBDA_PROD, o_DEF, AND_IMP_INTRO] THEN
11945    DISCH_THEN(MP_TAC o MATCH_MP (REAL_ARITH
11946     ``abs(x - y:real) < e / &2 /\ abs(x - z) < e / &2
11947      ==> abs(y - z) < e / 2 + e / 2``)) THEN
11948    REWRITE_TAC[REAL_HALF] THEN
11949    DISCH_THEN(MP_TAC o SPEC ``B:real`` o MATCH_MP
11950     (REAL_ARITH ``!B. abs(x - y) < e ==> (y - B = e) ==> &0 < x - B:real``)) THEN
11951    ASM_REWRITE_TAC[] THEN ASM_SIMP_TAC std_ss [REAL_SUB_LT] THEN
11952    SIMP_TAC std_ss [o_DEF, LAMBDA_PROD] THEN DISCH_TAC THEN
11953    EXISTS_TAC ``IMAGE SND (p:real#(real->bool)->bool)`` THEN CONJ_TAC THENL
11954     [EXISTS_TAC ``interval[a:real,b]`` THEN
11955      ASM_SIMP_TAC std_ss [DIVISION_OF_TAGGED_DIVISION, SUBSET_REFL],
11956      FIRST_ASSUM(MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
11957        SUM_OVER_TAGGED_DIVISION_LEMMA)) THEN
11958      DISCH_THEN(fn th =>
11959       W(MP_TAC o PART_MATCH (rand o rand) th o rand o snd)) THEN
11960      SIMP_TAC std_ss [INTEGRAL_NULL, ABS_0] THEN
11961      DISCH_THEN(SUBST1_TAC o SYM) THEN ASM_REWRITE_TAC[]]]
11962QED
11963
11964Theorem ABSOLUTELY_INTEGRABLE_RESTRICT_UNIV:
11965   !f s. (\x. if x IN s then f x else 0)
11966              absolutely_integrable_on univ(:real) <=>
11967         f absolutely_integrable_on s
11968Proof
11969  SIMP_TAC std_ss [absolutely_integrable_on, INTEGRABLE_RESTRICT_UNIV,
11970              COND_RAND, ABS_0]
11971QED
11972
11973Theorem ABSOLUTELY_INTEGRABLE_MUL_INDICATOR :
11974    !f s. (\x. f x * indicator s x) absolutely_integrable_on UNIV <=>
11975          f absolutely_integrable_on s
11976Proof
11977    rpt GEN_TAC
11978 >> ONCE_REWRITE_TAC [GSYM ABSOLUTELY_INTEGRABLE_RESTRICT_UNIV]
11979 >> simp []
11980 >> MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_EQ_EQ >> rw [indicator]
11981QED
11982
11983Theorem ABSOLUTELY_INTEGRABLE_CONST:
11984   !a b c. (\x. c) absolutely_integrable_on interval[a,b]
11985Proof
11986  REWRITE_TAC[absolutely_integrable_on, INTEGRABLE_CONST]
11987QED
11988
11989Theorem ABSOLUTELY_INTEGRABLE_ADD:
11990   !f:real->real g s.
11991        f absolutely_integrable_on s /\
11992        g absolutely_integrable_on s
11993        ==> (\x. f(x) + g(x)) absolutely_integrable_on s
11994Proof
11995  SUBGOAL_THEN
11996   ``!f:real->real g.
11997        f absolutely_integrable_on univ(:real) /\
11998        g absolutely_integrable_on univ(:real)
11999        ==> (\x. f(x) + g(x)) absolutely_integrable_on univ(:real)``
12000  ASSUME_TAC THENL
12001   [ALL_TAC,
12002    ONCE_REWRITE_TAC[GSYM ABSOLUTELY_INTEGRABLE_RESTRICT_UNIV] THEN
12003    REPEAT GEN_TAC THEN DISCH_THEN(ANTE_RES_THEN MP_TAC) THEN
12004    SIMP_TAC std_ss [] THEN MATCH_MP_TAC EQ_IMPLIES THEN
12005    AP_THM_TAC THEN AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN
12006    GEN_TAC THEN SIMP_TAC std_ss [] THEN
12007    COND_CASES_TAC THEN ASM_SIMP_TAC std_ss [REAL_ADD_LID]] THEN
12008  REPEAT STRIP_TAC THEN
12009  EVERY_ASSUM(STRIP_ASSUME_TAC o
12010   REWRITE_RULE [absolutely_integrable_on]) THEN
12011  MATCH_MP_TAC BOUNDED_SETVARIATION_ABSOLUTELY_INTEGRABLE THEN
12012  ASM_SIMP_TAC std_ss [INTEGRABLE_ADD] THEN
12013  MP_TAC(ISPECL [``g:real->real``, ``univ(:real)``]
12014     ABSOLUTELY_INTEGRABLE_BOUNDED_SETVARIATION) THEN
12015  MP_TAC(ISPECL [``f:real->real``, ``univ(:real)``]
12016     ABSOLUTELY_INTEGRABLE_BOUNDED_SETVARIATION) THEN
12017  ASM_SIMP_TAC std_ss [HAS_BOUNDED_SETVARIATION_ON_UNIV] THEN
12018  DISCH_THEN(X_CHOOSE_TAC ``B1:real``) THEN
12019  DISCH_THEN(X_CHOOSE_TAC ``B2:real``) THEN EXISTS_TAC ``B1 + B2:real`` THEN
12020  X_GEN_TAC ``d:(real->bool)->bool`` THEN DISCH_TAC THEN
12021  REPEAT(FIRST_X_ASSUM(MP_TAC o SPEC ``d:(real->bool)->bool``)) THEN
12022  ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN
12023  FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
12024   ``a <= B1 ==> x <= a + B2 ==> x <= B1 + B2:real``)) THEN
12025  FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
12026   ``b <= B2 ==> x <= a + b ==> x <= a + B2:real``)) THEN
12027  FIRST_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_FINITE) THEN
12028  ASM_SIMP_TAC std_ss [GSYM SUM_ADD] THEN MATCH_MP_TAC SUM_LE THEN
12029  UNDISCH_TAC ``d division_of BIGUNION d`` THEN DISCH_TAC THEN
12030  FIRST_ASSUM(fn t => ASM_SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION t]) THEN
12031  MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``] THEN STRIP_TAC THEN
12032  MATCH_MP_TAC(REAL_ARITH ``(x = y + z) ==> abs(x) <= abs(y) + abs(z:real)``) THEN
12033  MATCH_MP_TAC INTEGRAL_ADD THEN CONJ_TAC THEN
12034  MATCH_MP_TAC INTEGRABLE_ON_SUBINTERVAL THEN
12035  EXISTS_TAC ``univ(:real)`` THEN ASM_REWRITE_TAC[SUBSET_UNIV]
12036QED
12037
12038Theorem ABSOLUTELY_INTEGRABLE_SUB:
12039   !f:real->real g s.
12040        f absolutely_integrable_on s /\
12041        g absolutely_integrable_on s
12042        ==> (\x. f(x) - g(x)) absolutely_integrable_on s
12043Proof
12044  REWRITE_TAC[real_sub] THEN
12045  SIMP_TAC std_ss [ABSOLUTELY_INTEGRABLE_ADD, ABSOLUTELY_INTEGRABLE_NEG]
12046QED
12047
12048Theorem ABSOLUTELY_INTEGRABLE_LINEAR:
12049   !f:real->real h:real->real s.
12050        f absolutely_integrable_on s /\ linear h
12051        ==> (h o f) absolutely_integrable_on s
12052Proof
12053  SUBGOAL_THEN
12054   ``!f:real->real h:real->real.
12055        f absolutely_integrable_on univ(:real) /\ linear h
12056        ==> (h o f) absolutely_integrable_on univ(:real)``
12057  ASSUME_TAC THENL
12058   [ALL_TAC,
12059    ONCE_REWRITE_TAC[GSYM ABSOLUTELY_INTEGRABLE_RESTRICT_UNIV] THEN
12060    REPEAT GEN_TAC THEN DISCH_THEN(fn th =>
12061     ANTE_RES_THEN MP_TAC th THEN
12062     ASSUME_TAC(MATCH_MP LINEAR_0 (CONJUNCT2 th))) THEN
12063    ASM_SIMP_TAC std_ss [o_DEF, COND_RAND]] THEN
12064  REPEAT STRIP_TAC THEN
12065  MATCH_MP_TAC BOUNDED_SETVARIATION_ABSOLUTELY_INTEGRABLE THEN
12066  FIRST_ASSUM(MP_TAC o
12067    MATCH_MP ABSOLUTELY_INTEGRABLE_BOUNDED_SETVARIATION) THEN
12068  RULE_ASSUM_TAC(REWRITE_RULE[absolutely_integrable_on]) THEN
12069  ASM_SIMP_TAC std_ss [INTEGRABLE_LINEAR, HAS_BOUNDED_SETVARIATION_ON_UNIV] THEN
12070  FIRST_ASSUM(X_CHOOSE_THEN ``B:real`` STRIP_ASSUME_TAC o MATCH_MP
12071              LINEAR_BOUNDED_POS) THEN
12072  DISCH_THEN(X_CHOOSE_TAC ``b:real``) THEN EXISTS_TAC ``B * b:real`` THEN
12073  X_GEN_TAC ``d:(real->bool)->bool`` THEN DISCH_TAC THEN
12074  MATCH_MP_TAC REAL_LE_TRANS THEN
12075  EXISTS_TAC ``B * sum d (\k. abs(integral k (f:real->real)))`` THEN
12076  ASM_SIMP_TAC std_ss [REAL_LE_LMUL] THEN SIMP_TAC std_ss [GSYM SUM_LMUL] THEN
12077  MATCH_MP_TAC SUM_LE THEN
12078  FIRST_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_FINITE) THEN
12079  FIRST_ASSUM(fn t => ASM_SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION t]) THEN
12080  MAP_EVERY X_GEN_TAC [``a:real``, ``b':real``] THEN DISCH_TAC THEN
12081  MATCH_MP_TAC REAL_LE_TRANS THEN
12082  EXISTS_TAC ``abs(h(integral (interval[a,b']) (f:real->real)):real)`` THEN
12083  ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_EQ_IMP_LE THEN AP_TERM_TAC THEN
12084  MATCH_MP_TAC INTEGRAL_UNIQUE THEN MATCH_MP_TAC HAS_INTEGRAL_LINEAR THEN
12085  ASM_REWRITE_TAC[GSYM HAS_INTEGRAL_INTEGRAL] THEN
12086  MATCH_MP_TAC INTEGRABLE_ON_SUBINTERVAL THEN
12087  EXISTS_TAC ``univ(:real)`` THEN ASM_REWRITE_TAC[SUBSET_UNIV]
12088QED
12089
12090Theorem ABSOLUTELY_INTEGRABLE_SUM:
12091   !f:'a->real->real s t.
12092        FINITE t /\
12093        (!a. a IN t ==> (f a) absolutely_integrable_on s)
12094        ==>  (\x. sum t (\a. f a x)) absolutely_integrable_on s
12095Proof
12096  GEN_TAC THEN GEN_TAC THEN REWRITE_TAC[IMP_CONJ] THEN
12097  ONCE_REWRITE_TAC [METIS []
12098   ``( (!a. a IN t ==> f a absolutely_integrable_on s) ==>
12099   (\x. sum t (\a. f a x)) absolutely_integrable_on s) =
12100   (\t. (!a. a IN t ==> f a absolutely_integrable_on s) ==>
12101  ( \x. sum t (\a. f a x)) absolutely_integrable_on s) t``] THEN
12102  MATCH_MP_TAC FINITE_INDUCT THEN BETA_TAC THEN
12103  SIMP_TAC std_ss [GSYM RIGHT_FORALL_IMP_THM] THEN
12104  SIMP_TAC std_ss [SUM_CLAUSES, ABSOLUTELY_INTEGRABLE_0, IN_INSERT] THEN
12105  REPEAT STRIP_TAC THEN
12106  ONCE_REWRITE_TAC [METIS [] ``(\x. f e x + sum s' (\a. f a x)) =
12107                  (\x. (\x. f e x) x + (\x. sum s' (\a. f a x)) x)``] THEN
12108  MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_ADD THEN METIS_TAC [ETA_AX]
12109QED
12110
12111Theorem ABSOLUTELY_INTEGRABLE_MAX :
12112    !f:real->real g:real->real s.
12113        f absolutely_integrable_on s /\ g absolutely_integrable_on s
12114        ==> (\x. (max (f(x)) (g(x))):real)
12115            absolutely_integrable_on s
12116Proof
12117  REPEAT GEN_TAC THEN DISCH_TAC THEN
12118  FIRST_ASSUM(MP_TAC o MATCH_MP ABSOLUTELY_INTEGRABLE_SUB) THEN
12119  DISCH_THEN(MP_TAC o MATCH_MP ABSOLUTELY_INTEGRABLE_ABS) THEN
12120  FIRST_ASSUM(MP_TAC o MATCH_MP ABSOLUTELY_INTEGRABLE_ADD) THEN
12121  REWRITE_TAC[AND_IMP_INTRO] THEN
12122  DISCH_THEN(MP_TAC o MATCH_MP ABSOLUTELY_INTEGRABLE_ADD) THEN
12123  DISCH_THEN(MP_TAC o SPEC ``inv(&2:real)`` o
12124     MATCH_MP ABSOLUTELY_INTEGRABLE_CMUL) THEN
12125  MATCH_MP_TAC EQ_IMPLIES THEN SIMP_TAC std_ss [] THEN
12126  AP_THM_TAC THEN AP_TERM_TAC THEN
12127  REWRITE_TAC[FUN_EQ_THM] THEN
12128  SIMP_TAC std_ss [max_def] THEN REPEAT STRIP_TAC THEN
12129  ONCE_REWRITE_TAC [REAL_MUL_SYM] THEN REWRITE_TAC [GSYM real_div] THEN
12130  SIMP_TAC std_ss [REAL_EQ_LDIV_EQ, REAL_ARITH ``0 < 2:real``] THEN
12131  Cases_on `f x <= g x` >> rw [] >> REAL_ASM_ARITH_TAC
12132QED
12133
12134Theorem ABSOLUTELY_INTEGRABLE_MIN :
12135    !f:real->real g:real->real s.
12136        f absolutely_integrable_on s /\ g absolutely_integrable_on s
12137        ==> (\x. (min (f(x)) (g(x))):real)
12138            absolutely_integrable_on s
12139Proof
12140  REPEAT GEN_TAC THEN DISCH_TAC THEN
12141  FIRST_ASSUM(MP_TAC o MATCH_MP ABSOLUTELY_INTEGRABLE_SUB) THEN
12142  DISCH_THEN(MP_TAC o MATCH_MP ABSOLUTELY_INTEGRABLE_ABS) THEN
12143  FIRST_ASSUM(MP_TAC o MATCH_MP ABSOLUTELY_INTEGRABLE_ADD) THEN
12144  REWRITE_TAC[AND_IMP_INTRO] THEN
12145  DISCH_THEN(MP_TAC o MATCH_MP ABSOLUTELY_INTEGRABLE_SUB) THEN
12146  DISCH_THEN(MP_TAC o SPEC ``inv(&2:real)`` o
12147     MATCH_MP ABSOLUTELY_INTEGRABLE_CMUL) THEN
12148  MATCH_MP_TAC EQ_IMPLIES THEN AP_THM_TAC THEN AP_TERM_TAC THEN
12149  REWRITE_TAC[FUN_EQ_THM] THEN
12150  SIMP_TAC std_ss [min_def] THEN REPEAT STRIP_TAC THEN
12151  ONCE_REWRITE_TAC [REAL_MUL_SYM] THEN REWRITE_TAC [GSYM real_div] THEN
12152  SIMP_TAC std_ss [REAL_EQ_LDIV_EQ, REAL_ARITH ``0 < 2:real``] THEN
12153  Cases_on `f x <= g x` >> rw [] >> REAL_ASM_ARITH_TAC
12154QED
12155
12156Theorem ABSOLUTELY_INTEGRABLE_ABS_EQ:
12157   !f:real->real s.
12158        f absolutely_integrable_on s <=>
12159          f integrable_on s /\
12160          (\x. (abs(f(x))):real) integrable_on s
12161Proof
12162  REPEAT GEN_TAC THEN EQ_TAC THEN
12163  SIMP_TAC std_ss [ABSOLUTELY_INTEGRABLE_ABS,
12164           ABSOLUTELY_INTEGRABLE_IMP_INTEGRABLE] THEN
12165  SUBGOAL_THEN
12166   ``!f:real->real.
12167        f integrable_on univ(:real) /\
12168        (\x. (abs(f(x))):real) integrable_on univ(:real)
12169        ==> f absolutely_integrable_on univ(:real)``
12170  ASSUME_TAC THENL
12171   [ALL_TAC,
12172    ONCE_REWRITE_TAC[GSYM ABSOLUTELY_INTEGRABLE_RESTRICT_UNIV,
12173                     GSYM INTEGRABLE_RESTRICT_UNIV] THEN
12174    DISCH_THEN(fn th => FIRST_X_ASSUM MATCH_MP_TAC THEN MP_TAC th) THEN
12175    MATCH_MP_TAC MONO_AND THEN REWRITE_TAC[] THEN MATCH_MP_TAC EQ_IMPLIES THEN
12176    AP_THM_TAC THEN AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN
12177    SIMP_TAC std_ss [] THEN REPEAT STRIP_TAC THEN
12178    ASM_SIMP_TAC std_ss [] THEN
12179    COND_CASES_TAC THEN ASM_REWRITE_TAC[ABS_0]] THEN
12180  REPEAT STRIP_TAC THEN
12181  MATCH_MP_TAC BOUNDED_SETVARIATION_ABSOLUTELY_INTEGRABLE THEN
12182  ASM_REWRITE_TAC[HAS_BOUNDED_SETVARIATION_ON_UNIV] THEN
12183  EXISTS_TAC
12184   ``sum { 1n.. 1n}
12185        (\i. integral univ(:real)
12186              (\x. (abs ((f:real->real) x)):real))`` THEN
12187  X_GEN_TAC ``d:(real->bool)->bool`` THEN DISCH_TAC THEN
12188  MATCH_MP_TAC REAL_LE_TRANS THEN
12189  EXISTS_TAC ``sum d (\k. sum { 1n.. 1n}
12190      (\i. integral k
12191              (\x. (abs ((f:real->real) x)):real)))`` THEN
12192  FIRST_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_FINITE) THEN CONJ_TAC THENL
12193   [MATCH_MP_TAC SUM_LE THEN
12194    UNDISCH_TAC ``d division_of BIGUNION d`` THEN DISCH_TAC THEN
12195    FIRST_ASSUM(fn t => ASM_SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION t]) THEN
12196    MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``] THEN DISCH_TAC THEN
12197    MATCH_MP_TAC REAL_LE_TRANS THEN
12198    EXISTS_TAC ``sum { 1n.. 1n}
12199             (\i. abs((integral (interval[a,b]) (f:real->real))))`` THEN
12200    REWRITE_TAC[ABS_LE_L1] THEN MATCH_MP_TAC SUM_LE_NUMSEG THEN
12201    X_GEN_TAC ``k:num`` THEN STRIP_TAC THEN SIMP_TAC std_ss [] THEN
12202    MATCH_MP_TAC(REAL_ARITH ``x <= y /\ -x <= y ==> abs(x) <= y:real``) THEN
12203    ASM_SIMP_TAC std_ss [] THEN
12204    SUBGOAL_THEN ``(f:real->real) integrable_on interval[a,b] /\
12205        (\x. (abs (f x)):real) integrable_on interval[a,b]``
12206    STRIP_ASSUME_TAC THENL
12207     [CONJ_TAC THEN MATCH_MP_TAC INTEGRABLE_ON_SUBINTERVAL THEN
12208      EXISTS_TAC ``univ(:real)`` THEN ASM_REWRITE_TAC[SUBSET_UNIV],
12209      ALL_TAC] THEN
12210    ASM_SIMP_TAC std_ss [GSYM INTEGRAL_NEG] THEN
12211    CONJ_TAC THEN MATCH_MP_TAC INTEGRAL_COMPONENT_LE THEN
12212    ASM_SIMP_TAC std_ss [INTEGRABLE_NEG] THEN
12213    REPEAT STRIP_TAC THEN REAL_ARITH_TAC,
12214    ALL_TAC] THEN
12215  ONCE_REWRITE_TAC [METIS [] ``(\i. integral k (\x. abs (f x))) =
12216                          (\k. (\i. integral k (\x. abs (f x)))) k``] THEN
12217  W(MP_TAC o PART_MATCH (lhs o rand) SUM_SWAP o lhand o snd) THEN
12218  ASM_REWRITE_TAC[FINITE_NUMSEG] THEN DISCH_THEN SUBST_ALL_TAC THEN
12219  MATCH_MP_TAC SUM_LE_NUMSEG THEN X_GEN_TAC ``k:num`` THEN STRIP_TAC THEN
12220  SIMP_TAC std_ss [] THEN
12221  MATCH_MP_TAC REAL_LE_TRANS THEN
12222  EXISTS_TAC
12223   ``(integral (BIGUNION d) (\x. (abs ((f:real->real) x)):real))`` THEN
12224  CONJ_TAC THENL
12225   [ASM_SIMP_TAC std_ss [] THEN
12226    MATCH_MP_TAC REAL_EQ_IMP_LE THEN
12227    CONV_TAC SYM_CONV THEN MATCH_MP_TAC INTEGRAL_COMBINE_DIVISION_TOPDOWN THEN
12228    ASM_REWRITE_TAC[],
12229    MATCH_MP_TAC INTEGRAL_SUBSET_COMPONENT_LE THEN
12230    ASM_SIMP_TAC std_ss [SUBSET_UNIV, ABS_POS]] THEN
12231  MATCH_MP_TAC INTEGRABLE_ON_SUBDIVISION THEN
12232  MAP_EVERY EXISTS_TAC [``univ(:real)``, ``d:(real->bool)->bool``] THEN
12233  ASM_REWRITE_TAC[SUBSET_UNIV]
12234QED
12235
12236Theorem NONNEGATIVE_ABSOLUTELY_INTEGRABLE:
12237   !f:real->real s.
12238        (!x i. x IN s ==> &0 <= f(x)) /\
12239        f integrable_on s
12240        ==> f absolutely_integrable_on s
12241Proof
12242  SIMP_TAC std_ss [ABSOLUTELY_INTEGRABLE_ABS_EQ] THEN
12243  REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRABLE_EQ THEN
12244  EXISTS_TAC ``f:real->real`` THEN
12245  ASM_SIMP_TAC std_ss [abs]
12246QED
12247
12248Theorem ABSOLUTELY_INTEGRABLE_INTEGRABLE_BOUND:
12249   !f:real->real g s.
12250        (!x. x IN s ==> abs(f x) <= (g x)) /\
12251        f integrable_on s /\ g integrable_on s
12252        ==> f absolutely_integrable_on s
12253Proof
12254  SUBGOAL_THEN
12255   ``!f:real->real g.
12256        (!x. abs(f x) <= (g x)) /\
12257        f integrable_on univ(:real) /\ g integrable_on univ(:real)
12258        ==> f absolutely_integrable_on univ(:real)``
12259  ASSUME_TAC THENL
12260   [ALL_TAC,
12261    ONCE_REWRITE_TAC[GSYM INTEGRABLE_RESTRICT_UNIV, GSYM
12262                     ABSOLUTELY_INTEGRABLE_RESTRICT_UNIV] THEN
12263    REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
12264    EXISTS_TAC ``(\x. if x IN s then g x else 0):real->real`` THEN
12265    ASM_SIMP_TAC std_ss [] THEN GEN_TAC THEN COND_CASES_TAC THEN
12266    ASM_SIMP_TAC std_ss [REAL_LE_REFL, ABS_0]] THEN
12267  REPEAT STRIP_TAC THEN
12268  MATCH_MP_TAC BOUNDED_SETVARIATION_ABSOLUTELY_INTEGRABLE THEN
12269  ASM_REWRITE_TAC[HAS_BOUNDED_SETVARIATION_ON_UNIV] THEN
12270  EXISTS_TAC ``integral univ(:real) g`` THEN
12271  X_GEN_TAC ``d:(real->bool)->bool`` THEN DISCH_TAC THEN
12272  FIRST_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_FINITE) THEN
12273  MATCH_MP_TAC REAL_LE_TRANS THEN
12274  EXISTS_TAC ``sum d (\k. (integral k (g:real->real)))`` THEN
12275  CONJ_TAC THENL
12276   [MATCH_MP_TAC SUM_LE THEN ASM_REWRITE_TAC[] THEN
12277    UNDISCH_TAC ``d division_of BIGUNION d`` THEN DISCH_TAC THEN
12278    FIRST_ASSUM(fn th => SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION th]) THEN
12279    REPEAT STRIP_TAC THEN
12280    MATCH_MP_TAC INTEGRAL_ABS_BOUND_INTEGRAL THEN ASM_REWRITE_TAC[] THEN
12281    CONJ_TAC THEN MATCH_MP_TAC INTEGRABLE_ON_SUBINTERVAL THEN
12282    EXISTS_TAC ``univ(:real)`` THEN ASM_REWRITE_TAC[SUBSET_UNIV],
12283    ALL_TAC] THEN
12284  MATCH_MP_TAC REAL_LE_TRANS THEN
12285  EXISTS_TAC ``(integral (BIGUNION d:real->bool) g)`` THEN CONJ_TAC THENL
12286   [MATCH_MP_TAC(REAL_ARITH ``(x = y:real) ==> y <= x``) THEN
12287    ASM_SIMP_TAC std_ss [o_DEF] THEN
12288    MATCH_MP_TAC INTEGRAL_COMBINE_DIVISION_BOTTOMUP THEN
12289    FIRST_ASSUM(fn th => ASM_REWRITE_TAC[MATCH_MP FORALL_IN_DIVISION th]) THEN
12290    REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRABLE_ON_SUBINTERVAL THEN
12291    EXISTS_TAC ``univ(:real)`` THEN ASM_REWRITE_TAC[SUBSET_UNIV],
12292    MATCH_MP_TAC INTEGRAL_SUBSET_DROP_LE THEN
12293    ASM_REWRITE_TAC[SUBSET_UNIV, IN_UNIV] THEN CONJ_TAC THENL
12294     [ALL_TAC, ASM_MESON_TAC[REAL_ARITH ``abs(x) <= y ==> &0 <= y:real``]] THEN
12295    MATCH_MP_TAC INTEGRABLE_ON_SUBDIVISION THEN
12296    MAP_EVERY EXISTS_TAC [``univ(:real)``, ``d:(real->bool)->bool``] THEN
12297    ASM_REWRITE_TAC[SUBSET_UNIV]]
12298QED
12299
12300Theorem ABSOLUTELY_INTEGRABLE_ABSOLUTELY_INTEGRABLE_BOUND:
12301   !f:real->real g:real->real s.
12302        (!x. x IN s ==> abs(f x) <= abs(g x)) /\
12303        f integrable_on s /\ g absolutely_integrable_on s
12304        ==> f absolutely_integrable_on s
12305Proof
12306  REPEAT STRIP_TAC THEN
12307  FIRST_X_ASSUM(STRIP_ASSUME_TAC o REWRITE_RULE
12308    [absolutely_integrable_on]) THEN
12309  MP_TAC(ISPECL
12310   [``f:real->real``, ``(\x. abs((g:real->real) x))``,
12311    ``s:real->bool``] ABSOLUTELY_INTEGRABLE_INTEGRABLE_BOUND) THEN
12312  ASM_SIMP_TAC std_ss []
12313QED
12314
12315Theorem ABSOLUTELY_INTEGRABLE_INF:
12316   !fs s:real->bool k:'a->bool.
12317        FINITE k /\ ~(k = {}) /\
12318        (!i. i IN k ==> (\x. (fs x i)) absolutely_integrable_on s)
12319        ==> (\x. (inf (IMAGE (fs x) k))) absolutely_integrable_on s
12320Proof
12321  GEN_TAC THEN GEN_TAC THEN REWRITE_TAC[IMP_CONJ] THEN
12322  ONCE_REWRITE_TAC [METIS []
12323   ``!k. (k <> {} ==>
12324  (!i. i IN k ==> (\x. fs x i) absolutely_integrable_on s) ==>
12325  (\x. inf (IMAGE (fs x) k)) absolutely_integrable_on s) =
12326     (\k. k <> {} ==>
12327  (!i. i IN k ==> (\x. fs x i) absolutely_integrable_on s) ==>
12328  (\x. inf (IMAGE (fs x) k)) absolutely_integrable_on s) k``] THEN
12329  MATCH_MP_TAC FINITE_INDUCT THEN BETA_TAC THEN
12330  SIMP_TAC std_ss [IMAGE_EMPTY, IMAGE_INSERT] THEN
12331  SIMP_TAC std_ss [GSYM RIGHT_FORALL_IMP_THM] THEN
12332  SIMP_TAC std_ss [INF_INSERT_FINITE, IMAGE_FINITE, IMAGE_EQ_EMPTY] THEN
12333  MAP_EVERY X_GEN_TAC [``k:'a->bool``, ``a:'a``] THEN
12334  ASM_CASES_TAC ``k:'a->bool = {}`` THEN ASM_REWRITE_TAC[] THEN
12335  SIMP_TAC std_ss [IN_SING, LEFT_FORALL_IMP_THM, EXISTS_REFL] THEN
12336  REWRITE_TAC[AND_IMP_INTRO, GSYM CONJ_ASSOC] THEN REPEAT STRIP_TAC THEN
12337  ONCE_REWRITE_TAC [METIS [] ``(\(x :real).
12338   min ((fs :real -> 'a -> real) x (a :'a))
12339     (inf (IMAGE (fs x) (k :'a -> bool)))) =
12340   (\x. min ((\x. fs x a) x) ((\x. inf (IMAGE (fs x) k)) x))``] THEN
12341  MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_MIN THEN
12342  CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN REWRITE_TAC[IN_INSERT] THEN
12343  REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
12344  ASM_REWRITE_TAC[IN_INSERT]
12345QED
12346
12347Theorem ABSOLUTELY_INTEGRABLE_SUP:
12348   !fs s:real->bool k:'a->bool.
12349        FINITE k /\ ~(k = {}) /\
12350        (!i. i IN k ==> (\x. (fs x i)) absolutely_integrable_on s)
12351        ==> (\x. (sup (IMAGE (fs x) k))) absolutely_integrable_on s
12352Proof
12353  GEN_TAC THEN GEN_TAC THEN REWRITE_TAC[IMP_CONJ] THEN
12354  ONCE_REWRITE_TAC [METIS []
12355   ``!k. (k <> {} ==>
12356  (!i. i IN k ==> (\x. fs x i) absolutely_integrable_on s) ==>
12357  (\x. sup (IMAGE (fs x) k)) absolutely_integrable_on s) =
12358     (\k. k <> {} ==>
12359  (!i. i IN k ==> (\x. fs x i) absolutely_integrable_on s) ==>
12360  (\x. sup (IMAGE (fs x) k)) absolutely_integrable_on s) k``] THEN
12361  MATCH_MP_TAC FINITE_INDUCT THEN SIMP_TAC std_ss [IMAGE_EMPTY, IMAGE_INSERT] THEN
12362  SIMP_TAC std_ss [GSYM RIGHT_FORALL_IMP_THM] THEN
12363  SIMP_TAC std_ss [SUP_INSERT_FINITE, IMAGE_FINITE, IMAGE_EQ_EMPTY] THEN
12364  MAP_EVERY X_GEN_TAC [``k:'a->bool``, ``a:'a``] THEN
12365  ASM_CASES_TAC ``k:'a->bool = {}`` THEN ASM_REWRITE_TAC[] THEN
12366  SIMP_TAC std_ss [IN_SING, LEFT_FORALL_IMP_THM, EXISTS_REFL] THEN
12367  REWRITE_TAC[AND_IMP_INTRO, GSYM CONJ_ASSOC] THEN REPEAT STRIP_TAC THEN
12368  ONCE_REWRITE_TAC [METIS []
12369   ``(\x. max ((fs :real -> 'a -> real) x a) (sup (IMAGE (fs x) k))) =
12370     (\x. max ((\x. fs x a) x) ((\x. sup (IMAGE (fs x) k)) x))``] THEN
12371  MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_MAX THEN
12372  CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN REWRITE_TAC[IN_INSERT] THEN
12373  REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
12374  ASM_REWRITE_TAC[IN_INSERT]
12375QED
12376
12377Theorem ABSOLUTELY_INTEGRABLE_CONTINUOUS:
12378   !f:real->real a b.
12379        f continuous_on interval[a,b]
12380        ==> f absolutely_integrable_on interval[a,b]
12381Proof
12382  REPEAT STRIP_TAC THEN
12383  MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_INTEGRABLE_BOUND THEN
12384  SUBGOAL_THEN ``compact(IMAGE (f:real->real) (interval[a,b]))`` MP_TAC THENL
12385   [ASM_SIMP_TAC std_ss [COMPACT_CONTINUOUS_IMAGE, COMPACT_INTERVAL], ALL_TAC] THEN
12386  DISCH_THEN(MP_TAC o MATCH_MP COMPACT_IMP_BOUNDED) THEN
12387  SIMP_TAC std_ss [BOUNDED_POS, FORALL_IN_IMAGE] THEN
12388  DISCH_THEN(X_CHOOSE_THEN ``B:real`` STRIP_ASSUME_TAC) THEN
12389  EXISTS_TAC ``\x:real. (B:real)`` THEN
12390  ASM_SIMP_TAC std_ss [INTEGRABLE_CONST, INTEGRABLE_CONTINUOUS]
12391QED
12392
12393Theorem INTEGRABLE_MIN_CONST :
12394    !f s t.
12395        &0 <= t /\ (!x. x IN s ==> &0 <= f x) /\
12396        (\x:real. (f x)) integrable_on s
12397        ==> (\x. (min (f x) t)) integrable_on s
12398Proof
12399  REPEAT STRIP_TAC THEN
12400  MATCH_MP_TAC INTEGRABLE_ON_ALL_INTERVALS_INTEGRABLE_BOUND THEN
12401  EXISTS_TAC ``\x:real. (f x):real`` THEN ASM_SIMP_TAC std_ss [] THEN CONJ_TAC THENL
12402  [ (* goal 1 (of 2) *)
12403    REPEAT GEN_TAC THEN
12404    MP_TAC(ISPECL
12405     [``\x:real. if x IN s then f x else &0:real``,
12406      ``(\x. t):real->real``,
12407      ``interval[a:real,b]``] ABSOLUTELY_INTEGRABLE_MIN) THEN
12408    SIMP_TAC std_ss [] THEN
12409    KNOW_TAC ``(\(x :real).
12410     if x IN (s :real -> bool) then (f :real -> real) x
12411     else (0 :real)) absolutely_integrable_on
12412      interval [((a :real),(b :real))] /\
12413      (\(x :real). (t :real)) absolutely_integrable_on interval [(a,b)]`` THENL
12414    [ (* goal 1.1 (of 2) *)
12415      SIMP_TAC std_ss [ABSOLUTELY_INTEGRABLE_CONTINUOUS, CONTINUOUS_ON_CONST] THEN
12416      MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_ON_SUBINTERVAL THEN
12417      EXISTS_TAC ``univ(:real)`` THEN SIMP_TAC std_ss [SUBSET_UNIV] THEN
12418      SIMP_TAC std_ss [COND_RAND] THEN
12419      REWRITE_TAC[ABSOLUTELY_INTEGRABLE_RESTRICT_UNIV] THEN
12420      MATCH_MP_TAC NONNEGATIVE_ABSOLUTELY_INTEGRABLE THEN
12421      ASM_SIMP_TAC std_ss [IMP_CONJ, RIGHT_FORALL_IMP_THM] THEN
12422      METIS_TAC[AND_IMP_INTRO, ETA_AX],
12423      (* goal 1.2 (of 2) *)
12424      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
12425      DISCH_THEN(MP_TAC o MATCH_MP ABSOLUTELY_INTEGRABLE_IMP_INTEGRABLE) THEN
12426      MATCH_MP_TAC EQ_IMPLIES THEN AP_THM_TAC THEN AP_TERM_TAC THEN
12427      REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN SIMP_TAC std_ss [] THEN
12428      COND_CASES_TAC THEN ASM_SIMP_TAC std_ss [] THEN
12429      REWRITE_TAC [min_def] THEN fs [] ],
12430    (* goal 2 (of 2) *)
12431    X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN
12432    FIRST_X_ASSUM(MP_TAC o SPEC ``x:real``) THEN
12433    RW_TAC real_ss [min_def] >> ASM_REAL_ARITH_TAC ]
12434QED
12435
12436Theorem ABSOLUTELY_INTEGRABLE_ABSOLUTELY_INTEGRABLE_COMPONENT_UBOUND:
12437   !f:real->real g:real->real s.
12438        (!x i. x IN s ==> f(x) <= g(x)) /\
12439        f integrable_on s /\ g absolutely_integrable_on s
12440        ==> f absolutely_integrable_on s
12441Proof
12442  REPEAT STRIP_TAC THEN SUBGOAL_THEN
12443   ``(\x. (g:real->real)(x) - (g(x) - f(x))) absolutely_integrable_on s``
12444  MP_TAC THENL
12445   [ONCE_REWRITE_TAC [METIS [] ``(\x. g x - (g x - f x:real)) =
12446                            (\x. g x - (\x. (g x - f x)) x)``] THEN
12447    MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_SUB THEN
12448    ASM_REWRITE_TAC[] THEN MATCH_MP_TAC NONNEGATIVE_ABSOLUTELY_INTEGRABLE THEN
12449    ASM_SIMP_TAC std_ss [REAL_SUB_LE] THEN
12450    MATCH_MP_TAC INTEGRABLE_SUB THEN
12451    ASM_SIMP_TAC std_ss [ABSOLUTELY_INTEGRABLE_IMP_INTEGRABLE],
12452    SIMP_TAC std_ss[REAL_ARITH ``x - (x - y):real = y``, ETA_AX]]
12453QED
12454
12455Theorem ABSOLUTELY_INTEGRABLE_ABSOLUTELY_INTEGRABLE_COMPONENT_LBOUND:
12456   !f:real->real g:real->real s.
12457        (!x i. x IN s ==> f(x) <= g(x)) /\
12458        f absolutely_integrable_on s /\ g integrable_on s
12459        ==> g absolutely_integrable_on s
12460Proof
12461  REPEAT STRIP_TAC THEN SUBGOAL_THEN
12462   ``(\x. (f:real->real)(x) + (g(x) - f(x))) absolutely_integrable_on s``
12463  MP_TAC THENL
12464   [ONCE_REWRITE_TAC [METIS [] ``(\x. f x + (g x - f x:real)) =
12465                            (\x. f x + (\x. (g x - f x)) x)``] THEN
12466    MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_ADD THEN
12467    ASM_REWRITE_TAC[] THEN MATCH_MP_TAC NONNEGATIVE_ABSOLUTELY_INTEGRABLE THEN
12468    ASM_SIMP_TAC std_ss [REAL_SUB_LE] THEN
12469    MATCH_MP_TAC INTEGRABLE_SUB THEN
12470    ASM_SIMP_TAC std_ss [ABSOLUTELY_INTEGRABLE_IMP_INTEGRABLE],
12471    SIMP_TAC std_ss [REAL_ARITH ``y + (x - y):real = x``, ETA_AX]]
12472QED
12473
12474Theorem ABSOLUTELY_INTEGRABLE_ABSOLUTELY_INTEGRABLE_UBOUND:
12475   !f:real->real g:real->real s.
12476        (!x. x IN s ==> f(x) <= g(x)) /\
12477        f integrable_on s /\ g absolutely_integrable_on s
12478        ==> f absolutely_integrable_on s
12479Proof
12480  REPEAT STRIP_TAC THEN MATCH_MP_TAC
12481    ABSOLUTELY_INTEGRABLE_ABSOLUTELY_INTEGRABLE_COMPONENT_UBOUND THEN
12482  EXISTS_TAC ``g:real->real`` THEN
12483  ASM_SIMP_TAC std_ss [IMP_CONJ, RIGHT_FORALL_IMP_THM] THEN
12484  ASM_SIMP_TAC std_ss [AND_IMP_INTRO]
12485QED
12486
12487Theorem ABSOLUTELY_INTEGRABLE_ABSOLUTELY_INTEGRABLE_LBOUND:
12488   !f:real->real g:real->real s.
12489        (!x. x IN s ==> f(x) <= g(x)) /\
12490        f absolutely_integrable_on s /\ g integrable_on s
12491        ==> g absolutely_integrable_on s
12492Proof
12493  REPEAT STRIP_TAC THEN MATCH_MP_TAC
12494    ABSOLUTELY_INTEGRABLE_ABSOLUTELY_INTEGRABLE_COMPONENT_LBOUND THEN
12495  EXISTS_TAC ``f:real->real`` THEN
12496  ASM_SIMP_TAC std_ss [IMP_CONJ, RIGHT_FORALL_IMP_THM] THEN
12497  ASM_SIMP_TAC std_ss [AND_IMP_INTRO]
12498QED
12499
12500(* ------------------------------------------------------------------------- *)
12501(* Relating vector integrals to integrals of components.                     *)
12502(* ------------------------------------------------------------------------- *)
12503
12504Theorem HAS_INTEGRAL_COMPONENTWISE:
12505   !f:real->real s y.
12506        (f has_integral y) s <=> ((\x. (f x)) has_integral (y)) s
12507Proof
12508  METIS_TAC [ETA_AX]
12509QED
12510
12511Theorem INTEGRABLE_COMPONENTWISE:
12512   !f:real->real s.
12513        f integrable_on s <=>
12514         (\x. (f x)) integrable_on s
12515Proof
12516   METIS_TAC [ETA_AX]
12517QED
12518
12519Theorem INTEGRAL_COMPONENT:
12520   !f:real->real s.
12521        f integrable_on s
12522        ==> ((integral s f) = integral s (\x. (f x)))
12523Proof
12524  METIS_TAC [ETA_AX]
12525QED
12526
12527Theorem ABSOLUTELY_INTEGRABLE_COMPONENTWISE:
12528   !f:real->real s.
12529     f absolutely_integrable_on s <=>
12530      ((\x. (f x)) absolutely_integrable_on s)
12531Proof
12532  METIS_TAC [ETA_AX]
12533QED
12534
12535(* ------------------------------------------------------------------------- *)
12536(* Dominated convergence.                                                    *)
12537(* ------------------------------------------------------------------------- *)
12538
12539Theorem DOMINATED_CONVERGENCE:
12540   !f:num->real->real g h s.
12541        (!k. (f k) integrable_on s) /\ h integrable_on s /\
12542        (!k x. x IN s ==> abs(f k x) <= (h x)) /\
12543        (!x. x IN s ==> ((\k. f k x) --> g x) sequentially)
12544        ==> g integrable_on s /\
12545            ((\k. integral s (f k)) --> integral s g) sequentially
12546Proof
12547  REPEAT GEN_TAC THEN STRIP_TAC THEN
12548  MP_TAC(GEN ``m:num``
12549   (ISPECL [``\k:num x:real. inf { f j x | j IN {m..m+k}}``,
12550            ``\x:real. inf { f j x | m:num <= j}``,
12551            ``s:real->bool``]
12552           MONOTONE_CONVERGENCE_DECREASING)) THEN SIMP_TAC std_ss [] THEN
12553   KNOW_TAC ``!m. ((!(k :num).
12554    (\(x :real).
12555       inf
12556         {(f :num -> real -> real) j x |
12557          j IN {m .. m + k}}) integrable_on (s :real -> bool)) /\
12558 (!(k :num) (x :real).
12559    x IN s ==>
12560    inf {f j x | j IN {m .. m + SUC k}} <=
12561    inf {f j x | j IN {m .. m + k}}) /\
12562 (!(x :real).
12563    x IN s ==>
12564    (((\(k :num). inf {f j x | j IN {m .. m + k}}) -->
12565      inf {f j x | m <= j}) sequentially :bool)) /\
12566 (bounded
12567    {integral s (\(x :real). inf {f j x | j IN {m .. m + k}}) |
12568     k IN univ((:num) :num itself)} :bool))`` THENL (* 2 goals *)
12569   [X_GEN_TAC ``m:num`` THEN REPEAT CONJ_TAC THENL (* 4 goals *)
12570     [GEN_TAC THEN MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_IMP_INTEGRABLE THEN
12571      SIMP_TAC real_ss [GSYM IMAGE_DEF] THEN
12572      ONCE_REWRITE_TAC [METIS [] ``(\j. f j x) = (\x. (\j. f j x)) x``] THEN
12573      MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_INF THEN
12574      SIMP_TAC std_ss [FINITE_NUMSEG, NUMSEG_EMPTY, NOT_LESS, LE_ADD] THEN
12575      ASM_SIMP_TAC std_ss [METIS [ETA_AX] ``(\x. f i x) = f i``] THEN
12576      REPEAT STRIP_TAC THEN
12577      MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_INTEGRABLE_BOUND THEN
12578      EXISTS_TAC ``h:real->real`` THEN ASM_REWRITE_TAC[],
12579
12580      REPEAT STRIP_TAC THEN SIMP_TAC real_ss [GSYM IMAGE_DEF] THEN
12581      MATCH_MP_TAC REAL_LE_INF_SUBSET THEN
12582      SIMP_TAC std_ss [IMAGE_EQ_EMPTY, NUMSEG_EMPTY, NOT_LESS, LE_ADD] THEN
12583      CONJ_TAC THENL
12584       [MATCH_MP_TAC IMAGE_SUBSET THEN
12585        REWRITE_TAC[SUBSET_NUMSEG] THEN ARITH_TAC,
12586        ALL_TAC] THEN
12587      SIMP_TAC std_ss [FORALL_IN_IMAGE] THEN
12588      ONCE_REWRITE_TAC [METIS []
12589      ``(b <= (f:num->real->real) j x) <=> b <= (\j. f j x) j``] THEN
12590      MATCH_MP_TAC LOWER_BOUND_FINITE_SET_REAL THEN
12591      REWRITE_TAC[FINITE_NUMSEG],
12592
12593      X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN
12594      REWRITE_TAC[LIM_SEQUENTIALLY] THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
12595      REWRITE_TAC[dist] THEN
12596      MP_TAC(SPEC ``{((f:num->real->real) j x) | m <= j}`` INF) THEN
12597      ABBREV_TAC ``i = inf {(f:num->real->real) j x | m <= j}`` THEN
12598      ONCE_REWRITE_TAC [METIS [SIMPLE_IMAGE_GEN] ``{(f:num->real->real) j x | m <= j} =
12599                                    IMAGE (\j. f j x) {j | m <= j}``] THEN
12600      SIMP_TAC std_ss [FORALL_IN_IMAGE, EXISTS_IN_IMAGE, IMAGE_EQ_EMPTY] THEN
12601      SIMP_TAC std_ss [GSPECIFICATION, EXTENSION, NOT_IN_EMPTY] THEN
12602      KNOW_TAC ``(?(x :num). (m :num) <= x) /\ (?(b :real).
12603       !(j :num). m <= j ==> b <= (f :num -> real -> real) j (x :real))`` THENL
12604       [CONJ_TAC THENL [METIS_TAC[LESS_EQ_REFL], ALL_TAC] THEN
12605        EXISTS_TAC ``-(h(x:real)):real`` THEN X_GEN_TAC ``j:num`` THEN
12606        FIRST_X_ASSUM(MP_TAC o SPECL [``j:num``, ``x:real``]) THEN
12607        ASM_SIMP_TAC std_ss [] THEN REAL_ARITH_TAC,
12608        DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
12609      DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC (MP_TAC o SPEC ``i + e:real``)) THEN
12610      ASM_SIMP_TAC std_ss [REAL_ARITH ``&0 < e ==> ~(i + e <= i:real)``] THEN
12611      SIMP_TAC std_ss [NOT_FORALL_THM, NOT_IMP, REAL_NOT_LE] THEN
12612      DISCH_THEN (X_CHOOSE_TAC ``M:num``) THEN EXISTS_TAC ``M:num`` THEN
12613      X_GEN_TAC ``n:num`` THEN DISCH_TAC THEN
12614      UNDISCH_TAC ``m <= M /\ (f:num->real->real) M x < i + e`` THEN STRIP_TAC THEN
12615      FIRST_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
12616       ``y < i + e ==> i <= ix /\ ix <= y ==> abs(ix - i) < e:real``)) THEN
12617      CONJ_TAC THENL
12618       [EXPAND_TAC "i" THEN MATCH_MP_TAC REAL_LE_INF_SUBSET THEN
12619        ONCE_REWRITE_TAC [METIS [SIMPLE_IMAGE_GEN]
12620        ``{(f:num->real->real) j x | j IN t} =
12621           IMAGE (\j. f j x) {j | j IN t}``] THEN
12622        SIMP_TAC std_ss [IMAGE_EQ_EMPTY, SET_RULE ``{x | x IN s} = s``] THEN
12623        SIMP_TAC std_ss [NUMSEG_EMPTY, NOT_LESS, LE_ADD] THEN
12624        ONCE_REWRITE_TAC [METIS [SIMPLE_IMAGE_GEN]
12625        ``{(f:num->real->real) j x | m <= j} =
12626           IMAGE (\j. f j x) {j | m <= j}``] THEN
12627        CONJ_TAC THENL
12628         [MATCH_MP_TAC IMAGE_SUBSET THEN
12629          SIMP_TAC std_ss [SUBSET_DEF, IN_NUMSEG, GSPECIFICATION] THEN ARITH_TAC,
12630          SIMP_TAC std_ss [FORALL_IN_IMAGE, GSPECIFICATION] THEN ASM_MESON_TAC[]],
12631        ALL_TAC] THEN
12632      W(MP_TAC o C SPEC INF o rand o lhand o snd) THEN
12633      KNOW_TAC
12634      “{(f :num -> real -> real) j (x :real) | j IN {m .. m + n}} <> {} /\
12635       ?b. !x'. x' IN {f j x | j IN {m .. m + n}} ==> b <= x'”
12636      THENL
12637       [ONCE_REWRITE_TAC [METIS [SIMPLE_IMAGE_GEN]
12638        ``{(f:num->real->real) j x | j IN t} =
12639           IMAGE (\j. f j x) {j | j IN t}``] THEN
12640        SIMP_TAC std_ss [IMAGE_EQ_EMPTY, SET_RULE ``{x | x IN s} = s``] THEN
12641        REWRITE_TAC[NUMSEG_EMPTY, NOT_LESS, LE_ADD] THEN
12642        SIMP_TAC std_ss [FORALL_IN_IMAGE, GSPECIFICATION] THEN
12643        EXISTS_TAC ``i:real`` THEN GEN_TAC THEN REWRITE_TAC[IN_NUMSEG] THEN
12644        DISCH_THEN(fn th => FIRST_ASSUM MATCH_MP_TAC THEN MP_TAC th) THEN
12645        ARITH_TAC,
12646        DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
12647      SIMP_TAC std_ss [FORALL_IN_IMAGE] THEN
12648      DISCH_THEN(MATCH_MP_TAC o CONJUNCT1) THEN
12649      SIMP_TAC std_ss [GSPECIFICATION, IN_NUMSEG] THEN
12650      EXISTS_TAC ``M:num`` THEN ASM_SIMP_TAC arith_ss [],
12651
12652      REWRITE_TAC[bounded_def] THEN
12653      EXISTS_TAC ``integral s (h:real->real)`` THEN
12654      SIMP_TAC real_ss [GSYM IMAGE_DEF] THEN
12655      SIMP_TAC std_ss [FORALL_IN_IMAGE, IN_UNIV] THEN
12656      X_GEN_TAC ``p:num`` THEN MATCH_MP_TAC INTEGRAL_ABS_BOUND_INTEGRAL THEN
12657      ASM_SIMP_TAC std_ss [] THEN CONJ_TAC THENL
12658       [MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_IMP_INTEGRABLE THEN
12659        SIMP_TAC real_ss [GSYM IMAGE_DEF] THEN
12660        ONCE_REWRITE_TAC [METIS [] ``(\j. f j x) = (\x. (\j. f j x)) x``] THEN
12661        MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_INF THEN
12662        SIMP_TAC std_ss [FINITE_NUMSEG, NUMSEG_EMPTY, NOT_LESS, LE_ADD] THEN
12663        ASM_REWRITE_TAC[METIS [ETA_AX] ``(\x. f i x) = f i``] THEN REPEAT STRIP_TAC THEN
12664        MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_INTEGRABLE_BOUND THEN
12665        EXISTS_TAC ``h:real->real`` THEN ASM_SIMP_TAC std_ss [],
12666        ALL_TAC] THEN
12667      X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN
12668      SIMP_TAC std_ss [] THEN
12669      MATCH_MP_TAC REAL_ABS_INF_LE THEN SIMP_TAC real_ss [GSYM IMAGE_DEF] THEN
12670      SIMP_TAC std_ss [FORALL_IN_IMAGE, IMAGE_EQ_EMPTY] THEN
12671      ASM_SIMP_TAC std_ss [NUMSEG_EMPTY, NOT_LESS, LE_ADD] ],
12672
12673    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
12674    SIMP_TAC std_ss [FORALL_AND_THM] THEN STRIP_TAC ] THEN
12675  MP_TAC(GEN ``m:num``
12676    (ISPECL [``\k:num x:real. sup {(f j x) | j IN {m..m+k}}``,
12677            ``\x:real. sup {(f j x) | m:num <= j}``,
12678            ``s:real->bool``]
12679           MONOTONE_CONVERGENCE_INCREASING)) THEN
12680  SIMP_TAC std_ss [] THEN
12681  KNOW_TAC ``!m. ((!(k :num).
12682    (\(x :real).
12683       sup
12684         {(f :num -> real -> real) j x |
12685          j IN {m .. m + k}}) integrable_on (s :real -> bool)) /\
12686   (!(k :num) (x :real). x IN s ==>
12687    sup {f j x | j IN {m .. m + k}} <=
12688    sup {f j x | j IN {m .. m + SUC k}}) /\
12689   (!(x :real). x IN s ==>
12690    (((\(k :num). sup {f j x | j IN {m .. m + k}}) -->
12691      sup {f j x | m <= j}) sequentially :bool)) /\
12692   (bounded {integral s (\(x :real). sup {f j x | j IN {m .. m + k}}) |
12693     k IN univ((:num) :num itself)} :bool))`` THENL
12694   [POP_ASSUM K_TAC THEN POP_ASSUM K_TAC THEN GEN_TAC THEN REPEAT CONJ_TAC THENL
12695     [GEN_TAC THEN MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_IMP_INTEGRABLE THEN
12696      SIMP_TAC real_ss [GSYM IMAGE_DEF] THEN
12697      ONCE_REWRITE_TAC [METIS [] ``(\j. f j x) = (\x. (\j. f j x)) x``] THEN
12698      MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_SUP THEN
12699      SIMP_TAC std_ss [FINITE_NUMSEG, NUMSEG_EMPTY, NOT_LESS, LE_ADD] THEN
12700      ASM_REWRITE_TAC[METIS [ETA_AX] ``(\x. f i x) = f i``] THEN
12701      REPEAT STRIP_TAC THEN
12702      MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_INTEGRABLE_BOUND THEN
12703      EXISTS_TAC ``h:real->real`` THEN ASM_REWRITE_TAC[],
12704      REPEAT STRIP_TAC THEN SIMP_TAC real_ss [GSYM IMAGE_DEF] THEN
12705      MATCH_MP_TAC REAL_SUP_LE_SUBSET THEN
12706      SIMP_TAC std_ss [IMAGE_EQ_EMPTY, NUMSEG_EMPTY, NOT_LESS, LE_ADD] THEN
12707      CONJ_TAC THENL
12708       [MATCH_MP_TAC IMAGE_SUBSET THEN
12709        REWRITE_TAC[SUBSET_NUMSEG] THEN ARITH_TAC,
12710        ALL_TAC] THEN
12711      SIMP_TAC std_ss [FORALL_IN_IMAGE] THEN
12712      ONCE_REWRITE_TAC [METIS [] ``(((f:num->real->real) j x) <= b) =
12713                                             (((\j. f j x) j) <= b)``] THEN
12714      MATCH_MP_TAC UPPER_BOUND_FINITE_SET_REAL THEN
12715      REWRITE_TAC[FINITE_NUMSEG],
12716      X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN
12717      REWRITE_TAC[LIM_SEQUENTIALLY] THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
12718      REWRITE_TAC[dist] THEN
12719      MP_TAC(SPEC ``{(f:num->real->real) j x | m <= j}`` SUP) THEN
12720      ABBREV_TAC ``i = sup {(f:num->real->real) j x | m <= j}`` THEN
12721      ONCE_REWRITE_TAC [METIS [SIMPLE_IMAGE_GEN]
12722      ``{(f:num->real->real) j x | m <= j} =
12723        IMAGE (\j. (f:num->real->real) j x) {j | m <= j}``] THEN
12724      SIMP_TAC std_ss [FORALL_IN_IMAGE, EXISTS_IN_IMAGE, IMAGE_EQ_EMPTY] THEN
12725      SIMP_TAC std_ss [GSPECIFICATION, EXTENSION, NOT_IN_EMPTY] THEN
12726      KNOW_TAC ``(?(x :num). (m :num) <= x) /\ (?(b :real).
12727      !(j :num). m <= j ==> (f :num -> real -> real) j (x :real) <= b)`` THENL
12728       [CONJ_TAC THENL [MESON_TAC[LESS_EQ_REFL], ALL_TAC] THEN
12729        EXISTS_TAC ``(h (x:real)):real`` THEN X_GEN_TAC ``j:num`` THEN
12730        FIRST_X_ASSUM(MP_TAC o SPECL [``j:num``, ``x:real``]) THEN
12731        ASM_SIMP_TAC std_ss [] THEN REAL_ARITH_TAC,
12732        DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
12733      DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC (MP_TAC o SPEC ``i - e:real``)) THEN
12734      ASM_SIMP_TAC std_ss [REAL_ARITH ``&0:real < e ==> ~(i <= i - e)``] THEN
12735      SIMP_TAC std_ss [NOT_FORALL_THM, NOT_IMP, REAL_NOT_LE] THEN
12736      DISCH_THEN (X_CHOOSE_TAC ``M:num``) THEN EXISTS_TAC ``M:num`` THEN
12737      X_GEN_TAC ``n:num`` THEN DISCH_TAC THEN
12738      UNDISCH_TAC `` m <= M /\ i - e < (f:num->real->real) M x`` THEN STRIP_TAC THEN
12739      FIRST_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
12740       ``i - e < y ==> ix <= i /\ y <= ix ==> abs(ix - i) < e:real``)) THEN
12741      CONJ_TAC THENL
12742       [EXPAND_TAC "i" THEN MATCH_MP_TAC REAL_SUP_LE_SUBSET THEN
12743        ONCE_REWRITE_TAC [METIS [SIMPLE_IMAGE_GEN]
12744        ``{(f:num->real->real) j x | j IN t} =
12745          IMAGE (\j. f j x) {j | j IN t}``] THEN
12746        SIMP_TAC std_ss [IMAGE_EQ_EMPTY, SET_RULE ``{x | x IN s} = s``] THEN
12747        REWRITE_TAC[NUMSEG_EMPTY, NOT_LESS, LE_ADD] THEN
12748        ONCE_REWRITE_TAC [METIS [SIMPLE_IMAGE_GEN]
12749        ``{(f:num->real->real) j x | m <= j} =
12750           IMAGE (\j. f j x) {j | m <= j}``] THEN CONJ_TAC THENL
12751         [MATCH_MP_TAC IMAGE_SUBSET THEN
12752          SIMP_TAC std_ss [SUBSET_DEF, IN_NUMSEG, GSPECIFICATION] THEN ARITH_TAC,
12753          SIMP_TAC std_ss [FORALL_IN_IMAGE, GSPECIFICATION] THEN ASM_MESON_TAC[]],
12754        ALL_TAC] THEN
12755      W(MP_TAC o C SPEC SUP o rand o rand o snd) THEN
12756      KNOW_TAC ``{(f:num->real->real) j x | j IN {m..m + n}} <> {} /\
12757       (?b. !x'. x' IN {f j x | j IN {m..m + n}} ==> x' <= b)`` THENL
12758       [ONCE_REWRITE_TAC [METIS [SIMPLE_IMAGE_GEN]
12759        ``{(f:num->real->real) j x | j IN t} =
12760          IMAGE (\j. f j x) {j | j IN t}``] THEN
12761        SIMP_TAC std_ss [IMAGE_EQ_EMPTY, SET_RULE ``{x | x IN s} = s``] THEN
12762        REWRITE_TAC[NUMSEG_EMPTY, NOT_LESS, LE_ADD] THEN
12763        SIMP_TAC std_ss [FORALL_IN_IMAGE, GSPECIFICATION] THEN
12764        EXISTS_TAC ``i:real`` THEN GEN_TAC THEN REWRITE_TAC[IN_NUMSEG] THEN
12765        DISCH_THEN(fn th => FIRST_ASSUM MATCH_MP_TAC THEN MP_TAC th) THEN
12766        ARITH_TAC, DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
12767      SIMP_TAC std_ss [FORALL_IN_IMAGE] THEN
12768      DISCH_THEN(MATCH_MP_TAC o CONJUNCT1) THEN
12769      SIMP_TAC std_ss [GSPECIFICATION, IN_NUMSEG] THEN
12770      EXISTS_TAC ``M:num`` THEN ASM_SIMP_TAC arith_ss [],
12771      REWRITE_TAC[bounded_def] THEN
12772      EXISTS_TAC ``integral s (h:real->real)`` THEN
12773      SIMP_TAC real_ss [GSYM IMAGE_DEF] THEN
12774      SIMP_TAC std_ss [FORALL_IN_IMAGE, IN_UNIV] THEN
12775      X_GEN_TAC ``p:num`` THEN MATCH_MP_TAC INTEGRAL_ABS_BOUND_INTEGRAL THEN
12776      ASM_SIMP_TAC std_ss [] THEN CONJ_TAC THENL
12777       [MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_IMP_INTEGRABLE THEN
12778        SIMP_TAC real_ss [GSYM IMAGE_DEF] THEN
12779        ONCE_REWRITE_TAC [METIS [] ``(\j. f j x) = (\x. (\j. f j x)) x``] THEN
12780        MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_SUP THEN
12781        SIMP_TAC std_ss [FINITE_NUMSEG, NUMSEG_EMPTY, NOT_LESS, LE_ADD] THEN
12782        ASM_REWRITE_TAC[METIS [ETA_AX] ``(\x. f i x) = f i``] THEN REPEAT STRIP_TAC THEN
12783        MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_INTEGRABLE_BOUND THEN
12784        EXISTS_TAC ``h:real->real`` THEN ASM_REWRITE_TAC[],
12785        ALL_TAC] THEN
12786      X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN
12787      MATCH_MP_TAC REAL_ABS_SUP_LE THEN SIMP_TAC real_ss [GSYM IMAGE_DEF] THEN
12788      SIMP_TAC std_ss [FORALL_IN_IMAGE, IMAGE_EQ_EMPTY] THEN
12789      ASM_SIMP_TAC std_ss [NUMSEG_EMPTY, NOT_LESS, LE_ADD]],
12790    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
12791    SIMP_TAC std_ss [FORALL_AND_THM] THEN STRIP_TAC] THEN
12792  MP_TAC(ISPECL
12793   [``\k:num x:real. inf {(f j x) | k <= j}``,
12794    ``g:real->real``,
12795    ``s:real->bool``]
12796           MONOTONE_CONVERGENCE_INCREASING) THEN
12797  ASM_SIMP_TAC std_ss [] THEN
12798  KNOW_TAC ``(!(k :num) (x :real). x IN s ==>
12799   inf {(f:num->real->real) j x | k <= j} <= inf {f j x | SUC k <= j}) /\
12800   (!(x :real). x IN s ==>
12801    (((\(k :num). inf {f j x | k <= j}) --> (g :real -> real) x)
12802       sequentially :bool)) /\
12803   (bounded {integral s (\(x :real). inf {f j x | k <= j}) |
12804     k IN univ((:num) :num itself)} :bool)`` THENL
12805
12806   [ONCE_REWRITE_TAC [METIS [SIMPLE_IMAGE_GEN] ``{(f:num->real->real) j x | m <= j} =
12807                                    IMAGE (\j. f j x) {j | m <= j}``] THEN
12808    CONJ_TAC THENL
12809     [REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_INF_SUBSET THEN
12810      SIMP_TAC real_ss [IMAGE_EQ_EMPTY, SET_RULE ``{x | x IN s} = s``] THEN
12811      SIMP_TAC std_ss [EXTENSION, GSPECIFICATION, NOT_IN_EMPTY, NOT_LESS_EQUAL] THEN
12812      CONJ_TAC THENL [EXISTS_TAC ``k + 1:num`` THEN ARITH_TAC, ALL_TAC] THEN
12813      CONJ_TAC THENL
12814       [MATCH_MP_TAC IMAGE_SUBSET THEN
12815        SIMP_TAC std_ss [SUBSET_DEF, IN_NUMSEG, GSPECIFICATION] THEN ARITH_TAC,
12816        ALL_TAC] THEN
12817      SIMP_TAC std_ss [FORALL_IN_IMAGE, GSPECIFICATION] THEN
12818      EXISTS_TAC ``-(h(x:real)):real`` THEN REPEAT STRIP_TAC THEN
12819      MATCH_MP_TAC(REAL_ARITH ``abs(x) <= a ==> -a <= x:real``) THEN
12820      ASM_SIMP_TAC std_ss [],
12821      ALL_TAC] THEN
12822    CONJ_TAC THENL
12823     [X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN
12824      FIRST_X_ASSUM(MP_TAC o SPEC ``x:real``) THEN ASM_SIMP_TAC std_ss [] THEN
12825      SIMP_TAC std_ss [LIM_SEQUENTIALLY] THEN
12826      DISCH_THEN(fn th => X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
12827                 MP_TAC(SPEC ``e / &2:real`` th)) THEN
12828      ASM_REWRITE_TAC[REAL_HALF] THEN
12829      DISCH_THEN (X_CHOOSE_TAC ``M:num``) THEN EXISTS_TAC ``M:num`` THEN
12830      POP_ASSUM MP_TAC THEN REWRITE_TAC[dist] THEN
12831      STRIP_TAC THEN X_GEN_TAC ``n:num`` THEN DISCH_TAC THEN
12832      GEN_REWR_TAC RAND_CONV [GSYM REAL_HALF] THEN
12833      MATCH_MP_TAC(REAL_ARITH
12834      ``&0 < e / 2 /\ x <= e / &2 ==> x < e / 2 + e / 2:real``) THEN
12835      ASM_REWRITE_TAC[REAL_HALF] THEN MATCH_MP_TAC REAL_INF_ASCLOSE THEN
12836      SIMP_TAC std_ss [IMAGE_EQ_EMPTY, FORALL_IN_IMAGE, GSPECIFICATION] THEN
12837      CONJ_TAC THENL [ALL_TAC, METIS_TAC[LESS_EQ_TRANS, REAL_LT_IMP_LE]] THEN
12838      SIMP_TAC std_ss [EXTENSION, NOT_IN_EMPTY, GSPECIFICATION, NOT_FORALL_THM] THEN
12839      MESON_TAC[LESS_EQ_REFL],
12840      ALL_TAC] THEN
12841    ONCE_REWRITE_TAC [METIS [SIMPLE_IMAGE_GEN]
12842     ``{integral s (\x. inf (IMAGE (\j. (f:num->real->real) j x)
12843                                        {j | k <= j})) | k IN t} =
12844        IMAGE (\k. integral s (\x. inf (IMAGE (\j. (f:num->real->real) j x)
12845                                    {j | k <= j}))) {k | k IN t}``] THEN
12846    SIMP_TAC std_ss [bounded_def, FORALL_IN_IMAGE, GSPECIFICATION, IN_UNIV] THEN
12847    EXISTS_TAC ``(integral s (h:real->real))`` THEN
12848    X_GEN_TAC ``p:num`` THEN MATCH_MP_TAC INTEGRAL_ABS_BOUND_INTEGRAL THEN
12849    ASM_SIMP_TAC real_ss [GSYM SIMPLE_IMAGE_GEN] THEN X_GEN_TAC ``x:real`` THEN
12850    DISCH_TAC THEN MATCH_MP_TAC REAL_ABS_INF_LE THEN
12851    ONCE_REWRITE_TAC [METIS [SIMPLE_IMAGE_GEN] ``{(f:num->real->real) j x | m <= j} =
12852                                    IMAGE (\j. f j x) {j | m <= j}``] THEN
12853    SIMP_TAC std_ss [FORALL_IN_IMAGE, IMAGE_EQ_EMPTY] THEN
12854    ASM_SIMP_TAC std_ss [GSPECIFICATION] THEN
12855    SIMP_TAC std_ss [EXTENSION, NOT_IN_EMPTY, GSPECIFICATION, NOT_FORALL_THM] THEN
12856    MESON_TAC[LESS_EQ_REFL],
12857    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
12858    DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC ASSUME_TAC)] THEN
12859  MP_TAC(ISPECL
12860   [``\k:num x:real. sup {(f j x) | k <= j}``,
12861    ``g:real->real``,
12862    ``s:real->bool``] MONOTONE_CONVERGENCE_DECREASING) THEN
12863  ASM_SIMP_TAC std_ss [] THEN
12864  KNOW_TAC ``(!(k :num) (x :real).
12865    x IN (s :real -> bool) ==>
12866    sup {(f :num -> real -> real) j x | SUC k <= j} <=
12867    sup {f j x | k <= j}) /\
12868    (!(x :real). x IN s ==>
12869    (((\(k :num). sup {f j x | k <= j}) --> (g :real -> real) x)
12870       sequentially :bool)) /\
12871    (bounded {integral s (\(x :real). sup {f j x | k <= j}) |
12872     k IN univ((:num) :num itself)} :bool)`` THENL
12873   [ONCE_REWRITE_TAC [METIS [SIMPLE_IMAGE_GEN] ``{(f:num->real->real) j x | m <= j} =
12874                                    IMAGE (\j. f j x) {j | m <= j}``] THEN CONJ_TAC THENL
12875     [REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_SUP_LE_SUBSET THEN
12876      SIMP_TAC real_ss [IMAGE_EQ_EMPTY, SET_RULE ``{x | x IN s} = s``] THEN
12877      SIMP_TAC std_ss [EXTENSION, GSPECIFICATION, NOT_IN_EMPTY, NOT_LESS_EQUAL] THEN
12878      CONJ_TAC THENL [EXISTS_TAC ``k + 1:num`` THEN
12879      ASM_SIMP_TAC arith_ss [], ALL_TAC] THEN
12880      CONJ_TAC THENL
12881       [MATCH_MP_TAC IMAGE_SUBSET THEN
12882        SIMP_TAC std_ss [SUBSET_DEF, IN_NUMSEG, GSPECIFICATION] THEN ARITH_TAC,
12883        ALL_TAC] THEN
12884      SIMP_TAC std_ss [FORALL_IN_IMAGE, GSPECIFICATION] THEN
12885      EXISTS_TAC ``(h(x:real)):real`` THEN REPEAT STRIP_TAC THEN
12886      MATCH_MP_TAC(REAL_ARITH ``abs(x) <= a ==> x <= a:real``) THEN
12887      ASM_SIMP_TAC std_ss [],
12888      ALL_TAC] THEN
12889    CONJ_TAC THENL
12890     [X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN
12891      FIRST_X_ASSUM(MP_TAC o SPEC ``x:real``) THEN ASM_SIMP_TAC std_ss [] THEN
12892      SIMP_TAC std_ss [LIM_SEQUENTIALLY] THEN
12893      DISCH_THEN(fn th => X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
12894                 MP_TAC(SPEC ``e / &2:real`` th)) THEN
12895      ASM_REWRITE_TAC[REAL_HALF] THEN
12896      DISCH_THEN (X_CHOOSE_TAC ``M:num``) THEN EXISTS_TAC ``M:num`` THEN
12897      POP_ASSUM MP_TAC THEN REWRITE_TAC[dist] THEN
12898      STRIP_TAC THEN X_GEN_TAC ``n:num`` THEN DISCH_TAC THEN
12899      GEN_REWR_TAC RAND_CONV [GSYM REAL_HALF] THEN
12900      MATCH_MP_TAC(REAL_ARITH
12901       ``&0 < e / 2 /\ x <= e / &2 ==> x < e / 2 + e / 2:real``) THEN
12902      ASM_REWRITE_TAC[REAL_HALF] THEN MATCH_MP_TAC REAL_SUP_ASCLOSE THEN
12903      SIMP_TAC std_ss [IMAGE_EQ_EMPTY, FORALL_IN_IMAGE, GSPECIFICATION] THEN
12904      CONJ_TAC THENL [ALL_TAC, METIS_TAC[LESS_EQ_TRANS, REAL_LT_IMP_LE]] THEN
12905      SIMP_TAC std_ss [EXTENSION, NOT_IN_EMPTY, GSPECIFICATION, NOT_FORALL_THM] THEN
12906      MESON_TAC[LESS_EQ_REFL],
12907      ALL_TAC] THEN
12908    ONCE_REWRITE_TAC [METIS [SIMPLE_IMAGE_GEN]
12909     ``{integral s (\x. sup (IMAGE (\j. (f:num->real->real) j x)
12910                                        {j | k <= j})) | k IN t} =
12911        IMAGE (\k. integral s (\x. sup (IMAGE (\j. (f:num->real->real) j x)
12912                                    {j | k <= j}))) {k | k IN t}``] THEN
12913    SIMP_TAC std_ss [bounded_def, FORALL_IN_IMAGE, GSPECIFICATION, IN_UNIV] THEN
12914    EXISTS_TAC ``(integral s (h:real->real))`` THEN
12915    X_GEN_TAC ``p:num`` THEN MATCH_MP_TAC INTEGRAL_ABS_BOUND_INTEGRAL THEN
12916    ASM_SIMP_TAC real_ss [GSYM SIMPLE_IMAGE_GEN] THEN X_GEN_TAC ``x:real`` THEN
12917    DISCH_TAC THEN
12918    MATCH_MP_TAC REAL_ABS_SUP_LE THEN
12919    ONCE_REWRITE_TAC [METIS [SIMPLE_IMAGE_GEN] ``{(f:num->real->real) j x | m <= j} =
12920                                    IMAGE (\j. f j x) {j | m <= j}``] THEN
12921    SIMP_TAC std_ss [FORALL_IN_IMAGE, IMAGE_EQ_EMPTY] THEN
12922    ASM_SIMP_TAC std_ss [GSPECIFICATION] THEN
12923    SIMP_TAC std_ss [EXTENSION, NOT_IN_EMPTY, GSPECIFICATION, NOT_FORALL_THM] THEN
12924    MESON_TAC[LESS_EQ_REFL],
12925    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
12926    DISCH_THEN(ASSUME_TAC)] THEN
12927  ASM_REWRITE_TAC[LIM_SEQUENTIALLY] THEN
12928  X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
12929  UNDISCH_TAC ``((\k. integral s (\x. inf {f j x | k <= j})) --> integral s g)
12930        sequentially`` THEN DISCH_TAC THEN
12931  FIRST_X_ASSUM (MP_TAC o REWRITE_RULE [LIM_SEQUENTIALLY]) THEN
12932  DISCH_THEN(MP_TAC o SPECL [``e:real``]) THEN ASM_REWRITE_TAC[] THEN
12933  DISCH_THEN(X_CHOOSE_TAC ``N1:num``) THEN
12934  UNDISCH_TAC ``((\k. integral s (\x. sup {f j x | k <= j})) --> integral s g)
12935        sequentially`` THEN DISCH_TAC THEN
12936  FIRST_X_ASSUM (MP_TAC o REWRITE_RULE[LIM_SEQUENTIALLY]) THEN
12937  DISCH_THEN(MP_TAC o SPECL [``e:real``]) THEN ASM_REWRITE_TAC[] THEN
12938  DISCH_THEN(X_CHOOSE_TAC ``N2:num``) THEN
12939  EXISTS_TAC ``N1 + N2:num`` THEN X_GEN_TAC ``n:num`` THEN DISCH_TAC THEN
12940  UNDISCH_TAC ``!n. N1 <= n ==> dist
12941           ((\k. integral s (\x. inf {(f:num->real->real) j x | k <= j})) n,
12942            integral s g) < e`` THEN DISCH_TAC THEN
12943  FIRST_X_ASSUM (MP_TAC o SPEC ``n:num``) THEN ASM_SIMP_TAC arith_ss [] THEN
12944  UNDISCH_TAC ``!n. N2 <= n ==> dist
12945           ((\k. integral s (\x. sup {(f:num->real->real) j x | k <= j})) n,
12946            integral s g) < e`` THEN DISCH_TAC THEN
12947  FIRST_X_ASSUM (MP_TAC o SPEC ``n:num``) THEN ASM_SIMP_TAC arith_ss [] THEN
12948  REWRITE_TAC[dist] THEN
12949  MATCH_MP_TAC(REAL_ARITH
12950   ``i0 <= i /\ i <= i1
12951    ==> abs(i1 - g) < e ==> abs(i0 - g) < e ==> abs(i - g) < e:real``) THEN
12952  CONJ_TAC THEN MATCH_MP_TAC INTEGRAL_DROP_LE THEN
12953  ASM_SIMP_TAC std_ss [] THEN X_GEN_TAC ``x:real`` THEN DISCH_TAC THENL
12954   [W(MP_TAC o C SPEC INF o rand o lhand o snd) THEN
12955    SIMP_TAC std_ss [] THEN
12956    ONCE_REWRITE_TAC [METIS [SIMPLE_IMAGE_GEN] ``{(f:num->real->real) j x | m <= j} =
12957                                    IMAGE (\j. f j x) {j | m <= j}``] THEN
12958    SIMP_TAC std_ss [IMAGE_EQ_EMPTY, FORALL_IN_IMAGE, GSPECIFICATION] THEN
12959    KNOW_TAC ``{j | (n :num) <= j} <> ({} :num -> bool) /\ (?(b :real).
12960    !(j :num). n <= j ==> b <= (f :num -> real -> real) j (x :real))`` THENL
12961     [SIMP_TAC std_ss [EXTENSION, NOT_IN_EMPTY, GSPECIFICATION, NOT_FORALL_THM] THEN
12962      CONJ_TAC THENL [MESON_TAC[LESS_EQ_REFL], ALL_TAC] THEN
12963      EXISTS_TAC ``-(h(x:real)):real`` THEN GEN_TAC THEN DISCH_TAC THEN
12964      MATCH_MP_TAC(REAL_ARITH ``abs(x) <= a ==> -a <= x:real``) THEN
12965      FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[],
12966      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
12967      DISCH_THEN(MATCH_MP_TAC o CONJUNCT1) THEN REWRITE_TAC[LESS_EQ_REFL]],
12968    W(MP_TAC o C SPEC SUP o rand o rand o snd) THEN
12969    SIMP_TAC std_ss [] THEN
12970    ONCE_REWRITE_TAC [METIS [SIMPLE_IMAGE_GEN] ``{(f:num->real->real) j x | m <= j} =
12971                                    IMAGE (\j. f j x) {j | m <= j}``] THEN
12972    SIMP_TAC std_ss [IMAGE_EQ_EMPTY, FORALL_IN_IMAGE, GSPECIFICATION] THEN
12973    KNOW_TAC ``{j | (n :num) <= j} <> ({} :num -> bool) /\ (?(b :real).
12974    !(j :num). n <= j ==> (f :num -> real -> real) j (x :real) <= b)`` THENL
12975     [SIMP_TAC std_ss [EXTENSION, NOT_IN_EMPTY, GSPECIFICATION, NOT_FORALL_THM] THEN
12976      CONJ_TAC THENL [MESON_TAC[LESS_EQ_REFL], ALL_TAC] THEN
12977      EXISTS_TAC ``(h(x:real)):real`` THEN GEN_TAC THEN DISCH_TAC THEN
12978      MATCH_MP_TAC(REAL_ARITH ``abs(x) <= a ==> x <= a:real``) THEN
12979      FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[],
12980      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
12981      DISCH_THEN(MATCH_MP_TAC o CONJUNCT1) THEN REWRITE_TAC[LESS_EQ_REFL]]]
12982QED
12983
12984Theorem lemma[local]:
12985     !f:num->real->real g h s.
12986          (!k. f k absolutely_integrable_on s) /\
12987          h integrable_on s /\
12988          (!x. x IN s ==> abs(g x) <= (h x)) /\
12989          (!x. x IN s ==> ((\k. f k x) --> g x) sequentially)
12990          ==> g integrable_on s
12991Proof
12992    REPEAT STRIP_TAC THEN
12993    SUBGOAL_THEN ``(h:real->real) absolutely_integrable_on s``
12994    ASSUME_TAC THENL
12995     [MATCH_MP_TAC NONNEGATIVE_ABSOLUTELY_INTEGRABLE THEN
12996      ASM_SIMP_TAC std_ss [IMP_CONJ, RIGHT_FORALL_IMP_THM] THEN
12997      REWRITE_TAC[AND_IMP_INTRO] THEN
12998      METIS_TAC[REAL_LE_TRANS, ABS_POS],
12999      ALL_TAC] THEN
13000    MP_TAC(ISPECL
13001     [``\n:num x:real.
13002         (min (max (-((h x):real)) ((f n x))) ((h x)))``,
13003      ``g:real->real``,
13004      ``h:real->real``,
13005      ``s:real->bool``] DOMINATED_CONVERGENCE) THEN
13006    KNOW_TAC ``(!(k :num).
13007    (\(n :num) (x :real).
13008       min (max (-(h :real -> real) x) ((f :num -> real -> real) n x))
13009         (h x)) k integrable_on (s :real -> bool)) /\ h integrable_on s /\
13010    (!(k :num) (x :real). x IN s ==>
13011     abs ((\(n :num) (x :real). min (max (-h x) (f n x)) (h x)) k x) <=
13012     h x) /\ (!(x :real). x IN s ==>
13013     (((\(k :num). (\(n :num) (x :real). min (max (-h x) (f n x)) (h x)) k x) -->
13014      (g :real -> real) x) sequentially :bool))`` THENL
13015    [ASM_SIMP_TAC std_ss [], SIMP_TAC std_ss []] THEN REPEAT CONJ_TAC THENL
13016    [ (* goal 1 (of 3) *)
13017      X_GEN_TAC ``n:num`` THEN
13018      MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_IMP_INTEGRABLE THEN
13019      ONCE_REWRITE_TAC [METIS [] ``(\x. min (max (-h x) (f n x)) (h x):real) =
13020                                   (\x. min ((\x. max (-h x) (f n x)) x) (h x))``] THEN
13021      MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_MIN THEN
13022      ASM_SIMP_TAC std_ss [ETA_AX] THEN
13023      ONCE_REWRITE_TAC [METIS [] ``(\x. max (-h x) ((f:num->real->real) n x)) =
13024                                   (\x. max ((\x. (-h x)) x) ((\x. (f n x)) x))``] THEN
13025      MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_MAX THEN
13026      METIS_TAC [ETA_AX, ABSOLUTELY_INTEGRABLE_NEG],
13027      (* goal 2 (of 3) *)
13028      MAP_EVERY X_GEN_TAC [``n:num``, ``x:real``] THEN DISCH_TAC THEN
13029      SIMP_TAC std_ss [] THEN
13030      Know `&0 <= ((h:real->real) x)`
13031      >- METIS_TAC[REAL_LE_TRANS, ABS_POS] \\
13032      RW_TAC real_ss [min_def, max_def] >> fs []
13033      >- (Cases_on `0 <= f n x` >> rw [abs] \\
13034          Q.PAT_X_ASSUM `-h x <= f n x` MP_TAC >> REAL_ARITH_TAC)
13035      >> rw [abs],
13036      (* goal 3 (of 3) *)
13037      X_GEN_TAC ``x:real`` THEN REWRITE_TAC[IN_DIFF] THEN STRIP_TAC THEN
13038      UNDISCH_TAC
13039       ``!x. x IN s ==> ((\n. (f:num->real->real) n x) --> g x)
13040                          sequentially`` THEN
13041      DISCH_THEN(MP_TAC o SPEC ``x:real``) THEN ASM_REWRITE_TAC[] THEN
13042      REWRITE_TAC[tendsto_real] THEN DISCH_TAC THEN GEN_TAC THEN
13043      POP_ASSUM (MP_TAC o SPEC ``e:real``) THEN ASM_CASES_TAC ``&0 < e:real`` THEN
13044      ASM_REWRITE_TAC[] THEN
13045      MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO) THEN
13046      X_GEN_TAC ``n:num`` THEN SIMP_TAC std_ss [] THEN
13047      FIRST_X_ASSUM(MP_TAC o SPEC ``x:real``) THEN
13048      ASM_REWRITE_TAC[dist] THEN KILL_TAC THEN
13049      REWRITE_TAC [min_def, max_def] THEN
13050      RW_TAC real_ss [] (* 2 subgoals *)
13051      >- ASM_REAL_ARITH_TAC \\
13052      Cases_on `-h x <= f n x` >> fs [] \\
13053      ASM_REAL_ARITH_TAC ]
13054QED
13055
13056Theorem DOMINATED_CONVERGENCE_INTEGRABLE:
13057   !f:num->real->real g h s.
13058         (!k. f k absolutely_integrable_on s) /\
13059         h integrable_on s /\
13060         (!k x. x IN s ==> abs(g x) <= (h x)) /\
13061         (!x. x IN s ==> ((\k. f k x) --> g x) sequentially)
13062         ==> g integrable_on s
13063Proof
13064  REWRITE_TAC [lemma]
13065QED
13066
13067Theorem DOMINATED_CONVERGENCE_ABSOLUTELY_INTEGRABLE:
13068   !f:num->real->real g h s.
13069         (!k. f k absolutely_integrable_on s) /\
13070         h integrable_on s /\
13071         (!k x. x IN s ==> abs(g x) <= (h x)) /\
13072         (!x. x IN s ==> ((\k. f k x) --> g x) sequentially)
13073         ==> g absolutely_integrable_on s
13074Proof
13075  REPEAT STRIP_TAC THEN
13076  MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_INTEGRABLE_BOUND THEN
13077  EXISTS_TAC ``h:real->real`` THEN ASM_SIMP_TAC std_ss [] THEN
13078  MATCH_MP_TAC DOMINATED_CONVERGENCE_INTEGRABLE THEN
13079  EXISTS_TAC ``f:num->real->real`` THEN
13080  EXISTS_TAC ``h:real->real`` THEN ASM_REWRITE_TAC[]
13081QED
13082
13083Theorem DOMINATED_CONVERGENCE_AE:
13084   !f:num->real->real g h s t.
13085        (!k. (f k) integrable_on s) /\ h integrable_on s /\ negligible t /\
13086        (!k x. x IN s DIFF t ==> abs(f k x) <= (h x)) /\
13087        (!x. x IN s DIFF t ==> ((\k. f k x) --> g x) sequentially)
13088        ==> g integrable_on s /\
13089            ((\k. integral s (f k)) --> integral s g) sequentially
13090Proof
13091  REPEAT GEN_TAC THEN STRIP_TAC THEN
13092  MP_TAC(ISPECL [``f:num->real->real``, ``g:real->real``,
13093                 ``h:real->real``, ``s DIFF t:real->bool``]
13094        DOMINATED_CONVERGENCE) THEN
13095  ASM_SIMP_TAC std_ss [] THEN
13096  KNOW_TAC ``(!(k :num).
13097    (f :num -> real -> real) k integrable_on
13098    (s :real -> bool) DIFF (t :real -> bool)) /\
13099 (h :real -> real) integrable_on s DIFF t`` THENL
13100   [REPEAT STRIP_TAC THEN
13101    MATCH_MP_TAC(REWRITE_RULE[AND_IMP_INTRO] INTEGRABLE_SPIKE_SET) THEN
13102    EXISTS_TAC ``s:real->bool`` THEN ASM_SIMP_TAC std_ss [],
13103    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
13104    MATCH_MP_TAC MONO_AND THEN CONJ_TAC THENL
13105     [MATCH_MP_TAC INTEGRABLE_SPIKE_SET,
13106      MATCH_MP_TAC EQ_IMPLIES THEN AP_THM_TAC THEN BINOP_TAC THEN
13107      TRY ABS_TAC THEN MATCH_MP_TAC INTEGRAL_SPIKE_SET]] THEN
13108  FIRST_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
13109    NEGLIGIBLE_SUBSET)) THEN
13110  SET_TAC[]
13111QED
13112
13113(* ------------------------------------------------------------------------- *)
13114(* A few more properties of negligible sets.                                 *)
13115(* ------------------------------------------------------------------------- *)
13116
13117Theorem NEGLIGIBLE_ON_UNIV:
13118   !s. negligible s <=> (indicator s has_integral 0) univ(:real)
13119Proof
13120  GEN_TAC THEN EQ_TAC THENL [SIMP_TAC std_ss [NEGLIGIBLE], ALL_TAC] THEN
13121  DISCH_TAC THEN REWRITE_TAC[negligible] THEN
13122  MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``] THEN
13123  SUBGOAL_THEN ``indicator s integrable_on interval[a:real,b]``
13124  ASSUME_TAC THENL
13125   [MATCH_MP_TAC INTEGRABLE_ON_SUBINTERVAL THEN
13126    EXISTS_TAC ``univ(:real)`` THEN ASM_MESON_TAC[SUBSET_UNIV, integrable_on],
13127    ASM_SIMP_TAC std_ss [GSYM INTEGRAL_EQ_HAS_INTEGRAL] THEN
13128    REWRITE_TAC[GSYM REAL_LE_ANTISYM] THEN
13129    CONJ_TAC THENL
13130     [FIRST_ASSUM(SUBST1_TAC o SYM o MATCH_MP INTEGRAL_UNIQUE) THEN
13131      MATCH_MP_TAC INTEGRAL_SUBSET_DROP_LE,
13132      MATCH_MP_TAC INTEGRAL_DROP_POS] THEN
13133    ASM_REWRITE_TAC[SUBSET_UNIV, DROP_INDICATOR_POS_LE] THEN
13134    ASM_MESON_TAC[integrable_on]]
13135QED
13136
13137Theorem NEGLIGIBLE_COUNTABLE_BIGUNION:
13138   !s:num->real->bool.
13139        (!n. negligible(s n)) ==> negligible(BIGUNION {s(n) | n IN univ(:num)})
13140Proof
13141  REPEAT STRIP_TAC THEN
13142  MP_TAC(ISPECL [``\n. indicator(BIGUNION {(s:num->real->bool)(m) | m <= n})``,
13143             ``indicator(BIGUNION {(s:num->real->bool)(m) | m IN univ(:num)})``,
13144                 ``univ(:real)``] MONOTONE_CONVERGENCE_INCREASING) THEN
13145  SUBGOAL_THEN
13146   ``!n. negligible(BIGUNION {(s:num->real->bool)(m) | m <= n})``
13147  ASSUME_TAC THENL
13148   [GEN_TAC THEN MATCH_MP_TAC NEGLIGIBLE_BIGUNION THEN
13149    ONCE_REWRITE_TAC [METIS [] ``!n:num. m <= n <=> (\m. m <= n) m``] THEN
13150    ONCE_REWRITE_TAC[SIMPLE_IMAGE_GEN] THEN
13151    ASM_SIMP_TAC std_ss [IMAGE_FINITE, FINITE_NUMSEG_LE, FORALL_IN_IMAGE],
13152    ALL_TAC] THEN
13153  SUBGOAL_THEN
13154   ``!n:num. (indicator (BIGUNION {s m | m <= n})) integrable_on univ(:real)``
13155  ASSUME_TAC THENL
13156   [METIS_TAC[NEGLIGIBLE_ON_UNIV, integrable_on], ALL_TAC] THEN
13157  SUBGOAL_THEN
13158   ``!n:num. integral univ(:real) (indicator (BIGUNION {s m | m <= n})) = 0``
13159  ASSUME_TAC THENL
13160   [METIS_TAC[NEGLIGIBLE_ON_UNIV, INTEGRAL_UNIQUE], ALL_TAC] THEN
13161  ASM_SIMP_TAC std_ss [NEGLIGIBLE_ON_UNIV, LIM_CONST_EQ,
13162               TRIVIAL_LIMIT_SEQUENTIALLY] THEN
13163  KNOW_TAC ``(!(k :num) (x :real).
13164        x IN univ((:real) :real itself) ==>
13165        indicator (BIGUNION {(s :num -> real -> bool) m | m <= k}) x <=
13166        indicator (BIGUNION {s m | m <= SUC k}) x) /\
13167     (!(x :real).
13168        x IN univ((:real) :real itself) ==>
13169        (((\(k :num). indicator (BIGUNION {s m | m <= k}) x) -->
13170          indicator (BIGUNION {s m | m IN univ((:num) :num itself)}) x)
13171           sequentially :bool)) /\
13172     (bounded {(0 :real) | k IN univ((:num) :num itself)} :bool)`` THENL
13173  [ALL_TAC, DISCH_TAC THEN ASM_REWRITE_TAC [] THEN
13174   METIS_TAC[INTEGRAL_EQ_HAS_INTEGRAL]] THEN
13175  REPEAT CONJ_TAC THENL
13176   [MAP_EVERY X_GEN_TAC [``k:num``, ``x:real``] THEN DISCH_TAC THEN
13177    REWRITE_TAC[indicator] THEN
13178    SUBGOAL_THEN
13179     ``x IN BIGUNION {(s:num->real->bool) m | m <= k}
13180      ==> x IN BIGUNION {s m | m <= SUC k}``
13181    MP_TAC THENL
13182     [SPEC_TAC(``x:real``,``x:real``) THEN
13183      REWRITE_TAC[GSYM SUBSET_DEF] THEN MATCH_MP_TAC SUBSET_BIGUNION THEN
13184      ONCE_REWRITE_TAC [METIS [] ``!n:num. m <= n <=> (\m. m <= n) m``] THEN
13185      ONCE_REWRITE_TAC[SIMPLE_IMAGE_GEN] THEN MATCH_MP_TAC IMAGE_SUBSET THEN
13186      SIMP_TAC std_ss [SUBSET_DEF, GSPECIFICATION] THEN ARITH_TAC,
13187      BETA_TAC THEN
13188      REPEAT(COND_CASES_TAC THEN ASM_SIMP_TAC std_ss []) THEN
13189      SIMP_TAC std_ss [REAL_LE_REFL, REAL_POS]],
13190    X_GEN_TAC ``x:real`` THEN DISCH_THEN(K ALL_TAC) THEN
13191    MATCH_MP_TAC LIM_EVENTUALLY THEN
13192    REWRITE_TAC[EVENTUALLY_SEQUENTIALLY, indicator] THEN
13193    ASM_CASES_TAC ``x IN BIGUNION {(s:num->real->bool) m | m IN univ(:num)}`` THENL
13194     [FIRST_X_ASSUM(MP_TAC o SIMP_RULE std_ss [BIGUNION_GSPEC,
13195       METIS [] ``!n:num. m <= n <=> (\m. m <= n) m``]) THEN
13196      SIMP_TAC std_ss [GSPECIFICATION, IN_UNIV] THEN
13197      STRIP_TAC THEN EXISTS_TAC ``m:num`` THEN
13198      X_GEN_TAC ``n:num`` THEN DISCH_TAC THEN
13199      SIMP_TAC std_ss [BIGUNION_GSPEC, GSPECIFICATION] THEN METIS_TAC[],
13200      EXISTS_TAC ``0:num`` THEN X_GEN_TAC ``n:num`` THEN DISCH_TAC THEN
13201      ASM_SIMP_TAC std_ss [] THEN
13202      UNDISCH_TAC `` (x :real) NOTIN
13203          BIGUNION
13204            {(s :num -> real -> bool) m | m IN univ((:num) :num itself)}`` THEN
13205      DISCH_TAC THEN
13206      POP_ASSUM (MP_TAC o SIMP_RULE std_ss [BIGUNION_GSPEC]) THEN
13207      SIMP_TAC std_ss [BIGUNION_GSPEC, GSPECIFICATION, IN_UNIV]],
13208    REWRITE_TAC[SET_RULE ``{c | x | x IN UNIV} = {c}``,
13209                BOUNDED_INSERT, BOUNDED_EMPTY]]
13210QED
13211
13212Theorem lemma[local]:
13213     !f:real->real s.
13214          (!x. x IN s ==> &0 <= (f x)) /\ (f has_integral 0) s
13215          ==> negligible {x | x IN s /\ ~(f x = 0)}
13216Proof
13217    REPEAT STRIP_TAC THEN MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN EXISTS_TAC
13218     ``BIGUNION {{x | x IN s /\ abs((f:real->real) x) >= &1 / (&n + &1:real)} |
13219              n IN univ(:num)}`` THEN
13220    CONJ_TAC THENL
13221     [ONCE_REWRITE_TAC [METIS []
13222      ``{x | x IN s /\ abs (f x) >= 1 / (&n + 1)} =
13223        (\n. {x | x IN s /\ abs (f x) >= 1 / (&n + 1)}) n``] THEN
13224      MATCH_MP_TAC NEGLIGIBLE_COUNTABLE_BIGUNION THEN
13225      X_GEN_TAC ``n:num`` THEN SIMP_TAC std_ss [NEGLIGIBLE_ON_UNIV, indicator] THEN
13226      MATCH_MP_TAC HAS_INTEGRAL_STRADDLE_NULL THEN
13227      EXISTS_TAC ``(\x. if x IN s then (&n + &1) * f(x) else 0):real->real`` THEN
13228      CONJ_TAC THENL
13229       [SIMP_TAC std_ss [IN_UNIV, GSPECIFICATION, real_ge] THEN
13230        X_GEN_TAC ``x:real`` THEN COND_CASES_TAC THEN
13231        ASM_SIMP_TAC std_ss [REAL_POS] THENL
13232         [ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
13233          ASM_SIMP_TAC std_ss [GSYM REAL_LE_LDIV_EQ,
13234           METIS [REAL_LT, REAL_OF_NUM_ADD, GSYM ADD1, LESS_0]
13235                   ``&0 < &n + &1:real``] THEN
13236          MATCH_MP_TAC(REAL_ARITH ``&0 <= x /\ a <= abs x ==> a <= x:real``) THEN
13237          ASM_SIMP_TAC std_ss [],
13238          COND_CASES_TAC THEN REWRITE_TAC[REAL_POS] THEN
13239          ASM_SIMP_TAC std_ss [REAL_POS, REAL_LE_MUL, REAL_LE_ADD]],
13240        SIMP_TAC std_ss [HAS_INTEGRAL_RESTRICT_UNIV] THEN
13241        SUBST1_TAC(REAL_ARITH ``0:real = (&n + &1) * 0``) THEN
13242        MATCH_MP_TAC HAS_INTEGRAL_CMUL THEN ASM_REWRITE_TAC[]],
13243      SIMP_TAC std_ss [SUBSET_DEF, GSPECIFICATION] THEN X_GEN_TAC ``x:real`` THEN
13244      REWRITE_TAC[ABS_NZ] THEN ONCE_REWRITE_TAC[REAL_ARCH_INV] THEN
13245      DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC (X_CHOOSE_THEN ``n:num``
13246        STRIP_ASSUME_TAC)) THEN
13247      SIMP_TAC std_ss [IN_BIGUNION, EXISTS_IN_GSPEC] THEN
13248      ASM_SIMP_TAC std_ss [IN_UNIV, GSPECIFICATION, real_ge] THEN
13249      EXISTS_TAC ``{x' | x' IN (s :real -> bool) /\
13250         (1 :real) / (((&n) :real) + (1 :real)) <=
13251         abs ((f :real -> real) x')}`` THEN CONJ_TAC THENL
13252      [ASM_SIMP_TAC std_ss [GSPECIFICATION, REAL_LE_LT] THEN DISJ1_TAC THEN
13253       MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC ``inv (&n):real`` THEN
13254       ASM_REWRITE_TAC [GSYM REAL_INV_1OVER] THEN MATCH_MP_TAC REAL_LE_INV2 THEN
13255       SIMP_TAC std_ss [REAL_LT, REAL_OF_NUM_ADD, REAL_OF_NUM_LE] THEN
13256       UNDISCH_TAC ``n <> 0:num`` THEN ARITH_TAC,
13257       EXISTS_TAC ``n:num`` THEN ASM_SIMP_TAC std_ss []]]
13258QED
13259
13260Theorem HAS_INTEGRAL_NEGLIGIBLE_EQ:
13261   !f:real->real s.
13262        (!x i. x IN s ==> &0 <= f(x))
13263        ==> ((f has_integral 0) s <=>
13264             negligible {x | x IN s /\ ~(f x = 0)})
13265Proof
13266  REPEAT STRIP_TAC THEN EQ_TAC THEN DISCH_TAC THENL
13267   [ALL_TAC,
13268    MATCH_MP_TAC HAS_INTEGRAL_NEGLIGIBLE THEN
13269    EXISTS_TAC ``{x | x IN s /\ ~((f:real->real) x = 0)}`` THEN
13270    ASM_SIMP_TAC std_ss [IN_DIFF, GSPECIFICATION] THEN MESON_TAC[]] THEN
13271  MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN
13272  EXISTS_TAC ``BIGUNION {{x | x IN s /\ ~(((f:real->real) x) = &0)}}`` THEN
13273  CONJ_TAC THENL
13274   [MATCH_MP_TAC NEGLIGIBLE_BIGUNION THEN
13275    SIMP_TAC real_ss [GSYM IMAGE_DEF, IMAGE_FINITE, FINITE_NUMSEG, FORALL_IN_IMAGE,
13276     IN_SING, FINITE_SING] THEN MATCH_MP_TAC lemma THEN
13277    ASM_SIMP_TAC std_ss [],
13278    SIMP_TAC std_ss [SUBSET_DEF, IN_BIGUNION, EXISTS_IN_GSPEC, IN_NUMSEG] THEN
13279    SIMP_TAC std_ss [GSPECIFICATION, IN_SING] THEN MESON_TAC[]]
13280QED
13281
13282Theorem lemma[local]:
13283    IMAGE f s = BIGUNION {(\x. {f x}) x | x IN s}
13284Proof
13285    SIMP_TAC std_ss [EXTENSION, IN_IMAGE, IN_BIGUNION, IN_SING, GSPECIFICATION] THEN
13286    MESON_TAC[IN_SING]
13287QED
13288
13289Theorem NEGLIGIBLE_COUNTABLE:
13290   !s:real->bool. COUNTABLE s ==> negligible s
13291Proof
13292  GEN_TAC THEN ASM_CASES_TAC ``s:real->bool = {}`` THEN
13293  ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY] THEN
13294  POP_ASSUM MP_TAC THEN REWRITE_TAC[GSYM IMP_CONJ_ALT] THEN
13295  DISCH_THEN(X_CHOOSE_THEN ``f:num->real`` SUBST1_TAC o
13296    MATCH_MP COUNTABLE_AS_IMAGE) THEN
13297  ONCE_REWRITE_TAC[lemma] THEN
13298  MATCH_MP_TAC NEGLIGIBLE_COUNTABLE_BIGUNION THEN
13299  SIMP_TAC std_ss [NEGLIGIBLE_SING]
13300QED
13301
13302(* ------------------------------------------------------------------------- *)
13303(* More basic "almost everywhere" variants of other theorems.                *)
13304(* ------------------------------------------------------------------------- *)
13305
13306Theorem HAS_INTEGRAL_COMPONENT_LE_AE:
13307   !f:real->real g:real->real s i j k t.
13308        negligible t /\
13309        (f has_integral i) s /\ (g has_integral j) s /\
13310        (!x. x IN s DIFF t ==> (f x) <= (g x))
13311        ==> i <= j
13312Proof
13313  REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_INTEGRAL_COMPONENT_LE THEN
13314  EXISTS_TAC ``\x. if x IN t then 0 else (f:real->real) x`` THEN
13315  EXISTS_TAC ``\x. if x IN t then 0 else (g:real->real) x`` THEN
13316  EXISTS_TAC ``s:real->bool`` THEN ASM_REWRITE_TAC[] THEN
13317  REPEAT STRIP_TAC THENL
13318   [MATCH_MP_TAC HAS_INTEGRAL_SPIKE THEN EXISTS_TAC ``f:real->real`` THEN
13319    EXISTS_TAC ``t:real->bool`` THEN ASM_SIMP_TAC std_ss [IN_DIFF],
13320    MATCH_MP_TAC HAS_INTEGRAL_SPIKE THEN EXISTS_TAC ``g:real->real`` THEN
13321    EXISTS_TAC ``t:real->bool`` THEN ASM_SIMP_TAC std_ss [IN_DIFF],
13322    SIMP_TAC std_ss [] THEN COND_CASES_TAC THEN
13323    ASM_SIMP_TAC std_ss [IN_DIFF, REAL_LE_REFL]]
13324QED
13325
13326Theorem INTEGRAL_COMPONENT_LE_AE:
13327   !f:real->real g:real->real s k t.
13328        negligible t /\
13329        f integrable_on s /\ g integrable_on s /\
13330        (!x. x IN s DIFF t ==> (f x) <= (g x))
13331        ==> (integral s f) <= (integral s g)
13332Proof
13333  REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_INTEGRAL_COMPONENT_LE_AE THEN
13334  ASM_MESON_TAC[INTEGRABLE_INTEGRAL]
13335QED
13336
13337Theorem HAS_INTEGRAL_LE_AE:
13338   !f:real->real g:real->real s i j t.
13339        (f has_integral i) s /\ (g has_integral j) s /\
13340        negligible t /\ (!x. x IN s DIFF t ==> (f x) <= (g x))
13341        ==> i <= j
13342Proof
13343  REPEAT STRIP_TAC THEN
13344  MATCH_MP_TAC HAS_INTEGRAL_COMPONENT_LE_AE THEN
13345  REWRITE_TAC[LESS_EQ_REFL] THEN ASM_MESON_TAC[]
13346QED
13347
13348Theorem INTEGRAL_LE_AE:
13349   !f:real->real g:real->real s t.
13350        f integrable_on s /\ g integrable_on s /\
13351        negligible t /\ (!x. x IN s DIFF t ==> (f x) <= (g x))
13352        ==> (integral s f) <= (integral s g)
13353Proof
13354  REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_INTEGRAL_LE_AE THEN
13355  ASM_MESON_TAC[INTEGRABLE_INTEGRAL]
13356QED
13357
13358Theorem NONNEGATIVE_ABSOLUTELY_INTEGRABLE_AE:
13359   !f:real->real s t.
13360        negligible t /\
13361        (!x i. x IN s DIFF t
13362               ==> &0 <= f(x)) /\
13363        f integrable_on s
13364        ==> f absolutely_integrable_on s
13365Proof
13366  REPEAT STRIP_TAC THEN
13367  MATCH_MP_TAC(REWRITE_RULE[AND_IMP_INTRO] ABSOLUTELY_INTEGRABLE_SPIKE) THEN
13368  EXISTS_TAC ``\x. if x IN s DIFF t then (f:real->real) x else 0`` THEN
13369  EXISTS_TAC ``t:real->bool`` THEN ASM_SIMP_TAC std_ss [] THEN
13370  MATCH_MP_TAC NONNEGATIVE_ABSOLUTELY_INTEGRABLE THEN
13371  SIMP_TAC std_ss [] THEN CONJ_TAC THENL
13372   [METIS_TAC[REAL_LE_REFL], ALL_TAC] THEN
13373  MATCH_MP_TAC(REWRITE_RULE[AND_IMP_INTRO] INTEGRABLE_SPIKE) THEN
13374  MAP_EVERY EXISTS_TAC [``f:real->real``, ``t:real->bool``] THEN
13375  ASM_SIMP_TAC std_ss []
13376QED
13377
13378Theorem INTEGRAL_ABS_BOUND_INTEGRAL_AE:
13379   !f:real->real g s t.
13380        f integrable_on s /\ g integrable_on s /\
13381        negligible t /\ (!x. x IN s DIFF t ==> abs(f x) <= (g x))
13382        ==> abs(integral s f) <= (integral s g)
13383Proof
13384  REPEAT STRIP_TAC THEN
13385  MP_TAC(ISPECL
13386   [``\x. if x IN s DIFF t then (f:real->real) x else 0``,
13387    ``\x. if x IN s DIFF t then (g:real->real) x else 0``,
13388    ``s:real->bool``]
13389    INTEGRAL_ABS_BOUND_INTEGRAL) THEN
13390  SIMP_TAC std_ss [] THEN
13391  KNOW_TAC ``(\(x :real).
13392    if x IN (s :real -> bool) DIFF (t :real -> bool) then
13393      (f :real -> real) x
13394    else (0 :real)) integrable_on s /\
13395    (\(x :real).
13396    if x IN s DIFF t then (g :real -> real) x
13397    else (0 :real)) integrable_on s /\
13398   (!(x :real). x IN s ==>
13399    abs (if x IN s DIFF t then f x else (0 :real)) <=
13400    if x IN s DIFF t then g x else (0 :real))`` THENL
13401   [REPEAT CONJ_TAC THENL
13402     [MATCH_MP_TAC(REWRITE_RULE[AND_IMP_INTRO] INTEGRABLE_SPIKE) THEN
13403      EXISTS_TAC ``f:real->real``,
13404      MATCH_MP_TAC(REWRITE_RULE[AND_IMP_INTRO] INTEGRABLE_SPIKE) THEN
13405      EXISTS_TAC ``g:real->real``,
13406      METIS_TAC[REAL_LE_REFL, ABS_0]] THEN
13407    EXISTS_TAC ``t:real->bool`` THEN ASM_SIMP_TAC std_ss [],
13408    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
13409    MATCH_MP_TAC EQ_IMPLIES THEN BINOP_TAC THENL
13410    [AP_TERM_TAC, ALL_TAC] THEN
13411    MATCH_MP_TAC INTEGRAL_SPIKE THEN EXISTS_TAC ``t:real->bool`` THEN
13412    ASM_SIMP_TAC std_ss []]
13413QED
13414
13415(* ------------------------------------------------------------------------- *)
13416(* Beppo Levi theorem.                                                       *)
13417(* ------------------------------------------------------------------------- *)
13418
13419Theorem BEPPO_LEVI_INCREASING :
13420    !f:num->real->real s.
13421        (!k. (f k) integrable_on s) /\
13422        (!k x. x IN s ==> (f k x) <= (f (SUC k) x)) /\
13423        bounded {integral s (f k) | k IN univ(:num)}
13424        ==> ?g k. negligible k /\
13425                  !x. x IN (s DIFF k) ==> ((\k. f k x) --> g x) sequentially
13426Proof
13427  SUBGOAL_THEN
13428   ``!f:num->real->real s.
13429        (!k x. x IN s ==> &0 <= (f k x)) /\
13430        (!k. (f k) integrable_on s) /\
13431        (!k x. x IN s ==> (f k x) <= (f (SUC k) x)) /\
13432        bounded {integral s (f k) | k IN univ(:num)}
13433        ==> ?g k. negligible k /\
13434                  !x. x IN (s DIFF k) ==> ((\k. f k x) --> g x) sequentially``
13435  ASSUME_TAC THENL
13436  [ ALL_TAC,
13437    REPEAT GEN_TAC THEN STRIP_TAC THEN
13438    FIRST_X_ASSUM(MP_TAC o ISPECL
13439     [``\n x:real. f(n:num) x - (f 0 x):real``, ``s:real->bool``]) THEN
13440    SIMP_TAC std_ss [] THEN
13441    KNOW_TAC ``(!(k :num) (x :real).
13442    x IN (s :real -> bool) ==>
13443    (0 :real) <= (f :num -> real -> real) k x - f  0n x) /\
13444     (!(k :num). (\(x :real). f k x - f  0n x) integrable_on s) /\
13445     (!(k :num) (x :real). x IN s ==>
13446    (f k x - f  0n x) <=
13447    f (SUC k) x - f  0n x) /\
13448     (bounded {integral s (\(x :real). f k x - f  0n x) |
13449     k IN univ((:num) :num itself)} :bool)`` THEN
13450     REPEAT CONJ_TAC THENL (* 5 goals *)
13451     [(* goal 1 (of 5) *)
13452      REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_SUB_LE] THEN
13453      MP_TAC(ISPEC
13454        ``\m n:num. (f m (x:real)) <= (f n x):real``
13455        TRANSITIVE_STEPWISE_LE) THEN SIMP_TAC real_ss [REAL_LE_REFL] THEN
13456      KNOW_TAC ``(!(x' :num) (y :num) (z :num).
13457       (f :num -> real -> real) x' (x :real) <= f y x /\ f y x <= f z x ==>
13458        f x' x <= f z x) `` THENL
13459      [REPEAT GEN_TAC THEN STRIP_TAC THEN METIS_TAC [REAL_LE_TRANS],
13460       DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
13461      ASM_MESON_TAC[LE_0],
13462      (* goal 2 (of 5) *)
13463      GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_SUB THEN METIS_TAC[ETA_AX],
13464      (* goal 3 (of 5) *)
13465      REPEAT STRIP_TAC THEN
13466      ASM_SIMP_TAC std_ss [REAL_ARITH ``x - a <= y - a <=> x <= y:real``],
13467      (* goal 4 (of 5) *)
13468      FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [bounded_def]) THEN
13469      KNOW_TAC ``!k. (\x. (f:num->real->real) k x) integrable_on s`` THENL
13470      [METIS_TAC [ETA_AX], DISCH_TAC] THEN
13471      ASM_SIMP_TAC std_ss  [INTEGRAL_SUB, bounded_def] THEN
13472      SIMP_TAC real_ss [GSYM IMAGE_DEF] THEN
13473      SIMP_TAC std_ss [FORALL_IN_IMAGE, IN_UNIV] THEN
13474      DISCH_THEN(X_CHOOSE_THEN ``B:real``
13475        (fn th => EXISTS_TAC ``B + abs(integral s (f  0n:real->real))`` THEN
13476                   X_GEN_TAC ``k:num`` THEN MP_TAC(SPEC ``k:num`` th))) THEN
13477      REWRITE_TAC [METIS [ETA_AX] ``(\x. f k x) = f k``] THEN
13478      REAL_ARITH_TAC,
13479      (* goal 5 (of 5) *)
13480      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
13481      KNOW_TAC ``(?(k :real -> bool) (g :real -> real).
13482        negligible k /\ !(x :real). x IN (s :real -> bool) DIFF k ==>
13483        (((\(k :num). (f :num -> real -> real) k x - f  0n x) --> g x)
13484        sequentially :bool)) ==>
13485                  ?(k :real -> bool) (g :real -> real).
13486        negligible k /\ !(x :real).
13487        x IN s DIFF k ==> (((\(k :num). f k x) --> g x) sequentially :bool)`` THENL
13488      [ALL_TAC, METIS_TAC [SWAP_EXISTS_THM]] THEN
13489      DISCH_THEN (X_CHOOSE_TAC ``k:real->bool``) THEN EXISTS_TAC ``k:real->bool`` THEN
13490      POP_ASSUM MP_TAC THEN
13491      DISCH_THEN(X_CHOOSE_THEN ``g:real->real`` STRIP_ASSUME_TAC) THEN
13492      EXISTS_TAC ``(\x. g x + f  0n x):real->real`` THEN
13493      ASM_SIMP_TAC std_ss [] THEN X_GEN_TAC ``x:real`` THEN
13494      DISCH_TAC THEN FIRST_X_ASSUM(MP_TAC o SPEC ``x:real``) THEN
13495      ASM_SIMP_TAC std_ss [LIM_SEQUENTIALLY, dist] THEN
13496      REWRITE_TAC[REAL_ARITH ``a - b - c:real = a - (c + b)``] ] ] THEN
13497  REPEAT STRIP_TAC THEN
13498  ABBREV_TAC
13499   ``g = \i n:num x:real. min (((f:num->real->real) n x) / (&i + &1)) (&1)`` THEN
13500  SUBGOAL_THEN
13501   ``!i n. ((g:num->num->real->real) i n) integrable_on s``
13502  ASSUME_TAC THENL
13503   [REPEAT GEN_TAC THEN EXPAND_TAC "g" THEN
13504     ONCE_REWRITE_TAC [METIS [] ``(\x. min ((f:num->real->real) n x / (&i + 1)) 1) =
13505                          (\x. min ((\x. (f n x / (&i + 1))) x) 1)``] THEN
13506    MATCH_MP_TAC INTEGRABLE_MIN_CONST THEN
13507    ASM_SIMP_TAC std_ss [REAL_POS, REAL_LE_DIV, REAL_LE_ADD] THEN
13508    REWRITE_TAC[ONCE_REWRITE_RULE[REAL_MUL_SYM] real_div] THEN
13509    METIS_TAC [INTEGRABLE_CMUL, ETA_AX],
13510    ALL_TAC] THEN
13511  SUBGOAL_THEN
13512   ``!i:num k:num x:real. x IN s ==> (g i k x):real <= (g i (SUC k) x)``
13513  ASSUME_TAC THENL
13514   [REPEAT STRIP_TAC THEN EXPAND_TAC "g" THEN
13515    KNOW_TAC ``!x y a:real. x <= y ==> min x a <= min y a`` THENL
13516    [RW_TAC real_ss [min_def] THEN
13517     `a < x'` by PROVE_TAC [real_lte] \\
13518     `a < y` by PROVE_TAC [REAL_LTE_TRANS] \\
13519     PROVE_TAC [REAL_LTE_ANTISYM], DISCH_TAC] THEN
13520    FIRST_X_ASSUM MATCH_MP_TAC THEN REWRITE_TAC [real_div] THEN
13521    MATCH_MP_TAC REAL_LE_MUL2 THEN ASM_SIMP_TAC real_ss [REAL_POS, REAL_LE_REFL] THEN
13522     MATCH_MP_TAC REAL_LE_INV THEN
13523    ASM_SIMP_TAC std_ss [REAL_LE_LT, GSYM REAL_OF_NUM_ADD,
13524      METIS [REAL_LT, REAL_OF_NUM_ADD, GSYM ADD1, LESS_0]  ``&0 < &n + &1:real``],
13525    ALL_TAC] THEN
13526  SUBGOAL_THEN ``!i:num k:num x:real. x IN s ==> abs(g i k x:real) <= &1:real``
13527  ASSUME_TAC THENL
13528   [REPEAT STRIP_TAC THEN EXPAND_TAC "g" THEN
13529    KNOW_TAC ``0 <= ((f :num -> real -> real) (k :num) (x :real) /
13530      (((&(i :num)) :real) + (1 :real)))`` THENL
13531    [REWRITE_TAC [real_div] THEN MATCH_MP_TAC REAL_LE_MUL THEN
13532     ASM_SIMP_TAC real_ss [] THEN MATCH_MP_TAC REAL_LE_INV THEN
13533     ASM_SIMP_TAC std_ss [REAL_LE_LT, GSYM REAL_OF_NUM_ADD,
13534     METIS [REAL_LT, REAL_OF_NUM_ADD, GSYM ADD1, LESS_0]  ``&0 < &n + &1:real``],
13535      ALL_TAC] THEN REWRITE_TAC [min_def] THEN
13536      Cases_on `f k x / (&i + 1) <= 1` >> fs [abs],
13537     ALL_TAC] THEN
13538  SUBGOAL_THEN
13539   ``!i:num x:real. x IN s ==> ?h:real. ((\n. (g i n x):real) --> h) sequentially``
13540  MP_TAC THENL (* subgoals *)
13541  [ (* goal 1 (of 2) *)
13542    REPEAT STRIP_TAC THEN
13543    MP_TAC(ISPECL
13544     [``\n. (g (i:num) (n:num) (x:real)):real``, ``&1:real``]
13545     CONVERGENT_BOUNDED_MONOTONE) THEN
13546    SIMP_TAC std_ss [] THEN
13547    KNOW_TAC ``(!(n :num).
13548    abs ((g :num -> num -> real -> real) (i :num) n (x :real)) <= (1:real)) /\
13549    ((!(m :num) (n :num). m <= n ==> g i m x <= g i n x) \/
13550    !(m :num) (n :num). m <= n ==> g i n x <= g i m x)`` THENL
13551     [ASM_SIMP_TAC std_ss [] THEN DISJ1_TAC THEN
13552      ONCE_REWRITE_TAC [METIS [] ``g i m x <= (g:num->num->real->real) i n x <=>
13553                        (\m n:num. g i m x <= g i n x) m n``] THEN
13554      MATCH_MP_TAC TRANSITIVE_STEPWISE_LE THEN
13555      METIS_TAC [REAL_LE_REFL, REAL_LE_TRANS],
13556      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
13557      DISCH_THEN(X_CHOOSE_THEN ``l:real`` (fn th =>
13558        EXISTS_TAC ``l:real`` THEN MP_TAC th)) THEN
13559      SIMP_TAC std_ss [LIM_SEQUENTIALLY, dist]],
13560    (* goal 2 (of 2) *)
13561    DISCH_THEN (MP_TAC o SIMP_RULE std_ss [RIGHT_IMP_EXISTS_THM]) THEN
13562    SIMP_TAC std_ss [SKOLEM_THM, LEFT_IMP_EXISTS_THM] ] THEN
13563  X_GEN_TAC ``h:num->real->real`` THEN STRIP_TAC THEN
13564  MP_TAC(GEN ``i:num`` (ISPECL
13565   [``g(i:num):num->real->real``, ``h(i:num):real->real``,
13566    ``s:real->bool``] MONOTONE_CONVERGENCE_INCREASING)) THEN
13567  DISCH_TAC THEN
13568  KNOW_TAC ``(!(i :num).
13569   (!(k :num).
13570      (g :num -> num -> real -> real) i k integrable_on
13571      (s :real -> bool)) /\
13572   (!(k :num) (x :real). x IN s ==> g i k x <= g i (SUC k) x) /\
13573   (!(x :real).
13574      x IN s ==>
13575      (((\(k :num). g i k x) --> (h :num -> real -> real) i x)
13576         sequentially :bool)) /\
13577   (bounded {integral s (g i k) | k IN univ((:num) :num itself)} :
13578      bool)) ==> (!(i :num).
13579   h i integrable_on s /\
13580   (((\(k :num). integral s (g i k)) --> integral s (h i))
13581      sequentially :bool))`` THENL
13582   [METIS_TAC [MONO_ALL], POP_ASSUM K_TAC] THEN
13583  ASM_SIMP_TAC std_ss [] THEN
13584  (* stage work *)
13585  KNOW_TAC ``(!(i :num).
13586    (bounded
13587       {integral (s :real -> bool)
13588          ((g :num -> num -> real -> real) i k) |
13589        k IN univ((:num) :num itself)} :bool))`` THENL
13590  [ (* goal 1 (of 2):
13591       !i. bounded {integral s (g i k) | k IN univ(:num)} *)
13592    GEN_TAC THEN REWRITE_TAC[bounded_def] THEN
13593    UNDISCH_TAC ``bounded {integral s (f k) | k IN univ(:num)}`` THEN DISCH_TAC THEN
13594    FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [bounded_def]) THEN
13595    DISCH_THEN (X_CHOOSE_TAC ``kk:real``) THEN EXISTS_TAC ``kk:real`` THEN
13596    POP_ASSUM MP_TAC THEN
13597    SIMP_TAC std_ss [FORALL_IN_GSPEC] THEN REWRITE_TAC[IN_UNIV] THEN
13598    DISCH_TAC THEN X_GEN_TAC ``k:num`` THEN POP_ASSUM (MP_TAC o SPEC ``k:num``) THEN
13599    MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] REAL_LE_TRANS) THEN
13600    MATCH_MP_TAC(REAL_ARITH
13601     ``(abs a = a) /\ x <= a ==> x <= a:real``) THEN
13602    CONJ_TAC THENL
13603    [ (* goal 1.1 (of 2) *)
13604      SIMP_TAC std_ss [ABS_ABS],
13605      (* goal 1.2 (of 2) *)
13606      GEN_REWR_TAC RAND_CONV [abs] THEN
13607      ASM_SIMP_TAC real_ss [INTEGRAL_DROP_POS] THEN
13608      MATCH_MP_TAC INTEGRAL_ABS_BOUND_INTEGRAL THEN
13609      ASM_SIMP_TAC std_ss [] THEN X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN
13610      EXPAND_TAC "g" THEN
13611      KNOW_TAC ``0 <= ((f :num -> real -> real) (k :num) (x :real) /
13612                      (((&(i :num)) :real) + (1 :real))) /\
13613                      ((f :num -> real -> real) (k :num) (x :real) /
13614                      (((&(i :num)) :real) + (1 :real))) <= f k x`` THENL
13615      [ (* goal 1.2.1 (of 2):
13616           0 <= f k x / (&i + 1) /\ f k x / (&i + 1) <= f k x *)
13617        CONJ_TAC THENL
13618        [ (* goal 1.2.1.1 (of 2) *)
13619          REWRITE_TAC [real_div] THEN MATCH_MP_TAC REAL_LE_MUL THEN
13620          ASM_SIMP_TAC real_ss [] THEN MATCH_MP_TAC REAL_LE_INV THEN
13621          ASM_SIMP_TAC std_ss [REAL_LE_LT, GSYM REAL_OF_NUM_ADD,
13622             METIS [REAL_LT, REAL_OF_NUM_ADD, GSYM ADD1, LESS_0]  ``&0 < &n + &1:real``],
13623          (* goal 1.2.1.2 (of 2) *)
13624          ALL_TAC ] THEN
13625        SIMP_TAC real_ss [REAL_LE_LDIV_EQ] THEN
13626        GEN_REWR_TAC LAND_CONV [GSYM REAL_MUL_RID] THEN
13627        ONCE_REWRITE_TAC [GSYM REAL_SUB_LE] THEN REWRITE_TAC [GSYM REAL_SUB_LDISTRIB] THEN
13628        MATCH_MP_TAC REAL_LE_MUL THEN ASM_SIMP_TAC real_ss [] THEN
13629        ASM_SIMP_TAC std_ss [REAL_LE_LT, GSYM REAL_OF_NUM_ADD,
13630           METIS [REAL_LT, REAL_OF_NUM_ADD, GSYM ADD1, LESS_0]  ``&0 < &n + &1:real``] THEN
13631        REWRITE_TAC [REAL_ADD_SUB_ALT, GSYM REAL_LE_LT, REAL_POS],
13632        (* goal 1.2.2 (of 2) *)
13633        ALL_TAC] THEN
13634      RW_TAC std_ss [min_def]
13635      >- (NTAC 3 (POP_ASSUM MP_TAC) >> REAL_ARITH_TAC) \\
13636      rw [abs] >> NTAC 3 (POP_ASSUM MP_TAC) \\
13637      REAL_ARITH_TAC ],
13638    (* goal 2 (of 2) *)
13639    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
13640    SIMP_TAC std_ss [FORALL_AND_THM] THEN STRIP_TAC ] THEN
13641  ABBREV_TAC
13642   ``Z =
13643    {x:real | x IN s /\ ~(?l:real. ((\k. f k x) --> l) sequentially)}`` THEN
13644  KNOW_TAC ``?(k :real ->bool) (g :real -> real).
13645  negligible k /\
13646  !(x :real).
13647    x IN (s :real -> bool) DIFF k ==>
13648    (((\(k :num). (f :num -> real -> real) k x) --> g x) sequentially :
13649       bool)`` THENL [ALL_TAC, METIS_TAC [SWAP_EXISTS_THM]] THEN
13650  EXISTS_TAC ``Z:real->bool`` THEN
13651  SIMP_TAC std_ss [RIGHT_EXISTS_AND_THM, GSYM SKOLEM_THM, RIGHT_EXISTS_IMP_THM] THEN
13652  CONJ_TAC THENL
13653   [ALL_TAC, EXPAND_TAC "Z" THEN SIMP_TAC std_ss [GSPECIFICATION] THEN SET_TAC[]] THEN
13654  MP_TAC(ISPECL
13655   [``h:num->real->real``,
13656    ``(\x. if x IN Z then 1 else 0):real->real``,
13657    ``s:real->bool``]
13658        MONOTONE_CONVERGENCE_DECREASING) THEN
13659  ASM_SIMP_TAC std_ss [] THEN
13660  SUBGOAL_THEN
13661   ``!i x:real. x IN s ==> (h (SUC i) x) <= (h i x):real``
13662  ASSUME_TAC THENL
13663  [ (* goal 1 (of 2) *)
13664    MAP_EVERY X_GEN_TAC [``i:num``, ``x:real``] THEN DISCH_TAC THEN
13665    MATCH_MP_TAC(ISPEC ``sequentially`` LIM_DROP_LE) THEN
13666    EXISTS_TAC ``\n. (g:num->num->real->real) (SUC i) n x`` THEN
13667    EXISTS_TAC ``\n. (g:num->num->real->real) i n x`` THEN
13668    ASM_SIMP_TAC std_ss [TRIVIAL_LIMIT_SEQUENTIALLY] THEN
13669    MATCH_MP_TAC ALWAYS_EVENTUALLY THEN X_GEN_TAC ``n:num`` THEN
13670    EXPAND_TAC "g" THEN SIMP_TAC std_ss [] THEN
13671    KNOW_TAC ``!x y a:real. x <= y ==> min x a <= min y a`` THENL
13672    [ KILL_TAC \\
13673      RW_TAC real_ss [min_def] \\
13674      `a < x` by PROVE_TAC [real_lte] \\
13675      `a < y` by PROVE_TAC [REAL_LTE_TRANS] \\
13676      PROVE_TAC [REAL_LTE_ANTISYM], DISCH_TAC] THEN
13677    FIRST_X_ASSUM MATCH_MP_TAC THEN
13678    REWRITE_TAC[real_div] THEN MATCH_MP_TAC REAL_LE_LMUL_IMP THEN
13679    ASM_SIMP_TAC std_ss [] THEN MATCH_MP_TAC REAL_LE_INV2 THEN
13680    REWRITE_TAC[GSYM REAL_OF_NUM_SUC] THEN SIMP_TAC real_ss [REAL_POS],
13681    (* goal 2 (of 2) *)
13682    ASM_SIMP_TAC std_ss [] ] THEN
13683  UNDISCH_TAC ``bounded {integral s (f k) | k IN univ(:num)}`` THEN DISCH_TAC THEN
13684  FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [BOUNDED_POS]) THEN
13685  SIMP_TAC std_ss [FORALL_IN_GSPEC, IN_UNIV] THEN
13686  DISCH_THEN(X_CHOOSE_THEN ``B:real`` STRIP_ASSUME_TAC) THEN
13687  SUBGOAL_THEN
13688   ``!i. abs(integral s ((h:num->real->real) i)) <= B / (&i + &1)``
13689  ASSUME_TAC THENL
13690  [ (* goal 1 (of 2) *)
13691    X_GEN_TAC ``i:num`` THEN
13692    MATCH_MP_TAC(ISPEC ``sequentially`` LIM_ABS_UBOUND) THEN
13693    EXISTS_TAC ``\k. integral s ((g:num->num->real->real) i k)`` THEN
13694    ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN
13695    MATCH_MP_TAC ALWAYS_EVENTUALLY THEN X_GEN_TAC ``n:num`` THEN
13696    SIMP_TAC std_ss [] THEN MATCH_MP_TAC REAL_LE_TRANS THEN
13697    EXISTS_TAC
13698     ``(integral s (\x. inv(&i + &1) * (f:num->real->real) n x))`` THEN
13699    CONJ_TAC THENL
13700    [ (* goal 1.1 (of 2) *)
13701      MATCH_MP_TAC INTEGRAL_ABS_BOUND_INTEGRAL THEN ASM_SIMP_TAC std_ss [] THEN
13702      CONJ_TAC THENL [METIS_TAC [INTEGRABLE_CMUL, ETA_AX], ALL_TAC] THEN
13703      X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN EXPAND_TAC "g" THEN
13704      KNOW_TAC ``0 <= ((f :num -> real -> real) (n :num) (x :real) /
13705                      (((&(i :num)) :real) + (1 :real))) /\
13706                      ((f :num -> real -> real) (n :num) (x :real) /
13707                      (((&(i :num)) :real) + (1 :real))) <= inv (&i + 1) * f n x`` THENL
13708      [ (* goal 1.1.1 (of 2) *)
13709        CONJ_TAC THENL
13710        [ (* goal 1.1.1.1 (of 2) *)
13711          REWRITE_TAC [real_div] THEN MATCH_MP_TAC REAL_LE_MUL THEN
13712          ASM_SIMP_TAC real_ss [] THEN MATCH_MP_TAC REAL_LE_INV THEN
13713          ASM_SIMP_TAC std_ss [REAL_LE_LT, GSYM REAL_OF_NUM_ADD,
13714             METIS [REAL_LT, REAL_OF_NUM_ADD, GSYM ADD1, LESS_0] ``&0 < &n + &1:real``],
13715          (* goal 1.1.1.2 (of 2) *)
13716          ALL_TAC ] THEN
13717        SIMP_TAC real_ss [REAL_LE_LDIV_EQ] THEN
13718        GEN_REWR_TAC RAND_CONV [REAL_ARITH ``a * b * c = b * (a * c:real)``] THEN
13719        GEN_REWR_TAC LAND_CONV [GSYM REAL_MUL_RID] THEN
13720        ONCE_REWRITE_TAC [GSYM REAL_SUB_LE] THEN REWRITE_TAC [GSYM REAL_SUB_LDISTRIB] THEN
13721        MATCH_MP_TAC REAL_LE_MUL THEN ASM_SIMP_TAC real_ss [] THEN
13722        ASM_SIMP_TAC std_ss [REAL_LE_LT, GSYM REAL_OF_NUM_ADD,
13723           METIS [REAL_LT, REAL_OF_NUM_ADD, GSYM ADD1, LESS_0] ``&0 < &n + &1:real``] THEN
13724        DISJ2_TAC THEN CONV_TAC SYM_CONV THEN REWRITE_TAC [REAL_SUB_0] THEN
13725        MATCH_MP_TAC REAL_MUL_LINV THEN SIMP_TAC real_ss [REAL_POS],
13726        (* goal 1.1.2 (of 2) *)
13727        RW_TAC real_ss [min_def] THEN
13728        NTAC 3 (POP_ASSUM MP_TAC) >> REAL_ARITH_TAC ],
13729      (* goal 1.2 (of 2) *)
13730      ONCE_REWRITE_TAC [METIS [] ``(\x. inv (&(i + 1)) * (f:num->real->real) n x) =
13731                             (\x. inv (&(i + 1)) * (\x. f n x) x)``] THEN
13732      KNOW_TAC ``(\x. (f:num->real->real) n x) integrable_on s`` THENL
13733      [METIS_TAC [ETA_AX], DISCH_TAC] THEN
13734      ASM_SIMP_TAC real_ss [INTEGRAL_CMUL] THEN
13735      ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
13736      SIMP_TAC real_ss [REAL_LE_RDIV_EQ] THEN
13737      SIMP_TAC real_ss [REAL_MUL_LINV, GSYM REAL_MUL_ASSOC] THEN
13738      MATCH_MP_TAC(REAL_ARITH ``abs x <= a ==> x <= a:real``) THEN
13739      METIS_TAC [ETA_AX] ],
13740    (* goal 2 (of 2) *)
13741    ALL_TAC ] THEN
13742  KNOW_TAC ``(!(x :real).
13743    x IN (s :real -> bool) ==>
13744    (((\(k :num). (h :num -> real -> real) k x) -->
13745      if x IN (Z :real -> bool) then (1 :real) else (0 :real))
13746       sequentially :bool)) /\
13747   (bounded {integral s (h k) | k | T} :bool)`` THENL
13748  [ (* goal 1 (of 2) *)
13749    SIMP_TAC std_ss [bounded_def, FORALL_IN_GSPEC] THEN CONJ_TAC THENL
13750     [ALL_TAC,
13751      EXISTS_TAC ``B:real`` THEN X_GEN_TAC ``i:num`` THEN
13752      MATCH_MP_TAC REAL_LE_TRANS THEN
13753      EXISTS_TAC ``B / (&i + &1:real)`` THEN ASM_REWRITE_TAC[] THEN
13754      ASM_SIMP_TAC real_ss [REAL_LE_LDIV_EQ] THEN
13755      REWRITE_TAC[GSYM REAL_OF_NUM_ADD,
13756       REAL_ARITH ``B <= B * (i + &1) <=> &0:real <= i * B``] THEN
13757      ASM_SIMP_TAC std_ss [REAL_LE_MUL, REAL_POS, REAL_LT_IMP_LE]] THEN
13758    X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN
13759    ASM_CASES_TAC ``(x:real) IN Z`` THEN ASM_REWRITE_TAC[] THENL
13760    [ (* goal 1.1 (of 2) *)
13761      MATCH_MP_TAC LIM_EVENTUALLY THEN
13762      UNDISCH_TAC ``(x:real) IN Z`` THEN EXPAND_TAC "Z" THEN
13763      SIMP_TAC std_ss [GSPECIFICATION] THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
13764      MP_TAC(GEN ``B:real`` (ISPECL
13765        [``(\n. (f:num->real->real) (n:num) (x:real))``, ``B:real``]
13766        CONVERGENT_BOUNDED_MONOTONE)) THEN
13767      SIMP_TAC std_ss [LEFT_FORALL_IMP_THM, LEFT_EXISTS_AND_THM] THEN
13768      MATCH_MP_TAC(TAUT
13769       `q /\ ~r /\ (q ==> ~p ==> s)
13770        ==> (p /\ (q \/ q') ==> r) ==> s`) THEN
13771      CONJ_TAC THENL
13772       [ONCE_REWRITE_TAC [METIS [] ``f m x <= (f:num->real->real) n x <=>
13773                              (\m n. f m x <= f n x) m n``] THEN
13774        MATCH_MP_TAC TRANSITIVE_STEPWISE_LE THEN
13775        METIS_TAC [REAL_LE_REFL, REAL_LE_TRANS],
13776        ALL_TAC] THEN
13777      CONJ_TAC THENL
13778       [FIRST_X_ASSUM(MP_TAC o SIMP_RULE std_ss [NOT_EXISTS_THM]) THEN
13779        ONCE_REWRITE_TAC[MONO_NOT_EQ] THEN SIMP_TAC std_ss [] THEN
13780        DISCH_THEN(X_CHOOSE_THEN ``l:real`` STRIP_ASSUME_TAC) THEN
13781        EXISTS_TAC ``l:real`` THEN REWRITE_TAC[LIM_SEQUENTIALLY] THEN
13782        X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
13783        FIRST_X_ASSUM(MP_TAC o SPEC ``e:real``) THEN ASM_REWRITE_TAC[] THEN
13784        SIMP_TAC std_ss [dist],
13785        ALL_TAC] THEN
13786      DISCH_TAC THEN SIMP_TAC std_ss [NOT_FORALL_THM, EVENTUALLY_SEQUENTIALLY] THEN
13787      SIMP_TAC std_ss [NOT_EXISTS_THM, NOT_FORALL_THM, REAL_NOT_LE] THEN
13788      DISCH_TAC THEN
13789      EXISTS_TAC ``0:num`` THEN  X_GEN_TAC ``i:num`` THEN DISCH_TAC THEN
13790      MATCH_MP_TAC(ISPEC ``sequentially`` LIM_UNIQUE) THEN
13791      EXISTS_TAC ``(\n. (g:num->num->real->real) i n x)`` THEN
13792      ASM_SIMP_TAC std_ss [TRIVIAL_LIMIT_SEQUENTIALLY] THEN
13793      MATCH_MP_TAC LIM_EVENTUALLY THEN
13794      EXPAND_TAC "g" THEN SIMP_TAC std_ss [EVENTUALLY_SEQUENTIALLY] THEN
13795      FIRST_X_ASSUM(MP_TAC o SPEC ``&i + &1:real``) THEN
13796      DISCH_THEN (X_CHOOSE_TAC ``N:num``) THEN EXISTS_TAC ``N:num`` THEN
13797      X_GEN_TAC ``n:num`` THEN DISCH_TAC THEN
13798      KNOW_TAC ``!a b. (min a b = b) <=> b <= a:real`` THENL
13799      [ RW_TAC real_ss [min_def] THEN
13800        POP_ASSUM MP_TAC >> REAL_ARITH_TAC, DISCH_TAC ] THEN
13801      FIRST_X_ASSUM (fn th => REWRITE_TAC [th]) THEN
13802      SIMP_TAC real_ss [REAL_LE_RDIV_EQ, REAL_MUL_LID] THEN
13803      UNDISCH_TAC ``&i + 1 < abs ((f:num->real->real) N x)`` THEN DISCH_TAC THEN
13804      REWRITE_TAC [GSYM REAL_OF_NUM_ADD] THEN
13805      FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
13806       ``a < abs N ==> &0 <= N:real /\ N <= n ==> a <= n:real``)) THEN
13807      ASM_SIMP_TAC std_ss [],
13808      (* goal 1.2 (of 2) *)
13809      UNDISCH_TAC ``~((x:real) IN Z)`` THEN EXPAND_TAC "Z" THEN
13810      SIMP_TAC std_ss [GSPECIFICATION] THEN
13811      ASM_SIMP_TAC std_ss [LEFT_IMP_EXISTS_THM] THEN
13812      X_GEN_TAC ``l:real`` THEN
13813      DISCH_THEN(MP_TAC o MATCH_MP CONVERGENT_IMP_BOUNDED) THEN
13814      SIMP_TAC std_ss [BOUNDED_POS, FORALL_IN_IMAGE, IN_UNIV] THEN
13815      DISCH_THEN(X_CHOOSE_THEN ``C:real`` STRIP_ASSUME_TAC) THEN
13816      SIMP_TAC std_ss [LIM_SEQUENTIALLY, DIST_0] THEN
13817      X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
13818      MP_TAC(ISPEC ``e / C:real`` REAL_ARCH_INV) THEN
13819      ASM_SIMP_TAC std_ss [REAL_LT_DIV] THEN
13820      DISCH_THEN (X_CHOOSE_TAC ``N:num``) THEN EXISTS_TAC ``N:num`` THEN
13821      POP_ASSUM MP_TAC THEN ASM_SIMP_TAC real_ss [REAL_LT_RDIV_EQ] THEN STRIP_TAC THEN
13822      X_GEN_TAC ``i:num`` THEN DISCH_TAC THEN
13823      MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC ``inv(&N) * C:real`` THEN
13824      ASM_REWRITE_TAC[] THEN
13825      MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC ``C / (&i + &1:real)`` THEN
13826      CONJ_TAC THENL
13827       [ALL_TAC,
13828        REWRITE_TAC[ONCE_REWRITE_RULE[REAL_MUL_SYM] real_div] THEN
13829        ASM_SIMP_TAC real_ss [REAL_LE_RMUL] THEN MATCH_MP_TAC REAL_LE_INV2 THEN
13830        ASM_REWRITE_TAC[REAL_LT, REAL_OF_NUM_LE, REAL_OF_NUM_ADD] THEN
13831        ASM_SIMP_TAC arith_ss []] THEN
13832      MATCH_MP_TAC(ISPEC ``sequentially`` LIM_ABS_UBOUND) THEN
13833      EXISTS_TAC ``\n. (g:num->num->real->real) i n x`` THEN
13834      ASM_SIMP_TAC std_ss [TRIVIAL_LIMIT_SEQUENTIALLY] THEN
13835      MATCH_MP_TAC ALWAYS_EVENTUALLY THEN X_GEN_TAC ``n:num`` THEN
13836      EXPAND_TAC "g" THEN SIMP_TAC std_ss [] THEN
13837      KNOW_TAC ``!a x:real. &0 <= x /\ x <= a ==> abs(min x (&1)) <= a`` THENL
13838      [ RW_TAC real_ss [min_def] THEN
13839        NTAC 3 (POP_ASSUM MP_TAC) >> REAL_ARITH_TAC, DISCH_TAC ] THEN
13840      FIRST_X_ASSUM MATCH_MP_TAC THEN
13841      ASM_SIMP_TAC real_ss [REAL_LE_DIV, REAL_LE_ADD, REAL_POS] THEN
13842      REWRITE_TAC [real_div] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
13843      ASM_SIMP_TAC std_ss [GSYM REAL_OF_NUM_ADD,
13844       METIS [REAL_LT, REAL_OF_NUM_ADD, GSYM ADD1, LESS_0] ``&0 < &n + &1:real``] THEN
13845      SIMP_TAC std_ss [REAL_LE_REFL] THEN CONJ_TAC THENL
13846      [MATCH_MP_TAC REAL_LE_INV THEN SIMP_TAC real_ss [REAL_POS], ALL_TAC] THEN
13847      MATCH_MP_TAC(REAL_ARITH ``abs x <= a ==> x <= a:real``) THEN
13848      ASM_SIMP_TAC real_ss [] ],
13849    (* goal 2 (of 2) *)
13850    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
13851    DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
13852    MATCH_MP_TAC(MESON[LIM_UNIQUE, TRIVIAL_LIMIT_SEQUENTIALLY]
13853     ``(f --> 0) sequentially /\ ((i = 0) ==> p)
13854      ==> (f --> i) sequentially ==> p``) THEN
13855    CONJ_TAC THENL
13856     [MATCH_MP_TAC LIM_NULL_COMPARISON THEN
13857      EXISTS_TAC ``\i. B / (&i + &1:real)`` THEN
13858      ASM_SIMP_TAC std_ss [ALWAYS_EVENTUALLY] THEN
13859      REWRITE_TAC[real_div] THEN
13860      SUBST1_TAC(REAL_ARITH ``0:real = B * 0``) THEN
13861      ONCE_REWRITE_TAC [METIS [] ``(\x. B * inv (&x + 1:real)) =
13862                              (\x. B * (\x. inv (&x + 1)) x)``] THEN
13863      MATCH_MP_TAC LIM_CMUL THEN
13864      SIMP_TAC std_ss [LIM_SEQUENTIALLY, DIST_0] THEN
13865      X_GEN_TAC ``e:real`` THEN GEN_REWR_TAC LAND_CONV [REAL_ARCH_INV] THEN
13866      DISCH_THEN (X_CHOOSE_TAC ``N:num``) THEN EXISTS_TAC ``N:num`` THEN
13867      POP_ASSUM MP_TAC THEN STRIP_TAC THEN X_GEN_TAC ``n:num`` THEN DISCH_TAC THEN
13868      SIMP_TAC real_ss [ABS_INV] THEN
13869      MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC ``inv(&N:real)`` THEN
13870      ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_LE_INV2 THEN
13871      SIMP_TAC real_ss [METIS [abs, REAL_OF_NUM_ADD, REAL_POS]
13872       ``abs(&(n + &1)) = &n + &1:real``] THEN
13873      ASM_SIMP_TAC arith_ss [],
13874      ASM_SIMP_TAC std_ss [INTEGRAL_EQ_HAS_INTEGRAL] THEN
13875      W(MP_TAC o PART_MATCH (lhs o rand) HAS_INTEGRAL_NEGLIGIBLE_EQ o
13876        lhand o snd) THEN SIMP_TAC std_ss [] THEN
13877      KNOW_TAC ``(!x:real. x IN s ==> 0 <= if x IN Z then 1 else 0:real)`` THENL
13878       [SIMP_TAC std_ss [IMP_CONJ, RIGHT_FORALL_IMP_THM] THEN
13879        REWRITE_TAC[AND_IMP_INTRO] THEN
13880        REPEAT STRIP_TAC THEN COND_CASES_TAC THEN
13881        REWRITE_TAC[REAL_POS],
13882        DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
13883        DISCH_THEN SUBST1_TAC THEN
13884        MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] NEGLIGIBLE_SUBSET) THEN
13885        SIMP_TAC arith_ss [SUBSET_DEF, GSPECIFICATION] THEN
13886        EXPAND_TAC "Z" THEN SIMP_TAC real_ss [GSPECIFICATION]]] ]
13887QED
13888
13889Theorem BEPPO_LEVI_DECREASING:
13890   !f:num->real->real s.
13891        (!k. (f k) integrable_on s) /\
13892        (!k x. x IN s ==> (f (SUC k) x) <= (f k x)) /\
13893        bounded {integral s (f k) | k IN univ(:num)}
13894        ==> ?g k. negligible k /\
13895                  !x. x IN (s DIFF k) ==> ((\k. f k x) --> g x) sequentially
13896Proof
13897  REPEAT STRIP_TAC THEN
13898  MP_TAC(ISPECL [``\n x. -((f:num->real->real) n x)``, ``s:real->bool``]
13899        BEPPO_LEVI_INCREASING) THEN
13900  ASM_SIMP_TAC std_ss [INTEGRABLE_NEG, ETA_AX, REAL_LE_NEG2] THEN
13901  ASM_SIMP_TAC real_ss [METIS [INTEGRABLE_NEG, ETA_AX]
13902   ``(!k. (f:num->real->real) k integrable_on s) ==>
13903              (!k. (\x. -f k x) integrable_on s)``] THEN
13904  KNOW_TAC ``(bounded
13905    {integral s (\(x :real). -(f :num -> real -> real) k x) |
13906      k IN univ((:num) :num itself)} : bool)`` THENL
13907   [REWRITE_TAC[bounded_def] THEN
13908    FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [bounded_def]) THEN
13909    SIMP_TAC std_ss [FORALL_IN_GSPEC] THEN
13910    METIS_TAC [INTEGRAL_NEG, ETA_AX, ABS_NEG],
13911    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
13912    KNOW_TAC ``(?(k :real -> bool) (g :real -> real).
13913     negligible k /\ !(x :real).
13914     x IN (s :real -> bool) DIFF k ==>
13915     (((\(k :num). -(f :num -> real -> real) k x) --> g x)
13916        sequentially :bool)) ==>
13917     ?(k :real -> bool) (g :real -> real). negligible k /\ !(x :real).
13918      x IN s DIFF k ==> (((\(k :num). f k x) --> g x) sequentially :bool)`` THENL
13919    [ALL_TAC, METIS_TAC [SWAP_EXISTS_THM]] THEN
13920    DISCH_THEN (X_CHOOSE_TAC ``k:real->bool``) THEN EXISTS_TAC ``k:real->bool`` THEN
13921    POP_ASSUM MP_TAC THEN
13922    DISCH_THEN(X_CHOOSE_THEN ``g:real->real`` STRIP_ASSUME_TAC) THEN
13923    EXISTS_TAC ``\x. -((g:real->real) x)`` THEN
13924    ASM_SIMP_TAC std_ss [] THEN REPEAT STRIP_TAC THEN
13925    GEN_REWR_TAC (RATOR_CONV o LAND_CONV o ABS_CONV)
13926      [GSYM REAL_NEG_NEG] THEN
13927    ASM_SIMP_TAC std_ss [LIM_NEG_EQ]]
13928QED
13929
13930Theorem BEPPO_LEVI_MONOTONE_CONVERGENCE_INCREASING:
13931   !f:num->real->real s.
13932        (!k. (f k) integrable_on s) /\
13933        (!k x. x IN s ==> (f k x) <= (f (SUC k) x)) /\
13934        bounded {integral s (f k) | k IN univ(:num)}
13935        ==> ?g k. negligible k /\
13936                  (!x. x IN (s DIFF k)
13937                       ==> ((\k. f k x) --> g x) sequentially) /\
13938                  g integrable_on s /\
13939                  ((\k. integral s (f k)) --> integral s g) sequentially
13940Proof
13941  REPEAT GEN_TAC THEN DISCH_TAC THEN
13942  FIRST_ASSUM(MP_TAC o MATCH_MP BEPPO_LEVI_INCREASING) THEN
13943  DISCH_THEN (X_CHOOSE_THEN ``g:real->real`` MP_TAC) THEN
13944  DISCH_THEN (X_CHOOSE_TAC ``k:real->bool``) THEN
13945  EXISTS_TAC ``g:real->real`` THEN EXISTS_TAC ``k:real->bool`` THEN
13946  POP_ASSUM MP_TAC THEN STRIP_TAC THEN ASM_SIMP_TAC std_ss [] THEN
13947  SUBGOAL_THEN
13948   ``(g:real->real) integrable_on (s DIFF k) /\
13949     ((\i. integral (s DIFF k) (f i)) --> integral (s DIFF k) g) sequentially``
13950  MP_TAC THENL
13951   [MATCH_MP_TAC MONOTONE_CONVERGENCE_INCREASING THEN
13952    ASM_SIMP_TAC std_ss [] THEN
13953    UNDISCH_TAC ``(!k. f k integrable_on s) /\
13954      (!k x. x IN s ==> f k x <= f (SUC k) x) /\
13955      bounded {integral s (f k) | k IN univ(:num)}``,
13956    ALL_TAC] THEN
13957  (SUBGOAL_THEN
13958    ``!f:real->real. (integral (s DIFF k) f = integral s f) /\
13959                        (f integrable_on (s DIFF k) <=> f integrable_on s)``
13960    (fn th => SIMP_TAC std_ss [th, IN_DIFF]) THEN
13961   GEN_TAC THEN CONJ_TAC THEN TRY EQ_TAC THEN
13962   (MATCH_MP_TAC INTEGRABLE_SPIKE_SET ORELSE
13963    MATCH_MP_TAC INTEGRAL_SPIKE_SET) THEN
13964   FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
13965        NEGLIGIBLE_SUBSET)) THEN
13966     SET_TAC[])
13967QED
13968
13969Theorem BEPPO_LEVI_MONOTONE_CONVERGENCE_DECREASING:
13970   !f:num->real->real s.
13971        (!k. (f k) integrable_on s) /\
13972        (!k x. x IN s ==> (f (SUC k) x) <= (f k x)) /\
13973        bounded {integral s (f k) | k IN univ(:num)}
13974        ==> ?g k. negligible k /\
13975                  (!x. x IN (s DIFF k)
13976                       ==> ((\k. f k x) --> g x) sequentially) /\
13977                  g integrable_on s /\
13978                  ((\k. integral s (f k)) --> integral s g) sequentially
13979Proof
13980  REPEAT GEN_TAC THEN DISCH_TAC THEN
13981  FIRST_ASSUM(MP_TAC o MATCH_MP BEPPO_LEVI_DECREASING) THEN
13982  DISCH_THEN (X_CHOOSE_THEN ``g:real->real`` MP_TAC) THEN
13983  DISCH_THEN (X_CHOOSE_TAC ``k:real->bool``) THEN
13984  EXISTS_TAC ``g:real->real`` THEN EXISTS_TAC ``k:real->bool`` THEN
13985  POP_ASSUM MP_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
13986  SUBGOAL_THEN
13987   ``(g:real->real) integrable_on (s DIFF k) /\
13988    ((\i. integral (s DIFF k) (f i)) --> integral (s DIFF k) g) sequentially``
13989  MP_TAC THENL
13990   [MATCH_MP_TAC MONOTONE_CONVERGENCE_DECREASING THEN
13991    ASM_SIMP_TAC std_ss [] THEN
13992    UNDISCH_TAC `` (!k. f k integrable_on s) /\
13993      (!k x. x IN s ==> f (SUC k) x <= f k x) /\
13994      bounded {integral s (f k) | k IN univ(:num)}``,
13995    ALL_TAC] THEN
13996  (SUBGOAL_THEN
13997    ``!f:real->real. (integral (s DIFF k) f = integral s f) /\
13998                        (f integrable_on (s DIFF k) <=> f integrable_on s)``
13999    (fn th => SIMP_TAC std_ss [th, IN_DIFF]) THEN
14000   GEN_TAC THEN CONJ_TAC THEN TRY EQ_TAC THEN
14001   (MATCH_MP_TAC INTEGRABLE_SPIKE_SET ORELSE
14002    MATCH_MP_TAC INTEGRAL_SPIKE_SET) THEN
14003   FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
14004        NEGLIGIBLE_SUBSET)) THEN
14005     SET_TAC[])
14006QED
14007
14008Theorem BEPPO_LEVI_MONOTONE_CONVERGENCE_INCREASING_AE:
14009   !f:num->real->real s.
14010        (!k. (f k) integrable_on s) /\
14011        (!k. ?t. negligible t /\
14012                 !x. x IN s DIFF t ==> (f k x) <= (f (SUC k) x)) /\
14013        bounded {integral s (f k) | k IN univ(:num)}
14014        ==> ?g k. negligible k /\
14015                  (!x. x IN (s DIFF k)
14016                       ==> ((\k. f k x) --> g x) sequentially) /\
14017                  g integrable_on s /\
14018                  ((\k. integral s (f k)) --> integral s g) sequentially
14019Proof
14020  REPEAT GEN_TAC THEN SIMP_TAC std_ss [SKOLEM_THM] THEN
14021  DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
14022  DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
14023  SIMP_TAC std_ss [FORALL_AND_THM] THEN
14024  DISCH_THEN(X_CHOOSE_THEN ``t:num->real->bool`` STRIP_ASSUME_TAC) THEN
14025  MP_TAC(ISPECL
14026   [``\n x. if x IN BIGUNION {t k | k IN univ(:num)} then 0
14027           else (f:num->real->real) n x``, ``s:real->bool``]
14028        BEPPO_LEVI_MONOTONE_CONVERGENCE_INCREASING) THEN
14029  SUBGOAL_THEN
14030   ``negligible(BIGUNION {t k | k IN univ(:num)}:real->bool)``
14031  ASSUME_TAC THENL [ASM_SIMP_TAC std_ss [NEGLIGIBLE_COUNTABLE_BIGUNION], ALL_TAC] THEN
14032  ASM_SIMP_TAC std_ss [] THEN
14033  KNOW_TAC ``(!(k :num). (\(x :real).
14034       if x IN BIGUNION
14035           {(t :num -> real -> bool) k | k IN univ((:num) :num itself)}
14036       then (0 : real)
14037       else (f :num -> real -> real) k x) integrable_on (s :real -> bool)) /\
14038             (!(k :num) (x :real). x IN s ==>
14039    (if x IN BIGUNION {t k | k IN univ((:num) :num itself)} then
14040       (0 : real) else f k x) <=
14041    if x IN BIGUNION {t k | k IN univ((:num) :num itself)} then
14042      (0 : real) else f (SUC k) x) /\
14043    (bounded {integral s (\(x :real).
14044          if x IN BIGUNION {t k | k IN univ((:num) :num itself)} then
14045            (0 : real) else f k x) |
14046     k IN univ((:num) :num itself)} :bool)`` THENL
14047   [REPEAT CONJ_TAC THENL
14048     [X_GEN_TAC ``k:num`` THEN
14049      MATCH_MP_TAC(REWRITE_RULE[AND_IMP_INTRO] INTEGRABLE_SPIKE) THEN
14050      EXISTS_TAC ``(f:num->real->real) k`` THEN
14051      EXISTS_TAC ``BIGUNION {t k | k IN univ(:num)}:real->bool`` THEN
14052      ASM_SIMP_TAC std_ss [IN_DIFF],
14053      REPEAT STRIP_TAC THEN COND_CASES_TAC THEN
14054      ASM_REWRITE_TAC[REAL_LE_REFL] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
14055      ASM_SET_TAC[],
14056      FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
14057        BOUNDED_SUBSET)) THEN
14058      KNOW_TAC ``{(\k. integral (s :real -> bool)
14059       (\(x :real). if x IN BIGUNION
14060          {(t :num -> real -> bool) k | k IN univ((:num) :num itself)}
14061      then (0 : real)
14062      else (f :num -> real -> real) k x)) k |
14063       k IN univ((:num) :num itself)} SUBSET
14064       {(\k. integral s (f k)) k | k IN univ((:num) :num itself)}`` THENL
14065      [ALL_TAC, METIS_TAC []] THEN
14066      MATCH_MP_TAC(SET_RULE
14067       ``(!x. x IN s ==> (f x = g x))
14068        ==> {f x | x IN s} SUBSET {g x | x IN s}``) THEN SIMP_TAC std_ss [] THEN
14069      REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRAL_SPIKE THEN
14070      EXISTS_TAC ``BIGUNION {t k | k IN univ(:num)}:real->bool`` THEN
14071      ASM_SIMP_TAC std_ss [IN_DIFF]],
14072    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
14073    DISCH_THEN (X_CHOOSE_TAC ``g:real->real``) THEN
14074    EXISTS_TAC ``g:real->real`` THEN POP_ASSUM MP_TAC THEN
14075    DISCH_THEN(X_CHOOSE_THEN ``u:real->bool`` STRIP_ASSUME_TAC) THEN
14076    EXISTS_TAC ``u UNION BIGUNION {t k | k IN univ(:num)}:real->bool`` THEN
14077    ASM_REWRITE_TAC[NEGLIGIBLE_UNION_EQ] THEN CONJ_TAC THENL
14078     [X_GEN_TAC ``x:real`` THEN
14079      REWRITE_TAC[IN_DIFF, IN_UNION, DE_MORGAN_THM] THEN STRIP_TAC THEN
14080      FIRST_X_ASSUM(MP_TAC o SPEC ``x:real``) THEN
14081      ASM_REWRITE_TAC[IN_DIFF],
14082      FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (MESON[]
14083         ``(f --> l) sequentially ==> (f = g) ==> (g --> l) sequentially``)) THEN
14084      SIMP_TAC std_ss [FUN_EQ_THM] THEN GEN_TAC THEN
14085      MATCH_MP_TAC INTEGRAL_SPIKE THEN
14086      EXISTS_TAC ``BIGUNION {t k | k IN univ(:num)}:real->bool`` THEN
14087      ASM_SIMP_TAC std_ss [IN_DIFF]]]
14088QED
14089
14090Theorem BEPPO_LEVI_MONOTONE_CONVERGENCE_DECREASING_AE:
14091   !f:num->real->real s.
14092        (!k. (f k) integrable_on s) /\
14093        (!k. ?t. negligible t /\
14094                 !x. x IN s DIFF t ==> (f (SUC k) x) <= (f k x)) /\
14095        bounded {integral s (f k) | k IN univ(:num)}
14096        ==> ?g k. negligible k /\
14097                  (!x. x IN (s DIFF k)
14098                       ==> ((\k. f k x) --> g x) sequentially) /\
14099                  g integrable_on s /\
14100                  ((\k. integral s (f k)) --> integral s g) sequentially
14101Proof
14102  REPEAT GEN_TAC THEN SIMP_TAC std_ss [SKOLEM_THM] THEN
14103  DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
14104  DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
14105  SIMP_TAC std_ss [FORALL_AND_THM] THEN
14106  DISCH_THEN(X_CHOOSE_THEN ``t:num->real->bool`` STRIP_ASSUME_TAC) THEN
14107  MP_TAC(ISPECL
14108   [``\n x. if x IN BIGUNION {t k | k IN univ(:num)} then 0
14109           else (f:num->real->real) n x``, ``s:real->bool``]
14110        BEPPO_LEVI_MONOTONE_CONVERGENCE_DECREASING) THEN
14111  SUBGOAL_THEN
14112   ``negligible(BIGUNION {t k | k IN univ(:num)}:real->bool)``
14113  ASSUME_TAC THENL [ASM_SIMP_TAC std_ss [NEGLIGIBLE_COUNTABLE_BIGUNION], ALL_TAC] THEN
14114  ASM_SIMP_TAC std_ss [] THEN
14115  KNOW_TAC ``(!(k :num). (\(x :real).
14116       if x IN BIGUNION
14117           {(t :num -> real -> bool) k | k IN univ((:num) :num itself)}
14118       then (0 : real)
14119       else (f :num -> real -> real) k x) integrable_on (s :real -> bool)) /\
14120     (!(k :num) (x :real). x IN s ==>
14121    (if x IN BIGUNION {t k | k IN univ((:num) :num itself)} then
14122       (0 : real) else f (SUC k) x) <=
14123    if x IN BIGUNION {t k | k IN univ((:num) :num itself)} then
14124      (0 : real)
14125    else f k x) /\ (bounded
14126    {integral s (\(x :real).
14127          if x IN BIGUNION {t k | k IN univ((:num) :num itself)} then
14128            (0 : real)
14129          else f k x) | k IN univ((:num) :num itself)} :bool)`` THENL
14130   [REPEAT CONJ_TAC THENL
14131     [X_GEN_TAC ``k:num`` THEN
14132      MATCH_MP_TAC(REWRITE_RULE[AND_IMP_INTRO] INTEGRABLE_SPIKE) THEN
14133      EXISTS_TAC ``(f:num->real->real) k`` THEN
14134      EXISTS_TAC ``BIGUNION {t k | k IN univ(:num)}:real->bool`` THEN
14135      ASM_SIMP_TAC std_ss [IN_DIFF],
14136      REPEAT STRIP_TAC THEN COND_CASES_TAC THEN
14137      ASM_SIMP_TAC std_ss [REAL_LE_REFL] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
14138      ASM_SET_TAC[],
14139      FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
14140        BOUNDED_SUBSET)) THEN
14141       KNOW_TAC ``{(\k. integral (s :real -> bool)
14142       (\(x :real). if x IN BIGUNION
14143          {(t :num -> real -> bool) k | k IN univ((:num) :num itself)}
14144      then (0 : real)
14145      else (f :num -> real -> real) k x)) k |
14146       k IN univ((:num) :num itself)} SUBSET
14147       {(\k. integral s (f k)) k | k IN univ((:num) :num itself)}`` THENL
14148      [ALL_TAC, METIS_TAC []] THEN
14149      MATCH_MP_TAC(SET_RULE
14150       ``(!x. x IN s ==> (f x = g x))
14151        ==> {f x | x IN s} SUBSET {g x | x IN s}``) THEN SIMP_TAC std_ss [] THEN
14152      REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRAL_SPIKE THEN
14153      EXISTS_TAC ``BIGUNION {t k | k IN univ(:num)}:real->bool`` THEN
14154      ASM_SIMP_TAC std_ss [IN_DIFF]],
14155
14156    DISCH_TAC THEN ASM_SIMP_TAC std_ss [] THEN POP_ASSUM K_TAC THEN
14157    DISCH_THEN (X_CHOOSE_TAC ``g:real->real``) THEN
14158    EXISTS_TAC ``g:real->real`` THEN POP_ASSUM MP_TAC THEN
14159    DISCH_THEN(X_CHOOSE_THEN ``u:real->bool`` STRIP_ASSUME_TAC) THEN
14160    EXISTS_TAC ``u UNION BIGUNION {t k | k IN univ(:num)}:real->bool`` THEN
14161    ASM_SIMP_TAC std_ss [NEGLIGIBLE_UNION_EQ] THEN CONJ_TAC THENL
14162     [X_GEN_TAC ``x:real`` THEN
14163      REWRITE_TAC[IN_DIFF, IN_UNION, DE_MORGAN_THM] THEN STRIP_TAC THEN
14164      FIRST_X_ASSUM(MP_TAC o SPEC ``x:real``) THEN
14165      ASM_REWRITE_TAC[IN_DIFF],
14166      FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (MESON[]
14167         ``(f --> l) sequentially ==> (f = g) ==> (g --> l) sequentially``)) THEN
14168      SIMP_TAC std_ss [FUN_EQ_THM] THEN GEN_TAC THEN
14169      MATCH_MP_TAC INTEGRAL_SPIKE THEN
14170      EXISTS_TAC ``BIGUNION {t k | k IN univ(:num)}:real->bool`` THEN
14171      ASM_SIMP_TAC std_ss [IN_DIFF]]]
14172QED
14173
14174(* ------------------------------------------------------------------------- *)
14175(* Fatou's lemma and Lieb's extension.                                       *)
14176(* ------------------------------------------------------------------------- *)
14177
14178Theorem FATOU:
14179   !f:num->real->real g s t B.
14180        negligible t /\
14181        (!n. (f n) integrable_on s) /\
14182        (!n x. x IN s DIFF t ==> &0 <= (f n x)) /\
14183        (!x. x IN s DIFF t ==> ((\n. f n x) --> g x) sequentially) /\
14184        (!n. (integral s (f n)) <= B)
14185        ==> g integrable_on s /\
14186            &0 <= (integral s g) /\ (integral s g) <= B
14187Proof
14188  REPEAT GEN_TAC THEN STRIP_TAC THEN
14189  ABBREV_TAC
14190   ``h = \n x. (inf {((f:num->real->real) j x) | n <= j})`` THEN
14191  MP_TAC((GEN ``m:num``
14192   (ISPECL [``\k:num x:real. (inf {(f j x) | j IN {m..m+k}})``,
14193            ``(h:num->real->real) m``,
14194            ``s:real->bool``, ``t:real->bool``]
14195           MONOTONE_CONVERGENCE_DECREASING_AE))) THEN
14196  ASM_SIMP_TAC std_ss [] THEN
14197  KNOW_TAC ``!(m :num).
14198   (!(k :num).
14199      (\(x :real).
14200         inf
14201           {(f :num -> real -> real) j x |
14202            j IN {m .. m + k}}) integrable_on (s :real -> bool)) /\
14203   (!(k :num) (x :real).
14204      x IN s DIFF (t :real -> bool) ==>
14205      inf {f j x | j IN {m .. m + SUC k}} <=
14206      inf {f j x | j IN {m .. m + k}}) /\
14207   (!(x :real).
14208      x IN s DIFF t ==>
14209      (((\(k :num). inf {f j x | j IN {m .. m + k}}) -->
14210        (h :num -> real -> real) m x) sequentially :bool)) /\
14211   (bounded
14212      {integral s (\(x :real). inf {f j x | j IN {m .. m + k}}) |
14213       k IN univ((:num) :num itself)} :bool)`` THENL
14214   [X_GEN_TAC ``m:num`` THEN EXPAND_TAC "h" THEN SIMP_TAC std_ss [] THEN
14215    REPEAT CONJ_TAC THENL
14216     [GEN_TAC THEN MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_IMP_INTEGRABLE THEN
14217      SIMP_TAC real_ss [GSYM IMAGE_DEF] THEN
14218      REWRITE_TAC [METIS [] ``(\x. inf (IMAGE (\j. f j x) {m .. k + m})) =
14219                    (\x. inf (IMAGE ((\x. (\j. f j x)) x) {m .. k + m}))``] THEN
14220      MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_INF THEN
14221      SIMP_TAC std_ss [FINITE_NUMSEG, NUMSEG_EMPTY, NOT_LESS, LE_ADD] THEN
14222      ASM_SIMP_TAC std_ss [METIS [ETA_AX] ``(\x. f i x) = f i``] THEN
14223      REPEAT STRIP_TAC THEN
14224      MATCH_MP_TAC NONNEGATIVE_ABSOLUTELY_INTEGRABLE_AE THEN
14225      EXISTS_TAC ``t:real->bool`` THEN
14226      ASM_SIMP_TAC std_ss [IMP_CONJ, RIGHT_FORALL_IMP_THM] THEN
14227      ASM_SIMP_TAC std_ss [AND_IMP_INTRO],
14228      REPEAT STRIP_TAC THEN SIMP_TAC real_ss [GSYM IMAGE_DEF] THEN
14229      MATCH_MP_TAC REAL_LE_INF_SUBSET THEN
14230      SIMP_TAC std_ss [IMAGE_EQ_EMPTY, NUMSEG_EMPTY, NOT_LESS, LE_ADD] THEN
14231      CONJ_TAC THENL
14232       [MATCH_MP_TAC IMAGE_SUBSET THEN
14233        REWRITE_TAC[SUBSET_NUMSEG] THEN ARITH_TAC,
14234        ALL_TAC] THEN
14235      SIMP_TAC std_ss [FORALL_IN_IMAGE] THEN
14236      ONCE_REWRITE_TAC [METIS []
14237       ``b <= f j x <=> (b <= (\j. (f:num->real->real) j x) j)``] THEN
14238      MATCH_MP_TAC LOWER_BOUND_FINITE_SET_REAL THEN
14239      REWRITE_TAC[FINITE_NUMSEG],
14240      X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN
14241      REWRITE_TAC[LIM_SEQUENTIALLY] THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
14242      REWRITE_TAC[dist] THEN
14243      MP_TAC(SPEC ``{((f:num->real->real) j x) | m <= j}`` INF) THEN
14244      ABBREV_TAC ``i = inf {((f:num->real->real) j x) | m <= j}`` THEN
14245      REWRITE_TAC [METIS [SIMPLE_IMAGE_GEN] ``{(f:num->real->real) j x | m <= j} =
14246                                                  IMAGE (\j. f j x) {j | m <= j}``] THEN
14247      SIMP_TAC std_ss [FORALL_IN_IMAGE, EXISTS_IN_IMAGE, IMAGE_EQ_EMPTY] THEN
14248      SIMP_TAC std_ss [GSPECIFICATION, EXTENSION, NOT_IN_EMPTY] THEN
14249      KNOW_TAC ``(?x. m <= x) /\ (?b. !j. m <= j ==>
14250                 b <= (f:num->real->real) j x)`` THENL
14251      [ASM_MESON_TAC[LESS_EQ_REFL],
14252       DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
14253      DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC (MP_TAC o SPEC ``i + e:real``)) THEN
14254      ASM_SIMP_TAC std_ss [REAL_ARITH ``&0 < e ==> ~(i + e <= i:real)``] THEN
14255      SIMP_TAC std_ss [NOT_FORALL_THM, NOT_IMP, REAL_NOT_LE] THEN
14256      DISCH_THEN (X_CHOOSE_TAC ``N:num``) THEN EXISTS_TAC ``N:num`` THEN
14257      X_GEN_TAC ``n:num`` THEN DISCH_TAC THEN
14258      REWRITE_TAC [METIS [SIMPLE_IMAGE_GEN] ``{(f:num->real->real) j x | j IN s} =
14259                                                  IMAGE (\j. f j x) {j | j IN s}``] THEN
14260      UNDISCH_TAC ``m <= N /\ (f:num->real->real) N x < i + e`` THEN STRIP_TAC THEN
14261      FIRST_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
14262       ``y < i + e ==> i <= ix /\ ix <= y ==> abs(ix - i) < e:real``)) THEN
14263      CONJ_TAC THENL
14264       [EXPAND_TAC "i" THEN MATCH_MP_TAC REAL_LE_INF_SUBSET THEN
14265        SIMP_TAC real_ss [IMAGE_EQ_EMPTY, SET_RULE ``{x | x IN s} = s``] THEN
14266        REWRITE_TAC[NUMSEG_EMPTY, NOT_LESS, LE_ADD] THEN
14267        REWRITE_TAC [METIS [SIMPLE_IMAGE_GEN]
14268        ``{(f:num->real->real) j x | m <= j} =
14269          IMAGE (\j. f j x) {j | m <= j}``] THEN
14270        CONJ_TAC THENL
14271         [MATCH_MP_TAC IMAGE_SUBSET THEN
14272          SIMP_TAC std_ss [SUBSET_DEF, IN_NUMSEG, GSPECIFICATION] THEN ARITH_TAC,
14273          SIMP_TAC std_ss [FORALL_IN_IMAGE, GSPECIFICATION] THEN ASM_MESON_TAC[]],
14274        ALL_TAC] THEN
14275      W(MP_TAC o C SPEC INF o rand o lhand o snd) THEN
14276      KNOW_TAC ``IMAGE (\(j :num). (f :num -> real -> real) j (x :real))
14277       {j | j IN {m .. m + n}} <> ({} :real -> bool) /\
14278       (?(b :real). !(x' :real).
14279        x' IN IMAGE (\(j :num). f j x) {j | j IN {m..m + n}} ==>
14280        b <= x')`` THENL
14281       [SIMP_TAC std_ss [IMAGE_EQ_EMPTY, SET_RULE ``{x | x IN s} = s``] THEN
14282        REWRITE_TAC[NUMSEG_EMPTY, NOT_LESS, LE_ADD] THEN
14283        SIMP_TAC std_ss [FORALL_IN_IMAGE, GSPECIFICATION] THEN
14284        EXISTS_TAC ``i:real`` THEN GEN_TAC THEN REWRITE_TAC[IN_NUMSEG] THEN
14285        DISCH_THEN(fn th => FIRST_ASSUM MATCH_MP_TAC THEN MP_TAC th) THEN
14286        ARITH_TAC,
14287        DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
14288      SIMP_TAC std_ss [FORALL_IN_IMAGE] THEN
14289      DISCH_THEN(MATCH_MP_TAC o CONJUNCT1) THEN
14290      SIMP_TAC std_ss [GSPECIFICATION, IN_NUMSEG] THEN
14291      ASM_SIMP_TAC arith_ss [],
14292      REWRITE_TAC[bounded_def] THEN EXISTS_TAC ``B:real`` THEN
14293      SIMP_TAC std_ss [FORALL_IN_GSPEC, IN_UNIV] THEN
14294      X_GEN_TAC ``n:num`` THEN
14295      MATCH_MP_TAC(REAL_ARITH ``&0 <= x /\ x <= b ==> abs(x) <= b:real``) THEN
14296      CONJ_TAC THENL
14297       [MATCH_MP_TAC INTEGRAL_DROP_POS_AE THEN
14298        EXISTS_TAC ``t:real->bool`` THEN ASM_REWRITE_TAC[] THEN
14299        CONJ_TAC THENL
14300         [ALL_TAC,
14301          REPEAT STRIP_TAC THEN SIMP_TAC std_ss [] THEN MATCH_MP_TAC REAL_LE_INF THEN
14302          ASM_SIMP_TAC real_ss [GSYM IMAGE_DEF, FORALL_IN_IMAGE, IMAGE_EQ_EMPTY] THEN
14303         SIMP_TAC std_ss [NUMSEG_EMPTY, NOT_LESS, LE_ADD]],
14304       MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC
14305          ``(integral s ((f:num->real->real) m))`` THEN
14306        ASM_REWRITE_TAC[] THEN MATCH_MP_TAC INTEGRAL_DROP_LE THEN
14307        ASM_SIMP_TAC std_ss [] THEN CONJ_TAC THENL
14308         [ALL_TAC,
14309          SIMP_TAC real_ss [REAL_INF_LE_FINITE, GSYM IMAGE_DEF,
14310                   IMAGE_FINITE, IMAGE_EQ_EMPTY, FINITE_NUMSEG, IN_NUMSEG,
14311                   NUMSEG_EMPTY, NOT_LESS, LE_ADD, EXISTS_IN_IMAGE] THEN
14312          MESON_TAC[REAL_LE_REFL, LESS_EQ_REFL, LE_ADD]]] THEN
14313      MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_IMP_INTEGRABLE THEN
14314      SIMP_TAC real_ss [GSYM IMAGE_DEF] THEN
14315      REWRITE_TAC [METIS [] ``(\x. inf (IMAGE (\j. f j x) {m .. m + n})) =
14316                    (\x. inf (IMAGE ((\x. (\j. f j x)) x) {m .. m + n}))``] THEN
14317      MATCH_MP_TAC ABSOLUTELY_INTEGRABLE_INF THEN
14318      SIMP_TAC std_ss [FINITE_NUMSEG, NUMSEG_EMPTY, NOT_LESS, LE_ADD] THEN
14319      ASM_SIMP_TAC std_ss [METIS [ETA_AX] ``(\x. f i x) = f i``] THEN
14320      REPEAT STRIP_TAC THEN
14321      MATCH_MP_TAC NONNEGATIVE_ABSOLUTELY_INTEGRABLE_AE THEN
14322      EXISTS_TAC ``t:real->bool`` THEN
14323      ASM_SIMP_TAC std_ss [IMP_CONJ, RIGHT_FORALL_IMP_THM] THEN
14324      ASM_REWRITE_TAC[AND_IMP_INTRO]], ALL_TAC] THEN
14325    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
14326    REWRITE_TAC[FORALL_AND_THM] THEN STRIP_TAC THEN
14327  MP_TAC(ISPECL [``h:num->real->real``, ``g:real->real``,
14328                 ``s:real->bool``, ``t:real->bool``]
14329    MONOTONE_CONVERGENCE_INCREASING_AE) THEN
14330  ASM_SIMP_TAC std_ss [] THEN
14331  SUBGOAL_THEN
14332   ``!n. &0 <= (integral s ((h:num->real->real) n)) /\
14333        (integral s ((h:num->real->real) n)) <= B``
14334  MP_TAC THENL
14335   [X_GEN_TAC ``m:num`` THEN CONJ_TAC THENL
14336     [MATCH_MP_TAC INTEGRAL_DROP_POS_AE THEN
14337      EXISTS_TAC ``t:real->bool`` THEN ASM_SIMP_TAC std_ss [] THEN
14338      EXPAND_TAC "h" THEN SIMP_TAC std_ss [] THEN
14339      REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_INF THEN
14340      REWRITE_TAC [METIS [SIMPLE_IMAGE_GEN] ``{(f:num->real->real) j x | m <= j} =
14341                                                  IMAGE (\j. f j x) {j | m <= j}``] THEN
14342      ASM_SIMP_TAC std_ss [FORALL_IN_IMAGE, IMAGE_EQ_EMPTY] THEN
14343      SIMP_TAC std_ss [EXTENSION, GSPECIFICATION, NOT_IN_EMPTY] THEN
14344      MESON_TAC[LESS_EQ_REFL],
14345      MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC
14346        ``(integral s ((f:num->real->real) m))`` THEN
14347      ASM_REWRITE_TAC[] THEN MATCH_MP_TAC INTEGRAL_LE_AE THEN
14348      EXISTS_TAC ``t:real->bool`` THEN ASM_REWRITE_TAC[] THEN
14349      REPEAT STRIP_TAC THEN EXPAND_TAC "h" THEN
14350      GEN_REWR_TAC RAND_CONV [GSYM INF_SING] THEN
14351      MATCH_MP_TAC  REAL_LE_INF_SUBSET THEN
14352      SIMP_TAC std_ss [NOT_INSERT_EMPTY, SING_SUBSET, FORALL_IN_GSPEC] THEN
14353      CONJ_TAC THENL [SIMP_TAC std_ss [GSPECIFICATION], ASM_MESON_TAC[]] THEN
14354      MESON_TAC[LESS_EQ_REFL, REAL_LE_REFL]],
14355    SIMP_TAC std_ss [FORALL_AND_THM] THEN STRIP_TAC] THEN
14356  KNOW_TAC ``(!(k :num) (x :real).
14357    x IN (s :real -> bool) DIFF (t :real -> bool) ==>
14358    (h :num -> real -> real) k x <= h (SUC k) x) /\
14359 (!(x :real).
14360    x IN s DIFF t ==>
14361    (((\(k :num). h k x) --> (g :real -> real) x) sequentially :
14362       bool)) /\
14363 (bounded {integral s (h k) | k IN univ((:num) :num itself)} :bool)`` THENL
14364   [REPEAT CONJ_TAC THENL
14365     [REPEAT STRIP_TAC THEN EXPAND_TAC "h" THEN SIMP_TAC std_ss [] THEN
14366      MATCH_MP_TAC REAL_LE_INF_SUBSET THEN
14367      REWRITE_TAC [METIS [SIMPLE_IMAGE_GEN] ``{(f:num->real->real) j x | m <= j} =
14368                                                  IMAGE (\j. f j x) {j | m <= j}``] THEN
14369      SIMP_TAC std_ss [FORALL_IN_IMAGE, IMAGE_EQ_EMPTY, FORALL_IN_GSPEC] THEN
14370      SIMP_TAC std_ss [EXTENSION, GSPECIFICATION, NOT_IN_EMPTY, NOT_LESS_EQUAL] THEN
14371      REPEAT CONJ_TAC THENL
14372       [EXISTS_TAC ``k + 1:num`` THEN SIMP_TAC arith_ss [],
14373        MATCH_MP_TAC IMAGE_SUBSET THEN
14374        SIMP_TAC std_ss [SUBSET_DEF, GSPECIFICATION] THEN
14375        SIMP_TAC arith_ss [ADD1, IN_IMAGE] THEN GEN_TAC THEN
14376        STRIP_TAC THEN EXISTS_TAC ``j:num`` THEN
14377        FULL_SIMP_TAC std_ss [GSPECIFICATION] THEN POP_ASSUM MP_TAC THEN
14378        ARITH_TAC,
14379        ASM_MESON_TAC[]],
14380      X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN
14381      FIRST_X_ASSUM(MP_TAC o SPEC ``x:real``) THEN
14382      ASM_REWRITE_TAC[LIM_SEQUENTIALLY] THEN DISCH_TAC THEN
14383      X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
14384      FIRST_X_ASSUM(MP_TAC o SPEC ``e / &2:real``) THEN
14385      ASM_REWRITE_TAC[REAL_HALF] THEN DISCH_THEN (X_CHOOSE_TAC ``N:num``) THEN
14386      EXISTS_TAC ``N:num`` THEN POP_ASSUM MP_TAC THEN
14387      REWRITE_TAC[dist] THEN REPEAT STRIP_TAC THEN
14388      KNOW_TAC ``!h g. &0 < e /\ g - e / &2 <= h /\ h <= g + e / &2 ==>
14389                                                abs(h - g) < e:real`` THENL
14390      [ONCE_REWRITE_TAC [REAL_ARITH ``a - b <= c <=> a - c <= b:real``,
14391                         REAL_ARITH ``a <= b + c <=> a - b <= c:real``] THEN
14392       SIMP_TAC std_ss [REAL_LE_LDIV_EQ, REAL_LE_RDIV_EQ, REAL_ARITH ``0 < 2:real``] THEN
14393       REAL_ARITH_TAC, DISCH_TAC] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
14394      ASM_SIMP_TAC std_ss [] THEN EXPAND_TAC "h" THEN SIMP_TAC std_ss [] THEN
14395      MATCH_MP_TAC REAL_INF_BOUNDS THEN SIMP_TAC std_ss [FORALL_IN_GSPEC] THEN
14396      SIMP_TAC std_ss [SET_RULE ``({f n | P n} = {}) <=> !n. ~P n``] THEN
14397      CONJ_TAC THENL [MESON_TAC[LESS_EQ_REFL], GEN_TAC THEN DISCH_TAC] THEN
14398      KNOW_TAC ``!h g. abs(h - g) < e / &2 ==>
14399                    g - e / &2 <= h /\ h <= g + e / &2:real`` THENL
14400      [ONCE_REWRITE_TAC [REAL_ARITH ``a - b <= c <=> a - c <= b:real``,
14401                         REAL_ARITH ``a <= b + c <=> a - b <= c:real``] THEN
14402       SIMP_TAC std_ss [REAL_LE_LDIV_EQ, REAL_LE_RDIV_EQ, REAL_LT_RDIV_EQ,
14403                         REAL_ARITH ``0 < 2:real``] THEN REAL_ARITH_TAC,
14404      DISCH_TAC] THEN
14405      FIRST_X_ASSUM MATCH_MP_TAC THEN METIS_TAC[LESS_EQ_TRANS],
14406      SIMP_TAC std_ss [bounded_def, FORALL_IN_GSPEC] THEN EXISTS_TAC ``B:real`` THEN
14407      REPEAT STRIP_TAC THEN REWRITE_TAC[] THEN
14408      MATCH_MP_TAC(REAL_ARITH ``&0 <= x /\ x <= b ==> abs x <= b:real``) THEN
14409      ASM_REWRITE_TAC[]],
14410    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
14411    STRIP_TAC THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
14412     [MATCH_MP_TAC(ISPEC ``sequentially`` LIM_DROP_LBOUND),
14413      MATCH_MP_TAC(ISPEC ``sequentially`` LIM_DROP_UBOUND)] THEN
14414    EXISTS_TAC ``\n. integral s ((h:num->real->real) n)`` THEN
14415    ASM_SIMP_TAC real_ss [TRIVIAL_LIMIT_SEQUENTIALLY, EVENTUALLY_TRUE]]
14416QED
14417
14418(* ------------------------------------------------------------------------- *)
14419(* Fundamental theorem of calculus, starting with strong forms.   12023      *)
14420(* ------------------------------------------------------------------------- *)
14421
14422Theorem FUNDAMENTAL_THEOREM_OF_CALCULUS_STRONG:
14423   !f:real->real f' s a b.
14424        COUNTABLE s /\
14425        a <= b /\ f continuous_on interval[a,b] /\
14426        (!x. x IN interval[a,b] DIFF s
14427             ==> (f has_vector_derivative f'(x)) (at x within interval[a,b]))
14428        ==> (f' has_integral (f(b) - f(a))) (interval[a,b])
14429Proof
14430  REPEAT STRIP_TAC THEN
14431  MATCH_MP_TAC HAS_INTEGRAL_SPIKE THEN
14432  EXISTS_TAC ``(\x. if x IN s then 0 else f' x):real->real`` THEN
14433  EXISTS_TAC ``s:real->bool`` THEN
14434  ASM_SIMP_TAC std_ss [NEGLIGIBLE_COUNTABLE, IN_DIFF] THEN
14435  SUBGOAL_THEN
14436   ``?f t. (s = IMAGE (f:num->real) t) /\
14437          (!m n. m IN t /\ n IN t /\ (f m = f n) ==> (m = n))``
14438  MP_TAC THENL
14439   [ASM_CASES_TAC ``FINITE(s:real->bool)`` THENL
14440     [FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [FINITE_INDEX_NUMSEG]) THEN
14441      ASM_MESON_TAC[],
14442      MP_TAC(ISPEC ``s:real->bool`` COUNTABLE_AS_INJECTIVE_IMAGE) THEN
14443      ASM_REWRITE_TAC[] THEN MESON_TAC[IN_UNIV]],
14444    SIMP_TAC std_ss [LEFT_IMP_EXISTS_THM, INJECTIVE_ON_LEFT_INVERSE] THEN
14445    MAP_EVERY X_GEN_TAC [``r:num->real``, ``t:num->bool``] THEN
14446    DISCH_THEN(CONJUNCTS_THEN2 SUBST_ALL_TAC MP_TAC) THEN
14447    DISCH_THEN(X_CHOOSE_TAC ``n:real->num``)] THEN
14448  REWRITE_TAC[HAS_INTEGRAL_FACTOR_CONTENT] THEN
14449  X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
14450  SUBGOAL_THEN
14451   ``!x. ?d. &0 < d /\
14452            (x IN interval[a,b]
14453             ==> (x IN IMAGE (r:num->real) t
14454                  ==> !y. abs(y - x) < d /\ y IN interval[a,b]
14455                          ==> abs(f y - f x)
14456                              <= e / &2 pow (4 + n x) * abs(b - a)) /\
14457                 (~(x IN IMAGE r t)
14458                  ==> !y. abs(y - x) < d /\ y IN interval[a,b]
14459                          ==> abs(f y - f x - (y - x) * f' x:real)
14460                                <= e / &2 * abs(y - x)))``
14461  MP_TAC THENL
14462  [ (* goal 1 (of 2) *)
14463    X_GEN_TAC ``x:real`` THEN
14464    ASM_CASES_TAC ``(x:real) IN interval[a,b]`` THENL
14465     [ALL_TAC, EXISTS_TAC ``&1:real`` THEN ASM_REWRITE_TAC[REAL_LT_01]] THEN
14466    ASM_CASES_TAC ``x IN IMAGE (r:num->real) t`` THEN ASM_REWRITE_TAC[] THENL
14467    [ (* goal 1.1 (of 2) *)
14468      FIRST_ASSUM(MP_TAC o MATCH_MP (REAL_ARITH
14469       ``a <= b ==> (a = b:real) \/ a < b``)) THEN
14470      REWRITE_TAC[] THEN STRIP_TAC THENL
14471      [ (* goal 1.1.1 (of 2) *)
14472        EXISTS_TAC ``&1:real`` THEN REWRITE_TAC[REAL_LT_01] THEN
14473        UNDISCH_TAC ``(x:real) IN interval[a,b]`` THEN
14474        ASM_SIMP_TAC std_ss [INTERVAL_SING, IN_SING, REAL_SUB_REFL, ABS_0] THEN
14475        REAL_ARITH_TAC,
14476        (* goal 1.1.2 (of 2) *)
14477        UNDISCH_TAC ``f continuous_on interval [(a,b)]`` THEN DISCH_TAC THEN
14478        FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [continuous_on]) THEN
14479        DISCH_THEN(MP_TAC o SPEC ``x:real``) THEN ASM_REWRITE_TAC[dist] THEN
14480        DISCH_THEN(MP_TAC o SPEC
14481         ``e / &2 pow (4 + n(x:real)) * abs(b - a:real)``) THEN
14482        ASM_SIMP_TAC std_ss [REAL_LT_DIV, REAL_LT_MUL, GSYM ABS_NZ, REAL_SUB_0,
14483                     REAL_LT_POW2, REAL_LT_IMP_NE] THEN
14484        MESON_TAC[REAL_LT_IMP_LE] ],
14485      FIRST_X_ASSUM(MP_TAC o SPEC ``x:real``) THEN
14486      ASM_SIMP_TAC std_ss [IN_DIFF, has_vector_derivative,
14487                      HAS_DERIVATIVE_WITHIN_ALT] THEN
14488      DISCH_THEN(MP_TAC o SPEC ``e / &2:real`` o CONJUNCT2) THEN
14489      ASM_REWRITE_TAC[REAL_HALF] THEN MESON_TAC[] ],
14490    (* goal 2 (of 2) *)
14491    DISCH_TAC THEN POP_ASSUM (MP_TAC o SIMP_RULE std_ss [RIGHT_IMP_EXISTS_THM]) THEN
14492    SIMP_TAC std_ss [SKOLEM_THM, LEFT_IMP_EXISTS_THM, FORALL_AND_THM, AND_IMP_INTRO,
14493                TAUT `p ==> q /\ r <=> (p ==> q) /\ (p ==> r)`] THEN
14494    X_GEN_TAC ``d:real->real`` THEN
14495    DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
14496    DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC ASSUME_TAC) ] THEN
14497
14498  EXISTS_TAC ``\x. ball(x:real,d(x))`` THEN
14499  ASM_SIMP_TAC std_ss [GAUGE_BALL_DEPENDENT] THEN
14500  X_GEN_TAC ``p:(real#(real->bool))->bool`` THEN STRIP_TAC THEN
14501  MP_TAC(ISPECL [``f:real->real``, ``p:(real#(real->bool))->bool``,
14502                 ``a:real``, ``b:real``]
14503                ADDITIVE_TAGGED_DIVISION_1) THEN
14504  ASM_SIMP_TAC std_ss [CONTENT_CLOSED_INTERVAL] THEN DISCH_THEN(SUBST1_TAC o SYM) THEN
14505  UNDISCH_TAC ``p tagged_division_of interval [(a,b)]`` THEN DISCH_TAC THEN
14506  FIRST_ASSUM(ASSUME_TAC o MATCH_MP TAGGED_DIVISION_OF_FINITE) THEN
14507  ASM_SIMP_TAC std_ss [GSYM SUM_SUB, LAMBDA_PROD] THEN
14508  SUBGOAL_THEN
14509   ``p:(real#(real->bool))->bool =
14510    {(x,k) | (x,k) IN p /\ x IN IMAGE r (t:num->bool)} UNION
14511    {(x,k) | (x,k) IN p /\ ~(x IN IMAGE r (t:num->bool))}``
14512  SUBST1_TAC THENL
14513   [SIMP_TAC std_ss [EXTENSION, FORALL_PROD, IN_ELIM_PAIR_THM, IN_UNION] THEN
14514    MESON_TAC[],
14515    ALL_TAC] THEN
14516  W(MP_TAC o PART_MATCH (lhs o rand) SUM_UNION o rand o lhand o snd) THEN
14517  KNOW_TAC ``FINITE
14518       {(x,k) |
14519        (x,k) IN (p :real # (real -> bool) -> bool) /\
14520        x IN IMAGE (r :num -> real) (t :num -> bool)} /\
14521     FINITE {(x,k) | (x,k) IN p /\ x NOTIN IMAGE r t} /\
14522     DISJOINT {(x,k) | (x,k) IN p /\ x IN IMAGE r t}
14523       {(x,k) | (x,k) IN p /\ x NOTIN IMAGE r t}`` THENL
14524   [REWRITE_TAC[SET_RULE ``DISJOINT s t <=> !x. x IN s ==> ~(x IN t)``] THEN
14525    SIMP_TAC std_ss [FORALL_IN_GSPEC, IN_ELIM_PAIR_THM] THEN CONJ_TAC THEN
14526    MATCH_MP_TAC FINITE_SUBSET THEN
14527    EXISTS_TAC ``p:(real#(real->bool))->bool`` THEN
14528    ASM_SIMP_TAC std_ss [SUBSET_DEF, FORALL_IN_GSPEC, IN_ELIM_PAIR_THM],
14529    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
14530    DISCH_THEN SUBST1_TAC] THEN
14531  SUBGOAL_THEN
14532   ``(!P. FINITE {(x:real,k:real->bool) | (x,k) IN p /\ P x k}) /\
14533     (!P x. FINITE {(x:real,k:real->bool) |k| (x,k) IN p /\ P x k})``
14534  STRIP_ASSUME_TAC THENL
14535   [REPEAT STRIP_TAC THEN MATCH_MP_TAC FINITE_SUBSET THEN
14536    EXISTS_TAC ``p:real#(real->bool)->bool`` THEN
14537    ASM_SIMP_TAC std_ss [SUBSET_DEF, FORALL_IN_GSPEC],
14538    ALL_TAC] THEN
14539  KNOW_TAC ``!x y e a. abs(x:real) <= e / &2 * a /\ abs(y) <= e / &2 * a
14540             ==> abs(x + y) <= e * a`` THENL
14541 [REPEAT GEN_TAC THEN REWRITE_TAC [real_div] THEN
14542  ONCE_REWRITE_TAC [REAL_ARITH ``a * b * c = (a * c) * b:real``] THEN
14543  REWRITE_TAC [GSYM real_div] THEN
14544  SIMP_TAC std_ss [REAL_LE_RDIV_EQ, REAL_ARITH ``0 < &2:real``] THEN
14545  REAL_ARITH_TAC, DISCH_TAC] THEN
14546  FIRST_X_ASSUM (MATCH_MP_TAC) THEN
14547  CONJ_TAC THENL
14548   [MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC
14549     ``abs(sum {(x,k) | (x,k) IN p /\ x IN IMAGE (r:num->real) t /\
14550                         ~(content k = &0)}
14551                (\(x,k). -(f(interval_upperbound k) -
14552                            (f:real->real)(interval_lowerbound k))))`` THEN
14553    CONJ_TAC THENL
14554     [MATCH_MP_TAC REAL_EQ_IMP_LE THEN AP_TERM_TAC THEN
14555      MATCH_MP_TAC SUM_EQ_SUPERSET THEN
14556      ASM_SIMP_TAC std_ss [FORALL_IN_GSPEC, IMP_CONJ] THEN
14557      CONJ_TAC THENL [SIMP_TAC std_ss [LAMBDA_PAIR] THEN SET_TAC[], ALL_TAC] THEN
14558      SIMP_TAC std_ss [REAL_ARITH ``a * 0 - x:real = -x``] THEN
14559      SIMP_TAC std_ss [IN_ELIM_PAIR_THM] THEN
14560      MAP_EVERY X_GEN_TAC [``x:real``, ``k:real->bool``] THEN DISCH_TAC THEN
14561      SUBGOAL_THEN ``?u v:real. (k = interval[u,v]) /\ x IN interval[u,v]``
14562      STRIP_ASSUME_TAC THENL
14563       [ASM_MESON_TAC[TAGGED_DIVISION_OF], ALL_TAC] THEN
14564      ASM_REWRITE_TAC[CONTENT_EQ_0] THEN
14565      FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [IN_INTERVAL]) THEN
14566      DISCH_THEN(MP_TAC o MATCH_MP REAL_LE_TRANS) THEN
14567      SIMP_TAC std_ss [INTERVAL_LOWERBOUND, INTERVAL_UPPERBOUND,
14568               GSYM INTERVAL_EQ_EMPTY, REAL_NOT_LE, REAL_NOT_LT] THEN
14569      REPEAT STRIP_TAC THEN MATCH_MP_TAC(REAL_ARITH
14570       ``(x:real = y) ==> (-(x - y) = 0)``) THEN
14571      AP_TERM_TAC THEN ASM_SIMP_TAC std_ss [GSYM REAL_LE_ANTISYM],
14572      ALL_TAC] THEN
14573    MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC
14574     ``sum {(x,k:real->bool) | (x,k) IN p /\ x IN IMAGE (r:num->real) t /\
14575                                ~(content k = &0)}
14576          ((\(x,k). e / &2 pow (3 + n x) * abs (b - a:real)))`` THEN
14577    CONJ_TAC THENL
14578     [MATCH_MP_TAC SUM_ABS_LE THEN
14579      ASM_SIMP_TAC std_ss [FORALL_IN_GSPEC, IMP_CONJ] THEN
14580      MAP_EVERY X_GEN_TAC [``x:real``, ``k:real->bool``] THEN DISCH_TAC THEN
14581      SUBGOAL_THEN ``?u v:real. (k = interval[u,v]) /\ x IN interval[u,v]``
14582      MP_TAC THENL [ASM_MESON_TAC[TAGGED_DIVISION_OF], ALL_TAC] THEN
14583      DISCH_THEN(REPEAT_TCL CHOOSE_THEN
14584        (CONJUNCTS_THEN2 SUBST_ALL_TAC MP_TAC)) THEN
14585      SIMP_TAC std_ss [CONTENT_EQ_0, REAL_NOT_LE, REAL_LT_IMP_LE, IN_INTERVAL,
14586               INTERVAL_LOWERBOUND, INTERVAL_UPPERBOUND] THEN
14587      REPEAT STRIP_TAC THEN
14588      UNDISCH_TAC ``!(x :real).
14589            x IN interval [((a :real),(b :real))] /\
14590            x IN IMAGE (r :num -> real) (t :num -> bool) ==>
14591            !(y :real).
14592              abs (y - x) < (d :real -> real) x /\ y IN interval [(a,b)] ==>
14593              abs ((f :real -> real) y - f x) <=
14594              (e :real) / (2 :real) pow ( 4n + (n :real -> num) x) *
14595              abs (b - a)`` THEN DISCH_TAC THEN
14596      FIRST_X_ASSUM (MP_TAC o SPEC ``x:real``) THEN
14597      KNOW_TAC ``(x :real) IN interval [((a :real),(b :real))] /\
14598                  x IN IMAGE (r :num -> real) (t :num -> bool)`` THENL
14599       [ASM_MESON_TAC[TAGGED_DIVISION_OF, SUBSET_DEF],
14600        DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
14601      DISCH_THEN(fn th =>
14602        MP_TAC(ISPEC ``u:real`` th) THEN MP_TAC(ISPEC ``v:real`` th)) THEN
14603      UNDISCH_TAC ``(\x. ball (x,d x)) FINE p`` THEN DISCH_TAC THEN
14604      FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [FINE]) THEN BETA_TAC THEN
14605      DISCH_THEN(MP_TAC o SPECL [``x:real``, ``interval[u:real,v]``]) THEN
14606      ASM_REWRITE_TAC[SUBSET_DEF, IN_BALL] THEN
14607      DISCH_THEN(fn th =>
14608        MP_TAC(ISPEC ``u:real`` th) THEN MP_TAC(ISPEC ``v:real`` th)) THEN
14609      ASM_REWRITE_TAC[dist, ENDS_IN_INTERVAL, INTERVAL_NE_EMPTY] THEN
14610      ASM_SIMP_TAC std_ss [REAL_LT_IMP_LE, ABS_SUB] THEN DISCH_TAC THEN DISCH_TAC THEN
14611      SUBGOAL_THEN ``interval[u:real,v] SUBSET interval[a,b]`` ASSUME_TAC THENL
14612       [ASM_MESON_TAC[TAGGED_DIVISION_OF], ALL_TAC] THEN
14613      KNOW_TAC ``v IN interval [(a,b)]`` THENL
14614      [ASM_MESON_TAC[ENDS_IN_INTERVAL, SUBSET_DEF, INTERVAL_NE_EMPTY,
14615                      REAL_LT_IMP_LE],
14616       DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
14617        ONCE_REWRITE_TAC[TAUT `p ==> q ==> r <=> q ==> p ==> r`]] THEN
14618      KNOW_TAC ``u IN interval [(a,b)]`` THENL
14619      [ASM_MESON_TAC[ENDS_IN_INTERVAL, SUBSET_DEF, INTERVAL_NE_EMPTY,
14620                      REAL_LT_IMP_LE],
14621       DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
14622        ONCE_REWRITE_TAC[TAUT `p ==> q ==> r <=> q ==> p ==> r`]] THEN
14623      SIMP_TAC std_ss [REAL_POW_ADD, real_div, REAL_INV_MUL] THEN
14624      ONCE_REWRITE_TAC [REAL_ARITH ``a * b * c = (a * c) * b:real``] THEN
14625      REWRITE_TAC [GSYM real_div] THEN
14626      SIMP_TAC std_ss [REAL_LE_RDIV_EQ,
14627       METIS [REAL_LT_MUL, REAL_LT_POW2] ``0:real < (2 pow 3 * 2 pow n x)``,
14628       METIS [REAL_LT_MUL, REAL_LT_POW2] ``0:real < (2 pow 4 * 2 pow n x)``] THEN
14629      ONCE_REWRITE_TAC [ARITH_PROVE ``4 = SUC 3``] THEN ONCE_REWRITE_TAC [pow] THEN
14630      ONCE_REWRITE_TAC [REAL_ARITH ``a * (b * c * d) = (a * c * d) * b:real``] THEN
14631      SIMP_TAC std_ss [GSYM REAL_LE_RDIV_EQ, REAL_ARITH ``0 < 2:real``] THEN
14632      GEN_REWR_TAC (RAND_CONV o RAND_CONV o RAND_CONV) [GSYM REAL_HALF] THEN
14633      DISCH_TAC THEN DISCH_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN
14634      EXISTS_TAC `` abs ((f :real -> real) (v :real) - f (x :real)) *
14635           (2 :real) pow  3n * (2 :real) pow (n :real -> num) x +
14636                   abs ((f :real -> real) (u :real) - f (x :real)) *
14637           (2 :real) pow  3n * (2 :real) pow (n :real -> num) x`` THEN
14638      CONJ_TAC THENL [ALL_TAC, MATCH_MP_TAC REAL_LE_ADD2] THEN
14639          ASM_REWRITE_TAC [] THEN
14640      REWRITE_TAC [GSYM REAL_ADD_RDISTRIB] THEN REWRITE_TAC [REAL_MUL_ASSOC] THEN
14641      MATCH_MP_TAC REAL_LE_RMUL_IMP THEN
14642          SIMP_TAC std_ss [REAL_LE_LT, REAL_LT_POW2] THEN
14643      REWRITE_TAC [GSYM REAL_LE_LT] THEN MATCH_MP_TAC REAL_LE_RMUL_IMP THEN
14644      SIMP_TAC std_ss [REAL_LE_LT, REAL_LT_POW2] THEN
14645          REWRITE_TAC [GSYM REAL_LE_LT] THEN
14646      REAL_ARITH_TAC, ALL_TAC] THEN
14647    MP_TAC(ISPECL
14648     [``FST:real#(real->bool)->real``,
14649      ``\(x:real,k:real->bool). e / &2 pow (3 + n x) * abs (b - a:real)``,
14650      ``{(x:real,k:real->bool) | (x,k) IN p /\ x IN IMAGE (r:num->real) t /\
14651                                ~(content k = &0)}``,
14652      ``IMAGE (r:num->real) t``] SUM_GROUP') THEN
14653    KNOW_TAC ``FINITE
14654       {(x,k) |
14655        (x,k) IN (p :real # (real -> bool) -> bool) /\
14656        x IN IMAGE (r :num -> real) (t :num -> bool) /\
14657        content k <> (0 :real)} /\
14658     IMAGE (FST :real # (real -> bool) -> real)
14659       {(x,k) |
14660        (x,k) IN p /\ x IN IMAGE r t /\ content k <> (0 :real)} SUBSET
14661     IMAGE r t`` THENL
14662     [ASM_SIMP_TAC std_ss [] THEN
14663      SIMP_TAC std_ss [SUBSET_DEF, FORALL_IN_IMAGE, FORALL_IN_GSPEC],
14664      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
14665      DISCH_THEN(SUBST1_TAC o SYM)] THEN
14666    MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC
14667     ``sum (IMAGE (r:num->real) t)
14668          (\x. sum {(x,k:real->bool) |k|
14669                    (x,k) IN p /\ ~(content k = &0)}
14670                   (\yk. e / &2 pow (3 + n x) * abs(b - a:real)))`` THEN
14671    CONJ_TAC THENL
14672     [MATCH_MP_TAC REAL_EQ_IMP_LE THEN MATCH_MP_TAC SUM_EQ THEN
14673      X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN SIMP_TAC std_ss [] THEN
14674      MATCH_MP_TAC SUM_EQ_SUPERSET THEN
14675      ASM_SIMP_TAC std_ss [SUBSET_DEF, FORALL_IN_GSPEC, IMP_CONJ] THEN
14676      SIMP_TAC std_ss [GSPECIFICATION, PAIR_EQ, LAMBDA_PAIR] THEN METIS_TAC[],
14677      ALL_TAC] THEN
14678    ASM_SIMP_TAC std_ss [SUM_CONST] THEN REWRITE_TAC [REAL_MUL_ASSOC] THEN
14679    SIMP_TAC std_ss [SUM_RMUL] THEN
14680    ASM_SIMP_TAC std_ss [abs, REAL_SUB_LE] THEN MATCH_MP_TAC REAL_LE_RMUL_IMP THEN
14681    ASM_SIMP_TAC std_ss [REAL_SUB_LE, REAL_POW_ADD, real_div, REAL_INV_MUL,
14682                         REAL_LT_POW2, REAL_LT_IMP_NE, REAL_MUL_ASSOC] THEN
14683    KNOW_TAC ``!p e n. p * e * inv(&2 pow 3) * n = e / &8 * (p * n):real`` THENL
14684    [REPEAT GEN_TAC THEN REWRITE_TAC [real_div, REAL_MUL_ASSOC] THEN
14685     ONCE_REWRITE_TAC [REAL_ARITH ``a * b * c * d = (a * c * d) * b:real``] THEN
14686     REWRITE_TAC [GSYM real_div] THEN
14687         SIMP_TAC std_ss [REAL_EQ_RDIV_EQ, REAL_ARITH ``0 < 8:real``] THEN
14688     REWRITE_TAC [real_div, REAL_MUL_ASSOC] THEN
14689     ONCE_REWRITE_TAC [REAL_ARITH
14690          ``a * b * c * d * e = (a * c * d * e) * b:real``] THEN
14691     REWRITE_TAC [GSYM real_div] THEN
14692         SIMP_TAC std_ss [REAL_EQ_LDIV_EQ, REAL_LT_POW2] THEN
14693     REWRITE_TAC [ARITH_PROVE ``3 = SUC 2``, pow, POW_2] THEN REAL_ARITH_TAC,
14694     DISCH_TAC THEN ONCE_ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
14695     KNOW_TAC ``!e x. e / &8 * x <= e * inv(&2) <=> e * x <= e * &4:real`` THENL
14696     [REPEAT GEN_TAC THEN REWRITE_TAC [GSYM real_div] THEN
14697      SIMP_TAC std_ss [REAL_LE_RDIV_EQ, REAL_ARITH ``0 < 2:real``] THEN
14698      ONCE_REWRITE_TAC [REAL_ARITH ``a * b * c = b * c * a:real``] THEN
14699      REWRITE_TAC [real_div, REAL_MUL_ASSOC] THEN REWRITE_TAC [GSYM real_div] THEN
14700      SIMP_TAC std_ss [REAL_LE_LDIV_EQ, REAL_ARITH ``0 < 8:real``] THEN
14701          REAL_ARITH_TAC,
14702      DISCH_TAC THEN ASM_SIMP_TAC std_ss [REAL_LE_LMUL, SUM_LMUL] THEN
14703      POP_ASSUM K_TAC] THEN
14704    MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC
14705     ``sum (IMAGE (r:num->real) t INTER
14706           IMAGE (FST:real#(real->bool)->real) p)
14707          (\x. &(CARD {(x,k:real->bool) | k |
14708                      (x,k) IN p /\ ~(content k = &0)}) *
14709               inv(&2 pow n x))`` THEN
14710    CONJ_TAC THENL
14711     [MATCH_MP_TAC REAL_EQ_IMP_LE THEN MATCH_MP_TAC SUM_SUPERSET THEN
14712      SIMP_TAC std_ss [INTER_SUBSET, IMP_CONJ, FORALL_IN_IMAGE] THEN
14713      SIMP_TAC std_ss [IN_INTER, FUN_IN_IMAGE] THEN
14714      SIMP_TAC std_ss [IN_IMAGE, EXISTS_PROD] THEN
14715      REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_ENTIRE] THEN
14716      DISJ1_TAC THEN AP_TERM_TAC THEN
14717      MATCH_MP_TAC(METIS [CARD_EMPTY, CARD_INSERT] ``(s = {}) ==> (CARD s = 0)``) THEN
14718      ASM_SET_TAC[], ALL_TAC] THEN
14719    MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC
14720     ``sum (IMAGE (r:num->real) t INTER
14721           IMAGE (FST:real#(real->bool)->real) p)
14722          (\x. &2 / &2 pow (n x))`` THEN
14723    CONJ_TAC THENL
14724     [MATCH_MP_TAC SUM_LE THEN
14725      ASM_SIMP_TAC std_ss [IMAGE_FINITE, FINITE_INTER] THEN
14726      GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[real_div] THEN
14727      MATCH_MP_TAC REAL_LE_RMUL_IMP THEN
14728      SIMP_TAC std_ss [REAL_LE_INV_EQ, POW_POS, REAL_POS, REAL_OF_NUM_LE] THEN
14729      GEN_REWR_TAC RAND_CONV [GSYM EXP_1] THEN
14730      MATCH_MP_TAC TAGGED_PARTIAL_DIVISION_COMMON_TAGS THEN
14731      ASM_MESON_TAC[tagged_division_of],
14732      ALL_TAC] THEN
14733    SIMP_TAC std_ss [real_div, SUM_LMUL, REAL_ARITH ``&2 * x <= &4 <=> x <= &2:real``,
14734                POW_INV, REAL_ARITH ``2 <> 0:real``] THEN
14735    SUBGOAL_THEN
14736     ``(\x:real. inv (&2) pow n x) = (\n. inv(&2:real) pow n) o n``
14737    SUBST1_TAC THENL [SIMP_TAC std_ss [o_DEF], ALL_TAC] THEN
14738    W(MP_TAC o PART_MATCH (rand o rand) SUM_IMAGE o lhand o snd) THEN
14739    KNOW_TAC ``(!(x :real) (y :real).
14740        x IN
14741        IMAGE (r :num -> real) (t :num -> bool) INTER
14742        IMAGE (FST :real # (real -> bool) -> real)
14743          (p :real # (real -> bool) -> bool) /\
14744        y IN IMAGE r t INTER IMAGE (FST :real # (real -> bool) -> real) p /\
14745        ((n :real -> num) x = n y) ==>
14746        (x = y))`` THENL
14747    [ASM_SET_TAC[], DISCH_TAC THEN ASM_REWRITE_TAC [] THEN
14748     POP_ASSUM K_TAC THEN DISCH_THEN(SUBST1_TAC o SYM)] THEN
14749    SUBGOAL_THEN
14750     ``?m. IMAGE (n:real->num)
14751                (IMAGE (r:num->real) t INTER
14752                IMAGE (FST:real#(real->bool)->real) p) SUBSET { 0n..m}``
14753    STRIP_ASSUME_TAC THENL
14754     [REWRITE_TAC[SUBSET_DEF, IN_NUMSEG, LE_0] THEN
14755      GEN_REWR_TAC (QUANT_CONV o QUANT_CONV o RAND_CONV o LAND_CONV)
14756           [METIS [] ``x = (\x. x) x``] THEN
14757      MATCH_MP_TAC UPPER_BOUND_FINITE_SET THEN
14758      ASM_SIMP_TAC std_ss [IMAGE_FINITE, FINITE_INTER],
14759      ALL_TAC] THEN
14760    MATCH_MP_TAC REAL_LE_TRANS THEN
14761    EXISTS_TAC ``sum{ 0n..m} (\n. inv(&2) pow n)`` THEN CONJ_TAC THENL
14762     [MATCH_MP_TAC SUM_SUBSET THEN
14763      ASM_SIMP_TAC std_ss [IMAGE_FINITE, FINITE_INTER, FINITE_NUMSEG] THEN
14764      SIMP_TAC std_ss [REAL_LE_INV_EQ, POW_POS, REAL_POS] THEN ASM_SET_TAC[],
14765      SIMP_TAC std_ss [SUM_GP, LT, SUB_0] THEN
14766      SIMP_TAC std_ss [METIS [REAL_ARITH ``1 <> 2:real``, REAL_INV_1OVER,
14767          REAL_EQ_LDIV_EQ,  REAL_ARITH ``0 < 2:real``, REAL_MUL_LID]
14768           ``inv 2 <> 1:real``, pow, REAL_INV_1OVER] THEN
14769      SIMP_TAC std_ss [METIS [REAL_HALF_DOUBLE, REAL_EQ_SUB_RADD]
14770          ``1 - 1 / 2 = 1 / 2:real``] THEN
14771      SIMP_TAC std_ss [GSYM pow] THEN
14772      KNOW_TAC ``!x. (&1 - x) / (&1 / &2) <= &2 <=> &0 <= x:real`` THENL
14773      [REPEAT GEN_TAC THEN REWRITE_TAC [real_div, REAL_MUL_ASSOC,
14774           REAL_MUL_LID, REAL_INV_INV] THEN
14775       REAL_ARITH_TAC, DISCH_TAC] THEN
14776      ASM_REWRITE_TAC [] THEN MATCH_MP_TAC POW_POS THEN
14777      SIMP_TAC std_ss [REAL_LE_RDIV_EQ, REAL_ARITH ``0 < 2:real``, REAL_MUL_LZERO,
14778                       REAL_ARITH ``0 <= 1:real``]],
14779    MP_TAC(ISPECL [``\x:real. x``, ``p:(real#(real->bool))->bool``,
14780                   ``a:real``, ``b:real``] ADDITIVE_TAGGED_DIVISION_1) THEN
14781    ASM_SIMP_TAC std_ss [] THEN DISCH_THEN(SUBST1_TAC o SYM) THEN
14782    REWRITE_TAC[GSYM SUM_LMUL] THEN MATCH_MP_TAC REAL_LE_TRANS THEN
14783    EXISTS_TAC
14784     ``sum {(x:real,k:real->bool) |
14785           (x,k) IN p /\ ~(x IN IMAGE r (t:num->bool))}
14786          (\x. e / &2 *
14787            (\(x,k). interval_upperbound k - interval_lowerbound k) x)`` THEN
14788    CONJ_TAC THENL
14789     [MATCH_MP_TAC SUM_ABS_LE THEN ASM_SIMP_TAC std_ss [FORALL_IN_GSPEC] THEN
14790      SIMP_TAC std_ss [o_DEF] THEN
14791      REWRITE_TAC[REAL_ARITH ``abs(a - (b - c):real) = abs(b - c - a)``] THEN
14792      MAP_EVERY X_GEN_TAC [``x:real``, ``k:real->bool``] THEN STRIP_TAC THEN
14793      SUBGOAL_THEN ``?u v:real. (k = interval[u,v]) /\ x IN interval[u,v]``
14794      MP_TAC THENL [ASM_MESON_TAC[TAGGED_DIVISION_OF], ALL_TAC] THEN
14795      DISCH_THEN(REPEAT_TCL CHOOSE_THEN
14796       (CONJUNCTS_THEN2 SUBST_ALL_TAC MP_TAC)) THEN
14797      REWRITE_TAC[IN_INTERVAL] THEN DISCH_THEN(fn th =>
14798        ASSUME_TAC th THEN MP_TAC(MATCH_MP REAL_LE_TRANS th)) THEN
14799      ASM_SIMP_TAC std_ss [CONTENT_CLOSED_INTERVAL,
14800       INTERVAL_LOWERBOUND, INTERVAL_UPPERBOUND] THEN
14801      DISCH_TAC THEN
14802      UNDISCH_TAC `` !(x :real).
14803            x IN interval [((a :real),(b :real))] /\
14804            x NOTIN IMAGE (r :num -> real) (t :num -> bool) ==>
14805            !(y :real).
14806              abs (y - x) < (d :real -> real) x /\ y IN interval [(a,b)] ==>
14807              abs
14808                ((f :real -> real) y - f x -
14809                 (y - x) * (f' :real -> real) x) <=
14810              (e :real) / (2 :real) * abs (y - x)`` THEN DISCH_TAC THEN
14811      FIRST_X_ASSUM (MP_TAC o SPEC ``x:real``) THEN
14812      ASM_REWRITE_TAC[] THEN
14813      SUBGOAL_THEN ``interval[u:real,v] SUBSET interval[a,b]`` ASSUME_TAC THENL
14814       [ASM_MESON_TAC[TAGGED_DIVISION_OF], ALL_TAC] THEN
14815      KNOW_TAC ``x IN interval [(a,b)]`` THENL
14816      [ASM_MESON_TAC[SUBSET_DEF, IN_INTERVAL],
14817       DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
14818      DISCH_THEN(fn th =>
14819        MP_TAC(ISPEC ``u:real`` th) THEN MP_TAC(ISPEC ``v:real`` th)) THEN
14820      UNDISCH_TAC ``(\x. ball (x,d x)) FINE p`` THEN DISCH_TAC THEN
14821      FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [FINE]) THEN
14822      DISCH_THEN(MP_TAC o SPECL [``x:real``, ``interval[u:real,v]``]) THEN
14823      ASM_SIMP_TAC std_ss [SUBSET_DEF, IN_BALL] THEN
14824      DISCH_THEN(fn th =>
14825        MP_TAC(ISPEC ``u:real`` th) THEN MP_TAC(ISPEC ``v:real`` th)) THEN
14826      ASM_SIMP_TAC std_ss [dist, ENDS_IN_INTERVAL, INTERVAL_NE_EMPTY] THEN
14827      ASM_SIMP_TAC std_ss [REAL_LT_IMP_LE, ABS_SUB] THEN DISCH_TAC THEN DISCH_TAC THEN
14828      KNOW_TAC ``v IN interval [(a,b)]`` THENL
14829      [ASM_MESON_TAC[ENDS_IN_INTERVAL, SUBSET_DEF, INTERVAL_NE_EMPTY,
14830                      REAL_LT_IMP_LE],
14831        DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
14832        ONCE_REWRITE_TAC[TAUT `p ==> q ==> r <=> q ==> p ==> r`]] THEN
14833      KNOW_TAC ``u IN interval [(a,b)]`` THENL
14834      [ASM_MESON_TAC[ENDS_IN_INTERVAL, SUBSET_DEF, INTERVAL_NE_EMPTY,
14835                      REAL_LT_IMP_LE],
14836        DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
14837        ONCE_REWRITE_TAC[TAUT `p ==> q ==> r <=> q ==> p ==> r`]] THEN
14838      ASM_SIMP_TAC std_ss [REAL_ARITH ``a <= b ==> (abs(a - b) = b - a:real)``,
14839                           REAL_ARITH ``b <= a ==> (abs(a - b) = a - b:real)``] THEN
14840      REWRITE_TAC[REAL_SUB_LDISTRIB] THEN MATCH_MP_TAC(REAL_ARITH
14841       ``(x - y:real = z) ==> abs(x) <= c - b
14842                   ==> abs(y) <= b - a ==> abs(z) <= c - a``) THEN
14843      REAL_ARITH_TAC,
14844      MATCH_MP_TAC SUM_SUBSET_SIMPLE THEN ASM_REWRITE_TAC[] THEN
14845      CONJ_TAC THENL [SIMP_TAC std_ss [LAMBDA_PAIR] THEN ASM_SET_TAC[],
14846                      SIMP_TAC std_ss [FORALL_PROD]] THEN
14847      SIMP_TAC std_ss [IN_DIFF, IN_ELIM_PAIR_THM] THEN
14848      MAP_EVERY X_GEN_TAC [``x:real``, ``k:real->bool``] THEN STRIP_TAC THEN
14849      SUBGOAL_THEN ``?u v:real. (k = interval[u,v]) /\ x IN interval[u,v]``
14850      MP_TAC THENL [ASM_MESON_TAC[TAGGED_DIVISION_OF], ALL_TAC] THEN
14851      DISCH_THEN(REPEAT_TCL CHOOSE_THEN
14852       (CONJUNCTS_THEN2 SUBST_ALL_TAC MP_TAC)) THEN
14853      REWRITE_TAC[IN_INTERVAL, o_THM] THEN
14854      DISCH_THEN(MP_TAC o MATCH_MP REAL_LE_TRANS) THEN
14855      SIMP_TAC std_ss [INTERVAL_LOWERBOUND, INTERVAL_UPPERBOUND] THEN
14856      REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_MUL THEN
14857      CONJ_TAC THENL [REWRITE_TAC [REAL_LE_LT] THEN
14858      ASM_SIMP_TAC std_ss [REAL_HALF], ALL_TAC] THEN
14859      POP_ASSUM MP_TAC THEN REAL_ARITH_TAC]]
14860QED
14861
14862Theorem FUNDAMENTAL_THEOREM_OF_CALCULUS_INTERIOR_STRONG:
14863   !f:real->real f' s a b.
14864        COUNTABLE s /\
14865        a <= b /\ f continuous_on interval[a,b] /\
14866        (!x. x IN interval(a,b) DIFF s
14867             ==> (f has_vector_derivative f'(x)) (at x))
14868        ==> (f' has_integral (f(b) - f(a))) (interval[a,b])
14869Proof
14870  REPEAT STRIP_TAC THEN
14871  MATCH_MP_TAC FUNDAMENTAL_THEOREM_OF_CALCULUS_STRONG THEN
14872  EXISTS_TAC ``(a:real) INSERT (b:real) INSERT s`` THEN
14873  ASM_REWRITE_TAC[COUNTABLE_INSERT, IN_INTERVAL, IN_DIFF] THEN
14874  REWRITE_TAC[DE_MORGAN_THM, IN_INSERT] THEN
14875  REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_AT_WITHIN THEN
14876  FIRST_X_ASSUM MATCH_MP_TAC THEN
14877  ASM_REWRITE_TAC[IN_INTERVAL, IN_DIFF, IN_INSERT] THEN
14878  METIS_TAC[REAL_LT_LE]
14879QED
14880
14881Theorem FUNDAMENTAL_THEOREM_OF_CALCULUS:
14882   !f:real->real f' a b.
14883        a <= b /\
14884        (!x. x IN interval[a,b]
14885             ==> (f has_vector_derivative f'(x)) (at x within interval[a,b]))
14886        ==> (f' has_integral (f(b) - f(a))) (interval[a,b])
14887Proof
14888  REPEAT STRIP_TAC THEN
14889  MATCH_MP_TAC FUNDAMENTAL_THEOREM_OF_CALCULUS_STRONG THEN
14890  EXISTS_TAC ``{}:real->bool`` THEN
14891  ASM_REWRITE_TAC[COUNTABLE_EMPTY, DIFF_EMPTY] THEN
14892  MATCH_MP_TAC DIFFERENTIABLE_IMP_CONTINUOUS_ON THEN
14893  REWRITE_TAC[differentiable_on] THEN
14894  METIS_TAC[has_vector_derivative, differentiable]
14895QED
14896
14897Theorem FUNDAMENTAL_THEOREM_OF_CALCULUS_INTERIOR:
14898   !f:real->real f' a b.
14899        a <= b /\ f continuous_on interval[a,b] /\
14900        (!x. x IN interval(a,b)
14901             ==> (f has_vector_derivative f'(x)) (at x))
14902        ==> (f' has_integral (f(b) - f(a))) (interval[a,b])
14903Proof
14904  REPEAT STRIP_TAC THEN
14905  MATCH_MP_TAC FUNDAMENTAL_THEOREM_OF_CALCULUS_INTERIOR_STRONG THEN
14906  EXISTS_TAC ``{}:real->bool`` THEN
14907  ASM_REWRITE_TAC[COUNTABLE_EMPTY, DIFF_EMPTY]
14908QED
14909
14910Theorem ANTIDERIVATIVE_INTEGRAL_CONTINUOUS:
14911   !f:real->real a b.
14912     (f continuous_on interval[a,b])
14913     ==> ?g. !u v. u IN interval[a,b] /\ v IN interval[a,b] /\ u <= v
14914                   ==> (f has_integral (g(v) - g(u))) (interval[u,v])
14915Proof
14916  REPEAT STRIP_TAC THEN
14917  FIRST_ASSUM(MP_TAC o MATCH_MP ANTIDERIVATIVE_CONTINUOUS) THEN
14918  STRIP_TAC THEN EXISTS_TAC ``g:real->real`` THEN
14919  REPEAT STRIP_TAC THEN MATCH_MP_TAC FUNDAMENTAL_THEOREM_OF_CALCULUS THEN
14920  ASM_REWRITE_TAC[] THEN X_GEN_TAC ``x:real`` THEN
14921  STRIP_TAC THEN MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_WITHIN_SUBSET THEN
14922  EXISTS_TAC ``interval[a:real,b]`` THEN CONJ_TAC THENL
14923   [FIRST_X_ASSUM MATCH_MP_TAC, ALL_TAC] THEN
14924  REPEAT(POP_ASSUM MP_TAC) THEN
14925  REWRITE_TAC[SUBSET_INTERVAL, IN_INTERVAL] THENL
14926  [REAL_ARITH_TAC, METIS_TAC [REAL_LE_TRANS]]
14927QED
14928
14929(* ------------------------------------------------------------------------- *)
14930(* This doesn't directly involve integration, but that gives an easy proof.  *)
14931(* ------------------------------------------------------------------------- *)
14932
14933Theorem HAS_DERIVATIVE_ZERO_UNIQUE_STRONG_INTERVAL:
14934   !f:real->real a b k y.
14935        COUNTABLE k /\ f continuous_on interval[a,b] /\ (f a = y) /\
14936        (!x. x IN (interval[a,b] DIFF k)
14937             ==> (f has_derivative (\h. 0)) (at x within interval[a,b]))
14938        ==> !x. x IN interval[a,b] ==> (f x = y)
14939Proof
14940  REPEAT STRIP_TAC THEN ONCE_REWRITE_TAC[GSYM REAL_SUB_0] THEN
14941  MATCH_MP_TAC(ISPEC ``(\x. 0):real->real`` HAS_INTEGRAL_UNIQUE) THEN
14942  EXISTS_TAC ``interval[a:real,x]`` THEN
14943  REWRITE_TAC[HAS_INTEGRAL_0] THEN FIRST_X_ASSUM(SUBST_ALL_TAC o SYM) THEN
14944  MATCH_MP_TAC FUNDAMENTAL_THEOREM_OF_CALCULUS_INTERIOR_STRONG THEN
14945  EXISTS_TAC ``k:real->bool`` THEN ASM_SIMP_TAC std_ss [] THEN REPEAT CONJ_TAC THENL
14946   [REPEAT(FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [IN_INTERVAL])) THEN
14947    SIMP_TAC std_ss [],
14948    MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN
14949    EXISTS_TAC ``interval[a:real,b]`` THEN
14950    ASM_REWRITE_TAC[SUBSET_INTERVAL] THEN
14951    REPEAT(FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [IN_INTERVAL])) THEN
14952    SIMP_TAC std_ss [REAL_LE_REFL],
14953    X_GEN_TAC ``y:real`` THEN DISCH_TAC THEN
14954    FIRST_X_ASSUM(MP_TAC o SPEC ``y:real``) THEN
14955    KNOW_TAC ``y IN interval [(a,b)] DIFF k`` THENL
14956     [REPEAT(POP_ASSUM MP_TAC) THEN
14957      SIMP_TAC std_ss [IN_DIFF, IN_INTERVAL] THEN REAL_ARITH_TAC,
14958      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
14959    DISCH_THEN(MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
14960      HAS_DERIVATIVE_WITHIN_SUBSET)) THEN
14961    DISCH_THEN(MP_TAC o SPEC ``interval(a:real,b)``) THEN
14962    REWRITE_TAC[INTERVAL_OPEN_SUBSET_CLOSED] THEN
14963    REWRITE_TAC[has_vector_derivative, REAL_MUL_RZERO] THEN
14964    MATCH_MP_TAC EQ_IMPLIES THEN MATCH_MP_TAC HAS_DERIVATIVE_WITHIN_OPEN THEN
14965    REPEAT(POP_ASSUM MP_TAC) THEN
14966    SIMP_TAC std_ss [OPEN_INTERVAL, IN_INTERVAL, IN_DIFF] THEN REAL_ARITH_TAC]
14967QED
14968
14969(* ------------------------------------------------------------------------- *)
14970(* Integration by parts.                                                     *)
14971(* ------------------------------------------------------------------------- *)
14972
14973Theorem INTEGRATION_BY_PARTS:
14974   !(bop:real->real->real) f g f' g' a b c y.
14975        bilinear bop /\ a <= b /\ COUNTABLE c /\
14976        (\x. bop (f x) (g x)) continuous_on interval[a,b] /\
14977        (!x. x IN interval(a,b) DIFF c
14978             ==> (f has_vector_derivative f'(x)) (at x) /\
14979                 (g has_vector_derivative g'(x)) (at x)) /\
14980        ((\x. bop (f x) (g' x)) has_integral
14981         ((bop (f b) (g b) - bop (f a) (g a)) - y))
14982            (interval[a,b])
14983        ==> ((\x. bop (f' x) (g x)) has_integral y) (interval[a,b])
14984Proof
14985  REPEAT STRIP_TAC THEN
14986  MP_TAC(ISPECL [``\x:real. (bop:real->real->real) (f x) (g x)``,
14987                 ``\x:real. (bop:real->real->real) (f x) (g' x) +
14988                             (bop:real->real->real) (f' x) (g x)``,
14989                 ``c:real->bool``, ``a:real``, ``b:real``]
14990    FUNDAMENTAL_THEOREM_OF_CALCULUS_INTERIOR_STRONG) THEN
14991  ASM_SIMP_TAC std_ss [HAS_VECTOR_DERIVATIVE_BILINEAR_AT] THEN
14992  FIRST_ASSUM(fn th => MP_TAC th THEN REWRITE_TAC[GSYM IMP_CONJ_ALT] THEN
14993        DISCH_THEN(MP_TAC o MATCH_MP HAS_INTEGRAL_SUB)) THEN
14994  SIMP_TAC std_ss [REAL_ARITH ``b - a - (b - a - y):real = y``, REAL_ADD_SUB]
14995QED
14996
14997Theorem INTEGRATION_BY_PARTS_SIMPLE:
14998   !(bop:real->real->real) f g f' g' a b y.
14999        bilinear bop /\ a <= b /\
15000        (!x. x IN interval[a,b]
15001             ==> (f has_vector_derivative f'(x)) (at x within interval[a,b]) /\
15002                 (g has_vector_derivative g'(x)) (at x within interval[a,b])) /\
15003        ((\x. bop (f x) (g' x)) has_integral
15004         ((bop (f b) (g b) - bop (f a) (g a)) - y))
15005            (interval[a,b])
15006        ==> ((\x. bop (f' x) (g x)) has_integral y) (interval[a,b])
15007Proof
15008  REPEAT STRIP_TAC THEN
15009  MP_TAC(ISPECL [``\x:real. (bop:real->real->real) (f x) (g x)``,
15010                 ``\x:real. (bop:real->real->real) (f x) (g' x) +
15011                             (bop:real->real->real) (f' x) (g x)``,
15012                 ``a:real``, ``b:real``]
15013    FUNDAMENTAL_THEOREM_OF_CALCULUS) THEN
15014  ASM_SIMP_TAC std_ss [HAS_VECTOR_DERIVATIVE_BILINEAR_WITHIN] THEN
15015  FIRST_ASSUM(fn th => MP_TAC th THEN REWRITE_TAC[GSYM IMP_CONJ_ALT] THEN
15016        DISCH_THEN(MP_TAC o MATCH_MP HAS_INTEGRAL_SUB)) THEN
15017  SIMP_TAC std_ss [REAL_ARITH ``b - a - (b - a - y):real = y``, REAL_ADD_SUB]
15018QED
15019
15020Theorem INTEGRABLE_BY_PARTS:
15021   !(bop:real->real->real) f g f' g' a b c.
15022        bilinear bop /\ COUNTABLE c /\
15023        (\x. bop (f x) (g x)) continuous_on interval[a,b] /\
15024        (!x. x IN interval(a,b) DIFF c
15025             ==> (f has_vector_derivative f'(x)) (at x) /\
15026                 (g has_vector_derivative g'(x)) (at x)) /\
15027        (\x. bop (f x) (g' x)) integrable_on interval[a,b]
15028        ==> (\x. bop (f' x) (g x)) integrable_on interval[a,b]
15029Proof
15030  REPEAT GEN_TAC THEN
15031  DISJ_CASES_TAC(REAL_ARITH ``b <= a \/ a <= b:real``) THENL
15032   [DISCH_THEN(K ALL_TAC) THEN MATCH_MP_TAC INTEGRABLE_ON_NULL THEN
15033    ASM_REWRITE_TAC[CONTENT_EQ_0],
15034    REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
15035    REWRITE_TAC[integrable_on] THEN
15036    DISCH_THEN(X_CHOOSE_THEN ``y:real`` STRIP_ASSUME_TAC) THEN
15037    EXISTS_TAC ``(bop ((f:real->real) b) ((g:real->real) b) -
15038                 bop (f a) (g a)) - (y:real)`` THEN
15039    MATCH_MP_TAC INTEGRATION_BY_PARTS THEN MAP_EVERY EXISTS_TAC
15040     [``f:real->real``, ``g':real->real``, ``c:real->bool``] THEN
15041    ASM_REWRITE_TAC[REAL_ARITH ``b - a - ((b - a) - y):real = y``]]
15042QED
15043
15044Theorem INTEGRABLE_BY_PARTS_EQ:
15045   !(bop:real->real->real) f g f' g' a b c.
15046        bilinear bop /\ COUNTABLE c /\
15047        (\x. bop (f x) (g x)) continuous_on interval[a,b] /\
15048        (!x. x IN interval(a,b) DIFF c
15049             ==> (f has_vector_derivative f'(x)) (at x) /\
15050                 (g has_vector_derivative g'(x)) (at x))
15051        ==> ((\x. bop (f x) (g' x)) integrable_on interval[a,b] <=>
15052             (\x. bop (f' x) (g x)) integrable_on interval[a,b])
15053Proof
15054  REPEAT STRIP_TAC THEN EQ_TAC THENL
15055   [METIS_TAC[INTEGRABLE_BY_PARTS], DISCH_TAC] THEN
15056  MP_TAC(ISPEC ``\x y. (bop:real->real->real) y x``
15057        INTEGRABLE_BY_PARTS) THEN
15058  SIMP_TAC std_ss [IMP_CONJ, RIGHT_FORALL_IMP_THM] THEN
15059  KNOW_TAC ``bilinear (\(x :real) (y :real). (bop :real -> real -> real) y x)`` THENL
15060  [ALL_TAC, METIS_TAC[]] THEN
15061  UNDISCH_TAC ``bilinear(bop:real->real->real)`` THEN
15062  REWRITE_TAC[bilinear] THEN METIS_TAC[]
15063QED
15064
15065(* ------------------------------------------------------------------------- *)
15066(* Equiintegrability. The definition here only really makes sense for an     *)
15067(* elementary set. We just use compact intervals in applications below.      *)
15068(* ------------------------------------------------------------------------- *)
15069
15070val _ = set_fixity "equiintegrable_on" (Infix(NONASSOC, 450));
15071
15072Definition equiintegrable_on[nocompute]:
15073  fs equiintegrable_on i <=>
15074        (!f:real->real. f IN fs ==> f integrable_on i) /\
15075        (!e. &0 < e
15076             ==> ?d. gauge d /\
15077                    !f p. f IN fs /\ p tagged_division_of i /\ d FINE p
15078                        ==> abs(sum p (\(x,k). content(k) * f(x)) -
15079                                 integral i f) < e)
15080End
15081
15082Theorem EQUIINTEGRABLE_ON_SING:
15083   !f:real->real a b.
15084        {f} equiintegrable_on interval[a,b] <=>
15085        f integrable_on interval[a,b]
15086Proof
15087  REPEAT GEN_TAC THEN REWRITE_TAC[equiintegrable_on] THEN
15088  SIMP_TAC std_ss [IN_SING, UNWIND_FORALL_THM2] THEN
15089  ASM_CASES_TAC ``(f:real->real) integrable_on interval[a,b]`` THEN
15090  ASM_SIMP_TAC std_ss [IMP_CONJ, RIGHT_FORALL_IMP_THM, UNWIND_FORALL_THM2] THEN
15091  FIRST_ASSUM(MP_TAC o MATCH_MP INTEGRABLE_INTEGRAL) THEN
15092  REWRITE_TAC[has_integral, AND_IMP_INTRO]
15093QED
15094
15095(* ------------------------------------------------------------------------- *)
15096(* Basic combining theorems for the interval of integration.                 *)
15097(* ------------------------------------------------------------------------- *)
15098
15099Theorem EQUIINTEGRABLE_ON_NULL:
15100   !fs:(real->real)->bool a b.
15101     (content(interval[a,b]) = &0) ==> fs equiintegrable_on interval[a,b]
15102Proof
15103  REPEAT STRIP_TAC THEN REWRITE_TAC[equiintegrable_on] THEN
15104  ASM_SIMP_TAC std_ss [INTEGRABLE_ON_NULL] THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
15105  EXISTS_TAC ``\x:real. ball(x,&1)`` THEN REWRITE_TAC[GAUGE_TRIVIAL] THEN
15106  FIRST_ASSUM(fn th => SIMP_TAC std_ss [MATCH_MP (REWRITE_RULE[IMP_CONJ]
15107                                           SUM_CONTENT_NULL) th]) THEN
15108  ASM_SIMP_TAC std_ss [INTEGRAL_NULL, REAL_SUB_REFL, ABS_0]
15109QED
15110
15111Theorem lemma1[local]:
15112    (!x k. (x,k) IN {x,f k | P x k} ==> Q x k) <=>
15113     (!x k. P x k ==> Q x (f k))
15114Proof
15115    REWRITE_TAC[GSPECIFICATION, PAIR_EQ] THEN
15116    SET_TAC[]
15117QED
15118
15119Theorem lemma2[local]:
15120   !f:'b->'b s:('a#'b)->bool.
15121      FINITE s ==> FINITE {x,f k | (x,k) IN s /\ P x k}
15122Proof
15123    REPEAT STRIP_TAC THEN MATCH_MP_TAC FINITE_SUBSET THEN
15124    EXISTS_TAC ``IMAGE (\(x:'a,k:'b). x,(f k:'b)) s`` THEN
15125    ASM_SIMP_TAC std_ss [IMAGE_FINITE] THEN
15126    SIMP_TAC std_ss [SUBSET_DEF, FORALL_PROD, lemma1, IN_IMAGE] THEN
15127    SIMP_TAC std_ss [EXISTS_PROD, PAIR_EQ] THEN METIS_TAC[]
15128QED
15129
15130Theorem lemma3[local]:
15131   !f:real->real g:(real->bool)->(real->bool) p.
15132     FINITE p
15133     ==> (sum {x,g k |x,k| (x,k) IN p /\ ~(g k = {})}
15134              (\(x,k). content k * f x) =
15135          sum (IMAGE (\(x,k). x,g k) p) (\(x,k). content k * f x))
15136Proof
15137    REPEAT STRIP_TAC THEN CONV_TAC SYM_CONV THEN MATCH_MP_TAC SUM_SUPERSET THEN
15138    ASM_SIMP_TAC std_ss [IMAGE_FINITE, lemma2] THEN
15139    SIMP_TAC std_ss [IMP_CONJ, FORALL_IN_IMAGE] THEN
15140    SIMP_TAC std_ss [FORALL_PROD, SUBSET_DEF, IN_IMAGE, EXISTS_PROD] THEN
15141    SIMP_TAC std_ss [GSPECIFICATION, PAIR_EQ, REAL_ENTIRE, EXISTS_PROD] THEN
15142    METIS_TAC[CONTENT_EMPTY]
15143QED
15144
15145Theorem lemma4[local]:
15146     (\(x,l). content (g l) * f x) =
15147     (\(x,l). content l * f x) o (\(x,l). x,g l)
15148Proof
15149    SIMP_TAC std_ss [FUN_EQ_THM, o_THM, FORALL_PROD]
15150QED
15151
15152Theorem EQUIINTEGRABLE_ON_SPLIT:
15153   !fs:(real->real)->bool k a b c.
15154      fs equiintegrable_on (interval[a,b] INTER {x | x <= c}) /\
15155      fs equiintegrable_on (interval[a,b] INTER {x | x >= c})
15156      ==> fs equiintegrable_on (interval[a,b])
15157Proof
15158  REPEAT GEN_TAC THEN
15159  REWRITE_TAC[equiintegrable_on] THEN
15160  MATCH_MP_TAC(TAUT
15161   `(a /\ b ==> c) /\ (a /\ b /\ c ==> a' /\ b' ==> c')
15162    ==> (a /\ a') /\ (b /\ b') ==> c /\ c'`) THEN
15163  CONJ_TAC THENL
15164   [REWRITE_TAC[integrable_on] THEN METIS_TAC[HAS_INTEGRAL_SPLIT],
15165    STRIP_TAC] THEN
15166  SUBGOAL_THEN
15167   ``!f:real->real.
15168        f IN fs
15169        ==> (integral (interval[a,b]) f =
15170                integral (interval [a,b] INTER {x | x <= c}) f +
15171                integral (interval [a,b] INTER {x | x >= c}) f)``
15172   (fn th => SIMP_TAC std_ss [th])
15173  THENL
15174   [REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRAL_UNIQUE THEN
15175    MATCH_MP_TAC HAS_INTEGRAL_SPLIT THEN
15176    MAP_EVERY EXISTS_TAC [``c:real``] THEN
15177    ASM_SIMP_TAC std_ss [GSYM HAS_INTEGRAL_INTEGRAL],
15178    ALL_TAC] THEN
15179  DISCH_TAC THEN X_GEN_TAC ``e:real`` THEN STRIP_TAC THEN
15180  FIRST_X_ASSUM(CONJUNCTS_THEN2 (MP_TAC o SPEC ``e / &2:real``) STRIP_ASSUME_TAC) THEN
15181  FIRST_X_ASSUM(MP_TAC o SPEC ``e / &2:real``) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
15182  DISCH_THEN(X_CHOOSE_THEN ``d2:real->real->bool``
15183   (CONJUNCTS_THEN2 ASSUME_TAC ASSUME_TAC)) THEN
15184  DISCH_THEN(X_CHOOSE_THEN ``d1:real->real->bool``
15185   (CONJUNCTS_THEN2 ASSUME_TAC ASSUME_TAC)) THEN
15186  EXISTS_TAC ``\x. if x = c then (d1(x:real) INTER d2(x)):real->bool
15187                  else ball(x,abs(x - c)) INTER d1(x) INTER d2(x)`` THEN
15188  CONJ_TAC THENL
15189   [REWRITE_TAC[gauge_def] THEN GEN_TAC THEN
15190    RULE_ASSUM_TAC(REWRITE_RULE[gauge_def]) THEN
15191    SIMP_TAC std_ss [] THEN COND_CASES_TAC THEN
15192    ASM_SIMP_TAC std_ss [OPEN_INTER, IN_INTER, OPEN_BALL, IN_BALL] THEN
15193    ASM_REWRITE_TAC[DIST_REFL, GSYM ABS_NZ, REAL_SUB_0],
15194    ALL_TAC] THEN
15195  X_GEN_TAC ``f:real->real`` THEN
15196  X_GEN_TAC ``p:(real#(real->bool))->bool`` THEN STRIP_TAC THEN
15197  SUBGOAL_THEN
15198    ``(!x:real kk. (x,kk) IN p /\ ~(kk INTER {x:real | x <= c} = {})
15199                    ==> x <= c) /\
15200     (!x:real kk. (x,kk) IN p /\ ~(kk INTER {x:real | x >= c} = {})
15201                    ==> x >= c)``
15202  STRIP_ASSUME_TAC THENL
15203   [CONJ_TAC THEN FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [FINE]) THEN
15204    SIMP_TAC std_ss [] THEN DISCH_TAC THEN
15205    X_GEN_TAC ``x:real`` THEN X_GEN_TAC ``kk:real->bool`` THEN
15206    POP_ASSUM (MP_TAC o SPECL [``x:real``, ``kk:real->bool``]) THEN
15207    DISCH_THEN(fn th => STRIP_TAC THEN MP_TAC th) THEN ASM_SIMP_TAC std_ss [] THEN
15208    COND_CASES_TAC THEN ASM_REWRITE_TAC[REAL_LE_REFL, real_ge] THEN DISCH_THEN
15209     (MP_TAC o MATCH_MP (SET_RULE ``k SUBSET (a INTER b) ==> k SUBSET a``)) THEN
15210    DISCH_THEN
15211     (MP_TAC o MATCH_MP (SET_RULE ``k SUBSET (a INTER b) ==> k SUBSET a``)) THEN
15212    SIMP_TAC std_ss [SUBSET_DEF, IN_BALL, dist] THEN DISCH_TAC THENL
15213    [UNDISCH_TAC ``kk INTER {x:real | x <= c} <> {}``,
15214     UNDISCH_TAC ``kk INTER {x:real | x >= c} <> {}``] THEN DISCH_TAC THEN
15215    FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [GSYM MEMBER_NOT_EMPTY]) THEN
15216    DISCH_THEN(X_CHOOSE_THEN ``u:real`` MP_TAC) THEN
15217    SIMP_TAC std_ss [IN_INTER, GSPECIFICATION] THEN REPEAT STRIP_TAC THEN
15218    FIRST_X_ASSUM(MP_TAC o SPEC ``u:real``) THEN ASM_SIMP_TAC std_ss [] THEN
15219    ONCE_REWRITE_TAC[MONO_NOT_EQ] THEN
15220    SIMP_TAC std_ss [REAL_NOT_LE, REAL_NOT_LT] THEN STRIP_TAC THEN
15221    MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC ``abs((x - u:real))`` THEN
15222    POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN REAL_ARITH_TAC,
15223    ALL_TAC] THEN
15224  UNDISCH_TAC ``!f p.
15225        f IN fs /\
15226        p tagged_division_of interval [(a,b)] INTER {x | x >= c} /\
15227        d2 FINE p ==>
15228        abs (sum p (\(x,k). content k * f x) -
15229         integral (interval [(a,b)] INTER {x | x >= c}) f) < e / 2`` THEN
15230  DISCH_TAC THEN
15231  FIRST_X_ASSUM (MP_TAC o SPEC
15232   ``{(x:real,kk INTER {x:real | x >= c}) |x,kk|
15233     (x,kk) IN p /\ ~(kk INTER {x:real | x >= c} = {})}`` o
15234   SPEC ``f:real->real``) THEN
15235  UNDISCH_TAC ``!f p.
15236        f IN fs /\
15237        p tagged_division_of interval [(a,b)] INTER {x | x <= c} /\
15238        d1 FINE p ==>
15239        abs (sum p (\(x,k). content k * f x) -
15240         integral (interval [(a,b)] INTER {x | x <= c}) f) < e / 2`` THEN
15241  DISCH_TAC THEN
15242  FIRST_X_ASSUM (MP_TAC o SPEC
15243   ``{(x:real,kk INTER {x:real | x <= c}) |x,kk|
15244     (x,kk) IN p /\ ~(kk INTER {x:real | x <= c} = {})}`` o
15245   SPEC ``f:real->real``) THEN
15246  ASM_SIMP_TAC std_ss [] THEN MATCH_MP_TAC(TAUT
15247   `(a /\ b) /\ (a' /\ b' ==> c) ==> (a ==> a') ==> (b ==> b') ==> c`) THEN
15248  CONJ_TAC THENL
15249   [UNDISCH_TAC ``p tagged_division_of interval [(a,b)]`` THEN DISCH_TAC THEN
15250    FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [TAGGED_DIVISION_OF]) THEN
15251    REWRITE_TAC[TAGGED_DIVISION_OF] THEN
15252    REPEAT(MATCH_MP_TAC(TAUT
15253     `(a ==> (a' /\ a'')) /\ (b ==> (b' /\ d) /\ (b'' /\ e))
15254      ==> a /\ b ==> ((a' /\ b') /\ d) /\ ((a'' /\ b'') /\ e)`) THEN
15255      CONJ_TAC) THEN
15256    SIMP_TAC std_ss [IMP_CONJ, RIGHT_FORALL_IMP_THM] THEN
15257    SIMP_TAC std_ss [lemma1] THEN REWRITE_TAC[AND_IMP_INTRO] THENL
15258     [SIMP_TAC std_ss [lemma2],
15259      SIMP_TAC std_ss [GSYM FORALL_AND_THM] THEN
15260      DISCH_TAC THEN X_GEN_TAC ``x:real`` THEN X_GEN_TAC ``kk:real->bool`` THEN
15261      POP_ASSUM (MP_TAC o SPECL [``x:real``,``kk:real->bool``]) THEN
15262      DISCH_THEN(fn th => CONJ_TAC THEN STRIP_TAC THEN MP_TAC th) THEN
15263      (ASM_SIMP_TAC std_ss [] THEN MATCH_MP_TAC MONO_AND THEN CONJ_TAC THENL
15264        [SIMP_TAC std_ss [IN_INTER, GSPECIFICATION] THEN ASM_MESON_TAC[], ALL_TAC]) THEN
15265      (MATCH_MP_TAC MONO_AND THEN CONJ_TAC THENL [SET_TAC[], ALL_TAC]) THEN
15266      METIS_TAC[INTERVAL_SPLIT],
15267      DISCH_THEN(fn th => CONJ_TAC THEN MP_TAC th) THEN
15268      (DISCH_TAC THEN X_GEN_TAC ``x1:real`` THEN X_GEN_TAC ``k1:real->bool`` THEN
15269       POP_ASSUM (MP_TAC o SPECL [``x1:real``,``k1:real->bool``]) THEN
15270       DISCH_THEN(fn th => STRIP_TAC THEN MP_TAC th) THEN ASM_SIMP_TAC std_ss [] THEN
15271       DISCH_TAC THEN X_GEN_TAC ``x2:real`` THEN X_GEN_TAC ``k2:real->bool`` THEN
15272       POP_ASSUM (MP_TAC o SPECL [``x2:real``,``k2:real->bool``]) THEN
15273       DISCH_THEN(fn th => STRIP_TAC THEN MP_TAC th) THEN ASM_SIMP_TAC std_ss [] THEN
15274       (KNOW_TAC ``(x1 <> x2:real) \/ (k1 <> k2:real->bool)`` THENL
15275       [METIS_TAC[PAIR_EQ], ALL_TAC] THEN DISCH_TAC THEN ASM_REWRITE_TAC [] THEN
15276       MATCH_MP_TAC(SET_RULE
15277        ``s SUBSET s' /\ t SUBSET t'
15278         ==> (s' INTER t' = {}) ==> (s INTER t = {})``) THEN
15279       CONJ_TAC THEN MATCH_MP_TAC SUBSET_INTERIOR THEN SET_TAC[])),
15280      ALL_TAC] THEN
15281    MATCH_MP_TAC(TAUT `(a ==> b /\ c) /\ d /\ e
15282                       ==> (a ==> (b /\ d) /\ (c /\ e))`) THEN
15283    CONJ_TAC THENL
15284     [DISCH_THEN(fn th => CONJ_TAC THEN MP_TAC th) THEN
15285      DISCH_THEN(SUBST1_TAC o SYM) THEN REWRITE_TAC[INTER_BIGUNION] THEN
15286      ONCE_REWRITE_TAC[EXTENSION] THEN REWRITE_TAC[IN_BIGUNION] THEN
15287      X_GEN_TAC ``x:real`` THEN AP_TERM_TAC THEN
15288      GEN_REWR_TAC I [FUN_EQ_THM] THEN X_GEN_TAC ``kk:real->bool`` THEN
15289      SIMP_TAC std_ss [GSPECIFICATION, PAIR_EQ, EXISTS_PROD] THEN
15290      METIS_TAC[NOT_IN_EMPTY],
15291      ALL_TAC] THEN
15292    UNDISCH_TAC ``(\x.
15293         if x = c then d1 x INTER d2 x
15294         else ball (x,abs (x - c)) INTER d1 x INTER d2 x) FINE p`` THEN DISCH_TAC THEN
15295    CONJ_TAC THEN FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [FINE]) THEN
15296    SIMP_TAC std_ss [FINE,  lemma1] THEN
15297    DISCH_TAC THEN X_GEN_TAC ``x:real`` THEN X_GEN_TAC ``k:real->bool`` THEN
15298       POP_ASSUM (MP_TAC o SPECL [``x:real``,``k:real->bool``]) THEN
15299    DISCH_THEN(fn th => STRIP_TAC THEN MP_TAC th) THEN
15300    ASM_SIMP_TAC std_ss [] THEN SET_TAC[],
15301    ALL_TAC] THEN
15302  GEN_REWR_TAC (RAND_CONV o RAND_CONV) [GSYM REAL_HALF] THEN
15303  DISCH_THEN(MP_TAC o MATCH_MP (REAL_ARITH
15304   ``x < e / &2 /\ y < e / &2 ==> x + y < e / 2 + e / 2:real``)) THEN
15305  REWRITE_TAC [REAL_HALF] THEN
15306  DISCH_THEN(MP_TAC o MATCH_MP ABS_TRIANGLE_LT) THEN
15307  MATCH_MP_TAC EQ_IMPLIES THEN AP_THM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN
15308  REWRITE_TAC[REAL_ARITH
15309   ``((a - i) + (b - j) = c - (i + j)) <=> (a + b = c:real)``] THEN
15310  FIRST_ASSUM(ASSUME_TAC o MATCH_MP TAGGED_DIVISION_OF_FINITE) THEN
15311 MATCH_MP_TAC EQ_TRANS THEN
15312  EXISTS_TAC
15313   ``sum p (\(x,l). content (l INTER {x:real | x <= c}) *
15314                     (f:real->real) x) +
15315     sum p (\(x,l). content (l INTER {x:real | x >= c}) *
15316                     (f:real->real) x)`` THEN
15317  CONJ_TAC THENL
15318   [ALL_TAC,
15319    ASM_SIMP_TAC std_ss [GSYM SUM_ADD] THEN MATCH_MP_TAC SUM_EQ THEN
15320    SIMP_TAC std_ss [FORALL_PROD, GSYM REAL_ADD_RDISTRIB] THEN
15321    MAP_EVERY X_GEN_TAC [``x:real``, ``l:real->bool``] THEN
15322    DISCH_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN
15323    UNDISCH_TAC ``p tagged_division_of interval [(a,b)]`` THEN DISCH_TAC THEN
15324    FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [TAGGED_DIVISION_OF]) THEN
15325    DISCH_THEN (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
15326    DISCH_THEN (CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
15327    DISCH_THEN(MP_TAC o SPECL [``x:real``, ``l:real->bool``]) THEN
15328    ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
15329    ASM_SIMP_TAC std_ss [GSYM CONTENT_SPLIT]] THEN
15330  ASM_SIMP_TAC std_ss [lemma3] THEN BINOP_TAC THENL
15331  [ONCE_REWRITE_TAC [METIS []
15332     ``(\(x,l). content (l INTER {x | x <= c}) * f x) =
15333       (\(x,l). content ((\l. l INTER {x | x <= c}) l) * f x)``],
15334   ONCE_REWRITE_TAC [METIS []
15335     ``(\(x,l). content (l INTER {x | x >= c}) * f x) =
15336       (\(x,l). content ((\l. l INTER {x | x >= c}) l) * f x)``]] THEN
15337  (GEN_REWR_TAC (RAND_CONV o RAND_CONV) [lemma4] THEN
15338   SIMP_TAC std_ss [] THEN
15339   MATCH_MP_TAC SUM_IMAGE_NONZERO THEN ASM_SIMP_TAC std_ss [FORALL_PROD] THEN
15340   SIMP_TAC std_ss [PAIR_EQ] THEN
15341   METIS_TAC[TAGGED_DIVISION_SPLIT_LEFT_INJ, REAL_MUL_LZERO,
15342             TAGGED_DIVISION_SPLIT_RIGHT_INJ])
15343QED
15344
15345Theorem EQUIINTEGRABLE_DIVISION:
15346   !fs:(real->real)->bool d a b.
15347        d division_of interval[a,b]
15348        ==> (fs equiintegrable_on interval[a,b] <=>
15349             !i. i IN d ==> fs equiintegrable_on i)
15350Proof
15351  REPEAT STRIP_TAC THEN CONV_TAC SYM_CONV THEN
15352  MATCH_MP_TAC OPERATIVE_DIVISION_AND THEN
15353  ASM_REWRITE_TAC[operative, NEUTRAL_AND] THEN
15354  POP_ASSUM_LIST(K ALL_TAC) THEN CONJ_TAC THENL
15355   [MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``] THEN DISCH_TAC THEN
15356    ASM_SIMP_TAC std_ss [equiintegrable_on, INTEGRABLE_ON_NULL] THEN
15357    GEN_TAC THEN DISCH_TAC THEN EXISTS_TAC ``\x:real. ball(x,&1)`` THEN
15358    ASM_SIMP_TAC std_ss [GAUGE_TRIVIAL, INTEGRAL_NULL, REAL_SUB_RZERO] THEN
15359    REPEAT STRIP_TAC THEN
15360    FIRST_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
15361     ``&0 < e ==> (x = 0) ==> abs x < e:real``)) THEN
15362    MATCH_MP_TAC SUM_EQ_0 THEN SIMP_TAC std_ss [FORALL_PROD] THEN
15363    REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_ENTIRE] THEN DISJ1_TAC THEN
15364    RULE_ASSUM_TAC(REWRITE_RULE[TAGGED_DIVISION_OF]) THEN
15365    ASM_MESON_TAC[CONTENT_EQ_0_INTERIOR, SUBSET_INTERIOR,
15366                  SET_RULE ``(s = {}) <=> s SUBSET {}``],
15367    ALL_TAC] THEN
15368  MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``, ``c:real``] THEN
15369  EQ_TAC THENL [ALL_TAC, METIS_TAC[EQUIINTEGRABLE_ON_SPLIT]] THEN
15370  ASM_SIMP_TAC std_ss [INTEGRABLE_SPLIT, equiintegrable_on] THEN
15371  STRIP_TAC THEN CONJ_TAC THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
15372  (FIRST_X_ASSUM(MP_TAC o SPEC ``e / &2:real``) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
15373   DISCH_THEN (X_CHOOSE_TAC ``d:real->real->bool``) THEN
15374   EXISTS_TAC ``d:real->real->bool`` THEN POP_ASSUM MP_TAC THEN
15375   ASM_CASES_TAC ``gauge(d:real->real->bool)`` THEN ASM_REWRITE_TAC[] THEN
15376   DISCH_TAC THEN X_GEN_TAC ``f:real->real`` THEN
15377   POP_ASSUM (MP_TAC o SPEC ``f:real->real``) THEN
15378   ASM_CASES_TAC ``(f:real->real) IN fs`` THEN ASM_REWRITE_TAC[] THEN
15379   DISCH_TAC THEN
15380   MP_TAC(ISPECL [``f:real->real``, ``a:real``, ``b:real``,
15381                  ``d:real->real->bool``, ``e / &2:real``]
15382         HENSTOCK_LEMMA_PART1) THEN ASM_SIMP_TAC std_ss [REAL_HALF] THEN
15383   DISCH_TAC THEN X_GEN_TAC ``p:real#(real->bool)->bool`` THEN
15384   POP_ASSUM (MP_TAC o SPEC ``p:real#(real->bool)->bool``) THEN
15385   DISCH_THEN(fn th => STRIP_TAC THEN MP_TAC th) THEN
15386   KNOW_TAC ``p tagged_partial_division_of interval [(a,b)] /\ d FINE p`` THENL
15387    [ASM_REWRITE_TAC[] THEN MATCH_MP_TAC TAGGED_PARTIAL_DIVISION_OF_SUBSET THEN
15388     RULE_ASSUM_TAC(REWRITE_RULE[tagged_division_of]) THEN
15389     ASM_MESON_TAC[INTER_SUBSET],
15390     DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
15391   GEN_REWR_TAC (RAND_CONV o RAND_CONV) [GSYM REAL_HALF] THEN
15392   MATCH_MP_TAC(REAL_ARITH
15393    ``&0 < e / 2 /\ (x:real = y) ==> abs(x) <= e / &2 ==> abs(y) < e / 2 + e / 2``) THEN
15394   ASM_REWRITE_TAC[REAL_HALF] THEN ASM_SIMP_TAC std_ss [INTERVAL_SPLIT] THEN
15395   W(MP_TAC o PART_MATCH (lhand o rand)
15396     INTEGRAL_COMBINE_TAGGED_DIVISION_TOPDOWN o rand o rand o snd) THEN
15397   ASM_SIMP_TAC std_ss [GSYM INTERVAL_SPLIT, INTEGRABLE_SPLIT] THEN
15398   DISCH_THEN SUBST1_TAC THEN
15399   FIRST_ASSUM(ASSUME_TAC o MATCH_MP TAGGED_DIVISION_OF_FINITE) THEN
15400   ASM_SIMP_TAC std_ss [GSYM SUM_SUB] THEN MATCH_MP_TAC SUM_EQ THEN
15401   SIMP_TAC std_ss [FORALL_PROD])
15402QED
15403
15404(* ------------------------------------------------------------------------- *)
15405(* Main limit theorem for an equiintegrable sequence.                        *)
15406(* ------------------------------------------------------------------------- *)
15407
15408Theorem EQUIINTEGRABLE_LIMIT:
15409   !f g:real->real a b.
15410        {f n | n IN univ(:num)} equiintegrable_on interval[a,b] /\
15411        (!x. x IN interval[a,b] ==> ((\n. f n x) --> g x) sequentially)
15412        ==> g integrable_on interval[a,b] /\
15413            ((\n. integral(interval[a,b]) (f n)) --> integral(interval[a,b]) g)
15414            sequentially
15415Proof
15416  REPEAT GEN_TAC THEN STRIP_TAC THEN
15417  ASM_CASES_TAC ``content(interval[a:real,b]) = &0`` THEN
15418  ASM_SIMP_TAC std_ss [INTEGRABLE_ON_NULL, INTEGRAL_NULL, LIM_CONST] THEN
15419  SUBGOAL_THEN ``cauchy (\n. integral(interval[a,b]) (f n :real->real))``
15420  MP_TAC THENL
15421   [REWRITE_TAC[cauchy] THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
15422    UNDISCH_TAC ``{f n | n IN univ(:num)} equiintegrable_on interval [(a,b)]`` THEN
15423    DISCH_TAC THEN
15424    FIRST_ASSUM(MP_TAC o REWRITE_RULE [equiintegrable_on]) THEN
15425    SIMP_TAC std_ss [IMP_CONJ, RIGHT_FORALL_IMP_THM, FORALL_IN_GSPEC, IN_UNIV] THEN
15426    DISCH_TAC THEN REWRITE_TAC[AND_IMP_INTRO, GSYM CONJ_ASSOC] THEN
15427    DISCH_THEN(MP_TAC o SPEC ``e / &3:real``) THEN
15428    KNOW_TAC ``0 < e / 3:real`` THENL [UNDISCH_TAC ``0 < e:real`` THEN
15429     SIMP_TAC real_ss [REAL_LT_RDIV_EQ] THEN REAL_ARITH_TAC,
15430     DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
15431    DISCH_THEN(X_CHOOSE_THEN ``d:real->real->bool`` STRIP_ASSUME_TAC) THEN
15432    FIRST_ASSUM(MP_TAC o MATCH_MP FINE_DIVISION_EXISTS) THEN
15433    DISCH_THEN(MP_TAC o SPECL [``a:real``, ``b:real``]) THEN
15434    DISCH_THEN(X_CHOOSE_THEN ``p:(real#(real->bool))->bool``
15435        STRIP_ASSUME_TAC) THEN
15436    FIRST_ASSUM(ASSUME_TAC o MATCH_MP TAGGED_DIVISION_OF_FINITE) THEN
15437    FIRST_X_ASSUM(MP_TAC o GEN ``n:num`` o SPECL
15438     [``n:num``, ``p:(real#(real->bool))->bool``]) THEN
15439    ASM_REWRITE_TAC[] THEN DISCH_TAC THEN SUBGOAL_THEN
15440     ``cauchy (\n. sum p (\(x,k:real->bool).
15441               content k * (f:num->real->real) n x))``
15442    MP_TAC THENL
15443     [MATCH_MP_TAC CONVERGENT_IMP_CAUCHY THEN
15444      EXISTS_TAC ``sum p (\(x,k:real->bool).
15445          content k * (g:real->real) x)`` THEN
15446      MATCH_MP_TAC
15447       (SIMP_RULE std_ss [LAMBDA_PROD]
15448        (SIMP_RULE std_ss [FORALL_PROD]
15449         (ISPECL [``sequentially``, ``\(x:real,k:real->bool) (n:num).
15450                  content k * (f n x:real)``] LIM_SUM))) THEN
15451      ASM_SIMP_TAC std_ss [] THEN
15452      MAP_EVERY X_GEN_TAC [``x:real``, ``k:real->bool``] THEN DISCH_TAC THEN
15453      ONCE_REWRITE_TAC [METIS [] ``(\n. content k * f n x) =
15454                                   (\n. content k * (\n. f n x) n)``] THEN
15455      MATCH_MP_TAC LIM_CMUL THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
15456      UNDISCH_TAC ``p tagged_division_of interval [(a,b)]`` THEN DISCH_TAC THEN
15457      FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [TAGGED_DIVISION_OF]) THEN
15458      ASM_SIMP_TAC std_ss [SUBSET_DEF] THEN ASM_MESON_TAC[],
15459      REWRITE_TAC[cauchy] THEN DISCH_THEN(MP_TAC o SPEC ``e / &3:real``) THEN
15460      KNOW_TAC ``0 < e / 3:real`` THENL [UNDISCH_TAC ``0 < e:real`` THEN
15461       SIMP_TAC real_ss [REAL_LT_RDIV_EQ] THEN REAL_ARITH_TAC,
15462       DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
15463      SIMP_TAC std_ss [AND_IMP_INTRO, RIGHT_IMP_FORALL_THM, GE] THEN
15464      DISCH_THEN (X_CHOOSE_TAC ``N:num``) THEN EXISTS_TAC ``N:num`` THEN
15465      X_GEN_TAC ``m:num`` THEN X_GEN_TAC ``n:num`` THEN
15466      POP_ASSUM (MP_TAC o SPECL [``m:num``,``n:num``]) THEN
15467      ASM_CASES_TAC ``N:num <= m /\ N <= n`` THEN ASM_REWRITE_TAC[dist] THEN
15468      SIMP_TAC real_ss [REAL_LT_RDIV_EQ] THEN
15469      MATCH_MP_TAC(REAL_ARITH
15470       ``abs(sm - gm:real) * 3 < e /\ abs(sn - gn) * 3 < e
15471        ==> abs (sm - sn) * 3 < e ==> abs(gm - gn) < e:real``) THEN
15472      ASM_SIMP_TAC real_ss [GSYM REAL_LT_RDIV_EQ]],
15473
15474    REWRITE_TAC[GSYM CONVERGENT_EQ_CAUCHY] THEN
15475    DISCH_THEN(X_CHOOSE_TAC ``l:real``) THEN
15476    SUBGOAL_THEN ``((g:real->real) has_integral l) (interval[a,b])``
15477     (fn th => METIS_TAC[th, integrable_on, INTEGRAL_UNIQUE]) THEN
15478    REWRITE_TAC[has_integral] THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
15479    UNDISCH_TAC ``{f n | n IN univ(:num)} equiintegrable_on interval [(a,b)]`` THEN
15480    DISCH_TAC THEN
15481    FIRST_ASSUM(MP_TAC o REWRITE_RULE [equiintegrable_on]) THEN
15482    SIMP_TAC std_ss [IMP_CONJ, RIGHT_FORALL_IMP_THM, FORALL_IN_GSPEC, IN_UNIV] THEN
15483    DISCH_TAC THEN SIMP_TAC std_ss [AND_IMP_INTRO, GSYM CONJ_ASSOC] THEN
15484    DISCH_THEN(MP_TAC o SPEC ``e / &2:real``) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
15485    DISCH_THEN (X_CHOOSE_TAC ``d:real->real->bool``) THEN
15486    EXISTS_TAC ``d:real->real->bool`` THEN POP_ASSUM MP_TAC THEN
15487    STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
15488    X_GEN_TAC ``p:(real#(real->bool))->bool`` THEN STRIP_TAC THEN
15489    GEN_REWR_TAC (RAND_CONV) [GSYM REAL_HALF] THEN
15490    MATCH_MP_TAC(REAL_ARITH
15491     ``&0 < e / 2 /\ x <= e / &2 ==> x < e / 2 + e / 2:real``) THEN
15492    ASM_REWRITE_TAC[REAL_HALF] THEN
15493    MATCH_MP_TAC(ISPEC ``sequentially`` LIM_ABS_UBOUND) THEN
15494    EXISTS_TAC ``\n:num. sum p (\(x,k:real->bool). content k * f n x) -
15495                       integral (interval [a,b]) (f n :real->real)`` THEN
15496    ASM_SIMP_TAC std_ss [TRIVIAL_LIMIT_SEQUENTIALLY, REAL_LT_IMP_LE] THEN
15497    REWRITE_TAC[EVENTUALLY_TRUE] THEN
15498    ONCE_REWRITE_TAC [METIS []
15499     ``(\n. sum p (\(x,k). content k * f n x) -
15500            integral (interval [(a,b)]) (f n)) =
15501       (\n. (\n. sum p (\(x,k). content k * f n x)) n -
15502            (\n. integral (interval [(a,b)]) (f n)) n)``] THEN
15503    MATCH_MP_TAC LIM_SUB THEN ASM_SIMP_TAC std_ss [] THEN
15504    FIRST_ASSUM(ASSUME_TAC o MATCH_MP TAGGED_DIVISION_OF_FINITE) THEN
15505    MATCH_MP_TAC
15506     (SIMP_RULE std_ss [LAMBDA_PROD]
15507      (SIMP_RULE std_ss [FORALL_PROD]
15508       (ISPECL [``sequentially``, ``\(x:real,k:real->bool) (n:num).
15509                content k * (f n x:real)``] LIM_SUM))) THEN
15510    ASM_REWRITE_TAC [] THEN
15511    MAP_EVERY X_GEN_TAC [``x:real``, ``k:real->bool``] THEN DISCH_TAC THEN
15512    SIMP_TAC std_ss [] THEN
15513    ONCE_REWRITE_TAC[METIS [] ``(\n. content k * f n x) =
15514                                (\n. content k * (\n. f n x) n)``] THEN
15515    MATCH_MP_TAC LIM_CMUL THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
15516    UNDISCH_TAC ``p tagged_division_of interval [(a,b)]`` THEN DISCH_TAC THEN
15517    FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [TAGGED_DIVISION_OF]) THEN
15518    ASM_SIMP_TAC std_ss [SUBSET_DEF] THEN ASM_MESON_TAC[]]
15519QED
15520
15521(* ------------------------------------------------------------------------- *)
15522(* Combining theorems for the set of equiintegrable functions.               *)
15523(* ------------------------------------------------------------------------- *)
15524
15525Theorem EQUIINTEGRABLE_SUBSET:
15526   !fs gs s.
15527   fs equiintegrable_on s /\ gs SUBSET fs ==> gs equiintegrable_on s
15528Proof
15529  REWRITE_TAC[equiintegrable_on, SUBSET_DEF] THEN METIS_TAC[]
15530QED
15531
15532Theorem EQUIINTEGRABLE_UNION:
15533   !fs:(real->real)->bool gs s.
15534        fs equiintegrable_on s /\ gs equiintegrable_on s
15535        ==> (fs UNION gs) equiintegrable_on s
15536Proof
15537  REPEAT GEN_TAC THEN REWRITE_TAC[equiintegrable_on, IN_UNION] THEN
15538  REWRITE_TAC[TAUT `a \/ b ==> c <=> (a ==> c) /\ (b ==> c)`] THEN
15539  SIMP_TAC std_ss [FORALL_AND_THM] THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
15540  X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
15541  REPEAT(FIRST_X_ASSUM(MP_TAC o SPEC ``e:real``)) THEN ASM_REWRITE_TAC[] THEN
15542  DISCH_THEN(X_CHOOSE_THEN ``d1:real->real->bool`` STRIP_ASSUME_TAC) THEN
15543  DISCH_THEN(X_CHOOSE_THEN ``d2:real->real->bool`` STRIP_ASSUME_TAC) THEN
15544  EXISTS_TAC ``\x. (d1:real->real->bool) x INTER d2 x`` THEN
15545  ASM_SIMP_TAC std_ss [GAUGE_INTER, FINE_INTER] THEN
15546  REPEAT STRIP_TAC THEN ASM_SIMP_TAC std_ss []
15547QED
15548
15549Theorem EQUIINTEGRABLE_EQ:
15550   !fs gs:(real->real)->bool s.
15551        fs equiintegrable_on s /\
15552        (!g. g IN gs ==> ?f. f IN fs /\ (!x. x IN s ==> (f x = g x)))
15553        ==> gs equiintegrable_on s
15554Proof
15555  REPEAT GEN_TAC THEN REWRITE_TAC[equiintegrable_on] THEN
15556  DISCH_THEN(CONJUNCTS_THEN2 STRIP_ASSUME_TAC ASSUME_TAC) THEN
15557  CONJ_TAC THENL
15558   [X_GEN_TAC ``g:real->real`` THEN DISCH_TAC THEN
15559    UNDISCH_TAC ``!g:real->real. g IN gs ==> ?f. f IN fs /\ !x. x IN s ==>
15560                 (f x = g x)`` THEN DISCH_TAC THEN
15561    FIRST_X_ASSUM (MP_TAC o SPEC ``g:real->real``) THEN
15562    ASM_SIMP_TAC std_ss [LEFT_IMP_EXISTS_THM] THEN
15563    X_GEN_TAC ``f:real->real`` THEN STRIP_TAC THEN
15564    FIRST_X_ASSUM(MP_TAC o SPEC ``f:real->real``) THEN
15565    ASM_MESON_TAC[INTEGRABLE_SPIKE, IN_DIFF, NEGLIGIBLE_EMPTY],
15566    X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
15567    FIRST_X_ASSUM(MP_TAC o SPEC ``e:real``) THEN ASM_REWRITE_TAC[] THEN
15568    DISCH_THEN (X_CHOOSE_TAC ``d:real->real->bool``) THEN
15569    EXISTS_TAC ``d:real->real->bool`` THEN POP_ASSUM MP_TAC THEN
15570    STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
15571    MAP_EVERY X_GEN_TAC
15572     [``g:real->real``, ``p:(real#(real->bool))->bool``] THEN STRIP_TAC THEN
15573    UNDISCH_TAC ``!g:real->real. g IN gs ==> ?f. f IN fs /\ !x. x IN s ==>
15574                 (f x = g x)`` THEN DISCH_TAC THEN
15575    FIRST_X_ASSUM (MP_TAC o SPEC ``g:real->real``) THEN
15576    ASM_SIMP_TAC std_ss [LEFT_IMP_EXISTS_THM] THEN
15577    X_GEN_TAC ``f:real->real`` THEN STRIP_TAC THEN
15578    FIRST_X_ASSUM(MP_TAC o SPECL
15579     [``f:real->real``, ``p:(real#(real->bool))->bool``]) THEN
15580    ASM_REWRITE_TAC[] THEN MATCH_MP_TAC(MESON[]
15581     ``(x:real = y) /\ (a = b) ==> abs(x - a) < e ==> abs(y - b) < e:real``) THEN
15582    CONJ_TAC THENL
15583     [MATCH_MP_TAC SUM_EQ THEN SIMP_TAC std_ss [FORALL_PROD] THEN
15584      RULE_ASSUM_TAC(REWRITE_RULE[TAGGED_DIVISION_OF, SUBSET_DEF]) THEN
15585      ASM_MESON_TAC[],
15586      ASM_MESON_TAC[INTEGRAL_EQ]]]
15587QED
15588
15589Theorem EQUIINTEGRABLE_CMUL:
15590   !fs:(real->real)->bool s k.
15591        fs equiintegrable_on s
15592        ==> {(\x. c * f x) | abs(c) <= k /\ f IN fs} equiintegrable_on s
15593Proof
15594  REPEAT GEN_TAC THEN
15595  SIMP_TAC std_ss [equiintegrable_on, INTEGRABLE_CMUL, FORALL_IN_GSPEC] THEN
15596  STRIP_TAC THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
15597  SIMP_TAC std_ss [IMP_CONJ, RIGHT_FORALL_IMP_THM, FORALL_IN_GSPEC] THEN
15598  ASM_SIMP_TAC std_ss [RIGHT_IMP_FORALL_THM, INTEGRAL_CMUL, AND_IMP_INTRO] THEN
15599  FIRST_X_ASSUM(MP_TAC o SPEC ``e / (abs(k) + &1:real)``) THEN
15600  ASM_SIMP_TAC std_ss [REAL_LT_RDIV_EQ, REAL_MUL_LZERO,
15601               REAL_ARITH ``&0 < abs(k) + &1:real``] THEN
15602  DISCH_THEN (X_CHOOSE_TAC ``d:real->real->bool``) THEN
15603    EXISTS_TAC ``d:real->real->bool`` THEN POP_ASSUM MP_TAC THEN
15604  STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
15605  MAP_EVERY X_GEN_TAC [``c:real``, ``f:real->real``,
15606                       ``p:(real#(real->bool))->bool``] THEN
15607  STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o
15608   SPECL [``f:real->real``, ``p:(real#(real->bool))->bool``]) THEN
15609  ASM_REWRITE_TAC[] THEN
15610  MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] REAL_LET_TRANS) THEN
15611  MATCH_MP_TAC(REAL_ARITH ``&0 <= y /\ x <= c * y ==> x <= y * (c + &1:real)``) THEN
15612  REWRITE_TAC[ABS_POS] THEN MATCH_MP_TAC(REAL_ARITH
15613   ``!c. (x = c * y) /\ c *  y <= k * y ==> x <= k * y:real``) THEN
15614  EXISTS_TAC ``abs c:real`` THEN CONJ_TAC THENL
15615   [REWRITE_TAC[GSYM ABS_MUL, GSYM SUM_LMUL, REAL_SUB_LDISTRIB] THEN
15616    SIMP_TAC std_ss [LAMBDA_PROD, REAL_MUL_ASSOC] THEN
15617    SIMP_TAC std_ss [REAL_MUL_SYM],
15618    MATCH_MP_TAC REAL_LE_RMUL_IMP THEN REWRITE_TAC[ABS_POS] THEN
15619    UNDISCH_TAC ``abs c <= k:real`` THEN REAL_ARITH_TAC]
15620QED
15621
15622Theorem EQUIINTEGRABLE_ADD:
15623   !fs:(real->real)->bool gs s.
15624        fs equiintegrable_on s /\ gs equiintegrable_on s
15625        ==> {(\x. f x + g x) | f IN fs /\ g IN gs} equiintegrable_on s
15626Proof
15627  REPEAT GEN_TAC THEN
15628  SIMP_TAC std_ss [equiintegrable_on, INTEGRABLE_ADD, FORALL_IN_GSPEC] THEN
15629  DISCH_THEN(CONJUNCTS_THEN2
15630   (CONJUNCTS_THEN2 ASSUME_TAC ASSUME_TAC)
15631   (CONJUNCTS_THEN2 ASSUME_TAC ASSUME_TAC)) THEN
15632  X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
15633  SIMP_TAC std_ss [IMP_CONJ, RIGHT_FORALL_IMP_THM, FORALL_IN_GSPEC] THEN
15634  ASM_SIMP_TAC std_ss [RIGHT_IMP_FORALL_THM, INTEGRAL_ADD, AND_IMP_INTRO] THEN
15635  FIRST_X_ASSUM (MP_TAC o SPEC ``e / &2:real``) THEN
15636  FIRST_X_ASSUM (MP_TAC o SPEC ``e / &2:real``) THEN
15637  ASM_REWRITE_TAC[REAL_HALF] THEN
15638  DISCH_THEN(X_CHOOSE_THEN ``d1:real->real->bool``
15639   (CONJUNCTS_THEN2 ASSUME_TAC ASSUME_TAC)) THEN
15640  DISCH_THEN(X_CHOOSE_THEN ``d2:real->real->bool``
15641   (CONJUNCTS_THEN2 ASSUME_TAC ASSUME_TAC)) THEN
15642  EXISTS_TAC ``\x. (d1:real->real->bool) x INTER d2 x`` THEN
15643  ASM_SIMP_TAC std_ss [GAUGE_INTER, FINE_INTER] THEN
15644  MAP_EVERY X_GEN_TAC [``f:real->real``, ``g:real->real``,
15645                       ``p:(real#(real->bool))->bool``] THEN STRIP_TAC THEN
15646  FIRST_X_ASSUM (MP_TAC o SPECL
15647   [``g:real->real``, ``p:(real#(real->bool))->bool``]) THEN
15648  FIRST_X_ASSUM (MP_TAC o SPECL
15649   [``f:real->real``, ``p:(real#(real->bool))->bool``]) THEN
15650  ASM_REWRITE_TAC[] THEN
15651  GEN_REWR_TAC (RAND_CONV o RAND_CONV o RAND_CONV) [GSYM REAL_HALF] THEN
15652  MATCH_MP_TAC(REAL_ARITH
15653   ``(s + s' = t)
15654    ==> abs(s - i) < e / &2 ==> abs(s' - i') < e / &2
15655        ==> abs(t - (i + i')) < e / 2 + e / 2:real``) THEN
15656  FIRST_ASSUM(ASSUME_TAC o MATCH_MP TAGGED_DIVISION_OF_FINITE) THEN
15657  ASM_SIMP_TAC std_ss [GSYM SUM_ADD] THEN
15658  SIMP_TAC std_ss [LAMBDA_PROD, REAL_ADD_LDISTRIB]
15659QED
15660
15661Theorem EQUIINTEGRABLE_NEG:
15662   !fs:(real->real)->bool s.
15663        fs equiintegrable_on s
15664        ==> {(\x. -(f x)) | f IN fs} equiintegrable_on s
15665Proof
15666  REPEAT STRIP_TAC THEN
15667  FIRST_ASSUM(MP_TAC o SPEC ``&1:real`` o MATCH_MP EQUIINTEGRABLE_CMUL) THEN
15668  MATCH_MP_TAC (REWRITE_RULE[IMP_CONJ_ALT] EQUIINTEGRABLE_SUBSET) THEN
15669  SIMP_TAC std_ss [SUBSET_DEF, FORALL_IN_GSPEC] THEN
15670  SIMP_TAC std_ss [GSPECIFICATION, EXISTS_PROD] THEN
15671  X_GEN_TAC ``f:real->real`` THEN DISCH_TAC THEN EXISTS_TAC ``- &1:real`` THEN
15672  EXISTS_TAC ``f:real->real`` THEN
15673  ASM_REWRITE_TAC[REAL_MUL_LNEG, REAL_MUL_LID] THEN REAL_ARITH_TAC
15674QED
15675
15676Theorem EQUIINTEGRABLE_SUB:
15677   !fs:(real->real)->bool gs s.
15678        fs equiintegrable_on s /\ gs equiintegrable_on s
15679        ==> {(\x. f x - g x) | f IN fs /\ g IN gs} equiintegrable_on s
15680Proof
15681  REPEAT GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2
15682   MP_TAC (MP_TAC o MATCH_MP EQUIINTEGRABLE_NEG)) THEN
15683  REWRITE_TAC[GSYM IMP_CONJ_ALT] THEN
15684  DISCH_THEN(MP_TAC o MATCH_MP EQUIINTEGRABLE_ADD) THEN
15685  MATCH_MP_TAC (REWRITE_RULE[IMP_CONJ_ALT] EQUIINTEGRABLE_SUBSET) THEN
15686  SIMP_TAC std_ss [SUBSET_DEF, FORALL_IN_GSPEC] THEN
15687  SIMP_TAC std_ss [GSPECIFICATION, EXISTS_PROD] THEN
15688  MAP_EVERY X_GEN_TAC [``f:real->real``, ``g:real->real``] THEN
15689  STRIP_TAC THEN EXISTS_TAC ``f:real->real`` THEN
15690  EXISTS_TAC ``\x. -((g:real->real) x)`` THEN
15691  ASM_SIMP_TAC std_ss [real_sub] THEN EXISTS_TAC ``g:real->real`` THEN
15692  ASM_REWRITE_TAC[]
15693QED
15694
15695Theorem EQUIINTEGRABLE_SUM:
15696   !fs:(real->real)->bool a b.
15697        fs equiintegrable_on interval[a,b]
15698        ==> {(\x. sum t (\i. c i * f i x)) |
15699               FINITE t /\
15700               (!i:'a. i IN t ==> &0 <= c i /\ (f i) IN fs) /\
15701               (sum t c = &1)}
15702            equiintegrable_on interval[a,b]
15703Proof
15704  REPEAT GEN_TAC THEN REWRITE_TAC[equiintegrable_on] THEN
15705  SIMP_TAC std_ss [IMP_CONJ, RIGHT_FORALL_IMP_THM, FORALL_IN_GSPEC] THEN
15706  SIMP_TAC std_ss [AND_IMP_INTRO, GSYM CONJ_ASSOC, RIGHT_IMP_FORALL_THM] THEN
15707  STRIP_TAC THEN CONJ_TAC THENL
15708  [REPEAT STRIP_TAC THEN
15709   ONCE_REWRITE_TAC [METIS []
15710    ``(\x. sum t (\i. c i * f i x)) = (\x. sum t (\i. (\i x. c i * f i x) i x))``] THEN
15711   MATCH_MP_TAC INTEGRABLE_SUM THEN ASM_SIMP_TAC std_ss [] THEN GEN_TAC THEN
15712   STRIP_TAC THEN MATCH_MP_TAC INTEGRABLE_CMUL THEN FIRST_ASSUM MATCH_MP_TAC THEN
15713   METIS_TAC [], ALL_TAC] THEN ASM_SIMP_TAC std_ss [INTEGRAL_SUM] THEN
15714  X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
15715  FIRST_X_ASSUM(MP_TAC o SPEC ``e / &2:real``) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
15716  DISCH_THEN (X_CHOOSE_TAC ``d:real->real->bool``) THEN
15717  EXISTS_TAC ``d:real->real->bool`` THEN POP_ASSUM MP_TAC THEN
15718  STRIP_TAC THEN ASM_REWRITE_TAC[] THEN MAP_EVERY X_GEN_TAC
15719   [``t:'a->bool``, ``c:'a->real``, ``f:'a->real->real``,
15720    ``p:(real#(real->bool))->bool``] THEN
15721  STRIP_TAC THEN
15722  SUBGOAL_THEN
15723   ``!i:'a. i IN t
15724          ==> (integral (interval[a,b]) (\x:real. c i * f i x:real) =
15725               sum p (\(x:real,k).
15726                       integral (k:real->bool) (\x:real. c i * f i x)))``
15727   (fn th => SIMP_TAC std_ss [th])
15728  THENL
15729   [REPEAT STRIP_TAC THEN
15730    MATCH_MP_TAC INTEGRAL_COMBINE_TAGGED_DIVISION_TOPDOWN THEN
15731   METIS_TAC [INTEGRABLE_CMUL, ETA_AX],
15732    ALL_TAC] THEN
15733  FIRST_ASSUM(ASSUME_TAC o MATCH_MP TAGGED_DIVISION_OF_FINITE) THEN
15734  SUBGOAL_THEN
15735   ``sum p (\(x,k:real->bool). content k * sum t (\i. c i * f i x)) =
15736     sum t (\i. c i *
15737                sum p (\(x,k). content k * (f:'a->real->real) i x))``
15738  SUBST1_TAC THENL
15739   [SIMP_TAC std_ss [GSYM SUM_LMUL] THEN
15740    ONCE_REWRITE_TAC [METIS []
15741     ``(\i. sum p (\x. c i * (\(x,k). content k * f i x) x)) =
15742       (\i. sum p ((\i. (\x. c i * (\(x,k). content k * f i x) x)) i))``] THEN
15743    W(MP_TAC o PART_MATCH (lhs o rand) SUM_SWAP o
15744      rand o snd) THEN
15745    ASM_REWRITE_TAC[] THEN DISCH_THEN SUBST1_TAC THEN
15746    MATCH_MP_TAC SUM_EQ THEN SIMP_TAC std_ss [FORALL_PROD, REAL_MUL_ASSOC] THEN
15747    REPEAT STRIP_TAC THEN GEN_REWR_TAC (RAND_CONV o ONCE_DEPTH_CONV)
15748     [REAL_ARITH ``a * b * c = b * a * c:real``] THEN SIMP_TAC std_ss [],
15749    ALL_TAC] THEN
15750  MATCH_MP_TAC REAL_LET_TRANS THEN
15751  EXISTS_TAC ``sum t (\i:'a. c i * e / &2)`` THEN CONJ_TAC THENL
15752   [ALL_TAC,
15753    ASM_SIMP_TAC real_ss [real_div, SUM_RMUL, ETA_AX, REAL_MUL_LID] THEN
15754    REWRITE_TAC [GSYM real_div] THEN SIMP_TAC real_ss [REAL_LT_LDIV_EQ] THEN
15755    UNDISCH_TAC ``0 < e:real`` THEN REAL_ARITH_TAC] THEN
15756  KNOW_TAC ``integral (interval [(a,b)]) (\x. sum t (\i. c i * f i x)) =
15757             integral (interval [(a,b)]) (\x. sum t (\i. (\i x. c i * f i x) i x))`` THENL
15758  [SIMP_TAC std_ss [], DISCH_THEN (fn th => REWRITE_TAC [th])] THEN
15759  KNOW_TAC ``integral (interval [(a,b)]) (\x. sum t (\i. (\i x. c i * f i x) i x)) =
15760             sum t (\i. integral (interval [(a,b)]) ((\i x. c i * f i x) i))`` THENL
15761   [MATCH_MP_TAC INTEGRAL_SUM THEN ASM_SIMP_TAC std_ss [] THEN
15762    REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRABLE_CMUL THEN METIS_TAC [],
15763    SIMP_TAC std_ss [] THEN DISCH_THEN (fn th => SIMP_TAC std_ss [th])] THEN
15764  ASM_SIMP_TAC std_ss [GSYM SUM_SUB] THEN MATCH_MP_TAC SUM_ABS_LE THEN
15765  ASM_REWRITE_TAC[] THEN X_GEN_TAC ``i:'a`` THEN DISCH_TAC THEN
15766  ASM_SIMP_TAC std_ss [GSYM SUM_LMUL, GSYM SUM_SUB] THEN
15767  SIMP_TAC std_ss [LAMBDA_PROD] THEN FIRST_X_ASSUM(MP_TAC o SPECL
15768   [``(f:'a->real->real) i``, ``p:(real#(real->bool))->bool``]) THEN
15769  ASM_SIMP_TAC std_ss [] THEN DISCH_THEN(MP_TAC o MATCH_MP REAL_LT_IMP_LE) THEN
15770  DISCH_THEN(MP_TAC o SPEC ``abs((c:'a->real) i)`` o
15771    MATCH_MP(SIMP_RULE std_ss [IMP_CONJ_ALT] REAL_LE_LMUL_IMP)) THEN
15772  ASM_REWRITE_TAC[ABS_POS, GSYM ABS_MUL] THEN
15773  ASM_SIMP_TAC std_ss [GSYM SUM_LMUL, REAL_SUB_LDISTRIB] THEN
15774  KNOW_TAC `` abs ((c:'a->real) i) = c i`` THENL
15775  [ASM_SIMP_TAC std_ss [abs], DISCH_THEN (fn th => REWRITE_TAC [th])] THEN
15776  SIMP_TAC std_ss [LAMBDA_PROD] THEN
15777  REWRITE_TAC [REAL_MUL_ASSOC, real_div] THEN
15778  MATCH_MP_TAC(REAL_ARITH ``(x = y) ==> x <= a ==> y <= a:real``) THEN
15779  AP_TERM_TAC THEN
15780  KNOW_TAC
15781  ``integral (interval [(a,b)]) (\(x :real). c i * (f :'a -> real -> real) i x) =
15782             (c:'a->real) i * integral (interval [(a,b)]) (f i)`` THENL
15783  [MATCH_MP_TAC INTEGRAL_CMUL THEN METIS_TAC [],
15784   DISCH_THEN (fn th => REWRITE_TAC [th])]
15785QED
15786
15787Theorem EQUIINTEGRABLE_UNIFORM_LIMIT:
15788   !fs:(real->real)->bool a b.
15789        fs equiintegrable_on interval[a,b]
15790        ==> {g | !e. &0 < e
15791                     ==> ?f. f IN fs /\
15792                             !x. x IN interval[a,b] ==> abs(g x - f x) < e}
15793            equiintegrable_on interval[a,b]
15794Proof
15795  REPEAT STRIP_TAC THEN
15796  FIRST_ASSUM(MP_TAC o REWRITE_RULE [equiintegrable_on]) THEN
15797  SIMP_TAC std_ss [equiintegrable_on, GSPECIFICATION] THEN REPEAT GEN_TAC THEN
15798  STRIP_TAC THEN CONJ_TAC THENL
15799   [ASM_MESON_TAC[INTEGRABLE_UNIFORM_LIMIT, REAL_LT_IMP_LE], ALL_TAC] THEN
15800  X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
15801  FIRST_X_ASSUM(MP_TAC o SPEC ``e / &2:real``) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
15802  DISCH_THEN (X_CHOOSE_TAC ``d:real->real->bool``) THEN
15803  EXISTS_TAC ``d:real->real->bool`` THEN POP_ASSUM MP_TAC THEN
15804  STRIP_TAC THEN ASM_REWRITE_TAC[] THEN MAP_EVERY X_GEN_TAC
15805   [``g:real->real``,``p:(real#(real->bool))->bool``] THEN
15806  STRIP_TAC THEN
15807  FIRST_ASSUM(ASSUME_TAC o MATCH_MP TAGGED_DIVISION_OF_FINITE) THEN
15808  SUBGOAL_THEN ``(g:real->real) integrable_on interval[a,b]``
15809  ASSUME_TAC THENL
15810   [ASM_MESON_TAC[INTEGRABLE_UNIFORM_LIMIT, REAL_LT_IMP_LE], ALL_TAC] THEN
15811  FIRST_X_ASSUM(MP_TAC o GEN ``n:num`` o SPEC ``inv(&n + &1:real)``) THEN
15812  SIMP_TAC std_ss [REAL_LT_INV_EQ,
15813   METIS [REAL_LT, REAL_OF_NUM_ADD, GSYM ADD1, LESS_0] ``&0 < &n + &1:real``] THEN
15814  SIMP_TAC std_ss [SKOLEM_THM, FORALL_AND_THM, LEFT_IMP_EXISTS_THM] THEN
15815  X_GEN_TAC ``f:num->real->real`` THEN STRIP_TAC THEN
15816  SUBGOAL_THEN
15817   ``!x. x IN interval[a,b]
15818        ==> ((\n. f n x) --> (g:real->real) x) sequentially``
15819  ASSUME_TAC THENL
15820   [X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN
15821    REWRITE_TAC[LIM_SEQUENTIALLY] THEN X_GEN_TAC ``k:real`` THEN DISCH_TAC THEN
15822    MP_TAC(SPEC ``k:real`` REAL_ARCH_INV) THEN ASM_REWRITE_TAC[] THEN
15823    DISCH_THEN (X_CHOOSE_TAC ``N:num``) THEN EXISTS_TAC ``N:num`` THEN
15824    POP_ASSUM MP_TAC THEN STRIP_TAC THEN
15825    X_GEN_TAC ``n:num`` THEN DISCH_TAC THEN REWRITE_TAC [dist] THEN
15826    ONCE_REWRITE_TAC[REAL_ARITH ``abs(a:real - b) = abs(b - a)``] THEN
15827    MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC ``inv(&n + &1:real)`` THEN
15828    ASM_SIMP_TAC std_ss [] THEN
15829    MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC ``inv(&N:real)`` THEN
15830    ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_LE_INV2 THEN
15831    REWRITE_TAC[REAL_OF_NUM_ADD, REAL_OF_NUM_LE, REAL_LT] THEN
15832    ASM_SIMP_TAC arith_ss [],
15833    ALL_TAC] THEN
15834  MP_TAC(ISPECL [``f:num->real->real``, ``g:real->real``,
15835                 ``a:real``, ``b:real``] EQUIINTEGRABLE_LIMIT) THEN
15836  KNOW_TAC ``{f n | n IN univ(:num)} equiintegrable_on interval [(a,b)] /\
15837   (!x. x IN interval [(a,b)] ==> ((\n. f n x) --> g x) sequentially)`` THENL
15838   [ASM_REWRITE_TAC[] THEN MATCH_MP_TAC EQUIINTEGRABLE_SUBSET THEN
15839    EXISTS_TAC ``fs:(real->real)->bool`` THEN ASM_SET_TAC[],
15840    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
15841    DISCH_TAC] THEN
15842  SUBGOAL_THEN
15843   ``((\n. sum p (\(x,k:real->bool).
15844                    content k * (f:num->real->real) n x)) -->
15845     sum p (\(x,k). content k * g x)) sequentially``
15846   ASSUME_TAC
15847  THENL
15848   [MATCH_MP_TAC
15849       (SIMP_RULE std_ss [LAMBDA_PROD]
15850        (SIMP_RULE std_ss [FORALL_PROD]
15851         (ISPECL [``sequentially``, ``\(x:real,k:real->bool) (n:num).
15852                  content k * (f n x:real)``] LIM_SUM))) THEN
15853    ASM_REWRITE_TAC[] THEN
15854    MAP_EVERY X_GEN_TAC [``x:real``, ``k:real->bool``] THEN DISCH_TAC THEN
15855    SIMP_TAC std_ss [] THEN
15856    ONCE_REWRITE_TAC [METIS [] ``(\n. content k * f n x) =
15857                                 (\n. content k * (\n. f n x) n)``] THEN
15858    MATCH_MP_TAC LIM_CMUL THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
15859    UNDISCH_TAC ``p tagged_division_of interval [(a,b)]`` THEN DISCH_TAC THEN
15860    FIRST_X_ASSUM(MP_TAC o SIMP_RULE std_ss [TAGGED_DIVISION_OF]) THEN
15861    ASM_SIMP_TAC std_ss [SUBSET_DEF] THEN ASM_MESON_TAC[],
15862    ALL_TAC] THEN
15863  FIRST_X_ASSUM (MP_TAC o REWRITE_RULE[LIM_SEQUENTIALLY]) THEN
15864  DISCH_THEN(MP_TAC o SPEC ``e / &4:real``) THEN
15865  KNOW_TAC ``0 < e / 4:real`` THENL
15866  [UNDISCH_TAC ``0 < e:real`` THEN SIMP_TAC real_ss [REAL_LT_RDIV_EQ] THEN
15867   REAL_ARITH_TAC, DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
15868  DISCH_THEN(X_CHOOSE_THEN ``N1:num`` ASSUME_TAC) THEN
15869  UNDISCH_TAC ``((\n. integral (interval [(a,b)]) (f n)) -->
15870        integral (interval [(a,b)]) g) sequentially`` THEN DISCH_TAC THEN
15871  FIRST_X_ASSUM (MP_TAC o REWRITE_RULE[LIM_SEQUENTIALLY]) THEN
15872  DISCH_THEN(MP_TAC o SPEC ``e / &4:real``) THEN
15873  KNOW_TAC ``0 < e / 4:real`` THENL
15874  [UNDISCH_TAC ``0 < e:real`` THEN SIMP_TAC real_ss [REAL_LT_RDIV_EQ] THEN
15875   REAL_ARITH_TAC, DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
15876  DISCH_THEN(X_CHOOSE_THEN ``N2:num`` ASSUME_TAC) THEN
15877  SUBGOAL_THEN ``?n:num. N1 <= n /\ N2 <= n`` STRIP_ASSUME_TAC THENL
15878   [EXISTS_TAC ``N1 + N2:num`` THEN ARITH_TAC, ALL_TAC] THEN
15879  FIRST_X_ASSUM (MP_TAC o SPEC ``n:num``) THEN
15880  FIRST_X_ASSUM (MP_TAC o SPEC ``n:num``) THEN
15881  FIRST_X_ASSUM(MP_TAC o SPECL
15882   [``(f:num->real->real) n``, ``p:(real#(real->bool))->bool``]) THEN
15883  ASM_SIMP_TAC real_ss [dist, REAL_LT_RDIV_EQ] THEN REAL_ARITH_TAC
15884QED
15885
15886Theorem lemma[local]:
15887     (!x k. (x,k) IN IMAGE (\(x,k). f x k,g x k) s ==> Q x k) <=>
15888     (!x k. (x,k) IN s ==> Q (f x k) (g x k))
15889Proof
15890  SIMP_TAC std_ss [IN_IMAGE, PAIR_EQ, EXISTS_PROD] THEN SET_TAC[]
15891QED
15892
15893Theorem EQUIINTEGRABLE_REFLECT :
15894    !(fs :(real->real)->bool) a b.
15895        fs equiintegrable_on interval[a,b]
15896        ==> {(\x. f(-x)) | f IN fs} equiintegrable_on interval[-b,-a]
15897Proof
15898  REPEAT GEN_TAC THEN REWRITE_TAC[equiintegrable_on] THEN
15899  SIMP_TAC std_ss [RIGHT_FORALL_IMP_THM, IMP_CONJ, FORALL_IN_GSPEC] THEN
15900  DISCH_TAC THEN DISCH_TAC THEN
15901  ASM_SIMP_TAC std_ss [INTEGRABLE_REFLECT, INTEGRAL_REFLECT] THEN
15902  X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
15903  FIRST_X_ASSUM(MP_TAC o SPEC ``e:real``) THEN ASM_REWRITE_TAC[] THEN
15904  POP_ASSUM MP_TAC THEN POP_ASSUM K_TAC THEN DISCH_TAC THEN
15905  DISCH_THEN(X_CHOOSE_THEN ``d:real->real->bool`` STRIP_ASSUME_TAC) THEN
15906  EXISTS_TAC ``\x. IMAGE (\x. -x) ((d:real->real->bool) (-x))`` THEN
15907  CONJ_TAC THENL
15908   [UNDISCH_TAC ``gauge d`` THEN DISCH_TAC THEN
15909    FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [gauge_def]) THEN
15910    SIMP_TAC std_ss [gauge_def, OPEN_NEGATIONS] THEN DISCH_TAC THEN
15911    GEN_TAC THEN GEN_REWR_TAC LAND_CONV [GSYM REAL_NEG_NEG] THEN
15912    ASM_SIMP_TAC std_ss [FUN_IN_IMAGE],
15913    ALL_TAC] THEN
15914  X_GEN_TAC ``f:real->real`` THEN DISCH_TAC THEN
15915  X_GEN_TAC ``p:real#(real->bool)->bool`` THEN REPEAT DISCH_TAC THEN
15916  FIRST_X_ASSUM(MP_TAC o SPEC ``f:real->real``) THEN ASM_REWRITE_TAC[] THEN
15917  DISCH_THEN(MP_TAC o SPEC
15918   ``IMAGE (\(x,k). (-x:real,IMAGE (\x. -x) (k:real->bool))) p``) THEN
15919  KNOW_TAC ``IMAGE (\(x,k). (-x,IMAGE (\x. -x) k)) p tagged_division_of
15920             interval [(a,b)]`` THENL
15921  [ (* goal 1 (of 2) *)
15922    UNDISCH_TAC ``p tagged_division_of interval [(-b,-a)]`` THEN DISCH_TAC THEN
15923    FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [TAGGED_DIVISION_OF]) THEN
15924    REWRITE_TAC[TAGGED_DIVISION_OF] THEN
15925    STRIP_TAC THEN ASM_SIMP_TAC std_ss [IMAGE_FINITE] THEN
15926    SIMP_TAC std_ss [RIGHT_FORALL_IMP_THM, IMP_CONJ, lemma] THEN
15927    REPEAT CONJ_TAC THENL (* 3 subgoals *)
15928    [ (* goal 1.1 (of 3) *)
15929      MAP_EVERY X_GEN_TAC [``x:real``, ``k:real->bool``] THEN DISCH_TAC THEN
15930      ASM_SIMP_TAC std_ss [FUN_IN_IMAGE] THEN CONJ_TAC THENL
15931       [SIMP_TAC std_ss [SUBSET_DEF, FORALL_IN_IMAGE] THEN
15932        ONCE_REWRITE_TAC[GSYM IN_INTERVAL_REFLECT] THEN
15933        ASM_SIMP_TAC std_ss [REAL_NEG_NEG, GSYM SUBSET_DEF] THEN ASM_MESON_TAC[],
15934        SIMP_TAC std_ss [EXTENSION, IN_IMAGE] THEN
15935        REWRITE_TAC[REAL_ARITH ``(x:real = -y) <=> (-x = y)``] THEN
15936        ONCE_REWRITE_TAC[GSYM IN_INTERVAL_REFLECT] THEN
15937        SIMP_TAC std_ss [UNWIND_THM1] THEN
15938        SUBGOAL_THEN ``?u v:real. k = interval[u,v]``
15939         (REPEAT_TCL CHOOSE_THEN SUBST_ALL_TAC)
15940        THENL [ASM_MESON_TAC[TAGGED_DIVISION_OF], ALL_TAC] THEN
15941        ASM_MESON_TAC[REAL_NEG_NEG]],
15942      (* goal 1.2 (of 3) *)
15943      MAP_EVERY X_GEN_TAC [``x:real``, ``k:real->bool``] THEN DISCH_TAC THEN
15944      MAP_EVERY X_GEN_TAC [``y:real``, ``l:real->bool``] THEN DISCH_TAC THEN
15945      FIRST_X_ASSUM(MP_TAC o SPECL
15946       [``x:real``, ``k:real->bool``,
15947        ``y:real``, ``l:real->bool``]) THEN
15948      ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MONO_IMP THEN
15949      CONJ_TAC THENL [MESON_TAC[PAIR_EQ], ALL_TAC] THEN
15950      SIMP_TAC std_ss [INTERIOR_NEGATIONS] THEN
15951      MATCH_MP_TAC(SET_RULE
15952       ``(!x. f(f x) = x)
15953        ==> (s INTER t = {}) ==> (IMAGE f s INTER IMAGE f t = {})``) THEN
15954      SIMP_TAC std_ss [REAL_NEG_NEG],
15955      (* goal 1.3 (of 3) *)
15956      GEN_REWR_TAC I [EXTENSION] THEN
15957      ONCE_REWRITE_TAC[GSYM IN_INTERVAL_REFLECT] THEN
15958      FIRST_X_ASSUM(SUBST1_TAC o SYM) THEN X_GEN_TAC ``y:real`` THEN
15959      SIMP_TAC std_ss [IN_BIGUNION, GSPECIFICATION] THEN
15960      KNOW_TAC ``(? (s :real -> bool). ( \s.
15961            (y :real) IN s /\ ?(x :real). (x,s) IN
15962         IMAGE ( \ ((x :real),(k :real -> bool)). (-x,IMAGE (\ (x :real). -x) k))
15963           (p :real # (real -> bool) -> bool)) s) <=>
15964       ? (s :real -> bool). ( \s. -y IN s /\ ? (x :real). (x,s) IN p) s`` THENL
15965      [ALL_TAC, METIS_TAC []] THEN
15966      MATCH_MP_TAC(MESON[]
15967       ``!f. (!x. f(f x) = x) /\ (!x. P x <=> Q(f x))
15968            ==> ((?x. P x) <=> (?x. Q x))``) THEN SIMP_TAC std_ss [] THEN
15969      EXISTS_TAC ``IMAGE ((\x. -x):real->real)`` THEN CONJ_TAC THENL
15970       [SIMP_TAC std_ss [GSYM IMAGE_COMPOSE, o_DEF, REAL_NEG_NEG, IMAGE_ID],
15971        ALL_TAC] THEN
15972      X_GEN_TAC ``t:real->bool`` THEN BINOP_TAC THENL
15973      [ SIMP_TAC std_ss [IN_IMAGE, EXISTS_PROD, PAIR_EQ] THEN
15974        SUBGOAL_THEN ``!k:real->bool. IMAGE (\x. -x) (IMAGE (\x. -x) k) = k``
15975        MP_TAC THENL
15976         [SIMP_TAC std_ss [GSYM IMAGE_COMPOSE, o_DEF, REAL_NEG_NEG, IMAGE_ID],
15977          METIS_TAC[REAL_EQ_NEG]],
15978        SIMP_TAC std_ss [IN_IMAGE, EXISTS_PROD] THEN EQ_TAC THENL
15979        [STRIP_TAC THEN
15980         ASM_SIMP_TAC std_ss [IMAGE_IMAGE, o_DEF, IMAGE_ID, REAL_NEG_NEG] THEN
15981         METIS_TAC [],
15982         DISCH_THEN (X_CHOOSE_TAC ``x:real``) THEN
15983         EXISTS_TAC ``x:real`` THEN
15984         EXISTS_TAC ``IMAGE (\x:real. -x) t`` THEN
15985         ASM_SIMP_TAC std_ss [IMAGE_IMAGE, o_DEF, IMAGE_ID,
15986                              REAL_NEG_NEG] ] ] ],
15987    (* goal 2 (of 2) *)
15988    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
15989    KNOW_TAC ``(d :real -> real -> bool) FINE
15990      IMAGE (\ ((x :real),(k :real -> bool)). (-x,IMAGE (\ (x :real). -x) k))
15991       (p :real # (real -> bool) -> bool)`` THENL
15992     [FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [FINE]) THEN
15993      SIMP_TAC std_ss [FINE, lemma] THEN
15994      DISCH_TAC THEN X_GEN_TAC ``x:real`` THEN X_GEN_TAC ``k:real->bool`` THEN
15995      POP_ASSUM (MP_TAC o SPECL [``x:real``, ``k:real->bool``]) THEN
15996      MATCH_MP_TAC MONO_IMP THEN REWRITE_TAC[] THEN
15997      MATCH_MP_TAC(SET_RULE
15998       ``(!x. f(f x) = x) ==> k SUBSET IMAGE f s ==> IMAGE f k SUBSET s``) THEN
15999      SIMP_TAC std_ss [REAL_NEG_NEG],
16000      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
16001    MATCH_MP_TAC(REAL_ARITH
16002     ``(x:real = y) ==> abs(x - i) < e ==> abs(y - i) < e``) THEN
16003    W(MP_TAC o PART_MATCH (lhs o rand) SUM_IMAGE o lhs o snd) THEN
16004    FIRST_ASSUM(ASSUME_TAC o MATCH_MP TAGGED_DIVISION_OF_FINITE) THEN
16005    ASM_SIMP_TAC std_ss [] THEN
16006    KNOW_TAC ``(!(x :real # (real -> bool)) (y :real # (real -> bool)).
16007    x IN (p :real # (real -> bool) -> bool) /\ y IN p /\
16008    ((\ ((x :real),(k :real -> bool)). (-x,IMAGE (\ (x :real). -x) k)) x =
16009     (\ ((x :real),(k :real -> bool)). (-x,IMAGE (\ (x :real). -x) k))
16010       y) ==> (x = y))`` THENL
16011     [MATCH_MP_TAC(MESON[]
16012       ``(!x. f(f x) = x)
16013        ==> !x y. x IN p /\ y IN p /\ (f x = f y) ==> (x = y)``) THEN
16014      SIMP_TAC std_ss [FORALL_PROD, GSYM IMAGE_COMPOSE, o_DEF, REAL_NEG_NEG,
16015                  IMAGE_ID],
16016      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
16017      DISCH_THEN SUBST1_TAC THEN MATCH_MP_TAC SUM_EQ THEN
16018      SIMP_TAC std_ss [FORALL_PROD, o_THM] THEN
16019      MAP_EVERY X_GEN_TAC [``x:real``, ``k:real->bool``] THEN DISCH_TAC THEN
16020      SUBGOAL_THEN ``?u v:real. k = interval[u,v]``
16021       (REPEAT_TCL CHOOSE_THEN SUBST_ALL_TAC)
16022      THENL [ASM_MESON_TAC[TAGGED_DIVISION_OF], ALL_TAC] THEN
16023      AP_THM_TAC THEN AP_TERM_TAC THEN
16024      SUBGOAL_THEN ``(\x. -x):real->real = (\x. -(&1) * x + 0)`` SUBST1_TAC
16025      THENL [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC, ALL_TAC] THEN
16026      SIMP_TAC std_ss [CONTENT_IMAGE_AFFINITY_INTERVAL, ABS_NEG] THEN
16027      SIMP_TAC std_ss [POW_1, REAL_MUL_LID, ABS_N]] ]
16028QED
16029
16030(* ------------------------------------------------------------------------- *)
16031(* Some technical lemmas about minimizing a "flat" part of a sum over a      *)
16032(* division, followed by subinterval resictions for equiintegrable family.   *)
16033(* ------------------------------------------------------------------------- *)
16034
16035Theorem lemma0[local]:
16036     !k:real->bool.
16037          content k / (interval_upperbound k - interval_lowerbound k) =
16038              if content k = &0 then &0
16039              else &1:real
16040Proof
16041    REPEAT STRIP_TAC THEN COND_CASES_TAC THEN
16042    ASM_REWRITE_TAC[real_div, REAL_MUL_LZERO] THEN
16043    REWRITE_TAC[content] THEN
16044    COND_CASES_TAC THENL [ASM_MESON_TAC[CONTENT_EMPTY], ALL_TAC] THEN
16045    UNDISCH_TAC ``~(content(k:real->bool) = &0)`` THEN
16046    ASM_REWRITE_TAC[content, PRODUCT_EQ_0_NUMSEG] THEN
16047    ASM_MESON_TAC[REAL_MUL_RINV]
16048QED
16049
16050Theorem lemma1[local]:
16051     !d a b:real s.
16052          d division_of s /\ s SUBSET interval[a,b] /\
16053          ((!k. k IN d
16054                ==> ~(content k = &0) /\ ~(k INTER {x | x = a} = {})) \/
16055           (!k. k IN d
16056                ==> ~(content k = &0) /\ ~(k INTER {x | x = b} = {})))
16057          ==> (b - a) *
16058              sum d (\k. content k /
16059                         (interval_upperbound k - interval_lowerbound k))
16060              <= content(interval[a,b])
16061Proof
16062    REPEAT GEN_TAC THEN DISCH_THEN(REPEAT_TCL CONJUNCTS_THEN ASSUME_TAC) THEN
16063    FIRST_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_FINITE) THEN
16064    ABBREV_TAC ``extend = (\k:real->bool. interval [a, b:real])`` THEN
16065    SUBGOAL_THEN ``!k. k IN d ==> k SUBSET interval[a:real,b]``
16066    ASSUME_TAC THENL
16067     [RULE_ASSUM_TAC(REWRITE_RULE[division_of]) THEN ASM_SET_TAC[],
16068      ALL_TAC] THEN
16069    SUBGOAL_THEN ``!k:real->bool. k IN d ==> ~(k = {})`` ASSUME_TAC THENL
16070     [ASM_MESON_TAC[division_of], ALL_TAC] THEN
16071    SUBGOAL_THEN
16072     ``(!k. k IN d ==> ~((extend:(real->bool)->(real->bool)) k = {})) /\
16073       (!k. k IN d ==> (extend k) SUBSET interval[a,b])``
16074    STRIP_ASSUME_TAC THENL
16075     [FIRST_ASSUM(fn th => SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION th]) THEN
16076      CONJ_TAC THEN MAP_EVERY X_GEN_TAC [``u:real``, ``v:real``] THEN
16077      (DISCH_TAC THEN EXPAND_TAC "extend" THEN
16078       SUBGOAL_THEN ``interval[u:real,v] SUBSET interval[a,b]`` MP_TAC THENL
16079        [ASM_SIMP_TAC std_ss [], ALL_TAC] THEN
16080       SUBGOAL_THEN ``~(interval[u:real,v] = {})`` MP_TAC THENL
16081        [ASM_SIMP_TAC std_ss [], ALL_TAC] THEN
16082       SIMP_TAC std_ss [SUBSET_INTERVAL, INTERVAL_NE_EMPTY,
16083                INTERVAL_LOWERBOUND, INTERVAL_UPPERBOUND] THEN
16084       METIS_TAC[REAL_LE_TRANS, REAL_LE_REFL]),
16085      ALL_TAC] THEN
16086    SUBGOAL_THEN
16087     ``!k1 k2. k1 IN d /\ k2 IN d /\ ~(k1 = k2)
16088              ==> (interior((extend:(real->bool)->(real->bool)) k1) INTER
16089                   interior(extend k2) = {})``
16090    ASSUME_TAC THENL
16091    [ (* goal 1 (of 2) *)
16092      SIMP_TAC std_ss [IMP_CONJ, RIGHT_FORALL_IMP_THM] THEN
16093      FIRST_ASSUM(fn th => SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION th]) THEN
16094      MAP_EVERY X_GEN_TAC [``u:real``, ``v:real``] THEN DISCH_TAC THEN
16095      MAP_EVERY X_GEN_TAC [``w:real``, ``z:real``] THEN DISCH_TAC THEN
16096      DISCH_TAC THEN
16097      UNDISCH_TAC ``d division_of s`` THEN DISCH_TAC THEN
16098      FIRST_ASSUM(MP_TAC o REWRITE_RULE [division_of]) THEN
16099      DISCH_THEN (CONJUNCTS_THEN2 K_TAC MP_TAC) THEN
16100      DISCH_THEN (CONJUNCTS_THEN2 K_TAC MP_TAC) THEN
16101      DISCH_THEN (CONJUNCTS_THEN2 MP_TAC K_TAC) THEN
16102      DISCH_THEN(MP_TAC o SPECL
16103       [``interval[u:real,v]``, ``interval[w:real,z]``]) THEN
16104      ASM_REWRITE_TAC[INTERIOR_CLOSED_INTERVAL] THEN
16105      ONCE_REWRITE_TAC[MONO_NOT_EQ] THEN
16106      REWRITE_TAC[GSYM MEMBER_NOT_EMPTY, IN_INTER] THEN
16107      EXPAND_TAC "extend" THEN
16108      SIMP_TAC std_ss [INTERIOR_CLOSED_INTERVAL, IN_INTERVAL] THEN
16109      SUBGOAL_THEN ``~(interval[u:real,v] = {}) /\
16110                     ~(interval[w:real,z] = {})``
16111      MP_TAC THENL [ASM_SIMP_TAC std_ss [], ALL_TAC] THEN
16112      SIMP_TAC std_ss [SUBSET_INTERVAL, INTERVAL_NE_EMPTY,
16113               INTERVAL_LOWERBOUND, INTERVAL_UPPERBOUND] THEN
16114      STRIP_TAC THEN DISCH_THEN(X_CHOOSE_THEN ``x:real`` MP_TAC) THEN
16115      MP_TAC(MESON[]
16116       ``(!P. (!j:num. P j) <=> P i /\ (!j. ~(j = i) ==> P j))``) THEN
16117      DISCH_THEN(fn th => GEN_REWR_TAC
16118       (LAND_CONV o ONCE_DEPTH_CONV) [th]) THEN
16119      ASM_SIMP_TAC std_ss [AND_IMP_INTRO] THEN STRIP_TAC THEN
16120      UNDISCH_TAC ``(!k. k IN d ==> content k <> 0 /\ k INTER {x | x = a} <> {}) \/
16121                     !k. k IN d ==> content k <> 0 /\ k INTER {x | x = b} <> {}`` THEN
16122      DISCH_TAC THEN
16123      FIRST_X_ASSUM(DISJ_CASES_THEN
16124       (fn th => MP_TAC(SPEC ``interval[u:real,v]`` th) THEN
16125                  MP_TAC(SPEC ``interval[w:real,z]`` th))) THEN
16126      ASM_SIMP_TAC std_ss [CONTENT_EQ_0_INTERIOR, INTERIOR_CLOSED_INTERVAL] THEN
16127      REWRITE_TAC [IMP_CONJ, GSYM MEMBER_NOT_EMPTY, IN_INTER] THEN
16128      SIMP_TAC std_ss [IN_INTERVAL, LEFT_IMP_EXISTS_THM] THEN
16129      X_GEN_TAC ``q:real`` THEN STRIP_TAC THEN
16130      X_GEN_TAC ``r:real`` THEN STRIP_TAC THEN
16131      X_GEN_TAC ``s':real`` THEN STRIP_TAC THEN
16132      X_GEN_TAC ``t:real`` THEN STRIP_TAC THEN
16133      FULL_SIMP_TAC std_ss [GSPECIFICATION] THENL
16134       [EXISTS_TAC ``min ((q:real)) ((s':real))``,
16135        EXISTS_TAC ``max ((q:real)) ((s':real))``] THEN
16136      (SUBGOAL_THEN ``interval[u:real,v] SUBSET interval[a,b] /\
16137                      interval[w:real,z] SUBSET interval[a,b]``
16138       MP_TAC THENL [ASM_SIMP_TAC std_ss [], ALL_TAC] THEN
16139       SUBGOAL_THEN ``~(interval[u:real,v] = {}) /\
16140                      ~(interval[w:real,z] = {})``
16141       MP_TAC THENL [ASM_SIMP_TAC std_ss [], ALL_TAC] THEN
16142       ASM_SIMP_TAC std_ss [INTERVAL_NE_EMPTY, SUBSET_INTERVAL] THEN
16143       rpt STRIP_TAC >> RW_TAC real_ss [min_def, max_def] THEN
16144       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
16145       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
16146       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
16147       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
16148       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
16149       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
16150       REAL_ARITH_TAC),
16151      ALL_TAC] THEN
16152    MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC
16153     ``sum (IMAGE (extend:(real->bool)->(real->bool)) d) content`` THEN
16154    CONJ_TAC THENL
16155     [W(MP_TAC o PART_MATCH (lhs o rand) SUM_IMAGE_NONZERO o rand o snd) THEN
16156      KNOW_TAC ``FINITE (d :(real -> bool) -> bool) /\
16157        (!(x :real -> bool) (y :real -> bool).
16158           x IN d /\ y IN d /\ x <> y /\
16159          ((extend :(real -> bool) -> real -> bool) x = extend y) ==>
16160           (content (extend x) = (0 :real)))`` THENL
16161       [ASM_REWRITE_TAC[] THEN
16162        MAP_EVERY X_GEN_TAC [``k1:real->bool``, ``k2:real->bool``] THEN
16163        STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPECL
16164         [``k1:real->bool``, ``k2:real->bool``]) THEN
16165        ASM_REWRITE_TAC[INTER_IDEMPOT] THEN
16166        EXPAND_TAC "extend" THEN REWRITE_TAC[CONTENT_EQ_0_INTERIOR],
16167        DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
16168        DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[GSYM SUM_LMUL] THEN
16169        MATCH_MP_TAC SUM_LE THEN ASM_SIMP_TAC std_ss [] THEN
16170        FIRST_ASSUM(fn th => SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION th]) THEN
16171        MAP_EVERY X_GEN_TAC [``u:real``, ``v:real``] THEN DISCH_TAC THEN
16172        ASM_CASES_TAC ``content(interval[u:real,v]) = &0`` THENL
16173         [ASM_REWRITE_TAC[real_div, REAL_MUL_LZERO, REAL_MUL_RZERO, o_THM] THEN
16174          EXPAND_TAC "extend" THEN REWRITE_TAC[CONTENT_POS_LE],
16175          ALL_TAC] THEN
16176        FIRST_ASSUM(MP_TAC o REWRITE_RULE [GSYM CONTENT_LT_NZ]) THEN
16177        DISCH_THEN(fn th => ASSUME_TAC th THEN MP_TAC th) THEN
16178        REWRITE_TAC[CONTENT_POS_LT_EQ] THEN STRIP_TAC THEN
16179        ASM_SIMP_TAC std_ss [INTERVAL_LOWERBOUND, INTERVAL_UPPERBOUND,
16180                     REAL_LT_IMP_LE, real_div, REAL_MUL_ASSOC] THEN
16181        ASM_SIMP_TAC std_ss [GSYM real_div, REAL_LE_LDIV_EQ, REAL_SUB_LT] THEN
16182        SUBGOAL_THEN
16183         ``~((extend:(real->bool)->(real->bool)) (interval[u,v]) = {})``
16184        MP_TAC THENL [ASM_SIMP_TAC std_ss [], ALL_TAC] THEN
16185        EXPAND_TAC "extend" THEN ASM_SIMP_TAC std_ss [content, o_THM] THEN
16186        ASM_SIMP_TAC std_ss [INTERVAL_NE_EMPTY, INTERVAL_LOWERBOUND,
16187                     INTERVAL_UPPERBOUND, REAL_LT_IMP_LE] THEN
16188        DISCH_THEN(K ALL_TAC) THEN REAL_ARITH_TAC],
16189      MATCH_MP_TAC SUBADDITIVE_CONTENT_DIVISION THEN EXISTS_TAC
16190       ``BIGUNION (IMAGE (extend:(real->bool)->(real->bool)) d)`` THEN
16191      ASM_SIMP_TAC std_ss [BIGUNION_SUBSET, division_of, IMAGE_FINITE] THEN
16192      SIMP_TAC std_ss [IMP_CONJ, RIGHT_FORALL_IMP_THM, FORALL_IN_IMAGE] THEN
16193      FIRST_ASSUM(fn th => SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION th]) THEN
16194      REPEAT CONJ_TAC THEN MAP_EVERY X_GEN_TAC [``u:real``, ``v:real``] THEN
16195      DISCH_TAC THENL
16196       [CONJ_TAC THENL [ASM_SET_TAC[], ASM_SIMP_TAC std_ss []] THEN
16197        EXPAND_TAC "extend" THEN SIMP_TAC std_ss [] THEN MESON_TAC[],
16198        ASM_MESON_TAC[],
16199        ASM_SIMP_TAC std_ss []]]
16200QED
16201
16202Theorem SUM_CONTENT_AREA_OVER_THIN_DIVISION :
16203    !d a b:real s c.
16204        d division_of s /\ s SUBSET interval[a,b] /\
16205                 a <= c /\ c <= b /\
16206        (!k. k IN d ==> ~(k INTER {x | x = c} = {}))
16207        ==> (b - a) *
16208            sum d (\k. content k /
16209                       (interval_upperbound k - interval_lowerbound k))
16210            <= &2 * content(interval[a,b])
16211Proof
16212  REPEAT STRIP_TAC THEN
16213  ASM_CASES_TAC ``content(interval[a:real,b]) = &0`` THENL
16214   [MATCH_MP_TAC(REAL_ARITH ``(x = &0) /\ &0 <= y ==> x <= &2 * y:real``) THEN
16215    SIMP_TAC std_ss [CONTENT_POS_LE, REAL_ENTIRE] THEN DISJ2_TAC THEN
16216    MATCH_MP_TAC SUM_EQ_0 THEN X_GEN_TAC ``k:real->bool`` THEN
16217    DISCH_TAC THEN SIMP_TAC std_ss [real_div, REAL_ENTIRE] THEN DISJ1_TAC THEN
16218    MATCH_MP_TAC CONTENT_0_SUBSET THEN
16219    MAP_EVERY EXISTS_TAC [``a:real``, ``b:real``] THEN
16220    METIS_TAC[division_of, SUBSET_TRANS],
16221    ALL_TAC] THEN
16222  FIRST_ASSUM(MP_TAC o REWRITE_RULE [GSYM CONTENT_LT_NZ]) THEN
16223  DISCH_THEN(fn th => ASSUME_TAC th THEN MP_TAC th) THEN
16224  REWRITE_TAC[CONTENT_POS_LT_EQ] THEN STRIP_TAC THEN
16225  FIRST_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_FINITE) THEN
16226  MP_TAC(ISPECL
16227   [``{k | k IN {l INTER {x | x <= c} | l |
16228                l IN d /\ ~(l INTER {x:real | x <= c} = {})} /\
16229          ~(content k = &0)}``,
16230    ``a:real``, ``c:real``,
16231    ``BIGUNION {k | k IN {l INTER {x | x <= c} | l |
16232                       l IN d /\ ~(l INTER {x:real | x <= c} = {})} /\
16233                 ~(content k = &0)}``] lemma1) THEN
16234  MP_TAC(ISPECL
16235   [``{k | k IN {l INTER {x | x >= c} | l |
16236                l IN d /\ ~(l INTER {x:real | x >= c} = {})} /\
16237          ~(content k = &0)}``,
16238    ``c:real``, ``b:real``,
16239    ``BIGUNION {k | k IN {l INTER {x | x >= c} | l |
16240                       l IN d /\ ~(l INTER {x:real | x >= c} = {})} /\
16241                 ~(content k = &0)}``] lemma1) THEN
16242  ASM_SIMP_TAC std_ss [] THEN MATCH_MP_TAC(TAUT
16243   `(p1 /\ p2) /\ (q1 /\ q2 ==> r) ==> (p2 ==> q2) ==> (p1 ==> q1) ==> r`) THEN
16244  CONJ_TAC THENL
16245  [ (* goal 1 (of 2) *)
16246    CONJ_TAC THENL
16247    [ (* goal 1.1 (of 2) *)
16248      REPEAT CONJ_TAC THENL (* 3 subgoals *)
16249      [ (* goal 1.1.1 (of 3) *)
16250        REWRITE_TAC[division_of] THEN CONJ_TAC THENL (* 2 subgoals *)
16251        [ (* goal 1.1.1.1 (of 2) *)
16252          ONCE_REWRITE_TAC [METIS []
16253         ``{k | k IN
16254          {l INTER {x | x <= c} | l | l IN d /\ l INTER {x | x <= c} <> {}} /\
16255            content k <> 0} =
16256           {k | k IN
16257          {l INTER {x | x <= c} | l | l IN d /\ l INTER {x | x <= c} <> {}} /\
16258            (\k. content k <> 0) k}``] THEN
16259          MATCH_MP_TAC FINITE_RESTRICT THEN
16260          KNOW_TAC ``FINITE (IMAGE (\l. l INTER {x | x <= c:real})
16261                   {l | l IN d /\ ~(l INTER {x | x <= c} = {})})`` THENL
16262          [ALL_TAC, METIS_TAC [SIMPLE_IMAGE_GEN]] THEN
16263          MATCH_MP_TAC IMAGE_FINITE THEN METIS_TAC [FINITE_RESTRICT],
16264          (* goal 1.1.1.2 (of 2) *)
16265          ALL_TAC] THEN
16266        SIMP_TAC std_ss [FORALL_IN_GSPEC, IMP_CONJ, RIGHT_FORALL_IMP_THM] THEN
16267        CONJ_TAC THENL (* 2 subgoals *)
16268        [ (* goal 1.1.1.1 (of 2) *)
16269          FIRST_ASSUM(fn th => SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION th]) THEN
16270          MAP_EVERY X_GEN_TAC [``u:real``, ``v:real``] THEN
16271          REPEAT DISCH_TAC THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
16272          [ SIMP_TAC std_ss [GSPECIFICATION, SUBSET_DEF, IN_BIGUNION] THEN ASM_MESON_TAC[],
16273            ASM_SIMP_TAC std_ss [INTERVAL_SPLIT] THEN MESON_TAC[] ],
16274          (* goal 1.1.1.2 (of 2) *)
16275          X_GEN_TAC ``k:real->bool`` THEN REPEAT DISCH_TAC THEN
16276          X_GEN_TAC ``l:real->bool`` THEN REPEAT DISCH_TAC THEN
16277          UNDISCH_TAC ``d division_of s`` THEN DISCH_TAC THEN
16278          FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [division_of]) THEN
16279          DISCH_THEN (CONJUNCTS_THEN2 K_TAC MP_TAC) THEN
16280          DISCH_THEN (CONJUNCTS_THEN2 K_TAC MP_TAC) THEN
16281          DISCH_THEN (CONJUNCTS_THEN2 MP_TAC K_TAC) THEN
16282          DISCH_THEN(MP_TAC o SPECL [``k:real->bool``, ``l:real->bool``]) THEN
16283          KNOW_TAC ``k IN d /\ l IN d /\ k <> l:real->bool`` THENL
16284          [ASM_MESON_TAC[], DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
16285          MATCH_MP_TAC(SET_RULE
16286         ``s SUBSET s' /\ t SUBSET t'
16287          ==> (s' INTER t' = {}) ==> (s INTER t = {})``) THEN
16288          CONJ_TAC THEN MATCH_MP_TAC SUBSET_INTERIOR THEN SET_TAC[] ],
16289        (* goal 1.1.2 (of 3) *)
16290        SIMP_TAC std_ss [BIGUNION_SUBSET, FORALL_IN_GSPEC, IMP_CONJ] THEN
16291        X_GEN_TAC ``k:real->bool`` THEN REPEAT DISCH_TAC THEN
16292        SUBGOAL_THEN ``k SUBSET interval[a:real,b]`` MP_TAC THENL
16293        [ASM_MESON_TAC[division_of, SUBSET_TRANS], ALL_TAC] THEN
16294        MATCH_MP_TAC(SET_RULE
16295       ``i INTER h SUBSET j ==> k SUBSET i ==> k INTER h SUBSET j``) THEN
16296        ASM_SIMP_TAC std_ss [INTERVAL_SPLIT, SUBSET_INTERVAL] THEN
16297        RW_TAC real_ss [REAL_LE_MIN, REAL_LE_REFL],
16298        (* goal 1.1.3 (of 3) *)
16299        ALL_TAC ],
16300      (* goal 1.2 (of 2) *)
16301      REPEAT CONJ_TAC THENL
16302      [ (* goal 1.2.1 (of 3) *)
16303        REWRITE_TAC[division_of] THEN CONJ_TAC THENL
16304        [ (* goal 1.2.1.1 (of 2) *)
16305          ONCE_REWRITE_TAC [METIS []
16306         ``{k | k IN
16307          {l INTER {x | x >= c} | l | l IN d /\ l INTER {x | x >= c} <> {}} /\
16308            content k <> 0} =
16309           {k | k IN
16310          {l INTER {x | x >= c} | l | l IN d /\ l INTER {x | x >= c} <> {}} /\
16311            (\k. content k <> 0) k}``] THEN
16312          MATCH_MP_TAC FINITE_RESTRICT THEN
16313          KNOW_TAC ``FINITE (IMAGE (\l. l INTER {x | x >= c:real})
16314                   {l | l IN d /\ ~(l INTER {x | x >= c} = {})})`` THENL
16315          [ALL_TAC, METIS_TAC [SIMPLE_IMAGE_GEN]] THEN
16316          MATCH_MP_TAC IMAGE_FINITE THEN METIS_TAC [FINITE_RESTRICT],
16317          (* goal 1.2.1.2 (of 2) *)
16318          ALL_TAC ] THEN
16319        SIMP_TAC std_ss [FORALL_IN_GSPEC, IMP_CONJ, RIGHT_FORALL_IMP_THM] THEN
16320        CONJ_TAC THENL
16321        [ (* goal 1.2.1.1 (of 2) *)
16322          FIRST_ASSUM(fn th => SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION th]) THEN
16323          MAP_EVERY X_GEN_TAC [``u:real``, ``v:real``] THEN
16324          REPEAT DISCH_TAC THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
16325          [SIMP_TAC std_ss [GSPECIFICATION, SUBSET_DEF, IN_BIGUNION] THEN ASM_MESON_TAC[],
16326          ASM_SIMP_TAC std_ss [INTERVAL_SPLIT] THEN MESON_TAC[]],
16327          (* goal 1.2.1.2 (of 2) *)
16328          X_GEN_TAC ``k:real->bool`` THEN REPEAT DISCH_TAC THEN
16329          X_GEN_TAC ``l:real->bool`` THEN REPEAT DISCH_TAC THEN
16330          UNDISCH_TAC ``d division_of s`` THEN DISCH_TAC THEN
16331          FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [division_of]) THEN
16332          DISCH_THEN (CONJUNCTS_THEN2 K_TAC MP_TAC) THEN
16333          DISCH_THEN (CONJUNCTS_THEN2 K_TAC MP_TAC) THEN
16334          DISCH_THEN (CONJUNCTS_THEN2 MP_TAC K_TAC) THEN
16335          DISCH_THEN(MP_TAC o SPECL [``k:real->bool``, ``l:real->bool``]) THEN
16336          KNOW_TAC ``k IN d /\ l IN d /\ k <> l:real->bool`` THENL
16337          [ASM_MESON_TAC[], DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
16338          MATCH_MP_TAC(SET_RULE
16339         ``s SUBSET s' /\ t SUBSET t'
16340          ==> (s' INTER t' = {}) ==> (s INTER t = {})``) THEN
16341          CONJ_TAC THEN MATCH_MP_TAC SUBSET_INTERIOR THEN SET_TAC[] ],
16342       (* goal 1.2.2 (of 3) *)
16343       SIMP_TAC std_ss [BIGUNION_SUBSET, FORALL_IN_GSPEC, IMP_CONJ] THEN
16344       X_GEN_TAC ``k:real->bool`` THEN REPEAT DISCH_TAC THEN
16345       SUBGOAL_THEN ``k SUBSET interval[a:real,b]`` MP_TAC THENL
16346       [ASM_MESON_TAC[division_of, SUBSET_TRANS], ALL_TAC] THEN
16347       MATCH_MP_TAC(SET_RULE
16348       ``i INTER h SUBSET j ==> k SUBSET i ==> k INTER h SUBSET j``) THEN
16349       ASM_SIMP_TAC std_ss [INTERVAL_SPLIT, SUBSET_INTERVAL] THEN
16350       RW_TAC real_ss [REAL_LE_MAX, REAL_LE_REFL],
16351       (* goal 1.2.3 (of 3) *)
16352       ALL_TAC ] ] THENL [DISJ2_TAC, DISJ1_TAC] THEN
16353    (* still in goal 1 *)
16354    SIMP_TAC std_ss [FORALL_IN_GSPEC, IMP_CONJ] THEN
16355    ASM_SIMP_TAC std_ss [real_ge] THEN X_GEN_TAC ``l:real->bool`` THEN
16356    DISCH_TAC THEN FIRST_ASSUM (MP_TAC o SPEC ``l:real->bool``) THEN
16357    FIRST_ASSUM (fn th => REWRITE_TAC [th]) THEN
16358    SIMP_TAC std_ss [IN_INTER, NOT_IN_EMPTY, EXTENSION, GSPECIFICATION] THEN
16359    SIMP_TAC std_ss [REAL_LE_REFL],
16360    (* goal 2 (of 2) *)
16361    ASM_SIMP_TAC std_ss [] ] THEN
16362 (* stage work *)
16363  SUBGOAL_THEN
16364  ``(sum {k | k IN
16365             { l INTER {x | x <= c} | l |
16366               l IN d /\ ~(l INTER {x:real | x <= c} = {})} /\
16367             ~(content k = &0)}
16368        (\k. content k /
16369             (interval_upperbound k - interval_lowerbound k)) =
16370     sum d ((\k. content k /
16371             (interval_upperbound k - interval_lowerbound k)) o
16372           (\k. k INTER {x | x <= c}))) /\
16373    (sum {k | k IN
16374             { l INTER {x | x >= c} | l |
16375               l IN d /\ ~(l INTER {x:real | x >= c} = {})} /\
16376             ~(content k = &0)}
16377        (\k. content k /
16378             (interval_upperbound k - interval_lowerbound k)) =
16379     sum d ((\k. content k /
16380             (interval_upperbound k - interval_lowerbound k)) o
16381           (\k. k INTER {x | x >= c})))``
16382  (CONJUNCTS_THEN SUBST1_TAC) THENL
16383  [ (* goal 1 (of 2) *)
16384    CONJ_TAC THENL
16385    [ (* goal 1.1 (of 2) *)
16386      W(MP_TAC o PART_MATCH (rand o rand) SUM_IMAGE_NONZERO o rand o snd) THEN
16387      ASM_SIMP_TAC std_ss [] THEN
16388      KNOW_TAC ``(!(x :real -> bool) (y :real -> bool).
16389       x IN (d :(real -> bool) -> bool) /\ y IN d /\ x <> y /\
16390      (x INTER {x | x <= (c :real)} = y INTER {x | x <= c}) ==>
16391      (content (y INTER {x | x <= c}) /
16392       (interval_upperbound (y INTER {x | x <= c}) -
16393        interval_lowerbound (y INTER {x | x <= c})) = (0 : real)))`` THENL
16394      [ MAP_EVERY X_GEN_TAC [``k:real->bool``, ``l:real->bool``] THEN
16395        STRIP_TAC THEN
16396        SIMP_TAC std_ss [real_div, REAL_ENTIRE] THEN DISJ1_TAC THEN
16397        (MATCH_MP_TAC DIVISION_SPLIT_LEFT_INJ ORELSE
16398         MATCH_MP_TAC DIVISION_SPLIT_RIGHT_INJ) THEN METIS_TAC[],
16399        DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
16400        DISCH_THEN(SUBST1_TAC o SYM) THEN CONV_TAC SYM_CONV THEN
16401        MATCH_MP_TAC SUM_SUPERSET THEN CONJ_TAC THENL [SET_TAC[], ALL_TAC] THEN
16402        GEN_TAC THEN DISCH_TAC THEN
16403        KNOW_TAC ``((!l:real->bool. (l INTER {x | x <= c} = {})
16404                        ==> (content ((\k. k INTER {x | x <= c}) l) = &0))
16405                        ==> (content x = &0))
16406        ==> ((\k. content k / (interval_upperbound k -
16407                               interval_lowerbound k)) x = &0)`` THENL
16408        [ALL_TAC, POP_ASSUM MP_TAC THEN SET_TAC []] THEN
16409        SIMP_TAC std_ss [CONTENT_EMPTY, real_div, REAL_MUL_LZERO] ],
16410       (* goal 1.2 (of 2) *)
16411       W(MP_TAC o PART_MATCH (rand o rand) SUM_IMAGE_NONZERO o rand o snd) THEN
16412       ASM_SIMP_TAC std_ss [] THEN
16413       KNOW_TAC ``(!(x :real -> bool) (y :real -> bool).
16414       x IN (d :(real -> bool) -> bool) /\ y IN d /\ x <> y /\
16415      (x INTER {x | x >= (c :real)} = y INTER {x | x >= c}) ==>
16416      (content (y INTER {x | x >= c}) /
16417       (interval_upperbound (y INTER {x | x >= c}) -
16418        interval_lowerbound (y INTER {x | x >= c})) = (0 : real)))`` THENL
16419       [ MAP_EVERY X_GEN_TAC [``k:real->bool``, ``l:real->bool``] THEN
16420         STRIP_TAC THEN
16421         SIMP_TAC std_ss [real_div, REAL_ENTIRE] THEN DISJ1_TAC THEN
16422         (MATCH_MP_TAC DIVISION_SPLIT_LEFT_INJ ORELSE
16423          MATCH_MP_TAC DIVISION_SPLIT_RIGHT_INJ) THEN METIS_TAC[],
16424         DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
16425         DISCH_THEN(SUBST1_TAC o SYM) THEN CONV_TAC SYM_CONV THEN
16426         MATCH_MP_TAC SUM_SUPERSET THEN CONJ_TAC THENL [SET_TAC[], ALL_TAC] THEN
16427         GEN_TAC THEN DISCH_TAC THEN
16428         KNOW_TAC ``((!l:real->bool. (l INTER {x | x >= c} = {})
16429                        ==> (content ((\k. k INTER {x | x >= c}) l) = &0))
16430                        ==> (content x = &0))
16431        ==> ((\k. content k / (interval_upperbound k -
16432                               interval_lowerbound k)) x = &0)`` THENL
16433         [ALL_TAC, POP_ASSUM MP_TAC THEN SET_TAC []] THEN
16434         SIMP_TAC std_ss [CONTENT_EMPTY, real_div, REAL_MUL_LZERO]] ],
16435     (* goal 2 (of 2) *)
16436     ALL_TAC] THEN
16437  ASM_CASES_TAC ``c = a:real`` THENL
16438  [ASM_SIMP_TAC std_ss [REAL_SUB_REFL, REAL_MUL_LZERO, CONTENT_POS_LE] THEN
16439   MATCH_MP_TAC(REAL_ARITH ``(x = y) /\ a <= b ==> x <= a ==> y <= b:real``) THEN
16440      CONJ_TAC THENL
16441       [AP_TERM_TAC THEN MATCH_MP_TAC SUM_EQ THEN
16442        X_GEN_TAC ``k:real->bool`` THEN DISCH_TAC THEN
16443        PURE_REWRITE_TAC[o_THM] THEN AP_TERM_TAC THEN
16444        SIMP_TAC std_ss [real_ge] THEN
16445        ONCE_REWRITE_TAC [METIS [] ``({x | a <= x} = {x | (\x. a <= x) (x:real)}) /\
16446                                     ({x | x <= a} = {x | (\x. x <= a) (x:real)})``] THEN
16447        SIMP_TAC std_ss [SET_RULE
16448         ``(k INTER {x | P x} = k) <=> (!x. x IN k ==> P x)``] THEN
16449        X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN
16450        SUBGOAL_THEN ``x IN interval[a:real,b]`` MP_TAC THENL
16451         [ASM_MESON_TAC[SUBSET_DEF, division_of], ALL_TAC] THEN
16452        ASM_SIMP_TAC std_ss [IN_INTERVAL],
16453        MATCH_MP_TAC(REAL_ARITH ``&0 <= y /\ x <= y ==> x <= &2 * y:real``) THEN
16454        REWRITE_TAC[CONTENT_POS_LE] THEN MATCH_MP_TAC CONTENT_SUBSET THEN
16455        SIMP_TAC std_ss [SUBSET_INTERVAL] THEN MESON_TAC[REAL_LE_REFL]],
16456      ALL_TAC] THEN
16457  ASM_CASES_TAC ``c = b:real`` THENL
16458  [ASM_SIMP_TAC std_ss [REAL_SUB_REFL, REAL_MUL_LZERO, CONTENT_POS_LE] THEN
16459   MATCH_MP_TAC(REAL_ARITH ``(x = y) /\ a <= b ==> x <= a ==> y <= b:real``) THEN
16460      CONJ_TAC THENL
16461       [AP_TERM_TAC THEN MATCH_MP_TAC SUM_EQ THEN
16462        X_GEN_TAC ``k:real->bool`` THEN DISCH_TAC THEN
16463        PURE_REWRITE_TAC[o_THM] THEN AP_TERM_TAC THEN
16464        SIMP_TAC std_ss [real_ge] THEN
16465        ONCE_REWRITE_TAC [METIS [] ``({x | a <= x} = {x | (\x. a <= x) (x:real)}) /\
16466                                     ({x | x <= a} = {x | (\x. x <= a) (x:real)})``] THEN
16467        SIMP_TAC std_ss [SET_RULE
16468         ``(k INTER {x | P x} = k) <=> (!x. x IN k ==> P x)``] THEN
16469        X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN
16470        SUBGOAL_THEN ``x IN interval[a:real,b]`` MP_TAC THENL
16471         [ASM_MESON_TAC[SUBSET_DEF, division_of], ALL_TAC] THEN
16472        ASM_SIMP_TAC std_ss [IN_INTERVAL],
16473        MATCH_MP_TAC(REAL_ARITH ``&0 <= y /\ x <= y ==> x <= &2 * y:real``) THEN
16474        REWRITE_TAC[CONTENT_POS_LE] THEN MATCH_MP_TAC CONTENT_SUBSET THEN
16475        SIMP_TAC std_ss [SUBSET_INTERVAL] THEN MESON_TAC[REAL_LE_REFL]],
16476      ALL_TAC] THEN
16477  SUBGOAL_THEN ``(a:real) < c /\ c < (b:real)`` STRIP_ASSUME_TAC THENL
16478   [FULL_SIMP_TAC real_ss [REAL_LE_LT], ALL_TAC] THEN
16479  ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
16480  ASM_SIMP_TAC real_ss [GSYM REAL_LE_RDIV_EQ, REAL_SUB_LT] THEN
16481  REWRITE_TAC[real_div, REAL_ARITH ``x * &2 * inv y = &2 * x * inv y:real``] THEN
16482  REWRITE_TAC [GSYM real_div, GSYM REAL_MUL_ASSOC] THEN
16483  MATCH_MP_TAC(REAL_ARITH
16484   ``s <= s1 + s2 /\ (c1 = c) /\ (c2 = c)
16485    ==> s1 <= c1 /\ s2 <= c2 ==> s <= &2 * c:real``) THEN
16486  CONJ_TAC THENL
16487  [ (* goal 1 (of 2) *)
16488    ASM_SIMP_TAC std_ss [GSYM SUM_ADD] THEN MATCH_MP_TAC SUM_LE THEN
16489    ASM_SIMP_TAC std_ss [lemma0] THEN
16490    FIRST_ASSUM(fn th => SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION th]) THEN
16491    MAP_EVERY X_GEN_TAC [``u:real``, ``v:real``] THEN DISCH_TAC THEN
16492    SUBGOAL_THEN
16493     ``~(interval[u:real,v] = {}) /\ interval[u,v] SUBSET interval[a,b]``
16494    MP_TAC THENL [ASM_MESON_TAC[division_of, SUBSET_TRANS], ALL_TAC] THEN
16495    SIMP_TAC std_ss [INTERVAL_NE_EMPTY, SUBSET_INTERVAL, IMP_CONJ] THEN
16496    REPEAT STRIP_TAC THEN REWRITE_TAC[o_THM] THEN
16497    Know `!x x1 x2 c c1 c2. &0 <= x:real /\ (c1 + c2 = c:real) /\
16498      (~(c1 = &0) ==> (x1 = x)) /\ (~(c2 = &0) ==> (x2 = x))
16499      ==> (if c = &0 then &0 else x) <=
16500          (if c1 = &0 then &0 else x1) +
16501          (if c2 = &0 then &0 else x2)`
16502    >- (KILL_TAC >> rpt GEN_TAC \\
16503        rpt COND_CASES_TAC >> REAL_ASM_ARITH_TAC) \\
16504    DISCH_THEN MATCH_MP_TAC \\
16505    ASM_SIMP_TAC std_ss [GSYM CONTENT_SPLIT, REAL_LE_01],
16506    SUBGOAL_THEN
16507    ``~(interval[a,b] = {}) /\
16508      ~(interval[a:real,c] = {}) /\
16509      ~(interval[c:real,b] = {})``
16510    MP_TAC THENL
16511     [SIMP_TAC std_ss [INTERVAL_NE_EMPTY] THEN
16512      ASM_MESON_TAC[REAL_LT_IMP_LE, REAL_LE_REFL],
16513      ALL_TAC] THEN
16514    SIMP_TAC std_ss [content] THEN
16515    SIMP_TAC std_ss [INTERVAL_NE_EMPTY, INTERVAL_UPPERBOUND, INTERVAL_LOWERBOUND] THEN
16516    STRIP_TAC THEN UNDISCH_TAC ``c <> a:real`` THEN
16517    GEN_REWR_TAC LAND_CONV [REAL_ARITH ``(c <> a) <=> (c - a <> 0:real)``] THEN
16518    UNDISCH_TAC ``c <> b:real`` THEN
16519    GEN_REWR_TAC LAND_CONV [REAL_ARITH ``(c <> b) <=> (b - c <> 0:real)``] THEN
16520    UNDISCH_TAC ``a < b:real`` THEN
16521    GEN_REWR_TAC LAND_CONV [REAL_ARITH ``(a < b) <=> (0 < b - a:real)``] THEN
16522    DISCH_THEN (MP_TAC o ONCE_REWRITE_RULE [EQ_SYM_EQ] o MATCH_MP REAL_LT_IMP_NE) THEN
16523    SIMP_TAC std_ss [REAL_DIV_REFL] ]
16524QED
16525
16526Theorem BOUNDED_EQUIINTEGRAL_OVER_THIN_TAGGED_PARTIAL_DIVISION :
16527  !fs f:real->real a b e.
16528    fs equiintegrable_on interval[a,b] /\ f IN fs /\
16529    (!h x. h IN fs /\ x IN interval[a,b] ==> abs(h x) <= abs(f x)) /\
16530    &0 < e
16531    ==> ?d. gauge d /\
16532            !c p h. c IN interval[a,b] /\
16533                      p tagged_partial_division_of interval[a,b] /\
16534                      d FINE p /\
16535                      h IN fs /\
16536                      (!x k. (x,k) IN p ==> ~(k INTER {x | x = c} = {}))
16537                      ==> sum p(\(x,k). abs(integral k h)) < e
16538Proof
16539  REPEAT STRIP_TAC THEN
16540  ASM_CASES_TAC ``content(interval[a:real,b]) = &0`` THENL
16541   [EXISTS_TAC ``\x:real. ball(x,&1)`` THEN REWRITE_TAC[GAUGE_TRIVIAL] THEN
16542    REPEAT STRIP_TAC THEN FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
16543     ``&0 < e ==> (x = &0) ==> x < e:real``)) THEN
16544    MATCH_MP_TAC SUM_EQ_0 THEN SIMP_TAC std_ss [FORALL_PROD] THEN
16545    GEN_TAC THEN X_GEN_TAC ``k:real->bool`` THEN DISCH_TAC THEN
16546    SUBGOAL_THEN
16547     ``?u v:real. (k = interval[u,v]) /\ interval[u,v] SUBSET interval[a,b]``
16548    STRIP_ASSUME_TAC THENL
16549     [METIS_TAC[tagged_partial_division_of], ALL_TAC] THEN
16550    ASM_REWRITE_TAC[ABS_ZERO] THEN MATCH_MP_TAC INTEGRAL_NULL THEN
16551    ASM_MESON_TAC[CONTENT_0_SUBSET],
16552    ALL_TAC] THEN
16553  FIRST_ASSUM(MP_TAC o REWRITE_RULE [GSYM CONTENT_LT_NZ]) THEN
16554  DISCH_THEN(fn th => ASSUME_TAC th THEN MP_TAC th) THEN
16555  REWRITE_TAC[CONTENT_POS_LT_EQ] THEN STRIP_TAC THEN
16556  SUBGOAL_THEN
16557   ``?d. gauge d /\
16558        !p h. p tagged_partial_division_of interval [a,b] /\
16559              d FINE p /\ (h:real->real) IN fs
16560              ==> sum p (\(x,k). abs(content k * h x - integral k h)) <
16561                  e / &2``
16562   (X_CHOOSE_THEN ``g0:real->real->bool`` STRIP_ASSUME_TAC)
16563  THENL
16564   [UNDISCH_TAC ``fs equiintegrable_on interval [(a,b)]`` THEN DISCH_TAC THEN
16565    FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [equiintegrable_on]) THEN
16566    DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC (MP_TAC o SPEC
16567      ``e / &5 / (&1 + &1:real)``)) THEN
16568    ASM_SIMP_TAC real_ss [REAL_LT_DIV, REAL_ARITH ``&0 < &5:real``,
16569      METIS [REAL_LT, REAL_OF_NUM_ADD, GSYM ADD1, LESS_0] ``&0 < &n + &1:real``] THEN
16570    DISCH_THEN (X_CHOOSE_TAC ``g:real->real->bool``) THEN
16571    EXISTS_TAC ``g:real->real->bool`` THEN POP_ASSUM MP_TAC THEN
16572    STRIP_TAC THEN ASM_SIMP_TAC std_ss [] THEN MAP_EVERY X_GEN_TAC
16573     [``p:(real#(real->bool))->bool``, ``h:real->real``] THEN
16574    STRIP_TAC THEN
16575    MP_TAC(ISPECL [``h:real->real``, ``a:real``, ``b:real``,
16576           ``g:real->real->bool``, ``e / &5 / ((&1:real) + &1)``]
16577        HENSTOCK_LEMMA_PART2) THEN
16578    ASM_SIMP_TAC real_ss [REAL_LT_DIV, REAL_ARITH ``&0 < &5:real``,
16579      METIS [REAL_LT, REAL_OF_NUM_ADD, GSYM ADD1, LESS_0] ``&0 < &n + &1:real``] THEN
16580    DISCH_THEN(MP_TAC o SPEC ``p:(real#(real->bool))->bool``) THEN
16581    ASM_SIMP_TAC std_ss [] THEN MATCH_MP_TAC(REAL_ARITH
16582     ``a < b ==> x <= a ==> x < b:real``) THEN
16583    REWRITE_TAC [real_div, REAL_MUL_ASSOC] THEN
16584    ONCE_REWRITE_TAC [REAL_ARITH ``a * b * c * inv a = (a * inv a) * b * c:real``] THEN
16585    SIMP_TAC real_ss [REAL_MUL_RINV] THEN REWRITE_TAC [GSYM real_div] THEN
16586    SIMP_TAC real_ss [REAL_LT_RDIV_EQ] THEN ONCE_REWRITE_TAC [REAL_MUL_SYM] THEN
16587    REWRITE_TAC [real_div, REAL_MUL_ASSOC] THEN REWRITE_TAC [GSYM real_div] THEN
16588    SIMP_TAC real_ss [REAL_LT_LDIV_EQ] THEN UNDISCH_TAC ``0 < e:real`` THEN
16589    REAL_ARITH_TAC,
16590    ALL_TAC] THEN
16591  ABBREV_TAC
16592   ``g:real->real->bool =
16593       \x. g0(x) INTER
16594           ball(x,(e / &8 / (abs(f x:real) + &1)) *
16595                  inf(IMAGE (\m. b - a) { 1n.. 1n}) /
16596                  content(interval[a:real,b]))`` THEN
16597  SUBGOAL_THEN ``gauge(g:real->real->bool)`` ASSUME_TAC THENL
16598   [EXPAND_TAC "g" THEN
16599    KNOW_TAC ``(gauge (\(x :real).
16600      (g0 :real -> real -> bool) x INTER
16601      (\x. ball (x, (e :real) / (8 :real) /
16602         (abs ((f :real -> real) x) + (1 :real)) *
16603         inf (IMAGE (\(m :num). (b :real) - (a :real))
16604              { 1n ..  1n}) / content (interval [(a,b)]))) x) : bool)`` THENL
16605    [ALL_TAC, METIS_TAC []] THEN
16606    MATCH_MP_TAC GAUGE_INTER THEN ASM_REWRITE_TAC[] THEN
16607    SIMP_TAC std_ss [gauge_def, OPEN_BALL, CENTRE_IN_BALL] THEN
16608    X_GEN_TAC ``x:real`` THEN
16609    REWRITE_TAC [real_div, REAL_ARITH ``a * b * c * d * e =
16610                                       (a *  b * c) * (d * e:real)``] THEN
16611    MATCH_MP_TAC REAL_LT_MUL THEN REWRITE_TAC [GSYM real_div] THEN
16612    ASM_SIMP_TAC real_ss [REAL_LT_DIV, REAL_ARITH
16613     ``&0 < &8:real /\ &0 < abs(x:real) + &1:real``] THEN
16614    MATCH_MP_TAC REAL_LT_DIV THEN ASM_REWRITE_TAC[] THEN
16615    REWRITE_TAC [NUMSEG_SING, IMAGE_SING, INF_SING] THEN
16616    UNDISCH_TAC ``a < b:real`` THEN REAL_ARITH_TAC,
16617    ALL_TAC] THEN
16618  EXISTS_TAC ``g:real->real->bool`` THEN ASM_REWRITE_TAC[] THEN
16619  MAP_EVERY X_GEN_TAC
16620   [``c:real``, ``p:(real#(real->bool))->bool``,
16621    ``h:real->real``] THEN
16622  STRIP_TAC THEN
16623  SUBGOAL_THEN
16624   ``interval[c:real,b] SUBSET interval[a,b]``
16625  ASSUME_TAC THENL
16626   [UNDISCH_TAC ``c IN interval[a:real,b]`` THEN
16627    SIMP_TAC std_ss [IN_INTERVAL, SUBSET_INTERVAL, REAL_LE_REFL],
16628    ALL_TAC] THEN
16629  SUBGOAL_THEN ``FINITE(p:(real#(real->bool))->bool)`` ASSUME_TAC THENL
16630   [METIS_TAC[tagged_partial_division_of], ALL_TAC] THEN
16631  MP_TAC(ASSUME ``(g:real->real->bool) FINE p``) THEN EXPAND_TAC "g" THEN
16632  ONCE_REWRITE_TAC [METIS [] ``!x.
16633    (ball (x,
16634      e / 8 / (abs (f x) + 1) * inf (IMAGE (\m. b - a) {1 .. 1}) /
16635      content (interval [(a,b)]))) =
16636    (\x. ball (x,
16637      e / 8 / (abs (f x) + 1) * inf (IMAGE (\m. b - a) {1 .. 1}) /
16638      content (interval [(a,b)]))) x``] THEN
16639  REWRITE_TAC[FINE_INTER] THEN
16640  DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC ASSUME_TAC) THEN
16641  FIRST_X_ASSUM(MP_TAC o SPEC ``p:(real#(real->bool))->bool``) THEN
16642  DISCH_THEN(MP_TAC o SPEC ``h:real->real``) THEN
16643  KNOW_TAC ``(p :real # (real -> bool) -> bool) tagged_partial_division_of
16644             interval [((a :real),(b :real))] /\
16645             (g0 :real -> real -> bool) FINE p /\
16646             (h :real -> real) IN (fs :(real -> real) -> bool)`` THENL
16647   [ASM_MESON_TAC[TAGGED_PARTIAL_DIVISION_OF_SUBSET],
16648    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
16649  GEN_REWR_TAC (RAND_CONV o RAND_CONV) [GSYM REAL_HALF] THEN
16650  MATCH_MP_TAC(REAL_ARITH
16651   ``x - y <= e / &2 ==> y < e / &2 ==> x < e / 2 + e / 2:real``) THEN
16652  ASM_SIMP_TAC std_ss [GSYM SUM_SUB] THEN
16653  SIMP_TAC std_ss [LAMBDA_PROD] THEN MATCH_MP_TAC REAL_LE_TRANS THEN
16654  EXISTS_TAC
16655   ``sum p (\(x:real,k:real->bool). abs(content k * h x:real))`` THEN
16656  CONJ_TAC THENL
16657   [MATCH_MP_TAC SUM_LE THEN ASM_SIMP_TAC std_ss [FORALL_PROD] THEN
16658    REWRITE_TAC[REAL_ARITH ``abs y - abs(x - y:real) <= abs x``],
16659    ALL_TAC] THEN
16660  MATCH_MP_TAC REAL_LE_TRANS THEN
16661  EXISTS_TAC
16662   ``sum p (\(x:real,k).
16663                   e / &4 * (b - a) / content(interval[a:real,b]) *
16664                   content(k:real->bool) /
16665                   (interval_upperbound k - interval_lowerbound k))`` THEN
16666  CONJ_TAC THENL
16667   [MATCH_MP_TAC SUM_LE THEN ASM_SIMP_TAC std_ss [FORALL_PROD] THEN
16668    MAP_EVERY X_GEN_TAC [``x:real``, ``k:real->bool``] THEN DISCH_TAC THEN
16669    ASM_CASES_TAC ``content(k:real->bool) = &0`` THENL
16670     [ASM_REWRITE_TAC[real_div, REAL_MUL_LZERO, ABS_0,
16671                      REAL_MUL_RZERO, REAL_LE_REFL],
16672      ALL_TAC] THEN
16673    REWRITE_TAC [real_div] THEN
16674    ONCE_REWRITE_TAC [REAL_ARITH ``a * b * c * d * content k * f =
16675                               content k * ((a * b) * (c * d) * f:real)``] THEN
16676    REWRITE_TAC [GSYM real_div] THEN REWRITE_TAC[ABS_MUL] THEN
16677    SUBGOAL_THEN ``&0 < content(k:real->bool)`` ASSUME_TAC THENL
16678     [METIS_TAC[CONTENT_LT_NZ, tagged_partial_division_of], ALL_TAC] THEN
16679    GEN_REWR_TAC (LAND_CONV o LAND_CONV) [abs] THEN
16680    ASM_SIMP_TAC std_ss [REAL_LT_IMP_LE, REAL_LE_LMUL] THEN
16681    MATCH_MP_TAC(REAL_ARITH ``x + &1 <= y ==> x <= y:real``) THEN
16682    SUBGOAL_THEN ``?u v. k = interval[u:real,v]`` MP_TAC THENL
16683     [METIS_TAC[tagged_partial_division_of], ALL_TAC] THEN
16684    DISCH_THEN(REPEAT_TCL CHOOSE_THEN SUBST_ALL_TAC) THEN
16685    MP_TAC(ISPECL [``u:real``, ``v:real``] CONTENT_POS_LT_EQ) THEN
16686    ASM_SIMP_TAC std_ss [INTERVAL_UPPERBOUND, INTERVAL_LOWERBOUND, REAL_LT_IMP_LE] THEN
16687    DISCH_TAC THEN
16688    W(MP_TAC o PART_MATCH (lhand o rand) REAL_LE_RDIV_EQ o snd) THEN
16689    ASM_SIMP_TAC std_ss [REAL_SUB_LT] THEN DISCH_THEN SUBST1_TAC THEN
16690    GEN_REWR_TAC LAND_CONV [REAL_MUL_SYM] THEN
16691    SIMP_TAC real_ss [GSYM REAL_LE_RDIV_EQ, REAL_ARITH ``&0 < abs(x:real) + &1``] THEN
16692    UNDISCH_TAC ``(\x. ball (x,
16693             e / 8 / (abs (f x) + 1) *
16694             inf (IMAGE (\m. b - a) {1 .. 1}) /
16695             content (interval [(a,b)]))) FINE p`` THEN
16696    REWRITE_TAC[FINE] THEN
16697    DISCH_THEN(MP_TAC o SPECL [``x:real``, ``interval[u:real,v]``]) THEN
16698    ASM_REWRITE_TAC[SUBSET_DEF] THEN
16699    DISCH_THEN(fn th => MP_TAC(SPEC ``v:real`` th) THEN
16700                        MP_TAC(SPEC ``u:real`` th)) THEN
16701    ASM_SIMP_TAC std_ss [INTERVAL_NE_EMPTY, REAL_LT_IMP_LE, ENDS_IN_INTERVAL] THEN
16702    REWRITE_TAC[IN_BALL, AND_IMP_INTRO] THEN REWRITE_TAC [dist] THEN
16703    MATCH_MP_TAC(REAL_ARITH
16704     ``abs(vi - ui) <= abs(v - u:real) /\ &2 * a <= b
16705      ==> abs(x - u) < a /\ abs(x - v) < a ==> vi - ui <= b``) THEN
16706    ASM_SIMP_TAC real_ss [] THEN
16707    REWRITE_TAC [real_div] THEN ONCE_REWRITE_TAC [REAL_ARITH ``8 = 2 * 4:real``] THEN
16708    SIMP_TAC real_ss [REAL_INV_MUL] THEN
16709    ONCE_REWRITE_TAC [REAL_ARITH ``a * (b * (inv a * c) * d * f * g:real) =
16710                                   b * ((a *inv a) * c) * d * f * g``] THEN
16711    SIMP_TAC real_ss [REAL_MUL_RINV, REAL_MUL_LID] THEN
16712    REWRITE_TAC[GSYM REAL_MUL_ASSOC] THEN
16713    MATCH_MP_TAC REAL_LE_LMUL_IMP THEN ASM_SIMP_TAC real_ss [REAL_LT_IMP_LE] THEN
16714    MATCH_MP_TAC REAL_LE_LMUL_IMP THEN KNOW_TAC ``0 <= inv 4:real`` THENL
16715     [SIMP_TAC real_ss [REAL_INV_1OVER, REAL_LE_RDIV_EQ],
16716      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
16717    REWRITE_TAC [REAL_MUL_ASSOC] THEN
16718    ONCE_REWRITE_TAC [REAL_ARITH ``a * b * c <= e * f * g <=>
16719                                   (b * a) * c <= (e * g) * f:real``] THEN
16720    MATCH_MP_TAC REAL_LE_RMUL_IMP THEN
16721    ASM_SIMP_TAC real_ss [REAL_LE_INV_EQ, REAL_LT_IMP_LE] THEN
16722    REWRITE_TAC [GSYM real_div] THEN
16723    MATCH_MP_TAC(REAL_ARITH ``abs x <= e ==> x <= e:real``) THEN
16724    REWRITE_TAC[real_div, ABS_MUL] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
16725    REWRITE_TAC[REAL_ABS_POS] THEN CONJ_TAC THENL
16726     [MATCH_MP_TAC(REAL_ARITH ``&0 <= x /\ x <= y ==> abs x <= y:real``) THEN
16727      SIMP_TAC real_ss [NUMSEG_SING, IMAGE_SING, INF_SING, REAL_LE_REFL] THEN
16728      UNDISCH_TAC ``a < b:real`` THEN REAL_ARITH_TAC,
16729      KNOW_TAC ``abs ((f:real->real) x) + 1 <> 0:real`` THENL
16730       [REAL_ARITH_TAC, DISCH_TAC] THEN
16731      ASM_SIMP_TAC real_ss [ABS_INV] THEN MATCH_MP_TAC REAL_LE_INV2 THEN
16732      CONJ_TAC THENL [REAL_ARITH_TAC, ALL_TAC] THEN
16733      MATCH_MP_TAC(REAL_ARITH ``x <= y ==> x + &1 <= abs(y + &1:real)``) THEN
16734      FIRST_X_ASSUM MATCH_MP_TAC THEN
16735      METIS_TAC[tagged_partial_division_of, SUBSET_DEF]],
16736    ALL_TAC] THEN
16737  FIRST_ASSUM(MP_TAC o MATCH_MP TAGGED_PARTIAL_DIVISION_OF_UNION_SELF) THEN
16738  DISCH_THEN(MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
16739    SUM_OVER_TAGGED_DIVISION_LEMMA)) THEN
16740  ONCE_REWRITE_TAC [METIS []
16741    ``(\(x,k).
16742         e / 4 * (b - a) / content (interval [(a,b)]) * content k /
16743     (interval_upperbound k - interval_lowerbound k)) =
16744      (\(x,k).
16745    (\k. e / 4 * (b - a) / content (interval [(a,b)]) * content k /
16746     (interval_upperbound k - interval_lowerbound k)) k)``] THEN
16747  DISCH_THEN(fn th =>
16748    W(MP_TAC o PART_MATCH (lhs o rand) th o lhand o snd)) THEN
16749  SIMP_TAC std_ss [] THEN
16750  KNOW_TAC ``(!(u :real) (v :real).
16751    interval [(u,v)] <> ({} :real -> bool) ==>
16752    (content (interval [(u,v)]) = (0 :real)) ==>
16753    ((e :real) / (4 :real) * ((b :real) - (a :real)) /
16754     content (interval [(a,b)]) * (0 :real) /
16755     (interval_upperbound (interval [(u,v)]) -
16756      interval_lowerbound (interval [(u,v)])) =
16757     (0 : real)))`` THENL
16758   [SIMP_TAC std_ss [real_div, REAL_MUL_LZERO, REAL_MUL_RZERO],
16759    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
16760    DISCH_THEN SUBST1_TAC] THEN
16761  REWRITE_TAC [real_div] THEN
16762  KNOW_TAC ``sum
16763  (IMAGE (SND :real # (real -> bool) -> real -> bool)
16764     (p :real # (real -> bool) -> bool))
16765  (\(k :real -> bool).
16766     ((e :real) * inv (4 :real) * ((b :real) - (a :real)) *
16767     inv (content (interval [(a,b)]))) * (\k. content k *
16768     inv (interval_upperbound k - interval_lowerbound k)) k) <=
16769    e * inv (2 :real)`` THENL
16770  [ALL_TAC, SIMP_TAC std_ss [] THEN REWRITE_TAC [REAL_MUL_ASSOC]] THEN
16771  REWRITE_TAC [SUM_LMUL] THEN
16772  ONCE_REWRITE_TAC [REAL_ARITH ``a * b * c * d * e = (a * c * d * e) * b:real``] THEN
16773  REWRITE_TAC [GSYM real_div] THEN SIMP_TAC real_ss [REAL_LE_LDIV_EQ] THEN
16774  REWRITE_TAC [REAL_ARITH ``4 = 2 * 2:real``, real_div, REAL_MUL_ASSOC] THEN
16775  ONCE_REWRITE_TAC [REAL_ARITH ``a * b * c * d = a * (b * c) * d:real``] THEN
16776  SIMP_TAC real_ss [REAL_MUL_LINV] THEN SIMP_TAC real_ss [REAL_MUL_ASSOC] THEN
16777  ASM_SIMP_TAC real_ss [GSYM REAL_MUL_ASSOC, REAL_LE_LMUL] THEN
16778  ONCE_REWRITE_TAC [REAL_ARITH ``a * (b * c) = (a * c) * b:real``] THEN
16779  REWRITE_TAC [GSYM real_div] THEN ASM_SIMP_TAC std_ss [REAL_LE_LDIV_EQ] THEN
16780  MATCH_MP_TAC SUM_CONTENT_AREA_OVER_THIN_DIVISION THEN
16781  EXISTS_TAC ``BIGUNION (IMAGE SND (p:(real#(real->bool))->bool))`` THEN
16782  EXISTS_TAC ``(c:real)`` THEN
16783  RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN ASM_SIMP_TAC std_ss [] THEN
16784  REPEAT CONJ_TAC THENL
16785   [MATCH_MP_TAC DIVISION_OF_TAGGED_DIVISION THEN
16786    ASM_MESON_TAC[TAGGED_PARTIAL_DIVISION_OF_UNION_SELF],
16787    SIMP_TAC std_ss [BIGUNION_SUBSET, FORALL_IN_IMAGE, FORALL_PROD] THEN
16788    METIS_TAC[tagged_partial_division_of],
16789    ASM_SIMP_TAC std_ss [FORALL_IN_IMAGE, FORALL_PROD] THEN
16790    METIS_TAC []]
16791QED
16792
16793Theorem lemma[local]:
16794     (!x k. (x,k) IN IMAGE (\(x,k). f x k,g x k) s ==> Q x k) <=>
16795     (!x k. (x,k) IN s ==> Q (f x k) (g x k))
16796Proof
16797    SIMP_TAC std_ss [IN_IMAGE, PAIR_EQ, EXISTS_PROD] THEN SET_TAC[]
16798QED
16799
16800Theorem EQUIINTEGRABLE_HALFSPACE_RESTRICTIONS_LE :
16801    !fs f:real->real a b.
16802        fs equiintegrable_on interval[a,b] /\ f IN fs /\
16803        (!h x. h IN fs /\ x IN interval[a,b] ==> abs(h x) <= abs(f x))
16804        ==> { (\x. if x <= c then h x else 0) | c IN univ(:real) /\ h IN fs }
16805            equiintegrable_on interval[a,b]
16806Proof
16807  REPEAT STRIP_TAC THEN
16808  ASM_CASES_TAC ``content(interval[a:real,b]) = &0`` THEN
16809  ASM_SIMP_TAC std_ss [EQUIINTEGRABLE_ON_NULL] THEN
16810  FIRST_ASSUM(MP_TAC o REWRITE_RULE [GSYM CONTENT_LT_NZ]) THEN
16811  DISCH_THEN(fn th => ASSUME_TAC th THEN MP_TAC th) THEN
16812  REWRITE_TAC[CONTENT_POS_LT_EQ] THEN STRIP_TAC THEN
16813  REWRITE_TAC[equiintegrable_on] THEN
16814  SIMP_TAC std_ss [IMP_CONJ, RIGHT_FORALL_IMP_THM, FORALL_IN_GSPEC] THEN
16815  SIMP_TAC std_ss [IN_UNIV, AND_IMP_INTRO, GSYM CONJ_ASSOC, RIGHT_IMP_FORALL_THM,
16816              IN_NUMSEG] THEN
16817  UNDISCH_TAC ``fs equiintegrable_on interval [(a,b)]`` THEN DISCH_TAC THEN
16818  FIRST_ASSUM(ASSUME_TAC o CONJUNCT1 o REWRITE_RULE[equiintegrable_on]) THEN
16819  MATCH_MP_TAC(TAUT `a /\ (a ==> b) ==> a /\ b`) THEN CONJ_TAC THENL
16820  [ (* goal 1 (of 2) *)
16821    REPEAT GEN_TAC THEN
16822    ONCE_REWRITE_TAC[SET_RULE ``x <= c <=> x IN {x:real | x <= c}``] THEN
16823    REWRITE_TAC[INTEGRABLE_RESTRICT_INTER] THEN
16824    ONCE_REWRITE_TAC[INTER_COMM] THEN SIMP_TAC std_ss [INTERVAL_SPLIT] THEN
16825    REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRABLE_ON_SUBINTERVAL THEN
16826    EXISTS_TAC ``interval[a:real,b]`` THEN ASM_SIMP_TAC std_ss [] THEN
16827    SIMP_TAC std_ss [SUBSET_INTERVAL, REAL_LE_REFL] THEN
16828    rw [REAL_LE_MIN, REAL_MIN_LE, REAL_LE_REFL],
16829    (* goal 2 (of 2) *)
16830    DISCH_TAC ] THEN
16831  X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
16832  MP_TAC(ISPECL [``fs:(real->real)->bool``, ``f:real->real``,
16833                 ``a:real``, ``b:real``, ``e / &12:real``]
16834        BOUNDED_EQUIINTEGRAL_OVER_THIN_TAGGED_PARTIAL_DIVISION) THEN
16835  ASM_SIMP_TAC real_ss [REAL_LT_DIV, REAL_ARITH ``&0 < &12:real``] THEN
16836  DISCH_THEN(X_CHOOSE_THEN ``g0:real->real->bool`` STRIP_ASSUME_TAC) THEN
16837  SUBGOAL_THEN
16838   ``?d. gauge d /\
16839        !p h. p tagged_partial_division_of interval [a,b] /\
16840              d FINE p /\ (h:real->real) IN fs
16841              ==> sum p (\(x,k). abs(content k * h x - integral k h)) <
16842                  e / &3``
16843   (X_CHOOSE_THEN ``g1:real->real->bool`` STRIP_ASSUME_TAC)
16844  THENL
16845   [UNDISCH_TAC ``fs equiintegrable_on interval [(a,b)]`` THEN DISCH_TAC THEN
16846    FIRST_ASSUM(MP_TAC o CONJUNCT2 o REWRITE_RULE[equiintegrable_on]) THEN
16847    DISCH_THEN(MP_TAC o SPEC ``e / &7 / ((&1:real) + &1)``) THEN
16848    ASM_SIMP_TAC real_ss [REAL_LT_DIV, REAL_ARITH ``&0 < &7:real``,
16849     METIS [REAL_LT, REAL_OF_NUM_ADD, GSYM ADD1, LESS_0] ``&0 < &n + &1:real``] THEN
16850    DISCH_THEN (X_CHOOSE_TAC ``d:real->real->bool``) THEN
16851    EXISTS_TAC ``d:real->real->bool`` THEN POP_ASSUM MP_TAC THEN
16852    STRIP_TAC THEN ASM_SIMP_TAC std_ss [] THEN
16853    MAP_EVERY X_GEN_TAC
16854     [``p:(real#(real->bool))->bool``, ``h:real->real``] THEN
16855    STRIP_TAC THEN
16856    MP_TAC(ISPECL [``h:real->real``, ``a:real``, ``b:real``,
16857           ``d:real->real->bool``, ``e / &7 / ((&1:real) + &1)``]
16858        HENSTOCK_LEMMA_PART2) THEN
16859    ASM_SIMP_TAC real_ss [REAL_LT_DIV, REAL_ARITH ``&0 < &7:real``,
16860      METIS [REAL_LT, REAL_OF_NUM_ADD, GSYM ADD1, LESS_0] ``&0 < &n + &1:real``] THEN
16861    DISCH_THEN(MP_TAC o SPEC ``p:(real#(real->bool))->bool``) THEN
16862    ASM_SIMP_TAC std_ss [] THEN MATCH_MP_TAC(REAL_ARITH
16863     ``a < b ==> x <= a ==> x < b:real``) THEN
16864    REWRITE_TAC [real_div, REAL_MUL_ASSOC] THEN
16865    ONCE_REWRITE_TAC [REAL_ARITH ``a * b * c * inv a = (a * inv a) * b * c:real``] THEN
16866    SIMP_TAC real_ss [REAL_MUL_RINV] THEN REWRITE_TAC [GSYM real_div] THEN
16867    SIMP_TAC real_ss [REAL_LT_RDIV_EQ] THEN ONCE_REWRITE_TAC [REAL_MUL_SYM] THEN
16868    REWRITE_TAC [real_div, REAL_MUL_ASSOC] THEN REWRITE_TAC [GSYM real_div] THEN
16869    SIMP_TAC real_ss [REAL_LT_LDIV_EQ] THEN UNDISCH_TAC ``0 < e:real`` THEN
16870    REAL_ARITH_TAC,
16871    ALL_TAC] THEN
16872  EXISTS_TAC ``\x. (g0:real->real->bool) x INTER g1 x`` THEN
16873  ASM_SIMP_TAC std_ss [GAUGE_INTER, FINE_INTER] THEN
16874  KNOW_TAC ``!(c :real). (\c. !(h :real -> real) (p :real # (real -> bool) -> bool).
16875  h IN (fs :(real -> real) -> bool) /\
16876  p tagged_division_of interval [((a :real),(b :real))] /\
16877  (g0 :real -> real -> bool) FINE p /\
16878  (g1 :real -> real -> bool) FINE p ==>
16879  abs
16880    (sum p
16881       (\((x :real),(k :real -> bool)).
16882          content k * if x <= c then h x else (0 :real)) -
16883     integral (interval [(a,b)])
16884       (\(x :real). if x <= c then h x else (0 :real))) < (e :real)) c`` THENL
16885  [ALL_TAC, METIS_TAC []] THEN
16886  MP_TAC(MESON[]
16887   ``!P. ((!c. (a:real) <= c /\ c <= (b:real) ==> P c) ==> (!c. P c)) /\
16888        (!c. (a:real) <= c /\ c <= (b:real) ==> P c)
16889        ==> !c. P c``) THEN
16890  DISCH_THEN MATCH_MP_TAC THEN CONJ_TAC THEN SIMP_TAC std_ss [] THENL
16891  [ (* goal 1 (of 2) *)
16892    DISCH_THEN(ASSUME_TAC) THEN
16893    X_GEN_TAC ``c:real`` THEN
16894    ASM_CASES_TAC ``(a:real) <= c /\ c <= (b:real)`` THENL
16895    [ UNDISCH_TAC ``!c.
16896         a <= c /\ c <= b ==>
16897         !h p. h IN fs /\ p tagged_division_of interval [(a,b)] /\
16898           g0 FINE p /\ g1 FINE p ==>
16899           abs (sum p (\(x,k). content k * if x <= c then h x else 0) -
16900              integral (interval [(a,b)])
16901                (\x. if x <= c then h x else 0)) < e`` THEN DISCH_TAC THEN
16902      FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[], ALL_TAC ] THEN
16903    UNDISCH_TAC ``!c.
16904         a <= c /\ c <= b ==>
16905         !h p. h IN fs /\ p tagged_division_of interval [(a,b)] /\
16906           g0 FINE p /\ g1 FINE p ==>
16907           abs (sum p (\(x,k). content k * if x <= c then h x else 0) -
16908              integral (interval [(a,b)])
16909                (\x. if x <= c then h x else 0)) < e`` THEN DISCH_TAC THEN
16910    FIRST_X_ASSUM (MP_TAC o SPEC ``(b:real)``) THEN
16911    ASM_SIMP_TAC std_ss [REAL_LT_IMP_LE, REAL_LE_REFL] THEN
16912    DISCH_TAC THEN X_GEN_TAC ``h:real->real`` THEN
16913    X_GEN_TAC ``p:real#(real->bool)->bool`` THEN
16914    POP_ASSUM (MP_TAC o SPECL [``h:real->real``,``p:real#(real->bool)->bool``]) THEN
16915    DISCH_THEN(fn th => STRIP_TAC THEN MP_TAC th) THEN ASM_REWRITE_TAC[] THEN
16916    UNDISCH_TAC ``~(a <= c /\ c <= b:real)`` THEN DISCH_TAC THEN
16917    FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [DE_MORGAN_THM]) THEN
16918    REWRITE_TAC[REAL_NOT_LE] THEN STRIP_TAC THENL
16919    [ (* goal 1.1 (of 2) *)
16920      DISCH_TAC THEN MATCH_MP_TAC(REAL_ARITH
16921       ``(x:real = 0) /\ (y = 0) /\ &0 < e ==> abs(x - y) < e:real``) THEN
16922      ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
16923      [ MATCH_MP_TAC SUM_EQ_0 THEN SIMP_TAC std_ss [FORALL_PROD] THEN
16924        MAP_EVERY X_GEN_TAC [``x:real``, ``k:real->bool``] THEN DISCH_TAC THEN
16925        COND_CASES_TAC THEN ASM_SIMP_TAC std_ss [REAL_MUL_RZERO] THEN
16926        SUBGOAL_THEN ``(x:real) IN interval[a,b]`` MP_TAC THENL
16927         [ASM_MESON_TAC[TAGGED_DIVISION_OF, SUBSET_DEF], ALL_TAC] THEN
16928        REWRITE_TAC[IN_INTERVAL] THEN
16929        UNDISCH_TAC ``c < a:real`` THEN POP_ASSUM MP_TAC THEN
16930        REAL_ARITH_TAC,
16931        MATCH_MP_TAC EQ_TRANS THEN
16932        EXISTS_TAC ``integral(interval[a,b]) ((\x. 0):real->real)`` THEN
16933        CONJ_TAC THENL [ALL_TAC, SIMP_TAC std_ss [INTEGRAL_0]] THEN
16934        MATCH_MP_TAC INTEGRAL_EQ THEN SIMP_TAC std_ss [] THEN GEN_TAC THEN
16935        COND_CASES_TAC THEN ASM_REWRITE_TAC[IN_INTERVAL] THEN
16936        UNDISCH_TAC ``c < a:real`` THEN POP_ASSUM MP_TAC THEN
16937        REAL_ARITH_TAC],
16938      (* goal 1.2 (of 2) *)
16939      MATCH_MP_TAC(REAL_ARITH
16940       ``(x:real = y) /\ (w = z) ==> abs(x - w) < e ==> abs(y - z) < e``) THEN
16941      CONJ_TAC THENL
16942      [ (* goal 1.2.1 (of 2) *)
16943        MATCH_MP_TAC SUM_EQ THEN SIMP_TAC std_ss [FORALL_PROD] THEN
16944        MAP_EVERY X_GEN_TAC [``x:real``, ``k:real->bool``] THEN DISCH_TAC THEN
16945        SUBGOAL_THEN ``(x:real) IN interval[a,b]`` MP_TAC THENL
16946         [ASM_MESON_TAC[TAGGED_DIVISION_OF, SUBSET_DEF], ALL_TAC] THEN
16947        REWRITE_TAC[IN_INTERVAL] THEN
16948        STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
16949        COND_CASES_TAC THEN ASM_REWRITE_TAC[REAL_MUL_RZERO] THEN
16950        UNDISCH_TAC ``b < c:real`` THEN POP_ASSUM MP_TAC THEN
16951        POP_ASSUM MP_TAC THEN REAL_ARITH_TAC,
16952        (* goal 1.2.2 (of 2) *)
16953        MATCH_MP_TAC INTEGRAL_EQ THEN SIMP_TAC std_ss [] THEN GEN_TAC THEN
16954        rpt COND_CASES_TAC THEN ASM_SIMP_TAC real_ss [IN_INTERVAL] THEN
16955        NTAC 3 (POP_ASSUM MP_TAC) >> REAL_ARITH_TAC ] ],
16956    (* goal 2 (of 2) *)
16957    ALL_TAC ] THEN
16958  X_GEN_TAC ``c:real`` THEN DISCH_TAC THEN
16959  MAP_EVERY X_GEN_TAC [``h:real->real``,
16960                  ``p:(real#(real->bool))->bool``] THEN STRIP_TAC THEN
16961  ABBREV_TAC
16962   ``q:(real#(real->bool))->bool =
16963        {(x,k) | (x,k) IN p /\ ~(k INTER {x | x <= c} = {})}`` THEN
16964  MP_TAC(ISPECL
16965   [``\x. if x <= c then (h:real->real) x else 0``,
16966    ``a:real``, ``b:real``, ``p:(real#(real->bool))->bool``]
16967        INTEGRAL_COMBINE_TAGGED_DIVISION_TOPDOWN) THEN
16968  ASM_SIMP_TAC std_ss [] THEN DISCH_THEN SUBST1_TAC THEN
16969  SUBGOAL_THEN ``FINITE(p:(real#(real->bool))->bool)`` ASSUME_TAC THENL
16970   [ASM_MESON_TAC[TAGGED_DIVISION_OF], ALL_TAC] THEN
16971  SUBGOAL_THEN ``q SUBSET (p:(real#(real->bool))->bool)`` ASSUME_TAC THENL
16972   [EXPAND_TAC "q" THEN SIMP_TAC std_ss [SUBSET_DEF, FORALL_PROD, IN_ELIM_PAIR_THM],
16973    ALL_TAC] THEN
16974  SUBGOAL_THEN ``FINITE(q:(real#(real->bool))->bool)`` ASSUME_TAC THENL
16975   [ASM_MESON_TAC[FINITE_SUBSET], ALL_TAC] THEN
16976  ASM_SIMP_TAC std_ss [GSYM SUM_SUB] THEN SIMP_TAC std_ss [LAMBDA_PROD] THEN
16977  SUBGOAL_THEN ``q tagged_partial_division_of interval[a:real,b] /\
16978                g0 FINE q /\ g1 FINE q``
16979  STRIP_ASSUME_TAC THENL
16980   [ASM_MESON_TAC[TAGGED_PARTIAL_DIVISION_SUBSET, tagged_division_of,
16981                  FINE_SUBSET],
16982    ALL_TAC] THEN
16983  MATCH_MP_TAC(MESON[] ``!q. (sum p s = sum q s) /\ abs(sum q s) < e
16984                            ==> abs(sum p s:real) < e``) THEN
16985  EXISTS_TAC ``q:(real#(real->bool))->bool`` THEN CONJ_TAC THENL
16986  [ (* goal 1 (of 2) *)
16987    MATCH_MP_TAC SUM_SUPERSET THEN ASM_SIMP_TAC std_ss [FORALL_PROD] THEN
16988    EXPAND_TAC "q" THEN SIMP_TAC std_ss [IN_ELIM_PAIR_THM] THEN
16989    MAP_EVERY X_GEN_TAC [``x:real``, ``k:real->bool``] THEN
16990    DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN ASM_REWRITE_TAC[] THEN
16991    SUBGOAL_THEN ``(x:real) IN k`` ASSUME_TAC THENL
16992     [ASM_MESON_TAC[TAGGED_DIVISION_OF], ALL_TAC] THEN
16993    DISCH_THEN(fn th => ASSUME_TAC th THEN MP_TAC th) THEN
16994    REWRITE_TAC[EXTENSION] THEN DISCH_THEN(MP_TAC o SPEC ``x:real``) THEN
16995    REWRITE_TAC[IN_INTER, NOT_IN_EMPTY] THEN ASM_SIMP_TAC std_ss [] THEN
16996    SIMP_TAC std_ss [GSPECIFICATION] THEN DISCH_TAC THEN
16997    ASM_REWRITE_TAC[REAL_MUL_RZERO] THEN
16998    REWRITE_TAC[REAL_NEG_EQ0, REAL_SUB_LZERO] THEN
16999    MATCH_MP_TAC EQ_TRANS THEN
17000    EXISTS_TAC ``integral k ((\x. 0):real->real)`` THEN
17001    CONJ_TAC THENL [ALL_TAC, REWRITE_TAC[INTEGRAL_0]] THEN
17002    MATCH_MP_TAC INTEGRAL_EQ THEN ASM_SET_TAC[],
17003    (* goal 2 (of 2) *)
17004    ALL_TAC ] THEN
17005  SUBGOAL_THEN
17006   ``abs(sum q (\(x,k). content k * h x - integral k (h:real->real)))
17007        < e / &3``
17008  MP_TAC THENL
17009   [MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC ``sum q
17010      (\(x,k). abs(content k * h x - integral k (h:real->real)))`` THEN
17011    ASM_SIMP_TAC std_ss [] THEN MATCH_MP_TAC SUM_ABS_LE THEN
17012    ASM_SIMP_TAC std_ss [FORALL_PROD, REAL_LE_REFL],
17013    ALL_TAC] THEN
17014  SIMP_TAC real_ss [REAL_LT_RDIV_EQ] THEN
17015  MATCH_MP_TAC(REAL_ARITH
17016   ``abs(x - y:real) * 3 <= &2 * e
17017    ==> abs(x) * 3 < e ==> abs(y) < e``) THEN
17018  SIMP_TAC real_ss [GSYM REAL_LE_RDIV_EQ] THEN
17019  ASM_SIMP_TAC std_ss [GSYM SUM_SUB] THEN SIMP_TAC std_ss [LAMBDA_PROD] THEN
17020  ABBREV_TAC
17021   ``r:(real#(real->bool))->bool =
17022        {(x,k) | (x,k) IN q /\ ~(k SUBSET {x | x <= c})}`` THEN
17023  SUBGOAL_THEN ``r SUBSET (q:(real#(real->bool))->bool)`` ASSUME_TAC THENL
17024   [EXPAND_TAC "r" THEN SIMP_TAC std_ss [SUBSET_DEF, FORALL_PROD, IN_ELIM_PAIR_THM],
17025    ALL_TAC] THEN
17026  SUBGOAL_THEN ``FINITE(r:(real#(real->bool))->bool)`` ASSUME_TAC THENL
17027   [ASM_MESON_TAC[FINITE_SUBSET], ALL_TAC] THEN
17028  SUBGOAL_THEN ``r tagged_partial_division_of interval[a:real,b] /\
17029                g0 FINE r /\ g1 FINE r``
17030  STRIP_ASSUME_TAC THENL
17031   [ASM_MESON_TAC[TAGGED_PARTIAL_DIVISION_SUBSET, FINE_SUBSET],
17032    ALL_TAC] THEN
17033  MATCH_MP_TAC(MESON[] ``!r. (sum q s = sum r s) /\ abs(sum r s) <= e
17034                            ==> abs(sum q s:real) <= e``) THEN
17035  EXISTS_TAC ``r:(real#(real->bool))->bool`` THEN CONJ_TAC THENL
17036  [ (* goal 1 (of 2) *)
17037    MATCH_MP_TAC SUM_SUPERSET THEN ASM_SIMP_TAC std_ss [FORALL_PROD] THEN
17038    EXPAND_TAC "r" THEN SIMP_TAC std_ss [IN_ELIM_PAIR_THM] THEN
17039    MAP_EVERY X_GEN_TAC [``x:real``, ``k:real->bool``] THEN
17040    DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN ASM_SIMP_TAC std_ss [] THEN
17041    SUBGOAL_THEN ``(x:real) IN k`` ASSUME_TAC THENL
17042     [ASM_MESON_TAC[tagged_partial_division_of], ALL_TAC] THEN
17043    DISCH_THEN(fn th => ASSUME_TAC th THEN MP_TAC th) THEN
17044    REWRITE_TAC[SUBSET_DEF] THEN DISCH_THEN(MP_TAC o SPEC ``x:real``) THEN
17045    ASM_SIMP_TAC std_ss [GSPECIFICATION] THEN DISCH_TAC THEN ASM_REWRITE_TAC[] THEN
17046    REWRITE_TAC[REAL_ARITH ``c - i - (c - j):real = j - i``] THEN
17047    REWRITE_TAC[REAL_SUB_0] THEN MATCH_MP_TAC INTEGRAL_EQ THEN
17048    ASM_SET_TAC[],
17049    (* goal 2 (of 2) *)
17050    ALL_TAC ] THEN
17051  W(MP_TAC o PART_MATCH (lhand o rand) SUM_ABS o lhand o snd) THEN
17052  ASM_SIMP_TAC std_ss [] THEN
17053  MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] REAL_LE_TRANS) THEN
17054  ONCE_REWRITE_TAC[LAMBDA_PROD] THEN REWRITE_TAC[] THEN
17055  MAP_EVERY ABBREV_TAC
17056   [``s:(real#(real->bool))->bool =
17057        {(x,k) | (x,k) IN r /\ x IN {x | x <= c}}``,
17058    ``t:(real#(real->bool))->bool =
17059        {(x,k) | (x,k) IN r /\ ~(x IN {x | x <= c})}``] THEN
17060  SUBGOAL_THEN
17061   ``(s:(real#(real->bool))->bool) SUBSET r /\
17062     (t:(real#(real->bool))->bool) SUBSET r``
17063  STRIP_ASSUME_TAC THENL
17064   [MAP_EVERY EXPAND_TAC ["s", "t"] THEN
17065    SIMP_TAC std_ss [SUBSET_DEF, FORALL_PROD, IN_ELIM_PAIR_THM],
17066    ALL_TAC] THEN
17067  SUBGOAL_THEN
17068   ``FINITE(s:(real#(real->bool))->bool) /\
17069     FINITE(t:(real#(real->bool))->bool)``
17070  STRIP_ASSUME_TAC THENL [ASM_MESON_TAC[FINITE_SUBSET], ALL_TAC] THEN
17071  SUBGOAL_THEN ``DISJOINT (s:(real#(real->bool))->bool) t`` ASSUME_TAC THENL
17072   [MAP_EVERY EXPAND_TAC ["s", "t"] THEN
17073    SIMP_TAC std_ss [EXTENSION, DISJOINT_DEF, IN_INTER, FORALL_PROD,
17074                IN_ELIM_PAIR_THM] THEN SET_TAC[],
17075    ALL_TAC] THEN
17076  SUBGOAL_THEN ``r:(real#(real->bool))->bool = s UNION t`` SUBST1_TAC THENL
17077   [MAP_EVERY EXPAND_TAC ["s", "t"] THEN
17078    SIMP_TAC std_ss [EXTENSION, IN_UNION, FORALL_PROD, IN_ELIM_PAIR_THM] THEN
17079    SET_TAC[],
17080    ALL_TAC] THEN
17081  ASM_SIMP_TAC std_ss [SUM_UNION] THEN MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC
17082   ``sum s (\(x:real,k). abs
17083          (integral k (h:real->real) -
17084           integral k (\x. if x <= c then h x else 0))) +
17085    sum t (\(x:real,k). abs
17086          ((content k * (h:real->real) x - integral k h) +
17087           integral k (\x. if x <= c then h x else 0)))`` THEN
17088  CONJ_TAC THENL
17089   [MATCH_MP_TAC REAL_EQ_IMP_LE THEN BINOP_TAC THEN
17090    MATCH_MP_TAC SUM_EQ THEN SIMP_TAC std_ss [FORALL_PROD] THEN
17091    MAP_EVERY X_GEN_TAC [``x:real``, ``k:real->bool``] THEN
17092    MAP_EVERY EXPAND_TAC ["s", "t"] THEN
17093    SIMP_TAC std_ss [IN_ELIM_PAIR_THM] THEN SIMP_TAC std_ss [GSPECIFICATION] THEN
17094    STRIP_TAC THEN ASM_SIMP_TAC std_ss [] THENL
17095     [MATCH_MP_TAC(REAL_ARITH ``(a:real = -b) ==> (abs a = abs b)``) THEN
17096      REAL_ARITH_TAC,
17097      AP_TERM_TAC THEN REAL_ARITH_TAC],
17098    ALL_TAC] THEN
17099  SUBGOAL_THEN ``s tagged_partial_division_of interval[a:real,b] /\
17100                t tagged_partial_division_of interval[a:real,b] /\
17101                g0 FINE s /\ g1 FINE s /\ g0 FINE t /\ g1 FINE t``
17102  STRIP_ASSUME_TAC THENL
17103   [ASM_MESON_TAC[TAGGED_PARTIAL_DIVISION_SUBSET, FINE_SUBSET],
17104    ALL_TAC] THEN
17105  MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC
17106   ``(sum s (\(x:real,k). abs(integral k (h:real->real))) +
17107     sum (IMAGE (\(x,k). (x,k INTER {x | x <= c})) s)
17108         (\(x:real,k). abs(integral k (h:real->real)))) +
17109    (sum t (\(x:real,k). abs(content k * h x - integral k h)) +
17110     sum t (\(x:real,k). abs(integral k (h:real->real))) +
17111     sum (IMAGE (\(x,k). (x,k INTER {x | x >= c})) t)
17112         (\(x:real,k). abs(integral k (h:real->real))))`` THEN
17113  CONJ_TAC THENL
17114  [ (* goal 1 (of 2) *)
17115    MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC THENL
17116    [ (* goal 1.1 (of 2) *)
17117      W(MP_TAC o PART_MATCH (lhand o rand) SUM_IMAGE_NONZERO o
17118        rand o rand o snd) THEN
17119      KNOW_TAC ``FINITE (s :real # (real -> bool) -> bool) /\
17120      (!(x :real # (real -> bool)) (y :real # (real -> bool)).
17121        x IN s /\ y IN s /\ x <> y /\
17122      ((\((x :real),(k :real -> bool)). (x,k INTER {x | x <= (c :real)}))
17123       x = (\((x :real),(k :real -> bool)). (x,k INTER {x | x <= c})) y) ==>
17124      ((\((x :real),(k :real -> bool)).
17125        abs (integral k (h :real -> real)))
17126       ((\((x :real),(k :real -> bool)). (x,k INTER {x | x <= c})) x) =
17127      (0 : real)))`` THENL
17128      [ (* goal 1.1.1 (of 2) *)
17129        ASM_SIMP_TAC std_ss [FORALL_PROD] THEN
17130        MAP_EVERY X_GEN_TAC
17131         [``x:real``, ``k:real->bool``, ``l:real->bool``] THEN
17132        ASM_SIMP_TAC std_ss [PAIR_EQ] THEN
17133        REPEAT STRIP_TAC THEN MP_TAC(ISPECL
17134         [``s:real#(real->bool)->bool``,
17135          ``BIGUNION(IMAGE SND (s:real#(real->bool)->bool))``,
17136          ``x:real``, ``k:real->bool``,
17137          ``x:real``, ``l:real->bool``, ``c:real``]
17138         TAGGED_DIVISION_SPLIT_LEFT_INJ) THEN
17139        ASM_SIMP_TAC std_ss [] THEN
17140        KNOW_TAC ``s tagged_division_of BIGUNION (IMAGE SND s)`` THENL
17141         [ASM_MESON_TAC[TAGGED_PARTIAL_DIVISION_OF_UNION_SELF],
17142          DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
17143        REWRITE_TAC[ABS_ZERO] THEN
17144        SUBGOAL_THEN ``?u v:real. l = interval[u,v]``
17145         (REPEAT_TCL CHOOSE_THEN SUBST1_TAC)
17146        THENL [ASM_MESON_TAC[tagged_partial_division_of], ALL_TAC] THEN
17147        ASM_SIMP_TAC std_ss [INTERVAL_SPLIT, INTEGRAL_NULL],
17148        (* goal 1.1.2 (of 2) *)
17149        DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
17150        DISCH_THEN SUBST1_TAC THEN
17151        ASM_SIMP_TAC std_ss [GSYM SUM_ADD] THEN MATCH_MP_TAC SUM_LE THEN
17152        ASM_SIMP_TAC std_ss [o_THM, FORALL_PROD] THEN
17153        GEN_REWR_TAC (QUANT_CONV o QUANT_CONV o RAND_CONV o LAND_CONV o
17154                      ONCE_DEPTH_CONV) [SET_RULE
17155         ``x <= c <=> x IN {x:real | x <= c}``] THEN
17156        SIMP_TAC std_ss [INTEGRAL_RESTRICT_INTER] THEN
17157        SIMP_TAC std_ss [GSPECIFICATION, INTER_COMM] THEN
17158        REWRITE_TAC[REAL_ARITH ``abs(a - b:real) <= abs a + abs b``] ],
17159      (* goal 1.2 (of 2) *)
17160      MP_TAC (ISPECL [``(\((x :real),(k :real -> bool)). abs (integral k h))``,
17161       ``(\((x :real),(k :real -> bool)). (x,k INTER {x | x >= c}))``,
17162       ``(t :real # (real -> bool) -> bool)``] SUM_IMAGE_NONZERO) THEN
17163      KNOW_TAC ``FINITE (t :real # (real -> bool) -> bool) /\
17164       (!(x :real # (real -> bool)) (y :real # (real -> bool)).
17165         x IN t /\ y IN t /\ x <> y /\
17166       ((\((x :real),(k :real -> bool)). (x,k INTER {x | x >= (c :real)}))
17167       x = (\((x :real),(k :real -> bool)). (x,k INTER {x | x >= c})) y) ==>
17168       ((\((x :real),(k :real -> bool)).
17169        abs (integral k (h :real -> real)))
17170       ((\((x :real),(k :real -> bool)). (x,k INTER {x | x >= c})) x) =
17171       (0 : real)))`` THENL
17172      [ (* goal 1.2.1 (of 2) *)
17173        ASM_SIMP_TAC std_ss [FORALL_PROD, PAIR_EQ] THEN
17174        MAP_EVERY X_GEN_TAC
17175         [``x:real``, ``k:real->bool``, ``l:real->bool``] THEN
17176        ASM_SIMP_TAC std_ss [PAIR_EQ] THEN
17177        REPEAT STRIP_TAC THEN MP_TAC(ISPECL
17178         [``t:real#(real->bool)->bool``,
17179          ``BIGUNION(IMAGE SND (t:real#(real->bool)->bool))``,
17180          ``x:real``, ``k:real->bool``,
17181          ``x:real``, ``l:real->bool``, ``c:real``]
17182         TAGGED_DIVISION_SPLIT_RIGHT_INJ) THEN
17183        ASM_SIMP_TAC std_ss [] THEN
17184        KNOW_TAC ``t tagged_division_of BIGUNION (IMAGE SND t)`` THENL
17185         [ASM_MESON_TAC[TAGGED_PARTIAL_DIVISION_OF_UNION_SELF],
17186          DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
17187        REWRITE_TAC[ABS_ZERO] THEN
17188        SUBGOAL_THEN ``?u v:real. l = interval[u,v]``
17189         (REPEAT_TCL CHOOSE_THEN SUBST1_TAC)
17190        THENL [ASM_MESON_TAC[tagged_partial_division_of], ALL_TAC] THEN
17191        ASM_SIMP_TAC std_ss [INTERVAL_SPLIT, INTEGRAL_NULL],
17192        (* goal 1.2.2 (of 2) *)
17193        DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
17194        DISCH_THEN SUBST1_TAC THEN
17195        ASM_SIMP_TAC std_ss [GSYM SUM_ADD] THEN MATCH_MP_TAC SUM_LE THEN
17196        ASM_SIMP_TAC std_ss [o_THM, FORALL_PROD] THEN
17197        MAP_EVERY X_GEN_TAC [``x:real``, ``k:real->bool``] THEN DISCH_TAC THEN
17198        MATCH_MP_TAC(REAL_ARITH
17199         ``(i = i1 + i2)
17200          ==> abs(c + i1:real) <= abs(c) + abs(i) + abs(i2)``) THEN
17201        ONCE_REWRITE_TAC[SET_RULE
17202         ``x <= c <=> x IN {x:real | x <= c}``] THEN
17203        SIMP_TAC std_ss [INTEGRAL_RESTRICT_INTER] THEN
17204        ONCE_REWRITE_TAC[SET_RULE
17205        ``{x | x <= c:real} INTER s = s INTER {x | x <= c}``] THEN
17206        SUBGOAL_THEN ``?u v:real. k = interval[u,v]``
17207         (REPEAT_TCL CHOOSE_THEN SUBST_ALL_TAC)
17208        THENL [ASM_MESON_TAC[tagged_partial_division_of], ALL_TAC] THEN
17209        ASM_SIMP_TAC std_ss [INTERVAL_SPLIT] THEN
17210        MATCH_MP_TAC (SIMP_RULE std_ss [] INTEGRAL_SPLIT) THEN
17211        ASM_REWRITE_TAC[] THEN MATCH_MP_TAC INTEGRABLE_ON_SUBINTERVAL THEN
17212        EXISTS_TAC ``interval[a:real,b]`` THEN
17213        ASM_SIMP_TAC std_ss [] THEN
17214        ASM_MESON_TAC[tagged_partial_division_of] ] ],
17215    (* goal 2 (of 2) *)
17216    ALL_TAC] THEN
17217  SUBGOAL_THEN
17218   ``!x:real k. (x,k) IN r ==> ~(k INTER {x:real | x = c} = {})``
17219  ASSUME_TAC THENL
17220   [REPEAT GEN_TAC THEN MAP_EVERY EXPAND_TAC ["r", "q"] THEN
17221    SIMP_TAC std_ss [IN_ELIM_PAIR_THM] THEN
17222    SIMP_TAC std_ss [GSYM CONJ_ASSOC, SUBSET_DEF, EXTENSION, NOT_FORALL_THM] THEN
17223    KNOW_TAC ``(x,k) IN (p :real # (real -> bool) -> bool) /\
17224               (?x. x IN k /\ x <= c) /\ (?x. x IN k /\ ~(x <= c))
17225           ==> (?x. x IN k /\ (x = c))`` THENL
17226    [ALL_TAC,
17227     SIMP_TAC std_ss [GSPECIFICATION, NOT_IN_EMPTY, IN_INTER, NOT_IMP]] THEN
17228    DISCH_TAC THEN MATCH_MP_TAC CONNECTED_IVT_COMPONENT THEN
17229    SIMP_TAC std_ss [RIGHT_EXISTS_AND_THM] THEN
17230    CONJ_TAC THENL [ALL_TAC, ASM_MESON_TAC[REAL_LE_TOTAL]] THEN
17231    SUBGOAL_THEN ``?u v:real. k = interval[u,v]``
17232     (REPEAT_TCL CHOOSE_THEN SUBST_ALL_TAC)
17233    THENL [ASM_MESON_TAC[TAGGED_DIVISION_OF], ALL_TAC] THEN
17234    MATCH_MP_TAC CONVEX_CONNECTED THEN REWRITE_TAC[CONVEX_INTERVAL],
17235    ALL_TAC] THEN
17236  SIMP_TAC real_ss [REAL_LE_RDIV_EQ] THEN
17237  (* stage work *)
17238  MATCH_MP_TAC(REAL_ARITH
17239   ``x * 6 <= e /\ y * 2 <= e ==> (x + y) * 3 <= &2 * e:real``) THEN
17240  CONJ_TAC THENL
17241  [ (* goal 1 (of 2) *)
17242    MATCH_MP_TAC(REAL_ARITH
17243     ``x * 12 < e /\ y * 12 < e ==> (x + y) * 6 <= e:real``) THEN
17244    CONJ_TAC THEN SIMP_TAC real_ss [GSYM REAL_LT_RDIV_EQ] THEN
17245    FIRST_X_ASSUM MATCH_MP_TAC THEN
17246    EXISTS_TAC ``c:real`` THEN
17247    ASM_SIMP_TAC std_ss [IN_INTERVAL] THENL
17248    [ EXPAND_TAC "s" THEN SIMP_TAC std_ss [IN_ELIM_PAIR_THM] THEN
17249      ASM_MESON_TAC[],
17250      REPEAT CONJ_TAC THENL
17251      [ UNDISCH_TAC ``s tagged_partial_division_of interval[a:real,b]``,
17252        UNDISCH_TAC ``(g0:real->real->bool) FINE s`` THEN
17253        SIMP_TAC std_ss [FINE, FORALL_IN_IMAGE, lemma] THEN SET_TAC[],
17254        SIMP_TAC std_ss [lemma] THEN
17255        REPEAT GEN_TAC THEN EXPAND_TAC "s" THEN
17256        SIMP_TAC std_ss [GSPECIFICATION, EXISTS_PROD] THEN
17257        DISCH_TAC THEN MATCH_MP_TAC(SET_RULE
17258        ``~(k INTER t = {}) /\ t SUBSET s ==> ~((k INTER s) INTER t = {})``) THEN
17259        SIMP_TAC std_ss [SUBSET_DEF, GSPECIFICATION, REAL_LE_REFL, EXISTS_PROD] THEN
17260        FIRST_X_ASSUM MATCH_MP_TAC THEN METIS_TAC[] ] ],
17261    (* goal 2 (of 2) *)
17262    MATCH_MP_TAC(REAL_ARITH
17263     ``x * 3 < e /\ y * 12 < e /\ z * 12 < e ==> (x + y + z) * 2 <= e:real``) THEN
17264    REPEAT CONJ_TAC THEN SIMP_TAC real_ss [GSYM REAL_LT_RDIV_EQ] THEN
17265    FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_SIMP_TAC std_ss [] THEN
17266    EXISTS_TAC ``c:real`` THEN
17267    ASM_SIMP_TAC std_ss [IN_INTERVAL] THENL
17268    [ EXPAND_TAC "t" THEN SIMP_TAC std_ss [IN_ELIM_PAIR_THM] THEN
17269      ASM_MESON_TAC[],
17270      REPEAT CONJ_TAC THENL
17271      [ UNDISCH_TAC ``t tagged_partial_division_of interval[a:real,b]``,
17272        UNDISCH_TAC ``(g0:real->real->bool) FINE t`` THEN
17273        SIMP_TAC std_ss [FINE, FORALL_IN_IMAGE, lemma] THEN SET_TAC[],
17274        SIMP_TAC std_ss [lemma] THEN
17275        REPEAT GEN_TAC THEN EXPAND_TAC "t" THEN
17276        SIMP_TAC std_ss [GSPECIFICATION, EXISTS_PROD] THEN
17277        DISCH_TAC THEN MATCH_MP_TAC(SET_RULE
17278        ``~(k INTER t = {}) /\ t SUBSET s ==> ~((k INTER s) INTER t = {})``) THEN
17279        SIMP_TAC std_ss [SUBSET_DEF, GSPECIFICATION, REAL_LE_REFL,
17280                         real_ge, EXISTS_PROD] THEN
17281        FIRST_X_ASSUM MATCH_MP_TAC THEN METIS_TAC[] ] ] ] THEN
17282  (* A shared tactic *)
17283  SIMP_TAC std_ss [tagged_partial_division_of] THENL
17284  [(* goal 1 (of 2) *)
17285   MATCH_MP_TAC MONO_AND THEN SIMP_TAC std_ss [IMAGE_FINITE] THEN
17286   MATCH_MP_TAC MONO_AND THEN
17287   SIMP_TAC std_ss [RIGHT_FORALL_IMP_THM, IMP_CONJ, FORALL_IN_GSPEC] THEN
17288   SIMP_TAC std_ss [lemma] THEN CONJ_TAC THEN
17289   DISCH_TAC THEN X_GEN_TAC ``x:real`` THEN X_GEN_TAC ``k:real->bool`` THEN
17290   POP_ASSUM (MP_TAC o SPECL [``x:real``,``k:real->bool``]) THEN
17291   DISCH_THEN(fn th => STRIP_TAC THEN MP_TAC th) THEN ASM_SIMP_TAC std_ss [] THENL
17292   [ MATCH_MP_TAC MONO_AND THEN CONJ_TAC THENL
17293     [ SIMP_TAC std_ss [real_ge, IN_INTER, GSPECIFICATION] THEN
17294       ASM_SET_TAC[REAL_LE_TOTAL],
17295       MATCH_MP_TAC MONO_AND THEN CONJ_TAC THENL
17296       [ SET_TAC[],
17297         STRIP_TAC THEN ASM_SIMP_TAC std_ss [INTERVAL_SPLIT] THEN
17298         MESON_TAC [] ] ],
17299     DISCH_TAC THEN X_GEN_TAC ``xx:real`` THEN X_GEN_TAC ``kk:real->bool`` THEN
17300     POP_ASSUM (MP_TAC o SPECL [``xx:real``,``kk:real->bool``]) THEN
17301     MATCH_MP_TAC MONO_IMP THEN REWRITE_TAC[] THEN
17302     MATCH_MP_TAC MONO_IMP THEN CONJ_TAC THENL
17303      [METIS_TAC [PAIR_EQ, GSYM MONO_NOT_EQ], ALL_TAC] THEN
17304     MATCH_MP_TAC(SET_RULE
17305      ``s SUBSET s' /\ t SUBSET t'
17306       ==> (s' INTER t' = {}) ==> (s INTER t = {})``) THEN CONJ_TAC THEN
17307     MATCH_MP_TAC SUBSET_INTERIOR THEN SIMP_TAC std_ss [INTER_SUBSET] ],
17308   (* goal 2 (of 2) *)
17309   MATCH_MP_TAC MONO_AND THEN SIMP_TAC std_ss [IMAGE_FINITE] THEN
17310   MATCH_MP_TAC MONO_AND THEN
17311   SIMP_TAC std_ss [RIGHT_FORALL_IMP_THM, IMP_CONJ, FORALL_IN_GSPEC] THEN
17312   SIMP_TAC std_ss [lemma] THEN CONJ_TAC THEN
17313   DISCH_TAC THEN X_GEN_TAC ``x:real`` THEN X_GEN_TAC ``k:real->bool`` THEN
17314   POP_ASSUM (MP_TAC o SPECL [``x:real``,``k:real->bool``]) THEN
17315   DISCH_THEN(fn th => STRIP_TAC THEN MP_TAC th) THEN ASM_SIMP_TAC std_ss [] THENL
17316    [MATCH_MP_TAC MONO_AND THEN CONJ_TAC THENL
17317      [SIMP_TAC std_ss [real_ge, IN_INTER, GSPECIFICATION] THEN
17318       UNDISCH_TAC ``{(x,k) | (x:real,k:real->bool) IN r /\
17319                     x NOTIN {x | x <= c}} = t`` THEN
17320       REWRITE_TAC [EXTENSION] THEN
17321       DISCH_THEN (MP_TAC o SPECL [``(x:real, k:real->bool)``]) THEN
17322       DISCH_THEN (ASSUME_TAC o ONCE_REWRITE_RULE [EQ_SYM_EQ]) THEN
17323       UNDISCH_TAC ``(x:real,k:real->bool) IN t`` THEN ASM_REWRITE_TAC [] THEN
17324       SIMP_TAC std_ss [GSPECIFICATION, EXISTS_PROD] THEN REAL_ARITH_TAC,
17325       MATCH_MP_TAC MONO_AND THEN CONJ_TAC THENL
17326        [SET_TAC[],
17327         STRIP_TAC THEN ASM_SIMP_TAC std_ss [INTERVAL_SPLIT] THEN MESON_TAC[]]],
17328     DISCH_TAC THEN X_GEN_TAC ``xx:real`` THEN X_GEN_TAC ``kk:real->bool`` THEN
17329     POP_ASSUM (MP_TAC o SPECL [``xx:real``,``kk:real->bool``]) THEN
17330     MATCH_MP_TAC MONO_IMP THEN REWRITE_TAC[] THEN
17331     MATCH_MP_TAC MONO_IMP THEN CONJ_TAC THENL
17332      [METIS_TAC [PAIR_EQ, GSYM MONO_NOT_EQ], ALL_TAC] THEN
17333     MATCH_MP_TAC(SET_RULE
17334      ``s SUBSET s' /\ t SUBSET t'
17335       ==> (s' INTER t' = {}) ==> (s INTER t = {})``) THEN CONJ_TAC THEN
17336     MATCH_MP_TAC SUBSET_INTERIOR THEN SIMP_TAC std_ss [INTER_SUBSET] ] ]
17337QED
17338
17339Theorem EQUIINTEGRABLE_HALFSPACE_RESTRICTIONS_GE:
17340   !fs f:real->real a b.
17341        fs equiintegrable_on interval[a,b] /\ f IN fs /\
17342        (!h x. h IN fs /\ x IN interval[a,b] ==> abs(h x) <= abs(f x))
17343        ==> { (\x. if x >= c then h x else 0) |
17344              c IN univ(:real) /\ h IN fs }
17345            equiintegrable_on interval[a,b]
17346Proof
17347  REPEAT STRIP_TAC THEN
17348  MP_TAC(ISPECL
17349   [``{\x. (f:real->real) (-x) | f IN fs}``,
17350    ``\x. (f:real->real)(-x)``,
17351    ``-b:real``, ``-a:real``]
17352        EQUIINTEGRABLE_HALFSPACE_RESTRICTIONS_LE) THEN
17353  ASM_SIMP_TAC std_ss [EQUIINTEGRABLE_REFLECT] THEN
17354  KNOW_TAC ``(\(x :real). (f :real -> real) (-x)) IN
17355 {(\(x :real). f (-x)) | f IN (fs :(real -> real) -> bool)} /\
17356 (!(h :real -> real) (x :real).
17357    h IN {(\(x :real). f (-x)) | f IN fs} /\
17358    x IN interval [(-(b :real),-(a :real))] ==>
17359    abs (h x) <= abs (f (-x)))`` THENL
17360   [ASM_SIMP_TAC std_ss [IMP_CONJ, RIGHT_FORALL_IMP_THM, FORALL_IN_GSPEC] THEN
17361    ONCE_REWRITE_TAC[GSYM IN_INTERVAL_REFLECT] THEN
17362    ASM_SIMP_TAC std_ss [REAL_NEG_NEG] THEN
17363    SIMP_TAC real_ss [GSYM IMAGE_DEF, IN_IMAGE] THEN
17364    EXISTS_TAC ``f:real->real`` THEN ASM_REWRITE_TAC[],
17365    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
17366    DISCH_THEN(MP_TAC o MATCH_MP EQUIINTEGRABLE_REFLECT) THEN
17367    REWRITE_TAC[REAL_NEG_NEG] THEN MATCH_MP_TAC
17368     (REWRITE_RULE[IMP_CONJ_ALT] EQUIINTEGRABLE_SUBSET) THEN
17369    SIMP_TAC std_ss [SUBSET_DEF, FORALL_IN_GSPEC] THEN
17370    MAP_EVERY X_GEN_TAC [``c:real``, ``h:real->real``] THEN
17371    STRIP_TAC THEN SIMP_TAC std_ss [GSPECIFICATION, EXISTS_PROD] THEN EXISTS_TAC
17372     ``(\x:real. if (-x) >= c then (h:real->real)(-x) else 0:real)`` THEN
17373    SIMP_TAC std_ss [REAL_NEG_NEG] THEN MAP_EVERY EXISTS_TAC
17374     [``-c:real``, ``\x. (h:real->real)(-x)``] THEN
17375    ASM_REWRITE_TAC[IN_UNIV] THEN
17376    SIMP_TAC std_ss [REAL_ARITH ``-x >= c <=> x <= -c:real``] THEN
17377    EXISTS_TAC ``h:real->real`` THEN ASM_REWRITE_TAC[]]
17378QED
17379
17380Theorem EQUIINTEGRABLE_HALFSPACE_RESTRICTIONS_LT:
17381   !fs f:real->real a b.
17382        fs equiintegrable_on interval[a,b] /\ f IN fs /\
17383        (!h x. h IN fs /\ x IN interval[a,b] ==> abs(h x) <= abs(f x))
17384        ==> { (\x. if x < c then h x else 0) | c IN univ(:real) /\ h IN fs }
17385            equiintegrable_on interval[a,b]
17386Proof
17387  REPEAT STRIP_TAC THEN
17388  MP_TAC(ISPECL [``fs:(real->real)->bool``, ``f:real->real``,
17389                 ``a:real``, ``b:real``]
17390    EQUIINTEGRABLE_HALFSPACE_RESTRICTIONS_GE) THEN
17391  ASM_SIMP_TAC std_ss [] THEN UNDISCH_TAC
17392   ``(fs:(real->real)->bool) equiintegrable_on interval[a,b]`` THEN
17393  REWRITE_TAC[AND_IMP_INTRO] THEN
17394  DISCH_THEN(MP_TAC o MATCH_MP EQUIINTEGRABLE_SUB) THEN
17395  MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] EQUIINTEGRABLE_SUBSET) THEN
17396  SIMP_TAC std_ss [SUBSET_DEF, FORALL_IN_GSPEC] THEN
17397  MAP_EVERY X_GEN_TAC [``c:real``, ``h:real->real``] THEN
17398  STRIP_TAC THEN SIMP_TAC std_ss [GSPECIFICATION, EXISTS_PROD] THEN
17399  EXISTS_TAC ``h:real->real`` THEN
17400  EXISTS_TAC ``\x:real. if x >= c then (h:real->real) x else 0:real`` THEN
17401  ASM_SIMP_TAC std_ss [] THEN CONJ_TAC THENL
17402   [SIMP_TAC std_ss [FUN_EQ_THM, real_ge, GSYM REAL_NOT_LT] THEN
17403    GEN_TAC THEN COND_CASES_TAC THEN ASM_SIMP_TAC std_ss [] THEN
17404    REAL_ARITH_TAC,
17405    MAP_EVERY EXISTS_TAC [``c:real``, ``h:real->real``] THEN
17406    ASM_SIMP_TAC std_ss []]
17407QED
17408
17409Theorem EQUIINTEGRABLE_HALFSPACE_RESTRICTIONS_GT:
17410   !fs f:real->real a b.
17411        fs equiintegrable_on interval[a,b] /\ f IN fs /\
17412        (!h x. h IN fs /\ x IN interval[a,b] ==> abs(h x) <= abs(f x))
17413        ==> { (\x. if x > c then h x else 0) | c IN univ(:real) /\ h IN fs }
17414            equiintegrable_on interval[a,b]
17415Proof
17416  REPEAT STRIP_TAC THEN
17417  MP_TAC(ISPECL [``fs:(real->real)->bool``, ``f:real->real``,
17418                 ``a:real``, ``b:real``]
17419    EQUIINTEGRABLE_HALFSPACE_RESTRICTIONS_LE) THEN
17420  ASM_SIMP_TAC std_ss [] THEN UNDISCH_TAC
17421   ``(fs:(real->real)->bool) equiintegrable_on interval[a,b]`` THEN
17422  REWRITE_TAC[AND_IMP_INTRO] THEN
17423  DISCH_THEN(MP_TAC o MATCH_MP EQUIINTEGRABLE_SUB) THEN
17424  MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] EQUIINTEGRABLE_SUBSET) THEN
17425  SIMP_TAC std_ss [SUBSET_DEF, FORALL_IN_GSPEC] THEN
17426  MAP_EVERY X_GEN_TAC [``c:real``, ``h:real->real``] THEN
17427  STRIP_TAC THEN SIMP_TAC std_ss [GSPECIFICATION, EXISTS_PROD] THEN
17428  EXISTS_TAC ``h:real->real`` THEN
17429  EXISTS_TAC ``\x. if x <= c then (h:real->real) x else 0`` THEN
17430  ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
17431   [SIMP_TAC std_ss [FUN_EQ_THM, real_gt, GSYM REAL_NOT_LE] THEN
17432    GEN_TAC THEN COND_CASES_TAC THEN FULL_SIMP_TAC std_ss [] THEN
17433    REAL_ARITH_TAC,
17434    MAP_EVERY EXISTS_TAC [``c:real``, ``h:real->real``] THEN
17435    ASM_SIMP_TAC std_ss []]
17436QED
17437
17438Theorem EQUIINTEGRABLE_OPEN_INTERVAL_RESTRICTIONS:
17439   !f:real->real a b.
17440        f integrable_on interval[a,b]
17441        ==> { (\x. if x IN interval(c,d) then f x else 0) |
17442              c IN univ(:real) /\ d IN univ(:real) }
17443            equiintegrable_on interval[a,b]
17444Proof
17445  REPEAT STRIP_TAC THEN
17446  SUBGOAL_THEN
17447   ``!n. (\n. n <= 1n
17448        ==> f INSERT
17449            { (\x. if !i. 1 <= i /\ i <= n ==> c < x /\ x < d
17450                   then (f:real->real) x else 0) |
17451              c IN univ(:real) /\ d IN univ(:real) }
17452            equiintegrable_on interval[a,b]) n``
17453  MP_TAC THENL
17454   [MATCH_MP_TAC INDUCTION THEN
17455    SIMP_TAC std_ss [ARITH_PROVE ``~(1 <= i /\ i <= 0:num)``] THEN
17456    ASM_SIMP_TAC std_ss [ETA_AX, EQUIINTEGRABLE_ON_SING, SET_RULE
17457     ``f INSERT {f |(c,d)| c IN UNIV /\ d IN UNIV} = {f}``] THEN
17458    X_GEN_TAC ``n:num`` THEN ASM_CASES_TAC ``SUC n <= 1n`` THEN
17459    ASM_REWRITE_TAC[] THEN KNOW_TAC ``n <= 1:num`` THENL
17460    [ASM_ARITH_TAC, DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
17461     DISCH_THEN(MP_TAC o SPEC ``f:real->real`` o
17462        MATCH_MP (REWRITE_RULE[IMP_CONJ]
17463          EQUIINTEGRABLE_HALFSPACE_RESTRICTIONS_LT)) THEN
17464    REWRITE_TAC[IN_INSERT] THEN
17465    KNOW_TAC ``(!(h :real -> real) (x :real).
17466    (h = (f :real -> real)) \/
17467    h IN {(\(x :real).
17468        if !(i :num).  1n <= i /\ i <= (n :num) ==> c < x /\ x < d
17469        then f x
17470        else (0 :real)) |
17471     c IN univ((:real) :real itself) /\
17472     d IN univ((:real) :real itself)} ==>
17473    x IN interval [((a :real),(b :real))] ==>
17474    abs (h x) <= abs (f x))`` THENL
17475     [REWRITE_TAC[TAUT
17476       `a \/ b ==> c ==> d <=> (a ==> c ==> d) /\ (b ==> c ==> d)`] THEN
17477      SIMP_TAC std_ss [REAL_LE_REFL, RIGHT_FORALL_IMP_THM] THEN
17478      SIMP_TAC std_ss [FORALL_IN_GSPEC] THEN
17479      REPEAT STRIP_TAC THEN COND_CASES_TAC THEN
17480      ASM_SIMP_TAC std_ss [ABS_0, REAL_LE_REFL, ABS_POS],
17481      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
17482    UNDISCH_TAC ``f integrable_on interval [(a,b)]`` THEN DISCH_TAC THEN
17483    FIRST_ASSUM(MP_TAC o REWRITE_RULE [GSYM EQUIINTEGRABLE_ON_SING]) THEN
17484    REWRITE_TAC[AND_IMP_INTRO] THEN
17485    DISCH_THEN(MP_TAC o MATCH_MP EQUIINTEGRABLE_UNION) THEN
17486    DISCH_THEN(MP_TAC o SPEC ``f:real->real`` o
17487        MATCH_MP (REWRITE_RULE[IMP_CONJ]
17488          EQUIINTEGRABLE_HALFSPACE_RESTRICTIONS_GT)) THEN
17489    ASM_SIMP_TAC std_ss [IN_UNION, IN_SING] THEN
17490    KNOW_TAC ``(!(h :real -> real) (x :real).
17491    (h = (f :real -> real)) \/
17492    h IN {(\(x :real). if x < c then h x else (0 :real)) |
17493     c IN univ((:real) :real itself) /\
17494     ((h = f) \/
17495      h IN {(\(x :real).
17496          if !(i :num).  1n <= i /\ i <= (n :num) ==> c < x /\ x < d
17497          then f x
17498          else (0 :real)) |
17499       c IN univ((:real) :real itself) /\
17500       d IN univ((:real) :real itself)})} ==>
17501    x IN interval [((a :real),(b :real))] ==>
17502    abs (h x) <= abs (f x))`` THENL
17503     [REWRITE_TAC[TAUT
17504       `a \/ b ==> c ==> d <=> (a ==> c ==> d) /\ (b ==> c ==> d)`] THEN
17505      SIMP_TAC std_ss [REAL_LE_REFL, RIGHT_FORALL_IMP_THM] THEN
17506      SIMP_TAC std_ss [FORALL_IN_GSPEC, LEFT_AND_OVER_OR] THEN
17507      REWRITE_TAC[TAUT `a \/ b ==> c <=> (a ==> c) /\ (b ==> c)`] THEN
17508      SIMP_TAC std_ss [REAL_LE_REFL, RIGHT_FORALL_IMP_THM]  THEN
17509      SIMP_TAC std_ss [IMP_CONJ, RIGHT_FORALL_IMP_THM, FORALL_IN_GSPEC,
17510                  FORALL_AND_THM] THEN
17511      SIMP_TAC std_ss [IN_UNIV] THEN
17512      REPEAT STRIP_TAC THEN
17513      REPEAT(COND_CASES_TAC THEN
17514             ASM_SIMP_TAC std_ss [ABS_0, REAL_LE_REFL, ABS_POS]),
17515      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
17516    FIRST_ASSUM(MP_TAC o REWRITE_RULE [GSYM EQUIINTEGRABLE_ON_SING]) THEN
17517    REWRITE_TAC[AND_IMP_INTRO] THEN
17518    DISCH_THEN(MP_TAC o MATCH_MP EQUIINTEGRABLE_UNION) THEN
17519    MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] EQUIINTEGRABLE_SUBSET) THEN
17520    MATCH_MP_TAC(SET_RULE
17521      ``s SUBSET t ==> (x INSERT s) SUBSET ({x} UNION t)``) THEN
17522    SIMP_TAC std_ss [SUBSET_DEF, real_gt, FORALL_IN_GSPEC, IN_UNIV, EXISTS_PROD] THEN
17523    MAP_EVERY X_GEN_TAC [``c:real``, ``d:real``] THEN
17524    SIMP_TAC std_ss [GSPECIFICATION, EXISTS_PROD] THEN
17525    EXISTS_TAC ``(c:real)`` THEN ONCE_REWRITE_TAC [CONJ_SYM] THEN
17526    KNOW_TAC ``?(p_2 :real -> real).
17527  ((p_2 = (f :real -> real)) \/
17528   ?(p_1 :real) (p_2' :real -> real).
17529     (\p_1 p_2'. (p_2' = f) \/
17530       ?(p_1 :real) (p_2 :real).
17531        p_2' =
17532        (\(x :real).
17533           if
17534             !(i :num).
17535                1n <= i /\ i <= (n :num) ==> p_1 < x /\ x < p_2
17536           then
17537             f x
17538           else (0 :real))) p_1 p_2' /\
17539       (p_2 = (\p_1 p_2'. (\(x :real). if x < p_1 then p_2' x else (0 :real))) p_1 p_2')) /\
17540  (\p_2. ((\(x :real).
17541      if
17542        !(i :num).
17543           1n <= i /\ i <= SUC n ==> (c :real) < x /\ x < (d :real)
17544      then
17545        f x
17546      else (0 :real)) =
17547   (\(x :real). if c < x then p_2 x else (0 :real)))) p_2`` THENL
17548    [ALL_TAC, SIMP_TAC std_ss [CONJ_SYM]] THEN
17549    MATCH_MP_TAC(METIS[]
17550     ``(?c k. P c k /\ Q (g c k))
17551       ==> ?h. ((h = f) \/ (?c k. P c k /\ (h = g c k))) /\ Q h``) THEN
17552    EXISTS_TAC ``(d:real)`` THEN
17553    EXISTS_TAC
17554     ``\x. if !i. 1 <= i /\ i <= n:num ==> (c:real) < x /\ x < (d:real)
17555          then (f:real->real) x else 0`` THEN
17556    SIMP_TAC std_ss [] THEN CONJ_TAC THENL
17557     [DISJ2_TAC THEN
17558      MAP_EVERY EXISTS_TAC [``c:real``, ``d:real``] THEN SIMP_TAC std_ss [],
17559      SIMP_TAC std_ss [FUN_EQ_THM, LE] THEN
17560      METIS_TAC[ARITH_PROVE ``1 <= SUC n``]],
17561    DISCH_THEN(MP_TAC o SPEC ``1:num``) THEN
17562    SIMP_TAC std_ss [IN_INTERVAL, LESS_EQ_REFL] THEN
17563    MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] EQUIINTEGRABLE_SUBSET) THEN
17564    SIMP_TAC std_ss [IN_INSERT, SUBSET_DEF, GSPECIFICATION, EXISTS_PROD] THEN
17565    REPEAT STRIP_TAC THEN ASM_CASES_TAC ``x = f:real->real`` THEN
17566    ASM_SIMP_TAC std_ss [] THEN EXISTS_TAC ``p_1:real`` THEN
17567    EXISTS_TAC ``p_2:real`` THEN ASM_SIMP_TAC std_ss [FUN_EQ_THM] THEN
17568    X_GEN_TAC ``y:real`` THEN COND_CASES_TAC THEN ASM_SIMP_TAC arith_ss []]
17569QED
17570
17571Theorem EQUIINTEGRABLE_CLOSED_INTERVAL_RESTRICTIONS:
17572   !f:real->real a b.
17573        f integrable_on interval[a,b]
17574        ==> { (\x. if x IN interval[c,d] then f x else 0) |
17575              c IN univ(:real) /\ d IN univ(:real) }
17576            equiintegrable_on interval[a,b]
17577Proof
17578  REPEAT STRIP_TAC THEN
17579  SUBGOAL_THEN
17580   ``!n. (\n. n <= 1n
17581        ==> f INSERT
17582            { (\x. if !i. 1 <= i /\ i <= n ==> c <= x /\ x <= d
17583                   then (f:real->real) x else 0) |
17584              c IN univ(:real) /\ d IN univ(:real) }
17585            equiintegrable_on interval[a,b]) n``
17586  MP_TAC THENL
17587   [MATCH_MP_TAC INDUCTION THEN
17588    REWRITE_TAC[ARITH_PROVE ``~(1 <= i /\ i <= 0:num)``] THEN
17589    ASM_SIMP_TAC std_ss [ETA_AX, EQUIINTEGRABLE_ON_SING, SET_RULE
17590     ``f INSERT {f |(c,d)| c IN UNIV /\ d IN UNIV} = {f}``] THEN
17591    X_GEN_TAC ``n:num`` THEN ASM_CASES_TAC ``SUC n <= 1n`` THEN
17592    ASM_SIMP_TAC std_ss [] THEN KNOW_TAC ``n <= 1:num`` THENL
17593    [ASM_SIMP_TAC arith_ss [], DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
17594    DISCH_THEN(MP_TAC o SPEC ``f:real->real`` o
17595        MATCH_MP (REWRITE_RULE[IMP_CONJ]
17596          EQUIINTEGRABLE_HALFSPACE_RESTRICTIONS_LE)) THEN
17597    SIMP_TAC std_ss [IN_INSERT] THEN
17598    KNOW_TAC ``(!(h :real -> real) (x :real).
17599    (h = (f :real -> real)) \/
17600    h IN {(\(x :real).
17601        if !(i :num).  1n <= i /\ i <= (n :num) ==> c <= x /\ x <= d
17602        then f x
17603        else (0 :real)) |
17604     c IN univ((:real) :real itself) /\
17605     d IN univ((:real) :real itself)} ==>
17606    x IN interval [(a :real),(b :real)] ==>
17607    abs (h x) <= abs (f x))`` THENL
17608     [REWRITE_TAC[TAUT
17609       `a \/ b ==> c ==> d <=> (a ==> c ==> d) /\ (b ==> c ==> d)`] THEN
17610      SIMP_TAC std_ss [REAL_LE_REFL, RIGHT_FORALL_IMP_THM] THEN
17611      SIMP_TAC std_ss [FORALL_IN_GSPEC] THEN
17612      REPEAT STRIP_TAC THEN COND_CASES_TAC THEN
17613      ASM_SIMP_TAC std_ss [ABS_0, REAL_LE_REFL, ABS_POS],
17614      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
17615    UNDISCH_TAC ``f integrable_on interval [(a,b)]`` THEN DISCH_TAC THEN
17616    FIRST_ASSUM(MP_TAC o REWRITE_RULE [GSYM EQUIINTEGRABLE_ON_SING]) THEN
17617    REWRITE_TAC[AND_IMP_INTRO] THEN
17618    DISCH_THEN(MP_TAC o MATCH_MP EQUIINTEGRABLE_UNION) THEN
17619    DISCH_THEN(MP_TAC o SPEC ``f:real->real`` o
17620        MATCH_MP (REWRITE_RULE[IMP_CONJ]
17621          EQUIINTEGRABLE_HALFSPACE_RESTRICTIONS_GE)) THEN
17622    ASM_SIMP_TAC std_ss [IN_UNION, IN_SING] THEN
17623    KNOW_TAC ``(!(h :real -> real) (x :real).
17624    (h = (f :real -> real)) \/
17625    h IN {(\(x :real). if x <= c then h x else (0 :real)) |
17626     c IN univ((:real) :real itself) /\
17627     ((h = f) \/
17628      h IN {(\(x :real).
17629          if !(i :num).  1n <= i /\ i <= (n :num) ==> c <= x /\ x <= d
17630          then f x
17631          else (0 :real)) |
17632       c IN univ((:real) :real itself) /\
17633       d IN univ((:real) :real itself)})} ==>
17634    x IN interval [((a :real),(b :real))] ==>
17635    abs (h x) <= abs (f x))`` THENL
17636     [REWRITE_TAC[TAUT
17637       `a \/ b ==> c ==> d <=> (a ==> c ==> d) /\ (b ==> c ==> d)`] THEN
17638      SIMP_TAC std_ss [REAL_LE_REFL, RIGHT_FORALL_IMP_THM] THEN
17639      SIMP_TAC std_ss [FORALL_IN_GSPEC, LEFT_AND_OVER_OR] THEN
17640      REWRITE_TAC[TAUT `a \/ b ==> c <=> (a ==> c) /\ (b ==> c)`] THEN
17641      SIMP_TAC std_ss [REAL_LE_REFL, RIGHT_FORALL_IMP_THM]  THEN
17642      SIMP_TAC std_ss [IMP_CONJ, RIGHT_FORALL_IMP_THM, FORALL_IN_GSPEC,
17643                  FORALL_AND_THM] THEN
17644      SIMP_TAC std_ss [IN_UNIV] THEN
17645      REPEAT STRIP_TAC THEN
17646      REPEAT(COND_CASES_TAC THEN
17647             ASM_SIMP_TAC std_ss [ABS_0, REAL_LE_REFL, ABS_POS]),
17648      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
17649    FIRST_ASSUM(MP_TAC o REWRITE_RULE [GSYM EQUIINTEGRABLE_ON_SING]) THEN
17650    REWRITE_TAC[AND_IMP_INTRO] THEN
17651    DISCH_THEN(MP_TAC o MATCH_MP EQUIINTEGRABLE_UNION) THEN
17652    MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] EQUIINTEGRABLE_SUBSET) THEN
17653    MATCH_MP_TAC(SET_RULE
17654      ``s SUBSET t ==> (x INSERT s) SUBSET ({x} UNION t)``) THEN
17655    SIMP_TAC std_ss [SUBSET_DEF, real_gt, FORALL_IN_GSPEC, IN_UNIV, EXISTS_PROD] THEN
17656    MAP_EVERY X_GEN_TAC [``c:real``, ``d:real``] THEN
17657    SIMP_TAC std_ss [GSPECIFICATION, EXISTS_PROD] THEN
17658    EXISTS_TAC ``(c:real)`` THEN ONCE_REWRITE_TAC [CONJ_SYM] THEN
17659    KNOW_TAC ``?(p_2 :real -> real).
17660  ((p_2 = (f :real -> real)) \/
17661   ?(p_1 :real) (p_2' :real -> real).
17662     (\p_1 p_2'. (p_2' = f) \/
17663       ?(p_1 :real) (p_2 :real).
17664        p_2' =
17665        (\(x :real).
17666           if
17667             !(i :num).
17668                1n <= i /\ i <= (n :num) ==> p_1 <= x /\ x <= p_2
17669           then
17670             f x
17671           else (0 :real))) p_1 p_2' /\
17672       (p_2 = (\p_1 p_2'. (\(x :real). if x <= p_1 then p_2' x else (0 :real))) p_1 p_2')) /\
17673  (\p_2. ((\(x :real).
17674      if
17675        !(i :num).
17676           1n <= i /\ i <= SUC n ==> (c :real) <= x /\ x <= (d :real)
17677      then
17678        f x
17679      else (0 :real)) =
17680   (\(x :real). if x >= c then p_2 x else (0 :real)))) p_2`` THENL
17681    [ALL_TAC, SIMP_TAC std_ss [CONJ_SYM]] THEN
17682    MATCH_MP_TAC(METIS[]
17683     ``(?c k. P c k /\ Q (g c k))
17684      ==> ?h. ((h = f) \/ ?c k. P c k /\ (h = g c k)) /\ Q h``) THEN
17685    EXISTS_TAC ``(d:real)`` THEN
17686    EXISTS_TAC
17687     ``\x. if !i. 1 <= i /\ i <= n:num ==> (c:real) <= x /\ x <= (d:real)
17688          then (f:real->real) x else 0`` THEN
17689    SIMP_TAC std_ss [] THEN CONJ_TAC THENL
17690     [DISJ2_TAC THEN
17691      MAP_EVERY EXISTS_TAC [``c:real``, ``d:real``] THEN SIMP_TAC std_ss [],
17692      SIMP_TAC std_ss [FUN_EQ_THM, LE, real_ge] THEN
17693      METIS_TAC[ARITH_PROVE ``1 <= SUC n``]],
17694    DISCH_THEN(MP_TAC o SPEC ``1:num``) THEN
17695    SIMP_TAC std_ss [IN_INTERVAL, LESS_EQ_REFL] THEN
17696    MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] EQUIINTEGRABLE_SUBSET) THEN
17697    SIMP_TAC std_ss [IN_INSERT, SUBSET_DEF, GSPECIFICATION, EXISTS_PROD] THEN
17698    REPEAT STRIP_TAC THEN ASM_CASES_TAC ``x = f:real->real`` THEN
17699    ASM_SIMP_TAC std_ss [] THEN EXISTS_TAC ``p_1:real`` THEN
17700    EXISTS_TAC ``p_2:real`` THEN ASM_SIMP_TAC std_ss [FUN_EQ_THM] THEN
17701    X_GEN_TAC ``y:real`` THEN COND_CASES_TAC THEN ASM_SIMP_TAC arith_ss []]
17702QED
17703
17704(* ------------------------------------------------------------------------- *)
17705(* Continuity of the indefinite integral.                                    *)
17706(* ------------------------------------------------------------------------- *)
17707
17708Theorem INDEFINITE_INTEGRAL_CONTINUOUS:
17709   !f:real->real a b c d e.
17710        f integrable_on interval[a,b] /\
17711        c IN interval[a,b] /\ d IN interval[a,b] /\ &0 < e
17712        ==> ?k. &0 < k /\
17713                !c' d'. c' IN interval[a,b] /\
17714                        d' IN interval[a,b] /\
17715                        abs(c' - c) <= k /\ abs(d' - d) <= k
17716                        ==> abs(integral(interval[c',d']) f -
17717                                 integral(interval[c,d]) f) < e
17718Proof
17719  REPEAT STRIP_TAC THEN
17720  KNOW_TAC ``~(!(k :real).
17721  (0 :real) < k ==>
17722  ~(!(c' :real) (d' :real).
17723    c' IN interval [((a :real),(b :real))] /\ d' IN interval [(a,b)] /\
17724    abs (c' - (c :real)) <= k /\ abs (d' - (d :real)) <= k ==>
17725    abs
17726      (integral (interval [(c',d')]) (f :real -> real) -
17727       integral (interval [(c,d)]) f) < (e :real)))`` THENL
17728  [ALL_TAC, METIS_TAC []] THEN
17729  DISCH_THEN(MP_TAC o GEN ``n:num`` o SPEC ``inv(&n + &1:real)``) THEN
17730  DISCH_THEN (MP_TAC o SIMP_RULE std_ss [NOT_FORALL_THM, NOT_IMP]) THEN
17731  REWRITE_TAC [REAL_LT_INV_EQ, METIS [REAL_LT, REAL_OF_NUM_ADD, GSYM ADD1, LESS_0]
17732    ``&0 < &n + &1:real``] THEN
17733  KNOW_TAC ``!c' d'.
17734       ~(!n:num. (c' n IN interval [a,b] /\
17735            d' n IN interval [a,b] /\
17736            abs (c' n - c) <= inv (&n + &1) /\
17737            abs (d' n - d) <= inv (&n + &1)) /\
17738           ~(abs (integral (interval [c' n,d' n]) f -
17739              integral (interval [c,d]) f) < e:real))`` THENL
17740  [ALL_TAC, METIS_TAC [SKOLEM_THM]] THEN
17741  REWRITE_TAC [REAL_NOT_LT, GSYM CONJ_ASSOC] THEN
17742  MAP_EVERY X_GEN_TAC [``u:num->real``, ``v:num->real``] THEN
17743  DISCH_THEN (MP_TAC o SIMP_RULE std_ss [FORALL_AND_THM]) THEN
17744  STRIP_TAC THEN
17745  ABBREV_TAC
17746   ``k:real->bool =
17747     BIGUNION (IMAGE (\i. {x | x = (c:real)} UNION {x | x = (d:real)})
17748                  { 1n.. 1n})`` THEN
17749  SUBGOAL_THEN ``negligible(k:real->bool)`` ASSUME_TAC THENL
17750   [EXPAND_TAC "k" THEN MATCH_MP_TAC NEGLIGIBLE_BIGUNION THEN
17751    SIMP_TAC std_ss [IMAGE_FINITE, FINITE_NUMSEG, FORALL_IN_IMAGE] THEN
17752    X_GEN_TAC ``i:num`` THEN REWRITE_TAC[IN_NUMSEG] THEN STRIP_TAC THEN
17753    ASM_SIMP_TAC std_ss [NEGLIGIBLE_UNION, NEGLIGIBLE_STANDARD_HYPERPLANE],
17754    ALL_TAC] THEN
17755  MP_TAC(ISPECL
17756   [``\n:num x. if x IN interval[u n,v n] then
17757                 if x IN k then 0 else (f:real->real) x
17758               else 0``,
17759    ``\x. if x IN interval[c,d] then
17760            if x IN k then 0 else (f:real->real) x
17761         else 0``,
17762    ``a:real``, ``b:real``] EQUIINTEGRABLE_LIMIT) THEN
17763  SIMP_TAC std_ss [NOT_IMP] THEN REPEAT CONJ_TAC THENL
17764   [SUBGOAL_THEN
17765     ``(\x. if x IN k then 0 else (f:real->real) x)
17766      integrable_on interval[a,b]``
17767    MP_TAC THENL
17768     [UNDISCH_TAC ``(f:real->real) integrable_on interval[a,b]`` THEN
17769      MATCH_MP_TAC INTEGRABLE_SPIKE THEN EXISTS_TAC ``k:real->bool`` THEN
17770      ASM_REWRITE_TAC[] THEN SET_TAC[],
17771      ALL_TAC] THEN
17772    DISCH_THEN(MP_TAC o MATCH_MP
17773      EQUIINTEGRABLE_CLOSED_INTERVAL_RESTRICTIONS) THEN
17774    MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] EQUIINTEGRABLE_SUBSET) THEN
17775    SIMP_TAC std_ss [SUBSET_DEF, FORALL_IN_GSPEC, IN_UNIV] THEN
17776    SIMP_TAC std_ss [GSPECIFICATION, EXISTS_PROD] THEN
17777    X_GEN_TAC ``n:num`` THEN MAP_EVERY EXISTS_TAC
17778     [``(u:num->real) n``, ``(v:num->real) n``] THEN
17779    SIMP_TAC std_ss [],
17780    X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN
17781    ASM_CASES_TAC ``(x:real) IN k`` THEN
17782    ASM_SIMP_TAC std_ss [COND_ID, LIM_CONST] THEN MATCH_MP_TAC LIM_EVENTUALLY THEN
17783    SIMP_TAC std_ss [EVENTUALLY_SEQUENTIALLY] THEN
17784    MP_TAC(SPEC ``inf (IMAGE (\i. min (abs((x:real) - (c:real)))
17785                                     (abs((x:real) - (d:real))))
17786                            { 1n.. 1n})`` REAL_ARCH_INV) THEN
17787    SIMP_TAC std_ss [REAL_LT_INF_FINITE, IMAGE_FINITE, IMAGE_EQ_EMPTY,
17788             FINITE_NUMSEG, NUMSEG_EMPTY, NOT_LESS] THEN
17789    ASM_SIMP_TAC std_ss [FORALL_IN_IMAGE, REAL_LT_MIN, IN_NUMSEG] THEN
17790    UNDISCH_TAC ``~((x:real) IN k)`` THEN EXPAND_TAC "k" THEN
17791    SIMP_TAC std_ss [BIGUNION_IMAGE, GSPECIFICATION, NOT_EXISTS_THM] THEN
17792    REWRITE_TAC[IN_NUMSEG, SET_RULE
17793     ``~p \/ x NOTIN (s UNION t) <=> p ==> ~(x IN s) /\ ~(x IN t)``] THEN
17794    SIMP_TAC std_ss [GSPECIFICATION, REAL_ARITH ``&0 < abs(x - y) <=> ~(x = y:real)``] THEN
17795    DISCH_TAC THEN ASM_REWRITE_TAC[] THEN
17796    DISCH_THEN (X_CHOOSE_TAC ``N:num``) THEN EXISTS_TAC ``N:num`` THEN
17797    POP_ASSUM MP_TAC THEN STRIP_TAC THEN
17798    X_GEN_TAC ``n:num`` THEN DISCH_TAC THEN
17799    SUBGOAL_THEN ``x IN interval[(u:num->real) n,v n] <=> x IN interval[c,d]``
17800     (fn th => SIMP_TAC std_ss [th]) THEN
17801    REWRITE_TAC[IN_INTERVAL] THEN
17802    POP_ASSUM MP_TAC THEN POP_ASSUM (MP_TAC o SPEC ``1:num``) THEN
17803    SIMP_TAC arith_ss [] THEN REPEAT STRIP_TAC THEN
17804    MATCH_MP_TAC(REAL_ARITH
17805     ``!N n. abs(u - c) <= n /\ abs(v - d) <= n /\
17806            N < abs(x - c) /\ N < abs(x - d) /\ n <= N
17807      ==> (u <= x /\ x <= v <=> c <= x /\ x <= d:real)``) THEN
17808    MAP_EVERY EXISTS_TAC [``inv(&N:real)``, ``inv(&n + &1:real)``] THEN
17809    ASM_SIMP_TAC std_ss [] THEN
17810    MATCH_MP_TAC REAL_LE_INV2 THEN
17811    REWRITE_TAC[REAL_OF_NUM_ADD, REAL_OF_NUM_LE, REAL_LT] THEN
17812    ASM_SIMP_TAC arith_ss [],
17813    CCONTR_TAC THEN FULL_SIMP_TAC std_ss [] THEN POP_ASSUM MP_TAC THEN
17814    SIMP_TAC std_ss [INTEGRAL_RESTRICT_INTER] THEN
17815    SUBGOAL_THEN
17816     ``(interval[c:real,d] INTER interval[a,b] = interval[c,d]) /\
17817      !n:num. interval[u n,v n] INTER interval[a,b] = interval[u n,v n]``
17818     (fn th => SIMP_TAC std_ss [th])
17819    THENL
17820     [REWRITE_TAC[SET_RULE ``(s INTER t = s) <=> s SUBSET t``] THEN
17821      REWRITE_TAC[SUBSET_INTERVAL] THEN
17822      RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN ASM_MESON_TAC[],
17823      ALL_TAC] THEN
17824    REWRITE_TAC[LIM_SEQUENTIALLY] THEN
17825    DISCH_THEN(MP_TAC o SPEC ``e:real``) THEN ASM_REWRITE_TAC[] THEN
17826    DISCH_THEN(X_CHOOSE_THEN ``N:num`` (MP_TAC o SPEC ``N:num``)) THEN
17827    REWRITE_TAC[LESS_EQ_REFL, REAL_NOT_LT] THEN REWRITE_TAC [dist] THEN
17828    FIRST_ASSUM(fn th => MP_TAC(SPEC ``N:num`` th) THEN MATCH_MP_TAC
17829    (REAL_ARITH ``(x = a) /\ (y = b) ==> e <= abs(x - y) ==> e <= abs(a - b:real)``)) THEN
17830    CONJ_TAC THEN SIMP_TAC std_ss [] THEN MATCH_MP_TAC INTEGRAL_SPIKE THEN
17831    EXISTS_TAC ``k:real->bool`` THEN ASM_SIMP_TAC std_ss [IN_DIFF]]
17832QED
17833
17834Theorem INDEFINITE_INTEGRAL_CONTINUOUS_RIGHT:
17835   !f:real->real a b.
17836        f integrable_on interval[a,b]
17837         ==> (\x. integral (interval[a,x]) f) continuous_on interval[a,b]
17838Proof
17839  REPEAT STRIP_TAC THEN REWRITE_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN] THEN
17840  X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN REWRITE_TAC[continuous_within] THEN
17841  X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
17842  MP_TAC(ISPECL [``f:real->real``, ``a:real``, ``b:real``,
17843                 ``a:real``, ``x:real``, ``e:real``]
17844        INDEFINITE_INTEGRAL_CONTINUOUS) THEN
17845  ASM_SIMP_TAC std_ss [ENDS_IN_INTERVAL] THEN
17846  KNOW_TAC ``interval [(a,b:real)] <> {}`` THENL
17847  [ASM_SET_TAC[], DISCH_TAC THEN ASM_REWRITE_TAC [] THEN
17848   POP_ASSUM K_TAC THEN REWRITE_TAC[dist]] THEN
17849  DISCH_THEN (X_CHOOSE_TAC ``d:real``) THEN EXISTS_TAC ``d:real`` THEN
17850  POP_ASSUM MP_TAC THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
17851  FIRST_X_ASSUM MATCH_MP_TAC THEN
17852  ASM_SIMP_TAC std_ss [ENDS_IN_INTERVAL, REAL_SUB_REFL, ABS_0, REAL_LT_IMP_LE] THEN
17853  ASM_SET_TAC[]
17854QED
17855
17856Theorem INDEFINITE_INTEGRAL_CONTINUOUS_LEFT:
17857   !f:real->real a b.
17858        f integrable_on interval[a,b]
17859        ==> (\x. integral(interval[x,b]) f) continuous_on interval[a,b]
17860Proof
17861  REPEAT STRIP_TAC THEN REWRITE_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN] THEN
17862  X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN REWRITE_TAC[continuous_within] THEN
17863  X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
17864  MP_TAC(ISPECL [``f:real->real``, ``a:real``, ``b:real``,
17865                 ``x:real``, ``b:real``, ``e:real``]
17866        INDEFINITE_INTEGRAL_CONTINUOUS) THEN
17867  ASM_SIMP_TAC std_ss [ENDS_IN_INTERVAL] THEN
17868  KNOW_TAC ``interval [(a,b:real)] <> {}`` THENL
17869  [ASM_SET_TAC[], DISCH_TAC THEN ASM_REWRITE_TAC [] THEN
17870   POP_ASSUM K_TAC THEN REWRITE_TAC[dist]] THEN
17871  DISCH_THEN (X_CHOOSE_TAC ``d:real``) THEN EXISTS_TAC ``d:real`` THEN
17872  POP_ASSUM MP_TAC THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
17873  FIRST_X_ASSUM MATCH_MP_TAC THEN
17874  ASM_SIMP_TAC std_ss [ENDS_IN_INTERVAL, REAL_SUB_REFL, ABS_0, REAL_LT_IMP_LE] THEN
17875  ASM_SET_TAC[]
17876QED
17877
17878(* ------------------------------------------------------------------------- *)
17879(* Second mean value theorem and corollaries.                                *)
17880(* ------------------------------------------------------------------------- *)
17881
17882Theorem lemma1[local]:
17883     !f:real->real s.
17884      (!x. x IN s ==> &0 <= f x /\ f x <= &1)
17885      ==> (!n x. x IN s /\ ~(n = 0)
17886                 ==> abs(f x -
17887                         sum{ 1n..n} (\k. if &k / &n <= f(x)
17888                                        then inv(&n) else &0)) < inv(&n))
17889Proof
17890    REPEAT STRIP_TAC THEN
17891    SUBGOAL_THEN ``?m. flr(&n * (f:real->real) x) = &m`` CHOOSE_TAC THENL
17892     [MATCH_MP_TAC FLOOR_POS THEN ASM_SIMP_TAC std_ss [REAL_LE_MUL, REAL_POS],
17893      ALL_TAC] THEN
17894    SUBGOAL_THEN ``!k. &k / &n <= (f:real->real) x <=> k <= m`` ASSUME_TAC THENL
17895     [FIRST_X_ASSUM(SUBST1_TAC o SYM) THEN
17896      KNOW_TAC ``0 <= &n * (f:real->real) x`` THENL
17897      [MATCH_MP_TAC REAL_LE_MUL THEN ASM_SIMP_TAC std_ss [REAL_POS],
17898       DISCH_TAC] THEN
17899      ASM_SIMP_TAC std_ss [NUM_FLOOR_LE2] THEN
17900      REWRITE_TAC[GSYM REAL_OF_NUM_LE] THEN
17901      ASM_SIMP_TAC std_ss [REAL_LE_LDIV_EQ, REAL_LT, LE_1] THEN
17902      SIMP_TAC std_ss [REAL_MUL_SYM],
17903      ALL_TAC] THEN
17904    ASM_REWRITE_TAC [] THEN
17905    ONCE_REWRITE_TAC [METIS []
17906     ``sum {1 .. n} (\k. if k <= m then inv (&n) else 0) =
17907       sum {1 .. n} (\k. if (\k. k <= m) k then (\k. inv (&n)) k else 0)``] THEN
17908    ASM_REWRITE_TAC[GSYM SUM_RESTRICT_SET] THEN SIMP_TAC std_ss [] THEN
17909    FIRST_X_ASSUM(MP_TAC o SPEC ``n + 1:num``) THEN
17910    REWRITE_TAC [GSYM REAL_OF_NUM_ADD, real_div, REAL_ADD_RDISTRIB] THEN
17911    ASM_SIMP_TAC real_ss [REAL_MUL_RINV, REAL_MUL_LID, REAL_OF_NUM_EQ] THEN
17912    ASM_SIMP_TAC real_ss [REAL_ARITH ``y <= &1 /\ &0 < i ==> ~(&1 + i <= y:real)``,
17913                 REAL_LT_INV_EQ, REAL_LT, LE_1, NOT_LESS_EQUAL] THEN
17914    SIMP_TAC arith_ss [IN_NUMSEG, ARITH_PROVE
17915     ``m < n + 1 ==> ((1 <= k /\ k <= n) /\ k <= m <=> 1 <= k /\ k <= m:num)``] THEN
17916    DISCH_TAC THEN REWRITE_TAC[GSYM numseg, SUM_CONST_NUMSEG, ADD_SUB] THEN
17917    MATCH_MP_TAC REAL_LT_LCANCEL_IMP THEN EXISTS_TAC ``abs(&n:real)`` THEN
17918    REWRITE_TAC[GSYM ABS_MUL] THEN
17919    ASM_SIMP_TAC real_ss [ABS_N, REAL_MUL_RINV, REAL_OF_NUM_EQ] THEN
17920    ASM_SIMP_TAC std_ss [REAL_LT, LE_1, REAL_SUB_LDISTRIB, GSYM real_div] THEN
17921    ASM_SIMP_TAC real_ss [REAL_DIV_LMUL, REAL_OF_NUM_EQ] THEN
17922    MATCH_MP_TAC(REAL_ARITH ``f <= x /\ x < f + &1 ==> abs(x - f) < &1:real``) THEN
17923    FIRST_X_ASSUM(SUBST1_TAC o SYM) THEN CONJ_TAC THENL
17924    [MATCH_MP_TAC NUM_FLOOR_LE THEN MATCH_MP_TAC REAL_LE_MUL THEN
17925     ASM_SIMP_TAC std_ss [REAL_POS],
17926     REWRITE_TAC [GSYM NUM_FLOOR_LET] THEN SIMP_TAC std_ss [REAL_LE_REFL]]
17927QED
17928
17929Theorem lemma2[local]:
17930     !f:real->real g a b.
17931          f integrable_on interval[a,b] /\
17932          (!x y. x <= y ==> g(x) <= g(y))
17933          ==> {(\x. if c <= g(x) then f x else 0) | c IN univ(:real)}
17934              equiintegrable_on interval[a,b]
17935Proof
17936    REPEAT STRIP_TAC THEN
17937    UNDISCH_TAC ``f integrable_on interval [(a,b)]`` THEN DISCH_TAC THEN
17938    FIRST_ASSUM(MP_TAC o REWRITE_RULE [GSYM EQUIINTEGRABLE_ON_SING]) THEN
17939    DISCH_THEN(fn th =>
17940     MP_TAC(SPEC ``f:real->real`` (MATCH_MP (REWRITE_RULE[IMP_CONJ]
17941       EQUIINTEGRABLE_HALFSPACE_RESTRICTIONS_GE) th)) THEN
17942     MP_TAC(SPEC ``f:real->real`` (MATCH_MP (REWRITE_RULE[IMP_CONJ]
17943       EQUIINTEGRABLE_HALFSPACE_RESTRICTIONS_GT) th)) THEN
17944      MP_TAC th) THEN
17945    SIMP_TAC std_ss [IN_SING, REAL_LE_REFL] THEN
17946    SUBGOAL_THEN ``{(\x. 0):real->real} equiintegrable_on interval[a,b]``
17947    MP_TAC THENL
17948     [REWRITE_TAC[EQUIINTEGRABLE_ON_SING, INTEGRABLE_CONST], ALL_TAC] THEN
17949    REPEAT(ONCE_REWRITE_TAC[AND_IMP_INTRO] THEN
17950           DISCH_THEN(MP_TAC o MATCH_MP EQUIINTEGRABLE_UNION)) THEN
17951    SIMP_TAC std_ss [NUMSEG_SING, IN_SING] THEN
17952    REWRITE_TAC[SET_RULE ``
17953     {(\x. if x > c then h x else 0) | c IN univ(:real) /\ (h = f)} =
17954     {(\x. if x > c then (f:real->real) x else 0) | c IN univ(:real)}``] THEN
17955    REWRITE_TAC[SET_RULE ``
17956     {(\x. if x >= c then h x else 0) | c IN univ(:real) /\ (h = f)} =
17957     {(\x. if x >= c then (f:real->real) x else 0) | c IN univ(:real)}``] THEN
17958    MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] EQUIINTEGRABLE_SUBSET) THEN
17959    SIMP_TAC std_ss [SUBSET_DEF, FORALL_IN_GSPEC, IN_UNIV] THEN
17960    X_GEN_TAC ``y:real`` THEN
17961    ASM_CASES_TAC ``!x. y <= (g:real->real) x`` THENL
17962     [ASM_SIMP_TAC std_ss [ETA_AX, IN_UNION, IN_SING], ALL_TAC] THEN
17963    ASM_CASES_TAC ``!x. ~(y <= (g:real->real) x)`` THENL
17964     [ASM_SIMP_TAC std_ss [ETA_AX, IN_UNION, IN_SING], ALL_TAC] THEN
17965    MP_TAC (ISPEC ``IMAGE (\x. x) {x | y <= (g:real->real) x}`` INF) THEN
17966    SIMP_TAC std_ss [FORALL_IN_IMAGE, GSPECIFICATION, IMAGE_EQ_EMPTY] THEN
17967    KNOW_TAC ``({x | y <= (g:real->real) x} <> {}) /\
17968               (?b. !x. y <= (g:real->real) x ==> b <= x)`` THENL
17969     [ASM_SIMP_TAC std_ss [EXTENSION, GSPECIFICATION, NOT_IN_EMPTY] THEN
17970      METIS_TAC[REAL_LE_TRANS, REAL_LE_TOTAL],
17971      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
17972      STRIP_TAC THEN REWRITE_TAC[real_gt, real_ge]] THEN
17973    REWRITE_TAC[IN_UNION, GSYM DISJ_ASSOC] THEN
17974    ASM_CASES_TAC ``y <= g((inf(IMAGE (\x. x) {x | y <= (g:real->real) x})))`` THENL
17975     [REPEAT DISJ2_TAC, DISJ2_TAC THEN DISJ2_TAC THEN DISJ1_TAC] THEN
17976    SIMP_TAC std_ss [GSPECIFICATION] THEN
17977    EXISTS_TAC ``inf(IMAGE (\x. x) {x | y <= (g:real->real) x})`` THEN
17978    SIMP_TAC std_ss [FUN_EQ_THM] THEN
17979    ONCE_REWRITE_TAC [METIS [] ``y <= g x <=> (\x. y <= (g:real->real) x) x``] THEN
17980    ONCE_REWRITE_TAC [METIS []
17981     ``inf (IMAGE (\x. x) {x | (\x. y <= (g:real->real) x) x}) <= x <=>
17982       (\x. inf (IMAGE (\x. x) {x | (\x. y <= g x) x}) <= x) x``] THEN
17983    MATCH_MP_TAC(METIS []
17984     ``(!x. P x <=> Q x)
17985      ==> !x. (if P x then f x else b) = (if Q x then f x else b)``) THEN
17986    X_GEN_TAC ``x:real`` THEN SIMP_TAC std_ss [GSYM REAL_NOT_LE] THEN
17987    METIS_TAC [REAL_LE_TOTAL, REAL_LT_ANTISYM, REAL_LE_TRANS]
17988QED
17989
17990Theorem lemma3[local]:
17991     !f:real->real g:real->real a b.
17992          f integrable_on interval[a,b] /\
17993          (!x y. x <= y ==> g(x) <= g(y))
17994          ==> {(\x. sum { 1n..n}
17995                     (\k. if &k / &n <= g x then inv(&n) * f(x) else 0)) |
17996               ~(n = 0)}
17997              equiintegrable_on interval[a,b]
17998Proof
17999    REPEAT GEN_TAC THEN DISCH_THEN(MP_TAC o
18000     MATCH_MP lemma2) THEN
18001    DISCH_THEN(MP_TAC o MATCH_MP
18002     (INST_TYPE [alpha |-> ``:num``] (EQUIINTEGRABLE_SUM))) THEN
18003    MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] EQUIINTEGRABLE_SUBSET) THEN
18004    SIMP_TAC std_ss [SUBSET_DEF, FORALL_IN_GSPEC, IN_UNIV] THEN X_GEN_TAC ``n:num`` THEN
18005    DISCH_TAC THEN SIMP_TAC std_ss [GSPECIFICATION, EXISTS_PROD] THEN
18006    MAP_EVERY EXISTS_TAC [``{ 1n..n}``, ``(\k:num. inv(&n:real))``,
18007     ``(\k x. if &k / &n <= (g:real->real) x then (f:real->real) x else 0)``] THEN
18008    ASM_SIMP_TAC real_ss [SUM_CONST_NUMSEG, ADD_SUB, REAL_MUL_RINV, REAL_OF_NUM_EQ] THEN
18009    SIMP_TAC std_ss [FINITE_NUMSEG, COND_RAND, COND_RATOR, REAL_MUL_RZERO] THEN
18010    X_GEN_TAC ``k:num`` THEN
18011    REWRITE_TAC[IN_NUMSEG, REAL_LE_INV_EQ, REAL_POS] THEN STRIP_TAC THEN
18012    EXISTS_TAC ``&k / &n:real`` THEN SIMP_TAC std_ss []
18013QED
18014
18015Theorem lemma4[local]:
18016     !f:real->real g:real->real a b.
18017          ~(interval[a,b] = {}) /\
18018          f integrable_on interval[a,b] /\
18019          (!x y. x <= y ==> g(x) <= g(y)) /\
18020          (!x. x IN interval[a,b] ==> &0 <= g x /\ g x <= &1)
18021          ==> (\x. g(x) * f(x)) integrable_on interval[a,b] /\
18022              ?c. c IN interval[a,b] /\
18023                  (integral (interval[a,b]) (\x. g(x) * f(x)) =
18024                   integral (interval[c,b]) f)
18025Proof
18026    REPEAT GEN_TAC THEN STRIP_TAC THEN
18027    SUBGOAL_THEN
18028     ``?m M. IMAGE (\x. integral (interval[x,b]) (f:real->real))
18029                  (interval[a,b]) = interval[m,M]``
18030    STRIP_ASSUME_TAC THENL
18031     [REWRITE_TAC[GSYM CONNECTED_COMPACT_INTERVAL_1] THEN CONJ_TAC THENL
18032       [MATCH_MP_TAC CONNECTED_CONTINUOUS_IMAGE,
18033        MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE] THEN
18034      ASM_SIMP_TAC std_ss [INDEFINITE_INTEGRAL_CONTINUOUS_LEFT, CONVEX_CONNECTED,
18035                   CONVEX_INTERVAL, COMPACT_INTERVAL],
18036      ALL_TAC] THEN
18037    MP_TAC(ISPECL[``f:real->real``, ``g:real->real``, ``a:real``, ``b:real``]
18038          lemma3) THEN
18039    ASM_SIMP_TAC std_ss [] THEN DISCH_TAC THEN
18040    SUBGOAL_THEN
18041     ``!n. ?c. c IN interval[a,b] /\
18042             (integral (interval[c,b]) (f:real->real) =
18043              integral (interval[a,b])
18044                (\x. sum { 1n..n}
18045                    (\k. if &k / &n <= (g:real->real) x then inv(&n) * f x else 0)))``
18046    MP_TAC THENL
18047    [ (* goal 1 (of 2) *)
18048      X_GEN_TAC ``n:num`` THEN ASM_CASES_TAC ``n = 0:num`` THENL
18049       [ASM_SIMP_TAC arith_ss [SUM_CLAUSES_NUMSEG, INTEGRAL_0] THEN
18050        EXISTS_TAC ``b:real`` THEN ASM_SIMP_TAC std_ss [ENDS_IN_INTERVAL] THEN
18051        SIMP_TAC std_ss [INTEGRAL_NULL, CONTENT_EQ_0, REAL_LE_REFL],
18052        ALL_TAC] THEN
18053      MP_TAC(ISPECL [``f:real->real``, ``g:real->real``,
18054                     ``a:real``, ``b:real``] lemma2) THEN
18055      ASM_SIMP_TAC std_ss [equiintegrable_on, FORALL_IN_GSPEC, IN_UNIV] THEN
18056      DISCH_THEN(ASSUME_TAC o CONJUNCT1) THEN
18057      REWRITE_TAC[METIS [REAL_MUL_RZERO]
18058       ``(if p then a * x else 0:real) =
18059         a * (if p then x else 0)``] THEN
18060      ASM_SIMP_TAC std_ss [SUM_LMUL, INTEGRAL_CMUL, INTEGRABLE_SUM, ETA_AX,
18061                   FINITE_NUMSEG, INTEGRAL_SUM] THEN
18062      SUBGOAL_THEN
18063       ``!y:real. ?d:real.
18064          d IN interval[a,b] /\
18065         (integral (interval[a,b]) (\x. if y <= (g:real->real) x then f x else 0) =
18066          integral (interval[d,b]) (f:real->real))``
18067      MP_TAC THENL
18068      [ (* goal 1.1 (of 2) *)
18069        X_GEN_TAC ``y:real`` THEN
18070        SUBGOAL_THEN
18071        ``({x | y <= (g:real->real) x} = {}) \/
18072          ({x | y <= (g:real->real) x} = univ(:real)) \/
18073          (?a. {x | y <= (g:real->real) x} = {x | a <= x}) \/
18074          (?a. {x | y <= (g:real->real) x} = {x | a < x})``
18075        MP_TAC THENL
18076        [ (* goal 1.1.1 (of 2) *)
18077          MATCH_MP_TAC(TAUT `(~a /\ ~b ==> c \/ d) ==> a \/ b \/ c \/ d`) THEN
18078          DISCH_TAC THEN
18079          MP_TAC(ISPEC ``IMAGE (\x. x) {x | y <= (g:real->real) x}`` INF) THEN
18080          ASM_SIMP_TAC real_ss [FORALL_IN_IMAGE, GSPECIFICATION, IMAGE_EQ_EMPTY] THEN
18081          KNOW_TAC ``(?b'. !x. y <= (g:real->real) x ==> b' <= x)`` THENL
18082           [FIRST_ASSUM(MP_TAC o CONJUNCT2) THEN
18083            SIMP_TAC std_ss [EXTENSION, GSPECIFICATION, IN_UNIV, NOT_IN_EMPTY] THEN
18084            METIS_TAC[REAL_LE_TRANS, REAL_LE_TOTAL],
18085            DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
18086            STRIP_TAC] THEN
18087          ASM_CASES_TAC ``y <= (g:real->real)((inf(IMAGE (\x. x) {x | y <= g x})))`` THENL
18088           [DISJ1_TAC, DISJ2_TAC] THEN
18089          SIMP_TAC std_ss [EXTENSION, GSPECIFICATION] THEN
18090          EXISTS_TAC ``inf(IMAGE (\x. x) {x | y <= (g:real->real) x})`` THEN
18091          SIMP_TAC std_ss [FUN_EQ_THM] THEN
18092          X_GEN_TAC ``x:real`` THEN
18093          REWRITE_TAC[GSYM REAL_NOT_LE] THEN
18094          METIS_TAC[REAL_LE_TOTAL, REAL_LT_ANTISYM, REAL_LE_TRANS],
18095          (* goal 1.1.2 (of 2) *)
18096          SIMP_TAC std_ss [EXTENSION, IN_UNIV, NOT_IN_EMPTY, GSPECIFICATION] THEN
18097          DISCH_THEN(DISJ_CASES_THEN2 ASSUME_TAC MP_TAC) THENL
18098           [EXISTS_TAC ``b:real`` THEN ASM_REWRITE_TAC[] THEN
18099            SIMP_TAC std_ss [INTEGRAL_NULL, CONTENT_EQ_0, REAL_LE_REFL] THEN
18100            ASM_SIMP_TAC std_ss [ENDS_IN_INTERVAL, INTEGRAL_0],
18101            ALL_TAC] THEN
18102          DISCH_THEN(DISJ_CASES_THEN2 ASSUME_TAC MP_TAC) THENL
18103           [EXISTS_TAC ``a:real`` THEN
18104            ASM_SIMP_TAC std_ss [ETA_AX, ENDS_IN_INTERVAL],
18105            ALL_TAC] THEN
18106          SIMP_TAC std_ss [
18107              METIS []
18108                “(?(a :real). (!(x :real). (y :real) <= (g :real -> real) x <=>
18109                                           a <= x)) \/
18110                 (?(a :real). !(x :real). y <= g x <=> a < x) <=>
18111                 ?a. ((\a. !x. y <= (g:real->real) x <=> a <= x) a \/
18112                      (\a. !x. y <= (g:real->real) x <=> a < x) a)”
18113            ] THEN
18114          DISCH_THEN(X_CHOOSE_THEN ``d:real`` ASSUME_TAC) THEN
18115          ASM_CASES_TAC ``d < a:real`` THENL
18116           [EXISTS_TAC ``a:real`` THEN
18117            ASM_SIMP_TAC std_ss [ETA_AX, ENDS_IN_INTERVAL] THEN
18118            MATCH_MP_TAC INTEGRAL_EQ THEN
18119            SIMP_TAC std_ss [IN_DIFF, IN_INTERVAL, NOT_IN_EMPTY] THEN
18120            GEN_TAC THEN COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
18121            UNDISCH_TAC ``~(y <= (g:real->real) x)`` THEN
18122            FIRST_X_ASSUM DISJ_CASES_TAC THEN ASM_SIMP_TAC real_ss [] THEN
18123            UNDISCH_TAC ``d < a:real`` THEN REAL_ARITH_TAC,
18124            ALL_TAC] THEN
18125          ASM_CASES_TAC ``b < d:real`` THENL
18126           [EXISTS_TAC ``b:real`` THEN
18127            SIMP_TAC std_ss [INTEGRAL_NULL, CONTENT_EQ_0, REAL_LE_REFL] THEN
18128            ASM_SIMP_TAC std_ss [ENDS_IN_INTERVAL, INTEGRAL_0] THEN
18129            MATCH_MP_TAC INTEGRAL_EQ_0 THEN SIMP_TAC std_ss [IN_INTERVAL] THEN
18130            REPEAT STRIP_TAC THEN
18131            COND_CASES_TAC THEN ASM_SIMP_TAC std_ss [] THEN
18132            UNDISCH_TAC ``y <= (g:real->real) x`` THEN
18133            FIRST_X_ASSUM DISJ_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
18134            UNDISCH_TAC ``b < d:real`` THEN UNDISCH_TAC ``x <= b:real`` THEN
18135            REAL_ARITH_TAC,
18136            ALL_TAC] THEN
18137          EXISTS_TAC ``d:real`` THEN
18138          ASM_REWRITE_TAC[IN_INTERVAL, GSYM REAL_NOT_LT] THEN
18139          ONCE_REWRITE_TAC[SET_RULE
18140            ``~((g:real->real) x < y) <=> x IN {x | ~(g x < y)}``] THEN
18141          SIMP_TAC std_ss [INTEGRAL_RESTRICT_INTER] THEN
18142          MATCH_MP_TAC INTEGRAL_SPIKE_SET THEN
18143          MATCH_MP_TAC NEGLIGIBLE_SUBSET THEN EXISTS_TAC ``{d:real}`` THEN
18144          REWRITE_TAC[NEGLIGIBLE_SING, REAL_NOT_LT, SUBSET_DEF] THEN GEN_TAC THEN
18145          SIMP_TAC std_ss [SUBSET_DEF, IN_UNION, IN_INTER, IN_DIFF, IN_INTERVAL,
18146                      GSPECIFICATION, IN_SING] THEN
18147          FIRST_X_ASSUM DISJ_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
18148          UNDISCH_TAC ``~(d < a:real)`` THEN UNDISCH_TAC ``~(b < d:real)`` THEN
18149          REAL_ARITH_TAC ],
18150        (* goal 1.2 (of 2) *)
18151        DISCH_THEN(MP_TAC o GEN ``k:num`` o SPEC ``&k / &n:real``) THEN
18152        SIMP_TAC std_ss [SKOLEM_THM, FORALL_AND_THM, LEFT_IMP_EXISTS_THM] THEN
18153        X_GEN_TAC ``d:num->real`` THEN STRIP_TAC THEN
18154        FIRST_ASSUM(MP_TAC o MATCH_MP (SET_RULE
18155         ``(IMAGE f s = t) ==> !y. y IN t ==> ?x. x IN s /\ (f x = y)``)) THEN
18156        SIMP_TAC std_ss [GSYM SUM_LMUL] THEN DISCH_THEN MATCH_MP_TAC THEN
18157        ONCE_REWRITE_TAC [METIS []
18158         ``(\k. inv (&n) * integral (interval [(d k,b)]) f) =
18159           (\k. (\k. inv (&n)) k * (\k. integral (interval [(d k,b)]) f) k)``] THEN
18160        MATCH_MP_TAC(REWRITE_RULE[CONVEX_INDEXED]
18161         (CONJUNCT1(SPEC_ALL CONVEX_INTERVAL))) THEN
18162        SIMP_TAC real_ss [SUM_CONST_NUMSEG, ADD_SUB, REAL_LE_INV_EQ, REAL_POS] THEN
18163        ASM_SIMP_TAC real_ss [REAL_MUL_RINV, REAL_OF_NUM_EQ] THEN ASM_SET_TAC[] ],
18164      (* goal 2 (of 2) *)
18165      SIMP_TAC std_ss [SKOLEM_THM, LEFT_IMP_EXISTS_THM, FORALL_AND_THM] THEN
18166      X_GEN_TAC ``c:num->real`` THEN DISCH_THEN(STRIP_ASSUME_TAC o GSYM) ] THEN
18167    (* stage work *)
18168    SUBGOAL_THEN ``compact(interval[a:real,b])`` MP_TAC THENL
18169     [REWRITE_TAC[COMPACT_INTERVAL], REWRITE_TAC[compact]] THEN
18170    DISCH_THEN(MP_TAC o SPEC ``c:num->real``) THEN
18171    ASM_SIMP_TAC std_ss [LEFT_IMP_EXISTS_THM] THEN MAP_EVERY X_GEN_TAC
18172     [``d:real``, ``s:num->num``] THEN STRIP_TAC THEN
18173    MP_TAC(ISPECL
18174     [``\n:num x. sum {1..s n}
18175                      (\k. if &k / &((s:num->num) n):real <= (g:real->real) x
18176                           then inv(&(s n)) * (f:real->real) x
18177                           else 0)``,
18178      ``\x. (g:real->real) x * (f:real->real) x``, ``a:real``, ``b:real``]
18179     EQUIINTEGRABLE_LIMIT) THEN
18180    ASM_SIMP_TAC std_ss [] THEN
18181    KNOW_TAC ``{(\(x :real).
18182     sum {1 .. (s :num -> num) n}
18183       (\(k :num).
18184          if ((&k) :real) / ((&s n) :real) <= (g :real -> real) x then
18185            inv ((&s n) :real) * (f :real -> real) x
18186          else (0 :real))) |
18187       n IN univ((:num) :num itself)} equiintegrable_on
18188         interval [((a :real),(b :real))] /\
18189     (!(x :real). x IN interval [(a,b)] ==>
18190     (((\(n :num). sum { 1n .. s n}
18191           (\(k :num).
18192              if ((&k) :real) / ((&s n) :real) <= g x then
18193                inv ((&s n) :real) * f x
18194              else (0 :real))) --> (g x * f x)) sequentially :bool))`` THENL
18195     [CONJ_TAC THENL
18196       [MATCH_MP_TAC EQUIINTEGRABLE_SUBSET THEN
18197        EXISTS_TAC
18198         ``{\x. sum{1..0} (\k. if &k / &0:real <= (g:real->real) x
18199                               then inv(&0) * (f:real->real) x else 0)}
18200          UNION
18201          {\x. sum {1 .. n}
18202                    (\k. if &k / &n <= g x then inv (&n) * f x else 0)
18203           | ~(n = 0)}`` THEN
18204        CONJ_TAC THENL
18205         [MATCH_MP_TAC EQUIINTEGRABLE_UNION THEN ASM_REWRITE_TAC[] THEN
18206          SIMP_TAC arith_ss [EQUIINTEGRABLE_ON_SING, SUM_CLAUSES_NUMSEG] THEN
18207          SIMP_TAC std_ss [INTEGRABLE_0],
18208          SIMP_TAC std_ss [SUBSET_DEF, FORALL_IN_GSPEC, IN_UNIV, IN_UNION] THEN
18209          SIMP_TAC std_ss [GSPECIFICATION, IN_SING] THEN
18210          X_GEN_TAC ``n:num`` THEN ASM_CASES_TAC ``(s:num->num) n = 0`` THEN
18211          ASM_REWRITE_TAC[] THEN DISJ2_TAC THEN
18212          EXISTS_TAC ``(s:num->num) n`` THEN ASM_REWRITE_TAC[]],
18213        X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN SIMP_TAC std_ss [] THEN
18214        ONCE_REWRITE_TAC[METIS [REAL_MUL_LZERO]
18215         ``(if p then a * x else 0:real) = (if p then a else &0) * x``] THEN
18216        SIMP_TAC std_ss [SUM_RMUL] THEN
18217        ONCE_REWRITE_TAC [METIS []
18218         ``(\n. sum {1 .. s n}
18219            (\k. if &k / &s n <= (g:real->real) x then inv (&s n) else 0) * f x) =
18220           (\n. (\n. sum {1 .. s n}
18221            (\k. if &k / &s n <= g x then inv (&s n) else 0)) n * (\n. f x) n)``] THEN
18222        MATCH_MP_TAC LIM_MUL THEN
18223        SIMP_TAC std_ss [LIM_SEQUENTIALLY, o_DEF, DIST_REFL] THEN
18224        X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
18225        MP_TAC(ISPEC ``e:real`` REAL_ARCH_INV) THEN
18226        ASM_REWRITE_TAC[] THEN DISCH_THEN (X_CHOOSE_TAC ``N:num``) THEN
18227        EXISTS_TAC ``N:num`` THEN POP_ASSUM MP_TAC THEN
18228        STRIP_TAC THEN X_GEN_TAC ``n:num`` THEN DISCH_TAC THEN
18229        REWRITE_TAC [dist] THEN ONCE_REWRITE_TAC[ABS_SUB] THEN
18230        MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC ``inv(&n:real)`` THEN
18231        CONJ_TAC THENL
18232         [MP_TAC(ISPECL
18233           [``(g:real->real)``, ``IMAGE (\x. x) (interval[a,b])``]
18234            lemma1) THEN
18235          ASM_SIMP_TAC std_ss [FORALL_IN_IMAGE, o_DEF, IMP_CONJ,
18236                          RIGHT_FORALL_IMP_THM] THEN
18237          REWRITE_TAC[AND_IMP_INTRO] THEN DISCH_TAC THEN
18238          MATCH_MP_TAC REAL_LTE_TRANS THEN
18239          EXISTS_TAC ``inv(&((s:num->num) n):real)`` THEN CONJ_TAC THENL
18240           [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_SIMP_TAC std_ss [],
18241            MATCH_MP_TAC REAL_LE_INV2 THEN
18242            REWRITE_TAC[REAL_OF_NUM_LE, REAL_LT]] THEN
18243          FIRST_ASSUM(MP_TAC o SPEC ``n:num`` o MATCH_MP MONOTONE_BIGGER) THEN
18244          ASM_SIMP_TAC arith_ss [],
18245          MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC ``inv(&N:real)`` THEN
18246          ASM_SIMP_TAC std_ss [] THEN MATCH_MP_TAC REAL_LE_INV2 THEN
18247          REWRITE_TAC[REAL_OF_NUM_LE, REAL_LT] THEN ASM_SIMP_TAC arith_ss []]],
18248      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
18249      STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
18250      EXISTS_TAC ``d:real`` THEN ASM_REWRITE_TAC[] THEN
18251      MATCH_MP_TAC(ISPEC ``sequentially`` LIM_UNIQUE) THEN
18252      EXISTS_TAC ``\n. integral (interval [c((s:num->num) n),b])
18253                               (f:real->real)`` THEN
18254      ASM_SIMP_TAC std_ss [TRIVIAL_LIMIT_SEQUENTIALLY] THEN
18255      MP_TAC(ISPECL [``f:real->real``, ``a:real``, ``b:real``]
18256          INDEFINITE_INTEGRAL_CONTINUOUS_LEFT) THEN
18257      ASM_REWRITE_TAC[CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN] THEN
18258      DISCH_THEN(MP_TAC o SPEC ``d:real``) THEN ASM_REWRITE_TAC[] THEN
18259      REWRITE_TAC[CONTINUOUS_WITHIN_SEQUENTIALLY] THEN
18260      DISCH_THEN(MP_TAC o SPEC ``(c:num->real) o (s:num->num)``) THEN
18261      ASM_REWRITE_TAC[] THEN ASM_SIMP_TAC std_ss [o_DEF]]
18262QED
18263
18264Theorem SECOND_MEAN_VALUE_THEOREM_FULL:
18265   !f:real->real g a b.
18266        ~(interval[a,b] = {}) /\
18267        f integrable_on interval [a,b] /\
18268        (!x y. x IN interval[a,b] /\ y IN interval[a,b] /\ x <= y
18269               ==> g x <= g y)
18270        ==> ?c. c IN interval [a,b] /\
18271                ((\x. g x * f x) has_integral
18272                 (g(a) * integral (interval[a,c]) f +
18273                  g(b) * integral (interval[c,b]) f)) (interval[a,b])
18274Proof
18275  REPEAT GEN_TAC THEN STRIP_TAC THEN
18276  SUBGOAL_THEN ``(g:real->real) a <= g b`` MP_TAC THENL
18277   [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[ENDS_IN_INTERVAL] THEN
18278    ASM_MESON_TAC[GSYM INTERVAL_EQ_EMPTY, REAL_LET_TOTAL],
18279    ALL_TAC] THEN
18280  REWRITE_TAC[REAL_LE_LT] THEN STRIP_TAC THENL
18281   [ALL_TAC,
18282    SUBGOAL_THEN
18283     ``!x. x IN interval[a,b] ==> ((g:real->real)(x) * (f:real->real)(x) = g(a) * f x)``
18284    ASSUME_TAC THENL
18285     [X_GEN_TAC ``x:real`` THEN
18286      REWRITE_TAC[IN_INTERVAL] THEN STRIP_TAC THEN
18287      AP_THM_TAC THEN AP_TERM_TAC THEN
18288      RULE_ASSUM_TAC(REWRITE_RULE
18289       [IN_INTERVAL, GSYM INTERVAL_EQ_EMPTY, REAL_NOT_LT]) THEN
18290      ASM_MESON_TAC[REAL_LE_ANTISYM, REAL_LE_TRANS, REAL_LE_TOTAL],
18291      ALL_TAC] THEN
18292    EXISTS_TAC ``a:real`` THEN ASM_REWRITE_TAC[ENDS_IN_INTERVAL] THEN
18293    MATCH_MP_TAC HAS_INTEGRAL_EQ THEN
18294    EXISTS_TAC ``\x. g(a:real) * (f:real->real) x`` THEN
18295    ASM_SIMP_TAC std_ss [INTEGRAL_NULL, CONTENT_EQ_0, REAL_LE_REFL] THEN
18296    ASM_SIMP_TAC std_ss [INTEGRAL_CMUL, REAL_MUL_RZERO, REAL_ADD_LID] THEN
18297    MATCH_MP_TAC HAS_INTEGRAL_CMUL THEN
18298    ASM_REWRITE_TAC[GSYM HAS_INTEGRAL_INTEGRAL]] THEN
18299  MP_TAC(ISPECL
18300   [``f:real->real``,
18301    ``(\x. if x < a then &0
18302         else if b < x then &1
18303         else (g(x) - g(a)) / (g(b) - (g:real->real)(a)))``,
18304    ``a:real``, ``b:real``]
18305   lemma4) THEN ASM_SIMP_TAC std_ss [] THEN
18306  KNOW_TAC ``(!(x :real) (y :real).
18307    x <= y ==>
18308    (if x < (a :real) then (0 :real)
18309     else if (b :real) < x then (1 :real)
18310     else ((g :real -> real) x - g a) / (g b - g a)) <=
18311    if y < a then (0 :real)
18312    else if b < y then (1 :real)
18313    else (g y - g a) / (g b - g a)) /\
18314 (!(x :real).
18315    x IN interval [(a,b)] ==>
18316    (0 :real) <=
18317    (if x < a then (0 :real)
18318     else if b < x then (1 :real)
18319     else (g x - g a) / (g b - g a)) /\
18320    (if x < a then (0 :real)
18321     else if b < x then (1 :real)
18322     else (g x - g a) / (g b - g a)) <= (1 :real))`` THENL
18323   [(* goal 1 (of 2) *)
18324    CONJ_TAC THEN REPEAT GEN_TAC THEN
18325    REPEAT(COND_CASES_TAC THEN ASM_REWRITE_TAC[REAL_POS, REAL_LE_REFL]) THEN
18326    TRY ASM_REAL_ARITH_TAC THEN
18327    ASM_SIMP_TAC real_ss [IN_INTERVAL, REAL_SUB_LT] THEN
18328    ASM_SIMP_TAC real_ss [REAL_LE_LDIV_EQ, REAL_LE_RDIV_EQ, REAL_SUB_LT] THEN
18329    ASM_REWRITE_TAC[REAL_MUL_LZERO, REAL_MUL_LID, REAL_SUB_LE,
18330                    REAL_ARITH ``x - a <= y - a <=> x <= y:real``] THEN
18331    REPEAT STRIP_TAC THEN TRY (FIRST_X_ASSUM MATCH_MP_TAC) THEN
18332    REWRITE_TAC[IN_INTERVAL] THEN
18333    (* NOTE: when the proof comes here, there are 5 subgoals. Previously
18334       the old ASM_REAL_ARITH_TAC solved 2 out of 5 subgoals, but now
18335       the new ASM_REAL_ARITH_TAC can resolve 4 of them, leaving only one.
18336     *)
18337    TRY (RealArith.REAL_ASM_ARITH_TAC) THEN
18338    (UNDISCH_TAC ``g a < (g:real->real) b`` THEN
18339     GEN_REWR_TAC LAND_CONV [REAL_ARITH ``a < b <=> 0 < b - a:real``] THEN
18340     DISCH_THEN (MP_TAC o ONCE_REWRITE_RULE [EQ_SYM_EQ] o MATCH_MP REAL_LT_IMP_NE) THEN
18341     DISCH_TAC THEN REWRITE_TAC [real_div, GSYM REAL_MUL_ASSOC] THEN
18342     ASM_SIMP_TAC real_ss [REAL_MUL_LINV] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
18343     REWRITE_TAC[IN_INTERVAL] THEN ASM_REAL_ARITH_TAC),
18344    (* goal 2 (of 2) *)
18345    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
18346  SIMP_TAC std_ss [GSYM RIGHT_EXISTS_AND_THM] THEN
18347  DISCH_THEN (X_CHOOSE_TAC ``c:real``) THEN EXISTS_TAC ``c:real`` THEN
18348  POP_ASSUM MP_TAC THEN
18349  ONCE_REWRITE_TAC[TAUT `a /\ b /\ c ==> d <=> b ==> a /\ c ==> d`] THEN
18350  DISCH_TAC THEN ASM_SIMP_TAC std_ss [GSYM HAS_INTEGRAL_INTEGRABLE_INTEGRAL] THEN
18351  DISCH_THEN(MP_TAC o SPEC ``(g:real->real) b - g a`` o
18352        MATCH_MP HAS_INTEGRAL_CMUL) THEN
18353  FIRST_ASSUM(MP_TAC o MATCH_MP INTEGRABLE_INTEGRAL) THEN
18354  DISCH_THEN(MP_TAC o SPEC ``(g:real->real)(a)`` o
18355      MATCH_MP HAS_INTEGRAL_CMUL) THEN REWRITE_TAC[AND_IMP_INTRO] THEN
18356  DISCH_THEN(MP_TAC o MATCH_MP HAS_INTEGRAL_ADD) THEN
18357  MP_TAC(ISPECL [``f:real->real``, ``a:real``, ``b:real``, ``c:real``]
18358        INTEGRAL_COMBINE) THEN
18359  KNOW_TAC ``a <= c /\ c <= b:real /\ f integrable_on interval [(a,b)]`` THENL
18360   [ASM_MESON_TAC[IN_INTERVAL],
18361    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
18362  DISCH_THEN(SUBST1_TAC o SYM) THEN
18363  SIMP_TAC std_ss [REAL_ARITH
18364   ``ga * (i1 + i2) + (gb - ga) * i2:real = ga * i1 + gb * i2:real``] THEN
18365  MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] HAS_INTEGRAL_EQ) THEN
18366  X_GEN_TAC ``x:real`` THEN REWRITE_TAC[IN_INTERVAL] THEN STRIP_TAC THEN
18367  ASM_SIMP_TAC std_ss [GSYM REAL_NOT_LE, REAL_MUL_ASSOC] THEN
18368  ASM_SIMP_TAC real_ss [REAL_DIV_LMUL, REAL_LT_IMP_NE, REAL_SUB_LT]
18369QED
18370
18371Theorem SECOND_MEAN_VALUE_THEOREM:
18372   !f:real->real g a b.
18373        ~(interval[a,b] = {}) /\
18374        f integrable_on interval [a,b] /\
18375        (!x y. x IN interval[a,b] /\ y IN interval[a,b] /\ x <= y
18376               ==> g x <= g y)
18377        ==> ?c. c IN interval [a,b] /\
18378                (integral (interval[a,b]) (\x. g x * f x) =
18379                 g(a) * integral (interval[a,c]) f +
18380                 g(b) * integral (interval[c,b]) f)
18381Proof
18382  REPEAT GEN_TAC THEN
18383  DISCH_THEN(MP_TAC o MATCH_MP SECOND_MEAN_VALUE_THEOREM_FULL) THEN
18384  DISCH_THEN (X_CHOOSE_TAC ``c:real``) THEN EXISTS_TAC ``c:real`` THEN
18385  POP_ASSUM MP_TAC THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
18386  FIRST_X_ASSUM(SUBST1_TAC o MATCH_MP INTEGRAL_UNIQUE) THEN REWRITE_TAC[]
18387QED
18388
18389Theorem SECOND_MEAN_VALUE_THEOREM_GEN_FULL:
18390   !f:real->real g a b u v.
18391        ~(interval[a,b] = {}) /\ f integrable_on interval [a,b] /\
18392        (!x. x IN interval(a,b) ==> u <= g x /\ g x <= v) /\
18393        (!x y. x IN interval[a,b] /\ y IN interval[a,b] /\ x <= y
18394               ==> g x <= g y)
18395        ==> ?c. c IN interval [a,b] /\
18396                ((\x. g x * f x) has_integral
18397                 (u * integral (interval[a,c]) f +
18398                  v * integral (interval[c,b]) f)) (interval[a,b])
18399Proof
18400  REPEAT STRIP_TAC THEN ASM_CASES_TAC ``b:real = a`` THENL
18401   [EXISTS_TAC ``a:real`` THEN ASM_REWRITE_TAC[INTERVAL_SING, IN_SING] THEN
18402    ASM_SIMP_TAC std_ss [GSYM INTERVAL_SING, INTEGRAL_NULL, CONTENT_EQ_0,
18403      REAL_ADD_LID, REAL_LE_REFL, REAL_MUL_RZERO, HAS_INTEGRAL_NULL],
18404    ALL_TAC] THEN
18405  SUBGOAL_THEN ``a < b:real`` ASSUME_TAC THENL
18406   [METIS_TAC[GSYM INTERVAL_EQ_EMPTY, REAL_NOT_LE, REAL_LT_LE],
18407    ALL_TAC] THEN
18408  SUBGOAL_THEN ``u <= v:real`` ASSUME_TAC THENL
18409   [METIS_TAC[GSYM INTERVAL_EQ_EMPTY, MEMBER_NOT_EMPTY, REAL_NOT_LT,
18410                  REAL_LE_TRANS],
18411    ALL_TAC] THEN
18412  MP_TAC(ISPECL
18413   [``f:real->real``,
18414    ``\x:real. if x = a then u else if x = b then v else g x:real``,
18415    ``a:real``, ``b:real``] SECOND_MEAN_VALUE_THEOREM_FULL) THEN
18416  ASM_SIMP_TAC std_ss [REAL_MUL_LZERO, REAL_ADD_LID] THEN
18417  KNOW_TAC ``(!x y.
18418    x IN interval [(a,b)] /\ y IN interval [(a,b)] /\ x <= y ==>
18419    (if x = a then u else if x = b then v else (g:real->real) x) <=
18420    if y = a then u else if y = b then v else g y)`` THENL
18421   [MAP_EVERY X_GEN_TAC [``x:real``, ``y:real``] THEN
18422    ASM_CASES_TAC ``x:real = a`` THEN ASM_REWRITE_TAC[] THENL
18423     [METIS_TAC[REAL_LE_REFL, INTERVAL_CASES], ALL_TAC] THEN
18424    ASM_CASES_TAC ``y:real = b`` THEN ASM_REWRITE_TAC[] THENL
18425     [METIS_TAC[REAL_LE_REFL, INTERVAL_CASES], ALL_TAC] THEN
18426    REPEAT(COND_CASES_TAC THEN ASM_SIMP_TAC std_ss []) THEN
18427    REWRITE_TAC[IN_INTERVAL] THEN POP_ASSUM MP_TAC THEN
18428    POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
18429    POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
18430    POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
18431    TRY REAL_ARITH_TAC THEN UNDISCH_TAC ``b <= y:real`` THEN
18432    UNDISCH_TAC ``y <= b:real`` THEN UNDISCH_TAC ``y <> b:real`` THEN
18433    REAL_ARITH_TAC,
18434    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
18435    DISCH_THEN (X_CHOOSE_TAC ``c:real``) THEN EXISTS_TAC ``c:real`` THEN
18436    POP_ASSUM MP_TAC THEN MATCH_MP_TAC MONO_AND THEN
18437    REWRITE_TAC[] THEN MATCH_MP_TAC
18438     (REWRITE_RULE[TAUT `a /\ b /\ c ==> d <=> a /\ b ==> c ==> d`]
18439        HAS_INTEGRAL_SPIKE) THEN
18440    EXISTS_TAC ``{a:real;b}`` THEN
18441    SIMP_TAC std_ss [NEGLIGIBLE_EMPTY, NEGLIGIBLE_INSERT, IN_DIFF, IN_INSERT,
18442             NOT_IN_EMPTY, DE_MORGAN_THM]]
18443QED
18444
18445Theorem SECOND_MEAN_VALUE_THEOREM_GEN:
18446   !f:real->real g a b u v.
18447        ~(interval[a,b] = {}) /\ f integrable_on interval [a,b] /\
18448        (!x. x IN interval(a,b) ==> u <= g x /\ g x <= v) /\
18449        (!x y. x IN interval[a,b] /\ y IN interval[a,b] /\ x <= y
18450               ==> g x <= g y)
18451        ==> ?c. c IN interval [a,b] /\
18452               (integral (interval[a,b]) (\x. g x * f x) =
18453                u * integral (interval[a,c]) f +
18454                v * integral (interval[c,b]) f)
18455Proof
18456  REPEAT GEN_TAC THEN
18457  DISCH_THEN(MP_TAC o MATCH_MP SECOND_MEAN_VALUE_THEOREM_GEN_FULL) THEN
18458  DISCH_THEN (X_CHOOSE_TAC ``c:real``) THEN EXISTS_TAC ``c:real`` THEN
18459    POP_ASSUM MP_TAC THEN REPEAT STRIP_TAC THEN ASM_SIMP_TAC std_ss [] THEN
18460  FIRST_X_ASSUM(SUBST1_TAC o MATCH_MP INTEGRAL_UNIQUE) THEN REWRITE_TAC[]
18461QED
18462
18463Theorem SECOND_MEAN_VALUE_THEOREM_BONNET_FULL:
18464   !f:real->real g a b.
18465        ~(interval[a,b] = {}) /\ f integrable_on interval [a,b] /\
18466        (!x. x IN interval[a,b] ==> &0 <= g x) /\
18467        (!x y. x IN interval[a,b] /\ y IN interval[a,b] /\ x <= y
18468               ==> g x <= g y)
18469        ==> ?c. c IN interval [a,b] /\
18470                ((\x. g x * f x) has_integral
18471                 (g(b) * integral (interval[c,b]) f)) (interval[a,b])
18472Proof
18473  REPEAT STRIP_TAC THEN
18474  MP_TAC(ISPECL
18475   [``f:real->real``, ``g:real->real``, ``a:real``, ``b:real``,
18476    ``&0:real``, ``(g:real->real) b``] SECOND_MEAN_VALUE_THEOREM_GEN_FULL) THEN
18477  ASM_REWRITE_TAC[REAL_MUL_LZERO, REAL_ADD_LID] THEN
18478  DISCH_THEN MATCH_MP_TAC THEN REWRITE_TAC[IN_INTERVAL] THEN
18479  REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
18480  ASM_SIMP_TAC real_ss [IN_INTERVAL, REAL_LE_LT] THEN METIS_TAC [REAL_LT_TRANS]
18481QED
18482
18483Theorem SECOND_MEAN_VALUE_THEOREM_BONNET:
18484   !f:real->real g a b.
18485        ~(interval[a,b] = {}) /\ f integrable_on interval[a,b] /\
18486        (!x. x IN interval[a,b] ==> &0 <= g x) /\
18487        (!x y. x IN interval[a,b] /\ y IN interval[a,b] /\ x <= y
18488               ==> g x <= g y)
18489        ==> ?c. c IN interval [a,b] /\
18490               (integral (interval[a,b]) (\x. g x * f x) =
18491                g(b) * integral (interval[c,b]) f)
18492Proof
18493  REPEAT GEN_TAC THEN
18494  DISCH_THEN(MP_TAC o MATCH_MP SECOND_MEAN_VALUE_THEOREM_BONNET_FULL) THEN
18495  DISCH_THEN (X_CHOOSE_TAC ``c:real``) THEN EXISTS_TAC ``c:real`` THEN
18496    POP_ASSUM MP_TAC THEN REPEAT STRIP_TAC THEN ASM_SIMP_TAC std_ss [] THEN
18497  FIRST_X_ASSUM(SUBST1_TAC o MATCH_MP INTEGRAL_UNIQUE) THEN REWRITE_TAC[]
18498QED
18499
18500Theorem INTEGRABLE_INCREASING_PRODUCT:
18501   !f:real->real g a b.
18502        f integrable_on interval[a,b] /\
18503        (!x y. x IN interval[a,b] /\ y IN interval[a,b] /\ x <= y
18504               ==> g(x) <= g(y))
18505        ==> (\x. g(x) * f(x)) integrable_on interval[a,b]
18506Proof
18507  REPEAT STRIP_TAC THEN ASM_CASES_TAC ``interval[a:real,b] = {}`` THEN
18508  ASM_REWRITE_TAC[INTEGRABLE_ON_EMPTY] THEN
18509  MP_TAC(ISPECL [``\x. ((f:real->real) x)``,
18510                 ``g:real->real``, ``a:real``, ``b:real``]
18511    SECOND_MEAN_VALUE_THEOREM_FULL) THEN ASM_REWRITE_TAC[] THEN
18512  KNOW_TAC ``(\x. (f:real->real) x) integrable_on interval [(a,b)]`` THENL
18513   [RULE_ASSUM_TAC(ONCE_REWRITE_RULE[INTEGRABLE_COMPONENTWISE]) THEN
18514    ASM_SIMP_TAC std_ss [],
18515    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
18516    REWRITE_TAC[integrable_on] THEN MESON_TAC[]]
18517QED
18518
18519Theorem lemma[local]:
18520     !f:real->real g B.
18521          f integrable_on univ(:real) /\
18522          (!x y. x <= y ==> g x <= g y) /\
18523          (!x. abs(g x) <= B)
18524           ==> (\x. g x * f x) integrable_on univ(:real)
18525Proof
18526    REPEAT GEN_TAC THEN ONCE_REWRITE_TAC[INTEGRABLE_ALT_SUBSET] THEN
18527    SIMP_TAC std_ss [IN_UNIV, ETA_AX] THEN STRIP_TAC THEN
18528    MATCH_MP_TAC(TAUT `a /\ (a ==> b) ==> a /\ b`) THEN CONJ_TAC THENL
18529     [REPEAT GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_INCREASING_PRODUCT THEN
18530      ASM_SIMP_TAC std_ss [],
18531      DISCH_TAC] THEN
18532    X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
18533    UNDISCH_TAC ``!e. 0 < e ==>
18534        ?B. 0 < B /\
18535          !a b c d.
18536            ball (0,B) SUBSET interval [(a,b)] /\
18537            interval [(a,b)] SUBSET interval [(c,d)] ==>
18538            abs (integral (interval [(a,b)]) f -
18539                 integral (interval [(c,d)]) f) < e`` THEN DISCH_TAC THEN
18540    FIRST_X_ASSUM(MP_TAC o SPEC ``e / (&8 * abs B + &8:real)``) THEN
18541    ASM_SIMP_TAC real_ss [REAL_LT_DIV, REAL_ARITH ``&0 < &8 * abs B + &8:real``] THEN
18542    DISCH_THEN (X_CHOOSE_TAC ``C:real``) THEN EXISTS_TAC ``C:real`` THEN
18543    POP_ASSUM MP_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
18544    SUBGOAL_THEN ``~(ball(0:real,C) = {})`` ASSUME_TAC THENL
18545     [ASM_REWRITE_TAC[BALL_EQ_EMPTY, REAL_NOT_LE], ALL_TAC] THEN
18546    MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``, ``c:real``, ``d:real``] THEN
18547    STRIP_TAC THEN SUBGOAL_THEN
18548     ``~(interval[a:real,b] = {}) /\ ~(interval[c:real,d] = {})``
18549    MP_TAC THENL [ASM_SET_TAC[], ALL_TAC] THEN
18550    SIMP_TAC std_ss [GSYM INTERVAL_EQ_EMPTY, REAL_NOT_LT] THEN STRIP_TAC THEN
18551    UNDISCH_TAC ``interval [(a,b)] SUBSET interval [(c,d)]`` THEN DISCH_TAC THEN
18552    FIRST_ASSUM(MP_TAC o REWRITE_RULE [SUBSET_INTERVAL]) THEN
18553    ASM_REWRITE_TAC[GSYM REAL_NOT_LE] THEN STRIP_TAC THEN
18554    MP_TAC(ISPECL [``\x. (g:real->real) x * (f:real->real) x``,
18555                   ``c:real``, ``b:real``, ``a:real``] INTEGRAL_COMBINE) THEN
18556    MP_TAC(ISPECL [``\x. (g:real->real) x * (f:real->real) x``,
18557                   ``c:real``, ``d:real``, ``b:real``] INTEGRAL_COMBINE) THEN
18558    ASM_REWRITE_TAC[] THEN
18559    KNOW_TAC ``c <= b:real`` THENL
18560     [POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
18561      POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
18562      POP_ASSUM MP_TAC THEN REAL_ARITH_TAC,
18563      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
18564      DISCH_THEN(SUBST1_TAC o SYM)] THEN
18565    DISCH_THEN(SUBST1_TAC o SYM) THEN
18566    REWRITE_TAC[REAL_NOT_LE, REAL_ARITH
18567     ``abs(ab - ((ca + ab) + bd):real) = abs(ca + bd)``] THEN
18568    MP_TAC(ISPECL[``f:real->real``, ``g:real->real``, ``c:real``, ``a:real``]
18569          SECOND_MEAN_VALUE_THEOREM) THEN
18570    ASM_SIMP_TAC std_ss [GSYM INTERVAL_EQ_EMPTY, REAL_NOT_LT] THEN
18571    DISCH_THEN(X_CHOOSE_THEN ``u:real`` STRIP_ASSUME_TAC) THEN
18572    MP_TAC(ISPECL[``f:real->real``, ``g:real->real``, ``b:real``, ``d:real``]
18573          SECOND_MEAN_VALUE_THEOREM) THEN
18574    ASM_SIMP_TAC std_ss [GSYM INTERVAL_EQ_EMPTY, REAL_NOT_LT] THEN
18575    DISCH_THEN(X_CHOOSE_THEN ``v:real`` STRIP_ASSUME_TAC) THEN
18576    ASM_REWRITE_TAC[] THEN
18577    SUBGOAL_THEN
18578     ``!x y. y <= a
18579            ==> abs(integral (interval[x,y]) (f:real->real))
18580                < e / (&4 * abs B + &4)``
18581     ASSUME_TAC
18582    THENL
18583     [REPEAT STRIP_TAC THEN
18584      ASM_CASES_TAC ``x <= y:real`` THENL
18585       [FIRST_X_ASSUM(fn th =>
18586         MP_TAC(SPECL[``a:real``, ``b:real``, ``y:real``, ``b:real``] th) THEN
18587         MP_TAC(SPECL[``a:real``, ``b:real``, ``x:real``, ``b:real``] th)) THEN
18588        ASM_SIMP_TAC std_ss [SUBSET_INTERVAL, REAL_LE_REFL] THEN
18589        KNOW_TAC ``x <= a:real`` THENL [METIS_TAC [REAL_LE_TRANS],
18590         DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
18591        MP_TAC(ISPECL [``f:real->real``, ``x:real``, ``b:real``, ``y:real``]
18592          INTEGRAL_COMBINE) THEN
18593        ASM_REWRITE_TAC[] THEN KNOW_TAC ``y <= b:real`` THENL
18594         [METIS_TAC [REAL_LE_TRANS], DISCH_TAC THEN ASM_REWRITE_TAC [] THEN
18595          POP_ASSUM K_TAC THEN DISCH_THEN(SUBST1_TAC o SYM)] THEN
18596        MATCH_MP_TAC(REAL_ARITH
18597         ``(&2 * d = e:real)
18598          ==> abs(ab - (xy + yb)) < d
18599              ==> abs(ab - yb) < d
18600                  ==> abs(xy:real) < e``) THEN
18601        REWRITE_TAC [real_div, REAL_MUL_ASSOC] THEN
18602        REWRITE_TAC [REAL_ARITH ``inv (8 * abs B + 8) = inv (8 * (abs B + 1:real))``] THEN
18603        REWRITE_TAC [REAL_ARITH ``inv (4 * abs B + 4) = inv (4 * (abs B + 1:real))``] THEN
18604        KNOW_TAC ``abs B + 1 <> 0:real`` THENL
18605        [ONCE_REWRITE_TAC [EQ_SYM_EQ] THEN MATCH_MP_TAC REAL_LT_IMP_NE THEN
18606         REAL_ARITH_TAC, DISCH_TAC] THEN REWRITE_TAC [REAL_ARITH ``8 = 2 * 4:real``] THEN
18607        ASM_SIMP_TAC real_ss [REAL_INV_MUL] THEN REWRITE_TAC [REAL_MUL_ASSOC] THEN
18608        ONCE_REWRITE_TAC [REAL_ARITH ``2 * a * inv 2 * b * c = 2 * inv 2 * a * b * c:real``] THEN
18609        SIMP_TAC real_ss [REAL_MUL_RINV],
18610        SUBGOAL_THEN ``interval[x:real,y] = {}`` SUBST1_TAC THENL
18611         [REWRITE_TAC[GSYM INTERVAL_EQ_EMPTY] THEN FULL_SIMP_TAC std_ss [REAL_NOT_LE],
18612          REWRITE_TAC[INTEGRAL_EMPTY, ABS_0] THEN
18613          MATCH_MP_TAC REAL_LT_DIV THEN ASM_REWRITE_TAC [] THEN REAL_ARITH_TAC]],
18614      ALL_TAC] THEN
18615    SUBGOAL_THEN
18616     ``!x y. b <= x
18617            ==> abs(integral (interval[x,y]) (f:real->real))
18618                < e / (&4 * abs B + &4)``
18619     ASSUME_TAC
18620    THENL
18621     [REPEAT STRIP_TAC THEN
18622      ASM_CASES_TAC ``x <= y:real`` THENL
18623       [FIRST_X_ASSUM(fn th =>
18624         MP_TAC(SPECL[``a:real``, ``b:real``, ``a:real``, ``x:real``] th) THEN
18625         MP_TAC(SPECL[``a:real``, ``b:real``, ``a:real``, ``y:real``] th)) THEN
18626        ASM_SIMP_TAC std_ss [SUBSET_INTERVAL, REAL_LE_REFL] THEN
18627        KNOW_TAC ``b <= y:real`` THENL [METIS_TAC [REAL_LE_TRANS],
18628         DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
18629        MP_TAC(ISPECL [``f:real->real``, ``a:real``, ``y:real``, ``x:real``]
18630          INTEGRAL_COMBINE) THEN
18631        ASM_REWRITE_TAC[] THEN KNOW_TAC ``a <= x:real`` THENL
18632         [METIS_TAC [REAL_LE_TRANS], DISCH_TAC THEN ASM_REWRITE_TAC [] THEN
18633          POP_ASSUM K_TAC THEN DISCH_THEN(SUBST1_TAC o SYM)] THEN
18634        MATCH_MP_TAC(REAL_ARITH
18635         ``(&2 * d = e:real)
18636          ==> abs(ab - (ax + xy)) < d
18637              ==> abs(ab - ax) < d
18638                  ==> abs(xy:real) < e``) THEN
18639        REWRITE_TAC [real_div, REAL_MUL_ASSOC] THEN
18640        REWRITE_TAC [REAL_ARITH
18641        ``inv (8 * abs B + 8) = inv (8 * (abs B + 1:real))``] THEN
18642        REWRITE_TAC [REAL_ARITH
18643        ``inv (4 * abs B + 4) = inv (4 * (abs B + 1:real))``] THEN
18644        KNOW_TAC ``abs B + 1 <> 0:real`` THENL
18645        [ONCE_REWRITE_TAC [EQ_SYM_EQ] THEN MATCH_MP_TAC REAL_LT_IMP_NE THEN
18646         REAL_ARITH_TAC, DISCH_TAC] THEN REWRITE_TAC [REAL_ARITH ``8 = 2 * 4:real``] THEN
18647        ASM_SIMP_TAC real_ss [REAL_INV_MUL] THEN REWRITE_TAC [REAL_MUL_ASSOC] THEN
18648        ONCE_REWRITE_TAC [REAL_ARITH
18649        ``2 * a * inv 2 * b * c = 2 * inv 2 * a * b * c:real``] THEN
18650        SIMP_TAC real_ss [REAL_MUL_RINV],
18651        SUBGOAL_THEN ``interval[x:real,y] = {}`` SUBST1_TAC THENL
18652         [REWRITE_TAC[GSYM INTERVAL_EQ_EMPTY] THEN FULL_SIMP_TAC std_ss [REAL_NOT_LE],
18653          REWRITE_TAC[INTEGRAL_EMPTY, ABS_0] THEN
18654          MATCH_MP_TAC REAL_LT_DIV THEN ASM_REWRITE_TAC [] THEN REAL_ARITH_TAC]],
18655      ALL_TAC] THEN
18656    RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN
18657    MATCH_MP_TAC REAL_LET_TRANS THEN
18658    EXISTS_TAC ``&4 * B * e / (&4 * abs B + &4:real)`` THEN CONJ_TAC THENL
18659     [REWRITE_TAC [real_div, GSYM REAL_MUL_ASSOC] THEN
18660      MATCH_MP_TAC(REAL_ARITH
18661       ``(abs a <= e /\ abs b <= e) /\ (abs c <= e /\ abs d <= e)
18662        ==> abs((a + b) + (c + d):real) <= &4 * e:real``) THEN
18663      REWRITE_TAC[ABS_MUL] THEN CONJ_TAC THENL
18664       [CONJ_TAC THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
18665        ASM_REWRITE_TAC[ABS_POS] THEN
18666        MATCH_MP_TAC REAL_LT_IMP_LE THEN
18667        UNDISCH_TAC ``!x y. y <= a ==>
18668         abs (integral (interval [(x,y)]) f) < e / (4 * abs B + 4:real)`` THEN
18669        DISCH_TAC THEN REWRITE_TAC [GSYM real_div] THEN
18670        FIRST_ASSUM MATCH_MP_TAC THEN ASM_SIMP_TAC real_ss [],
18671        CONJ_TAC THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
18672        ASM_REWRITE_TAC[ABS_POS] THEN
18673        MATCH_MP_TAC REAL_LT_IMP_LE THEN REWRITE_TAC [GSYM real_div] THEN
18674        FIRST_ASSUM MATCH_MP_TAC THEN ASM_SIMP_TAC real_ss []],
18675      REWRITE_TAC [real_div] THEN
18676      REWRITE_TAC[REAL_ARITH
18677       ``&4 * B * e * y < e <=> e * ((&4 * B) * y) < e * &1:real``] THEN
18678      REWRITE_TAC [GSYM real_div] THEN
18679      ASM_SIMP_TAC real_ss [REAL_LT_LMUL, REAL_LT_LDIV_EQ,
18680                   REAL_ARITH ``&0 < &4 * abs B + &4:real``] THEN
18681      REAL_ARITH_TAC]
18682QED
18683
18684Theorem INTEGRABLE_INCREASING_PRODUCT_UNIV:
18685   !f:real->real g B.
18686        f integrable_on univ(:real) /\
18687        (!x y. x <= y ==> g x <= g y) /\
18688        (!x. abs(g x) <= B)
18689         ==> (\x. g x * f x) integrable_on univ(:real)
18690Proof
18691  REWRITE_TAC [lemma]
18692QED
18693
18694Theorem INTEGRABLE_INCREASING:
18695   !f:real->real a b.
18696        (!x y i. x IN interval[a,b] /\ y IN interval[a,b] /\
18697                 x <= y ==> f(x) <= f(y))
18698        ==> f integrable_on interval[a,b]
18699Proof
18700  REPEAT STRIP_TAC THEN
18701  ONCE_REWRITE_TAC[METIS [ETA_AX, REAL_MUL_RID]
18702   ``(f:real->real) = (\x. f x * (\x. 1) x)``] THEN
18703  MATCH_MP_TAC INTEGRABLE_INCREASING_PRODUCT THEN
18704  ASM_SIMP_TAC std_ss [INTEGRABLE_CONST]
18705QED
18706
18707Theorem INTEGRABLE_DECREASING_PRODUCT:
18708   !f:real->real g a b.
18709        f integrable_on interval[a,b] /\
18710        (!x y. x IN interval[a,b] /\ y IN interval[a,b] /\ x <= y
18711               ==> g(y) <= g(x))
18712        ==> (\x. g(x) * f(x)) integrable_on interval[a,b]
18713Proof
18714  REPEAT STRIP_TAC THEN
18715  ONCE_REWRITE_TAC[REAL_ARITH ``x * y:real = -(-x * y)``] THEN
18716  ONCE_REWRITE_TAC [METIS [] ``(\x. -(-g x * f x)) =
18717             (\x. -(\x. (-(g:real->real) x * f x)) x)``] THEN
18718  MATCH_MP_TAC INTEGRABLE_NEG THEN
18719  ONCE_REWRITE_TAC [METIS [] ``(\x. -g x * f x) =
18720          (\x. (\x. -(g:real->real) x) x * f x)``] THEN
18721  MATCH_MP_TAC INTEGRABLE_INCREASING_PRODUCT THEN
18722  ASM_SIMP_TAC real_ss [REAL_LE_NEG2]
18723QED
18724
18725Theorem INTEGRABLE_DECREASING_PRODUCT_UNIV:
18726   !f:real->real g B.
18727        f integrable_on univ(:real) /\
18728        (!x y. x <= y ==> g y <= g x) /\
18729        (!x. abs(g x) <= B)
18730         ==> (\x. g x * f x) integrable_on univ(:real)
18731Proof
18732  REPEAT STRIP_TAC THEN
18733  ONCE_REWRITE_TAC[REAL_ARITH ``x * y:real = -(-x * y)``] THEN
18734  ONCE_REWRITE_TAC [METIS [] ``(\x. -(-g x * f x)) =
18735             (\x. -(\x. (-(g:real->real) x * f x)) x)``] THEN
18736  MATCH_MP_TAC INTEGRABLE_NEG THEN
18737  ONCE_REWRITE_TAC [METIS [] ``(\x. -g x * f x) =
18738          (\x. (\x. -(g:real->real) x) x * f x)``] THEN
18739  MATCH_MP_TAC INTEGRABLE_INCREASING_PRODUCT_UNIV THEN
18740  EXISTS_TAC ``B:real`` THEN ASM_SIMP_TAC real_ss [REAL_LE_NEG2, ABS_NEG]
18741QED
18742
18743Theorem INTEGRABLE_DECREASING:
18744   !f:real->real a b.
18745        (!x y i. x IN interval[a,b] /\ y IN interval[a,b] /\
18746                 x <= y ==> f(y) <= f(x))
18747        ==> f integrable_on interval[a,b]
18748Proof
18749  REPEAT STRIP_TAC THEN GEN_REWR_TAC LAND_CONV [GSYM ETA_AX] THEN
18750  GEN_REWR_TAC (LAND_CONV o BINDER_CONV) [GSYM REAL_NEG_NEG] THEN
18751  ONCE_REWRITE_TAC [METIS [] ``(\x. --(f:real->real) x) = (\x. -((\x. -f x) x))``] THEN
18752  MATCH_MP_TAC INTEGRABLE_NEG THEN MATCH_MP_TAC INTEGRABLE_INCREASING THEN
18753  ASM_SIMP_TAC std_ss [REAL_LE_NEG2]
18754QED
18755
18756(* ------------------------------------------------------------------------- *)
18757(* Bounded variation and variation function, for real->real functions.       *)
18758(* ------------------------------------------------------------------------- *)
18759
18760val _ = set_fixity "has_bounded_variation_on" (Infix(NONASSOC, 450));
18761
18762Definition has_bounded_variation_on[nocompute]:
18763 (f:real->real) has_bounded_variation_on s <=>
18764        (\k. f(interval_upperbound k) - f(interval_lowerbound k))
18765        has_bounded_setvariation_on s
18766End
18767
18768Definition vector_variation[nocompute]:
18769 vector_variation s (f:real->real) =
18770   set_variation s (\k. f(interval_upperbound k) - f(interval_lowerbound k))
18771End
18772
18773Theorem HAS_BOUNDED_VARIATION_ON_EQ:
18774   !f g:real->real s.
18775        (!x. x IN s ==> (f x = g x)) /\ f has_bounded_variation_on s
18776        ==> g has_bounded_variation_on s
18777Proof
18778  REPEAT GEN_TAC THEN
18779  DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
18780  REWRITE_TAC[has_bounded_variation_on] THEN
18781  MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] HAS_BOUNDED_SETVARIATION_ON_EQ) THEN
18782  SIMP_TAC std_ss [INTERVAL_UPPERBOUND, INTERVAL_LOWERBOUND,
18783           GSYM INTERVAL_NE_EMPTY] THEN
18784  ASM_MESON_TAC[ENDS_IN_INTERVAL, SUBSET_DEF]
18785QED
18786
18787Theorem VECTOR_VARIATION_EQ:
18788   !f g:real->real s.
18789        (!x. x IN s ==> (f x = g x))
18790        ==> (vector_variation s f = vector_variation s g)
18791Proof
18792  REPEAT STRIP_TAC THEN REWRITE_TAC[vector_variation] THEN
18793  MATCH_MP_TAC SET_VARIATION_EQ THEN
18794  SIMP_TAC std_ss [INTERVAL_UPPERBOUND, INTERVAL_LOWERBOUND,
18795           GSYM INTERVAL_NE_EMPTY] THEN
18796  ASM_MESON_TAC[ENDS_IN_INTERVAL, SUBSET_DEF]
18797QED
18798
18799Theorem HAS_BOUNDED_VARIATION_ON_COMPONENTWISE:
18800   !f:real->real s.
18801        f has_bounded_variation_on s <=>
18802          (\x. f x) has_bounded_variation_on s
18803Proof
18804  REPEAT GEN_TAC THEN REWRITE_TAC[has_bounded_variation_on] THEN
18805  GEN_REWR_TAC LAND_CONV [HAS_BOUNDED_SETVARIATION_ON_COMPONENTWISE] THEN
18806  SIMP_TAC std_ss []
18807QED
18808
18809Theorem VARIATION_EQUAL_LEMMA:
18810   !ms ms'.
18811        (!s. (ms'(ms s) = s) /\ (ms(ms' s) = s)) /\
18812        (!d t. d division_of t
18813               ==> (IMAGE (IMAGE ms) d) division_of IMAGE ms t /\
18814                   (IMAGE (IMAGE ms') d) division_of IMAGE ms' t) /\
18815        (!a b. ~(interval[a,b] = {})
18816               ==> (IMAGE ms' (interval [a,b]) = interval[ms' a,ms' b]) \/
18817                   (IMAGE ms' (interval [a,b]) = interval[ms' b,ms' a]))
18818   ==> (!f:real->real s.
18819            (\x. f(ms' x)) has_bounded_variation_on (IMAGE ms s) <=>
18820            f has_bounded_variation_on s) /\
18821       (!f:real->real s.
18822            vector_variation (IMAGE ms s) (\x. f(ms' x)) =
18823            vector_variation s f)
18824Proof
18825  REPEAT GEN_TAC THEN STRIP_TAC THEN
18826  REWRITE_TAC[has_bounded_variation_on, vector_variation] THEN
18827  SIMP_TAC std_ss [GSYM FORALL_AND_THM] THEN X_GEN_TAC ``f:real->real`` THEN
18828  MP_TAC(ISPECL
18829   [``\f k. (f:(real->bool)->real) (IMAGE (ms':real->real) k)``,
18830    ``IMAGE (ms:real->real)``,
18831    ``IMAGE (ms':real->real)``]
18832  SETVARIATION_EQUAL_LEMMA) THEN
18833  KNOW_TAC ``(!(s :real -> bool).
18834    (IMAGE (ms' :real -> real) (IMAGE (ms :real -> real) s) = s) /\
18835    (IMAGE ms (IMAGE ms' s) = s)) /\
18836 (!(f :(real -> bool) -> real) (a :real) (b :real).
18837    interval [(a,b)] <> ({} :real -> bool) ==>
18838    ((\(f :(real -> bool) -> real) (k :real -> bool). f (IMAGE ms' k)) f
18839       (IMAGE ms (interval [(a,b)])) =
18840     f (interval [(a,b)])) /\
18841    ?(a' :real) (b' :real).
18842      interval [(a',b')] <> ({} :real -> bool) /\
18843      (IMAGE ms' (interval [(a,b)]) = interval [(a',b')])) /\
18844 (!(t :real -> bool) (u :real -> bool).
18845    t SUBSET u ==>
18846    IMAGE ms t SUBSET IMAGE ms u /\ IMAGE ms' t SUBSET IMAGE ms' u) /\
18847 (!(d :(real -> bool) -> bool) (t :real -> bool).
18848    d division_of t ==>
18849    IMAGE (IMAGE ms) d division_of IMAGE ms t /\
18850    IMAGE (IMAGE ms') d division_of IMAGE ms' t)`` THENL
18851   [ASM_SIMP_TAC std_ss [GSYM IMAGE_COMPOSE, o_DEF, IMAGE_ID, IMAGE_SUBSET] THEN
18852    MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``] THEN STRIP_TAC THEN
18853    FIRST_X_ASSUM(MP_TAC o SPECL [``a:real``, ``b:real``]) THEN
18854    ASM_REWRITE_TAC[] THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
18855    ASM_MESON_TAC[IMAGE_EQ_EMPTY],
18856    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
18857  SIMP_TAC std_ss [] THEN DISCH_TAC THEN
18858  POP_ASSUM (MP_TAC o SIMP_RULE std_ss [GSYM FORALL_AND_THM]) THEN
18859  DISCH_THEN(fn th =>
18860    MP_TAC(SPEC ``\k. (f:real->real) (interval_upperbound k) -
18861                     f (interval_lowerbound k)`` th)) THEN
18862  SIMP_TAC std_ss [] THEN DISCH_THEN(fn th => ONCE_REWRITE_TAC[GSYM th]) THEN
18863  SIMP_TAC std_ss [GSYM FORALL_AND_THM] THEN X_GEN_TAC ``s:real->bool`` THEN
18864  REWRITE_TAC[has_bounded_setvariation_on, set_variation] THEN
18865  CONJ_TAC THENL
18866   [AP_TERM_TAC THEN ABS_TAC THEN AP_TERM_TAC THEN ABS_TAC THEN
18867    AP_TERM_TAC THEN ABS_TAC THEN
18868    REWRITE_TAC[TAUT `((p ==> q) <=> (p ==> r)) <=> p ==> (q <=> r)`] THEN
18869    STRIP_TAC THEN AP_THM_TAC THEN AP_TERM_TAC,
18870    AP_TERM_TAC THEN SIMP_TAC std_ss [] THEN
18871    ONCE_REWRITE_TAC [METIS [] ``{sum d f |
18872     ?t. d division_of t /\ t SUBSET IMAGE ms s} =
18873                                 {(\d. sum d f) d |
18874     (\d. ?t. d division_of t /\ t SUBSET IMAGE ms s) d}``] THEN
18875    MATCH_MP_TAC(SET_RULE
18876     ``(!x. P x ==> (f x = g x)) ==> ({f x | P x} = {g x | P x})``) THEN
18877    SIMP_TAC std_ss [] THEN GEN_TAC THEN STRIP_TAC] THEN MATCH_MP_TAC SUM_EQ THEN
18878  SIMP_TAC std_ss [] THENL
18879  [UNDISCH_TAC ``d division_of t``, UNDISCH_TAC ``x division_of t``] THEN
18880  DISCH_TAC THEN FIRST_ASSUM(fn th =>
18881   SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION_NONEMPTY th]) THEN
18882  MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``] THEN STRIP_TAC THEN
18883  FIRST_X_ASSUM(MP_TAC o SPECL [``a:real``, ``b:real``]) THEN
18884  ASM_REWRITE_TAC[] THEN DISCH_THEN(DISJ_CASES_THEN MP_TAC) THEN
18885  DISCH_THEN(MP_TAC o MATCH_MP (SET_RULE
18886   ``(IMAGE f s = s') ==> ~(s = {}) ==> (IMAGE f s = s') /\ ~(s' = {})``)) THEN
18887  ASM_REWRITE_TAC[] THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
18888  RULE_ASSUM_TAC(REWRITE_RULE[INTERVAL_NE_EMPTY]) THEN
18889  ASM_SIMP_TAC std_ss [INTERVAL_UPPERBOUND, INTERVAL_LOWERBOUND] THEN
18890  REAL_ARITH_TAC
18891QED
18892
18893Theorem HAS_BOUNDED_VARIATION_COMPARISON:
18894   !f:real->real g:real->real s.
18895        f has_bounded_variation_on s /\
18896        (!x y. x IN s /\ y IN s /\ x < y
18897               ==> dist(g x,g y) <= dist(f x,f y))
18898        ==> g has_bounded_variation_on s
18899Proof
18900  REPEAT GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
18901  REWRITE_TAC[has_bounded_variation_on] THEN
18902  MATCH_MP_TAC(ONCE_REWRITE_RULE[IMP_CONJ_ALT]
18903   HAS_BOUNDED_SETVARIATION_COMPARISON) THEN
18904  REPEAT STRIP_TAC THEN SIMP_TAC std_ss [GSYM dist] THEN
18905  SUBGOAL_THEN
18906   ``!x y. x IN s /\ y IN s
18907          ==> dist((g:real->real) x,g y)
18908              <= dist((f:real->real) x,f y)``
18909  MATCH_MP_TAC THENL
18910   [KNOW_TAC ``!x y. (\x y:real. x IN s /\ y IN s ==> dist (g x,g y) <= dist (f x,f y)) x y`` THENL
18911    [ALL_TAC, METIS_TAC []] THEN
18912    MATCH_MP_TAC REAL_WLOG_LT THEN
18913    ASM_SIMP_TAC std_ss [DIST_REFL, REAL_LE_REFL] THEN
18914    MESON_TAC[DIST_SYM],
18915    ASM_SIMP_TAC std_ss [INTERVAL_LOWERBOUND_NONEMPTY,
18916                         INTERVAL_UPPERBOUND_NONEMPTY] THEN
18917    ASM_MESON_TAC[ENDS_IN_INTERVAL, SUBSET_DEF]]
18918QED
18919
18920Theorem VECTOR_VARIATION_COMPARISON:
18921   !f:real->real g:real->real s.
18922        f has_bounded_variation_on s /\
18923        (!x y. x IN s /\ y IN s /\ x < y
18924               ==> dist(g x,g y) <= dist(f x,f y))
18925        ==> vector_variation s g <= vector_variation s f
18926Proof
18927  REPEAT STRIP_TAC THEN
18928  REWRITE_TAC[vector_variation] THEN
18929  MATCH_MP_TAC SET_VARIATION_COMPARISON THEN
18930  ASM_REWRITE_TAC[GSYM has_bounded_variation_on] THEN
18931  REPEAT STRIP_TAC THEN SIMP_TAC std_ss [GSYM dist] THEN
18932  SUBGOAL_THEN
18933   ``!x y. x IN s /\ y IN s
18934          ==> dist((g:real->real) x,g y)
18935              <= dist((f:real->real) x,f y)``
18936  MATCH_MP_TAC THENL
18937   [KNOW_TAC ``!x y. (\x y:real. x IN s /\ y IN s ==> dist (g x,g y) <= dist (f x,f y)) x y`` THENL
18938    [ALL_TAC, METIS_TAC []] THEN
18939    MATCH_MP_TAC REAL_WLOG_LT THEN
18940    ASM_SIMP_TAC std_ss [DIST_REFL, REAL_LE_REFL] THEN
18941    MESON_TAC[DIST_SYM],
18942    ASM_SIMP_TAC std_ss [INTERVAL_LOWERBOUND_NONEMPTY,
18943                         INTERVAL_UPPERBOUND_NONEMPTY] THEN
18944    ASM_MESON_TAC[ENDS_IN_INTERVAL, SUBSET_DEF]]
18945QED
18946
18947Theorem VECTOR_VARIATION_ABS:
18948   !f:real->real s.
18949        (\x. (f x)) has_bounded_variation_on s
18950        ==> vector_variation s (\x. (abs(f x)))
18951            <= vector_variation s (\x. (f x))
18952Proof
18953  REPEAT STRIP_TAC THEN
18954  MATCH_MP_TAC VECTOR_VARIATION_COMPARISON THEN
18955  ASM_SIMP_TAC std_ss [dist] THEN REAL_ARITH_TAC
18956QED
18957
18958Theorem HAS_BOUNDED_VARIATION_ON_SUBSET:
18959   !f:real->real s t.
18960        f has_bounded_variation_on s /\ t SUBSET s
18961        ==> f has_bounded_variation_on t
18962Proof
18963  REWRITE_TAC[HAS_BOUNDED_SETVARIATION_ON_SUBSET, has_bounded_variation_on]
18964QED
18965
18966Theorem HAS_BOUNDED_VARIATION_ON_CONST:
18967   !s c:real. (\x. c) has_bounded_variation_on s
18968Proof
18969  REWRITE_TAC[has_bounded_variation_on, REAL_SUB_REFL,
18970              HAS_BOUNDED_SETVARIATION_ON_0]
18971QED
18972
18973Theorem VECTOR_VARIATION_CONST:
18974   !s c:real. vector_variation s (\x. c) = &0
18975Proof
18976  REWRITE_TAC[vector_variation, REAL_SUB_REFL, SET_VARIATION_0]
18977QED
18978
18979Theorem HAS_BOUNDED_VARIATION_ON_CMUL:
18980   !f:real->real c s.
18981        f has_bounded_variation_on s
18982        ==> (\x. c * f x) has_bounded_variation_on s
18983Proof
18984  REPEAT GEN_TAC THEN REWRITE_TAC[has_bounded_variation_on] THEN
18985  SIMP_TAC std_ss [GSYM REAL_SUB_LDISTRIB, HAS_BOUNDED_SETVARIATION_ON_CMUL]
18986QED
18987
18988Theorem HAS_BOUNDED_VARIATION_ON_NEG:
18989   !f:real->real s.
18990        f has_bounded_variation_on s
18991        ==> (\x. -f x) has_bounded_variation_on s
18992Proof
18993  REPEAT GEN_TAC THEN REWRITE_TAC[has_bounded_variation_on] THEN
18994  SIMP_TAC std_ss [REAL_ARITH ``-a - -b:real = -(a - b)``,
18995              HAS_BOUNDED_SETVARIATION_ON_NEG]
18996QED
18997
18998Theorem HAS_BOUNDED_VARIATION_ON_ADD:
18999   !f g:real->real s.
19000        f has_bounded_variation_on s /\ g has_bounded_variation_on s
19001        ==> (\x. f x + g x) has_bounded_variation_on s
19002Proof
19003  REPEAT GEN_TAC THEN REWRITE_TAC[has_bounded_variation_on] THEN
19004  SIMP_TAC std_ss [REAL_ARITH ``(f + g) - (f' + g'):real = (f - f') + (g - g')``,
19005              HAS_BOUNDED_SETVARIATION_ON_ADD]
19006QED
19007
19008Theorem HAS_BOUNDED_VARIATION_ON_SUB:
19009   !f g:real->real s.
19010        f has_bounded_variation_on s /\ g has_bounded_variation_on s
19011        ==> (\x. f x - g x) has_bounded_variation_on s
19012Proof
19013  REPEAT GEN_TAC THEN REWRITE_TAC[has_bounded_variation_on] THEN
19014  SIMP_TAC std_ss [REAL_ARITH ``(f - g) - (f' - g'):real = (f - f') - (g - g')``,
19015              HAS_BOUNDED_SETVARIATION_ON_SUB]
19016QED
19017
19018Theorem HAS_BOUNDED_VARIATION_ON_COMPOSE_LINEAR:
19019   !f:real->real g:real->real s.
19020        f has_bounded_variation_on s /\ linear g
19021        ==> (g o f) has_bounded_variation_on s
19022Proof
19023  REPEAT GEN_TAC THEN REWRITE_TAC[has_bounded_variation_on] THEN
19024  SIMP_TAC std_ss [o_THM, GSYM LINEAR_SUB] THEN
19025  DISCH_THEN(MP_TAC o MATCH_MP HAS_BOUNDED_SETVARIATION_ON_COMPOSE_LINEAR) THEN
19026  SIMP_TAC std_ss [o_DEF]
19027QED
19028
19029Theorem HAS_BOUNDED_VARIATION_ON_NULL:
19030   !f:real->real s.
19031        (content s = &0) /\ bounded s ==> f has_bounded_variation_on s
19032Proof
19033  REPEAT STRIP_TAC THEN REWRITE_TAC[has_bounded_variation_on] THEN
19034  MATCH_MP_TAC HAS_BOUNDED_SETVARIATION_ON_NULL THEN
19035  ASM_SIMP_TAC std_ss [INTERVAL_BOUNDS_NULL, REAL_SUB_REFL]
19036QED
19037
19038Theorem HAS_BOUNDED_VARIATION_ON_EMPTY:
19039   !f:real->real. f has_bounded_variation_on {}
19040Proof
19041  MESON_TAC[CONTENT_EMPTY, BOUNDED_EMPTY, HAS_BOUNDED_VARIATION_ON_NULL]
19042QED
19043
19044Theorem VECTOR_VARIATION_ON_NULL:
19045   !f s. (content s = &0) /\ bounded s ==> (vector_variation s f = &0)
19046Proof
19047  REPEAT STRIP_TAC THEN REWRITE_TAC[vector_variation] THEN
19048  MATCH_MP_TAC SET_VARIATION_ON_NULL THEN ASM_REWRITE_TAC[] THEN
19049  SIMP_TAC std_ss [INTERVAL_BOUNDS_NULL, REAL_SUB_REFL]
19050QED
19051
19052Theorem HAS_BOUNDED_VARIATION_ON_ABS:
19053   !f:real->real s.
19054        f has_bounded_variation_on s
19055        ==> (\x. (abs(f x))) has_bounded_variation_on s
19056Proof
19057  REWRITE_TAC[has_bounded_variation_on, has_bounded_setvariation_on] THEN
19058  REPEAT GEN_TAC THEN DISCH_THEN (X_CHOOSE_TAC ``B:real``) THEN
19059  EXISTS_TAC ``B:real`` THEN POP_ASSUM MP_TAC THEN
19060  DISCH_TAC THEN GEN_TAC THEN GEN_TAC THEN
19061  POP_ASSUM (MP_TAC o SPECL [``d:(real->bool)->bool``,``t:real->bool``]) THEN
19062  DISCH_THEN(fn th => STRIP_TAC THEN MP_TAC th) THEN ASM_SIMP_TAC std_ss [] THEN
19063  MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] REAL_LE_TRANS) THEN
19064  MATCH_MP_TAC SUM_LE THEN SIMP_TAC std_ss [] THEN
19065  CONJ_TAC THENL [ASM_MESON_TAC[DIVISION_OF_FINITE], REAL_ARITH_TAC]
19066QED
19067
19068Theorem HAS_BOUNDED_VARIATION_ON_MAX :
19069    !f g s. f has_bounded_variation_on s /\ g has_bounded_variation_on s
19070           ==> (\x. (max ((f x)) ((g x))))
19071               has_bounded_variation_on s
19072Proof
19073  REPEAT STRIP_TAC THEN
19074  Know `!a b. max a b = inv(&2) * (a + b + abs(a - b:real))`
19075  >- (rpt GEN_TAC >> KILL_TAC \\
19076      REWRITE_TAC [max_def] >> ONCE_REWRITE_TAC [REAL_MUL_SYM] \\
19077      SIMP_TAC real_ss [GSYM real_div, REAL_EQ_RDIV_EQ] \\
19078      Cases_on `a <= b` >> rw [] >> ASM_REAL_ARITH_TAC) \\
19079  DISCH_TAC THEN
19080  FIRST_X_ASSUM (fn th => REWRITE_TAC [th]) THEN
19081  ONCE_REWRITE_TAC [METIS [] ``(\x. inv 2 * (f x + g x + abs (f x - g x:real))) =
19082                          (\x. inv 2 * (\x. (f x + g x + abs (f x - g x))) x)``] THEN
19083  MATCH_MP_TAC HAS_BOUNDED_VARIATION_ON_CMUL THEN
19084  ONCE_REWRITE_TAC [METIS [REAL_ADD_ASSOC] ``(\x. f x + g x + abs (f x - g x:real)) =
19085                          (\x. f x + (\x. g x + abs (f x - g x)) x)``] THEN
19086  MATCH_MP_TAC HAS_BOUNDED_VARIATION_ON_ADD THEN ASM_REWRITE_TAC[] THEN
19087   ONCE_REWRITE_TAC [METIS [REAL_ADD_ASSOC] ``(\x. g x + abs (f x - g x:real)) =
19088                          (\x. g x + (\x. abs (f x - g x)) x)``] THEN
19089  MATCH_MP_TAC HAS_BOUNDED_VARIATION_ON_ADD THEN ASM_REWRITE_TAC[] THEN
19090  ONCE_REWRITE_TAC [METIS [] ``(\x. abs (f x - g x:real)) =
19091                          (\x. abs ((\x. (f x - g x)) x))``] THEN
19092  MATCH_MP_TAC HAS_BOUNDED_VARIATION_ON_ABS THEN
19093  MATCH_MP_TAC HAS_BOUNDED_VARIATION_ON_SUB THEN ASM_REWRITE_TAC[]
19094QED
19095
19096Theorem HAS_BOUNDED_VARIATION_ON_MIN :
19097    !f g s. f has_bounded_variation_on s /\ g has_bounded_variation_on s
19098           ==> (\x. (min ((f x)) ((g x)))) has_bounded_variation_on s
19099Proof
19100  REPEAT STRIP_TAC THEN
19101  Know `!a b. min a b = inv(&2) * ((a + b) - abs(a - b:real))`
19102  >- (rpt GEN_TAC >> KILL_TAC \\
19103      REWRITE_TAC [min_def] >> ONCE_REWRITE_TAC [REAL_MUL_SYM] \\
19104      SIMP_TAC real_ss [GSYM real_div, REAL_EQ_RDIV_EQ] \\
19105      Cases_on `a <= b` >> rw [] >> ASM_REAL_ARITH_TAC) \\
19106  DISCH_TAC THEN
19107  FIRST_X_ASSUM (fn th => REWRITE_TAC [th]) THEN
19108  ONCE_REWRITE_TAC [METIS [] ``(\x. inv 2 * (f x + g x - abs (f x - g x:real))) =
19109                          (\x. inv 2 * (\x. (f x + g x - abs (f x - g x))) x)``] THEN
19110  MATCH_MP_TAC HAS_BOUNDED_VARIATION_ON_CMUL THEN
19111  ONCE_REWRITE_TAC [METIS [REAL_ADD_ASSOC, real_sub]
19112   ``(\x. f x + g x - abs (f x - g x:real)) =
19113     (\x. (\x. f x + g x) x - (\x. abs (f x - g x)) x)``] THEN
19114  MATCH_MP_TAC HAS_BOUNDED_VARIATION_ON_SUB THEN
19115  ASM_SIMP_TAC std_ss [HAS_BOUNDED_VARIATION_ON_ADD] THEN
19116  ONCE_REWRITE_TAC [METIS [] ``(\x. abs (f x - g x:real)) =
19117                          (\x. abs ((\x. (f x - g x)) x))``] THEN
19118  MATCH_MP_TAC HAS_BOUNDED_VARIATION_ON_ABS THEN
19119  MATCH_MP_TAC HAS_BOUNDED_VARIATION_ON_SUB THEN ASM_REWRITE_TAC[]
19120QED
19121
19122Theorem HAS_BOUNDED_VARIATION_ON_IMP_BOUNDED_ON_SUBINTERVALS:
19123   !f:real->real s.
19124        f has_bounded_variation_on s
19125        ==> bounded { f(d) - f(c) | interval[c,d] SUBSET s /\
19126                                    ~(interval[c,d] = {})}
19127Proof
19128  REPEAT GEN_TAC THEN REWRITE_TAC[has_bounded_variation_on] THEN
19129  DISCH_THEN(MP_TAC o MATCH_MP
19130   HAS_BOUNDED_SETVARIATION_ON_IMP_BOUNDED_ON_SUBINTERVALS) THEN
19131  MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] BOUNDED_SUBSET) THEN
19132  REWRITE_TAC [SUBSET_DEF] THEN SIMP_TAC std_ss [FORALL_IN_GSPEC] THEN
19133  MAP_EVERY X_GEN_TAC [``d:real``, ``c:real``] THEN
19134  FULL_SIMP_TAC std_ss [GSYM INTERVAL_EQ_EMPTY, REAL_NOT_LT] THEN STRIP_TAC THEN
19135  SIMP_TAC std_ss [GSPECIFICATION, EXISTS_PROD] THEN
19136  MAP_EVERY EXISTS_TAC [``c:real``, ``d:real``] THEN
19137  ASM_SIMP_TAC std_ss [INTERVAL_UPPERBOUND, INTERVAL_LOWERBOUND]
19138QED
19139
19140Theorem HAS_BOUNDED_VARIATION_ON_IMP_BOUNDED:
19141   !f:real->real s.
19142        f has_bounded_variation_on s /\ is_interval s ==> bounded (IMAGE f s)
19143Proof
19144  REPEAT STRIP_TAC THEN ASM_CASES_TAC ``s:real->bool = {}`` THEN
19145  ASM_SIMP_TAC std_ss [IMAGE_EMPTY, IMAGE_INSERT, BOUNDED_EMPTY] THEN
19146  FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [GSYM MEMBER_NOT_EMPTY]) THEN
19147  DISCH_THEN(X_CHOOSE_TAC ``a:real``) THEN FIRST_X_ASSUM(MP_TAC o MATCH_MP
19148    HAS_BOUNDED_VARIATION_ON_IMP_BOUNDED_ON_SUBINTERVALS) THEN
19149  SIMP_TAC std_ss [bounded_def, FORALL_IN_GSPEC, FORALL_IN_IMAGE] THEN
19150  ASM_SIMP_TAC std_ss [INTERVAL_SUBSET_IS_INTERVAL, LEFT_IMP_EXISTS_THM,
19151               TAUT `(p \/ q) /\ ~p <=> ~p /\ q`] THEN
19152  X_GEN_TAC ``B:real`` THEN DISCH_TAC THEN
19153  EXISTS_TAC ``B + abs((f:real->real) a)`` THEN
19154  X_GEN_TAC ``b:real`` THEN DISCH_TAC THEN
19155  KNOW_TAC ``((!d c. ~(interval [c,d] = {}) \/ ~(interval [d,c] = {})) /\
19156  (!d c. c IN s /\ d IN s ==> abs ((f:real->real) d - f c) <= B <=>
19157         d IN s /\ c IN s ==> abs (f c - f d) <= B)
19158  ==> (!d c. c IN s /\ d IN s ==> abs (f d - f c) <= B))`` THENL
19159  [METIS_TAC [], ALL_TAC] THEN
19160  FULL_SIMP_TAC std_ss [INTERVAL_NE_EMPTY, REAL_LE_TOTAL] THEN
19161  SIMP_TAC std_ss [ABS_SUB, CONJ_SYM] THEN
19162  DISCH_THEN(MP_TAC o SPECL [``a:real``, ``b:real``]) THEN
19163  FULL_SIMP_TAC std_ss [] THEN REAL_ARITH_TAC
19164QED
19165
19166Theorem HAS_BOUNDED_VARIATION_ON_IMP_BOUNDED_ON_INTERVAL:
19167   !f:real->real a b.
19168        f has_bounded_variation_on interval[a,b]
19169        ==> bounded(IMAGE f (interval[a,b]))
19170Proof
19171  MESON_TAC[HAS_BOUNDED_VARIATION_ON_IMP_BOUNDED, IS_INTERVAL_INTERVAL]
19172QED
19173
19174Theorem HAS_BOUNDED_VARIATION_ON_MUL:
19175   !f g:real->real a b.
19176        f has_bounded_variation_on interval[a,b] /\
19177        g has_bounded_variation_on interval[a,b]
19178        ==> (\x. (f x) * g x) has_bounded_variation_on interval[a,b]
19179Proof
19180  REPEAT GEN_TAC THEN DISCH_TAC THEN
19181  SUBGOAL_THEN
19182    ``bounded(IMAGE (f:real->real) (interval[a,b])) /\
19183      bounded(IMAGE (g:real->real) (interval[a,b]))``
19184  MP_TAC THENL
19185   [ASM_SIMP_TAC std_ss [HAS_BOUNDED_VARIATION_ON_IMP_BOUNDED_ON_INTERVAL],
19186    SIMP_TAC std_ss [BOUNDED_POS_LT, FORALL_IN_IMAGE]] THEN
19187  DISCH_THEN(CONJUNCTS_THEN2
19188   (X_CHOOSE_THEN ``B1:real`` STRIP_ASSUME_TAC)
19189   (X_CHOOSE_THEN ``B2:real`` STRIP_ASSUME_TAC)) THEN
19190  FIRST_X_ASSUM(CONJUNCTS_THEN MP_TAC) THEN
19191  REWRITE_TAC[HAS_BOUNDED_SETVARIATION_ON_INTERVAL,
19192              has_bounded_variation_on] THEN
19193  DISCH_THEN(X_CHOOSE_THEN ``C2:real`` ASSUME_TAC) THEN
19194  DISCH_THEN(X_CHOOSE_THEN ``C1:real`` ASSUME_TAC) THEN
19195  EXISTS_TAC ``B1 * C2 + B2 * C1:real`` THEN
19196  X_GEN_TAC ``d:(real->bool)->bool`` THEN DISCH_TAC THEN
19197  FULL_SIMP_TAC std_ss [] THEN
19198  MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC
19199   ``B1 * sum d (\k. abs((g:real->real)(interval_upperbound k) -
19200                         g(interval_lowerbound k))) +
19201     B2 * sum d (\k. abs((f:real->real)(interval_upperbound k) -
19202                         f(interval_lowerbound k)))`` THEN
19203  CONJ_TAC THENL
19204   [ALL_TAC, MATCH_MP_TAC REAL_LE_ADD2 THEN ASM_SIMP_TAC std_ss [REAL_LE_LMUL]] THEN
19205  FIRST_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_FINITE) THEN
19206  ASM_SIMP_TAC std_ss [GSYM SUM_LMUL, GSYM SUM_ADD] THEN
19207  MATCH_MP_TAC SUM_LE THEN ASM_SIMP_TAC std_ss [] THEN
19208  UNDISCH_TAC ``d division_of interval [(a,b)]`` THEN DISCH_TAC THEN
19209  FIRST_ASSUM(fn th => SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION th]) THEN
19210  MAP_EVERY X_GEN_TAC [``u:real``, ``v:real``] THEN DISCH_TAC THEN
19211  ONCE_REWRITE_TAC[REAL_ARITH
19212   ``f' * g' - f * g:real = f' * (g' - g) + (f' - f) * g``] THEN
19213  MATCH_MP_TAC(REAL_ARITH
19214    ``abs x <= a /\ abs y <= b ==> abs(x + y) <= a + b:real``) THEN
19215  SIMP_TAC std_ss [ABS_MUL] THEN
19216  SUBGOAL_THEN ``~(interval[u:real,v] = {})`` MP_TAC THENL
19217   [ASM_MESON_TAC[division_of], ALL_TAC] THEN
19218  REWRITE_TAC[GSYM INTERVAL_EQ_EMPTY, REAL_NOT_LT] THEN DISCH_TAC THEN
19219  ASM_SIMP_TAC std_ss [INTERVAL_LOWERBOUND, INTERVAL_UPPERBOUND] THEN
19220  SUBGOAL_THEN ``interval[u:real,v] SUBSET interval[a,b]`` MP_TAC THENL
19221   [ASM_MESON_TAC[division_of], ALL_TAC] THEN
19222  ASM_SIMP_TAC std_ss [SUBSET_INTERVAL, GSYM REAL_NOT_LE] THEN
19223  STRIP_TAC THEN
19224  GEN_REWR_TAC (RAND_CONV o LAND_CONV) [REAL_MUL_SYM] THEN
19225  CONJ_TAC THEN MATCH_MP_TAC REAL_LE_RMUL_IMP THEN SIMP_TAC std_ss [ABS_POS] THEN
19226  MATCH_MP_TAC REAL_LT_IMP_LE THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
19227  REWRITE_TAC[IN_INTERVAL] THEN POP_ASSUM MP_TAC THEN
19228  POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN REAL_ARITH_TAC
19229QED
19230
19231Theorem VECTOR_VARIATION_POS_LE:
19232   !f:real->real s.
19233        f has_bounded_variation_on s ==> &0 <= vector_variation s f
19234Proof
19235  REWRITE_TAC[has_bounded_variation_on, vector_variation] THEN
19236  SIMP_TAC std_ss [SET_VARIATION_POS_LE]
19237QED
19238
19239Theorem VECTOR_VARIATION_GE_ABS_FUNCTION:
19240   !f:real->real s a b.
19241        f has_bounded_variation_on s /\ segment[a,b] SUBSET s
19242        ==> abs(f b - f a) <= vector_variation s f
19243Proof
19244  GEN_TAC THEN GEN_TAC THEN
19245  ONCE_REWRITE_TAC [METIS [] ``(!a b.
19246  f has_bounded_variation_on s /\ segment [(a,b)] SUBSET s ==>
19247  abs (f b - f a) <= vector_variation s f) =
19248             (!a b.
19249  (\a b. f has_bounded_variation_on s /\ segment [(a,b)] SUBSET s ==>
19250  abs (f b - f a) <= vector_variation s f) a b)``] THEN
19251  MATCH_MP_TAC REAL_WLOG_LE THEN CONJ_TAC THENL
19252   [MESON_TAC[SEGMENT_SYM, ABS_SUB], ALL_TAC] THEN
19253  SIMP_TAC std_ss [has_bounded_variation_on] THEN
19254  REPEAT STRIP_TAC THEN MP_TAC(ISPECL
19255  [``\k. (f:real->real)(interval_upperbound k) - f(interval_lowerbound k)``,
19256   ``s:real->bool``, ``x:real``, ``y:real``] SET_VARIATION_GE_FUNCTION) THEN
19257  ASM_SIMP_TAC std_ss [vector_variation, INTERVAL_NE_EMPTY] THEN
19258  ASM_SIMP_TAC std_ss [INTERVAL_UPPERBOUND, INTERVAL_LOWERBOUND] THEN
19259  METIS_TAC[SEGMENT]
19260QED
19261
19262Theorem VECTOR_VARIATION_GE_FUNCTION:
19263   !f s a b.
19264        f has_bounded_variation_on s /\ segment[a,b] SUBSET s
19265        ==> (f b) - (f a) <= vector_variation s f
19266Proof
19267  REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN
19268  EXISTS_TAC ``abs((f:real->real) b - f a)`` THEN
19269  ASM_SIMP_TAC std_ss [VECTOR_VARIATION_GE_ABS_FUNCTION] THEN
19270  SIMP_TAC std_ss [] THEN REAL_ARITH_TAC
19271QED
19272
19273Theorem CONVEX_CONTAINS_SEGMENT:
19274   !s. convex s <=> !a b. a IN s /\ b IN s ==> segment[a,b] SUBSET s
19275Proof
19276  SIMP_TAC std_ss [CONVEX_ALT, segment, SUBSET_DEF, GSPECIFICATION] THEN
19277  MESON_TAC[]
19278QED
19279
19280Theorem VECTOR_VARIATION_CONST_EQ:
19281   !f:real->real s.
19282        is_interval s /\ f has_bounded_variation_on s
19283        ==> ((vector_variation s f = &0) <=> ?c. !x. x IN s ==> (f x = c))
19284Proof
19285  REPEAT STRIP_TAC THEN EQ_TAC THENL
19286   [DISCH_TAC THEN REWRITE_TAC [SPECIFICATION] THEN
19287    REWRITE_TAC[METIS[]
19288     ``(?c. !x. P x ==> (f x = c)) <=> !a b. P a /\ P b ==> (f a = f b)``] THEN
19289    MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``] THEN STRIP_TAC THEN
19290    MP_TAC(ISPECL [``f:real->real``, ``s:real->bool``,
19291        ``a:real``, ``b:real``] VECTOR_VARIATION_GE_ABS_FUNCTION) THEN
19292    KNOW_TAC ``f has_bounded_variation_on s /\ segment [(a,b)] SUBSET s`` THENL
19293     [ASM_SIMP_TAC std_ss [] THEN `convex s` by METIS_TAC [IS_INTERVAL_CONVEX] THEN
19294      FULL_SIMP_TAC std_ss [CONVEX_CONTAINS_SEGMENT] THEN
19295      FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_SIMP_TAC std_ss [SPECIFICATION],
19296      DISCH_TAC THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC],
19297      ALL_TAC] THEN
19298    DISCH_THEN(X_CHOOSE_TAC ``c:real``) THEN
19299    MP_TAC(ISPECL [``f:real->real``, ``(\x. c):real->real``,
19300                   ``s:real->bool``] VECTOR_VARIATION_EQ) THEN
19301    ASM_SIMP_TAC std_ss [VECTOR_VARIATION_CONST]
19302QED
19303
19304Theorem VECTOR_VARIATION_MONOTONE:
19305   !f s t. f has_bounded_variation_on s /\ t SUBSET s
19306           ==> vector_variation t f <= vector_variation s f
19307Proof
19308  REWRITE_TAC[has_bounded_variation_on, vector_variation] THEN
19309  REWRITE_TAC[SET_VARIATION_MONOTONE]
19310QED
19311
19312Theorem VECTOR_VARIATION_NEG:
19313   !f:real->real s.
19314        vector_variation s (\x. -(f x)) = vector_variation s f
19315Proof
19316  REPEAT GEN_TAC THEN REWRITE_TAC[vector_variation, set_variation] THEN
19317  SIMP_TAC std_ss [REAL_ARITH ``abs(-x - -y:real) = abs(x - y)``]
19318QED
19319
19320Theorem VECTOR_VARIATION_TRIANGLE:
19321   !f g:real->real s.
19322        f has_bounded_variation_on s /\ g has_bounded_variation_on s
19323        ==> vector_variation s (\x. f x + g x)
19324              <= vector_variation s f + vector_variation s g
19325Proof
19326  REPEAT GEN_TAC THEN
19327  REWRITE_TAC[has_bounded_variation_on, vector_variation] THEN
19328  DISCH_THEN(MP_TAC o MATCH_MP SET_VARIATION_TRIANGLE) THEN
19329  SIMP_TAC std_ss [REAL_ARITH ``(a + b) - (c + d):real = (a - c) + (b - d)``]
19330QED
19331
19332Theorem HAS_BOUNDED_VARIATION_ON_SUM_AND_SUM_LE:
19333   (!f:'a->real->real s k.
19334        FINITE k /\
19335        (!i. i IN k ==> f i has_bounded_variation_on s)
19336        ==> (\x. sum k (\i. f i x)) has_bounded_variation_on s) /\
19337   (!f:'a->real->real s k.
19338        FINITE k /\
19339        (!i. i IN k ==> f i has_bounded_variation_on s)
19340        ==> vector_variation s (\x. sum k (\i. f i x))
19341            <= sum k (\i. vector_variation s (f i)))
19342Proof
19343  SIMP_TAC std_ss [GSYM FORALL_AND_THM, TAUT
19344   `(p ==> q) /\ (p ==> r) <=> p ==> q /\ r`] THEN
19345  GEN_TAC THEN GEN_TAC THEN REWRITE_TAC[IMP_CONJ] THEN
19346  ONCE_REWRITE_TAC [METIS []
19347   ``!k. ((!i. i IN k ==> f i has_bounded_variation_on s) ==>
19348  (\x. sum k (\i. f i x)) has_bounded_variation_on s /\
19349  vector_variation s (\x. sum k (\i. f i x)) <=
19350  sum k (\i. vector_variation s (f i))) =
19351    (\k. (!i. i IN k ==> f i has_bounded_variation_on s) ==>
19352  (\x. sum k (\i. f i x)) has_bounded_variation_on s /\
19353  vector_variation s (\x. sum k (\i. f i x)) <=
19354  sum k (\i. vector_variation s (f i))) k``] THEN
19355  MATCH_MP_TAC FINITE_INDUCT THEN BETA_TAC THEN
19356  SIMP_TAC std_ss [SUM_CLAUSES, FORALL_IN_INSERT] THEN
19357  SIMP_TAC std_ss [VECTOR_VARIATION_CONST, REAL_LE_REFL,
19358           HAS_BOUNDED_VARIATION_ON_CONST,
19359           HAS_BOUNDED_VARIATION_ON_ADD, ETA_AX] THEN
19360  REPEAT STRIP_TAC THENL
19361  [ONCE_REWRITE_TAC [METIS [] `` (\x. f e x + sum s' (\i. f i x)) =
19362                    (\x. (\x. f e x) x + (\x. sum s' (\i. f i x)) x)``] THEN
19363   MATCH_MP_TAC HAS_BOUNDED_VARIATION_ON_ADD THEN
19364   METIS_TAC [HAS_BOUNDED_VARIATION_ON_ADD, ETA_AX], ALL_TAC] THEN
19365  ONCE_REWRITE_TAC [METIS [] `` (\x. f e x + sum s' (\i. f i x)) =
19366                    (\x. (\x. f e x) x + (\x. sum s' (\i. f i x)) x)``] THEN
19367  W(MP_TAC o PART_MATCH (lhand o rand)
19368    VECTOR_VARIATION_TRIANGLE o lhand o snd) THEN
19369  ASM_SIMP_TAC std_ss [METIS [ETA_AX] ``(\x. (f:'a->real->real) e x) = f e``] THEN
19370  MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] REAL_LE_TRANS) THEN
19371  ASM_SIMP_TAC std_ss [REAL_LE_LADD]
19372QED
19373
19374Theorem HAS_BOUNDED_VARIATION_ON_SUM:
19375   (!f:'a->real->real s k.
19376        FINITE k /\
19377        (!i. i IN k ==> f i has_bounded_variation_on s)
19378        ==> (\x. sum k (\i. f i x)) has_bounded_variation_on s)
19379Proof
19380  REWRITE_TAC [HAS_BOUNDED_VARIATION_ON_SUM_AND_SUM_LE]
19381QED
19382
19383Theorem HAS_BOUNDED_VARIATION_SUM_LE:
19384   (!f:'a->real->real s k.
19385        FINITE k /\
19386        (!i. i IN k ==> f i has_bounded_variation_on s)
19387        ==> vector_variation s (\x. sum k (\i. f i x))
19388            <= sum k (\i. vector_variation s (f i)))
19389Proof
19390  REWRITE_TAC [HAS_BOUNDED_VARIATION_ON_SUM_AND_SUM_LE]
19391QED
19392
19393Theorem OPERATIVE_FUNCTION_ENDPOINT_DIFF :
19394    !f:real->real.
19395      operative (+) (\k. f (interval_upperbound k) - f (interval_lowerbound k))
19396Proof
19397  GEN_TAC THEN
19398  SIMP_TAC std_ss [operative, INTERVAL_BOUNDS_NULL, REAL_SUB_REFL] THEN
19399  REWRITE_TAC[NEUTRAL_REAL_ADD] THEN
19400  MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``, ``c:real``] THEN
19401  ASM_CASES_TAC ``interval[a:real,b] = {}`` THENL
19402   [ASM_REWRITE_TAC[INTER_EMPTY, INTERVAL_BOUNDS_EMPTY] THEN
19403    REAL_ARITH_TAC,
19404    ALL_TAC] THEN
19405  ASM_CASES_TAC ``interval[a,b] INTER {x | x <= c} = {}`` THENL
19406   [ASM_REWRITE_TAC[INTERVAL_BOUNDS_EMPTY, REAL_SUB_REFL] THEN
19407    SUBGOAL_THEN ``interval[a,b] INTER {x | x >= c} = interval[a,b]``
19408     (fn th => REWRITE_TAC[th, REAL_ADD_LID]) THEN
19409    FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
19410     ``(i INTER s = {}) ==> (s UNION t = UNIV) ==> (i INTER t = i)``)) THEN
19411    SIMP_TAC std_ss [EXTENSION, IN_UNIV, IN_UNION, GSPECIFICATION] THEN
19412    REAL_ARITH_TAC,
19413    ALL_TAC] THEN
19414  ASM_CASES_TAC ``interval[a,b] INTER {x | x >= c} = {}`` THENL
19415   [ASM_REWRITE_TAC[INTERVAL_BOUNDS_EMPTY, REAL_SUB_REFL] THEN
19416    SUBGOAL_THEN ``interval[a,b] INTER {x | x <= c} = interval[a,b]``
19417     (fn th => REWRITE_TAC[th, REAL_ADD_RID]) THEN
19418    FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
19419     ``(i INTER s = {}) ==> (s UNION t = UNIV) ==> (i INTER t = i)``)) THEN
19420    SIMP_TAC std_ss [EXTENSION, IN_UNIV, IN_UNION, GSPECIFICATION] THEN
19421    REAL_ARITH_TAC,
19422    ALL_TAC] THEN
19423  POP_ASSUM_LIST(MP_TAC o end_itlist CONJ) THEN
19424  SIMP_TAC std_ss [INTERVAL_SPLIT, LESS_EQ_REFL] THEN
19425  REWRITE_TAC[GSYM INTERVAL_EQ_EMPTY, REAL_NOT_LT] THEN
19426  SIMP_TAC std_ss [INTERVAL_UPPERBOUND, INTERVAL_LOWERBOUND] THEN
19427  SIMP_TAC std_ss [LESS_EQ_REFL] THEN STRIP_TAC THEN
19428  MATCH_MP_TAC(REAL_ARITH
19429   ``(fx:real = fy) ==> (fb - fa = fx - fa + (fb - fy))``) THEN
19430  AP_TERM_TAC THEN
19431  FULL_SIMP_TAC std_ss [min_def, max_def] THEN
19432  Cases_on `b <= c` >> Cases_on `a <= c` >> fs [] \\
19433  ASM_REAL_ARITH_TAC
19434QED
19435
19436Theorem OPERATIVE_REAL_FUNCTION_ENDPOINT_DIFF:
19437   !f:real->real.
19438    operative (+) (\k. f (interval_upperbound k) - f (interval_lowerbound k))
19439Proof
19440  GEN_TAC THEN
19441  MP_TAC(ISPEC ``(f:real->real)`` OPERATIVE_FUNCTION_ENDPOINT_DIFF) THEN
19442  REWRITE_TAC[operative, NEUTRAL_REAL_ADD] THEN REWRITE_TAC[o_THM]
19443QED
19444
19445Theorem OPERATIVE_LIFTED_VECTOR_VARIATION:
19446   !f:real->real.
19447        operative (lifted(+))
19448                  (\i. if f has_bounded_variation_on i
19449                       then SOME(vector_variation i f) else NONE)
19450Proof
19451  GEN_TAC THEN REWRITE_TAC[has_bounded_variation_on, vector_variation] THEN
19452  MATCH_MP_TAC OPERATIVE_LIFTED_SETVARIATION THEN
19453  REWRITE_TAC[OPERATIVE_FUNCTION_ENDPOINT_DIFF]
19454QED
19455
19456Theorem HAS_BOUNDED_VARIATION_ON_DIVISION:
19457   !f:real->real a b d.
19458        d division_of interval[a,b]
19459        ==> ((!k. k IN d ==> f has_bounded_variation_on k) <=>
19460             f has_bounded_variation_on interval[a,b])
19461Proof
19462  REPEAT STRIP_TAC THEN REWRITE_TAC[has_bounded_variation_on] THEN
19463  MATCH_MP_TAC HAS_BOUNDED_SETVARIATION_ON_DIVISION THEN
19464  ASM_REWRITE_TAC[OPERATIVE_FUNCTION_ENDPOINT_DIFF]
19465QED
19466
19467Theorem VECTOR_VARIATION_ON_DIVISION:
19468   !f:real->real a b d.
19469        d division_of interval[a,b] /\
19470        f has_bounded_variation_on interval[a,b]
19471        ==> (sum d (\k. vector_variation k f) =
19472             vector_variation (interval[a,b]) f)
19473Proof
19474  REPEAT STRIP_TAC THEN REWRITE_TAC[vector_variation] THEN
19475  MATCH_MP_TAC SET_VARIATION_ON_DIVISION THEN
19476  ASM_REWRITE_TAC[OPERATIVE_FUNCTION_ENDPOINT_DIFF, GSYM
19477                  has_bounded_variation_on]
19478QED
19479
19480Theorem HAS_BOUNDED_VARIATION_ON_COMBINE:
19481   !f:real->real a b c.
19482        a <= c /\ c <= b
19483        ==> (f has_bounded_variation_on interval[a,b] <=>
19484             f has_bounded_variation_on interval[a,c] /\
19485             f has_bounded_variation_on interval[c,b])
19486Proof
19487  REPEAT STRIP_TAC THEN MP_TAC
19488   (ISPEC ``f:real->real`` OPERATIVE_LIFTED_VECTOR_VARIATION) THEN
19489  REWRITE_TAC[operative] THEN
19490  DISCH_THEN(MP_TAC o SPECL [``a:real``, ``b:real``, ``c:real``] o
19491   CONJUNCT2) THEN ASM_SIMP_TAC std_ss [] THEN
19492  SUBGOAL_THEN
19493   ``(interval[a,b] INTER {x:real | x <= c} = interval[a,c]) /\
19494     (interval[a,b] INTER {x:real | x >= c} = interval[c,b])``
19495   (fn th => REWRITE_TAC[th])
19496  THENL
19497   [SIMP_TAC std_ss [EXTENSION, IN_INTER, IN_INTERVAL, GSPECIFICATION] THEN
19498    ASM_REAL_ARITH_TAC,
19499    REPEAT(COND_CASES_TAC THEN
19500           ASM_SIMP_TAC std_ss [NOT_NONE_SOME, lifted])]
19501QED
19502
19503Theorem VECTOR_VARIATION_COMBINE :
19504    !f:real->real a b c.
19505        a <= c /\ c <= b /\
19506        f has_bounded_variation_on interval[a,b]
19507        ==> (vector_variation (interval[a,c]) f +
19508             vector_variation (interval[c,b]) f =
19509             vector_variation (interval[a,b]) f)
19510Proof
19511  REPEAT STRIP_TAC THEN MP_TAC
19512   (ISPEC ``f:real->real`` OPERATIVE_LIFTED_VECTOR_VARIATION) THEN
19513  REWRITE_TAC[operative] THEN
19514  DISCH_THEN(MP_TAC o SPECL [``a:real``, ``b:real``, ``c:real``] o
19515   CONJUNCT2) THEN ASM_SIMP_TAC std_ss [] THEN REPEAT(COND_CASES_TAC THENL
19516    [ALL_TAC,
19517     ASM_MESON_TAC[HAS_BOUNDED_VARIATION_ON_SUBSET, INTER_SUBSET]]) THEN
19518  REWRITE_TAC[lifted, SOME_11] THEN DISCH_THEN SUBST1_TAC THEN
19519  SIMP_TAC std_ss [INTERVAL_SPLIT, LESS_EQ_REFL] THEN
19520  BINOP_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN
19521  SIMP_TAC std_ss [EXTENSION, IN_INTERVAL, LESS_EQ_REFL] THEN
19522  RW_TAC real_ss [min_def, max_def] THEN ASM_REAL_ARITH_TAC
19523QED
19524
19525Theorem VECTOR_VARIATION_MINUS_FUNCTION_MONOTONE:
19526   !f a b c d.
19527        f has_bounded_variation_on interval[a,b] /\
19528        interval[c,d] SUBSET interval[a,b] /\ ~(interval[c,d] = {})
19529        ==> vector_variation (interval[c,d]) f - (f d - f c) <=
19530            vector_variation (interval[a,b]) f - (f b - f a)
19531Proof
19532  REWRITE_TAC[SUBSET_INTERVAL, GSYM INTERVAL_EQ_EMPTY, REAL_NOT_LT] THEN
19533  REPEAT STRIP_TAC THEN
19534  SUBGOAL_THEN
19535   ``(f c) - (f a) <= vector_variation(interval[a,c]) f /\
19536     (f b) - (f d) <= vector_variation(interval[d,b]) f``
19537  MP_TAC THENL
19538   [CONJ_TAC THEN MATCH_MP_TAC VECTOR_VARIATION_GE_FUNCTION THEN
19539    ASM_SIMP_TAC std_ss [SEGMENT, SUBSET_INTERVAL, GSYM INTERVAL_EQ_EMPTY] THEN
19540    (CONJ_TAC THENL [ALL_TAC, ASM_REAL_ARITH_TAC]) THEN
19541    FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
19542      HAS_BOUNDED_VARIATION_ON_SUBSET)) THEN
19543    REWRITE_TAC[SUBSET_INTERVAL] THEN ASM_REAL_ARITH_TAC,
19544    ALL_TAC] THEN
19545  MP_TAC(ISPEC ``f:real->real`` VECTOR_VARIATION_COMBINE) THEN
19546  DISCH_THEN(fn th =>
19547    MP_TAC(SPECL [``a:real``, ``b:real``, ``d:real``] th) THEN
19548    MP_TAC(SPECL [``a:real``, ``d:real``, ``c:real``] th)) THEN
19549  ASM_SIMP_TAC std_ss [] THEN
19550  KNOW_TAC ``(f :real -> real) has_bounded_variation_on
19551              interval [((a :real),(d :real))]`` THENL
19552   [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
19553     HAS_BOUNDED_VARIATION_ON_SUBSET)) THEN
19554    REWRITE_TAC[SUBSET_INTERVAL] THEN ASM_REAL_ARITH_TAC,
19555    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
19556    ASM_REAL_ARITH_TAC]
19557QED
19558
19559Theorem HAS_BOUNDED_VARIATION_NONTRIVIAL:
19560   !f:real->real s.
19561        f has_bounded_variation_on s <=>
19562        ?B. !d t.
19563                  d division_of t /\ t SUBSET s /\
19564                  (!k. k IN d ==> ~(interior k = {}))
19565                  ==> sum d (\k. abs(f(interval_upperbound k) -
19566                                      f (interval_lowerbound k))) <= B
19567Proof
19568  REPEAT GEN_TAC THEN REWRITE_TAC[has_bounded_variation_on] THEN
19569  REWRITE_TAC[has_bounded_setvariation_on] THEN
19570  AP_TERM_TAC THEN GEN_REWR_TAC I [FUN_EQ_THM] THEN
19571  X_GEN_TAC ``B:real`` THEN SIMP_TAC std_ss [] THEN
19572  EQ_TAC THENL [METIS_TAC[], DISCH_TAC] THEN
19573  MAP_EVERY X_GEN_TAC [``d:(real->bool)->bool``, ``t:real->bool``] THEN
19574  STRIP_TAC THEN
19575  ABBREV_TAC ``d' = {k:real->bool | k IN d /\ ~(interior k = {})}`` THEN
19576  FIRST_X_ASSUM(MP_TAC o SPECL
19577   [``d':(real->bool)->bool``, ``BIGUNION d':real->bool``]) THEN
19578  KNOW_TAC ``(d' :(real -> bool) -> bool) division_of BIGUNION d' /\
19579    BIGUNION d' SUBSET (s :real -> bool) /\
19580   (!(k :real -> bool). k IN d' ==> interior k <> ({} :real -> bool))`` THENL
19581   [EXPAND_TAC "d'" THEN SIMP_TAC std_ss [GSPECIFICATION] THEN CONJ_TAC THENL
19582     [MATCH_MP_TAC DIVISION_OF_SUBSET THEN
19583      EXISTS_TAC ``d:(real->bool)->bool`` THEN
19584      SIMP_TAC std_ss [SUBSET_RESTRICT] THEN ASM_MESON_TAC[DIVISION_OF_UNION_SELF],
19585      MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC ``t:real->bool`` THEN ASM_SIMP_TAC std_ss [] THEN
19586      MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC ``BIGUNION d:real->bool`` THEN CONJ_TAC THENL
19587       [MATCH_MP_TAC SUBSET_BIGUNION THEN ASM_SET_TAC[],
19588        ASM_MESON_TAC[division_of, SUBSET_REFL]]],
19589    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
19590    MATCH_MP_TAC(REAL_ARITH ``(y:real = x) ==> x <= b ==> y <= b``) THEN
19591    MATCH_MP_TAC SUM_SUPERSET THEN EXPAND_TAC "d'" THEN
19592    ASM_SIMP_TAC real_ss [SUBSET_RESTRICT, GSPECIFICATION, TAUT
19593     `p /\ ~(p /\ ~q) ==> r <=> p ==> q ==> r`] THEN
19594    GEN_TAC THEN STRIP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
19595    UNDISCH_TAC ``d division_of t`` THEN DISCH_TAC THEN
19596    SPEC_TAC (``x:real->bool``,``x:real->bool``) THEN
19597    FIRST_ASSUM(fn th =>
19598     SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION_NONEMPTY th]) THEN
19599    SIMP_TAC std_ss [INTERVAL_LOWERBOUND_NONEMPTY, INTERVAL_UPPERBOUND_NONEMPTY] THEN
19600    SIMP_TAC std_ss [INTERIOR_INTERVAL, INTERVAL_NE_EMPTY] THEN
19601    SIMP_TAC std_ss [GSYM INTERVAL_EQ_EMPTY, AND_IMP_INTRO, GSYM CONJ_ASSOC] THEN
19602    SIMP_TAC std_ss [REAL_LE_ANTISYM, REAL_SUB_REFL, ABS_0]]
19603QED
19604
19605Theorem INCREASING_BOUNDED_VARIATION_GEN:
19606   !f s.
19607      bounded(IMAGE f s) /\
19608      (!x y. x IN s /\ y IN s /\ x <= y ==> (f x) <= (f y))
19609       ==> f has_bounded_variation_on s
19610Proof
19611  REPEAT STRIP_TAC THEN REWRITE_TAC[HAS_BOUNDED_VARIATION_NONTRIVIAL] THEN
19612  UNDISCH_TAC ``(bounded (IMAGE (f :real -> real) (s :real -> bool)) :bool)`` THEN
19613  DISCH_TAC THEN FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [BOUNDED_POS]) THEN
19614  SIMP_TAC std_ss [FORALL_IN_IMAGE] THEN
19615  DISCH_THEN(X_CHOOSE_THEN ``B:real`` STRIP_ASSUME_TAC) THEN
19616  EXISTS_TAC ``&2 * B:real`` THEN REPEAT STRIP_TAC THEN
19617  MP_TAC(ISPECL [``d:(real->bool)->bool``, ``t:real->bool``]
19618        DIVISION_1_SORT) THEN
19619  ASM_SIMP_TAC std_ss [LEFT_IMP_EXISTS_THM] THEN
19620  MAP_EVERY X_GEN_TAC [``n:num``, ``t:num->real->bool``] THEN STRIP_TAC THEN
19621  EXPAND_TAC "d" THEN
19622  KNOW_TAC ``sum { 1n..n}
19623    ((\k. abs (f (interval_upperbound k) - f (interval_lowerbound k))) o t) <=
19624     &2 * (B:real) /\
19625    (!x y. x IN { 1n..n} /\ y IN { 1n..n} /\ (t x = t y) ==> (x = y))`` THENL
19626  [ALL_TAC, METIS_TAC [SUM_IMAGE]] THEN
19627  CONJ_TAC THENL [SIMP_TAC std_ss [o_DEF], ASM_MESON_TAC[LT_CASES]] THEN
19628  SUBGOAL_THEN
19629   ``!k. k IN d
19630        ==> interval_lowerbound (k:real->bool) IN k INTER s /\
19631            interval_upperbound k IN k INTER s /\
19632            (interval_lowerbound k) <= (interval_upperbound k)``
19633  MP_TAC THENL
19634   [UNDISCH_TAC ``d division_of t`` THEN DISCH_TAC THEN
19635    FIRST_ASSUM(fn th =>
19636      SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION_NONEMPTY th]) THEN
19637    SIMP_TAC std_ss [INTERVAL_LOWERBOUND_NONEMPTY, INTERVAL_UPPERBOUND_NONEMPTY] THEN
19638    REWRITE_TAC[IN_INTER] THEN
19639    ASM_MESON_TAC[division_of, ENDS_IN_INTERVAL, SUBSET_DEF, INTERVAL_NE_EMPTY],
19640    EXPAND_TAC "d" THEN SIMP_TAC std_ss [FORALL_IN_IMAGE, IN_INTER] THEN
19641    STRIP_TAC] THEN
19642  SUBGOAL_THEN
19643   ``!m. 1 <= m /\ m <= n
19644        ==> sum{ 1n..m} (\i. abs(f(interval_upperbound(t i)) -
19645                                (f:real->real)(interval_lowerbound(t i))))
19646            <= (f(interval_upperbound(t m))) - (f(interval_lowerbound(t 1)))``
19647   (MP_TAC o SPEC ``n:num``)
19648  THENL
19649   [KNOW_TAC ``!(m :num).
19650     (\m.  1n <= m /\ m <= (n :num) ==>
19651    sum { 1n .. m}
19652      (\(i :num).  abs
19653         ((f :real -> real)
19654            (interval_upperbound ((t :num -> real -> bool) i)) -
19655          f (interval_lowerbound (t i)))) <=
19656    f (interval_upperbound (t m)) - f (interval_lowerbound (t  1n))) m`` THENL
19657    [ALL_TAC, METIS_TAC []] THEN
19658    MATCH_MP_TAC INDUCTION THEN
19659    SIMP_TAC arith_ss [SUM_CLAUSES_NUMSEG] THEN
19660    X_GEN_TAC ``m:num`` THEN
19661    ASM_CASES_TAC ``m = 0:num`` THEN ASM_SIMP_TAC arith_ss [SUM_CLAUSES_NUMSEG] THENL
19662     [DISCH_TAC THEN MATCH_MP_TAC(REAL_ARITH ``(x = y) ==> &0 + x <= y:real``) THEN
19663      MATCH_MP_TAC(REAL_ARITH
19664       ``y <= x ==> (abs(x - y) = x - y:real)``) THEN
19665      FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_MESON_TAC[IN_NUMSEG, LESS_EQ_REFL],
19666      DISCH_THEN(fn th => STRIP_TAC THEN MP_TAC th) THEN
19667      KNOW_TAC ``1 <= SUC m:num`` THENL [ASM_SIMP_TAC arith_ss [], DISCH_TAC] THEN
19668      KNOW_TAC ``m <= n:num`` THENL
19669      [ASM_SIMP_TAC arith_ss [], DISCH_TAC THEN ASM_REWRITE_TAC [] THEN
19670       POP_ASSUM K_TAC] THEN MATCH_MP_TAC(REAL_ARITH
19671       ``b + x <= y ==> s <= b ==> s + x <= y:real``) THEN
19672      MATCH_MP_TAC(REAL_ARITH
19673       ``um <= ls /\ ls <= us ==> (um - l1) + abs(us - ls) <= us - l1:real``) THEN
19674      CONJ_TAC THENL
19675       [FIRST_X_ASSUM MATCH_MP_TAC, METIS_TAC[IN_NUMSEG]] THEN
19676      REPEAT(CONJ_TAC THENL
19677       [ASM_MESON_TAC[IN_NUMSEG, LE_1, ARITH_PROVE ``SUC m <= n ==> m <= n``],
19678       ALL_TAC]) THEN
19679      FIRST_X_ASSUM(MP_TAC o SPECL [``m:num``, ``SUC m``]) THEN
19680      REWRITE_TAC[IN_NUMSEG] THEN
19681      KNOW_TAC ``(1 <= m /\ m <= n) /\ (1 <= SUC m /\ SUC m <= n) /\ m < SUC m`` THENL
19682      [ASM_SIMP_TAC arith_ss [], DISCH_TAC THEN ASM_REWRITE_TAC [] THEN
19683       POP_ASSUM K_TAC THEN DISCH_THEN(MATCH_MP_TAC o CONJUNCT2)] THEN
19684      ASM_MESON_TAC[IN_NUMSEG, LE_1, ARITH_PROVE ``SUC m <= n ==> m <= n``]],
19685    ASM_CASES_TAC ``n = 0:num`` THENL
19686     [ASM_SIMP_TAC arith_ss [SUM_CLAUSES_NUMSEG] THEN
19687      UNDISCH_TAC ``0 < B:real`` THEN REAL_ARITH_TAC,
19688      ASM_SIMP_TAC std_ss [LE_1, LESS_EQ_REFL]] THEN
19689    MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] REAL_LE_TRANS) THEN
19690    MATCH_MP_TAC(REAL_ARITH ``(abs(x) <= B /\ abs(y) <= B)
19691      ==> x - y <= &2 * B:real``) THEN
19692    CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
19693    ASM_MESON_TAC[IN_NUMSEG, LESS_EQ_REFL, LE_1]]
19694QED
19695
19696Theorem DECREASING_BOUNDED_VARIATION_GEN:
19697   !f s.
19698      bounded(IMAGE f s) /\
19699      (!x y. x IN s /\ y IN s /\ x <= y ==> (f y) <= (f x))
19700       ==> f has_bounded_variation_on s
19701Proof
19702  REPEAT STRIP_TAC THEN
19703  MP_TAC(SPECL [``(\x. -x) o (f:real->real)``, ``s:real->bool``]
19704        INCREASING_BOUNDED_VARIATION_GEN) THEN
19705  ASM_SIMP_TAC std_ss [REAL_LE_NEG2] THEN
19706  ASM_SIMP_TAC std_ss [BOUNDED_NEGATIONS, IMAGE_COMPOSE] THEN
19707  DISCH_THEN(MP_TAC o MATCH_MP HAS_BOUNDED_VARIATION_ON_NEG) THEN
19708  METIS_TAC[o_DEF, REAL_NEG_NEG, ETA_AX]
19709QED
19710
19711Theorem INCREASING_BOUNDED_VARIATION :
19712    !f a b.
19713        (!x y. x IN interval[a,b] /\ y IN interval[a,b] /\ x <= y
19714               ==> (f x) <= (f y))
19715        ==> f has_bounded_variation_on interval[a,b]
19716Proof
19717  REPEAT STRIP_TAC THEN MATCH_MP_TAC INCREASING_BOUNDED_VARIATION_GEN THEN
19718  ASM_SIMP_TAC std_ss [bounded_def, FORALL_IN_IMAGE] THEN EXISTS_TAC
19719   ``max (abs((f:real->real) a)) (abs((f:real->real) b))`` THEN
19720  X_GEN_TAC ``x:real`` THEN DISCH_TAC THEN FIRST_X_ASSUM(fn th =>
19721    MP_TAC(SPECL [``a:real``, ``x:real``] th) THEN
19722    MP_TAC(SPECL [``x:real``, ``b:real``] th)) THEN
19723  ASM_SIMP_TAC std_ss [ENDS_IN_INTERVAL, INTERVAL_NE_EMPTY] THEN
19724  FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [IN_INTERVAL]) THEN
19725  RW_TAC real_ss [max_def] THEN
19726 `a <= b` by PROVE_TAC [REAL_LE_TRANS] >> RES_TAC \\
19727  REAL_ASM_ARITH_TAC
19728QED
19729
19730Theorem DECREASING_BOUNDED_VARIATION:
19731   !f a b.
19732        (!x y. x IN interval[a,b] /\ y IN interval[a,b] /\ x <= y
19733               ==> (f y) <= (f x))
19734         ==> f has_bounded_variation_on interval[a,b]
19735Proof
19736  REPEAT GEN_TAC THEN
19737  GEN_REWR_TAC (LAND_CONV o BINDER_CONV o BINDER_CONV o RAND_CONV)
19738   [GSYM REAL_LE_NEG2] THEN
19739  SIMP_TAC std_ss [] THEN
19740  GEN_REWR_TAC (LAND_CONV o BINDER_CONV o BINDER_CONV o RAND_CONV)
19741   [METIS [] ``-f x <= -f y <=> (\x. -f x) x <= (\y. -f y) y:real``] THEN
19742  DISCH_THEN(MP_TAC o MATCH_MP INCREASING_BOUNDED_VARIATION) THEN
19743  DISCH_THEN(MP_TAC o MATCH_MP HAS_BOUNDED_VARIATION_ON_NEG) THEN
19744  SIMP_TAC std_ss [REAL_NEG_NEG] THEN METIS_TAC [ETA_AX]
19745QED
19746
19747Theorem INCREASING_VECTOR_VARIATION:
19748   !f a b.
19749        ~(interval[a,b] = {}) /\
19750        (!x y. x IN interval[a,b] /\ y IN interval[a,b] /\ x <= y
19751               ==> (f x) <= (f y))
19752        ==> (vector_variation (interval[a,b]) f = (f b) - (f a))
19753Proof
19754  REPEAT STRIP_TAC THEN REWRITE_TAC[vector_variation] THEN
19755  REWRITE_TAC[SET_VARIATION_ON_INTERVAL] THEN
19756  SUBGOAL_THEN
19757   ``{sum d (\k. abs (f (interval_upperbound k) - f (interval_lowerbound k))) |
19758     d division_of interval[a:real,b]} =
19759    {(f b) - (f a)}``
19760   (fn th => SIMP_TAC std_ss [SUP_INSERT_FINITE, FINITE_EMPTY, th]) THEN
19761  ONCE_REWRITE_TAC [METIS [] ``{sum d f | d division_of interval [(a,b)]} =
19762                  {(\d. sum d f) d | (\d. d division_of interval [(a,b)]) d}``] THEN
19763  MATCH_MP_TAC(SET_RULE
19764   ``(?x. P x) /\ (!x. P x ==> (f x = a)) ==> ({f x | P x} = {a})``) THEN
19765  CONJ_TAC THENL [ASM_MESON_TAC[DIVISION_OF_SELF], ALL_TAC] THEN
19766  MP_TAC(MATCH_MP (REWRITE_RULE
19767   [TAUT `a /\ b /\ c ==> d <=> b ==> a /\ c ==> d`]
19768   OPERATIVE_DIVISION) (SPEC ``(f:real->real)``
19769      OPERATIVE_REAL_FUNCTION_ENDPOINT_DIFF)) THEN
19770   DISCH_TAC THEN GEN_TAC THEN POP_ASSUM (MP_TAC o SPEC ``x:(real->bool)->bool``) THEN
19771  DISCH_THEN(MP_TAC o SPECL [``a:real``, ``b:real``]) THEN
19772  DISCH_THEN(fn th => STRIP_TAC THEN MP_TAC th) THEN
19773  ASM_REWRITE_TAC[GSYM sum_def, MONOIDAL_REAL_ADD] THEN
19774  RULE_ASSUM_TAC(REWRITE_RULE[GSYM INTERVAL_EQ_EMPTY, REAL_NOT_LT]) THEN
19775  FULL_SIMP_TAC std_ss [o_THM, INTERVAL_LOWERBOUND, INTERVAL_UPPERBOUND] THEN
19776  DISCH_THEN(SUBST1_TAC o SYM) THEN
19777  MATCH_MP_TAC SUM_EQ THEN SIMP_TAC std_ss [] THEN
19778  FIRST_ASSUM(fn th => SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION th]) THEN
19779  MAP_EVERY X_GEN_TAC [``u:real``, ``v:real``] THEN DISCH_TAC THEN
19780  SUBGOAL_THEN ``~(interval[u:real,v] = {})`` ASSUME_TAC THENL
19781   [ASM_MESON_TAC[division_of], ALL_TAC] THEN
19782   RULE_ASSUM_TAC(REWRITE_RULE[GSYM INTERVAL_EQ_EMPTY, REAL_NOT_LT]) THEN
19783  ASM_SIMP_TAC std_ss [INTERVAL_LOWERBOUND, INTERVAL_UPPERBOUND] THEN
19784  MATCH_MP_TAC(REAL_ARITH ``x <= y ==> (abs(y - x) = y - x:real)``) THEN
19785  FIRST_X_ASSUM MATCH_MP_TAC THEN REWRITE_TAC[IN_INTERVAL] THEN
19786  SUBGOAL_THEN ``interval[u:real,v] SUBSET interval[a,b]`` MP_TAC THENL
19787   [ASM_MESON_TAC[division_of], REWRITE_TAC[SUBSET_INTERVAL]] THEN
19788  ASM_REAL_ARITH_TAC
19789QED
19790
19791Theorem DECREASING_VECTOR_VARIATION:
19792   !f a b.
19793        ~(interval[a,b] = {}) /\
19794        (!x y. x IN interval[a,b] /\ y IN interval[a,b] /\ x <= y
19795               ==> (f y) <= (f x))
19796        ==> (vector_variation (interval[a,b]) f = (f a) - (f b))
19797Proof
19798  REPEAT GEN_TAC THEN GEN_REWR_TAC
19799   (LAND_CONV o RAND_CONV o BINDER_CONV o BINDER_CONV o RAND_CONV)
19800   [GSYM REAL_LE_NEG2] THEN
19801  GEN_REWR_TAC
19802   (LAND_CONV o RAND_CONV o BINDER_CONV o BINDER_CONV o RAND_CONV)
19803   [METIS [] ``-f x <= -f y <=> (\x. -f x) x <= (\y. -(f:real->real) y) y``] THEN
19804  DISCH_THEN(MP_TAC o MATCH_MP INCREASING_VECTOR_VARIATION) THEN
19805  SIMP_TAC std_ss [VECTOR_VARIATION_NEG] THEN
19806  DISCH_TAC THEN REAL_ARITH_TAC
19807QED
19808
19809Theorem HAS_BOUNDED_VARIATION_TRANSLATION2_EQ_AND_VECTOR_VARIATION_TRANSLATION2:
19810   (!a f:real->real s.
19811        (\x. f(a + x)) has_bounded_variation_on (IMAGE (\x. -a + x) s) <=>
19812        f has_bounded_variation_on s) /\
19813   (!a f:real->real s.
19814        vector_variation (IMAGE (\x. -a + x) s) (\x. f(a + x)) =
19815        vector_variation s f)
19816Proof
19817  SIMP_TAC std_ss [GSYM FORALL_AND_THM] THEN X_GEN_TAC ``a:real`` THEN
19818  SIMP_TAC std_ss [FORALL_AND_THM] THEN
19819  ONCE_REWRITE_TAC [METIS [] ``(\x. f (a + x:real)) = (\x. f ((\x. (a + x)) x))``] THEN
19820  MATCH_MP_TAC VARIATION_EQUAL_LEMMA THEN
19821  SIMP_TAC std_ss [] THEN CONJ_TAC THENL [REAL_ARITH_TAC, ALL_TAC] THEN
19822  SIMP_TAC std_ss [DIVISION_OF_TRANSLATION, GSYM INTERVAL_TRANSLATION]
19823QED
19824
19825Theorem HAS_BOUNDED_VARIATION_TRANSLATION2_EQ:
19826   (!a f:real->real s.
19827        (\x. f(a + x)) has_bounded_variation_on (IMAGE (\x. -a + x) s) <=>
19828        f has_bounded_variation_on s)
19829Proof
19830  REWRITE_TAC [HAS_BOUNDED_VARIATION_TRANSLATION2_EQ_AND_VECTOR_VARIATION_TRANSLATION2]
19831QED
19832
19833Theorem VECTOR_VARIATION_TRANSLATION2:
19834   (!a f:real->real s.
19835        vector_variation (IMAGE (\x. -a + x) s) (\x. f(a + x)) =
19836        vector_variation s f)
19837Proof
19838  REWRITE_TAC [HAS_BOUNDED_VARIATION_TRANSLATION2_EQ_AND_VECTOR_VARIATION_TRANSLATION2]
19839QED
19840
19841Theorem HAS_BOUNDED_VARIATION_AFFINITY2_EQ_AND_VECTOR_VARIATION_AFFINITY2:
19842   (!m c f:real->real s.
19843        (\x. f (m * x + c)) has_bounded_variation_on
19844        IMAGE (\x. inv m * x + -(inv m * c)) s <=>
19845        (m = &0) \/ f has_bounded_variation_on s) /\
19846   (!m c f:real->real s.
19847        vector_variation (IMAGE (\x. inv m * x + -(inv m * c)) s)
19848                         (\x. f (m * x + c)) =
19849        if m = &0 then &0 else vector_variation s f)
19850Proof
19851  SIMP_TAC std_ss [GSYM FORALL_AND_THM] THEN X_GEN_TAC ``m:real`` THEN
19852  SIMP_TAC std_ss [GSYM FORALL_AND_THM] THEN X_GEN_TAC ``c:real`` THEN
19853  ASM_CASES_TAC ``m = &0:real`` THEN ASM_SIMP_TAC std_ss [] THENL
19854   [ASM_SIMP_TAC std_ss [REAL_MUL_LZERO, HAS_BOUNDED_VARIATION_ON_CONST] THEN
19855    SIMP_TAC std_ss [VECTOR_VARIATION_CONST],
19856    SIMP_TAC std_ss [FORALL_AND_THM] THEN
19857    ONCE_REWRITE_TAC [METIS [] ``(\x:real. f (m * x + c)) = (\x. f ((\x. (m * x + c)) x))``] THEN
19858    MATCH_MP_TAC VARIATION_EQUAL_LEMMA THEN
19859    ASM_SIMP_TAC std_ss [SIMP_RULE std_ss [FUN_EQ_THM, o_DEF] AFFINITY_INVERSES] THEN
19860    ASM_SIMP_TAC std_ss [IMAGE_AFFINITY_INTERVAL] THEN
19861    ASM_SIMP_TAC real_ss [DIVISION_OF_AFFINITY, REAL_INV_EQ_0] THEN
19862    METIS_TAC[]]
19863QED
19864
19865Theorem HAS_BOUNDED_VARIATION_AFFINITY2_EQ:
19866   (!m c f:real->real s.
19867        (\x. f (m * x + c)) has_bounded_variation_on
19868        IMAGE (\x. inv m * x + -(inv m * c)) s <=>
19869        (m = &0) \/ f has_bounded_variation_on s)
19870Proof
19871  REWRITE_TAC [HAS_BOUNDED_VARIATION_AFFINITY2_EQ_AND_VECTOR_VARIATION_AFFINITY2]
19872QED
19873
19874Theorem VECTOR_VARIATION_AFFINITY2:
19875    (!m c f:real->real s.
19876        vector_variation (IMAGE (\x. inv m * x + -(inv m * c)) s)
19877                         (\x. f (m * x + c)) =
19878        if m = &0 then &0 else vector_variation s f)
19879Proof
19880  REWRITE_TAC [HAS_BOUNDED_VARIATION_AFFINITY2_EQ_AND_VECTOR_VARIATION_AFFINITY2]
19881QED
19882
19883Theorem HAS_BOUNDED_VARIATION_AFFINITY_EQ_AND_VECTOR_VARIATION_AFFINITY:
19884   (!m c f:real->real s.
19885        (\x. f(m * x + c)) has_bounded_variation_on s <=>
19886        (m = &0) \/ f has_bounded_variation_on (IMAGE (\x. m * x + c) s)) /\
19887   (!m c f:real->real s.
19888        vector_variation s (\x. f(m * x + c)) =
19889        if m = &0 then &0 else vector_variation (IMAGE (\x. m * x + c) s) f)
19890Proof
19891  SIMP_TAC std_ss [GSYM FORALL_AND_THM] THEN REPEAT GEN_TAC THEN
19892  ASM_CASES_TAC ``m = &0:real`` THEN
19893  ASM_SIMP_TAC real_ss [REAL_MUL_LZERO, HAS_BOUNDED_VARIATION_ON_CONST,
19894                  VECTOR_VARIATION_CONST] THEN
19895  CONJ_TAC THENL
19896   [MP_TAC(ISPECL[``m:real``, ``c:real``, ``f:real->real``,
19897                  ``IMAGE (\x:real. m * x + c) s``]
19898          HAS_BOUNDED_VARIATION_AFFINITY2_EQ),
19899    MP_TAC(ISPECL[``m:real``, ``c:real``, ``f:real->real``,
19900                  ``IMAGE (\x:real. m * x + c) s``]
19901          VECTOR_VARIATION_AFFINITY2)] THEN
19902  ASM_SIMP_TAC std_ss [AFFINITY_INVERSES, GSYM IMAGE_COMPOSE, IMAGE_ID]
19903QED
19904
19905Theorem HAS_BOUNDED_VARIATION_AFFINITY_EQ:
19906   (!m c f:real->real s.
19907        (\x. f(m * x + c)) has_bounded_variation_on s <=>
19908        (m = &0) \/ f has_bounded_variation_on (IMAGE (\x. m * x + c) s))
19909Proof
19910  REWRITE_TAC [HAS_BOUNDED_VARIATION_AFFINITY_EQ_AND_VECTOR_VARIATION_AFFINITY]
19911QED
19912
19913Theorem VECTOR_VARIATION_AFFINITY:
19914   (!m c f:real->real s.
19915        vector_variation s (\x. f(m * x + c)) =
19916        if m = &0 then &0 else vector_variation (IMAGE (\x. m * x + c) s) f)
19917Proof
19918  REWRITE_TAC [HAS_BOUNDED_VARIATION_AFFINITY_EQ_AND_VECTOR_VARIATION_AFFINITY]
19919QED
19920
19921Theorem HAS_BOUNDED_VARIATION_TRANSLATION_EQ_AND_VECTOR_VARIATION_TRANSLATION:
19922   (!a f:real->real s.
19923        (\x. f(a + x)) has_bounded_variation_on s <=>
19924        f has_bounded_variation_on (IMAGE (\x. a + x) s)) /\
19925   (!a f:real->real s.
19926        vector_variation s (\x. f(a + x)) =
19927        vector_variation (IMAGE (\x. a + x) s) f)
19928Proof
19929  REPEAT STRIP_TAC THENL
19930   [MP_TAC(ISPECL[``a:real``, ``f:real->real``, ``IMAGE (\x:real. a + x) s``]
19931          HAS_BOUNDED_VARIATION_TRANSLATION2_EQ),
19932    MP_TAC(ISPECL[``a:real``, ``f:real->real``, ``IMAGE (\x:real. a + x) s``]
19933          VECTOR_VARIATION_TRANSLATION2)] THEN
19934  SIMP_TAC std_ss [GSYM IMAGE_COMPOSE, o_DEF] THEN
19935  SIMP_TAC real_ss [IMAGE_ID, REAL_ARITH ``-a + (a + x):real = x``,
19936              REAL_ARITH ``a + -a + x:real = x``]
19937QED
19938
19939Theorem HAS_BOUNDED_VARIATION_TRANSLATION_EQ:
19940   (!a f:real->real s.
19941        (\x. f(a + x)) has_bounded_variation_on s <=>
19942        f has_bounded_variation_on (IMAGE (\x. a + x) s))
19943Proof
19944  REWRITE_TAC [HAS_BOUNDED_VARIATION_TRANSLATION_EQ_AND_VECTOR_VARIATION_TRANSLATION]
19945QED
19946
19947Theorem VECTOR_VARIATION_TRANSLATION:
19948   (!a f:real->real s.
19949        vector_variation s (\x. f(a + x)) =
19950        vector_variation (IMAGE (\x. a + x) s) f)
19951Proof
19952  REWRITE_TAC [HAS_BOUNDED_VARIATION_TRANSLATION_EQ_AND_VECTOR_VARIATION_TRANSLATION]
19953QED
19954
19955Theorem HAS_BOUNDED_VARIATION_TRANSLATION_EQ_INTERVAL_AND_VECTOR_VARIATION_TRANSLATION_INTERVAL:
19956   (!a f:real->real u v.
19957        (\x. f(a + x)) has_bounded_variation_on interval[u,v] <=>
19958        f has_bounded_variation_on interval[a+u,a+v]) /\
19959   (!a f:real->real u v.
19960        vector_variation (interval[u,v]) (\x. f(a + x)) =
19961        vector_variation (interval[a+u,a+v]) f)
19962Proof
19963  SIMP_TAC std_ss [INTERVAL_TRANSLATION, HAS_BOUNDED_VARIATION_TRANSLATION_EQ,
19964              VECTOR_VARIATION_TRANSLATION]
19965QED
19966
19967Theorem HAS_BOUNDED_VARIATION_TRANSLATION_EQ_INTERVAL:
19968   (!a f:real->real u v.
19969        (\x. f(a + x)) has_bounded_variation_on interval[u,v] <=>
19970        f has_bounded_variation_on interval[a+u,a+v])
19971Proof
19972 REWRITE_TAC [HAS_BOUNDED_VARIATION_TRANSLATION_EQ_INTERVAL_AND_VECTOR_VARIATION_TRANSLATION_INTERVAL]
19973QED
19974
19975Theorem VECTOR_VARIATION_TRANSLATION_INTERVAL:
19976   (!a f:real->real u v.
19977        vector_variation (interval[u,v]) (\x. f(a + x)) =
19978        vector_variation (interval[a+u,a+v]) f)
19979Proof
19980 REWRITE_TAC [HAS_BOUNDED_VARIATION_TRANSLATION_EQ_INTERVAL_AND_VECTOR_VARIATION_TRANSLATION_INTERVAL]
19981QED
19982
19983Theorem HAS_BOUNDED_VARIATION_TRANSLATION:
19984   !f:real->real s a.
19985        f has_bounded_variation_on s
19986        ==> (\x. f(a + x)) has_bounded_variation_on (IMAGE (\x. -a + x) s)
19987Proof
19988  REWRITE_TAC[HAS_BOUNDED_VARIATION_TRANSLATION2_EQ]
19989QED
19990
19991Theorem HAS_BOUNDED_VARIATION_REFLECT2_EQ_AND_VECTOR_VARIATION_REFLECT2:
19992   (!f:real->real s.
19993        (\x. f(-x)) has_bounded_variation_on (IMAGE (\x. -x) s) <=>
19994        f has_bounded_variation_on s) /\
19995   (!f:real->real s.
19996        vector_variation (IMAGE (\x. -x) s) (\x. f(-x)) =
19997        vector_variation s f)
19998Proof
19999  MATCH_MP_TAC VARIATION_EQUAL_LEMMA THEN
20000  SIMP_TAC std_ss [] THEN CONJ_TAC THENL [REAL_ARITH_TAC, ALL_TAC] THEN
20001  METIS_TAC [DIVISION_OF_REFLECT, REFLECT_INTERVAL]
20002QED
20003
20004Theorem HAS_BOUNDED_VARIATION_REFLECT2_EQ:
20005   (!f:real->real s.
20006        (\x. f(-x)) has_bounded_variation_on (IMAGE (\x. -x) s) <=>
20007        f has_bounded_variation_on s)
20008Proof
20009  REWRITE_TAC [HAS_BOUNDED_VARIATION_REFLECT2_EQ_AND_VECTOR_VARIATION_REFLECT2]
20010QED
20011
20012Theorem VECTOR_VARIATION_REFLECT2:
20013   (!f:real->real s.
20014        vector_variation (IMAGE (\x. -x) s) (\x. f(-x)) =
20015        vector_variation s f)
20016Proof
20017  REWRITE_TAC [HAS_BOUNDED_VARIATION_REFLECT2_EQ_AND_VECTOR_VARIATION_REFLECT2]
20018QED
20019
20020Theorem HAS_BOUNDED_VARIATION_REFLECT_EQ_AND_VECTOR_VARIATION_REFLECT:
20021   (!f:real->real s.
20022        (\x. f(-x)) has_bounded_variation_on s <=>
20023        f has_bounded_variation_on (IMAGE (\x. -x) s)) /\
20024   (!f:real->real s.
20025        vector_variation s (\x. f(-x)) =
20026        vector_variation (IMAGE (\x. -x) s) f)
20027Proof
20028  REPEAT STRIP_TAC THENL
20029   [MP_TAC(ISPECL[``f:real->real``, ``IMAGE (\x. -x) (s:real->bool)``]
20030          HAS_BOUNDED_VARIATION_REFLECT2_EQ),
20031    MP_TAC(ISPECL[``f:real->real``, ``IMAGE (\x. -x) (s:real->bool)``]
20032          VECTOR_VARIATION_REFLECT2)] THEN
20033  SIMP_TAC std_ss [GSYM IMAGE_COMPOSE, o_DEF] THEN
20034  REWRITE_TAC[IMAGE_ID, REAL_NEG_NEG]
20035QED
20036
20037Theorem HAS_BOUNDED_VARIATION_REFLECT_EQ:
20038   (!f:real->real s.
20039        (\x. f(-x)) has_bounded_variation_on s <=>
20040        f has_bounded_variation_on (IMAGE (\x. -x) s))
20041Proof
20042  REWRITE_TAC [HAS_BOUNDED_VARIATION_REFLECT_EQ_AND_VECTOR_VARIATION_REFLECT]
20043QED
20044
20045Theorem VECTOR_VARIATION_REFLECT:
20046   (!f:real->real s.
20047        vector_variation s (\x. f(-x)) =
20048        vector_variation (IMAGE (\x. -x) s) f)
20049Proof
20050  REWRITE_TAC [HAS_BOUNDED_VARIATION_REFLECT_EQ_AND_VECTOR_VARIATION_REFLECT]
20051QED
20052
20053Theorem HAS_BOUNDED_VARIATION_REFLECT_EQ_INTERVAL_AND_VECTOR_VARIATION_REFLECT_INTERVAL:
20054   (!f:real->real u v.
20055        (\x. f(-x)) has_bounded_variation_on interval[u,v] <=>
20056        f has_bounded_variation_on interval[-v,-u]) /\
20057   (!f:real->real u v.
20058        vector_variation (interval[u,v]) (\x. f(-x)) =
20059        vector_variation (interval[-v,-u]) f)
20060Proof
20061  SIMP_TAC std_ss [GSYM REFLECT_INTERVAL, HAS_BOUNDED_VARIATION_REFLECT_EQ,
20062              VECTOR_VARIATION_REFLECT]
20063QED
20064
20065Theorem HAS_BOUNDED_VARIATION_REFLECT_EQ_INTERVAL:
20066   (!f:real->real u v.
20067        (\x. f(-x)) has_bounded_variation_on interval[u,v] <=>
20068        f has_bounded_variation_on interval[-v,-u])
20069Proof
20070 REWRITE_TAC [HAS_BOUNDED_VARIATION_REFLECT_EQ_INTERVAL_AND_VECTOR_VARIATION_REFLECT_INTERVAL]
20071QED
20072
20073Theorem VECTOR_VARIATION_REFLECT_INTERVAL:
20074   (!f:real->real u v.
20075        vector_variation (interval[u,v]) (\x. f(-x)) =
20076        vector_variation (interval[-v,-u]) f)
20077Proof
20078 REWRITE_TAC [HAS_BOUNDED_VARIATION_REFLECT_EQ_INTERVAL_AND_VECTOR_VARIATION_REFLECT_INTERVAL]
20079QED
20080
20081Theorem HAS_BOUNDED_VARIATION_DARBOUX:
20082   !f a b.
20083     f has_bounded_variation_on interval[a,b] <=>
20084     ?g h. (!x y. x IN interval[a,b] /\ y IN interval[a,b] /\ x <= y
20085                  ==> (g x) <= (g y)) /\
20086           (!x y. x IN interval[a,b] /\ y IN interval[a,b] /\ x <= y
20087                  ==> (h x) <= (h y)) /\
20088           (!x. f x = g x - h x)
20089Proof
20090  REPEAT GEN_TAC THEN EQ_TAC THEN STRIP_TAC THENL
20091   [MAP_EVERY EXISTS_TAC
20092     [``\x:real. (vector_variation (interval[a,x]) (f:real->real))``,
20093      ``\x:real. (vector_variation (interval[a,x]) f) - f x``] THEN
20094    SIMP_TAC real_ss [REAL_ARITH ``a - (a - x):real = x``] THEN
20095    REPEAT STRIP_TAC THENL
20096     [MATCH_MP_TAC VECTOR_VARIATION_MONOTONE,
20097      MATCH_MP_TAC(REAL_ARITH
20098       ``!x. a - (b - x) <= c - (d - x) ==> a - b <= c - d:real``) THEN
20099      EXISTS_TAC ``(f(a:real)):real`` THEN
20100      SIMP_TAC std_ss [] THEN
20101      MATCH_MP_TAC VECTOR_VARIATION_MINUS_FUNCTION_MONOTONE] THEN
20102    (CONJ_TAC THENL
20103       [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SIMP_RULE std_ss [IMP_CONJ]
20104         HAS_BOUNDED_VARIATION_ON_SUBSET)),
20105        ALL_TAC] THEN
20106      RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN
20107      REWRITE_TAC[SUBSET_INTERVAL, GSYM INTERVAL_EQ_EMPTY] THEN
20108      ASM_REAL_ARITH_TAC),
20109    GEN_REWR_TAC LAND_CONV [GSYM ETA_AX] THEN ASM_REWRITE_TAC[] THEN
20110    MATCH_MP_TAC HAS_BOUNDED_VARIATION_ON_SUB THEN
20111    CONJ_TAC THEN MATCH_MP_TAC INCREASING_BOUNDED_VARIATION THEN
20112    ASM_REWRITE_TAC[]]
20113QED
20114
20115Theorem HAS_BOUNDED_VARIATION_DARBOUX_STRICT:
20116   !f a b.
20117     f has_bounded_variation_on interval[a,b] <=>
20118     ?g h. (!x y. x IN interval[a,b] /\ y IN interval[a,b] /\ x < y
20119                  ==> (g x) < (g y)) /\
20120           (!x y. x IN interval[a,b] /\ y IN interval[a,b] /\ x < y
20121                  ==> (h x) < (h y)) /\
20122           (!x. f x = g x - h x)
20123Proof
20124  REPEAT GEN_TAC THEN REWRITE_TAC[HAS_BOUNDED_VARIATION_DARBOUX] THEN
20125  EQ_TAC THEN SIMP_TAC std_ss [LEFT_IMP_EXISTS_THM] THEN
20126  MAP_EVERY X_GEN_TAC [``g:real->real``, ``h:real->real``] THEN
20127  STRIP_TAC THENL
20128   [MAP_EVERY EXISTS_TAC [``\x:real. g x + x``, ``\x:real. h x + x``] THEN
20129    ASM_SIMP_TAC std_ss [REAL_ARITH ``(a + x) - (b + x):real = a - b``] THEN
20130    REPEAT STRIP_TAC THEN
20131    MATCH_MP_TAC REAL_LET_ADD2 THEN ASM_REWRITE_TAC[] THEN
20132    FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_SIMP_TAC std_ss [REAL_LT_IMP_LE],
20133    MAP_EVERY EXISTS_TAC [``g:real->real``, ``h:real->real``] THEN
20134    ASM_REWRITE_TAC[REAL_LE_LT] THEN ASM_MESON_TAC[]]
20135QED
20136
20137Theorem HAS_BOUNDED_VARIATION_COMPOSE_INCREASING:
20138   !f g:real->real a b.
20139        (!x y. x IN interval[a,b] /\ y IN interval[a,b] /\ x <= y
20140               ==> (f x) <= (f y)) /\
20141        g has_bounded_variation_on interval[f a,f b]
20142        ==> (g o f) has_bounded_variation_on interval[a,b]
20143Proof
20144  REPEAT GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
20145  ONCE_REWRITE_TAC[HAS_BOUNDED_VARIATION_ON_COMPONENTWISE] THEN
20146  ASM_SIMP_TAC std_ss [HAS_BOUNDED_VARIATION_DARBOUX, LEFT_IMP_EXISTS_THM] THEN
20147  MAP_EVERY X_GEN_TAC [``h:real->real``, ``k:real->real``] THEN
20148  STRIP_TAC THEN
20149  MAP_EVERY EXISTS_TAC [``(h:real->real) o (f:real->real)``,
20150                        ``(k:real->real) o (f:real->real)``] THEN
20151  ASM_SIMP_TAC std_ss [o_THM] THEN
20152  REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
20153  REPEAT STRIP_TAC THEN TRY(FIRST_X_ASSUM MATCH_MP_TAC) THEN
20154  ASM_REWRITE_TAC[] THEN
20155  REWRITE_TAC[IN_INTERVAL] THEN CONJ_TAC THEN
20156  FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN
20157  RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN ASM_REWRITE_TAC[] THEN
20158  REWRITE_TAC[IN_INTERVAL] THEN POP_ASSUM MP_TAC THEN
20159  POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN REAL_ARITH_TAC
20160QED
20161
20162Theorem HAS_BOUNDED_VARIATION_ON_REFLECT:
20163   !f:real->real s.
20164        f has_bounded_variation_on IMAGE (\x. -x) s
20165        ==> (\x. f(-x)) has_bounded_variation_on s
20166Proof
20167  REPEAT GEN_TAC THEN
20168  REWRITE_TAC[has_bounded_variation_on] THEN
20169  REWRITE_TAC[has_bounded_setvariation_on] THEN
20170  DISCH_THEN (X_CHOOSE_TAC ``B:real``) THEN EXISTS_TAC ``B:real`` THEN
20171  MAP_EVERY X_GEN_TAC [``d:(real->bool)->bool``, ``t:real->bool``] THEN
20172  STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPECL
20173   [``IMAGE (IMAGE (\x. -x)) (d:(real->bool)->bool)``,
20174    ``IMAGE (\x. -x) (t:real->bool)``]) THEN
20175  ASM_SIMP_TAC std_ss [DIVISION_OF_REFLECT] THEN
20176  SIMP_TAC std_ss [SUBSET_DEF, FORALL_IN_IMAGE] THEN
20177  KNOW_TAC ``(!x:real. x IN t ==> -x IN IMAGE (\x. -x) s)`` THENL
20178  [ASM_SET_TAC[], DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
20179  ASM_REWRITE_TAC[GSYM SUBSET_DEF] THEN
20180  W(MP_TAC o PART_MATCH (lhs o rand) SUM_IMAGE o lhand o lhand o snd) THEN
20181  KNOW_TAC ``(!(x :real -> bool) (y :real -> bool).
20182    x IN (d :(real -> bool) -> bool) /\ y IN d /\
20183    (IMAGE (\(x :real). -x) x = IMAGE (\(x :real). -x) y) ==>
20184    (x = y))`` THENL
20185   [METIS_TAC[REAL_ARITH ``(-x:real = -y) <=> (x = y)``, INJECTIVE_IMAGE],
20186    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
20187    DISCH_THEN SUBST1_TAC THEN
20188    MATCH_MP_TAC(REAL_ARITH ``(x = y) ==> x <= d ==> y <= d:real``) THEN
20189    MATCH_MP_TAC SUM_EQ THEN UNDISCH_TAC ``d division_of t`` THEN
20190    DISCH_TAC THEN FIRST_ASSUM(fn th =>
20191      SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION th]) THEN
20192    MAP_EVERY X_GEN_TAC [``u:real``, ``v:real``] THEN DISCH_TAC THEN
20193    SUBGOAL_THEN ``u <= v:real`` ASSUME_TAC THENL
20194     [METIS_TAC[GSYM INTERVAL_NE_EMPTY, division_of], ALL_TAC] THEN
20195    ASM_SIMP_TAC std_ss [o_THM, REFLECT_INTERVAL] THEN
20196    ASM_SIMP_TAC std_ss [INTERVAL_UPPERBOUND, INTERVAL_LOWERBOUND,
20197                 REAL_LE_NEG2] THEN
20198    REAL_ARITH_TAC]
20199QED
20200
20201Theorem HAS_BOUNDED_VARIATION_ON_REFLECT_INTERVAL:
20202   !f:real->real a b.
20203        f has_bounded_variation_on interval[-b,-a]
20204        ==> (\x. f(-x)) has_bounded_variation_on interval[a,b]
20205Proof
20206  REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_BOUNDED_VARIATION_ON_REFLECT THEN
20207  ASM_REWRITE_TAC[REFLECT_INTERVAL]
20208QED
20209
20210Theorem HAS_BOUNDED_VARIATION_COMPOSE_DECREASING:
20211   !f g:real->real a b.
20212        (!x y. x IN interval[a,b] /\ y IN interval[a,b] /\ x <= y
20213               ==> (f y) <= (f x)) /\
20214        g has_bounded_variation_on interval[f b,f a]
20215        ==> (g o f) has_bounded_variation_on interval[a,b]
20216Proof
20217  REPEAT GEN_TAC THEN
20218  DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
20219  DISCH_THEN(MP_TAC o MATCH_MP (REWRITE_RULE[REAL_NEG_NEG]
20220    (ISPECL [``f:real->real``, ``-b:real``, ``-a:real``]
20221        HAS_BOUNDED_VARIATION_ON_REFLECT_INTERVAL))) THEN
20222  POP_ASSUM MP_TAC THEN
20223  GEN_REWR_TAC (LAND_CONV o BINDER_CONV o BINDER_CONV o RAND_CONV)
20224   [GSYM REAL_LE_NEG2] THEN
20225  REWRITE_TAC[AND_IMP_INTRO] THEN
20226  ONCE_REWRITE_TAC [METIS [] ``-f x <= -f y <=> (\x. -f x) x <= (\y. -f y) y:real``] THEN
20227  ONCE_REWRITE_TAC [METIS [] ``interval [(-f a,-f b:real)] =
20228                               interval [((\x. -f x) a,(\x. -f x) b)]``] THEN
20229  DISCH_THEN(MP_TAC o MATCH_MP HAS_BOUNDED_VARIATION_COMPOSE_INCREASING) THEN
20230  SIMP_TAC std_ss [o_DEF, REAL_NEG_NEG]
20231QED
20232
20233Theorem HAS_BOUNDED_VARIATION_ON_ID:
20234   !a b. (\x. x) has_bounded_variation_on interval[a,b]
20235Proof
20236  REPEAT GEN_TAC THEN MATCH_MP_TAC INCREASING_BOUNDED_VARIATION THEN
20237  SIMP_TAC std_ss []
20238QED
20239
20240Theorem HAS_BOUNDED_VARIATION_ON_COMBINE_GEN:
20241   !f:real->real s a.
20242        is_interval s
20243        ==> (f has_bounded_variation_on s <=>
20244             f has_bounded_variation_on {x | x IN s /\ x <= a} /\
20245             f has_bounded_variation_on {x | x IN s /\ x >= a})
20246Proof
20247  REPEAT STRIP_TAC THEN EQ_TAC THENL
20248   [DISCH_THEN(fn th => CONJ_TAC THEN MP_TAC th) THEN
20249    MATCH_MP_TAC(SIMP_RULE std_ss [IMP_CONJ_ALT]
20250      HAS_BOUNDED_VARIATION_ON_SUBSET) THEN
20251    SIMP_TAC std_ss [SUBSET_RESTRICT],
20252    ALL_TAC] THEN
20253  DISCH_TAC THEN REWRITE_TAC[HAS_BOUNDED_VARIATION_NONTRIVIAL] THEN
20254  SUBGOAL_THEN ``bounded(IMAGE (f:real->real) s)`` MP_TAC THENL
20255   [MATCH_MP_TAC BOUNDED_SUBSET THEN
20256    EXISTS_TAC
20257     ``IMAGE (f:real->real)
20258            ({x | x IN s /\ x <= a} UNION
20259             {x | x IN s /\ x >= a})`` THEN
20260    CONJ_TAC THENL
20261     [REWRITE_TAC[IMAGE_UNION, BOUNDED_UNION] THEN CONJ_TAC THEN
20262      MATCH_MP_TAC HAS_BOUNDED_VARIATION_ON_IMP_BOUNDED THEN
20263      ASM_REWRITE_TAC[] THEN
20264      ONCE_REWRITE_TAC [METIS [] ``(x <= a <=> (\x. x <= a) x) /\
20265                                   (x >= a <=> (\x. x >= a) x)``] THEN
20266      REWRITE_TAC[SET_RULE ``{x | x IN s /\ P x} = s INTER {x | P x}``] THEN
20267      MATCH_MP_TAC IS_INTERVAL_INTER THEN ASM_REWRITE_TAC[] THEN
20268      SIMP_TAC std_ss [IS_INTERVAL_CASES, real_ge] THEN METIS_TAC[],
20269      MATCH_MP_TAC IMAGE_SUBSET THEN
20270      SIMP_TAC std_ss [SUBSET_DEF, GSPECIFICATION, IN_UNION] THEN REAL_ARITH_TAC],
20271    SIMP_TAC std_ss [BOUNDED_POS, FORALL_IN_IMAGE] THEN
20272    DISCH_THEN(X_CHOOSE_THEN ``D:real`` STRIP_ASSUME_TAC) THEN
20273    FIRST_X_ASSUM(CONJUNCTS_THEN MP_TAC) THEN
20274    REWRITE_TAC[has_bounded_variation_on, has_bounded_setvariation_on] THEN
20275    SIMP_TAC std_ss [LEFT_IMP_EXISTS_THM] THEN
20276    X_GEN_TAC ``C:real`` THEN DISCH_TAC THEN
20277    X_GEN_TAC ``B:real`` THEN DISCH_TAC] THEN
20278  EXISTS_TAC ``&4 * D + B + C:real`` THEN
20279  MAP_EVERY X_GEN_TAC [``d:(real->bool)->bool``, ``t:real->bool``] THEN
20280  STRIP_TAC THEN
20281  ABBREV_TAC ``dl = {k:real->bool |
20282                    k IN d /\ k SUBSET {x | x IN s /\ x <= a}}`` THEN
20283  ABBREV_TAC ``dr = {k:real->bool |
20284                    k IN d /\ k SUBSET {x | x IN s /\ x >= a}}`` THEN
20285  UNDISCH_TAC ``!d t.
20286        d division_of t /\ t SUBSET {x | x IN s /\ x >= a} ==>
20287        sum d (\k. abs
20288               (f (interval_upperbound k) -
20289                f (interval_lowerbound k))) <= C`` THEN DISCH_TAC THEN
20290  FIRST_X_ASSUM (MP_TAC o SPECL
20291   [``dr:(real->bool)->bool``, ``BIGUNION dr:real->bool``]) THEN
20292  FIRST_X_ASSUM (MP_TAC o SPECL
20293   [``dl:(real->bool)->bool``, ``BIGUNION dl:real->bool``]) THEN
20294  KNOW_TAC ``dl division_of BIGUNION dl:real->bool /\
20295    BIGUNION dl SUBSET {x | x IN s /\ x <= a}`` THENL
20296   [CONJ_TAC THENL [MATCH_MP_TAC DIVISION_OF_SUBSET, ASM_SET_TAC[]] THEN
20297    EXISTS_TAC ``d:(real->bool)->bool`` THEN
20298    CONJ_TAC THENL [METIS_TAC[DIVISION_OF_UNION_SELF], ASM_SET_TAC[]],
20299    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
20300    ONCE_REWRITE_TAC[TAUT `p ==> q ==> r <=> q ==> p ==> r`]] THEN
20301  KNOW_TAC ``dr division_of BIGUNION dr:real->bool /\
20302    BIGUNION dr SUBSET {x | x IN s /\ x >= a}`` THENL
20303  [CONJ_TAC THENL [MATCH_MP_TAC DIVISION_OF_SUBSET, ASM_SET_TAC[]] THEN
20304    EXISTS_TAC ``d:(real->bool)->bool`` THEN
20305    CONJ_TAC THENL [METIS_TAC[DIVISION_OF_UNION_SELF], ASM_SET_TAC[]],
20306    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
20307    ONCE_REWRITE_TAC[TAUT `p ==> q ==> r <=> q ==> p ==> r`]] THEN
20308  UNDISCH_TAC ``d division_of t`` THEN DISCH_TAC THEN
20309  FIRST_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_FINITE) THEN
20310  MATCH_MP_TAC(REAL_ARITH
20311   ``u <= (s + t) + d ==> s <= b ==> t <= c ==> u <= d + b + c:real``) THEN
20312  W(MP_TAC o PART_MATCH (rand o rand)
20313    SUM_UNION_NONZERO o lhand o rand o snd) THEN
20314  KNOW_TAC ``FINITE (dl :(real -> bool) -> bool) /\
20315             FINITE (dr :(real -> bool) -> bool) /\
20316   (!(x :real -> bool). x IN dl INTER dr ==>
20317    ((\(k :real -> bool).
20318        abs ((f :real -> real) (interval_upperbound k) -
20319           f (interval_lowerbound k))) x = (0 : real)))`` THENL
20320   [MAP_EVERY EXPAND_TAC ["dl", "dr"] THEN
20321    SIMP_TAC std_ss [IN_INTER, GSPECIFICATION] THEN
20322    ASM_SIMP_TAC std_ss [FINITE_RESTRICT, IMP_CONJ] THEN
20323    UNDISCH_TAC ``d division_of t`` THEN DISCH_TAC THEN
20324    FIRST_ASSUM(fn th =>
20325     SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION_NONEMPTY th]) THEN
20326    SIMP_TAC std_ss [INTERVAL_LOWERBOUND_NONEMPTY, INTERVAL_UPPERBOUND_NONEMPTY] THEN
20327    REWRITE_TAC[AND_IMP_INTRO, GSYM SUBSET_INTER, GSYM CONJ_ASSOC] THEN
20328    ONCE_REWRITE_TAC [METIS [] ``(x <= a <=> (\x. x <= a) x) /\
20329                                 (x >= a <=> (\x. x >= a) x)``] THEN
20330    REWRITE_TAC [SET_RULE
20331     ``{x | x IN P /\ Q x} INTER {x | x IN P /\ R x} = {x | x IN P /\ Q x /\ R x}``] THEN
20332    SIMP_TAC std_ss [REAL_ARITH ``x <= a /\ x >= a <=> (x = a:real)``] THEN
20333    REPEAT STRIP_TAC THEN REWRITE_TAC[ABS_ZERO, REAL_SUB_0] THEN AP_TERM_TAC THEN
20334    FIRST_X_ASSUM(MP_TAC o MATCH_MP (SET_RULE
20335     ``s SUBSET {x | x IN t /\ (x = a)} ==> s SUBSET {a}``)) THEN
20336    REWRITE_TAC[GSYM INTERVAL_SING, SUBSET_INTERVAL] THEN
20337    FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [INTERVAL_NE_EMPTY]) THEN
20338    REAL_ARITH_TAC,
20339    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
20340    DISCH_THEN(SUBST1_TAC o SYM)] THEN
20341  MATCH_MP_TAC(REAL_ARITH ``s - t <= b ==> s <= t + b:real``) THEN
20342  W(MP_TAC o PART_MATCH (rand o rand) SUM_DIFF' o lhand o snd) THEN
20343  ASM_SIMP_TAC std_ss [] THEN
20344  KNOW_TAC ``dl UNION (dr:(real->bool)->bool) SUBSET d`` THENL
20345  [ASM_SET_TAC[], DISCH_TAC THEN ASM_REWRITE_TAC [] THEN
20346   POP_ASSUM K_TAC THEN DISCH_THEN(SUBST1_TAC o SYM)] THEN
20347  SUBGOAL_THEN
20348   ``FINITE(d DIFF (dl UNION dr):(real->bool)->bool) /\
20349     CARD(d DIFF (dl UNION dr)) <= 2``
20350  STRIP_ASSUME_TAC THENL
20351   [MATCH_MP_TAC(METIS[CARD_SUBSET, LESS_EQ_TRANS, FINITE_SUBSET]
20352     ``!t. s SUBSET t /\ FINITE t /\ CARD t <= 2
20353          ==> FINITE s /\ CARD s <= 2``) THEN
20354    EXISTS_TAC ``{k | k IN d /\ ~(content k = &0) /\ a IN k}`` THEN
20355    ASM_SIMP_TAC std_ss [FINITE_RESTRICT] THEN
20356    SUBST1_TAC(MESON[EXP_1] ``2 = 2 EXP 1``) THEN
20357    CONJ_TAC THENL
20358     [ALL_TAC,
20359      MATCH_MP_TAC DIVISION_COMMON_POINT_BOUND THEN ASM_MESON_TAC[]] THEN
20360    GEN_REWR_TAC I [SUBSET_DEF] THEN MAP_EVERY EXPAND_TAC ["dl", "dr"] THEN
20361    SIMP_TAC std_ss [IN_DIFF, IMP_CONJ, GSPECIFICATION, IN_UNION] THEN
20362    UNDISCH_TAC ``d division_of t`` THEN DISCH_TAC THEN
20363    FIRST_ASSUM(fn th =>
20364      SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION_NONEMPTY th]) THEN
20365    SIMP_TAC std_ss [INTERVAL_LOWERBOUND_NONEMPTY, INTERVAL_UPPERBOUND_NONEMPTY] THEN
20366    ONCE_REWRITE_TAC [METIS [] ``(x <= a <=> (\x. x <= a) x) /\
20367                                 (x >= a <=> (\x. x >= a) x)``] THEN
20368    REWRITE_TAC[SET_RULE ``{x | x IN s /\ P x} = s INTER {x | P x}``] THEN
20369    MAP_EVERY X_GEN_TAC [``u:real``, ``v:real``] THEN STRIP_TAC THEN
20370    SUBGOAL_THEN ``interval[u:real,v] SUBSET s`` ASSUME_TAC THENL
20371     [METIS_TAC[division_of, SUBSET_DEF], ASM_REWRITE_TAC[SUBSET_INTER]] THEN
20372    SIMP_TAC std_ss [CONTENT_EQ_0, IN_INTERVAL, SUBSET_DEF, GSPECIFICATION] THEN
20373    REAL_ARITH_TAC,
20374    ALL_TAC] THEN
20375  MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC
20376   ``&(CARD(d DIFF (dl UNION dr):(real->bool)->bool)) * &2 * D:real`` THEN
20377  CONJ_TAC THENL
20378   [REWRITE_TAC [GSYM REAL_MUL_ASSOC] THEN
20379    MATCH_MP_TAC SUM_BOUND' THEN ASM_SIMP_TAC std_ss [] THEN
20380    REWRITE_TAC[IN_DIFF, IMP_CONJ] THEN UNDISCH_TAC ``d division_of t`` THEN
20381    DISCH_TAC THEN FIRST_ASSUM(fn th =>
20382      SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION_NONEMPTY th]) THEN
20383    SIMP_TAC std_ss [INTERVAL_LOWERBOUND_NONEMPTY, INTERVAL_UPPERBOUND_NONEMPTY] THEN
20384    REPEAT STRIP_TAC THEN MATCH_MP_TAC(REAL_ARITH
20385     ``abs(x:real) <= d /\ abs y <= d ==> abs(x - y) <= &2 * d:real``) THEN
20386    ASM_MESON_TAC[division_of, SUBSET_DEF, ENDS_IN_INTERVAL],
20387    ASM_SIMP_TAC std_ss [REAL_MUL_ASSOC, REAL_LE_RMUL] THEN
20388    REWRITE_TAC[REAL_ARITH ``x * &2 <= &4 <=> x <= &2:real``] THEN
20389    ASM_REWRITE_TAC[REAL_OF_NUM_LE]]
20390QED
20391
20392Theorem HAS_BOUNDED_VARIATION_ON_CLOSURE:
20393   !f:real->real s.
20394        is_interval s /\ f has_bounded_variation_on s
20395        ==> f has_bounded_variation_on (closure s)
20396Proof
20397  REPEAT STRIP_TAC THEN
20398  FIRST_ASSUM(STRIP_ASSUME_TAC o MATCH_MP CARD_FRONTIER_INTERVAL) THEN
20399  SUBGOAL_THEN ``bounded (IMAGE (f:real->real) (closure (s:real->bool)))`` MP_TAC THENL
20400   [MATCH_MP_TAC BOUNDED_SUBSET THEN
20401    EXISTS_TAC ``IMAGE (f:real->real) (s UNION frontier s)`` THEN
20402    CONJ_TAC THENL
20403     [ASM_REWRITE_TAC[IMAGE_UNION, BOUNDED_UNION] THEN
20404      ASM_SIMP_TAC std_ss [HAS_BOUNDED_VARIATION_ON_IMP_BOUNDED] THEN
20405      ASM_SIMP_TAC std_ss [FINITE_IMP_BOUNDED, IMAGE_FINITE],
20406      REWRITE_TAC[frontier] THEN
20407      MP_TAC(ISPEC ``s:real->bool`` INTERIOR_SUBSET) THEN SET_TAC[]],
20408    SIMP_TAC std_ss [BOUNDED_POS, FORALL_IN_IMAGE] THEN
20409    DISCH_THEN(X_CHOOSE_THEN ``B:real`` STRIP_ASSUME_TAC) THEN
20410    UNDISCH_TAC ``(f:real->real) has_bounded_variation_on s`` THEN
20411    REWRITE_TAC[has_bounded_setvariation_on, has_bounded_variation_on] THEN
20412    DISCH_THEN(X_CHOOSE_THEN ``kk:real`` STRIP_ASSUME_TAC) THEN
20413    EXISTS_TAC ``kk + &8 * B:real`` THEN
20414    MAP_EVERY X_GEN_TAC [``d:(real->bool)->bool``, ``u:real->bool``] THEN
20415    STRIP_TAC THEN FIRST_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_OF_FINITE) THEN
20416    SUBGOAL_THEN
20417     ``d = { k:real->bool |
20418            k IN d /\ k SUBSET s} UNION {k | k IN d /\ ~(k SUBSET s)}``
20419    SUBST1_TAC THENL [SET_TAC[], ALL_TAC] THEN
20420    KNOW_TAC ``sum {k | k IN d /\ k SUBSET s}
20421       (\k. abs (f (interval_upperbound k) - f (interval_lowerbound k))) +
20422            sum {k | k IN d /\ ~(k SUBSET s)}
20423       (\k. abs (f (interval_upperbound k) - f (interval_lowerbound k))) <=
20424            kk + &8 * B:real /\
20425         FINITE {k | k IN d /\ k SUBSET s} /\
20426         FINITE {k | k IN d /\ ~(k SUBSET s)} /\
20427         DISJOINT {k | k IN d /\ k SUBSET s} {k | k IN d /\ ~(k SUBSET s)}`` THENL
20428    [ALL_TAC, METIS_TAC [SUM_UNION]] THEN ASM_SIMP_TAC std_ss [FINITE_RESTRICT] THEN
20429    CONJ_TAC THENL [MATCH_MP_TAC REAL_LE_ADD2, SET_TAC[]] THEN CONJ_TAC THENL
20430     [FULL_SIMP_TAC std_ss [] THEN
20431      FIRST_X_ASSUM MATCH_MP_TAC THEN
20432      EXISTS_TAC ``BIGUNION {k:real->bool | k IN d /\ k SUBSET s}`` THEN
20433      CONJ_TAC THENL [MATCH_MP_TAC DIVISION_OF_SUBSET, SET_TAC[]] THEN
20434      EXISTS_TAC ``d:(real->bool)->bool`` THEN
20435      CONJ_TAC THENL [ASM_MESON_TAC[DIVISION_OF_UNION_SELF], SET_TAC[]],
20436      ONCE_REWRITE_TAC[GSYM SUM_SUPPORT] THEN
20437      SIMP_TAC std_ss [support, GSPECIFICATION, NEUTRAL_REAL_ADD] THEN
20438      REWRITE_TAC[ABS_ZERO, REAL_SUB_0] THEN
20439      MP_TAC(ISPECL
20440       [``{k | (k IN d /\ ~(k SUBSET s)) /\
20441              ~((f:real->real)(interval_upperbound k) =
20442                f (interval_lowerbound k))}``,
20443        ``\k. abs ((f:real->real) (interval_upperbound k) -
20444                    f (interval_lowerbound k))``,
20445        ``&2 * B:real``] SUM_BOUND') THEN
20446      ASM_SIMP_TAC std_ss [GSYM CONJ_ASSOC, FINITE_RESTRICT, FORALL_IN_GSPEC] THEN
20447      KNOW_TAC ``(!(k :real -> bool).
20448         k IN (d :(real -> bool) -> bool) /\ ~(k SUBSET (s :real -> bool)) /\
20449        (f :real -> real) (interval_upperbound k) <>
20450         f (interval_lowerbound k) ==>
20451        abs (f (interval_upperbound k) - f (interval_lowerbound k)) <=
20452        (2 :real) * (B :real))`` THENL
20453       [ONCE_REWRITE_TAC[IMP_CONJ] THEN UNDISCH_TAC ``d division_of u`` THEN
20454        DISCH_TAC THEN FIRST_ASSUM(fn th =>
20455          SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION_NONEMPTY th]) THEN
20456        SIMP_TAC std_ss [INTERVAL_LOWERBOUND_NONEMPTY,
20457                 INTERVAL_UPPERBOUND_NONEMPTY] THEN
20458        MAP_EVERY X_GEN_TAC [``a:real``, ``b:real``] THEN STRIP_TAC THEN
20459        STRIP_TAC THEN MATCH_MP_TAC(REAL_ARITH
20460         ``abs(x) <= B /\ abs(y) <= B ==> abs(y - x:real) <= &2 * B``) THEN
20461        CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
20462        UNDISCH_TAC ``d division_of u`` THEN DISCH_TAC THEN
20463        FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [division_of]) THEN
20464        DISCH_THEN (CONJUNCTS_THEN2 K_TAC MP_TAC) THEN
20465        DISCH_THEN (CONJUNCTS_THEN2 MP_TAC K_TAC) THEN
20466        DISCH_THEN(MP_TAC o SPEC ``interval[a:real,b]``) THEN
20467        ASM_REWRITE_TAC[] THENL
20468        [ONCE_REWRITE_TAC [METIS []
20469         ``(?a' b'. interval [(a,b)] = interval [(a',b')]) =
20470           (\a. (?a' b'. interval [(a,b)] = interval [(a',b')])) a``],
20471         ONCE_REWRITE_TAC [METIS []
20472         ``(?a' b'. interval [(a,b)] = interval [(a',b')]) =
20473           (\b. (?a' b'. interval [(a,b)] = interval [(a',b')])) b``]]  THEN
20474        MATCH_MP_TAC(SET_RULE
20475         ``u SUBSET s /\ x IN i ==> i SUBSET u /\ P x ==> x IN s``) THEN
20476        ASM_REWRITE_TAC[ENDS_IN_INTERVAL],
20477        DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
20478        MATCH_MP_TAC(SIMP_RULE std_ss [IMP_CONJ_ALT] REAL_LE_TRANS) THEN
20479        ASM_SIMP_TAC std_ss [REAL_MUL_ASSOC, REAL_LE_RMUL] THEN
20480        REWRITE_TAC[REAL_ARITH ``x * &2 <= &8 <=> x <= &4:real``] THEN
20481        REWRITE_TAC[REAL_OF_NUM_LE] THEN
20482        MATCH_MP_TAC LESS_EQ_TRANS THEN EXISTS_TAC
20483         ``CARD(BIGUNION {{k | k IN d /\ ~(content k = &0) /\ x IN k}
20484                       | (x:real) IN frontier s})`` THEN
20485        CONJ_TAC THENL
20486         [MATCH_MP_TAC (SIMP_RULE std_ss [AND_IMP_INTRO,
20487                        GSYM RIGHT_FORALL_IMP_THM] CARD_SUBSET) THEN
20488          CONJ_TAC THENL
20489          [MATCH_MP_TAC FINITE_BIGUNION THEN
20490           ASM_SIMP_TAC std_ss [FORALL_IN_GSPEC, FINITE_RESTRICT] THEN
20491           ASM_SIMP_TAC real_ss [IMAGE_FINITE, GSYM IMAGE_DEF, BIGUNION_IMAGE],
20492           ALL_TAC] THEN
20493          ASM_SIMP_TAC std_ss [FORALL_IN_GSPEC, FINITE_RESTRICT] THEN
20494          ASM_SIMP_TAC real_ss [IMAGE_FINITE, GSYM IMAGE_DEF, BIGUNION_IMAGE] THEN
20495          GEN_REWR_TAC I [SUBSET_DEF] THEN SIMP_TAC std_ss [GSPECIFICATION] THEN
20496          ONCE_REWRITE_TAC[IMP_CONJ] THEN UNDISCH_TAC ``d division_of u`` THEN
20497          DISCH_TAC THEN FIRST_ASSUM(fn th =>
20498            SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION_NONEMPTY th]) THEN
20499          SIMP_TAC std_ss [INTERVAL_LOWERBOUND_NONEMPTY,
20500                 INTERVAL_UPPERBOUND_NONEMPTY] THEN
20501          SIMP_TAC std_ss [INTERVAL_NE_EMPTY, CONTENT_CLOSED_INTERVAL, REAL_SUB_0] THEN
20502          REPEAT STRIP_TAC THEN
20503          FIRST_X_ASSUM(MP_TAC o MATCH_MP (SET_RULE
20504           ``~(s SUBSET t) ==> s SUBSET closure t
20505                ==> ?x. x IN (closure t DIFF t) /\ x IN s``)) THEN
20506          KNOW_TAC ``interval [(a,b:real)] SUBSET closure s`` THENL
20507          [ASM_MESON_TAC[division_of, SUBSET_DEF],
20508           DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
20509          REWRITE_TAC[frontier] THEN
20510          MP_TAC(ISPEC ``s:real->bool`` INTERIOR_SUBSET) THEN ASM_SET_TAC[],
20511          MATCH_MP_TAC LESS_EQ_TRANS THEN EXISTS_TAC ``CARD(frontier s:real->bool) * 2`` THEN
20512          CONJ_TAC THENL [ALL_TAC, ASM_SIMP_TAC arith_ss []] THEN
20513          ONCE_REWRITE_TAC [METIS []
20514           ``{k | k IN d /\ content k <> 0 /\ x IN k} =
20515             (\x. {k | k IN d /\ content k <> 0 /\ x IN k}) x``] THEN
20516          MATCH_MP_TAC CARD_BIGUNION_LE THEN
20517          ASM_SIMP_TAC std_ss [GSYM FINITE_HAS_SIZE, FINITE_RESTRICT] THEN
20518          SUBST1_TAC(METIS [EXP_1] `` 2n = 2 EXP 1``) THEN
20519          REPEAT STRIP_TAC THEN SIMP_TAC std_ss [] THEN
20520          SUBST1_TAC(METIS [EXP_1] `` 2n = 2 EXP 1``) THEN
20521          MATCH_MP_TAC DIVISION_COMMON_POINT_BOUND THEN METIS_TAC[]]]]]
20522QED
20523
20524Theorem HAS_BOUNDED_VARIATION_ON_SING:
20525   !f a. f has_bounded_variation_on {a}
20526Proof
20527  REWRITE_TAC[has_bounded_variation_on, has_bounded_setvariation_on,
20528              REWRITE_RULE[INTERVAL_SING] DIVISION_OF_SING] THEN
20529  REPEAT GEN_TAC THEN EXISTS_TAC ``&0:real`` THEN
20530  MAP_EVERY X_GEN_TAC [``d:(real->bool)->bool``, ``t:real->bool``] THEN
20531  STRIP_TAC THEN MATCH_MP_TAC REAL_EQ_IMP_LE THEN MATCH_MP_TAC SUM_EQ_0 THEN
20532  FIRST_ASSUM(fn th =>
20533    SIMP_TAC std_ss [MATCH_MP FORALL_IN_DIVISION_NONEMPTY th]) THEN
20534  SIMP_TAC std_ss [INTERVAL_LOWERBOUND_NONEMPTY, INTERVAL_UPPERBOUND_NONEMPTY] THEN
20535  MAP_EVERY X_GEN_TAC [``u:real``, ``v:real``] THEN STRIP_TAC THEN
20536  REWRITE_TAC[ABS_ZERO, REAL_SUB_0] THEN AP_TERM_TAC THEN
20537  SUBGOAL_THEN ``interval[u:real,v] SUBSET interval[a,a]`` MP_TAC THENL
20538   [REWRITE_TAC[INTERVAL_SING] THEN ASM_MESON_TAC[division_of, SUBSET_DEF],
20539    REWRITE_TAC[SUBSET_INTERVAL] THEN
20540    FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [INTERVAL_NE_EMPTY]) THEN
20541    REAL_ARITH_TAC]
20542QED
20543
20544Theorem INCREASING_LEFT_LIMIT:
20545   !f a b c.
20546        (!x y. x IN interval[a,b] /\ y IN interval[a,b] /\ x <= y
20547               ==> (f x) <= (f y)) /\
20548        c IN interval[a,b]
20549       ==> ?l. (f --> l) (at c within interval[a,c])
20550Proof
20551  REPEAT STRIP_TAC THEN EXISTS_TAC
20552   ``(sup {(f x) | x IN interval[a,b] /\ x < c})`` THEN
20553  ONCE_REWRITE_TAC [METIS [] ``{f x | x IN interval [(a,b)] /\ x < c} =
20554                          {f x | (\x. x IN interval [(a,b)] /\ x < c) x}``] THEN
20555  ONCE_REWRITE_TAC[SIMPLE_IMAGE_GEN] THEN SIMP_TAC std_ss [LIM_WITHIN] THEN
20556  REWRITE_TAC[dist] THEN
20557  ASM_CASES_TAC ``{x | x IN interval[a,b] /\ x < c} = {}`` THENL
20558   [GEN_TAC THEN DISCH_TAC THEN EXISTS_TAC ``&1:real`` THEN
20559    REWRITE_TAC[REAL_LT_01] THEN
20560    UNDISCH_TAC ``{x:real | x IN interval [(a,b)] /\ x < c} = {}`` THEN
20561    DISCH_TAC THEN
20562    FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [EXTENSION]) THEN
20563    DISCH_TAC THEN GEN_TAC THEN POP_ASSUM (MP_TAC o SPEC ``x:real``) THEN
20564    MATCH_MP_TAC(TAUT `(a ==> ~b) ==> a ==> b ==> c`) THEN
20565    SIMP_TAC std_ss [NOT_IN_EMPTY, GSPECIFICATION, IN_INTERVAL] THEN
20566    RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN POP_ASSUM MP_TAC THEN
20567    POP_ASSUM MP_TAC THEN REAL_ARITH_TAC,
20568    ALL_TAC] THEN
20569  X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
20570  MP_TAC(ISPEC ``{((f:real->real) x) | x IN interval[a,b] /\ x < c}`` SUP) THEN
20571  ASM_SIMP_TAC std_ss [FORALL_IN_GSPEC] THEN
20572  KNOW_TAC ``{(f:real->real) x | x IN interval [(a,b)] /\ x < c} <> {} /\
20573             (?b'. !x. x IN interval [(a,b)] /\ x < c ==> f x <= b')`` THENL
20574   [CONJ_TAC THENL
20575     [ONCE_REWRITE_TAC [METIS [] ``{f x | x IN interval [(a,b)] /\ x < c} =
20576                          {f x | (\x. x IN interval [(a,b)] /\ x < c) x}``] THEN
20577      ONCE_REWRITE_TAC[SIMPLE_IMAGE_GEN] THEN ASM_SIMP_TAC std_ss [IMAGE_EQ_EMPTY],
20578      EXISTS_TAC ``(f(b:real)):real`` THEN REPEAT STRIP_TAC THEN
20579      FIRST_X_ASSUM MATCH_MP_TAC THEN REWRITE_TAC[IN_INTERVAL] THEN
20580      RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN ASM_REAL_ARITH_TAC],
20581    DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
20582    ONCE_REWRITE_TAC [METIS [] ``{f x | x IN interval [(a,b)] /\ x < c} =
20583                          {f x | (\x. x IN interval [(a,b)] /\ x < c) x}``] THEN
20584    ONCE_REWRITE_TAC[SIMPLE_IMAGE_GEN] THEN SIMP_TAC std_ss [IMAGE_ID] THEN
20585    ABBREV_TAC ``s = sup (IMAGE (\x. (f x))
20586                        {x | x IN interval[a,b] /\ x < c})`` THEN
20587    ASM_SIMP_TAC std_ss [] THEN
20588    DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC (MP_TAC o SPEC ``s - e:real``)) THEN
20589    FULL_SIMP_TAC std_ss [METIS [ETA_AX] ``(\x. f x) = f:real->real``] THEN
20590    ASM_SIMP_TAC std_ss [REAL_ARITH ``&0 < e ==> ~(s <= s - e:real)``, NOT_FORALL_THM] THEN
20591    SIMP_TAC std_ss [NOT_IMP, REAL_NOT_LE, IN_INTERVAL] THEN
20592    DISCH_THEN(X_CHOOSE_THEN ``d:real`` STRIP_ASSUME_TAC) THEN
20593    EXISTS_TAC ``c - d:real`` THEN
20594    RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN
20595    CONJ_TAC THENL [POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
20596                    REAL_ARITH_TAC, ALL_TAC] THEN
20597    X_GEN_TAC ``x:real`` THEN STRIP_TAC THEN
20598    FIRST_X_ASSUM(MP_TAC o SPECL [``d:real``, ``x:real``]) THEN
20599    FIRST_X_ASSUM(MP_TAC o SPEC ``x:real``) THEN ASM_REAL_ARITH_TAC]
20600QED
20601
20602Theorem DECREASING_LEFT_LIMIT:
20603   !f a b c.
20604        (!x y. x IN interval[a,b] /\ y IN interval[a,b] /\ x <= y
20605               ==> (f y) <= (f x)) /\
20606        c IN interval[a,b]
20607        ==> ?l. (f --> l) (at c within interval[a,c])
20608Proof
20609  REPEAT STRIP_TAC THEN
20610  MP_TAC(ISPECL
20611   [``\x. -((f:real->real) x)``, ``a:real``, ``b:real``, ``c:real``]
20612        INCREASING_LEFT_LIMIT) THEN
20613  ASM_SIMP_TAC std_ss [REAL_LE_NEG2] THEN
20614  GEN_REWR_TAC (LAND_CONV o ONCE_DEPTH_CONV) [GSYM LIM_NEG_EQ] THEN
20615  SIMP_TAC std_ss [REAL_NEG_NEG, ETA_AX] THEN MESON_TAC[]
20616QED
20617
20618Theorem INCREASING_RIGHT_LIMIT:
20619   !f a b c.
20620        (!x y. x IN interval[a,b] /\ y IN interval[a,b] /\ x <= y
20621               ==> (f x) <= (f y)) /\
20622        c IN interval[a,b]
20623       ==> ?l. (f --> l) (at c within interval[c,b])
20624Proof
20625  REPEAT STRIP_TAC THEN
20626  MP_TAC(ISPECL [``\x. (f:real->real) (-x)``,
20627                 ``-b:real``, ``-a:real``, ``-c:real``]
20628        DECREASING_LEFT_LIMIT) THEN
20629  ASM_SIMP_TAC std_ss [IN_INTERVAL_REFLECT] THEN
20630  ONCE_REWRITE_TAC [METIS []
20631    ``((!x y.
20632    x IN interval [(-b,-a)] /\ y IN interval [(-b,-a)] /\ x <= y ==>
20633    f (-y) <= (f:real->real) (-x))) =
20634      (!x y. (\x y.
20635    x IN interval [(-b,-a)] /\ y IN interval [(-b,-a)] /\ x <= y ==>
20636    f (-y) <= f (-x)) x y)``] THEN
20637  ONCE_REWRITE_TAC[METIS [REAL_NEG_NEG]
20638   ``(!x:real y:real. P x y) <=> (!x y. P (-x) (-y))``] THEN
20639  SIMP_TAC std_ss [IN_INTERVAL_REFLECT, REAL_NEG_NEG] THEN
20640  ASM_SIMP_TAC std_ss [REAL_LE_NEG2] THEN
20641  DISCH_THEN (X_CHOOSE_TAC ``l:real``) THEN EXISTS_TAC ``l:real`` THEN
20642  POP_ASSUM MP_TAC THEN SIMP_TAC std_ss [LIM_WITHIN] THEN
20643  ONCE_REWRITE_TAC [METIS []
20644   ``(!x.
20645       x IN interval [(-b,-c)] /\ 0 < dist (x,-c) /\ dist (x,-c) < d ==>
20646       dist (f (-x),l) < e) =
20647     (!x.
20648       (\x. x IN interval [(-b,-c)] /\ 0 < dist (x,-c) /\ dist (x,-c) < d ==>
20649       dist (f (-x),l) < e) x)``] THEN
20650  GEN_REWR_TAC (LAND_CONV o ONCE_DEPTH_CONV)
20651   [MESON[REAL_NEG_NEG] ``(!x:real. P x) <=> (!x. P (-x))``] THEN
20652  SIMP_TAC std_ss [IN_INTERVAL_REFLECT, REAL_NEG_NEG, dist,
20653              REAL_ARITH ``abs(-x:real - -y) = abs(x - y)``]
20654QED
20655
20656Theorem DECREASING_RIGHT_LIMIT:
20657   !f a b c.
20658        (!x y. x IN interval[a,b] /\ y IN interval[a,b] /\ x <= y
20659               ==> (f y) <= (f x)) /\
20660        c IN interval[a,b]
20661       ==> ?l. (f --> l) (at c within interval[c,b])
20662Proof
20663  REPEAT STRIP_TAC THEN
20664  MP_TAC(ISPECL
20665   [``\x. -((f:real->real) x)``, ``a:real``, ``b:real``, ``c:real``]
20666        INCREASING_RIGHT_LIMIT) THEN
20667  ASM_SIMP_TAC std_ss [REAL_LE_NEG2] THEN
20668  GEN_REWR_TAC (LAND_CONV o ONCE_DEPTH_CONV) [GSYM LIM_NEG_EQ] THEN
20669  SIMP_TAC std_ss [REAL_NEG_NEG, ETA_AX] THEN MESON_TAC[]
20670QED
20671
20672Theorem HAS_BOUNDED_VECTOR_VARIATION_LEFT_LIMIT:
20673   !f:real->real a b c.
20674        f has_bounded_variation_on interval[a,b] /\ c IN interval[a,b]
20675        ==> ?l. (f --> l) (at c within interval[a,c])
20676Proof
20677  REPEAT GEN_TAC THEN DISCH_THEN (CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
20678  DISCH_THEN
20679   (MP_TAC o REWRITE_RULE [HAS_BOUNDED_VARIATION_DARBOUX]) THEN
20680  SIMP_TAC std_ss [LEFT_IMP_EXISTS_THM, CONJ_ASSOC] THEN REPEAT GEN_TAC THEN
20681  DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
20682  REWRITE_TAC[GSYM CONJ_ASSOC] THEN DISCH_THEN(CONJUNCTS_THEN
20683   (MP_TAC o SPEC ``c:real`` o MATCH_MP
20684     (ONCE_REWRITE_RULE[IMP_CONJ] INCREASING_LEFT_LIMIT))) THEN
20685  ASM_SIMP_TAC std_ss [LEFT_IMP_EXISTS_THM] THEN
20686  X_GEN_TAC ``l2:real`` THEN DISCH_TAC THEN
20687  X_GEN_TAC ``l1:real`` THEN DISCH_TAC THEN
20688  EXISTS_TAC ``l1 - l2:real`` THEN
20689  GEN_REWR_TAC (RATOR_CONV o LAND_CONV) [GSYM ETA_AX] THEN
20690  ASM_SIMP_TAC std_ss [LIM_SUB]
20691QED
20692
20693Theorem HAS_BOUNDED_VECTOR_VARIATION_RIGHT_LIMIT:
20694   !f:real->real a b c.
20695        f has_bounded_variation_on interval[a,b] /\ c IN interval[a,b]
20696        ==> ?l. (f --> l) (at c within interval[c,b])
20697Proof
20698  REPEAT GEN_TAC THEN DISCH_THEN (CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
20699  DISCH_THEN
20700   (MP_TAC o REWRITE_RULE [HAS_BOUNDED_VARIATION_DARBOUX]) THEN
20701  SIMP_TAC std_ss [LEFT_IMP_EXISTS_THM, CONJ_ASSOC] THEN REPEAT GEN_TAC THEN
20702  DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
20703  REWRITE_TAC[GSYM CONJ_ASSOC] THEN DISCH_THEN(CONJUNCTS_THEN
20704   (MP_TAC o SPEC ``c:real`` o MATCH_MP
20705     (ONCE_REWRITE_RULE[IMP_CONJ] INCREASING_RIGHT_LIMIT))) THEN
20706  ASM_SIMP_TAC std_ss [LEFT_IMP_EXISTS_THM] THEN
20707  X_GEN_TAC ``l2:real`` THEN DISCH_TAC THEN
20708  X_GEN_TAC ``l1:real`` THEN DISCH_TAC THEN
20709  EXISTS_TAC ``l1 - l2:real`` THEN
20710  GEN_REWR_TAC (RATOR_CONV o LAND_CONV) [GSYM ETA_AX] THEN
20711  ASM_SIMP_TAC std_ss [LIM_SUB]
20712QED
20713
20714Theorem lemma[local]:
20715     !f:real->real a b c.
20716          f has_bounded_variation_on interval[a,b] /\ c IN interval[a,b]
20717          ==> ((\x. (vector_variation(interval[a,x]) f))
20718               continuous (at c within interval[a,c]) <=>
20719              f continuous (at c within interval[a,c]))
20720Proof
20721    REPEAT STRIP_TAC THEN EQ_TAC THENL
20722     [REWRITE_TAC[continuous_within] THEN
20723      SIMP_TAC std_ss [GSPECIFICATION, dist] THEN
20724      DISCH_TAC THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
20725      FIRST_X_ASSUM(MP_TAC o SPEC ``e:real``) THEN ASM_REWRITE_TAC[] THEN
20726      DISCH_THEN (X_CHOOSE_TAC ``d:real``) THEN EXISTS_TAC ``d:real`` THEN
20727      POP_ASSUM MP_TAC THEN STRIP_TAC THEN
20728      ASM_REWRITE_TAC[] THEN X_GEN_TAC ``x:real`` THEN STRIP_TAC THEN
20729      FIRST_X_ASSUM(MP_TAC o SPEC ``x:real``) THEN ASM_REWRITE_TAC[] THEN
20730      MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] REAL_LET_TRANS) THEN
20731      MP_TAC(ISPECL [``f:real->real``, ``a:real``, ``c:real``, ``x:real``]
20732          VECTOR_VARIATION_COMBINE) THEN
20733      KNOW_TAC ``a <= x /\ x <= c /\
20734                 (f:real->real) has_bounded_variation_on interval [(a,c)]`` THENL
20735       [RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN
20736        REPEAT(CONJ_TAC THENL [ASM_REAL_ARITH_TAC, ALL_TAC]) THEN
20737        FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
20738           HAS_BOUNDED_VARIATION_ON_SUBSET)) THEN
20739        REWRITE_TAC[SUBSET_INTERVAL] THEN ASM_REAL_ARITH_TAC,
20740        DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
20741      DISCH_THEN(SUBST1_TAC o SYM) THEN
20742      REWRITE_TAC[REAL_ARITH ``abs(a - (a + b)) = abs b:real``] THEN
20743      MATCH_MP_TAC(REAL_ARITH ``x <= a ==> x <= abs a:real``) THEN
20744      ONCE_REWRITE_TAC[ABS_SUB] THEN
20745      MATCH_MP_TAC VECTOR_VARIATION_GE_ABS_FUNCTION THEN CONJ_TAC THENL
20746       [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
20747          HAS_BOUNDED_VARIATION_ON_SUBSET)),
20748        REWRITE_TAC[SEGMENT] THEN COND_CASES_TAC] THEN
20749      REWRITE_TAC[SUBSET_INTERVAL] THEN
20750      RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN ASM_REAL_ARITH_TAC,
20751      ALL_TAC] THEN
20752    DISCH_TAC THEN ASM_CASES_TAC ``c limit_point_of interval[a:real,c]`` THENL
20753     [ALL_TAC,
20754      ASM_REWRITE_TAC[CONTINUOUS_WITHIN, LIM, TRIVIAL_LIMIT_WITHIN]] THEN
20755    UNDISCH_TAC ``f has_bounded_variation_on interval [(a,b)]`` THEN
20756    DISCH_TAC THEN FIRST_ASSUM(MP_TAC o
20757      REWRITE_RULE [HAS_BOUNDED_VARIATION_DARBOUX]) THEN
20758    SIMP_TAC std_ss [LEFT_IMP_EXISTS_THM] THEN
20759    MAP_EVERY X_GEN_TAC [``g:real->real``, ``h:real->real``] THEN
20760    STRIP_TAC THEN
20761    MP_TAC(ISPECL [``h:real->real``, ``a:real``, ``b:real``, ``c:real``]
20762     INCREASING_LEFT_LIMIT) THEN
20763    MP_TAC(ISPECL [``g:real->real``, ``a:real``, ``b:real``, ``c:real``]
20764     INCREASING_LEFT_LIMIT) THEN
20765    ASM_SIMP_TAC std_ss [LEFT_IMP_EXISTS_THM] THEN
20766    X_GEN_TAC ``gc:real`` THEN DISCH_TAC THEN
20767    X_GEN_TAC ``hc:real`` THEN DISCH_TAC THEN
20768    ABBREV_TAC ``k = gc - (g:real->real) c`` THEN
20769    SUBGOAL_THEN ``hc - (h:real->real) c = k`` ASSUME_TAC THENL
20770     [EXPAND_TAC "k" THEN
20771      ONCE_REWRITE_TAC[REAL_ARITH
20772       ``(hc' - hc:real = gc' - gc) <=> (gc' - hc' = gc - hc)``] THEN
20773      UNDISCH_TAC ``f continuous (at c within interval [(a,c)])`` THEN DISCH_TAC THEN
20774      FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [CONTINUOUS_WITHIN]) THEN
20775      ASM_REWRITE_TAC[] THEN
20776      MATCH_MP_TAC(REWRITE_RULE[TAUT `a /\ b /\ c ==> d <=> a /\ b ==> c ==> d`]
20777        LIM_UNIQUE) THEN
20778      ASM_REWRITE_TAC[TRIVIAL_LIMIT_WITHIN] THEN
20779      GEN_REWR_TAC (RATOR_CONV o LAND_CONV) [GSYM ETA_AX] THEN
20780      ASM_SIMP_TAC std_ss [LIM_SUB],
20781      ALL_TAC] THEN
20782    MAP_EVERY ABBREV_TAC
20783     [``g':real->real = \x. if c <= x then g(x) + k else g(x)``,
20784      ``h':real->real =
20785           \x. if c <= x then h(x) + k else h(x)``] THEN
20786    SUBGOAL_THEN
20787     ``(!x y. x IN interval[a,c] /\ y IN interval[a,c] /\ x <= y
20788             ==> (g' x) <= ((g':real->real) y)) /\
20789      (!x y. x IN interval[a,c] /\ y IN interval[a,c] /\ x <= y
20790             ==> (h' x) <= ((h':real->real) y))``
20791    STRIP_ASSUME_TAC THENL
20792     [MAP_EVERY EXPAND_TAC ["g'", "h'"] THEN SIMP_TAC std_ss [] THEN CONJ_TAC THEN
20793      MAP_EVERY X_GEN_TAC [``x:real``, ``y:real``] THEN
20794      REWRITE_TAC[IN_INTERVAL] THEN STRIP_TAC THEN
20795      (ASM_CASES_TAC ``c <= x:real`` THENL
20796        [SUBGOAL_THEN ``c <= y:real`` ASSUME_TAC THENL
20797          [POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
20798           UNDISCH_TAC ``x <= c:real`` THEN REAL_ARITH_TAC,
20799           ASM_SIMP_TAC std_ss []] THEN
20800         REWRITE_TAC[REAL_LE_RADD] THEN
20801         FIRST_X_ASSUM MATCH_MP_TAC THEN REWRITE_TAC[IN_INTERVAL] THEN
20802         RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN
20803         UNDISCH_TAC `` a <= c /\ c <= b:real`` THEN
20804         POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
20805         POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
20806         POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
20807         POP_ASSUM MP_TAC THEN REAL_ARITH_TAC,
20808         ALL_TAC] THEN
20809       ASM_SIMP_TAC std_ss [] THEN COND_CASES_TAC THEN ASM_SIMP_TAC std_ss [] THENL
20810        [ALL_TAC,
20811         FIRST_X_ASSUM MATCH_MP_TAC THEN REWRITE_TAC[IN_INTERVAL] THEN
20812         RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN
20813         UNDISCH_TAC `` a <= c /\ c <= b:real`` THEN
20814         POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
20815         POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
20816         POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
20817         POP_ASSUM MP_TAC THEN REAL_ARITH_TAC] THEN
20818       SUBGOAL_THEN ``y:real = c`` SUBST_ALL_TAC THENL
20819        [UNDISCH_TAC ``y <= c:real`` THEN POP_ASSUM MP_TAC THEN
20820         REAL_ARITH_TAC, ALL_TAC] THEN
20821       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (METIS []
20822        ``(gc - (g:real->real) c = k)
20823         ==> b <= (g c + (gc - g c)) ==> b <= (g c + k)``)) THEN
20824       REWRITE_TAC[REAL_ARITH ``a + (b - a:real) = b``] THEN
20825       MATCH_MP_TAC(ISPEC ``at c within interval[a:real,c]``
20826          LIM_DROP_LBOUND))
20827      THENL [EXISTS_TAC ``g:real->real``, EXISTS_TAC ``h:real->real``] THEN
20828      ASM_REWRITE_TAC[TRIVIAL_LIMIT_WITHIN, EVENTUALLY_WITHIN] THEN
20829      EXISTS_TAC ``c - x:real`` THEN
20830      (CONJ_TAC THENL [UNDISCH_TAC ``~(c <= x:real)`` THEN
20831                       REAL_ARITH_TAC, ALL_TAC]) THEN
20832      REWRITE_TAC[dist, IN_INTERVAL] THEN
20833      SIMP_TAC std_ss [IN_INTERVAL] THEN REPEAT STRIP_TAC THEN
20834      FIRST_X_ASSUM MATCH_MP_TAC THEN REWRITE_TAC[IN_INTERVAL] THEN
20835      RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN
20836       UNDISCH_TAC `` a <= c /\ c <= b:real`` THEN
20837       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
20838       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
20839       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
20840       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
20841       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
20842       POP_ASSUM MP_TAC THEN REAL_ARITH_TAC,
20843      ALL_TAC] THEN
20844    SUBGOAL_THEN
20845     ``(g':real->real) continuous (at c within interval[a,c]) /\
20846       (h':real->real) continuous (at c within interval[a,c])``
20847    MP_TAC THENL
20848     [MAP_EVERY EXPAND_TAC ["g'", "h'"] THEN
20849      SIMP_TAC std_ss [CONTINUOUS_WITHIN, REAL_LE_REFL] THEN
20850      RULE_ASSUM_TAC(REWRITE_RULE[REAL_ARITH
20851       ``(g - g':real = k) <=> (g' + k = g:real)``]) THEN
20852      ASM_REWRITE_TAC[] THEN CONJ_TAC THEN
20853      FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
20854       (REWRITE_RULE[IMP_CONJ_ALT] LIM_TRANSFORM)) THEN
20855      MAP_EVERY EXPAND_TAC ["g'", "h'"] THEN
20856      REWRITE_TAC[LIM_WITHIN, dist, IN_INTERVAL] THEN
20857      SIMP_TAC std_ss [REAL_ARITH ``x <= c /\ &0 < abs(x - c) ==> ~(c <= x:real)``] THEN
20858      REWRITE_TAC[REAL_SUB_REFL, ABS_N] THEN
20859      MESON_TAC[REAL_LT_01],
20860      ALL_TAC] THEN
20861    REWRITE_TAC[continuous_within] THEN
20862    SIMP_TAC std_ss [GSPECIFICATION, dist] THEN
20863    DISCH_THEN(fn th =>
20864      X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
20865      CONJUNCTS_THEN (MP_TAC o SPEC ``e / &2:real``) th) THEN
20866    ASM_REWRITE_TAC[REAL_HALF] THEN
20867    DISCH_THEN(X_CHOOSE_THEN ``d2:real`` STRIP_ASSUME_TAC) THEN
20868    DISCH_THEN(X_CHOOSE_THEN ``d1:real`` STRIP_ASSUME_TAC) THEN
20869    EXISTS_TAC ``min d1 d2:real`` THEN ASM_REWRITE_TAC[REAL_LT_MIN] THEN
20870    X_GEN_TAC ``d:real`` THEN STRIP_TAC THEN
20871    MP_TAC(ISPECL [``f:real->real``, ``a:real``, ``c:real``, ``d:real``]
20872          VECTOR_VARIATION_COMBINE) THEN
20873    KNOW_TAC ``a <= d /\ d <= c /\
20874      (f:real->real) has_bounded_variation_on interval [(a,c)]`` THENL
20875     [RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN
20876      ASM_SIMP_TAC real_ss [] THEN
20877      FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
20878         HAS_BOUNDED_VARIATION_ON_SUBSET)) THEN
20879      REWRITE_TAC[SUBSET_INTERVAL] THEN
20880      UNDISCH_TAC ``a <= c /\ c <= b:real`` THEN REAL_ARITH_TAC,
20881      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
20882      DISCH_THEN(SUBST1_TAC o SYM)] THEN
20883    REWRITE_TAC[REAL_ARITH ``abs(a - (a + b)) = abs b:real``] THEN
20884    MATCH_MP_TAC(REAL_ARITH ``&0 <= x /\ x < a ==> abs x < a:real``) THEN
20885    CONJ_TAC THENL
20886     [MATCH_MP_TAC VECTOR_VARIATION_POS_LE THEN
20887      FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
20888         HAS_BOUNDED_VARIATION_ON_SUBSET)) THEN
20889      RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN
20890      REWRITE_TAC[SUBSET_INTERVAL] THEN ASM_SIMP_TAC real_ss [],
20891      ALL_TAC] THEN
20892    SUBGOAL_THEN ``f:real->real = \x. g' x - h' x`` SUBST1_TAC THENL
20893     [MAP_EVERY EXPAND_TAC ["g'", "h'"] THEN SIMP_TAC std_ss [FUN_EQ_THM] THEN
20894      GEN_TAC THEN COND_CASES_TAC THEN ASM_SIMP_TAC std_ss [] THEN REAL_ARITH_TAC,
20895      ALL_TAC] THEN
20896    MP_TAC(ISPECL
20897     [``g':real->real``, ``\x. -((h':real->real) x)``,
20898      ``interval[d:real,c]``] VECTOR_VARIATION_TRIANGLE) THEN
20899    KNOW_TAC ``(g':real->real) has_bounded_variation_on interval [(d,c)] /\
20900       (\x. -h' x) has_bounded_variation_on interval [(d,c)]`` THENL
20901     [CONJ_TAC THENL [ALL_TAC, MATCH_MP_TAC HAS_BOUNDED_VARIATION_ON_NEG] THEN
20902      MATCH_MP_TAC HAS_BOUNDED_VARIATION_ON_SUBSET THEN
20903      EXISTS_TAC ``interval[a:real,c]`` THEN
20904      ASM_SIMP_TAC std_ss [INCREASING_BOUNDED_VARIATION, SUBSET_INTERVAL] THEN
20905      RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN ASM_SIMP_TAC real_ss [],
20906      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
20907    SIMP_TAC std_ss [real_sub] THEN MATCH_MP_TAC(REAL_ARITH
20908     ``y * 2 < a /\ z * 2 < a ==> x <= y + z ==> x < a:real``) THEN
20909    REWRITE_TAC[VECTOR_VARIATION_NEG] THEN CONJ_TAC THEN
20910    SIMP_TAC real_ss [GSYM REAL_LT_RDIV_EQ] THEN
20911    W(MP_TAC o PART_MATCH (lhs o rand)
20912      INCREASING_VECTOR_VARIATION o lhand o snd) THENL
20913   [KNOW_TAC ``interval [(d,c)] <> {} /\
20914     (!x y. x IN interval [(d,c)] /\ y IN interval [(d,c)] /\ x <= y ==>
20915      g' x <= (g':real->real) y)`` THENL
20916      [RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN
20917       ASM_REWRITE_TAC[GSYM INTERVAL_EQ_EMPTY, IN_INTERVAL, REAL_NOT_LT] THEN
20918       REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
20919       UNDISCH_TAC `` a <= c /\ c <= b:real`` THEN
20920       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
20921       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
20922       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
20923       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
20924       REAL_ARITH_TAC,
20925       DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
20926       DISCH_THEN SUBST1_TAC],
20927    KNOW_TAC ``interval [(d,c)] <> {} /\
20928     (!x y. x IN interval [(d,c)] /\ y IN interval [(d,c)] /\ x <= y ==>
20929      h' x <= (h':real->real) y)`` THENL
20930      [RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN
20931       ASM_REWRITE_TAC[GSYM INTERVAL_EQ_EMPTY, IN_INTERVAL, REAL_NOT_LT] THEN
20932       REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
20933       UNDISCH_TAC `` a <= c /\ c <= b:real`` THEN
20934       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
20935       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
20936       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
20937       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
20938       REAL_ARITH_TAC,
20939       DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
20940       DISCH_THEN SUBST1_TAC]] THEN
20941    MATCH_MP_TAC(REAL_ARITH ``abs(x - y) < e ==> y - x < e:real``) THEN
20942    FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]
20943QED
20944
20945Theorem VECTOR_VARIATION_CONTINUOUS_LEFT:
20946   !f:real->real a b c.
20947        f has_bounded_variation_on interval[a,b] /\ c IN interval[a,b]
20948        ==> ((\x. (vector_variation(interval[a,x]) f))
20949             continuous (at c within interval[a,c]) <=>
20950            f continuous (at c within interval[a,c]))
20951Proof
20952  REPEAT STRIP_TAC THEN EQ_TAC THENL
20953   [REWRITE_TAC[continuous_within] THEN
20954    SIMP_TAC std_ss [GSPECIFICATION, dist] THEN
20955    DISCH_TAC THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
20956    FIRST_X_ASSUM(MP_TAC o SPEC ``e:real``) THEN ASM_REWRITE_TAC[] THEN
20957    STRIP_TAC THEN EXISTS_TAC ``d:real`` THEN
20958    ASM_REWRITE_TAC[] THEN X_GEN_TAC ``x:real`` THEN STRIP_TAC THEN
20959    FIRST_X_ASSUM(MP_TAC o SPEC ``x:real``) THEN ASM_REWRITE_TAC[] THEN
20960    MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] REAL_LET_TRANS) THEN
20961    MP_TAC(ISPECL [``f:real->real``, ``a:real``, ``c:real``, ``x:real``]
20962        VECTOR_VARIATION_COMBINE) THEN
20963    KNOW_TAC ``a <= x /\ x <= c /\
20964              (f:real->real) has_bounded_variation_on interval [(a,c)]`` THENL
20965     [RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN
20966      REPEAT(CONJ_TAC THENL [ASM_REAL_ARITH_TAC, ALL_TAC]) THEN
20967      FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
20968         HAS_BOUNDED_VARIATION_ON_SUBSET)) THEN
20969      REWRITE_TAC[SUBSET_INTERVAL] THEN ASM_REAL_ARITH_TAC,
20970      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
20971    DISCH_THEN(SUBST1_TAC o SYM) THEN
20972    REWRITE_TAC[REAL_ARITH ``abs(a - (a + b)) = abs b:real``] THEN
20973    REWRITE_TAC[dist] THEN
20974    MATCH_MP_TAC(REAL_ARITH ``x <= a ==> x <= abs a:real``) THEN
20975    ONCE_REWRITE_TAC[ABS_SUB] THEN
20976    MATCH_MP_TAC VECTOR_VARIATION_GE_ABS_FUNCTION THEN CONJ_TAC THENL
20977     [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
20978        HAS_BOUNDED_VARIATION_ON_SUBSET)),
20979      REWRITE_TAC[SEGMENT] THEN COND_CASES_TAC] THEN
20980    REWRITE_TAC[SUBSET_INTERVAL] THEN
20981    RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN ASM_REAL_ARITH_TAC,
20982    ALL_TAC] THEN
20983  DISCH_TAC THEN ASM_CASES_TAC ``c limit_point_of interval[a:real,c]`` THENL
20984   [ALL_TAC,
20985    ASM_REWRITE_TAC[CONTINUOUS_WITHIN, LIM, TRIVIAL_LIMIT_WITHIN]] THEN
20986  MATCH_MP_TAC(CONTINUOUS_WITHIN_COMPARISON) THEN
20987  EXISTS_TAC ``\x. sum { 1n.. 1n}
20988                       (\i. (vector_variation (interval[a,x])
20989                            (\u. (((f:real->real) u)))))`` THEN
20990  SIMP_TAC std_ss [] THEN CONJ_TAC THENL
20991   [ONCE_REWRITE_TAC [METIS []
20992     ``((\x. sum { 1n ..  1n}
20993     (\i. vector_variation (interval [(a,x)]) (\u. f u)))) =
20994       ((\x. sum { 1n ..  1n}
20995     (\i. (\i x. vector_variation (interval [(a,x)]) (\u. f u)) i x)))``] THEN
20996    MATCH_MP_TAC CONTINUOUS_SUM THEN SIMP_TAC std_ss [FINITE_NUMSEG] THEN
20997    REWRITE_TAC[IN_NUMSEG] THEN REPEAT STRIP_TAC THEN
20998    W(MP_TAC o PART_MATCH (lhs o rand) lemma o snd) THEN
20999    METIS_TAC [],
21000    ALL_TAC] THEN
21001  X_GEN_TAC ``x:real`` THEN REWRITE_TAC[IN_INTERVAL] THEN DISCH_TAC THEN
21002  REWRITE_TAC[dist, GSYM SUM_SUB_NUMSEG] THEN
21003  SUBGOAL_THEN
21004  ``(vector_variation(interval [a,c]) (f:real->real) =
21005     vector_variation(interval [a,x]) (f:real->real) +
21006     vector_variation(interval [x,c]) (f:real->real)) /\
21007    (vector_variation(interval [a,c]) (\x. ((f:real->real) x)) =
21008     vector_variation(interval [a,x]) (\x. (f x)) +
21009     vector_variation(interval [x,c]) (\x. (f x)))``
21010   (fn th => ASM_SIMP_TAC std_ss [th])
21011  THENL
21012   [REPEAT STRIP_TAC THEN CONV_TAC SYM_CONV THEN
21013    MATCH_MP_TAC VECTOR_VARIATION_COMBINE THEN
21014    ASM_REWRITE_TAC[] THEN
21015    MATCH_MP_TAC HAS_BOUNDED_VARIATION_ON_SUBSET THEN
21016    EXISTS_TAC ``interval[a:real,b]`` THEN
21017    ASM_REWRITE_TAC[SUBSET_INTERVAL] THEN
21018    RULE_ASSUM_TAC(ONCE_REWRITE_RULE
21019       [HAS_BOUNDED_VARIATION_ON_COMPONENTWISE]) THEN
21020    RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN
21021    ASM_SIMP_TAC std_ss [REAL_LE_REFL],
21022    REWRITE_TAC[REAL_ADD_SUB]] THEN
21023  SIMP_TAC std_ss [NUMSEG_SING, SUM_SING, ETA_AX, REAL_LE_REFL]
21024QED
21025
21026Theorem lemma[local]:
21027     !f:real->real a b c.
21028          f has_bounded_variation_on interval[a,b] /\ c IN interval[a,b]
21029          ==> ((\x. (vector_variation(interval[a,x]) f))
21030               continuous (at c within interval[c,b]) <=>
21031              f continuous (at c within interval[c,b]))
21032Proof
21033    REPEAT STRIP_TAC THEN EQ_TAC THENL
21034     [REWRITE_TAC[continuous_within] THEN
21035      SIMP_TAC std_ss [GSPECIFICATION, dist] THEN
21036      DISCH_TAC THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
21037      FIRST_X_ASSUM(MP_TAC o SPEC ``e:real``) THEN ASM_REWRITE_TAC[] THEN
21038      STRIP_TAC THEN EXISTS_TAC ``d:real`` THEN
21039      ASM_REWRITE_TAC[] THEN X_GEN_TAC ``x:real`` THEN STRIP_TAC THEN
21040      FIRST_X_ASSUM(MP_TAC o SPEC ``x:real``) THEN ASM_REWRITE_TAC[] THEN
21041      MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] REAL_LET_TRANS) THEN
21042      MP_TAC(ISPECL [``f:real->real``, ``a:real``, ``x:real``, ``c:real``]
21043          VECTOR_VARIATION_COMBINE) THEN
21044      KNOW_TAC ``a <= c /\ c <= x /\
21045                (f:real->real) has_bounded_variation_on interval [(a,x)]`` THENL
21046       [RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN
21047        REPEAT(CONJ_TAC THENL [ASM_REAL_ARITH_TAC, ALL_TAC]) THEN
21048        FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
21049           HAS_BOUNDED_VARIATION_ON_SUBSET)) THEN
21050        REWRITE_TAC[SUBSET_INTERVAL] THEN ASM_REAL_ARITH_TAC,
21051        DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
21052      DISCH_THEN(SUBST1_TAC o SYM) THEN
21053      REWRITE_TAC[REAL_ARITH ``abs((a + b) - a) = abs b:real``] THEN
21054      MATCH_MP_TAC(REAL_ARITH ``x <= a ==> x <= abs a:real``) THEN
21055      MATCH_MP_TAC VECTOR_VARIATION_GE_ABS_FUNCTION THEN CONJ_TAC THENL
21056       [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
21057          HAS_BOUNDED_VARIATION_ON_SUBSET)),
21058        REWRITE_TAC[SEGMENT] THEN COND_CASES_TAC] THEN
21059      REWRITE_TAC[SUBSET_INTERVAL] THEN
21060      RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN ASM_REAL_ARITH_TAC,
21061      ALL_TAC] THEN
21062    DISCH_TAC THEN ASM_CASES_TAC ``c limit_point_of interval[c:real,b]`` THENL
21063     [ALL_TAC,
21064      ASM_REWRITE_TAC[CONTINUOUS_WITHIN, LIM, TRIVIAL_LIMIT_WITHIN]] THEN
21065    UNDISCH_TAC ``(f:real->real) has_bounded_variation_on interval [(a,b)]`` THEN
21066    DISCH_TAC THEN FIRST_ASSUM(MP_TAC o
21067      REWRITE_RULE [HAS_BOUNDED_VARIATION_DARBOUX]) THEN
21068    SIMP_TAC std_ss [LEFT_IMP_EXISTS_THM] THEN
21069    MAP_EVERY X_GEN_TAC [``g:real->real``, ``h:real->real``] THEN
21070    STRIP_TAC THEN
21071    MP_TAC(ISPECL [``h:real->real``, ``a:real``, ``b:real``, ``c:real``]
21072     INCREASING_RIGHT_LIMIT) THEN
21073    MP_TAC(ISPECL [``g:real->real``, ``a:real``, ``b:real``, ``c:real``]
21074     INCREASING_RIGHT_LIMIT) THEN
21075    ASM_SIMP_TAC std_ss [LEFT_IMP_EXISTS_THM] THEN
21076    X_GEN_TAC ``gc:real`` THEN DISCH_TAC THEN
21077    X_GEN_TAC ``hc:real`` THEN DISCH_TAC THEN
21078    ABBREV_TAC ``k = gc - (g:real->real) c`` THEN
21079    SUBGOAL_THEN ``hc - (h:real->real) c = k`` ASSUME_TAC THENL
21080     [EXPAND_TAC "k" THEN
21081      ONCE_REWRITE_TAC[REAL_ARITH
21082       ``(hc' - hc:real = gc' - gc) <=> (gc' - hc' = gc - hc)``] THEN
21083      UNDISCH_TAC ``f continuous (at c within interval [(c,b)])`` THEN DISCH_TAC THEN
21084      FIRST_X_ASSUM(MP_TAC o REWRITE_RULE [CONTINUOUS_WITHIN]) THEN
21085      ASM_REWRITE_TAC[] THEN
21086      MATCH_MP_TAC(REWRITE_RULE[TAUT`a /\ b /\ c ==> d <=> a /\ b ==> c ==> d`]
21087        LIM_UNIQUE) THEN
21088      ASM_REWRITE_TAC[TRIVIAL_LIMIT_WITHIN] THEN
21089      GEN_REWR_TAC (RATOR_CONV o LAND_CONV) [GSYM ETA_AX] THEN
21090      ASM_SIMP_TAC std_ss [LIM_SUB],
21091      ALL_TAC] THEN
21092    MAP_EVERY ABBREV_TAC
21093     [``g':real->real = \x. if x <= c then g(x) + k else g(x)``,
21094      ``h':real->real =
21095          \x. if x <= c then h(x) + k else h(x)``] THEN
21096    SUBGOAL_THEN
21097     ``(!x y. x IN interval[c,b] /\ y IN interval[c,b] /\ x <= y
21098             ==> (g' x) <= ((g':real->real) y)) /\
21099       (!x y. x IN interval[c,b] /\ y IN interval[c,b] /\ x <= y
21100             ==> (h' x) <= ((h':real->real) y))``
21101    STRIP_ASSUME_TAC THENL
21102     [MAP_EVERY EXPAND_TAC ["g'", "h'"] THEN SIMP_TAC std_ss [] THEN CONJ_TAC THEN
21103      MAP_EVERY X_GEN_TAC [``x:real``, ``y:real``] THEN
21104      REWRITE_TAC[IN_INTERVAL] THEN STRIP_TAC THEN
21105      (ASM_CASES_TAC ``y <= c:real`` THENL
21106        [SUBGOAL_THEN ``x <= c:real`` ASSUME_TAC THENL
21107          [POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
21108           REAL_ARITH_TAC, ASM_REWRITE_TAC[]] THEN
21109         SIMP_TAC std_ss [REAL_LE_RADD] THEN
21110         FIRST_X_ASSUM MATCH_MP_TAC THEN REWRITE_TAC[IN_INTERVAL] THEN
21111         RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN
21112         UNDISCH_TAC `` a <= c /\ c <= b:real`` THEN
21113         POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
21114         POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
21115         POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
21116         POP_ASSUM MP_TAC THEN REAL_ARITH_TAC,
21117         ALL_TAC] THEN
21118       ASM_SIMP_TAC std_ss [] THEN COND_CASES_TAC THEN ASM_SIMP_TAC std_ss [] THENL
21119        [ALL_TAC,
21120         FIRST_X_ASSUM MATCH_MP_TAC THEN REWRITE_TAC[IN_INTERVAL] THEN
21121         RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN
21122         UNDISCH_TAC `` a <= c /\ c <= b:real`` THEN
21123         POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
21124         POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
21125         POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
21126         POP_ASSUM MP_TAC THEN REAL_ARITH_TAC] THEN
21127       SUBGOAL_THEN ``x:real = c`` SUBST_ALL_TAC THENL
21128        [UNDISCH_TAC ``c <= x:real`` THEN POP_ASSUM MP_TAC THEN
21129         REAL_ARITH_TAC, ALL_TAC] THEN
21130       FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (MESON[]
21131        ``(gc - (g:real->real) c = k)
21132         ==> (g c + (gc - g c)) <= b ==> (g c + k) <= b``)) THEN
21133       REWRITE_TAC[REAL_ARITH ``a + (b - a:real) = b``] THEN
21134       MATCH_MP_TAC(ISPEC ``at c within interval[c:real,b]``
21135          LIM_DROP_UBOUND))
21136      THENL [EXISTS_TAC ``g:real->real``, EXISTS_TAC ``h:real->real``] THEN
21137      ASM_SIMP_TAC std_ss [TRIVIAL_LIMIT_WITHIN, EVENTUALLY_WITHIN] THEN
21138      EXISTS_TAC ``y - c:real`` THEN
21139      (CONJ_TAC THENL [POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
21140                       REAL_ARITH_TAC, ALL_TAC]) THEN
21141      REWRITE_TAC[dist, IN_INTERVAL] THEN
21142      SIMP_TAC std_ss [IN_INTERVAL] THEN REPEAT STRIP_TAC THEN
21143      FIRST_X_ASSUM MATCH_MP_TAC THEN REWRITE_TAC[IN_INTERVAL] THEN
21144      RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN
21145      UNDISCH_TAC `` a <= c /\ c <= b:real`` THEN
21146       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
21147       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
21148       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
21149       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
21150       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
21151       POP_ASSUM MP_TAC THEN REAL_ARITH_TAC,
21152      ALL_TAC] THEN
21153    SUBGOAL_THEN
21154     ``(g':real->real) continuous (at c within interval[c,b]) /\
21155       (h':real->real) continuous (at c within interval[c,b])``
21156    MP_TAC THENL
21157     [MAP_EVERY EXPAND_TAC ["g'", "h'"] THEN
21158      SIMP_TAC std_ss [CONTINUOUS_WITHIN, REAL_LE_REFL] THEN
21159      RULE_ASSUM_TAC(REWRITE_RULE[REAL_ARITH
21160       ``(g - g':real = k) <=> (g' + k = g:real)``]) THEN
21161      ASM_SIMP_TAC std_ss [] THEN CONJ_TAC THEN
21162      FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
21163       (REWRITE_RULE[IMP_CONJ_ALT] LIM_TRANSFORM)) THEN
21164      MAP_EVERY EXPAND_TAC ["g'", "h'"] THEN
21165      SIMP_TAC std_ss [LIM_WITHIN, dist, IN_INTERVAL] THEN
21166      SIMP_TAC std_ss [REAL_ARITH ``c <= x /\ &0 < abs(x - c) ==> ~(x <= c:real)``] THEN
21167      REWRITE_TAC[REAL_SUB_REFL, ABS_N] THEN
21168      MESON_TAC[REAL_LT_01],
21169      ALL_TAC] THEN
21170    REWRITE_TAC[continuous_within] THEN
21171    SIMP_TAC std_ss [dist, GSPECIFICATION] THEN
21172    DISCH_THEN(fn th =>
21173      X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
21174      CONJUNCTS_THEN (MP_TAC o SPEC ``e / &2:real``) th) THEN
21175    ASM_REWRITE_TAC[REAL_HALF] THEN
21176    DISCH_THEN(X_CHOOSE_THEN ``d2:real`` STRIP_ASSUME_TAC) THEN
21177    DISCH_THEN(X_CHOOSE_THEN ``d1:real`` STRIP_ASSUME_TAC) THEN
21178    EXISTS_TAC ``min d1 d2:real`` THEN ASM_REWRITE_TAC[REAL_LT_MIN] THEN
21179    X_GEN_TAC ``d:real`` THEN STRIP_TAC THEN
21180    MP_TAC(ISPECL [``f:real->real``, ``a:real``, ``d:real``, ``c:real``]
21181          VECTOR_VARIATION_COMBINE) THEN
21182    KNOW_TAC ``a <= c /\ c <= d /\
21183              (f:real->real) has_bounded_variation_on interval [(a,d)]`` THENL
21184     [RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN
21185      ASM_SIMP_TAC real_ss [] THEN
21186      FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
21187         HAS_BOUNDED_VARIATION_ON_SUBSET)) THEN
21188      REWRITE_TAC[SUBSET_INTERVAL] THEN ASM_SIMP_TAC real_ss [],
21189      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
21190      DISCH_THEN(SUBST1_TAC o SYM)] THEN
21191    REWRITE_TAC[REAL_ARITH ``(a + b) - a:real = b:real``] THEN
21192    MATCH_MP_TAC(REAL_ARITH ``&0 <= x /\ x < a ==> abs x < a:real``) THEN
21193    CONJ_TAC THENL
21194     [MATCH_MP_TAC VECTOR_VARIATION_POS_LE THEN
21195      FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
21196         HAS_BOUNDED_VARIATION_ON_SUBSET)) THEN
21197      RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN
21198      REWRITE_TAC[SUBSET_INTERVAL] THEN ASM_SIMP_TAC real_ss [],
21199      ALL_TAC] THEN
21200    SUBGOAL_THEN ``f:real->real = \x. g' x - h' x`` SUBST1_TAC THENL
21201     [MAP_EVERY EXPAND_TAC ["g'", "h'"] THEN SIMP_TAC std_ss [FUN_EQ_THM] THEN
21202      GEN_TAC THEN COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC,
21203      ALL_TAC] THEN
21204    MP_TAC(ISPECL
21205     [``g':real->real``, ``\x. -((h':real->real) x)``,
21206      ``interval[c:real,d]``] VECTOR_VARIATION_TRIANGLE) THEN
21207    KNOW_TAC ``(g':real->real) has_bounded_variation_on interval [(c,d)] /\
21208          (\x. -h' x) has_bounded_variation_on interval [(c,d)]`` THENL
21209     [CONJ_TAC THENL [ALL_TAC, MATCH_MP_TAC HAS_BOUNDED_VARIATION_ON_NEG] THEN
21210      MATCH_MP_TAC HAS_BOUNDED_VARIATION_ON_SUBSET THEN
21211      EXISTS_TAC ``interval[c:real,b]`` THEN
21212      ASM_SIMP_TAC std_ss [INCREASING_BOUNDED_VARIATION, SUBSET_INTERVAL] THEN
21213      RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN ASM_SIMP_TAC real_ss [],
21214      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
21215    SIMP_TAC std_ss [real_sub] THEN MATCH_MP_TAC(REAL_ARITH
21216     ``y * 2 < a /\ z * 2 < a ==> x <= y + z ==> x < a:real``) THEN
21217    SIMP_TAC std_ss [VECTOR_VARIATION_NEG] THEN CONJ_TAC THEN
21218    SIMP_TAC real_ss [GSYM REAL_LT_RDIV_EQ] THEN
21219    W(MP_TAC o PART_MATCH (lhs o rand)
21220      INCREASING_VECTOR_VARIATION o lhand o snd) THENL
21221   [KNOW_TAC ``interval [(c,d)] <> {} /\
21222     (!x y. x IN interval [(c,d)] /\ y IN interval [(c,d)] /\ x <= y ==>
21223      g' x <= (g':real->real) y)`` THENL
21224      [RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN
21225       ASM_REWRITE_TAC[GSYM INTERVAL_EQ_EMPTY, IN_INTERVAL, REAL_NOT_LT] THEN
21226       REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
21227       UNDISCH_TAC `` a <= c /\ c <= b:real`` THEN
21228       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
21229       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
21230       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
21231       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
21232       REAL_ARITH_TAC,
21233       DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
21234       DISCH_THEN SUBST1_TAC],
21235    KNOW_TAC ``interval [(c,d)] <> {} /\
21236     (!x y. x IN interval [(c,d)] /\ y IN interval [(c,d)] /\ x <= y ==>
21237      h' x <= (h':real->real) y)`` THENL
21238      [RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN
21239       ASM_REWRITE_TAC[GSYM INTERVAL_EQ_EMPTY, IN_INTERVAL, REAL_NOT_LT] THEN
21240       REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
21241       UNDISCH_TAC `` a <= c /\ c <= b:real`` THEN
21242       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
21243       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
21244       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
21245       POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
21246       REAL_ARITH_TAC,
21247       DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC THEN
21248       DISCH_THEN SUBST1_TAC]] THEN
21249    MATCH_MP_TAC(REAL_ARITH ``abs(x - y) < e ==> y - x < e:real``) THEN
21250    ONCE_REWRITE_TAC [ABS_SUB] THEN
21251    FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]
21252QED
21253
21254Theorem VECTOR_VARIATION_CONTINUOUS_RIGHT:
21255   !f:real->real a b c.
21256        f has_bounded_variation_on interval[a,b] /\ c IN interval[a,b]
21257        ==> ((\x. (vector_variation(interval[a,x]) f))
21258             continuous (at c within interval[c,b]) <=>
21259            f continuous (at c within interval[c,b]))
21260Proof
21261  REPEAT STRIP_TAC THEN EQ_TAC THENL
21262   [REWRITE_TAC[continuous_within] THEN
21263    SIMP_TAC std_ss [GSPECIFICATION, dist] THEN
21264    DISCH_TAC THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
21265    FIRST_X_ASSUM(MP_TAC o SPEC ``e:real``) THEN ASM_REWRITE_TAC[] THEN
21266    STRIP_TAC THEN EXISTS_TAC ``d:real`` THEN
21267    ASM_REWRITE_TAC[] THEN X_GEN_TAC ``x:real`` THEN STRIP_TAC THEN
21268    FIRST_X_ASSUM(MP_TAC o SPEC ``x:real``) THEN ASM_REWRITE_TAC[] THEN
21269    MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] REAL_LET_TRANS) THEN
21270    MP_TAC(ISPECL [``f:real->real``, ``a:real``, ``x:real``, ``c:real``]
21271        VECTOR_VARIATION_COMBINE) THEN
21272    KNOW_TAC ``a <= c /\ c <= x /\
21273              (f:real->real) has_bounded_variation_on interval [(a,x)]`` THENL
21274     [RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN
21275      REPEAT(CONJ_TAC THENL [ASM_REAL_ARITH_TAC, ALL_TAC]) THEN
21276      FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
21277         HAS_BOUNDED_VARIATION_ON_SUBSET)) THEN
21278      REWRITE_TAC[SUBSET_INTERVAL] THEN ASM_REAL_ARITH_TAC,
21279      DISCH_TAC THEN ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
21280    DISCH_THEN(SUBST1_TAC o SYM) THEN
21281    REWRITE_TAC[REAL_ARITH ``abs((a + b) - a) = abs b:real``] THEN
21282    REWRITE_TAC[dist] THEN
21283    MATCH_MP_TAC(REAL_ARITH ``x <= a ==> x <= abs a:real``) THEN
21284    ONCE_REWRITE_TAC[ABS_SUB] THEN
21285    MATCH_MP_TAC VECTOR_VARIATION_GE_ABS_FUNCTION THEN CONJ_TAC THENL
21286     [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
21287        HAS_BOUNDED_VARIATION_ON_SUBSET)),
21288      REWRITE_TAC[SEGMENT] THEN COND_CASES_TAC] THEN
21289    REWRITE_TAC[SUBSET_INTERVAL] THEN
21290    RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN ASM_SIMP_TAC real_ss [],
21291    ALL_TAC] THEN
21292  DISCH_TAC THEN ASM_CASES_TAC ``c limit_point_of interval[c:real,b]`` THENL
21293   [ALL_TAC,
21294    ASM_REWRITE_TAC[CONTINUOUS_WITHIN, LIM, TRIVIAL_LIMIT_WITHIN]] THEN
21295  MATCH_MP_TAC(CONTINUOUS_WITHIN_COMPARISON) THEN
21296  EXISTS_TAC ``\x. sum { 1n.. 1n}
21297                       (\i. (vector_variation (interval[a,x])
21298                            (\u. (((f:real->real) u)))))`` THEN
21299  SIMP_TAC std_ss [] THEN CONJ_TAC THENL
21300   [ONCE_REWRITE_TAC [METIS []
21301     ``(\i. vector_variation (interval [(a,x)]) (\u. f u)) =
21302       (\i. (\i x. vector_variation (interval [(a,x)]) (\u. f u)) i x)``] THEN
21303    MATCH_MP_TAC CONTINUOUS_SUM THEN REWRITE_TAC[FINITE_NUMSEG] THEN
21304    REWRITE_TAC[IN_NUMSEG] THEN REPEAT STRIP_TAC THEN
21305    W(MP_TAC o PART_MATCH (lhs o rand) lemma o snd) THEN
21306    METIS_TAC [],
21307    ALL_TAC] THEN
21308  X_GEN_TAC ``x:real`` THEN REWRITE_TAC[IN_INTERVAL] THEN DISCH_TAC THEN
21309  SIMP_TAC std_ss [dist, GSYM SUM_SUB_NUMSEG] THEN
21310  SUBGOAL_THEN
21311  ``(vector_variation(interval [a,x]) (f:real->real) =
21312     vector_variation(interval [a,c]) (f:real->real) +
21313     vector_variation(interval [c,x]) (f:real->real)) /\
21314    (vector_variation(interval [a,x])
21315                  (\x. ((f:real->real) x)) =
21316     vector_variation(interval [a,c]) (\x. (f x)) +
21317     vector_variation(interval [c,x]) (\x. (f x)))``
21318   (fn th => ASM_SIMP_TAC std_ss [th])
21319  THENL
21320   [REPEAT STRIP_TAC THEN CONV_TAC SYM_CONV THEN
21321    MATCH_MP_TAC VECTOR_VARIATION_COMBINE THEN
21322    RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN
21323    ASM_SIMP_TAC std_ss [] THEN
21324    MATCH_MP_TAC HAS_BOUNDED_VARIATION_ON_SUBSET THEN
21325    EXISTS_TAC ``interval[a:real,b]`` THEN
21326    ASM_REWRITE_TAC[SUBSET_INTERVAL] THEN
21327    RULE_ASSUM_TAC(ONCE_REWRITE_RULE
21328       [HAS_BOUNDED_VARIATION_ON_COMPONENTWISE]) THEN
21329    ASM_SIMP_TAC std_ss [REAL_LE_REFL],
21330    REWRITE_TAC[REAL_ARITH ``a - (a + b):real = -b``]] THEN
21331  SIMP_TAC std_ss [NUMSEG_SING, SUM_SING, ETA_AX, REAL_LE_REFL]
21332QED
21333
21334Theorem lemma[local]:
21335      !f:real->real a b c.
21336        c IN interval[a,b]
21337        ==> (f continuous (at c within interval[a,b]) <=>
21338             f continuous (at c within interval[a,c]) /\
21339             f continuous (at c within interval[c,b]))
21340Proof
21341     REPEAT STRIP_TAC THEN REWRITE_TAC[CONTINUOUS_WITHIN] THEN EQ_TAC THENL
21342      [DISCH_THEN(ASSUME_TAC o GEN_ALL o
21343       MATCH_MP (REWRITE_RULE[IMP_CONJ] LIM_WITHIN_SUBSET)) THEN
21344       CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC,
21345       DISCH_THEN(MP_TAC o MATCH_MP LIM_UNION) THEN
21346       MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] LIM_WITHIN_SUBSET)] THEN
21347     REWRITE_TAC[SUBSET_DEF, IN_UNION, IN_INTERVAL] THEN
21348     RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN ASM_REAL_ARITH_TAC
21349QED
21350
21351Theorem VECTOR_VARIATION_CONTINUOUS:
21352   !f:real->real a b c.
21353        f has_bounded_variation_on interval[a,b] /\ c IN interval[a,b]
21354        ==> ((\x. (vector_variation(interval[a,x]) f))
21355             continuous (at c within interval[a,b]) <=>
21356            f continuous (at c within interval[a,b]))
21357Proof
21358  REPEAT STRIP_TAC THEN
21359  FIRST_ASSUM(fn th => ONCE_REWRITE_TAC[MATCH_MP lemma th]) THEN
21360  METIS_TAC[VECTOR_VARIATION_CONTINUOUS_LEFT,
21361                VECTOR_VARIATION_CONTINUOUS_RIGHT]
21362QED
21363
21364Theorem CONTINUOUS_ON_VECTOR_VARIATION:
21365   !f:real->real a b.
21366        f has_bounded_variation_on interval[a,b] /\
21367        f continuous_on interval[a,b]
21368        ==> (\x. (vector_variation (interval [a,x]) f)) continuous_on
21369            interval[a,b]
21370Proof
21371  SIMP_TAC std_ss [CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN, VECTOR_VARIATION_CONTINUOUS]
21372QED
21373
21374Theorem HAS_BOUNDED_VARIATION_DARBOUX_STRONG:
21375   !f a b.
21376     f has_bounded_variation_on interval[a,b]
21377     ==> ?g h. (!x. f x = g x - h x) /\
21378               (!x y. x IN interval[a,b] /\ y IN interval[a,b] /\
21379                      x <= y
21380                      ==> (g x) <= (g y)) /\
21381               (!x y. x IN interval[a,b] /\ y IN interval[a,b] /\
21382                      x <= y
21383                      ==> (h x) <= (h y)) /\
21384               (!x y. x IN interval[a,b] /\ y IN interval[a,b] /\
21385                      x < y
21386                      ==> (g x) < (g y)) /\
21387               (!x y. x IN interval[a,b] /\ y IN interval[a,b] /\
21388                      x < y
21389                      ==> (h x) < (h y)) /\
21390               (!x. x IN interval[a,b] /\
21391                    f continuous (at x within interval[a,x])
21392                    ==> g continuous (at x within interval[a,x]) /\
21393                        h continuous (at x within interval[a,x])) /\
21394               (!x. x IN interval[a,b] /\
21395                    f continuous (at x within interval[x,b])
21396                    ==> g continuous (at x within interval[x,b]) /\
21397                        h continuous (at x within interval[x,b])) /\
21398               (!x. x IN interval[a,b] /\
21399                    f continuous (at x within interval[a,b])
21400                    ==> g continuous (at x within interval[a,b]) /\
21401                        h continuous (at x within interval[a,b]))
21402Proof
21403  REPEAT STRIP_TAC THEN
21404  MAP_EVERY EXISTS_TAC
21405   [``\x:real. x + (vector_variation (interval[a,x]) (f:real->real))``,
21406    ``\x:real. x + (vector_variation (interval[a,x]) f) - f x``] THEN
21407  SIMP_TAC real_ss [REAL_ARITH ``(x + l) - (x + l - f):real = f``] THEN
21408  SIMP_TAC std_ss [] THEN REPEAT STRIP_TAC THENL
21409   [MATCH_MP_TAC REAL_LE_ADD2 THEN ASM_REWRITE_TAC[] THEN
21410    MATCH_MP_TAC VECTOR_VARIATION_MONOTONE,
21411    REWRITE_TAC [real_sub, GSYM REAL_ADD_ASSOC] THEN
21412    MATCH_MP_TAC REAL_LE_ADD2 THEN ASM_REWRITE_TAC[GSYM real_sub] THEN
21413    MATCH_MP_TAC(REAL_ARITH
21414     ``!x. a - (b - x) <= c - (d - x) ==> a - b <= c - d:real``) THEN
21415    EXISTS_TAC ``(f(a:real)):real`` THEN
21416    SIMP_TAC std_ss [] THEN
21417    MATCH_MP_TAC VECTOR_VARIATION_MINUS_FUNCTION_MONOTONE,
21418    MATCH_MP_TAC REAL_LTE_ADD2 THEN ASM_REWRITE_TAC[] THEN
21419    MATCH_MP_TAC VECTOR_VARIATION_MONOTONE,
21420    REWRITE_TAC [real_sub, GSYM REAL_ADD_ASSOC] THEN
21421    MATCH_MP_TAC REAL_LTE_ADD2 THEN ASM_REWRITE_TAC[GSYM real_sub] THEN
21422    MATCH_MP_TAC(REAL_ARITH
21423     ``!x. a - (b - x) <= c - (d - x) ==> a - b <= c - d:real``) THEN
21424    EXISTS_TAC ``(f(a:real)):real`` THEN
21425    SIMP_TAC std_ss [] THEN
21426    MATCH_MP_TAC VECTOR_VARIATION_MINUS_FUNCTION_MONOTONE,
21427    ONCE_REWRITE_TAC [METIS []
21428     ``(\x. x + vector_variation (interval [(a,x)]) f) =
21429       (\x. (\x. x) x + (\x. vector_variation (interval [(a,x)]) f) x)``] THEN
21430    MATCH_MP_TAC CONTINUOUS_ADD THEN
21431    REWRITE_TAC[CONTINUOUS_WITHIN_ID] THEN
21432    MP_TAC(ISPECL [``f:real->real``, ``a:real``, ``b:real``, ``x:real``]
21433        VECTOR_VARIATION_CONTINUOUS_LEFT) THEN
21434    ASM_REWRITE_TAC[],
21435    ONCE_REWRITE_TAC [METIS [real_sub, REAL_ADD_ASSOC]
21436      ``(\x. x + vector_variation (interval [(a,x)]) f - f x) =
21437        (\x. (\x. x) x + (\x. vector_variation (interval [(a,x)]) f - f x) x)``] THEN
21438    MATCH_MP_TAC CONTINUOUS_ADD THEN
21439    REWRITE_TAC[CONTINUOUS_WITHIN_ID] THEN
21440    ONCE_REWRITE_TAC [METIS []
21441      ``(\x. vector_variation (interval [(a,x)]) f - f x) =
21442        (\x. (\x. vector_variation (interval [(a,x)]) f) x - f x)``] THEN
21443    MATCH_MP_TAC CONTINUOUS_SUB THEN ASM_REWRITE_TAC[] THEN
21444    MP_TAC(ISPECL [``f:real->real``, ``a:real``, ``b:real``, ``x:real``]
21445        VECTOR_VARIATION_CONTINUOUS_LEFT) THEN
21446    ASM_REWRITE_TAC[],
21447    ONCE_REWRITE_TAC [METIS []
21448     ``(\x. x + vector_variation (interval [(a,x)]) f) =
21449       (\x. (\x. x) x + (\x. vector_variation (interval [(a,x)]) f) x)``] THEN
21450    MATCH_MP_TAC CONTINUOUS_ADD THEN
21451    REWRITE_TAC[CONTINUOUS_WITHIN_ID] THEN
21452    MP_TAC(ISPECL [``f:real->real``, ``a:real``, ``b:real``, ``x:real``]
21453        VECTOR_VARIATION_CONTINUOUS_RIGHT) THEN
21454    ASM_REWRITE_TAC[],
21455    ONCE_REWRITE_TAC [METIS [real_sub, REAL_ADD_ASSOC]
21456      ``(\x. x + vector_variation (interval [(a,x)]) f - f x) =
21457        (\x. (\x. x) x + (\x. vector_variation (interval [(a,x)]) f - f x) x)``] THEN
21458    MATCH_MP_TAC CONTINUOUS_ADD THEN
21459    REWRITE_TAC[CONTINUOUS_WITHIN_ID] THEN
21460    ONCE_REWRITE_TAC [METIS []
21461      ``(\x. vector_variation (interval [(a,x)]) f - f x) =
21462        (\x. (\x. vector_variation (interval [(a,x)]) f) x - f x)``] THEN
21463    MATCH_MP_TAC CONTINUOUS_SUB THEN ASM_REWRITE_TAC[] THEN
21464    MP_TAC(ISPECL [``f:real->real``, ``a:real``, ``b:real``, ``x:real``]
21465        VECTOR_VARIATION_CONTINUOUS_RIGHT) THEN
21466    ASM_REWRITE_TAC[],
21467    ONCE_REWRITE_TAC [METIS []
21468     ``(\x. x + vector_variation (interval [(a,x)]) f) =
21469       (\x. (\x. x) x + (\x. vector_variation (interval [(a,x)]) f) x)``] THEN
21470    MATCH_MP_TAC CONTINUOUS_ADD THEN
21471    REWRITE_TAC[CONTINUOUS_WITHIN_ID] THEN
21472    MP_TAC(ISPECL [``f:real->real``, ``a:real``, ``b:real``, ``x:real``]
21473        VECTOR_VARIATION_CONTINUOUS) THEN
21474    ASM_REWRITE_TAC[],
21475    ONCE_REWRITE_TAC [METIS [real_sub, REAL_ADD_ASSOC]
21476      ``(\x. x + vector_variation (interval [(a,x)]) f - f x) =
21477        (\x. (\x. x) x + (\x. vector_variation (interval [(a,x)]) f - f x) x)``] THEN
21478    MATCH_MP_TAC CONTINUOUS_ADD THEN
21479    REWRITE_TAC[CONTINUOUS_WITHIN_ID] THEN
21480    ONCE_REWRITE_TAC [METIS []
21481      ``(\x. vector_variation (interval [(a,x)]) f - f x) =
21482        (\x. (\x. vector_variation (interval [(a,x)]) f) x - f x)``] THEN
21483    MATCH_MP_TAC CONTINUOUS_SUB THEN ASM_REWRITE_TAC[] THEN
21484    MP_TAC(ISPECL [``f:real->real``, ``a:real``, ``b:real``, ``x:real``]
21485        VECTOR_VARIATION_CONTINUOUS) THEN
21486    ASM_REWRITE_TAC[]] THEN
21487  (CONJ_TAC THENL
21488     [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
21489       HAS_BOUNDED_VARIATION_ON_SUBSET)),
21490      ALL_TAC] THEN
21491    RULE_ASSUM_TAC(REWRITE_RULE[IN_INTERVAL]) THEN
21492    REWRITE_TAC[SUBSET_INTERVAL, GSYM INTERVAL_EQ_EMPTY] THEN
21493    ASM_REAL_ARITH_TAC)
21494QED
21495
21496Theorem INTEGRABLE_BOUNDED_VARIATION_PRODUCT:
21497   !f:real->real g a b.
21498        f integrable_on interval[a,b] /\
21499        g has_bounded_variation_on interval[a,b]
21500        ==> (\x. (g x) * f x) integrable_on interval[a,b]
21501Proof
21502  REPEAT STRIP_TAC THEN FIRST_X_ASSUM
21503   (MP_TAC o REWRITE_RULE [HAS_BOUNDED_VARIATION_DARBOUX]) THEN
21504  SIMP_TAC std_ss [LEFT_IMP_EXISTS_THM] THEN
21505  MAP_EVERY X_GEN_TAC [``h:real->real``, ``k:real->real``] THEN
21506  STRIP_TAC THEN ASM_REWRITE_TAC[REAL_SUB_RDISTRIB] THEN
21507  ONCE_REWRITE_TAC [METIS [] ``(\x. h x * f x - k x * (f:real->real) x) =
21508                  (\x. (\x. h x * f x) x - (\x. k x * f x) x)``] THEN
21509  MATCH_MP_TAC INTEGRABLE_SUB THEN
21510  CONJ_TAC THEN MATCH_MP_TAC INTEGRABLE_INCREASING_PRODUCT THEN
21511  ASM_REWRITE_TAC[]
21512QED
21513
21514Theorem INTEGRABLE_BOUNDED_VARIATION_PRODUCT_ALT:
21515   !f:real->real g a b.
21516        f integrable_on interval[a,b] /\
21517         g has_bounded_variation_on interval[a,b]
21518        ==> (\x. g x * f x) integrable_on interval[a,b]
21519Proof
21520  REPEAT GEN_TAC THEN
21521  DISCH_THEN(MP_TAC o MATCH_MP INTEGRABLE_BOUNDED_VARIATION_PRODUCT) THEN
21522  SIMP_TAC std_ss [o_DEF]
21523QED
21524
21525Theorem INTEGRABLE_BOUNDED_VARIATION_BILINEAR_LMUL:
21526   !op:real->real->real f g a b.
21527        bilinear op /\
21528        f integrable_on interval[a,b] /\
21529        g has_bounded_variation_on interval[a,b]
21530        ==> (\x. op (g x) (f x)) integrable_on interval[a,b]
21531Proof
21532  REPEAT STRIP_TAC THEN
21533  KNOW_TAC ``!x. (g:real->real) x = sum { 1n.. 1n} (\i. g x * &i)`` THENL
21534  [SIMP_TAC std_ss [SUM_SING, NUMSEG_SING, REAL_MUL_RID],
21535   DISCH_TAC THEN ONCE_ASM_REWRITE_TAC [] THEN POP_ASSUM K_TAC] THEN
21536  FIRST_ASSUM(ASSUME_TAC o CONJUNCT2 o REWRITE_RULE [bilinear]) THEN
21537  KNOW_TAC ``!n y g. FINITE { 1n.. n} ==>
21538    ((\(x:real). (op:real->real->real) x y) (sum { 1n..n} g) =
21539     sum { 1n..n} ((\x. op x y) o g))`` THENL
21540  [REPEAT STRIP_TAC THEN MATCH_MP_TAC LINEAR_SUM THEN ASM_SIMP_TAC std_ss [],
21541   ALL_TAC] THEN
21542  SIMP_TAC std_ss [FINITE_NUMSEG, o_DEF] THEN DISCH_THEN(K ALL_TAC) THEN
21543  ONCE_REWRITE_TAC [METIS []
21544   ``(\x. sum {1 .. 1} (\i. op ((g:real->real) x * &i) (f x))) =
21545     (\x. sum {1 .. 1} (\i. (\i x. op (g x * &i) (f x)) i x))``] THEN
21546  MATCH_MP_TAC INTEGRABLE_SUM THEN SIMP_TAC std_ss [FINITE_NUMSEG, IN_NUMSEG] THEN
21547  X_GEN_TAC ``k:num`` THEN DISCH_TAC THEN
21548  FIRST_ASSUM(MP_TAC o GEN_ALL o MATCH_MP LINEAR_CMUL o SPEC_ALL) THEN
21549  SIMP_TAC std_ss [] THEN DISCH_THEN(K ALL_TAC) THEN
21550  ONCE_REWRITE_TAC [METIS [] ``(\x. (g:real->real) x * op (&k) (f x)) =
21551                    (\x. g x * (\x. (op:real->real->real) (&k) (f x)) x)``] THEN
21552  MATCH_MP_TAC INTEGRABLE_BOUNDED_VARIATION_PRODUCT_ALT THEN
21553  ASM_SIMP_TAC std_ss [o_DEF, IN_NUMSEG] THEN ONCE_REWRITE_TAC[GSYM o_DEF] THEN
21554  MATCH_MP_TAC INTEGRABLE_LINEAR THEN ASM_REWRITE_TAC[] THEN
21555  UNDISCH_TAC ``bilinear op`` THEN DISCH_TAC THEN
21556  FIRST_ASSUM(MP_TAC o CONJUNCT1 o SIMP_RULE std_ss [bilinear]) THEN
21557  METIS_TAC [ETA_AX]
21558QED
21559
21560Theorem INTEGRABLE_BOUNDED_VARIATION_BILINEAR_RMUL:
21561   !op:real->real->real f g a b.
21562        bilinear op /\
21563        f integrable_on interval[a,b] /\
21564        g has_bounded_variation_on interval[a,b]
21565        ==> (\x. op (f x) (g x)) integrable_on interval[a,b]
21566Proof
21567  REPEAT STRIP_TAC THEN MP_TAC(ISPECL
21568   [``\x y. (op:real->real->real) y x``,
21569    ``f:real->real``, ``g:real->real``,
21570    ``a:real``, ``b:real``] INTEGRABLE_BOUNDED_VARIATION_BILINEAR_LMUL) THEN
21571  ASM_SIMP_TAC std_ss [BILINEAR_SWAP]
21572QED
21573
21574Theorem INTEGRABLE_BOUNDED_VARIATION:
21575   !f:real->real a b.
21576        f has_bounded_variation_on interval[a,b]
21577        ==> f integrable_on interval[a,b]
21578Proof
21579  REPEAT STRIP_TAC THEN
21580  MP_TAC(ISPECL
21581   [``\x:real y:real. x * y``,
21582    ``(\x. 1):real->real``,
21583    ``f:real->real``, ``a:real``, ``b:real``]
21584        INTEGRABLE_BOUNDED_VARIATION_BILINEAR_RMUL) THEN
21585  ASM_SIMP_TAC std_ss [INTEGRABLE_CONST, BILINEAR_DOT] THEN
21586  SIMP_TAC std_ss [REAL_MUL_LID, ETA_AX]
21587QED
21588
21589Theorem HAS_BOUNDED_VARIATION_ON_INDEFINITE_INTEGRAL_RIGHT:
21590   !f:real->real a b.
21591        f absolutely_integrable_on interval[a,b]
21592        ==> (\c. integral (interval[a,c]) f) has_bounded_variation_on
21593            interval[a,b]
21594Proof
21595  REPEAT STRIP_TAC THEN REWRITE_TAC[has_bounded_variation_on] THEN
21596  FIRST_ASSUM(MP_TAC o
21597    MATCH_MP ABSOLUTELY_INTEGRABLE_BOUNDED_SETVARIATION) THEN
21598  MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] HAS_BOUNDED_SETVARIATION_ON_EQ) THEN
21599  SIMP_TAC std_ss [INTERVAL_LOWERBOUND_NONEMPTY, INTERVAL_UPPERBOUND_NONEMPTY] THEN
21600  SIMP_TAC std_ss [INTERVAL_NE_EMPTY, SUBSET_INTERVAL, GSYM REAL_NOT_LE] THEN
21601  REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_ARITH
21602   ``(a:real = b - c) <=> (c + a = b)``] THEN
21603  MATCH_MP_TAC INTEGRAL_COMBINE THEN ASM_REWRITE_TAC[] THEN
21604  FIRST_ASSUM(MP_TAC o MATCH_MP ABSOLUTELY_INTEGRABLE_IMP_INTEGRABLE) THEN
21605  MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] INTEGRABLE_ON_SUBINTERVAL) THEN
21606  ASM_REWRITE_TAC[SUBSET_INTERVAL] THEN ASM_REAL_ARITH_TAC
21607QED
21608
21609Theorem HAS_BOUNDED_VARIATION_ON_INDEFINITE_INTEGRAL_LEFT:
21610   !f:real->real a b.
21611        f absolutely_integrable_on interval[a,b]
21612        ==> (\c. integral (interval[c,b]) f) has_bounded_variation_on
21613            interval[a,b]
21614Proof
21615  REPEAT STRIP_TAC THEN
21616  REWRITE_TAC[has_bounded_variation_on] THEN
21617  ONCE_REWRITE_TAC[GSYM HAS_BOUNDED_SETVARIATION_ON_NEG] THEN
21618  FIRST_ASSUM(MP_TAC o
21619    MATCH_MP ABSOLUTELY_INTEGRABLE_BOUNDED_SETVARIATION) THEN
21620  MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] HAS_BOUNDED_SETVARIATION_ON_EQ) THEN
21621  SIMP_TAC std_ss [INTERVAL_LOWERBOUND_NONEMPTY, INTERVAL_UPPERBOUND_NONEMPTY] THEN
21622  SIMP_TAC std_ss [INTERVAL_NE_EMPTY, SUBSET_INTERVAL, GSYM REAL_NOT_LE] THEN
21623  REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_ARITH
21624   ``(a:real = -(b - c)) <=> (a + b = c)``] THEN
21625  MATCH_MP_TAC INTEGRAL_COMBINE THEN ASM_REWRITE_TAC[] THEN
21626  FIRST_ASSUM(MP_TAC o MATCH_MP ABSOLUTELY_INTEGRABLE_IMP_INTEGRABLE) THEN
21627  MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] INTEGRABLE_ON_SUBINTERVAL) THEN
21628  ASM_REWRITE_TAC[SUBSET_INTERVAL] THEN ASM_REAL_ARITH_TAC
21629QED
21630
21631(* TODO: hol-light's "Multivariate/integration.ml", starting from line 21056:
21632
21633   CONTINUOUS_BV_IMP_UNIFORMLY_CONTINUOUS
21634   HAS_BOUNDED_VARIATION_ON_DARBOUX_IMP_CONTINUOUS
21635   VECTOR_VARIATION_ON_INTERIOR
21636   VECTOR_VARIATION_ON_CLOSURE
21637   HAS_BOUNDED_VARIATION_IMP_BAIRE1
21638   INCREASING_IMP_BAIRE1
21639   DECREASING_IMP_BAIRE1
21640   FACTOR_THROUGH_VARIATION
21641   FACTOR_CONTINUOUS_THROUGH_VARIATION
21642   ...
21643 *)
21644
21645(* References:
21646
21647 [1] Bartle, R.G.: A Modern Theory of Integration. American Mathematical Soc. (2001).
21648 *)