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 *)