Update from HH
[Flyspeck/.git] / text_formalization / local / JOTSWIX.hl
1 module Jotswix = struct
2
3   open Hales_tactic;;
4
5
6 let LET_THM = CONJ LET_DEF LET_END_DEF;;
7 let UNDISCH2 = repeat UNDISCH;;
8
9
10 (*
11 let get_work = 
12   let is_main = function 
13     | Main_estimate -> true
14     | _ -> false in
15   let has_main ind = 
16     exists (is_main) ind.tags in
17   let main_ineq_data1 = 
18     filter has_main (!Ineq.ineqs) in
19   let id = map (fun t-> t.idv) main_ineq_data1 in
20     (* debug 
21   let id = nonlinear_ineq_terminal in *)
22   let main_ineq_data = map (fun t -> hd(Ineq.getexact t)) id in
23   let ineql = map (fun ind -> ind.ineq) main_ineq_data in
24   let sl = map (fun ind -> ind.idv) main_ineq_data in
25   let main_ineq_conj = end_itlist (curry mk_conj) ineql in
26   let th = new_definition (mk_eq (`main_work4:bool`,main_ineq_conj)) in
27   let th1 = UNDISCH (MATCH_MP (TAUT `(a <=> b) ==> (a ==> b)`) th) in
28   let co1 thm = if (is_conj (concl thm)) then CONJUNCT1 thm else thm in
29   let tryindex s sl = try index s sl with  _ -> report s; failwith s in
30     fun s ->
31       let i = tryindex s sl in
32       let th2 = funpow i CONJUNCT2 th1 in
33         co1 th2;;
34
35 *)
36
37 let taum_attains_inf = prove_by_refinement(
38   (* main_work4 ==> *) `main_nonlinear_terminal_v11 ==> (!y1 y2 y3 y4 y5 y6. &2 <= y1 /\ y1 <= &2 * h0 /\
39         &2 <= y2 /\ y2 <= &2 * h0 /\
40         &2 <= y3 /\ y3 <= &2 * h0 /\
41         &2 <= y4 /\ y4 <= &2 * h0 /\
42         &2 <= y5 /\ y5 <= &2 * h0 /\
43         &2 <= y6 /\ y6 <= &2 * h0 
44         ==>
45         (?y4'. &2 <= y4' /\ y4' <= &2 * h0 /\ (!y4. &2 <= y4 /\ y4 <= &2 * h0 ==>
46            taum y1 y2 y3 y4' y5 y6 <= taum y1 y2 y3 y4 y5 y6)))`,
47   (* {{{ proof *)
48   [
49   REPEAT WEAKER_STRIP_TAC;
50   INTRO_TAC REAL_CONTINUOUS_ATTAINS_INF [`\q. taum y1 y2 y3 q y5 y6`;`real_interval [&2, &2 * h0]`];
51   ANTS_TAC;
52     REWRITE_TAC[REAL_COMPACT_INTERVAL];
53     CONJ_TAC;
54       REWRITE_TAC[EXTENSION;NOT_IN_EMPTY;IN_REAL_INTERVAL;NOT_FORALL_THM;Sphere.h0];
55       TYPIFY `&2` EXISTS_TAC;
56       BY(REAL_ARITH_TAC);
57     REWRITE_TAC[REAL_CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN];
58     REWRITE_TAC[IN_REAL_INTERVAL];
59     REPEAT WEAKER_STRIP_TAC;
60     MATCH_MP_TAC REAL_CONTINUOUS_ATREAL_WITHINREAL;
61     MATCH_MP_TAC Bkossge.real_continuous_taum;
62     ASM_SIMP_TAC[arith `&2 <= y ==> &0 < y`];
63     CONJ_TAC;
64       INTRO_TAC ((* get_work *) Terminal.get_main_nonlinear "4717061266") [`y1`;`y2`;`y3`;`x`;`y5`;`y6`];
65       REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;arith `x <= x`];
66       REWRITE_TAC[arith `x > &0 <=> &0 < x`] THEN DISCH_THEN MATCH_MP_TAC;
67       BY(ASM_REWRITE_TAC[]);
68     BY(REPEAT CONJ_TAC THEN MATCH_MP_TAC Ysskqoy.TRI_UPS_X_STRICT_POS THEN ASM_TAC THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
69   REWRITE_TAC[IN_REAL_INTERVAL];
70   REPEAT WEAKER_STRIP_TAC;
71   TYPIFY `x` EXISTS_TAC;
72   BY(ASM_MESON_TAC[])
73   ]);;
74   (* }}} *)
75
76 let TAUM_EXTREMAL = prove_by_refinement(
77   (* main_work4 ==> *) ` main_nonlinear_terminal_v11 ==> (!y1 y2 y3 y4 y5 y6.
78         &2 <= y1 /\ y1 <= &2 * h0 /\
79         &2 <= y2 /\ y2 <= &2 * h0 /\
80         &2 <= y3 /\ y3 <= &2 * h0 /\
81         &2 <= y4 /\ y4 <= &2 * h0 /\
82         &2 <= y5 /\ y5 <= &2 * h0 /\
83         &2 <= y6 /\ y6 <= &2 * h0 
84         ==>
85         (?y4'. (y4' = &2 * h0 \/ y4' = &2) /\
86            taum y1 y2 y3 y4' y5 y6 <= taum y1 y2 y3 y4 y5 y6)
87                                   )`,
88   (* {{{ proof *)
89   [
90   REPEAT WEAKER_STRIP_TAC;
91   INTRO_TAC (UNDISCH2 taum_attains_inf) [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`];
92   ASM_REWRITE_TAC[];
93   REPEAT WEAKER_STRIP_TAC;
94   TYPIFY `y4'` EXISTS_TAC;
95   CONJ2_TAC;
96     FIRST_X_ASSUM MATCH_MP_TAC;
97     BY(ASM_REWRITE_TAC[]);
98   PROOF_BY_CONTR_TAC;
99   TYPIFY `&2 < y4' /\ y4' < &2 * h0` (C SUBGOAL_THEN ASSUME_TAC);
100     BY(ASM_TAC THEN REAL_ARITH_TAC);
101   INTRO_TAC (UNDISCH Ocbicby.LEMMA_1834976363) [`y1`;`y2`;`y3`;`y4'`;`y5`;`y6`;`&2`;`&2 * h0`];
102   ANTS_TAC;
103     ASM_REWRITE_TAC[SUBSET;IN_REAL_INTERVAL;IN_ELIM_THM];
104     ASM_SIMP_TAC [arith `&2 <= y ==> &0 < y`];
105     INTRO_TAC Ocbicby.xrr_simple_lower_bound [`y2`;`y3`;`y4'`;`&2`];
106     INTRO_TAC Ocbicby.xrr_simple_lower_bound [`y1`;`y3`;`y5`;`&2`];
107     INTRO_TAC Ocbicby.xrr_simple_lower_bound [`y1`;`y2`;`y6`;`&2`];
108     ASM_REWRITE_TAC[arith `x <= x`];
109     REPEAT WEAKER_STRIP_TAC THEN ASM_REWRITE_TAC[];
110     CONJ_TAC;
111       INTRO_TAC Ocbicby.xrr_simple_upper_bound [`y2`;`y3`;`y4'`;`&2 * h0`];
112       ANTS_TAC;
113         BY(ASM_REWRITE_TAC[] THEN REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
114       BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
115     CONJ2_TAC;
116       BY(CONJ_TAC THEN MATCH_MP_TAC Bkossge.UPS_X_STD_POS THEN ASM_REWRITE_TAC[]);
117     REPEAT WEAKER_STRIP_TAC;
118     ASM_SIMP_TAC[arith `&2 < x ==> &0 < x`];
119     CONJ2_TAC;
120       MATCH_MP_TAC Bkossge.UPS_X_STD_POS THEN ASM_REWRITE_TAC[];
121       BY(ASM_TAC THEN REAL_ARITH_TAC);
122     INTRO_TAC ((* get_work *) Terminal.get_main_nonlinear "4717061266") [`y1`;`y2`;`y3`;`x`;`y5`;`y6`];
123     REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;arith `x <= x`];
124     REWRITE_TAC[arith `x > &0 <=> &0 < x`] THEN DISCH_THEN MATCH_MP_TAC;
125     (ASM_REWRITE_TAC[]);
126     BY(REPLICATE_TAC 2 (POP_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
127   REWRITE_TAC[IN_REAL_INTERVAL];
128   REPEAT WEAKER_STRIP_TAC;
129   FIRST_X_ASSUM (C INTRO_TAC [`y4''`]);
130   ANTS_TAC;
131     BY(ASM_TAC THEN REAL_ARITH_TAC);
132   BY(ASM_REWRITE_TAC[arith `~(x <= y) <=> (y < x)`])
133   ]);;
134   (* }}} *)
135
136 let TAUM_STD_POS = prove_by_refinement(
137   (* main_work4 ==> *) ` main_nonlinear_terminal_v11 ==> (!y1 y2 y3 y4 y5 y6.
138         &2 <= y1 /\ y1 <= &2 * h0 /\
139         &2 <= y2 /\ y2 <= &2 * h0 /\
140         &2 <= y3 /\ y3 <= &2 * h0 /\
141         &2 <= y4 /\ y4 <= &2 * h0 /\
142         &2 <= y5 /\ y5 <= &2 * h0 /\
143         &2 <= y6 /\ y6 <= &2 * h0 
144         ==>
145         (&0 <= taum y1 y2 y3 y4 y5 y6))`,
146   (* {{{ proof *)
147   [
148   REPEAT WEAKER_STRIP_TAC;
149   REWRITE_TAC[arith `x <= y <=> ~(y < x)`];
150   DISCH_TAC;
151   TYPIFY `&2 * h0 <= sqrt8 /\ #2.52 = &2 * h0 /\ &2 <= &2 * h0` (C SUBGOAL_THEN ASSUME_TAC);
152     BY(REWRITE_TAC[Sphere.h0] THEN MP_TAC Flyspeck_constants.bounds THEN REAL_ARITH_TAC);
153   COMMENT "y4";
154   INTRO_TAC (UNDISCH2 TAUM_EXTREMAL) [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`];
155   ASM_REWRITE_TAC[];
156   REPEAT WEAKER_STRIP_TAC;
157   FIRST_X_ASSUM (DISJ_CASES_TAC);
158     REPEAT (FIRST_X_ASSUM_ST `taum` MP_TAC) THEN ASM_REWRITE_TAC[] THEN REPEAT WEAKER_STRIP_TAC;
159     INTRO_TAC ( Terminal.get_main_nonlinear "5541487347") [`y2`;`y3`;`y1`;`y5`;`y6`;`y4'`];
160     REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;arith `x <= x`];
161     DISCH_THEN MP_TAC THEN ANTS_TAC;
162       BY(ASM_REWRITE_TAC[arith `x <= x`]);
163     TYPIFY `taum y2 y3 y1 y5 y6 y4' = taum y1 y2 y3 y4' y5 y6` (C SUBGOAL_THEN SUBST1_TAC);
164       BY(MESON_TAC[Terminal.taum_sym]);
165     ASM_REWRITE_TAC[];
166     BY(REPLICATE_TAC 3 (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
167   TYPIFY `taum y1 y2 y3 (&2) y5 y6 < &0` (C SUBGOAL_THEN ASSUME_TAC);
168     BY(FIRST_X_ASSUM_ST `taum` MP_TAC THEN ASM_REWRITE_TAC[] THEN ASM_TAC THEN REAL_ARITH_TAC);
169   FIRST_X_ASSUM MP_TAC;
170   POP_ASSUM kill;
171   REPEAT (FIRST_X_ASSUM_ST `taum` kill);
172   DISCH_TAC;
173   COMMENT "y5";
174   INTRO_TAC (UNDISCH2 TAUM_EXTREMAL) [`y2`;`y3`;`y1`;`y5`;`y6`;`(&2)`];
175   ASM_REWRITE_TAC[arith `x <= x`];
176   REPEAT WEAKER_STRIP_TAC;
177   TYPIFY `taum y1 y2 y3 (&2) y5 y6 = taum y2 y3 y1 y5 y6 (&2) /\ taum y3 y1 y2 y6 (&2) y4' = taum y2 y3 y1 y4' y6 (&2)` (C SUBGOAL_THEN ASSUME_TAC);
178     BY(MESON_TAC[Terminal.taum_sym]);
179   FIRST_X_ASSUM (DISJ_CASES_TAC);
180     REPEAT (FIRST_X_ASSUM_ST `taum` MP_TAC) THEN ASM_REWRITE_TAC[] THEN REPEAT WEAKER_STRIP_TAC;
181     INTRO_TAC ( Terminal.get_main_nonlinear "5541487347") [`y3`;`y1`;`y2`;`y6`;`&2`;`y4'`];
182     REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;arith `x <= x`];
183     DISCH_THEN MP_TAC THEN ANTS_TAC;
184       BY(ASM_REWRITE_TAC[arith `x <= x`]);
185     ASM_REWRITE_TAC[];
186     BY(REPLICATE_TAC 4 (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
187   TYPIFY `taum y1 y2 y3 (&2) (&2) y6 < &0` (C SUBGOAL_THEN ASSUME_TAC);
188     TYPIFY `taum y1 y2 y3 (&2) (&2) y6 = taum  y2 y3 y1 (&2) y6 (&2)` (C SUBGOAL_THEN SUBST1_TAC);
189       BY(MESON_TAC[Terminal.taum_sym]);
190     BY(REPEAT (FIRST_X_ASSUM_ST `taum` MP_TAC) THEN ASM_REWRITE_TAC[] THEN ASM_TAC THEN REAL_ARITH_TAC);
191   FIRST_X_ASSUM MP_TAC;
192   POP_ASSUM kill;
193   REPEAT (FIRST_X_ASSUM_ST `taum` kill);
194   DISCH_TAC;
195   COMMENT "y6";
196   INTRO_TAC (UNDISCH2 TAUM_EXTREMAL) [`y3`;`y1`;`y2`;`y6`;`(&2)`;`(&2)`];
197   ASM_REWRITE_TAC[arith `x <= x`];
198   REPEAT WEAKER_STRIP_TAC;
199   POP_ASSUM MP_TAC;
200   TYPIFY_GOAL_THEN `!z1 z2 z3. taum y3 y1 y2 z3 z1 z2 = taum y1 y2 y3 z1 z2 z3` (unlist REWRITE_TAC);
201     BY(MESON_TAC[Terminal.taum_sym]);
202   DISCH_TAC;
203   FIRST_X_ASSUM (DISJ_CASES_TAC);
204     REPEAT (FIRST_X_ASSUM_ST `taum` MP_TAC) THEN ASM_REWRITE_TAC[] THEN REPEAT WEAKER_STRIP_TAC;
205     INTRO_TAC ( Terminal.get_main_nonlinear "5541487347") [`y1`;`y2`;`y3`;`&2`;`&2`;`&2 * h0`];
206     REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;arith `x <= x`];
207     DISCH_THEN MP_TAC THEN ANTS_TAC;
208       BY(ASM_REWRITE_TAC[arith `x <= x`]);
209     BY(REPLICATE_TAC 4 (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
210   TYPIFY `taum y1 y2 y3 (&2) (&2) (&2) < &0` (C SUBGOAL_THEN ASSUME_TAC);
211     BY(REPEAT (FIRST_X_ASSUM_ST `taum` MP_TAC) THEN ASM_REWRITE_TAC[] THEN ASM_TAC THEN REAL_ARITH_TAC);
212   INTRO_TAC ( Terminal.get_main_nonlinear "OMKYNLT 3336871894") [`y1`;`y2`;`y3`;`&2`;`&2`;`&2`];
213   REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;arith `x <= x`];
214   ASM_REWRITE_TAC[arith `#2.0 = &2`];
215   BY(POP_ASSUM MP_TAC THEN REAL_ARITH_TAC)
216   ]);;
217   (* }}} *)
218
219 let LFLACKU = prove_by_refinement(
220   (* main_work4 ==> *) ` main_nonlinear_terminal_v11 ==>
221    scs_arrow_v39 {scs_3I1} {}`,
222   (* {{{ proof *)
223   [
224   REPEAT WEAKER_STRIP_TAC;
225   REPEAT (GMATCH_SIMP_TAC Ocbicby.pos_imp_scs_arrow_empty);
226   REWRITE_TAC[Appendix.scs_3I1;Appendix.mk_unadorned_v39];
227   MATCH_MP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] Terminal.taustar_taum_dfun);
228   REWRITE_TAC[Terminal.FUNLIST_EXPLICIT];
229   REWRITE_TAC[Appendix.is_ear_v39;Appendix.scs_v39_explicit;EMPTY_GSPEC;NOT_INSERT_EMPTY];
230   REWRITE_TAC[Appendix.d_tame];
231   REWRITE_TAC[Appendix.cs_adj;Terminal.FUNLIST_EXPLICIT];
232   NUM_REDUCE_TAC;
233   REWRITE_TAC[arith `x <= x`];
234   TYPIFY_GOAL_THEN `&2 * h0 <= #3.62` (unlist REWRITE_TAC);
235     BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
236   REPEAT WEAKER_STRIP_TAC;
237   REWRITE_TAC[arith `&0 +  #0.1 * -- &1 * (&0 + &0 + &0 + &0) = &0`];
238   MATCH_MP_TAC (UNDISCH2 TAUM_STD_POS);
239   BY(ASM_REWRITE_TAC[])
240   ]);;
241   (* }}} *)
242
243
244 let s_init_list_alt = prove_by_refinement(
245   `s_init_list_v39 = [scs_6I1;scs_5I1;scs_4I1;scs_3I1;scs_5I2;scs_4I2;scs_5I3;scs_4I3]`,
246   (* {{{ proof *)
247   [
248   REWRITE_TAC[Appendix.s_init_list_v39];
249   REPEAT LET_TAC;
250   ASM_REWRITE_TAC[CONS_11;Appendix.scs_6I1;Appendix.scs_5I1;Appendix.scs_4I1;Appendix.scs_3T1;Appendix.scs_5I2;Appendix.scs_5I3;Appendix.scs_4I3;Appendix.scs_3I1;Appendix.scs_4I2];
251   TYPIFY `(!a1 a2 a3. (a_pro 5 a1 a2 a3 = (funlist_v39   [(0,1),a1; (0,2),a3; (0,3),a3; (1,3),a3; (1,4),a3;   (2,4),  a3]  a2 5))) /\ (!a1 a2 a3. a_pro 4 a1 a2 a3  = (funlist_v39 [(0,1),a1; (0,2),a3; (1,3),a3] a2 4))` ENOUGH_TO_SHOW_TAC;
252     BY(DISCH_THEN (unlist REWRITE_TAC));
253   CONJ_TAC;
254     REPEAT WEAKER_STRIP_TAC;
255     REWRITE_TAC[FUN_EQ_THM];
256     MATCH_MP_TAC Terminal.periodic2_mod_reduce;
257     TYPIFY `5` EXISTS_TAC;
258     REWRITE_TAC[arith `~(5 =0)`];
259     CONJ_TAC;
260       REWRITE_TAC[Appendix.periodic2];
261       EXPAND_TAC "a_pro";
262       ASM_REWRITE_TAC[Oxl_2012.MOD_ADD_CANCEL;arith `SUC (j+5) = (SUC j) + 5`];
263       BY(MESON_TAC[Terminal.periodic2_funlist;Appendix.periodic2]);
264     REWRITE_TAC[arith `x < 5 <=> x = 0 \/ x = 1 \/ x = 2 \/ x = 3 \/ x = 4`];
265     REWRITE_TAC[TAUT ` ((a \/ b) /\ c) <=> ((a /\ c) \/ (b /\ c))`;TAUT `(a /\ (b \/ c)) <=> ((a /\ b) \/ (a /\ c))`];
266     EXPAND_TAC "a_pro";
267     REWRITE_TAC[Geomdetail.PAIR_EQ_EXPAND];
268     BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN NUM_REDUCE_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT;Hexagons.PSORT_5_EXPLICIT] THEN NUM_REDUCE_TAC);
269   REPEAT WEAKER_STRIP_TAC;
270   REWRITE_TAC[FUN_EQ_THM];
271   MATCH_MP_TAC Terminal.periodic2_mod_reduce;
272   TYPIFY `4` EXISTS_TAC;
273   REWRITE_TAC[arith `~(4 =0)`];
274   CONJ_TAC;
275     REWRITE_TAC[Appendix.periodic2];
276     EXPAND_TAC "a_pro";
277     ASM_REWRITE_TAC[Oxl_2012.MOD_ADD_CANCEL;arith `SUC (j+4) = (SUC j) + 4`];
278     BY(MESON_TAC[Terminal.periodic2_funlist;Appendix.periodic2]);
279   REWRITE_TAC[arith `x < 4 <=> x = 0 \/ x = 1 \/ x = 2 \/ x = 3`];
280   REWRITE_TAC[TAUT ` ((a \/ b) /\ c) <=> ((a /\ c) \/ (b /\ c))`;TAUT `(a /\ (b \/ c)) <=> ((a /\ b) \/ (a /\ c))`];
281   EXPAND_TAC "a_pro";
282   REWRITE_TAC[Geomdetail.PAIR_EQ_EXPAND];
283   BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN NUM_REDUCE_TAC THEN ASM_REWRITE_TAC[Terminal.FUNLIST_EXPLICIT] THEN NUM_REDUCE_TAC)
284   ]);;
285   (* }}} *)
286
287 (* moved to JEJTVGB.hl
288 let JEJTVGB_case_breakdown = prove_by_refinement(
289   (* main_work4 ==> *) ` main_nonlinear_terminal_v11 ==> (
290   scs_arrow_v39 { scs_6I1 } { scs_6T1, scs_5M1, scs_4M2, scs_3T1 } /\ // OEHDBEN
291     scs_arrow_v39 { scs_5I1 } { scs_stab_diag_v39 scs_5I1 0 2 , scs_5M2 } /\ // OTMTOTJ1
292 scs_arrow_v39 { scs_5I2 } { scs_stab_diag_v39 scs_5I2 0 2 , scs_5M2 } /\ // 
293
294 scs_arrow_v39 { scs_5I3 } { scs_stab_diag_v39 scs_5M1 0 2 , 
295                                                     scs_stab_diag_v39 scs_5M1 0 3, scs_stab_diag_v39 scs_5M1 2 4, scs_5M2 } /\ //  OTMTOTJ3
296
297 scs_arrow_v39 { scs_5M1 } { scs_stab_diag_v39 scs_5M1 0 2 , 
298                                                     scs_stab_diag_v39 scs_5M1 0 3, scs_stab_diag_v39 scs_5M1 2 4, scs_5M2 } /\ // OTMTOTJ4
299
300 scs_arrow_v39 { scs_5M2 } { scs_3T1,scs_3T4,scs_4M6',scs_4M7,scs_4M8,
301                                                    scs_5T1, scs_stab_diag_v39 scs_5I2 0 2 , 
302                                                    scs_stab_diag_v39 scs_5M1 0 2 ,     scs_stab_diag_v39 scs_5M1 0 3, scs_stab_diag_v39 scs_5M1 2 4 } /\ // HIJQAHA
303
304 scs_arrow_v39 { scs_stab_diag_v39 scs_5I1 0 2 }
305     {scs_4M2, scs_3M1 } /\ //  CNICGSF1 ..
306
307 scs_arrow_v39 { scs_stab_diag_v39 scs_5I2 0 2 }
308     {scs_4M3', scs_3T1 } /\ //  CNICGSF2
309
310 scs_arrow_v39 { scs_stab_diag_v39 scs_5M1 0 2 }
311     {scs_4M2, scs_3T4 } /\ //  CNICGSF3
312
313 scs_arrow_v39 { scs_stab_diag_v39 scs_5M1 0 3 }
314     {scs_4M4', scs_3M1 } /\ //  CNICGSF4
315
316 scs_arrow_v39 { scs_stab_diag_v39 scs_5M1 2 4 }
317     {scs_4M5', scs_3M1 } /\ //  CNICGSF5 ..
318
319   scs_arrow_v39 { scs_4I1 } {scs_4I2, scs_stab_diag_v39 scs_4I1 0 2 } /\ // FYSSVEV
320
321
322   scs_arrow_v39 { scs_4I2 } { scs_4T1, scs_4T2 } /\ // ARDBZYE
323
324
325   scs_arrow_v39 { scs_stab_diag_v39 scs_4I1 0 2 } { scs_3M1 } /\ // AUEAHEH
326
327   // scs_arrow_v39 { scs_stab_diag_v39 scs_4I3 0 2 } { scs_4T4 } /\ // ZNLLLDL (internal)
328
329   scs_arrow_v39 { scs_4I3 } { scs_4T4, scs_4M6' } /\ // VQFYMZY ..
330
331 //  scs_arrow_v39 { scs_4M1 } { scs_4M2, scs_4M6' } /\ // unused.
332
333   scs_arrow_v39 { scs_4M2 } { scs_3M1, scs_3T4, scs_4M6' } /\ //  BNAWVNH
334
335   scs_arrow_v39 { scs_4M3' } { scs_3T1, scs_3T6', scs_4M6' } /\ // RAWZDIB
336
337   scs_arrow_v39 { scs_4M4' } { scs_3M1, scs_3T4, scs_3T3, scs_4M7 } /\ //  MFKLVDK
338
339   scs_arrow_v39 { scs_4M5' } { scs_3T4, scs_4M8 } /\ // RYPDIXT
340
341 scs_arrow_v39 {scs_4M6'} {scs_4T3,scs_4T5} /\ // NWDGKXH
342
343 scs_arrow_v39 {scs_4M7} {scs_3M1,scs_3T3,scs_3T4} /\ // YOBIMPP
344
345 scs_arrow_v39 {scs_4M8} {scs_4M6',scs_3T7,scs_3T4} /\ // MIQMCSN
346
347     scs_arrow_v39 {scs_3M1} {scs_3T1,scs_3T5} // BKOSSGE
348
349 ==> 
350 JEJTVGB_assume_v39)
351 `,
352   (* {{{ proof *)
353   [
354   REPEAT WEAKER_STRIP_TAC;
355   INTRO_TAC (UNDISCH Ocbicby.OCBICBY) [];
356   REPEAT WEAKER_STRIP_TAC;
357   TYPIFY `scs_arrow_v39 {scs_3M1} {}` (C SUBGOAL_THEN ASSUME_TAC);
358     MATCH_MP_TAC SCS_ARROW_TRANS_SING;
359     TYPIFY `{scs_3T1, scs_3T5}` EXISTS_TAC;
360     ASM_REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
361     BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
362   TYPIFY `scs_arrow_v39 {scs_4M6'} {}` (C SUBGOAL_THEN ASSUME_TAC);
363     MATCH_MP_TAC SCS_ARROW_TRANS_SING;
364     TYPIFY `{scs_4T3, scs_4T5}` EXISTS_TAC;
365     ASM_REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
366     BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
367   TYPIFY `scs_arrow_v39 {scs_4M7} {}` (C SUBGOAL_THEN ASSUME_TAC);
368     MATCH_MP_TAC SCS_ARROW_TRANS_SING;
369     TYPIFY `{scs_3M1, scs_3T3, scs_3T4}` EXISTS_TAC;
370     ASM_REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
371     BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
372   TYPIFY `scs_arrow_v39 {scs_4M8} {}` (C SUBGOAL_THEN ASSUME_TAC);
373     MATCH_MP_TAC SCS_ARROW_TRANS_SING;
374     TYPIFY `{scs_4M6', scs_3T7, scs_3T4}` EXISTS_TAC;
375     ASM_REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
376     BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
377   TYPIFY `scs_arrow_v39 {scs_4M5'} {}` (C SUBGOAL_THEN ASSUME_TAC);
378     MATCH_MP_TAC SCS_ARROW_TRANS_SING;
379     TYPIFY `{scs_3T4, scs_4M8}` EXISTS_TAC;
380     ASM_REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
381     BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
382   TYPIFY `scs_arrow_v39 {scs_4M4'} {}` (C SUBGOAL_THEN ASSUME_TAC);
383     MATCH_MP_TAC SCS_ARROW_TRANS_SING;
384     TYPIFY `{ scs_3M1, scs_3T4, scs_3T3, scs_4M7 }` EXISTS_TAC; (* revised *)
385     ASM_REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
386     BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
387   TYPIFY `scs_arrow_v39 {scs_4M3'} {}` (C SUBGOAL_THEN ASSUME_TAC);
388     MATCH_MP_TAC SCS_ARROW_TRANS_SING;
389     TYPIFY `{scs_3T1, scs_3T6', scs_4M6'}` EXISTS_TAC;
390     ASM_REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
391     BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
392   TYPIFY `scs_arrow_v39 {scs_4M2} {}` (C SUBGOAL_THEN ASSUME_TAC);
393     MATCH_MP_TAC SCS_ARROW_TRANS_SING;
394     TYPIFY `{ scs_3M1, scs_3T4, scs_4M6' }` EXISTS_TAC;
395     ASM_REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
396     BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
397   TYPIFY `scs_arrow_v39 {scs_4I3} {}` (C SUBGOAL_THEN ASSUME_TAC);
398     MATCH_MP_TAC SCS_ARROW_TRANS_SING;
399     TYPIFY `{scs_4T4, scs_4M6'}` EXISTS_TAC;
400     ASM_REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
401     BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
402   TYPIFY `scs_arrow_v39 {scs_stab_diag_v39 scs_4I1 0 2} {}` (C SUBGOAL_THEN ASSUME_TAC);
403     MATCH_MP_TAC SCS_ARROW_TRANS_SING;
404     TYPIFY `{scs_3M1}` EXISTS_TAC;
405     ASM_REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
406     BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
407   TYPIFY `scs_arrow_v39 {scs_4I2}  {}` (C SUBGOAL_THEN ASSUME_TAC);
408     MATCH_MP_TAC SCS_ARROW_TRANS_SING;
409     TYPIFY `{scs_4T1, scs_4T2}` EXISTS_TAC;
410     ASM_REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
411     BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
412   TYPIFY `scs_arrow_v39 {scs_4I1}  {}` (C SUBGOAL_THEN ASSUME_TAC);
413     MATCH_MP_TAC SCS_ARROW_TRANS_SING;
414     TYPIFY `{scs_4I2, scs_stab_diag_v39 scs_4I1 0 2}` EXISTS_TAC;
415     ASM_REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
416     BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
417   TYPIFY `scs_arrow_v39 {scs_stab_diag_v39 scs_5M1 2 4}   {}` (C SUBGOAL_THEN ASSUME_TAC);
418     MATCH_MP_TAC SCS_ARROW_TRANS_SING;
419     TYPIFY `{scs_4M5', scs_3M1}` EXISTS_TAC;
420     ASM_REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
421     BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
422   TYPIFY `scs_arrow_v39 {scs_stab_diag_v39 scs_5M1 0 3}   {}` (C SUBGOAL_THEN ASSUME_TAC);
423     MATCH_MP_TAC SCS_ARROW_TRANS_SING;
424     TYPIFY `{scs_4M4', scs_3M1}` EXISTS_TAC;
425     ASM_REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
426     BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
427   TYPIFY `scs_arrow_v39 {scs_stab_diag_v39 scs_5M1 0 2} {}` (C SUBGOAL_THEN ASSUME_TAC);
428     MATCH_MP_TAC SCS_ARROW_TRANS_SING;
429     TYPIFY ` {scs_4M2, scs_3T4}` EXISTS_TAC;
430     ASM_REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
431     BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
432   TYPIFY `scs_arrow_v39 {scs_stab_diag_v39 scs_5I2 0 2} {}` (C SUBGOAL_THEN ASSUME_TAC);
433     MATCH_MP_TAC SCS_ARROW_TRANS_SING;
434     TYPIFY `{scs_4M3', scs_3T1}` EXISTS_TAC;
435     ASM_REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
436     BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
437   TYPIFY `scs_arrow_v39 {scs_stab_diag_v39 scs_5I1 0 2} {}` (C SUBGOAL_THEN ASSUME_TAC);
438     MATCH_MP_TAC SCS_ARROW_TRANS_SING;
439     TYPIFY ` {scs_4M2, scs_3M1}` EXISTS_TAC;
440     ASM_REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
441     BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
442   TYPIFY `scs_arrow_v39 {scs_5M2} {}` (C SUBGOAL_THEN ASSUME_TAC);
443     MATCH_MP_TAC SCS_ARROW_TRANS_SING;
444     TYPIFY `      {scs_3T1, scs_3T4, scs_4M6', scs_4M7, scs_4M8, scs_5T1, scs_stab_diag_v39                                                              scs_5I2                                                              0                                                              2, scs_stab_diag_v39                                                                 scs_5M1                                                                 0                                                                 2, scs_stab_diag_v39                                                                    scs_5M1                                                                    0                                                                    3,       scs_stab_diag_v39 scs_5M1 2      4}` EXISTS_TAC;
445     ASM_REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
446     BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
447   TYPIFY `scs_arrow_v39 {scs_5M1} {}` (C SUBGOAL_THEN ASSUME_TAC);
448     MATCH_MP_TAC SCS_ARROW_TRANS_SING;
449     TYPIFY `{scs_stab_diag_v39 scs_5M1 0 2, scs_stab_diag_v39 scs_5M1 0 3,       scs_stab_diag_v39 scs_5M1 2      4, scs_5M2}` EXISTS_TAC;
450     ASM_REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
451     BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
452   TYPIFY `scs_arrow_v39 {scs_5I3} {}` (C SUBGOAL_THEN ASSUME_TAC);
453     MATCH_MP_TAC SCS_ARROW_TRANS_SING;
454     TYPIFY `{scs_stab_diag_v39 scs_5M1 0 2, scs_stab_diag_v39 scs_5M1 0 3,       scs_stab_diag_v39 scs_5M1 2      4, scs_5M2}` EXISTS_TAC;
455     ASM_REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
456     BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
457   TYPIFY `scs_arrow_v39 {scs_5I2} {}` (C SUBGOAL_THEN ASSUME_TAC);
458     MATCH_MP_TAC SCS_ARROW_TRANS_SING;
459     TYPIFY `{scs_stab_diag_v39 scs_5I2 0 2, scs_5M2}` EXISTS_TAC;
460     ASM_REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
461     BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
462   TYPIFY `scs_arrow_v39 {scs_5I1} {}` (C SUBGOAL_THEN ASSUME_TAC);
463     MATCH_MP_TAC SCS_ARROW_TRANS_SING;
464     TYPIFY ` {scs_stab_diag_v39 scs_5I1 0 2, scs_5M2}` EXISTS_TAC;
465     ASM_REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
466     BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
467   TYPIFY `scs_arrow_v39 {scs_6I1} {}` (C SUBGOAL_THEN ASSUME_TAC);
468     MATCH_MP_TAC SCS_ARROW_TRANS_SING;
469     TYPIFY `{scs_6T1, scs_5M1, scs_4M2, scs_3T1}` EXISTS_TAC;
470     ASM_REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
471     BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
472   COMMENT "final kill";
473   MATCH_MP_TAC Ayqjtmd.EAPGLE;
474   REWRITE_TAC[GSYM Ocbicby.scs_arrow_sing_empty];
475   REWRITE_TAC[s_init_list_alt;MEM];
476   REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[];
477   BY(REWRITE_TAC[UNDISCH2 LFLACKU])
478   ]);;
479   (* }}} *)
480 *)
481
482 let MOD_4_CASES = prove_by_refinement(
483   `!j p. j < 4 ==> j = (p+0) MOD 4 \/ j = (p+1) MOD 4 \/ j = (p+2) MOD 4 \/ j = (p+3) MOD 4`,
484   (* {{{ proof *)
485   [
486   REPEAT WEAKER_STRIP_TAC;
487   TYPIFY `p MOD 4 < 4` (C SUBGOAL_THEN ASSUME_TAC);
488     BY(MESON_TAC[DIVISION;arith `~(4 = 0)`]);
489   TYPED_ABBREV_TAC `i = p MOD 4`;
490   TYPIFY `(j = 0 \/ j = 1 \/ j = 2 \/ j = 3) /\ (i = 0 \/ i = 1 \/ i = 2 \/ i = 3)` (C SUBGOAL_THEN ASSUME_TAC);
491     BY(ASM_TAC THEN ARITH_TAC);
492   TYPIFY_GOAL_THEN `!k. (p + k) MOD 4 = (i + k) MOD 4` (unlist REWRITE_TAC);
493     GEN_TAC;
494     ONCE_REWRITE_TAC[arith `(i:num) + j = j + i`];
495     GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
496     EXPAND_TAC "i";
497     GMATCH_SIMP_TAC MOD_MOD_REFL;
498     BY(ARITH_TAC);
499   POP_ASSUM MP_TAC THEN REWRITE_TAC[TAUT ` ((a \/ b) /\ c) <=> ((a /\ c) \/ (b /\ c))`;TAUT `(a /\ (b \/ c)) <=> ((a /\ b) \/ (a /\ c))`];
500   BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN NUM_REDUCE_TAC THEN ASM_REWRITE_TAC[Terminal.MOD_4_EXPLICIT])
501   ]);;
502   (* }}} *)
503
504 let ab4_assumption_reduction = prove_by_refinement(
505   `!s p f v e.
506     is_scs_v39 s /\
507     scs_k_v39 s  = 4 /\
508     BBs_v39 s v /\
509     (!i j. scs_diag 4 i j  ==> scs_a_v39 s i j < dist(v i,v j) /\ &4 * h0 < scs_b_v39 s i j) /\
510     deformation f (IMAGE v (:num)) (--e,e) /\
511     &0 < e /\
512     (!w t. ~(w = v p)  ==> (f w t = w)) /\
513     (!t. abs t < e ==> dist (v (p + 3),f (v p) t) = dist (v (p + 3),v p)) /\
514     scs_a_v39 s p (p + 1) < dist (v p,v (p + 1)) /\ dist (v p,v (p + 1)) < scs_b_v39 s p (p + 1) 
515     ==>
516     (!i j. ?e1. &0 < e1 /\ (scs_a_v39 s i j = dist(v i,v j) ==> 
517         (!t. abs t < e1 ==> scs_a_v39 s i j <= dist(f (v i) t,f (v j) t)))) /\
518    (!i j.
519       ?e2. &0 < e2 /\
520            (dist (v i,v j) = scs_b_v39 s i j
521             ==> (!t. abs t < e2
522                      ==> dist (f (v i) t,f (v j) t) <= scs_b_v39 s i j)))
523     `,
524   (* {{{ proof *)
525   [
526   REPEAT WEAKER_STRIP_TAC;
527   ASSUME_TAC (arith `~(4 = 0)`);
528   TYPIFY `!i j.scs_a_v39 s (i MOD 4) (j MOD 4) = scs_a_v39 s i j  /\ scs_b_v39 s (i MOD 4) (j MOD 4) = scs_b_v39 s i j ` (C SUBGOAL_THEN ASSUME_TAC);
529     FIRST_X_ASSUM_ST `is_scs_v39` MP_TAC;
530     ASM_REWRITE_TAC[Appendix.is_scs_v39];
531     BY(FIRST_X_ASSUM MP_TAC THEN MESON_TAC[Cuxvzoz.periodic2_MOD]);
532   TYPIFY `!i. i MOD 4 < 4` (C SUBGOAL_THEN ASSUME_TAC);
533     BY(REPLICATE_TAC 3 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[DIVISION]);
534   TYPIFY `periodic v 4` (C SUBGOAL_THEN ASSUME_TAC);
535     BY(FIRST_X_ASSUM_ST `BBs_v39` MP_TAC THEN ASM_REWRITE_TAC[Appendix.BBs_v39;LET_THM] THEN MESON_TAC[]);
536   TYPIFY `!i. v (i MOD 4) = v i` (C SUBGOAL_THEN ASSUME_TAC);
537     GEN_TAC;
538     MATCH_MP_TAC (GSYM Oxl_def.periodic_mod);
539     BY(ASM_REWRITE_TAC[]);
540   INTRO_TAC Cuxvzoz.BBs_inj [`s`;`v`;`4`];
541   ASM_REWRITE_TAC[];
542   DISCH_TAC;
543   TYPIFY `!j. j < 4 ==> (j MOD 4 = j)` (C SUBGOAL_THEN ASSUME_TAC);
544     BY(REWRITE_TAC[MOD_LT]);
545   COMMENT "scs_a_v39";
546   CONJ_TAC;
547     MATCH_MP_TAC Terminal.periodic2_mod_reduce;
548     TYPIFY `4` EXISTS_TAC;
549     ASM_REWRITE_TAC[];
550     CONJ_TAC;
551       MATCH_MP_TAC Cuxvzoz.MOD_periodic2;
552       BY(REPLICATE_TAC 7 (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[] THEN MESON_TAC[]);
553     TYPIFY `!j. j < 4 ==> (?e1. &0 < e1 /\ (scs_a_v39 s p j = dist (v p,v j)           ==> (!t. abs t < e1                    ==> scs_a_v39 s p j <= dist (f (v p) t,f (v j) t))))` ENOUGH_TO_SHOW_TAC;
554       REPEAT WEAKER_STRIP_TAC;
555       TYPIFY `i = ( p MOD 4)` ASM_CASES_TAC;
556         FIRST_X_ASSUM_ST `dist` (C INTRO_TAC [`j`]);
557         ASM_REWRITE_TAC[];
558         REPEAT WEAKER_STRIP_TAC;
559         TYPIFY `e1` EXISTS_TAC;
560         ASM_REWRITE_TAC[];
561         TYPIFY_GOAL_THEN `scs_a_v39 s (p MOD 4) j = scs_a_v39 s p j ` (unlist REWRITE_TAC);
562           BY(REPLICATE_TAC 12 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[]);
563         BY(FIRST_X_ASSUM MP_TAC THEN MESON_TAC[]);
564       TYPIFY `j = p MOD 4` ASM_CASES_TAC;
565         FIRST_X_ASSUM_ST `dist` (C INTRO_TAC [`i`]);
566         ASM_REWRITE_TAC[DIST_SYM];
567         REPEAT WEAKER_STRIP_TAC;
568         TYPIFY `e1` EXISTS_TAC;
569         ASM_REWRITE_TAC[];
570         TYPIFY_GOAL_THEN `scs_a_v39 s i (p MOD 4)  = scs_a_v39 s i p ` (unlist REWRITE_TAC);
571           BY(REPLICATE_TAC 12 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[]);
572         BY(FIRST_X_ASSUM MP_TAC THEN FIRST_X_ASSUM_ST `is_scs_v39` MP_TAC THEN REWRITE_TAC[Appendix.is_scs_v39] THEN MESON_TAC[]);
573       TYPIFY `&1` EXISTS_TAC;
574       REWRITE_TAC[arith `&0 < &1`];
575       REPEAT WEAKER_STRIP_TAC;
576       TYPIFY `!w t. ~(w = v p) ==> f w t = w` ( (C FIRST_ASSUM_ST GMATCH_SIMP_TAC));
577       TYPIFY `!w t. ~(w = v p) ==> f w t = w` ( (C FIRST_X_ASSUM_ST GMATCH_SIMP_TAC));
578       FIRST_X_ASSUM_ST `BBs_v39` MP_TAC THEN REWRITE_TAC[Appendix.BBs_v39;LET_THM] THEN REPEAT WEAKER_STRIP_TAC;
579       nCONJ_TAC 2;
580         BY(FIRST_X_ASSUM (C INTRO_TAC [`i`;`j`]) THEN MESON_TAC[]);
581       ASM_REWRITE_TAC[];
582       BY(REPLICATE_TAC 20 (POP_ASSUM MP_TAC) THEN MESON_TAC[]);
583     REPEAT WEAKER_STRIP_TAC;
584     INTRO_TAC MOD_4_CASES [`j`;`p`];
585     ASM_REWRITE_TAC[arith `p + 0 = p`] THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[DIST_REFL];
586           BY(TYPIFY `&1` EXISTS_TAC THEN MESON_TAC[arith `&0 <= &0 /\ &0 < &1`]);
587         TYPIFY `&1` EXISTS_TAC THEN REWRITE_TAC[arith `&0 < &1`];
588         BY(ASM_MESON_TAC[arith `x < y ==> ~(x = y)`]);
589       FIRST_X_ASSUM_ST `scs_diag` (C INTRO_TAC [`p`;`p+2`]);
590       TYPIFY `scs_diag 4 p (p+2)` ENOUGH_TO_SHOW_TAC;
591         DISCH_THEN (unlist REWRITE_TAC);
592         REPEAT WEAKER_STRIP_TAC;
593         TYPIFY `&1` EXISTS_TAC THEN REWRITE_TAC[arith `&0 < &1`];
594         BY(ASM_MESON_TAC[arith `x < y ==> ~(x = y)`]);
595       REWRITE_TAC[arith `p+2 = SUC(SUC p)`];
596       MATCH_MP_TAC Tfitskc.SCS_DIAG_2;
597       BY(NUM_REDUCE_TAC);
598     TYPIFY `e` EXISTS_TAC;
599     ASM_REWRITE_TAC[];
600     DISCH_TAC;
601     REPEAT WEAKER_STRIP_TAC;
602     ASM_REWRITE_TAC[];
603     REPEAT (FIRST_X_ASSUM_ST `abs` (C INTRO_TAC [`t`])) THEN ASM_REWRITE_TAC[DIST_SYM];
604     DISCH_THEN (SUBST1_TAC o GSYM);
605     MATCH_MP_TAC (arith `(x = y) ==> x <= y`);
606     REPEAT (AP_TERM_TAC ORELSE AP_THM_TAC);
607     ONCE_REWRITE_TAC[EQ_SYM_EQ];
608     FIRST_X_ASSUM MATCH_MP_TAC;
609     FIRST_X_ASSUM_ST `v (i MOD 4) = v i` ((unlist ONCE_REWRITE_TAC) o GSYM);
610     TYPIFY_GOAL_THEN `!i j. i < 4 /\ j < 4 /\ ~(i = j) ==> ~(v i = v j)` MATCH_MP_TAC;
611       BY(ASM_MESON_TAC[]);
612     nCONJ_TAC 2;
613       TYPIFY `~((p + 3) MOD 4 = (p+0) MOD 4)` ENOUGH_TO_SHOW_TAC;
614         BY(REWRITE_TAC[arith `p+0=p`]);
615       GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
616       BY(NUM_REDUCE_TAC THEN ASM_REWRITE_TAC[Terminal.MOD_4_EXPLICIT]);
617     BY(ASM_REWRITE_TAC[]);
618   COMMENT "now the b end";
619   MATCH_MP_TAC Terminal.periodic2_mod_reduce;
620   TYPIFY `4` EXISTS_TAC;
621   ASM_REWRITE_TAC[];
622   CONJ_TAC;
623     MATCH_MP_TAC Cuxvzoz.MOD_periodic2;
624     BY(REPLICATE_TAC 7 (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[] THEN MESON_TAC[]);
625   TYPIFY `!j. j < 4 ==> (?e1. &0 < e1 /\ (dist (v p,v j) = scs_b_v39 s p j           ==> (!t. abs t < e1                    ==> dist (f (v p) t,f (v j) t) <= scs_b_v39 s p j)))` ENOUGH_TO_SHOW_TAC;
626     REPEAT WEAKER_STRIP_TAC;
627     TYPIFY `i = ( p MOD 4)` ASM_CASES_TAC;
628       FIRST_X_ASSUM_ST `dist` (C INTRO_TAC [`j`]);
629       ASM_REWRITE_TAC[];
630       REPEAT WEAKER_STRIP_TAC;
631       TYPIFY `e1` EXISTS_TAC;
632       ASM_REWRITE_TAC[];
633       TYPIFY_GOAL_THEN `scs_b_v39 s (p MOD 4) j = scs_b_v39 s p j ` (unlist REWRITE_TAC);
634         BY(REPLICATE_TAC 12 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[]);
635       BY(FIRST_X_ASSUM MP_TAC THEN MESON_TAC[]);
636     TYPIFY `j = p MOD 4` ASM_CASES_TAC;
637       FIRST_X_ASSUM_ST `dist` (C INTRO_TAC [`i`]);
638       ASM_REWRITE_TAC[DIST_SYM];
639       REPEAT WEAKER_STRIP_TAC;
640       TYPIFY `e1` EXISTS_TAC;
641       ASM_REWRITE_TAC[];
642       TYPIFY_GOAL_THEN `scs_b_v39 s i (p MOD 4)  = scs_b_v39 s i p ` (unlist REWRITE_TAC);
643         BY(REPLICATE_TAC 12 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[]);
644       BY(FIRST_X_ASSUM MP_TAC THEN FIRST_X_ASSUM_ST `is_scs_v39` MP_TAC THEN REWRITE_TAC[Appendix.is_scs_v39] THEN MESON_TAC[]);
645     TYPIFY `&1` EXISTS_TAC;
646     REWRITE_TAC[arith `&0 < &1`];
647     REPEAT WEAKER_STRIP_TAC;
648     TYPIFY `!w t. ~(w = v p) ==> f w t = w` ( (C FIRST_ASSUM_ST GMATCH_SIMP_TAC));
649     TYPIFY `!w t. ~(w = v p) ==> f w t = w` ( (C FIRST_X_ASSUM_ST GMATCH_SIMP_TAC));
650     FIRST_X_ASSUM_ST `BBs_v39` MP_TAC THEN REWRITE_TAC[Appendix.BBs_v39;LET_THM] THEN REPEAT WEAKER_STRIP_TAC;
651     nCONJ_TAC 2;
652       BY(FIRST_X_ASSUM (C INTRO_TAC [`i`;`j`]) THEN MESON_TAC[]);
653     ASM_REWRITE_TAC[];
654     BY(REPLICATE_TAC 20 (POP_ASSUM MP_TAC) THEN MESON_TAC[]);
655   REPEAT WEAKER_STRIP_TAC;
656   INTRO_TAC MOD_4_CASES [`j`;`p`];
657   ASM_REWRITE_TAC[arith `p + 0 = p`] THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[DIST_REFL];
658         BY(TYPIFY `&1` EXISTS_TAC THEN MESON_TAC[arith `&0 <= &0 /\ &0 < &1`]);
659       TYPIFY `&1` EXISTS_TAC THEN REWRITE_TAC[arith `&0 < &1`];
660       BY(ASM_MESON_TAC[arith `x < y ==> ~(x = y)`]);
661     FIRST_X_ASSUM_ST `scs_diag` (C INTRO_TAC [`p`;`p+2`]);
662     TYPIFY_GOAL_THEN `scs_diag 4 p (p+2)` (unlist REWRITE_TAC);
663       REWRITE_TAC[arith `p+2 = SUC(SUC p)`];
664       MATCH_MP_TAC Tfitskc.SCS_DIAG_2;
665       BY(NUM_REDUCE_TAC);
666     TYPIFY `dist(v p,v (p+2)) <= &4 * h0` ENOUGH_TO_SHOW_TAC;
667       BY(ASM_MESON_TAC[arith `x <= y /\ y < z ==> ~(x = z)`]);
668     INTRO_TAC DIST_TRIANGLE [`v p`;`(vec 0):real^3`;`v (p+2)`];
669     REWRITE_TAC[DIST_0];
670     TYPIFY `!i. norm (v i) <= &2 * h0` ENOUGH_TO_SHOW_TAC;
671       BY(DISCH_TAC THEN FIRST_ASSUM (C INTRO_TAC [`p`]) THEN FIRST_X_ASSUM (C INTRO_TAC [`p+2`]) THEN REAL_ARITH_TAC);
672     FIRST_X_ASSUM_ST `BBs_v39` MP_TAC THEN REWRITE_TAC[Appendix.BBs_v39;LET_THM] THEN REPEAT WEAKER_STRIP_TAC;
673     BY(FIRST_X_ASSUM_ST `ball_annulus` MP_TAC THEN REWRITE_TAC[Terminal.IMAGE_SUBSET_IN;IN_UNIV] THEN MESON_TAC[Fnjlbxs.in_ball_annulus]);
674   TYPIFY `e` EXISTS_TAC;
675   ASM_REWRITE_TAC[];
676   DISCH_TAC;
677   REPEAT WEAKER_STRIP_TAC;
678   ASM_REWRITE_TAC[];
679   REPEAT (FIRST_X_ASSUM_ST `abs` (C INTRO_TAC [`t`])) THEN ASM_REWRITE_TAC[DIST_SYM];
680   DISCH_THEN (SUBST1_TAC o GSYM);
681   MATCH_MP_TAC (arith `(x = y) ==> x <= y`);
682   REPEAT (AP_TERM_TAC ORELSE AP_THM_TAC);
683   FIRST_X_ASSUM MATCH_MP_TAC;
684   FIRST_X_ASSUM_ST `v (i MOD 4) = v i` ((unlist ONCE_REWRITE_TAC) o GSYM);
685   TYPIFY_GOAL_THEN `!i j. i < 4 /\ j < 4 /\ ~(i = j) ==> ~(v i = v j)` MATCH_MP_TAC;
686     BY(ASM_MESON_TAC[]);
687   nCONJ_TAC 2;
688     TYPIFY `~((p + 3) MOD 4 = (p+0) MOD 4)` ENOUGH_TO_SHOW_TAC;
689       BY(REWRITE_TAC[arith `p+0=p`]);
690     GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
691     BY(NUM_REDUCE_TAC THEN ASM_REWRITE_TAC[Terminal.MOD_4_EXPLICIT]);
692   BY(ASM_REWRITE_TAC[])
693   ]);;
694   (* }}} *)
695
696 let PERIODIC_INJ_MOD = prove_by_refinement(
697   `!v k i j. ~(k= 0) /\ periodic (v:num->A) k /\ 
698     (!i j. i < k /\ j < k /\ v i = v j ==> i = j)
699         ==>
700     ((v i = v j) <=> (i MOD k = j MOD k))`,
701   (* {{{ proof *)
702   [
703   REPEAT WEAKER_STRIP_TAC;
704   TYPIFY `!i. v (i MOD k) = v i` (C SUBGOAL_THEN ASSUME_TAC);
705     GEN_TAC;
706     MATCH_MP_TAC (GSYM Oxl_def.periodic_mod);
707     BY(ASM_REWRITE_TAC[]);
708   TYPIFY `    (!i j. i < (k:num) /\ j < k /\ ~(i = j) ==> ~(v i = v j))` (C SUBGOAL_THEN ASSUME_TAC);
709     BY(ASM_MESON_TAC[]);
710   MATCH_MP_TAC (TAUT `((~b ==> ~a ) /\ (b ==> a)) ==> (a = b)`);
711   CONJ_TAC;
712     DISCH_TAC;
713     FIRST_X_ASSUM_ST `v (i MOD k) = v i` ((unlist ONCE_REWRITE_TAC) o GSYM);
714     FIRST_X_ASSUM MATCH_MP_TAC;
715     ASM_REWRITE_TAC[];
716     BY(ASM_MESON_TAC[DIVISION]);
717   BY(ASM_MESON_TAC[])
718   ]);;
719   (* }}} *)
720
721 let ab4_assumption_reduction2 = prove_by_refinement(
722   `!s p f v e.
723     is_scs_v39 s /\
724     scs_k_v39 s  = 4 /\
725     BBs_v39 s v /\
726     (!i j. scs_diag 4 i j  ==> scs_a_v39 s i j < dist(v i,v j) /\ &4 * h0 < scs_b_v39 s i j) /\
727     deformation f (IMAGE v (:num)) (--e,e) /\
728     &0 < e /\
729     (!w t. ~(w = v p)  ==> (f w t = w)) /\
730     (!t. abs t < e ==> dist (v (p + 3),f (v p) t) = dist (v (p + 3),v p)) /\
731     scs_a_v39 s p (p + 1) < dist (v p,v (p + 1)) /\
732     (?e3. &0 < e3 /\ (!t. abs t < e3 ==> dist (f (v p) t,v (p + 1)) <= scs_b_v39 s p (p + 1)))
733     ==>
734     (!i j. ?e1. &0 < e1 /\ (scs_a_v39 s i j = dist(v i,v j) ==> 
735         (!t. abs t < e1 ==> scs_a_v39 s i j <= dist(f (v i) t,f (v j) t)))) /\
736    (!i j.
737       ?e2. &0 < e2 /\
738            (dist (v i,v j) = scs_b_v39 s i j
739             ==> (!t. abs t < e2
740                      ==> dist (f (v i) t,f (v j) t) <= scs_b_v39 s i j)))
741     `,
742   (* {{{ proof *)
743   [
744   REPEAT WEAKER_STRIP_TAC;
745   FIRST_X_ASSUM MP_TAC THEN BURY_MP_TAC;
746   ASSUME_TAC (arith `~(4 = 0)`);
747   TYPIFY `!i j.scs_a_v39 s (i MOD 4) (j MOD 4) = scs_a_v39 s i j  /\ scs_b_v39 s (i MOD 4) (j MOD 4) = scs_b_v39 s i j ` (C SUBGOAL_THEN ASSUME_TAC);
748     FIRST_X_ASSUM_ST `is_scs_v39` MP_TAC;
749     ASM_REWRITE_TAC[Appendix.is_scs_v39];
750     BY(FIRST_X_ASSUM MP_TAC THEN MESON_TAC[Cuxvzoz.periodic2_MOD]);
751   TYPIFY `!i. i MOD 4 < 4` (C SUBGOAL_THEN ASSUME_TAC);
752     BY(REPLICATE_TAC 3 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[DIVISION]);
753   TYPIFY `periodic v 4` (C SUBGOAL_THEN ASSUME_TAC);
754     BY(FIRST_X_ASSUM_ST `BBs_v39` MP_TAC THEN ASM_REWRITE_TAC[Appendix.BBs_v39;LET_THM] THEN MESON_TAC[]);
755   TYPIFY `!i. v (i MOD 4) = v i` (C SUBGOAL_THEN ASSUME_TAC);
756     GEN_TAC;
757     MATCH_MP_TAC (GSYM Oxl_def.periodic_mod);
758     BY(ASM_REWRITE_TAC[]);
759   INTRO_TAC Cuxvzoz.BBs_inj [`s`;`v`;`4`];
760   ASM_REWRITE_TAC[];
761   DISCH_TAC;
762   TYPIFY `!j. j < 4 ==> (j MOD 4 = j)` (C SUBGOAL_THEN ASSUME_TAC);
763     BY(REWRITE_TAC[MOD_LT]);
764   COMMENT "scs_a_v39";
765   CONJ_TAC;
766     MATCH_MP_TAC Terminal.periodic2_mod_reduce;
767     TYPIFY `4` EXISTS_TAC;
768     ASM_REWRITE_TAC[];
769     CONJ_TAC;
770       MATCH_MP_TAC Cuxvzoz.MOD_periodic2;
771       BY(REPLICATE_TAC 7 (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[] THEN MESON_TAC[]);
772     TYPIFY `!j. j < 4 ==> (?e1. &0 < e1 /\ (scs_a_v39 s p j = dist (v p,v j)           ==> (!t. abs t < e1                    ==> scs_a_v39 s p j <= dist (f (v p) t,f (v j) t))))` ENOUGH_TO_SHOW_TAC;
773       REPEAT WEAKER_STRIP_TAC;
774       TYPIFY `i = ( p MOD 4)` ASM_CASES_TAC;
775         FIRST_X_ASSUM_ST `dist` (C INTRO_TAC [`j`]);
776         ASM_REWRITE_TAC[];
777         REPEAT WEAKER_STRIP_TAC;
778         TYPIFY `e1` EXISTS_TAC;
779         ASM_REWRITE_TAC[];
780         TYPIFY_GOAL_THEN `scs_a_v39 s (p MOD 4) j = scs_a_v39 s p j ` (unlist REWRITE_TAC);
781           BY(REPLICATE_TAC 12 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[]);
782         BY(FIRST_X_ASSUM MP_TAC THEN MESON_TAC[]);
783       TYPIFY `j = p MOD 4` ASM_CASES_TAC;
784         FIRST_X_ASSUM_ST `dist` (C INTRO_TAC [`i`]);
785         ASM_REWRITE_TAC[DIST_SYM];
786         REPEAT WEAKER_STRIP_TAC;
787         TYPIFY `e1` EXISTS_TAC;
788         ASM_REWRITE_TAC[];
789         TYPIFY_GOAL_THEN `scs_a_v39 s i (p MOD 4)  = scs_a_v39 s i p ` (unlist REWRITE_TAC);
790           BY(REPLICATE_TAC 12 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[]);
791         BY(FIRST_X_ASSUM MP_TAC THEN FIRST_X_ASSUM_ST `is_scs_v39` MP_TAC THEN REWRITE_TAC[Appendix.is_scs_v39] THEN MESON_TAC[]);
792       TYPIFY `&1` EXISTS_TAC;
793       REWRITE_TAC[arith `&0 < &1`];
794       REPEAT WEAKER_STRIP_TAC;
795       TYPIFY `!w t. ~(w = v p) ==> f w t = w` ( (C FIRST_ASSUM_ST GMATCH_SIMP_TAC));
796       TYPIFY `!w t. ~(w = v p) ==> f w t = w` ( (C FIRST_X_ASSUM_ST GMATCH_SIMP_TAC));
797       FIRST_X_ASSUM_ST `BBs_v39` MP_TAC THEN REWRITE_TAC[Appendix.BBs_v39;LET_THM] THEN REPEAT WEAKER_STRIP_TAC;
798       nCONJ_TAC 2;
799         BY(FIRST_X_ASSUM (C INTRO_TAC [`i`;`j`]) THEN MESON_TAC[]);
800       ASM_REWRITE_TAC[];
801       BY(REPLICATE_TAC 20 (POP_ASSUM MP_TAC) THEN MESON_TAC[]);
802     REPEAT WEAKER_STRIP_TAC;
803     INTRO_TAC MOD_4_CASES [`j`;`p`];
804     ASM_REWRITE_TAC[arith `p + 0 = p`] THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[DIST_REFL];
805           BY(TYPIFY `&1` EXISTS_TAC THEN MESON_TAC[arith `&0 <= &0 /\ &0 < &1`]);
806         TYPIFY `&1` EXISTS_TAC THEN REWRITE_TAC[arith `&0 < &1`];
807         BY(ASM_MESON_TAC[arith `x < y ==> ~(x = y)`]);
808       FIRST_X_ASSUM_ST `scs_diag` (C INTRO_TAC [`p`;`p+2`]);
809       TYPIFY `scs_diag 4 p (p+2)` ENOUGH_TO_SHOW_TAC;
810         DISCH_THEN (unlist REWRITE_TAC);
811         REPEAT WEAKER_STRIP_TAC;
812         TYPIFY `&1` EXISTS_TAC THEN REWRITE_TAC[arith `&0 < &1`];
813         BY(ASM_MESON_TAC[arith `x < y ==> ~(x = y)`]);
814       REWRITE_TAC[arith `p+2 = SUC(SUC p)`];
815       MATCH_MP_TAC Tfitskc.SCS_DIAG_2;
816       BY(NUM_REDUCE_TAC);
817     TYPIFY `e` EXISTS_TAC;
818     ASM_REWRITE_TAC[];
819     DISCH_TAC;
820     REPEAT WEAKER_STRIP_TAC;
821     ASM_REWRITE_TAC[];
822     REPEAT (FIRST_X_ASSUM_ST `abs` (C INTRO_TAC [`t`])) THEN ASM_REWRITE_TAC[DIST_SYM];
823     DISCH_TAC;
824     DISCH_THEN (SUBST1_TAC o GSYM);
825     MATCH_MP_TAC (arith `(x = y) ==> x <= y`);
826     REPEAT (AP_TERM_TAC ORELSE AP_THM_TAC);
827     ONCE_REWRITE_TAC[EQ_SYM_EQ];
828     FIRST_X_ASSUM MATCH_MP_TAC;
829     FIRST_X_ASSUM_ST `v (i MOD 4) = v i` ((unlist ONCE_REWRITE_TAC) o GSYM);
830     TYPIFY_GOAL_THEN `!i j. i < 4 /\ j < 4 /\ ~(i = j) ==> ~(v i = v j)` MATCH_MP_TAC;
831       BY(ASM_MESON_TAC[]);
832     nCONJ_TAC 2;
833       TYPIFY `~((p + 3) MOD 4 = (p+0) MOD 4)` ENOUGH_TO_SHOW_TAC;
834         BY(REWRITE_TAC[arith `p+0=p`]);
835       GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
836       BY(NUM_REDUCE_TAC THEN ASM_REWRITE_TAC[Terminal.MOD_4_EXPLICIT]);
837     BY(ASM_REWRITE_TAC[]);
838   COMMENT "now the b end";
839   MATCH_MP_TAC Terminal.periodic2_mod_reduce;
840   TYPIFY `4` EXISTS_TAC;
841   ASM_REWRITE_TAC[];
842   CONJ_TAC;
843     MATCH_MP_TAC Cuxvzoz.MOD_periodic2;
844     BY(REPLICATE_TAC 7 (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[] THEN MESON_TAC[]);
845   TYPIFY `!j. j < 4 ==> (?e1. &0 < e1 /\ (dist (v p,v j) = scs_b_v39 s p j           ==> (!t. abs t < e1                    ==> dist (f (v p) t,f (v j) t) <= scs_b_v39 s p j)))` ENOUGH_TO_SHOW_TAC;
846     REPEAT WEAKER_STRIP_TAC;
847     TYPIFY `i = ( p MOD 4)` ASM_CASES_TAC;
848       FIRST_X_ASSUM_ST `dist` (C INTRO_TAC [`j`]);
849       ASM_REWRITE_TAC[];
850       REPEAT WEAKER_STRIP_TAC;
851       TYPIFY `e1` EXISTS_TAC;
852       ASM_REWRITE_TAC[];
853       TYPIFY_GOAL_THEN `scs_b_v39 s (p MOD 4) j = scs_b_v39 s p j ` (unlist REWRITE_TAC);
854         BY(REPLICATE_TAC 12 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[]);
855       BY(FIRST_X_ASSUM MP_TAC THEN MESON_TAC[]);
856     TYPIFY `j = p MOD 4` ASM_CASES_TAC;
857       FIRST_X_ASSUM_ST `dist` (C INTRO_TAC [`i`]);
858       ASM_REWRITE_TAC[DIST_SYM];
859       REPEAT WEAKER_STRIP_TAC;
860       TYPIFY `e1` EXISTS_TAC;
861       ASM_REWRITE_TAC[];
862       TYPIFY_GOAL_THEN `scs_b_v39 s i (p MOD 4)  = scs_b_v39 s i p ` (unlist REWRITE_TAC);
863         BY(REPLICATE_TAC 12 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[]);
864       BY(FIRST_X_ASSUM MP_TAC THEN FIRST_X_ASSUM_ST `is_scs_v39` MP_TAC THEN REWRITE_TAC[Appendix.is_scs_v39] THEN MESON_TAC[]);
865     TYPIFY `&1` EXISTS_TAC;
866     REWRITE_TAC[arith `&0 < &1`];
867     REPEAT WEAKER_STRIP_TAC;
868     TYPIFY `!w t. ~(w = v p) ==> f w t = w` ( (C FIRST_ASSUM_ST GMATCH_SIMP_TAC));
869     TYPIFY `!w t. ~(w = v p) ==> f w t = w` ( (C FIRST_X_ASSUM_ST GMATCH_SIMP_TAC));
870     FIRST_X_ASSUM_ST `BBs_v39` MP_TAC THEN REWRITE_TAC[Appendix.BBs_v39;LET_THM] THEN REPEAT WEAKER_STRIP_TAC;
871     nCONJ_TAC 2;
872       BY(FIRST_X_ASSUM (C INTRO_TAC [`i`;`j`]) THEN MESON_TAC[]);
873     ASM_REWRITE_TAC[];
874     BY(REPLICATE_TAC 20 (POP_ASSUM MP_TAC) THEN MESON_TAC[]);
875   REPEAT WEAKER_STRIP_TAC;
876   INTRO_TAC MOD_4_CASES [`j`;`p`];
877   ASM_REWRITE_TAC[arith `p + 0 = p`] THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[DIST_REFL];
878         BY(TYPIFY `&1` EXISTS_TAC THEN MESON_TAC[arith `&0 <= &0 /\ &0 < &1`]);
879       TYPIFY `e3` EXISTS_TAC THEN REWRITE_TAC[arith `&0 < &1`];
880       ASM_REWRITE_TAC[] THEN REPEAT WEAKER_STRIP_TAC;
881       TYPIFY_GOAL_THEN `scs_b_v39 s p ((p + 1) MOD 4) = scs_b_v39 s p ((p + 1))` (unlist REWRITE_TAC);
882         BY(ASM_MESON_TAC[]);
883       TYPIFY `f (v(p+1)) t = v (p+1)` (C SUBGOAL_THEN SUBST1_TAC);
884         FIRST_X_ASSUM MATCH_MP_TAC;
885         GMATCH_SIMP_TAC PERIODIC_INJ_MOD;
886         TYPIFY `4` EXISTS_TAC THEN ASM_REWRITE_TAC[];
887         GEN_REWRITE_TAC (RAND_CONV o RAND_CONV o LAND_CONV o ONCE_DEPTH_CONV) [arith `p = p + 0`];
888         GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
889         BY(NUM_REDUCE_TAC THEN ASM_REWRITE_TAC[Terminal.MOD_4_EXPLICIT]);
890       FIRST_X_ASSUM MATCH_MP_TAC;
891       BY(ASM_REWRITE_TAC[]);
892     FIRST_X_ASSUM_ST `scs_diag` (C INTRO_TAC [`p`;`p+2`]);
893     TYPIFY_GOAL_THEN `scs_diag 4 p (p+2)` (unlist REWRITE_TAC);
894       REWRITE_TAC[arith `p+2 = SUC(SUC p)`];
895       MATCH_MP_TAC Tfitskc.SCS_DIAG_2;
896       BY(NUM_REDUCE_TAC);
897     TYPIFY `dist(v p,v (p+2)) <= &4 * h0` ENOUGH_TO_SHOW_TAC;
898       BY(ASM_MESON_TAC[arith `x <= y /\ y < z ==> ~(x = z)`]);
899     INTRO_TAC DIST_TRIANGLE [`v p`;`(vec 0):real^3`;`v (p+2)`];
900     REWRITE_TAC[DIST_0];
901     TYPIFY `!i. norm (v i) <= &2 * h0` ENOUGH_TO_SHOW_TAC;
902       BY(DISCH_TAC THEN FIRST_ASSUM (C INTRO_TAC [`p`]) THEN FIRST_X_ASSUM (C INTRO_TAC [`p+2`]) THEN REAL_ARITH_TAC);
903     FIRST_X_ASSUM_ST `BBs_v39` MP_TAC THEN REWRITE_TAC[Appendix.BBs_v39;LET_THM] THEN REPEAT WEAKER_STRIP_TAC;
904     BY(FIRST_X_ASSUM_ST `ball_annulus` MP_TAC THEN REWRITE_TAC[Terminal.IMAGE_SUBSET_IN;IN_UNIV] THEN MESON_TAC[Fnjlbxs.in_ball_annulus]);
905   TYPIFY `e` EXISTS_TAC;
906   ASM_REWRITE_TAC[];
907   DISCH_TAC;
908   REPEAT WEAKER_STRIP_TAC;
909   ASM_REWRITE_TAC[];
910   REPEAT (FIRST_X_ASSUM_ST `abs` (C INTRO_TAC [`t`])) THEN ASM_REWRITE_TAC[DIST_SYM];
911   DISCH_TAC;
912   DISCH_THEN (SUBST1_TAC o GSYM);
913   MATCH_MP_TAC (arith `(x = y) ==> x <= y`);
914   REPEAT (AP_TERM_TAC ORELSE AP_THM_TAC);
915   FIRST_X_ASSUM MATCH_MP_TAC;
916   FIRST_X_ASSUM_ST `v (i MOD 4) = v i` ((unlist ONCE_REWRITE_TAC) o GSYM);
917   TYPIFY_GOAL_THEN `!i j. i < 4 /\ j < 4 /\ ~(i = j) ==> ~(v i = v j)` MATCH_MP_TAC;
918     BY(ASM_MESON_TAC[]);
919   nCONJ_TAC 2;
920     TYPIFY `~((p + 3) MOD 4 = (p+0) MOD 4)` ENOUGH_TO_SHOW_TAC;
921       BY(REWRITE_TAC[arith `p+0=p`]);
922     GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
923     BY(NUM_REDUCE_TAC THEN ASM_REWRITE_TAC[Terminal.MOD_4_EXPLICIT]);
924   BY(ASM_REWRITE_TAC[])
925   ]);;
926   (* }}} *)
927
928 let ab4_assumption_reduction_sym = prove_by_refinement(
929   `!s p f v e.
930     is_scs_v39 s /\
931     scs_k_v39 s  = 4 /\
932     BBs_v39 s v /\
933     (!i j. scs_diag 4 i j  ==> scs_a_v39 s i j < dist(v i,v j) /\ &4 * h0 < scs_b_v39 s i j) /\
934     deformation f (IMAGE v (:num)) (--e,e) /\
935     &0 < e /\
936     (!w t. ~(w = v (p+1))  ==> (f w t = w)) /\
937     (!t. abs t < e ==> dist (f (v (p + 1)) t ,(v (p+2))) = dist (v (p + 1),v (p+2))) /\
938     scs_a_v39 s p (p + 1) < dist (v p,v (p + 1)) /\ dist (v p,v (p + 1)) < scs_b_v39 s p (p + 1) 
939     ==>
940     (!i j. ?e1. &0 < e1 /\ (scs_a_v39 s i j = dist(v i,v j) ==> 
941         (!t. abs t < e1 ==> scs_a_v39 s i j <= dist(f (v i) t,f (v j) t)))) /\
942    (!i j.
943       ?e2. &0 < e2 /\
944            (dist (v i,v j) = scs_b_v39 s i j
945             ==> (!t. abs t < e2
946                      ==> dist (f (v i) t,f (v j) t) <= scs_b_v39 s i j)))
947     `,
948   (* {{{ proof *)
949   [
950   REPEAT WEAKER_STRIP_TAC;
951   ASSUME_TAC (arith `~(4 = 0)`);
952   TYPIFY `!i j.scs_a_v39 s (i MOD 4) (j MOD 4) = scs_a_v39 s i j  /\ scs_b_v39 s (i MOD 4) (j MOD 4) = scs_b_v39 s i j ` (C SUBGOAL_THEN ASSUME_TAC);
953     FIRST_X_ASSUM_ST `is_scs_v39` MP_TAC;
954     ASM_REWRITE_TAC[Appendix.is_scs_v39];
955     BY(FIRST_X_ASSUM MP_TAC THEN MESON_TAC[Cuxvzoz.periodic2_MOD]);
956   TYPIFY `!i. i MOD 4 < 4` (C SUBGOAL_THEN ASSUME_TAC);
957     BY(REPLICATE_TAC 3 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[DIVISION]);
958   TYPIFY `periodic v 4` (C SUBGOAL_THEN ASSUME_TAC);
959     BY(FIRST_X_ASSUM_ST `BBs_v39` MP_TAC THEN ASM_REWRITE_TAC[Appendix.BBs_v39;LET_THM] THEN MESON_TAC[]);
960   TYPIFY `!i. v (i MOD 4) = v i` (C SUBGOAL_THEN ASSUME_TAC);
961     GEN_TAC;
962     MATCH_MP_TAC (GSYM Oxl_def.periodic_mod);
963     BY(ASM_REWRITE_TAC[]);
964   INTRO_TAC Cuxvzoz.BBs_inj [`s`;`v`;`4`];
965   ASM_REWRITE_TAC[];
966   DISCH_TAC;
967   TYPIFY `!i j. i < 4 /\ j < 4 /\ ~(i = j) ==> ~(v i = v j)` (C SUBGOAL_THEN ASSUME_TAC);
968     BY(ASM_MESON_TAC[]);
969   TYPIFY `!j. j < 4 ==> (j MOD 4 = j)` (C SUBGOAL_THEN ASSUME_TAC);
970     BY(REWRITE_TAC[MOD_LT]);
971   TYPIFY `!t. f (v (p+0)) t = v(p+0) /\ f (v (p+2)) t = v(p+2) /\ f (v (p+3)) t = v(p+3)` (C SUBGOAL_THEN MP_TAC);
972     GEN_TAC THEN (FIRST_X_ASSUM_ST `~(w = v (p+1)) ==> a` (REPEAT o GMATCH_SIMP_TAC));
973     INTRO_TAC PERIODIC_INJ_MOD [`v`;`4`];
974     ASM_REWRITE_TAC[arith `~(4=0)`];
975     DISCH_TAC THEN ASM_REWRITE_TAC[];
976     REPEAT ( GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT);
977     BY(NUM_REDUCE_TAC THEN ASM_REWRITE_TAC[Terminal.MOD_4_EXPLICIT]);
978   DISCH_TAC;
979   COMMENT "scs_a_v39";
980   CONJ_TAC;
981     MATCH_MP_TAC Terminal.periodic2_mod_reduce;
982     TYPIFY `4` EXISTS_TAC;
983     ASM_REWRITE_TAC[];
984     CONJ_TAC;
985       MATCH_MP_TAC Cuxvzoz.MOD_periodic2;
986       BY(ASM_REWRITE_TAC[]);
987     TYPIFY `!j. j < 4 ==> (?e1. &0 < e1 /\ (scs_a_v39 s (p+1) j = dist (v (p+1),v j)           ==> (!t. abs t < e1                    ==> scs_a_v39 s (p+1) j <= dist (f (v (p+1)) t,f (v j) t))))` ENOUGH_TO_SHOW_TAC;
988       REPEAT WEAKER_STRIP_TAC;
989       TYPIFY `i = ( (p+1) MOD 4)` ASM_CASES_TAC;
990         FIRST_X_ASSUM_ST `dist` (C INTRO_TAC [`j`]);
991         ASM_REWRITE_TAC[];
992         REPEAT WEAKER_STRIP_TAC;
993         TYPIFY `e1` EXISTS_TAC;
994         ASM_REWRITE_TAC[];
995         TYPIFY_GOAL_THEN `scs_a_v39 s ((p+1) MOD 4) j = scs_a_v39 s (p+1) j ` (unlist REWRITE_TAC);
996           BY(REPLICATE_TAC 14 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[]);
997         BY(FIRST_X_ASSUM MP_TAC THEN MESON_TAC[]);
998       TYPIFY `j = (p+1) MOD 4` ASM_CASES_TAC;
999         FIRST_X_ASSUM_ST `dist` (C INTRO_TAC [`i`]);
1000         ASM_REWRITE_TAC[DIST_SYM];
1001         REPEAT WEAKER_STRIP_TAC;
1002         TYPIFY `e1` EXISTS_TAC;
1003         ASM_REWRITE_TAC[];
1004         TYPIFY_GOAL_THEN `scs_a_v39 s i ((p+1) MOD 4)  = scs_a_v39 s i (p+1) ` (unlist REWRITE_TAC);
1005           BY(REPLICATE_TAC 14 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[]);
1006         BY(FIRST_X_ASSUM MP_TAC THEN FIRST_X_ASSUM_ST `is_scs_v39` MP_TAC THEN REWRITE_TAC[Appendix.is_scs_v39] THEN MESON_TAC[]);
1007       TYPIFY `&1` EXISTS_TAC;
1008       REWRITE_TAC[arith `&0 < &1`];
1009       REPEAT WEAKER_STRIP_TAC;
1010       TYPIFY `!w t. ~(w = v (p+1)) ==> f w t = w` ( (C FIRST_ASSUM_ST GMATCH_SIMP_TAC));
1011       TYPIFY `!w t. ~(w = v (p+1)) ==> f w t = w` ( (C FIRST_X_ASSUM_ST GMATCH_SIMP_TAC));
1012       FIRST_X_ASSUM_ST `BBs_v39` MP_TAC THEN REWRITE_TAC[Appendix.BBs_v39;LET_THM] THEN REPEAT WEAKER_STRIP_TAC;
1013       nCONJ_TAC 2;
1014         BY(FIRST_X_ASSUM (C INTRO_TAC [`i`;`j`]) THEN MESON_TAC[]);
1015       ASM_REWRITE_TAC[];
1016       BY(REPLICATE_TAC 20 (POP_ASSUM MP_TAC) THEN MESON_TAC[]);
1017     REPEAT WEAKER_STRIP_TAC;
1018     INTRO_TAC MOD_4_CASES [`j`;`(p+1)`];
1019     ASM_REWRITE_TAC[arith `p + 0 = p /\ (p+1)+j = p+(1+j)`] THEN NUM_REDUCE_TAC;
1020     TYPIFY `(p+4) MOD 4 = p MOD 4` (C SUBGOAL_THEN SUBST1_TAC);
1021       BY(REWRITE_TAC[Oxl_2012.MOD_ADD_CANCEL]);
1022     REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[DIST_REFL];
1023           BY(TYPIFY `&1` EXISTS_TAC THEN MESON_TAC[arith `&0 <= &0 /\ &0 < &1`]);
1024         TYPIFY `e` EXISTS_TAC THEN REWRITE_TAC[];
1025         ASM_REWRITE_TAC[];
1026         DISCH_THEN SUBST1_TAC;
1027         REPEAT WEAKER_STRIP_TAC;
1028         FIRST_X_ASSUM_ST `dist` (C INTRO_TAC [`t`]);
1029         BY(FIRST_X_ASSUM MP_TAC THEN REAL_ARITH_TAC);
1030       FIRST_X_ASSUM_ST `scs_diag` (C INTRO_TAC [`p+1`;`p+3`]);
1031       TYPIFY `scs_diag 4 (p+1) (p+3)` ENOUGH_TO_SHOW_TAC;
1032         DISCH_THEN (unlist REWRITE_TAC);
1033         REPEAT WEAKER_STRIP_TAC;
1034         TYPIFY `&1` EXISTS_TAC THEN REWRITE_TAC[arith `&0 < &1`];
1035         BY(ASM_MESON_TAC[arith `x < y ==> ~(x = y)`]);
1036       REWRITE_TAC[arith `p+3 = SUC(SUC (p+1))`];
1037       MATCH_MP_TAC Tfitskc.SCS_DIAG_2;
1038       BY(NUM_REDUCE_TAC);
1039     TYPIFY `&1` EXISTS_TAC;
1040     TYPIFY `scs_a_v39 s (p+1) (p MOD 4) = scs_a_v39 s p (p+1)` ENOUGH_TO_SHOW_TAC;
1041       DISCH_THEN (unlist REWRITE_TAC);
1042       REWRITE_TAC[arith `&0 < &1`];
1043       BY(FIRST_X_ASSUM_ST `scs_a_v39 s p (p+1) < d` MP_TAC THEN REWRITE_TAC[DIST_SYM] THEN REAL_ARITH_TAC);
1044     BY(FIRST_X_ASSUM_ST `is_scs_v39` MP_TAC THEN REWRITE_TAC[Appendix.is_scs_v39] THEN ASM_MESON_TAC[]);
1045   COMMENT "now the b end";
1046   MATCH_MP_TAC Terminal.periodic2_mod_reduce;
1047   TYPIFY `4` EXISTS_TAC;
1048   ASM_REWRITE_TAC[];
1049   CONJ_TAC;
1050     MATCH_MP_TAC Cuxvzoz.MOD_periodic2;
1051     BY(ASM_REWRITE_TAC[]);
1052   TYPIFY `!j. j < 4 ==> (?e1. &0 < e1 /\ (dist (v (p+1),v j) = scs_b_v39 s (p+1) j           ==> (!t. abs t < e1                    ==> dist (f (v (p+1)) t,f (v j) t) <= scs_b_v39 s (p+1) j)))` ENOUGH_TO_SHOW_TAC;
1053     (REPEAT WEAKER_STRIP_TAC);
1054     TYPIFY `i = ( (p+1) MOD 4)` ASM_CASES_TAC;
1055       FIRST_X_ASSUM_ST `dist` (C INTRO_TAC [`j`]);
1056       ASM_REWRITE_TAC[];
1057       REPEAT WEAKER_STRIP_TAC;
1058       TYPIFY `e1` EXISTS_TAC;
1059       ASM_REWRITE_TAC[];
1060       TYPIFY_GOAL_THEN `scs_b_v39 s ((p+1) MOD 4) j = scs_b_v39 s (p+1) j ` (unlist REWRITE_TAC);
1061         BY(REPLICATE_TAC 14 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[]);
1062       BY(FIRST_X_ASSUM MP_TAC THEN MESON_TAC[]);
1063     TYPIFY `j = (p+1) MOD 4` ASM_CASES_TAC;
1064       FIRST_X_ASSUM_ST `dist` (C INTRO_TAC [`i`]);
1065       ASM_REWRITE_TAC[DIST_SYM];
1066       REPEAT WEAKER_STRIP_TAC;
1067       TYPIFY `e1` EXISTS_TAC;
1068       ASM_REWRITE_TAC[];
1069       TYPIFY_GOAL_THEN `scs_b_v39 s i ((p+1) MOD 4)  = scs_b_v39 s i (p+1) ` (unlist REWRITE_TAC);
1070         BY(REPLICATE_TAC 14 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[]);
1071       BY(FIRST_X_ASSUM MP_TAC THEN FIRST_X_ASSUM_ST `is_scs_v39` MP_TAC THEN REWRITE_TAC[Appendix.is_scs_v39] THEN MESON_TAC[]);
1072     TYPIFY `&1` EXISTS_TAC;
1073     REWRITE_TAC[arith `&0 < &1`];
1074     REPEAT WEAKER_STRIP_TAC;
1075     TYPIFY `!w t. ~(w = v (p+1)) ==> f w t = w` ( (C FIRST_ASSUM_ST GMATCH_SIMP_TAC));
1076     TYPIFY `!w t. ~(w = v (p+1)) ==> f w t = w` ( (C FIRST_X_ASSUM_ST GMATCH_SIMP_TAC));
1077     FIRST_X_ASSUM_ST `BBs_v39` MP_TAC THEN REWRITE_TAC[Appendix.BBs_v39;LET_THM] THEN REPEAT WEAKER_STRIP_TAC;
1078     nCONJ_TAC 2;
1079       BY(FIRST_X_ASSUM (C INTRO_TAC [`i`;`j`]) THEN MESON_TAC[]);
1080     ASM_REWRITE_TAC[];
1081     BY(REPLICATE_TAC 20 (POP_ASSUM MP_TAC) THEN MESON_TAC[]);
1082   REPEAT WEAKER_STRIP_TAC;
1083   INTRO_TAC MOD_4_CASES [`j`;`p+1`];
1084   ASM_REWRITE_TAC[arith `p + 0 = p /\ (p+1)+j = p+(1+j)`] THEN NUM_REDUCE_TAC;
1085   TYPIFY `(p+4) MOD 4 = p MOD 4` (C SUBGOAL_THEN SUBST1_TAC);
1086     BY(REWRITE_TAC[Oxl_2012.MOD_ADD_CANCEL]);
1087   ASM_REWRITE_TAC[arith `p + 0 = p`] THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[DIST_REFL];
1088         BY(TYPIFY `&1` EXISTS_TAC THEN MESON_TAC[arith `&0 <= &0 /\ &0 < &1`]);
1089       TYPIFY `e` EXISTS_TAC THEN ASM_REWRITE_TAC[];
1090       BY(ASM_MESON_TAC[arith `x = y ==> x <= y`]);
1091     FIRST_X_ASSUM_ST `scs_diag` (C INTRO_TAC [`p+1`;`p+3`]);
1092     TYPIFY_GOAL_THEN `scs_diag 4 (p+1) (p+3)` (unlist REWRITE_TAC);
1093       REWRITE_TAC[arith `p+3 = SUC(SUC (p+1))`];
1094       MATCH_MP_TAC Tfitskc.SCS_DIAG_2;
1095       BY(NUM_REDUCE_TAC);
1096     TYPIFY `dist(v (p+1),v (p+3)) <= &4 * h0` ENOUGH_TO_SHOW_TAC;
1097       BY(ASM_MESON_TAC[arith `x <= y /\ y < z ==> ~(x = z)`]);
1098     INTRO_TAC DIST_TRIANGLE [`v (p+1)`;`(vec 0):real^3`;`v (p+3)`];
1099     REWRITE_TAC[DIST_0];
1100     TYPIFY `!i. norm (v i) <= &2 * h0` ENOUGH_TO_SHOW_TAC;
1101       BY(DISCH_TAC THEN FIRST_ASSUM (C INTRO_TAC [`p+1`]) THEN FIRST_X_ASSUM (C INTRO_TAC [`p+3`]) THEN REAL_ARITH_TAC);
1102     FIRST_X_ASSUM_ST `BBs_v39` MP_TAC THEN REWRITE_TAC[Appendix.BBs_v39;LET_THM] THEN REPEAT WEAKER_STRIP_TAC;
1103     BY(FIRST_X_ASSUM_ST `ball_annulus` MP_TAC THEN REWRITE_TAC[Terminal.IMAGE_SUBSET_IN;IN_UNIV] THEN MESON_TAC[Fnjlbxs.in_ball_annulus]);
1104   TYPIFY `&1` EXISTS_TAC THEN REWRITE_TAC[arith `&0 < &1`];
1105   FIRST_X_ASSUM_ST `dist (v p,v (p + 1)) < scs_b_v39 s p (p + 1)` MP_TAC THEN REWRITE_TAC[DIST_SYM];
1106   TYPIFY `scs_b_v39 s (p + 1) (p MOD 4) = scs_b_v39 s p (p+1)` ENOUGH_TO_SHOW_TAC;
1107     BY(REAL_ARITH_TAC);
1108   BY(FIRST_X_ASSUM_ST `is_scs_v39` MP_TAC THEN REWRITE_TAC[Appendix.is_scs_v39] THEN ASM_MESON_TAC[])
1109   ]);;
1110   (* }}} *)
1111
1112 let deform_azim_sum = prove_by_refinement(
1113   `!v1 v2 v3 v4 f e. deformation f {v1,v2,v3,v4} (--e,e) /\
1114    &0 < azim (vec 0) v1 v2 v4 /\  azim (vec 0) v1 v2 v4 < pi /\
1115     ~collinear {vec 0,v1,v2} /\ ~collinear {vec 0,v1,v3} /\ ~collinear {vec 0,v1,v4} /\
1116     azim (vec 0) v1 v2 v3 + azim (vec 0) v1 v3 v4 = azim (vec 0) v1 v2 v4 /\
1117     (((!t.  (azim (vec 0) (f v1 t) (f v2 t) (f v3 t) = azim (vec 0) v1 v2 v3)) /\
1118         (&0 < azim (vec 0) v1 v3 v4 /\ azim (vec 0) v1 v3 v4 < pi)) \/       
1119     ((!t.  (azim (vec 0) (f v1 t) (f v3 t) (f v4 t) = azim (vec 0) v1 v3 v4)) /\  
1120         (&0 < azim (vec 0) v1 v2 v3 /\ azim (vec 0) v1 v2 v3 < pi))) ==>
1121     (?e1. &0 < e1 /\
1122        (!t. abs t < e1 ==> 
1123              ~collinear {vec 0,(f v1 t),(f v2 t)} /\
1124              ~collinear {vec 0,(f v1 t),(f v3 t)} /\
1125              ~collinear {vec 0,(f v1 t),(f v4 t)} /\
1126               azim (vec 0) (f v1 t) (f v2 t) (f v3 t) + 
1127               azim (vec 0) (f v1 t) (f v3 t) (f v4 t) = azim (vec 0) (f v1 t) (f v2 t) (f v4 t)))
1128          `,
1129   (* {{{ proof *)
1130   [
1131   REPEAT WEAKER_STRIP_TAC;
1132   INTRO_TAC (GEN_ALL Local_lemmas1.CONTINUOUS_PRESERVE_COLLINEAR) [`&0`;`(vec 0):real^3`;`f v1`];
1133   DISCH_TAC;
1134   FIRST_ASSUM (C INTRO_TAC [`f v2`]);
1135   FIRST_ASSUM (C INTRO_TAC [`f v3`]);
1136   FIRST_X_ASSUM (C INTRO_TAC [`f v4`]);
1137   FIRST_ASSUM_ST `deformation` MP_TAC THEN REWRITE_TAC[Localization.deformation;IN_INSERT;NOT_IN_EMPTY];
1138   REPEAT WEAKER_STRIP_TAC;
1139   TYPIFY `f v1 continuous atreal (&0) /\ f v2 continuous atreal (&0) /\ f v3 continuous atreal (&0) /\ f v4 continuous atreal (&0)` (C SUBGOAL_THEN ASSUME_TAC);
1140     BY(ASM_MESON_TAC[]);
1141   TYPIFY `f v1 (&0) = v1 /\ f v2 (&0) = v2 /\ f v4 (&0) = v4 /\ f v3 (&0) = v3` (C SUBGOAL_THEN ASSUME_TAC);
1142     BY(ASM_MESON_TAC[]);
1143   REPLICATE_TAC 3 (FIRST_X_ASSUM_ST `collinear` MP_TAC) THEN ASM_REWRITE_TAC[];
1144   REWRITE_TAC[arith `abs(&0 - r) = abs r`];
1145   REPEAT WEAKER_STRIP_TAC;
1146   INTRO_TAC Cuxvzoz.epsilon_triple [`e'`;`e''`;`e'''`];
1147   ASM_REWRITE_TAC[] THEN REPEAT WEAKER_STRIP_TAC;
1148   INTRO_TAC Cuxvzoz.WNWSHJT_ALT [`v4`;`v1`;`v2`;`f`;`-- e`;`e`;`pi`];
1149   ASM_REWRITE_TAC[];
1150   ANTS_TAC;
1151     MATCH_MP_TAC Zlzthic.deformation_subset;
1152     BY(TYPIFY `{v1,v2,v3,v4}` EXISTS_TAC THEN ASM_REWRITE_TAC[] THEN SET_TAC[]);
1153   REPEAT WEAKER_STRIP_TAC;
1154   TYPIFY `?e1. &0 < e1 /\ (!t. abs t < e1 ==>                   azim (vec 0) (f v1 t) (f v2 t) (f v3 t) +               azim (vec 0) (f v1 t) (f v3 t) (f v4 t) < &2 * pi)` (C SUBGOAL_THEN MP_TAC);
1155     TYPIFY `(!t. azim (vec 0) (f v1 t) (f v2 t) (f v3 t) = azim (vec 0) v1 v2 v3) /\       &0 < azim (vec 0) v1 v3 v4 /\      azim (vec 0) v1 v3 v4 < pi` ASM_CASES_TAC;
1156       INTRO_TAC Cuxvzoz.WNWSHJT_ALT [`v4`;`v1`;`v3`;`f`;`-- e`;`e`;`pi - azim (vec 0) v1 v2 v3`];
1157       ASM_REWRITE_TAC[];
1158       ANTS_TAC;
1159         CONJ_TAC;
1160           MATCH_MP_TAC Zlzthic.deformation_subset;
1161           BY(TYPIFY `{v1,v2,v3,v4}` EXISTS_TAC THEN ASM_REWRITE_TAC[] THEN SET_TAC[]);
1162         BY(ASM_REWRITE_TAC[arith `a < p - b <=> b + a < p`]);
1163       REPEAT WEAKER_STRIP_TAC;
1164       TYPIFY `e''''''` EXISTS_TAC;
1165       ASM_REWRITE_TAC[] THEN REPEAT WEAKER_STRIP_TAC;
1166       FIRST_X_ASSUM (C INTRO_TAC [`t`]);
1167       ASM_REWRITE_TAC[];
1168       BY(MP_TAC PI_POS THEN REAL_ARITH_TAC);
1169     TYPIFY `(!t. azim (vec 0) (f v1 t) (f v3 t) (f v4 t) = azim (vec 0) v1 v3 v4) /\      &0 < azim (vec 0) v1 v2 v3 /\      azim (vec 0) v1 v2 v3 < pi` (C SUBGOAL_THEN MP_TAC);
1170       BY(ASM_MESON_TAC[]);
1171     REPEAT WEAKER_STRIP_TAC;
1172     INTRO_TAC Cuxvzoz.WNWSHJT_ALT [`v3`;`v1`;`v2`;`f`;`-- e`;`e`;`pi - azim (vec 0) v1 v3 v4`];
1173     ASM_REWRITE_TAC[];
1174     ANTS_TAC;
1175       CONJ_TAC;
1176         MATCH_MP_TAC Zlzthic.deformation_subset;
1177         BY(TYPIFY `{v1,v2,v3,v4}` EXISTS_TAC THEN ASM_REWRITE_TAC[] THEN SET_TAC[]);
1178       BY(ASM_REWRITE_TAC[arith `a < p - b <=> a + b < p`]);
1179     REPEAT WEAKER_STRIP_TAC;
1180     TYPIFY `e''''''` EXISTS_TAC;
1181     ASM_REWRITE_TAC[] THEN REPEAT WEAKER_STRIP_TAC;
1182     FIRST_X_ASSUM (C INTRO_TAC [`t`]);
1183     ASM_REWRITE_TAC[];
1184     BY(MP_TAC PI_POS THEN REAL_ARITH_TAC);
1185   REPEAT WEAKER_STRIP_TAC;
1186   INTRO_TAC Cuxvzoz.epsilon_triple [`e''''`;`e'''''`;`e1`];
1187   ASM_REWRITE_TAC[] THEN REPEAT WEAKER_STRIP_TAC;
1188   TYPIFY `e''''''` EXISTS_TAC THEN ASM_REWRITE_TAC[] THEN REPEAT WEAKER_STRIP_TAC;
1189   ONCE_REWRITE_TAC[EQ_SYM_EQ];
1190   REWRITE_TAC[CONJ_ASSOC] THEN CONJ_TAC;
1191     BY(REPEAT CONJ_TAC THEN (REPEAT (FIRST_X_ASSUM MATCH_MP_TAC)) THEN ASM_REWRITE_TAC[]);
1192   MATCH_MP_TAC Fan.sum3_azim_fan;
1193   CONJ_TAC;
1194     BY(REPEAT (FIRST_X_ASSUM MATCH_MP_TAC) THEN ASM_REWRITE_TAC[]);
1195   BY(REPEAT CONJ_TAC THEN REPEAT (FIRST_X_ASSUM MATCH_MP_TAC) THEN ASM_REWRITE_TAC[])
1196   ]);;
1197   (* }}} *)
1198
1199 let NEHXMWH = prove_by_refinement(
1200   `main_nonlinear_terminal_v11 ==> 
1201   (!s FF v p.
1202   IMAGE (\i. (v i,v (SUC i))) (:num) = FF /\
1203   is_scs_v39 s /\
1204   scs_k_v39 s = 4 /\
1205   MMs_v39 s v /\
1206   scs_basic_v39 s /\
1207   scs_generic v /\
1208   (!i j. scs_diag 4 i j ==> scs_a_v39 s i j <= cstab /\ cstab < dist(v i,v j) /\ &4 * h0 < scs_b_v39 s i j) /\
1209   (!i. ~(i MOD 4 = (p+2) MOD 4) ==> interior_angle1 (vec 0) FF (v i) < pi)
1210   ==> (dist(v p,v(p+1)) = scs_a_v39 s p (p+1) \/ dist(v p,v(p+1)) = scs_b_v39 s p (p+1)))`,
1211   (* {{{ proof *)
1212   [
1213   REPEAT WEAKER_STRIP_TAC;
1214   TYPIFY `BBprime2_v39 s v` (C SUBGOAL_THEN ASSUME_TAC);
1215     BY(ASM_MESON_TAC[Appendix.scs_basic;Ayqjtmd.unadorned_MMs]);
1216   TYPIFY `BBprime_v39 s v` (C SUBGOAL_THEN ASSUME_TAC);
1217     BY(ASM_MESON_TAC[Appendix.BBprime2_v39]);
1218   TYPIFY `BBs_v39 s v` (C SUBGOAL_THEN ASSUME_TAC);
1219     BY(ASM_MESON_TAC[Appendix.BBprime_v39]);
1220   INTRO_TAC Appendix.BBs_v39 [`s`;`v`];
1221   ASM_REWRITE_TAC[LET_DEF;LET_END_DEF;Terminal.IMAGE_SUBSET_IN;IN_UNIV;arith `~(4 <= 3)`];
1222   REPEAT WEAKER_STRIP_TAC;
1223   TYPED_ABBREV_TAC `V = IMAGE v (:num)`;
1224   TYPED_ABBREV_TAC `E = IMAGE (\i. {v i, v (SUC i)}) (:num)`;
1225   TYPIFY `local_fan (V,E,FF)` (C SUBGOAL_THEN ASSUME_TAC);
1226     MATCH_MP_TAC Local_lemmas.CVX_LO_IMP_LO;
1227     BY(ASM_REWRITE_TAC[]);
1228   TYPIFY `!i. v i IN V` (C SUBGOAL_THEN ASSUME_TAC);
1229     REPEAT WEAKER_STRIP_TAC;
1230     EXPAND_TAC "V";
1231     REWRITE_TAC[IN_IMAGE;IN_UNIV];
1232     BY(MESON_TAC[]);
1233   INTRO_TAC Cuxvzoz.BBs_inj [`s`;`v`;`4`];
1234   ASM_REWRITE_TAC[];
1235   DISCH_TAC;
1236   TYPIFY `!i. interior_angle1 (vec 0) FF (v i) = azim (vec 0) (v i) (v (i+1)) (v (i+3))` (C SUBGOAL_THEN ASSUME_TAC);
1237     GEN_TAC;
1238     EXPAND_TAC "FF";
1239     GMATCH_SIMP_TAC (REWRITE_RULE[LET_THM] (GSYM Ocbicby.INTERIOR_ANGLE1_AZIM));
1240     TYPIFY `s` EXISTS_TAC;
1241     BY(ASM_REWRITE_TAC[IN;arith `4 - 1 = 3`;arith `3 < 4`;arith `SUC i = i+1`]);
1242   INTRO_TAC Ocbicby.LOCAL_FAN_AZIM_POS [`s`;`v`];
1243   ASM_REWRITE_TAC[LET_THM;IN;arith `4-1 = 3`;arith `SUC i = i+1`];
1244   DISCH_TAC;
1245   TYPIFY `!i. v (i MOD 4) = v i` (C SUBGOAL_THEN ASSUME_TAC);
1246     GEN_TAC;
1247     MATCH_MP_TAC (GSYM Oxl_def.periodic_mod);
1248     BY(ASM_REWRITE_TAC[arith `~(0=4)`]);
1249   TYPIFY `v 4 = v 0 /\ v 5 = v 1 /\ v 6 = v 2 /\ v 7 = v 3 /\ v 8  = v 4` (C SUBGOAL_THEN ASSUME_TAC);
1250     FIRST_X_ASSUM ((unlist ONCE_REWRITE_TAC) o GSYM);
1251     BY(REWRITE_TAC[Terminal.MOD_4_EXPLICIT;arith `7 = 1*4 + 3`;arith `8 = 2*4 + 0`;MOD_MULT_ADD]);
1252   TYPIFY `generic V E` (C SUBGOAL_THEN ASSUME_TAC);
1253     BY(FIRST_X_ASSUM_ST `scs_generic` MP_TAC THEN ASM_REWRITE_TAC[Appendix.scs_generic]);
1254   TYPIFY `v (p+4) = v p /\ v (p+5) = v (p+1) /\ v (p+6) = v (p+2) /\ v (p+7) = v (p+3) /\ v (p+8)  = v (p)` (C SUBGOAL_THEN ASSUME_TAC);
1255     FIRST_X_ASSUM_ST `MOD` ((unlist ONCE_REWRITE_TAC) o GSYM);
1256     BY(REWRITE_TAC[arith `p+4 = 1*4 + p /\ p+5 = 1*4+(p+1) /\ p+6=1*4+(p+2) /\ p+7 = 1*4 + (p+3) /\ p+8 = 2*4 + p`;MOD_MULT_ADD]);
1257   INTRO_TAC Terminal.vv_split_azim_generic [`v`;`4`;`p+3`;`2`;`3`];
1258   REWRITE_TAC[arith `SUC (x+k) = (x+k)+1`;arith `((p:num)+i)+j = p+(i+j)`];
1259   NUM_REDUCE_TAC;
1260   ASM_REWRITE_TAC[LET_THM];
1261   DISCH_TAC;
1262   INTRO_TAC Terminal.vv_split_azim_generic [`v`;`4`;`p+1`;`2`;`3`];
1263   REWRITE_TAC[arith `SUC (x+k) = (x+k)+1`;arith `((p:num)+i)+j = p+(i+j)`];
1264   NUM_REDUCE_TAC;
1265   ASM_REWRITE_TAC[LET_THM];
1266   DISCH_TAC;
1267   COMMENT "collinearity";
1268   TYPIFY `!i j. ~(v i = v j) ==> ~collinear {vec 0,v i, v j}` (C SUBGOAL_THEN ASSUME_TAC);
1269     REPEAT GEN_TAC THEN DISCH_TAC;
1270     MATCH_MP_TAC Zlzthic.PROPERTIES_GENERIC_LOCAL_FAN_ALT;
1271     GEXISTL_TAC [`V`;`E`;`FF`];
1272     BY(ASM_REWRITE_TAC[IN_IMAGE;IN_UNIV]);
1273   TYPIFY `!i j. i < 4 /\ j < 4 /\ ~(i = j) ==> ~(v i = v j)` (C SUBGOAL_THEN ASSUME_TAC);
1274     BY(REPLICATE_TAC 10 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[]);
1275   INTRO_TAC PERIODIC_INJ_MOD [`v`;`4`];
1276   ASM_REWRITE_TAC[arith `~(4 = 0)`];
1277   DISCH_TAC;
1278   TYPIFY `azim (vec 0) (v p) (v (p+1)) (v (p+3)) < pi` (C SUBGOAL_THEN ASSUME_TAC);
1279     FIRST_X_ASSUM_ST `interior_angle1` ((unlist REWRITE_TAC) o GSYM);
1280     FIRST_X_ASSUM MATCH_MP_TAC;
1281     GEN_REWRITE_TAC(RAND_CONV o LAND_CONV o LAND_CONV o ONCE_DEPTH_CONV)[arith`p = p+0`];
1282     GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
1283     BY(NUM_REDUCE_TAC);
1284   TYPIFY `~coplanar {vec 0,v p,v (p+1),v (p+3)}` (C SUBGOAL_THEN ASSUME_TAC);
1285     REWRITE_TAC[GSYM Local_lemmas1.AZIM_COND_FOR_COPLANAR];
1286     MATCH_MP_TAC (arith `&0 < x /\ x < pi ==> ~ ((x = &0) \/ (x = pi))`);
1287     BY(ASM_REWRITE_TAC[]);
1288   TYPIFY `!i a b. a < 4 /\ b < 4 /\ ~(a = b) ==> ~collinear {vec 0,v(i+a),v(i+b)}` (C SUBGOAL_THEN ASSUME_TAC);
1289     REPEAT WEAKER_STRIP_TAC;
1290     FIRST_X_ASSUM MP_TAC THEN REWRITE_TAC[];
1291     FIRST_X_ASSUM_ST `v (i MOD 4) = v i` ((unlist ONCE_REWRITE_TAC) o GSYM);
1292     REPEAT (FIRST_X_ASSUM MATCH_MP_TAC);
1293     nCONJ_TAC 2;
1294       GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
1295       NUM_REDUCE_TAC;
1296       BY(REPLICATE_TAC 3 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[DIVISION;MOD_LT;arith `~(4=0)`]);
1297     ASM_REWRITE_TAC[];
1298     BY(MESON_TAC[DIVISION;arith `~(4=0)`]);
1299   COMMENT "introduce deformation";
1300   INTRO_TAC Cuxvzoz.deform_simplex_edge_exists [`V`;`(\ (t:real). &0)`;`(\(t:real).  t)`;`v (p +3)`;`v p`;`v (p +1)`;`&1`];
1301   ASM_REWRITE_TAC[];
1302   REPEAT WEAKER_STRIP_TAC;
1303   FIRST_X_ASSUM MP_TAC;
1304   ANTS_TAC;
1305     REWRITE_TAC[arith `&0 < &1`];
1306     SUBCONJ_TAC;
1307       ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d}={a,c,d,b}`];
1308       BY(ASM_REWRITE_TAC[]);
1309     DISCH_TAC;
1310     CONJ_TAC;
1311       INTRO_TAC Planarity.cross_dot_fully_surrounded_fan [`(vec 0):real^3`;`v p`;`v (p+3)`;`v(p+1)`];
1312       ASM_REWRITE_TAC[];
1313       ANTS_TAC;
1314         INTRO_TAC Planarity.notcoplanar_imp_notcollinear_fan [`(vec 0):real^3`;`v p`;`v (p+1)`;`v(p+3)`];
1315         BY(REPLICATE_TAC 3 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[]);
1316       MATCH_MP_TAC (arith `x = y ==> (&0 < x ==> y > &0)`);
1317       BY(VEC3_TAC);
1318     REPEAT ( GMATCH_SIMP_TAC REAL_CONTINUOUS_ON_EQ_REAL_CONTINUOUS_AT);
1319     REWRITE_TAC[Ocbicby.REAL_OPEN_REAL_INTERVAL];
1320     BY(REWRITE_TAC[REAL_CONTINUOUS_CONST;REAL_CONTINUOUS_AT_ID]);
1321   REPEAT WEAKER_STRIP_TAC;
1322   TYPIFY `~(scs_a_v39 s p (p+1) < dist(v p,v (p+1)) /\ dist(v p,v (p+1)) < scs_b_v39 s p (p+1))` ENOUGH_TO_SHOW_TAC;
1323     FIRST_X_ASSUM_ST `scs_a_v39` (C INTRO_TAC [`p`;`(p+1)`]);
1324     BY(REAL_ARITH_TAC);
1325   REPEAT WEAKER_STRIP_TAC;
1326   TYPIFY `(!i t. abs t < e' ==> norm (f (v i) t) = norm (v i))` (C SUBGOAL_THEN ASSUME_TAC);
1327     REPEAT WEAKER_STRIP_TAC;
1328     TYPIFY `v i = v p` ASM_CASES_TAC;
1329       ASM_REWRITE_TAC[];
1330       FIRST_X_ASSUM_ST `norm` (C INTRO_TAC [`t`]);
1331       BY(ASM_REWRITE_TAC[] THEN MESON_TAC[]);
1332     FIRST_X_ASSUM GMATCH_SIMP_TAC;
1333     BY(ASM_REWRITE_TAC[]);
1334   TYPIFY `!i. 0 < i /\ i < 4 ==> ~(v (p + i) = v p)` (C SUBGOAL_THEN ASSUME_TAC);
1335     REPEAT WEAKER_STRIP_TAC;
1336     FIRST_X_ASSUM MP_TAC;
1337     ASM_REWRITE_TAC[];
1338     GEN_REWRITE_TAC (RAND_CONV o RAND_CONV o LAND_CONV o ONCE_DEPTH_CONV) [arith `p = p+0`];
1339     GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
1340     NUM_REDUCE_TAC;
1341     BY(REPLICATE_TAC 2 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[DIVISION;MOD_LT;arith `~(4=0)`;arith `0 < i ==> ~(i=0)`]);
1342   TYPIFY `!i j (k:num). v i = v j ==> v (i+k) = v (j+k)` (C SUBGOAL_THEN ASSUME_TAC);
1343     ASM_REWRITE_TAC[];
1344     REPEAT WEAKER_STRIP_TAC;
1345     ONCE_REWRITE_TAC[arith `(i:num) + k = k + i`];
1346     GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
1347     BY(ASM_REWRITE_TAC[arith `~(4 = 0)`]);
1348   TYPIFY `!t. azim (vec 0) (f (v (p+2)) t) (f (v (p+3)) t) (f (v (p+1)) t) = azim(vec 0) (v(p+2)) (v(p+3)) (v(p+1))` (C SUBGOAL_THEN ASSUME_TAC);
1349     GEN_TAC;
1350     FIRST_X_ASSUM_ST `~(w = v p) ==> a` (REPEAT o GMATCH_SIMP_TAC);
1351     BY(REPEAT CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN NUM_REDUCE_TAC);
1352   TYPIFY `!i. azim (vec 0) (v i) (v (i+1)) (v (i+3)) <= pi` (C SUBGOAL_THEN ASSUME_TAC);
1353     GEN_TAC;
1354     FIRST_X_ASSUM_ST `interior_angle1` ((unlist REWRITE_TAC) o GSYM);
1355     MATCH_MP_TAC Local_lemmas.CONVEX_LOFA_IMP_INANGLE_LE_PI;
1356     BY(ASM_REWRITE_TAC[]);
1357   TYPIFY `(!i. ?e0. &0 < e0 /\           (azim (vec 0) (v i) (v (i + 1)) (v (i + 3)) = pi            ==> (!t. abs t < e0                     ==> azim (vec 0) (f (v i) t) (f (v (i + 1)) t)                         (f (v (i + 3)) t) <=                         pi)))` (C SUBGOAL_THEN ASSUME_TAC);
1358     GEN_TAC;
1359     TYPIFY `v i = v (p+2)` ASM_CASES_TAC;
1360       FIRST_ASSUM (fun t -> FIRST_X_ASSUM (ASSUME_TAC o (C MATCH_MP t)));
1361       TYPIFY `&1` EXISTS_TAC;
1362       ASM_REWRITE_TAC[arith `&0 < &1`;arith `(p+2)+k = p + (2+k)`];
1363       NUM_REDUCE_TAC THEN ASM_REWRITE_TAC[];
1364       BY(REAL_ARITH_TAC);
1365     TYPIFY `azim (vec 0) (v i) (v (i + 1)) (v (i + 3)) < pi` ENOUGH_TO_SHOW_TAC;
1366       BY(MESON_TAC[arith `x < pi ==> ~(x = pi)`;arith `&0 < &1`]);
1367     BY(ASM_MESON_TAC[]);
1368   (COMMENT "deformation in BBs");
1369   INTRO_TAC Cuxvzoz.deformation_BBs_ALT [`s`;`4`;`f`;`v`;`e'`];
1370   ANTS_TAC;
1371     NUM_REDUCE_TAC;
1372     ASM_REWRITE_TAC[];
1373     MATCH_MP_TAC ab4_assumption_reduction;
1374     GEXISTL_TAC [`p`;`e'`];
1375     ASM_REWRITE_TAC[];
1376     CONJ_TAC;
1377       REPEAT WEAKER_STRIP_TAC;
1378       FIRST_X_ASSUM_ST `scs_diag` (C INTRO_TAC [`i`;`j`]);
1379       BY(ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC);
1380     REPEAT WEAKER_STRIP_TAC;
1381     (FIRST_X_ASSUM_ST `norm` (C INTRO_TAC [`t`]));
1382     BY(ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC);
1383   (REPEAT WEAKER_STRIP_TAC);
1384   COMMENT "azim sums";
1385   INTRO_TAC deform_azim_sum [`v (p+3)`;`v p`;`v (p+1)`;`v(p+2)`;`f`;`e'`];
1386   ANTS_TAC;
1387     REPEAT (FIRST_X_ASSUM_ST `c = a + b` MP_TAC) THEN ASM_REWRITE_TAC[];
1388     REPLICATE_TAC 3 DISCH_TAC;
1389     CONJ_TAC;
1390       MATCH_MP_TAC Zlzthic.deformation_subset;
1391       (TYPIFY `V` EXISTS_TAC THEN ASM_REWRITE_TAC[SUBSET;IN_INSERT;NOT_IN_EMPTY]);
1392       BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
1393     TYPIFY `~collinear {vec 0, v (p + 3), v (p+0)} /\ ~collinear {vec 0, v (p + 3), v (p + 1)} /\ ~collinear {vec 0, v (p + 3), v (p + 2)}` (C SUBGOAL_THEN MP_TAC);
1394       BY(REPEAT CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN NUM_REDUCE_TAC);
1395     REWRITE_TAC[arith `p+0=p`] THEN DISCH_THEN (unlist REWRITE_TAC);
1396     nCONJ_TAC 2;
1397       BY(ASM_REWRITE_TAC[]);
1398     FIRST_X_ASSUM (SUBST1_TAC) THEN REWRITE_TAC[];
1399     REPLICATE_TAC 4 (FIRST_X_ASSUM kill);
1400     ASM_REWRITE_TAC[];
1401     TYPIFY_GOAL_THEN `&0 < azim (vec 0) (v (p + 3)) (v p) (v (p + 2)) /\ azim (vec 0) (v (p + 3)) (v p) (v (p + 2)) < pi` (unlist REWRITE_TAC);
1402       FIRST_X_ASSUM_ST `&0 < azim a b c d` (C INTRO_TAC [`p+3`]);
1403       TYPIFY `azim (vec 0) (v (p+3)) (v p) (v (p+2)) = azim (vec 0) (v (p + 3)) (v ((p + 3) + 1)) (v ((p + 3) + 3))` (C SUBGOAL_THEN ASSUME_TAC);
1404         BY(REWRITE_TAC[arith `((p:num) + i) + j = p + i+j`] THEN NUM_REDUCE_TAC THEN ASM_REWRITE_TAC[]);
1405       ASM_REWRITE_TAC[];
1406       DISCH_THEN (unlist REWRITE_TAC);
1407       FIRST_X_ASSUM_ST `interior_angle1` ((unlist REWRITE_TAC) o GSYM);
1408       ASM_REWRITE_TAC[];
1409       FIRST_X_ASSUM MATCH_MP_TAC;
1410       GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
1411       BY(NUM_REDUCE_TAC);
1412     DISJ2_TAC;
1413     CONJ_TAC;
1414       GEN_TAC;
1415       FIRST_X_ASSUM_ST `~(w = v p) ==> a` (REPEAT o GMATCH_SIMP_TAC);
1416       ASM_REWRITE_TAC[];
1417       BY(REPEAT CONJ_TAC THEN GEN_REWRITE_TAC (RAND_CONV o RAND_CONV o LAND_CONV o ONCE_DEPTH_CONV) [arith `p = p+0`] THEN GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT THEN NUM_REDUCE_TAC);
1418     REWRITE_TAC[Zlzthic.azim_lt_pi_cross];
1419     TYPIFY `(v (p + 3) cross v p) dot v (p + 1) = (v (p) cross (v (p+1))) dot v (p + 3)` (C SUBGOAL_THEN SUBST1_TAC);
1420       BY(VEC3_TAC);
1421     REWRITE_TAC[GSYM Zlzthic.azim_lt_pi_cross];
1422     BY(ASM_REWRITE_TAC[]);
1423   (REPEAT WEAKER_STRIP_TAC);
1424   COMMENT "second azim sum";
1425   INTRO_TAC deform_azim_sum [`v (p+1)`;`v (p+2)`;`v (p+3)`;`v(p)`;`f`;`e'`];
1426   ANTS_TAC;
1427     REPEAT (FIRST_X_ASSUM_ST `c = a + b` MP_TAC) THEN ASM_REWRITE_TAC[];
1428     REPLICATE_TAC 3 DISCH_TAC;
1429     CONJ_TAC;
1430       MATCH_MP_TAC Zlzthic.deformation_subset;
1431       (TYPIFY `V` EXISTS_TAC THEN ASM_REWRITE_TAC[SUBSET;IN_INSERT;NOT_IN_EMPTY]);
1432       BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
1433     TYPIFY `~collinear {vec 0, v (p + 1), v (p + 2)} /\ ~collinear {vec 0, v (p + 1), v (p + 3)} /\ ~collinear {vec 0, v (p + 1), v (p + 0)}` (C SUBGOAL_THEN MP_TAC);
1434       BY(REPEAT CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN NUM_REDUCE_TAC);
1435     REWRITE_TAC[arith `p+0=p`] THEN DISCH_THEN (unlist REWRITE_TAC);
1436     nCONJ_TAC 2;
1437       BY(ASM_REWRITE_TAC[]);
1438     FIRST_X_ASSUM (SUBST1_TAC) THEN REWRITE_TAC[];
1439     REPLICATE_TAC 4 (FIRST_X_ASSUM kill);
1440     ASM_REWRITE_TAC[];
1441     TYPIFY_GOAL_THEN `&0 < azim (vec 0) (v (p + 1)) (v (p + 2)) (v p) /\ azim (vec 0) (v (p + 1)) (v (p + 2)) (v p) < pi` (unlist REWRITE_TAC);
1442       FIRST_X_ASSUM_ST `&0 < azim a b c d` (C INTRO_TAC [`p+1`]);
1443       TYPIFY `azim (vec 0) (v (p+1)) (v (p+2)) (v (p)) = azim (vec 0) (v (p + 1)) (v ((p + 1) + 1)) (v ((p + 1) + 3))` (C SUBGOAL_THEN ASSUME_TAC);
1444         BY(REWRITE_TAC[arith `((p:num) + i) + j = p + i+j`] THEN NUM_REDUCE_TAC THEN ASM_REWRITE_TAC[]);
1445       ASM_REWRITE_TAC[];
1446       DISCH_THEN (unlist REWRITE_TAC);
1447       FIRST_X_ASSUM_ST `interior_angle1` ((unlist REWRITE_TAC) o GSYM);
1448       ASM_REWRITE_TAC[];
1449       FIRST_X_ASSUM MATCH_MP_TAC;
1450       GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
1451       BY(NUM_REDUCE_TAC);
1452     DISJ1_TAC;
1453     CONJ_TAC;
1454       GEN_TAC;
1455       FIRST_X_ASSUM_ST `~(w = v p) ==> a` (REPEAT o GMATCH_SIMP_TAC);
1456       ASM_REWRITE_TAC[];
1457       BY(REPEAT CONJ_TAC THEN GEN_REWRITE_TAC (RAND_CONV o RAND_CONV o LAND_CONV o ONCE_DEPTH_CONV) [arith `p = p+0`] THEN GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT THEN NUM_REDUCE_TAC);
1458     REWRITE_TAC[Zlzthic.azim_lt_pi_cross];
1459     TYPIFY `(v (p + 1) cross v (p+3)) dot v (p) = (v (p) cross (v (p+1))) dot v (p + 3)` (C SUBGOAL_THEN SUBST1_TAC);
1460       BY(VEC3_TAC);
1461     REWRITE_TAC[GSYM Zlzthic.azim_lt_pi_cross];
1462     BY(ASM_REWRITE_TAC[]);
1463   (REPEAT WEAKER_STRIP_TAC);
1464   TYPIFY `?e3. &0 < e3 /\ (!t. abs t < e3 ==> dist(v p,v (p+1)) + t IN real_interval(scs_a_v39 s p (p+1),scs_b_v39 s p (p+1)))` (C SUBGOAL_THEN MP_TAC);
1465     INTRO_TAC Zlzthic.real_interval_contains_0_ball [`scs_a_v39 s p (p+1)-dist(v p,v (p+1))`;`scs_b_v39 s p (p+1) - dist(v p,v (p+1))`;`&1`];
1466     ASM_REWRITE_TAC[arith `&0 < &1`;arith `a - d < &0 <=> a < d`;arith `&0 < b - d <=> d < b`];
1467     REPEAT WEAKER_STRIP_TAC;
1468     TYPIFY `e` EXISTS_TAC;
1469     ASM_REWRITE_TAC[] THEN REPEAT WEAKER_STRIP_TAC;
1470     FIRST_X_ASSUM (C INTRO_TAC [`t`]);
1471     ASM_REWRITE_TAC[IN_REAL_INTERVAL];
1472     BY(REAL_ARITH_TAC);
1473   REPEAT WEAKER_STRIP_TAC;
1474   COMMENT "coplanar";
1475   INTRO_TAC Zlzthic.NONPLANAR_OPEN [`(\ (t:real). (vec 0):real^3)`;`f (v p)`;`\ (t:real). v (p+1)`;`\ (t:real). v (p+3)`;`&0`];
1476   ASM_REWRITE_TAC[CONTINUOUS_CONST];
1477   DISCH_THEN MP_TAC THEN ANTS_TAC;
1478     FIRST_X_ASSUM_ST `deformation` MP_TAC THEN REWRITE_TAC[Localization.deformation] THEN REPEAT WEAKER_STRIP_TAC;
1479     CONJ2_TAC;
1480       BY(FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]);
1481     POP_ASSUM GMATCH_SIMP_TAC;
1482     BY(ASM_REWRITE_TAC[]);
1483   REWRITE_TAC[arith `abs (&0 - t') = abs t'`] THEN REPEAT WEAKER_STRIP_TAC;
1484   INTRO_TAC Zlzthic.WNWSHJT [`v(p+3)`;`v p`;`v (p+1)`;`f`;`-- e'`;`e'`];
1485   ANTS_TAC;
1486     ASM_REWRITE_TAC[];
1487     CONJ_TAC;
1488       MATCH_MP_TAC Zlzthic.deformation_subset;
1489       (TYPIFY `V` EXISTS_TAC THEN ASM_REWRITE_TAC[SUBSET;IN_INSERT;NOT_IN_EMPTY]);
1490       BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
1491     FIRST_X_ASSUM_ST `deformation` MP_TAC THEN REWRITE_TAC[Localization.deformation];
1492     REPEAT WEAKER_STRIP_TAC;
1493     FIRST_X_ASSUM (REPEAT o GMATCH_SIMP_TAC) THEN ASM_REWRITE_TAC[];
1494     TYPIFY `!i. ~(i=0) /\ i < 4 ==> ~collinear {vec 0,v (p+0),v(p+i)}` ENOUGH_TO_SHOW_TAC;
1495       BY(MESON_TAC[arith `p+0=p` ;arith `~(1=0) /\ 1 < 4 /\ ~(3=0) /\ 3 < 4`]);
1496     GEN_TAC THEN DISCH_TAC;
1497     FIRST_X_ASSUM MATCH_MP_TAC;
1498     BY(ASM_REWRITE_TAC[arith `0 < 4`]);
1499   REPEAT WEAKER_STRIP_TAC;
1500   COMMENT "introduce 1834";
1501   INTRO_TAC Iunbuig.epsilon_hept [`e`;`e'`;`e''`;`e'''`;`e3`;`e1`;`e1'`] THEN ASM_REWRITE_TAC[] THEN REPEAT WEAKER_STRIP_TAC;
1502   FIRST_ASSUM_ST `!i. 0 < i /\ i < 4 ==> ~(v (p + i) = v p)` MP_TAC;
1503   FIRST_ASSUM_ST `i MOD 4 = j MOD 4` (unlist REWRITE_TAC);
1504   DISCH_TAC;
1505   INTRO_TAC (UNDISCH Ocbicby.LEMMA_1834976363) [`norm (v (p+3))`;`norm (v p)`;`norm (v (p+1))`;`dist(v p,v(p+1))`;`dist (v(p+1),v(p+3))`;`dist(v p,v (p+3))`;`dist(v p,v (p+1)) - e7`;`dist(v p,v(p+1)) + e7`];
1506   ANTS_TAC;
1507     ASM_REWRITE_TAC[];
1508     (COMMENT "1834 ants");
1509     COMMENT "restart";
1510     TYPIFY `!i. &2 <= norm (v i) /\ norm (v i) <= &2 * h0` (C SUBGOAL_THEN ASSUME_TAC);
1511       GEN_TAC;
1512       REWRITE_TAC[GSYM Fnjlbxs.in_ball_annulus];
1513       FIRST_X_ASSUM_ST `BBs_v39` kill THEN FIRST_X_ASSUM_ST `BBs_v39` MP_TAC THEN REWRITE_TAC[Appendix.BBs_v39;LET_THM] THEN EXPAND_TAC "V" THEN REPEAT WEAKER_STRIP_TAC;
1514       FIRST_X_ASSUM_ST `ball_annulus` MP_TAC;
1515       REWRITE_TAC[SUBSET;IN_IMAGE;IN_UNIV];
1516       BY(MESON_TAC[]);
1517     ASM_REWRITE_TAC[];
1518     FIRST_ASSUM_ST `collinear` (C INTRO_TAC [`p`;`3`;`0`]);
1519     FIRST_X_ASSUM_ST `collinear` (C INTRO_TAC [`p`;`3`;`1`]);
1520     NUM_REDUCE_TAC;
1521     REWRITE_TAC[arith `p + 0 = p`];
1522     REPEAT WEAKER_STRIP_TAC;
1523     TYPIFY_GOAL_THEN `&0 < ups_x (norm (v (p + 3)) * norm (v (p + 3))) (norm (v p) * norm (v p)) (dist (v p,v (p + 3)) * dist (v p,v (p + 3))) /\ &0 < ups_x (norm (v (p + 3)) * norm (v (p + 3))) (norm (v (p + 1)) * norm (v (p + 1))) (dist (v (p + 1),v (p + 3)) * dist (v (p + 1),v (p + 3)))` (unlist REWRITE_TAC);
1524       REPLICATE_TAC 2 (FIRST_X_ASSUM MP_TAC);
1525       REWRITE_TAC[Collect_geom2.NOT_COL_EQ_UPS_X_POS;DIST_0;DIST_SYM;arith`x pow 2 = x*x`];
1526       BY(MESON_TAC[]);
1527     TYPIFY `!i j. &2 <= dist(v i,v j) ==> (&2 / h0) pow 2 <= xrr (norm(v i)) (norm(v (j))) (dist (v i,v j))` ((C SUBGOAL_THEN ASSUME_TAC));
1528       REPEAT WEAKER_STRIP_TAC;
1529       MATCH_MP_TAC Ocbicby.xrr_simple_lower_bound;
1530       BY(ASM_REWRITE_TAC[arith `x <= x`]);
1531     CONJ_TAC;
1532       POP_ASSUM MATCH_MP_TAC;
1533       MATCH_MP_TAC Ocbicby.scs_lb_2;
1534       TYPIFY `s` EXISTS_TAC;
1535       ASM_REWRITE_TAC[];
1536       ONCE_REWRITE_TAC[EQ_SYM_EQ];
1537       FIRST_X_ASSUM MATCH_MP_TAC;
1538       BY(NUM_REDUCE_TAC);
1539     CONJ_TAC;
1540       TYPIFY `#15.53 = sqrt(#15.53) pow 2` (C SUBGOAL_THEN SUBST1_TAC);
1541         GMATCH_SIMP_TAC SQRT_POW_2;
1542         BY(REAL_ARITH_TAC);
1543       MATCH_MP_TAC Ocbicby.xrr_simple_upper_bound;
1544       ASM_REWRITE_TAC[];
1545       TYPIFY `&4 = sqrt(&16)` (C SUBGOAL_THEN SUBST1_TAC);
1546         REWRITE_TAC[arith `&16 = &4 pow 2`];
1547         REWRITE_TAC[POW_2_SQRT_ABS];
1548         BY(REAL_ARITH_TAC);
1549       GMATCH_SIMP_TAC SQRT_MONO_LT_EQ;
1550       TYPIFY_GOAL_THEN `&0 <=  #15.53 /\ &0 < &16 /\  #15.53 < &16` (unlist REWRITE_TAC);
1551         BY(REAL_ARITH_TAC);
1552       CONJ_TAC;
1553         BY(REAL_ARITH_TAC);
1554       CONJ_TAC;
1555         MATCH_MP_TAC Ocbicby.scs_lb_2;
1556         TYPIFY `s` EXISTS_TAC;
1557         ASM_REWRITE_TAC[];
1558         ONCE_REWRITE_TAC[EQ_SYM_EQ];
1559         FIRST_X_ASSUM MATCH_MP_TAC;
1560         BY(NUM_REDUCE_TAC);
1561       MATCH_MP_TAC REAL_LE_TRANS;
1562       TYPIFY `cstab` EXISTS_TAC;
1563       CONJ_TAC;
1564         MATCH_MP_TAC (arith `d <= scs_b_v39 s p (p+1) /\ scs_b_v39 s p (p+1) <= cstab ==> d <= cstab`);
1565         CONJ_TAC;
1566           FIRST_X_ASSUM_ST `BBs_v39` kill;
1567           (FIRST_X_ASSUM_ST `BBs_v39` MP_TAC) THEN REWRITE_TAC[Appendix.BBs_v39;LET_THM];
1568           BY(MESON_TAC[]);
1569         FIRST_X_ASSUM_ST `is_scs_v39` MP_TAC THEN REWRITE_TAC[Appendix.is_scs_v39];
1570         ASM_REWRITE_TAC[arith `3 < 4`;arith `SUC i = i+1`];
1571         BY(MESON_TAC[]);
1572       REWRITE_TAC[Sphere.cstab];
1573       MATCH_MP_TAC REAL_LE_RSQRT;
1574       BY(REAL_ARITH_TAC);
1575     CONJ_TAC;
1576       ONCE_REWRITE_TAC[DIST_SYM];
1577       FIRST_X_ASSUM MATCH_MP_TAC;
1578       MATCH_MP_TAC Ocbicby.scs_lb_2;
1579       TYPIFY `s` EXISTS_TAC;
1580       ASM_REWRITE_TAC[];
1581       BY(GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT THEN NUM_REDUCE_TAC);
1582     CONJ_TAC;
1583       ONCE_REWRITE_TAC[DIST_SYM];
1584       FIRST_X_ASSUM MATCH_MP_TAC;
1585       MATCH_MP_TAC Ocbicby.scs_lb_2;
1586       TYPIFY `s` EXISTS_TAC;
1587       ASM_REWRITE_TAC[];
1588       BY(FIRST_X_ASSUM MATCH_MP_TAC THEN NUM_REDUCE_TAC);
1589     CONJ_TAC;
1590       REWRITE_TAC[IN_REAL_INTERVAL];
1591       BY(FIRST_X_ASSUM_ST `&0 < e` MP_TAC THEN REAL_ARITH_TAC);
1592     CONJ_TAC;
1593       REWRITE_TAC[SUBSET;IN_REAL_INTERVAL;IN_ELIM_THM];
1594       REPEAT WEAKER_STRIP_TAC;
1595       TYPIFY `?t. abs t < e7 /\ x = dist(v p,v(p+1)) + t` (C SUBGOAL_THEN MP_TAC);
1596         TYPIFY `x - dist(v p,v(p+1))` EXISTS_TAC;
1597         CONJ2_TAC;
1598           BY(REAL_ARITH_TAC);
1599         BY(REPLICATE_TAC 2 (POP_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
1600       REPEAT WEAKER_STRIP_TAC;
1601       ASM_REWRITE_TAC[];
1602       FIRST_X_ASSUM_ST `norm (f (v p) t) = norm (v p)` (C INTRO_TAC [`t`]);
1603       ANTS_TAC;
1604         BY(REPEAT (FIRST_X_ASSUM MATCH_MP_TAC) THEN ASM_REWRITE_TAC[]);
1605       REWRITE_TAC[DIST_SYM] THEN ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN REPEAT WEAKER_STRIP_TAC THEN ASM_REWRITE_TAC[];
1606       FIRST_X_ASSUM_ST `coplanar` (C INTRO_TAC [`t`]);
1607       ANTS_TAC;
1608         BY(REPEAT (FIRST_X_ASSUM MATCH_MP_TAC) THEN ASM_REWRITE_TAC[]);
1609       DISCH_TAC;
1610       FIRST_ASSUM MP_TAC THEN ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,d,b,c}`] THEN REWRITE_TAC[Oxlzlez.coplanar_delta_y;DIST_0;DIST_SYM];
1611       RULE_ASSUM_TAC (REWRITE_RULE[arith `d + &0 = d`]);
1612       ASM_REWRITE_TAC[];
1613       DISCH_THEN (unlist REWRITE_TAC);
1614       REWRITE_TAC[GSYM DIST_NZ];
1615       CONJ_TAC;
1616         DISCH_TAC;
1617         FIRST_X_ASSUM_ST `coplanar` MP_TAC;
1618         BY(ASM_REWRITE_TAC[SET_RULE `{a,b,b,c} = {a,b,c}`;COPLANAR_3]);
1619       TYPIFY `~collinear {vec 0,f (v p) t,v (p+1)}` (C SUBGOAL_THEN MP_TAC);
1620         BY(POP_ASSUM MP_TAC THEN MESON_TAC[Planarity.notcoplanar_imp_notcollinear_fan]);
1621       REWRITE_TAC[Collect_geom2.NOT_COL_EQ_UPS_X_POS];
1622       BY(REWRITE_TAC[DIST_0;arith `x pow 2 = x*x`;DIST_SYM]);
1623     TYPIFY `!i.  i < 3 ==> &0 < dist (v (p+i), v (p+3))` ENOUGH_TO_SHOW_TAC;
1624       BY(MESON_TAC[arith `p + 0 = (p:num)`;arith `0 < 3`;arith `1 < 3`]);
1625     REPEAT WEAKER_STRIP_TAC;
1626     MATCH_MP_TAC (arith `&2 <= x ==> &0 < x`);
1627     MATCH_MP_TAC Ocbicby.scs_lb_2;
1628     TYPIFY `s` EXISTS_TAC;
1629     ASM_REWRITE_TAC[];
1630     GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT THEN NUM_REDUCE_TAC;
1631     BY(FIRST_X_ASSUM MP_TAC THEN REWRITE_TAC[arith `i < 3 <=> i = 0 \/ i = 1 \/ i = 2`] THEN DISCH_TAC THEN REPEAT (FIRST_X_ASSUM DISJ_CASES_TAC) THEN ASM_REWRITE_TAC[] THEN NUM_REDUCE_TAC);
1632   REPEAT WEAKER_STRIP_TAC;
1633   TYPIFY `?t. abs t < e7 /\ y4' = dist(v p,v(p+1)) + t` (C SUBGOAL_THEN MP_TAC);
1634     TYPIFY `y4' - dist(v p,v(p+1))` EXISTS_TAC;
1635     CONJ2_TAC;
1636       BY(REAL_ARITH_TAC);
1637     BY(REPLICATE_TAC 2 (POP_ASSUM MP_TAC) THEN REWRITE_TAC[IN_REAL_INTERVAL] THEN REAL_ARITH_TAC);
1638   REPEAT WEAKER_STRIP_TAC;
1639   FIRST_X_ASSUM_ST `taum` MP_TAC;
1640   ASM_REWRITE_TAC[];
1641   REWRITE_TAC[arith `~(x < y) <=> (y <= x)`];
1642   FIRST_X_ASSUM_ST `norm (f (v p) t) = norm (v p)` (C INTRO_TAC [`t`]);
1643   ANTS_TAC;
1644     BY(REPEAT (FIRST_X_ASSUM MATCH_MP_TAC) THEN ASM_REWRITE_TAC[]);
1645   (REWRITE_TAC[DIST_SYM;arith `d + &0 = d`] THEN REPEAT WEAKER_STRIP_TAC THEN ASM_REWRITE_TAC[]);
1646   COMMENT "back to root, next tau";
1647   TYPIFY `sum {i | i < 4} (\i. rho_fun (norm (v i)) * azim (vec 0) (v i) (v (i + 1)) (v (i + 4 - 1))) <=    sum {i | i < 4} (\i. rho_fun (norm (f (v i) t)) * azim (vec 0) (f (v i) t) (f(v(i+1)) t) (f (v (i + 4 - 1)) t))` (C SUBGOAL_THEN ASSUME_TAC);
1648     REPEAT WEAKER_STRIP_TAC;
1649     MATCH_MP_TAC Cuxvzoz.MMs_minimize_tau_fun;
1650     TYPIFY `s` EXISTS_TAC;
1651     ASM_REWRITE_TAC[arith `3 < 4`];
1652     FIRST_X_ASSUM MATCH_MP_TAC;
1653     BY(FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]);
1654   POP_ASSUM MP_TAC;
1655   TYPIFY `{i | i < 4} = 0..(4-1)` (C SUBGOAL_THEN SUBST1_TAC);
1656     BY(REWRITE_TAC[EXTENSION;IN_ELIM_THM;IN_NUMSEG] THEN ARITH_TAC);
1657   REPEAT ( GMATCH_SIMP_TAC (GSYM Oxl_def.periodic_sum));
1658   TYPIFY `p` EXISTS_TAC;
1659   CONJ_TAC;
1660     NUM_REDUCE_TAC;
1661     FIRST_ASSUM_ST `periodic` MP_TAC THEN REWRITE_TAC[Oxl_def.periodic];
1662     REWRITE_TAC[arith `(i+4)+k = (i+k)+4`];
1663     BY(DISCH_THEN (unlist REWRITE_TAC));
1664   TYPIFY `p` EXISTS_TAC;
1665   CONJ_TAC;
1666     NUM_REDUCE_TAC;
1667     FIRST_ASSUM_ST `periodic` MP_TAC THEN REWRITE_TAC[Oxl_def.periodic];
1668     REWRITE_TAC[arith `(i+4)+k = (i+k)+4`];
1669     BY(DISCH_THEN (unlist REWRITE_TAC));
1670   NUM_REDUCE_TAC;
1671   REWRITE_TAC[arith `3+p = SUC(SUC(SUC p))`;SUM_CLAUSES_NUMSEG;SUM_SING_NUMSEG;arith `p <= SUC p /\ p <= SUC (SUC p) /\ p <= SUC(SUC(SUC p))`];
1672   REWRITE_TAC[arith `SUC i = i+1`;arith `(i + j) + (k:num) = i+(j+k)`];
1673   NUM_REDUCE_TAC;
1674   ASM_REWRITE_TAC[];
1675   REPLICATE_TAC 7 (FIRST_X_ASSUM (C INTRO_TAC [`t`])) THEN ASM_REWRITE_TAC[] THEN REPEAT WEAKER_STRIP_TAC;
1676   REPEAT (FIRST_X_ASSUM (C INTRO_TAC [`t`])) THEN ASM_REWRITE_TAC[] THEN REPEAT WEAKER_STRIP_TAC;
1677   FIRST_X_ASSUM_ST `rho_fun` MP_TAC THEN ASM_REWRITE_TAC[Appendix.rho_rho_fun];
1678   TYPIFY `f (v(p+1)) t = v(p+1) /\ f (v (p+2)) t = v(p+2) /\ f(v (p+3)) t = v(p+3)` (C SUBGOAL_THEN ASSUME_TAC);
1679     FIRST_X_ASSUM_ST `~(w = v p) ==> a` (REPEAT o GMATCH_SIMP_TAC);
1680     BY(ASM_REWRITE_TAC[] THEN REPEAT CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN NUM_REDUCE_TAC);
1681   POP_ASSUM (fun t -> ASM_TAC THEN unlist REWRITE_TAC t THEN REPEAT DISCH_TAC THEN ASSUME_TAC t);
1682   FIRST_X_ASSUM_ST `azim` MP_TAC;
1683   FIRST_X_ASSUM_ST `azim` MP_TAC THEN BURY_MP_TAC;
1684   FIRST_ASSUM_ST `azim` ((unlist REWRITE_TAC) o GSYM);
1685   FIRST_ASSUM_ST `azim (vec 0) (v (p + 3)) (f (v p) t) (v (p + 2))` ((unlist REWRITE_TAC) o GSYM);
1686   REWRITE_TAC[arith `(a+b)+c = a + b + c`];
1687   REWRITE_TAC[arith `r0 * (a013) + r1 * (a123 + a130) + r2 * a231 + r3 * (a301+a312)  <=  r0 * (f013) + r1 * (a123 + f130) + r2 * a231 + r3 *(f301 +a312) <=> r0 * a013 + r1*a130 + r3* a301 <=  r0 * f013 + r1 * f130 + r3 * f301`];
1688   MATCH_MP_TAC (arith `a - (pi+sol0) = a' /\ b - (pi+sol0) = b' ==> (a <= b ==> a' <= b')`);
1689   REWRITE_TAC[arith `(a + b+c) - (pi + sol0) = a + b + c - (pi + sol0)`];
1690   CONJ_TAC;
1691     GMATCH_SIMP_TAC (GSYM Cuxvzoz.tau3_azim);
1692     GMATCH_SIMP_TAC Cuxvzoz.tau3_taum_nonplanar;
1693     ASM_REWRITE_TAC[];
1694     REWRITE_TAC[DIST_SYM];
1695     BY(MESON_TAC[Terminal.taum_sym]);
1696   FIRST_X_ASSUM_ST `norm a  = norm b` (SUBST1_TAC o GSYM);
1697   FIRST_X_ASSUM_ST `dist s + t` (SUBST1_TAC o GSYM);
1698   GMATCH_SIMP_TAC (GSYM Cuxvzoz.tau3_azim);
1699   GMATCH_SIMP_TAC Cuxvzoz.tau3_taum_nonplanar;
1700   REWRITE_TAC[DIST_SYM];
1701   REWRITE_TAC[CONJ_ASSOC] THEN CONJ2_TAC;
1702     ASM_REWRITE_TAC[DIST_SYM];
1703     BY(MESON_TAC[Terminal.taum_sym]);
1704   ASM_REWRITE_TAC[];
1705   BY(FIRST_X_ASSUM_ST `azim (vec 0) (f (v p) t) (v (p + 1)) (v (p + 3)) < pi` MP_TAC THEN REAL_ARITH_TAC)
1706   ]);;
1707   (* }}} *)
1708
1709 let BZQNDMN = prove_by_refinement(
1710   `main_nonlinear_terminal_v11 ==> 
1711   (!s FF v p.
1712   IMAGE (\i. (v i,v (SUC i))) (:num) = FF /\
1713   is_scs_v39 s /\
1714   scs_k_v39 s = 4 /\
1715   MMs_v39 s v /\
1716   scs_basic_v39 s /\
1717   scs_generic v /\
1718   (!i j. scs_diag 4 i j ==> scs_a_v39 s i j <= cstab /\ cstab < dist(v i,v j) /\ &4 * h0 < scs_b_v39 s i j) /\
1719   (!i. ~(i MOD 4 = (p+3) MOD 4) ==> interior_angle1 (vec 0) FF (v i) < pi)
1720   ==> (dist(v p,v(p+1)) = scs_a_v39 s p (p+1) \/ dist(v p,v(p+1)) = scs_b_v39 s p (p+1)))`,
1721   (* {{{ proof *)
1722   [
1723   REPEAT WEAKER_STRIP_TAC;
1724   TYPIFY `BBprime2_v39 s v` (C SUBGOAL_THEN ASSUME_TAC);
1725     BY(ASM_MESON_TAC[Appendix.scs_basic;Ayqjtmd.unadorned_MMs]);
1726   TYPIFY `BBprime_v39 s v` (C SUBGOAL_THEN ASSUME_TAC);
1727     BY(ASM_MESON_TAC[Appendix.BBprime2_v39]);
1728   TYPIFY `BBs_v39 s v` (C SUBGOAL_THEN ASSUME_TAC);
1729     BY(ASM_MESON_TAC[Appendix.BBprime_v39]);
1730   INTRO_TAC Appendix.BBs_v39 [`s`;`v`];
1731   ASM_REWRITE_TAC[LET_DEF;LET_END_DEF;Terminal.IMAGE_SUBSET_IN;IN_UNIV;arith `~(4 <= 3)`];
1732   REPEAT WEAKER_STRIP_TAC;
1733   TYPED_ABBREV_TAC `V = IMAGE v (:num)`;
1734   TYPED_ABBREV_TAC `E = IMAGE (\i. {v i, v (SUC i)}) (:num)`;
1735   TYPIFY `local_fan (V,E,FF)` (C SUBGOAL_THEN ASSUME_TAC);
1736     MATCH_MP_TAC Local_lemmas.CVX_LO_IMP_LO;
1737     BY(ASM_REWRITE_TAC[]);
1738   TYPIFY `!i. v i IN V` (C SUBGOAL_THEN ASSUME_TAC);
1739     REPEAT WEAKER_STRIP_TAC;
1740     EXPAND_TAC "V";
1741     REWRITE_TAC[IN_IMAGE;IN_UNIV];
1742     BY(MESON_TAC[]);
1743   INTRO_TAC Cuxvzoz.BBs_inj [`s`;`v`;`4`];
1744   ASM_REWRITE_TAC[];
1745   DISCH_TAC;
1746   TYPIFY `!i. interior_angle1 (vec 0) FF (v i) = azim (vec 0) (v i) (v (i+1)) (v (i+3))` (C SUBGOAL_THEN ASSUME_TAC);
1747     GEN_TAC;
1748     EXPAND_TAC "FF";
1749     GMATCH_SIMP_TAC (REWRITE_RULE[LET_THM] (GSYM Ocbicby.INTERIOR_ANGLE1_AZIM));
1750     TYPIFY `s` EXISTS_TAC;
1751     BY(ASM_REWRITE_TAC[IN;arith `4 - 1 = 3`;arith `3 < 4`;arith `SUC i = i+1`]);
1752   INTRO_TAC Ocbicby.LOCAL_FAN_AZIM_POS [`s`;`v`];
1753   ASM_REWRITE_TAC[LET_THM;IN;arith `4-1 = 3`;arith `SUC i = i+1`];
1754   DISCH_TAC;
1755   TYPIFY `!i. v (i MOD 4) = v i` (C SUBGOAL_THEN ASSUME_TAC);
1756     GEN_TAC;
1757     MATCH_MP_TAC (GSYM Oxl_def.periodic_mod);
1758     BY(ASM_REWRITE_TAC[arith `~(0=4)`]);
1759   TYPIFY `v 4 = v 0 /\ v 5 = v 1 /\ v 6 = v 2 /\ v 7 = v 3 /\ v 8  = v 4` (C SUBGOAL_THEN ASSUME_TAC);
1760     FIRST_X_ASSUM ((unlist ONCE_REWRITE_TAC) o GSYM);
1761     BY(REWRITE_TAC[Terminal.MOD_4_EXPLICIT;arith `7 = 1*4 + 3`;arith `8 = 2*4 + 0`;MOD_MULT_ADD]);
1762   TYPIFY `generic V E` (C SUBGOAL_THEN ASSUME_TAC);
1763     BY(FIRST_X_ASSUM_ST `scs_generic` MP_TAC THEN ASM_REWRITE_TAC[Appendix.scs_generic]);
1764   TYPIFY `v (p+4) = v p /\ v (p+5) = v (p+1) /\ v (p+6) = v (p+2) /\ v (p+7) = v (p+3) /\ v (p+8)  = v (p)` (C SUBGOAL_THEN ASSUME_TAC);
1765     FIRST_X_ASSUM_ST `MOD` ((unlist ONCE_REWRITE_TAC) o GSYM);
1766     BY(REWRITE_TAC[arith `p+4 = 1*4 + p /\ p+5 = 1*4+(p+1) /\ p+6=1*4+(p+2) /\ p+7 = 1*4 + (p+3) /\ p+8 = 2*4 + p`;MOD_MULT_ADD]);
1767   COMMENT "change here";
1768   INTRO_TAC Terminal.vv_split_azim_generic [`v`;`4`;`p`;`2`;`3`];
1769   REWRITE_TAC[arith `SUC (x+k) = (x+k)+1`;arith `((p:num)+i)+j = p+(i+j)`];
1770   NUM_REDUCE_TAC;
1771   ASM_REWRITE_TAC[LET_THM];
1772   DISCH_TAC;
1773   INTRO_TAC Terminal.vv_split_azim_generic [`v`;`4`;`p+2`;`2`;`3`];
1774   REWRITE_TAC[arith `SUC (x+k) = (x+k)+1`;arith `((p:num)+i)+j = p+(i+j)`];
1775   NUM_REDUCE_TAC;
1776   ASM_REWRITE_TAC[LET_THM];
1777   DISCH_TAC;
1778   COMMENT "collinearity";
1779   TYPIFY `!i j. ~(v i = v j) ==> ~collinear {vec 0,v i, v j}` (C SUBGOAL_THEN ASSUME_TAC);
1780     REPEAT GEN_TAC THEN DISCH_TAC;
1781     MATCH_MP_TAC Zlzthic.PROPERTIES_GENERIC_LOCAL_FAN_ALT;
1782     GEXISTL_TAC [`V`;`E`;`FF`];
1783     BY(ASM_REWRITE_TAC[IN_IMAGE;IN_UNIV]);
1784   TYPIFY `!i j. i < 4 /\ j < 4 /\ ~(i = j) ==> ~(v i = v j)` (C SUBGOAL_THEN ASSUME_TAC);
1785     BY(REPLICATE_TAC 10 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[]);
1786   INTRO_TAC PERIODIC_INJ_MOD [`v`;`4`];
1787   ASM_REWRITE_TAC[arith `~(4 = 0)`];
1788   DISCH_TAC;
1789   TYPIFY `azim (vec 0) (v (p+1)) (v((p+1)+1)) (v ((p+1)+3)) = azim (vec 0) (v (p+1)) (v (p+2)) (v p)` (C SUBGOAL_THEN ASSUME_TAC);
1790     BY(REWRITE_TAC[arith `(p+1)+i = p+(1+i)`] THEN NUM_REDUCE_TAC THEN ASM_REWRITE_TAC[] THEN DISCH_TAC);
1791   TYPIFY `azim (vec 0) (v (p+1)) (v ((p+1)+1)) (v ((p+1)+3)) < pi` (C SUBGOAL_THEN MP_TAC);
1792     FIRST_X_ASSUM_ST `interior_angle1` ((unlist REWRITE_TAC) o GSYM);
1793     FIRST_X_ASSUM MATCH_MP_TAC;
1794     GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
1795     BY(NUM_REDUCE_TAC);
1796   ASM_REWRITE_TAC[] THEN DISCH_TAC;
1797   TYPIFY `&0 < azim (vec 0) (v (p+1)) (v ((p+1)+1)) (v ((p+1)+3))` (C SUBGOAL_THEN MP_TAC);
1798     BY(ASM_REWRITE_TAC[]);
1799   FIRST_X_ASSUM SUBST1_TAC THEN DISCH_TAC;
1800   TYPIFY `~coplanar {vec 0,v p,v (p+1),v (p+2)}` (C SUBGOAL_THEN ASSUME_TAC);
1801     ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,c,d,b}`];
1802     REWRITE_TAC[GSYM Local_lemmas1.AZIM_COND_FOR_COPLANAR];
1803     MATCH_MP_TAC (arith `&0 < x /\ x < pi ==> ~ ((x = &0) \/ (x = pi))`);
1804     BY((ASM_REWRITE_TAC[]));
1805   TYPIFY `!i a b. a < 4 /\ b < 4 /\ ~(a = b) ==> ~collinear {vec 0,v(i+a),v(i+b)}` (C SUBGOAL_THEN ASSUME_TAC);
1806     REPEAT WEAKER_STRIP_TAC;
1807     FIRST_X_ASSUM MP_TAC THEN REWRITE_TAC[];
1808     FIRST_X_ASSUM_ST `v (i MOD 4) = v i` ((unlist ONCE_REWRITE_TAC) o GSYM);
1809     REPEAT (FIRST_X_ASSUM MATCH_MP_TAC);
1810     nCONJ_TAC 2;
1811       GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
1812       NUM_REDUCE_TAC;
1813       BY(REPLICATE_TAC 3 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[DIVISION;MOD_LT;arith `~(4=0)`]);
1814     ASM_REWRITE_TAC[];
1815     BY(MESON_TAC[DIVISION;arith `~(4=0)`]);
1816   COMMENT "introduce deformation";
1817   INTRO_TAC Cuxvzoz.deform_simplex_edge_exists [`V`;`(\ (t:real). t)`;`(\(t:real).  &0)`;`v (p)`;`v (p+1)`;`v (p +2)`;`&1`];
1818   ASM_REWRITE_TAC[];
1819   REPEAT WEAKER_STRIP_TAC;
1820   FIRST_X_ASSUM MP_TAC;
1821   ANTS_TAC;
1822     REWRITE_TAC[arith `&0 < &1`];
1823     CONJ_TAC;
1824       INTRO_TAC Planarity.cross_dot_fully_surrounded_fan [`(vec 0):real^3`;`v (p+1)`;`v (p)`;`v(p+2)`];
1825       ASM_REWRITE_TAC[];
1826       ANTS_TAC;
1827         INTRO_TAC Planarity.notcoplanar_imp_notcollinear_fan [`(vec 0):real^3`;`v p`;`v (p+1)`;`v(p+2)`];
1828         BY(REPLICATE_TAC 3 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[SET_RULE `{a,b,c}={a,c,b}`]);
1829       MATCH_MP_TAC (arith `x = y ==> (&0 < x ==> y > &0)`);
1830       BY(VEC3_TAC);
1831     REPEAT ( GMATCH_SIMP_TAC REAL_CONTINUOUS_ON_EQ_REAL_CONTINUOUS_AT);
1832     REWRITE_TAC[Ocbicby.REAL_OPEN_REAL_INTERVAL];
1833     BY(REWRITE_TAC[REAL_CONTINUOUS_CONST;REAL_CONTINUOUS_AT_ID]);
1834   REPEAT WEAKER_STRIP_TAC;
1835   COMMENT "A";
1836   TYPIFY `~(scs_a_v39 s p (p+1) < dist(v p,v (p+1)) /\ dist(v p,v (p+1)) < scs_b_v39 s p (p+1))` ENOUGH_TO_SHOW_TAC;
1837     FIRST_X_ASSUM_ST `scs_a_v39` (C INTRO_TAC [`p`;`(p+1)`]);
1838     BY(REAL_ARITH_TAC);
1839   REPEAT WEAKER_STRIP_TAC;
1840   TYPIFY `(!i t. abs t < e' ==> norm (f (v i) t) = norm (v i))` (C SUBGOAL_THEN ASSUME_TAC);
1841     REPEAT WEAKER_STRIP_TAC;
1842     TYPIFY `v i = v (p+1)` ASM_CASES_TAC;
1843       ASM_REWRITE_TAC[];
1844       FIRST_X_ASSUM_ST `norm` (C INTRO_TAC [`t`]);
1845       BY(ASM_REWRITE_TAC[] THEN MESON_TAC[]);
1846     FIRST_X_ASSUM GMATCH_SIMP_TAC;
1847     BY(ASM_REWRITE_TAC[]);
1848   TYPIFY `!i. 0 < i /\ i < 4 ==> ~(v (p + i) = v p)` (C SUBGOAL_THEN ASSUME_TAC);
1849     REPEAT WEAKER_STRIP_TAC;
1850     FIRST_X_ASSUM MP_TAC;
1851     ASM_REWRITE_TAC[];
1852     GEN_REWRITE_TAC (RAND_CONV o RAND_CONV o LAND_CONV o ONCE_DEPTH_CONV) [arith `p = p+0`];
1853     GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
1854     NUM_REDUCE_TAC;
1855     BY(REPLICATE_TAC 2 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[DIVISION;MOD_LT;arith `~(4=0)`;arith `0 < i ==> ~(i=0)`]);
1856   TYPIFY `!i. i=0 \/ i = 2 \/ i = 3 ==> ~(v (p + i) = v (p+1))` (C SUBGOAL_THEN ASSUME_TAC);
1857     BY(REPEAT STRIP_TAC THEN FIRST_X_ASSUM MP_TAC THEN ASM_REWRITE_TAC[] THEN GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT THEN NUM_REDUCE_TAC);
1858   TYPIFY `!i j (k:num). v i = v j ==> v (i+k) = v (j+k)` (C SUBGOAL_THEN ASSUME_TAC);
1859     ASM_REWRITE_TAC[];
1860     REPEAT WEAKER_STRIP_TAC;
1861     ONCE_REWRITE_TAC[arith `(i:num) + k = k + i`];
1862     GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
1863     BY(ASM_REWRITE_TAC[arith `~(4 = 0)`]);
1864   TYPIFY `!t. azim (vec 0) (f (v (p+3)) t) (f (v (p)) t) (f (v (p+2)) t) = azim(vec 0) (v(p+3)) (v(p)) (v(p+2))` (C SUBGOAL_THEN ASSUME_TAC);
1865     GEN_TAC;
1866     FIRST_X_ASSUM_ST `~(w = v (p+1)) ==> a` (REPEAT o GMATCH_SIMP_TAC);
1867     ONCE_REWRITE_TAC[arith `(v p = (v:num->real^3) (p+1)) <=> (v(p+1) = v p)`];
1868     BY(REPEAT CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN NUM_REDUCE_TAC);
1869   TYPIFY `!i. azim (vec 0) (v i) (v (i+1)) (v (i+3)) <= pi` (C SUBGOAL_THEN ASSUME_TAC);
1870     GEN_TAC;
1871     FIRST_X_ASSUM_ST `interior_angle1` ((unlist REWRITE_TAC) o GSYM);
1872     MATCH_MP_TAC Local_lemmas.CONVEX_LOFA_IMP_INANGLE_LE_PI;
1873     BY(ASM_REWRITE_TAC[]);
1874   TYPIFY `(!i. ?e0. &0 < e0 /\           (azim (vec 0) (v i) (v (i + 1)) (v (i + 3)) = pi            ==> (!t. abs t < e0                     ==> azim (vec 0) (f (v i) t) (f (v (i + 1)) t)                         (f (v (i + 3)) t) <=                         pi)))` (C SUBGOAL_THEN ASSUME_TAC);
1875     GEN_TAC;
1876     TYPIFY `v i = v (p+3)` ASM_CASES_TAC;
1877       FIRST_ASSUM (fun t -> FIRST_X_ASSUM (ASSUME_TAC o (C MATCH_MP t)));
1878       TYPIFY `&1` EXISTS_TAC;
1879       ASM_REWRITE_TAC[arith `&0 < &1`;arith `(p+3)+k = p + (3+k)`];
1880       NUM_REDUCE_TAC THEN ASM_REWRITE_TAC[];
1881       BY(REAL_ARITH_TAC);
1882     TYPIFY `azim (vec 0) (v i) (v (i + 1)) (v (i + 3)) < pi` ENOUGH_TO_SHOW_TAC;
1883       BY(MESON_TAC[arith `x < pi ==> ~(x = pi)`;arith `&0 < &1`]);
1884     BY(ASM_MESON_TAC[]);
1885   (COMMENT "deformation in BBs");
1886   INTRO_TAC Cuxvzoz.deformation_BBs_ALT [`s`;`4`;`f`;`v`;`e'`];
1887   ANTS_TAC;
1888     NUM_REDUCE_TAC;
1889     ASM_REWRITE_TAC[];
1890     MATCH_MP_TAC ab4_assumption_reduction_sym;
1891     GEXISTL_TAC [`p`;`e'`];
1892     ASM_REWRITE_TAC[];
1893     CONJ_TAC;
1894       REPEAT WEAKER_STRIP_TAC;
1895       FIRST_X_ASSUM_ST `scs_diag` (C INTRO_TAC [`i`;`j`]);
1896       BY(ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC);
1897     REPEAT WEAKER_STRIP_TAC;
1898     (FIRST_X_ASSUM_ST `norm` (C INTRO_TAC [`t`]));
1899     BY(ASM_REWRITE_TAC[DIST_SYM] THEN REAL_ARITH_TAC);
1900   (REPEAT WEAKER_STRIP_TAC);
1901   COMMENT "azim sums";
1902   INTRO_TAC deform_azim_sum [`v (p)`;`v (p+1)`;`v (p+2)`;`v(p+3)`;`f`;`e'`];
1903   ANTS_TAC;
1904     REPEAT (FIRST_X_ASSUM_ST `c = a + b` MP_TAC) THEN ASM_REWRITE_TAC[];
1905     REPLICATE_TAC 3 DISCH_TAC;
1906     CONJ_TAC;
1907       MATCH_MP_TAC Zlzthic.deformation_subset;
1908       (TYPIFY `V` EXISTS_TAC THEN ASM_REWRITE_TAC[SUBSET;IN_INSERT;NOT_IN_EMPTY]);
1909       BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
1910     TYPIFY `~collinear {vec 0, v (p + 0), v (p+1)} /\ ~collinear {vec 0, v (p + 0), v (p + 2)} /\ ~collinear {vec 0, v (p + 0), v (p + 3)}` (C SUBGOAL_THEN MP_TAC);
1911       BY(REPEAT CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN NUM_REDUCE_TAC);
1912     REWRITE_TAC[arith `p+0=p`] THEN DISCH_THEN (unlist REWRITE_TAC);
1913     nCONJ_TAC 1;
1914       BY(FIRST_X_ASSUM_ST `SUC` MP_TAC THEN REWRITE_TAC[arith `SUC p = p+1`] THEN DISCH_THEN (unlist REWRITE_TAC));
1915     FIRST_X_ASSUM (SUBST1_TAC) THEN REWRITE_TAC[];
1916     REPLICATE_TAC 3 (FIRST_X_ASSUM kill);
1917     ASM_REWRITE_TAC[];
1918     CONJ_TAC;
1919       FIRST_X_ASSUM_ST `interior_angle1` ((unlist REWRITE_TAC) o GSYM);
1920       ASM_REWRITE_TAC[];
1921       FIRST_X_ASSUM MATCH_MP_TAC;
1922       GEN_REWRITE_TAC (RAND_CONV o LAND_CONV o LAND_CONV o ONCE_DEPTH_CONV) [arith `p = p+0`];
1923       GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
1924       BY(NUM_REDUCE_TAC);
1925     DISJ2_TAC;
1926     CONJ_TAC;
1927       GEN_TAC;
1928       FIRST_X_ASSUM_ST `~(w = v p) ==> a` (REPEAT o GMATCH_SIMP_TAC);
1929       ASM_REWRITE_TAC[];
1930       TYPIFY `p MOD 4 = (p+0) MOD 4` (C SUBGOAL_THEN SUBST1_TAC);
1931         BY(REWRITE_TAC[arith `p+0 = p`]);
1932       BY(REPEAT CONJ_TAC THEN GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT THEN NUM_REDUCE_TAC);
1933     REWRITE_TAC[Zlzthic.azim_lt_pi_cross];
1934     TYPIFY `(v (p) cross v (p+1)) dot v (p + 2) = (v (p+1) cross (v (p+2))) dot v (p)` (C SUBGOAL_THEN SUBST1_TAC);
1935       BY(VEC3_TAC);
1936     REWRITE_TAC[GSYM Zlzthic.azim_lt_pi_cross];
1937     BY(ASM_REWRITE_TAC[]);
1938   (REPEAT WEAKER_STRIP_TAC);
1939   INTRO_TAC deform_azim_sum [`v (p+2)`;`v (p+3)`;`v (p)`;`v(p+1)`;`f`;`e'`];
1940   ANTS_TAC;
1941     REPEAT (FIRST_X_ASSUM_ST `c = a + b` MP_TAC) THEN ASM_REWRITE_TAC[];
1942     REPLICATE_TAC 3 DISCH_TAC;
1943     CONJ_TAC;
1944       MATCH_MP_TAC Zlzthic.deformation_subset;
1945       (TYPIFY `V` EXISTS_TAC THEN ASM_REWRITE_TAC[SUBSET;IN_INSERT;NOT_IN_EMPTY]);
1946       BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
1947     TYPIFY `~collinear {vec 0, v (p + 2), v (p + 3)} /\ ~collinear {vec 0, v (p + 2), v (p + 0)} /\ ~collinear {vec 0, v (p + 2), v (p + 1)}` (C SUBGOAL_THEN MP_TAC);
1948       BY(REPEAT CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN NUM_REDUCE_TAC);
1949     REWRITE_TAC[arith `p+0=p`] THEN DISCH_THEN (unlist REWRITE_TAC);
1950     nCONJ_TAC 2;
1951       BY(ASM_REWRITE_TAC[]);
1952     FIRST_X_ASSUM (SUBST1_TAC) THEN REWRITE_TAC[];
1953     REPLICATE_TAC 4 (FIRST_X_ASSUM kill);
1954     ASM_REWRITE_TAC[];
1955     TYPIFY_GOAL_THEN `&0 < azim (vec 0) (v (p + 2)) (v (p + 3)) (v (p+1)) /\ azim (vec 0) (v (p + 2)) (v (p + 3)) (v (p+1)) < pi` (unlist REWRITE_TAC);
1956       FIRST_X_ASSUM_ST `&0 < azim a b c d` (C INTRO_TAC [`p+2`]);
1957       TYPIFY `azim (vec 0) (v (p+2)) (v (p+3)) (v (p+1)) = azim (vec 0) (v (p + 2)) (v ((p + 2) + 1)) (v ((p + 2) + 3))` (C SUBGOAL_THEN ASSUME_TAC);
1958         BY(REWRITE_TAC[arith `((p:num) + i) + j = p + i+j`] THEN NUM_REDUCE_TAC THEN ASM_REWRITE_TAC[]);
1959       ASM_REWRITE_TAC[];
1960       DISCH_THEN (unlist REWRITE_TAC);
1961       FIRST_X_ASSUM_ST `interior_angle1` ((unlist REWRITE_TAC) o GSYM);
1962       ASM_REWRITE_TAC[];
1963       FIRST_X_ASSUM MATCH_MP_TAC;
1964       GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
1965       BY(NUM_REDUCE_TAC);
1966     DISJ1_TAC;
1967     CONJ_TAC;
1968       GEN_TAC;
1969       FIRST_X_ASSUM_ST `~(w = v (p+1)) ==> a` (REPEAT o GMATCH_SIMP_TAC);
1970       ASM_REWRITE_TAC[];
1971       TYPIFY `p MOD 4 = (p+0) MOD 4` (C SUBGOAL_THEN SUBST1_TAC);
1972         BY(REWRITE_TAC[arith `p + 0 = p`]);
1973       BY(REPEAT CONJ_TAC THEN GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT THEN NUM_REDUCE_TAC);
1974     REWRITE_TAC[Zlzthic.azim_lt_pi_cross];
1975     TYPIFY `(v (p + 2) cross v (p)) dot v (p+1) = (v (p+1) cross (v (p+2))) dot v (p)` (C SUBGOAL_THEN SUBST1_TAC);
1976       BY(VEC3_TAC);
1977     REWRITE_TAC[GSYM Zlzthic.azim_lt_pi_cross];
1978     BY(ASM_REWRITE_TAC[]);
1979   (REPEAT WEAKER_STRIP_TAC);
1980   TYPIFY `?e3. &0 < e3 /\ (!t. abs t < e3 ==> dist(v p,v (p+1)) + t IN real_interval(scs_a_v39 s p (p+1),scs_b_v39 s p (p+1)))` (C SUBGOAL_THEN MP_TAC);
1981     INTRO_TAC Zlzthic.real_interval_contains_0_ball [`scs_a_v39 s p (p+1)-dist(v p,v (p+1))`;`scs_b_v39 s p (p+1) - dist(v p,v (p+1))`;`&1`];
1982     ASM_REWRITE_TAC[arith `&0 < &1`;arith `a - d < &0 <=> a < d`;arith `&0 < b - d <=> d < b`];
1983     REPEAT WEAKER_STRIP_TAC;
1984     TYPIFY `e` EXISTS_TAC;
1985     ASM_REWRITE_TAC[] THEN REPEAT WEAKER_STRIP_TAC;
1986     FIRST_X_ASSUM (C INTRO_TAC [`t`]);
1987     ASM_REWRITE_TAC[IN_REAL_INTERVAL];
1988     BY(REAL_ARITH_TAC);
1989   REPEAT WEAKER_STRIP_TAC;
1990   (COMMENT "coplanar");
1991   INTRO_TAC Zlzthic.NONPLANAR_OPEN [`(\ (t:real). (vec 0):real^3)`;`\ (t:real). (v p)`;`f( v (p+1))`;`\ (t:real). v (p+2)`;`&0`];
1992   ASM_REWRITE_TAC[CONTINUOUS_CONST];
1993   DISCH_THEN MP_TAC THEN ANTS_TAC;
1994     FIRST_X_ASSUM_ST `deformation` MP_TAC THEN REWRITE_TAC[Localization.deformation] THEN REPEAT WEAKER_STRIP_TAC;
1995     CONJ2_TAC;
1996       BY(FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]);
1997     POP_ASSUM GMATCH_SIMP_TAC;
1998     BY(ASM_REWRITE_TAC[]);
1999   REWRITE_TAC[arith `abs (&0 - t') = abs t'`] THEN REPEAT WEAKER_STRIP_TAC;
2000   INTRO_TAC Zlzthic.WNWSHJT [`v(p)`;`v (p+1)`;`v (p+2)`;`f`;`-- e'`;`e'`];
2001   ANTS_TAC;
2002     ASM_REWRITE_TAC[];
2003     CONJ_TAC;
2004       MATCH_MP_TAC Zlzthic.deformation_subset;
2005       (TYPIFY `V` EXISTS_TAC THEN ASM_REWRITE_TAC[SUBSET;IN_INSERT;NOT_IN_EMPTY]);
2006       BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
2007     FIRST_X_ASSUM_ST `deformation` MP_TAC THEN REWRITE_TAC[Localization.deformation];
2008     REPEAT WEAKER_STRIP_TAC;
2009     FIRST_X_ASSUM (REPEAT o GMATCH_SIMP_TAC) THEN ASM_REWRITE_TAC[];
2010     TYPIFY `!i. ~(i=1) /\ i < 3 ==> ~collinear {vec 0,v (p+1),v(p+i)}` ENOUGH_TO_SHOW_TAC;
2011       BY(MESON_TAC[arith `p+0=p` ;arith `~(0=1) /\ 0 < 3 /\ ~(2=1) /\ 2 < 3`]);
2012     GEN_TAC THEN DISCH_TAC;
2013     FIRST_X_ASSUM MATCH_MP_TAC;
2014     BY(POP_ASSUM MP_TAC THEN ARITH_TAC);
2015   REPEAT WEAKER_STRIP_TAC;
2016   COMMENT "introduce 1834";
2017   INTRO_TAC Iunbuig.epsilon_hept [`e`;`e'`;`e''`;`e'''`;`e3`;`e1`;`e1'`] THEN ASM_REWRITE_TAC[] THEN REPEAT WEAKER_STRIP_TAC;
2018   FIRST_ASSUM_ST `i = 0 \/ i = 2 \/ i = 3` MP_TAC;
2019   FIRST_ASSUM_ST `i MOD 4 = j MOD 4` (unlist REWRITE_TAC);
2020   DISCH_TAC;
2021   INTRO_TAC (UNDISCH Ocbicby.LEMMA_1834976363) [`norm (v (p+2))`;`norm (v (p))`;`norm (v (p+1))`;`dist(v (p),v(p+1))`;`dist (v(p+2),v(p+1))`;`dist(v (p+2),v (p))`;`dist(v (p),v (p+1)) - e7`;`dist(v (p),v(p+1)) + e7`];
2022   ANTS_TAC;
2023     ASM_REWRITE_TAC[];
2024     (COMMENT "1834 ants");
2025     TYPIFY `!i. &2 <= norm (v i) /\ norm (v i) <= &2 * h0` (C SUBGOAL_THEN ASSUME_TAC);
2026       GEN_TAC;
2027       REWRITE_TAC[GSYM Fnjlbxs.in_ball_annulus];
2028       FIRST_X_ASSUM_ST `BBs_v39` kill THEN FIRST_X_ASSUM_ST `BBs_v39` MP_TAC THEN REWRITE_TAC[Appendix.BBs_v39;LET_THM] THEN EXPAND_TAC "V" THEN REPEAT WEAKER_STRIP_TAC;
2029       FIRST_X_ASSUM_ST `ball_annulus` MP_TAC;
2030       REWRITE_TAC[SUBSET;IN_IMAGE;IN_UNIV];
2031       BY(MESON_TAC[]);
2032     ASM_REWRITE_TAC[];
2033     FIRST_ASSUM_ST `collinear` (C INTRO_TAC [`p`;`2`;`0`]);
2034     FIRST_X_ASSUM_ST `collinear` (C INTRO_TAC [`p`;`2`;`1`]);
2035     NUM_REDUCE_TAC;
2036     REWRITE_TAC[arith `p + 0 = p`];
2037     REPEAT WEAKER_STRIP_TAC;
2038     TYPIFY_GOAL_THEN `&0 < ups_x (norm (v (p + 2)) * norm (v (p + 2))) (norm (v p) * norm (v p)) (dist (v (p + 2),v p) * dist (v (p + 2),v p)) /\ &0 < ups_x (norm (v (p + 2)) * norm (v (p + 2))) (norm (v (p + 1)) * norm (v (p + 1))) (dist (v (p + 2),v (p + 1)) * dist (v (p + 2),v (p + 1)))` (unlist REWRITE_TAC);
2039       REPLICATE_TAC 2 (FIRST_X_ASSUM MP_TAC);
2040       REWRITE_TAC[Collect_geom2.NOT_COL_EQ_UPS_X_POS;DIST_0;DIST_SYM;arith`x pow 2 = x*x`];
2041       BY(MESON_TAC[]);
2042     TYPIFY `!i j. &2 <= dist(v i,v j) ==> (&2 / h0) pow 2 <= xrr (norm(v i)) (norm(v (j))) (dist (v i,v j))` ((C SUBGOAL_THEN ASSUME_TAC));
2043       REPEAT WEAKER_STRIP_TAC;
2044       MATCH_MP_TAC Ocbicby.xrr_simple_lower_bound;
2045       BY(ASM_REWRITE_TAC[arith `x <= x`]);
2046     CONJ_TAC;
2047       POP_ASSUM MATCH_MP_TAC;
2048       MATCH_MP_TAC Ocbicby.scs_lb_2;
2049       TYPIFY `s` EXISTS_TAC;
2050       ASM_REWRITE_TAC[];
2051       GEN_REWRITE_TAC (RAND_CONV o LAND_CONV o LAND_CONV o ONCE_DEPTH_CONV) [arith `p = p+0`];
2052       FIRST_X_ASSUM MATCH_MP_TAC;
2053       BY(NUM_REDUCE_TAC);
2054     CONJ_TAC;
2055       TYPIFY `#15.53 = sqrt(#15.53) pow 2` (C SUBGOAL_THEN SUBST1_TAC);
2056         GMATCH_SIMP_TAC SQRT_POW_2;
2057         BY(REAL_ARITH_TAC);
2058       MATCH_MP_TAC Ocbicby.xrr_simple_upper_bound;
2059       ASM_REWRITE_TAC[];
2060       TYPIFY `&4 = sqrt(&16)` (C SUBGOAL_THEN SUBST1_TAC);
2061         REWRITE_TAC[arith `&16 = &4 pow 2`];
2062         REWRITE_TAC[POW_2_SQRT_ABS];
2063         BY(REAL_ARITH_TAC);
2064       GMATCH_SIMP_TAC SQRT_MONO_LT_EQ;
2065       TYPIFY_GOAL_THEN `&0 <=  #15.53 /\ &0 < &16 /\  #15.53 < &16` (unlist REWRITE_TAC);
2066         BY(REAL_ARITH_TAC);
2067       CONJ_TAC;
2068         BY(REAL_ARITH_TAC);
2069       CONJ_TAC;
2070         MATCH_MP_TAC Ocbicby.scs_lb_2;
2071         TYPIFY `s` EXISTS_TAC;
2072         ASM_REWRITE_TAC[];
2073         GEN_REWRITE_TAC (RAND_CONV o LAND_CONV o LAND_CONV o ONCE_DEPTH_CONV) [arith `p = p+0`];
2074         FIRST_X_ASSUM MATCH_MP_TAC;
2075         BY(NUM_REDUCE_TAC);
2076       MATCH_MP_TAC REAL_LE_TRANS;
2077       TYPIFY `cstab` EXISTS_TAC;
2078       CONJ_TAC;
2079         MATCH_MP_TAC (arith `d <= scs_b_v39 s p (p+1) /\ scs_b_v39 s p (p+1) <= cstab ==> d <= cstab`);
2080         CONJ_TAC;
2081           FIRST_X_ASSUM_ST `BBs_v39` kill;
2082           (FIRST_X_ASSUM_ST `BBs_v39` MP_TAC) THEN REWRITE_TAC[Appendix.BBs_v39;LET_THM];
2083           BY(MESON_TAC[]);
2084         FIRST_X_ASSUM_ST `is_scs_v39` MP_TAC THEN REWRITE_TAC[Appendix.is_scs_v39];
2085         ASM_REWRITE_TAC[arith `3 < 4`;arith `SUC i = i+1`];
2086         BY(MESON_TAC[]);
2087       REWRITE_TAC[Sphere.cstab];
2088       MATCH_MP_TAC REAL_LE_RSQRT;
2089       BY(REAL_ARITH_TAC);
2090     CONJ_TAC;
2091       FIRST_X_ASSUM MATCH_MP_TAC;
2092       MATCH_MP_TAC Ocbicby.scs_lb_2;
2093       TYPIFY `s` EXISTS_TAC;
2094       ASM_REWRITE_TAC[];
2095       BY(GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT THEN NUM_REDUCE_TAC);
2096     CONJ_TAC;
2097       FIRST_X_ASSUM MATCH_MP_TAC;
2098       MATCH_MP_TAC Ocbicby.scs_lb_2;
2099       TYPIFY `s` EXISTS_TAC;
2100       ASM_REWRITE_TAC[];
2101       GEN_REWRITE_TAC (RAND_CONV o RAND_CONV o LAND_CONV o ONCE_DEPTH_CONV) [arith `p = p+0`];
2102       BY(GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT THEN NUM_REDUCE_TAC);
2103     CONJ_TAC;
2104       REWRITE_TAC[IN_REAL_INTERVAL];
2105       BY(FIRST_X_ASSUM_ST `&0 < e` MP_TAC THEN REAL_ARITH_TAC);
2106     COMMENT "subset constraints";
2107     CONJ_TAC;
2108       REWRITE_TAC[SUBSET;IN_REAL_INTERVAL;IN_ELIM_THM];
2109       REPEAT WEAKER_STRIP_TAC;
2110       TYPIFY `?t. abs t < e7 /\ x = dist(v p,v(p+1)) + t` (C SUBGOAL_THEN MP_TAC);
2111         TYPIFY `x - dist(v p,v(p+1))` EXISTS_TAC;
2112         CONJ2_TAC;
2113           BY(REAL_ARITH_TAC);
2114         BY(REPLICATE_TAC 2 (POP_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
2115       REPEAT WEAKER_STRIP_TAC;
2116       ASM_REWRITE_TAC[];
2117       FIRST_X_ASSUM_ST `norm (f (v (p+1)) t) = norm (v (p+1))` (C INTRO_TAC [`t`]);
2118       ANTS_TAC;
2119         BY(REPEAT (FIRST_X_ASSUM MATCH_MP_TAC) THEN ASM_REWRITE_TAC[]);
2120       REWRITE_TAC[DIST_SYM] THEN ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN REPEAT WEAKER_STRIP_TAC THEN ASM_REWRITE_TAC[];
2121       FIRST_X_ASSUM_ST `coplanar` (C INTRO_TAC [`t`]);
2122       ANTS_TAC;
2123         BY(REPEAT (FIRST_X_ASSUM MATCH_MP_TAC) THEN ASM_REWRITE_TAC[]);
2124       DISCH_TAC;
2125       FIRST_ASSUM MP_TAC THEN ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,d,b,c}`] THEN REWRITE_TAC[Oxlzlez.coplanar_delta_y;DIST_0;DIST_SYM];
2126       RULE_ASSUM_TAC (REWRITE_RULE[arith `d + &0 = d`]);
2127       ASM_REWRITE_TAC[];
2128       DISCH_THEN (unlist REWRITE_TAC);
2129       REWRITE_TAC[GSYM DIST_NZ];
2130       CONJ_TAC;
2131         DISCH_TAC;
2132         FIRST_X_ASSUM_ST `coplanar` MP_TAC;
2133         BY(ASM_REWRITE_TAC[SET_RULE `{a,b,b,c} = {a,b,c}`;COPLANAR_3]);
2134       TYPIFY `~collinear {vec 0, (v p) ,f (v (p+1)) t}` (C SUBGOAL_THEN MP_TAC);
2135         BY(POP_ASSUM MP_TAC THEN MESON_TAC[Planarity.notcoplanar_imp_notcollinear_fan]);
2136       REWRITE_TAC[Collect_geom2.NOT_COL_EQ_UPS_X_POS];
2137       BY(REWRITE_TAC[DIST_0;arith `x pow 2 = x*x`;DIST_SYM]);
2138     TYPIFY `!i.  i < 2 ==> &0 < dist ( v (p+2),v (p+i))` ENOUGH_TO_SHOW_TAC;
2139       BY(MESON_TAC[arith `p + 0 = (p:num)`;arith `0 < 2`;arith `1 < 2`]);
2140     REPEAT WEAKER_STRIP_TAC;
2141     MATCH_MP_TAC (arith `&2 <= x ==> &0 < x`);
2142     MATCH_MP_TAC Ocbicby.scs_lb_2;
2143     TYPIFY `s` EXISTS_TAC;
2144     ASM_REWRITE_TAC[];
2145     GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT THEN NUM_REDUCE_TAC;
2146     BY(FIRST_X_ASSUM MP_TAC THEN REWRITE_TAC[arith `i < 2 <=> i = 0 \/ i = 1`] THEN DISCH_TAC THEN REPEAT (FIRST_X_ASSUM DISJ_CASES_TAC) THEN ASM_REWRITE_TAC[] THEN NUM_REDUCE_TAC);
2147   REPEAT WEAKER_STRIP_TAC;
2148   COMMENT "root";
2149   TYPIFY `?t. abs t < e7 /\ y4' = dist(v p,v(p+1)) + t` (C SUBGOAL_THEN MP_TAC);
2150     TYPIFY `y4' - dist(v p,v(p+1))` EXISTS_TAC;
2151     CONJ2_TAC;
2152       BY(REAL_ARITH_TAC);
2153     BY(REPLICATE_TAC 2 (POP_ASSUM MP_TAC) THEN REWRITE_TAC[IN_REAL_INTERVAL] THEN REAL_ARITH_TAC);
2154   REPEAT WEAKER_STRIP_TAC;
2155   FIRST_X_ASSUM_ST `taum` MP_TAC;
2156   ASM_REWRITE_TAC[];
2157   REWRITE_TAC[arith `~(x < y) <=> (y <= x)`];
2158   FIRST_X_ASSUM_ST `norm (f (v p) t) = norm (v p)` (C INTRO_TAC [`t`]);
2159   ANTS_TAC;
2160     BY(REPEAT (FIRST_X_ASSUM MATCH_MP_TAC) THEN ASM_REWRITE_TAC[]);
2161   (REWRITE_TAC[DIST_SYM;arith `d + &0 = d`] THEN REPEAT WEAKER_STRIP_TAC THEN ASM_REWRITE_TAC[]);
2162   COMMENT "back to root, next tau";
2163   TYPIFY `sum {i | i < 4} (\i. rho_fun (norm (v i)) * azim (vec 0) (v i) (v (i + 1)) (v (i + 4 - 1))) <=    sum {i | i < 4} (\i. rho_fun (norm (f (v i) t)) * azim (vec 0) (f (v i) t) (f(v(i+1)) t) (f (v (i + 4 - 1)) t))` (C SUBGOAL_THEN ASSUME_TAC);
2164     REPEAT WEAKER_STRIP_TAC;
2165     MATCH_MP_TAC Cuxvzoz.MMs_minimize_tau_fun;
2166     TYPIFY `s` EXISTS_TAC;
2167     ASM_REWRITE_TAC[arith `3 < 4`];
2168     FIRST_X_ASSUM MATCH_MP_TAC;
2169     BY(FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]);
2170   POP_ASSUM MP_TAC;
2171   TYPIFY `{i | i < 4} = 0..(4-1)` (C SUBGOAL_THEN SUBST1_TAC);
2172     BY(REWRITE_TAC[EXTENSION;IN_ELIM_THM;IN_NUMSEG] THEN ARITH_TAC);
2173   REPEAT ( GMATCH_SIMP_TAC (GSYM Oxl_def.periodic_sum));
2174   TYPIFY `p` EXISTS_TAC;
2175   CONJ_TAC;
2176     NUM_REDUCE_TAC;
2177     FIRST_ASSUM_ST `periodic` MP_TAC THEN REWRITE_TAC[Oxl_def.periodic];
2178     REWRITE_TAC[arith `(i+4)+k = (i+k)+4`];
2179     BY(DISCH_THEN (unlist REWRITE_TAC));
2180   TYPIFY `p` EXISTS_TAC;
2181   CONJ_TAC;
2182     NUM_REDUCE_TAC;
2183     FIRST_ASSUM_ST `periodic` MP_TAC THEN REWRITE_TAC[Oxl_def.periodic];
2184     REWRITE_TAC[arith `(i+4)+k = (i+k)+4`];
2185     BY(DISCH_THEN (unlist REWRITE_TAC));
2186   NUM_REDUCE_TAC;
2187   REWRITE_TAC[arith `3+p = SUC(SUC(SUC p))`;SUM_CLAUSES_NUMSEG;SUM_SING_NUMSEG;arith `p <= SUC p /\ p <= SUC (SUC p) /\ p <= SUC(SUC(SUC p))`];
2188   REWRITE_TAC[arith `SUC i = i+1`;arith `(i + j) + (k:num) = i+(j+k)`];
2189   NUM_REDUCE_TAC;
2190   ASM_REWRITE_TAC[];
2191   REPLICATE_TAC 7 (FIRST_X_ASSUM (C INTRO_TAC [`t`])) THEN ASM_REWRITE_TAC[] THEN REPEAT WEAKER_STRIP_TAC;
2192   REPEAT (FIRST_X_ASSUM (C INTRO_TAC [`t`])) THEN ASM_REWRITE_TAC[] THEN REPEAT WEAKER_STRIP_TAC;
2193   FIRST_X_ASSUM_ST `rho_fun` MP_TAC THEN ASM_REWRITE_TAC[Appendix.rho_rho_fun];
2194   TYPIFY `f (v(p+0)) t = v(p+0) /\ f (v (p+2)) t = v(p+2) /\ f(v (p+3)) t = v(p+3)` (C SUBGOAL_THEN MP_TAC);
2195     FIRST_X_ASSUM_ST `~(w = v p) ==> a` (REPEAT o GMATCH_SIMP_TAC);
2196     BY(ASM_REWRITE_TAC[] THEN REPEAT CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN NUM_REDUCE_TAC);
2197   REWRITE_TAC[arith `p + 0 = p`] THEN DISCH_TAC;
2198   POP_ASSUM (fun t -> ASM_TAC THEN unlist REWRITE_TAC t THEN REPEAT DISCH_TAC THEN ASSUME_TAC t);
2199   FIRST_X_ASSUM_ST `azim` MP_TAC;
2200   FIRST_X_ASSUM_ST `azim` MP_TAC THEN BURY_MP_TAC;
2201   FIRST_ASSUM_ST `azim` ((unlist REWRITE_TAC) o GSYM);
2202   FIRST_ASSUM_ST ` azim (vec 0) (v p) (f (v (p + 1)) t) (v (p + 3))` ((unlist REWRITE_TAC) o GSYM);
2203   REWRITE_TAC[arith `(a+b)+c = a + b + c`];
2204   FIRST_X_ASSUM_ST `SUC` MP_TAC THEN REWRITE_TAC[arith `SUC p = p+1`];
2205   DISCH_THEN (SUBST1_TAC );
2206   REWRITE_TAC[arith `r0 * (a012+a023) + r1 * (a120) + r2 * (a230+a201) + r3 * (a302)  <=  r0 * (f012+a023) + r1 * (f120) + r2 * (a230+f201) + r3 *(a302) <=> r0 * a012 + r1*a120 + r2* a201 <=  r0 * f012 + r1 * f120 + r2 * f201`];
2207   MATCH_MP_TAC (arith `a - (pi+sol0) = a' /\ b - (pi+sol0) = b' ==> (a <= b ==> a' <= b')`);
2208   REWRITE_TAC[arith `(a + b+c) - (pi + sol0) = a + b + c - (pi + sol0)`];
2209   CONJ_TAC;
2210     ONCE_REWRITE_TAC[arith `a + b + c - p = b + c + a - p`];
2211     GMATCH_SIMP_TAC (GSYM Cuxvzoz.tau3_azim);
2212     GMATCH_SIMP_TAC Cuxvzoz.tau3_taum_nonplanar;
2213     ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d}  = {a,d,b,c}`];
2214     ASM_REWRITE_TAC[];
2215     CONJ2_TAC;
2216       REWRITE_TAC[DIST_SYM];
2217       BY(MESON_TAC[Terminal.taum_sym]);
2218     FIRST_X_ASSUM_ST `a <= pi` kill;
2219     FIRST_X_ASSUM_ST `a <= pi` (C INTRO_TAC [`p+1`]);
2220     BY(REWRITE_TAC[arith `(p+1)+k = p + (1 +k)`] THEN NUM_REDUCE_TAC THEN ASM_REWRITE_TAC[]);
2221   FIRST_X_ASSUM_ST `norm a  = norm b` (SUBST1_TAC o GSYM);
2222   FIRST_X_ASSUM_ST `dist s + t` (SUBST1_TAC o GSYM);
2223   ONCE_REWRITE_TAC[arith `a + b + c - p = b + c + a - p`];
2224   GMATCH_SIMP_TAC (GSYM Cuxvzoz.tau3_azim);
2225   GMATCH_SIMP_TAC Cuxvzoz.tau3_taum_nonplanar;
2226   REWRITE_TAC[DIST_SYM];
2227   REWRITE_TAC[CONJ_ASSOC] THEN CONJ2_TAC;
2228     ASM_REWRITE_TAC[DIST_SYM];
2229     BY(MESON_TAC[Terminal.taum_sym]);
2230   ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,d,b,c}`];
2231   ASM_REWRITE_TAC[];
2232   BY(FIRST_X_ASSUM_ST `azim (vec 0) (f (v (p+1)) t) (v (p + 2)) (v (p)) < pi` MP_TAC THEN REAL_ARITH_TAC)
2233   ]);;
2234   (* }}} *)
2235
2236 let JOTSWIX = prove_by_refinement(
2237   `main_nonlinear_terminal_v11 ==> 
2238   (!s FF v p.
2239   IMAGE (\i. (v i,v (SUC i))) (:num) = FF /\
2240   is_scs_v39 s /\
2241   scs_k_v39 s = 4 /\
2242   MMs_v39 s v /\
2243   scs_basic_v39 s /\
2244   scs_generic v /\
2245   scs_a_v39 s p (p+1) < cstab /\
2246   (!i j. scs_diag 4 i j ==> scs_a_v39 s i j <= cstab /\ cstab < dist(v i,v j) /\ &4 * h0 < scs_b_v39 s i j) /\
2247   (!i. ~(i MOD 4 = (p+2) MOD 4) ==> interior_angle1 (vec 0) FF (v i) < pi) /\
2248   (xrr (norm (v (p+3))) (norm (v (p+1))) (dist(v (p+3),v(p+1))) <= #15.53)
2249   ==> (dist(v p,v(p+1)) < cstab \/ dist(v p,v(p+3)) < cstab))`,
2250   (* {{{ proof *)
2251   [
2252   REPEAT WEAKER_STRIP_TAC;
2253   MATCH_MP_TAC (arith `~((cstab <= d) /\ (cstab <= d')) ==> (d < cstab \/ d' < cstab)`);
2254   REPEAT WEAKER_STRIP_TAC;
2255   TYPIFY `BBprime2_v39 s v` (C SUBGOAL_THEN ASSUME_TAC);
2256     BY(ASM_MESON_TAC[Appendix.scs_basic;Ayqjtmd.unadorned_MMs]);
2257   TYPIFY `BBprime_v39 s v` (C SUBGOAL_THEN ASSUME_TAC);
2258     BY(ASM_MESON_TAC[Appendix.BBprime2_v39]);
2259   TYPIFY `BBs_v39 s v` (C SUBGOAL_THEN ASSUME_TAC);
2260     BY(ASM_MESON_TAC[Appendix.BBprime_v39]);
2261   INTRO_TAC Appendix.BBs_v39 [`s`;`v`];
2262   ASM_REWRITE_TAC[LET_DEF;LET_END_DEF;Terminal.IMAGE_SUBSET_IN;IN_UNIV;arith `~(4 <= 3)`];
2263   REPEAT WEAKER_STRIP_TAC;
2264   TYPED_ABBREV_TAC `V = IMAGE v (:num)`;
2265   TYPED_ABBREV_TAC `E = IMAGE (\i. {v i, v (SUC i)}) (:num)`;
2266   TYPIFY `local_fan (V,E,FF)` (C SUBGOAL_THEN ASSUME_TAC);
2267     MATCH_MP_TAC Local_lemmas.CVX_LO_IMP_LO;
2268     BY(ASM_REWRITE_TAC[]);
2269   TYPIFY `!i. v i IN V` (C SUBGOAL_THEN ASSUME_TAC);
2270     REPEAT WEAKER_STRIP_TAC;
2271     EXPAND_TAC "V";
2272     REWRITE_TAC[IN_IMAGE;IN_UNIV];
2273     BY(MESON_TAC[]);
2274   INTRO_TAC Cuxvzoz.BBs_inj [`s`;`v`;`4`];
2275   ASM_REWRITE_TAC[];
2276   DISCH_TAC;
2277   TYPIFY `!i. interior_angle1 (vec 0) FF (v i) = azim (vec 0) (v i) (v (i+1)) (v (i+3))` (C SUBGOAL_THEN ASSUME_TAC);
2278     GEN_TAC;
2279     EXPAND_TAC "FF";
2280     GMATCH_SIMP_TAC (REWRITE_RULE[LET_THM] (GSYM Ocbicby.INTERIOR_ANGLE1_AZIM));
2281     TYPIFY `s` EXISTS_TAC;
2282     BY(ASM_REWRITE_TAC[IN;arith `4 - 1 = 3`;arith `3 < 4`;arith `SUC i = i+1`]);
2283   INTRO_TAC Ocbicby.LOCAL_FAN_AZIM_POS [`s`;`v`];
2284   ASM_REWRITE_TAC[LET_THM;IN;arith `4-1 = 3`;arith `SUC i = i+1`];
2285   DISCH_TAC;
2286   TYPIFY `!i. v (i MOD 4) = v i` (C SUBGOAL_THEN ASSUME_TAC);
2287     GEN_TAC;
2288     MATCH_MP_TAC (GSYM Oxl_def.periodic_mod);
2289     BY(ASM_REWRITE_TAC[arith `~(0=4)`]);
2290   TYPIFY `v 4 = v 0 /\ v 5 = v 1 /\ v 6 = v 2 /\ v 7 = v 3 /\ v 8  = v 4` (C SUBGOAL_THEN ASSUME_TAC);
2291     FIRST_X_ASSUM ((unlist ONCE_REWRITE_TAC) o GSYM);
2292     BY(REWRITE_TAC[Terminal.MOD_4_EXPLICIT;arith `7 = 1*4 + 3`;arith `8 = 2*4 + 0`;MOD_MULT_ADD]);
2293   TYPIFY `generic V E` (C SUBGOAL_THEN ASSUME_TAC);
2294     BY(FIRST_X_ASSUM_ST `scs_generic` MP_TAC THEN ASM_REWRITE_TAC[Appendix.scs_generic]);
2295   TYPIFY `v (p+4) = v p /\ v (p+5) = v (p+1) /\ v (p+6) = v (p+2) /\ v (p+7) = v (p+3) /\ v (p+8)  = v (p)` (C SUBGOAL_THEN ASSUME_TAC);
2296     FIRST_X_ASSUM_ST `MOD` ((unlist ONCE_REWRITE_TAC) o GSYM);
2297     BY(REWRITE_TAC[arith `p+4 = 1*4 + p /\ p+5 = 1*4+(p+1) /\ p+6=1*4+(p+2) /\ p+7 = 1*4 + (p+3) /\ p+8 = 2*4 + p`;MOD_MULT_ADD]);
2298   INTRO_TAC Terminal.vv_split_azim_generic [`v`;`4`;`p+3`;`2`;`3`];
2299   REWRITE_TAC[arith `SUC (x+k) = (x+k)+1`;arith `((p:num)+i)+j = p+(i+j)`];
2300   NUM_REDUCE_TAC;
2301   ASM_REWRITE_TAC[LET_THM];
2302   DISCH_TAC;
2303   INTRO_TAC Terminal.vv_split_azim_generic [`v`;`4`;`p+1`;`2`;`3`];
2304   REWRITE_TAC[arith `SUC (x+k) = (x+k)+1`;arith `((p:num)+i)+j = p+(i+j)`];
2305   NUM_REDUCE_TAC;
2306   ASM_REWRITE_TAC[LET_THM];
2307   DISCH_TAC;
2308   COMMENT "collinearity";
2309   TYPIFY `!i j. ~(v i = v j) ==> ~collinear {vec 0,v i, v j}` (C SUBGOAL_THEN ASSUME_TAC);
2310     REPEAT GEN_TAC THEN DISCH_TAC;
2311     MATCH_MP_TAC Zlzthic.PROPERTIES_GENERIC_LOCAL_FAN_ALT;
2312     GEXISTL_TAC [`V`;`E`;`FF`];
2313     BY(ASM_REWRITE_TAC[IN_IMAGE;IN_UNIV]);
2314   TYPIFY `!i j. i < 4 /\ j < 4 /\ ~(i = j) ==> ~(v i = v j)` (C SUBGOAL_THEN ASSUME_TAC);
2315     BY(REPLICATE_TAC 10 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[]);
2316   INTRO_TAC PERIODIC_INJ_MOD [`v`;`4`];
2317   ASM_REWRITE_TAC[arith `~(4 = 0)`];
2318   DISCH_TAC;
2319   TYPIFY `azim (vec 0) (v p) (v (p+1)) (v (p+3)) < pi` (C SUBGOAL_THEN ASSUME_TAC);
2320     FIRST_X_ASSUM_ST `interior_angle1` ((unlist REWRITE_TAC) o GSYM);
2321     FIRST_X_ASSUM MATCH_MP_TAC;
2322     GEN_REWRITE_TAC(RAND_CONV o LAND_CONV o LAND_CONV o ONCE_DEPTH_CONV)[arith`p = p+0`];
2323     GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
2324     BY(NUM_REDUCE_TAC);
2325   TYPIFY `~coplanar {vec 0,v p,v (p+1),v (p+3)}` (C SUBGOAL_THEN ASSUME_TAC);
2326     REWRITE_TAC[GSYM Local_lemmas1.AZIM_COND_FOR_COPLANAR];
2327     MATCH_MP_TAC (arith `&0 < x /\ x < pi ==> ~ ((x = &0) \/ (x = pi))`);
2328     BY(ASM_REWRITE_TAC[]);
2329   TYPIFY `!i a b. a < 4 /\ b < 4 /\ ~(a = b) ==> ~collinear {vec 0,v(i+a),v(i+b)}` (C SUBGOAL_THEN ASSUME_TAC);
2330     REPEAT WEAKER_STRIP_TAC;
2331     FIRST_X_ASSUM MP_TAC THEN REWRITE_TAC[];
2332     FIRST_X_ASSUM_ST `v (i MOD 4) = v i` ((unlist ONCE_REWRITE_TAC) o GSYM);
2333     REPEAT (FIRST_X_ASSUM MATCH_MP_TAC);
2334     nCONJ_TAC 2;
2335       GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
2336       NUM_REDUCE_TAC;
2337       BY(REPLICATE_TAC 3 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[DIVISION;MOD_LT;arith `~(4=0)`]);
2338     ASM_REWRITE_TAC[];
2339     BY(MESON_TAC[DIVISION;arith `~(4=0)`]);
2340   COMMENT "introduce deformation";
2341   INTRO_TAC Cuxvzoz.deform_simplex_edge_exists [`V`;`(\ (t:real). &0)`;`(\(t:real). -- abs t)`;`v (p +3)`;`v p`;`v (p +1)`;`&1`];
2342   ASM_REWRITE_TAC[];
2343   REPEAT WEAKER_STRIP_TAC;
2344   FIRST_X_ASSUM MP_TAC;
2345   ANTS_TAC;
2346     REWRITE_TAC[arith `&0 < &1`];
2347     SUBCONJ_TAC;
2348       ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d}={a,c,d,b}`];
2349       BY(ASM_REWRITE_TAC[]);
2350     DISCH_TAC;
2351     CONJ_TAC;
2352       INTRO_TAC Planarity.cross_dot_fully_surrounded_fan [`(vec 0):real^3`;`v p`;`v (p+3)`;`v(p+1)`];
2353       ASM_REWRITE_TAC[];
2354       ANTS_TAC;
2355         INTRO_TAC Planarity.notcoplanar_imp_notcollinear_fan [`(vec 0):real^3`;`v p`;`v (p+1)`;`v(p+3)`];
2356         BY(REPLICATE_TAC 3 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[]);
2357       MATCH_MP_TAC (arith `x = y ==> (&0 < x ==> y > &0)`);
2358       BY(VEC3_TAC);
2359     REPEAT ( GMATCH_SIMP_TAC REAL_CONTINUOUS_ON_EQ_REAL_CONTINUOUS_AT);
2360     REWRITE_TAC[Ocbicby.REAL_OPEN_REAL_INTERVAL];
2361     (REWRITE_TAC[REAL_CONTINUOUS_CONST;REAL_CONTINUOUS_AT_ID;arith `-- abs(&0) = &0`]);
2362     REPEAT WEAKER_STRIP_TAC;
2363     MATCH_MP_TAC REAL_CONTINUOUS_NEG;
2364     BY(REWRITE_TAC[Cuxvzoz.real_continuous_abs]);
2365   REPEAT WEAKER_STRIP_TAC;
2366   COMMENT "A";
2367   TYPIFY `!i. dist (v i,v (i+1)) <= cstab` (C SUBGOAL_THEN ASSUME_TAC);
2368     GEN_TAC;
2369     MATCH_MP_TAC REAL_LE_TRANS;
2370     TYPIFY `scs_b_v39 s i (i+1)` EXISTS_TAC;
2371     CONJ_TAC;
2372       BY(ASM_MESON_TAC[]);
2373     FIRST_X_ASSUM_ST `is_scs_v39` MP_TAC THEN REWRITE_TAC[Appendix.is_scs_v39;LET_THM] THEN REPEAT WEAKER_STRIP_TAC;
2374     FIRST_X_ASSUM_ST `scs_b_v39 s i j <= cstab` (C INTRO_TAC [`i`]);
2375     BY(ASM_REWRITE_TAC[arith `3 < 4`;arith `SUC i =  i+1`]);
2376   TYPIFY `(!i t. abs t < e' ==> norm (f (v i) t) = norm (v i))` (C SUBGOAL_THEN ASSUME_TAC);
2377     REPEAT WEAKER_STRIP_TAC;
2378     TYPIFY `v i = v p` ASM_CASES_TAC;
2379       ASM_REWRITE_TAC[];
2380       FIRST_X_ASSUM_ST `norm` (C INTRO_TAC [`t`]);
2381       BY(ASM_REWRITE_TAC[] THEN MESON_TAC[]);
2382     FIRST_X_ASSUM GMATCH_SIMP_TAC;
2383     BY(ASM_REWRITE_TAC[]);
2384   TYPIFY `!i. 0 < i /\ i < 4 ==> ~(v (p + i) = v p)` (C SUBGOAL_THEN ASSUME_TAC);
2385     REPEAT WEAKER_STRIP_TAC;
2386     FIRST_X_ASSUM MP_TAC;
2387     ASM_REWRITE_TAC[];
2388     GEN_REWRITE_TAC (RAND_CONV o RAND_CONV o LAND_CONV o ONCE_DEPTH_CONV) [arith `p = p+0`];
2389     GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
2390     NUM_REDUCE_TAC;
2391     BY(REPLICATE_TAC 2 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[DIVISION;MOD_LT;arith `~(4=0)`;arith `0 < i ==> ~(i=0)`]);
2392   TYPIFY `!i j (k:num). v i = v j ==> v (i+k) = v (j+k)` (C SUBGOAL_THEN ASSUME_TAC);
2393     ASM_REWRITE_TAC[];
2394     REPEAT WEAKER_STRIP_TAC;
2395     ONCE_REWRITE_TAC[arith `(i:num) + k = k + i`];
2396     GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
2397     BY(ASM_REWRITE_TAC[arith `~(4 = 0)`]);
2398   TYPIFY `!t. azim (vec 0) (f (v (p+2)) t) (f (v (p+3)) t) (f (v (p+1)) t) = azim(vec 0) (v(p+2)) (v(p+3)) (v(p+1))` (C SUBGOAL_THEN ASSUME_TAC);
2399     GEN_TAC;
2400     FIRST_X_ASSUM_ST `~(w = v p) ==> a` (REPEAT o GMATCH_SIMP_TAC);
2401     BY(REPEAT CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN NUM_REDUCE_TAC);
2402   TYPIFY `!i. azim (vec 0) (v i) (v (i+1)) (v (i+3)) <= pi` (C SUBGOAL_THEN ASSUME_TAC);
2403     GEN_TAC;
2404     FIRST_X_ASSUM_ST `interior_angle1` ((unlist REWRITE_TAC) o GSYM);
2405     MATCH_MP_TAC Local_lemmas.CONVEX_LOFA_IMP_INANGLE_LE_PI;
2406     BY(ASM_REWRITE_TAC[]);
2407   TYPIFY `(!i. ?e0. &0 < e0 /\           (azim (vec 0) (v i) (v (i + 1)) (v (i + 3)) = pi            ==> (!t. abs t < e0                     ==> azim (vec 0) (f (v i) t) (f (v (i + 1)) t)                         (f (v (i + 3)) t) <=                         pi)))` (C SUBGOAL_THEN ASSUME_TAC);
2408     GEN_TAC;
2409     TYPIFY `v i = v (p+2)` ASM_CASES_TAC;
2410       FIRST_ASSUM (fun t -> FIRST_X_ASSUM (ASSUME_TAC o (C MATCH_MP t)));
2411       TYPIFY `&1` EXISTS_TAC;
2412       ASM_REWRITE_TAC[arith `&0 < &1`;arith `(p+2)+k = p + (2+k)`];
2413       NUM_REDUCE_TAC THEN ASM_REWRITE_TAC[];
2414       BY(REAL_ARITH_TAC);
2415     TYPIFY `azim (vec 0) (v i) (v (i + 1)) (v (i + 3)) < pi` ENOUGH_TO_SHOW_TAC;
2416       BY(MESON_TAC[arith `x < pi ==> ~(x = pi)`;arith `&0 < &1`]);
2417     BY(ASM_MESON_TAC[]);
2418   (COMMENT "deformation in BBs");
2419   INTRO_TAC Cuxvzoz.deformation_BBs_ALT [`s`;`4`;`f`;`v`;`e'`];
2420   ANTS_TAC;
2421     NUM_REDUCE_TAC;
2422     ASM_REWRITE_TAC[];
2423     MATCH_MP_TAC ab4_assumption_reduction2;
2424     GEXISTL_TAC [`p`;`e'`];
2425     ASM_REWRITE_TAC[];
2426     CONJ_TAC;
2427       REPEAT WEAKER_STRIP_TAC;
2428       FIRST_X_ASSUM_ST `scs_diag` (C INTRO_TAC [`i`;`j`]);
2429       BY(ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC);
2430     REWRITE_TAC[CONJ_ASSOC] THEN CONJ2_TAC;
2431       TYPIFY `e'` EXISTS_TAC;
2432       ASM_REWRITE_TAC[] THEN REPEAT WEAKER_STRIP_TAC;
2433       (FIRST_X_ASSUM_ST `norm` (C INTRO_TAC [`t`]));
2434       TYPIFY `dist (v p,v (p+1)) <= scs_b_v39 s p (p+1)` ENOUGH_TO_SHOW_TAC;
2435         BY(POP_ASSUM (unlist REWRITE_TAC) THEN REWRITE_TAC[DIST_SYM] THEN REAL_ARITH_TAC);
2436       BY(ASM_REWRITE_TAC[]);
2437     CONJ_TAC;
2438       REPEAT WEAKER_STRIP_TAC;
2439       (FIRST_X_ASSUM_ST `norm` (C INTRO_TAC [`t`]));
2440       BY(ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC);
2441     MATCH_MP_TAC REAL_LTE_TRANS;
2442     TYPIFY `cstab` EXISTS_TAC;
2443     BY(ASM_REWRITE_TAC[]);
2444   (REPEAT WEAKER_STRIP_TAC);
2445   (COMMENT "azim sums");
2446   INTRO_TAC deform_azim_sum [`v (p+3)`;`v p`;`v (p+1)`;`v(p+2)`;`f`;`e'`];
2447   ANTS_TAC;
2448     REPEAT (FIRST_X_ASSUM_ST `c = a + b` MP_TAC) THEN ASM_REWRITE_TAC[];
2449     REPLICATE_TAC 3 DISCH_TAC;
2450     CONJ_TAC;
2451       MATCH_MP_TAC Zlzthic.deformation_subset;
2452       (TYPIFY `V` EXISTS_TAC THEN ASM_REWRITE_TAC[SUBSET;IN_INSERT;NOT_IN_EMPTY]);
2453       BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
2454     TYPIFY `~collinear {vec 0, v (p + 3), v (p+0)} /\ ~collinear {vec 0, v (p + 3), v (p + 1)} /\ ~collinear {vec 0, v (p + 3), v (p + 2)}` (C SUBGOAL_THEN MP_TAC);
2455       BY(REPEAT CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN NUM_REDUCE_TAC);
2456     REWRITE_TAC[arith `p+0=p`] THEN DISCH_THEN (unlist REWRITE_TAC);
2457     nCONJ_TAC 2;
2458       BY(ASM_REWRITE_TAC[]);
2459     FIRST_X_ASSUM (SUBST1_TAC) THEN REWRITE_TAC[];
2460     REPLICATE_TAC 4 (FIRST_X_ASSUM kill);
2461     ASM_REWRITE_TAC[];
2462     TYPIFY_GOAL_THEN `&0 < azim (vec 0) (v (p + 3)) (v p) (v (p + 2)) /\ azim (vec 0) (v (p + 3)) (v p) (v (p + 2)) < pi` (unlist REWRITE_TAC);
2463       FIRST_X_ASSUM_ST `&0 < azim a b c d` (C INTRO_TAC [`p+3`]);
2464       TYPIFY `azim (vec 0) (v (p+3)) (v p) (v (p+2)) = azim (vec 0) (v (p + 3)) (v ((p + 3) + 1)) (v ((p + 3) + 3))` (C SUBGOAL_THEN ASSUME_TAC);
2465         BY(REWRITE_TAC[arith `((p:num) + i) + j = p + i+j`] THEN NUM_REDUCE_TAC THEN ASM_REWRITE_TAC[]);
2466       ASM_REWRITE_TAC[];
2467       DISCH_THEN (unlist REWRITE_TAC);
2468       FIRST_X_ASSUM_ST `interior_angle1` ((unlist REWRITE_TAC) o GSYM);
2469       ASM_REWRITE_TAC[];
2470       FIRST_X_ASSUM MATCH_MP_TAC;
2471       GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
2472       BY(NUM_REDUCE_TAC);
2473     DISJ2_TAC;
2474     CONJ_TAC;
2475       GEN_TAC;
2476       FIRST_X_ASSUM_ST `~(w = v p) ==> a` (REPEAT o GMATCH_SIMP_TAC);
2477       ASM_REWRITE_TAC[];
2478       BY(REPEAT CONJ_TAC THEN GEN_REWRITE_TAC (RAND_CONV o RAND_CONV o LAND_CONV o ONCE_DEPTH_CONV) [arith `p = p+0`] THEN GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT THEN NUM_REDUCE_TAC);
2479     REWRITE_TAC[Zlzthic.azim_lt_pi_cross];
2480     TYPIFY `(v (p + 3) cross v p) dot v (p + 1) = (v (p) cross (v (p+1))) dot v (p + 3)` (C SUBGOAL_THEN SUBST1_TAC);
2481       BY(VEC3_TAC);
2482     REWRITE_TAC[GSYM Zlzthic.azim_lt_pi_cross];
2483     BY(ASM_REWRITE_TAC[]);
2484   (REPEAT WEAKER_STRIP_TAC);
2485   COMMENT "second azim sum";
2486   INTRO_TAC deform_azim_sum [`v (p+1)`;`v (p+2)`;`v (p+3)`;`v(p)`;`f`;`e'`];
2487   ANTS_TAC;
2488     REPEAT (FIRST_X_ASSUM_ST `c = a + b` MP_TAC) THEN ASM_REWRITE_TAC[];
2489     REPLICATE_TAC 3 DISCH_TAC;
2490     CONJ_TAC;
2491       MATCH_MP_TAC Zlzthic.deformation_subset;
2492       (TYPIFY `V` EXISTS_TAC THEN ASM_REWRITE_TAC[SUBSET;IN_INSERT;NOT_IN_EMPTY]);
2493       BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
2494     TYPIFY `~collinear {vec 0, v (p + 1), v (p + 2)} /\ ~collinear {vec 0, v (p + 1), v (p + 3)} /\ ~collinear {vec 0, v (p + 1), v (p + 0)}` (C SUBGOAL_THEN MP_TAC);
2495       BY(REPEAT CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN NUM_REDUCE_TAC);
2496     REWRITE_TAC[arith `p+0=p`] THEN DISCH_THEN (unlist REWRITE_TAC);
2497     nCONJ_TAC 2;
2498       BY(ASM_REWRITE_TAC[]);
2499     FIRST_X_ASSUM (SUBST1_TAC) THEN REWRITE_TAC[];
2500     REPLICATE_TAC 4 (FIRST_X_ASSUM kill);
2501     ASM_REWRITE_TAC[];
2502     TYPIFY_GOAL_THEN `&0 < azim (vec 0) (v (p + 1)) (v (p + 2)) (v p) /\ azim (vec 0) (v (p + 1)) (v (p + 2)) (v p) < pi` (unlist REWRITE_TAC);
2503       FIRST_X_ASSUM_ST `&0 < azim a b c d` (C INTRO_TAC [`p+1`]);
2504       TYPIFY `azim (vec 0) (v (p+1)) (v (p+2)) (v (p)) = azim (vec 0) (v (p + 1)) (v ((p + 1) + 1)) (v ((p + 1) + 3))` (C SUBGOAL_THEN ASSUME_TAC);
2505         BY(REWRITE_TAC[arith `((p:num) + i) + j = p + i+j`] THEN NUM_REDUCE_TAC THEN ASM_REWRITE_TAC[]);
2506       ASM_REWRITE_TAC[];
2507       DISCH_THEN (unlist REWRITE_TAC);
2508       FIRST_X_ASSUM_ST `interior_angle1` ((unlist REWRITE_TAC) o GSYM);
2509       ASM_REWRITE_TAC[];
2510       FIRST_X_ASSUM MATCH_MP_TAC;
2511       GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
2512       BY(NUM_REDUCE_TAC);
2513     DISJ1_TAC;
2514     CONJ_TAC;
2515       GEN_TAC;
2516       FIRST_X_ASSUM_ST `~(w = v p) ==> a` (REPEAT o GMATCH_SIMP_TAC);
2517       ASM_REWRITE_TAC[];
2518       BY(REPEAT CONJ_TAC THEN GEN_REWRITE_TAC (RAND_CONV o RAND_CONV o LAND_CONV o ONCE_DEPTH_CONV) [arith `p = p+0`] THEN GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT THEN NUM_REDUCE_TAC);
2519     REWRITE_TAC[Zlzthic.azim_lt_pi_cross];
2520     TYPIFY `(v (p + 1) cross v (p+3)) dot v (p) = (v (p) cross (v (p+1))) dot v (p + 3)` (C SUBGOAL_THEN SUBST1_TAC);
2521       BY(VEC3_TAC);
2522     REWRITE_TAC[GSYM Zlzthic.azim_lt_pi_cross];
2523     BY(ASM_REWRITE_TAC[]);
2524   (REPEAT WEAKER_STRIP_TAC);
2525   TYPIFY `?e3. &0 < e3 /\ (!t. abs t < e3 /\ t < &0 ==> dist(v p,v (p+1)) + t IN real_interval(scs_a_v39 s p (p+1),scs_b_v39 s p (p+1)))` (C SUBGOAL_THEN MP_TAC);
2526     TYPIFY `dist(v p,v(p+1)) - scs_a_v39 s p (p+1)` EXISTS_TAC;
2527     ASM_REWRITE_TAC[arith `&0 < &1`;arith `a - d < &0 <=> a < d`;arith `&0 < b - d <=> d < b`];
2528     SUBCONJ_TAC;
2529       MATCH_MP_TAC REAL_LTE_TRANS;
2530       TYPIFY `cstab` EXISTS_TAC;
2531       BY(ASM_REWRITE_TAC[]);
2532     DISCH_TAC;
2533     REPEAT WEAKER_STRIP_TAC;
2534     REWRITE_TAC[IN_REAL_INTERVAL];
2535     CONJ_TAC;
2536       BY(REPLICATE_TAC 3 (POP_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
2537     MATCH_MP_TAC (arith `t < &0 /\ d <= b ==> d + t < b`);
2538     BY(ASM_REWRITE_TAC[]);
2539   REPEAT WEAKER_STRIP_TAC;
2540   COMMENT "coplanar";
2541   INTRO_TAC Zlzthic.NONPLANAR_OPEN [`(\ (t:real). (vec 0):real^3)`;`f (v p)`;`\ (t:real). v (p+1)`;`\ (t:real). v (p+3)`;`&0`];
2542   ASM_REWRITE_TAC[CONTINUOUS_CONST];
2543   DISCH_THEN MP_TAC THEN ANTS_TAC;
2544     FIRST_X_ASSUM_ST `deformation` MP_TAC THEN REWRITE_TAC[Localization.deformation] THEN REPEAT WEAKER_STRIP_TAC;
2545     CONJ2_TAC;
2546       BY(FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]);
2547     POP_ASSUM GMATCH_SIMP_TAC;
2548     BY(ASM_REWRITE_TAC[]);
2549   REWRITE_TAC[arith `abs (&0 - t') = abs t'`] THEN REPEAT WEAKER_STRIP_TAC;
2550   INTRO_TAC Zlzthic.WNWSHJT [`v(p+3)`;`v p`;`v (p+1)`;`f`;`-- e'`;`e'`];
2551   ANTS_TAC;
2552     ASM_REWRITE_TAC[];
2553     CONJ_TAC;
2554       MATCH_MP_TAC Zlzthic.deformation_subset;
2555       (TYPIFY `V` EXISTS_TAC THEN ASM_REWRITE_TAC[SUBSET;IN_INSERT;NOT_IN_EMPTY]);
2556       BY(REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]);
2557     FIRST_X_ASSUM_ST `deformation` MP_TAC THEN REWRITE_TAC[Localization.deformation];
2558     REPEAT WEAKER_STRIP_TAC;
2559     FIRST_X_ASSUM (REPEAT o GMATCH_SIMP_TAC) THEN ASM_REWRITE_TAC[];
2560     TYPIFY `!i. ~(i=0) /\ i < 4 ==> ~collinear {vec 0,v (p+0),v(p+i)}` ENOUGH_TO_SHOW_TAC;
2561       BY(MESON_TAC[arith `p+0=p` ;arith `~(1=0) /\ 1 < 4 /\ ~(3=0) /\ 3 < 4`]);
2562     GEN_TAC THEN DISCH_TAC;
2563     FIRST_X_ASSUM MATCH_MP_TAC;
2564     BY(ASM_REWRITE_TAC[arith `0 < 4`]);
2565   REPEAT WEAKER_STRIP_TAC;
2566   INTRO_TAC Iunbuig.epsilon_hept [`e`;`e'`;`e''`;`e'''`;`e3`;`e1`;`e1'`] THEN ASM_REWRITE_TAC[] THEN REPEAT WEAKER_STRIP_TAC;
2567   FIRST_ASSUM_ST `!i. 0 < i /\ i < 4 ==> ~(v (p + i) = v p)` MP_TAC;
2568   FIRST_ASSUM_ST `i MOD 4 = j MOD 4` (unlist REWRITE_TAC);
2569   DISCH_TAC;
2570   COMMENT "introduce 684";
2571   INTRO_TAC (UNDISCH Ocbicby.LEMMA_6843920790) [`norm (v (p+3))`;`norm (v p)`;`norm (v (p+1))`;`dist(v p,v(p+1))`;`dist (v(p+1),v(p+3))`;`dist(v p,v (p+3))`];
2572   ANTS_TAC;
2573     ASM_REWRITE_TAC[];
2574     (COMMENT "684 ants");
2575     TYPIFY `!i. &2 <= norm (v i) /\ norm (v i) <= &2 * h0` (C SUBGOAL_THEN ASSUME_TAC);
2576       GEN_TAC;
2577       REWRITE_TAC[GSYM Fnjlbxs.in_ball_annulus];
2578       FIRST_X_ASSUM_ST `BBs_v39` kill THEN FIRST_X_ASSUM_ST `BBs_v39` MP_TAC THEN REWRITE_TAC[Appendix.BBs_v39;LET_THM] THEN EXPAND_TAC "V" THEN REPEAT WEAKER_STRIP_TAC;
2579       FIRST_X_ASSUM_ST `ball_annulus` MP_TAC;
2580       REWRITE_TAC[SUBSET;IN_IMAGE;IN_UNIV];
2581       BY(MESON_TAC[]);
2582     ASM_REWRITE_TAC[];
2583     REWRITE_TAC[CONJ_ASSOC] THEN CONJ2_TAC;
2584       FIRST_X_ASSUM_ST `coplanar` kill;
2585       FIRST_X_ASSUM_ST `coplanar` MP_TAC;
2586       ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d}= {a,d,b,c}`];
2587       BY(REWRITE_TAC[Oxlzlez.coplanar_delta_y;DIST_0;DIST_SYM]);
2588     ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REWRITE_TAC[];
2589     TYPIFY `!i j. &2 <= dist(v i,v j) /\ dist(v i,v j) <= cstab ==> xrr (norm (v i)) (norm (v j)) (dist (v i,v j)) <= #15.53` (C SUBGOAL_THEN ASSUME_TAC);
2590       REPEAT WEAKER_STRIP_TAC;
2591       TYPIFY `#15.53 = sqrt(#15.53) pow 2` (C SUBGOAL_THEN SUBST1_TAC);
2592         GMATCH_SIMP_TAC SQRT_POW_2;
2593         BY(REAL_ARITH_TAC);
2594       MATCH_MP_TAC Ocbicby.xrr_simple_upper_bound;
2595       ASM_REWRITE_TAC[];
2596       TYPIFY `&4 = sqrt(&16)` (C SUBGOAL_THEN SUBST1_TAC);
2597         REWRITE_TAC[arith `&16 = &4 pow 2`];
2598         REWRITE_TAC[POW_2_SQRT_ABS];
2599         BY(REAL_ARITH_TAC);
2600       GMATCH_SIMP_TAC SQRT_MONO_LT_EQ;
2601       TYPIFY_GOAL_THEN `&0 <=  #15.53 /\ &0 <= &16 /\  #15.53 < &16` (unlist REWRITE_TAC);
2602         BY(REAL_ARITH_TAC);
2603       MATCH_MP_TAC REAL_LE_TRANS;
2604       TYPIFY `cstab` EXISTS_TAC;
2605       ASM_REWRITE_TAC[];
2606       REWRITE_TAC[Sphere.cstab];
2607       MATCH_MP_TAC REAL_LE_RSQRT;
2608       BY(REAL_ARITH_TAC);
2609     FIRST_X_ASSUM ( GMATCH_SIMP_TAC);
2610     TYPIFY ` &2 <= dist(v p,v(p+1)) /\ dist(v p,v (p+3)) <= cstab /\ cstab <= dist(v p,v(p+3)) /\ dist(v p,v(p+1)) <= cstab /\ cstab <= dist (v (p+1),v(p+3))` ENOUGH_TO_SHOW_TAC;
2611       BY(REWRITE_TAC[Sphere.cstab;DIST_SYM] THEN REAL_ARITH_TAC);
2612     CONJ_TAC;
2613       MATCH_MP_TAC Ocbicby.scs_lb_2;
2614       TYPIFY `s` EXISTS_TAC;
2615       ASM_REWRITE_TAC[];
2616       ONCE_REWRITE_TAC[EQ_SYM_EQ];
2617       FIRST_X_ASSUM MATCH_MP_TAC;
2618       BY(NUM_REDUCE_TAC);
2619     ASM_REWRITE_TAC[];
2620     CONJ_TAC;
2621       MATCH_MP_TAC REAL_LE_TRANS;
2622       TYPIFY `scs_b_v39 s (p+3) (SUC (p+3))` EXISTS_TAC;
2623       CONJ2_TAC;
2624         FIRST_X_ASSUM_ST `is_scs_v39` MP_TAC THEN REWRITE_TAC[Appendix.is_scs_v39;LET_THM] THEN REPEAT WEAKER_STRIP_TAC;
2625         FIRST_X_ASSUM MATCH_MP_TAC;
2626         BY(ASM_REWRITE_TAC[] THEN NUM_REDUCE_TAC);
2627       ONCE_REWRITE_TAC[DIST_SYM];
2628       TYPIFY `v p = v (SUC (p+3))` ENOUGH_TO_SHOW_TAC;
2629         DISCH_THEN SUBST1_TAC;
2630         FIRST_X_ASSUM_ST `d <= scs_b_v39 s i j` MP_TAC;
2631         BY(MESON_TAC[]);
2632       BY(ASM_REWRITE_TAC[arith `SUC (p+3) = p+4`;Oxl_2012.MOD_ADD_CANCEL]);
2633     MATCH_MP_TAC (arith `c < d ==> c <= d`);
2634     FIRST_X_ASSUM_ST `cstab < d` (C INTRO_TAC [`p+1`;`p+3`]);
2635     ANTS_TAC;
2636       REWRITE_TAC[arith `p+3 = SUC(SUC (p+1))`];
2637       MATCH_MP_TAC Tfitskc.SCS_DIAG_2;
2638       BY(NUM_REDUCE_TAC);
2639     BY(DISCH_THEN (unlist REWRITE_TAC));
2640   REPEAT WEAKER_STRIP_TAC;
2641   TYPIFY `?e4. &0 < e4 /\ (!t. abs t < e4 ==> dist(v p,v (p+1)) + t IN real_interval(a,b))` (C SUBGOAL_THEN MP_TAC);
2642     INTRO_TAC Zlzthic.real_interval_contains_0_ball [`a-dist(v p,v (p+1))`;`b - dist(v p,v (p+1))`;`&1`];
2643     ASM_REWRITE_TAC[arith `&0 < &1`;arith `a - d < &0 <=> a < d`;arith `&0 < b - d <=> d < b`];
2644     ANTS_TAC;
2645       BY(FIRST_X_ASSUM_ST `dist s IN real_interval(a,b)` MP_TAC THEN REWRITE_TAC[IN_REAL_INTERVAL]);
2646     REPEAT WEAKER_STRIP_TAC;
2647     TYPIFY `e''''` EXISTS_TAC;
2648     ASM_REWRITE_TAC[] THEN REPEAT WEAKER_STRIP_TAC;
2649     FIRST_X_ASSUM (C INTRO_TAC [`t`]);
2650     ASM_REWRITE_TAC[IN_REAL_INTERVAL];
2651     BY(REAL_ARITH_TAC);
2652   REPEAT WEAKER_STRIP_TAC;
2653   INTRO_TAC Cuxvzoz.epsilon_pair [`e4`;`e7`] THEN ASM_REWRITE_TAC[] THEN REPEAT WEAKER_STRIP_TAC;
2654   TYPIFY `?t. abs t < e'''' /\ t < &0` (C SUBGOAL_THEN MP_TAC);
2655     TYPIFY `-- e'''' / &2` EXISTS_TAC;
2656     BY(REPLICATE_TAC 3 (POP_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
2657   REPEAT WEAKER_STRIP_TAC;
2658   REPLICATE_TAC 2 (FIRST_X_ASSUM (C INTRO_TAC [`t`])) THEN ASM_REWRITE_TAC[] THEN REPEAT WEAKER_STRIP_TAC;
2659   REPLICATE_TAC 7 (FIRST_X_ASSUM_ST `abs t < e ==> a` (C INTRO_TAC [`t`])) THEN ASM_REWRITE_TAC[] THEN REPEAT WEAKER_STRIP_TAC;
2660   FIRST_X_ASSUM (C INTRO_TAC [`dist(v p,v(p+1)) + t`;`dist(v p,v (p+1))`]);
2661   ANTS_TAC;
2662     ASM_REWRITE_TAC[];
2663     BY(FIRST_X_ASSUM_ST `t < &0` MP_TAC THEN REAL_ARITH_TAC);
2664   REWRITE_TAC[arith `~(x < y) <=> y <= x`];
2665   FIRST_X_ASSUM_ST `norm (f (v p) t) = norm (v p)` (C INTRO_TAC [`t`]);
2666   ANTS_TAC;
2667     BY(ASM_REWRITE_TAC[]);
2668   TYPIFY `!d. t < &0 ==> d + -- abs t = d + t` (C SUBGOAL_THEN MP_TAC);
2669     BY(REAL_ARITH_TAC);
2670   ASM_REWRITE_TAC[];
2671   DISCH_THEN (unlist REWRITE_TAC);
2672   (REWRITE_TAC[DIST_SYM;arith `d + &0 = d`] THEN REPEAT WEAKER_STRIP_TAC THEN ASM_REWRITE_TAC[]);
2673   (COMMENT "back to root, next tau");
2674   TYPIFY `sum {i | i < 4} (\i. rho_fun (norm (v i)) * azim (vec 0) (v i) (v (i + 1)) (v (i + 4 - 1))) <=    sum {i | i < 4} (\i. rho_fun (norm (f (v i) t)) * azim (vec 0) (f (v i) t) (f(v(i+1)) t) (f (v (i + 4 - 1)) t))` (C SUBGOAL_THEN ASSUME_TAC);
2675     REPEAT WEAKER_STRIP_TAC;
2676     MATCH_MP_TAC Cuxvzoz.MMs_minimize_tau_fun;
2677     TYPIFY `s` EXISTS_TAC;
2678     ASM_REWRITE_TAC[arith `3 < 4`];
2679     FIRST_X_ASSUM MATCH_MP_TAC;
2680     BY(ASM_REWRITE_TAC[]);
2681   POP_ASSUM MP_TAC;
2682   TYPIFY `{i | i < 4} = 0..(4-1)` (C SUBGOAL_THEN SUBST1_TAC);
2683     BY(REWRITE_TAC[EXTENSION;IN_ELIM_THM;IN_NUMSEG] THEN ARITH_TAC);
2684   REPEAT ( GMATCH_SIMP_TAC (GSYM Oxl_def.periodic_sum));
2685   TYPIFY `p` EXISTS_TAC;
2686   CONJ_TAC;
2687     NUM_REDUCE_TAC;
2688     FIRST_ASSUM_ST `periodic` MP_TAC THEN REWRITE_TAC[Oxl_def.periodic];
2689     REWRITE_TAC[arith `(i+4)+k = (i+k)+4`];
2690     BY(DISCH_THEN (unlist REWRITE_TAC));
2691   TYPIFY `p` EXISTS_TAC;
2692   CONJ_TAC;
2693     NUM_REDUCE_TAC;
2694     FIRST_ASSUM_ST `periodic` MP_TAC THEN REWRITE_TAC[Oxl_def.periodic];
2695     REWRITE_TAC[arith `(i+4)+k = (i+k)+4`];
2696     BY(DISCH_THEN (unlist REWRITE_TAC));
2697   NUM_REDUCE_TAC;
2698   REWRITE_TAC[arith `3+p = SUC(SUC(SUC p))`;SUM_CLAUSES_NUMSEG;SUM_SING_NUMSEG;arith `p <= SUC p /\ p <= SUC (SUC p) /\ p <= SUC(SUC(SUC p))`];
2699   REWRITE_TAC[arith `SUC i = i+1`;arith `(i + j) + (k:num) = i+(j+k)`];
2700   NUM_REDUCE_TAC;
2701   ASM_REWRITE_TAC[];
2702   REPEAT (FIRST_X_ASSUM (C INTRO_TAC [`t`])) THEN ASM_REWRITE_TAC[] THEN REPEAT WEAKER_STRIP_TAC;
2703   FIRST_X_ASSUM_ST `rho_fun` MP_TAC THEN ASM_REWRITE_TAC[Appendix.rho_rho_fun];
2704   TYPIFY `f (v(p+1)) t = v(p+1) /\ f (v (p+2)) t = v(p+2) /\ f(v (p+3)) t = v(p+3)` (C SUBGOAL_THEN ASSUME_TAC);
2705     FIRST_X_ASSUM_ST `~(w = v p) ==> a` (REPEAT o GMATCH_SIMP_TAC);
2706     BY(ASM_REWRITE_TAC[] THEN REPEAT CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN NUM_REDUCE_TAC);
2707   POP_ASSUM (fun t -> ASM_TAC THEN unlist REWRITE_TAC t THEN REPEAT DISCH_TAC THEN ASSUME_TAC t);
2708   FIRST_X_ASSUM_ST `azim` MP_TAC;
2709   FIRST_X_ASSUM_ST `azim` MP_TAC THEN BURY_MP_TAC;
2710   FIRST_ASSUM_ST `azim` ((unlist REWRITE_TAC) o GSYM);
2711   FIRST_ASSUM_ST `azim (vec 0) (v (p + 3)) (f (v p) t) (v (p + 2))` ((unlist REWRITE_TAC) o GSYM);
2712   REWRITE_TAC[arith `(a+b)+c = a + b + c`];
2713   REWRITE_TAC[arith `r0 * (a013) + r1 * (a123 + a130) + r2 * a231 + r3 * (a301+a312)  <=  r0 * (f013) + r1 * (a123 + f130) + r2 * a231 + r3 *(f301 +a312) <=> r0 * a013 + r1*a130 + r3* a301 <=  r0 * f013 + r1 * f130 + r3 * f301`];
2714   MATCH_MP_TAC (arith `a - (pi+sol0) = a' /\ b - (pi+sol0) = b' ==> (a <= b ==> a' <= b')`);
2715   REWRITE_TAC[arith `(a + b+c) - (pi + sol0) = a + b + c - (pi + sol0)`];
2716   CONJ_TAC;
2717     GMATCH_SIMP_TAC (GSYM Cuxvzoz.tau3_azim);
2718     GMATCH_SIMP_TAC Cuxvzoz.tau3_taum_nonplanar;
2719     ASM_REWRITE_TAC[];
2720     REWRITE_TAC[DIST_SYM];
2721     BY(MESON_TAC[Terminal.taum_sym]);
2722   FIRST_X_ASSUM_ST `norm a  = norm b` (SUBST1_TAC o GSYM);
2723   FIRST_X_ASSUM_ST `dist s + t` (SUBST1_TAC o GSYM);
2724   GMATCH_SIMP_TAC (GSYM Cuxvzoz.tau3_azim);
2725   GMATCH_SIMP_TAC Cuxvzoz.tau3_taum_nonplanar;
2726   REWRITE_TAC[DIST_SYM];
2727   REWRITE_TAC[CONJ_ASSOC] THEN CONJ2_TAC;
2728     ASM_REWRITE_TAC[DIST_SYM];
2729     BY(MESON_TAC[Terminal.taum_sym]);
2730   ASM_REWRITE_TAC[];
2731   CONJ_TAC;
2732     FIRST_X_ASSUM MATCH_MP_TAC;
2733     BY(ASM_REWRITE_TAC[]);
2734   BY(FIRST_X_ASSUM_ST `azim (vec 0) (f (v p) t) (v (p + 1)) (v (p + 3)) < pi` MP_TAC THEN REAL_ARITH_TAC)
2735   ]);;
2736   (* }}} *)
2737
2738 let LEMMA_PWE1 = prove_by_refinement(
2739 (* main_work4 ==> *) ` main_nonlinear_terminal_v11 ==> (!s v p.
2740     is_scs_v39 s /\ scs_basic_v39 s /\ scs_k_v39 s = 4 /\ v IN MMs_v39 s /\ 
2741     (!i j. scs_diag 4 i j ==> scs_a_v39 s i j <= cstab /\ cstab < dist(v i,v j) /\ &4*h0 < scs_b_v39 s i j) /\
2742     (!i. (scs_a_v39 s i (i+1) = &2 /\ scs_b_v39 s i (i+1)= &2*h0) \/
2743        (scs_a_v39 s i (i+1) = &2 * h0 /\ scs_b_v39 s i (i+1)= cstab)) /\
2744       scs_generic v /\
2745     ~scs_is_str s v (p+1) /\ ~scs_is_str s v (p+3) /\
2746     scs_is_str s v p /\ norm (v p) = &2 /\
2747     scs_a_v39 s p (p+1) = &2 /\
2748     scs_a_v39 s (p+3) (p) = &2 /\
2749     dist(v (p+1),v(p+2)) <= &2 * h0 ==>
2750     pi / &2 < dihV (vec 0) (v (p+1)) (v (p+2)) (v p))`,
2751   (* {{{ proof *)
2752   [
2753   REPEAT WEAKER_STRIP_TAC;
2754   REWRITE_TAC[arith `x < y <=> ~(y <= x)`] THEN DISCH_TAC;
2755   REPEAT WEAKER_STRIP_TAC;
2756   TYPIFY `BBprime2_v39 s v` (C SUBGOAL_THEN ASSUME_TAC);
2757     BY(ASM_MESON_TAC[Appendix.scs_basic;Ayqjtmd.unadorned_MMs;IN]);
2758   TYPIFY `BBprime_v39 s v` (C SUBGOAL_THEN ASSUME_TAC);
2759     BY(ASM_MESON_TAC[Appendix.BBprime2_v39]);
2760   TYPIFY `BBs_v39 s v` (C SUBGOAL_THEN ASSUME_TAC);
2761     BY(ASM_MESON_TAC[Appendix.BBprime_v39]);
2762   INTRO_TAC Appendix.BBs_v39 [`s`;`v`];
2763   ASM_REWRITE_TAC[LET_DEF;LET_END_DEF;Terminal.IMAGE_SUBSET_IN;IN_UNIV;arith `~(4 <= 3)`];
2764   REPEAT WEAKER_STRIP_TAC;
2765   TYPED_ABBREV_TAC `V = IMAGE v (:num)`;
2766   TYPED_ABBREV_TAC `E = IMAGE (\i. {v i, v (SUC i)}) (:num)`;
2767   TYPED_ABBREV_TAC `FF = IMAGE (\i. (v i,v (SUC i))) (:num)`;
2768   TYPIFY `local_fan (V,E,FF)` (C SUBGOAL_THEN ASSUME_TAC);
2769     MATCH_MP_TAC Local_lemmas.CVX_LO_IMP_LO;
2770     BY(ASM_REWRITE_TAC[]);
2771   TYPIFY `!i. v i IN V` (C SUBGOAL_THEN ASSUME_TAC);
2772     REPEAT WEAKER_STRIP_TAC;
2773     EXPAND_TAC "V";
2774     REWRITE_TAC[IN_IMAGE;IN_UNIV];
2775     BY(MESON_TAC[]);
2776   INTRO_TAC Cuxvzoz.BBs_inj [`s`;`v`;`4`];
2777   ASM_REWRITE_TAC[];
2778   DISCH_TAC;
2779   TYPIFY `!i. interior_angle1 (vec 0) FF (v i) = azim (vec 0) (v i) (v (i+1)) (v (i+3))` (C SUBGOAL_THEN ASSUME_TAC);
2780     GEN_TAC;
2781     EXPAND_TAC "FF";
2782     GMATCH_SIMP_TAC (REWRITE_RULE[LET_THM] (GSYM Ocbicby.INTERIOR_ANGLE1_AZIM));
2783     TYPIFY `s` EXISTS_TAC;
2784     BY(ASM_REWRITE_TAC[IN;arith `4 - 1 = 3`;arith `3 < 4`;arith `SUC i = i+1`]);
2785   INTRO_TAC Ocbicby.LOCAL_FAN_AZIM_POS [`s`;`v`];
2786   ASM_REWRITE_TAC[LET_THM;IN;arith `4-1 = 3`;arith `SUC i = i+1`];
2787   DISCH_TAC;
2788   TYPIFY `!i. v (i MOD 4) = v i` (C SUBGOAL_THEN ASSUME_TAC);
2789     GEN_TAC;
2790     MATCH_MP_TAC (GSYM Oxl_def.periodic_mod);
2791     BY(ASM_REWRITE_TAC[arith `~(0=4)`]);
2792   TYPIFY `v 4 = v 0 /\ v 5 = v 1 /\ v 6 = v 2 /\ v 7 = v 3 /\ v 8  = v 4` (C SUBGOAL_THEN ASSUME_TAC);
2793     FIRST_X_ASSUM ((unlist ONCE_REWRITE_TAC) o GSYM);
2794     BY(REWRITE_TAC[Terminal.MOD_4_EXPLICIT;arith `7 = 1*4 + 3`;arith `8 = 2*4 + 0`;MOD_MULT_ADD]);
2795   TYPIFY `generic V E` (C SUBGOAL_THEN ASSUME_TAC);
2796     BY(FIRST_X_ASSUM_ST `scs_generic` MP_TAC THEN ASM_REWRITE_TAC[Appendix.scs_generic]);
2797   TYPIFY `v (p+4) = v p /\ v (p+5) = v (p+1) /\ v (p+6) = v (p+2) /\ v (p+7) = v (p+3) /\ v (p+8)  = v (p)` (C SUBGOAL_THEN ASSUME_TAC);
2798     FIRST_X_ASSUM_ST `MOD` ((unlist ONCE_REWRITE_TAC) o GSYM);
2799     BY(REWRITE_TAC[arith `p+4 = 1*4 + p /\ p+5 = 1*4+(p+1) /\ p+6=1*4+(p+2) /\ p+7 = 1*4 + (p+3) /\ p+8 = 2*4 + p`;MOD_MULT_ADD]);
2800   TYPIFY `!i. &2 <= norm (v i) /\ norm (v i) <= &2 * h0` (C SUBGOAL_THEN ASSUME_TAC);
2801     GEN_TAC;
2802     REWRITE_TAC[GSYM Fnjlbxs.in_ball_annulus];
2803     BY(ASM_REWRITE_TAC[]);
2804   TYPIFY `!i j. i < 4 /\ j < 4 /\ ~(i = j) ==> &2 <= dist(v (p + i),v (p+j))` (C SUBGOAL_THEN ASSUME_TAC);
2805     REPEAT WEAKER_STRIP_TAC;
2806     MATCH_MP_TAC Ocbicby.scs_lb_2;
2807     TYPIFY `s` EXISTS_TAC;
2808     ASM_REWRITE_TAC[];
2809     GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
2810     (NUM_REDUCE_TAC);
2811     REPEAT (GMATCH_SIMP_TAC MOD_LT);
2812     BY(ASM_REWRITE_TAC[]);
2813   TYPIFY `scs_b_v39 s (p+2) ((p+2)+1) <= cstab /\ scs_b_v39 s p (p+1) = &2 * h0 /\ scs_b_v39 s (p+3) ((p+3)+1) = &2 * h0` (C SUBGOAL_THEN ASSUME_TAC);
2814     CONJ2_TAC;
2815       TYPIFY `~(&2 = &2 * h0)` (C SUBGOAL_THEN ASSUME_TAC);
2816         BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
2817       TYPIFY `scs_a_v39 s (p+3) p = scs_a_v39 s (p+3) ((p+3)+1)` ENOUGH_TO_SHOW_TAC;
2818         BY(ASM_MESON_TAC[]);
2819       REWRITE_TAC[arith `((p+3)+1) = p+4`];
2820       FIRST_X_ASSUM_ST `is_scs_v39` MP_TAC THEN REWRITE_TAC[Appendix.is_scs_v39;LET_THM] THEN REPEAT WEAKER_STRIP_TAC;
2821       BY(ASM_MESON_TAC[Appendix.periodic2;Oxl_def.periodic]);
2822     FIRST_X_ASSUM_ST `is_scs_v39` MP_TAC THEN REWRITE_TAC[Appendix.is_scs_v39;LET_THM] THEN REPEAT WEAKER_STRIP_TAC;
2823     FIRST_X_ASSUM_ST `x <= cstab` (C INTRO_TAC [`p+2`]) THEN ASM_REWRITE_TAC[arith `3 < 4`];
2824     BY(REWRITE_TAC[arith `SUC (p+2) = (p+2)+1`]);
2825   FIRST_X_ASSUM MP_TAC THEN REWRITE_TAC[arith `((p:num) + i ) + j = p + (i+j)`] THEN NUM_REDUCE_TAC;
2826   DISCH_TAC;
2827   TYPIFY `dist(v (p+2),v(p+3)) <= cstab /\ dist(v p,v(p+1)) <= &2 * h0 /\ dist(v(p+3),v(p+4)) <= &2 * h0` (C SUBGOAL_THEN MP_TAC);
2828     FIRST_X_ASSUM MP_TAC;
2829     FIRST_X_ASSUM_ST `scs_b_v39` MP_TAC;
2830     BY(MESON_TAC[REAL_LE_TRANS]);
2831   ASM_REWRITE_TAC[];
2832   REPEAT WEAKER_STRIP_TAC;
2833   COMMENT "collinear";
2834   TYPIFY `!i j. ~(v i = v j) ==> ~collinear {vec 0,v i, v j}` (C SUBGOAL_THEN ASSUME_TAC);
2835     REPEAT GEN_TAC THEN DISCH_TAC;
2836     MATCH_MP_TAC Zlzthic.PROPERTIES_GENERIC_LOCAL_FAN_ALT;
2837     GEXISTL_TAC [`V`;`E`;`FF`];
2838     BY(ASM_REWRITE_TAC[IN_IMAGE;IN_UNIV]);
2839   TYPIFY `!i j. i < 4 /\ j < 4 /\ ~(i = j) ==> ~(v i = v j)` (C SUBGOAL_THEN ASSUME_TAC);
2840     BY(REPLICATE_TAC 20 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[]);
2841   INTRO_TAC PERIODIC_INJ_MOD [`v`;`4`];
2842   ASM_REWRITE_TAC[arith `~(4 = 0)`];
2843   DISCH_TAC;
2844   TYPIFY `!i j. i < 4 /\ j < 4 /\ ~(i=j) ==> ~(v (p +i) = v (p+j))` (C SUBGOAL_THEN ASSUME_TAC);
2845     REPEAT WEAKER_STRIP_TAC;
2846     FIRST_X_ASSUM MP_TAC THEN ASM_REWRITE_TAC[];
2847     GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
2848     (NUM_REDUCE_TAC);
2849     REPEAT (GMATCH_SIMP_TAC MOD_LT);
2850     BY(ASM_REWRITE_TAC[]);
2851   TYPIFY `!i. 0 < i /\ i < 4 ==> ~(v (p+i) = v p)` (C SUBGOAL_THEN ASSUME_TAC);
2852     BY(FIRST_X_ASSUM MP_TAC THEN MESON_TAC[arith `p+0 = p`;arith `0< 4`;arith `0 < i ==> ~(i=0)`]);
2853   TYPIFY `#3.3 <= dist(v (p+2),v p)` ASM_CASES_TAC;
2854     COMMENT "long diag";
2855     INTRO_TAC ((* get_work *) Terminal.get_main_nonlinear "6184614449") [`norm (v (p+1))`;`norm(v (p+2))`;`norm(v p)`;`dist(v(p+2),v p)`;`dist(v(p+1),v p)`;`dist(v(p+1),v(p+2))`];
2856     FIRST_X_ASSUM_ST `norm x = &2` kill;
2857     REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;arith `x <= x`];
2858     ASM_REWRITE_TAC[];
2859     DISCH_THEN MP_TAC THEN ANTS_TAC;
2860       CONJ_TAC;
2861         INTRO_TAC DIST_TRIANGLE [`v (p+2)`;`(vec 0):real^3`;`v (p)`];
2862         REWRITE_TAC[DIST_0];
2863         MATCH_MP_TAC (arith `x <= &2 * h0 /\ y <= &2 * h0 ==> (d <= x + y ==> d <= &4 * h0)`);
2864         BY(ASM_REWRITE_TAC[]);
2865       nCONJ_TAC 1;
2866         BY(ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REWRITE_TAC[]);
2867       ASM_REWRITE_TAC[];
2868       TYPIFY `v p = v (p+0)` (C SUBGOAL_THEN SUBST1_TAC);
2869         ONCE_REWRITE_TAC[arith `p+0=p`];
2870         BY(REWRITE_TAC[]);
2871       BY(CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN NUM_REDUCE_TAC);
2872     DISCH_TAC;
2873     FIRST_X_ASSUM_ST `dihV` MP_TAC;
2874     REWRITE_TAC[arith `~(x <= y) <=> y < x`];
2875     GMATCH_SIMP_TAC (REWRITE_RULE[LET_THM] Merge_ineq.DIHV_EQ_DIH_Y);
2876     ASM_REWRITE_TAC[DIST_0];
2877     CONJ_TAC;
2878       BY(CONJ_TAC THEN (REPEAT (FIRST_X_ASSUM MATCH_MP_TAC)) THEN NUM_REDUCE_TAC);
2879     MATCH_MP_TAC Ocbicby.delta4_y_imp_obtuse;
2880     CONJ_TAC;
2881       BY(ASM_MESON_TAC[arith `&2 <= x==> &0 < x`]);
2882     CONJ_TAC;
2883       BY(REWRITE_TAC[REWRITE_RULE[LET_THM] Tame_lemmas.delta_y_pos]);
2884     BY(ASM_REWRITE_TAC[]);
2885   TYPIFY `!i. ~scs_is_str s v i ==> ~coplanar {vec 0, v i, v(i+1), v(i+3)}` (C SUBGOAL_THEN ASSUME_TAC);
2886     GEN_TAC THEN ASM_REWRITE_TAC[Appendix.scs_is_str;arith `SUC i = i+1`;GSYM Local_lemmas1.AZIM_COND_FOR_COPLANAR];
2887     NUM_REDUCE_TAC;
2888     DISCH_THEN (unlist REWRITE_TAC);
2889     MATCH_MP_TAC (arith `&0 < a ==> ~(a = &0)`);
2890     INTRO_TAC Ocbicby.LOCAL_FAN_AZIM_POS [`s`;`v`;`i`];
2891     BY(ASM_REWRITE_TAC[LET_THM;IN;arith `SUC i = i+1`;arith `4 - 1 = 3`]);
2892   FIRST_X_ASSUM MP_TAC THEN BURY_MP_TAC;
2893   COMMENT "short diag";
2894   INTRO_TAC Terminal.vv_split_azim_generic [`v`;`4`;`p`;`2`;`3`];
2895   ASM_REWRITE_TAC[arith `SUC p = p+1`;LET_THM];
2896   NUM_REDUCE_TAC;
2897   DISCH_TAC;
2898   TYPIFY `azim (vec 0) (v p) (v (p+1)) (v (p+3)) <= pi` (C SUBGOAL_THEN ASSUME_TAC);
2899     FIRST_X_ASSUM_ST `interior_angle1` ((unlist REWRITE_TAC) o GSYM);
2900     MATCH_MP_TAC Local_lemmas.CONVEX_LOFA_IMP_INANGLE_LE_PI;
2901     BY(ASM_REWRITE_TAC[]);
2902   TYPIFY `azim (vec 0) (v p) (v (p + 1)) (v (p + 2)) <= pi /\  azim (vec 0) (v p) (v (p + 2)) (v (p + 3)) <= pi` (C SUBGOAL_THEN ASSUME_TAC);
2903     MATCH_MP_TAC (arith `&0 < pi /\ &0 <= a /\ &0 <= b /\ a + b <= pi ==> a <= pi /\ b <= pi`);
2904     REWRITE_TAC[PI_POS];
2905     REWRITE_TAC[Counting_spheres.AZIM_NN];
2906     BY(REPLICATE_TAC 2 (POP_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
2907   FIRST_X_ASSUM_ST `scs_is_str` MP_TAC;
2908   REWRITE_TAC[Appendix.scs_is_str];
2909   ASM_REWRITE_TAC[];
2910   NUM_REDUCE_TAC;
2911   REWRITE_TAC[arith `SUC p = p+1`];
2912   DISCH_THEN (RULE_ASSUM_TAC o (unlist REWRITE_RULE));
2913   INTRO_TAC AZIM_DIHV_SAME_STRONG [`(vec 0):real^3`;`v p`;`v (p+2)`;`v (p+3)`];
2914   INTRO_TAC AZIM_DIHV_SAME_STRONG [`(vec 0):real^3`;`v p`;`v (p+1)`;`v (p+2)`];
2915   FIRST_X_ASSUM_ST `pi = a` (MP_TAC o SYM) THEN DISCH_TAC;
2916   ASM_REWRITE_TAC[];
2917   TYPIFY `~collinear {vec 0, v p, v (p + 1)} /\ ~collinear {vec 0, v p, v (p + 2)} /\  ~collinear {vec 0, v p, v (p + 3)}` (C SUBGOAL_THEN ASSUME_TAC);
2918     BY(REPEAT CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN NUM_REDUCE_TAC);
2919   ASM_REWRITE_TAC[];
2920   REPEAT WEAKER_STRIP_TAC;
2921   REPEAT (FIRST_X_ASSUM_ST `dihV` MP_TAC) THEN REWRITE_TAC[] THEN REPEAT (GMATCH_SIMP_TAC (REWRITE_RULE[LET_THM] Merge_ineq.DIHV_EQ_DIH_Y));
2922   ASM_REWRITE_TAC[];
2923   CONJ_TAC;
2924     BY(REPEAT CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN NUM_REDUCE_TAC);
2925   REPEAT WEAKER_STRIP_TAC;
2926   FIRST_X_ASSUM_ST `+` MP_TAC THEN ASM_REWRITE_TAC[];
2927   (DISCH_TAC);
2928   TYPIFY `cstab <= dist(v p,v(p+2))` (C SUBGOAL_THEN ASSUME_TAC);
2929     FIRST_X_ASSUM_ST `cstab < d` (C INTRO_TAC [`p`;`p+2`]);
2930     ANTS_TAC;
2931       REWRITE_TAC[arith `p+2 = SUC(SUC (p))`];
2932       MATCH_MP_TAC Tfitskc.SCS_DIAG_2;
2933       BY(NUM_REDUCE_TAC);
2934     BY(REAL_ARITH_TAC);
2935   INTRO_TAC ((* get_work *) Terminal.get_main_nonlinear "1348932091 delta") [`norm (v (p))`;`norm(v (p+1))`;`norm(v (p+2))`;`&2 * h0`;`dist(v(p),v (p+2))`;`dist(v(p),v(p+1))`];
2936   REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;arith `x <= x`];
2937   TYPIFY `(&2 <= norm (v p) /\ norm (v p) <= &2) /\   (&2 <= norm (v (p + 1)) /\ norm (v (p + 1)) <=  #2.52) /\   (&2 <= norm (v (p + 2)) /\ norm (v (p + 2)) <=  #2.52) /\   ( #2.52 <= &2 * h0 /\ &2 * h0 <=  #2.52) /\   ( #3.01 <= dist (v p,v (p + 2)) /\ dist (v p,v (p + 2)) <=  #3.3) /\   &2 <= dist (v p,v (p + 1)) /\   dist (v p,v (p + 1)) <=  #2.52` (C SUBGOAL_THEN ASSUME_TAC);
2938     TYPIFY `#2.52 = &2 * h0` (C SUBGOAL_THEN SUBST1_TAC);
2939       BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
2940     ASM_REWRITE_TAC[arith `(x <= y /\ y <= x) <=> y = x`];
2941     CONJ2_TAC;
2942       FIRST_X_ASSUM_ST `&2 <= dist s` (C INTRO_TAC [`0`;`1`]);
2943       BY(REWRITE_TAC[arith `p+0=p`] THEN DISCH_THEN MATCH_MP_TAC THEN NUM_REDUCE_TAC);
2944     CONJ2_TAC;
2945       BY(FIRST_X_ASSUM_ST `#3.3` MP_TAC THEN REWRITE_TAC[DIST_SYM] THEN REAL_ARITH_TAC);
2946     BY(ASM_REWRITE_TAC[GSYM Sphere.cstab]);
2947   ASM_REWRITE_TAC[];
2948   DISCH_TAC;
2949   INTRO_TAC ((* get_work *) Terminal.get_main_nonlinear "1348932091") [`norm (v (p))`;`norm(v (p+1))`;`norm(v (p+2))`;`&2 * h0`;`dist(v(p),v (p+2))`;`dist(v(p),v(p+1))`];
2950   REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;arith `x <= x`];
2951   FIRST_X_ASSUM_ST `#3.01` (unlist REWRITE_TAC);
2952   DISCH_TAC;
2953   INTRO_TAC Ocbicby.dih_y_mono [`norm (v (p))`;`norm(v (p+1))`;`norm(v (p+2))`;`dist(v (p+1),v(p+2))`;`dist(v(p),v (p+2))`;`dist(v(p),v(p+1))`;`&2 * h0`];
2954   ANTS_TAC;
2955     ASM_REWRITE_TAC[arith `&0 < &2`];
2956     CONJ_TAC;
2957       FIRST_X_ASSUM_ST `&2 <= dist s` (C INTRO_TAC [`1`;`2`]);
2958       BY(NUM_REDUCE_TAC THEN REAL_ARITH_TAC);
2959     CONJ2_TAC;
2960       BY(FIRST_X_ASSUM_ST `delta_y` MP_TAC THEN REAL_ARITH_TAC);
2961     FIRST_X_ASSUM_ST `norm (v p) = &2` (SUBST1_TAC o GSYM);
2962     FIRST_X_ASSUM_ST `coplanar` (C INTRO_TAC [`p+1`]);
2963     ANTS_TAC;
2964       BY(ASM_REWRITE_TAC[]);
2965     REWRITE_TAC[arith `(p+1) +i = p+(1+i)`] THEN NUM_REDUCE_TAC;
2966     REWRITE_TAC[Oxlzlez.coplanar_delta_y];
2967     ASM_REWRITE_TAC[DIST_SYM;DIST_0];
2968     MATCH_MP_TAC (arith `a = b ==> &0 < a ==> &0 < b`);
2969     BY(MESON_TAC[Merge_ineq.delta_y_sym]);
2970   (DISCH_TAC);
2971   COMMENT "5557";
2972   INTRO_TAC ((* get_work *) Terminal.get_main_nonlinear "5557288534 delta") [`norm (v (p))`;`norm(v (p+3))`;`norm(v (p+2))`;`cstab`;`dist(v(p),v (p+2))`;`dist(v(p),v(p+3))`];
2973   REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;arith `x <= x`];
2974   TYPIFY `(&2 <= norm (v p) /\ norm (v p) <= &2) /\   (&2 <= norm (v (p + 3)) /\ norm (v (p + 3)) <=  #2.52) /\   (&2 <= norm (v (p + 2)) /\ norm (v (p + 2)) <=  #2.52) /\   ( #3.01 <= cstab /\ cstab <=  #3.01) /\   ( #3.01 <= dist (v p,v (p + 2)) /\ dist (v p,v (p + 2)) <=  #3.3) /\   &2 <= dist (v p,v (p + 3)) /\   dist (v p,v (p + 3)) <=  #2.52` (C SUBGOAL_THEN ASSUME_TAC);
2975     TYPIFY `#2.52 = &2 * h0` (C SUBGOAL_THEN SUBST1_TAC);
2976       BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
2977     ASM_REWRITE_TAC[arith `(x <= y /\ y <= x) <=> y = x`;Sphere.cstab];
2978     CONJ2_TAC;
2979       CONJ_TAC;
2980         FIRST_X_ASSUM_ST `&2 <= dist s` (C INTRO_TAC [`0`;`3`]);
2981         BY(REWRITE_TAC[arith `p+0=p`] THEN DISCH_THEN MATCH_MP_TAC THEN NUM_REDUCE_TAC);
2982       BY(ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REWRITE_TAC[]);
2983     CONJ2_TAC;
2984       BY(FIRST_X_ASSUM_ST `#3.3` MP_TAC THEN REWRITE_TAC[DIST_SYM] THEN REAL_ARITH_TAC);
2985     BY(ASM_REWRITE_TAC[GSYM Sphere.cstab]);
2986   FIRST_ASSUM (unlist REWRITE_TAC);
2987   DISCH_TAC;
2988   INTRO_TAC ((* get_work *) Terminal.get_main_nonlinear "5557288534") [`norm (v (p))`;`norm(v (p+3))`;`norm(v (p+2))`;`cstab`;`dist(v(p),v (p+2))`;`dist(v(p),v(p+3))`];
2989   REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;arith `x <= x`];
2990   FIRST_X_ASSUM_ST `#3.01` (unlist REWRITE_TAC);
2991   DISCH_TAC;
2992   INTRO_TAC Ocbicby.dih_y_mono [`norm (v (p))`;`norm(v (p+3))`;`norm(v (p+2))`;`dist(v (p+3),v(p+2))`;`dist(v(p),v (p+2))`;`dist(v(p),v(p+3))`;`cstab`];
2993   ANTS_TAC;
2994     TYPIFY_GOAL_THEN `&0 < norm (v p)` (unlist REWRITE_TAC);
2995       BY(ASM_REWRITE_TAC[arith `&0 < &2`]);
2996     FIRST_X_ASSUM_ST `norm (v p) =  &2` kill;
2997     ASM_REWRITE_TAC[];
2998     CONJ_TAC;
2999       BY(ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REWRITE_TAC[]);
3000     CONJ_TAC;
3001       FIRST_X_ASSUM_ST `&2 <= dist s` (C INTRO_TAC [`3`;`2`]);
3002       BY(NUM_REDUCE_TAC THEN REAL_ARITH_TAC);
3003     CONJ2_TAC;
3004       BY(FIRST_X_ASSUM_ST `delta_y` MP_TAC THEN REAL_ARITH_TAC);
3005     FIRST_X_ASSUM_ST `coplanar` (C INTRO_TAC [`p+3`]);
3006     ANTS_TAC;
3007       BY(ASM_REWRITE_TAC[]);
3008     REWRITE_TAC[arith `(p+3) +i = p+(3+i)`] THEN NUM_REDUCE_TAC;
3009     REWRITE_TAC[Oxlzlez.coplanar_delta_y];
3010     ASM_REWRITE_TAC[DIST_SYM;DIST_0];
3011     MATCH_MP_TAC (arith `a = b ==> &0 < a ==> &0 < b`);
3012     BY(MESON_TAC[Merge_ineq.delta_y_sym]);
3013   (DISCH_TAC);
3014   TYPIFY `dih_y (norm (v p)) (norm (v (p + 3))) (norm (v (p + 2)))      (dist (v (p + 3),v (p + 2)))      (dist (v p,v (p + 2)))      (dist (v p,v (p + 3))) + dih_y (norm (v p)) (norm (v (p + 1))) (norm (v (p + 2)))      (dist (v (p + 1),v (p + 2)))      (dist (v p,v (p + 2)))      (dist (v p,v (p + 1))) <= #3.1` (C SUBGOAL_THEN ASSUME_TAC);
3015     BY(REPLICATE_TAC 5 (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
3016   TYPIFY `#3.1 < pi` (C SUBGOAL_THEN ASSUME_TAC);
3017     BY(MP_TAC Flyspeck_constants.bounds THEN REAL_ARITH_TAC);
3018   FIRST_X_ASSUM_ST `a = pi` MP_TAC THEN REPLICATE_TAC 2 (POP_ASSUM MP_TAC);
3019   REWRITE_TAC[DIST_0;DIST_SYM];
3020   TYPIFY `dih_y (norm (v p)) (norm (v (p + 2))) (norm (v (p + 3)))       (dist (v (p + 2),v (p + 3)))       (dist (v p,v (p + 3)))       (dist (v p,v (p + 2))) = dih_y (norm (v p)) (norm (v (p + 3))) (norm (v (p + 2))) (dist (v (p + 2),v (p + 3))) (dist (v p,v (p + 2))) (dist (v p,v (p + 3)))` (C SUBGOAL_THEN SUBST1_TAC);
3021     BY(REWRITE_TAC[Nonlinear_lemma.dih_y_sym]);
3022   BY(REAL_ARITH_TAC)
3023   ]);;
3024   (* }}} *)
3025
3026 let LEMMA_PWE2 = prove_by_refinement(
3027 (* main_work4 ==> *) ` main_nonlinear_terminal_v11 ==> (!s v p.
3028     is_scs_v39 s /\ scs_basic_v39 s /\ scs_k_v39 s = 4 /\ v IN MMs_v39 s /\ 
3029     (!i j. scs_diag 4 i j ==> scs_a_v39 s i j <= cstab /\ cstab < dist(v i,v j) /\ &4*h0 < scs_b_v39 s i j) /\
3030     (!i. (scs_a_v39 s i (i+1) = &2 /\ scs_b_v39 s i (i+1)= &2*h0) \/
3031        (scs_a_v39 s i (i+1) = &2 * h0 /\ scs_b_v39 s i (i+1)= cstab)) /\
3032       scs_generic v /\
3033     ~scs_is_str s v (p+1) /\ ~scs_is_str s v (p+3) /\
3034     scs_is_str s v p /\ norm (v p) = &2 /\
3035     scs_a_v39 s p (p+1) = &2 /\
3036     scs_a_v39 s (p+3) (p) = &2 /\
3037     dist(v (p+2),v(p+3)) <= &2 * h0 ==>
3038     pi / &2 < dihV (vec 0) (v (p+3)) (v (p)) (v (p+2)))`,
3039   (* {{{ proof *)
3040   [
3041   REPEAT WEAKER_STRIP_TAC;
3042   REWRITE_TAC[arith `x < y <=> ~(y <= x)`] THEN DISCH_TAC;
3043   REPEAT WEAKER_STRIP_TAC;
3044   TYPIFY `BBprime2_v39 s v` (C SUBGOAL_THEN ASSUME_TAC);
3045     BY(ASM_MESON_TAC[Appendix.scs_basic;Ayqjtmd.unadorned_MMs;IN]);
3046   TYPIFY `BBprime_v39 s v` (C SUBGOAL_THEN ASSUME_TAC);
3047     BY(ASM_MESON_TAC[Appendix.BBprime2_v39]);
3048   TYPIFY `BBs_v39 s v` (C SUBGOAL_THEN ASSUME_TAC);
3049     BY(ASM_MESON_TAC[Appendix.BBprime_v39]);
3050   INTRO_TAC Appendix.BBs_v39 [`s`;`v`];
3051   ASM_REWRITE_TAC[LET_DEF;LET_END_DEF;Terminal.IMAGE_SUBSET_IN;IN_UNIV;arith `~(4 <= 3)`];
3052   REPEAT WEAKER_STRIP_TAC;
3053   TYPED_ABBREV_TAC `V = IMAGE v (:num)`;
3054   TYPED_ABBREV_TAC `E = IMAGE (\i. {v i, v (SUC i)}) (:num)`;
3055   TYPED_ABBREV_TAC `FF = IMAGE (\i. (v i,v (SUC i))) (:num)`;
3056   TYPIFY `local_fan (V,E,FF)` (C SUBGOAL_THEN ASSUME_TAC);
3057     MATCH_MP_TAC Local_lemmas.CVX_LO_IMP_LO;
3058     BY(ASM_REWRITE_TAC[]);
3059   TYPIFY `!i. v i IN V` (C SUBGOAL_THEN ASSUME_TAC);
3060     REPEAT WEAKER_STRIP_TAC;
3061     EXPAND_TAC "V";
3062     REWRITE_TAC[IN_IMAGE;IN_UNIV];
3063     BY(MESON_TAC[]);
3064   INTRO_TAC Cuxvzoz.BBs_inj [`s`;`v`;`4`];
3065   ASM_REWRITE_TAC[];
3066   DISCH_TAC;
3067   TYPIFY `!i. interior_angle1 (vec 0) FF (v i) = azim (vec 0) (v i) (v (i+1)) (v (i+3))` (C SUBGOAL_THEN ASSUME_TAC);
3068     GEN_TAC;
3069     EXPAND_TAC "FF";
3070     GMATCH_SIMP_TAC (REWRITE_RULE[LET_THM] (GSYM Ocbicby.INTERIOR_ANGLE1_AZIM));
3071     TYPIFY `s` EXISTS_TAC;
3072     BY(ASM_REWRITE_TAC[IN;arith `4 - 1 = 3`;arith `3 < 4`;arith `SUC i = i+1`]);
3073   INTRO_TAC Ocbicby.LOCAL_FAN_AZIM_POS [`s`;`v`];
3074   ASM_REWRITE_TAC[LET_THM;IN;arith `4-1 = 3`;arith `SUC i = i+1`];
3075   DISCH_TAC;
3076   TYPIFY `!i. v (i MOD 4) = v i` (C SUBGOAL_THEN ASSUME_TAC);
3077     GEN_TAC;
3078     MATCH_MP_TAC (GSYM Oxl_def.periodic_mod);
3079     BY(ASM_REWRITE_TAC[arith `~(0=4)`]);
3080   TYPIFY `v 4 = v 0 /\ v 5 = v 1 /\ v 6 = v 2 /\ v 7 = v 3 /\ v 8  = v 4` (C SUBGOAL_THEN ASSUME_TAC);
3081     FIRST_X_ASSUM ((unlist ONCE_REWRITE_TAC) o GSYM);
3082     BY(REWRITE_TAC[Terminal.MOD_4_EXPLICIT;arith `7 = 1*4 + 3`;arith `8 = 2*4 + 0`;MOD_MULT_ADD]);
3083   TYPIFY `generic V E` (C SUBGOAL_THEN ASSUME_TAC);
3084     BY(FIRST_X_ASSUM_ST `scs_generic` MP_TAC THEN ASM_REWRITE_TAC[Appendix.scs_generic]);
3085   TYPIFY `v (p+4) = v p /\ v (p+5) = v (p+1) /\ v (p+6) = v (p+2) /\ v (p+7) = v (p+3) /\ v (p+8)  = v (p)` (C SUBGOAL_THEN ASSUME_TAC);
3086     FIRST_X_ASSUM_ST `MOD` ((unlist ONCE_REWRITE_TAC) o GSYM);
3087     BY(REWRITE_TAC[arith `p+4 = 1*4 + p /\ p+5 = 1*4+(p+1) /\ p+6=1*4+(p+2) /\ p+7 = 1*4 + (p+3) /\ p+8 = 2*4 + p`;MOD_MULT_ADD]);
3088   TYPIFY `!i. &2 <= norm (v i) /\ norm (v i) <= &2 * h0` (C SUBGOAL_THEN ASSUME_TAC);
3089     GEN_TAC;
3090     REWRITE_TAC[GSYM Fnjlbxs.in_ball_annulus];
3091     BY(ASM_REWRITE_TAC[]);
3092   TYPIFY `!i j. i < 4 /\ j < 4 /\ ~(i = j) ==> &2 <= dist(v (p + i),v (p+j))` (C SUBGOAL_THEN ASSUME_TAC);
3093     REPEAT WEAKER_STRIP_TAC;
3094     MATCH_MP_TAC Ocbicby.scs_lb_2;
3095     TYPIFY `s` EXISTS_TAC;
3096     ASM_REWRITE_TAC[];
3097     GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
3098     (NUM_REDUCE_TAC);
3099     REPEAT (GMATCH_SIMP_TAC MOD_LT);
3100     BY(ASM_REWRITE_TAC[]);
3101   COMMENT "edge lengths";
3102   TYPIFY `scs_b_v39 s (p+1) ((p+1)+1) <= cstab /\ scs_b_v39 s p (p+1) = &2 * h0 /\ scs_b_v39 s (p+3) ((p+3)+1) = &2 * h0` (C SUBGOAL_THEN ASSUME_TAC);
3103     CONJ2_TAC;
3104       TYPIFY `~(&2 = &2 * h0)` (C SUBGOAL_THEN ASSUME_TAC);
3105         BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
3106       TYPIFY `scs_a_v39 s (p+3) p = scs_a_v39 s (p+3) ((p+3)+1)` ENOUGH_TO_SHOW_TAC;
3107         BY(ASM_MESON_TAC[]);
3108       REWRITE_TAC[arith `((p+3)+1) = p+4`];
3109       FIRST_X_ASSUM_ST `is_scs_v39` MP_TAC THEN REWRITE_TAC[Appendix.is_scs_v39;LET_THM] THEN REPEAT WEAKER_STRIP_TAC;
3110       BY(ASM_MESON_TAC[Appendix.periodic2;Oxl_def.periodic]);
3111     FIRST_X_ASSUM_ST `is_scs_v39` MP_TAC THEN REWRITE_TAC[Appendix.is_scs_v39;LET_THM] THEN REPEAT WEAKER_STRIP_TAC;
3112     FIRST_X_ASSUM_ST `x <= cstab` (C INTRO_TAC [`p+1`]) THEN ASM_REWRITE_TAC[arith `3 < 4`];
3113     BY(REWRITE_TAC[arith `SUC (p+1) = (p+1)+1`]);
3114   FIRST_X_ASSUM MP_TAC THEN REWRITE_TAC[arith `((p:num) + i ) + j = p + (i+j)`] THEN NUM_REDUCE_TAC;
3115   DISCH_TAC;
3116   TYPIFY `dist(v (p+1),v(p+2)) <= cstab /\ dist(v p,v(p+1)) <= &2 * h0 /\ dist(v(p+3),v(p+4)) <= &2 * h0` (C SUBGOAL_THEN MP_TAC);
3117     FIRST_X_ASSUM MP_TAC;
3118     FIRST_X_ASSUM_ST `scs_b_v39` MP_TAC;
3119     BY(MESON_TAC[REAL_LE_TRANS]);
3120   ASM_REWRITE_TAC[];
3121   REPEAT WEAKER_STRIP_TAC;
3122   COMMENT "collinear";
3123   TYPIFY `!i j. ~(v i = v j) ==> ~collinear {vec 0,v i, v j}` (C SUBGOAL_THEN ASSUME_TAC);
3124     REPEAT GEN_TAC THEN DISCH_TAC;
3125     MATCH_MP_TAC Zlzthic.PROPERTIES_GENERIC_LOCAL_FAN_ALT;
3126     GEXISTL_TAC [`V`;`E`;`FF`];
3127     BY(ASM_REWRITE_TAC[IN_IMAGE;IN_UNIV]);
3128   TYPIFY `!i j. i < 4 /\ j < 4 /\ ~(i = j) ==> ~(v i = v j)` (C SUBGOAL_THEN ASSUME_TAC);
3129     BY(REPLICATE_TAC 20 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[]);
3130   INTRO_TAC PERIODIC_INJ_MOD [`v`;`4`];
3131   ASM_REWRITE_TAC[arith `~(4 = 0)`];
3132   DISCH_TAC;
3133   TYPIFY `!i j. i < 4 /\ j < 4 /\ ~(i=j) ==> ~(v (p +i) = v (p+j))` (C SUBGOAL_THEN ASSUME_TAC);
3134     REPEAT WEAKER_STRIP_TAC;
3135     FIRST_X_ASSUM MP_TAC THEN ASM_REWRITE_TAC[];
3136     GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
3137     (NUM_REDUCE_TAC);
3138     REPEAT (GMATCH_SIMP_TAC MOD_LT);
3139     BY(ASM_REWRITE_TAC[]);
3140   TYPIFY `!i. 0 < i /\ i < 4 ==> ~(v (p+i) = v p)` (C SUBGOAL_THEN ASSUME_TAC);
3141     BY(FIRST_X_ASSUM MP_TAC THEN MESON_TAC[arith `p+0 = p`;arith `0< 4`;arith `0 < i ==> ~(i=0)`]);
3142   COMMENT "long diag";
3143   TYPIFY `#3.3 <= dist(v (p+2),v p)` ASM_CASES_TAC;
3144     COMMENT "long diag";
3145     INTRO_TAC ((* get_work *) Terminal.get_main_nonlinear "6184614449") [`norm (v (p+3))`;`norm(v (p+2))`;`norm(v p)`;`dist(v(p+2),v p)`;`dist(v(p+3),v p)`;`dist(v(p+3),v(p+2))`];
3146     FIRST_X_ASSUM_ST `norm x = &2` kill;
3147     REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;arith `x <= x`];
3148     ASM_REWRITE_TAC[];
3149     DISCH_THEN MP_TAC THEN ANTS_TAC;
3150       CONJ_TAC;
3151         INTRO_TAC DIST_TRIANGLE [`v (p+2)`;`(vec 0):real^3`;`v (p)`];
3152         REWRITE_TAC[DIST_0];
3153         MATCH_MP_TAC (arith `x <= &2 * h0 /\ y <= &2 * h0 ==> (d <= x + y ==> d <= &4 * h0)`);
3154         BY(ASM_REWRITE_TAC[]);
3155       nCONJ_TAC 2;
3156         BY(ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REWRITE_TAC[]);
3157       ASM_REWRITE_TAC[];
3158       TYPIFY `v p = v (p+0)` (C SUBGOAL_THEN SUBST1_TAC);
3159         ONCE_REWRITE_TAC[arith `p+0=p`];
3160         BY(REWRITE_TAC[]);
3161       BY(CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN NUM_REDUCE_TAC);
3162     DISCH_TAC;
3163     FIRST_X_ASSUM_ST `dihV` MP_TAC;
3164     REWRITE_TAC[arith `~(x <= y) <=> y < x`];
3165     GMATCH_SIMP_TAC (REWRITE_RULE[LET_THM] Merge_ineq.DIHV_EQ_DIH_Y);
3166     ASM_REWRITE_TAC[DIST_0];
3167     CONJ_TAC;
3168       BY(CONJ_TAC THEN (REPEAT (FIRST_X_ASSUM MATCH_MP_TAC)) THEN NUM_REDUCE_TAC);
3169     ONCE_REWRITE_TAC[Nonlinear_lemma.dih_y_sym];
3170     MATCH_MP_TAC Ocbicby.delta4_y_imp_obtuse;
3171     CONJ_TAC;
3172       BY(ASM_MESON_TAC[arith `&2 <= x==> &0 < x`]);
3173     INTRO_TAC DIST_SYM [`v p`;`v (p+2)`];
3174     DISCH_THEN SUBST1_TAC;
3175     CONJ_TAC;
3176       BY(REWRITE_TAC[REWRITE_RULE[LET_THM] Tame_lemmas.delta_y_pos]);
3177     BY(ASM_REWRITE_TAC[]);
3178   TYPIFY `!i. ~scs_is_str s v i ==> ~coplanar {vec 0, v i, v(i+1), v(i+3)}` (C SUBGOAL_THEN ASSUME_TAC);
3179     GEN_TAC THEN ASM_REWRITE_TAC[Appendix.scs_is_str;arith `SUC i = i+1`;GSYM Local_lemmas1.AZIM_COND_FOR_COPLANAR];
3180     NUM_REDUCE_TAC;
3181     DISCH_THEN (unlist REWRITE_TAC);
3182     MATCH_MP_TAC (arith `&0 < a ==> ~(a = &0)`);
3183     INTRO_TAC Ocbicby.LOCAL_FAN_AZIM_POS [`s`;`v`;`i`];
3184     BY(ASM_REWRITE_TAC[LET_THM;IN;arith `SUC i = i+1`;arith `4 - 1 = 3`]);
3185   FIRST_X_ASSUM MP_TAC THEN BURY_MP_TAC;
3186   COMMENT "short diag";
3187   INTRO_TAC Terminal.vv_split_azim_generic [`v`;`4`;`p`;`2`;`3`];
3188   ASM_REWRITE_TAC[arith `SUC p = p+1`;LET_THM];
3189   NUM_REDUCE_TAC;
3190   DISCH_TAC;
3191   TYPIFY `azim (vec 0) (v p) (v (p+1)) (v (p+3)) <= pi` (C SUBGOAL_THEN ASSUME_TAC);
3192     FIRST_X_ASSUM_ST `interior_angle1` ((unlist REWRITE_TAC) o GSYM);
3193     MATCH_MP_TAC Local_lemmas.CONVEX_LOFA_IMP_INANGLE_LE_PI;
3194     BY(ASM_REWRITE_TAC[]);
3195   TYPIFY `azim (vec 0) (v p) (v (p + 1)) (v (p + 2)) <= pi /\  azim (vec 0) (v p) (v (p + 2)) (v (p + 3)) <= pi` (C SUBGOAL_THEN ASSUME_TAC);
3196     MATCH_MP_TAC (arith `&0 < pi /\ &0 <= a /\ &0 <= b /\ a + b <= pi ==> a <= pi /\ b <= pi`);
3197     REWRITE_TAC[PI_POS];
3198     REWRITE_TAC[Counting_spheres.AZIM_NN];
3199     BY(REPLICATE_TAC 2 (POP_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
3200   FIRST_X_ASSUM_ST `scs_is_str` MP_TAC;
3201   REWRITE_TAC[Appendix.scs_is_str];
3202   ASM_REWRITE_TAC[];
3203   NUM_REDUCE_TAC;
3204   REWRITE_TAC[arith `SUC p = p+1`];
3205   DISCH_THEN (RULE_ASSUM_TAC o (unlist REWRITE_RULE));
3206   INTRO_TAC AZIM_DIHV_SAME_STRONG [`(vec 0):real^3`;`v p`;`v (p+2)`;`v (p+3)`];
3207   INTRO_TAC AZIM_DIHV_SAME_STRONG [`(vec 0):real^3`;`v p`;`v (p+1)`;`v (p+2)`];
3208   FIRST_X_ASSUM_ST `pi = a` (MP_TAC o SYM) THEN DISCH_TAC;
3209   ASM_REWRITE_TAC[];
3210   TYPIFY `~collinear {vec 0, v p, v (p + 1)} /\ ~collinear {vec 0, v p, v (p + 2)} /\  ~collinear {vec 0, v p, v (p + 3)}` (C SUBGOAL_THEN ASSUME_TAC);
3211     BY(REPEAT CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN NUM_REDUCE_TAC);
3212   ASM_REWRITE_TAC[];
3213   REPEAT WEAKER_STRIP_TAC;
3214   REPEAT (FIRST_X_ASSUM_ST `dihV` MP_TAC) THEN REWRITE_TAC[] THEN REPEAT (GMATCH_SIMP_TAC (REWRITE_RULE[LET_THM] Merge_ineq.DIHV_EQ_DIH_Y));
3215   ASM_REWRITE_TAC[];
3216   CONJ_TAC;
3217     BY(REPEAT CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN NUM_REDUCE_TAC);
3218   REPEAT WEAKER_STRIP_TAC;
3219   FIRST_X_ASSUM_ST `+` MP_TAC THEN ASM_REWRITE_TAC[];
3220   (DISCH_TAC);
3221   TYPIFY `cstab <= dist(v p,v(p+2))` (C SUBGOAL_THEN ASSUME_TAC);
3222     FIRST_X_ASSUM_ST `cstab < d` (C INTRO_TAC [`p`;`p+2`]);
3223     ANTS_TAC;
3224       REWRITE_TAC[arith `p+2 = SUC(SUC (p))`];
3225       MATCH_MP_TAC Tfitskc.SCS_DIAG_2;
3226       BY(NUM_REDUCE_TAC);
3227     BY(REAL_ARITH_TAC);
3228   INTRO_TAC ((* get_work *) Terminal.get_main_nonlinear "1348932091 delta") [`norm (v (p))`;`norm(v (p+3))`;`norm(v (p+2))`;`&2 * h0`;`dist(v(p),v (p+2))`;`dist(v(p),v(p+3))`];
3229   REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;arith `x <= x`];
3230   TYPIFY `(&2 <= norm (v p) /\ norm (v p) <= &2) /\   (&2 <= norm (v (p + 3)) /\ norm (v (p + 3)) <=  #2.52) /\   (&2 <= norm (v (p + 2)) /\ norm (v (p + 2)) <=  #2.52) /\   ( #2.52 <= &2 * h0 /\ &2 * h0 <=  #2.52) /\   ( #3.01 <= dist (v p,v (p + 2)) /\ dist (v p,v (p + 2)) <=  #3.3) /\   &2 <= dist (v p,v (p + 3)) /\   dist (v p,v (p + 3)) <=  #2.52` (C SUBGOAL_THEN ASSUME_TAC);
3231     TYPIFY `#2.52 = &2 * h0` (C SUBGOAL_THEN SUBST1_TAC);
3232       BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
3233     ASM_REWRITE_TAC[arith `(x <= y /\ y <= x) <=> y = x`];
3234     nCONJ_TAC 3;
3235       BY(ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REWRITE_TAC[]);
3236     ASM_REWRITE_TAC[];
3237     CONJ2_TAC;
3238       FIRST_X_ASSUM_ST `&2 <= dist s` (C INTRO_TAC [`0`;`3`]);
3239       BY(REWRITE_TAC[arith `p+0=p`] THEN DISCH_THEN MATCH_MP_TAC THEN NUM_REDUCE_TAC);
3240     CONJ2_TAC;
3241       BY(FIRST_X_ASSUM_ST `#3.3` MP_TAC THEN REWRITE_TAC[DIST_SYM] THEN REAL_ARITH_TAC);
3242     BY(ASM_REWRITE_TAC[GSYM Sphere.cstab]);
3243   FIRST_X_ASSUM_ST `norm x = &2` MP_TAC;
3244   ASM_REWRITE_TAC[];
3245   REPEAT WEAKER_STRIP_TAC;
3246   INTRO_TAC ((* get_work *) Terminal.get_main_nonlinear "1348932091") [`norm (v (p))`;`norm(v (p+3))`;`norm(v (p+2))`;`&2 * h0`;`dist(v(p),v (p+2))`;`dist(v(p),v(p+3))`];
3247   REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;arith `x <= x`];
3248   FIRST_X_ASSUM_ST `#3.01` (unlist REWRITE_TAC);
3249   DISCH_TAC;
3250   INTRO_TAC Ocbicby.dih_y_mono [`norm (v (p))`;`norm(v (p+3))`;`norm(v (p+2))`;`dist(v (p+3),v(p+2))`;`dist(v(p),v (p+2))`;`dist(v(p),v(p+3))`;`&2 * h0`];
3251   ANTS_TAC;
3252     nCONJ_TAC 1;
3253       BY(FIRST_X_ASSUM_ST `norm x = &2` MP_TAC THEN REAL_ARITH_TAC);
3254     FIRST_X_ASSUM_ST `norm x = &2` kill;
3255     ASM_REWRITE_TAC[arith `&0 < &2`];
3256     CONJ_TAC;
3257       BY(ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REWRITE_TAC[]);
3258     CONJ_TAC;
3259       FIRST_X_ASSUM_ST `&2 <= dist s` (C INTRO_TAC [`3`;`2`]);
3260       BY(NUM_REDUCE_TAC THEN REAL_ARITH_TAC);
3261     CONJ2_TAC;
3262       BY(FIRST_X_ASSUM_ST `delta_y` MP_TAC THEN REAL_ARITH_TAC);
3263     FIRST_X_ASSUM_ST `coplanar` (C INTRO_TAC [`p+3`]);
3264     ANTS_TAC;
3265       BY(ASM_REWRITE_TAC[]);
3266     REWRITE_TAC[arith `(p+3) +i = p+(3+i)`] THEN NUM_REDUCE_TAC;
3267     REWRITE_TAC[Oxlzlez.coplanar_delta_y];
3268     ASM_REWRITE_TAC[DIST_SYM;DIST_0];
3269     MATCH_MP_TAC (arith `a = b ==> &0 < a ==> &0 < b`);
3270     BY(MESON_TAC[Merge_ineq.delta_y_sym]);
3271   (DISCH_TAC);
3272   COMMENT "5557";
3273   INTRO_TAC ((* get_work *) Terminal.get_main_nonlinear "5557288534 delta") [`norm (v (p))`;`norm(v (p+1))`;`norm(v (p+2))`;`cstab`;`dist(v(p),v (p+2))`;`dist(v(p),v(p+1))`];
3274   REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;arith `x <= x`];
3275   TYPIFY `(&2 <= norm (v p) /\ norm (v p) <= &2) /\   (&2 <= norm (v (p + 1)) /\ norm (v (p + 1)) <=  #2.52) /\   (&2 <= norm (v (p + 2)) /\ norm (v (p + 2)) <=  #2.52) /\   ( #3.01 <= cstab /\ cstab <=  #3.01) /\   ( #3.01 <= dist (v p,v (p + 2)) /\ dist (v p,v (p + 2)) <=  #3.3) /\   &2 <= dist (v p,v (p + 1)) /\   dist (v p,v (p + 1)) <=  #2.52` (C SUBGOAL_THEN ASSUME_TAC);
3276     TYPIFY `#2.52 = &2 * h0` (C SUBGOAL_THEN SUBST1_TAC);
3277       BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
3278     ASM_REWRITE_TAC[arith `(x <= y /\ y <= x) <=> y = x`;Sphere.cstab];
3279     CONJ2_TAC;
3280       FIRST_X_ASSUM_ST `&2 <= dist s` (C INTRO_TAC [`0`;`1`]);
3281       BY(REWRITE_TAC[arith `p+0=p`] THEN DISCH_THEN MATCH_MP_TAC THEN NUM_REDUCE_TAC);
3282     CONJ2_TAC;
3283       BY(FIRST_X_ASSUM_ST `#3.3` MP_TAC THEN REWRITE_TAC[DIST_SYM] THEN REAL_ARITH_TAC);
3284     BY(ASM_REWRITE_TAC[GSYM Sphere.cstab]);
3285   FIRST_ASSUM (unlist REWRITE_TAC);
3286   DISCH_TAC;
3287   INTRO_TAC ((* get_work *) Terminal.get_main_nonlinear "5557288534") [`norm (v (p))`;`norm(v (p+1))`;`norm(v (p+2))`;`cstab`;`dist(v(p),v (p+2))`;`dist(v(p),v(p+1))`];
3288   REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;arith `x <= x`];
3289   FIRST_X_ASSUM_ST `#3.01` (unlist REWRITE_TAC);
3290   DISCH_TAC;
3291   INTRO_TAC Ocbicby.dih_y_mono [`norm (v (p))`;`norm(v (p+1))`;`norm(v (p+2))`;`dist(v (p+1),v(p+2))`;`dist(v(p),v (p+2))`;`dist(v(p),v(p+1))`;`cstab`];
3292   ANTS_TAC;
3293     TYPIFY_GOAL_THEN `&0 < norm (v p)` (unlist REWRITE_TAC);
3294       BY(ASM_REWRITE_TAC[arith `&0 < &2`]);
3295     FIRST_X_ASSUM_ST `norm (v p) =  &2` kill;
3296     ASM_REWRITE_TAC[];
3297     CONJ_TAC;
3298       FIRST_X_ASSUM_ST `&2 <= dist s` (C INTRO_TAC [`1`;`2`]);
3299       BY(NUM_REDUCE_TAC THEN REAL_ARITH_TAC);
3300     CONJ2_TAC;
3301       BY(FIRST_X_ASSUM_ST `delta_y` MP_TAC THEN REAL_ARITH_TAC);
3302     FIRST_X_ASSUM_ST `coplanar` (C INTRO_TAC [`p+1`]);
3303     ANTS_TAC;
3304       BY(ASM_REWRITE_TAC[]);
3305     REWRITE_TAC[arith `(p+1) +i = p+(1+i)`] THEN NUM_REDUCE_TAC;
3306     REWRITE_TAC[Oxlzlez.coplanar_delta_y];
3307     ASM_REWRITE_TAC[DIST_SYM;DIST_0];
3308     MATCH_MP_TAC (arith `a = b ==> &0 < a ==> &0 < b`);
3309     BY(MESON_TAC[Merge_ineq.delta_y_sym]);
3310   (DISCH_TAC);
3311   TYPIFY `dih_y (norm (v p)) (norm (v (p + 3))) (norm (v (p + 2)))      (dist (v (p + 3),v (p + 2)))      (dist (v p,v (p + 2)))      (dist (v p,v (p + 3))) + dih_y (norm (v p)) (norm (v (p + 1))) (norm (v (p + 2)))      (dist (v (p + 1),v (p + 2)))      (dist (v p,v (p + 2)))      (dist (v p,v (p + 1))) < #3.1` (C SUBGOAL_THEN ASSUME_TAC);
3312     BY(REPLICATE_TAC 5 (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
3313   TYPIFY `#3.1 < pi` (C SUBGOAL_THEN ASSUME_TAC);
3314     BY(MP_TAC Flyspeck_constants.bounds THEN REAL_ARITH_TAC);
3315   FIRST_X_ASSUM_ST `a = pi` MP_TAC THEN REPLICATE_TAC 2 (POP_ASSUM MP_TAC);
3316   REWRITE_TAC[DIST_0;DIST_SYM];
3317   TYPIFY `dih_y (norm (v p)) (norm (v (p + 2))) (norm (v (p + 3)))       (dist (v (p + 2),v (p + 3)))       (dist (v p,v (p + 3)))       (dist (v p,v (p + 2))) = dih_y (norm (v p)) (norm (v (p + 3))) (norm (v (p + 2))) (dist (v (p + 2),v (p + 3))) (dist (v p,v (p + 2))) (dist (v p,v (p + 3)))` (C SUBGOAL_THEN SUBST1_TAC);
3318     BY(REWRITE_TAC[Nonlinear_lemma.dih_y_sym]);
3319   BY(REAL_ARITH_TAC)
3320   ]);;
3321   (* }}} *)
3322
3323 let LINDIH_11 = prove_by_refinement(
3324     (* main_work4 ==> *) `main_nonlinear_terminal_v11 ==>
3325     (!y1 y2 y3 y4 y5 y6.
3326        ineq
3327       [
3328          (&2,y1,&2);
3329          (&2,y2,#2.52);
3330          (&2,y3,#2.52);
3331          (&2,y4,&2);
3332          (#3.01,y5,#3.55);
3333          (&2 * h0,y6,#3.01)]      
3334       ((dih_y y1 y2 y3 y4 y5 y6  < #1.1) \/ delta_y y1 y2 y3 y4 y5 y6 < &0))`,
3335   (* {{{ proof *)
3336   [
3337   REPEAT WEAKER_STRIP_TAC;
3338   REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;arith `x <= x`];
3339   REPEAT WEAKER_STRIP_TAC;
3340   TYPIFY `delta_y y1 y2 y3 y4 y5 y6 < &0` ASM_CASES_TAC;
3341     BY(ASM_REWRITE_TAC[]);
3342   ASM_REWRITE_TAC[];
3343   REWRITE_TAC[Sphere.dih_y;LET_THM];
3344   GMATCH_SIMP_TAC Merge_ineq.lindih_lt;
3345   REWRITE_TAC[GSYM CONJ_ASSOC];
3346   GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
3347   CONJ_TAC;
3348     BY(ASM_TAC THEN REAL_ARITH_TAC);
3349   CONJ_TAC;
3350     BY(MP_TAC Flyspeck_constants.bounds THEN REAL_ARITH_TAC);
3351   CONJ_TAC;
3352     BY(ASM_TAC THEN REAL_ARITH_TAC);
3353   INTRO_TAC ((* get_work *) Terminal.get_main_nonlinear "9368433105") [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`];
3354   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;LET_THM];
3355   REWRITE_TAC[Sphere.delta4_y;Sphere.y_of_x];
3356   DISCH_TAC;
3357   INTRO_TAC ((* get_work *) Terminal.get_main_nonlinear "8405387449") [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`];
3358   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;LET_THM];
3359   ASM_SIMP_TAC [arith `d > &0 ==> &0 < d`];
3360   DISCH_TAC;
3361   TYPIFY `&0 <= (&4 *  (y1 * y1) *  delta_x (y1 * y1) (y2 * y2) (y3 * y3) (y4 * y4) (y5 * y5) (y6 * y6))` (C SUBGOAL_THEN ASSUME_TAC);
3362     REPEAT (GMATCH_SIMP_TAC REAL_LE_MUL);
3363     FIRST_X_ASSUM_ST `delta_y` MP_TAC THEN REWRITE_TAC[Sphere.delta_y];
3364     BY(ASM_TAC THEN REAL_ARITH_TAC);
3365   GMATCH_SIMP_TAC Pack1.bp_bdt;
3366   GMATCH_SIMP_TAC SQRT_POS_LE;
3367   ASM_REWRITE_TAC[];
3368   CONJ_TAC;
3369     GMATCH_SIMP_TAC REAL_LE_MUL;
3370     GMATCH_SIMP_TAC TAN_POS_PI2_LE;
3371     ASM_SIMP_TAC[arith `x > &0 ==> &0 <= x`];
3372     BY(MP_TAC Flyspeck_constants.bounds THEN ASM_TAC THEN REAL_ARITH_TAC);
3373   GMATCH_SIMP_TAC SQRT_POW_2;
3374   ASM_REWRITE_TAC[];
3375   MATCH_MP_TAC REAL_LT_TRANS;
3376   TYPIFY `#3.86 * delta4_squared_y y1 y2 y3 y4 y5 y6` EXISTS_TAC;
3377   CONJ_TAC;
3378     FIRST_X_ASSUM_ST `x1_delta_y` MP_TAC;
3379     BY(REWRITE_TAC[Sphere.x1_delta_y;Sphere.delta4_squared_y;Sphere.y_of_x;Sphere.x1_delta_x]);
3380   REWRITE_TAC[Sphere.delta4_squared_y;Sphere.y_of_x;Sphere.delta4_squared_x];
3381   REWRITE_TAC[arith `(x * y) pow 2 = x pow 2 * y pow 2`];
3382   GMATCH_SIMP_TAC REAL_LT_RMUL_EQ;
3383   CONJ_TAC;
3384     REWRITE_TAC[GSYM Trigonometry2.NOT_ZERO_EQ_POW2_LT];
3385     BY(ASM_TAC THEN REAL_ARITH_TAC);
3386   TYPIFY `#3.86 = sqrt(#3.86) pow 2` (C SUBGOAL_THEN SUBST1_TAC);
3387     GMATCH_SIMP_TAC SQRT_POW_2;
3388     BY(REAL_ARITH_TAC);
3389   MATCH_MP_TAC Tame_inequalities.REAL_LT_SQUARE_POS;
3390   GMATCH_SIMP_TAC SQRT_POS_LT;
3391   CONJ_TAC;
3392     BY(REAL_ARITH_TAC);
3393   TYPIFY `atn(sqrt  #3.86) < atn(tan  #1.1)` ENOUGH_TO_SHOW_TAC;
3394     BY(REWRITE_TAC[ATN_MONO_LT_EQ]);
3395   GMATCH_SIMP_TAC TAN_ATN;
3396   CONJ_TAC;
3397     BY(MP_TAC Flyspeck_constants.bounds THEN REAL_ARITH_TAC);
3398   BY(REWRITE_TAC[Flyspeck_constants.calc `atn (sqrt  #3.86) <  #1.1`])
3399   ]);;
3400   (* }}} *)
3401
3402 let LEMMA_PWE3 = prove_by_refinement(
3403 (* main_work4 ==> *) ` main_nonlinear_terminal_v11 ==> (!s v p.
3404     is_scs_v39 s /\ scs_basic_v39 s /\ scs_k_v39 s = 4 /\ v IN MMs_v39 s /\ 
3405     (!i j. scs_diag 4 i j ==> scs_a_v39 s i j <= cstab /\ cstab < dist(v i,v j) /\ &4*h0 < scs_b_v39 s i j) /\
3406     (!i. (scs_a_v39 s i (i+1) = &2 /\ scs_b_v39 s i (i+1)= &2*h0) \/
3407        (scs_a_v39 s i (i+1) = &2 * h0 /\ scs_b_v39 s i (i+1)= cstab)) /\
3408       scs_generic v /\
3409     ~scs_is_str s v (p+1) /\ ~scs_is_str s v (p+3) /\
3410     scs_is_str s v p /\ norm (v p) = &2 /\
3411     scs_a_v39 s p (p+1) = &2 /\
3412     scs_a_v39 s (p+3) (p) = &2 * h0 /\
3413     dist(v (p+2),v(p+3)) =  &2 /\
3414     &2 * h0 <= dist(v(p+1),v(p+2)) ==>
3415     pi / &2 < dihV (vec 0) (v (p+1)) (v (p)) (v (p+2)))`,
3416   (* {{{ proof *)
3417   [
3418   REPEAT WEAKER_STRIP_TAC;
3419   REWRITE_TAC[arith `x < y <=> ~(y <= x)`] THEN DISCH_TAC;
3420   REPEAT WEAKER_STRIP_TAC;
3421   TYPIFY `BBprime2_v39 s v` (C SUBGOAL_THEN ASSUME_TAC);
3422     BY(ASM_MESON_TAC[Appendix.scs_basic;Ayqjtmd.unadorned_MMs;IN]);
3423   TYPIFY `BBprime_v39 s v` (C SUBGOAL_THEN ASSUME_TAC);
3424     BY(ASM_MESON_TAC[Appendix.BBprime2_v39]);
3425   TYPIFY `BBs_v39 s v` (C SUBGOAL_THEN ASSUME_TAC);
3426     BY(ASM_MESON_TAC[Appendix.BBprime_v39]);
3427   INTRO_TAC Appendix.BBs_v39 [`s`;`v`];
3428   ASM_REWRITE_TAC[LET_DEF;LET_END_DEF;Terminal.IMAGE_SUBSET_IN;IN_UNIV;arith `~(4 <= 3)`];
3429   REPEAT WEAKER_STRIP_TAC;
3430   TYPED_ABBREV_TAC `V = IMAGE v (:num)`;
3431   TYPED_ABBREV_TAC `E = IMAGE (\i. {v i, v (SUC i)}) (:num)`;
3432   TYPED_ABBREV_TAC `FF = IMAGE (\i. (v i,v (SUC i))) (:num)`;
3433   TYPIFY `local_fan (V,E,FF)` (C SUBGOAL_THEN ASSUME_TAC);
3434     MATCH_MP_TAC Local_lemmas.CVX_LO_IMP_LO;
3435     BY(ASM_REWRITE_TAC[]);
3436   TYPIFY `!i. v i IN V` (C SUBGOAL_THEN ASSUME_TAC);
3437     REPEAT WEAKER_STRIP_TAC;
3438     EXPAND_TAC "V";
3439     REWRITE_TAC[IN_IMAGE;IN_UNIV];
3440     BY(MESON_TAC[]);
3441   INTRO_TAC Cuxvzoz.BBs_inj [`s`;`v`;`4`];
3442   ASM_REWRITE_TAC[];
3443   DISCH_TAC;
3444   TYPIFY `!i. interior_angle1 (vec 0) FF (v i) = azim (vec 0) (v i) (v (i+1)) (v (i+3))` (C SUBGOAL_THEN ASSUME_TAC);
3445     GEN_TAC;
3446     EXPAND_TAC "FF";
3447     GMATCH_SIMP_TAC (REWRITE_RULE[LET_THM] (GSYM Ocbicby.INTERIOR_ANGLE1_AZIM));
3448     TYPIFY `s` EXISTS_TAC;
3449     BY(ASM_REWRITE_TAC[IN;arith `4 - 1 = 3`;arith `3 < 4`;arith `SUC i = i+1`]);
3450   INTRO_TAC Ocbicby.LOCAL_FAN_AZIM_POS [`s`;`v`];
3451   ASM_REWRITE_TAC[LET_THM;IN;arith `4-1 = 3`;arith `SUC i = i+1`];
3452   DISCH_TAC;
3453   TYPIFY `!i. v (i MOD 4) = v i` (C SUBGOAL_THEN ASSUME_TAC);
3454     GEN_TAC;
3455     MATCH_MP_TAC (GSYM Oxl_def.periodic_mod);
3456     BY(ASM_REWRITE_TAC[arith `~(0=4)`]);
3457   TYPIFY `v 4 = v 0 /\ v 5 = v 1 /\ v 6 = v 2 /\ v 7 = v 3 /\ v 8  = v 4` (C SUBGOAL_THEN ASSUME_TAC);
3458     FIRST_X_ASSUM ((unlist ONCE_REWRITE_TAC) o GSYM);
3459     BY(REWRITE_TAC[Terminal.MOD_4_EXPLICIT;arith `7 = 1*4 + 3`;arith `8 = 2*4 + 0`;MOD_MULT_ADD]);
3460   TYPIFY `generic V E` (C SUBGOAL_THEN ASSUME_TAC);
3461     BY(FIRST_X_ASSUM_ST `scs_generic` MP_TAC THEN ASM_REWRITE_TAC[Appendix.scs_generic]);
3462   TYPIFY `v (p+4) = v p /\ v (p+5) = v (p+1) /\ v (p+6) = v (p+2) /\ v (p+7) = v (p+3) /\ v (p+8)  = v (p)` (C SUBGOAL_THEN ASSUME_TAC);
3463     FIRST_X_ASSUM_ST `MOD` ((unlist ONCE_REWRITE_TAC) o GSYM);
3464     BY(REWRITE_TAC[arith `p+4 = 1*4 + p /\ p+5 = 1*4+(p+1) /\ p+6=1*4+(p+2) /\ p+7 = 1*4 + (p+3) /\ p+8 = 2*4 + p`;MOD_MULT_ADD]);
3465   TYPIFY `!i. &2 <= norm (v i) /\ norm (v i) <= &2 * h0` (C SUBGOAL_THEN ASSUME_TAC);
3466     GEN_TAC;
3467     REWRITE_TAC[GSYM Fnjlbxs.in_ball_annulus];
3468     BY(ASM_REWRITE_TAC[]);
3469   TYPIFY `!i j. i < 4 /\ j < 4 /\ ~(i = j) ==> &2 <= dist(v (p + i),v (p+j))` (C SUBGOAL_THEN ASSUME_TAC);
3470     REPEAT WEAKER_STRIP_TAC;
3471     MATCH_MP_TAC Ocbicby.scs_lb_2;
3472     TYPIFY `s` EXISTS_TAC;
3473     ASM_REWRITE_TAC[];
3474     GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
3475     (NUM_REDUCE_TAC);
3476     REPEAT (GMATCH_SIMP_TAC MOD_LT);
3477     BY(ASM_REWRITE_TAC[]);
3478   COMMENT "edge lengths";
3479   TYPIFY `scs_b_v39 s (p+1) ((p+1)+1) <= cstab /\ scs_b_v39 s p (p+1) = &2 * h0 /\ scs_b_v39 s (p+3) ((p+3)+1) = cstab` (C SUBGOAL_THEN ASSUME_TAC);
3480     TYPIFY `~(&2 = &2 * h0)` (C SUBGOAL_THEN ASSUME_TAC);
3481       BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
3482     CONJ2_TAC;
3483       TYPIFY `scs_a_v39 s (p+3) p = scs_a_v39 s (p+3) ((p+3)+1)` ENOUGH_TO_SHOW_TAC;
3484         BY(ASM_MESON_TAC[]);
3485       REWRITE_TAC[arith `((p+3)+1) = p+4`];
3486       FIRST_X_ASSUM_ST `is_scs_v39` MP_TAC THEN REWRITE_TAC[Appendix.is_scs_v39;LET_THM] THEN REPEAT WEAKER_STRIP_TAC;
3487       BY(ASM_MESON_TAC[Appendix.periodic2;Oxl_def.periodic]);
3488     FIRST_X_ASSUM_ST `is_scs_v39` MP_TAC THEN REWRITE_TAC[Appendix.is_scs_v39;LET_THM] THEN REPEAT WEAKER_STRIP_TAC;
3489     FIRST_X_ASSUM_ST `x <= cstab` (C INTRO_TAC [`p+1`]) THEN ASM_REWRITE_TAC[arith `3 < 4`];
3490     BY(REWRITE_TAC[arith `SUC (p+1) = (p+1)+1`]);
3491   FIRST_X_ASSUM MP_TAC THEN REWRITE_TAC[arith `((p:num) + i ) + j = p + (i+j)`] THEN NUM_REDUCE_TAC;
3492   DISCH_TAC;
3493   TYPIFY `dist(v (p+1),v(p+2)) <= cstab /\ dist(v p,v(p+1)) <= &2 * h0 /\ dist(v(p+3),v(p+4)) <= cstab` (C SUBGOAL_THEN MP_TAC);
3494     FIRST_X_ASSUM MP_TAC;
3495     FIRST_X_ASSUM_ST `scs_b_v39` MP_TAC;
3496     BY(MESON_TAC[REAL_LE_TRANS]);
3497   ASM_REWRITE_TAC[];
3498   REPEAT WEAKER_STRIP_TAC;
3499   COMMENT "collinear";
3500   TYPIFY `!i j. ~(v i = v j) ==> ~collinear {vec 0,v i, v j}` (C SUBGOAL_THEN ASSUME_TAC);
3501     REPEAT GEN_TAC THEN DISCH_TAC;
3502     MATCH_MP_TAC Zlzthic.PROPERTIES_GENERIC_LOCAL_FAN_ALT;
3503     GEXISTL_TAC [`V`;`E`;`FF`];
3504     BY(ASM_REWRITE_TAC[IN_IMAGE;IN_UNIV]);
3505   TYPIFY `!i j. i < 4 /\ j < 4 /\ ~(i = j) ==> ~(v i = v j)` (C SUBGOAL_THEN ASSUME_TAC);
3506     BY(REPLICATE_TAC 20 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[]);
3507   INTRO_TAC PERIODIC_INJ_MOD [`v`;`4`];
3508   ASM_REWRITE_TAC[arith `~(4 = 0)`];
3509   DISCH_TAC;
3510   TYPIFY `!i j. i < 4 /\ j < 4 /\ ~(i=j) ==> ~(v (p +i) = v (p+j))` (C SUBGOAL_THEN ASSUME_TAC);
3511     REPEAT WEAKER_STRIP_TAC;
3512     FIRST_X_ASSUM MP_TAC THEN ASM_REWRITE_TAC[];
3513     GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
3514     (NUM_REDUCE_TAC);
3515     REPEAT (GMATCH_SIMP_TAC MOD_LT);
3516     BY(ASM_REWRITE_TAC[]);
3517   TYPIFY `!i. 0 < i /\ i < 4 ==> ~(v (p+i) = v p)` (C SUBGOAL_THEN ASSUME_TAC);
3518     BY(FIRST_X_ASSUM MP_TAC THEN MESON_TAC[arith `p+0 = p`;arith `0< 4`;arith `0 < i ==> ~(i=0)`]);
3519   COMMENT "long diag";
3520   TYPIFY `#2.52 = &2 * h0 /\ #3.01 = cstab` (C SUBGOAL_THEN ASSUME_TAC);
3521     BY(REWRITE_TAC[Sphere.h0;Sphere.cstab] THEN REAL_ARITH_TAC);
3522   TYPIFY `#3.55 <= dist(v (p+2),v p)` ASM_CASES_TAC;
3523     INTRO_TAC ((* get_work *) Terminal.get_main_nonlinear "2073661826") [`norm (v (p+1))`;`norm(v (p+2))`;`norm(v p)`;`dist(v(p+2),v p)`;`dist(v(p+1),v p)`;`dist(v(p+1),v(p+2))`];
3524     FIRST_X_ASSUM_ST `norm x = &2` kill;
3525     REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;arith `x <= x`];
3526     ASM_REWRITE_TAC[];
3527     DISCH_THEN MP_TAC THEN ANTS_TAC;
3528       CONJ_TAC;
3529         INTRO_TAC DIST_TRIANGLE [`v (p+2)`;`(vec 0):real^3`;`v (p)`];
3530         REWRITE_TAC[DIST_0];
3531         MATCH_MP_TAC (arith `x <= &2 * h0 /\ y <= &2 * h0 ==> (d <= x + y ==> d <= &4 * h0)`);
3532         BY(ASM_REWRITE_TAC[]);
3533       CONJ2_TAC;
3534         BY(ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REWRITE_TAC[]);
3535       TYPIFY `v p = v (p+0)` (C SUBGOAL_THEN SUBST1_TAC);
3536         ONCE_REWRITE_TAC[arith `p+0=p`];
3537         BY(REWRITE_TAC[]);
3538       BY(FIRST_X_ASSUM MATCH_MP_TAC THEN NUM_REDUCE_TAC);
3539     DISCH_TAC;
3540     FIRST_X_ASSUM_ST `dihV` MP_TAC;
3541     REWRITE_TAC[arith `~(x <= y) <=> y < x`];
3542     GMATCH_SIMP_TAC (REWRITE_RULE[LET_THM] Merge_ineq.DIHV_EQ_DIH_Y);
3543     ASM_REWRITE_TAC[DIST_0];
3544     CONJ_TAC;
3545       BY(CONJ_TAC THEN (REPEAT (FIRST_X_ASSUM MATCH_MP_TAC)) THEN NUM_REDUCE_TAC);
3546     ONCE_REWRITE_TAC[Nonlinear_lemma.dih_y_sym];
3547     MATCH_MP_TAC Ocbicby.delta4_y_imp_obtuse;
3548     CONJ_TAC;
3549       BY(ASM_MESON_TAC[arith `&2 <= x==> &0 < x`]);
3550     INTRO_TAC DIST_SYM [`v p`;`v (p+2)`];
3551     DISCH_THEN SUBST1_TAC;
3552     CONJ_TAC;
3553       BY(REWRITE_TAC[REWRITE_RULE[LET_THM] Tame_lemmas.delta_y_pos]);
3554     BY(ASM_REWRITE_TAC[]);
3555   TYPIFY `!i. ~scs_is_str s v i ==> ~coplanar {vec 0, v i, v(i+1), v(i+3)}` (C SUBGOAL_THEN ASSUME_TAC);
3556     GEN_TAC THEN ASM_REWRITE_TAC[Appendix.scs_is_str;arith `SUC i = i+1`;GSYM Local_lemmas1.AZIM_COND_FOR_COPLANAR];
3557     NUM_REDUCE_TAC;
3558     DISCH_THEN (unlist REWRITE_TAC);
3559     MATCH_MP_TAC (arith `&0 < a ==> ~(a = &0)`);
3560     INTRO_TAC Ocbicby.LOCAL_FAN_AZIM_POS [`s`;`v`;`i`];
3561     BY(ASM_REWRITE_TAC[LET_THM;IN;arith `SUC i = i+1`;arith `4 - 1 = 3`]);
3562   FIRST_X_ASSUM MP_TAC THEN BURY_MP_TAC;
3563   COMMENT "short diag";
3564   INTRO_TAC Terminal.vv_split_azim_generic [`v`;`4`;`p`;`2`;`3`];
3565   ASM_REWRITE_TAC[arith `SUC p = p+1`;LET_THM];
3566   NUM_REDUCE_TAC;
3567   DISCH_TAC;
3568   TYPIFY `azim (vec 0) (v p) (v (p+1)) (v (p+3)) <= pi` (C SUBGOAL_THEN ASSUME_TAC);
3569     FIRST_X_ASSUM_ST `interior_angle1` ((unlist REWRITE_TAC) o GSYM);
3570     MATCH_MP_TAC Local_lemmas.CONVEX_LOFA_IMP_INANGLE_LE_PI;
3571     BY(ASM_REWRITE_TAC[]);
3572   TYPIFY `azim (vec 0) (v p) (v (p + 1)) (v (p + 2)) <= pi /\  azim (vec 0) (v p) (v (p + 2)) (v (p + 3)) <= pi` (C SUBGOAL_THEN ASSUME_TAC);
3573     MATCH_MP_TAC (arith `&0 < pi /\ &0 <= a /\ &0 <= b /\ a + b <= pi ==> a <= pi /\ b <= pi`);
3574     REWRITE_TAC[PI_POS];
3575     REWRITE_TAC[Counting_spheres.AZIM_NN];
3576     BY(REPLICATE_TAC 2 (POP_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
3577   FIRST_X_ASSUM_ST `scs_is_str` MP_TAC;
3578   REWRITE_TAC[Appendix.scs_is_str];
3579   ASM_REWRITE_TAC[];
3580   NUM_REDUCE_TAC;
3581   REWRITE_TAC[arith `SUC p = p+1`];
3582   DISCH_THEN (RULE_ASSUM_TAC o (unlist REWRITE_RULE));
3583   INTRO_TAC AZIM_DIHV_SAME_STRONG [`(vec 0):real^3`;`v p`;`v (p+2)`;`v (p+3)`];
3584   INTRO_TAC AZIM_DIHV_SAME_STRONG [`(vec 0):real^3`;`v p`;`v (p+1)`;`v (p+2)`];
3585   FIRST_X_ASSUM_ST `pi = a` (MP_TAC o SYM) THEN DISCH_TAC;
3586   ASM_REWRITE_TAC[];
3587   TYPIFY `~collinear {vec 0, v p, v (p + 1)} /\ ~collinear {vec 0, v p, v (p + 2)} /\  ~collinear {vec 0, v p, v (p + 3)}` (C SUBGOAL_THEN ASSUME_TAC);
3588     BY(REPEAT CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN NUM_REDUCE_TAC);
3589   ASM_REWRITE_TAC[];
3590   REPEAT WEAKER_STRIP_TAC;
3591   REPEAT (FIRST_X_ASSUM_ST `dihV` MP_TAC) THEN REWRITE_TAC[] THEN REPEAT (GMATCH_SIMP_TAC (REWRITE_RULE[LET_THM] Merge_ineq.DIHV_EQ_DIH_Y));
3592   ASM_REWRITE_TAC[];
3593   CONJ_TAC;
3594     BY(REPEAT CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN NUM_REDUCE_TAC);
3595   REPEAT WEAKER_STRIP_TAC;
3596   FIRST_X_ASSUM_ST `+` MP_TAC THEN ASM_REWRITE_TAC[];
3597   (DISCH_TAC);
3598   TYPIFY `cstab <= dist(v p,v(p+2))` (C SUBGOAL_THEN ASSUME_TAC);
3599     FIRST_X_ASSUM_ST `cstab < d` (C INTRO_TAC [`p`;`p+2`]);
3600     ANTS_TAC;
3601       REWRITE_TAC[arith `p+2 = SUC(SUC (p))`];
3602       MATCH_MP_TAC Tfitskc.SCS_DIAG_2;
3603       BY(NUM_REDUCE_TAC);
3604     BY(REAL_ARITH_TAC);
3605   INTRO_TAC (UNDISCH2 LINDIH_11) [`norm (v (p))`;`norm(v (p+3))`;`norm(v (p+2))`;`dist(v(p+3),v(p+2))`;`dist(v(p),v (p+2))`;`dist(v(p),v(p+3))`];
3606   REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;arith `x <= x`];
3607   TYPIFY `(&2 <= norm (v p) /\ norm (v p) <= &2) /\   (&2 <= norm (v (p + 3)) /\ norm (v (p + 3)) <=  #2.52) /\   (&2 <= norm (v (p + 2)) /\ norm (v (p + 2)) <=  #2.52) /\   (&2 <= dist (v (p + 3),v (p + 2)) /\ dist (v (p + 3),v (p + 2)) <= &2) /\   ( #3.01 <= dist (v p,v (p + 2)) /\ dist (v p,v (p + 2)) <=  #3.55) /\   &2 * h0 <= dist (v p,v (p + 3)) /\   dist (v p,v (p + 3)) <=  #3.01` (C SUBGOAL_THEN ASSUME_TAC);
3608     ASM_REWRITE_TAC[arith `(x <= y /\ y <= x) <=> y = x`];
3609     nCONJ_TAC 3;
3610       BY(ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REWRITE_TAC[]);
3611     ASM_REWRITE_TAC[];
3612     CONJ_TAC;
3613       BY(ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REWRITE_TAC[]);
3614     CONJ_TAC;
3615       BY(FIRST_X_ASSUM_ST `#3.55` MP_TAC THEN REWRITE_TAC[DIST_SYM] THEN REAL_ARITH_TAC);
3616     TYPIFY `scs_a_v39 s (p+3) p <= dist(v(p+3),v p) ` ENOUGH_TO_SHOW_TAC;
3617       REWRITE_TAC[DIST_SYM] THEN MATCH_MP_TAC (arith `a = b ==> (a <= d ==> b <= d)`);
3618       BY(ASM_REWRITE_TAC[]);
3619     BY(ASM_REWRITE_TAC[]);
3620   FIRST_ASSUM (unlist REWRITE_TAC);
3621   REWRITE_TAC[DE_MORGAN_THM];
3622   CONJ2_TAC;
3623     REWRITE_TAC[arith `~(d < &0) <=> &0 <= d`];
3624     FIRST_X_ASSUM_ST `coplanar` (C INTRO_TAC [`p+3`]);
3625     ANTS_TAC;
3626       BY(ASM_REWRITE_TAC[]);
3627     REWRITE_TAC[arith `(p+3) +i = p+(3+i)`] THEN NUM_REDUCE_TAC;
3628     REWRITE_TAC[Oxlzlez.coplanar_delta_y];
3629     ASM_REWRITE_TAC[DIST_SYM;DIST_0];
3630     MATCH_MP_TAC (arith `a = b ==> &0 < a ==> &0 <= b`);
3631     BY(MESON_TAC[Merge_ineq.delta_y_sym]);
3632   (DISCH_TAC);
3633   COMMENT "5550";
3634   INTRO_TAC ((* get_work *) Terminal.get_main_nonlinear "5550839403 delta") [`norm (v (p))`;`norm(v (p+1))`;`norm(v (p+2))`;`cstab`;`dist(v(p),v (p+2))`;`dist(v(p),v(p+1))`];
3635   REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;arith `x <= x`];
3636   TYPIFY `(&2 <= norm (v p) /\ norm (v p) <= &2) /\   (&2 <= norm (v (p + 1)) /\ norm (v (p + 1)) <=  #2.52) /\   (&2 <= norm (v (p + 2)) /\ norm (v (p + 2)) <=  #2.52) /\   ( #3.01 <= cstab /\ cstab <=  #3.01) /\   ( #3.01 <= dist (v p,v (p + 2)) /\ dist (v p,v (p + 2)) <=  #3.55) /\   &2 <= dist (v p,v (p + 1)) /\   dist (v p,v (p + 1)) <= &2 * h0` (C SUBGOAL_THEN ASSUME_TAC);
3637     ASM_REWRITE_TAC[arith `(x <= y /\ y <= x) <=> y = x`];
3638     FIRST_X_ASSUM_ST `&2 <= dist s` (C INTRO_TAC [`0`;`1`]);
3639     BY(REWRITE_TAC[arith `p+0=p`] THEN DISCH_THEN MATCH_MP_TAC THEN NUM_REDUCE_TAC);
3640   FIRST_ASSUM (unlist REWRITE_TAC);
3641   DISCH_TAC;
3642   INTRO_TAC ((* get_work *) Terminal.get_main_nonlinear "5550839403") [`norm (v (p))`;`norm(v (p+1))`;`norm(v (p+2))`;`cstab`;`dist(v(p),v (p+2))`;`dist(v(p),v(p+1))`];
3643   REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;arith `x <= x`];
3644   FIRST_X_ASSUM_ST `#3.01` (unlist REWRITE_TAC);
3645   DISCH_TAC;
3646   INTRO_TAC Ocbicby.dih_y_mono [`norm (v (p))`;`norm(v (p+1))`;`norm(v (p+2))`;`dist(v (p+1),v(p+2))`;`dist(v(p),v (p+2))`;`dist(v(p),v(p+1))`;`cstab`];
3647   ANTS_TAC;
3648     TYPIFY_GOAL_THEN `&0 < norm (v p)` (unlist REWRITE_TAC);
3649       BY(ASM_REWRITE_TAC[arith `&0 < &2`]);
3650     FIRST_X_ASSUM_ST `norm (v p) =  &2` kill;
3651     ASM_REWRITE_TAC[];
3652     CONJ_TAC;
3653       FIRST_X_ASSUM_ST `&2 <= dist s` (C INTRO_TAC [`1`;`2`]);
3654       BY(NUM_REDUCE_TAC THEN REAL_ARITH_TAC);
3655     CONJ2_TAC;
3656       BY(FIRST_X_ASSUM_ST `delta_y` MP_TAC THEN REAL_ARITH_TAC);
3657     FIRST_X_ASSUM_ST `coplanar` (C INTRO_TAC [`p+1`]);
3658     ANTS_TAC;
3659       BY(ASM_REWRITE_TAC[]);
3660     REWRITE_TAC[arith `(p+1) +i = p+(1+i)`] THEN NUM_REDUCE_TAC;
3661     REWRITE_TAC[Oxlzlez.coplanar_delta_y];
3662     ASM_REWRITE_TAC[DIST_SYM;DIST_0];
3663     MATCH_MP_TAC (arith `a = b ==> &0 < a ==> &0 < b`);
3664     BY(MESON_TAC[Merge_ineq.delta_y_sym]);
3665   (DISCH_TAC);
3666   TYPIFY `dih_y (norm (v p)) (norm (v (p + 3))) (norm (v (p + 2)))      (dist (v (p + 3),v (p + 2)))      (dist (v p,v (p + 2)))      (dist (v p,v (p + 3))) + dih_y (norm (v p)) (norm (v (p + 1))) (norm (v (p + 2)))      (dist (v (p + 1),v (p + 2)))      (dist (v p,v (p + 2)))      (dist (v p,v (p + 1))) < #3.1` (C SUBGOAL_THEN ASSUME_TAC);
3667     BY(REPLICATE_TAC 5 (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
3668   TYPIFY `#3.1 < pi` (C SUBGOAL_THEN ASSUME_TAC);
3669     BY(MP_TAC Flyspeck_constants.bounds THEN REAL_ARITH_TAC);
3670   FIRST_X_ASSUM_ST `a = pi` MP_TAC THEN REPLICATE_TAC 2 (POP_ASSUM MP_TAC);
3671   REWRITE_TAC[DIST_0;DIST_SYM];
3672   FIRST_X_ASSUM_ST `dist s = &2` MP_TAC;
3673   DISCH_THEN ((unlist REWRITE_TAC) o GSYM);
3674   TYPIFY `dih_y (norm (v p)) (norm (v (p + 2))) (norm (v (p + 3)))       (dist (v (p + 2),v (p + 3)))       (dist (v p,v (p + 3)))       (dist (v p,v (p + 2))) = dih_y (norm (v p)) (norm (v (p + 3))) (norm (v (p + 2))) (dist (v (p + 2),v (p + 3))) (dist (v p,v (p + 2))) (dist (v p,v (p + 3)))` (C SUBGOAL_THEN SUBST1_TAC);
3675     BY(REWRITE_TAC[Nonlinear_lemma.dih_y_sym]);
3676   BY(REAL_ARITH_TAC)
3677   ]);;
3678   (* }}} *)
3679
3680 let LEMMA_PWE4 = prove_by_refinement(
3681 (* main_work4 ==> *) ` main_nonlinear_terminal_v11 ==> (!s v p.
3682     is_scs_v39 s /\ scs_basic_v39 s /\ scs_k_v39 s = 4 /\ v IN MMs_v39 s /\ 
3683     (!i j. scs_diag 4 i j ==> scs_a_v39 s i j <= cstab /\ cstab < dist(v i,v j) /\ &4*h0 < scs_b_v39 s i j) /\
3684     (!i. (scs_a_v39 s i (i+1) = &2 /\ scs_b_v39 s i (i+1)= &2*h0) \/
3685        (scs_a_v39 s i (i+1) = &2 * h0 /\ scs_b_v39 s i (i+1)= cstab)) /\
3686       scs_generic v /\
3687     ~scs_is_str s v (p+1) /\ ~scs_is_str s v (p+3) /\
3688     scs_is_str s v p /\ norm (v p) = &2 /\
3689     scs_a_v39 s (p+3) p = &2 /\
3690     scs_a_v39 s p (p+1) = &2 * h0 /\
3691     dist(v (p+2),v(p+1)) =  &2 /\
3692     &2 * h0 <= dist(v(p+3),v(p+2)) ==>
3693     pi / &2 < dihV (vec 0) (v (p+3)) (v (p)) (v (p+2)))`,
3694   (* {{{ proof *)
3695   [
3696   REPEAT WEAKER_STRIP_TAC;
3697   REWRITE_TAC[arith `x < y <=> ~(y <= x)`] THEN DISCH_TAC;
3698   REPEAT WEAKER_STRIP_TAC;
3699   TYPIFY `BBprime2_v39 s v` (C SUBGOAL_THEN ASSUME_TAC);
3700     BY(ASM_MESON_TAC[Appendix.scs_basic;Ayqjtmd.unadorned_MMs;IN]);
3701   TYPIFY `BBprime_v39 s v` (C SUBGOAL_THEN ASSUME_TAC);
3702     BY(ASM_MESON_TAC[Appendix.BBprime2_v39]);
3703   TYPIFY `BBs_v39 s v` (C SUBGOAL_THEN ASSUME_TAC);
3704     BY(ASM_MESON_TAC[Appendix.BBprime_v39]);
3705   INTRO_TAC Appendix.BBs_v39 [`s`;`v`];
3706   ASM_REWRITE_TAC[LET_DEF;LET_END_DEF;Terminal.IMAGE_SUBSET_IN;IN_UNIV;arith `~(4 <= 3)`];
3707   REPEAT WEAKER_STRIP_TAC;
3708   TYPED_ABBREV_TAC `V = IMAGE v (:num)`;
3709   TYPED_ABBREV_TAC `E = IMAGE (\i. {v i, v (SUC i)}) (:num)`;
3710   TYPED_ABBREV_TAC `FF = IMAGE (\i. (v i,v (SUC i))) (:num)`;
3711   TYPIFY `local_fan (V,E,FF)` (C SUBGOAL_THEN ASSUME_TAC);
3712     MATCH_MP_TAC Local_lemmas.CVX_LO_IMP_LO;
3713     BY(ASM_REWRITE_TAC[]);
3714   TYPIFY `!i. v i IN V` (C SUBGOAL_THEN ASSUME_TAC);
3715     REPEAT WEAKER_STRIP_TAC;
3716     EXPAND_TAC "V";
3717     REWRITE_TAC[IN_IMAGE;IN_UNIV];
3718     BY(MESON_TAC[]);
3719   INTRO_TAC Cuxvzoz.BBs_inj [`s`;`v`;`4`];
3720   ASM_REWRITE_TAC[];
3721   DISCH_TAC;
3722   TYPIFY `!i. interior_angle1 (vec 0) FF (v i) = azim (vec 0) (v i) (v (i+1)) (v (i+3))` (C SUBGOAL_THEN ASSUME_TAC);
3723     GEN_TAC;
3724     EXPAND_TAC "FF";
3725     GMATCH_SIMP_TAC (REWRITE_RULE[LET_THM] (GSYM Ocbicby.INTERIOR_ANGLE1_AZIM));
3726     TYPIFY `s` EXISTS_TAC;
3727     BY(ASM_REWRITE_TAC[IN;arith `4 - 1 = 3`;arith `3 < 4`;arith `SUC i = i+1`]);
3728   INTRO_TAC Ocbicby.LOCAL_FAN_AZIM_POS [`s`;`v`];
3729   ASM_REWRITE_TAC[LET_THM;IN;arith `4-1 = 3`;arith `SUC i = i+1`];
3730   DISCH_TAC;
3731   TYPIFY `!i. v (i MOD 4) = v i` (C SUBGOAL_THEN ASSUME_TAC);
3732     GEN_TAC;
3733     MATCH_MP_TAC (GSYM Oxl_def.periodic_mod);
3734     BY(ASM_REWRITE_TAC[arith `~(0=4)`]);
3735   TYPIFY `v 4 = v 0 /\ v 5 = v 1 /\ v 6 = v 2 /\ v 7 = v 3 /\ v 8  = v 4` (C SUBGOAL_THEN ASSUME_TAC);
3736     FIRST_X_ASSUM ((unlist ONCE_REWRITE_TAC) o GSYM);
3737     BY(REWRITE_TAC[Terminal.MOD_4_EXPLICIT;arith `7 = 1*4 + 3`;arith `8 = 2*4 + 0`;MOD_MULT_ADD]);
3738   TYPIFY `generic V E` (C SUBGOAL_THEN ASSUME_TAC);
3739     BY(FIRST_X_ASSUM_ST `scs_generic` MP_TAC THEN ASM_REWRITE_TAC[Appendix.scs_generic]);
3740   TYPIFY `v (p+4) = v p /\ v (p+5) = v (p+1) /\ v (p+6) = v (p+2) /\ v (p+7) = v (p+3) /\ v (p+8)  = v (p)` (C SUBGOAL_THEN ASSUME_TAC);
3741     FIRST_X_ASSUM_ST `MOD` ((unlist ONCE_REWRITE_TAC) o GSYM);
3742     BY(REWRITE_TAC[arith `p+4 = 1*4 + p /\ p+5 = 1*4+(p+1) /\ p+6=1*4+(p+2) /\ p+7 = 1*4 + (p+3) /\ p+8 = 2*4 + p`;MOD_MULT_ADD]);
3743   TYPIFY `!i. &2 <= norm (v i) /\ norm (v i) <= &2 * h0` (C SUBGOAL_THEN ASSUME_TAC);
3744     GEN_TAC;
3745     REWRITE_TAC[GSYM Fnjlbxs.in_ball_annulus];
3746     BY(ASM_REWRITE_TAC[]);
3747   TYPIFY `!i j. i < 4 /\ j < 4 /\ ~(i = j) ==> &2 <= dist(v (p + i),v (p+j))` (C SUBGOAL_THEN ASSUME_TAC);
3748     REPEAT WEAKER_STRIP_TAC;
3749     MATCH_MP_TAC Ocbicby.scs_lb_2;
3750     TYPIFY `s` EXISTS_TAC;
3751     ASM_REWRITE_TAC[];
3752     GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
3753     (NUM_REDUCE_TAC);
3754     REPEAT (GMATCH_SIMP_TAC MOD_LT);
3755     BY(ASM_REWRITE_TAC[]);
3756   COMMENT "edge lengths";
3757   TYPIFY `scs_b_v39 s (p+3) ((p+3)+1) = &2 * h0 /\ scs_b_v39 s p (p+1) = cstab /\ scs_b_v39 s (p+2) ((p+2)+1) <= cstab` (C SUBGOAL_THEN ASSUME_TAC);
3758     TYPIFY `~(&2 = &2 * h0)` (C SUBGOAL_THEN ASSUME_TAC);
3759       BY(REWRITE_TAC[Sphere.h0] THEN REAL_ARITH_TAC);
3760     CONJ2_TAC;
3761       CONJ_TAC;
3762         BY(ASM_MESON_TAC[]);
3763       FIRST_X_ASSUM_ST `is_scs_v39` MP_TAC THEN REWRITE_TAC[Appendix.is_scs_v39;LET_THM] THEN REPEAT WEAKER_STRIP_TAC;
3764       FIRST_X_ASSUM_ST `scs_b_v39 s i j <= cstab` (C INTRO_TAC [`p+2`]);
3765       ASM_REWRITE_TAC[arith `SUC (p+2) = (p+2)+1`];
3766       BY(DISCH_THEN MATCH_MP_TAC THEN NUM_REDUCE_TAC);
3767     TYPIFY `scs_a_v39 s (p+3) p = scs_a_v39 s (p+3) ((p+3)+1)` ENOUGH_TO_SHOW_TAC;
3768       BY(ASM_MESON_TAC[]);
3769     REWRITE_TAC[arith `((p+3)+1) = p+4`];
3770     FIRST_X_ASSUM_ST `is_scs_v39` MP_TAC THEN REWRITE_TAC[Appendix.is_scs_v39;LET_THM] THEN REPEAT WEAKER_STRIP_TAC;
3771     BY(ASM_MESON_TAC[Appendix.periodic2;Oxl_def.periodic]);
3772   FIRST_X_ASSUM MP_TAC THEN REWRITE_TAC[arith `((p:num) + i ) + j = p + (i+j)`] THEN NUM_REDUCE_TAC;
3773   DISCH_TAC;
3774   TYPIFY `dist(v (p+3),v(p+4)) <= &2 *h0 /\ dist(v p,v(p+1)) <= cstab /\ dist(v(p+2),v(p+3)) <= cstab` (C SUBGOAL_THEN MP_TAC);
3775     FIRST_X_ASSUM MP_TAC;
3776     FIRST_X_ASSUM_ST `scs_b_v39` MP_TAC;
3777     BY(MESON_TAC[REAL_LE_TRANS]);
3778   ASM_REWRITE_TAC[];
3779   REPEAT WEAKER_STRIP_TAC;
3780   COMMENT "collinear";
3781   TYPIFY `!i j. ~(v i = v j) ==> ~collinear {vec 0,v i, v j}` (C SUBGOAL_THEN ASSUME_TAC);
3782     REPEAT GEN_TAC THEN DISCH_TAC;
3783     MATCH_MP_TAC Zlzthic.PROPERTIES_GENERIC_LOCAL_FAN_ALT;
3784     GEXISTL_TAC [`V`;`E`;`FF`];
3785     BY(ASM_REWRITE_TAC[IN_IMAGE;IN_UNIV]);
3786   TYPIFY `!i j. i < 4 /\ j < 4 /\ ~(i = j) ==> ~(v i = v j)` (C SUBGOAL_THEN ASSUME_TAC);
3787     BY(REPLICATE_TAC 20 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[]);
3788   INTRO_TAC PERIODIC_INJ_MOD [`v`;`4`];
3789   ASM_REWRITE_TAC[arith `~(4 = 0)`];
3790   DISCH_TAC;
3791   TYPIFY `!i j. i < 4 /\ j < 4 /\ ~(i=j) ==> ~(v (p +i) = v (p+j))` (C SUBGOAL_THEN ASSUME_TAC);
3792     REPEAT WEAKER_STRIP_TAC;
3793     FIRST_X_ASSUM MP_TAC THEN ASM_REWRITE_TAC[];
3794     GMATCH_SIMP_TAC Ocbicby.MOD_EQ_MOD_SHIFT;
3795     (NUM_REDUCE_TAC);
3796     REPEAT (GMATCH_SIMP_TAC MOD_LT);
3797     BY(ASM_REWRITE_TAC[]);
3798   TYPIFY `!i. 0 < i /\ i < 4 ==> ~(v (p+i) = v p)` (C SUBGOAL_THEN ASSUME_TAC);
3799     BY(FIRST_X_ASSUM MP_TAC THEN MESON_TAC[arith `p+0 = p`;arith `0< 4`;arith `0 < i ==> ~(i=0)`]);
3800   COMMENT "long diag";
3801   TYPIFY `#2.52 = &2 * h0 /\ #3.01 = cstab` (C SUBGOAL_THEN ASSUME_TAC);
3802     BY(REWRITE_TAC[Sphere.h0;Sphere.cstab] THEN REAL_ARITH_TAC);
3803   TYPIFY `#3.55 <= dist(v (p+2),v p)` ASM_CASES_TAC;
3804     INTRO_TAC ((* get_work *) Terminal.get_main_nonlinear "2073661826") [`norm (v (p+3))`;`norm(v (p+2))`;`norm(v p)`;`dist(v(p+2),v p)`;`dist(v(p+3),v p)`;`dist(v(p+3),v(p+2))`];
3805     FIRST_X_ASSUM_ST `norm x = &2` kill;
3806     REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;arith `x <= x`];
3807     ASM_REWRITE_TAC[];
3808     DISCH_THEN MP_TAC THEN ANTS_TAC;
3809       CONJ_TAC;
3810         INTRO_TAC DIST_TRIANGLE [`v (p+2)`;`(vec 0):real^3`;`v (p)`];
3811         REWRITE_TAC[DIST_0];
3812         MATCH_MP_TAC (arith `x <= &2 * h0 /\ y <= &2 * h0 ==> (d <= x + y ==> d <= &4 * h0)`);
3813         BY(ASM_REWRITE_TAC[]);
3814       CONJ2_TAC;
3815         BY(ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REWRITE_TAC[]);
3816       TYPIFY `v p = v (p+0)` (C SUBGOAL_THEN SUBST1_TAC);
3817         ONCE_REWRITE_TAC[arith `p+0=p`];
3818         BY(REWRITE_TAC[]);
3819       BY(FIRST_X_ASSUM MATCH_MP_TAC THEN NUM_REDUCE_TAC);
3820     DISCH_TAC;
3821     FIRST_X_ASSUM_ST `dihV` MP_TAC;
3822     REWRITE_TAC[arith `~(x <= y) <=> y < x`];
3823     GMATCH_SIMP_TAC (REWRITE_RULE[LET_THM] Merge_ineq.DIHV_EQ_DIH_Y);
3824     ASM_REWRITE_TAC[DIST_0];
3825     CONJ_TAC;
3826       BY(CONJ_TAC THEN (REPEAT (FIRST_X_ASSUM MATCH_MP_TAC)) THEN NUM_REDUCE_TAC);
3827     ONCE_REWRITE_TAC[Nonlinear_lemma.dih_y_sym];
3828     MATCH_MP_TAC Ocbicby.delta4_y_imp_obtuse;
3829     CONJ_TAC;
3830       BY(ASM_MESON_TAC[arith `&2 <= x==> &0 < x`]);
3831     INTRO_TAC DIST_SYM [`v p`;`v (p+2)`];
3832     DISCH_THEN SUBST1_TAC;
3833     CONJ_TAC;
3834       BY(REWRITE_TAC[REWRITE_RULE[LET_THM] Tame_lemmas.delta_y_pos]);
3835     BY(ASM_REWRITE_TAC[]);
3836   TYPIFY `!i. ~scs_is_str s v i ==> ~coplanar {vec 0, v i, v(i+1), v(i+3)}` (C SUBGOAL_THEN ASSUME_TAC);
3837     GEN_TAC THEN ASM_REWRITE_TAC[Appendix.scs_is_str;arith `SUC i = i+1`;GSYM Local_lemmas1.AZIM_COND_FOR_COPLANAR];
3838     NUM_REDUCE_TAC;
3839     DISCH_THEN (unlist REWRITE_TAC);
3840     MATCH_MP_TAC (arith `&0 < a ==> ~(a = &0)`);
3841     INTRO_TAC Ocbicby.LOCAL_FAN_AZIM_POS [`s`;`v`;`i`];
3842     BY(ASM_REWRITE_TAC[LET_THM;IN;arith `SUC i = i+1`;arith `4 - 1 = 3`]);
3843   FIRST_X_ASSUM MP_TAC THEN BURY_MP_TAC;
3844   COMMENT "short diag";
3845   INTRO_TAC Terminal.vv_split_azim_generic [`v`;`4`;`p`;`2`;`3`];
3846   ASM_REWRITE_TAC[arith `SUC p = p+1`;LET_THM];
3847   NUM_REDUCE_TAC;
3848   DISCH_TAC;
3849   TYPIFY `azim (vec 0) (v p) (v (p+1)) (v (p+3)) <= pi` (C SUBGOAL_THEN ASSUME_TAC);
3850     FIRST_X_ASSUM_ST `interior_angle1` ((unlist REWRITE_TAC) o GSYM);
3851     MATCH_MP_TAC Local_lemmas.CONVEX_LOFA_IMP_INANGLE_LE_PI;
3852     BY(ASM_REWRITE_TAC[]);
3853   TYPIFY `azim (vec 0) (v p) (v (p + 1)) (v (p + 2)) <= pi /\  azim (vec 0) (v p) (v (p + 2)) (v (p + 3)) <= pi` (C SUBGOAL_THEN ASSUME_TAC);
3854     MATCH_MP_TAC (arith `&0 < pi /\ &0 <= a /\ &0 <= b /\ a + b <= pi ==> a <= pi /\ b <= pi`);
3855     REWRITE_TAC[PI_POS];
3856     REWRITE_TAC[Counting_spheres.AZIM_NN];
3857     BY(REPLICATE_TAC 2 (POP_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
3858   FIRST_X_ASSUM_ST `scs_is_str` MP_TAC;
3859   REWRITE_TAC[Appendix.scs_is_str];
3860   ASM_REWRITE_TAC[];
3861   NUM_REDUCE_TAC;
3862   REWRITE_TAC[arith `SUC p = p+1`];
3863   DISCH_THEN (RULE_ASSUM_TAC o (unlist REWRITE_RULE));
3864   INTRO_TAC AZIM_DIHV_SAME_STRONG [`(vec 0):real^3`;`v p`;`v (p+2)`;`v (p+3)`];
3865   INTRO_TAC AZIM_DIHV_SAME_STRONG [`(vec 0):real^3`;`v p`;`v (p+1)`;`v (p+2)`];
3866   FIRST_X_ASSUM_ST `pi = a` (MP_TAC o SYM) THEN DISCH_TAC;
3867   ASM_REWRITE_TAC[];
3868   TYPIFY `~collinear {vec 0, v p, v (p + 1)} /\ ~collinear {vec 0, v p, v (p + 2)} /\  ~collinear {vec 0, v p, v (p + 3)}` (C SUBGOAL_THEN ASSUME_TAC);
3869     BY(REPEAT CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN NUM_REDUCE_TAC);
3870   ASM_REWRITE_TAC[];
3871   REPEAT WEAKER_STRIP_TAC;
3872   REPEAT (FIRST_X_ASSUM_ST `dihV` MP_TAC) THEN REWRITE_TAC[] THEN REPEAT (GMATCH_SIMP_TAC (REWRITE_RULE[LET_THM] Merge_ineq.DIHV_EQ_DIH_Y));
3873   ASM_REWRITE_TAC[];
3874   CONJ_TAC;
3875     BY(REPEAT CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN NUM_REDUCE_TAC);
3876   REPEAT WEAKER_STRIP_TAC;
3877   FIRST_X_ASSUM_ST `+` MP_TAC THEN ASM_REWRITE_TAC[];
3878   (DISCH_TAC);
3879   TYPIFY `cstab <= dist(v p,v(p+2))` (C SUBGOAL_THEN ASSUME_TAC);
3880     FIRST_X_ASSUM_ST `cstab < d` (C INTRO_TAC [`p`;`p+2`]);
3881     ANTS_TAC;
3882       REWRITE_TAC[arith `p+2 = SUC(SUC (p))`];
3883       MATCH_MP_TAC Tfitskc.SCS_DIAG_2;
3884       BY(NUM_REDUCE_TAC);
3885     BY(REAL_ARITH_TAC);
3886   INTRO_TAC (UNDISCH2 LINDIH_11) [`norm (v (p))`;`norm(v (p+1))`;`norm(v (p+2))`;`dist(v(p+1),v(p+2))`;`dist(v(p),v (p+2))`;`dist(v(p),v(p+1))`];
3887   REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;arith `x <= x`];
3888   TYPIFY `(&2 <= norm (v p) /\ norm (v p) <= &2) /\   (&2 <= norm (v (p + 1)) /\ norm (v (p + 1)) <=  #2.52) /\   (&2 <= norm (v (p + 2)) /\ norm (v (p + 2)) <=  #2.52) /\   (&2 <= dist (v (p + 1),v (p + 2)) /\ dist (v (p + 1),v (p + 2)) <= &2) /\   ( #3.01 <= dist (v p,v (p + 2)) /\ dist (v p,v (p + 2)) <=  #3.55) /\   &2 * h0 <= dist (v p,v (p + 1)) /\   dist (v p,v (p + 1)) <=  #3.01` (C SUBGOAL_THEN ASSUME_TAC);
3889     ASM_REWRITE_TAC[arith `(x <= y /\ y <= x) <=> y = x`];
3890     nCONJ_TAC 2;
3891       TYPIFY `scs_a_v39 s p (p+1) <= dist(v p,v(p+1)) ` ENOUGH_TO_SHOW_TAC;
3892         MATCH_MP_TAC (arith `a = b ==> (a <= d ==> b <= d)`);
3893         BY(ASM_REWRITE_TAC[]);
3894       BY(ASM_REWRITE_TAC[]);
3895     ASM_REWRITE_TAC[];
3896     ONCE_REWRITE_TAC[DIST_SYM];
3897     ASM_REWRITE_TAC[];
3898     BY(FIRST_X_ASSUM_ST `#3.55` MP_TAC THEN REAL_ARITH_TAC);
3899   FIRST_ASSUM (unlist REWRITE_TAC);
3900   REWRITE_TAC[DE_MORGAN_THM];
3901   CONJ2_TAC;
3902     REWRITE_TAC[arith `~(d < &0) <=> &0 <= d`];
3903     BY(REWRITE_TAC[REWRITE_RULE[LET_THM] Tame_lemmas.delta_y_pos]);
3904   (DISCH_TAC);
3905   COMMENT "5550";
3906   INTRO_TAC ((* get_work *) Terminal.get_main_nonlinear "5550839403 delta") [`norm (v (p))`;`norm(v (p+3))`;`norm(v (p+2))`;`cstab`;`dist(v(p),v (p+2))`;`dist(v(p),v(p+3))`];
3907   REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;arith `x <= x`];
3908   TYPIFY `(&2 <= norm (v p) /\ norm (v p) <= &2) /\   (&2 <= norm (v (p + 3)) /\ norm (v (p + 3)) <=  #2.52) /\   (&2 <= norm (v (p + 2)) /\ norm (v (p + 2)) <=  #2.52) /\   ( #3.01 <= cstab /\ cstab <=  #3.01) /\   ( #3.01 <= dist (v p,v (p + 2)) /\ dist (v p,v (p + 2)) <=  #3.55) /\   &2 <= dist (v p,v (p + 3)) /\   dist (v p,v (p + 3)) <= &2 * h0` (C SUBGOAL_THEN ASSUME_TAC);
3909     ASM_REWRITE_TAC[arith `(x <= y /\ y <= x) <=> y = x`];
3910     CONJ_TAC;
3911       FIRST_X_ASSUM_ST `&2 <= dist s` (C INTRO_TAC [`0`;`3`]);
3912       BY(REWRITE_TAC[arith `p+0=p`] THEN DISCH_THEN MATCH_MP_TAC THEN NUM_REDUCE_TAC);
3913     BY(ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REWRITE_TAC[]);
3914   FIRST_ASSUM (unlist REWRITE_TAC);
3915   DISCH_TAC;
3916   INTRO_TAC ((* get_work *) Terminal.get_main_nonlinear "5550839403") [`norm (v (p))`;`norm(v (p+3))`;`norm(v (p+2))`;`cstab`;`dist(v(p),v (p+2))`;`dist(v(p),v(p+3))`];
3917   REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> a /\ b ==> c`;arith `x <= x`];
3918   FIRST_X_ASSUM_ST `#3.01` (unlist REWRITE_TAC);
3919   DISCH_TAC;
3920   INTRO_TAC Ocbicby.dih_y_mono [`norm (v (p))`;`norm(v (p+3))`;`norm(v (p+2))`;`dist(v (p+3),v(p+2))`;`dist(v(p),v (p+2))`;`dist(v(p),v(p+3))`;`cstab`];
3921   ANTS_TAC;
3922     TYPIFY_GOAL_THEN `&0 < norm (v p)` (unlist REWRITE_TAC);
3923       BY(ASM_REWRITE_TAC[arith `&0 < &2`]);
3924     FIRST_X_ASSUM_ST `norm (v p) =  &2` kill;
3925     ASM_REWRITE_TAC[];
3926     CONJ_TAC;
3927       BY(ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REWRITE_TAC[]);
3928     CONJ_TAC;
3929       FIRST_X_ASSUM_ST `&2 <= dist s` (C INTRO_TAC [`3`;`2`]);
3930       BY(NUM_REDUCE_TAC THEN REAL_ARITH_TAC);
3931     CONJ2_TAC;
3932       BY(FIRST_X_ASSUM_ST `delta_y` MP_TAC THEN REAL_ARITH_TAC);
3933     FIRST_X_ASSUM_ST `coplanar` (C INTRO_TAC [`p+3`]);
3934     ANTS_TAC;
3935       BY(ASM_REWRITE_TAC[]);
3936     REWRITE_TAC[arith `(p+3) +i = p+(3+i)`] THEN NUM_REDUCE_TAC;
3937     REWRITE_TAC[Oxlzlez.coplanar_delta_y];
3938     ASM_REWRITE_TAC[DIST_SYM;DIST_0];
3939     MATCH_MP_TAC (arith `a = b ==> &0 < a ==> &0 < b`);
3940     BY(MESON_TAC[Merge_ineq.delta_y_sym]);
3941   (DISCH_TAC);
3942   TYPIFY `dih_y (norm (v p)) (norm (v (p + 3))) (norm (v (p + 2)))      (dist (v (p + 3),v (p + 2)))      (dist (v p,v (p + 2)))      (dist (v p,v (p + 3))) + dih_y (norm (v p)) (norm (v (p + 1))) (norm (v (p + 2)))      (dist (v (p + 1),v (p + 2)))      (dist (v p,v (p + 2)))      (dist (v p,v (p + 1))) < #3.1` (C SUBGOAL_THEN ASSUME_TAC);
3943     BY(REPLICATE_TAC 5 (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
3944   TYPIFY `#3.1 < pi` (C SUBGOAL_THEN ASSUME_TAC);
3945     BY(MP_TAC Flyspeck_constants.bounds THEN REAL_ARITH_TAC);
3946   FIRST_X_ASSUM_ST `a = pi` MP_TAC THEN REPLICATE_TAC 2 (POP_ASSUM MP_TAC);
3947   REWRITE_TAC[DIST_0;DIST_SYM];
3948   TYPIFY `dih_y (norm (v p)) (norm (v (p + 2))) (norm (v (p + 3)))       (dist (v (p + 2),v (p + 3)))       (dist (v p,v (p + 3)))       (dist (v p,v (p + 2))) = dih_y (norm (v p)) (norm (v (p + 3))) (norm (v (p + 2))) (dist (v (p + 2),v (p + 3))) (dist (v p,v (p + 2))) (dist (v p,v (p + 3)))` (C SUBGOAL_THEN SUBST1_TAC);
3949     BY(REWRITE_TAC[Nonlinear_lemma.dih_y_sym]);
3950   BY(REAL_ARITH_TAC)
3951   ]);;
3952   (* }}} *)
3953
3954 end;;