Update from HH
[Flyspeck/.git] / text_formalization / local / OCBICBY.hl
1 (* ========================================================================== *)
2 (* FLYSPECK - BOOK FORMALIZATION                                              *)
3 (* Section: Conclusions                                                       *)
4 (* Chapter: Local Fan                                                         *)
5 (* Lemma: OCBICBY                                                             *)
6 (* Author: Thomas C. Hales                                                    *)
7 (* Date: 2013-06-27                                                           *)
8 (* ========================================================================== *)
9
10
11
12 module Ocbicby = struct
13
14   open Hales_tactic;;
15
16 let LET_THM = CONJ LET_DEF LET_END_DEF;;
17
18 let diff = Pent_hex.diff;;
19 let DERIVED_TAC = Pent_hex.DERIVED_TAC;;
20 (*
21 Functional_equation.functional_overload();;
22 *)
23
24 let sqrt8_flyspeck = prove_by_refinement(
25   `#2.828427 < sqrt8 /\
26      sqrt8 <  #2.828428`,
27   (* {{{ proof *)
28   [
29     BY(REWRITE_TAC[Flyspeck_constants.bounds])
30   ]);;
31   (* }}} *)
32
33 let DOT_LSUB  = prove_by_refinement(
34   `!x y (z:real^A). (x - y) dot z = x dot z - y dot z`,
35   (* {{{ proof *)
36   [
37   REPEAT WEAKER_STRIP_TAC;
38   BY(VECTOR_ARITH_TAC)
39   ]);;
40   (* }}} *)
41
42 let DOT_RSUB  = prove_by_refinement(
43   `!x y (z:real^A). x dot (y - z) = x dot y - x dot z `,
44   (* {{{ proof *)
45   [
46   REPEAT WEAKER_STRIP_TAC;
47   BY(VECTOR_ARITH_TAC)
48   ]);;
49   (* }}} *)
50
51 let euler_p_eulerA_x = prove_by_refinement(
52   `!(v0:real^A) v1 v2 v3. 
53     (let x1 = dist(v0,v1) pow 2 in 
54      let x2 = dist(v0,v2) pow 2 in 
55      let x3 = dist(v0,v3) pow 2 in
56      let x4 = dist(v2,v3) pow 2 in
57      let x5 = dist(v1,v3) pow 2 in
58      let x6 = dist(v1,v2) pow 2 in
59        (euler_p v0 v1 v2 v3 = eulerA_x x1 x2 x3 x4 x5 x6))`,
60   (* {{{ proof *)
61   [
62   REWRITE_TAC[LET_DEF;LET_END_DEF;Sphere.euler_p;Sphere.eulerA_x;Sphere.ylist];
63   REPEAT WEAKER_STRIP_TAC;
64   REPEAT (GMATCH_SIMP_TAC POW_2_SQRT);
65   REWRITE_TAC[DIST_POS_LE];
66   MATCH_MP_TAC (arith `b = b' ==> a + b = a + b'`);
67   MATCH_MP_TAC (arith `a = a' /\ b = b' /\ c = c' ==> ra * a + rb * b + rc * c = ra * a' + rb * b' + rc * c'`);
68   REWRITE_TAC[Collect_geom2.DIST_POW2_DOT];
69   REWRITE_TAC[DOT_LSUB;DOT_RSUB];
70   REWRITE_TAC[DOT_SYM];
71   BY(REAL_ARITH_TAC)
72   ]);;
73   (* }}} *)
74
75 (* was DELTA_IMP_DIH_PI *)
76
77 let COPLANAR_IMP_DIH_PI = prove_by_refinement(
78   `!(v0:real^3) v1 v2 v3. (let y1 = dist(v0,v1)  in 
79      let y2 = dist(v0,v2)  in 
80      let y3 = dist(v0,v3)  in
81      let y4 = dist(v2,v3)  in
82      let y5 = dist(v1,v3)  in
83      let y6 = dist(v1,v2)  in
84        (~collinear {v0, v1, v2} /\ ~collinear {v0, v1, v3} /\ coplanar {v0,v1,v2,v3} /\ 
85           y_of_x delta_x4 y1 y2 y3 y4 y5 y6 < &0 ==>
86           dihV v0 v1 v2 v3 = pi))`,
87   (* {{{ proof *)
88   [
89   REWRITE_TAC[LET_DEF;LET_END_DEF];
90   REPEAT WEAKER_STRIP_TAC;
91   FIRST_X_ASSUM_ST `coplanar` MP_TAC;
92   GMATCH_SIMP_TAC (GSYM DIHV_EQ_0_PI_EQ_COPLANAR);
93   ASM_REWRITE_TAC[];
94   TYPIFY `(&0 < dihV v0 v1 v2 v3 )` ENOUGH_TO_SHOW_TAC;
95     BY(REAL_ARITH_TAC);
96   INTRO_TAC Euler_complement.OJEKOJF2 [`v0`;`v1`;`v2`;`v3`];
97   REWRITE_TAC[LET_DEF;LET_END_DEF];
98   ASM_REWRITE_TAC[];
99   DISCH_THEN SUBST1_TAC;
100   FIRST_X_ASSUM MP_TAC;
101   REWRITE_TAC[Sphere.y_of_x;arith `x*x = x pow 2`];
102   TYPED_ABBREV_TAC  `d4 = delta_x4 (dist (v0,v1) pow 2) (dist (v0,v2) pow 2) (dist (v0,v3) pow 2)  (dist (v2,v3) pow 2) (dist (v1,v3) pow 2) (dist (v1,v2) pow 2)` ;
103   DISCH_TAC;
104   TYPIFY `!x y. (y < &0 ==> atn2 (x,y) = --(pi / &2) - atn (x / y))` (C SUBGOAL_THEN ASSUME_TAC);
105     BY(MESON_TAC[Trigonometry1.ATN2_BREAKDOWN]);
106   FIRST_X_ASSUM (unlist ASM_SIMP_TAC);
107   MATCH_MP_TAC (arith `&0 < pi /\ -- (pi / &2) < a  ==> &0 < pi/ &2 - ( -- (pi/ &2) - a)`);
108   REWRITE_TAC[PI_POS];
109   BY(REWRITE_TAC[ATN_BOUNDS])
110   ]);;
111   (* }}} *)
112
113 let DIH_IMP_EULER_A_POS = prove_by_refinement(
114   `main_nonlinear_terminal_v11 ==> (!(v0:real^3) v1 v2 v3. (let y1 = dist(v0,v1)  in 
115      let y2 = dist(v0,v2)  in 
116      let y3 = dist(v0,v3)  in
117      let y4 = dist(v2,v3)  in
118      let y5 = dist(v1,v3)  in
119      let y6 = dist(v1,v2)  in
120        (~collinear {v0,v1,v2} /\ ~collinear {v0,v2,v3} /\ ~collinear{v0,v1,v3} /\
121           dihV v0 v1 v2 v3 + dihV v0 v2 v3 v1 + dihV v0 v3 v1 v2 < &2 * pi /\
122           &2 <= y1 /\ y1 <= &2 * h0 /\
123           &2 <= y2 /\ y2 <= &2 * h0 /\
124           &2 <= y3 /\ y3 <= &2 * h0 /\
125           #3.01 <= y4 /\ y4 <= #3.915 /\
126           #3.01 <= y5 /\ y5 <= #3.915 /\
127           #3.01 <= y6 /\ y6 <= #3.915 ==>
128           y_of_x eulerA_x y1 y2 y3 y4 y5 y6 > &0)))`,
129   (* {{{ proof *)
130   [
131   REWRITE_TAC[LET_DEF;LET_END_DEF];
132   REPEAT WEAKER_STRIP_TAC;
133   TYPIFY `&0 < delta_y (dist(v0,v1)) (dist(v0,v2)) (dist(v0,v3)) (dist(v2,v3)) (dist(v1,v3)) (dist(v1,v2))` ASM_CASES_TAC;
134     INTRO_TAC Euler_main_theorem.EULER_TRIANGLE [`v0`;`v1`;`v2`;`v3`];
135     REWRITE_TAC[LET_DEF;LET_END_DEF;Sphere.xlist;Sphere.ylist];
136     ANTS_TAC;
137       BY(ASM_REWRITE_TAC[arith `x pow 2 = x * x`;GSYM Sphere.delta_y]);
138     DISCH_TAC;
139     FIRST_X_ASSUM_ST `&2 * pi` MP_TAC;
140     REWRITE_TAC[arith `dd < &2 * pi <=> dd - pi < pi`];
141     ASM_REWRITE_TAC[arith `(a + b+c) -pi = a + b + c - pi`];
142     ASM_REWRITE_TAC[arith `x pow 2 = x * x`;GSYM Sphere.delta_y;arith `pi - u < pi <=> &0 < u`];
143     REWRITE_TAC[ (REWRITE_RULE[LET_DEF;LET_END_DEF] euler_p_eulerA_x)];
144     REWRITE_TAC[arith `x pow 2 = x * x`;GSYM Sphere.y_of_x];
145     TYPED_ABBREV_TAC  `p = y_of_x eulerA_x (dist (v0,v1)) (dist (v0,v2)) (dist (v0,v3)) (dist (v2,v3))   (dist (v1,v3))  (dist (v1,v2))` ;
146     REWRITE_TAC[arith `&0 < &2 * x <=> &0 < x`];
147     GMATCH_SIMP_TAC Merge_ineq.ATN2_POS;
148     CONJ_TAC;
149       GMATCH_SIMP_TAC REAL_LT_RSQRT;
150       BY(ASM_TAC THEN REAL_ARITH_TAC);
151     BY(REAL_ARITH_TAC);
152   COMMENT "case delta=0";
153   TYPIFY `delta_y  (dist (v0,v1)) (dist (v0,v2)) (dist (v0,v3)) (dist (v2,v3))        (dist (v1,v3))        (dist (v1,v2)) = &0` (C SUBGOAL_THEN ASSUME_TAC);
154     INTRO_TAC Terminal.DELTA_Y_POS_4POINTS [`v0`;`v1`;`v2`;`v3`];
155     BY(ASM_TAC THEN REAL_ARITH_TAC);
156   PROOF_BY_CONTR_TAC;
157   TYPIFY `coplanar {v0,v1,v2,v3}` (C SUBGOAL_THEN ASSUME_TAC);
158     REWRITE_TAC[ONCE_REWRITE_RULE[TAUT `(~a <=> b) <=> (a <=> ~b)`] Oxlzlez.coplanar_delta_y];
159     BY(ASM_TAC THEN REAL_ARITH_TAC);
160   TYPIFY `{v0,v2,v3,v1} = {v0,v1,v2,v3} /\ {v0,v3,v1,v2} = {v0,v1,v2,v3}` (C SUBGOAL_THEN ASSUME_TAC);
161     BY(SET_TAC[]);
162   TYPIFY `{v0,v2,v1} = {v0,v1,v2} /\ {v0,v3,v2} = {v0,v2,v3} /\ {v0,v3,v1} = {v0,v1,v3}` (C SUBGOAL_THEN ASSUME_TAC);
163     BY(SET_TAC[]);
164   INTRO_TAC (Terminal.get_main_nonlinear "7439076204") [`dist(v0,v1)`;`dist(v0,v2)`;`dist(v0,v3)`;`dist(v2,v3)`;`dist(v1,v3)`;`dist(v1,v2)`];
165   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`];
166   DISCH_THEN MP_TAC THEN ANTS_TAC;
167     BY(ASM_TAC THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
168   DISCH_TAC;
169   TYPIFY `dihV v0 v1 v2 v3 = pi` (C SUBGOAL_THEN ASSUME_TAC);
170     MATCH_MP_TAC (REWRITE_RULE[LET_THM] COPLANAR_IMP_DIH_PI);
171     BY(ASM_REWRITE_TAC[]);
172   INTRO_TAC (Terminal.get_main_nonlinear "7439076204") [`dist(v0,v2)`;`dist(v0,v3)`;`dist(v0,v1)`;`dist(v3,v1)`;`dist(v2,v1)`;`dist(v2,v3)`];
173   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`];
174   DISCH_THEN MP_TAC THEN ANTS_TAC;
175     BY(ASM_TAC THEN REWRITE_TAC[Sphere.h0;DIST_SYM] THEN REAL_ARITH_TAC);
176   TYPIFY_GOAL_THEN `y_of_x eulerA_x (dist (v0,v2)) (dist (v0,v3)) (dist (v0,v1)) (dist (v3,v1)) (dist (v2,v1)) (dist (v2,v3)) = y_of_x eulerA_x (dist (v0,v1)) (dist (v0,v2)) (dist (v0,v3))        (dist (v2,v3))        (dist (v1,v3))        (dist (v1,v2))` (unlist ASM_REWRITE_TAC);
177     REWRITE_TAC[DIST_SYM;Sphere.y_of_x];
178     BY(MESON_TAC[Merge_ineq.eulerA_x_sym]);
179   DISCH_TAC;
180   TYPIFY `dihV v0 v2 v3 v1 = pi` (C SUBGOAL_THEN ASSUME_TAC);
181     MATCH_MP_TAC (REWRITE_RULE[LET_THM] COPLANAR_IMP_DIH_PI);
182     BY(ASM_REWRITE_TAC[]);
183   INTRO_TAC (Terminal.get_main_nonlinear "7439076204") [`dist(v0,v3)`;`dist(v0,v1)`;`dist(v0,v2)`;`dist(v1,v2)`;`dist(v3,v2)`;`dist(v3,v1)`];
184   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`];
185   DISCH_THEN MP_TAC THEN ANTS_TAC;
186     BY(ASM_TAC THEN REWRITE_TAC[Sphere.h0;DIST_SYM] THEN REAL_ARITH_TAC);
187   TYPIFY_GOAL_THEN `y_of_x eulerA_x (dist (v0,v3)) (dist (v0,v1)) (dist (v0,v2)) (dist (v1,v2)) (dist (v3,v2)) (dist (v3,v1)) =  y_of_x eulerA_x (dist (v0,v1)) (dist (v0,v2)) (dist (v0,v3))        (dist (v2,v3))        (dist (v1,v3))        (dist (v1,v2))` (unlist ASM_REWRITE_TAC);
188     REWRITE_TAC[DIST_SYM;Sphere.y_of_x];
189     BY(MESON_TAC[Merge_ineq.eulerA_x_sym]);
190   DISCH_TAC;
191   TYPIFY `dihV v0 v3 v1 v2 = pi` (C SUBGOAL_THEN ASSUME_TAC);
192     MATCH_MP_TAC (REWRITE_RULE[LET_THM] COPLANAR_IMP_DIH_PI);
193     BY(ASM_REWRITE_TAC[]);
194   REPEAT (FIRST_X_ASSUM_ST `dihV` MP_TAC);
195   MP_TAC PI_POS;
196   BY(REAL_ARITH_TAC)
197   ]);;
198   (* }}} *)
199
200 let ups_x_delta_x = prove_by_refinement(
201   `!x1 x2 x3 x4 x5 x6.
202     delta_x4 x1 x2 x3 x4 x5 x6 pow 2 + &4 * x1 * delta_x x1 x2 x3 x4 x5 x6 = ups_x x1 x3 x5 * ups_x x1 x2 x6`,
203   (* {{{ proof *)
204   [
205   REWRITE_TAC[Sphere.delta_x4;Sphere.delta_x;Sphere.ups_x];
206   BY(REAL_ARITH_TAC)
207   ]);;
208   (* }}} *)
209
210 (* DERIVATIVES *)
211
212 let derived_form_b = prove_by_refinement(
213   `!b f f' x s. derived_form b f f' x s <=> (b ==> derived_form T f f' x s)`,
214   (* {{{ proof *)
215   [
216     BY(REWRITE_TAC[Calc_derivative.derived_form])
217   ]);;
218   (* }}} *)
219
220 let derived_form_delta_x_wrt_x4 = prove_by_refinement(
221   `!x1 x2 x3 x4 x5 x6. 
222     derived_form T (\q. delta_x x1 x2 x3 q x5 x6) (delta_x4 x1 x2 x3 x4 x5 x6) (x4) (:real)`,
223   (* {{{ proof *)
224   [
225   REPEAT WEAKER_STRIP_TAC;
226   REWRITE_TAC[Sphere.delta_x4;Sphere.delta_x];
227   DERIVED_TAC (MP_TAC);
228   MATCH_MP_TAC (TAUT `(x <=> y) ==> (x ==> y)`);
229   REPEAT (AP_THM_TAC ORELSE AP_TERM_TAC);
230   BY(REAL_ARITH_TAC)
231   ]);;
232   (* }}} *)
233
234 let derived_form_delta_x_wrt_x5 = prove_by_refinement(
235   `!x1 x2 x3 x4 x5 x6. 
236     derived_form T (\q. delta_x x1 x2 x3 x4 q x6) (delta_x5 x1 x2 x3 x4 x5 x6) (x5) (:real)`,
237   (* {{{ proof *)
238   [
239   REPEAT WEAKER_STRIP_TAC;
240   REWRITE_TAC[Nonlin_def.delta_x5;Sphere.delta_x];
241   DERIVED_TAC (MP_TAC);
242   MATCH_MP_TAC (TAUT `(x <=> y) ==> (x ==> y)`);
243   REPEAT (AP_THM_TAC ORELSE AP_TERM_TAC);
244   BY(REAL_ARITH_TAC)
245   ]);;
246   (* }}} *)
247
248 let derived_form_delta_x_wrt_x6 = prove_by_refinement(
249   `!x1 x2 x3 x4 x5 x6. 
250     derived_form T (\q. delta_x x1 x2 x3 x4 x5 q) (delta_x6 x1 x2 x3 x4 x5 x6) (x6) (:real)`,
251   (* {{{ proof *)
252   [
253   REPEAT WEAKER_STRIP_TAC;
254   REWRITE_TAC[Nonlin_def.delta_x6;Sphere.delta_x];
255   DERIVED_TAC (MP_TAC);
256   MATCH_MP_TAC (TAUT `(x <=> y) ==> (x ==> y)`);
257   REPEAT (AP_THM_TAC ORELSE AP_TERM_TAC);
258   BY(REAL_ARITH_TAC)
259   ]);;
260   (* }}} *)
261
262 let derived_form_delta_x4_wrt_x4 = prove_by_refinement(
263   `!x1 x2 x3 x4 x5 x6. 
264     derived_form T (\q. delta_x4 x1 x2 x3 q x5 x6) (-- &2 * x1) (x4) (:real)`,
265   (* {{{ proof *)
266   [
267   REPEAT WEAKER_STRIP_TAC;
268   REWRITE_TAC[Sphere.delta_x4];
269   DERIVED_TAC (MP_TAC);
270   MATCH_MP_TAC (TAUT `(x <=> y) ==> (x ==> y)`);
271   REPEAT (AP_THM_TAC ORELSE AP_TERM_TAC);
272   BY(REAL_ARITH_TAC)
273   ]);;
274   (* }}} *)
275
276 let derived_form_delta_x4_wrt_x5 = prove_by_refinement(
277   `!x1 x2 x3 x4 x5 x6. 
278     derived_form T (\q. delta_x4 x1 x2 x3 x4 q x6) (x1 + x2 - x6) (x5) (:real)`,
279   (* {{{ proof *)
280   [
281   REPEAT WEAKER_STRIP_TAC;
282   REWRITE_TAC[Sphere.delta_x4];
283   DERIVED_TAC (MP_TAC);
284   MATCH_MP_TAC (TAUT `(x <=> y) ==> (x ==> y)`);
285   REPEAT (AP_THM_TAC ORELSE AP_TERM_TAC);
286   BY(REAL_ARITH_TAC)
287   ]);;
288   (* }}} *)
289
290 let derived_form_delta_x4_wrt_x6 = prove_by_refinement(
291   `!x1 x2 x3 x4 x5 x6. 
292     derived_form T (\q. delta_x4 x1 x2 x3 x4 x5 q) (x1 + x3 - x5) (x6) (:real)`,
293   (* {{{ proof *)
294   [
295   REPEAT WEAKER_STRIP_TAC;
296   REWRITE_TAC[Sphere.delta_x4];
297   DERIVED_TAC (MP_TAC);
298   MATCH_MP_TAC (TAUT `(x <=> y) ==> (x ==> y)`);
299   REPEAT (AP_THM_TAC ORELSE AP_TERM_TAC);
300   BY(REAL_ARITH_TAC)
301   ]);;
302   (* }}} *)
303
304 let derived_form_dih_x_wrt_x4 = prove_by_refinement(
305   `!x1 x2 x3 x4 x5 x6.
306     &0 < x1 /\
307     &0 < delta_x x1 x2 x3 x4 x5 x6 /\
308     &0 < ups_x x1 x2 x6 /\
309     &0 < ups_x x1 x3 x5 ==>
310     derived_form T (\q. dih_x x1 x2 x3 q x5 x6) (sqrt x1 / sqrt (delta_x x1 x2 x3 x4 x5 x6)) (x4) (:real)`,
311   (* {{{ proof *)
312   [
313   REPEAT WEAKER_STRIP_TAC;
314   TYPED_ABBREV_TAC `w = (sqrt x1 / sqrt (delta_x x1 x2 x3 x4 x5 x6))`;
315   REWRITE_TAC[Sphere.dih_x;LET_THM];
316   DERIVED_TAC (MP_TAC o GEN_ALL o (GENL [`x1:real`;`x2:real`;`x3:real`;`x4:real`;`x5:real`;`x6:real`]));
317   DISCH_THEN (C INTRO_TAC [`(-- &2 * x1)`;`(delta_x4 x1 x2 x3 x4 x5 x6)`;`x1`;`x2`;`x3`;`x4`;`x5`;`x6`]);
318   TYPIFY `&0 < &4 * x1 * delta_x x1 x2 x3 x4 x5 x6` (C SUBGOAL_THEN ASSUME_TAC);
319     GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
320     REWRITE_TAC[arith `&0 < &4`];
321     GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
322     BY(ASM_REWRITE_TAC[]);
323   TYPIFY `&0 < sqrt(&4 * x1 * delta_x x1 x2 x3 x4 x5 x6)` (C SUBGOAL_THEN ASSUME_TAC);
324     GMATCH_SIMP_TAC REAL_LT_RSQRT;
325     BY(ASM_TAC THEN REAL_ARITH_TAC);
326   ONCE_REWRITE_TAC[derived_form_b];
327   ANTS_TAC;
328     ASM_REWRITE_TAC[derived_form_delta_x4_wrt_x4;derived_form_delta_x_wrt_x4;IN_UNIV;DE_MORGAN_THM];
329     BY(ASM_TAC THEN REAL_ARITH_TAC);
330   REWRITE_TAC[];
331   MATCH_MP_TAC (TAUT `(x <=> y) ==> (x ==> y)`);
332   REPEAT (AP_THM_TAC ORELSE AP_TERM_TAC);
333   TYPIFY `(sqrt (&4 * x1 * delta_x x1 x2 x3 x4 x5 x6) pow 2 +  --delta_x4 x1 x2 x3 x4 x5 x6 pow 2) = ups_x x1 x3 x5 * ups_x x1 x2 x6 ` (C SUBGOAL_THEN ASSUME_TAC);
334     GMATCH_SIMP_TAC SQRT_POW_2;
335     ASM_SIMP_TAC[arith `&0 < x ==> &0 <= x`];
336     REWRITE_TAC[arith `(-- x) pow 2 = x pow 2`;GSYM ups_x_delta_x];
337     BY(REAL_ARITH_TAC);
338   ASM_REWRITE_TAC[];
339   TYPIFY `(((-- &2 * x1) * -- &1) * sqrt (&4 * x1 * delta_x x1 x2 x3 x4 x5 x6) -  --delta_x4 x1 x2 x3 x4 x5 x6 *  (&4 * x1 * delta_x4 x1 x2 x3 x4 x5 x6) *  inv (&2 * sqrt (&4 * x1 * delta_x x1 x2 x3 x4 x5 x6)))  = (&2 * x1) * (ups_x x1 x3 x5 * ups_x x1 x2 x6) / sqrt(&4 * x1 * delta_x x1 x2 x3 x4 x5 x6)` (C SUBGOAL_THEN SUBST1_TAC);
340     FIRST_ASSUM ( SUBST1_TAC o GSYM);
341     Calc_derivative.CALC_ID_TAC;
342     BY(ASM_TAC THEN REAL_ARITH_TAC);
343   TYPIFY `((&2 * x1) *  (ups_x x1 x3 x5 * ups_x x1 x2 x6) /  sqrt (&4 * x1 * delta_x x1 x2 x3 x4 x5 x6)) / (ups_x x1 x3 x5 * ups_x x1 x2 x6) = sqrt(x1) / sqrt(delta_x x1 x2 x3 x4 x5 x6)` (C SUBGOAL_THEN SUBST1_TAC);
344     Calc_derivative.CALC_ID_TAC;
345     TYPIFY `&0 < sqrt(delta_x x1 x2 x3 x4 x5 x6)` (C SUBGOAL_THEN ASSUME_TAC);
346       GMATCH_SIMP_TAC REAL_LT_RSQRT;
347       BY(ASM_TAC THEN REAL_ARITH_TAC);
348     CONJ_TAC;
349       BY(ASM_TAC THEN REAL_ARITH_TAC);
350     TYPIFY `sqrt(&4 * x1 * delta_x x1 x2 x3 x4 x5 x6) = &2 * sqrt(x1) * sqrt(delta_x x1 x2 x3 x4 x5 x6)` (C SUBGOAL_THEN SUBST1_TAC);
351       GMATCH_SIMP_TAC (GSYM SQRT_MUL);
352       TYPIFY `&2 = sqrt(&4)` (C SUBGOAL_THEN SUBST1_TAC);
353         MATCH_MP_TAC Upfzbzm_support_lemmas.SQRT_RULE_Euler_lemma;
354         BY(REAL_ARITH_TAC);
355       CONJ_TAC;
356         BY(ASM_TAC THEN REAL_ARITH_TAC);
357       GMATCH_SIMP_TAC (GSYM SQRT_MUL);
358       REWRITE_TAC[arith `&0 <= &4`];
359       GMATCH_SIMP_TAC REAL_LE_MUL;
360       BY(ASM_TAC THEN REAL_ARITH_TAC);
361     TYPIFY `sqrt x1 * sqrt x1 = x1` (C SUBGOAL_THEN MP_TAC);
362       GMATCH_SIMP_TAC (GSYM SQRT_MUL);
363       GMATCH_SIMP_TAC Nonlinear_lemma.sqrtxx;
364       BY(ASM_TAC THEN REAL_ARITH_TAC);
365     TYPED_ABBREV_TAC  `s = sqrt(delta_x x1 x2 x3 x4 x5 x6)` ;
366     REWRITE_TAC[arith `((&2 * sx * s) * u) * sx = &2 * (sx * sx) * s * u`];
367     DISCH_THEN SUBST1_TAC;
368     BY(REAL_ARITH_TAC);
369   EXPAND_TAC "w";
370   BY(REWRITE_TAC[])
371   ]);;
372   (* }}} *)
373
374 let derived_form_dih_x_wrt_x5 = prove_by_refinement(
375   `!x1 x2 x3 x4 x5 x6.
376     &0 < x1 /\
377     &0 < delta_x x1 x2 x3 x4 x5 x6 /\
378     &0 < ups_x x1 x2 x6 /\
379     &0 < ups_x x1 x3 x5 ==>
380     derived_form T (\q. dih_x x1 x2 x3 x4 q x6) (--sqrt x1 *
381  delta_x6 x1 x2 x3 x4 x5 x6 /
382  (ups_x x1 x3 x5 * sqrt (delta_x x1 x2 x3 x4 x5 x6))) (x5) (:real)`,
383   (* {{{ proof *)
384   [
385   REPEAT WEAKER_STRIP_TAC;
386   TYPED_ABBREV_TAC `w = (--sqrt x1 * delta_x6 x1 x2 x3 x4 x5 x6 / (ups_x x1 x3 x5 * sqrt (delta_x x1 x2 x3 x4 x5 x6)))`;
387   REWRITE_TAC[Sphere.dih_x;LET_THM];
388   DERIVED_TAC (MP_TAC o GEN_ALL o (GENL [`x1:real`;`x2:real`;`x3:real`;`x4:real`;`x5:real`;`x6:real`]));
389   DISCH_THEN (C INTRO_TAC [`x1 + x2 - x6`;`(delta_x5 x1 x2 x3 x4 x5 x6)`;`x1`;`x2`;`x3`;`x4`;`x5`;`x6`]);
390   TYPIFY `&0 < &4 * x1 * delta_x x1 x2 x3 x4 x5 x6` (C SUBGOAL_THEN ASSUME_TAC);
391     GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
392     REWRITE_TAC[arith `&0 < &4`];
393     GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
394     BY(ASM_REWRITE_TAC[]);
395   TYPIFY `&0 < sqrt(&4 * x1 * delta_x x1 x2 x3 x4 x5 x6)` (C SUBGOAL_THEN ASSUME_TAC);
396     GMATCH_SIMP_TAC REAL_LT_RSQRT;
397     BY(ASM_TAC THEN REAL_ARITH_TAC);
398   ONCE_REWRITE_TAC[derived_form_b];
399   ANTS_TAC;
400     ASM_REWRITE_TAC[derived_form_delta_x4_wrt_x5;derived_form_delta_x_wrt_x5;IN_UNIV;DE_MORGAN_THM];
401     BY(ASM_TAC THEN REAL_ARITH_TAC);
402   REWRITE_TAC[];
403   MATCH_MP_TAC (TAUT `(x <=> y) ==> (x ==> y)`);
404   REPEAT (AP_THM_TAC ORELSE AP_TERM_TAC);
405   TYPIFY `(sqrt (&4 * x1 * delta_x x1 x2 x3 x4 x5 x6) pow 2 +  --delta_x4 x1 x2 x3 x4 x5 x6 pow 2) = ups_x x1 x3 x5 * ups_x x1 x2 x6 ` (C SUBGOAL_THEN ASSUME_TAC);
406     GMATCH_SIMP_TAC SQRT_POW_2;
407     ASM_SIMP_TAC[arith `&0 < x ==> &0 <= x`];
408     REWRITE_TAC[arith `(-- x) pow 2 = x pow 2`;GSYM ups_x_delta_x];
409     BY(REAL_ARITH_TAC);
410   ASM_REWRITE_TAC[];
411   TYPIFY `(((x1 + x2 - x6) * -- &1) * sqrt (&4 * x1 * delta_x x1 x2 x3 x4 x5 x6) -  --delta_x4 x1 x2 x3 x4 x5 x6 *  (&4 * x1 * delta_x5 x1 x2 x3 x4 x5 x6) *  inv (&2 * sqrt (&4 * x1 * delta_x x1 x2 x3 x4 x5 x6))) = (-- &4 * x1 * ups_x x1 x2 x6 * delta_x6 x1 x2 x3 x4 x5 x6) / (&2 * sqrt(&4 * x1 * delta_x x1 x2 x3 x4 x5 x6))` (C SUBGOAL_THEN SUBST1_TAC);
412     Calc_derivative.CALC_ID_TAC;
413     CONJ_TAC;
414       BY(ASM_TAC THEN REAL_ARITH_TAC);
415     REWRITE_TAC[arith `(xx * s) * &2 * s = (s * s) * xx * &2`];
416     GMATCH_SIMP_TAC (GSYM SQRT_MUL);
417     ASM_SIMP_TAC[arith `&0 <x ==> &0 <= x`];
418     GMATCH_SIMP_TAC Nonlinear_lemma.sqrtxx;
419     ASM_SIMP_TAC[arith `&0 <x ==> &0 <= x`];
420     TYPED_ABBREV_TAC `sq = sqrt (&4 * x1 * delta_x x1 x2 x3 x4 x5 x6)`;
421     REWRITE_TAC[Sphere.delta_x;Nonlin_def.delta_x4;Nonlin_def.delta_x5;Nonlin_def.delta_x6;Sphere.ups_x];
422     BY(REAL_ARITH_TAC);
423   TYPIFY `(-- &4 * x1 * ups_x x1 x2 x6 * delta_x6 x1 x2 x3 x4 x5 x6) / (&2 * sqrt (&4 * x1 * delta_x x1 x2 x3 x4 x5 x6)) / (ups_x x1 x3 x5 * ups_x x1 x2 x6) = -- sqrt x1 * delta_x6 x1 x2 x3 x4 x5 x6 / (ups_x x1 x3 x5 * sqrt(delta_x x1 x2 x3 x4 x5 x6))` (C SUBGOAL_THEN SUBST1_TAC);
424     Calc_derivative.CALC_ID_TAC;
425     TYPIFY `&0 < sqrt(delta_x x1 x2 x3 x4 x5 x6)` (C SUBGOAL_THEN ASSUME_TAC);
426       GMATCH_SIMP_TAC REAL_LT_RSQRT;
427       BY(ASM_TAC THEN REAL_ARITH_TAC);
428     CONJ_TAC;
429       BY(ASM_TAC THEN REAL_ARITH_TAC);
430     TYPIFY `sqrt(&4 * x1 * delta_x x1 x2 x3 x4 x5 x6) = &2 * sqrt(x1) * sqrt(delta_x x1 x2 x3 x4 x5 x6)` (C SUBGOAL_THEN SUBST1_TAC);
431       GMATCH_SIMP_TAC (GSYM SQRT_MUL);
432       TYPIFY `&2 = sqrt(&4)` (C SUBGOAL_THEN SUBST1_TAC);
433         MATCH_MP_TAC Upfzbzm_support_lemmas.SQRT_RULE_Euler_lemma;
434         BY(REAL_ARITH_TAC);
435       CONJ_TAC;
436         BY(ASM_TAC THEN REAL_ARITH_TAC);
437       GMATCH_SIMP_TAC (GSYM SQRT_MUL);
438       REWRITE_TAC[arith `&0 <= &4`];
439       GMATCH_SIMP_TAC REAL_LE_MUL;
440       BY(ASM_TAC THEN REAL_ARITH_TAC);
441     TYPIFY `sqrt x1 * sqrt x1 = x1` (C SUBGOAL_THEN MP_TAC);
442       GMATCH_SIMP_TAC (GSYM SQRT_MUL);
443       GMATCH_SIMP_TAC Nonlinear_lemma.sqrtxx;
444       BY(ASM_TAC THEN REAL_ARITH_TAC);
445     TYPED_ABBREV_TAC  `s = sqrt(delta_x x1 x2 x3 x4 x5 x6)` ;
446     REWRITE_TAC[arith `((&2 * sx * s) * u) * sx = &2 * (sx * sx) * s * u`];
447     BY(CONV_TAC REAL_RING);
448   EXPAND_TAC "w";
449   BY(REWRITE_TAC[])
450   ]);;
451   (* }}} *)
452
453 let derived_form_dih_x_wrt_x6 = prove_by_refinement(
454   `!x1 x2 x3 x4 x5 x6.
455     &0 < x1 /\
456     &0 < delta_x x1 x2 x3 x4 x5 x6 /\
457     &0 < ups_x x1 x2 x6 /\
458     &0 < ups_x x1 x3 x5 ==>
459     derived_form T (\q. dih_x x1 x2 x3 x4 x5 q) (--sqrt x1 *
460  delta_x5 x1 x2 x3 x4 x5 x6 /
461  (ups_x x1 x2 x6 * sqrt (delta_x x1 x2 x3 x4 x5 x6))) (x6) (:real)`,
462   (* {{{ proof *)
463   [
464   REPEAT WEAKER_STRIP_TAC;
465   TYPIFY_GOAL_THEN `!q. dih_x x1 x2 x3 x4 x5 q = dih_x x1 x3 x2 x4 q x5` (unlist REWRITE_TAC);
466     BY(REWRITE_TAC[Nonlinear_lemma.dih_x_sym]);
467   INTRO_TAC derived_form_dih_x_wrt_x5 [`x1`;`x3`;`x2`;`x4`;`x6`;`x5`];
468   TYPIFY `delta_x x1 x3 x2 x4 x6 x5 = delta_x x1 x2 x3 x4 x5 x6` (C SUBGOAL_THEN SUBST1_TAC);
469     BY(ASM_TAC THEN MESON_TAC[Merge_ineq.delta_x_sym]);
470   ASM_REWRITE_TAC[];
471   MATCH_MP_TAC (TAUT `(x <=> y) ==> (x ==> y)`);
472   REPEAT (AP_THM_TAC ORELSE AP_TERM_TAC);
473   REWRITE_TAC[Nonlin_def.delta_x6;Nonlin_def.delta_x5];
474   BY(REAL_ARITH_TAC)
475   ]);;
476   (* }}} *)
477
478 let derived_form_num1 = prove_by_refinement(
479   `!x4 x5 x6 e1 e2 e3.
480     derived_form T  (\q. num1 e1 e2 e3 q x5 x6)  (&4 * ((&16 - &2 * x4) * e1 + (x5 - &8) * e2 + (x6 - &8) * e3))
481     (x4) (:real)`,
482   (* {{{ proof *)
483   [
484   REPEAT WEAKER_STRIP_TAC;
485   REWRITE_TAC[Sphere.num1];
486   DERIVED_TAC MP_TAC;
487   MATCH_MP_TAC (TAUT `(x <=> y) ==> (x ==> y)`);
488   REPEAT (AP_THM_TAC ORELSE AP_TERM_TAC);
489   BY(REAL_ARITH_TAC)
490   ]);;
491   (* }}} *)
492
493 let derived_form_dnum1 = prove_by_refinement(
494   `!x4 x5 x6 e1 e2 e3.
495     derived_form T  (\q. num1 e1 e2 e3 q x5 x6)  (&4 * dnum1 e1 e2 e3 x4 x5 x6)
496     (x4) (:real)`,
497   (* {{{ proof *)
498   [
499    BY(REWRITE_TAC[Nonlin_def.dnum1;derived_form_num1])
500   ]);;
501   (* }}} *)
502
503 let derived_form_sum_dih = prove_by_refinement(
504   `!x1 x2 x3 x4 x5 x6 e1 e2 e3.
505     &0 < x1 /\ &0 < x2 /\ &0 < x3 /\
506     &0 < delta_x x1 x2 x3 x4 x5 x6 /\
507     &0 < ups_x x1 x2 x6 /\
508     &0 < ups_x x1 x3 x5 /\
509     &0 < ups_x x2 x3 x4 ==>
510     derived_form T (\q. e1 * dih_x x1 x2 x3 q x5 x6
511                    + e2 * dih_x x2 x3 x1 x5 x6 q 
512                    + e3 * dih_x x3 x1 x2 x6 q x5) ((e1 * sqrt x1 * ups_x x2 x3 x4 -
513   e2 * sqrt x2 * delta_x6 x1 x2 x3 x4 x5 x6 -
514   e3 * sqrt x3 * delta_x5 x1 x2 x3 x4 x5 x6) /
515  (ups_x x2 x3 x4 * sqrt (delta_x x1 x2 x3 x4 x5 x6))) (x4) (:real)`,
516   (* {{{ proof *)
517   [
518   REPEAT WEAKER_STRIP_TAC;
519   TYPED_ABBREV_TAC `w = (e1 * sqrt x1 * ups_x x2 x3 x4 -  e2 * sqrt x2 * delta_x6 x1 x2 x3 x4 x5 x6 -  e3 * sqrt x3 * delta_x5 x1 x2 x3 x4 x5 x6) / (ups_x x2 x3 x4 * sqrt (delta_x x1 x2 x3 x4 x5 x6))`;
520   TYPIFY_GOAL_THEN `!q. e1 * dih_x x1 x2 x3 q x5 x6  + e2 * dih_x x2 x3 x1 x5 x6 q                 + e3 * dih_x x3 x1 x2 x6 q x5 = e1 * (\q. dih_x x1 x2 x3 q x5 x6) q + e2 * (\q. dih_x x2 x3 x1 x5 x6 q) q + e3 * (\q. dih_x x3 x1 x2 x6 q x5) q` (unlist PURE_REWRITE_TAC);
521     BY(REWRITE_TAC[]);
522   TYPED_ABBREV_TAC  `f1 = (\q. dih_x x1 x2 x3 q x5 x6)` ;
523   TYPED_ABBREV_TAC  `f2 = (\q. dih_x x2 x3 x1 x5 x6 q)` ;
524   TYPED_ABBREV_TAC  `f3 = (\q. dih_x x3 x1 x2 x6 q x5)` ;
525   DERIVED_TAC (MP_TAC o GEN_ALL o (GENL [`x1:real`;`x2:real`;`x3:real`;`x4:real`;`x5:real`;`x6:real`;`e1:real`;`e2:real`;`e3:real`]));
526   DISCH_THEN (C INTRO_TAC [`f1`;`f2`;`f3`]);
527   EXPAND_TAC "f1";
528   DISCH_THEN (C INTRO_TAC [`(sqrt x1 / sqrt (delta_x x1 x2 x3 x4 x5 x6))`;`(--sqrt x2 * delta_x5 x2 x3 x1 x5 x6 x4 / (ups_x x2 x3 x4 * sqrt (delta_x x2 x3 x1 x5 x6 x4)))`;` (--sqrt x3 * delta_x6 x3 x1 x2 x6 x4 x5 / (ups_x x3 x2 x4 * sqrt (delta_x x3 x1 x2 x6 x4 x5)))`;`x1`;`x2`;`x3`;`x4`;`x5`;`x6`;`e1`;`e2`;`e3`]);
529   ASM_SIMP_TAC[derived_form_dih_x_wrt_x4];
530   TYPIFY `delta_x x2 x3 x1 x5 x6 x4 = delta_x x1 x2 x3 x4 x5 x6 /\ delta_x x3 x1 x2 x6 x4 x5 = delta_x x1 x2 x3 x4 x5 x6` (C SUBGOAL_THEN ASSUME_TAC);
531     BY(REWRITE_TAC[Merge_ineq.delta_x_sym]);
532   TYPIFY `ups_x x2 x1 x6 = ups_x x1 x2 x6 /\ ups_x x3 x1 x5 = ups_x x1 x3 x5 /\ ups_x x3 x2 x4 = ups_x x2 x3 x4` (C SUBGOAL_THEN ASSUME_TAC);
533     BY(REWRITE_TAC[Merge_ineq.ups_x_sym]);
534   ONCE_REWRITE_TAC[derived_form_b];
535   ANTS_TAC;
536     EXPAND_TAC "f2";
537     EXPAND_TAC "f3";
538     CONJ_TAC;
539       MATCH_MP_TAC derived_form_dih_x_wrt_x6;
540       BY(ASM_REWRITE_TAC[]);
541     MATCH_MP_TAC derived_form_dih_x_wrt_x5;
542     BY(ASM_REWRITE_TAC[]);
543   REWRITE_TAC[];
544   MATCH_MP_TAC (TAUT `(x <=> y) ==> (x ==> y)`);
545   REPEAT (AP_THM_TAC ORELSE AP_TERM_TAC);
546   ASM_REWRITE_TAC[];
547   TYPIFY `delta_x5 x2 x3 x1 x5 x6 x4 = delta_x6 x1 x2 x3 x4 x5 x6` (C SUBGOAL_THEN SUBST1_TAC);
548     REWRITE_TAC[Nonlin_def.delta_x5;Nonlin_def.delta_x6];
549     BY(REAL_ARITH_TAC);
550   TYPIFY `delta_x6 x3 x1 x2 x6 x4 x5 = delta_x5 x1 x2 x3 x4 x5 x6` (C SUBGOAL_THEN SUBST1_TAC);
551     REWRITE_TAC[Nonlin_def.delta_x5;Nonlin_def.delta_x6];
552     BY(REAL_ARITH_TAC);
553   TYPIFY `&0 < sqrt(delta_x x1 x2 x3 x4 x5 x6)` (C SUBGOAL_THEN ASSUME_TAC);
554     GMATCH_SIMP_TAC REAL_LT_RSQRT;
555     BY(ASM_TAC THEN REAL_ARITH_TAC);
556   TYPIFY `e1 * sqrt x1 / sqrt (delta_x x1 x2 x3 x4 x5 x6) + e2 * --sqrt x2 * delta_x6 x1 x2 x3 x4 x5 x6 / (ups_x x2 x3 x4 * sqrt (delta_x x1 x2 x3 x4 x5 x6)) + e3 * --sqrt x3 * delta_x5 x1 x2 x3 x4 x5 x6 / (ups_x x2 x3 x4 * sqrt (delta_x x1 x2 x3 x4 x5 x6)) = (e1 * sqrt x1 * ups_x x2 x3 x4 - e2 * sqrt x2 * delta_x6 x1 x2 x3 x4 x5 x6 - e3 * sqrt x3 * delta_x5 x1 x2 x3 x4 x5 x6) / (ups_x x2 x3 x4 * sqrt(delta_x x1 x2 x3 x4 x5 x6))` (C SUBGOAL_THEN SUBST1_TAC);
557     Calc_derivative.CALC_ID_TAC;
558     BY(ASM_TAC THEN REAL_ARITH_TAC);
559   EXPAND_TAC "w";
560   BY(REWRITE_TAC[])
561   ]);;
562   (* }}} *)
563
564 let derived_form_sum_dih444 = prove_by_refinement(
565   `!x4 x5 x6 e1 e2 e3.
566     &0 < x4 /\ x4 < &16 /\
567     &0 < x5 /\ x5 < &16 /\
568     &0 < x6 /\ x6 < &16 /\
569     &0 < delta_x (&4) (&4) (&4) x4 x5 x6 ==>
570     derived_form T (\q. e1 * dih_x (&4) (&4) (&4) q x5 x6
571                    + e2 * dih_x (&4) (&4) (&4) x5 x6 q 
572                    + e3 * dih_x (&4) (&4) (&4) x6 q x5) 
573     (( num1 e1 e2 e3 x4 x5 x6 ) / (&2 * x4 * (&16 - x4) * sqrt(delta_x (&4) (&4) (&4) x4 x5 x6))) (x4) (:real)`,
574   (* {{{ proof *)
575   [
576   REPEAT WEAKER_STRIP_TAC;
577   ONCE_REWRITE_TAC[arith `a / (&2 * b) = (a/ &2) / b`];
578   INTRO_TAC derived_form_sum_dih [`&4`;`&4`;`&4`;`x4`;`x5`;`x6`;`e1`;`e2`;`e3`];
579   TYPIFY_GOAL_THEN `!x. ups_x (&4) (&4) (x) = x * (&16 - x)` (unlist REWRITE_TAC);
580     ASM_REWRITE_TAC[Sphere.ups_x;arith `&0 < &4`];
581     TYPIFY_GOAL_THEN `!x6. -- &4 * &4 - &4 * &4 - x6 * x6 + &2 * &4 * x6 + &2 * &4 * &4 + &2 * &4 * x6 = x6 * (&16- x6)` (unlist REWRITE_TAC);
582     BY(REAL_ARITH_TAC);
583   ANTS_TAC;
584     REPEAT (GMATCH_SIMP_TAC REAL_LT_MUL_EQ);
585     BY(ASM_TAC THEN REAL_ARITH_TAC);
586   MATCH_MP_TAC (TAUT `(x <=> y) ==> (x ==> y)`);
587   REWRITE_TAC[REAL_MUL_AC;Collect_geom2.SQRT4_EQ2];
588   REPEAT (AP_THM_TAC ORELSE AP_TERM_TAC);
589   REWRITE_TAC[Sphere.num1;Nonlin_def.delta_x6;Nonlin_def.delta_x5];
590   BY(REAL_ARITH_TAC)
591   ]);;
592   (* }}} *)
593
594 let derived_form_sum_dih444sub = prove_by_refinement(
595   `!x4 x5 x6 e1 e2 e3.
596     &0 < x4 /\ x4 < &16 /\
597     &0 < x5 /\ x5 < &16 /\
598     &0 < x6 /\ x6 < &16 /\
599     &0 < delta_x (&4) (&4) (&4) x4 x5 x6 ==>
600     derived_form T (\q. e1 * dih_x (&4) (&4) (&4) q x5 x6
601                    + e2 * dih_x (&4) (&4) (&4) x5 x6 q 
602                    + e3 * dih_x (&4) (&4) (&4) x6 q x5 - (&1 + const1) * pi) 
603     (( num1 e1 e2 e3 x4 x5 x6 ) / (&2 * x4 * (&16 - x4) * sqrt(delta_x (&4) (&4) (&4) x4 x5 x6))) (x4) (:real)`,
604   (* {{{ proof *)
605   [
606   REPEAT WEAKER_STRIP_TAC;
607   TYPED_ABBREV_TAC `f' = (num1 e1 e2 e3 x4 x5 x6 /  (&2 * x4 * (&16 - x4) * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6)))`;
608   INTRO_TAC (GEN_ALL Calc_derivative.derived_form_sub) [`T`;`T`;`(\q. e1 * dih_x (&4) (&4) (&4) q x5 x6 +          e2 * dih_x (&4) (&4) (&4) x5 x6 q +          e3 * dih_x (&4) (&4) (&4) x6 q x5)`;`\ (q:real). (&1 + const1)*pi`;`f'`;`&0`;`x4`;`(:real)`];
609   ASM_REWRITE_TAC[arith `f' - &0 = f'`;arith `(a + b) - c = a + b - c`];
610   DISCH_THEN MATCH_MP_TAC;
611   EXPAND_TAC "f'";
612   ASM_SIMP_TAC[derived_form_sum_dih444];
613   DERIVED_TAC MP_TAC;
614   BY(REWRITE_TAC[])
615   ]);;
616   (* }}} *)
617
618 let derived_form_tau2D = prove_by_refinement(
619   `!x4 x5 x6 e1 e2 e3.
620     &0 < x4 /\ x4 < &16 /\
621     &0 < x5 /\ x5 < &16 /\
622     &0 < x6 /\ x6 < &16 /\
623     &0 < delta_x (&4) (&4) (&4) x4 x5 x6 /\
624     num1 e1 e2 e3 x4 x5 x6 = &0 ==>
625     derived_form T
626     (\q. ( num1 e1 e2 e3 q x5 x6) / (&2 * q * (&16 - q) * sqrt(delta_x (&4) (&4) (&4) q x5 x6))) 
627     ((&4 * dnum1 e1 e2 e3 x4 x5 x6) / 
628        (&2 * x4 * (&16 - x4) * sqrt(delta_x (&4) (&4) (&4) x4 x5 x6)))
629      (x4) (:real)`,
630   (* {{{ proof *)
631   [
632   REPEAT WEAKER_STRIP_TAC;
633   TYPIFY `    (\q. ( num1 e1 e2 e3 q x5 x6) / (&2 * q * (&16 - q) * sqrt(delta_x (&4) (&4) (&4) q x5 x6))) =     (\q. (\q.  num1 e1 e2 e3 q x5 x6) q   / (\q. &2 * q * (&16 - q) * sqrt(delta_x (&4) (&4) (&4) q x5 x6)) q) ` (C SUBGOAL_THEN SUBST1_TAC);
634     BY(REWRITE_TAC[FUN_EQ_THM]);
635   TYPED_ABBREV_TAC  `(f:real->real) =  (\q. num1 e1 e2 e3 q x5 x6 )` ;
636   TYPED_ABBREV_TAC  `(g:real->real) = (\q. &2 * q * (&16 - q) * sqrt (delta_x (&4) (&4) (&4) q x5 x6))` ;
637   DERIVED_TAC (MP_TAC o GEN_ALL);
638   MP_TAC (diff `(\q. &2 * q * (&16 - q) * sqrt (delta_x (&4) (&4) (&4) q x5 x6))` [Sphere.delta_x] `x4:real` `(:real)`);
639   ASM_REWRITE_TAC[];
640   DISCH_TAC;
641   TYPED_ABBREV_TAC  `(g':real) = (&2 *  (x4 *   ((&16 - x4) *    (&4 * (x4 * -- &1 + -- &4 + &4 + &4 - x4 + x5 + x6) +     &4 * x5 +     &4 * x6 - &4 * &4 - x5 * x6) *    inv (&2 * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6)) +    -- &1 * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6)) +   (&16 - x4) * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6)))` ;
642   DISCH_THEN (C INTRO_TAC [`&4 * dnum1 e1 e2 e3 x4 x5 x6`;`f`;`g'`;`g`;`x4`]);
643   ASM_REWRITE_TAC[];
644   EXPAND_TAC "f";
645   REWRITE_TAC[derived_form_dnum1];
646   EXPAND_TAC "g";
647   ASM_REWRITE_TAC[arith `&0 * x = &0 /\ &0 / x = &0 /\ x - &0 = x`];
648   ONCE_REWRITE_TAC[derived_form_b];
649   TYPIFY `~(&2 * x4 * (&16 - x4) * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6) = &0)` (C SUBGOAL_THEN ASSUME_TAC);
650     REWRITE_TAC[REAL_ENTIRE;DE_MORGAN_THM];
651     TYPIFY_GOAL_THEN `~(sqrt(delta_x (&4) (&4) (&4) x4 x5 x6) = &0)` (unlist REWRITE_TAC);
652       GMATCH_SIMP_TAC SQRT_EQ_0;
653       BY(ASM_TAC THEN REAL_ARITH_TAC);
654     BY(ASM_TAC THEN REAL_ARITH_TAC);
655   ASM_REWRITE_TAC[];
656   TYPED_ABBREV_TAC  `d = (&2 * x4 * (&16 - x4) * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6))` ;
657   MATCH_MP_TAC (TAUT `(x <=> y) ==> (x ==> y)`);
658   REPEAT (AP_THM_TAC ORELSE AP_TERM_TAC);
659   Calc_derivative.CALC_ID_TAC;
660   BY(ASM_REWRITE_TAC[])
661   ]);;
662   (* }}} *)
663
664 let derived_form_taum_d3_exists = prove_by_refinement(
665   `!x4 x5 x6 e1 e2 e3.  ?f'' f'''.
666     &0 < x4 /\ x4 < &16 /\
667     &0 < x5 /\ x5 < &16 /\
668     &0 < x6 /\ x6 < &16 /\
669     &0 < delta_x (&4) (&4) (&4) x4 x5 x6 ==>
670     (!x4. &0 < x4 /\ x4 < &16 /\ &0 < delta_x (&4) (&4) (&4) x4 x5 x6 ==>
671        derived_form T  
672        (\q. ( num1 e1 e2 e3 q x5 x6 ) / (&2 * q * (&16 - q) * sqrt(delta_x (&4) (&4) (&4) q x5 x6))) (f'' x4) (x4) (:real)) /\
673     (derived_form T f'' f''' x4 (:real))`,
674   (* {{{ proof *)
675   [
676
677   REPEAT WEAKER_STRIP_TAC;
678   TYPIFY `\q. (((&4 * dnum1 e1 e2 e3 q x5 x6) *   &2 *   q *   (&16 - q) *   sqrt (delta_x (&4) (&4) (&4) q x5 x6) -   num1 e1 e2 e3 q x5 x6 *   &2 *   (q *    ((&16 - q) *     delta_x4 (&4) (&4) (&4) q x5 x6 *     inv (&2 * sqrt (delta_x (&4) (&4) (&4) q x5 x6)) +     -- &1 * sqrt (delta_x (&4) (&4) (&4) q x5 x6)) +    (&16 - q) * sqrt (delta_x (&4) (&4) (&4) q x5 x6))) /  (&2 * q * (&16 - q) * sqrt (delta_x (&4) (&4) (&4) q x5 x6)) pow 2)` EXISTS_TAC;
679   TYPIFY `(((((&4 * ((&16 - &2 * x4) * e1 + (x5 - &8) * e2 + (x6 - &8) * e3)) *     &2 *     (x4 *      ((&16 - x4) *       delta_x4 (&4) (&4) (&4) x4 x5 x6 *       inv (&2 * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6)) +       -- &1 * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6)) +      (&16 - x4) * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6)) +     (&4 * -- &2 * e1) *     &2 *     x4 *     (&16 - x4) *     sqrt (delta_x (&4) (&4) (&4) x4 x5 x6)) -    (num1 e1 e2 e3 x4 x5 x6 *     &2 *     ((x4 *       (((&16 - x4) *         (delta_x4 (&4) (&4) (&4) x4 x5 x6 *          (&2 *           delta_x4 (&4) (&4) (&4) x4 x5 x6 *           inv (&2 * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6))) *          --inv ((&2 * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6)) pow 2) +          (-- &2 * &4) * inv (&2 * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6))) +         -- &1 *         delta_x4 (&4) (&4) (&4) x4 x5 x6 *         inv (&2 * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6))) +        -- &1 *        delta_x4 (&4) (&4) (&4) x4 x5 x6 *        inv (&2 * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6))) +       (&16 - x4) *       delta_x4 (&4) (&4) (&4) x4 x5 x6 *       inv (&2 * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6)) +       -- &1 * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6)) +      (&16 - x4) *      delta_x4 (&4) (&4) (&4) x4 x5 x6 *      inv (&2 * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6)) +      -- &1 * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6)) +     (&4 * dnum1 e1 e2 e3 x4 x5 x6) *     &2 *     (x4 *      ((&16 - x4) *       delta_x4 (&4) (&4) (&4) x4 x5 x6 *       inv (&2 * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6)) +       -- &1 * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6)) +      (&16 - x4) * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6)))) *   (&2 * x4 * (&16 - x4) * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6)) pow 2 -   ((&4 * ((&16 - &2 * x4) * e1 + (x5 - &8) * e2 + (x6 - &8) * e3)) *    &2 *    x4 *    (&16 - x4) *    sqrt (delta_x (&4) (&4) (&4) x4 x5 x6) -    num1 e1 e2 e3 x4 x5 x6 *    &2 *    (x4 *     ((&16 - x4) *      delta_x4 (&4) (&4) (&4) x4 x5 x6 *      inv (&2 * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6)) +      -- &1 * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6)) +     (&16 - x4) * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6))) *   &2 *   (&2 * x4 * (&16 - x4) * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6)) pow 1 *   &2 *   (x4 *    ((&16 - x4) *     delta_x4 (&4) (&4) (&4) x4 x5 x6 *     inv (&2 * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6)) +     -- &1 * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6)) +    (&16 - x4) * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6))) /  (&2 * x4 * (&16 - x4) * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6)) pow 4)` EXISTS_TAC;
680   REPEAT WEAKER_STRIP_TAC;
681   CONJ_TAC;
682     REPEAT WEAKER_STRIP_TAC;
683     REWRITE_TAC[];
684     DERIVED_TAC (MP_TAC o GEN_ALL);
685     DISCH_THEN (C INTRO_TAC [`(&4 * dnum1 e1 e2 e3 x4' x5 x6)`;`e1`;`e2`;`e3`;`delta_x4 (&4) (&4) (&4) x4' x5 x6`;`x5`;`x6`;`x4'`]);
686     REWRITE_TAC[derived_form_dnum1;derived_form_delta_x_wrt_x4];
687     ONCE_REWRITE_TAC[derived_form_b];
688     ANTS_TAC;
689       GMATCH_SIMP_TAC SQRT_EQ_0;
690       BY(ASM_TAC THEN REAL_ARITH_TAC);
691     BY(REWRITE_TAC[]);
692   REWRITE_TAC[Nonlin_def.dnum1];
693   DERIVED_TAC (MP_TAC o GEN_ALL);
694   DISCH_THEN (C INTRO_TAC [`delta_x4 (&4) (&4) (&4) x4 x5 x6`;`delta_x4 (&4) (&4) (&4) x4 x5 x6`;`-- &2 * &4`;`delta_x4 (&4) (&4) (&4) x4 x5 x6`;`delta_x4 (&4) (&4) (&4) x4 x5 x6`;`(&4 * dnum1 e1 e2 e3 x4 x5 x6)`;`e1`;`e2`;`e3`;`delta_x4 (&4) (&4) (&4) x4 x5 x6`;`x5`;`x6`;`x4`]);
695   REWRITE_TAC[derived_form_dnum1;derived_form_delta_x_wrt_x4;derived_form_delta_x4_wrt_x4];
696   ONCE_REWRITE_TAC[derived_form_b];
697   ANTS_TAC;
698     GMATCH_SIMP_TAC SQRT_EQ_0;
699     BY(ASM_TAC THEN REAL_ARITH_TAC);
700   REWRITE_TAC[];
701   MATCH_MP_TAC (TAUT `(x <=> y) ==> (x ==> y)`);
702   REPEAT (AP_THM_TAC ORELSE AP_TERM_TAC);
703   BY(REWRITE_TAC[Nonlin_def.dnum1])
704   ]);;
705   (* }}} *)
706
707 let delta_y_dim_reduction = prove_by_refinement(
708   `!y1 y2 y3 y4 y5 y6. 
709  (let x6' = &8 * (&1 - (y1 * y1 + y2*y2 - y6*y6)/(&2* y1 * y2)) in
710   let x5' = &8 * (&1 - (y1*y1 + y3*y3 - y5*y5)/(&2 * y1 * y3)) in
711   let x4' = &8 * (&1 - (y2*y2 + y3*y3 - y4*y4)/(&2*y2*y3)) in
712     (~(y1 = &0) /\ ~(y2 = &0) /\ ~(y3 = &0) ==>
713     delta_x (&4) (&4) (&4) x4' x5' x6' = &64 * delta_y y1 y2 y3 y4 y5 y6 / ((y1 * y2 * y3) pow 2)))
714 `,
715   (* {{{ proof *)
716   [
717   REWRITE_TAC[LET_THM];
718   REWRITE_TAC[Sphere.delta_x;Sphere.delta_y];
719   BY(CONV_TAC REAL_FIELD)
720   ]);;
721   (* }}} *)
722
723 let delta_x_xrr = prove_by_refinement(
724   `!y1 y2 y3 y4 y5 y6.
725     (~(y1 = &0) /\ ~(y2 = &0) /\ ~(y3 = &0) ==>
726     delta_x (&4) (&4) (&4) (xrr y2 y3 y4) (xrr y1 y3 y5) (xrr y1 y2 y6) = 
727          &64 * delta_y y1 y2 y3 y4 y5 y6 / ((y1 *y2 * y3) pow 2))`,
728   (* {{{ proof *)
729   [
730   REWRITE_TAC[Appendix.xrr];
731   REPEAT WEAKER_STRIP_TAC;
732   BY(ASM_SIMP_TAC[GSYM (REWRITE_RULE[LET_THM] delta_y_dim_reduction)])
733   ]);;
734   (* }}} *)
735
736 let delta_x4_dim_reduction = prove_by_refinement(
737   `!y1 y2 y3 y4 y5 y6. 
738  (let x6' = &8 * (&1 - (y1 * y1 + y2*y2 - y6*y6)/(&2* y1 * y2)) in
739   let x5' = &8 * (&1 - (y1*y1 + y3*y3 - y5*y5)/(&2 * y1 * y3)) in
740   let x4' = &8 * (&1 - (y2*y2 + y3*y3 - y4*y4)/(&2*y2*y3)) in
741     (~(y1 = &0) /\ ~(y2 = &0) /\ ~(y3 = &0) ==>
742     delta_x4 (&4) (&4) (&4) x4' x5' x6' = &16 * y_of_x delta_x4 y1 y2 y3 y4 y5 y6 / (y1 * y1 * y2 * y3)))
743     `,
744   (* {{{ proof *)
745   [
746   REWRITE_TAC[LET_THM];
747   REWRITE_TAC[Sphere.delta_x4;Sphere.y_of_x];
748   BY(CONV_TAC REAL_FIELD)
749   ]);;
750   (* }}} *)
751
752 let dih_x_dim_reduction = prove_by_refinement(
753   `!y1 y2 y3 y4 y5 y6.
754  (let x6' = &8 * (&1 - (y1 * y1 + y2*y2 - y6*y6)/(&2* y1 * y2)) in
755   let x5' = &8 * (&1 - (y1*y1 + y3*y3 - y5*y5)/(&2 * y1 * y3)) in
756   let x4' = &8 * (&1 - (y2*y2 + y3*y3 - y4*y4)/(&2*y2*y3)) in
757     ((&0 < y1) /\ (&0 < y2) /\ (&0 < y3) /\ &0 < delta_y y1 y2 y3 y4 y5 y6 ==>
758        dih_x (&4) (&4) (&4) x4' x5' x6' = dih_y y1 y2 y3 y4 y5 y6))
759 `,
760   (* {{{ proof *)
761   [
762   REWRITE_TAC[Sphere.dih_x;Sphere.dih_y;LET_THM];
763   REPEAT WEAKER_STRIP_TAC;
764   TYPIFY `~(y1 = &0) /\ ~(y2 = &0) /\ ~(y3 = &0)` (C SUBGOAL_THEN ASSUME_TAC);
765     BY(ASM_TAC THEN REAL_ARITH_TAC);
766   ASM_SIMP_TAC[REWRITE_RULE[LET_THM] delta_x4_dim_reduction;REWRITE_RULE[LET_THM] delta_y_dim_reduction];
767   REWRITE_TAC[GSYM Sphere.y_of_x];
768   TYPIFY `sqrt (&4 * &4 * &64 * delta_y y1 y2 y3 y4 y5 y6 / (y1 * y2 * y3) pow 2) = &16 * sqrt (&4 * (y1 * y1) * y_of_x delta_x y1 y2 y3 y4 y5 y6) / (y1 * y1 * y2 * y3)` (C SUBGOAL_THEN SUBST1_TAC);
769     Calc_derivative.CALC_ID_TAC;
770     ASM_REWRITE_TAC[];
771     TYPIFY `&0 < y1 * y1 * y2 * y3` (C SUBGOAL_THEN ASSUME_TAC);
772       REPEAT (GMATCH_SIMP_TAC REAL_LT_MUL);
773       BY(ASM_TAC THEN REAL_ARITH_TAC);
774     TYPIFY `y1 * y1 * y2 * y3 = sqrt((y1 * y1 * y2 * y3) pow 2)` (C SUBGOAL_THEN SUBST1_TAC);
775       GMATCH_SIMP_TAC POW_2_SQRT;
776       BY(ASM_SIMP_TAC[arith `&0 < x ==> &0 <= x`]);
777     GMATCH_SIMP_TAC (GSYM SQRT_MUL);
778     REWRITE_TAC[ REAL_LE_POW_2];
779     GMATCH_SIMP_TAC (arith `&0 <= d/ y ==> &0 <= &4 * &4 * &64 * d / y`);
780     GMATCH_SIMP_TAC REAL_LE_RDIV_EQ;
781     CONJ_TAC;
782       REPEAT (GMATCH_SIMP_TAC REAL_LT_MUL);
783       REWRITE_TAC[GSYM Trigonometry2.NOT_ZERO_EQ_POW2_LT];
784       REWRITE_TAC[REAL_ENTIRE];
785       BY(ASM_TAC THEN REAL_ARITH_TAC);
786     CONJ_TAC;
787       BY(ASM_TAC THEN REAL_ARITH_TAC);
788     TYPIFY `&16 * sqrt (&4 * (y1 * y1) * y_of_x delta_x y1 y2 y3 y4 y5 y6)  = sqrt (&16 pow 2 * &4 * (y1 * y1) * y_of_x delta_x y1 y2 y3 y4 y5 y6)` (C SUBGOAL_THEN SUBST1_TAC);
789       TYPIFY `&16 = sqrt(&16 pow 2)` (C SUBGOAL_THEN SUBST1_TAC);
790         REWRITE_TAC[POW_2_SQRT_ABS];
791         BY(REAL_ARITH_TAC);
792       GMATCH_SIMP_TAC (GSYM SQRT_MUL);
793       CONJ_TAC;
794         CONJ_TAC;
795           BY(REAL_ARITH_TAC);
796         GMATCH_SIMP_TAC (arith `&0 <= x ==> &0 <= &4 * x`);
797         GMATCH_SIMP_TAC REAL_LE_MUL;
798         REWRITE_TAC[ REAL_LE_SQUARE];
799         REWRITE_TAC[Sphere.y_of_x;Sphere.delta_x;GSYM Sphere.delta_y];
800         BY(ASM_TAC THEN REAL_ARITH_TAC);
801       AP_TERM_TAC;
802       REWRITE_TAC[POW_2_SQRT_ABS];
803       BY(REAL_ARITH_TAC);
804     REWRITE_TAC[arith `s - s' = &0 <=> s = s'`];
805     AP_TERM_TAC;
806     REWRITE_TAC[Sphere.y_of_x;Sphere.delta_x;GSYM Sphere.delta_y];
807     Calc_derivative.CALC_ID_TAC;
808     BY(ASM_REWRITE_TAC[]);
809   TYPED_ABBREV_TAC  `dx = y_of_x delta_x y1 y2 y3 y4 y5 y6` ;
810   TYPED_ABBREV_TAC  `d4 =  y_of_x delta_x4 y1 y2 y3 y4 y5 y6 ` ;
811   TYPED_ABBREV_TAC  `s = sqrt(&4 * (y1 * y1) * dx)` ;
812   REWRITE_TAC[arith `&16 * s / y = (&16 / y) * s`];
813   REWRITE_TAC[arith `-- (a * d4) = a * -- d4`];
814   GMATCH_SIMP_TAC Trigonometry1.ATN2_LMUL_EQ;
815   GMATCH_SIMP_TAC REAL_LT_DIV;
816   REPEAT (GMATCH_SIMP_TAC REAL_LT_MUL);
817   BY(ASM_TAC THEN REAL_ARITH_TAC)
818   ]);;
819   (* }}} *)
820
821 let KPIDBQH = dih_x_dim_reduction;;
822
823 let derived_form_xrr = prove_by_refinement(
824   `!y1 y2 y6. 
825     derived_form (&0 < y1 /\ &0 < y2)
826      (\q. xrr y1 y2 q) ((&8 * y6) / (y1 * y2)) y6 (:real)`,
827   (* {{{ proof *)
828   [
829   REPEAT WEAKER_STRIP_TAC;
830   ASM_CASES_TAC `~(&0 < y1 /\ &0 < y2)`;
831     BY(ASM_REWRITE_TAC[Pent_hex.derived_form_F]);
832   RULE_ASSUM_TAC (REWRITE_RULE[]);
833   ASM_REWRITE_TAC[Appendix.xrr];
834   DERIVED_TAC MP_TAC;
835   TYPIFY `~(y1 = &0) /\ ~(y2 = &0) /\ ~(&2 = &0)` (C SUBGOAL_THEN ASSUME_TAC);
836     BY(ASM_TAC THEN REAL_ARITH_TAC);
837   ASM_REWRITE_TAC[];
838   MATCH_MP_TAC (TAUT `(x <=> y) ==> (x ==> y)`);
839   REPEAT (AP_THM_TAC ORELSE AP_TERM_TAC);
840   Calc_derivative.CALC_ID_TAC;
841   BY(ASM_REWRITE_TAC[])
842   ]);;
843   (* }}} *)
844
845 let derived_form_xrr_wrt_y1 = prove_by_refinement(
846   `!y1 y2 y6. 
847     derived_form (&0 < y1 /\ &0 < y2)
848      (\q. xrr q y2 y6) ( -- &4 * ((y1*y1 + y6*y6 - y2*y2)/ (y1 pow 2 * y2))) y1 (:real)`,
849   (* {{{ proof *)
850   [
851   REPEAT WEAKER_STRIP_TAC;
852   ASM_CASES_TAC `~(&0 < y1 /\ &0 < y2)`;
853     BY(ASM_REWRITE_TAC[Pent_hex.derived_form_F]);
854   RULE_ASSUM_TAC (REWRITE_RULE[]);
855   ASM_REWRITE_TAC[Appendix.xrr];
856   DERIVED_TAC MP_TAC;
857   TYPIFY `~(y1 = &0) /\ ~(y2 = &0) /\ ~(&2 = &0)` (C SUBGOAL_THEN ASSUME_TAC);
858     BY(ASM_TAC THEN REAL_ARITH_TAC);
859   ASM_REWRITE_TAC[];
860   MATCH_MP_TAC (TAUT `(x <=> y) ==> (x ==> y)`);
861   REPEAT (AP_THM_TAC ORELSE AP_TERM_TAC);
862   Calc_derivative.CALC_ID_TAC;
863   (ASM_REWRITE_TAC[])
864   ]);;
865   (* }}} *)
866
867 let derived_form_xrr_D2 = prove_by_refinement(
868   `!y1 y2 y6.
869     derived_form (&0 < y1 /\  &0 < y2)
870      (\q. (&8* q) / (y1 *y2)) (&8 / (y1 * y2)) y6 (:real)`,
871   (* {{{ proof *)
872   [
873   REPEAT WEAKER_STRIP_TAC;
874   ASM_CASES_TAC `~(&0 < y1 /\ &0 < y2)`;
875     BY(ASM_REWRITE_TAC[Pent_hex.derived_form_F]);
876   RULE_ASSUM_TAC (REWRITE_RULE[]);
877   ASM_REWRITE_TAC[];
878   DERIVED_TAC MP_TAC;
879   ONCE_REWRITE_TAC[derived_form_b];
880   ANTS_TAC;
881     BY(ASM_TAC THEN REAL_ARITH_TAC);
882   ASM_REWRITE_TAC[];
883   MATCH_MP_TAC (TAUT `(x <=> y) ==> (x ==> y)`);
884   REPEAT (AP_THM_TAC ORELSE AP_TERM_TAC);
885   Calc_derivative.CALC_ID_TAC;
886   BY(ASM_TAC THEN REAL_ARITH_TAC)
887   ]);;
888   (* }}} *)
889
890 let derived_form_xrr_D3 = prove_by_refinement(
891   `!y1 y2 y6.
892     derived_form (&0 < y1 /\  &0 < y2)
893      (\q. (&8) / (y1 *y2)) (&0) y6 (:real)`,
894   (* {{{ proof *)
895   [
896   REPEAT WEAKER_STRIP_TAC;
897   ASM_CASES_TAC `~(&0 < y1 /\ &0 < y2)`;
898     BY(ASM_REWRITE_TAC[Pent_hex.derived_form_F]);
899   RULE_ASSUM_TAC (REWRITE_RULE[]);
900   ASM_REWRITE_TAC[];
901   DERIVED_TAC MP_TAC;
902   BY(REWRITE_TAC[])
903   ]);;
904   (* }}} *)
905
906 let DRNDRDV = derived_form_xrr;;
907
908 let derived_form_unique = prove_by_refinement(
909   `!f f' f'' x.
910     derived_form T f f' x (:real) /\ derived_form T f f'' x (:real) ==>
911     (f' = f'')`,
912   (* {{{ proof *)
913   [
914   REWRITE_TAC[Calc_derivative.derived_form;WITHINREAL_UNIV];
915   BY(MESON_TAC[REAL_DERIVATIVE_UNIQUE_ATREAL])
916   ]);;
917   (* }}} *)
918
919 let derived_form_chain = prove_by_refinement(
920   `!f f' g g' x y. 
921     f x = y /\
922   derived_form T f f' x (:real) /\
923   derived_form T g g' y (:real) ==>
924   derived_form T (g o f) (g' * f') x (:real) 
925 `,
926   (* {{{ proof *)
927   [
928   REPEAT GEN_TAC;
929   TYPIFY `g o f = \q. g(f(q))` (C SUBGOAL_THEN SUBST1_TAC);
930     BY(REWRITE_TAC[FUN_EQ_THM;o_THM]);
931   REPEAT WEAKER_STRIP_TAC;
932   MP_TAC (GEN_ALL (Calc_derivative.differentiate `(\(q:real). (g:real->real) (f q))` `x:real` `(:real)`));
933   DISCH_THEN (C INTRO_TAC [`g`;`f`;`f'`;`g'`;`x`]);
934   ASM_REWRITE_TAC[];
935   BY(REWRITE_TAC[REAL_MUL_AC])
936   ]);;
937   (* }}} *)
938
939 let derived_form_chain_old = prove_by_refinement(
940   `!f f' g g' h' x y. 
941     f x = y /\
942   derived_form T f f' x (:real) /\
943   derived_form T g g' y (:real) /\
944   derived_form T (g o f) h' x (:real) ==>
945     h' = g' * f'
946 `,
947   (* {{{ proof *)
948   [
949   REPEAT GEN_TAC;
950   TYPIFY `g o f = \q. g(f(q))` (C SUBGOAL_THEN SUBST1_TAC);
951     BY(REWRITE_TAC[FUN_EQ_THM;o_THM]);
952   REPEAT WEAKER_STRIP_TAC;
953   MP_TAC (GEN_ALL (Calc_derivative.differentiate `(\(q:real). (g:real->real) (f q))` `x:real` `(:real)`));
954   DISCH_THEN (C INTRO_TAC [`g`;`f`;`f'`;`g'`;`x`]);
955   ASM_REWRITE_TAC[];
956   DISCH_TAC;
957   TYPIFY `h' = f' * g'` (C SUBGOAL_THEN SUBST1_TAC);
958     INTRO_TAC derived_form_unique [`(\q. g (f q))`;`h'`;`f'*g'`;`x`];
959     DISCH_THEN MATCH_MP_TAC;
960     BY(ASM_REWRITE_TAC[]);
961   BY(REAL_ARITH_TAC)
962   ]);;
963   (* }}} *)
964
965 let xrr_sym = prove_by_refinement(
966   `!y1 y2 y6. xrr y1 y2 y6 = xrr y2 y1 y6`,
967   (* {{{ proof *)
968   [
969   REWRITE_TAC[Appendix.xrr];
970   REPEAT WEAKER_STRIP_TAC;
971   REWRITE_TAC[REAL_MUL_AC];
972   BY(REWRITE_TAC[arith `x + y -z = (x + y) -z`;REAL_ADD_AC])
973   ]);;
974   (* }}} *)
975
976 let taum_compose_xrr = prove_by_refinement(
977   `!y1 y2 y3 y4 y5 y6.
978     (let e1 = rho y1 in
979      let e2 = rho y2 in
980      let e3 = rho y3 in
981      let x5 = xrr y1 y3 y5 in
982      let x6 = xrr y1 y2 y6 in
983        (    &0 < y1 /\ &0 < y2 /\ &0 < y3 /\ &0 < delta_y y1 y2 y3 y4 y5 y6 ==>
984          (\q. taum y1 y2 y3 q y5 y6) y4 = 
985            ((\q. e1 * dih_x (&4) (&4) (&4) q x5 x6
986             + e2 * dih_x (&4) (&4) (&4) x5 x6 q 
987             + e3 * dih_x (&4) (&4) (&4) x6 q x5 - (&1 + const1) * pi) o 
988              (\q. xrr y2 y3 q)) y4))`,
989   (* {{{ proof *)
990   [
991   REWRITE_TAC[LET_DEF;LET_END_DEF];
992   REWRITE_TAC[o_THM;Nonlinear_lemma.taum_123];
993   REWRITE_TAC[Sphere.rhazim;Sphere.rhazim2;Sphere.rhazim3;Sphere.node2_y;Sphere.node3_y];
994   REPEAT WEAKER_STRIP_TAC;
995   TYPIFY `dih_x (&4) (&4) (&4) (xrr y1 y3 y5) (xrr y1 y2 y6) (xrr y2 y3 y4) = dih_x (&4) (&4) (&4) (xrr y1 y3 y5)  (xrr y2 y3 y4) (xrr y2 y1 y6)` (C SUBGOAL_THEN SUBST1_TAC);
996     BY(MESON_TAC[xrr_sym;Nonlinear_lemma.dih_x_sym]);
997   TYPIFY `dih_x (&4) (&4) (&4) (xrr y1 y2 y6) (xrr y2 y3 y4) (xrr y1 y3 y5)  = dih_x (&4) (&4) (&4) (xrr y1 y2 y6) (xrr y3 y2 y4) (xrr y3 y1 y5)` (C SUBGOAL_THEN SUBST1_TAC);
998     BY(MESON_TAC[xrr_sym]);
999   REWRITE_TAC[Appendix.xrr];
1000   REPEAT (GMATCH_SIMP_TAC (REWRITE_RULE[LET_THM] dih_x_dim_reduction));
1001   ASM_REWRITE_TAC[];
1002   REWRITE_TAC[Nonlinear_lemma.dih_y_sym];
1003   FIRST_X_ASSUM MP_TAC;
1004   BY(REWRITE_TAC[Merge_ineq.delta_y_sym;])
1005   ]);;
1006   (* }}} *)
1007
1008 let real_open_univ = prove_by_refinement(
1009   `real_open (:real)`,
1010   (* {{{ proof *)
1011   [
1012   REWRITE_TAC[real_open;IN_UNIV];
1013   TYPIFY `&1` EXISTS_TAC;
1014   BY(REAL_ARITH_TAC)
1015   ]);;
1016   (* }}} *)
1017
1018 let real_open_empty = prove_by_refinement(
1019   `real_open ({})`,
1020   (* {{{ proof *)
1021   [
1022     BY(REWRITE_TAC[real_open;NOT_IN_EMPTY])
1023   ]);;
1024   (* }}} *)
1025
1026 let real_open_delta_y = prove_by_refinement(
1027   `!y1 y2 y3 y5 y6. real_open {y4 | &0 < y4 /\ &0 < delta_y y1 y2 y3 y4 y5 y6}`,
1028   (* {{{ proof *)
1029   [
1030   REPEAT WEAKER_STRIP_TAC;
1031   INTRO_TAC Pent_hex.continuous_preimage_open [`(\q. delta_y y1 y2 y3 q y5 y6)`; `{y4 | &0 < y4}`;`{y | &0 < y}`];
1032   REWRITE_TAC[IN_ELIM_THM;];
1033   DISCH_THEN MATCH_MP_TAC;
1034   TYPIFY_GOAL_THEN `real_open {u | &0 < u}` (unlist REWRITE_TAC);
1035     BY(REWRITE_TAC[arith `a < b <=> b > a`;REAL_OPEN_HALFSPACE_GT]);
1036   REWRITE_TAC[REAL_CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN;IN_ELIM_THM];
1037   REPEAT WEAKER_STRIP_TAC;
1038   MATCH_MP_TAC REAL_CONTINUOUS_ATREAL_WITHINREAL;
1039   MATCH_MP_TAC HAS_REAL_DERIVATIVE_IMP_CONTINUOUS_ATREAL;
1040   TYPIFY `?f. derived_form T (\q. delta_y y1 y2 y3 q y5 y6) f x (:real)` (C SUBGOAL_THEN MP_TAC);
1041     REWRITE_TAC[Sphere.delta_y;Sphere.delta_x];
1042     TYPIFY `((y1 * y1) *  ((x * x) * --(x + x) +   (x + x) * (--(y1 * y1) + y2 * y2 + y3 * y3 - x * x + y5 * y5 + y6 * y6)) +  (y2 * y2) * (y5 * y5) * (x + x) +  (y3 * y3) * (y6 * y6) * (x + x) -  (y2 * y2) * (y3 * y3) * (x + x) -  (x + x) * (y5 * y5) * y6 * y6)` EXISTS_TAC;
1043     DERIVED_TAC MP_TAC;
1044     BY(REWRITE_TAC[]);
1045   BY(REWRITE_TAC[Calc_derivative.derived_form;WITHINREAL_UNIV])
1046   ]);;
1047   (* }}} *)
1048
1049 let real_open_ups_y = prove_by_refinement(
1050   `!y1 y2. real_open {y6  | &0 < ups_x (y1*y1) (y2*y2) (y6*y6) }`,
1051   (* {{{ proof *)
1052   [
1053   REPEAT WEAKER_STRIP_TAC;
1054   INTRO_TAC Pent_hex.continuous_preimage_open [`(\q. ups_x (y1*y1) (y2*y2) (q*q))`; `(:real)`;`{y | &0 < y}`];
1055   REWRITE_TAC[IN_ELIM_THM;IN_UNIV];
1056   DISCH_THEN MATCH_MP_TAC;
1057   TYPIFY_GOAL_THEN `real_open {u | &0 < u}` (unlist REWRITE_TAC);
1058     BY(REWRITE_TAC[arith `a < b <=> b > a`;REAL_OPEN_HALFSPACE_GT]);
1059   REWRITE_TAC[real_open_univ];
1060   REWRITE_TAC[REAL_CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN;IN_ELIM_THM];
1061   REPEAT WEAKER_STRIP_TAC;
1062   MATCH_MP_TAC REAL_CONTINUOUS_ATREAL_WITHINREAL;
1063   MATCH_MP_TAC HAS_REAL_DERIVATIVE_IMP_CONTINUOUS_ATREAL;
1064   TYPIFY `derived_form T ((\q. ups_x (y1 * y1) (y2 * y2) (q * q))) ((--((x * x) * (x + x) + (x + x) * x * x) +  &2 * (y1 * y1) * (x + x) +  &2 * (y2 * y2) * (x + x))) x (:real)` (C SUBGOAL_THEN MP_TAC);
1065     REWRITE_TAC[Sphere.ups_x];
1066     DERIVED_TAC (MP_TAC);
1067     BY(REWRITE_TAC[]);
1068   (REWRITE_TAC[Calc_derivative.derived_form;WITHINREAL_UNIV]);
1069   BY(MESON_TAC[])
1070   ]);;
1071   (* }}} *)
1072
1073 let derived_form_local = prove_by_refinement(
1074   `!f g g' s x b.
1075     derived_form b g g' x (:real) /\
1076     real_open s /\ x IN s /\
1077     (!y. y IN s ==> f y = g y) ==>
1078     derived_form b f g' x (:real)
1079     `,
1080   (* {{{ proof *)
1081   [
1082   REWRITE_TAC[Calc_derivative.derived_form;WITHINREAL_UNIV];
1083   REPEAT WEAKER_STRIP_TAC;
1084   MATCH_MP_TAC Arc_properties.HAS_REAL_DERIVATIVE_LOCAL;
1085   BY(ASM_MESON_TAC[])
1086   ]);;
1087   (* }}} *)
1088
1089 let xrr_factor = prove_by_refinement(
1090   `!y1 y2 y6.
1091     &0 < y1 /\ &0 < y2 ==> (xrr y1 y2 y6 = &4 * ((y6 + y2 - y1) * (y6 - y2 + y1))/(y1 * y2))`,
1092   (* {{{ proof *)
1093   [
1094   REPEAT WEAKER_STRIP_TAC;
1095   REWRITE_TAC[Appendix.xrr];
1096   Calc_derivative.CALC_ID_TAC;
1097   BY(ASM_TAC THEN REAL_ARITH_TAC)
1098   ]);;
1099   (* }}} *)
1100
1101 let xrr_factor_8 = prove_by_refinement(
1102   `!y1 y2 y6.
1103     &0 < y1 /\ &0 < y2 ==> (&16 - xrr y1 y2 y6 = &4* ((y6 + y2 + y1) * ( y2 + y1- y6))/(y1 * y2))`,
1104   (* {{{ proof *)
1105   [
1106   REPEAT WEAKER_STRIP_TAC;
1107   REWRITE_TAC[Appendix.xrr];
1108   Calc_derivative.CALC_ID_TAC;
1109   BY(ASM_TAC THEN REAL_ARITH_TAC)
1110    ]);;
1111   (* }}} *)
1112
1113 let xrr_pos = prove_by_refinement(
1114   `!y1 y2 y6.
1115     &0 < y1 /\ &0 < y2 /\ y1 < y2 + y6 /\ y2 < y1 + y6 ==> &0 < xrr y1 y2 y6`,
1116   (* {{{ proof *)
1117   [
1118   REPEAT WEAKER_STRIP_TAC;
1119   REWRITE_TAC[Appendix.xrr];
1120   MATCH_MP_TAC (arith `&0 < x ==> &0 < &8 * x`);
1121   TYPIFY `&1 - (y1 * y1 + y2 * y2 - y6 * y6) / (&2 * y1 * y2) = ((y6 + y2 - y1) * (y6 - y2 + y1))/(&2 * y1 * y2)` (C SUBGOAL_THEN SUBST1_TAC);
1122     Calc_derivative.CALC_ID_TAC;
1123     BY(ASM_TAC THEN REAL_ARITH_TAC);
1124   GMATCH_SIMP_TAC REAL_LT_RDIV_EQ;
1125   REWRITE_TAC[arith `&0 * x = &0`];
1126   GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
1127   REPEAT (GMATCH_SIMP_TAC REAL_LT_MUL_EQ);
1128   BY(ASM_TAC THEN REAL_ARITH_TAC)
1129   ]);;
1130   (* }}} *)
1131
1132 let xrr_lt_16 = prove_by_refinement(
1133   `!y1 y2 y6. &0 < y1 /\ &0 < y2 /\ y6 < y1 + y2 /\ &0 < y6 ==> xrr y1 y2 y6 < &16`,
1134   (* {{{ proof *)
1135   [
1136   REPEAT WEAKER_STRIP_TAC;
1137   REWRITE_TAC[Appendix.xrr];
1138   MATCH_MP_TAC (arith `&0 < &1 + u ==> &8 * (&1 - u) < &16`);
1139   TYPIFY `&1 + (y1 * y1 + y2 * y2 - y6 * y6) / (&2 * y1 * y2) = ((y6 + y2 + y1) * ( y2 + y1- y6))/(&2 * y1 * y2)` (C SUBGOAL_THEN SUBST1_TAC);
1140     Calc_derivative.CALC_ID_TAC;
1141     BY(ASM_TAC THEN REAL_ARITH_TAC);
1142   GMATCH_SIMP_TAC REAL_LT_RDIV_EQ;
1143   REWRITE_TAC[arith `&0 * x = &0`];
1144   REPEAT (GMATCH_SIMP_TAC REAL_LT_MUL_EQ);
1145   BY(ASM_TAC THEN REAL_ARITH_TAC)
1146   ]);;
1147   (* }}} *)
1148
1149 let ups_x_triangle_ineq = prove_by_refinement(
1150   `!y1 y2 y6. &0 < y1 /\ &0 < y2 /\ &0 < y6 ==> (&0 < ups_x (y1*y1) (y2*y2) (y6*y6) <=>
1151      (y1 < y2 + y6 /\ y2 < y1 + y6 /\ y6 < y1 + y2))`,
1152   (* {{{ proof *)
1153   [
1154   REPEAT WEAKER_STRIP_TAC;
1155   TYPIFY `ups_x (y1*y1) (y2*y2) (y6*y6) =  (y1 - y2 + y6) * (y1 + y2 - y6) * (-- y1 + y2 + y6) * (y1 + y2 + y6) ` (C SUBGOAL_THEN SUBST1_TAC);
1156     REWRITE_TAC[Sphere.ups_x];
1157     BY(REAL_ARITH_TAC);
1158   REPEAT WEAKER_STRIP_TAC;
1159   REWRITE_TAC[REAL_MUL_POS_LT;arith `x * y < &0 <=> &0 < (--x ) * y`];
1160   ASM_CASES_TAC `y2 < y1 + y6`;
1161     BY(ASM_TAC THEN REAL_ARITH_TAC);
1162   BY(ASM_TAC THEN REAL_ARITH_TAC)
1163   ]);;
1164   (* }}} *)
1165
1166 let xrr_bounds = prove_by_refinement(
1167   `!y1 y2 y6. &0 < y1 /\ &0 < y2 /\ &0 < y6 /\ &0 < ups_x (y1*y1) (y2*y2) (y6*y6) ==>
1168     (&0 < xrr y1 y2 y6 /\ xrr y1 y2 y6 < &16)`,
1169   (* {{{ proof *)
1170   [
1171   REPEAT WEAKER_STRIP_TAC;
1172   INTRO_TAC ups_x_triangle_ineq [`y1`;`y2`;`y6`];
1173   ANTS_TAC;
1174     BY(ASM_REWRITE_TAC[]);
1175   DISCH_THEN (RULE_ASSUM_TAC o (unlist REWRITE_RULE));
1176   CONJ_TAC;
1177     MATCH_MP_TAC xrr_pos;
1178     BY(ASM_REWRITE_TAC[]);
1179   MATCH_MP_TAC xrr_lt_16;
1180   BY(ASM_REWRITE_TAC[])
1181   ]);;
1182   (* }}} *)
1183
1184 let xrr_bounds_2 = prove_by_refinement(
1185   `!y1 y2 y6. &0 < y1 /\ &0 < y2 /\ &0 < y6 ==> (&0 < ups_x (y1*y1) (y2*y2) (y6*y6) <=>
1186     &0 < xrr y1 y2 y6 /\ xrr y1 y2 y6 < &16)`,
1187   (* {{{ proof *)
1188   [
1189   REPEAT WEAKER_STRIP_TAC;
1190   REWRITE_TAC[ (TAUT `(a <=>b) <=> ((a ==> b) /\ (b ==> a) )`)];
1191   CONJ_TAC;
1192     BY(ASM_MESON_TAC[xrr_bounds]);
1193   ASM_SIMP_TAC[ups_x_triangle_ineq];
1194   ONCE_REWRITE_TAC[arith `x < &16 <=> &0 < &16- x`];
1195   ASM_SIMP_TAC[xrr_factor_8];
1196   ASM_SIMP_TAC[xrr_factor];
1197   ONCE_REWRITE_TAC[arith `&0 < &4 * x <=> &0 < x`];
1198   REPEAT (GMATCH_SIMP_TAC Trigonometry2.REAL_LT_DIV_0);
1199   TYPIFY_GOAL_THEN `&0 < y1 * y2` (unlist REWRITE_TAC);
1200     GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
1201     BY(ASM_REWRITE_TAC[]);
1202   REWRITE_TAC[REAL_MUL_POS_LT];
1203   BY(ASM_TAC THEN REAL_ARITH_TAC)
1204   ]);;
1205   (* }}} *)
1206
1207 let xrr_le_16 = prove_by_refinement(
1208   `!y1 y2 y6. &0 < y1 /\ &0 < y2 /\ &0 < y6 /\ &0 < ups_x (y1*y1) (y2*y2) (y6*y6) ==>
1209     xrr y1 y2 y6 <= &16`,
1210   (* {{{ proof *)
1211   [
1212   REPEAT WEAKER_STRIP_TAC;
1213   MATCH_MP_TAC (arith `x < y ==> x <= y`);
1214   BY(ASM_MESON_TAC[xrr_bounds_2])
1215   ]);;
1216   (* }}} *)
1217
1218 let arclength_xrr = prove_by_refinement(
1219   `!y1 y2 y6. &0 < y1 /\ &0 < y2 /\ &0 < y6 /\ &0 < ups_x (y1*y1) (y2*y2) (y6*y6) ==>
1220     arclength y1 y2 y6 = acs(&1 - xrr y1 y2 y6 / &8)`,
1221   (* {{{ proof *)
1222   [
1223   REPEAT WEAKER_STRIP_TAC;
1224   INTRO_TAC ups_x_triangle_ineq [`y1`;`y2`;`y6`];
1225   ANTS_TAC;
1226     BY(ASM_REWRITE_TAC[]);
1227   DISCH_THEN (RULE_ASSUM_TAC o (unlist REWRITE_RULE));
1228   REWRITE_TAC[Appendix.xrr];
1229   GMATCH_SIMP_TAC Trigonometry.PQQDENV;
1230   ASM_SIMP_TAC[arith `a < b ==> a <= b`];
1231   CONJ_TAC;
1232     BY(ASM_TAC THEN REAL_ARITH_TAC);
1233   AP_TERM_TAC;
1234   Calc_derivative.CALC_ID_TAC;
1235   BY(ASM_TAC THEN REAL_ARITH_TAC)
1236   ]);;
1237   (* }}} *)
1238
1239 let TBRMXRZ1 = prove_by_refinement(
1240 `!f f' g g' h' x y.
1241   derived_form T f f' x (:real) /\
1242   derived_form T g g' y (:real) /\
1243   derived_form T (g o f) h' x (:real) /\
1244   &0 < f' /\
1245   f x = y ==> re_eqvl h' g'`,
1246   (* {{{ proof *)
1247   [
1248   REPEAT WEAKER_STRIP_TAC;
1249   INTRO_TAC derived_form_chain_old [`f`;`f'`;`g`;`g'`;`h'`;`x`;`y`];
1250   ASM_REWRITE_TAC[];
1251   DISCH_THEN SUBST1_TAC;
1252   REWRITE_TAC[Trigonometry2.re_eqvl];
1253   EXISTS_TAC `f':real`;
1254   ASM_REWRITE_TAC[];
1255   BY(REAL_ARITH_TAC)
1256   ]);;
1257   (* }}} *)
1258
1259 let TBRMXRZ2 = prove_by_refinement(
1260 `!P Q f f' f'' g g' g'' h' h'' x y.
1261      (P x) /\ (Q (f x)) /\ (y = f x) /\ &0 < f' x /\ h' x = &0 /\
1262     real_open {x | P x /\ Q (f x) } /\
1263   (!x. derived_form (P x) f (f' x) x (:real)) /\
1264   (!y. derived_form (Q( y)) g (g' y) y (:real)) /\
1265   (!x. derived_form (P x /\ Q (f x)) (g o f) (h' x) x (:real)) /\
1266      derived_form T f' f'' x (:real) /\
1267      derived_form T g' g'' y (:real) /\
1268      derived_form T h' h'' x (:real) ==>
1269      re_eqvl h'' g''`,
1270   (* {{{ proof *)
1271   [
1272   REPEAT WEAKER_STRIP_TAC;
1273   TYPIFY `!x. P x /\ Q (f x) ==> h' x = g' (f x) * f' x` (C SUBGOAL_THEN ASSUME_TAC);
1274     REPEAT WEAKER_STRIP_TAC;
1275     INTRO_TAC derived_form_chain_old [`f`;`f' x'`;`g`;`g' (f x')`;`h' x'`;`x'`;`f x'`];
1276     DISCH_THEN MATCH_MP_TAC;
1277     ASM_REWRITE_TAC[];
1278     RULE_ASSUM_TAC(ONCE_REWRITE_RULE[derived_form_b]);
1279     BY(ASM_SIMP_TAC[]);
1280   TYPIFY `derived_form T (\q. g' (f q) * f' q) h'' x (:real)` (C SUBGOAL_THEN ASSUME_TAC);
1281     REWRITE_TAC[Calc_derivative.derived_form;WITHINREAL_UNIV];
1282     MATCH_MP_TAC Arc_properties.HAS_REAL_DERIVATIVE_LOCAL;
1283     TYPIFY `h'` EXISTS_TAC;
1284     CONJ_TAC;
1285       FIRST_X_ASSUM_ST `derived_form` MP_TAC;
1286       BY(REWRITE_TAC[Calc_derivative.derived_form;WITHINREAL_UNIV]);
1287     TYPIFY `{ x | P x /\ Q (f x)}` EXISTS_TAC;
1288     ASM_REWRITE_TAC[IN_ELIM_THM];
1289     BY(FIRST_X_ASSUM MP_TAC THEN MESON_TAC[]);
1290   MP_TAC (GEN_ALL (Calc_derivative.differentiate `(\(q:real). (g':real->real) (f q) * f' q)` `x:real` `(:real)`));
1291   DISCH_THEN (C INTRO_TAC [`g'`;`f`;`f''`;`f' x`;`g''`;`f'`;`x`]);
1292   ASM_REWRITE_TAC[];
1293   TYPIFY_GOAL_THEN `(derived_form T g' g'' (f x) (:real) /\ derived_form T f (f' x) x (:real))` (unlist REWRITE_TAC);
1294     CONJ_TAC;
1295       BY(ASM_MESON_TAC[]);
1296     RULE_ASSUM_TAC (ONCE_REWRITE_RULE[derived_form_b]);
1297     FIRST_X_ASSUM MATCH_MP_TAC;
1298     BY(ASM_REWRITE_TAC[]);
1299   DISCH_TAC;
1300   INTRO_TAC derived_form_unique [`(\q. g' (f q) * f' q)`;`h''`;`(g' (f x) * f'' + (f' x * g'') * f' x)`;`x`];
1301   ASM_REWRITE_TAC[];
1302   DISCH_THEN SUBST1_TAC;
1303   INTRO_TAC TBRMXRZ1 [`f`;`f' x`;`g`;`g' y`;`h' x`;`x`;`y`];
1304   ANTS_TAC;
1305     RULE_ASSUM_TAC (ONCE_REWRITE_RULE[derived_form_b]);
1306     BY(ASM_MESON_TAC[]);
1307   DISCH_TAC;
1308   RULE_ASSUM_TAC(ONCE_REWRITE_RULE[Leaf_cell.RE_EQVL_SYM]);
1309   FIRST_X_ASSUM MP_TAC;
1310   ASM_REWRITE_TAC[Trigonometry2.re_eqvl];
1311   REPEAT WEAKER_STRIP_TAC;
1312   ASM_REWRITE_TAC[];
1313   TYPIFY `f' x * f' x` EXISTS_TAC;
1314   GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
1315   ASM_REWRITE_TAC[];
1316   BY(REAL_ARITH_TAC)
1317   ]);;
1318   (* }}} *)
1319
1320 let SECOND_CHAIN_GENERAL = prove_by_refinement(
1321 `!P Q f f' f'' g g' g'' x y.
1322      (P x) /\ (Q (f x)) /\ (f x = y) /\ 
1323     real_open {x | P x /\ Q (f x) } /\
1324   (!x. derived_form (P x) f (f' x) x (:real)) /\
1325   (!y. derived_form (Q( y)) g (g' y) y (:real)) /\
1326      derived_form T f' f'' x (:real) /\
1327      derived_form T g' g'' y (:real) ==>
1328     derived_form T (\q. g' (f q) * f' q)  (g' y * f'' + g'' * f' x pow 2 ) x (:real)`,
1329   (* {{{ proof *)
1330   [
1331   REPEAT WEAKER_STRIP_TAC;
1332   MP_TAC (GEN_ALL (Calc_derivative.differentiate `(\(q:real). (g':real->real) (f q) * f' q)` `x:real` `(:real)`));
1333   DISCH_THEN (C INTRO_TAC [`g'`;`f`;`f''`;`f' x`;`g''`;`f'`;`x`]);
1334   ASM_REWRITE_TAC[];
1335   ONCE_REWRITE_TAC[derived_form_b];
1336   ANTS_TAC;
1337     RULE_ASSUM_TAC (ONCE_REWRITE_RULE[derived_form_b]);
1338     BY(ASM_MESON_TAC[]);
1339   ASM_REWRITE_TAC[];
1340   MATCH_MP_TAC (TAUT `(x <=> y) ==> (x ==> y)`);
1341   REPEAT (AP_THM_TAC ORELSE AP_TERM_TAC);
1342   BY(REAL_ARITH_TAC)
1343   ]);;
1344   (* }}} *)
1345
1346 let SECOND_CHAIN_CRITICAL = prove_by_refinement(
1347 `!P Q f f' f'' g g' g'' x y.
1348      (P x) /\ (Q (f x)) /\ (f x = y) /\ g' y = &0 /\
1349     real_open {x | P x /\ Q (f x) } /\
1350   (!x. derived_form (P x) f (f' x) x (:real)) /\
1351   (!y. derived_form (Q( y)) g (g' y) y (:real)) /\
1352      derived_form T f' f'' x (:real) /\
1353      derived_form T g' g'' y (:real) ==>
1354     derived_form T (\q. g' (f q) * f' q)  (g'' * (f' x) pow 2) x (:real)`,
1355   (* {{{ proof *)
1356   [
1357   REPEAT WEAKER_STRIP_TAC;
1358   MP_TAC (GEN_ALL (Calc_derivative.differentiate `(\(q:real). (g':real->real) (f q) * f' q)` `x:real` `(:real)`));
1359   DISCH_THEN (C INTRO_TAC [`g'`;`f`;`f''`;`f' x`;`g''`;`f'`;`x`]);
1360   ASM_REWRITE_TAC[];
1361   ONCE_REWRITE_TAC[derived_form_b];
1362   ANTS_TAC;
1363     RULE_ASSUM_TAC (ONCE_REWRITE_RULE[derived_form_b]);
1364     BY(ASM_MESON_TAC[]);
1365   ASM_REWRITE_TAC[];
1366   MATCH_MP_TAC (TAUT `(x <=> y) ==> (x ==> y)`);
1367   REPEAT (AP_THM_TAC ORELSE AP_TERM_TAC);
1368   BY(REAL_ARITH_TAC)
1369   ]);;
1370   (* }}} *)
1371
1372 let THIRD_CHAIN_GENERAL = prove_by_refinement(
1373 `!P Q f f' f'' f''' g g' g'' g''' x y.
1374      (P x) /\ (Q (f x)) /\ (f x = y) /\ 
1375     real_open {x | P x /\ Q (f x) } /\
1376   (!x. derived_form (P x) f (f' x) x (:real)) /\
1377   (!y. derived_form (Q( y)) g (g' y) y (:real)) /\
1378   (!x. derived_form (P x) f' (f'' x) x (:real)) /\
1379   (!y. derived_form (Q y) g' (g'' y) y (:real)) /\
1380   derived_form (P x) f'' f''' x (:real) /\
1381   derived_form (Q y) g'' g''' y (:real) 
1382   ==>
1383     (?h'''. derived_form T (\ (q:real). (g' (f q) * f'' q + g'' (f q) * f' q pow 2 )) h''' x (:real))`,
1384   (* {{{ proof *)
1385   [
1386   REPEAT WEAKER_STRIP_TAC;
1387   TYPIFY `(g' y * f''' + (f' x * g'' y) * f'' x) + g'' y * &2 * f' x pow 1 * f'' x + (f' x * g''') * f' x pow 2` EXISTS_TAC;
1388   MP_TAC (GEN_ALL (Calc_derivative.differentiate `(\ (q:real). (g' ((f:real->real) q) * f'' q + g'' (f q) * f' q pow 2 ))` `x:real` `(:real)`));
1389   DISCH_THEN (C INTRO_TAC [`g'`; `f'''`;`f' x`;`g'' y`; `f''`;`g''`;`f`; `f'' x`;`f' x`;`g'''`;`f'`;`x`]);
1390   ASM_REWRITE_TAC[];
1391   ONCE_REWRITE_TAC[derived_form_b];
1392   ANTS_TAC;
1393     RULE_ASSUM_TAC (ONCE_REWRITE_RULE[derived_form_b]);
1394     BY(ASM_MESON_TAC[]);
1395   BY(ASM_REWRITE_TAC[])
1396   ]);;
1397   (* }}} *)
1398
1399 let SECOND_CHAIN_CONTINUOUS = prove_by_refinement(
1400 `!P Q f f' f'' f''' g g' g'' g''' x y.
1401      (P x) /\ (Q (f x)) /\ (f x = y) /\ 
1402     real_open {x | P x /\ Q (f x) } /\
1403   (!x. derived_form (P x) f (f' x) x (:real)) /\
1404   (!y. derived_form (Q( y)) g (g' y) y (:real)) /\
1405   (!x. derived_form (P x) f' (f'' x) x (:real)) /\
1406   (!y. derived_form (Q y) g' (g'' y) y (:real)) /\
1407   derived_form (P x) f'' f''' x (:real) /\
1408   derived_form (Q y) g'' g''' y (:real) 
1409   ==>
1410     (\ (q:real). (g' (f q) * f'' q + g'' (f q) * f' q pow 2 )) real_continuous atreal x`,
1411   (* {{{ proof *)
1412   [
1413   REPEAT WEAKER_STRIP_TAC;
1414   MATCH_MP_TAC HAS_REAL_DERIVATIVE_IMP_CONTINUOUS_ATREAL;
1415   INTRO_TAC THIRD_CHAIN_GENERAL [`P`;`Q`;`f`;`f'`;`f''`;`f'''`;`g`;`g'`;`g''`;`g'''`;`x`;`y`];
1416   ASM_REWRITE_TAC[];
1417   BY(REWRITE_TAC[Calc_derivative.derived_form;WITHINREAL_UNIV])
1418   ]);;
1419   (* }}} *)
1420
1421 let SECOND_DERIVATIVE_TEST_COMPOSE = prove_by_refinement(
1422     `!P Q x y s f f' f'' f''' g g' g'' g'''.
1423       P x /\ Q (f x) /\ (f x = y) /\ &0 < f' x /\
1424       s SUBSET {x | P x /\ Q (f x)} /\
1425       real_open {x | P x /\ Q (f x) } /\
1426     real_open s /\ x IN s /\
1427       (!x'. x' IN s ==> g(f x) <= g(f x') ) /\   
1428   (!x. derived_form (P x) f (f' x) x (:real)) /\
1429   (!x. derived_form (P x) f' (f'' x) x (:real)) /\
1430   derived_form (P x) f'' f''' x (:real) /\
1431   (!y. derived_form (Q( y)) g (g' y) y (:real)) /\
1432   (!y. derived_form (Q y) g' (g'' y) y (:real)) /\
1433   derived_form (Q y) g'' g''' y (:real) ==>
1434       (g' y = &0 /\ &0 <= g'' y)
1435  `,
1436   (* {{{ proof *)
1437   [
1438   REPEAT WEAKER_STRIP_TAC;
1439   INTRO_TAC Pent_hex.SECOND_DERIVATIVE_TEST [`g o f`;`(\q. g' (f q) * f' q)`;`(\ (q:real). (g' (f q) * f'' q + g'' (f q) * f' q pow 2 ))`;`x`;`s`];
1440   ANTS_TAC;
1441     ASM_REWRITE_TAC[];
1442     TYPIFY_GOAL_THEN `(\q. g' (f q) * f'' q + g'' (f q) * f' q pow 2) real_continuous atreal x` (unlist REWRITE_TAC);
1443       MATCH_MP_TAC SECOND_CHAIN_CONTINUOUS;
1444       BY(ASM_MESON_TAC[]);
1445     TYPIFY_GOAL_THEN `(!x'. x' IN s ==> (g o f) x <= (g o f) x')` (unlist REWRITE_TAC);
1446       BY(ASM_MESON_TAC[o_THM]);
1447     CONJ_TAC;
1448       REPEAT WEAKER_STRIP_TAC;
1449       INTRO_TAC derived_form_chain [`f`;`f' x'`;`g`;`g' (f x')`;`x'`;`f x'`];
1450       RULE_ASSUM_TAC (ONCE_REWRITE_RULE[derived_form_b]);
1451       ANTS_TAC;
1452         TYPIFY `P x' /\ Q(f x')` (C SUBGOAL_THEN ASSUME_TAC);
1453           BY(ASM_TAC THEN SET_TAC[]);
1454         BY(ASM_MESON_TAC[]);
1455       BY(REWRITE_TAC[Calc_derivative.derived_form;WITHINREAL_UNIV]);
1456     REPEAT WEAKER_STRIP_TAC;
1457     TYPIFY `P x' /\ Q(f x')` (C SUBGOAL_THEN ASSUME_TAC);
1458       BY(ASM_TAC THEN SET_TAC[]);
1459     INTRO_TAC SECOND_CHAIN_GENERAL [`P`;`Q`;`f`;`f'`;`f'' x'`;`g`;`g'`;`g'' (f x')`;`x'`;`f x'`];
1460     ANTS_TAC;
1461       ASM_REWRITE_TAC[];
1462       RULE_ASSUM_TAC(ONCE_REWRITE_RULE[derived_form_b]);
1463       BY(ASM_MESON_TAC[]);
1464     BY(ASM_REWRITE_TAC[Calc_derivative.derived_form;WITHINREAL_UNIV]);
1465   ASM_REWRITE_TAC[];
1466   REPEAT WEAKER_STRIP_TAC;
1467   SUBCONJ_TAC;
1468     FIRST_X_ASSUM_ST `gf = &0` MP_TAC;
1469     REWRITE_TAC[REAL_ENTIRE];
1470     BY(ASM_SIMP_TAC[arith `&0 < f' ==> ~(f' = &0)`]);
1471   DISCH_TAC;
1472   FIRST_X_ASSUM_ST `&0 <= stuff` MP_TAC;
1473   ASM_REWRITE_TAC[];
1474   ASM_REWRITE_TAC[arith `&0 * x + u = u`];
1475   REPEAT WEAKER_STRIP_TAC;
1476   MATCH_MP_TAC Real_ext.REAL_PROP_NN_RCANCEL;
1477   TYPIFY `f' x pow 2` EXISTS_TAC;
1478   ASM_REWRITE_TAC[];
1479   REWRITE_TAC[arith `x pow 2 = x * x`];
1480   GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
1481   BY(ASM_REWRITE_TAC[])
1482   ]);;
1483   (* }}} *)
1484
1485 let REAL_OPEN_REAL_INTERVAL = prove_by_refinement(
1486   `!a b. real_open(real_interval(a,b))`,
1487   (* {{{ proof *)
1488   [
1489   REWRITE_TAC[real_open;IN_REAL_INTERVAL];
1490   REPEAT WEAKER_STRIP_TAC;
1491   TYPIFY `real_min (x - a) (b - x)` EXISTS_TAC;
1492   REWRITE_TAC[real_min];
1493   COND_CASES_TAC;
1494     BY(ASM_TAC THEN REAL_ARITH_TAC);
1495   BY(ASM_TAC THEN REAL_ARITH_TAC)
1496   ]);;
1497   (* }}} *)
1498
1499 let delta_y_pos_xrr = prove_by_refinement(
1500   `!y1 y2 y3 y4 y5 y6. &0 < y1 /\ &0 < y2 /\ &0 < y3  ==>
1501   (&0 < delta_y y1 y2 y3 y4 y5 y6 <=> 
1502     &0 < delta_x (&4) (&4) (&4) (xrr y2 y3 y4) (xrr y1 y3 y5) (xrr y1 y2 y6)) `,
1503   (* {{{ proof *)
1504   [
1505   REPEAT WEAKER_STRIP_TAC;
1506   GMATCH_SIMP_TAC delta_x_xrr;
1507   ASM_SIMP_TAC[arith `&0 < y ==> ~(y= &0)`];
1508   REWRITE_TAC[arith `&0 < &64 * x <=> &0 < x`];
1509   GMATCH_SIMP_TAC Trigonometry2.REAL_LT_DIV_0;
1510   REWRITE_TAC[GSYM Trigonometry2.NOT_ZERO_EQ_POW2_LT];
1511   REWRITE_TAC[REAL_ENTIRE];
1512   BY(ASM_TAC THEN REAL_ARITH_TAC)
1513   ]);;
1514   (* }}} *)
1515
1516 let xrr_convert = prove_by_refinement(
1517   `!y1 y2 y3 y5 y6. &0 < y1 /\ &0 < y2 /\ &0 < y3 /\ &0 < y5 /\ &0 < y6 /\
1518   &0 < ups_x (y1*y1) (y3*y3) (y5*y5) /\ &0 < ups_x (y1*y1) (y2*y2) (y6*y6) ==> 
1519     { y | &0 < y /\ &0 < xrr y2 y3 y /\ xrr y2 y3 y < &16 /\ 
1520         &0 < delta_x (&4) (&4) (&4) (xrr y2 y3 y) (xrr y1 y3 y5) (xrr y1 y2 y6)} = 
1521       { y | &0 < y /\ &0 < ups_x (y2*y2) (y3*y3) (y*y) /\ &0 < delta_y y1 y2 y3 y y5 y6 }`,
1522   (* {{{ proof *)
1523   [
1524   REPEAT WEAKER_STRIP_TAC;
1525   REWRITE_TAC[FUN_EQ_THM;IN_ELIM_THM];
1526   GEN_TAC;
1527   ASM_CASES_TAC `~(&0<x)`;
1528     BY(ASM_REWRITE_TAC[]);
1529   RULE_ASSUM_TAC (REWRITE_RULE[]);
1530   ASM_REWRITE_TAC[];
1531   GMATCH_SIMP_TAC (GSYM delta_y_pos_xrr);
1532   ASM_REWRITE_TAC[];
1533   ASM_SIMP_TAC[xrr_bounds_2];
1534   BY(MESON_TAC[])
1535   ]);;
1536   (* }}} *)
1537
1538 let SECOND_DERIVATIVE_TEST_TAUM = prove_by_refinement(
1539   `!a b y1 y2 y3 y4 y5 y6.
1540     y4 IN real_interval (a,b) /\
1541     real_interval (a,b) SUBSET 
1542     {y4 | &0 < delta_y y1 y2 y3 y4 y5 y6 /\ &0 < y4 /\ &0 < ups_x (y2*y2) (y3*y3) (y4*y4)} /\
1543     &0 < y1 /\ &0 < y2 /\ &0 < y3 /\ &0 < y5 /\ &0 < y6 /\
1544     &0 < ups_x (y1*y1) (y2*y2) (y6*y6) /\
1545     &0 < ups_x (y1*y1) (y3*y3) (y5*y5) /\
1546     (num1 (rho y1) (rho y2) (rho y3) (xrr y2 y3 y4) (xrr y1 y3 y5) (xrr y1 y2 y6) = &0 ==>
1547         dnum1 (rho y1) (rho y2) (rho y3) (xrr y2 y3 y4) (xrr y1 y3 y5) (xrr y1 y2 y6) < &0) ==>
1548     (?y4'. y4' IN real_interval(a,b) /\ taum y1 y2 y3 y4' y5 y6 < taum y1 y2 y3 y4 y5 y6)`,
1549   (* {{{ proof *)
1550   [
1551   REPEAT WEAKER_STRIP_TAC;
1552   PROOF_BY_CONTR_TAC;
1553   RULE_ASSUM_TAC (REWRITE_RULE[NOT_EXISTS_THM;TAUT `~(a /\ b) <=> (a ==> ~b)`]);
1554   RULE_ASSUM_TAC (REWRITE_RULE[arith `~(x < y) <=> y <= x`]);
1555   COMMENT "set up second derivative";
1556   TYPED_ABBREV_TAC  `x4 = xrr y2 y3 y4` ;
1557   TYPED_ABBREV_TAC  `x5 = xrr y1 y3 y5` ;
1558   TYPED_ABBREV_TAC  `x6 = xrr y1 y2 y6` ;
1559   TYPED_ABBREV_TAC  `e1 = rho y1` ;
1560   TYPED_ABBREV_TAC  `e2 = rho y2` ;
1561   TYPED_ABBREV_TAC  `e3 = rho y3` ;
1562   TYPIFY `&0 < y4 /\ &0 < ups_x (y2 * y2) (y3*y3) (y4*y4) /\ &0 < delta_y y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN ASSUME_TAC);
1563     RULE_ASSUM_TAC(REWRITE_RULE[SUBSET;IN_ELIM_THM]);
1564     BY(ASM_MESON_TAC[]);
1565   TYPIFY `&0 < x5 /\ x5 < &16 /\ &0 < x4 /\ x4 < &16 /\ &0 < x6 /\ x6 < &16` (C SUBGOAL_THEN ASSUME_TAC);
1566     BY(ASM_MESON_TAC[xrr_bounds]);
1567   TYPIFY `&0 < delta_x (&4) (&4) (&4) x4 x5 x6` (C SUBGOAL_THEN ASSUME_TAC);
1568     EXPAND_TAC "x4";
1569     EXPAND_TAC "x5";
1570     EXPAND_TAC "x6";
1571     GMATCH_SIMP_TAC delta_x_xrr;
1572     ASM_SIMP_TAC[arith `&0 < y ==> ~(y = &0)`];
1573     GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
1574     GMATCH_SIMP_TAC REAL_LT_DIV;
1575     ASM_REWRITE_TAC[arith `&0 < &64`];
1576     REWRITE_TAC[GSYM Trigonometry2.NOT_ZERO_EQ_POW2_LT];
1577     REWRITE_TAC[REAL_ENTIRE];
1578     BY(ASM_TAC THEN REAL_ARITH_TAC);
1579   INTRO_TAC derived_form_taum_d3_exists [`x4`;`x5`;`x6`;`e1`;`e2`;`e3`];
1580   DISCH_THEN (X_CHOOSE_TAC `g'':real->real`);
1581   FIRST_X_ASSUM (X_CHOOSE_TAC `g''':real`);
1582   FIRST_X_ASSUM MP_TAC THEN ANTS_TAC;
1583     BY(ASM_REWRITE_TAC[]);
1584   REPEAT WEAKER_STRIP_TAC;
1585   COMMENT "introduce second derivative test";
1586   INTRO_TAC SECOND_DERIVATIVE_TEST_COMPOSE [`\ (y4:real). &0 < y4` ;`\ (x:real). &0 < x /\ x < &16 /\ &0 < delta_x (&4) (&4) (&4) x x5 x6` ;`y4`;`xrr y2 y3 y4`;`real_interval(a,b)`;`(\q. xrr y2 y3 q)`;`\q. (&8 * q) / (y2*y3)`;`\ (q:real). (&8) / (y2 * y3)`;`&0`;`(\q. e1 * dih_x (&4) (&4) (&4) q x5 x6              + e2 * dih_x (&4) (&4) (&4) x5 x6 q             + e3 * dih_x (&4) (&4) (&4) x6 q x5 - (&1 + const1) * pi) `;`(\q. ( num1 e1 e2 e3 q x5 x6) / (&2 * q * (&16 - q) * sqrt(delta_x (&4) (&4) (&4) q x5 x6))) `;`g''`;`g'''`];
1587   ANTS_TAC;
1588     ASM_REWRITE_TAC[];
1589     ASM_SIMP_TAC[ONCE_REWRITE_RULE[derived_form_b] derived_form_xrr_D3];
1590     ASM_SIMP_TAC[ONCE_REWRITE_RULE[derived_form_b] derived_form_xrr_D2];
1591     ASM_SIMP_TAC[ONCE_REWRITE_RULE[derived_form_b] derived_form_xrr];
1592     CONJ_TAC;
1593       GMATCH_SIMP_TAC REAL_LT_DIV;
1594       GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
1595       GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
1596       ASM_REWRITE_TAC[];
1597       BY(REAL_ARITH_TAC);
1598     REWRITE_TAC[REAL_OPEN_REAL_INTERVAL];
1599     SUBCONJ_TAC;
1600       EXPAND_TAC "x5";
1601       EXPAND_TAC "x6";
1602       ASM_SIMP_TAC[xrr_convert];
1603       FIRST_X_ASSUM_ST `SUBSET` MP_TAC;
1604       BY(SET_TAC[]);
1605     DISCH_TAC;
1606     CONJ_TAC;
1607       EXPAND_TAC "x5";
1608       EXPAND_TAC "x6";
1609       ASM_SIMP_TAC[xrr_convert];
1610       TYPIFY `{x | &0 < x /\      &0 < ups_x (y2 * y2) (y3 * y3) (x * x) /\      &0 < delta_y y1 y2 y3 x y5 y6} = {x | &0 < x /\      &0 < delta_y y1 y2 y3 x y5 y6} INTER {x |   &0 < ups_x (y2 * y2) (y3 * y3) (x * x) }` (C SUBGOAL_THEN SUBST1_TAC);
1611         BY(SET_TAC[]);
1612       MATCH_MP_TAC REAL_OPEN_INTER;
1613       REWRITE_TAC[real_open_ups_y];
1614       BY(REWRITE_TAC[real_open_delta_y]);
1615     COMMENT "continue working on ants";
1616     CONJ_TAC;
1617       REPEAT WEAKER_STRIP_TAC;
1618       FIRST_X_ASSUM_ST `taum` (C INTRO_TAC [`x'`]);
1619       ASM_REWRITE_TAC[];
1620       REPEAT (GMATCH_SIMP_TAC (REWRITE_RULE[LET_THM] taum_compose_xrr));
1621       ASM_REWRITE_TAC[o_THM];
1622       BY(ASM_TAC THEN SET_TAC[]);
1623     COMMENT "next ants";
1624     CONJ_TAC;
1625       ONCE_REWRITE_TAC[derived_form_b];
1626       REPEAT WEAKER_STRIP_TAC;
1627       INTRO_TAC derived_form_xrr [`y2`;`y3`;`x`];
1628       BY(ASM_REWRITE_TAC[]);
1629     CONJ_TAC;
1630       ONCE_REWRITE_TAC[derived_form_b];
1631       REPEAT WEAKER_STRIP_TAC;
1632       INTRO_TAC derived_form_xrr_D2 [`y2`;`y3`;`x`];
1633       BY(ASM_REWRITE_TAC[]);
1634     CONJ_TAC;
1635       ONCE_REWRITE_TAC[derived_form_b];
1636       REPEAT WEAKER_STRIP_TAC;
1637       BY(ASM_SIMP_TAC[derived_form_sum_dih444sub]);
1638     COMMENT "last conj of ants";
1639     ONCE_REWRITE_TAC[derived_form_b];
1640     REPEAT WEAKER_STRIP_TAC;
1641     FIRST_X_ASSUM MATCH_MP_TAC;
1642     BY(ASM_REWRITE_TAC[]);
1643   COMMENT "clear denominators";
1644   ASM_REWRITE_TAC[];
1645   REWRITE_TAC[REAL_DIV_EQ_0];
1646   TYPIFY_GOAL_THEN `~(&2 * x4 * (&16 - x4) * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6) = &0)` (unlist REWRITE_TAC);
1647     REWRITE_TAC[REAL_ENTIRE];
1648     GMATCH_SIMP_TAC SQRT_EQ_0;
1649     BY(ASM_TAC THEN REAL_ARITH_TAC);
1650   REPEAT WEAKER_STRIP_TAC;
1651   FIRST_X_ASSUM_ST `dnum1` MP_TAC;
1652   ASM_REWRITE_TAC[];
1653   REWRITE_TAC[arith `~(x < &0) <=> &0 <= x`];
1654   INTRO_TAC derived_form_tau2D [`x4`;`x5`;`x6`;`e1`;`e2`;`e3`];
1655   ASM_REWRITE_TAC[];
1656   DISCH_TAC;
1657   FIRST_X_ASSUM (C INTRO_TAC [`x4`]);
1658   ASM_REWRITE_TAC[];
1659   DISCH_TAC;
1660   INTRO_TAC derived_form_unique [`(\q. num1 e1 e2 e3 q x5 x6 /           (&2 * q * (&16 - q) * sqrt (delta_x (&4) (&4) (&4) q x5 x6)))`;`g'' x4`;`((&4 * dnum1 e1 e2 e3 x4 x5 x6) /       (&2 * x4 * (&16 - x4) * sqrt (delta_x (&4) (&4) (&4) x4 x5 x6)))`;`x4`];
1661   ASM_REWRITE_TAC[];
1662   DISCH_TAC;
1663   FIRST_X_ASSUM_ST `&0 <= g'' x4` MP_TAC;
1664   ASM_REWRITE_TAC[];
1665   GMATCH_SIMP_TAC Trigonometry2.REAL_LE_RDIV_0;
1666   REWRITE_TAC[arith `&0 <= &4 * x <=> &0 <= x`];
1667   GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
1668   GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
1669   GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
1670   GMATCH_SIMP_TAC SQRT_POS_LT;
1671   BY(ASM_TAC THEN REAL_ARITH_TAC)
1672   ]);;
1673   (* }}} *)
1674
1675 let FIRST_DERIV_POS_OPEN_COMPOSE = prove_by_refinement(
1676   `!P Q x y f f' f'' g g' g''.
1677     P x /\ Q (f x) /\ (f x = y) /\
1678     real_open {x | P x /\ Q (f x)} /\
1679   (!x. derived_form (P x) f (f' x) x (:real)) /\
1680   (!x. derived_form (P x) f' (f'' x) x (:real)) /\
1681   (!y. derived_form (Q( y)) g (g' y) y (:real)) /\
1682   (!y. derived_form (Q y) g' (g'' y) y (:real)) 
1683  ==>
1684     real_open { x | (P x /\ Q (f x)) /\  &0 < g' (f x) * f' x }
1685 `,
1686   (* {{{ proof *)
1687   [
1688   REPEAT WEAKER_STRIP_TAC;
1689   INTRO_TAC Pent_hex.continuous_preimage_open [`(\q. g' (f q) * f' q)`; `{x | P x /\ Q(f x)}`;`{y | &0 < y}`];
1690   ASM_REWRITE_TAC[IN_ELIM_THM];
1691   DISCH_THEN MATCH_MP_TAC;
1692   TYPIFY_GOAL_THEN `real_open {u | &0 < u}` (unlist REWRITE_TAC);
1693     BY(REWRITE_TAC[arith `a < b <=> b > a`;REAL_OPEN_HALFSPACE_GT]);
1694   GMATCH_SIMP_TAC REAL_CONTINUOUS_ON_EQ_REAL_CONTINUOUS_AT;
1695   ASM_REWRITE_TAC[IN_ELIM_THM];
1696   REPEAT WEAKER_STRIP_TAC;
1697   MATCH_MP_TAC HAS_REAL_DERIVATIVE_IMP_CONTINUOUS_ATREAL;
1698   INTRO_TAC SECOND_CHAIN_GENERAL [`P`;`Q`;`f`;`f'`;`f'' x'`;`g`;`g'`;`g'' (f x')`;`x'`;`f x'`];
1699   ASM_REWRITE_TAC[];
1700   ANTS_TAC;
1701     RULE_ASSUM_TAC (ONCE_REWRITE_RULE[derived_form_b]);
1702     BY(ASM_MESON_TAC[]);
1703   REWRITE_TAC[Calc_derivative.derived_form;WITHINREAL_UNIV];
1704   BY(MESON_TAC[])
1705   ]);;
1706   (* }}} *)
1707
1708 let real_open_contains_real_interval = prove_by_refinement(
1709   `!x s. x IN s /\ real_open s ==> ?a b. x IN real_interval (a,b) /\ real_interval(a,b) SUBSET s`,
1710   (* {{{ proof *)
1711   [
1712   REWRITE_TAC[real_open];
1713   REPEAT WEAKER_STRIP_TAC;
1714   FIRST_X_ASSUM (C INTRO_TAC [`x`]);
1715   ASM_REWRITE_TAC[];
1716   REPEAT WEAKER_STRIP_TAC;
1717   GEXISTL_TAC [`x - e`;`x + e`];
1718   REWRITE_TAC[IN_REAL_INTERVAL;SUBSET];
1719   CONJ_TAC;
1720     BY(ASM_TAC THEN REAL_ARITH_TAC);
1721   REPEAT WEAKER_STRIP_TAC;
1722   FIRST_X_ASSUM MATCH_MP_TAC;
1723   BY(ASM_TAC THEN REAL_ARITH_TAC)
1724   ]);;
1725   (* }}} *)
1726
1727 let FIRST_DERIVATIVE_TEST_TAUM = prove_by_refinement(
1728   `!y1 y2 y3 y4 y5 y6.
1729     &0 < delta_y y1 y2 y3 y4 y5 y6 /\
1730   &0 < y1 /\
1731   &0 < y2 /\
1732   &0 < y3 /\
1733   &0 < y5 /\
1734   &0 < y6 /\
1735     &0 < y4 /\
1736   &0 < ups_x (y1 * y1) (y2 * y2) (y6 * y6) /\
1737   &0 < ups_x (y1 * y1) (y3 * y3) (y5 * y5) /\
1738   &0 < ups_x (y2 * y2) (y3 * y3) (y4* y4) /\
1739   &0 < num1 (rho y1) (rho y2) (rho y3) (xrr y2 y3 y4) (xrr y1 y3 y5) (xrr y1 y2 y6) ==>
1740     (?a b. y4 IN real_interval (a,b) /\
1741        (!y4' y4''. (y4' IN real_interval(a,b) /\ y4'' IN real_interval(a,b) /\ y4' < y4'' ==>
1742                       taum y1 y2 y3 y4' y5 y6 < taum y1 y2 y3 y4'' y5 y6)))
1743     `,
1744   (* {{{ proof *)
1745   [
1746   REPEAT WEAKER_STRIP_TAC;
1747   REPEAT WEAKER_STRIP_TAC;
1748   PROOF_BY_CONTR_TAC;
1749   RULE_ASSUM_TAC (REWRITE_RULE[NOT_EXISTS_THM;TAUT `!a b. ~(a ==> b) <=> (a /\ ~b)`]);
1750   COMMENT "set up first derivative";
1751   TYPED_ABBREV_TAC  `x4 = xrr y2 y3 y4` ;
1752   TYPED_ABBREV_TAC  `x5 = xrr y1 y3 y5` ;
1753   TYPED_ABBREV_TAC  `x6 = xrr y1 y2 y6` ;
1754   TYPED_ABBREV_TAC  `e1 = rho y1` ;
1755   TYPED_ABBREV_TAC  `e2 = rho y2` ;
1756   TYPED_ABBREV_TAC  `e3 = rho y3` ;
1757   TYPIFY `&0 < x5 /\ x5 < &16 /\ &0 < x4 /\ x4 < &16 /\ &0 < x6 /\ x6 < &16` (C SUBGOAL_THEN ASSUME_TAC);
1758     BY(ASM_MESON_TAC[xrr_bounds]);
1759   TYPIFY `&0 < delta_x (&4) (&4) (&4) x4 x5 x6` (C SUBGOAL_THEN ASSUME_TAC);
1760     EXPAND_TAC "x4";
1761     EXPAND_TAC "x5";
1762     EXPAND_TAC "x6";
1763     GMATCH_SIMP_TAC (GSYM delta_y_pos_xrr);
1764     BY(ASM_REWRITE_TAC[]);
1765   COMMENT "introduce positivity";
1766   INTRO_TAC derived_form_taum_d3_exists [`x4`;`x5`;`x6`;`e1`;`e2`;`e3`];
1767   DISCH_THEN (X_CHOOSE_TAC `g'':real->real`);
1768   FIRST_X_ASSUM (X_CHOOSE_TAC `g''':real`);
1769   FIRST_X_ASSUM MP_TAC THEN ANTS_TAC;
1770     BY(ASM_REWRITE_TAC[]);
1771   REPEAT WEAKER_STRIP_TAC;
1772   INTRO_TAC FIRST_DERIV_POS_OPEN_COMPOSE [`\ (y4:real). &0 < y4` ;`\ (x:real). &0 < x /\ x < &16 /\ &0 < delta_x (&4) (&4) (&4) x x5 x6` ;`y4`;`xrr y2 y3 y4`;`(\q. xrr y2 y3 q)`;`\q. (&8 * q) / (y2*y3)`;`\ (q:real). (&8) / (y2 * y3)`;`(\q. e1 * dih_x (&4) (&4) (&4) q x5 x6                  + e2 * dih_x (&4) (&4) (&4) x5 x6 q             + e3 * dih_x (&4) (&4) (&4) x6 q x5 - (&1 + const1) * pi) `;`(\q. ( num1 e1 e2 e3 q x5 x6) / (&2 * q * (&16 - q) * sqrt(delta_x (&4) (&4) (&4) q x5 x6))) `;`g''`];
1773   REWRITE_TAC[];
1774   DISCH_THEN MP_TAC THEN ANTS_TAC;
1775     ASM_REWRITE_TAC[];
1776     SUBCONJ_TAC;
1777       EXPAND_TAC "x5";
1778       EXPAND_TAC "x6";
1779       ASM_SIMP_TAC[xrr_convert];
1780       TYPIFY `{x | &0 < x /\      &0 < ups_x (y2 * y2) (y3 * y3) (x * x) /\      &0 < delta_y y1 y2 y3 x y5 y6} = {x | &0 < x /\      &0 < delta_y y1 y2 y3 x y5 y6} INTER {x |   &0 < ups_x (y2 * y2) (y3 * y3) (x * x) }` (C SUBGOAL_THEN SUBST1_TAC);
1781         BY(SET_TAC[]);
1782       MATCH_MP_TAC REAL_OPEN_INTER;
1783       REWRITE_TAC[real_open_ups_y];
1784       BY(REWRITE_TAC[real_open_delta_y]);
1785     DISCH_TAC;
1786     ONCE_REWRITE_TAC[derived_form_b];
1787     CONJ_TAC;
1788       REPEAT WEAKER_STRIP_TAC;
1789       BY(ASM_SIMP_TAC[ONCE_REWRITE_RULE[derived_form_b] derived_form_xrr]);
1790     CONJ_TAC;
1791       REPEAT WEAKER_STRIP_TAC;
1792       BY(ASM_SIMP_TAC[ONCE_REWRITE_RULE[derived_form_b] derived_form_xrr_D2]);
1793     CONJ2_TAC;
1794       BY(ASM_REWRITE_TAC[]);
1795     BY(ASM_SIMP_TAC[derived_form_sum_dih444sub]);
1796   DISCH_TAC;
1797   TYPED_ABBREV_TAC  `s = {x | (&0 < x /\            &0 < xrr y2 y3 x /\            xrr y2 y3 x < &16 /\            &0 < delta_x (&4) (&4) (&4) (xrr y2 y3 x) x5 x6) /\           &0 <           num1 e1 e2 e3 (xrr y2 y3 x) x5 x6 /           (&2 *            xrr y2 y3 x *            (&16 - xrr y2 y3 x) *            sqrt (delta_x (&4) (&4) (&4) (xrr y2 y3 x) x5 x6)) *           (&8 * x) / (y2 * y3)}` ;
1798   TYPIFY `y4 IN s` (C SUBGOAL_THEN ASSUME_TAC);
1799     EXPAND_TAC "s";
1800     ASM_REWRITE_TAC[IN_ELIM_THM];
1801     GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
1802     GMATCH_SIMP_TAC REAL_LT_DIV;
1803     ASM_REWRITE_TAC[];
1804     GMATCH_SIMP_TAC REAL_LT_DIV;
1805     GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
1806     REPEAT (GMATCH_SIMP_TAC REAL_LT_MUL_EQ);
1807     GMATCH_SIMP_TAC SQRT_POS_LT;
1808     ASM_REWRITE_TAC[];
1809     BY(REPLICATE_TAC 3 (FIRST_X_ASSUM_ST `x < &16` MP_TAC) THEN REAL_ARITH_TAC);
1810   INTRO_TAC real_open_contains_real_interval [`y4`;`s`];
1811   ASM_REWRITE_TAC[];
1812   REPEAT WEAKER_STRIP_TAC;
1813   FIRST_X_ASSUM (C INTRO_TAC [`a`;`b`]);
1814   ASM_REWRITE_TAC[];
1815   REPEAT WEAKER_STRIP_TAC;
1816   TYPIFY `y4' IN s /\ y4'' IN s` (C SUBGOAL_THEN ASSUME_TAC);
1817     BY(REPLICATE_TAC 10 (FIRST_X_ASSUM MP_TAC) THEN SET_TAC[]);
1818   TYPIFY `real_interval[y4',y4''] SUBSET s` (C SUBGOAL_THEN ASSUME_TAC);
1819     REPEAT (FIRST_X_ASSUM_ST `real_interval:(real#real)->(real->bool)` MP_TAC);
1820     REWRITE_TAC[real_interval;IN_ELIM_THM;SUBSET];
1821     REPLICATE_TAC 2 (FIRST_X_ASSUM MP_TAC);
1822     REPEAT WEAKER_STRIP_TAC;
1823     FIRST_X_ASSUM MATCH_MP_TAC;
1824     BY(REPLICATE_TAC 10 (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
1825   COMMENT "introduce MVT";
1826   TYPED_ABBREV_TAC `f = (\q. xrr y2 y3 q)`;
1827   TYPED_ABBREV_TAC `g = (\q. e1 * dih_x (&4) (&4) (&4) q x5 x6             + e2 * dih_x (&4) (&4) (&4) x5 x6 q             + e3 * dih_x (&4) (&4) (&4) x6 q x5 - (&1 + const1) * pi) `;
1828   INTRO_TAC REAL_MVT_SIMPLE [`g o f`;`(\x. num1 e1 e2 e3 (xrr y2 y3 x) x5 x6 /           (&2 *            xrr y2 y3 x *            (&16 - xrr y2 y3 x) *            sqrt (delta_x (&4) (&4) (&4) (xrr y2 y3 x) x5 x6)) *           (&8 * x) / (y2 * y3))`;`y4'`;`y4''`];
1829   ANTS_TAC;
1830     ASM_REWRITE_TAC[];
1831     REPEAT WEAKER_STRIP_TAC;
1832     MATCH_MP_TAC HAS_REAL_DERIVATIVE_ATREAL_WITHIN;
1833     ONCE_REWRITE_TAC[GSYM WITHINREAL_UNIV];
1834     MP_TAC TRUTH;
1835     PURE_ONCE_REWRITE_TAC[GSYM Calc_derivative.derived_form];
1836     MATCH_MP_TAC derived_form_chain;
1837     TYPIFY `f x` EXISTS_TAC;
1838     REWRITE_TAC[];
1839     CONJ_TAC;
1840       EXPAND_TAC "f";
1841       BY(ASM_SIMP_TAC[ONCE_REWRITE_RULE[derived_form_b] derived_form_xrr]);
1842     EXPAND_TAC "g";
1843     EXPAND_TAC "f";
1844     MATCH_MP_TAC derived_form_sum_dih444sub;
1845     ASM_REWRITE_TAC[];
1846     TYPIFY `x IN s` (C SUBGOAL_THEN MP_TAC);
1847       BY(REPLICATE_TAC 5 (FIRST_X_ASSUM MP_TAC) THEN SET_TAC[]);
1848     EXPAND_TAC "s";
1849     REWRITE_TAC[IN_ELIM_THM];
1850     BY(DISCH_THEN (unlist REWRITE_TAC));
1851   REWRITE_TAC[];
1852   REPEAT WEAKER_STRIP_TAC;
1853   COMMENT "u positive";
1854   TYPED_ABBREV_TAC `u = (num1 e1 e2 e3 (xrr y2 y3 x) x5 x6 /       (&2 *        xrr y2 y3 x *        (&16 - xrr y2 y3 x) *        sqrt (delta_x (&4) (&4) (&4) (xrr y2 y3 x) x5 x6)) *       (&8 * x) / (y2 * y3))`;
1855   TYPIFY `x IN s` (C SUBGOAL_THEN MP_TAC);
1856     (FIRST_X_ASSUM_ST `real_interval:(real#real)->(real->bool)` MP_TAC);
1857     FIRST_X_ASSUM_ST `SUBSET` MP_TAC;
1858     BY(SET_TAC[REAL_INTERVAL_OPEN_SUBSET_CLOSED]);
1859   EXPAND_TAC "s";
1860   REWRITE_TAC[IN_ELIM_THM];
1861   DISCH_TAC;
1862   TYPIFY `&0 < u` (C SUBGOAL_THEN ASSUME_TAC);
1863     EXPAND_TAC "u";
1864     BY(ASM_REWRITE_TAC[]);
1865   REPEAT (GMATCH_SIMP_TAC (REWRITE_RULE[LET_THM] taum_compose_xrr));
1866   ASM_REWRITE_TAC[];
1867   COMMENT "final kill";
1868   TYPIFY_GOAL_THEN ` (g o f) y4' < (g o f) y4''` (unlist REWRITE_TAC);
1869     ONCE_REWRITE_TAC[arith `g' < g'' <=> &0 < g'' - g'`];
1870     ASM_REWRITE_TAC[];
1871     GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
1872     ASM_REWRITE_TAC[];
1873     BY(REPLICATE_TAC 15 (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
1874   TYPIFY `!y. y IN s ==> &0 < delta_y y1 y2 y3 y y5 y6` ENOUGH_TO_SHOW_TAC;
1875     DISCH_THEN (REPEAT o GMATCH_SIMP_TAC);
1876     BY(ASM_REWRITE_TAC[]);
1877   EXPAND_TAC "s";
1878   REWRITE_TAC[IN_ELIM_THM];
1879   REPEAT WEAKER_STRIP_TAC;
1880   GMATCH_SIMP_TAC delta_y_pos_xrr;
1881   BY(ASM_REWRITE_TAC[])
1882   ]);;
1883   (* }}} *)
1884
1885 let const1_pos = prove_by_refinement(
1886   `&0 < const1`,
1887   (* {{{ proof *)
1888   [
1889   REWRITE_TAC[GSYM Nonlinear_lemma.sol0_over_pi_EQ_const1];
1890   GMATCH_SIMP_TAC REAL_LT_DIV;
1891   REWRITE_TAC[PI_POS];
1892   MP_TAC Flyspeck_constants.bounds;
1893   BY(REAL_ARITH_TAC)
1894   ]);;
1895   (* }}} *)
1896
1897 let rho_bounds = prove_by_refinement(
1898   `!y. &2 <= y /\ y <= &2 * h0 ==> &1 <= rho y /\ rho y <= &1 + sol0 / pi`,
1899   (* {{{ proof *)
1900   [
1901   REWRITE_TAC[Nonlinear_lemma.rho_alt;Nonlinear_lemma.sol0_over_pi_EQ_const1];
1902   REPEAT WEAKER_STRIP_TAC;
1903   ASSUME_TAC const1_pos;
1904   REWRITE_TAC[arith `&1 <= &1 + x <=> &0 <= x`;arith `&1 + c* x <= &1 + c <=>  &0 <= c *(&1 - x)`];
1905   GMATCH_SIMP_TAC REAL_LE_MUL;
1906   GMATCH_SIMP_TAC REAL_LE_MUL;
1907   BY(ASM_TAC THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
1908   ]);;
1909   (* }}} *)
1910
1911 let LEMMA_1834976363 = prove_by_refinement(
1912   `main_nonlinear_terminal_v11 ==> (!y1 y2 y3 y4 y5 y6 a b.
1913     &2 <= y1 /\ y1 <= &2 * h0 /\
1914     &2 <= y2 /\ y2 <= &2 * h0 /\
1915     &2 <= y3 /\ y3 <= &2 * h0 /\
1916     (&2 / h0) pow 2 <= xrr y2 y3 y4 /\ xrr y2 y3 y4 <= #15.53 /\
1917     (&2 / h0) pow 2 <= xrr y1 y3 y5 /\ 
1918     (&2 / h0) pow 2 <= xrr y1 y2 y6 /\ 
1919     y4 IN real_interval (a,b) /\
1920     real_interval (a,b) SUBSET 
1921     {y4 | &0 < delta_y y1 y2 y3 y4 y5 y6 /\ &0 < y4 /\ &0 < ups_x (y2*y2) (y3*y3) (y4*y4)} /\
1922     &0 < y5 /\ &0 < y6 /\
1923     &0 < ups_x (y1*y1) (y2*y2) (y6*y6) /\
1924     &0 < ups_x (y1*y1) (y3*y3) (y5*y5) ==>
1925     (?y4'. y4' IN real_interval(a,b) /\ taum y1 y2 y3 y4' y5 y6 < taum y1 y2 y3 y4 y5 y6))`,
1926   (* {{{ proof *)
1927   [
1928   REPEAT WEAKER_STRIP_TAC;
1929   MATCH_MP_TAC SECOND_DERIVATIVE_TEST_TAUM;
1930   ASM_REWRITE_TAC[];
1931   ASM_SIMP_TAC[arith `&2 <= y ==> &0 < y`];
1932   DISCH_TAC;
1933   PROOF_BY_CONTR_TAC;
1934   INTRO_TAC (Terminal.get_main_nonlinear "1834976363") [`rho y1`;`rho y2`;`rho y3`;`xrr y2 y3 y4`;`xrr y1 y3 y5`;`xrr y1 y2 y6`];
1935   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`];
1936   REWRITE_TAC[arith `~(&0 > &0) /\ ~(&0 < &0)`;arith `&4 pow 2 = &16`;rho_bounds];
1937   ASM_SIMP_TAC[rho_bounds];
1938   REPEAT (GMATCH_SIMP_TAC (arith `x < y ==> x <= y`));
1939   BY(ASM_MESON_TAC[arith `&2 <= y ==> &0 < y`;xrr_bounds])
1940   ]);;
1941   (* }}} *)
1942
1943 let xrr_increasing = prove_by_refinement(
1944   `!y1 y2 y6 y6'. &0 < y1 /\ &0 < y2 /\ &0 <= y6 /\ y6 < y6' ==> xrr y1 y2 y6 < xrr y1 y2 y6'`,
1945   (* {{{ proof *)
1946   [
1947   REPEAT WEAKER_STRIP_TAC;
1948   ONCE_REWRITE_TAC[arith `x < y <=> &0 < y - x`];
1949   TYPIFY `xrr y1 y2 y6' - xrr y1 y2 y6 = (&4 / (y1 * y2)) * (y6' * y6' - y6 * y6)` (C SUBGOAL_THEN SUBST1_TAC);
1950     REWRITE_TAC[Appendix.xrr];
1951     Calc_derivative.CALC_ID_TAC;
1952     BY(ASM_TAC THEN REAL_ARITH_TAC);
1953   GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
1954   GMATCH_SIMP_TAC REAL_LT_DIV;
1955   GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
1956   ONCE_REWRITE_TAC[arith `&0 < y - x <=> x < y`];
1957   GMATCH_SIMP_TAC Misc_defs_and_lemmas.ABS_SQUARE;
1958   BY(ASM_TAC THEN REAL_ARITH_TAC)
1959   ]);;
1960   (* }}} *)
1961
1962 let xrr_decreasing = prove_by_refinement(
1963   `!y1 y1' y2 y6. &2 <= y1 /\ &2 <= y1' /\ &2 <= y2 /\ &2 <= y6 /\ y2 <= &2 * h0 /\ y1 <= y1' ==>
1964     xrr y1' y2 y6 <= xrr y1 y2 y6`,
1965   (* {{{ proof *)
1966   [
1967   REPEAT WEAKER_STRIP_TAC;
1968   TYPIFY `y1 = y1'` ASM_CASES_TAC;
1969     BY(ASM_REWRITE_TAC[arith `x <= x`]);
1970   INTRO_TAC REAL_MVT_SIMPLE [`(\q. xrr q y2 y6)`;`\q. ( -- &4 * ((q*q + y6*y6 - y2*y2)/ (q pow 2 * y2)))`;`y1`;`y1'`];
1971   REWRITE_TAC[IN_REAL_INTERVAL];
1972   ANTS_TAC;
1973     CONJ_TAC;
1974       BY(ASM_TAC THEN REAL_ARITH_TAC);
1975     REPEAT WEAKER_STRIP_TAC;
1976     MATCH_MP_TAC HAS_REAL_DERIVATIVE_ATREAL_WITHIN;
1977     INTRO_TAC derived_form_xrr_wrt_y1 [`x`;`y2`;`y6`];
1978     REWRITE_TAC[Calc_derivative.derived_form;WITHINREAL_UNIV];
1979     DISCH_THEN MATCH_MP_TAC;
1980     BY(ASM_TAC THEN REAL_ARITH_TAC);
1981   REPEAT WEAKER_STRIP_TAC;
1982   ONCE_REWRITE_TAC [arith `x <= y <=> &0 <= y - x`];
1983   RULE_ASSUM_TAC(ONCE_REWRITE_RULE[arith `x' - x = (-- &4 * u/v) * z <=> x - x' = &4 * u/ v * z`]);
1984   ASM_REWRITE_TAC[];
1985   GMATCH_SIMP_TAC REAL_LE_MUL;
1986   GMATCH_SIMP_TAC REAL_LE_MUL;
1987   GMATCH_SIMP_TAC REAL_LE_DIV;
1988   GMATCH_SIMP_TAC REAL_LE_MUL;
1989   REWRITE_TAC[ REAL_LE_POW_2];
1990   ENOUGH_TO_SHOW_TAC ` &0 <= x * x + y6 * y6 - y2 * y2`;
1991     BY(ASM_TAC THEN REAL_ARITH_TAC);
1992   MATCH_MP_TAC REAL_LE_TRANS;
1993   TYPIFY `&2 * &2 + &2 * &2 - (&2 * h0) * (&2 * h0)` EXISTS_TAC;
1994   CONJ_TAC;
1995     BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
1996   MATCH_MP_TAC (arith `x <= x' /\ y <= y' /\ z' <= z ==> x + y - z <= x' + y' - z'`);
1997   GMATCH_SIMP_TAC Misc_defs_and_lemmas.ABS_SQUARE_LE;
1998   GMATCH_SIMP_TAC Misc_defs_and_lemmas.ABS_SQUARE_LE;
1999   GMATCH_SIMP_TAC Misc_defs_and_lemmas.ABS_SQUARE_LE;
2000   BY(ASM_TAC THEN REAL_ARITH_TAC)
2001   ]);;
2002   (* }}} *)
2003
2004 let xrr_simple_lower_bound = prove_by_refinement(
2005   `!y1 y2 y6 y6inf. &2 <= y1 /\ y1 <= &2 * h0 /\ &2 <= y2 /\ y2 <= &2 * h0 /\ 
2006     &2 <= y6inf /\ y6inf <= y6 ==> (y6inf/ h0) pow 2 <= xrr y1 y2 y6`,
2007   (* {{{ proof *)
2008   [
2009   REPEAT WEAKER_STRIP_TAC;
2010   MATCH_MP_TAC REAL_LE_TRANS;
2011   TYPIFY `xrr (&2 * h0) y2 y6` EXISTS_TAC;
2012   CONJ2_TAC;
2013     MATCH_MP_TAC xrr_decreasing;
2014     BY(ASM_TAC THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
2015   MATCH_MP_TAC REAL_LE_TRANS;
2016   TYPIFY `xrr (&2 * h0) (&2 * h0) y6` EXISTS_TAC;
2017   CONJ2_TAC;
2018     ONCE_REWRITE_TAC[xrr_sym];
2019     MATCH_MP_TAC xrr_decreasing;
2020     BY(ASM_TAC THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
2021   MATCH_MP_TAC REAL_LE_TRANS;
2022   TYPIFY `xrr (&2 * h0) (&2 * h0) y6inf` EXISTS_TAC;
2023   CONJ2_TAC;
2024     TYPIFY `y6inf = y6` ASM_CASES_TAC;
2025       BY(ASM_REWRITE_TAC[arith `x <= x`]);
2026     MATCH_MP_TAC (arith (`x < y ==> x <= y`));
2027     MATCH_MP_TAC xrr_increasing;
2028     BY(ASM_TAC THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
2029   REWRITE_TAC[Appendix.xrr];
2030   MATCH_MP_TAC (arith `x = y ==> x <= y`);
2031   Calc_derivative.CALC_ID_TAC;
2032   BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
2033   ]);;
2034   (* }}} *)
2035
2036 let xrr_simple_upper_bound = prove_by_refinement(
2037   `!y1 y2 y6 y6sup. &2 <= y1 /\ y1 <= &2 * h0 /\ &2 <= y2 /\ y2 <= &2 * h0 /\ 
2038     &2 <= y6 /\ y6 <= y6sup /\ y6sup < &4 ==> xrr y1 y2 y6 <= y6sup pow 2`,
2039   (* {{{ proof *)
2040   [
2041   REPEAT WEAKER_STRIP_TAC;
2042   MATCH_MP_TAC REAL_LE_TRANS;
2043   TYPIFY `xrr (&2) y2 y6` EXISTS_TAC;
2044   CONJ_TAC;
2045     MATCH_MP_TAC xrr_decreasing;
2046     BY(ASM_TAC THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
2047   MATCH_MP_TAC REAL_LE_TRANS;
2048   TYPIFY `xrr (&2) (&2) y6` EXISTS_TAC;
2049   CONJ_TAC;
2050     ONCE_REWRITE_TAC[xrr_sym];
2051     MATCH_MP_TAC xrr_decreasing;
2052     BY(ASM_TAC THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
2053   MATCH_MP_TAC REAL_LE_TRANS;
2054   TYPIFY `xrr (&2) (&2) y6sup` EXISTS_TAC;
2055   CONJ_TAC;
2056     TYPIFY `y6sup = y6` ASM_CASES_TAC;
2057       BY(ASM_REWRITE_TAC[arith `x <= x`]);
2058     MATCH_MP_TAC (arith (`x < y ==> x <= y`));
2059     MATCH_MP_TAC xrr_increasing;
2060     BY(ASM_TAC THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
2061   REWRITE_TAC[Appendix.xrr];
2062   MATCH_MP_TAC (arith `x = y ==> x <= y`);
2063   Calc_derivative.CALC_ID_TAC;
2064   BY(REAL_ARITH_TAC)
2065   ]);;
2066   (* }}} *)
2067
2068 let NUM1_GENERIC = prove_by_refinement(
2069   ` (!x4inf x4sup x5inf x5sup x6inf x6sup y1 y2 y3 y4 y5 y6.
2070     ineq
2071   [
2072   (&1 , rho y1, &1 + sol0/ pi);
2073   (&1 , rho y2, &1 + sol0/ pi);
2074   (&1 , rho y3, &1 + sol0/ pi);
2075   (x4inf, xrr y2 y3 y4, x4sup);
2076   (x5inf, xrr y1 y3 y5, x5sup);
2077   (x6inf, xrr y1 y2 y6, x6sup)
2078   ]
2079    ((num1 (rho y1) (rho y2) (rho y3) (xrr y2 y3 y4) (xrr y1 y3 y5) (xrr y1 y2 y6) ) > &0) /\
2080     &2 <= y1 /\ y1 <= &2 * h0 /\
2081     &2 <= y2 /\ y2 <= &2 * h0 /\
2082     &2 <= y3 /\ y3 <= &2 * h0 /\
2083     x4inf <= xrr y2 y3 y4 /\ xrr y2 y3 y4 <= x4sup /\
2084     x5inf <= xrr y1 y3 y5 /\ xrr y1 y3 y5 <= x5sup /\
2085     x6inf <= xrr y1 y2 y6 /\ xrr y1 y2 y6 <= x6sup /\
2086     &0 < y4 /\ &0 < y5 /\ &0 < y6 /\
2087     &0 < delta_y y1 y2 y3 y4 y5 y6 /\
2088     &0 < ups_x (y2 * y2) (y3 * y3) (y4* y4) /\
2089     &0 < ups_x (y1*y1) (y2*y2) (y6*y6) /\
2090     &0 < ups_x (y1*y1) (y3*y3) (y5*y5) ==>
2091     (?a b. y4 IN real_interval (a,b) /\
2092        (!y4' y4''. (y4' IN real_interval(a,b) /\ y4'' IN real_interval(a,b) /\ y4' < y4'' ==>
2093                       taum y1 y2 y3 y4' y5 y6 < taum y1 y2 y3 y4'' y5 y6))))`,
2094   (* {{{ proof *)
2095   [
2096   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`];
2097   REPEAT WEAKER_STRIP_TAC;
2098   FIRST_X_ASSUM_ST `num1` MP_TAC;
2099   ANTS_TAC;
2100     ASM_REWRITE_TAC[];
2101     BY(ASM_MESON_TAC[rho_bounds]);
2102   DISCH_TAC;
2103   MATCH_MP_TAC FIRST_DERIVATIVE_TEST_TAUM;
2104   ASM_REWRITE_TAC[];
2105   BY(ASM_SIMP_TAC[arith `n > &0 ==> &0 < n`;arith `&2 <= y ==> &0 < y`])
2106   ]);;
2107   (* }}} *)
2108
2109 let LEMMA_4828966562 = prove_by_refinement(
2110   `main_nonlinear_terminal_v11 ==>
2111   (!y1 y2 y3 y4 y5 y6.
2112     &2 <= y1 /\ y1 <= &2 * h0 /\
2113     &2 <= y2 /\ y2 <= &2 * h0 /\
2114     &2 <= y3 /\ y3 <= &2 * h0 /\
2115     &2 <= y4 /\ y4 <= &2 * h0 /\
2116     &2 <= y5 /\ y5 <= #3.01 /\
2117     (&3 <= y6) /\ 
2118     &0 < delta_y y1 y2 y3 y4 y5 y6 /\
2119 //    &0 < ups_x (y2 * y2) (y3 * y3) (y4* y4) /\
2120 //    &0 < ups_x (y1*y1) (y3*y3) (y5*y5)  /\
2121     &0 < ups_x (y1*y1) (y2*y2) (y6*y6)  ==>
2122     (?a b. y4 IN real_interval (a,b) /\
2123        (!y4' y4''. (y4' IN real_interval(a,b) /\ y4'' IN real_interval(a,b) /\ y4' < y4'' ==>
2124                       taum y1 y2 y3 y4' y5 y6 < taum y1 y2 y3 y4'' y5 y6))))`,
2125   (* {{{ proof *)
2126   [
2127   REPEAT WEAKER_STRIP_TAC;
2128   MATCH_MP_TAC NUM1_GENERIC;
2129   GEXISTL_TAC [ `(&2/h0) pow 2`;`(&2 * h0) pow 2`;`(&2/h0) pow 2 `;`#3.01 pow 2`;`#2.38 pow 2`;`#16.0`];
2130   INTRO_TAC (Terminal.get_main_nonlinear "4828966562") [`xrr y2 y3 y4`;`xrr y1 y3 y5`;`xrr y1 y2 y6`;`rho y1`;`rho y2`;`rho y3`];
2131   DISCH_THEN (unlist REWRITE_TAC);
2132   ASM_REWRITE_TAC[];
2133   TYPIFY `&0 < ups_x (y2 * y2) (y3 * y3) (y4 * y4) /\  &0 < ups_x (y1 * y1) (y3 * y3) (y5 * y5)` (C SUBGOAL_THEN ASSUME_TAC);
2134     REPEAT (GMATCH_SIMP_TAC Ysskqoy.TRI_UPS_X_STRICT_POS);
2135     BY(ASM_TAC THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
2136   ASM_REWRITE_TAC[];
2137   REPEAT (GMATCH_SIMP_TAC xrr_simple_lower_bound);
2138   ASM_REWRITE_TAC[];
2139   REPEAT (GMATCH_SIMP_TAC xrr_simple_upper_bound);
2140   ASM_REWRITE_TAC[arith `#16.0 = &16`];
2141   GMATCH_SIMP_TAC xrr_le_16;
2142   TYPIFY_GOAL_THEN `#2.38 pow 2 <= xrr y1 y2 y6` (unlist REWRITE_TAC);
2143     MATCH_MP_TAC REAL_LE_TRANS;
2144     TYPIFY `(&3 / h0) pow 2` EXISTS_TAC;
2145     CONJ_TAC;
2146       BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
2147     GMATCH_SIMP_TAC xrr_simple_lower_bound;
2148     BY(ASM_TAC THEN REAL_ARITH_TAC);
2149   ASM_REWRITE_TAC[];
2150   BY(ASM_TAC THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
2151   ]);;
2152   (* }}} *)
2153
2154 let LEMMA_6843920790 = prove_by_refinement(
2155   `main_nonlinear_terminal_v11 ==>
2156   (!y1 y2 y3 y4 y5 y6.
2157     &2 <= y1 /\ y1 <= &2 * h0 /\
2158     &2 <= y2 /\ y2 <= &2 * h0 /\
2159     &2 <= y3 /\ y3 <= &2 * h0 /\
2160     &2 <= y4 /\ y4 <= #3.01 /\
2161     &3 <= y5 /\ xrr y1 y3 y5 <= #15.53 /\
2162     &3 <= y6 /\ xrr y1 y2 y6 <= #15.53 /\
2163     &0 < delta_y y1 y2 y3 y4 y5 y6
2164 ==>
2165     (?a b. y4 IN real_interval (a,b) /\
2166        (!y4' y4''. (y4' IN real_interval(a,b) /\ y4'' IN real_interval(a,b) /\ y4' < y4'' ==>
2167                       taum y1 y2 y3 y4' y5 y6 < taum y1 y2 y3 y4'' y5 y6))))`,
2168   (* {{{ proof *)
2169   [
2170   REPEAT WEAKER_STRIP_TAC;
2171   MATCH_MP_TAC NUM1_GENERIC;
2172   GEXISTL_TAC [ `(&2/h0) pow 2`;`#3.01 pow 2`;`(#2.38) pow 2 `;`#15.53`;`#2.38 pow 2`;`#15.53`];
2173   INTRO_TAC (Terminal.get_main_nonlinear "6843920790") [`xrr y2 y3 y4`;`xrr y1 y3 y5`;`xrr y1 y2 y6`;`rho y1`;`rho y2`;`rho y3`];
2174   DISCH_THEN (unlist REWRITE_TAC);
2175   ASM_REWRITE_TAC[];
2176   REPEAT (GMATCH_SIMP_TAC xrr_simple_lower_bound);
2177   ASM_REWRITE_TAC[];
2178   REPEAT (GMATCH_SIMP_TAC xrr_simple_upper_bound);
2179   ASM_REWRITE_TAC[];
2180   TYPIFY_GOAL_THEN `#2.38 pow 2 <= xrr y1 y2 y6` (ASSUME_TAC);
2181     MATCH_MP_TAC REAL_LE_TRANS;
2182     TYPIFY `(&3 / h0) pow 2` EXISTS_TAC;
2183     CONJ_TAC;
2184       BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
2185     GMATCH_SIMP_TAC xrr_simple_lower_bound;
2186     BY(ASM_TAC THEN REAL_ARITH_TAC);
2187   TYPIFY_GOAL_THEN `#2.38 pow 2 <= xrr y1 y3 y5` (ASSUME_TAC);
2188     MATCH_MP_TAC REAL_LE_TRANS;
2189     TYPIFY `(&3 / h0) pow 2` EXISTS_TAC;
2190     CONJ_TAC;
2191       BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
2192     GMATCH_SIMP_TAC xrr_simple_lower_bound;
2193     BY(ASM_TAC THEN REAL_ARITH_TAC);
2194   TYPIFY `&0 < ups_x (y2 * y2) (y3 * y3) (y4 * y4) ` (C SUBGOAL_THEN ASSUME_TAC);
2195     REPEAT (GMATCH_SIMP_TAC Ysskqoy.TRI_UPS_X_STRICT_POS);
2196     BY(ASM_TAC THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
2197   ASM_REWRITE_TAC[];
2198   REPEAT (GMATCH_SIMP_TAC xrr_bounds_2);
2199   BY(ASM_TAC THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
2200   ]);;
2201   (* }}} *)
2202
2203
2204 (* RETURN TO PENT HEX CASES *)
2205
2206 (* IS_SCS LEMMAS *)
2207
2208 let is_scs_funlist_basic = prove_by_refinement(
2209   `!k d a0 b0  a b . d < #0.9 /\ 3 <= k /\ k <= 6 /\
2210   (!i j. i < j /\ j < k ==> funlist_v39 a a0 k i j <= funlist_v39 b b0 k i j) /\
2211  (!i j. i < j /\ j < k  ==> &2 <= funlist_v39 a a0 k i j) /\
2212  (!i. i < 3 /\ k = 3 ==> funlist_v39 b b0 k i (SUC i) < &4) /\
2213  (!i. i < k /\ 3 < k ==> funlist_v39 b b0 k i (SUC i) <= cstab) /\
2214  CARD
2215  {i | i < k /\
2216       (&2 * h0 < funlist_v39 b b0 k i (SUC i) \/
2217        &2 < funlist_v39 a a0 k i (SUC i))} +
2218  k <=  6 ==>
2219     is_scs_v39 (scs_v39 (k,d,
2220                          funlist_v39 a a0 k,funlist_v39 a a0 k,
2221                          funlist_v39 b b0 k,funlist_v39 b b0 k,
2222                          (\i j. F),{},{},{}))`,
2223   (* {{{ proof *)
2224   [
2225   REPEAT WEAKER_STRIP_TAC;
2226   ONCE_REWRITE_TAC[GSYM Terminal.funlistA_empty];
2227   MATCH_MP_TAC Terminal.is_scs_funlist;
2228   ASM_REWRITE_TAC[Appendix.periodic_empty];
2229   BY(REWRITE_TAC[Terminal.funlistA_empty])
2230   ]);;
2231   (* }}} *)
2232
2233 let periodic2_cs_adj = prove_by_refinement(
2234   `!k r r'. periodic2(cs_adj k r r') k`,
2235   (* {{{ proof *)
2236   [
2237   REPEAT WEAKER_STRIP_TAC;
2238   REWRITE_TAC[LET_DEF;LET_END_DEF;Appendix.periodic2;Appendix.cs_adj];
2239   TYPIFY `!i. (i + k) MOD k = i MOD k` (C SUBGOAL_THEN ASSUME_TAC);
2240     GEN_TAC;
2241     ONCE_REWRITE_TAC[arith `i + (k:num) = 1 * k + i`];
2242     BY(REWRITE_TAC[MOD_MULT_ADD]);
2243   REPEAT WEAKER_STRIP_TAC;
2244   BY(ASM_REWRITE_TAC[arith `SUC (i + k) = (SUC i + k)`])
2245   ]);;
2246   (* }}} *)
2247
2248 let is_scs_adj = prove_by_refinement(
2249   `!k d r r' s s'. d < #0.9 /\ 3 <= k /\ k <= 6 /\ (k = 3 ==> s < &4) /\ (3 < k ==> s <= cstab) /\
2250     (&2 <= r ) /\ (&2 <= r') /\ (r <= s) /\ (r' <= s') /\ (3 < k ==> s <= &2 * h0 /\ r = &2) ==>
2251     is_scs_v39 (mk_unadorned_v39 k d (cs_adj k r r') (cs_adj k s s'))`,
2252   (* {{{ proof *)
2253   [
2254   REPEAT WEAKER_STRIP_TAC;
2255   ASM_REWRITE_TAC[Appendix.is_scs_v39;Terminal.scs_unadorned_explicit;Appendix.scs_v39_explicit;arith `x <= x`;Appendix.periodic_empty;periodic2_cs_adj];
2256   CONJ_TAC;
2257     BY(REWRITE_TAC[Appendix.periodic2]);
2258   CONJ_TAC;
2259     REPEAT WEAKER_STRIP_TAC;
2260     REWRITE_TAC[Appendix.cs_adj];
2261     CONJ_TAC;
2262       BY(MESON_TAC[]);
2263     CONJ_TAC;
2264       BY(MESON_TAC[]);
2265     BY(MESON_TAC[]);
2266   CONJ_TAC;
2267     REPEAT WEAKER_STRIP_TAC;
2268     REWRITE_TAC[Appendix.cs_adj];
2269     COND_CASES_TAC THEN ASM_REWRITE_TAC[];
2270       BY(REAL_ARITH_TAC);
2271     COND_CASES_TAC;
2272       BY(ASM_TAC THEN REAL_ARITH_TAC);
2273     BY(ASM_TAC THEN REAL_ARITH_TAC);
2274   CONJ_TAC;
2275     REPEAT WEAKER_STRIP_TAC;
2276     BY(REWRITE_TAC[Appendix.cs_adj]);
2277   CONJ_TAC;
2278     REPEAT WEAKER_STRIP_TAC;
2279     REWRITE_TAC[Appendix.cs_adj];
2280     COND_CASES_TAC;
2281       BY(ASM_MESON_TAC[MOD_LT;arith `3 <= k ==> 0 < k`]);
2282     BY(ASM_TAC THEN REAL_ARITH_TAC);
2283   CONJ_TAC;
2284     REPEAT WEAKER_STRIP_TAC;
2285     REWRITE_TAC[Appendix.cs_adj];
2286     ASM_REWRITE_TAC[];
2287     FIRST_X_ASSUM (RULE_ASSUM_TAC o (unlist REWRITE_RULE));
2288     BY(ASM_TAC THEN REAL_ARITH_TAC);
2289   CONJ_TAC;
2290     REPEAT WEAKER_STRIP_TAC;
2291     REWRITE_TAC[Appendix.cs_adj];
2292     FIRST_X_ASSUM (RULE_ASSUM_TAC o (unlist REWRITE_RULE));
2293     BY(ASM_TAC THEN REAL_ARITH_TAC);
2294   ASM_CASES_TAC `k=3`;
2295     ASM_REWRITE_TAC[arith `x + 3 <= 6 <=> x <= 3`];
2296     INTRO_TAC HAS_SIZE_NUMSEG_LT [`3`];
2297     REWRITE_TAC[HAS_SIZE];
2298     TYPIFY `{i | i < 3 /\          (&2 * h0 < cs_adj 3 s s' i (SUC i) \/ &2 < cs_adj 3 r r' i (SUC i))} SUBSET {i | i < 3}` (C SUBGOAL_THEN MP_TAC);
2299       BY(SET_TAC[]);
2300     BY(MESON_TAC[CARD_SUBSET]);
2301   TYPIFY `{i | i < k /\      (&2 * h0 < cs_adj k s s' i (SUC i) \/ &2 < cs_adj k r r' i (SUC i))} = {}` ENOUGH_TO_SHOW_TAC;
2302     DISCH_THEN SUBST1_TAC;
2303     REWRITE_TAC[CARD_CLAUSES];
2304     BY(ASM_TAC THEN ARITH_TAC);
2305   REWRITE_TAC[EXTENSION;IN_ELIM_THM;NOT_IN_EMPTY];
2306   REWRITE_TAC[Appendix.cs_adj];
2307   GEN_TAC;
2308   REWRITE_TAC[DE_MORGAN_THM];
2309   REWRITE_TAC[TAUT `~a \/ b <=> a ==> b`];
2310   DISCH_TAC;
2311   ASM_SIMP_TAC[Qknvmlb.SUC_MOD_NOT_EQ;arith `3 <= k==> 1 < k`];
2312   TYPIFY `3 < k` (C SUBGOAL_THEN ASSUME_TAC);
2313     BY(ASM_TAC THEN ARITH_TAC);
2314   FIRST_X_ASSUM_ST `h0` MP_TAC;
2315   ASM_REWRITE_TAC[];
2316   BY(REAL_ARITH_TAC)
2317   ]);;
2318   (* }}} *)
2319
2320 let is_scs_6T1 = prove_by_refinement(
2321   `is_scs_v39 scs_6T1`,
2322   (* {{{ proof *)
2323   [
2324   REWRITE_TAC[Appendix.scs_6T1];
2325   MATCH_MP_TAC is_scs_adj;
2326   REWRITE_TAC[Appendix.d_tame;Sphere.cstab];
2327   NUM_REDUCE_TAC;
2328   BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
2329   ]);;
2330   (* }}} *)
2331
2332 let azim_in_fan_azim = prove_by_refinement(
2333   `!vv E k i.
2334     periodic vv k /\ 3 <= k /\ (!i j. i < k /\ j < k /\ vv i = vv j ==> i =j ) /\
2335     E = IMAGE (\i. {vv i, vv (SUC i)}) (:num) 
2336     ==>
2337     azim_in_fan (vv i,vv (SUC i)) E = azim (vec 0) (vv i) (vv (SUC i)) (vv (i + k -1))`,
2338   (* {{{ proof *)
2339   [
2340   REPEAT WEAKER_STRIP_TAC;
2341   ASM_REWRITE_TAC[Localization.azim_in_fan;LET_DEF;LET_END_DEF];
2342   GMATCH_SIMP_TAC Terminal.EE_vv;
2343   TYPIFY `k` EXISTS_TAC;
2344   ASM_REWRITE_TAC[];
2345   COND_CASES_TAC;
2346     BY(REWRITE_TAC[GEN_ALL Local_lemmas.AZIM_CYCLE_TWO_POINT_SET]);
2347   PROOF_BY_CONTR_TAC;
2348   FIRST_X_ASSUM_ST `CARD` MP_TAC;
2349   TYPIFY `~(k = 0)` (C SUBGOAL_THEN ASSUME_TAC);
2350     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2351   REWRITE_TAC[];
2352   MATCH_MP_TAC (arith `c = 2 ==> c > 1`);
2353   MATCH_MP_TAC Hypermap.CARD_TWO_ELEMENTS;
2354   INTRO_TAC Oxl_def.periodic_mod [`vv`;`k`];
2355   ASM_REWRITE_TAC[];
2356   DISCH_THEN (unlist ONCE_REWRITE_TAC);
2357   DISCH_TAC;
2358   TYPIFY `SUC i MOD k = (i + k - 1) MOD k` (C SUBGOAL_THEN ASSUME_TAC);
2359     BY(ASM_MESON_TAC[DIVISION]);
2360   INTRO_TAC Oxlzlez.MOD_INJ1_ALT [`k-2`;`k`];
2361   ANTS_TAC;
2362     BY(REPEAT (FIRST_X_ASSUM_ST `3 <= k` MP_TAC) THEN ARITH_TAC);
2363   DISCH_TAC;
2364   FIRST_X_ASSUM (C INTRO_TAC [`SUC i`]);
2365   ASM_REWRITE_TAC[];
2366   BY(ASM_SIMP_TAC[arith `3 <= k ==> SUC x + k - 2 = x + k - 1`])
2367   ]);;
2368   (* }}} *)
2369
2370 let sol_local_azim = prove_by_refinement(
2371   `!vv k .
2372   (
2373    let E = IMAGE (\i. {vv i, vv (SUC i)}) (:num) in
2374    let f = IMAGE (\i. vv i,vv (SUC i)) (:num) in
2375     (periodic vv k /\ 3 <= k /\
2376      (!i j. i < k /\ j < k /\ vv i = vv j ==> (i = j)) ==>
2377        sol_local E f = sum {i | i < k} (\i. 
2378          azim (vec 0) (vv i) (vv (i+1)) (vv (i + (k-1))))  - pi * (&k - &2)))`,
2379   (* {{{ proof *)
2380   [
2381   REWRITE_TAC[LET_DEF;LET_END_DEF;Localization.sol_local];
2382   REPEAT WEAKER_STRIP_TAC;
2383   GMATCH_SIMP_TAC (GSYM Oxlzlez.PERIODIC_IMAGE);
2384   TYPIFY `k` EXISTS_TAC;
2385   CONJ_TAC;
2386     ASM_SIMP_TAC[arith `3 <= k ==> ~(0 = k)`];
2387     FIRST_X_ASSUM_ST `periodic` MP_TAC;
2388     REWRITE_TAC[Oxl_def.periodic;PAIR_EQ];
2389     BY(MESON_TAC[arith `SUC (i + k) = SUC i + k`]);
2390   TYPIFY `FINITE (IMAGE (\i. vv i,vv (SUC i)) {i | i < k})` (C SUBGOAL_THEN ASSUME_TAC);
2391     MATCH_MP_TAC FINITE_IMAGE;
2392     BY(REWRITE_TAC[FINITE_NUMSEG_LT]);
2393   ASM_SIMP_TAC[ SUM_SUB];
2394   ASM_SIMP_TAC[ SUM_CONST];
2395   MATCH_MP_TAC (arith `b = b' /\ s = s' ==> &2 * pi + s -  b*pi = s' - (pi) * (b'- &2)`);
2396   GMATCH_SIMP_TAC CARD_IMAGE_INJ;
2397   ASM_REWRITE_TAC[IN_ELIM_THM;PAIR_EQ;FINITE_NUMSEG_LT;CARD_NUMSEG_LT];
2398   CONJ_TAC;
2399     BY(ASM_MESON_TAC[]);
2400   GMATCH_SIMP_TAC SUM_IMAGE;
2401   ASM_REWRITE_TAC[IN_ELIM_THM;PAIR_EQ;FINITE_NUMSEG_LT;CARD_NUMSEG_LT];
2402   CONJ_TAC;
2403     BY(ASM_MESON_TAC[]);
2404   MATCH_MP_TAC SUM_EQ;
2405   REWRITE_TAC[IN_ELIM_THM;o_THM];
2406   REPEAT WEAKER_STRIP_TAC;
2407   REWRITE_TAC[arith `x + 1 = SUC x`];
2408   MATCH_MP_TAC azim_in_fan_azim;
2409   BY(ASM_MESON_TAC[])
2410   ]);;
2411   (* }}} *)
2412
2413 let vv_inj_lemma = prove_by_refinement(
2414   `!s v k. is_scs_v39 s /\ v IN BBs_v39 s /\ scs_k_v39 s = k  ==>
2415     (!i j. i < k /\ j < k /\ v i = v j ==> i = j)`,
2416   (* {{{ proof *)
2417   [
2418   REPEAT WEAKER_STRIP_TAC;
2419   RULE_ASSUM_TAC(REWRITE_RULE[Appendix.is_scs_v39;IN;Appendix.BBs_v39;LET_THM]);
2420   ASM_TAC THEN REPEAT WEAKER_STRIP_TAC;
2421   FIRST_X_ASSUM (C INTRO_TAC [`i`;`j`]);
2422   REPEAT WEAKER_STRIP_TAC;
2423   PROOF_BY_CONTR_TAC;
2424   FIRST_X_ASSUM_ST `&2 <= x` (C INTRO_TAC [`i`;`j`]);
2425   ASM_REWRITE_TAC[arith `~(x <= y) <=> y < x`];
2426   FIRST_X_ASSUM_ST `a <= dist(u,v)` MP_TAC;
2427   ASM_REWRITE_TAC[DIST_REFL];
2428   BY(REAL_ARITH_TAC)
2429   ]);;
2430   (* }}} *)
2431
2432 let LOCAL_FAN_AZIM_POS = prove_by_refinement(
2433   `!s vv i. 
2434     (let V = IMAGE vv (:num) in
2435      let E = IMAGE (\i. {vv i, vv (SUC i)}) (:num) in
2436      let f = IMAGE (\i. (vv i,vv (SUC i))) (:num) in
2437      let k = scs_k_v39 s in
2438      (convex_local_fan (V,E,f) /\ is_scs_v39 s /\ vv IN BBs_v39 s
2439     ==>  &0 < azim (vec 0) (vv i ) (vv (SUC i)) (vv (i + (k-1)))))`,
2440   (* {{{ proof *)
2441   [
2442   REWRITE_TAC[LET_THM];
2443   REPEAT WEAKER_STRIP_TAC;
2444   GMATCH_SIMP_TAC (GSYM azim_in_fan_azim);
2445   TYPED_ABBREV_TAC `V = IMAGE vv (:num)`;
2446   TYPED_ABBREV_TAC `E = IMAGE (\i. {vv i, vv (SUC i)}) (:num)`;
2447   TYPED_ABBREV_TAC `f = IMAGE (\i. (vv i,vv (SUC i))) (:num)`;
2448   TYPIFY `vv i IN V` (C SUBGOAL_THEN ASSUME_TAC);
2449     EXPAND_TAC "V";
2450     REWRITE_TAC[IN_IMAGE;IN_UNIV];
2451     BY(MESON_TAC[]);
2452   TYPIFY `     E` EXISTS_TAC;
2453   INTRO_TAC (GEN_ALL Nkezbfc_local.CONVEX_LOFA_IMP_INANGLE_EQ_AZIM) [`V`;`f`;`E`];
2454   ASM_REWRITE_TAC[];
2455   DISCH_THEN (C INTRO_TAC [`vv i`]);
2456   ASM_REWRITE_TAC[];
2457   INTRO_TAC Terminal.vv_rho_node1 [`vv`;`scs_k_v39 s`];
2458   ASM_REWRITE_TAC[LET_THM];
2459   INTRO_TAC vv_inj_lemma [`s`;`vv`;`scs_k_v39 s`];
2460   ASM_REWRITE_TAC[];
2461   DISCH_TAC;
2462   ASM_REWRITE_TAC[];
2463   INTRO_TAC (GEN_ALL Local_lemmas.INTERIOR_ANGLE1_POS) [`E`;`V`;`f`;`vv i`];
2464   ASM_REWRITE_TAC[];
2465   ANTS_TAC;
2466     BY(ASM_SIMP_TAC[Local_lemmas.CVX_LO_IMP_LO]);
2467   TYPIFY `periodic vv (scs_k_v39 s) /\ 3 <= scs_k_v39 s` ENOUGH_TO_SHOW_TAC;
2468     BY(ASM_MESON_TAC[]);
2469   RULE_ASSUM_TAC(REWRITE_RULE[Appendix.is_scs_v39]);
2470   ASM_REWRITE_TAC[];
2471   RULE_ASSUM_TAC(REWRITE_RULE[IN;Appendix.BBs_v39;LET_THM]);
2472   BY(ASM_REWRITE_TAC[])
2473   ]);;
2474   (* }}} *)
2475
2476 let INTERIOR_ANGLE1_AZIM = prove_by_refinement(
2477   `!s vv i. 
2478     (let V = IMAGE vv (:num) in
2479      let E = IMAGE (\i. {vv i, vv (SUC i)}) (:num) in
2480      let f = IMAGE (\i. (vv i,vv (SUC i))) (:num) in
2481      let k = scs_k_v39 s in
2482      (is_scs_v39 s /\ vv IN BBs_v39 s /\ 3 < k
2483     ==>  azim (vec 0) (vv i ) (vv (SUC i)) (vv (i + (k-1))) = interior_angle1 (vec 0) f (vv(i) )))`,
2484   (* {{{ proof *)
2485   [
2486   REWRITE_TAC[LET_THM];
2487   REPEAT WEAKER_STRIP_TAC;
2488   GMATCH_SIMP_TAC (GSYM azim_in_fan_azim);
2489   TYPED_ABBREV_TAC `V = IMAGE vv (:num)`;
2490   TYPED_ABBREV_TAC `E = IMAGE (\i. {vv i, vv (SUC i)}) (:num)`;
2491   TYPED_ABBREV_TAC `f = IMAGE (\i. (vv i,vv (SUC i))) (:num)`;
2492   TYPIFY `vv i IN V` (C SUBGOAL_THEN ASSUME_TAC);
2493     EXPAND_TAC "V";
2494     REWRITE_TAC[IN_IMAGE;IN_UNIV];
2495     BY(MESON_TAC[]);
2496   TYPIFY `     E` EXISTS_TAC;
2497   INTRO_TAC (GEN_ALL Nkezbfc_local.CONVEX_LOFA_IMP_INANGLE_EQ_AZIM) [`V`;`f`;`E`];
2498   TYPIFY `convex_local_fan(V,E,f)` (C SUBGOAL_THEN ASSUME_TAC);
2499     RULE_ASSUM_TAC(REWRITE_RULE[Appendix.BBs_v39;IN;LET_THM]);
2500     FIRST_X_ASSUM_ST `convex_local_fan` MP_TAC THEN ASM_REWRITE_TAC[];
2501     BY(ASM_SIMP_TAC[arith `3 < k ==> ~( k <= 3)`]);
2502   ASM_REWRITE_TAC[];
2503   DISCH_THEN (C INTRO_TAC [`vv i`]);
2504   ASM_REWRITE_TAC[];
2505   DISCH_THEN SUBST1_TAC;
2506   INTRO_TAC Terminal.vv_rho_node1 [`vv`;`scs_k_v39 s`];
2507   ASM_REWRITE_TAC[LET_THM];
2508   INTRO_TAC vv_inj_lemma [`s`;`vv`;`scs_k_v39 s`];
2509   ASM_REWRITE_TAC[];
2510   DISCH_TAC;
2511   ASM_REWRITE_TAC[];
2512   TYPIFY `periodic vv (scs_k_v39 s) /\ 3 <= scs_k_v39 s` ENOUGH_TO_SHOW_TAC;
2513     BY(ASM_MESON_TAC[]);
2514   RULE_ASSUM_TAC(REWRITE_RULE[Appendix.is_scs_v39]);
2515   ASM_REWRITE_TAC[];
2516   RULE_ASSUM_TAC(REWRITE_RULE[IN;Appendix.BBs_v39;LET_THM]);
2517   BY(ASM_REWRITE_TAC[])
2518   ]);;
2519   (* }}} *)
2520
2521 let delta_x4_imp_obtuse = prove_by_refinement(
2522   `!x1 x2 x3 x4 x5 x6.
2523      &0 < x1 /\ &0 <= delta_x x1 x2 x3 x4 x5 x6 /\ delta_x4 x1 x2 x3 x4 x5 x6 < &0 ==>
2524     pi/ &2 < dih_x x1 x2 x3 x4 x5 x6`,
2525   (* {{{ proof *)
2526   [
2527   REPEAT WEAKER_STRIP_TAC;
2528   REWRITE_TAC[Sphere.dih_x;LET_THM];
2529   REWRITE_TAC[arith `x < x + y <=> &0 < y`];
2530   TYPED_ABBREV_TAC `s = sqrt(&4 * x1 * delta_x x1 x2 x3 x4 x5 x6)`;
2531   TYPIFY `&0 <= s` (C SUBGOAL_THEN ASSUME_TAC);
2532     EXPAND_TAC "s";
2533     GMATCH_SIMP_TAC SQRT_POS_LE;
2534     GMATCH_SIMP_TAC REAL_LE_MUL;
2535     GMATCH_SIMP_TAC REAL_LE_MUL;
2536     BY(ASM_TAC THEN REAL_ARITH_TAC);
2537   ASM_CASES_TAC `&0 < s`;
2538     ASM_SIMP_TAC[Merge_ineq.ATN2_POS];
2539     BY(ASM_TAC THEN REAL_ARITH_TAC);
2540   TYPIFY `s = &0` (C SUBGOAL_THEN SUBST1_TAC);
2541     BY(ASM_TAC THEN REAL_ARITH_TAC);
2542   GMATCH_SIMP_TAC Merge_ineq.atn2_0;
2543   MP_TAC PI_POS;
2544   BY(ASM_TAC THEN REAL_ARITH_TAC)
2545   ]);;
2546   (* }}} *)
2547
2548 let delta4_y_imp_obtuse = prove_by_refinement(
2549   `!y1 y2 y3 y4 y5 y6. &0 < y1 /\ &0 <= delta_y y1 y2 y3 y4 y5 y6 /\ delta4_y y1 y2 y3 y4 y5 y6 < &0 ==>
2550      pi/ &2 < dih_y y1 y2 y3 y4 y5 y6`,
2551   (* {{{ proof *)
2552   [
2553   REWRITE_TAC[Sphere.dih_y;LET_THM;Sphere.delta_y;Sphere.delta4_y;Sphere.y_of_x];
2554   REPEAT WEAKER_STRIP_TAC;
2555   MATCH_MP_TAC delta_x4_imp_obtuse;
2556   ASM_REWRITE_TAC[];
2557   GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
2558   BY(ASM_REWRITE_TAC[])
2559   ]);;
2560   (* }}} *)
2561
2562 let scs_vv_MOD = prove_by_refinement(
2563   `!s vv i. is_scs_v39 s /\ BBs_v39 s vv ==> vv(i MOD scs_k_v39 s) = vv i`,
2564   (* {{{ proof *)
2565   [
2566   REWRITE_TAC[Appendix.is_scs_v39;Appendix.BBs_v39;LET_THM];
2567   REPEAT WEAKER_STRIP_TAC;
2568   SPEC_TAC (`i:num`,`i:num`);
2569   MATCH_MP_TAC Xwitccn.PERIODIC_PROPERTY;
2570   ASM_REWRITE_TAC[];
2571   BY(FIRST_X_ASSUM_ST `3 <= k` MP_TAC THEN ARITH_TAC)
2572   ]);;
2573   (* }}} *)
2574
2575 let scs_lb_2 = prove_by_refinement(
2576   `!s vv i j. is_scs_v39 s /\ BBs_v39 s vv /\ ~(i MOD scs_k_v39 s = j MOD scs_k_v39 s) ==>
2577     &2 <= dist(vv i,vv j)`,
2578   (* {{{ proof *)
2579   [
2580   REPEAT WEAKER_STRIP_TAC;
2581   TYPIFY_GOAL_THEN `!i. vv(i MOD scs_k_v39 s) = vv (i)` (unlist ONCE_REWRITE_TAC o GSYM);
2582     BY(ASM_MESON_TAC[scs_vv_MOD]);
2583   RULE_ASSUM_TAC(REWRITE_RULE[Appendix.is_scs_v39;Appendix.BBs_v39;LET_THM]);
2584   TYPED_ABBREV_TAC `k = scs_k_v39 s`;
2585   ASM_TAC THEN REPEAT WEAKER_STRIP_TAC;
2586   FIRST_X_ASSUM_ST `&2 <= x` (C INTRO_TAC [`i MOD k`;`j MOD k`]);
2587   FIRST_X_ASSUM_ST `scs_a_v39` (C INTRO_TAC [`i MOD k`;`j MOD k`]);
2588   ASM_SIMP_TAC[arith `3 <= k ==> ~(k = 0)`;DIVISION];
2589   BY(REAL_ARITH_TAC)
2590   ]);;
2591   (* }}} *)
2592
2593 let delta_x4_decreasing = prove_by_refinement(
2594   `!x1 x2 x3 x4 x5 x6 x4'.
2595     x4 <= x4' /\ &0 <= x1 ==>
2596     delta_x4 x1 x2 x3 x4' x5 x6 <= delta_x4 x1 x2 x3 x4 x5 x6`,
2597   (* {{{ proof *)
2598   [
2599   REPEAT WEAKER_STRIP_TAC;
2600   ENOUGH_TO_SHOW_TAC `delta_x4 x1 x2 x3 x4 x5 x6 - delta_x4 x1 x2 x3 x4' x5 x6 = &2 * x1 * (x4' - x4)`;
2601     ONCE_REWRITE_TAC[arith `d' <= d <=> &0 <= d - d'`];
2602     DISCH_THEN SUBST1_TAC;
2603     GMATCH_SIMP_TAC REAL_LE_MUL;
2604     CONJ_TAC;
2605       BY(REAL_ARITH_TAC);
2606     GMATCH_SIMP_TAC REAL_LE_MUL;
2607     BY(ASM_TAC THEN REAL_ARITH_TAC);
2608   REWRITE_TAC[Nonlin_def.delta_x4];
2609   BY(REAL_ARITH_TAC)
2610   ]);;
2611   (* }}} *)
2612
2613 let SYNQIWN = prove_by_refinement(
2614   `main_nonlinear_terminal_v11 ==> (!s v i k.
2615   is_scs_v39 s /\ BBs_v39 s v /\ scs_k_v39 s =k /\ 3 < k /\
2616   ((norm (v (SUC i)) = &2 /\ dist(v i,v (i+k-1)) = &2) \/
2617      (norm (v (i+k-1)) = &2 /\ dist(v i,v (SUC i)) = &2) \/
2618      (norm (v (SUC i)) = &2 /\ norm (v(i+k-1)) = &2) \/
2619      (dist(v i,v(SUC i)) = &2 /\ dist(v i,v(i + k - 1)) = &2) \/
2620      (norm (v (SUC i)) = &2 /\ dist(v i,v (SUC i)) = &2) \/
2621      (norm (v (i+k-1)) = &2 /\ dist(v i,v (i+k-1)) = &2)) /\
2622   (dist(v i,v (SUC i)) <= &2 * h0) /\
2623   (dist(v (i),v(i+k-1)) <= &2 * h0) /\
2624   cstab <= dist(v (SUC i),v(i+k - 1)) ==>
2625   pi/ &2 < azim (vec 0) (v (i)) (v (SUC i)) (v (i + k - 1)))
2626 `,
2627   (* {{{ proof *)
2628   [
2629   REPEAT WEAKER_STRIP_TAC;
2630   REWRITE_TAC[arith `x < y <=> ~(y <= x)`];
2631   DISCH_TAC;
2632   TYPED_ABBREV_TAC `E = IMAGE (\i. {v i, v (SUC i)}) (:num) `;
2633   INTRO_TAC vv_inj_lemma [`s`;`v`;`k`];
2634   ASM_REWRITE_TAC[IN];
2635   COMMENT "noncollinearity";
2636   DISCH_TAC;
2637   INTRO_TAC (GEN_ALL Qknvmlb.IS_SCS_NOT_COLLINEAR_BBs_CASE_LE_PRIME_3) [`v`;`i`;`s`];
2638   ASM_REWRITE_TAC[IN];
2639   INTRO_TAC (GEN_ALL Qknvmlb.IS_SCS_NOT_COLLINEAR_BBs_CASE_LE_PRIME_3) [`v`;`i + k - 1`;`s`];
2640   ASM_REWRITE_TAC[IN];
2641   TYPIFY `SUC (i + k -1) MOD k = i MOD k` (C SUBGOAL_THEN SUBST1_TAC);
2642     TYPIFY `SUC (i + k - 1) = 1*k + i` (C SUBGOAL_THEN SUBST1_TAC);
2643       BY(FIRST_X_ASSUM_ST `3 < k` MP_TAC THEN ARITH_TAC);
2644     BY(REWRITE_TAC[MOD_MULT_ADD]);
2645   TYPIFY_GOAL_THEN `!i. v (i MOD k) = v i` (unlist REWRITE_TAC);
2646     RULE_ASSUM_TAC(REWRITE_RULE[Appendix.BBs_v39;LET_THM]);
2647     MATCH_MP_TAC Xwitccn.PERIODIC_PROPERTY;
2648     BY(ASM_MESON_TAC[arith `3 < k ==> ~(k=0)`]);
2649   TYPIFY `{vec 0, v (i + k - 1),v ( i)} = {vec 0,v (i),v (i + k - 1)}` (C SUBGOAL_THEN SUBST1_TAC);
2650     BY(SET_TAC[]);
2651   REPEAT WEAKER_STRIP_TAC;
2652   PROOF_BY_CONTR_TAC;
2653   TYPIFY `azim (vec 0) (v i) (v (SUC i)) (v (i + k - 1)) = dihV (vec 0) (v i) (v (SUC i)) (v (i + k - 1))` (C SUBGOAL_THEN ASSUME_TAC);
2654     GMATCH_SIMP_TAC (GSYM Polar_fan.AZIM_DIHV_SAME_STRONG);
2655     ASM_REWRITE_TAC[];
2656     FIRST_X_ASSUM_ST `pi` MP_TAC;
2657     MP_TAC PI_POS;
2658     BY(REAL_ARITH_TAC);
2659   TYPIFY `pi / &2 < dihV (vec 0) (v (i)) (v (SUC i)) (v (i + k - 1))` ENOUGH_TO_SHOW_TAC;
2660     BY(ASM_TAC THEN REAL_ARITH_TAC);
2661   GMATCH_SIMP_TAC (REWRITE_RULE[LET_THM] Merge_ineq.DIHV_EQ_DIH_Y);
2662   ASM_REWRITE_TAC[];
2663   MATCH_MP_TAC delta4_y_imp_obtuse;
2664   COMMENT "three final steps";
2665   TYPIFY `!i. &2 <= norm(v i) /\ norm(v i) <= &2 * h0` (C SUBGOAL_THEN ASSUME_TAC);
2666     RULE_ASSUM_TAC(REWRITE_RULE[Appendix.BBs_v39;LET_THM;Terminal.IMAGE_SUBSET_IN;IN_UNIV]);
2667     BY(ASM_MESON_TAC[Fnjlbxs.in_ball_annulus]);
2668   REWRITE_TAC[Trigonometry1.DIST_L_ZERO];
2669   SUBCONJ_TAC;
2670     FIRST_X_ASSUM (C INTRO_TAC [`i`]);
2671     BY(REAL_ARITH_TAC);
2672   DISCH_TAC;
2673   REWRITE_TAC[REWRITE_RULE[LET_THM] Tame_lemmas.delta_y_pos];
2674   INTRO_TAC scs_lb_2 [`s`;`v`];
2675   ASM_REWRITE_TAC[];
2676   DISCH_TAC;
2677   TYPIFY `&2 <= dist (v i, v (SUC i))` (C SUBGOAL_THEN ASSUME_TAC);
2678     FIRST_X_ASSUM MATCH_MP_TAC;
2679     BY(ASM_MESON_TAC[ Qknvmlb.SUC_MOD_NOT_EQ;arith `3 < k ==> 1 < k`]);
2680   TYPIFY `&2 <= dist(v i,v (i + k - 1))` (C SUBGOAL_THEN ASSUME_TAC);
2681     FIRST_X_ASSUM MATCH_MP_TAC;
2682     INTRO_TAC (GEN_ALL Oxl_2012.MOD_INJ1) [`k - 1`;`k`];
2683     ANTS_TAC;
2684       BY(FIRST_X_ASSUM_ST `3 < k` MP_TAC THEN ARITH_TAC);
2685     BY(DISCH_THEN (unlist REWRITE_TAC));
2686   TYPIFY `delta4_y (norm (v i)) (norm (v (SUC i))) (norm (v (i + k - 1))) cstab (dist (v i,v (i + k - 1))) (dist (v i,v (SUC i))) < &0` ENOUGH_TO_SHOW_TAC;
2687     MATCH_MP_TAC (arith `y<= x ==> (x < &0 ==> y < &0)`);
2688     REWRITE_TAC[Sphere.delta4_y;Sphere.y_of_x];
2689     MATCH_MP_TAC delta_x4_decreasing;
2690     GMATCH_SIMP_TAC Misc_defs_and_lemmas.ABS_SQUARE_LE;
2691     REWRITE_TAC[ REAL_LE_SQUARE];
2692     BY(FIRST_X_ASSUM_ST `cstab` MP_TAC THEN REWRITE_TAC[Sphere.cstab] THEN REAL_ARITH_TAC);
2693   REWRITE_TAC[Sphere.cstab];
2694   COMMENT "ineq cases";
2695   REPEAT (FIRST_X_ASSUM_ST `collinear` kill);
2696   REPEAT (FIRST_X_ASSUM_ST `azim` kill);
2697   FIRST_ASSUM_ST `h0` (C INTRO_TAC [`i`]);
2698   FIRST_ASSUM_ST `h0` (C INTRO_TAC [`SUC i`]);
2699   FIRST_X_ASSUM_ST `h0` (C INTRO_TAC [`i + k - 1`]);
2700   TYPED_ABBREV_TAC `y1 = norm (v i)`;
2701   TYPED_ABBREV_TAC `y2 = norm (v (SUC i))`;
2702   TYPED_ABBREV_TAC `y3 = norm (v (i + k - 1))`;
2703   TYPED_ABBREV_TAC `y5 = dist(v i ,v(i + k - 1))`;
2704   TYPED_ABBREV_TAC `y6 = dist(v i, v(SUC i))`;
2705   REPLICATE_TAC 5 (FIRST_X_ASSUM kill);
2706   REPEAT WEAKER_STRIP_TAC;
2707   TYPIFY `delta4_y y1 y3 y2 #3.01 y6 y5 = delta4_y y1 y2 y3 #3.01 y5 y6 /\ delta4_y y1 y5 y6 #3.01 y2 y3 = delta4_y y1 y2 y3 #3.01 y5 y6 /\ delta4_y y1 y6 y5 #3.01 y3 y2 = delta4_y y1 y2 y3 #3.01 y5 y6` (C SUBGOAL_THEN ASSUME_TAC);
2708     BY(REWRITE_TAC[Sphere.delta4_y;Sphere.delta_x4;Sphere.y_of_x] THEN REAL_ARITH_TAC);
2709   (FIRST_X_ASSUM_ST `\/` MP_TAC) THEN REPEAT STRIP_TAC;
2710             INTRO_TAC (Terminal.get_main_nonlinear "1117202051") [`y1`;`y3`;`y2`;`#3.01`;`y6`;`y5`];
2711             ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`];
2712             DISCH_THEN MATCH_MP_TAC;
2713             BY(ASM_TAC THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
2714           INTRO_TAC (Terminal.get_main_nonlinear "1117202051") [`y1`;`y2`;`y3`;`#3.01`;`y5`;`y6`];
2715           ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`];
2716           DISCH_THEN MATCH_MP_TAC;
2717           BY(ASM_TAC THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
2718         INTRO_TAC (Terminal.get_main_nonlinear "4559601669") [`y1`;`y2`;`y3`;`#3.01`;`y5`;`y6`];
2719         ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`];
2720         DISCH_THEN MATCH_MP_TAC;
2721         BY(ASM_TAC THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
2722       INTRO_TAC (Terminal.get_main_nonlinear "4559601669") [`y1`;`y5`;`y6`;`#3.01`;`y2`;`y3`];
2723       ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`];
2724       DISCH_THEN MATCH_MP_TAC;
2725       BY(ASM_TAC THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
2726     INTRO_TAC (Terminal.get_main_nonlinear "4559601669b") [`y1`;`y2`;`y3`;`#3.01`;`y5`;`y6`];
2727     ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`];
2728     DISCH_THEN MATCH_MP_TAC;
2729     BY(ASM_TAC THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
2730   INTRO_TAC (Terminal.get_main_nonlinear "4559601669b") [`y1`;`y3`;`y2`;`#3.01`;`y6`;`y5`];
2731   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`];
2732   DISCH_THEN MATCH_MP_TAC;
2733   BY(ASM_TAC THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
2734   ]);;
2735   (* }}} *)
2736
2737 (*
2738 let edge2_generic = prove_by_refinement(
2739   `main_nonlinear_terminal_v11 ==>
2740     (!vv k d. 
2741      (let V = IMAGE vv (:num) in
2742      let E = IMAGE (\i. {vv i, vv (SUC i)}) (:num) in
2743      let s =  mk_unadorned_v39 k d (cs_adj k (&2) cstab) (cs_adj k (&2) (&6)) in
2744           (BBs_v39 s vv  /\ 3 < k /\ taustar_v39 s vv < &0 /\ is_scs_v39 s /\
2745    (!i j. i < k /\ j < k  /\ vv i = vv j ==> (i = j)) ==>
2746              generic V E)))`,
2747   (* {{{ proof *)
2748   [
2749   REWRITE_TAC[LET_THM];
2750   REPEAT WEAKER_STRIP_TAC;
2751   TYPED_ABBREV_TAC `s = mk_unadorned_v39 k d (cs_adj k (&2) cstab) (cs_adj k (&2) (&6))`;
2752   TYPIFY `scs_k_v39 s =k ` (C SUBGOAL_THEN ASSUME_TAC);
2753     EXPAND_TAC "s";
2754     BY(ASM_REWRITE_TAC[Terminal.scs_unadorned_explicit]);
2755   INTRO_TAC Jkqewgv.JKQEWGV2 [`s`;`vv`];
2756   ASM_REWRITE_TAC[LET_THM];
2757   DISCH_TAC;
2758   TYPED_ABBREV_TAC `V = IMAGE vv (:num)`;
2759   TYPED_ABBREV_TAC `E = IMAGE (\i. {vv i, vv (SUC i)}) (:num)`;
2760   TYPED_ABBREV_TAC `f = IMAGE (\i. (vv i,vv (SUC i))) (:num)`;
2761   TYPIFY `convex_local_fan(V,E,f)` (C SUBGOAL_THEN ASSUME_TAC);
2762     RULE_ASSUM_TAC (REWRITE_RULE[Appendix.BBs_v39;LET_THM]);
2763     BY(ASM_MESON_TAC[arith `3 < k ==> ~(k <= 3)`;LET_THM]);
2764   TYPIFY `~(?v w. lunar (v,w) V E)` ENOUGH_TO_SHOW_TAC;
2765     BY(ASM_MESON_TAC[Local_lemmas.CVX_LO_IMP_LO; Wrgcvdr_cizmrrh.CIZMRRH]);
2766   REPEAT WEAKER_STRIP_TAC;
2767   INTRO_TAC Jkqewgv.JKQEWGV3 [`s`;`vv`;`v`;`w`];
2768   ASM_REWRITE_TAC[LET_THM];
2769   TYPIFY `v IN V` (C SUBGOAL_THEN ASSUME_TAC);
2770     RULE_ASSUM_TAC(REWRITE_RULE[Wrgcvdr_cizmrrh.lunar]);
2771     BY(FIRST_X_ASSUM MP_TAC THEN SET_TAC[]);
2772   TYPIFY ` interior_angle1 (vec 0) f v =                     azim_in_fan (v,rho_node1 f v) E` (C SUBGOAL_THEN SUBST1_TAC);
2773     BY(ASM_MESON_TAC[Nkezbfc_local.CONVEX_LOFA_IMP_INANGLE_EQ_AZIM]);
2774   TYPIFY `!v. v IN V ==> ?i. v = vv i` (C SUBGOAL_THEN ASSUME_TAC);
2775     GEN_TAC;
2776     EXPAND_TAC "V";
2777     BY(REWRITE_TAC[IN_IMAGE;IN_UNIV]);
2778   FIRST_X_ASSUM (C INTRO_TAC [`v`]);
2779   ASM_REWRITE_TAC[];
2780   REPEAT WEAKER_STRIP_TAC;
2781   FIRST_X_ASSUM MP_TAC;
2782   ASM_REWRITE_TAC[];
2783   EXPAND_TAC "f";
2784   GMATCH_SIMP_TAC (REWRITE_RULE[LET_THM] Terminal.vv_rho_node1);
2785   TYPIFY `periodic vv k /\ 3 <= k` (C SUBGOAL_THEN ASSUME_TAC);
2786     RULE_ASSUM_TAC(REWRITE_RULE[Appendix.BBs_v39;LET_THM]);
2787     ASM_SIMP_TAC[arith `3 < k ==> 3 <= k`];
2788     EXPAND_TAC "k";
2789     BY(ASM_REWRITE_TAC[]);
2790   CONJ_TAC;
2791     TYPIFY `k` EXISTS_TAC;
2792     BY(ASM_REWRITE_TAC[]);
2793   GMATCH_SIMP_TAC azim_in_fan_azim;
2794   TYPIFY `k` EXISTS_TAC;
2795   ASM_REWRITE_TAC[];
2796   DISCH_TAC
2797 (* unfinished need SYN, redo as RRCWNS_WEAK *)
2798   ]);;
2799   (* }}} *)
2800 *)
2801
2802 let scs_diag_2 = prove_by_refinement(
2803   `!k i. 3 < k ==> scs_diag k (SUC i) (i + k - 1)`,
2804   (* {{{ proof *)
2805   [
2806   REPEAT GEN_TAC;
2807   REWRITE_TAC[Appendix.scs_diag];
2808   DISCH_TAC;
2809   TYPIFY_GOAL_THEN `~(SUC (SUC i) MOD k = (i + k - 1) MOD k)` (unlist REWRITE_TAC);
2810     TYPIFY_GOAL_THEN `i + k - 1 = SUC(SUC i) + (k - 3)` (unlist REWRITE_TAC);
2811       BY(ASM_TAC THEN ARITH_TAC);
2812     BY(ASM_MESON_TAC[Oxl_2012.MOD_INJ1;arith `3 < k ==> ~(k = 0) /\ ~(k - 3 = 0) /\ (k - 3 < k)`]);
2813   TYPIFY_GOAL_THEN `SUC (i + k - 1) = SUC i + (k-1)` (unlist REWRITE_TAC);
2814     BY(ASM_TAC THEN ARITH_TAC);
2815   CONJ2_TAC;
2816     BY(ASM_MESON_TAC[Oxl_2012.MOD_INJ1;arith `3 < k ==> ~(k = 0) /\ ~(k - 1 = 0) /\ (k - 1 < k)`]);
2817   TYPIFY_GOAL_THEN `i + k - 1 = SUC i + k - 2` (unlist REWRITE_TAC);
2818     BY(ASM_TAC THEN ARITH_TAC);
2819   BY(ASM_MESON_TAC[Oxl_2012.MOD_INJ1;arith `3 < k ==> ~(k = 0) /\ ~(k - 2 = 0) /\ (k - 2 < k)`])
2820   ]);;
2821   (* }}} *)
2822
2823 let RRCWNS_WEAK = prove_by_refinement(
2824   `main_nonlinear_terminal_v11 ==> (!s vv. 
2825      (let V = IMAGE vv (:num) in
2826       let E = IMAGE (\i. {vv i, vv (SUC i)}) (:num) in
2827       let k = scs_k_v39 s in
2828         (BBs_v39 s vv  /\ 3 < k /\ taustar_v39 s vv < &0 /\
2829            is_scs_v39 s /\ scs_basic_v39 s /\ 
2830            (!i j. scs_diag (scs_k_v39 s) i j ==> cstab <= dist(vv i,vv j)) /\
2831            (!i w. lunar(vv i,w) V E ==> 
2832               dist(vv i,vv(SUC i)) <= &2*h0 /\
2833               dist(vv i,vv(i + k - 1)) <= &2*h0 /\
2834               ((norm (vv (SUC i)) = &2 \/ dist(vv i, vv(SUC i)) = &2)) /\
2835               ((norm (vv (i + k - 1)) = &2 \/ dist(vv i, vv(i + k - 1)) = &2)))
2836          ==>
2837            scs_generic vv)))`,
2838   (* {{{ proof *)
2839   [
2840   DISCH_TAC;
2841   REWRITE_TAC[LET_THM;Appendix.scs_generic];
2842   REPEAT WEAKER_STRIP_TAC;
2843   INTRO_TAC Jkqewgv.JKQEWGV2 [`s`;`vv`];
2844   ASM_REWRITE_TAC[LET_THM];
2845   DISCH_TAC;
2846   TYPED_ABBREV_TAC `V = IMAGE vv (:num)`;
2847   TYPED_ABBREV_TAC `E = IMAGE (\i. {vv i, vv (SUC i)}) (:num)`;
2848   TYPED_ABBREV_TAC `f = IMAGE (\i. (vv i,vv (SUC i))) (:num)`;
2849   TYPIFY `convex_local_fan(V,E,f)` (C SUBGOAL_THEN ASSUME_TAC);
2850     RULE_ASSUM_TAC (REWRITE_RULE[Appendix.BBs_v39;LET_THM]);
2851     BY(ASM_MESON_TAC[arith `3 < k ==> ~(k <= 3)`;LET_THM]);
2852   TYPIFY `~(?v w. lunar (v,w) V E)` ENOUGH_TO_SHOW_TAC;
2853     FIRST_X_ASSUM (MP_TAC o (MATCH_MP Local_lemmas.CVX_LO_IMP_LO));
2854     FIRST_X_ASSUM_ST `circular` MP_TAC;
2855     BY(MESON_TAC[Wrgcvdr_cizmrrh.CIZMRRH]);
2856   REPEAT WEAKER_STRIP_TAC;
2857   INTRO_TAC Jkqewgv.JKQEWGV3 [`s`;`vv`;`v`;`w`];
2858   ASM_REWRITE_TAC[LET_THM];
2859   TYPIFY `v IN V /\ w IN V` (C SUBGOAL_THEN ASSUME_TAC);
2860     RULE_ASSUM_TAC(REWRITE_RULE[Wrgcvdr_cizmrrh.lunar]);
2861     BY(FIRST_X_ASSUM MP_TAC THEN SET_TAC[]);
2862   TYPIFY `!v. v IN V ==> ?i. v = vv i` (C SUBGOAL_THEN ASSUME_TAC);
2863     GEN_TAC;
2864     EXPAND_TAC "V";
2865     BY(REWRITE_TAC[IN_IMAGE;IN_UNIV]);
2866   FIRST_X_ASSUM (C INTRO_TAC [`v`]);
2867   ASM_REWRITE_TAC[];
2868   REPEAT WEAKER_STRIP_TAC;
2869   INTRO_TAC (REWRITE_RULE[LET_THM] (GSYM INTERIOR_ANGLE1_AZIM)) [`s`;`vv`;`i`];
2870   ASM_REWRITE_TAC[IN];
2871   DISCH_TAC;
2872   FIRST_X_ASSUM_ST `pi` MP_TAC;
2873   ASM_REWRITE_TAC[];
2874   MATCH_MP_TAC (arith `y < x ==> ~(x < y)`);
2875   FIRST_X_ASSUM (C INTRO_TAC [`i`;`w`]);
2876   ANTS_TAC;
2877     BY(ASM_MESON_TAC[]);
2878   DISCH_TAC;
2879   MATCH_MP_TAC (UNDISCH SYNQIWN);
2880   TYPIFY `s` EXISTS_TAC;
2881   ASM_REWRITE_TAC[];
2882   TYPIFY_GOAL_THEN `cstab <= dist(vv (SUC i),vv(i+ scs_k_v39 s  - 1))` (unlist REWRITE_TAC);
2883     FIRST_X_ASSUM MATCH_MP_TAC;
2884     MATCH_MP_TAC scs_diag_2;
2885     BY(ASM_REWRITE_TAC[]);
2886   COMMENT "final kill";
2887   BY(FIRST_X_ASSUM MP_TAC THEN MESON_TAC[])
2888   ]);;
2889   (* }}} *)
2890
2891 let EAR_SOL_NN = prove_by_refinement(
2892   `main_nonlinear_terminal_v11 ==> ( !y1 y2 y3 y4 y5 y6.
2893     &2 <= y1  /\ y1 <= &2 * h0 /\
2894     &2 <= y2 /\ y2 <= &2 * h0 /\
2895     &2 <= y3 /\ y3 <= &2 * h0 /\
2896     cstab <= y4 /\ y4 <= #3.915 /\
2897     y5 = &2 /\
2898     y6 = &2 /\
2899         &0 <= delta_y y1 y2 y3 y4 y5 y6 ==>
2900         &0 <= sol_y y1 y2 y3 y4 y5 y6)`,
2901   (* {{{ proof *)
2902   [
2903   REPEAT WEAKER_STRIP_TAC;
2904   COMMENT "delta=0";
2905   ASM_CASES_TAC `delta_y y1 y2 y3 y4 y5 y6 = &0`;
2906     INTRO_TAC (UNDISCH Terminal.EAR_DIH1_DELTA_0) [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`];
2907     ANTS_TAC;
2908       BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
2909     DISCH_TAC;
2910     REWRITE_TAC[Sphere.sol_y];
2911     ASM_REWRITE_TAC[];
2912     INTRO_TAC Terminal.DIH_Y_NN [`y2`;`y3`;`y1`;`(&2)`;`(&2)`;`y4`];
2913     ANTS_TAC;
2914       FIRST_X_ASSUM_ST `delta_y` MP_TAC;
2915       ASM_REWRITE_TAC[Merge_ineq.delta_y_sym];
2916       BY(ASM_TAC THEN REAL_ARITH_TAC);
2917     INTRO_TAC Terminal.DIH_Y_NN [`y3`;`y1`;`y2`;`(&2)`;`y4`;`(&2)`];
2918     ANTS_TAC;
2919       FIRST_X_ASSUM_ST `delta_y` MP_TAC;
2920       ASM_REWRITE_TAC[Merge_ineq.delta_y_sym];
2921       BY(ASM_TAC THEN REAL_ARITH_TAC);
2922     BY(REAL_ARITH_TAC);
2923   COMMENT "replace  solid angle";
2924   TYPIFY `&0 < delta_y y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN MP_TAC);
2925     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
2926   DISCH_TAC;
2927   MATCH_MP_TAC (arith `&0 < x ==> &0 <= x`);
2928   REWRITE_TAC[Merge_ineq.sol_y_sol_x];
2929   MATCH_MP_TAC Terminal.sol_x_nn;
2930   REPEAT (GMATCH_SIMP_TAC REAL_LT_MUL_EQ);
2931   REWRITE_TAC[Trigonometry1.UPS_X_SQUARES];
2932   REPEAT (GMATCH_SIMP_TAC REAL_LT_MUL_EQ);
2933   TYPIFY `&0 < eulerA_x (y1 * y1) (y2 * y2) (y3 * y3) (y4 * y4) (y5 * y5) (y6 * y6)` (C SUBGOAL_THEN (unlist REWRITE_TAC));
2934     INTRO_TAC (Terminal.get_main_nonlinear "4821120729") [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`];
2935     REWRITE_TAC[Sphere.ineq;Sphere.y_of_x;arith `x > &0 <=> &0 < x`];
2936     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Appendix.cstab] THEN REAL_ARITH_TAC);
2937   TYPIFY `&0 < delta_x (y1 * y1) (y2 * y2) (y3 * y3) (y4 * y4) (y5 * y5) (y6 * y6)` (C SUBGOAL_THEN (unlist REWRITE_TAC));
2938     FIRST_X_ASSUM MP_TAC;
2939     BY(REWRITE_TAC[Sphere.delta_y]);
2940   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN (REWRITE_TAC[Appendix.cstab;Sphere.h0]) THEN REAL_ARITH_TAC)
2941   ]);;
2942   (* }}} *)
2943
2944 let scs_mk_unadorned_unadorned = prove_by_refinement(
2945   `!k d a b. unadorned_v39 (mk_unadorned_v39 k d a b)`,
2946   (* {{{ proof *)
2947   [
2948   BY(REWRITE_TAC[Appendix.unadorned_v39;Terminal.scs_unadorned_explicit])
2949   ]);;
2950   (* }}} *)
2951
2952 let scs_basic_unadorned = prove_by_refinement(
2953   `!k d a b. scs_basic_v39 (mk_unadorned_v39 k d a b)`,
2954   (* {{{ proof *)
2955   [
2956     BY(REWRITE_TAC[Appendix.scs_basic;Terminal.scs_unadorned_explicit;scs_mk_unadorned_unadorned])
2957   ]);;
2958   (* }}} *)
2959
2960 let scs_diag_cs_adj = prove_by_refinement(
2961   `!k a b i j. scs_diag k i j ==> cs_adj k a b i j = b`,
2962   (* {{{ proof *)
2963   [
2964   REWRITE_TAC[Appendix.scs_diag;Appendix.cs_adj];
2965   BY(ASM_MESON_TAC[])
2966   ]);;
2967   (* }}} *)
2968
2969 let cs_adj_SUC = prove_by_refinement(
2970   `!k a b i j. 1 < k ==> cs_adj k a b i (SUC i) = a`,
2971   (* {{{ proof *)
2972   [
2973   REWRITE_TAC[Appendix.scs_diag;Appendix.cs_adj];
2974   BY(MESON_TAC[Qknvmlb.SUC_MOD_NOT_EQ])
2975   ]);;
2976   (* }}} *)
2977
2978 let scs_6T1_props = prove_by_refinement(
2979   `scs_k_v39 scs_6T1 = 6 /\
2980     scs_basic_v39 scs_6T1 /\
2981     (!vv i j. BBs_v39 scs_6T1 vv /\ scs_diag 6 i j ==> cstab <= dist(vv i,vv j)) /\
2982     (!vv i. BBs_v39 scs_6T1 vv ==> dist(vv i, vv(SUC i)) = &2)`,
2983   (* {{{ proof *)
2984   [
2985   SUBCONJ_TAC;
2986     BY(REWRITE_TAC[Appendix.scs_6T1;Terminal.scs_unadorned_explicit;]);
2987   DISCH_TAC;
2988   SUBCONJ_TAC;
2989     BY(REWRITE_TAC[Appendix.scs_6T1;scs_basic_unadorned]);
2990   DISCH_TAC;
2991   MP_TAC (REWRITE_RULE[Appendix.scs_6T1] is_scs_6T1);
2992   REWRITE_TAC[Appendix.scs_6T1;Appendix.BBs_v39;Terminal.scs_unadorned_explicit;LET_THM;Appendix.is_scs_v39];
2993   REPEAT WEAKER_STRIP_TAC;
2994   CONJ_TAC;
2995     REPEAT WEAKER_STRIP_TAC;
2996     FIRST_X_ASSUM (MP_TAC o (MATCH_MP scs_diag_cs_adj));
2997     BY(FIRST_X_ASSUM_ST `cs_adj` MP_TAC THEN MESON_TAC[]);
2998   REPEAT WEAKER_STRIP_TAC;
2999   BY(FIRST_X_ASSUM_ST `cs_adj` MP_TAC THEN MESON_TAC[cs_adj_SUC;arith `&2 <= x /\ x <= &2 ==> x = &2`;arith `1 < 6`])
3000   ]);;
3001   (* }}} *)
3002
3003 let scs_6T1_generic = prove_by_refinement(
3004   `main_nonlinear_terminal_v11 ==> (!vv. 
3005      (let V = IMAGE vv (:num) in
3006       let E = IMAGE (\i. {vv i, vv (SUC i)}) (:num) in
3007         BBs_v39 scs_6T1 vv /\ taustar_v39 scs_6T1 vv < &0 ==> scs_generic vv))`,
3008   (* {{{ proof *)
3009   [
3010   REWRITE_TAC[LET_THM];
3011   REPEAT WEAKER_STRIP_TAC;
3012   MATCH_MP_TAC (UNDISCH (REWRITE_RULE[LET_THM] RRCWNS_WEAK));
3013   TYPIFY `scs_6T1` EXISTS_TAC;
3014   ASM_REWRITE_TAC[is_scs_6T1];
3015   ASSUME_TAC scs_6T1_props;
3016   ASM_REWRITE_TAC[];
3017   REWRITE_TAC[arith `3 < 6`;(REWRITE_RULE[GSYM Appendix.scs_6T1] is_scs_6T1)];
3018   CONJ_TAC;
3019     BY(ASM_MESON_TAC[]);
3020   REPEAT WEAKER_STRIP_TAC;
3021   REWRITE_TAC[arith `i+6 - 1 = i+5`];
3022   TYPIFY `dist(vv i,vv(i+5)) = dist(vv(i+5),vv(SUC(i+5)))` (C SUBGOAL_THEN SUBST1_TAC);
3023     TYPIFY `vv (SUC (i+5)) = vv(i)` ENOUGH_TO_SHOW_TAC;
3024       BY(DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[DIST_SYM]);
3025     RULE_ASSUM_TAC(REWRITE_RULE[Appendix.BBs_v39;LET_THM;scs_6T1_props;Sphere.periodic]);
3026     BY(ASM_REWRITE_TAC[arith `SUC (i+5) = i + 6`]);
3027   ASM_SIMP_TAC[];
3028   BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
3029   ]);;
3030   (* }}} *)
3031
3032 let empty_6T1 = prove_by_refinement(
3033   `main_nonlinear_terminal_v11 ==> 
3034            (!vv. BBs_v39 scs_6T1 vv ==> &0 <= taustar_v39 scs_6T1 vv)` ,
3035   (* {{{ proof *)
3036   [
3037   COMMENT "preliminaries, sol < pi";
3038   REPEAT WEAKER_STRIP_TAC;
3039   PROOF_BY_CONTR_TAC;
3040   ASSUME_TAC (REWRITE_RULE[GSYM Appendix.scs_6T1] (is_scs_6T1));
3041   COMMENT "new material";
3042   TYPIFY `!i j. i < 6 /\ j < 6 /\ vv i = vv j ==> i = j` (C SUBGOAL_THEN ASSUME_TAC);
3043     MATCH_MP_TAC vv_inj_lemma;
3044     BY(ASM_MESON_TAC[Appendix.scs_6T1;IN;Terminal.scs_unadorned_explicit]);
3045   INTRO_TAC Jkqewgv.JKQEWGV1 [`scs_6T1`;`vv`];
3046   ANTS_TAC;
3047     ASM_REWRITE_TAC[];
3048     ASM_SIMP_TAC[arith `~(&0 <= t) ==> (t < &0)`];
3049     REWRITE_TAC[Appendix.scs_6T1];
3050     ASM_REWRITE_TAC[Terminal.scs_unadorned_explicit];
3051     BY(ARITH_TAC);
3052   DISCH_TAC;
3053   TYPIFY `scs_generic vv` (C SUBGOAL_THEN ASSUME_TAC);
3054     MATCH_MP_TAC (REWRITE_RULE[LET_THM] (UNDISCH scs_6T1_generic));
3055     BY(ASM_REWRITE_TAC[] THEN ASM_TAC THEN REAL_ARITH_TAC);
3056   COMMENT "big expansion";
3057   REPEAT (FIRST_X_ASSUM MP_TAC);
3058   REWRITE_TAC[Appendix.taustar_v39;LET_DEF;LET_END_DEF;Appendix.BBs_v39;Terminal.scs_unadorned_explicit;Appendix.scs_6T1];
3059   REWRITE_TAC[arith `~(6 <= 3)`;Terminal.dsv_unadorned];
3060   REPEAT WEAKER_STRIP_TAC;
3061   PROOF_BY_CONTR_TAC;
3062   FIRST_X_ASSUM_ST `tau_fun` MP_TAC;
3063   REWRITE_TAC[];
3064   GMATCH_SIMP_TAC (REWRITE_RULE[LET_THM] Terminal.tau_fun_azim);
3065   TYPIFY `6` EXISTS_TAC;
3066   ASM_REWRITE_TAC[arith `3 <= 6`;arith `&6 - &2 = &4`];
3067   TYPIFY `!i. dist(vv i,vv (i+1)) = &2` (C SUBGOAL_THEN ASSUME_TAC);
3068     REPEAT WEAKER_STRIP_TAC;
3069     FIRST_X_ASSUM_ST `dist` (C INTRO_TAC [`i`;`i+1`]);
3070     REWRITE_TAC[Appendix.cs_adj;arith `i + 1 = SUC i`];
3071     SIMP_TAC[Qknvmlb.SUC_MOD_NOT_EQ;arith `1< 6`];
3072     BY(REAL_ARITH_TAC);
3073   COMMENT "end expansion";
3074   COMMENT "edge lengths";
3075   TYPIFY `!i. cstab <= dist(vv i,vv (i+2))` (C SUBGOAL_THEN ASSUME_TAC);
3076     REPEAT WEAKER_STRIP_TAC;
3077     FIRST_X_ASSUM_ST `dist` (C INTRO_TAC [`i`;`i+2`]);
3078     TYPIFY `cs_adj 6 (&2) cstab i (i+2) = cstab` ENOUGH_TO_SHOW_TAC;
3079       DISCH_THEN SUBST1_TAC;
3080       BY(MESON_TAC[]);
3081     REWRITE_TAC[Appendix.cs_adj];
3082     COND_CASES_TAC;
3083       FIRST_X_ASSUM MP_TAC;
3084       BY(MESON_TAC[arith `~(0=6) /\ (2 < 6) /\ ~(0=2)`;Oxl_2012.MOD_INJ1]);
3085     COND_CASES_TAC;
3086       FIRST_X_ASSUM MP_TAC;
3087       STRIP_TAC;
3088         FIRST_X_ASSUM MP_TAC;
3089         REWRITE_TAC[arith `SUC i = i+1 /\ i + 2 = (i+1) + 1`];
3090         BY(MESON_TAC[arith `~(0=6) /\ (1 < 6) /\ ~(0=1)`;Oxl_2012.MOD_INJ1]);
3091       FIRST_X_ASSUM MP_TAC;
3092       REWRITE_TAC[arith `SUC (i+2)=i+3`];
3093       BY(MESON_TAC[arith `~(0=6) /\ (3 < 6) /\ ~(0=3)`;Oxl_2012.MOD_INJ1]);
3094     BY(REWRITE_TAC[]);
3095   TYPIFY `!i. &2 <= norm (vv i) /\ norm (vv i) <= &2 * h0` (C SUBGOAL_THEN ASSUME_TAC);
3096     GEN_TAC;
3097     REWRITE_TAC[GSYM Fnjlbxs.in_ball_annulus];
3098     RULE_ASSUM_TAC(REWRITE_RULE[Terminal.IMAGE_SUBSET_IN;IN_UNIV]);
3099     BY(ASM_REWRITE_TAC[]);
3100   TYPIFY `!i. dist(vv i,vv(i+2)) <= &4` (C SUBGOAL_THEN ASSUME_TAC);
3101     GEN_TAC;
3102     MATCH_MP_TAC REAL_LE_TRANS;
3103     TYPIFY `dist(vv i,vv (i+1))  + dist(vv (i+1),vv(i+2))` EXISTS_TAC;
3104     CONJ_TAC;
3105       BY(REWRITE_TAC[DIST_TRIANGLE]);
3106     ASM_REWRITE_TAC[arith `i+2 = (i+1)+1`];
3107     BY(REAL_ARITH_TAC);
3108   TYPIFY `!i. dist(vv i,vv (i+2)) <= #3.915` (C SUBGOAL_THEN ASSUME_TAC);
3109     REPEAT WEAKER_STRIP_TAC;
3110     INTRO_TAC (Terminal.get_main_nonlinear "6459846571") [`norm(vv (i+1))`;`norm (vv i)`;`norm (vv (i+2))`;`dist(vv i,vv (i+2))`;`dist(vv (i+1),vv(i+2))`;`dist(vv i,vv(i+1))`];
3111     REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`];
3112     ANTS_TAC;
3113       ASM_REWRITE_TAC[arith `(i+2 = (i+1)+1)`];
3114       TYPIFY `#2.52 = &2 * h0` (C SUBGOAL_THEN SUBST1_TAC);
3115         BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
3116       ASM_REWRITE_TAC[arith `&2 <= &2`];
3117       CONJ_TAC;
3118         FIRST_X_ASSUM_ST `cstab` (C INTRO_TAC [`i`]);
3119         REWRITE_TAC[Sphere.cstab;arith `(i+1)+1 = i+2`];
3120         BY(REAL_ARITH_TAC);
3121       BY(FIRST_X_ASSUM (C INTRO_TAC [`i`]) THEN REWRITE_TAC[arith `(i+1)+1 = i+2`] THEN REAL_ARITH_TAC);
3122     TYPIFY `dist(vv i,vv(i+1)) = dist(vv(i+1),vv(i))` (C SUBGOAL_THEN SUBST1_TAC);
3123       BY(REWRITE_TAC[DIST_SYM]);
3124     REWRITE_TAC[arith `x < y <=> ~(y <= x)`;REWRITE_RULE[LET_THM] Tame_lemmas.delta_y_pos];
3125     BY(REAL_ARITH_TAC);
3126   COMMENT "azim le pi";
3127   TYPIFY `!i. azim (vec 0) (vv i) (vv (i+1)) (vv (i + 6 -1)) <= pi` (C SUBGOAL_THEN ASSUME_TAC);
3128     RULE_ASSUM_TAC(REWRITE_RULE[Localization.convex_local_fan]);
3129     ASM_TAC THEN REPEAT WEAKER_STRIP_TAC;
3130     REWRITE_TAC[arith `i+1 = SUC i`];
3131     GMATCH_SIMP_TAC (GSYM azim_in_fan_azim);
3132     TYPIFY `IMAGE (\i. {vv i, vv (SUC i)}) (:num)` EXISTS_TAC;
3133     ASM_REWRITE_TAC[arith `3 <= 6`];
3134     CONJ_TAC;
3135       BY(ASM_MESON_TAC[]);
3136     BY(ASM_MESON_TAC[IN_IMAGE;IN_UNIV]);
3137   COMMENT "expand sol_local";
3138   FIRST_X_ASSUM_ST `sol_local` MP_TAC;
3139   GMATCH_SIMP_TAC (REWRITE_RULE[LET_THM] sol_local_azim);
3140   TYPIFY `6` EXISTS_TAC;
3141   CONJ_TAC;
3142     BY(ASM_MESON_TAC[arith `3 <= 6`]);
3143   DISCH_TAC;
3144   COMMENT "split azim";
3145   RULE_ASSUM_TAC(REWRITE_RULE[Appendix.scs_generic]);
3146   TYPIFY `!i. azim(vec 0) (vv i) (vv (SUC i)) (vv (i + 5)) = azim(vec 0) (vv i) (vv (SUC i)) (vv (i+2)) + azim(vec 0) (vv i) (vv (i+2)) (vv (i+4)) + azim (vec 0) (vv i) (vv (i+4)) (vv (i+5))` (C SUBGOAL_THEN ASSUME_TAC);
3147     GEN_TAC;
3148     INTRO_TAC Terminal.vv_split_azim_generic [`vv`;`6`;`i`;`4`;`5`];
3149     ASM_REWRITE_TAC[LET_THM;arith `3 <= 6 /\ 0 < 4 /\ 4 < 5 /\ 5 < 6`];
3150     DISCH_THEN SUBST1_TAC;
3151     INTRO_TAC Terminal.vv_split_azim_generic [`vv`;`6`;`i`;`2`;`4`];
3152     ASM_REWRITE_TAC[LET_THM;arith `3 <= 6 /\ 0 < 2 /\ 2 < 4 /\ 4 < 6`];
3153     BY(REAL_ARITH_TAC);
3154   COMMENT "expand sums";
3155   FIRST_X_ASSUM_ST `sum` MP_TAC;
3156   TYPIFY `{i | i < 6 } = {0,1,2,3,4,5}` (C SUBGOAL_THEN SUBST1_TAC);
3157     REWRITE_TAC[EXTENSION;IN_ELIM_THM;IN_INSERT;NOT_IN_EMPTY];
3158     BY(ARITH_TAC);
3159   REPEAT (GMATCH_SIMP_TAC Marchal_cells_2_new.SUM_CLAUSES_alt THEN REWRITE_TAC[NOT_IN_EMPTY;IN_INSERT;arith `~(0=1)/\ ~(0=2)/\ ~(0=3) /\ ~(0=4) /\ ~(0=5) /\ ~(1=2) /\ ~(1 = 3) /\ ~(1 = 4) /\ ~(1=5) /\ ~(2 = 3) /\ ~(2 = 4) /\ ~(2 = 5) /\ ~(3 = 4) /\ ~(3 =5) /\ ~(4 = 5)`]);
3160   REWRITE_TAC[SUM_CLAUSES;Geomdetail.FINITE6];
3161   REWRITE_TAC[arith `i + 1 = SUC i`];
3162   FIRST_ASSUM (C INTRO_TAC [`0`]);
3163   FIRST_ASSUM (C INTRO_TAC [`2`]);
3164   FIRST_X_ASSUM (C INTRO_TAC [`4`]);
3165   FIRST_ASSUM (C INTRO_TAC [`0`]);
3166   FIRST_ASSUM (C INTRO_TAC [`1`]);
3167   FIRST_ASSUM (C INTRO_TAC [`2`]);
3168   FIRST_ASSUM (C INTRO_TAC [`3`]);
3169   FIRST_ASSUM (C INTRO_TAC [`4`]);
3170   FIRST_X_ASSUM (C INTRO_TAC [`5`]);
3171   REPEAT WEAKER_STRIP_TAC;
3172   TYPIFY `azim (vec 0) (vv 4) (vv (SUC 4)) (vv (4 + 2)) <= pi /\      azim (vec 0) (vv 4) (vv (4 + 2)) (vv (4 + 4)) <= pi /\       azim (vec 0) (vv 4) (vv (4 + 4)) (vv (4 + 5)) <= pi /\       azim (vec 0) (vv 2) (vv (SUC 2)) (vv (2 + 2)) <= pi /\       azim (vec 0) (vv 2) (vv (2 + 2)) (vv (2 + 4)) <= pi /\      azim (vec 0) (vv 2) (vv (2 + 4)) (vv (2 + 5)) <= pi /\       azim (vec 0) (vv 0) (vv (SUC 0)) (vv (0 + 2)) <= pi /\       azim (vec 0) (vv 0) (vv (0 + 2)) (vv (0 + 4)) <= pi /\       azim (vec 0) (vv 0) (vv (0 + 4)) (vv (0 + 5)) <= pi` (C SUBGOAL_THEN ASSUME_TAC);
3173     MP_TAC Counting_spheres.AZIM_NN;
3174     REPEAT (FIRST_X_ASSUM_ST `x <= pi` MP_TAC);
3175     ASM_REWRITE_TAC[arith `i + 1 = SUC i /\ 6 - 1 = 5`];
3176     BY(MESON_TAC[arith `&0 <= x /\ &0 <= y /\ &0 <= z /\ x + y + z <= pi ==> x <= pi /\ y <= pi /\ z <= pi`]);
3177   FIRST_X_ASSUM_ST `&6 - &2` MP_TAC;
3178   ASM_REWRITE_TAC[arith `6 - 1 = 5`];
3179   RULE_ASSUM_TAC(REWRITE_RULE[arith `6 - 1 = 5 /\ i + 1 = SUC i`]);
3180   COMMENT "collinearity";
3181   TYPIFY `!i j. ~(vv i = vv j) ==> ~collinear {vec 0,vv i,vv j}` (C SUBGOAL_THEN ASSUME_TAC);
3182     REPEAT WEAKER_STRIP_TAC;
3183     INTRO_TAC Nkezbfc_local.PROPERTIES_GENERIC_LOCAL_FAN [`IMAGE vv (:num)`;`IMAGE (\i. {vv i, vv (SUC i)}) (:num)`;`IMAGE (\i. vv i,vv (SUC i)) (:num)`;`vv i`];
3184     ASM_SIMP_TAC[Local_lemmas.CVX_LO_IMP_LO];
3185     REWRITE_TAC[Qknvmlb.IN_IMAGE_VV];
3186     DISCH_THEN (C INTRO_TAC [`vv j`]);
3187     BY(ASM_REWRITE_TAC[Qknvmlb.IN_IMAGE_VV]);
3188   COMMENT "convert to dih";
3189   ASSUME_TAC (arith `SUC 0 = 1 /\ SUC 1 = 2 /\ SUC 2 = 3 /\ SUC 3 = 4 /\ SUC 4 = 5 /\ SUC 5 = 6 /\ 0+2=2 /\ 0+4=4 /\ 0+5=5 /\ 1+5=6 /\ 3+5 = 8 /\ 5 + 5 = 10 /\ 2 + 2 = 4 /\ 2+4=6 /\ 2+5=7 /\ 4+2=6 /\ 4+4=8 /\ 4+5=9`);
3190   ASM_REWRITE_TAC[];
3191   TYPIFY `vv 6 = vv 0 /\ vv 7 = vv 1 /\ vv 8 = vv 2 /\ vv 9 = vv 3 /\ vv 10 = vv 4` (C SUBGOAL_THEN ASSUME_TAC);
3192     ONCE_REWRITE_TAC[arith `6 = 0 + 6 /\ 7 = 1 + 6 /\ 8 = 2 + 6 /\ 9 = 3 + 6 /\ 10 = 4 + 6`];
3193     FIRST_X_ASSUM_ST `periodic` MP_TAC;
3194     BY(SIMP_TAC [Sphere.periodic]);
3195   ASM_REWRITE_TAC[];
3196   REPEAT (FIRST_X_ASSUM_ST `azim` MP_TAC) THEN ASM_REWRITE_TAC[];
3197   REPEAT WEAKER_STRIP_TAC;
3198   TYPIFY `!i j. (i < 6 /\ j < 6 /\ ~(i = j)) ==> ~collinear {vec 0 ,vv i ,vv j}` (C SUBGOAL_THEN ASSUME_TAC);
3199     REPEAT WEAKER_STRIP_TAC;
3200     FIRST_X_ASSUM MP_TAC;
3201     REWRITE_TAC[];
3202     FIRST_X_ASSUM MATCH_MP_TAC;
3203     DISCH_TAC;
3204     FIRST_X_ASSUM_ST `~` MP_TAC;
3205     REWRITE_TAC[];
3206     FIRST_X_ASSUM MATCH_MP_TAC;
3207     BY(ASM_REWRITE_TAC[]);
3208   TYPIFY `azim (vec 0) (vv 0) (vv 1) (vv 2) = dihV (vec 0) (vv 0) (vv 1) (vv 2) /\        azim (vec 0) (vv 0) (vv 2) (vv 4) =         dihV (vec 0) (vv 0) (vv 2) (vv 4) /\        azim (vec 0) (vv 0) (vv 4) (vv 5) =        dihV (vec 0) (vv 0) (vv 4) (vv 5) /\       azim (vec 0) (vv 1) (vv 2) (vv 0) =       dihV (vec 0) (vv 1) (vv 2) (vv 0) /\       azim (vec 0) (vv 2) (vv 3) (vv 4) =       dihV (vec 0) (vv 2) (vv 3) (vv 4) /\        azim (vec 0) (vv 2) (vv 4) (vv 0) =        dihV (vec 0) (vv 2) (vv 4) (vv 0) /\        azim (vec 0) (vv 2) (vv 0) (vv 1) =        dihV (vec 0) (vv 2) (vv 0) (vv 1) /\       azim (vec 0) (vv 3) (vv 4) (vv 2) =       dihV (vec 0) (vv 3) (vv 4) (vv 2) /\       azim (vec 0) (vv 4) (vv 5) (vv 0) =       dihV (vec 0) (vv 4) (vv 5) (vv 0) /\        azim (vec 0) (vv 4) (vv 0) (vv 2) =        dihV (vec 0) (vv 4) (vv 0) (vv 2) /\        azim (vec 0) (vv 4) (vv 2) (vv 3) =        dihV (vec 0) (vv 4) (vv 2) (vv 3) /\       azim (vec 0) (vv 5) (vv 0) (vv 4)  =     dihV (vec 0) (vv 5) (vv 0) (vv 4)` (C SUBGOAL_THEN ASSUME_TAC);
3209     ASSUME_TAC (arith `0 < 6  /\ 1 < 6 /\ 2 < 6 /\ 3 < 6 /\ 4 < 6 /\ 5 < 6 /\ ~(0=1)/\ ~(0=2)/\ ~(0=3) /\ ~(0=4) /\ ~(0=5) /\ ~(1=2) /\ ~(1 = 3) /\ ~(1 = 4) /\ ~(1=5) /\ ~(2 = 3) /\ ~(2 = 4) /\ ~(2 = 5) /\ ~(3 = 4) /\ ~(3 =5) /\ ~(4 = 5)`);
3210     BY(REPEAT (CONJ_TAC) THEN MATCH_MP_TAC Polar_fan.AZIM_DIHV_SAME_STRONG THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]);
3211   ASM_REWRITE_TAC[];
3212   TYPIFY `#0.712 <= tau3 (vv 0) (vv 1) (vv 2) + tau3 (vv 0) (vv 2) (vv 4) + tau3 (vv 0) (vv 4) (vv 5) + tau3 (vv 2) (vv 3) (vv 4)` ENOUGH_TO_SHOW_TAC;
3213     ONCE_REWRITE_TAC[arith `&0 <= a - b - c <=> c <= a - b`];
3214     MATCH_MP_TAC (arith `d = #0.712 /\ ts = rs ==> (#0.712 <= ts ==> d <= rs)`);
3215     REWRITE_TAC[Appendix.d_tame;arith `~( 6=3) /\ ~(6 = 4) /\ ~(6 = 5)`];
3216     REWRITE_TAC[Appendix.tau3;Appendix.rho_rho_fun];
3217     BY(REAL_ARITH_TAC);
3218   REPEAT (GMATCH_SIMP_TAC Terminal.tau3_taum_40);
3219   ASM_REWRITE_TAC[];
3220   RULE_ASSUM_TAC(REWRITE_RULE[Terminal.IMAGE_SUBSET_IN;IN_UNIV]);
3221   ASM_REWRITE_TAC[];
3222   FIRST_X_ASSUM_ST `dist(a,b) = &2` MP_TAC;
3223   DISCH_TAC;
3224   FIRST_ASSUM (C INTRO_TAC [`0`]);
3225   FIRST_ASSUM (C INTRO_TAC [`1`]);
3226   FIRST_ASSUM (C INTRO_TAC [`2`]);
3227   FIRST_ASSUM (C INTRO_TAC [`3`]);
3228   FIRST_ASSUM (C INTRO_TAC [`4`]);
3229   FIRST_X_ASSUM (C INTRO_TAC [`5`]);
3230   ASM_REWRITE_TAC[DIST_SYM];
3231   REPEAT WEAKER_STRIP_TAC THEN ASM_REWRITE_TAC[];
3232   FIRST_X_ASSUM_ST `cstab <= dist(a,b)` MP_TAC;
3233   DISCH_TAC;
3234   FIRST_ASSUM (C INTRO_TAC [`0`]);
3235   FIRST_ASSUM (C INTRO_TAC [`2`]);
3236   FIRST_X_ASSUM (C INTRO_TAC [`4`]);
3237   ASM_REWRITE_TAC[DIST_SYM];
3238   REPEAT WEAKER_STRIP_TAC;
3239   FIRST_X_ASSUM_ST `dist(a,b) <= #3.915` MP_TAC;
3240   DISCH_TAC;
3241   FIRST_ASSUM (C INTRO_TAC [`0`]);
3242   FIRST_ASSUM (C INTRO_TAC [`2`]);
3243   FIRST_X_ASSUM (C INTRO_TAC [`4`]);
3244   ASM_REWRITE_TAC[DIST_SYM];
3245   REPEAT WEAKER_STRIP_TAC;
3246   REWRITE_TAC[TAUT `a /\ b /\ c <=> (a /\ b) /\ c`];
3247   CONJ_TAC;
3248     BY(REPLICATE_TAC 12 (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.cstab] THEN REAL_ARITH_TAC);
3249   COMMENT "introduce ineq";
3250   INTRO_TAC Pent_hex.terminal_hex_taum [`norm (vv 0)`;`norm (vv 2)`;`norm (vv 4)`;`dist (vv 2,vv 4)`;`dist(vv 0,vv 4)`;`dist(vv 0,vv 2)`;`norm (vv 3)`;`norm(vv 1)`;`norm (vv 5)`];
3251   REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`];
3252   ANTS_TAC;
3253     REPEAT (FIRST_X_ASSUM_ST `azim` kill);
3254     ASM_REWRITE_TAC[];
3255     TYPIFY `#2.52 = &2 * h0` (C SUBGOAL_THEN SUBST1_TAC);
3256       BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
3257     BY(ASM_REWRITE_TAC[DIST_SYM;GSYM Sphere.cstab]);
3258   COMMENT "break into final cases";
3259   STRIP_TAC;
3260           FIRST_X_ASSUM MP_TAC;
3261           REWRITE_TAC[DIST_SYM];
3262           REWRITE_TAC[Terminal.taum_sym];
3263           BY(REAL_ARITH_TAC);
3264         PROOF_BY_CONTR_TAC;
3265         FIRST_X_ASSUM_ST `delta_y` MP_TAC;
3266         INTRO_TAC Tame_lemmas.delta_y_pos [`vv 5`;`vv 0`;`vv 4`];
3267         ASM_REWRITE_TAC[LET_THM;DIST_SYM];
3268         BY(REAL_ARITH_TAC);
3269       PROOF_BY_CONTR_TAC;
3270       FIRST_X_ASSUM_ST `delta_y` MP_TAC;
3271       INTRO_TAC Tame_lemmas.delta_y_pos [`vv 1`;`vv 0`;`vv 2`];
3272       ASM_REWRITE_TAC[LET_THM;DIST_SYM];
3273       BY(REAL_ARITH_TAC);
3274     PROOF_BY_CONTR_TAC;
3275     FIRST_X_ASSUM_ST `delta_y` MP_TAC;
3276     INTRO_TAC Tame_lemmas.delta_y_pos [`vv 3`;`vv 2`;`vv 4`];
3277     ASM_REWRITE_TAC[LET_THM;DIST_SYM];
3278     BY(REAL_ARITH_TAC);
3279   PROOF_BY_CONTR_TAC;
3280   FIRST_X_ASSUM_ST `eulerA_x` MP_TAC;
3281   REWRITE_TAC[];
3282   MATCH_MP_TAC (arith ` e > &0 ==> ~(e < &0)`);
3283   INTRO_TAC (UNDISCH DIH_IMP_EULER_A_POS) [`(vec 0):real^3`;`vv 0`;`vv 2`;`vv 4`];
3284   REWRITE_TAC[Sphere.y_of_x;DIST_SYM;LET_THM;DIST_0];
3285   DISCH_THEN MATCH_MP_TAC;
3286   ASM_REWRITE_TAC[GSYM Sphere.cstab];
3287   TYPIFY_GOAL_THEN `~collinear {vec 0, vv 0, vv 2} /\ ~collinear {vec 0, vv 2, vv 4} /\ ~collinear {vec 0, vv 0, vv 4}` (unlist REWRITE_TAC);
3288     BY(REPEAT CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN REWRITE_TAC[arith `~(0=2) /\ ~(2 = 4) /\ ~(0=4) /\ 0 < 6 /\ 2 < 6 /\ 4 < 6`]);
3289   FIRST_X_ASSUM_ST `(&6 - &2)` MP_TAC;
3290   ASM_REWRITE_TAC[];
3291   TYPIFY `pi <= dihV (vec 0) (vv 1) (vv 2) (vv 0) + dihV (vec 0) (vv 2) (vv 0) (vv 1) + dihV (vec 0) (vv 0) (vv 1) (vv 2)  /\pi <= dihV (vec 0) (vv 3) (vv 4) (vv 2) + dihV (vec 0) (vv 4) (vv 2) (vv 3)+dihV (vec 0) (vv 2) (vv 3) (vv 4)  /\ pi <= dihV (vec 0) (vv 5) (vv 0) (vv 4) + dihV (vec 0) (vv 0) (vv 4) (vv 5) +dihV (vec 0) (vv 4) (vv 5) (vv 0) ` ENOUGH_TO_SHOW_TAC;
3292     REWRITE_TAC [DIHV_SYM];
3293     BY(REAL_ARITH_TAC);
3294   REPEAT (GMATCH_SIMP_TAC (REWRITE_RULE[LET_THM] Merge_ineq.DIHV_EQ_DIH_Y));
3295   FIRST_X_ASSUM_ST `collinear` (REPEAT o GMATCH_SIMP_TAC);
3296   REWRITE_TAC[arith `0 < 6 /\ 1 < 6 /\ 2 < 6 /\ 3 < 6 /\ 4 < 6 /\ 5 < 6 /\ ~(0=1)/\ ~(0=2)/\ ~(0=3) /\ ~(0=4) /\ ~(0=5) /\ ~(1=2) /\ ~(1 = 3) /\ ~(1 = 4) /\ ~(1=5) /\ ~(2 = 3) /\ ~(2 = 4) /\ ~(2 = 5) /\ ~(3 = 4) /\ ~(3 =5) /\ ~(4 = 5)`];
3297   REWRITE_TAC[arith `pi <= a + b + c <=> &0 <= a + b + c - pi`;GSYM Sphere.sol_y;DIST_SYM];
3298   REPEAT CONJ_TAC THEN (MATCH_MP_TAC (UNDISCH EAR_SOL_NN)) THEN ASM_REWRITE_TAC[DIST_0];
3299       INTRO_TAC Tame_lemmas.delta_y_pos [`vv 1`;`vv 2`;`vv 0`];
3300       BY(ASM_REWRITE_TAC[LET_THM;DIST_SYM]);
3301     INTRO_TAC Tame_lemmas.delta_y_pos [`vv 3`;`vv 4`;`vv 2`];
3302     BY(ASM_REWRITE_TAC[LET_THM;DIST_SYM]);
3303   INTRO_TAC Tame_lemmas.delta_y_pos [`vv 5`;`vv 0`;`vv 4`];
3304   BY(ASM_REWRITE_TAC[LET_THM;DIST_SYM])
3305   ]);;
3306   (* }}} *)
3307
3308 let is_scs_5T1 = prove_by_refinement(
3309   `is_scs_v39 (scs_5T1)`,
3310   (* {{{ proof *)
3311   [
3312   REWRITE_TAC[Appendix.scs_5T1];
3313   MATCH_MP_TAC is_scs_adj;
3314   REWRITE_TAC[Appendix.d_tame;Sphere.cstab];
3315   REWRITE_TAC[arith `~(5 = 3) /\ (3 <= 5) /\ (5 <= 6) /\ (3 < 5)`];
3316   BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
3317   ]);;
3318   (* }}} *)
3319
3320 let scs_5T1_props = prove_by_refinement(
3321   `scs_k_v39 scs_5T1 = 5 /\
3322     scs_basic_v39 scs_5T1 /\
3323     (!vv i j. BBs_v39 scs_5T1 vv /\ scs_diag 5 i j ==> cstab <= dist(vv i,vv j)) /\
3324     (!vv i. BBs_v39 scs_5T1 vv ==> dist(vv i, vv(SUC i)) = &2)`,
3325   (* {{{ proof *)
3326   [
3327   SUBCONJ_TAC;
3328     BY(REWRITE_TAC[Appendix.scs_5T1;Terminal.scs_unadorned_explicit;]);
3329   DISCH_TAC;
3330   SUBCONJ_TAC;
3331     BY(REWRITE_TAC[Appendix.scs_5T1;scs_basic_unadorned]);
3332   DISCH_TAC;
3333   MP_TAC is_scs_5T1;
3334   REWRITE_TAC[Appendix.scs_5T1;Appendix.BBs_v39;Terminal.scs_unadorned_explicit;LET_THM;Appendix.is_scs_v39];
3335   REPEAT WEAKER_STRIP_TAC;
3336   CONJ_TAC;
3337     REPEAT WEAKER_STRIP_TAC;
3338     FIRST_X_ASSUM (MP_TAC o (MATCH_MP scs_diag_cs_adj));
3339     BY(FIRST_X_ASSUM_ST `cs_adj` MP_TAC THEN MESON_TAC[]);
3340   REPEAT WEAKER_STRIP_TAC;
3341   BY(FIRST_X_ASSUM_ST `cs_adj` MP_TAC THEN MESON_TAC[cs_adj_SUC;arith `&2 <= x /\ x <= &2 ==> x = &2`;arith `1 < 5`])
3342   ]);;
3343   (* }}} *)
3344
3345 let scs_5T1_generic = prove_by_refinement(
3346   `main_nonlinear_terminal_v11 ==> (!vv. 
3347      (let V = IMAGE vv (:num) in
3348       let E = IMAGE (\i. {vv i, vv (SUC i)}) (:num) in
3349         BBs_v39 scs_5T1 vv /\ taustar_v39 scs_5T1 vv < &0 ==> scs_generic vv))`,
3350   (* {{{ proof *)
3351   [
3352   REWRITE_TAC[LET_THM];
3353   REPEAT WEAKER_STRIP_TAC;
3354   MATCH_MP_TAC (UNDISCH (REWRITE_RULE[LET_THM] RRCWNS_WEAK));
3355   TYPIFY `scs_5T1` EXISTS_TAC;
3356   ASM_REWRITE_TAC[is_scs_5T1];
3357   ASSUME_TAC scs_5T1_props;
3358   ASM_REWRITE_TAC[];
3359   REWRITE_TAC[arith `3 < 5`;(is_scs_5T1)];
3360   CONJ_TAC;
3361     BY(ASM_MESON_TAC[]);
3362   REPEAT WEAKER_STRIP_TAC;
3363   REWRITE_TAC[arith `i+5 - 1 = i+4`];
3364   TYPIFY `dist(vv i,vv(i+4)) = dist(vv(i+4),vv(SUC(i+4)))` (C SUBGOAL_THEN SUBST1_TAC);
3365     TYPIFY `vv (SUC (i+4)) = vv(i)` ENOUGH_TO_SHOW_TAC;
3366       BY(DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[DIST_SYM]);
3367     RULE_ASSUM_TAC(REWRITE_RULE[Appendix.BBs_v39;LET_THM;scs_5T1_props;Sphere.periodic]);
3368     BY(ASM_REWRITE_TAC[arith `SUC (i+4) = i + 5`]);
3369   ASM_SIMP_TAC[];
3370   BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
3371   ]);;
3372   (* }}} *)
3373
3374
3375
3376 let periodic_sum_shift = prove_by_refinement(
3377   `!j f n.
3378     periodic f n /\ ~(n = 0) ==>
3379     sum { i | i < n} f = sum {i | i < n } (\i. f (j+i))`,
3380   (* {{{ proof *)
3381   [
3382   REPEAT WEAKER_STRIP_TAC;
3383   INTRO_TAC Oxl_def.periodic_sum [`f`;`n`];
3384   ASM_REWRITE_TAC[];
3385   DISCH_THEN (C INTRO_TAC [`j`]);
3386   TYPIFY `(0.. n - 1) = {i | i < n}` (C SUBGOAL_THEN SUBST1_TAC);
3387     REWRITE_TAC[EXTENSION;IN_NUMSEG;IN_ELIM_THM];
3388     GEN_TAC;
3389     BY(ASM_TAC THEN ARITH_TAC);
3390   DISCH_THEN (SUBST1_TAC o GSYM);
3391   INTRO_TAC Oxl_def.BIJ_SUM [`{i | (i:num) < n}`;`j..n - 1 + j`;`f`;`(\i. j+(i:num))`];
3392   ANTS_TAC;
3393     REWRITE_TAC[BIJ;INJ;SURJ];
3394     SUBCONJ_TAC;
3395       REWRITE_TAC[IN_NUMSEG;IN_ELIM_THM];
3396       BY(ASM_TAC THEN ARITH_TAC);
3397     DISCH_THEN (unlist REWRITE_TAC);
3398     REWRITE_TAC[IN_NUMSEG;IN_ELIM_THM];
3399     REPEAT WEAKER_STRIP_TAC;
3400     TYPIFY `x - (j:num)` EXISTS_TAC;
3401     BY(ASM_TAC THEN ARITH_TAC);
3402   DISCH_THEN (SUBST1_TAC o GSYM);
3403   MATCH_MP_TAC SUM_EQ;
3404   BY(REWRITE_TAC[o_THM])
3405   ]);;
3406   (* }}} *)
3407
3408 let c110186 = Flyspeck_constants.calc `atn (sqrt (#0.110186)) < #0.3205`;;
3409
3410 let LEMMA_7175074394 = prove_by_refinement(
3411 `main_nonlinear_terminal_v11 ==> (!y1 y2 y3 y4 y5 y6. ineq [
3412     (&2,y1,#2.52);
3413     (&2,y2,#2.52);
3414     (&2,y3,#2.52);
3415     (&2,y4,&2);
3416     (#3.01,y5,#3.237);
3417       (&2,y6,&2)
3418   ]
3419 (
3420   (delta_y y1 y2 y3 y4 y5 y6 <= &20)  /\   (&0 <= delta_y y1 y2 y3 y4 y5 y6)  ==>
3421      (dih_y y1 y2 y3 y4 y5 y6 < #0.3205) 
3422  ))`,
3423   (* {{{ proof *)
3424   [
3425   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;LET_THM];
3426   REPEAT WEAKER_STRIP_TAC;
3427   INTRO_TAC (Terminal.get_main_nonlinear "2485876245a") [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`];
3428   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;LET_THM];
3429   ANTS_TAC;
3430     BY(ASM_TAC THEN REAL_ARITH_TAC);
3431   REWRITE_TAC[Sphere.delta4_y;Sphere.y_of_x];
3432   DISCH_TAC;
3433   INTRO_TAC (Terminal.get_main_nonlinear "7175074394") [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`];
3434   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;LET_THM];
3435   ASM_SIMP_TAC [arith `x <= &20 ==> ~(x > &20)`];
3436   DISCH_TAC;
3437   REWRITE_TAC[Sphere.dih_y;LET_THM];
3438   GMATCH_SIMP_TAC Merge_ineq.lindih_lt;
3439   GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
3440   CONJ_TAC;
3441     BY(ASM_TAC THEN REAL_ARITH_TAC);
3442   CONJ_TAC;
3443     CONJ_TAC;
3444       BY(MP_TAC Flyspeck_constants.bounds THEN REAL_ARITH_TAC);
3445     CONJ_TAC;
3446       BY(ASM_TAC THEN REAL_ARITH_TAC);
3447     BY(ASM_TAC THEN REAL_ARITH_TAC);
3448   TYPIFY `&0 <= (&4 *  (y1 * y1) *  delta_x (y1 * y1) (y2 * y2) (y3 * y3) (y4 * y4) (y5 * y5) (y6 * y6))` (C SUBGOAL_THEN ASSUME_TAC);
3449     REPEAT (GMATCH_SIMP_TAC REAL_LE_MUL);
3450     REWRITE_TAC[GSYM Sphere.delta_y];
3451     BY(ASM_TAC THEN REAL_ARITH_TAC);
3452   GMATCH_SIMP_TAC Pack1.bp_bdt;
3453   GMATCH_SIMP_TAC SQRT_POS_LE;
3454   ASM_REWRITE_TAC[];
3455   CONJ_TAC;
3456     GMATCH_SIMP_TAC REAL_LE_MUL;
3457     GMATCH_SIMP_TAC TAN_POS_PI2_LE;
3458     BY(MP_TAC Flyspeck_constants.bounds THEN ASM_TAC THEN REAL_ARITH_TAC);
3459   GMATCH_SIMP_TAC SQRT_POW_2;
3460   ASM_REWRITE_TAC[];
3461   MATCH_MP_TAC REAL_LT_TRANS;
3462   TYPIFY `#0.110186 * delta4_squared_y y1 y2 y3 y4 y5 y6` EXISTS_TAC;
3463   CONJ_TAC;
3464     FIRST_X_ASSUM_ST `x1_delta_y` MP_TAC;
3465     BY(REWRITE_TAC[Sphere.x1_delta_y;Sphere.delta4_squared_y;Sphere.y_of_x;Sphere.x1_delta_x]);
3466   REWRITE_TAC[Sphere.delta4_squared_y;Sphere.y_of_x;Sphere.delta4_squared_x];
3467   REWRITE_TAC[arith `(x * y) pow 2 = x pow 2 * y pow 2`];
3468   GMATCH_SIMP_TAC REAL_LT_RMUL_EQ;
3469   REWRITE_TAC[GSYM Trigonometry2.NOT_ZERO_EQ_POW2_LT];
3470   CONJ_TAC;
3471     BY(ASM_TAC THEN REAL_ARITH_TAC);
3472   TYPIFY `#0.110186 = sqrt(#0.110186) pow 2` (C SUBGOAL_THEN SUBST1_TAC);
3473     GMATCH_SIMP_TAC SQRT_POW_2;
3474     BY(REAL_ARITH_TAC);
3475   MATCH_MP_TAC Tame_inequalities.REAL_LT_SQUARE_POS;
3476   GMATCH_SIMP_TAC SQRT_POS_LT;
3477   CONJ_TAC;
3478     BY(REAL_ARITH_TAC);
3479   TYPIFY `atn(sqrt  #0.110186) < atn(tan  #0.3205)` ENOUGH_TO_SHOW_TAC;
3480     BY(REWRITE_TAC[ATN_MONO_LT_EQ]);
3481   GMATCH_SIMP_TAC TAN_ATN;
3482   CONJ_TAC;
3483     BY(MP_TAC Flyspeck_constants.bounds THEN REAL_ARITH_TAC);
3484   BY(REWRITE_TAC[c110186])
3485   ]);;
3486   (* }}} *)
3487
3488
3489 let angle_sum_5T1 = prove_by_refinement(
3490   `main_nonlinear_terminal_v11 ==> (!y1 y2 y3 y4 y5 y6 y126 y135.
3491     ineq [&2,y1,&2*h0;
3492           &2,y2,&2*h0;
3493           &2,y3,&2*h0;
3494           &2,y126,&2*h0;
3495           &2,y135,&2*h0;
3496           &2,y4,&2;
3497           cstab,y5,#3.237;
3498           cstab,y6,#3.237]
3499      (dih_y y1 y126 y135 cstab (&2) (&2) <=
3500      dih_y y1 y2 y3 y4 y5 y6 + dih_y y1 y2 y126 (&2) (&2) y6 + dih_y y1 y3 y135 (&2) (&2) y5 /\
3501    &0 <= delta_y y1 y2 y126 (&2) (&2) y6 /\ &0 <= delta_y y1 y3 y135 (&2) (&2) y5 ==>
3502        (&20 <= delta_y y1 y2 y126 (&2) (&2) y6 \/ &20 <= delta_y y1 y3 y135 (&2) (&2) y5)))
3503      `,
3504   (* {{{ proof *)
3505   [
3506   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`];
3507   REPEAT WEAKER_STRIP_TAC;
3508   PROOF_BY_CONTR_TAC;
3509   RULE_ASSUM_TAC(REWRITE_RULE[DE_MORGAN_THM;arith `~(x <= y) <=> y < x`]);
3510   TYPIFY `#2.52 = &2 * h0` (C SUBGOAL_THEN ASSUME_TAC);
3511     BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
3512   INTRO_TAC (Terminal.get_main_nonlinear "6789182745") [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`];
3513   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;GSYM Sphere.cstab];
3514   DISCH_TAC;
3515   INTRO_TAC (Terminal.get_main_nonlinear "4887115291") [`y1`;`y126`;`y135`;`cstab`;`(&2)`;`(&2)`];
3516   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;GSYM Sphere.cstab];
3517   REWRITE_TAC[arith `x <= x`];
3518   DISCH_TAC;
3519   INTRO_TAC (UNDISCH LEMMA_7175074394) [`y1`;`y126`;`y2`;`(&2)`;`y6`;`(&2)`];
3520   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;GSYM Sphere.cstab;LET_THM];
3521   INTRO_TAC (UNDISCH LEMMA_7175074394) [`y1`;`y135`;`y3`;`(&2)`;`y5`;`(&2)`];
3522   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;GSYM Sphere.cstab;LET_THM];
3523   ONCE_REWRITE_TAC[Nonlinear_lemma.dih_y_sym];
3524   REPEAT (FIRST_X_ASSUM_ST `delta_y` MP_TAC) THEN REWRITE_TAC[Pent_hex.delta_y_hex_cases] THEN REPEAT WEAKER_STRIP_TAC;
3525   BY(ASM_TAC THEN REAL_ARITH_TAC)
3526   ]);;
3527   (* }}} *)
3528
3529 let terminal_pent_taum2 = prove_by_refinement(
3530   `main_nonlinear_terminal_v11 ==> (!y1 y2 y3 y4 y5 y6 y126 y135.
3531       &0 <= delta_y y126 y1 y2 y6 (&2) (&2) /\
3532       &0 <= delta_y y135 y1 y3 y5 (&2) (&2) /\ 
3533       dih_y y1 y126 y135 cstab (&2) (&2) <=
3534          dih_y y1 y2 y3 y4 y5 y6 +
3535            dih_y y1 y2 y126 (&2) (&2) y6 +
3536            dih_y y1 y3 y135 (&2) (&2) y5
3537     ==>
3538      (ineq [
3539        (&2,y1,&2 * h0);
3540        (&2,y2,&2 * h0);
3541        (&2,y3,&2 * h0);
3542        (&2,y4,&2);
3543        (#3.01,y5,#3.237);
3544        (#3.01,y6,#3.237);
3545        (&2,y126,&2 * h0);
3546        (&2,y135,&2 * h0)
3547      ]
3548      (#0.616 < taum y126 y1 y2 y6 (&2) (&2) + taum y1 y2 y3 y4 y5 y6 + taum y135 y1 y3 y5 (&2) (&2))))
3549      `,
3550   (* {{{ proof *)
3551   [
3552   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`];
3553   REPEAT WEAKER_STRIP_TAC;
3554   INTRO_TAC (UNDISCH angle_sum_5T1) [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`;`y126`;`y135`];
3555   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`];
3556   ASM_REWRITE_TAC[Pent_hex.delta_y_hex_cases;Sphere.cstab];
3557   STRIP_TAC;
3558     INTRO_TAC (UNDISCH Pent_hex.terminal_pent_taum) [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`;`y126`;`y135`];
3559     BY(ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`]);
3560   INTRO_TAC (UNDISCH Pent_hex.terminal_pent_taum) [`y1`;`y3`;`y2`;`y4`;`y6`;`y5`;`y135`;`y126`];
3561   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`];
3562   TYPIFY `taum y1 y3 y2 y4 y6 y5 =    taum y1 y2 y3 y4 y5 y6` ENOUGH_TO_SHOW_TAC;
3563     BY(REAL_ARITH_TAC);
3564   BY(MESON_TAC[Terminal.taum_sym])
3565   ]);;
3566   (* }}} *)
3567
3568 let delta_diff4 = prove_by_refinement(
3569   `!x1 x2 x3 x4 x5 x6 z4.
3570     delta_x x1 x2 x3 x4 x5 x6 = delta_x x1 x2 x3 z4 x5 x6 + 
3571     delta_x4 x1 x2 x3 x4 x5 x6 * (x4 - z4) + x1 * (x4 - z4) pow 2`,
3572   (* {{{ proof *)
3573   [
3574    BY(REWRITE_TAC[Sphere.delta_x;Sphere.delta_x4] THEN REAL_ARITH_TAC)
3575   ]);;
3576   (* }}} *)
3577
3578 let dih_y_mono = prove_by_refinement(
3579   `!y1 y2 y3 y4 y5 y6 y4'.
3580     y4 <= y4' /\ &0 < y1 /\ &0 < y4 /\
3581     &0 < delta_y y1 y2 y3 y4 y5 y6 /\
3582     &0 <= delta_y y1 y2 y3 y4' y5 y6 ==>
3583     dih_y y1 y2 y3 y4 y5 y6 <= dih_y y1 y2 y3 y4' y5 y6`,
3584   (* {{{ proof *)
3585   [
3586   REPEAT WEAKER_STRIP_TAC;
3587   TYPIFY `y4 = y4'` ASM_CASES_TAC;
3588     BY(ASM_REWRITE_TAC[arith `x <= x`]);
3589   ASM_CASES_TAC `&0 < delta_y y1 y2 y3 y4' y5 y6`;
3590     REWRITE_TAC[Sphere.dih_y;LET_THM];
3591     MATCH_MP_TAC (arith `x < y ==> x <= y`);
3592     MATCH_MP_TAC Tame_inequalities.DIH_X_MONO_LT_4;
3593     GMATCH_SIMP_TAC Misc_defs_and_lemmas.ABS_SQUARE;
3594     GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
3595     ASM_REWRITE_TAC[GSYM Sphere.delta_y];
3596     BY(ASM_TAC THEN REAL_ARITH_TAC);
3597   TYPIFY `delta_y y1 y2 y3 y4' y5 y6 = &0` (C SUBGOAL_THEN ASSUME_TAC);
3598     BY(ASM_TAC THEN REAL_ARITH_TAC);
3599   ASM_CASES_TAC `delta4_y y1 y2 y3 y4' y5 y6 <= &0`;
3600     MATCH_MP_TAC REAL_LE_TRANS;
3601     TYPIFY `pi` EXISTS_TAC;
3602     CONJ_TAC;
3603       REWRITE_TAC[Sphere.dih_y;LET_THM];
3604       MATCH_MP_TAC (arith (`x < y ==> x <= y`));
3605       MATCH_MP_TAC Oxlzlez.DIH_X_LT_PI;
3606       GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
3607       BY(ASM_REWRITE_TAC[GSYM Sphere.delta_y]);
3608     ASM_REWRITE_TAC[Sphere.dih_y;LET_THM;Sphere.dih_x;GSYM Sphere.delta_y];
3609     REWRITE_TAC[arith `x * &0 = &0`;SQRT_0];
3610     ASM_CASES_TAC `delta4_y y1 y2 y3 y4' y5 y6 = &0`;
3611       RULE_ASSUM_TAC(REWRITE_RULE[Sphere.y_of_x;Sphere.delta4_y]);
3612       ASM_REWRITE_TAC[];
3613       BY(MESON_TAC[arith `-- &0 = &0`;Merge_ineq.atn2_0;PI_POS;arith `&0 < x ==> x <= x / &2 + x`]);
3614     TYPIFY `delta4_y y1 y2 y3 y4' y5 y6 < &0` (C SUBGOAL_THEN MP_TAC);
3615       BY(ASM_TAC THEN REAL_ARITH_TAC);
3616     REWRITE_TAC[Sphere.y_of_x;Sphere.delta4_y];
3617     TYPED_ABBREV_TAC `u = delta_x4 (y1 * y1) (y2 * y2) (y3 * y3) (y4' * y4') (y5 * y5) (y6 * y6)`;
3618     BY(MESON_TAC[arith `u < &0 ==> &0 < -- u`;Merge_ineq.atn2_0;arith `x <= x / &2 + x / &2`]);
3619   INTRO_TAC delta_diff4 [`y1*y1`;`y2*y2`;`y3*y3`;`y4'*y4'`;`y5*y5`;`y6*y6`;`y4*y4`];
3620   RULE_ASSUM_TAC(REWRITE_RULE[Sphere.delta_y;Sphere.delta4_y;Sphere.y_of_x]);
3621   ASM_REWRITE_TAC[];
3622   ENOUGH_TO_SHOW_TAC `&0  < delta_x (y1 * y1) (y2 * y2) (y3 * y3) (y4 * y4) (y5 * y5) (y6 * y6)  /\ &0 <= delta_x4 (y1 * y1) (y2 * y2) (y3 * y3) (y4' * y4') (y5 * y5) (y6 * y6) * (y4' * y4' - y4 * y4)  /\ &0 <= (y1 * y1) * (y4' * y4' - y4 * y4) pow 2`;
3623     BY(REAL_ARITH_TAC);
3624   ASM_REWRITE_TAC[];
3625   CONJ_TAC;
3626     GMATCH_SIMP_TAC REAL_LE_MUL;
3627     REWRITE_TAC[arith `&0 <= a - b <=> b <= a`];
3628     GMATCH_SIMP_TAC Misc_defs_and_lemmas.ABS_SQUARE_LE;
3629     BY(ASM_TAC THEN REAL_ARITH_TAC);
3630   GMATCH_SIMP_TAC REAL_LE_MUL;
3631   REWRITE_TAC[ REAL_LE_POW_2];
3632   BY(REWRITE_TAC[ REAL_LE_SQUARE])
3633   ]);;
3634   (* }}} *)
3635
3636 let MOD_EQ_MOD_SHIFT = prove_by_refinement(
3637    `!n x1 x2 y. ~(n=0) ==> (((y + x1) MOD n = (y + x2) MOD n) <=> (x1 MOD n = x2 MOD n))`,
3638   (* {{{ proof *)
3639   [
3640   REPEAT WEAKER_STRIP_TAC;
3641   MATCH_MP_TAC (TAUT `((a ==> b) /\ (b ==> a)) ==> (a <=> b)`);
3642   CONJ_TAC;
3643     BY(ASM_MESON_TAC[Hdplygy.MOD_EQ_MOD]);
3644   BY(ASM_MESON_TAC[MOD_ADD_MOD])
3645   ]);;
3646   (* }}} *)
3647
3648 let empty_5T1 = prove_by_refinement(
3649   `main_nonlinear_terminal_v11 ==> 
3650            (!vv. BBs_v39 scs_5T1 vv ==> &0 <= taustar_v39 scs_5T1 vv)` ,
3651   (* {{{ proof *)
3652   [
3653   REPEAT WEAKER_STRIP_TAC;
3654   PROOF_BY_CONTR_TAC;
3655   ASSUME_TAC ((is_scs_5T1));
3656   COMMENT "new material";
3657   TYPIFY `!i j. i < 5 /\ j < 5 /\ vv i = vv j ==> i = j` (C SUBGOAL_THEN ASSUME_TAC);
3658     MATCH_MP_TAC vv_inj_lemma;
3659     BY(ASM_MESON_TAC[Appendix.scs_5T1;IN;Terminal.scs_unadorned_explicit]);
3660   TYPIFY `scs_generic vv` (C SUBGOAL_THEN ASSUME_TAC);
3661     MATCH_MP_TAC (REWRITE_RULE[LET_THM] (UNDISCH scs_5T1_generic));
3662     BY(ASM_REWRITE_TAC[] THEN ASM_TAC THEN REAL_ARITH_TAC);
3663   COMMENT "big expansion";
3664   REPEAT (FIRST_X_ASSUM MP_TAC);
3665   REWRITE_TAC[Appendix.taustar_v39;LET_DEF;LET_END_DEF;Appendix.BBs_v39;Terminal.scs_unadorned_explicit;Appendix.scs_5T1];
3666   REWRITE_TAC[arith `~(5 <= 3)`;Terminal.dsv_unadorned];
3667   REPEAT WEAKER_STRIP_TAC;
3668   FIRST_X_ASSUM_ST `tau_fun` MP_TAC;
3669   REWRITE_TAC[];
3670   GMATCH_SIMP_TAC (REWRITE_RULE[LET_THM] Terminal.tau_fun_azim);
3671   TYPIFY `5` EXISTS_TAC;
3672   ASM_REWRITE_TAC[arith `3 <= 5`;arith `&5 - &2 = &3`];
3673   TYPIFY `!i. dist(vv i,vv (i+1)) = &2` (C SUBGOAL_THEN ASSUME_TAC);
3674     REPEAT WEAKER_STRIP_TAC;
3675     FIRST_X_ASSUM_ST `dist` (C INTRO_TAC [`i`;`i+1`]);
3676     REWRITE_TAC[Appendix.cs_adj;arith `i + 1 = SUC i`];
3677     SIMP_TAC[Qknvmlb.SUC_MOD_NOT_EQ;arith `1< 5`];
3678     BY(REAL_ARITH_TAC);
3679   COMMENT "end expansion";
3680   COMMENT "edge lengths";
3681   TYPIFY `!i. cstab <= dist(vv i,vv (i+2))` (C SUBGOAL_THEN ASSUME_TAC);
3682     REPEAT WEAKER_STRIP_TAC;
3683     FIRST_X_ASSUM_ST `dist` (C INTRO_TAC [`i`;`i+2`]);
3684     TYPIFY `cs_adj 5 (&2) cstab i (i+2) = cstab` ENOUGH_TO_SHOW_TAC;
3685       DISCH_THEN SUBST1_TAC;
3686       BY(MESON_TAC[]);
3687     REWRITE_TAC[Appendix.cs_adj];
3688     COND_CASES_TAC;
3689       FIRST_X_ASSUM MP_TAC;
3690       BY(MESON_TAC[arith `~(0=5) /\ (2 < 5) /\ ~(0=2)`;Oxl_2012.MOD_INJ1]);
3691     COND_CASES_TAC;
3692       FIRST_X_ASSUM MP_TAC;
3693       STRIP_TAC;
3694         FIRST_X_ASSUM MP_TAC;
3695         REWRITE_TAC[arith `SUC i = i+1 /\ i + 2 = (i+1) + 1`];
3696         BY(MESON_TAC[arith `~(0=5) /\ (1 < 5) /\ ~(0=1)`;Oxl_2012.MOD_INJ1]);
3697       FIRST_X_ASSUM MP_TAC;
3698       REWRITE_TAC[arith `SUC (i+2)=i+3`];
3699       BY(MESON_TAC[arith `~(0=5) /\ (3 < 5) /\ ~(0=3)`;Oxl_2012.MOD_INJ1]);
3700     BY(REWRITE_TAC[]);
3701   COMMENT "second diag";
3702   TYPIFY `!i. cstab <= dist(vv i,vv (i+3))` (C SUBGOAL_THEN ASSUME_TAC);
3703     REPEAT WEAKER_STRIP_TAC;
3704     FIRST_X_ASSUM_ST `dist` (C INTRO_TAC [`i`;`i+3`]);
3705     TYPIFY `cs_adj 5 (&2) cstab i (i+3) = cstab` ENOUGH_TO_SHOW_TAC;
3706       DISCH_THEN SUBST1_TAC;
3707       BY(MESON_TAC[]);
3708     REWRITE_TAC[Appendix.cs_adj];
3709     COND_CASES_TAC;
3710       FIRST_X_ASSUM MP_TAC;
3711       BY(MESON_TAC[arith `~(0=5) /\ (3 < 5) /\ ~(0=3)`;Oxl_2012.MOD_INJ1]);
3712     COND_CASES_TAC;
3713       FIRST_X_ASSUM MP_TAC;
3714       STRIP_TAC;
3715         FIRST_X_ASSUM MP_TAC;
3716         REWRITE_TAC[arith `SUC i = i+1 /\ i + 3 = (i+1) + 2`];
3717         BY(MESON_TAC[arith `~(0=5) /\ (2 < 5) /\ ~(0=2)`;Oxl_2012.MOD_INJ1]);
3718       FIRST_X_ASSUM MP_TAC;
3719       REWRITE_TAC[arith `SUC (i+3)=i+4`];
3720       BY(MESON_TAC[arith `~(0=5) /\ (4 < 5) /\ ~(0=4)`;Oxl_2012.MOD_INJ1]);
3721     BY(REWRITE_TAC[]);
3722   COMMENT "more distances";
3723   TYPIFY `!i. &2 <= norm (vv i) /\ norm (vv i) <= &2 * h0` (C SUBGOAL_THEN ASSUME_TAC);
3724     GEN_TAC;
3725     REWRITE_TAC[GSYM Fnjlbxs.in_ball_annulus];
3726     RULE_ASSUM_TAC(REWRITE_RULE[Terminal.IMAGE_SUBSET_IN;IN_UNIV]);
3727     BY(ASM_REWRITE_TAC[]);
3728   TYPIFY `!i j. i < 5 /\ j < 5 /\ ~(i = j) ==> &2 <= dist(vv i,vv j)` (C SUBGOAL_THEN ASSUME_TAC);
3729     REPEAT WEAKER_STRIP_TAC;
3730     FIRST_X_ASSUM (C INTRO_TAC [`i`;`j`]);
3731     ASM_REWRITE_TAC[];
3732     DISCH_TAC;
3733     FIRST_X_ASSUM (C INTRO_TAC [`i`;`j`]);
3734     ASM_REWRITE_TAC[Appendix.cs_adj];
3735     COND_CASES_TAC;
3736       BY(ASM_MESON_TAC[MOD_LT]);
3737     TYPIFY `&2 <= cstab` (C SUBGOAL_THEN MP_TAC);
3738       BY(REWRITE_TAC[Sphere.cstab] THEN REAL_ARITH_TAC);
3739     BY(REAL_ARITH_TAC);
3740   COMMENT "1+sqrt(5)";
3741   TYPIFY `?j. j < 5 /\ dist(vv j,vv (j+2)) <= &1 + sqrt(&5) /\ dist(vv j,vv (j+3)) <= &1 + sqrt(&5)` (C SUBGOAL_THEN MP_TAC);
3742     INTRO_TAC Vpwshto.VPWSHTO_PRIME [`vv`];
3743     ANTS_TAC;
3744       ONCE_REWRITE_TAC[GSYM dist];
3745       CONJ_TAC;
3746         RULE_ASSUM_TAC(REWRITE_RULE[Terminal.IMAGE_SUBSET_IN;IN_UNIV]);
3747         BY(FIRST_X_ASSUM_ST `ball_annulus` MP_TAC THEN SET_TAC[]);
3748       REWRITE_TAC[Sphere.packing];
3749       TYPIFY_GOAL_THEN `!a b c d e (f:real^3). {a,b,c,d,e} f <=> (f = a \/ f = b \/ f = c \/ f = d \/ f = e)` (unlist REWRITE_TAC);
3750         REWRITE_TAC[INSERT;IN_ELIM_THM;NOT_IN_EMPTY];
3751         BY(MESON_TAC[]);
3752       CONJ_TAC;
3753         REPEAT WEAKER_STRIP_TAC;
3754         TYPIFY `?i j. u  = vv i /\ v = vv j /\ i < 5 /\ j < 5 /\ ~(i=j)` (C SUBGOAL_THEN MP_TAC);
3755           BY(ASM_MESON_TAC[arith `0 < 5 /\ 1 < 5 /\ 2 < 5 /\ 3 < 5 /\ 4 < 5`]);
3756         REPEAT WEAKER_STRIP_TAC;
3757         ASM_REWRITE_TAC[];
3758         FIRST_X_ASSUM MATCH_MP_TAC;
3759         BY(ASM_REWRITE_TAC[]);
3760       TYPIFY_GOAL_THEN `~(vv 0 = vv 1) /\ ~(vv 0 = vv 1) /\ ~(vv 0 = vv 2) /\ ~(vv 0 = vv 3) /\ ~(vv 0 = vv 4) /\ ~(vv 1 = vv 2) /\ ~(vv 1 = vv 3) /\ ~(vv 1 = vv 4) /\ ~(vv 2 = vv 3) /\ ~(vv 2 = vv 4) /\ ~(vv 3 = vv 4)` (unlist REWRITE_TAC);
3761         TYPIFY `!i j. i < 5 /\ j < 5 /\ ~(i = j) ==> ~(vv i = vv j)` (C SUBGOAL_THEN ASSUME_TAC);
3762           BY(ASM_MESON_TAC[]);
3763         BY(REPEAT CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ARITH_TAC);
3764       TYPIFY `vv 0 = vv 5` (C SUBGOAL_THEN ASSUME_TAC);
3765         ONCE_REWRITE_TAC[arith `5 = 0 +5`];
3766         BY(ASM_MESON_TAC[Sphere.periodic]);
3767       BY(ASM_MESON_TAC[arith `1 = 0+1 /\ 2 = 1+1 /\ 3 = 2+1  /\ 4 = 3+1 /\ 5 = 4+1`]);
3768     REWRITE_TAC[GSYM dist];
3769     REPEAT WEAKER_STRIP_TAC;
3770     TYPIFY `i` EXISTS_TAC;
3771     CONJ_TAC;
3772       FIRST_X_ASSUM_ST `IN` MP_TAC;
3773       REWRITE_TAC[IN_NUMSEG];
3774       BY(ARITH_TAC);
3775     BY(ASM_MESON_TAC[Oxl_def.periodic_mod;arith `~(5=0)`]);
3776   REPEAT WEAKER_STRIP_TAC;
3777   COMMENT "pick up the hex flow again";
3778   COMMENT "azim le pi";
3779   TYPIFY `!i. azim (vec 0) (vv i) (vv (i+1)) (vv (i + 5 -1)) <= pi` (C SUBGOAL_THEN ASSUME_TAC);
3780     RULE_ASSUM_TAC(REWRITE_RULE[Localization.convex_local_fan]);
3781     ASM_TAC THEN REPEAT WEAKER_STRIP_TAC;
3782     REWRITE_TAC[arith `i+1 = SUC i`];
3783     GMATCH_SIMP_TAC (GSYM azim_in_fan_azim);
3784     TYPIFY `IMAGE (\i. {vv i, vv (SUC i)}) (:num)` EXISTS_TAC;
3785     ASM_REWRITE_TAC[arith `3 <= 5`];
3786     CONJ_TAC;
3787       BY(ASM_MESON_TAC[]);
3788     BY(ASM_MESON_TAC[IN_IMAGE;IN_UNIV]);
3789   COMMENT "split azim";
3790   RULE_ASSUM_TAC(REWRITE_RULE[Appendix.scs_generic]);
3791   TYPIFY `azim(vec 0) (vv j) (vv (SUC j)) (vv (j + 4)) = azim(vec 0) (vv j) (vv (SUC j)) (vv (j+2)) + azim(vec 0) (vv j) (vv (j+2)) (vv (j+3)) + azim (vec 0) (vv j) (vv (j+3)) (vv (j+4))` (C SUBGOAL_THEN ASSUME_TAC);
3792     INTRO_TAC Terminal.vv_split_azim_generic [`vv`;`5`;`j`;`3`;`4`];
3793     ASM_REWRITE_TAC[LET_THM;arith `3 <= 5 /\ 0 < 3 /\ 3 < 4 /\ 4 < 5`];
3794     DISCH_THEN SUBST1_TAC;
3795     INTRO_TAC Terminal.vv_split_azim_generic [`vv`;`5`;`j`;`2`;`3`];
3796     ASM_REWRITE_TAC[LET_THM;arith `3 <= 5 /\ 0 < 2 /\ 2 < 3 /\ 3 < 5`];
3797     BY(REAL_ARITH_TAC);
3798   COMMENT "split at j+2 and j+3";
3799   TYPIFY `vv (j+5) = vv j /\ vv (j+6) = vv(j+1) /\ vv (j+7) = vv(j+2) /\ vv(j+8)=vv(j+3) /\ vv(j+9) = vv(j+4)` (C SUBGOAL_THEN ASSUME_TAC);
3800     FIRST_X_ASSUM_ST `periodic` MP_TAC;
3801     BY(MESON_TAC[Sphere.periodic;arith `j+6 = (j+1)+5 /\ j+7 = (j+2)+5 /\ j+8 = (j+3)+5 /\ j+9 = (j+4)+5`]);
3802   ASSUME_TAC (arith `SUC(j) = j+1 /\ SUC(j+1)=j+2 /\ SUC(j+2)=j+3 /\ SUC(j+3)=j+4 /\ SUC(j+4)=j+5`);
3803   TYPIFY `azim(vec 0) (vv (j+2)) (vv(SUC (j+2))) (vv (j+1)) = azim(vec 0) (vv (j+2)) (vv(SUC (j+2))) (vv(j)) + azim(vec 0) (vv (j+2)) (vv j) (vv (j+1))` (C SUBGOAL_THEN ASSUME_TAC);
3804     INTRO_TAC Terminal.vv_split_azim_generic [`vv`;`5`;`j+2`;`3`;`4`];
3805     ASM_REWRITE_TAC[LET_THM;arith `3 <= 5 /\ 0 < 3 /\ 3 < 4 /\ 4 < 5`];
3806     BY(ASM_REWRITE_TAC[arith `(a +b)+(c:num) = a+(b+c) /\ 2+4=6 /\ 2+3 = 5`]);
3807   TYPIFY `azim (vec 0) (vv(j+3)) (vv(j+4)) (vv(j+2)) = azim(vec 0) (vv(j+3)) (vv(j+4)) (vv j) + azim(vec 0) (vv(j+3)) (vv j) (vv (j+2))` (C SUBGOAL_THEN ASSUME_TAC);
3808     INTRO_TAC Terminal.vv_split_azim_generic [`vv`;`5`;`j+3`;`2`;`4`];
3809     ASM_REWRITE_TAC[LET_THM;arith `3 <= 5 /\ 0 < 2 /\ 2 < 4 /\ 4 < 5`];
3810     BY(ASM_REWRITE_TAC[arith `(a +b)+(c:num) = a+(b+c) /\ 3+4=7 /\ 3+2 = 5`]);
3811   COMMENT "expand sum";
3812   INTRO_TAC periodic_sum_shift [`j`];
3813   DISCH_THEN GMATCH_SIMP_TAC;
3814   CONJ_TAC;
3815     REWRITE_TAC[arith `~(5 = 0)`;Sphere.periodic];
3816     GEN_TAC;
3817     REWRITE_TAC[arith `(i+5) + j = (i+j) + 5`];
3818     RULE_ASSUM_TAC(REWRITE_RULE[Sphere.periodic]);
3819     BY(ASM_REWRITE_TAC[]);
3820   TYPIFY `{i | i < 5 } = {0,1,2,3,4}` (C SUBGOAL_THEN SUBST1_TAC);
3821     REWRITE_TAC[EXTENSION;IN_ELIM_THM;IN_INSERT;NOT_IN_EMPTY];
3822     BY(ARITH_TAC);
3823   REPEAT (GMATCH_SIMP_TAC Marchal_cells_2_new.SUM_CLAUSES_alt THEN REWRITE_TAC[NOT_IN_EMPTY;IN_INSERT;arith `~(0=1)/\ ~(0=2)/\ ~(0=3) /\ ~(0=4) /\ ~(0=5) /\ ~(1=2) /\ ~(1 = 3) /\ ~(1 = 4) /\ ~(1=5) /\ ~(2 = 3) /\ ~(2 = 4) /\ ~(2 = 5) /\ ~(3 = 4) /\ ~(3 =5) /\ ~(4 = 5)`]);
3824   REWRITE_TAC[SUM_CLAUSES;Geomdetail.FINITE6];
3825   FIRST_ASSUM (C INTRO_TAC [`j`]);
3826   FIRST_ASSUM (C INTRO_TAC [`j+1`]);
3827   FIRST_ASSUM (C INTRO_TAC [`j+2`]);
3828   FIRST_ASSUM (C INTRO_TAC [`j+3`]);
3829   FIRST_X_ASSUM (C INTRO_TAC [`j+4`]);
3830   REWRITE_TAC[arith `5-1=4`];
3831   REPEAT (FIRST_X_ASSUM_ST `azim` MP_TAC);
3832   REWRITE_TAC[arith `(a+b)+(c:num) = a+b+c`;arith `SUC i = i+1`];
3833   NUM_REDUCE_TAC;
3834   ASM_REWRITE_TAC[];
3835   COMMENT "start again here";
3836   REPEAT WEAKER_STRIP_TAC;
3837   TYPIFY `azim (vec 0) (vv j) (vv (j + 3)) (vv (j + 4)) <= pi /\ azim (vec 0) (vv j) (vv (j + 1)) (vv (j + 2)) <= pi /\       azim (vec 0) (vv j) (vv (j + 2)) (vv (j + 3)) <= pi /\ azim (vec 0) (vv (j + 2)) (vv (j + 3)) (vv j) <= pi /\       azim (vec 0) (vv (j + 2)) (vv j) (vv (j + 1)) <= pi /\ azim (vec 0) (vv (j + 3)) (vv (j + 4)) (vv j) <= pi /\       azim (vec 0) (vv (j + 3)) (vv j) (vv (j + 2)) <= pi`(C SUBGOAL_THEN ASSUME_TAC);
3838     MP_TAC Counting_spheres.AZIM_NN;
3839     REPEAT (FIRST_X_ASSUM_ST `x <= pi` MP_TAC);
3840     REPLICATE_TAC 3 (FIRST_X_ASSUM MP_TAC);
3841     BY(MESON_TAC[arith `&0 <= x /\ &0 <= y /\ &0 <= z /\ x + y + z <= pi ==> x <= pi /\ y <= pi /\ z <= pi`;arith `&0 <= x /\ &0 <= y /\ x + y <= pi ==> x <= pi /\ y <= pi`]);
3842   COMMENT "collinearity";
3843   TYPIFY `!i i'. (i < 5 /\ i' < 5 /\ ~(i=i')) ==> ~collinear {vec 0,vv (j+i),vv (j+i')}` (C SUBGOAL_THEN ASSUME_TAC);
3844     REPEAT WEAKER_STRIP_TAC;
3845     INTRO_TAC Nkezbfc_local.PROPERTIES_GENERIC_LOCAL_FAN [`IMAGE vv (:num)`;`IMAGE (\i. {vv i, vv (SUC i)}) (:num)`;`IMAGE (\i. vv i,vv (SUC i)) (:num)`;`vv (j+(i:num))`];
3846     ASM_REWRITE_TAC[Qknvmlb.IN_IMAGE_VV];
3847     FIRST_X_ASSUM (MP_TAC o (MATCH_MP Local_lemmas.CVX_LO_IMP_LO));
3848     REWRITE_TAC[arith `SUC i = i+1`];
3849     DISCH_THEN (unlist REWRITE_TAC);
3850     DISCH_THEN (C INTRO_TAC [`vv (j+(i':num))`]);
3851     (ASM_REWRITE_TAC[Qknvmlb.IN_IMAGE_VV]);
3852     TYPIFY `!i. vv i = vv (i MOD 5) ` (C SUBGOAL_THEN MP_TAC);
3853       GEN_TAC;
3854       MATCH_MP_TAC (Oxl_def.periodic_mod);
3855       BY(ASM_REWRITE_TAC[arith `~(0=5)`]);
3856     DISCH_THEN (unlist ONCE_REWRITE_TAC);
3857     DISCH_TAC;
3858     FIRST_X_ASSUM_ST `x ==> (i:num) = j` (C INTRO_TAC [`(j+i') MOD 5`;`(j+i) MOD 5`]);
3859     FIRST_X_ASSUM (SUBST1_TAC);
3860     SIMP_TAC[arith `~(5 = 0)`;DIVISION];
3861     DISCH_TAC;
3862     INTRO_TAC Hdplygy.MOD_EQ_MOD [`i`;`i'`;`j`;`5`];
3863     ASM_REWRITE_TAC[arith `~(5=0)`];
3864     REPEAT (GMATCH_SIMP_TAC MOD_LT);
3865     BY(ASM_REWRITE_TAC[]);
3866   COMMENT "convert to dih";
3867   TYPIFY `azim (vec 0) (vv j) (vv (j + 1)) (vv (j + 4)) = dihV (vec 0) (vv j) (vv (j + 1)) (vv (j + 4)) /\ azim (vec 0) (vv j) (vv (j + 3)) (vv (j + 4)) = dihV (vec 0) (vv j) (vv (j + 3)) (vv (j + 4)) /\      azim (vec 0) (vv j) (vv (j + 1)) (vv (j + 2)) = dihV (vec 0) (vv j) (vv (j + 1)) (vv (j + 2)) /\      azim (vec 0) (vv j) (vv (j + 2)) (vv (j + 3)) = dihV (vec 0) (vv j) (vv (j + 2)) (vv (j + 3)) /\      azim (vec 0) (vv (j + 2)) (vv (j + 3)) (vv j) = dihV (vec 0) (vv (j + 2)) (vv (j + 3)) (vv j) /\      azim (vec 0) (vv (j + 2)) (vv j) (vv (j + 1)) = dihV (vec 0) (vv (j + 2)) (vv j) (vv (j + 1)) /\      azim (vec 0) (vv (j + 3)) (vv (j + 4)) (vv j) = dihV (vec 0) (vv (j + 3)) (vv (j + 4)) (vv j) /\      azim (vec 0) (vv (j + 3)) (vv j) (vv (j + 2)) = dihV (vec 0) (vv (j + 3)) (vv j) (vv (j + 2)) /\      azim (vec 0) (vv (j + 4)) (vv j) (vv (j + 3)) = dihV (vec 0) (vv (j + 4)) (vv j) (vv (j + 3)) /\      azim (vec 0) (vv (j + 1)) (vv (j + 2)) (vv j) = dihV (vec 0) (vv (j + 1)) (vv (j + 2)) (vv j)` (C SUBGOAL_THEN ASSUME_TAC);
3868     REPEAT (FIRST_X_ASSUM_ST `pi` MP_TAC);
3869     TYPIFY `vv j = vv (j+0)` (C SUBGOAL_THEN SUBST1_TAC);
3870       BY(REWRITE_TAC[arith `j+0=j`]);
3871     REPEAT WEAKER_STRIP_TAC;
3872     BY((REPEAT (CONJ_TAC) THEN MATCH_MP_TAC Polar_fan.AZIM_DIHV_SAME_STRONG THEN ASM_REWRITE_TAC[] THEN REPEAT CONJ_TAC THEN TRY (FIRST_X_ASSUM MATCH_MP_TAC) THEN NUM_REDUCE_TAC THEN ASM_REWRITE_TAC[]));
3873   REWRITE_TAC[arith `j+0=j`];
3874   TYPIFY `#0.616 < tau3 (vv j) (vv (j+1)) (vv (j+2)) + tau3 (vv j) (vv (j+2)) (vv (j+3)) + tau3 (vv j) (vv (j+3)) (vv (j+4))` ENOUGH_TO_SHOW_TAC;
3875     ONCE_REWRITE_TAC[arith `&0 <= a - b - c <=> c <= a - b`];
3876     MATCH_MP_TAC (arith `ts = rs ==> (d < ts ==> d <= rs)`);
3877     ASM_REWRITE_TAC[Appendix.tau3;Appendix.rho_rho_fun];
3878     BY(REAL_ARITH_TAC);
3879   REPEAT (GMATCH_SIMP_TAC Terminal.tau3_taum_40);
3880   ASM_REWRITE_TAC[];
3881   RULE_ASSUM_TAC(REWRITE_RULE[Terminal.IMAGE_SUBSET_IN;IN_UNIV]);
3882   ASM_REWRITE_TAC[];
3883   FIRST_X_ASSUM_ST `dist(a,b) = &2` MP_TAC;
3884   DISCH_TAC;
3885   FIRST_ASSUM (C INTRO_TAC [`j`]);
3886   FIRST_ASSUM (C INTRO_TAC [`j+1`]);
3887   FIRST_ASSUM (C INTRO_TAC [`j+2`]);
3888   FIRST_ASSUM (C INTRO_TAC [`j+3`]);
3889   FIRST_X_ASSUM (C INTRO_TAC [`j+4`]);
3890   ASM_REWRITE_TAC[arith `((a:num) + b) + c = a+b+c`];
3891   NUM_REDUCE_TAC;
3892   ASM_REWRITE_TAC[DIST_SYM];
3893   REPEAT WEAKER_STRIP_TAC THEN ASM_REWRITE_TAC[];
3894   FIRST_X_ASSUM_ST `cstab <= dist(a,b)` MP_TAC;
3895   TYPIFY `&2 <= cstab` (C SUBGOAL_THEN MP_TAC);
3896     BY(REWRITE_TAC[Sphere.cstab] THEN REAL_ARITH_TAC);
3897   REPEAT WEAKER_STRIP_TAC;
3898   TYPIFY_GOAL_THEN `&2 <= dist(vv j, vv(j+3))` (unlist REWRITE_TAC);
3899     BY(REPLICATE_TAC 2 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[REAL_LE_TRANS]);
3900   FIRST_X_ASSUM_ST `a = a1 + a2 + a3` MP_TAC;
3901   ASM_REWRITE_TAC[];
3902   DISCH_TAC;
3903   COMMENT "kill azim";
3904   REPEAT (FIRST_X_ASSUM_ST `azim` kill);
3905   TYPIFY_GOAL_THEN `&2 <= dist(vv j, vv(j+2))` (unlist REWRITE_TAC);
3906     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[REAL_LE_TRANS]);
3907   TYPIFY `&1 + sqrt(&5) < #3.237` (C SUBGOAL_THEN ASSUME_TAC);
3908     TYPIFY `sqrt(&5) < sqrt(#2.237 pow 2)` ENOUGH_TO_SHOW_TAC;
3909       GMATCH_SIMP_TAC POW_2_SQRT;
3910       BY(REAL_ARITH_TAC);
3911     GMATCH_SIMP_TAC SQRT_MONO_LT_EQ;
3912     BY(REAL_ARITH_TAC);
3913   CONJ_TAC;
3914     BY(REPEAT (FIRST_X_ASSUM_ST `&5` MP_TAC) THEN REAL_ARITH_TAC);
3915   CONJ_TAC;
3916     BY(REPEAT (FIRST_X_ASSUM_ST `&5` MP_TAC) THEN REAL_ARITH_TAC);
3917   CONJ_TAC;
3918     BY(REPEAT (FIRST_X_ASSUM_ST `&5` MP_TAC) THEN REAL_ARITH_TAC);
3919   PROOF_BY_CONTR_TAC;
3920   FIRST_X_ASSUM_ST `dihV` MP_TAC;
3921   REWRITE_TAC[];
3922   REPEAT (GMATCH_SIMP_TAC (REWRITE_RULE[LET_THM] Merge_ineq.DIHV_EQ_DIH_Y));
3923   REWRITE_TAC[DIST_0];
3924   REWRITE_TAC[TAUT `a /\ b /\ c <=> (a /\ b) /\ c`];
3925   CONJ_TAC;
3926     TYPIFY `vv j = vv (j+0)` (C SUBGOAL_THEN SUBST1_TAC);
3927       BY(REWRITE_TAC[arith `j+0=j`]);
3928     BY((REPEAT (CONJ_TAC) THEN TRY (FIRST_X_ASSUM MATCH_MP_TAC) THEN NUM_REDUCE_TAC THEN ASM_REWRITE_TAC[]));
3929   DISCH_TAC;
3930   TYPIFY `dih_y (norm (vv j)) (norm (vv (j + 1))) (norm (vv (j + 4)))       (cstab)      (dist (vv j,vv (j + 4)))      (dist (vv j,vv (j + 1))) <= dih_y (norm (vv j)) (norm (vv (j + 1))) (norm (vv (j + 4)))      (dist (vv (j + 1),vv (j + 4)))      (dist (vv j,vv (j + 4)))      (dist (vv j,vv (j + 1)))` (C SUBGOAL_THEN ASSUME_TAC);
3931     MATCH_MP_TAC dih_y_mono;
3932     CONJ_TAC;
3933       FIRST_X_ASSUM_ST `cs_adj` (C INTRO_TAC [`j+1`;`j+4`]);
3934       INTRO_TAC scs_diag_cs_adj [`5`;`&2`;`cstab`;`j+1`;`j+4`];
3935       ANTS_TAC;
3936         REWRITE_TAC[Appendix.scs_diag];
3937         REWRITE_TAC[arith `SUC (j+1) = j+2 /\ SUC (j+4) = j+5`];
3938         SIMP_TAC[MOD_EQ_MOD_SHIFT;arith `~(5 = 0)`];
3939         BY(REWRITE_TAC[Uxckfpe.ARITH_5_TAC]);
3940       BY(REAL_ARITH_TAC);
3941     CONJ_TAC;
3942       FIRST_X_ASSUM_ST `&2 <= norm (vv i)` (C INTRO_TAC [`j`]);
3943       BY(REAL_ARITH_TAC);
3944     CONJ_TAC;
3945       BY(REWRITE_TAC[Sphere.cstab] THEN REAL_ARITH_TAC);
3946     CONJ_TAC;
3947       INTRO_TAC (Terminal.get_main_nonlinear "2125338128") [`norm(vv(j+1))`;`norm(vv(j+4))`;`norm(vv j)`;`dist(vv j,vv(j+4))`;`dist(vv j, vv(j+1))`;`cstab`];
3948       ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;GSYM Sphere.cstab];
3949       ANTS_TAC;
3950         TYPIFY `#2.52 = &2 * h0` (C SUBGOAL_THEN SUBST1_TAC);
3951           BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
3952         ASM_REWRITE_TAC[];
3953         BY(REWRITE_TAC[Sphere.h0;Sphere.cstab] THEN REAL_ARITH_TAC);
3954       REWRITE_TAC[Pent_hex.delta_y_hex_cases];
3955       BY(REAL_ARITH_TAC);
3956     INTRO_TAC (REWRITE_RULE[LET_THM] Tame_lemmas.delta_y_pos) [`(vv j)`;` (vv (j+1))`;` (vv (j+4))`];
3957     BY(REWRITE_TAC[]);
3958   COMMENT "introduce ineq";
3959   INTRO_TAC (UNDISCH terminal_pent_taum2) [`norm (vv(j))`;`norm (vv(j+2))`;`norm (vv(j+3))`;`dist (vv(j+2),vv(j+3))`;`dist(vv(j),vv(j+3))`;`dist(vv(j),vv(j+2))`;`norm (vv(j+1))`;`norm(vv(j+4))`];
3960   REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`];
3961   DISCH_THEN MP_TAC THEN ANTS_TAC;
3962     ASM_REWRITE_TAC[];
3963     REWRITE_TAC[TAUT `(a /\ b) /\ c <=> a /\ b /\ c`];
3964     CONJ_TAC;
3965       INTRO_TAC (REWRITE_RULE[LET_THM] Tame_lemmas.delta_y_pos) [`(vv (j+1))`;` (vv (j))`;` (vv (j+2))`];
3966       ASM_REWRITE_TAC[];
3967       BY(ASM_REWRITE_TAC[DIST_SYM]);
3968     CONJ_TAC;
3969       INTRO_TAC (REWRITE_RULE[LET_THM] Tame_lemmas.delta_y_pos) [`(vv (j+4))`;` (vv (j))`;` (vv (j+3))`];
3970       BY(ASM_REWRITE_TAC[DIST_SYM]);
3971     CONJ_TAC;
3972       REPLICATE_TAC 2 (FIRST_X_ASSUM MP_TAC) THEN ASM_REWRITE_TAC[];
3973       TYPED_ABBREV_TAC `df  = dih_y (norm (vv j)) (norm (vv (j + 1))) (norm (vv (j + 4))) (dist (vv (j + 1),vv (j + 4))) (&2) (&2)`;
3974       TYPED_ABBREV_TAC `dc = dih_y (norm (vv j)) (norm (vv (j + 1))) (norm (vv (j + 4))) cstab (&2)     (&2)`;
3975       DISCH_THEN SUBST1_TAC;
3976       MATCH_MP_TAC (arith `(a12 = a21' /\ a23 = a23' /\ a34 = a34') ==> (dc <= a12 + a23 + a34 ==> dc <= a23' + a21' + a34')`);
3977       ASM_REWRITE_TAC[];
3978       ASM_REWRITE_TAC[DIST_SYM];
3979       BY(MESON_TAC[Nonlinear_lemma.dih_y_sym]);
3980     CONJ_TAC;
3981       BY(REAL_ARITH_TAC);
3982     ASM_REWRITE_TAC[GSYM Sphere.cstab];
3983     BY(REPEAT (FIRST_X_ASSUM_ST `&5` MP_TAC) THEN REAL_ARITH_TAC);
3984   FIRST_X_ASSUM_ST `taum` MP_TAC;
3985   REWRITE_TAC[];
3986   MATCH_MP_TAC (arith `a = b ==> ~(d < a) ==> ~(d < b)`);
3987   MATCH_MP_TAC (arith `a1 = b1 /\ a2 = b2 /\ a3 = b3 ==> (a1 + a2 + a3 = b1 + b2 +b3)`);
3988   ASM_REWRITE_TAC[DIST_SYM];
3989   BY(MESON_TAC[Terminal.taum_sym])
3990   ]);;
3991   (* }}} *)
3992
3993 let psort_4 = prove_by_refinement(
3994   `!i. psort 4(i,4) = psort 4(i,0) /\ psort 4 (4,i)=psort 4 (0,i)`,
3995   (* {{{ proof *)
3996   [
3997   REWRITE_TAC[Appendix.psort;LET_THM;Uxckfpe.ARITH_4_TAC]
3998   ]);;
3999   (* }}} *)
4000
4001 let I_LT_J_LT_5_EXPLICIT = prove_by_refinement(
4002   `!i j. (i < j /\ j < 5) <=> ((i = 0 /\ j = 1) \/ (i = 0 /\ j = 2) \/ (i = 0 /\ j = 3) \/ (i = 1 /\ j = 2) \/
4003                               (i = 1 /\ j = 3) \/ (i = 2 /\ j = 3) \/
4004                               (i=0 /\ j=4) \/ (i=1 /\ j=4) \/ (i=2 /\ j=4) \/ (i=3 /\ j=4))`,
4005   (* {{{ proof *)
4006   [
4007   REPEAT WEAKER_STRIP_TAC;
4008   REWRITE_TAC[Geomdetail.EQ_EXPAND];
4009   CONJ2_TAC;
4010     BY(ARITH_TAC);
4011   REPEAT WEAKER_STRIP_TAC;
4012   TYPIFY `j = 1 \/ j = 2 \/ j = 3 \/ j= 4` (C SUBGOAL_THEN ASSUME_TAC);
4013     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
4014   REPEAT (FIRST_X_ASSUM DISJ_CASES_TAC) THEN ASM_REWRITE_TAC[] THEN REPEAT (FIRST_X_ASSUM MP_TAC);
4015         BY(ARITH_TAC);
4016       BY(ARITH_TAC);
4017     BY(ARITH_TAC);
4018   BY(ARITH_TAC)
4019   ]);;
4020   (* }}} *)
4021
4022 let MOD_5_EXPLICIT = prove_by_refinement(
4023   `0 MOD 5 = 0 /\ 1 MOD 5 = 1 /\ 2 MOD 5 = 2 /\ 3 MOD 5 = 3 /\ 4 MOD 5 = 4 /\
4024      5 MOD 5 = 0 /\ 6 MOD 5 = 1 /\  7 MOD 5 = 2`,
4025   (* {{{ proof *)
4026   [
4027   ASM_SIMP_TAC[MOD_LT;MOD_MULT_ADD;arith `0 < 5 /\ 1 < 5 /\ 2 < 5 /\ 3 < 5 /\ 4 < 5 /\ 6 = 1*5 + 1 /\ 7 = 1*5 + 2`];
4028   BY(ASM_SIMP_TAC[Oxlzlez.MOD_REFL_ALT;arith `~(5 =0)`])
4029   ]);;
4030   (* }}} *)
4031
4032 let psort_5 = prove_by_refinement(
4033   `
4034 psort 5 (0,1) = (0,1) /\ psort 5 (0,2) = (0,2) /\ psort 5(0,3) = (0,3) /\ psort 5 (0,4)=(0,4) /\
4035 psort 5 (1,1) = (1,1) /\ psort 5 (1,2) = (1,2) /\ psort 5(1,3) = (1,3) /\ psort 5 (1,4)=(1,4) /\
4036 psort 5 (2,1) = (1,2) /\ psort 5 (2,2) = (2,2) /\ psort 5(2,3) = (2,3) /\ psort 5 (2,4)=(2,4) /\
4037 psort 5 (3,1) = (1,3) /\ psort 5 (3,2) = (2,3) /\ psort 5(3,3) = (3,3) /\ psort 5 (3,4)=(3,4) /\
4038 psort 5 (4,1) = (1,4) /\ psort 5 (4,2) = (2,4) /\ psort 5(4,3) = (3,4) /\ psort 5 (4,4)=(4,4) /\
4039 psort 5 (4,5) = (0,4) /\ psort 5 (5,4) = (0,4)
4040 `,
4041   (* {{{ proof *)
4042   [
4043   REWRITE_TAC[Appendix.psort;LET_DEF;LET_END_DEF];
4044   REWRITE_TAC[MOD_5_EXPLICIT;PAIR_EQ];
4045   NUM_REDUCE_TAC
4046   ]);;
4047   (* }}} *)
4048
4049
4050 (* NOW FINISH OTHER TERMINAL CASES *)
4051
4052 is_scs_6T1;;
4053 is_scs_5T1;;
4054
4055 let is_scs_4T1 = prove_by_refinement(
4056   `is_scs_v39 scs_4T1`,
4057   (* {{{ proof *)
4058   [
4059   REWRITE_TAC[Appendix.scs_4T1];
4060   MATCH_MP_TAC is_scs_adj;
4061   REWRITE_TAC[Appendix.d_tame;Sphere.cstab];
4062   NUM_REDUCE_TAC;
4063   BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
4064   ]);;
4065   (* }}} *)
4066
4067 let is_scs_4T2 = prove_by_refinement(
4068   `is_scs_v39 scs_4T2`,
4069   (* {{{ proof *)
4070   [
4071   REWRITE_TAC[Appendix.scs_4T2];
4072   MATCH_MP_TAC is_scs_adj;
4073   REWRITE_TAC[Appendix.d_tame;Sphere.cstab];
4074   NUM_REDUCE_TAC;
4075   BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
4076   ]);;
4077   (* }}} *)
4078
4079 let is_scs_4T3 = prove_by_refinement(
4080   `is_scs_v39 scs_4T3`,
4081   (* {{{ proof *)
4082   [
4083   REWRITE_TAC[Appendix.scs_4T3];
4084   REWRITE_TAC[Appendix.mk_unadorned_v39];
4085   MATCH_MP_TAC is_scs_funlist_basic;
4086   REWRITE_TAC[Appendix.d_tame;Sphere.cstab;Sphere.h0;Terminal.I_LT_J_LT_4_EXPLICIT];
4087   TYPED_ABBREV_TAC `s =  {i | i < 4 /\      (&2 *  #1.26 <       funlist_v39 [(0,1), #3.01; (0,2),&6; (1,3),&6] (&2) 4 i (SUC i) \/       &2 <       funlist_v39 [(0,1), #3.01; (0,2), #3.01; (1,3), #3.01] (&2) 4 i       (SUC i))}`;
4088   REWRITE_TAC[arith `i < 4 <=> i=0 \/ i=1 \/ i=2 \/ i=3`];
4089   NUM_REDUCE_TAC;
4090   REPEAT CONJ_TAC THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4] THEN TRY (REAL_ARITH_TAC);
4091   TYPIFY `CARD s = 1` ENOUGH_TO_SHOW_TAC;
4092     BY(ARITH_TAC);
4093   MATCH_MP_TAC Misc_defs_and_lemmas.CARD_SING;
4094   REWRITE_TAC[SING];
4095   TYPIFY `0` EXISTS_TAC;
4096   EXPAND_TAC "s";
4097   REWRITE_TAC[EXTENSION;IN_ELIM_THM;IN_INSERT;NOT_IN_EMPTY];
4098   REWRITE_TAC[arith `i < 4 <=> i=0 \/ i=1 \/ i=2 \/ i=3`];
4099   GEN_TAC;
4100   ASM_CASES_TAC `x = 0`;
4101     ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4];
4102     BY(REAL_ARITH_TAC);
4103   ASM_REWRITE_TAC[];
4104   REWRITE_TAC[TAUT `~(a /\ b) <=> (a ==> ~b)`];
4105   BY(STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4] THEN TRY (REAL_ARITH_TAC))
4106   ]);;
4107   (* }}} *)
4108
4109 let is_scs_4T4 = prove_by_refinement(
4110   `is_scs_v39 scs_4T4`,
4111   (* {{{ proof *)
4112   [
4113   REWRITE_TAC[Appendix.scs_4T4];
4114   REWRITE_TAC[Appendix.mk_unadorned_v39];
4115   MATCH_MP_TAC is_scs_funlist_basic;
4116   REWRITE_TAC[Appendix.d_tame;Sphere.cstab;Sphere.h0;Terminal.I_LT_J_LT_4_EXPLICIT];
4117   TYPED_ABBREV_TAC `s =  {i | i < 4 /\      (&2 *  #1.26 <       funlist_v39 [(0,1),sqrt8; (0,2),&6; (1,3), #3.01] (&2 *  #1.26) 4 i       (SUC i) \/       &2 <       funlist_v39 [(0,1),&2 *  #1.26; (0,2),sqrt8; (1,3),sqrt8] (&2) 4 i       (SUC i))}`;
4118   REWRITE_TAC[arith `i < 4 <=> i=0 \/ i=1 \/ i=2 \/ i=3`];
4119   NUM_REDUCE_TAC;
4120   REPEAT CONJ_TAC THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4] THEN MP_TAC sqrt8_flyspeck (* Flyspeck_constants.bounds *) THEN TRY (REAL_ARITH_TAC);
4121   DISCH_THEN kill;
4122   TYPIFY `CARD s = 1` ENOUGH_TO_SHOW_TAC;
4123     BY(ARITH_TAC);
4124   MATCH_MP_TAC Misc_defs_and_lemmas.CARD_SING;
4125   REWRITE_TAC[SING];
4126   TYPIFY `0` EXISTS_TAC;
4127   EXPAND_TAC "s";
4128   REWRITE_TAC[EXTENSION;IN_ELIM_THM;IN_INSERT;NOT_IN_EMPTY];
4129   REWRITE_TAC[arith `i < 4 <=> i=0 \/ i=1 \/ i=2 \/ i=3`];
4130   GEN_TAC;
4131   ASM_CASES_TAC `x = 0`;
4132     ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4];
4133     BY(REAL_ARITH_TAC);
4134   ASM_REWRITE_TAC[];
4135   REWRITE_TAC[TAUT `~(a /\ b) <=> (a ==> ~b)`];
4136   BY(STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4] THEN TRY (REAL_ARITH_TAC))
4137   ]);;
4138   (* }}} *)
4139
4140 let is_scs_4T5 = prove_by_refinement(
4141   `is_scs_v39 scs_4T5`,
4142   (* {{{ proof *)
4143   [
4144   REWRITE_TAC[Appendix.scs_4T5];
4145   REWRITE_TAC[Appendix.mk_unadorned_v39];
4146   MATCH_MP_TAC is_scs_funlist_basic;
4147   REWRITE_TAC[Appendix.d_tame;Sphere.cstab;Sphere.h0;Terminal.I_LT_J_LT_4_EXPLICIT];
4148   TYPED_ABBREV_TAC `s = {i | i < 4 /\      (&2 *  #1.26 <       funlist_v39 [(0,1), #3.01; (0,2),&6; (1,3), #3.01] (&2 *  #1.26) 4 i       (SUC i) \/       &2 <       funlist_v39 [(0,1),&2 *  #1.26; (0,2), #3.01; (1,3), #3.01] (&2) 4 i       (SUC i))}`;
4149   REWRITE_TAC[arith `i < 4 <=> i=0 \/ i=1 \/ i=2 \/ i=3`];
4150   NUM_REDUCE_TAC;
4151   REPEAT CONJ_TAC THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4] THEN TRY (REAL_ARITH_TAC);
4152   TYPIFY `CARD s = 1` ENOUGH_TO_SHOW_TAC;
4153     BY(ARITH_TAC);
4154   MATCH_MP_TAC Misc_defs_and_lemmas.CARD_SING;
4155   REWRITE_TAC[SING];
4156   TYPIFY `0` EXISTS_TAC;
4157   EXPAND_TAC "s";
4158   REWRITE_TAC[EXTENSION;IN_ELIM_THM;IN_INSERT;NOT_IN_EMPTY];
4159   REWRITE_TAC[arith `i < 4 <=> i=0 \/ i=1 \/ i=2 \/ i=3`];
4160   GEN_TAC;
4161   ASM_CASES_TAC `x = 0`;
4162     ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4];
4163     BY(REAL_ARITH_TAC);
4164   ASM_REWRITE_TAC[];
4165   REWRITE_TAC[TAUT `~(a /\ b) <=> (a ==> ~b)`];
4166   BY(STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4] THEN TRY (REAL_ARITH_TAC))
4167   ]);;
4168   (* }}} *)
4169
4170 let CARD_3_SUBSET = prove_by_refinement(
4171   `!f. CARD {i | i < 3 /\ f i} <= 3`,
4172   (* {{{ proof *)
4173   [
4174   REPEAT WEAKER_STRIP_TAC;
4175   TYPIFY `CARD {i | i < 3 } = 3` ENOUGH_TO_SHOW_TAC;
4176     DISCH_TAC;
4177     INTRO_TAC CARD_SUBSET [`{i | i < 3 /\ f i}`;`{i | i < 3}`];
4178     ANTS_TAC;
4179       CONJ_TAC;
4180         BY(SET_TAC[]);
4181       BY(REWRITE_TAC[FINITE_NUMSEG_LT]);
4182     BY(ASM_TAC THEN ARITH_TAC);
4183   BY(REWRITE_TAC[CARD_NUMSEG_LT])
4184   ]);;
4185   (* }}} *)
4186
4187 let is_scs_3T1 = prove_by_refinement(
4188   `is_scs_v39 scs_3T1`,
4189   (* {{{ proof *)
4190   [
4191   REWRITE_TAC[Appendix.scs_3T1];
4192   REWRITE_TAC[Appendix.mk_unadorned_v39];
4193   MATCH_MP_TAC is_scs_funlist_basic;
4194   REWRITE_TAC[Appendix.d_tame;Sphere.cstab;Sphere.h0;Terminal.I_LT_J_LT_3_EXPLICIT;arith `x + 3 <= 6 <=> x <= 3`;CARD_3_SUBSET];
4195   REWRITE_TAC[arith `i < 3 <=> i=0 \/ i=1 \/ i=2`];
4196   NUM_REDUCE_TAC;
4197   BY(REPEAT CONJ_TAC THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_3_TAC] THEN MP_TAC sqrt8_flyspeck (* 1 *) THEN TRY (REAL_ARITH_TAC))
4198   ]);;
4199   (* }}} *)
4200
4201 let is_scs_3M1 = prove_by_refinement(
4202   `is_scs_v39 scs_3M1`,
4203   (* {{{ proof *)
4204   [
4205   REWRITE_TAC[Appendix.scs_3M1];
4206   REWRITE_TAC[Appendix.mk_unadorned_v39];
4207   MATCH_MP_TAC is_scs_funlist_basic;
4208   REWRITE_TAC[Appendix.d_tame;Sphere.cstab;Sphere.h0;Terminal.I_LT_J_LT_3_EXPLICIT;arith `x + 3 <= 6 <=> x <= 3`;CARD_3_SUBSET];
4209   REWRITE_TAC[arith `i < 3 <=> i=0 \/ i=1 \/ i=2`];
4210   NUM_REDUCE_TAC;
4211   BY(REPEAT CONJ_TAC THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_3_TAC] THEN MP_TAC sqrt8_flyspeck (* 1 *) THEN TRY (REAL_ARITH_TAC))
4212   ]);;
4213   (* }}} *)
4214
4215 let is_scs_3T2 = prove_by_refinement(
4216   `is_scs_v39 scs_3T2`,
4217   (* {{{ proof *)
4218   [
4219   REWRITE_TAC[Appendix.scs_3T2];
4220   REWRITE_TAC[Appendix.mk_unadorned_v39];
4221   MATCH_MP_TAC is_scs_funlist_basic;
4222   REWRITE_TAC[Appendix.d_tame;Sphere.cstab;Sphere.h0;Terminal.I_LT_J_LT_3_EXPLICIT;arith `x + 3 <= 6 <=> x <= 3`;CARD_3_SUBSET];
4223   REWRITE_TAC[arith `i < 3 <=> i=0 \/ i=1 \/ i=2`];
4224   NUM_REDUCE_TAC;
4225   BY(REPEAT CONJ_TAC THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_3_TAC] THEN MP_TAC sqrt8_flyspeck (* 1 *) THEN TRY (REAL_ARITH_TAC))
4226   ]);;
4227   (* }}} *)
4228
4229 let is_scs_3T3 = prove_by_refinement(
4230   `is_scs_v39 scs_3T3`,
4231   (* {{{ proof *)
4232   [
4233   REWRITE_TAC[Appendix.scs_3T3];
4234   REWRITE_TAC[Appendix.mk_unadorned_v39];
4235   MATCH_MP_TAC is_scs_funlist_basic;
4236   REWRITE_TAC[Appendix.d_tame;Sphere.cstab;Sphere.h0;Terminal.I_LT_J_LT_3_EXPLICIT;arith `x + 3 <= 6 <=> x <= 3`;CARD_3_SUBSET];
4237   REWRITE_TAC[arith `i < 3 <=> i=0 \/ i=1 \/ i=2`];
4238   NUM_REDUCE_TAC;
4239   BY(REPEAT CONJ_TAC THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_3_TAC] THEN MP_TAC sqrt8_flyspeck (* 1 *) THEN TRY (REAL_ARITH_TAC))
4240   ]);;
4241   (* }}} *)
4242
4243 let is_scs_3T4 = prove_by_refinement(
4244   `is_scs_v39 scs_3T4`,
4245   (* {{{ proof *)
4246   [
4247   REWRITE_TAC[Appendix.scs_3T4];
4248   REWRITE_TAC[Appendix.mk_unadorned_v39];
4249   MATCH_MP_TAC is_scs_funlist_basic;
4250   REWRITE_TAC[Appendix.d_tame;Sphere.cstab;Sphere.h0;Terminal.I_LT_J_LT_3_EXPLICIT;arith `x + 3 <= 6 <=> x <= 3`;CARD_3_SUBSET];
4251   REWRITE_TAC[arith `i < 3 <=> i=0 \/ i=1 \/ i=2`];
4252   NUM_REDUCE_TAC;
4253   BY(REPEAT CONJ_TAC THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_3_TAC] THEN MP_TAC sqrt8_flyspeck (* 1 *) THEN TRY (REAL_ARITH_TAC))
4254   ]);;
4255   (* }}} *)
4256
4257 let is_scs_3T5 = prove_by_refinement(
4258   `is_scs_v39 scs_3T5`,
4259   (* {{{ proof *)
4260   [
4261   REWRITE_TAC[Appendix.scs_3T5];
4262   REWRITE_TAC[Appendix.mk_unadorned_v39];
4263   MATCH_MP_TAC is_scs_funlist_basic;
4264   REWRITE_TAC[Appendix.d_tame;Sphere.cstab;Sphere.h0;Terminal.I_LT_J_LT_3_EXPLICIT;arith `x + 3 <= 6 <=> x <= 3`;CARD_3_SUBSET];
4265   REWRITE_TAC[arith `i < 3 <=> i=0 \/ i=1 \/ i=2`];
4266   NUM_REDUCE_TAC;
4267   BY(REPEAT CONJ_TAC THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_3_TAC] THEN MP_TAC sqrt8_flyspeck (* 1 *) THEN TRY (REAL_ARITH_TAC))
4268   ]);;
4269   (* }}} *)
4270
4271 let is_scs_3T6 = prove_by_refinement(
4272   `is_scs_v39 scs_3T6'`,
4273   (* {{{ proof *)
4274   [
4275   REWRITE_TAC[Appendix.scs_3T6];
4276   REWRITE_TAC[Appendix.mk_unadorned_v39];
4277   MATCH_MP_TAC is_scs_funlist_basic;
4278   REWRITE_TAC[Appendix.d_tame;Sphere.cstab;Sphere.h0;Terminal.I_LT_J_LT_3_EXPLICIT;arith `x + 3 <= 6 <=> x <= 3`;CARD_3_SUBSET];
4279   REWRITE_TAC[arith `i < 3 <=> i=0 \/ i=1 \/ i=2`];
4280   NUM_REDUCE_TAC;
4281   BY(REPEAT CONJ_TAC THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_3_TAC] THEN MP_TAC sqrt8_flyspeck (* 1 *) THEN TRY (REAL_ARITH_TAC))
4282   ]);;
4283   (* }}} *)
4284
4285 let is_scs_3T7 = prove_by_refinement(
4286   `is_scs_v39 scs_3T7`,
4287   (* {{{ proof *)
4288   [
4289   REWRITE_TAC[Appendix.scs_3T7];
4290   REWRITE_TAC[Appendix.mk_unadorned_v39];
4291   MATCH_MP_TAC is_scs_funlist_basic;
4292   REWRITE_TAC[Appendix.d_tame;Sphere.cstab;Sphere.h0;Terminal.I_LT_J_LT_3_EXPLICIT;arith `x + 3 <= 6 <=> x <= 3`;CARD_3_SUBSET];
4293   REWRITE_TAC[arith `i < 3 <=> i=0 \/ i=1 \/ i=2`];
4294   NUM_REDUCE_TAC;
4295   BY(REPEAT CONJ_TAC THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_3_TAC] THEN MP_TAC sqrt8_flyspeck (* 1 *) THEN TRY (REAL_ARITH_TAC))
4296   ]);;
4297   (* }}} *)
4298
4299 let is_scs_6I1 = prove_by_refinement(
4300   `is_scs_v39 scs_6I1`,
4301   (* {{{ proof *)
4302   [
4303   REWRITE_TAC[Appendix.scs_6I1];
4304   MATCH_MP_TAC is_scs_adj;
4305   REWRITE_TAC[Appendix.d_tame;Sphere.cstab];
4306   NUM_REDUCE_TAC;
4307   BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
4308   ]);;
4309   (* }}} *)
4310
4311 let is_scs_5I1 = prove_by_refinement(
4312   `is_scs_v39 scs_5I1`,
4313   (* {{{ proof *)
4314   [
4315   REWRITE_TAC[Appendix.scs_5I1];
4316   MATCH_MP_TAC is_scs_adj;
4317   REWRITE_TAC[Appendix.d_tame;Sphere.cstab];
4318   NUM_REDUCE_TAC;
4319   BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
4320   ]);;
4321   (* }}} *)
4322
4323 let is_scs_5I2 = prove_by_refinement(
4324   `is_scs_v39 scs_5I2`,
4325   (* {{{ proof *)
4326   [
4327   REWRITE_TAC[Appendix.scs_5I2];
4328   MATCH_MP_TAC is_scs_adj;
4329   REWRITE_TAC[Appendix.d_tame;Sphere.cstab];
4330   NUM_REDUCE_TAC;
4331   BY(REWRITE_TAC[Sphere.h0] THEN MP_TAC sqrt8_flyspeck (* 1 *) THEN REAL_ARITH_TAC)
4332   ]);;
4333   (* }}} *)
4334
4335 let is_scs_5I3 = prove_by_refinement(
4336   `is_scs_v39 scs_5I3`,
4337   (* {{{ proof *)
4338   [
4339   REWRITE_TAC[Appendix.scs_5I3];
4340   REWRITE_TAC[Appendix.mk_unadorned_v39];
4341   MATCH_MP_TAC is_scs_funlist_basic;
4342   REWRITE_TAC[Appendix.d_tame;Sphere.cstab;Sphere.h0;I_LT_J_LT_5_EXPLICIT];
4343   TYPED_ABBREV_TAC `s = {i | i < 5 /\      (&2 *  #1.26 <       funlist_v39       [(0,1),sqrt8; (0,2),&6; (0,3),&6; (1,3),&6; (1,4),&6; (2,4),&6]       (&2 *  #1.26)       5       i       (SUC i) \/       &2 <       funlist_v39       [(0,1),&2 *  #1.26; (0,2),&2 *  #1.26; (0,3),&2 *  #1.26; (1,3),                                                                 &2 *  #1.26;        (1,4),       &2 *  #1.26; (2,4),&2 *  #1.26]       (&2)       5       i       (SUC i))}`;
4344   REWRITE_TAC[arith `i < 5 <=> i=0 \/ i=1 \/ i=2 \/ i=3 \/ i=4`];
4345   NUM_REDUCE_TAC;
4346   REPEAT CONJ_TAC THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_5_TAC;psort_5] THEN MP_TAC sqrt8_flyspeck (* 1 *) THEN TRY (REAL_ARITH_TAC);
4347   DISCH_THEN kill;
4348   TYPIFY `CARD s = 1` ENOUGH_TO_SHOW_TAC;
4349     BY(ARITH_TAC);
4350   MATCH_MP_TAC Misc_defs_and_lemmas.CARD_SING;
4351   REWRITE_TAC[SING];
4352   TYPIFY `0` EXISTS_TAC;
4353   EXPAND_TAC "s";
4354   REWRITE_TAC[EXTENSION;IN_ELIM_THM;IN_INSERT;NOT_IN_EMPTY];
4355   REWRITE_TAC[arith `i < 5 <=> i=0 \/ i=1 \/ i=2 \/ i=3 \/ i=4`];
4356   GEN_TAC;
4357   ASM_CASES_TAC `x = 0`;
4358     ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_5_TAC;psort_5];
4359     BY(MP_TAC sqrt8_flyspeck (* 1 *) THEN REAL_ARITH_TAC);
4360   ASM_REWRITE_TAC[];
4361   REWRITE_TAC[TAUT `~(a /\ b) <=> (a ==> ~b)`];
4362   BY(STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_5_TAC;psort_5] THEN TRY (REAL_ARITH_TAC))
4363   ]);;
4364   (* }}} *)
4365
4366 let is_scs_4I1 = prove_by_refinement(
4367   `is_scs_v39 scs_4I1`,
4368   (* {{{ proof *)
4369   [
4370   REWRITE_TAC[Appendix.scs_4I1];
4371   MATCH_MP_TAC is_scs_adj;
4372   REWRITE_TAC[Appendix.d_tame;Sphere.cstab];
4373   NUM_REDUCE_TAC;
4374   BY(REWRITE_TAC[Sphere.h0] THEN MP_TAC sqrt8_flyspeck (* 1 *) THEN REAL_ARITH_TAC)
4375   ]);;
4376   (* }}} *)
4377
4378 let is_scs_4I2 = prove_by_refinement(
4379   `is_scs_v39 scs_4I2`,
4380   (* {{{ proof *)
4381   [
4382   REWRITE_TAC[Appendix.scs_4I2];
4383   MATCH_MP_TAC is_scs_adj;
4384   REWRITE_TAC[Appendix.d_tame;Sphere.cstab];
4385   NUM_REDUCE_TAC;
4386   BY(REWRITE_TAC[Sphere.h0] THEN MP_TAC sqrt8_flyspeck (* 1 *) THEN REAL_ARITH_TAC)
4387   ]);;
4388   (* }}} *)
4389
4390 let is_scs_4I3 = prove_by_refinement(
4391   `is_scs_v39 scs_4I3`,
4392   (* {{{ proof *)
4393   [
4394   REWRITE_TAC[Appendix.scs_4I3];
4395   REWRITE_TAC[Appendix.mk_unadorned_v39];
4396   MATCH_MP_TAC is_scs_funlist_basic;
4397   REWRITE_TAC[Appendix.d_tame;Sphere.cstab;Sphere.h0;Terminal.I_LT_J_LT_4_EXPLICIT];
4398   TYPED_ABBREV_TAC `s = {i | i < 4 /\      (&2 *  #1.26 <       funlist_v39 [(0,1),sqrt8; (0,2),&6; (1,3),&6] (&2 *  #1.26) 4 i       (SUC i) \/       &2 <       funlist_v39 [(0,1),&2 *  #1.26; (0,2),sqrt8; (1,3),sqrt8] (&2) 4 i       (SUC i))}`;
4399   REWRITE_TAC[arith `i < 4 <=> i=0 \/ i=1 \/ i=2 \/ i=3`];
4400   NUM_REDUCE_TAC;
4401   REPEAT CONJ_TAC THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4] THEN TRY (MP_TAC sqrt8_flyspeck (* 1 *) THEN REAL_ARITH_TAC);
4402   TYPIFY `CARD s = 1` ENOUGH_TO_SHOW_TAC;
4403     BY(ARITH_TAC);
4404   MATCH_MP_TAC Misc_defs_and_lemmas.CARD_SING;
4405   REWRITE_TAC[SING];
4406   TYPIFY `0` EXISTS_TAC;
4407   EXPAND_TAC "s";
4408   REWRITE_TAC[EXTENSION;IN_ELIM_THM;IN_INSERT;NOT_IN_EMPTY];
4409   REWRITE_TAC[arith `i < 4 <=> i=0 \/ i=1 \/ i=2 \/ i=3`];
4410   GEN_TAC;
4411   ASM_CASES_TAC `x = 0`;
4412     ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4];
4413     BY(MP_TAC sqrt8_flyspeck (* 1 *) THEN REAL_ARITH_TAC);
4414   ASM_REWRITE_TAC[];
4415   REWRITE_TAC[TAUT `~(a /\ b) <=> (a ==> ~b)`];
4416   BY(STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4] THEN TRY (MP_TAC sqrt8_flyspeck (* 1 *) THEN REAL_ARITH_TAC))
4417   ]);;
4418   (* }}} *)
4419
4420 let is_scs_3I1 = prove_by_refinement(
4421   `is_scs_v39 scs_3I1`,
4422   (* {{{ proof *)
4423   [
4424   REWRITE_TAC[Appendix.scs_3I1];
4425   MATCH_MP_TAC is_scs_adj;
4426   REWRITE_TAC[Appendix.d_tame;Sphere.cstab];
4427   NUM_REDUCE_TAC;
4428   BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
4429   ]);;
4430   (* }}} *)
4431
4432 (*
4433 let stab_diag_basic = prove_by_refinement(
4434   `!s i j. scs_basic_v39 s /\ ~(i = j) ==> scs_basic_v39 (scs_stab_diag_v39 s i j)`,
4435   (* {{{ proof *)
4436   [
4437   rt[Appendix.scs_is_basic;Appendix.is_scs_v39;Appendix.unadorned_v39;Appendix.scs_stab_diag_v39]
4438   ]);;
4439   (* }}} *)
4440 *)
4441
4442 let is_scs_6M1 = prove_by_refinement(
4443   `is_scs_v39 scs_6M1`,
4444   (* {{{ proof *)
4445   [
4446   REWRITE_TAC[Appendix.scs_6M1];
4447   MATCH_MP_TAC is_scs_adj;
4448   REWRITE_TAC[Appendix.d_tame;Sphere.cstab];
4449   NUM_REDUCE_TAC;
4450   BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
4451   ]);;
4452   (* }}} *)
4453
4454 let is_scs_5M1 = prove_by_refinement(
4455   `is_scs_v39 scs_5M1`,
4456   (* {{{ proof *)
4457   [
4458   REWRITE_TAC[Appendix.scs_5M1];
4459   REWRITE_TAC[Appendix.mk_unadorned_v39];
4460   MATCH_MP_TAC is_scs_funlist_basic;
4461   REWRITE_TAC[Appendix.d_tame;Sphere.cstab;Sphere.h0;I_LT_J_LT_5_EXPLICIT];
4462   TYPED_ABBREV_TAC `s =  {i | i < 5 /\      (&2 *  #1.26 <       funlist_v39       [(0,1), #3.01; (0,2),&6; (0,3),&6; (1,3),&6; (1,4),&6; (2,4),&6]       (&2 *  #1.26)       5       i       (SUC i) \/       &2 <       funlist_v39       [(0,1),&2 *  #1.26; (0,2),&2 *  #1.26; (0,3),&2 *  #1.26; (1,3),                                                                 &2 *  #1.26;        (1,4),       &2 *  #1.26; (2,4),&2 *  #1.26]       (&2)       5       i       (SUC i))}`;
4463   REWRITE_TAC[arith `i < 5 <=> i=0 \/ i=1 \/ i=2 \/ i=3 \/ i=4`];
4464   NUM_REDUCE_TAC;
4465   REPEAT CONJ_TAC THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_5_TAC;psort_5] THEN  TRY (REAL_ARITH_TAC);
4466   TYPIFY `CARD s = 1` ENOUGH_TO_SHOW_TAC;
4467     BY(ARITH_TAC);
4468   MATCH_MP_TAC Misc_defs_and_lemmas.CARD_SING;
4469   REWRITE_TAC[SING];
4470   TYPIFY `0` EXISTS_TAC;
4471   EXPAND_TAC "s";
4472   REWRITE_TAC[EXTENSION;IN_ELIM_THM;IN_INSERT;NOT_IN_EMPTY];
4473   REWRITE_TAC[arith `i < 5 <=> i=0 \/ i=1 \/ i=2 \/ i=3 \/ i=4`];
4474   GEN_TAC;
4475   ASM_CASES_TAC `x = 0`;
4476     ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_5_TAC;psort_5];
4477     BY(MP_TAC sqrt8_flyspeck (* 1 *) THEN REAL_ARITH_TAC);
4478   ASM_REWRITE_TAC[];
4479   REWRITE_TAC[TAUT `~(a /\ b) <=> (a ==> ~b)`];
4480   BY(STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_5_TAC;psort_5] THEN TRY (REAL_ARITH_TAC))
4481   ]);;
4482   (* }}} *)
4483
4484 let is_scs_5M2 = prove_by_refinement(
4485   `is_scs_v39 scs_5M2`,
4486   (* {{{ proof *)
4487   [
4488   REWRITE_TAC[Appendix.scs_5M2];
4489   REWRITE_TAC[Appendix.mk_unadorned_v39];
4490   MATCH_MP_TAC is_scs_funlist_basic;
4491   REWRITE_TAC[Appendix.d_tame;Sphere.cstab;Sphere.h0;I_LT_J_LT_5_EXPLICIT];
4492   TYPED_ABBREV_TAC `s =   {i | i < 5 /\      (&2 *  #1.26 <       funlist_v39       [(0,1), #3.01; (0,2),&6; (0,3),&6; (1,3),&6; (1,4),&6; (2,4),&6]       (&2 *  #1.26)       5       i       (SUC i) \/       &2 <       funlist_v39       [(0,1),&2; (0,2), #3.01; (0,3), #3.01; (1,3), #3.01; (1,4), #3.01;        (2,4),        #3.01]       (&2)       5       i       (SUC i))}`;
4493   REWRITE_TAC[arith `i < 5 <=> i=0 \/ i=1 \/ i=2 \/ i=3 \/ i=4`];
4494   NUM_REDUCE_TAC;
4495   REPEAT CONJ_TAC THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_5_TAC;psort_5] THEN  TRY (REAL_ARITH_TAC);
4496   TYPIFY `CARD s = 1` ENOUGH_TO_SHOW_TAC;
4497     BY(ARITH_TAC);
4498   MATCH_MP_TAC Misc_defs_and_lemmas.CARD_SING;
4499   REWRITE_TAC[SING];
4500   TYPIFY `0` EXISTS_TAC;
4501   EXPAND_TAC "s";
4502   REWRITE_TAC[EXTENSION;IN_ELIM_THM;IN_INSERT;NOT_IN_EMPTY];
4503   REWRITE_TAC[arith `i < 5 <=> i=0 \/ i=1 \/ i=2 \/ i=3 \/ i=4`];
4504   GEN_TAC;
4505   ASM_CASES_TAC `x = 0`;
4506     ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_5_TAC;psort_5];
4507     BY(MP_TAC sqrt8_flyspeck (* 1 *) THEN REAL_ARITH_TAC);
4508   ASM_REWRITE_TAC[];
4509   REWRITE_TAC[TAUT `~(a /\ b) <=> (a ==> ~b)`];
4510   BY(STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_5_TAC;psort_5] THEN TRY (REAL_ARITH_TAC))
4511   ]);;
4512   (* }}} *)
4513
4514 let is_scs_4M1 = prove_by_refinement(
4515   `is_scs_v39 scs_4M1`,
4516   (* {{{ proof *)
4517   [
4518   REWRITE_TAC[Appendix.scs_4M1];
4519   REWRITE_TAC[Appendix.mk_unadorned_v39];
4520   MATCH_MP_TAC is_scs_funlist_basic;
4521   REWRITE_TAC[Appendix.d_tame;Sphere.cstab;Sphere.h0;Terminal.I_LT_J_LT_4_EXPLICIT];
4522   TYPED_ABBREV_TAC `s = {i | i < 4 /\      (&2 *  #1.26 <       funlist_v39 [(0,1), #3.01; (0,2),&6; (1,3),&6] (&2 *  #1.26) 4 i       (SUC i) \/       &2 <       funlist_v39 [(0,1),&2 *  #1.26; (0,2),&2 *  #1.26; (1,3),&2 *  #1.26]       (&2)       4       i       (SUC i))}`;
4523   REWRITE_TAC[arith `i < 4 <=> i=0 \/ i=1 \/ i=2 \/ i=3`];
4524   NUM_REDUCE_TAC;
4525   REPEAT CONJ_TAC THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4] THEN TRY (MP_TAC sqrt8_flyspeck (* 1 *) THEN REAL_ARITH_TAC);
4526   TYPIFY `CARD s = 1` ENOUGH_TO_SHOW_TAC;
4527     BY(ARITH_TAC);
4528   MATCH_MP_TAC Misc_defs_and_lemmas.CARD_SING;
4529   REWRITE_TAC[SING];
4530   TYPIFY `0` EXISTS_TAC;
4531   EXPAND_TAC "s";
4532   REWRITE_TAC[EXTENSION;IN_ELIM_THM;IN_INSERT;NOT_IN_EMPTY];
4533   REWRITE_TAC[arith `i < 4 <=> i=0 \/ i=1 \/ i=2 \/ i=3`];
4534   GEN_TAC;
4535   ASM_CASES_TAC `x = 0`;
4536     ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4];
4537     BY(MP_TAC sqrt8_flyspeck (* 1 *) THEN REAL_ARITH_TAC);
4538   ASM_REWRITE_TAC[];
4539   REWRITE_TAC[TAUT `~(a /\ b) <=> (a ==> ~b)`];
4540   BY(STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4] THEN TRY (MP_TAC sqrt8_flyspeck (* 1 *) THEN REAL_ARITH_TAC))
4541   ]);;
4542   (* }}} *)
4543
4544 let is_scs_4M2 = prove_by_refinement(
4545   `is_scs_v39 scs_4M2`,
4546   (* {{{ proof *)
4547   [
4548   REWRITE_TAC[Appendix.scs_4M2];
4549   REWRITE_TAC[Appendix.mk_unadorned_v39];
4550   MATCH_MP_TAC is_scs_funlist_basic;
4551   REWRITE_TAC[Appendix.d_tame;Sphere.cstab;Sphere.h0;Terminal.I_LT_J_LT_4_EXPLICIT];
4552   TYPED_ABBREV_TAC `s = {i | i < 4 /\      (&2 *  #1.26 <       funlist_v39 [(0,1), #3.01; (0,2),&6; (1,3),&6] (&2 *  #1.26) 4 i       (SUC i) \/       &2 <       funlist_v39 [(0,1),&2 *  #1.26; (0,2),&2 *  #1.26; (1,3),&2 *  #1.26]       (&2)       4       i       (SUC i))}`;
4553   REWRITE_TAC[arith `i < 4 <=> i=0 \/ i=1 \/ i=2 \/ i=3`];
4554   NUM_REDUCE_TAC;
4555   REPEAT CONJ_TAC THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4] THEN TRY (MP_TAC sqrt8_flyspeck (* 1 *) THEN REAL_ARITH_TAC);
4556   TYPIFY `CARD s = 1` ENOUGH_TO_SHOW_TAC;
4557     BY(ARITH_TAC);
4558   MATCH_MP_TAC Misc_defs_and_lemmas.CARD_SING;
4559   REWRITE_TAC[SING];
4560   TYPIFY `0` EXISTS_TAC;
4561   EXPAND_TAC "s";
4562   REWRITE_TAC[EXTENSION;IN_ELIM_THM;IN_INSERT;NOT_IN_EMPTY];
4563   REWRITE_TAC[arith `i < 4 <=> i=0 \/ i=1 \/ i=2 \/ i=3`];
4564   GEN_TAC;
4565   ASM_CASES_TAC `x = 0`;
4566     ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4];
4567     BY(MP_TAC sqrt8_flyspeck (* 1 *) THEN REAL_ARITH_TAC);
4568   ASM_REWRITE_TAC[];
4569   REWRITE_TAC[TAUT `~(a /\ b) <=> (a ==> ~b)`];
4570   BY(STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4] THEN TRY (MP_TAC sqrt8_flyspeck (* 1 *) THEN REAL_ARITH_TAC))
4571   ]);;
4572   (* }}} *)
4573
4574 let is_scs_4M3 = prove_by_refinement(
4575   `is_scs_v39 scs_4M3'`,
4576   (* {{{ proof *)
4577   [
4578   REWRITE_TAC[Appendix.scs_4M3];
4579   REWRITE_TAC[Appendix.mk_unadorned_v39];
4580   MATCH_MP_TAC is_scs_funlist_basic;
4581   REWRITE_TAC[Appendix.d_tame;Sphere.cstab;Sphere.h0;Terminal.I_LT_J_LT_4_EXPLICIT];
4582   TYPED_ABBREV_TAC `s = {i | i < 4 /\      (&2 *  #1.26 <       funlist_v39 [(0,1), #3.01; (0,2),&6; (1,3),&6] (&2 *  #1.26) 4 i       (SUC i) \/       &2 <       funlist_v39 [(0,1),sqrt8; (0,2),sqrt8; (1,3),sqrt8] (&2) 4 i (SUC i))}`;
4583   REWRITE_TAC[arith `i < 4 <=> i=0 \/ i=1 \/ i=2 \/ i=3`];
4584   NUM_REDUCE_TAC;
4585   REPEAT CONJ_TAC THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4] THEN TRY (MP_TAC sqrt8_flyspeck (* 1 *) THEN REAL_ARITH_TAC);
4586   TYPIFY `CARD s = 1` ENOUGH_TO_SHOW_TAC;
4587     BY(ARITH_TAC);
4588   MATCH_MP_TAC Misc_defs_and_lemmas.CARD_SING;
4589   REWRITE_TAC[SING];
4590   TYPIFY `0` EXISTS_TAC;
4591   EXPAND_TAC "s";
4592   REWRITE_TAC[EXTENSION;IN_ELIM_THM;IN_INSERT;NOT_IN_EMPTY];
4593   REWRITE_TAC[arith `i < 4 <=> i=0 \/ i=1 \/ i=2 \/ i=3`];
4594   GEN_TAC;
4595   ASM_CASES_TAC `x = 0`;
4596     ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4];
4597     BY(MP_TAC sqrt8_flyspeck (* 1 *) THEN REAL_ARITH_TAC);
4598   ASM_REWRITE_TAC[];
4599   REWRITE_TAC[TAUT `~(a /\ b) <=> (a ==> ~b)`];
4600   BY(STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4] THEN TRY (MP_TAC sqrt8_flyspeck (* 1 *) THEN REAL_ARITH_TAC))
4601   ]);;
4602   (* }}} *)
4603
4604 let is_scs_4M4 = prove_by_refinement(
4605   `is_scs_v39 scs_4M4'`,
4606   (* {{{ proof *)
4607   [
4608   REWRITE_TAC[Appendix.scs_4M4];
4609   REWRITE_TAC[Appendix.mk_unadorned_v39];
4610   MATCH_MP_TAC is_scs_funlist_basic;
4611   REWRITE_TAC[Appendix.d_tame;Sphere.cstab;Sphere.h0;Terminal.I_LT_J_LT_4_EXPLICIT];
4612   TYPED_ABBREV_TAC `s = {i | i < 4 /\      (&2 *  #1.26 <       funlist_v39 [(0,1), #3.01; (1,2), #3.01; (0,2),&6; (1,3),&6]       (&2 *  #1.26)       4       i       (SUC i) \/       &2 <       funlist_v39       [(0,1),&2 *  #1.26; (1,2),&2 *  #1.26; (0,2),&2 *  #1.26; (1,3),                                                                 &2 *  #1.26]       (&2)       4       i       (SUC i))}`;
4613   REWRITE_TAC[arith `i < 4 <=> i=0 \/ i=1 \/ i=2 \/ i=3`];
4614   NUM_REDUCE_TAC;
4615   REPEAT CONJ_TAC THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4] THEN TRY (REAL_ARITH_TAC);
4616   TYPIFY `s = {0,1}` ENOUGH_TO_SHOW_TAC;
4617     DISCH_THEN SUBST1_TAC;
4618     BY(MESON_TAC[Geomdetail.CARD2;arith `x <= 2 ==> x + 4 <= 6`]);
4619   EXPAND_TAC "s";
4620   REWRITE_TAC[EXTENSION;IN_ELIM_THM;IN_INSERT;NOT_IN_EMPTY];
4621   REWRITE_TAC[arith `i < 4 <=> i=0 \/ i=1 \/ i=2 \/ i=3`];
4622   GEN_TAC;
4623   ASM_CASES_TAC `x = 0`;
4624     ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4];
4625     BY( REAL_ARITH_TAC);
4626   ASM_CASES_TAC `x = 1`;
4627     ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4];
4628     BY( REAL_ARITH_TAC);
4629   ASM_REWRITE_TAC[];
4630   REWRITE_TAC[TAUT `~(a /\ b) <=> (a ==> ~b)`];
4631   BY(STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4] THEN TRY (REAL_ARITH_TAC))
4632   ]);;
4633   (* }}} *)
4634
4635 let is_scs_4M5 = prove_by_refinement(
4636   `is_scs_v39 scs_4M5'`,
4637   (* {{{ proof *)
4638   [
4639   REWRITE_TAC[Appendix.scs_4M5];
4640   REWRITE_TAC[Appendix.mk_unadorned_v39];
4641   MATCH_MP_TAC is_scs_funlist_basic;
4642   REWRITE_TAC[Appendix.d_tame;Sphere.cstab;Sphere.h0;Terminal.I_LT_J_LT_4_EXPLICIT];
4643   TYPED_ABBREV_TAC `s = {i | i < 4 /\      (&2 *  #1.26 <       funlist_v39 [(0,1), #3.01; (2,3), #3.01; (0,2),&6; (1,3),&6]       (&2 *  #1.26)       4       i       (SUC i) \/       &2 <       funlist_v39       [(0,1),&2 *  #1.26; (2,3),&2 *  #1.26; (0,2),&2 *  #1.26; (1,3),                                                                 &2 *  #1.26]       (&2)       4       i       (SUC i))}`;
4644   REWRITE_TAC[arith `i < 4 <=> i=0 \/ i=1 \/ i=2 \/ i=3`];
4645   NUM_REDUCE_TAC;
4646   REPEAT CONJ_TAC THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4] THEN TRY (REAL_ARITH_TAC);
4647   TYPIFY `s = {0,2}` ENOUGH_TO_SHOW_TAC;
4648     DISCH_THEN SUBST1_TAC;
4649     BY(MESON_TAC[Geomdetail.CARD2;arith `x <= 2 ==> x + 4 <= 6`]);
4650   EXPAND_TAC "s";
4651   REWRITE_TAC[EXTENSION;IN_ELIM_THM;IN_INSERT;NOT_IN_EMPTY];
4652   REWRITE_TAC[arith `i < 4 <=> i=0 \/ i=1 \/ i=2 \/ i=3`];
4653   GEN_TAC;
4654   ASM_CASES_TAC `x = 0`;
4655     ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4];
4656     BY( REAL_ARITH_TAC);
4657   ASM_CASES_TAC `x = 2`;
4658     ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4];
4659     BY( REAL_ARITH_TAC);
4660   ASM_REWRITE_TAC[];
4661   REWRITE_TAC[TAUT `~(a /\ b) <=> (a ==> ~b)`];
4662   BY(STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4] THEN TRY (REAL_ARITH_TAC))
4663   ]);;
4664   (* }}} *)
4665
4666 let is_scs_4M6 = prove_by_refinement(
4667   `is_scs_v39 scs_4M6'`,
4668   (* {{{ proof *)
4669   [
4670   REWRITE_TAC[Appendix.scs_4M6];
4671   REWRITE_TAC[Appendix.mk_unadorned_v39];
4672   MATCH_MP_TAC is_scs_funlist_basic;
4673   REWRITE_TAC[Appendix.d_tame;Sphere.cstab;Sphere.h0;Terminal.I_LT_J_LT_4_EXPLICIT];
4674   TYPED_ABBREV_TAC `s = {i | i < 4 /\      (&2 *  #1.26 <       funlist_v39 [(0,1), #3.01; (0,2),&6; (1,3),&6] (&2 *  #1.26) 4 i       (SUC i) \/       &2 <       funlist_v39 [(0,1),&2 *  #1.26; (0,2), #3.01; (1,3), #3.01] (&2) 4 i       (SUC i))}`;
4675   REWRITE_TAC[arith `i < 4 <=> i=0 \/ i=1 \/ i=2 \/ i=3`];
4676   NUM_REDUCE_TAC;
4677   REPEAT CONJ_TAC THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4] THEN TRY (MP_TAC sqrt8_flyspeck (* 1 *) THEN REAL_ARITH_TAC);
4678   TYPIFY `CARD s = 1` ENOUGH_TO_SHOW_TAC;
4679     BY(ARITH_TAC);
4680   MATCH_MP_TAC Misc_defs_and_lemmas.CARD_SING;
4681   REWRITE_TAC[SING];
4682   TYPIFY `0` EXISTS_TAC;
4683   EXPAND_TAC "s";
4684   REWRITE_TAC[EXTENSION;IN_ELIM_THM;IN_INSERT;NOT_IN_EMPTY];
4685   REWRITE_TAC[arith `i < 4 <=> i=0 \/ i=1 \/ i=2 \/ i=3`];
4686   GEN_TAC;
4687   ASM_CASES_TAC `x = 0`;
4688     ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4];
4689     BY(MP_TAC sqrt8_flyspeck (* 1 *) THEN REAL_ARITH_TAC);
4690   ASM_REWRITE_TAC[];
4691   REWRITE_TAC[TAUT `~(a /\ b) <=> (a ==> ~b)`];
4692   BY(STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4] THEN TRY (MP_TAC sqrt8_flyspeck (* 1 *) THEN REAL_ARITH_TAC))
4693   ]);;
4694   (* }}} *)
4695
4696 let is_scs_4M7 = prove_by_refinement(
4697   `is_scs_v39 scs_4M7`,
4698   (* {{{ proof *)
4699   [
4700   REWRITE_TAC[Appendix.scs_4M7];
4701   REWRITE_TAC[Appendix.mk_unadorned_v39];
4702   MATCH_MP_TAC is_scs_funlist_basic;
4703   REWRITE_TAC[Appendix.d_tame;Sphere.cstab;Sphere.h0;Terminal.I_LT_J_LT_4_EXPLICIT];
4704   TYPED_ABBREV_TAC `s = {i | i < 4 /\      (&2 *  #1.26 <       funlist_v39 [(0,1), #3.01; (1,2), #3.01; (0,2),&6; (1,3),&6; (1,3),&6]       (&2 *  #1.26)       4       i       (SUC i) \/       &2 <       funlist_v39       [(0,1),&2 *  #1.26; (1,2),&2 *  #1.26; (0,2), #3.01; (1,3), #3.01]       (&2)       4       i       (SUC i))}`;
4705   REWRITE_TAC[arith `i < 4 <=> i=0 \/ i=1 \/ i=2 \/ i=3`];
4706   NUM_REDUCE_TAC;
4707   REPEAT CONJ_TAC THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4] THEN TRY (REAL_ARITH_TAC);
4708   TYPIFY `s = {0,1}` ENOUGH_TO_SHOW_TAC;
4709     DISCH_THEN SUBST1_TAC;
4710     BY(MESON_TAC[Geomdetail.CARD2;arith `x <= 2 ==> x + 4 <= 6`]);
4711   EXPAND_TAC "s";
4712   REWRITE_TAC[EXTENSION;IN_ELIM_THM;IN_INSERT;NOT_IN_EMPTY];
4713   REWRITE_TAC[arith `i < 4 <=> i=0 \/ i=1 \/ i=2 \/ i=3`];
4714   GEN_TAC;
4715   ASM_CASES_TAC `x = 0`;
4716     ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4];
4717     BY( REAL_ARITH_TAC);
4718   ASM_CASES_TAC `x = 1`;
4719     ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4];
4720     BY( REAL_ARITH_TAC);
4721   ASM_REWRITE_TAC[];
4722   REWRITE_TAC[TAUT `~(a /\ b) <=> (a ==> ~b)`];
4723   BY(STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4] THEN TRY (REAL_ARITH_TAC))
4724   ]);;
4725   (* }}} *)
4726
4727 let is_scs_4M8 = prove_by_refinement(
4728   `is_scs_v39 scs_4M8`,
4729   (* {{{ proof *)
4730   [
4731   REWRITE_TAC[Appendix.scs_4M8];
4732   REWRITE_TAC[Appendix.mk_unadorned_v39];
4733   MATCH_MP_TAC is_scs_funlist_basic;
4734   REWRITE_TAC[Appendix.d_tame;Sphere.cstab;Sphere.h0;Terminal.I_LT_J_LT_4_EXPLICIT];
4735   TYPED_ABBREV_TAC `s = {i | i < 4 /\      (&2 *  #1.26 <       funlist_v39 [(0,1), #3.01; (2,3), #3.01; (0,2),&6; (1,3),&6; (1,3),&6]       (&2 *  #1.26)       4       i       (SUC i) \/       &2 <       funlist_v39       [(0,1),&2 *  #1.26; (2,3),&2 *  #1.26; (0,2), #3.01; (1,3), #3.01]       (&2)       4       i       (SUC i))} `;
4736   REWRITE_TAC[arith `i < 4 <=> i=0 \/ i=1 \/ i=2 \/ i=3`];
4737   NUM_REDUCE_TAC;
4738   REPEAT CONJ_TAC THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4] THEN TRY (REAL_ARITH_TAC);
4739   TYPIFY `s = {0,2}` ENOUGH_TO_SHOW_TAC;
4740     DISCH_THEN SUBST1_TAC;
4741     BY(MESON_TAC[Geomdetail.CARD2;arith `x <= 2 ==> x + 4 <= 6`]);
4742   EXPAND_TAC "s";
4743   REWRITE_TAC[EXTENSION;IN_ELIM_THM;IN_INSERT;NOT_IN_EMPTY];
4744   REWRITE_TAC[arith `i < 4 <=> i=0 \/ i=1 \/ i=2 \/ i=3`];
4745   GEN_TAC;
4746   ASM_CASES_TAC `x = 0`;
4747     ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4];
4748     BY( REAL_ARITH_TAC);
4749   ASM_CASES_TAC `x = 2`;
4750     ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4];
4751     BY( REAL_ARITH_TAC);
4752   ASM_REWRITE_TAC[];
4753   REWRITE_TAC[TAUT `~(a /\ b) <=> (a ==> ~b)`];
4754   BY(STRIP_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Uxckfpe.ARITH_4_TAC;psort_4] THEN TRY (REAL_ARITH_TAC))
4755   ]);;
4756   (* }}} *)
4757
4758 let is_scs_examples = prove_by_refinement(
4759   `is_scs_v39 scs_6I1 /\
4760 is_scs_v39 scs_5I1 /\
4761 is_scs_v39 scs_5I2 /\
4762 is_scs_v39 scs_5I3 /\
4763 is_scs_v39 scs_4I1 /\
4764 is_scs_v39 scs_4I2 /\
4765 is_scs_v39 scs_4I3 /\
4766 is_scs_v39 scs_3I1 /\
4767
4768 is_scs_v39 scs_6T1 /\
4769 is_scs_v39 scs_5T1 /\
4770 is_scs_v39 scs_4T1 /\
4771 is_scs_v39 scs_4T2 /\
4772 is_scs_v39 scs_4T3 /\
4773 is_scs_v39 scs_4T4 /\
4774 is_scs_v39 scs_4T5 /\
4775 is_scs_v39 scs_3T1 /\
4776 is_scs_v39 scs_3T2 /\
4777 is_scs_v39 scs_3T3 /\
4778 is_scs_v39 scs_3T4 /\
4779 is_scs_v39 scs_3T5 /\
4780 is_scs_v39 scs_3T6' /\
4781 is_scs_v39 scs_3T7 /\
4782
4783 is_scs_v39 scs_6M1 /\
4784 is_scs_v39 scs_5M1 /\
4785 is_scs_v39 scs_5M2 /\
4786 is_scs_v39 scs_4M1 /\
4787 is_scs_v39 scs_4M2 /\
4788 is_scs_v39 scs_4M3' /\
4789 is_scs_v39 scs_4M4' /\
4790 is_scs_v39 scs_4M5' /\
4791 is_scs_v39 scs_4M6' /\
4792 is_scs_v39 scs_4M7 /\
4793 is_scs_v39 scs_4M8 /\
4794 is_scs_v39 scs_3M1
4795 `,
4796   (* {{{ proof *)
4797   [
4798   BY(REWRITE_TAC[is_scs_6I1;is_scs_5I1;is_scs_5I2;is_scs_5I3;is_scs_4I1;is_scs_4I2;is_scs_4I3;is_scs_3I1; is_scs_6T1;is_scs_5T1;is_scs_4T1;is_scs_4T2;is_scs_4T3;is_scs_4T4;is_scs_4T5;is_scs_3T1;is_scs_3T2;is_scs_3T3;is_scs_3T4;is_scs_3T5;is_scs_3T6;is_scs_3T7;is_scs_6M1;is_scs_5M1;is_scs_5M2;is_scs_4M1;is_scs_4M2;is_scs_4M3;is_scs_4M4;is_scs_4M5;is_scs_4M6;is_scs_4M7;is_scs_4M8;is_scs_3M1])
4799   ]);;
4800   (* }}} *)
4801
4802
4803 let scs_example_list = [Appendix.scs_6I1;Appendix.scs_5I1;Appendix.scs_5I2;Appendix.scs_5I3;Appendix.scs_4I1;Appendix.scs_4I2;Appendix.scs_4I3;Appendix.scs_3I1; Appendix.scs_6T1;Appendix.scs_5T1;Appendix.scs_4T1;Appendix.scs_4T2;Appendix.scs_4T3;Appendix.scs_4T4;Appendix.scs_4T5;Appendix.scs_3T1;Appendix.scs_3T2;Appendix.scs_3T3;Appendix.scs_3T4;Appendix.scs_3T5;Appendix.scs_3T6;Appendix.scs_3T7;Appendix.scs_6M1;Appendix.scs_5M1;Appendix.scs_5M2;Appendix.scs_4M1;Appendix.scs_4M2;Appendix.scs_4M3;Appendix.scs_4M4;Appendix.scs_4M5;Appendix.scs_4M6;Appendix.scs_4M7;Appendix.scs_4M8;Appendix.scs_3M1];;
4804
4805 let unadorned_examples = prove_by_refinement(
4806   `unadorned_v39 scs_6I1 /\
4807 unadorned_v39 scs_5I1 /\
4808 unadorned_v39 scs_5I2 /\
4809 unadorned_v39 scs_5I3 /\
4810 unadorned_v39 scs_4I1 /\
4811 unadorned_v39 scs_4I2 /\
4812 unadorned_v39 scs_4I3 /\
4813 unadorned_v39 scs_3I1 /\
4814
4815 unadorned_v39 scs_6T1 /\
4816 unadorned_v39 scs_5T1 /\
4817 unadorned_v39 scs_4T1 /\
4818 unadorned_v39 scs_4T2 /\
4819 unadorned_v39 scs_4T3 /\
4820 unadorned_v39 scs_4T4 /\
4821 unadorned_v39 scs_4T5 /\
4822 unadorned_v39 scs_3T1 /\
4823 unadorned_v39 scs_3T2 /\
4824 unadorned_v39 scs_3T3 /\
4825 unadorned_v39 scs_3T4 /\
4826 unadorned_v39 scs_3T5 /\
4827 unadorned_v39 scs_3T6' /\
4828 unadorned_v39 scs_3T7 /\
4829
4830 unadorned_v39 scs_6M1 /\
4831 unadorned_v39 scs_5M1 /\
4832 unadorned_v39 scs_5M2 /\
4833 unadorned_v39 scs_4M1 /\
4834 unadorned_v39 scs_4M2 /\
4835 unadorned_v39 scs_4M3' /\
4836 unadorned_v39 scs_4M4' /\
4837 unadorned_v39 scs_4M5' /\
4838 unadorned_v39 scs_4M6' /\
4839 unadorned_v39 scs_4M7 /\
4840 unadorned_v39 scs_4M8 /\
4841 unadorned_v39 scs_3M1
4842 `,
4843   (* {{{ proof *)
4844   [
4845   REWRITE_TAC scs_example_list;
4846   BY(REWRITE_TAC[scs_mk_unadorned_unadorned])
4847   ]);;
4848   (* }}} *)
4849
4850 let basic_examples = prove_by_refinement(
4851   `scs_basic_v39 scs_6I1 /\
4852 scs_basic_v39 scs_5I1 /\
4853 scs_basic_v39 scs_5I2 /\
4854 scs_basic_v39 scs_5I3 /\
4855 scs_basic_v39 scs_4I1 /\
4856 scs_basic_v39 scs_4I2 /\
4857 scs_basic_v39 scs_4I3 /\
4858 scs_basic_v39 scs_3I1 /\
4859
4860 scs_basic_v39 scs_6T1 /\
4861 scs_basic_v39 scs_5T1 /\
4862 scs_basic_v39 scs_4T1 /\
4863 scs_basic_v39 scs_4T2 /\
4864 scs_basic_v39 scs_4T3 /\
4865 scs_basic_v39 scs_4T4 /\
4866 scs_basic_v39 scs_4T5 /\
4867 scs_basic_v39 scs_3T1 /\
4868 scs_basic_v39 scs_3T2 /\
4869 scs_basic_v39 scs_3T3 /\
4870 scs_basic_v39 scs_3T4 /\
4871 scs_basic_v39 scs_3T5 /\
4872 scs_basic_v39 scs_3T6' /\
4873 scs_basic_v39 scs_3T7 /\
4874
4875 scs_basic_v39 scs_6M1 /\
4876 scs_basic_v39 scs_5M1 /\
4877 scs_basic_v39 scs_5M2 /\
4878 scs_basic_v39 scs_4M1 /\
4879 scs_basic_v39 scs_4M2 /\
4880 scs_basic_v39 scs_4M3' /\
4881 scs_basic_v39 scs_4M4' /\
4882 scs_basic_v39 scs_4M5' /\
4883 scs_basic_v39 scs_4M6' /\
4884 scs_basic_v39 scs_4M7 /\
4885 scs_basic_v39 scs_4M8 /\
4886 scs_basic_v39 scs_3M1
4887 `,
4888   (* {{{ proof *)
4889   [
4890   REWRITE_TAC[Appendix.scs_basic];
4891   REWRITE_TAC[is_scs_examples;unadorned_examples];
4892   REWRITE_TAC scs_example_list;
4893   BY(REWRITE_TAC[Terminal.scs_unadorned_explicit])
4894   ]);;
4895   (* }}} *)
4896
4897 let scs_arrow_sing_empty = prove_by_refinement(
4898   `!s. scs_arrow_v39 {s} {} <=> (MMs_v39 s = {})`,
4899   (* {{{ proof *)
4900   [
4901   REWRITE_TAC[Appendix.scs_arrow_v39;NOT_IN_EMPTY;IN_SING];
4902   BY(MESON_TAC[])
4903   ]);;
4904   (* }}} *)
4905
4906 let pos_imp_scs_arrow_empty = prove_by_refinement(
4907   `!s. (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv) ==> scs_arrow_v39 {s} {}`,
4908   (* {{{ proof *)
4909   [
4910   REPEAT WEAKER_STRIP_TAC;
4911   REWRITE_TAC[scs_arrow_sing_empty;EXTENSION;NOT_IN_EMPTY];
4912   REWRITE_TAC[IN;Appendix.MMs_v39;Appendix.BBprime2_v39;Appendix.BBprime_v39];
4913   REPEAT WEAKER_STRIP_TAC;
4914   BY(ASM_MESON_TAC[arith `x < &0 ==> ~(&0 <= x)`])
4915   ]);;
4916   (* }}} *)
4917
4918 let arrow_rewrite_list = 
4919    map (UNDISCH o (REWRITE_RULE ((map GSYM scs_example_list) @ [LET_THM]))) 
4920      [Terminal.empty_3T1;Terminal.empty_3T2;Terminal.empty_3T3;Terminal.empty_3T4;
4921       Terminal.empty_3T5;Terminal.empty_3T6;Terminal.empty_3T6;Terminal.empty_3T7;
4922       Terminal.empty_4T1;Terminal.empty_4T2;Terminal.empty_4T3;Terminal.empty_4T4;
4923      Terminal.empty_4T5;empty_5T1;empty_6T1];;
4924
4925
4926
4927 let OCBICBY = prove_by_refinement(
4928   `main_nonlinear_terminal_v11 ==> 
4929
4930 scs_arrow_v39 {scs_6T1} {} /\
4931 scs_arrow_v39 {scs_5T1} {} /\
4932 scs_arrow_v39 {scs_4T1} {} /\
4933 scs_arrow_v39 {scs_4T2} {} /\
4934 scs_arrow_v39 {scs_4T3} {} /\
4935 scs_arrow_v39 {scs_4T4} {} /\
4936 scs_arrow_v39 {scs_4T5} {} /\
4937 scs_arrow_v39 {scs_3T1} {} /\
4938 scs_arrow_v39 {scs_3T2} {} /\
4939 scs_arrow_v39 {scs_3T3} {} /\
4940 scs_arrow_v39 {scs_3T4} {} /\
4941 scs_arrow_v39 {scs_3T5} {} /\
4942 scs_arrow_v39 {scs_3T6' } {} /\
4943 scs_arrow_v39 {scs_3T7} {} 
4944 `,
4945   (* {{{ proof *)
4946   [
4947   DISCH_TAC;
4948   REPEAT (GMATCH_SIMP_TAC pos_imp_scs_arrow_empty);
4949   BY(REWRITE_TAC arrow_rewrite_list)
4950   ]);;
4951   (* }}} *)
4952
4953
4954
4955
4956
4957
4958
4959
4960 end;;