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