1 (* ========================================================================== *)
2 (* FLYSPECK - BOOK FORMALIZATION *)
3 (* Section: Appendix, Main Estimate, check_completeness *)
4 (* Chapter: Local Fan *)
6 (* Author: Thomas Hales *)
8 (* ========================================================================== *)
12 module Cuxvzoz = struct
16 let LET_THM = CONJ LET_DEF LET_END_DEF;;
18 let VV_SUC_EQ_IVS_RHO_NODE_PRIME = prove_by_refinement(
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 /\
28 ==> (ivs_rho_node1 FF u = vv (p1 + (k-1)))`,
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;
41 REWRITE_TAC[IN_IMAGE;IN_UNIV];
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;
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;
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)`];
53 DISCH_THEN (C INTRO_TAC [`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])
61 let PQCSXWG1_SYM = prove_by_refinement(
62 `!v0 v1 v2 v3 x1 x2 x3 x4 x5 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`,
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;
85 RULE_ASSUM_TAC(ONCE_REWRITE_RULE[EQ_SYM_EQ]);
89 FIRST_X_ASSUM_ST `collinear` MP_TAC;
90 MATCH_MP_TAC (TAUT `(a = b) ==> (a ==> b)`);
93 FIRST_X_ASSUM_ST `delta_x` MP_TAC;
94 BY(MESON_TAC[Merge_ineq.delta_x_sym]);
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)`,
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);
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);
109 BY(ASM_REWRITE_TAC[REAL_ENTIRE])
113 let simplex_unique = prove_by_refinement(
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))) ==>
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`];
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];
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;
144 TYPIFY `t1' = t1 /\ t2' = t2` ENOUGH_TO_SHOW_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]);
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 );
155 REWRITE_TAC[CONJ_ASSOC];
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)`);
167 TYPIFY `t3' = t3` (C SUBGOAL_THEN ASSUME_TAC);
168 FIRST_X_ASSUM DISJ_CASES_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;
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];
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)`];
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];
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 );
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];
218 let re_eqvl_pos_pos = prove_by_refinement(
219 `!a b. &0 < a /\ &0 < b ==> re_eqvl a b`,
222 REWRITE_TAC[Trigonometry2.re_eqvl];
223 REPEAT WEAKER_STRIP_TAC;
224 TYPIFY `a/b` EXISTS_TAC;
225 GMATCH_SIMP_TAC REAL_LT_DIV;
227 Calc_derivative.CALC_ID_TAC;
228 BY(ASM_TAC THEN REAL_ARITH_TAC)
232 let mk_simplex_uniq = prove_by_refinement(
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`,
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;
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]);
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;
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)`);
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'))`,
273 REWRITE_TAC[real_continuous_atreal];
274 REPEAT WEAKER_STRIP_TAC;
275 FIRST_X_ASSUM (C INTRO_TAC [`f t`]);
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'`]);
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'))`,
290 REPEAT WEAKER_STRIP_TAC;
291 TYPIFY `if e <= e' then e else e'` EXISTS_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)
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''))`,
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[])
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'''))`,
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[])
322 let deform_simplex_decrease_edge23 = prove_by_refinement(
323 `!V g01 g12 v0 v1 v2 e.
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
333 (?e'. &0 < e' /\ deformation f V (-- e', e') /\
334 (!v t. ~(v = v1) ==> f v t = v) /\
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)))))`,
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);
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;
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`];
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;
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;
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;
406 REWRITE_TAC[CONJ_ASSOC] THEN CONJ2_TAC;
410 FIRST_X_ASSUM_ST `delta_x` (C INTRO_TAC [`t`]);
412 BY(MESON_TAC[Merge_ineq.delta_x_sym]);
414 REWRITE_TAC[GSYM Trigonometry2.NOT_ZERO_EQ_POW2_LT];
415 REWRITE_TAC[GSYM DIST_0];
416 REWRITE_TAC[DIST_EQ_0];
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`];
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];
435 DISCH_THEN MATCH_MP_TAC;
437 REWRITE_TAC[DIST_0;DIST_SYM];
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);
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];
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`);
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`]);
471 REPEAT (GMATCH_SIMP_TAC (GSYM Collect_geom.EQ_POW2_COND));
472 REWRITE_TAC[DIST_POS_LE];
473 REWRITE_TAC[NORM_POS_LE];
475 BY(ASM_MESON_TAC[arith `&0 < x ==> &0 <= x`]);
477 BY(ASM_MESON_TAC[arith `&0 < x ==> &0 <= x`]);
478 DISCH_THEN (unlist REWRITE_TAC);
479 BY(MESON_TAC[DIST_SYM;DIST_0]);
481 REPEAT WEAKER_STRIP_TAC;
483 BY(ASM_REWRITE_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;
494 FIRST_X_ASSUM MATCH_MP_TAC;
496 ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`];
497 FIRST_X_ASSUM MATCH_MP_TAC;
499 TYPIFY `f v = (\t. v)` (C SUBGOAL_THEN SUBST1_TAC);
500 REWRITE_TAC[FUN_EQ_THM];
502 FIRST_X_ASSUM MATCH_MP_TAC;
503 BY(ASM_REWRITE_TAC[]);
504 BY(REWRITE_TAC[CONTINUOUS_CONST])
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
515 (?e'. &0 < e' /\ deformation f V (-- e', e') /\
516 (!v t. ~(v = v1) ==> f v t = v) /\
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))))`,
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`];
529 BY(REWRITE_TAC[LET_DEF;LET_END_DEF])
533 let deform_simplex_684_pent = prove_by_refinement(
534 `!V g23 v0 v1 v2 v3 e.
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
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)) /\
549 (?e'. &0 < e' /\ deformation f V (-- e', e') /\
550 (!v t. ~(v = v1) /\ ~(v = v2) ==> f v t = v) /\
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)
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);
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;
615 REWRITE_TAC[CONJ_ASSOC] THEN CONJ2_TAC;
621 FIRST_X_ASSUM_ST `delta_x` (C INTRO_TAC [`t`]);
623 BY(MESON_TAC[Merge_ineq.delta_x_sym]);
625 REWRITE_TAC[GSYM Trigonometry2.NOT_ZERO_EQ_POW2_LT];
626 REWRITE_TAC[GSYM DIST_0];
627 REWRITE_TAC[DIST_EQ_0];
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];
650 DISCH_THEN MATCH_MP_TAC;
652 REWRITE_TAC[DIST_0;DIST_SYM];
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);
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];
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`);
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);
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;
689 REWRITE_TAC[CONJ_ASSOC] THEN CONJ2_TAC;
692 TYPIFY_GOAL_THEN `~(v1 = v2)` (unlist REWRITE_TAC);
693 BY(ASM_MESON_TAC[Planarity.notcoplanar_disjoint]);
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]);
706 REWRITE_TAC[GSYM Trigonometry2.NOT_ZERO_EQ_POW2_LT];
707 REWRITE_TAC[GSYM DIST_0;DIST_SYM];
708 REWRITE_TAC[DIST_EQ_0];
710 FIRST_X_ASSUM_ST `coplanar` (C INTRO_TAC [`t`]);
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;
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];
727 TYPIFY_GOAL_THEN `~(v1 = v2)` (unlist REWRITE_TAC);
728 BY(ASM_MESON_TAC[Planarity.notcoplanar_disjoint]);
729 DISCH_THEN MATCH_MP_TAC;
731 REWRITE_TAC[DIST_0;DIST_SYM];
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;
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`]));
747 REPEAT (GMATCH_SIMP_TAC (GSYM Collect_geom.EQ_POW2_COND));
748 REWRITE_TAC[DIST_POS_LE;NORM_POS_LE];
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]);
756 REPEAT WEAKER_STRIP_TAC;
758 BY(ASM_REWRITE_TAC[]);
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);
766 TYPIFY `f1 v2 (&0) = v2` (C SUBGOAL_THEN SUBST1_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}`];
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`);
778 COMMENT "end insert";
780 REPEAT WEAKER_STRIP_TAC;
781 TYPIFY `v = v2` ASM_CASES_TAC;
783 TYPIFY `v = v1` ASM_CASES_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;
790 TYPIFY `v = v2` ASM_CASES_TAC;
791 FIRST_X_ASSUM_ST `f (v2:real^3) = f1 v2` kill;
793 FIRST_X_ASSUM MATCH_MP_TAC;
794 ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`];
796 TYPIFY `f v = (\t. v)` (C SUBGOAL_THEN SUBST1_TAC);
797 REWRITE_TAC[FUN_EQ_THM];
799 FIRST_X_ASSUM MATCH_MP_TAC;
800 BY(ASM_REWRITE_TAC[]);
801 BY(REWRITE_TAC[CONTINUOUS_CONST])
805 let deform_684_pent_exists = prove_by_refinement(
806 `!V g23 v0 v1 v2 v3 e. ?f.
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)) /\
814 (?e'. &0 < e' /\ deformation f V (-- e', e') /\
815 (!v t. ~(v = v1) /\ ~(v = v2) ==> f v t = v) /\
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)
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`];
835 BY((ASM_REWRITE_TAC[LET_DEF;LET_END_DEF]))
839 let mk_planar_unique = prove_by_refinement(
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))) ==>
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);
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];
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);
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];
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;
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}`];
881 REPEAT WEAKER_STRIP_TAC;
882 INTRO_TAC Ckqowsa_4_points.in_affine_hull_lemma [`v1`;`v2`;`u`];
885 REPEAT WEAKER_STRIP_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);
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];
895 FIRST_X_ASSUM_ST `~` MP_TAC;
896 FIRST_X_ASSUM DISJ_CASES_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'`]);
903 REPEAT WEAKER_STRIP_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 );
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;
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]);
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];
926 REWRITE_TAC[GSYM REAL_EQ_SQUARE_ABS];
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);
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];
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;
956 ONCE_REWRITE_TAC[DIST_SYM];
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`];
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}`])
974 let mk_planar2_continuous = prove_by_refinement(
975 `!v0 v1 v2 x1 x2 x3 x5 x6 a s.
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)`,
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;
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]))
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)`,
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}`];
1015 BY(ASM_TAC THEN INT_ARITH_TAC);
1017 TYPIFY `v3 IN affine hull {vec 0,v1,v2}` (C SUBGOAL_THEN ASSUME_TAC);
1019 MATCH_MP_TAC Marchal_cells_2_new.IN_AFFINE_KY_LEMMA1;
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`];
1026 BY(VECTOR_ARITH_TAC)
1030 let deform_planar = prove_by_refinement(
1031 `!V g01 g02 g23 v0 v1 v2 v3 e.
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
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) /\
1044 g23 real_continuous_on (real_interval (--e,e)) /\
1046 g01 real_continuous_on (real_interval (--e,e)) /\
1048 g02 real_continuous_on (real_interval (--e,e)) /\
1051 (?e'. &0 < e' /\ deformation f V (-- e', e') /\
1052 (!v t. ~(v = v1) /\ ~(v = v2) ==> f v t = v) /\
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)
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);
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`];
1102 FIRST_X_ASSUM_ST `(a cross b) dot (c cross d)` MP_TAC;
1103 ASM_REWRITE_TAC[DOT_LZERO];
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;
1137 REWRITE_TAC[CONJ_ASSOC] THEN CONJ2_TAC;
1143 FIRST_X_ASSUM_ST `delta_x` (C INTRO_TAC [`t`]);
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];
1168 DISCH_THEN MATCH_MP_TAC;
1170 REWRITE_TAC[DIST_0;DIST_SYM];
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);
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];
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`);
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;
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);
1216 FIRST_X_ASSUM MATCH_MP_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];
1230 DISCH_THEN MATCH_MP_TAC;
1232 REWRITE_TAC[DIST_0;DIST_SYM];
1233 REWRITE_TAC[GSYM Trigonometry2.NOT_ZERO_EQ_POW2_LT];
1234 REWRITE_TAC[NORM_EQ_0];
1237 FIRST_X_ASSUM MP_TAC;
1240 TYPIFY `(\t. f1 v2 t) = f1 v2` (C SUBGOAL_THEN SUBST1_TAC);
1241 BY(REWRITE_TAC[FUN_EQ_THM]);
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);
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;
1254 REWRITE_TAC[CONJ_ASSOC] THEN CONJ2_TAC;
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]);
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];
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;
1278 REPLICATE_TAC 2 (FIRST_X_ASSUM_ST `cross` (C INTRO_TAC [`t`]));
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);
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]);
1293 REPEAT WEAKER_STRIP_TAC;
1295 BY(ASM_REWRITE_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);
1305 FIRST_X_ASSUM_ST `coplanar` (C INTRO_TAC [`&0`]);
1308 BY(ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`] THEN ASM_REWRITE_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`]);
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;
1320 INTRO_TAC collinear_expand [`v0`;`v1`;`v2`];
1322 REPEAT WEAKER_STRIP_TAC;
1323 FIRST_X_ASSUM_ST `cross` MP_TAC;
1324 ASM_REWRITE_TAC[CROSS_RADD;CROSS_RMUL;CROSS_REFL];
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];
1334 REWRITE_TAC[CROSS_EQ_0];
1335 ONCE_REWRITE_TAC[SET_RULE `{a,b,c} = {a,c,b}`];
1336 BY(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;
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;
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];
1367 FIRST_X_ASSUM MATCH_MP_TAC;
1368 BY(ASM_REWRITE_TAC[]);
1369 BY(REWRITE_TAC[CONTINUOUS_CONST])
1373 let deform_planar_exists = prove_by_refinement(
1374 `!V g01 g02 g23 v0 v1 v2 v3 e. ?f.
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) /\
1380 g23 real_continuous_on (real_interval (--e,e)) /\
1382 g01 real_continuous_on (real_interval (--e,e)) /\
1384 g02 real_continuous_on (real_interval (--e,e)) /\
1387 (?e'. &0 < e' /\ deformation f V (-- e', e') /\
1388 (!v t. ~(v = v1) /\ ~(v = v2) ==> f v t = v) /\
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)
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`];
1413 let deform_planar_second_version = prove_by_refinement(
1414 `!V g12 g02 g23 v0 v1 v2 v3 e.
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
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) /\
1427 g23 real_continuous_on (real_interval (--e,e)) /\
1429 g12 real_continuous_on (real_interval (--e,e)) /\
1431 g02 real_continuous_on (real_interval (--e,e)) /\
1434 (?e'. &0 < e' /\ deformation f V (-- e', e') /\
1435 (!v t. ~(v = v1) /\ ~(v = v2) ==> f v t = v) /\
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)
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);
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];
1484 FIRST_X_ASSUM_ST `(a cross b) dot (c cross d)` MP_TAC;
1485 ASM_REWRITE_TAC[DOT_LZERO];
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;
1519 REWRITE_TAC[CONJ_ASSOC] THEN CONJ2_TAC;
1525 FIRST_X_ASSUM_ST `delta_x` (C INTRO_TAC [`t`]);
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];
1547 DISCH_THEN MATCH_MP_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);
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];
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`);
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;
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);
1593 FIRST_X_ASSUM MATCH_MP_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];
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`]);
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];
1618 FIRST_X_ASSUM MP_TAC;
1621 TYPIFY `(\t. f1 v2 t) = f1 v2` (C SUBGOAL_THEN SUBST1_TAC);
1622 BY(REWRITE_TAC[FUN_EQ_THM]);
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);
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;
1635 REWRITE_TAC[CONJ_ASSOC] THEN CONJ2_TAC;
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[]);
1644 FIRST_X_ASSUM_ST `ups_x` (C INTRO_TAC [`t`]);
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];
1654 ONCE_REWRITE_TAC[SET_RULE `{a,b,c} = {a,c,b}`];
1655 BY(ASM_MESON_TAC[Planarity.notcoplanar_imp_notcollinear_fan]);
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;
1666 REPLICATE_TAC 2 (FIRST_X_ASSUM_ST `cross` (C INTRO_TAC [`t`]));
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);
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]);
1681 REPEAT WEAKER_STRIP_TAC;
1683 BY(ASM_REWRITE_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);
1693 FIRST_X_ASSUM_ST `coplanar` (C INTRO_TAC [`&0`]);
1696 BY(ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,c,d,b}`] THEN ASM_REWRITE_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`]);
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;
1709 INTRO_TAC collinear_expand [`v1`;`v2`;`v0`];
1710 ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,d,b,c}`];
1712 REPEAT WEAKER_STRIP_TAC;
1713 FIRST_X_ASSUM_ST `cross` MP_TAC;
1714 ASM_REWRITE_TAC[CROSS_RADD;CROSS_RMUL;CROSS_REFL];
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];
1724 REWRITE_TAC[CROSS_EQ_0];
1725 BY(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;
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;
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];
1756 FIRST_X_ASSUM MATCH_MP_TAC;
1757 BY(ASM_REWRITE_TAC[]);
1758 BY(REWRITE_TAC[CONTINUOUS_CONST])
1762 let deform_planar_exists_second_version = prove_by_refinement(
1763 `!V g12 g02 g23 v0 v1 v2 v3 e. ?f.
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) /\
1769 g23 real_continuous_on (real_interval (--e,e)) /\
1771 g12 real_continuous_on (real_interval (--e,e)) /\
1773 g02 real_continuous_on (real_interval (--e,e)) /\
1776 (?e'. &0 < e' /\ deformation f V (-- e', e') /\
1777 (!v t. ~(v = v1) /\ ~(v = v2) ==> f v t = v) /\
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)
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`];
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)))`,
1807 REPEAT WEAKER_STRIP_TAC;
1808 REWRITE_TAC[TAUT `(a <=> b) <=> ((b ==> a) /\ (a ==> b))`];
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];
1816 BY(ASM_MESON_TAC[arith `t < e1 /\ e1 <= e' ==> t < e'`]);
1818 BY(ASM_MESON_TAC[]);
1819 REPEAT WEAKER_STRIP_TAC;
1820 TYPIFY `e1` EXISTS_TAC;
1822 MATCH_MP_TAC Terminal.periodic_mod_reduce;
1823 TYPIFY `k` EXISTS_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];
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)))`,
1839 REPEAT WEAKER_STRIP_TAC;
1840 REWRITE_TAC[TAUT `(a <=> b) <=> ((b ==> a) /\ (a ==> b))`];
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];
1848 BY(ASM_MESON_TAC[arith `t < e1 /\ e1 <= e' ==> t < e'`]);
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)))`];
1852 GMATCH_SIMP_TAC (GSYM Zlzthic.SKOLEM_EPSILON);
1853 REWRITE_TAC[FINITE_NUMSEG];
1855 BY(ASM_MESON_TAC[arith `t < e1 /\ e1 <= e' ==> t < e'`]);
1857 BY(ASM_MESON_TAC[]);
1858 REPEAT WEAKER_STRIP_TAC;
1859 TYPIFY `e1` EXISTS_TAC;
1861 BY(ASM_REWRITE_TAC[]);
1863 MATCH_MP_TAC Terminal.periodic2_mod_reduce;
1864 TYPIFY `k` EXISTS_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];
1875 let scs_k_bounds = prove_by_refinement(
1876 `!s. is_scs_v39 s ==> 3 <= scs_k_v39 s /\ scs_k_v39 s <= 6`,
1879 BY(REWRITE_TAC[Appendix.is_scs_v39] THEN REPEAT WEAKER_STRIP_TAC THEN ASM_REWRITE_TAC[])
1883 let deformation_BBs = prove_by_refinement(
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)
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)))
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);
1913 FIRST_X_ASSUM_ST `periodic` MP_TAC;
1914 REWRITE_TAC[Oxl_def.periodic];
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;
1923 TYPIFY `k` EXISTS_TAC;
1925 BY(ASM_MESON_TAC[scs_k_bounds;arith `3 <= k ==> ~(k=0)`]);
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[]);
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;
1943 TYPIFY `k` EXISTS_TAC;
1945 BY(ASM_MESON_TAC[scs_k_bounds;arith `3 <= k ==> ~(k=0)`]);
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[]);
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;
1962 REPEAT WEAKER_STRIP_TAC;
1964 FIRST_X_ASSUM_ST `ball_annulus` MP_TAC;
1965 REWRITE_TAC[Terminal.IMAGE_SUBSET_IN;IN_UNIV;Fnjlbxs.in_ball_annulus];
1969 FIRST_X_ASSUM MATCH_MP_TAC;
1971 FIRST_X_ASSUM MATCH_MP_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];
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);
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];
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]);
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`];
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`]);
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`];
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)`;
2021 BY(MESON_TAC[arith `&0 < &1`]);
2023 INTRO_TAC Zlzthic.ZLZTHIC [`-- e`;`e`;`V`;`E`;`FF`;`f`];
2024 MATCH_MP_TAC (TAUT (`(b ==> c) /\ a ==> ((a ==> b) ==> c)`));
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`]);
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]);
2040 BY(ASM_MESON_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;
2047 BY(REWRITE_TAC[IN_IMAGE;IN_UNIV]);
2048 REPEAT WEAKER_STRIP_TAC;
2050 FIRST_X_ASSUM MATCH_MP_TAC;
2052 BY(REPLICATE_TAC 2 (FIRST_X_ASSUM MP_TAC) THEN MESON_TAC[])
2056 let vv_azim_le_alt = prove_by_refinement(
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
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))))`,
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`];
2076 DISCH_THEN (C INTRO_TAC [`vv j`]);
2079 INTRO_TAC Terminal.vv_rho_node1 [`vv`;`k`];
2080 REWRITE_TAC[LET_DEF;LET_END_DEF];
2082 BY(ASM_REWRITE_TAC[]);
2083 DISCH_THEN (unlist REWRITE_TAC);
2084 GMATCH_SIMP_TAC Terminal.EE_vv;
2085 TYPIFY `k` EXISTS_TAC;
2087 REWRITE_TAC[Local_lemmas.AZIM_CYCLE_TWO_POINT_SET];
2091 let vv_split_azim_alt = prove_by_refinement(
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))))`,
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];
2114 BY(ASM_REWRITE_TAC[]);
2116 MATCH_MP_TAC Fan.sum4_azim_fan;
2121 (* vv_split_azim_generic_alt -> Terminal.vv_split_azim_generic *)
2123 let interior_angle1_azim = prove_by_refinement(
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)`,
2129 REPEAT WEAKER_STRIP_TAC;
2130 GMATCH_SIMP_TAC Zlzthic.LOFA_IMP_INANGLE_EQ_AZIM;
2131 TYPIFY `E` EXISTS_TAC;
2133 BY(ASM_MESON_TAC[]);
2134 BY(ASM_MESON_TAC[Local_lemmas1.AZIM_IN_FAN_RHOND_IVS_RHOND])
2138 (* Ocbicby.INTERIOR_ANGLE1_AZIM *)
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)) `,
2145 REPEAT WEAKER_STRIP_TAC;
2146 GMATCH_SIMP_TAC Zlzthic.LOFA_IMP_INANGLE_EQ_AZIM;
2147 TYPIFY `E` EXISTS_TAC;
2149 BY(ASM_MESON_TAC[]);
2150 BY(ASM_MESON_TAC[Local_lemmas1.AZIM_IN_FAN_RHOND_IVS_RHOND])
2154 let BBs_inj = prove_by_refinement(
2158 BBs_v39 s v ==> (!i j. i < k /\ j < k /\ v i = v j ==> i = j)`,
2161 REPEAT WEAKER_STRIP_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])
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`,
2173 REPEAT WEAKER_STRIP_TAC;
2174 BY((REWRITE_TAC[EXTENSION;IN_IMAGE;EXISTS_PAIR_THM]))
2178 let interior_angle1_azim_scs = prove_by_refinement(
2180 (let V = IMAGE v (:num) in
2181 let FF = IMAGE (\i. v i,v (SUC i)) (:num) in
2184 deformation f V (-- e, 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)))))`,
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`];
2205 BY(ASM_REWRITE_TAC[]);
2206 REPEAT WEAKER_STRIP_TAC;
2207 TYPIFY `v i IN V` (C SUBGOAL_THEN ASSUME_TAC);
2209 REWRITE_TAC[IN_IMAGE;IN_UNIV];
2211 INTRO_TAC Zlzthic.deformation_rho_node1_equivariant1 [`f`;`V`;`E`;`FF`;`-- e`;`e`;`v i`];
2214 INTRO_TAC Zlzthic.deformation_ivs_rho_node1_equivariant1 [`f`;`V`;`E`;`FF`;`-- e`;`e`;`v i`];
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`];
2226 REWRITE_TAC[GSYM IMAGE_o];
2227 REWRITE_TAC[IN_IMAGE;IN_UNIV;o_THM];
2229 DISCH_THEN SUBST1_TAC;
2230 REPLICATE_TAC 2 (FIRST_X_ASSUM (SUBST1_TAC o GSYM));
2231 INTRO_TAC BBs_inj [`s`;`v`;`k`];
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`];
2245 BY(ASM_SIMP_TAC[arith `3 < k==> ~(k <= 3)`;arith `SUC i = i +1`])
2249 let deformation_BBs_ALT = prove_by_refinement(
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)))
2269 REPEAT WEAKER_STRIP_TAC;
2270 MATCH_MP_TAC deformation_BBs;
2271 TYPIFY `k` EXISTS_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];
2279 GMATCH_SIMP_TAC SKOLEM_PERIODIC;
2281 TYPIFY `k` EXISTS_TAC;
2282 ASM_SIMP_TAC[arith `3 < k ==> ~(k=0)`];
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);
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;
2298 TYPIFY `k` EXISTS_TAC;
2299 ASM_SIMP_TAC[arith `3 < k ==> ~(k=0)`];
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;
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;
2315 REWRITE_TAC[IN_REAL_INTERVAL];
2316 BY(ASM_SIMP_TAC[arith `&0 < e ==> -- e < &0`]);
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`]);
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;
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[]);
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])
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)`,
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`];
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`,
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])
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'`,
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`];
2387 BY(ASM_TAC THEN REAL_ARITH_TAC)
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)))`;;
2399 let I_IMP = prove_by_refinement(
2400 `!(x:bool). I x ==> x`,
2403 BY(REWRITE_TAC[I_THM])
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))`,
2411 REWRITE_TAC[Appendix.psort;LET_THM];
2413 BY(REPEAT COND_CASES_TAC THEN REWRITE_TAC[PAIR_EQ] THEN DISCH_THEN (unlist ASM_REWRITE_TAC))
2417 let a_assumption_reduction = prove_by_refinement(
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))))
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))))
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);
2449 MATCH_MP_TAC (GSYM Oxl_def.periodic_mod);
2450 BY(ASM_REWRITE_TAC[]);
2451 INTRO_TAC BBs_inj [`s`;`v`;`k`];
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";
2458 MATCH_MP_TAC Terminal.periodic2_mod_reduce;
2459 TYPIFY `k` EXISTS_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`]);
2469 REPEAT WEAKER_STRIP_TAC;
2470 TYPIFY `e1''` EXISTS_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;
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";
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;
2514 BY(REWRITE_TAC[DIST_POS_LE]);
2515 TYPIFY `e1` EXISTS_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;
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[])
2541 let b_assumption_reduction = prove_by_refinement(
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))))
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)))
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);
2574 MATCH_MP_TAC (GSYM Oxl_def.periodic_mod);
2575 BY(ASM_REWRITE_TAC[]);
2576 INTRO_TAC BBs_inj [`s`;`v`;`k`];
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";
2583 MATCH_MP_TAC Terminal.periodic2_mod_reduce;
2584 TYPIFY `k` EXISTS_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`]);
2594 REPEAT WEAKER_STRIP_TAC;
2595 TYPIFY `e1''` EXISTS_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;
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`]);
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";
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;
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;
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[])
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`,
2678 BY(MESON_TAC[MOD_ADD_MOD])
2682 let WNWSHJT_ALT = prove_by_refinement(
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 ==>
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))`,
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);
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]);
2712 BY(ASM_REWRITE_TAC[GSYM Zlzthic.azim_pos_iff_nz]);
2714 FIRST_X_ASSUM (C INTRO_TAC [`c`;`-- &1`]);
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`]);
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'`];
2727 let azim_assumption_reduction = prove_by_refinement(
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 \/
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 \/
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)))))
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
2766 ==> azim (vec 0) (f (v i) t) (f (v (i + 1)) t)
2767 (f (v (i + k - 1)) t) <=
2771 ==> azim (vec 0) (v (p1 + k - 1)) (f (v p1) t)
2773 azim (vec 0) (v (p1 + k - 1)) (f (v p1) t)
2775 azim (vec 0) (v (p1 + k - 1)) (v (p1 + 1))
2777 azim (vec 0) (v (p1 + 1)) (v (p1 + 2)) (f (v p1) t) =
2778 azim (vec 0) (v (p1 + 1)) (v (p1 + 2))
2780 azim (vec 0) (v (p1 + 1)) (v (p1 + k - 1))
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))
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);
2798 MATCH_MP_TAC (GSYM Oxl_def.periodic_mod);
2799 BY(ASM_REWRITE_TAC[]);
2800 INTRO_TAC BBs_inj [`s`;`v`;`k`];
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);
2807 FIRST_X_ASSUM_ST `BBs_v39` MP_TAC THEN ASM_REWRITE_TAC[LET_THM;Appendix.BBs_v39];
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";
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;
2819 BY(FIRST_X_ASSUM_ST `3 <k` MP_TAC THEN ARITH_TAC);
2821 COMMENT "second addition";
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;
2829 BY(FIRST_X_ASSUM_ST `3 <k` MP_TAC THEN ARITH_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[]);
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[]);
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[]);
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`];
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[]);
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`];
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[]);
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];
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]);
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;
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)`];
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'`]);
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`];
2915 MATCH_MP_TAC (REWRITE_RULE[LET_THM] Terminal.convex_local_fan_azim_le_pi);
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));
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}`]);
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))`];
2930 ASM_REWRITE_TAC[arith `a < pi - b <=> a + b < pi`];
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];
2937 BY(FIRST_X_ASSUM MP_TAC THEN ASM_REWRITE_TAC[]);
2939 REPEAT WEAKER_STRIP_TAC;
2940 FIRST_X_ASSUM_ST `collinear` (C INTRO_TAC [`p1 +k-1`]);
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;
2946 MATCH_MP_TAC Fan.sum3_azim_fan;
2949 FIRST_X_ASSUM_ST `( /\ )` (C INTRO_TAC [`t`]);
2952 BY(FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]);
2953 BY(MP_TAC PI_POS THEN REAL_ARITH_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`]);
2960 BY(FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_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)`]);
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)`];
2974 BY(ONCE_REWRITE_TAC[SET_RULE `{a,b,c} = {a,c,b}`] THEN ASM_REWRITE_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[]);
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;
2984 FIRST_X_ASSUM_ST `azim` (C INTRO_TAC [`t`]);
2986 BY(FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_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))`];
2998 ASM_REWRITE_TAC[arith `a < pi - b <=> b + a < pi`];
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];
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`]);
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;
3014 MATCH_MP_TAC Fan.sum3_azim_fan;
3017 FIRST_X_ASSUM_ST `( /\ )` (C INTRO_TAC [`t`]);
3020 BY(FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]);
3021 BY(MP_TAC PI_POS THEN REAL_ARITH_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`]);
3028 BY(FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_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)`]);
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`];
3044 BY(ONCE_REWRITE_TAC[SET_RULE `{a,b,c} = {a,c,b}`] THEN ASM_REWRITE_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[]);
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;
3054 FIRST_X_ASSUM_ST `azim` (C INTRO_TAC [`t`]);
3056 BY(FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_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];
3070 COMMENT "final kill";
3071 FIRST_X_ASSUM_ST `azim` MP_TAC THEN REPEAT WEAKER_STRIP_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`];
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[];
3087 TYPIFY `e1` EXISTS_TAC;
3088 ASM_REWRITE_TAC[] THEN REPEAT WEAKER_STRIP_TAC;
3090 FIRST_X_ASSUM_ST `p1+k-2` (C INTRO_TAC [`t`]);
3093 TYPIFY `e1'` EXISTS_TAC;
3094 ASM_REWRITE_TAC[] THEN REPEAT WEAKER_STRIP_TAC;
3096 FIRST_X_ASSUM (C INTRO_TAC [`t`]);
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)
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)`,
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`])
3116 let dih_x5_mono = prove_by_refinement(
3117 `!x1 x2 x3 x4 x5 x6.
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))`,
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`];
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];
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`];
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`])
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`,
3177 REWRITE_TAC[Sphere.delta_x6;Nonlin_def.delta_x5];
3182 let dih_obtuse_mono = prove_by_refinement(
3183 `!x1 x2 x3 x4 x5 x6.
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))`,
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`];
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;
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`];
3223 BY(REPLICATE_TAC 2 (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
3228 let dih_obtuse_mono_b = prove_by_refinement(
3229 `!x1 x2 x3 x4 x5 x6.
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))`,
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`];
3253 BY(REPLICATE_TAC 2 (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
3258 let square_add_neg_lemma = prove_by_refinement(
3259 `!y t. t <= &0 /\ &0 <= t + &2 * y ==> &2 * y * t + t*t <= &0`,
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[])
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)))`,
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}`]);
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];
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)));
3303 BY(ASM_REWRITE_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`];
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`];
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`];
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];
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[]);
3338 TYPIFY `&2 * dist(v2,v3)` EXISTS_TAC;
3339 REWRITE_TAC[arith `&0 < &2 * x <=> &0 < x`];
3340 REWRITE_TAC[GSYM DIST_NZ];
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;
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`];
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];
3362 ASM_TAC THEN REWRITE_TAC[DIST_SYM] THEN REPEAT WEAKER_STRIP_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`]);
3378 (* redo with dih_obtuse_mono_b w/o obtuse *)
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)))`,
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}`]);
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];
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)));
3415 BY(ASM_REWRITE_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`];
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`];
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`];
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];
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[]);
3450 TYPIFY `&2 * dist(v2,v3)` EXISTS_TAC;
3451 REWRITE_TAC[arith `&0 < &2 * x <=> &0 < x`];
3452 REWRITE_TAC[GSYM DIST_NZ];
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;
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`];
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];
3474 ASM_TAC THEN REWRITE_TAC[DIST_SYM] THEN REPEAT WEAKER_STRIP_TAC;
3476 (REPEAT (FIRST_X_ASSUM_ST `collinear` MP_TAC) THEN REWRITE_TAC[Collect_geom2.NOT_COL_EQ_UPS_X_POS;DIST_SYM]);
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`]);
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)))`,
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}`]);
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];
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`];
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`];
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`];
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[]);
3550 TYPIFY `&2 * dist(v2,v3)` EXISTS_TAC;
3551 REWRITE_TAC[arith `&0 < &2 * x <=> &0 < x`];
3552 REWRITE_TAC[GSYM DIST_NZ];
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;
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`];
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];
3574 ASM_TAC THEN REWRITE_TAC[DIST_SYM] THEN REPEAT WEAKER_STRIP_TAC;
3576 (REPEAT (FIRST_X_ASSUM_ST `collinear` MP_TAC) THEN REWRITE_TAC[Collect_geom2.NOT_COL_EQ_UPS_X_POS;DIST_SYM]);
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[])
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 /\
3594 dist (v0,v2') = dist (v0,v2) /\
3595 dist (v1,v2') = dist (v1,v2) /\
3596 dist (v2',v3) = dist (v2,v3) + t
3598 dihV v0 v3 v2' v1 <= dihV v0 v3 v2 v1)) /\
3599 (!v2' t. (abs t < e /\
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) ))`,
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`];
3610 REPEAT WEAKER_STRIP_TAC;
3611 INTRO_TAC dihV_obtuse_mono_b [`v0`;`v1`;`v2`;`v3`];
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'`];
3621 BY(ASM_MESON_TAC[]);
3623 REPEAT WEAKER_STRIP_TAC;
3624 TYPIFY `e''` EXISTS_TAC;
3629 let real_continuous_abs = prove_by_refinement(
3630 `!x. abs real_continuous atreal x`,
3633 TYPIFY `abs = (\x. abs ((\ (u:real). u) x))` (C SUBGOAL_THEN SUBST1_TAC);
3634 BY(REWRITE_TAC[FUN_EQ_THM;I_THM]);
3636 MATCH_MP_TAC REAL_CONTINUOUS_ABS;
3637 BY(REWRITE_TAC[REAL_CONTINUOUS_AT_ID])
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')`,
3646 REWRITE_TAC[Localization.deformation;IN_REAL_INTERVAL;arith `-- e < t /\ t < e <=> abs t < e`;arith `abs(&0) = &0`];
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)`,
3655 REWRITE_TAC[Appendix.psort];
3656 REPEAT WEAKER_STRIP_TAC;
3657 BY(ASM_SIMP_TAC[MOD_MOD_REFL])
3661 let MMs_minimize_tau_fun = prove_by_refinement(
3663 is_scs_v39 s /\ scs_basic_v39 s /\ (scs_k_v39 s = k) /\ (3 < k) /\
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)))`,
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`]);
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;
3678 ASM_SIMP_TAC[arith `3 < k ==> 3 <= k`];
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;
3685 ASM_SIMP_TAC[arith `3 < k ==> 3 <= k`];
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[]);
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)))`;
3695 REPEAT (GMATCH_SIMP_TAC Appendix.dsv_J_empty);
3696 REWRITE_TAC[FUN_EQ_THM];
3697 BY(ASM_MESON_TAC[Appendix.scs_basic])
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)`,
3705 REPEAT WEAKER_STRIP_TAC;
3706 INTRO_TAC MOD_SHIFT[`k`;`b`;`(x+(a:num))`;`k - a MOD k`];
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])
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))`,
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);
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];
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}`])
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)
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));
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}`])
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) /\
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)`,
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;
3812 REWRITE_TAC[IN_IMAGE;IN_UNIV];
3814 INTRO_TAC (GEN_ALL Local_lemmas.INTERIOR_ANGLE1_POS) [`E`;`V`;`FF`;`v p1`];
3817 INTRO_TAC (GEN_ALL Nkezbfc_local.CONVEX_LOFA_IMP_INANGLE_EQ_AZIM_IVS ) [`E`;`V`;`FF`];
3820 TYPIFY `!i m. ITER m (rho_node1 FF) (v i) = v (m + i)` (C SUBGOAL_THEN ASSUME_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);
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`];
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`]);
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))`]);
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)`];
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)]);
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)`);
3872 BY(FIRST_X_ASSUM_ST `{a,b} = y` MP_TAC THEN SET_TAC[]);
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)`);
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);
3885 REWRITE_TAC[arith `a > &0 <=> &0 < a`;GSYM Zlzthic.azim_lt_pi_cross];
3886 BY(ASM_MESON_TAC[]);
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`];
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`];
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'`];
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`];
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);
3934 MATCH_MP_TAC (GSYM Oxl_def.periodic_mod);
3935 BY(ASM_REWRITE_TAC[]);
3936 INTRO_TAC BBs_inj [`s`;`v`;`k`];
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);
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`];
3959 MATCH_MP_TAC Zlzthic.deformation_subset;
3960 TYPIFY `V` EXISTS_TAC;
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[]);
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;
3980 REWRITE_TAC[Trigonometry2.re_eqvl];
3981 REPEAT WEAKER_STRIP_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];
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;
4002 INTRO_TAC dihV_obtuse_mono [`(vec 0):real^3`;`v p0`;`v p1`;`v p2`];
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;
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)`];
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''''`];
4025 DISCH_THEN MP_TAC THEN ANTS_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`]);
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`]);
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`]);
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;
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);
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];
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`]);
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);
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];
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`]);
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;
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;
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''''`];
4132 MATCH_MP_TAC deformation_restrict;
4133 TYPIFY `e'` EXISTS_TAC;
4134 BY(ASM_REWRITE_TAC[]);
4136 REPEAT WEAKER_STRIP_TAC;
4137 FIRST_X_ASSUM_ST `norm` (C INTRO_TAC [`t`]);
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[]);
4145 MATCH_MP_TAC a_assumption_reduction;
4146 GEXISTL_TAC [`k`;`p1`;`e'`];
4149 REPEAT (FIRST_X_ASSUM_ST `psort` MP_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);
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'`];
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);
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;
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];
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`];
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];
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`];
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`]);
4256 BY(REPEAT (FIRST_X_ASSUM MATCH_MP_TAC) THEN FIRST_X_ASSUM (unlist 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`]);
4268 INTRO_TAC solve_mod_k [`k`] THEN ASM_REWRITE_TAC[];
4269 ONCE_REWRITE_TAC[TAUT `!a b. (a ==> b) <=> (~b ==> ~a)`];
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]);
4279 FIRST_X_ASSUM_ST `~` MP_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]);
4290 FIRST_X_ASSUM_ST `~` MP_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));
4305 FIRST_X_ASSUM_ST `norm` (C INTRO_TAC [`t`]);
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);
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)));
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)));
4344 FIRST_ASSUM (C INTRO_TAC [`&0`]);
4345 FIRST_X_ASSUM (C INTRO_TAC [`t'`]);
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)));
4354 FIRST_ASSUM (C INTRO_TAC [`&0`]);
4355 FIRST_X_ASSUM (C INTRO_TAC [`t'`]);
4357 DISCH_THEN (unlist REWRITE_TAC);
4358 DISCH_THEN (unlist REWRITE_TAC);
4359 FIRST_X_ASSUM_ST `azim` (C INTRO_TAC [`t'`]);
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;
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);
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);
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'`]);
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;
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'`]);
4399 BY(FIRST_X_ASSUM_ST `~(t' = &0)` MP_TAC THEN REAL_ARITH_TAC)
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) /\
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)`,
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;
4454 REWRITE_TAC[IN_IMAGE;IN_UNIV];
4456 INTRO_TAC (GEN_ALL Local_lemmas.INTERIOR_ANGLE1_POS) [`E`;`V`;`FF`;`v p1`];
4459 INTRO_TAC (GEN_ALL Nkezbfc_local.CONVEX_LOFA_IMP_INANGLE_EQ_AZIM_IVS ) [`E`;`V`;`FF`];
4462 TYPIFY `!i m. ITER m (rho_node1 FF) (v i) = v (m + i)` (C SUBGOAL_THEN ASSUME_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);
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`];
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`]);
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))`]);
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)`];
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]);
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)`);
4514 BY(FIRST_X_ASSUM_ST `{a,b} = y` MP_TAC THEN SET_TAC[]);
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)`);
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);
4527 REWRITE_TAC[arith `a > &0 <=> &0 < a`;GSYM Zlzthic.azim_lt_pi_cross];
4528 BY(ASM_MESON_TAC[]);
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`];
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`];
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'`];
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`];
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);
4576 MATCH_MP_TAC (GSYM Oxl_def.periodic_mod);
4577 BY(ASM_REWRITE_TAC[]);
4578 INTRO_TAC BBs_inj [`s`;`v`;`k`];
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);
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`];
4601 MATCH_MP_TAC Zlzthic.deformation_subset;
4602 TYPIFY `V` EXISTS_TAC;
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[]);
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;
4622 REWRITE_TAC[Trigonometry2.re_eqvl];
4623 REPEAT WEAKER_STRIP_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];
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;
4644 INTRO_TAC dihV_obtuse_mono [`(vec 0):real^3`;`v p0`;`v p1`;`v p2`];
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;
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)`];
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''''`];
4667 DISCH_THEN MP_TAC THEN ANTS_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`]);
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`]);
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`]);
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;
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);
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];
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`]);
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);
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];
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`]);
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;
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;
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''''`];
4774 MATCH_MP_TAC deformation_restrict;
4775 TYPIFY `e'` EXISTS_TAC;
4776 BY(ASM_REWRITE_TAC[]);
4778 REPEAT WEAKER_STRIP_TAC;
4779 FIRST_X_ASSUM_ST `norm` (C INTRO_TAC [`t`]);
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[]);
4787 MATCH_MP_TAC a_assumption_reduction;
4788 GEXISTL_TAC [`k`;`p1`;`e'`];
4791 REPEAT (FIRST_X_ASSUM_ST `psort` MP_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);
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'`];
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);
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;
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];
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`];
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];
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`];
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`]);
4898 BY(REPEAT (FIRST_X_ASSUM MATCH_MP_TAC) THEN FIRST_X_ASSUM (unlist 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`]);
4910 INTRO_TAC solve_mod_k [`k`] THEN ASM_REWRITE_TAC[];
4911 ONCE_REWRITE_TAC[TAUT `!a b. (a ==> b) <=> (~b ==> ~a)`];
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]);
4921 FIRST_X_ASSUM_ST `~` MP_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]);
4932 FIRST_X_ASSUM_ST `~` MP_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));
4947 FIRST_X_ASSUM_ST `norm` (C INTRO_TAC [`t`]);
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);
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)));
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)));
4986 FIRST_ASSUM (C INTRO_TAC [`&0`]);
4987 FIRST_X_ASSUM (C INTRO_TAC [`t'`]);
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)));
4996 FIRST_ASSUM (C INTRO_TAC [`&0`]);
4997 FIRST_X_ASSUM (C INTRO_TAC [`t'`]);
4999 DISCH_THEN (unlist REWRITE_TAC);
5000 DISCH_THEN (unlist REWRITE_TAC);
5001 FIRST_X_ASSUM_ST `azim` (C INTRO_TAC [`t'`]);
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;
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);
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);
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'`]);
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;
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'`]);
5041 BY(FIRST_X_ASSUM_ST `~(t' = &0)` MP_TAC THEN REAL_ARITH_TAC)
5046 let CUXVZOZ = prove_by_refinement(
5047 `main_nonlinear_terminal_v11 ==>
5049 FF = IMAGE (\i. (v i,v (SUC i))) (:num) /\
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)`,
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;
5076 let CJBDXXN = prove_by_refinement(
5077 `main_nonlinear_terminal_v11 ==>
5079 FF = IMAGE (\i. (v i,v (SUC i))) (:num) /\
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)`,
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;