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