integralScript.sml
1(* ======================================================================== *)
2(* Formalization of Kurzweil-Henstock gauge integral [1] *)
3(* ======================================================================== *)
4
5(* =====================================================================
6 Theory: GAUGE INTEGRALS [2]
7 Description: Generalized gauge intgrals and related theorems
8 (ported from the HOL Light theory of the same)
9
10 Email: grace_gwq@163.com
11 DATE: 08-10-2012
12
13 Ported by:
14 Weiqing Gu, Zhiping Shi, Yong Guan, Shengzhen Jin, Xiaojuan Li
15
16 Beijing Engineering Research Center of High Reliable Embedded System
17
18 College of Information Engineering, Capital Normal University (CNU)
19 Beijing, China
20 ===================================================================== *)
21Theory integral
22Ancestors
23 bool powser lim real_sigma pair arithmetic num prim_rec real
24 metric nets seq pred_set relation topology iterate
25 real_topology integration
26Libs
27 PairedLambda Diff mesonLib tautLib numLib reduceLib pairLib
28 jrhUtils realLib
29
30
31local
32 val ss = ["lift_disj_eq", "lift_imp_disj"];
33in
34 val bool_ss = bool_ss -* ss;
35 val std_ss = std_ss -* ss;
36 val arith_ss = arith_ss -* ss;
37 val real_ss = real_ss -* ss;
38 val _ = temp_delsimps ss;
39end;
40
41val _ = Parse.reveal "B";
42
43(* Mini HOL-Light compatibility layer *)
44val LE_0 = arithmeticTheory.ZERO_LESS_EQ;
45val LT_0 = prim_recTheory.LESS_0;
46val EQ_SUC = prim_recTheory.INV_SUC_EQ;
47
48fun LE_MATCH_TAC th (asl,w) =
49 let val thi = PART_MATCH (rand o rator) th (rand(rator w))
50 val tm = rand(concl thi)
51 in
52 (MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC tm THEN CONJ_TAC THENL
53 [MATCH_ACCEPT_TAC th, ALL_TAC]) (asl,w)
54 end;
55
56(* Mini hurdUtils *)
57val Suff = Q_TAC SUFF_TAC;
58val Know = Q_TAC KNOW_TAC;
59fun wrap a = [a];
60val Rewr = DISCH_THEN (REWRITE_TAC o wrap);
61val Rewr' = DISCH_THEN (ONCE_REWRITE_TAC o wrap);
62val art = ASM_REWRITE_TAC;
63val POP_ORW = POP_ASSUM (ONCE_REWRITE_TAC o wrap);
64fun K_TAC _ = ALL_TAC;
65val KILL_TAC = POP_ASSUM_LIST K_TAC;
66local
67 val th = prove (“!a b. a /\ (a ==> b) ==> a /\ b”, PROVE_TAC [])
68in
69 val STRONG_CONJ_TAC = MATCH_MP_TAC th >> CONJ_TAC;
70end;
71
72(* ------------------------------------------------------------------------ *)
73(* Some miscellaneous lemmas *)
74(* ------------------------------------------------------------------------ *)
75
76Theorem LESS_1[local] :
77 !n:num. n < 1 <=> (n = 0)
78Proof
79 INDUCT_TAC >> REWRITE_TAC [ONE,LESS_0,LESS_MONO_EQ,NOT_LESS_0,GSYM SUC_NOT]
80QED
81
82(* ------------------------------------------------------------------------ *)
83(* Divisions and tagged divisions etc. *)
84(* ------------------------------------------------------------------------ *)
85
86(* D represents a finite order set of points as a partition of I = [a,b] *)
87Definition division :
88 division(a,b) D <=>
89 (D 0 = a) /\
90 (?N. (!n. n < N ==> D(n) < D(SUC n)) /\
91 (!n. n >= N ==> (D(n) = b)))
92End
93
94(* The "infinite tail" of D remains the value of the last point D(N) *)
95Definition dsize :
96 dsize D =
97 @N. (!n. n < N ==> D(n) < D(SUC n)) /\
98 (!n. n >= N ==> (D(n) = D(N)))
99End
100
101(* tagged division, p(n) is the tag of each intervals of the division D *)
102Definition tdiv :
103 tdiv(a,b) (D,p) <=>
104 division(a,b) D /\
105 (!n. D(n) <= p(n) /\ p(n) <= D(SUC n))
106End
107
108(* ------------------------------------------------------------------------ *)
109(* Gauges and gauge-fine divisions *)
110(* ------------------------------------------------------------------------ *)
111
112(* A function g is said to be a gauge on E if g(x) > 0 for all x IN E [1, p.8]
113
114 cf. integrationTheory.gauge_def (Gauge)
115 *)
116Definition gauge :
117 gauge(E) (g:real->real) = !x. E x ==> &0 < g(x)
118End
119
120Theorem gauge' :
121 !E g. gauge E g <=> !x. x IN E ==> 0 < g x
122Proof
123 rw [IN_APP, gauge]
124QED
125
126(* connection to integrationTheory, thus the function g (as the gauge) will be
127 used as the radius of each division as open intervals. *)
128Theorem gauge_alt :
129 !c E g. 0 < c ==>
130 (gauge E g <=> Gauge (\x. ball(x, if E x then c * g(x) else 1)))
131Proof
132 rw [gauge, gauge_def, CENTRE_IN_BALL, OPEN_BALL]
133 >> EQ_TAC >> rw []
134 >- (Cases_on ‘E x’ >> rw [] \\
135 MATCH_MP_TAC REAL_LT_MUL >> rw [])
136 >> Q.PAT_X_ASSUM ‘!x. P’ (MP_TAC o (Q.SPEC ‘x’))
137 >> Cases_on ‘E x’ >> fs []
138 >> rw [REAL_LT_LMUL_0]
139QED
140
141Theorem gauge_alt_univ :
142 !c g. 0 < c ==> (gauge univ(:real) g <=> Gauge (\x. ball(x,c * g(x))))
143Proof
144 rpt STRIP_TAC
145 >> MP_TAC (Q.SPECL [‘c’, ‘univ(:real)’, ‘g’] gauge_alt) >> rw []
146QED
147
148(* g is the gauge function (the range E is ignored), D is a division, p is the
149 tag of each intervals in the division
150 *)
151Definition fine :
152 fine(g:real->real) (D,p) =
153 !n. n < dsize D ==> D(SUC n) - D(n) < g(p(n))
154End
155
156(* ------------------------------------------------------------------------ *)
157(* Riemann sum *)
158(* ------------------------------------------------------------------------ *)
159
160Definition rsum :
161 rsum (D,(p:num->real)) f =
162 sum(0,dsize(D))(\n. f(p n) * (D(SUC n) - D(n)))
163End
164
165(* ------------------------------------------------------------------------ *)
166(* Gauge integrability (definite) *)
167(* ------------------------------------------------------------------------ *)
168
169(* cf. integrationTheory.has_integral
170
171 NOTE: only integration on (closed) intervals are supported in integralTheory.
172 *)
173Definition Dint :
174 Dint(a,b) f k <=>
175 !e. &0 < e ==>
176 ?g. gauge(\x. a <= x /\ x <= b) g /\
177 !D p. tdiv(a,b) (D,p) /\ fine(g)(D,p) ==>
178 abs(rsum(D,p) f - k) < e
179End
180
181(* ------------------------------------------------------------------------ *)
182(* Useful lemmas about the size of `trivial` divisions etc. *)
183(* ------------------------------------------------------------------------ *)
184
185Theorem DIVISION_0 :
186 !a b. (a = b) ==> dsize(\n:num. if (n = 0) then a else b) = 0
187Proof
188 REPEAT GEN_TAC THEN DISCH_THEN SUBST_ALL_TAC THEN REWRITE_TAC[COND_ID] THEN
189 REWRITE_TAC[dsize] THEN MATCH_MP_TAC SELECT_UNIQUE THEN
190 X_GEN_TAC (Term `n:num`) THEN BETA_TAC THEN
191 REWRITE_TAC[REAL_LT_REFL, NOT_LESS] THEN EQ_TAC THENL
192 [DISCH_THEN(MP_TAC o SPEC (Term `0:num`)) THEN
193 REWRITE_TAC[LESS_OR_EQ,NOT_LESS_0],
194 DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[ZERO_LESS_EQ]]
195QED
196
197Theorem DIVISION_1 :
198 !a b. a < b ==> dsize(\n. if (n = 0) then a else b) = 1
199Proof
200 REPEAT GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[dsize] THEN
201 MATCH_MP_TAC SELECT_UNIQUE THEN X_GEN_TAC (Term `n:num`) THEN BETA_TAC THEN
202 REWRITE_TAC[NOT_SUC] THEN EQ_TAC THENL
203 [DISCH_TAC THEN MATCH_MP_TAC LESS_EQUAL_ANTISYM THEN CONJ_TAC THENL
204 [POP_ASSUM(MP_TAC o SPEC (Term`1:num`) o CONJUNCT1) THEN
205 REWRITE_TAC[ONE, GSYM SUC_NOT] THEN
206 REWRITE_TAC[REAL_LT_REFL, NOT_LESS],
207 POP_ASSUM(MP_TAC o SPEC (Term `2:num`) o CONJUNCT2) THEN
208 REWRITE_TAC[TWO, GSYM SUC_NOT, GREATER_EQ] THEN
209 CONV_TAC CONTRAPOS_CONV THEN
210 REWRITE_TAC[ONE, NOT_SUC_LESS_EQ, CONJUNCT1 LE] THEN
211 DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[NOT_SUC, NOT_IMP] THEN
212 REWRITE_TAC[LE] THEN CONV_TAC(RAND_CONV SYM_CONV) THEN
213 MATCH_MP_TAC REAL_LT_IMP_NE THEN POP_ASSUM ACCEPT_TAC],
214 DISCH_THEN SUBST1_TAC THEN CONJ_TAC THENL
215 [GEN_TAC THEN REWRITE_TAC[ONE,LESS_THM, NOT_LESS_0] THEN
216 DISCH_THEN SUBST1_TAC THEN ASM_REWRITE_TAC[],
217 X_GEN_TAC (Term `n:num`) THEN REWRITE_TAC[GREATER_EQ,ONE]
218 THEN ASM_CASES_TAC (Term `n:num = 0`) THEN
219 ASM_REWRITE_TAC[CONJUNCT1 LE, GSYM NOT_SUC, NOT_SUC]]]
220QED
221
222Theorem DIVISION_SINGLE :
223 !a b. a <= b ==> division(a,b)(\n. if (n = 0) then a else b)
224Proof
225 REPEAT GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[division] THEN
226 BETA_TAC THEN REWRITE_TAC[] THEN
227 POP_ASSUM(DISJ_CASES_TAC o REWRITE_RULE[REAL_LE_LT]) THENL
228 [EXISTS_TAC (Term `1:num`) THEN CONJ_TAC THEN X_GEN_TAC (Term `n:num`) THENL
229 [REWRITE_TAC[LESS_1] THEN DISCH_THEN SUBST1_TAC THEN
230 ASM_REWRITE_TAC[NOT_SUC],
231 REWRITE_TAC[GREATER_EQ] THEN
232 COND_CASES_TAC THEN ASM_REWRITE_TAC[ONE] THEN
233 REWRITE_TAC[LE, NOT_SUC]],
234 EXISTS_TAC (Term `0:num`) THEN REWRITE_TAC[NOT_LESS_0] THEN
235 ASM_REWRITE_TAC[COND_ID]]
236QED
237
238Theorem DIVISION_LHS :
239 !D a b. division(a,b) D ==> (D(0) = a)
240Proof
241 REPEAT GEN_TAC THEN REWRITE_TAC[division] THEN
242 DISCH_THEN(fn th => REWRITE_TAC[th])
243QED
244
245Theorem DIVISION_THM :
246 !D a b. division(a,b) D <=>
247 (D(0) = a) /\
248 (!n. n < dsize D ==> D(n) < D(SUC n)) /\
249 (!n. n >= dsize D ==> D(n) = b)
250Proof
251 REPEAT GEN_TAC THEN REWRITE_TAC[division] THEN
252 EQ_TAC THEN DISCH_TAC THEN ASM_REWRITE_TAC[] THENL
253 [ALL_TAC, EXISTS_TAC (Term `dsize D`) THEN ASM_REWRITE_TAC[]] THEN
254 POP_ASSUM(X_CHOOSE_THEN (Term `N:num`) STRIP_ASSUME_TAC o CONJUNCT2) THEN
255 SUBGOAL_THEN (Term `dsize D:num = N`) (fn th => ASM_REWRITE_TAC[th]) THEN
256 REWRITE_TAC[dsize] THEN MATCH_MP_TAC SELECT_UNIQUE THEN
257 X_GEN_TAC (Term `M:num`) THEN BETA_TAC THEN EQ_TAC THENL
258 [ALL_TAC, DISCH_THEN SUBST1_TAC THEN ASM_REWRITE_TAC[] THEN
259 MP_TAC(SPEC (Term `N:num`) (ASSUME (Term `!n:num. n >= N ==> (D n:real = b)`)))
260 THEN DISCH_THEN(MP_TAC o REWRITE_RULE[GREATER_EQ, LESS_EQ_REFL]) THEN
261 DISCH_THEN SUBST1_TAC THEN FIRST_ASSUM MATCH_ACCEPT_TAC] THEN
262 REPEAT_TCL DISJ_CASES_THEN ASSUME_TAC
263 (SPECL [Term `M:num`, Term `N:num`] LESS_LESS_CASES) THEN
264 ASM_REWRITE_TAC[] THENL
265 [DISCH_THEN(MP_TAC o SPEC (Term `SUC M`) o CONJUNCT2) THEN
266 REWRITE_TAC[GREATER_EQ, LESS_EQ_SUC_REFL] THEN DISCH_TAC THEN
267 UNDISCH_TAC (Term `!n:num. n < N ==> (D n) < (D(SUC n))`) THEN
268 DISCH_THEN(MP_TAC o SPEC (Term`M:num`)) THEN ASM_REWRITE_TAC[REAL_LT_REFL],
269 DISCH_THEN(MP_TAC o SPEC (Term`N:num`) o CONJUNCT1) THEN ASM_REWRITE_TAC[]
270 THEN UNDISCH_TAC (Term`!n:num. n >= N ==> (D n:real = b)`) THEN
271 DISCH_THEN(fn th => MP_TAC(SPEC (Term`N:num`) th) THEN
272 MP_TAC(SPEC (Term`SUC N`) th)) THEN
273 REWRITE_TAC[GREATER_EQ, LESS_EQ_SUC_REFL, LESS_EQ_REFL] THEN
274 DISCH_THEN SUBST1_TAC THEN DISCH_THEN SUBST1_TAC THEN
275 REWRITE_TAC[REAL_LT_REFL]]
276QED
277
278Theorem DIVISION_RHS :
279 !D a b. division(a,b) D ==> (D(dsize D) = b)
280Proof
281 REPEAT GEN_TAC THEN REWRITE_TAC[DIVISION_THM] THEN
282 DISCH_THEN(MP_TAC o SPEC (Term`dsize D`) o last o CONJUNCTS) THEN
283 REWRITE_TAC[GREATER_EQ, LESS_EQ_REFL]
284QED
285
286Theorem DIVISION_LT_GEN :
287 !D a b m n. division(a,b) D /\ m < n /\ n <= (dsize D) ==> D(m) < D(n)
288Proof
289 REPEAT STRIP_TAC THEN UNDISCH_TAC (Term`m:num < n`) THEN
290 DISCH_THEN(X_CHOOSE_THEN (Term`d:num`) MP_TAC o MATCH_MP LESS_ADD_1) THEN
291 REWRITE_TAC[GSYM ADD1] THEN DISCH_THEN SUBST_ALL_TAC THEN
292 UNDISCH_TAC (Term `m + SUC d <= dsize D`) THEN
293 SPEC_TAC(Term`d:num`,Term`d:num`) THEN INDUCT_TAC THENL
294 [REWRITE_TAC[ADD_CLAUSES] THEN
295 DISCH_THEN(MP_TAC o MATCH_MP OR_LESS) THEN
296 RULE_ASSUM_TAC(REWRITE_RULE[DIVISION_THM]) THEN ASM_REWRITE_TAC[],
297 REWRITE_TAC[ADD_CLAUSES] THEN
298 DISCH_THEN(MP_TAC o MATCH_MP OR_LESS) THEN
299 DISCH_TAC THEN MATCH_MP_TAC REAL_LT_TRANS THEN
300 EXISTS_TAC (Term`D(m + SUC d):real`) THEN CONJ_TAC THENL
301 [FIRST_ASSUM MATCH_MP_TAC THEN REWRITE_TAC[ADD_CLAUSES] THEN
302 MATCH_MP_TAC LESS_IMP_LESS_OR_EQ THEN ASM_REWRITE_TAC[],
303 REWRITE_TAC[ADD_CLAUSES] THEN
304 FIRST_ASSUM(MATCH_MP_TAC o el 2 o
305 CONJUNCTS o REWRITE_RULE[DIVISION_THM]) THEN
306 ASM_REWRITE_TAC[]]]
307QED
308
309Theorem DIVISION_LT :
310 !D a b. division(a,b) D ==> !n. n < (dsize D) ==> D(0) < D(SUC n)
311Proof
312 REPEAT GEN_TAC THEN REWRITE_TAC[DIVISION_THM] THEN STRIP_TAC THEN
313 INDUCT_TAC THEN DISCH_THEN(fn th => ASSUME_TAC th THEN
314 FIRST_ASSUM(MP_TAC o C MATCH_MP th)) THEN
315 ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
316 MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC (Term`D(SUC n):real`) THEN
317 ASM_REWRITE_TAC[] THEN UNDISCH_TAC (Term`D(0:num):real = a`) THEN
318 DISCH_THEN(SUBST1_TAC o SYM) THEN FIRST_ASSUM MATCH_MP_TAC THEN
319 MATCH_MP_TAC LESS_TRANS THEN EXISTS_TAC (Term`SUC n`) THEN
320 ASM_REWRITE_TAC[LESS_SUC_REFL]
321QED
322
323Theorem DIVISION_LE :
324 !D a b. division(a,b) D ==> a <= b
325Proof
326 REPEAT GEN_TAC THEN DISCH_TAC THEN
327 FIRST_ASSUM(MP_TAC o MATCH_MP DIVISION_LT) THEN
328 POP_ASSUM(STRIP_ASSUME_TAC o REWRITE_RULE[DIVISION_THM]) THEN
329 UNDISCH_TAC (Term`D(0:num):real = a`) THEN DISCH_THEN(SUBST1_TAC o SYM) THEN
330 UNDISCH_TAC (Term`!n. n >= (dsize D) ==> (D n = b)`) THEN
331 DISCH_THEN(MP_TAC o SPEC (Term`dsize D`)) THEN
332 REWRITE_TAC[GREATER_EQ, LESS_EQ_REFL] THEN
333 DISCH_THEN(SUBST1_TAC o SYM) THEN
334 DISCH_THEN(MP_TAC o SPEC (Term`PRE(dsize D)`)) THEN
335 STRUCT_CASES_TAC(SPEC (Term`dsize D`) num_CASES) THEN
336 ASM_REWRITE_TAC[PRE, REAL_LE_REFL, LESS_SUC_REFL, REAL_LT_IMP_LE]
337QED
338
339Theorem DIVISION_GT :
340 !D a b. division(a,b) D ==> !n. n < (dsize D) ==> D(n) < D(dsize D)
341Proof
342 REPEAT STRIP_TAC THEN MATCH_MP_TAC DIVISION_LT_GEN THEN
343 MAP_EVERY EXISTS_TAC [Term`a:real`, Term`b:real`] THEN
344 ASM_REWRITE_TAC[LESS_EQ_REFL]
345QED
346
347Theorem DIVISION_EQ :
348 !D a b. division(a,b) D ==> ((a = b) <=> (dsize D = 0))
349Proof
350 REPEAT GEN_TAC THEN DISCH_TAC THEN
351 FIRST_ASSUM(MP_TAC o MATCH_MP DIVISION_LT) THEN
352 POP_ASSUM(STRIP_ASSUME_TAC o REWRITE_RULE[DIVISION_THM]) THEN
353 UNDISCH_TAC (Term`D(0:num):real = a`) THEN DISCH_THEN(SUBST1_TAC o SYM) THEN
354 UNDISCH_TAC (Term`!n. n >= (dsize D) ==> (D n = b)`) THEN
355 DISCH_THEN(MP_TAC o SPEC (Term`dsize D`)) THEN
356 REWRITE_TAC[GREATER_EQ, LESS_EQ_REFL] THEN
357 DISCH_THEN(SUBST1_TAC o SYM) THEN
358 DISCH_THEN(MP_TAC o SPEC (Term`PRE(dsize D)`)) THEN
359 STRUCT_CASES_TAC(SPEC (Term`dsize D`) num_CASES) THEN
360 ASM_REWRITE_TAC[PRE, NOT_SUC, LESS_SUC_REFL, REAL_LT_IMP_NE]
361QED
362
363Theorem DIVISION_LBOUND :
364 !D a b. division(a,b) D ==> !r. a <= D(r)
365Proof
366 REPEAT GEN_TAC THEN REWRITE_TAC[DIVISION_THM] THEN STRIP_TAC THEN
367 INDUCT_TAC THEN ASM_REWRITE_TAC[REAL_LE_REFL] THEN
368 DISJ_CASES_TAC(SPECL [Term`SUC r`, Term`dsize D`] LESS_CASES) THENL
369 [MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC (Term`(D:num->real) r`) THEN
370 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_LT_IMP_LE THEN
371 FIRST_ASSUM MATCH_MP_TAC THEN
372 MATCH_MP_TAC LESS_TRANS THEN EXISTS_TAC (Term`SUC r`) THEN
373 ASM_REWRITE_TAC[LESS_SUC_REFL],
374 MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC (Term`b:real`) THEN CONJ_TAC
375 THENL
376 [MATCH_MP_TAC DIVISION_LE THEN
377 EXISTS_TAC (Term`D:num->real`) THEN ASM_REWRITE_TAC[DIVISION_THM],
378 MATCH_MP_TAC REAL_EQ_IMP_LE THEN CONV_TAC SYM_CONV THEN
379 FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[GREATER_EQ]]]
380QED
381
382Theorem DIVISION_LBOUND_LT :
383 !D a b. division(a,b) D /\ ~(dsize D = 0) ==> !n. a < D(SUC n)
384Proof
385 REPEAT STRIP_TAC THEN
386 FIRST_ASSUM(SUBST1_TAC o SYM o MATCH_MP DIVISION_LHS) THEN
387 DISJ_CASES_TAC(SPECL [Term`dsize D`, Term`SUC n`] LESS_CASES) THENL
388 [FIRST_ASSUM(MP_TAC o el 3 o CONJUNCTS o REWRITE_RULE[DIVISION_THM]) THEN
389 DISCH_THEN(MP_TAC o SPEC (Term`SUC n`)) THEN REWRITE_TAC[GREATER_EQ] THEN
390 IMP_RES_THEN ASSUME_TAC LESS_IMP_LESS_OR_EQ THEN ASM_REWRITE_TAC[] THEN
391 DISCH_THEN SUBST1_TAC THEN
392 FIRST_ASSUM(SUBST1_TAC o SYM o MATCH_MP DIVISION_RHS) THEN
393 FIRST_ASSUM(MATCH_MP_TAC o MATCH_MP DIVISION_GT) THEN
394 ASM_REWRITE_TAC[GSYM NOT_LESS_EQUAL, CONJUNCT1 LE],
395 FIRST_ASSUM(MATCH_MP_TAC o MATCH_MP DIVISION_LT) THEN
396 MATCH_MP_TAC OR_LESS THEN ASM_REWRITE_TAC[]]
397QED
398
399Theorem DIVISION_UBOUND :
400 !D a b. division(a,b) D ==> !r. D(r) <= b
401Proof
402 REPEAT GEN_TAC THEN REWRITE_TAC[DIVISION_THM] THEN STRIP_TAC THEN
403 GEN_TAC THEN DISJ_CASES_TAC(SPECL [Term`r:num`, Term`dsize D`] LESS_CASES)
404 THENL [ALL_TAC,
405 MATCH_MP_TAC REAL_EQ_IMP_LE THEN FIRST_ASSUM MATCH_MP_TAC THEN
406 ASM_REWRITE_TAC[GREATER_EQ]] THEN
407 SUBGOAL_THEN (Term`!r. D((dsize D) - r) <= b`) MP_TAC THENL
408 [ALL_TAC,
409 DISCH_THEN(MP_TAC o SPEC (Term`(dsize D) - r`)) THEN
410 MATCH_MP_TAC(TAUT_CONV “(a <=> b) ==> a ==> b”) THEN
411 AP_THM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN
412 FIRST_ASSUM(fn th => REWRITE_TAC[MATCH_MP SUB_SUB
413 (MATCH_MP LESS_IMP_LESS_OR_EQ th)])
414 THEN ONCE_REWRITE_TAC[ADD_SYM] THEN REWRITE_TAC[ADD_SUB]] THEN
415 UNDISCH_TAC (Term`r < dsize D`) THEN DISCH_THEN(K ALL_TAC) THEN
416 INDUCT_TAC THENL
417 [REWRITE_TAC[SUB_0] THEN MATCH_MP_TAC REAL_EQ_IMP_LE THEN
418 FIRST_ASSUM MATCH_MP_TAC THEN REWRITE_TAC[GREATER_EQ, LESS_EQ_REFL],
419 ALL_TAC] THEN
420 DISJ_CASES_TAC(SPECL [Term`r:num`, Term`dsize D`] LESS_CASES) THENL
421 [ALL_TAC,
422 SUBGOAL_THEN (Term`(dsize D) - (SUC r) = 0`) SUBST1_TAC THENL
423 [REWRITE_TAC[SUB_EQ_0] THEN MATCH_MP_TAC LESS_EQ_TRANS THEN
424 EXISTS_TAC (Term`r:num`) THEN ASM_REWRITE_TAC[LESS_EQ_SUC_REFL],
425 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC DIVISION_LE THEN
426 EXISTS_TAC (Term`D:num->real`) THEN ASM_REWRITE_TAC[DIVISION_THM]]] THEN
427 MATCH_MP_TAC REAL_LE_TRANS THEN
428 EXISTS_TAC (Term`D((dsize D) - r):real`) THEN ASM_REWRITE_TAC[] THEN
429 SUBGOAL_THEN (Term`(dsize D) - r = SUC((dsize D) - (SUC r))`)
430 SUBST1_TAC THENL
431 [ALL_TAC,
432 MATCH_MP_TAC REAL_LT_IMP_LE THEN FIRST_ASSUM MATCH_MP_TAC THEN
433 MATCH_MP_TAC LESS_CASES_IMP THEN
434 REWRITE_TAC[NOT_LESS, SUB_LESS_EQ] THEN
435 CONV_TAC(RAND_CONV SYM_CONV) THEN
436 REWRITE_TAC[SUB_EQ_EQ_0, NOT_SUC] THEN
437 DISCH_THEN SUBST_ALL_TAC THEN
438 UNDISCH_TAC (Term`r:num < 0`) THEN REWRITE_TAC[NOT_LESS_0]] THEN
439 MP_TAC(SPECL [Term`dsize D`, Term`SUC r`] (CONJUNCT2 SUB)) THEN
440 COND_CASES_TAC THENL
441 [REWRITE_TAC[SUB_EQ_0, LESS_EQ_MONO] THEN
442 ASM_REWRITE_TAC[GSYM NOT_LESS],
443 DISCH_THEN (SUBST1_TAC o SYM) THEN REWRITE_TAC[SUB_MONO_EQ]]
444QED
445
446Theorem DIVISION_UBOUND_LT :
447 !D a b n. division(a,b) D /\ n < dsize D ==> D(n) < b
448Proof
449 REPEAT STRIP_TAC THEN
450 FIRST_ASSUM(SUBST1_TAC o SYM o MATCH_MP DIVISION_RHS) THEN
451 FIRST_ASSUM(MATCH_MP_TAC o MATCH_MP DIVISION_GT) THEN
452 ASM_REWRITE_TAC[]
453QED
454
455(* ------------------------------------------------------------------------ *)
456(* Divisions of adjacent intervals can be combined into one *)
457(* ------------------------------------------------------------------------ *)
458
459val D_tm = Term`\n. if n < dsize D1 then D1(n) else D2(n - dsize D1)`
460and p_tm = Term`\n. if n < dsize D1 then (p1:num->real)(n) else p2(n - dsize D1)`;
461
462Theorem DIVISION_APPEND_LEMMA1[local] :
463 !a b c D1 D2. division(a,b) D1 /\ division(b,c) D2 ==>
464 (!n. n < dsize D1 + dsize D2 ==>
465 (\n. if n < dsize D1 then D1(n) else D2(n - dsize D1)) (n)
466 <
467 (\n. if n < dsize D1 then D1(n) else D2(n - dsize D1)) (SUC n)) /\
468 (!n. n >= dsize D1 + dsize D2 ==>
469 (\n. if n<dsize D1 then D1(n) else D2(n - dsize D1)) (n)
470 =
471 (\n. if n<dsize D1 then D1(n) else D2(n - dsize D1)) (dsize D1 + dsize D2))
472Proof
473 REPEAT GEN_TAC THEN STRIP_TAC THEN CONJ_TAC THEN
474 X_GEN_TAC (Term`n:num`) THEN DISCH_TAC THEN BETA_TAC THENL
475 [ASM_CASES_TAC (Term`SUC n < dsize D1`) THEN ASM_REWRITE_TAC[] THENL
476 [SUBGOAL_THEN (Term`n < dsize D1`) ASSUME_TAC THEN
477 ASM_REWRITE_TAC[] THENL
478 [MATCH_MP_TAC LESS_TRANS THEN EXISTS_TAC (Term`SUC n`) THEN
479 ASM_REWRITE_TAC[LESS_SUC_REFL],
480 UNDISCH_TAC (Term`division(a,b) D1`) THEN REWRITE_TAC[DIVISION_THM] THEN
481 STRIP_TAC THEN FIRST_ASSUM MATCH_MP_TAC THEN
482 FIRST_ASSUM ACCEPT_TAC],
483 ASM_CASES_TAC (Term`n < dsize D1`) THEN ASM_REWRITE_TAC[] THENL
484 [RULE_ASSUM_TAC(REWRITE_RULE[NOT_LESS]) THEN
485 MATCH_MP_TAC REAL_LTE_TRANS THEN EXISTS_TAC (Term`b:real`) THEN
486 CONJ_TAC THENL
487 [MATCH_MP_TAC DIVISION_UBOUND_LT THEN
488 EXISTS_TAC (Term`a:real`) THEN ASM_REWRITE_TAC[],
489 MATCH_MP_TAC DIVISION_LBOUND THEN
490 EXISTS_TAC (Term`c:real`) THEN ASM_REWRITE_TAC[]],
491 UNDISCH_TAC (Term`~(n < dsize D1)`) THEN
492 REWRITE_TAC[NOT_LESS] THEN
493 DISCH_THEN(X_CHOOSE_THEN (Term`d:num`) SUBST_ALL_TAC o
494 REWRITE_RULE[LESS_EQ_EXISTS]) THEN
495 REWRITE_TAC[SUB, GSYM NOT_LESS_EQUAL, LESS_EQ_ADD] THEN
496 ONCE_REWRITE_TAC[ADD_SYM] THEN REWRITE_TAC[ADD_SUB] THEN
497 FIRST_ASSUM(MATCH_MP_TAC o Lib.trye el 2 o CONJUNCTS o
498 REWRITE_RULE[DIVISION_THM]) THEN
499 UNDISCH_TAC (Term`dsize D1 + d < dsize D1 + dsize D2`) THEN
500 ONCE_REWRITE_TAC[ADD_SYM] THEN REWRITE_TAC[LESS_MONO_ADD_EQ]]],
501 REWRITE_TAC[GSYM NOT_LESS_EQUAL, LESS_EQ_ADD] THEN
502 ONCE_REWRITE_TAC[ADD_SYM] THEN REWRITE_TAC[ADD_SUB] THEN
503 REWRITE_TAC[NOT_LESS_EQUAL] THEN COND_CASES_TAC THEN
504 UNDISCH_TAC (Term`n >= dsize D1 + dsize D2`) THENL
505 [CONV_TAC CONTRAPOS_CONV THEN DISCH_TAC THEN
506 REWRITE_TAC[GREATER_EQ, NOT_LESS_EQUAL] THEN
507 MATCH_MP_TAC LESS_IMP_LESS_ADD THEN ASM_REWRITE_TAC[],
508 REWRITE_TAC[GREATER_EQ, LESS_EQ_EXISTS] THEN
509 DISCH_THEN(X_CHOOSE_THEN (Term`d:num`) SUBST_ALL_TAC) THEN
510 REWRITE_TAC[GSYM ADD_ASSOC] THEN ONCE_REWRITE_TAC[ADD_SYM] THEN
511 REWRITE_TAC[ADD_SUB] THEN
512 FIRST_ASSUM(CHANGED_TAC o
513 (SUBST1_TAC o MATCH_MP DIVISION_RHS)) THEN
514 FIRST_ASSUM(MATCH_MP_TAC o el 3 o CONJUNCTS o
515 REWRITE_RULE[DIVISION_THM]) THEN
516 REWRITE_TAC[GREATER_EQ, LESS_EQ_ADD]]]
517QED
518
519Theorem DIVISION_APPEND_LEMMA2[local] :
520 !a b c D1 D2. division(a,b) D1 /\ division(b,c) D2 ==>
521 (dsize(\n. if n < dsize D1 then D1(n) else D2(n - dsize D1))
522 =
523 dsize D1 + dsize D2)
524Proof
525 REPEAT STRIP_TAC THEN GEN_REWRITE_TAC LAND_CONV empty_rewrites [dsize] THEN
526 MATCH_MP_TAC SELECT_UNIQUE THEN
527 X_GEN_TAC (Term`N:num`) THEN BETA_TAC THEN EQ_TAC THENL
528 [DISCH_THEN(curry op THEN (MATCH_MP_TAC LESS_EQUAL_ANTISYM) o MP_TAC) THEN
529 CONV_TAC CONTRAPOS_CONV THEN
530 REWRITE_TAC[DE_MORGAN_THM, NOT_LESS_EQUAL] THEN
531 DISCH_THEN DISJ_CASES_TAC THENL
532 [DISJ1_TAC THEN
533 DISCH_THEN(MP_TAC o SPEC (Term`dsize D1 + dsize D2`)) THEN
534 ASM_REWRITE_TAC[] THEN
535 REWRITE_TAC[GSYM NOT_LESS_EQUAL, LESS_EQ_ADD] THEN
536 SUBGOAL_THEN (Term`!x y. x <= SUC(x + y)`) ASSUME_TAC THENL
537 [REPEAT GEN_TAC THEN MATCH_MP_TAC LESS_EQ_TRANS THEN
538 EXISTS_TAC (Term`(x:num) + y`) THEN
539 REWRITE_TAC[LESS_EQ_ADD, LESS_EQ_SUC_REFL], ALL_TAC] THEN
540 ASM_REWRITE_TAC[] THEN REWRITE_TAC[SUB, GSYM NOT_LESS_EQUAL] THEN
541 REWRITE_TAC[LESS_EQ_ADD] THEN ONCE_REWRITE_TAC[ADD_SYM] THEN
542 REWRITE_TAC[ADD_SUB] THEN
543 MP_TAC(ASSUME (Term`division(b,c) D2`)) THEN REWRITE_TAC[DIVISION_THM]
544 THEN DISCH_THEN(MP_TAC o SPEC (Term`SUC(dsize D2)`) o el 3 o CONJUNCTS)
545 THEN REWRITE_TAC[GREATER_EQ, LESS_EQ_SUC_REFL] THEN
546 DISCH_THEN SUBST1_TAC THEN
547 FIRST_ASSUM(CHANGED_TAC o SUBST1_TAC o MATCH_MP DIVISION_RHS) THEN
548 REWRITE_TAC[REAL_LT_REFL],
549 DISJ2_TAC THEN
550 DISCH_THEN(MP_TAC o SPEC (Term`dsize D1 + dsize D2`)) THEN
551 FIRST_ASSUM(ASSUME_TAC o MATCH_MP LESS_IMP_LESS_OR_EQ) THEN
552 ASM_REWRITE_TAC[GREATER_EQ] THEN
553 REWRITE_TAC[GSYM NOT_LESS_EQUAL, LESS_EQ_ADD] THEN
554 ONCE_REWRITE_TAC[ADD_SYM] THEN REWRITE_TAC[ADD_SUB] THEN
555 COND_CASES_TAC THENL
556 [SUBGOAL_THEN (Term`D1(N:num) < D2(dsize D2)`) MP_TAC THENL
557 [MATCH_MP_TAC REAL_LTE_TRANS THEN EXISTS_TAC (Term`b:real`) THEN
558 CONJ_TAC THENL
559 [MATCH_MP_TAC DIVISION_UBOUND_LT THEN EXISTS_TAC (Term`a:real`) THEN
560 ASM_REWRITE_TAC[GSYM NOT_LESS_EQUAL],
561 MATCH_MP_TAC DIVISION_LBOUND THEN
562 EXISTS_TAC (Term`c:real`) THEN ASM_REWRITE_TAC[]],
563 CONV_TAC CONTRAPOS_CONV THEN ASM_REWRITE_TAC[] THEN
564 DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[REAL_LT_REFL]],
565 RULE_ASSUM_TAC(REWRITE_RULE[]) THEN
566 SUBGOAL_THEN (Term`D2(N - dsize D1) < D2(dsize D2)`) MP_TAC THENL
567 [MATCH_MP_TAC DIVISION_LT_GEN THEN
568 MAP_EVERY EXISTS_TAC [Term`b:real`, Term`c:real`] THEN
569 ASM_REWRITE_TAC[LESS_EQ_REFL] THEN
570 REWRITE_TAC[GSYM NOT_LESS_EQUAL] THEN
571 REWRITE_TAC[SUB_LEFT_LESS_EQ, DE_MORGAN_THM] THEN
572 ONCE_REWRITE_TAC[ADD_SYM] THEN ASM_REWRITE_TAC[NOT_LESS_EQUAL] THEN
573 UNDISCH_TAC (Term`dsize(D1) <= N`) THEN
574 REWRITE_TAC[LESS_EQ_EXISTS] THEN
575 DISCH_THEN(X_CHOOSE_THEN (Term`d:num`) SUBST_ALL_TAC) THEN
576 RULE_ASSUM_TAC(ONCE_REWRITE_RULE[ADD_SYM]) THEN
577 RULE_ASSUM_TAC(REWRITE_RULE[LESS_MONO_ADD_EQ]) THEN
578 MATCH_MP_TAC LESS_EQ_LESS_TRANS THEN EXISTS_TAC (Term`d:num`) THEN
579 ASM_REWRITE_TAC[ZERO_LESS_EQ],
580 CONV_TAC CONTRAPOS_CONV THEN REWRITE_TAC[] THEN
581 DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[REAL_LT_REFL]]]],
582 DISCH_THEN SUBST1_TAC THEN CONJ_TAC THENL
583 [X_GEN_TAC (Term`n:num`) THEN DISCH_TAC THEN
584 ASM_CASES_TAC (Term`SUC n < dsize D1`) THEN
585 ASM_REWRITE_TAC[] THENL
586 [SUBGOAL_THEN (Term`n < dsize D1`) ASSUME_TAC THENL
587 [MATCH_MP_TAC LESS_TRANS THEN EXISTS_TAC (Term`SUC n`) THEN
588 ASM_REWRITE_TAC[LESS_SUC_REFL], ALL_TAC] THEN
589 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC DIVISION_LT_GEN THEN
590 MAP_EVERY EXISTS_TAC [Term`a:real`, Term`b:real`] THEN
591 ASM_REWRITE_TAC[LESS_SUC_REFL] THEN
592 MATCH_MP_TAC LESS_IMP_LESS_OR_EQ THEN ASM_REWRITE_TAC[],
593 COND_CASES_TAC THENL
594 [MATCH_MP_TAC REAL_LTE_TRANS THEN EXISTS_TAC (Term`b:real`) THEN
595 CONJ_TAC THENL
596 [MATCH_MP_TAC DIVISION_UBOUND_LT THEN EXISTS_TAC (Term`a:real`) THEN
597 ASM_REWRITE_TAC[],
598 FIRST_ASSUM(MATCH_ACCEPT_TAC o MATCH_MP DIVISION_LBOUND)],
599 MATCH_MP_TAC DIVISION_LT_GEN THEN
600 MAP_EVERY EXISTS_TAC [Term`b:real`, Term`c:real`] THEN
601 ASM_REWRITE_TAC[] THEN
602 CONJ_TAC THENL [ASM_REWRITE_TAC[SUB, LESS_SUC_REFL], ALL_TAC] THEN
603 REWRITE_TAC[REWRITE_RULE[GREATER_EQ] SUB_LEFT_GREATER_EQ] THEN
604 ONCE_REWRITE_TAC[ADD_SYM] THEN ASM_REWRITE_TAC[GSYM LESS_EQ]]],
605 X_GEN_TAC (Term`n:num`) THEN REWRITE_TAC[GREATER_EQ] THEN DISCH_TAC THEN
606 REWRITE_TAC[GSYM NOT_LESS_EQUAL,LESS_EQ_ADD] THEN
607 SUBGOAL_THEN (Term`dsize D1 <= n`) ASSUME_TAC THENL
608 [MATCH_MP_TAC LESS_EQ_TRANS THEN
609 EXISTS_TAC (Term `dsize D1 + dsize D2`) THEN
610 ASM_REWRITE_TAC[LESS_EQ_ADD],
611 ASM_REWRITE_TAC[] THEN ONCE_REWRITE_TAC[ADD_SYM] THEN
612 REWRITE_TAC[ADD_SUB] THEN
613 FIRST_ASSUM(CHANGED_TAC o SUBST1_TAC o MATCH_MP DIVISION_RHS) THEN
614 FIRST_ASSUM(MATCH_MP_TAC o el 3 o
615 CONJUNCTS o REWRITE_RULE[DIVISION_THM]) THEN
616 REWRITE_TAC[GREATER_EQ, SUB_LEFT_LESS_EQ] THEN
617 ONCE_REWRITE_TAC[ADD_SYM] THEN ASM_REWRITE_TAC[]]]]
618QED
619
620Theorem DIVISION_APPEND_EXPLICIT[local] :
621 !a b c g d1 p1 d2 p2.
622 tdiv(a,b) (d1,p1) /\
623 fine g (d1,p1) /\
624 tdiv(b,c) (d2,p2) /\
625 fine g (d2,p2)
626 ==> tdiv(a,c)
627 ((\n. if n < dsize d1 then d1(n) else d2(n - (dsize d1))),
628 (\n. if n < dsize d1
629 then p1(n) else p2(n - (dsize d1)))) /\
630 fine g ((\n. if n < dsize d1 then d1(n) else d2(n - (dsize d1))),
631 (\n. if n < dsize d1
632 then p1(n) else p2(n - (dsize d1)))) /\
633 !f. rsum((\n. if n < dsize d1 then d1(n) else d2(n - (dsize d1))),
634 (\n. if n < dsize d1
635 then p1(n) else p2(n - (dsize d1)))) f =
636 rsum(d1,p1) f + rsum(d2,p2) f
637Proof
638 MAP_EVERY X_GEN_TAC
639 [Term`a:real`, Term`b:real`, Term`c:real`, Term`g:real->real`,
640 Term`D1:num->real`, Term`p1:num->real`, Term`D2:num->real`,
641 Term`p2:num->real`] THEN
642 STRIP_TAC THEN REWRITE_TAC[CONJ_ASSOC] THEN CONJ_TAC THENL
643 [DISJ_CASES_TAC(GSYM (SPEC “dsize(D1)” LESS_0_CASES)) THENL
644 [ASM_REWRITE_TAC[NOT_LESS_0, SUB_0] THEN
645 CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN
646 SUBGOAL_THEN “a:real = b” (fn th => ASM_REWRITE_TAC[th]) THEN
647 MP_TAC(SPECL [Term`D1:num->real`,Term`a:real`,Term`b:real`]
648 DIVISION_EQ) THEN
649 RULE_ASSUM_TAC(REWRITE_RULE[tdiv]) THEN ASM_REWRITE_TAC[], ALL_TAC] THEN
650 CONJ_TAC THENL
651 [ALL_TAC,
652 REWRITE_TAC[fine] THEN X_GEN_TAC (Term`n:num`) THEN
653 RULE_ASSUM_TAC(REWRITE_RULE[tdiv]) THEN
654 MP_TAC(SPECL [Term`a:real`, Term`b:real`, Term`c:real`,
655 Term`D1:num->real`, Term`D2:num->real`]
656 DIVISION_APPEND_LEMMA2) THEN
657 ASM_REWRITE_TAC[] THEN DISCH_TAC THEN ASM_REWRITE_TAC[] THEN
658 BETA_TAC THEN DISCH_TAC THEN ASM_CASES_TAC (Term`SUC n < dsize D1`) THEN
659 ASM_REWRITE_TAC[] THENL
660 [SUBGOAL_THEN (Term`n < dsize D1`) ASSUME_TAC THENL
661 [MATCH_MP_TAC LESS_TRANS THEN EXISTS_TAC (Term`SUC n`) THEN
662 ASM_REWRITE_TAC[LESS_SUC_REFL], ALL_TAC] THEN
663 ASM_REWRITE_TAC[] THEN
664 FIRST_ASSUM(MATCH_MP_TAC o REWRITE_RULE[fine]) THEN
665 ASM_REWRITE_TAC[],ALL_TAC] THEN
666 ASM_CASES_TAC (Term`n < dsize D1`) THEN ASM_REWRITE_TAC[] THENL
667 [SUBGOAL_THEN (Term`SUC n = dsize D1`) ASSUME_TAC THENL
668 [MATCH_MP_TAC LESS_EQUAL_ANTISYM THEN
669 ASM_REWRITE_TAC[GSYM NOT_LESS] THEN
670 REWRITE_TAC[NOT_LESS] THEN MATCH_MP_TAC LESS_OR THEN
671 ASM_REWRITE_TAC[],
672 ASM_REWRITE_TAC[SUB_EQUAL_0] THEN
673 FIRST_ASSUM(CHANGED_TAC o SUBST1_TAC o MATCH_MP DIVISION_LHS o
674 CONJUNCT1) THEN
675 FIRST_ASSUM(CHANGED_TAC o SUBST1_TAC o SYM o
676 MATCH_MP DIVISION_RHS o CONJUNCT1) THEN
677 SUBST1_TAC(SYM(ASSUME (Term`SUC n = dsize D1`))) THEN
678 FIRST_ASSUM(MATCH_MP_TAC o REWRITE_RULE[fine]) THEN
679 ASM_REWRITE_TAC[]],
680 ASM_REWRITE_TAC[SUB] THEN UNDISCH_TAC (Term`~(n < (dsize D1))`) THEN
681 REWRITE_TAC[LESS_EQ_EXISTS, NOT_LESS] THEN
682 DISCH_THEN(X_CHOOSE_THEN (Term`d:num`) SUBST_ALL_TAC) THEN
683 ONCE_REWRITE_TAC[ADD_SYM] THEN REWRITE_TAC[ADD_SUB] THEN
684 FIRST_ASSUM(MATCH_MP_TAC o REWRITE_RULE[fine]) THEN
685 RULE_ASSUM_TAC(ONCE_REWRITE_RULE[ADD_SYM]) THEN
686 RULE_ASSUM_TAC(REWRITE_RULE[LESS_MONO_ADD_EQ]) THEN
687 FIRST_ASSUM ACCEPT_TAC]] THEN
688 REWRITE_TAC[tdiv] THEN BETA_TAC THEN CONJ_TAC THENL
689 [RULE_ASSUM_TAC(REWRITE_RULE[tdiv]) THEN
690 REWRITE_TAC[DIVISION_THM] THEN CONJ_TAC THENL
691 [BETA_TAC THEN ASM_REWRITE_TAC[] THEN
692 MATCH_MP_TAC DIVISION_LHS THEN EXISTS_TAC “b:real” THEN
693 ASM_REWRITE_TAC[], ALL_TAC] THEN
694 SUBGOAL_THEN “c = (\n. if (n < (dsize D1)) then D1(n) else D2(n -
695 (dsize D1))) (dsize(D1) + dsize(D2))” SUBST1_TAC THENL
696 [BETA_TAC THEN REWRITE_TAC[GSYM NOT_LESS_EQUAL, LESS_EQ_ADD] THEN
697 ONCE_REWRITE_TAC[ADD_SYM] THEN REWRITE_TAC[ADD_SUB] THEN
698 CONV_TAC SYM_CONV THEN MATCH_MP_TAC DIVISION_RHS THEN
699 EXISTS_TAC (Term`b:real`) THEN ASM_REWRITE_TAC[], ALL_TAC] THEN
700 MP_TAC(SPECL [Term`a:real`, Term`b:real`, Term`c:real`,
701 Term`D1:num->real`, Term`D2:num->real`]
702 DIVISION_APPEND_LEMMA2) THEN
703 ASM_REWRITE_TAC[] THEN DISCH_THEN(fn th => REWRITE_TAC[th]) THEN
704 MATCH_MP_TAC DIVISION_APPEND_LEMMA1 THEN
705 MAP_EVERY EXISTS_TAC [Term`a:real`, Term`b:real`, Term`c:real`] THEN
706 ASM_REWRITE_TAC[], ALL_TAC] THEN
707 X_GEN_TAC (Term`n:num`) THEN RULE_ASSUM_TAC(REWRITE_RULE[tdiv]) THEN
708 ASM_CASES_TAC (Term`SUC n < dsize D1`) THEN ASM_REWRITE_TAC[] THENL
709 [SUBGOAL_THEN (Term`n < dsize D1`) ASSUME_TAC THENL
710 [MATCH_MP_TAC LESS_TRANS THEN EXISTS_TAC (Term`SUC n`) THEN
711 ASM_REWRITE_TAC[LESS_SUC_REFL], ALL_TAC] THEN
712 ASM_REWRITE_TAC[],ALL_TAC] THEN
713 COND_CASES_TAC THEN ASM_REWRITE_TAC[] THENL
714 [ASM_REWRITE_TAC[SUB] THEN
715 FIRST_ASSUM(CHANGED_TAC o SUBST1_TAC o MATCH_MP DIVISION_LHS o
716 CONJUNCT1) THEN
717 FIRST_ASSUM(CHANGED_TAC o SUBST1_TAC o SYM o
718 MATCH_MP DIVISION_RHS o CONJUNCT1) THEN
719 SUBGOAL_THEN (Term`dsize D1 = SUC n`) (fn th => ASM_REWRITE_TAC[th]) THEN
720 MATCH_MP_TAC LESS_EQUAL_ANTISYM THEN
721 ASM_REWRITE_TAC[GSYM NOT_LESS] THEN REWRITE_TAC[NOT_LESS] THEN
722 MATCH_MP_TAC LESS_OR THEN ASM_REWRITE_TAC[],
723 ASM_REWRITE_TAC[SUB]],
724 GEN_TAC THEN REWRITE_TAC[rsum] THEN
725 SUBGOAL_THEN(Term`(dsize(\n. if n < dsize D1 then D1 n else D2(n- dsize D1))
726 = dsize D1 + dsize D2)`)MP_TAC THENL
727 [UNDISCH_TAC(Term`tdiv(a,b)(D1,p1)`) THEN
728 UNDISCH_TAC(Term`tdiv(b,c)(D2,p2)`) THEN
729 REWRITE_TAC[tdiv] THEN REPEAT STRIP_TAC THEN
730 MP_TAC(SPECL [Term`a:real`, Term`b:real`, Term`c:real`,
731 Term`D1:num->real`, Term`D2:num->real`]
732 DIVISION_APPEND_LEMMA2) THEN
733 PROVE_TAC[],
734 DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[GSYM SUM_SPLIT] THEN
735 REWRITE_TAC[SUM_REINDEX] THEN BINOP_TAC THENL
736 [MATCH_MP_TAC SUM_EQ THEN SIMP_TAC pure_ss[ADD_CLAUSES] THEN
737 RW_TAC arith_ss[ETA_AX] THEN
738 SUBGOAL_THEN(Term`dsize D1 = SUC r`)MP_TAC THENL
739 [POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN REWRITE_TAC[NOT_LESS] THEN
740 REWRITE_TAC[LESS_EQ] THEN RW_TAC arith_ss[], DISCH_TAC THEN
741 ASM_SIMP_TAC arith_ss[] THEN UNDISCH_TAC(Term`tdiv(a,b)(D1,p1)`) THEN
742 UNDISCH_TAC(Term`tdiv(b,c)(D2,p2)`) THEN REWRITE_TAC[tdiv] THEN
743 REWRITE_TAC[DIVISION_THM] THEN REPEAT STRIP_TAC THEN
744 ASM_REWRITE_TAC[] THEN
745 SUBGOAL_THEN(Term`D1(SUC r) - D1 r = D1(dsize D1) - D1 r`)MP_TAC THENL
746 [PROVE_TAC[], ASM_SIMP_TAC arith_ss[]]],
747 ASM_SIMP_TAC arith_ss[GSYM ADD]]]]
748QED
749
750Theorem DIVISION_APPEND_STRONG :
751 !a b c D1 p1 D2 p2.
752 tdiv(a,b) (D1,p1) /\ fine(g) (D1,p1) /\
753 tdiv(b,c) (D2,p2) /\ fine(g) (D2,p2)
754 ==> ?D p. tdiv(a,c) (D,p) /\ fine(g) (D,p) /\
755 !f. rsum(D,p) f = rsum(D1,p1) f + rsum(D2,p2) f
756Proof
757 REPEAT STRIP_TAC THEN MAP_EVERY EXISTS_TAC
758 [Term`\n. if n < dsize D1 then D1(n):real else D2(n - (dsize D1))`,
759 Term`\n. if n < dsize D1 then p1(n):real else p2(n - (dsize D1))`] THEN
760 MATCH_MP_TAC DIVISION_APPEND_EXPLICIT THEN ASM_MESON_TAC[]
761QED
762
763Theorem DIVISION_APPEND :
764 !a b c.
765 (?D1 p1. tdiv(a,b) (D1,p1) /\ fine(g) (D1,p1)) /\
766 (?D2 p2. tdiv(b,c) (D2,p2) /\ fine(g) (D2,p2)) ==>
767 ?D p. tdiv(a,c) (D,p) /\ fine(g) (D,p)
768Proof
769 MESON_TAC[DIVISION_APPEND_STRONG]
770QED
771
772(* ------------------------------------------------------------------------ *)
773(* We can always find a division which is fine wrt any gauge *)
774(* ------------------------------------------------------------------------ *)
775
776(* This is also called Cousin's theorem [1, p.11].
777 cf. integrationTheory.FINE_DIVISION_EXISTS
778 *)
779Theorem DIVISION_EXISTS :
780 !a b g. a <= b /\ gauge(\x. a <= x /\ x <= b) g
781 ==>
782 ?D p. tdiv(a,b) (D,p) /\ fine(g) (D,p)
783Proof
784 REPEAT GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
785 (MP_TAC o C SPEC BOLZANO_LEMMA)
786 (Term `\(u,v). a <= u /\ v <= b
787 ==> ?D p. tdiv(u,v) (D,p) /\ fine(g) (D,p)`) THEN
788 CONV_TAC(ONCE_DEPTH_CONV PAIRED_BETA_CONV) THEN
789 W(C SUBGOAL_THEN (fn t => REWRITE_TAC[t]) o
790 funpow 2 (fst o dest_imp) o snd) THENL
791 [CONJ_TAC,
792 DISCH_THEN(MP_TAC o SPECL [Term`a:real`, Term`b:real`]) THEN
793 REWRITE_TAC[REAL_LE_REFL]]
794 THENL
795 [MAP_EVERY X_GEN_TAC [Term`u:real`, Term`v:real`, Term`w:real`] THEN
796 REPEAT STRIP_TAC THEN MATCH_MP_TAC DIVISION_APPEND THEN
797 EXISTS_TAC (Term`v:real`) THEN CONJ_TAC THEN
798 FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THENL
799 [MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC (Term`w:real`),
800 MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC (Term`u:real`)] THEN
801 ASM_REWRITE_TAC[], ALL_TAC] THEN
802 X_GEN_TAC (Term`x:real`) THEN ASM_CASES_TAC (Term`a <= x /\ x <= b`) THENL
803 [ALL_TAC,
804 EXISTS_TAC (Term`&1`) THEN REWRITE_TAC[REAL_LT_01] THEN
805 MAP_EVERY X_GEN_TAC [Term`w:real`, Term`y:real`] THEN STRIP_TAC THEN
806 CONV_TAC CONTRAPOS_CONV THEN DISCH_THEN(K ALL_TAC) THEN
807 FIRST_ASSUM(UNDISCH_TAC o assert is_neg o concl) THEN
808 REWRITE_TAC[DE_MORGAN_THM, REAL_NOT_LE] THEN
809 DISCH_THEN DISJ_CASES_TAC THENL
810 [DISJ1_TAC THEN MATCH_MP_TAC REAL_LET_TRANS,
811 DISJ2_TAC THEN MATCH_MP_TAC REAL_LTE_TRANS] THEN
812 EXISTS_TAC (Term`x:real`) THEN ASM_REWRITE_TAC[]] THEN
813 UNDISCH_TAC (Term`gauge(\x. a <= x /\ x <= b) g`) THEN
814 REWRITE_TAC[gauge] THEN BETA_TAC THEN
815 DISCH_THEN(fn th => FIRST_ASSUM(ASSUME_TAC o MATCH_MP th)) THEN
816 EXISTS_TAC (Term`(g:real->real) x`) THEN ASM_REWRITE_TAC[] THEN
817 MAP_EVERY X_GEN_TAC [Term`w:real`, Term`y:real`] THEN REPEAT STRIP_TAC THEN
818 EXISTS_TAC (Term`\n:num. if (n = 0) then (w:real) else y`) THEN
819 EXISTS_TAC (Term`\n:num. if (n = 0) then (x:real) else y`) THEN
820 SUBGOAL_THEN (Term`w <= y`) ASSUME_TAC THENL
821 [MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC (Term`x:real`) THEN
822 ASM_REWRITE_TAC[], ALL_TAC] THEN
823 CONJ_TAC THENL
824 [REWRITE_TAC[tdiv] THEN CONJ_TAC THENL
825 [MATCH_MP_TAC DIVISION_SINGLE THEN FIRST_ASSUM ACCEPT_TAC,
826 X_GEN_TAC (Term`n:num`) THEN BETA_TAC THEN REWRITE_TAC[NOT_SUC] THEN
827 COND_CASES_TAC THEN ASM_REWRITE_TAC[REAL_LE_REFL]],
828 REWRITE_TAC[fine] THEN BETA_TAC THEN REWRITE_TAC[NOT_SUC] THEN
829 X_GEN_TAC (Term`n:num`) THEN
830 DISJ_CASES_THEN MP_TAC (REWRITE_RULE[REAL_LE_LT] (ASSUME(Term`w <= y`)))
831 THENL
832 [DISCH_THEN(ASSUME_TAC o MATCH_MP DIVISION_1) THEN
833 ASM_REWRITE_TAC[num_CONV (Term`1:num`), LESS_THM, NOT_LESS_0] THEN
834 DISCH_THEN SUBST1_TAC THEN ASM_REWRITE_TAC[],
835 DISCH_THEN(SUBST1_TAC o MATCH_MP DIVISION_0) THEN
836 REWRITE_TAC[NOT_LESS_0]]]
837QED
838
839(* ------------------------------------------------------------------------- *)
840(* Definition of integral and integrability. *)
841(* ------------------------------------------------------------------------- *)
842
843val _ = hide "integrable";
844Definition integrable :
845 integrable(a,b) f = ?i. Dint(a,b) f i
846End
847
848val _ = hide "integral";
849Definition integral :
850 integral(a,b) f = @i. Dint(a,b) f i
851End
852
853Theorem INTEGRABLE_DINT:
854 !f a b. integrable(a,b) f ==> Dint(a,b) f (integral(a,b) f)
855Proof
856 REPEAT GEN_TAC THEN REWRITE_TAC[integrable, integral] THEN
857 CONV_TAC(RAND_CONV SELECT_CONV) THEN REWRITE_TAC[]
858QED
859
860(* ------------------------------------------------------------------------ *)
861(* Lemmas about combining gauges *)
862(* ------------------------------------------------------------------------ *)
863
864Theorem GAUGE_MIN:
865 !E g1 g2. gauge(E) g1 /\ gauge(E) g2 ==>
866 gauge(E) (\x. if g1(x) < g2(x) then g1(x) else g2(x))
867Proof
868 REPEAT GEN_TAC THEN REWRITE_TAC[gauge] THEN STRIP_TAC THEN
869 X_GEN_TAC (Term`x:real`) THEN BETA_TAC THEN DISCH_TAC THEN
870 COND_CASES_TAC THEN FIRST_ASSUM MATCH_MP_TAC THEN
871 FIRST_ASSUM ACCEPT_TAC
872QED
873
874Theorem FINE_MIN:
875 !g1 g2 D p.
876 fine (\x. if g1(x) < g2(x) then g1(x) else g2(x)) (D,p) ==>
877 fine(g1) (D,p) /\ fine(g2) (D,p)
878Proof
879 REPEAT GEN_TAC THEN REWRITE_TAC[fine] THEN
880 BETA_TAC THEN DISCH_TAC THEN CONJ_TAC THEN
881 X_GEN_TAC (Term`n:num`) THEN DISCH_THEN(ANTE_RES_THEN MP_TAC) THEN
882 COND_CASES_TAC THEN REWRITE_TAC[] THEN DISCH_TAC THENL
883 [RULE_ASSUM_TAC(REWRITE_RULE[REAL_NOT_LT]) THEN
884 MATCH_MP_TAC REAL_LTE_TRANS,
885 MATCH_MP_TAC REAL_LT_TRANS] THEN
886 FIRST_ASSUM(fn th => EXISTS_TAC(rand(concl th)) THEN
887 ASM_REWRITE_TAC[] THEN NO_TAC)
888QED
889
890(* ------------------------------------------------------------------------ *)
891(* The integral is unique if it exists *)
892(* ------------------------------------------------------------------------ *)
893
894Theorem DINT_UNIQ:
895 !a b f k1 k2.
896 a <= b /\ Dint(a,b) f k1 /\ Dint(a,b) f k2 ==> (k1 = k2)
897Proof
898 REPEAT GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
899 GEN_REWRITE_TAC RAND_CONV empty_rewrites [GSYM REAL_SUB_0] THEN
900 CONV_TAC CONTRAPOS_CONV THEN ONCE_REWRITE_TAC[ABS_NZ] THEN DISCH_TAC THEN
901 REWRITE_TAC[Dint] THEN
902 DISCH_THEN(CONJUNCTS_THEN(MP_TAC o SPEC (Term`abs(k1 - k2) / &2`))) THEN
903 ASM_REWRITE_TAC[REAL_LT_HALF1] THEN
904 DISCH_THEN(X_CHOOSE_THEN (Term`g1:real->real`) STRIP_ASSUME_TAC) THEN
905 DISCH_THEN(X_CHOOSE_THEN (Term`g2:real->real`) STRIP_ASSUME_TAC) THEN
906 MP_TAC(SPECL [Term`\x. a <= x /\ x <= b`,
907 Term`g1:real->real`, Term`g2:real->real`] GAUGE_MIN) THEN
908 ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
909 MP_TAC(SPECL [Term`a:real`, Term`b:real`,
910 Term`\x:real. if g1(x) < g2(x) then g1(x) else g2(x)`]
911 DIVISION_EXISTS) THEN ASM_REWRITE_TAC[] THEN
912 DISCH_THEN(X_CHOOSE_THEN (Term`D:num->real`)
913 (X_CHOOSE_THEN(Term`p:num->real`) STRIP_ASSUME_TAC)) THEN
914 FIRST_ASSUM(STRIP_ASSUME_TAC o MATCH_MP FINE_MIN) THEN
915 REPEAT(FIRST_ASSUM(UNDISCH_TAC o assert is_forall o concl) THEN
916 DISCH_THEN(MP_TAC o SPECL [Term`D:num->real`, Term`p:num->real`]) THEN
917 ASM_REWRITE_TAC[] THEN DISCH_TAC) THEN
918 SUBGOAL_THEN (Term`abs((rsum(D,p) f - k2) - (rsum(D,p) f - k1))
919 < abs(k1 - k2)`) MP_TAC THENL
920 [MATCH_MP_TAC REAL_LET_TRANS THEN
921 EXISTS_TAC (Term`abs(rsum(D,p) f - k2) + abs(rsum(D,p) f - k1)`) THEN
922 CONJ_TAC THENL
923 [GEN_REWRITE_TAC (LAND_CONV o RAND_CONV) empty_rewrites [real_sub] THEN
924 GEN_REWRITE_TAC (funpow 2 RAND_CONV) empty_rewrites [GSYM ABS_NEG] THEN
925 MATCH_ACCEPT_TAC ABS_TRIANGLE,
926 GEN_REWRITE_TAC RAND_CONV empty_rewrites [GSYM REAL_HALF_DOUBLE] THEN
927 MATCH_MP_TAC REAL_LT_ADD2 THEN ASM_REWRITE_TAC[]],
928 REWRITE_TAC[real_sub, REAL_NEG_ADD, REAL_NEG_SUB] THEN
929 ONCE_REWRITE_TAC[AC (REAL_ADD_ASSOC,REAL_ADD_SYM)
930 (Term`(a + b) + (c + d) = (d + a) + (c + b)`)] THEN
931 REWRITE_TAC[REAL_ADD_LINV, REAL_ADD_LID, REAL_LT_REFL]]
932QED
933
934(* ------------------------------------------------------------------------- *)
935(* Other more or less trivial lemmas. *)
936(* ------------------------------------------------------------------------- *)
937
938Theorem DIVISION_BOUNDS:
939 !d a b. division(a,b) d ==> !n. a <= d(n) /\ d(n) <= b
940Proof
941 MESON_TAC[DIVISION_UBOUND, DIVISION_LBOUND]
942QED
943
944Theorem TDIV_BOUNDS:
945 !d p a b. tdiv(a,b) (d,p)
946 ==> !n. a <= d(n) /\ d(n) <= b /\ a <= p(n) /\ p(n) <= b
947Proof
948 REWRITE_TAC[tdiv] THEN ASM_MESON_TAC[DIVISION_BOUNDS, REAL_LE_TRANS]
949QED
950
951Theorem TDIV_LE:
952 !d p a b. tdiv(a,b) (d,p) ==> a <= b
953Proof
954 MESON_TAC[tdiv, DIVISION_LE]
955QED
956
957Theorem DINT_WRONG:
958 !a b f i. b < a ==> Dint(a,b) f i
959Proof
960 REWRITE_TAC[Dint, gauge] THEN REPEAT STRIP_TAC THEN
961 EXISTS_TAC “\x:real. &0” THEN
962 ASM_SIMP_TAC std_ss[REAL_ARITH ``b < a ==> (a <= x /\ x <= b <=> F)``] THEN
963 ASM_MESON_TAC[REAL_NOT_LE, TDIV_LE]
964QED
965
966Theorem DINT_INTEGRAL:
967 !f a b i. a <= b /\ Dint(a,b) f i ==> (integral(a,b) f = i)
968Proof
969 REPEAT STRIP_TAC THEN REWRITE_TAC[integral] THEN
970 MATCH_MP_TAC SELECT_UNIQUE THEN ASM_MESON_TAC[DINT_UNIQ]
971QED
972
973(* ------------------------------------------------------------------------- *)
974(* Linearity. *)
975(* ------------------------------------------------------------------------- *)
976
977Theorem DINT_NEG:
978 !f a b i. Dint(a,b) f i ==> Dint(a,b) (\x. ~f x) (~i)
979Proof
980 REPEAT GEN_TAC THEN REWRITE_TAC[Dint] THEN
981 SIMP_TAC arith_ss[rsum, REAL_MUL_LNEG, SUM_NEG] THEN
982 SIMP_TAC arith_ss[REAL_SUB_LNEG, ABS_NEG, real_sub]
983QED
984
985Theorem DINT_0:
986 !a b. Dint(a,b) (\x. &0) (&0)
987Proof
988 REPEAT GEN_TAC THEN REWRITE_TAC[Dint] THEN GEN_TAC THEN DISCH_TAC THEN
989 EXISTS_TAC (Term`\x:real. &1`) THEN REWRITE_TAC[gauge,REAL_LT_01] THEN
990 REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_SUB_RZERO] THEN
991 REWRITE_TAC[rsum, REAL_MUL_LZERO, SUM_0, ABS_0] THEN RW_TAC arith_ss[]
992QED
993
994Theorem DINT_ADD:
995 !f g a b i j.
996 Dint(a,b) f i /\ Dint(a,b) g j
997 ==> Dint(a,b) (\x. f x + g x) (i + j)
998Proof
999 REPEAT GEN_TAC THEN REWRITE_TAC[Dint] THEN STRIP_TAC THEN
1000 X_GEN_TAC (Term`e:real`) THEN DISCH_TAC THEN
1001 REPEAT(FIRST_X_ASSUM(MP_TAC o SPEC ``e / &2``)) THEN
1002 ASM_SIMP_TAC arith_ss[REAL_LT_DIV, REAL_LT] THEN
1003 DISCH_THEN(X_CHOOSE_THEN (Term`g1:real->real`) STRIP_ASSUME_TAC) THEN
1004 DISCH_THEN(X_CHOOSE_THEN (Term`g2:real->real`) STRIP_ASSUME_TAC) THEN
1005 EXISTS_TAC “\x:real. if g1(x) < g2(x) then g1(x) else g2(x)” THEN
1006 ASM_SIMP_TAC arith_ss[GAUGE_MIN, rsum] THEN REPEAT STRIP_TAC THEN
1007 SIMP_TAC arith_ss[REAL_ADD_RDISTRIB, SUM_ADD] THEN
1008 SIMP_TAC arith_ss[REAL_ADD2_SUB2] THEN REWRITE_TAC[GSYM rsum] THEN
1009 FIRST_ASSUM(STRIP_ASSUME_TAC o MATCH_MP FINE_MIN) THEN
1010 REPEAT(FIRST_ASSUM(UNDISCH_TAC o assert is_forall o concl) THEN
1011 DISCH_THEN(MP_TAC o SPECL [Term`D:num->real`, Term`p:num->real`]) THEN
1012 ASM_REWRITE_TAC[] THEN DISCH_TAC) THEN
1013 SUBGOAL_THEN (Term`abs(rsum(D,p) f -i) + abs(rsum(D,p) g - j) < e`)
1014 MP_TAC THENL
1015 [GEN_REWRITE_TAC RAND_CONV empty_rewrites [GSYM REAL_HALF_DOUBLE] THEN
1016 MATCH_MP_TAC REAL_LT_ADD2 THEN ASM_REWRITE_TAC[],
1017 STRIP_TAC THEN
1018 KNOW_TAC``abs (rsum (D,p) f - i + (rsum (D,p) g - j)) <=
1019 abs (rsum (D,p) f - i) + abs (rsum (D,p) g - j) /\ (abs (rsum (D,p) f - i) +
1020 abs (rsum (D,p) g - j)< e)`` THENL
1021 [CONJ_TAC THEN REWRITE_TAC[ABS_TRIANGLE], ASM_REWRITE_TAC[]]
1022 THEN PROVE_TAC [REAL_LET_TRANS]]
1023QED
1024
1025Theorem DINT_SUB:
1026 !f g a b i j.
1027 Dint(a,b) f i /\ Dint(a,b) g j
1028 ==> Dint(a,b) (\x. f x - g x) (i - j)
1029Proof
1030 SIMP_TAC arith_ss[real_sub, DINT_ADD, DINT_NEG]
1031QED
1032
1033Theorem DSIZE_EQ:
1034 !a b D. division(a,b) D ==>
1035 (sum(0,dsize D)(\n. D(SUC n) - D n) - (b - a) = 0)
1036Proof
1037 REPEAT GEN_TAC THEN STRIP_TAC THEN SIMP_TAC arith_ss[SUM_CANCEL] THEN
1038 RW_TAC arith_ss[REAL_SUB_0] THEN MP_TAC DIVISION_LHS THEN
1039 MP_TAC DIVISION_RHS THEN PROVE_TAC []
1040QED
1041
1042Theorem DINT_CONST:
1043 !a b c. Dint(a,b) (\x. c) (c * (b - a))
1044Proof
1045 REPEAT GEN_TAC THEN REWRITE_TAC[Dint] THEN REPEAT STRIP_TAC THEN
1046 EXISTS_TAC (Term`\x:real. &1`) THEN REWRITE_TAC[gauge,REAL_LT_01] THEN
1047 REPEAT STRIP_TAC THEN REWRITE_TAC[rsum] THEN
1048 SIMP_TAC arith_ss[SUM_CMUL] THEN
1049 SIMP_TAC arith_ss[GSYM REAL_SUB_LDISTRIB] THEN REWRITE_TAC[ABS_MUL] THEN
1050 UNDISCH_TAC(Term`tdiv(a,b)(D,p)`) THEN REWRITE_TAC[tdiv] THEN
1051 STRIP_TAC THEN UNDISCH_TAC(Term`division(a,b) D`) THEN
1052 SIMP_TAC arith_ss[DSIZE_EQ] THEN REWRITE_TAC[ABS_0] THEN STRIP_TAC THEN
1053 RW_TAC arith_ss[REAL_MUL_RZERO]
1054QED
1055
1056Theorem DINT_CMUL:
1057 !f a b c i. Dint(a,b) f i ==> Dint(a,b) (\x. c * f x) (c * i)
1058Proof
1059 REPEAT GEN_TAC THEN ASM_CASES_TAC (Term`c = &0`) THENL
1060 [MP_TAC(SPECL [Term`a:real`, Term`b:real`, Term`c:real`] DINT_CONST) THEN
1061 ASM_SIMP_TAC arith_ss[REAL_MUL_LZERO],
1062 REWRITE_TAC[Dint] THEN STRIP_TAC THEN X_GEN_TAC(Term`e:real`) THEN
1063 DISCH_TAC THEN FIRST_X_ASSUM(MP_TAC o SPEC “e / abs(c)”) THEN
1064 SUBGOAL_THEN(Term`0 < abs(c)`) MP_TAC THENL
1065 [UNDISCH_TAC(Term`c<>0`) THEN SIMP_TAC arith_ss[ABS_NZ],
1066 ASM_SIMP_TAC arith_ss[REAL_LT_DIV, REAL_LT] THEN STRIP_TAC THEN
1067 DISCH_THEN(X_CHOOSE_THEN (Term`g1:real->real`) STRIP_ASSUME_TAC) THEN
1068 EXISTS_TAC“g1:real->real” THEN ASM_SIMP_TAC arith_ss[] THEN
1069 REPEAT STRIP_TAC THEN REWRITE_TAC[rsum] THEN
1070 RW_TAC arith_ss[ETA_AX] THEN
1071 SUBGOAL_THEN“!a b c d. a*b*(c-d) = a*(b*(c-d))”
1072 (fn th => ONCE_REWRITE_TAC[GEN_ALL th]) THENL
1073 [RW_TAC arith_ss[GSYM REAL_MUL_ASSOC],
1074 SIMP_TAC arith_ss[SUM_CMUL] THEN
1075 SIMP_TAC arith_ss[GSYM REAL_SUB_LDISTRIB] THEN REWRITE_TAC[ABS_MUL] THEN
1076 REWRITE_TAC[GSYM rsum] THEN
1077 REPEAT(FIRST_ASSUM(UNDISCH_TAC o assert is_forall o concl) THEN
1078 DISCH_THEN(MP_TAC o SPECL [Term`D:num->real`, Term`p:num->real`]) THEN
1079 ASM_REWRITE_TAC[] THEN DISCH_TAC) THEN
1080 POP_ASSUM MP_TAC THEN UNDISCH_TAC(Term`0 < abs c`) THEN
1081 RW_TAC arith_ss[REAL_LT_RDIV_EQ] THEN PROVE_TAC[REAL_MUL_SYM]]]]
1082QED
1083
1084Theorem DINT_LINEAR:
1085 !f g a b i j.
1086 Dint(a,b) f i /\ Dint(a,b) g j
1087 ==> Dint(a,b) (\x. m*(f x) + n*(g x)) (m*i + n*j)
1088Proof
1089 REPEAT STRIP_TAC THEN HO_MATCH_MP_TAC DINT_ADD THEN CONJ_TAC THEN
1090 MATCH_MP_TAC DINT_CMUL THEN ASM_REWRITE_TAC[]
1091QED
1092
1093(* ------------------------------------------------------------------------- *)
1094(* Ordering properties of integral. *)
1095(* ------------------------------------------------------------------------- *)
1096
1097Theorem INTEGRAL_LE :
1098 !f g a b i j.
1099 a <= b /\ integrable(a,b) f /\ integrable(a,b) g /\
1100 (!x. a <= x /\ x <= b ==> f(x) <= g(x))
1101 ==> integral(a,b) f <= integral(a,b) g
1102Proof
1103 REPEAT STRIP_TAC THEN
1104 REPEAT(FIRST_X_ASSUM(ASSUME_TAC o MATCH_MP INTEGRABLE_DINT)) THEN
1105 MATCH_MP_TAC(REAL_ARITH ``~(&0 < x - y) ==> x <= y``) THEN
1106 ABBREV_TAC ``e = integral(a,b) f - integral(a,b) g`` THEN DISCH_TAC THEN
1107 NTAC 2(FIRST_X_ASSUM(MP_TAC o SPEC ``e / &2`` o REWRITE_RULE [Dint])) THEN
1108 ASM_REWRITE_TAC[REAL_LT_HALF1] THEN
1109 DISCH_THEN(X_CHOOSE_THEN ``g1:real->real`` STRIP_ASSUME_TAC) THEN
1110 DISCH_THEN(X_CHOOSE_THEN ``g2:real->real`` STRIP_ASSUME_TAC) THEN
1111 MP_TAC(SPECL [Term`\x. a <= x /\ x <= b`,
1112 Term`g1:real->real`, Term`g2:real->real`] GAUGE_MIN) THEN
1113 ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
1114 MP_TAC(SPECL [``a:real``, ``b:real``,
1115 ``\x:real. if g1(x) < g2(x) then g1(x) else g2(x)``]
1116 DIVISION_EXISTS) THEN
1117 ASM_REWRITE_TAC[] THEN
1118 DISCH_THEN(X_CHOOSE_THEN (Term`D:num->real`)
1119 (X_CHOOSE_THEN(Term`p:num->real`) STRIP_ASSUME_TAC)) THEN
1120 FIRST_ASSUM(STRIP_ASSUME_TAC o MATCH_MP FINE_MIN) THEN
1121 REPEAT(FIRST_ASSUM(UNDISCH_TAC o assert is_forall o concl) THEN
1122 DISCH_THEN(MP_TAC o SPECL [Term`D:num->real`, Term`p:num->real`]) THEN
1123 ASM_REWRITE_TAC[] THEN DISCH_TAC) THEN
1124 SUBGOAL_THEN (Term`abs((rsum(D,p) g - integral(a,b) g) -
1125 (rsum(D,p) f - integral(a,b) f)) < e`) MP_TAC THENL
1126 [MATCH_MP_TAC REAL_LET_TRANS THEN
1127 EXISTS_TAC (Term`abs(rsum(D,p) g - integral(a,b) g) +
1128 abs(rsum(D,p) f - integral(a,b) f)`) THEN
1129 CONJ_TAC THENL
1130 [GEN_REWRITE_TAC (LAND_CONV o RAND_CONV) empty_rewrites [real_sub] THEN
1131 GEN_REWRITE_TAC (funpow 2 RAND_CONV) empty_rewrites [GSYM ABS_NEG] THEN
1132 MATCH_ACCEPT_TAC ABS_TRIANGLE,
1133 GEN_REWRITE_TAC RAND_CONV empty_rewrites [GSYM REAL_HALF_DOUBLE] THEN
1134 MATCH_MP_TAC REAL_LT_ADD2 THEN ASM_REWRITE_TAC[]],
1135 REWRITE_TAC[real_sub, REAL_NEG_ADD, REAL_NEG_SUB] THEN
1136 ONCE_REWRITE_TAC[AC (REAL_ADD_ASSOC,REAL_ADD_SYM)
1137 (Term`(a + b) + (c + d) = (d + a) + (c + b)`)] THEN
1138 REWRITE_TAC[GSYM real_sub] THEN ASM_REWRITE_TAC[] THEN
1139 ONCE_REWRITE_TAC[GSYM ABS_NEG] THEN
1140 REWRITE_TAC[real_sub, REAL_NEG_ADD, REAL_NEGNEG] THEN
1141 REWRITE_TAC[GSYM real_sub] THEN DISCH_TAC THEN
1142 SUBGOAL_THEN``0<rsum(D,p) f - rsum(D,p) g``MP_TAC THENL
1143 [PROVE_TAC[ABS_SIGN], REWRITE_TAC[] THEN
1144 ONCE_REWRITE_TAC[REAL_NOT_LT] THEN REWRITE_TAC[real_sub] THEN
1145 ONCE_REWRITE_TAC[GSYM REAL_LE_RNEG] THEN REWRITE_TAC[REAL_NEGNEG] THEN
1146 REWRITE_TAC[rsum] THEN MATCH_MP_TAC SUM_LE THEN
1147 X_GEN_TAC``r:num`` THEN REWRITE_TAC[ADD_CLAUSES] THEN
1148 STRIP_TAC THEN BETA_TAC THEN MATCH_MP_TAC REAL_LE_RMUL1 THEN
1149 REWRITE_TAC[REAL_SUB_LE] THEN
1150 ASM_MESON_TAC[TDIV_BOUNDS, REAL_LT_IMP_LE, DIVISION_THM, tdiv]]]
1151QED
1152
1153Theorem DINT_LE:
1154 !f g a b i j. a <= b /\ Dint(a,b) f i /\ Dint(a,b) g j /\
1155 (!x. a <= x /\ x <= b ==> f(x) <= g(x))
1156 ==> i <= j
1157Proof
1158 REPEAT GEN_TAC THEN MP_TAC(SPEC_ALL INTEGRAL_LE) THEN
1159 MESON_TAC[integrable, DINT_INTEGRAL]
1160QED
1161
1162Theorem DINT_TRIANGLE:
1163 !f a b i j. a <= b /\ Dint(a,b) f i /\ Dint(a,b) (\x. abs(f x)) j
1164 ==> abs(i) <= j
1165Proof
1166 REPEAT STRIP_TAC THEN
1167 MATCH_MP_TAC(REAL_ARITH``~a <= b /\ b <= a ==> abs(b) <= a``) THEN
1168 CONJ_TAC THEN MATCH_MP_TAC DINT_LE THENL
1169 [MAP_EVERY EXISTS_TAC [``\x:real. ~abs(f x)``, ``f:real->real``],
1170 MAP_EVERY EXISTS_TAC [``f:real->real``, ``\x:real. abs(f x)``]] THEN
1171 MAP_EVERY EXISTS_TAC [``a:real``, ``b:real``] THEN
1172 ASM_SIMP_TAC arith_ss[DINT_NEG] THEN REAL_ARITH_TAC
1173QED
1174
1175Theorem DINT_EQ:
1176 !f g a b i j. a <= b /\ Dint(a,b) f i /\ Dint(a,b) g j /\
1177 (!x. a <= x /\ x <= b ==> (f(x) = g(x)))
1178 ==> (i = j)
1179Proof
1180 REWRITE_TAC[GSYM REAL_LE_ANTISYM] THEN MESON_TAC[DINT_LE]
1181QED
1182
1183Theorem INTEGRAL_EQ:
1184 !f g a b i. Dint(a,b) f i /\
1185 (!x. a <= x /\ x <= b ==> (f(x) = g(x)))
1186 ==> Dint(a,b) g i
1187Proof
1188 REPEAT STRIP_TAC THEN ASM_CASES_TAC ``a <= b`` THENL
1189 [UNDISCH_TAC``Dint(a,b) f i`` THEN REWRITE_TAC[Dint] THEN
1190 HO_MATCH_MP_TAC MONO_ALL THEN X_GEN_TAC ``e:real`` THEN
1191 ASM_CASES_TAC ``&0 < e`` THEN ASM_REWRITE_TAC[] THEN
1192 HO_MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC ``d:real->real`` THEN
1193 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
1194 ASM_REWRITE_TAC[] THEN
1195 HO_MATCH_MP_TAC MONO_ALL THEN X_GEN_TAC ``D:num->real`` THEN
1196 HO_MATCH_MP_TAC MONO_ALL THEN X_GEN_TAC ``p:num->real`` THEN
1197 DISCH_THEN(fn th => STRIP_TAC THEN MP_TAC th) THEN
1198 ASM_REWRITE_TAC[] THEN
1199 MATCH_MP_TAC(REAL_ARITH ``(x = y) ==> (abs(x - i) < e) ==>
1200 (abs(y - i) < e)``) THEN
1201 REWRITE_TAC[rsum] THEN MATCH_MP_TAC SUM_EQ THEN
1202 REPEAT STRIP_TAC THEN REWRITE_TAC[] THEN BETA_TAC THEN
1203 AP_THM_TAC THEN AP_TERM_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
1204 ASM_MESON_TAC[tdiv, DIVISION_LBOUND, DIVISION_UBOUND,
1205 DIVISION_THM, REAL_LE_TRANS],
1206 ASM_MESON_TAC[REAL_NOT_LE, DINT_WRONG]]
1207QED
1208
1209(* ------------------------------------------------------------------------ *)
1210(* Integral over a null interval is 0 *)
1211(* ------------------------------------------------------------------------ *)
1212
1213Theorem INTEGRAL_NULL :
1214 !f a. Dint(a,a) f (&0)
1215Proof
1216 REPEAT GEN_TAC THEN REWRITE_TAC[Dint] THEN GEN_TAC THEN
1217 DISCH_TAC THEN EXISTS_TAC (Term`\x:real. &1`) THEN
1218 REWRITE_TAC[gauge, REAL_LT_01] THEN REPEAT GEN_TAC THEN
1219 REWRITE_TAC[tdiv] THEN STRIP_TAC THEN
1220 FIRST_ASSUM(MP_TAC o MATCH_MP DIVISION_EQ) THEN
1221 REWRITE_TAC[rsum] THEN DISCH_THEN SUBST1_TAC THEN
1222 ASM_REWRITE_TAC[sum, REAL_SUB_REFL, ABS_0]
1223QED
1224
1225(* ------------------------------------------------------------------------ *)
1226(* Fundamental theorem of calculus (Part I) *)
1227(* ------------------------------------------------------------------------ *)
1228
1229Theorem STRADDLE_LEMMA :
1230 !f f' a b e. (!x. a <= x /\ x <= b ==> (f diffl f'(x))(x)) /\ &0 < e
1231 ==> ?g. gauge(\x. a <= x /\ x <= b) g /\
1232 !x u v. a <= u /\ u <= x /\
1233 x <= v /\ v <= b /\ (v - u) < g(x)
1234 ==> abs((f(v) - f(u)) - (f'(x) * (v - u)))
1235 <= e * (v - u)
1236Proof
1237 REPEAT STRIP_TAC THEN REWRITE_TAC[gauge] THEN BETA_TAC THEN
1238 SUBGOAL_THEN
1239 (Term`!x. a <= x /\ x <= b ==>
1240 ?d. &0 < d /\
1241 !u v. u <= x /\ x <= v /\ (v - u) < d
1242 ==>
1243 abs((f(v) - f(u)) - (f'(x) * (v - u)))
1244 <= e * (v - u)`) MP_TAC THENL
1245 [ALL_TAC,
1246 FIRST_ASSUM(UNDISCH_TAC o assert is_forall o concl) THEN
1247 DISCH_THEN(K ALL_TAC) THEN
1248 DISCH_THEN(MP_TAC o CONV_RULE
1249 ((ONCE_DEPTH_CONV RIGHT_IMP_EXISTS_CONV) THENC SKOLEM_CONV)) THEN
1250 DISCH_THEN(X_CHOOSE_THEN (Term`g:real->real`) STRIP_ASSUME_TAC) THEN
1251 EXISTS_TAC (Term`g:real->real`) THEN CONJ_TAC THENL
1252 [GEN_TAC THEN
1253 DISCH_THEN(fn th => FIRST_ASSUM(MP_TAC o C MATCH_MP th)) THEN
1254 DISCH_THEN(fn th => REWRITE_TAC[th]),
1255 REPEAT STRIP_TAC THEN
1256 C SUBGOAL_THEN (fn th => FIRST_ASSUM(MP_TAC o C MATCH_MP th))
1257 (Term`a <= x /\ x <= b`) THENL
1258 [CONJ_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THENL
1259 [EXISTS_TAC (Term`u:real`), EXISTS_TAC (Term`v:real`)] THEN
1260 ASM_REWRITE_TAC[],
1261 DISCH_THEN(MATCH_MP_TAC o CONJUNCT2) THEN ASM_REWRITE_TAC[]]]] THEN
1262 X_GEN_TAC (Term`x:real`) THEN
1263 DISCH_THEN(fn th => STRIP_ASSUME_TAC th THEN
1264 FIRST_ASSUM(UNDISCH_TAC o assert is_forall o concl) THEN
1265 DISCH_THEN(MP_TAC o C MATCH_MP th)) THEN
1266 REWRITE_TAC[diffl, LIM] THEN
1267 DISCH_THEN(MP_TAC o SPEC (Term`e / &2`)) THEN
1268 ASM_REWRITE_TAC[REAL_LT_HALF1] THEN
1269 BETA_TAC THEN REWRITE_TAC[REAL_SUB_RZERO] THEN
1270 DISCH_THEN(X_CHOOSE_THEN (Term`d:real`) STRIP_ASSUME_TAC) THEN
1271 SUBGOAL_THEN (Term`!z. abs(z - x) < d ==>
1272 abs((f(z) - f(x)) - (f'(x) * (z - x)))
1273 <= (e / &2) * abs(z - x)`)
1274 ASSUME_TAC THENL
1275 [GEN_TAC THEN ASM_CASES_TAC (Term`&0 < abs(z - x)`) THENL
1276 [ALL_TAC,
1277 UNDISCH_TAC (Term`~(&0 < abs(z - x))`) THEN
1278 REWRITE_TAC[GSYM ABS_NZ, REAL_SUB_0] THEN
1279 DISCH_THEN SUBST1_TAC THEN
1280 REWRITE_TAC[REAL_SUB_REFL, REAL_MUL_RZERO, ABS_0, REAL_LE_REFL]] THEN
1281 DISCH_THEN(MP_TAC o CONJ (ASSUME (Term`&0 < abs(z - x)`))) THEN
1282 DISCH_THEN(curry op THEN (MATCH_MP_TAC REAL_LT_IMP_LE) o MP_TAC) THEN
1283 DISCH_THEN(fn th => FIRST_ASSUM(MP_TAC o C MATCH_MP th)) THEN
1284 FIRST_ASSUM(fn th => GEN_REWRITE_TAC LAND_CONV empty_rewrites
1285 [GSYM(MATCH_MP REAL_LT_RMUL th)]) THEN
1286 MATCH_MP_TAC (TAUT_CONV “(a <=> b) ==> a ==> b”) THEN
1287 AP_THM_TAC THEN AP_TERM_TAC THEN
1288 REWRITE_TAC[GSYM ABS_MUL] THEN AP_TERM_TAC THEN
1289 REWRITE_TAC[REAL_SUB_RDISTRIB] THEN AP_THM_TAC THEN AP_TERM_TAC THEN
1290 REWRITE_TAC[REAL_SUB_ADD2] THEN MATCH_MP_TAC REAL_DIV_RMUL THEN
1291 ASM_REWRITE_TAC[ABS_NZ], ALL_TAC] THEN
1292 EXISTS_TAC (Term`d:real`) THEN ASM_REWRITE_TAC[] THEN
1293 REPEAT STRIP_TAC THEN
1294 SUBGOAL_THEN (Term`u <= v`) (DISJ_CASES_TAC o REWRITE_RULE[REAL_LE_LT])
1295 THENL
1296 [MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC (Term`x:real`) THEN
1297 ASM_REWRITE_TAC[],
1298 ALL_TAC,
1299 ASM_REWRITE_TAC[REAL_SUB_REFL, REAL_MUL_RZERO, ABS_0, REAL_LE_REFL]] THEN
1300 MATCH_MP_TAC REAL_LE_TRANS THEN
1301 EXISTS_TAC (Term`abs((f(v) - f(x)) - (f'(x) * (v - x))) +
1302 abs((f(x) - f(u)) - (f'(x) * (x - u)))`) THEN
1303 CONJ_TAC THENL
1304 [MP_TAC(SPECL[Term`(f(v) - f(x)) - (f'(x) * (v - x))`,
1305 Term`(f(x) - f(u)) - (f'(x) * (x - u))`] ABS_TRIANGLE)
1306 THEN MATCH_MP_TAC(TAUT_CONV “(a <=> b) ==> a ==> b”) THEN
1307 AP_THM_TAC THEN REPEAT AP_TERM_TAC THEN
1308 ONCE_REWRITE_TAC[GSYM REAL_ADD2_SUB2] THEN
1309 REWRITE_TAC[REAL_SUB_LDISTRIB] THEN
1310 SUBGOAL_THEN (Term`!a b c. (a - b) + (b - c) = (a - c)`)
1311 (fn th => REWRITE_TAC[th]) THEN
1312 REPEAT GEN_TAC THEN REWRITE_TAC[real_sub] THEN
1313 ONCE_REWRITE_TAC[AC (REAL_ADD_ASSOC,REAL_ADD_SYM)
1314 (Term`(a + b) + (c + d) = (b + c) + (a + d)`)] THEN
1315 REWRITE_TAC[REAL_ADD_LINV, REAL_ADD_LID], ALL_TAC] THEN
1316 GEN_REWRITE_TAC RAND_CONV empty_rewrites [GSYM REAL_HALF_DOUBLE] THEN
1317 MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC THENL
1318 [MATCH_MP_TAC REAL_LE_TRANS THEN
1319 EXISTS_TAC (Term`(e / &2) * abs(v - x)`) THEN CONJ_TAC THENL
1320 [FIRST_ASSUM MATCH_MP_TAC THEN
1321 ASM_REWRITE_TAC[abs, REAL_SUB_LE] THEN
1322 MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC (Term`v - u`) THEN
1323 ASM_REWRITE_TAC[] THEN REWRITE_TAC[real_sub, REAL_LE_LADD] THEN
1324 ASM_REWRITE_TAC[REAL_LE_NEG],
1325 ASM_REWRITE_TAC[abs, REAL_SUB_LE] THEN REWRITE_TAC[real_div] THEN
1326 GEN_REWRITE_TAC LAND_CONV empty_rewrites [AC (REAL_MUL_ASSOC,REAL_MUL_SYM)
1327 (Term`(a * b) * c = (a * c) * b`)] THEN
1328 REWRITE_TAC[GSYM REAL_MUL_ASSOC,
1329 MATCH_MP REAL_LE_LMUL (ASSUME (Term`&0 < e`))] THEN
1330 SUBGOAL_THEN (Term`!x y. (x * inv(&2)) <= (y * inv(&2)) <=> x <= y`)
1331 (fn th => ASM_REWRITE_TAC[th, real_sub, REAL_LE_LADD, REAL_LE_NEG]) THEN
1332 REPEAT GEN_TAC THEN MATCH_MP_TAC REAL_LE_RMUL THEN
1333 MATCH_MP_TAC REAL_INV_POS THEN
1334 REWRITE_TAC[REAL_LT, TWO, LESS_0]],
1335 MATCH_MP_TAC REAL_LE_TRANS THEN
1336 EXISTS_TAC (Term`(e / &2) * abs(x - u)`) THEN CONJ_TAC THENL
1337 [GEN_REWRITE_TAC (LAND_CONV o RAND_CONV) empty_rewrites [real_sub] THEN
1338 ONCE_REWRITE_TAC[GSYM ABS_NEG] THEN
1339 REWRITE_TAC[REAL_NEG_ADD, REAL_NEG_SUB] THEN
1340 ONCE_REWRITE_TAC[REAL_NEG_RMUL] THEN
1341 REWRITE_TAC[REAL_NEG_SUB] THEN REWRITE_TAC[GSYM real_sub] THEN
1342 FIRST_ASSUM MATCH_MP_TAC THEN ONCE_REWRITE_TAC[ABS_SUB] THEN
1343 ASM_REWRITE_TAC[abs, REAL_SUB_LE] THEN
1344 MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC (Term`v - u`) THEN
1345 ASM_REWRITE_TAC[] THEN ASM_REWRITE_TAC[real_sub, REAL_LE_RADD],
1346 ASM_REWRITE_TAC[abs, REAL_SUB_LE] THEN REWRITE_TAC[real_div] THEN
1347 GEN_REWRITE_TAC LAND_CONV empty_rewrites [AC (REAL_MUL_ASSOC,REAL_MUL_SYM)
1348 (Term `(a * b) * c = (a * c) * b`)] THEN
1349 REWRITE_TAC[GSYM REAL_MUL_ASSOC,
1350 MATCH_MP REAL_LE_LMUL (ASSUME (Term`&0 < e`))] THEN
1351 SUBGOAL_THEN (Term`!x y. (x * inv(&2)) <= (y * inv(&2)) <=> x <= y`)
1352 (fn th => ASM_REWRITE_TAC[th, real_sub, REAL_LE_RADD, REAL_LE_NEG]) THEN
1353 REPEAT GEN_TAC THEN MATCH_MP_TAC REAL_LE_RMUL THEN
1354 MATCH_MP_TAC REAL_INV_POS THEN
1355 REWRITE_TAC[REAL_LT, TWO, LESS_0]]]
1356QED
1357
1358Theorem FTC1:
1359 !f f' a b.
1360 a <= b /\ (!x. a <= x /\ x <= b ==> (f diffl f'(x))(x))
1361 ==> Dint(a,b) f' (f(b) - f(a))
1362Proof
1363 REPEAT STRIP_TAC THEN
1364 UNDISCH_TAC (Term`a <= b`) THEN REWRITE_TAC[REAL_LE_LT] THEN
1365 DISCH_THEN DISJ_CASES_TAC THENL
1366 [ALL_TAC, ASM_REWRITE_TAC[REAL_SUB_REFL, INTEGRAL_NULL]] THEN
1367 REWRITE_TAC[Dint] THEN X_GEN_TAC (Term`e:real`) THEN DISCH_TAC THEN
1368 SUBGOAL_THEN
1369 (Term`!e. &0 < e ==>
1370 ?g. gauge(\x. a <= x /\ x <= b) g /\
1371 (!D p. tdiv(a,b)(D,p) /\ fine g(D,p)
1372 ==>
1373 (abs((rsum(D,p)f') - (f b - f a))) <= e)`)
1374 MP_TAC THENL
1375 [ALL_TAC,
1376 DISCH_THEN(MP_TAC o SPEC (Term`e / &2`)) THEN
1377 ASM_REWRITE_TAC[REAL_LT_HALF1] THEN
1378 DISCH_THEN(X_CHOOSE_THEN (Term`g:real->real`) STRIP_ASSUME_TAC) THEN
1379 EXISTS_TAC (Term`g:real->real`) THEN ASM_REWRITE_TAC[] THEN
1380 REPEAT GEN_TAC THEN
1381 DISCH_THEN(fn th => FIRST_ASSUM(ASSUME_TAC o C MATCH_MP th)) THEN
1382 MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC (Term`e / &2`) THEN
1383 ASM_REWRITE_TAC[REAL_LT_HALF2]] THEN
1384 UNDISCH_TAC (Term`&0 < e`) THEN DISCH_THEN(K ALL_TAC) THEN
1385 X_GEN_TAC (Term`e:real`) THEN DISCH_TAC THEN
1386 MP_TAC(SPECL [Term`f:real->real`, Term`f':real->real`,
1387 Term`a:real`, Term`b:real`, Term`e / (b - a)`] STRADDLE_LEMMA) THEN
1388 ASM_REWRITE_TAC[] THEN
1389 SUBGOAL_THEN (Term`&0 < e / (b - a)`) (fn th => REWRITE_TAC[th]) THENL
1390 [REWRITE_TAC[real_div] THEN MATCH_MP_TAC REAL_LT_MUL THEN
1391 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_INV_POS THEN
1392 ASM_REWRITE_TAC[REAL_SUB_LT], ALL_TAC] THEN
1393 DISCH_THEN(X_CHOOSE_THEN (Term`g:real->real`) STRIP_ASSUME_TAC) THEN
1394 EXISTS_TAC (Term`g:real->real`) THEN ASM_REWRITE_TAC[] THEN
1395 MAP_EVERY X_GEN_TAC [Term`D:num->real`, Term`p:num->real`] THEN
1396 REWRITE_TAC[tdiv] THEN STRIP_TAC THEN REWRITE_TAC[rsum] THEN
1397 SUBGOAL_THEN (Term`f b - f a = sum(0,dsize D)(\n. f(D(SUC n)) - f(D(n)))`)
1398 SUBST1_TAC THENL
1399 [MP_TAC(SPECL [Term`\n:num. (f:real->real)(D(n))`, Term`0:num`, Term`dsize D`]
1400 SUM_CANCEL) THEN BETA_TAC THEN DISCH_THEN SUBST1_TAC THEN
1401 ASM_REWRITE_TAC[ADD_CLAUSES] THEN
1402 MAP_EVERY (IMP_RES_THEN SUBST1_TAC) [DIVISION_LHS, DIVISION_RHS] THEN
1403 REFL_TAC, ALL_TAC] THEN
1404 ONCE_REWRITE_TAC[ABS_SUB] THEN REWRITE_TAC[GSYM SUM_SUB] THEN BETA_TAC THEN
1405 LE_MATCH_TAC ABS_SUM THEN BETA_TAC THEN
1406 SUBGOAL_THEN (Term`e = sum(0,dsize D)
1407 (\n. (e / (b - a)) * (D(SUC n) - D n))`)
1408 SUBST1_TAC THENL
1409 [ONCE_REWRITE_TAC[SYM(BETA_CONV (Term`(\n. (D(SUC n) - D n)) n`))] THEN
1410 ASM_REWRITE_TAC[SUM_CMUL, SUM_CANCEL, ADD_CLAUSES] THEN
1411 MAP_EVERY (IMP_RES_THEN SUBST1_TAC) [DIVISION_LHS, DIVISION_RHS] THEN
1412 CONV_TAC SYM_CONV THEN MATCH_MP_TAC REAL_DIV_RMUL THEN
1413 REWRITE_TAC[REAL_SUB_0] THEN CONV_TAC(RAND_CONV SYM_CONV) THEN
1414 MATCH_MP_TAC REAL_LT_IMP_NE THEN FIRST_ASSUM ACCEPT_TAC, ALL_TAC] THEN
1415 MATCH_MP_TAC SUM_LE THEN X_GEN_TAC (Term`r:num`) THEN
1416 REWRITE_TAC[ADD_CLAUSES] THEN STRIP_TAC THEN BETA_TAC THEN
1417 FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL
1418 [IMP_RES_THEN (fn th => REWRITE_TAC[th]) DIVISION_LBOUND,
1419 IMP_RES_THEN (fn th => REWRITE_TAC[th]) DIVISION_UBOUND,
1420 UNDISCH_TAC (Term`fine(g)(D,p)`) THEN REWRITE_TAC[fine] THEN
1421 DISCH_THEN MATCH_MP_TAC THEN FIRST_ASSUM ACCEPT_TAC]
1422QED
1423
1424(* ------------------------------------------------------------------------- *)
1425(* Integration by parts. *)
1426(* ------------------------------------------------------------------------- *)
1427
1428Theorem INTEGRATION_BY_PARTS:
1429 !f g f' g' a b.
1430 a <= b /\
1431 (!x. a <= x /\ x <= b ==> (f diffl f'(x))(x)) /\
1432 (!x. a <= x /\ x <= b ==> (g diffl g'(x))(x))
1433 ==> Dint(a,b) (\x. f'(x) * g(x) + f(x) * g'(x))
1434 (f(b) * g(b) - f(a) * g(a))
1435Proof
1436 REPEAT STRIP_TAC THEN HO_MATCH_MP_TAC FTC1 THEN ASM_REWRITE_TAC[] THEN
1437 ONCE_REWRITE_TAC[REAL_ARITH ``a + b * c = a + c * b``] THEN
1438 ASM_SIMP_TAC arith_ss[DIFF_MUL]
1439QED
1440
1441(* ------------------------------------------------------------------------- *)
1442(* Various simple lemmas about divisions. *)
1443(* ------------------------------------------------------------------------- *)
1444
1445Theorem DIVISION_LE_SUC:
1446 !d a b. division(a,b) d ==> !n. d(n) <= d(SUC n)
1447Proof
1448 REWRITE_TAC[DIVISION_THM, GREATER_EQ] THEN
1449 MESON_TAC[LESS_CASES, LE, REAL_LE_REFL, REAL_LT_IMP_LE]
1450QED
1451
1452Theorem DIVISION_MONO_LE:
1453 !d a b. division(a,b) d ==> !m n. m <= n ==> d(m) <= d(n)
1454Proof
1455 REPEAT GEN_TAC THEN DISCH_THEN(ASSUME_TAC o MATCH_MP DIVISION_LE_SUC) THEN
1456 SIMP_TAC arith_ss[LESS_EQ_EXISTS] THEN GEN_TAC THEN
1457 SIMP_TAC arith_ss[GSYM LEFT_FORALL_IMP_THM] THEN INDUCT_TAC THEN
1458 REWRITE_TAC[ADD_CLAUSES, REAL_LE_REFL] THEN
1459 MATCH_MP_TAC REAL_LE_TRANS THEN
1460 first_assum $ irule_at (Pat ‘_ <= d (SUC _)’) >>
1461 ASM_REWRITE_TAC[]
1462QED
1463
1464Theorem DIVISION_MONO_LE_SUC:
1465 !d a b. division(a,b) d ==> !n. d(n) <= d(SUC n)
1466Proof
1467 MESON_TAC[DIVISION_MONO_LE, LE, LESS_EQ_REFL]
1468QED
1469
1470Theorem DIVISION_DSIZE_LE:
1471 !a b d n. division(a,b) d /\ (d(SUC n) = d(n)) ==> (dsize d <= n)
1472Proof
1473 REWRITE_TAC[DIVISION_THM] THEN MESON_TAC[REAL_LT_REFL, NOT_LESS]
1474QED
1475
1476Theorem DIVISION_DSIZE_GE:
1477 !a b d n. division(a,b) d /\ d(n) < d(SUC n) ==> SUC n <= dsize d
1478Proof
1479 REWRITE_TAC[DIVISION_THM, GSYM LESS_EQ, GREATER_EQ] THEN
1480 MESON_TAC[REAL_LT_REFL, LE, NOT_LESS]
1481QED
1482
1483Theorem DIVISION_DSIZE_EQ:
1484 !a b d n. division(a,b) d /\ (d(n) < d(SUC n)) /\ (d(SUC(SUC n)) = d(SUC n))
1485 ==> (dsize d = SUC n)
1486Proof
1487 REWRITE_TAC[EQ_LESS_EQ] THEN MESON_TAC[DIVISION_DSIZE_LE, DIVISION_DSIZE_GE]
1488QED
1489
1490Theorem DIVISION_DSIZE_EQ_ALT:
1491 !a b d n. division(a,b) d /\ (d(SUC n) = d(n)) /\
1492 (!i. i < n ==> (d(i) < d(SUC i)))
1493 ==> (dsize d = n)
1494Proof
1495 GEN_TAC THEN GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THENL
1496 [SUBGOAL_THEN(Term`dsize d <=0 ==> (dsize d = 0)`)MP_TAC THENL
1497 [ASM_MESON_TAC[DIVISION_DSIZE_LE, DIVISION_DSIZE_GE, LE],
1498 MESON_TAC[DIVISION_DSIZE_LE]], REPEAT STRIP_TAC THEN
1499 REWRITE_TAC[EQ_LESS_EQ] THEN
1500 ASM_MESON_TAC[DIVISION_DSIZE_LE, DIVISION_DSIZE_GE, LT]]
1501QED
1502
1503Theorem DIVISION_INTERMEDIATE:
1504 !d a b c. division(a,b) d /\ a <= c /\ c <= b
1505 ==> ?n. n <= dsize d /\ d(n) <= c /\ c <= d(SUC n)
1506Proof
1507 REPEAT STRIP_TAC THEN
1508 MP_TAC(SPEC (Term`\n. n <= dsize d /\ (d:num->real)(n) <= c`) num_MAX) THEN
1509 DISCH_THEN(MP_TAC o fst o EQ_IMP_RULE) THEN
1510 SUBGOAL_THEN``(?x. (\n. n <= dsize d /\ d n <= c) x) /\
1511 (?M. !x. (\n. n <= dsize d /\ d n <= c) x ==> x <= M)``MP_TAC THENL
1512 [CONJ_TAC THEN BETA_TAC THENL
1513 [EXISTS_TAC``0:num`` THEN UNDISCH_TAC``division(a,b) d`` THEN
1514 REWRITE_TAC[DIVISION_THM] THEN STRIP_TAC THEN
1515 ASM_MESON_TAC[ZERO_LESS_EQ],
1516 EXISTS_TAC``dsize (d:num -> real)`` THEN
1517 X_GEN_TAC``x:num`` THEN STRIP_TAC],
1518 DISCH_TAC THEN ASM_REWRITE_TAC[] THEN HO_MATCH_MP_TAC MONO_EXISTS THEN
1519 X_GEN_TAC ``n:num`` THEN SIMP_TAC bool_ss[] THEN STRIP_TAC THEN
1520 FIRST_X_ASSUM(MP_TAC o SPEC ``SUC n``) THEN
1521 SUBGOAL_THEN``~(SUC n <= n)``ASSUME_TAC THENL
1522 [SIMP_TAC arith_ss[LESS_OR],
1523 CONV_TAC CONTRAPOS_CONV THEN
1524 REWRITE_TAC[REAL_NOT_LE] THEN DISCH_TAC THEN
1525 ASM_SIMP_TAC arith_ss[REAL_LT_IMP_LE, GSYM LESS_EQ, LT_LE] THEN
1526 DISCH_THEN SUBST_ALL_TAC THEN UNDISCH_TAC``division(a,b) d`` THEN
1527 REWRITE_TAC[DIVISION_THM] THEN
1528 DISCH_THEN(MP_TAC o SPEC ``SUC(dsize d)`` o repeat CONJUNCT2) THEN
1529 REWRITE_TAC[GREATER_EQ, LE, LESS_EQ_REFL] THEN
1530 SUBGOAL_THEN``d(SUC (dsize d)) < b``ASSUME_TAC THENL
1531 [MATCH_MP_TAC REAL_LTE_TRANS THEN EXISTS_TAC``c:real`` THEN
1532 ASM_REWRITE_TAC[],
1533 POP_ASSUM MP_TAC THEN REWRITE_TAC[REAL_LT_IMP_NE]]]]
1534QED
1535
1536(* a variant of DIVISION_INTERMEDIATE for a < b *)
1537Theorem DIVISION_INTERMEDIATE' :
1538 !d a b c. division(a,b) d /\ a <= c /\ c <= b /\ a < b
1539 ==> ?n. n < dsize d /\ d(n) <= c /\ c <= d(SUC n)
1540Proof
1541 rpt STRIP_TAC
1542 >> MP_TAC (Q.SPECL [‘d’, ‘a’, ‘b’, ‘c’] DIVISION_INTERMEDIATE)
1543 >> RW_TAC std_ss []
1544 >> ‘n < dsize d \/ n = dsize d’ by rw []
1545 >- (Q.EXISTS_TAC ‘n’ >> art [])
1546 >> Know ‘dsize d <> 0’
1547 >- (REWRITE_TAC [GSYM (MATCH_MP DIVISION_EQ (ASSUME “division (a,b) d”))] \\
1548 PROVE_TAC [REAL_LT_IMP_NE])
1549 >> DISCH_TAC
1550 >> ‘!n. n >= dsize d ==> d n = b’ by PROVE_TAC [DIVISION_THM]
1551 >> ‘d (SUC n) = b’ by rw []
1552 >> POP_ASSUM (rfs o wrap)
1553 >> Q.EXISTS_TAC ‘PRE n’
1554 >> ‘SUC (PRE n) = n’ by rw [SUC_PRE] >> POP_ORW
1555 >> ‘d n = b’ by rw []
1556 >> POP_ASSUM (rfs o wrap)
1557 >> ‘c = b’ by PROVE_TAC [REAL_LE_ANTISYM]
1558 >> POP_ASSUM (rfs o wrap)
1559 >> METIS_TAC [DIVISION_BOUNDS]
1560QED
1561
1562(* ------------------------------------------------------------------------- *)
1563(* Combination of adjacent intervals (quite painful in the details). *)
1564(* ------------------------------------------------------------------------- *)
1565
1566Theorem DINT_COMBINE:
1567 !f a b c i j. a <= b /\ b <= c /\ (Dint(a,b) f i) /\ (Dint(b,c) f j)
1568 ==> (Dint(a,c) f (i + j))
1569Proof
1570 REPEAT GEN_TAC THEN
1571 NTAC 2(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
1572 MP_TAC(ASSUME “a <= b”) THEN REWRITE_TAC[REAL_LE_LT] THEN
1573 ASM_CASES_TAC “a:real = b” THEN ASM_REWRITE_TAC[] THENL
1574 [ASM_MESON_TAC[INTEGRAL_NULL, DINT_UNIQ, REAL_LE_TRANS, REAL_ADD_LID],
1575 DISCH_TAC] THEN
1576 MP_TAC(ASSUME “b <= c”) THEN REWRITE_TAC[REAL_LE_LT] THEN
1577 ASM_CASES_TAC “b:real = c” THEN ASM_REWRITE_TAC[] THENL
1578 [ASM_MESON_TAC[INTEGRAL_NULL, DINT_UNIQ, REAL_LE_TRANS, REAL_ADD_RID],
1579 DISCH_TAC] THEN
1580 SIMP_TAC arith_ss[Dint, GSYM FORALL_AND_THM] THEN
1581 DISCH_THEN(fn th => X_GEN_TAC “e:real” THEN DISCH_TAC THEN MP_TAC th) THEN
1582 DISCH_THEN(MP_TAC o SPEC “e / &2”) THEN
1583 ASM_SIMP_TAC arith_ss[REAL_LT_DIV, REAL_LT] THEN
1584 DISCH_THEN(CONJUNCTS_THEN2
1585 (X_CHOOSE_THEN “g1:real->real” STRIP_ASSUME_TAC)
1586 (X_CHOOSE_THEN “g2:real->real” STRIP_ASSUME_TAC)) THEN
1587 EXISTS_TAC
1588 “\x. if x < b then min (g1 x) (b - x)
1589 else if b < x then min (g2 x) (x - b)
1590 else min (g1 x) (g2 x)” THEN
1591 CONJ_TAC THENL
1592 [REPEAT(FIRST_X_ASSUM(MP_TAC o REWRITE_RULE[gauge])) THEN
1593 REWRITE_TAC[gauge] THEN BETA_TAC THEN REPEAT STRIP_TAC THEN
1594 REPEAT COND_CASES_TAC THEN
1595 ASM_SIMP_TAC arith_ss[REAL_LT_MIN, REAL_SUB_LT] THEN
1596 TRY CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
1597 ASM_SIMP_TAC arith_ss[REAL_LT_IMP_LE,real_lte], ALL_TAC] THEN
1598 MAP_EVERY X_GEN_TAC [Term`d:num->real`, Term`p:num->real`] THEN
1599 REWRITE_TAC[tdiv, rsum] THEN STRIP_TAC THEN
1600 MP_TAC(SPECL [Term`d:num->real`, Term`a:real`, Term`c:real`,
1601 Term`b:real`]DIVISION_INTERMEDIATE) THEN ASM_REWRITE_TAC[] THEN
1602 DISCH_THEN(X_CHOOSE_THEN ``m:num``
1603 (CONJUNCTS_THEN2 MP_TAC STRIP_ASSUME_TAC)) THEN
1604 REWRITE_TAC[LESS_EQ_EXISTS] THEN
1605 DISCH_THEN(X_CHOOSE_TAC ``n:num``) THEN ASM_REWRITE_TAC[] THEN
1606 ASM_CASES_TAC ``(n:num) = 0`` THENL
1607 [FIRST_X_ASSUM SUBST_ALL_TAC THEN
1608 RULE_ASSUM_TAC(REWRITE_RULE[ADD_CLAUSES]) THEN
1609 FIRST_X_ASSUM(SUBST_ALL_TAC o SYM) THEN
1610 ASM_MESON_TAC[DIVISION_THM, GREATER_EQ, LESS_EQ_REFL, REAL_NOT_LT],
1611 ALL_TAC] THEN
1612 REWRITE_TAC[GSYM SUM_SPLIT, ADD_CLAUSES] THEN
1613 SUBGOAL_THEN``n= 1 + PRE n``ASSUME_TAC THENL
1614 [ASM_SIMP_TAC arith_ss[PRE_SUB1], ALL_TAC] THEN
1615 ONCE_ASM_REWRITE_TAC[] THEN REWRITE_TAC[GSYM SUM_SPLIT, SUM_1] THEN
1616 BETA_TAC THEN
1617 SUBGOAL_THEN ``(p:num->real) m = b`` ASSUME_TAC THENL
1618 [FIRST_X_ASSUM(MP_TAC o SPEC ``m:num`` o REWRITE_RULE [fine]) THEN
1619 SUBGOAL_THEN``m < dsize d``ASSUME_TAC THENL
1620 [ONCE_ASM_REWRITE_TAC[] THEN MATCH_MP_TAC LESS_ADD_NONZERO THEN
1621 ASM_REWRITE_TAC[],ALL_TAC] THEN
1622 ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM(MP_TAC o SPEC ``m:num``) THEN
1623 MAP_EVERY UNDISCH_TAC [``(d:num->real) m <= b``,
1624 ``b:real <= d(SUC m)``] THEN BETA_TAC THEN
1625 REPEAT STRIP_TAC THEN
1626 SUBGOAL_THEN``(d:num->real)(SUC m) - d m <
1627 min((g1:real->real)(p m)) (g2(p m))``MP_TAC THENL
1628 [POP_ASSUM MP_TAC THEN RW_TAC std_ss[] THEN
1629 POP_ASSUM MP_TAC THEN CONV_TAC CONTRAPOS_CONV THEN DISCH_TAC THEN
1630 REWRITE_TAC[GSYM real_lte,REAL_MIN_LE] THEN DISJ2_TAC THEN
1631 REWRITE_TAC[real_sub] THEN MATCH_MP_TAC REAL_LE_ADD2 THEN
1632 ASM_REWRITE_TAC[REAL_LE_NEG],ALL_TAC] THEN
1633 POP_ASSUM MP_TAC THEN RW_TAC std_ss[] THENL
1634 [UNDISCH_TAC``(d:num->real) (SUC m) - d m <
1635 min ((g1:real->real) (p m)) (b - p m)`` THEN
1636 CONV_TAC CONTRAPOS_CONV THEN DISCH_TAC THEN
1637 REWRITE_TAC[GSYM real_lte,REAL_MIN_LE] THEN DISJ2_TAC THEN
1638 REWRITE_TAC[real_sub] THEN MATCH_MP_TAC REAL_LE_ADD2 THEN
1639 ASM_REWRITE_TAC[REAL_LE_NEG],
1640 UNDISCH_TAC``(d:num->real) (SUC m) - d m <
1641 min ((g2:real->real) (p m)) (p m - b)``THEN
1642 CONV_TAC CONTRAPOS_CONV THEN DISCH_TAC THEN
1643 REWRITE_TAC[GSYM real_lte,REAL_MIN_LE] THEN DISJ2_TAC THEN
1644 REWRITE_TAC[real_sub] THEN MATCH_MP_TAC REAL_LE_ADD2 THEN
1645 ASM_REWRITE_TAC[REAL_LE_NEG],
1646 ASM_SIMP_TAC arith_ss[GSYM REAL_LE_ANTISYM,real_lte]],ALL_TAC] THEN
1647 ONCE_ASM_REWRITE_TAC[] THEN SIMP_TAC arith_ss[PRE_SUB1] THEN
1648 REWRITE_TAC[GSYM PRE_SUB1] THEN
1649 ABBREV_TAC``s1 = sum(0,m)(\n.
1650 (f:real->real)((p:num->real) n) * (d(SUC n) - d n))`` THEN
1651 ABBREV_TAC``s2 = sum(m + 1, PRE n)
1652 (\n. (f:real->real)((p:num->real) n) * (d(SUC n) - d n))`` THEN
1653 ONCE_REWRITE_TAC[REAL_ARITH
1654 ``(s1 + (f b * (d (SUC m) - d m) + s2) - (i + j)) =
1655 (s1 + (f b * (b - d m)) - i) + (s2 + (f b * (d(SUC m) - b)) - j)``] THEN
1656 MATCH_MP_TAC REAL_LET_TRANS THEN
1657 EXISTS_TAC``abs((s1 + f b * (b - d m)) - i) +
1658 abs((s2 + f b * (d(SUC m) - b)) - j)`` THEN
1659 REWRITE_TAC[REAL_ABS_TRIANGLE] THEN
1660 GEN_REWRITE_TAC RAND_CONV empty_rewrites [GSYM REAL_HALF_DOUBLE] THEN
1661 MATCH_MP_TAC REAL_LT_ADD2 THEN CONJ_TAC THENL
1662 [UNDISCH_TAC
1663 ``!D p. tdiv(a,b) (D,p) /\ fine g1 (D,p)
1664 ==> abs(rsum(D,p) f - i) < e / &2`` THEN
1665 DISCH_THEN(MP_TAC o SPEC ``\i.
1666 if i <= m then (d:num->real)(i) else b``) THEN
1667 DISCH_THEN(MP_TAC o SPEC ``\i.
1668 if i <= m then (p:num->real)(i) else b``) THEN
1669 MATCH_MP_TAC(TAUT_CONV ``a /\ (a ==> b) /\ (a /\ c ==> d)
1670 ==> (a /\ b ==> c) ==> d``) THEN
1671 CONJ_TAC THENL
1672 [REWRITE_TAC[tdiv, division] THEN REPEAT CONJ_TAC THENL
1673 [BETA_TAC THEN REWRITE_TAC[LE_0] THEN ASM_MESON_TAC[division],
1674 ASM_CASES_TAC ``(d:num->real) m = b`` THENL
1675 [EXISTS_TAC ``m:num`` THEN
1676 SIMP_TAC arith_ss[ARITH_CONV ``n < m ==> n <= m /\ SUC n <= m``] THEN
1677 CONJ_TAC THENL
1678 [UNDISCH_TAC``division(a,c) d`` THEN REWRITE_TAC[DIVISION_THM] THEN
1679 STRIP_TAC THEN ASM_MESON_TAC[ARITH_CONV``(i:num) < m ==> i < m + n``],
1680 RW_TAC arith_ss[] THEN SUBGOAL_THEN``(n':num) = m``ASSUME_TAC THENL
1681 [ASM_SIMP_TAC arith_ss[REAL_LE_ANTISYM], ASM_SIMP_TAC arith_ss[]]],
1682 EXISTS_TAC ``SUC m`` THEN
1683 SIMP_TAC arith_ss[ARITH_CONV ``n >= SUC m ==> ~(n <= m)``] THEN
1684 RW_TAC arith_ss[] THENL
1685 [UNDISCH_TAC``division(a,c) d`` THEN
1686 REWRITE_TAC[DIVISION_THM] THEN STRIP_TAC THEN
1687 SUBGOAL_THEN``(n':num) < dsize d``ASSUME_TAC THENL
1688 [MATCH_MP_TAC LESS_LESS_EQ_TRANS THEN EXISTS_TAC``m:num`` THEN
1689 CONJ_TAC THENL
1690 [MATCH_MP_TAC OR_LESS THEN ASM_REWRITE_TAC[],
1691 ONCE_ASM_REWRITE_TAC[] THEN REWRITE_TAC [LESS_EQ_ADD]],
1692 ASM_SIMP_TAC arith_ss[]],
1693 SUBGOAL_THEN``(n':num) = m``ASSUME_TAC THENL
1694 [ASM_SIMP_TAC arith_ss[],ONCE_ASM_REWRITE_TAC[] THEN
1695 ONCE_REWRITE_TAC[REAL_LT_LE] THEN ASM_REWRITE_TAC[]]]],
1696 BETA_TAC THEN GEN_TAC THEN RW_TAC std_ss[] THENL
1697 [REWRITE_TAC[REAL_LE_REFL],
1698 SUBGOAL_THEN``(n':num) = m``ASSUME_TAC THENL
1699 [ASM_SIMP_TAC arith_ss[],
1700 MATCH_MP_TAC REAL_EQ_IMP_LE THEN RW_TAC arith_ss[]],
1701 SUBGOAL_THEN``~(SUC n' <= m)``ASSUME_TAC THENL
1702 [RW_TAC arith_ss[],ASM_MESON_TAC[]],
1703 REWRITE_TAC[REAL_LE_REFL]]],ALL_TAC] THEN
1704 CONJ_TAC THENL
1705 [REWRITE_TAC[tdiv, fine] THEN BETA_TAC THEN
1706 STRIP_TAC THEN X_GEN_TAC ``k:num`` THEN
1707 UNDISCH_TAC``fine
1708 (\x.
1709 if x < b then
1710 min (g1 x) (b - x)
1711 else if b < x then
1712 min (g2 x) (x - b)
1713 else
1714 min (g1 x) (g2 x)) (d,p)`` THEN REWRITE_TAC[fine] THEN
1715 DISCH_THEN(MP_TAC o SPEC ``k:num``) THEN MATCH_MP_TAC MONO_IMP THEN
1716 ASM_CASES_TAC ``k:num = m`` THENL
1717 [ASM_SIMP_TAC arith_ss[LESS_EQ_REFL, REAL_LT_REFL] THEN DISCH_TAC THEN
1718 MATCH_MP_TAC REAL_LET_TRANS THEN
1719 EXISTS_TAC``(d:num->real) (SUC m) - d m`` THEN CONJ_TAC THENL
1720 [REWRITE_TAC[real_sub] THEN MATCH_MP_TAC REAL_LE_ADD2 THEN
1721 ASM_REWRITE_TAC[REAL_LE_REFL],
1722 MATCH_MP_TAC REAL_LTE_TRANS THEN
1723 EXISTS_TAC``min ((g1:real->real) b) ((g2:real->real) b)`` THEN
1724 ASM_REWRITE_TAC[REAL_MIN_LE1]],ALL_TAC] THEN
1725 ASM_CASES_TAC ``k:num <= m`` THEN ONCE_ASM_REWRITE_TAC[] THENL
1726 [ASM_SIMP_TAC arith_ss[] THEN
1727 SUBGOAL_THEN ``(p:num->real) k <= b`` MP_TAC THENL
1728 [MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC ``(d:num->real) m`` THEN
1729 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_LE_TRANS THEN
1730 EXISTS_TAC ``(d:num->real) (SUC k)`` THEN ASM_REWRITE_TAC[] THEN
1731 ASM_MESON_TAC[DIVISION_MONO_LE, ARITH_CONV
1732 ``k <= m /\ ~(k = m) ==> SUC k <= m``],ALL_TAC] THEN
1733 COND_CASES_TAC THENL
1734 [REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LTE_TRANS THEN
1735 EXISTS_TAC``min ((g1 :real -> real)
1736 ((p :num -> real) k)) ((b :real) - p k)`` THEN
1737 ASM_SIMP_TAC arith_ss[REAL_MIN_LE1],
1738 DISCH_TAC THEN
1739 SUBGOAL_THEN``(p :num -> real) k = b``ASSUME_TAC THENL
1740 [ASM_SIMP_TAC arith_ss[REAL_ARITH
1741 ``~(a < b) /\ (a <= b) ==> (a = b)``],
1742 ASM_SIMP_TAC arith_ss[REAL_LT_REFL] THEN DISCH_TAC THEN
1743 MATCH_MP_TAC REAL_LTE_TRANS THEN
1744 EXISTS_TAC``min ((g1 :real -> real) b) (g2 b)`` THEN
1745 ASM_SIMP_TAC arith_ss[REAL_MIN_LE1]]],ALL_TAC] THEN
1746 CONJ_TAC THENL
1747 [DISCH_TAC THEN
1748 SUBGOAL_THEN``dsize
1749 (\(i :num). if i <= (m :num) then (d :num -> real) i
1750 else (b :real)) <= SUC (m:num)``MP_TAC THENL
1751 [MATCH_MP_TAC DIVISION_DSIZE_LE THEN
1752 MAP_EVERY EXISTS_TAC [``a:real``, ``b:real``] THEN
1753 ASM_REWRITE_TAC[] THEN SIMP_TAC arith_ss[],
1754 ASM_SIMP_TAC arith_ss[]],
1755 UNDISCH_TAC ``gauge (\x. a <= x /\ x <= b) g1`` THEN
1756 ASM_SIMP_TAC arith_ss[REAL_SUB_REFL, gauge, REAL_LE_REFL]],
1757 ALL_TAC] THEN
1758 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
1759 HO_MATCH_MP_TAC(REAL_ARITH
1760 ``(x = y) ==> abs(x - i) < e ==> abs(y - i) < e``) THEN
1761 REWRITE_TAC[rsum] THEN ASM_CASES_TAC ``(d:num->real) m = b`` THENL
1762 [SUBGOAL_THEN ``dsize (\i. if i <= m then d i else b) = m`` ASSUME_TAC THENL
1763 [MATCH_MP_TAC DIVISION_DSIZE_EQ_ALT THEN
1764 MAP_EVERY EXISTS_TAC [``a:real``, ``b:real``] THEN CONJ_TAC THENL
1765 [ASM_MESON_TAC[tdiv], ALL_TAC] THEN
1766 BETA_TAC THEN
1767 ASM_SIMP_TAC arith_ss[LESS_EQ_REFL, ARITH_CONV ``~(SUC m <= m)``] THEN
1768 UNDISCH_TAC``division (a,c) d`` THEN REWRITE_TAC[DIVISION_THM] THEN
1769 ONCE_ASM_REWRITE_TAC[] THEN
1770 MESON_TAC[ARITH_CONV ``i < m:num ==> i < m + n``], ALL_TAC] THEN
1771 ONCE_ASM_REWRITE_TAC[] THEN
1772 ASM_SIMP_TAC arith_ss[REAL_SUB_REFL, REAL_MUL_RZERO, REAL_ADD_RID] THEN
1773 UNDISCH_TAC``sum (0,m) (\n. (f:real->real) (p n) *
1774 ((d:num->real) (SUC n) - d n)) = s1`` THEN
1775 CONV_TAC(LAND_CONV SYM_CONV) THEN SIMP_TAC arith_ss[] THEN
1776 DISCH_TAC THEN MATCH_MP_TAC SUM_EQ THEN
1777 SIMP_TAC arith_ss[ADD_CLAUSES, LESS_IMP_LESS_OR_EQ, GSYM LESS_EQ],
1778 ALL_TAC] THEN
1779 SUBGOAL_THEN ``dsize (\i. if i <= m then d i else b) = SUC m``
1780 ASSUME_TAC THENL
1781 [MATCH_MP_TAC DIVISION_DSIZE_EQ THEN
1782 MAP_EVERY EXISTS_TAC [``a:real``, ``b:real``] THEN CONJ_TAC THENL
1783 [ASM_MESON_TAC[tdiv],
1784 BETA_TAC THEN
1785 ASM_SIMP_TAC arith_ss[LESS_EQ_REFL, ARITH_CONV ``~(SUC m <= m)``] THEN
1786 ASM_REWRITE_TAC[REAL_LT_LE]],ALL_TAC] THEN
1787 ASM_SIMP_TAC arith_ss[sum, ADD_CLAUSES, LESS_EQ_REFL,
1788 ARITH_CONV ``~(SUC m <= m)``] THEN
1789 UNDISCH_TAC``sum (0,m) (\n. (f:real->real) (p n) *
1790 ((d:num->real) (SUC n) - d n)) = s1`` THEN
1791 CONV_TAC(LAND_CONV SYM_CONV) THEN SIMP_TAC arith_ss[] THEN
1792 DISCH_TAC THEN ONCE_REWRITE_TAC[REAL_EQ_RADD] THEN
1793 MATCH_MP_TAC SUM_EQ THEN
1794 SIMP_TAC arith_ss[ADD_CLAUSES, LESS_IMP_LESS_OR_EQ, GSYM LESS_EQ],
1795 ALL_TAC] THEN
1796 ASM_CASES_TAC ``d(SUC m):real = b`` THEN ASM_REWRITE_TAC[] THENL
1797 [ASM_REWRITE_TAC[REAL_SUB_REFL, REAL_MUL_RZERO, REAL_ADD_RID] THEN
1798 UNDISCH_TAC``sum (m + 1,PRE n)
1799 (\n. (f:real->real) ((p:num->real) n) *
1800 ((d:num->real) (SUC n) - d n)) = s2`` THEN
1801 CONV_TAC(LAND_CONV SYM_CONV) THEN SIMP_TAC arith_ss[] THEN DISCH_TAC THEN
1802 UNDISCH_TAC
1803 ``!D p. tdiv(b,c) (D,p) /\ fine g2 (D,p)
1804 ==> abs(rsum(D,p) f - j) < e / &2`` THEN
1805 DISCH_THEN(MP_TAC o SPEC ``\i. (d:num->real) (i + SUC m)``) THEN
1806 DISCH_THEN(MP_TAC o SPEC ``\i. (p:num->real) (i + SUC m)``) THEN
1807 MATCH_MP_TAC(TAUT_CONV ``a /\ (a ==> b /\ (b /\ c ==> d))
1808 ==> (a /\ b ==> c) ==> d``) THEN
1809 CONJ_TAC THENL
1810 [ASM_SIMP_TAC arith_ss[tdiv, division, ADD_CLAUSES] THEN
1811 EXISTS_TAC ``PRE n`` THEN
1812 UNDISCH_TAC``division(a,c) d`` THEN REWRITE_TAC[DIVISION_THM] THEN
1813 ASM_MESON_TAC[ARITH_CONV
1814 ``~(n = 0) /\ k < PRE n ==> SUC(k + m) < m + n``,
1815 ARITH_CONV
1816 ``~(n = 0) /\ k >= PRE n ==> SUC(k + m) >= m + n``],
1817 DISCH_TAC] THEN
1818 SUBGOAL_THEN ``dsize(\i. d (i + SUC m)) = PRE n`` ASSUME_TAC THENL
1819 [MATCH_MP_TAC DIVISION_DSIZE_EQ_ALT THEN
1820 MAP_EVERY EXISTS_TAC [``b:real``, ``c:real``] THEN
1821 CONJ_TAC THENL
1822 [ASM_MESON_TAC[tdiv],
1823 BETA_TAC THEN SIMP_TAC arith_ss[] THEN
1824 UNDISCH_TAC``division(a,c) d`` THEN REWRITE_TAC[DIVISION_THM] THEN
1825 DISCH_THEN(MP_TAC o CONJUNCT2) THEN
1826 ASM_SIMP_TAC arith_ss[ADD_CLAUSES]],ALL_TAC] THEN
1827 CONJ_TAC THENL
1828 [ASM_SIMP_TAC arith_ss[fine] THEN X_GEN_TAC ``k:num`` THEN
1829 DISCH_TAC THEN
1830 UNDISCH_TAC``fine
1831 (\x.
1832 if x < b then
1833 min ((g1:real->real) x) (b - x)
1834 else if b < x then
1835 min ((g2:real->real) x) (x - b)
1836 else
1837 min (g1 x) (g2 x)) (d,p)`` THEN
1838 REWRITE_TAC[fine] THEN DISCH_THEN(MP_TAC o SPEC ``k + SUC m``) THEN
1839 UNDISCH_TAC ``b <= d (SUC m)`` THEN
1840 ASM_SIMP_TAC arith_ss[ADD_CLAUSES] THEN REWRITE_TAC[REAL_LE_REFL] THEN
1841 MATCH_MP_TAC(REAL_ARITH ``b <= a ==> x < b ==> x < a``) THEN
1842 SUBGOAL_THEN ``~(p(SUC (k + m)) < b)``ASSUME_TAC THENL
1843 [RW_TAC arith_ss[GSYM real_lte] THEN MATCH_MP_TAC REAL_LE_TRANS THEN
1844 EXISTS_TAC``(d:num->real)(SUC (k + m))`` THEN CONJ_TAC THENL
1845 [SUBGOAL_THEN``SUC m <= SUC (k+m)``MP_TAC THENL
1846 [SIMP_TAC arith_ss[], MATCH_MP_TAC DIVISION_MONO_LE THEN
1847 MAP_EVERY EXISTS_TAC [``a:real``, ``c:real``] THEN
1848 ASM_REWRITE_TAC[]],
1849 UNDISCH_TAC``tdiv (d (SUC m),c)
1850 ((\i. d (i + SUC m)),(\i. p (i + SUC m)))`` THEN
1851 REWRITE_TAC[tdiv] THEN BETA_TAC THEN STRIP_TAC THEN
1852 ASM_SIMP_TAC arith_ss[]],ASM_SIMP_TAC arith_ss[]] THEN
1853 RW_TAC arith_ss[] THENL
1854 [REWRITE_TAC[REAL_MIN_LE1],REWRITE_TAC[REAL_MIN_LE2]],ALL_TAC] THEN
1855 REWRITE_TAC[rsum] THEN DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
1856 SUBGOAL_THEN``(m:num) + 1 = 0 + SUC m``ASSUME_TAC THENL
1857 [SIMP_TAC arith_ss[],ALL_TAC] THEN
1858 ONCE_ASM_REWRITE_TAC[] THEN REWRITE_TAC[SUM_REINDEX] THEN
1859 SIMP_TAC arith_ss[PRE_SUB1] THEN
1860 SIMP_TAC arith_ss[ADD1, ADD_CLAUSES],ALL_TAC] THEN
1861 UNDISCH_TAC
1862 ``!D p. tdiv(b,c) (D,p) /\ fine g2 (D,p)
1863 ==> abs(rsum(D,p) f - j) < e / &2`` THEN
1864 DISCH_THEN(MP_TAC o SPEC ``\i. if i = 0 then (b:real)
1865 else (d:num->real)(i + m)``) THEN
1866 DISCH_THEN(MP_TAC o SPEC ``\i. if i = 0 then (b:real)
1867 else (p:num->real)(i + m)``) THEN
1868 MATCH_MP_TAC(TAUT_CONV ``a /\ (a ==> b /\ (b /\ c ==> d))
1869 ==> (a /\ b ==> c) ==> d``) THEN
1870 CONJ_TAC THENL
1871 [SIMP_TAC arith_ss[tdiv, division, ADD_CLAUSES] THEN CONJ_TAC THENL
1872 [EXISTS_TAC ``n:num`` THEN UNDISCH_TAC``division(a,c) d`` THEN
1873 REWRITE_TAC[DIVISION_THM] THEN DISCH_THEN(MP_TAC o CONJUNCT2) THEN
1874 MATCH_MP_TAC MONO_AND THEN ASM_SIMP_TAC arith_ss[] THEN
1875 DISCH_THEN(fn th =>
1876 X_GEN_TAC ``k:num`` THEN MP_TAC(SPEC ``k + m:num`` th)) THEN
1877 ASM_CASES_TAC ``k:num < n`` THENL
1878 [ASM_SIMP_TAC arith_ss[ARITH_CONV
1879 ``(k + (m:num) < m + n) = (k < n)``] THEN
1880 COND_CASES_TAC THENL
1881 [ASM_SIMP_TAC arith_ss[ADD_CLAUSES,REAL_LT_LE],REWRITE_TAC[]],
1882 ASM_SIMP_TAC arith_ss[ADD_CLAUSES]],ALL_TAC] THEN
1883 GEN_TAC THEN COND_CASES_TAC THENL
1884 [ASM_SIMP_TAC arith_ss[REAL_LE_REFL],
1885 ASM_SIMP_TAC arith_ss[REAL_LE_REFL]], ALL_TAC] THEN DISCH_TAC THEN
1886 SUBGOAL_THEN ``dsize(\i. if i = 0 then b else d (i + m)) = n``
1887 ASSUME_TAC THENL
1888 [MATCH_MP_TAC DIVISION_DSIZE_EQ_ALT THEN
1889 MAP_EVERY EXISTS_TAC [``b:real``, ``c:real``] THEN
1890 CONJ_TAC THENL [ASM_MESON_TAC[tdiv],ALL_TAC] THEN BETA_TAC THEN
1891 UNDISCH_TAC``division(a,c) d`` THEN REWRITE_TAC[DIVISION_THM] THEN
1892 DISCH_THEN(MP_TAC o CONJUNCT2) THEN ONCE_ASM_REWRITE_TAC[ADD_CLAUSES] THEN
1893 GEN_REWRITE_TAC RAND_CONV empty_rewrites [CONJ_SYM] THEN
1894 MATCH_MP_TAC MONO_AND THEN
1895 CONJ_TAC THENL
1896 [DISCH_THEN(fn th =>
1897 X_GEN_TAC ``k:num`` THEN MP_TAC(SPEC ``k + (m:num)`` th)) THEN
1898 ASM_CASES_TAC ``(k:num) < n`` THENL
1899 [ASM_SIMP_TAC arith_ss[ARITH_CONV ``(k + (m:num) < m + n) = (k < n)``] THEN
1900 COND_CASES_TAC THEN ASM_SIMP_TAC arith_ss[ADD_CLAUSES] THEN
1901 ASM_SIMP_TAC arith_ss[REAL_LT_LE],
1902 ASM_SIMP_TAC arith_ss[]], ASM_SIMP_TAC arith_ss[]],ALL_TAC] THEN
1903 CONJ_TAC THENL
1904 [ASM_SIMP_TAC arith_ss[fine] THEN X_GEN_TAC ``k:num`` THEN DISCH_TAC THEN
1905 UNDISCH_TAC``fine
1906 (\x.
1907 if x < b then
1908 min ((g1:real->real) x) (b - x)
1909 else if b < x then
1910 min ((g2:real->real) x) (x - b)
1911 else
1912 min (g1 x) (g2 x)) (d,p)`` THEN REWRITE_TAC[fine] THEN
1913 DISCH_THEN(MP_TAC o SPEC ``k + m:num``) THEN
1914 ASM_SIMP_TAC arith_ss[ADD_CLAUSES,ARITH_CONV
1915 ``(k + m < m + n) = ((k:num) < n)``] THEN
1916 ASM_CASES_TAC ``(k:num) = 0`` THENL
1917 [ASM_SIMP_TAC arith_ss[ADD_CLAUSES, REAL_LT_REFL] THEN DISCH_TAC THEN
1918 MATCH_MP_TAC REAL_LTE_TRANS THEN
1919 EXISTS_TAC``min (g1 b) ((g2:real->real) b)`` THEN
1920 REWRITE_TAC[REAL_MIN_LE2] THEN MATCH_MP_TAC REAL_LET_TRANS THEN
1921 EXISTS_TAC``(d:num->real) (SUC m) - d m`` THEN
1922 ASM_SIMP_TAC arith_ss[] THEN
1923 ASM_REWRITE_TAC[real_sub,REAL_LE_LADD,REAL_LE_NEG2],ALL_TAC] THEN
1924 ASM_SIMP_TAC arith_ss[] THEN
1925 MATCH_MP_TAC(REAL_ARITH ``b <= a ==> x < b ==> x < a``) THEN
1926 SUBGOAL_THEN ``~((p:num->real) (k + m) < b)``ASSUME_TAC THENL
1927 [RW_TAC arith_ss[GSYM real_lte] THEN MATCH_MP_TAC REAL_LE_TRANS THEN
1928 EXISTS_TAC``(d:num->real)(SUC m)`` THEN ASM_SIMP_TAC arith_ss[] THEN
1929 MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC``(d:num->real) (k + m)`` THEN
1930 CONJ_TAC THENL
1931 [FIRST_X_ASSUM(MP_TAC o MATCH_MP DIVISION_MONO_LE) THEN
1932 DISCH_THEN MATCH_MP_TAC THEN ASM_SIMP_TAC arith_ss[],
1933 FIRST_ASSUM(MP_TAC o CONJUNCT1 o SPEC ``(k + m):num``) THEN
1934 SIMP_TAC arith_ss[]],ALL_TAC] THEN
1935 ASM_SIMP_TAC arith_ss[] THEN RW_TAC arith_ss[] THENL
1936 [REWRITE_TAC[REAL_MIN_LE1],REWRITE_TAC[REAL_MIN_LE2]],ALL_TAC] THEN
1937 ASM_SIMP_TAC arith_ss[rsum] THEN
1938 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
1939 MATCH_MP_TAC(REAL_ARITH
1940 ``(x = y) ==> abs(x - i) < e ==> abs(y - i) < e``) THEN
1941 ONCE_ASM_REWRITE_TAC[] THEN
1942 SIMP_TAC arith_ss[GSYM SUM_SPLIT, SUM_1, ADD_CLAUSES] THEN
1943 MATCH_MP_TAC(REAL_ARITH ``(a = b) ==> (x + a = b + x)``) THEN
1944 UNDISCH_TAC``sum(m + 1, PRE n)
1945 (\n. (f:real->real)((p:num->real) n) * (d(SUC n) - d n)) = s2`` THEN
1946 CONV_TAC(LAND_CONV SYM_CONV) THEN SIMP_TAC arith_ss[] THEN DISCH_TAC THEN
1947 SUBGOAL_THEN``(1:num) = 0 + 1``ASSUME_TAC THENL
1948 [SIMP_TAC arith_ss[],ALL_TAC] THEN ONCE_ASM_REWRITE_TAC[] THEN
1949 SUBGOAL_THEN``(m:num) + (0 + 1) = 0 + m + 1``ASSUME_TAC THENL
1950 [SIMP_TAC arith_ss[],ALL_TAC] THEN ONCE_ASM_REWRITE_TAC[] THEN
1951 REWRITE_TAC[SUM_REINDEX] THEN MATCH_MP_TAC SUM_EQ THEN
1952 SIMP_TAC arith_ss[ADD_CLAUSES, ADD_EQ_0]
1953QED
1954
1955(* ------------------------------------------------------------------------- *)
1956(* Pointwise perturbation and spike functions. *)
1957(* ------------------------------------------------------------------------- *)
1958
1959Theorem DINT_DELTA_LEFT:
1960 !a b. Dint(a,b) (\x. if x = a then &1 else &0) (&0)
1961Proof
1962 REPEAT GEN_TAC THEN DISJ_CASES_TAC(REAL_ARITH ``b < a \/ a <= b``) THENL
1963 [ASM_SIMP_TAC arith_ss[DINT_WRONG],
1964 REWRITE_TAC[Dint] THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
1965 EXISTS_TAC ``(\x. e):real->real`` THEN
1966 ASM_SIMP_TAC arith_ss[REAL_LT_DIV, REAL_LT, gauge,
1967 fine, rsum, tdiv, REAL_SUB_RZERO] THEN
1968 MAP_EVERY X_GEN_TAC[“d:num->real”,“p:num->real”] THEN
1969 STRIP_TAC THEN ASM_CASES_TAC(Term`dsize d = 0`) THEN
1970 ASM_REWRITE_TAC[sum, ABS_N] THEN
1971 SUBGOAL_THEN“dsize d = 1 + PRE (dsize d)”ASSUME_TAC THENL
1972 [ASM_SIMP_TAC arith_ss[PRE_SUB1],
1973 ONCE_ASM_REWRITE_TAC[] THEN
1974 REWRITE_TAC[GSYM SUM_SPLIT, SUM_1, ADD_CLAUSES] THEN
1975 MATCH_MP_TAC(REAL_ARITH
1976 ``(&0 <= x /\ x < e) /\ (y = &0) ==> (abs(x + y) < e)``) THEN
1977 CONJ_TAC THENL
1978 [BETA_TAC THEN COND_CASES_TAC THENL
1979 [REWRITE_TAC[REAL_MUL_LID, REAL_SUB_LE] THEN
1980 ASM_MESON_TAC[DIVISION_THM, ZERO_LESS_EQ, NOT_ZERO_LT_ZERO],
1981 ASM_REWRITE_TAC [REAL_MUL_LZERO, REAL_LE_REFL]],
1982 MATCH_MP_TAC SUM_EQ_0 THEN X_GEN_TAC ``r:num`` THEN STRIP_TAC THEN
1983 BETA_TAC THEN REWRITE_TAC[REAL_ENTIRE] THEN DISJ1_TAC THEN
1984 SUBGOAL_THEN``(a:real) < (p:num->real) r``MP_TAC THENL
1985 [MATCH_MP_TAC REAL_LTE_TRANS THEN EXISTS_TAC``(d:num->real)r`` THEN
1986 CONJ_TAC THENL
1987 [SUBGOAL_THEN``(a:real) = (d:num->real) 0``MP_TAC THENL
1988 [UNDISCH_TAC``division (a,b) d`` THEN REWRITE_TAC[DIVISION_THM] THEN
1989 STRIP_TAC THEN UNDISCH_TAC``(d:num->real) 0 = a`` THEN
1990 CONV_TAC(LAND_CONV SYM_CONV) THEN PROVE_TAC[],
1991 DISCH_TAC THEN ONCE_ASM_REWRITE_TAC[] THEN
1992 MATCH_MP_TAC DIVISION_LT_GEN THEN
1993 MAP_EVERY EXISTS_TAC[``a:real``,``b:real``] THEN
1994 ASM_SIMP_TAC arith_ss[LESS_EQ, GSYM ONE]],
1995 POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN
1996 ASM_SIMP_TAC arith_ss[]],
1997 SIMP_TAC arith_ss[REAL_LT_IMP_NE]]]]]
1998QED
1999
2000Theorem DINT_DELTA_RIGHT:
2001 !a b. Dint(a,b) (\x. if x = b then &1 else &0) (&0)
2002Proof
2003 REPEAT GEN_TAC THEN DISJ_CASES_TAC(REAL_ARITH ``b < a \/ a <= b``) THENL
2004 [ASM_SIMP_TAC arith_ss[DINT_WRONG],
2005 REWRITE_TAC[Dint] THEN
2006 X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
2007 EXISTS_TAC ``(\x. e):real->real`` THEN
2008 ASM_SIMP_TAC arith_ss[REAL_LT_DIV, REAL_LT,
2009 gauge, fine, rsum, tdiv, REAL_SUB_RZERO] THEN
2010 MAP_EVERY X_GEN_TAC [``d:num->real``, ``p:num->real``] THEN
2011 STRIP_TAC THEN ASM_CASES_TAC ``dsize d = 0`` THEN
2012 ASM_REWRITE_TAC[sum, ABS_N] THEN
2013 SUBGOAL_THEN``dsize d = PRE (dsize d) + 1``ASSUME_TAC THENL
2014 [ASM_SIMP_TAC arith_ss[PRE_SUB1],
2015 ONCE_ASM_REWRITE_TAC[] THEN ABBREV_TAC ``m = PRE(dsize d)`` THEN
2016 ASM_REWRITE_TAC[GSYM SUM_SPLIT, SUM_1, ADD_CLAUSES] THEN
2017 MATCH_MP_TAC(REAL_ARITH
2018 ``(&0 <= x /\ x < e) /\ (y = &0) ==> abs(y + x) < e``) THEN
2019 CONJ_TAC THENL
2020 [BETA_TAC THEN COND_CASES_TAC THENL
2021 [REWRITE_TAC[REAL_MUL_LID, REAL_SUB_LE] THEN CONJ_TAC THENL
2022 [PROVE_TAC[DIVISION_MONO_LE_SUC], ASM_SIMP_TAC arith_ss[]],
2023 ASM_REWRITE_TAC[REAL_MUL_LZERO, REAL_LE_REFL]],
2024 MATCH_MP_TAC SUM_EQ_0 THEN X_GEN_TAC ``r:num`` THEN
2025 REWRITE_TAC[ADD_CLAUSES] THEN STRIP_TAC THEN BETA_TAC THEN
2026 REWRITE_TAC[REAL_ENTIRE] THEN DISJ1_TAC THEN
2027 SUBGOAL_THEN``(p:num->real) r < b``MP_TAC THENL
2028 [MATCH_MP_TAC REAL_LET_TRANS THEN
2029 EXISTS_TAC``(d:num->real)(SUC r)`` THEN CONJ_TAC THENL
2030 [ASM_REWRITE_TAC[],
2031 SUBGOAL_THEN``b = d(dsize d)``MP_TAC THENL
2032 [UNDISCH_TAC``division(a,b) (d:num->real)`` THEN
2033 REWRITE_TAC[DIVISION_THM] THEN STRIP_TAC THEN
2034 POP_ASSUM MP_TAC THEN SIMP_TAC arith_ss[],
2035 DISCH_TAC THEN ONCE_ASM_REWRITE_TAC[] THEN
2036 ONCE_ASM_REWRITE_TAC[] THEN REWRITE_TAC[SUC_ONE_ADD] THEN
2037 MATCH_MP_TAC DIVISION_LT_GEN THEN
2038 MAP_EVERY EXISTS_TAC[``a:real``,``b:real``] THEN
2039 ASM_SIMP_TAC arith_ss[LESS_EQ]]],
2040 SIMP_TAC arith_ss[REAL_LT_IMP_NE]]]]]
2041QED
2042
2043Theorem DINT_DELTA:
2044 !a b c. Dint(a,b) (\x. if x = c then &1 else &0) (&0)
2045Proof
2046 REPEAT GEN_TAC THEN ASM_CASES_TAC ``a <= b`` THENL
2047 [ALL_TAC, ASM_MESON_TAC[REAL_NOT_LE, DINT_WRONG]] THEN
2048 ASM_CASES_TAC ``a <= c /\ c <= b`` THENL
2049 [ALL_TAC,
2050 MATCH_MP_TAC INTEGRAL_EQ THEN EXISTS_TAC ``\x:real. &0`` THEN
2051 ASM_REWRITE_TAC[DINT_0] THEN RW_TAC arith_ss[]] THEN
2052 GEN_REWRITE_TAC RAND_CONV empty_rewrites [GSYM REAL_ADD_LID] THEN
2053 MATCH_MP_TAC DINT_COMBINE THEN EXISTS_TAC ``c:real`` THEN
2054 ASM_REWRITE_TAC[DINT_DELTA_LEFT, DINT_DELTA_RIGHT]
2055QED
2056
2057Theorem DINT_POINT_SPIKE:
2058 !f g a b c i.
2059 (!x. a <= x /\ x <= b /\ ~(x = c) ==> (f x = g x)) /\ Dint(a,b) f i
2060 ==> Dint(a,b) g i
2061Proof
2062 REPEAT STRIP_TAC THEN ASM_CASES_TAC ``a <= b`` THENL
2063 [ALL_TAC, ASM_MESON_TAC[REAL_NOT_LE, DINT_WRONG]] THEN
2064 MATCH_MP_TAC INTEGRAL_EQ THEN
2065 EXISTS_TAC ``\x:real. f(x) + (g c - f c) * (if x = c then &1 else &0)`` THEN
2066 ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
2067 [SUBST1_TAC(REAL_ARITH ``i = i + ((g:real->real) c - f c) * &0``) THEN
2068 HO_MATCH_MP_TAC DINT_ADD THEN ASM_REWRITE_TAC[] THEN
2069 HO_MATCH_MP_TAC DINT_CMUL THEN REWRITE_TAC[DINT_DELTA],
2070 REPEAT STRIP_TAC THEN BETA_TAC THEN COND_CASES_TAC THEN
2071 ASM_SIMP_TAC arith_ss[REAL_MUL_RZERO, REAL_ADD_RID] THEN
2072 REAL_ARITH_TAC]
2073QED
2074
2075Theorem DINT_FINITE_SPIKE:
2076 !f g a b s i.
2077 FINITE s /\
2078 (!x. a <= x /\ x <= b /\ ~(x IN s) ==> (f x = g x)) /\
2079 Dint(a,b) f i
2080 ==> Dint(a,b) g i
2081Proof
2082 REPEAT GEN_TAC THEN
2083 REWRITE_TAC[TAUT_CONV ``a /\ b /\ c ==> d <=> c ==> a ==> b ==> d``] THEN
2084 DISCH_TAC THEN
2085 MAP_EVERY (fn t => SPEC_TAC(t,t))[``g:real->real``, ``s:real->bool``] THEN
2086 SIMP_TAC bool_ss[RIGHT_FORALL_IMP_THM] THEN
2087 HO_MATCH_MP_TAC FINITE_INDUCT THEN REWRITE_TAC[NOT_IN_EMPTY] THEN
2088 CONJ_TAC THENL [ASM_MESON_TAC[INTEGRAL_EQ], ALL_TAC] THEN
2089 X_GEN_TAC``s:real->bool`` THEN DISCH_TAC THEN X_GEN_TAC``c:real`` THEN
2090 POP_ASSUM MP_TAC THEN
2091 REWRITE_TAC[TAUT_CONV``a /\ b ==> c ==> d <=> b /\ c /\ a ==> d``] THEN
2092 STRIP_TAC THEN X_GEN_TAC ``g:real->real`` THEN
2093 REWRITE_TAC[IN_INSERT, DE_MORGAN_THM] THEN DISCH_TAC THEN
2094 MATCH_MP_TAC DINT_POINT_SPIKE THEN
2095 EXISTS_TAC ``\x. if x = c then (f:real->real) x else g x`` THEN
2096 EXISTS_TAC ``c:real`` THEN SIMP_TAC arith_ss[] THEN
2097 FIRST_X_ASSUM MATCH_MP_TAC THEN BETA_TAC THEN RW_TAC std_ss[]
2098QED
2099
2100(* ------------------------------------------------------------------------- *)
2101(* Cauchy-type integrability criterion. *)
2102(* ------------------------------------------------------------------------- *)
2103
2104Theorem GAUGE_MIN_FINITE:
2105 !s gs n. (!m:num. m <= n ==> gauge s (gs m))
2106 ==> ?g. gauge s g /\
2107 !d p. fine g (d,p) ==> !m. m <= n ==> fine (gs m) (d,p)
2108Proof
2109 GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THENL
2110 [MESON_TAC[LE],
2111 REWRITE_TAC[LE] THEN
2112 REWRITE_TAC[TAUT_CONV ``(a \/ b ==> c) = ((a ==> c) /\ (b ==> c))``] THEN
2113 SIMP_TAC arith_ss[FORALL_AND_THM, LEFT_FORALL_IMP_THM, EXISTS_REFL] THEN
2114 STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o assert (is_imp o concl)) THEN
2115 ASM_REWRITE_TAC[] THEN
2116 DISCH_THEN(X_CHOOSE_THEN ``gm:real->real`` STRIP_ASSUME_TAC) THEN
2117 EXISTS_TAC ``\x:real. if gm x <
2118 gs(SUC n) x then gm x else gs(SUC n) x`` THEN
2119 SUBGOAL_THEN``gauge s (\x:real. if gm x <
2120 gs(SUC n) x then gm x else gs(SUC n) x)``ASSUME_TAC THENL
2121 [MATCH_MP_TAC GAUGE_MIN THEN ASM_REWRITE_TAC[],
2122 ASM_REWRITE_TAC[] THEN REPEAT GEN_TAC THEN
2123 DISCH_THEN(MP_TAC o MATCH_MP FINE_MIN) THEN
2124 ASM_SIMP_TAC arith_ss[ETA_AX]]]
2125QED
2126
2127Theorem INTEGRABLE_CAUCHY:
2128 !f a b. integrable(a,b) f <=>
2129 !e. &0 < e
2130 ==> ?g. gauge (\x. a <= x /\ x <= b) g /\
2131 !d1 p1 d2 p2.
2132 tdiv (a,b) (d1,p1) /\ fine g (d1,p1) /\
2133 tdiv (a,b) (d2,p2) /\ fine g (d2,p2)
2134 ==> abs (rsum(d1,p1) f - rsum(d2,p2) f) < e
2135Proof
2136 REPEAT GEN_TAC THEN REWRITE_TAC[integrable] THEN EQ_TAC THENL
2137 [REWRITE_TAC[Dint] THEN DISCH_THEN(X_CHOOSE_TAC ``i:real``) THEN
2138 X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
2139 FIRST_X_ASSUM(MP_TAC o SPEC ``e / &2``) THEN
2140 ASM_SIMP_TAC arith_ss[REAL_LT_DIV, REAL_LT] THEN
2141 HO_MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC ``g:real->real`` THEN
2142 STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
2143 MAP_EVERY X_GEN_TAC
2144 [``d1:num->real``, ``p1:num->real``,
2145 ``d2:num->real``, ``p2:num->real``] THEN STRIP_TAC THEN
2146 FIRST_X_ASSUM(fn th =>
2147 MP_TAC(SPECL [``d1:num->real``, ``p1:num->real``] th) THEN
2148 MP_TAC(SPECL [``d2:num->real``, ``p2:num->real``] th)) THEN
2149 ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN
2150 ONCE_REWRITE_TAC[REAL_ARITH``abs(a - b) = abs(a - i + -(b - i))``] THEN
2151 MATCH_MP_TAC REAL_LET_TRANS THEN
2152 EXISTS_TAC``abs(rsum(d1,p1) f -i) + abs(-(rsum(d2,p2) f - i))`` THEN
2153 REWRITE_TAC[ABS_TRIANGLE] THEN REWRITE_TAC[ABS_NEG] THEN
2154 GEN_REWRITE_TAC RAND_CONV empty_rewrites [GSYM REAL_HALF_DOUBLE] THEN
2155 MATCH_MP_TAC REAL_LT_ADD2 THEN ASM_REWRITE_TAC[],ALL_TAC] THEN
2156 DISCH_TAC THEN DISJ_CASES_TAC(REAL_ARITH ``b < a \/ a <= b``) THENL
2157 [ASM_MESON_TAC[DINT_WRONG], ALL_TAC] THEN
2158 FIRST_X_ASSUM(MP_TAC o GEN ``n:num`` o SPEC ``&1 / &2 pow n``) THEN
2159 SIMP_TAC arith_ss[REAL_LT_DIV, REAL_POW_LT, REAL_LT] THEN
2160 SIMP_TAC arith_ss[FORALL_AND_THM, SKOLEM_THM] THEN
2161 DISCH_THEN(X_CHOOSE_THEN ``g:num->real->real`` STRIP_ASSUME_TAC) THEN
2162 MP_TAC(GEN ``n:num``
2163 (SPECL [``\x. a <= x /\ x <= b``, ``g:num->real->real``, ``n:num``]
2164 GAUGE_MIN_FINITE)) THEN
2165 ASM_SIMP_TAC arith_ss[SKOLEM_THM, FORALL_AND_THM] THEN
2166 DISCH_THEN(X_CHOOSE_THEN ``G:num->real->real`` STRIP_ASSUME_TAC) THEN
2167 MP_TAC(GEN ``n:num``
2168 (SPECL [``a:real``, ``b:real``,
2169 ``(G:num->real->real) n``] DIVISION_EXISTS)) THEN
2170 ASM_SIMP_TAC bool_ss[SKOLEM_THM,GSYM LEFT_FORALL_IMP_THM,
2171 FORALL_AND_THM] THEN
2172 MAP_EVERY X_GEN_TAC [``d:num->num->real``, ``p:num->num->real``] THEN
2173 STRIP_TAC THEN
2174 SUBGOAL_THEN ``cauchy (\n. rsum(d n,p n) f)`` MP_TAC THENL
2175 [REWRITE_TAC[cauchy] THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
2176 MP_TAC(SPEC ``&1 / e`` REAL_ARCH_POW2) THEN
2177 HO_MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC ``N:num`` THEN
2178 ASM_SIMP_TAC arith_ss[REAL_LT_LDIV_EQ] THEN DISCH_TAC THEN
2179 REWRITE_TAC[GREATER_EQ] THEN
2180 MAP_EVERY X_GEN_TAC [``m:num``,``n:num``] THEN STRIP_TAC THEN
2181 FIRST_X_ASSUM(MP_TAC o SPECL
2182 [``N:num``, ``(d:num->num->real) m``, ``(p:num->num->real) m``,
2183 ``(d:num->num->real) n``, ``(p:num->num->real) n``]) THEN
2184 SUBGOAL_THEN
2185 ``tdiv (a,b) ((d:num->num->real) m,(p:num->num->real) m) /\
2186 fine ((g:num->real->real) N) (d m,p m) /\ tdiv (a,b) (d n,p n) /\
2187 fine (g N) (d n,p n)``ASSUME_TAC THENL
2188 [ASM_MESON_TAC[],ALL_TAC] THEN
2189 ASM_REWRITE_TAC[] THEN
2190 MATCH_MP_TAC(REAL_ARITH ``d < e ==> x < d ==> x < e``) THEN
2191 ASM_SIMP_TAC arith_ss[REAL_LT_LDIV_EQ, REAL_POW_LT, REAL_LT] THEN
2192 ASM_MESON_TAC[REAL_MUL_SYM], ALL_TAC] THEN
2193 REWRITE_TAC[SEQ_CAUCHY, convergent, SEQ, Dint] THEN
2194 HO_MATCH_MP_TAC MONO_EXISTS THEN
2195 X_GEN_TAC ``i:real`` THEN STRIP_TAC THEN
2196 X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
2197 FIRST_X_ASSUM(MP_TAC o SPEC ``e / &2``) THEN
2198 ASM_SIMP_TAC arith_ss[REAL_LT_DIV, REAL_LT] THEN
2199 DISCH_THEN(X_CHOOSE_THEN ``N1:num`` MP_TAC) THEN
2200 X_CHOOSE_TAC ``N2:num`` (SPEC ``&2 / e`` REAL_ARCH_POW2) THEN
2201 DISCH_THEN(MP_TAC o SPEC ``N1 + N2:num``) THEN
2202 REWRITE_TAC[GREATER_EQ, LESS_EQ_ADD] THEN
2203 DISCH_TAC THEN EXISTS_TAC ``(G:num->real->real)(N1 + N2)`` THEN
2204 ASM_REWRITE_TAC[] THEN
2205 MAP_EVERY X_GEN_TAC [``dx:num->real``, ``px:num->real``] THEN
2206 STRIP_TAC THEN
2207 FIRST_X_ASSUM(MP_TAC o SPECL
2208 [``N1 + N2:num``, ``dx:num->real``, ``px:num->real``,
2209 ``(d:num->num->real)(N1 + N2)``, ``(p:num->num->real)(N1 + N2)``]) THEN
2210 SUBGOAL_THEN``tdiv (a,b) (dx,px) /\ fine (g ((N1:num) + N2)) (dx,px) /\
2211 tdiv (a,b) (d (N1 + N2),p (N1 + N2)) /\
2212 fine (g ((N1:num) + N2)) (d (N1 + N2),p (N1 + N2))``ASSUME_TAC THENL
2213 [ASM_MESON_TAC[LESS_EQ_REFL], ALL_TAC] THEN ASM_REWRITE_TAC[] THEN
2214 SUBGOAL_THEN``1 / 2 pow ((N1:num)+ N2) < e / &2``ASSUME_TAC THENL
2215 [MATCH_MP_TAC REAL_LTE_TRANS THEN EXISTS_TAC``inv(&2 / e)`` THEN
2216 CONJ_TAC THENL
2217 [REWRITE_TAC[GSYM REAL_INV_1OVER] THEN MATCH_MP_TAC REAL_LT_INV THEN
2218 ASM_SIMP_TAC arith_ss[REAL_LT_DIV, REAL_LT] THEN
2219 MATCH_MP_TAC REAL_LTE_TRANS THEN EXISTS_TAC ``&2 pow N2`` THEN
2220 ASM_REWRITE_TAC[] THEN REWRITE_TAC[REAL_POW_ADD] THEN
2221 GEN_REWRITE_TAC LAND_CONV empty_rewrites [GSYM REAL_MUL_LID] THEN
2222 MATCH_MP_TAC REAL_LE_RMUL_IMP THEN REWRITE_TAC[POW_2_LE1] THEN
2223 MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC``&1`` THEN
2224 REWRITE_TAC[REAL_LE_01,POW_2_LE1],
2225 MATCH_MP_TAC REAL_EQ_IMP_LE THEN CONV_TAC SYM_CONV THEN
2226 MATCH_MP_TAC REAL_LINV_UNIQ THEN
2227 REWRITE_TAC[REAL_DIV_INNER_CANCEL2] THEN
2228 MATCH_MP_TAC REAL_DIV_REFL THEN MATCH_MP_TAC REAL_POS_NZ THEN
2229 ASM_REWRITE_TAC[]],
2230 DISCH_TAC THEN
2231 SUBGOAL_THEN``
2232 abs (rsum (dx,px) f - rsum ((d :num -> num -> real) (N1 + N2),
2233 p (N1 + N2)) f) < e / &2``ASSUME_TAC THENL
2234 [MATCH_MP_TAC REAL_LT_TRANS THEN
2235 EXISTS_TAC``1 / &2 pow(N1 + N2)`` THEN
2236 ASM_REWRITE_TAC[],ALL_TAC] THEN
2237 MATCH_MP_TAC REAL_LET_TRANS THEN
2238 EXISTS_TAC``abs((rsum(dx,px) f -
2239 rsum((d:num->num->real)(N1 + N2),p(N1 + N2)) f)
2240 + (rsum((d:num->num->real)(N1 + N2),p(N1 + N2)) f - i))`` THEN
2241 CONJ_TAC THENL
2242 [REWRITE_TAC[real_sub, REAL_ADD_ASSOC] THEN
2243 REWRITE_TAC[GSYM real_sub] THEN
2244 SIMP_TAC arith_ss[REAL_SUB_ADD,REAL_LE_REFL],
2245 MATCH_MP_TAC REAL_LET_TRANS THEN
2246 EXISTS_TAC``abs(rsum(dx,px) f -
2247 rsum((d:num->num->real)(N1 + N2),p(N1 + N2)) f)
2248 + abs(rsum((d:num->num->real)(N1 + N2),p(N1 + N2)) f - i)`` THEN
2249 SIMP_TAC arith_ss[REAL_ABS_TRIANGLE] THEN
2250 GEN_REWRITE_TAC RAND_CONV empty_rewrites [GSYM REAL_HALF_DOUBLE] THEN
2251 MATCH_MP_TAC REAL_LT_ADD2 THEN ASM_REWRITE_TAC[]]]
2252QED
2253
2254(* ------------------------------------------------------------------------- *)
2255(* Limit theorem. *)
2256(* ------------------------------------------------------------------------- *)
2257
2258Theorem RSUM_BOUND:
2259 !a b d p e f.
2260 tdiv(a,b) (d,p) /\
2261 (!x. a <= x /\ x <= b ==> abs(f x) <= e)
2262 ==> abs(rsum(d,p) f) <= e * (b - a)
2263Proof
2264 REPEAT STRIP_TAC THEN REWRITE_TAC[rsum] THEN MATCH_MP_TAC REAL_LE_TRANS THEN
2265 EXISTS_TAC (Term`sum(0,dsize d) (\i. abs(f(p i :real) * (d(SUC i) - d i)))`) THEN
2266 SIMP_TAC arith_ss[SUM_ABS_LE] THEN MATCH_MP_TAC REAL_LE_TRANS THEN
2267 EXISTS_TAC (Term`sum(0,dsize d) (\i. e * abs(d(SUC i) - d(i)))`) THEN
2268 CONJ_TAC THENL
2269 [MATCH_MP_TAC SUM_LE THEN REWRITE_TAC[ADD_CLAUSES, REAL_ABS_MUL] THEN
2270 X_GEN_TAC (Term`r:num`) THEN STRIP_TAC THEN BETA_TAC THEN
2271 MATCH_MP_TAC REAL_LE_RMUL1 THEN REWRITE_TAC[REAL_ABS_POS] THEN
2272 FIRST_X_ASSUM MATCH_MP_TAC THEN
2273 ASM_MESON_TAC[tdiv, DIVISION_UBOUND, DIVISION_LBOUND, REAL_LE_TRANS],
2274 ALL_TAC] THEN
2275 SIMP_TAC arith_ss[SUM_CMUL] THEN MATCH_MP_TAC REAL_LE_LMUL1 THEN
2276 CONJ_TAC THENL
2277 [FIRST_X_ASSUM(MP_TAC o SPEC (Term`a:real`)) THEN
2278 ASM_MESON_TAC[REAL_LE_REFL, REAL_ABS_POS, REAL_LE_TRANS, DIVISION_LE,
2279 tdiv], ALL_TAC] THEN
2280 FIRST_X_ASSUM(CONJUNCTS_THEN ASSUME_TAC o REWRITE_RULE[tdiv]) THEN
2281 FIRST_ASSUM(ASSUME_TAC o MATCH_MP DIVISION_LE_SUC) THEN
2282 ASM_REWRITE_TAC[abs, REAL_SUB_LE, SUM_DIFFS, ADD_CLAUSES] THEN
2283 PROVE_TAC[DIVISION_RHS, DIVISION_LHS, REAL_LE_REFL]
2284QED
2285
2286Theorem RSUM_DIFF_BOUND:
2287 !a b d p e f g.
2288 tdiv(a,b) (d,p) /\
2289 (!x. a <= x /\ x <= b ==> abs(f x - g x) <= e)
2290 ==> abs(rsum (d,p) f - rsum (d,p) g) <= e * (b - a)
2291Proof
2292 REPEAT GEN_TAC THEN DISCH_THEN(MP_TAC o HO_MATCH_MP RSUM_BOUND) THEN
2293 SIMP_TAC bool_ss[rsum, SUM_SUB, REAL_SUB_RDISTRIB]
2294QED
2295
2296Theorem INTEGRABLE_LIMIT:
2297 !f a b. (!e. &0 < e
2298 ==> ?g. (!x. a <= x /\ x <= b ==> abs(f x - g x) <= e) /\
2299 integrable(a,b) g)
2300 ==> integrable(a,b) f
2301Proof
2302 REPEAT STRIP_TAC THEN ASM_CASES_TAC ``a <= b`` THENL
2303 [FIRST_X_ASSUM(MP_TAC o GEN ``n:num`` o SPEC ``&1 / &2 pow n``) THEN
2304 SIMP_TAC arith_ss[REAL_LT_DIV, REAL_POW_LT, REAL_LT] THEN
2305 SIMP_TAC arith_ss[FORALL_AND_THM, SKOLEM_THM, integrable] THEN
2306 DISCH_THEN(X_CHOOSE_THEN ``g:num->real->real`` (CONJUNCTS_THEN2
2307 ASSUME_TAC (X_CHOOSE_TAC ``i:num->real``))) THEN
2308 SUBGOAL_THEN ``cauchy i`` MP_TAC THENL
2309 [REWRITE_TAC[cauchy] THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
2310 MP_TAC(SPEC ``(&2 * &2 * (b - a)) / e`` REAL_ARCH_POW2) THEN
2311 HO_MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC ``N:num`` THEN DISCH_TAC THEN
2312 MAP_EVERY X_GEN_TAC [``m:num``, ``n:num``] THEN REWRITE_TAC[GREATER_EQ] THEN
2313 STRIP_TAC THEN UNDISCH_TAC``!(n:num). Dint(a,b) (g n) (i n)`` THEN
2314 REWRITE_TAC[Dint] THEN SIMP_TAC bool_ss[Once SWAP_FORALL_THM] THEN
2315 DISCH_THEN(MP_TAC o SPEC ``e / &2 / &2``) THEN
2316 ASM_SIMP_TAC arith_ss[REAL_LT_DIV, REAL_LT] THEN
2317 DISCH_THEN(fn th => MP_TAC(SPEC ``m:num`` th) THEN
2318 MP_TAC(SPEC ``n:num`` th)) THEN
2319 DISCH_THEN(X_CHOOSE_THEN ``gn:real->real`` STRIP_ASSUME_TAC) THEN
2320 DISCH_THEN(X_CHOOSE_THEN ``gm:real->real`` STRIP_ASSUME_TAC) THEN
2321 MP_TAC(SPECL [``a:real``, ``b:real``,
2322 ``\x:real. if gm x < gn x then gm x else gn x``]
2323 DIVISION_EXISTS) THEN
2324 ASM_SIMP_TAC arith_ss[GAUGE_MIN, GSYM LEFT_FORALL_IMP_THM] THEN
2325 MAP_EVERY X_GEN_TAC [``d:num->real``, ``p:num->real``] THEN
2326 STRIP_TAC THEN
2327 FIRST_X_ASSUM(CONJUNCTS_THEN ASSUME_TAC o MATCH_MP FINE_MIN) THEN
2328 REPEAT(FIRST_X_ASSUM(MP_TAC o SPECL [``d:num->real``,
2329 ``p:num->real``])) THEN
2330 ASM_REWRITE_TAC[] THEN
2331 SUBGOAL_THEN ``abs(rsum(d,p) (g(m:num)) - rsum(d,p) (g n)) <= e / &2``
2332 (fn th => MP_TAC th) THENL
2333 [MATCH_MP_TAC REAL_LE_TRANS THEN
2334 EXISTS_TAC ``&2 / &2 pow N * (b - a)`` THEN
2335 CONJ_TAC THENL
2336 [MATCH_MP_TAC RSUM_DIFF_BOUND THEN ASM_REWRITE_TAC[] THEN
2337 REPEAT STRIP_TAC THEN REWRITE_TAC[real_div] THEN
2338 HO_MATCH_MP_TAC(REAL_ARITH
2339 ``!f. abs(f - gm) <= inv(k) /\ abs(f - gn) <= inv(k)
2340 ==> (abs(gm - gn) <= &2*inv(k))``) THEN
2341 EXISTS_TAC ``(f:real->real) x`` THEN CONJ_TAC THEN
2342 MATCH_MP_TAC REAL_LE_TRANS THENL
2343 [EXISTS_TAC ``&1 / &2 pow m``,EXISTS_TAC``&1 / &2 pow n``] THEN
2344 ASM_SIMP_TAC arith_ss[] THEN REWRITE_TAC[real_div, REAL_MUL_LID] THEN
2345 MATCH_MP_TAC REAL_LE_INV2 THEN
2346 ASM_SIMP_TAC arith_ss[REAL_POW_LT, REAL_POW_MONO, REAL_LE,REAL_LT],
2347 MATCH_MP_TAC REAL_LE_RDIV THEN CONJ_TAC THENL
2348 [REAL_ARITH_TAC, GEN_REWRITE_TAC LAND_CONV empty_rewrites [REAL_MUL_SYM] THEN
2349 ONCE_REWRITE_TAC[REAL_MUL_ASSOC] THEN REWRITE_TAC [real_div] THEN
2350 REWRITE_TAC [REAL_MUL_ASSOC] THEN
2351 ONCE_REWRITE_TAC [GSYM REAL_MUL_ASSOC] THEN
2352 GEN_REWRITE_TAC (LAND_CONV o RAND_CONV) empty_rewrites [REAL_MUL_SYM] THEN
2353 REWRITE_TAC [REAL_MUL_ASSOC] THEN REWRITE_TAC [GSYM real_div] THEN
2354 ASM_SIMP_TAC arith_ss[REAL_LE_LDIV_EQ, REAL_POW_LT, REAL_LT] THEN
2355 GEN_REWRITE_TAC RAND_CONV empty_rewrites [REAL_MUL_SYM] THEN
2356 ASM_SIMP_TAC arith_ss[GSYM REAL_LE_LDIV_EQ, REAL_LT_IMP_LE]]],
2357 REPEAT STRIP_TAC THEN
2358 SUBGOAL_THEN ``abs(rsum(d,p) (g(m:num)) - rsum(d,p) (g n) -
2359 (i m - i n)) < e / &2``(fn th => MP_TAC th) THENL
2360 [SUBGOAL_THEN“!a b c d. a-b-(c-d) = a-c - (b-d)”
2361 (fn th => ONCE_REWRITE_TAC[GEN_ALL th]) THENL
2362 [REAL_ARITH_TAC, ALL_TAC] THEN
2363 MATCH_MP_TAC REAL_LET_TRANS THEN
2364 EXISTS_TAC``abs(rsum(d,p)(g (m:num)) - i m)
2365 + abs(rsum(d,p) (g n) - i n)`` THEN CONJ_TAC THENL
2366 [GEN_REWRITE_TAC (LAND_CONV o RAND_CONV) empty_rewrites [real_sub] THEN
2367 GEN_REWRITE_TAC (funpow 2 RAND_CONV) empty_rewrites [GSYM ABS_NEG] THEN
2368 MATCH_ACCEPT_TAC ABS_TRIANGLE,
2369 GEN_REWRITE_TAC RAND_CONV empty_rewrites [GSYM REAL_HALF_DOUBLE] THEN
2370 MATCH_MP_TAC REAL_LT_ADD2 THEN ASM_REWRITE_TAC[]],
2371 DISCH_TAC THEN
2372 ABBREV_TAC``s = rsum(d,p)(g (m:num)) - rsum(d,p) (g n)`` THEN
2373 ABBREV_TAC``t= s- (i (m:num) - i n)`` THEN POP_ASSUM MP_TAC THEN
2374 GEN_REWRITE_TAC (LAND_CONV o LAND_CONV) empty_rewrites [real_sub] THEN
2375 ONCE_REWRITE_TAC [GSYM REAL_ADD_SYM] THEN
2376 ONCE_REWRITE_TAC [GSYM REAL_EQ_SUB_LADD] THEN
2377 ONCE_REWRITE_TAC [REAL_NEG_EQ] THEN ONCE_REWRITE_TAC [REAL_NEG_SUB] THEN
2378 DISCH_TAC THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[real_sub] THEN
2379 MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC``abs s + abs (-t)`` THEN
2380 REWRITE_TAC[ABS_TRIANGLE] THEN
2381 GEN_REWRITE_TAC RAND_CONV empty_rewrites [GSYM REAL_HALF_DOUBLE] THEN
2382 MATCH_MP_TAC REAL_LET_ADD2 THEN PROVE_TAC[ABS_NEG]]],
2383 REWRITE_TAC[SEQ_CAUCHY, convergent] THEN
2384 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC ``s:real`` THEN DISCH_TAC THEN
2385 REWRITE_TAC[Dint] THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
2386 FIRST_X_ASSUM(MP_TAC o SPEC ``e / &3`` o REWRITE_RULE[SEQ]) THEN
2387 ASM_SIMP_TAC arith_ss[REAL_LT_DIV, REAL_LT, GREATER_EQ] THEN
2388 DISCH_THEN(X_CHOOSE_TAC ``N1:num``) THEN
2389 MP_TAC(SPEC ``(&3 * (b - a)) / e`` REAL_ARCH_POW2) THEN
2390 DISCH_THEN(X_CHOOSE_TAC ``N2:num``) THEN
2391 UNDISCH_TAC``!(n:num). Dint(a,b) (g (n:num)) ( i n)`` THEN
2392 REWRITE_TAC[Dint] THEN
2393 DISCH_THEN(MP_TAC o SPECL [``N1 + N2:num``, ``e / &3``]) THEN
2394 ASM_SIMP_TAC arith_ss[REAL_LT_DIV, REAL_LT] THEN
2395 HO_MATCH_MP_TAC MONO_EXISTS THEN
2396 X_GEN_TAC ``g:real->real`` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
2397 MAP_EVERY X_GEN_TAC [``d:num->real``, ``p:num->real``] THEN STRIP_TAC THEN
2398 FIRST_X_ASSUM(MP_TAC o SPECL [``d:num->real``, ``p:num->real``]) THEN
2399 ASM_REWRITE_TAC[] THEN SUBGOAL_THEN``N1:num <= N1 + N2``MP_TAC THENL
2400 [REWRITE_TAC[LESS_EQ_ADD], ALL_TAC] THEN DISCH_TAC THEN
2401 SUBGOAL_THEN``abs(i ((N1:num) + N2) - s) < e/3``MP_TAC THENL
2402 [ASM_MESON_TAC[], ALL_TAC] THEN REPEAT DISCH_TAC THEN
2403 SUBGOAL_THEN``abs(rsum(d,p) f - rsum(d,p)
2404 (g ((N1:num) + N2))) <= e/ &3``MP_TAC THENL
2405 [MATCH_MP_TAC REAL_LE_TRANS THEN
2406 EXISTS_TAC ``&1 / &2 pow (N1 + N2) * (b - a)`` THEN CONJ_TAC THENL
2407 [MATCH_MP_TAC RSUM_DIFF_BOUND THEN ASM_REWRITE_TAC[],
2408 MATCH_MP_TAC REAL_LE_RDIV THEN CONJ_TAC THENL
2409 [REAL_ARITH_TAC,
2410 GEN_REWRITE_TAC LAND_CONV empty_rewrites [REAL_MUL_SYM] THEN
2411 ONCE_REWRITE_TAC[REAL_MUL_ASSOC] THEN REWRITE_TAC [real_div] THEN
2412 REWRITE_TAC [REAL_MUL_ASSOC] THEN
2413 ONCE_REWRITE_TAC [GSYM REAL_MUL_ASSOC] THEN
2414 GEN_REWRITE_TAC (LAND_CONV o RAND_CONV) empty_rewrites [REAL_MUL_SYM] THEN
2415 REWRITE_TAC [REAL_MUL_ASSOC] THEN REWRITE_TAC [GSYM real_div] THEN
2416 ASM_SIMP_TAC arith_ss[REAL_LE_LDIV_EQ, REAL_POW_LT, REAL_LT] THEN
2417 GEN_REWRITE_TAC RAND_CONV empty_rewrites [REAL_MUL_SYM] THEN
2418 REWRITE_TAC[REAL_MUL_RID] THEN
2419 ASM_SIMP_TAC arith_ss[GSYM REAL_LE_LDIV_EQ, REAL_LT_IMP_LE] THEN
2420 SUBGOAL_THEN``N2:num <= N1 + N2``MP_TAC THENL
2421 [ONCE_REWRITE_TAC[ADD_COMM] THEN REWRITE_TAC[LESS_EQ_ADD],
2422 DISCH_TAC THEN MATCH_MP_TAC REAL_LT_IMP_LE THEN
2423 MATCH_MP_TAC REAL_LTE_TRANS THEN EXISTS_TAC``2 pow N2`` THEN
2424 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_POW_MONO THEN
2425 ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]]],
2426 DISCH_TAC THEN ABBREV_TAC``sf = rsum(d,p) f`` THEN
2427 ABBREV_TAC``sg = rsum(d,p) (g ((N1:num) + N2))`` THEN
2428 SUBGOAL_THEN``abs(sf - i((N1:num) + N2)) < 2*e/3``MP_TAC THENL
2429 [MATCH_MP_TAC REAL_LET_TRANS THEN
2430 EXISTS_TAC``abs(sf - sg) + abs(sg - i((N1:num)+ N2))`` THEN
2431 CONJ_TAC THENL
2432 [MATCH_MP_TAC REAL_LE_TRANS THEN
2433 EXISTS_TAC``abs((sf - sg) + (sg - i((N1:num) + N2)))`` THEN
2434 REWRITE_TAC[ABS_TRIANGLE] THEN REAL_ARITH_TAC,
2435 REWRITE_TAC[real_div, GSYM REAL_MUL_ASSOC] THEN
2436 REWRITE_TAC[GSYM REAL_DOUBLE, GSYM real_div] THEN
2437 PROVE_TAC[REAL_LET_ADD2]],
2438 ONCE_REWRITE_TAC [GSYM REAL_NEG_THIRD] THEN DISCH_TAC THEN
2439 MATCH_MP_TAC REAL_LET_TRANS THEN
2440 EXISTS_TAC``abs((sf - i((N1:num) + N2)) + (i((N1:num) + N2) - s))`` THEN
2441 CONJ_TAC THENL
2442 [REAL_ARITH_TAC, MATCH_MP_TAC REAL_LET_TRANS THEN
2443 EXISTS_TAC``abs((sf - i((N1:num) + N2))) +
2444 abs((i((N1:num) + N2) - s))`` THEN REWRITE_TAC[ABS_TRIANGLE] THEN
2445 MATCH_MP_TAC REAL_LTE_TRANS THEN EXISTS_TAC``(e - e / 3) + e/3`` THEN
2446 CONJ_TAC THENL [PROVE_TAC[REAL_LT_ADD2],REAL_ARITH_TAC]]]]],
2447 ASM_MESON_TAC[REAL_NOT_LE, DINT_WRONG, integrable]]
2448QED
2449
2450(* ------------------------------------------------------------------------- *)
2451(* Hence continuous functions are integrable. *)
2452(* ------------------------------------------------------------------------- *)
2453
2454Theorem INTEGRABLE_CONST:
2455 !a b c. integrable(a,b) (\x. c)
2456Proof
2457 REWRITE_TAC[integrable] THEN REPEAT GEN_TAC THEN
2458 EXISTS_TAC(Term`c*(b-a):real`) THEN SIMP_TAC arith_ss[DINT_CONST]
2459QED
2460
2461Theorem INTEGRABLE_ADD:
2462 !f g a b. a<=b /\ integrable(a,b) f /\ integrable(a,b) g ==>
2463 integrable(a,b)(\x. f x + g x)
2464Proof
2465 RW_TAC std_ss[] THEN REWRITE_TAC[integrable] THEN
2466 EXISTS_TAC``integral(a,b) f + integral(a,b) g`` THEN
2467 MATCH_MP_TAC DINT_ADD THEN CONJ_TAC THEN
2468 MATCH_MP_TAC INTEGRABLE_DINT THEN ASM_REWRITE_TAC[]
2469QED
2470
2471Theorem INTEGRABLE_CMUL:
2472 !f a b c. a<=b /\ integrable(a,b) f ==> integrable(a,b)(\x. c* f x)
2473Proof
2474 RW_TAC std_ss[] THEN REWRITE_TAC[integrable] THEN
2475 EXISTS_TAC``c*integral(a,b)f`` THEN HO_MATCH_MP_TAC DINT_CMUL THEN
2476 MATCH_MP_TAC INTEGRABLE_DINT THEN ASM_REWRITE_TAC[]
2477QED
2478
2479Theorem INTEGRABLE_COMBINE:
2480 !f a b c. a <= b /\ b <= c /\ integrable(a,b) f /\ integrable(b,c) f
2481 ==> integrable(a,c) f
2482Proof
2483 REWRITE_TAC[integrable] THEN MESON_TAC[DINT_COMBINE]
2484QED
2485
2486Theorem INTEGRABLE_POINT_SPIKE:
2487 !f g a b c.
2488 (!x. a <= x /\ x <= b /\ ~(x = c) ==> (f x = g x)) /\ integrable(a,b) f
2489 ==> integrable(a,b) g
2490Proof
2491 REWRITE_TAC[integrable] THEN MESON_TAC[DINT_POINT_SPIKE]
2492QED
2493
2494Theorem SUP_INTERVAL:
2495 !P a b.
2496 (?x. a <= x /\ x <= b /\ P x)
2497 ==> ?s. a <= s /\ s <= b /\
2498 !y. y < s <=> (?x. a <= x /\ x <= b /\ P x /\ y < x)
2499Proof
2500 REPEAT STRIP_TAC THEN
2501 MP_TAC(SPEC ``\x. a <= x /\ x <= b /\ P x`` REAL_SUP) THEN
2502 SUBGOAL_THEN``(?x. (\x. a <= x /\ x <= b /\ P x) x) /\
2503 (?z. !x. (\x. a <= x /\ x <= b /\ P x) x ==> x < z)``MP_TAC THENL
2504 [CONJ_TAC THENL
2505 [BETA_TAC THEN EXISTS_TAC``x:real`` THEN ASM_REWRITE_TAC[],
2506 BETA_TAC THEN EXISTS_TAC``(b+1:real)`` THEN REPEAT STRIP_TAC THEN
2507 ASM_SIMP_TAC arith_ss[REAL_LT_ADD1]],
2508 DISCH_TAC THEN ASM_REWRITE_TAC[] THEN
2509 ABBREV_TAC ``s = sup (\x. a <= x /\ x <= b /\ P x)`` THEN
2510 DISCH_TAC THEN EXISTS_TAC ``s:real`` THEN
2511 ASM_MESON_TAC[REAL_LTE_TRANS, REAL_NOT_LE, REAL_LT_ANTISYM]]
2512QED
2513
2514Theorem CONT_UNIFORM:
2515 !f a b. a <= b /\ (!x. a <= x /\ x <= b ==> f contl x)
2516 ==> !e. &0 < e ==> ?d. &0 < d /\
2517 !x y. a <= x /\ x <= b /\
2518 a <= y /\ y <= b /\
2519 abs(x - y) < d
2520 ==> abs(f(x) - f(y)) < e
2521Proof
2522 REPEAT STRIP_TAC THEN
2523 MP_TAC(SPEC ``\c. ?d. &0 < d /\
2524 !x y. a <= x /\ x <= c /\
2525 a <= y /\ y <= c /\
2526 abs(x - y) < d
2527 ==> abs(f(x) - f(y)) < e``
2528 SUP_INTERVAL) THEN
2529 DISCH_THEN(MP_TAC o SPECL [``a:real``, ``b:real``]) THEN
2530 SUBGOAL_THEN``?x.
2531 a <= x /\ x <= b /\
2532 (\c.
2533 ?d.
2534 0 < d /\
2535 !x y.
2536 a <= x /\ x <= c /\ a <= y /\ y <= c /\ abs (x - y) < d ==>
2537 abs (f x - f y) < e) x``ASSUME_TAC THENL
2538 [EXISTS_TAC ``a:real`` THEN ASM_REWRITE_TAC[REAL_LE_REFL] THEN
2539 BETA_TAC THEN EXISTS_TAC ``&1`` THEN SIMP_TAC arith_ss[REAL_LT] THEN
2540 ASM_MESON_TAC[REAL_LE_ANTISYM, REAL_ARITH ``abs(x - x) = &0``],
2541 ALL_TAC] THEN
2542 ASM_SIMP_TAC arith_ss[] THEN
2543 DISCH_THEN(X_CHOOSE_THEN ``s:real`` STRIP_ASSUME_TAC) THEN
2544 SUBGOAL_THEN ``?t. s < t /\ ?d. &0 < d /\
2545 !x y. a <= x /\ x <= t /\ a <= y /\ y <= t /\
2546 abs(x - y) < d ==> abs(f(x) - f(y)) < e``
2547 MP_TAC THENL
2548 [UNDISCH_TAC ``!x. a <= x /\ x <= b ==> f contl x`` THEN
2549 DISCH_THEN(MP_TAC o SPEC ``s:real``) THEN ASM_REWRITE_TAC[] THEN
2550 REWRITE_TAC[CONTL_LIM, LIM] THEN DISCH_THEN(MP_TAC o SPEC ``e / &2``) THEN
2551 ASM_SIMP_TAC arith_ss[REAL_LT_DIV, REAL_LT] THEN
2552 DISCH_THEN(X_CHOOSE_THEN ``d1:real`` STRIP_ASSUME_TAC) THEN
2553 SUBGOAL_THEN ``&0 < d1 / &2 /\ d1 / &2 < d1`` STRIP_ASSUME_TAC THENL
2554 [ASM_SIMP_TAC arith_ss[REAL_LT_DIV, REAL_LT, REAL_LT_LDIV_EQ,
2555 REAL_ARITH ``(d < d * &2) <=> (&0 < d)``], ALL_TAC] THEN
2556 SUBGOAL_THEN ``!x y. abs(x - s) < d1 /\ abs(y - s) < d1
2557 ==> abs(f(x) - f(y)) < e`` ASSUME_TAC THENL
2558 [REPEAT STRIP_TAC THEN
2559 GEN_REWRITE_TAC RAND_CONV empty_rewrites [GSYM REAL_HALF_DOUBLE] THEN
2560 HO_MATCH_MP_TAC(REAL_ARITH
2561 ``!a. abs(x - a) < e / &2 /\ abs(y - a) < e / &2
2562 ==> abs(x - y) < e / &2 + e / &2``) THEN
2563 EXISTS_TAC ``(f:real->real) s`` THEN
2564 SUBGOAL_THEN ``!x. abs(x - s) < d1 ==> abs(f x - f s) < e / &2``
2565 (fn th => ASM_MESON_TAC[th]) THEN
2566 X_GEN_TAC ``u:real`` THEN REPEAT STRIP_TAC THEN
2567 ASM_CASES_TAC ``u:real = s`` THENL
2568 [ASM_SIMP_TAC arith_ss[REAL_SUB_REFL, ABS_N, REAL_LT_DIV, REAL_LT],
2569 ALL_TAC] THEN
2570 ASM_MESON_TAC[REAL_ARITH ``&0 < abs(x - s) <=> ~(x = s)``],
2571 ALL_TAC] THEN
2572 SUBGOAL_THEN ``s - d1 / &2 < s`` MP_TAC THENL
2573 [ASM_REWRITE_TAC[REAL_ARITH ``x - y < x <=> &0 < y``],ALL_TAC] THEN
2574 DISCH_THEN(fn th => FIRST_ASSUM(fn th' =>
2575 MP_TAC(GEN_REWRITE_RULE I empty_rewrites [th'] th))) THEN
2576 DISCH_THEN(X_CHOOSE_THEN ``r:real`` MP_TAC) THEN
2577 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
2578 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
2579 DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
2580 DISCH_THEN(X_CHOOSE_THEN ``d2:real`` STRIP_ASSUME_TAC) THEN
2581 MP_TAC(SPECL [``d2:real``, ``d1 / &2``] REAL_DOWN2) THEN
2582 ASM_REWRITE_TAC[] THEN
2583 DISCH_THEN(X_CHOOSE_THEN ``d:real`` STRIP_ASSUME_TAC) THEN
2584 EXISTS_TAC ``s + d / &2`` THEN
2585 ASM_SIMP_TAC arith_ss[REAL_LT_DIV, REAL_LT,
2586 REAL_ARITH ``s < s + d <=> &0 < d``] THEN
2587 EXISTS_TAC ``d:real`` THEN ASM_REWRITE_TAC[] THEN
2588 MAP_EVERY X_GEN_TAC[``x:real``, ``y:real``] THEN STRIP_TAC THEN
2589 ASM_CASES_TAC ``x <= r /\ y <= r`` THENL
2590 [ASM_MESON_TAC[REAL_LT_TRANS], ALL_TAC] THEN
2591 MATCH_MP_TAC(ASSUME ``!x y. abs(x - s) < d1 /\ abs(y - s) < d1 ==>
2592 abs(f x - f y) < e``) THEN
2593 MATCH_MP_TAC(REAL_ARITH
2594 ``!r t d d12.
2595 ~(x <= r /\ y <= r) /\
2596 abs(x - y) < d /\
2597 s - d12 < r /\ t <= s + d /\
2598 x <= t /\ y <= t /\ &2 * d12 <= e /\
2599 &2 * d < e ==> abs(x - s) < e /\ abs(y - s) < e``) THEN
2600 MAP_EVERY EXISTS_TAC[``r:real``,``s + d / &2``,``d:real``,``d1 / &2``] THEN
2601 ASM_REWRITE_TAC[REAL_LE_LADD] THEN
2602 SIMP_TAC arith_ss[REAL_DIV_LMUL, REAL_OF_NUM_EQ] THEN
2603 ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
2604 SIMP_TAC arith_ss[REAL_LE_LDIV_EQ, GSYM REAL_LT_RDIV_EQ, REAL_LT] THEN
2605 ASM_SIMP_TAC arith_ss[REAL_ARITH ``&0 < d ==> d <= d * &2``, REAL_LE_REFL],
2606 ALL_TAC] THEN
2607 DISCH_THEN(X_CHOOSE_THEN ``t:real`` (CONJUNCTS_THEN ASSUME_TAC)) THEN
2608 SUBGOAL_THEN ``b <= t`` (fn th => ASM_MESON_TAC[REAL_LE_TRANS, th]) THEN
2609 FIRST_X_ASSUM(X_CHOOSE_THEN ``d:real`` STRIP_ASSUME_TAC) THEN
2610 UNDISCH_THEN ``!x. a <= x /\ x <= b ==> f contl x`` (K ALL_TAC) THEN
2611 FIRST_X_ASSUM(MP_TAC o assert(is_eq o concl) o SPEC ``s:real``) THEN
2612 REWRITE_TAC[REAL_LT_REFL] THEN CONV_TAC CONTRAPOS_CONV THEN
2613 REWRITE_TAC[REAL_NOT_LE] THEN DISCH_TAC THEN EXISTS_TAC ``t:real`` THEN
2614 ASM_MESON_TAC[REAL_LT_IMP_LE, REAL_LE_TRANS]
2615QED
2616
2617Theorem INTEGRABLE_CONTINUOUS:
2618 !f a b. (!x. a <= x /\ x <= b ==> f contl x) ==> integrable(a,b) f
2619Proof
2620 REPEAT STRIP_TAC THEN DISJ_CASES_TAC(REAL_ARITH ``b < a \/ a <= b``) THENL
2621 [ASM_MESON_TAC[integrable, DINT_WRONG], ALL_TAC] THEN
2622 MATCH_MP_TAC INTEGRABLE_LIMIT THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
2623 MP_TAC(SPECL[``f:real->real``, ``a:real``, ``b:real``] CONT_UNIFORM) THEN
2624 ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC ``e:real``) THEN
2625 ASM_REWRITE_TAC[] THEN
2626 DISCH_THEN(X_CHOOSE_THEN ``d:real`` (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
2627 UNDISCH_TAC ``a <= b`` THEN MAP_EVERY (fn t => SPEC_TAC(t,t))
2628 [``b:real``, ``a:real``] THEN
2629 HO_MATCH_MP_TAC BOLZANO_LEMMA_ALT THEN CONJ_TAC THENL
2630 [MAP_EVERY X_GEN_TAC [``u:real``, ``v:real``, ``w:real``] THEN
2631 NTAC 2 (DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
2632 DISCH_THEN(fn th => DISCH_TAC THEN MP_TAC th) THEN
2633 MATCH_MP_TAC(TAUT_CONV
2634 ``(a /\ b) /\ (c /\ d ==> e) ==> (a ==> c) /\ (b ==> d) ==> e``) THEN
2635 CONJ_TAC THENL [ASM_MESON_TAC[REAL_LE_TRANS], ALL_TAC] THEN
2636 DISCH_THEN(CONJUNCTS_THEN2 (X_CHOOSE_TAC ``g:real->real``)
2637 (X_CHOOSE_TAC ``h:real->real``)) THEN
2638 EXISTS_TAC ``\x. if x <= v then g(x):real else h(x)`` THEN
2639 CONJ_TAC THENL
2640 [GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN COND_CASES_TAC THENL
2641 [ASM_MESON_TAC[REAL_LE_TOTAL],ASM_MESON_TAC[REAL_LE_TOTAL]],ALL_TAC] THEN
2642 MATCH_MP_TAC INTEGRABLE_COMBINE THEN EXISTS_TAC ``v:real`` THEN
2643 ASM_REWRITE_TAC[] THEN CONJ_TAC THEN
2644 MATCH_MP_TAC INTEGRABLE_POINT_SPIKE THENL
2645 [EXISTS_TAC ``g:real->real``, EXISTS_TAC ``h:real->real``] THEN
2646 EXISTS_TAC ``v:real`` THEN ASM_REWRITE_TAC[] THEN SIMP_TAC arith_ss[] THEN
2647 GEN_TAC THEN DISCH_TAC THEN SUBGOAL_THEN``~(x<=v)``ASSUME_TAC THENL
2648 [ASM_MESON_TAC[REAL_ARITH ``b <= x /\ x <= c /\ ~(x = b) ==> ~(x <= b)``],
2649 RW_TAC std_ss[]], ALL_TAC] THEN
2650 X_GEN_TAC ``x:real`` THEN EXISTS_TAC ``d:real`` THEN ASM_REWRITE_TAC[] THEN
2651 MAP_EVERY X_GEN_TAC [``u:real``, ``v:real``] THEN REPEAT STRIP_TAC THEN
2652 EXISTS_TAC ``\x:real. (f:real->real) u`` THEN
2653 ASM_REWRITE_TAC[INTEGRABLE_CONST] THEN
2654 REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LT_IMP_LE THEN
2655 FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_SIMP_TAC std_ss[REAL_LE_REFL] THEN
2656 CONJ_TAC THENL
2657 [MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC``x:real`` THEN
2658 ASM_REWRITE_TAC[],
2659 MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC``(x'-u):real`` THEN
2660 CONJ_TAC THENL
2661 [MATCH_MP_TAC REAL_EQ_IMP_LE THEN ONCE_REWRITE_TAC[ABS_REFL] THEN
2662 ASM_SIMP_TAC arith_ss[REAL_SUB_LE],
2663 MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC``(v-u):real`` THEN
2664 ASM_REWRITE_TAC[REAL_LE_SUB_CANCEL2]]]
2665QED
2666
2667(* ------------------------------------------------------------------------- *)
2668(* Integrability on a subinterval. *)
2669(* ------------------------------------------------------------------------- *)
2670
2671Theorem INTEGRABLE_SPLIT_SIDES:
2672 !f a b c.
2673 a <= c /\ c <= b /\ integrable(a,b) f
2674 ==> ?i. !e. &0 < e
2675 ==> ?g. gauge(\x. a <= x /\ x <= b) g /\
2676 !d1 p1 d2 p2. tdiv(a,c) (d1,p1) /\
2677 fine g (d1,p1) /\
2678 tdiv(c,b) (d2,p2) /\
2679 fine g (d2,p2)
2680 ==> abs((rsum(d1,p1) f +
2681 rsum(d2,p2) f) - i) < e
2682Proof
2683 REPEAT GEN_TAC THEN REWRITE_TAC[integrable, Dint] THEN
2684 REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
2685 HO_MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC ``i:real`` THEN
2686 HO_MATCH_MP_TAC MONO_ALL THEN X_GEN_TAC ``e:real`` THEN
2687 ASM_CASES_TAC ``&0 < e`` THEN ASM_REWRITE_TAC[] THEN
2688 HO_MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC ``g:real->real`` THEN
2689 ASM_MESON_TAC[DIVISION_APPEND_STRONG] THEN ASM_REWRITE_TAC[]
2690QED
2691
2692Theorem INTEGRABLE_SUBINTERVAL_LEFT:
2693 !f a b c. a <= c /\ c <= b /\ integrable(a,b) f ==> integrable(a,c) f
2694Proof
2695 REPEAT GEN_TAC THEN DISCH_TAC THEN
2696 FIRST_ASSUM(X_CHOOSE_TAC ``i:real`` o MATCH_MP INTEGRABLE_SPLIT_SIDES) THEN
2697 REWRITE_TAC[INTEGRABLE_CAUCHY] THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
2698 FIRST_X_ASSUM(MP_TAC o SPEC ``e / &2``) THEN
2699 SIMP_TAC arith_ss[ASSUME ``&0 < e``, REAL_LT_DIV, REAL_LT] THEN
2700 HO_MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC ``g:real->real`` THEN STRIP_TAC THEN
2701 CONJ_TAC THENL
2702 [UNDISCH_TAC ``gauge (\x. a <= x /\ x <= b) g`` THEN
2703 REWRITE_TAC[gauge] THEN ASM_MESON_TAC[REAL_LE_TRANS],ALL_TAC] THEN
2704 REPEAT STRIP_TAC THEN
2705 MP_TAC(SPECL [``c:real``, ``b:real``, ``g:real->real``]
2706 DIVISION_EXISTS) THEN
2707 SUBGOAL_THEN``c <= b /\ gauge (\x. c <= x /\ x <= b) g``ASSUME_TAC THENL
2708 [ASM_REWRITE_TAC[] THEN
2709 UNDISCH_TAC ``gauge (\x. a <= x /\ x <= b) g`` THEN
2710 REWRITE_TAC[gauge] THEN ASM_MESON_TAC[REAL_LE_TRANS],ALL_TAC] THEN
2711 ASM_REWRITE_TAC[] THEN SIMP_TAC arith_ss[GSYM LEFT_FORALL_IMP_THM] THEN
2712 MAP_EVERY X_GEN_TAC [``d:num->real``, ``p:num->real``] THEN STRIP_TAC THEN
2713 FIRST_X_ASSUM(fn th =>
2714 MP_TAC(SPECL [``d1:num->real``, ``p1:num->real``] th) THEN
2715 MP_TAC(SPECL [``d2:num->real``, ``p2:num->real``] th)) THEN
2716 SIMP_TAC arith_ss[AND_IMP_INTRO, GSYM FORALL_AND_THM] THEN
2717 DISCH_THEN(MP_TAC o SPECL [``d:num->real``, ``p:num->real``]) THEN
2718 ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
2719 MATCH_MP_TAC REAL_LET_TRANS THEN
2720 EXISTS_TAC``abs ((rsum (d1,p1) f + rsum (d,p) f - i) -
2721 (rsum (d2,p2) f + rsum (d,p) f - i))`` THEN
2722 CONJ_TAC THENL
2723 [MATCH_MP_TAC REAL_EQ_IMP_LE THEN
2724 REWRITE_TAC[REAL_ARITH``a + b - i -(c + b - i) = a - c``],
2725 MATCH_MP_TAC REAL_LET_TRANS THEN
2726 EXISTS_TAC``abs (rsum (d1,p1) f + rsum (d,p) f - i) +
2727 abs(rsum (d2,p2) f + rsum (d,p) f - i)`` THEN
2728 CONJ_TAC THENL
2729 [REWRITE_TAC[REAL_ARITH``abs(a - b) <= abs a + abs b``],
2730 GEN_REWRITE_TAC RAND_CONV empty_rewrites [GSYM REAL_HALF_DOUBLE] THEN
2731 MATCH_MP_TAC REAL_LT_ADD2 THEN ASM_REWRITE_TAC[]]]
2732QED
2733
2734Theorem INTEGRABLE_SUBINTERVAL_RIGHT:
2735 !f a b c. a <= c /\ c <= b /\ integrable(a,b) f ==> integrable(c,b) f
2736Proof
2737 REPEAT GEN_TAC THEN DISCH_TAC THEN
2738 FIRST_ASSUM(X_CHOOSE_TAC ``i:real`` o MATCH_MP INTEGRABLE_SPLIT_SIDES) THEN
2739 REWRITE_TAC[INTEGRABLE_CAUCHY] THEN X_GEN_TAC ``e:real`` THEN DISCH_TAC THEN
2740 FIRST_X_ASSUM(MP_TAC o SPEC ``e / &2``) THEN
2741 SIMP_TAC arith_ss[ASSUME ``&0 < e``, REAL_LT_DIV, REAL_LT] THEN
2742 HO_MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC ``g:real->real`` THEN
2743 STRIP_TAC THEN CONJ_TAC THENL
2744 [UNDISCH_TAC ``gauge (\x. a <= x /\ x <= b) g`` THEN
2745 REWRITE_TAC[gauge] THEN ASM_MESON_TAC[REAL_LE_TRANS], ALL_TAC] THEN
2746 REPEAT STRIP_TAC THEN
2747 MP_TAC(SPECL [``a:real``, ``c:real``, ``g:real->real``]
2748 DIVISION_EXISTS) THEN
2749 SUBGOAL_THEN``a <= c /\ gauge (\x. a <= x /\ x <= c) g``ASSUME_TAC THENL
2750 [ASM_REWRITE_TAC[] THEN
2751 UNDISCH_TAC ``gauge (\x. a <= x /\ x <= b) g`` THEN
2752 REWRITE_TAC[gauge] THEN ASM_MESON_TAC[REAL_LE_TRANS], ALL_TAC] THEN
2753 ASM_REWRITE_TAC[] THEN SIMP_TAC arith_ss[GSYM LEFT_FORALL_IMP_THM] THEN
2754 MAP_EVERY X_GEN_TAC [``d:num->real``, ``p:num->real``] THEN STRIP_TAC THEN
2755 FIRST_X_ASSUM(MP_TAC o SPECL [``d:num->real``, ``p:num->real``]) THEN
2756 DISCH_THEN(fn th =>
2757 MP_TAC(SPECL [``d1:num->real``, ``p1:num->real``] th) THEN
2758 MP_TAC(SPECL [``d2:num->real``, ``p2:num->real``] th)) THEN
2759 ASM_REWRITE_TAC[] THEN
2760 REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LET_TRANS THEN
2761 EXISTS_TAC``abs ((rsum (d,p) f + rsum (d1,p1) f - i) -
2762 (rsum (d,p) f + rsum (d2,p2) f - i))`` THEN
2763 CONJ_TAC THENL
2764 [MATCH_MP_TAC REAL_EQ_IMP_LE THEN
2765 REWRITE_TAC[REAL_ARITH``a + b - i -(a + c - i) = b - c``], ALL_TAC] THEN
2766 MATCH_MP_TAC REAL_LET_TRANS THEN
2767 EXISTS_TAC``abs (rsum (d,p) f + rsum (d1,p1) f - i) +
2768 abs(rsum (d,p) f + rsum (d2,p2) f - i)`` THEN
2769 CONJ_TAC THENL
2770 [REWRITE_TAC[REAL_ARITH``abs(a - b) <= abs a + abs b``],
2771 GEN_REWRITE_TAC RAND_CONV empty_rewrites [GSYM REAL_HALF_DOUBLE] THEN
2772 MATCH_MP_TAC REAL_LT_ADD2 THEN ASM_REWRITE_TAC[]]
2773QED
2774
2775Theorem INTEGRABLE_SUBINTERVAL:
2776 !f a b c d. a <= c /\ c <= d /\ d <= b /\ integrable(a,b) f
2777 ==> integrable(c,d) f
2778Proof
2779 MESON_TAC[INTEGRABLE_SUBINTERVAL_LEFT, INTEGRABLE_SUBINTERVAL_RIGHT,
2780 REAL_LE_TRANS]
2781QED
2782
2783(* ------------------------------------------------------------------------- *)
2784(* More basic lemmas about integration. *)
2785(* ------------------------------------------------------------------------- *)
2786
2787Theorem INTEGRAL_0:
2788 !a b. a <= b ==> (integral(a,b) (\x. 0) = 0)
2789Proof
2790 RW_TAC std_ss[] THEN MATCH_MP_TAC DINT_INTEGRAL THEN
2791 ASM_REWRITE_TAC[DINT_0]
2792QED
2793
2794Theorem INTEGRAL_CONST:
2795 !a b c. a <= b ==> (integral(a,b) (\x. c) = c * (b - a))
2796Proof
2797 REPEAT STRIP_TAC THEN MATCH_MP_TAC DINT_INTEGRAL THEN
2798 ASM_SIMP_TAC arith_ss[DINT_CONST]
2799QED
2800
2801Theorem INTEGRAL_CMUL:
2802 !f c a b. a <= b /\ integrable(a,b) f
2803 ==> (integral(a,b) (\x. c * f(x)) = c * integral(a,b) f)
2804Proof
2805 REPEAT STRIP_TAC THEN MATCH_MP_TAC DINT_INTEGRAL THEN
2806 ASM_SIMP_TAC arith_ss[DINT_CMUL, INTEGRABLE_DINT]
2807QED
2808
2809Theorem INTEGRAL_ADD:
2810 !f g a b. a <= b /\ integrable(a,b) f /\ integrable(a,b) g
2811 ==> (integral(a,b) (\x. f(x) + g(x)) =
2812 integral(a,b) f + integral(a,b) g)
2813Proof
2814 REPEAT STRIP_TAC THEN MATCH_MP_TAC DINT_INTEGRAL THEN
2815 ASM_SIMP_TAC arith_ss[DINT_ADD, INTEGRABLE_DINT]
2816QED
2817
2818Theorem INTEGRAL_SUB:
2819 !f g a b. a <= b /\ integrable(a,b) f /\ integrable(a,b) g
2820 ==> (integral(a,b) (\x. f(x) - g(x)) =
2821 integral(a,b) f - integral(a,b) g)
2822Proof
2823 REPEAT STRIP_TAC THEN MATCH_MP_TAC DINT_INTEGRAL THEN
2824 ASM_SIMP_TAC arith_ss[DINT_SUB, INTEGRABLE_DINT]
2825QED
2826
2827Theorem INTEGRAL_BY_PARTS:
2828 !f g f' g' a b.
2829 a <= b /\
2830 (!x. a <= x /\ x <= b ==> (f diffl f' x) x) /\
2831 (!x. a <= x /\ x <= b ==> (g diffl g' x) x) /\
2832 integrable(a,b) (\x. f' x * g x) /\
2833 integrable(a,b) (\x. f x * g' x)
2834 ==> (integral(a,b) (\x. f x * g' x) =
2835 (f b * g b - f a * g a) - integral(a,b) (\x. f' x * g x))
2836Proof
2837 MP_TAC INTEGRATION_BY_PARTS THEN REPEAT(HO_MATCH_MP_TAC MONO_ALL THEN GEN_TAC) THEN
2838 DISCH_THEN(fn th => STRIP_TAC THEN MP_TAC th) THEN ASM_REWRITE_TAC[] THEN
2839 DISCH_THEN(MP_TAC o CONJ (ASSUME ``a <= b``)) THEN
2840 DISCH_THEN(SUBST1_TAC o SYM o MATCH_MP DINT_INTEGRAL) THEN
2841 ASM_SIMP_TAC arith_ss[INTEGRAL_ADD] THEN REAL_ARITH_TAC
2842QED
2843
2844Theorem INTEGRAL_COMBINE:
2845 !f a b c. a <= b /\ b <= c /\ (integrable (a,c) f) ==>
2846 (integral (a,c) f = (integral (a,b) f) + (integral (b,c) f))
2847Proof
2848 RW_TAC std_ss[integral] THEN SELECT_ELIM_TAC THEN RW_TAC std_ss[] THENL
2849 [FULL_SIMP_TAC std_ss[integrable] THEN EXISTS_TAC ``i:real`` THEN
2850 ASM_REWRITE_TAC[],
2851 SELECT_ELIM_TAC THEN CONJ_TAC THENL
2852 [REWRITE_TAC[GSYM integrable] THEN MATCH_MP_TAC INTEGRABLE_SUBINTERVAL THEN
2853 MAP_EVERY EXISTS_TAC[``a:real``,``c:real``] THEN
2854 RW_TAC std_ss[REAL_LE_REFL, integrable],
2855 SELECT_ELIM_TAC THEN CONJ_TAC THENL
2856 [REWRITE_TAC[GSYM integrable] THEN MATCH_MP_TAC INTEGRABLE_SUBINTERVAL THEN
2857 MAP_EVERY EXISTS_TAC[``a:real``,``c:real``] THEN
2858 RW_TAC std_ss[REAL_LE_REFL, integrable],
2859 RW_TAC std_ss[] THEN MATCH_MP_TAC DINT_UNIQ THEN
2860 MAP_EVERY EXISTS_TAC[``a:real``,``c:real``,``f:real->real``] THEN
2861 RW_TAC std_ss[] THENL
2862 [MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC ``b:real`` THEN
2863 RW_TAC std_ss[],
2864 MATCH_MP_TAC DINT_COMBINE THEN EXISTS_TAC ``b:real`` THEN
2865 RW_TAC std_ss[]]]]]
2866QED
2867
2868(* ------------------------------------------------------------------------- *)
2869(* Mean value theorem of integral. *)
2870(* ------------------------------------------------------------------------- *)
2871
2872Theorem INTEGRAL_MVT1:
2873 !f a b. (a <= b /\(!x. a<=x /\ x<=b ==> f contl x)) ==>
2874 (?x. a<=x /\ x<=b /\ (integral(a,b) f = f(x)*(b-a)))
2875Proof
2876 REPEAT GEN_TAC THEN
2877 MP_TAC(SPECL[``f:real->real``,``a:real``,``b:real``]CONT_ATTAINS_ALL) THEN
2878 REWRITE_TAC[TAUT_CONV``((a ==> b) ==> (a ==> c)) = (a ==> b ==> c)``] THEN
2879 REPEAT STRIP_TAC THEN ASM_CASES_TAC``a:real=b`` THENL
2880 [EXISTS_TAC``b:real`` THEN ASM_SIMP_TAC std_ss[REAL_LE_REFL] THEN
2881 ASM_SIMP_TAC std_ss[REAL_SUB_REFL,REAL_MUL_RZERO] THEN
2882 MATCH_MP_TAC DINT_INTEGRAL THEN
2883 ASM_SIMP_TAC std_ss[REAL_LE_REFL,INTEGRAL_NULL], ALL_TAC] THEN
2884 SUBGOAL_THEN``?x:real. a<=x /\ x<=b /\
2885 (f x = inv(b-a)* integral(a,b) f)``ASSUME_TAC THENL
2886 [UNDISCH_TAC``!y. L <= y /\ y <= M ==> ?x. a <= x /\ x<=b /\ (f x = y)`` THEN
2887 DISCH_THEN(MP_TAC o SPEC``inv(b-a)* integral(a,b)f``) THEN
2888 REPEAT STRIP_TAC THEN
2889 SUBGOAL_THEN``(L*(b-a) <= integral(a,b) f) /\
2890 (integral(a,b) f <= M*(b-a))``ASSUME_TAC THENL
2891 [CONJ_TAC THENL
2892 [SUBGOAL_THEN``L*(b-a)=integral(a,b)(\x. L)``ASSUME_TAC THENL
2893 [CONV_TAC SYM_CONV THEN MATCH_MP_TAC INTEGRAL_CONST THEN
2894 ASM_REWRITE_TAC[],ASM_REWRITE_TAC[] THEN MATCH_MP_TAC INTEGRAL_LE THEN
2895 ASM_SIMP_TAC std_ss[INTEGRABLE_CONTINUOUS,
2896 INTEGRABLE_CONST,REAL_LT_IMP_LE]],
2897 SUBGOAL_THEN``M*(b-a) = integral(a,b)(\x. M)``ASSUME_TAC THENL
2898 [CONV_TAC SYM_CONV THEN MATCH_MP_TAC INTEGRAL_CONST THEN
2899 ASM_REWRITE_TAC[], ASM_REWRITE_TAC[] THEN MATCH_MP_TAC INTEGRAL_LE THEN
2900 ASM_SIMP_TAC std_ss[INTEGRABLE_CONTINUOUS,
2901 INTEGRABLE_CONST,REAL_LT_IMP_LE]]],ALL_TAC] THEN
2902 SUBGOAL_THEN``L <= inv(b-a) * integral(a,b) f /\
2903 inv(b-a) * integral(a,b) f <= M``MP_TAC THENL
2904 [ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN REWRITE_TAC[GSYM real_div] THEN
2905 CONJ_TAC THENL
2906 [MATCH_MP_TAC REAL_LE_RDIV THEN
2907 ASM_SIMP_TAC std_ss[REAL_SUB_LT,REAL_LT_LE],
2908 MATCH_MP_TAC REAL_LE_LDIV THEN
2909 ASM_SIMP_TAC std_ss[REAL_SUB_LT,REAL_LT_LE]],ALL_TAC] THEN
2910 ASM_SIMP_TAC std_ss[],ALL_TAC] THEN
2911 FIRST_ASSUM(X_CHOOSE_THEN``x:real``STRIP_ASSUME_TAC) THEN
2912 EXISTS_TAC``x:real``THEN ASM_SIMP_TAC std_ss[REAL_ARITH``a*b*c=c*a*b``] THEN
2913 SUBGOAL_THEN``(b:real -a)*inv(b-a)=1``ASSUME_TAC THENL
2914 [MATCH_MP_TAC REAL_MUL_RINV THEN MATCH_MP_TAC REAL_POS_NZ THEN
2915 ASM_SIMP_TAC std_ss[REAL_SUB_LT,REAL_LT_LE],ALL_TAC] THEN
2916 ASM_SIMP_TAC std_ss[REAL_MUL_LID]
2917QED
2918
2919(* ------------------------------------------------------------------------- *)
2920(* connection to integrationTheory (bridging theorem added by Chun Tian) *)
2921(* ------------------------------------------------------------------------- *)
2922
2923(* NOTE: ‘b < a’ must be avoid, as ‘integral$integral (a,b) f’ is unspecified
2924 (see DINT_WRONG), while ‘integration$integral (interval [a,b]) f = 0’. (see
2925 HAS_INTEGRAL_NULL).
2926
2927 UPDATE: ‘a = b’ must be also avoid, because ‘tagged_division_of’ allows
2928 degenerate divisions, which must be filtered out when constructing Dint.
2929 *)
2930
2931(* Part 1: from old integrals to new integrals *)
2932Theorem Dint_imp_has_integral[local] :
2933 !f a b k. a < b /\ Dint(a,b) f k ==> (f has_integral k) (interval[a,b])
2934Proof
2935 RW_TAC std_ss [Dint, has_integral]
2936 >> Q.PAT_X_ASSUM ‘!e. 0 < e ==> P’ (MP_TAC o (Q.SPEC ‘e’)) >> rw []
2937 >> Q.ABBREV_TAC ‘E = \x. a <= x /\ x <= b’
2938 >> Q.ABBREV_TAC ‘d = \x. ball (x,if E x then 1 / 2 * g x else 1)’
2939 >> Q.EXISTS_TAC ‘d’ (* gauge d *)
2940 >> STRONG_CONJ_TAC >- rw [Abbr ‘d’, GSYM gauge_alt]
2941 >> DISCH_TAC
2942 >> rpt STRIP_TAC
2943 (* now, from ‘p tagged_division_of interval [a,b]’ we must find all its end
2944 points, sorted by interval lowerbounds, then construct an equivalent (D,t)
2945 such that ‘tdiv (a,b) (D,t)’ and ‘fine g (D,t)’. This is not easy.
2946 *)
2947 >> Q.PAT_X_ASSUM ‘p tagged_division_of i’
2948 (STRIP_ASSUME_TAC o (REWRITE_RULE [TAGGED_DIVISION_OF]))
2949 (* preparing for iterateTheory.TOPOLOGICAL_SORT' *)
2950 >> Q.ABBREV_TAC ‘R = \(x1,k1) (x2,k2). (x1,k1) IN p /\ (x2,k2) IN p /\
2951 0 < content k1 /\ 0 < content k2 /\
2952 interval_lowerbound k1 <= interval_lowerbound k2’
2953 >> Know ‘transitive R /\ antisymmetric R’
2954 >- (RW_TAC std_ss [transitive_def, antisymmetric_def, Abbr ‘R’]
2955 >- (Cases_on ‘x’ >> Cases_on ‘y’ >> Cases_on ‘z’ >> fs [] \\
2956 METIS_TAC [REAL_LE_TRANS]) \\
2957 (* antisymmetric requires some assumptions *)
2958 Cases_on ‘x’ >> Cases_on ‘y’ >> fs [] \\
2959 rename1 ‘x1 = x2 /\ k1 = k2’ \\
2960 Q.PAT_ASSUM ‘!x k. (x,k) IN p ==> P’ (MP_TAC o (Q.SPECL [‘x1’, ‘k1’])) \\
2961 RW_TAC std_ss [] >> rename1 ‘interval [a1,b1] SUBSET interval [a,b]’ \\
2962 Q.PAT_ASSUM ‘!x k. (x,k) IN p ==> P’ (MP_TAC o (Q.SPECL [‘x2’, ‘k2’])) \\
2963 RW_TAC std_ss [] >> rename1 ‘interval [a2,b2] SUBSET interval [a,b]’ \\
2964 ‘interval [a1,b1] <> {} /\ interval [a2,b2] <> {}’ by METIS_TAC [MEMBER_NOT_EMPTY] \\
2965 ‘a1 <= b1 /\ a2 <= b2’ by PROVE_TAC [INTERVAL_NE_EMPTY] \\
2966 FULL_SIMP_TAC std_ss [INTERVAL_LOWERBOUND, CONTENT_POS_LT_EQ] \\
2967 ‘a1 = a2’ by PROVE_TAC [REAL_LE_ANTISYM] \\
2968 Q.PAT_ASSUM ‘!x1 k1 x2 k2. _ ==> interior k1 INTER interior k2 = {}’
2969 (MP_TAC o (Q.SPECL [‘x1’, ‘interval [a1,b1]’, ‘x2’, ‘interval [a2,b2]’])) \\
2970 RW_TAC std_ss [INTERIOR_CLOSED_INTERVAL, EQ_INTERVAL, GSYM DISJOINT_DEF] \\
2971 CCONTR_TAC \\
2972 Q.PAT_X_ASSUM ‘_ ==> DISJOINT (interval (a1,b1)) (interval (a1,b2))’ MP_TAC \\
2973 RW_TAC std_ss [DISJOINT_ALT, IN_INTERVAL] \\
2974 ‘a1 < min b1 b2’ by PROVE_TAC [REAL_LT_MIN] \\
2975 ‘?z. a1 < z /\ z < min b1 b2’ by METIS_TAC [REAL_MEAN] \\
2976 Q.EXISTS_TAC ‘z’ >> fs [REAL_LT_MIN])
2977 >> STRIP_TAC
2978 (* applying iterateTheory.TOPOLOGICAL_SORT' *)
2979 >> Q.ABBREV_TAC ‘L = {(x,k) | (x,k) IN p /\ 0 < content k}’
2980 >> Know ‘FINITE L’
2981 >- (MATCH_MP_TAC SUBSET_FINITE_I >> Q.EXISTS_TAC ‘p’ \\
2982 rw [Abbr ‘L’, SUBSET_DEF] >> art [])
2983 >> DISCH_TAC
2984 >> Q.ABBREV_TAC ‘N = CARD L’
2985 >> ‘L HAS_SIZE N’ by PROVE_TAC [HAS_SIZE]
2986 >> drule_all TOPOLOGICAL_SORT' >> STRIP_TAC
2987 >> rename1 ‘L = IMAGE h (count N)’ (* this asserts ‘h’ *)
2988 (* h-properties *)
2989 >> Know ‘!i. i < N ==> h i IN p /\ 0 < content (SND (h i))’
2990 >- (Q.X_GEN_TAC ‘i’ >> DISCH_TAC \\
2991 Q.PAT_X_ASSUM ‘L = IMAGE h (count N)’ MP_TAC \\
2992 simp [Once EXTENSION, Abbr ‘L’] \\
2993 DISCH_THEN (MP_TAC o (Q.SPEC ‘h (i :num)’)) \\
2994 METIS_TAC [SND])
2995 >> DISCH_TAC
2996 >> Know ‘!x s. (x,s) IN L ==> ?n. n < N /\ (x,s) = h n’
2997 >- (Q.PAT_X_ASSUM ‘L = IMAGE h (count N)’ MP_TAC \\
2998 rw [Once EXTENSION, Abbr ‘L’] \\
2999 rename1 ‘(x,s) = h i’ >> Q.EXISTS_TAC ‘i’ >> art [])
3000 >> DISCH_TAC
3001 (* h-properties *)
3002 >> Know ‘!i j. i < N /\ j < N /\ i < j ==>
3003 interval_lowerbound (SND (h i)) < interval_lowerbound (SND (h j))’
3004 >- (rpt STRIP_TAC \\
3005 Q.PAT_X_ASSUM ‘!j k. j < N /\ k < N /\ j < k ==> ~R (h k) (h j)’
3006 (MP_TAC o (Q.SPECL [‘i’, ‘j’])) \\
3007 Cases_on ‘h i’ >> Cases_on ‘h j’ >> rw [Abbr ‘R’] (* 5 subgoals, same tactics *) \\
3008 METIS_TAC [SND, real_lt])
3009 >> DISCH_TAC
3010 >> Q.PAT_X_ASSUM ‘!j k. j < N /\ k < N /\ j < k ==> ~R (h k) (h j)’ K_TAC
3011 (* clean up everything about R (not needed anymore) *)
3012 >> Q.PAT_X_ASSUM ‘transitive R’ K_TAC
3013 >> Q.PAT_X_ASSUM ‘antisymmetric R’ K_TAC
3014 >> Q.UNABBREV_TAC ‘R’
3015 (* the set of all tags, degerated divisions must be among them *)
3016 >> Q.ABBREV_TAC ‘Z = {x | ?k. (x,k) IN p}’ (* i.e. the set of all tags *)
3017 >> Know ‘FINITE Z’
3018 >- (MATCH_MP_TAC SUBSET_FINITE_I >> Q.EXISTS_TAC ‘IMAGE FST p’ \\
3019 rw [IMAGE_FINITE, SUBSET_DEF, Abbr ‘Z’] >> rename1 ‘(x1,k1) IN p’ \\
3020 Q.EXISTS_TAC ‘(x1,k1)’ >> rw [])
3021 >> DISCH_TAC
3022 (* eliminate a special impossible case (N = 0) *)
3023 >> Know ‘N <> 0’
3024 >- (Q.PAT_X_ASSUM ‘L = IMAGE h (count N)’ K_TAC (* not needed here *) \\
3025 CCONTR_TAC >> fs [] \\
3026 Q.PAT_X_ASSUM ‘BIGUNION _ = interval [a,b]’ MP_TAC \\
3027 rw [Once EXTENSION, IN_INTERVAL, IN_BIGUNION, Abbr ‘E’] \\
3028 Q.ABBREV_TAC ‘y = CHOICE (interval[a,b] DIFF Z)’ \\
3029 Know ‘y IN interval[a,b] DIFF Z’
3030 >- (Q.UNABBREV_TAC ‘y’ >> MATCH_MP_TAC CHOICE_DEF \\
3031 MATCH_MP_TAC INFINITE_DIFF_FINITE >> art [] \\
3032 ‘interval(a,b) <> {}’ by PROVE_TAC [INTERVAL_NE_EMPTY] \\
3033 PROVE_TAC [finite_countable, UNCOUNTABLE_INTERVAL]) >> DISCH_TAC \\
3034 ‘y NOTIN Z’ by (Q.PAT_X_ASSUM ‘y IN interval[a,b] DIFF Z’ MP_TAC >> rw []) \\
3035 Know ‘a <= y /\ y <= b’
3036 >- (Q.PAT_X_ASSUM ‘y IN interval[a,b] DIFF Z’ MP_TAC \\
3037 rw [IN_DIFF, IN_INTERVAL]) >> STRIP_TAC \\
3038 CCONTR_TAC >> fs [] \\
3039 Q.PAT_X_ASSUM ‘!x. _ <=> a <= x /\ x <= b’ (MP_TAC o (Q.SPEC ‘y’)) \\
3040 RW_TAC std_ss [] \\
3041 CCONTR_TAC >> fs [] >> rename1 ‘(x,s) IN p’ \\
3042 ‘x IN Z’ by (rw [Abbr ‘Z’] >> Q.EXISTS_TAC ‘s’ >> art []) \\
3043 Q.PAT_X_ASSUM ‘!x k. (x,k) IN p ==> _’ (MP_TAC o (Q.SPECL [‘x’, ‘s’])) \\
3044 RW_TAC std_ss [] \\
3045 CCONTR_TAC >> fs [] \\
3046 rename1 ‘s = interval[a0,b0]’ \\
3047 ‘interval [a0,b0] <> {}’ by PROVE_TAC [MEMBER_NOT_EMPTY] \\
3048 ‘a0 <= b0’ by PROVE_TAC [INTERVAL_NE_EMPTY] \\
3049 ‘b0 = a0 \/ a0 < b0’ by PROVE_TAC [REAL_LE_LT]
3050 >- (gs [INTERVAL_SING, IN_SING]) \\
3051 Q.PAT_X_ASSUM ‘!x s. (x,s) NOTIN L’
3052 (MP_TAC o (Q.SPECL [‘x’, ‘interval [a0,b0]’])) \\
3053 rw [Abbr ‘L’, CONTENT_CLOSED_INTERVAL, REAL_SUB_LT])
3054 >> DISCH_TAC
3055 (* now construct tdiv (the old form) *)
3056 >> Q.ABBREV_TAC ‘D = \n. if n < N then interval_lowerbound (SND (h n)) else b’
3057 >> Q.ABBREV_TAC ‘t = \n. if n < N then FST (h n) else b’
3058 (* stage work *)
3059 >> Know ‘tdiv (a,b) (D,t)’
3060 >- (Q.PAT_X_ASSUM ‘L = IMAGE h (count N)’ K_TAC (* not needed here *) \\
3061 RW_TAC real_ss [tdiv, division, Abbr ‘D’, Abbr ‘t’] >| (* 4 subgoals *)
3062 [ (* goal 1 (of 4): interval_lowerbound (SND (h 0)) = a *)
3063 Q.PAT_X_ASSUM ‘BIGUNION _ = interval [a,b]’ MP_TAC \\
3064 rw [Once EXTENSION, IN_INTERVAL, IN_BIGUNION, Abbr ‘E’] \\
3065 Q.PAT_ASSUM ‘!x k. (x,k) IN p ==> x IN k /\ _’
3066 (MP_TAC o (Q.SPECL [‘FST ((h :num -> real # (real set)) 0)’,
3067 ‘SND ((h :num -> real # (real set)) 0)’])) >> rw [] \\
3068 rename1 ‘SND (h 0) = interval [a0,b0]’ \\
3069 Know ‘interval [a0,b0] <> {}’
3070 >- (rw [GSYM MEMBER_NOT_EMPTY] \\
3071 Q.EXISTS_TAC ‘FST (h 0)’ \\
3072 Know ‘(FST (h 0),SND (h 0)) IN p’ >- rw [] \\
3073 METIS_TAC []) >> DISCH_TAC \\
3074 ‘a0 <= b0’ by PROVE_TAC [INTERVAL_NE_EMPTY] \\
3075 FULL_SIMP_TAC bool_ss [INTERVAL_LOWERBOUND_NONEMPTY, SUBSET_INTERVAL] \\
3076 CCONTR_TAC >> ‘a0 < a \/ a < a0’ by PROVE_TAC [REAL_LT_TOTAL] (* 2 subgoals *)
3077 >- (Q.PAT_X_ASSUM ‘a0 <> a’ K_TAC \\
3078 Q.PAT_X_ASSUM ‘!x. _ <=> a <= x /\ x <= b’ (MP_TAC o (Q.SPEC ‘a0’)) \\
3079 Suff ‘?s. a0 IN s /\ ?x. (x,s) IN p’ >- (Rewr >> rw [GSYM real_lt]) \\
3080 Q.EXISTS_TAC ‘SND (h 0)’ \\
3081 ONCE_REWRITE_TAC [CONJ_COMM] \\
3082 CONJ_TAC >- (Q.EXISTS_TAC ‘FST (h 0)’ >> rw []) \\
3083 Q.PAT_X_ASSUM ‘SND (h 0) = interval _’ (ONCE_REWRITE_TAC o wrap) \\
3084 rw [IN_INTERVAL]) \\
3085 (* stage work *)
3086 ‘a0 <= b’ by PROVE_TAC [REAL_LE_TRANS] \\
3087 Q.ABBREV_TAC ‘y = CHOICE (interval(a,a0) DIFF Z)’ \\
3088 Know ‘y IN interval(a,a0) DIFF Z’
3089 >- (Q.UNABBREV_TAC ‘y’ >> MATCH_MP_TAC CHOICE_DEF \\
3090 MATCH_MP_TAC INFINITE_DIFF_FINITE >> art [] \\
3091 ‘interval(a,a0) <> {}’ by PROVE_TAC [INTERVAL_NE_EMPTY] \\
3092 PROVE_TAC [finite_countable, UNCOUNTABLE_INTERVAL]) >> DISCH_TAC \\
3093 Know ‘a < y /\ y < b’
3094 >- (POP_ASSUM MP_TAC >> rw [IN_DIFF, IN_INTERVAL] \\
3095 MATCH_MP_TAC REAL_LTE_TRANS \\
3096 Q.EXISTS_TAC ‘a0’ >> art []) >> STRIP_TAC \\
3097 Q.PAT_X_ASSUM ‘!x. _ <=> a <= x /\ x <= b’ (MP_TAC o (Q.SPEC ‘y’)) \\
3098 Know ‘a <= y /\ y <= b’ >- PROVE_TAC [REAL_LT_IMP_LE] >> Rewr \\
3099 CCONTR_TAC >> FULL_SIMP_TAC bool_ss [] >> rename1 ‘(x,s) IN p’ \\
3100 ‘x IN Z’ by (rw [Abbr ‘Z’] >> Q.EXISTS_TAC ‘s’ >> art []) \\
3101 (* now we show that (x,s) IN L. But first of all, ‘s’ cannot be degenerate,
3102 since otherwise we will have x = y, but this is impossible. *)
3103 Know ‘(x,s) IN L’
3104 >- (rw [Abbr ‘L’] (* now ‘0 < content s’ *) \\
3105 Q.PAT_X_ASSUM ‘!x k. (x,k) IN p ==> _’ (MP_TAC o (Q.SPECL [‘x’, ‘s’])) \\
3106 RW_TAC std_ss [] >> rename1 ‘(x,interval[a1,b1]) IN p’ \\
3107 ‘interval [a1,b1] <> {}’ by METIS_TAC [MEMBER_NOT_EMPTY] \\
3108 ‘a1 <= b1’ by PROVE_TAC [INTERVAL_NE_EMPTY] \\
3109 Suff ‘content (interval[a1,b1]) <> 0’
3110 >- (rw [REAL_LT_LE, CONTENT_POS_LE]) \\
3111 CCONTR_TAC >> FULL_SIMP_TAC bool_ss [CONTENT_EQ_0] \\
3112 ‘b1 = a1’ by PROVE_TAC [REAL_LE_ANTISYM] \\
3113 fs [INTERVAL_SING, IN_SING]) >> DISCH_TAC \\
3114 ‘?m. m < N /\ (x,s) = h m’ by METIS_TAC [] \\
3115 (* ordering: (a, y, [a0,b0], b) *)
3116 ‘m = 0 \/ 0 < m’ by RW_TAC arith_ss []
3117 >- (Know ‘s = SND (h m)’
3118 >- (Q.PAT_X_ASSUM ‘(x,s) = h m’ (ONCE_REWRITE_TAC o wrap o SYM) >> rw []) \\
3119 DISCH_TAC \\
3120 Know ‘y IN interval [a0,b0]’ >- METIS_TAC [] \\
3121 fs [IN_INTERVAL, GSYM real_lt]) \\
3122 Q.PAT_X_ASSUM ‘!x k. (x,k) IN p ==> x IN k /\ _’ (MP_TAC o (Q.SPECL [‘x’,‘s’])) \\
3123 RW_TAC std_ss [] \\
3124 CCONTR_TAC >> FULL_SIMP_TAC bool_ss [] >> rename1 ‘s = interval[a1,b1]’ \\
3125 ‘interval [a1,b1] <> {}’ by METIS_TAC [MEMBER_NOT_EMPTY] \\
3126 ‘a1 <= b1’ by PROVE_TAC [INTERVAL_NE_EMPTY] \\
3127 Know ‘interval_lowerbound (SND (h 0)) < interval_lowerbound (SND (h m))’ >- rw [] \\
3128 Know ‘SND (h m) = interval[a1,b1]’
3129 >- (Q.PAT_X_ASSUM ‘(x,s) = h m’ (ONCE_REWRITE_TAC o wrap o SYM) >> rw []) >> Rewr \\
3130 Q.PAT_X_ASSUM ‘SND (h 0) = interval [a0,b0]’ (REWRITE_TAC o wrap) \\
3131 rw [INTERVAL_LOWERBOUND_NONEMPTY, real_lt] >> fs [IN_INTERVAL] \\
3132 MATCH_MP_TAC REAL_LT_IMP_LE >> MATCH_MP_TAC REAL_LET_TRANS \\
3133 Q.EXISTS_TAC ‘y’ >> art [],
3134 (* goal 2 (of 4) *)
3135 Q.EXISTS_TAC ‘N’ >> rw [] (* now: interval_lowerbound (SND (h n)) < b *) \\
3136 ‘h n IN p /\ 0 < content (SND (h n))’ by PROVE_TAC [] \\
3137 Q.PAT_ASSUM ‘!x k. (x,k) IN p ==> _’
3138 (MP_TAC o (Q.SPECL [‘FST ((h :num -> real # (real set)) n)’,
3139 ‘SND ((h :num -> real # (real set)) n)’])) >> rw [] \\
3140 rename1 ‘SND (h n) = interval [a0,b0]’ \\
3141 Know ‘interval [a0,b0] <> {}’
3142 >- (rw [GSYM MEMBER_NOT_EMPTY] \\
3143 Q.EXISTS_TAC ‘FST (h n)’ \\
3144 Know ‘(FST (h n),SND (h n)) IN p’ >- rw [] \\
3145 METIS_TAC []) >> DISCH_TAC \\
3146 ‘a0 <= b0’ by PROVE_TAC [INTERVAL_NE_EMPTY] \\
3147 Q.PAT_X_ASSUM ‘SND (h n) = interval[a0,b0]’
3148 (fn th => FULL_SIMP_TAC std_ss [th, CONTENT_CLOSED_INTERVAL, REAL_SUB_LT,
3149 INTERVAL_LOWERBOUND_NONEMPTY]) \\
3150 Q.PAT_X_ASSUM ‘interval [a0,b0] SUBSET interval [a,b]’ MP_TAC \\
3151 RW_TAC std_ss [SUBSET_INTERVAL] \\
3152 MATCH_MP_TAC REAL_LTE_TRANS >> Q.EXISTS_TAC ‘b0’ >> art [],
3153 (* goal 3 (of 4) *)
3154 Cases_on ‘n < N’ >> rw [] (* interval_lowerbound (SND (h n)) <= FST (h n) *) \\
3155 ‘h n IN p’ by PROVE_TAC [] \\
3156 Q.PAT_ASSUM ‘!x k. (x,k) IN p ==> _’
3157 (MP_TAC o (Q.SPECL [‘FST ((h :num -> real # (real set)) n)’,
3158 ‘SND ((h :num -> real # (real set)) n)’])) >> rw [] \\
3159 rename1 ‘SND (h n) = interval [a0,b0]’ \\
3160 Know ‘interval [a0,b0] <> {}’
3161 >- (rw [GSYM MEMBER_NOT_EMPTY] \\
3162 Q.EXISTS_TAC ‘FST (h n)’ \\
3163 Know ‘(FST (h n),SND (h n)) IN p’ >- rw [] \\
3164 METIS_TAC []) >> DISCH_TAC \\
3165 ‘a0 <= b0’ by PROVE_TAC [INTERVAL_NE_EMPTY] \\
3166 ‘FST (h n) IN SND (h n)’ by rw [] \\
3167 Q.PAT_X_ASSUM ‘SND (h n) = interval[a0,b0]’
3168 (fn th => FULL_SIMP_TAC std_ss [th, INTERVAL_LOWERBOUND_NONEMPTY, IN_INTERVAL]),
3169 (* goal 4 (of 4) *)
3170 Cases_on ‘n < N’ >> reverse (rw []) >| (* 2 subgoals *)
3171 [ (* goal 4.1 (of 2): FST (h n) <= b *)
3172 ‘h n IN p’ by PROVE_TAC [] \\
3173 Q.PAT_ASSUM ‘!x k. (x,k) IN p ==> _’
3174 (MP_TAC o (Q.SPECL [‘FST ((h :num -> real # (real set)) n)’,
3175 ‘SND ((h :num -> real # (real set)) n)’])) \\
3176 rw [] >> rename1 ‘SND (h n) = interval [a0,b0]’ \\
3177 Know ‘interval [a0,b0] <> {}’
3178 >- (rw [GSYM MEMBER_NOT_EMPTY] \\
3179 Q.EXISTS_TAC ‘FST (h n)’ \\
3180 Know ‘(FST (h n),SND (h n)) IN p’ >- rw [] \\
3181 METIS_TAC []) >> DISCH_TAC \\
3182 ‘a0 <= b0’ by PROVE_TAC [INTERVAL_NE_EMPTY] \\
3183 ‘FST (h n) IN SND (h n)’ by rw [] \\
3184 Q.PAT_X_ASSUM ‘SND (h n) = interval[a0,b0]’
3185 (fn th => FULL_SIMP_TAC std_ss [th, INTERVAL_LOWERBOUND_NONEMPTY,
3186 SUBSET_INTERVAL, IN_INTERVAL]) \\
3187 MATCH_MP_TAC REAL_LE_TRANS >> Q.EXISTS_TAC ‘b0’ >> art [],
3188 (* goal 4.2 (of 2): FST (h n) <= interval_lowerbound (SND (h (SUC n))) *)
3189 MATCH_MP_TAC REAL_LE_TRANS \\
3190 Q.EXISTS_TAC ‘interval_upperbound (SND (h n))’ \\
3191 CONJ_TAC
3192 >- (‘h n IN p’ by PROVE_TAC [] \\
3193 Q.PAT_ASSUM ‘!x k. (x,k) IN p ==> _’
3194 (MP_TAC o (Q.SPECL [‘FST ((h :num -> real # (real set)) n)’,
3195 ‘SND ((h :num -> real # (real set)) n)’])) \\
3196 rw [] >> rename1 ‘SND (h n) = interval [a0,b0]’ \\
3197 Know ‘interval [a0,b0] <> {}’
3198 >- (rw [GSYM MEMBER_NOT_EMPTY] \\
3199 Q.EXISTS_TAC ‘FST (h n)’ \\
3200 Know ‘(FST (h n),SND (h n)) IN p’ >- rw [] \\
3201 METIS_TAC []) >> DISCH_TAC \\
3202 ‘a0 <= b0’ by PROVE_TAC [INTERVAL_NE_EMPTY] \\
3203 ‘FST (h n) IN SND (h n)’ by rw [] \\
3204 Q.PAT_X_ASSUM ‘SND (h n) = interval[a0,b0]’
3205 (fn th => FULL_SIMP_TAC std_ss [th, INTERVAL_UPPERBOUND_NONEMPTY,
3206 IN_INTERVAL])) \\
3207 CCONTR_TAC >> FULL_SIMP_TAC bool_ss [GSYM real_lt] \\
3208 ‘interval_lowerbound (SND (h n)) < interval_lowerbound (SND (h (SUC n)))’ by rw [] \\
3209 (* stage work *)
3210 ‘h n IN p /\ h (SUC n) IN p /\ 0 < content (SND (h (SUC n)))’ by PROVE_TAC [] \\
3211 Q.PAT_X_ASSUM ‘!x1 k1 x2 k2. (x1,k1) IN p /\ (x2,k2) IN p /\ _ ==> P’
3212 (MP_TAC o (Q.SPECL [‘FST ((h :num -> real # (real set)) n)’,
3213 ‘SND ((h :num -> real # (real set)) n)’,
3214 ‘FST ((h :num -> real # (real set)) (SUC n))’,
3215 ‘SND ((h :num -> real # (real set)) (SUC n))’])) \\
3216 simp [GSYM DISJOINT_DEF] \\
3217 Know ‘SND (h n) <> SND (h (SUC n))’ >- (CCONTR_TAC >> fs []) >> Rewr \\
3218 Q.PAT_ASSUM ‘!x k. (x,k) IN p ==> _’
3219 (MP_TAC o (Q.SPECL [‘FST ((h :num -> real # (real set)) n)’,
3220 ‘SND ((h :num -> real # (real set)) n)’])) >> rw [] \\
3221 rename1 ‘SND (h n) = interval [a0,b0]’ \\
3222 Know ‘interval [a0,b0] <> {}’
3223 >- (rw [GSYM MEMBER_NOT_EMPTY] \\
3224 Q.EXISTS_TAC ‘FST (h n)’ \\
3225 Know ‘(FST (h n),SND (h n)) IN p’ >- rw [] \\
3226 METIS_TAC []) >> DISCH_TAC \\
3227 ‘a0 <= b0’ by PROVE_TAC [INTERVAL_NE_EMPTY] \\
3228 Q.PAT_X_ASSUM ‘SND (h n) = interval[a0,b0]’
3229 (fn th => FULL_SIMP_TAC std_ss [th, INTERVAL_UPPERBOUND_NONEMPTY,
3230 INTERVAL_LOWERBOUND_NONEMPTY]) \\
3231 Q.PAT_ASSUM ‘!x k. (x,k) IN p ==> _’
3232 (MP_TAC o (Q.SPECL [‘FST ((h :num -> real # (real set)) (SUC n))’,
3233 ‘SND ((h :num -> real # (real set)) (SUC n))’])) \\
3234 rw [] >> rename1 ‘SND (h (SUC n)) = interval [a1,b1]’ \\
3235 Know ‘interval [a1,b1] <> {}’
3236 >- (rw [GSYM MEMBER_NOT_EMPTY] \\
3237 Q.EXISTS_TAC ‘FST (h (SUC n))’ \\
3238 Know ‘(FST (h (SUC n)),SND (h (SUC n))) IN p’ >- rw [] \\
3239 METIS_TAC []) >> DISCH_TAC \\
3240 ‘a1 <= b1’ by PROVE_TAC [INTERVAL_NE_EMPTY] \\
3241 Q.PAT_X_ASSUM ‘SND (h (SUC n)) = interval[a1,b1]’
3242 (fn th => FULL_SIMP_TAC std_ss [th, INTERVAL_LOWERBOUND_NONEMPTY,
3243 CONTENT_CLOSED_INTERVAL, REAL_SUB_LT]) \\
3244 rw [DISJOINT_ALT, INTERIOR_CLOSED_INTERVAL, IN_INTERVAL] \\
3245 (* ordering: a0 < a1 < b0,b1 *)
3246 Know ‘?z. max a0 a1 < z /\ z < min b0 b1’
3247 >- (MATCH_MP_TAC REAL_MEAN >> rw [REAL_MAX_LT, REAL_LT_MIN] \\ (* 2 subgoals *)
3248 MATCH_MP_TAC REAL_LT_TRANS >> Q.EXISTS_TAC ‘a1’ >> art []) \\
3249 RW_TAC std_ss [REAL_MAX_LT, REAL_LT_MIN] \\
3250 Q.EXISTS_TAC ‘z’ >> art [] ] ])
3251 >> DISCH_TAC
3252 (* advanced h-properties *)
3253 >> Know ‘!n. n < N /\ SUC n < N ==>
3254 interval_lowerbound (SND (h (SUC n))) = interval_upperbound (SND (h n))’
3255 >- (rpt STRIP_TAC \\
3256 Q.PAT_X_ASSUM ‘L = IMAGE h (count N)’ K_TAC (* not needed here *) \\
3257 ‘interval_lowerbound (SND (h n)) < interval_lowerbound (SND (h (SUC n)))’ by rw [] \\
3258 ‘h n IN p /\ h (SUC n) IN p /\
3259 0 < content (SND (h n)) /\ 0 < content (SND (h (SUC n)))’ by PROVE_TAC [] \\
3260 Q.PAT_ASSUM ‘!x k. (x,k) IN p ==> x IN k /\ _’
3261 (MP_TAC o (Q.SPECL [‘FST ((h :num -> real # (real set)) n)’,
3262 ‘SND ((h :num -> real # (real set)) n)’])) \\
3263 simp [] >> STRIP_TAC >> rename1 ‘SND (h n) = interval [a0,b0]’ \\
3264 Know ‘interval [a0,b0] <> {}’
3265 >- (rw [GSYM MEMBER_NOT_EMPTY] \\
3266 Q.EXISTS_TAC ‘FST (h n)’ \\
3267 Know ‘(FST (h n),SND (h n)) IN p’ >- rw [] \\
3268 METIS_TAC []) >> DISCH_TAC \\
3269 ‘a0 <= b0’ by PROVE_TAC [INTERVAL_NE_EMPTY] \\
3270 Q.PAT_ASSUM ‘!x k. (x,k) IN p ==> x IN k /\ _’
3271 (MP_TAC o (Q.SPECL [‘FST ((h :num -> real # (real set)) (SUC n))’,
3272 ‘SND ((h :num -> real # (real set)) (SUC n))’])) \\
3273 simp [] >> STRIP_TAC >> rename1 ‘SND (h (SUC n)) = interval [a1,b1]’ \\
3274 Know ‘interval [a1,b1] <> {}’
3275 >- (rw [GSYM MEMBER_NOT_EMPTY] \\
3276 Q.EXISTS_TAC ‘FST (h (SUC n))’ \\
3277 Know ‘(FST (h (SUC n)),SND (h (SUC n))) IN p’ >- rw [] \\
3278 METIS_TAC []) >> DISCH_TAC \\
3279 ‘a1 <= b1’ by PROVE_TAC [INTERVAL_NE_EMPTY] \\
3280 (* move two assumptions to the bottom to use fs[] *)
3281 Q.PAT_X_ASSUM ‘SND (h n) = interval [a0,b0]’ ASSUME_TAC \\
3282 Q.PAT_X_ASSUM ‘SND (h (SUC n)) = interval [a1,b1]’ ASSUME_TAC \\
3283 FULL_SIMP_TAC bool_ss [INTERVAL_UPPERBOUND_NONEMPTY,
3284 INTERVAL_LOWERBOUND_NONEMPTY,
3285 INTERIOR_CLOSED_INTERVAL, SUBSET_INTERVAL,
3286 IN_INTERVAL, CONTENT_CLOSED_INTERVAL, REAL_SUB_LT] \\
3287 Q.PAT_X_ASSUM ‘a0 <= b0’ K_TAC \\
3288 Q.PAT_X_ASSUM ‘a1 <= b1’ K_TAC \\
3289 CCONTR_TAC (* ordering: a0 <= b0 .. a1 <= b1 *) \\
3290 ‘a1 < b0 \/ b0 < a1’ by PROVE_TAC [REAL_LT_TOTAL] (* 2 subgoals, first easier *)
3291 >- (Q.PAT_X_ASSUM ‘a1 <> b0’ K_TAC \\
3292 ‘a1 < min b0 b1’ by rw [REAL_LT_MIN] (* a0 <= a1 < b0|b1 *) \\
3293 ‘?z. a1 < z /\ z < min b0 b1’ by METIS_TAC [REAL_MEAN] \\
3294 ‘a0 < z’ by PROVE_TAC [REAL_LT_TRANS] \\
3295 Q.PAT_ASSUM ‘!x1 k1 x2 k2. (x1,k1) IN p /\ (x2,k2) IN p /\ _ ==> P’
3296 (MP_TAC o (Q.SPECL [‘FST ((h :num -> real # (real set)) n)’,
3297 ‘SND ((h :num -> real # (real set)) n)’,
3298 ‘FST ((h :num -> real # (real set)) (SUC n))’,
3299 ‘SND ((h :num -> real # (real set)) (SUC n))’])) \\
3300 simp [GSYM DISJOINT_DEF, EQ_INTERVAL, REAL_LT_IMP_NE] \\
3301 rw [DISJOINT_ALT, INTERIOR_CLOSED_INTERVAL, IN_INTERVAL] \\
3302 Q.EXISTS_TAC ‘z’ >> fs [REAL_LT_MIN]) \\
3303 (* ordering: a0 .. b0 < a1 < b1 *)
3304 Q.PAT_X_ASSUM ‘a1 <> b0’ K_TAC \\
3305 (* choose a good point *)
3306 Q.ABBREV_TAC ‘y = CHOICE (interval(b0,a1) DIFF Z)’ \\
3307 Know ‘y IN interval(b0,a1) DIFF Z’
3308 >- (Q.UNABBREV_TAC ‘y’ >> MATCH_MP_TAC CHOICE_DEF \\
3309 MATCH_MP_TAC INFINITE_DIFF_FINITE >> art [] \\
3310 ‘interval(b0,a1) <> {}’ by PROVE_TAC [INTERVAL_NE_EMPTY] \\
3311 PROVE_TAC [finite_countable, UNCOUNTABLE_INTERVAL]) >> DISCH_TAC \\
3312 ‘y NOTIN Z’ by (Q.PAT_X_ASSUM ‘y IN interval(b0,a1) DIFF Z’ MP_TAC >> rw []) \\
3313 Know ‘b0 < y /\ y < a1’
3314 >- (Q.PAT_X_ASSUM ‘y IN interval(b0,a1) DIFF Z’ MP_TAC \\
3315 rw [IN_DIFF, IN_INTERVAL]) >> STRIP_TAC \\
3316 (* now find the "impossible" division covering y *)
3317 Q.PAT_X_ASSUM ‘BIGUNION _ = interval [a,b]’ MP_TAC \\
3318 simp [Once EXTENSION, IN_INTERVAL, IN_BIGUNION, Abbr ‘E’] \\
3319 CCONTR_TAC >> FULL_SIMP_TAC bool_ss [] \\
3320 POP_ASSUM (MP_TAC o (Q.SPEC ‘y’)) \\
3321 Know ‘a <= y /\ y <= b’
3322 >- (METIS_TAC [REAL_LE_TRANS, REAL_LET_TRANS, REAL_LT_IMP_LE]) >> Rewr \\
3323 CCONTR_TAC >> FULL_SIMP_TAC bool_ss [] >> rename1 ‘(x,s) IN p’ \\
3324 ‘x IN Z’ by (rw [Abbr ‘Z’] >> Q.EXISTS_TAC ‘s’ >> art []) \\
3325 Know ‘(x,s) IN L’
3326 >- (simp [Abbr ‘L’] (* now ‘0 < content s’ *) \\
3327 Q.PAT_X_ASSUM ‘!x k. (x,k) IN p ==> x IN k /\ _’ (MP_TAC o (Q.SPECL [‘x’, ‘s’])) \\
3328 simp [] >> STRIP_TAC >> rename1 ‘s = interval[a2,b2]’ \\
3329 ‘interval [a2,b2] <> {}’ by METIS_TAC [MEMBER_NOT_EMPTY] \\
3330 ‘a2 <= b2’ by PROVE_TAC [INTERVAL_NE_EMPTY] \\
3331 Suff ‘content (interval[a2,b2]) <> 0’
3332 >- (rw [REAL_LT_LE, CONTENT_POS_LE]) \\
3333 CCONTR_TAC >> FULL_SIMP_TAC bool_ss [CONTENT_EQ_0] \\
3334 ‘b2 = a2’ by PROVE_TAC [REAL_LE_ANTISYM] \\
3335 fs [INTERVAL_SING, IN_SING]) >> DISCH_TAC \\
3336 Know ‘0 < content s’
3337 >- (POP_ASSUM MP_TAC >> simp [Abbr ‘L’]) >> DISCH_TAC \\
3338 ‘?m. m < N /\ (x,s) = h m’ by METIS_TAC [] (* this ‘m’ is between ‘n’ and ‘SUC n’ *) \\
3339 Q.PAT_ASSUM ‘!x k. (x,k) IN p ==> x IN k /\ _’ (MP_TAC o (Q.SPECL [‘x’, ‘s’])) \\
3340 simp [] >> CCONTR_TAC >> FULL_SIMP_TAC bool_ss [] \\
3341 rename1 ‘s = interval [a2,b2]’ \\
3342 ‘interval [a2,b2] <> {}’ by PROVE_TAC [MEMBER_NOT_EMPTY] \\
3343 ‘a2 <= b2’ by PROVE_TAC [INTERVAL_NE_EMPTY] \\
3344 Q.PAT_X_ASSUM ‘s = interval [a2,b2]’
3345 (fn th => FULL_SIMP_TAC bool_ss [th, SUBSET_INTERVAL, IN_INTERVAL,
3346 CONTENT_CLOSED_INTERVAL, REAL_SUB_LT]) \\
3347 Q.PAT_X_ASSUM ‘a2 <= b2’ K_TAC \\
3348 Know ‘SND (h m) = interval[a2,b2]’
3349 >- (Q.PAT_X_ASSUM ‘(x,interval[a2,b2]) = h m’
3350 (ONCE_REWRITE_TAC o wrap o SYM) >> rw []) >> DISCH_TAC \\
3351 Q.PAT_X_ASSUM ‘(x,interval[a2,b2]) = h m’ K_TAC \\
3352 (* ordering: a0 < b0 .. a2 < y < b2 .. a1 < b1 *)
3353 Suff ‘b0 <= a2 /\ b2 <= a1’
3354 >- (STRIP_TAC \\
3355 ‘a0 < a2 /\ a2 < a1’ by PROVE_TAC [REAL_LET_TRANS, REAL_LTE_TRANS] \\
3356 Know ‘n <= m’
3357 >- (SPOSE_NOT_THEN (ASSUME_TAC o (REWRITE_RULE [NOT_LESS_EQUAL])) \\
3358 Q.PAT_X_ASSUM ‘!i j. i < N /\ j < N /\ i < j ==> P’
3359 (MP_TAC o (Q.SPECL [‘m’, ‘n’])) \\
3360 simp [INTERVAL_LOWERBOUND_NONEMPTY] \\
3361 METIS_TAC [REAL_LT_ANTISYM]) >> DISCH_TAC \\
3362 Know ‘m <= SUC n’
3363 >- (SPOSE_NOT_THEN (ASSUME_TAC o (REWRITE_RULE [NOT_LESS_EQUAL])) \\
3364 Q.PAT_X_ASSUM ‘!i j. i < N /\ j < N /\ i < j ==> P’
3365 (MP_TAC o (Q.SPECL [‘SUC n’, ‘m’])) \\
3366 simp [INTERVAL_LOWERBOUND_NONEMPTY] \\
3367 METIS_TAC [REAL_LT_ANTISYM]) >> DISCH_TAC \\
3368 Know ‘m = n \/ m = SUC n’
3369 >- (MATCH_MP_TAC
3370 (ARITH_PROVE “n <= m /\ m <= SUC n ==> m = n \/ m = SUC n”) >> art []) \\
3371 STRIP_TAC >> gs [EQ_INTERVAL]) \\
3372 CONJ_TAC \\
3373 SPOSE_NOT_THEN (ASSUME_TAC o (REWRITE_RULE [GSYM real_lt])) >| (* 2 subgoals *)
3374 [ (* goal 1.1 (of 2): a2 < b0 |- F, order: a0|a2 < b0|b2 *)
3375 Know ‘max a0 a2 < min b0 b2’
3376 >- (simp [REAL_LT_MIN, REAL_MAX_LT] \\
3377 MATCH_MP_TAC REAL_LTE_TRANS >> Q.EXISTS_TAC ‘y’ >> art [] \\
3378 MATCH_MP_TAC REAL_LT_TRANS >> Q.EXISTS_TAC ‘b0’ >> art []) >> DISCH_TAC \\
3379 ‘?z. max a0 a2 < z /\ z < min b0 b2’ by METIS_TAC [REAL_MEAN] \\
3380 Q.PAT_ASSUM ‘!x1 k1 x2 k2. (x1,k1) IN p /\ (x2,k2) IN p /\ _ ==> P’
3381 (MP_TAC o (Q.SPECL [‘FST ((h :num -> real # (real set)) n)’,
3382 ‘SND ((h :num -> real # (real set)) n)’,
3383 ‘FST ((h :num -> real # (real set)) m)’,
3384 ‘SND ((h :num -> real # (real set)) m)’])) \\
3385 simp [GSYM DISJOINT_DEF, EQ_INTERVAL] \\
3386 Know ‘b0 <> b2’ >- (CCONTR_TAC >> METIS_TAC [REAL_LET_ANTISYM]) >> Rewr \\
3387 rw [DISJOINT_ALT, INTERIOR_CLOSED_INTERVAL, IN_INTERVAL] \\
3388 Q.EXISTS_TAC ‘z’ >> fs [REAL_LT_MIN, REAL_MAX_LT],
3389 (* goal 1.2 (of 2): a1 < b2 |- F, order: a2|a1 < b2|b1 *)
3390 Know ‘max a2 a1 < min b2 b1’
3391 >- (simp [REAL_LT_MIN, REAL_MAX_LT] \\
3392 MATCH_MP_TAC REAL_LET_TRANS >> Q.EXISTS_TAC ‘y’ >> art [] \\
3393 MATCH_MP_TAC REAL_LT_TRANS >> Q.EXISTS_TAC ‘a1’ >> art []) >> DISCH_TAC \\
3394 ‘?z. max a2 a1 < z /\ z < min b2 b1’ by METIS_TAC [REAL_MEAN] \\
3395 Q.PAT_ASSUM ‘!x1 k1 x2 k2. (x1,k1) IN p /\ (x2,k2) IN p /\ _ ==> P’
3396 (MP_TAC o (Q.SPECL [‘FST ((h :num -> real # (real set)) m)’,
3397 ‘SND ((h :num -> real # (real set)) m)’,
3398 ‘FST ((h :num -> real # (real set)) (SUC n))’,
3399 ‘SND ((h :num -> real # (real set)) (SUC n))’])) \\
3400 simp [GSYM DISJOINT_DEF, EQ_INTERVAL] \\
3401 Know ‘a2 <> a1’ >- (CCONTR_TAC >> METIS_TAC [REAL_LET_ANTISYM]) >> Rewr \\
3402 rw [DISJOINT_ALT, INTERIOR_CLOSED_INTERVAL, IN_INTERVAL] \\
3403 Q.EXISTS_TAC ‘z’ >> fs [REAL_LT_MIN, REAL_MAX_LT] ])
3404 >> DISCH_TAC
3405 (* advanced h-properties *)
3406 >> Know ‘!n. n < N /\ ~(SUC n < N) ==> interval_upperbound (SND (h n)) = b’
3407 >- (rpt STRIP_TAC \\
3408 Q.PAT_X_ASSUM ‘L = IMAGE h (count N)’ K_TAC (* not needed here *) \\
3409 Q.PAT_X_ASSUM ‘tdiv (a,b) (D,t)’ K_TAC \\
3410 qunabbrevl_tac [‘D’, ‘t’] \\
3411 Q.PAT_X_ASSUM ‘BIGUNION _ = interval [a,b]’ MP_TAC \\
3412 rw [Once EXTENSION, IN_INTERVAL, IN_BIGUNION, Abbr ‘E’] \\
3413 ‘h n IN p /\ 0 < content (SND (h n))’ by PROVE_TAC [] \\
3414 Q.PAT_ASSUM ‘!x k. (x,k) IN p ==> x IN k /\ _’
3415 (MP_TAC o (Q.SPECL [‘FST ((h :num -> real # (real set)) n)’,
3416 ‘SND ((h :num -> real # (real set)) n)’])) >> rw [] \\
3417 rename1 ‘SND (h n) = interval [a0,b0]’ \\
3418 Know ‘interval [a0,b0] <> {}’
3419 >- (rw [GSYM MEMBER_NOT_EMPTY] >> Q.EXISTS_TAC ‘FST (h n)’ \\
3420 Know ‘(FST (h n),SND (h n)) IN p’ >- rw [] \\
3421 METIS_TAC []) >> DISCH_TAC \\
3422 ‘a0 <= b0’ by PROVE_TAC [INTERVAL_NE_EMPTY] \\
3423 FULL_SIMP_TAC bool_ss [INTERVAL_UPPERBOUND_NONEMPTY, SUBSET_INTERVAL,
3424 CONTENT_CLOSED_INTERVAL, REAL_SUB_LT] (* b0 = b *) \\
3425 CCONTR_TAC >> ‘b < b0 \/ b0 < b’ by PROVE_TAC [REAL_LT_TOTAL] (* 2 subgoals *)
3426 >- (Q.PAT_X_ASSUM ‘b0 <> b’ K_TAC \\
3427 Q.PAT_X_ASSUM ‘!x. _ <=> a <= x /\ x <= b’ (MP_TAC o (Q.SPEC ‘b0’)) \\
3428 Suff ‘?s. b0 IN s /\ ?x. (x,s) IN p’ >- (Rewr >> rw [GSYM real_lt]) \\
3429 Q.EXISTS_TAC ‘SND (h n)’ \\
3430 ONCE_REWRITE_TAC [CONJ_COMM] \\
3431 CONJ_TAC >- (Q.EXISTS_TAC ‘FST (h n)’ >> rw []) \\
3432 Q.PAT_X_ASSUM ‘SND (h n) = interval _’ (ONCE_REWRITE_TAC o wrap) \\
3433 rw [IN_INTERVAL]) \\
3434 Q.PAT_X_ASSUM ‘b0 <> b’ K_TAC \\
3435 (* stage work *)
3436 ‘a <= b0’ by PROVE_TAC [REAL_LE_TRANS] \\
3437 Q.ABBREV_TAC ‘y = CHOICE (interval(b0,b) DIFF Z)’ \\
3438 Know ‘y IN interval(b0,b) DIFF Z’
3439 >- (Q.UNABBREV_TAC ‘y’ >> MATCH_MP_TAC CHOICE_DEF \\
3440 MATCH_MP_TAC INFINITE_DIFF_FINITE >> art [] \\
3441 ‘interval(b0,b) <> {}’ by PROVE_TAC [INTERVAL_NE_EMPTY] \\
3442 PROVE_TAC [finite_countable, UNCOUNTABLE_INTERVAL]) >> DISCH_TAC \\
3443 Know ‘b0 < y /\ y < b’
3444 >- (POP_ASSUM MP_TAC >> rw [IN_DIFF, IN_INTERVAL]) >> STRIP_TAC \\
3445 ‘a < y’ by PROVE_TAC [REAL_LET_TRANS] \\
3446 Q.PAT_X_ASSUM ‘!x. _ <=> a <= x /\ x <= b’ (MP_TAC o (Q.SPEC ‘y’)) \\
3447 Know ‘a <= y /\ y <= b’ >- PROVE_TAC [REAL_LT_IMP_LE] >> Rewr \\
3448 CCONTR_TAC >> FULL_SIMP_TAC bool_ss [] >> rename1 ‘(x,s) IN p’ \\
3449 ‘x IN Z’ by (rw [Abbr ‘Z’] >> Q.EXISTS_TAC ‘s’ >> art []) \\
3450 (* now we show that (x,s) IN L. But first of all, ‘s’ cannot be degenerate,
3451 since otherwise we will have x = y, but this is impossible. *)
3452 Know ‘(x,s) IN L’
3453 >- (rw [Abbr ‘L’] (* now ‘0 < content s’ *) \\
3454 Q.PAT_X_ASSUM ‘!x k. (x,k) IN p ==> x IN k /\ _’ (MP_TAC o (Q.SPECL [‘x’, ‘s’])) \\
3455 RW_TAC std_ss [] >> rename1 ‘(x,interval[a1,b1]) IN p’ \\
3456 ‘interval [a1,b1] <> {}’ by METIS_TAC [MEMBER_NOT_EMPTY] \\
3457 ‘a1 <= b1’ by PROVE_TAC [INTERVAL_NE_EMPTY] \\
3458 Suff ‘content (interval[a1,b1]) <> 0’
3459 >- (rw [REAL_LT_LE, CONTENT_POS_LE]) \\
3460 CCONTR_TAC >> FULL_SIMP_TAC bool_ss [CONTENT_EQ_0] \\
3461 ‘b1 = a1’ by PROVE_TAC [REAL_LE_ANTISYM] \\
3462 fs [INTERVAL_SING, IN_SING]) >> DISCH_TAC \\
3463 ‘?m. m < N /\ (x,s) = h m’ by METIS_TAC [] \\
3464 (* ordering: (a, y, [a0,b0], b) *)
3465 ‘m = n \/ m < n’ by rw []
3466 >- (Know ‘s = SND (h m)’
3467 >- (Q.PAT_X_ASSUM ‘(x,s) = h m’ (ONCE_REWRITE_TAC o wrap o SYM) >> rw []) \\
3468 DISCH_TAC \\
3469 Know ‘y IN interval [a0,b0]’ >- METIS_TAC [] \\
3470 fs [IN_INTERVAL, GSYM real_lt]) \\
3471 Q.PAT_X_ASSUM ‘!x k. (x,k) IN p ==> x IN k /\ _’ (MP_TAC o (Q.SPECL [‘x’,‘s’])) \\
3472 RW_TAC std_ss [] \\
3473 CCONTR_TAC >> FULL_SIMP_TAC bool_ss [] >> rename1 ‘s = interval[a1,b1]’ \\
3474 ‘interval [a1,b1] <> {}’ by METIS_TAC [MEMBER_NOT_EMPTY] \\
3475 ‘a1 <= b1’ by PROVE_TAC [INTERVAL_NE_EMPTY] \\
3476 (* stage work *)
3477 Know ‘interval_lowerbound (SND (h m)) < interval_lowerbound (SND (h n))’ >- rw [] \\
3478 Know ‘SND (h m) = interval[a1,b1]’
3479 >- (Q.PAT_X_ASSUM ‘(x,s) = h m’ (ONCE_REWRITE_TAC o wrap o SYM) >> rw []) \\
3480 DISCH_TAC >> art [] >> Q.PAT_X_ASSUM ‘(x,s) = h m’ K_TAC \\
3481 rw [INTERVAL_LOWERBOUND_NONEMPTY, real_lt] \\
3482 FULL_SIMP_TAC bool_ss [SUBSET_INTERVAL, IN_INTERVAL] \\
3483 SPOSE_NOT_THEN (ASSUME_TAC o (REWRITE_RULE [GSYM real_lt])) (* a1 < a0 *) \\
3484 ‘b0 < b1’ by PROVE_TAC [REAL_LTE_TRANS] \\
3485 (* ordering: (a1, (a0, b0), b1) *)
3486 Q.PAT_ASSUM ‘!x1 k1 x2 k2. (x1,k1) IN p /\ (x2,k2) IN p /\ _ ==> P’
3487 (MP_TAC o (Q.SPECL [‘FST ((h :num -> real # (real set)) m)’,
3488 ‘SND ((h :num -> real # (real set)) m)’,
3489 ‘FST ((h :num -> real # (real set)) n)’,
3490 ‘SND ((h :num -> real # (real set)) n)’])) \\
3491 simp [GSYM DISJOINT_DEF, EQ_INTERVAL] \\
3492 Know ‘a1 <> a0’ >- (CCONTR_TAC >> METIS_TAC [REAL_LT_IMP_NE]) >> Rewr \\
3493 rw [DISJOINT_ALT, INTERIOR_CLOSED_INTERVAL, IN_INTERVAL] \\
3494 ‘?z. a0 < z /\ z < b0’ by METIS_TAC [REAL_MEAN] \\
3495 Q.EXISTS_TAC ‘z’ >> rw [] >| (* 2 subgoals *)
3496 [ (* goal 1 (of 2) *)
3497 MATCH_MP_TAC REAL_LT_TRANS >> Q.EXISTS_TAC ‘a0’ >> art [],
3498 (* goal 2 (of 2) *)
3499 MATCH_MP_TAC REAL_LT_TRANS >> Q.EXISTS_TAC ‘b0’ >> art [] ])
3500 >> DISCH_TAC
3501 (* stage work *)
3502 >> Know ‘dsize D = N /\ fine g (D,t)’
3503 >- (Q.PAT_X_ASSUM ‘tdiv (a,b) (D,t)’ MP_TAC \\
3504 Q.PAT_X_ASSUM ‘d FINE p’ MP_TAC \\
3505 Q.PAT_X_ASSUM ‘L = IMAGE h (count N)’ K_TAC (* not needed here *) \\
3506 SIMP_TAC std_ss [tdiv, division, fine, FINE] >> NTAC 2 STRIP_TAC \\
3507 rename1 ‘!n. n >= M ==> D n = b’ \\
3508 Know ‘M = N’
3509 >- (CCONTR_TAC >> ‘N < M \/ M < N’ by fs []
3510 >- (Q.PAT_X_ASSUM ‘!n. n < M ==> D n < D (SUC n)’ (MP_TAC o (Q.SPEC ‘N’)) \\
3511 ‘D N = b /\ D (SUC N) = b’ by rw [Abbr ‘D’] >> rw []) \\
3512 ‘h M IN p /\ 0 < content (SND (h M))’ by PROVE_TAC [] \\
3513 Q.PAT_ASSUM ‘!x k. (x,k) IN p ==> x IN k /\ _’
3514 (MP_TAC o (Q.SPECL [‘FST ((h :num -> real # (real set)) M)’,
3515 ‘SND ((h :num -> real # (real set)) M)’])) \\
3516 rw [] >> CCONTR_TAC >> fs [] \\
3517 rename1 ‘SND (h M) = interval [a0,b0]’ \\
3518 Know ‘interval [a0,b0] <> {}’
3519 >- (rw [GSYM MEMBER_NOT_EMPTY] \\
3520 Q.EXISTS_TAC ‘FST (h M)’ \\
3521 Know ‘(FST (h M),SND (h M)) IN p’ >- rw [] \\
3522 METIS_TAC []) >> DISCH_TAC \\
3523 ‘a0 <= b0’ by PROVE_TAC [INTERVAL_NE_EMPTY] \\
3524 Know ‘interval_lowerbound (SND (h M)) = D M’
3525 >- (Q.UNABBREV_TAC ‘D’ >> BETA_TAC >> art []) \\
3526 ‘D M = b’ by rw [Abbr ‘D’] >> POP_ASSUM (REWRITE_TAC o wrap) \\
3527 Q.PAT_X_ASSUM ‘SND (h M) = interval[a0,b0]’
3528 (fn th => FULL_SIMP_TAC std_ss [th, CONTENT_CLOSED_INTERVAL, SUBSET_INTERVAL,
3529 INTERVAL_LOWERBOUND_NONEMPTY, REAL_SUB_LT]) \\
3530 CCONTR_TAC >> METIS_TAC [REAL_LET_ANTISYM]) \\
3531 DISCH_THEN (FULL_SIMP_TAC bool_ss o wrap) \\
3532 STRONG_CONJ_TAC (* dsize D = N *)
3533 >- (REWRITE_TAC [dsize] >> SELECT_ELIM_TAC \\
3534 CONJ_TAC >- (Q.EXISTS_TAC ‘N’ >> rw []) \\
3535 Q.X_GEN_TAC ‘M’ >> rpt STRIP_TAC \\
3536 CCONTR_TAC >> ‘N < M \/ M < N’ by fs []
3537 >- (‘D N = b /\ D (SUC N) = b’ by rw [Abbr ‘D’] \\
3538 Q.PAT_X_ASSUM ‘!n. n < M ==> D n < D (SUC n)’ (MP_TAC o (Q.SPEC ‘N’)) \\
3539 rw []) \\
3540 ‘h M IN p /\ 0 < content (SND (h M))’ by PROVE_TAC [] \\
3541 Q.PAT_ASSUM ‘!x k. (x,k) IN p ==> x IN k /\ _’
3542 (MP_TAC o (Q.SPECL [‘FST ((h :num -> real # (real set)) M)’,
3543 ‘SND ((h :num -> real # (real set)) M)’])) \\
3544 rw [] >> CCONTR_TAC >> fs [] \\
3545 rename1 ‘SND (h M) = interval [a0,b0]’ \\
3546 Know ‘interval [a0,b0] <> {}’
3547 >- (rw [GSYM MEMBER_NOT_EMPTY] \\
3548 Q.EXISTS_TAC ‘FST (h M)’ \\
3549 Know ‘(FST (h M),SND (h M)) IN p’ >- rw [] \\
3550 METIS_TAC []) >> DISCH_TAC \\
3551 ‘a0 <= b0’ by PROVE_TAC [INTERVAL_NE_EMPTY] \\
3552 Know ‘interval_lowerbound (SND (h M)) = D M’
3553 >- (Q.UNABBREV_TAC ‘D’ >> BETA_TAC >> art []) \\
3554 Know ‘D M = b’ (* here the difference *)
3555 >- (FIRST_X_ASSUM MATCH_MP_TAC \\
3556 Q.EXISTS_TAC ‘N’ >> rw []) >> DISCH_THEN (REWRITE_TAC o wrap) \\
3557 Q.PAT_X_ASSUM ‘SND (h M) = interval[a0,b0]’
3558 (fn th => FULL_SIMP_TAC std_ss [th, CONTENT_CLOSED_INTERVAL, SUBSET_INTERVAL,
3559 INTERVAL_LOWERBOUND_NONEMPTY, REAL_SUB_LT]) \\
3560 CCONTR_TAC >> METIS_TAC [REAL_LET_ANTISYM]) \\
3561 DISCH_THEN (FULL_SIMP_TAC bool_ss o wrap) \\
3562 (* stage work: !n. n < N ==> D (SUC n) - D n < g (t n) *)
3563 rpt STRIP_TAC \\
3564 ‘D n = interval_lowerbound (SND (h n))’ by rw [Abbr ‘D’] >> POP_ORW \\
3565 Know ‘D (SUC n) = interval_upperbound (SND (h n))’
3566 >- (Cases_on ‘SUC n < N’ >| (* 2 subgoals *)
3567 [ (* goal 1 (of 2) *)
3568 ‘D (SUC n) = interval_lowerbound (SND (h (SUC n)))’ by rw [Abbr ‘D’] >> POP_ORW \\
3569 FIRST_X_ASSUM MATCH_MP_TAC >> art [],
3570 (* goal 2 (of 2) *)
3571 ‘D (SUC n) = b’ by rw [Abbr ‘D’] >> POP_ORW \\
3572 ONCE_REWRITE_TAC [EQ_SYM_EQ] \\
3573 FIRST_X_ASSUM MATCH_MP_TAC >> art [] ]) >> Rewr' \\
3574 (* stage work *)
3575 ‘h n IN p’ by PROVE_TAC [] \\
3576 Q.PAT_X_ASSUM ‘!x k. (x,k) IN p ==> x IN k /\ _’
3577 (MP_TAC o (Q.SPECL [‘FST ((h :num -> real # (real set)) n)’,
3578 ‘SND ((h :num -> real # (real set)) n)’])) \\
3579 Q.PAT_X_ASSUM ‘!x k. (x,k) IN p ==> k SUBSET (d x)’
3580 (MP_TAC o (Q.SPECL [‘FST ((h :num -> real # (real set)) n)’,
3581 ‘SND ((h :num -> real # (real set)) n)’])) \\
3582 simp [Abbr ‘t’] >> rpt STRIP_TAC \\
3583 rename1 ‘SND (h n) = interval [a0,b0]’ \\
3584 ‘interval [a0,b0] <> {}’ by METIS_TAC [MEMBER_NOT_EMPTY] \\
3585 ‘a0 <= b0’ by PROVE_TAC [INTERVAL_NE_EMPTY] \\
3586 Q.ABBREV_TAC ‘x = FST (h n)’ \\
3587 Q.PAT_X_ASSUM ‘SND (h n) = interval [a0,b0]’
3588 (fn th => FULL_SIMP_TAC std_ss [th, SUBSET_INTERVAL, IN_INTERVAL,
3589 INTERVAL_UPPERBOUND_NONEMPTY,
3590 INTERVAL_LOWERBOUND_NONEMPTY]) \\
3591 ‘a <= x /\ x <= b’ by PROVE_TAC [REAL_LE_TRANS] \\
3592 Q.PAT_X_ASSUM ‘interval[a0,b0] SUBSET (d x)’ MP_TAC \\
3593 (* final stage using ‘d’ *)
3594 rw [Abbr ‘d’, Abbr ‘E’, BALL, SUBSET_INTERVAL] \\
3595 ‘-a0 < -(x - 1 / 2 * g x)’ by PROVE_TAC [REAL_LT_NEG] \\
3596 Know ‘b0 + -a0 < (x + 1 / 2 * g x) + -(x - 1 / 2 * g x)’
3597 >- (MATCH_MP_TAC REAL_LT_ADD2 >> art []) \\
3598 simp [GSYM real_sub, REAL_ARITH “a + b - (a - b) = 2 * b”])
3599 >> STRIP_TAC
3600 (* stage work *)
3601 >> Q.PAT_X_ASSUM ‘!D p. tdiv (a,b) (D,p) /\ fine g (D,p) ==> P’ drule_all
3602 (* convert all sums to SIGMA (REAL_SUM_IMAGE) *)
3603 >> simp [rsum, GSYM REAL_SUM_IMAGE_sum, GSYM REAL_SUM_IMAGE_COUNT]
3604 >> Suff ‘SIGMA (\n. f (t n) * (D (SUC n) - D n)) (count N) =
3605 SIGMA (\(x,k). f x * content k) p’ >- Rewr
3606 (* SIGMA ... (count N) = SIGMA ... p, but first we need to turn ‘p’ to ‘L’ *)
3607 >> Know ‘SIGMA (\(x,k). f x * content k) p = SIGMA (\(x,k). f x * content k) L’
3608 >- (Q.PAT_X_ASSUM ‘L = IMAGE h (count N)’ K_TAC (* not useful here *) \\
3609 Q.ABBREV_TAC ‘V = {(x,k) | (x,k) IN p /\ content k = 0}’ \\
3610 Know ‘FINITE V’
3611 >- (MATCH_MP_TAC SUBSET_FINITE_I >> Q.EXISTS_TAC ‘p’ \\
3612 rw [Abbr ‘V’, SUBSET_DEF] >> art []) >> DISCH_TAC \\
3613 Know ‘p = L UNION V’
3614 >- (rw [Once EXTENSION, Abbr ‘L’, Abbr ‘V’] >> Cases_on ‘x’ \\
3615 EQ_TAC >> STRIP_TAC >> fs [] >> rename1 ‘(x,k) IN p’ \\
3616 Q.PAT_X_ASSUM ‘!x k. (x,k) IN p ==> x IN k /\ _’ (MP_TAC o (Q.SPECL [‘x’, ‘k’])) \\
3617 simp [] >> STRIP_TAC >> rename1 ‘k = interval[a0,b0]’ \\
3618 ‘interval [a0,b0] <> {}’ by METIS_TAC [MEMBER_NOT_EMPTY] \\
3619 ‘a0 <= b0’ by PROVE_TAC [INTERVAL_NE_EMPTY] \\
3620 ‘0 <= content k’ by METIS_TAC [CONTENT_POS_LE] \\
3621 fs [REAL_LE_LT]) >> Rewr' \\
3622 Know ‘DISJOINT L V’
3623 >- (rw [Abbr ‘L’, Abbr ‘V’, DISJOINT_ALT] >> rename1 ‘(x,k) IN p’ \\
3624 CCONTR_TAC >> fs []) >> DISCH_TAC \\
3625 Know ‘SIGMA (\(x,k). f x * content k) (L UNION V) =
3626 SIGMA (\(x,k). f x * content k) L +
3627 SIGMA (\(x,k). f x * content k) V’
3628 >- (MATCH_MP_TAC REAL_SUM_IMAGE_DISJOINT_UNION >> art []) >> Rewr' \\
3629 Suff ‘SIGMA (\(x,k). f x * content k) V = 0’ >- rw [] \\
3630 rw [REAL_SUM_IMAGE_sum] >> MATCH_MP_TAC SUM_EQ_0' \\
3631 rw [Abbr ‘V’] >> rename1 ‘(x,k) IN p’ >> rw [])
3632 >> Rewr'
3633 (* finally this is used *)
3634 >> Q.PAT_X_ASSUM ‘L = IMAGE h (count N)’ (ONCE_REWRITE_TAC o wrap)
3635 >> Know ‘SIGMA (\(x,k). f x * content k) (IMAGE h (count N)) =
3636 SIGMA ((\(x,k). f x * content k) o h) (count N)’
3637 >- (irule REAL_SUM_IMAGE_IMAGE >> simp [INJ_DEF] \\
3638 qx_genl_tac [‘i’, ‘j’] >> rpt STRIP_TAC \\
3639 ‘h i IN p /\ h j IN p’ by PROVE_TAC [] \\
3640 Q.PAT_ASSUM ‘!x k. (x,k) IN p ==> x IN k /\ _’
3641 (MP_TAC o (Q.SPECL [‘FST ((h :num -> real # (real set)) i)’,
3642 ‘SND ((h :num -> real # (real set)) i)’])) \\
3643 simp [] >> STRIP_TAC >> rename1 ‘SND (h j) = interval[a0,b0]’ \\
3644 Know ‘interval [a0,b0] <> {}’
3645 >- (rw [GSYM MEMBER_NOT_EMPTY] \\
3646 Q.EXISTS_TAC ‘FST (h j)’ \\
3647 Know ‘(FST (h j),SND (h j)) IN p’ >- rw [] \\
3648 METIS_TAC []) >> DISCH_TAC \\
3649 ‘a0 <= b0’ by PROVE_TAC [INTERVAL_NE_EMPTY] \\
3650 CCONTR_TAC >> ‘i < j \/ j < i’ by rw [] >| (* 2 subgoals *)
3651 [ (* goal 1 (of 2) *)
3652 ‘interval_lowerbound (SND (h i)) < interval_lowerbound (SND (h j))’ by PROVE_TAC [] \\
3653 METIS_TAC [INTERVAL_LOWERBOUND_NONEMPTY, REAL_LT_REFL],
3654 (* goal 2 (of 2) *)
3655 ‘interval_lowerbound (SND (h j)) < interval_lowerbound (SND (h i))’ by PROVE_TAC [] \\
3656 METIS_TAC [INTERVAL_LOWERBOUND_NONEMPTY, REAL_LT_REFL] ])
3657 >> Rewr'
3658 >> MATCH_MP_TAC REAL_SUM_IMAGE_EQ >> simp [Abbr ‘t’]
3659 >> Q.X_GEN_TAC ‘n’ >> STRIP_TAC
3660 >> ‘h n IN p’ by PROVE_TAC []
3661 >> Q.PAT_ASSUM ‘!x k. (x,k) IN p ==> x IN k /\ _’
3662 (MP_TAC o (Q.SPECL [‘FST ((h :num -> real # (real set)) n)’,
3663 ‘SND ((h :num -> real # (real set)) n)’]))
3664 >> simp [] >> STRIP_TAC
3665 >> rename1 ‘SND (h n) = interval[a0,b0]’
3666 >> Know ‘interval [a0,b0] <> {}’
3667 >- (rw [GSYM MEMBER_NOT_EMPTY] \\
3668 Q.EXISTS_TAC ‘FST (h n)’ \\
3669 Know ‘(FST (h n),SND (h n)) IN p’ >- rw [] \\
3670 METIS_TAC [])
3671 >> DISCH_TAC
3672 >> ‘a0 <= b0’ by PROVE_TAC [INTERVAL_NE_EMPTY]
3673 >> Q.ABBREV_TAC ‘x = FST (h n)’
3674 >> Know ‘h n = (x,interval[a0,b0])’
3675 >- (rw [Abbr ‘x’] \\
3676 Q.PAT_X_ASSUM ‘SND (h n) = interval [a0,b0]’
3677 (ONCE_REWRITE_TAC o wrap o SYM) >> simp [])
3678 >> Rewr'
3679 >> ASM_SIMP_TAC std_ss [CONTENT_CLOSED_INTERVAL]
3680 >> Suff ‘D (SUC n) - D n = b0 - a0’ >- rw []
3681 >> Cases_on ‘SUC n < N’
3682 >- rw [Abbr ‘D’, INTERVAL_UPPERBOUND_NONEMPTY, INTERVAL_LOWERBOUND_NONEMPTY]
3683 (* ~(SUC n < N) *)
3684 >> rw [Abbr ‘D’, INTERVAL_LOWERBOUND_NONEMPTY]
3685 >> Suff ‘b0 = b’ >- rw []
3686 >> Know ‘interval_upperbound (SND (h n)) = b’
3687 >- (FIRST_X_ASSUM MATCH_MP_TAC >> art [])
3688 >> Q.PAT_X_ASSUM ‘SND (h n) = interval [a0,b0]’ (ONCE_REWRITE_TAC o wrap)
3689 >> simp [INTERVAL_UPPERBOUND_NONEMPTY]
3690QED
3691
3692Theorem lemma1[local] :
3693 !xs. FST xs IN SND xs /\ open (SND xs) ==> ?e. 0 < e /\ cball (FST xs,e) SUBSET (SND xs)
3694Proof
3695 rw [OPEN_CONTAINS_CBALL]
3696QED
3697
3698(* h is a cball generator of open sets *)
3699Theorem lemma2[local] :
3700 ?h. !x s. x IN s /\ open s ==> 0 < h(x,s) /\ cball (x,h(x,s)) SUBSET s
3701Proof
3702 STRIP_ASSUME_TAC (SIMP_RULE std_ss [EXT_SKOLEM_THM'] lemma1)
3703 >> Q.EXISTS_TAC ‘f’
3704 >> rpt STRIP_TAC
3705 >> Q.PAT_X_ASSUM ‘!xs. P’ (MP_TAC o (Q.SPEC ‘(x,s)’))
3706 >> rw []
3707QED
3708
3709(* Part 2: from new integrals to old integrals *)
3710Theorem has_integral_imp_Dint[local] :
3711 !f a b k. a < b /\ (f has_integral k) (interval[a,b]) ==> Dint(a,b) f k
3712Proof
3713 RW_TAC std_ss [Dint, has_integral]
3714 >> Q.PAT_X_ASSUM ‘!e. 0 < e ==> P’ (MP_TAC o (Q.SPEC ‘e’)) >> rw []
3715 >> Q.ABBREV_TAC ‘E = \x. a <= x /\ x <= b’
3716 (* Unlike the case of ‘Dint_imp_has_integral’, the most difficult part here
3717 is the construction of old gauges from new guages. *)
3718 >> STRIP_ASSUME_TAC lemma2 (* this asserts ‘h’ *)
3719 >> Q.ABBREV_TAC ‘cb = \x. cball (x,h(x,d x))’
3720 >> Q.ABBREV_TAC ‘g = \x. 1 / 2 * (interval_upperbound (cb x) - interval_lowerbound (cb x))’
3721 >> Q.EXISTS_TAC ‘g’
3722 >> STRONG_CONJ_TAC (* gauge E g *)
3723 >- (FULL_SIMP_TAC std_ss [gauge, gauge_def] \\
3724 rpt STRIP_TAC \\
3725 Q.PAT_X_ASSUM ‘!x. x IN d x /\ open (d x)’ (MP_TAC o (Q.SPEC ‘x’)) >> rw [] \\
3726 rw [Abbr ‘g’, Abbr ‘cb’, CBALL_INTERVAL, REAL_SUB_LT] \\
3727 Q.ABBREV_TAC ‘r = h (x,d x)’ \\
3728 ‘0 < r’ by rw [Abbr ‘r’] \\
3729 Know ‘x - r < x + r’
3730 >- (MATCH_MP_TAC REAL_LT_TRANS \\
3731 Q.EXISTS_TAC ‘x’ >> rw [REAL_LT_SUB_RADD]) >> DISCH_TAC \\
3732 ‘x - r <= x + r’ by rw [REAL_LT_IMP_LE] \\
3733 rw [INTERVAL_LOWERBOUND, INTERVAL_UPPERBOUND])
3734 >> rpt STRIP_TAC
3735 (* stage work *)
3736 >> rename1 ‘tdiv (a,b) (D,t)’
3737 >> Q.ABBREV_TAC ‘p = {(x,k) | ?n. n < dsize D /\ x = t n /\ k = interval[D n,D (SUC n)]}’
3738 >> Know ‘FINITE p’
3739 >- (Know ‘p = IMAGE (\n. (t n,interval[D n,D (SUC n)])) (count (dsize D))’
3740 >- (rw [Abbr ‘p’, Once EXTENSION, IN_IMAGE] >> Cases_on ‘x’ \\
3741 EQ_TAC >> rw [] \\ (* 2 subgoals, same tactics *)
3742 Q.EXISTS_TAC ‘n’ >> rw []) >> Rewr' \\
3743 MATCH_MP_TAC IMAGE_FINITE >> rw [FINITE_COUNT])
3744 >> DISCH_TAC
3745 >> Know ‘p tagged_division_of interval [a,b]’
3746 >- (rw [tagged_division_of, tagged_partial_division_of] >| (* 6 subgoals *)
3747 [ (* goal 1 (of 6): x IN s *)
3748 rename1 ‘(x,s) IN p’ >> POP_ASSUM MP_TAC \\
3749 rw [Abbr ‘p’] >> simp [IN_INTERVAL] \\
3750 Q.PAT_X_ASSUM ‘tdiv (a,b) (D,t)’ MP_TAC >> simp [tdiv],
3751 (* goal 2 (of 6): s SUBSET interval [a,b] *)
3752 rename1 ‘(x,s) IN p’ >> POP_ASSUM MP_TAC \\
3753 rw [Abbr ‘p’] >> simp [SUBSET_INTERVAL] >> DISCH_TAC \\
3754 Q.PAT_X_ASSUM ‘tdiv (a,b) (D,t)’ MP_TAC >> simp [tdiv] >> STRIP_TAC \\
3755 METIS_TAC [DIVISION_BOUNDS],
3756 (* goal 3 (of 6): ?a b. s = interval [a,b] *)
3757 rename1 ‘(x,s) IN p’ >> POP_ASSUM MP_TAC \\
3758 rw [Abbr ‘p’] >> qexistsl_tac [‘D n’, ‘D (SUC n)’] >> rw [],
3759 (* goal 4 (of 6): interior k1 INTER interior k2 = {} *)
3760 Q.PAT_X_ASSUM ‘(x1,k1) IN p’ MP_TAC \\
3761 Q.PAT_X_ASSUM ‘(x2,k2) IN p’ MP_TAC \\
3762 rw [Abbr ‘p’] >> rename1 ‘t m <> t n’ \\
3763 Q.PAT_X_ASSUM ‘tdiv (a,b) (D,t)’ MP_TAC >> simp [tdiv] >> STRIP_TAC \\
3764 Know ‘D m < D (SUC m) /\ D n < D (SUC n)’
3765 >- (CONJ_TAC \\ (* 2 subgoals, same tactics *)
3766 MATCH_MP_TAC DIVISION_LT_GEN \\
3767 qexistsl_tac [‘a’, ‘b’] >> rw []) >> STRIP_TAC \\
3768 rw [INTERIOR_CLOSED_INTERVAL, GSYM DISJOINT_DEF] \\
3769 rw [DISJOINT_ALT, IN_INTERVAL] \\
3770 CCONTR_TAC >> FULL_SIMP_TAC bool_ss [] \\
3771 ‘m <> n’ by (CCONTR_TAC >> fs []) \\
3772 ‘m < n \/ n < m’ by rw [] >| (* 2 subgoals *)
3773 [ (* goal 4.1 (of 2) *)
3774 ‘SUC m <= n’ by rw [] \\
3775 ‘D (SUC m) <= D n’ by METIS_TAC [DIVISION_MONO_LE] \\
3776 METIS_TAC [REAL_LET_TRANS, REAL_LT_ANTISYM],
3777 (* goal 4.2 (of 2) *)
3778 ‘SUC n <= m’ by rw [] \\
3779 ‘D (SUC n) <= D m’ by METIS_TAC [DIVISION_MONO_LE] \\
3780 METIS_TAC [REAL_LET_TRANS, REAL_LT_ANTISYM] ],
3781 (* goal 5 (of 6): interior k1 INTER interior k2 = {} *)
3782 Q.PAT_X_ASSUM ‘(x1,k1) IN p’ MP_TAC \\
3783 Q.PAT_X_ASSUM ‘(x2,k2) IN p’ MP_TAC \\
3784 rw [Abbr ‘p’] >> rename1 ‘m < dsize D’ \\
3785 Q.PAT_X_ASSUM ‘tdiv (a,b) (D,t)’ MP_TAC >> simp [tdiv] >> STRIP_TAC \\
3786 simp [INTERIOR_CLOSED_INTERVAL, GSYM DISJOINT_DEF] \\
3787 rw [DISJOINT_ALT, IN_INTERVAL] \\
3788 CCONTR_TAC >> FULL_SIMP_TAC bool_ss [] \\
3789 ‘m <> n’ by (CCONTR_TAC >> fs []) \\
3790 ‘m < n \/ n < m’ by rw [] >| (* 2 subgoals *)
3791 [ (* goal 5.1 (of 2) *)
3792 ‘SUC m <= n’ by rw [] \\
3793 ‘D (SUC m) <= D n’ by METIS_TAC [DIVISION_MONO_LE] \\
3794 METIS_TAC [REAL_LET_TRANS, REAL_LT_ANTISYM],
3795 (* goal 5.2 (of 2) *)
3796 ‘SUC n <= m’ by rw [] \\
3797 ‘D (SUC n) <= D m’ by METIS_TAC [DIVISION_MONO_LE] \\
3798 METIS_TAC [REAL_LET_TRANS, REAL_LT_ANTISYM] ],
3799 (* goal 6 (of 6): BIGUNION {k | (?x. (x,k) IN p)} = interval [a,b] *)
3800 Q.PAT_X_ASSUM ‘tdiv (a,b) (D,t)’ MP_TAC >> simp [tdiv] >> STRIP_TAC \\
3801 rw [Abbr ‘p’, Abbr ‘E’, Once EXTENSION, IN_BIGUNION, IN_INTERVAL] \\
3802 EQ_TAC >> simp [] (* 2 subgoals, first easier *)
3803 >- (STRIP_TAC \\
3804 POP_ASSUM (fn th => FULL_SIMP_TAC std_ss [th, IN_INTERVAL]) \\
3805 ‘a <= D n /\ D (SUC n) <= b’ by METIS_TAC [DIVISION_BOUNDS] \\
3806 METIS_TAC [REAL_LE_TRANS]) \\
3807 STRIP_TAC \\
3808 MP_TAC (Q.SPECL [‘D’, ‘a’, ‘b’, ‘x’] DIVISION_INTERMEDIATE') \\
3809 RW_TAC std_ss [] \\
3810 Q.EXISTS_TAC ‘interval [D n,D (SUC n)]’ \\
3811 CONJ_TAC >- rw [IN_INTERVAL] \\
3812 Q.EXISTS_TAC ‘n’ >> rw [] ])
3813 >> DISCH_TAC
3814 >> Know ‘d FINE p’
3815 >- (rw [FINE] >> rename1 ‘(x,s) IN p’ \\
3816 Q.PAT_X_ASSUM ‘p tagged_division_of interval [a,b]’ K_TAC \\
3817 POP_ASSUM MP_TAC >> rw [Abbr ‘p’] \\
3818 FULL_SIMP_TAC std_ss [fine, tdiv, gauge_def] \\
3819 Q.PAT_X_ASSUM ‘!n. D n <= t n /\ t n <= D (SUC n)’ (STRIP_ASSUME_TAC o (Q.SPEC ‘n’)) \\
3820 Q.PAT_X_ASSUM ‘gauge E g’ K_TAC \\
3821 Q.PAT_X_ASSUM ‘!n. n < dsize D ==> P’ drule >> rw [Abbr ‘g’] \\
3822 Q.ABBREV_TAC ‘x = t n’ \\
3823 MATCH_MP_TAC SUBSET_TRANS \\
3824 Q.EXISTS_TAC ‘cb x’ \\
3825 reverse CONJ_TAC >- rw [Abbr ‘cb’] \\
3826 Q.ABBREV_TAC ‘r = h(x,d x)’ \\
3827 ‘0 < r’ by rw [Abbr ‘r’] \\
3828 Know ‘x - r < x + r’
3829 >- (MATCH_MP_TAC REAL_LT_TRANS \\
3830 Q.EXISTS_TAC ‘x’ >> rw [REAL_LT_SUB_RADD]) >> DISCH_TAC \\
3831 ‘x - r <= x + r’ by rw [REAL_LT_IMP_LE] \\
3832 fs [Abbr ‘cb’, CBALL_INTERVAL, INTERVAL_UPPERBOUND, INTERVAL_LOWERBOUND] \\
3833 ‘D n <= D (SUC n)’ by PROVE_TAC [REAL_LE_TRANS] \\
3834 simp [SUBSET_INTERVAL] \\
3835 fs [REAL_ARITH “x + r - (x - r) = 2 * r”] \\
3836 ‘D (SUC n) - D n <= r’ by rw [REAL_LT_IMP_LE] \\
3837 reverse CONJ_TAC
3838 >- (‘D (SUC n) = D n + (D (SUC n) - D n)’ by REAL_ARITH_TAC >> POP_ORW \\
3839 MATCH_MP_TAC REAL_LE_ADD2 >> art []) \\
3840 rw [REAL_LE_SUB_RADD] \\
3841 MATCH_MP_TAC REAL_LE_TRANS \\
3842 Q.EXISTS_TAC ‘D (SUC n)’ >> rw [Once REAL_ADD_COMM] \\
3843 fs [REAL_LE_SUB_RADD])
3844 >> DISCH_TAC
3845 (* stage work *)
3846 >> Q.PAT_X_ASSUM ‘!p. p tagged_division_of interval [a,b] /\ d FINE p ==> P’ drule_all
3847 >> simp [rsum, GSYM REAL_SUM_IMAGE_COUNT, GSYM REAL_SUM_IMAGE_sum]
3848 >> Q.ABBREV_TAC ‘N = dsize D’
3849 >> Suff ‘SIGMA (\n. f (t n) * (D (SUC n) - D n)) (count N) =
3850 SIGMA (\(x,k). f x * content k) p’ >- Rewr
3851 >> Know ‘p = IMAGE (\n. (t n,interval[D n,D (SUC n)])) (count N)’
3852 >- (rw [Abbr ‘p’, Once EXTENSION, IN_IMAGE] >> Cases_on ‘x’ \\
3853 EQ_TAC >> rw [] \\ (* 2 subgoals, same tactics *)
3854 Q.EXISTS_TAC ‘n’ >> rw []) >> Rewr'
3855 >> Q.ABBREV_TAC ‘H = \n. (t n,interval [D n,D (SUC n)])’
3856 >> Know ‘SIGMA (\(x,k). f x * content k) (IMAGE H (count N)) =
3857 SIGMA ((\(x,k). f x * content k) o H) (count N)’
3858 >- (irule REAL_SUM_IMAGE_IMAGE >> simp [INJ_DEF] \\
3859 qx_genl_tac [‘i’, ‘j’] >> rpt STRIP_TAC \\
3860 fs [Abbr ‘H’, EQ_INTERVAL, GSYM INTERVAL_EQ_EMPTY, tdiv]
3861 >- (Suff ‘D i < D (SUC i)’ >- PROVE_TAC [REAL_LT_ANTISYM] \\
3862 MATCH_MP_TAC DIVISION_LT_GEN \\
3863 qexistsl_tac [‘a’, ‘b’] >> rw []) \\
3864 CCONTR_TAC >> ‘i < j \/ j < i’ by rw [] >| (* 2 subgoals *)
3865 [ (* goal 1 (of 2) *)
3866 Suff ‘D (SUC i) < D (SUC j)’ >- PROVE_TAC [REAL_LT_IMP_NE] \\
3867 MATCH_MP_TAC DIVISION_LT_GEN \\
3868 qexistsl_tac [‘a’, ‘b’] >> rw [],
3869 (* goal 2 (of 2) *)
3870 Suff ‘D (SUC j) < D (SUC i)’ >- PROVE_TAC [REAL_LT_IMP_NE] \\
3871 MATCH_MP_TAC DIVISION_LT_GEN \\
3872 qexistsl_tac [‘a’, ‘b’] >> rw [] ])
3873 >> Rewr'
3874 >> MATCH_MP_TAC REAL_SUM_IMAGE_EQ >> rw [Abbr ‘H’]
3875 >> DISJ2_TAC >> rename1 ‘n < N’
3876 >> Suff ‘D n <= D (SUC n)’ >- rw [CONTENT_CLOSED_INTERVAL]
3877 >> MATCH_MP_TAC DIVISION_MONO_LE_SUC
3878 >> qexistsl_tac [‘a’, ‘b’] >> fs [tdiv]
3879QED
3880
3881Theorem Dint_has_integral :
3882 !f a b k. a <= b ==> (Dint(a,b) f k <=> (f has_integral k) (interval[a,b]))
3883Proof
3884 rpt STRIP_TAC
3885 (* special case: a = b *)
3886 >> ‘b = a \/ a < b’ by PROVE_TAC [REAL_LE_LT]
3887 >- (POP_ASSUM (fs o wrap) >> KILL_TAC \\
3888 Cases_on ‘k = 0’ >- (rw [INTEGRAL_NULL, HAS_INTEGRAL_REFL]) \\
3889 Know ‘Dint (a,a) f k <=> F’
3890 >- (rw [] >> CCONTR_TAC >> fs [] \\
3891 ASSUME_TAC (Q.SPECL [‘f’, ‘a’] INTEGRAL_NULL) \\
3892 METIS_TAC [DINT_UNIQ, REAL_LE_REFL]) >> Rewr' \\
3893 Know ‘(f has_integral k) (interval [a,a]) <=> F’
3894 >- (rw [] >> CCONTR_TAC >> fs [] \\
3895 ASSUME_TAC (Q.SPECL [‘f’, ‘a’] HAS_INTEGRAL_REFL) \\
3896 METIS_TAC [HAS_INTEGRAL_UNIQUE]) >> Rewr)
3897 (* now ‘a < b’ *)
3898 >> METIS_TAC [Dint_imp_has_integral, has_integral_imp_Dint]
3899QED
3900
3901(* Below are easy corollaries of Dint_has_integral *)
3902Theorem integrable_eq_integrable_on :
3903 !f a b. a <= b ==> (integrable(a,b) f <=> f integrable_on (interval[a,b]))
3904Proof
3905 rw [integrable, integrable_on, Dint_has_integral]
3906QED
3907
3908Theorem integral_old_to_new :
3909 !f a b. a <= b /\ integrable(a,b) f ==>
3910 integral(a,b) f = integration$integral (interval[a,b]) f
3911Proof
3912 rpt STRIP_TAC
3913 >> ‘f integrable_on (interval[a,b])’ by PROVE_TAC [integrable_eq_integrable_on]
3914 >> rw [integral, integral_def]
3915 >> SELECT_ELIM_TAC
3916 >> STRONG_CONJ_TAC
3917 >- (fs [integrable] >> Q.EXISTS_TAC ‘i’ >> art [])
3918 >> DISCH_THEN (Q.X_CHOOSE_THEN ‘k’ ASSUME_TAC)
3919 >> rpt STRIP_TAC
3920 >> ‘x = k’ by METIS_TAC [DINT_UNIQ]
3921 >> POP_ASSUM (fs o wrap)
3922 >> SELECT_ELIM_TAC
3923 >> CONJ_TAC
3924 >- (fs [integrable_on] >> Q.EXISTS_TAC ‘y’ >> art [])
3925 >> rpt STRIP_TAC
3926 >> MATCH_MP_TAC HAS_INTEGRAL_UNIQUE
3927 >> qexistsl_tac [‘f’, ‘interval[a,b]’] >> art []
3928 >> rw [GSYM Dint_has_integral]
3929QED
3930
3931Theorem integral_new_to_old :
3932 !f a b. a <= b /\ f integrable_on (interval[a,b]) ==>
3933 integration$integral (interval[a,b]) f = integral(a,b) f
3934Proof
3935 rpt STRIP_TAC
3936 >> ONCE_REWRITE_TAC [EQ_SYM_EQ]
3937 >> MATCH_MP_TAC integral_old_to_new >> art []
3938 >> rw [integrable_eq_integrable_on]
3939QED
3940
3941(* References:
3942
3943 [1] Bartle, R.G.: A Modern Theory of Integration. American Mathematical Soc. (2001).
3944 [2] Shi, Z., Gu, W., Li, X., Guan, Y., Ye, S., Zhang, J., Wei, H.:
3945 The Gauge Integral Theory in HOL4. J. Appl. Math. 2013, (2013).
3946 *)