1 (* ========================================================================= *)
2 (* #26: Leibniz's series for pi *)
3 (* ========================================================================= *)
5 needs "Library/transc.ml";;
9 (* ------------------------------------------------------------------------- *)
10 (* Summability of alternating series. *)
11 (* ------------------------------------------------------------------------- *)
13 let ALTERNATING_SUM_BOUNDS = prove
14 (`!a. (!n. a(2 * n + 1) <= &0 /\ &0 <= a(2 * n)) /\
15 (!n. abs(a(n + 1)) <= abs(a(n)))
16 ==> !m n. (EVEN m ==> &0 <= sum(m,n) a /\ sum(m,n) a <= a(m)) /\
17 (ODD m ==> a(m) <= sum(m,n) a /\ sum(m,n) a <= &0)`,
18 GEN_TAC THEN STRIP_TAC THEN
19 ONCE_REWRITE_TAC[SWAP_FORALL_THM] THEN
20 INDUCT_TAC THEN REWRITE_TAC[ODD; EVEN] THENL
21 [SIMP_TAC[sum; ODD_EXISTS; EVEN_EXISTS; LEFT_IMP_EXISTS_THM; ADD1] THEN
22 ASM_SIMP_TAC[REAL_LE_REFL];
24 X_GEN_TAC `m:num` THEN
25 REWRITE_TAC[ARITH_RULE `SUC n = 1 + n`; GSYM SUM_SPLIT] THEN
26 FIRST_X_ASSUM(MP_TAC o check (is_conj o concl) o SPEC `SUC m`) THEN
27 REWRITE_TAC[ODD; EVEN; SUM_1] THEN REWRITE_TAC[ADD1; GSYM NOT_EVEN] THEN
28 UNDISCH_THEN `!n. abs(a(n + 1)) <= abs(a n)` (MP_TAC o SPEC `m:num`) THEN
29 ASM_CASES_TAC `EVEN m` THEN ASM_REWRITE_TAC[] THENL
30 [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [EVEN_EXISTS]) THEN
31 DISCH_THEN(X_CHOOSE_THEN `p:num` SUBST_ALL_TAC) THEN
32 FIRST_X_ASSUM(MP_TAC o SPEC `p:num`) THEN REAL_ARITH_TAC;
33 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [NOT_EVEN]) THEN
34 REWRITE_TAC[ODD_EXISTS] THEN
35 DISCH_THEN(X_CHOOSE_THEN `p:num` SUBST_ALL_TAC) THEN
36 REWRITE_TAC[ADD1] THEN
37 FIRST_X_ASSUM(MP_TAC o SPEC `p:num`) THEN REAL_ARITH_TAC]);;
39 let ALTERNATING_SUM_BOUND = prove
40 (`!a. (!n. a(2 * n + 1) <= &0 /\ &0 <= a(2 * n)) /\
41 (!n. abs(a(n + 1)) <= abs(a(n)))
42 ==> !m n. abs(sum(m,n) a) <= abs(a m)`,
43 GEN_TAC THEN DISCH_THEN(MP_TAC o MATCH_MP ALTERNATING_SUM_BOUNDS) THEN
44 REPEAT(MATCH_MP_TAC MONO_FORALL THEN GEN_TAC) THEN
45 REWRITE_TAC[GSYM NOT_EVEN] THEN ASM_CASES_TAC `EVEN m` THEN
46 ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC);;
48 let SUMMABLE_ALTERNATING = prove
49 (`!v. (!n. a(2 * n + 1) <= &0 /\ &0 <= a(2 * n)) /\
50 (!n. abs(a(n + 1)) <= abs(a(n))) /\ a tends_num_real &0
52 REPEAT STRIP_TAC THEN REWRITE_TAC[SER_CAUCHY] THEN
53 X_GEN_TAC `e:real` THEN STRIP_TAC THEN
54 FIRST_X_ASSUM(MP_TAC o SPEC `e:real` o GEN_REWRITE_RULE I [SEQ]) THEN
55 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `N:num` THEN
56 REWRITE_TAC[REAL_SUB_RZERO] THEN
57 ASM_MESON_TAC[ALTERNATING_SUM_BOUND; REAL_LET_TRANS]);;
59 (* ------------------------------------------------------------------------- *)
60 (* Another version of the atan series. *)
61 (* ------------------------------------------------------------------------- *)
63 let REAL_ATN_POWSER_ALT = prove
65 ==> (\n. (-- &1) pow n / &(2 * n + 1) * x pow (2 * n + 1))
68 FIRST_ASSUM(ASSUME_TAC o MATCH_MP REAL_ATN_POWSER) THEN
69 FIRST_ASSUM(MP_TAC o C CONJ (ARITH_RULE `0 < 2`) o
70 MATCH_MP SUM_SUMMABLE) THEN
71 DISCH_THEN(MP_TAC o MATCH_MP SER_GROUP) THEN
72 FIRST_ASSUM(SUBST1_TAC o SYM o MATCH_MP SUM_UNIQ) THEN
73 REWRITE_TAC[SUM_2; EVEN_MULT; EVEN_ADD; ARITH_EVEN; ADD_SUB] THEN
74 ONCE_REWRITE_TAC[ARITH_RULE `n * 2 = 2 * n`] THEN
75 SIMP_TAC[DIV_MULT; ARITH_EQ; REAL_MUL_LZERO; REAL_ADD_LID]);;
77 (* ------------------------------------------------------------------------- *)
78 (* Summability of the same series for x = 1. *)
79 (* ------------------------------------------------------------------------- *)
81 let SUMMABLE_LEIBNIZ = prove
82 (`summable (\n. (-- &1) pow n / &(2 * n + 1))`,
83 MATCH_MP_TAC SUMMABLE_ALTERNATING THEN
84 REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL
85 [REWRITE_TAC[REAL_POW_ADD; REAL_POW_MUL; GSYM REAL_POW_POW] THEN
86 CONV_TAC REAL_RAT_REDUCE_CONV THEN
87 REWRITE_TAC[REAL_POW_ONE; real_div; REAL_MUL_LID; REAL_MUL_LNEG] THEN
88 REWRITE_TAC[REAL_LE_LNEG; REAL_ADD_RID; REAL_LE_INV_EQ; REAL_POS];
89 GEN_TAC THEN REWRITE_TAC[REAL_ABS_DIV; REAL_ABS_POW; REAL_ABS_NEG] THEN
90 REWRITE_TAC[REAL_ABS_NUM; REAL_POW_ONE; real_div; REAL_MUL_LID] THEN
91 MATCH_MP_TAC REAL_LE_INV2 THEN
92 REWRITE_TAC[REAL_OF_NUM_LT; REAL_OF_NUM_LE] THEN ARITH_TAC;
93 REWRITE_TAC[SEQ; REAL_SUB_RZERO; REAL_ABS_DIV; REAL_ABS_POW] THEN
94 REWRITE_TAC[REAL_ABS_NEG; REAL_ABS_NUM; REAL_POW_ONE] THEN
95 SIMP_TAC[REAL_LT_LDIV_EQ; REAL_OF_NUM_LT; ARITH_RULE `0 < n + 1`] THEN
96 GEN_TAC THEN DISCH_TAC THEN
97 FIRST_ASSUM(MP_TAC o SPEC `&1` o MATCH_MP REAL_ARCH) THEN
98 MATCH_MP_TAC MONO_EXISTS THEN REWRITE_TAC[GE] THEN REPEAT STRIP_TAC THEN
99 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
100 `&1 < x * e ==> e * x <= y ==> &1 < y`)) THEN
101 ASM_SIMP_TAC[REAL_LE_LMUL_EQ; REAL_OF_NUM_LE] THEN
104 (* ------------------------------------------------------------------------- *)
105 (* The tricky sum-bounding lemma. *)
106 (* ------------------------------------------------------------------------- *)
108 let SUM_DIFFERENCES = prove
109 (`!a m n. m <= n + 1 ==> sum(m..n) (\i. a(i) - a(i+1)) = a(m) - a(n + 1)`,
110 GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THENL
111 [REWRITE_TAC[ARITH_RULE `m <= 0 + 1 <=> m = 0 \/ m = 1`] THEN
112 STRIP_TAC THEN ASM_REWRITE_TAC[SUM_SING_NUMSEG] THEN
113 ASM_SIMP_TAC[SUM_TRIV_NUMSEG; ARITH; REAL_SUB_REFL];
115 REWRITE_TAC[ARITH_RULE `m <= SUC n + 1 <=> m <= n + 1 \/ m = SUC n + 1`] THEN
117 ASM_SIMP_TAC[SUM_TRIV_NUMSEG; ARITH_RULE `n < n + 1`; REAL_SUB_REFL] THEN
118 ASM_SIMP_TAC[SUM_CLAUSES_NUMSEG;
119 ARITH_RULE `m <= n + 1 ==> m <= SUC n /\ m <= SUC n + 1`] THEN
120 REWRITE_TAC[ADD1] THEN REAL_ARITH_TAC);;
122 let SUM_REARRANGE_LEMMA = prove
125 ==> sum(m..n+1) (\i. a i * v i) =
126 sum(m..n) (\k. sum(m..k) a * (v(k) - v(k+1))) +
127 sum(m..n+1) a * v(n+1)`,
128 REPLICATE_TAC 3 GEN_TAC THEN INDUCT_TAC THENL
129 [REWRITE_TAC[SUM_CLAUSES_NUMSEG; num_CONV `1`; ADD_CLAUSES] THEN
130 ASM_CASES_TAC `m = 0` THEN ASM_REWRITE_TAC[ARITH] THEN REAL_ARITH_TAC;
132 REWRITE_TAC[ADD_CLAUSES; SUM_CLAUSES_NUMSEG] THEN
133 DISCH_TAC THEN FIRST_X_ASSUM(MP_TAC o check (is_imp o concl)) THEN
134 ASM_CASES_TAC `m = SUC(n + 1)` THENL
135 [ASM_REWRITE_TAC[LE_SUC; ARITH_RULE `~(n + 1 <= n)`] THEN
136 ASM_SIMP_TAC[SUM_TRIV_NUMSEG; ARITH_RULE
137 `n < SUC n /\ n < SUC(n + 1)`] THEN
140 ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN
141 DISCH_THEN SUBST1_TAC THEN ASM_REWRITE_TAC[] THEN
142 ONCE_REWRITE_TAC[ARITH_RULE
143 `m <= SUC n <=> m <= SUC(n + 1) /\ ~(m = SUC(n + 1))`] THEN
144 ASM_REWRITE_TAC[] THEN
145 REWRITE_TAC[GSYM REAL_ADD_ASSOC; REAL_EQ_ADD_LCANCEL] THEN
146 REWRITE_TAC[REAL_ADD_ASSOC; REAL_ADD_RDISTRIB; REAL_EQ_ADD_RCANCEL] THEN
147 REWRITE_TAC[GSYM ADD1; SUM_CLAUSES_NUMSEG] THEN
148 ASM_SIMP_TAC[ARITH_RULE
149 `m <= SUC(n + 1) /\ ~(m = SUC(n + 1)) ==> m <= SUC n`] THEN
150 REWRITE_TAC[REAL_ARITH
151 `(s1 * (v - w) + x) + (s2 + y) * w =
152 (x + y * w) + (v - w) * s1 + w * s2`] THEN
153 GEN_REWRITE_TAC LAND_CONV [REAL_MUL_SYM] THEN
154 SIMP_TAC[REAL_ADD_LDISTRIB; GSYM SUM_CMUL; GSYM SUM_ADD_NUMSEG] THEN
155 REWRITE_TAC[REAL_SUB_ADD; REAL_SUB_RDISTRIB] THEN REAL_ARITH_TAC);;
157 let SUM_BOUNDS_LEMMA = prove
160 (!i. m <= i /\ i <= n ==> &0 <= v(i) /\ v(i+1) <= v(i)) /\
161 (!k. m <= k /\ k <= n ==> l <= sum(m..k) a /\ sum(m..k) a <= u)
162 ==> l * v(m) <= sum(m..n) (\i. a(i) * v(i)) /\
163 sum(m..n) (\i. a(i) * v(i)) <= u * v(m)`,
164 REPLICATE_TAC 5 GEN_TAC THEN INDUCT_TAC THENL
165 [REWRITE_TAC[LE; SUM_CLAUSES_NUMSEG] THEN
166 SIMP_TAC[ARITH_RULE `m <= i /\ i = 0 <=> m = 0 /\ i = 0`] THEN
167 REWRITE_TAC[LEFT_FORALL_IMP_THM; RIGHT_EXISTS_AND_THM; EXISTS_REFL] THEN
168 ASM_CASES_TAC `m = 0` THEN ASM_REWRITE_TAC[SUM_SING_NUMSEG] THEN
169 SIMP_TAC[REAL_LE_RMUL];
170 POP_ASSUM(K ALL_TAC) THEN REWRITE_TAC[ADD1]] THEN
171 SIMP_TAC[SUM_REARRANGE_LEMMA] THEN STRIP_TAC THEN CONJ_TAC THENL
172 [MATCH_MP_TAC REAL_LE_TRANS THEN
173 EXISTS_TAC `sum(m..n) (\k. l * (v(k) - v(k + 1))) + l * v(n+1)` THEN
175 [ASM_SIMP_TAC[SUM_LMUL; SUM_DIFFERENCES] THEN REAL_ARITH_TAC;
177 MATCH_MP_TAC REAL_LE_TRANS THEN
178 EXISTS_TAC `sum(m..n) (\k. u * (v(k) - v(k + 1))) + u * v(n+1)` THEN
181 ASM_SIMP_TAC[SUM_LMUL; SUM_DIFFERENCES] THEN REAL_ARITH_TAC]] THEN
182 MATCH_MP_TAC REAL_LE_ADD2 THEN ASM_SIMP_TAC[REAL_LE_RMUL; LE_REFL] THEN
183 MATCH_MP_TAC SUM_LE_NUMSEG THEN X_GEN_TAC `k:num` THEN STRIP_TAC THEN
184 REWRITE_TAC[] THEN MATCH_MP_TAC REAL_LE_RMUL THEN
185 ASM_SIMP_TAC[REAL_SUB_LE; ARITH_RULE `k <= n ==> k <= n + 1`]);;
187 let SUM_BOUND_LEMMA = prove
190 (!i. m <= i /\ i <= n ==> &0 <= v(i) /\ v(i+1) <= v(i)) /\
191 (!k. m <= k /\ k <= n ==> abs(sum(m..k) a) <= b)
192 ==> abs(sum(m..n) (\i. a(i) * v(i))) <= b * abs(v m)`,
193 REPEAT STRIP_TAC THEN MATCH_MP_TAC(REAL_ARITH
194 `--b * k <= a /\ a <= b * k ==> abs(a) <= b * k`) THEN
195 ASM_SIMP_TAC[LE_REFL; real_abs] THEN
196 MATCH_MP_TAC SUM_BOUNDS_LEMMA THEN
197 ASM_REWRITE_TAC[REAL_BOUNDS_LE]);;
199 (* ------------------------------------------------------------------------- *)
200 (* Hence the final theorem. *)
201 (* ------------------------------------------------------------------------- *)
203 let LEIBNIZ_PI = prove
204 (`(\n. (-- &1) pow n / &(2 * n + 1)) sums (pi / &4)`,
205 REWRITE_TAC[GSYM ATN_1] THEN
206 ASSUME_TAC(MATCH_MP SUMMABLE_SUM SUMMABLE_LEIBNIZ) THEN
207 ABBREV_TAC `s = suminf(\n. (-- &1) pow n / &(2 * n + 1))` THEN
208 SUBGOAL_THEN `s = atn(&1)` (fun th -> ASM_MESON_TAC[th]) THEN
209 MATCH_MP_TAC(REAL_ARITH `~(&0 < abs(x - y)) ==> x = y`) THEN
210 ABBREV_TAC `e = abs(s - atn(&1))` THEN DISCH_TAC THEN
211 FIRST_ASSUM(MP_TAC o MATCH_MP SUM_SUMMABLE) THEN
212 REWRITE_TAC[SER_CAUCHY] THEN DISCH_THEN(MP_TAC o SPEC `e / &7`) THEN
213 ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN
214 DISCH_THEN(X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC) THEN
216 `(\x. sum(0,N) (\n. (-- &1) pow n / &(2 * n + 1) * x pow (2 * n + 1)))
219 [MATCH_MP_TAC DIFF_CONT THEN EXISTS_TAC
220 `sum(0,N) (\n. (-- &1) pow n * &1 pow (2 * n))` THEN
221 MATCH_MP_TAC DIFF_SUM THEN X_GEN_TAC `k:num` THEN STRIP_TAC THEN
222 REWRITE_TAC[real_div; GSYM REAL_MUL_ASSOC] THEN
223 MATCH_MP_TAC DIFF_CMUL THEN
224 MP_TAC(SPECL [`2 * k + 1`; `&1`] DIFF_POW) THEN
225 DISCH_THEN(MP_TAC o SPEC `inv(&(2 * k + 1))` o MATCH_MP DIFF_CMUL) THEN
226 MATCH_MP_TAC(TAUT `a = b ==> a ==> b`) THEN
227 REWRITE_TAC[ADD_SUB] THEN AP_THM_TAC THEN AP_TERM_TAC THEN
228 REWRITE_TAC[GSYM REAL_OF_NUM_ADD; GSYM REAL_OF_NUM_MUL] THEN
229 REWRITE_TAC[REAL_POW_ONE] THEN CONV_TAC REAL_FIELD;
231 SUBGOAL_THEN `atn contl (&1)` MP_TAC THENL
232 [MESON_TAC[DIFF_CONT; DIFF_ATN]; ALL_TAC] THEN
233 REWRITE_TAC[CONTL_LIM; LIM] THEN
234 REWRITE_TAC[TAUT `a ==> ~b <=> ~(a /\ b)`; AND_FORALL_THM] THEN
235 DISCH_THEN(MP_TAC o SPEC `e / &6`) THEN
236 ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH; GSYM SUM_SUB] THEN
237 ONCE_REWRITE_TAC[GSYM REAL_ABS_NEG] THEN
238 REWRITE_TAC[GSYM SUM_NEG; REAL_NEG_SUB; GSYM REAL_MUL_RNEG] THEN
239 REWRITE_TAC[REAL_POW_ONE; GSYM REAL_SUB_LDISTRIB] THEN DISCH_THEN
240 (CONJUNCTS_THEN2 (X_CHOOSE_THEN `d1:real` STRIP_ASSUME_TAC)
241 (X_CHOOSE_THEN `d2:real` STRIP_ASSUME_TAC)) THEN
242 ABBREV_TAC `x = &1 - min (min (d1 / &2) (d2 / &2)) (&1 / &2)` THEN
243 REPEAT(FIRST_X_ASSUM (MP_TAC o SPEC `x:real`) THEN ANTS_TAC THENL
244 [ASM_REAL_ARITH_TAC; DISCH_TAC]) THEN
245 SUBGOAL_THEN `&0 < x /\ x < &1 /\ abs x < &1` STRIP_ASSUME_TAC THENL
246 [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
247 FIRST_X_ASSUM(MP_TAC o MATCH_MP REAL_ATN_POWSER_ALT) THEN
248 REWRITE_TAC[sums; SEQ] THEN DISCH_THEN(MP_TAC o SPEC `e / &6`) THEN
249 ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN
250 DISCH_THEN(X_CHOOSE_TAC `N1:num`) THEN
251 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [sums]) THEN
252 REWRITE_TAC[SEQ] THEN DISCH_THEN(MP_TAC o SPEC `e / &6`) THEN
253 ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN
254 DISCH_THEN(X_CHOOSE_TAC `N2:num`) THEN
255 REPEAT(FIRST_X_ASSUM(MP_TAC o SPEC `N + N1 + N2:num`) THEN
256 ANTS_TAC THENL [ARITH_TAC; ALL_TAC]) THEN
257 REWRITE_TAC[] THEN ONCE_REWRITE_TAC[GSYM SUM_SPLIT] THEN
258 REWRITE_TAC[ADD_CLAUSES] THEN REPEAT STRIP_TAC THEN
260 `abs(sum(N,N1+N2) (\n. -- &1 pow n / &(2 * n + 1) * x pow (2 * n + 1)))
263 [ASM_CASES_TAC `N1 + N2 = 0` THENL
264 [ASM_SIMP_TAC[sum; REAL_LT_DIV; REAL_OF_NUM_LT; REAL_ABS_NUM; ARITH];
266 MATCH_MP_TAC(REAL_ARITH `x <= e / &7 /\ &0 < e ==> x < e / &6`) THEN
267 ASM_REWRITE_TAC[] THEN
268 MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC
269 `e / &7 * abs(x pow (2 * N + 1))` THEN
272 GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN
273 MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[REAL_ABS_POS] THEN
274 ASM_SIMP_TAC[REAL_LT_IMP_LE; REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN
275 REWRITE_TAC[REAL_ABS_POW; REAL_ABS_NUM] THEN
276 MATCH_MP_TAC REAL_POW_1_LE THEN
277 MAP_EVERY UNDISCH_TAC [`&0 < x`; `x < &1`] THEN REAL_ARITH_TAC] THEN
278 ASM_SIMP_TAC[PSUM_SUM_NUMSEG] THEN MATCH_MP_TAC SUM_BOUND_LEMMA THEN
279 CONJ_TAC THENL [UNDISCH_TAC `~(N1 + N2 = 0)` THEN ARITH_TAC; ALL_TAC] THEN
280 REPEAT STRIP_TAC THENL
281 [ASM_SIMP_TAC[REAL_LT_IMP_LE; REAL_POW_LT];
282 REWRITE_TAC[ARITH_RULE `2 * (m + 1) + 1 = (2 * m + 1) + 2`] THEN
283 GEN_REWRITE_TAC LAND_CONV [REAL_POW_ADD] THEN
284 GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN
285 MATCH_MP_TAC REAL_LE_LMUL THEN
286 ASM_SIMP_TAC[REAL_POW_LE; REAL_POW_1_LE; REAL_LT_IMP_LE];
287 MATCH_MP_TAC REAL_LT_IMP_LE THEN
288 FIRST_X_ASSUM(MP_TAC o SPECL [`N:num`; `(k - N:num) + 1`]) THEN
289 SIMP_TAC[PSUM_SUM_NUMSEG; ADD_EQ_0; ARITH_EQ] THEN
290 ASM_SIMP_TAC[ARITH_RULE `N <= k ==> (N + (k - N) + 1) - 1 = k`] THEN
291 REWRITE_TAC[GE; LE_REFL; REAL_LT_IMP_LE]];
293 FIRST_X_ASSUM(MP_TAC o SPECL [`N:num`; `N1 + N2:num`]) THEN
294 REWRITE_TAC[GE; LE_REFL] THEN
295 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
296 `abs((slo + shi) - s) < e / &6
297 ==> ~(abs(slo - s) < e / &3) ==> ~(abs(shi) < e / &7)`)) THEN
298 RULE_ASSUM_TAC(REWRITE_RULE[REAL_SUB_LDISTRIB; SUM_SUB; REAL_MUL_RID]) THEN
299 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
300 `abs(s1 - sx) < e / &6
301 ==> ~(abs(sx - s) < e / &2) ==> ~(abs(s1 - s) < e / &3)`)) THEN
302 ASM_REAL_ARITH_TAC);;