1 (* ========================================================================= *)
2 (* FLYSPECK - BOOK FORMALIZATION *)
4 (* Authour : VU KHAC KY *)
6 (* Chaper : Packing (Marchal Cells 2) *)
7 (* Date : October 3, 2010 *)
9 (* ========================================================================= *)
11 module Marchal_cells_2_new = struct
13 #use "/usr/programs/hollight/hollight-svn75/hol.ml";;
14 loads "Multivariate/flyspeck.ml";;
15 #use "/home/vu/flyspeck/working/boot.hl";;
16 flyspeck_needs "trigonometry/trig1.hl";;
17 flyspeck_needs "trigonometry/trig2.hl";;
18 flyspeck_needs "leg/muR_def.hl";;
19 flyspeck_needs "leg/enclosed_def.hl";;
20 flyspeck_needs "trigonometry/euler_main_theorem.hl";;
21 flyspeck_needs "trigonometry/trigonometry.hl";;
23 (* ================= Loaded files ======================================== *)
25 flyspeck_needs "leg/collect_geom.hl";;
26 flyspeck_needs "fan/fan_defs.hl";;
27 flyspeck_needs "fan/introduction.hl";;
28 flyspeck_needs "fan/topology.hl";;
29 flyspeck_needs "fan/fan_misc.hl";;
30 flyspeck_needs "fan/HypermapAndFan.hl";;
31 flyspeck_needs "packing/pack_defs.hl";;
32 flyspeck_needs "packing/pack_concl.hl";;
33 flyspeck_needs "packing/pack1.hl";;
34 flyspeck_needs "packing/pack2.hl";;
35 flyspeck_needs "packing/pack3.hl";;
36 flyspeck_needs "packing/Rogers.hl";;
37 flyspeck_needs "nonlinear/vukhacky_tactics.hl";;
39 flyspeck_needs "packing/marchal_cells.hl";;
40 flyspeck_needs "packing/EMNWUUS.hl";;
44 (* ====================== Open appropriate files ======================= *)
47 open Prove_by_refinement;;
48 open Vukhacky_tactics;;
58 let (tms,tm) = top_goal () in
59 let vss = map frees (tm::tms) in
60 let vs = setify (flat vss) in
64 (* ======================================================================= *)
66 let AFF_GE_2_2 = prove
69 ==> aff_ge {x,v} {w, z} =
71 &0 <= t3 /\ &0 <= t4 /\
72 t1 + t2 + t3 + t4 = &1 /\
73 y = t1 % x + t2 % v + t3 % w + t4 % z}`,
75 (* ======================================================================= *)
77 let MEASURABLE_ROGERS = prove_by_refinement (
78 `!V (ul:(real^3)list) k.
79 saturated V /\ packing V /\ barV V 3 ul ==> measurable (rogers V ul)`,
81 (REWRITE_TAC[ROGERS]);
82 (MATCH_MP_TAC MEASURABLE_CONVEX_HULL);
83 (MATCH_MP_TAC FINITE_IMP_BOUNDED);
84 (MATCH_MP_TAC FINITE_IMAGE);
85 (SUBGOAL_THEN `? u0 u1 u2 u3. (ul:(real^3)list) = [u0:real^3;u1;u2;u3]` CHOOSE_TAC);
86 (MP_TAC (ASSUME `barV V 3 ul`));
87 (REWRITE_TAC[BARV_3_EXPLICIT]);
88 (FIRST_X_ASSUM CHOOSE_TAC);
89 (FIRST_X_ASSUM CHOOSE_TAC);
90 (FIRST_X_ASSUM CHOOSE_TAC);
91 (NEW_GOAL `LENGTH (ul:(real^3)list) = 4`);
92 (ASM_REWRITE_TAC[LENGTH]);
95 (REWRITE_TAC[FINITE_NUMSEG_LT])]);;
97 (* ======================================================================= *)
99 let CONVEX_RCONE_GE = prove_by_refinement (
100 `!a:real^N b r. &0 <= r ==> convex (rcone_ge a b r)`,
101 [ (REPEAT STRIP_TAC);
102 (REWRITE_TAC[rcone_ge;convex;rconesgn;IN;IN_ELIM_THM]);
104 (REWRITE_WITH `(u % x + v % y) - a = u % (x - a) + v % (y - a:real^N)`);
105 (ASM_REWRITE_TAC[VECTOR_SUB_LDISTRIB; VECTOR_MUL_LID;
106 VECTOR_ARITH `a - x % b + c - y % b = (a + c) - (x + y) % b`]);
107 (REWRITE_TAC[DOT_LADD;DOT_LMUL]);
108 (ASM_CASES_TAC `&0 < u`);
113 `u * ((x:real^N - a) dot (b - a)) + v * ((y - a) dot (b - a)) >=
114 u * dist (x,a) * dist (b,a) * r + v * dist (y,a) * dist (b,a) * r`);
118 `u * ((x:real^N - a) dot (b - a)) >= u * dist (x,a) * dist (b,a) * r`);
119 (MATCH_MP_TAC (REAL_ARITH `&0 <= a - b ==> a >= b`));
120 (REWRITE_TAC[REAL_ARITH `a * b * c * d = a * (b * c * d)`;
121 REAL_ARITH `a * b - a * c = a * (b - c)`]);
122 (MATCH_MP_TAC REAL_LE_MUL);
123 (ASM_REAL_ARITH_TAC);
126 `v * ((y:real^N - a) dot (b - a)) >= v * dist (y,a) * dist (b,a) * r`);
127 (MATCH_MP_TAC (REAL_ARITH `&0 <= a - b ==> a >= b`));
128 (REWRITE_TAC[REAL_ARITH `a * b * c * d = a * (b * c * d)`;
129 REAL_ARITH `a * b - a * c = a * (b - c)`]);
130 (MATCH_MP_TAC REAL_LE_MUL);
131 (ASM_REAL_ARITH_TAC);
132 (ASM_REAL_ARITH_TAC);
135 `dist (u % x + v % y,a) * dist (b,a:real^N) * r <=
136 u * dist (x,a) * dist (b,a) * r + v * dist (y,a) * dist (b,a) * r`);
139 (MATCH_MP_TAC (REAL_ARITH `&0 <= a - b ==> b <= a`));
140 (REWRITE_TAC[REAL_ARITH `(a * b * x + c * d * x) - e * x =
141 (a * b + c * d - e) * x`]);
142 (MATCH_MP_TAC REAL_LE_MUL);
145 (REWRITE_WITH `(u % x + v % y) - a = u % (x - a) + v % (y - a:real^N)`);
146 (ASM_REWRITE_TAC[VECTOR_SUB_LDISTRIB; VECTOR_MUL_LID;
147 VECTOR_ARITH `a - x % b + c - y % b = (a + c) - (x + y) % b`]);
148 (REWRITE_TAC[REAL_ARITH `&0 <= a + b - c <=> c <= a + b`]);
149 (MATCH_MP_TAC (REAL_ARITH
150 `m <= norm (u % (x - a:real^N)) + norm (v % (y - a)) /\
151 norm (u % (x - a)) = b /\
152 norm (v % (y - a)) = c ==> m <= b + c`));
153 (REWRITE_TAC[NORM_TRIANGLE;NORM_MUL]);
154 (REWRITE_WITH `abs u = u /\ abs v = v`);
155 (ASM_SIMP_TAC[REAL_ABS_REFL]);
157 (MATCH_MP_TAC REAL_LE_MUL);
158 (ASM_REWRITE_TAC[DIST_POS_LE]);
159 (ASM_REAL_ARITH_TAC);
164 (ASM_REAL_ARITH_TAC);
166 (ASM_REAL_ARITH_TAC);
167 (ASM_REWRITE_TAC[REAL_MUL_LZERO;REAL_ADD_LID;REAL_MUL_LID]);
168 (ASM_REWRITE_TAC[VECTOR_MUL_LZERO;VECTOR_ADD_LID;VECTOR_MUL_LID])]);;
170 (* ======================================================================= *)
172 let FINITE_PERMUTE_3 = prove_by_refinement
173 (`FINITE {p | p permutes {0, 1, 2}}`,
174 [MATCH_MP_TAC FINITE_PERMUTATIONS THEN MESON_TAC[FINITE_RULES]]);;
175 let FINITE_PERMUTE_4 = prove_by_refinement
176 (`FINITE {p | p permutes {0, 1, 2, 3}}`,
177 [MATCH_MP_TAC FINITE_PERMUTATIONS THEN MESON_TAC[FINITE_RULES]]);;
179 (* ======================================================================= *)
181 let TRUONG_SET_TAC = let basicthms =
182 [NOT_IN_EMPTY; IN_UNIV; IN_UNION; IN_INTER; IN_DIFF; IN_INSERT;
183 IN_DELETE; IN_REST; IN_INTERS; IN_UNIONS; IN_IMAGE] in
184 let allthms = basicthms @ map (REWRITE_RULE[IN]) basicthms @
187 TRY(POP_ASSUM_LIST(MP_TAC o end_itlist CONJ)) THEN
188 REPEAT COND_CASES_TAC THEN
189 REWRITE_TAC[EXTENSION; SUBSET; PSUBSET; DISJOINT; SING] THEN
190 REWRITE_TAC allthms in
193 (if ths = [] then ALL_TAC else MP_TAC(end_itlist CONJ ths)) THEN
196 (* ======================================================================= *)
198 let DISJOINT_KY_LEMMA = prove_by_refinement (
199 `~(x = y) /\ ~(x = z) ==> DISJOINT {x} {y, z:real^3}`,
201 (REWRITE_TAC[DISJOINT; INTER ; IN; IN_ELIM_THM;Geomdetail.IN_ACT_SING]);
202 (MATCH_MP_TAC (MESON [] `(~a ==> F) ==> a`));
204 (SUBGOAL_THEN `?t. t IN {x' | x' = x /\ {y, z:real^3} x'}` ASSUME_TAC);
205 (UP_ASM_TAC THEN SET_TAC[]);
206 (FIRST_X_ASSUM CHOOSE_TAC);
207 (UP_ASM_TAC THEN REWRITE_TAC[IN; IN_ELIM_THM]);
208 (NEW_GOAL `{y, z:real^3} t <=> (t = y) \/ (t = z)`);
211 (ASM_MESON_TAC[])]);;
213 (* ======================================================================= *)
217 let DIHV_SYM = prove_by_refinement (
218 `!(x:real^N) y z t. dihV x y z t = dihV y x z t`,
220 (REWRITE_TAC[dihV] THEN REPEAT LET_TAC);
221 (MATCH_MP_TAC (MESON[]
222 `!a b c d x. (a = b) /\ (c = d) ==> arcV x a c = arcV x b d`));
224 (* Break into 2 subgoals with similar proofs *)
227 (EXPAND_TAC "vap'" THEN EXPAND_TAC "vap");
229 (REWRITE_WITH `(va':real^N) = va - vc`);
230 (EXPAND_TAC "va'" THEN EXPAND_TAC "va" THEN EXPAND_TAC "vc");
233 (REWRITE_WITH `(vc':real^N) = --vc`);
234 (EXPAND_TAC "vc'" THEN EXPAND_TAC "vc");
238 `(--vc dot --vc) % (va:real^N - vc) = (vc dot vc) % va - (vc dot vc) % vc`);
239 (REWRITE_TAC[DOT_RNEG;DOT_LNEG;REAL_ARITH `-- --x = x `]);
242 (MATCH_MP_TAC (VECTOR_ARITH `a = b + c ==> x:real^N - b - c = x - a `));
243 (REWRITE_WITH `((va:real^N - vc) dot --vc) % --vc =
244 (va dot vc) % vc - (vc dot vc) % vc`);
245 (REWRITE_TAC[DOT_RNEG;DOT_LNEG;VECTOR_MUL_LNEG; VECTOR_MUL_RNEG]);
246 (REWRITE_TAC[VECTOR_NEG_MINUS1;VECTOR_MUL_ASSOC]);
247 (REWRITE_TAC[REAL_ARITH `-- &1 * -- &1 * x = x`;
248 DOT_LSUB;VECTOR_SUB_RDISTRIB]);
252 (EXPAND_TAC "vbp'" THEN EXPAND_TAC "vbp");
253 (REWRITE_WITH `(vb':real^N) = vb - vc`);
254 (EXPAND_TAC "vb'" THEN EXPAND_TAC "vb" THEN EXPAND_TAC "vc");
257 (REWRITE_WITH `(vc':real^N) = --vc`);
258 (EXPAND_TAC "vc'" THEN EXPAND_TAC "vc");
262 `(--vc dot --vc) % (vb:real^N - vc) = (vc dot vc) % vb - (vc dot vc) % vc`);
263 (REWRITE_TAC[DOT_RNEG;DOT_LNEG;REAL_ARITH `-- --x = x `]);
266 (MATCH_MP_TAC (VECTOR_ARITH `a = b + c ==> x:real^N - b - c = x - a `));
267 (REWRITE_WITH `((vb:real^N - vc) dot --vc) % --vc =
268 (vb dot vc) % vc - (vc dot vc) % vc`);
269 (REWRITE_TAC[DOT_RNEG;DOT_LNEG;VECTOR_MUL_LNEG; VECTOR_MUL_RNEG]);
270 (REWRITE_TAC[VECTOR_NEG_MINUS1;VECTOR_MUL_ASSOC]);
271 (REWRITE_TAC[REAL_ARITH `-- &1 * -- &1 * x = x`;
272 DOT_LSUB;VECTOR_SUB_RDISTRIB]);
273 (VECTOR_ARITH_TAC)]);;
276 (* ======================================================================= *)
278 let RCONE_GT_SUBSET_RCONE_GE = prove_by_refinement (
279 `! z:real^3 w h. rcone_gt z w h SUBSET rcone_ge z w h`,
280 [ (REPEAT GEN_TAC THEN REWRITE_TAC[RCONE_GT_GE]);
283 (* ======================================================================= *)
285 let MCELL_EXPLICIT = prove_by_refinement (
287 mcell 0 V ul = mcell0 V ul /\
288 mcell 1 V ul = mcell1 V ul /\
289 mcell 2 V ul = mcell2 V ul /\
290 mcell 3 V ul = mcell3 V ul /\
291 (k >= 4 ==> mcell k V ul = mcell4 V ul)`,
292 [ (NEW_GOAL `((1 = 0) ==> F) /\ ((2 = 0) ==> F) /\ ((3 = 0) ==> F) /\
293 ((2 = 1) ==> F) /\ ((3 = 1) ==> F) /\ ((3 = 2) ==> F)`);
295 (REPEAT STRIP_TAC); (REWRITE_TAC[mcell]);
296 (REWRITE_TAC[mcell]); (COND_CASES_TAC);
297 (ASM_MESON_TAC[]); (MESON_TAC[]);
298 (REWRITE_TAC[mcell]); (COND_CASES_TAC);
299 (ASM_MESON_TAC[]); (COND_CASES_TAC);
300 (ASM_MESON_TAC[]); (MESON_TAC[]);
301 (REWRITE_TAC[mcell]); (COND_CASES_TAC);
302 (ASM_MESON_TAC[]); (COND_CASES_TAC);
303 (ASM_MESON_TAC[]); (COND_CASES_TAC);
304 (ASM_MESON_TAC[]); (MESON_TAC[]);
305 (REWRITE_TAC[mcell]); (COND_CASES_TAC);
306 (ASM_MESON_TAC[ARITH_RULE `~(0 >= 4)`]);
307 (COND_CASES_TAC); (ASM_MESON_TAC[ARITH_RULE `~(1 >= 4)`]);
308 (COND_CASES_TAC); (ASM_MESON_TAC[ARITH_RULE `~(2 >= 4)`]);
309 (COND_CASES_TAC); (ASM_MESON_TAC[ARITH_RULE `~(3 >= 4)`]);
312 (* ======================================================================= *)
314 let EVENTUALLY_RADIAL_EMPTY = prove_by_refinement (
315 `!v:real^3. eventually_radial v {} `,
317 (REWRITE_TAC[eventually_radial;radial]);
319 (REWRITE_TAC[REAL_ARITH `&1 > &0`;INTER_SUBSET]);
322 (DEL_TAC THEN DEL_TAC THEN UP_ASM_TAC);
323 (REWRITE_TAC[INTER_EMPTY]);
325 (UP_ASM_TAC THEN MESON_TAC[])]);;
327 (* ======================================================================= *)
329 let EVENTUALLY_RADIAL_NOT_IN_CLOSED_SET = prove_by_refinement (
330 `!v:real^3 S. ~(S v) /\ (closed S)==> eventually_radial v S`,
332 (NEW_GOAL `?r. r > &0 /\ ball(v:real^3, r) INTER S = {}`);
333 (UP_ASM_TAC THEN REWRITE_TAC[closed; open_def]);
335 (MP_TAC (SPEC `v:real^3` (ASSUME `!x. x IN (:real^3) DIFF S
337 (!x'. dist (x',x) < e ==> x' IN (:real^3) DIFF S))`)));
339 (NEW_GOAL `(?e. &0 < e /\ (!x'. dist (x',v:real^3) < e ==> x' IN (:real^3) DIFF S))`);
340 (FIRST_X_ASSUM MATCH_MP_TAC);
341 (REWRITE_TAC[IN_DIFF]);
342 (ASM_REWRITE_TAC[IN]);
343 (MESON_TAC[IN_UNIV;IN]);
344 (FIRST_X_ASSUM CHOOSE_TAC);
345 (EXISTS_TAC `e:real`);
347 (ASM_REAL_ARITH_TAC);
349 (MATCH_MP_TAC (SET_RULE `(!a:real^3. (a IN A) ==> ~(a IN B)) ==> (A INTER B = {})`));
350 (REWRITE_TAC[IN; IN_ELIM_THM]);
351 (GEN_TAC THEN DISCH_TAC);
352 (NEW_GOAL `a IN (:real^3) DIFF S ==> ~S a `);
353 (REWRITE_TAC[IN_DIFF;IN; IN_ELIM_THM]);
355 (FIRST_X_ASSUM MATCH_MP_TAC);
356 (UP_ASM_TAC THEN ASM_REWRITE_TAC[DIST_SYM]);
357 (REWRITE_TAC[eventually_radial;radial]);
358 (FIRST_X_ASSUM CHOOSE_TAC);
359 (EXISTS_TAC `r:real`);
360 (ASM_REWRITE_TAC[INTER_SUBSET]);
363 (DEL_TAC THEN DEL_TAC);
364 (UP_ASM_TAC THEN REWRITE_WITH `S INTER ball (v,r) = ball (v:real^3,r) INTER S`);
368 (UP_ASM_TAC THEN MESON_TAC[])]);;
370 (* ======================================================================= *)
372 let CLOSED_CONVEX_HULL_FINITE = prove
373 (`!s. FINITE s ==> closed(convex hull s)`,
374 MESON_TAC[COMPACT_IMP_CLOSED; COMPACT_CONVEX_HULL; FINITE_IMP_COMPACT]);;
376 (* ======================================================================= *)
378 let CLOSED_ROGERS = prove_by_refinement (
379 `! V ul:(real^3)list.
380 saturated V /\ packing V /\ barV V 3 ul ==> closed (rogers V ul)`,
381 [(REPEAT STRIP_TAC THEN REWRITE_TAC[ROGERS]);
382 (MATCH_MP_TAC CLOSED_CONVEX_HULL_FINITE);
383 (MATCH_MP_TAC FINITE_IMAGE);
384 (REWRITE_WITH `{j | j < LENGTH (ul:(real^3)list)} ={j| j < 4}`);
385 (MATCH_MP_TAC (MESON[] `(a = b) ==> ({j:num| j < a} = {j | j < b})`));
386 (NEW_GOAL `?u0 u1 u2 u3. (ul:(real^3)list) = [u0:real^3;u1;u2;u3]`);
387 (MP_TAC (ASSUME `barV V 3 ul`));
388 (REWRITE_TAC[BARV_3_EXPLICIT]);
389 (FIRST_X_ASSUM CHOOSE_TAC);
390 (FIRST_X_ASSUM CHOOSE_TAC);
391 (FIRST_X_ASSUM CHOOSE_TAC);
392 (FIRST_X_ASSUM CHOOSE_TAC);
393 (ASM_REWRITE_TAC[LENGTH]);
395 (REWRITE_TAC[FINITE_NUMSEG_LT])]);;
397 (* ======================================================================= *)
399 let CLOSED_SET_OF_LIST_KY_LEMMA_1 = prove_by_refinement (
401 saturated V /\ packing V /\ barV V 3 (ul:(real^3)list)
403 (convex hull (set_of_list (truncate_simplex 2 ul) UNION {mxi V ul}))`,
404 [(REPEAT STRIP_TAC THEN MATCH_MP_TAC CLOSED_CONVEX_HULL_FINITE);
405 (NEW_GOAL `?u0 u1 u2 u3. (ul:(real^3)list) = [u0:real^3;u1;u2;u3]`);
406 (MP_TAC (ASSUME `barV V 3 ul`));
407 (REWRITE_TAC[BARV_3_EXPLICIT]);
408 (FIRST_X_ASSUM CHOOSE_TAC);
409 (FIRST_X_ASSUM CHOOSE_TAC);
410 (FIRST_X_ASSUM CHOOSE_TAC);
411 (FIRST_X_ASSUM CHOOSE_TAC);
412 (REWRITE_WITH `truncate_simplex 2 ul = [u0;u1;u2:real^3]`);
413 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2]);
414 (REWRITE_TAC[set_of_list]);
415 (REWRITE_TAC[ SET_RULE `!a b c d. {a,b,c} UNION {d:real^3} = {a,b,c,d}`]);
416 (REWRITE_TAC[Geomdetail.FINITE6])]);;
417 (* ======================================================================= *)
419 let CLOSED_SET_OF_LIST_KY_LEMMA_2 = prove_by_refinement (
420 `!V (ul:(real^3)list).
421 saturated V /\ packing V /\ barV V 3 ul ==>
422 closed (convex hull set_of_list ul)`,
423 [(REPEAT STRIP_TAC THEN MATCH_MP_TAC CLOSED_CONVEX_HULL_FINITE);
424 (NEW_GOAL `?u0 u1 u2 u3. (ul:(real^3)list) = [u0:real^3;u1;u2;u3]`);
425 (MP_TAC (ASSUME `barV V 3 ul`));
426 (REWRITE_TAC[BARV_3_EXPLICIT]);
427 (FIRST_X_ASSUM CHOOSE_TAC);
428 (FIRST_X_ASSUM CHOOSE_TAC);
429 (FIRST_X_ASSUM CHOOSE_TAC);
430 (FIRST_X_ASSUM CHOOSE_TAC);
431 (ASM_REWRITE_TAC[set_of_list]);
432 (REWRITE_TAC[Geomdetail.FINITE6])]);;
434 (* ======================================================================= *)
436 let CLOSED_RCONE_GE = prove_by_refinement (
437 `!v0 v1:real^3 a. &0 < a ==> closed (rcone_ge v0 v1 a)`,
438 [(REPEAT STRIP_TAC THEN REWRITE_TAC[rcone_ge;rconesgn]);
439 (REWRITE_TAC[closed]);
440 (REWRITE_WITH `(:real^3) DIFF
441 {x | (x - v0) dot (v1 - v0) >= dist (x,v0) * dist (v1,v0) * a} =
442 {x | (x - v0) dot (v1 - v0) < dist (x,v0) * dist (v1,v0) * a}`);
443 (REWRITE_TAC[Vol1.SET_EQ]);
444 (REWRITE_TAC[IN_DIFF;IN;IN_ELIM_THM;IN_UNIV]);
446 (UP_ASM_TAC THEN REAL_ARITH_TAC);
447 (ASM_REAL_ARITH_TAC);
448 (REWRITE_TAC[open_def;IN;IN_ELIM_THM]);
450 (NEW_GOAL `~(v0 = v1:real^3)`);
452 (SWITCH_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
453 (REWRITE_TAC[VECTOR_SUB_REFL; DOT_RZERO; DIST_REFL; REAL_MUL_LZERO;REAL_MUL_RZERO]);
456 (ABBREV_TAC `s = dist (x,v0:real^3) * dist (v1,v0) * a`);
457 (ABBREV_TAC `t = (x - v0) dot (v1 - v0:real^3)`);
458 (EXISTS_TAC `(s - t) / (dist (v1,v0) * a + dist (v1, v0:real^3))`);
460 (MATCH_MP_TAC REAL_LT_DIV);
462 (ASM_REAL_ARITH_TAC);
463 (MATCH_MP_TAC REAL_LT_ADD);
464 (ASM_SIMP_TAC [DIST_POS_LT]);
465 (MATCH_MP_TAC REAL_LT_MUL);
466 (ASM_SIMP_TAC [DIST_POS_LT]);
469 (NEW_GOAL `(x' - v0) dot (v1 - v0) <=
470 (x - v0:real^3) dot (v1 - v0) + dist (x',x) * dist (v1,v0) `);
471 (MATCH_MP_TAC (REAL_ARITH `&0 <= a - b ==> b <= a`));
472 (REWRITE_TAC[REAL_ARITH `(x + y) - z = (x - z) + y`]);
473 (REWRITE_TAC[VECTOR_ARITH `x dot y - z dot y = (x - z) dot y`]);
474 (REWRITE_TAC[VECTOR_ARITH `(x:real^3) - y - (z - y) = (x - z)`;dist]);
475 (REWRITE_WITH ` (x - x':real^3) dot (v1 - v0:real^3) = -- ((x' - x) dot (v1 - v0))`);
478 (MATCH_MP_TAC (REAL_ARITH `b <= a ==> &0 <= --b + a`));
479 (REWRITE_TAC[NORM_CAUCHY_SCHWARZ]);
480 (NEW_GOAL `dist (x',v0) * dist (v1,v0:real^3) * a >=
481 dist (x,v0) * dist (v1,v0) * a - dist (x',x) * dist (v1,v0) * a `);
482 (MATCH_MP_TAC (REAL_ARITH `&0 <= a - b ==> a >= b`));
483 (REWRITE_TAC[REAL_ARITH `x * a * b - (y * a * b - z * a * b) = (x - y + z) * (a * b) `]);
484 (MATCH_MP_TAC REAL_LE_MUL);
486 (MATCH_MP_TAC (REAL_ARITH `b <= a + c ==> &0 <= a - b + c`));
487 (REWRITE_TAC[DIST_SYM]);
488 (REWRITE_WITH `dist (x, x':real^3) = dist (x', x)`);
489 (REWRITE_TAC[DIST_SYM]);
490 (REWRITE_TAC[DIST_TRIANGLE]);
491 (MATCH_MP_TAC REAL_LE_MUL);
493 (ASM_SIMP_TAC[REAL_ARITH `&0 < a ==> &0 <= a`; DIST_POS_LE ]);
494 (MATCH_MP_TAC (REAL_ARITH `(?n q. m <= n /\ p >= q /\ n < q) ==> m < p`));
495 (EXISTS_TAC `(x - v0) dot (v1 - v0) + dist (x',x) * dist (v1,v0:real^3)`);
496 (EXISTS_TAC `dist (x,v0:real^3) * dist (v1,v0) * a - dist (x',x) * dist (v1,v0) * a`);
498 (REWRITE_TAC[REAL_ARITH `t + c * b < s - c * b * a <=> c * (b * a + b) < s - t
500 (NEW_GOAL `dist (x',x) * (dist (v1,v0:real^3) * a + dist (v1,v0)) < s - t <=>
501 dist (x':real^3,x) < (s - t) / (dist (v1,v0) * a + dist (v1,v0))`);
502 (ONCE_REWRITE_TAC[MESON[] `!a b. (a <=> b) <=> (b <=> a)`]);
503 (MATCH_MP_TAC REAL_LT_RDIV_EQ);
504 (MATCH_MP_TAC REAL_LT_ADD);
505 (ASM_SIMP_TAC[REAL_LT_MUL; REAL_ARITH `&0 < a ==> &0 <= a`; DIST_POS_LT]);
506 (ASM_REWRITE_TAC[])]);;
508 (* ======================================================================= *)
510 let BARV_IMP_HL_1_POS_LT = prove_by_refinement (
512 saturated V /\ packing V /\ barV V 3 ul
513 ==> &0 < hl (truncate_simplex 1 ul)`,
515 (NEW_GOAL `?u0 u1 u2 u3. (ul:(real^3)list) = [u0:real^3;u1;u2;u3]`);
516 (MP_TAC (ASSUME `barV V 3 ul`));
517 (REWRITE_TAC[BARV_3_EXPLICIT]);
518 (REPEAT (FIRST_X_ASSUM CHOOSE_TAC));
519 (ABBREV_TAC `vl = truncate_simplex 1 (ul:(real^3)list)`);
520 (NEW_GOAL `hl (vl:(real^3)list) = dist (circumcenter (set_of_list vl),HD vl)`);
521 (MATCH_MP_TAC HL_EQ_DIST0);
522 (EXISTS_TAC `V:real^3->bool`);
526 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
528 (ASM_REWRITE_TAC[ARITH_RULE `1 <= 3`]);
530 (NEW_GOAL `&0 <= hl (vl:(real^3)list)`);
531 (ASM_REWRITE_TAC[DIST_POS_LE]);
532 (ASM_CASES_TAC `&0 < hl (vl:(real^3)list)`);
534 (NEW_GOAL `hl (vl:(real^3)list) = &0`);
535 (ASM_REAL_ARITH_TAC);
537 (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
538 (REWRITE_TAC[DIST_EQ_0]);
539 (REWRITE_WITH `vl = [u0;u1:real^3]`);
540 (EXPAND_TAC "vl" THEN REWRITE_TAC[ASSUME `ul = [u0;u1;u2;u3:real^3]`]);
541 (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1]);
542 (REWRITE_TAC[set_of_list;HD;CIRCUMCENTER_2;midpoint]);
544 (NEW_GOAL `(u0:real^3) = u1`);
545 (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
546 (NEW_GOAL `barV V 1 (vl:(real^3)list)`);
548 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
550 (ASM_REWRITE_TAC[ARITH_RULE `1 <= 3`]);
551 (NEW_GOAL `CARD (set_of_list (vl:(real^3)list)) = 1 + 1`);
552 (ASM_MESON_TAC[BARV_IMP_LENGTH_EQ_CARD]);
553 (UP_ASM_TAC THEN REWRITE_WITH `vl = [u0;u1:real^3]`);
554 (EXPAND_TAC "vl" THEN REWRITE_TAC[ASSUME `ul = [u0;u1;u2;u3:real^3]`]);
555 (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1]);
556 (ASM_REWRITE_TAC[set_of_list]);
557 (REWRITE_TAC[ SET_RULE `{u1, u1:real^3} = {u1}`]);
558 (REWRITE_TAC[Hypermap.CARD_SINGLETON]);
560 (UP_ASM_TAC THEN MESON_TAC[])]);;
562 (* ======================================================================= *)
564 let CLOSED_MCELL = prove_by_refinement (
566 saturated V /\ packing V /\ barV V 3 ul
567 ==> closed (mcell k V ul)`,
569 (ASM_CASES_TAC `k = 0`);
570 (ASM_REWRITE_TAC[MCELL_EXPLICIT;mcell0]);
571 (MATCH_MP_TAC CLOSED_DIFF);
572 (ASM_MESON_TAC[CLOSED_ROGERS; OPEN_BALL]);
574 (ASM_CASES_TAC `k = 1`);
575 (ASM_REWRITE_TAC[MCELL_EXPLICIT;mcell1]);
577 (MATCH_MP_TAC CLOSED_DIFF);
579 (MATCH_MP_TAC CLOSED_INTER);
580 (ASM_MESON_TAC[CLOSED_ROGERS; CLOSED_CBALL]);
581 (REWRITE_TAC[OPEN_RCONE_GT]);
582 (REWRITE_TAC[CLOSED_EMPTY]);
584 (SUBGOAL_THEN `? u0 u1 u2 u3. (ul:(real^3)list) = [u0:real^3;u1;u2;u3]` CHOOSE_TAC);
585 (MP_TAC (ASSUME `barV V 3 ul`));
586 (REWRITE_TAC[BARV_3_EXPLICIT]);
587 (FIRST_X_ASSUM CHOOSE_TAC);
588 (FIRST_X_ASSUM CHOOSE_TAC);
589 (FIRST_X_ASSUM CHOOSE_TAC);
590 (ASM_CASES_TAC `k = 2`);
592 (ASM_REWRITE_TAC[MCELL_EXPLICIT;mcell2]);
595 (MATCH_MP_TAC CLOSED_INTER);
598 (MATCH_MP_TAC CLOSED_RCONE_GE);
600 (MATCH_MP_TAC REAL_LT_DIV);
601 (SIMP_TAC[SQRT_POS_LT; REAL_ARITH `&0 < &2`]);
602 (ASM_MESON_TAC[BARV_IMP_HL_1_POS_LT]);
604 (MATCH_MP_TAC CLOSED_INTER);
606 (MATCH_MP_TAC CLOSED_RCONE_GE);
608 (MATCH_MP_TAC REAL_LT_DIV);
609 (SIMP_TAC[SQRT_POS_LT; REAL_ARITH `&0 < &2`]);
610 (ASM_MESON_TAC[BARV_IMP_HL_1_POS_LT]);
612 (MATCH_MP_TAC CLOSED_AFF_GE);
613 (MESON_TAC[Geomdetail.FINITE6]);
614 (MESON_TAC[CLOSED_EMPTY]);
616 (ASM_CASES_TAC `k = 3`);
617 (ASM_REWRITE_TAC[MCELL_EXPLICIT;mcell3]);
619 (ASM_MESON_TAC[CLOSED_SET_OF_LIST_KY_LEMMA_1]);
620 (MESON_TAC[CLOSED_EMPTY]);
624 (ASM_SIMP_TAC[MCELL_EXPLICIT;mcell4]);
626 (ASM_MESON_TAC[CLOSED_SET_OF_LIST_KY_LEMMA_2]);
627 (MESON_TAC[CLOSED_EMPTY])
630 (* ======================================================================= *)
632 let BARV_IMP_u0_IN_V = prove_by_refinement (
634 saturated V /\ packing V /\ barV V 3 ul /\ ul = [u0;u1;u2;u3:real^3]
636 [(REWRITE_TAC[BARV; VORONOI_NONDG]);
638 (NEW_GOAL `initial_sublist [u0:real^3] ul /\ 0 < LENGTH [u0]`);
639 (REWRITE_TAC[INITIAL_SUBLIST;LENGTH; APPEND; ARITH_RULE `0 < SUC 0`]);
640 (EXISTS_TAC `[u1;u2;u3:real^3]`);
642 (NEW_GOAL `set_of_list [u0:real^3] SUBSET V`);
644 (UP_ASM_TAC THEN REWRITE_TAC[set_of_list]);
647 (* ======================================================================= *)
649 let ROGERS_INTER_V_LEMMA = prove_by_refinement (
651 saturated V /\ packing V /\ barV V 3 ul /\ v IN V /\ (rogers V ul v)
654 (SUBGOAL_THEN `? u0 u1 u2 u3. (ul:(real^3)list) = [u0:real^3;u1;u2;u3]` CHOOSE_TAC);
655 (MP_TAC (ASSUME `barV V 3 ul`));
656 (REWRITE_TAC[BARV_3_EXPLICIT]);
657 (FIRST_X_ASSUM CHOOSE_TAC);
658 (FIRST_X_ASSUM CHOOSE_TAC);
659 (FIRST_X_ASSUM CHOOSE_TAC);
660 (ASM_REWRITE_TAC[HD]);
662 (NEW_GOAL `(rogers V ul) SUBSET (voronoi_closed V (u0:real^3))`);
663 (REWRITE_TAC[SUBSET]);
665 (NEW_GOAL `!p. p IN voronoi_closed V u0 <=>
666 (?vl. vl IN barV V 3 /\
668 truncate_simplex 0 vl = [u0:real^3])`);
669 (GEN_TAC THEN MATCH_MP_TAC GLTVHUM);
671 (ASM_MESON_TAC[BARV_IMP_u0_IN_V]);
673 (EXISTS_TAC `ul:(real^3)list`);
674 (ASM_REWRITE_TAC[IN; TRUNCATE_SIMPLEX_EXPLICIT_0]);
675 (NEW_GOAL `(v:real^3) IN (voronoi_closed V u0)`);
677 (UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed;IN;IN_ELIM_THM]);
679 (NEW_GOAL `dist (v,u0) <= dist (v,v:real^3)`);
680 (FIRST_ASSUM MATCH_MP_TAC);
681 (ASM_REWRITE_TAC[GSYM IN]);
682 (UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL]);
684 (NEW_GOAL `dist (v, u0:real^3) = &0`);
685 (NEW_GOAL `&0 <= dist (v, u0:real^3)`);
686 (REWRITE_TAC[DIST_POS_LE]);
687 (ASM_REAL_ARITH_TAC);
688 (UP_ASM_TAC THEN MESON_TAC[DIST_EQ_0])]);;
690 (* ======================================================================= *)
692 let CONVEX_HULL_4 = prove
693 (`convex hull {a,b,c,d} =
694 { u % a + v % b + w % c + z %d|
695 &0 <= u /\ &0 <= v /\ &0 <= w /\ &0 <= z /\ u + v + w + z = &1}`,
696 SIMP_TAC[CONVEX_HULL_FINITE; FINITE_INSERT; FINITE_RULES] THEN
697 SIMP_TAC[CONVEX_HULL_FINITE_STEP; FINITE_INSERT; FINITE_RULES] THEN
698 REWRITE_TAC[REAL_ARITH `x - y = z:real <=> x = y + z`;
699 VECTOR_ARITH `x - y = z:real^N <=> x = y + z`] THEN
700 REWRITE_TAC[VECTOR_ADD_RID; REAL_ADD_RID] THEN SET_TAC[]);;
702 (* ======================================================================= *)
704 let REAL_LE_DIV_SIMPLIFY_KY_LEMMA = prove_by_refinement (
705 `!a b c. &0 < a /\ b <= c / a ==> a * b <= c`,
707 (NEW_GOAL `a * b <= a * (c / a)`);
708 (REWRITE_TAC[REAL_ARITH `x * y <= x * z <=> &0 <= x * (z - y)`]);
709 (MATCH_MP_TAC REAL_LE_MUL);
710 (ASM_REAL_ARITH_TAC);
711 (NEW_GOAL `a * c / a = c`);
712 (REWRITE_TAC[REAL_ARITH `a * c / a = c / a * a`]);
713 (MATCH_MP_TAC REAL_DIV_RMUL);
714 (ASM_REAL_ARITH_TAC);
715 (ASM_MESON_TAC[])]);;
717 (* ======================================================================= *)
720 let EVENTUALLY_RADIAL_CONVEX_HULL_4_sub1 = prove_by_refinement (
722 ~( a IN convex hull {b , c, d})
723 ==> eventually_radial a (convex hull {a, b , c, d})`,
725 (REWRITE_TAC[eventually_radial]);
726 (ABBREV_TAC `s = convex hull {b , c, d:real^3}`);
728 (NEW_GOAL `(?(x:real^3). x IN s /\
729 (!y:real^3. y IN s ==> dist (a,x) <= dist (a,y)))`);
730 (MATCH_MP_TAC DISTANCE_ATTAINS_INF);
733 (MATCH_MP_TAC CLOSED_CONVEX_HULL_FINITE);
734 (REWRITE_TAC[Geomdetail.FINITE6]);
735 (REWRITE_TAC[CONVEX_HULL_EQ_EMPTY]);
737 (FIRST_X_ASSUM CHOOSE_TAC);
738 (EXISTS_TAC `dist (a, x:real^3)`);
740 (NEW_GOAL `dist (a, x) <= dist (a, b:real^3) /\
741 dist (a, x) <= dist (a, c:real^3) /\
742 dist (a, x) <= dist (a, d:real^3)`);
743 (UP_ASM_TAC THEN REPEAT STRIP_TAC);
745 (FIRST_ASSUM MATCH_MP_TAC);
747 (MATCH_MP_TAC (SET_RULE `b IN {b} /\ {b} SUBSET s ==> b IN s `));
750 (NEW_GOAL `{b:real^3} = convex hull {b}`);
751 (ONCE_REWRITE_TAC[MESON[] `a = b <=> b = a` ]);
752 (REWRITE_TAC[CONVEX_HULL_EQ]);
753 (REWRITE_TAC[CONVEX_SING]);
754 (ONCE_ASM_REWRITE_TAC[]);
756 (MATCH_MP_TAC Marchal_cells.CONVEX_HULL_SUBSET);
759 (FIRST_ASSUM MATCH_MP_TAC);
761 (MATCH_MP_TAC (SET_RULE `c IN {c} /\ {c} SUBSET s ==> c IN s `));
764 (NEW_GOAL `{c:real^3} = convex hull {c}`);
765 (ONCE_REWRITE_TAC[MESON[] `a = b <=> b = a` ]);
766 (REWRITE_TAC[CONVEX_HULL_EQ]);
767 (REWRITE_TAC[CONVEX_SING]);
768 (ONCE_ASM_REWRITE_TAC[]);
770 (MATCH_MP_TAC Marchal_cells.CONVEX_HULL_SUBSET);
774 (FIRST_ASSUM MATCH_MP_TAC);
776 (MATCH_MP_TAC (SET_RULE `c IN {c} /\ {c} SUBSET s ==> c IN s `));
779 (NEW_GOAL `{d:real^3} = convex hull {d}`);
780 (ONCE_REWRITE_TAC[MESON[] `a = b <=> b = a` ]);
781 (REWRITE_TAC[CONVEX_HULL_EQ]);
782 (REWRITE_TAC[CONVEX_SING]);
783 (ONCE_ASM_REWRITE_TAC[]);
785 (MATCH_MP_TAC Marchal_cells.CONVEX_HULL_SUBSET);
788 (* ======== break main lemma into 2 smaller ones =============== *)
792 (ASM_CASES_TAC `dist (a:real^3, x) = &0`);
793 (UP_ASM_TAC THEN REWRITE_TAC[DIST_EQ_0]);
797 (UP_ASM_TAC THEN MESON_TAC[]);
798 (NEW_GOAL `&0 <= dist (a, x:real^3)`);
799 (REWRITE_TAC[DIST_POS_LE]);
800 (ASM_REAL_ARITH_TAC);
804 (REWRITE_TAC[radial; INTER_SUBSET]);
806 (REWRITE_TAC[IN_INTER]);
808 (ASM_CASES_TAC `u:real^3 = vec 0`);
809 (ASM_REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_ADD_RID]);
810 (REWRITE_TAC[CONVEX_HULL_4;IN;IN_ELIM_THM]);
811 (EXISTS_TAC `&1` THEN EXISTS_TAC `&0` THEN EXISTS_TAC `&0` THEN EXISTS_TAC `&0`);
812 (REWRITE_TAC[REAL_ARITH `&0 <= &1 /\ &0 <= &0 /\ &1 + &0 + &0 + &0 = &1`]);
814 (NEW_GOAL `?y. y IN convex hull {b, c, d:real^3} /\
815 (a + t % u) IN convex hull {a, y}`);
816 (UNDISCH_TAC `a + u IN convex hull {a, b, c, d:real^3} INTER ball (a,dist (a,x))`);
817 (REWRITE_TAC[CONVEX_HULL_4;IN_INTER;IN;IN_ELIM_THM]);
819 (EXISTS_TAC `(&1 / (&1 - u')) % (v % b + w % c + z % (d:real^3))`);
821 (REWRITE_TAC[CONVEX_HULL_3;IN_ELIM_THM]);
822 (EXISTS_TAC ` v / (&1 - u')`);
823 (EXISTS_TAC ` w / (&1 - u')`);
824 (EXISTS_TAC ` z / (&1 - u')`);
827 (MATCH_MP_TAC REAL_LE_DIV);
828 (ASM_REAL_ARITH_TAC);
829 (MATCH_MP_TAC REAL_LE_DIV);
830 (ASM_REAL_ARITH_TAC);
831 (MATCH_MP_TAC REAL_LE_DIV);
832 (ASM_REAL_ARITH_TAC);
833 (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a + b + c) / x`]);
834 (MATCH_MP_TAC (MESON [REAL_DIV_REFL] `~(y = &0) /\ (x = y) ==> x / y = &1`));
835 (ASM_REWRITE_TAC[REAL_ARITH `!a b c d e.
836 (&1 - a = &0 <=> a = &1) /\ ( b + c + d = &1 - e <=> e + b + c + d = &1)`]);
838 (NEW_GOAL `v = &0 /\ w = &0 /\ z = &0`);
839 (ASM_REAL_ARITH_TAC);
840 (UNDISCH_TAC `(a:real^3) + u = u' % a + v % b + w % c + z % d`);
841 (ASM_REWRITE_TAC[VECTOR_MUL_LID; VECTOR_MUL_LZERO]);
842 (REWRITE_TAC[VECTOR_ARITH `a + (u:real^3) = a + vec 0 + vec 0 + vec 0 <=> u = vec 0`]);
845 (REWRITE_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC]);
846 (REWRITE_TAC[REAL_ARITH `!x y. &1 / x * y = y / x`]);
848 (REWRITE_WITH `v % (b:real^3) + w % c + z % d = a + u - u' % a`);
849 (SWITCH_TAC THEN UP_ASM_TAC THEN VECTOR_ARITH_TAC);
850 (REWRITE_TAC[VECTOR_ARITH `!a t u. a + u - t % a = (&1 - t) % a + u`]);
851 (REWRITE_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC]);
852 (REWRITE_WITH `&1 / (&1 - u') * (&1 - u') = &1`);
853 (REWRITE_TAC[REAL_ARITH `!x y. &1 / x * y = y / x`]);
854 (MATCH_MP_TAC REAL_DIV_REFL);
855 (REWRITE_TAC[REAL_ARITH `!a. &1 - a = &0 <=> a = &1`]);
857 (NEW_GOAL `v = &0 /\ w = &0 /\ z = &0`);
858 (ASM_REAL_ARITH_TAC);
859 (UNDISCH_TAC `(a:real^3) + u = u' % a + v % b + w % c + z % d`);
860 (ASM_REWRITE_TAC[VECTOR_MUL_LID; VECTOR_MUL_LZERO]);
861 (REWRITE_TAC[VECTOR_ARITH `a + (u:real^3) = a + vec 0 + vec 0 + vec 0 <=> u = vec 0`]);
863 (REWRITE_TAC[VECTOR_MUL_LID; CONVEX_HULL_2;IN_ELIM_THM]);
864 (EXISTS_TAC `&1 - t * (&1 - u') `);
865 (EXISTS_TAC `t * (&1 - u')`);
868 (REWRITE_TAC[REAL_ARITH `&0 <= &1 - a <=> a <= &1`]);
869 (NEW_GOAL `dist (a:real^3, a + u) / (&1 - u') = dist (a, a + (&1 / (&1 - u')) % u)`);
870 (REWRITE_TAC[dist; VECTOR_ARITH `a - (a + s:real^3) = -- s`; NORM_NEG; NORM_MUL; REAL_ABS_DIV; REAL_ABS_1]);
871 (ONCE_REWRITE_TAC[REAL_ARITH `&1 / x * y = y / x`]);
873 (ONCE_REWRITE_TAC[MESON[] `x = y <=> y = x`]);
874 (REWRITE_TAC[REAL_ABS_REFL]);
875 (REWRITE_TAC[REAL_ARITH `!a. &0 <= &1 - a <=> a <= &1`]);
876 (ASM_REAL_ARITH_TAC);
877 (NEW_GOAL `(&1 - u') * dist (a, x:real^3) <= norm (u:real^3) `);
878 (REWRITE_WITH `norm (u:real^3) = dist (a, a +u)`);
881 (MATCH_MP_TAC REAL_LE_DIV_SIMPLIFY_KY_LEMMA);
885 (ASM_CASES_TAC `(&0 < &1 - u')`);
887 (NEW_GOAL `u' = &1`);
888 (NEW_GOAL `u' <= &1`);
889 (ASM_REAL_ARITH_TAC);
890 (NEW_GOAL `&1 <= u'`);
891 (ASM_REAL_ARITH_TAC);
892 (ASM_REAL_ARITH_TAC);
893 (NEW_GOAL `v = &0 /\ w = &0 /\ z = &0`);
894 (ASM_REAL_ARITH_TAC);
895 (UNDISCH_TAC `(a:real^3) + u = u' % a + v % b + w % c + z % d`);
896 (ASM_REWRITE_TAC[VECTOR_MUL_LID; VECTOR_MUL_LZERO]);
897 (REWRITE_TAC[VECTOR_ARITH `a + (u:real^3) = a + vec 0 + vec 0 + vec 0 <=> u = vec 0`]);
900 (UNDISCH_TAC `x IN s /\ (!y. y IN s ==> dist (a:real^3,x) <= dist (a,y))`);
902 (FIRST_ASSUM MATCH_MP_TAC);
903 (EXPAND_TAC "s" THEN REWRITE_TAC[CONVEX_HULL_3; IN; IN_ELIM_THM]);
905 (EXISTS_TAC ` v / (&1 - u')`);
906 (EXISTS_TAC ` w / (&1 - u')`);
907 (EXISTS_TAC ` z / (&1 - u')`);
910 (MATCH_MP_TAC REAL_LE_DIV);
911 (ASM_REAL_ARITH_TAC);
912 (MATCH_MP_TAC REAL_LE_DIV);
913 (ASM_REAL_ARITH_TAC);
914 (MATCH_MP_TAC REAL_LE_DIV);
915 (ASM_REAL_ARITH_TAC);
916 (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a + b + c) / x`]);
917 (MATCH_MP_TAC (MESON [REAL_DIV_REFL] `~(y = &0) /\ (x = y) ==> x / y = &1`));
918 (ASM_REWRITE_TAC[REAL_ARITH `!a b c d e.
919 (&1 - a = &0 <=> a = &1) /\ ( b + c + d = &1 - e <=> e + b + c + d = &1)`]);
921 (NEW_GOAL `v = &0 /\ w = &0 /\ z = &0`);
922 (ASM_REAL_ARITH_TAC);
923 (UNDISCH_TAC `(a:real^3) + u = u' % a + v % b + w % c + z % d`);
924 (ASM_REWRITE_TAC[VECTOR_MUL_LID; VECTOR_MUL_LZERO]);
925 (REWRITE_TAC[VECTOR_ARITH `a + (u:real^3) = a + vec 0 + vec 0 + vec 0 <=> u = vec 0`]);
928 (REWRITE_WITH `v / (&1 - u') % b + w / (&1 - u') % c + z / (&1 - u') % d =
929 &1 / (&1 - u') % (a + u:real^3) - u'/ (&1 - u') % a `);
931 (REWRITE_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC]);
932 (REWRITE_TAC[REAL_ARITH `&1 / x * y = y / x`]);
934 (REWRITE_TAC[VECTOR_ADD_LDISTRIB]);
937 (REWRITE_TAC[VECTOR_ARITH `a + b = (t % a + b) - s % a <=> a = (t - s) % a`]);
938 (REWRITE_WITH `&1 / (&1 - u') - u' / (&1 - u') = &1`);
939 (REWRITE_TAC[REAL_ARITH `a / b - c / b = (a - c) / b`]);
940 (MATCH_MP_TAC REAL_DIV_REFL);
941 (REWRITE_TAC[REAL_ARITH `!a. &1 - a = &0 <=> a = &1`]);
943 (NEW_GOAL `v = &0 /\ w = &0 /\ z = &0`);
944 (ASM_REAL_ARITH_TAC);
945 (UNDISCH_TAC `(a:real^3) + u = u' % a + v % b + w % c + z % d`);
946 (ASM_REWRITE_TAC[VECTOR_MUL_LID; VECTOR_MUL_LZERO]);
947 (REWRITE_TAC[VECTOR_ARITH `a + (u:real^3) = a + vec 0 + vec 0 + vec 0 <=> u = vec 0`]);
949 (REWRITE_TAC[VECTOR_MUL_LID]);
953 (NEW_GOAL `t * ((&1 - u') * dist (a,x:real^3)) <= t * norm (u:real^3)`);
954 (REWRITE_TAC[REAL_ARITH `t * s <= t * k <=> &0 <= t * (k - s)`]);
955 (MATCH_MP_TAC REAL_LE_MUL);
956 (ASM_REAL_ARITH_TAC);
957 (NEW_GOAL `t * ((&1 - u') * dist (a,x:real^3)) <= dist (a, x)`);
958 (ASM_REAL_ARITH_TAC);
959 (NEW_GOAL ` t * (&1 - u') <= &1 <=>
960 (t * (&1 - u')) * dist (a,x:real^3) <= &1 * dist (a,x)`);
961 (ONCE_REWRITE_TAC[MESON[] `(a <=> b) <=> (b <=> a)`]);
962 (MATCH_MP_TAC REAL_LE_RMUL_EQ);
963 (ASM_CASES_TAC `dist (a:real^3, x) = &0`);
964 (UP_ASM_TAC THEN REWRITE_TAC[DIST_EQ_0]);
968 (UP_ASM_TAC THEN MESON_TAC[]);
969 (NEW_GOAL `&0 <= dist (a, x:real^3)`);
970 (REWRITE_TAC[DIST_POS_LE]);
971 (ASM_REAL_ARITH_TAC);
975 (ASM_REAL_ARITH_TAC);
976 (MATCH_MP_TAC REAL_LE_MUL);
977 (ASM_REAL_ARITH_TAC);
978 (ASM_REAL_ARITH_TAC);
981 (REWRITE_TAC[VECTOR_SUB_RDISTRIB; VECTOR_ADD_LDISTRIB; VECTOR_MUL_LID; VECTOR_MUL_ASSOC]);
983 (REWRITE_TAC [VECTOR_ARITH `a + m % u = a - t + t + n % u <=> (m - n) % u = vec 0`; VECTOR_MUL_EQ_0]);
985 (REWRITE_TAC[REAL_ARITH `(a * b) * &1 / b = a * (b / b)`]);
988 (* ======================================================================== *)
990 (REWRITE_TAC[REAL_ARITH `t - t * s = t * (&1 - s)`]);
991 (MATCH_MP_TAC (MESON[REAL_MUL_RZERO] ` x = &0 ==> t * x = &0`));
992 (REWRITE_TAC[REAL_ARITH `&1 - t = &0 <=> t = &1`]);
993 (MATCH_MP_TAC REAL_DIV_REFL);
995 (REWRITE_TAC[REAL_ARITH `!a. &1 - a = &0 <=> a = &1`]);
997 (NEW_GOAL `v = &0 /\ w = &0 /\ z = &0`);
998 (ASM_REAL_ARITH_TAC);
999 (UNDISCH_TAC `(a:real^3) + u = u' % a + v % b + w % c + z % d`);
1000 (ASM_REWRITE_TAC[VECTOR_MUL_LID; VECTOR_MUL_LZERO]);
1001 (REWRITE_TAC[VECTOR_ARITH `a + (u:real^3) = a + vec 0 + vec 0 + vec 0 <=> u = vec 0`]);
1004 (* ghep vao cuchuoi *)
1006 (FIRST_X_ASSUM CHOOSE_TAC);
1007 (UP_ASM_TAC THEN REPEAT STRIP_TAC);
1008 (UP_ASM_TAC THEN MATCH_MP_TAC (SET_RULE `A SUBSET B ==> (a IN A ==> a IN B)`));
1009 (NEW_GOAL `convex hull {a, b , c, d:real^3} = convex hull (convex hull {a, b, c, d})`);
1010 (ONCE_REWRITE_TAC[MESON [] `!a b. a = b <=> b = a`]);
1011 (REWRITE_TAC[CONVEX_HULL_EQ; CONVEX_CONVEX_HULL]);
1012 (ONCE_ASM_REWRITE_TAC[]);
1013 (MATCH_MP_TAC CONVEX_HULL_SUBSET);
1014 (MATCH_MP_TAC (SET_RULE `!m a S. m IN S /\ a IN S ==> {a, m} SUBSET S`));
1016 (MATCH_MP_TAC (SET_RULE `m IN convex hull {b, c, d:real^3} /\
1017 convex hull {b, c, d} SUBSET n ==> m IN n`));
1018 (ASM_REWRITE_TAC[]);
1019 (EXPAND_TAC "s" THEN MATCH_MP_TAC CONVEX_HULL_SUBSET);
1021 (REWRITE_TAC[CONVEX_HULL_4;IN;IN_ELIM_THM]);
1022 (EXISTS_TAC `&1` THEN EXISTS_TAC `&0` THEN EXISTS_TAC `&0` THEN EXISTS_TAC `&0`);
1023 (REWRITE_TAC[REAL_ARITH `&0 <= &1 /\ &0 <= &0 /\ &1 + &0 + &0 + &0 = &1`]);
1026 (REWRITE_TAC[ball;IN;IN_ELIM_THM]);
1027 (REWRITE_WITH `dist (a:real^3,a + t % u) = t * norm u`);
1028 (REWRITE_TAC[dist; VECTOR_ARITH `a - (a + b:real^3) = -- b`; NORM_NEG;
1030 (AP_THM_TAC THEN AP_TERM_TAC);
1031 (REWRITE_TAC[REAL_ABS_REFL]);
1032 (ASM_REAL_ARITH_TAC);
1033 (ASM_REWRITE_TAC[])]);;
1035 (* ======================================================================= *)
1037 let U0_NOT_IN_CONVEX_HULL_FROM_ROGERS = prove_by_refinement (
1038 `!V (ul:(real^3)list).
1039 saturated V /\ packing V /\ barV V 3 ul
1042 {omega_list_n V ul 1, omega_list_n V ul 2, omega_list_n V ul 3})`,
1043 [(REWRITE_TAC[ARITH_RULE `1 = SUC 0 /\ 2 = SUC 1 /\ 3 = SUC 2`; OMEGA_LIST_N]);
1044 (REWRITE_TAC[ARITH_RULE `SUC 0 = 1 /\ SUC 1 = 2 /\ SUC 2 = 3`]);
1046 (NEW_GOAL `?u0 u1 u2 u3. (ul:(real^3)list) = [u0:real^3;u1;u2;u3]`);
1047 (MP_TAC (ASSUME `barV V 3 ul`));
1048 (REWRITE_TAC[BARV_3_EXPLICIT]);
1049 (FIRST_X_ASSUM CHOOSE_TAC);
1050 (FIRST_X_ASSUM CHOOSE_TAC);
1051 (FIRST_X_ASSUM CHOOSE_TAC);
1052 (FIRST_X_ASSUM CHOOSE_TAC);
1054 (ABBREV_TAC `a = closest_point (voronoi_list V
1055 (truncate_simplex 1 (ul:(real^3)list)))`);
1056 (ABBREV_TAC `b = closest_point (voronoi_list V
1057 (truncate_simplex 2 (ul:(real^3)list)))`);
1058 (ABBREV_TAC `c = closest_point (voronoi_list V
1059 (truncate_simplex 3 (ul:(real^3)list)))`);
1060 (* First estimation *)
1062 (NEW_GOAL `(a (HD ul)) IN voronoi_list V (truncate_simplex 1 (ul:(real^3)list))`);
1064 (MATCH_MP_TAC CLOSEST_POINT_IN_SET);
1065 (REWRITE_TAC[Packing3.CLOSED_VORONOI_LIST]);
1066 (MATCH_MP_TAC Packing3.BARV_IMP_VORONOI_LIST_NOT_EMPTY);
1068 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
1070 (ASM_REWRITE_TAC[]);
1073 (* Second estimation *)
1075 (NEW_GOAL `((b:real^3->real^3) (a (HD ul))) IN voronoi_list V (truncate_simplex 2 (ul:(real^3)list))`);
1078 (MATCH_MP_TAC CLOSEST_POINT_IN_SET);
1079 (REWRITE_TAC[Packing3.CLOSED_VORONOI_LIST]);
1080 (MATCH_MP_TAC Packing3.BARV_IMP_VORONOI_LIST_NOT_EMPTY);
1082 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
1084 (ASM_REWRITE_TAC[]);
1087 (* Third estimation *)
1089 (NEW_GOAL `((c:(real^3->real^3))((b:real^3->real^3) (a (HD ul)))) IN voronoi_list V (truncate_simplex 3 (ul:(real^3)list))`);
1091 (MATCH_MP_TAC CLOSEST_POINT_IN_SET);
1092 (REWRITE_TAC[Packing3.CLOSED_VORONOI_LIST]);
1093 (MATCH_MP_TAC Packing3.BARV_IMP_VORONOI_LIST_NOT_EMPTY);
1095 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
1097 (ASM_REWRITE_TAC[]);
1100 (ABBREV_TAC `x:real^3 = (a (HD (ul:(real^3)list)))`);
1101 (ABBREV_TAC `y:real^3 = b (x:real^3)`);
1102 (ABBREV_TAC `z:real^3 = c (y:real^3)`);
1105 (NEW_GOAL `(y:real^3) IN voronoi_list V (truncate_simplex 1 ul)`);
1106 (MATCH_MP_TAC (SET_RULE `(?A. a IN A /\ A SUBSET B) ==> a IN B`));
1107 (EXISTS_TAC `voronoi_list V (truncate_simplex 2 (ul:(real^3)list))`);
1108 (ASM_REWRITE_TAC[VORONOI_LIST;VORONOI_SET]);
1109 (MATCH_MP_TAC (SET_RULE `b SUBSET s ==> (INTERS s) SUBSET (INTERS b)`));
1110 (REWRITE_TAC[SIMPLE_IMAGE]);
1111 (MATCH_MP_TAC IMAGE_SUBSET);
1112 (ASM_REWRITE_TAC[set_of_list; TRUNCATE_SIMPLEX_EXPLICIT_1; TRUNCATE_SIMPLEX_EXPLICIT_2]);
1115 (NEW_GOAL `(z:real^3) IN voronoi_list V (truncate_simplex 1 ul)`);
1116 (MATCH_MP_TAC (SET_RULE `(?A. a IN A /\ A SUBSET B) ==> a IN B`));
1117 (EXISTS_TAC `voronoi_list V (truncate_simplex 3 (ul:(real^3)list))`);
1118 (ASM_REWRITE_TAC[VORONOI_LIST;VORONOI_SET]);
1119 (MATCH_MP_TAC (SET_RULE `b SUBSET s ==> (INTERS s) SUBSET (INTERS b)`));
1120 (REWRITE_TAC[SIMPLE_IMAGE]);
1121 (MATCH_MP_TAC IMAGE_SUBSET);
1122 (ASM_REWRITE_TAC[set_of_list; TRUNCATE_SIMPLEX_EXPLICIT_1; TRUNCATE_SIMPLEX_EXPLICIT_3]);
1125 (NEW_GOAL `convex hull {x, y, z:real^3} SUBSET (convex hull voronoi_list V (truncate_simplex 1 ul))`);
1126 (MATCH_MP_TAC CONVEX_HULL_SUBSET);
1129 (NEW_GOAL `convex hull voronoi_list V (truncate_simplex 1 (ul:(real^3)list))
1130 = voronoi_list V (truncate_simplex 1 ul)`);
1131 (REWRITE_TAC [CONVEX_HULL_EQ; Packing3.CONVEX_VORONOI_LIST]);
1132 (NEW_GOAL `u0:real^3 IN voronoi_list V (truncate_simplex 1 ul)`);
1133 (REWRITE_WITH `u0:real^3 = HD ul`);
1134 (ASM_MESON_TAC[HD]);
1137 (ASM_REWRITE_TAC[ TRUNCATE_SIMPLEX_EXPLICIT_1; VORONOI_LIST; VORONOI_SET;set_of_list]);
1138 (REWRITE_WITH `INTERS {voronoi_closed V v | v IN {u0, u1:real^3}} =
1139 voronoi_closed V u0 INTER voronoi_closed V u1`);
1143 (REWRITE_TAC[IN_INTER; voronoi_closed; IN; IN_ELIM_THM; INTERS; DIST_REFL]);
1145 (NEW_GOAL `dist (u0, u1:real^3) <= dist (u0, u0)`);
1146 (FIRST_ASSUM MATCH_MP_TAC);
1147 (ASM_SET_TAC[BARV_IMP_u0_IN_V]);
1148 (NEW_GOAL `u0 = u1:real^3`);
1149 (UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL] THEN DISCH_TAC);
1150 (NEW_GOAL `dist (u0,u1:real^3) = &0`);
1151 (NEW_GOAL `&0 <= dist (u0,u1:real^3) `);
1152 (REWRITE_TAC[DIST_POS_LE]);
1153 (ASM_REAL_ARITH_TAC);
1154 (ASM_MESON_TAC[DIST_EQ_0]);
1155 (NEW_GOAL `aff_dim (set_of_list [u0;u1:real^3]) = &0`);
1156 (ASM_REWRITE_TAC[set_of_list; SET_RULE `{x, x} = {x}`; AFF_DIM_SING]);
1157 (NEW_GOAL `aff_dim (set_of_list [u0;u1:real^3]) = &1`);
1158 (MATCH_MP_TAC MHFTTZN1);
1159 (EXISTS_TAC `V:real^3->bool`);
1160 (ASM_REWRITE_TAC[]);
1161 (REWRITE_WITH `[u1; u1:real^3] = truncate_simplex 1 ul`);
1162 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1]);
1163 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
1165 (ASM_REWRITE_TAC[]);
1168 (NEW_GOAL `&0 = &1`);
1169 (ASM_MESON_TAC[INT_OF_NUM_EQ;REAL_OF_NUM_EQ]);
1170 (UP_ASM_TAC THEN REAL_ARITH_TAC)]);;
1172 (* ======================================================================= *)
1174 let RADIAL_VS_RADIAL_NORM = prove_by_refinement (
1175 `!(x:real^3) r C. radial r x C <=> radial_norm r x C`,
1177 (REWRITE_TAC[radial; Vol1.radial_norm]);
1178 (REWRITE_WITH `!(x:real^3) r. ball (x, r) = normball x r`);
1179 (REWRITE_TAC[ball; normball; DIST_SYM])]);;
1181 (* ======================================================================= *)
1184 let EVENTUALLY_RADIAL_INTER = prove_by_refinement (
1186 eventually_radial x C /\ eventually_radial x C' ==>
1187 eventually_radial x (C INTER C')`,
1188 [ (REWRITE_TAC[eventually_radial; RADIAL_VS_RADIAL_NORM]);
1189 (REWRITE_WITH `!(x:real^3) r. ball (x, r) = normball x r`);
1190 (REWRITE_TAC[ball; normball; DIST_SYM]);
1192 (ASM_CASES_TAC `r >= r'`);
1193 (EXISTS_TAC `r':real`);
1194 (ASM_REWRITE_TAC[]);
1196 (REWRITE_WITH `(C INTER C') INTER normball (x:real^3) r' =
1197 (C INTER normball x r') INTER (C' INTER normball x r')`);
1199 (MATCH_MP_TAC Vol1.inter_radial);
1200 (ASM_REWRITE_TAC[]);
1201 (UNDISCH_TAC `radial_norm r (x:real^3) (C INTER normball x r)`);
1202 (REWRITE_TAC[Vol1.radial_norm; normball]);
1204 (REWRITE_TAC[INTER_SUBSET]);
1206 (NEW_GOAL `x + u IN C INTER {y | dist (y,x:real^3) < r}`);
1207 (MATCH_MP_TAC (SET_RULE `(?s. a IN s /\ s SUBSET t) ==> a IN t `));
1208 (EXISTS_TAC `C INTER {y | dist (y,x:real^3) < r'}`);
1209 (ASM_REWRITE_TAC[SUBSET;IN_INTER;IN; IN_ELIM_THM]);
1211 (ASM_REWRITE_TAC[]);
1212 (ASM_REAL_ARITH_TAC);
1213 (NEW_GOAL `(!t. t > &0 /\ t * norm u < r
1214 ==> x + t % u IN C INTER {y | dist (y,x:real^3) < r})`);
1216 (NEW_GOAL `x + t % u IN C INTER {y | dist (y,x:real^3) < r}`);
1217 (FIRST_ASSUM MATCH_MP_TAC);
1218 (ASM_REAL_ARITH_TAC);
1219 (UP_ASM_TAC THEN REWRITE_TAC[IN_INTER;IN;IN_ELIM_THM]);
1221 (ASM_REWRITE_TAC[]);
1222 (REWRITE_TAC[dist; VECTOR_ARITH `((a:real^3) + b) - a = b`; NORM_MUL]);
1223 (REWRITE_WITH `abs t = t`);
1224 (REWRITE_TAC[REAL_ABS_REFL]);
1225 (ASM_REAL_ARITH_TAC);
1226 (ASM_REWRITE_TAC[]);
1228 (EXISTS_TAC `r:real`);
1229 (ASM_REWRITE_TAC[]);
1231 (REWRITE_WITH `(C INTER C') INTER normball (x:real^3) r =
1232 (C INTER normball x r) INTER (C' INTER normball x r)`);
1234 (MATCH_MP_TAC Vol1.inter_radial);
1235 (ASM_REWRITE_TAC[]);
1236 (UNDISCH_TAC `radial_norm r' (x:real^3) (C' INTER normball x r')`);
1237 (REWRITE_TAC[Vol1.radial_norm; normball]);
1239 (REWRITE_TAC[INTER_SUBSET]);
1241 (NEW_GOAL `x + u IN C' INTER {y | dist (y,x:real^3) < r'}`);
1242 (MATCH_MP_TAC (SET_RULE `(?s. a IN s /\ s SUBSET t) ==> a IN t `));
1243 (EXISTS_TAC `C' INTER {y | dist (y,x:real^3) < r}`);
1244 (ASM_REWRITE_TAC[SUBSET;IN_INTER;IN; IN_ELIM_THM]);
1246 (ASM_REWRITE_TAC[]);
1247 (ASM_REAL_ARITH_TAC);
1248 (NEW_GOAL `(!t. t > &0 /\ t * norm u < r'
1249 ==> x + t % u IN C' INTER {y | dist (y,x:real^3) < r'})`);
1251 (NEW_GOAL `x + t % u IN C' INTER {y | dist (y,x:real^3) < r'}`);
1252 (FIRST_ASSUM MATCH_MP_TAC);
1253 (ASM_REAL_ARITH_TAC);
1254 (UP_ASM_TAC THEN REWRITE_TAC[IN_INTER;IN;IN_ELIM_THM]);
1256 (ASM_REWRITE_TAC[]);
1257 (REWRITE_TAC[dist; VECTOR_ARITH `((a:real^3) + b) - a = b`; NORM_MUL]);
1258 (REWRITE_WITH `abs t = t`);
1259 (REWRITE_TAC[REAL_ABS_REFL]);
1260 (ASM_REAL_ARITH_TAC);
1261 (ASM_REWRITE_TAC[])]);;
1263 (* ======================================================================= *)
1265 let SET_EQ_LEMMA = SET_RULE
1266 `A = B <=> (!x. (x IN A ==> x IN B) /\ (x IN B ==> x IN A))`;;
1268 let SET_OF_0_TO_3 = prove_by_refinement (
1269 `{j | j < 4} = {0,1,2,3}`,
1270 [(REWRITE_TAC[SET_EQ_LEMMA;IN;IN_ELIM_THM] THEN GEN_TAC);
1271 (ASM_CASES_TAC `x = 0`); (ASM_REWRITE_TAC[]);
1272 (TRUONG_SET_TAC[ARITH_RULE `0 < 4`]);
1273 (ASM_CASES_TAC `x = 1`);(ASM_REWRITE_TAC[]);
1274 (TRUONG_SET_TAC[ARITH_RULE `1 < 4`]);
1275 (ASM_CASES_TAC `x = 2`); (ASM_REWRITE_TAC[]);
1276 (TRUONG_SET_TAC[ARITH_RULE `2 < 4`]);
1277 (ASM_CASES_TAC `x = 3`); (ASM_REWRITE_TAC[]);
1278 (TRUONG_SET_TAC[ARITH_RULE `3 < 4`]);
1279 (NEW_GOAL `x >= 4`); (ASM_ARITH_TAC); (REPEAT STRIP_TAC);
1280 (NEW_GOAL `F`); (ASM_ARITH_TAC); (ASM_MESON_TAC[]); (NEW_GOAL `F`);
1281 (UP_ASM_TAC THEN TRUONG_SET_TAC[]); (ASM_MESON_TAC[])]);;
1283 let SET_OF_0_TO_2 = prove_by_refinement (
1284 `{j | j <= 2 } = {0,1,2}`,
1285 [(REWRITE_TAC[SET_EQ_LEMMA;IN;IN_ELIM_THM] THEN GEN_TAC);
1286 (ASM_CASES_TAC `x = 0`); (ASM_REWRITE_TAC[]);
1287 (TRUONG_SET_TAC[ARITH_RULE `0 <= 2`]);
1288 (ASM_CASES_TAC `x = 1`);(ASM_REWRITE_TAC[]);
1289 (TRUONG_SET_TAC[ARITH_RULE `1 <= 2`]);
1290 (ASM_CASES_TAC `x = 2`); (ASM_REWRITE_TAC[]);
1291 (TRUONG_SET_TAC[ARITH_RULE `2 <= 2`]);
1292 (NEW_GOAL `x >= 3`); (ASM_ARITH_TAC); (REPEAT STRIP_TAC);
1293 (NEW_GOAL `F`); (ASM_ARITH_TAC); (ASM_MESON_TAC[]); (NEW_GOAL `F`);
1294 (UP_ASM_TAC THEN TRUONG_SET_TAC[]); (ASM_MESON_TAC[])]);;
1296 let ZERO_LT_SQRT_2 = prove_by_refinement(`&1 < sqrt (&2)`,
1297 [(NEW_GOAL `&0 < sqrt (&2)`); (MATCH_MP_TAC SQRT_POS_LT THEN REAL_ARITH_TAC);
1298 (NEW_GOAL `&1 = abs (&1) /\ sqrt (&2) = abs (sqrt (&2))`);
1299 ONCE_REWRITE_TAC[EQ_SYM_EQ]; REWRITE_TAC[REAL_ABS_REFL]; ASM_REAL_ARITH_TAC;
1300 ONCE_ASM_REWRITE_TAC[];
1301 REWRITE_TAC[REAL_LT_SQUARE_ABS; REAL_ARITH `&1 pow 2 = &1`];
1302 REWRITE_WITH `sqrt (&2) pow 2 = &2`; MATCH_MP_TAC SQRT_POW_2;REAL_ARITH_TAC;
1305 (* ======================================================================= *)
1307 let RCONE_GE_TRANS = prove_by_refinement (
1308 `!(a:real^3) b r x t.
1309 &0 <= t /\ (a + x) IN rcone_ge a b r ==> a + t % x IN rcone_ge a b r`,
1310 [(REWRITE_TAC[rcone_ge; rconesgn; IN; IN_ELIM_THM; dist]);
1311 (REWRITE_TAC[VECTOR_ARITH `((a:real^3) + x) - a = x`; DOT_LMUL; NORM_MUL]);
1313 (REWRITE_WITH `abs t = t`);
1314 (ASM_REWRITE_TAC[REAL_ABS_REFL]);
1315 (REWRITE_TAC[REAL_ARITH `t * x >= ( t * m) * n <=> &0 <= t * (x - m * n)`]);
1316 (MATCH_MP_TAC REAL_LE_MUL);
1317 (ASM_REAL_ARITH_TAC)]);;
1318 (* ======================================================================= *)
1321 let RCONE_GE_INTERS_PROJECTION_KY_LEMMA = prove_by_refinement (
1322 `!(a:real^3) b r x:real^3.
1323 &0 < r /\ r < &1 /\ ~(a = b) /\
1324 x IN (rcone_ge a b r) INTER (rcone_ge b a r)
1325 ==> (?s. s IN convex hull {a, b} /\ (x - s) dot (a - b)= &0 )`,
1326 [(REWRITE_TAC[rcone_ge; rconesgn; IN_INTER;IN; IN_ELIM_THM; dist]);
1328 (NEW_GOAL `?s. s IN aff {a, b:real^3} /\ (x - s) dot (a - b) = &0`);
1329 (MESON_TAC[Trigonometry2.EXISTS_PROJECTING_POINT2]);
1330 (FIRST_X_ASSUM CHOOSE_TAC);
1331 (EXISTS_TAC `s:real^3`);
1333 ASM_REWRITE_TAC[Topology.affine_hull_2_fan; IN; IN_ELIM_THM]);
1335 (ASM_REWRITE_TAC[CONVEX_HULL_2; IN_ELIM_THM]);
1336 (EXISTS_TAC `t1:real`);
1337 (EXISTS_TAC `t2:real`);
1338 (ASM_REWRITE_TAC[]);
1343 (ASM_CASES_TAC `t1 < &0`);
1344 (NEW_GOAL `(x - b:real^3) dot (a - b) < &0`);
1345 (REWRITE_WITH `(x - b:real^3) dot (a - b) =
1346 (x - s) dot (a - b) + (s - b) dot (a - b)`);
1348 (ASM_REWRITE_TAC[REAL_ADD_RID; REAL_ADD_LID]);
1349 (REWRITE_WITH `((t1 % a + t2 % b) - b) = t1 % (a - b:real^3)`);
1350 (REWRITE_WITH `((t1 % a + t2 % b) - b:real^3) = (t1 % a + t2 % b) - (t1 + t2) % b`);
1351 (ASM_REWRITE_TAC[VECTOR_MUL_LID]);
1353 (REWRITE_TAC[DOT_LMUL]);
1354 (ONCE_REWRITE_TAC[GSYM REAL_LT_NEG]);
1355 (REWRITE_TAC[REAL_ARITH `-- (a * b) = (-- a) * b`; REAL_NEG_0]);
1356 (MATCH_MP_TAC REAL_LT_MUL);
1358 (ASM_REAL_ARITH_TAC);
1359 (REWRITE_TAC[GSYM NORM_POW_2]);
1360 (MATCH_MP_TAC REAL_POW_LT);
1361 (REWRITE_TAC[NORM_POS_LT]);
1362 (ASM_REWRITE_TAC[VECTOR_ARITH `(a:real^3 - b = vec 0 <=> a = b)`]);
1363 (NEW_GOAL `norm (x - b) * norm (a - b:real^3) * r < &0`);
1364 (ASM_REAL_ARITH_TAC);
1365 (NEW_GOAL `&0 <= norm (x - b) * norm (a - b:real^3) * r`);
1366 (MATCH_MP_TAC REAL_LE_MUL);
1367 (REWRITE_TAC[NORM_POS_LE]);
1368 (MATCH_MP_TAC REAL_LE_MUL);
1369 (REWRITE_TAC[NORM_POS_LE]);
1370 (ASM_REAL_ARITH_TAC);
1371 (ASM_REAL_ARITH_TAC);
1372 (ASM_REAL_ARITH_TAC);
1376 (ASM_CASES_TAC `t2 < &0`);
1377 (NEW_GOAL `(x - a:real^3) dot (b - a) < &0`);
1378 (REWRITE_WITH `(x - a:real^3) dot (b - a) =
1379 (a - s) dot (a - b) - (x - s) dot (a - b)`);
1381 (ASM_REWRITE_TAC[REAL_ARITH `a - &0 = a`]);
1382 (REWRITE_WITH `a - (t1 % a + t2 % b) = t2 % (a - b:real^3)`);
1383 (REWRITE_WITH `(a:real^3) - (t1 % a + t2 % b) = (t1 + t2) % a - (t1 % a + t2 % b)`);
1385 (ASM_REWRITE_TAC[VECTOR_MUL_LID]);
1387 (REWRITE_TAC[DOT_LMUL]);
1388 (ONCE_REWRITE_TAC[GSYM REAL_LT_NEG]);
1389 (REWRITE_TAC[REAL_ARITH `-- (a * b) = (-- a) * b`; REAL_NEG_0]);
1390 (MATCH_MP_TAC REAL_LT_MUL);
1392 (ASM_REAL_ARITH_TAC);
1393 (REWRITE_TAC[GSYM NORM_POW_2]);
1394 (MATCH_MP_TAC REAL_POW_LT);
1395 (REWRITE_TAC[NORM_POS_LT]);
1396 (ASM_REWRITE_TAC[VECTOR_ARITH `(a:real^3 - b = vec 0 <=> a = b)`]);
1397 (NEW_GOAL `norm (x - a) * norm (b - a:real^3) * r < &0`);
1398 (ASM_REAL_ARITH_TAC);
1399 (NEW_GOAL `&0 <= norm (x - a) * norm (b - a:real^3) * r`);
1400 (MATCH_MP_TAC REAL_LE_MUL);
1401 (REWRITE_TAC[NORM_POS_LE]);
1402 (MATCH_MP_TAC REAL_LE_MUL);
1403 (REWRITE_TAC[NORM_POS_LE]);
1404 (ASM_REAL_ARITH_TAC);
1405 (ASM_REAL_ARITH_TAC);
1406 (ASM_REAL_ARITH_TAC);
1408 (ASM_REWRITE_TAC[])]);;
1410 (* ======================================================================= *)
1412 let RCONE_GE_INTER_VORONOI_CLOSED_PROJECTION_KY_LEMMA = prove_by_refinement(
1413 `!(a:real^3) b r x:real^3 V.
1414 &0 < r /\ ~(a = b) /\ a IN V /\ b IN V /\
1415 x IN (rcone_ge a b r) INTER (voronoi_closed V a)
1416 ==> (?s. s IN convex hull {a, b} /\ (x - s) dot (a - b)= &0 )`,
1417 [(REWRITE_TAC[voronoi_closed; rcone_ge; rconesgn; IN_INTER;IN; IN_ELIM_THM; dist]);
1419 (NEW_GOAL `?s. s IN aff {a, b:real^3} /\ (x - s) dot (a - b) = &0`);
1420 (MESON_TAC[Trigonometry2.EXISTS_PROJECTING_POINT2]);
1421 (FIRST_X_ASSUM CHOOSE_TAC);
1422 (EXISTS_TAC `s:real^3`);
1423 (ASM_REWRITE_TAC[]);
1425 ASM_REWRITE_TAC[Topology.affine_hull_2_fan; IN; IN_ELIM_THM]);
1427 (ASM_REWRITE_TAC[CONVEX_HULL_2; IN_ELIM_THM]);
1428 (EXISTS_TAC `t1:real`);
1429 (EXISTS_TAC `t2:real`);
1430 (ASM_REWRITE_TAC[]);
1431 (ONCE_REWRITE_TAC[MESON[] `a /\ b <=> b /\ a`]);
1434 (* Case 1 : &0 <= t2 *)
1436 (ASM_CASES_TAC `t2 < &0`);
1437 (NEW_GOAL `(x - a:real^3) dot (b - a) < &0`);
1438 (REWRITE_WITH `(x - a:real^3) dot (b - a) =
1439 (a - s) dot (a - b) - (x - s) dot (a - b)`);
1441 (ASM_REWRITE_TAC[REAL_ARITH `a - &0 = a`]);
1442 (REWRITE_WITH `a - (t1 % a + t2 % b) = t2 % (a - b:real^3)`);
1443 (REWRITE_WITH `(a:real^3) - (t1 % a + t2 % b) = (t1 + t2) % a - (t1 % a + t2 % b)`);
1445 (ASM_REWRITE_TAC[VECTOR_MUL_LID]);
1447 (REWRITE_TAC[DOT_LMUL]);
1448 (ONCE_REWRITE_TAC[GSYM REAL_LT_NEG]);
1449 (REWRITE_TAC[REAL_ARITH `-- (a * b) = (-- a) * b`; REAL_NEG_0]);
1450 (MATCH_MP_TAC REAL_LT_MUL);
1452 (ASM_REAL_ARITH_TAC);
1453 (REWRITE_TAC[GSYM NORM_POW_2]);
1454 (MATCH_MP_TAC REAL_POW_LT);
1455 (REWRITE_TAC[NORM_POS_LT]);
1456 (ASM_REWRITE_TAC[VECTOR_ARITH `(a:real^3 - b = vec 0 <=> a = b)`]);
1457 (NEW_GOAL `norm (x - a) * norm (b - a:real^3) * r < &0`);
1458 (ASM_REAL_ARITH_TAC);
1459 (NEW_GOAL `&0 <= norm (x - a) * norm (b - a:real^3) * r`);
1460 (MATCH_MP_TAC REAL_LE_MUL);
1461 (REWRITE_TAC[NORM_POS_LE]);
1462 (MATCH_MP_TAC REAL_LE_MUL);
1463 (REWRITE_TAC[NORM_POS_LE]);
1464 (ASM_REAL_ARITH_TAC);
1465 (ASM_REAL_ARITH_TAC);
1466 (ASM_REAL_ARITH_TAC);
1468 (* Case 2 : &0 <= t1 *)
1470 (ASM_CASES_TAC `t1 < &0`);
1471 (NEW_GOAL `norm (x - a) <= norm (x - b:real^3)`);
1473 (NEW_GOAL `norm (x - b) < norm (x - a:real^3)`);
1474 (NEW_GOAL `norm (x - b) < norm (x - a:real^3) <=>
1475 norm (x - b) pow 2 < norm (x - a) pow 2`);
1476 (MATCH_MP_TAC Pack1.bp_bdt);
1477 (REWRITE_TAC[NORM_POS_LE]);
1478 (ASM_REWRITE_TAC[]);
1481 (REWRITE_WITH `norm (x - b) pow 2 = norm (s - b) pow 2 + norm (x - s:real^3) pow 2`);
1482 (MATCH_MP_TAC PYTHAGORAS);
1483 (REWRITE_TAC[orthogonal]);
1484 (REWRITE_WITH `b:real^3 - s = t1 % (b - a)`);
1485 (ASM_REWRITE_TAC[]);
1486 (REWRITE_WITH `b:real^3 - (t1 % a + t2 % b) = (t1 + t2) % b - (t1 % a + t2 % b)`);
1487 (ASM_REWRITE_TAC[VECTOR_MUL_LID]);
1489 (REWRITE_TAC[DOT_LMUL]);
1490 (REWRITE_WITH `(b - a:real^3) dot (x - s) = -- ((x - s) dot (a - b))`);
1492 (ASM_REWRITE_TAC[]);
1496 (REWRITE_WITH `norm (x - a) pow 2 = norm (s - a) pow 2 + norm (x - s:real^3) pow 2`);
1497 (MATCH_MP_TAC PYTHAGORAS);
1498 (REWRITE_TAC[orthogonal]);
1499 (REWRITE_WITH `a:real^3 - s = t2 % (a - b)`);
1500 (ASM_REWRITE_TAC[]);
1501 (REWRITE_WITH `a:real^3 - (t1 % a + t2 % b) = (t1 + t2) % a - (t1 % a + t2 % b)`);
1502 (ASM_REWRITE_TAC[VECTOR_MUL_LID]);
1504 (REWRITE_TAC[DOT_LMUL]);
1505 (REWRITE_WITH `(a - b:real^3) dot (x - s) = ((x - s) dot (a - b))`);
1507 (ASM_REWRITE_TAC[]);
1511 (MATCH_MP_TAC (REAL_ARITH `x < y ==> x + z < y + z`));
1512 (REWRITE_TAC[GSYM REAL_LT_SQUARE_ABS]);
1513 (REWRITE_WITH `abs (norm (s - b:real^3)) = norm (s - b)`);
1514 (REWRITE_TAC[REAL_ABS_REFL; NORM_POS_LE]);
1515 (REWRITE_WITH `abs (norm (s - a:real^3)) = norm (s - a)`);
1516 (REWRITE_TAC[REAL_ABS_REFL; NORM_POS_LE]);
1518 (REWRITE_WITH `s:real^3 - a = t2 % (b - a)`);
1519 (ASM_REWRITE_TAC[]);
1520 (REWRITE_WITH `(t1 % a + t2 % b) - a:real^3 = (t1 % a + t2 % b) - (t1 + t2) % a`);
1521 (ASM_REWRITE_TAC[VECTOR_MUL_LID]);
1523 (REWRITE_WITH `s:real^3 - b = t1 % (a - b)`);
1524 (ASM_REWRITE_TAC[]);
1525 (REWRITE_WITH `(t1 % a + t2 % b) - b:real^3 = (t1 % a + t2 % b) - (t1 + t2) % b`);
1526 (ASM_REWRITE_TAC[VECTOR_MUL_LID]);
1528 (REWRITE_TAC[NORM_MUL; GSYM dist; DIST_SYM]);
1529 (MATCH_MP_TAC (REAL_ARITH `&0 < x * (a - b) ==> b * x < a * x`));
1530 (MATCH_MP_TAC REAL_LT_MUL);
1532 (MATCH_MP_TAC DIST_POS_LT);
1533 (ASM_REWRITE_TAC[]);
1534 (REWRITE_WITH `t2 = &1 - t1`);
1535 (ASM_REAL_ARITH_TAC);
1536 (REWRITE_WITH `abs (t1) = abs (-- t1)`);
1537 (REWRITE_TAC[REAL_ABS_NEG]);
1538 (REWRITE_WITH `abs (&1 - t1) = &1 - t1`);
1539 (REWRITE_TAC[REAL_ABS_REFL]);
1540 (ASM_REAL_ARITH_TAC);
1541 (REWRITE_WITH `abs (-- t1) = (-- t1)`);
1542 (REWRITE_TAC[REAL_ABS_REFL]);
1543 (ASM_REAL_ARITH_TAC);
1544 (ASM_REAL_ARITH_TAC);
1545 (ASM_REAL_ARITH_TAC);
1546 (ASM_REAL_ARITH_TAC)]);;
1548 (* ======================================================================= *)
1550 let RCONEGE_INTER_VORONOI_CLOSED_IMP_RCONEGE = prove_by_refinement(
1559 x IN rcone_ge a b r /\
1560 x IN voronoi_closed V a ==> x IN rcone_ge b a r`,
1562 [(REPEAT STRIP_TAC);
1563 (NEW_GOAL `?s. s IN convex hull {a, b:real^3} /\ (x - s) dot (a - b) = &0`);
1564 (MATCH_MP_TAC RCONE_GE_INTER_VORONOI_CLOSED_PROJECTION_KY_LEMMA);
1565 (EXISTS_TAC `r:real`);
1566 (EXISTS_TAC `V:real^3->bool`);
1567 (ASM_REWRITE_TAC[IN_INTER]);
1568 (FIRST_X_ASSUM CHOOSE_TAC);
1569 (UNDISCH_TAC `x IN rcone_ge (a:real^3) b r`);
1570 (REWRITE_TAC[rcone_ge; rconesgn; IN; IN_ELIM_THM; dist]);
1572 (SWITCH_TAC THEN UP_ASM_TAC THEN REWRITE_TAC[CONVEX_HULL_2;IN;IN_ELIM_THM]);
1577 (NEW_GOAL `((x - (b:real^3)) dot (a - b)) * norm (x - a) >=
1578 ((x - a) dot (b - a)) * norm (x - b)`);
1579 (REWRITE_WITH `(x - b) dot (a - b:real^3) =
1580 (x - s) dot (a - b) + (s - b) dot (a - b)`);
1582 (REWRITE_WITH `(x - a) dot (b - a:real^3) =
1583 (a - s) dot (a - b) - (x - s) dot (a - b)`);
1585 (ASM_REWRITE_TAC[REAL_ADD_LID; REAL_ARITH `a - &0 = a`]);
1586 (REWRITE_WITH `(u % a + v % b) - b = u % (a - b:real^3)`);
1587 (REWRITE_WITH `(u % a + v % b:real^3) - b = (u % a + v % b) - (u + v) % b`);
1588 (ASM_REWRITE_TAC[VECTOR_MUL_LID]);
1591 (REWRITE_WITH `a - (u % a + v % b) = v % (a - b:real^3)`);
1592 (REWRITE_WITH `a - (u % a + v % b:real^3) = (u + v) % a - (u % a + v % b)`);
1593 (ASM_REWRITE_TAC[VECTOR_MUL_LID]);
1595 (REWRITE_TAC[DOT_LMUL; GSYM NORM_POW_2; GSYM dist]);
1596 (REWRITE_TAC[REAL_ARITH `(a * x) * y >= (b * x) * z <=> &0 <= x * (a * y - b * z)`]);
1597 (MATCH_MP_TAC REAL_LE_MUL);
1598 (REWRITE_TAC[REAL_LE_POW_2]);
1599 (REWRITE_TAC[REAL_ARITH `&0 <= a - b <=> b <= a`]);
1600 (NEW_GOAL `v * dist (x,b) <= u * dist (x,a:real^3) <=>
1601 (v * dist (x,b)) pow 2 <= (u * dist (x,a)) pow 2`);
1602 (MATCH_MP_TAC Trigonometry2.POW2_COND);
1603 (ASM_SIMP_TAC[REAL_LE_MUL; DIST_POS_LE]);
1604 (ASM_REWRITE_TAC[]);
1605 (REWRITE_TAC[REAL_ARITH `(x * y) pow 2 = (x pow 2) * (y pow 2)`; dist]);
1607 (REWRITE_WITH `norm (x:real^3 - b) pow 2 = norm (s - b) pow 2 + norm (x - s) pow 2`);
1608 (MATCH_MP_TAC PYTHAGORAS);
1609 (REWRITE_TAC[orthogonal]);
1610 (REWRITE_WITH `b - s:real^3 = -- u % (a - b)`);
1611 (ASM_REWRITE_TAC[]);
1612 (REWRITE_WITH `b:real^3 - (u % a + v % b) = (u + v) % b - (u % a + v % b)`);
1613 (ASM_REWRITE_TAC[VECTOR_MUL_LID]);
1615 (ASM_MESON_TAC[DOT_LMUL; REAL_MUL_RZERO;DOT_SYM]);
1616 (REWRITE_WITH `norm (s - b:real^3) = norm (b - s)`);
1618 (REWRITE_WITH `b - s:real^3 = -- u % (a - b)`);
1619 (ASM_REWRITE_TAC[]);
1620 (REWRITE_WITH `b:real^3 - (u % a + v % b) = (u + v) % b - (u % a + v % b)`);
1621 (ASM_REWRITE_TAC[VECTOR_MUL_LID]);
1623 (REWRITE_TAC[NORM_MUL; REAL_ABS_NEG]);
1625 (REWRITE_WITH `norm (x:real^3 - a) pow 2 = norm (s - a) pow 2 + norm (x - s) pow 2`);
1626 (MATCH_MP_TAC PYTHAGORAS);
1627 (REWRITE_TAC[orthogonal]);
1628 (REWRITE_WITH `a - s:real^3 = v % (a - b)`);
1629 (ASM_REWRITE_TAC[]);
1630 (REWRITE_WITH `a:real^3 - (u % a + v % b) = (u + v) % a - (u % a + v % b)`);
1631 (ASM_REWRITE_TAC[VECTOR_MUL_LID]);
1633 (ASM_MESON_TAC[DOT_LMUL; REAL_MUL_RZERO;DOT_SYM]);
1634 (REWRITE_WITH `norm (s - a:real^3) = norm (a - s)`);
1636 (REWRITE_WITH `a - s:real^3 = v % (a - b)`);
1637 (ASM_REWRITE_TAC[]);
1638 (REWRITE_WITH `a:real^3 - (u % a + v % b) = (u + v) % a - (u % a + v % b)`);
1639 (ASM_REWRITE_TAC[VECTOR_MUL_LID]);
1641 (REWRITE_TAC[NORM_MUL]);
1643 (REWRITE_TAC[REAL_POW_MUL; REAL_POW2_ABS]);
1644 (REWRITE_TAC[REAL_ARITH `x * (y * z + t) <= y * (x * z + t) <=>
1645 &0 <= t * (y - x)`]);
1646 (MATCH_MP_TAC REAL_LE_MUL);
1647 (REWRITE_TAC[REAL_LE_POW_2]);
1648 (REWRITE_TAC[REAL_ARITH `&0 <= x - y <=> y <= x`]);
1649 (NEW_GOAL `v pow 2 <= u pow 2 <=> v <= u`);
1650 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1651 (MATCH_MP_TAC Trigonometry2.POW2_COND THEN ASM_REWRITE_TAC[]);
1652 (ASM_REWRITE_TAC[]);
1653 (UNDISCH_TAC `(x:real^3) IN voronoi_closed V a`);
1654 (REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
1656 (NEW_GOAL `dist (x,a) <= dist (x,b:real^3)`);
1657 (FIRST_ASSUM MATCH_MP_TAC);
1659 (NEW_GOAL `dist (x,a:real^3) <= dist (x,b) <=>
1660 dist (x,a) pow 2 <= dist (x,b) pow 2`);
1661 (MATCH_MP_TAC Trigonometry2.POW2_COND THEN ASM_REWRITE_TAC[]);
1662 (REWRITE_TAC[DIST_POS_LE]);
1663 (NEW_GOAL `dist (x,a) pow 2 <= dist (x,b:real^3) pow 2`);
1665 (UP_ASM_TAC THEN REWRITE_TAC[dist]);
1667 (REWRITE_WITH `norm (x:real^3 - a) pow 2 = norm (s - a) pow 2 + norm (x - s) pow 2`);
1668 (MATCH_MP_TAC PYTHAGORAS);
1669 (REWRITE_TAC[orthogonal]);
1670 (REWRITE_WITH `a - s:real^3 = v % (a - b)`);
1671 (ASM_REWRITE_TAC[]);
1672 (REWRITE_WITH `a:real^3 - (u % a + v % b) = (u + v) % a - (u % a + v % b)`);
1673 (ASM_REWRITE_TAC[VECTOR_MUL_LID]);
1675 (ASM_MESON_TAC[DOT_LMUL; REAL_MUL_RZERO;DOT_SYM]);
1677 (REWRITE_WITH `norm (s - a:real^3) = norm (a - s)`);
1679 (REWRITE_WITH `a - s:real^3 = v % (a - b)`);
1680 (ASM_REWRITE_TAC[]);
1681 (REWRITE_WITH `a:real^3 - (u % a + v % b) = (u + v) % a - (u % a + v % b)`);
1682 (ASM_REWRITE_TAC[VECTOR_MUL_LID]);
1684 (REWRITE_TAC[NORM_MUL]);
1685 (REWRITE_TAC[REAL_POW_MUL; REAL_POW2_ABS]);
1687 (REWRITE_WITH `norm (x:real^3 - b) pow 2 = norm (s - b) pow 2 + norm (x - s) pow 2`);
1688 (MATCH_MP_TAC PYTHAGORAS);
1689 (REWRITE_TAC[orthogonal]);
1690 (REWRITE_WITH `b - s:real^3 = -- u % (a - b)`);
1691 (ASM_REWRITE_TAC[]);
1692 (REWRITE_WITH `b:real^3 - (u % a + v % b) = (u + v) % b - (u % a + v % b)`);
1693 (ASM_REWRITE_TAC[VECTOR_MUL_LID]);
1695 (ASM_MESON_TAC[DOT_LMUL; REAL_MUL_RZERO;DOT_SYM]);
1696 (REWRITE_WITH `norm (s - b:real^3) = norm (b - s)`);
1698 (REWRITE_WITH `b - s:real^3 = -- u % (a - b)`);
1699 (ASM_REWRITE_TAC[]);
1700 (REWRITE_WITH `b:real^3 - (u % a + v % b) = (u + v) % b - (u % a + v % b)`);
1701 (ASM_REWRITE_TAC[VECTOR_MUL_LID]);
1703 (REWRITE_TAC[NORM_MUL; REAL_ABS_NEG; REAL_POW2_ABS; REAL_POW_MUL]);
1705 (REWRITE_TAC[REAL_ARITH `a * x + b <= c * x + b <=> &0 <= x * (c - a)`]);
1707 (REWRITE_WITH `v <= u <=> v pow 2 <= u pow 2`);
1708 (MATCH_MP_TAC Trigonometry2.POW2_COND);
1709 (ASM_REWRITE_TAC[]);
1710 (ONCE_REWRITE_TAC[REAL_ARITH `a <= b <=> &0 <= b - a`]);
1711 (REWRITE_WITH `&0 <= u pow 2 - v pow 2 <=>
1712 &0 <= norm (a:real^3 - b) pow 2 * (u pow 2 - v pow 2)`);
1713 (NEW_GOAL `(!x y. &0 < x ==> (&0 <= x * y <=> &0 <= y))`);
1714 (MESON_TAC[REAL_LE_MUL_EQ]);
1715 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1716 (FIRST_X_ASSUM MATCH_MP_TAC);
1717 (MATCH_MP_TAC REAL_POW_LT);
1718 (REWRITE_TAC[NORM_POS_LT]);
1719 (REWRITE_TAC[VECTOR_ARITH `(a - b:real^3) = vec 0 <=> a = b`]);
1720 (ASM_REWRITE_TAC[]);
1721 (ASM_REWRITE_TAC[]);
1724 (* ======================================================================== *)
1726 (ASM_CASES_TAC `&0 < norm (x:real^3 - b)`);
1727 (ASM_CASES_TAC `&0 < norm (x:real^3 - a)`);
1729 (REWRITE_TAC[REAL_ARITH `a >= b * c <=> c * b <= a`]);
1730 (REWRITE_WITH `(norm (a - b) * r) * norm (x - b) <= (x - b) dot (a - b) <=>
1731 (norm (a - b) * r) <= ((x - b) dot (a - b)) / norm (x - b:real^3)`);
1732 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1733 (MATCH_MP_TAC REAL_LE_RDIV_EQ);
1734 (ASM_REWRITE_TAC[]);
1736 (MATCH_MP_TAC (REAL_ARITH `(?x. a <= x /\ x <= b) ==> a <= b`));
1738 (EXISTS_TAC `((x - a) dot (b - a)) / norm (x - a:real^3)`);
1741 (REWRITE_WITH `norm (a - b) * r <=
1742 ((x - a) dot (b - a)) / norm (x - a) <=>
1743 (norm (a - b) * r) * norm (x - a) <=
1744 ((x - a) dot (b - a:real^3))`);
1745 (MATCH_MP_TAC REAL_LE_RDIV_EQ);
1746 (ASM_REWRITE_TAC[]);
1748 `(norm (a - b:real^3) * r) * norm (x - a) = norm (x - a) * norm (b - a) * r`);
1749 (REWRITE_WITH `norm (a - b) = norm (b - a:real^3)`);
1752 (ASM_REAL_ARITH_TAC);
1754 (NEW_GOAL `((x - a) dot (b - a)) / norm (x - a:real^3) <=
1755 ((x - b) dot (a - b)) / norm (x - b) <=>
1756 ((x - a) dot (b - a)) * norm (x - b) <=
1757 ((x - b) dot (a - b)) * norm (x - a)`);
1758 (MATCH_MP_TAC RAT_LEMMA4);
1759 (ASM_REWRITE_TAC[]);
1760 (ASM_REWRITE_TAC[]);
1761 (ASM_REAL_ARITH_TAC);
1763 (NEW_GOAL `x = a:real^3`);
1764 (ONCE_REWRITE_TAC[VECTOR_ARITH `a = b <=> a - b:real^3 = vec 0`]);
1765 (REWRITE_TAC [GSYM NORM_EQ_0]);
1766 (NEW_GOAL `&0 <= norm (x - a:real^3)`);
1767 (REWRITE_TAC[NORM_POS_LE]);
1768 (ASM_REAL_ARITH_TAC);
1769 (ASM_REWRITE_TAC[GSYM NORM_POW_2]);
1770 (ONCE_REWRITE_TAC[REAL_ARITH `a * a * b = (a pow 2) * b`]);
1771 (REWRITE_TAC[REAL_ARITH `a >= a * b <=> &0 <= (&1 - b) * a`]);
1772 (MATCH_MP_TAC REAL_LE_MUL);
1773 (REWRITE_TAC[REAL_LE_POW_2]);
1774 (ASM_REAL_ARITH_TAC);
1777 (NEW_GOAL `x = b:real^3`);
1778 (ONCE_REWRITE_TAC[VECTOR_ARITH `a = b <=> a - b:real^3 = vec 0`]);
1779 (REWRITE_TAC [GSYM NORM_EQ_0]);
1780 (NEW_GOAL `&0 <= norm (x - b:real^3)`);
1781 (REWRITE_TAC[NORM_POS_LE]);
1782 (ASM_REAL_ARITH_TAC);
1784 (UNDISCH_TAC `x IN voronoi_closed V (a:real^3)`);
1785 (REWRITE_TAC[voronoi_closed;IN;IN_ELIM_THM]);
1787 (NEW_GOAL `dist (x,a) <= dist (x,b:real^3)`);
1788 (FIRST_X_ASSUM MATCH_MP_TAC);
1790 (UP_ASM_TAC THEN ASM_REWRITE_TAC[DIST_REFL]);
1792 (NEW_GOAL `a = b:real^3`);
1793 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1794 (REWRITE_TAC[GSYM DIST_EQ_0]);
1795 (NEW_GOAL `&0 <= dist (b, a:real^3)`);
1796 (REWRITE_TAC[DIST_POS_LE]);
1797 (ASM_REAL_ARITH_TAC);
1799 (ASM_MESON_TAC[])]);;
1801 (* ======================================================================= *)
1803 let OMEGA_LIST_1_EXPLICIT_NEW = prove_by_refinement (
1804 `!a:real^3 b c d V ul.
1808 ul = [a; b; c; d] /\
1809 hl [a;b] < sqrt (&2)
1810 ==> omega_list_n V ul 1 = circumcenter {a, b}`,
1811 [ (REPEAT STRIP_TAC);
1812 (REWRITE_WITH `{a,b} = set_of_list [a;(b:real^3)]`);
1813 (MESON_TAC[set_of_list]);
1814 (REWRITE_WITH `circumcenter (set_of_list [a; b:real^3]) = omega_list V [a:real^3; b]`);
1815 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1816 (MATCH_MP_TAC XNHPWAB1);
1818 (ASM_REWRITE_TAC[ARITH_RULE `1 <= 3`]);
1819 (MP_TAC (ASSUME `ul IN barV V 3`) THEN REWRITE_TAC[IN;BARV]);
1822 (REWRITE_TAC[LENGTH;ARITH_RULE `SUC (SUC 0) = 1 + 1`]);
1823 (NEW_GOAL `initial_sublist vl (ul:(real^3)list)`);
1824 (UNDISCH_TAC `initial_sublist vl [a:real^3; b]`);
1825 (REWRITE_TAC[INITIAL_SUBLIST] THEN STRIP_TAC);
1826 (EXISTS_TAC `APPEND yl [c;d:real^3]`);
1827 (REWRITE_TAC[APPEND_ASSOC; GSYM (ASSUME `[a:real^3; b] = APPEND vl yl`)]);
1828 (ASM_REWRITE_TAC[APPEND]);
1830 (ASM_REWRITE_TAC[OMEGA_LIST_TRUNCATE_1])]);;
1832 (* ======================================================================= *)
1834 let IN_SET_IMP_IN_CONVEX_HULL_SET = prove_by_refinement (
1835 `!a S:real^3->bool. a IN S ==> a IN convex hull S`,
1836 [(REPEAT STRIP_TAC);
1837 (REWRITE_TAC[SET_RULE `a IN s <=> {a} SUBSET s`]);
1838 (NEW_GOAL `{a} = convex hull ({a:real^3})`);
1839 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1840 (SIMP_TAC[CONVEX_HULL_EQ;CONVEX_SING]);
1841 (ONCE_ASM_REWRITE_TAC[]);
1842 (MATCH_MP_TAC CONVEX_HULL_SUBSET);
1845 (* ======================================================================= *)
1847 let CONVEX_HULL_BREAK_KY_LEMMA = prove_by_refinement (
1848 `!a:real^3 b c d x. between x (a,b) ==>
1849 (convex hull {a,b,c,d} = convex hull {a,x, c,d} UNION convex hull {x,b,c,d})`,
1851 [(REWRITE_TAC[BETWEEN_IN_CONVEX_HULL; CONVEX_HULL_2;IN; IN_ELIM_THM]);
1852 (REWRITE_TAC[SET_EQ_LEMMA]);
1854 (UP_ASM_TAC THEN REWRITE_TAC[CONVEX_HULL_4; IN_UNION;IN;IN_ELIM_THM]);
1856 (ASM_CASES_TAC `u = &0`);
1858 (EXISTS_TAC `u':real`);
1859 (EXISTS_TAC `v':real`);
1860 (EXISTS_TAC `w:real`);
1861 (EXISTS_TAC `z:real`);
1862 (ASM_REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_ADD_LID]);
1863 (REWRITE_WITH `v = &1`);
1864 (ASM_REAL_ARITH_TAC);
1866 (NEW_GOAL `&0 < u `);
1867 (ASM_REAL_ARITH_TAC);
1868 (SWITCH_TAC THEN DEL_TAC);
1869 (ASM_CASES_TAC `v = &0`);
1871 (EXISTS_TAC `u':real`);
1872 (EXISTS_TAC `v':real`);
1873 (EXISTS_TAC `w:real`);
1874 (EXISTS_TAC `z:real`);
1875 (ASM_REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_ADD_LID]);
1876 (REWRITE_WITH `u = &1`);
1877 (ASM_REAL_ARITH_TAC);
1879 (NEW_GOAL `&0 < v `);
1880 (ASM_REAL_ARITH_TAC);
1881 (SWITCH_TAC THEN DEL_TAC);
1884 (ASM_CASES_TAC `&0 < u' + v'`);
1885 (ASM_CASES_TAC `u' / (u' + v') <= u`);
1889 (EXISTS_TAC `u' / u`);
1890 (EXISTS_TAC `v' - v * (u'/ u)`);
1891 (EXISTS_TAC `w:real`);
1892 (EXISTS_TAC `z:real`);
1893 (ASM_REWRITE_TAC[]);
1894 (ASM_SIMP_TAC[REAL_LE_DIV]);
1896 (REWRITE_WITH `v' - v * u' / u = (v' * u - v * u' )/ u`);
1897 (REWRITE_TAC[REAL_ARITH `(a - b * d) / c = a / c - b * d / c`]);
1898 (AP_THM_TAC THEN AP_TERM_TAC);
1899 (REWRITE_WITH `v' = (v' * u) / u <=> v' * u = (v' * u)`);
1900 (MATCH_MP_TAC REAL_EQ_RDIV_EQ);
1901 (ASM_REWRITE_TAC[]);
1902 (REWRITE_WITH `v * u' = u' - u * u'`);
1903 (REWRITE_TAC[REAL_ARITH `a * b = b - c * b <=> ((c + a) - &1) * b = &0`]);
1904 (ASM_REWRITE_TAC[]);
1906 (REWRITE_TAC[REAL_ARITH `v' * u - (u' - u * u') = u * (u' + v') - u'`]);
1907 (MATCH_MP_TAC REAL_LE_DIV);
1908 (ASM_REWRITE_TAC[REAL_ARITH `&0 <= a - b <=> b <= a`]);
1909 (NEW_GOAL `u' <= u * (u' + v') <=> u' / (u' + v') <= u`);
1910 (ASM_MESON_TAC[REAL_LE_LDIV_EQ]);
1911 (ONCE_ASM_REWRITE_TAC[]);
1914 (REWRITE_TAC[REAL_ARITH `a + b - e + c + d = (a + b - e) + c + d`]);
1915 (REWRITE_WITH `u' / u + v' - v * u' / u = u' + v'`);
1916 (ONCE_REWRITE_TAC[REAL_ARITH `a/x + b - m*e/x = c + b <=> (a - m*e)/x = c`]);
1917 (NEW_GOAL `(u' - v * u') / u = u' <=> (u' - v * u') = u' * u`);
1918 (MATCH_MP_TAC REAL_EQ_LDIV_EQ);
1919 (ASM_REWRITE_TAC[]);
1920 (ONCE_ASM_REWRITE_TAC[]);
1921 (REWRITE_WITH `u' - v * u' = u' * (u + v) - v * u'`);
1922 (ASM_REWRITE_TAC[]);
1924 (ASM_REAL_ARITH_TAC);
1925 (ASM_REAL_ARITH_TAC);
1926 (REWRITE_TAC[VECTOR_ADD_LDISTRIB;VECTOR_MUL_ASSOC]);
1927 (REWRITE_TAC[VECTOR_ARITH `a + b + c + d = (x + m % y) + n % y + c + d <=>
1928 (a - x) + (b - (m + n) % y) = vec 0 `]);
1930 (MATCH_MP_TAC (VECTOR_ARITH `a = vec 0 /\ b = vec 0 ==> a + b = vec 0`));
1932 (REWRITE_TAC[VECTOR_ARITH
1933 `(x % a - y % a = vec 0) <=> (x - y) % a = vec 0`; VECTOR_MUL_EQ_0]);
1935 (REWRITE_TAC[REAL_ARITH `x - y / z * t = &0 <=> (y * t) / z = x`]);
1936 (NEW_GOAL `(u' * u) / u = u' <=> (u' * u) = u' * u`);
1937 (MATCH_MP_TAC REAL_EQ_LDIV_EQ);
1938 (ASM_REWRITE_TAC[]);
1939 (ONCE_ASM_REWRITE_TAC[]);
1942 (REWRITE_TAC[VECTOR_ARITH
1943 `(x % a - y % a = vec 0) <=> (x - y) % a = vec 0`; VECTOR_MUL_EQ_0]);
1950 (NEW_GOAL `v' / (u' + v') <= v`);
1951 (REWRITE_WITH `v' / (u' + v') = &1 - u' /(u' + v')`);
1952 (REWRITE_TAC[REAL_ARITH `a / x = &1 - b / x <=> (b + a) / x = &1`]);
1953 (MATCH_MP_TAC REAL_DIV_REFL);
1954 (ASM_REAL_ARITH_TAC);
1955 (ASM_REAL_ARITH_TAC);
1958 (EXISTS_TAC `u' - u * (v'/ v)`);
1959 (EXISTS_TAC `v' / v`);
1960 (EXISTS_TAC `w:real`);
1961 (EXISTS_TAC `z:real`);
1962 (ASM_REWRITE_TAC[]);
1963 (ASM_SIMP_TAC[REAL_LE_DIV]);
1966 (REWRITE_WITH `u' - u * v' / v = (u' * v - u * v' )/ v`);
1967 (REWRITE_TAC[REAL_ARITH `(a - b * d) / c = a / c - b * d / c`]);
1968 (AP_THM_TAC THEN AP_TERM_TAC);
1969 (REWRITE_WITH `u' = (u' * v) / v <=> u' * v = (u' * v)`);
1970 (MATCH_MP_TAC REAL_EQ_RDIV_EQ);
1971 (ASM_REWRITE_TAC[]);
1973 (REWRITE_WITH `u * v' = v' - v * v'`);
1974 (REWRITE_TAC[REAL_ARITH `a * b = b - c * b <=> ((c + a) - &1) * b = &0`]);
1975 (ASM_REWRITE_TAC[REAL_ARITH `v + u = u + v`]);
1976 (ASM_REAL_ARITH_TAC);
1977 (REWRITE_TAC[REAL_ARITH `v' * u - (u' - u * u') = u * (u' + v') - u'`]);
1978 (MATCH_MP_TAC REAL_LE_DIV);
1979 (ASM_REWRITE_TAC[REAL_ARITH `&0 <= a - b <=> b <= a`]);
1981 (NEW_GOAL `v' <= v * (v' + u') <=> v' / (v' + u') <= v`);
1982 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1983 (MATCH_MP_TAC REAL_LE_LDIV_EQ);
1984 (ASM_REAL_ARITH_TAC);
1985 (ONCE_ASM_REWRITE_TAC[]);
1986 (ASM_MESON_TAC[REAL_ADD_SYM]);
1988 (REWRITE_TAC[REAL_ARITH `a - e + b + c + d = (a + b - e) + c + d`]);
1989 (REWRITE_WITH `u' + v' / v - u * v' / v = u' + v'`);
1991 (ONCE_REWRITE_TAC[REAL_ARITH `b + a/x - m*e/x = b + c <=> (a - m*e)/x = c`]);
1992 (NEW_GOAL `(v' - u * v') / v = v' <=> (v' - u * v') = v' * v`);
1993 (MATCH_MP_TAC REAL_EQ_LDIV_EQ);
1994 (ASM_REWRITE_TAC[]);
1995 (ONCE_ASM_REWRITE_TAC[]);
1996 (REWRITE_WITH `v' - u * v' = v' * (u + v) - u * v'`);
1997 (ASM_REWRITE_TAC[]);
1999 (ASM_REAL_ARITH_TAC);
2000 (ASM_REAL_ARITH_TAC);
2001 (REWRITE_TAC[VECTOR_ADD_LDISTRIB;VECTOR_MUL_ASSOC]);
2002 (REWRITE_TAC[VECTOR_ARITH `a + b + c + d = (m % y) + (n % y + z) + c + d <=> (b - z) + (a - (m + n) % y) = vec 0 `]);
2004 (MATCH_MP_TAC (VECTOR_ARITH `a = vec 0 /\ b = vec 0 ==> b + a = vec 0`));
2007 (REWRITE_TAC[VECTOR_ARITH
2008 `(x % a - y % a = vec 0) <=> (x - y) % a = vec 0`; VECTOR_MUL_EQ_0]);
2011 (REWRITE_TAC[VECTOR_ARITH
2012 `(x % a - y % a = vec 0) <=> (x - y) % a = vec 0`; VECTOR_MUL_EQ_0]);
2015 (REWRITE_TAC[REAL_ARITH `x - y / z * t = &0 <=> (y * t) / z = x`]);
2016 (NEW_GOAL `(v' * v) / v = v' <=> (v' * v) = v' * v`);
2017 (MATCH_MP_TAC REAL_EQ_LDIV_EQ);
2018 (ASM_REWRITE_TAC[]);
2019 (ONCE_ASM_REWRITE_TAC[]);
2024 (NEW_GOAL `u' + v' = &0`);
2025 (ASM_REAL_ARITH_TAC);
2027 (EXISTS_TAC `&0` THEN EXISTS_TAC `&0`);
2028 (EXISTS_TAC `w:real` THEN EXISTS_TAC `z:real`);
2029 (NEW_GOAL `u'= &0 /\ v' = &0`);
2030 (ASM_REAL_ARITH_TAC);
2031 (UNDISCH_TAC `x' = u' % a + v' % b + w % c + z % (d:real^3)`);
2032 (ASM_REWRITE_TAC[VECTOR_MUL_LZERO; REAL_ARITH `&0 <= &0`]);
2037 (* ================================ *)
2039 (UP_ASM_TAC THEN REWRITE_TAC[IN_UNION]);
2042 (NEW_GOAL `convex hull {a, x, c, d} SUBSET convex hull {a, b, c, d:real^3}`);
2043 (NEW_GOAL `convex hull {a, b, c, d:real^3} =
2044 convex hull (convex hull {a, b, c, d:real^3})`);
2045 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2046 (REWRITE_TAC[CONVEX_HULL_EQ; CONVEX_CONVEX_HULL]);
2047 (ONCE_ASM_REWRITE_TAC[]);
2048 (MATCH_MP_TAC CONVEX_HULL_SUBSET);
2049 (ONCE_REWRITE_TAC[SUBSET; IN;IN_ELIM_THM]);
2051 (ASM_CASES_TAC `x'' = a:real^3`);
2052 (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
2054 (ASM_CASES_TAC `x'' = d:real^3`);
2055 (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
2057 (ASM_CASES_TAC `x'' = c:real^3`);
2058 (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
2060 (NEW_GOAL `x'' = u % a + v % (b:real^3)`);
2062 (ASM_REWRITE_TAC[]);
2063 (MATCH_MP_TAC (SET_RULE `(?s. p IN s /\ s SUBSET r) ==> p IN r`));
2064 (EXISTS_TAC `convex hull {a, b:real^3}`);
2066 (ASM_REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM]);
2067 (EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
2068 (ASM_REWRITE_TAC[]);
2069 (MATCH_MP_TAC CONVEX_HULL_SUBSET);
2075 (NEW_GOAL `convex hull {x, b, c, d} SUBSET convex hull {a, b, c, d:real^3}`);
2076 (NEW_GOAL `convex hull {a, b, c, d:real^3} =
2077 convex hull (convex hull {a, b, c, d:real^3})`);
2078 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2079 (REWRITE_TAC[CONVEX_HULL_EQ; CONVEX_CONVEX_HULL]);
2080 (ONCE_ASM_REWRITE_TAC[]);
2081 (MATCH_MP_TAC CONVEX_HULL_SUBSET);
2082 (ONCE_REWRITE_TAC[SUBSET; IN;IN_ELIM_THM]);
2084 (ASM_CASES_TAC `x'' = b:real^3`);
2085 (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
2087 (ASM_CASES_TAC `x'' = d:real^3`);
2088 (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
2090 (ASM_CASES_TAC `x'' = c:real^3`);
2091 (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
2093 (NEW_GOAL `x'' = u % a + v % (b:real^3)`);
2095 (ASM_REWRITE_TAC[]);
2096 (MATCH_MP_TAC (SET_RULE `(?s. p IN s /\ s SUBSET r) ==> p IN r`));
2097 (EXISTS_TAC `convex hull {a, b:real^3}`);
2099 (ASM_REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM]);
2100 (EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
2101 (ASM_REWRITE_TAC[]);
2102 (MATCH_MP_TAC CONVEX_HULL_SUBSET);
2106 (* ======================================================================= *)
2108 let AFF_GE_BREAK_KY_LEMMA = prove_by_refinement (
2109 `!a b c d (x:real^3).
2111 DISJOINT {a, b} {c, d} /\
2112 DISJOINT {a, b} {c, x} /\
2113 DISJOINT {a, b} {x, d} ==>
2114 aff_ge {a, b} {c, d} = aff_ge {a, b} {c, x} UNION aff_ge {a, b} {x, d}`,
2115 [(REWRITE_TAC[BETWEEN_IN_CONVEX_HULL; CONVEX_HULL_2; IN; IN_ELIM_THM]);
2118 (ASM_SIMP_TAC[AFF_GE_2_2]);
2119 (REWRITE_TAC[SET_EQ_LEMMA; IN_UNION; IN; IN_ELIM_THM]);
2122 (* Break to 3 subgoal *)
2124 (ASM_CASES_TAC `u = &0`);
2125 (REWRITE_WITH `v = &1`);
2126 (ASM_REAL_ARITH_TAC);
2127 (ASM_REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_ADD_LID; VECTOR_MUL_LID]);
2130 (EXISTS_TAC `t1:real` THEN EXISTS_TAC `t2:real`);
2131 (EXISTS_TAC `t3:real` THEN EXISTS_TAC `t4:real`);
2132 (ASM_REWRITE_TAC[]);
2133 (NEW_GOAL `&0 <u `);
2134 (ASM_REAL_ARITH_TAC);
2135 (ASM_CASES_TAC `v = &0`);
2136 (REWRITE_WITH `u = &1`);
2137 (ASM_REAL_ARITH_TAC);
2138 (ASM_REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_ADD_RID; VECTOR_MUL_LID]);
2140 (EXISTS_TAC `t1:real` THEN EXISTS_TAC `t2:real`);
2141 (EXISTS_TAC `t3:real` THEN EXISTS_TAC `t4:real`);
2142 (ASM_REWRITE_TAC[]);
2143 (NEW_GOAL `&0 < v `);
2144 (ASM_REAL_ARITH_TAC);
2146 (ASM_CASES_TAC `&0 < t3 + t4`);
2147 (ASM_CASES_TAC `v * (t3 + t4) >= t4`);
2149 (EXISTS_TAC `t1:real` THEN EXISTS_TAC `t2:real`);
2150 (EXISTS_TAC `t3 - u * t4 / v` THEN EXISTS_TAC `t4 / v`);
2152 (REWRITE_TAC[REAL_ARITH `&0 <= a - b * c / d <=> (b * c) / d <= a `]);
2153 (REWRITE_WITH `(u * t4) / v <= t3 <=> (u * t4) <= t3 * v`);
2154 (MATCH_MP_TAC REAL_LE_LDIV_EQ);
2155 (ASM_REWRITE_TAC[]);
2156 (REWRITE_WITH `u * t4 <= t3 * v <=> v * (t3 + t4) >= t4`);
2157 (REWRITE_WITH `v * (t3 + t4) >= t4 <=> v * (t3 + t4) >= t4 * (u + v)`);
2158 (ASM_REWRITE_TAC[REAL_MUL_RID]);
2160 (ASM_REWRITE_TAC[]);
2161 (MATCH_MP_TAC REAL_LE_DIV);
2162 (ASM_REAL_ARITH_TAC);
2163 (REWRITE_WITH `t1 + t2 + t3 - u * t4 / v + t4 / v = t1 + t2 + t3 + t4`);
2164 (REPEAT AP_TERM_TAC);
2165 (REWRITE_TAC[REAL_ARITH
2166 `t3 - u * t4 / v + t4 / v = t3 + t4 <=> (t4 - t4 * u) / v = t4`]);
2168 (REWRITE_WITH `(t4 - t4 * u) / v = t4 <=> (t4 - t4 * u) = t4 * v`);
2169 (MATCH_MP_TAC REAL_EQ_LDIV_EQ);
2170 (ASM_REAL_ARITH_TAC);
2171 (REWRITE_WITH `(t4 - t4 * u) = t4 * (u + v) - t4 * u`);
2172 (ASM_REWRITE_TAC[REAL_MUL_RID]);
2174 (ASM_REWRITE_TAC[]);
2177 `t1 % a + t2 % b + (t3 - u * t4 / v) % c + t4 / v % (u % c + v % d) =
2178 t1 % a + t2 % b + t3 % c + t4 % (d:real^3)`);
2179 (REPEAT AP_TERM_TAC);
2181 (REWRITE_TAC[VECTOR_SUB_RDISTRIB; VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC]);
2182 (REWRITE_TAC[VECTOR_ARITH
2183 `(x % c - y % c + t % c + z % d = x % c + n % d) <=>
2184 (t - y) % c + (z - n) %d = vec 0`]);
2185 (REWRITE_WITH `t4 / v * u - u * t4 / v = &0`);
2187 (REWRITE_WITH `t4 / v * v - t4 = &0`);
2188 (REWRITE_TAC[REAL_ARITH `a / b * c - d = &0 <=> (a * c) / b = d`]);
2189 (REWRITE_WITH `(t4 * v) / v = t4 <=> (t4 * v) = t4 * v`);
2190 (MATCH_MP_TAC REAL_EQ_LDIV_EQ);
2191 (ASM_REWRITE_TAC[]);
2193 (ASM_REWRITE_TAC[]);
2195 (ASM_CASES_TAC `(u * (t3 + t4) >= t3)`);
2197 (EXISTS_TAC `t1:real` THEN EXISTS_TAC `t2:real`);
2198 (EXISTS_TAC `t3 / u` THEN EXISTS_TAC `t4 - v * t3 / u`);
2200 (MATCH_MP_TAC REAL_LE_DIV);
2201 (ASM_REAL_ARITH_TAC);
2203 (REWRITE_TAC[REAL_ARITH `&0 <= a - b * c / d <=> (b * c) / d <= a `]);
2204 (REWRITE_WITH `(v * t3) / u <= t4 <=> (v * t3) <= t4 * u`);
2205 (MATCH_MP_TAC REAL_LE_LDIV_EQ);
2206 (ASM_REWRITE_TAC[]);
2207 (REWRITE_WITH `v * t3 <= t4 * u <=> u * (t3 + t4) >= t3`);
2208 (REWRITE_WITH `u * (t3 + t4) >= t3 <=> u * (t3 + t4) >= t3 * (u + v)`);
2209 (ASM_REWRITE_TAC[REAL_MUL_RID]);
2211 (ASM_REWRITE_TAC[]);
2213 (REWRITE_WITH `t1 + t2 + t3 / u + t4 - v * t3 / u = t1 + t2 + t3 + t4`);
2214 (REPEAT AP_TERM_TAC);
2215 (REWRITE_TAC[REAL_ARITH
2216 `t3 / u + t4 - v * t3 / u = t3 + t4 <=> (t3 - t3 * v) / u = t3`]);
2218 (REWRITE_WITH `(t3 - t3 * v) / u = t3 <=> (t3 - t3 * v) = t3 * u`);
2219 (MATCH_MP_TAC REAL_EQ_LDIV_EQ);
2220 (ASM_REAL_ARITH_TAC);
2221 (REWRITE_WITH `(t3 - t3 * v) = t3 * (u + v) - t3 * v`);
2222 (ASM_REWRITE_TAC[REAL_MUL_RID]);
2224 (ASM_REWRITE_TAC[]);
2227 `t1 % a + t2 % b + t3 / u % (u % c + v % d) + (t4 - v * t3 / u) % d =
2228 t1 % a + t2 % b + t3 % c + t4 % (d:real^3)`);
2229 (REPEAT AP_TERM_TAC);
2231 (REWRITE_TAC[VECTOR_SUB_RDISTRIB; VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC]);
2232 (REWRITE_TAC[VECTOR_ARITH
2233 `(x % c + y % d) + a - z % d = t % c + a <=>
2234 (x - t) % c + (y - z) %d = vec 0`]);
2235 (REWRITE_WITH `t3 / u * v - v * t3 / u = &0`);
2237 (REWRITE_WITH `t3 / u * u - t3 = &0`);
2238 (REWRITE_TAC[REAL_ARITH `a / b * c - d = &0 <=> (a * c) / b = d`]);
2239 (REWRITE_WITH `(t3 * u) / u = t3 <=> (t3 * u) = t3 * u`);
2240 (MATCH_MP_TAC REAL_EQ_LDIV_EQ);
2241 (ASM_REWRITE_TAC[]);
2243 (ASM_REWRITE_TAC[]);
2245 (NEW_GOAL `v * (t3 + t4) < t4 /\ u * (t3 + t4) < t3`);
2246 (ASM_REAL_ARITH_TAC);
2247 (NEW_GOAL `(u + v) * (t3 + t4) < (t3 + t4)`);
2248 (ASM_REAL_ARITH_TAC);
2249 (UP_ASM_TAC THEN ASM_REWRITE_TAC[REAL_MUL_LID]);
2251 (UP_ASM_TAC THEN MESON_TAC[]);
2252 (NEW_GOAL `t3 = &0 /\ t4 = &0`);
2253 (ASM_REAL_ARITH_TAC);
2255 (EXISTS_TAC `t1:real` THEN EXISTS_TAC `t2:real`);
2256 (EXISTS_TAC `t3:real` THEN EXISTS_TAC `t4:real`);
2257 (ASM_REWRITE_TAC[VECTOR_MUL_LZERO]);
2258 (* finish the first subgoal *)
2260 (EXISTS_TAC `t1:real` THEN EXISTS_TAC `t2:real`);
2261 (EXISTS_TAC `t3 + t4 * u` THEN EXISTS_TAC `t4 * v`);
2263 (MATCH_MP_TAC REAL_LE_ADD);
2264 (ASM_SIMP_TAC[REAL_LE_MUL]);
2265 (ASM_SIMP_TAC[REAL_LE_MUL]);
2266 (REWRITE_WITH `t1 + t2 + (t3 + t4 * u) + t4 * v =
2267 t1 + t2 + t3 + t4 * (u + v)`);
2269 (ASM_REWRITE_TAC[REAL_MUL_RID]);
2270 (REWRITE_WITH `t1 % a + t2 % b + (t3 + t4 * u) % c + (t4 * v) % d =
2271 t1 % a + t2 % b + t3 % c + t4 % (u % c + v % (d:real^3))`);
2273 (ASM_REWRITE_TAC[]);
2275 (EXISTS_TAC `t1:real` THEN EXISTS_TAC `t2:real`);
2276 (EXISTS_TAC `t3 * u` THEN EXISTS_TAC `t4 + t3 * v`);
2278 (ASM_SIMP_TAC[REAL_LE_MUL]);
2279 (MATCH_MP_TAC REAL_LE_ADD);
2280 (ASM_SIMP_TAC[REAL_LE_MUL]);
2281 (REWRITE_WITH `t1 + t2 + t3 * u + t4 + t3 * v =
2282 t1 + t2 + t3 * (u + v) + t4`);
2284 (ASM_REWRITE_TAC[REAL_MUL_RID]);
2285 (REWRITE_WITH `t1 % a + t2 % b + (t3 * u) % c + (t4 + t3 * v) % d =
2286 t1 % a + t2 % b + t3 % (u % c + v % d) + t4 % (d:real^3)`);
2288 (ASM_REWRITE_TAC[])]);;
2290 (* ======================================================================= *)
2292 let CONVEX_HULL_4_SUBSET_AFF_GE_2_2 = prove_by_refinement (
2294 convex hull ({a, b, c, d}) SUBSET aff_ge {a, b} {c, d}`,
2295 [(REPEAT STRIP_TAC);
2296 (ASM_CASES_TAC `DISJOINT {a, b} {c, d:real^3}`);
2297 (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM; CONVEX_HULL_4]);
2299 (ASM_SIMP_TAC[AFF_GE_2_2]);
2300 (REWRITE_TAC[IN_ELIM_THM]);
2301 (EXISTS_TAC `u:real`);
2302 (EXISTS_TAC `v:real`);
2303 (EXISTS_TAC `w:real`);
2304 (EXISTS_TAC `z:real`);
2305 (ASM_REWRITE_TAC[]);
2308 (ASM_CASES_TAC `c = a:real^3`);
2309 (ASM_REWRITE_TAC[]);
2310 (ONCE_REWRITE_TAC[AFF_GE_DISJOINT_DIFF]);
2311 (ASM_CASES_TAC `b = a:real^3 \/ b = d`);
2312 (REWRITE_WITH `{a, b:real^3} DIFF {a, d:real^3} = {}`);
2314 (ONCE_REWRITE_TAC[CONVEX_HULL_AFF_GE]);
2315 (REWRITE_WITH `{a, b, a , d:real^3} = {a, d}`);
2318 (REWRITE_WITH `{a, b:real^3} DIFF {a, d:real^3} = {b}`);
2320 (NEW_GOAL `DISJOINT {b:real^3} {a, d}`);
2322 (ASM_SIMP_TAC[Fan.AFF_GE_1_2]);
2323 (REWRITE_WITH `{a, b, a , d:real^3} = {a, b, d}`);
2325 (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM; CONVEX_HULL_3]);
2327 (EXISTS_TAC `v:real` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `w:real`);
2328 (ASM_REWRITE_TAC[REAL_ARITH `a + b + c = b + a + c`]);
2332 (ASM_CASES_TAC `c = b:real^3`);
2333 (ASM_REWRITE_TAC[]);
2334 (ONCE_REWRITE_TAC[AFF_GE_DISJOINT_DIFF]);
2335 (ASM_CASES_TAC `a = b:real^3 \/ a = d`);
2336 (REWRITE_WITH `{a, b:real^3} DIFF {b, d:real^3} = {}`);
2338 (ONCE_REWRITE_TAC[CONVEX_HULL_AFF_GE]);
2339 (REWRITE_WITH `{a, b, b , d:real^3} = {b, d}`);
2342 (REWRITE_WITH `{a, b:real^3} DIFF {b, d:real^3} = {a}`);
2344 (NEW_GOAL `DISJOINT {a:real^3} {b, d}`);
2346 (ASM_SIMP_TAC[Fan.AFF_GE_1_2]);
2347 (REWRITE_WITH `{a, b, b , d:real^3} = {a, b, d}`);
2349 (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM; CONVEX_HULL_3]);
2351 (EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real` THEN EXISTS_TAC `w:real`);
2352 (ASM_REWRITE_TAC[]);
2355 (ASM_CASES_TAC `d = a:real^3`);
2356 (ASM_REWRITE_TAC[]);
2357 (ONCE_REWRITE_TAC[AFF_GE_DISJOINT_DIFF]);
2358 (ASM_CASES_TAC `b = a:real^3 \/ b = c`);
2359 (REWRITE_WITH `{a, b:real^3} DIFF {c, a:real^3} = {}`);
2361 (ONCE_REWRITE_TAC[CONVEX_HULL_AFF_GE]);
2362 (REWRITE_WITH `{a, b, c , a:real^3} = {a, c}`);
2364 (REWRITE_TAC[SET_RULE `{x, y} = {y, x}`]);
2367 (REWRITE_WITH `{a, b:real^3} DIFF {c, a:real^3} = {b}`);
2369 (NEW_GOAL `DISJOINT {b:real^3} {c, a}`);
2371 (ASM_SIMP_TAC[Fan.AFF_GE_1_2]);
2372 (REWRITE_WITH `{a, b, c, a:real^3} = {a, b, c}`);
2374 (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM; CONVEX_HULL_3]);
2376 (EXISTS_TAC `v:real` THEN EXISTS_TAC `w:real` THEN EXISTS_TAC `u:real`);
2377 (ASM_REWRITE_TAC[REAL_ARITH `v + w + u = u + v + w`]);
2381 (NEW_GOAL `d = b:real^3`);
2383 (ASM_REWRITE_TAC[]);
2384 (ONCE_REWRITE_TAC[AFF_GE_DISJOINT_DIFF]);
2385 (ASM_CASES_TAC `a = b:real^3 \/ a = c`);
2386 (REWRITE_WITH `{a, b:real^3} DIFF {c, b:real^3} = {}`);
2388 (ONCE_REWRITE_TAC[CONVEX_HULL_AFF_GE]);
2389 (REWRITE_WITH `{a, b, c , b:real^3} = {c, b}`);
2392 (REWRITE_WITH `{a, b:real^3} DIFF {c, b:real^3} = {a}`);
2394 (NEW_GOAL `DISJOINT {a:real^3} {c, b}`);
2396 (ASM_SIMP_TAC[Fan.AFF_GE_1_2]);
2397 (REWRITE_WITH `{a, b, c , b:real^3} = {a, b, c}`);
2399 (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM; CONVEX_HULL_3]);
2401 (EXISTS_TAC `u:real` THEN EXISTS_TAC `w:real` THEN EXISTS_TAC `v:real`);
2402 (ASM_REWRITE_TAC[REAL_ARITH `a + b + c = a + c + b`]);
2403 (VECTOR_ARITH_TAC)]);;
2405 (* ======================================================================= *)
2407 let AFF_INDEPENDENT_SET_OF_LIST_BARV = prove_by_refinement (
2408 `!V ul:(real^3)list.packing V /\ saturated V /\ barV V 3 ul
2409 ==> ~ affine_dependent (set_of_list ul)`,
2410 [(REPEAT STRIP_TAC);
2411 (SUBGOAL_THEN `? u0 u1 u2 u3. (ul:(real^3)list) = [u0:real^3;u1;u2;u3]` CHOOSE_TAC);
2412 (MP_TAC (ASSUME `barV V 3 ul`));
2413 (REWRITE_TAC[BARV_3_EXPLICIT]);
2414 (FIRST_X_ASSUM CHOOSE_TAC);
2415 (FIRST_X_ASSUM CHOOSE_TAC);
2416 (FIRST_X_ASSUM CHOOSE_TAC);
2418 (NEW_GOAL `barV V 3 (ul:(real^3)list)`);
2419 (ASM_REWRITE_TAC[]);
2420 (NEW_GOAL `~affine_dependent {u0,u1,u2,u3:real^3}`);
2421 (REWRITE_TAC[AFFINE_INDEPENDENT_IFF_CARD]);
2423 (REWRITE_TAC[Geomdetail.FINITE6]);
2424 (NEW_GOAL `aff_dim {u0, u1, u2, u3:real^3} = &3`);
2425 (REWRITE_WITH `{u0, u1, u2, u3:real^3} = set_of_list ul`);
2426 (ASM_REWRITE_TAC[set_of_list]);
2427 (MATCH_MP_TAC Rogers.MHFTTZN1);
2428 (EXISTS_TAC `V:real^3->bool`);
2429 (ASM_REWRITE_TAC[]);
2430 (ASM_REWRITE_TAC[]);
2431 (ONCE_REWRITE_TAC[ARITH_RULE
2432 `&3 = &(CARD {u0, u1, u2, u3:real^3}) - (&1):int
2433 <=> &(CARD {u0, u1, u2, u3:real^3}) = (&4):int`]);
2434 (ONCE_REWRITE_TAC[INT_OF_NUM_EQ]);
2435 (REWRITE_TAC[Geomdetail.CARD4]);
2438 (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
2439 (REWRITE_WITH `{u0, u1, u2, u3} = {u1, u2, u3:real^3}`);
2441 (REWRITE_TAC[Geomdetail.CARD3]);
2442 (NEW_GOAL `aff_dim {u0, u1, u2, u3} <= &(CARD {u0, u1, u2, u3:real^3}) - (&1):int`);
2443 (MATCH_MP_TAC AFF_DIM_LE_CARD);
2444 (REWRITE_TAC[Geomdetail.FINITE6]);
2445 (NEW_GOAL `(&4):int <= &(CARD {u0, u1, u2, u3:real^3})`);
2446 (ONCE_REWRITE_TAC[ARITH_RULE
2447 `(&4):int <= &(CARD {u0, u1, u2, u3:real^3}) <=>
2448 &3 <= &(CARD {u0, u1, u2, u3:real^3}) - (&1):int`]);
2450 (NEW_GOAL `&(CARD {u0, u1, u2, u3:real^3}) <= (&4):int`);
2451 (ONCE_REWRITE_TAC[INT_OF_NUM_LE]);
2452 (REWRITE_TAC[Geomdetail.CARD4]);
2453 (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} = 4`);
2454 (ONCE_REWRITE_TAC[GSYM INT_OF_NUM_EQ]);
2458 (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
2459 (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u2, u3:real^3}`);
2461 (REWRITE_TAC[Geomdetail.CARD3]);
2462 (NEW_GOAL `aff_dim {u0, u1, u2, u3} <= &(CARD {u0, u1, u2, u3:real^3}) - (&1):int`);
2463 (MATCH_MP_TAC AFF_DIM_LE_CARD);
2464 (REWRITE_TAC[Geomdetail.FINITE6]);
2465 (NEW_GOAL `(&4):int <= &(CARD {u0, u1, u2, u3:real^3})`);
2466 (ONCE_REWRITE_TAC[ARITH_RULE
2467 `(&4):int <= &(CARD {u0, u1, u2, u3:real^3}) <=>
2468 &3 <= &(CARD {u0, u1, u2, u3:real^3}) - (&1):int`]);
2470 (NEW_GOAL `&(CARD {u0, u1, u2, u3:real^3}) <= (&4):int`);
2471 (ONCE_REWRITE_TAC[INT_OF_NUM_LE]);
2472 (REWRITE_TAC[Geomdetail.CARD4]);
2473 (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} = 4`);
2474 (ONCE_REWRITE_TAC[GSYM INT_OF_NUM_EQ]);
2478 (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
2479 (REWRITE_WITH `{u0, u1, u2, u3} = {u1, u0, u3:real^3}`);
2481 (REWRITE_TAC[Geomdetail.CARD3]);
2482 (NEW_GOAL `aff_dim {u0, u1, u2, u3} <= &(CARD {u0, u1, u2, u3:real^3}) - (&1):int`);
2483 (MATCH_MP_TAC AFF_DIM_LE_CARD);
2484 (REWRITE_TAC[Geomdetail.FINITE6]);
2485 (NEW_GOAL `(&4):int <= &(CARD {u0, u1, u2, u3:real^3})`);
2486 (ONCE_REWRITE_TAC[ARITH_RULE
2487 `(&4):int <= &(CARD {u0, u1, u2, u3:real^3}) <=>
2488 &3 <= &(CARD {u0, u1, u2, u3:real^3}) - (&1):int`]);
2490 (NEW_GOAL `&(CARD {u0, u1, u2, u3:real^3}) <= (&4):int`);
2491 (ONCE_REWRITE_TAC[INT_OF_NUM_LE]);
2492 (REWRITE_TAC[Geomdetail.CARD4]);
2493 (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} = 4`);
2494 (ONCE_REWRITE_TAC[GSYM INT_OF_NUM_EQ]);
2498 (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
2499 (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u2, u3:real^3}`);
2501 (REWRITE_TAC[Geomdetail.CARD3]);
2502 (NEW_GOAL `aff_dim {u0, u1, u2, u3} <= &(CARD {u0, u1, u2, u3:real^3}) - (&1):int`);
2503 (MATCH_MP_TAC AFF_DIM_LE_CARD);
2504 (REWRITE_TAC[Geomdetail.FINITE6]);
2505 (NEW_GOAL `(&4):int <= &(CARD {u0, u1, u2, u3:real^3})`);
2506 (ONCE_REWRITE_TAC[ARITH_RULE
2507 `(&4):int <= &(CARD {u0, u1, u2, u3:real^3}) <=>
2508 &3 <= &(CARD {u0, u1, u2, u3:real^3}) - (&1):int`]);
2510 (NEW_GOAL `&(CARD {u0, u1, u2, u3:real^3}) <= (&4):int`);
2511 (ONCE_REWRITE_TAC[INT_OF_NUM_LE]);
2512 (REWRITE_TAC[Geomdetail.CARD4]);
2513 (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} = 4`);
2514 (ONCE_REWRITE_TAC[GSYM INT_OF_NUM_EQ]);
2517 (ASM_MESON_TAC[set_of_list])]);;
2519 (* ======================================================================= *)
2521 let VORONOI_LIST_3_SINGLETON_EXPLICIT = prove_by_refinement (
2523 packing V /\ saturated V /\ barV V 3 ul
2524 ==> (?a. voronoi_list V ul = {a} /\
2525 a = circumcenter (set_of_list ul) /\
2526 hl ul = dist (HD ul, a))`,
2527 [(REPEAT STRIP_TAC);
2528 (SUBGOAL_THEN `? u0 u1 u2 u3. (ul:(real^3)list) = [u0:real^3;u1;u2;u3]` CHOOSE_TAC);
2529 (MP_TAC (ASSUME `barV V 3 ul`));
2530 (REWRITE_TAC[BARV_3_EXPLICIT]);
2531 (FIRST_X_ASSUM CHOOSE_TAC);
2532 (FIRST_X_ASSUM CHOOSE_TAC);
2533 (FIRST_X_ASSUM CHOOSE_TAC);
2535 (NEW_GOAL `~affine_dependent {u0,u1,u2,u3:real^3}`);
2536 (ASM_MESON_TAC[set_of_list; AFF_INDEPENDENT_SET_OF_LIST_BARV]);
2538 (NEW_GOAL `barV V 3 ul`);
2539 (ASM_REWRITE_TAC[]);
2540 (UP_ASM_TAC THEN REWRITE_TAC[BARV; VORONOI_NONDG]);
2543 (NEW_GOAL `initial_sublist ul (ul:(real^3)list) /\ 0 < LENGTH ul`);
2544 (ASM_REWRITE_TAC[INITIAL_SUBLIST; LENGTH;
2545 ARITH_RULE `0 < 3 + 1 /\ 0 < SUC (SUC (SUC (SUC 0)))`]);
2546 (EXISTS_TAC `[]:(real^3)list`);
2547 (REWRITE_TAC[APPEND]);
2548 (NEW_GOAL `aff_dim (voronoi_list V (ul:(real^3)list)) + &(LENGTH ul) = &4`);
2550 (UP_ASM_TAC THEN ASM_REWRITE_TAC[LENGTH; ARITH_RULE `3 + 1 = 4`]);
2552 (NEW_GOAL `aff_dim (voronoi_list V [u0; u1; u2; u3:real^3]) = &0`);
2554 (UP_ASM_TAC THEN REWRITE_TAC[AFF_DIM_EQ_0]);
2557 (EXISTS_TAC `a:real^3`);
2559 (NEW_GOAL `a = circumcenter (set_of_list [u0; u1; u2; u3:real^3])`);
2560 (REWRITE_TAC[set_of_list]);
2561 (NEW_GOAL `!p. p IN affine hull {u0, u1, u2, u3:real^3} /\
2562 (?c. !w. w IN {u0, u1, u2, u3} ==> dist (p,w) = c)
2563 ==> p = circumcenter {u0, u1, u2, u3}`);
2564 (MATCH_MP_TAC Rogers.OAPVION3);
2565 (ASM_REWRITE_TAC[]);
2567 (FIRST_X_ASSUM MATCH_MP_TAC);
2568 (NEW_GOAL `a IN voronoi_list V [u0; u1; u2; u3:real^3]`);
2569 (UP_ASM_TAC THEN TRUONG_SET_TAC[]);
2570 (NEW_GOAL `affine hull {u0, u1, u2, u3:real^3} = (:real^3)`);
2571 (ONCE_ASM_REWRITE_TAC[GSYM AFF_DIM_EQ_FULL]);
2572 (REWRITE_TAC[DIMINDEX_3]);
2573 (REWRITE_WITH `{u0, u1, u2, u3:real^3} = set_of_list ul`);
2574 (ASM_REWRITE_TAC[set_of_list]);
2575 (MATCH_MP_TAC Rogers.MHFTTZN1);
2576 (EXISTS_TAC `V:real^3->bool`);
2577 (ASM_REWRITE_TAC[]);
2578 (ASM_REWRITE_TAC[]);
2579 (REWRITE_TAC[IN_UNIV]);
2580 (EXISTS_TAC `dist (a,u0:real^3)`);
2581 (UNDISCH_TAC `a IN voronoi_list V [u0; u1; u2; u3:real^3]`);
2582 (REWRITE_TAC[VORONOI_LIST;VORONOI_SET; set_of_list;
2583 IN_INTERS; voronoi_closed]);
2587 (NEW_GOAL `a IN {x | !w. V w ==> dist (x,u0) <= dist (x,w:real^3)}`);
2588 (FIRST_X_ASSUM MATCH_MP_TAC);
2589 (REWRITE_TAC[IN; IN_ELIM_THM]);
2590 (EXISTS_TAC `u0:real^3` THEN REWRITE_TAC[]);
2593 (NEW_GOAL `a IN {x | !w. V w ==> dist (x,u1) <= dist (x,w:real^3)}`);
2594 (FIRST_X_ASSUM MATCH_MP_TAC);
2595 (REWRITE_TAC[IN; IN_ELIM_THM]);
2596 (EXISTS_TAC `u1:real^3` THEN REWRITE_TAC[]);
2599 (NEW_GOAL `a IN {x | !w. V w ==> dist (x,u2) <= dist (x,w:real^3)}`);
2600 (FIRST_X_ASSUM MATCH_MP_TAC);
2601 (REWRITE_TAC[IN; IN_ELIM_THM]);
2602 (EXISTS_TAC `u2:real^3` THEN REWRITE_TAC[]);
2605 (NEW_GOAL `a IN {x | !w. V w ==> dist (x,u3) <= dist (x,w:real^3)}`);
2606 (FIRST_X_ASSUM MATCH_MP_TAC);
2607 (REWRITE_TAC[IN; IN_ELIM_THM]);
2608 (EXISTS_TAC `u3:real^3` THEN REWRITE_TAC[]);
2611 (REPLICATE_TAC 4 UP_ASM_TAC THEN REWRITE_TAC[IN;IN_ELIM_THM]);
2613 (NEW_GOAL `u0 IN V /\ u1 IN V /\ u2 IN V /\ (u3:real^3) IN V`);
2614 (UNDISCH_TAC `barV V 3 (ul:(real^3)list)`);
2615 (REWRITE_TAC[BARV]);
2617 (NEW_GOAL `initial_sublist [u0;u1;u2;u3] ul /\
2618 0 < LENGTH [u0;u1;u2;u3:real^3]`);
2619 (REWRITE_TAC[LENGTH; INITIAL_SUBLIST]);
2621 (EXISTS_TAC `[]:(real^3)list`);
2622 (ASM_REWRITE_TAC[APPEND]);
2625 (NEW_GOAL `voronoi_nondg V [u0;u1;u2;u3:real^3]`);
2627 (UP_ASM_TAC THEN REWRITE_TAC[VORONOI_NONDG; set_of_list]);
2630 (UNDISCH_TAC `w IN {u0, u1, u2, u3:real^3}`);
2631 (REWRITE_TAC[Geomdetail.IN_SET4] THEN REPEAT STRIP_TAC);
2632 (ASM_REWRITE_TAC[]);
2634 (ASM_REWRITE_TAC[]);
2635 (NEW_GOAL `dist (a,u0) <= dist (a,u1:real^3)`);
2636 (MATCH_MP_TAC (ASSUME `!w. V w ==> dist (a,u0) <= dist (a,w:real^3)`));
2637 (ASM_REWRITE_TAC[GSYM IN]);
2638 (NEW_GOAL `dist (a,u1) <= dist (a,u0:real^3)`);
2639 (MATCH_MP_TAC (ASSUME `!w. V w ==> dist (a,u1) <= dist (a,w:real^3)`));
2640 (ASM_REWRITE_TAC[GSYM IN]);
2641 (ASM_REAL_ARITH_TAC);
2643 (ASM_REWRITE_TAC[]);
2644 (NEW_GOAL `dist (a,u0) <= dist (a,u2:real^3)`);
2645 (MATCH_MP_TAC (ASSUME `!w. V w ==> dist (a,u0) <= dist (a,w:real^3)`));
2646 (ASM_REWRITE_TAC[GSYM IN]);
2647 (NEW_GOAL `dist (a,u2) <= dist (a,u0:real^3)`);
2648 (MATCH_MP_TAC (ASSUME `!w. V w ==> dist (a,u2) <= dist (a,w:real^3)`));
2649 (ASM_REWRITE_TAC[GSYM IN]);
2650 (ASM_REAL_ARITH_TAC);
2652 (ASM_REWRITE_TAC[]);
2653 (NEW_GOAL `dist (a,u0) <= dist (a,u3:real^3)`);
2654 (MATCH_MP_TAC (ASSUME `!w. V w ==> dist (a,u0) <= dist (a,w:real^3)`));
2655 (ASM_REWRITE_TAC[GSYM IN]);
2656 (NEW_GOAL `dist (a,u3) <= dist (a,u0:real^3)`);
2657 (MATCH_MP_TAC (ASSUME `!w. V w ==> dist (a,u3) <= dist (a,w:real^3)`));
2658 (ASM_REWRITE_TAC[GSYM IN]);
2659 (ASM_REAL_ARITH_TAC);
2661 (ASM_REWRITE_TAC[]);
2662 (REWRITE_TAC[HL;HD]);
2663 (ONCE_REWRITE_TAC[DIST_SYM]);
2664 (ABBREV_TAC `S = set_of_list [u0; u1; u2; u3:real^3]`);
2665 (NEW_GOAL `(!w. w IN S ==> radV S = dist (circumcenter S,w:real^3))`);
2666 (MATCH_MP_TAC Rogers.OAPVION2);
2667 (EXPAND_TAC "S" THEN DEL_TAC THEN ASM_REWRITE_TAC[set_of_list]);
2668 (FIRST_ASSUM MATCH_MP_TAC);
2669 (EXPAND_TAC "S" THEN REWRITE_TAC[set_of_list]);
2670 (TRUONG_SET_TAC[])]);;
2672 (* ======================================================================= *)
2674 let ORTHOGONAL_AFF_HULL_2_KY_LEMMA = prove_by_refinement (
2676 orthogonal (a - b) n /\ s IN aff {a, b} /\ p IN aff {a, b}
2677 ==> orthogonal (s - p) n`,
2678 [(REWRITE_TAC[Trigonometry2.AFF2; IN; IN_ELIM_THM; orthogonal]);
2680 (ASM_REWRITE_TAC[VECTOR_ARITH `(t % a + (&1 - t) % b) - (t' % a + (&1 - t') % b)
2681 = (t - t') % (a - b)`;DOT_LMUL;REAL_MUL_RZERO])]);;
2682 (* ======================================================================= *)
2685 let DIST_PROJECTION_LT_LEMMA = prove_by_refinement (
2686 `!x a b:real^3. ?s. s IN aff {a, b} /\
2687 (!m n. m IN aff {a, b} /\ n IN aff {a, b} ==>
2688 (dist (x, m) < dist (x, n) <=> dist (s,m) < dist (s,n)) /\
2689 (dist (x, m) <= dist (x, n) <=> dist (s,m) <= dist (s,n)))`,
2690 [ (REPEAT STRIP_TAC);
2691 (SUBGOAL_THEN `?s:real^3. s IN aff {a, b} /\ (x - s) dot (a - b) = &0` CHOOSE_TAC);
2692 (REWRITE_TAC[Trigonometry2.EXISTS_PROJECTING_POINT2]) ;
2693 (EXISTS_TAC `s:real^3` THEN ASM_REWRITE_TAC[]);
2696 (NEW_GOAL `orthogonal (a - b) (x - s:real^3)`);
2697 (REWRITE_TAC[orthogonal]);
2698 (ONCE_REWRITE_TAC[DOT_SYM] THEN ASM_REWRITE_TAC[]);
2702 (REWRITE_TAC[dist]);
2703 (NEW_GOAL `norm (s - m:real^3) = abs (norm (s - m)) /\
2704 norm (s - n) = abs (norm (s - n))`);
2705 (MESON_TAC[REAL_ABS_REFL;NORM_POS_LE]);
2706 (ONCE_ASM_REWRITE_TAC[]);
2707 (REWRITE_TAC[REAL_LT_SQUARE_ABS]);
2708 (NEW_GOAL `norm (x:real^3 - m) pow 2 < norm (x - n) pow 2`);
2709 (ONCE_REWRITE_TAC[GSYM REAL_LT_SQUARE_ABS]);
2711 (NEW_GOAL `abs (norm (x - m:real^3)) = (norm (x - m)) /\
2712 abs (norm (x - n)) = (norm (x - n))`);
2713 (MESON_TAC[REAL_ABS_REFL;NORM_POS_LE]);
2714 (ASM_REWRITE_TAC[]);
2715 (REWRITE_TAC[GSYM dist]);
2716 (ASM_REWRITE_TAC[]);
2717 (NEW_GOAL `norm (x - m:real^3) pow 2 = norm (s - m) pow 2 + norm (x - s) pow 2`);
2718 (MATCH_MP_TAC PYTHAGORAS);
2719 (MATCH_MP_TAC ORTHOGONAL_AFF_HULL_2_KY_LEMMA);
2720 (EXISTS_TAC `a:real^3` THEN EXISTS_TAC `b:real^3`);
2721 (ASM_REWRITE_TAC[]);
2722 (NEW_GOAL `norm (x - n:real^3) pow 2 = norm (s - n) pow 2 + norm (x - s) pow 2`);
2723 (MATCH_MP_TAC PYTHAGORAS);
2724 (MATCH_MP_TAC ORTHOGONAL_AFF_HULL_2_KY_LEMMA);
2725 (EXISTS_TAC `a:real^3` THEN EXISTS_TAC `b:real^3`);
2726 (ASM_REWRITE_TAC[]);
2727 (ASM_REAL_ARITH_TAC);
2730 (REWRITE_TAC[dist]);
2731 (NEW_GOAL `norm (x - m:real^3) = abs (norm (x - m)) /\
2732 norm (x - n) = abs (norm (x - n))`);
2733 (MESON_TAC[REAL_ABS_REFL;NORM_POS_LE]);
2734 (ONCE_ASM_REWRITE_TAC[]);
2735 (REWRITE_TAC[REAL_LT_SQUARE_ABS]);
2736 (NEW_GOAL `norm (s:real^3 - m) pow 2 < norm (s - n) pow 2`);
2737 (ONCE_REWRITE_TAC[GSYM REAL_LT_SQUARE_ABS]);
2739 (NEW_GOAL `abs (norm (s - m:real^3)) = (norm (s - m)) /\
2740 abs (norm (s - n)) = (norm (s - n))`);
2741 (MESON_TAC[REAL_ABS_REFL;NORM_POS_LE]);
2742 (ASM_REWRITE_TAC[]);
2743 (REWRITE_TAC[GSYM dist]);
2744 (ASM_REWRITE_TAC[]);
2745 (NEW_GOAL `norm (x - m:real^3) pow 2 = norm (s - m) pow 2 + norm (x - s) pow 2`);
2746 (MATCH_MP_TAC PYTHAGORAS);
2747 (MATCH_MP_TAC ORTHOGONAL_AFF_HULL_2_KY_LEMMA);
2748 (EXISTS_TAC `a:real^3` THEN EXISTS_TAC `b:real^3`);
2749 (ASM_REWRITE_TAC[]);
2751 (NEW_GOAL `norm (x - n:real^3) pow 2 = norm (s - n) pow 2 + norm (x - s) pow 2`);
2752 (MATCH_MP_TAC PYTHAGORAS);
2753 (MATCH_MP_TAC ORTHOGONAL_AFF_HULL_2_KY_LEMMA);
2754 (EXISTS_TAC `a:real^3` THEN EXISTS_TAC `b:real^3`);
2755 (ASM_REWRITE_TAC[]);
2756 (ASM_REAL_ARITH_TAC);
2758 (NEW_GOAL `orthogonal (a - b) (x - s:real^3)`);
2759 (REWRITE_TAC[orthogonal]);
2760 (ONCE_REWRITE_TAC[DOT_SYM] THEN ASM_REWRITE_TAC[]);
2764 (REWRITE_TAC[dist]);
2765 (NEW_GOAL `norm (s - m:real^3) = abs (norm (s - m)) /\
2766 norm (s - n) = abs (norm (s - n))`);
2767 (MESON_TAC[REAL_ABS_REFL;NORM_POS_LE]);
2768 (ONCE_ASM_REWRITE_TAC[]);
2769 (REWRITE_TAC[REAL_LE_SQUARE_ABS]);
2770 (NEW_GOAL `norm (x:real^3 - m) pow 2 <= norm (x - n) pow 2`);
2771 (ONCE_REWRITE_TAC[GSYM REAL_LE_SQUARE_ABS]);
2773 (NEW_GOAL `abs (norm (x - m:real^3)) = (norm (x - m)) /\
2774 abs (norm (x - n)) = (norm (x - n))`);
2775 (MESON_TAC[REAL_ABS_REFL;NORM_POS_LE]);
2776 (ASM_REWRITE_TAC[]);
2777 (REWRITE_TAC[GSYM dist]);
2778 (ASM_REWRITE_TAC[]);
2779 (NEW_GOAL `norm (x - m:real^3) pow 2 = norm (s - m) pow 2 + norm (x - s) pow 2`);
2780 (MATCH_MP_TAC PYTHAGORAS);
2781 (MATCH_MP_TAC ORTHOGONAL_AFF_HULL_2_KY_LEMMA);
2782 (EXISTS_TAC `a:real^3` THEN EXISTS_TAC `b:real^3`);
2783 (ASM_REWRITE_TAC[]);
2784 (NEW_GOAL `norm (x - n:real^3) pow 2 = norm (s - n) pow 2 + norm (x - s) pow 2`);
2785 (MATCH_MP_TAC PYTHAGORAS);
2786 (MATCH_MP_TAC ORTHOGONAL_AFF_HULL_2_KY_LEMMA);
2787 (EXISTS_TAC `a:real^3` THEN EXISTS_TAC `b:real^3`);
2788 (ASM_REWRITE_TAC[]);
2789 (ASM_REAL_ARITH_TAC);
2792 (REWRITE_TAC[dist]);
2793 (NEW_GOAL `norm (x - m:real^3) = abs (norm (x - m)) /\
2794 norm (x - n) = abs (norm (x - n))`);
2795 (MESON_TAC[REAL_ABS_REFL;NORM_POS_LE]);
2796 (ONCE_ASM_REWRITE_TAC[]);
2797 (REWRITE_TAC[REAL_LE_SQUARE_ABS]);
2798 (NEW_GOAL `norm (s:real^3 - m) pow 2 <= norm (s - n) pow 2`);
2799 (ONCE_REWRITE_TAC[GSYM REAL_LE_SQUARE_ABS]);
2801 (NEW_GOAL `abs (norm (s - m:real^3)) = (norm (s - m)) /\
2802 abs (norm (s - n)) = (norm (s - n))`);
2803 (MESON_TAC[REAL_ABS_REFL;NORM_POS_LE]);
2804 (ASM_REWRITE_TAC[]);
2805 (REWRITE_TAC[GSYM dist]);
2806 (ASM_REWRITE_TAC[]);
2807 (NEW_GOAL `norm (x - m:real^3) pow 2 = norm (s - m) pow 2 + norm (x - s) pow 2`);
2808 (MATCH_MP_TAC PYTHAGORAS);
2809 (MATCH_MP_TAC ORTHOGONAL_AFF_HULL_2_KY_LEMMA);
2810 (EXISTS_TAC `a:real^3` THEN EXISTS_TAC `b:real^3`);
2811 (ASM_REWRITE_TAC[]);
2813 (NEW_GOAL `norm (x - n:real^3) pow 2 = norm (s - n) pow 2 + norm (x - s) pow 2`);
2814 (MATCH_MP_TAC PYTHAGORAS);
2815 (MATCH_MP_TAC ORTHOGONAL_AFF_HULL_2_KY_LEMMA);
2816 (EXISTS_TAC `a:real^3` THEN EXISTS_TAC `b:real^3`);
2817 (ASM_REWRITE_TAC[]);
2818 (ASM_REAL_ARITH_TAC)
2821 (* ======================================================================= *)
2824 let SIMPLEX_FURTHEST_LT_2 = prove_by_refinement (
2825 `!a (s:real^N->bool).
2827 ==> (!x. x IN convex hull s /\ ~(x IN s)
2828 ==> (?y. y IN s /\ norm (x - a) < norm (y - a)))`,
2829 [(REPEAT STRIP_TAC);
2830 (NEW_GOAL `(?y:real^N. y IN convex hull s /\ norm (x - a) < norm (y - a))`);
2831 (ASM_SIMP_TAC[SIMPLEX_FURTHEST_LT]);
2832 (FIRST_X_ASSUM CHOOSE_TAC);
2833 (ASM_CASES_TAC `y:real^N IN s`);
2834 (EXISTS_TAC `y:real^N`);
2835 (ASM_REWRITE_TAC[]);
2836 (SUBGOAL_THEN `(?y. y:real^N IN s /\
2837 (!x. x IN convex hull s ==> norm (x - a) <= norm (y - a)))`
2839 (MATCH_MP_TAC SIMPLEX_FURTHEST_LE);
2840 (ASM_REWRITE_TAC[]);
2842 (UNDISCH_TAC `x:real^N IN convex hull s`);
2843 (ASM_REWRITE_TAC[CONVEX_HULL_EMPTY]);
2845 (EXISTS_TAC `y':real^N`);
2846 (ASM_REWRITE_TAC[]);
2847 (MATCH_MP_TAC (REAL_ARITH `m < norm (y-a:real^N) /\ norm (y-a) <= n ==> m < n`));
2848 (ASM_REWRITE_TAC[]);
2849 (UP_ASM_TAC THEN STRIP_TAC THEN FIRST_ASSUM MATCH_MP_TAC);
2850 (ASM_REWRITE_TAC[])]);;
2852 (* ======================================================================= *)
2855 let DIST_BETWEEN_FURTHEST_LT = prove_by_refinement (
2857 between s (a, b) /\ ~(s = a) /\ ~(s = b) /\ ~(a = b) /\
2858 dist (x, b) <= dist (x, a)
2859 ==> dist (x,s) < dist (x,a)`,
2860 [(REPEAT GEN_TAC THEN REWRITE_TAC[BETWEEN_IN_CONVEX_HULL] THEN REPEAT STRIP_TAC
2861 THEN NEW_GOAL `(?y:real^3. y IN {a,b} /\ norm (s - x) < norm (y - x))`);
2862 (NEW_GOAL`(!h. h IN convex hull {a,b} /\ ~(h IN {a,b:real^3})
2863 ==> (?y. y IN {a,b} /\ norm (h - x) < norm (y - x)))`);
2864 (MATCH_MP_TAC SIMPLEX_FURTHEST_LT_2 THEN REWRITE_TAC[Geomdetail.FINITE6]);
2865 (FIRST_X_ASSUM MATCH_MP_TAC);
2867 (FIRST_X_ASSUM CHOOSE_TAC THEN UP_ASM_TAC);
2868 (REWRITE_TAC[SET_RULE `a IN {m,n} <=> a = m \/ a = n`]);
2869 (REWRITE_TAC[GSYM dist] THEN REPEAT STRIP_TAC);
2870 (ASM_MESON_TAC[DIST_SYM]);
2871 (ASM_MESON_TAC[DIST_SYM; REAL_ARITH `x < y /\ y <= z ==> x < z`])]);;
2873 (* ======================================================================= *)
2876 let ROGERS_EXPLICIT = prove_by_refinement (
2878 saturated V /\ packing V /\ barV V 3 ul ==>
2879 rogers V ul = convex hull
2880 {HD ul, omega_list_n V ul 1, omega_list_n V ul 2, omega_list_n V ul 3}`,
2881 [(REPEAT STRIP_TAC THEN REWRITE_TAC[ROGERS]);
2882 (NEW_GOAL `?u0 u1 u2 u3. (ul:(real^3)list) = [u0:real^3;u1;u2;u3]`);
2883 (MP_TAC (ASSUME `barV V 3 ul`));
2884 (REWRITE_TAC[BARV_3_EXPLICIT]);
2885 (FIRST_X_ASSUM CHOOSE_TAC);
2886 (FIRST_X_ASSUM CHOOSE_TAC);
2887 (FIRST_X_ASSUM CHOOSE_TAC);
2888 (FIRST_X_ASSUM CHOOSE_TAC);
2889 (REWRITE_WITH `{j | j < LENGTH (ul:(real^3)list)} = {0, 1,2,3}`);
2890 (ASM_REWRITE_TAC[LENGTH; ARITH_RULE `SUC (SUC (SUC (SUC 0))) = 4`]);
2891 (MESON_TAC[SET_OF_0_TO_3]);
2892 (REWRITE_TAC[IMAGE]);
2894 (REWRITE_WITH `!x. x IN {0,1,2,3} <=> (x = 0 \/x = 1 \/x = 2 \/x = 3)`);
2897 `!y. (?x. (x = 0 \/ x = 1 \/ x = 2 \/ x = 3) /\ y = omega_list_n V ul x)
2898 <=> (y = omega_list_n V ul 0) \/ (y = omega_list_n V ul 1) \/
2899 (y = omega_list_n V ul 2) \/(y = omega_list_n V ul 3)`);
2900 (SET_TAC[BETA_THM]);
2902 `{y | y = omega_list_n V ul 0 \/ y = omega_list_n V ul 1 \/
2903 y = omega_list_n V ul 2 \/ y = omega_list_n V ul 3}
2904 = {omega_list_n V ul 0, omega_list_n V ul 1,
2905 omega_list_n V ul 2, omega_list_n V ul 3}`);
2907 (REWRITE_WITH `omega_list_n V ul 0 = HD ul`);
2908 (REWRITE_TAC[OMEGA_LIST_N])]);;
2910 (* ======================================================================= *)
2912 let SEGMENT_INTER_CBALL_LEMMA = prove
2913 (`!x r a (b:real^3).
2914 dist (x, a) <= r /\ r <= dist (x, b)
2915 ==> (?c. between c (a, b) /\ dist (x, c) = r)`,
2916 REPEAT STRIP_TAC THEN ASM_CASES_TAC `dist(x:real^3,b) = r` THENL
2917 [EXISTS_TAC `b:real^3` THEN ASM_REWRITE_TAC[BETWEEN_REFL];
2918 MP_TAC(ISPECL [`segment[a:real^3,b]`; `cball(x:real^3,r)`]
2919 CONNECTED_INTER_FRONTIER) THEN
2921 [REWRITE_TAC[CONNECTED_SEGMENT; GSYM MEMBER_NOT_EMPTY] THEN CONJ_TAC THENL
2922 [EXISTS_TAC `a:real^3` THEN
2923 ASM_REWRITE_TAC[IN_INTER; ENDS_IN_SEGMENT; IN_CBALL];
2924 EXISTS_TAC `b:real^3` THEN
2925 ASM_REWRITE_TAC[IN_DIFF; ENDS_IN_SEGMENT; IN_CBALL] THEN
2926 ASM_REAL_ARITH_TAC];
2927 REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN MATCH_MP_TAC MONO_EXISTS THEN
2928 REWRITE_TAC[FRONTIER_CBALL; IN_ELIM_THM; IN_INTER;
2929 BETWEEN_IN_SEGMENT]]]);;
2931 (* ======================================================================= *)
2933 let CLOSEST_POINT_SING = prove_by_refinement (
2934 `!a (b:real^3). closest_point {a} b = a`,
2935 [(REPEAT GEN_TAC THEN REWRITE_TAC
2936 [closest_point;SET_RULE `a IN {x} <=> a = x`]);
2937 (MATCH_MP_TAC SELECT_UNIQUE);
2938 (REWRITE_TAC[BETA_THM] THEN GEN_TAC THEN EQ_TAC);
2941 (ASM_REWRITE_TAC[]);
2942 (ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC)]);;
2944 (* ======================================================================= *)
2947 let MXI_EXPLICIT = prove_by_refinement(
2949 packing V /\ saturated V /\ barV V 3 ul /\ ul = [u0;u1;u2;u3] /\
2950 hl (truncate_simplex 2 ul) < sqrt (&2) /\ sqrt (&2) <= hl ul
2951 ==> (?s. between s (omega_list_n V ul 2, omega_list_n V ul 3) /\
2952 dist (u0, s) = sqrt (&2) /\
2954 [(REPEAT STRIP_TAC);
2956 `?(s:real^3). between s (omega_list_n V ul 2, omega_list_n V ul 3) /\
2957 dist (u0, s) = sqrt (&2)`);
2958 (MATCH_MP_TAC SEGMENT_INTER_CBALL_LEMMA);
2961 (REWRITE_WITH `dist (u0:real^3,omega_list_n V ul 2) =
2962 hl (truncate_simplex 2 ul)`);
2963 (ABBREV_TAC `vl = truncate_simplex 2 (ul:(real^3)list)`);
2964 (REWRITE_WITH `hl (vl:(real^3)list) =
2965 dist (circumcenter (set_of_list vl),HD vl)`);
2966 (MATCH_MP_TAC Rogers.HL_EQ_DIST0);
2967 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `2`);
2968 (ASM_REWRITE_TAC[]);
2970 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
2971 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
2972 (REWRITE_TAC[DIST_SYM]);
2974 (REWRITE_TAC[PAIR_EQ]);
2977 (DEL_TAC THEN ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; HD]);
2978 (ASM_REWRITE_TAC[Marchal_cells.OMEGA_LIST_TRUNCATE_2]);
2979 (REWRITE_WITH `omega_list V [u0; u1; u2] = omega_list V (vl:(real^3)list)`);
2981 (DEL_TAC THEN ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2]);
2982 (MATCH_MP_TAC XNHPWAB1);
2984 (ASM_REWRITE_TAC[]);
2985 (REWRITE_TAC[IN] THEN EXPAND_TAC "vl");
2986 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
2987 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
2988 (ASM_REAL_ARITH_TAC);
2990 (* ======================================================================== *)
2992 (NEW_GOAL `~affine_dependent {u0,u1,u2,u3:real^3}`);
2993 (ASM_MESON_TAC[set_of_list; AFF_INDEPENDENT_SET_OF_LIST_BARV]);
2995 (REWRITE_WITH `dist (u0:real^3,omega_list_n V ul 3) =
2996 hl (truncate_simplex 3 ul)`);
2997 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_3]);
2998 (REWRITE_TAC[OMEGA_LIST_N; ARITH_RULE `3 = SUC 2`]);
2999 (ONCE_REWRITE_TAC[ARITH_RULE `SUC 2 = 3`]);
3000 (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_3]);
3002 (NEW_GOAL `barV V 3 ul`);
3003 (ASM_REWRITE_TAC[]);
3004 (UP_ASM_TAC THEN REWRITE_TAC[BARV; VORONOI_NONDG]);
3006 (NEW_GOAL `(?a. voronoi_list V ul = {a:real^3} /\
3007 a = circumcenter (set_of_list ul) /\
3008 hl ul = dist (HD ul,a))`);
3009 (ASM_SIMP_TAC[VORONOI_LIST_3_SINGLETON_EXPLICIT]);
3010 (UP_ASM_TAC THEN ASM_REWRITE_TAC[HD] THEN REPEAT STRIP_TAC);
3011 (REWRITE_TAC[ASSUME `voronoi_list V [u0; u1; u2; u3] = {a:real^3}`]);
3012 (REWRITE_TAC[CLOSEST_POINT_SING]);
3014 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_3]);
3016 (UP_ASM_TAC THEN REPEAT STRIP_TAC);
3018 (EXISTS_TAC `s:real^3`);
3019 (ASM_REWRITE_TAC[]);
3023 (UNDISCH_TAC `hl (truncate_simplex 2 (ul:(real^3)list)) < sqrt (&2)`);
3024 (ASM_REWRITE_TAC[]);
3025 (ASM_REAL_ARITH_TAC);
3027 (UP_ASM_TAC THEN MESON_TAC[]);
3028 (MATCH_MP_TAC SELECT_UNIQUE);
3030 (REWRITE_TAC[BETA_THM]);
3031 (REWRITE_TAC[GSYM BETWEEN_IN_CONVEX_HULL;HD]);
3032 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3035 (ASM_REWRITE_TAC[]);
3036 (ASM_MESON_TAC[DIST_SYM]);
3038 (DEL_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN
3039 REWRITE_TAC[BETWEEN_IN_CONVEX_HULL;
3040 CONVEX_HULL_2; IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
3041 (ABBREV_TAC `a = omega_list_n V [u0; u1; u2; u3:real^3] 2`);
3042 (ABBREV_TAC `b = omega_list_n V [u0; u1; u2; u3:real^3] 3`);
3043 (NEW_GOAL `s = u % a + v % (b:real^3)`);
3045 (NEW_GOAL `?c. c IN aff {a, b} /\ (u0 - c) dot (a - b:real^3) = &0`);
3046 (REWRITE_TAC[Trigonometry2.EXISTS_PROJECTING_POINT2]);
3047 (FIRST_X_ASSUM CHOOSE_TAC);
3048 (UP_ASM_TAC THEN REWRITE_TAC[Trigonometry2.AFF2;IN;IN_ELIM_THM]);
3052 (NEW_GOAL `dist (u0, a:real^3) < sqrt (&2)`);
3053 (REWRITE_WITH `dist (u0, a:real^3) = hl (truncate_simplex 2 (ul:(real^3)list))`);
3054 (ABBREV_TAC `vl = truncate_simplex 2 (ul:(real^3)list)`);
3055 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3056 (ONCE_REWRITE_TAC[DIST_SYM]);
3057 (REWRITE_WITH `a:real^3 = omega_list V vl`);
3058 (EXPAND_TAC "vl" THEN DEL_TAC);
3059 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; LENGTH; ARITH_RULE `SUC (SUC (SUC 0)) - 1 = 2`]);
3061 (REWRITE_TAC[Marchal_cells.OMEGA_LIST_TRUNCATE_2]);
3062 (REWRITE_WITH `u0:real^3 = HD vl`);
3063 (EXPAND_TAC "vl" THEN DEL_TAC);
3064 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; HD]);
3065 (MATCH_MP_TAC Rogers.WAUFCHE2);
3067 (ASM_REWRITE_TAC[]);
3068 (EXPAND_TAC "vl" THEN DEL_TAC);
3069 (ASM_REWRITE_TAC[IN]);
3070 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
3072 (ASM_MESON_TAC [ARITH_RULE `2 <= 3 `]);
3073 (ASM_REWRITE_TAC[]);
3075 (NEW_GOAL `dist (u0, b:real^3) >= sqrt (&2)`);
3076 (REWRITE_WITH `dist (u0, b:real^3) = hl (ul:(real^3)list)`);
3077 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3078 (SUBGOAL_THEN `?m. voronoi_list V ul = {m:real^3} /\
3079 m = circumcenter (set_of_list ul) /\
3080 hl ul = dist (HD ul,m)` CHOOSE_TAC);
3081 (ASM_SIMP_TAC [VORONOI_LIST_3_SINGLETON_EXPLICIT]);
3082 (NEW_GOAL `(b:real^3) IN voronoi_list V ul`);
3084 (REWRITE_TAC[OMEGA_LIST_N; ARITH_RULE `3 = SUC 2`]);
3085 (REWRITE_TAC[ARITH_RULE `SUC 2 = 3`; TRUNCATE_SIMPLEX_EXPLICIT_3]);
3086 (REWRITE_TAC[ASSUME `ul = [u0; u1; u2; u3:real^3]`]);
3087 (MATCH_MP_TAC CLOSEST_POINT_IN_SET);
3088 (REWRITE_TAC[Packing3.CLOSED_VORONOI_LIST]);
3089 (REWRITE_TAC[GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`)]);
3090 (UP_ASM_TAC THEN REPEAT STRIP_TAC);
3093 (UP_ASM_TAC THEN UP_ASM_TAC THEN REPEAT STRIP_TAC);
3094 (UP_ASM_TAC THEN REWRITE_TAC[ASSUME `voronoi_list V ul = {m:real^3}`]);
3095 (REWRITE_TAC[IN_SING] THEN STRIP_TAC);
3096 (REWRITE_WITH `u0:real^3 = HD ul`);
3097 (ASM_REWRITE_TAC[HD]);
3098 (REWRITE_TAC[ASSUME `b = m:real^3`]);
3099 (ASM_REWRITE_TAC[]);
3100 (ASM_REWRITE_TAC[]);
3102 (REWRITE_TAC[GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`)]
3103 THEN ASM_REAL_ARITH_TAC);
3105 (* ======================================================================== *)
3107 (ASM_CASES_TAC `y = s:real^3`);
3109 (NEW_GOAL `between y (a, b:real^3)`);
3110 (REWRITE_TAC[BETWEEN_IN_CONVEX_HULL; CONVEX_HULL_2;IN;IN_ELIM_THM]);
3111 (EXISTS_TAC `u':real` THEN EXISTS_TAC `v':real` THEN ASM_REWRITE_TAC[]);
3112 (NEW_GOAL `between s (a, b:real^3)`);
3113 (REWRITE_TAC[BETWEEN_IN_CONVEX_HULL; CONVEX_HULL_2;IN;IN_ELIM_THM]);
3114 (EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real` THEN ASM_REWRITE_TAC[]);
3115 (ASM_CASES_TAC `between y (s, a:real^3)`);
3117 (NEW_GOAL `dist (u0,y) < dist (u0,s:real^3)`);
3118 (MATCH_MP_TAC DIST_BETWEEN_FURTHEST_LT);
3119 (EXISTS_TAC `a:real^3`);
3122 (ASM_REWRITE_TAC[]);
3124 (NEW_GOAL `dist (y:real^3,u0) < sqrt (&2)`);
3125 (REWRITE_TAC[ASSUME `y = a:real^3`]);
3126 (ONCE_REWRITE_TAC[DIST_SYM]);
3128 (ASM_REAL_ARITH_TAC);
3130 (NEW_GOAL `dist (u0:real^3,s) < sqrt (&2)`);
3131 (REWRITE_TAC[ASSUME `s = a:real^3`]);
3133 (ASM_REAL_ARITH_TAC);
3135 (ASM_REAL_ARITH_TAC);
3137 (UP_ASM_TAC THEN REWRITE_WITH `dist (u0,y) = dist (y,u0:real^3)`);
3138 (MESON_TAC[DIST_SYM]);
3139 (ASM_REWRITE_TAC[]);
3141 (UP_ASM_TAC THEN MESON_TAC[]);
3144 (ASM_CASES_TAC `between s (y, a:real^3)`);
3146 (NEW_GOAL `dist (u0,s) < dist (u0,y:real^3)`);
3147 (MATCH_MP_TAC DIST_BETWEEN_FURTHEST_LT);
3148 (EXISTS_TAC `a:real^3`);
3151 (ASM_REWRITE_TAC[]);
3153 (NEW_GOAL `dist (u0,s:real^3) < sqrt (&2)`);
3154 (REWRITE_TAC[ASSUME `s = a:real^3`]);
3156 (ASM_REAL_ARITH_TAC);
3158 (NEW_GOAL `dist (y, u0:real^3) < sqrt (&2)`);
3159 (REWRITE_TAC[ASSUME `y = a:real^3`]);
3160 (ONCE_REWRITE_TAC[DIST_SYM]);
3162 (ASM_REAL_ARITH_TAC);
3164 (REWRITE_WITH `dist (u0,y:real^3) = dist (y, u0)`);
3165 (MESON_TAC[DIST_SYM]);
3166 (ASM_REAL_ARITH_TAC);
3168 (UP_ASM_TAC THEN REWRITE_WITH `dist (u0,y) = dist (y,u0:real^3)`);
3169 (MESON_TAC[DIST_SYM]);
3170 (ASM_REWRITE_TAC[]);
3172 (UP_ASM_TAC THEN MESON_TAC[]);
3174 (NEW_GOAL `collinear {y, s, a:real^3}`);
3175 (MATCH_MP_TAC AFFINE_HULL_3_IMP_COLLINEAR);
3176 (REWRITE_TAC[AFFINE_HULL_2;IN;IN_ELIM_THM]);
3177 (ASM_REWRITE_TAC[]);
3179 (EXISTS_TAC `v / (v - v')`);
3180 (EXISTS_TAC `&1 - v / (v - v')`);
3181 (REWRITE_TAC[REAL_ARITH `a + &1 - a = &1`]);
3182 (REWRITE_TAC[VECTOR_ARITH `a = x1 % (u' % a + v' % b) + x2 % (u % a + v % b)
3183 <=> (&1 - x1 * u' - x2 * u) % a - (x1 * v' + x2 * v) % b = vec 0`]);
3184 (REWRITE_WITH `&1 - v / (v - v') * u' - (&1 - v / (v - v')) * u = &0`);
3185 (REWRITE_TAC[REAL_ARITH `&1 - v / (v - v') * u' - (&1 - v / (v - v')) * u =
3186 (&1 - u) + v * (u - u') / (v - v') `]);
3187 (REWRITE_WITH `u - u' = v' - v:real`);
3188 (ASM_REAL_ARITH_TAC);
3189 (REWRITE_TAC[REAL_ARITH `&1 - u + v * (v' - v) / (v - v') = &1 - u - v * (v - v') / (v - v')`]);
3190 (REWRITE_WITH `(v - v') / (v - v') = &1`);
3191 (MATCH_MP_TAC REAL_DIV_REFL);
3192 (REWRITE_TAC[REAL_ARITH `b - a = &0 <=> a = b`]);
3195 (NEW_GOAL `s = y:real^3`);
3196 (REWRITE_TAC[ASSUME `y = u' % a + v' % (b:real^3)`;
3197 ASSUME `s = u % a + v % (b:real^3)`]);
3198 (NEW_GOAL `u = u':real`);
3199 (ASM_REAL_ARITH_TAC);
3200 (REWRITE_TAC[ASSUME `v' = v:real`; ASSUME `u = u':real`]);
3202 (ASM_REAL_ARITH_TAC);
3204 (REWRITE_WITH `v / (v - v') * v' + (&1 - v / (v - v')) * v = &0`);
3205 (REWRITE_TAC[REAL_ARITH `v / (v - v') * v' + (&1 - v / (v - v')) * v =
3206 v - v * (v - v') / (v - v') `]);
3207 (REWRITE_WITH `(v - v') / (v - v') = &1`);
3208 (MATCH_MP_TAC REAL_DIV_REFL);
3209 (REWRITE_TAC[REAL_ARITH `b - a = &0 <=> a = b`]);
3211 (NEW_GOAL `s = y:real^3`);
3212 (REWRITE_TAC[ASSUME `y = u' % a + v' % (b:real^3)`;
3213 ASSUME `s = u % a + v % (b:real^3)`]);
3214 (NEW_GOAL `u = u':real`);
3215 (ASM_REAL_ARITH_TAC);
3216 (REWRITE_TAC[ASSUME `v' = v:real`; ASSUME `u = u':real`]);
3218 (ASM_REAL_ARITH_TAC);
3221 (NEW_GOAL `between a (s, y:real^3)`);
3222 (UP_ASM_TAC THEN REWRITE_TAC[COLLINEAR_BETWEEN_CASES]);
3223 (ASM_MESON_TAC[BETWEEN_SYM]);
3224 (UP_ASM_TAC THEN REWRITE_TAC[BETWEEN_IN_CONVEX_HULL;CONVEX_HULL_2;IN;
3225 IN_ELIM_THM] THEN REPEAT STRIP_TAC);
3226 (NEW_GOAL `a = u'' % s + v'' % (y:real^3)`);
3227 (UP_ASM_TAC THEN REWRITE_TAC[]);
3228 (UP_ASM_TAC THEN REWRITE_TAC[ASSUME `y = u' % a + v' % (b:real^3)`;
3229 ASSUME `s = u % a + v % (b:real^3)`]);
3231 (REWRITE_TAC[VECTOR_ARITH
3232 `a = u'' % (u % a + v % b) + v'' % (u' % a + v' % b)
3233 <=> (u''* u + v'' * u' - &1) % a + (u'' * v + v'' * v') % b = vec 0`]);
3234 (REWRITE_WITH `(u'' * v + v'' * v') = -- (u'' * u + v'' * u' - &1)`);
3235 (REWRITE_TAC[REAL_ARITH `u'' * v + v'' * v' = --(u'' * u + v'' * u' - &1) <=>
3236 u'' * (u + v) + v'' * (u' + v') = &1`]);
3237 (ASM_REWRITE_TAC[REAL_MUL_RID]);
3238 (REWRITE_TAC[VECTOR_ARITH `a % x + -- a % y = a % (x - y)`;VECTOR_MUL_EQ_0]);
3240 (NEW_GOAL `u'' * u <= u'' * (u + v)`);
3241 (REWRITE_TAC[REAL_ARITH `a * b <= a * (b + c) <=> &0 <= a * c`]);
3242 (ASM_SIMP_TAC[REAL_LE_MUL]);
3243 (NEW_GOAL `v'' * u' <= v'' * (u' + v')`);
3244 (REWRITE_TAC[REAL_ARITH `a * b <= a * (b + c) <=> &0 <= a * c`]);
3245 (ASM_SIMP_TAC[REAL_LE_MUL]);
3246 (NEW_GOAL `u'' * (u + v) + v'' * (u' + v') = &1`);
3247 (ASM_REWRITE_TAC[REAL_MUL_RID]);
3248 (NEW_GOAL `v'' * u' = v'' * (u' + v')`);
3249 (ASM_REAL_ARITH_TAC);
3250 (UP_ASM_TAC THEN REWRITE_TAC[REAL_ARITH `a * b = a * (b + c) <=> &0 = a * c`]);
3252 (NEW_GOAL `u'' * u = u'' * (u + v)`);
3253 (ASM_REAL_ARITH_TAC);
3254 (UP_ASM_TAC THEN REWRITE_TAC[REAL_ARITH `a * b = a * (b + c) <=> &0 = a * c`]);
3257 (NEW_GOAL `~(u'' = &0)`);
3259 (NEW_GOAL `a = y:real^3`);
3260 (REWRITE_TAC[ASSUME `a = u'' % s + v'' % (y:real^3)`]);
3261 (REWRITE_WITH `u'' = &0 /\ v'' = &1`);
3262 (ASM_REAL_ARITH_TAC);
3264 (NEW_GOAL `dist (y, u0:real^3) < sqrt (&2)`);
3265 (ONCE_REWRITE_TAC[DIST_SYM]);
3266 (REWRITE_TAC[GSYM (ASSUME `a = y:real^3`)]);
3268 (ASM_REAL_ARITH_TAC);
3270 (NEW_GOAL `v = &0`);
3271 (MP_TAC (GSYM (ASSUME `&0 = u'' * v`)));
3272 (REWRITE_TAC[REAL_ENTIRE]);
3275 (NEW_GOAL `a = s:real^3`);
3276 (REWRITE_TAC[ASSUME `s = u % a + v % (b:real^3)`]);
3277 (REWRITE_WITH `u = &1 /\ v = &0`);
3278 (ASM_REAL_ARITH_TAC);
3280 (NEW_GOAL `dist (u0:real^3, s) < sqrt (&2)`);
3281 (REWRITE_TAC[GSYM (ASSUME `a = s:real^3`)]);
3284 (ASM_REAL_ARITH_TAC);
3286 (UP_ASM_TAC THEN REWRITE_TAC[VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
3288 (NEW_GOAL `dist (u0,a:real^3) >= sqrt (&2)`);
3289 (REWRITE_TAC[(ASSUME `a = b:real^3`)]);
3291 (ASM_REAL_ARITH_TAC)]);;
3293 (* ======================================================================= *)
3295 let CONVEX_HULL_4_IMP_2_2 = prove_by_refinement (
3297 p IN convex hull {a,b,c,d}
3298 ==> (?m n. between p (m,n) /\ between m (a,b) /\ between n (c,d))`,
3299 [(REWRITE_TAC[CONVEX_HULL_4;IN;IN_ELIM_THM] THEN REPEAT STRIP_TAC);
3300 (ASM_CASES_TAC `u + v = &0`);
3301 (NEW_GOAL `u = &0 /\ v = &0`);
3302 (ASM_REAL_ARITH_TAC);
3303 (EXISTS_TAC `a:real^3` THEN EXISTS_TAC `p:real^3`);
3304 (REWRITE_TAC[BETWEEN_REFL]);
3305 (REWRITE_TAC[BETWEEN_IN_CONVEX_HULL;CONVEX_HULL_2;IN;IN_ELIM_THM]);
3306 (EXISTS_TAC `w:real` THEN EXISTS_TAC `z:real`);
3307 (ASM_REWRITE_TAC[]);
3309 (ASM_REAL_ARITH_TAC);
3312 (ASM_CASES_TAC `w + z = &0`);
3313 (NEW_GOAL `w = &0 /\ z = &0`);
3314 (ASM_REAL_ARITH_TAC);
3315 (EXISTS_TAC `p:real^3` THEN EXISTS_TAC `c:real^3`);
3316 (REWRITE_TAC[BETWEEN_REFL]);
3317 (REWRITE_TAC[BETWEEN_IN_CONVEX_HULL;CONVEX_HULL_2;IN;IN_ELIM_THM]);
3318 (EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
3319 (ASM_REWRITE_TAC[]);
3321 (ASM_REAL_ARITH_TAC);
3324 (EXISTS_TAC `u/(u+v) % (a:real^3) + v /(u+v) % b`);
3325 (EXISTS_TAC `w/(w+z) % (c:real^3) + z/(w+z) % d`);
3326 (REWRITE_TAC[BETWEEN_IN_CONVEX_HULL;CONVEX_HULL_2;IN;IN_ELIM_THM]);
3328 (EXISTS_TAC `u + v` THEN EXISTS_TAC `w + z`);
3330 (ASM_REAL_ARITH_TAC);
3331 (ASM_REAL_ARITH_TAC);
3332 (ASM_REAL_ARITH_TAC);
3333 (ASM_REWRITE_TAC[VECTOR_ARITH `x % (y/x % a + z/x % b) = (x/x) % (y %a + z % b)`]);
3334 (REWRITE_WITH `(u+v)/(u+v) = &1 /\ (w+z)/(w+z) = &1`);
3336 (MATCH_MP_TAC REAL_DIV_REFL);
3337 (ASM_REWRITE_TAC[]);
3338 (MATCH_MP_TAC REAL_DIV_REFL);
3339 (ASM_REWRITE_TAC[]);
3341 (EXISTS_TAC `u / (u + v)` THEN EXISTS_TAC `v / (u + v)`);
3342 (ASM_REWRITE_TAC[]);
3344 (MATCH_MP_TAC REAL_LE_DIV);
3345 (ASM_REAL_ARITH_TAC);
3346 (MATCH_MP_TAC REAL_LE_DIV);
3347 (ASM_REAL_ARITH_TAC);
3348 (REWRITE_TAC[REAL_ARITH `u /(u + v) + v / (u + v) = (u+v)/(u+v)`]);
3349 (MATCH_MP_TAC REAL_DIV_REFL);
3350 (ASM_REWRITE_TAC[]);
3352 (EXISTS_TAC `w / (w + z)` THEN EXISTS_TAC `z / (w + z)`);
3353 (ASM_REWRITE_TAC[]);
3355 (MATCH_MP_TAC REAL_LE_DIV);
3356 (ASM_REAL_ARITH_TAC);
3357 (MATCH_MP_TAC REAL_LE_DIV);
3358 (ASM_REAL_ARITH_TAC);
3359 (REWRITE_TAC[REAL_ARITH `u /(u + v) + v / (u + v) = (u+v)/(u+v)`]);
3360 (MATCH_MP_TAC REAL_DIV_REFL);
3361 (ASM_REWRITE_TAC[])]);;
3363 let MXI_EXPLICIT_OLD = prove_by_refinement(
3364 `!V ul. packing V /\ saturated V /\ barV V 3 ul /\ ul = [u0;u1;u2;u3] /\
3365 hl (truncate_simplex 2 ul) < sqrt (&2) /\ sqrt (&2) <= hl ul
3366 ==> (?s. between s (omega_list_n V ul 2, omega_list_n V ul 3) /\
3367 dist (u0, s) = sqrt (&2) /\
3369 [MESON_TAC[MXI_EXPLICIT]]);;
3371 (* ======================================================================= *)
3373 let proj_point = new_definition
3374 `!e x. proj_point e x = x - projection e x`;;
3376 let projection_proj_point = prove_by_refinement (
3377 `!e x. projection e x = x - proj_point e x`,
3378 [ REWRITE_TAC[proj_point] THEN VECTOR_ARITH_TAC]);;
3380 let PRO_EXP = prove_by_refinement(
3381 `!e x. proj_point e x = (x dot e) / (e dot e) % e`,
3382 [REWRITE_TAC[projection;proj_point] THEN VECTOR_ARITH_TAC]);;
3384 (* ======================================================================= *)
3386 let BETWEEN_PROJ_POINT = prove_by_refinement (
3387 `!a b x e. between x (a,b) ==>
3388 between (proj_point e x) (proj_point e a, proj_point e b)`,
3389 [(REWRITE_TAC[BETWEEN_IN_CONVEX_HULL; CONVEX_HULL_2;IN;IN_ELIM_THM; PRO_EXP]);
3390 (REPEAT STRIP_TAC THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
3391 (ASM_REWRITE_TAC[]);
3392 (REWRITE_TAC[VECTOR_MUL_ASSOC;
3393 VECTOR_ARITH `x % a = m % a + n % a <=> (x -m - n) % a = vec 0`;
3394 REAL_ARITH `a / x - u * b / x - v * c / x = (a - u*b - v*c) / x`]);
3395 (REWRITE_TAC[VECTOR_ARITH
3396 `(u % a + v % b) dot e - u * (a dot e) - v * (b dot e) = &0`]);
3397 (REWRITE_TAC[REAL_ARITH `&0/a = &0`]);
3398 (VECTOR_ARITH_TAC)]);;
3400 (* ======================================================================= *)
3402 let PARALLEL_PROJECTION = prove_by_refinement (
3403 `!x y a:real^N b. between x (a, y) /\ ~(a = b)
3404 ==> (?k. k <= &1 /\ &0 <= k /\
3405 projection (b - a) (x - a) = k % projection (b - a) (y - a))`,
3406 [(REWRITE_TAC[projection; BETWEEN_IN_CONVEX_HULL;CONVEX_HULL_2;IN;IN_ELIM_THM]
3407 THEN REPEAT STRIP_TAC);
3408 (NEW_GOAL `(x - a) = v % (y - a:real^N)`);
3409 (REWRITE_WITH `x - a:real^N = (u % a + v % y) - (u + v) % a`);
3410 (ASM_REWRITE_TAC[]);
3413 (ASM_CASES_TAC `((y - a:real^N) dot (b - a) = &0)`);
3414 (EXISTS_TAC `v:real`);
3416 (ASM_REAL_ARITH_TAC);
3417 (ASM_REAL_ARITH_TAC);
3418 (ASM_REWRITE_TAC[DOT_LMUL;REAL_MUL_RZERO;Collect_geom.REAL_DIV_LZERO;
3419 VECTOR_MUL_LZERO; VECTOR_SUB_RZERO]);
3420 (EXISTS_TAC `((x - a) dot (b - a)) / ((y - a) dot (b - a:real^N))`);
3422 (ASM_REWRITE_TAC[DOT_LMUL; REAL_ARITH `(a * b) / c = a * (b / c)`]);
3423 (REWRITE_WITH `((y - a) dot (b - a)) / ((y - a) dot (b - a:real^N)) = &1`);
3424 (MATCH_MP_TAC REAL_DIV_REFL);
3425 (ASM_REWRITE_TAC[]);
3426 (ASM_REAL_ARITH_TAC);
3427 (ASM_REWRITE_TAC[DOT_LMUL; REAL_ARITH `(a * b) / c = a * (b / c)`]);
3428 (REWRITE_WITH `((y - a) dot (b - a)) / ((y - a) dot (b - a:real^N)) = &1`);
3429 (MATCH_MP_TAC REAL_DIV_REFL);
3430 (ASM_REWRITE_TAC[]);
3431 (ASM_REAL_ARITH_TAC);
3432 (REWRITE_WITH `((x - a) dot (b - a)) / ((y - a) dot (b - a:real^N)) %
3433 ((y - a):real^N - ((y - a) dot (b - a)) / ((b - a) dot (b - a)) %
3435 &1 / ((y - a) dot (b - a)) %
3436 ((x - a) dot (b - a)) % (((y - a) - ((y - a) dot (b - a)) / ((b - a) dot
3437 (b - a)) % (b - a)))`);
3439 (MATCH_MP_TAC Trigonometry2.VECTOR_MUL_R_TO_L);
3442 (ABBREV_TAC `m = (y - a) dot (b - a:real^N)`);
3443 (ABBREV_TAC `n = (x - a) dot (b - a:real^N)`);
3444 (ABBREV_TAC `p = (b - a) dot (b - a:real^N)`);
3445 (REWRITE_TAC[VECTOR_ARITH
3446 `m % (x - n / p % (b - a)) = n % (y - m / p % (b - a)) <=> m % x = n % y`]);
3447 (EXPAND_TAC "m" THEN EXPAND_TAC "n");
3448 (REWRITE_TAC[ASSUME `x - a = v % (y - a:real^N)`; VECTOR_MUL_ASSOC]);
3449 (AP_THM_TAC THEN AP_TERM_TAC);
3450 (VECTOR_ARITH_TAC)]);;
3452 (* ======================================================================= *)
3454 let NORM_PROJECTION_LE = prove_by_refinement(
3455 `!x y a:real^N b. between x (a, y) /\ ~(a = b)
3456 ==> norm (projection (b - a) (x - a)) <= norm (projection (b - a) (y - a))`,
3457 [(REPEAT GEN_TAC THEN DISCH_TAC);
3459 `(?k. k <= &1 /\ &0 <= k /\
3460 projection (b - a) (x - a:real^N) = k % projection (b - a) (y - a))`
3462 (ASM_SIMP_TAC[PARALLEL_PROJECTION]);
3463 (ASM_REWRITE_TAC[NORM_MUL]);
3464 (REWRITE_WITH `abs k = k`);
3465 (ASM_SIMP_TAC[REAL_ABS_REFL]);
3466 (REWRITE_TAC[REAL_ARITH `a * b <= b <=> &0 <= (&1 - a) * b`]);
3467 (MATCH_MP_TAC REAL_LE_MUL);
3469 (ASM_REAL_ARITH_TAC);
3470 (REWRITE_TAC[NORM_POS_LE])]);;
3472 (* ======================================================================= *)
3474 let OMEGA_LIST_TRUNCATE_1_NEW1 = prove_by_refinement (
3475 `!V u0:real^3 u1 u2 u3.
3476 omega_list_n V [u0;u1;u2] 1 = omega_list V [u0;u1] `,
3478 (REWRITE_TAC[OMEGA_LIST]);
3479 (REWRITE_WITH `LENGTH [u0:real^3;u1] - 1 = 1`);
3480 (REWRITE_TAC[LENGTH; ARITH_RULE `SUC (SUC 0) - 1 = 1`]);
3481 (REWRITE_TAC[ARITH_RULE `1 = SUC 0`; OMEGA_LIST_N]);
3482 (REWRITE_TAC[ARITH_RULE `SUC 0 = 1`;TRUNCATE_SIMPLEX_EXPLICIT_1;HD])]);;
3484 let OMEGA_LIST_TRUNCATE_1_NEW2 = prove_by_refinement (
3485 `!V u0:real^3 u1 u2 u3.
3486 omega_list_n V [u0;u1] 1 = omega_list V [u0;u1] `,
3488 (REWRITE_TAC[OMEGA_LIST]);
3489 (REWRITE_WITH `LENGTH [u0:real^3;u1] - 1 = 1`);
3490 (REWRITE_TAC[LENGTH; ARITH_RULE `SUC (SUC 0) - 1 = 1`])]);;
3492 let OMEGA_LIST_TRUNCATE_2_NEW1 = prove_by_refinement (
3493 `!V u0:real^3 u1 u2 u3.
3494 omega_list_n V [u0;u1;u2:real^3] 2 = omega_list V [u0;u1;u2]`,
3496 (REWRITE_TAC[OMEGA_LIST]);
3497 (REWRITE_WITH `LENGTH [u0:real^3;u1;u2] - 1 = 2`);
3498 (REWRITE_TAC[LENGTH; ARITH_RULE `SUC (SUC (SUC 0)) - 1 = 2`])]);;
3500 (* ======================================================================= *)
3502 let IN_AFFINE_KY_LEMMA1 = prove_by_refinement (
3503 `!x s. x IN s ==> x IN affine hull s`,
3504 [(REPEAT STRIP_TAC);
3505 (REWRITE_TAC[affine;hull;IN_INTERS]);
3506 (REWRITE_TAC[IN;IN_ELIM_THM]);
3508 (UP_ASM_TAC THEN SWITCH_TAC THEN UP_ASM_TAC THEN SET_TAC[])]);;
3510 (* ======================================================================= *)
3512 let AFFINE_SUBSET_KY_LEMMA = prove_by_refinement (
3513 `!S B:real^N ->bool. S SUBSET B ==> affine hull S SUBSET affine hull B`,
3514 [(REWRITE_TAC[SUBSET;AFFINE_HULL_EXPLICIT; IN;IN_ELIM_THM] THEN
3516 (EXISTS_TAC `s:real^N->bool`);
3517 (EXISTS_TAC `u:real^N->real`);
3518 (ASM_REWRITE_TAC[]);
3519 (ASM_MESON_TAC[])]);;
3521 (* ======================================================================= *)
3523 let TRANSLATE_AFFINE_KY_LEMMA1 = prove_by_refinement(
3524 `!a:real^3 b c x y z k.
3525 a IN affine hull {x,y,z} /\
3526 b IN affine hull {x,y,z} /\
3527 c IN affine hull {x,y,z}
3528 ==> a + k % (b - c) IN affine hull {x,y,z}`,
3529 [(REWRITE_TAC[AFFINE_HULL_3;IN;IN_ELIM_THM] THEN REPEAT STRIP_TAC);
3530 (EXISTS_TAC `u + k * (u' - u'')`);
3531 (EXISTS_TAC `v + k * (v' - v'')`);
3532 (EXISTS_TAC `w + k * (w' - w'')`);
3535 `(u + k * (u' - u'')) + (v + k * (v' - v'')) + w + k * (w' - w'') =
3536 (u + v + w) + k * (u' + v' + w') - k * (u'' + v'' + w'')`);
3538 (ASM_REWRITE_TAC[REAL_SUB_REFL;REAL_ADD_RID]);
3539 (ASM_REWRITE_TAC[]);
3540 (VECTOR_ARITH_TAC)]);;
3542 (* ======================================================================= *)
3544 let IN_AFFINE_HULL_KY_LEMMA3 = prove_by_refinement (
3545 `!x:real^3 y z p a r.
3546 p + a IN affine hull {x,y,z} /\
3547 p + r % a IN affine hull {x,y,z} /\
3549 ==> p IN affine hull {x,y,z}`,
3550 [(REWRITE_TAC[AFFINE_HULL_3;IN;IN_ELIM_THM] THEN REPEAT STRIP_TAC);
3551 (EXISTS_TAC `u + (u' - u) / (&1 - r)`);
3552 (EXISTS_TAC `v + (v' - v) / (&1 - r)`);
3553 (EXISTS_TAC `w + (w' - w) / (&1 - r)`);
3555 (REWRITE_TAC [REAL_ARITH
3556 `(u + (u' - u) / (&1 - r)) + (v + (v' - v) / (&1 - r)) +
3557 w + (w' - w) / (&1 - r)
3558 = (u + v + w) + ((u' + v' + w') - (u + v + w))/ (&1 - r)`]);
3559 (ASM_REWRITE_TAC[]);
3562 `(u + (u' - u) / (&1 - r)) % (x:real^3) +
3563 (v + (v' - v) / (&1 - r)) % y +
3564 (w + (w' - w) / (&1 - r)) % z =
3565 (p + a) - (&1/(&1 - r)) % ((p + a) - (p + r % a))`);
3566 (ASM_REWRITE_TAC[]);
3568 (REWRITE_TAC[VECTOR_ARITH
3569 `p = (p + a) - &1 / (&1 - r) % ((p + a) - (p + r % a))
3570 <=> ((&1 - r) / (&1 - r) - &1) % a = vec 0`]);
3571 (REWRITE_WITH `(&1 - r) / (&1 - r) = &1`);
3573 (MATCH_MP_TAC REAL_DIV_REFL);
3574 (ASM_REAL_ARITH_TAC);
3575 (REWRITE_TAC[REAL_SUB_REFL;VECTOR_MUL_LZERO])]);;
3577 let IN_AFFINE_HULL_KY_LEMMA3_alt = prove_by_refinement (
3578 `!x:real^3 y z p a r.
3579 p - a IN affine hull {x, y, z} /\
3580 p - r % a IN affine hull {x, y, z} /\
3582 ==> p IN affine hull {x, y, z}`,
3583 [(REWRITE_TAC[VECTOR_ARITH `p - a:real^3 = p + (-- a)`;
3584 VECTOR_ARITH `--(r % a) = r % (-- a)`]);
3585 (REWRITE_TAC[IN_AFFINE_HULL_KY_LEMMA3])]);;
3587 (* ======================================================================= *)
3589 let IN_AFFINE_HULL_3_KY_LEMMA2 = prove_by_refinement (
3590 `!X Y Z a b c. X IN affine hull {a,b,c} /\
3591 Y IN affine hull {a,b,c} /\
3593 ==> Z IN affine hull {a,b,c:real^3}`,
3594 [(REWRITE_TAC[BETWEEN_IN_CONVEX_HULL;CONVEX_HULL_2;
3595 AFFINE_HULL_3;IN;IN_ELIM_THM] THEN REPEAT STRIP_TAC);
3596 (EXISTS_TAC `u'' * u + v'' * u'`);
3597 (EXISTS_TAC `u'' * v + v'' * v'`);
3598 (EXISTS_TAC `u'' * w + v'' * w'`);
3600 (REWRITE_TAC[REAL_ARITH
3601 `(a * x + b * x') + (a * y + b * y') + (a * z + b * z') =
3602 a * (x + y + z) + b * (x' + y' + z')`]);
3603 (ASM_REWRITE_TAC[]);
3604 (ASM_REAL_ARITH_TAC);
3605 (ASM_REWRITE_TAC[]);
3606 (VECTOR_ARITH_TAC)]);;
3608 (* ======================================================================= *)
3610 let SUM_CLAUSES_alt = prove (`(!x f s.
3612 ==> sum (x INSERT s) f =
3613 (if x IN s then sum s f else f x + sum s f))`, REWRITE_TAC[SUM_CLAUSES]);;
3615 let SUM_DIS4 = prove_by_refinement (
3616 `!x:A y z t f. CARD {x,y, z, t} = 4
3617 ==> sum {x,y,z,t} f = f x + f y + f z + f t`,
3618 [(REPEAT STRIP_TAC);
3619 (REWRITE_WITH `sum {x,y, z, t} f =
3620 (if x IN {y, z, t:A} then sum {y, z, t} f
3621 else f x + sum {y, z, t} f)`);
3622 (MATCH_MP_TAC SUM_CLAUSES_alt);
3623 (REWRITE_TAC[Geomdetail.FINITE6]);(COND_CASES_TAC);(NEW_GOAL `F`);
3624 (UP_ASM_TAC THEN REWRITE_TAC
3625 [SET_RULE `x IN {a,b,c} <=> x = a \/ x = b \/ x = c`]);
3627 (SWITCH_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC
3628 [SET_RULE `{y,y,z,t} = {y,z,t}`] THEN STRIP_TAC);
3629 (NEW_GOAL `CARD {y, z, t:A} <= 3`);
3630 (REWRITE_TAC[Geomdetail.CARD3]);
3632 (SWITCH_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC
3633 [SET_RULE `{z,y,z,t} = {y,z,t}`] THEN STRIP_TAC);
3634 (NEW_GOAL `CARD {y, z, t:A} <= 3`);
3635 (REWRITE_TAC[Geomdetail.CARD3]);
3637 (SWITCH_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC
3638 [SET_RULE `{t,y,z,t} = {y,z,t}`] THEN STRIP_TAC);
3639 (NEW_GOAL `CARD {y, z, t:A} <= 3`);
3640 (REWRITE_TAC[Geomdetail.CARD3]);
3643 (REWRITE_WITH `sum {y, z, t} f =
3644 (if y IN {z, t:A} then sum {z, t} f
3645 else f y + sum {z, t} f)`);
3646 (MATCH_MP_TAC SUM_CLAUSES_alt);
3647 (REWRITE_TAC[Geomdetail.FINITE6]);
3651 (UP_ASM_TAC THEN REWRITE_TAC[SET_RULE `x IN {a,b} <=> x = a \/ x = b`]);
3653 (SWITCH_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[SET_RULE `{x,z,z,t} = {x,z,t}`] THEN STRIP_TAC);
3654 (NEW_GOAL `CARD {x, z, t:A} <= 3`);
3655 (REWRITE_TAC[Geomdetail.CARD3]);
3657 (SWITCH_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[SET_RULE `{x,t,z,t} = {x,z,t}`] THEN STRIP_TAC);
3658 (NEW_GOAL `CARD {x, z, t:A} <= 3`);
3659 (REWRITE_TAC[Geomdetail.CARD3]);
3663 (REWRITE_WITH `sum {z, t:A} f = f z + f t`);
3664 (MATCH_MP_TAC Collect_geom.SUM_DIS2 THEN STRIP_TAC);
3665 (SWITCH_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[SET_RULE `{x,y,t,t} = {x,y,t}`] THEN STRIP_TAC);
3666 (NEW_GOAL `CARD {x, y, t:A} <= 3`);
3667 (REWRITE_TAC[Geomdetail.CARD3]);
3670 (* ======================================================================= *)
3672 let CARD4_IMP_DISTINCT = prove (
3673 `!a b c d. CARD {a, b, c, d} = 4 ==> ~(a = b)`,
3674 (REPEAT STRIP_TAC THEN SWITCH_TAC THEN UP_ASM_TAC THEN
3675 ASM_REWRITE_TAC[SET_RULE `{a,a,c,d} = {a,c,d}`] THEN STRIP_TAC) THEN
3676 (ASM_MESON_TAC[Geomdetail.CARD3; ARITH_RULE `~(4 <= 3)`]));;
3678 (* ======================================================================= *)
3680 let VSUM_CLAUSES_alt = prove (`(!x f s.
3682 ==> vsum (x INSERT s) f =
3683 (if x IN s then vsum s f else f x + vsum s f))`, REWRITE_TAC[VSUM_CLAUSES]);;
3684 let VSUM_DIS4 = prove_by_refinement (
3685 `!x:A y z t (f:A->real^N). CARD {x,y, z, t} = 4
3686 ==> vsum {x,y,z,t} f = f x + f y + f z + f t`,
3687 [(REPEAT STRIP_TAC);
3688 (REWRITE_WITH `vsum {x,y, z, t} (f:A->real^N) =
3689 (if x IN {y, z, t:A} then vsum {y, z, t} f
3690 else f x + vsum {y, z, t} f)`);
3691 (MATCH_MP_TAC VSUM_CLAUSES_alt);
3692 (REWRITE_TAC[Geomdetail.FINITE6]);(COND_CASES_TAC);(NEW_GOAL `F`);
3693 (UP_ASM_TAC THEN REWRITE_TAC
3694 [SET_RULE `x IN {a,b,c} <=> x = a \/ x = b \/ x = c`]);
3696 (SWITCH_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC
3697 [SET_RULE `{y,y,z,t} = {y,z,t}`] THEN STRIP_TAC);
3698 (NEW_GOAL `CARD {y, z, t:A} <= 3`);
3699 (REWRITE_TAC[Geomdetail.CARD3]);
3701 (SWITCH_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC
3702 [SET_RULE `{z,y,z,t} = {y,z,t}`] THEN STRIP_TAC);
3703 (NEW_GOAL `CARD {y, z, t:A} <= 3`);
3704 (REWRITE_TAC[Geomdetail.CARD3]);
3706 (SWITCH_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC
3707 [SET_RULE `{t,y,z,t} = {y,z,t}`] THEN STRIP_TAC);
3708 (NEW_GOAL `CARD {y, z, t:A} <= 3`);
3709 (REWRITE_TAC[Geomdetail.CARD3]);
3712 (REWRITE_WITH `vsum {y, z, t} (f:A->real^N) =
3713 (if y IN {z, t:A} then vsum {z, t} f
3714 else f y + vsum {z, t} f)`);
3715 (MATCH_MP_TAC VSUM_CLAUSES_alt);
3716 (REWRITE_TAC[Geomdetail.FINITE6]);
3720 (UP_ASM_TAC THEN REWRITE_TAC[SET_RULE `x IN {a,b} <=> x = a \/ x = b`]);
3722 (SWITCH_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[SET_RULE `{x,z,z,t} = {x,z,t}`] THEN STRIP_TAC);
3723 (NEW_GOAL `CARD {x, z, t:A} <= 3`);
3724 (REWRITE_TAC[Geomdetail.CARD3]);
3726 (SWITCH_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[SET_RULE `{x,t,z,t} = {x,z,t}`] THEN STRIP_TAC);
3727 (NEW_GOAL `CARD {x, z, t:A} <= 3`);
3728 (REWRITE_TAC[Geomdetail.CARD3]);
3732 (REWRITE_WITH `vsum {z, t:A} (f:A->real^N) = f z + f t`);
3733 (MATCH_MP_TAC Collect_geom.VSUM_DIS2 THEN STRIP_TAC);
3734 (SWITCH_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[SET_RULE `{x,y,t,t} = {x,y,t}`] THEN STRIP_TAC);
3735 (NEW_GOAL `CARD {x, y, t:A} <= 3`);
3736 (REWRITE_TAC[Geomdetail.CARD3]);
3739 (* ======================================================================= *)
3741 let AFFINE_DEPENDENT_KY_LEMMA1 = prove_by_refinement (
3742 `!a:real^3 b c d p:real^3 k1 k2 k3 k4.
3743 ~(affine_dependent {a,b,c,d}) /\
3744 CARD {a,b,c,d} = 4 /\
3745 p IN convex hull {a,b,c,d} /\
3746 k1 + k2 + k3 + k4 = &1 /\
3747 p = k1 % a + k2 % b + k3 % c + k4 % d /\
3748 k1 <= &0 ==> k1 = &0`,
3750 (REWRITE_TAC[CONVEX_HULL_4; IN;IN_ELIM_THM]);
3752 (ASM_CASES_TAC `k1 = &0`);
3753 (ASM_REWRITE_TAC[]);
3755 (NEW_GOAL `affine_dependent {a,b,c,d:real^3}`);
3756 (REWRITE_TAC[AFFINE_DEPENDENT_EXPLICIT]);
3757 (EXISTS_TAC `{a,b,c,d:real^3}`);
3758 (ABBREV_TAC `f = (\x:real^3. if x = a then u - k1 else
3759 if x = b then v - k2 else
3760 if x = c then w - k3 else
3761 if x = d then z - k4 else &0)`);
3762 (EXISTS_TAC `f:real^3->real`);
3764 (NEW_GOAL `f (a:real^3) = u - k1`);
3772 (NEW_GOAL `f (b:real^3) = v - k2`);
3775 (NEW_GOAL `F` THEN UP_ASM_TAC THEN REWRITE_TAC[]);
3776 (MATCH_MP_TAC CARD4_IMP_DISTINCT);
3777 (EXISTS_TAC `c:real^3` THEN EXISTS_TAC `d:real^3`);
3778 (ASM_REWRITE_TAC[SET_RULE `{a,b,c,d} = {b,a,c,d}`]);
3785 (NEW_GOAL `f (c:real^3) = w - k3`);
3788 (NEW_GOAL `F` THEN UP_ASM_TAC THEN REWRITE_TAC[]);
3789 (MATCH_MP_TAC CARD4_IMP_DISTINCT);
3790 (EXISTS_TAC `b:real^3` THEN EXISTS_TAC `d:real^3`);
3791 (ASM_REWRITE_TAC[SET_RULE `{c,a,b,d} = {a,b,c,d}`]);
3793 (NEW_GOAL `F` THEN UP_ASM_TAC THEN REWRITE_TAC[]);
3794 (MATCH_MP_TAC CARD4_IMP_DISTINCT);
3795 (EXISTS_TAC `a:real^3` THEN EXISTS_TAC `d:real^3`);
3796 (ASM_REWRITE_TAC[SET_RULE `{c,b,a,d} = {a,b,c,d}`]);
3803 (NEW_GOAL `f (d:real^3) = z - k4`);
3806 (NEW_GOAL `F` THEN UP_ASM_TAC THEN REWRITE_TAC[]);
3807 (MATCH_MP_TAC CARD4_IMP_DISTINCT);
3808 (EXISTS_TAC `c:real^3` THEN EXISTS_TAC `b:real^3`);
3809 (ASM_REWRITE_TAC[SET_RULE `{d,a,c, b} = {a,b,c,d}`]);
3811 (NEW_GOAL `F` THEN UP_ASM_TAC THEN REWRITE_TAC[]);
3812 (MATCH_MP_TAC CARD4_IMP_DISTINCT);
3813 (EXISTS_TAC `a:real^3` THEN EXISTS_TAC `c:real^3`);
3814 (ASM_REWRITE_TAC[SET_RULE `{d,b,a,c} = {a,b,c,d}`]);
3816 (NEW_GOAL `F` THEN UP_ASM_TAC THEN REWRITE_TAC[]);
3817 (MATCH_MP_TAC CARD4_IMP_DISTINCT);
3818 (EXISTS_TAC `a:real^3` THEN EXISTS_TAC `b:real^3`);
3819 (ASM_REWRITE_TAC[SET_RULE `{d,c,a,b} = {a,b,c,d}`]);
3827 (REWRITE_TAC[Geomdetail.FINITE6]);
3830 (REWRITE_WITH `sum {a, b, c, d:real^3} f = f a + f b + f c + f d`);
3831 (MATCH_MP_TAC SUM_DIS4);
3832 (ASM_REWRITE_TAC[]);
3833 (ASM_REWRITE_TAC[]);
3834 (REWRITE_TAC[REAL_ARITH
3835 `a - x + b - y + c - z + d - t = (a + b + c + d) - (x + y + z + t)`]);
3836 (ASM_REWRITE_TAC[REAL_SUB_REFL]);
3837 (EXISTS_TAC `a:real^3`);
3840 (ASM_REWRITE_TAC[]);
3841 (ASM_REAL_ARITH_TAC);
3843 (REWRITE_WITH `vsum {a, b, c, d:real^3} (\v. f v % v) =
3844 (\v. f v % v) a + (\v. f v % v) b + (\v. f v % v) c + (\v. f v % v) d`);
3845 (MATCH_MP_TAC VSUM_DIS4);
3846 (ASM_REWRITE_TAC[]);
3847 (ASM_REWRITE_TAC[]);
3848 (REWRITE_TAC[VECTOR_ARITH `
3849 (u - k1) % a + (v - k2) % b + (w - k3) % c + (z - k4) % d =
3850 (u % a + v % b + w % c + z % d) - (k1 % a + k2 % b + k3 % c + k4 % d)`]);
3851 (ASM_MESON_TAC[VECTOR_ARITH `a:real^N - a = vec 0`]);
3853 (ASM_MESON_TAC[])]);;
3855 (* ======================================================================= *)
3857 let IN_2_2_IMP_CONVEX_HULL_4 = prove (
3858 `!a:real^N b x y m n p.
3859 between p (m,n) /\ between m (a,b) /\ between n (x,y)
3860 ==> p IN convex hull {a, b, x, y}`,
3861 (REWRITE_TAC[BETWEEN_IN_CONVEX_HULL;CONVEX_HULL_2;CONVEX_HULL_4;
3862 IN;IN_ELIM_THM] THEN REPEAT STRIP_TAC) THEN
3863 (ASM_REWRITE_TAC[]) THEN
3864 (EXISTS_TAC `u * u'` THEN EXISTS_TAC `u * v'`) THEN
3865 (EXISTS_TAC `v * u''` THEN EXISTS_TAC `v * v''`) THEN
3866 (ASM_SIMP_TAC[REAL_LE_MUL; REAL_ARITH `a * x + a * y + b * z + b * t =
3867 a * (x + y) + b * (z + t)`; REAL_MUL_RID]) THEN
3868 (VECTOR_ARITH_TAC));;
3870 (* ======================================================================= *)
3872 let BETWEEN_TRANS_3_CASES = prove_by_refinement (
3873 `!a b x y:real^3. between x (a,b) /\ between y (a,b) ==>
3874 between x (a, y) \/ between x (y, b) `,
3875 [(REPEAT STRIP_TAC);
3876 (ASM_CASES_TAC `(a = b:real^3)`);
3877 (UNDISCH_TAC `between x (a,b:real^3)`);
3878 (UNDISCH_TAC `between y (a,b:real^3)`);
3879 (ASM_REWRITE_TAC[BETWEEN_REFL_EQ]);
3880 (REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[BETWEEN_REFL_EQ]);
3882 (ASM_CASES_TAC `between x (a,y:real^3)`);
3885 (ONCE_REWRITE_TAC[BETWEEN_SYM]);
3886 (MATCH_MP_TAC BETWEEN_TRANS_2);
3887 (EXISTS_TAC `a:real^3` THEN ASM_REWRITE_TAC[]);
3888 (NEW_GOAL `collinear {a,y,x:real^3}`);
3889 (ONCE_REWRITE_TAC[SET_RULE `{a,y,x} = {x, a ,y}`]);
3890 (MATCH_MP_TAC COLLINEAR_3_TRANS);
3891 (EXISTS_TAC `b:real^3`);
3893 (ONCE_REWRITE_TAC[SET_RULE `{x,a, b} = {a, x, b}`]);
3894 (MATCH_MP_TAC BETWEEN_IMP_COLLINEAR);
3895 (ASM_REWRITE_TAC[]);
3896 (ONCE_REWRITE_TAC[SET_RULE `{a, b,y} = {a, y, b}`]);
3897 (MATCH_MP_TAC BETWEEN_IMP_COLLINEAR);
3898 (ASM_REWRITE_TAC[]);
3900 (UP_ASM_TAC THEN REWRITE_TAC[COLLINEAR_BETWEEN_CASES]);
3902 (ASM_CASES_TAC `between y (x,a:real^3)`);
3903 (STRIP_TAC THEN ASM_REWRITE_TAC[]);
3904 (ONCE_REWRITE_TAC[MESON[] `(A\/B\/C ==> B) <=> (C\/A ==> B)`]);
3909 (ASM_CASES_TAC `x = y:real^3`);
3910 (REWRITE_TAC[ASSUME `x = y:real^3`; BETWEEN_REFL]);
3913 (UNDISCH_TAC `between x (a,b:real^3)` THEN
3914 UNDISCH_TAC `between y (a,b:real^3)` THEN
3915 UNDISCH_TAC `between a (y,x:real^3)`);
3916 (REWRITE_TAC[BETWEEN_IN_CONVEX_HULL;CONVEX_HULL_2;IN;IN_ELIM_THM]);
3919 (MP_TAC (ASSUME `a = u % y + v % x:real^3`));
3920 (REWRITE_TAC[ASSUME `y = u' % a + v' % b:real^3`;
3921 ASSUME `x = u'' % a + v'' % b:real^3`]);
3923 (REWRITE_WITH `v' = &1 - u' /\ v = &1 - u /\ v'' = &1 - u''`);
3924 (ASM_REAL_ARITH_TAC);
3925 (REWRITE_TAC [VECTOR_ARITH `
3926 a = u % (u' % a + (&1 - u') % b) + (&1 - u) % (u'' % a + (&1 - u'') % b)
3927 <=> (&1 - u * u' - (&1 - u) * u'') % (a - b) = vec 0`]);
3928 (REWRITE_TAC[VECTOR_MUL_EQ_0]);
3929 (ASM_REWRITE_TAC[VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
3930 (REWRITE_TAC[REAL_ARITH
3931 `&1 - u * u' - (&1 - u) * u'' = u * (&1 - u') + (&1 - u) * (&1 - u'')`]);
3932 (NEW_GOAL `&0 <= u * (&1 - u')`);
3933 (MATCH_MP_TAC REAL_LE_MUL);
3934 (ASM_REAL_ARITH_TAC);
3935 (NEW_GOAL `&0 <= (&1 - u) * (&1 - u'')`);
3936 (MATCH_MP_TAC REAL_LE_MUL);
3937 (ASM_REAL_ARITH_TAC);
3939 (NEW_GOAL `u * (&1 - u') = &0 /\ (&1 - u) * (&1 - u'') = &0`);
3940 (ASM_REAL_ARITH_TAC);
3941 (UP_ASM_TAC THEN REWRITE_TAC[REAL_ENTIRE]);
3943 (ASM_REAL_ARITH_TAC);
3945 (UNDISCH_TAC `~between x (a,y:real^3)`);
3946 (REWRITE_TAC[ASSUME `x = u'' % a + v'' % b:real^3`]);
3947 (REWRITE_WITH `u'' = &1 /\ v'' = &0`);
3948 (ASM_REAL_ARITH_TAC);
3949 (REWRITE_TAC[VECTOR_MUL_LID; VECTOR_MUL_LZERO;VECTOR_ADD_RID; BETWEEN_REFL]);
3951 (UNDISCH_TAC `~between y (x,a:real^3)`);
3952 (REWRITE_TAC[ASSUME `y = u' % a + v' % b:real^3`]);
3953 (REWRITE_WITH `u' = &1 /\ v' = &0`);
3954 (ASM_REAL_ARITH_TAC);
3955 (REWRITE_TAC[VECTOR_MUL_LID; VECTOR_MUL_LZERO;VECTOR_ADD_RID; BETWEEN_REFL]);
3957 (UNDISCH_TAC `~between y (x,a:real^3)`);
3958 (REWRITE_TAC[ASSUME `y = u' % a + v' % b:real^3`]);
3959 (REWRITE_WITH `u' = &1 /\ v' = &0`);
3960 (ASM_REAL_ARITH_TAC);
3961 (REWRITE_TAC[VECTOR_MUL_LID; VECTOR_MUL_LZERO;VECTOR_ADD_RID; BETWEEN_REFL]);
3962 (ASM_MESON_TAC[])]);;
3964 (* ======================================================================= *)
3967 let OMEGA_LIST_UP_TO_2 = prove_by_refinement (
3968 `! V ul. {omega_list_n V ul i | i <= 2} =
3969 {omega_list_n V ul 0, omega_list_n V ul 1, omega_list_n V ul 2}`,
3971 (REWRITE_WITH `{omega_list_n V ul i | i <= 2} =
3972 IMAGE (omega_list_n V ul) {i| i <= 2}`);
3973 (REWRITE_TAC[IMAGE] THEN SET_TAC[]);
3975 {omega_list_n V ul 0, omega_list_n V ul 1, omega_list_n V ul 2}
3976 = IMAGE (omega_list_n V ul) {0,1,2}`);
3977 (REWRITE_TAC[IMAGE] THEN SET_TAC[]);
3979 (REWRITE_TAC[SET_OF_0_TO_2])]);;
3981 (* ======================================================================= *)
3983 let CONVEX_HULL_KY_LEMMA_5 = prove_by_refinement (
3984 `!a:real^3 b c d x y d p.
3985 ~(affine_dependent {a,b,c,d}) /\ CARD {a,b,c,d} = 4 /\ ~(d = x) /\
3986 x IN convex hull {a,b,c} /\ between d (x,y) /\
3987 ~( p IN affine hull {a,b,d}) /\
3988 p IN convex hull {a,b,c,d} INTER convex hull {a,b,x,y} ==>
3989 p IN convex hull {a,b,x,d}`,
3990 [(REPEAT STRIP_TAC);
3991 (NEW_GOAL `p IN convex hull {a, b, x, y:real^3}`);
3992 (ASM_SET_TAC[IN_INTER]);
3993 (SUBGOAL_THEN `?m n:real^3.
3994 between p (m,n) /\ between m (a,b) /\ between n (x,y)` CHOOSE_TAC);
3995 (ASM_SIMP_TAC[CONVEX_HULL_4_IMP_2_2]);
3996 (UP_ASM_TAC THEN REPEAT STRIP_TAC);
3998 (ASM_CASES_TAC `between n (x, d:real^3)`);
3999 (MATCH_MP_TAC IN_2_2_IMP_CONVEX_HULL_4);
4000 (EXISTS_TAC `m:real^3` THEN EXISTS_TAC `n:real^3`);
4001 (ASM_REWRITE_TAC[]);
4003 (NEW_GOAL `between n (x,d) \/ between n (d, y:real^3)`);
4004 (MATCH_MP_TAC BETWEEN_TRANS_3_CASES);
4005 (ASM_REWRITE_TAC[]);
4006 (NEW_GOAL `between n (d,y:real^3)`);
4009 (NEW_GOAL `?k1 k2. n = k1 % d + k2 % x:real^3 /\ k1 + k2 = &1 /\ k2 <= &0`);
4010 (UP_ASM_TAC THEN UNDISCH_TAC `between d (x,y:real^3)`);
4011 (REWRITE_TAC[BETWEEN_IN_CONVEX_HULL;IN;IN_ELIM_THM;CONVEX_HULL_2]);
4013 (ASM_REWRITE_TAC[]);
4014 (EXISTS_TAC `u' + (v'/ v)`);
4015 (EXISTS_TAC `-- ((u * v')/ v)`);
4018 (REWRITE_TAC[VECTOR_ARITH
4019 `u' % (u % x + v % y) + v' % y =
4020 (u' + v' / v) % (u % x + v % y) + --((u * v') / v) % x
4021 <=> ((v /v - &1) * v') % y = vec 0`]);
4022 (REWRITE_WITH `v / v = &1`);
4023 (MATCH_MP_TAC REAL_DIV_REFL);
4025 (NEW_GOAL `d = x:real^3`);
4026 (REWRITE_TAC[ASSUME `d = u % x + v % y:real^3`]);
4027 (REWRITE_WITH `v = &0 /\ u = &1`);
4028 (ASM_REAL_ARITH_TAC);
4033 (REWRITE_TAC[REAL_ARITH `(u' + v' / v) + --((u * v') / v) =
4034 u' + v' * ((&1 - u) / v)`]);
4035 (REWRITE_WITH `(&1 - u) / v = &1`);
4036 (REWRITE_WITH `&1 - u = v`);
4037 (ASM_REAL_ARITH_TAC);
4038 (MATCH_MP_TAC REAL_DIV_REFL);
4040 (NEW_GOAL `d = x:real^3`);
4041 (REWRITE_TAC[ASSUME `d = u % x + v % y:real^3`]);
4042 (REWRITE_WITH `v = &0 /\ u = &1`);
4043 (ASM_REAL_ARITH_TAC);
4046 (ASM_REAL_ARITH_TAC);
4047 (REWRITE_TAC[REAL_ARITH `-- a <= &0 <=> &0 <= a`]);
4048 (MATCH_MP_TAC REAL_LE_DIV);
4049 (ASM_SIMP_TAC[REAL_LE_MUL]);
4050 (FIRST_X_ASSUM CHOOSE_TAC THEN FIRST_X_ASSUM CHOOSE_TAC);
4052 (UNDISCH_TAC `between p (m,n:real^3)`);
4053 (UNDISCH_TAC `between m (a,b:real^3)`);
4054 (UNDISCH_TAC `x IN convex hull {a,b,c:real^3}`);
4055 (REWRITE_TAC[BETWEEN_IN_CONVEX_HULL;CONVEX_HULL_2;
4056 CONVEX_HULL_3;IN;IN_ELIM_THM]);
4059 (UP_ASM_TAC THEN ASM_REWRITE_TAC[VECTOR_ADD_LDISTRIB;VECTOR_MUL_ASSOC]);
4060 (REWRITE_TAC[VECTOR_ARITH
4061 `(x % a + y % b) + z % d + x' % a + y' % b + z' % c =
4062 z' % c + (x + x') % a + (y + y') % b + z % d`]);
4066 (NEW_GOAL `v'' * k2 * w = &0`);
4067 (MATCH_MP_TAC AFFINE_DEPENDENT_KY_LEMMA1);
4068 (EXISTS_TAC `c:real^3` THEN EXISTS_TAC `a:real^3`);
4069 (EXISTS_TAC `b:real^3` THEN EXISTS_TAC `d:real^3`);
4070 (EXISTS_TAC `p:real^3`);
4071 (EXISTS_TAC `u'' * u' + v'' * k2 * u` THEN
4072 EXISTS_TAC `u'' * v' + v'' * k2 * v` THEN
4073 EXISTS_TAC `v'' * k1`);
4075 (ONCE_REWRITE_TAC[SET_RULE `{c,a,b,d} = {a,b,c,d}`]);
4076 (ASM_REWRITE_TAC[]);
4078 (ONCE_REWRITE_TAC[SET_RULE `{c,a,b,d} = {a,b,c,d}`]);
4079 (ASM_REWRITE_TAC[]);
4080 (ONCE_REWRITE_TAC[SET_RULE `{c,a,b,d} = {a,b,c,d}`]);
4081 (ASM_SET_TAC[IN_INTER]);
4082 (REWRITE_TAC[REAL_ARITH
4083 `v'' * k2 * w + (u'' * u' + v'' * k2 * u) +
4084 (u'' * v' + v'' * k2 * v) + v'' * k1
4085 = u'' * (u' + v') + v'' * (k1 + k2 * (u + v + w))`]);
4086 (ASM_REWRITE_TAC[REAL_MUL_RID]);
4087 (ASM_REWRITE_TAC[]);
4088 (REWRITE_TAC[REAL_ARITH `a * b * c <= &0 <=> &0 <= a * (-- b) * c`]);
4089 (MATCH_MP_TAC REAL_LE_MUL);
4090 (ASM_REWRITE_TAC[]);
4091 (MATCH_MP_TAC REAL_LE_MUL);
4092 (ASM_REWRITE_TAC[]);
4093 (ASM_REAL_ARITH_TAC);
4094 (NEW_GOAL `p IN affine hull {a,b,d:real^3}`);
4095 (REWRITE_TAC[AFFINE_HULL_3;IN;IN_ELIM_THM]);
4096 (EXISTS_TAC `u'' * u' + v'' * k2 * u` THEN
4097 EXISTS_TAC `u'' * v' + v'' * k2 * v` THEN
4098 EXISTS_TAC `v'' * k1`);
4100 (REWRITE_WITH `(u'' * u' + v'' * k2 * u) + (u'' * v' + v'' * k2 * v) +
4101 v'' * k1 = u'' * (u' + v') + v'' * (k1 + k2 * (u + v + w)) - (v'' * k2 * w)`);
4102 (ASM_REAL_ARITH_TAC);
4103 (ASM_REWRITE_TAC[REAL_MUL_RID]);
4104 (ASM_REAL_ARITH_TAC);
4105 (ASM_REWRITE_TAC[]);
4108 (ASM_MESON_TAC[])]);;
4110 (* ======================================================================= *)
4112 let KY_PERMUTES_2_PERMUTES_3 = prove (`!p. p permutes 0..2 ==> p permutes 0..3`,
4113 (GEN_TAC THEN REWRITE_TAC[permutes]) THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
4114 REPEAT STRIP_TAC THEN FIRST_ASSUM MATCH_MP_TAC
4115 THEN UP_ASM_TAC THEN REWRITE_TAC[IN_NUMSEG] THEN ARITH_TAC);;
4117 (* ======================================================================= *)
4120 let TABLE_4 = prove (
4121 `!f. TABLE f 4 = [f 0; f 1; f 2; f 3] /\
4122 TABLE f 3 = [f 0; f 1; f 2] /\
4123 TABLE f 2 = [f 0; f 1] /\
4124 TABLE f 1 = [f 0] /\
4126 REWRITE_TAC[TABLE;REVERSE_TABLE; ARITH_RULE
4127 `4 = SUC 3 /\ 3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; REVERSE; APPEND]);;
4129 (* ======================================================================= *)
4131 let MEM_LEFT_ACTION_LIST_2 = prove_by_refinement (
4133 2 <= LENGTH ul /\ p permutes (0..LENGTH ul - 2)
4134 ==> (MEM x (left_action_list p ul) <=> MEM x ul)`,
4135 [(REPEAT STRIP_TAC);
4136 (ASM_REWRITE_TAC[MEM_EXISTS_EL; Packing3.LENGTH_LEFT_ACTION_LIST]);
4140 (ASM_SIMP_TAC[left_action_list; Packing3.EL_TABLE]);
4142 (ASM_CASES_TAC `i < LENGTH (ul:(A)list) - 1`);
4143 (EXISTS_TAC `inverse (p:num->num) i`);
4145 (ABBREV_TAC `n = LENGTH (ul:(A)list) - 1`);
4146 (MP_TAC (ISPECL [`p:num->num`; `0..n-1`] PERMUTES_INVERSE));
4147 (ASM_REWRITE_TAC[] THEN DISCH_TAC);
4148 (UNDISCH_TAC `p permutes 0..LENGTH (ul:(A)list) - 2`);
4149 (REWRITE_WITH `LENGTH (ul:(A)list) - 2 = n -1`);
4152 (NEW_GOAL `inverse p permutes 0..n - 1`);
4155 (MP_TAC (ISPECL [`inverse (p:num->num)`; `0..n-1`] Hypermap_and_fan.PERMUTES_IMP_INSIDE));
4156 (ASM_REWRITE_TAC[]);
4157 (DISCH_THEN (MP_TAC o SPEC `i:num`));
4158 (ASM_SIMP_TAC[IN_NUMSEG; ARITH_RULE `i < n ==> i <= n - 1`; LE_0]);
4160 (NEW_GOAL `i = LENGTH (ul:(A)list) - 1`);
4162 (EXISTS_TAC `i:num`);
4163 (ASM_REWRITE_TAC[]);
4164 (ABBREV_TAC `n = LENGTH (ul:(A)list)`);
4165 (NEW_GOAL `(inverse p) permutes 0..n-2`);
4166 (ASM_MESON_TAC[PERMUTES_INVERSE]);
4167 (UP_ASM_TAC THEN REWRITE_TAC[permutes]);
4169 (REWRITE_WITH `inverse p (n - 1) = n - 1`);
4170 (FIRST_ASSUM MATCH_MP_TAC);
4171 (REWRITE_TAC[IN_NUMSEG_0]);
4175 (ASM_CASES_TAC `i < LENGTH (ul:(A)list) - 1`);
4176 (EXISTS_TAC `(p:num->num) i`);
4177 (NEW_GOAL `p (i:num) < LENGTH (ul:(A)list)`);
4178 (UNDISCH_TAC `p permutes 0..LENGTH (ul:(A)list) - 2`);
4179 (REWRITE_TAC[permutes]);
4181 (ASM_CASES_TAC `p (i:num) >= LENGTH (ul:(A)list)`);
4182 (NEW_GOAL `p ((p:num->num) (i:num)) = p i`);
4183 (FIRST_ASSUM MATCH_MP_TAC);
4184 (REWRITE_TAC[IN_NUMSEG_0]);
4186 (UNDISCH_TAC `!y. ?!x. (p:num->num) x = y`);
4187 (REWRITE_TAC[EXISTS_UNIQUE]);
4189 (NEW_GOAL `?x. p x = (p:num->num) i /\ (!y'. p y' = p i ==> y' = x)`);
4191 (UP_ASM_TAC THEN STRIP_TAC);
4192 (NEW_GOAL `i = x':num`);
4193 (FIRST_ASSUM MATCH_MP_TAC);
4195 (NEW_GOAL `(p:num->num) i = x':num`);
4196 (FIRST_ASSUM MATCH_MP_TAC);
4198 (NEW_GOAL `i >= LENGTH (ul:(A)list)`);
4204 (ASM_SIMP_TAC[left_action_list; Packing3.EL_TABLE]);
4205 (REWRITE_WITH `inverse (p:num->num) (p i) = i`);
4206 (ASM_MESON_TAC[PERMUTES_INVERSES]);
4208 (NEW_GOAL `i = LENGTH (ul:(A)list) - 1`);
4210 (EXISTS_TAC `i:num`);
4211 (ASM_REWRITE_TAC[]);
4212 (ABBREV_TAC `n = LENGTH (ul:(A)list)`);
4213 (NEW_GOAL `n - 1 < n`);
4215 (ASM_SIMP_TAC[left_action_list; Packing3.EL_TABLE]);
4216 (REWRITE_WITH `inverse (p:num->num) (n - 1) = n - 1`);
4217 (NEW_GOAL `(inverse p) permutes 0..n-2`);
4218 (ASM_MESON_TAC[PERMUTES_INVERSE]);
4219 (UP_ASM_TAC THEN REWRITE_TAC[permutes]);
4221 (FIRST_ASSUM MATCH_MP_TAC);
4222 (REWRITE_TAC[IN_NUMSEG_0]);
4225 (* ======================================================================= *)
4227 let SET_OF_LIST_LEFT_ACTION_LIST_2 = prove(
4228 `!(ul:(A)list) p. 2 <= LENGTH ul /\ p permutes 0..LENGTH ul - 2
4229 ==> set_of_list (left_action_list p ul) = set_of_list ul`,
4230 REPEAT STRIP_TAC THEN REWRITE_TAC[EXTENSION; IN_SET_OF_LIST] THEN
4231 ASM_SIMP_TAC[MEM_LEFT_ACTION_LIST_2]);;
4233 (* ======================================================================= *)
4235 let OMEGA_LIST_2_EXPLICIT_NEW = prove_by_refinement (
4236 `!a:real^3 b c d V ul.
4240 ul = [a; b; c; d] /\
4241 hl [a;b;c] < sqrt (&2)
4242 ==> omega_list_n V ul 2 = circumcenter {a, b, c}`,
4243 [(REPEAT STRIP_TAC);
4244 (REWRITE_WITH `{a,b,c} = set_of_list [a; b; c:real^3]`);
4245 (MESON_TAC[set_of_list]);
4246 (REWRITE_WITH `circumcenter (set_of_list [a; b; c:real^3]) = omega_list V [a:real^3; b; c]`);
4247 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4248 (MATCH_MP_TAC XNHPWAB1);
4250 (MP_TAC (ASSUME `ul IN barV V 3`) THEN REWRITE_TAC[IN;BARV]);
4253 (ASM_REWRITE_TAC[]);
4254 (REWRITE_TAC[LENGTH;ARITH_RULE `SUC (SUC (SUC 0)) = 2 + 1`]);
4255 (NEW_GOAL `initial_sublist vl (ul:(real^3)list)`);
4256 (UNDISCH_TAC `initial_sublist vl [a:real^3; b; c]`);
4257 (REWRITE_TAC[INITIAL_SUBLIST] THEN STRIP_TAC);
4258 (EXISTS_TAC `APPEND yl [d:real^3]`);
4259 (REWRITE_TAC[APPEND_ASSOC; GSYM (ASSUME `[a:real^3; b;c] = APPEND vl yl`)]);
4260 (ASM_REWRITE_TAC[APPEND]);
4263 (ASM_REWRITE_TAC[OMEGA_LIST_TRUNCATE_2])]);;
4264 (* ======================================================================= *)
4266 let INTER_RCONE_GE_IMP_BETWEEN_PROJ_POINT = prove_by_refinement (
4268 ~(a = b) /\ &0 <= r /\ p IN rcone_ge a b r INTER rcone_ge b a r ==>
4269 between (proj_point (b - a) (p - a) + a) (a, b)`,
4270 [(REPEAT STRIP_TAC);
4271 (REWRITE_TAC[between;PRO_EXP] THEN ONCE_REWRITE_TAC[DIST_SYM]);
4272 (REWRITE_TAC[dist; VECTOR_ARITH `(k % x + a) - a = k % x /\
4273 m - (h % (m - n) + n) = (&1 - h) % (m - n)`]);
4274 (ABBREV_TAC `h = ((p - a) dot (b - a)) / ((b - a) dot (b - a:real^3))`);
4275 (REWRITE_TAC[NORM_MUL]);
4276 (REWRITE_WITH `abs h = h /\ abs (&1 - h) = &1 - h`);
4277 (REWRITE_TAC[REAL_ABS_REFL]);
4279 (EXPAND_TAC "h" THEN MATCH_MP_TAC REAL_LE_DIV);
4280 (REWRITE_TAC[GSYM NORM_POW_2; REAL_LE_POW_2]);
4281 (SUBGOAL_THEN `p IN rcone_ge a (b:real^3) r` MP_TAC);
4283 (REWRITE_TAC[rcone_ge;rconesgn;IN;IN_ELIM_THM]);
4285 (NEW_GOAL `&0 <= dist (p,a) * dist (b,a:real^3) * r`);
4286 (ASM_SIMP_TAC[REAL_LE_MUL;DIST_POS_LE]);
4287 (ASM_REAL_ARITH_TAC);
4288 (EXPAND_TAC "h" THEN REWRITE_TAC[REAL_ARITH `&0 <= a - b <=> b <= a`]);
4289 (SUBGOAL_THEN `p IN rcone_ge b (a:real^3) r` MP_TAC);
4291 (REWRITE_TAC[rcone_ge;rconesgn;IN;IN_ELIM_THM]);
4293 (REWRITE_WITH `((p - a) dot (b - a)) / ((b - a) dot (b - a)) <= &1
4294 <=> ((p - a) dot (b - a)) <= &1 * ((b - a) dot (b - a:real^3))`);
4295 (MATCH_MP_TAC REAL_LE_LDIV_EQ);
4296 (REWRITE_TAC[GSYM NORM_POW_2; GSYM Trigonometry2.NOT_ZERO_EQ_POW2_LT;
4297 NORM_EQ_0; VECTOR_ARITH `b - a = vec 0 <=> a = b`]);
4298 (ASM_REWRITE_TAC[]);
4299 (REWRITE_TAC [REAL_MUL_LID; REAL_ARITH `a <= b <=> ~(b < a)`]);
4301 (NEW_GOAL `(p - b) dot (a - b) + (p - a) dot (b - a) >
4302 dist (p,b) * dist (a,b) * r + (b - a) dot (b - a:real^3)`);
4303 (ASM_REAL_ARITH_TAC);
4304 (UP_ASM_TAC THEN REWRITE_TAC[VECTOR_ARITH `(p - b) dot (a - b) + (p - a) dot (b - a) = (b - a) dot (b - a)`; REAL_ARITH `~(x > y + x) <=> &0 <= y`]);
4305 (ASM_SIMP_TAC[REAL_LE_MUL;DIST_POS_LE]);
4306 (REAL_ARITH_TAC)]);;
4308 (* ======================================================================= *)
4310 let INTER_RCONE_GE_LT_lemma = prove_by_refinement (
4311 `!a:real^3 b p s h r.
4312 ~(a = b) /\ s = midpoint (a, b) /\ &0 < r /\ ~(p = a) /\ ~(p = b) /\
4313 inv (&2) < r pow 2 /\
4314 between (proj_point (b - a) (p - a) + a) (a, s) /\
4315 p IN rcone_ge a b r INTER rcone_ge b a r ==> dist (s, p) < dist (s, a)`,
4316 [(REPEAT STRIP_TAC);
4317 (NEW_GOAL `&0 <= r`);
4318 (ASM_REAL_ARITH_TAC);
4319 (ABBREV_TAC `p' = proj_point (b - a) (p - a) + a:real^3`);
4320 (ABBREV_TAC `x = a + (dist (a, s) / dist (a, p':real^3)) % (p - a)`);
4321 (NEW_GOAL `(p - a) dot (b - a:real^3) >= dist (p,a) * dist (b,a) * r`);
4322 (SUBGOAL_THEN `p IN rcone_ge a (b:real^3) r` MP_TAC);
4324 (REWRITE_TAC[rcone_ge;rconesgn;IN;IN_ELIM_THM]);
4326 (NEW_GOAL `between p (a, x:real^3)`);
4327 (EXPAND_TAC "x" THEN REWRITE_TAC[between]);
4328 (ONCE_REWRITE_TAC[DIST_SYM]);
4329 (REWRITE_TAC[dist; VECTOR_ARITH `(a + x) - a = x:real^3 /\
4330 ((a + k % (p - a) ) - p = (k - &1) % (p - a))`; NORM_MUL]);
4331 (REWRITE_WITH `abs (norm (a - s) / norm (a - p':real^3)) =
4332 norm (a - s) / norm (a - p')`);
4333 (REWRITE_TAC[REAL_ABS_REFL]);
4334 (SIMP_TAC[REAL_LE_DIV; NORM_POS_LE]);
4335 (REWRITE_WITH `abs (norm (a - s) / norm (a - p':real^3) - &1) =
4336 norm (a - s) / norm (a - p') - &1`);
4337 (REWRITE_TAC[REAL_ABS_REFL]);
4338 (ONCE_REWRITE_TAC[NORM_ARITH `norm (a - b) = norm (b - a)`]);
4339 (EXPAND_TAC "p'" THEN SIMP_TAC[VECTOR_ARITH `(k % s + a) - a = k % s`;
4340 PRO_EXP; NORM_MUL;REAL_ABS_DIV; GSYM NORM_POW_2; REAL_LE_POW_2]);
4341 (REWRITE_WITH `abs ((p - a) dot (b - a:real^3)) = (p - a) dot (b - a) /\
4342 abs (norm (b - a) pow 2) = norm (b - a) pow 2`);
4343 (REWRITE_TAC[REAL_ABS_REFL; REAL_LE_POW_2]);
4344 (NEW_GOAL `&0 <= dist (p,a) * dist (b,a:real^3) * r`);
4345 (ASM_SIMP_TAC[REAL_LE_MUL;DIST_POS_LE]);
4346 (ASM_REAL_ARITH_TAC);
4347 (REWRITE_TAC[REAL_ARITH `&0 <= x - &1 <=> &1 <= x`]);
4348 (REWRITE_WITH `b = &2 % s - a:real^3`);
4349 (ASM_REWRITE_TAC[midpoint] THEN VECTOR_ARITH_TAC);
4350 (REWRITE_TAC[VECTOR_ARITH `&2 % s - a - a = &2 % (s - a)`; NORM_MUL;
4351 DOT_RMUL; MESON[REAL_ABS_REFL; REAL_ARITH `&0 <= &2`] `abs (&2) = &2`]);
4352 (REWRITE_TAC[real_div; REAL_INV_MUL; REAL_INV_INV]);
4354 (REWRITE_TAC[REAL_ARITH `x * ((inv (&2) * inv (y)) * (&2 * x) pow 2) *
4355 inv (&2) * inv (x) = (x * inv (x)) * (x pow 2) * inv (y)`]);
4356 (REWRITE_WITH `norm (s - a:real^3) * inv (norm (s - a)) = &1`);
4357 (MATCH_MP_TAC REAL_MUL_RINV);
4358 (REWRITE_TAC[NORM_EQ_0]);
4359 (ASM_REWRITE_TAC[midpoint; VECTOR_ARITH `inv (&2) % (a + b) - a =
4360 inv (&2) % (b - a)`; VECTOR_MUL_EQ_0]);
4361 (ASM_REWRITE_TAC[VECTOR_ARITH `b -a = vec 0 <=> a = b`]);
4363 (REWRITE_TAC[REAL_MUL_LID; GSYM real_div]);
4366 (NEW_GOAL `&0 < (p - a) dot (s - a:real^3)`);
4367 (REWRITE_WITH `(p - a) dot (s - a:real^3) = inv (&2) * (p - a) dot (b - a)`);
4368 (ASM_REWRITE_TAC[midpoint] THEN VECTOR_ARITH_TAC);
4369 (MATCH_MP_TAC REAL_LT_MUL);
4370 (REWRITE_TAC[REAL_ARITH `&0 < inv (&2)`]);
4371 (NEW_GOAL `&0 < dist (p,a) * dist (b,a:real^3) * r`);
4372 (ASM_SIMP_TAC[REAL_LT_MUL;DIST_POS_LT]);
4373 (ASM_REAL_ARITH_TAC);
4374 (REWRITE_WITH `&1 <= norm (s - a) pow 2 / ((p - a) dot (s - a))
4375 <=> &1 * ((p - a) dot (s - a:real^3)) <= norm (s - a) pow 2 `);
4376 (ASM_SIMP_TAC[REAL_LE_RDIV_EQ]);
4377 (REWRITE_TAC[REAL_MUL_LID]);
4378 (ONCE_REWRITE_TAC[VECTOR_ARITH `(p - a) dot (s - a) =
4379 (p - a - (p' - a)) dot (s - a) + (p' - a) dot (s - a:real^3)`]);
4380 (EXPAND_TAC "p'" THEN REWRITE_TAC[VECTOR_ARITH `(x + a) - a = x:real^3`]);
4381 (REWRITE_TAC[GSYM projection_proj_point]);
4382 (REWRITE_WITH `s - a:real^3 = inv (&2) % (b - a)`);
4383 (ASM_REWRITE_TAC[midpoint] THEN VECTOR_ARITH_TAC);
4384 (REWRITE_TAC[DOT_RMUL;Packing3.PROJECTION_ORTHOGONAL;REAL_MUL_RZERO;
4386 (REWRITE_WITH `proj_point (b - a) (p - a:real^3) = p' - a`);
4387 (EXPAND_TAC "p'" THEN VECTOR_ARITH_TAC);
4388 (REWRITE_WITH `(p' - a) dot (b - a) = norm (p'- a) * norm (b - a:real^3)`);
4389 (REWRITE_TAC[NORM_CAUCHY_SCHWARZ_EQ]);
4390 (SUBGOAL_THEN `between p' (a, b:real^3)` MP_TAC);
4391 (EXPAND_TAC "p'" THEN MATCH_MP_TAC INTER_RCONE_GE_IMP_BETWEEN_PROJ_POINT);
4392 (EXISTS_TAC `r:real` THEN ASM_REWRITE_TAC[]);
4393 (REWRITE_TAC[BETWEEN_IN_CONVEX_HULL; CONVEX_HULL_2; IN; IN_ELIM_THM]);
4395 (FIRST_ASSUM REWRITE_ONLY_TAC);
4396 (REWRITE_WITH `(u % a + v % b) - a = (u % a + v % b) - (u + v) % a:real^3`);
4397 (ASM_REWRITE_TAC[VECTOR_MUL_LID]);
4398 (REWRITE_TAC[VECTOR_ARITH `(u % a + v % b) - (u + v) % a = v % (b - a)`;
4399 NORM_MUL; VECTOR_MUL_ASSOC]);
4400 (REWRITE_WITH `abs v = v`);
4401 (ASM_SIMP_TAC[REAL_ABS_REFL]);
4404 (NEW_GOAL `inv (&2) * norm (p' - a) * norm (b - a:real^3) <=
4405 inv (&2) * norm (s - a) * norm (b - a)`);
4406 (REWRITE_TAC[REAL_ARITH `a * x * b <= a * y * b <=> &0 <= (a * b) * (y - x)`]);
4407 (MATCH_MP_TAC REAL_LE_MUL);
4409 (MATCH_MP_TAC REAL_LE_MUL);
4410 (REWRITE_TAC[NORM_POS_LE; REAL_ARITH `&0 <= inv (&2)`]);
4411 (REWRITE_TAC[GSYM dist]);
4412 (ONCE_REWRITE_TAC[DIST_SYM]);
4413 (UNDISCH_TAC `between p' (a,s:real^3)` THEN REWRITE_TAC[between]);
4414 (DISCH_TAC THEN FIRST_ASSUM REWRITE_ONLY_TAC);
4415 (REWRITE_TAC[REAL_ARITH `(a + b) - a = b`; DIST_POS_LE]);
4417 (NEW_GOAL `norm (inv (&2) % (b - a:real^3)) pow 2 =
4418 inv (&2) * norm (s - a) * norm (b - a)`);
4419 (REWRITE_TAC[NORM_MUL; REAL_POW_2; REAL_ARITH `abs (inv (&2)) = inv (&2)`]);
4420 (REWRITE_TAC[REAL_ARITH
4421 `(z * x) * z * x = z * y * x <=> (y - z * x) * x * z = &0`]);
4422 (REWRITE_WITH `s - a:real^3 = inv (&2) % (b - a)`);
4423 (ASM_REWRITE_TAC[midpoint] THEN VECTOR_ARITH_TAC);
4424 (REWRITE_TAC[NORM_MUL; REAL_ARITH `abs (inv (&2)) = inv (&2)`]);
4426 (ASM_REAL_ARITH_TAC);
4429 (NEW_GOAL `x IN rcone_ge (a:real^3) b r`);
4431 (MATCH_MP_TAC RCONE_GE_TRANS);
4433 (SIMP_TAC[REAL_LE_DIV;DIST_POS_LE]);
4434 (ASM_REWRITE_TAC[VECTOR_ARITH `(a:real^3) + p - a = p`]);
4437 (NEW_GOAL `(p' - a) dot (b - a) = norm (p'- a) * norm (b - a:real^3)`);
4438 (REWRITE_TAC[NORM_CAUCHY_SCHWARZ_EQ]);
4439 (SUBGOAL_THEN `between p' (a, b:real^3)` MP_TAC);
4440 (EXPAND_TAC "p'" THEN MATCH_MP_TAC INTER_RCONE_GE_IMP_BETWEEN_PROJ_POINT);
4441 (EXISTS_TAC `r:real` THEN ASM_REWRITE_TAC[]);
4442 (REWRITE_TAC[BETWEEN_IN_CONVEX_HULL; CONVEX_HULL_2; IN; IN_ELIM_THM]);
4444 (FIRST_ASSUM REWRITE_ONLY_TAC);
4445 (REWRITE_WITH `(u % a + v % b) - a = (u % a + v % b) - (u + v) % a:real^3`);
4446 (ASM_REWRITE_TAC[VECTOR_MUL_LID]);
4447 (REWRITE_TAC[VECTOR_ARITH `(u % a + v % b) - (u + v) % a = v % (b - a)`;
4448 NORM_MUL; VECTOR_MUL_ASSOC]);
4449 (REWRITE_WITH `abs v = v`);
4450 (ASM_SIMP_TAC[REAL_ABS_REFL]);
4453 (NEW_GOAL `(x - s:real^3) dot (a - s) = &0`);
4455 (REWRITE_TAC[VECTOR_ARITH `((a + m % x) - s) dot (a - s) = (s - a) dot (s - a) - m * (x dot (s - a))`]);
4457 (ONCE_REWRITE_TAC[DIST_SYM] THEN REWRITE_TAC[dist]);
4458 (REWRITE_WITH `(p - a) dot (s - a) =
4459 (p - a - (p' - a)) dot (s - a) + (p' - a) dot (s - a:real^3)`);
4462 (EXPAND_TAC "p'" THEN REWRITE_TAC[VECTOR_ARITH `(x + a) - a = x:real^3`]);
4463 (REWRITE_TAC[GSYM projection_proj_point]);
4464 (REWRITE_WITH `s - a:real^3 = inv (&2) % (b - a)`);
4465 (ASM_REWRITE_TAC[midpoint] THEN VECTOR_ARITH_TAC);
4466 (REWRITE_TAC[DOT_RMUL;Packing3.PROJECTION_ORTHOGONAL;REAL_MUL_RZERO;
4468 (REWRITE_WITH `proj_point (b - a) (p - a:real^3) = p' - a`);
4469 (EXPAND_TAC "p'" THEN VECTOR_ARITH_TAC);
4470 (FIRST_ASSUM REWRITE_ONLY_TAC);
4471 (REWRITE_TAC[DOT_LMUL; NORM_MUL; REAL_ARITH `abs (inv (&2)) = inv (&2)`;
4473 (REWRITE_TAC [REAL_ARITH `m * m * (x pow 2) - (m * x) / y * m * y * x = &0
4474 <=> m * m * x * x * (y / y - &1) = &0 `]);
4475 (REWRITE_WITH `norm (p' - a) / norm (p' - a:real^3) = &1`);
4476 (MATCH_MP_TAC REAL_DIV_REFL);
4477 (REWRITE_TAC[NORM_EQ_0]);
4478 (EXPAND_TAC "p'" THEN REWRITE_TAC[VECTOR_ARITH `(x + a:real^3) - a = x`]);
4479 (REWRITE_TAC[PRO_EXP;VECTOR_MUL_EQ_0]);
4480 (ASM_REWRITE_TAC[VECTOR_ARITH `b - a = vec 0 <=> a = b`]);
4481 (ONCE_REWRITE_TAC [REAL_ARITH `a / b = a * (&1 / b)`]);
4482 (REWRITE_TAC[REAL_ENTIRE]);
4483 (NEW_GOAL `~((p - a) dot (b - a:real^3) = &0)`);
4484 (NEW_GOAL `&0 < dist (p,a) * dist (b,a:real^3) * r`);
4485 (ASM_SIMP_TAC[REAL_LT_MUL; DIST_POS_LT]);
4486 (ASM_REAL_ARITH_TAC);
4487 (ASM_REWRITE_TAC[]);
4488 (MATCH_MP_TAC Trigonometry2.NOT_EQ0_IMP_NEITHER_INVERT);
4489 (REWRITE_TAC[GSYM NORM_POW_2; Trigonometry2.POW2_EQ_0; NORM_EQ_0]);
4490 (ASM_REWRITE_TAC[VECTOR_ARITH `b - a = vec 0 <=> a = b`]);
4492 (NEW_GOAL `dist (s, x) < dist (s, a:real^3)`);
4493 (NEW_GOAL `norm (a - x:real^3) pow 2 = norm (s - x) pow 2 + norm (a - s) pow 2`);
4494 (MATCH_MP_TAC PYTHAGORAS);
4495 (ASM_REWRITE_TAC[orthogonal]);
4496 (NEW_GOAL `norm (a - s) pow 2 > inv (&2) * norm (a - x:real^3) pow 2`);
4497 (ONCE_REWRITE_TAC[NORM_ARITH `norm (x - y) = norm (y - x)`]);
4498 (EXPAND_TAC "x" THEN REWRITE_TAC[VECTOR_ARITH `(x + y:real^3) - x = y`]);
4499 (REWRITE_TAC[NORM_MUL]);
4500 (ONCE_REWRITE_TAC[DIST_SYM]);
4501 (REWRITE_TAC[dist]);
4502 (REWRITE_WITH `abs (norm (s - a) / norm (p' - a:real^3)) =
4503 norm (s - a) / norm (p' - a)`);
4504 (REWRITE_TAC[REAL_ABS_REFL]);
4505 (SIMP_TAC[REAL_LE_DIV;NORM_POS_LE]);
4506 (REWRITE_TAC[REAL_ARITH `(x / y * z) pow 2 = x pow 2 * (z / y) pow 2`]);
4507 (REWRITE_TAC[REAL_ARITH
4508 `x pow 2 > a * x pow 2 * b <=> &0 < x pow 2 * (&1 - a * b)`]);
4509 (MATCH_MP_TAC REAL_LT_MUL);
4512 (REWRITE_TAC[GSYM Trigonometry2.NOT_ZERO_EQ_POW2_LT;NORM_EQ_0]);
4513 (ASM_REWRITE_TAC[midpoint; VECTOR_ARITH `inv (&2) % (a + b) - a =
4514 inv (&2) % (b - a)`; VECTOR_MUL_EQ_0]);
4515 (ASM_REWRITE_TAC[VECTOR_ARITH `b -a = vec 0 <=> a = b`]);
4517 (REWRITE_TAC[REAL_ARITH `&0 < &1 - a <=> a < &1`]);
4518 (NEW_GOAL `norm (p' - a) >= r * norm (p - a:real^3)`);
4519 (EXPAND_TAC "p'" THEN REWRITE_TAC[VECTOR_ARITH `(x + y:real^3) - y = x`]);
4520 (REWRITE_TAC[PRO_EXP]);
4521 (SUBGOAL_THEN `p IN rcone_ge (a:real^3) b r` MP_TAC);
4523 (REWRITE_TAC[rcone_ge;rconesgn;IN;IN_ELIM_THM; dist]);
4525 (REWRITE_TAC[NORM_MUL;REAL_ABS_DIV;GSYM NORM_POW_2]);
4526 (REWRITE_WITH `abs ((p - a) dot (b - a)) = (p - a) dot (b - a:real^3) /\
4527 abs (norm (b - a) pow 2) = norm (b - a) pow 2`);
4528 (REWRITE_TAC[REAL_ABS_REFL;REAL_LE_POW_2]);
4529 (NEW_GOAL `&0 <= norm (p - a) * norm (b - a:real^3) * r`);
4530 (ASM_SIMP_TAC[REAL_LE_MUL; NORM_POS_LE]);
4531 (ASM_REAL_ARITH_TAC);
4532 (REWRITE_TAC[REAL_ARITH `a / x * y >= b <=> b <= (a * y) / x`]);
4533 (REWRITE_WITH `r * norm (p - a) <=
4534 (((p - a) dot (b - a)) * norm (b - a)) / norm (b - a) pow 2
4535 <=> (r * norm (p - a)) * norm (b - a) pow 2 <=
4536 (((p - a) dot (b - a)) * norm (b - a:real^3))`);
4537 (MATCH_MP_TAC REAL_LE_RDIV_EQ);
4538 (REWRITE_TAC[GSYM Trigonometry2.NOT_ZERO_EQ_POW2_LT; NORM_EQ_0]);
4539 (ASM_REWRITE_TAC[VECTOR_ARITH `b - a = vec 0 <=> a = b`]);
4540 (REWRITE_TAC[REAL_ARITH
4541 `(a * b) * x pow 2 <= m * x <=> &0 <= x * (m - b * x * a)`]);
4542 (MATCH_MP_TAC REAL_LE_MUL);
4543 (REWRITE_TAC[NORM_POS_LE]);
4544 (ASM_REAL_ARITH_TAC);
4546 (REWRITE_TAC[REAL_POW_DIV;REAL_ARITH `a * b / c = (a * b) / c`]);
4547 (REWRITE_WITH `(inv (&2) * norm (p - a) pow 2) / norm (p' - a) pow 2 < &1
4548 <=> (inv (&2) * norm (p - a) pow 2) < &1 * norm (p' - a:real^3) pow 2`);
4549 (MATCH_MP_TAC REAL_LT_LDIV_EQ);
4550 (REWRITE_TAC[GSYM Trigonometry2.NOT_ZERO_EQ_POW2_LT]);
4552 (NEW_GOAL `norm (p - a:real^3) = &0`);
4553 (NEW_GOAL `r * norm (p - a:real^3) = &0`);
4554 (NEW_GOAL `&0 <= r * norm (p - a:real^3)`);
4555 (ASM_SIMP_TAC[REAL_LE_MUL;NORM_POS_LE]);
4556 (ASM_REAL_ARITH_TAC);
4557 (UP_ASM_TAC THEN REWRITE_TAC[REAL_ENTIRE]);
4558 (REWRITE_WITH `~(r = &0)`);
4559 (ASM_REAL_ARITH_TAC);
4560 (UP_ASM_TAC THEN REWRITE_TAC[NORM_EQ_0]);
4561 (ASM_REWRITE_TAC[NORM_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
4562 (REWRITE_TAC[REAL_MUL_LID]);
4563 (NEW_GOAL `(r * norm (p - a)) pow 2 <= norm (p' - a:real^3) pow 2`);
4564 (REWRITE_WITH `(r * norm (p - a)) pow 2 <= norm (p' - a:real^3) pow 2
4565 <=> r * norm (p - a) <= norm (p' - a)`);
4566 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4567 (MATCH_MP_TAC Trigonometry2.POW2_COND);
4568 (ASM_SIMP_TAC[REAL_LE_MUL;NORM_POS_LE]);
4569 (ASM_REAL_ARITH_TAC);
4570 (NEW_GOAL `inv (&2) * norm (p - a:real^3) pow 2 < (r * norm (p - a)) pow 2`);
4571 (REWRITE_TAC[REAL_ARITH
4572 `a * x pow 2 < (m * x) pow 2 <=> &0 < (m pow 2 - a) * (x pow 2)`]);
4573 (MATCH_MP_TAC REAL_LT_MUL);
4575 (ASM_REAL_ARITH_TAC);
4576 (REWRITE_TAC[GSYM Trigonometry2.NOT_ZERO_EQ_POW2_LT; NORM_EQ_0]);
4577 (ASM_REWRITE_TAC[VECTOR_ARITH `b - a = vec 0 <=> a = b`]);
4578 (ASM_REAL_ARITH_TAC);
4580 (NEW_GOAL `norm (s - x) pow 2 < norm (a - s:real^3) pow 2`);
4581 (ASM_REAL_ARITH_TAC);
4582 (REWRITE_WITH `dist (s,x) < dist (s,a:real^3)
4583 <=> dist (s,x) pow 2 < dist (s,a) pow 2`);
4584 (MATCH_MP_TAC Pack1.bp_bdt);
4585 (REWRITE_TAC[DIST_POS_LE]);
4586 (UP_ASM_TAC THEN REWRITE_TAC[GSYM dist] THEN MESON_TAC[DIST_SYM]);
4588 (ASM_CASES_TAC `(p = x:real^3)`);
4590 (MATCH_MP_TAC DIST_BETWEEN_FURTHEST_LT);
4591 (EXISTS_TAC `x:real^3`);
4596 (UNDISCH_TAC `between p (a,x:real^3)`);
4597 (FIRST_ASSUM REWRITE_ONLY_TAC);
4598 (REWRITE_TAC[BETWEEN_REFL_EQ]);
4600 (ASM_REAL_ARITH_TAC)]);;
4602 let INTER_RCONE_GE_dist_lemma1 = INTER_RCONE_GE_LT_lemma;;
4604 (* ======================================================================= *)
4606 (* ========================================================================== *)
4607 let INTER_RCONE_GE_LE_lemma = prove_by_refinement (
4608 `!a:real^3 b p s h r.
4609 ~(a = b) /\ s = midpoint (a, b) /\ &0 < r /\ ~(p = a) /\ ~(p = b) /\
4610 inv (&2) <= r pow 2 /\
4611 between (proj_point (b - a) (p - a) + a) (a, s) /\
4612 p IN rcone_ge a b r INTER rcone_ge b a r ==> dist (s, p) <= dist (s, a)`,
4613 [(REPEAT STRIP_TAC);
4614 (NEW_GOAL `&0 <= r`);
4615 (ASM_REAL_ARITH_TAC);
4616 (ABBREV_TAC `p' = proj_point (b - a) (p - a) + a:real^3`);
4617 (ABBREV_TAC `x = a + (dist (a, s) / dist (a, p':real^3)) % (p - a)`);
4618 (NEW_GOAL `(p - a) dot (b - a:real^3) >= dist (p,a) * dist (b,a) * r`);
4619 (SUBGOAL_THEN `p IN rcone_ge a (b:real^3) r` MP_TAC);
4621 (REWRITE_TAC[rcone_ge;rconesgn;IN;IN_ELIM_THM]);
4623 (NEW_GOAL `between p (a, x:real^3)`);
4624 (EXPAND_TAC "x" THEN REWRITE_TAC[between]);
4625 (ONCE_REWRITE_TAC[DIST_SYM]);
4626 (REWRITE_TAC[dist; VECTOR_ARITH `(a + x) - a = x:real^3 /\
4627 ((a + k % (p - a) ) - p = (k - &1) % (p - a))`; NORM_MUL]);
4628 (REWRITE_WITH `abs (norm (a - s) / norm (a - p':real^3)) =
4629 norm (a - s) / norm (a - p')`);
4630 (REWRITE_TAC[REAL_ABS_REFL]);
4631 (SIMP_TAC[REAL_LE_DIV; NORM_POS_LE]);
4632 (REWRITE_WITH `abs (norm (a - s) / norm (a - p':real^3) - &1) =
4633 norm (a - s) / norm (a - p') - &1`);
4634 (REWRITE_TAC[REAL_ABS_REFL]);
4635 (ONCE_REWRITE_TAC[NORM_ARITH `norm (a - b) = norm (b - a)`]);
4636 (EXPAND_TAC "p'" THEN SIMP_TAC[VECTOR_ARITH `(k % s + a) - a = k % s`;
4637 PRO_EXP; NORM_MUL;REAL_ABS_DIV; GSYM NORM_POW_2; REAL_LE_POW_2]);
4638 (REWRITE_WITH `abs ((p - a) dot (b - a:real^3)) = (p - a) dot (b - a) /\
4639 abs (norm (b - a) pow 2) = norm (b - a) pow 2`);
4640 (REWRITE_TAC[REAL_ABS_REFL; REAL_LE_POW_2]);
4641 (NEW_GOAL `&0 <= dist (p,a) * dist (b,a:real^3) * r`);
4642 (ASM_SIMP_TAC[REAL_LE_MUL;DIST_POS_LE]);
4643 (ASM_REAL_ARITH_TAC);
4644 (REWRITE_TAC[REAL_ARITH `&0 <= x - &1 <=> &1 <= x`]);
4645 (REWRITE_WITH `b = &2 % s - a:real^3`);
4646 (ASM_REWRITE_TAC[midpoint] THEN VECTOR_ARITH_TAC);
4647 (REWRITE_TAC[VECTOR_ARITH `&2 % s - a - a = &2 % (s - a)`; NORM_MUL;
4648 DOT_RMUL; MESON[REAL_ABS_REFL; REAL_ARITH `&0 <= &2`] `abs (&2) = &2`]);
4649 (REWRITE_TAC[real_div; REAL_INV_MUL; REAL_INV_INV]);
4651 (REWRITE_TAC[REAL_ARITH `x * ((inv (&2) * inv (y)) * (&2 * x) pow 2) *
4652 inv (&2) * inv (x) = (x * inv (x)) * (x pow 2) * inv (y)`]);
4653 (REWRITE_WITH `norm (s - a:real^3) * inv (norm (s - a)) = &1`);
4654 (MATCH_MP_TAC REAL_MUL_RINV);
4655 (REWRITE_TAC[NORM_EQ_0]);
4656 (ASM_REWRITE_TAC[midpoint; VECTOR_ARITH `inv (&2) % (a + b) - a =
4657 inv (&2) % (b - a)`; VECTOR_MUL_EQ_0]);
4658 (ASM_REWRITE_TAC[VECTOR_ARITH `b -a = vec 0 <=> a = b`]);
4660 (REWRITE_TAC[REAL_MUL_LID; GSYM real_div]);
4663 (NEW_GOAL `&0 < (p - a) dot (s - a:real^3)`);
4664 (REWRITE_WITH `(p - a) dot (s - a:real^3) = inv (&2) * (p - a) dot (b - a)`);
4665 (ASM_REWRITE_TAC[midpoint] THEN VECTOR_ARITH_TAC);
4666 (MATCH_MP_TAC REAL_LT_MUL);
4667 (REWRITE_TAC[REAL_ARITH `&0 < inv (&2)`]);
4668 (NEW_GOAL `&0 < dist (p,a) * dist (b,a:real^3) * r`);
4669 (ASM_SIMP_TAC[REAL_LT_MUL;DIST_POS_LT]);
4670 (ASM_REAL_ARITH_TAC);
4671 (REWRITE_WITH `&1 <= norm (s - a) pow 2 / ((p - a) dot (s - a))
4672 <=> &1 * ((p - a) dot (s - a:real^3)) <= norm (s - a) pow 2 `);
4673 (ASM_SIMP_TAC[REAL_LE_RDIV_EQ]);
4674 (REWRITE_TAC[REAL_MUL_LID]);
4675 (ONCE_REWRITE_TAC[VECTOR_ARITH `(p - a) dot (s - a) =
4676 (p - a - (p' - a)) dot (s - a) + (p' - a) dot (s - a:real^3)`]);
4677 (EXPAND_TAC "p'" THEN REWRITE_TAC[VECTOR_ARITH `(x + a) - a = x:real^3`]);
4678 (REWRITE_TAC[GSYM projection_proj_point]);
4679 (REWRITE_WITH `s - a:real^3 = inv (&2) % (b - a)`);
4680 (ASM_REWRITE_TAC[midpoint] THEN VECTOR_ARITH_TAC);
4681 (REWRITE_TAC[DOT_RMUL;Packing3.PROJECTION_ORTHOGONAL;REAL_MUL_RZERO;
4683 (REWRITE_WITH `proj_point (b - a) (p - a:real^3) = p' - a`);
4684 (EXPAND_TAC "p'" THEN VECTOR_ARITH_TAC);
4685 (REWRITE_WITH `(p' - a) dot (b - a) = norm (p'- a) * norm (b - a:real^3)`);
4686 (REWRITE_TAC[NORM_CAUCHY_SCHWARZ_EQ]);
4687 (SUBGOAL_THEN `between p' (a, b:real^3)` MP_TAC);
4688 (EXPAND_TAC "p'" THEN MATCH_MP_TAC INTER_RCONE_GE_IMP_BETWEEN_PROJ_POINT);
4689 (EXISTS_TAC `r:real` THEN ASM_REWRITE_TAC[]);
4690 (REWRITE_TAC[BETWEEN_IN_CONVEX_HULL; CONVEX_HULL_2; IN; IN_ELIM_THM]);
4692 (FIRST_ASSUM REWRITE_ONLY_TAC);
4693 (REWRITE_WITH `(u % a + v % b) - a = (u % a + v % b) - (u + v) % a:real^3`);
4694 (ASM_REWRITE_TAC[VECTOR_MUL_LID]);
4695 (REWRITE_TAC[VECTOR_ARITH `(u % a + v % b) - (u + v) % a = v % (b - a)`;
4696 NORM_MUL; VECTOR_MUL_ASSOC]);
4697 (REWRITE_WITH `abs v = v`);
4698 (ASM_SIMP_TAC[REAL_ABS_REFL]);
4701 (NEW_GOAL `inv (&2) * norm (p' - a) * norm (b - a:real^3) <=
4702 inv (&2) * norm (s - a) * norm (b - a)`);
4703 (REWRITE_TAC[REAL_ARITH `a * x * b <= a * y * b <=> &0 <= (a * b) * (y - x)`]);
4704 (MATCH_MP_TAC REAL_LE_MUL);
4706 (MATCH_MP_TAC REAL_LE_MUL);
4707 (REWRITE_TAC[NORM_POS_LE; REAL_ARITH `&0 <= inv (&2)`]);
4708 (REWRITE_TAC[GSYM dist]);
4709 (ONCE_REWRITE_TAC[DIST_SYM]);
4710 (UNDISCH_TAC `between p' (a,s:real^3)` THEN REWRITE_TAC[between]);
4711 (DISCH_TAC THEN FIRST_ASSUM REWRITE_ONLY_TAC);
4712 (REWRITE_TAC[REAL_ARITH `(a + b) - a = b`; DIST_POS_LE]);
4714 (NEW_GOAL `norm (inv (&2) % (b - a:real^3)) pow 2 =
4715 inv (&2) * norm (s - a) * norm (b - a)`);
4716 (REWRITE_TAC[NORM_MUL; REAL_POW_2; REAL_ARITH `abs (inv (&2)) = inv (&2)`]);
4717 (REWRITE_TAC[REAL_ARITH
4718 `(z * x) * z * x = z * y * x <=> (y - z * x) * x * z = &0`]);
4719 (REWRITE_WITH `s - a:real^3 = inv (&2) % (b - a)`);
4720 (ASM_REWRITE_TAC[midpoint] THEN VECTOR_ARITH_TAC);
4721 (REWRITE_TAC[NORM_MUL; REAL_ARITH `abs (inv (&2)) = inv (&2)`]);
4723 (ASM_REAL_ARITH_TAC);
4726 (NEW_GOAL `x IN rcone_ge (a:real^3) b r`);
4728 (MATCH_MP_TAC RCONE_GE_TRANS);
4730 (SIMP_TAC[REAL_LE_DIV;DIST_POS_LE]);
4731 (ASM_REWRITE_TAC[VECTOR_ARITH `(a:real^3) + p - a = p`]);
4734 (NEW_GOAL `(p' - a) dot (b - a) = norm (p'- a) * norm (b - a:real^3)`);
4735 (REWRITE_TAC[NORM_CAUCHY_SCHWARZ_EQ]);
4736 (SUBGOAL_THEN `between p' (a, b:real^3)` MP_TAC);
4737 (EXPAND_TAC "p'" THEN MATCH_MP_TAC INTER_RCONE_GE_IMP_BETWEEN_PROJ_POINT);
4738 (EXISTS_TAC `r:real` THEN ASM_REWRITE_TAC[]);
4739 (REWRITE_TAC[BETWEEN_IN_CONVEX_HULL; CONVEX_HULL_2; IN; IN_ELIM_THM]);
4741 (FIRST_ASSUM REWRITE_ONLY_TAC);
4742 (REWRITE_WITH `(u % a + v % b) - a = (u % a + v % b) - (u + v) % a:real^3`);
4743 (ASM_REWRITE_TAC[VECTOR_MUL_LID]);
4744 (REWRITE_TAC[VECTOR_ARITH `(u % a + v % b) - (u + v) % a = v % (b - a)`;
4745 NORM_MUL; VECTOR_MUL_ASSOC]);
4746 (REWRITE_WITH `abs v = v`);
4747 (ASM_SIMP_TAC[REAL_ABS_REFL]);
4750 (NEW_GOAL `(x - s:real^3) dot (a - s) = &0`);
4752 (REWRITE_TAC[VECTOR_ARITH `((a + m % x) - s) dot (a - s) = (s - a) dot (s - a) - m * (x dot (s - a))`]);
4754 (ONCE_REWRITE_TAC[DIST_SYM] THEN REWRITE_TAC[dist]);
4755 (REWRITE_WITH `(p - a) dot (s - a) =
4756 (p - a - (p' - a)) dot (s - a) + (p' - a) dot (s - a:real^3)`);
4759 (EXPAND_TAC "p'" THEN REWRITE_TAC[VECTOR_ARITH `(x + a) - a = x:real^3`]);
4760 (REWRITE_TAC[GSYM projection_proj_point]);
4761 (REWRITE_WITH `s - a:real^3 = inv (&2) % (b - a)`);
4762 (ASM_REWRITE_TAC[midpoint] THEN VECTOR_ARITH_TAC);
4763 (REWRITE_TAC[DOT_RMUL;Packing3.PROJECTION_ORTHOGONAL;REAL_MUL_RZERO;
4765 (REWRITE_WITH `proj_point (b - a) (p - a:real^3) = p' - a`);
4766 (EXPAND_TAC "p'" THEN VECTOR_ARITH_TAC);
4767 (FIRST_ASSUM REWRITE_ONLY_TAC);
4768 (REWRITE_TAC[DOT_LMUL; NORM_MUL; REAL_ARITH `abs (inv (&2)) = inv (&2)`;
4770 (REWRITE_TAC [REAL_ARITH `m * m * (x pow 2) - (m * x) / y * m * y * x = &0
4771 <=> m * m * x * x * (y / y - &1) = &0 `]);
4772 (REWRITE_WITH `norm (p' - a) / norm (p' - a:real^3) = &1`);
4773 (MATCH_MP_TAC REAL_DIV_REFL);
4774 (REWRITE_TAC[NORM_EQ_0]);
4775 (EXPAND_TAC "p'" THEN REWRITE_TAC[VECTOR_ARITH `(x + a:real^3) - a = x`]);
4776 (REWRITE_TAC[PRO_EXP;VECTOR_MUL_EQ_0]);
4777 (ASM_REWRITE_TAC[VECTOR_ARITH `b - a = vec 0 <=> a = b`]);
4778 (ONCE_REWRITE_TAC [REAL_ARITH `a / b = a * (&1 / b)`]);
4779 (REWRITE_TAC[REAL_ENTIRE]);
4780 (NEW_GOAL `~((p - a) dot (b - a:real^3) = &0)`);
4781 (NEW_GOAL `&0 < dist (p,a) * dist (b,a:real^3) * r`);
4782 (ASM_SIMP_TAC[REAL_LT_MUL; DIST_POS_LT]);
4783 (ASM_REAL_ARITH_TAC);
4784 (ASM_REWRITE_TAC[]);
4785 (MATCH_MP_TAC Trigonometry2.NOT_EQ0_IMP_NEITHER_INVERT);
4786 (REWRITE_TAC[GSYM NORM_POW_2; Trigonometry2.POW2_EQ_0; NORM_EQ_0]);
4787 (ASM_REWRITE_TAC[VECTOR_ARITH `b - a = vec 0 <=> a = b`]);
4789 (NEW_GOAL `dist (s, x) <= dist (s, a:real^3)`);
4790 (NEW_GOAL `norm (a - x:real^3) pow 2 = norm (s - x) pow 2 + norm (a - s) pow 2`);
4791 (MATCH_MP_TAC PYTHAGORAS);
4792 (ASM_REWRITE_TAC[orthogonal]);
4793 (NEW_GOAL `norm (a - s) pow 2 >= inv (&2) * norm (a - x:real^3) pow 2`);
4794 (ONCE_REWRITE_TAC[NORM_ARITH `norm (x - y) = norm (y - x)`]);
4795 (EXPAND_TAC "x" THEN REWRITE_TAC[VECTOR_ARITH `(x + y:real^3) - x = y`]);
4796 (REWRITE_TAC[NORM_MUL]);
4797 (ONCE_REWRITE_TAC[DIST_SYM]);
4798 (REWRITE_TAC[dist]);
4799 (REWRITE_WITH `abs (norm (s - a) / norm (p' - a:real^3)) =
4800 norm (s - a) / norm (p' - a)`);
4801 (REWRITE_TAC[REAL_ABS_REFL]);
4802 (SIMP_TAC[REAL_LE_DIV;NORM_POS_LE]);
4803 (REWRITE_TAC[REAL_ARITH `(x / y * z) pow 2 = x pow 2 * (z / y) pow 2`]);
4804 (REWRITE_TAC[REAL_ARITH
4805 `x pow 2 >= a * x pow 2 * b <=> &0 <= x pow 2 * (&1 - a * b)`]);
4806 (MATCH_MP_TAC REAL_LE_MUL);
4809 (REWRITE_TAC[REAL_LE_POW_2]);
4810 (REWRITE_TAC[REAL_ARITH `&0 <= &1 - a <=> a <= &1`]);
4811 (NEW_GOAL `norm (p' - a) >= r * norm (p - a:real^3)`);
4812 (EXPAND_TAC "p'" THEN REWRITE_TAC[VECTOR_ARITH `(x + y:real^3) - y = x`]);
4813 (REWRITE_TAC[PRO_EXP]);
4814 (SUBGOAL_THEN `p IN rcone_ge (a:real^3) b r` MP_TAC);
4816 (REWRITE_TAC[rcone_ge;rconesgn;IN;IN_ELIM_THM; dist]);
4818 (REWRITE_TAC[NORM_MUL;REAL_ABS_DIV;GSYM NORM_POW_2]);
4819 (REWRITE_WITH `abs ((p - a) dot (b - a)) = (p - a) dot (b - a:real^3) /\
4820 abs (norm (b - a) pow 2) = norm (b - a) pow 2`);
4821 (REWRITE_TAC[REAL_ABS_REFL;REAL_LE_POW_2]);
4822 (NEW_GOAL `&0 <= norm (p - a) * norm (b - a:real^3) * r`);
4823 (ASM_SIMP_TAC[REAL_LE_MUL; NORM_POS_LE]);
4824 (ASM_REAL_ARITH_TAC);
4825 (REWRITE_TAC[REAL_ARITH `a / x * y >= b <=> b <= (a * y) / x`]);
4826 (REWRITE_WITH `r * norm (p - a) <=
4827 (((p - a) dot (b - a)) * norm (b - a)) / norm (b - a) pow 2
4828 <=> (r * norm (p - a)) * norm (b - a) pow 2 <=
4829 (((p - a) dot (b - a)) * norm (b - a:real^3))`);
4830 (MATCH_MP_TAC REAL_LE_RDIV_EQ);
4831 (REWRITE_TAC[GSYM Trigonometry2.NOT_ZERO_EQ_POW2_LT; NORM_EQ_0]);
4832 (ASM_REWRITE_TAC[VECTOR_ARITH `b - a = vec 0 <=> a = b`]);
4833 (REWRITE_TAC[REAL_ARITH
4834 `(a * b) * x pow 2 <= m * x <=> &0 <= x * (m - b * x * a)`]);
4835 (MATCH_MP_TAC REAL_LE_MUL);
4836 (REWRITE_TAC[NORM_POS_LE]);
4837 (ASM_REAL_ARITH_TAC);
4839 (REWRITE_TAC[REAL_POW_DIV;REAL_ARITH `a * b / c = (a * b) / c`]);
4840 (REWRITE_WITH `(inv (&2) * norm (p - a) pow 2) / norm (p' - a) pow 2 <= &1
4841 <=> (inv (&2) * norm (p - a) pow 2) <= &1 * norm (p' - a:real^3) pow 2`);
4842 (MATCH_MP_TAC REAL_LE_LDIV_EQ);
4843 (REWRITE_TAC[GSYM Trigonometry2.NOT_ZERO_EQ_POW2_LT]);
4845 (NEW_GOAL `norm (p - a:real^3) = &0`);
4846 (NEW_GOAL `r * norm (p - a:real^3) = &0`);
4847 (NEW_GOAL `&0 <= r * norm (p - a:real^3)`);
4848 (ASM_SIMP_TAC[REAL_LE_MUL;NORM_POS_LE]);
4849 (ASM_REAL_ARITH_TAC);
4850 (UP_ASM_TAC THEN REWRITE_TAC[REAL_ENTIRE]);
4851 (REWRITE_WITH `~(r = &0)`);
4852 (ASM_REAL_ARITH_TAC);
4853 (UP_ASM_TAC THEN REWRITE_TAC[NORM_EQ_0]);
4854 (ASM_REWRITE_TAC[NORM_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
4855 (REWRITE_TAC[REAL_MUL_LID]);
4856 (NEW_GOAL `(r * norm (p - a)) pow 2 <= norm (p' - a:real^3) pow 2`);
4857 (REWRITE_WITH `(r * norm (p - a)) pow 2 <= norm (p' - a:real^3) pow 2
4858 <=> r * norm (p - a) <= norm (p' - a)`);
4859 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4860 (MATCH_MP_TAC Trigonometry2.POW2_COND);
4861 (ASM_SIMP_TAC[REAL_LE_MUL;NORM_POS_LE]);
4862 (ASM_REAL_ARITH_TAC);
4863 (NEW_GOAL `inv (&2) * norm (p - a:real^3) pow 2 <= (r * norm (p - a)) pow 2`);
4864 (REWRITE_TAC[REAL_ARITH
4865 `a * x pow 2 <= (m * x) pow 2 <=> &0 <= (m pow 2 - a) * (x pow 2)`]);
4866 (MATCH_MP_TAC REAL_LE_MUL);
4868 (ASM_REAL_ARITH_TAC);
4869 (REWRITE_TAC[REAL_LE_POW_2]);
4870 (ASM_REAL_ARITH_TAC);
4872 (NEW_GOAL `norm (s - x) pow 2 <= norm (a - s:real^3) pow 2`);
4873 (ASM_REAL_ARITH_TAC);
4874 (REWRITE_WITH `dist (s,x) <= dist (s,a:real^3)
4875 <=> dist (s,x) pow 2 <= dist (s,a) pow 2`);
4876 (MATCH_MP_TAC Trigonometry2.POW2_COND);
4877 (REWRITE_TAC[DIST_POS_LE]);
4878 (UP_ASM_TAC THEN REWRITE_TAC[GSYM dist] THEN MESON_TAC[DIST_SYM]);
4880 (ONCE_REWRITE_TAC[DIST_SYM]);
4881 (REWRITE_TAC[dist]);
4882 (NEW_GOAL `?y. y IN {a, x:real^3} /\
4883 (!m. m IN convex hull {a,x} ==> norm (m - s) <= norm (y - s))`);
4884 (MATCH_MP_TAC SIMPLEX_FURTHEST_LE);
4885 (REWRITE_TAC[Geomdetail.FINITE6]);
4887 (UP_ASM_TAC THEN REWRITE_TAC[SET_RULE `a IN {x,y} <=> a = x \/ a = y`]
4889 (UP_ASM_TAC THEN FIRST_ASSUM REWRITE_ONLY_TAC);
4890 (DISCH_TAC THEN FIRST_ASSUM MATCH_MP_TAC);
4891 (REWRITE_TAC[GSYM BETWEEN_IN_CONVEX_HULL] THEN ASM_REWRITE_TAC[]);
4892 (UP_ASM_TAC THEN FIRST_ASSUM REWRITE_ONLY_TAC);
4894 (NEW_GOAL `norm (p - s) <= norm (x - s:real^3)`);
4895 (FIRST_ASSUM MATCH_MP_TAC);
4896 (REWRITE_TAC[GSYM BETWEEN_IN_CONVEX_HULL] THEN ASM_REWRITE_TAC[]);
4897 (NEW_GOAL `norm (x - s) <= norm (a - s:real^3)`);
4898 (REWRITE_TAC[GSYM dist]);
4899 (ASM_MESON_TAC[DIST_SYM]);
4900 (ASM_REAL_ARITH_TAC)]);;
4902 (* ======================================================================= *)
4905 let LEFT_ACTION_LIST_PROPERTIES = prove_by_refinement (
4906 `!V ul p u0 u1 u2 u3 k.
4907 packing V /\ saturated V /\ barV V 3 ul /\
4908 hl (truncate_simplex 2 ul) < sqrt (&2) /\ sqrt (&2) <= hl ul /\
4910 xl = left_action_list p ul
4911 ==> xl IN barV V 3 /\
4912 omega_list_n V xl 2 = omega_list_n V ul 2 /\
4913 omega_list_n V xl 3 = omega_list_n V ul 3 /\
4914 mxi V xl = mxi V ul`,
4916 [(REPEAT GEN_TAC THEN STRIP_TAC);
4917 (NEW_GOAL `barV V 3 xl`);
4918 (REWRITE_TAC[BARV]);
4920 (ASM_REWRITE_TAC[]);
4921 (REWRITE_TAC[Packing3.LENGTH_LEFT_ACTION_LIST]);
4922 (UNDISCH_TAC `barV V 3 ul` THEN MESON_TAC[BARV]);
4923 (ABBREV_TAC `zl:(real^3)list = truncate_simplex 2 xl`);
4925 (ASM_CASES_TAC `initial_sublist vl (zl:(real^3)list)`);
4926 (REWRITE_TAC[VORONOI_NONDG]);
4928 (NEW_GOAL `LENGTH (vl:(real^3)list) <= LENGTH (zl:(real^3)list)`);
4929 (MATCH_MP_TAC Packing3.INITIAL_SUBLIST_LENGTH_LE);
4930 (ASM_REWRITE_TAC[]);
4931 (NEW_GOAL `LENGTH (zl:(real^3)list) = 2 + 1`);
4933 (MATCH_MP_TAC Packing3.LENGTH_TRUNCATE_SIMPLEX);
4934 (ASM_REWRITE_TAC[]);
4935 (REWRITE_TAC[Packing3.LENGTH_LEFT_ACTION_LIST]);
4936 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
4937 CARD (set_of_list ul) = 3 + 1`);
4938 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4939 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4942 (NEW_GOAL `set_of_list vl SUBSET set_of_list (zl:(real^3)list)`);
4943 (MATCH_MP_TAC Packing3.SET_OF_LIST_INITIAL_SUBLIST_SUBSET);
4944 (ASM_REWRITE_TAC[]);
4945 (NEW_GOAL `set_of_list zl SUBSET set_of_list (xl:(real^3)list)`);
4947 (MATCH_MP_TAC Rogers.SET_OF_LIST_TRUNCATE_SIMPLEX_SUBSET);
4948 (ASM_REWRITE_TAC[]);
4949 (REWRITE_TAC[Packing3.LENGTH_LEFT_ACTION_LIST]);
4950 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
4951 CARD (set_of_list ul) = 3 + 1`);
4952 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4953 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4955 (NEW_GOAL `set_of_list xl SUBSET (V:real^3->bool)`);
4956 (ASM_SIMP_TAC[Packing3.SET_OF_LIST_LEFT_ACTION_LIST; ARITH_RULE `2 = 3 - 1`]);
4957 (REWRITE_WITH `set_of_list (left_action_list p ul) =
4958 set_of_list (ul:(real^3)list)`);
4959 (MATCH_MP_TAC SET_OF_LIST_LEFT_ACTION_LIST_2);
4960 (NEW_GOAL `LENGTH ul = 3 + 1 /\
4961 CARD (set_of_list (ul:(real^3)list)) = 3 + 1`);
4962 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4963 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4964 (ASM_REWRITE_TAC[ARITH_RULE `2 <= 3 + 1 /\ (3 + 1) - 2 = 2`]);
4965 (MATCH_MP_TAC Packing3.BARV_SUBSET);
4966 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
4970 (ASM_CASES_TAC `LENGTH (vl:(real^3)list) = 4`);
4971 (ASM_REWRITE_TAC[]);
4972 (REWRITE_TAC[ARITH_RULE `a + x = x:int <=> a = &0`]);
4973 (REWRITE_TAC[VORONOI_LIST]);
4974 (REWRITE_WITH `vl = xl:(real^3)list`);
4975 (MATCH_MP_TAC Packing3.INITIAL_SUBLIST_UNIQUE);
4977 (EXISTS_TAC `xl:(real^3)list`);
4978 (ASM_REWRITE_TAC[Packing3.INITIAL_SUBLIST_REFL]);
4979 (REWRITE_TAC[Packing3.LENGTH_LEFT_ACTION_LIST]);
4980 (NEW_GOAL `LENGTH (ul:(real^3)list) = 3 + 1 /\ CARD (set_of_list ul) = 3 + 1`);
4981 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4982 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4984 (ASM_REWRITE_TAC[]);
4985 (REWRITE_WITH `set_of_list (left_action_list p ul) = set_of_list (ul:(real^3)list)`);
4986 (MATCH_MP_TAC SET_OF_LIST_LEFT_ACTION_LIST_2);
4987 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 4`);
4988 (NEW_GOAL `LENGTH (ul:(real^3)list) = 3 + 1 /\ CARD (set_of_list ul) = 3 + 1`);
4989 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4990 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4992 (ASM_REWRITE_TAC[ARITH_RULE `2 <= 4 /\ 4 - 2 = 2`]);
4993 (MP_TAC (ASSUME`barV V 3 ul`) THEN REWRITE_TAC[BARV; VORONOI_NONDG]);
4995 (NEW_GOAL `LENGTH (ul:(real^3)list) = 4`);
4996 (NEW_GOAL `LENGTH (ul:(real^3)list) = 3 + 1 /\ CARD (set_of_list ul) = 3 + 1`);
4997 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4998 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5000 (NEW_GOAL `LENGTH (ul:(real^3)list) < 5 /\
5001 set_of_list ul SUBSET V /\
5002 aff_dim (voronoi_list V ul) + &(LENGTH ul) = &4`);
5003 (FIRST_ASSUM MATCH_MP_TAC);
5004 (REWRITE_TAC[Packing3.INITIAL_SUBLIST_REFL]);
5006 (ONCE_REWRITE_TAC[GSYM VORONOI_LIST]);
5011 (REWRITE_WITH `aff_dim (voronoi_list V (vl:(real^3)list)) =
5012 &3 - &(LENGTH vl - 1)`);
5013 (MATCH_MP_TAC Packing3.AFF_DIM_VORONOI_LIST);
5014 (MATCH_MP_TAC Packing3.BARV_INITIAL_SUBLIST);
5016 (EXISTS_TAC `left_action_list p (truncate_simplex 2 (ul:(real^3)list))`);
5017 (ABBREV_TAC `yl = truncate_simplex 2 (ul:(real^3)list)`);
5018 (NEW_GOAL `left_action_list p yl IN barV V 2 /\
5019 omega_list V (left_action_list p yl) = omega_list V yl`);
5020 (MATCH_MP_TAC Rogers.YIFVQDV);
5021 (ASM_REWRITE_TAC[]);
5024 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
5025 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
5028 (UP_ASM_TAC THEN SET_TAC[]);
5029 (ASM_REWRITE_TAC[]);
5030 (NEW_GOAL `left_action_list p (yl:(real^3)list) = zl`);
5031 (EXPAND_TAC "zl" THEN EXPAND_TAC "yl");
5032 (REWRITE_TAC[ASSUME `xl:(real^3)list = left_action_list p ul`]);
5033 (REWRITE_TAC[left_action_list]);
5034 (NEW_GOAL `?u0 u1 u2 u3:real^3. ul = [u0; u1; u2; u3]`);
5035 (MATCH_MP_TAC BARV_3_EXPLICIT);
5036 (EXISTS_TAC `V:real^3->bool`);
5037 (ASM_REWRITE_TAC[]);
5038 (UP_ASM_TAC THEN STRIP_TAC);
5039 (REWRITE_TAC[ASSUME `ul = [u0:real^3; u1; u2; u3]`]);
5040 (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2]);
5041 (REWRITE_TAC[LENGTH; ARITH_RULE `SUC (SUC (SUC 0)) = 3 /\
5042 SUC (SUC (SUC (SUC 0))) = 4`]);
5043 (REWRITE_TAC[TABLE_4]);
5044 (REWRITE_TAC[ARITH_RULE `SUC 3 = 4`; TABLE_4]);
5045 (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2]);
5046 (NEW_GOAL `!j. j < 3 ==>
5047 EL (inverse p j) [u0; u1; u2:real^3] = EL (inverse p j) [u0; u1; u2; u3]`);
5049 (ASM_CASES_TAC `inverse (p:num->num) j = 0`);
5050 (ASM_REWRITE_TAC[]);
5051 (REWRITE_TAC[EL;HD]);
5052 (ASM_CASES_TAC `inverse (p:num->num) j = 1`);
5053 (ASM_REWRITE_TAC[]);
5054 (REWRITE_TAC[EL;ARITH_RULE `1 = SUC 0`; TL; HD]);
5055 (ASM_CASES_TAC `inverse (p:num->num) j = 2`);
5056 (ASM_REWRITE_TAC[]);
5057 (REWRITE_TAC[EL;ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`; TL; HD]);
5058 (NEW_GOAL `inverse (p:num->num) j > 2`);
5060 (NEW_GOAL `p (inverse p j) = inverse (p:num->num) j`);
5061 (UNDISCH_TAC `p permutes 0..2`);
5062 (REWRITE_TAC[permutes]);
5063 (NEW_GOAL `~(inverse (p:num->num) j IN 0..2)`);
5064 (REWRITE_TAC [IN_NUMSEG]);
5065 (UP_ASM_TAC THEN ARITH_TAC);
5066 (UP_ASM_TAC THEN MESON_TAC[]);
5067 (NEW_GOAL `p (inverse (p:num->num) j) = j`);
5068 (ASM_MESON_TAC[PERMUTES_INVERSES]);
5071 (UP_ASM_TAC THEN MESON_TAC[]);
5072 (ASM_MESON_TAC[ARITH_RULE `0 < 3 /\ 1 < 3 /\ 2 < 3`]);
5074 (ONCE_ASM_REWRITE_TAC[]);
5075 (ASM_REWRITE_TAC[]);
5077 (NEW_GOAL `&(LENGTH vl - 1):int = &(LENGTH (vl:(real^3)list)) - &1`);
5078 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5079 (MATCH_MP_TAC INT_OF_NUM_SUB);
5081 (ASM_REWRITE_TAC[]);
5084 (* ======================================================================= *)
5086 (NEW_GOAL `vl = xl:(real^3)list`);
5087 (NEW_GOAL `vl:(real^3)list = truncate_simplex (LENGTH vl - 1) xl /\
5088 LENGTH vl <= LENGTH xl`);
5089 (MATCH_MP_TAC Packing3.INITIAL_SUBLIST_IMP_TRUNCATE_SIMPLEX);
5090 (ASM_REWRITE_TAC[] THEN ASM_ARITH_TAC);
5091 (NEW_GOAL `?u0 u1 u2 u3. xl = [u0;u1;u2;u3:real^3]`);
5092 (NEW_GOAL `LENGTH (xl:(real^3)list) = 4`);
5093 (ASM_REWRITE_TAC[Packing3.LENGTH_LEFT_ACTION_LIST]);
5094 (REWRITE_TAC[ARITH_RULE `4 = 3 + 1`]);
5095 (ASM_MESON_TAC[Rogers.BARV_IMP_LENGTH_EQ_CARD]);
5097 (NEW_GOAL `?u0 q0. xl = CONS (u0:real^3) q0`);
5098 (MATCH_MP_TAC Packing3.LENGTH_IMP_CONS);
5100 (UP_ASM_TAC THEN STRIP_TAC THEN EXISTS_TAC `u0:real^3`);
5101 (NEW_GOAL `LENGTH (q0:(real^3)list) = 3`);
5102 (UNDISCH_TAC `LENGTH (xl:(real^3)list) = 4` THEN
5103 REWRITE_TAC[ASSUME `xl = CONS (u0:real^3) q0`; ARITH_RULE `4 = SUC 3`]);
5104 (REWRITE_TAC[LENGTH]);
5107 (NEW_GOAL `?u1 q1. q0 = CONS (u1:real^3) q1`);
5108 (MATCH_MP_TAC Packing3.LENGTH_IMP_CONS);
5110 (UP_ASM_TAC THEN STRIP_TAC THEN EXISTS_TAC `u1:real^3`);
5111 (NEW_GOAL `LENGTH (q1:(real^3)list) = 2`);
5112 (UNDISCH_TAC `LENGTH (q0:(real^3)list) = 3` THEN
5113 REWRITE_TAC[ASSUME `q0 = CONS (u1:real^3) q1`; ARITH_RULE `3 = SUC 2`]);
5114 (REWRITE_TAC[LENGTH]);
5117 (NEW_GOAL `?u2 q2. q1 = CONS (u2:real^3) q2`);
5118 (MATCH_MP_TAC Packing3.LENGTH_IMP_CONS);
5120 (UP_ASM_TAC THEN STRIP_TAC THEN EXISTS_TAC `u2:real^3`);
5121 (NEW_GOAL `LENGTH (q2:(real^3)list) = 1`);
5122 (UNDISCH_TAC `LENGTH (q1:(real^3)list) = 2` THEN
5123 REWRITE_TAC[ASSUME `q1 = CONS (u2:real^3) q2`; ARITH_RULE `2 = SUC 1`]);
5124 (REWRITE_TAC[LENGTH]);
5127 (NEW_GOAL `?u3. q2 = [u3:real^3]`);
5128 (EXISTS_TAC `HD (q2:(real^3)list)`);
5129 (UP_ASM_TAC THEN REWRITE_TAC[Packing3.LENGTH_1_LEMMA]);
5130 (UP_ASM_TAC THEN STRIP_TAC THEN EXISTS_TAC `u3:real^3`);
5131 (REWRITE_TAC[ASSUME `xl = CONS (u0:real^3) q0`]);
5132 (ASM_REWRITE_TAC[]);
5133 (UP_ASM_TAC THEN STRIP_TAC);
5134 (NEW_GOAL `zl = [u0;u1;u2:real^3]`);
5135 (ASM_MESON_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2]);
5136 (MATCH_MP_TAC Packing3.INITIAL_SUBLIST_UNIQUE);
5137 (EXISTS_TAC `LENGTH (xl:(real^3)list)` THEN EXISTS_TAC `xl:(real^3)list`);
5138 (REWRITE_TAC[ASSUME `initial_sublist vl (xl:(real^3)list)`;
5139 Packing3.INITIAL_SUBLIST_REFL; ASSUME `xl = [u0; u1; u2; u3:real^3]`;
5140 LENGTH; ARITH_RULE `SUC (SUC (SUC (SUC 0))) = 4`]);
5142 (ASM_CASES_TAC `LENGTH (vl:(real^3)list) = 1`);
5143 (NEW_GOAL `vl = truncate_simplex 0 [u0;u1;u2;u3:real^3]`);
5144 (REWRITE_WITH `[u0;u1;u2;u3:real^3] = xl /\
5145 0 = LENGTH (vl:(real^3)list) - 1`);
5150 (UP_ASM_TAC THEN REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_0]);
5152 (NEW_GOAL `initial_sublist vl (zl:(real^3)list)`);
5153 (REWRITE_TAC[INITIAL_SUBLIST]);
5154 (EXISTS_TAC `[u1;u2:real^3]`);
5155 (ASM_REWRITE_TAC[APPEND]);
5160 (ASM_CASES_TAC `LENGTH (vl:(real^3)list) = 2`);
5161 (NEW_GOAL `vl = truncate_simplex 1 [u0;u1;u2;u3:real^3]`);
5162 (MP_TAC (ASSUME `vl:(real^3)list = truncate_simplex (LENGTH vl - 1) xl /\
5163 LENGTH vl <= LENGTH xl`));
5164 (REWRITE_TAC[ASSUME `LENGTH (vl:(real^3)list) = 2`;
5165 ARITH_RULE `2 - 1 = 1`;
5166 ASSUME `xl = [u0;u1;u2;u3:real^3]`]);
5168 (UP_ASM_TAC THEN REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1]);
5170 (NEW_GOAL `initial_sublist vl (zl:(real^3)list)`);
5171 (REWRITE_TAC[INITIAL_SUBLIST]);
5172 (EXISTS_TAC `[u2:real^3]`);
5173 (ASM_REWRITE_TAC[APPEND]);
5178 (ASM_CASES_TAC `LENGTH (vl:(real^3)list) = 3`);
5179 (NEW_GOAL `vl = truncate_simplex 2 [u0;u1;u2;u3:real^3]`);
5180 (REWRITE_WITH `[u0;u1;u2;u3:real^3] = xl /\
5181 2 = LENGTH (vl:(real^3)list) - 1`);
5186 (UP_ASM_TAC THEN REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2]);
5188 (NEW_GOAL `initial_sublist vl (zl:(real^3)list)`);
5189 (REWRITE_TAC[INITIAL_SUBLIST]);
5190 (EXISTS_TAC `[]:(real^3)list`);
5191 (ASM_REWRITE_TAC[APPEND]);
5196 (NEW_GOAL `LENGTH (vl:(real^3)list) <= 4`);
5197 (REWRITE_WITH `4 = LENGTH (xl:(real^3)list)`);
5198 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5199 (ASM_REWRITE_TAC[Packing3.LENGTH_LEFT_ACTION_LIST]);
5200 (REWRITE_TAC[ARITH_RULE `4 = 3 + 1`]);
5201 (ASM_MESON_TAC[Rogers.BARV_IMP_LENGTH_EQ_CARD]);
5202 (ASM_REWRITE_TAC[]);
5204 (ONCE_ASM_REWRITE_TAC[]);
5205 (REWRITE_TAC[VORONOI_NONDG]);
5206 (NEW_GOAL `set_of_list xl = set_of_list (ul:(real^3)list)`);
5207 (ASM_REWRITE_TAC[]);
5208 (MATCH_MP_TAC SET_OF_LIST_LEFT_ACTION_LIST_2);
5209 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 4`);
5210 (NEW_GOAL `LENGTH (ul:(real^3)list) = 3 + 1 /\ CARD (set_of_list ul) = 3 + 1`);
5211 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5212 (EXISTS_TAC `V:real^3->bool`);
5213 (ASM_REWRITE_TAC[]);
5214 (UP_ASM_TAC THEN ARITH_TAC);
5215 (ASM_REWRITE_TAC[ARITH_RULE `2 <= 4 /\ 4 - 2 = 2`]);
5216 (REWRITE_WITH `LENGTH (xl:(real^3)list) = LENGTH (ul:(real^3)list)`);
5217 (ASM_REWRITE_TAC[Packing3.LENGTH_LEFT_ACTION_LIST]);
5219 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ CARD (set_of_list ul) = 3 + 1`);
5220 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5221 (EXISTS_TAC `V:real^3->bool`);
5222 (ASM_REWRITE_TAC[]);
5223 (REWRITE_TAC[ARITH_RULE `3 + 1 = 4 /\ 4 < 5`]);
5224 (ASM_REWRITE_TAC[VORONOI_LIST]);
5225 (ONCE_REWRITE_TAC[GSYM VORONOI_LIST]);
5226 (MP_TAC (ASSUME `barV V 3 ul`));
5227 (REWRITE_TAC[BARV]);
5229 (NEW_GOAL `voronoi_nondg V (ul:(real^3)list)`);
5230 (FIRST_ASSUM MATCH_MP_TAC);
5231 (REWRITE_TAC[Packing3.INITIAL_SUBLIST_REFL]);
5233 (UP_ASM_TAC THEN REWRITE_TAC[VORONOI_NONDG]);
5236 (ASM_REWRITE_TAC[IN]);
5238 (* =============================================================== *)
5240 (NEW_GOAL `omega_list_n V xl 2 = omega_list_n V (ul:(real^3)list) 2`);
5241 (NEW_GOAL `?u0 u1 u2 u3. ul = [u0;u1;u2;u3:real^3]`);
5242 (MATCH_MP_TAC BARV_3_EXPLICIT);
5243 (EXISTS_TAC `V:real^3->bool`);
5244 (ASM_REWRITE_TAC[]);
5245 (UP_ASM_TAC THEN STRIP_TAC);
5247 (NEW_GOAL `?w0 w1 w2 w3. xl = [w0;w1;w2;w3:real^3]`);
5248 (MATCH_MP_TAC BARV_3_EXPLICIT);
5249 (EXISTS_TAC `V:real^3->bool`);
5250 (ASM_REWRITE_TAC[]);
5251 (UP_ASM_TAC THEN STRIP_TAC);
5253 (NEW_GOAL `u3 = w3:real^3`);
5254 (UNDISCH_TAC `xl = left_action_list p (ul:(real^3)list)`);
5255 (ASM_REWRITE_TAC[left_action_list; LENGTH;
5256 ARITH_RULE `SUC (SUC (SUC (SUC 0))) = 4`; TABLE_4]);
5257 (REWRITE_TAC[CONS_11]);
5259 (NEW_GOAL `u3:real^3 = EL (inverse p 3) [u0; u1; u2; u3]`);
5260 (REWRITE_WITH `inverse p 3 = 3`);
5261 (REWRITE_WITH `!x. inverse (p:num->num) x = x <=> p x = x`);
5262 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5263 (MATCH_MP_TAC Hypermap.fixed_point_lemma);
5264 (EXISTS_TAC `0..2`);
5265 (ASM_REWRITE_TAC[]);
5266 (UNDISCH_TAC `p permutes 0..2` THEN REWRITE_TAC[permutes]);
5268 (FIRST_ASSUM MATCH_MP_TAC);
5269 (REWRITE_TAC[IN_NUMSEG_0] THEN ARITH_TAC);
5270 (REWRITE_TAC[EL; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; HD]);
5274 (NEW_GOAL `{u0,u1,u2} = {w0,w1,w2:real^3}`);
5275 (REWRITE_WITH `{u0,u1,u2} = {w0,w1,w2:real^3} <=>
5276 {u0,u1,u2,u3} = {w0,w1,w2:real^3, w3}`);
5277 (ASM_REWRITE_TAC[]);
5279 (* ========================================================================== *)
5283 (MATCH_MP_TAC (SET_RULE `~(w3 IN {u0, u1, u2}) /\ ~ (w3 IN {w0, w1, w2}) ==>
5284 ({u0, u1, u2, w3} = {w0, w1, w2, w3} ==> {u0, u1, u2} = {w0, w1, w2})`));
5286 (NEW_GOAL `set_of_list (ul:(real^3)list) = {u0,u1,u2}`);
5287 (ASM_REWRITE_TAC[set_of_list]);
5288 (UP_ASM_TAC THEN SET_TAC[]);
5289 (NEW_GOAL `LENGTH ul = 3 + 1 /\ CARD (set_of_list (ul:(real^3)list)) = 3 + 1`);
5290 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5291 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5292 (NEW_GOAL `CARD{u0,u1,u2:real^3} <= 3`);
5293 (REWRITE_TAC[Geomdetail.CARD3]);
5294 (NEW_GOAL `CARD (set_of_list (ul:(real^3)list)) = CARD {u0, u1, u2:real^3}`);
5295 (MATCH_MP_TAC Hypermap.lemma_card_eq_reflect THEN ASM_REWRITE_TAC[]);
5298 (NEW_GOAL `set_of_list (xl:(real^3)list) = {w0,w1,w2}`);
5299 (REWRITE_TAC[ASSUME `xl = [w0; w1; w2; w3:real^3]`;set_of_list]);
5300 (UP_ASM_TAC THEN SET_TAC[]);
5301 (NEW_GOAL `LENGTH xl = 3 + 1 /\ CARD (set_of_list (xl:(real^3)list)) = 3 + 1`);
5302 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5303 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5304 (NEW_GOAL `CARD{w0,w1,w2:real^3} <= 3`);
5305 (REWRITE_TAC[Geomdetail.CARD3]);
5306 (NEW_GOAL `CARD (set_of_list (xl:(real^3)list)) = CARD {w0, w1, w2:real^3}`);
5307 (MATCH_MP_TAC Hypermap.lemma_card_eq_reflect THEN ASM_REWRITE_TAC[]);
5310 (REWRITE_WITH `{u0, u1, u2, u3:real^3} = set_of_list ul /\
5311 {w0, w1, w2, w3:real^3} = set_of_list xl`);
5312 (REWRITE_TAC[ASSUME `xl = [w0; w1; w2; w3:real^3]`; set_of_list]);
5313 (ASM_REWRITE_TAC[set_of_list]);
5314 (ASM_REWRITE_TAC[]);
5315 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5316 (MATCH_MP_TAC SET_OF_LIST_LEFT_ACTION_LIST_2);
5317 (REWRITE_TAC[LENGTH; ARITH_RULE `SUC (SUC (SUC (SUC 0))) = 4`]);
5318 (ASM_REWRITE_TAC[ARITH_RULE `2 <= 4 /\ 4 - 2 = 2`]);
5319 (REWRITE_WITH `omega_list_n V ul 2 = circumcenter {u0,u1,u2:real^3} /\
5320 omega_list_n V xl 2 = circumcenter {w0,w1,w2:real^3}`);
5322 (MATCH_MP_TAC OMEGA_LIST_2_EXPLICIT_NEW);
5323 (EXISTS_TAC `u3:real^3`);
5324 (ASM_REWRITE_TAC[IN]);
5325 (REWRITE_WITH `[u0; u1; u2:real^3] = truncate_simplex 2 ul`);
5326 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2]);
5327 (ASM_REWRITE_TAC[]);
5329 (MATCH_MP_TAC OMEGA_LIST_2_EXPLICIT_NEW);
5330 (EXISTS_TAC `w3:real^3`);
5333 (ASM_REWRITE_TAC[]);
5334 (ASM_REWRITE_TAC[]);
5335 (ASM_REWRITE_TAC[]);
5337 (ASM_REWRITE_TAC[HL; set_of_list]);
5338 (ONCE_REWRITE_TAC[GSYM (ASSUME `{u0, u1, u2} = {w0, w1, w2:real^3}`)]);
5339 (REWRITE_WITH `{u0, u1, u2} = set_of_list [u0;u1;u2:real^3]`);
5340 (REWRITE_TAC[set_of_list]);
5341 (ONCE_REWRITE_TAC[GSYM HL]);
5342 (REWRITE_WITH `[u0; u1; u2:real^3] = truncate_simplex 2 ul`);
5343 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2]);
5344 (ASM_REWRITE_TAC[]);
5346 (ASM_REWRITE_TAC[]);
5348 (* ===================================================================== *)
5350 (NEW_GOAL `omega_list_n V xl 3 = omega_list_n V (ul:(real^3)list) 3`);
5351 (NEW_GOAL `?u0 u1 u2 u3. ul = [u0;u1;u2;u3:real^3]`);
5352 (MATCH_MP_TAC BARV_3_EXPLICIT);
5353 (EXISTS_TAC `V:real^3->bool`);
5354 (ASM_REWRITE_TAC[]);
5355 (UP_ASM_TAC THEN STRIP_TAC);
5357 (NEW_GOAL `?w0 w1 w2 w3. xl = [w0;w1;w2;w3:real^3]`);
5358 (MATCH_MP_TAC BARV_3_EXPLICIT);
5359 (EXISTS_TAC `V:real^3->bool`);
5360 (ASM_REWRITE_TAC[]);
5361 (UP_ASM_TAC THEN STRIP_TAC);
5363 (REWRITE_TAC[ARITH_RULE `3 = SUC 2`; Sphere.OMEGA_LIST_N]);
5364 (REWRITE_TAC[ASSUME `omega_list_n V xl 2 = omega_list_n V ul 2`; ARITH_RULE `SUC 2 = 3`]);
5365 (REWRITE_TAC[ASSUME `xl = [w0; w1; w2; w3:real^3]`;
5366 ASSUME `ul = [u0:real^3; u1; u2; u3]`;
5367 TRUNCATE_SIMPLEX_EXPLICIT_3; VORONOI_LIST; set_of_list]);
5368 (REWRITE_WITH `{w0, w1, w2, w3} = {u0, u1, u2, u3:real^3}`);
5369 (REWRITE_WITH `{w0:real^3, w1, w2, w3} = set_of_list xl /\
5370 {u0, u1, u2, u3:real^3} = set_of_list ul`);
5371 (REWRITE_TAC[set_of_list; ASSUME `xl = [w0; w1; w2; w3:real^3]`;
5372 ASSUME `ul = [u0:real^3; u1; u2; u3]`]);
5373 (REWRITE_TAC[ASSUME `xl:(real^3)list = left_action_list p (ul:(real^3)list)`]);
5374 (MATCH_MP_TAC SET_OF_LIST_LEFT_ACTION_LIST_2);
5375 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 4`);
5376 (REWRITE_TAC[ARITH_RULE `4 = 3 + 1`]);
5377 (NEW_GOAL `LENGTH (ul:(real^3)list) = 3 + 1 /\
5378 CARD (set_of_list ul) = 3+ 1`);
5379 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5380 (EXISTS_TAC `V:real^3->bool`);
5381 (ASM_REWRITE_TAC[]);
5382 (UP_ASM_TAC THEN MESON_TAC[]);
5383 (ASM_REWRITE_TAC[ARITH_RULE `4 - 2 = 2 /\ 2 <= 4`]);
5385 (* ===================================================================== *)
5387 (NEW_GOAL `mxi V xl = mxi V (ul:(real^3)list)`);
5388 (NEW_GOAL `?u0 u1 u2 u3. ul = [u0;u1;u2;u3:real^3]`);
5389 (MATCH_MP_TAC BARV_3_EXPLICIT);
5390 (EXISTS_TAC `V:real^3->bool`);
5391 (ASM_REWRITE_TAC[]);
5392 (UP_ASM_TAC THEN STRIP_TAC);
5394 (NEW_GOAL `?w0 w1 w2 w3. xl = [w0;w1;w2;w3:real^3]`);
5395 (MATCH_MP_TAC BARV_3_EXPLICIT);
5396 (EXISTS_TAC `V:real^3->bool`);
5397 (ASM_REWRITE_TAC[]);
5398 (UP_ASM_TAC THEN STRIP_TAC);
5400 (NEW_GOAL `(?t. between t (omega_list_n V ul 2,omega_list_n V ul 3) /\
5401 dist (u0,t:real^3) = sqrt (&2) /\
5403 (MATCH_MP_TAC MXI_EXPLICIT);
5404 (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
5405 (ASM_REWRITE_TAC[]);
5406 (UP_ASM_TAC THEN STRIP_TAC);
5408 (NEW_GOAL `(?s. between s (omega_list_n V xl 2,omega_list_n V xl 3) /\
5409 dist (w0,s:real^3) = sqrt (&2) /\
5411 (MATCH_MP_TAC MXI_EXPLICIT);
5412 (EXISTS_TAC `w1:real^3` THEN EXISTS_TAC `w2:real^3` THEN EXISTS_TAC `w3:real^3`);
5414 (ASM_REWRITE_TAC[]);
5415 (ASM_REWRITE_TAC[]);
5416 (ASM_REWRITE_TAC[]);
5418 (REWRITE_WITH `hl (truncate_simplex 2 (xl:(real^3)list)) =
5419 hl (truncate_simplex 2 (ul:(real^3)list))`);
5421 (REWRITE_TAC[ASSUME `ul = [u0; u1; u2; u3:real^3]`;
5422 ASSUME `xl = [w0; w1; w2; w3:real^3]`; TRUNCATE_SIMPLEX_EXPLICIT_2]);
5423 (REWRITE_WITH `set_of_list [w0; w1; w2] = set_of_list [u0; u1; u2:real^3]`);
5424 (REWRITE_TAC[set_of_list]);
5425 (REWRITE_TAC[SET_EQ_LEMMA]);
5428 (NEW_GOAL `x IN {w0, w1, w2, w3:real^3}`);
5429 (UP_ASM_TAC THEN SET_TAC[]);
5431 (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list xl`);
5432 (REWRITE_TAC[ASSUME `xl = [w0; w1; w2; w3:real^3]`; set_of_list]);
5433 (REWRITE_TAC[IN_SET_OF_LIST]);
5434 (REWRITE_WITH `MEM x xl <=> MEM (x:real^3) ul`);
5435 (ASM_REWRITE_TAC[]);
5436 (MATCH_MP_TAC MEM_LEFT_ACTION_LIST_2);
5437 (REWRITE_WITH `LENGTH [u0; u1; u2; u3:real^3] = 4`);
5438 (REWRITE_TAC[GSYM (ASSUME `ul = [u0; u1; u2; u3:real^3]`)]);
5439 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
5440 CARD (set_of_list ul) = 3 + 1`);
5441 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5442 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5444 (ASM_REWRITE_TAC[ARITH_RULE `2 <= 4 /\ 4 - 2 = 2`]);
5446 (ASM_REWRITE_TAC[GSYM IN_SET_OF_LIST; set_of_list]);
5447 (REWRITE_TAC[SET_RULE `x IN {a,b,c,d} <=> x = a \/ x = b \/ x = c \/ x = d`]);
5449 (UP_ASM_TAC THEN SET_TAC[]);
5450 (UP_ASM_TAC THEN SET_TAC[]);
5451 (UP_ASM_TAC THEN SET_TAC[]);
5453 (NEW_GOAL `u3:real^3 = EL 3 ul`);
5454 (ASM_REWRITE_TAC[EL; TL; HD; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
5455 (UP_ASM_TAC THEN REWRITE_WITH `EL 3 (ul:(real^3)list) = EL (p 3) xl`);
5456 (ASM_REWRITE_TAC[]);
5457 (MATCH_MP_TAC Packing3.EL_LEFT_ACTION_LIST);
5458 (REWRITE_WITH `LENGTH [u0; u1; u2; u3:real^3] = 4`);
5459 (REWRITE_TAC[GSYM (ASSUME `ul = [u0; u1; u2; u3:real^3]`)]);
5460 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
5461 CARD (set_of_list ul) = 3 + 1`);
5462 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5463 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5465 (ASM_REWRITE_TAC[ARITH_RULE `2 <= 4 /\ 4 - 2 = 2`]);
5466 (REWRITE_TAC[ARITH_RULE `4 - 1 = 3 /\ 3 < 4`]);
5467 (MATCH_MP_TAC KY_PERMUTES_2_PERMUTES_3 );
5468 (ASM_REWRITE_TAC[]);
5469 (REWRITE_WITH `(p:num->num) 3 = 3`);
5470 (MP_TAC (ASSUME `p permutes 0..2`));
5471 (REWRITE_TAC[permutes; IN_NUMSEG]);
5473 (FIRST_ASSUM MATCH_MP_TAC);
5475 (REWRITE_TAC[ASSUME `xl = [w0; w1; w2; w3:real^3]`; EL; TL; HD;
5476 ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
5478 (NEW_GOAL `{w0, w1, w2} = {w0, w1, w2, w3:real^3}`);
5480 (UP_ASM_TAC THEN REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list xl`);
5481 (REWRITE_TAC[ASSUME `xl = [w0; w1; w2; w3:real^3]`; set_of_list]);
5482 (NEW_GOAL `CARD (set_of_list (xl:(real^3)list)) = 4`);
5483 (REWRITE_WITH `LENGTH (xl:(real^3)list) = 3 + 1 /\ CARD (set_of_list xl) = 3 + 1`);
5484 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5485 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5488 (NEW_GOAL `CARD {w0, w1 , w2:real^3} <= 3`);
5489 (REWRITE_TAC[Geomdetail.CARD3]);
5490 (ASM_MESON_TAC[ARITH_RULE `~(4 <= 3)`]);
5494 (NEW_GOAL `x IN {u0, u1, u2, u3:real^3}`);
5495 (UP_ASM_TAC THEN SET_TAC[]);
5497 (REWRITE_WITH `{u0, u1, u2, u3:real^3} = set_of_list ul`);
5498 (ASM_REWRITE_TAC[set_of_list]);
5499 (REWRITE_TAC[IN_SET_OF_LIST]);
5500 (REWRITE_WITH `MEM x ul <=> MEM (x:real^3) xl`);
5501 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5502 (ASM_REWRITE_TAC[]);
5503 (MATCH_MP_TAC MEM_LEFT_ACTION_LIST_2);
5504 (REWRITE_WITH `LENGTH [u0; u1; u2; u3:real^3] = 4`);
5505 (REWRITE_TAC[GSYM (ASSUME `ul = [u0; u1; u2; u3:real^3]`)]);
5506 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
5507 CARD (set_of_list ul) = 3 + 1`);
5508 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5509 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5511 (ASM_REWRITE_TAC[ARITH_RULE `2 <= 4 /\ 4 - 2 = 2`]);
5512 (REWRITE_TAC[ASSUME `xl = [w0; w1; w2 ; w3:real^3]`; GSYM IN_SET_OF_LIST; set_of_list]);
5513 (REWRITE_TAC[SET_RULE `x IN {a,b,c,d} <=> x = a \/ x = b \/ x = c \/ x = d`]);
5515 (UP_ASM_TAC THEN SET_TAC[]);
5516 (UP_ASM_TAC THEN SET_TAC[]);
5517 (UP_ASM_TAC THEN SET_TAC[]);
5519 (NEW_GOAL `w3:real^3 = EL 3 xl`);
5520 (REWRITE_TAC[ASSUME `xl = [w0; w1; w2 ; w3:real^3]`;
5521 EL; TL; HD; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
5523 (UP_ASM_TAC THEN REWRITE_WITH `EL 3 (xl:(real^3)list) = EL 3 ul`);
5524 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5525 (REWRITE_WITH `EL 3 xl = EL (p 3) (xl:(real^3)list)`);
5526 (REWRITE_WITH `(p:num->num) 3 = 3`);
5527 (MP_TAC (ASSUME `p permutes 0..2`));
5528 (REWRITE_TAC[permutes; IN_NUMSEG]);
5530 (FIRST_ASSUM MATCH_MP_TAC);
5533 (ASM_REWRITE_TAC[]);
5534 (MATCH_MP_TAC Packing3.EL_LEFT_ACTION_LIST);
5535 (REWRITE_WITH `LENGTH [u0; u1; u2; u3:real^3] = 4`);
5536 (REWRITE_TAC[GSYM (ASSUME `ul = [u0; u1; u2; u3:real^3]`)]);
5537 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
5538 CARD (set_of_list ul) = 3 + 1`);
5539 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5540 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5542 (REWRITE_TAC[ARITH_RULE `4 - 1 = 3 /\ 3 < 4`]);
5543 (MATCH_MP_TAC KY_PERMUTES_2_PERMUTES_3 );
5544 (ASM_REWRITE_TAC[]);
5546 (ASM_REWRITE_TAC[EL; TL; HD;
5547 ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
5549 (NEW_GOAL `{u0, u1, u2} = {u0, u1, u2, u3:real^3}`);
5551 (UP_ASM_TAC THEN REWRITE_WITH `{u0, u1, u2, u3:real^3} = set_of_list ul`);
5552 (ASM_REWRITE_TAC[set_of_list]);
5553 (NEW_GOAL `CARD (set_of_list (ul:(real^3)list)) = 4`);
5554 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ CARD (set_of_list ul) = 3 + 1`);
5555 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5556 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5559 (NEW_GOAL `CARD {u0, u1 , u2:real^3} <= 3`);
5560 (REWRITE_TAC[Geomdetail.CARD3]);
5561 (ASM_MESON_TAC[ARITH_RULE `~(4 <= 3)`]);
5563 (ASM_REWRITE_TAC[]);
5566 (REWRITE_WITH `set_of_list (xl:(real^3)list) = set_of_list ul`);
5567 (ASM_REWRITE_TAC[]);
5568 (MATCH_MP_TAC SET_OF_LIST_LEFT_ACTION_LIST_2);
5569 (REWRITE_WITH `LENGTH [u0; u1; u2; u3:real^3] = 4`);
5570 (REWRITE_TAC[GSYM (ASSUME `ul = [u0; u1; u2; u3:real^3]`)]);
5571 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
5572 CARD (set_of_list ul) = 3 + 1`);
5573 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5574 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5576 (REWRITE_TAC[ARITH_RULE `4 - 2 = 2 /\ 2 <= 4`]);
5577 (ASM_REWRITE_TAC[]);
5578 (ONCE_REWRITE_TAC[GSYM HL]);
5579 (ASM_REWRITE_TAC[]);
5580 (UP_ASM_TAC THEN STRIP_TAC);
5582 `between s (omega_list_n V (xl:(real^3)list) 2,omega_list_n V xl 3)`
5584 ASSUME `omega_list_n V (xl:(real^3)list) 2 = omega_list_n V ul 2`;
5585 ASSUME `omega_list_n V (xl:(real^3)list) 3 = omega_list_n V ul 3`]
5587 (ABBREV_TAC `s2:real^3 = omega_list_n V (ul:(real^3)list) 2`);
5588 (ABBREV_TAC `s3:real^3 = omega_list_n V (ul:(real^3)list) 3`);
5589 (ASM_REWRITE_TAC[]);
5591 (* ========================================================================== *)
5593 (ABBREV_TAC `zl = [u0; u1; u2:real^3]`);
5594 (NEW_GOAL `zl = truncate_simplex 2 (ul:(real^3)list)`);
5595 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2]);
5596 (NEW_GOAL `barV V 2 zl`);
5597 (ASM_REWRITE_TAC[]);
5598 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
5599 (EXISTS_TAC `3:num` THEN REWRITE_TAC[ARITH_RULE `2 <= 3`]);
5600 (REWRITE_WITH `[u0; u1; u2; u3:real^3] = ul`);
5601 (ASM_REWRITE_TAC[]);
5602 (ASM_REWRITE_TAC[]);
5604 (NEW_GOAL `s2:real^3 = circumcenter (set_of_list zl)`);
5606 (REWRITE_WITH `omega_list_n V ul 2 = omega_list V zl`);
5608 (REWRITE_TAC[ASSUME `ul = [u0;u1;u2;u3:real^3]` ; OMEGA_LIST_TRUNCATE_2]);
5609 (MATCH_MP_TAC Rogers.XNHPWAB1);
5611 (ASM_REWRITE_TAC[IN]);
5612 (REWRITE_TAC[GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`)]);
5613 (ASM_REWRITE_TAC[]);
5615 (NEW_GOAL `(t - s2:real^3) dot (u0 - s2) = &0`);
5616 (ONCE_ASM_REWRITE_TAC[]);
5617 (MATCH_MP_TAC Rogers.MHFTTZN4);
5618 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `2`);
5620 (ASM_REWRITE_TAC[]);
5621 (ASM_REWRITE_TAC[]);
5623 (* ========================================================================== *)
5625 (MP_TAC (ASSUME `between t (s2, s3:real^3)`));
5626 (REWRITE_TAC[BETWEEN_IN_CONVEX_HULL]);
5627 (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM]);
5629 (ONCE_REWRITE_TAC[GSYM IN]);
5630 (REWRITE_TAC[ASSUME `t = u % s2 + v % s3:real^3`]);
5631 (NEW_GOAL `affine (affine hull voronoi_list V zl)`);
5632 (REWRITE_TAC[AFFINE_AFFINE_HULL]);
5633 (UP_ASM_TAC THEN REWRITE_TAC[affine]);
5635 (FIRST_ASSUM MATCH_MP_TAC);
5637 (NEW_GOAL `affine hull voronoi_list V zl INTER
5638 affine hull set_of_list zl = {s2:real^3}`);
5639 (REWRITE_TAC[ASSUME `s2:real^3 = circumcenter (set_of_list zl)`]);
5640 (MATCH_MP_TAC Rogers.MHFTTZN3);
5641 (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[]);
5643 (UP_ASM_TAC THEN SET_TAC[]);
5645 (NEW_GOAL `s3:real^3 IN voronoi_list V zl`);
5646 (NEW_GOAL `s3:real^3 IN voronoi_list V ul`);
5647 (REWRITE_TAC[GSYM (ASSUME `omega_list_n V ul 3 = s3:real^3`)]);
5648 (REWRITE_TAC[OMEGA_LIST_N; ARITH_RULE `3 = SUC 2`]);
5649 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_3; ARITH_RULE `SUC 2 = 3`]);
5650 (MATCH_MP_TAC CLOSEST_POINT_IN_SET);
5651 (REWRITE_TAC[Packing3.CLOSED_VORONOI_LIST]);
5652 (NEW_GOAL `voronoi_nondg V (ul:(real^3)list)`);
5653 (MP_TAC (ASSUME `barV V 3 ul`) THEN REWRITE_TAC[BARV]);
5654 (STRIP_TAC THEN FIRST_ASSUM MATCH_MP_TAC);
5655 (ASM_REWRITE_TAC[ARITH_RULE `0 < 3 + 1`; Packing3.INITIAL_SUBLIST_REFL]);
5656 (UP_ASM_TAC THEN REWRITE_TAC[VORONOI_NONDG]);
5658 (NEW_GOAL `aff_dim (voronoi_list V ul) = &0`);
5659 (UP_ASM_TAC THEN MATCH_MP_TAC (ARITH_RULE `a = (&4:int) ==>
5660 (x + a = &4 ==> x = &0)`));
5661 (REWRITE_TAC[INT_OF_NUM_EQ]);
5662 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ CARD (set_of_list ul) = 3 + 1`);
5663 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5664 (EXISTS_TAC `V:real^3->bool`);
5665 (ASM_REWRITE_TAC[]);
5667 (UP_ASM_TAC THEN ASM_REWRITE_TAC[AFF_DIM_EQ_0]);
5670 (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
5671 (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; VORONOI_LIST;
5672 set_of_list; VORONOI_SET]);
5673 (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> (x IN A ==> x IN B)`));
5676 (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
5677 (REWRITE_TAC[IN_AFFINE_KY_LEMMA1]);
5678 (ASM_REWRITE_TAC[]);
5680 (ASM_REWRITE_TAC[]);
5681 (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list]);
5682 (NEW_GOAL `u0 IN {u0, u1, u2:real^3}`);
5684 (UP_ASM_TAC THEN REWRITE_TAC[IN_AFFINE_KY_LEMMA1]);
5686 (NEW_GOAL `(s - s2:real^3) dot (w0 - s2) = &0`);
5687 (ONCE_ASM_REWRITE_TAC[]);
5688 (MATCH_MP_TAC Rogers.MHFTTZN4);
5689 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `2`);
5691 (ASM_REWRITE_TAC[]);
5692 (ASM_REWRITE_TAC[]);
5694 (MP_TAC (ASSUME `between s (s2, s3:real^3)`));
5695 (REWRITE_TAC[BETWEEN_IN_CONVEX_HULL]);
5696 (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM]);
5698 (ONCE_REWRITE_TAC[GSYM IN]);
5699 (REWRITE_TAC[ASSUME `s = u % s2 + v % s3:real^3`]);
5700 (NEW_GOAL `affine (affine hull voronoi_list V zl)`);
5701 (REWRITE_TAC[AFFINE_AFFINE_HULL]);
5702 (UP_ASM_TAC THEN REWRITE_TAC[affine]);
5704 (FIRST_ASSUM MATCH_MP_TAC);
5706 (NEW_GOAL `affine hull voronoi_list V zl INTER
5707 affine hull set_of_list zl = {s2:real^3}`);
5708 (REWRITE_TAC[ASSUME `s2:real^3 = circumcenter (set_of_list zl)`]);
5709 (MATCH_MP_TAC Rogers.MHFTTZN3);
5710 (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[]);
5712 (UP_ASM_TAC THEN SET_TAC[]);
5714 (NEW_GOAL `s3:real^3 IN voronoi_list V zl`);
5715 (NEW_GOAL `s3:real^3 IN voronoi_list V ul`);
5716 (REWRITE_TAC[GSYM (ASSUME `omega_list_n V ul 3 = s3:real^3`)]);
5717 (REWRITE_TAC[OMEGA_LIST_N; ARITH_RULE `3 = SUC 2`]);
5718 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_3; ARITH_RULE `SUC 2 = 3`]);
5719 (MATCH_MP_TAC CLOSEST_POINT_IN_SET);
5720 (REWRITE_TAC[Packing3.CLOSED_VORONOI_LIST]);
5721 (NEW_GOAL `voronoi_nondg V (ul:(real^3)list)`);
5722 (MP_TAC (ASSUME `barV V 3 ul`) THEN REWRITE_TAC[BARV]);
5723 (STRIP_TAC THEN FIRST_ASSUM MATCH_MP_TAC);
5724 (ASM_REWRITE_TAC[ARITH_RULE `0 < 3 + 1`; Packing3.INITIAL_SUBLIST_REFL]);
5725 (UP_ASM_TAC THEN REWRITE_TAC[VORONOI_NONDG]);
5727 (NEW_GOAL `aff_dim (voronoi_list V ul) = &0`);
5728 (UP_ASM_TAC THEN MATCH_MP_TAC (ARITH_RULE `a = (&4:int) ==>
5729 (x + a = &4 ==> x = &0)`));
5730 (REWRITE_TAC[INT_OF_NUM_EQ]);
5731 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ CARD (set_of_list ul) = 3 + 1`);
5732 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5733 (EXISTS_TAC `V:real^3->bool`);
5734 (ASM_REWRITE_TAC[]);
5736 (UP_ASM_TAC THEN ASM_REWRITE_TAC[AFF_DIM_EQ_0]);
5739 (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
5740 (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; VORONOI_LIST;
5741 set_of_list; VORONOI_SET]);
5742 (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> (x IN A ==> x IN B)`));
5745 (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
5746 (REWRITE_TAC[IN_AFFINE_KY_LEMMA1]);
5747 (ASM_REWRITE_TAC[]);
5749 (ASM_REWRITE_TAC[]);
5750 (MATCH_MP_TAC IN_AFFINE_KY_LEMMA1);
5751 (ASM_REWRITE_TAC[]);
5752 (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list]);
5753 (MATCH_MP_TAC (SET_RULE `w0 IN {u0, u1, u2, u3:real^3} /\ ~(w0= u3) ==>
5754 w0 IN {u0, u1, u2}`));
5755 (REWRITE_WITH `{u0, u1, u2, u3:real^3} = set_of_list ul`);
5756 (ASM_REWRITE_TAC[set_of_list]);
5757 (REWRITE_WITH `set_of_list ul = set_of_list (xl:(real^3)list)`);
5758 (ASM_REWRITE_TAC[]);
5759 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5760 (MATCH_MP_TAC SET_OF_LIST_LEFT_ACTION_LIST_2);
5761 (REWRITE_WITH `LENGTH [u0; u1; u2; u3:real^3] = 4`);
5762 (REWRITE_TAC[GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`)]);
5763 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ CARD (set_of_list ul) = 3 + 1`);
5764 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5765 (EXISTS_TAC `V:real^3->bool`);
5766 (ASM_REWRITE_TAC[]);
5768 (ASM_REWRITE_TAC[ARITH_RULE `2 <= 4 /\ 4 - 2 = 2`]);
5769 (REWRITE_TAC[ASSUME `xl = [w0;w1;w2;w3:real^3]`; set_of_list]);
5772 (NEW_GOAL `w3 = u3:real^3`);
5773 (REWRITE_WITH `w3:real^3 = EL (p 3) xl /\ u3:real^3 = EL 3 ul`);
5775 (REWRITE_WITH `(p:num->num) 3 = 3`);
5776 (MP_TAC (ASSUME `p permutes 0..2`));
5777 (REWRITE_TAC[permutes; IN_NUMSEG]);
5779 (FIRST_ASSUM MATCH_MP_TAC);
5781 (REWRITE_TAC[ASSUME `xl = [w0; w1; w2 ; w3:real^3]`;
5782 EL; TL; HD; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
5783 (ASM_REWRITE_TAC[EL; TL; HD;
5784 ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
5785 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5786 (ASM_REWRITE_TAC[]);
5787 (MATCH_MP_TAC Packing3.EL_LEFT_ACTION_LIST);
5788 (REWRITE_WITH `LENGTH [u0; u1; u2; u3:real^3] = 4`);
5789 (REWRITE_TAC[GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`)]);
5790 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ CARD (set_of_list ul) = 3 + 1`);
5791 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5792 (EXISTS_TAC `V:real^3->bool`);
5793 (ASM_REWRITE_TAC[]);
5795 (ASM_REWRITE_TAC[ARITH_RULE `3 < 4 /\ 4 - 1 = 3`]);
5796 (MATCH_MP_TAC KY_PERMUTES_2_PERMUTES_3);
5797 (ASM_REWRITE_TAC[]);
5799 (NEW_GOAL `CARD {w0, w1, w2, w3:real^3} <= 3`);
5800 (REWRITE_WITH `{w0, w1, w2, w3:real^3} = {w0, w1, w2}`);
5802 (REWRITE_TAC[Geomdetail.CARD3]);
5803 (NEW_GOAL `CARD {w0, w1, w2, w3:real^3} = 3 + 1`);
5804 (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list xl`);
5805 (ASM_MESON_TAC[set_of_list]);
5806 (REWRITE_WITH `LENGTH (xl:(real^3)list) = 3 + 1 /\ CARD (set_of_list xl) = 3 + 1`);
5807 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5808 (EXISTS_TAC `V:real^3->bool`);
5809 (ASM_REWRITE_TAC[]);
5812 (NEW_GOAL `dist (u0:real^3, t) pow 2 = dist (s2, t) pow 2 + dist (u0, s2) pow 2`);
5813 (REWRITE_TAC[dist]);
5814 (MATCH_MP_TAC PYTHAGORAS);
5815 (ASM_REWRITE_TAC[orthogonal]);
5816 (UP_ASM_TAC THEN REWRITE_TAC[ASSUME `dist (u0,t:real^3) = sqrt (&2)`]);
5820 (NEW_GOAL `dist (w0:real^3, s) pow 2 = dist (s2, s) pow 2 + dist (w0, s2) pow 2`);
5821 (REWRITE_TAC[dist]);
5822 (MATCH_MP_TAC PYTHAGORAS);
5823 (ASM_REWRITE_TAC[orthogonal]);
5824 (UP_ASM_TAC THEN REWRITE_TAC[ASSUME `dist (w0,s:real^3) = sqrt (&2)`]);
5827 (NEW_GOAL `dist (s2,t:real^3) pow 2 + dist (u0,s2) pow 2 =
5828 dist (s2,s) pow 2 + dist (w0,s2) pow 2`);
5829 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5830 (UP_ASM_TAC THEN REWRITE_WITH `dist (u0,s2:real^3) = dist (w0, s2)`);
5831 (ONCE_REWRITE_TAC[DIST_SYM]);
5832 (NEW_GOAL `!w:real^3. w IN set_of_list zl ==> dist (s2,w) = hl zl`);
5833 (ONCE_ASM_REWRITE_TAC[]);
5834 (REWRITE_TAC[GSYM (ASSUME `zl:(real^3)list = truncate_simplex 2 ul`)]);
5835 (MATCH_MP_TAC Rogers.HL_PROPERTIES);
5836 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `2` THEN ASM_REWRITE_TAC[]);
5837 (REWRITE_WITH `dist (s2,u0) = hl (zl:(real^3)list) /\
5838 dist (s2,w0:real^3) = hl zl`);
5840 (FIRST_ASSUM MATCH_MP_TAC);
5841 (ASM_REWRITE_TAC[]);
5842 (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list] THEN SET_TAC[]);
5843 (FIRST_ASSUM MATCH_MP_TAC);
5844 (ASM_REWRITE_TAC[]);
5846 (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list]);
5847 (MATCH_MP_TAC (SET_RULE `w0 IN {u0, u1, u2, u3:real^3} /\ ~(w0= u3) ==>
5848 w0 IN {u0, u1, u2}`));
5849 (REWRITE_WITH `{u0, u1, u2, u3:real^3} = set_of_list ul`);
5850 (ASM_REWRITE_TAC[set_of_list]);
5851 (REWRITE_WITH `set_of_list ul = set_of_list (xl:(real^3)list)`);
5852 (ASM_REWRITE_TAC[]);
5853 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5854 (MATCH_MP_TAC SET_OF_LIST_LEFT_ACTION_LIST_2);
5855 (REWRITE_WITH `LENGTH [u0; u1; u2; u3:real^3] = 4`);
5856 (REWRITE_TAC[GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`)]);
5857 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ CARD (set_of_list ul) = 3 + 1`);
5858 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5859 (EXISTS_TAC `V:real^3->bool`);
5860 (ASM_REWRITE_TAC[]);
5862 (ASM_REWRITE_TAC[ARITH_RULE `2 <= 4 /\ 4 - 2 = 2`]);
5863 (REWRITE_TAC[ASSUME `xl = [w0;w1;w2;w3:real^3]`; set_of_list]);
5866 (NEW_GOAL `w3 = u3:real^3`);
5867 (REWRITE_WITH `w3:real^3 = EL (p 3) xl /\ u3:real^3 = EL 3 ul`);
5869 (REWRITE_WITH `(p:num->num) 3 = 3`);
5870 (MP_TAC (ASSUME `p permutes 0..2`));
5871 (REWRITE_TAC[permutes; IN_NUMSEG]);
5873 (FIRST_ASSUM MATCH_MP_TAC);
5875 (REWRITE_TAC[ASSUME `xl = [w0; w1; w2 ; w3:real^3]`;
5876 EL; TL; HD; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
5877 (ASM_REWRITE_TAC[EL; TL; HD;
5878 ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
5879 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5880 (ASM_REWRITE_TAC[]);
5881 (MATCH_MP_TAC Packing3.EL_LEFT_ACTION_LIST);
5882 (REWRITE_WITH `LENGTH [u0; u1; u2; u3:real^3] = 4`);
5883 (REWRITE_TAC[GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`)]);
5884 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ CARD (set_of_list ul) = 3 + 1`);
5885 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5886 (EXISTS_TAC `V:real^3->bool`);
5887 (ASM_REWRITE_TAC[]);
5889 (ASM_REWRITE_TAC[ARITH_RULE `3 < 4 /\ 4 - 1 = 3`]);
5890 (MATCH_MP_TAC KY_PERMUTES_2_PERMUTES_3);
5891 (ASM_REWRITE_TAC[]);
5893 (NEW_GOAL `CARD {w0, w1, w2, w3:real^3} <= 3`);
5894 (REWRITE_WITH `{w0, w1, w2, w3:real^3} = {w0, w1, w2}`);
5896 (REWRITE_TAC[Geomdetail.CARD3]);
5897 (NEW_GOAL `CARD {w0, w1, w2, w3:real^3} = 3 + 1`);
5898 (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list xl`);
5899 (ASM_MESON_TAC[set_of_list]);
5900 (REWRITE_WITH `LENGTH (xl:(real^3)list) = 3 + 1 /\ CARD (set_of_list xl) = 3 + 1`);
5901 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5902 (EXISTS_TAC `V:real^3->bool`);
5903 (ASM_REWRITE_TAC[]);
5906 (REWRITE_TAC[REAL_ARITH `a + b = c + b <=> a = c`]);
5908 (NEW_GOAL `dist (s2, t:real^3) = dist (s2, s)`);
5909 (REWRITE_WITH `dist (s2, t:real^3) = dist (s2, s) <=>
5910 dist (s2, t:real^3) pow 2 = dist (s2, s) pow 2`);
5911 (MATCH_MP_TAC Trigonometry2.EQ_POW2_COND);
5912 (REWRITE_TAC[DIST_POS_LE]);
5913 (ASM_REWRITE_TAC[]);
5914 (UNDISCH_TAC `between s (s2,s3:real^3)`);
5915 (REWRITE_TAC[BETWEEN_IN_CONVEX_HULL; CONVEX_HULL_2; IN; IN_ELIM_THM]);
5917 (UNDISCH_TAC `between t (s2,s3:real^3)`);
5918 (REWRITE_TAC[BETWEEN_IN_CONVEX_HULL; CONVEX_HULL_2; IN; IN_ELIM_THM]);
5921 (UNDISCH_TAC `dist (s2,t:real^3) = dist (s2,s)`);
5922 (REWRITE_TAC[dist; ASSUME `s = u % s2 + v % (s3:real^3)`;
5923 ASSUME `t:real^3 = u' % s2 + v' % s3`]);
5924 (REWRITE_WITH `s2:real^3 - (u' % s2 + v' % s3) =
5925 (u' + v') % s2 - (u' % s2 + v' % s3)`);
5926 (ASM_REWRITE_TAC[VECTOR_MUL_LID]);
5927 (REWRITE_WITH `s2:real^3 - (u % s2 + v % s3) =
5928 (u + v) % s2 - (u % s2 + v % s3)`);
5929 (ASM_REWRITE_TAC[VECTOR_MUL_LID]);
5930 (REWRITE_TAC[VECTOR_ARITH `(a + b) % s2 - (a % s2 + b % s3) = b % (s2 - s3)`;
5931 NORM_MUL; REAL_ARITH `x * y = z * y <=> (x - z) * y = &0`; REAL_ENTIRE]);
5932 (REWRITE_WITH `abs v' = v' /\ abs v = v`);
5933 (ASM_REWRITE_TAC[REAL_ABS_REFL]);
5935 (NEW_GOAL `u = u':real /\ v = v':real`);
5936 (ASM_REAL_ARITH_TAC);
5937 (ASM_REWRITE_TAC[]);
5939 (UP_ASM_TAC THEN REWRITE_TAC[NORM_EQ_0;
5940 VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
5942 (NEW_GOAL `?a. voronoi_list V ul = {a:real^3} /\
5943 a = circumcenter (set_of_list ul) /\
5944 hl ul = dist (HD ul,a)`);
5945 (MATCH_MP_TAC VORONOI_LIST_3_SINGLETON_EXPLICIT);
5946 (ASM_REWRITE_TAC[]);
5947 (UP_ASM_TAC THEN STRIP_TAC);
5948 (NEW_GOAL `(s3:real^3) IN voronoi_list V ul`);
5949 (REWRITE_TAC [GSYM (ASSUME `omega_list_n V xl 3 = s3:real^3`)]);
5950 (REWRITE_TAC[OMEGA_LIST_N; ARITH_RULE `3 = SUC 2`]);
5951 (REWRITE_WITH `truncate_simplex (SUC 2) xl = (xl:(real^3)list)`);
5952 (REWRITE_TAC[ASSUME `xl = [w0;w1;w2;w3:real^3]`;
5953 TRUNCATE_SIMPLEX_EXPLICIT_3; ARITH_RULE `SUC 2 = 3`]);
5954 (REWRITE_WITH `voronoi_list V xl = voronoi_list V (ul:(real^3)list)`);
5955 (REWRITE_TAC[VORONOI_LIST]);
5957 (ASM_REWRITE_TAC[]);
5958 (MATCH_MP_TAC SET_OF_LIST_LEFT_ACTION_LIST_2);
5959 (REWRITE_WITH `LENGTH [u0; u1; u2; u3:real^3] = 4`);
5960 (REWRITE_TAC[GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`)]);
5961 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ CARD (set_of_list ul) = 3 + 1`);
5962 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5963 (EXISTS_TAC `V:real^3->bool`);
5964 (ASM_REWRITE_TAC[]);
5966 (ASM_REWRITE_TAC[ARITH_RULE `2 <= 4 /\ 4 - 2 = 2`]);
5967 (MATCH_MP_TAC CLOSEST_POINT_IN_SET);
5968 (REWRITE_TAC[Packing3.CLOSED_VORONOI_LIST]);
5970 (NEW_GOAL `s3:real^3 = circumcenter (set_of_list ul)`);
5973 (NEW_GOAL `(!w:real^3. w IN set_of_list ul
5974 ==> dist (circumcenter (set_of_list ul),w) = hl ul)`);
5975 (MATCH_MP_TAC Rogers.HL_PROPERTIES);
5976 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
5977 (NEW_GOAL `dist (s3, u0:real^3) = hl (ul:(real^3)list)`);
5978 (REWRITE_TAC[ASSUME `s3:real^3 = circumcenter (set_of_list ul)`]);
5979 (FIRST_ASSUM MATCH_MP_TAC);
5980 (ASM_REWRITE_TAC[set_of_list] THEN SET_TAC[]);
5982 (NEW_GOAL `(!w:real^3. w IN set_of_list zl
5983 ==> dist (circumcenter (set_of_list zl),w) = hl zl)`);
5984 (MATCH_MP_TAC Rogers.HL_PROPERTIES);
5985 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `2` THEN ASM_REWRITE_TAC[]);
5986 (NEW_GOAL `dist (s2, u0:real^3) = hl (zl:(real^3)list)`);
5987 (REWRITE_TAC[ASSUME `s2:real^3 = circumcenter (set_of_list zl)`]);
5988 (FIRST_ASSUM MATCH_MP_TAC);
5989 (ASM_REWRITE_TAC[]);
5990 (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list] THEN SET_TAC[]);
5991 (NEW_GOAL `hl (ul:(real^3)list) = hl (zl:(real^3)list)`);
5993 (UP_ASM_TAC THEN REWRITE_TAC[ASSUME `zl =
5994 truncate_simplex 2 (ul:(real^3)list)`]);
5995 (ASM_REAL_ARITH_TAC);
5997 (ASM_MESON_TAC[])]);;
5999 (* ======================================================================== *)
6002 let MEM_LEFT_ACTION_LIST_3 = prove_by_refinement (
6004 3 <= LENGTH ul /\ p permutes (0..LENGTH ul - 3)
6005 ==> (MEM x (left_action_list p ul) <=> MEM x ul)`,
6006 [(REPEAT STRIP_TAC);
6007 (ASM_REWRITE_TAC[MEM_EXISTS_EL; Packing3.LENGTH_LEFT_ACTION_LIST]);
6011 (ASM_SIMP_TAC[left_action_list; Packing3.EL_TABLE]);
6013 (ASM_CASES_TAC `i < LENGTH (ul:(A)list) - 2`);
6014 (EXISTS_TAC `inverse (p:num->num) i`);
6016 (ABBREV_TAC `n = LENGTH (ul:(A)list) - 2`);
6017 (MP_TAC (ISPECL [`p:num->num`; `0..n-1`] PERMUTES_INVERSE));
6018 (ASM_REWRITE_TAC[] THEN DISCH_TAC);
6019 (UNDISCH_TAC `p permutes 0..LENGTH (ul:(A)list) - 3`);
6020 (REWRITE_WITH `LENGTH (ul:(A)list) - 3 = n -1`);
6023 (NEW_GOAL `inverse p permutes 0..n - 1`);
6025 (MP_TAC (ISPECL [`inverse (p:num->num)`; `0..n-1`] Hypermap_and_fan.PERMUTES_IMP_INSIDE));
6026 (ASM_REWRITE_TAC[]);
6027 (DISCH_THEN (MP_TAC o SPEC `i:num`));
6028 (ASM_SIMP_TAC[IN_NUMSEG; ARITH_RULE `i < n ==> i <= n - 1`; LE_0]);
6031 (* ====================================================================== *)
6033 (EXISTS_TAC `i:num`);
6034 (ASM_REWRITE_TAC[]);
6035 (ABBREV_TAC `n = LENGTH (ul:(A)list)`);
6036 (NEW_GOAL `(inverse p) permutes 0..n-3`);
6037 (ASM_MESON_TAC[PERMUTES_INVERSE]);
6038 (UP_ASM_TAC THEN REWRITE_TAC[permutes]);
6040 (REWRITE_WITH `inverse p (i:num) = i`);
6041 (FIRST_ASSUM MATCH_MP_TAC);
6042 (REWRITE_TAC[IN_NUMSEG]);
6046 (* ====================================================================== *)
6049 (ASM_CASES_TAC `i < LENGTH (ul:(A)list) - 2`);
6050 (EXISTS_TAC `(p:num->num) i`);
6051 (NEW_GOAL `p (i:num) < LENGTH (ul:(A)list)`);
6052 (UNDISCH_TAC `p permutes 0..LENGTH (ul:(A)list) - 3`);
6053 (REWRITE_TAC[permutes]);
6055 (ASM_CASES_TAC `p (i:num) >= LENGTH (ul:(A)list)`);
6056 (NEW_GOAL `p ((p:num->num) (i:num)) = p i`);
6057 (FIRST_ASSUM MATCH_MP_TAC);
6058 (REWRITE_TAC[IN_NUMSEG_0]);
6060 (UNDISCH_TAC `!y. ?!x. (p:num->num) x = y`);
6061 (REWRITE_TAC[EXISTS_UNIQUE]);
6063 (NEW_GOAL `?x. p x = (p:num->num) i /\ (!y'. p y' = p i ==> y' = x)`);
6065 (UP_ASM_TAC THEN STRIP_TAC);
6066 (NEW_GOAL `i = x':num`);
6067 (FIRST_ASSUM MATCH_MP_TAC);
6069 (NEW_GOAL `(p:num->num) i = x':num`);
6070 (FIRST_ASSUM MATCH_MP_TAC);
6072 (NEW_GOAL `i >= LENGTH (ul:(A)list)`);
6078 (ASM_SIMP_TAC[left_action_list; Packing3.EL_TABLE]);
6079 (REWRITE_WITH `inverse (p:num->num) (p i) = i`);
6080 (ASM_MESON_TAC[PERMUTES_INVERSES]);
6083 (EXISTS_TAC `i:num`);
6084 (ASM_REWRITE_TAC[]);
6085 (ABBREV_TAC `n = LENGTH (ul:(A)list)`);
6086 (ASM_SIMP_TAC[left_action_list; Packing3.EL_TABLE]);
6087 (REWRITE_WITH `inverse (p:num->num) i = i`);
6088 (NEW_GOAL `(inverse p) permutes 0..n-3`);
6089 (ASM_MESON_TAC[PERMUTES_INVERSE]);
6090 (UP_ASM_TAC THEN REWRITE_TAC[permutes]);
6092 (FIRST_ASSUM MATCH_MP_TAC);
6093 (REWRITE_TAC[IN_NUMSEG_0]);
6096 (* ====================================================================== *)
6098 let SET_OF_LIST_LEFT_ACTION_LIST_3 = prove(
6099 `!(ul:(A)list) p. 3 <= LENGTH ul /\ p permutes 0..LENGTH ul - 3
6100 ==> set_of_list (left_action_list p ul) = set_of_list ul`,
6101 REPEAT STRIP_TAC THEN REWRITE_TAC[EXTENSION; IN_SET_OF_LIST] THEN
6102 ASM_SIMP_TAC[MEM_LEFT_ACTION_LIST_3]);;
6104 (* ====================================================================== *)
6108 let LEFT_ACTION_LIST_1_EXPLICIT = prove_by_refinement (
6109 `!ul u0 u1 u2 u3 p. packing V /\ barV V 3 ul /\
6110 ul = [u0;u1;u2;u3:real^3] /\ p permutes 0..1 ==>
6111 (left_action_list p ul = ul \/
6112 left_action_list p ul = [u1;u0; u2;u3])`,
6113 [(REPEAT GEN_TAC THEN DISCH_TAC);
6114 (ASM_CASES_TAC `left_action_list p (ul: (real^3)list) = ul`);
6115 (ASM_REWRITE_TAC[]);
6117 (REWRITE_TAC[left_action_list]);
6118 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 4`);
6119 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ CARD (set_of_list ul) = 3 + 1`);
6120 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
6121 (EXISTS_TAC `V:real^3->bool`);
6122 (ASM_REWRITE_TAC[]);
6124 (ASM_REWRITE_TAC[TABLE_4]);
6126 (NEW_GOAL `!i. i IN 2..3 ==> inverse p i = i`);
6127 (NEW_GOAL `(inverse p) permutes 0..1`);
6128 (ASM_MESON_TAC[PERMUTES_INVERSE]);
6129 (UP_ASM_TAC THEN REWRITE_TAC[permutes]);
6131 (FIRST_ASSUM MATCH_MP_TAC);
6132 (UP_ASM_TAC THEN REWRITE_TAC[IN_NUMSEG]);
6134 (NEW_GOAL `2 IN 2..3 /\ 3 IN 2..3`);
6135 (REWRITE_TAC[IN_NUMSEG]);
6137 (ASM_SIMP_TAC[EL; TL; ARITH_RULE `2 = SUC 1 /\ 3 = SUC 2 /\ 1 = SUC 0`; HD]);
6140 (REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
6141 (REWRITE_WITH `inverse p 0 = 1 /\ inverse p 1 = 0`);
6142 (NEW_GOAL `(inverse p) permutes 0..1`);
6143 (ASM_MESON_TAC[PERMUTES_INVERSE]);
6144 (UP_ASM_TAC THEN REWRITE_TAC[permutes]);
6146 (ASM_CASES_TAC `inverse p 0 = 1`);
6147 (ASM_REWRITE_TAC[]);
6149 (ABBREV_TAC `y:num = inverse p 1`);
6150 (NEW_GOAL `?!x:num. inverse p x = y:num`);
6152 (UP_ASM_TAC THEN REWRITE_TAC[EXISTS_UNIQUE]);
6154 (ASM_CASES_TAC `~(y IN 0..1)`);
6155 (NEW_GOAL `inverse p y = y:num`);
6156 (FIRST_ASSUM MATCH_MP_TAC);
6157 (ASM_REWRITE_TAC[]);
6158 (NEW_GOAL `y = x:num`);
6159 (FIRST_ASSUM MATCH_MP_TAC);
6160 (ASM_REWRITE_TAC[]);
6161 (NEW_GOAL `1 = x:num`);
6162 (FIRST_ASSUM MATCH_MP_TAC);
6163 (ASM_REWRITE_TAC[]);
6165 (ASM_REWRITE_TAC[]);
6167 (NEW_GOAL `?!x:num. inverse p x = 1`);
6169 (UP_ASM_TAC THEN REWRITE_TAC[EXISTS_UNIQUE]);
6171 (NEW_GOAL `0 = x'`);
6172 (FIRST_ASSUM MATCH_MP_TAC);
6173 (ASM_REWRITE_TAC[]);
6174 (NEW_GOAL `1 = x'`);
6175 (FIRST_ASSUM MATCH_MP_TAC);
6176 (ASM_REWRITE_TAC[]);
6180 (UP_ASM_TAC THEN REWRITE_TAC[MESON[] `~ ~ s = s`; IN_NUMSEG_0]);
6182 (ASM_CASES_TAC `y = 1`);
6184 (NEW_GOAL `?!x:num. inverse p x = 1`);
6186 (UP_ASM_TAC THEN REWRITE_TAC[EXISTS_UNIQUE]);
6188 (NEW_GOAL `0 = x'`);
6189 (FIRST_ASSUM MATCH_MP_TAC);
6190 (ASM_REWRITE_TAC[]);
6191 (NEW_GOAL `1 = x'`);
6192 (FIRST_ASSUM MATCH_MP_TAC);
6193 (ASM_REWRITE_TAC[]);
6200 (* ========================= *)
6203 (NEW_GOAL `inverse p 0 = 0 /\ inverse p 1 = 1`);
6204 (ABBREV_TAC `y:num = inverse p 0`);
6205 (ASM_CASES_TAC `~(y IN 0..1)`);
6206 (NEW_GOAL `inverse p y = y:num`);
6207 (FIRST_ASSUM MATCH_MP_TAC);
6208 (ASM_REWRITE_TAC[]);
6209 (NEW_GOAL `?!x:num. inverse p x = y:num`);
6211 (UP_ASM_TAC THEN REWRITE_TAC[EXISTS_UNIQUE]);
6213 (NEW_GOAL `y = x:num`);
6214 (FIRST_ASSUM MATCH_MP_TAC);
6215 (ASM_REWRITE_TAC[]);
6216 (NEW_GOAL `0 = x:num`);
6217 (FIRST_ASSUM MATCH_MP_TAC);
6220 (ASM_REWRITE_TAC[]);
6222 (ASM_REWRITE_TAC[]);
6223 (UNDISCH_TAC `~(y IN 0..1)`);
6224 (REWRITE_TAC[IN_NUMSEG_0]);
6230 (UP_ASM_TAC THEN REWRITE_TAC[MESON[] `~ ~ s = s`; IN_NUMSEG_0]);
6235 (ASM_REWRITE_TAC[]);
6236 (ABBREV_TAC `z:num = inverse p 1`);
6237 (ASM_CASES_TAC `~(z IN 0..1)`);
6238 (NEW_GOAL `inverse p z = z:num`);
6239 (FIRST_ASSUM MATCH_MP_TAC);
6240 (ASM_REWRITE_TAC[]);
6241 (NEW_GOAL `?!x:num. inverse p x = z:num`);
6243 (UP_ASM_TAC THEN REWRITE_TAC[EXISTS_UNIQUE]);
6245 (NEW_GOAL `z = x:num`);
6246 (FIRST_ASSUM MATCH_MP_TAC);
6247 (ASM_REWRITE_TAC[]);
6249 (FIRST_ASSUM MATCH_MP_TAC);
6250 (ASM_REWRITE_TAC[]);
6252 (UP_ASM_TAC THEN REWRITE_TAC[MESON[] `~ ~ s = s`; IN_NUMSEG_0]);
6255 (ASM_CASES_TAC `z = 0`);
6256 (NEW_GOAL `?!x:num. inverse p x = 0`);
6258 (UP_ASM_TAC THEN REWRITE_TAC[EXISTS_UNIQUE]);
6260 (NEW_GOAL `1 = x:num`);
6261 (FIRST_ASSUM MATCH_MP_TAC);
6262 (ASM_REWRITE_TAC[]);
6264 (FIRST_ASSUM MATCH_MP_TAC);
6265 (ASM_REWRITE_TAC[]);
6271 (UNDISCH_TAC `~(left_action_list p ul = ul:(real^3)list)`);
6273 (REWRITE_TAC[left_action_list]);
6274 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 4`);
6275 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ CARD (set_of_list ul) = 3 + 1`);
6276 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
6277 (EXISTS_TAC `V:real^3->bool`);
6278 (ASM_REWRITE_TAC[]);
6280 (ASM_REWRITE_TAC[TABLE_4]);
6281 (NEW_GOAL `2 IN 2..3 /\ 3 IN 2..3`);
6282 (REWRITE_TAC[IN_NUMSEG]);
6284 (ASM_SIMP_TAC[EL; TL; ARITH_RULE `2 = SUC 1 /\ 3 = SUC 2 /\ 1 = SUC 0`; HD]);
6286 (REWRITE_TAC[EL; TL; ARITH_RULE `2 = SUC 1 /\ 3 = SUC 2 /\ 1 = SUC 0`; HD])]);;
6289 (* ====================================================================== *)
6291 (* ======================================================================= *)
6293 let LEFT_ACTION_LIST_1_PROPERTIES = prove_by_refinement (
6299 hl (truncate_simplex 1 ul) < sqrt (&2) /\
6300 sqrt (&2) <= hl ul /\
6301 xl = left_action_list p ul
6302 ==> xl IN barV V 3 /\
6303 omega_list_n V xl 1 = omega_list_n V ul 1 /\
6304 omega_list_n V xl 2 = omega_list_n V ul 2 /\
6305 omega_list_n V xl 3 = omega_list_n V ul 3 /\
6306 mxi V xl = mxi V ul`,
6307 [(REPEAT GEN_TAC THEN STRIP_TAC);
6308 (ASM_CASES_TAC `xl = ul:(real^3)list`);
6309 (REWRITE_TAC[ASSUME `xl = ul:(real^3)list`]);
6310 (ASM_REWRITE_TAC[IN]);
6311 (NEW_GOAL `?u0 u1 u2 u3:real^3. ul = [u0;u1;u2;u3]`);
6312 (MATCH_MP_TAC BARV_3_EXPLICIT);
6313 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6314 (UP_ASM_TAC THEN STRIP_TAC);
6315 (REWRITE_WITH `xl = [u1;u0;u2;u3:real^3]`);
6316 (NEW_GOAL `xl = ul \/ xl = [u1; u0; u2; u3:real^3]`);
6317 (REWRITE_TAC[ASSUME `xl = left_action_list p (ul:(real^3)list)`]);
6318 (MATCH_MP_TAC LEFT_ACTION_LIST_1_EXPLICIT);
6319 (ASM_REWRITE_TAC[]);
6320 (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
6322 (NEW_GOAL `[u1; u0; u2; u3] IN barV V 3`);
6323 (REWRITE_TAC[IN; Sphere.BARV]);
6324 (REWRITE_TAC[LENGTH; ARITH_RULE `SUC (SUC (SUC (SUC 0))) = 3 + 1`]);
6326 (ASM_CASES_TAC `LENGTH (vl:(real^3)list) = 1`);
6328 (NEW_GOAL `vl:(real^3)list = [HD vl]`);
6329 (ASM_SIMP_TAC [Packing3.LENGTH_1_LEMMA]);
6330 (NEW_GOAL `HD vl = HD ([u1; u0; u2; u3:real^3])`);
6331 (MATCH_MP_TAC Packing3.HD_INITIAL_SUBLIST);
6332 (ASM_REWRITE_TAC[]);
6334 (UP_ASM_TAC THEN REWRITE_TAC[HD]);
6335 (DISCH_TAC THEN SWITCH_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
6336 (DISCH_TAC THEN ASM_REWRITE_TAC[]);
6337 (REWRITE_TAC[VORONOI_NONDG; LENGTH; set_of_list; ARITH_RULE `SUC 0 < 5`;
6338 Packing3.VORONOI_LIST_SING]);
6340 (NEW_GOAL `set_of_list (ul:(real^3)list) SUBSET V`);
6341 (MATCH_MP_TAC Packing3.BARV_SUBSET);
6342 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
6343 (UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list] THEN SET_TAC[]);
6344 (REWRITE_WITH `aff_dim (voronoi_closed V (u1:real^3)) = &3`);
6345 (MATCH_MP_TAC Packing3.AFF_DIM_VORONOI_CLOSED);
6349 (ABBREV_TAC `k = LENGTH (vl:(real^3)list)`);
6350 (ABBREV_TAC `zl = truncate_simplex (k - 1) (ul:(real^3)list)`);
6351 (REWRITE_TAC[VORONOI_NONDG]);
6353 (NEW_GOAL `LENGTH (vl:(real^3)list) <= LENGTH ([u1; u0; u2; u3:real^3])`);
6354 (ASM_SIMP_TAC[Packing3.INITIAL_SUBLIST_LENGTH_LE]);
6355 (UP_ASM_TAC THEN REWRITE_TAC[LENGTH]);
6357 (NEW_GOAL `set_of_list vl SUBSET set_of_list [u1;u0;u2;u3:real^3]`);
6358 (ASM_SIMP_TAC[Packing3.SET_OF_LIST_INITIAL_SUBLIST_SUBSET]);
6359 (UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list]);
6360 (ONCE_REWRITE_TAC[SET_RULE `{u1,u0,u2,u3:real^3} = {u0,u1,u2,u3}`]);
6361 (REWRITE_WITH `{u0, u1, u2, u3:real^3} = set_of_list ul`);
6362 (ASM_REWRITE_TAC[set_of_list]);
6363 (NEW_GOAL `set_of_list ul SUBSET (V:real^3->bool)`);
6364 (MATCH_MP_TAC Packing3.BARV_SUBSET);
6365 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
6366 (UP_ASM_TAC THEN SET_TAC[]);
6370 (REWRITE_WITH `voronoi_list V vl = voronoi_list V (zl:(real^3)list)`);
6371 (REWRITE_TAC[VORONOI_LIST]);
6372 (REWRITE_WITH `set_of_list vl = set_of_list (zl:(real^3)list)`);
6374 (ASM_CASES_TAC `k = 2`);
6375 (UNDISCH_TAC `truncate_simplex (k-1) ul = zl:(real^3)list`);
6376 (ASM_REWRITE_TAC[ARITH_RULE `2 - 1 = 1`; TRUNCATE_SIMPLEX_EXPLICIT_1]);
6378 (NEW_GOAL `truncate_simplex 1 [u1; u0; u2; u3:real^3] = vl:(real^3)list /\
6379 1 + 1 <= LENGTH [u1; u0; u2; u3]`);
6380 (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
6381 (ASM_REWRITE_TAC[ARITH_RULE `1 + 1 = 2`]);
6382 (UP_ASM_TAC THEN REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1]);
6384 (REWRITE_TAC[GSYM (ASSUME `[u0;u1:real^3] = zl`);
6385 GSYM (ASSUME `[u1;u0:real^3] = vl`); set_of_list]);
6388 (ASM_CASES_TAC `k = 3`);
6389 (UNDISCH_TAC `truncate_simplex (k-1) ul = zl:(real^3)list`);
6390 (ASM_REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; TRUNCATE_SIMPLEX_EXPLICIT_2]);
6392 (NEW_GOAL `truncate_simplex 2 [u1; u0; u2; u3:real^3] = vl:(real^3)list /\
6393 2 + 1 <= LENGTH [u1; u0; u2; u3]`);
6394 (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
6395 (ASM_REWRITE_TAC[ARITH_RULE `2 + 1 = 3`]);
6396 (UP_ASM_TAC THEN REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2]);
6398 (REWRITE_TAC[GSYM (ASSUME `[u0;u1;u2:real^3] = zl`);
6399 GSYM (ASSUME `[u1;u0;u2:real^3] = vl`); set_of_list]);
6402 (ASM_CASES_TAC `k = 4`);
6403 (UNDISCH_TAC `truncate_simplex (k-1) ul = zl:(real^3)list`);
6404 (ASM_REWRITE_TAC[ARITH_RULE `4 - 1 = 3`; TRUNCATE_SIMPLEX_EXPLICIT_3]);
6406 (NEW_GOAL `truncate_simplex 3 [u1; u0; u2; u3:real^3] = vl:(real^3)list /\
6407 3 + 1 <= LENGTH [u1; u0; u2; u3]`);
6408 (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
6409 (ASM_REWRITE_TAC[ARITH_RULE `3 + 1 = 4`]);
6410 (UP_ASM_TAC THEN REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_3]);
6412 (REWRITE_TAC[GSYM (ASSUME `[u0;u1;u2;u3:real^3] = zl`);
6413 GSYM (ASSUME `[u1;u0;u2;u3:real^3] = vl`); set_of_list]);
6416 (NEW_GOAL `LENGTH (vl:(real^3)list) <= LENGTH ([u1; u0; u2; u3:real^3])`);
6417 (ASM_SIMP_TAC[Packing3.INITIAL_SUBLIST_LENGTH_LE]);
6418 (UP_ASM_TAC THEN REWRITE_TAC[LENGTH]);
6424 (REWRITE_WITH `LENGTH (vl:(real^3)list) = LENGTH (zl:(real^3)list)`);
6425 (ASM_REWRITE_TAC[]);
6426 (REWRITE_TAC[GSYM (ASSUME `truncate_simplex (k - 1) ul = zl:(real^3)list`)]);
6427 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6428 (NEW_GOAL `(k - 1) + 1 = k`);
6431 `LENGTH (truncate_simplex (k - 1) (ul:(real^3)list)) = (k -1) + 1`);
6432 (MATCH_MP_TAC Packing3.LENGTH_TRUNCATE_SIMPLEX);
6433 (ASM_REWRITE_TAC[]);
6435 (NEW_GOAL `LENGTH (vl:(real^3)list) <= LENGTH ([u1; u0; u2; u3:real^3])`);
6436 (ASM_SIMP_TAC[Packing3.INITIAL_SUBLIST_LENGTH_LE]);
6437 (UP_ASM_TAC THEN REWRITE_TAC[LENGTH]);
6440 (UNDISCH_TAC `barV V 3 ul` THEN REWRITE_TAC[BARV; VORONOI_NONDG]);
6442 (REWRITE_WITH `LENGTH (zl:(real^3)list) < 5 /\
6443 set_of_list zl SUBSET V /\
6444 aff_dim (voronoi_list V zl) + &(LENGTH zl) = &4`);
6445 (FIRST_ASSUM MATCH_MP_TAC);
6446 (REWRITE_WITH `initial_sublist zl (ul:(real^3)list) /\ LENGTH zl = (k-1) + 1`);
6447 (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
6448 (ASM_REWRITE_TAC[]);
6449 (REWRITE_WITH `k -1 + 1 = k`);
6452 (NEW_GOAL `LENGTH (vl:(real^3)list) <= LENGTH ([u1; u0; u2; u3:real^3])`);
6453 (ASM_SIMP_TAC[Packing3.INITIAL_SUBLIST_LENGTH_LE]);
6454 (UP_ASM_TAC THEN REWRITE_TAC[LENGTH]);
6456 (REWRITE_WITH `k -1 + 1 = k`);
6461 (NEW_GOAL `omega_list_n V [u1; u0; u2; u3:real^3] 1 = omega_list_n V ul 1`);
6463 `omega_list_n V [u1; u0; u2; u3] 1 = circumcenter {u1, u0:real^3}`);
6464 (MATCH_MP_TAC OMEGA_LIST_1_EXPLICIT_NEW);
6465 (EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
6466 (ASM_REWRITE_TAC[HL;set_of_list]);
6467 (ONCE_REWRITE_TAC[SET_RULE `{u1,u0} = {u0,u1}`]);
6468 (REWRITE_WITH `radV {u0,u1:real^3} =
6469 hl (truncate_simplex 1 (ul:(real^3)list))`);
6470 (ASM_REWRITE_TAC[HL; set_of_list; TRUNCATE_SIMPLEX_EXPLICIT_1]);
6471 (ASM_REWRITE_TAC[]);
6474 `omega_list_n V ul 1 = circumcenter {u0, u1:real^3}`);
6475 (MATCH_MP_TAC OMEGA_LIST_1_EXPLICIT_NEW);
6476 (EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
6478 (ASM_REWRITE_TAC[HL;set_of_list]);
6479 (REWRITE_WITH `radV {u0,u1:real^3} =
6480 hl (truncate_simplex 1 (ul:(real^3)list))`);
6481 (ASM_REWRITE_TAC[HL; set_of_list; TRUNCATE_SIMPLEX_EXPLICIT_1]);
6482 (ASM_REWRITE_TAC[]);
6488 (NEW_GOAL `omega_list_n V [u1; u0; u2; u3:real^3] 2 = omega_list_n V ul 2`);
6489 (REWRITE_TAC[OMEGA_LIST_N; ARITH_RULE `2 = SUC 1`]);
6490 (ASM_REWRITE_TAC[ARITH_RULE `SUC 1 = 2`; TRUNCATE_SIMPLEX_EXPLICIT_2; VORONOI_LIST; set_of_list]);
6491 (REWRITE_TAC[SET_RULE `{a,b,c} = {b,a,c}`]);
6493 (NEW_GOAL `omega_list_n V [u1; u0; u2; u3:real^3] 3 = omega_list_n V ul 3`);
6494 (REWRITE_TAC[OMEGA_LIST_N; ARITH_RULE `3 = SUC 2`]);
6495 (ASM_REWRITE_TAC[ARITH_RULE `SUC 2 = 3`; TRUNCATE_SIMPLEX_EXPLICIT_3; VORONOI_LIST; set_of_list]);
6496 (REWRITE_TAC[SET_RULE `{a,b,c,d} = {b,a,c,d}`]);
6497 (ASM_REWRITE_TAC[]);
6499 (ASM_CASES_TAC `hl (truncate_simplex 2 (ul:(real^3)list)) >= sqrt (&2)`);
6500 (NEW_GOAL `mxi V [u0; u1; u2; u3:real^3] = omega_list_n V ul 2`);
6501 (ASM_REWRITE_TAC[mxi]);
6508 (NEW_GOAL `mxi V [u1; u0; u2; u3:real^3] = omega_list_n V [u1;u0;u2;u3] 2`);
6509 (ASM_REWRITE_TAC[mxi]);
6513 (UP_ASM_TAC THEN REWRITE_TAC[]);
6514 (REWRITE_WITH `hl (truncate_simplex 2 [u1; u0; u2; u3:real^3]) =
6515 hl (truncate_simplex 2 (ul:(real^3)list))`);
6516 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; HL; set_of_list]);
6517 (AP_TERM_TAC THEN SET_TAC[]);
6521 (ASM_REWRITE_TAC[]);
6523 (* ================================================================== *)
6526 (ABBREV_TAC `s2:real^3 = omega_list_n V ul 2`);
6527 (ABBREV_TAC `s3:real^3 = omega_list_n V ul 3`);
6528 (NEW_GOAL `(?t. between t (s2,s3) /\ dist (u0,t:real^3) = sqrt (&2) /\
6530 (EXPAND_TAC "s2" THEN EXPAND_TAC "s3");
6531 (MATCH_MP_TAC MXI_EXPLICIT);
6532 (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
6533 (ASM_REWRITE_TAC[]);
6534 (REWRITE_TAC[ARITH_RULE `a < b <=> ~(a >= b)`]);
6537 (NEW_GOAL `(?s. between s (s2,s3) /\ dist (u1,s:real^3) = sqrt (&2) /\
6538 mxi V [u1;u0;u2;u3] = s)`);
6539 (REWRITE_WITH `s2 = omega_list_n V [u1; u0; u2; u3] 2 /\
6540 s3 = omega_list_n V [u1; u0; u2; u3] 3`);
6542 (MATCH_MP_TAC MXI_EXPLICIT);
6543 (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
6545 (ASM_REWRITE_TAC[]);
6546 (ASM_REWRITE_TAC[]);
6547 (UNDISCH_TAC `[u1; u0; u2; u3] IN barV V 3` THEN REWRITE_TAC[IN]);
6549 (REWRITE_TAC[ARITH_RULE `a < b <=> ~(a >= b)`]);
6550 (REWRITE_WITH `hl (truncate_simplex 2 [u1; u0; u2; u3:real^3]) =
6551 hl (truncate_simplex 2 (ul:(real^3)list))`);
6552 (ASM_REWRITE_TAC[HL; TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list]);
6553 (AP_TERM_TAC THEN SET_TAC[]);
6554 (ASM_REWRITE_TAC[]);
6555 (REWRITE_WITH `hl ([u1; u0; u2; u3:real^3]) = hl ((ul:(real^3)list))`);
6556 (ASM_REWRITE_TAC[HL; TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list]);
6557 (AP_TERM_TAC THEN SET_TAC[]);
6558 (ASM_REWRITE_TAC[]);
6559 (UP_ASM_TAC THEN UP_ASM_TAC THEN REPEAT STRIP_TAC);
6562 (ABBREV_TAC `yl = truncate_simplex 2 (ul:(real^3)list)`);
6563 (NEW_GOAL `yl = [u0;u1;u2:real^3]`);
6564 (EXPAND_TAC "yl" THEN REWRITE_TAC[
6565 ASSUME `ul = [u0; u1; u2; u3:real^3]`; TRUNCATE_SIMPLEX_EXPLICIT_2]);
6566 (NEW_GOAL `s2:real^3 = circumcenter (set_of_list yl)`);
6567 (ASM_REWRITE_TAC[set_of_list]);
6569 (MATCH_MP_TAC OMEGA_LIST_2_EXPLICIT_NEW);
6570 (EXISTS_TAC `u3:real^3` THEN REWRITE_TAC[IN]);
6571 (ASM_REWRITE_TAC[]);
6572 (REWRITE_WITH `[u0; u1; u2:real^3] = yl`);
6574 (ASM_REAL_ARITH_TAC);
6577 (NEW_GOAL `s2 IN voronoi_list V [u0;u1;u2:real^3]`);
6579 (REWRITE_TAC[OMEGA_LIST_N; ARITH_RULE `2 = SUC 1`]);
6580 (ASM_REWRITE_TAC[ARITH_RULE `SUC 1 = 2`; TRUNCATE_SIMPLEX_EXPLICIT_2]);
6581 (MATCH_MP_TAC CLOSEST_POINT_IN_SET);
6582 (REWRITE_TAC[Packing3.CLOSED_VORONOI_LIST]);
6583 (UNDISCH_TAC `barV V 3 ul` THEN REWRITE_TAC[BARV]);
6585 (NEW_GOAL `voronoi_nondg V ([u0;u1;u2:real^3])`);
6586 (FIRST_ASSUM MATCH_MP_TAC);
6587 (REWRITE_TAC[Sphere.INITIAL_SUBLIST; LENGTH; ARITH_RULE `0 < SUC (SUC (SUC 0))`]);
6588 (EXISTS_TAC `[u3:real^3]` THEN ASM_REWRITE_TAC[APPEND]);
6589 (UP_ASM_TAC THEN ASM_REWRITE_TAC[VORONOI_NONDG; LENGTH;
6590 ARITH_RULE `SUC (SUC (SUC 0)) = 3`; AFF_DIM_EMPTY]);
6591 (REWRITE_TAC[ARITH_RULE `-- &1 + &3:int = &3 - &1`]);
6592 (REWRITE_TAC[MESON[INT_OF_NUM_SUB; ARITH_RULE `1 <= 3`] `&3:int - &1 = &(3 - 1)`]);
6593 (REWRITE_TAC[ARITH_RULE `3 - 1= 2 /\ ~(&2:int = &4)`]);
6596 (NEW_GOAL `s3 IN voronoi_list V [u0;u1;u2:real^3]`);
6598 (REWRITE_TAC[OMEGA_LIST_N; ARITH_RULE `3 = SUC 2`]);
6599 (ASM_REWRITE_TAC[ARITH_RULE `SUC 2 = 3`; TRUNCATE_SIMPLEX_EXPLICIT_3]);
6600 (MATCH_MP_TAC (SET_RULE `(?b. a IN b /\ b SUBSET c) ==> a IN c`));
6601 (EXISTS_TAC `voronoi_list V [u0; u1; u2; u3:real^3]`);
6603 (MATCH_MP_TAC CLOSEST_POINT_IN_SET);
6604 (REWRITE_TAC[Packing3.CLOSED_VORONOI_LIST]);
6605 (UNDISCH_TAC `barV V 3 ul` THEN REWRITE_TAC[BARV]);
6607 (NEW_GOAL `voronoi_nondg V ([u0;u1;u2;u3:real^3])`);
6608 (FIRST_ASSUM MATCH_MP_TAC);
6609 (REWRITE_TAC[Sphere.INITIAL_SUBLIST; LENGTH; ARITH_RULE `0 < SUC (SUC (SUC (SUC 0)))`]);
6610 (EXISTS_TAC `[]:(real^3)list` THEN ASM_REWRITE_TAC[APPEND]);
6611 (UP_ASM_TAC THEN ASM_REWRITE_TAC[VORONOI_NONDG; LENGTH;
6612 ARITH_RULE `SUC(SUC (SUC (SUC 0))) = 4`; AFF_DIM_EMPTY]);
6613 (REWRITE_TAC[ARITH_RULE `-- &1 + &4:int = &4 - &1`]);
6614 (REWRITE_TAC[MESON[INT_OF_NUM_SUB; ARITH_RULE `1 <= 4`] `&4:int - &1 = &(4 - 1)`]);
6615 (REWRITE_TAC[ARITH_RULE `4 - 1= 3 /\ ~(&3:int = &4)`]);
6616 (REWRITE_TAC[VORONOI_LIST; set_of_list; VORONOI_SET]);
6619 (NEW_GOAL `!a:real^3. between a (s2,s3) ==>
6620 a IN affine hull voronoi_list V [u0;u1;u2]`);
6621 (GEN_TAC THEN REWRITE_TAC[BETWEEN_IN_CONVEX_HULL] THEN DISCH_TAC);
6622 (MATCH_MP_TAC (SET_RULE `(?b. a IN b /\ b SUBSET c) ==> a IN c`));
6623 (EXISTS_TAC `affine hull {s2, s3:real^3}`);
6625 (MATCH_MP_TAC (SET_RULE `(?b. a IN b /\ b SUBSET c) ==> a IN c`));
6626 (EXISTS_TAC `convex hull {s2, s3:real^3}`);
6627 (ASM_REWRITE_TAC[]);
6628 (MESON_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6629 (MATCH_MP_TAC AFFINE_SUBSET_KY_LEMMA);
6633 (NEW_GOAL `s = t:real^3`);
6634 (NEW_GOAL `norm (u0 - s:real^3) pow 2 = norm (s2 - s) pow 2 + norm (u0 - s2) pow 2`);
6635 (MATCH_MP_TAC PYTHAGORAS);
6636 (REWRITE_TAC[orthogonal]);
6637 (ASM_REWRITE_TAC[]);
6638 (MATCH_MP_TAC MHFTTZN4);
6639 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `2`);
6640 (ASM_REWRITE_TAC[]);
6642 (REWRITE_WITH `[u0; u1; u2:real^3] = truncate_simplex 2 ul`);
6644 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
6645 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
6646 (FIRST_ASSUM MATCH_MP_TAC);
6647 (ASM_REWRITE_TAC[]);
6648 (REWRITE_TAC[set_of_list]);
6649 (MATCH_MP_TAC (SET_RULE `(?b. a IN b /\ b SUBSET c) ==> a IN c`));
6650 (EXISTS_TAC `{u0,u1,u2:real^3}`);
6651 (ASM_REWRITE_TAC[]);
6654 (MATCH_MP_TAC (SET_RULE `(?b. a SUBSET b /\ b SUBSET c) ==> a SUBSET c`));
6655 (EXISTS_TAC `convex hull {u0,u1,u2:real^3}`);
6656 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6657 (REWRITE_TAC[SUBSET; IN_SET_IMP_IN_CONVEX_HULL_SET]);
6659 (NEW_GOAL `norm (u0 - t:real^3) pow 2 = norm (s2 - t) pow 2 + norm (u0 - s2) pow 2`);
6660 (MATCH_MP_TAC PYTHAGORAS);
6661 (REWRITE_TAC[orthogonal]);
6662 (ASM_REWRITE_TAC[]);
6663 (MATCH_MP_TAC MHFTTZN4);
6664 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `2`);
6665 (ASM_REWRITE_TAC[]);
6667 (REWRITE_WITH `[u0; u1; u2:real^3] = truncate_simplex 2 ul`);
6669 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
6670 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
6671 (FIRST_ASSUM MATCH_MP_TAC);
6672 (ASM_REWRITE_TAC[]);
6673 (REWRITE_TAC[set_of_list]);
6674 (MATCH_MP_TAC (SET_RULE `(?b. a IN b /\ b SUBSET c) ==> a IN c`));
6675 (EXISTS_TAC `{u0,u1,u2:real^3}`);
6676 (ASM_REWRITE_TAC[]);
6679 (MATCH_MP_TAC (SET_RULE `(?b. a SUBSET b /\ b SUBSET c) ==> a SUBSET c`));
6680 (EXISTS_TAC `convex hull {u0,u1,u2:real^3}`);
6681 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6682 (REWRITE_TAC[SUBSET; IN_SET_IMP_IN_CONVEX_HULL_SET]);
6685 (NEW_GOAL `norm (u1 - s:real^3) pow 2 = norm (s2 - s) pow 2 + norm (u1 - s2) pow 2`);
6686 (MATCH_MP_TAC PYTHAGORAS);
6687 (REWRITE_TAC[orthogonal]);
6688 (ASM_REWRITE_TAC[]);
6689 (MATCH_MP_TAC MHFTTZN4);
6690 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `2`);
6691 (ASM_REWRITE_TAC[]);
6693 (REWRITE_WITH `[u0; u1; u2:real^3] = truncate_simplex 2 ul`);
6695 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
6696 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
6697 (FIRST_ASSUM MATCH_MP_TAC);
6698 (ASM_REWRITE_TAC[]);
6699 (REWRITE_TAC[set_of_list]);
6700 (MATCH_MP_TAC (SET_RULE `(?b. a IN b /\ b SUBSET c) ==> a IN c`));
6701 (EXISTS_TAC `{u0,u1,u2:real^3}`);
6702 (ASM_REWRITE_TAC[]);
6705 (MATCH_MP_TAC (SET_RULE `(?b. a SUBSET b /\ b SUBSET c) ==> a SUBSET c`));
6706 (EXISTS_TAC `convex hull {u0,u1,u2:real^3}`);
6707 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6708 (REWRITE_TAC[SUBSET; IN_SET_IMP_IN_CONVEX_HULL_SET]);
6710 (ABBREV_TAC `s1 = omega_list_n V (ul:(real^3)list) 1`);
6712 (NEW_GOAL `s1 = circumcenter (set_of_list [u0;u1:real^3])`);
6713 (EXPAND_TAC "s1" THEN REWRITE_TAC[set_of_list]);
6714 (MATCH_MP_TAC OMEGA_LIST_1_EXPLICIT_NEW);
6715 (EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
6716 (REWRITE_TAC[IN] THEN ASM_REWRITE_TAC[]);
6717 (REWRITE_WITH `[u0;u1:real^3] = truncate_simplex 1 ul`);
6718 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1]);
6719 (ASM_REWRITE_TAC[]);
6721 (NEW_GOAL `s2 IN voronoi_list V [u0;u1:real^3]`);
6723 (REWRITE_TAC[OMEGA_LIST_N; ARITH_RULE `2 = SUC 1`]);
6724 (ASM_REWRITE_TAC[ARITH_RULE `SUC 1 = 2`; TRUNCATE_SIMPLEX_EXPLICIT_2]);
6725 (MATCH_MP_TAC (SET_RULE `(?b. a IN b /\ b SUBSET c) ==> a IN c`));
6726 (EXISTS_TAC `voronoi_list V [u0; u1; u2:real^3]`);
6728 (MATCH_MP_TAC CLOSEST_POINT_IN_SET);
6729 (REWRITE_TAC[Packing3.CLOSED_VORONOI_LIST]);
6730 (UNDISCH_TAC `barV V 3 ul` THEN REWRITE_TAC[BARV]);
6732 (NEW_GOAL `voronoi_nondg V ([u0;u1;u2:real^3])`);
6733 (FIRST_ASSUM MATCH_MP_TAC);
6734 (REWRITE_TAC[Sphere.INITIAL_SUBLIST; LENGTH; ARITH_RULE `0 < SUC (SUC (SUC 0))`]);
6735 (EXISTS_TAC `[u3]:(real^3)list` THEN ASM_REWRITE_TAC[APPEND]);
6736 (UP_ASM_TAC THEN ASM_REWRITE_TAC[VORONOI_NONDG; LENGTH;
6737 ARITH_RULE `SUC (SUC (SUC 0)) = 3`; AFF_DIM_EMPTY]);
6738 (REWRITE_TAC[ARITH_RULE `-- &1 + &3:int = &3 - &1`]);
6739 (REWRITE_TAC[MESON[INT_OF_NUM_SUB; ARITH_RULE `1 <= 3`] `&3:int - &1 = &(3 - 1)`]);
6740 (REWRITE_TAC[ARITH_RULE `3 - 1= 2 /\ ~(&2:int = &4)`]);
6741 (REWRITE_TAC[VORONOI_LIST; set_of_list; VORONOI_SET]);
6744 (NEW_GOAL `s1 IN voronoi_list V [u0;u1:real^3]`);
6746 (REWRITE_TAC[OMEGA_LIST_N; ARITH_RULE `1 = SUC 0`]);
6747 (ASM_REWRITE_TAC[ARITH_RULE `SUC 0 = 1`; TRUNCATE_SIMPLEX_EXPLICIT_1]);
6748 (MATCH_MP_TAC CLOSEST_POINT_IN_SET);
6749 (REWRITE_TAC[Packing3.CLOSED_VORONOI_LIST]);
6750 (UNDISCH_TAC `barV V 3 ul` THEN REWRITE_TAC[BARV]);
6752 (NEW_GOAL `voronoi_nondg V ([u0;u1:real^3])`);
6753 (FIRST_ASSUM MATCH_MP_TAC);
6754 (REWRITE_TAC[Sphere.INITIAL_SUBLIST; LENGTH; ARITH_RULE `0 < SUC (SUC 0)`]);
6755 (EXISTS_TAC `[u2;u3:real^3]` THEN ASM_REWRITE_TAC[APPEND]);
6756 (UP_ASM_TAC THEN ASM_REWRITE_TAC[VORONOI_NONDG; LENGTH;
6757 ARITH_RULE `SUC (SUC 0) = 2`; AFF_DIM_EMPTY]);
6758 (REWRITE_TAC[ARITH_RULE `-- &1 + &2:int = &2 - &1`]);
6759 (REWRITE_TAC[MESON[INT_OF_NUM_SUB; ARITH_RULE `1 <= 2`] `&2:int - &1 = &(2 - 1)`]);
6760 (REWRITE_TAC[ARITH_RULE `2 - 1= 1 /\ ~(&1:int = &4)`]);
6762 (NEW_GOAL `norm (u0 - s2:real^3) pow 2 = norm (s1 - s2) pow 2 + norm (u0 - s1) pow 2`);
6763 (MATCH_MP_TAC PYTHAGORAS);
6764 (REWRITE_TAC[orthogonal]);
6765 (ASM_REWRITE_TAC[]);
6766 (MATCH_MP_TAC MHFTTZN4);
6767 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `1`);
6768 (ASM_REWRITE_TAC[]);
6770 (REWRITE_WITH `[u0; u1:real^3] = truncate_simplex 1 ul`);
6771 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1]);
6772 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
6773 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `1 <= 3`]);
6774 (REWRITE_WITH `circumcenter (set_of_list [u0; u1; u2:real^3]) = s2`);
6775 (ASM_REWRITE_TAC[]);
6776 (MATCH_MP_TAC (SET_RULE `(?b. a IN b /\ b SUBSET c) ==> a IN c`));
6777 (EXISTS_TAC `voronoi_list V [u0; u1:real^3]`);
6778 (ASM_REWRITE_TAC[]);
6779 (MATCH_MP_TAC (SET_RULE `(?b. a SUBSET b /\ b SUBSET c) ==> a SUBSET c`));
6780 (EXISTS_TAC `convex hull voronoi_list V [u0;u1:real^3]`);
6781 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6782 (REWRITE_TAC[SUBSET; IN_SET_IMP_IN_CONVEX_HULL_SET]);
6783 (REWRITE_TAC[set_of_list]);
6784 (MATCH_MP_TAC (SET_RULE `(?b. a IN b /\ b SUBSET c) ==> a IN c`));
6785 (EXISTS_TAC `convex hull {u0,u1:real^3}`);
6786 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6787 (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
6790 (NEW_GOAL `norm (u1 - s2:real^3) pow 2 = norm (s1 - s2) pow 2 + norm (u1 - s1) pow 2`);
6791 (MATCH_MP_TAC PYTHAGORAS);
6792 (REWRITE_TAC[orthogonal]);
6793 (ASM_REWRITE_TAC[]);
6794 (MATCH_MP_TAC MHFTTZN4);
6795 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `1`);
6796 (ASM_REWRITE_TAC[]);
6798 (REWRITE_WITH `[u0; u1:real^3] = truncate_simplex 1 ul`);
6799 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1]);
6800 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
6801 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `1 <= 3`]);
6802 (REWRITE_WITH `circumcenter (set_of_list [u0; u1; u2:real^3]) = s2`);
6803 (ASM_REWRITE_TAC[]);
6804 (MATCH_MP_TAC (SET_RULE `(?b. a IN b /\ b SUBSET c) ==> a IN c`));
6805 (EXISTS_TAC `voronoi_list V [u0; u1:real^3]`);
6806 (ASM_REWRITE_TAC[]);
6807 (MATCH_MP_TAC (SET_RULE `(?b. a SUBSET b /\ b SUBSET c) ==> a SUBSET c`));
6808 (EXISTS_TAC `convex hull voronoi_list V [u0;u1:real^3]`);
6809 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6810 (REWRITE_TAC[SUBSET; IN_SET_IMP_IN_CONVEX_HULL_SET]);
6811 (REWRITE_TAC[set_of_list]);
6812 (MATCH_MP_TAC (SET_RULE `(?b. a IN b /\ b SUBSET c) ==> a IN c`));
6813 (EXISTS_TAC `convex hull {u0,u1:real^3}`);
6814 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6815 (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
6817 (NEW_GOAL `norm (u0 - s1) = norm (u1 - s1:real^3)`);
6818 (ASM_REWRITE_TAC[set_of_list; Rogers.CIRCUMCENTER_2; midpoint]);
6820 (NEW_GOAL `norm (u0 - s2) pow 2 = norm (u1 - s2:real^3) pow 2`);
6821 (ASM_REWRITE_TAC[]);
6822 (NEW_GOAL `norm (u0 - s) pow 2 = norm (u1 - s:real^3) pow 2`);
6823 (ASM_REWRITE_TAC[]);
6824 (NEW_GOAL `norm (s2 - s) pow 2 = norm (s2 - t:real^3) pow 2`);
6825 (REWRITE_WITH `norm (s2 - s:real^3) pow 2 =
6826 norm (u1 - s) pow 2 - norm (u1 - s2) pow 2`);
6827 (ASM_REAL_ARITH_TAC);
6828 (REWRITE_WITH `norm (s2 - t:real^3) pow 2 =
6829 norm (u0 - t) pow 2 - norm (u0 - s2) pow 2`);
6830 (ASM_REAL_ARITH_TAC);
6831 (REWRITE_TAC[ASSUME `norm (u0 - s2) pow 2 = norm (u1 - s2:real^3) pow 2`]);
6832 (AP_THM_TAC THEN AP_TERM_TAC);
6833 (REWRITE_TAC[GSYM dist]);
6834 (ASM_REWRITE_TAC[]);
6835 (ASM_CASES_TAC `s2 = s3:real^3`);
6836 (UNDISCH_TAC `between s (s2,s3:real^3)`);
6837 (UNDISCH_TAC `between t (s2,s3:real^3)`);
6838 (REWRITE_TAC[ASSUME `s2 = s3:real^3`; BETWEEN_REFL_EQ]);
6843 (UNDISCH_TAC `between s (s2,s3:real^3)`);
6844 (REWRITE_TAC[BETWEEN_IN_CONVEX_HULL; IN; CONVEX_HULL_2; IN_ELIM_THM]);
6846 (REWRITE_TAC[ASSUME `s:real^3 = u % s2 + v % s3`]);
6847 (REWRITE_WITH `norm (s2 - (u % s2 + v % s3)) = v * norm (s3 - s2:real^3)`);
6848 (REWRITE_WITH `s2 - (u % s2 + v % s3) = (u + v) % s2 - (u % s2 + v % s3:real^3)`);
6849 (ASM_REWRITE_TAC[]);
6851 (REWRITE_TAC[VECTOR_ARITH `(u + v) % s2 - (u % s2 + v % s3) = --v % (s3 - s2)`; NORM_MUL]);
6852 (AP_THM_TAC THEN AP_TERM_TAC);
6853 (ASM_REAL_ARITH_TAC);
6855 (UNDISCH_TAC `between t (s2,s3:real^3)`);
6856 (REWRITE_TAC[BETWEEN_IN_CONVEX_HULL; IN; CONVEX_HULL_2; IN_ELIM_THM]);
6858 (REWRITE_TAC[ASSUME `t:real^3 = u' % s2 + v' % s3`]);
6859 (REWRITE_WITH `norm (s2 - (u' % s2 + v' % s3)) = v' * norm (s3 - s2:real^3)`);
6860 (REWRITE_WITH `s2 - (u' % s2 + v' % s3) = (u' + v') % s2 - (u' % s2 + v' % s3:real^3)`);
6861 (ASM_REWRITE_TAC[]);
6863 (REWRITE_TAC[VECTOR_ARITH `(u' + v') % s2 - (u' % s2 + v' % s3) = --v' % (s3 - s2)`; NORM_MUL]);
6864 (AP_THM_TAC THEN AP_TERM_TAC);
6865 (ASM_REAL_ARITH_TAC);
6866 (REWRITE_TAC[REAL_ARITH
6867 `(a * b) pow 2 = (c * b) pow 2 <=> (a pow 2 - c pow 2) * (b pow 2) = &0`]);
6869 (ASM_CASES_TAC `norm (s3 - s2:real^3) pow 2 = &0`);
6871 (UP_ASM_TAC THEN REWRITE_TAC[Trigonometry2.POW2_EQ_0]);
6872 (REWRITE_TAC[NORM_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
6875 (NEW_GOAL `v pow 2 - v' pow 2 = &0`);
6876 (UP_ASM_TAC THEN UP_ASM_TAC THEN REWRITE_TAC[REAL_ENTIRE]);
6878 (NEW_GOAL `v = v':real`);
6879 (UP_ASM_TAC THEN REWRITE_TAC[REAL_ARITH `a - b = &0 <=> a = b`]);
6880 (ASM_MESON_TAC[Trigonometry2.EQ_POW2_COND]);
6881 (NEW_GOAL `u = u':real`);
6882 (ASM_REAL_ARITH_TAC);
6883 (ASM_REWRITE_TAC[]);
6884 (ASM_MESON_TAC[])]);;
6886 (* ====================================================================== *)
6889 let NUMSEG_012 = prove_by_refinement (
6891 [(REWRITE_TAC[IN_NUMSEG_0; SET_EQ_LEMMA]);
6893 (ASM_SET_TAC[ARITH_RULE `0 <= 2 /\ 1 <= 2 /\ 2 <= 2`]);
6894 (UP_ASM_TAC THEN REWRITE_TAC[ARITH_RULE `x <= 2 <=> x = 0 \/ x = 1 \/ x = 2`]);
6897 let SET_OF_LIST_TRUN2_LEFT_ACTION_LIST2 = prove_by_refinement (
6898 `!V ul p. packing V /\ saturated V /\ barV V 3 ul /\
6900 (set_of_list (truncate_simplex 2 (left_action_list p ul)) =
6901 set_of_list (truncate_simplex 2 ul))`,
6902 [(REPEAT STRIP_TAC);
6903 (NEW_GOAL `?u0 u1 u2 u3:real^3. ul = [u0;u1;u2;u3]`);
6904 (MATCH_MP_TAC BARV_3_EXPLICIT);
6905 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6906 (UP_ASM_TAC THEN STRIP_TAC);
6907 (ASM_REWRITE_TAC[left_action_list; LENGTH;TRUNCATE_SIMPLEX_EXPLICIT_2;
6908 ARITH_RULE `SUC (SUC (SUC (SUC 0))) = 4`; TABLE_4;set_of_list]);
6910 (NEW_GOAL `inverse (p:num->num) permutes 0..2`);
6911 (ASM_SIMP_TAC[PERMUTES_INVERSE]);
6912 (NEW_GOAL `!i. i IN {0,1,2} ==> inverse p i IN {0,1,2}`);
6914 (UNDISCH_TAC `inverse p permutes 0..2` THEN REWRITE_TAC[permutes]);
6915 (REWRITE_TAC[EXISTS_UNIQUE] THEN REPEAT STRIP_TAC);
6916 (ABBREV_TAC `j = inverse (p:num->num) i`);
6917 (ASM_CASES_TAC `~(j IN 0..2)`);
6919 (NEW_GOAL `inverse p j = j:num`);
6921 (NEW_GOAL `?x:num. inverse p x = j:num /\ (!y'. inverse p y' = j ==> y' = x)`);
6922 (ASM_REWRITE_TAC[]);
6923 (UP_ASM_TAC THEN STRIP_TAC);
6924 (NEW_GOAL `i = x:num`);
6925 (FIRST_ASSUM MATCH_MP_TAC);
6927 (NEW_GOAL `j = x:num`);
6928 (FIRST_ASSUM MATCH_MP_TAC);
6930 (NEW_GOAL `~(i IN 0..2)`);
6932 (UP_ASM_TAC THEN REWRITE_TAC[IN_NUMSEG]);
6933 (ASM_SET_TAC[ARITH_RULE `0 <= 0 /\ 0 <= 1 /\ 0 <= 2 /\ 0 <= 2 /\ 1 <= 2 /\ 2 <= 2`]);
6935 (UP_ASM_TAC THEN REWRITE_TAC[IN_NUMSEG; SET_RULE `i IN {a,b,c} <=> i = a \/ i = b \/ i = c`]);
6937 (NEW_GOAL `EL 0 [u0; u1; u2; u3:real^3] = u0 /\ EL 1 [u0; u1; u2; u3] = u1 /\
6938 EL 2 [u0; u1; u2; u3] = u2`);
6939 (REWRITE_TAC[EL;HD;ARITH_RULE `1 = SUC 0 /\ 2 = SUC 1`;TL]);
6941 (REWRITE_TAC[SET_EQ_LEMMA]);
6943 (NEW_GOAL `!i. i IN {0,1,2} ==>
6944 EL (inverse p i) [u0; u1; u2; u3:real^3] IN {u0,u1,u2}`);
6946 (NEW_GOAL `inverse (p:num->num) i IN {0, 1, 2} `);
6948 (ASM_CASES_TAC `inverse (p:num->num) i = 0`);
6949 (ASM_REWRITE_TAC[]);
6951 (ASM_CASES_TAC `inverse (p:num->num) i = 1`);
6952 (ASM_REWRITE_TAC[]);
6954 (ASM_CASES_TAC `inverse (p:num->num) i = 2`);
6955 (ASM_REWRITE_TAC[]);
6962 (ASM_CASES_TAC `x = u0:real^3`);
6963 (NEW_GOAL `?i. i IN {0,1,2} /\ inverse p i = 0`);
6964 (UNDISCH_TAC `inverse p permutes 0..2` THEN
6965 REWRITE_TAC[permutes; EXISTS_UNIQUE] THEN REPEAT STRIP_TAC);
6966 (NEW_GOAL `?s. inverse (p:num->num) s = 0 /\ (!y'. inverse p y' = 0 ==> y' = s)`);
6967 (ASM_REWRITE_TAC[]);
6968 (FIRST_ASSUM CHOOSE_TAC);
6969 (EXISTS_TAC `s:num`);
6970 (ASM_REWRITE_TAC[]);
6971 (REWRITE_TAC[NUMSEG_012]);
6972 (ONCE_REWRITE_TAC[MESON[] `s <=> ~s ==> F`]);
6974 (NEW_GOAL `inverse p s = s:num`);
6975 (FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]);
6976 (NEW_GOAL `~(0 IN 0..2)`);
6978 (UP_ASM_TAC THEN REWRITE_TAC[IN_NUMSEG_0]);
6980 (UP_ASM_TAC THEN STRIP_TAC);
6981 (NEW_GOAL `x = EL (inverse p (i:num)) [u0;u1;u2;u3:real^3]`);
6982 (ASM_REWRITE_TAC[]);
6986 (ASM_CASES_TAC `x = u1:real^3`);
6987 (NEW_GOAL `?i. i IN {0,1,2} /\ inverse p i = 1`);
6988 (UNDISCH_TAC `inverse p permutes 0..2` THEN
6989 REWRITE_TAC[permutes; EXISTS_UNIQUE] THEN REPEAT STRIP_TAC);
6990 (NEW_GOAL `?s. inverse (p:num->num) s = 1 /\ (!y'. inverse p y' = 1 ==> y' = s)`);
6991 (ASM_REWRITE_TAC[]);
6992 (FIRST_ASSUM CHOOSE_TAC);
6993 (EXISTS_TAC `s:num`);
6994 (ASM_REWRITE_TAC[]);
6995 (REWRITE_TAC[NUMSEG_012]);
6996 (ONCE_REWRITE_TAC[MESON[] `s <=> ~s ==> F`]);
6998 (NEW_GOAL `inverse p s = s:num`);
6999 (FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]);
7000 (NEW_GOAL `~(1 IN 0..2)`);
7002 (UP_ASM_TAC THEN REWRITE_TAC[IN_NUMSEG_0]);
7004 (UP_ASM_TAC THEN STRIP_TAC);
7005 (NEW_GOAL `x = EL (inverse p (i:num)) [u0;u1;u2;u3:real^3]`);
7006 (ASM_REWRITE_TAC[]);
7009 (ASM_CASES_TAC `x = u2:real^3`);
7010 (NEW_GOAL `?i. i IN {0,1,2} /\ inverse p i = 2`);
7011 (UNDISCH_TAC `inverse p permutes 0..2` THEN
7012 REWRITE_TAC[permutes; EXISTS_UNIQUE] THEN REPEAT STRIP_TAC);
7013 (NEW_GOAL `?s. inverse (p:num->num) s = 2 /\ (!y'. inverse p y' = 2 ==> y' = s)`);
7014 (ASM_REWRITE_TAC[]);
7015 (FIRST_ASSUM CHOOSE_TAC);
7016 (EXISTS_TAC `s:num`);
7017 (ASM_REWRITE_TAC[]);
7018 (REWRITE_TAC[NUMSEG_012]);
7019 (ONCE_REWRITE_TAC[MESON[] `s <=> ~s ==> F`]);
7021 (NEW_GOAL `inverse p s = s:num`);
7022 (FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]);
7023 (NEW_GOAL `~(2 IN 0..2)`);
7025 (UP_ASM_TAC THEN REWRITE_TAC[IN_NUMSEG_0]);
7027 (UP_ASM_TAC THEN STRIP_TAC);
7028 (NEW_GOAL `x = EL (inverse p (i:num)) [u0;u1;u2;u3:real^3]`);
7029 (ASM_REWRITE_TAC[]);
7033 (ASM_MESON_TAC[])]);;
7036 (* ====================================================================== *)
7039 let SQRT2_LT_2 = prove_by_refinement (
7041 [(REWRITE_WITH `sqrt (&2) < &2 <=> sqrt (&2) pow 2 < &2 pow 2`);
7042 (MATCH_MP_TAC Pack1.bp_bdt);
7043 (ASM_SIMP_TAC[SQRT_POS_LE; ARITH_RULE `&0 <= &2`]);
7044 (ASM_SIMP_TAC[ARITH_RULE `&0 <= &2 /\ &2 pow 2 = &4 /\ &2 < &4`;