Update from HH
[Flyspeck/.git] / text_formalization / local / terminal.hl
1 (* ========================================================================== *)
2 (* FLYSPECK - BOOK FORMALIZATION                                              *)
3 (* Section: Conclusions                                                       *)
4 (* Chapter: Local Fan                                                         *)
5 (* Author: Thomas C. Hales                                                    *)
6 (* Date: 2013-04-17                                                           *)
7 (* ========================================================================== *)
8
9 (*
10 Terminal cases of main estimate.
11 *)
12
13 flyspeck_needs "local/appendix_main_estimate.hl";;
14
15 module Terminal = struct
16
17
18 open Hales_tactic;;
19
20 (*
21 let filter_flypaper tl = 
22   List.flatten (map (function
23             | Flypaper s -> s
24             | _ -> []) tl);;
25
26 let has_flypaper_tag sl ind = 
27   let tl = ind.tags in
28     List.length (intersect (filter_flypaper tl) sl) > 0;;
29
30 let main_ineq_data = 
31   filter (fun ind ->
32             has_flypaper_tag ["UPONLFY";"SAUZWSD";"EDZEPIH";"OMKYNLT";"FHOLLLW";"TNNOPSI"] ind) (!Ineq.ineqs);;
33
34 let main_nonlinear = 
35   let ineql = map (fun idv -> idv.ineq) main_ineq_data in
36   let main_ineq_conj = end_itlist (curry mk_conj) ineql in
37   let _ = new_definition (mk_eq (`main_nonlinear_v39:bool`,main_ineq_conj)) in
38     ();;
39
40 let is_main = function 
41             | Main_estimate -> true
42             | _ -> false;;
43
44 let has_main ind = 
45     exists (is_main) ind.tags;;
46
47 let main_ineq_data = 
48   filter has_main (!Ineq.ineqs);;
49
50 let get_main_nonlinear = 
51   let ineql = map (fun ind -> ind.ineq) main_ineq_data in
52   let sl = map (fun ind -> ind.idv) main_ineq_data in
53   let main_ineq_conj = end_itlist (curry mk_conj) ineql in
54   let th = new_definition (mk_eq (`main_nonlinear_v39:bool`,main_ineq_conj)) in
55   let th1 = UNDISCH (MATCH_MP (TAUT `(a <=> b) ==> (a ==> b)`) th) in
56   let co1 thm = if (is_conj (concl thm)) then CONJUNCT1 thm else thm in
57     fun s ->
58       let i = index s sl in
59       let th2 = funpow i CONJUNCT2 th1 in
60         co1 th2;;
61
62 *)
63
64
65 let get_main_nonlinear = 
66   let is_main = function 
67     | Main_estimate -> true
68     | _ -> false in
69   let has_main ind = 
70     exists (is_main) ind.tags in
71   let main_ineq_data1 = 
72     filter has_main (!Ineq.ineqs) in
73   let id = map (fun t-> t.idv) main_ineq_data1 in
74   let main_ineq_data = map (fun t -> hd(Ineq.getexact t)) id in
75   let ineql = map (fun ind -> ind.ineq) main_ineq_data in
76   let sl = map (fun ind -> ind.idv) main_ineq_data in
77   let main_ineq_conj = end_itlist (curry mk_conj) ineql in
78   let th = new_definition (mk_eq (`main_nonlinear_terminal_v11:bool`,main_ineq_conj)) in
79   let th1 = UNDISCH (MATCH_MP (TAUT `(a <=> b) ==> (a ==> b)`) th) in
80   let co1 thm = if (is_conj (concl thm)) then CONJUNCT1 thm else thm in
81   let tryindex s sl = try index s sl with  _ -> report s; failwith s in
82     fun s ->
83       let i = tryindex s sl in
84       let th2 = funpow i CONJUNCT2 th1 in
85         co1 th2;;
86
87
88 (* Start with OWZLKVY. *)
89 let LET_THM = CONJ LET_DEF LET_END_DEF;;
90
91 let sqrt8_flyspeck = prove_by_refinement(
92   `#2.828427 < sqrt8 /\
93      sqrt8 <  #2.828428`,
94   (* {{{ proof *)
95   [
96     BY(REWRITE_TAC[Flyspeck_constants.bounds])
97   ]);;
98   (* }}} *)
99
100 let SOL_SOLID_TRIANGLE_ALT = prove_by_refinement(
101   `!v0 v1 v2 v3.
102          ~coplanar {v0, v1, v2, v3} 
103          ==> sol v0 (convex hull {v0, v1, v2, v3}) = dihV v0 v1 v2 v3 + dihV v0 v2 v3 v1 + dihV v0 v3 v1 v2 - pi`,
104   (* {{{ proof *)
105   [
106     BY(MESON_TAC[Tskajxy_lemmas.SOL_SOLID_TRIANGLE])
107   ]);;
108   (* }}} *)
109
110 let sol_x_nn = prove_by_refinement(
111   `!x1 x2 x3 x4 x5 x6.
112     &0 < x1 /\ &0 < x2 /\ &0 < x3 /\
113             &0 < ups_x x1 x2 x6 /\
114             &0 < ups_x x2 x3 x4 /\
115             &0 < ups_x x1 x3 x5 /\
116             &0 < eulerA_x x1 x2 x3 x4 x5 x6 /\
117             &0 < delta_x x1 x2 x3 x4 x5 x6 ==>
118     &0 < sol_x x1 x2 x3 x4 x5 x6`,
119   (* {{{ proof *)
120   [
121   REPEAT WEAKER_STRIP_TAC;
122   GMATCH_SIMP_TAC Merge_ineq.sol_x_sol_euler_x;
123   ASM_REWRITE_TAC[Sphere.sol_euler_x;LET_DEF;LET_END_DEF];
124   REPEAT (GMATCH_SIMP_TAC SQRT_MUL);
125   REWRITE_TAC[GSYM Sphere.eulerA_x];
126   GMATCH_SIMP_TAC REAL_LE_MUL;
127   ASM_SIMP_TAC[arith `&0 < x ==> &0 <= x`];
128   MATCH_MP_TAC (arith `&0 < x ==> &0 < &2 * x `);
129   GMATCH_SIMP_TAC Merge_ineq.ATN2_POS;
130   CONJ_TAC;
131     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
132   GMATCH_SIMP_TAC REAL_LT_RSQRT;
133   BY(FIRST_X_ASSUM MP_TAC THEN REAL_ARITH_TAC)
134   ]);;
135   (* }}} *)
136
137
138 let DIH_X_NN = prove_by_refinement(
139   `!x1 x2 x3 x4 x5 x6. &0 < x1 /\ &0 <= delta_x x1 x2 x3 x4 x5 x6 
140            ==> &0 <= dih_x x1 x2 x3 x4 x5 x6`,
141   (* {{{ proof *)
142   [
143   REPEAT WEAKER_STRIP_TAC;
144   ASM_CASES_TAC `&0 < delta_x x1 x2 x3 x4 x5 x6`;
145     MATCH_MP_TAC Merge_ineq.dih_x_nn;
146     BY(ASM_REWRITE_TAC[]);
147   TYPIFY `delta_x x1 x2 x3 x4 x5 x6 = &0` (C SUBGOAL_THEN ASSUME_TAC);
148     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
149   ASM_REWRITE_TAC[Sphere.dih_x;LET_DEF;LET_END_DEF];
150   REWRITE_TAC[arith `x * &0 = &0`;SQRT_0];
151   TYPED_ABBREV_TAC `d4 = -- delta_x4 x1 x2 x3 x4 x5 x6`;
152   INTRO_TAC Merge_ineq.atn2_0 [`d4`];
153   REPEAT WEAKER_STRIP_TAC;
154   ASSUME_TAC PI_POS;
155   MP_TAC (arith `&0 < d4 \/ d4 < &0 \/ d4 = &0`);
156   DISCH_THEN DISJ_CASES_TAC;
157     ASM_SIMP_TAC[];
158     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
159   FIRST_X_ASSUM DISJ_CASES_TAC;
160     ASM_SIMP_TAC[];
161     BY(REAL_ARITH_TAC);
162   ASM_SIMP_TAC[];
163   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC)
164   ]);;
165   (* }}} *)
166
167 let DIH_Y_NN = prove_by_refinement(
168   `!y1 y2 y3 y4 y5 y6.
169     &0 < y1 /\ &0 <= delta_y y1 y2 y3 y4 y5 y6 ==>
170     &0 <= dih_y y1 y2 y3 y4 y5 y6`,
171   (* {{{ proof *)
172   [
173   REPEAT WEAKER_STRIP_TAC;
174   REWRITE_TAC[Sphere.dih_y;LET_DEF;LET_END_DEF];
175   MATCH_MP_TAC DIH_X_NN;
176   GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
177   ASM_REWRITE_TAC[];
178   FIRST_X_ASSUM MP_TAC;
179   BY(REWRITE_TAC[Sphere.delta_y])
180   ]);;
181   (* }}} *)
182
183 let RHO_LB = prove_by_refinement(
184   `!y. &2 <= y  ==> &1 <= rho y`,
185   (* {{{ proof *)
186   [
187   REPEAT WEAKER_STRIP_TAC;
188   REWRITE_TAC[Nonlinear_lemma.rho_alt];
189   MATCH_MP_TAC (arith `&0 <= x ==> &1 <= &1 + x `);
190   GMATCH_SIMP_TAC REAL_LE_MUL;
191   REWRITE_TAC[GSYM Nonlinear_lemma.sol0_over_pi_EQ_const1];
192   GMATCH_SIMP_TAC REAL_LE_RDIV_EQ;
193   GMATCH_SIMP_TAC REAL_LE_RDIV_EQ;
194   REWRITE_TAC[arith `&0 * x = &0`];
195   REWRITE_TAC[PI_POS];
196   INTRO_TAC Flyspeck_constants.bounds [];
197   FIRST_X_ASSUM MP_TAC;
198   BY(REAL_ARITH_TAC)
199   ]);;
200   (* }}} *)
201
202 let DIH_Y_LT_RHAZIM = prove_by_refinement(
203   `!y1 y2 y3 y4 y5 y6.
204     &2 <= y1 /\ &0 <= delta_y y1 y2 y3 y4 y5 y6 ==>
205     dih_y y1 y2 y3 y4 y5 y6 <= rhazim y1 y2 y3 y4 y5 y6`,
206   (* {{{ proof *)
207   [
208   REPEAT WEAKER_STRIP_TAC;
209   REWRITE_TAC[Sphere.rhazim];
210   MATCH_MP_TAC (arith `&0 <= (r - &1) * d ==> d <= r * d`);
211   GMATCH_SIMP_TAC REAL_LE_MUL;
212   CONJ2_TAC;
213     MATCH_MP_TAC DIH_Y_NN;
214     ASM_REWRITE_TAC[];
215     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
216   MATCH_MP_TAC (arith `&1 <= r ==> &0 <= r - &1`);
217   MATCH_MP_TAC RHO_LB;
218   BY(ASM_REWRITE_TAC[])
219   ]);;
220   (* }}} *)
221
222 let taum_taum_x = prove_by_refinement(
223   `!y1 y2 y3 y4 y5 y6.
224     &0 <= y1 /\ &0 <= y2 /\ &0 <= y3 /\ &0 <= y4 /\ &0 <= y5 /\ &0 <= y6 ==>
225     taum y1 y2 y3 y4 y5 y6 = y_of_x taum_x y1 y2 y3 y4 y5 y6`,
226   (* {{{ proof *)
227   [
228   REWRITE_TAC[Sphere.y_of_x;Sphere.taum_x;Sphere.rhazim_x;Sphere.rhazim2_x;Sphere.rhazim3_x];
229   REWRITE_TAC[Nonlinear_lemma.taum_123];
230   REPEAT WEAKER_STRIP_TAC;
231   BY(ASM_SIMP_TAC[Nonlinear_lemma.sqrtxx])
232   ]);;
233   (* }}} *)
234
235 (* Now do OCBICBY *)
236
237 let BBs_terminal = `!s vv. MEM s scs_terminal_v116 /\  BBs_v39 s vv ==> &0 <= taustar_v39 s vv`;;
238
239 let scs_unadorned_explicit = prove_by_refinement(
240   `(!k d a b.
241              scs_k_v39 (mk_unadorned_v39 k d a b) = k) /\
242         (!k d a b .
243              scs_d_v39 (mk_unadorned_v39 k d a b) = d) /\
244         (!k d a b .
245              scs_a_v39 (mk_unadorned_v39 k d a b) = a) /\
246         (!k d a b .
247              scs_am_v39 (mk_unadorned_v39 k d a b) = a) /\
248         (!k d a b .
249              scs_b_v39 (mk_unadorned_v39 k d a b) = b) /\
250         (!k d a b .
251              scs_bm_v39 (mk_unadorned_v39 k d a b) = b) /\
252         (!k d a b .
253              scs_J_v39 (mk_unadorned_v39 k d a b) = (\ i j. F)) /\
254         (!k d a b .
255              scs_lo_v39 (mk_unadorned_v39 k d a b) = {}) /\
256         (!k d a b .
257              scs_hi_v39 (mk_unadorned_v39 k d a b) = {}) /\
258         (!k d a b .
259              scs_str_v39 (mk_unadorned_v39 k d a b) = {})`,
260   (* {{{ proof *)
261   [
262   BY(REWRITE_TAC[Appendix.scs_v39_explicit;Appendix.mk_unadorned_v39])
263   ]);;
264   (* }}} *)
265
266 let UNADORNED_NOT_EAR = prove_by_refinement(
267   `!k d a b.
268     ~(is_ear_v39 (mk_unadorned_v39 k d a b))`,
269   (* {{{ proof *)
270   [
271   REWRITE_TAC[Appendix.is_ear_v39;scs_unadorned_explicit;EMPTY_GSPEC];
272   BY(MESON_TAC[NOT_IN_EMPTY;IN_SING])
273   ]);;
274   (* }}} *)
275
276 let dsv_unadorned = prove_by_refinement(
277   `!k d a b vv.
278     dsv_v39 (mk_unadorned_v39 k d a b) vv = d `,
279   (* {{{ proof *)
280   [
281   REWRITE_TAC[Appendix.dsv_v39;UNADORNED_NOT_EAR;scs_unadorned_explicit;EMPTY_GSPEC;SUM_CLAUSES];
282   BY(REAL_ARITH_TAC)
283   ]);;
284   (* }}} *)
285
286 let dsv_F = prove_by_refinement(
287   `!k d a a' b' b  s s' s'' vv.
288     dsv_v39 (scs_v39 (k, d, a, a', b', b, (\i j. F), s, s',s'')) vv = d `,
289   (* {{{ proof *)
290   [
291   ASM_REWRITE_TAC[Appendix.dsv_v39;Appendix.scs_v39_explicit;EMPTY_GSPEC;SUM_CLAUSES];
292   BY(REAL_ARITH_TAC)
293   ]);;
294   (* }}} *)
295
296 let SUM_INTER = prove_by_refinement(
297   `!(A:A->bool) B f. sum (A INTER B) f = sum A (\i. if (i IN B) then f i else &0)`,
298   (* {{{ proof *)
299   [
300   REPEAT WEAKER_STRIP_TAC;
301   INTRO_TAC SUM_SUPERSET [`(\i. if (i IN B) then f i else &0)`;`A INTER B`;`A`];
302   ANTS_TAC;
303     CONJ_TAC;
304       BY(SET_TAC[]);
305     BY(SET_TAC[]);
306   DISCH_THEN SUBST1_TAC;
307   MATCH_MP_TAC SUM_EQ;
308   REWRITE_TAC[IN_INTER];
309   BY(MESON_TAC[])
310   ]);;
311   (* }}} *)
312
313 let dsv_fun3 = prove_by_refinement(
314   `! d a a' b' b f  s s' s'' vv.
315     dsv_v39 (scs_v39 (3, d, a, a', b', b, f  , s, s',s'')) vv = 
316     d +
317   #0.1 *
318  (if is_ear_v39 (scs_v39 (3,d,a,a',b',b,f ,s,s',s''))
319   then &1
320   else -- &1) *
321  ((if f 0 1 then cstab - dist (vv 0,vv 1) else &0) +
322   (if f 1 2 then cstab - dist (vv 1,vv 2) else &0) +
323   (if f 2 3 then cstab - dist (vv 2,vv 3) else &0) +
324   &0) `,
325   (* {{{ proof *)
326   [
327   REPEAT WEAKER_STRIP_TAC;
328   ASM_REWRITE_TAC[Appendix.dsv_v39;Appendix.scs_v39_explicit;EMPTY_GSPEC;SUM_CLAUSES];
329   TYPIFY `{i | i < 3 /\ f i (SUC i) } = {0,1,2} INTER {i | f i (SUC i) }` (C SUBGOAL_THEN SUBST1_TAC);
330     REWRITE_TAC[EXTENSION;IN_ELIM_THM;IN_INTER;IN_INSERT;NOT_IN_EMPTY];
331     BY(REWRITE_TAC[arith `x < 3 <=> (x = 0 \/ x = 1 \/ x = 2)`]);
332   REWRITE_TAC[SUM_INTER;IN_ELIM_THM];
333   REPEAT (GMATCH_SIMP_TAC (CONJUNCT2 SUM_CLAUSES));
334   REWRITE_TAC[NOT_IN_EMPTY;IN_INSERT;FINITE_EMPTY;FINITE_INSERT;arith `~(0 = 1) /\ ~(0=2) /\ ~(1 = 2)`;SUM_CLAUSES];
335   BY(REWRITE_TAC[arith `SUC 0 = 1 /\ SUC 1 = 2 /\ SUC 2 = 3`])
336   ]);;
337   (* }}} *)
338
339 let dsv_fun4 = prove_by_refinement(
340   `! d a a' b' b f  s s' s'' vv.
341     dsv_v39 (scs_v39 (4, d, a, a', b', b, f  , s, s',s'')) vv = 
342     d -
343   #0.1 *
344  ((if f 0 1 then cstab - dist (vv 0,vv 1) else &0) +
345   (if f 1 2 then cstab - dist (vv 1,vv 2) else &0) +
346   (if f 2 3 then cstab - dist (vv 2,vv 3) else &0) +
347   (if f 3 4 then cstab - dist (vv 3,vv 4) else &0) +
348   &0) `,
349   (* {{{ proof *)
350   [
351   REPEAT WEAKER_STRIP_TAC;
352   ASM_REWRITE_TAC[Appendix.dsv_v39;Appendix.scs_v39_explicit;EMPTY_GSPEC;SUM_CLAUSES];
353   REWRITE_TAC[Appendix.is_ear_v39;Appendix.scs_v39_explicit;arith `~(4 = 3)`];
354   MATCH_MP_TAC (arith `(s = s') ==> d + a * -- &1 * s = d - a * s'`);
355   TYPIFY `{i | i < 4 /\ f i (SUC i) } = {0,1,2,3} INTER {i | f i (SUC i) }` (C SUBGOAL_THEN SUBST1_TAC);
356     REWRITE_TAC[EXTENSION;IN_ELIM_THM;IN_INTER;IN_INSERT;NOT_IN_EMPTY];
357     BY(REWRITE_TAC[arith `x < 4 <=> (x = 0 \/ x = 1 \/ x = 2 \/ x = 3)`]);
358   REWRITE_TAC[SUM_INTER;IN_ELIM_THM];
359   REPEAT (GMATCH_SIMP_TAC (CONJUNCT2 SUM_CLAUSES));
360   REWRITE_TAC[NOT_IN_EMPTY;IN_INSERT;FINITE_EMPTY;FINITE_INSERT;arith `~(0 = 1) /\ ~(0=2) /\ ~(1 = 2) /\ ~(2 = 3) /\ ~(0=3) /\ ~(1 = 3)`;SUM_CLAUSES];
361   BY(REWRITE_TAC[arith `SUC 0 = 1 /\ SUC 1 = 2 /\ SUC 2 = 3 /\ SUC 3 = 4`])
362   ]);;
363   (* }}} *)
364
365 let IMAGE_SUBSET_IN = prove_by_refinement(
366   `!(f:A->B) A B. IMAGE f A SUBSET B <=> (!a. a IN A ==> f a IN B)`,
367   (* {{{ proof *)
368   [
369   SET_TAC[]
370   ]);;
371   (* }}} *)
372
373 let taustar3  = prove_by_refinement(
374   `!d a b. 
375                              (let s = mk_unadorned_v39     3 d a b in
376                                 ((!v0 v1 v2. 
377                                     &2 <= norm v0 /\ norm v0 <= &2 * h0 /\
378                                     &2 <= norm v1 /\ norm v1 <= &2 * h0 /\
379                                     &2 <= norm v2 /\ norm v2 <= &2 * h0 /\
380                                     a 0 1 <= dist(v0,v1) /\ dist(v0,v1) <= b 0 1 /\
381                                     a 1 2 <= dist(v1,v2) /\ dist(v1,v2) <= b 1 2 /\
382                                     a 0 2 <= dist(v0,v2) /\ dist(v0,v2) <= b 0 2 ==>
383                                     d <= tau3 v0 v1 v2) ==>
384     (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv)))`,
385   (* {{{ proof *)
386   [
387   REWRITE_TAC[LET_DEF;LET_END_DEF];
388   REPEAT WEAKER_STRIP_TAC;
389   REWRITE_TAC[Appendix.taustar_v39;scs_unadorned_explicit;arith `3 <= 3`];
390   REWRITE_TAC[LET_DEF;LET_END_DEF];
391   REWRITE_TAC[dsv_unadorned];
392   REWRITE_TAC[arith `&0 <= t - d <=> d <= t`];
393   FIRST_X_ASSUM MATCH_MP_TAC;
394   FIRST_X_ASSUM MP_TAC;
395   REWRITE_TAC[Appendix.BBs_v39;scs_unadorned_explicit;arith `3 <= 3`];
396   REWRITE_TAC[LET_DEF;LET_END_DEF];
397   REWRITE_TAC[IMAGE_SUBSET_IN;IN_UNIV;Fnjlbxs.in_ball_annulus];
398   BY(MESON_TAC[])
399   ]);;
400   (* }}} *)
401
402 let taustar3_fun = prove_by_refinement(
403   `!d a b f.
404   (let s = scs_v39 (3,d,a,a,b,b,f,{},{},{}) in
405     ((!v0 v1 v2.
406    &2 <= norm v0 /\ norm v0 <= &2 * h0 /\
407                                     &2 <= norm v1 /\ norm v1 <= &2 * h0 /\
408                                     &2 <= norm v2 /\ norm v2 <= &2 * h0 /\
409                                     a 0 1 <= dist(v0,v1) /\ dist(v0,v1) <= b 0 1 /\
410                                     a 1 2 <= dist(v1,v2) /\ dist(v1,v2) <= b 1 2 /\
411                                     a 0 2 <= dist(v0,v2) /\ dist(v0,v2) <= b 0 2 ==>
412                                      d +
413   #0.1 *
414  (if is_ear_v39 s
415   then &1
416   else -- &1) *
417  ((if f 0 1 then cstab - dist (v0,v1) else &0) +
418   (if f 1 2 then cstab - dist (v1,v2) else &0) +
419   (if f 2 3 then cstab - dist (v2,v0) else &0) +
420   &0) <= tau3 v0 v1 v2) ==>
421     (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv)))    `,
422   (* {{{ proof *)
423   [
424   REWRITE_TAC[LET_DEF;LET_END_DEF];
425   REPEAT WEAKER_STRIP_TAC;
426   REWRITE_TAC[Appendix.taustar_v39;Appendix.scs_v39_explicit;arith `3 <= 3`];
427   REWRITE_TAC[LET_DEF;LET_END_DEF];
428   REWRITE_TAC[dsv_fun3];
429   REWRITE_TAC[arith `&0 <= t - d <=> d <= t`];
430   TYPIFY `vv 3 = vv 0` (C SUBGOAL_THEN SUBST1_TAC);
431     FIRST_X_ASSUM MP_TAC;
432     REWRITE_TAC[Appendix.BBs_v39];
433     REWRITE_TAC[Appendix.scs_v39_explicit];
434     REWRITE_TAC[LET_DEF;LET_END_DEF];
435     REWRITE_TAC[Oxl_def.periodic];
436     BY(MESON_TAC[arith `0 + 3 = 3`]);
437   FIRST_X_ASSUM MATCH_MP_TAC;
438   FIRST_X_ASSUM MP_TAC;
439   REWRITE_TAC[Appendix.BBs_v39;Appendix.scs_v39_explicit;arith `3 <= 3`];
440   REWRITE_TAC[LET_DEF;LET_END_DEF];
441   REWRITE_TAC[IMAGE_SUBSET_IN;IN_UNIV;Fnjlbxs.in_ball_annulus];
442   BY(MESON_TAC[])
443   ]);;
444   (* }}} *)
445
446 let NONPARALLEL_BALL_ANNULUS40 =prove_by_refinement(`!v w. &2<= norm(v-w) /\ norm(v-w)< &4 /\ v IN ball_annulus /\ w IN ball_annulus
447 ==> ~(collinear ({vec 0} UNION {v,w}))`,
448 [
449   REPEAT GEN_TAC;
450   REWRITE_TAC[SET_RULE`{A} UNION {B,C}={A,B,C}`;GSYM NORM_CAUCHY_SCHWARZ_EQUAL;NORM_LE_SQUARE;NORM_LT_SQUARE;];
451   ONCE_REWRITE_TAC[REAL_ARITH`A<=B <=> B >= A`];
452   REWRITE_TAC[NORM_GE_SQUARE;REAL_ARITH`~(&2<= &0) /\ &0 < &2`];
453   ONCE_REWRITE_TAC[REAL_ARITH`A>=B <=> B <= A`];
454   REWRITE_TAC[DOT_RSUB;DOT_LSUB;DOT_SQUARE_NORM];
455   DISJ_CASES_TAC(REAL_ARITH`&0<= v dot w \/ &0<= --(v dot (w:real^3))`);
456     POP_ASSUM MP_TAC;
457     REWRITE_TAC[GSYM REAL_ABS_REFL];
458     RESA_TAC;
459     REPEAT STRIP_TAC;
460     POP_ASSUM(fun t-> ASM_TAC THEN REWRITE_TAC[t] THEN REPEAT STRIP_TAC THEN MP_TAC t);
461     REWRITE_TAC[];
462     ONCE_REWRITE_TAC[DOT_SYM];
463     STRIP_TAC;
464     POP_ASSUM(fun t-> ASM_TAC THEN REWRITE_TAC[t] );
465     REWRITE_TAC[REAL_ARITH`A pow 2 -A*B-(A*B-B pow 2)=(A-B) pow 2`;GSYM REAL_LE_SQUARE_ABS;Pack_defs.ball_annulus;IN_ELIM_THM;DIFF;ball;cball;dist;VECTOR_ARITH`vec 0 -A= --A`;NORM_NEG;REAL_ARITH`~(a<b)<=> b<=a`];
466     DISJ_CASES_TAC(REAL_ARITH`&0<= norm (v:real^3) -norm w \/ &0<= --(norm v -norm (w:real^3))`);
467       POP_ASSUM MP_TAC;
468       REWRITE_TAC[GSYM REAL_ABS_REFL];
469       RESA_TAC;
470       REPEAT STRIP_TAC;
471       MP_TAC(REAL_ARITH`norm (v:real^3) <= &2 * h0 /\ &2 <= norm (w:real^3) ==> norm v - norm w <= &2*(h0 - &1)`);
472       ASM_REWRITE_TAC[Sphere.h0];
473       ASM_TAC;
474       BY(REAL_ARITH_TAC);
475     POP_ASSUM MP_TAC;
476     REWRITE_TAC[GSYM REAL_ABS_REFL;REAL_ABS_NEG];
477     RESA_TAC;
478     ONCE_REWRITE_TAC[REAL_ARITH`--(A-B)=B-A`];
479     REPEAT STRIP_TAC;
480     MP_TAC(REAL_ARITH`norm (w:real^3) <= &2 * h0 /\ &2 <= norm (v:real^3) ==> norm w - norm v <= &2*(h0 - &1)`);
481     ASM_REWRITE_TAC[Sphere.h0];
482     ASM_TAC;
483     BY(REAL_ARITH_TAC);
484   POP_ASSUM MP_TAC;
485   REWRITE_TAC[GSYM REAL_ABS_REFL;REAL_ABS_NEG];
486   RESA_TAC;
487   ONCE_REWRITE_TAC[REAL_ARITH`--A=B<=> A= --B`];
488   REPEAT STRIP_TAC;
489   POP_ASSUM(fun t-> ASM_TAC THEN REWRITE_TAC[t] THEN REPEAT STRIP_TAC THEN MP_TAC t);
490   REWRITE_TAC[];
491   ONCE_REWRITE_TAC[DOT_SYM];
492   STRIP_TAC;
493   POP_ASSUM(fun t-> ASM_TAC THEN REWRITE_TAC[t] );
494   REWRITE_TAC[REAL_ARITH`A pow 2 -(--(A*B))-(--(A*B)-B pow 2)=(A+B) pow 2`;GSYM REAL_LE_SQUARE_ABS;Pack_defs.ball_annulus;IN_ELIM_THM;DIFF;ball;cball;dist;VECTOR_ARITH`vec 0 -A= --A`;NORM_NEG;REAL_ARITH`~(a<b)<=> b<=a`];
495   STRIP_TAC;
496   REMOVE_ASSUM_TAC;
497   MP_TAC(REAL_ARITH`&0<= norm (v:real^3) /\ &0<= norm (w:real^3)==> &0<= norm v + norm w`);
498   SIMP_TAC[NORM_POS_LE];
499   REWRITE_TAC[GSYM REAL_ABS_REFL];
500   RESA_TAC;
501   REPEAT STRIP_TAC;
502   MP_TAC(REAL_ARITH`&2<=norm (w:real^3) /\ &2 <= norm (v:real^3) ==> &4<= norm v + norm w `);
503   ASM_REWRITE_TAC[];
504   DISCH_TAC;
505   FIRST_X_ASSUM_ST `pow` MP_TAC;
506   REWRITE_TAC[];
507   REWRITE_TAC[arith `~(x2 < y2) <=> y2 <= x2`];
508   MATCH_MP_TAC Collect_geom2.POS_IMP_POW2;
509   ASM_REWRITE_TAC[];
510   BY(REAL_ARITH_TAC)
511 ]
512 );;
513
514 let NONPARALLEL_BALL_ANNULUS_ALT = prove_by_refinement(
515   `!v w. &2 <= dist(v,w) /\
516      dist(v,w) <= #3.62 /\ // was cstab.
517      v IN ball_annulus /\
518      w IN ball_annulus
519      ==> ~collinear ({vec 0,v, w})`,
520   (* {{{ proof *)
521   [
522   REPEAT WEAKER_STRIP_TAC;
523   FIRST_X_ASSUM MP_TAC;
524   TYPIFY `{vec 0,v,w} = {vec 0} UNION {v,w}` (C SUBGOAL_THEN SUBST1_TAC);
525     BY(SET_TAC[]);
526   REWRITE_TAC[];
527   MATCH_MP_TAC Dih2k_hypermap.NONPARALLEL_BALL_ANNULUS362;
528   REWRITE_TAC[GSYM dist];
529   BY(ASM_REWRITE_TAC[])
530   ]);;
531   (* }}} *)
532
533 let NONPARALLEL_BALL_ANNULUS40_ALT = prove_by_refinement(
534   `!v w. &2 <= dist(v,w) /\
535      dist(v,w) < &4 /\ 
536      v IN ball_annulus /\
537      w IN ball_annulus
538      ==> ~collinear ({vec 0,v, w})`,
539   (* {{{ proof *)
540   [
541   REPEAT WEAKER_STRIP_TAC;
542   FIRST_X_ASSUM MP_TAC;
543   TYPIFY `{vec 0,v,w} = {vec 0} UNION {v,w}` (C SUBGOAL_THEN SUBST1_TAC);
544     BY(SET_TAC[]);
545   REWRITE_TAC[];
546   MATCH_MP_TAC NONPARALLEL_BALL_ANNULUS40;
547   REWRITE_TAC[GSYM dist];
548   BY(ASM_REWRITE_TAC[])
549   ]);;
550   (* }}} *)
551
552 let tau3_taum = prove_by_refinement(
553   `!(v0:real^3) v1 v2.
554     v0 IN ball_annulus /\ v1 IN ball_annulus /\ v2 IN ball_annulus /\
555     &2 <= dist(v0,v1) /\ &2 <= dist(v0,v2) /\ &2 <= dist(v1,v2) /\
556     dist(v0,v1) <= #3.62 /\ dist(v0,v2) <= #3.62 /\ dist(v1,v2) <= #3.62 ==>
557     tau3 v0 v1 v2 = taum (norm v0) (norm v1) (norm v2) (dist(v1,v2)) (dist(v0,v2)) (dist(v0,v1))`,
558   (* {{{ proof *)
559   [
560   REWRITE_TAC[Appendix.tau3;Nonlinear_lemma.taum_123;Sphere.rhazim2;Sphere.rhazim3;Sphere.node2_y;Sphere.node3_y];
561   REWRITE_TAC[Sphere.rhazim;Nonlinear_lemma.sol0_const1];
562   REPEAT WEAKER_STRIP_TAC;
563   TYPIFY `dihV (vec 0) v0 v1 v2 = dih_y (norm v0) (norm v1) (norm v2) (dist (v1,v2)) (dist (v0,v2)) (dist (v0,v1)) /\ dihV (vec 0) v1 v2 v0  = dih_y (norm v1) (norm v2) (norm v0) (dist (v0,v2)) (dist (v0,v1)) (dist (v1,v2)) /\ dihV (vec 0) v2 v0 v1 = dih_y (norm v2) (norm v0) (norm v1) (dist (v0,v1)) (dist (v1,v2))  (dist (v0,v2))` ENOUGH_TO_SHOW_TAC;
564     DISCH_THEN (unlist REWRITE_TAC);
565     BY(REAL_ARITH_TAC);
566   REPEAT (GMATCH_SIMP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] Merge_ineq.DIHV_EQ_DIH_Y));
567   REWRITE_TAC[DIST_0];
568   TYPIFY `dist(v2,v0) = dist(v0,v2) /\ dist(v2,v1) = dist(v1,v2) /\ dist(v1,v0) = dist(v0,v1)` (C SUBGOAL_THEN ASSUME_TAC);
569     BY(MESON_TAC[DIST_SYM]);
570   ASM_REWRITE_TAC[];
571   REPEAT (GMATCH_SIMP_TAC NONPARALLEL_BALL_ANNULUS_ALT);
572   BY(ASM_REWRITE_TAC[])
573   ]);;
574   (* }}} *)
575
576 let tau3_taum_40 = prove_by_refinement(
577   `!(v0:real^3) v1 v2.
578     v0 IN ball_annulus /\ v1 IN ball_annulus /\ v2 IN ball_annulus /\
579     &2 <= dist(v0,v1) /\ &2 <= dist(v0,v2) /\ &2 <= dist(v1,v2) /\
580     dist(v0,v1) < &4 /\ dist(v0,v2) < &4 /\ dist(v1,v2) < &4 ==>
581     tau3 v0 v1 v2 = taum (norm v0) (norm v1) (norm v2) (dist(v1,v2)) (dist(v0,v2)) (dist(v0,v1))`,
582   (* {{{ proof *)
583   [
584   REWRITE_TAC[Appendix.tau3;Nonlinear_lemma.taum_123;Sphere.rhazim2;Sphere.rhazim3;Sphere.node2_y;Sphere.node3_y];
585   REWRITE_TAC[Sphere.rhazim;Nonlinear_lemma.sol0_const1];
586   REPEAT WEAKER_STRIP_TAC;
587   TYPIFY `dihV (vec 0) v0 v1 v2 = dih_y (norm v0) (norm v1) (norm v2) (dist (v1,v2)) (dist (v0,v2)) (dist (v0,v1)) /\ dihV (vec 0) v1 v2 v0  = dih_y (norm v1) (norm v2) (norm v0) (dist (v0,v2)) (dist (v0,v1)) (dist (v1,v2)) /\ dihV (vec 0) v2 v0 v1 = dih_y (norm v2) (norm v0) (norm v1) (dist (v0,v1)) (dist (v1,v2))  (dist (v0,v2))` ENOUGH_TO_SHOW_TAC;
588     DISCH_THEN (unlist REWRITE_TAC);
589     BY(REAL_ARITH_TAC);
590   REPEAT (GMATCH_SIMP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] Merge_ineq.DIHV_EQ_DIH_Y));
591   REWRITE_TAC[DIST_0];
592   TYPIFY `dist(v2,v0) = dist(v0,v2) /\ dist(v2,v1) = dist(v1,v2) /\ dist(v1,v0) = dist(v0,v1)` (C SUBGOAL_THEN ASSUME_TAC);
593     BY(MESON_TAC[DIST_SYM]);
594   ASM_REWRITE_TAC[];
595   REPEAT (GMATCH_SIMP_TAC NONPARALLEL_BALL_ANNULUS40_ALT);
596   BY(ASM_REWRITE_TAC[])
597   ]);;
598   (* }}} *)
599
600 let DELTA_Y_POS_4POINTS = prove_by_refinement(
601   `!v0 v1 v2 (v3:real^3).
602     &0 <= delta_y (dist(v0,v1)) (dist(v0,v2)) (dist(v0,v3)) (dist(v2,v3)) (dist(v1,v3)) (dist(v1,v2))`,
603   (* {{{ proof *)
604   [
605   REWRITE_TAC[Sphere.delta_y;arith `x * x = x pow 2`];
606   REWRITE_TAC[GSYM Merge_ineq.delta_delta_x];
607   BY(REWRITE_TAC[Collect_geom.DELTA_POS_4POINTS])
608   ]);;
609   (* }}} *)
610
611 let tau3_taum_d = prove_by_refinement(
612   `!d  a01 a12 a02 b01 b12 b02. 
613     (&2 <= a01 /\ &2 <= a12 /\ &2 <= a02 /\ b01 <= #3.62 /\ b12 <= #3.62 /\ b02 <= #3.62 /\
614                                 (!y1 y2 y3 y4 y5 y6. 
615                                     &2 <= y1 /\ y1 <= &2 * h0 /\
616                                     &2 <= y2 /\ y2 <= &2 * h0 /\
617                                     &2 <= y3 /\ y3 <= &2 * h0 /\
618                                     a01 <= y6 /\ y6 <= b01 /\
619                                     a12 <= y4 /\ y4 <= b12 /\
620                                     a02 <= y5 /\ y5 <= b02 /\
621                                     &0 <= delta_y y1 y2 y3 y4 y5 y6 ==>
622                                     d <= taum y1 y2 y3 y4 y5 y6) ==>
623     (!v0 v1 v2. 
624                                     &2 <= norm v0 /\ norm v0 <= &2 * h0 /\
625                                     &2 <= norm v1 /\ norm v1 <= &2 * h0 /\
626                                     &2 <= norm v2 /\ norm v2 <= &2 * h0 /\
627                                     a01 <= dist(v0,v1) /\ dist(v0,v1) <= b01 /\
628                                     a12 <= dist(v1,v2) /\ dist(v1,v2) <= b12 /\
629                                     a02 <= dist(v0,v2) /\ dist(v0,v2) <= b02 ==>
630                                     d <= tau3 v0 v1 v2))`,
631   (* {{{ proof *)
632   [
633   REPEAT WEAKER_STRIP_TAC;
634   GMATCH_SIMP_TAC tau3_taum;
635   CONJ_TAC;
636     REWRITE_TAC[Fnjlbxs.in_ball_annulus];
637     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
638   FIRST_X_ASSUM MATCH_MP_TAC;
639   TYPIFY `&0 <= delta_y (norm v0) (norm v1) (norm v2) (dist (v1,v2)) (dist (v0,v2))  (dist (v0,v1))` (C SUBGOAL_THEN (unlist REWRITE_TAC));
640     REWRITE_TAC[GSYM Trigonometry1.DIST_L_ZERO];
641     BY(REWRITE_TAC[DELTA_Y_POS_4POINTS]);
642   BY(ASM_REWRITE_TAC[])
643   ]);;
644   (* }}} *)
645
646 let tau3_taum_dfun = prove_by_refinement(
647   `!d  a01 a12 a02 b01 b12 b02 f. 
648     (&2 <= a01 /\ &2 <= a12 /\ &2 <= a02 /\ b01 <= #3.62 /\ b12 <= #3.62 /\ b02 <= #3.62 /\
649                                 (!y1 y2 y3 y4 y5 y6. 
650                                     &2 <= y1 /\ y1 <= &2 * h0 /\
651                                     &2 <= y2 /\ y2 <= &2 * h0 /\
652                                     &2 <= y3 /\ y3 <= &2 * h0 /\
653                                     a01 <= y6 /\ y6 <= b01 /\
654                                     a12 <= y4 /\ y4 <= b12 /\
655                                     a02 <= y5 /\ y5 <= b02 /\
656                                     &0 <= delta_y y1 y2 y3 y4 y5 y6 ==>
657                                     d + f y4 y5 y6 <= taum y1 y2 y3 y4 y5 y6) ==>
658     (!v0 v1 v2. 
659                                     &2 <= norm v0 /\ norm v0 <= &2 * h0 /\
660                                     &2 <= norm v1 /\ norm v1 <= &2 * h0 /\
661                                     &2 <= norm v2 /\ norm v2 <= &2 * h0 /\
662                                     a01 <= dist(v0,v1) /\ dist(v0,v1) <= b01 /\
663                                     a12 <= dist(v1,v2) /\ dist(v1,v2) <= b12 /\
664                                     a02 <= dist(v0,v2) /\ dist(v0,v2) <= b02 ==>
665                                     d + f (dist(v1,v2)) (dist(v0,v2)) (dist(v0,v1)) <= tau3 v0 v1 v2))`,
666   (* {{{ proof *)
667   [
668   REPEAT WEAKER_STRIP_TAC;
669   GMATCH_SIMP_TAC tau3_taum;
670   CONJ_TAC;
671     REWRITE_TAC[Fnjlbxs.in_ball_annulus];
672     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
673   FIRST_X_ASSUM MATCH_MP_TAC;
674   TYPIFY `&0 <= delta_y (norm v0) (norm v1) (norm v2) (dist (v1,v2)) (dist (v0,v2))  (dist (v0,v1))` (C SUBGOAL_THEN (unlist REWRITE_TAC));
675     REWRITE_TAC[GSYM Trigonometry1.DIST_L_ZERO];
676     BY(REWRITE_TAC[DELTA_Y_POS_4POINTS]);
677   BY(ASM_REWRITE_TAC[])
678   ]);;
679   (* }}} *)
680
681 let taustar_taum = prove_by_refinement(
682     `!d a b.   
683     (&2 <= a 0 1 /\ &2 <= a 1 2 /\ &2 <= a 0 2 /\ b 0 1 <= #3.62 /\ b 1 2 <= #3.62 /\ b 0 2 <= #3.62 /\
684                                 (!y1 y2 y3 y4 y5 y6. 
685                                     &2 <= y1 /\ y1 <= &2 * h0 /\
686                                     &2 <= y2 /\ y2 <= &2 * h0 /\
687                                     &2 <= y3 /\ y3 <= &2 * h0 /\
688                                     a 0 1 <= y6 /\ y6 <= b 0 1 /\
689                                     a 1 2 <= y4 /\ y4 <= b 1 2 /\
690                                     a 0 2 <= y5 /\ y5 <= b 0 2 /\
691                                     &0 <= delta_y y1 y2 y3 y4 y5 y6 ==>
692                                     d <= taum y1 y2 y3 y4 y5 y6) ==>
693     (let s = mk_unadorned_v39     3 d a b in  (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv)))
694 `,
695   (* {{{ proof *)
696   [
697   REPEAT WEAKER_STRIP_TAC;
698   REWRITE_TAC[LET_DEF;LET_END_DEF];
699   MATCH_MP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] taustar3);
700   MATCH_MP_TAC tau3_taum_d;
701   BY(ASM_REWRITE_TAC[])
702   ]);;
703   (* }}} *)
704
705 let taustar_taum_dfun = prove_by_refinement(
706     `!d a b f. (let s = scs_v39 (3,d,a,a,b,b,f,{},{},{}) in
707     (&2 <= a 0 1 /\ &2 <= a 1 2 /\ &2 <= a 0 2 /\ b 0 1 <= #3.62 /\ b 1 2 <= #3.62 /\ b 0 2 <= #3.62 /\
708                                 (!y1 y2 y3 y4 y5 y6. 
709                                     &2 <= y1 /\ y1 <= &2 * h0 /\
710                                     &2 <= y2 /\ y2 <= &2 * h0 /\
711                                     &2 <= y3 /\ y3 <= &2 * h0 /\
712                                     a 0 1 <= y6 /\ y6 <= b 0 1 /\
713                                     a 1 2 <= y4 /\ y4 <= b 1 2 /\
714                                     a 0 2 <= y5 /\ y5 <= b 0 2 /\
715                                     &0 <= delta_y y1 y2 y3 y4 y5 y6 ==>
716                                     d  + #0.1 *
717  (if is_ear_v39 s
718   then &1
719   else -- &1) *
720  ((if f 0 1 then cstab - y6 else &0) +
721   (if f 1 2 then cstab - y4 else &0) +
722   (if f 2 3 then cstab - y5 else &0) +
723   &0) <= taum y1 y2 y3 y4 y5 y6) ==>
724       (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv)))
725 `,
726   (* {{{ proof *)
727   [
728   REWRITE_TAC[LET_DEF;LET_END_DEF];
729   REPEAT GEN_TAC;
730   DISCH_TAC;
731   MATCH_MP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] taustar3_fun);
732   REPEAT GEN_TAC;
733   TYPIFY `dist(v2,(v0:real^3)) = dist(v0,v2)` (C SUBGOAL_THEN SUBST1_TAC);
734     BY(MESON_TAC[DIST_SYM]);
735   REPEAT WEAKER_STRIP_TAC;
736   REPLICATE_TAC 12 (FIRST_X_ASSUM MP_TAC);
737   REWRITE_TAC[TAUT `(a ==> b ==> c) <=> (a /\ b) ==> c` ];
738   REWRITE_TAC[TAUT `(a /\ b) /\ c <=> (a /\ b /\ c)`];
739   SPEC_TAC (`v2:real^3`,`v2:real^3`);
740   SPEC_TAC (`v1:real^3`,`v1:real^3`);
741   SPEC_TAC (`v0:real^3`,`v0:real^3`);
742   MATCH_MP_TAC tau3_taum_dfun;
743   BY(ASM_REWRITE_TAC[])
744   ]);;
745   (* }}} *)
746
747 let taum_sym = prove_by_refinement(
748   `!y1 y2 y3 y4 y5 y6. taum y1 y2 y3 y4 y5 y6 = taum y2 y1 y3 y5 y4 y6 /\
749     taum y1 y2 y3 y4 y5 y6 = taum y1 y3 y2 y4 y6 y5`,
750   (* {{{ proof *)
751   [
752   REWRITE_TAC[Nonlinear_lemma.taum_123;Sphere.rhazim2;Sphere.rhazim3;Sphere.node2_y;Sphere.node3_y];
753   REWRITE_TAC[Sphere.rhazim];
754   REPEAT WEAKER_STRIP_TAC;
755   MATCH_MP_TAC (REAL_RING `((e1:real) = e1' /\ e2 = e2' /\ e3 = e3' /\ e1 = e1'' /\ e2 = e2'' /\ e3 = e3'') ==> ((r1 * e1 + r2 * e2 + r3 * e3 - c = r2 * e2' + r1 * e1' + r3 * e3' - c) /\ (r1 * e1 + r2 * e2 + r3 * e3 - c = r1 * e1'' + r3 * e3'' + r2 * e2'' - c))`);
756   BY(MESON_TAC[Nonlinear_lemma.dih_y_sym;Nonlinear_lemma.dih_y_sym2])
757   ]);;
758   (* }}} *)
759
760 let MOD_4_EXPLICIT = prove_by_refinement(
761   `0 MOD 4 = 0 /\ 1 MOD 4 = 1 /\ 2 MOD 4 = 2 /\ 3 MOD 4 = 3 /\ 4 MOD 4 = 0 /\
762      5 MOD 4 = 1 /\ 6 MOD 4 = 2`,
763   (* {{{ proof *)
764   [
765   ASM_SIMP_TAC[MOD_LT;MOD_MULT_ADD;arith `0 < 4 /\ 1 < 4 /\ 2 < 4 /\ 3 < 4 /\ 5 = 1*4 + 1 /\ 6 = 1*4 + 2`];
766   BY(ASM_SIMP_TAC[Oxlzlez.MOD_REFL_ALT;arith `~(4 =0)`])
767   ]);;
768   (* }}} *)
769
770 let FUNLIST_EXPLICIT = prove_by_refinement(
771 `(!data d k i j.
772      funlist_v39 data d k i j =
773      (if i MOD k = j MOD k
774       then &0
775       else ASSOCD_v39 (psort k (i,j)) (MAP (\ (u,d). psort k u,d) data) d)) /\
776  (!data u u' k i j.    funlistA_v39 data (u:A) u' k i j =  (if i MOD k = j MOD k
777        then u
778        else ASSOCD_v39 (psort k (i,j)) (MAP (\ (u,d). psort k u,d) data) u')) /\
779      0 MOD 3 = 0 /\
780      1 MOD 3 = 1 /\
781      2 MOD 3 = 2 /\
782      3 MOD 3 = 0 /\
783      (! (x:real) . x = x) /\
784      ~(0 = 1) /\
785      ~(0 = 2) /\
786      ~(1 = 2) /\
787      ~(0 = 3) /\
788      ~(1 = 3) /\
789      ~(2 = 3) /\
790      psort 3 (0,1) = 0,1 /\
791      psort 3 (0,2) = 0,2 /\
792      psort 3 (1,2) = 1,2 /\
793        psort 3 (2,3) = 0,2 /\
794          psort 4 (0,1) = 0,1 /\
795            psort 4 (0,2) = 0,2 /\
796              psort 4 (0,3) = 0,3 /\
797                psort 4 (1,2) = (1,2) /\
798     psort 4 (1,3) = (1,3) /\
799     psort 4 (2,3) = (2,3) /\
800     psort 4 (1,0) = (0,1) /\
801     psort 4 (2,0) = (0,2) /\
802     psort 4 (3,0) = (0,3) /\
803     psort 4 (2,1) = (1,2) /\
804     psort 4 (3,1) = (1,3) /\
805     psort 4 (3,2) = (2,3) /\
806       (!(a:A) (b:B) c d. (a,b) = (c,d) <=> (a = c) /\ (b = d)) /\ 
807       (!(a:A) (d:B).  ASSOCD_v39 a [] d = d) /\
808       (!(a:A) (d:B) h t. ASSOCD_v39 a (CONS h t) d =
809          (if a = FST h then SND h else ASSOCD_v39 a t d)) /\
810      (!k. MAP (\ (u,(d:B)). psort k u,d) [] = [])  /\
811      (!p d. ASSOCD_v39 (p:A) [] (d:B) = d)  /\
812      (!k i j r t.
813           MAP (\ (u,(d:B)). psort k u,d) (CONS ((i,j),r) t) =
814           CONS (psort k (i,j),r) (MAP (\ (u,d). psort k u,d) t))
815 `,
816   (* {{{ proof *)
817   [
818   REPEAT WEAKER_STRIP_TAC;
819   REWRITE_TAC[Appendix.funlist_v39;Appendix.funlistA_v39;Appendix.ASSOCD_v39;PAIR_EQ];
820   REWRITE_TAC[LET_DEF;LET_END_DEF];
821   REWRITE_TAC[arith `~(0  = 1) /\ ~(0=2) /\ ~(1=2) /\      ~(0 = 3) /\     ~(1 = 3) /\     ~(2 = 3)`];
822   REWRITE_TAC[MAP];
823   REWRITE_TAC[Appendix.psort;LET_DEF;LET_END_DEF];
824   REWRITE_TAC[MOD_4_EXPLICIT;PAIR_EQ];
825   TYPIFY `0 MOD 3 = 0 /\ 1 MOD 3 = 1 /\ 2 MOD 3 = 2` (C SUBGOAL_THEN ASSUME_TAC);
826     REPEAT (GMATCH_SIMP_TAC MOD_LT);
827     BY(ARITH_TAC);
828   ASM_REWRITE_TAC[];
829   TYPIFY `3 MOD 3 = 0` (C SUBGOAL_THEN SUBST1_TAC);
830     BY(ASM_SIMP_TAC[Oxlzlez.MOD_REFL_ALT;arith `~(3 = 0)`]);
831     ARITH_TAC
832   ]);;
833   (* }}} *)
834
835 let periodic2_funlist = prove_by_refinement(
836   `!a a0 k. periodic2 (funlist_v39 a a0 k) k`,
837   (* {{{ proof *)
838   [
839   REWRITE_TAC[Appendix.periodic2;Appendix.funlist_v39];
840   REPEAT WEAKER_STRIP_TAC;
841   REWRITE_TAC[LET_DEF;LET_END_DEF];
842   TYPIFY `!i. (i + k) MOD k = i MOD k` (C SUBGOAL_THEN ASSUME_TAC);
843     GEN_TAC;
844     ONCE_REWRITE_TAC[arith `i + (k:num) = 1 * k + i`];
845     BY(REWRITE_TAC[MOD_MULT_ADD]);
846   TYPIFY `psort k (i + k,j) = psort k (i,j) /\ psort k (i,j+k) = psort k (i,j)` (C SUBGOAL_THEN (unlist REWRITE_TAC));
847     BY(ASM_REWRITE_TAC[Appendix.psort]);
848   BY(ASM_REWRITE_TAC[])
849   ]);;
850   (* }}} *)
851
852 let periodic2_funlistA = prove_by_refinement(
853   `!j1 j' j'' k. periodic2 (funlistA_v39 j1 j' (j'':A) k) k`,
854   (* {{{ proof *)
855   [
856   REWRITE_TAC[Appendix.periodic2;Appendix.funlistA_v39];
857   REPEAT WEAKER_STRIP_TAC;
858   REWRITE_TAC[LET_DEF;LET_END_DEF];
859   TYPIFY `!i. (i + k) MOD k = i MOD k` (C SUBGOAL_THEN ASSUME_TAC);
860     GEN_TAC;
861     ONCE_REWRITE_TAC[arith `i + (k:num) = 1 * k + i`];
862     BY(REWRITE_TAC[MOD_MULT_ADD]);
863   TYPIFY `psort k (i + k,j) = psort k (i,j) /\ psort k (i,j+k) = psort k (i,j)` (C SUBGOAL_THEN (unlist REWRITE_TAC));
864     BY(ASM_REWRITE_TAC[Appendix.psort]);
865   BY(ASM_REWRITE_TAC[])
866   ]);;
867   (* }}} *)
868
869 let psort_sym = prove_by_refinement(
870   `!k i j. psort k (i,j) = psort k (j,i)`,
871   (* {{{ proof *)
872   [
873   REPEAT WEAKER_STRIP_TAC;
874   REWRITE_TAC[Appendix.psort];
875   REWRITE_TAC[LET_DEF;LET_END_DEF];
876   BY(REPEAT COND_CASES_TAC THEN REWRITE_TAC[PAIR_EQ] THEN (REPEAT (FIRST_X_ASSUM MP_TAC)) THEN ARITH_TAC)
877   ]);;
878   (* }}} *)
879
880 let funlist_sym = prove_by_refinement(
881   `!k a a0 i j. funlist_v39 a a0 k i j = funlist_v39 a a0 k j i`,
882   (* {{{ proof *)
883   [
884   REWRITE_TAC[Appendix.funlist_v39];
885   REPEAT WEAKER_STRIP_TAC;
886   TYPIFY `psort k (i,j) = psort k (j,i)` (C SUBGOAL_THEN SUBST1_TAC);
887     BY(MESON_TAC[psort_sym]);
888   REWRITE_TAC[LET_DEF;LET_END_DEF];
889   BY(COND_CASES_TAC THEN ASM_REWRITE_TAC[])
890   ]);;
891   (* }}} *)
892
893 let funlistA_sym = prove_by_refinement(
894   `!k a (a0:A) a1 i j. funlistA_v39 a a0 a1 k i j = funlistA_v39 a a0 a1 k j i`,
895   (* {{{ proof *)
896   [
897   REWRITE_TAC[Appendix.funlistA_v39];
898   REPEAT WEAKER_STRIP_TAC;
899   TYPIFY `psort k (i,j) = psort k (j,i)` (C SUBGOAL_THEN SUBST1_TAC);
900     BY(MESON_TAC[psort_sym]);
901   REWRITE_TAC[LET_DEF;LET_END_DEF];
902   BY(COND_CASES_TAC THEN ASM_REWRITE_TAC[])
903   ]);;
904   (* }}} *)
905
906 let funlist_diag = prove_by_refinement(
907   `!a (a0) k i. funlist_v39 a a0 k i i = &0`,
908   (* {{{ proof *)
909   [
910   BY(REWRITE_TAC[Appendix.funlist_v39;LET_DEF;LET_END_DEF])
911   ]);;
912   (* }}} *)
913
914 let funlistA_diag = prove_by_refinement(
915   `!j1 j2 j3 k i. funlistA_v39 j1 j2 j3 k i i = (j2:A)`,
916   (* {{{ proof *)
917   [
918   BY(REWRITE_TAC[Appendix.funlistA_v39;LET_DEF;LET_END_DEF])
919   ]);;
920   (* }}} *)
921
922 let funlistA_empty = prove_by_refinement(
923   `!k. funlistA_v39 [] F F k = ( \ i j. F) `,
924   (* {{{ proof *)
925   [
926   REWRITE_TAC[Appendix.funlistA_v39;FUN_EQ_THM;MAP;LET_DEF;LET_END_DEF;Appendix.ASSOCD_v39];
927   BY(MESON_TAC[])
928   ]);;
929   (* }}} *)
930
931 let funlist_kik = prove_by_refinement(
932   `!b b0 k i. funlist_v39 b b0 k i k = funlist_v39 b b0 k 0 i`,
933   (* {{{ proof *)
934   [
935   REPEAT WEAKER_STRIP_TAC;
936   TYPIFY `k MOD k = 0 MOD k` (C SUBGOAL_THEN ASSUME_TAC);
937     BY(MESON_TAC[arith `k = 1*k + 0`;MOD_MULT_ADD]);
938   REWRITE_TAC[Appendix.funlist_v39;LET_DEF;LET_END_DEF];
939   TYPIFY `psort k (i,k) = psort k (0,i)` (C SUBGOAL_THEN SUBST1_TAC);
940     ASM_REWRITE_TAC[Appendix.psort;LET_DEF;LET_END_DEF];
941     BY(COND_CASES_TAC THEN COND_CASES_TAC THEN REWRITE_TAC[PAIR_EQ] THEN (REPEAT (FIRST_X_ASSUM MP_TAC)) THEN ARITH_TAC);
942   ASM_REWRITE_TAC[];
943   BY(COND_CASES_TAC THEN ASM_REWRITE_TAC[])
944   ]);;
945   (* }}} *)
946
947 let periodic_mod_reduce = prove_by_refinement(
948   `!P k.  ~(k = 0) /\ periodic P k /\ (!i. i < k ==> P i) ==> (!i. P i)`,
949   (* {{{ proof *)
950   [
951   REPEAT WEAKER_STRIP_TAC;
952   GMATCH_SIMP_TAC Oxl_def.periodic_mod;
953   TYPIFY `k` EXISTS_TAC;
954   ASM_REWRITE_TAC[];
955   FIRST_X_ASSUM MATCH_MP_TAC;
956   BY(ASM_MESON_TAC[DIVISION])
957   ]);;
958   (* }}} *)
959
960 let periodic2_mod_reduce = prove_by_refinement(
961   `!P k. ~(k = 0) /\ periodic2 P k /\ (!i j. i < k /\ j < k ==> P i j) ==> (!i j. P i j)`,
962   (* {{{ proof *)
963   [
964   REWRITE_TAC[Appendix.periodic2];
965   REPEAT WEAKER_STRIP_TAC;
966   TYPIFY `!i. periodic (P i) k` (C SUBGOAL_THEN ASSUME_TAC);
967     REWRITE_TAC[Oxl_def.periodic];
968     BY(ASM_REWRITE_TAC[]);
969   TYPIFY `!j. periodic (\i. P i j) k` (C SUBGOAL_THEN ASSUME_TAC);
970     REWRITE_TAC[Oxl_def.periodic];
971     BY(ASM_REWRITE_TAC[]);
972   TYPIFY `(\ i. P i j) i  = (\ i. P i j) (i MOD k)` ((C SUBGOAL_THEN MP_TAC));
973     MATCH_MP_TAC Oxl_def.periodic_mod;
974     BY(ASM_REWRITE_TAC[]);
975   REWRITE_TAC[];
976   DISCH_THEN SUBST1_TAC;
977   TYPIFY `P (i MOD k) j = P (i MOD k) (j MOD k)` (C SUBGOAL_THEN MP_TAC);
978     MATCH_MP_TAC Oxl_def.periodic_mod;
979     BY(ASM_REWRITE_TAC[]);
980   DISCH_THEN SUBST1_TAC;
981   FIRST_X_ASSUM MATCH_MP_TAC;
982   BY(ASM_MESON_TAC[DIVISION])
983   ]);;
984   (* }}} *)
985
986 let periodic2_mod_sym_reduce = prove_by_refinement(
987   `!P k. ~(k = 0) /\ periodic2 P k /\ (!i. P i i) /\
988     (!i j. P i j = P j i) /\ (!i j. i < j /\ j < k ==> P i j) ==> (!i j. P i j)`,
989   (* {{{ proof *)
990   [
991   REPEAT WEAKER_STRIP_TAC;
992   GMATCH_SIMP_TAC periodic2_mod_reduce;
993   TYPIFY `k` EXISTS_TAC;
994   ASM_REWRITE_TAC[];
995   REPEAT WEAKER_STRIP_TAC;
996   TYPIFY `(i:num) < j` ASM_CASES_TAC;
997     FIRST_X_ASSUM MATCH_MP_TAC;
998     BY(ASM_REWRITE_TAC[]);
999   TYPIFY `(j:num) < i \/ (j = i)` (C SUBGOAL_THEN MP_TAC);
1000     BY(FIRST_X_ASSUM MP_TAC THEN ARITH_TAC);
1001   DISCH_THEN DISJ_CASES_TAC;
1002     BY(ASM_MESON_TAC[]);
1003   BY(ASM_MESON_TAC[])
1004   ]);;
1005   (* }}} *)
1006
1007 let periodic2_SUC_periodic = prove_by_refinement(
1008   `!f i. periodic2 (f:num->num->A) k ==> periodic (\i. f i (SUC i)) k`,
1009   (* {{{ proof *)
1010   [
1011   REWRITE_TAC[Appendix.periodic2;Oxl_def.periodic];
1012   REPEAT WEAKER_STRIP_TAC;
1013   ASM_REWRITE_TAC[];
1014   TYPIFY `SUC (i + k) = SUC i + k` (C SUBGOAL_THEN SUBST1_TAC);
1015     BY(ARITH_TAC);
1016   BY(ASM_REWRITE_TAC[])
1017   ]);;
1018   (* }}} *)
1019
1020 let periodic_vv_inj = prove_by_refinement(
1021   `!vv k. periodic (vv:num->A) k /\ ~(k = 0) /\
1022       (!i j. i < k /\ j < k /\ vv i = vv j ==> (i = j)) ==>
1023    (!i j. (vv i = vv j) <=> (i MOD k = j MOD k))
1024     `,
1025   (* {{{ proof *)
1026   [
1027   REPEAT WEAKER_STRIP_TAC;
1028   REWRITE_TAC[Geomdetail.EQ_EXPAND];
1029   CONJ2_TAC;
1030     BY(ASM_MESON_TAC[Oxl_def.periodic_mod]);
1031   INTRO_TAC Oxl_def.periodic_mod [`vv`;`k`];
1032   ASM_REWRITE_TAC[];
1033   DISCH_THEN (unlist ONCE_REWRITE_TAC);
1034   BY(ASM_MESON_TAC[DIVISION])
1035   ]);;
1036   (* }}} *)
1037
1038 let I_LT_J_LT_3_EXPLICIT = prove_by_refinement(
1039   `!i j. (i < j /\ j < 3) <=> ((i = 0 /\ j = 1) \/ (i = 0 /\ j = 2) \/ (i = 1 /\ j = 2))`,
1040   (* {{{ proof *)
1041   [
1042   BY(ARITH_TAC)
1043   ]);;
1044   (* }}} *)
1045
1046 let I_LT_J_LT_4_EXPLICIT = prove_by_refinement(
1047   `!i j. (i < j /\ j < 4) <=> ((i = 0 /\ j = 1) \/ (i = 0 /\ j = 2) \/ (i = 0 /\ j = 3) \/ (i = 1 /\ j = 2) \/
1048                               (i = 1 /\ j = 3) \/ (i = 2 /\ j = 3))`,
1049   (* {{{ proof *)
1050   [
1051   REPEAT WEAKER_STRIP_TAC;
1052   REWRITE_TAC[Geomdetail.EQ_EXPAND];
1053   CONJ2_TAC;
1054     BY(ARITH_TAC);
1055   REPEAT WEAKER_STRIP_TAC;
1056   TYPIFY `j = 1 \/ j = 2 \/ j = 3` (C SUBGOAL_THEN ASSUME_TAC);
1057     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
1058   REPEAT (FIRST_X_ASSUM DISJ_CASES_TAC) THEN ASM_REWRITE_TAC[] THEN REPEAT (FIRST_X_ASSUM MP_TAC);
1059       BY(ARITH_TAC);
1060     BY(ARITH_TAC);
1061   BY(ARITH_TAC)
1062   ]);;
1063   (* }}} *)
1064
1065 let is_scs_funlist = prove_by_refinement(
1066   `!k d a0 b0 j0 a b j1 u u' u''. d < #0.9 /\ 3 <= k /\ k <= 6 /\
1067   periodic u k /\ periodic u' k /\ periodic u'' k /\
1068   (!i j. i < j /\ j < k ==> funlist_v39 a a0 k i j <= funlist_v39 b b0 k i j) /\
1069  (!i j. i < j /\ j < k  ==> &2 <= funlist_v39 a a0 k i j) /\
1070  (!i. i < 3 /\ k = 3 ==> funlist_v39 b b0 k i (SUC i) < &4) /\
1071  (!i. i < k /\ 3 < k ==> funlist_v39 b b0 k i (SUC i) <= cstab) /\
1072  (!i j. i < j /\ j < k /\
1073       funlistA_v39 j1 F j0 k i j
1074       ==> funlist_v39 a a0 k i j = sqrt8 /\ funlist_v39 b b0 k i j = cstab) /\
1075  (!i j. i < j /\ j < k /\
1076      funlistA_v39 j1 F j0 k i j
1077      ==> j  = SUC i \/ (i = 0 /\ SUC j = k)) /\ 
1078  CARD
1079  {i | i < k /\
1080       (&2 * h0 < funlist_v39 b b0 k i (SUC i) \/
1081        &2 < funlist_v39 a a0 k i (SUC i))} +
1082  k <=  6 ==>
1083     is_scs_v39 (scs_v39 (k,d,
1084                          funlist_v39 a a0 k,funlist_v39 a a0 k,
1085                          funlist_v39 b b0 k,funlist_v39 b b0 k,
1086                          funlistA_v39 j1 F j0 k,u,u',u''))`,
1087   (* {{{ proof *)
1088   [
1089   REPEAT WEAKER_STRIP_TAC;
1090   ASM_REWRITE_TAC[Appendix.is_scs_v39;Appendix.scs_v39_explicit;arith `x <= x`;Appendix.periodic_empty];
1091   REWRITE_TAC[periodic2_funlist;periodic2_funlistA];
1092   REWRITE_TAC[funlist_sym;funlistA_sym;funlist_diag];
1093   CONJ_TAC;
1094     MATCH_MP_TAC periodic2_mod_sym_reduce;
1095     TYPIFY `k` EXISTS_TAC;
1096     ASM_REWRITE_TAC[TAUT `(a /\ a' ==> b ==> c) <=> (a /\ a' /\ b ==> c)` ];
1097     ASM_SIMP_TAC[arith `3 <= k ==> ~(k=0)`];
1098     REWRITE_TAC[funlist_diag;arith `&0 <= &0`];
1099     CONJ_TAC;
1100       REWRITE_TAC[Appendix.periodic2];
1101       BY(MESON_TAC[periodic2_funlist;Appendix.periodic2]);
1102     BY(MESON_TAC[funlist_sym]);
1103   COMMENT "next goal";
1104   CONJ_TAC;
1105     REPEAT WEAKER_STRIP_TAC;
1106     TYPIFY `i < (j:num)` ASM_CASES_TAC;
1107       BY(ASM_MESON_TAC[]);
1108     ONCE_REWRITE_TAC[funlist_sym];
1109     FIRST_X_ASSUM MATCH_MP_TAC;
1110     BY(ASM_SIMP_TAC[arith `~(i = j) /\ ~(i < j) ==> (j < (i:num))`]);
1111   COMMENT "next goal again";
1112   CONJ_TAC;
1113     REWRITE_TAC[RIGHT_FORALL_IMP_THM];
1114     DISCH_TAC;
1115     MATCH_MP_TAC periodic_mod_reduce;
1116     TYPIFY `k` EXISTS_TAC;
1117     ASM_SIMP_TAC [arith `k=3 ==> ~(k=0)`];
1118     REWRITE_TAC[Oxl_def.periodic];
1119     BY(ASM_MESON_TAC[periodic2_funlist;periodic2_SUC_periodic;Oxl_def.periodic]);
1120   COMMENT "next";
1121   CONJ_TAC;
1122     REWRITE_TAC[RIGHT_FORALL_IMP_THM];
1123     DISCH_TAC;
1124     MATCH_MP_TAC periodic_mod_reduce;
1125     TYPIFY `k` EXISTS_TAC;
1126     ASM_SIMP_TAC [arith `3 < k ==> ~(k=0)`];
1127     REWRITE_TAC[Oxl_def.periodic];
1128     BY(ASM_MESON_TAC[periodic2_funlist;periodic2_SUC_periodic;Oxl_def.periodic]);
1129   COMMENT "pentultimate";
1130   CONJ2_TAC;
1131     MATCH_MP_TAC periodic2_mod_sym_reduce;
1132     TYPIFY `k` EXISTS_TAC;
1133     ASM_SIMP_TAC [arith `3 <= k ==> ~(k=0)`];
1134     CONJ_TAC;
1135       REWRITE_TAC[Appendix.periodic2];
1136       BY(REWRITE_TAC[ (REWRITE_RULE[Appendix.periodic2] periodic2_funlist); (REWRITE_RULE[Appendix.periodic2] periodic2_funlistA)]);
1137     REWRITE_TAC[funlistA_diag];
1138     BY(MESON_TAC[funlistA_sym;funlist_sym]);
1139   COMMENT "final";
1140   MATCH_MP_TAC periodic2_mod_sym_reduce;
1141   TYPIFY `k` EXISTS_TAC;
1142   ASM_SIMP_TAC [arith `3 <= k ==> ~(k=0)`];
1143   CONJ_TAC;
1144     REWRITE_TAC[Appendix.periodic2];
1145     (REWRITE_TAC[ (REWRITE_RULE[Appendix.periodic2] periodic2_funlist); (REWRITE_RULE[Appendix.periodic2] periodic2_funlistA)]);
1146     REWRITE_TAC[arith `SUC (i + k) = SUC i + k`];
1147     ONCE_REWRITE_TAC[arith `(i + k) = (1 * k + i)`];
1148     BY(REWRITE_TAC[MOD_MULT_ADD]);
1149   REWRITE_TAC[funlistA_diag];
1150   CONJ_TAC;
1151     BY(MESON_TAC[funlistA_sym;funlist_sym]);
1152   REPEAT WEAKER_STRIP_TAC;
1153   FIRST_X_ASSUM (C INTRO_TAC [`i`;`j`]);
1154   ASM_REWRITE_TAC[];
1155   DISCH_THEN DISJ_CASES_TAC;
1156     BY(ASM_REWRITE_TAC[]);
1157   ASM_REWRITE_TAC[];
1158   TYPIFY `k MOD k = (1 * k + 0) MOD k` (C SUBGOAL_THEN SUBST1_TAC);
1159     AP_THM_TAC;
1160     AP_TERM_TAC;
1161     BY(ARITH_TAC);
1162   BY(REWRITE_TAC[MOD_MULT_ADD])
1163   ]);;
1164   (* }}} *)
1165
1166 let is_ear_scs3 = prove_by_refinement(
1167  `!a b jf. is_ear_v39 (scs_v39 (3, #0.11, a, a, b, b, jf, {}, {},{})) <=>  
1168     is_scs_v39 (scs_v39 (3, #0.11, a,a,b,b,jf, {},{},{})) /\
1169     (!i. b i i = &0) /\
1170   (?i. {i | i < 3 /\ jf i (SUC i)} = {i} /\
1171       a i (SUC i) = sqrt8 /\ b i (SUC i) = cstab /\
1172       (!j. j < 3 /\ ~(j = i) ==> a j (SUC j) = &2 /\ b j (SUC j) = &2 * h0))`,
1173   (* {{{ proof *)
1174   [
1175   REPEAT WEAKER_STRIP_TAC;
1176   REWRITE_TAC[Appendix.is_ear_v39;Appendix.scs_v39_explicit];
1177   ASM_CASES_TAC `~is_scs_v39 (scs_v39 (3, #0.11,a,a,b,b,jf,{},{},{}))`;
1178     BY(ASM_REWRITE_TAC[]);
1179   RULE_ASSUM_TAC (REWRITE_RULE[ (TAUT `~ ~ x = x`)]);
1180   ASM_REWRITE_TAC[];
1181   ASM_CASES_TAC `~(?i. {i | i < 3 /\ jf i (SUC i)} = {i} /\       a i (SUC i) = sqrt8 /\      b i (SUC i) = cstab /\      (!j. j < 3 /\ ~(j = i) ==> a j (SUC j) = &2 /\ b j (SUC j) = &2 * h0))`;
1182     BY(ASM_REWRITE_TAC[]);
1183   RULE_ASSUM_TAC (REWRITE_RULE[ (TAUT `~ ~ x = x`)]);
1184   ASM_REWRITE_TAC[];
1185   BY(REWRITE_TAC[Appendix.unadorned_v39;Appendix.scs_v39_explicit])
1186   ]);;
1187   (* }}} *)
1188
1189 let is_scs_scs3 = prove_by_refinement(
1190   `! d a a0 b b0 jf j0 .  d < #0.9 /\
1191     funlist_v39 a a0 3 0 1 <= funlist_v39 b b0 3 0 1 /\
1192     funlist_v39 a a0 3 0 2 <= funlist_v39 b b0 3 0 2 /\
1193     funlist_v39 a a0 3 1 2 <= funlist_v39 b b0 3 1 2 /\
1194    &2 <= funlist_v39 a a0 3 0 1 /\ 
1195    &2 <= funlist_v39 a a0 3 1 2 /\ 
1196    &2 <= funlist_v39 a a0 3 0 2 /\ 
1197    funlist_v39 b b0 3 0 1  < &4 /\
1198    funlist_v39 b b0 3 0 2  < &4 /\
1199    funlist_v39 b b0 3 1 2  < &4 /\
1200    (!i j.
1201      i < j /\ j < 3 /\ funlistA_v39 jf F j0 3 i j 
1202      ==> funlist_v39 a a0 3 i j = sqrt8 /\ funlist_v39 b b0 3 i j = cstab)
1203    ==>
1204    is_scs_v39
1205              (scs_v39
1206              (3,
1207               d,
1208               funlist_v39 a a0 3,
1209               funlist_v39 a a0 3,
1210               funlist_v39 b b0 3,
1211               funlist_v39 b b0 3,
1212               funlistA_v39 jf F j0 3,
1213               {},{},
1214               {}))`,
1215   (* {{{ proof *)
1216   [
1217   REPEAT WEAKER_STRIP_TAC;
1218   MATCH_MP_TAC is_scs_funlist;
1219   ASM_REWRITE_TAC[Appendix.periodic_empty;arith `3 <= 3 /\ 3 <= 6 /\ ~(3 < 3)`];
1220   REWRITE_TAC[arith `x + 3 <= 6 <=> x <= 3`];
1221   TYPIFY `CARD  {i | i < 3 /\      (&2 * h0 < funlist_v39 b b0 3 i (SUC i) \/       &2 < funlist_v39 a a0 3 i (SUC i))} <= 3` (C SUBGOAL_THEN (unlist REWRITE_TAC));
1222     ENOUGH_TO_SHOW_TAC `CARD  {i | i < 3 /\      (&2 * h0 < funlist_v39 b b0 3 i (SUC i) \/       &2 < funlist_v39 a a0 3 i (SUC i))} <= CARD {i | i < 3}`;
1223       TYPIFY `{i | i < 3} = (0..2)` (C SUBGOAL_THEN SUBST1_TAC);
1224         REWRITE_TAC[IN_NUMSEG;EXTENSION;IN_ELIM_THM];
1225         BY(ARITH_TAC);
1226       BY(REWRITE_TAC[CARD_NUMSEG;arith `2 + 1 = 3 /\ 3 - 0 = 3`]);
1227     MATCH_MP_TAC CARD_SUBSET;
1228     CONJ_TAC;
1229       BY(SET_TAC[]);
1230     BY(REWRITE_TAC[FINITE_NUMSEG_LT]);
1231   REWRITE_TAC[I_LT_J_LT_3_EXPLICIT];
1232   CONJ_TAC;
1233     REPEAT WEAKER_STRIP_TAC;
1234     BY(REPEAT (FIRST_X_ASSUM DISJ_CASES_TAC) THEN ASM_REWRITE_TAC[]);
1235   CONJ_TAC;
1236     REPEAT WEAKER_STRIP_TAC;
1237     BY(REPEAT (FIRST_X_ASSUM DISJ_CASES_TAC) THEN ASM_REWRITE_TAC[]);
1238   CONJ_TAC;
1239     REWRITE_TAC[arith `i < 3 <=> (i = 0 \/ i = 1 \/ i = 2)`];
1240     REPEAT WEAKER_STRIP_TAC;
1241     BY(REPEAT (FIRST_X_ASSUM DISJ_CASES_TAC) THEN ASM_REWRITE_TAC[arith `SUC 0 = 1 /\ SUC 1 = 2 /\ SUC 2 = 3`;funlist_kik]);
1242   REWRITE_TAC[TAUT `(a /\ b /\ c ==> d) <=> (a /\ b ==> (c ==> d))`];
1243   REWRITE_TAC[I_LT_J_LT_3_EXPLICIT];
1244   REPEAT WEAKER_STRIP_TAC;
1245   BY(REPEAT (FIRST_X_ASSUM DISJ_CASES_TAC) THEN ASM_REWRITE_TAC[arith `SUC 0 = 1 /\ SUC 1 = 2 /\ SUC 2 = 3`])
1246   ]);;
1247   (* }}} *)
1248
1249 let is_scs_ear_3603097872 = prove_by_refinement(
1250   `is_scs_v39 (scs_v39
1251    (3,
1252      #0.11,
1253     funlist_v39 [(0,1),sqrt8] (&2) 3,
1254     funlist_v39 [(0,1),sqrt8] (&2) 3,
1255     funlist_v39 [(0,1),cstab] (&2 * h0) 3,
1256     funlist_v39 [(0,1),cstab] (&2 * h0) 3,
1257     funlistA_v39 [(0,1),T] F F 3,
1258     {},{},
1259     {}))`,
1260   (* {{{ proof *)
1261   [
1262   MATCH_MP_TAC is_scs_scs3;
1263   TYPIFY `(!i j.      i < j /\ j < 3 /\ funlistA_v39 [(0,1),T] F F 3 i j      ==> funlist_v39 [(0,1),sqrt8] (&2) 3 i j = sqrt8 /\          funlist_v39 [(0,1),cstab] (&2 * h0) 3 i j = cstab)` (C SUBGOAL_THEN (unlist REWRITE_TAC));
1264     REWRITE_TAC[TAUT `(a /\ b /\ c ==> d) <=> (a /\ b ==> (c ==> d))`];
1265     REWRITE_TAC[I_LT_J_LT_3_EXPLICIT];
1266     REPEAT WEAKER_STRIP_TAC;
1267     FIRST_X_ASSUM MP_TAC;
1268     BY((REPEAT (FIRST_X_ASSUM DISJ_CASES_TAC) THEN ASM_REWRITE_TAC[FUNLIST_EXPLICIT]));
1269   REWRITE_TAC[FUNLIST_EXPLICIT;arith `#0.11 < #0.9`];
1270   REWRITE_TAC[Appendix.cstab;Sphere.h0];
1271   INTRO_TAC Flyspeck_constants.bounds [];
1272   BY(REAL_ARITH_TAC)
1273   ]);;
1274   (* }}} *)
1275
1276 let is_ear_3603097872 = prove_by_refinement(
1277   `is_ear_v39 (scs_v39
1278    (3,
1279      #0.11,
1280     funlist_v39 [(0,1),sqrt8] (&2) 3,
1281     funlist_v39 [(0,1),sqrt8] (&2) 3,
1282     funlist_v39 [(0,1),cstab] (&2 * h0) 3,
1283     funlist_v39 [(0,1),cstab] (&2 * h0) 3,
1284     funlistA_v39 [(0,1),T] F F 3,
1285     {},{},
1286     {})) `,
1287   (* {{{ proof *)
1288   [
1289   REWRITE_TAC[ is_ear_scs3;is_scs_ear_3603097872;funlist_diag];
1290   EXISTS_TAC `0`;
1291   REWRITE_TAC[arith `SUC 0 = 1`;arith `!j. (j < 3 /\ ~(j = 0) <=> (j = 1 \/ j = 2))`];
1292   CONJ_TAC;
1293     REWRITE_TAC[EXTENSION;IN_SING;IN_ELIM_THM];
1294     GEN_TAC;
1295     MP_TAC (arith `x = 0 \/ x = 1 \/ x = 2 \/ ~(x < 3)`);
1296     DISCH_TAC;
1297     BY(REPEAT (FIRST_X_ASSUM DISJ_CASES_TAC) THEN ASM_SIMP_TAC[arith `0 < 3 /\ 1 < 3 /\ 2 < 3 /\ (~(x < 3 ) ==> ~(x = 0))`;FUNLIST_EXPLICIT;arith `SUC 0 = 1 /\ SUC 1 = 2 /\ SUC 2 = 3`]);
1298   TYPIFY `(!j. j = 1 \/ j = 2       ==> funlist_v39 [(0,1),sqrt8] (&2) 3 j (SUC j) = &2 /\          funlist_v39 [(0,1),cstab] (&2 * h0) 3 j (SUC j) = &2 * h0)` (C SUBGOAL_THEN (unlist REWRITE_TAC));
1299     REPEAT WEAKER_STRIP_TAC;
1300     BY(REPEAT (FIRST_X_ASSUM DISJ_CASES_TAC) THEN ASM_SIMP_TAC[arith `SUC 1 = 2 /\ SUC 2 = 3`;FUNLIST_EXPLICIT;funlist_kik]);
1301   BY(REWRITE_TAC[FUNLIST_EXPLICIT])
1302   ]);;
1303   (* }}} *)
1304
1305 let REAL_FINITE_MIN_EXISTS = 
1306 prove(`!S:real->bool. FINITE S /\ ~(S = {}) ==> ?m. m IN S /\ (!x. x IN S ==> m <= x)`,
1307                 MESON_TAC[INF_FINITE]);;
1308
1309 let REAL_WLOG_SQUARE_LEMMA = prove_by_refinement(
1310   `!P. (!y1 y2 y3 y4 y5 y6. P y1 y2 y3 y4 y5 y6 = P y2 y3 y4 y1 y6 y5) /\
1311     (!y1 y2 y3 y4 y5 y6. (y2 <= y1) /\ (y3 <= y1) /\ (y4 <= y1) 
1312          ==>
1313        P y1 y2 y3 y4 y5 y6) ==>
1314     (!y1 y2 y3 y4 y5 y6. P y1 y2 y3 y4 y5 y6)`,
1315   (* {{{ proof *)
1316   [
1317   REPEAT WEAK_STRIP_TAC;
1318   SUBGOAL_THEN `?a.  a IN {y1,y2,y3,y4} /\ (!x. x IN {y1,y2,y3,y4} ==> x <= a)` MP_TAC;
1319     MATCH_MP_TAC Merge_ineq.REAL_FINITE_MAX_EXISTS;
1320     BY(REWRITE_TAC[ FINITE_INSERT ; FINITE_EMPTY;NOT_INSERT_EMPTY]);
1321   REPEAT WEAK_STRIP_TAC;
1322   REPEAT (FIRST_X_ASSUM_ST `IN` MP_TAC);
1323   REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
1324   REWRITE_TAC[MESON[] `(!x. x = y1 \/ x = y2 \/ x = y3 \/ x = y4 ==> x <= a) = (y1 <= a /\ y2 <= a /\ y3 <= a /\ y4 <= a)`];
1325   BY(DISCH_THEN STRIP_ASSUME_TAC THEN ASM_MESON_TAC[])
1326   ]);;
1327   (* }}} *)
1328
1329 let REAL_WLOG_SQUARE2_LEMMA = prove_by_refinement(
1330 `!P. (!y1 y2 y3 y4 y5 y6. P y1 y2 y3 y4 y5 y6 = P y2 y3 y4 y1 y6 y5 
1331     /\ P y1 y2 y3 y4 y5 y6 = P y1 y4 y3 y2 y6 y5) /\
1332     (!y1 y2 y3 y4 y5 y6. (y2 <= y1) /\ (y3 <= y1) /\ (y4 <= y1) /\ (y4 <= y2)
1333          ==>
1334        P y1 y2 y3 y4 y5 y6) ==>
1335     (!y1 y2 y3 y4 y5 y6. P y1 y2 y3 y4 y5 y6)`,
1336   (* {{{ proof *)
1337   [
1338   GEN_TAC;
1339   DISCH_TAC;
1340   MATCH_MP_TAC REAL_WLOG_SQUARE_LEMMA;
1341   ASM_REWRITE_TAC[];
1342   BY(ASM_MESON_TAC[arith `y2 <= y4 \/ y4 <= y2`])
1343   ]);;
1344   (* }}} *)
1345
1346 let EE_vv = prove_by_refinement(
1347   `!vv k i.
1348   periodic (vv:num->A) k /\ 3 <= k /\
1349   (!i (j:num). i < k /\ j < k /\ vv i = vv j ==> i = j) ==> 
1350     (EE  (vv i) (IMAGE (\i. {vv i, vv (SUC i)}) (:num))) = { vv (SUC i) , vv (i + (k -1)) }`,
1351   (* {{{ proof *)
1352   [
1353   REPEAT WEAKER_STRIP_TAC;
1354   TYPIFY `~(k=0)` (C SUBGOAL_THEN ASSUME_TAC);
1355     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
1356   REWRITE_TAC[Lvducxu.IN_EE_IFF_IN_E;EXTENSION;IN_INSERT;NOT_IN_EMPTY];
1357   X_GEN_TAC `ww:A`;
1358   REWRITE_TAC[IN_IMAGE;IN_UNIV];
1359   REWRITE_TAC[Geomdetail.EQ_EXPAND];
1360   CONJ2_TAC;
1361     DISCH_THEN DISJ_CASES_TAC;
1362       BY(ASM_MESON_TAC[]);
1363     TYPIFY `i + k - 1` EXISTS_TAC;
1364     ASM_REWRITE_TAC[];
1365     REWRITE_TAC[Geomdetail.PAIR_EQ_EXPAND];
1366     DISJ2_TAC;
1367     ASM_SIMP_TAC[arith `3 <= k ==> SUC(i + k - 1) = i +k`];
1368     BY(ASM_MESON_TAC[Oxl_def.periodic]);
1369   REPEAT WEAKER_STRIP_TAC;
1370   FIRST_X_ASSUM MP_TAC;
1371   REWRITE_TAC[Geomdetail.PAIR_EQ_EXPAND];
1372   DISCH_THEN DISJ_CASES_TAC;
1373     ASM_REWRITE_TAC[];
1374     DISJ1_TAC;
1375     FIRST_X_ASSUM MP_TAC;
1376     INTRO_TAC Oxl_def.periodic_mod [`vv`;`k`];
1377     REWRITE_TAC[GSYM RIGHT_IMP_FORALL_THM];
1378     ANTS_TAC;
1379       BY(ASM_REWRITE_TAC[]);
1380     DISCH_THEN (unlist ONCE_REWRITE_TAC);
1381     REPEAT WEAKER_STRIP_TAC;
1382     TYPIFY `i MOD k = x MOD k` (C SUBGOAL_THEN ASSUME_TAC);
1383       BY(ASM_MESON_TAC[DIVISION]);
1384     AP_TERM_TAC;
1385     REWRITE_TAC[arith `SUC x = x + 1`];
1386     GMATCH_SIMP_TAC (GSYM MOD_ADD_MOD);
1387     FIRST_X_ASSUM (SUBST1_TAC o GSYM);
1388     GMATCH_SIMP_TAC MOD_ADD_MOD;
1389     BY(ASM_REWRITE_TAC[]);
1390   COMMENT "last case";
1391   ASM_REWRITE_TAC[];
1392   DISJ2_TAC;
1393   FIRST_X_ASSUM MP_TAC;
1394   INTRO_TAC Oxl_def.periodic_mod [`vv`;`k`];
1395   ASM_REWRITE_TAC[];
1396   DISCH_THEN (unlist ONCE_REWRITE_TAC);
1397   REPEAT WEAKER_STRIP_TAC;
1398   TYPIFY `i MOD k = SUC x MOD k` (C SUBGOAL_THEN ASSUME_TAC);
1399     BY(ASM_MESON_TAC[DIVISION]);
1400   AP_TERM_TAC;
1401   GMATCH_SIMP_TAC (GSYM MOD_ADD_MOD);
1402   ASM_REWRITE_TAC[];
1403   GMATCH_SIMP_TAC MOD_ADD_MOD;
1404   ASM_SIMP_TAC[arith `3 <= k ==> (SUC x + k - 1 = 1 * k + x)`];
1405   BY(REWRITE_TAC[MOD_MULT_ADD])
1406   ]);;
1407   (* }}} *)
1408
1409 let tau_fun_azim = prove_by_refinement(
1410   `!vv k .
1411   (let V = IMAGE vv (:num) in
1412    let E = IMAGE (\i. {vv i, vv (SUC i)}) (:num) in
1413    let f = IMAGE (\i. vv i,vv (SUC i)) (:num) in
1414     (periodic vv k /\ 3 <= k /\
1415      (!i j. i < k /\ j < k /\ vv i = vv j ==> (i = j)) ==>
1416        tau_fun V E f = sum {i | i < k} (\i. rho_fun (norm (vv i)) *
1417          azim (vec 0) (vv i) (vv (i+1)) (vv (i + (k-1))))  - (pi + sol0) * (&k - &2)))`,
1418   (* {{{ proof *)
1419   [
1420   REWRITE_TAC[LET_DEF;LET_END_DEF;Appendix.tau_fun];
1421   REPEAT WEAKER_STRIP_TAC;
1422   GMATCH_SIMP_TAC (GSYM Oxlzlez.PERIODIC_IMAGE);
1423   TYPIFY `k` EXISTS_TAC;
1424   CONJ_TAC;
1425     ASM_SIMP_TAC[arith `3 <= k ==> ~(0 = k)`];
1426     FIRST_X_ASSUM_ST `periodic` MP_TAC;
1427     REWRITE_TAC[Oxl_def.periodic;PAIR_EQ];
1428     BY(MESON_TAC[arith `SUC (i + k) = SUC i + k`]);
1429   MATCH_MP_TAC (arith `s = s' /\ b = b' ==> s - (pi+sol0) * b = s' - (pi+sol0) * b'`);
1430   GMATCH_SIMP_TAC CARD_IMAGE_INJ;
1431   ASM_REWRITE_TAC[IN_ELIM_THM;PAIR_EQ;FINITE_NUMSEG_LT;CARD_NUMSEG_LT];
1432   CONJ_TAC;
1433     BY(ASM_MESON_TAC[]);
1434   CONJ2_TAC;
1435     GMATCH_SIMP_TAC REAL_OF_NUM_SUB;
1436     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
1437   GMATCH_SIMP_TAC SUM_IMAGE;
1438   ASM_REWRITE_TAC[IN_ELIM_THM;PAIR_EQ;FINITE_NUMSEG_LT;CARD_NUMSEG_LT];
1439   CONJ_TAC;
1440     BY(ASM_MESON_TAC[]);
1441   MATCH_MP_TAC SUM_EQ;
1442   REWRITE_TAC[IN_ELIM_THM;o_THM];
1443   REPEAT WEAKER_STRIP_TAC;
1444   AP_TERM_TAC;
1445   REWRITE_TAC[Localization.azim_in_fan;LET_DEF;LET_END_DEF];
1446   GMATCH_SIMP_TAC EE_vv;
1447   TYPIFY `k` EXISTS_TAC;
1448   ASM_REWRITE_TAC[];
1449   COND_CASES_TAC;
1450     REWRITE_TAC[Local_lemmas.AZIM_CYCLE_TWO_POINT_SET];
1451     BY(REWRITE_TAC[arith `SUC x = x + 1`]);
1452   PROOF_BY_CONTR_TAC;
1453   FIRST_X_ASSUM_ST `CARD` MP_TAC;
1454   TYPIFY `~(k = 0)` (C SUBGOAL_THEN ASSUME_TAC);
1455     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
1456   REWRITE_TAC[];
1457   MATCH_MP_TAC (arith `c = 2 ==> c > 1`);
1458   MATCH_MP_TAC Hypermap.CARD_TWO_ELEMENTS;
1459   INTRO_TAC Oxl_def.periodic_mod [`vv`;`k`];
1460   ASM_REWRITE_TAC[];
1461   DISCH_THEN (unlist ONCE_REWRITE_TAC);
1462   DISCH_TAC;
1463   TYPIFY `SUC x MOD k = (x + k - 1) MOD k` (C SUBGOAL_THEN ASSUME_TAC);
1464     BY(ASM_MESON_TAC[DIVISION]);
1465   INTRO_TAC Oxlzlez.MOD_INJ1_ALT [`k-2`;`k`];
1466   ANTS_TAC;
1467     BY(REPEAT (FIRST_X_ASSUM_ST `3 <= k` MP_TAC) THEN ARITH_TAC);
1468   DISCH_TAC;
1469   FIRST_X_ASSUM (C INTRO_TAC [`SUC x`]);
1470   ASM_REWRITE_TAC[];
1471   BY(ASM_SIMP_TAC[arith `3 <= k ==> SUC x + k - 2 = x + k - 1`])
1472   ]);;
1473   (* }}} *)
1474
1475 let vv_rho_node1 = prove_by_refinement(
1476   `!vv k .
1477   (let V = IMAGE vv (:num) in
1478    let f = IMAGE (\i. vv i,vv (SUC i)) (:num) in
1479     (periodic vv k /\ 3 <= k /\
1480      (!i j. i < k /\ j < k /\ vv i = vv j ==> (i = j)) ==>
1481        (!i. rho_node1 f (vv i) = vv (SUC i))))`,
1482   (* {{{ proof *)
1483   [
1484   REWRITE_TAC[LET_DEF;LET_END_DEF];
1485   REPEAT WEAKER_STRIP_TAC;
1486   REWRITE_TAC[Local_lemmas.rho_node1];
1487   TYPIFY `~( k = 0)` (C SUBGOAL_THEN ASSUME_TAC);
1488     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
1489   SELECT_TAC;
1490     RULE_ASSUM_TAC(REWRITE_RULE[IN_IMAGE;IN_UNIV;PAIR_EQ]);
1491     REPEAT (FIRST_X_ASSUM MP_TAC) THEN REPEAT WEAKER_STRIP_TAC;
1492     ASM_REWRITE_TAC[];
1493     REPLICATE_TAC 4 (FIRST_X_ASSUM MP_TAC);
1494     INTRO_TAC periodic_vv_inj [`vv`;`k`];
1495     ASM_REWRITE_TAC[];
1496     DISCH_THEN (unlist ONCE_REWRITE_TAC);
1497     REWRITE_TAC[arith `SUC u = u + 1`];
1498     REPEAT WEAKER_STRIP_TAC;
1499     ONCE_REWRITE_TAC [GSYM MOD_ADD_MOD];
1500     GMATCH_SIMP_TAC (GSYM MOD_ADD_MOD);
1501     TYPIFY `x' MOD k = i MOD k` (C SUBGOAL_THEN SUBST1_TAC);
1502       BY(ASM_MESON_TAC[]);
1503     GMATCH_SIMP_TAC MOD_ADD_MOD;
1504     BY(ASM_REWRITE_TAC[]);
1505   PROOF_BY_CONTR_TAC;
1506   FIRST_X_ASSUM_ST `IMAGE` MP_TAC;
1507   REWRITE_TAC[];
1508   TYPIFY `vv(SUC i)` EXISTS_TAC;
1509   BY(SET_TAC[])
1510   ]);;
1511   (* }}} *)
1512
1513 let ITER_vv_rho_node1 = prove_by_refinement(
1514   `!vv k j. (let V = IMAGE vv (:num) in
1515    let f = IMAGE (\i. vv i,vv (SUC i)) (:num) in
1516     (periodic vv k /\ 3 <= k /\
1517      (!i j. i < k /\ j < k /\ vv i = vv j ==> (i = j)) ==>
1518        (!i. ITER j (rho_node1 f) (vv i) = vv (i+j))))`,
1519   (* {{{ proof *)
1520   [
1521   REWRITE_TAC[LET_DEF;LET_END_DEF];
1522   REPEAT WEAKER_STRIP_TAC;
1523   SPEC_TAC (`j:num`,`j:num`);
1524   INDUCT_TAC;
1525     BY(REWRITE_TAC[ITER;arith `i + 0 = i`]);
1526   ASM_SIMP_TAC[ITER];
1527   INTRO_TAC vv_rho_node1 [`vv`;`k`];
1528   ASM_REWRITE_TAC[LET_DEF;LET_END_DEF];
1529   DISCH_THEN (unlist REWRITE_TAC);
1530   AP_TERM_TAC;
1531   BY(ARITH_TAC)
1532   ]);;
1533   (* }}} *)
1534
1535 let PRIOR_TO_LESS_THAN_PI_LEMMA_ALT = prove_by_refinement(
1536   `!V E FF v. convex_local_fan (V,E,FF) /\ v IN V
1537      ==> (!w. w IN V
1538               ==> azim (vec 0) v (rho_node1 FF v) w <=
1539                   azim (vec 0) v (rho_node1 FF v)
1540                   (azim_cycle (EE v E) (vec 0) v (rho_node1 FF v)))`,
1541   (* {{{ proof *)
1542   [
1543   MESON_TAC[Local_lemmas.PRIOR_TO_LESS_THAN_PI_LEMMA]
1544   ]);;
1545   (* }}} *)
1546
1547 let vv_azim_le = prove_by_refinement(
1548   `!vv k i j. 
1549     (let V = IMAGE vv (:num) in
1550    let E = IMAGE (\i. {vv i, vv (SUC i)}) (:num) in
1551    let f = IMAGE (\i. vv i,vv (SUC i)) (:num) in
1552     (periodic vv k /\ 3 <= k /\
1553    V SUBSET ball_annulus /\
1554    dist(vv i, vv (SUC i)) < &4 /\
1555    dist(vv i, vv (i+k - 1)) < &4 /\
1556    dist(vv i, vv j) < &4 /\
1557    ~(i MOD k = j MOD k) /\
1558    (!i j. ~(vv i = vv j) ==> &2 <= dist(vv i,vv j) ) /\
1559    convex_local_fan (V,E,f) /\
1560         (!i j. i < k /\ j < k /\ vv i = vv j ==> (i = j))
1561     ==> azim (vec 0) (vv i) (vv (SUC i)) (vv j) <= azim (vec 0) (vv i) (vv (SUC i)) (vv (i + k - 1))))`,
1562   (* {{{ proof *)
1563   [
1564   REWRITE_TAC[LET_DEF;LET_END_DEF];
1565   REPEAT WEAKER_STRIP_TAC;
1566   TYPIFY `~(k=0)` (C SUBGOAL_THEN ASSUME_TAC);
1567     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
1568   INTRO_TAC PRIOR_TO_LESS_THAN_PI_LEMMA_ALT [`IMAGE vv (:num)`; `IMAGE (\i. {vv i, vv (SUC i)}) (:num)`; `IMAGE (\i. vv i,vv (SUC i)) (:num)`;`vv i`];
1569   ASM_REWRITE_TAC[];
1570   ANTS_TAC;
1571     BY(SET_TAC[]);
1572   DISCH_THEN (C INTRO_TAC [`vv j`]);
1573   ANTS_TAC;
1574     BY(SET_TAC[]);
1575   INTRO_TAC vv_rho_node1 [`vv`;`k`];
1576   REWRITE_TAC[LET_DEF;LET_END_DEF];
1577   ANTS_TAC;
1578     BY(ASM_REWRITE_TAC[]);
1579   DISCH_THEN (unlist REWRITE_TAC);
1580   GMATCH_SIMP_TAC EE_vv;
1581   TYPIFY `k` EXISTS_TAC;
1582   ASM_REWRITE_TAC[];
1583   REWRITE_TAC[Local_lemmas.AZIM_CYCLE_TWO_POINT_SET];
1584   ]);;
1585   (* }}} *)
1586
1587 let vv_split_azim = prove_by_refinement(
1588   `!vv k i j. 
1589     (let V = IMAGE vv (:num) in
1590    let E = IMAGE (\i. {vv i, vv (SUC i)}) (:num) in
1591    let f = IMAGE (\i. vv i,vv (SUC i)) (:num) in
1592     (periodic vv k /\ 3 <= k /\
1593    V SUBSET ball_annulus /\
1594    dist(vv i, vv (SUC i)) < &4 /\
1595    dist(vv i, vv (i+k - 1)) < &4 /\
1596    dist(vv i, vv j) < &4 /\
1597    ~(i MOD k = j MOD k) /\
1598    (!i j. ~(vv i = vv j) ==> &2 <= dist(vv i,vv j) ) /\
1599    convex_local_fan (V,E,f) /\
1600         (!i j. i < k /\ j < k /\ vv i = vv j ==> (i = j))
1601     ==> azim (vec 0) (vv i) (vv (SUC i)) (vv (i + k - 1)) = 
1602         azim (vec 0) (vv i) (vv (SUC i)) (vv j) +
1603           azim (vec 0) (vv i) (vv j) (vv (i + k - 1))))`,
1604   (* {{{ proof *)
1605   [
1606   REWRITE_TAC[LET_DEF;LET_END_DEF];
1607   REPEAT WEAKER_STRIP_TAC;
1608   TYPIFY `~(k=0)` (C SUBGOAL_THEN ASSUME_TAC);
1609     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
1610   INTRO_TAC vv_azim_le [`vv`;`k`;`i`;`j`];
1611   REWRITE_TAC[LET_DEF;LET_END_DEF];
1612   ANTS_TAC;
1613     BY(ASM_REWRITE_TAC[]);
1614   DISCH_TAC;
1615   MATCH_MP_TAC Fan.sum4_azim_fan;
1616   ASM_REWRITE_TAC[];
1617   REPEAT (GMATCH_SIMP_TAC NONPARALLEL_BALL_ANNULUS40_ALT);
1618   ASM_REWRITE_TAC[];
1619   RULE_ASSUM_TAC (REWRITE_RULE[IMAGE_SUBSET_IN;IN_UNIV]);
1620   ASM_REWRITE_TAC[];
1621   REPEAT (FIRST_ASSUM_ST `dist` GMATCH_SIMP_TAC);
1622   INTRO_TAC periodic_vv_inj [`vv`;`k`];
1623   ANTS_TAC;
1624     BY(ASM_REWRITE_TAC[]);
1625   DISCH_THEN (unlist ASM_REWRITE_TAC);
1626   REWRITE_TAC[arith `SUC i = (i +1)`];
1627   BY(ASM_MESON_TAC[Oxlzlez.MOD_INJ1_ALT;arith `3 <= k ==> (k - 1 < k)`;arith `3 <=k ==> 1 < k`;arith `3 <=k ==> ~(k- 1=0)`;arith `~(1 = 0)`])
1628   ]);;
1629   (* }}} *)
1630
1631 let EGHNAVX1_ALT = prove_by_refinement(
1632   `!V E FF bta v0 ww k. convex_local_fan (V,E,FF) /\
1633      v0 IN V /\
1634      CARD V = k /\
1635      (!v. v IN V /\ ~(v = v0) ==> ~collinear {vec 0, v0, v}) /\
1636      (!i. ITER i (rho_node1 FF) v0 = ww i) /\
1637      (!i. azim (vec 0) v0 (ww 1) (ww i) = bta i)
1638      ==>          (!i j. i < j /\ j < k ==> bta i <= bta j)`,
1639   (* {{{ proof *)
1640   [
1641   REPEAT GEN_TAC;
1642   DISCH_THEN (MP_TAC o (MATCH_MP Local_lemmas.EGHNAVX));
1643   BY(DISCH_THEN (unlist REWRITE_TAC))
1644   ]);;
1645   (* }}} *)
1646
1647 let vv_split_azim_generic = prove_by_refinement(
1648   `!vv k i j j'. 
1649     (let V = IMAGE vv (:num) in
1650    let E = IMAGE (\i. {vv i, vv (SUC i)}) (:num) in
1651    let f = IMAGE (\i. vv i,vv (SUC i)) (:num) in
1652     (periodic vv k /\ 3 <= k /\
1653    (0< j) /\ (j < j') /\ (j' < k) /\
1654    generic V E /\
1655    convex_local_fan (V,E,f) /\
1656         (!i j. i < k /\ j < k /\ vv i = vv j ==> (i = j))
1657     ==> azim (vec 0) (vv i) (vv (SUC i)) (vv (i+j')) = 
1658         azim (vec 0) (vv i) (vv (SUC i)) (vv (i+j)) +
1659           azim (vec 0) (vv i) (vv (i+j)) (vv (i+j'))))`,
1660   (* {{{ proof *)
1661   [
1662   REWRITE_TAC[LET_DEF;LET_END_DEF];
1663   REPEAT WEAKER_STRIP_TAC;
1664   TYPIFY `~(k=0)` (C SUBGOAL_THEN ASSUME_TAC);
1665     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
1666   TYPIFY `!i. vv i IN IMAGE vv (:num)` (C SUBGOAL_THEN ASSUME_TAC);
1667     REWRITE_TAC[IN_IMAGE;IN_UNIV];
1668     BY(ASM_MESON_TAC[]);
1669   INTRO_TAC EGHNAVX1_ALT [`IMAGE vv (:num)`; `IMAGE (\i. {vv i, vv (SUC i)}) (:num)`; `IMAGE (\i. vv i,vv (SUC i)) (:num)`;`\j. azim (vec 0) (vv i) (vv (SUC i)) (vv (i + j))`;`vv i`;`\j. ITER j (rho_node1 (IMAGE (\i. vv i,vv (SUC i)) (:num))) (vv i)`;`k`];
1670   ASM_REWRITE_TAC[];
1671   INTRO_TAC ITER_vv_rho_node1 [`vv`;`k`];
1672   REWRITE_TAC[LET_DEF;LET_END_DEF];
1673   ASM_REWRITE_TAC[];
1674   DISCH_THEN (unlist REWRITE_TAC);
1675   REWRITE_TAC[arith `i + 1 = SUC i`];
1676   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`];
1677   ASM_REWRITE_TAC[];
1678   ANTS_TAC;
1679     MATCH_MP_TAC Local_lemmas.CVX_LO_IMP_LO;
1680     BY(ASM_REWRITE_TAC[]);
1681   DISCH_TAC;
1682   ASM_REWRITE_TAC[];
1683   ANTS_TAC;
1684     GMATCH_SIMP_TAC (GSYM Oxlzlez.PERIODIC_IMAGE);
1685     TYPIFY `k` EXISTS_TAC;
1686     ASM_REWRITE_TAC[];
1687     GMATCH_SIMP_TAC CARD_IMAGE_INJ;
1688     BY(ASM_REWRITE_TAC[IN_ELIM_THM;CARD_NUMSEG_LT;FINITE_NUMSEG_LT ]);
1689   DISCH_THEN (C INTRO_TAC [`j`;`j'`]);
1690   ASM_REWRITE_TAC[];
1691   DISCH_TAC;
1692   MATCH_MP_TAC Fan.sum4_azim_fan;
1693   ASM_REWRITE_TAC[];
1694   FIRST_X_ASSUM_ST `IMAGE` (REPEAT o GMATCH_SIMP_TAC);
1695   ASM_REWRITE_TAC[];
1696   INTRO_TAC periodic_vv_inj [`vv`;`k`];
1697   ANTS_TAC;
1698     BY(ASM_REWRITE_TAC[]);
1699   DISCH_THEN (unlist REWRITE_TAC);
1700   REWRITE_TAC[arith `SUC i = i + 1`];
1701   BY(REPEAT CONJ_TAC THEN MATCH_MP_TAC (REWRITE_RULE[GSYM RIGHT_FORALL_IMP_THM] (GSYM Oxlzlez.MOD_INJ1_ALT)) THEN ASM_REWRITE_TAC[] THEN REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC)
1702   ]);;
1703   (* }}} *)
1704
1705 let muR_ALT = prove_by_refinement(
1706   `!y1 y2 y3 y4 y5 y6 y7 y8 y9. muR y1 y2 y3 y4 y5 y6 y7 y8 y9  =
1707          cayleyR (y6 * y6) (y5 * y5) (y1 * y1) (y7 * y7) (y4 * y4) (y2 * y2)
1708          (y8 * y8)
1709          (y3 * y3)
1710          (y9 * y9)
1711           `,
1712   (* {{{ proof *)
1713   [
1714     BY(REWRITE_TAC[FUN_EQ_THM;Mur.muR])
1715   ]);;
1716   (* }}} *)
1717
1718 let enclosed4_lemma = prove_by_refinement(
1719   `!(v0:real^3) v1 v2 v3. 
1720    (let y1 = norm (v1) in
1721    let y2 = norm (v2) in
1722    let y3 = norm (v0) in
1723    let y4 = dist(v0, v2) in
1724    let y5 = dist(v0, v1) in
1725    let y6 = dist(v1, v2) in
1726    let y7 = norm (v3) in
1727    let y8 = dist(v0,v3) in
1728    let y9 = dist(v2,v3) in
1729     (
1730     &0 < ups_x (norm (v0) * norm (v0)) (norm (v2) * norm (v2)) (dist(v0,v2) * dist(v0,v2)) /\
1731       chi_msb [(vec 0);v0;v2] v1 * chi_msb [(vec 0);v0;v2] v3 <= &0
1732     ==> dist(v1 ,v3) = 
1733         enclosed y1 y5 y6 y4 y2 y3 y7 y8 y9))`,
1734   (* {{{ proof *)
1735   [
1736   REWRITE_TAC[LET_DEF;LET_END_DEF];
1737   REPEAT WEAKER_STRIP_TAC;
1738   REWRITE_TAC[Enclosed.enclosed];
1739   INTRO_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] Collect_geom2.CAYLEYR_5POINTS) [`(vec 0):real^3`;`v0`;`v2`;`v1`;`v3`];
1740   REWRITE_TAC[DIST_0];
1741   TYPIFY `dist(v2,v1) = dist(v1,v2)` (C SUBGOAL_THEN SUBST1_TAC);
1742     BY(MESON_TAC[DIST_SYM]);
1743   DISCH_TAC;
1744   TYPED_ABBREV_TAC `p = muR (norm (v1:real^3)) (dist (v0,v1)) (dist (v1,v2)) (dist (v0,v2)) (norm v2)       (norm v0)      (norm v3)      (dist (v0,v3))     (dist (v2,v3))`;
1745   TYPIFY `quadratic_root_plus (abc_of_quadratic p) = dist (v1,v3) pow 2` ENOUGH_TO_SHOW_TAC;
1746     DISCH_THEN SUBST1_TAC;
1747     GMATCH_SIMP_TAC POW_2_SQRT;
1748     BY(REWRITE_TAC[DIST_POS_LE]);
1749   FIRST_X_ASSUM_ST `muR` MP_TAC;
1750   REWRITE_TAC[muR_ALT];
1751   DISCH_THEN (SUBST1_TAC o GSYM);
1752   TYPED_ABBREV_TAC  `a = ups_x (norm (v0) * norm (v0)) (norm (v2) * norm (v2)) (dist(v0,v2) * dist(v0,v2))` ;
1753   TYPED_ABBREV_TAC  `b = cayleytr (norm v0 * norm v0) (norm v2 * norm v2) (norm v1 * norm v1)   (norm v3 * norm v3)  (dist (v0,v2) * dist (v0,v2))  (dist (v0,v1) * dist (v0,v1))  (dist (v0,v3) * dist (v0,v3))  (dist (v1,v2) * dist (v1,v2))  (dist (v2,v3) * dist (v2,v3)) (&0)` ;
1754   TYPED_ABBREV_TAC  `c = cayleyR (norm v0 * norm v0) (norm v2 * norm v2) (norm v1 * norm v1)   (norm v3 * norm v3)  (dist (v0,v2) * dist (v0,v2))  (dist (v0,v1) * dist (v0,v1))  (dist (v0,v3) * dist (v0,v3))  (dist (v1,v2) * dist (v1,v2))  (dist (v2,v3) * dist (v2,v3)) (&0)` ;
1755   TYPIFY ` cayleyR (norm v0 * norm v0) (norm v2 * norm v2) (norm v1 * norm v1)   (norm v3 * norm v3)  (dist (v0,v2) * dist (v0,v2))  (dist (v0,v1) * dist (v0,v1))  (dist (v0,v3) * dist (v0,v3))  (dist (v1,v2) * dist (v1,v2))  (dist (v2,v3) * dist (v2,v3))  = (\x. a * x pow 2 + b * x + c)` (C SUBGOAL_THEN ASSUME_TAC);
1756     REWRITE_TAC[FUN_EQ_THM];
1757     ONCE_REWRITE_TAC[Collect_geom.LTCTBAN];
1758     BY(ASM_REWRITE_TAC[]);
1759   ASM_REWRITE_TAC[Nonlinear_lemma.abc_quadratic];
1760   TYPIFY `b pow 2 - &4 * a * c = &16 *  delta_y (norm v0) (norm v2) (norm v1) (dist (v2,v1)) (dist (v0,v1)) (dist (v0,v2)) * delta_y (norm v0) (norm v2) (norm v3) (dist (v2,v3)) (dist (v0,v3)) (dist (v0,v2))` (C SUBGOAL_THEN ASSUME_TAC);
1761     EXPAND_TAC "a";
1762     EXPAND_TAC "b";
1763     EXPAND_TAC "c";
1764     REWRITE_TAC[Collect_geom.DISCRIMINANT_OF_CAY];
1765     REWRITE_TAC[Merge_ineq.delta_delta_x;GSYM Sphere.delta_y];
1766     BY(MESON_TAC[DIST_SYM]);
1767   TYPIFY `&0 <= delta_y (norm v0) (norm v2) (norm v1) (dist (v2,v1)) (dist (v0,v1))       (dist (v0,v2))` (C SUBGOAL_THEN ASSUME_TAC);
1768     BY(MESON_TAC[REWRITE_RULE[LET_DEF;LET_END_DEF] Tame_lemmas.delta_y_pos]);
1769   TYPIFY `&0 <= delta_y (norm v0) (norm v2) (norm v3) (dist (v2,v3)) (dist (v0,v3))       (dist (v0,v2))` (C SUBGOAL_THEN ASSUME_TAC);
1770     BY(MESON_TAC[REWRITE_RULE[LET_DEF;LET_END_DEF] Tame_lemmas.delta_y_pos]);
1771   TYPIFY `&0 <= b pow 2 - &4 * a * c` (C SUBGOAL_THEN ASSUME_TAC);
1772     ASM_REWRITE_TAC[];
1773     GMATCH_SIMP_TAC REAL_LE_MUL;
1774     CONJ_TAC;
1775       BY(REAL_ARITH_TAC);
1776     GMATCH_SIMP_TAC REAL_LE_MUL;
1777     BY(ASM_REWRITE_TAC[]);
1778   TYPED_ABBREV_TAC  `(x:real) = dist(v1,v3) pow 2` ;
1779   TYPIFY `a * x pow 2 + b * x + c = &0` (C SUBGOAL_THEN ASSUME_TAC);
1780     FIRST_X_ASSUM_ST `cayleyR` MP_TAC;
1781     REWRITE_TAC[FUN_EQ_THM];
1782     DISCH_THEN (C INTRO_TAC [`x`]);
1783     DISCH_THEN (SUBST1_TAC o GSYM);
1784     FIRST_X_ASSUM kill;
1785     BY(ASM_REWRITE_TAC[arith ` x * x = x pow 2`]);
1786   ASM_CASES_TAC `b pow 2 - &4 * a * c = &0`;
1787     MATCH_MP_TAC Tame_lemmas.quadratic_root_plus_disc0_eq;
1788     FIRST_X_ASSUM_ST `&0 < a` MP_TAC;
1789     REPLICATE_TAC 2 (FIRST_X_ASSUM MP_TAC);
1790     BY(REAL_ARITH_TAC);
1791   COMMENT "pos discr. case";
1792   MATCH_MP_TAC Tame_lemmas.quadratic_root_plus_gt_eq;
1793   TYPED_ABBREV_TAC `(n:real^3) =  v0 cross v2`;
1794   TYPED_ABBREV_TAC  `(v1':real^3) = reflection n v1` ;
1795   TYPED_ABBREV_TAC  `(y:real) = dist(v1',v3) pow 2` ;
1796   TYPIFY `y` EXISTS_TAC;
1797   SUBCONJ_TAC;
1798     BY(ASM_MESON_TAC[]);
1799   DISCH_TAC;
1800   CONJ_TAC;
1801     FIRST_X_ASSUM_ST `&0 <= x` MP_TAC;
1802     BY(REWRITE_TAC[]);
1803   FIRST_X_ASSUM_ST `a * x pow 2` MP_TAC;
1804   DISCH_THEN (SUBST1_TAC);
1805   REWRITE_TAC[];
1806   COMMENT "cayleyR again";
1807   INTRO_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] Collect_geom2.CAYLEYR_5POINTS) [`(vec 0):real^3`;`v0`;`v2`;`v1'`;`v3`];
1808   ASM_REWRITE_TAC[];
1809   EXPAND_TAC "v1'";
1810   TYPIFY `!v. dist(v,reflection n v1) =dist(reflection n v1,v)` (C SUBGOAL_THEN (unlist REWRITE_TAC));
1811     BY(MESON_TAC[DIST_SYM]);
1812   REPEAT (GMATCH_SIMP_TAC Tame_lemmas.dist_reflection_special);
1813   EXPAND_TAC "n";
1814   REWRITE_TAC[DOT_LZERO];
1815   REWRITE_TAC[Collect_geom2.ORTHOGONAL_CROSS_PRODUCT];
1816   REWRITE_TAC[DIST_0];
1817   TYPIFY `dist(v1,v0) = dist(v0,v1)` (C SUBGOAL_THEN SUBST1_TAC);
1818     BY(MESON_TAC[DIST_SYM]);
1819   ASM_REWRITE_TAC[arith `x pow 2 = x * x`];
1820   DISCH_THEN SUBST1_TAC;
1821   REWRITE_TAC[];
1822   COMMENT "y < x";
1823   EXPAND_TAC "x";
1824   EXPAND_TAC "y";
1825   EXPAND_TAC "v1'";
1826   REWRITE_TAC[Tame_lemmas.dist_reflection_lemma];
1827   MATCH_MP_TAC (arith `&0 < ( --r )/ nn   ==> d + &4 * r / nn < d`);
1828   GMATCH_SIMP_TAC REAL_LT_DIV;
1829   TYPIFY `~(n = vec 0)` (C SUBGOAL_THEN ASSUME_TAC);
1830     EXPAND_TAC "n";
1831     FIRST_X_ASSUM_ST `&0 < a` MP_TAC;
1832     EXPAND_TAC "a";
1833     REWRITE_TAC[GSYM DIST_0;arith `x * x = x pow 2`];
1834     REWRITE_TAC[GSYM Collect_geom2.NORM_CROSS_PRODUCT_UPS_X];
1835     REWRITE_TAC[arith `&0 < &4 * x <=> &0 < x`;arith `(v0:real^3) - vec 0 = v0`];
1836     REWRITE_TAC[GSYM NORM_POS_LT];
1837     REWRITE_TAC[GSYM Trigonometry2.NOT_ZERO_EQ_POW2_LT];
1838     BY(MESON_TAC[NORM_POS_LE;arith `&0 <= x /\ ~(x = &0) ==> &0 < x`]);
1839   CONJ2_TAC;
1840     BY(FIRST_X_ASSUM MP_TAC THEN MESON_TAC[DOT_POS_LT]);
1841   REWRITE_TAC[arith `&0 < -- r <=> r < &0`];
1842   EXPAND_TAC "n";
1843   TYPIFY `!v. v dot (v0 cross v2) = chi_msb [vec 0;v0;v2] v` (C SUBGOAL_THEN (unlist REWRITE_TAC));
1844     REWRITE_TAC[Leaf_cell.chi_msb;Basics.EL_EXPLICIT];
1845     REWRITE_TAC[arith `(v:real^3) - vec 0 = v`];
1846     BY(MESON_TAC[DOT_SYM]);
1847   FIRST_X_ASSUM_ST `chi_msb` MP_TAC;
1848   TYPIFY `~(chi_msb [vec 0;v0;v2] v1 * chi_msb [vec 0;v0;v2] v3 = &0)` ENOUGH_TO_SHOW_TAC;
1849     BY(REAL_ARITH_TAC);
1850   REWRITE_TAC[REAL_ENTIRE;DE_MORGAN_THM];
1851   REWRITE_TAC[GSYM Leaf_cell.CHI_MSB_COPLANAR];
1852   REWRITE_TAC[Oxlzlez.coplanar_delta_y;DIST_0];
1853   REWRITE_TAC[arith `&0 < x <=> (&0 <= x /\ ~(x = &0))`];
1854   ASM_REWRITE_TAC[];
1855   REWRITE_TAC[GSYM DE_MORGAN_THM;GSYM REAL_ENTIRE];
1856   DISCH_TAC;
1857   REPEAT (FIRST_X_ASSUM_ST `b pow 2 - &4 * a *c` MP_TAC);
1858   ASM_REWRITE_TAC[];
1859   BY(REAL_ARITH_TAC)
1860   ]);;
1861   (* }}} *)
1862
1863 let IN_V_IMP_AZIM_LESS_PI_ALT = prove_by_refinement(
1864   `!V E FF v. (convex_local_fan (V,E,FF) /\ v IN V
1865   ==> (!w. w IN V ==> azim (vec 0) v (rho_node1 FF v) w <= pi))`,
1866   (* {{{ proof *)
1867   [
1868     BY(MESON_TAC[Local_lemmas.IN_V_IMP_AZIM_LESS_PI])
1869   ]);;
1870   (* }}} *)
1871
1872 let vv_enclosed4 = prove_by_refinement(
1873   `!vv i.  
1874     (let V = IMAGE vv (:num) in
1875      let E = IMAGE (\i. {vv i, vv (SUC i)}) (:num) in
1876      let f = IMAGE (\i. vv i,vv (SUC i)) (:num) in
1877      let y1 = norm (vv (i+1)) in
1878    let y2 = norm (vv (i+2)) in
1879    let y3 = norm (vv (i)) in
1880    let y4 = dist(vv (i), vv (i+2)) in
1881    let y5 = dist(vv (i), vv (i+1)) in
1882    let y6 = dist(vv (i+1), vv (i+2)) in
1883    let y7 = norm (vv (i+3)) in
1884    let y8 = dist(vv (i),vv (i+3)) in
1885    let y9 = dist(vv (i+2),vv (i+3)) in
1886        (periodic vv 4 /\
1887           dist (vv i,vv ( i+1)) < &4 /\
1888           dist (vv i,vv (i + 3)) < &4 /\
1889           (!i j. ~(vv i = vv j) ==> &2 <= dist (vv i,vv j)) /\
1890           V SUBSET ball_annulus /\
1891          dist (vv i,vv (i+2)) < &4 /\
1892          convex_local_fan (V,E,f) /\
1893          (!i j. i < 4 /\ j < 4 /\ vv i = vv j ==> i = j)
1894          ==> dist (vv (i+1), vv(i+3)) = enclosed y1 y5 y6 y4 y2 y3 y7 y8 y9))`,
1895   (* {{{ proof *)
1896   [
1897   REWRITE_TAC[LET_THM];
1898   REPEAT WEAKER_STRIP_TAC;
1899   MATCH_MP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] enclosed4_lemma);
1900   TYPIFY `!i. vv i IN ball_annulus` (C SUBGOAL_THEN ASSUME_TAC);
1901     FIRST_X_ASSUM_ST `ball_annulus` MP_TAC;
1902     BY(SET_TAC[IN_UNIV]);
1903   TYPIFY `!i. vv i IN IMAGE vv (:num)` (C SUBGOAL_THEN ASSUME_TAC);
1904     REWRITE_TAC[IN_IMAGE;IN_UNIV];
1905     BY(MESON_TAC[]);
1906   SUBCONJ_TAC;
1907     REWRITE_TAC[GSYM DIST_0];
1908     REWRITE_TAC[GSYM Collect_geom2.NOT_COL_EQ_UPS_X_POS;arith `x * x = x pow 2`];
1909     MATCH_MP_TAC NONPARALLEL_BALL_ANNULUS40_ALT;
1910     ASM_REWRITE_TAC[];
1911     FIRST_X_ASSUM MATCH_MP_TAC;
1912     GMATCH_SIMP_TAC periodic_vv_inj;
1913     TYPIFY `4` EXISTS_TAC;
1914     ASM_REWRITE_TAC[arith `~(4 = 0)`];
1915     BY(ASM_MESON_TAC[ Oxlzlez.MOD_INJ1_ALT;arith `~(4 = 0) /\ ~(2 = 0) /\ (2 < 4)`]);
1916   DISCH_TAC;
1917   COMMENT "case delta=0";
1918   TYPIFY `chi_msb [vec 0; vv i; vv (i + 2)] (vv (i + 1)) = &0` ASM_CASES_TAC;
1919     BY(ASM_REWRITE_TAC[arith `&0 * x <= &0`]);
1920   TYPIFY `chi_msb [vec 0; vv i; vv (i + 2)] (vv (i + 3)) = &0` ASM_CASES_TAC;
1921     BY(ASM_REWRITE_TAC[arith ` x * &0 <= &0`]);
1922   TYPIFY `~coplanar {vec 0, vv i, vv (i + 2), vv (i + 1)} /\ ~coplanar {vec 0, vv i, vv (i + 2), vv (i + 3)}` (C SUBGOAL_THEN ASSUME_TAC);
1923     BY(ASM_REWRITE_TAC[ Leaf_cell.CHI_MSB_COPLANAR]);
1924   TYPIFY `~collinear {vec 0, vv  i, vv (i+1)} /\ ~collinear {vec 0,vv i, vv (i+3)} /\ ~collinear {vec 0,vv i, vv(i+2)}` (C SUBGOAL_THEN ASSUME_TAC);
1925     BY(ASM_MESON_TAC[Planarity.notcoplanar_imp_notcollinear_fan]);
1926   COMMENT "angle 0";
1927   INTRO_TAC IN_V_IMP_AZIM_LESS_PI_ALT [ `IMAGE vv (:num)`;`IMAGE (\i. {vv i, vv (SUC i)}) (:num)`;`IMAGE (\i. vv i,vv (SUC i)) (:num)`;`vv i`];
1928   ASM_REWRITE_TAC[];
1929   DISCH_THEN (C INTRO_TAC [`vv (i +3)`]);
1930   ASM_REWRITE_TAC[];
1931   GMATCH_SIMP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] vv_rho_node1);
1932   CONJ_TAC;
1933     TYPIFY `4` EXISTS_TAC;
1934     BY(ASM_REWRITE_TAC[arith `3 <= 4`]);
1935   DISCH_TAC;
1936   COMMENT "v2 in wedge";
1937   TYPIFY `vv (i +2) IN wedge_ge (vec 0) (vv i) (vv ( i+1)) (vv (i + 3))` (C SUBGOAL_THEN ASSUME_TAC);
1938     REWRITE_TAC[Local_lemmas.WEDGE_GE_AZIM_LE];
1939     REWRITE_TAC[arith `i + 1 = SUC i /\ i + 3 = i + 4 -1`];
1940     INTRO_TAC (REWRITE_RULE[LET_THM] vv_azim_le) [`vv`;`4`;`i`;`i + 2`];
1941     ANTS_TAC;
1942       ASM_REWRITE_TAC[arith `3 <= 4`];
1943       REWRITE_TAC[arith `SUC i = i + 1 /\ i + 4 -1 = i + 3`];
1944       ASM_REWRITE_TAC[];
1945       BY(MESON_TAC[ Oxlzlez.MOD_INJ1_ALT;arith `~(4 = 0) /\ ~(2 = 0) /\ (2 < 4)`]);
1946     BY(REWRITE_TAC[]);
1947   COMMENT " <  pi ";
1948   TYPIFY `azim (vec 0) (vv i) (vv (SUC i)) (vv (i + 3)) < pi` ASM_CASES_TAC;
1949     FIRST_X_ASSUM_ST `wedge_ge` MP_TAC;
1950     GMATCH_SIMP_TAC Local_lemmas.WEDGE_GE_EQ_AFF_GE;
1951     ASM_REWRITE_TAC[arith `i + 1 = SUC i`];
1952     GMATCH_SIMP_TAC Marchal_cells_2_new.AFF_GE_2_2;
1953     CONJ_TAC;
1954       TYPIFY `DISJOINT {vec 0, vv i} {vv (SUC i)} /\ DISJOINT {vec 0, vv i} {vv (i + 3)}` ENOUGH_TO_SHOW_TAC;
1955         REWRITE_TAC[DISJOINT];
1956         BY(SET_TAC[]);
1957       BY(ASM_MESON_TAC[Fan.th3a;arith `SUC i = i + 1`]);
1958     REWRITE_TAC[IN_ELIM_THM];
1959     REPEAT WEAKER_STRIP_TAC;
1960     ASM_REWRITE_TAC[];
1961     ONCE_REWRITE_TAC[Leaf_cell.chi_msb_swap_23];
1962     GMATCH_SIMP_TAC Leaf_cell.chi_msb_additive_d;
1963     TYPIFY `t3 % vv (SUC i) + t4 % vv (i + 3) =  t4 % vv (i + 3) + t3 % vv (SUC i)` (C SUBGOAL_THEN SUBST1_TAC);
1964       BY(VECTOR_ARITH_TAC);
1965     GMATCH_SIMP_TAC Leaf_cell.chi_msb_additive_d;
1966     CONJ_TAC;
1967       BY(FIRST_X_ASSUM_ST `&1` MP_TAC THEN REAL_ARITH_TAC);
1968     CONJ_TAC;
1969       BY(FIRST_X_ASSUM_ST `&1` MP_TAC THEN REAL_ARITH_TAC);
1970     TYPIFY `chi_msb [vec 0; vv i; vv (SUC i)] (vv (i + 3)) = -- chi_msb [vec 0; vv i; vv (i + 3)] (vv (SUC i))` (C SUBGOAL_THEN SUBST1_TAC);
1971       BY(MESON_TAC[Leaf_cell.chi_msb_swap_23]);
1972     REWRITE_TAC[arith `-- (t4 * -- c) * -- (t3 * c) <= &0 <=> &0 <= t4 * t3 * c pow 2`];
1973     GMATCH_SIMP_TAC REAL_LE_MUL;
1974     ASM_REWRITE_TAC[];
1975     GMATCH_SIMP_TAC REAL_LE_MUL;
1976     ASM_REWRITE_TAC[];
1977     BY(REWRITE_TAC[ REAL_LE_POW_2]);
1978   COMMENT "azim = pi";
1979   TYPIFY `azim (vec 0) (vv i) (vv (SUC i)) (vv (i + 3)) = pi` (C SUBGOAL_THEN ASSUME_TAC);
1980     BY(REPLICATE_TAC 2 (FIRST_X_ASSUM_ST `azim` MP_TAC) THEN REAL_ARITH_TAC);
1981   FIRST_X_ASSUM MP_TAC;
1982   GMATCH_SIMP_TAC Ldurdpn.LDURDPN;
1983   ASM_REWRITE_TAC[arith `SUC i = i + 1`];
1984   REWRITE_TAC[EXTENSION;NOT_IN_EMPTY;NOT_FORALL_THM];
1985   REWRITE_TAC[IN_INTER;Geomdetail.CONV0_SET2;IN_ELIM_THM];
1986   REPEAT WEAKER_STRIP_TAC;
1987   INTRO_TAC Leaf_cell.AFFINE_IMP_CHI_MSB_0 [`[vec 0;vv i; vv (i+2)]`;`x`];
1988   REWRITE_TAC[LENGTH;arith `SUC(SUC(SUC 0)) = 3`];
1989   REWRITE_TAC[Bump.set_of_list3_explicit];
1990   ANTS_TAC;
1991     TYPIFY `aff {vec 0, vv i} SUBSET affine hull {vec 0, vv i, vv (i + 2)}` ENOUGH_TO_SHOW_TAC;
1992       BY(FIRST_X_ASSUM_ST `aff` MP_TAC THEN SET_TAC[]);
1993     MATCH_MP_TAC Collect_geom.AFFINE_CONTAIN_LINE;
1994     REWRITE_TAC[AFFINE_AFFINE_HULL];
1995     MATCH_MP_TAC SUBSET_TRANS;
1996     TYPIFY `{vec 0, vv i, vv (i + 2)}` EXISTS_TAC;
1997     CONJ_TAC;
1998       BY(SET_TAC[]);
1999     BY(REWRITE_TAC[HULL_SUBSET]);
2000   ASM_REWRITE_TAC[];
2001   GMATCH_SIMP_TAC Leaf_cell.CHI_MSB_ADDITIVE;
2002   ASM_REWRITE_TAC[];
2003   DISCH_TAC;
2004   TYPIFY `!c c'. ((c':real) = (-- a/b) * c)  ==> c * c' <= &0` (C SUBGOAL_THEN MATCH_MP_TAC);
2005     REPEAT WEAKER_STRIP_TAC;
2006     ASM_REWRITE_TAC[];
2007     REWRITE_TAC[ (arith `c * -- a /b * c <= &0 <=> &0 <= (a / b) * c pow 2`) ];
2008     GMATCH_SIMP_TAC REAL_LE_MUL;
2009     GMATCH_SIMP_TAC REAL_LE_RDIV_EQ;
2010     ASM_REWRITE_TAC[];
2011     REWRITE_TAC[ REAL_LE_POW_2];
2012     BY(REPEAT (FIRST_X_ASSUM_ST `&0 < x` MP_TAC) THEN REAL_ARITH_TAC);
2013   MATCH_MP_TAC REAL_EQ_LCANCEL_IMP;
2014   TYPIFY `b` EXISTS_TAC;
2015   FIRST_X_ASSUM MP_TAC;
2016   REWRITE_TAC[arith `a + b = &0 <=> b = --a`];
2017   DISCH_THEN SUBST1_TAC;
2018   CONJ_TAC;
2019     BY(FIRST_X_ASSUM_ST `&0 < b` MP_TAC THEN REAL_ARITH_TAC);
2020   Calc_derivative.CALC_ID_TAC;
2021   BY(FIRST_X_ASSUM_ST `&0 < b` MP_TAC THEN REAL_ARITH_TAC)
2022   ]);;
2023   (* }}} *)
2024
2025 let enclosed_sym = prove_by_refinement(
2026   `!y1 y2 y3 y4 y5 y6 y7 y8 y0. enclosed y1 y5 y6 y4 y2 y3 y7 y8 y9 =
2027     enclosed y1 y6 y5 y4 y3 y2 y7 y9 y8`,
2028   (* {{{ proof *)
2029   [
2030   REPEAT WEAKER_STRIP_TAC;
2031   REWRITE_TAC[Enclosed.enclosed];
2032   REPLICATE_TAC 3 AP_TERM_TAC;
2033   REWRITE_TAC[muR_ALT];
2034   REWRITE_TAC[FUN_EQ_THM];
2035   GEN_TAC;
2036   REWRITE_TAC[Collect_geom2.cayleyR];
2037   BY(REAL_ARITH_TAC)
2038   ]);;
2039   (* }}} *)
2040
2041 let enclosed_sym2 = prove_by_refinement(
2042   `!y1 y2 y3 y4 y5 y6 y7 y8 y0. enclosed y1 y5 y6 y4 y2 y3 y7 y8 y9 =
2043     enclosed y7 y8 y9 y4 y2 y3 y1 y5 y6`,
2044   (* {{{ proof *)
2045   [
2046   REPEAT WEAKER_STRIP_TAC;
2047   REWRITE_TAC[Enclosed.enclosed];
2048   REPLICATE_TAC 3 AP_TERM_TAC;
2049   REWRITE_TAC[muR_ALT];
2050   REWRITE_TAC[FUN_EQ_THM];
2051   GEN_TAC;
2052   REWRITE_TAC[Collect_geom2.cayleyR];
2053   BY(REAL_ARITH_TAC)
2054   ]);;
2055   (* }}} *)
2056
2057 let convex_local_fan_azim_le_pi = prove_by_refinement(
2058   `!vv k i. (let V = IMAGE vv (:num) in
2059    let E = IMAGE (\i. {vv i, vv (SUC i)}) (:num) in
2060    let f = IMAGE (\i. vv i,vv (SUC i)) (:num) in
2061     (periodic vv k /\ 
2062    3 <= k /\ (!i j. i < k /\ j < k /\ vv i = vv j ==> i = j) /\
2063        convex_local_fan (V,E,f) /\
2064    V SUBSET ball_annulus 
2065     ==>
2066    (azim (vec 0) (vv i) (vv (SUC i)) (vv (i + k - 1)) <= pi)))`,
2067   (* {{{ proof *)
2068   [
2069   REWRITE_TAC[LET_THM];
2070   REPEAT WEAKER_STRIP_TAC;
2071   INTRO_TAC Localization.convex_local_fan [`IMAGE (\i. vv i,vv (SUC i)) (:num)`;`IMAGE vv (:num)`;`IMAGE (\i. {vv i, vv (SUC i)}) (:num)`;];
2072   ASM_REWRITE_TAC[IN_IMAGE;IN_UNIV];
2073   REPEAT WEAKER_STRIP_TAC;
2074   FIRST_X_ASSUM (C INTRO_TAC [ `vv i, vv (SUC i)`]);
2075   ANTS_TAC;
2076     BY(MESON_TAC[]);
2077   GMATCH_SIMP_TAC Local_lemmas.LOFA_DETERMINE_AZIM_IN_FA;
2078   CONJ_TAC;
2079     GEXISTL_TAC [`IMAGE vv (:num)`;`IMAGE (\i. vv i,vv (SUC i)) (:num)`];
2080     ASM_REWRITE_TAC[];
2081     BY(MESON_TAC[IN_IMAGE;IN_UNIV]);
2082   GMATCH_SIMP_TAC EE_vv;
2083   TYPIFY `k` EXISTS_TAC;
2084   CONJ_TAC;
2085     BY(ASM_REWRITE_TAC[]);
2086   REWRITE_TAC[Local_lemmas.AZIM_CYCLE_TWO_POINT_SET];
2087   BY(MESON_TAC[])
2088   ]);;
2089   (* }}} *)
2090
2091 let vv_quad_split012 = prove_by_refinement(
2092   `!vv. 
2093     (let V = IMAGE vv (:num) in
2094    let E = IMAGE (\i. {vv i, vv (SUC i)}) (:num) in
2095    let f = IMAGE (\i. vv i,vv (SUC i)) (:num) in
2096     (periodic vv 4 /\
2097    V SUBSET ball_annulus /\
2098    dist(vv 0, vv 1) < &4 /\
2099    dist(vv 0, vv 2) < &4 /\
2100    dist(vv 0, vv 3) < &4 /\
2101    dist(vv 1,vv 2) < &4 /\
2102    dist(vv 2,vv 3) < &4 /\
2103    (!i j. ~(vv i = vv j) ==> &2 <= dist(vv i,vv j) ) /\
2104    convex_local_fan (V,E,f) /\
2105         (!i j. i < 4 /\ j < 4 /\ vv i = vv j ==> (i = j))
2106      ==> (rho_fun (norm (vv 0)) * azim (vec 0) (vv 0) (vv 1) (vv 3) +
2107           rho_fun (norm (vv 1)) * azim (vec 0) (vv 1) (vv 2) (vv 0) +
2108           rho_fun (norm (vv 2)) * azim (vec 0) (vv 2) (vv 3) (vv 1) +
2109           rho_fun (norm (vv 3)) * azim (vec 0) (vv 3) (vv 0) (vv 2)) -
2110          (pi + sol0) * &2 =
2111          tau3 (vv 0) (vv 1) (vv 2) + tau3 (vv 2) (vv 3) (vv 0)))`,
2112   (* {{{ proof *)
2113   [
2114   REWRITE_TAC[LET_THM];
2115   REPEAT WEAKER_STRIP_TAC;
2116   TYPIFY ` azim (vec 0) (vv 0) (vv (SUC 0)) (vv (0 + 4 - 1)) <= pi /\ azim (vec 0) (vv 1) (vv (SUC 1)) (vv (1 + 4 - 1)) <= pi /\ azim (vec 0) (vv 2) (vv (SUC 2)) (vv (2 + 4 - 1)) <= pi /\ azim (vec 0) (vv 3) (vv (SUC 3)) (vv (3 + 4 -1)) <= pi` (C SUBGOAL_THEN ASSUME_TAC);
2117     BY(REPEAT CONJ_TAC THEN MATCH_MP_TAC (REWRITE_RULE[LET_THM] convex_local_fan_azim_le_pi) THEN ASM_REWRITE_TAC[arith `3 <= 4`]);
2118   REWRITE_TAC[Appendix.tau3];
2119   TYPIFY `vv 6 = vv 2 /\ vv 5 = vv 1 /\ vv 4 = vv 0` (C SUBGOAL_THEN ASSUME_TAC);
2120     BY(REPEAT (CONJ_TAC) THEN GMATCH_SIMP_TAC periodic_vv_inj THEN TYPIFY `4` EXISTS_TAC THEN ASM_REWRITE_TAC[MOD_4_EXPLICIT;arith `~(4 = 0)`]);
2121   TYPIFY `azim (vec 0) ((vv 0)) ((vv (SUC 0))) ((vv (0 + 4 - 1))) = azim (vec 0) ((vv 0)) ((vv (SUC 0))) ((vv 2)) + azim(vec 0) ((vv 0)) ((vv 2)) ((vv (0 + 4 - 1))) /\ (azim (vec 0) ((vv 2)) ((vv (SUC 2))) ((vv (2 + 4 - 1))) = azim (vec 0) ((vv 2)) ((vv (SUC 2))) ((vv 0)) + azim(vec 0) ((vv 2)) ((vv 0)) ((vv (2 + 4 -1))))` (C SUBGOAL_THEN ASSUME_TAC);
2122     CONJ_TAC THEN MATCH_MP_TAC (REWRITE_RULE[LET_THM] vv_split_azim) THEN ASM_REWRITE_TAC[arith `3 <= 4 /\ ~( 0 = 2)`;MOD_4_EXPLICIT;arith `SUC  0 = 1 /\ 0 + 4 - 1 = 3`;arith `SUC 2 = 3 /\ 2 + 4 - 1 = 5`];
2123     BY(ASM_MESON_TAC[DIST_SYM]);
2124   RULE_ASSUM_TAC (REWRITE_RULE[arith `SUC 0 = 1 /\ SUC 1 = 2 /\ SUC 2 = 3 /\ SUC 3 = 4 /\ 0+4-1 = 3 /\ 1+4-1=4 /\ 2+4-1=5 /\ 3+4-1=6`]);
2125   FIRST_X_ASSUM_ST `6` (RULE_ASSUM_TAC o (unlist REWRITE_RULE));
2126   ASM_REWRITE_TAC[];
2127   TYPIFY `azim (vec 0) (vv 0) (vv 1) (vv 2) <= pi /\ azim (vec 0) (vv 0) (vv 2) (vv 3) <= pi /\ azim (vec 0) (vv 2 ) (vv 3) (vv 0) <= pi /\ azim (vec 0) (vv 2) (vv 0) (vv 1) <= pi` (C SUBGOAL_THEN ASSUME_TAC);
2128     BY(ASM_MESON_TAC[Counting_spheres.AZIM_NN;arith `&0 <= x /\ &0 <= y /\ x + y <= pi ==> (x <= pi /\ y <= pi)`]);
2129   COMMENT "azim to dih";
2130   TYPIFY `~collinear {vec 0,vv 0,vv 1} /\ ~collinear {vec 0,vv 0, vv 2} /\ ~collinear {vec 0,vv 0,vv 3} /\ ~collinear {vec 0,vv 1,vv 2} /\ ~collinear {vec 0,vv 2, vv 3}` (C SUBGOAL_THEN ASSUME_TAC);
2131     REPEAT (GMATCH_SIMP_TAC NONPARALLEL_BALL_ANNULUS40_ALT);
2132     RULE_ASSUM_TAC (REWRITE_RULE[IMAGE_SUBSET_IN;IN_UNIV]);
2133     ASM_REWRITE_TAC[];
2134     BY(REPEAT CONJ_TAC THEN (FIRST_X_ASSUM_ST `dist` MATCH_MP_TAC) THEN GMATCH_SIMP_TAC periodic_vv_inj THEN (TYPIFY `4` EXISTS_TAC) THEN ASM_REWRITE_TAC[arith `~(4 = 0)`;MOD_4_EXPLICIT;arith `~(2 = 3) /\ ~(1 = 2) /\ ~(0=3) /\ ~(0=1) /\ ~(0=2)`]);
2135   COMMENT "azim to dih";
2136   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 3) = dihV (vec 0) (vv 0) (vv 2) (vv 3) /\ 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 0) = dihV (vec 0) (vv 2) (vv 3) (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 0) (vv 2) = dihV (vec 0) (vv 3) (vv 0) (vv 2)` ENOUGH_TO_SHOW_TAC;
2137     DISCH_THEN (unlist REWRITE_TAC);
2138     REWRITE_TAC[Appendix.rho_rho_fun];
2139     BY(REAL_ARITH_TAC);
2140   BY(REPEAT CONJ_TAC THEN MATCH_MP_TAC (REWRITE_RULE[TAUT `(a ==> b ==> c) <=> (a /\ b ==> c)`] Local_lemmas.AZIM_LE_PI_EQ_DIHV) THEN ASM_REWRITE_TAC[] THEN ONCE_REWRITE_TAC[SET_RULE `{a,b,c}={a,c,b}`] THEN ASM_REWRITE_TAC[])
2141   ]);;
2142   (* }}} *)
2143
2144 let vv_quad_split123 = prove_by_refinement(
2145   `!vv. 
2146     (let V = IMAGE vv (:num) in
2147    let E = IMAGE (\i. {vv i, vv (SUC i)}) (:num) in
2148    let f = IMAGE (\i. vv i,vv (SUC i)) (:num) in
2149     (periodic vv 4 /\
2150    V SUBSET ball_annulus /\
2151    dist(vv 0, vv 1) < &4 /\
2152    dist(vv 0, vv 3) < &4 /\
2153    dist(vv 1,vv 2) < &4 /\
2154    dist(vv 1,vv 3) < &4 /\
2155    dist(vv 2,vv 3) < &4 /\
2156    (!i j. ~(vv i = vv j) ==> &2 <= dist(vv i,vv j) ) /\
2157    convex_local_fan (V,E,f) /\
2158         (!i j. i < 4 /\ j < 4 /\ vv i = vv j ==> (i = j))
2159      ==> (rho_fun (norm (vv 0)) * azim (vec 0) (vv 0) (vv 1) (vv 3) +
2160           rho_fun (norm (vv 1)) * azim (vec 0) (vv 1) (vv 2) (vv 0) +
2161           rho_fun (norm (vv 2)) * azim (vec 0) (vv 2) (vv 3) (vv 1) +
2162           rho_fun (norm (vv 3)) * azim (vec 0) (vv 3) (vv 0) (vv 2)) -
2163          (pi + sol0) * &2 =
2164          tau3 (vv 1) (vv 2) (vv 3) + tau3 (vv 3) (vv 0) (vv 1)))`,
2165   (* {{{ proof *)
2166   [
2167   REWRITE_TAC[LET_THM];
2168   REPEAT WEAKER_STRIP_TAC;
2169   TYPIFY ` azim (vec 0) (vv 0) (vv (SUC 0)) (vv (0 + 4 - 1)) <= pi /\ azim (vec 0) (vv 1) (vv (SUC 1)) (vv (1 + 4 - 1)) <= pi /\ azim (vec 0) (vv 2) (vv (SUC 2)) (vv (2 + 4 - 1)) <= pi /\ azim (vec 0) (vv 3) (vv (SUC 3)) (vv (3 + 4 -1)) <= pi` (C SUBGOAL_THEN ASSUME_TAC);
2170     BY(REPEAT CONJ_TAC THEN MATCH_MP_TAC (REWRITE_RULE[LET_THM] convex_local_fan_azim_le_pi) THEN ASM_REWRITE_TAC[arith `3 <= 4`]);
2171   REWRITE_TAC[Appendix.tau3];
2172   TYPIFY `vv 6 = vv 2 /\ vv 5 = vv 1 /\ vv 4 = vv 0` (C SUBGOAL_THEN ASSUME_TAC);
2173     BY(REPEAT (CONJ_TAC) THEN GMATCH_SIMP_TAC periodic_vv_inj THEN TYPIFY `4` EXISTS_TAC THEN ASM_REWRITE_TAC[MOD_4_EXPLICIT;arith `~(4 = 0)`]);
2174   TYPIFY `azim (vec 0) ((vv 1)) ((vv (SUC 1))) ((vv (1 + 4 - 1))) = azim (vec 0) ((vv 1)) ((vv (SUC 1))) ((vv 3)) + azim(vec 0) ((vv 1)) ((vv 3)) ((vv (1 + 4 - 1))) /\ (azim (vec 0) ((vv 3)) ((vv (SUC 3))) ((vv (3 + 4 - 1))) = azim (vec 0) ((vv 3)) ((vv (SUC 3))) ((vv 1)) + azim(vec 0) ((vv 3)) ((vv 1)) ((vv (3 + 4 -1))))` (C SUBGOAL_THEN ASSUME_TAC);
2175     CONJ_TAC THEN MATCH_MP_TAC (REWRITE_RULE[LET_THM] vv_split_azim) THEN ASM_REWRITE_TAC[arith `3 <= 4 /\ ~( 1 = 3)`;MOD_4_EXPLICIT;arith `SUC  1 = 2 /\ 1 + 4 - 1 = 4`;arith `SUC 3 = 4 /\ 3 + 4 - 1 = 6`];
2176       BY(ASM_MESON_TAC[DIST_SYM]);
2177     BY(ASM_MESON_TAC[DIST_SYM]);
2178   RULE_ASSUM_TAC (REWRITE_RULE[arith `SUC 0 = 1 /\ SUC 1 = 2 /\ SUC 2 = 3 /\ SUC 3 = 4 /\ 0+4-1 = 3 /\ 1+4-1=4 /\ 2+4-1=5 /\ 3+4-1=6`]);
2179   FIRST_X_ASSUM_ST `vv 6 = vv 2` (RULE_ASSUM_TAC o (unlist REWRITE_RULE));
2180   ASM_REWRITE_TAC[];
2181   TYPIFY `azim (vec 0) (vv 1) (vv 2) (vv 3) <= pi /\ azim (vec 0) (vv 1) (vv 3) (vv 0) <= pi /\ azim (vec 0) (vv 3 ) (vv 0) (vv 1) <= pi /\ azim (vec 0) (vv 3) (vv 1) (vv 2) <= pi` (C SUBGOAL_THEN ASSUME_TAC);
2182     BY(ASM_MESON_TAC[Counting_spheres.AZIM_NN;arith `&0 <= x /\ &0 <= y /\ x + y <= pi ==> (x <= pi /\ y <= pi)`]);
2183   COMMENT "collinearity";
2184   TYPIFY `~collinear {vec 0,vv 0,vv 1} /\ ~collinear {vec 0,vv 0, vv 3} /\ ~collinear {vec 0,vv 1,vv 3} /\ ~collinear {vec 0,vv 1,vv 2} /\ ~collinear {vec 0,vv 2, vv 3}` (C SUBGOAL_THEN ASSUME_TAC);
2185     REPEAT (GMATCH_SIMP_TAC NONPARALLEL_BALL_ANNULUS40_ALT);
2186     RULE_ASSUM_TAC (REWRITE_RULE[IMAGE_SUBSET_IN;IN_UNIV]);
2187     ASM_REWRITE_TAC[];
2188     BY(REPEAT CONJ_TAC THEN (FIRST_X_ASSUM_ST `dist` MATCH_MP_TAC) THEN GMATCH_SIMP_TAC periodic_vv_inj THEN (TYPIFY `4` EXISTS_TAC) THEN ASM_REWRITE_TAC[arith `~(4 = 0)`;MOD_4_EXPLICIT;arith `~(2 = 3) /\ ~(1 = 2) /\ ~(0=3) /\ ~(0=1) /\ ~(1=3)`]);
2189   COMMENT "azim to dih";
2190   TYPIFY `azim (vec 0) (vv 0) (vv 1) (vv 3) = dihV (vec 0) (vv 0) (vv 1) (vv 3) /\ azim (vec 0) (vv 1) (vv 2) (vv 3) = dihV (vec 0) (vv 1) (vv 2) (vv 3) /\ azim (vec 0) (vv 1) (vv 3) (vv 0) = dihV (vec 0) (vv 1) (vv 3) (vv 0) /\ azim (vec 0) (vv 2) (vv 3) (vv 1) = dihV (vec 0) (vv 2) (vv 3) (vv 1) /\ azim (vec 0) (vv 3) (vv 0) (vv 1) = dihV (vec 0) (vv 3) (vv 0) (vv 1) /\ azim (vec 0) (vv 3) (vv 1) (vv 2) = dihV (vec 0) (vv 3) (vv 1) (vv 2)` ENOUGH_TO_SHOW_TAC;
2191     DISCH_THEN (unlist REWRITE_TAC);
2192     REWRITE_TAC[Appendix.rho_rho_fun];
2193     BY(REAL_ARITH_TAC);
2194   BY(REPEAT CONJ_TAC THEN MATCH_MP_TAC (REWRITE_RULE[TAUT `(a ==> b ==> c) <=> (a /\ b ==> c)`] Local_lemmas.AZIM_LE_PI_EQ_DIHV) THEN ASM_REWRITE_TAC[] THEN ONCE_REWRITE_TAC[SET_RULE `{a,b,c}={a,c,b}`] THEN ASM_REWRITE_TAC[])
2195   ]);;
2196   (* }}} *)
2197
2198 let vv_quad_split_short = prove_by_refinement(
2199   `!vv. (let V = IMAGE vv (:num) in
2200           let E = IMAGE (\i. {vv i, vv (SUC i)}) (:num) in
2201           let f = IMAGE (\i. vv i,vv (SUC i)) (:num) in
2202           (periodic vv 4 /\
2203           V SUBSET ball_annulus /\
2204           dist (vv 0,vv 1) < &4 /\
2205           dist (vv 0,vv 3) < &4 /\
2206           dist (vv 0,vv 2) < &4 /\
2207           dist (vv 1,vv 2) < &4 /\
2208           dist (vv 1,vv 3) < &4 /\
2209           dist (vv 2,vv 3) < &4 /\
2210           (!i j. ~(vv i = vv j) ==> &2 <= dist (vv i,vv j)) /\
2211           convex_local_fan (V,E,f) /\
2212           (!i j. i < 4 /\ j < 4 /\ vv i = vv j ==> i = j)
2213           ==> (?i. i < 2 /\ (dist(vv i,vv (i+2)) <= dist(vv (i+1),vv(i+3))) /\
2214                (rho_fun (norm (vv 0)) * azim (vec 0) (vv 0) (vv 1) (vv 3) +
2215                rho_fun (norm (vv 1)) * azim (vec 0) (vv 1) (vv 2) (vv 0) +
2216                rho_fun (norm (vv 2)) * azim (vec 0) (vv 2) (vv 3) (vv 1) +
2217                rho_fun (norm (vv 3)) * azim (vec 0) (vv 3) (vv 0) (vv 2)) -
2218               (pi + sol0) * &2 =
2219               tau3 (vv i) (vv (i+1)) (vv (i+2)) + tau3 (vv (i+2)) (vv (i+3)) (vv i))))`,
2220   (* {{{ proof *)
2221   [
2222   REWRITE_TAC[LET_THM];
2223   REPEAT WEAKER_STRIP_TAC;
2224   TYPIFY `dist(vv 0,vv 2) <= dist(vv 1,vv 3)` ASM_CASES_TAC;
2225     TYPIFY `0` EXISTS_TAC;
2226     ASM_REWRITE_TAC[arith `0+x = x /\ 0 < 2`];
2227     MATCH_MP_TAC (REWRITE_RULE[LET_THM] vv_quad_split012);
2228     BY(ASM_REWRITE_TAC[]);
2229   TYPIFY `1` EXISTS_TAC;
2230   REWRITE_TAC[arith `1+2 = 3 /\ 1+1 = 2 /\ 1 + 3 = 4 /\ 1 < 2`];
2231   TYPIFY `vv 4 = vv 0` (C SUBGOAL_THEN SUBST1_TAC);
2232     BY( GMATCH_SIMP_TAC periodic_vv_inj THEN TYPIFY `4` EXISTS_TAC THEN ASM_REWRITE_TAC[MOD_4_EXPLICIT;arith `~(4 = 0)`]);
2233   CONJ_TAC;
2234     BY(FIRST_X_ASSUM MP_TAC THEN MESON_TAC[DIST_SYM;arith `~(x <= y) ==> y <= x`]);
2235   MATCH_MP_TAC (REWRITE_RULE[LET_THM] vv_quad_split123);
2236   BY(ASM_REWRITE_TAC[])
2237   ]);;
2238   (* }}} *)
2239
2240 let SUC_EXPLICIT = prove_by_refinement(
2241   `SUC 0 = 1 /\ SUC 1 = 2 /\ SUC 2 = 3 /\ SUC 3 = 4 /\ SUC 4 = 5 /\ SUC 5 = 6 /\ SUC 6 = 7 /\ SUC 7 = 8 /\ SUC 8 = 9`,
2242   (* {{{ proof *)
2243   [
2244     ARITH_TAC
2245   ]);;
2246   (* }}} *)
2247
2248 let cs_adj4_EXPLICIT = prove_by_refinement(
2249   `!a b. 
2250     cs_adj 4 a b 0 0 = &0 /\
2251     cs_adj 4 a b 0 1 = a /\
2252     cs_adj 4 a b 0 2 = b /\
2253     cs_adj 4 a b 0 3 = a /\
2254     cs_adj 4 a b 1 0 = a /\
2255     cs_adj 4 a b 1 1 = &0 /\
2256     cs_adj 4 a b 1 2 = a /\
2257     cs_adj 4 a b 1 3 = b /\
2258     cs_adj 4 a b 2 0 = b /\
2259     cs_adj 4 a b 2 1 = a /\
2260     cs_adj 4 a b 2 2 = &0 /\
2261     cs_adj 4 a b 2 3 = a /\
2262     cs_adj 4 a b 3 0 = a /\
2263     cs_adj 4 a b 3 1 = b /\
2264     cs_adj 4 a b 3 2 = a /\
2265     cs_adj 4 a b 3 3 = &0 
2266 `,
2267   (* {{{ proof *)
2268   [
2269   REWRITE_TAC[Appendix.cs_adj;MOD_4_EXPLICIT;SUC_EXPLICIT];
2270   BY(ARITH_TAC)
2271   ]);;
2272   (* }}} *)
2273
2274 let delta_4680581274 = prove_by_refinement(
2275   `!y1 y4.  cstab <= y1 /\ &4 <= y4 ==>
2276     delta_y y1 (&2) (&2) y4 (&2) cstab < &0`,
2277   (* {{{ proof *)
2278   [
2279   REWRITE_TAC[Sphere.delta_y;Sphere.delta_x;arith `&2 * &2 = &4`];
2280   REPEAT WEAKER_STRIP_TAC;
2281   TYPED_ABBREV_TAC  `y = y1 * y1` ;
2282   TYPED_ABBREV_TAC  `z = y4 * y4` ;
2283   TYPED_ABBREV_TAC  `c = cstab * cstab` ;
2284   TYPIFY `y * z * (--y + &4 + &4 - z + &4 + c) + &4 * &4 * (y - &4 + &4 + z - &4 + c) + &4 * c * (y + &4 - &4 + z + &4 - c) - &4 * &4 * z - y * &4 * &4 - y * &4 * c - z * &4 * c = (-- &64 + &32 * c  - &4 * c pow 2) - y * z * (-- &12 - c  + y + z)` (C SUBGOAL_THEN SUBST1_TAC);
2285     BY(REAL_ARITH_TAC);
2286   REWRITE_TAC[arith `x - y < &0 <=> x < y`];
2287   MATCH_MP_TAC REAL_LT_TRANS;
2288   TYPIFY ` &0` EXISTS_TAC;
2289   CONJ_TAC;
2290     EXPAND_TAC "c";
2291     REWRITE_TAC[Appendix.cstab];
2292     BY(REAL_ARITH_TAC);
2293   EXPAND_TAC "y";
2294   EXPAND_TAC "z";
2295   GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
2296   REPEAT (GMATCH_SIMP_TAC REAL_LT_MUL_EQ);
2297   TYPIFY `&0 < y1 /\ &0 < y4` (C SUBGOAL_THEN (unlist REWRITE_TAC));
2298     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Appendix.cstab] THEN REAL_ARITH_TAC);
2299   TYPIFY `&9 <= y1 * y1` (C SUBGOAL_THEN ASSUME_TAC);
2300     REWRITE_TAC[arith `&9 = &3 * &3`];
2301     GMATCH_SIMP_TAC Misc_defs_and_lemmas.ABS_SQUARE_LE;
2302     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Appendix.cstab] THEN REAL_ARITH_TAC);
2303   TYPIFY `&16 <= y4 * y4` (C SUBGOAL_THEN ASSUME_TAC);
2304     REWRITE_TAC[arith `&16 = &4 * &4`];
2305     GMATCH_SIMP_TAC Misc_defs_and_lemmas.ABS_SQUARE_LE;
2306     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Appendix.cstab] THEN REAL_ARITH_TAC);
2307   EXPAND_TAC "c";
2308   REWRITE_TAC[Appendix.cstab];
2309   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC)
2310   ]);;
2311   (* }}} *)
2312
2313 let delta_7697147739 = prove_by_refinement(
2314   `!y1 y4.  cstab <= y1 /\ &4 <= y4 ==>
2315     delta_y y1 (&2) (&2) y4 (&2) sqrt8 < &0`,
2316   (* {{{ proof *)
2317   [
2318   REWRITE_TAC[Sphere.delta_y;Sphere.delta_x;arith `&2 * &2 = &4`;Nonlinear_lemma.sqrt8_2;arith `#8.0 = &8`];
2319   REPEAT WEAKER_STRIP_TAC;
2320   TYPED_ABBREV_TAC  `y = y1 * y1` ;
2321   TYPED_ABBREV_TAC  `z = y4 * y4` ;
2322   TYPIFY `y * z * (--y + &4 + &4 - z + &4 + &8) + &4 * &4 * (y - &4 + &4 + z - &4 + &8) + &4 * &8 * (y + &4 - &4 + z + &4 - &8) - &4 * &4 * z - y * &4 * &4 - y * &4 * &8 - z * &4 * &8 = -- &64 - y * z * (-- &20 + y + z)`  (C SUBGOAL_THEN SUBST1_TAC);
2323     BY(REAL_ARITH_TAC);
2324   REWRITE_TAC[arith `x - y < &0 <=> x < y`];
2325   MATCH_MP_TAC REAL_LT_TRANS;
2326   TYPIFY ` &0` EXISTS_TAC;
2327   CONJ_TAC;
2328     BY(REAL_ARITH_TAC);
2329   EXPAND_TAC "y";
2330   EXPAND_TAC "z";
2331   GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
2332   REPEAT (GMATCH_SIMP_TAC REAL_LT_MUL_EQ);
2333   TYPIFY `&0 < y1 /\ &0 < y4` (C SUBGOAL_THEN (unlist REWRITE_TAC));
2334     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Appendix.cstab] THEN REAL_ARITH_TAC);
2335   TYPIFY `&9 <= y1 * y1` (C SUBGOAL_THEN ASSUME_TAC);
2336     REWRITE_TAC[arith `&9 = &3 * &3`];
2337     GMATCH_SIMP_TAC Misc_defs_and_lemmas.ABS_SQUARE_LE;
2338     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Appendix.cstab] THEN REAL_ARITH_TAC);
2339   TYPIFY `&16 <= y4 * y4` (C SUBGOAL_THEN ASSUME_TAC);
2340     REWRITE_TAC[arith `&16 = &4 * &4`];
2341     GMATCH_SIMP_TAC Misc_defs_and_lemmas.ABS_SQUARE_LE;
2342     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Appendix.cstab] THEN REAL_ARITH_TAC);
2343   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC)
2344   ]);;
2345   (* }}} *)
2346
2347 let tau3_sym = prove_by_refinement(
2348   `!v0 v1 v2. tau3 v0 v1 v2 = tau3 v0 v2 v1 /\ tau3 v0 v1 v2 = tau3 v1 v0 v2`,
2349   (* {{{ proof *)
2350   [
2351   REWRITE_TAC[Appendix.tau3];
2352   REPEAT WEAKER_STRIP_TAC;
2353   REWRITE_TAC[DIHV_SYM];
2354   BY(REAL_ARITH_TAC)
2355   ]);;
2356   (* }}} *)
2357
2358 let INSERT_SUBSET = prove_by_refinement(
2359   `!(a:A) A S. a INSERT A SUBSET S <=> (a IN S) /\ A SUBSET S`,
2360   (* {{{ proof *)
2361   [
2362   BY(SET_TAC[])
2363   ]);;
2364   (* }}} *)
2365
2366 (* INEQUALITY MATERIAL STARTS HERE *)
2367
2368 let OWZLKVY0 = prove_by_refinement(
2369   `main_nonlinear_terminal_v11 ==>
2370     (!y1 y2 y3 y4 y5 y6.
2371        &2 <= y1 /\ y1 <= &2 * h0 /\
2372     &2 <= y1  /\ y2 <= &2 * h0 /\
2373     &2 <= y2 /\ y2 <= &2 * h0 /\
2374     &2 <= y3 /\ y3 <= &2 * h0 /\
2375     cstab <= y4 /\ y4 <= #3.915 /\
2376     y5 = &2 /\
2377     y6 = &2 /\ &200 <= delta_y y1 y2 y3 y4 y5 y6 ==>
2378         &0 <= taum y1 y2 y3 y4 y5 y6)`,
2379   (* {{{ proof *)
2380   [
2381   REWRITE_TAC[Appendix.cstab];
2382   REPEAT WEAKER_STRIP_TAC;
2383   INTRO_TAC ((* Appendix. *) get_main_nonlinear "6762190381") [];
2384   DISCH_THEN (C INTRO_TAC [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`]);
2385   REWRITE_TAC[Sphere.ineq];
2386   REPEAT (FIRST_X_ASSUM MP_TAC);
2387   BY(REAL_ARITH_TAC)
2388   ]);;
2389   (* }}} *)
2390
2391 (* was EAR_ANGLE_ACUTE *)
2392
2393 let EAR_DELTA_X4 = prove_by_refinement(
2394   `main_nonlinear_terminal_v11 ==> (!y1 y2 y3 y4 y5 y6.  &2 <= y1  /\ y1 <= &2 * h0 /\
2395     &2 <= y2 /\ y2 <= &2 * h0 /\
2396     &2 <= y3 /\ y3 <= &2 * h0 /\
2397     cstab <= y4 /\ y4 <= #3.915 /\
2398     y5 = &2 /\
2399     y6 = &2 /\
2400         delta_y y1 y2 y3 y4 y5 y6 <= &200 ==>
2401         (delta_x4 (y1 * y1) (y2 * y2) (y3 * y3) (y4 * y4) (y5 * y5) (y6 * y6) <
2402       &0 /\
2403   &0 < delta_x4 (y2 * y2) (y3 * y3) (y1 * y1) (y5 * y5) (y6 * y6) (y4 * y4)
2404        /\
2405  &0 < delta_x4 (y3 * y3) (y1 * y1) (y2 * y2) (y6 * y6) (y4 * y4) (y5 * y5)
2406       ) )`,
2407   (* {{{ proof *)
2408   [
2409   REPEAT WEAKER_STRIP_TAC;
2410   CONJ_TAC;
2411     INTRO_TAC ((* Appendix. *) get_main_nonlinear "8346775862") [];
2412     DISCH_THEN (C INTRO_TAC [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`]);
2413     REWRITE_TAC[Sphere.ineq;Sphere.delta_y;Sphere.y_of_x];
2414     REWRITE_TAC[TAUT `a ==> b ==> c <=> a /\ b ==> c`];
2415     ANTS_TAC;
2416       BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Appendix.cstab] THEN REAL_ARITH_TAC);
2417     BY(FIRST_X_ASSUM MP_TAC THEN REWRITE_TAC[Sphere.delta_y] THEN REAL_ARITH_TAC);
2418   CONJ_TAC;
2419     TYPIFY `delta_x4 (y2 * y2) (y3 * y3) (y1 * y1) (y5 * y5) (y6 * y6) (y4 * y4) = delta_x4 (y2 * y2) (y1 * y1) (y3 * y3) (y5 * y5) (y4 * y4) (y6 * y6)` (C SUBGOAL_THEN SUBST1_TAC);
2420       REWRITE_TAC[Sphere.delta_x4];
2421       BY(REAL_ARITH_TAC);
2422     INTRO_TAC ((* Appendix. *) get_main_nonlinear "8631418063") [];
2423     DISCH_THEN (C INTRO_TAC [`y2`;`y1`;`y3`;`y5`;`y4`;`y6`]);
2424     REWRITE_TAC[Sphere.ineq;Sphere.delta_y;Sphere.y_of_x];
2425     REWRITE_TAC[arith `x > &0 <=> &0 < x`];
2426     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Appendix.cstab] THEN REAL_ARITH_TAC);
2427   INTRO_TAC ((* Appendix. *) get_main_nonlinear "8631418063") [];
2428   DISCH_THEN (C INTRO_TAC [`y3`;`y1`;`y2`;`y6`;`y4`;`y5`]);
2429   REWRITE_TAC[Sphere.ineq;Sphere.delta_y;Sphere.y_of_x];
2430   REWRITE_TAC[arith `x > &0 <=> &0 < x`];
2431   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Appendix.cstab] THEN REAL_ARITH_TAC)
2432   ]);;
2433   (* }}} *)
2434
2435 let EAR_DIH1_DELTA_0 = prove_by_refinement(
2436   `main_nonlinear_terminal_v11 ==> (!y1 y2 y3 y4 y5 y6.  &2 <= y1  /\ y1 <= &2 * h0 /\
2437     &2 <= y2 /\ y2 <= &2 * h0 /\
2438     &2 <= y3 /\ y3 <= &2 * h0 /\
2439     cstab <= y4 /\ y4 <= #3.915 /\
2440     y5 = &2 /\
2441     y6 = &2 /\
2442         delta_y y1 y2 y3 y4 y5 y6 = &0 ==>
2443         dih_y y1 y2 y3 y4 y5 y6 = pi)`,
2444   (* {{{ proof *)
2445   [
2446   REPEAT WEAKER_STRIP_TAC;
2447   INTRO_TAC (UNDISCH EAR_DELTA_X4) [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`];
2448   ANTS_TAC;
2449     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Appendix.cstab] THEN REAL_ARITH_TAC);
2450   DISCH_TAC;
2451   FIRST_X_ASSUM_ST `delta_y` MP_TAC;
2452   REWRITE_TAC[Sphere.dih_y;Sphere.dih_x;LET_DEF;LET_END_DEF;Sphere.delta_y];
2453   DISCH_THEN (unlist REWRITE_TAC);
2454   REWRITE_TAC[arith `x * &0 = &0`;SQRT_0];
2455   TYPED_ABBREV_TAC `d = delta_x4 (y1 * y1) (y2 * y2) (y3 * y3) (y4 * y4) (y5 * y5) (y6 * y6)`;
2456   INTRO_TAC Merge_ineq.atn2_0 [`-- d`];
2457   REPLICATE_TAC 2 (FIRST_X_ASSUM MP_TAC);
2458   BY(REAL_ARITH_TAC)
2459   ]);;
2460   (* }}} *)
2461
2462 let OWZLKVY3 = prove_by_refinement(
2463   `main_nonlinear_terminal_v11 ==> ( !y1 y2 y3 y4 y5 y6.
2464     &2 <= y1  /\ y1 <= &2 * h0 /\
2465     &2 <= y2 /\ y2 <= &2 * h0 /\
2466     &2 <= y3 /\ y3 <= &2 * h0 /\
2467     cstab <= y4 /\ y4 <= #3.915 /\
2468     y5 = &2 /\
2469     y6 = &2 /\
2470         &0 <= delta_y y1 y2 y3 y4 y5 y6 /\
2471         dih_y y1 y2 y3 y4 y5 y6 = pi ==>
2472         sol0 * (y1 - &2 * h0) / (&2 * h0 - &2) <= taum y1 y2 y3 y4 y5 y6)`,
2473   (* {{{ proof *)
2474   [
2475   REPEAT WEAKER_STRIP_TAC;
2476   ASM_CASES_TAC `&200 <= delta_y y1 y2 y3 y4 y5 y6`;
2477     INTRO_TAC OWZLKVY0 [];
2478     ASM_REWRITE_TAC[];
2479     DISCH_THEN (C INTRO_TAC [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`]);
2480     ASM_REWRITE_TAC[];
2481     MATCH_MP_TAC (arith `&0 <= s * (-- u) /v ==> (&0 <= t ==>  s * u / v <= t)`);
2482     GMATCH_SIMP_TAC REAL_LE_MUL;
2483     CONJ_TAC;
2484       INTRO_TAC Flyspeck_constants.bounds [];
2485       BY(REAL_ARITH_TAC);
2486     GMATCH_SIMP_TAC REAL_LE_RDIV_EQ;
2487     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
2488   RULE_ASSUM_TAC (REWRITE_RULE[arith `~(x <= y) <=> y < x`]);
2489   REWRITE_TAC[Nonlinear_lemma.taum_123;Sphere.rhazim2;Sphere.rhazim3;Sphere.node2_y;Sphere.node3_y];
2490   REWRITE_TAC[Sphere.rhazim];
2491   TYPIFY `delta_y y1 y2 y3 y4 y5 y6 = &0` (C SUBGOAL_THEN ASSUME_TAC);
2492     PROOF_BY_CONTR_TAC;
2493     INTRO_TAC Oxlzlez.DIH_X_LT_PI [`y1 * y1`;`y2*y2`;`y3*y3`;`y4*y4`;`y5*y5`;`y6*y6`];
2494     ANTS_TAC;
2495       GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
2496       REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.delta_y];
2497       MP_TAC (arith `&2 <= y1 ==> &0 < y1`);
2498       BY(REAL_ARITH_TAC);
2499     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.dih_y;LET_DEF;LET_END_DEF] THEN REAL_ARITH_TAC);
2500   COMMENT "...";
2501   INTRO_TAC (UNDISCH EAR_DELTA_X4) [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`];
2502   ANTS_TAC;
2503     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
2504   REPEAT WEAKER_STRIP_TAC;
2505   TYPIFY `dih_y y2 y3 y1 y5 y6 y4 = &0` (C SUBGOAL_THEN SUBST1_TAC);
2506     REWRITE_TAC[Sphere.dih_y;Sphere.dih_x;LET_DEF;LET_END_DEF];
2507     REPEAT (FIRST_X_ASSUM_ST `x = &2` kill);
2508     RULE_ASSUM_TAC (REWRITE_RULE[Sphere.delta_y]);
2509     TYPIFY `delta_x (y2 * y2) (y3 * y3) (y1 * y1) (y5 * y5) (y6 * y6) (y4 * y4) = &0` (C SUBGOAL_THEN SUBST1_TAC);
2510       FIRST_X_ASSUM_ST `x = &0` MP_TAC;
2511       BY(MESON_TAC[Merge_ineq.delta_x_sym]);
2512     REWRITE_TAC[arith `x * &0 = &0`;SQRT_0];
2513     TYPED_ABBREV_TAC `d = delta_x4 (y2 * y2) (y3 * y3) (y1 * y1) (y5 * y5) (y6 * y6) (y4 * y4)`;
2514     INTRO_TAC Merge_ineq.atn2_0 [`-- d`];
2515     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
2516   COMMENT "..";
2517   TYPIFY `dih_y y3 y1 y2 y6 y4 y5 = &0` (C SUBGOAL_THEN SUBST1_TAC);
2518     REWRITE_TAC[Sphere.dih_y;Sphere.dih_x;LET_DEF;LET_END_DEF];
2519     REPEAT (FIRST_X_ASSUM_ST `x = &2` kill);
2520     RULE_ASSUM_TAC (REWRITE_RULE[Sphere.delta_y]);
2521     TYPIFY `delta_x (y3 * y3) (y1 * y1) (y2 * y2) (y6 * y6) (y4 * y4) (y5 * y5) = &0` (C SUBGOAL_THEN SUBST1_TAC);
2522       FIRST_X_ASSUM_ST `x = &0` MP_TAC;
2523       BY(MESON_TAC[Merge_ineq.delta_x_sym]);
2524     REWRITE_TAC[arith `x * &0 = &0`;SQRT_0];
2525     TYPED_ABBREV_TAC `d = delta_x4 (y3 * y3) (y1 * y1) (y2 * y2) (y6 * y6) (y4 * y4) (y5 * y5)`;
2526     INTRO_TAC Merge_ineq.atn2_0 [`-- d`];
2527     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
2528   COMMENT "A";
2529   TYPIFY `dih_y y1 y2 y3 y4 y5 y6 = pi` (C SUBGOAL_THEN SUBST1_TAC);
2530     REWRITE_TAC[Sphere.dih_y;Sphere.dih_x;LET_DEF;LET_END_DEF];
2531     REPEAT (FIRST_X_ASSUM_ST `x = &2` kill);
2532     RULE_ASSUM_TAC (REWRITE_RULE[Sphere.delta_y]);
2533     TYPIFY `delta_x (y1 * y1) (y2 * y2) (y3 * y3) (y4 * y4) (y5 * y5) (y6 * y6) = &0` (C SUBGOAL_THEN SUBST1_TAC);
2534       FIRST_X_ASSUM_ST `x = &0` MP_TAC;
2535       BY(MESON_TAC[Merge_ineq.delta_x_sym]);
2536     REWRITE_TAC[arith `x * &0 = &0`;SQRT_0];
2537     TYPED_ABBREV_TAC `d = delta_x4 (y1 * y1) (y2 * y2) (y3 * y3) (y4 * y4) (y5 * y5) (y6 * y6)`;
2538     INTRO_TAC Merge_ineq.atn2_0 [`-- d`];
2539     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
2540   REWRITE_TAC[arith `x * &0 = &0 /\ x + &0 = x`];
2541   REWRITE_TAC[Nonlinear_lemma.rho_alt;Nonlinear_lemma.sol0_const1];
2542   MATCH_MP_TAC (arith `x = y ==> x <= y`);
2543   Calc_derivative.CALC_ID_TAC;
2544   REWRITE_TAC[Sphere.h0];
2545   BY(REAL_ARITH_TAC)
2546   ]);;
2547   (* }}} *)
2548
2549 let OWZLKVY1 = prove_by_refinement(
2550   `main_nonlinear_terminal_v11 ==> ( !y1 y2 y3 y4 y5 y6.
2551     &2 <= y1  /\ y1 <= &2 * h0 /\
2552     &2 <= y2 /\ y2 <= &2 * h0 /\
2553     &2 <= y3 /\ y3 <= &2 * h0 /\
2554     cstab <= y4 /\ y4 <= #3.915 /\
2555     y5 = &2 /\
2556     y6 = &2 /\
2557         &0 <= delta_y y1 y2 y3 y4 y5 y6 ==>
2558         -- sol0 <= taum y1 y2 y3 y4 y5 y6)`,
2559   (* {{{ proof *)
2560   [
2561   REPEAT WEAKER_STRIP_TAC;
2562   ASM_CASES_TAC `&200 <= delta_y y1 y2 y3 y4 y5 y6`;
2563     INTRO_TAC OWZLKVY0 [];
2564     ASM_REWRITE_TAC[];
2565     DISCH_THEN (C INTRO_TAC [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`]);
2566     ASM_REWRITE_TAC[];
2567     MATCH_MP_TAC (arith `&0 <= s ==> (&0 <= t ==> -- s <= t)`);
2568     INTRO_TAC Flyspeck_constants.bounds [];
2569     BY(REAL_ARITH_TAC);
2570   COMMENT "delta=0";
2571   ASM_CASES_TAC `delta_y y1 y2 y3 y4 y5 y6 = &0`;
2572     INTRO_TAC (UNDISCH EAR_DIH1_DELTA_0) [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`];
2573     ANTS_TAC;
2574       BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
2575     DISCH_TAC;
2576     MATCH_MP_TAC REAL_LE_TRANS;
2577     EXISTS_TAC `sol0 * (y1 - &2 * h0) / (&2 * h0 - &2)`;
2578     CONJ_TAC;
2579       MATCH_MP_TAC (arith `&0 <= s * (&1 + y /z) ==> --s <= s * y /z`);
2580       GMATCH_SIMP_TAC REAL_LE_MUL;
2581       CONJ_TAC;
2582         INTRO_TAC Flyspeck_constants.bounds [];
2583         BY(REAL_ARITH_TAC);
2584       TYPIFY `&1 + (y1 - &2 * h0) / (&2 * h0 - &2) = (y1 - &2) / (&2 * h0 - &2)` (C SUBGOAL_THEN SUBST1_TAC);
2585         Calc_derivative.CALC_ID_TAC;
2586         BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
2587       GMATCH_SIMP_TAC REAL_LE_RDIV_EQ;
2588       BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
2589     MATCH_MP_TAC (UNDISCH OWZLKVY3);
2590     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
2591   COMMENT "replace taum with solid angle";
2592   TYPIFY `&0 < delta_y y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN MP_TAC);
2593     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
2594   DISCH_TAC;
2595   REWRITE_TAC[Nonlinear_lemma.taum_123;Sphere.rhazim2;Sphere.rhazim3;Sphere.node2_y;Sphere.node3_y];
2596   REWRITE_TAC[arith `-- sol0 <= r1 + r2 + r3 - (&1 + c)*pi <=> (-- sol0 + c * pi) + pi <= (r1 + r2 + r3)`];
2597   MATCH_MP_TAC REAL_LE_TRANS;
2598   EXISTS_TAC `dih_y y1 y2 y3 y4 y5 y6 + dih_y y2 y3 y1 y5 y6 y4 + dih_y y3 y1 y2 y6 y4 y5`;
2599   CONJ2_TAC;
2600     MATCH_MP_TAC (arith `d1 <= r1 /\ d2 <= r2 /\ d3x <= r3 ==> d1 + d2 + d3x <= r1 + r2 + r3`);
2601     REPEAT (GMATCH_SIMP_TAC DIH_Y_LT_RHAZIM);
2602     ASM_REWRITE_TAC[];
2603     BY(ASM_MESON_TAC[Merge_ineq.delta_y_sym]);
2604   REWRITE_TAC[Nonlinear_lemma.sol0_const1;arith `(-- (pi * c) + c * pi) + pi = pi`];
2605   RULE_ASSUM_TAC(REWRITE_RULE[arith `~(x <= d) <=> (d < x)`]);
2606   ENOUGH_TO_SHOW_TAC `&0 < sol_y y1 y2 y3 y4 y5 y6`;
2607     REWRITE_TAC[Sphere.sol_y];
2608     BY(REAL_ARITH_TAC);
2609   REWRITE_TAC[Merge_ineq.sol_y_sol_x];
2610   MATCH_MP_TAC sol_x_nn;
2611   REPEAT (GMATCH_SIMP_TAC REAL_LT_MUL_EQ);
2612   REWRITE_TAC[Trigonometry1.UPS_X_SQUARES];
2613   REPEAT (GMATCH_SIMP_TAC REAL_LT_MUL_EQ);
2614   TYPIFY `&0 < eulerA_x (y1 * y1) (y2 * y2) (y3 * y3) (y4 * y4) (y5 * y5) (y6 * y6)` (C SUBGOAL_THEN (unlist REWRITE_TAC));
2615     INTRO_TAC ((* Appendix. *) get_main_nonlinear "4821120729") [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`];
2616     REWRITE_TAC[Sphere.ineq;Sphere.y_of_x;arith `x > &0 <=> &0 < x`];
2617     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Appendix.cstab] THEN REAL_ARITH_TAC);
2618   TYPIFY `&0 < delta_x (y1 * y1) (y2 * y2) (y3 * y3) (y4 * y4) (y5 * y5) (y6 * y6)` (C SUBGOAL_THEN (unlist REWRITE_TAC));
2619     FIRST_X_ASSUM MP_TAC;
2620     BY(REWRITE_TAC[Sphere.delta_y]);
2621   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN (REWRITE_TAC[Appendix.cstab;Sphere.h0]) THEN REAL_ARITH_TAC)
2622   ]);;
2623   (* }}} *)
2624
2625 let OWZLKVY2 = prove_by_refinement(
2626   `main_nonlinear_terminal_v11 ==> ( !y1 y2 y3 y4 y5 y6.
2627     y1 = &2 * h0 /\
2628     &2 <= y2 /\ y2 <= &2 * h0 /\
2629     &2 <= y3 /\ y3 <= &2 * h0 /\
2630     cstab <= y4 /\ y4 <= #3.915 /\
2631     y5 = &2 /\
2632     y6 = &2 /\
2633         &0 <= delta_y y1 y2 y3 y4 y5 y6 ==>
2634         &0 <= taum y1 y2 y3 y4 y5 y6)`,
2635   (* {{{ proof *)
2636   [
2637   REPEAT WEAKER_STRIP_TAC;
2638   ASM_CASES_TAC `&200 <= delta_y y1 y2 y3 y4 y5 y6`;
2639     INTRO_TAC OWZLKVY0 [];
2640     ASM_REWRITE_TAC[];
2641     DISCH_THEN (C INTRO_TAC [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`]);
2642     ASM_REWRITE_TAC[];
2643     DISCH_THEN MATCH_MP_TAC;
2644     BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
2645   TYPIFY `&0 <= delta_x (y1 * y1) (y2 * y2) (y3 * y3) (y4 * y4) (y5 * y5) (y6 * y6)` (C SUBGOAL_THEN ASSUME_TAC);
2646     FIRST_X_ASSUM_ST `&0 <= d` MP_TAC;
2647     BY(REWRITE_TAC[Sphere.delta_y] THEN REAL_ARITH_TAC);
2648   GMATCH_SIMP_TAC taum_taum_x;
2649   CONJ_TAC;
2650     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Appendix.cstab] THEN REAL_ARITH_TAC);
2651   REWRITE_TAC[Sphere.y_of_x];
2652   GMATCH_SIMP_TAC Merge_ineq.tau_x_tau_residual_x;
2653   COMMENT "residue hypotheses";
2654   CONJ_TAC;
2655     GMATCH_SIMP_TAC Nonlinear_lemma.sqrtxx;
2656     GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
2657     REPEAT (GMATCH_SIMP_TAC REAL_LT_MUL_EQ);
2658     INTRO_TAC (UNDISCH EAR_DELTA_X4) [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`];
2659     ANTS_TAC;
2660       BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
2661     DISCH_THEN (unlist REWRITE_TAC);
2662     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.delta_y;Sphere.h0;Appendix.cstab] THEN REAL_ARITH_TAC);
2663   GMATCH_SIMP_TAC REAL_LE_MUL;
2664   CONJ_TAC;
2665     GMATCH_SIMP_TAC SQRT_POS_LE;
2666     BY(FIRST_X_ASSUM (unlist REWRITE_TAC));
2667   INTRO_TAC ((* Appendix. *) get_main_nonlinear "5202826650 a") [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`];
2668   REWRITE_TAC[Sphere.ineq;Sphere.y_of_x];
2669   REWRITE_TAC[TAUT `a ==> b ==> c <=> (a /\ b ==> c)`];
2670   ANTS_TAC;
2671     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Appendix.cstab;Sphere.h0] THEN REAL_ARITH_TAC);
2672   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC)
2673   ]);;
2674   (* }}} *)
2675
2676 (* was sqrt2_bounds *)
2677
2678 let sqrt8_bounds = prove_by_refinement(
2679   `sqrt8 <= #3.01 /\ &2 <= sqrt8 /\ sqrt8 <= #3.62`,
2680   (* {{{ proof *)
2681   [
2682   INTRO_TAC Flyspeck_constants.bounds [];
2683   BY(REAL_ARITH_TAC)
2684   ]);;
2685   (* }}} *)
2686
2687 (* renamed from  terminal_std_tri_OMKYNLT_3336871894_empty *)
2688
2689 (*
2690 let empty_3T2 = prove_by_refinement(
2691   `main_nonlinear_terminal_v11 ==> 
2692         (let s = mk_unadorned_v39 3 (&0) (funlist_v39 [] (&2) 3) (funlist_v39 [] (&2) 3) in
2693            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
2694   (* {{{ proof *)
2695   [
2696   REPEAT WEAKER_STRIP_TAC;
2697   MATCH_MP_TAC taustar_taum;
2698   REWRITE_TAC[FUNLIST_EXPLICIT];
2699   REWRITE_TAC[Appendix.cstab;arith `&2 <= &2 /\ &2 <= #3.01 /\ &2 <= #3.62`];
2700   REPEAT WEAKER_STRIP_TAC;
2701   INTRO_TAC ((* Appendix. *) get_main_nonlinear "OMKYNLT 3336871894") [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`];
2702   REWRITE_TAC[Sphere.ineq;arith `x >= #0.0 <=> &0 <= x`];
2703   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
2704   ]);;
2705   (* }}} *)
2706 *)
2707
2708 let empty_3T2 = prove_by_refinement(
2709   `main_nonlinear_terminal_v11 ==> 
2710         (let s = scs_3T2 in (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
2711   (* {{{ proof *)
2712   [
2713   REWRITE_TAC[Appendix.scs_3T2];
2714   REPEAT WEAKER_STRIP_TAC;
2715   MATCH_MP_TAC taustar_taum;
2716   REWRITE_TAC[FUNLIST_EXPLICIT];
2717   REWRITE_TAC[Appendix.cstab;arith `&2 <= &2 /\ &2 <= #3.01 /\ &2 <= #3.62`];
2718   REPEAT WEAKER_STRIP_TAC;
2719   INTRO_TAC ( get_main_nonlinear "OMKYNLT 3336871894") [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`];
2720   REWRITE_TAC[Sphere.ineq;arith `x >= #0.0 <=> &0 <= x`];
2721   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
2722   ]);;
2723   (* }}} *)
2724
2725
2726 (* renamed from  terminal_std_tri_4010906068_empty *)
2727 let empty_3T3   = prove_by_refinement(
2728   `main_nonlinear_terminal_v11 ==> 
2729         (let s = mk_unadorned_v39 3
2730   (#0.476)
2731   (funlist_v39 [] (&2*h0) 3)
2732   (funlist_v39 [] (cstab) 3) in 
2733            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
2734   (* {{{ proof *)
2735   [
2736   REPEAT WEAKER_STRIP_TAC;
2737   MATCH_MP_TAC taustar_taum;
2738   REWRITE_TAC[FUNLIST_EXPLICIT];
2739   REWRITE_TAC[Appendix.cstab;Sphere.h0;arith `x <= x /\ &2 <= #3.01 /\ &2 <= &2 * #1.26 /\ &2 * #1.26 <= #3.01 /\ &2 <= #3.62 /\ #3.01 <= #3.62 /\ &2 * #1.26 <= #3.62`];
2740   REWRITE_TAC[sqrt8_bounds];
2741   REPEAT WEAKER_STRIP_TAC;
2742   INTRO_TAC ((* Appendix. *) get_main_nonlinear "4010906068") [`y1`;`y3`;`y2`;`y4`;`y6`;`y5`];
2743   REWRITE_TAC[Sphere.ineq;arith `x >= y <=> y <= x`;arith `x > y <=> y < x`];
2744   TYPIFY `taum y1 y3 y2 y4 y6 y5 = taum y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN SUBST1_TAC);
2745     BY(MESON_TAC[taum_sym]);
2746   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
2747   ]);;
2748   (* }}} *)
2749
2750 let empty_3T3   = prove_by_refinement(
2751   `main_nonlinear_terminal_v11 ==> 
2752         (let s = scs_3T3  in (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
2753   (* {{{ proof *)
2754   [
2755   REWRITE_TAC[Appendix.scs_3T3];
2756   REPEAT WEAKER_STRIP_TAC;
2757   MATCH_MP_TAC taustar_taum;
2758   REWRITE_TAC[FUNLIST_EXPLICIT];
2759   REWRITE_TAC[Appendix.cstab;Sphere.h0;arith `x <= x /\ &2 <= #3.01 /\ &2 <= &2 * #1.26 /\ &2 * #1.26 <= #3.01 /\ &2 <= #3.62 /\ #3.01 <= #3.62 /\ &2 * #1.26 <= #3.62`];
2760   REWRITE_TAC[sqrt8_bounds];
2761   REPEAT WEAKER_STRIP_TAC;
2762   INTRO_TAC ((* Appendix. *) get_main_nonlinear "4010906068") [`y1`;`y3`;`y2`;`y4`;`y6`;`y5`];
2763   REWRITE_TAC[Sphere.ineq;arith `x >= y <=> y <= x`;arith `x > y <=> y < x`];
2764   TYPIFY `taum y1 y3 y2 y4 y6 y5 = taum y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN SUBST1_TAC);
2765     BY(MESON_TAC[taum_sym]);
2766   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
2767   ]);;
2768   (* }}} *)
2769
2770 (* renamed from  terminal_std_tri_6833979866_empty *)
2771 let empty_3T4   = prove_by_refinement(
2772   `main_nonlinear_terminal_v11 ==> 
2773         (let s = scs_3T4 in
2774   //mk_unadorned_v39
2775   //3
2776   //(#0.2759)
2777   //(funlist_v39 [(0,1),(&2)] (&2*h0) 3)
2778   //(funlist_v39 [(0,1),(&2 * h0)] (cstab) 3) in 
2779            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
2780   (* {{{ proof *)
2781   [
2782   REWRITE_TAC[Appendix.scs_3T4];
2783   REPEAT WEAKER_STRIP_TAC;
2784   MATCH_MP_TAC taustar_taum;
2785   REWRITE_TAC[FUNLIST_EXPLICIT];
2786   REWRITE_TAC[Appendix.cstab;Sphere.h0;arith `x <= x /\ &2 <= #3.01 /\ &2 <= &2 * #1.26 /\ &2 * #1.26 <= #3.01 /\ &2 <= #3.62 /\ #3.01 <= #3.62 /\ &2 * #1.26 <= #3.62`];
2787   REWRITE_TAC[sqrt8_bounds];
2788   REPEAT WEAKER_STRIP_TAC;
2789   INTRO_TAC ((* Appendix. *) get_main_nonlinear "6833979866") [`y3`;`y1`;`y2`;`y6`;`y4`;`y5`];
2790   REWRITE_TAC[Sphere.ineq;arith `x >= y <=> y <= x`;arith `x > y <=> y < x`];
2791   TYPIFY `taum y3 y1 y2 y6 y4 y5 = taum y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN SUBST1_TAC);
2792     BY(MESON_TAC[taum_sym]);
2793   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
2794   ]);;
2795   (* }}} *)
2796
2797 (*   renamed from terminal_std_tri_5541487347_empty *)
2798 let empty_3T5  = prove_by_refinement(
2799   `main_nonlinear_terminal_v11 ==> 
2800         (let s = scs_3T5 in
2801   //mk_unadorned_v39
2802   //3
2803   //(#0.103)
2804   //(funlist_v39 [(0,1),(&2 * h0)] (&2) 3)
2805   //(funlist_v39 [(0,1),(sqrt8)] (&2 * h0) 3) in 
2806            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
2807   (* {{{ proof *)
2808   [
2809   REWRITE_TAC[Appendix.scs_3T5];
2810   REPEAT WEAKER_STRIP_TAC;
2811   MATCH_MP_TAC taustar_taum;
2812   REWRITE_TAC[FUNLIST_EXPLICIT];
2813   REWRITE_TAC[Appendix.cstab;Sphere.h0;arith `x <= x /\ &2 <= #3.01 /\ &2 <= &2 * #1.26 /\ &2 * #1.26 <= #3.01 /\ &2 <= #3.62 /\ #3.01 <= #3.62 /\ &2 * #1.26 <= #3.62`];
2814   REWRITE_TAC[sqrt8_bounds];
2815   REPEAT WEAKER_STRIP_TAC;
2816   INTRO_TAC ((* Appendix. *) get_main_nonlinear "5541487347") [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`];
2817   REWRITE_TAC[Sphere.ineq;arith `x >= y <=> y <= x`;arith `x > y <=> y < x`];
2818   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
2819   ]);;
2820   (* }}} *)
2821
2822 (*
2823 let  terminal_std_tri_4528012043_empty  = prove_by_refinement(
2824   `main_nonlinear_terminal_v11 ==> 
2825         (let s = mk_unadorned_v39 3 (tame_table_d 0 3 +  #3.0 * (tame_table_d 2 1 -  #0.11))
2826    (funlist_v39 [] cstab 3)
2827    (funlist_v39 [] cstab 3) in 
2828            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
2829   (* {{{ proof *)
2830   [
2831   REPEAT WEAKER_STRIP_TAC;
2832   MATCH_MP_TAC taustar_taum;
2833   REWRITE_TAC[FUNLIST_EXPLICIT];
2834   REWRITE_TAC[Appendix.cstab;arith `x <= x /\ &2 <= #3.01 /\ &2 <= #3.62 /\ #3.01 <= #3.62`];
2835   REPEAT WEAKER_STRIP_TAC;
2836   INTRO_TAC ((* Appendix. *) get_main_nonlinear "4528012043") [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`];
2837   REWRITE_TAC[Sphere.ineq;arith `x >= y <=> y <= x`;arith `x > y <=> y < x`];
2838   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
2839   ]);;
2840   (* }}} *)
2841
2842 let  terminal_std_tri_7459553847_empty  = prove_by_refinement(
2843   `main_nonlinear_terminal_v11 ==> 
2844         (let s = mk_unadorned_v39 3
2845    (tame_table_d 0 3 +  #3.0 * (tame_table_d 2 1 -  #0.11))
2846    (funlist_v39 [(0,1),&2 * h0] cstab 3)
2847    (funlist_v39 [(0,1),&2 * h0] cstab 3) in 
2848            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
2849   (* {{{ proof *)
2850   [
2851   REPEAT WEAKER_STRIP_TAC;
2852   MATCH_MP_TAC taustar_taum;
2853   REWRITE_TAC[FUNLIST_EXPLICIT];
2854   REWRITE_TAC[Appendix.cstab;Sphere.h0;arith `x <= x /\ &2 <= #3.01 /\ &2 <= &2 * #1.26 /\ &2 * #1.26 <= #3.01 /\ &2 <= #3.62 /\ #3.01 <= #3.62 /\ &2 * #1.26 <= #3.62`];
2855   REPEAT WEAKER_STRIP_TAC;
2856   INTRO_TAC ((* Appendix. *) get_main_nonlinear "7459553847") [`y3`;`y2`;`y1`;`y6`;`y5`;`y4`];
2857   REWRITE_TAC[Sphere.ineq;arith `x >= y <=> y <= x`;arith `x > y <=> y < x`];
2858   TYPIFY `taum y3 y2 y1 y6 y5 y4 = taum y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN SUBST1_TAC);
2859     BY(MESON_TAC[taum_sym]);
2860   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
2861   ]);;
2862   (* }}} *)
2863
2864 let  terminal_std_tri_4143829594_empty  = prove_by_refinement(
2865   `main_nonlinear_terminal_v11 ==> 
2866         (let s = mk_unadorned_v39 3
2867    (tame_table_d 0 3 +  #3.0 * (tame_table_d 2 1 -  #0.11))
2868    (funlist_v39 [(0,1),cstab] (&2 * h0) 3)
2869    (funlist_v39 [(0,1),cstab] (&2 * h0) 3) in 
2870            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
2871   (* {{{ proof *)
2872   [
2873   REPEAT WEAKER_STRIP_TAC;
2874   MATCH_MP_TAC taustar_taum;
2875   REWRITE_TAC[FUNLIST_EXPLICIT];
2876   REWRITE_TAC[Appendix.cstab;Sphere.h0;arith `x <= x /\ &2 <= #3.01 /\ &2 <= &2 * #1.26 /\ &2 * #1.26 <= #3.01 /\ &2 <= #3.62 /\ #3.01 <= #3.62 /\ &2 * #1.26 <= #3.62`];
2877   REPEAT WEAKER_STRIP_TAC;
2878   INTRO_TAC ((* Appendix. *) get_main_nonlinear "4143829594") [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`];
2879   REWRITE_TAC[Sphere.ineq;arith `x >= y <=> y <= x`;arith `x > y <=> y < x`];
2880   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
2881   ]);;
2882   (* }}} *)
2883
2884 let  terminal_std_tri_1080462150_empty  = prove_by_refinement(
2885   `main_nonlinear_terminal_v11 ==> 
2886         (let s = mk_unadorned_v39 3
2887    (tame_table_d 0 3 +  #3.0 * (tame_table_d 2 1 -  #0.11))
2888    (funlist_v39 [] (&2 * h0) 3)
2889    (funlist_v39 [] (&2 * h0) 3) in 
2890            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
2891   (* {{{ proof *)
2892   [
2893   REPEAT WEAKER_STRIP_TAC;
2894   MATCH_MP_TAC taustar_taum;
2895   REWRITE_TAC[FUNLIST_EXPLICIT];
2896   REWRITE_TAC[Appendix.cstab;Sphere.h0;arith `x <= x /\ &2 <= #3.01 /\ &2 <= &2 * #1.26 /\ &2 * #1.26 <= #3.01 /\ &2 <= #3.62 /\ #3.01 <= #3.62 /\ &2 * #1.26 <= #3.62`];
2897   REPEAT WEAKER_STRIP_TAC;
2898   INTRO_TAC ((* Appendix. *) get_main_nonlinear "1080462150") [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`];
2899   REWRITE_TAC[Sphere.ineq;arith `x >= y <=> y <= x`;arith `x > y <=> y < x`];
2900   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
2901   ]);;
2902   (* }}} *)
2903
2904 let  terminal_std_tri_9816718044_empty  = prove_by_refinement(
2905   `main_nonlinear_terminal_v11 ==> 
2906         (let s = mk_unadorned_v39 3
2907    (tame_table_d 1 2 +  #2.0 * (tame_table_d 2 1 -  #0.11))
2908    (funlist_v39 [(0,1),&2] cstab 3)
2909    (funlist_v39 [(0,1),&2] cstab 3) in 
2910            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
2911   (* {{{ proof *)
2912   [
2913   REPEAT WEAKER_STRIP_TAC;
2914   MATCH_MP_TAC taustar_taum;
2915   REWRITE_TAC[FUNLIST_EXPLICIT];
2916   REWRITE_TAC[Appendix.cstab;Sphere.h0;arith `x <= x /\ &2 <= #3.01 /\ &2 <= &2 * #1.26 /\ &2 * #1.26 <= #3.01 /\ &2 <= #3.62 /\ #3.01 <= #3.62 /\ &2 * #1.26 <= #3.62`];
2917   REPEAT WEAKER_STRIP_TAC;
2918   INTRO_TAC ((* Appendix. *) get_main_nonlinear "9816718044") [`y3`;`y2`;`y1`;`y6`;`y5`;`y4`];
2919   REWRITE_TAC[Sphere.ineq;arith `x >= y <=> y <= x`;arith `x > y <=> y < x`];
2920   TYPIFY `taum y3 y2 y1 y6 y5 y4 = taum y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN SUBST1_TAC);
2921     BY(MESON_TAC[taum_sym]);
2922   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
2923   ]);;
2924   (* }}} *)
2925
2926 let  terminal_std_tri_3106201101_empty  = prove_by_refinement(
2927   `main_nonlinear_terminal_v11 ==> 
2928         (let s = mk_unadorned_v39 3
2929    (tame_table_d 1 2 +  #2.0 * (tame_table_d 2 1 -  #0.11))
2930    (funlist_v39 [(0,1),&2; (0,2),cstab] sqrt8 3)
2931    (funlist_v39 [(0,1),&2; (0,2),cstab] sqrt8 3) in 
2932            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
2933   (* {{{ proof *)
2934   [
2935   REPEAT WEAKER_STRIP_TAC;
2936   MATCH_MP_TAC taustar_taum;
2937   REWRITE_TAC[FUNLIST_EXPLICIT];
2938   REWRITE_TAC[Appendix.cstab;Sphere.h0;arith `x <= x /\ &2 <= #3.01 /\ &2 <= &2 * #1.26 /\ &2 * #1.26 <= #3.01 /\ &2 <= #3.62 /\ #3.01 <= #3.62 /\ &2 * #1.26 <= #3.62`];
2939   REWRITE_TAC[sqrt8_bounds];
2940   REPEAT WEAKER_STRIP_TAC;
2941   INTRO_TAC ((* Appendix. *) get_main_nonlinear "3106201101") [`y3`;`y1`;`y2`;`y6`;`y4`;`y5`];
2942   REWRITE_TAC[Sphere.ineq;arith `x >= y <=> y <= x`;arith `x > y <=> y < x`];
2943   TYPIFY `taum y3 y1 y2 y6 y4 y5 = taum y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN SUBST1_TAC);
2944     BY(MESON_TAC[taum_sym]);
2945   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
2946   ]);;
2947   (* }}} *)
2948
2949 let  terminal_std_tri_2200527225_empty  = prove_by_refinement(
2950   `main_nonlinear_terminal_v11 ==> 
2951         (let s = mk_unadorned_v39 3
2952    (tame_table_d 1 2 +  #2.0 * (tame_table_d 2 1 -  #0.11))
2953    (funlist_v39 [(0,1),&2] sqrt8 3)
2954    (funlist_v39 [(0,1),&2] sqrt8 3) in 
2955            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
2956   (* {{{ proof *)
2957   [
2958   REPEAT WEAKER_STRIP_TAC;
2959   MATCH_MP_TAC taustar_taum;
2960   REWRITE_TAC[FUNLIST_EXPLICIT];
2961   REWRITE_TAC[Appendix.cstab;Sphere.h0;arith `x <= x /\ &2 <= #3.01 /\ &2 <= &2 * #1.26 /\ &2 * #1.26 <= #3.01 /\ &2 <= #3.62 /\ #3.01 <= #3.62 /\ &2 * #1.26 <= #3.62`];
2962   REWRITE_TAC[sqrt8_bounds];
2963   REPEAT WEAKER_STRIP_TAC;
2964   INTRO_TAC ((* Appendix. *) get_main_nonlinear "2200527225") [`y3`;`y1`;`y2`;`y6`;`y4`;`y5`];
2965   REWRITE_TAC[Sphere.ineq;arith `x >= y <=> y <= x`;arith `x > y <=> y < x`];
2966   TYPIFY `taum y3 y1 y2 y6 y4 y5 = taum y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN SUBST1_TAC);
2967     BY(MESON_TAC[taum_sym]);
2968   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
2969   ]);;
2970   (* }}} *)
2971
2972 let  terminal_std_tri_2900061606_empty  = prove_by_refinement(
2973   `main_nonlinear_terminal_v11 ==> 
2974         (let s = mk_unadorned_v39 3 (tame_table_d 1 2 + tame_table_d 2 1 -  #0.11)
2975    (funlist_v39 [(0,1),&2 * h0; (0,2),cstab] (&2) 3)
2976    (funlist_v39 [(0,1),&2 * h0; (0,2),cstab] (&2) 3) in 
2977            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
2978   (* {{{ proof *)
2979   [
2980   REPEAT WEAKER_STRIP_TAC;
2981   MATCH_MP_TAC taustar_taum;
2982   REWRITE_TAC[FUNLIST_EXPLICIT];
2983   REWRITE_TAC[Appendix.cstab;Sphere.h0;arith `x <= x /\ &2 <= #3.01 /\ &2 <= &2 * #1.26 /\ &2 * #1.26 <= #3.01 /\ &2 <= #3.62 /\ #3.01 <= #3.62 /\ &2 * #1.26 <= #3.62`];
2984   REPEAT WEAKER_STRIP_TAC;
2985   INTRO_TAC ((* Appendix. *) get_main_nonlinear "2900061606") [`y1`;`y3`;`y2`;`y4`;`y6`;`y5`];
2986   REWRITE_TAC[Sphere.ineq;arith `x >= y <=> y <= x`;arith `x > y <=> y < x`];
2987   TYPIFY `taum y1 y3 y2 y4 y6 y5 = taum y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN SUBST1_TAC);
2988     BY(MESON_TAC[taum_sym]);
2989   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
2990   ]);;
2991   (* }}} *)
2992
2993 let  terminal_std_tri_7097350062a_empty  = prove_by_refinement(
2994   `main_nonlinear_terminal_v11 ==> 
2995         (let s = mk_unadorned_v39 3 (tame_table_d 1 2)
2996    (funlist_v39 [(0,1),&2 * h0; (0,2),sqrt8] (&2) 3)
2997    (funlist_v39 [(0,1),&2 * h0; (0,2),sqrt8] (&2) 3) in 
2998            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
2999   (* {{{ proof *)
3000   [
3001   REPEAT WEAKER_STRIP_TAC;
3002   MATCH_MP_TAC taustar_taum;
3003   REWRITE_TAC[FUNLIST_EXPLICIT];
3004   REWRITE_TAC[Appendix.cstab;Sphere.h0;arith `x <= x /\ &2 <= #3.01 /\ &2 <= &2 * #1.26 /\ &2 * #1.26 <= #3.01 /\ &2 <= #3.62 /\ #3.01 <= #3.62 /\ &2 * #1.26 <= #3.62`];
3005   REWRITE_TAC[sqrt8_bounds];
3006   REPEAT WEAKER_STRIP_TAC;
3007   INTRO_TAC ((* Appendix. *) get_main_nonlinear "7097350062a") [`y1`;`y3`;`y2`;`y4`;`y6`;`y5`];
3008   REWRITE_TAC[Sphere.ineq;arith `x >= y <=> y <= x`;arith `x > y <=> y < x`];
3009   TYPIFY `taum y1 y3 y2 y4 y6 y5 = taum y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN SUBST1_TAC);
3010     BY(MESON_TAC[taum_sym]);
3011   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
3012   ]);;
3013   (* }}} *)
3014
3015 let  terminal_std_tri_OMKYNLT_1_2_empty  = prove_by_refinement(
3016   `main_nonlinear_terminal_v11 ==> 
3017         (let s = mk_unadorned_v39 3 (tame_table_d 1 2) (funlist_v39 [(0,1),&2] (&2 * h0) 3)
3018    (funlist_v39 [(0,1),&2] (&2 * h0) 3) in 
3019            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
3020   (* {{{ proof *)
3021   [
3022   REPEAT WEAKER_STRIP_TAC;
3023   MATCH_MP_TAC taustar_taum;
3024   REWRITE_TAC[FUNLIST_EXPLICIT];
3025   REWRITE_TAC[Appendix.cstab;Sphere.h0;arith `x <= x /\ &2 <= #3.01 /\ &2 <= &2 * #1.26 /\ &2 * #1.26 <= #3.01 /\ &2 <= #3.62 /\ #3.01 <= #3.62 /\ &2 * #1.26 <= #3.62`];
3026   REWRITE_TAC[sqrt8_bounds];
3027   REPEAT WEAKER_STRIP_TAC;
3028   INTRO_TAC ((* Appendix. *) get_main_nonlinear "OMKYNLT 1 2") [`y3`;`y2`;`y1`;`y6`;`y5`;`y4`];
3029   REWRITE_TAC[Sphere.ineq;arith `x >= y <=> y <= x`;arith `x > y <=> y < x`];
3030   TYPIFY `taum y3 y2 y1 y6 y5 y4 = taum y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN SUBST1_TAC);
3031     BY(MESON_TAC[taum_sym]);
3032   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
3033   ]);;
3034   (* }}} *)
3035
3036 let  terminal_std_tri_7645170609_empty  = prove_by_refinement(
3037   `main_nonlinear_terminal_v11 ==> 
3038         (let s = mk_unadorned_v39 3 (tame_table_d 2 1) (funlist_v39 [(0,1),sqrt8] (&2) 3)
3039    (funlist_v39 [(0,1),sqrt8] (&2) 3) in
3040            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
3041   (* {{{ proof *)
3042   [
3043   REPEAT WEAKER_STRIP_TAC;
3044   MATCH_MP_TAC taustar_taum;
3045   REWRITE_TAC[FUNLIST_EXPLICIT];
3046   REWRITE_TAC[Appendix.cstab;Sphere.h0;arith `x <= x /\ &2 <= #3.01 /\ &2 <= &2 * #1.26 /\ &2 * #1.26 <= #3.01 /\ &2 <= #3.62 /\ #3.01 <= #3.62 /\ &2 * #1.26 <= #3.62`];
3047   REWRITE_TAC[sqrt8_bounds];
3048   REPEAT WEAKER_STRIP_TAC;
3049   INTRO_TAC ((* Appendix. *) get_main_nonlinear "7645170609") [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`];
3050   REWRITE_TAC[Sphere.ineq;arith `x >= y <=> y <= x`;arith `x > y <=> y < x`];
3051   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
3052   ]);;
3053   (* }}} *)
3054
3055 let  terminal_std_tri_OMKYNLT_2_1_empty  = prove_by_refinement(
3056   `main_nonlinear_terminal_v11 ==> 
3057         (let s = mk_unadorned_v39 3 (tame_table_d 2 1) (funlist_v39 [(0,1),&2 * h0] (&2) 3)
3058    (funlist_v39 [(0,1),&2 * h0] (&2) 3) in 
3059            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
3060   (* {{{ proof *)
3061   [
3062   REPEAT WEAKER_STRIP_TAC;
3063   MATCH_MP_TAC taustar_taum;
3064   REWRITE_TAC[FUNLIST_EXPLICIT];
3065   REWRITE_TAC[Appendix.cstab;Sphere.h0;arith `x <= x /\ &2 <= #3.01 /\ &2 <= &2 * #1.26 /\ &2 * #1.26 <= #3.01 /\ &2 <= #3.62 /\ #3.01 <= #3.62 /\ &2 * #1.26 <= #3.62`];
3066   REWRITE_TAC[sqrt8_bounds];
3067   REPEAT WEAKER_STRIP_TAC;
3068   INTRO_TAC ((* Appendix. *) get_main_nonlinear "OMKYNLT 2 1") [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`];
3069   REWRITE_TAC[Sphere.ineq;arith `x >= y <=> y <= x`;arith `x > y <=> y < x`];
3070   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
3071   ]);;
3072   (* }}} *)
3073 *)
3074
3075 let  terminal_std_tri_7881254908_empty  = prove_by_refinement(
3076   `main_nonlinear_terminal_v11 ==> 
3077         (let s = mk_unadorned_v39 3 ( #0.696 -  #2.0 *  #0.11)
3078    (funlist_v39 [(0,1),sqrt8; (1,2),sqrt8] (&2 * h0) 3)
3079    (funlist_v39 [(0,1),cstab; (1,2),cstab] (&2 * h0) 3) in
3080            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
3081   (* {{{ proof *)
3082   [
3083   REPEAT WEAKER_STRIP_TAC;
3084   MATCH_MP_TAC taustar_taum;
3085   REWRITE_TAC[FUNLIST_EXPLICIT];
3086   REWRITE_TAC[Appendix.cstab;Sphere.h0;arith `x <= x /\ &2 <= #3.01 /\ &2 <= &2 * #1.26 /\ &2 * #1.26 <= #3.01 /\ &2 <= #3.62 /\ #3.01 <= #3.62 /\ &2 * #1.26 <= #3.62`];
3087   REWRITE_TAC[sqrt8_bounds];
3088   REPEAT WEAKER_STRIP_TAC;
3089   INTRO_TAC ((* Appendix. *) get_main_nonlinear "7881254908") [`y2`;`y1`;`y3`;`y5`;`y4`;`y6`];
3090   TYPIFY `taum y2 y1 y3 y5 y4 y6 = taum y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN SUBST1_TAC);
3091     BY(MESON_TAC[taum_sym]);
3092   REWRITE_TAC[Sphere.ineq;arith `x >= y <=> y <= x`;arith `x > y <=> y < x`];
3093   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
3094   ]);;
3095   (* }}} *)
3096
3097 (*  renamed from terminal_std_tri_5026777310a_empty  *)
3098 let empty_3T6  = prove_by_refinement(
3099   `main_nonlinear_terminal_v11 ==> 
3100         (let s = scs_3T6' in
3101    //mk_unadorned_v39 3 ( #0.6548 -  #2.0 *  #0.11)
3102    //(funlist_v39 [(0,1),sqrt8; (1,2),sqrt8] (&2) 3)
3103    //(funlist_v39 [(0,1),cstab; (1,2),cstab] (&2 * h0) 3) in 
3104            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
3105   (* {{{ proof *)
3106   [
3107   REWRITE_TAC[Appendix.scs_3T6];
3108   REPEAT WEAKER_STRIP_TAC;
3109   MATCH_MP_TAC taustar_taum;
3110   REWRITE_TAC[FUNLIST_EXPLICIT];
3111   REWRITE_TAC[Appendix.cstab;Sphere.h0;arith `x <= x /\ &2 <= #3.01 /\ &2 <= &2 * #1.26 /\ &2 * #1.26 <= #3.01 /\ &2 <= #3.62 /\ #3.01 <= #3.62 /\ &2 * #1.26 <= #3.62`];
3112   REWRITE_TAC[sqrt8_bounds];
3113   REPEAT WEAKER_STRIP_TAC;
3114   INTRO_TAC ((* Appendix. *) get_main_nonlinear "5026777310a") [`y3`;`y1`;`y2`;`y6`;`y4`;`y5`];
3115   TYPIFY `taum y3 y1 y2 y6 y4 y5 = taum y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN SUBST1_TAC);
3116     BY(MESON_TAC[taum_sym]);
3117   REWRITE_TAC[Sphere.ineq;arith `x >= y <=> y <= x`;arith `x > y <=> y < x`;Sphere.tame_table_d];
3118   REWRITE_TAC[arith `4 + 2 * 1 > 3`];
3119   TYPIFY `delta_y y3 y1 y2 y6 y4 y5 = delta_y y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN ASSUME_TAC);
3120     BY(MESON_TAC[Merge_ineq.delta_y_sym]);
3121   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
3122   ]);;
3123   (* }}} *)
3124
3125 (* deprecated 2013-06-17
3126 let  terminal_std_tri_7720405539_empty  = prove_by_refinement(
3127   `main_nonlinear_terminal_v11 ==> 
3128         (let s = mk_unadorned_v39 3 ( #0.5518 /  #2.0 -  #0.2)
3129    (funlist_v39 [(0,1),cstab; (0,2),&2 * h0; (1,2),&2] (&2) 3)
3130    (funlist_v39 [(0,1), #3.41; (0,2),&2 * h0; (1,2),&2] (&2) 3) in 
3131            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
3132   (* {{{ proof *)
3133   [
3134   REPEAT WEAKER_STRIP_TAC;
3135   MATCH_MP_TAC taustar_taum;
3136   REWRITE_TAC[FUNLIST_EXPLICIT];
3137   REWRITE_TAC[Appendix.cstab;Sphere.h0;arith `x <= x /\ &2 <= #3.01 /\ &2 <= &2 * #1.26 /\ &2 * #1.26 <= #3.01 /\ &2 <= #3.62 /\ #3.01 <= #3.62 /\ &2 * #1.26 <= #3.62 /\ #3.41 <= #3.62`];
3138   REWRITE_TAC[sqrt8_bounds];
3139   REPEAT WEAKER_STRIP_TAC;
3140   INTRO_TAC ((* Appendix. *) get_main_nonlinear "7720405539") [`y3`;`y2`;`y1`;`y6`;`y5`;`y4`];
3141   TYPIFY `taum y3 y2 y1 y6 y5 y4 = taum y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN SUBST1_TAC);
3142     BY(MESON_TAC[taum_sym]);
3143   REWRITE_TAC[Sphere.ineq;arith `x >= y <=> y <= x`;arith `x > y <=> y < x`;Sphere.tame_table_d];
3144   REWRITE_TAC[arith `2 + 2 * 2 > 3`];
3145   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
3146   ]);;
3147   (* }}} *)
3148
3149 let  terminal_std_tri_2739661360_empty  = prove_by_refinement(
3150   `main_nonlinear_terminal_v11 ==> 
3151         (let s = mk_unadorned_v39 3 ( #0.5518 /  #2.0 +  #0.2)
3152    (funlist_v39 [(0,1),cstab; (0,2),cstab; (1,2),&2] (&2) 3)
3153    (funlist_v39 [(0,1), #3.41; (0,2),cstab; (1,2),&2] (&2) 3) in 
3154            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
3155   (* {{{ proof *)
3156   [
3157   REPEAT WEAKER_STRIP_TAC;
3158   MATCH_MP_TAC taustar_taum;
3159   REWRITE_TAC[FUNLIST_EXPLICIT];
3160   REWRITE_TAC[Appendix.cstab;Sphere.h0;arith `x <= x /\ &2 <= #3.01 /\ &2 <= &2 * #1.26 /\ &2 * #1.26 <= #3.01 /\ &2 <= #3.62 /\ #3.01 <= #3.62 /\ &2 * #1.26 <= #3.62 /\ #3.41 <= #3.62`];
3161   REWRITE_TAC[sqrt8_bounds];
3162   REPEAT WEAKER_STRIP_TAC;
3163   INTRO_TAC ((* Appendix. *) get_main_nonlinear "2739661360") [`y3`;`y2`;`y1`;`y6`;`y5`;`y4`];
3164   TYPIFY `taum y3 y2 y1 y6 y5 y4 = taum y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN SUBST1_TAC);
3165     BY(MESON_TAC[taum_sym]);
3166   REWRITE_TAC[Sphere.ineq;arith `x >= y <=> y <= x`;arith `x > y <=> y < x`;Sphere.tame_table_d];
3167   REWRITE_TAC[arith `2 + 2 * 2 > 3`];
3168   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
3169   ]);;
3170   (* }}} *)
3171
3172 let  terminal_std_tri_4922521904_empty  = prove_by_refinement(
3173   `main_nonlinear_terminal_v11 ==> 
3174         (let s = mk_unadorned_v39 3 ( #0.5518 /  #2.0)
3175    (funlist_v39 [(0,1),cstab; (0,2),&2 * h0; (1,2),&2] (&2) 3)
3176    (funlist_v39 [(0,1), #3.339; (0,2),&2 * h0; (1,2),&2] (&2) 3) in 
3177            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
3178   (* {{{ proof *)
3179   [
3180   REPEAT WEAKER_STRIP_TAC;
3181   MATCH_MP_TAC taustar_taum;
3182   REWRITE_TAC[FUNLIST_EXPLICIT];
3183   REWRITE_TAC[Appendix.cstab;Sphere.h0;arith `x <= x /\ &2 <= #3.01 /\ &2 <= &2 * #1.26 /\ &2 * #1.26 <= #3.01 /\ &2 <= #3.62 /\ #3.01 <= #3.62 /\ &2 * #1.26 <= #3.62 /\ #3.41 <= #3.62 /\ #3.339 <= #3.62`];
3184   REWRITE_TAC[sqrt8_bounds];
3185   REPEAT WEAKER_STRIP_TAC;
3186   INTRO_TAC ((* Appendix. *) get_main_nonlinear "4922521904") [`y3`;`y2`;`y1`;`y6`;`y5`;`y4`];
3187   TYPIFY `taum y3 y2 y1 y6 y5 y4 = taum y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN SUBST1_TAC);
3188     BY(MESON_TAC[taum_sym]);
3189   REWRITE_TAC[Sphere.ineq;arith `x >= y <=> y <= x`;arith `x > y <=> y < x`;Sphere.tame_table_d];
3190   REWRITE_TAC[arith `2 + 2 * 2 > 3`];
3191   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
3192   ]);;
3193   (* }}} *)
3194 *)
3195
3196 (* renamed from  terminal_std_tri_2468307358_empty *)
3197 let empty_3T7   = prove_by_refinement(
3198   `main_nonlinear_terminal_v11 ==> 
3199         (let s = scs_3T7 in
3200 //   mk_unadorned_v39 3 ( #0.2565)
3201 //   (funlist_v39 [(0,1),cstab; (0,2),cstab; (1,2),&2] (&2) 3)
3202 //   (funlist_v39 [(0,1), #3.62; (0,2),cstab; (1,2),&2] (&2) 3) in 
3203            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
3204   (* {{{ proof *)
3205   [
3206   REWRITE_TAC[Appendix.scs_3T7];
3207   REPEAT WEAKER_STRIP_TAC;
3208   MATCH_MP_TAC taustar_taum;
3209   REWRITE_TAC[FUNLIST_EXPLICIT];
3210   REWRITE_TAC[Appendix.cstab;Sphere.h0;arith `x <= x /\ &2 <= #3.01 /\ &2 <= &2 * #1.26 /\ &2 * #1.26 <= #3.01 /\ &2 <= #3.62 /\ #3.01 <= #3.62 /\ &2 * #1.26 <= #3.62 /\ #3.41 <= #3.62`];
3211   REWRITE_TAC[sqrt8_bounds];
3212   REPEAT WEAKER_STRIP_TAC;
3213   INTRO_TAC ((* Appendix. *) get_main_nonlinear "2468307358") [`y3`;`y2`;`y1`;`y6`;`y5`;`y4`];
3214   (*  INTRO_TAC ((* Appendix. *) get_main_nonlinear "2739661360") [`y3`;`y2`;`y1`;`y6`;`y5`;`y4`]; edited 2013-06-17. *)
3215   TYPIFY `taum y3 y2 y1 y6 y5 y4 = taum y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN SUBST1_TAC);
3216     BY(MESON_TAC[taum_sym]);
3217   REWRITE_TAC[Sphere.ineq;arith `x >= y <=> y <= x`;arith `x > y <=> y < x`;Sphere.tame_table_d];
3218   REWRITE_TAC[arith `2 + 2 * 2 > 3`];
3219   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
3220   ]);;
3221   (* }}} *)
3222
3223 let terminal_std_tri_ear_stab_empty = prove_by_refinement(
3224   `main_nonlinear_terminal_v11 ==> 
3225         (let s = 
3226  mk_unadorned_v39 3  #0.11 (funlist_v39 [(0,2),cstab] (&2) 3)
3227    (funlist_v39 [(0,2),cstab] (&2 * h0) 3) in 
3228            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
3229   (* {{{ proof *)
3230   [
3231   REPEAT WEAKER_STRIP_TAC;
3232   MATCH_MP_TAC taustar_taum;
3233   REWRITE_TAC[FUNLIST_EXPLICIT];
3234   REWRITE_TAC[Appendix.cstab;Sphere.h0;arith `x <= x /\ &2 <= #3.01 /\ &2 <= &2 * #1.26 /\ &2 * #1.26 <= #3.01 /\ &2 <= #3.62 /\ #3.01 <= #3.62 /\ &2 * #1.26 <= #3.62 /\ #3.41 <= #3.62 /\ #3.339 <= #3.62`];
3235   REWRITE_TAC[sqrt8_bounds];
3236   REPEAT WEAKER_STRIP_TAC;
3237   INTRO_TAC ((* Appendix. *) get_main_nonlinear "3603097872") [`y2`;`y1`;`y3`;`y5`;`y4`;`y6`];
3238   TYPIFY `taum y2 y1 y3 y5 y4 y6 = taum y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN SUBST1_TAC);
3239     BY(MESON_TAC[taum_sym]);
3240   TYPIFY `delta_y y2 y1 y3 y5 y4 y6 = delta_y y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN ASSUME_TAC);
3241     BY(MESON_TAC[Merge_ineq.delta_y_sym]);
3242   REWRITE_TAC[Sphere.ineq;arith `x >= y <=> y <= x`;arith `x > y <=> y < x`;Sphere.tame_table_d];
3243   MP_TAC sqrt8_bounds;
3244   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
3245   ]);;
3246   (* }}} *)
3247
3248
3249 (*
3250 let  terminal_std_ear_3603097872_empty  = prove_by_refinement(
3251   `main_nonlinear_terminal_v11 ==> 
3252         (let s = scs_v39
3253    (3,
3254      #0.11,
3255     funlist_v39 [(0,1),sqrt8] (&2) 3,
3256     funlist_v39 [(0,1),sqrt8] (&2) 3,
3257     funlist_v39 [(0,1),cstab] (&2 * h0) 3,
3258     funlist_v39 [(0,1),cstab] (&2 * h0) 3,
3259     funlistA_v39 [(0,1),T] F F 3,
3260     {},{},
3261     {}) in 
3262            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
3263   (* {{{ proof *)
3264   [
3265   DISCH_TAC;
3266   REWRITE_TAC[LET_DEF;LET_END_DEF];
3267   MATCH_MP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] taustar_taum_dfun);
3268   REWRITE_TAC[FUNLIST_EXPLICIT];
3269   REWRITE_TAC[is_ear_3603097872];
3270   REWRITE_TAC[Appendix.cstab;Sphere.h0;arith `x <= x /\ &2 <= #3.01 /\ &2 <= &2 * #1.26 /\ &2 * #1.26 <= #3.01 /\ &2 <= #3.62 /\ #3.01 <= #3.62 /\ &2 * #1.26 <= #3.62 /\ #3.41 <= #3.62 /\ #3.339 <= #3.62`];
3271   REWRITE_TAC[sqrt8_bounds];
3272   REPEAT WEAKER_STRIP_TAC;
3273   INTRO_TAC ((* Appendix. *) get_main_nonlinear "3603097872") [`y3`;`y2`;`y1`;`y6`;`y5`;`y4`];
3274   TYPIFY `taum y3 y2 y1 y6 y5 y4 = taum y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN SUBST1_TAC);
3275     BY(MESON_TAC[taum_sym]);
3276   TYPIFY `delta_y y3 y2 y1 y6 y5 y4 = delta_y y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN ASSUME_TAC);
3277     BY(MESON_TAC[Merge_ineq.delta_y_sym]);
3278   REWRITE_TAC[Sphere.ineq;arith `x >= y <=> y <= x`;arith `x > y <=> y < x`;Sphere.tame_table_d];
3279   MP_TAC sqrt8_bounds;
3280   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
3281   ]);;
3282   (* }}} *)
3283
3284
3285 let  terminal_std_ear_jnull_empty  = prove_by_refinement(
3286   `main_nonlinear_terminal_v11 ==> 
3287         (let s = scs_v39 
3288    (3,
3289      #0.11,
3290     funlist_v39 [(0,1),sqrt8] (&2) 3,
3291     funlist_v39 [(0,1),sqrt8] (&2) 3,
3292     funlist_v39 [(0,1),cstab] (&2 * h0) 3,
3293     funlist_v39 [(0,1),cstab] (&2 * h0) 3,
3294     (\i j. F),
3295     {},{},
3296     {}) in 
3297            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
3298   (* {{{ proof *)
3299   [
3300   DISCH_TAC;
3301   REWRITE_TAC[LET_DEF;LET_END_DEF];
3302   MATCH_MP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] taustar_taum_dfun);
3303   REWRITE_TAC[FUNLIST_EXPLICIT];
3304   REWRITE_TAC[Appendix.is_ear_v39;Appendix.scs_v39_explicit;EMPTY_GSPEC;NOT_INSERT_EMPTY];
3305   REWRITE_TAC[Appendix.cstab;Sphere.h0;arith `x <= x /\ &2 <= #3.01 /\ &2 <= &2 * #1.26 /\ &2 * #1.26 <= #3.01 /\ &2 <= #3.62 /\ #3.01 <= #3.62 /\ &2 * #1.26 <= #3.62 /\ #3.41 <= #3.62 /\ #3.339 <= #3.62`];
3306   REWRITE_TAC[sqrt8_bounds];
3307   REPEAT WEAKER_STRIP_TAC;
3308   INTRO_TAC ((* Appendix. *) get_main_nonlinear "3603097872") [`y3`;`y2`;`y1`;`y6`;`y5`;`y4`];
3309   TYPIFY `taum y3 y2 y1 y6 y5 y4 = taum y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN SUBST1_TAC);
3310     BY(MESON_TAC[taum_sym]);
3311   TYPIFY `delta_y y3 y2 y1 y6 y5 y4 = delta_y y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN ASSUME_TAC);
3312     BY(MESON_TAC[Merge_ineq.delta_y_sym]);
3313   REWRITE_TAC[Sphere.ineq;arith `x >= y <=> y <= x`;arith `x > y <=> y < x`;Sphere.tame_table_d];
3314   MP_TAC sqrt8_bounds;
3315   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
3316   ]);;
3317   (* }}} *)
3318
3319 *)
3320
3321 let  empty_3T1  = prove_by_refinement(
3322   `main_nonlinear_terminal_v11 ==> 
3323         (let s = scs_3T1 in
3324            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
3325   (* {{{ proof *)
3326   [
3327   REWRITE_TAC[Appendix.scs_3T1;Appendix.mk_unadorned_v39];
3328   DISCH_TAC;
3329   REWRITE_TAC[LET_DEF;LET_END_DEF];
3330   MATCH_MP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] taustar_taum_dfun);
3331   REWRITE_TAC[FUNLIST_EXPLICIT];
3332   REWRITE_TAC[Appendix.is_ear_v39;Appendix.scs_v39_explicit;EMPTY_GSPEC;NOT_INSERT_EMPTY];
3333   REWRITE_TAC[Appendix.cstab;Sphere.h0;arith `x <= x /\ &2 <= #3.01 /\ &2 <= &2 * #1.26 /\ &2 * #1.26 <= #3.01 /\ &2 <= #3.62 /\ #3.01 <= #3.62 /\ &2 * #1.26 <= #3.62 /\ #3.41 <= #3.62 /\ #3.339 <= #3.62`];
3334   REWRITE_TAC[sqrt8_bounds];
3335   REPEAT WEAKER_STRIP_TAC;
3336   INTRO_TAC ((* Appendix. *) get_main_nonlinear "3603097872") [`y3`;`y2`;`y1`;`y6`;`y5`;`y4`];
3337   TYPIFY `taum y3 y2 y1 y6 y5 y4 = taum y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN SUBST1_TAC);
3338     BY(MESON_TAC[taum_sym]);
3339   TYPIFY `delta_y y3 y2 y1 y6 y5 y4 = delta_y y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN ASSUME_TAC);
3340     BY(MESON_TAC[Merge_ineq.delta_y_sym]);
3341   REWRITE_TAC[Sphere.ineq;arith `x >= y <=> y <= x`;arith `x > y <=> y < x`;Sphere.tame_table_d];
3342   MP_TAC sqrt8_bounds;
3343   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
3344   ]);;
3345   (* }}} *)
3346
3347 let  terminal_tri_5405130650_empty  = prove_by_refinement(
3348   `main_nonlinear_terminal_v11 ==> 
3349         (let s = scs_v39  (3,
3350      #0.477 -  #0.11,
3351     funlist_v39 [(0,1),sqrt8; (0,2),&2 * h0; (1,2),&2] (&2) 3,
3352     funlist_v39 [(0,1),sqrt8; (0,2),&2 * h0; (1,2),&2] (&2) 3,
3353     funlist_v39 [(0,1),cstab; (0,2),sqrt8; (1,2),&2 * h0] (&2 * h0) 3,
3354     funlist_v39 [(0,1),cstab; (0,2),sqrt8; (1,2),&2 * h0] (&2 * h0) 3,
3355     funlistA_v39 [(0,1),T] F F 3,
3356     {},{},
3357     {}) in 
3358            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
3359   (* {{{ proof *)
3360   [
3361   DISCH_TAC;
3362   REWRITE_TAC[LET_DEF;LET_END_DEF];
3363   MATCH_MP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] taustar_taum_dfun);
3364   REWRITE_TAC[FUNLIST_EXPLICIT];
3365   REWRITE_TAC[Appendix.is_ear_v39;Appendix.scs_v39_explicit;arith `~(#0.477 - #0.11 = #0.11)`];
3366   REWRITE_TAC[Appendix.cstab;Sphere.h0;arith `x <= x /\ &2 <= #3.01 /\ &2 <= &2 * #1.26 /\ &2 * #1.26 <= #3.01 /\ &2 <= #3.62 /\ #3.01 <= #3.62 /\ &2 * #1.26 <= #3.62 /\ #3.41 <= #3.62 /\ #3.339 <= #3.62`];
3367   REWRITE_TAC[sqrt8_bounds];
3368   REPEAT WEAKER_STRIP_TAC;
3369   INTRO_TAC ((* Appendix. *) get_main_nonlinear "5405130650") [`y3`;`y2`;`y1`;`y6`;`y5`;`y4`];
3370   TYPIFY `taum y3 y2 y1 y6 y5 y4 = taum y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN SUBST1_TAC);
3371     BY(MESON_TAC[taum_sym]);
3372   TYPIFY `delta_y y3 y2 y1 y6 y5 y4 = delta_y y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN ASSUME_TAC);
3373     BY(MESON_TAC[Merge_ineq.delta_y_sym]);
3374   REWRITE_TAC[Sphere.ineq;arith `x >= y <=> y <= x`;arith `x > y <=> y < x`;Sphere.tame_table_d];
3375   MP_TAC sqrt8_bounds;
3376   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
3377   ]);;
3378   (* }}} *)
3379
3380 (*
3381 let  terminal_tri_5766053833_empty  = prove_by_refinement(
3382   `main_nonlinear_terminal_v11 ==> 
3383         (let s = scs_v39 (3,
3384      #0.696 -  #2.0 *  #0.11,
3385     funlist_v39 [(0,1),sqrt8; (1,2),sqrt8] (&2) 3,
3386     funlist_v39 [(0,1),sqrt8; (1,2),sqrt8] (&2) 3,
3387     funlist_v39 [(0,1),cstab; (1,2),cstab] (&2) 3,
3388     funlist_v39 [(0,1),cstab; (1,2),cstab] (&2) 3,
3389     funlistA_v39 [(0,1),T; (1,2),T] F F 3,
3390     {},{},
3391     {}) in 
3392            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
3393   (* {{{ proof *)
3394   [
3395   DISCH_TAC;
3396   REWRITE_TAC[LET_DEF;LET_END_DEF];
3397   MATCH_MP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] taustar_taum_dfun);
3398   REWRITE_TAC[FUNLIST_EXPLICIT];
3399   REWRITE_TAC[Appendix.is_ear_v39;Appendix.scs_v39_explicit;arith `~(#0.696 - #2.0* #0.11 = #0.11)`];
3400   REWRITE_TAC[Appendix.cstab;Sphere.h0;arith `x <= x /\ &2 <= #3.01 /\ &2 <= &2 * #1.26 /\ &2 * #1.26 <= #3.01 /\ &2 <= #3.62 /\ #3.01 <= #3.62 /\ &2 * #1.26 <= #3.62 /\ #3.41 <= #3.62 /\ #3.339 <= #3.62`];
3401   REWRITE_TAC[sqrt8_bounds];
3402   REPEAT WEAKER_STRIP_TAC;
3403   INTRO_TAC ((* Appendix. *) get_main_nonlinear "5766053833") [`y2`;`y1`;`y3`;`y5`;`y4`;`y6`];
3404   TYPIFY `taum y2 y1 y3 y5 y4 y6 = taum y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN SUBST1_TAC);
3405     BY(MESON_TAC[taum_sym]);
3406   TYPIFY `delta_y y2 y1 y3 y5 y4 y6 = delta_y y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN ASSUME_TAC);
3407     BY(MESON_TAC[Merge_ineq.delta_y_sym]);
3408   REWRITE_TAC[Sphere.ineq;arith `x >= y <=> y <= x`;arith `x > y <=> y < x`;Sphere.tame_table_d];
3409   MP_TAC sqrt8_bounds;
3410   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC)
3411   ]);;
3412   (* }}} *)
3413 *)
3414
3415 (* ************************************************************************** *)
3416 (* START OF QUAD CASES *)
3417 (* ************************************************************************** *)
3418
3419 (* renamed from  terminal__adhoc_quad_5691615370_empty *)
3420 let empty_4T1  = prove_by_refinement(
3421   `main_nonlinear_terminal_v11 ==> 
3422         (let s = scs_4T1 in
3423 //mk_unadorned_v39 4  #0.467 (cs_adj 4 (&2) (&3)) (cs_adj 4 (&2) (&6)) in
3424            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))` ,
3425   (* {{{ proof *)
3426   [
3427   REWRITE_TAC[Appendix.scs_4T1];
3428   DISCH_TAC;
3429   REWRITE_TAC[LET_DEF;LET_END_DEF];
3430   REWRITE_TAC[Appendix.BBs_v39;Appendix.mk_unadorned_v39;Appendix.cs_adj;Appendix.scs_v39_explicit];
3431   REWRITE_TAC[LET_DEF;LET_END_DEF;arith `~(4 <= 3)`];
3432   REPEAT WEAKER_STRIP_TAC;
3433   PROOF_BY_CONTR_TAC;
3434   REPLICATE_TAC 2 (FIRST_X_ASSUM kill);
3435   ASSUME_TAC MOD_4_EXPLICIT;
3436   ASSUME_TAC (arith `SUC 0 = 1 /\ SUC 1 = 2 /\ SUC 2 = 3 /\ SUC 3 = 4`);
3437   FIRST_ASSUM (C INTRO_TAC [`0`;`1`]);
3438   FIRST_ASSUM (C INTRO_TAC [`0`;`2`]);
3439   FIRST_ASSUM (C INTRO_TAC [`0`;`3`]);
3440   FIRST_ASSUM (C INTRO_TAC [`1`;`2`]);
3441   FIRST_ASSUM (C INTRO_TAC [`1`;`3`]);
3442   FIRST_X_ASSUM (C INTRO_TAC [`2`;`3`]);
3443   ASM_REWRITE_TAC[arith `~(1 = 3) /\ ~(2 = 3) /\ ~(1 = 2) /\ ~(0 = 1) /\ ~(0=2) /\ ~(0=3)`];
3444   REPEAT WEAKER_STRIP_TAC;
3445   TYPIFY `dist(vv 2,vv 3) = &2 /\ dist(vv 1,vv 2) = &2 /\ dist(vv 0, vv 3) = &2 /\ dist(vv 0,vv 1) = &2` (C SUBGOAL_THEN ASSUME_TAC);
3446     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
3447   INTRO_TAC DELTA_Y_POS_4POINTS [`vv 0 `;`vv 1`;`vv 2`;`vv 3`];
3448   ASM_REWRITE_TAC[Sphere.delta_y;Sphere.delta_x];
3449   TYPIFY `&9 <= dist(vv 1, vv 3) * dist(vv 1, vv 3) /\ &9 <= dist(vv 0 , vv 2) * dist(vv 0,vv 2)` (C SUBGOAL_THEN ASSUME_TAC);
3450     REWRITE_TAC[arith `&9 = &3 * &3`];
3451     GMATCH_SIMP_TAC Misc_defs_and_lemmas.ABS_SQUARE_LE;
3452     GMATCH_SIMP_TAC Misc_defs_and_lemmas.ABS_SQUARE_LE;
3453     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
3454   TYPED_ABBREV_TAC  `y2 = dist(vv 1,vv 3) * dist(vv 1,vv 3)` ;
3455   TYPED_ABBREV_TAC  `z2 = dist(vv 0,vv 2) * dist(vv 0,vv 2)` ;
3456   REWRITE_TAC[arith `&2 * &2 = &4`];
3457   REWRITE_TAC[arith `&4 * &4 * (-- &4 + z2 + &4 - &4 + y2 + &4) +   z2 * y2 * (&4 - z2 + &4 + &4 - y2 + &4) +   &4 * &4 * (&4 + z2 - &4 + &4 + y2 - &4) -   z2 * &4 * &4 -   &4 * &4 * y2 -   &4 * z2 * &4 -   &4 * y2 * &4  = -- ( y2 *z2 *(  y2 + z2 - &16))`];
3458   REWRITE_TAC[arith `~(&0 <= -- x ) <=> (&0 <  x)`];
3459   GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
3460   GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
3461   BY(REPLICATE_TAC 3 (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC)
3462   ]);;
3463   (* }}} *)
3464
3465 let ineq_5691615370_asym = prove_by_refinement(
3466    `main_nonlinear_terminal_v11 ==> (!y1 y2 y3 y4 y5 y6. ineq
3467   [
3468   (#3.0,y1,#3.0);
3469   (&2,y2,#2.52);
3470   (&2,y3,#2.52);
3471   (#3.0,y4,#3.0);
3472   (&2,y5,#2.52);
3473   (&2,y6,#2.52)
3474   ]
3475   ((delta_y y1 y2 y3 y4 y5 y6 < &0) \/ (y2 + y3 + y5 + y6 > #8.472)))`,
3476   (* {{{ proof *)
3477   [
3478   DISCH_TAC;
3479   ONCE_REWRITE_TAC[MESON[] `(!y1 y2 y3 y4 y5 y6. P y1 y2 y3 y4 y5 y6) <=> (! y2 y3 y5 y6 y1 y4. P y1 y2 y3 y4 y5 y6)`];
3480   MATCH_MP_TAC REAL_WLOG_SQUARE2_LEMMA;
3481   CONJ_TAC;
3482     REWRITE_TAC[Sphere.ineq];
3483     REPEAT WEAKER_STRIP_TAC;
3484     TYPIFY `y2' + y5 + y6 + y2 = y2 + y2' + y5 + y6` (C SUBGOAL_THEN SUBST1_TAC);
3485       BY(REAL_ARITH_TAC);
3486     TYPIFY `y2 + y6 + y5 + y2' = y2 + y2' + y5 + y6` (C SUBGOAL_THEN SUBST1_TAC);
3487       BY(REAL_ARITH_TAC);
3488     TYPIFY `delta_y y4 y2' y5 y1 y6 y2 = delta_y y1 y2 y2' y4 y5 y6` (C SUBGOAL_THEN SUBST1_TAC);
3489       BY(REWRITE_TAC[Sphere.delta_y;Sphere.delta_x] THEN REAL_ARITH_TAC);
3490     CONJ_TAC;
3491       BY(REWRITE_TAC[Sphere.delta_y;Sphere.delta_x] THEN REAL_ARITH_TAC);
3492     BY(REWRITE_TAC[Sphere.delta_y;Sphere.delta_x] THEN REAL_ARITH_TAC);
3493   REPEAT WEAKER_STRIP_TAC;
3494   REWRITE_TAC[Sphere.ineq];
3495   REPEAT WEAKER_STRIP_TAC;
3496   INTRO_TAC ((* Appendix. *) get_main_nonlinear "5691615370") [`y1`;`y2`;`y2'`;`y4`;`y5`;`y6`];
3497   REWRITE_TAC[Sphere.ineq];
3498   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC)
3499   ]);;
3500   (* }}} *)
3501
3502 let terminal_quad_lemma = prove_by_refinement(
3503   `main_nonlinear_terminal_v11 ==> 
3504    (!d a b . 
3505         (let s = mk_unadorned_v39 4  d a b in
3506            (!i j. i < 4 /\ j < 4 /\ ~(i = j) ==> &0 < a i j) /\
3507    (!vv. IMAGE vv (:num) SUBSET ball_annulus /\
3508     periodic vv 4 /\
3509     (!i j. a i j <= dist (vv i,vv j) /\ dist (vv i,vv j) <= b i j) /\
3510     (convex_local_fan
3511       (IMAGE vv (:num),
3512        IMAGE (\i. {vv i, vv (SUC i)}) (:num),
3513        IMAGE (\i. vv i,vv (SUC i)) (:num))) ==>
3514  (d <=
3515  (rho_fun (norm (vv 0)) * azim (vec 0) (vv 0) (vv 1) (vv 3) +
3516   rho_fun (norm (vv 1)) * azim (vec 0) (vv 1) (vv 2) (vv 4) +
3517   rho_fun (norm (vv 2)) * azim (vec 0) (vv 2) (vv 3) (vv 5) +
3518   rho_fun (norm (vv 3)) * azim (vec 0) (vv 3) (vv 4) (vv 6) +
3519   &0) -
3520  (pi + sol0) * (&4 - &2) 
3521  )) ==>
3522            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv)))` ,
3523   (* {{{ proof *)
3524   [
3525   DISCH_TAC;
3526   REWRITE_TAC[LET_THM];
3527   REWRITE_TAC[Appendix.BBs_v39;Appendix.mk_unadorned_v39;Appendix.scs_v39_explicit;Appendix.taustar_v39];
3528   REWRITE_TAC[LET_THM;arith `~(4 <= 3)`;dsv_fun4];
3529   REWRITE_TAC[arith `d -  #0.1 * (&0 + &0 + &0 + &0 + &0) = d`];
3530   REPEAT WEAKER_STRIP_TAC;
3531   COMMENT "expand tau_fun";
3532   GMATCH_SIMP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] tau_fun_azim);
3533   TYPIFY `4` EXISTS_TAC;
3534   ASM_SIMP_TAC[arith `3 <= 4`];
3535   CONJ_TAC;
3536     REPEAT WEAKER_STRIP_TAC;
3537     PROOF_BY_CONTR_TAC;
3538     FIRST_X_ASSUM (C INTRO_TAC [`i`;`j`]);
3539     ASM_REWRITE_TAC[DIST_REFL];
3540     REWRITE_TAC[DE_MORGAN_THM;arith `~(a <= &0) <=> &0 < a`];
3541     BY(ASM_MESON_TAC[]);
3542   TYPIFY `{i | i < 4 } = {0,1,2,3}` (C SUBGOAL_THEN SUBST1_TAC);
3543     REWRITE_TAC[EXTENSION;IN_ELIM_THM;IN_INSERT;NOT_IN_EMPTY];
3544     BY(ARITH_TAC);
3545   REPEAT (GMATCH_SIMP_TAC Marchal_cells_2_new.SUM_CLAUSES_alt);
3546   REWRITE_TAC[SUM_CLAUSES;IN_INSERT;NOT_IN_EMPTY;arith `~(2 = 3) /\ ~(0 = 1) /\ ~(0 = 2) /\ ~(0 = 3) /\ ~(1 = 2) /\ ~(1 = 3) /\ ~(1  = 2) /\ ~(1 = 3)`;FINITE_INSERT;FINITE_EMPTY];
3547   REWRITE_TAC[arith `0 + 1 = 1 /\ 1 + 1 = 2 /\ 2 + 1  = 3 /\ 3 + 1 = 4 /\ 0 + 4 -1 = 3 /\ 1 + 4 -1 = 4 /\ 2 + 4 - 1 = 5 /\ 3 + 4 - 1 = 6`];
3548   COMMENT "next";
3549   REWRITE_TAC[arith `&0 <= r - d <=> d <= r`];
3550   FIRST_X_ASSUM MATCH_MP_TAC;
3551   BY(ASM_REWRITE_TAC[])
3552   ]);;
3553   (* }}} *)
3554
3555 (* renamed from terminal_adhoc_quad_9563139965B_empty *)
3556 let empty_4T2  = prove_by_refinement(
3557   `main_nonlinear_terminal_v11 ==> 
3558         (let s = scs_4T2 in // mk_unadorned_v39 4  #0.467 (cs_adj 4 (&2) (&3)) (cs_adj 4 (&2 * h0) (&3)) in
3559            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))`,
3560   (* {{{ proof *)
3561   [
3562   REWRITE_TAC[Appendix.scs_4T2];
3563   REPEAT WEAKER_STRIP_TAC;
3564   REWRITE_TAC[LET_THM];
3565   MATCH_MP_TAC (REWRITE_RULE[LET_THM] (UNDISCH terminal_quad_lemma));
3566   COMMENT "digression";
3567   TYPIFY `(!i j. i < 4 /\ j < 4 /\ ~(i = j) ==> &2 <= cs_adj 4 (&2) (&3) i j) ` (C SUBGOAL_THEN ASSUME_TAC);
3568     REWRITE_TAC[arith `i < 4 <=> (i = 0 \/ i = 1 \/ i = 2 \/ i = 3)`];
3569     REWRITE_TAC[TAUT `(a \/ b) /\ c <=> a /\ c \/ b /\ c`;TAUT `a /\ (b \/ c) <=> (a /\ b) \/ a /\ c`];
3570     REWRITE_TAC[Appendix.cs_adj];
3571     REPEAT WEAKER_STRIP_TAC;
3572     BY(REPEAT (FIRST_X_ASSUM DISJ_CASES_TAC) THEN ASM_REWRITE_TAC[arith `SUC 0 = 1 /\ SUC 1 = 2 /\ SUC 2 = 3 /\ SUC 3 = 4`;MOD_4_EXPLICIT;arith `&2 <= &2 /\ &2 <= &3`;arith `~(0=1) /\ ~(0=2) /\ ~(0=3) /\ ~(1 =2) /\ ~(1 = 3) /\ ~(2 = 3)`] THEN ASM_MESON_TAC[]);
3573   COMMENT "digress2";
3574   TYPIFY `!i j. i < 4 /\ j < 4 /\ ~(i = j) ==>  cs_adj 4 (&2 * h0) (&3) i j < &4` (C SUBGOAL_THEN ASSUME_TAC);
3575     REWRITE_TAC[arith `i < 4 <=> (i = 0 \/ i = 1 \/ i = 2 \/ i = 3)`];
3576     REWRITE_TAC[TAUT `(a \/ b) /\ c <=> a /\ c \/ b /\ c`;TAUT `a /\ (b \/ c) <=> (a /\ b) \/ a /\ c`];
3577     REWRITE_TAC[Appendix.cs_adj;Sphere.h0];
3578     REPEAT WEAKER_STRIP_TAC;
3579     BY(REPEAT (FIRST_X_ASSUM DISJ_CASES_TAC) THEN ASM_REWRITE_TAC[arith `SUC 0 = 1 /\ SUC 1 = 2 /\ SUC 2 = 3 /\ SUC 3 = 4`;MOD_4_EXPLICIT;arith `&2 * #1.26 < &4 /\ &3 < &4`;arith `~(0=1) /\ ~(0=2) /\ ~(0=3) /\ ~(1 =2) /\ ~(1 = 3) /\ ~(2 = 3)`] THEN ASM_MESON_TAC[]);
3580   CONJ_TAC;
3581     BY(ASM_MESON_TAC[arith `&2 <= x ==> &0 < x`]);
3582   REPEAT WEAKER_STRIP_TAC;
3583   REWRITE_TAC[arith `x + &0 = x /\ &4 - &2 = &2`];
3584   TYPIFY `(!i j. i < 4 /\ j < 4 /\ vv i = vv j ==> i = j)` (C SUBGOAL_THEN ASSUME_TAC);
3585     REPEAT WEAKER_STRIP_TAC;
3586     PROOF_BY_CONTR_TAC;
3587     BY(ASM_MESON_TAC[DIST_REFL;REAL_LE_TRANS;arith `~(&2 <= &0)`]);
3588   COMMENT "vv";
3589   TYPIFY `vv 4 = vv 0 /\ vv 5 = vv 1 /\ vv 6 = vv 2` (C SUBGOAL_THEN ASSUME_TAC);
3590     BY((REPEAT CONJ_TAC) THEN GMATCH_SIMP_TAC periodic_vv_inj THEN TYPIFY `4` EXISTS_TAC THEN ASM_REWRITE_TAC[MOD_4_EXPLICIT;arith `~(4 = 0)`]);
3591   ASM_REWRITE_TAC[];
3592   GMATCH_SIMP_TAC (REWRITE_RULE[LET_THM] vv_quad_split012);
3593   ASM_REWRITE_TAC[];
3594   COMMENT "dist";
3595   SUBCONJ_TAC;
3596     TYPIFY `(!i j. ~(vv i = vv j) ==> &2 <= dist (vv i,vv j))` (C SUBGOAL_THEN ASSUME_TAC);
3597       MATCH_MP_TAC periodic2_mod_reduce;
3598       TYPIFY `4` EXISTS_TAC;
3599       REWRITE_TAC[Appendix.periodic2;arith `~(4 = 0)`];
3600       TYPIFY `!i. vv (i + 4) = vv i` (C SUBGOAL_THEN (unlist REWRITE_TAC));
3601         BY(ASM_MESON_TAC[Oxl_def.periodic;arith `~(4 = 0)`]);
3602       REPEAT WEAKER_STRIP_TAC;
3603       BY(ASM_MESON_TAC[REAL_LE_TRANS]);
3604     ASM_REWRITE_TAC[];
3605     BY(ASM_MESON_TAC[REAL_LET_TRANS;arith `0 < 4 /\ 1 < 4 /\ 2 < 4 /\ 3 < 4 /\ ~(0=1) /\ ~(0=2) /\ ~(0=3) /\ ~(1=2) /\ ~(2 =3)`]);
3606   COMMENT "tau3";
3607   REPEAT WEAKER_STRIP_TAC;
3608   REPEAT (GMATCH_SIMP_TAC tau3_taum_40);
3609   ASM_REWRITE_TAC[];
3610   RULE_ASSUM_TAC(REWRITE_RULE[IMAGE_SUBSET_IN;IN_UNIV]);
3611   ASM_REWRITE_TAC[];
3612   TYPIFY `dist (vv 2,vv 0) < &4 /\   dist (vv 3,vv 0) < &4 ` (C SUBGOAL_THEN (unlist REWRITE_TAC));
3613     ONCE_REWRITE_TAC[DIST_SYM];
3614     BY(ASM_REWRITE_TAC[]);
3615   REWRITE_TAC[TAUT `a /\ b /\ c <=> (a /\ b) /\ c`];
3616   CONJ_TAC;
3617     BY(ASM_MESON_TAC[REAL_LE_TRANS;arith `1 < 4 /\ 2 < 4 /\ 3 < 4 /\ 0 < 4 /\ ~(2=3) /\ ~(2  =0) /\ ~(3 =0) /\ ~(0 = 1) /\ ~(0=2) /\ ~(1 = 2)`]);
3618   TYPIFY `dist(vv 3,vv 0) = dist(vv 0,vv 3) /\ dist(vv 2, vv 0) = dist(vv 0,vv 2)` (C SUBGOAL_THEN (unlist REWRITE_TAC));
3619     BY(MESON_TAC[DIST_SYM]);
3620   COMMENT "prep dist";
3621   TYPIFY `(!i j d. d <= cs_adj 4 (&2) (&3) i j  ==> d <= dist (vv i,vv j)) /\ (!i j d. cs_adj 4 (&2 * h0) (&3) i j        <= d ==>   dist (vv i,vv j) <= d)` (C SUBGOAL_THEN MP_TAC);
3622     BY(ASM_MESON_TAC[REAL_LE_TRANS]);
3623   REPEAT WEAKER_STRIP_TAC;
3624   INTRO_TAC cs_adj4_EXPLICIT [`&2`;`&3`];
3625   INTRO_TAC cs_adj4_EXPLICIT [`&2 * h0`;`&3`];
3626   REPEAT WEAKER_STRIP_TAC;
3627   COMMENT "fist get";
3628   INTRO_TAC (UNDISCH ineq_5691615370_asym) [`dist (vv 0,vv 2)`;`dist(vv 0, vv 1)`;`dist(vv 0, vv 3)`;`dist(vv 1,vv 3)`;`dist(vv 2,vv 3)`;`dist(vv 2,vv 1)`];
3629   TYPIFY `~(delta_y (dist (vv 0,vv 2)) (dist (vv 0,vv 1)) (dist (vv 0,vv 3))       (dist (vv 1,vv 3))      (dist (vv 2,vv 3))      (dist (vv 2,vv 1)) <      &0)` (C SUBGOAL_THEN (unlist REWRITE_TAC));
3630     MATCH_MP_TAC (arith `&0 <= d ==> ~(d < &0)`);
3631     BY(REWRITE_TAC[DELTA_Y_POS_4POINTS]);
3632   REWRITE_TAC[];
3633   TYPIFY `dist(vv 2,vv 1) = dist(vv 1, vv 2)` (C SUBGOAL_THEN SUBST1_TAC);
3634     BY(MESON_TAC[DIST_SYM]);
3635   REWRITE_TAC[Sphere.ineq];
3636   REWRITE_TAC[TAUT `(a ==> b==> c) <=> (a /\ b) ==> c `;TAUT `(a /\ b) /\ c <=> a /\ b /\ c`];
3637   ANTS_TAC;
3638     BY(REPEAT CONJ_TAC THEN (FIRST_X_ASSUM MATCH_MP_TAC) THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[Sphere.h0] THEN TRY REAL_ARITH_TAC);
3639   DISCH_TAC;
3640   COMMENT "norms";
3641   RULE_ASSUM_TAC(REWRITE_RULE[Fnjlbxs.in_ball_annulus]);
3642   COMMENT "second get";
3643   TYPIFY `dist (vv 0,vv 1) <= #2.472 /\ dist(vv 1,vv 2) <= #2.472 /\ dist(vv 2,vv 3) <= #2.472 /\ dist(vv 0,vv 3) <= #2.472` ASM_CASES_TAC;
3644     INTRO_TAC ((* Appendix. *) get_main_nonlinear "9563139965 d") [`norm(vv 1)`;`norm (vv 2)`;`norm (vv 0)`;`dist(vv 0,vv 2)`;`dist(vv 0,vv 1)`;`dist(vv 1,vv 2)`];
3645     REWRITE_TAC[Sphere.ineq];
3646     REWRITE_TAC[TAUT `(a ==> b==> c) <=> (a /\ b) ==> c `;TAUT `(a /\ b) /\ c <=> a /\ b /\ c`];
3647     ANTS_TAC;
3648       ASM_REWRITE_TAC[];
3649       BY(REPEAT CONJ_TAC THEN (FIRST_X_ASSUM MATCH_MP_TAC) THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[Sphere.h0] THEN TRY REAL_ARITH_TAC);
3650     DISCH_TAC;
3651     INTRO_TAC ((* Appendix. *) get_main_nonlinear "9563139965 d") [`norm(vv 3)`;`norm (vv 2)`;`norm (vv 0)`;`dist(vv 0,vv 2)`;`dist(vv 0,vv 3)`;`dist(vv 2,vv 3)`];
3652     REWRITE_TAC[Sphere.ineq];
3653     REWRITE_TAC[TAUT `(a ==> b==> c) <=> (a /\ b) ==> c `;TAUT `(a /\ b) /\ c <=> a /\ b /\ c`];
3654     ANTS_TAC;
3655       ASM_REWRITE_TAC[];
3656       BY(REPEAT CONJ_TAC THEN (FIRST_X_ASSUM MATCH_MP_TAC) THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[Sphere.h0] THEN TRY REAL_ARITH_TAC);
3657     DISCH_TAC;
3658     TYPIFY `taum (norm (vv 0)) (norm (vv 1)) (norm (vv 2)) (dist (vv 1,vv 2))  (dist (vv 0,vv 2)) (dist (vv 0,vv 1)) = taum (norm (vv 1)) (norm (vv 2)) (norm (vv 0)) (dist (vv 0,vv 2))      (dist (vv 0,vv 1))      (dist (vv 1,vv 2)) /\ taum (norm (vv 2)) (norm (vv 3)) (norm (vv 0)) (dist (vv 0,vv 3)) (dist (vv 0,vv 2)) (dist (vv 2,vv 3)) = taum (norm (vv 3)) (norm (vv 2)) (norm (vv 0)) (dist (vv 0,vv 2))      (dist (vv 0,vv 3))      (dist (vv 2,vv 3))` ENOUGH_TO_SHOW_TAC;
3659       DISCH_THEN (unlist REWRITE_TAC);
3660       BY(REPLICATE_TAC 4 (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
3661     BY(MESON_TAC[taum_sym]);
3662   COMMENT "third get";
3663   INTRO_TAC ((* Appendix. *) get_main_nonlinear "9563139965 f") [`norm(vv 1)`;`norm (vv 2)`;`norm (vv 0)`;`dist(vv 0,vv 2)`;`dist(vv 0,vv 1)`;`dist(vv 1,vv 2)`];
3664   REWRITE_TAC[Sphere.ineq];
3665   REWRITE_TAC[TAUT `(a ==> b==> c) <=> (a /\ b) ==> c `;TAUT `(a /\ b) /\ c <=> a /\ b /\ c`];
3666   ANTS_TAC;
3667     ASM_REWRITE_TAC[];
3668     BY(REPEAT CONJ_TAC THEN (FIRST_X_ASSUM MATCH_MP_TAC) THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[Sphere.h0] THEN TRY REAL_ARITH_TAC);
3669   TYPIFY `taum (norm (vv 1)) (norm (vv 2)) (norm (vv 0)) (dist (vv 0,vv 2)) (dist (vv 0,vv 1)) (dist (vv 1,vv 2)) = taum (norm (vv 0)) (norm (vv 1)) (norm (vv 2)) (dist (vv 1,vv 2))     (dist (vv 0,vv 2))     (dist (vv 0,vv 1))` (C SUBGOAL_THEN SUBST1_TAC);
3670     BY(MESON_TAC[taum_sym]);
3671   DISCH_TAC;
3672   INTRO_TAC ((* Appendix. *) get_main_nonlinear "9563139965 f") [`norm(vv 3)`;`norm (vv 2)`;`norm (vv 0)`;`dist(vv 0,vv 2)`;`dist(vv 0,vv 3)`;`dist(vv 2,vv 3)`];
3673   REWRITE_TAC[Sphere.ineq];
3674   REWRITE_TAC[TAUT `(a ==> b==> c) <=> (a /\ b) ==> c `;TAUT `(a /\ b) /\ c <=> a /\ b /\ c`];
3675   ANTS_TAC;
3676     ASM_REWRITE_TAC[];
3677     BY(REPEAT CONJ_TAC THEN (FIRST_X_ASSUM MATCH_MP_TAC) THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[Sphere.h0] THEN TRY REAL_ARITH_TAC);
3678   TYPIFY `taum (norm (vv 3)) (norm (vv 2)) (norm (vv 0)) (dist (vv 0,vv 2)) (dist (vv 0,vv 3)) (dist (vv 2,vv 3)) = taum (norm (vv 2)) (norm (vv 3)) (norm (vv 0)) (dist (vv 0,vv 3))     (dist (vv 0,vv 2))     (dist (vv 2,vv 3))` (C SUBGOAL_THEN SUBST1_TAC);
3679     BY(MESON_TAC[taum_sym]);
3680   DISCH_TAC;
3681   FIRST_X_ASSUM_ST `~` MP_TAC;
3682   REWRITE_TAC[DE_MORGAN_THM];
3683   COMMENT "four cases on top edge";
3684   DISCH_TAC THEN REPEAT (FIRST_X_ASSUM DISJ_CASES_TAC);
3685         INTRO_TAC ((* Appendix. *) get_main_nonlinear "9563139965 e") [`norm(vv 1)`;`norm (vv 2)`;`norm (vv 0)`;`dist(vv 0,vv 2)`;`dist(vv 0,vv 1)`;`dist(vv 1,vv 2)`];
3686         REWRITE_TAC[Sphere.ineq];
3687         REWRITE_TAC[TAUT `(a ==> b==> c) <=> (a /\ b) ==> c `;TAUT `(a /\ b) /\ c <=> a /\ b /\ c`];
3688         ANTS_TAC;
3689           ASM_REWRITE_TAC[];
3690           TYPIFY `#2.467 <= dist(vv 0,vv 1)` (C SUBGOAL_THEN (unlist REWRITE_TAC));
3691             BY(FIRST_X_ASSUM MP_TAC THEN REAL_ARITH_TAC);
3692           BY(REPEAT CONJ_TAC THEN (FIRST_X_ASSUM MATCH_MP_TAC) THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[Sphere.h0] THEN FIRST_X_ASSUM MP_TAC THEN TRY REAL_ARITH_TAC);
3693         TYPIFY `taum (norm (vv 1)) (norm (vv 2)) (norm (vv 0)) (dist (vv 0,vv 2)) (dist (vv 0,vv 1)) (dist (vv 1,vv 2)) = taum (norm (vv 0)) (norm (vv 1)) (norm (vv 2)) (dist (vv 1,vv 2))     (dist (vv 0,vv 2))     (dist (vv 0,vv 1))` (C SUBGOAL_THEN SUBST1_TAC);
3694           BY(MESON_TAC[taum_sym]);
3695         BY(REPLICATE_TAC 3 (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
3696       COMMENT "3 left";
3697       INTRO_TAC ((* Appendix. *) get_main_nonlinear "9563139965 e") [`norm(vv 1)`;`norm (vv 0)`;`norm (vv 2)`;`dist(vv 0,vv 2)`;`dist(vv 1,vv 2)`;`dist(vv 0,vv 1)`];
3698       REWRITE_TAC[Sphere.ineq];
3699       REWRITE_TAC[TAUT `(a ==> b==> c) <=> (a /\ b) ==> c `;TAUT `(a /\ b) /\ c <=> a /\ b /\ c`];
3700       ANTS_TAC;
3701         ASM_REWRITE_TAC[];
3702         TYPIFY `#2.467 <= dist(vv 1,vv 2)` (C SUBGOAL_THEN (unlist REWRITE_TAC));
3703           BY(FIRST_X_ASSUM MP_TAC THEN REAL_ARITH_TAC);
3704         BY(REPEAT CONJ_TAC THEN (FIRST_X_ASSUM MATCH_MP_TAC) THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[Sphere.h0] THEN FIRST_X_ASSUM MP_TAC THEN TRY REAL_ARITH_TAC);
3705       TYPIFY `taum (norm (vv 1)) (norm (vv 0)) (norm (vv 2)) (dist (vv 0,vv 2)) (dist (vv 1,vv 2)) (dist (vv 0,vv 1)) = taum (norm (vv 0)) (norm (vv 1)) (norm (vv 2)) (dist (vv 1,vv 2))     (dist (vv 0,vv 2))     (dist (vv 0,vv 1))` (C SUBGOAL_THEN SUBST1_TAC);
3706         BY(MESON_TAC[taum_sym]);
3707       BY(REPLICATE_TAC 3 (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
3708     COMMENT "2 left";
3709     INTRO_TAC ((* Appendix. *) get_main_nonlinear "9563139965 e") [`norm(vv 3)`;`norm (vv 0)`;`norm (vv 2)`;`dist(vv 0,vv 2)`;`dist(vv 2,vv 3)`;`dist(vv 0,vv 3)`];
3710     REWRITE_TAC[Sphere.ineq];
3711     REWRITE_TAC[TAUT `(a ==> b==> c) <=> (a /\ b) ==> c `;TAUT `(a /\ b) /\ c <=> a /\ b /\ c`];
3712     ANTS_TAC;
3713       ASM_REWRITE_TAC[];
3714       TYPIFY `#2.467 <= dist(vv 2,vv 3)` (C SUBGOAL_THEN (unlist REWRITE_TAC));
3715         BY(FIRST_X_ASSUM MP_TAC THEN REAL_ARITH_TAC);
3716       BY(REPEAT CONJ_TAC THEN (FIRST_X_ASSUM MATCH_MP_TAC) THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[Sphere.h0] THEN FIRST_X_ASSUM MP_TAC THEN TRY REAL_ARITH_TAC);
3717     TYPIFY `taum (norm (vv 3)) (norm (vv 0)) (norm (vv 2)) (dist (vv 0,vv 2)) (dist (vv 2,vv 3)) (dist (vv 0,vv 3)) = taum (norm (vv 2)) (norm (vv 3)) (norm (vv 0)) (dist (vv 0,vv 3))     (dist (vv 0,vv 2))     (dist (vv 2,vv 3))` (C SUBGOAL_THEN SUBST1_TAC);
3718       BY(MESON_TAC[taum_sym]);
3719     BY(REPLICATE_TAC 3 (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
3720   COMMENT "1 left";
3721   INTRO_TAC ((* Appendix. *) get_main_nonlinear "9563139965 e") [`norm(vv 3)`;`norm (vv 2)`;`norm (vv 0)`;`dist(vv 0,vv 2)`;`dist(vv 0,vv 3)`;`dist(vv 2,vv 3)`];
3722   REWRITE_TAC[Sphere.ineq];
3723   REWRITE_TAC[TAUT `(a ==> b==> c) <=> (a /\ b) ==> c `;TAUT `(a /\ b) /\ c <=> a /\ b /\ c`];
3724   ANTS_TAC;
3725     ASM_REWRITE_TAC[];
3726     TYPIFY `#2.467 <= dist(vv 0,vv 3)` (C SUBGOAL_THEN (unlist REWRITE_TAC));
3727       BY(FIRST_X_ASSUM MP_TAC THEN REAL_ARITH_TAC);
3728     BY(REPEAT CONJ_TAC THEN (FIRST_X_ASSUM MATCH_MP_TAC) THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[Sphere.h0] THEN FIRST_X_ASSUM MP_TAC THEN TRY REAL_ARITH_TAC);
3729   TYPIFY `taum (norm (vv 3)) (norm (vv 2)) (norm (vv 0)) (dist (vv 0,vv 2)) (dist (vv 0,vv 3)) (dist (vv 2,vv 3)) =  taum (norm (vv 2)) (norm (vv 3)) (norm (vv 0)) (dist (vv 0,vv 3))     (dist (vv 0,vv 2))     (dist (vv 2,vv 3))` (C SUBGOAL_THEN SUBST1_TAC);
3730     BY(MESON_TAC[taum_sym]);
3731   BY(REPLICATE_TAC 3 (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC)
3732   ]);;
3733   (* }}} *)
3734
3735 let quad_4680581274_derived = prove_by_refinement(
3736   `main_nonlinear_terminal_v11 ==> (!y0 y1 y2 y3 y4 y5 y6 y7 y8 y9.  ineq [
3737       (#3.01,y0,&4);
3738       (#2.0,y1,&2 * h0);
3739       (#2.0,y2,&2 * h0);
3740       (#2.0,y3,&2 * h0);
3741       (#3.01,y4,&4);
3742       (#2.0,y5,&2);
3743       (#2.0,y6,&2);
3744       (#2.0,y7,&2 * h0);
3745       (#2.0,y8,&2);
3746       (#3.01,y9,#3.01)]
3747
3748    (enclosed y1 y5 y6 y4 y2 y3 y7 y8 y9 = y0) /\ 
3749   ( y4 <= y0 ) /\ &0 <=  delta_y y0 y9 y8 y4 y5 y6 ==>
3750   // #0.616 - #0.11 
3751   #0.513
3752    < tauq y1 y2 y3 y4 y5 y6 y7 y8 y9 ))
3753 `,
3754   (* {{{ proof *)
3755   [
3756   REWRITE_TAC[Sphere.ineq;TAUT `(a ==> b==> c) <=> (a /\ b) ==> c `;TAUT `(a /\ b) /\ c <=> a /\ b /\ c`];
3757   REPEAT WEAKER_STRIP_TAC;
3758   TYPIFY `y4 <= #3.166` (C SUBGOAL_THEN ASSUME_TAC);
3759     PROOF_BY_CONTR_TAC;
3760     INTRO_TAC ((* Appendix. *) get_main_nonlinear "4680581274 delta top issue") [`y0`;`y9`;`y8`;`y4`;`y5`;`y6`];
3761     REWRITE_TAC[Sphere.ineq;TAUT `(a ==> b==> c) <=> (a /\ b) ==> c `;TAUT `(a /\ b) /\ c <=> a /\ b /\ c`];
3762     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
3763   INTRO_TAC ((* Appendix. *) get_main_nonlinear "4559601669") [`y1`;`y5`;`y6`;`y4`;`y2`;`y3`];
3764   REWRITE_TAC[Sphere.ineq;TAUT `(a ==> b==> c) <=> (a /\ b) ==> c `;TAUT `(a /\ b) /\ c <=> a /\ b /\ c`];
3765   ANTS_TAC;
3766     BY(REPEAT CONJ_TAC THEN REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN TRY REAL_ARITH_TAC);
3767   TYPIFY `delta4_y y1 y5 y6 y4 y2 y3 = delta4_y y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN SUBST1_TAC);
3768     REWRITE_TAC[Sphere.delta4_y;Sphere.y_of_x;Sphere.delta_x4];
3769     BY(REAL_ARITH_TAC);
3770   DISCH_TAC;
3771   INTRO_TAC ((* Appendix. *) get_main_nonlinear "4680581274 delta issue") [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`;`y7`;`y8`;`y9`];
3772   REWRITE_TAC[Sphere.ineq;TAUT `(a ==> b==> c) <=> (a /\ b) ==> c `;TAUT `(a /\ b) /\ c <=> a /\ b /\ c`];
3773   ANTS_TAC;
3774     BY(REPEAT CONJ_TAC THEN REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN TRY REAL_ARITH_TAC);
3775   ASM_SIMP_TAC[arith `d4 < &0 ==> ~(d4 > &0)`;arith `c <= y0 ==> ~(y0 < c)`];
3776   REWRITE_TAC[arith `x > y <=> y < x`];
3777   DISCH_TAC;
3778   INTRO_TAC ((* Appendix. *) get_main_nonlinear "4680581274 a") [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`;`y7`;`y8`;`y9`];
3779   REWRITE_TAC[Sphere.ineq;TAUT `(a ==> b==> c) <=> (a /\ b) ==> c `;TAUT `(a /\ b) /\ c <=> a /\ b /\ c`];
3780   ANTS_TAC;
3781     BY(REPEAT CONJ_TAC THEN REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN TRY REAL_ARITH_TAC);
3782   ASM_SIMP_TAC[arith `d4 < &0 ==> ~(d4 > &0)`;arith `c <= y0 ==> ~(y0 < c)`;arith `c < d ==> ~(d < c)`];
3783   BY(REAL_ARITH_TAC)
3784   ]);;
3785   (* }}} *)
3786
3787 (* deprecated 2013-06-17
3788 let quad_7697147739_derived = prove_by_refinement(
3789   `main_nonlinear_terminal_v11 ==> (!y0 y1 y2 y3 y4 y5 y6 y7 y8 y9.  ineq [
3790       (#3.01,y0,&4);
3791       (#2.0,y1,&2 * h0);
3792       (#2.0,y2,&2 * h0);
3793       (#2.0,y3,&2 * h0);
3794       (#3.01,y4,&4);
3795       (#2.0,y5,&2);
3796       (#2.0,y6,&2);
3797       (#2.0,y7,&2 * h0);
3798       (#2.0,y8,&2);
3799       (sqrt8,y9,sqrt8)]
3800
3801    (enclosed y1 y5 y6 y4 y2 y3 y7 y8 y9 = y0) /\ 
3802   ( y4 <= y0 ) /\ &0 <=  delta_y y0 y9 y8 y4 y5 y6 ==>
3803   #0.616 - #0.11 < tauq y1 y2 y3 y4 y5 y6 y7 y8 y9 ))
3804 `,
3805   (* {{{ proof *)
3806   [
3807   REWRITE_TAC[Sphere.ineq;TAUT `(a ==> b==> c) <=> (a /\ b) ==> c `;TAUT `(a /\ b) /\ c <=> a /\ b /\ c`];
3808   REPEAT WEAKER_STRIP_TAC;
3809   TYPIFY `y4 <= #3.108` (C SUBGOAL_THEN ASSUME_TAC);
3810     PROOF_BY_CONTR_TAC;
3811     INTRO_TAC ((* Appendix. *) get_main_nonlinear "7697147739 delta top issue") [`y0`;`y9`;`y8`;`y4`;`y5`;`y6`];
3812     REWRITE_TAC[Sphere.ineq;TAUT `(a ==> b==> c) <=> (a /\ b) ==> c `;TAUT `(a /\ b) /\ c <=> a /\ b /\ c`];
3813     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
3814   INTRO_TAC ((* Appendix. *) get_main_nonlinear "4559601669") [`y1`;`y5`;`y6`;`y4`;`y2`;`y3`];
3815   REWRITE_TAC[Sphere.ineq;TAUT `(a ==> b==> c) <=> (a /\ b) ==> c `;TAUT `(a /\ b) /\ c <=> a /\ b /\ c`];
3816   ANTS_TAC;
3817     BY(REPEAT CONJ_TAC THEN REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN TRY REAL_ARITH_TAC);
3818   TYPIFY `delta4_y y1 y5 y6 y4 y2 y3 = delta4_y y1 y2 y3 y4 y5 y6` (C SUBGOAL_THEN SUBST1_TAC);
3819     REWRITE_TAC[Sphere.delta4_y;Sphere.y_of_x;Sphere.delta_x4];
3820     BY(REAL_ARITH_TAC);
3821   DISCH_TAC;
3822   INTRO_TAC ((* Appendix. *) get_main_nonlinear "7697147739 delta issue") [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`;`y7`;`y8`;`y9`];
3823   REWRITE_TAC[Sphere.ineq;TAUT `(a ==> b==> c) <=> (a /\ b) ==> c `;TAUT `(a /\ b) /\ c <=> a /\ b /\ c`];
3824   ANTS_TAC;
3825     BY(REPEAT CONJ_TAC THEN REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN TRY REAL_ARITH_TAC);
3826   ASM_SIMP_TAC[arith `d4 < &0 ==> ~(d4 > &0)`;arith `c <= y0 ==> ~(y0 < c)`];
3827   REWRITE_TAC[arith `x > y <=> y < x`];
3828   DISCH_TAC;
3829   INTRO_TAC ((* Appendix. *) get_main_nonlinear "7697147739 a") [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`;`y7`;`y8`;`y9`];
3830   REWRITE_TAC[Sphere.ineq;TAUT `(a ==> b==> c) <=> (a /\ b) ==> c `;TAUT `(a /\ b) /\ c <=> a /\ b /\ c`];
3831   ANTS_TAC;
3832     BY(REPEAT CONJ_TAC THEN REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Sphere.h0] THEN TRY REAL_ARITH_TAC);
3833   ASM_SIMP_TAC[arith `d4 < &0 ==> ~(d4 > &0)`;arith `c <= y0 ==> ~(y0 < c)`;arith `c < d ==> ~(d < c)`];
3834   BY(REAL_ARITH_TAC)
3835   ]);;
3836   (* }}} *)
3837 *)
3838
3839
3840 (* renamed from terminal_adhoc_quad_4680581274_empty, 2013-06-26, constant #0.616- #0.11 -> #0.513 *)
3841 let empty_4T3  = prove_by_refinement(
3842   `main_nonlinear_terminal_v11 ==> 
3843         (let s = scs_4T3 in
3844   //mk_unadorned_v39 4 ( #0.616 - #0.11)
3845   // (funlist_v39 [(0,1),cstab; (0,2),cstab; (1,3),cstab] (&2) 4)
3846   // (funlist_v39 [(0,1),cstab; (0,2),&6; (1,3),&6] (&2) 4) in 
3847            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))`,
3848   (* {{{ proof *)
3849   [
3850   REWRITE_TAC[Appendix.scs_4T3];
3851   REPEAT WEAKER_STRIP_TAC;
3852   REWRITE_TAC[LET_THM];
3853   MATCH_MP_TAC (REWRITE_RULE[LET_THM] (UNDISCH terminal_quad_lemma));
3854   COMMENT "digression";
3855   TYPIFY `(!i j. i < 4 /\ j < 4 /\ ~(i = j) ==> &2 <= funlist_v39 [(0,1),cstab; (0,2),cstab; (1,3),cstab] (&2) 4 i j) ` (C SUBGOAL_THEN ASSUME_TAC);
3856     REWRITE_TAC[arith `i < 4 <=> (i = 0 \/ i = 1 \/ i = 2 \/ i = 3)`];
3857     REWRITE_TAC[TAUT `(a \/ b) /\ c <=> a /\ c \/ b /\ c`;TAUT `a /\ (b \/ c) <=> (a /\ b) \/ a /\ c`];
3858     REPEAT WEAKER_STRIP_TAC;
3859     BY((REPEAT (FIRST_X_ASSUM DISJ_CASES_TAC) THEN ASM_REWRITE_TAC[arith `SUC 0 = 1 /\ SUC 1 = 2 /\ SUC 2 = 3 /\ SUC 3 = 4`;MOD_4_EXPLICIT;FUNLIST_EXPLICIT;arith `&2 <= &2 /\ &2 <= &3`;arith `~(0=1) /\ ~(0=2) /\ ~(0=3) /\ ~(1 =2) /\ ~(1 = 3) /\ ~(2 = 3)`;Appendix.cstab;arith `&2 <= #3.01`]) THEN ASM_MESON_TAC[]);
3860   COMMENT "conj1";
3861   CONJ_TAC;
3862     BY(ASM_MESON_TAC[arith `&2 <= x ==> &0 < x`]);
3863   REPEAT WEAKER_STRIP_TAC;
3864   COMMENT "prep dist";
3865   TYPIFY `(!i j d. d <= funlist_v39 [(0,1),cstab; (0,2),cstab; (1,3),cstab] (&2) 4 i j  ==> d <= dist (vv i,vv j)) /\ (!i j d. funlist_v39 [(0,1),cstab; (0,2),&6; (1,3),&6] (&2) 4 i j   <= d ==>   dist (vv i,vv j) <= d)` ((C SUBGOAL_THEN MP_TAC));
3866     BY(ASM_MESON_TAC[REAL_LE_TRANS]);
3867   REPEAT WEAKER_STRIP_TAC;
3868   REWRITE_TAC[arith `x + &0 = x /\ &4 - &2 = &2`];
3869   TYPIFY `(!i j. i < 4 /\ j < 4 /\ vv i = vv j ==> i = j)` (C SUBGOAL_THEN ASSUME_TAC);
3870     REPEAT WEAKER_STRIP_TAC;
3871     PROOF_BY_CONTR_TAC;
3872     BY(ASM_MESON_TAC[DIST_REFL;REAL_LE_TRANS;arith `~(&2 <= &0)`]);
3873   COMMENT "vv";
3874   TYPIFY `vv 4 = vv 0 /\ vv 5 = vv 1 /\ vv 6 = vv 2` (C SUBGOAL_THEN ASSUME_TAC);
3875     BY((REPEAT CONJ_TAC) THEN GMATCH_SIMP_TAC periodic_vv_inj THEN TYPIFY `4` EXISTS_TAC THEN ASM_REWRITE_TAC[MOD_4_EXPLICIT;arith `~(4 = 0)`]);
3876   ASM_REWRITE_TAC[];
3877   INTRO_TAC vv_quad_split_short [`vv`];
3878   ASM_REWRITE_TAC[LET_THM];
3879   COMMENT "dist";
3880   TYPIFY `(!i j. ~(vv i = vv j) ==> &2 <= dist (vv i,vv j))` (C SUBGOAL_THEN ASSUME_TAC);
3881     MATCH_MP_TAC periodic2_mod_reduce;
3882     TYPIFY `4` EXISTS_TAC;
3883     REWRITE_TAC[Appendix.periodic2;arith `~(4 = 0)`];
3884     TYPIFY `!i. vv (i + 4) = vv i` (C SUBGOAL_THEN (unlist REWRITE_TAC));
3885       BY(ASM_MESON_TAC[Oxl_def.periodic;arith `~(4 = 0)`]);
3886     REPEAT WEAKER_STRIP_TAC;
3887     BY(ASM_MESON_TAC[REAL_LE_TRANS]);
3888   ASM_REWRITE_TAC[];
3889   COMMENT "edge lengths";
3890   TYPIFY `I(dist(vv 0,vv 1) = cstab /\ dist(vv 1,vv 2) = &2 /\ dist(vv 2, vv 3) = &2 /\ dist(vv 0,vv 3) = &2)` (C SUBGOAL_THEN ASSUME_TAC);
3891     REWRITE_TAC[I_DEF];
3892     REWRITE_TAC[arith `d = c <=> d <= c /\ c <= d`];
3893     FIRST_X_ASSUM kill;
3894     BY(REPEAT CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN REWRITE_TAC[FUNLIST_EXPLICIT;MOD_4_EXPLICIT;Appendix.cstab] THEN TRY REAL_ARITH_TAC);
3895   TYPIFY `dist(vv 1,vv 0) = dist(vv 0,vv 1) /\ dist (vv 2, vv 0) = dist(vv 0,vv 2) /\ dist(vv 3,vv 0) = dist (vv 0, vv 3) /\ dist (vv 2,vv 1) = dist (vv 1, vv 2) /\ dist (vv 3,vv 2) = dist (vv 2, vv 3) /\ dist(vv 3,vv 1)=dist(vv 1,vv 3)` (C SUBGOAL_THEN ASSUME_TAC);
3896     BY(MESON_TAC[DIST_SYM]);
3897   DISCH_TAC;
3898   COMMENT "diags";
3899   TYPIFY `dist(vv 0,vv 2) < &4` (C SUBGOAL_THEN ASSUME_TAC);
3900     PROOF_BY_CONTR_TAC;
3901     INTRO_TAC delta_4680581274 [`dist(vv 1,vv 3)`;`dist(vv 0,vv 2)`];
3902     ANTS_TAC;
3903       CONJ_TAC;
3904         (FIRST_X_ASSUM MATCH_MP_TAC) THEN REWRITE_TAC[FUNLIST_EXPLICIT;Appendix.cstab;MOD_4_EXPLICIT;arith `~(1 = 3)`];
3905         BY(REAL_ARITH_TAC);
3906       BY(FIRST_X_ASSUM MP_TAC THEN REAL_ARITH_TAC);
3907     REWRITE_TAC[arith `~(d < &0) <=> &0 <= d`];
3908     TYPIFY `delta_y (dist (vv 1,vv 3)) (&2) (&2) (dist (vv 0,vv 2)) (&2) cstab = delta_y (dist(vv 3,vv 1)) (dist(vv 3,vv 0)) (dist(vv 3,vv 2)) (dist(vv 0,vv 2)) (dist (vv 1, vv 2)) (dist (vv 1, vv 0))` ENOUGH_TO_SHOW_TAC;
3909       DISCH_THEN SUBST1_TAC;
3910       BY(REWRITE_TAC[ DELTA_Y_POS_4POINTS]);
3911     RULE_ASSUM_TAC (REWRITE_RULE[I_THM]);
3912     BY(ASM_REWRITE_TAC[]);
3913   COMMENT "second diag";
3914   TYPIFY `dist(vv 1,vv 3) < &4` (C SUBGOAL_THEN ASSUME_TAC);
3915     PROOF_BY_CONTR_TAC;
3916     INTRO_TAC delta_4680581274 [`dist(vv 2,vv 0)`;`dist(vv 1,vv 3)`];
3917     ANTS_TAC;
3918       CONJ_TAC;
3919         (FIRST_X_ASSUM MATCH_MP_TAC) THEN REWRITE_TAC[FUNLIST_EXPLICIT;Appendix.cstab;MOD_4_EXPLICIT;arith `~(0=2)`];
3920         BY(REAL_ARITH_TAC);
3921       BY(FIRST_X_ASSUM MP_TAC THEN REAL_ARITH_TAC);
3922     REWRITE_TAC[arith `~(d < &0) <=> &0 <= d`];
3923     TYPIFY `delta_y (dist (vv 2,vv 0)) (&2) (&2) (dist (vv 1,vv 3)) (&2) cstab = delta_y (dist(vv 2,vv 0)) (dist(vv 2,vv 1)) (dist(vv 2,vv 3)) (dist(vv 1,vv 3)) (dist (vv 0, vv 3)) (dist (vv 0, vv 1))` ENOUGH_TO_SHOW_TAC;
3924       DISCH_THEN SUBST1_TAC;
3925       BY(REWRITE_TAC[ DELTA_Y_POS_4POINTS]);
3926     RULE_ASSUM_TAC (REWRITE_RULE[I_THM]);
3927     BY(ASM_REWRITE_TAC[]);
3928   FIRST_X_ASSUM_ST `rho_fun` MP_TAC;
3929   ANTS_TAC;
3930     RULE_ASSUM_TAC (REWRITE_RULE[I_THM]) THEN ASM_REWRITE_TAC[];
3931     BY(REWRITE_TAC[Appendix.cstab] THEN REAL_ARITH_TAC);
3932   REPEAT WEAKER_STRIP_TAC;
3933   ASM_REWRITE_TAC[];
3934   COMMENT "enclosed";
3935   INTRO_TAC vv_enclosed4 [`vv`;`i`];
3936   REWRITE_TAC[LET_THM];
3937   ASM_REWRITE_TAC[];
3938   RULE_ASSUM_TAC(REWRITE_RULE[arith `i < 2 <=> i = 0 \/ i = 1`]);
3939   ANTS_TAC;
3940     FIRST_X_ASSUM DISJ_CASES_TAC;
3941       RULE_ASSUM_TAC(REWRITE_RULE[I_THM]);
3942       ASM_REWRITE_TAC[arith `0+x = x`;Appendix.cstab];
3943       BY(REAL_ARITH_TAC);
3944     RULE_ASSUM_TAC(REWRITE_RULE[I_THM]);
3945     ASM_REWRITE_TAC[arith `1+x = SUC x`;Appendix.cstab;SUC_EXPLICIT];
3946     BY(REAL_ARITH_TAC);
3947   DISCH_THEN (ASSUME_TAC o GSYM);
3948   COMMENT "relabel vars";
3949   TYPIFY `?v1 v2 v3 v4.  (    let y1 = norm v1 in    let y2 = norm v2 in    let y3 = norm v3 in    let y4 = dist(v2,v3) in    let y5 = dist(v1,v3) in    let y6 = dist(v1,v2) in    let y7 = norm v4 in    let y8 = dist(v3,v4) in    let y9 = dist(v2,v4) in    let y0 = enclosed y1 y5 y6 y4 y2 y3 y7 y8 y9 in      ({v1,v2,v3,v4} SUBSET ball_annulus /\      tau3 (vv i) (vv (i + 1)) (vv (i + 2)) +         tau3 (vv (i + 2)) (vv (i + 3)) (vv i) = tau3 v1 v2 v3 + tau3 v4 v2 v3 /\         y4 <= y0 /\     cstab <= y4 /\ y0 < &4 /\       y9 = cstab /\ y8 = &2 /\ y5 = &2 /\ y6 = &2 /\ y0 = dist(v1,v4)))` (C SUBGOAL_THEN MP_TAC);
3950     FIRST_X_ASSUM DISJ_CASES_TAC;
3951       ASM_REWRITE_TAC[LET_THM;arith `0+x = x`];
3952       FIRST_X_ASSUM (RULE_ASSUM_TAC o (unlist REWRITE_RULE));
3953       RULE_ASSUM_TAC (REWRITE_RULE[arith `0 + x = x`]);
3954       GEXISTL_TAC [`vv 3`;`vv 0`;`vv 2`;`vv 1`];
3955       ASM_REWRITE_TAC[];
3956       ONCE_REWRITE_TAC[enclosed_sym2];
3957       ONCE_REWRITE_TAC[enclosed_sym];
3958       ASM_REWRITE_TAC[];
3959       CONJ_TAC;
3960         RULE_ASSUM_TAC(REWRITE_RULE[IMAGE_SUBSET_IN;IN_UNIV]);
3961         ASM_REWRITE_TAC[SUBSET;IN_INSERT;NOT_IN_EMPTY];
3962         BY(FIRST_X_ASSUM_ST `ball_annulus` MP_TAC THEN MESON_TAC[]);
3963       CONJ_TAC;
3964         BY(ASM_MESON_TAC[tau3_sym;arith `a + b = b + a`]);
3965       RULE_ASSUM_TAC(REWRITE_RULE[I_THM]);
3966       ASM_REWRITE_TAC[];
3967       FIRST_X_ASSUM MATCH_MP_TAC;
3968       REWRITE_TAC[FUNLIST_EXPLICIT;MOD_4_EXPLICIT];
3969       BY(REAL_ARITH_TAC);
3970     COMMENT "second case relabel";
3971     ASM_REWRITE_TAC[LET_THM;arith `1+x = SUC x`;SUC_EXPLICIT];
3972     FIRST_X_ASSUM (RULE_ASSUM_TAC o (unlist REWRITE_RULE));
3973     RULE_ASSUM_TAC (REWRITE_RULE[arith `1 + x = SUC x`;SUC_EXPLICIT]);
3974     FIRST_X_ASSUM_ST `vv 4 = vv 0` (RULE_ASSUM_TAC o (unlist REWRITE_RULE));
3975     GEXISTL_TAC [`vv 2`;`vv 1`;`vv 3`;`vv 0`];
3976     ASM_REWRITE_TAC[];
3977     ONCE_REWRITE_TAC[enclosed_sym];
3978     FIRST_X_ASSUM_ST `enclosed` MP_TAC;
3979     ASM_REWRITE_TAC[];
3980     DISCH_THEN SUBST1_TAC;
3981     CONJ_TAC;
3982       RULE_ASSUM_TAC(REWRITE_RULE[IMAGE_SUBSET_IN;IN_UNIV]);
3983       ASM_REWRITE_TAC[SUBSET;IN_INSERT;NOT_IN_EMPTY];
3984       BY(FIRST_X_ASSUM_ST `ball_annulus` MP_TAC THEN MESON_TAC[]);
3985     CONJ_TAC;
3986       BY(MESON_TAC[tau3_sym]);
3987     FIRST_X_ASSUM_ST `<=` MP_TAC;
3988     RULE_ASSUM_TAC(REWRITE_RULE[I_THM]);
3989     ASM_REWRITE_TAC[];
3990     DISCH_THEN (unlist REWRITE_TAC);
3991     FIRST_X_ASSUM MATCH_MP_TAC;
3992     REWRITE_TAC[FUNLIST_EXPLICIT;MOD_4_EXPLICIT];
3993     BY(REAL_ARITH_TAC);
3994   COMMENT "final kill";
3995   FIRST_X_ASSUM_ST `main_nonlinear_terminal_v11` MP_TAC;
3996   REPEAT (FIRST_X_ASSUM kill);
3997   REWRITE_TAC[LET_THM];
3998   REPEAT WEAKER_STRIP_TAC;
3999   ASM_REWRITE_TAC[];
4000   RULE_ASSUM_TAC(ONCE_REWRITE_RULE[ISPEC `(a:real) = b` (GSYM I_THM)]);
4001   REPEAT (GMATCH_SIMP_TAC tau3_taum_40);
4002   RULE_ASSUM_TAC(REWRITE_RULE[INSERT_SUBSET]) THEN ASM_REWRITE_TAC[DIST_SYM];
4003   CONJ_TAC;
4004     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Appendix.cstab;I_THM] THEN REAL_ARITH_TAC);
4005   CONJ_TAC;
4006     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Appendix.cstab;I_THM] THEN REAL_ARITH_TAC);
4007   MATCH_MP_TAC (arith `x < y ==> x <= y`);
4008   COMMENT "get";
4009   MP_TAC (UNDISCH quad_4680581274_derived);
4010   REWRITE_TAC[Sphere.ineq;TAUT `(a ==> b==> c) <=> (a /\ b) ==> c `;TAUT `(a /\ b) /\ c <=> a /\ b /\ c`];
4011   REWRITE_TAC[Sphere.tauq];
4012   DISCH_THEN MATCH_MP_TAC;
4013   TYPIFY `dist(v1,v4)` EXISTS_TAC;
4014   FIRST_X_ASSUM MP_TAC;
4015   REWRITE_TAC[I_THM] THEN DISCH_THEN (fun t -> RULE_ASSUM_TAC(REWRITE_RULE[t]) THEN SUBST1_TAC t);
4016   TYPIFY `&0 <= delta_y (dist (v1,v4)) (dist (v2,v4)) (dist (v3,v4)) (dist (v2,v3)) (dist (v1,v3)) (dist (v1,v2))` (C SUBGOAL_THEN (unlist REWRITE_TAC));
4017     TYPIFY `dist (v1,v4) = dist(v4,v1) /\ dist(v2,v4) = dist(v4,v2) /\ dist(v3,v4) = dist(v4,v3)` (C SUBGOAL_THEN (unlist REWRITE_TAC));
4018       BY(MESON_TAC[DIST_SYM]);
4019     BY(REWRITE_TAC[DELTA_Y_POS_4POINTS]);
4020   RULE_ASSUM_TAC(REWRITE_RULE[I_THM;Appendix.cstab;Fnjlbxs.in_ball_annulus]) THEN ASM_REWRITE_TAC[Appendix.cstab;arith `#2.0= &2`];
4021   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC)
4022   ]);;
4023   (* }}} *)
4024
4025 (* deprecated 2013-06-17:
4026 let terminal_adhoc_quad_7697147739_empty = prove_by_refinement(
4027   `main_nonlinear_terminal_v11 ==> 
4028         (let s = mk_unadorned_v39 4 ( #0.616 -  #0.11)
4029    (funlist_v39 [(0,1),sqrt8; (0,2),cstab; (1,3),cstab] (&2) 4)
4030    (funlist_v39 [(0,1),sqrt8; (0,2),&6; (1,3),&6] (&2) 4) in
4031            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))`,
4032   (* {{{ proof *)
4033   [
4034   REPEAT WEAKER_STRIP_TAC;
4035   REWRITE_TAC[LET_THM];
4036   MATCH_MP_TAC (REWRITE_RULE[LET_THM] (UNDISCH terminal_quad_lemma));
4037   COMMENT "sqrt8 bounds";
4038   TYPIFY `#2.828427 < sqrt8 /\ sqrt8 <  #2.828428` (C SUBGOAL_THEN ASSUME_TAC);
4039     BY(REWRITE_TAC[Flyspeck_constants.bounds]);
4040   TYPIFY `&2 <= sqrt8` (C SUBGOAL_THEN ASSUME_TAC);
4041     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
4042   COMMENT "digression";
4043   TYPIFY `(!i j. i < 4 /\ j < 4 /\ ~(i = j) ==> &2 <= funlist_v39 [(0,1),sqrt8; (0,2),cstab; (1,3),cstab] (&2) 4 i j) ` (C SUBGOAL_THEN ASSUME_TAC);
4044     REWRITE_TAC[arith `i < 4 <=> (i = 0 \/ i = 1 \/ i = 2 \/ i = 3)`];
4045     REWRITE_TAC[TAUT `(a \/ b) /\ c <=> a /\ c \/ b /\ c`;TAUT `a /\ (b \/ c) <=> (a /\ b) \/ a /\ c`];
4046     REPEAT WEAKER_STRIP_TAC;
4047     BY(((REPEAT (FIRST_X_ASSUM DISJ_CASES_TAC) THEN ASM_REWRITE_TAC[arith `SUC 0 = 1 /\ SUC 1 = 2 /\ SUC 2 = 3 /\ SUC 3 = 4`;MOD_4_EXPLICIT;FUNLIST_EXPLICIT;arith `&2 <= &2 /\ &2 <= &3`;arith `~(0=1) /\ ~(0=2) /\ ~(0=3) /\ ~(1 =2) /\ ~(1 = 3) /\ ~(2 = 3)`;Appendix.cstab;arith `&2 <= #3.01`])) THEN TRY (ASM_MESON_TAC[]));
4048   COMMENT "conj1";
4049   CONJ_TAC;
4050     BY(ASM_MESON_TAC[arith `&2 <= x ==> &0 < x`]);
4051   REPEAT WEAKER_STRIP_TAC;
4052   COMMENT "prep dist";
4053   TYPIFY `(!i j d. d <= funlist_v39 [(0,1),sqrt8; (0,2),cstab; (1,3),cstab] (&2) 4 i j  ==> d <= dist (vv i,vv j)) /\ (!i j d. funlist_v39 [(0,1),sqrt8; (0,2),&6; (1,3),&6] (&2) 4 i j   <= d ==>   dist (vv i,vv j) <= d)` ((C SUBGOAL_THEN MP_TAC));
4054     BY(ASM_MESON_TAC[REAL_LE_TRANS]);
4055   REPEAT WEAKER_STRIP_TAC;
4056   REWRITE_TAC[arith `x + &0 = x /\ &4 - &2 = &2`];
4057   TYPIFY `(!i j. i < 4 /\ j < 4 /\ vv i = vv j ==> i = j)` (C SUBGOAL_THEN ASSUME_TAC);
4058     REPEAT WEAKER_STRIP_TAC;
4059     PROOF_BY_CONTR_TAC;
4060     BY(ASM_MESON_TAC[DIST_REFL;REAL_LE_TRANS;arith `~(&2 <= &0)`]);
4061   COMMENT "vv";
4062   TYPIFY `vv 4 = vv 0 /\ vv 5 = vv 1 /\ vv 6 = vv 2` (C SUBGOAL_THEN ASSUME_TAC);
4063     BY((REPEAT CONJ_TAC) THEN GMATCH_SIMP_TAC periodic_vv_inj THEN TYPIFY `4` EXISTS_TAC THEN ASM_REWRITE_TAC[MOD_4_EXPLICIT;arith `~(4 = 0)`]);
4064   ASM_REWRITE_TAC[];
4065   INTRO_TAC vv_quad_split_short [`vv`];
4066   ASM_REWRITE_TAC[LET_THM];
4067   COMMENT "dist";
4068   TYPIFY `(!i j. ~(vv i = vv j) ==> &2 <= dist (vv i,vv j))` (C SUBGOAL_THEN ASSUME_TAC);
4069     MATCH_MP_TAC periodic2_mod_reduce;
4070     TYPIFY `4` EXISTS_TAC;
4071     REWRITE_TAC[Appendix.periodic2;arith `~(4 = 0)`];
4072     TYPIFY `!i. vv (i + 4) = vv i` (C SUBGOAL_THEN (unlist REWRITE_TAC));
4073       BY(ASM_MESON_TAC[Oxl_def.periodic;arith `~(4 = 0)`]);
4074     REPEAT WEAKER_STRIP_TAC;
4075     BY(ASM_MESON_TAC[REAL_LE_TRANS]);
4076   ASM_REWRITE_TAC[];
4077   COMMENT "edge lengths";
4078   TYPIFY `I(dist(vv 0,vv 1) = sqrt8 /\ dist(vv 1,vv 2) = &2 /\ dist(vv 2, vv 3) = &2 /\ dist(vv 0,vv 3) = &2)` (C SUBGOAL_THEN ASSUME_TAC);
4079     REWRITE_TAC[I_DEF];
4080     REWRITE_TAC[arith `d = c <=> d <= c /\ c <= d`];
4081     FIRST_X_ASSUM kill;
4082     BY((REPEAT CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN REWRITE_TAC[FUNLIST_EXPLICIT;MOD_4_EXPLICIT;Appendix.cstab] THEN TRY REAL_ARITH_TAC));
4083   TYPIFY `dist(vv 1,vv 0) = dist(vv 0,vv 1) /\ dist (vv 2, vv 0) = dist(vv 0,vv 2) /\ dist(vv 3,vv 0) = dist (vv 0, vv 3) /\ dist (vv 2,vv 1) = dist (vv 1, vv 2) /\ dist (vv 3,vv 2) = dist (vv 2, vv 3) /\ dist(vv 3,vv 1)=dist(vv 1,vv 3)` (C SUBGOAL_THEN ASSUME_TAC);
4084     BY(MESON_TAC[DIST_SYM]);
4085   DISCH_TAC;
4086   COMMENT "diags";
4087   TYPIFY `dist(vv 0,vv 2) < &4` (C SUBGOAL_THEN ASSUME_TAC);
4088     PROOF_BY_CONTR_TAC;
4089     INTRO_TAC delta_7697147739 [`dist(vv 1,vv 3)`;`dist(vv 0,vv 2)`];
4090     ANTS_TAC;
4091       CONJ_TAC;
4092         (FIRST_X_ASSUM MATCH_MP_TAC) THEN REWRITE_TAC[FUNLIST_EXPLICIT;Appendix.cstab;MOD_4_EXPLICIT;arith `~(1 = 3)`];
4093         BY(REAL_ARITH_TAC);
4094       BY(FIRST_X_ASSUM MP_TAC THEN REAL_ARITH_TAC);
4095     REWRITE_TAC[arith `~(d < &0) <=> &0 <= d`];
4096     TYPIFY `delta_y (dist (vv 1,vv 3)) (&2) (&2) (dist (vv 0,vv 2)) (&2) sqrt8 = delta_y (dist(vv 3,vv 1)) (dist(vv 3,vv 0)) (dist(vv 3,vv 2)) (dist(vv 0,vv 2)) (dist (vv 1, vv 2)) (dist (vv 1, vv 0))` ENOUGH_TO_SHOW_TAC;
4097       DISCH_THEN SUBST1_TAC;
4098       BY(REWRITE_TAC[ DELTA_Y_POS_4POINTS]);
4099     RULE_ASSUM_TAC (REWRITE_RULE[I_THM]);
4100     BY(ASM_REWRITE_TAC[]);
4101   COMMENT "second diag";
4102   TYPIFY `dist(vv 1,vv 3) < &4` (C SUBGOAL_THEN ASSUME_TAC);
4103     PROOF_BY_CONTR_TAC;
4104     INTRO_TAC delta_7697147739 [`dist(vv 2,vv 0)`;`dist(vv 1,vv 3)`];
4105     ANTS_TAC;
4106       CONJ_TAC;
4107         (FIRST_X_ASSUM MATCH_MP_TAC) THEN REWRITE_TAC[FUNLIST_EXPLICIT;Appendix.cstab;MOD_4_EXPLICIT;arith `~(0=2)`];
4108         BY(REAL_ARITH_TAC);
4109       BY(FIRST_X_ASSUM MP_TAC THEN REAL_ARITH_TAC);
4110     REWRITE_TAC[arith `~(d < &0) <=> &0 <= d`];
4111     TYPIFY `delta_y (dist (vv 2,vv 0)) (&2) (&2) (dist (vv 1,vv 3)) (&2) sqrt8 = delta_y (dist(vv 2,vv 0)) (dist(vv 2,vv 1)) (dist(vv 2,vv 3)) (dist(vv 1,vv 3)) (dist (vv 0, vv 3)) (dist (vv 0, vv 1))` ENOUGH_TO_SHOW_TAC;
4112       DISCH_THEN SUBST1_TAC;
4113       BY(REWRITE_TAC[ DELTA_Y_POS_4POINTS]);
4114     RULE_ASSUM_TAC (REWRITE_RULE[I_THM]);
4115     BY(ASM_REWRITE_TAC[]);
4116   FIRST_X_ASSUM_ST `rho_fun` MP_TAC;
4117   ANTS_TAC;
4118     RULE_ASSUM_TAC (REWRITE_RULE[I_THM]) THEN ASM_REWRITE_TAC[];
4119     BY(REPEAT (FIRST_X_ASSUM_ST `sqrt8 < c` MP_TAC) THEN REAL_ARITH_TAC);
4120   REPEAT WEAKER_STRIP_TAC;
4121   ASM_REWRITE_TAC[];
4122   COMMENT "enclosed";
4123   INTRO_TAC vv_enclosed4 [`vv`;`i`];
4124   REWRITE_TAC[LET_THM];
4125   ASM_REWRITE_TAC[];
4126   RULE_ASSUM_TAC(REWRITE_RULE[arith `i < 2 <=> i = 0 \/ i = 1`]);
4127   ANTS_TAC;
4128     FIRST_X_ASSUM DISJ_CASES_TAC;
4129       RULE_ASSUM_TAC(REWRITE_RULE[I_THM]);
4130       ASM_REWRITE_TAC[arith `0+x = x`;Appendix.cstab];
4131       BY(REPEAT (FIRST_X_ASSUM_ST `sqrt8 < c` MP_TAC) THEN REAL_ARITH_TAC);
4132     RULE_ASSUM_TAC(REWRITE_RULE[I_THM]);
4133     ASM_REWRITE_TAC[arith `1+x = SUC x`;Appendix.cstab;SUC_EXPLICIT];
4134     BY(REPEAT (FIRST_X_ASSUM_ST `sqrt8 < c` MP_TAC) THEN REAL_ARITH_TAC);
4135   DISCH_THEN (ASSUME_TAC o GSYM);
4136   COMMENT "relabel vars";
4137   TYPIFY `?v1 v2 v3 v4.  (    let y1 = norm v1 in    let y2 = norm v2 in    let y3 = norm v3 in    let y4 = dist(v2,v3) in    let y5 = dist(v1,v3) in    let y6 = dist(v1,v2) in    let y7 = norm v4 in    let y8 = dist(v3,v4) in    let y9 = dist(v2,v4) in    let y0 = enclosed y1 y5 y6 y4 y2 y3 y7 y8 y9 in      ({v1,v2,v3,v4} SUBSET ball_annulus /\      tau3 (vv i) (vv (i + 1)) (vv (i + 2)) +         tau3 (vv (i + 2)) (vv (i + 3)) (vv i) = tau3 v1 v2 v3 + tau3 v4 v2 v3 /\         y4 <= y0 /\     cstab <= y4 /\ y0 < &4 /\       y9 = sqrt8 /\ y8 = &2 /\ y5 = &2 /\ y6 = &2 /\ y0 = dist(v1,v4)))` (C SUBGOAL_THEN MP_TAC);
4138     FIRST_X_ASSUM DISJ_CASES_TAC;
4139       ASM_REWRITE_TAC[LET_THM;arith `0+x = x`];
4140       FIRST_X_ASSUM (RULE_ASSUM_TAC o (unlist REWRITE_RULE));
4141       RULE_ASSUM_TAC (REWRITE_RULE[arith `0 + x = x`]);
4142       GEXISTL_TAC [`vv 3`;`vv 0`;`vv 2`;`vv 1`];
4143       ASM_REWRITE_TAC[];
4144       ONCE_REWRITE_TAC[enclosed_sym2];
4145       ONCE_REWRITE_TAC[enclosed_sym];
4146       ASM_REWRITE_TAC[];
4147       CONJ_TAC;
4148         RULE_ASSUM_TAC(REWRITE_RULE[IMAGE_SUBSET_IN;IN_UNIV]);
4149         ASM_REWRITE_TAC[SUBSET;IN_INSERT;NOT_IN_EMPTY];
4150         BY(FIRST_X_ASSUM_ST `ball_annulus` MP_TAC THEN MESON_TAC[]);
4151       CONJ_TAC;
4152         BY(ASM_MESON_TAC[tau3_sym;arith `a + b = b + a`]);
4153       RULE_ASSUM_TAC(REWRITE_RULE[I_THM]);
4154       ASM_REWRITE_TAC[];
4155       FIRST_X_ASSUM MATCH_MP_TAC;
4156       REWRITE_TAC[FUNLIST_EXPLICIT;MOD_4_EXPLICIT];
4157       BY(REAL_ARITH_TAC);
4158     COMMENT "second case relabel";
4159     ASM_REWRITE_TAC[LET_THM;arith `1+x = SUC x`;SUC_EXPLICIT];
4160     FIRST_X_ASSUM (RULE_ASSUM_TAC o (unlist REWRITE_RULE));
4161     RULE_ASSUM_TAC (REWRITE_RULE[arith `1 + x = SUC x`;SUC_EXPLICIT]);
4162     FIRST_X_ASSUM_ST `vv 4 = vv 0` (RULE_ASSUM_TAC o (unlist REWRITE_RULE));
4163     GEXISTL_TAC [`vv 2`;`vv 1`;`vv 3`;`vv 0`];
4164     ASM_REWRITE_TAC[];
4165     ONCE_REWRITE_TAC[enclosed_sym];
4166     FIRST_X_ASSUM_ST `enclosed` MP_TAC;
4167     ASM_REWRITE_TAC[];
4168     DISCH_THEN SUBST1_TAC;
4169     CONJ_TAC;
4170       RULE_ASSUM_TAC(REWRITE_RULE[IMAGE_SUBSET_IN;IN_UNIV]);
4171       ASM_REWRITE_TAC[SUBSET;IN_INSERT;NOT_IN_EMPTY];
4172       BY(FIRST_X_ASSUM_ST `ball_annulus` MP_TAC THEN MESON_TAC[]);
4173     CONJ_TAC;
4174       BY(MESON_TAC[tau3_sym]);
4175     FIRST_X_ASSUM_ST `<=` MP_TAC;
4176     RULE_ASSUM_TAC(REWRITE_RULE[I_THM]);
4177     ASM_REWRITE_TAC[];
4178     DISCH_THEN (unlist REWRITE_TAC);
4179     FIRST_X_ASSUM MATCH_MP_TAC;
4180     REWRITE_TAC[FUNLIST_EXPLICIT;MOD_4_EXPLICIT];
4181     BY(REAL_ARITH_TAC);
4182   COMMENT "final kill";
4183   FIRST_X_ASSUM_ST `main_nonlinear_terminal_v11` MP_TAC;
4184   FIRST_X_ASSUM_ST `sqrt8 < c` MP_TAC;
4185   REPEAT (FIRST_X_ASSUM kill);
4186   REWRITE_TAC[LET_THM];
4187   REPEAT WEAKER_STRIP_TAC;
4188   ASM_REWRITE_TAC[];
4189   RULE_ASSUM_TAC(ONCE_REWRITE_RULE[ISPEC `(a:real) = b` (GSYM I_THM)]);
4190   REPEAT (GMATCH_SIMP_TAC tau3_taum_40);
4191   RULE_ASSUM_TAC(REWRITE_RULE[INSERT_SUBSET]) THEN ASM_REWRITE_TAC[DIST_SYM];
4192   CONJ_TAC;
4193     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Appendix.cstab;I_THM] THEN REAL_ARITH_TAC);
4194   CONJ_TAC;
4195     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[Appendix.cstab;I_THM] THEN REAL_ARITH_TAC);
4196   MATCH_MP_TAC (arith `x < y ==> x <= y`);
4197   COMMENT "get";
4198   MP_TAC (UNDISCH quad_7697147739_derived);
4199   REWRITE_TAC[Sphere.ineq;TAUT `(a ==> b==> c) <=> (a /\ b) ==> c `;TAUT `(a /\ b) /\ c <=> a /\ b /\ c`];
4200   REWRITE_TAC[Sphere.tauq];
4201   DISCH_THEN MATCH_MP_TAC;
4202   TYPIFY `dist(v1,v4)` EXISTS_TAC;
4203   FIRST_X_ASSUM MP_TAC;
4204   REWRITE_TAC[I_THM] THEN DISCH_THEN (fun t -> RULE_ASSUM_TAC(REWRITE_RULE[t]) THEN SUBST1_TAC t);
4205   TYPIFY `&0 <= delta_y (dist (v1,v4)) (dist (v2,v4)) (dist (v3,v4)) (dist (v2,v3)) (dist (v1,v3)) (dist (v1,v2))` (C SUBGOAL_THEN (unlist REWRITE_TAC));
4206     TYPIFY `dist (v1,v4) = dist(v4,v1) /\ dist(v2,v4) = dist(v4,v2) /\ dist(v3,v4) = dist(v4,v3)` (C SUBGOAL_THEN (unlist REWRITE_TAC));
4207       BY(MESON_TAC[DIST_SYM]);
4208     BY(REWRITE_TAC[DELTA_Y_POS_4POINTS]);
4209   RULE_ASSUM_TAC(REWRITE_RULE[I_THM;Appendix.cstab;Fnjlbxs.in_ball_annulus]) THEN ASM_REWRITE_TAC[Appendix.cstab;arith `#2.0= &2`];
4210   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC)
4211   ]);;
4212   (* }}} *)
4213 *)
4214
4215 let empty_4T4  = prove_by_refinement(
4216   `main_nonlinear_terminal_v11 ==> 
4217         (let s = scs_4T4 in
4218            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))`,
4219   (* {{{ proof *)
4220   [
4221   REWRITE_TAC[Appendix.scs_4T4];
4222   REPEAT WEAKER_STRIP_TAC;
4223   REWRITE_TAC[LET_THM];
4224   MATCH_MP_TAC (REWRITE_RULE[LET_THM] (UNDISCH terminal_quad_lemma));
4225   COMMENT "digression";
4226   TYPIFY `(!i j. i < 4 /\ j < 4 /\ ~(i = j) ==> &2 <= funlist_v39 [(0,1),&2 * h0; (0,2),sqrt8; (1,3),sqrt8] (&2) 4 i j)` (C SUBGOAL_THEN ASSUME_TAC);
4227     REWRITE_TAC[arith `i < 4 <=> (i = 0 \/ i = 1 \/ i = 2 \/ i = 3)`];
4228     REWRITE_TAC[TAUT `(a \/ b) /\ c <=> a /\ c \/ b /\ c`;TAUT `a /\ (b \/ c) <=> (a /\ b) \/ a /\ c`];
4229     REWRITE_TAC[TAUT `(a \/ b) \/ c <=> a \/ b \/ c`;arith `~(i = k /\ j = k /\ ~(i = (j:num)))`];
4230     REPEAT WEAKER_STRIP_TAC;
4231     BY((REPEAT (FIRST_X_ASSUM DISJ_CASES_TAC) THEN ASM_REWRITE_TAC[FUNLIST_EXPLICIT;arith `SUC 0 = 1 /\ SUC 1 = 2 /\ SUC 2 = 3 /\ SUC 3 = 4`;MOD_4_EXPLICIT;arith `&2 <= &2 /\ &2 <= &3`;arith `~(0=1) /\ ~(0=2) /\ ~(0=3) /\ ~(1 =2) /\ ~(1 = 3) /\ ~(2 = 3)`;Sphere.h0] THEN MP_TAC sqrt8_flyspeck  THEN TRY REAL_ARITH_TAC));
4232   COMMENT "digress2";
4233   TYPIFY `!i j. (i=0 /\ j=1) \/ (i=0 /\ j=3) \/ (i=1 /\ j=2) \/ (i=1 /\ j=3) \/ (i=2 /\ j=3) ==>  funlist_v39 [(0,1),sqrt8; (0,2),&6; (1,3),cstab] (&2 * h0) 4 i j < &4` (C SUBGOAL_THEN ASSUME_TAC);
4234     REWRITE_TAC[arith `i < 4 <=> (i = 0 \/ i = 1 \/ i = 2 \/ i = 3)`];
4235     REWRITE_TAC[TAUT `(a \/ b) /\ c <=> a /\ c \/ b /\ c`;TAUT `a /\ (b \/ c) <=> (a /\ b) \/ a /\ c`];
4236     REWRITE_TAC[TAUT `(a \/ b) \/ c <=> a \/ b \/ c`;arith `~(i = k /\ j = k /\ ~(i = (j:num)))`];
4237     REWRITE_TAC[Appendix.cs_adj;Sphere.h0];
4238     REPEAT WEAKER_STRIP_TAC;
4239     BY((REPEAT (FIRST_X_ASSUM DISJ_CASES_TAC) THEN ASM_REWRITE_TAC[FUNLIST_EXPLICIT;arith `SUC 0 = 1 /\ SUC 1 = 2 /\ SUC 2 = 3 /\ SUC 3 = 4`;MOD_4_EXPLICIT;arith `&2 * #1.26 < &4 /\ &3 < &4`;arith `~(0=1) /\ ~(0=2) /\ ~(0=3) /\ ~(1 =2) /\ ~(1 = 3) /\ ~(2 = 3)`;Sphere.cstab] THEN MP_TAC sqrt8_flyspeck THEN TRY REAL_ARITH_TAC));
4240   CONJ_TAC;
4241     BY(ASM_MESON_TAC[arith `&2 <= x ==> &0 < x`]);
4242   REPEAT WEAKER_STRIP_TAC;
4243   REWRITE_TAC[arith `x + &0 = x /\ &4 - &2 = &2`];
4244   TYPIFY `(!i j. i < 4 /\ j < 4 /\ vv i = vv j ==> i = j)` (C SUBGOAL_THEN ASSUME_TAC);
4245     REPEAT WEAKER_STRIP_TAC;
4246     PROOF_BY_CONTR_TAC;
4247     BY(ASM_MESON_TAC[DIST_REFL;REAL_LE_TRANS;arith `~(&2 <= &0)`]);
4248   COMMENT "vv";
4249   TYPIFY `vv 4 = vv 0 /\ vv 5 = vv 1 /\ vv 6 = vv 2` (C SUBGOAL_THEN ASSUME_TAC);
4250     BY((REPEAT CONJ_TAC) THEN GMATCH_SIMP_TAC periodic_vv_inj THEN TYPIFY `4` EXISTS_TAC THEN ASM_REWRITE_TAC[MOD_4_EXPLICIT;arith `~(4 = 0)`]);
4251   ASM_REWRITE_TAC[];
4252   GMATCH_SIMP_TAC (REWRITE_RULE[LET_THM] vv_quad_split123);
4253   ASM_REWRITE_TAC[];
4254   COMMENT "dist";
4255   SUBCONJ_TAC;
4256     TYPIFY `(!i j. ~(vv i = vv j) ==> &2 <= dist (vv i,vv j))` (C SUBGOAL_THEN ASSUME_TAC);
4257       MATCH_MP_TAC periodic2_mod_reduce;
4258       TYPIFY `4` EXISTS_TAC;
4259       REWRITE_TAC[Appendix.periodic2;arith `~(4 = 0)`];
4260       TYPIFY `!i. vv (i + 4) = vv i` (C SUBGOAL_THEN (unlist REWRITE_TAC));
4261         BY(ASM_MESON_TAC[Oxl_def.periodic;arith `~(4 = 0)`]);
4262       REPEAT WEAKER_STRIP_TAC;
4263       BY(ASM_MESON_TAC[REAL_LE_TRANS]);
4264     ASM_REWRITE_TAC[];
4265     BY(ASM_MESON_TAC[REAL_LET_TRANS]);
4266   REPEAT WEAKER_STRIP_TAC;
4267   COMMENT "tau3";
4268   REPEAT (GMATCH_SIMP_TAC tau3_taum_40);
4269   ASM_REWRITE_TAC[];
4270   RULE_ASSUM_TAC(REWRITE_RULE[IMAGE_SUBSET_IN;IN_UNIV]);
4271   ASM_REWRITE_TAC[DIST_SYM];
4272   TYPIFY `dist (vv 3,vv 0) < &4 ` (C SUBGOAL_THEN (unlist REWRITE_TAC));
4273     ONCE_REWRITE_TAC[DIST_SYM];
4274     BY(ASM_REWRITE_TAC[]);
4275   REWRITE_TAC[TAUT `a /\ b /\ c <=> (a /\ b) /\ c`];
4276   CONJ_TAC;
4277     FIRST_X_ASSUM (REPEAT o GMATCH_SIMP_TAC);
4278     FIRST_X_ASSUM_ST `i < 4` MP_TAC;
4279     BY(MESON_TAC[arith `1 < 4 /\ 2 < 4 /\ 3 < 4 /\ 0 < 4 /\ ~(2=3) /\ ~(2  =1) /\ ~(1 =0) /\ ~(1 = 3) /\ ~(3=0 ) /\ ~(1 = 2)`]);
4280   COMMENT "prep dist";
4281   TYPED_ABBREV_TAC `a = funlist_v39 [(0,1),&2 * h0; (0,2),sqrt8; (1,3),sqrt8] (&2) 4`;
4282   TYPED_ABBREV_TAC `b = funlist_v39 [(0,1),sqrt8; (0,2),&6; (1,3),cstab] (&2 * h0) 4`;
4283   TYPIFY `(!i j d. d <= a i j  ==> d <= dist (vv i,vv j)) /\ (!i j d. b i j        <= d ==>   dist (vv i,vv j) <= d)` (C SUBGOAL_THEN MP_TAC);
4284     BY(ASM_MESON_TAC[REAL_LE_TRANS]);
4285   REPEAT WEAKER_STRIP_TAC;
4286   TYPIFY `a 1 0 = &2 * h0 /\ a 2 1 = &2 /\ a 2 3 = &2 /\ a 3 0 = &2 /\ a 1 3 = sqrt8 /\ b 1 0 = sqrt8 /\ b 2 1 = &2 * h0 /\ b 2 3 = &2 * h0 /\ b 3 0 = &2 * h0 /\ b 1 3 = cstab` (C SUBGOAL_THEN ASSUME_TAC);
4287     EXPAND_TAC "a";
4288     EXPAND_TAC "b";
4289     BY(REWRITE_TAC[FUNLIST_EXPLICIT;MOD_4_EXPLICIT]);
4290   RULE_ASSUM_TAC(REWRITE_RULE[Fnjlbxs.in_ball_annulus]);
4291   TYPIFY `#2.52 = &2 * h0` (C SUBGOAL_THEN ASSUME_TAC);
4292     BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
4293   COMMENT "fist get";
4294   INTRO_TAC (get_main_nonlinear "5405130650") [`norm (vv 0)`;`norm (vv 3)`;`norm (vv 1)`;`dist(vv 3,vv 1)`;`dist(vv 0,vv 1)`;`dist(vv 0,vv 3)`];
4295   REWRITE_TAC[Sphere.ineq];
4296   REWRITE_TAC[TAUT `(a ==> b==> c) <=> (a /\ b) ==> c `;TAUT `(a /\ b) /\ c <=> a /\ b /\ c`];
4297   REWRITE_TAC[arith `(d < &0) <=> ~(&0 <= d)`];
4298   REWRITE_TAC[REWRITE_RULE[LET_THM] Tame_lemmas.delta_y_pos];
4299   ASM_REWRITE_TAC[DIST_SYM;arith `#2.0 = &2`];
4300   ANTS_TAC;
4301     BY((REPEAT CONJ_TAC THEN (FIRST_X_ASSUM MATCH_MP_TAC) THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[Sphere.h0;Sphere.cstab] THEN TRY REAL_ARITH_TAC));
4302   DISCH_TAC;
4303   COMMENT "second get";
4304   INTRO_TAC (get_main_nonlinear "3603097872") [`norm (vv 2)`;`norm (vv 3)`;`norm (vv 1)`;`dist(vv 3,vv 1)`;`dist(vv 2,vv 1)`;`dist(vv 2,vv 3)`];
4305   REWRITE_TAC[Sphere.ineq];
4306   REWRITE_TAC[TAUT `(a ==> b==> c) <=> (a /\ b) ==> c `;TAUT `(a /\ b) /\ c <=> a /\ b /\ c`];
4307   REWRITE_TAC[arith `(d < &0) <=> ~(&0 <= d)`];
4308   REWRITE_TAC[REWRITE_RULE[LET_THM] Tame_lemmas.delta_y_pos];
4309   ASM_REWRITE_TAC[DIST_SYM;arith `#2.0 = &2`];
4310   ANTS_TAC;
4311     BY((REPEAT CONJ_TAC THEN (FIRST_X_ASSUM MATCH_MP_TAC) THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[Sphere.h0;Sphere.cstab] THEN TRY REAL_ARITH_TAC));
4312   COMMENT "final kill";
4313   FIRST_X_ASSUM MP_TAC;
4314   REWRITE_TAC[DIST_SYM];
4315   TYPIFY `taum (norm (vv 0)) (norm (vv 3)) (norm (vv 1)) (dist (vv 1,vv 3)) (dist (vv 1,vv 0)) (dist (vv 3,vv 0)) = taum (norm (vv 3)) (norm (vv 0)) (norm (vv 1)) (dist (vv 1,vv 0))     (dist (vv 1,vv 3))     (dist (vv 3,vv 0)) /\ taum (norm (vv 2)) (norm (vv 3)) (norm (vv 1)) (dist (vv 1,vv 3))     (dist (vv 2,vv 1))     (dist (vv 2,vv 3)) = taum (norm (vv 1)) (norm (vv 2)) (norm (vv 3)) (dist (vv 2,vv 3))     (dist (vv 1,vv 3))     (dist (vv 2,vv 1))` ENOUGH_TO_SHOW_TAC;
4316     DISCH_THEN (unlist REWRITE_TAC);
4317     BY(REAL_ARITH_TAC);
4318   BY(REWRITE_TAC[(* Terminal. *) taum_sym])
4319   ]);;
4320   (* }}} *)
4321
4322 let empty_4T5  = prove_by_refinement(
4323   `main_nonlinear_terminal_v11 ==> 
4324         (let s = scs_4T5 in
4325            (!vv. BBs_v39 s vv ==> &0 <= taustar_v39 s vv))`,
4326   (* {{{ proof *)
4327   [
4328   REWRITE_TAC[Appendix.scs_4T5];
4329   REPEAT WEAKER_STRIP_TAC;
4330   REWRITE_TAC[LET_THM];
4331   MATCH_MP_TAC (REWRITE_RULE[LET_THM] (UNDISCH terminal_quad_lemma));
4332   COMMENT "digression";
4333   TYPED_ABBREV_TAC `a = funlist_v39 [(0,1),&2 * h0; (0,2),cstab; (1,3),cstab] (&2) 4`;
4334   TYPED_ABBREV_TAC `b = funlist_v39 [(0,1),cstab; (0,2),&6; (1,3),cstab] (&2 * h0) 4`;
4335   TYPIFY `(!i j. i < 4 /\ j < 4 /\ ~(i = j) ==> &2 <= a i j)` (C SUBGOAL_THEN ASSUME_TAC);
4336     REWRITE_TAC[arith `i < 4 <=> (i = 0 \/ i = 1 \/ i = 2 \/ i = 3)`];
4337     REWRITE_TAC[TAUT `(a \/ b) /\ c <=> a /\ c \/ b /\ c`;TAUT `a /\ (b \/ c) <=> (a /\ b) \/ a /\ c`];
4338     REWRITE_TAC[TAUT `(a \/ b) \/ c <=> a \/ b \/ c`;arith `~(i = k /\ j = k /\ ~(i = (j:num)))`];
4339     REPEAT WEAKER_STRIP_TAC;
4340     EXPAND_TAC "a";
4341     BY((REPEAT (FIRST_X_ASSUM DISJ_CASES_TAC) THEN ASM_REWRITE_TAC[FUNLIST_EXPLICIT;arith `SUC 0 = 1 /\ SUC 1 = 2 /\ SUC 2 = 3 /\ SUC 3 = 4`;MOD_4_EXPLICIT;arith `&2 <= &2 /\ &2 <= &3`;arith `~(0=1) /\ ~(0=2) /\ ~(0=3) /\ ~(1 =2) /\ ~(1 = 3) /\ ~(2 = 3)`;Sphere.h0;Sphere.cstab] THEN MP_TAC sqrt8_flyspeck THEN TRY REAL_ARITH_TAC));
4342   COMMENT "digress2";
4343   TYPIFY `!i j. (i=0 /\ j=1) \/ (i=0 /\ j=3) \/ (i=1 /\ j=2) \/ (i=1 /\ j=3) \/ (i=2 /\ j=3) ==>  b i j < &4` (C SUBGOAL_THEN ASSUME_TAC);
4344     REWRITE_TAC[arith `i < 4 <=> (i = 0 \/ i = 1 \/ i = 2 \/ i = 3)`];
4345     REWRITE_TAC[TAUT `(a \/ b) /\ c <=> a /\ c \/ b /\ c`;TAUT `a /\ (b \/ c) <=> (a /\ b) \/ a /\ c`];
4346     REWRITE_TAC[TAUT `(a \/ b) \/ c <=> a \/ b \/ c`;arith `~(i = k /\ j = k /\ ~(i = (j:num)))`];
4347     EXPAND_TAC "b";
4348     REPEAT WEAKER_STRIP_TAC;
4349     BY((REPEAT (FIRST_X_ASSUM DISJ_CASES_TAC) THEN ASM_REWRITE_TAC[FUNLIST_EXPLICIT;arith `SUC 0 = 1 /\ SUC 1 = 2 /\ SUC 2 = 3 /\ SUC 3 = 4`;MOD_4_EXPLICIT;arith `&2 * #1.26 < &4 /\ &3 < &4`;arith `~(0=1) /\ ~(0=2) /\ ~(0=3) /\ ~(1 =2) /\ ~(1 = 3) /\ ~(2 = 3)`;Sphere.cstab;Sphere.h0] THEN MP_TAC sqrt8_flyspeck THEN TRY REAL_ARITH_TAC));
4350   CONJ_TAC;
4351     BY(ASM_MESON_TAC[arith `&2 <= x ==> &0 < x`]);
4352   REPEAT WEAKER_STRIP_TAC;
4353   REWRITE_TAC[arith `x + &0 = x /\ &4 - &2 = &2`];
4354   TYPIFY `(!i j. i < 4 /\ j < 4 /\ vv i = vv j ==> i = j)` (C SUBGOAL_THEN ASSUME_TAC);
4355     REPEAT WEAKER_STRIP_TAC;
4356     PROOF_BY_CONTR_TAC;
4357     BY(ASM_MESON_TAC[DIST_REFL;REAL_LE_TRANS;arith `~(&2 <= &0)`]);
4358   COMMENT "vv";
4359   TYPIFY `vv 4 = vv 0 /\ vv 5 = vv 1 /\ vv 6 = vv 2` (C SUBGOAL_THEN ASSUME_TAC);
4360     BY((REPEAT CONJ_TAC) THEN GMATCH_SIMP_TAC periodic_vv_inj THEN TYPIFY `4` EXISTS_TAC THEN ASM_REWRITE_TAC[MOD_4_EXPLICIT;arith `~(4 = 0)`]);
4361   ASM_REWRITE_TAC[];
4362   GMATCH_SIMP_TAC (REWRITE_RULE[LET_THM] vv_quad_split123);
4363   ASM_REWRITE_TAC[];
4364   COMMENT "dist";
4365   SUBCONJ_TAC;
4366     TYPIFY `(!i j. ~(vv i = vv j) ==> &2 <= dist (vv i,vv j))` (C SUBGOAL_THEN ASSUME_TAC);
4367       MATCH_MP_TAC periodic2_mod_reduce;
4368       TYPIFY `4` EXISTS_TAC;
4369       REWRITE_TAC[Appendix.periodic2;arith `~(4 = 0)`];
4370       TYPIFY `!i. vv (i + 4) = vv i` (C SUBGOAL_THEN (unlist REWRITE_TAC));
4371         BY(ASM_MESON_TAC[Oxl_def.periodic;arith `~(4 = 0)`]);
4372       REPEAT WEAKER_STRIP_TAC;
4373       BY(ASM_MESON_TAC[REAL_LE_TRANS]);
4374     ASM_REWRITE_TAC[];
4375     BY(ASM_MESON_TAC[REAL_LET_TRANS]);
4376   REPEAT WEAKER_STRIP_TAC;
4377   COMMENT "tau3";
4378   REPEAT (GMATCH_SIMP_TAC tau3_taum_40);
4379   ASM_REWRITE_TAC[];
4380   RULE_ASSUM_TAC(REWRITE_RULE[IMAGE_SUBSET_IN;IN_UNIV]);
4381   ASM_REWRITE_TAC[DIST_SYM];
4382   TYPIFY `dist (vv 3,vv 0) < &4 ` (C SUBGOAL_THEN (unlist REWRITE_TAC));
4383     ONCE_REWRITE_TAC[DIST_SYM];
4384     BY(ASM_REWRITE_TAC[]);
4385   REWRITE_TAC[TAUT `a /\ b /\ c <=> (a /\ b) /\ c`];
4386   CONJ_TAC;
4387     FIRST_X_ASSUM (REPEAT o GMATCH_SIMP_TAC);
4388     FIRST_X_ASSUM_ST `i < 4` MP_TAC;
4389     BY(MESON_TAC[arith `1 < 4 /\ 2 < 4 /\ 3 < 4 /\ 0 < 4 /\ ~(2=3) /\ ~(2  =1) /\ ~(1 =0) /\ ~(1 = 3) /\ ~(3=0 ) /\ ~(1 = 2)`]);
4390   COMMENT "prep dist";
4391   TYPIFY `(!i j d. d <= a i j  ==> d <= dist (vv i,vv j)) /\ (!i j d. b i j        <= d ==>   dist (vv i,vv j) <= d)` (C SUBGOAL_THEN MP_TAC);
4392     BY(ASM_MESON_TAC[REAL_LE_TRANS]);
4393   REPEAT WEAKER_STRIP_TAC;
4394   TYPIFY `a 1 0 = &2 * h0 /\ a 2 1 = &2 /\ a 2 3 = &2 /\ a 3 0 = &2 /\ a 1 3 = cstab /\ b 1 0 = cstab /\ b 2 1 = &2 * h0 /\ b 2 3 = &2 * h0 /\ b 3 0 = &2 * h0 /\ b 1 3 = cstab` (C SUBGOAL_THEN ASSUME_TAC);
4395     EXPAND_TAC "a";
4396     EXPAND_TAC "b";
4397     BY(REWRITE_TAC[FUNLIST_EXPLICIT;MOD_4_EXPLICIT]);
4398   RULE_ASSUM_TAC(REWRITE_RULE[Fnjlbxs.in_ball_annulus]);
4399   TYPIFY `#2.52 = &2 * h0` (C SUBGOAL_THEN ASSUME_TAC);
4400     BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
4401   INTRO_TAC (get_main_nonlinear "9096461391") [`norm (vv 1)`;`norm (vv 3)`;`norm (vv 0)`;`dist(vv 3,vv 0)`;`dist(vv 1,vv 0)`;`dist(vv 1,vv 3)`];
4402   REWRITE_TAC[Sphere.ineq];
4403   REWRITE_TAC[TAUT `(a ==> b==> c) <=> (a /\ b) ==> c `;TAUT `(a /\ b) /\ c <=> a /\ b /\ c`];
4404   ASM_REWRITE_TAC[DIST_SYM;arith `#2.0 = &2`];
4405   ANTS_TAC;
4406     BY((REPEAT CONJ_TAC THEN (FIRST_X_ASSUM MATCH_MP_TAC) THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[Sphere.h0;Sphere.cstab] THEN TRY REAL_ARITH_TAC));
4407   DISCH_TAC;
4408   COMMENT "second get";
4409   INTRO_TAC (get_main_nonlinear "2445657182") [`norm (vv 1)`;`norm (vv 3)`;`norm (vv 2)`;`dist(vv 3,vv 2)`;`dist(vv 1,vv 2)`;`dist(vv 1,vv 3)`];
4410   REWRITE_TAC[Sphere.ineq];
4411   REWRITE_TAC[TAUT `(a ==> b==> c) <=> (a /\ b) ==> c `;TAUT `(a /\ b) /\ c <=> a /\ b /\ c`];
4412   ASM_REWRITE_TAC[DIST_SYM;arith `#2.0 = &2`];
4413   ANTS_TAC;
4414     BY((REPEAT CONJ_TAC THEN (FIRST_X_ASSUM MATCH_MP_TAC) THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[Sphere.h0;Sphere.cstab] THEN TRY REAL_ARITH_TAC));
4415   COMMENT "final kill";
4416   FIRST_X_ASSUM MP_TAC;
4417   REWRITE_TAC[DIST_SYM];
4418   TYPIFY `taum (norm (vv 1)) (norm (vv 3)) (norm (vv 0)) (dist (vv 3,vv 0)) (dist (vv 1,vv 0)) (dist (vv 1,vv 3)) = taum (norm (vv 3)) (norm (vv 0)) (norm (vv 1)) (dist (vv 1,vv 0))     (dist (vv 1,vv 3))     (dist (vv 3,vv 0)) /\ taum (norm (vv 1)) (norm (vv 3)) (norm (vv 2)) (dist (vv 2,vv 3))     (dist (vv 2,vv 1))     (dist (vv 1,vv 3))  = taum (norm (vv 1)) (norm (vv 2)) (norm (vv 3)) (dist (vv 2,vv 3))     (dist (vv 1,vv 3))     (dist (vv 2,vv 1))` ENOUGH_TO_SHOW_TAC;
4419     DISCH_THEN (unlist REWRITE_TAC);
4420     BY(REAL_ARITH_TAC);
4421   BY(REWRITE_TAC[(* Terminal. *)taum_sym])
4422   ]);;
4423   (* }}} *)
4424
4425
4426
4427   end;;
4428
4429
4430
4431
4432