1 (* ========================================================================== *)
2 (* FLYSPECK - BOOK FORMALIZATION *)
4 (* Chapter: nonlinear inequalities *)
5 (* Author: Thomas Hales *)
7 (* ========================================================================== *)
10 Definitions and Lemmas used in the generation of interval arithmetic
11 code from the HOL Light specifications.
15 (* ========================================================================== *)
17 (* ========================================================================== *)
19 module Nonlinear_lemma = struct
21 let ineq = Sphere.ineq;;
23 let NONLIN = new_definition `NONLIN = T`;;
25 let sqrt_x1 = define `sqrt_x1 x1 x2 x3 x4 x5 x6 = sqrt x1`;;
27 let sqrt_x2 = define `sqrt_x2 x1 x2 x3 x4 x5 x6 = sqrt x2`;;
29 let sqrt_x3 = define `sqrt_x3 x1 x2 x3 x4 x5 x6 = sqrt x3`;;
31 let sqrt_x4 = define `sqrt_x4 x1 x2 x3 x4 x5 x6 = sqrt x4`;;
33 let sqrt_x5 = define `sqrt_x5 x1 x2 x3 x4 x5 x6 = sqrt x5`;;
35 let sqrt_x6 = define `sqrt_x6 x1 x2 x3 x4 x5 x6 = sqrt x6`;;
37 let halfbump_x = new_definition `halfbump_x x = bump (sqrt x / &2)`;;
39 let halfbump_x1 = new_definition `halfbump_x1 x1 x2 x3 x4 x5 x6 = halfbump_x x1`;;
41 let halfbump_x4 = new_definition `halfbump_x4 x1 x2 x3 x4 x5 x6 = halfbump_x x4`;;
43 let unit6 = define `unit6 x1 x2 x3 x4 x5 x6 = &1`;;
45 let proj_x1 = define `proj_x1 (x1:A) (x2:B) (x3:C) (x4:D) (x5:E) (x6:F) = x1`;;
47 let proj_x2 = define `proj_x2 (x1:A) (x2:B) (x3:C) (x4:D) (x5:E) (x6:F) = x2`;;
49 let proj_x3 = define `proj_x3 (x1:A) (x2:B) (x3:C) (x4:D) (x5:E) (x6:F) = x3`;;
51 let proj_x4 = define `proj_x4 (x1:A) (x2:B) (x3:C) (x4:D) (x5:E) (x6:F) = x4`;;
53 let proj_x5 = define `proj_x5 (x1:A) (x2:B) (x3:C) (x4:D) (x5:E) (x6:F) = x5`;;
55 let proj_x6 = define `proj_x6 (x1:A) (x2:B) (x3:C) (x4:D) (x5:E) (x6:F) = x6`;;
57 let promote = define `promote f (x1:A) (x2:B) (x3:C) (x4:D) (x5:E) (x6:F) = f x1`;;
59 let unit0 = define `unit0 = &1`;;
61 let pow1 = new_definition `pow1 y = y pow 1`;;
63 let pow2 = new_definition `pow2 y = y pow 2`;;
65 let pow3 = new_definition `pow3 y = y pow 3`;;
67 let pow4 = new_definition `pow4 y = y pow 4`;;
69 let promote_pow2 = new_definition `promote_pow2 x1 (x2:A) (x3:B) (x4:C) (x5:D) (x6:E) = x1 pow 2`;;
71 let promote_pow3 = new_definition `promote_pow3 x1 (x2:A) (x3:B) (x4:C) (x5:D) (x6:E) = x1 pow 3`;;
73 let compose6 = new_definition `compose6 f p1 p2 p3 p4 p5 p6
74 (x1:real) (x2:real) (x3:real) (x4:real) (x5:real) (x6:real) =
75 (f:real->real->real->real->real->real->real)
76 (p1 x1 x2 x3 x4 x5 x6)
77 (p2 x1 x2 x3 x4 x5 x6)
78 (p3 x1 x2 x3 x4 x5 x6)
79 (p4 x1 x2 x3 x4 x5 x6)
80 (p5 x1 x2 x3 x4 x5 x6)
81 (p6 x1 x2 x3 x4 x5 x6)`;;
83 let scale6 = new_definition `scale6 f
84 (r:real) (x1:real) (x2:real) (x3:real) (x4:real) (x5:real) (x6:real) =
85 (f x1 x2 x3 x4 x5 x6) * r`;;
87 let quadratic_root_plus_curry =
88 new_definition `quadratic_root_plus_curry a b c = quadratic_root_plus (a,b,c)`;;
90 let sq_pow2 = prove_by_refinement(
91 `!a x. a pow 2 <= x ==> (sqrt x * sqrt x = x)`,
94 REWRITE_TAC[GSYM REAL_POW_2;SQRT_POW2];
95 MESON_TAC[REAL_LE_TRANS;Collect_geom.REAL_LE_SQUARE_POW];
99 let sqrt2_sqrt2 = prove_by_refinement(
100 `sqrt2 * sqrt2 = &2`,
103 REWRITE_TAC[Sphere.sqrt2];
104 MATCH_MP_TAC sq_pow2;
110 (* SOME DEFINITIONS *)
112 let vol3f_sqrt2_lmplus = new_definition
113 `vol3f_sqrt2_lmplus y1 y2 (y3:real) (y4:real) (y5:real) y6 =
115 (&2 * dih_y y1 y2 sqrt2 sqrt2 sqrt2 y6 +
116 &2 * dih2_y y1 y2 sqrt2 sqrt2 sqrt2 y6 +
117 &2 * dih6_y y1 y2 sqrt2 sqrt2 sqrt2 y6 +
118 dih3_y y1 y2 sqrt2 sqrt2 sqrt2 y6 +
119 dih4_y y1 y2 sqrt2 sqrt2 sqrt2 y6 +
120 dih5_y y1 y2 sqrt2 sqrt2 sqrt2 y6 - &3 * pi) -
123 lfun (y2 / &2) * dih2_y y1 y2 sqrt2 sqrt2 sqrt2 y6 +
124 lfun (y6 / &2) * dih6_y y1 y2 sqrt2 sqrt2 sqrt2 y6)`;;
126 let vol3f_x_sqrt2_lmplus = new_definition
127 `vol3f_x_sqrt2_lmplus x1 x2 x3 x4 x5 x6 =
128 vol3f_sqrt2_lmplus (sqrt x1) (sqrt x2) (sqrt x3) (sqrt x4) (sqrt x5) (sqrt x6)`;;
130 let vol3f_x_lfun = new_definition
131 `vol3f_x_lfun x1 x2 (x3:real) (x4:real) (x5:real) x6 = vol3f (sqrt x1) (sqrt x2) (sqrt x6) sqrt2 lfun `;;
133 let vol3_x_sqrt = new_definition
134 `vol3_x_sqrt x1 x2 (x3:real) (x4:real) (x5:real) x6 = vol_y sqrt2 sqrt2 sqrt2 (sqrt x1) (sqrt x2) (sqrt x6) `;;
136 let monomial = new_definition `monomial n1 n2 n3 n4 n5 n6 y1 y2 y3 y4 y5 y6 =
137 (y1 pow n1) * (y2 pow n2) * (y3 pow n3) * (y4 pow n4) * (y5 pow n5) * (y6 pow n6)`;;
139 let arclength_x_234 = new_definition `arclength_x_234 (x1:real) (x2:real) (x3:real) (x4:real) (x5:real) (x6:real) = arclength (sqrt x2) (sqrt x3) (sqrt x4)`;;
141 let arclength_x_126 = new_definition `arclength_x_126 (x1:real) (x2:real) (x3:real) (x4:real) (x5:real) (x6:real) = arclength (sqrt x1) (sqrt x2) (sqrt x6)`;;
144 (* ========================================================================== *)
146 (* ========================================================================== *)
148 let strip_let_tm t = snd(dest_eq(concl(REDEPTH_CONV let_CONV t)));;
150 let strip_let t = REWRITE_RULE[REDEPTH_CONV let_CONV (concl t )] t;;
152 let tame_table_d_values = prove_by_refinement(
153 `tame_table_d 2 1 = #0.103 /\ tame_table_d 1 2 = #0.2759 /\ tame_table_d 0 3 = #0.4488 /\ tame_table_d 4 1 = #0.6548 /\
154 tame_table_d 6 0 = #0.7578 /\
155 tame_table_d 3 1 = #0.3789 /\
156 tame_table_d 2 2 = #0.5518 /\
157 tame_table_d 1 3 = #0.7247 /\
158 tame_table_d 0 4 = #0.8976 /\
159 tame_table_d 5 0 = #0.4819 /\
160 tame_table_d 4 1 = #0.6548 /\
161 tame_table_d 3 2 = #0.8277 /\
162 tame_table_d 2 3 = #1.0006
166 REWRITE_TAC[Sphere.tame_table_d;ARITH_RULE `2 + 2 * 1 > 3 /\ 1 + 2 * 2 > 3 /\ 0 + 2 * 3 > 3 /\ 4 + 2 *1 > 3 /\ 6 + 2 * 0 > 3 /\ (2 + 2 * 3 > 3) /\ (3 + 2 * 2 > 3) /\ (5 + 2 * 0 > 3) /\ (0 + 2 * 4 > 3) /\ (1 + 2 * 3 > 3) /\ (2 + 2 * 2 > 3) /\ (3 + 2 * 1 > 3)` ];
171 let unit0f = prove_by_refinement(
172 `f x1 x2 x3 x4 x5 x6 * unit0 = f x1 x2 x3 x4 x5 x6`,
175 REWRITE_TAC[unit0] THEN REAL_ARITH_TAC
179 let sqrt8_sqrt2 = prove_by_refinement(
180 `sqrt8 = &2 * sqrt2`,
183 SIMP_TAC[Sphere.sqrt8;Sphere.sqrt2;SQRT_MUL;
184 REAL_ARITH `&8 = &2 pow 2 * &2 /\ &0 <= &2 /\ &0 <= &2 pow 2 /\
185 abs(&2) = &2`;POW_2_SQRT_ABS];
189 let sqrt2_sqrt8 = prove_by_refinement(
190 `sqrt2 = #0.5 * sqrt8`,
193 REWRITE_TAC[sqrt8_sqrt2];
198 let SQRT_MUL_POW_2= prove_by_refinement(`!(a:real) b. (a>= &0) /\ (b>= &0) ==> sqrt((a*a)*b)= a* sqrt(b)`,
200 SIMP_TAC[SQRT_MUL;REAL_LE_SQUARE;real_ge];
201 MESON_TAC[sq_pow2;REAL_ARITH `&0 pow 2 = &0`];
204 (* sol0 = const1 * pi, repeated from TameGeneral.hl *)
205 let sol0_EQ_sol_y = prove(`sol0 = sol_y (&2) (&2) (&2) (&2) (&2) (&2)`,
206 REWRITE_TAC[Sphere.sol0; Sphere.sol_y; Sphere.dih_y; Sphere.dih_x; Sphere.delta_x4; Sphere.delta_x] THEN
207 CONV_TAC (DEPTH_CONV let_CONV) THEN
208 CONV_TAC (REAL_RAT_REDUCE_CONV) THEN
209 MP_TAC (SPEC `&1 / &3` Trigonometry2.acs_atn2) THEN
210 CONV_TAC (REAL_RAT_REDUCE_CONV) THEN
211 DISCH_THEN (fun th -> REWRITE_TAC[th]) THEN
212 REWRITE_TAC [REAL_ARITH `&3 * (a - b) - c = (a + d) + (a + d) + (a + d) - c <=> --b = d`] THEN
213 MP_TAC (SPECL [`sqrt (&8 / &9)`; `&1 / &3`] Trigonometry1.ATN2_RNEG) THEN
214 CONV_TAC (REAL_RAT_REDUCE_CONV) THEN
215 DISCH_THEN (fun th -> REWRITE_TAC[SYM th]) THEN
216 SUBGOAL_THEN `sqrt (&2048) = &48 * sqrt (&8 / &9) /\ -- &16 = &48 * (-- &1 / &3)` ASSUME_TAC THENL
218 MP_TAC (SPECL [`&48`; `&8 / &9`] SQRT_MUL_POW_2) THEN
219 CONV_TAC (REAL_RAT_REDUCE_CONV);
222 ASM_REWRITE_TAC[] THEN
223 MATCH_MP_TAC (GSYM Trigonometry1.ATN2_LMUL_EQ) THEN
226 let sol0_over_pi_EQ_const1 = prove(`sol0 / pi = const1`,
227 REWRITE_TAC[sol0_EQ_sol_y; Sphere.const1]);;
229 let sol0_const1 = prove_by_refinement(
230 `sol0 = pi * const1`,
233 REWRITE_TAC[GSYM sol0_over_pi_EQ_const1];
239 let ineq_lemma_b = prove_by_refinement(
240 `!a y b. (&0 <= a /\ &0 <= b /\ a <= y /\ y <= b) ==>
241 a pow 2 <= y pow 2 /\ y pow 2 <= b pow 2 /\ (sqrt (y pow 2) = y)`,
246 SUBGOAL_THEN `&0 <= y` MP_TAC;
247 ASM_MESON_TAC [REAL_LE_TRANS];
248 ASM_MESON_TAC[Collect_geom.POW2_COND;POW_2_SQRT_ABS;
249 REAL_ARITH `&0 <= x ==> (x = abs x)`];
253 let ineq_square2 = prove_by_refinement(
254 `(&0 <= a1 /\ &0 <= a2 /\ &0 <= a3 /\ &0 <= a4 /\ &0 <= a5 /\ &0 <= a6 /\
255 &0 <= b1 /\ &0 <= b2 /\ &0 <= b3 /\ &0 <= b4 /\ &0 <= b5 /\ &0 <= b6 )
258 ineq [(a1 pow 2,x1,b1 pow 2);(a2 pow 2,x2,b2 pow 2);(a3 pow 2,x3,b3 pow 2);
259 (a4 pow 2,x4,b4 pow 2);(a5 pow 2,x5,b5 pow 2);(a6 pow 2,x6,b6 pow 2)]
260 (P (sqrt x1) (sqrt x2) (sqrt x3) (sqrt x4) (sqrt x5) (sqrt x6))) ==>
263 [(a1,y1,b1);(a2,y2,b2);(a3,y3,b3);(a4,y4,b4);(a5,y5,b5);(a6,y6,b6)]
264 (P y1 y2 y3 y4 y5 y6))`,
269 FIRST_X_ASSUM (fun t-> MP_TAC (SPECL [`y1 pow 2`;`y2 pow 2`;`y3 pow 2`;`y4 pow 2`;`y5 pow 2`;`y6 pow 2`] t));
270 SUBGOAL_THEN `(sqrt (y1 pow 2) = y1) /\ (sqrt (y2 pow 2) = y2) /\ (sqrt (y3 pow 2) = y3) /\ (sqrt (y4 pow 2) = y4) /\ (sqrt (y5 pow 2) = y5) /\ (sqrt (y6 pow 2) = y6)` (fun t -> REWRITE_TAC[t]);
271 ASM_MESON_TAC[ineq_lemma_b];
272 REWRITE_TAC[TAUT `(a ==> b ==> c) <=> (a /\ b ==> c)`];
273 DISCH_THEN MATCH_MP_TAC;
274 ASM_MESON_TAC[ineq_lemma_b];
278 let ineq_square2_9 = prove_by_refinement(
279 `(&0 <= a1 /\ &0 <= a2 /\ &0 <= a3 /\ &0 <= a4 /\ &0 <= a5 /\ &0 <= a6 /\
280 &0 <= a7 /\ &0 <= a8 /\ &0 <= a9 /\
281 &0 <= b1 /\ &0 <= b2 /\ &0 <= b3 /\ &0 <= b4 /\ &0 <= b5 /\ &0 <= b6 /\
282 &0 <= b7 /\ &0 <= b8 /\ &0 <= b9
285 (!x1 x2 x3 x4 x5 x6 x7 x8 x9.
286 ineq [(a1 pow 2,x1,b1 pow 2);(a2 pow 2,x2,b2 pow 2);(a3 pow 2,x3,b3 pow 2);
287 (a4 pow 2,x4,b4 pow 2);(a5 pow 2,x5,b5 pow 2);(a6 pow 2,x6,b6 pow 2);
288 (a7 pow 2,x7,b7 pow 2);(a8 pow 2,x8,b8 pow 2);(a9 pow 2,x9,b9 pow 2)]
289 (P (sqrt x1) (sqrt x2) (sqrt x3) (sqrt x4) (sqrt x5) (sqrt x6) (sqrt x7) (sqrt x8) (sqrt x9))) ==>
290 (!y1 y2 y3 y4 y5 y6 y7 y8 y9.
292 [(a1,y1,b1);(a2,y2,b2);(a3,y3,b3);(a4,y4,b4);(a5,y5,b5);(a6,y6,b6);(a7,y7,b7);(a8,y8,b8);(a9,y9,b9)]
293 (P y1 y2 y3 y4 y5 y6 y7 y8 y9))`,
298 FIRST_X_ASSUM (fun t-> MP_TAC (SPECL [`y1 pow 2`;`y2 pow 2`;`y3 pow 2`;`y4 pow 2`;`y5 pow 2`;`y6 pow 2`;`y7 pow 2`;`y8 pow 2`;`y9 pow 2`] t));
299 SUBGOAL_THEN `(sqrt (y1 pow 2) = y1) /\ (sqrt (y2 pow 2) = y2) /\ (sqrt (y3 pow 2) = y3) /\ (sqrt (y4 pow 2) = y4) /\ (sqrt (y5 pow 2) = y5) /\ (sqrt (y6 pow 2) = y6) /\ (sqrt (y7 pow 2) = y7) /\ (sqrt (y8 pow 2) = y8) /\ (sqrt (y9 pow 2) = y9)` (fun t -> REWRITE_TAC[t]);
300 ASM_MESON_TAC[ineq_lemma_b];
301 REWRITE_TAC[TAUT `(a ==> b ==> c) <=> (a /\ b ==> c)`];
302 DISCH_THEN MATCH_MP_TAC;
303 ASM_MESON_TAC[ineq_lemma_b];
307 let sqrt8_nn = prove_by_refinement(
311 REWRITE_TAC[Sphere.sqrt8];
312 MATCH_MP_TAC SQRT_POS_LE;
317 let sqrt2_nn = prove_by_refinement(
321 REWRITE_TAC[Sphere.sqrt2];
322 MATCH_MP_TAC SQRT_POS_LE;
327 let sqrt3_nn = prove_by_refinement(
331 MATCH_MP_TAC SQRT_POS_LE;
336 let basic_constants_nn = [
337 REAL_ARITH `&0 <= #2.18 /\ &0 <= &2 /\ &0 <= #2.52 /\ #2.0 = &2 /\ #2 = &2 /\ &0 <= #2.25 `;
341 let abc_quadratic = prove (`abc_of_quadratic (\x. a * (x pow 2) + b * x + c) = (a,b,c)`,
342 REWRITE_TAC[Sphere.abc_of_quadratic] THEN
343 (REPEAT LET_TAC) THEN
344 REWRITE_TAC[PAIR_EQ] THEN
345 REPEAT(FIRST_X_ASSUM MP_TAC)THEN
348 let delta_quadratic = prove( `-- delta_x x1 x2 x3 x4 x5 x6 =
349 (x1) * (x4 pow 2) + (x1*x1 + (x3 - x5)*(x2 - x6)
350 - x1*(x2 + x3 + x5 + x6)) * x4
351 + ( x1*x3*x5 + x1*x2*x6 - x3*(x1 + x2 - x3 + x5 - x6)*x6
352 - x2*x5*(x1 - x2 + x3 - x5 + x6) ) `,
353 REWRITE_TAC[Sphere.delta_x] THEN
356 let edge_flat_rewrite =
357 REWRITE_RULE[abc_quadratic;delta_quadratic] Sphere.edge_flat;;
359 let enclosed_rewrite =
360 REWRITE_RULE[abc_quadratic]
361 (strip_let(REWRITE_RULE[Mur.muRa;Cayleyr.cayleyR_quadratic] Enclosed.enclosed));;
363 let quad_root_plus_curry =
364 REWRITE_RULE[Sphere.quadratic_root_plus] quadratic_root_plus_curry;;
366 let y_of_x_e = prove(`!y1 y2 y3 y4 y5 y6. y_of_x f y1 y2 y3 y4 y5 y6 =
367 f (y1*y1) (y2*y2) (y3*y3) (y4*y4) (y5*y5) (y6*y6)`,
368 REWRITE_TAC[Sphere.y_of_x]);;
370 let vol_y_e = prove(`!y1 y2 y3 y4 y5 y6. vol_y y1 y2 y3 y4 y5 y6 =
371 y_of_x vol_x y1 y2 y3 y4 y5 y6`,
372 REWRITE_TAC[Sphere.vol_y]);;
374 let rad2_y_e = prove(`!y1 y2 y3 y4 y5 y6. rad2_y y1 y2 y3 y4 y5 y6 =
375 y_of_x rad2_x y1 y2 y3 y4 y5 y6`,
376 REWRITE_TAC[Sphere.rad2_y]);;
378 let rad2_x_y = prove_by_refinement(
379 `!a1 a2 a3 a4 a5 a6 x1 x2 x3 x4 x5 x6.
380 (a1 pow 2 <= x1) /\ (a2 pow 2 <= x2) /\ (a3 pow 2 <= x3) /\ (a4 pow 2 <= x4) /\
381 (a5 pow 2 <= x5) /\ (a6 pow 2 <= x6) ==>
382 (rad2_y (sqrt x1) (sqrt x2) (sqrt x3) (sqrt x4) (sqrt x5) (sqrt x6) =
383 rad2_x x1 x2 x3 x4 x5 x6)`,
386 REWRITE_TAC[Sphere.rad2_y;y_of_x_e;LET_DEF;LET_END_DEF];
387 ASM_MESON_TAC[sq_pow2];
391 let delta_x4_delta4_y = prove_by_refinement(
392 `!a1 a2 a3 a4 a5 a6 x1 x2 x3 x4 x5 x6.
393 (a1 pow 2 <= x1) /\ (a2 pow 2 <= x2) /\ (a3 pow 2 <= x3) /\ (a4 pow 2 <= x4) /\
394 (a5 pow 2 <= x5) /\ (a6 pow 2 <= x6) ==>
395 (delta4_y (sqrt x1) (sqrt x2) (sqrt x3) (sqrt x4) (sqrt x5) (sqrt x6) = delta_x4 x1 x2 x3 x4 x5 x6)`,
398 REWRITE_TAC[Sphere.delta4_y;y_of_x_e;LET_DEF;LET_END_DEF];
399 ASM_MESON_TAC[sq_pow2];
403 let dih_x_y = prove_by_refinement(
404 `!a1 a2 a3 a4 a5 a6 x1 x2 x3 x4 x5 x6.
405 (a1 pow 2 <= x1) /\ (a2 pow 2 <= x2) /\ (a3 pow 2 <= x3) /\ (a4 pow 2 <= x4) /\
406 (a5 pow 2 <= x5) /\ (a6 pow 2 <= x6) ==>
407 (dih_y (sqrt x1) (sqrt x2) (sqrt x3) (sqrt x4) (sqrt x5) (sqrt x6) =
408 dih_x x1 x2 x3 x4 x5 x6)`,
411 REWRITE_TAC[Sphere.dih_y;LET_DEF;LET_END_DEF];
412 ASM_MESON_TAC[sq_pow2];
416 let dih2_x_y = prove_by_refinement(
417 `!a1 a2 a3 a4 a5 a6 x1 x2 x3 x4 x5 x6.
418 (a1 pow 2 <= x1) /\ (a2 pow 2 <= x2) /\ (a3 pow 2 <= x3) /\ (a4 pow 2 <= x4) /\
419 (a5 pow 2 <= x5) /\ (a6 pow 2 <= x6) ==>
420 (dih2_y (sqrt x1) (sqrt x2) (sqrt x3) (sqrt x4) (sqrt x5) (sqrt x6) =
421 dih2_x x1 x2 x3 x4 x5 x6)`,
424 REWRITE_TAC[Sphere.dih2_y;Sphere.dih2_x;Sphere.dih_y;LET_DEF;LET_END_DEF];
425 ASM_MESON_TAC[sq_pow2];
429 let dih3_x_y = prove_by_refinement(
430 `!a1 a2 a3 a4 a5 a6 x1 x2 x3 x4 x5 x6.
431 (a1 pow 2 <= x1) /\ (a2 pow 2 <= x2) /\ (a3 pow 2 <= x3) /\ (a4 pow 2 <= x4) /\
432 (a5 pow 2 <= x5) /\ (a6 pow 2 <= x6) ==>
433 (dih3_y (sqrt x1) (sqrt x2) (sqrt x3) (sqrt x4) (sqrt x5) (sqrt x6) =
434 dih3_x x1 x2 x3 x4 x5 x6)`,
437 REWRITE_TAC[Sphere.dih3_y;Sphere.dih3_x;Sphere.dih_y;LET_DEF;LET_END_DEF];
438 ASM_MESON_TAC[sq_pow2];
442 let delta_x_y = prove_by_refinement(
443 `!a1 a2 a3 a4 a5 a6 x1 x2 x3 x4 x5 x6.
444 (a1 pow 2 <= x1) /\ (a2 pow 2 <= x2) /\ (a3 pow 2 <= x3) /\ (a4 pow 2 <= x4) /\
445 (a5 pow 2 <= x5) /\ (a6 pow 2 <= x6) ==>
446 (delta_y (sqrt x1) (sqrt x2) (sqrt x3) (sqrt x4) (sqrt x5) (sqrt x6) =
447 delta_x x1 x2 x3 x4 x5 x6)`,
450 REWRITE_TAC[Sphere.delta_y;LET_DEF;LET_END_DEF];
451 ASM_MESON_TAC[sq_pow2];
455 let vol_x_y = prove_by_refinement(
456 `!a1 a2 a3 a4 a5 a6 x1 x2 x3 x4 x5 x6.
457 (a1 pow 2 <= x1) /\ (a2 pow 2 <= x2) /\ (a3 pow 2 <= x3) /\ (a4 pow 2 <= x4) /\
458 (a5 pow 2 <= x5) /\ (a6 pow 2 <= x6) ==>
459 (vol_y (sqrt x1) (sqrt x2) (sqrt x3) (sqrt x4) (sqrt x5) (sqrt x6) =
460 vol_x x1 x2 x3 x4 x5 x6)`,
463 REWRITE_TAC[Sphere.vol_y;Sphere.y_of_x;LET_DEF;LET_END_DEF];
464 ASM_MESON_TAC[sq_pow2];
469 let sqrt8_2 = prove_by_refinement(
470 `sqrt8 * sqrt8 = #8.0`,
473 REWRITE_TAC[Sphere.sqrt8];
474 MESON_TAC[REAL_POW_2;SQRT_WORKS;REAL_ARITH `&8 = #8.0 /\ &0 <= &8`];
478 let dih_x_sym = prove_by_refinement(
479 `!x1 x2 x3 x4 x5 x6. dih_x x1 x2 x3 x4 x5 x6 = dih_x x1 x3 x2 x4 x6 x5`,
482 REWRITE_TAC[Sphere.dih_x;LET_DEF;LET_END_DEF];
485 REWRITE_TAC[Sphere.delta_x;Sphere.delta_x4;PAIR_EQ];
486 CONJ_TAC THEN AP_TERM_TAC THEN REAL_ARITH_TAC;
490 let dih_x_sym2 = prove_by_refinement(
491 `!x1 x2 x3 x4 x5 x6. dih_x x1 x2 x3 x4 x5 x6 = dih_x x1 x5 x6 x4 x2 x3`,
494 REWRITE_TAC[Sphere.dih_x;LET_DEF;LET_END_DEF];
497 REWRITE_TAC[Sphere.delta_x;Sphere.delta_x4;PAIR_EQ];
498 CONJ_TAC THEN AP_TERM_TAC THEN REAL_ARITH_TAC;
503 let dih_y_sym = prove_by_refinement(
504 `!y1 y2 y3 y4 y5 y6. dih_y y1 y2 y3 y4 y5 y6 = dih_y y1 y3 y2 y4 y6 y5`,
507 REWRITE_TAC[Sphere.dih_y;LET_DEF;LET_END_DEF];
508 MESON_TAC[dih_x_sym];
512 let dih_y_sym2 = prove_by_refinement(
513 `!y1 y2 y3 y4 y5 y6. dih_y y1 y2 y3 y4 y5 y6 = dih_y y1 y5 y6 y4 y2 y3`,
516 REWRITE_TAC[Sphere.dih_y;LET_DEF;LET_END_DEF];
517 MESON_TAC[dih_x_sym2];
521 let sol_y_123 = prove_by_refinement(
522 `!y1 y2 y3 y4 y5 y6. sol_y y1 y2 y3 y4 y5 y6 =
523 dih_y y1 y2 y3 y4 y5 y6 + dih2_y y1 y2 y3 y4 y5 y6 + dih3_y y1 y2 y3 y4 y5 y6 - pi`,
526 REWRITE_TAC[Sphere.sol_y;Sphere.dih2_y;Sphere.dih3_y];
528 MATCH_MP_TAC (REAL_ARITH `(b = b') ==> (a + b + c -pi = a + b' + c - pi)`);
529 REWRITE_TAC[Sphere.dih_y;LET_DEF;LET_END_DEF];
530 MESON_TAC[dih_x_sym];
534 let rhazim2_alt = prove_by_refinement(
535 `!y1 y2 y3 y4 y5 y6. rhazim2 y1 y2 y3 y4 y5 y6 = rho y2 * dih2_y y1 y2 y3 y4 y5 y6`,
538 REWRITE_TAC[Sphere.rhazim2;Sphere.node2_y;Sphere.rhazim;Sphere.dih2_y;Sphere.dih_y;LET_DEF;LET_END_DEF];
539 MESON_TAC[dih_x_sym];
543 let rhazim3_alt = prove_by_refinement(
544 `!y1 y2 y3 y4 y5 y6. rhazim3 y1 y2 y3 y4 y5 y6 = rho y3 * dih3_y y1 y2 y3 y4 y5 y6`,
547 REWRITE_TAC[Sphere.rhazim3;Sphere.node3_y;Sphere.rhazim;Sphere.dih3_y;Sphere.dih_y;LET_DEF;LET_END_DEF];
551 let taum_123 = prove_by_refinement(
552 `!y1 y2 y3 y4 y5 y6. taum y1 y2 y3 y4 y5 y6 = rhazim y1 y2 y3 y4 y5 y6 + rhazim2 y1 y2 y3 y4 y5 y6 + rhazim3 y1 y2 y3 y4 y5 y6 - (&1 + const1)* pi`,
556 REWRITE_TAC[Sphere.taum;sol_y_123;Sphere.lnazim];
557 SUBGOAL_THEN `dih_y y2 y3 y1 y5 y6 y4 = dih2_y y1 y2 y3 y4 y5 y6 /\ dih_y y3 y1 y2 y6 y4 y5 = dih3_y y1 y2 y3 y4 y5 y6` (fun t-> REWRITE_TAC[t]);
558 REWRITE_TAC[Sphere.dih_y;Sphere.dih2_y;Sphere.dih3_y;LET_DEF;LET_END_DEF] THEN MESON_TAC[dih_x_sym];
559 REWRITE_TAC[Sphere.rhazim;rhazim2_alt;rhazim3_alt;Sphere.rho];
564 let tauq_x_y = prove_by_refinement(
565 `!x1 x2 x3 x4 x5 x6 x7 x8 x9.
566 (tauq (sqrt x1) (sqrt x2) (sqrt x3) (sqrt x4) (sqrt x5) (sqrt x6) (sqrt x7) (sqrt x8) (sqrt x9) =
567 taum_x x1 x2 x3 x4 x5 x6 + taum_x x7 x2 x3 x4 x8 x9)`,
570 REWRITE_TAC[Sphere.tauq;Sphere.taum_x;taum_123;LET_DEF;LET_END_DEF;Sphere.rhazim_x;Sphere.rhazim2_x;Sphere.rhazim3_x];
575 let rho_alt = prove_by_refinement(
576 `!y. rho y = &1 + const1 *(y - &2) / (#0.52)`,
580 REWRITE_TAC[Sphere.rho;Sphere.ly;Sphere.interp;REAL_ARITH `#2.52 - &2 = #0.52`];
585 (* renamed from rho_x to avoid clash with rho_x in sphere.hl *)
587 let rho_sqrtx = prove_by_refinement(
588 `!x. rho (sqrt x) = &1 + const1 * (sqrt x - &2) / (#0.52)`,
591 REWRITE_TAC[rho_alt];
595 let lfun_ly = prove_by_refinement(
596 `!h. lfun h = ly (&2 * h)`,
599 REWRITE_TAC[Sphere.lfun;Sphere.ly;Sphere.interp;Sphere.h0];
604 let lfun1 = prove_by_refinement(
608 REWRITE_TAC[Sphere.lfun;Sphere.h0];
613 let rhazim2_alt = prove_by_refinement(
614 `!y1 y2 y3 y4 y5 y6. rhazim2 y1 y2 y3 y4 y5 y6 = rho y2 * dih2_y y1 y2 y3 y4 y5 y6`,
617 REWRITE_TAC[Sphere.rhazim2;Sphere.node2_y;Sphere.rhazim;Sphere.dih2_y;];
618 MESON_TAC[dih_y_sym];
622 let rhazim3_alt = prove_by_refinement(
623 `!y1 y2 y3 y4 y5 y6. rhazim3 y1 y2 y3 y4 y5 y6 = rho y3 * dih3_y y1 y2 y3 y4 y5 y6`,
626 REWRITE_TAC[Sphere.rhazim3;Sphere.node3_y;Sphere.rhazim;Sphere.dih3_y;];
630 let beta_bump_force_x = prove_by_refinement(
631 `!x1 x2 x3 x4 x5 x6. beta_bump_force_y (sqrt x1) (sqrt x2) (sqrt x3) (sqrt x4) (sqrt x5) (sqrt x6) =
632 halfbump_x1 x1 x2 x3 x4 x5 x6 - halfbump_x4 x1 x2 x3 x4 x5 x6`,
635 REWRITE_TAC[Sphere.beta_bump_force_y;halfbump_x1;halfbump_x4;halfbump_x];
639 let halfbump_x_expand = prove_by_refinement(
640 `!x. &0 <= x ==> (halfbump_x x =
641 -- (&4398119 / &2376200) + (&17500 / &11881) * sqrt x - (&31250 / &106929) * x)`,
644 REWRITE_TAC[halfbump_x;Sphere.bump;Sphere.h0;Sphere.hplus];
646 REWRITE_TAC[REAL_ARITH`(a/ &2 - b) pow 2 = (a pow 2) / &4 - a * b + b pow 2`];
647 ASM_SIMP_TAC[SQRT_POW_2];
652 let vol4f_palt = prove_by_refinement(
653 `!f y1 y2 y3 y4 y5 y6. vol4f y1 y2 y3 y4 y5 y6 f =
657 (dih_y y1 y2 y3 y4 y5 y6 + dih2_y y1 y2 y3 y4 y5 y6 +
658 dih3_y y1 y2 y3 y4 y5 y6 +
659 dih4_y y1 y2 y3 y4 y5 y6 + dih5_y y1 y2 y3 y4 y5 y6 +
660 dih6_y y1 y2 y3 y4 y5 y6)
663 (f (y1/ &2) * dih_y y1 y2 y3 y4 y5 y6 +
664 f(y2/ &2) * dih2_y y1 y2 y3 y4 y5 y6 +
665 f (y3/ &2) * dih3_y y1 y2 y3 y4 y5 y6 +
666 f (y4/ &2) * dih4_y y1 y2 y3 y4 y5 y6 +
667 f(y5/ &2) * dih5_y y1 y2 y3 y4 y5 y6 +
668 f(y6/ &2) * dih6_y y1 y2 y3 y4 y5 y6)
673 REWRITE_TAC[Sphere.vol4f;Sphere.sol_y;lfun_ly;REAL_ARITH `&2 * y / &2 = y`;Sphere.rhazim;rhazim2_alt;rhazim3_alt;Sphere.rhazim4;Sphere.rhazim5;Sphere.rhazim6;];
674 SUBGOAL_THEN `dih_y y2 y3 y1 y5 y6 y4 = dih2_y y1 y2 y3 y4 y5 y6 /\
675 dih_y y3 y1 y2 y6 y4 y5 = dih3_y y1 y2 y3 y4 y5 y6 /\
676 dih_y y3 y1 y2 y6 y4 y5 = dih3_y y1 y2 y3 y4 y5 y6 /\
677 dih_y y4 y3 y5 y1 y6 y2 = dih4_y y1 y2 y3 y4 y5 y6 /\
678 dih_y y5 y1 y6 y2 y4 y3 = dih5_y y1 y2 y3 y4 y5 y6 /\
679 dih_y y6 y1 y5 y3 y4 y2 = dih6_y y1 y2 y3 y4 y5 y6 /\
680 dih_y y6 y4 y2 y3 y1 y5 = dih6_y y1 y2 y3 y4 y5 y6 /\
681 dih_y y2 y6 y4 y5 y3 y1 = dih2_y y1 y2 y3 y4 y5 y6 /\
682 dih_y y1 y5 y6 y4 y2 y3 = dih_y y1 y2 y3 y4 y5 y6 /\
683 dih_y y5 y6 y1 y2 y3 y4 = dih5_y y1 y2 y3 y4 y5 y6 /\
684 dih_y y4 y5 y3 y1 y2 y6 = dih4_y y1 y2 y3 y4 y5 y6 /\
685 dih_y y5 y3 y4 y2 y6 y1 = dih5_y y1 y2 y3 y4 y5 y6 /\
686 dih_y y3 y4 y5 y6 y1 y2 = dih3_y y1 y2 y3 y4 y5 y6 /\
687 dih_y y4 y2 y6 y1 y5 y3 = dih4_y y1 y2 y3 y4 y5 y6` (fun t-> REWRITE_TAC[t]);
688 REWRITE_TAC[Sphere.dih2_y;Sphere.dih3_y;Sphere.dih4_y;Sphere.dih5_y;Sphere.dih6_y];
689 MESON_TAC[dih_y_sym;dih_y_sym2];
690 ONCE_REWRITE_TAC[REAL_ARITH `x = y <=> x - y = &0`];
691 ABBREV_TAC `a = mm1/pi `;
692 SUBGOAL_THEN `mm1 = a * pi ` (fun t->REWRITE_TAC[t]);
694 SUBGOAL_THEN `~(pi = &0)` MP_TAC;
695 SIMP_TAC[PI_POS;REAL_ARITH `&0 < x ==> ~(x= &0)`];
702 let edge_flat2_x_rewrite = prove_by_refinement(
703 `!x1 x2 x3 x4 x5 x6. (&0 <= x1 /\ &0 <= x2 /\ &0 <= x3 /\ &0 <= x5 /\
704 &0 <= x6) ==> (edge_flat2_x x1 x2 x3 x4 x5 x6 =
705 (sqrt (quadratic_root_plus
708 (x3 - x5) * (x2 - x6) -
709 (x1) * (x2 + x3 + x5 + x6),
713 (x1 + x2 - x3 + x5 - x6) * x6 -
716 (x1 - x2 + x3 - x5 + x6)))) pow 2)`,
719 REWRITE_TAC[Sphere.edge_flat2_x];
723 REWRITE_TAC[edge_flat_rewrite];
724 ASM_SIMP_TAC[REAL_ARITH `sqrt x * sqrt x = (sqrt x) pow 2`;SQRT_POW2;SQRT_WORKS];
728 let edge_quadratic = prove_by_refinement(
729 `!x1 x2 x3 x5 x6. quadratic_root_plus (x1,
731 (x3 - x5) * (x2 - x6) -
732 x1 * (x2 + x3 + x5 + x6),
734 (x1) * (x2) * x6 - (x3) * (x1 + x2 - x3 + x5 - x6) * x6 -
735 (x2) * (x5) * (x1 - x2 + x3 - x5 + x6)) =
736 (-- (x1 * x1) + x1*x2 + x1*x3 - x2*x3 + x1*x5 + x2*x5 + x1*x6 + x3*x6 -
737 x5*x6 + sqrt(ups_x x1 x3 x5 * ups_x x1 x2 x6))/(&2*x1)`,
740 REWRITE_TAC[Sphere.quadratic_root_plus;Sphere.ups_x];
744 REWRITE_TAC[REAL_ARITH `--(x1 * x1 + (x3 - x5) * (x2 - x6) - x1 * (x2 + x3 + x5 + x6)) + a = -- (x1 * x1) + x1 * x2 + x1 * x3 - x2 * x3 + x1 * x5 + x2 * x5 + x1 * x6 + x3 * x6 - x5 * x6 + a`];
745 REPEAT (AP_THM_TAC ORELSE AP_TERM_TAC);
750 let lmfun0 = prove_by_refinement(
751 `!y. &2 * h0 <= y ==> (lmfun (y/ &2) = &0)`,
754 REWRITE_TAC[Sphere.lmfun;REAL_ARITH `&2 * h0 <= y <=> (~(y/ &2 <= h0) \/ (y/ &2 = h0))`];
756 DISCH_THEN DISJ_CASES_TAC THEN ASM_REWRITE_TAC[REAL_ARITH `h0 <= h0`;REAL_FIELD `(h0 - h0)/(h0 - &1) = &0`];
760 let lmfun_lfun = prove_by_refinement(
761 `!y. y <= &2 * h0 ==> (lmfun (y/ &2) = lfun(y/ &2))`,
764 REWRITE_TAC[Sphere.lmfun;Sphere.lfun;REAL_ARITH `y <= &2 * h0 <=> y/ &2 <= h0`];
765 REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[];
769 let lmfun_lfun2 = prove_by_refinement(
770 `!y. y <= h0 ==> (lmfun (y) = lfun(y))`,
773 REWRITE_TAC[Sphere.lmfun;Sphere.lfun];
774 REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[];
780 let quartic_has_real_derivative = prove_by_refinement(
781 `!x c0 c1 c2 c3 c4 . ((\x. c0 * &1 + c1 * x pow 1 + c2 * x pow 2 + c3 * x pow 3 + c4 * x pow 4) has_real_derivative (c0 * &0 + c1 * (&1 * x pow (1-1) * &1) + c2 * (&2 * x pow (2-1)) * &1 + c3 * (&3 * x pow (3-1)) * &1 + c4 * (&4 * x pow (4-1)) * &1)) (atreal x)`,
784 REPEAT STRIP_TAC THEN
785 REPEAT (MATCH_MP_TAC HAS_REAL_DERIVATIVE_ADD THEN CONJ_TAC) THEN MATCH_MP_TAC (HAS_REAL_DERIVATIVE_LMUL_ATREAL) THEN REWRITE_TAC[HAS_REAL_DERIVATIVE_CONST] THEN REWRITE_TAC[REAL_ARITH `(a * b) * c = a * b * (c:real)`] THEN MATCH_MP_TAC (HAS_REAL_DERIVATIVE_POW_ATREAL) THEN REWRITE_TAC[HAS_REAL_DERIVATIVE_ID];
789 let POLY_CONTINUITY_TAC =
790 REPEAT (MATCH_MP_TAC REAL_CONTINUOUS_ON_ADD THEN
792 REPEAT (MATCH_MP_TAC REAL_CONTINUOUS_ON_LMUL) THEN
793 (MATCH_MP_TAC REAL_CONTINUOUS_ON_POW) THEN
794 REWRITE_TAC[REAL_CONTINUOUS_ON_ID];;
796 let quartic_continuous_on = prove_by_refinement(
797 `!s c0 c1 c2 c3 c4 . (\x. c0 * x pow 0 + c1 * x pow 1 + c2 * x pow 2 + c3 * x pow 3 + c4 * x pow 4) real_continuous_on s`,
805 let marchal_minus_lfun = prove_by_refinement(
806 `!h. marchal_quartic h - lfun h =
807 (inv(&65 * &1627 * (sqrt(&2) - &1))) * (h - &1)*
808 (( -- &512505 + &770958*sqrt(&2)) * h pow 0 +
809 ( -- &364208 - &1295359*sqrt(&2)) * h pow 1 +
810 ( &1295359 + &585000*sqrt(&2))* h pow 2 +
811 (-- &585000) * h pow 3)`,
814 REWRITE_TAC[Sphere.marchal_quartic;Sphere.lfun;REAL_ARITH `x/y = x * inv y /\ #1.26 - &1 = &13/ &50 /\ #1.3254 - &1 = &1627/ &5000 /\ &65 = &5 * &13`;REAL_INV_INV;REAL_INV_MUL;Sphere.hplus;Sphere.h0];
816 SUBGOAL_THEN `&0 < sqrt(&2) - &1 ` MP_TAC THENL [ALL_TAC;CONV_TAC REAL_FIELD];
817 SUBGOAL_THEN `#1.414213 < sqrt(&2) ` MP_TAC THENL[ALL_TAC;REAL_ARITH_TAC];
818 REWRITE_TAC[GSYM Sphere.sqrt2;Flyspeck_constants.bounds];
822 let hminus_cont = prove_by_refinement(
823 `!s. (\h. marchal_quartic h - lfun h) real_continuous_on s`,
827 REWRITE_TAC[marchal_minus_lfun];
828 MATCH_MP_TAC REAL_CONTINUOUS_ON_LMUL;
829 MATCH_MP_TAC REAL_CONTINUOUS_ON_MUL THEN REWRITE_TAC[REAL_ARITH `h - &1 = (-- &1) * h pow 0 + &1 * h pow 1`] THEN CONJ_TAC THEN POLY_CONTINUITY_TAC;
833 let sqrt2_lb = prove_by_refinement(
834 `#1.414213 < sqrt2 `,
837 REWRITE_TAC[Flyspeck_constants.bounds];
841 let STRIP_NN_TAC = REPEAT (CONJ_TAC ORELSE MATCH_MP_TAC REAL_LE_MUL ORELSE CHANGED_TAC (REWRITE_TAC[REAL_LE_INV_EQ;REAL_ARITH `a >= &0 <=> &0 <= a /\ ((a*b)*c = a*b*c)`;REAL_INV_MUL]));;
843 let hminus_exists = prove_by_refinement(
844 `?x. (#1.2 <= x /\ x < #1.3 /\ marchal_quartic x = lmfun x)`,
847 SUBGOAL_THEN `(?x. x IN real_interval [#1.2,#1.26] /\ (\x. marchal_quartic x - lfun x) x = &0)` MP_TAC;
848 MATCH_MP_TAC REAL_IVT_INCREASING;
850 REWRITE_TAC[hminus_cont];
851 REWRITE_TAC[marchal_minus_lfun;GSYM Sphere.sqrt2];
853 SUBGOAL_THEN `&0 < sqrt2 - &1` ASSUME_TAC;
856 REWRITE_TAC[(* REAL_INV_MUL;REAL_INV_INV; *) REAL_ARITH `#1.2- &1 = &1 / &5 /\ #1.26 - &1 = &13 / &50`];
857 CONJ_TAC THENL[REAL_ARITH_TAC;ALL_TAC];
858 SUBGOAL_THEN `sqrt2 < #1.414214` ASSUME_TAC;
859 REWRITE_TAC[Flyspeck_constants.bounds];
860 SUBGOAL_THEN ` ((-- &512505 + &770958 * sqrt2) * #1.26 pow 0 + (-- &364208 - &1295359 * sqrt2) * #1.26 pow 1 + (&1295359 + &585000 * sqrt2) * #1.26 pow 2 + -- &585000 * #1.26 pow 3) = -- &212787729/ &2500 + &3377583 *sqrt2 /(&50)` (fun t-> REWRITE_TAC[t]);
862 SUBGOAL_THEN `((-- &512505 + &770958 * sqrt2) * #1.2 pow 0 + (-- &364208 - &1295359 * sqrt2) * #1.2 pow 1 + (&1295359 + &585000 * sqrt2) * #1.2 pow 2 + -- &585000 * #1.2 pow 3) = -- &2377941/ &25 + (& 294636* sqrt2)/ &5` (fun t-> REWRITE_TAC[t]);
864 REWRITE_TAC[REAL_ARITH `a * b * c <= &0 <=> (&0 <= a * b * (-- c))`];
865 STRIP_NN_TAC THEN (REPEAT (POP_ASSUM MP_TAC)) THEN TRY REAL_ARITH_TAC;
867 REWRITE_TAC[real_interval;IN_ELIM_THM];
870 SUBGOAL_THEN `x <= &2 * h0` ASSUME_TAC;
871 REWRITE_TAC[Sphere.h0];
872 UNDISCH_TAC `x <= #1.26` THEN REAL_ARITH_TAC;
873 ASM_SIMP_TAC [Sphere.h0;lmfun_lfun2];
874 REPEAT (POP_ASSUM MP_TAC);
879 let hminus_prop = prove_by_refinement(
880 `#1.2 <= hminus /\ hminus < #1.3 /\ marchal_quartic hminus = lmfun hminus`,
883 MP_TAC hminus_exists;
884 MP_TAC Sphere.hminus;
889 let hminus_high = prove_by_refinement(
890 `!h. (h0 <= h) ==> lmfun h = &0`,
893 REWRITE_TAC[Sphere.lmfun;REAL_ARITH `h0 <= h <=> (~(h <= h0) \/ (h = h0))`];
895 DISCH_THEN DISJ_CASES_TAC THEN ASM_REWRITE_TAC[REAL_ARITH `h0 <= h0`;REAL_FIELD `(h0 - h0)/(h0 - &1) = &0`];
899 let hminus_lt_h0 = prove_by_refinement(
900 `!h. (&1 <= h) /\ (h < hplus) ==> (marchal_quartic h > &0)`,
904 REWRITE_TAC[Sphere.marchal_quartic];
905 REWRITE_TAC[REAL_ARITH `(h-hplus)*(&9 * h pow 2 - &17 * h + &3)/u = (hplus - h)*(&17 * h - &9 * h pow 2 - &3)/u /\ (u > &0 <=> &0 < u)`];
906 MATCH_MP_TAC REAL_LT_MUL;
909 SUBGOAL_THEN `&0 < sqrt(&2) - hplus` MP_TAC;
910 REWRITE_TAC[Flyspeck_constants.bounds];
912 MATCH_MP_TAC REAL_LT_MUL;
914 POP_ASSUM MP_TAC THEN REAL_ARITH_TAC;
915 MATCH_MP_TAC REAL_LT_DIV;
916 REWRITE_TAC[Flyspeck_constants.bounds];
917 REPEAT (POP_ASSUM MP_TAC);
918 REWRITE_TAC[Sphere.hplus];
919 ABBREV_TAC `u = h - &1`;
920 SUBGOAL_THEN `h = u + &1` (fun t->REWRITE_TAC[t]);
921 POP_ASSUM MP_TAC THEN REAL_ARITH_TAC;
922 REWRITE_TAC[REAL_FIELD `(&1 <= u + &1 <=> &0 <= u) /\ (u + &1 < #1.3254 <=> u < #0.3254) /\ (&17 * (u + &1) - &9 * (u+ &1) pow 2 - &3 = -- &9 * u pow 2 - u + &5)`];
923 POP_ASSUM (fun t->ALL_TAC);
925 SUBGOAL_THEN `u pow 2 < #0.3254 pow 2` MP_TAC;
926 REWRITE_TAC[ GSYM REAL_LT_SQUARE_ABS];
927 REPEAT (POP_ASSUM MP_TAC) THEN REAL_ARITH_TAC;
928 REPEAT (POP_ASSUM MP_TAC);
929 ABBREV_TAC `v = u pow 2`;
934 let hminus_lt_h0 = prove_by_refinement(
938 REWRITE_TAC [REAL_ARITH `x < y <=> ~(x >= y)`];
943 MATCH_MP_TAC (REAL_ARITH `a > b ==>((a:real) = b ==> F)`);
944 SUBGOAL_THEN `lmfun hminus = &0` (fun t -> REWRITE_TAC[t]);
945 MATCH_MP_TAC hminus_high;
946 UNDISCH_TAC `hminus >= h0` THEN REAL_ARITH_TAC;
947 MATCH_MP_TAC hminus_lt_h0;
948 REPEAT (POP_ASSUM MP_TAC);
949 REWRITE_TAC[Sphere.hplus;Sphere.h0];
954 let h0_lt_hplus = prove_by_refinement(
958 REWRITE_TAC[Sphere.h0;Sphere.hplus];
963 let hminus_gt = prove_by_refinement(
967 REWRITE_TAC[hminus_prop];
971 let lminus_ge_h0 = prove_by_refinement(
972 `!h. (hplus <= h) /\ (h <= sqrt (&2)) ==> (marchal_quartic h <= &0)`,
975 REWRITE_TAC[Sphere.marchal_quartic];
976 REWRITE_TAC[REAL_ARITH `a * b * c /d <= &0 <=> &0 <= a * b * (-- c)/d`];
978 MATCH_MP_TAC REAL_LE_MUL;
982 MATCH_MP_TAC REAL_LE_MUL;
984 REPEAT (POP_ASSUM MP_TAC) THEN REAL_ARITH_TAC;
985 MATCH_MP_TAC REAL_LE_DIV;
988 REPEAT (POP_ASSUM MP_TAC);
989 REWRITE_TAC[Sphere.hplus];
990 ABBREV_TAC `u = h - &1`;
991 SUBGOAL_THEN `h = u + &1` (fun t->REWRITE_TAC[t]);
992 POP_ASSUM MP_TAC THEN REAL_ARITH_TAC;
993 REWRITE_TAC[REAL_FIELD `(&1 <= u + &1 <=> &0 <= u) /\ (#1.3254 <= u + &1 <=> #0.3254 <= u) /\ (-- (&9* (u + &1) pow 2 - &17 * (u+ &1) + &3) = -- &9 * u pow 2 - u + &5)`];
995 SUBGOAL_THEN `u pow 2 < #0.42 pow 2` MP_TAC;
996 REWRITE_TAC[ GSYM REAL_LT_SQUARE_ABS];
1000 SUBGOAL_THEN `sqrt(&2) - &1 < #0.42` (fun t-> (MP_TAC t) THEN REAL_ARITH_TAC);
1001 SUBGOAL_THEN `sqrt(&2) < #1.414214` MP_TAC;
1002 REWRITE_TAC[GSYM Sphere.sqrt2;Flyspeck_constants.bounds];
1004 SUBGOAL_THEN `u < #0.414214` MP_TAC;
1005 SUBGOAL_THEN `sqrt(&2) < #1.414214` MP_TAC;
1006 REWRITE_TAC[GSYM Sphere.sqrt2;Flyspeck_constants.bounds];
1010 MATCH_MP_TAC (REAL_ARITH `&0 < x ==> &0 <= x`);
1011 REWRITE_TAC[Flyspeck_constants.bounds];
1015 let gcy_high = prove_by_refinement(
1016 `!y. (&2 * h0 <= y) ==> (gcy y = &4 * mm1/pi)`,
1019 REWRITE_TAC[Sphere.gcy];
1025 let gcy_low = prove_by_refinement(
1026 `!y. (y <= &2 * h0) ==> (gcy y = gchi y)`,
1029 REWRITE_TAC[Sphere.gcy;Sphere.gchi];
1030 SIMP_TAC[lmfun_lfun];
1031 REWRITE_TAC[Sphere.lfun;Sphere.h0];
1033 ABBREV_TAC `m = mm2/pi`;
1038 let gcy_low_hminus = prove_by_refinement(
1039 `!y. (y <= &2 * hminus) ==> (gcy y = gchi y)`,
1043 MATCH_MP_TAC gcy_low;
1045 MP_TAC hminus_lt_h0;
1050 let c2001 = prove_by_refinement(
1051 `!y. (y <= #2.001) ==> (y <= &2 * h0)`,
1053 REWRITE_TAC[Sphere.h0];
1058 let gcy_low_const = prove_by_refinement(
1059 `!y. (y <= #2.001) ==> (gcy y = gchi y)`,
1063 MATCH_MP_TAC gcy_low;
1065 REWRITE_TAC[Sphere.h0];
1070 let gcy_high_hplus = prove_by_refinement(
1071 `!y. (&2 * hplus <= y) ==> (gcy y = &4 * mm1/pi)`,
1075 MATCH_MP_TAC gcy_high;
1076 FIRST_X_ASSUM MP_TAC;
1082 let hm0 = prove_by_refinement(
1083 `!y. ((y <= &2 * hminus) ==> (y <= &2 * h0))`,
1086 MP_TAC hminus_lt_h0;
1087 CONV_TAC REAL_FIELD;
1091 let h0_lt_gt = prove_by_refinement(
1092 `((y <= #2.01) ==> (y <= &2 * h0)) /\
1093 ((#2.8 <= y) ==> (&2 * h0 <= y)) /\
1094 (( y <= &2) ==> (y <= &2 * h0)) /\
1095 ((sqrt8 <= y) ==> (&2 * h0 <= y)) /\ ((&2 * h0 <= y) ==> (&0 <= y)) /\
1096 ((&2 <= y) ==> (&0 <= y)) /\
1097 ((y <= &2 * hminus) ==> (y <= &2 * h0)) /\
1098 ((&2 * hminus <= y) ==> (&0 <= y))`,
1101 REWRITE_TAC[Sphere.h0;sqrt8_sqrt2;hm0];
1108 let sqrtxx = prove_by_refinement(
1109 `!x. &0 <= x ==> (sqrt(x * x) = x)`,
1112 REWRITE_TAC[POW_2_SQRT_ABS;REAL_ARITH `x * x = x pow 2`];
1117 let lmdih_ldih = prove_by_refinement(
1118 `!y1 y2 y3 y4 y5 y6. (&0 <= y1 /\ y1 <= &2 * h0) ==>(y_of_x lmdih_x_div_sqrtdelta_posbranch y1 y2 y3 y4 y5 y6 = y_of_x ldih_x_div_sqrtdelta_posbranch y1 y2 y3 y4 y5 y6 )`,
1121 REWRITE_TAC[Sphere.y_of_x;Nonlin_def.lmdih_x_div_sqrtdelta_posbranch;Nonlin_def.ldih_x_div_sqrtdelta_posbranch];
1122 MESON_TAC[sqrtxx;lmfun_lfun];
1126 let lmdih3_ldih3 = prove_by_refinement(
1127 `!y1 y2 y3 y4 y5 y6. (&0 <= y3 /\ y3 <= &2 * h0) ==>(y_of_x lmdih3_x_div_sqrtdelta_posbranch y1 y2 y3 y4 y5 y6 = y_of_x ldih3_x_div_sqrtdelta_posbranch y1 y2 y3 y4 y5 y6 )`,
1130 REWRITE_TAC[Sphere.rotate3;Nonlin_def.lmdih_x_div_sqrtdelta_posbranch;Nonlin_def.ldih_x_div_sqrtdelta_posbranch;Sphere.y_of_x;Nonlin_def.lmdih3_x_div_sqrtdelta_posbranch;Nonlin_def.ldih3_x_div_sqrtdelta_posbranch];
1131 MESON_TAC[sqrtxx;lmfun_lfun];
1135 let lmdih5_ldih5 = prove_by_refinement(
1136 `!y1 y2 y3 y4 y5 y6. (&0 <= y5 /\ y5 <= &2 * h0) ==>(y_of_x lmdih5_x_div_sqrtdelta_posbranch y1 y2 y3 y4 y5 y6 = y_of_x ldih5_x_div_sqrtdelta_posbranch y1 y2 y3 y4 y5 y6 )`,
1139 REWRITE_TAC[Sphere.rotate5;Nonlin_def.lmdih_x_div_sqrtdelta_posbranch;Nonlin_def.ldih_x_div_sqrtdelta_posbranch;Sphere.y_of_x;Nonlin_def.lmdih5_x_div_sqrtdelta_posbranch;Nonlin_def.ldih5_x_div_sqrtdelta_posbranch];
1140 MESON_TAC[sqrtxx;lmfun_lfun];
1144 let lmdih_ldih' = REWRITE_RULE[Sphere.y_of_x] lmdih_ldih;;
1145 let lmdih3_ldih3' = REWRITE_RULE[Sphere.y_of_x] lmdih3_ldih3;;
1146 let lmdih5_ldih5' = REWRITE_RULE[Sphere.y_of_x] lmdih5_ldih5;;
1148 let lmdih0 = prove_by_refinement(
1149 `!y1 y2 y3 y4 y5 y6. (&2 * h0 <= y1 ) ==>(y_of_x lmdih_x_div_sqrtdelta_posbranch y1 y2 y3 y4 y5 y6 = &0 )`,
1152 REWRITE_TAC[Sphere.y_of_x;Nonlin_def.lmdih_x_div_sqrtdelta_posbranch;Nonlin_def.ldih_x_div_sqrtdelta_posbranch];
1153 MESON_TAC[sqrtxx;lmfun0;REAL_ARITH `&0 * x = &0 `;h0_lt_gt];
1157 let lmdih3_0 = prove_by_refinement(
1158 `!y1 y2 y3 y4 y5 y6. (&2 * h0 <= y3 ) ==>(y_of_x lmdih3_x_div_sqrtdelta_posbranch y1 y2 y3 y4 y5 y6 = &0 )`,
1161 REWRITE_TAC[Sphere.y_of_x;Nonlin_def.lmdih3_x_div_sqrtdelta_posbranch;Sphere.rotate3;Nonlin_def.lmdih_x_div_sqrtdelta_posbranch;Nonlin_def.ldih_x_div_sqrtdelta_posbranch];
1162 MESON_TAC[sqrtxx;lmfun0;REAL_ARITH `&0 * x = &0 `;h0_lt_gt];
1166 let lmdih5_0 = prove_by_refinement(
1167 `!y1 y2 y3 y4 y5 y6. (&2 * h0 <= y5 ) ==>(y_of_x lmdih5_x_div_sqrtdelta_posbranch y1 y2 y3 y4 y5 y6 = &0 )`,
1170 REWRITE_TAC[Sphere.y_of_x;Nonlin_def.lmdih5_x_div_sqrtdelta_posbranch;Sphere.rotate5;Nonlin_def.lmdih_x_div_sqrtdelta_posbranch;Nonlin_def.ldih_x_div_sqrtdelta_posbranch];
1171 MESON_TAC[sqrtxx;lmfun0;REAL_ARITH `&0 * x = &0 `;h0_lt_gt];
1175 let lmdih1_0' = REWRITE_RULE[Sphere.y_of_x] lmdih0;;
1176 let lmdih3_0' = REWRITE_RULE[Sphere.y_of_x] lmdih3_0;;
1177 let lmdih5_0' = REWRITE_RULE[Sphere.y_of_x] lmdih5_0;;
1179 let vol4f_lmfun = prove_by_refinement(
1180 `! y1 y2 y3 y4 y5 y6. vol4f y1 y2 y3 y4 y5 y6 lmfun =
1183 gcy y1 * dih_y y1 y2 y3 y4 y5 y6 + gcy y2 * dih2_y y1 y2 y3 y4 y5 y6 +
1184 gcy y3 * dih3_y y1 y2 y3 y4 y5 y6 +
1185 gcy y4 * dih4_y y1 y2 y3 y4 y5 y6 +
1186 gcy y5 * dih5_y y1 y2 y3 y4 y5 y6 +
1187 gcy y6 * dih6_y y1 y2 y3 y4 y5 y6`,
1190 REWRITE_TAC[vol4f_palt;Sphere.gcy];
1195 let gamma4fgcy_alt = prove_by_refinement(`gamma4fgcy y1 y2 y3 y4 y5 y6 lmfun =
1196 vol_y y1 y2 y3 y4 y5 y6 -
1199 gcy y1 * dih_y y1 y2 y3 y4 y5 y6 + gcy y2 * dih2_y y1 y2 y3 y4 y5 y6 +
1200 gcy y3 * dih3_y y1 y2 y3 y4 y5 y6 +
1201 gcy y4 * dih4_y y1 y2 y3 y4 y5 y6 +
1202 gcy y5 * dih5_y y1 y2 y3 y4 y5 y6 +
1203 gcy y6 * dih6_y y1 y2 y3 y4 y5 y6)`,
1205 REWRITE_TAC[Sphere.gamma4fgcy;Sphere.gamma4f;vol4f_lmfun];
1208 let vol3f_palt = prove_by_refinement(
1209 `!y1 y2 y3 y4 y5 y6 r f.
1210 (y3 = r) /\ (y4 = r) /\ (y5 = r) ==>
1211 (vol3f y1 y2 y6 r f = (&2 * mm1 / pi) *
1212 (&2 * dih_y y1 y2 y3 y4 y5 y6 + &2 * dih2_y y1 y2 y3 y4 y5 y6 +
1213 &2 * dih6_y y1 y2 y3 y4 y5 y6 + dih3_y y1 y2 y3 y4 y5 y6 +
1214 dih4_y y1 y2 y3 y4 y5 y6 + dih5_y y1 y2 y3 y4 y5 y6 - &3 * pi) -
1216 (f (y1 / &2) * dih_y y1 y2 y3 y4 y5 y6 +
1217 f (y2 / &2) * dih2_y y1 y2 y3 y4 y5 y6 +
1218 f (y6 / &2) * dih6_y y1 y2 y3 y4 y5 y6))`,
1222 REWRITE_TAC[Sphere.vol3f;Sphere.sol_y];
1223 DISCH_THEN (fun t->REWRITE_TAC[t]);
1224 REWRITE_TAC[Sphere.dih2_y;Sphere.dih3_y;Sphere.dih4_y;Sphere.dih5_y;Sphere.dih6_y];
1225 ABBREV_TAC `a = &8 * mm2/pi`;
1226 ABBREV_TAC `b = &2 * mm1/pi`;
1227 SUBGOAL_THEN `dih_y y2 r y1 r y6 r = dih_y y2 y1 r r r y6 /\ dih_y y2 y6 r r r y1 = dih_y y2 y1 r r r y6 /\ dih_y y6 r y2 r y1 r = dih_y y6 y1 r r r y2 /\ dih_y y1 r y6 r y2 r = dih_y y1 y2 r r r y6 /\ dih_y r y6 y1 y2 r r = dih_y r y1 y6 y2 r r` (fun t->REWRITE_TAC[t]);
1228 MESON_TAC[dih_y_sym2;dih_y_sym];
1229 MATCH_MP_TAC (REAL_ARITH `(a = a') ==> (a - c = a' - c)`);
1234 let vol3f_135_palt = prove_by_refinement(
1235 `!y1 y2 y3 y4 y5 y6 r f.
1236 (y2 = r) /\ (y4 = r) /\ (y6 = r) ==>
1237 (vol3f y1 y3 y5 r f = (&2 * mm1 / pi) *
1238 (&2 * dih_y y1 y2 y3 y4 y5 y6 + &2 * dih3_y y1 y2 y3 y4 y5 y6 +
1239 &2 * dih5_y y1 y2 y3 y4 y5 y6 + dih2_y y1 y2 y3 y4 y5 y6 +
1240 dih4_y y1 y2 y3 y4 y5 y6 + dih6_y y1 y2 y3 y4 y5 y6 - &3 * pi) -
1242 (f (y1 / &2) * dih_y y1 y2 y3 y4 y5 y6 +
1243 f (y3 / &2) * dih3_y y1 y2 y3 y4 y5 y6 +
1244 f (y5 / &2) * dih5_y y1 y2 y3 y4 y5 y6))`,
1248 REWRITE_TAC[Sphere.vol3f;Sphere.sol_y];
1249 DISCH_THEN (fun t->REWRITE_TAC[t]);
1250 REWRITE_TAC[Sphere.dih2_y;Sphere.dih3_y;Sphere.dih4_y;Sphere.dih5_y;Sphere.dih6_y];
1251 ABBREV_TAC `a = &8 * mm2/pi`;
1252 ABBREV_TAC `b = &2 * mm1/pi`;
1253 SUBGOAL_THEN `dih_y y3 r y1 r y5 r = dih_y y3 y5 r r r y1 /\ dih_y y5 r y3 r y1 r = dih_y y5 y1 r r r y3 /\ dih_y y1 r y5 r y3 r = dih_y y1 y3 r r r y5 /\ dih_y y1 r y3 r y5 r = dih_y y1 y3 r r r y5 /\ dih_y y3 y1 r r r y5 = dih_y y3 y5 r r r y1 /\ dih_y r r r y1 y5 y3 = dih_y r y3 y5 y1 r r /\ dih_y r y1 y5 y3 r r = dih_y r y5 y1 y3 r r` (fun t->REWRITE_TAC[t]);
1254 MESON_TAC[dih_y_sym2;dih_y_sym];
1255 MATCH_MP_TAC (REAL_ARITH `(a = a') ==> (a - c = a' - c)`);
1260 let vol3r_alt = prove_by_refinement(
1261 `! y1 y2 y3 y4 y5 y6 r. (y3 = r ) /\ (y4 = r) /\ (y5 = r) ==>
1262 (vol3r y1 y2 y6 r = vol_y y1 y2 y3 y4 y5 y6)`,
1265 REWRITE_TAC[Sphere.vol3r;Sphere.vol_y;Sphere.y_of_x;Sphere.vol_x;Sphere.delta_x];
1267 DISCH_THEN (fun t->REWRITE_TAC[t]);
1275 (* a few lemmas copied from TameGeneral *)
1277 let COS_PI3 = prove(`cos (pi / &3) = &1 / &2`,
1278 REWRITE_TAC[COS_SIN] THEN
1279 REWRITE_TAC[REAL_ARITH `pi / &2 - pi / &3 = pi / &6`] THEN
1280 REWRITE_TAC[SIN_PI6]);;
1282 let ACS_2 = prove(`acs (&1 / &2) = pi / &3`,
1283 REWRITE_TAC[SYM COS_PI3] THEN
1284 MATCH_MP_TAC ACS_COS THEN
1285 REWRITE_TAC[REAL_ARITH `(&0 <= a / &3 <=> &0 <= a) /\ (a / &3 <= a <=> &0 <= a)`] THEN
1286 MATCH_MP_TAC REAL_LT_IMP_LE THEN
1287 REWRITE_TAC[PI_POS]);;
1289 let sol0_POS = prove(`&0 < sol0`,
1290 REWRITE_TAC[Sphere.sol0] THEN
1291 REWRITE_TAC[REAL_ARITH `&0 < &3 * a - pi <=> pi / &3 < a`] THEN
1292 REWRITE_TAC[SYM ACS_2] THEN
1293 MATCH_MP_TAC ACS_MONO_LT THEN
1296 let vol4f_alt = prove_by_refinement(
1297 `!y1 y2 y3 y4 y5 y6. vol4f y1 y2 y3 y4 y5 y6 lfun =
1300 (&4 * mm1/pi - &8 * mm2 *(&1+const1)/(pi * const1) ) *
1301 (dih_y y1 y2 y3 y4 y5 y6 + dih2_y y1 y2 y3 y4 y5 y6 + dih3_y y1 y2 y3 y4 y5 y6 +
1302 dih4_y y1 y2 y3 y4 y5 y6 + dih5_y y1 y2 y3 y4 y5 y6 + dih6_y y1 y2 y3 y4 y5 y6)
1304 (&8 * mm2 / (pi * const1)) *
1305 (rhazim y1 y2 y3 y4 y5 y6 + rhazim2 y1 y2 y3 y4 y5 y6 + rhazim3 y1 y2 y3 y4 y5 y6 +
1306 rhazim4 y1 y2 y3 y4 y5 y6 + rhazim5 y1 y2 y3 y4 y5 y6 + rhazim6 y1 y2 y3 y4 y5 y6)
1311 REWRITE_TAC[vol4f_palt];
1312 REWRITE_TAC[Sphere.sol_y;lfun_ly;REAL_ARITH `&2 * y / &2 = y`;Sphere.rhazim;rhazim2_alt;rhazim3_alt;Sphere.rhazim4;Sphere.rhazim5;Sphere.rhazim6;];
1313 REWRITE_TAC[Sphere.rho;Sphere.node2_y;Sphere.node3_y;Sphere.rhazim];
1314 ONCE_REWRITE_TAC[REAL_ARITH `x = y <=> x - y = &0`];
1315 SUBGOAL_THEN `~(pi = &0)` ASSUME_TAC;
1316 SIMP_TAC[PI_POS;REAL_ARITH `&0 < x ==> ~(x= &0)`];
1317 SUBGOAL_THEN `~(const1 = &0)` MP_TAC;
1318 REWRITE_TAC[GSYM sol0_over_pi_EQ_const1];
1320 FIRST_X_ASSUM MP_TAC;
1321 CONV_TAC REAL_FIELD;
1322 FIRST_X_ASSUM MP_TAC;
1323 CONV_TAC REAL_FIELD;
1327 let vol2f_marchal_pow_y = prove_by_refinement(
1328 `!r y. vol2f y r marchal_quartic =
1329 let fac = (-- (&8 * mm2/pi) * &2 * pi * inv ( #1.627 * (sqrt2 - &1))) in
1330 (&2 * mm1 / pi) * &2 * pi
1331 - (&2 * mm1 /pi) * &2 * pi * inv(r * &2) * y pow 1
1332 - fac * &3 * sqrt2 *hplus
1333 + fac *(#1.5 * sqrt2 + #1.5 * hplus + #8.5 * sqrt2 * hplus) * y pow 1
1334 + fac * (-- #0.75 - #8.5 * sqrt2 * inv(&2) - #8.5 * hplus * inv(&2) - &9 * hplus * sqrt2 * inv (&4)) * y pow 2
1335 + fac* ( #17.0 * inv (&8) + #9.0 * sqrt2 * inv(&8) + #9.0 * hplus * inv(&8)) * y pow 3
1336 - fac * #9.0 * inv(&16) * y pow 4`,
1339 REWRITE_TAC[Sphere.vol2f;Sphere.marchal_quartic;LET_DEF;LET_END_DEF;Sphere.hplus;GSYM Sphere.sqrt2;REAL_ARITH `(sqrt2 - &1) * &5 * (#1.3254 - &1) = #1.627 * (sqrt2- &1)`];
1341 REWRITE_TAC[GSYM Sphere.hplus;real_div];
1346 let vol2r_y = prove_by_refinement(
1347 `!y r. vol2r y r = &2 * pi * r * r * inv (&3) - #0.5 * pi * inv(&3) * y pow 2`,
1350 REWRITE_TAC[Sphere.vol2r;real_div];
1355 let ineq_expand6 = prove_by_refinement(
1356 `!a1 a2 a3 a4 a5 a6 b1 b2 b3 b4 b5 b6 x1 x2 x3 x4 x5 x6 P. (ineq [(a1,y1,b1);(a2,y2,b2);(a3,y3,b3);(a4,y4,b4);(a5,y5,b5);(a6,y6,b6)] P) <=>
1357 (a1 <= y1 /\ y1 <= b1
1358 ==> a2 <= y2 /\ y2 <= b2
1359 ==> a3 <= y3 /\ y3 <= b3
1360 ==> a4 <= y4 /\ y4 <= b4
1361 ==> a5 <= y5 /\ y5 <= b5
1362 ==> a6 <= y6 /\ y6 <= b6
1370 let ineq_expand9 = prove_by_refinement(
1371 `!a1 a2 a3 a4 a5 a6 a7 a8 a9 b1 b2 b3 b4 b5 b6 b7 b8 b9 x1 x2 x3 x4 x5 x6 x7 x8 x9 P. (ineq [(a1,y1,b1);(a2,y2,b2);(a3,y3,b3);(a4,y4,b4);(a5,y5,b5);(a6,y6,b6);(a7,y7,b7);(a8,y8,b8);(a9,y9,b9)] P) <=>
1372 (a1 <= y1 /\ y1 <= b1
1373 ==> a2 <= y2 /\ y2 <= b2
1374 ==> a3 <= y3 /\ y3 <= b3
1375 ==> a4 <= y4 /\ y4 <= b4
1376 ==> a5 <= y5 /\ y5 <= b5
1377 ==> a6 <= y6 /\ y6 <= b6
1378 ==> a7 <= y7 /\ y7 <= b7
1379 ==> a8 <= y8 /\ y8 <= b8
1380 ==> a9 <= y9 /\ y9 <= b9
1388 let pathL_bound = prove_by_refinement(
1389 `!y a. FST (pathL a) <= y /\ y <= SND (pathL a) ==>
1390 FST a <= y /\ y <= SND a`,
1394 SUBGOAL_THEN `pathL a = pathL (FST a, SND a)` (fun t->ONCE_REWRITE_TAC[t]);
1396 REWRITE_TAC[Sphere.pathL];
1401 let pathR_bound = prove_by_refinement(
1402 `!y a. FST (pathR a) <= y /\ y <= SND (pathR a) ==>
1403 FST a <= y /\ y <= SND a`,
1407 SUBGOAL_THEN `pathR a = pathR (FST a, SND a)` (fun t->ONCE_REWRITE_TAC[t]);
1409 REWRITE_TAC[Sphere.pathR];
1414 let delta_x_eq0 = prove_by_refinement(
1415 `delta_x (&8) (&4) (&4) (&8) (&4) (&4) = &0 /\
1416 delta_x (&4) (&8) (&4) (&4) (&8) (&4) = &0
1420 REWRITE_TAC[Sphere.delta_x];
1425 let delta_x4_eq64 = prove_by_refinement(
1426 `delta_x4 (&8) (&4) (&4) (&8) (&4) (&4) = -- &64 /\
1427 delta_x4 (&4) (&8) (&4) (&4) (&8) (&4) = &64
1431 REWRITE_TAC[Sphere.delta_x4];
1436 let atn2_0y = prove_by_refinement(
1437 `atn2 (&0,&64) = pi / &2 /\ atn2 (&0 ,-- &64) = -- pi/ &2`,
1440 REWRITE_TAC[Sphere.atn2;REAL_ARITH `~(abs(&64) < &0) /\ &0 < &64 /\ ~(abs (-- &64) < &0) /\ ~(&0 < -- &64) /\ (-- &64 < &0) /\ (&0 / &64 = &0) /\ (&0 / -- &64 = &0)`;ATN_0];
1445 let OR_RULE rule1 rule2 th = try rule1 th with _ -> rule2 th;;
1447 let rec REPEAT_RULE rule =
1448 fun t -> if can rule t then REPEAT_RULE rule (rule t) else t;;
1450 let vol3f_lmln = prove_by_refinement(
1451 `!y1 y2 y3 y4 y5 y6. (y1 <= &2 * h0) /\ (y2 <= &2 * h0) /\ (y6 <= &2 * h0) ==> (vol3f y1 y2 y6 sqrt2 lmfun = vol3f y1 y2 y6 sqrt2 lfun)`,
1454 REWRITE_TAC[Sphere.vol3f];
1455 MESON_TAC[lmfun_lfun];
1459 let vol3_vol_x = prove_by_refinement(
1460 `!x1 x2 x3 x4 x5 x6.
1461 &0 <= x1 /\ &0 <= x2 /\ &0 <= x6 ==>
1462 (vol3_x_sqrt x1 x2 x3 x4 x5 x6 = vol_x x1 x2 (&2) (&2) (&2) x6)`,
1465 MP_TAC (REAL_ARITH `&0 <= &2`);
1466 ONCE_REWRITE_TAC[REAL_ARITH `&0 = &0 pow 2`];
1468 REWRITE_TAC[vol3_x_sqrt;Sphere.vol_x;Sphere.vol_y;Sphere.y_of_x;Sphere.sqrt2];
1472 ASM_SIMP_TAC[SPEC `&0` sq_pow2];
1473 REWRITE_TAC[Sphere.delta_x];
1478 let spec0 = SPECL [`&0`;`&0`;`&0`;`&0`;`&0`;`&0`;];;
1480 let vol3f_x_lfun_alt = prove_by_refinement(
1481 `!x1 x2 x3 x4 x5 x6.
1482 &0 <= x1 /\ &0 <= x2 /\ &0 <= x6 ==>
1483 vol3f_x_lfun x1 x2 x3 x4 x5 x6 = (&2 * mm1 / pi) *
1484 (&2 * dih_x x1 x2 (&2) (&2) (&2) x6 +
1485 &2 * dih2_x x1 x2 (&2) (&2) (&2) x6 +
1486 &2 * dih6_x x1 x2 (&2) (&2) (&2) x6 +
1487 dih3_x x1 x2 (&2) (&2) (&2) x6 +
1488 dih4_x x1 x2 (&2) (&2) (&2) x6 +
1489 dih5_x x1 x2 (&2) (&2) (&2) x6 - &3 * pi) -
1491 ( ldih_x x1 x2 (&2) (&2) (&2) x6 +
1492 ldih2_x x1 x2 (&2) (&2) (&2) x6 +
1493 ldih6_x x1 x2 (&2) (&2) (&2) x6)`,
1496 MP_TAC (REAL_ARITH `&0 <= &2`);
1497 ONCE_REWRITE_TAC[REAL_ARITH `&0 = &0 pow 2`];
1499 REWRITE_TAC[vol3f_x_lfun;];
1500 MP_TAC (SPECL [`sqrt x1`;`sqrt x2`;`sqrt2`;`sqrt2`;`sqrt2`;`sqrt x6`;`sqrt2`;`lfun`] vol3f_palt);
1502 DISCH_THEN (fun t->REWRITE_TAC[t]);
1503 REWRITE_TAC[Sphere.sqrt2;Sphere.ldih_x;Sphere.ldih2_x;Sphere.ldih6_x;Sphere.dih4_x;Sphere.dih5_x;Sphere.dih6_x];
1504 ASM_SIMP_TAC[spec0 dih_x_y;spec0 dih2_x_y;spec0 dih3_x_y];
1508 let spech0 = SPECL [`&2 * h0`;`&0`;`&0`;`&0`;`&0`;`&0`;];;
1510 let vol3f_x_sqrt2_lmplus_alt = prove_by_refinement(
1511 `!x1 x2 x3 x4 x5 x6.
1512 ((&2 * h0) pow 2 <= x1) /\ &0 <= x2 /\ &0 <= x6 ==>
1513 vol3f_x_sqrt2_lmplus x1 x2 x3 x4 x5 x6 = (&2 * mm1 / pi) *
1514 (&2 * dih_x x1 x2 (&2) (&2) (&2) x6 +
1515 &2 * dih2_x x1 x2 (&2) (&2) (&2) x6 +
1516 &2 * dih6_x x1 x2 (&2) (&2) (&2) x6 +
1517 dih3_x x1 x2 (&2) (&2) (&2) x6 +
1518 dih4_x x1 x2 (&2) (&2) (&2) x6 +
1519 dih5_x x1 x2 (&2) (&2) (&2) x6 - &3 * pi) -
1522 ldih2_x x1 x2 (&2) (&2) (&2) x6 +
1523 ldih6_x x1 x2 (&2) (&2) (&2) x6)`,
1526 MP_TAC (REAL_ARITH `&0 <= &2`);
1527 ONCE_REWRITE_TAC[REAL_ARITH `&0 = &0 pow 2`];
1529 REWRITE_TAC[vol3f_x_sqrt2_lmplus;vol3f_sqrt2_lmplus];
1530 REWRITE_TAC[Sphere.sqrt2;Sphere.ldih_x;Sphere.ldih2_x;Sphere.ldih6_x;Sphere.dih4_x;Sphere.dih5_x;Sphere.dih6_x];
1531 ASM_SIMP_TAC[spech0 dih_x_y;spech0 dih2_x_y;spech0 dih3_x_y];
1535 let vol3f_lm0 = prove_by_refinement(
1536 `!y1 y2 y3 y4 y5 y6.
1537 ( &2 * h0 <= y1) /\ (y2 <= &2 * h0) /\ (y6 <= &2 * h0) ==>
1538 (vol3f y1 y2 y6 sqrt2 lmfun = vol3f_sqrt2_lmplus y1 y2 y3 y4 y5 y6)`,
1542 REWRITE_TAC[vol3f_sqrt2_lmplus];
1543 MP_TAC (SPECL [`y1:real`;`y2:real`;`sqrt2`;`sqrt2`;`sqrt2`;`y6:real`; `sqrt2`;`lmfun`] vol3f_palt);
1545 DISCH_THEN (fun t-> REWRITE_TAC[t]);
1546 ASM_SIMP_TAC[lmfun_lfun;lmfun0];
1547 REWRITE_TAC[REAL_ARITH `&0 * x = &0 /\ &0 + y = y`];
1551 let vol3r_126_x = prove_by_refinement(
1552 `vol3r (sqrt x1) (sqrt x2) (sqrt x6) sqrt2 = vol3_x_sqrt x1 x2 (x3:real) (x4:real) (x5:real) x6`,
1555 REWRITE_TAC[vol3_x_sqrt;Sphere.vol3r;Sphere.vol_y];
1559 let num1_poly = prove_by_refinement(
1560 `! x1 x2 x3 x4 x5 x6. num1 x1 x2 x3 x4 x5 x6 =
1561 &64*x1*x4 - &32*x2*x4 - &32*x3*x4 - &4*x1*(x4 pow 2) - &32*x2*x5 + &32*x3*x5 +
1562 &4*x2*x4*x5 + &32*x2*x6 - &32*x3*x6 + &4*x3*x4*x6 `,
1565 REWRITE_TAC[Sphere.num1];
1570 let ineq6_of_ineq5 = prove_by_refinement(
1571 `!a1 a2 a3 a4 a5 y1 y2 y3 y4 y5 b1 b2 b3 b4 b5 P.
1572 ((!x1 x2 x3 x4 x5 x6. ineq[(a1,x1,b1);(a2,x2,b2);(a3,x3,b3);(a4,x4,b4);(a5,x5,b5);(&1,x6,&1)]
1573 (P x1 x2 x3 x4 x5)) ==>
1574 ineq[(a1,y1,b1);(a2,y2,b2);(a3,y3,b3);(a4,y4,b4);(a5,y5,b5)]
1575 (P y1 y2 y3 y4 y5))`,
1579 MESON_TAC[REAL_ARITH `&1 <= &1`];
1583 let ineq6_of_ineq1 = prove_by_refinement(
1585 ((!x1 x2 x3 x4 x5 x6. ineq[(a1,x1,b1);(&1,x2,&1);(&1,x3,&1);(&1,x4,&1);(&1,x5,&1);(&1,x6,&1)]
1586 (P x1)) ==> ineq[(a1,y1,b1)] (P y1))`,
1590 MESON_TAC[REAL_ARITH `&1 <= &1`];
1594 let dih_x_alt = prove_by_refinement(
1595 `!x1 x2 x3 x4 x5 x6. dih_x x1 x2 x3 x4 x5 x6 = pi / &2 +
1597 (sqrt (&4 * x1 * delta_x x1 x2 x3 x4 x5 x6),
1598 --delta_x4 x1 x2 x3 x4 x5 x6) `,
1601 REWRITE_TAC[Sphere.dih_x];