1 (* ========================================================================= *)
2 (* FLYSPECK - BOOK FORMALIZATION *)
4 (* Chapter: nonlinear inequalities *)
5 (* Author: Thomas Hales *)
7 (* ========================================================================= *)
10 (* May 2012 functional equational definitions of
13 This code is to be used in automated generation of C++
16 scripts.hl generates ocaml Sphere2 module based on these lemmas.
18 June 2012: truncate_* are all deprecated. They can be deleted.
21 see functional_* lemmas in this file.
22 see functional1_* lemmas in this file for univariate functions.
25 unit,x1,x2,x3,x4,x5,x6,
34 (* failwith "moodule";; *)
36 module Functional_equation = struct
39 open Nonlinear_lemma;;
41 let GMATCH = GMATCH_SIMP_TAC;;
43 let uni = new_definition `uni (f,x) x1 x2 x3 x4 x5 x6 =
44 (f:A->B) ( x x1 x2 x3 x4 x5 x6)`;;
46 let constant6 = new_definition `constant6 c x1 x2 x3 x4 x5 x6 = c`;;
48 let promote3_to_6 = new_definition
49 `promote3_to_6 f x1 x2 x3 x4 x5 x6 = f x1 x2 x3`;;
51 let promote1_to_6 = new_definition
52 `promote1_to_6 f x1 x2 x3 x4 x5 x6 = f x1`;;
54 let functional_proj_x1 = prove_by_refinement(
55 `proj_x1 = promote1_to_6 I`,
58 REWRITE_TAC[FUN_EQ_THM;promote1_to_6;proj_x1;I_DEF];
62 (* these are circular, because we will define rotatek
63 as a composition of proj_xm *)
65 let functional_proj_x2 = prove_by_refinement(
66 `proj_x2 = rotate2 proj_x1`,
69 REWRITE_TAC[FUN_EQ_THM;proj_x1;proj_x2;Sphere.rotate2];
73 let functional_proj_x3 = prove_by_refinement(
74 `proj_x3 = rotate3 proj_x1`,
77 REWRITE_TAC[FUN_EQ_THM;proj_x1;proj_x3;Sphere.rotate3];
81 let functional_proj_x4 = prove_by_refinement(
82 `proj_x4 = rotate4 proj_x1`,
85 REWRITE_TAC[FUN_EQ_THM;proj_x1;proj_x4;Sphere.rotate4];
89 let functional_proj_x5 = prove_by_refinement(
90 `proj_x5 = rotate5 proj_x1`,
93 REWRITE_TAC[FUN_EQ_THM;proj_x1;proj_x5;Sphere.rotate5];
97 let functional_proj_x6 = prove_by_refinement(
98 `proj_x6 = rotate6 proj_x1`,
101 REWRITE_TAC[FUN_EQ_THM;proj_x1;proj_x6;Sphere.rotate6];
105 let rh0 = new_definition `rh0 = &1/(h0 - &1)`;;
107 let two6 = new_definition `two6 = constant6 ( &2)`;;
109 let zero6 = new_definition `zero6 = constant6 ( &0)`;;
111 let dummy6 = new_definition `dummy6 = constant6 ( &0)`;;
113 let four6 = new_definition `four6 = constant6 ( &4)`;;
115 let mk_126 = new_definition `mk_126 f =
116 compose6 f proj_x1 proj_x2 two6 two6 two6 proj_x6`;;
118 let mk_456 = new_definition `mk_456 f =
119 compose6 f two6 two6 two6 proj_x4 proj_x5 proj_x6`;;
121 let mk_135 = new_definition `mk_135 f =
122 compose6 f proj_x1 two6 proj_x3 two6 proj_x5 two6`;;
124 let add6 = new_definition `add6 f g x1 x2 x3 x4 x5 x6 =
125 f x1 x2 x3 x4 x5 x6 + g x1 x2 x3 x4 x5 x6`;;
127 let scalar6 = new_definition `scalar6 f r x1 x2 x3 x4 x5 x6 =
128 (f x1 x2 x3 x4 x5 x6) * (r:real)`;;
130 let mul6 = new_definition `mul6 f g x1 x2 x3 x4 x5 x6 =
131 f x1 x2 x3 x4 x5 x6 * g x1 x2 x3 x4 x5 x6`;;
133 let div6 = new_definition `div6 f g x1 x2 x3 x4 x5 x6 =
134 f x1 x2 x3 x4 x5 x6 / g x1 x2 x3 x4 x5 x6`;;
136 let sub6 = new_definition `sub6 f g x1 x2 x3 x4 x5 x6 =
137 f x1 x2 x3 x4 x5 x6 - g x1 x2 x3 x4 x5 x6`;;
139 let proj_y1 = new_definition `proj_y1 x1 x2 x3 x4 x5 x6 =
142 let proj_y2 = new_definition `proj_y2 x1 x2 x3 x4 x5 x6 =
145 let proj_y3 = new_definition `proj_y3 x1 x2 x3 x4 x5 x6 =
148 let proj_y4 = new_definition `proj_y4 x1 x2 x3 x4 x5 x6 =
151 let proj_y5 = new_definition `proj_y5 x1 x2 x3 x4 x5 x6 =
154 let proj_y6 = new_definition `proj_y6 x1 x2 x3 x4 x5 x6 =
158 let domain6 = new_definition `domain6 h f g =
159 (!x1 x2 x3 x4 x5 x6. h x1 x2 x3 x4 x5 x6 ==>
160 (f x1 x2 x3 x4 x5 x6 = g x1 x2 x3 x4 x5 x6))`;;
162 (* should be called something different, because we project out 3 coords *)
164 let rotate234 = new_definition `rotate234 f =
165 compose6 f proj_x2 proj_x3 proj_x4 unit6 unit6 unit6`;;
167 let rotate126 = new_definition `rotate126 f =
168 compose6 f proj_x1 proj_x2 proj_x6 unit6 unit6 unit6`;;
170 let rotate345 = new_definition `rotate345 f =
171 compose6 f proj_x3 proj_x4 proj_x5 unit6 unit6 unit6`;;
173 let functional_overload() = (
174 overload_interface ("+",`add6`);
175 overload_interface ("-",`sub6`);
176 overload_interface ("/",`div6`);
177 overload_interface ("*",`mul6`));;
179 let _ = functional_overload();;
181 let proj_x1 = Nonlinear_lemma.proj_x1;;
182 let proj_x2 = Nonlinear_lemma.proj_x2;;
183 let proj_x3 = Nonlinear_lemma.proj_x3;;
184 let proj_x4 = Nonlinear_lemma.proj_x4;;
185 let proj_x5 = Nonlinear_lemma.proj_x5;;
186 let proj_x6 = Nonlinear_lemma.proj_x6;;
187 let unit6 = Nonlinear_lemma.unit6;;
188 let compose6 = Nonlinear_lemma.compose6;;
190 let h0cut = new_definition `h0cut y = if (y <= &2 * h0) then &1 else &0`;;
192 let functional_proj_y1 = prove_by_refinement(
193 `proj_y1 = promote1_to_6 sqrt`,
196 REWRITE_TAC[FUN_EQ_THM;promote1_to_6;proj_y1];
200 let functional_proj_y2 = prove_by_refinement(
201 `proj_y2 = rotate2 proj_y1`,
204 REWRITE_TAC[FUN_EQ_THM;proj_y1;proj_y2;Sphere.rotate2];
208 let functional_proj_y3 = prove_by_refinement(
209 `proj_y3 = rotate3 proj_y1`,
212 REWRITE_TAC[FUN_EQ_THM;proj_y1;proj_y3;Sphere.rotate3];
216 let functional_proj_y4 = prove_by_refinement(
217 `proj_y4 = rotate4 proj_y1`,
220 REWRITE_TAC[FUN_EQ_THM;proj_y1;proj_y4;Sphere.rotate4];
224 let functional_proj_y5 = prove_by_refinement(
225 `proj_y5 = rotate5 proj_y1`,
228 REWRITE_TAC[FUN_EQ_THM;proj_y1;proj_y5;Sphere.rotate5];
232 let functional_proj_y6 = prove_by_refinement(
233 `proj_y6 = rotate6 proj_y1`,
236 REWRITE_TAC[FUN_EQ_THM;proj_y1;proj_y6;Sphere.rotate6];
240 let sqrt_sqrt = prove_by_refinement(
241 `!x. &0 <= x ==> (sqrt x * sqrt x = x)`,
244 MESON_TAC[arith `&0 pow 2 = &0`;(SPEC `&0` Nonlinear_lemma.sq_pow2)];
248 let functional_norm2hh_x = prove_by_refinement(
249 `norm2hh_x = uni(pow2,(proj_y1 - constant6 (hminus + hplus))) +
250 uni(pow2, proj_y2 - two6) + uni(pow2,proj_y3 - two6) +
251 uni(pow2, proj_y4 - two6) + uni(pow2,proj_y5 - two6) +
252 uni(pow2, proj_y6 - two6)`,
255 REWRITE_TAC[FUN_EQ_THM; add6; sub6; uni;proj_y1;Nonlinear_lemma.pow2; two6;Sphere.norm2hh_x;Sphere.norm2hh;proj_y1;proj_y2;proj_y3;proj_y4;proj_y5;proj_y6;constant6];
260 let functional_eta2_126 = prove_by_refinement(
263 (&0 <= x1 /\ &0 <= x2 /\ &0 <= x6))
264 eta2_126 (uni(pow2,rotate126 (promote3_to_6 eta_x)))`,
267 REWRITE_TAC[domain6;Sphere.eta2_126;Sphere.eta_y; uni; rotate126;compose6;promote3_to_6;proj_x1;proj_x2;proj_x6;unit6;LET_END_DEF;LET_DEF;Nonlinear_lemma.pow2];
268 BY(ASM_SIMP_TAC[sqrt_sqrt])
273 let functional_rotate2 = prove_by_refinement(
274 `!f. rotate2 f = compose6 f proj_x2 proj_x3 proj_x1 proj_x5 proj_x6 proj_x4`,
277 BY(REWRITE_TAC[Sphere.rotate2;FUN_EQ_THM;compose6;proj_x1;proj_x2;proj_x3;proj_x4;proj_x5;proj_x6]);
281 let functional_rotate3 = prove_by_refinement(
282 `!f. rotate3 f = compose6 f proj_x3 proj_x1 proj_x2 proj_x6 proj_x4 proj_x5`,
285 BY(REWRITE_TAC[Sphere.rotate3;FUN_EQ_THM;compose6;proj_x1;proj_x2;proj_x3;proj_x4;proj_x5;proj_x6]);
289 let functional_rotate4 = prove_by_refinement(
290 `!f. rotate4 f = compose6 f proj_x4 proj_x2 proj_x6 proj_x1 proj_x5 proj_x3`,
293 BY(REWRITE_TAC[Sphere.rotate4;FUN_EQ_THM;compose6;proj_x1;proj_x2;proj_x3;proj_x4;proj_x5;proj_x6]);
297 let functional_rotate5 = prove_by_refinement(
298 `!f. rotate5 f = compose6 f proj_x5 proj_x3 proj_x4 proj_x2 proj_x6 proj_x1`,
301 BY(REWRITE_TAC[Sphere.rotate5;FUN_EQ_THM;compose6;proj_x1;proj_x2;proj_x3;proj_x4;proj_x5;proj_x6]);
305 let functional_rotate6 = prove_by_refinement(
306 `!f. rotate6 f = compose6 f proj_x6 proj_x1 proj_x5 proj_x3 proj_x4 proj_x2`,
309 BY(REWRITE_TAC[Sphere.rotate6;FUN_EQ_THM;compose6;proj_x1;proj_x2;proj_x3;proj_x4;proj_x5;proj_x6]);
313 let functional_x1_delta_x = prove_by_refinement(
314 `x1_delta_x = proj_x1 * delta_x`,
317 REWRITE_TAC[FUN_EQ_THM];
318 BY(REWRITE_TAC[proj_x1;Sphere.x1_delta_x;mul6])
322 let functional_delta4_squared_x = prove_by_refinement(
323 `delta4_squared_x = uni(pow2,delta_x4)`,
326 BY(REWRITE_TAC[FUN_EQ_THM;uni;Nonlinear_lemma.pow2;Sphere.delta4_squared_x])
330 let functional_vol_x = prove_by_refinement(
331 `vol_x = scalar6 (uni(sqrt,delta_x)) (&1 / &12)`,
334 (REWRITE_TAC[FUN_EQ_THM;uni;Sphere.vol_x;scalar6]);
339 let functional_dih2_x = prove_by_refinement(
340 `dih2_x = rotate2 dih_x`,
343 REWRITE_TAC[FUN_EQ_THM];
344 REWRITE_TAC[Sphere.dih2_x;Sphere.rotate2];
345 BY(MESON_TAC[Nonlinear_lemma.dih_x_sym])
349 let functional_dih3_x = prove_by_refinement(
350 `dih3_x = rotate3 dih_x`,
353 REWRITE_TAC[FUN_EQ_THM];
354 REWRITE_TAC[Sphere.dih3_x;Sphere.rotate3];
358 let functional_dih4_x = prove_by_refinement(
359 `domain6 (\x1 x2 x3 x4 x5 x6.
360 &0 <= x1 /\ &0 <= x2 /\ &0 <= x3 /\
361 &0 <= x4 /\ &0 <= x5 /\ &0 <= x6)
362 dih4_x (rotate4 dih_x)`,
365 REWRITE_TAC[domain6];
366 REWRITE_TAC[Sphere.dih4_x; Sphere.rotate4;Sphere.dih4_y; Sphere.dih_y; LET_DEF;LET_END_DEF];
367 REPEAT WEAK_STRIP_TAC;
368 REPEAT( GMATCH_SIMP_TAC (ISPEC `&0` Nonlinear_lemma.sq_pow2));
369 BY(ASM_REWRITE_TAC[REAL_ARITH `&0 pow 2 = &0`])
373 let functional_dih5_x = prove_by_refinement(
374 `domain6 (\x1 x2 x3 x4 x5 x6.
375 &0 <= x1 /\ &0 <= x2 /\ &0 <= x3 /\
376 &0 <= x4 /\ &0 <= x5 /\ &0 <= x6)
377 dih5_x (rotate5 dih_x)`,
380 REWRITE_TAC[domain6];
381 REWRITE_TAC[Sphere.dih5_x; Sphere.rotate5;Sphere.dih5_y; Sphere.dih_y; LET_DEF;LET_END_DEF];
382 REPEAT WEAK_STRIP_TAC;
383 REPEAT( GMATCH_SIMP_TAC (ISPEC `&0` Nonlinear_lemma.sq_pow2));
384 (ASM_REWRITE_TAC[REAL_ARITH `&0 pow 2 = &0`]);
385 MESON_TAC[Nonlinear_lemma.dih_x_sym;Nonlinear_lemma.dih_x_sym2];
389 let functional_dih6_x = prove_by_refinement(
390 `domain6 (\x1 x2 x3 x4 x5 x6.
391 &0 <= x1 /\ &0 <= x2 /\ &0 <= x3 /\
392 &0 <= x4 /\ &0 <= x5 /\ &0 <= x6)
393 dih6_x (rotate6 dih_x)`,
396 REWRITE_TAC[domain6];
397 REWRITE_TAC[Sphere.dih6_x; Sphere.rotate6;Sphere.dih6_y;Sphere.dih_y; LET_DEF;LET_END_DEF];
398 REPEAT WEAK_STRIP_TAC;
399 REPEAT( GMATCH_SIMP_TAC (ISPEC `&0` Nonlinear_lemma.sq_pow2));
400 (ASM_REWRITE_TAC[REAL_ARITH `&0 pow 2 = &0`]);
406 let dih6_x' = new_definition `dih6_x' = rotate6 dih_x`;;
408 let ldih6_x' = new_definition `!x1 x2 x3 x4 x5 x6.
409 ldih6_x' x1 x2 x3 x4 x5 x6 =
410 lfun (sqrt x6 / &2) * dih6_x' x1 x2 x3 x4 x5 x6`;;
412 let gchi6_x' = new_definition `!x1 x2 x3 x4 x5 x6.
413 gchi6_x x1 x2 x3 x4 x5 x6 =
414 gchi (sqrt x6) * dih6_x' x1 x2 x3 x4 x5 x6`;;
418 let functional_lfun_y1 = prove_by_refinement(
419 `lfun_y1 = scalar6 (scalar6 unit6 h0 - proj_x1) rh0`,
422 REWRITE_TAC[FUN_EQ_THM];
423 REWRITE_TAC[add6;scalar6;mul6;div6;sub6;constant6;rh0];
424 REWRITE_TAC[Sphere.lfun_y1;Sphere.lfun; Nonlinear_lemma.unit6;Nonlinear_lemma.proj_x1];
429 let functional_ldih_x = prove_by_refinement(
431 (scalar6 (scalar6 unit6 h0 - scalar6 proj_y1 (#0.5)) rh0) * dih_x`,
434 REWRITE_TAC[FUN_EQ_THM];
435 REWRITE_TAC[add6;mul6;div6;sub6;constant6;rh0;scalar6];
436 REWRITE_TAC[proj_y1;Sphere.ldih_x;Nonlinear_lemma.unit6;Sphere.lfun];
441 let functional_ldih2_x = prove_by_refinement(
442 `ldih2_x = rotate2 ldih_x`,
445 REWRITE_TAC[FUN_EQ_THM];
446 REWRITE_TAC[Sphere.rotate2;Sphere.ldih2_x;Sphere.ldih_x;Sphere.dih2_x];
447 MESON_TAC[Nonlinear_lemma.dih_x_sym];
451 let functional_ldih3_x = prove_by_refinement(
452 `ldih3_x = rotate3 ldih_x`,
455 REWRITE_TAC[FUN_EQ_THM];
456 REWRITE_TAC[Sphere.rotate3;Sphere.ldih3_x;Sphere.ldih_x;Sphere.dih3_x];
460 let functional_ldih6_x = prove_by_refinement(
462 (\x1 x2 x3 x4 x5 x6. &0 <= x1 /\ &0 <= x2 /\ &0 <= x3 /\
463 &0 <= x4 /\ &0 <= x5 /\ &0 <= x6)
468 REWRITE_TAC[domain6 ];
469 REWRITE_TAC[Sphere.rotate6;Sphere.ldih6_x;Sphere.ldih_x;Sphere.dih6_x;Sphere.dih6_y; Sphere.dih_y;LET_DEF;LET_END_DEF];
470 BY(ASM_SIMP_TAC[sqrt_sqrt])
474 let functional_eulerA_x = prove_by_refinement(
475 `eulerA_x = proj_y1 * proj_y2 * proj_y3 +
476 scalar6 (proj_y1 * (proj_x2 + proj_x3 - proj_x4)) (#0.5) +
477 scalar6 (proj_y2 * (proj_x1 + proj_x3 - proj_x5)) (#0.5) +
478 scalar6 (proj_y3 * (proj_x1 + proj_x2 - proj_x6)) (#0.5)
482 REWRITE_TAC[FUN_EQ_THM;mul6;add6; sub6;proj_y1;proj_y2;proj_y3;scalar6; constant6;proj_x1;proj_x2; proj_x3;proj_x4; proj_x5;proj_x6;Sphere.eulerA_x];
487 let functional_gchi1_x = prove_by_refinement(
488 `gchi1_x = uni (gchi,proj_y1) * dih_x`,
491 BY(REWRITE_TAC[FUN_EQ_THM;Sphere.gchi1_x;uni;proj_y1;mul6]);
495 let functional_gchi2_x = prove_by_refinement(
496 `gchi2_x = uni (gchi,proj_y2) * dih2_x`,
499 BY(REWRITE_TAC[FUN_EQ_THM;Sphere.gchi2_x;uni;proj_y2;mul6]);
503 let functional_gchi3_x = prove_by_refinement(
504 `gchi3_x = uni (gchi,proj_y3) * dih3_x`,
507 BY(REWRITE_TAC[FUN_EQ_THM;Sphere.gchi3_x;uni;proj_y3;mul6]);
511 let functional_gchi4_x = prove_by_refinement(
512 `gchi4_x = uni (gchi,proj_y4) * dih4_x`,
515 BY(REWRITE_TAC[FUN_EQ_THM;Sphere.gchi4_x;uni;proj_y4;mul6]);
519 let functional_gchi5_x = prove_by_refinement(
520 `gchi5_x = uni (gchi,proj_y5) * dih5_x`,
523 BY(REWRITE_TAC[FUN_EQ_THM;Sphere.gchi5_x;uni;proj_y5;mul6]);
527 let functional_gchi6_x = prove_by_refinement(
528 `gchi6_x = uni (gchi,proj_y6) * dih6_x`,
531 BY(REWRITE_TAC[FUN_EQ_THM;Sphere.gchi6_x;uni;proj_y6;mul6]);
535 let functional_eta2_135 = prove_by_refinement(
536 `eta2_135 = rotate3 eta2_126`,
539 REWRITE_TAC[FUN_EQ_THM;Sphere.rotate3;Sphere.eta2_135;Sphere.eta2_126];
540 BY(MESON_TAC[Collect_geom.ETA_Y_SYYM])
544 let functional_eta2_456 = prove_by_refinement(
545 `eta2_456 = rotate4 eta2_135`,
548 REWRITE_TAC[FUN_EQ_THM;Sphere.rotate4;Sphere.eta2_456;Sphere.eta2_135;Sphere.rotate3;Sphere.eta2_126];
549 BY(MESON_TAC[Collect_geom.ETA_Y_SYYM])
553 let functional_vol3_x_sqrt = prove_by_refinement(
556 &0 <= x1 /\ &0 <= x2 /\ &0 <=x6)
561 BY(REWRITE_TAC[domain6;mk_126;two6;constant6;proj_x1;proj_x2;proj_x6;compose6;Nonlinear_lemma.vol3_vol_x])
565 let functional_vol3f_x_lfun = prove_by_refinement(
568 &0 <= x1 /\ &0 <= x2 /\ &0 <=x6)
570 (constant6 ( &2 * mm1 / pi ) *
571 (two6 * mk_126 dih_x + two6 * mk_126 dih2_x + two6 * mk_126 dih6_x +
572 mk_126 dih3_x + mk_126 dih4_x + mk_126 dih5_x -
573 constant6 ( &3 * pi))
574 - (constant6 (&8 * mm2 / pi)) *
575 (mk_126 ldih_x + mk_126 ldih2_x + mk_126 ldih6_x ))
579 REWRITE_TAC[LET_DEF;LET_END_DEF;mk_126; two6; domain6;constant6;mul6;add6;sub6;proj_x1; compose6;proj_x2;proj_x3;proj_x4;proj_x5;proj_x6];
580 BY(REWRITE_TAC[Nonlinear_lemma.vol3f_x_lfun_alt])
584 let functional_vol3f_x_sqrt2_lmplus = prove_by_refinement(
587 (&2 * h0) pow 2 <= x1 /\ &0 <= x2 /\ &0 <=x6)
589 (constant6 ( &2 * mm1 / pi ) *
590 (two6 * mk_126 dih_x +
591 two6 * mk_126 dih2_x +
592 two6 * mk_126 dih6_x +
596 constant6 ( &3 * pi))
597 - (constant6 (&8 * mm2 / pi)) *
602 REWRITE_TAC[LET_DEF;LET_END_DEF;mk_126;domain6; two6;constant6;mul6;add6;sub6;proj_x1;compose6;proj_x2; proj_x3;proj_x4;proj_x5;proj_x6];
603 BY(REWRITE_TAC[Nonlinear_lemma.vol3f_x_sqrt2_lmplus_alt])
607 let cos797 = new_definition `cos797 = cos(#0.797)`;;
609 let functional_asn797k = prove_by_refinement(
611 proj_x1 * uni(asn,constant6 (cos797) *
612 uni(sin, constant6(pi) / proj_x1))`,
615 BY(REWRITE_TAC[FUN_EQ_THM;mul6;div6;uni;cos797;constant6;proj_x1;Sphere.asn797k]);
619 let functional_asnFnhk = prove_by_refinement(
621 proj_x2 * uni(asn,(proj_x1 * constant6 (sqrt3 / #4.0) +
623 uni(pow2,(proj_x1 * constant6 (#0.5))))) *
624 constant6 (#0.5)) * uni(sin,constant6(pi)/proj_x2))`,
627 (REWRITE_TAC[FUN_EQ_THM;sub6;mul6; div6;Nonlinear_lemma.pow2;add6;unit6; uni;constant6;proj_x1; proj_x2;Sphere.asnFnhk]);
628 BY(REWRITE_TAC[REAL_ARITH `x * #0.5 = x/ &2`])
632 let functional_acs_sqrt_x1_d4 = prove_by_refinement(
633 `acs_sqrt_x1_d4 = uni(acs,scalar6 proj_y1 (#0.25))`,
636 BY(REWRITE_TAC[FUN_EQ_THM;uni;mul6;constant6;scalar6;proj_y1; Sphere.acs_sqrt_x1_d4;arith `x * #0.25 = x/ &4`])
640 let functional_acs_sqrt_x2_d4 = prove_by_refinement(
641 `acs_sqrt_x2_d4 = uni(acs,scalar6 proj_y2 (#0.25))`,
644 BY(REWRITE_TAC[FUN_EQ_THM;uni;mul6;constant6;scalar6;proj_y2; Sphere.acs_sqrt_x2_d4;arith `x * #0.25 = x/ &4`])
648 (* ldih5_x ldih6_x not in HOL Light*)
650 let functional_arclength_x_123 = prove_by_refinement(
651 `let al_num = proj_x1 + proj_x2 - proj_x3 in
652 let al_den = uni(sqrt,scalar6 (proj_x1 * proj_x2) ( &4)) in
654 (\x1 x2 x3 x4 x5 x6. (&0 < x1 /\ &0 < x2 /\ &0 <= x3) /\
655 (sqrt x3 <= sqrt x1 + sqrt x2 /\ sqrt x1 <= sqrt x2 + sqrt x3 /\
656 sqrt x2 <= sqrt x3 + sqrt x1)) in
657 domain6 domain (arclength_x_123) ( uni(acs, al_num / al_den ) )`,
660 REWRITE_TAC[LET_DEF;LET_END_DEF;];
661 REWRITE_TAC[domain6];
662 REWRITE_TAC[add6;mul6;div6;sub6;scalar6;constant6;uni];
663 REWRITE_TAC[proj_x1;proj_x2;proj_x3;Sphere.arclength_x_123;];
665 GMATCH_SIMP_TAC Trigonometry1.ACS_ARCLENGTH;
667 ASM_SIMP_TAC[SQRT_POS_LT;SQRT_POS_LE];
669 REPEAT( GMATCH_SIMP_TAC (ISPEC `&0` Nonlinear_lemma.sq_pow2));
670 ASM_SIMP_TAC[REAL_ARITH `&0 pow 2 = &0`;REAL_ARITH `&0 < x ==> &0 <= x`;REAL_ARITH `u + x * -- &1 = u - x`];
673 REWRITE_TAC[REAL_ARITH `(x1 * x2)* &4 = x1 * (x2 * (&2 pow 2))`];
674 REPEAT (GMATCH SQRT_MUL);
675 GMATCH Euler_complement.SQRT_OF_POW_2_LE;
676 REPEAT (GMATCH Real_ext.REAL_PROP_NN_MUL2);
677 ASM_SIMP_TAC[REAL_ARITH `&0 <= &2 pow 2 /\ &0 <= &2`;REAL_ARITH `&0 < x ==> &0 <= x`];
682 let functional_arclength_234 = prove_by_refinement(
683 `arclength_x_234 = rotate234 arclength_x_123`,
686 REWRITE_TAC[rotate234;Sphere.arclength_x_123];
687 REWRITE_TAC[FUN_EQ_THM];
688 REWRITE_TAC[add6;mul6;div6;sub6; constant6;Nonlinear_lemma.compose6;uni;Nonlinear_lemma.arclength_x_234; Sphere.arclength_x_123;];
689 REWRITE_TAC[proj_x1;proj_x2;proj_x3;proj_x4];
693 let functional_arclength_126 = prove_by_refinement(
694 `arclength_x_126 = rotate126 arclength_x_123`,
697 REWRITE_TAC[rotate126];
698 REWRITE_TAC[FUN_EQ_THM];
699 REWRITE_TAC[add6;mul6;div6;sub6; constant6;Nonlinear_lemma.compose6;uni; Nonlinear_lemma.arclength_x_126; Sphere.arclength_x_123;];
700 REWRITE_TAC[proj_x1;proj_x2;proj_x3;proj_x6];
704 let functional_sol_euler_x_divsqrtdelta = prove_by_refinement(
707 (&0 <= x1 /\ &0 <= x2 /\ &0 <= x3))
708 sol_euler_x_div_sqrtdelta
709 ((uni(matan,(delta_x / (scalar6 (eulerA_x * eulerA_x) (&4))))) / eulerA_x)`,
712 REWRITE_TAC[domain6];
713 REWRITE_TAC[uni;scalar6;Nonlin_def.sol_euler_x_div_sqrtdelta; functional_eulerA_x;div6;mul6;add6;sub6;constant6;proj_y1;proj_y2; proj_y3;proj_x1;proj_x2;proj_x3; proj_x4;proj_x5;proj_x6];
714 REWRITE_TAC[REAL_ARITH ` (x/ &2 = x * (#0.5)) /\ ((a*b)*(c:real) = a*b*c)`;REAL_ARITH `&4 * a pow 2 = a* a * &4`;LET_DEF;LET_END_DEF];
716 BY(ASM_SIMP_TAC[SQRT_MUL;Real_ext.REAL_PROP_NN_MUL2])
721 let functional_sol246_euler_x_div_sqrtdelta = prove_by_refinement(
722 `sol_euler246_x_div_sqrtdelta = rotate4 sol_euler_x_div_sqrtdelta`,
725 REWRITE_TAC[FUN_EQ_THM];
726 BY(REWRITE_TAC[Sphere.rotate4; Nonlin_def.sol_euler246_x_div_sqrtdelta])
730 let functional_sol345_euler_x_div_sqrtdelta = prove_by_refinement(
731 `sol_euler345_x_div_sqrtdelta = rotate5 sol_euler_x_div_sqrtdelta`,
734 REWRITE_TAC[FUN_EQ_THM];
735 BY(REWRITE_TAC[Sphere.rotate5;Nonlin_def.sol_euler345_x_div_sqrtdelta])
739 let functional_sol156_euler_x_div_sqrtdelta = prove_by_refinement(
740 `sol_euler156_x_div_sqrtdelta = rotate6 sol_euler_x_div_sqrtdelta`,
743 REWRITE_TAC[FUN_EQ_THM];
744 BY(REWRITE_TAC[Sphere.rotate6;Nonlin_def.sol_euler156_x_div_sqrtdelta])
748 let functional_dih_x_div_sqrtdelta_posbranch = prove_by_refinement(
749 `domain6 (\x1 x2 x3 x4 x5 x6. (&0 <= x1))
750 dih_x_div_sqrtdelta_posbranch
751 ((scalar6 proj_y1 (&2)) / (delta_x4) *
752 uni(matan, (scalar6 (proj_x1 * delta_x) (&4)) / (uni(pow2,delta_x4))))`,
755 REWRITE_TAC[domain6];
756 REWRITE_TAC[proj_y1;constant6;proj_x1;uni;scalar6;mul6;div6;Nonlin_def.dih_x_div_sqrtdelta_posbranch;];
757 REWRITE_TAC[LET_DEF;LET_END_DEF;Nonlinear_lemma.pow2;arith `&4 * x * y = (x*y)* &4`];
758 REPEAT WEAK_STRIP_TAC;
759 ASM_SIMP_TAC[SQRT_MUL;arith `&0 <= &4`];
760 (REWRITE_TAC[Collect_geom2.SQRT4_EQ2]);
766 (* dih2_x_div_sqrtdelta_posbranch not defined in HOL-Light *)
768 let functional_dih3_x_div_sqrtdelta_posbranch = prove_by_refinement(
769 `dih3_x_div_sqrtdelta_posbranch = rotate3 dih_x_div_sqrtdelta_posbranch`,
772 BY(REWRITE_TAC[FUN_EQ_THM;Sphere.rotate3;Nonlin_def.dih3_x_div_sqrtdelta_posbranch]);
776 let functional_dih4_x_div_sqrtdelta_posbranch =
777 Nonlin_def.dih4_x_div_sqrtdelta_posbranch;;
779 let functional_dih5_x_div_sqrtdelta_posbranch = prove_by_refinement(
780 `dih5_x_div_sqrtdelta_posbranch = rotate5 dih_x_div_sqrtdelta_posbranch`,
783 BY(REWRITE_TAC[FUN_EQ_THM;Sphere.rotate5;Nonlin_def.dih5_x_div_sqrtdelta_posbranch]);
787 let functional_edge_flat2_x = prove_by_refinement(
790 &0 <= x1 /\ &0 <= x2 /\ &0 <= x3 /\ &0 <= x5 /\ &0 <= x6)
793 compose6(promote3_to_6 quadratic_root_plus_curry)
796 (proj_x3 - proj_x5) * (proj_x2 - proj_x6) -
797 proj_x1 * (proj_x2 + proj_x3 + proj_x5 + proj_x6))
798 ( proj_x1 * proj_x3 * proj_x5 +
799 proj_x1 * proj_x2 * proj_x6 -
800 proj_x3 * (proj_x1 + proj_x2 - proj_x3 + proj_x5 - proj_x6) *
802 proj_x2 * proj_x5 * (proj_x1 - proj_x2 + proj_x3 -
804 zero6 zero6 zero6))))
808 BY(REWRITE_TAC[domain6; Nonlinear_lemma.edge_flat2_x_rewrite; compose6;proj_x1;proj_x2;proj_x3;proj_x4;proj_x5;proj_x6; zero6;constant6;add6;mul6; sub6;uni;promote3_to_6; Nonlinear_lemma.quadratic_root_plus_curry; Nonlinear_lemma.pow2])
812 let functional_ldih_x_div_sqrtdelta_posbranch = prove_by_refinement(
813 `ldih_x_div_sqrtdelta_posbranch =
814 (scalar6 (constant6 h0 - scalar6 proj_y1 ( #0.5)) rh0)
815 * dih_x_div_sqrtdelta_posbranch`,
818 REWRITE_TAC[FUN_EQ_THM;mul6;scalar6;rh0;Nonlin_def.ldih_x_div_sqrtdelta_posbranch;Sphere.lfun;constant6;mul6;sub6;proj_y1;];
823 let functional_ldih2_x_div_sqrtdelta_posbranch =
824 Nonlin_def.ldih2_x_div_sqrtdelta_posbranch;;
826 let functional_ldih3_x_div_sqrtdelta_posbranch =
827 Nonlin_def.ldih3_x_div_sqrtdelta_posbranch;;
830 let functional_ldih5_x_div_sqrtdelta_posbranch =
831 Nonlin_def.ldih5_x_div_sqrtdelta_posbranch;;
833 let functional_ldih6_x_div_sqrtdelta_posbranch =
834 Nonlin_def.ldih6_x_div_sqrtdelta_posbranch;;
837 let functional1_rho = prove_by_refinement(
838 `!y. rho y = y * (const1 * rh0 * (#0.5)) + (&1 - const1 * rh0)`,
841 REWRITE_TAC[Nonlinear_lemma.rho_alt;Sphere.h0;rh0];
842 REPEAT WEAK_STRIP_TAC;
843 BY(CONV_TAC REAL_RING)
847 let functional1_flat_term_x = prove_by_refinement(
848 `!y. flat_term_x y = (sqrt y - &2 * h0) * rh0 * sol0 * (#0.5)`,
851 REWRITE_TAC[Sphere.flat_term_x;Sphere.flat_term;Sphere.h0;rh0];
852 REPEAT WEAK_STRIP_TAC;
853 BY(BY(CONV_TAC REAL_RING))
857 let functional1_lfun = prove_by_refinement(
858 `!y. lfun y = ( h0 - y)*rh0`,
861 REWRITE_TAC[Sphere.lfun;rh0];
867 let functional_rhazim_x = prove_by_refinement(
869 (\x1 x2 x3 x4 x5 x6. &0 <= x1 /\ &0 <= x2 /\ &0 <= x3 /\
870 &0 <= x4 /\ &0 <= x5 /\ &0 <= x6)
872 (uni (rho,proj_y1) * dih_x)`,
875 REWRITE_TAC[domain6];
876 REWRITE_TAC[Sphere.rhazim_x;Sphere.rhazim;uni;proj_y1;mul6;Sphere.dih_y;LET_DEF;LET_END_DEF];
877 REPEAT WEAK_STRIP_TAC;
879 REPEAT( GMATCH_SIMP_TAC (ISPEC `&0` Nonlinear_lemma.sq_pow2));
880 BY(ASM_REWRITE_TAC[REAL_ARITH `&0 pow 2 = &0`;])
884 let functional_rhazim2_x = prove_by_refinement(
885 `rhazim2_x = rotate2 rhazim_x`,
888 REWRITE_TAC[FUN_EQ_THM];
889 BY(REWRITE_TAC[Sphere.node2_y;Sphere.rotate2;Sphere.rhazim2_x;Sphere.rhazim_x;Sphere.rhazim2])
893 let functional_rhazim3_x = prove_by_refinement(
894 `rhazim3_x = rotate3 rhazim_x`,
897 REWRITE_TAC[FUN_EQ_THM];
898 BY(REWRITE_TAC[Sphere.node3_y;Sphere.rotate3;Sphere.rhazim3_x;Sphere.rhazim_x;Sphere.rhazim3])
902 let functional_taum_x = prove_by_refinement(
903 `taum_x = rhazim_x + rhazim2_x +
904 rhazim3_x - constant6 ((&1 + const1)*pi)`,
907 REWRITE_TAC[FUN_EQ_THM];
908 (REWRITE_TAC[Sphere.taum_x;add6;sub6;mul6;constant6;unit6]);
912 (* extra parameter cases *)
914 let functional_arclength_x1 = prove_by_refinement(
916 domain6 (\x1 x2 x3 x4 x5 x6. &0 <= a /\ &0 <= b)
919 arclength_x_123 proj_x1 (constant6 (a*a)) (constant6 (b*b))
920 dummy6 dummy6 dummy6)`,
923 REWRITE_TAC[domain6;Sphere.arclength_x_123; compose6; Sphere.arclength_x1;proj_x1;constant6;dummy6; Sphere.arclength_y1];
924 BY(BY(SIMP_TAC[Nonlinear_lemma.sqrtxx]))
928 let functional_arclength_x2 = prove_by_refinement(
930 domain6 (\x1 x2 x3 x4 x5 x6. &0 <= a /\ &0 <= b)
933 arclength_x_123 proj_x2 (constant6 (a*a)) (constant6 (b*b))
934 dummy6 dummy6 dummy6)`,
937 REWRITE_TAC[domain6;Sphere.arclength_x_123; compose6; Sphere.arclength_x2;proj_x2;constant6;dummy6; Sphere.arclength_y2];
938 BY(BY(SIMP_TAC[Nonlinear_lemma.sqrtxx]))
942 let functional_delta_126_x = prove_by_refinement(
943 `!a b c. delta_126_x a b c = compose6 delta_x proj_x1 proj_x2
944 (constant6 a) (constant6 b) (constant6 c) proj_x6`,
947 BY(REWRITE_TAC[FUN_EQ_THM; Sphere.delta_126_x;constant6;compose6;proj_x1;proj_x2;proj_x6 ])
951 let functional_delta_234_x = prove_by_refinement(
952 `!a b c. delta_234_x a b c = compose6 delta_x
953 (constant6 a) proj_x2 proj_x3 proj_x4 (constant6 b) (constant6 c)`,
956 (REWRITE_TAC[FUN_EQ_THM; Sphere.delta_234_x;constant6;compose6;proj_x2;proj_x3;proj_x4 ])
960 let functional_delta_135_x = prove_by_refinement(
961 `!a b c. delta_135_x a b c = compose6 delta_x
962 proj_x1 (constant6 a) proj_x3 (constant6 b) proj_x5 (constant6 c)`,
965 (REWRITE_TAC[FUN_EQ_THM; Sphere.delta_135_x;constant6;compose6;proj_x1;proj_x3;proj_x5 ])
969 let functional_rhazim_x_div_sqrt_delta_posbranch = prove_by_refinement(
970 `rhazim_x_div_sqrtdelta_posbranch =
971 uni(rho,proj_y1) * dih_x_div_sqrtdelta_posbranch`,
974 BY(REWRITE_TAC[FUN_EQ_THM;Nonlin_def.rhazim_x_div_sqrtdelta_posbranch;mul6;uni;proj_y1;]);
978 let functional_rhazim2_x_div_sqrt_delta_posbranch = prove_by_refinement(
979 `rhazim2_x_div_sqrtdelta_posbranch =
980 rotate2 rhazim_x_div_sqrtdelta_posbranch`,
983 BY(REWRITE_TAC[FUN_EQ_THM;Nonlin_def.rhazim2_x_div_sqrtdelta_posbranch;mul6;uni;proj_y1;]);
987 let functional_rhazim3_x_div_sqrt_delta_posbranch = prove_by_refinement(
988 `rhazim3_x_div_sqrtdelta_posbranch =
989 rotate3 rhazim_x_div_sqrtdelta_posbranch`,
992 BY(REWRITE_TAC[FUN_EQ_THM;Nonlin_def.rhazim3_x_div_sqrtdelta_posbranch;mul6;uni;proj_y1;]);
996 let functional_tau_residual = prove_by_refinement(
997 `tau_residual_x = rhazim_x_div_sqrtdelta_posbranch +
998 rhazim2_x_div_sqrtdelta_posbranch + rhazim3_x_div_sqrtdelta_posbranch `,
1001 (REWRITE_TAC[FUN_EQ_THM;Nonlin_def.tau_residual_x;add6]);
1005 let functional_halfbump_x1 = prove_by_refinement(
1006 `halfbump_x1 = promote1_to_6 halfbump_x`,
1009 REWRITE_TAC[promote1_to_6;Nonlinear_lemma.halfbump_x1;FUN_EQ_THM];
1013 let functional_halfbump_x4 = prove_by_refinement(
1014 `halfbump_x4 = rotate4 halfbump_x1`,
1017 BY(REWRITE_TAC[Sphere.rotate4;Nonlinear_lemma.halfbump_x4;Nonlinear_lemma.halfbump_x1;FUN_EQ_THM])
1021 (* two repeated defs =gamma2= deprecated. *)
1022 let gamma2_x_div_azim = (* same as truncate_gamma2_x *)
1023 new_definition `gamma2_x_div_azim m x = (&8 - x)* sqrt x / (&24) -
1024 ( (&2 * mm1/ pi) * (&1 - sqrt x / sqrt8) -
1025 (&8 * mm2 / pi) * m * lfun (sqrt x / &2))`;;
1027 let gamma2_x1_div_a = new_definition `gamma2_x1_div_a m =
1028 promote1_to_6 (gamma2_x_div_azim m)`;;
1030 let nonf_gamma2_x1_div_a = prove_by_refinement(
1031 `!(m:real) (x1:real) (x2:real) (x3:real) (x4:real) (x5:real) (x6:real).
1032 gamma2_x1_div_a m x1 x2 x3 x4 x5 x6 = gamma2_x_div_azim m x1`,
1035 BY(REWRITE_TAC[FUN_EQ_THM;promote1_to_6;gamma2_x1_div_a])
1039 let nonf_gamma2_x1_div_a_v2 = prove_by_refinement(
1040 `!(m:real) (x1:real) (x2:real) (x3:real) (x4:real) (x5:real) (x6:real).
1041 gamma2_x1_div_a_v2 m x1 x2 x3 x4 x5 x6 = gamma2_x_div_azim_v2 m x1`,
1044 BY(REWRITE_TAC[FUN_EQ_THM;promote1_to_6;Nonlin_def.gamma2_x1_div_a_v2])
1048 let gamma3f_x_div_sqrtdelta = new_definition `gamma3f_x_div_sqrtdelta m4 m5 m6 =
1049 constant6 (&1/ &12) -
1050 (scalar6 ( mk_456 (rotate5 (sol_euler_x_div_sqrtdelta)) +
1051 mk_456 (rotate6 (sol_euler_x_div_sqrtdelta)) +
1052 mk_456 (rotate4 (sol_euler_x_div_sqrtdelta))
1056 (scalar6 (uni(lfun,(scalar6 proj_y4 #0.5))) m4) *
1057 mk_456 (rotate4 (dih_x_div_sqrtdelta_posbranch)) +
1058 (scalar6 (uni(lfun,(scalar6 proj_y5 #0.5))) m5) *
1059 mk_456 (rotate5 (dih_x_div_sqrtdelta_posbranch)) +
1060 (scalar6 (uni(lfun,(scalar6 proj_y6 #0.5))) m6) *
1061 mk_456 (rotate6 (dih_x_div_sqrtdelta_posbranch))
1062 ) (&8 * mm2 / pi))`;;
1064 let shift_scalar6 = prove_by_refinement(
1065 `!f g m. (scalar6 f m) * g = f * (scalar6 g m)`,
1069 REWRITE_TAC[FUN_EQ_THM];
1070 REWRITE_TAC[mul6;scalar6];
1075 let gamma3f_x_div_sqrtdelta_alt = prove_by_refinement(
1076 `!m4 m5 m6. gamma3f_x_div_sqrtdelta m4 m5 m6 =
1077 constant6 (&1/ &12) -
1078 (scalar6 ( mk_456 (rotate5 (sol_euler_x_div_sqrtdelta)) +
1079 mk_456 (rotate6 (sol_euler_x_div_sqrtdelta)) +
1080 mk_456 (rotate4 (sol_euler_x_div_sqrtdelta))
1084 ( (uni(lfun,(scalar6 proj_y4 #0.5))) ) *
1085 (scalar6 (mk_456 (rotate4 (dih_x_div_sqrtdelta_posbranch))) m4) +
1086 ( (uni(lfun,(scalar6 proj_y5 #0.5))) ) *
1087 (scalar6 ( mk_456 (rotate5 (dih_x_div_sqrtdelta_posbranch))) m5) +
1088 ( (uni(lfun,(scalar6 proj_y6 #0.5)))) *
1089 (scalar6 (mk_456 (rotate6 (dih_x_div_sqrtdelta_posbranch))) m6)
1090 ) (&8 * mm2 / pi)) `,
1093 REPEAT WEAK_STRIP_TAC;
1094 REWRITE_TAC[gamma3f_x_div_sqrtdelta];
1095 BY(REWRITE_TAC[shift_scalar6])
1099 let vol3f_456 = new_definition `vol3f_456 m4 =
1100 scalar6 ( mk_456 (rotate5 sol_x) +
1101 mk_456 (rotate6 sol_x) +
1102 mk_456 (rotate4 sol_x)
1106 (scalar6 (uni(lfun,(scalar6 proj_y4 #0.5))) m4) *
1107 mk_456 (rotate4 dih_x) +
1108 (uni(lfun,(scalar6 proj_y5 #0.5))) *
1109 mk_456 (rotate5 dih_x) +
1110 (uni(lfun,(scalar6 proj_y6 #0.5))) *
1111 mk_456 (rotate6 dih_x)
1112 ) (&8 * mm2 / pi)`;;
1114 let gamma3_x = new_definition `gamma3_x m4 =
1115 mk_456 vol_x - vol3f_456 m4`;;
1117 let gamma23_full8_x = new_definition `gamma23_full8_x m1 =
1118 (compose6 (gamma3_x m1)
1119 dummy6 dummy6 dummy6 proj_x1 proj_x2 proj_x6) +
1120 (compose6 (gamma3_x m1)
1121 dummy6 dummy6 dummy6 proj_x1 proj_x3 proj_x5) +
1122 scalar6 (dih_x -(mk_126 dih_x + mk_135 dih_x)) (#0.008)`;;
1124 let gamma23_keep135_x = new_definition `gamma23_keep135_x m1 =
1125 (compose6 (gamma3_x m1)
1126 dummy6 dummy6 dummy6 proj_x1 proj_x3 proj_x5) +
1127 scalar6 (dih_x - mk_135 dih_x) (#0.008)`;;
1129 let nonf_gamma3_x = prove_by_refinement(
1130 `!m1 x1 x2 x3 x4 x5 x6.
1131 gamma3_x m1 x1 x2 x3 x4 x5 x6 = vol_x (&2) (&2) (&2) x4 x5 x6 -
1132 ((sol_x x5 (&2) x4 (&2) x6 (&2) +
1133 sol_x x6 (&2) x5 (&2) x4 (&2) +
1134 sol_x x4 (&2) x6 (&2) x5 (&2)) *
1137 ((lfun (sqrt x4 * #0.5) * m1) * dih_x x4 (&2) x6 (&2) x5 (&2) +
1138 lfun (sqrt x5 * #0.5) * dih_x x5 (&2) x4 (&2) x6 (&2) +
1139 lfun (sqrt x6 * #0.5) * dih_x x6 (&2) x5 (&2) x4 (&2)) *
1144 (REWRITE_TAC[gamma3_x;vol3f_456;mk_456;Sphere.rotate5;Sphere.rotate6;Sphere.rotate4;scalar6;sub6;add6;mul6;constant6;compose6;proj_x1;proj_x2;proj_x3;proj_x4;proj_x5;proj_x6;two6;uni;proj_y4;proj_y5;proj_y6;dummy6;mk_126;mk_135])
1148 let nonf_gamma23_full8_x = prove_by_refinement(
1149 `!m1 x1 x2 x3 x4 x5 x6.
1150 gamma23_full8_x m1 x1 x2 x3 x4 x5 x6 =
1151 gamma3_x m1 (&0) (&0) (&0) x1 x2 x6 +
1152 gamma3_x m1 (&0) (&0) (&0) x1 x3 x5 +
1153 (dih_x x1 x2 x3 x4 x5 x6 -
1154 (dih_x x1 x2 (&2) (&2) (&2) x6 + dih_x x1 (&2) x3 (&2) x5 (&2))) *
1158 (REWRITE_TAC[gamma23_full8_x;mk_456;Sphere.rotate5;Sphere.rotate6;Sphere.rotate4;scalar6;sub6;add6;mul6;constant6;compose6;proj_x1;proj_x2;proj_x3;proj_x4;proj_x5;proj_x6;two6;uni;proj_y4;proj_y5;proj_y6;dummy6;mk_126;mk_135])
1162 let nonf_gamma23_keep135_x = prove_by_refinement(
1163 `!m1 x1 x2 x3 x4 x5 x6.
1164 gamma23_keep135_x m1 x1 x2 x3 x4 x5 x6 =
1165 gamma3_x m1 (&0) (&0) (&0) x1 x3 x5 +
1166 (dih_x x1 x2 x3 x4 x5 x6 - dih_x x1 (&2) x3 (&2) x5 (&2)) * #0.008
1170 (REWRITE_TAC[gamma23_keep135_x;mk_456;Sphere.rotate5;Sphere.rotate6;Sphere.rotate4;scalar6;sub6;add6;mul6;constant6;compose6;proj_x1;proj_x2;proj_x3;proj_x4;proj_x5;proj_x6;two6;uni;proj_y4;proj_y5;proj_y6;dummy6;mk_126;mk_135])
1174 let nonf_gamma3f_x_div_sqrtdelta = prove_by_refinement(
1175 `!m4 m5 m6 x1 x2 x3 x4 x5 x6.
1176 gamma3f_x_div_sqrtdelta m4 m5 m6 x1 x2 x3 x4 x5 x6 = &1 / &12 -
1177 ((sol_euler_x_div_sqrtdelta x5 (&2) x4 (&2) x6 (&2) +
1178 sol_euler_x_div_sqrtdelta x6 (&2) x5 (&2) x4 (&2) +
1179 sol_euler_x_div_sqrtdelta x4 (&2) x6 (&2) x5 (&2)) *
1182 ((lfun (sqrt x4 * #0.5) * m4) *
1183 dih_x_div_sqrtdelta_posbranch x4 (&2) x6 (&2) x5 (&2) +
1184 (lfun (sqrt x5 * #0.5) * m5) *
1185 dih_x_div_sqrtdelta_posbranch x5 (&2) x4 (&2) x6 (&2) +
1186 (lfun (sqrt x6 * #0.5) * m6) *
1187 dih_x_div_sqrtdelta_posbranch x6 (&2) x5 (&2) x4 (&2)) *
1192 BY(REWRITE_TAC[gamma3f_x_div_sqrtdelta;mk_456;Sphere.rotate5;Sphere.rotate6;Sphere.rotate4;scalar6;sub6;add6;mul6;constant6;compose6;proj_x1;proj_x2;proj_x3;proj_x4;proj_x5;proj_x6;two6;uni;proj_y4;proj_y5;proj_y6])
1198 extra parameter cases scratch
1201 (* added 2013-May *)
1203 let F_REWRITE_TAC = REWRITE_TAC[
1204 Nonlin_def.mud_126_x;Nonlin_def.mu6_x;Nonlin_def.mu_y;Nonlin_def.taud;Nonlin_def.taud_x;
1205 Nonlin_def.ups_126;Nonlin_def.edge2_126_x;Nonlin_def.edge2_flatD_x1;
1206 Nonlin_def.edge2_135_x;Nonlin_def.edge2_234_x;
1207 Nonlin_def.mud_135_x;Nonlin_def.mud_126_x;Nonlin_def.mud_234_x;
1208 Nonlin_def.mudLs_234_x;Nonlin_def.mudLs_126_x;Nonlin_def.mudLs_135_x;
1209 LET_DEF;LET_END_DEF;
1211 Sphere.y_of_x;Sphere.flat_term_x;Sphere.flat_term;
1212 compose6;promote3_to_6;
1213 promote1_to_6; domain6;
1227 let taud_x_taud = prove_by_refinement(
1228 `!y1 y2 y3 y4 y5 y6.
1229 &0 <= y1 /\ &0 <= y2 /\ &0 <= y3 ==>
1230 y_of_x taud_x y1 y2 y3 y4 y5 y6 = taud y1 y2 y3 y4 y5 y6`,
1234 REPEAT WEAKER_STRIP_TAC;
1235 BY(ASM_SIMP_TAC[Nonlinear_lemma.sqrtxx])
1239 let mu6_x_mu_y = prove_by_refinement(
1240 `!y1 y2 y3 x4 x5 x6. &0 <= y1 /\ &0 <= y2 /\ &0 <= y3 ==>
1241 mu_y y1 y2 y3 = mu6_x (y1 * y1) ( y2 * y2) (y3 * y3) x4 x5 x6 `,
1245 REPEAT WEAKER_STRIP_TAC;
1246 BY(ASM_SIMP_TAC[Nonlinear_lemma.sqrtxx])
1250 let taud_x_ALT = prove_by_refinement(
1252 (\x1 x2 x3 x4 x5 x6.
1253 (&0 <= x1 /\ &0 <= x2 /\ &0 <= x3))
1254 taud_x ( (promote1_to_6 flat_term_x) +
1255 (uni(sqrt,delta_x)) * mu6_x)`,
1262 let functional_edge2_126_x = prove_by_refinement(
1264 (edge2_126_x d x4 x5) =
1266 let c4 = constant6 x4 in
1267 let c5 = constant6 x5 in
1268 let b = constant6(-- &1) * compose6 delta_x1 zero6 proj_x2 proj_x1 proj_x6 (c5) (c4) in
1269 let c = constant6 ( d) - compose6 delta_x proj_x1 proj_x2 zero6 (c4) (c5) proj_x6 in
1270 let ups_456 = compose6 ups_126 (c4) (c5) dummy6 dummy6 dummy6 proj_x6 in
1271 let discr = ups_456 * ups_126 + constant6( -- &4*d) * a in
1272 (uni(sqrt,discr) - b) / (constant6 (&2) * a))`,
1275 REWRITE_TAC[FUN_EQ_THM];
1277 REPEAT WEAKER_STRIP_TAC;
1278 TYPIFY_GOAL_THEN `!x1 x2 x3 x4 x5 x6. d - delta_x x3 x1 x2 x6 x4 x5 = (x6) * x3 pow 2 + ( -- delta_x1 (&0) x2 x1 x6 x5 x4) * x3 + (d - delta_x (&0) x2 x1 x6 x5 x4)` (unlist ONCE_REWRITE_TAC);
1279 REWRITE_TAC[Sphere.delta_x;Nonlin_def.delta_x1];
1281 REWRITE_TAC[Nonlinear_lemma.abc_quadratic;Sphere.quadratic_root_plus];
1284 MATCH_MP_TAC (arith `s1 = s2 ==> -- -- d + s1 = s2 - -- &1 * d`);
1286 REWRITE_TAC[Nonlin_def.delta_x1;Sphere.ups_x;Sphere.delta_x];
1291 let functional_edge2_135_x = prove_by_refinement(
1293 (edge2_135_x d x4 x6) =
1294 compose6 (edge2_126_x d x4 x6) (proj_x1) (proj_x3) (dummy6) (dummy6) (dummy6) (proj_x5)`,
1297 REWRITE_TAC[FUN_EQ_THM];
1302 let functional_edge2_234_x = prove_by_refinement(
1304 edge2_234_x d x5 x6 =
1305 compose6 (edge2_126_x d x5 x6) (proj_x2) (proj_x3) (dummy6) (dummy6) (dummy6) (proj_x4)`,
1308 REWRITE_TAC[FUN_EQ_THM];
1313 let nonfunctional_edge2_126_x = prove_by_refinement(
1314 `!d x1 x2 a b c x4 x5 x6.
1315 (edge2_126_x d x4 x5) x1 x2 a b c x6 =
1316 ((sqrt (ups_x x4 x5 x6 * ups_x x1 x2 x6 + (-- &4 * d) * x6) -
1317 -- &1 * delta_x1 (&0) x2 x1 x6 x5 x4) /
1321 REWRITE_TAC[FUN_EQ_THM;functional_edge2_126_x];
1326 let nonfunctional_edge2_135_x = prove_by_refinement(
1327 `!d x1 x3 x5 x4 x6 a b c.
1328 (edge2_135_x d x4 x6) x1 a x3 b x5 c = (sqrt (ups_x x4 x6 x5 * ups_x x1 x3 x5 + (-- &4 * d) * x5) -
1329 -- &1 * delta_x1 (&0) x3 x1 x5 x6 x4) /
1333 REWRITE_TAC[FUN_EQ_THM;functional_edge2_126_x;functional_edge2_135_x];
1338 let nonfunctional_edge2_234_x = prove_by_refinement(
1339 `!d x2 x3 x4 x5 x6 a b c.
1340 (edge2_234_x d x5 x6) a x2 x3 x4 b c =
1341 (sqrt (ups_x x5 x6 x4 * ups_x x2 x3 x4 + (-- &4 * d) * x4) -
1342 -- &1 * delta_x1 (&0) x3 x2 x4 x6 x5) /
1346 REWRITE_TAC[FUN_EQ_THM;functional_edge2_126_x;functional_edge2_234_x];
1351 let functional_mud_135_x = prove_by_refinement(
1352 `!y2 y4 y6. (domain6 (\ x1 x2 x3 x4 x5 x6. &0 <= y2))
1353 (mud_135_x_v1 y2 y4 y6)
1354 (mul6 (compose6 (mu6_x) (constant6 (y2*y2)) proj_x1 proj_x3 dummy6 dummy6 dummy6)
1355 (uni(sqrt,(delta_135_x (y2*y2) (y4*y4) (y6*y6)))))`,
1359 REPEAT WEAKER_STRIP_TAC;
1360 BY(ASM_SIMP_TAC[Nonlinear_lemma.sqrtxx])
1364 let functional_mud_126_x = prove_by_refinement(
1365 `!y3 y4 y5. (domain6 (\ x1 x2 x3 x4 x5 x6. &0 <= y3))
1366 (mud_126_x_v1 y3 y4 y5)
1367 (mul6 (compose6 (mu6_x) (constant6 (y3*y3)) proj_x1 proj_x2 dummy6 dummy6 dummy6)
1368 (uni(sqrt,(delta_126_x (y3*y3) (y4*y4) (y5*y5)))))`,
1372 REPEAT WEAKER_STRIP_TAC;
1373 BY(ASM_SIMP_TAC[Nonlinear_lemma.sqrtxx])
1377 let functional_mud_234_x = prove_by_refinement(
1378 `!y1 y5 y6. (domain6 (\ x1 x2 x3 x4 x5 x6. &0 <= y1))
1379 (mud_234_x_v1 y1 y5 y6)
1380 (mul6 (compose6 (mu6_x) (constant6 (y1*y1)) proj_x2 proj_x3 dummy6 dummy6 dummy6)
1381 (uni(sqrt,(delta_234_x (y1*y1) (y5*y5) (y6*y6)))))`,
1385 REPEAT WEAKER_STRIP_TAC;
1386 BY(ASM_SIMP_TAC[Nonlinear_lemma.sqrtxx])
1390 let nonfunctional_taud_D2 = prove_by_refinement(
1391 `!x1 x2 x3 x4 x5 x6. taud_D2_num_x x1 x2 x3 x4 x5 x6 = -- #0.07 *
1392 delta_x x1 x2 x3 x4 x5 x6 *
1393 delta_x1 x1 x2 x3 x4 x5 x6 *
1397 mu6_x x1 x2 x3 x4 x5 x6 *
1398 (delta_x1 x1 x2 x3 x4 x5 x6 * &2 * sqrt x1) pow 2 +
1400 mu6_x x1 x2 x3 x4 x5 x6 *
1401 delta_x x1 x2 x3 x4 x5 x6 *
1402 (-- &8 * x1 * x4 + delta_x1 x1 x2 x3 x4 x5 x6 * &2)`,
1405 REWRITE_TAC[Nonlin_def.taud_D2_num_x];
1411 let nonfunctional_taud_D1 = prove_by_refinement(
1412 `!x1 x2 x3 x4 x5 x6. taud_D1_num_x x1 x2 x3 x4 x5 x6 =
1413 -- #0.07 * delta_x x1 x2 x3 x4 x5 x6 +
1415 mu6_x x1 x2 x3 x4 x5 x6 *
1416 delta_x1 x1 x2 x3 x4 x5 x6 *
1419 sol0 / #0.52 * sqrt (delta_x x1 x2 x3 x4 x5 x6)`,
1422 REWRITE_TAC[Nonlin_def.taud_D1_num_x];
1427 let nonfunctional_mu6_x = prove_by_refinement(
1428 `!x1 x2 x3 x4 x5 x6.
1429 mu6_x x1 x2 x3 x4 x5 x6 =
1430 (#0.012 + #0.07 * (#2.52 - sqrt(x1)) + #0.01 * (#2.52 * &2 - sqrt(x2) - sqrt(x3) ))`,
1437 let functional_delta_x1 = prove_by_refinement(
1438 `delta_x1 = rotate4 delta_x4`,
1441 REWRITE_TAC[FUN_EQ_THM;Sphere.rotate4;Nonlin_def.delta_x1;Sphere.delta_x4];
1446 let functional_dnum1 = prove_by_refinement(
1447 `dnum1 = (constant6 (&16) - constant6 (&2) * proj_x4) * proj_x1 +
1448 (proj_x5 - constant6 (&8)) * proj_x2 + (proj_x6 - constant6(&8)) * proj_x3`,
1451 REWRITE_TAC[FUN_EQ_THM;Nonlin_def.dnum1];
1456 let functional_ups_126 = prove_by_refinement(
1457 `ups_126= two6 * proj_x1 * proj_x6 + two6 * proj_x2 * proj_x6 + two6 * proj_x1 * proj_x2
1458 - proj_x1 * proj_x1 - proj_x2 * proj_x2 - proj_x6 * proj_x6`,
1461 REWRITE_TAC[FUN_EQ_THM;two6];
1463 REWRITE_TAC[Sphere.ups_x];
1468 let nonf_ups_126 = prove_by_refinement(
1469 `!x1 x2 x3 x4 x5 x6. ups_126 x1 x2 x3 x4 x5 x6 = ups_x x1 x2 x6`,
1472 REWRITE_TAC[Nonlin_def.ups_126];
1478 let nonf_gamma3f_x_div_sqrt_delta = prove_by_refinement(
1479 `!p1 p2 p3 x1 x2 x3 x4 x5 x6.
1480 gamma3f_x_div_sqrtdelta p1 p2 p3 x1 x2 x3 x4 x5 x6 = &1 / &12 -
1481 ((sol_euler_x_div_sqrtdelta x5 (&2) x4 (&2) x6 (&2) +
1482 sol_euler_x_div_sqrtdelta x6 (&2) x5 (&2) x4 (&2) +
1483 sol_euler_x_div_sqrtdelta x4 (&2) x6 (&2) x5 (&2)) *
1486 ((lfun (sqrt x4 * #0.5) * p1) *
1487 dih_x_div_sqrtdelta_posbranch x4 (&2) x6 (&2) x5 (&2) +
1488 (lfun (sqrt x5 * #0.5) * p2) *
1489 dih_x_div_sqrtdelta_posbranch x5 (&2) x4 (&2) x6 (&2) +
1490 (lfun (sqrt x6 * #0.5) * p3) *
1491 dih_x_div_sqrtdelta_posbranch x6 (&2) x5 (&2) x4 (&2)) *
1496 REPEAT WEAKER_STRIP_TAC;
1497 REWRITE_TAC[Nonlin_def.gamma3f_x_div_sqrtdelta];
1499 REWRITE_TAC[Nonlin_def.scalar6];
1501 REWRITE_TAC[Nonlin_def.mk_456;Nonlin_def.scalar6];
1503 BY(REWRITE_TAC[Nonlin_def.two6;Nonlin_def.scalar6;Sphere.rotate5;Sphere.rotate6;Sphere.rotate4;Nonlin_def.constant6;Nonlin_def.proj_y4;Nonlin_def.proj_y5;Nonlin_def.proj_y6])