Update from HH
[Flyspeck/.git] / text_formalization / packing / marchal_cells_2_new.hl
1 (* ========================================================================= *)
2 (*                FLYSPECK - BOOK FORMALIZATION                              *)
3 (*                                                                           *)
4 (*      Authour   : VU KHAC KY                                               *)
5 (*      Book lemma:                                                          *)
6 (*      Chaper    : Packing (Marchal Cells 2)                                *)
7 (*      Date      : October 3, 2010                                          *)
8 (*                                                                           *)
9 (* ========================================================================= *)
10
11 module Marchal_cells_2_new = struct
12 (*
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";;
22
23 (* =================  Loaded files   ======================================== *)
24
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";;
38
39 flyspeck_needs "packing/marchal_cells.hl";;
40 flyspeck_needs "packing/EMNWUUS.hl";; 
41
42 *)
43
44 (* ====================== Open appropriate files ======================= *)
45
46 open Rogers;;
47 open Prove_by_refinement;;
48 open Vukhacky_tactics;;
49 open Pack_defs;;
50 open Pack_concl;; 
51 open Pack1;;
52 open Sphere;; 
53 open Marchal_cells;;
54 open Emnwuus;;
55
56 (*
57 let seans_fn () =
58 let (tms,tm) = top_goal () in
59 let vss = map frees (tm::tms) in
60 let vs = setify (flat vss) in
61 map dest_var vs;;
62 *)
63
64 (* ======================================================================= *)
65 (* Lemma 1 *)
66 let AFF_GE_2_2 = prove
67  (`!x v w.
68         DISJOINT {x,v} {w,z}
69         ==> aff_ge {x,v} {w, z} =
70              {y | ?t1 t2 t3 t4.
71                      &0 <= t3 /\ &0 <= t4 /\
72                      t1 + t2 + t3 + t4 = &1 /\
73                      y = t1 % x + t2 % v + t3 % w + t4 % z}`,
74   AFF_TAC);;
75 (* ======================================================================= *)
76 (* Lemma 2 *)
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)`,
80 [ (REPEAT STRIP_TAC);
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]);
93  (ARITH_TAC);
94  (ASM_REWRITE_TAC[]);
95  (REWRITE_TAC[FINITE_NUMSEG_LT])]);;
96
97 (* ======================================================================= *)
98 (* Lemma 3 *)
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]);
103  (REPEAT STRIP_TAC);
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`);
109
110   (* 2 Subgoals *)
111
112  (NEW_GOAL 
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`);
115    (* Subgoal 1.1 *)
116
117  (NEW_GOAL
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);
124
125  (NEW_GOAL
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);
133
134  (NEW_GOAL 
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`);
137    (* Subgoal 1.2 *)
138
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);
143  STRIP_TAC;
144  (REWRITE_TAC[dist]);
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]);
156
157  (MATCH_MP_TAC REAL_LE_MUL);
158  (ASM_REWRITE_TAC[DIST_POS_LE]);
159  (ASM_REAL_ARITH_TAC);
160
161 (* Subgoal 2 *)
162
163  (NEW_GOAL `u = &0`);
164  (ASM_REAL_ARITH_TAC);
165  (NEW_GOAL `v = &1`);
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])]);; 
169
170 (* ======================================================================= *)
171 (* Lemma 4 *)
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]]);;
178
179 (* ======================================================================= *)
180 (* Lemma 5 *)
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 @
185 [IN_ELIM_THM; IN] in
186 let PRESET_TAC =
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
191 fun ths ->
192 PRESET_TAC THEN
193 (if ths = [] then ALL_TAC else MP_TAC(end_itlist CONJ ths)) THEN
194 MESON_TAC ths ;;
195
196 (* ======================================================================= *)
197 (* Lemma 6 *)
198 let DISJOINT_KY_LEMMA = prove_by_refinement (
199  `~(x = y) /\ ~(x = z) ==> DISJOINT {x} {y, z:real^3}`,
200 [(REPEAT STRIP_TAC);
201  (REWRITE_TAC[DISJOINT; INTER ; IN; IN_ELIM_THM;Geomdetail.IN_ACT_SING]);
202  (MATCH_MP_TAC (MESON [] `(~a ==> F) ==> a`));
203  (DISCH_TAC);
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)`);
209  (TRUONG_SET_TAC[]);
210  (ASM_REWRITE_TAC[]);
211  (ASM_MESON_TAC[])]);;
212
213 (* ======================================================================= *)
214 (* Lemma 7 *)
215
216
217 let DIHV_SYM = prove_by_refinement (
218  `!(x:real^N) y z t. dihV x y z t = dihV y x z t`,
219 [ (REPEAT GEN_TAC);
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`));
223  (REPEAT STRIP_TAC);
224   (* Break into 2 subgoals with similar proofs *)
225    
226   (* Subgoal 1 *)
227    (EXPAND_TAC "vap'" THEN EXPAND_TAC "vap");
228
229      (REWRITE_WITH `(va':real^N) = va - vc`);
230      (EXPAND_TAC "va'" THEN EXPAND_TAC "va" THEN EXPAND_TAC "vc");
231      (VECTOR_ARITH_TAC);
232
233      (REWRITE_WITH `(vc':real^N) = --vc`);
234      (EXPAND_TAC "vc'" THEN EXPAND_TAC "vc");
235      (VECTOR_ARITH_TAC);
236
237      (REWRITE_WITH 
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 `]);
240     (VECTOR_ARITH_TAC);
241
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]);
249  (VECTOR_ARITH_TAC);
250
251    (* Subgoal 2 *)
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");
255  (VECTOR_ARITH_TAC);
256
257    (REWRITE_WITH `(vc':real^N) = --vc`);
258    (EXPAND_TAC "vc'" THEN EXPAND_TAC "vc");
259    (VECTOR_ARITH_TAC);
260
261    (REWRITE_WITH 
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 `]);
264    (VECTOR_ARITH_TAC);
265  
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)]);;
274
275
276 (* ======================================================================= *)
277 (* Lemma 8 *)
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]);
281  (SET_TAC[])]);;
282
283 (* ======================================================================= *)
284 (* Lemma 9 *)
285 let MCELL_EXPLICIT = prove_by_refinement (
286  `!k ul V.
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)`);
294  (ARITH_TAC);
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)`]);
310  (MESON_TAC[])]);;
311
312 (* ======================================================================= *)
313 (* Lemma 10 *)
314 let EVENTUALLY_RADIAL_EMPTY = prove_by_refinement (
315  `!v:real^3. eventually_radial v {} `,
316 [(STRIP_TAC);
317  (REWRITE_TAC[eventually_radial;radial]);
318  (EXISTS_TAC `&1`);
319  (REWRITE_TAC[REAL_ARITH `&1 > &0`;INTER_SUBSET]);
320  (REPEAT STRIP_TAC);
321  (NEW_GOAL `F`);
322  (DEL_TAC THEN DEL_TAC THEN UP_ASM_TAC);
323  (REWRITE_TAC[INTER_EMPTY]);
324  (SET_TAC[]);
325  (UP_ASM_TAC THEN MESON_TAC[])]);;
326
327 (* ======================================================================= *)
328 (* Lemma 11 *)
329 let EVENTUALLY_RADIAL_NOT_IN_CLOSED_SET = prove_by_refinement (
330  `!v:real^3 S. ~(S v) /\ (closed S)==> eventually_radial v S`,
331 [(REPEAT STRIP_TAC);
332  (NEW_GOAL `?r. r > &0 /\ ball(v:real^3, r) INTER S = {}`);
333  (UP_ASM_TAC THEN REWRITE_TAC[closed; open_def]);
334  (DISCH_TAC);
335  (MP_TAC (SPEC `v:real^3` (ASSUME `!x. x IN (:real^3) DIFF S
336           ==> (?e. &0 < e /\
337                    (!x'. dist (x',x) < e ==> x' IN (:real^3) DIFF S))`)));
338  (DISCH_TAC);
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`);
346  (STRIP_TAC);
347  (ASM_REAL_ARITH_TAC);
348  (REWRITE_TAC[ball]);
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]);
354  (MESON_TAC[]);
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]);
361  (REPEAT STRIP_TAC);
362  (NEW_GOAL `F`);
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`);
365  (SET_TAC[]);
366  (ASM_REWRITE_TAC[]);
367  (SET_TAC[]);
368  (UP_ASM_TAC THEN MESON_TAC[])]);;
369
370 (* ======================================================================= *)
371 (* Lemma 12 *)
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]);;
375
376 (* ======================================================================= *)
377 (* Lemma 13 *)
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]);
394  (ARITH_TAC);
395  (REWRITE_TAC[FINITE_NUMSEG_LT])]);;
396
397 (* ======================================================================= *)
398 (* Lemma 14 *)
399 let CLOSED_SET_OF_LIST_KY_LEMMA_1 = prove_by_refinement (
400  `!V ul.
401      saturated V /\ packing V /\ barV V 3 (ul:(real^3)list)
402      ==> closed
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 (* ======================================================================= *)
418 (* Lemma 15 *)
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])]);;
433
434 (* ======================================================================= *)
435 (* Lemma 16 *)
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]);
445  (REPEAT STRIP_TAC);
446  (UP_ASM_TAC THEN REAL_ARITH_TAC);
447  (ASM_REAL_ARITH_TAC);
448  (REWRITE_TAC[open_def;IN;IN_ELIM_THM]);
449  (REPEAT STRIP_TAC);
450  (NEW_GOAL `~(v0 = v1:real^3)`);
451  STRIP_TAC;
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]);
454  (REAL_ARITH_TAC);
455
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))`);
459  (STRIP_TAC);
460  (MATCH_MP_TAC REAL_LT_DIV);
461  (STRIP_TAC);
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]);
467
468  (REPEAT STRIP_TAC);
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))`);
476  (VECTOR_ARITH_TAC);
477
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);
485  (STRIP_TAC);
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);
492
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`);
497  (ASM_REWRITE_TAC[]);
498  (REWRITE_TAC[REAL_ARITH `t + c * b < s - c * b * a <=> c * (b * a + b) < s - t
499 `]);
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[])]);;
507
508 (* ======================================================================= *)
509 (* Lemma 17 *)
510 let BARV_IMP_HL_1_POS_LT = prove_by_refinement (
511  `!V ul:(real^3)list.
512      saturated V /\ packing V /\ barV V 3 ul 
513      ==> &0 < hl (truncate_simplex 1 ul)`,
514 [(REPEAT STRIP_TAC);
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`);
523  (EXISTS_TAC `1`);
524  (ASM_REWRITE_TAC[]);
525  (EXPAND_TAC "vl");
526  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
527  (EXISTS_TAC `3`);
528  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 3`]);
529
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)`);
533  (ASM_REWRITE_TAC[]);
534  (NEW_GOAL `hl (vl:(real^3)list) = &0`);
535  (ASM_REAL_ARITH_TAC);
536  (NEW_GOAL `F`);
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]);
543  STRIP_TAC;
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)`);
547  (EXPAND_TAC "vl");
548  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
549  (EXISTS_TAC `3`);
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]);
559  (ARITH_TAC);
560  (UP_ASM_TAC THEN MESON_TAC[])]);;
561
562 (* ======================================================================= *)
563 (* Lemma 18 *)
564 let CLOSED_MCELL = prove_by_refinement (
565  `!V ul k.
566      saturated V /\ packing V /\ barV V 3 ul
567      ==> closed (mcell k V ul)`,
568 [(REPEAT STRIP_TAC);
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]);
573
574  (ASM_CASES_TAC `k = 1`);
575  (ASM_REWRITE_TAC[MCELL_EXPLICIT;mcell1]);
576  (COND_CASES_TAC);
577  (MATCH_MP_TAC CLOSED_DIFF);
578  (STRIP_TAC);
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]);
583
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`);
591
592  (ASM_REWRITE_TAC[MCELL_EXPLICIT;mcell2]);
593  (COND_CASES_TAC);
594  LET_TAC;
595  (MATCH_MP_TAC CLOSED_INTER);
596  (STRIP_TAC);
597
598  (MATCH_MP_TAC CLOSED_RCONE_GE);
599  (EXPAND_TAC "a");
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]);
603
604  (MATCH_MP_TAC CLOSED_INTER);
605  (STRIP_TAC);
606  (MATCH_MP_TAC CLOSED_RCONE_GE);
607  (EXPAND_TAC "a");
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]);
611
612  (MATCH_MP_TAC CLOSED_AFF_GE);
613  (MESON_TAC[Geomdetail.FINITE6]);
614  (MESON_TAC[CLOSED_EMPTY]);
615
616  (ASM_CASES_TAC `k = 3`);
617  (ASM_REWRITE_TAC[MCELL_EXPLICIT;mcell3]);
618  (COND_CASES_TAC);
619  (ASM_MESON_TAC[CLOSED_SET_OF_LIST_KY_LEMMA_1]);
620  (MESON_TAC[CLOSED_EMPTY]);
621
622  (NEW_GOAL `k >= 4`);
623  (ASM_ARITH_TAC);
624  (ASM_SIMP_TAC[MCELL_EXPLICIT;mcell4]);
625  (COND_CASES_TAC);
626  (ASM_MESON_TAC[CLOSED_SET_OF_LIST_KY_LEMMA_2]);
627  (MESON_TAC[CLOSED_EMPTY])
628 ]);;
629
630 (* ======================================================================= *)
631 (* Lemma 19 *)
632 let BARV_IMP_u0_IN_V = prove_by_refinement (
633  `!V ul u0 u1 u2 u3.
634      saturated V /\ packing V /\ barV V 3 ul /\ ul = [u0;u1;u2;u3:real^3]
635      ==> u0 IN V`,
636 [(REWRITE_TAC[BARV; VORONOI_NONDG]);
637  (REPEAT STRIP_TAC);
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]`);
641  (ASM_REWRITE_TAC[]);
642  (NEW_GOAL `set_of_list [u0:real^3] SUBSET V`);
643  (ASM_SIMP_TAC[]);
644  (UP_ASM_TAC THEN REWRITE_TAC[set_of_list]);
645  (SET_TAC[])]);;
646
647 (* ======================================================================= *)
648 (* Lemma 20 *)
649 let ROGERS_INTER_V_LEMMA = prove_by_refinement (
650  `!V ul v:real^3.
651      saturated V /\ packing V /\ barV V 3 ul /\ v IN V /\ (rogers V ul v)
652      ==> v = HD ul`,
653 [(REPEAT STRIP_TAC);
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]);
661
662  (NEW_GOAL `(rogers V ul)  SUBSET (voronoi_closed V (u0:real^3))`);
663  (REWRITE_TAC[SUBSET]);
664  (REPEAT STRIP_TAC);
665  (NEW_GOAL `!p. p IN voronoi_closed V u0 <=>
666                (?vl. vl IN barV V 3 /\
667                      p IN rogers V vl /\
668                      truncate_simplex 0 vl = [u0:real^3])`);
669  (GEN_TAC THEN MATCH_MP_TAC GLTVHUM);
670  (ASM_REWRITE_TAC[]);
671  (ASM_MESON_TAC[BARV_IMP_u0_IN_V]);
672  (ASM_REWRITE_TAC[]);
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)`);
676  (ASM_SET_TAC[]);
677  (UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed;IN;IN_ELIM_THM]);
678  (DISCH_TAC);
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]);
683  (DISCH_TAC);
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])]);;
689
690 (* ======================================================================= *)
691 (* Lemma 21 *)
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[]);;
701
702 (* ======================================================================= *)
703 (* Lemma 22 *)
704 let REAL_LE_DIV_SIMPLIFY_KY_LEMMA = prove_by_refinement (
705  `!a b c. &0 < a /\ b <= c / a ==>  a * b <=  c`,
706 [(REPEAT STRIP_TAC);
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[])]);;
716
717 (* ======================================================================= *)
718 (* Lemma 23 *)
719
720 let EVENTUALLY_RADIAL_CONVEX_HULL_4_sub1 = prove_by_refinement (
721  `!a b c d:real^3. 
722    ~( a IN convex hull {b , c, d})
723    ==> eventually_radial a (convex hull {a, b , c, d})`,
724 [(REPEAT STRIP_TAC);
725  (REWRITE_TAC[eventually_radial]);
726  (ABBREV_TAC `s = convex hull {b , c, d:real^3}`);
727
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);
731  (EXPAND_TAC "s");
732  (STRIP_TAC);
733  (MATCH_MP_TAC CLOSED_CONVEX_HULL_FINITE);
734  (REWRITE_TAC[Geomdetail.FINITE6]);
735  (REWRITE_TAC[CONVEX_HULL_EQ_EMPTY]);
736  (SET_TAC[]);
737  (FIRST_X_ASSUM CHOOSE_TAC);
738  (EXISTS_TAC `dist (a, x:real^3)`);
739
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);
744
745  (FIRST_ASSUM MATCH_MP_TAC);
746  (EXPAND_TAC "s");
747  (MATCH_MP_TAC (SET_RULE `b IN {b} /\ {b} SUBSET s ==> b IN s `));
748  (STRIP_TAC);
749  (SET_TAC[]);
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[]);
755  (EXPAND_TAC "s");
756  (MATCH_MP_TAC Marchal_cells.CONVEX_HULL_SUBSET);
757  (SET_TAC[]);
758
759  (FIRST_ASSUM MATCH_MP_TAC);
760  (EXPAND_TAC "s");
761  (MATCH_MP_TAC (SET_RULE `c IN {c} /\ {c} SUBSET s ==> c IN s `));
762  (STRIP_TAC);
763  (SET_TAC[]);
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[]);
769  (EXPAND_TAC "s");
770  (MATCH_MP_TAC Marchal_cells.CONVEX_HULL_SUBSET);
771  (SET_TAC[]);
772
773
774  (FIRST_ASSUM MATCH_MP_TAC);
775  (EXPAND_TAC "s");
776  (MATCH_MP_TAC (SET_RULE `c IN {c} /\ {c} SUBSET s ==> c IN s `));
777  (STRIP_TAC);
778  (SET_TAC[]);
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[]);
784  (EXPAND_TAC "s");
785  (MATCH_MP_TAC Marchal_cells.CONVEX_HULL_SUBSET);
786  (SET_TAC[]);
787
788 (* ======== break main lemma into 2 smaller ones =============== *)
789 (* subgoal 1 *)
790
791  (STRIP_TAC);
792  (ASM_CASES_TAC `dist (a:real^3, x) = &0`);
793  (UP_ASM_TAC THEN REWRITE_TAC[DIST_EQ_0]);
794  (DISCH_TAC);
795  (NEW_GOAL `F`);
796  (ASM_MESON_TAC[]);
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);
801
802 (* subgoal 2 *)
803
804  (REWRITE_TAC[radial; INTER_SUBSET]);
805  (REPEAT STRIP_TAC);
806  (REWRITE_TAC[IN_INTER]);
807  (STRIP_TAC);
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`]);
813  (VECTOR_ARITH_TAC);
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]);
818  (REPEAT STRIP_TAC);
819  (EXISTS_TAC `(&1 / (&1 - u')) % (v % b + w % c + z % (d:real^3))`);
820  (STRIP_TAC);
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')`);
825  (REPEAT STRIP_TAC);
826
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)`]);
837  (STRIP_TAC);
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`]);
843  (ASM_MESON_TAC[]);
844
845  (REWRITE_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC]);
846  (REWRITE_TAC[REAL_ARITH `!x y. &1 / x * y = y / x`]);
847
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`]);
856  (STRIP_TAC);
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`]);
862  (ASM_MESON_TAC[]);
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')`);
866  (REPEAT STRIP_TAC);
867
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`]);
872  (AP_TERM_TAC);
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)`);
879  (REWRITE_TAC[dist]);
880  (NORM_ARITH_TAC);
881  (MATCH_MP_TAC REAL_LE_DIV_SIMPLIFY_KY_LEMMA);
882  (ASM_REWRITE_TAC[]);
883
884  (STRIP_TAC);
885  (ASM_CASES_TAC `(&0 < &1 - u')`);
886  (ASM_REWRITE_TAC[]);
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`]);
898  (ASM_MESON_TAC[]);
899
900  (UNDISCH_TAC `x IN s /\ (!y. y IN s ==> dist (a:real^3,x) <= dist (a,y))`);
901  (REPEAT STRIP_TAC);
902  (FIRST_ASSUM MATCH_MP_TAC);
903  (EXPAND_TAC "s" THEN REWRITE_TAC[CONVEX_HULL_3; IN; IN_ELIM_THM]);
904
905  (EXISTS_TAC ` v / (&1 - u')`);
906  (EXISTS_TAC ` w / (&1 - u')`);
907  (EXISTS_TAC ` z / (&1 - u')`);
908  (REPEAT STRIP_TAC);
909
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)`]);
920  (STRIP_TAC);
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`]);
926  (ASM_MESON_TAC[]);
927
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 `);
930  (ASM_REWRITE_TAC[]);
931  (REWRITE_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC]);
932  (REWRITE_TAC[REAL_ARITH `&1 / x  * y = y / x`]);
933  (VECTOR_ARITH_TAC);
934  (REWRITE_TAC[VECTOR_ADD_LDISTRIB]);
935
936
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`]);
942  (STRIP_TAC);
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`]);
948  (ASM_MESON_TAC[]);
949  (REWRITE_TAC[VECTOR_MUL_LID]);
950
951
952
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]);
965  (DISCH_TAC);
966  (NEW_GOAL `F`);
967  (ASM_MESON_TAC[]);
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);
972
973  
974  (ASM_REWRITE_TAC[]);
975  (ASM_REAL_ARITH_TAC);
976  (MATCH_MP_TAC REAL_LE_MUL);
977  (ASM_REAL_ARITH_TAC);
978  (ASM_REAL_ARITH_TAC);
979
980
981  (REWRITE_TAC[VECTOR_SUB_RDISTRIB; VECTOR_ADD_LDISTRIB; VECTOR_MUL_LID; VECTOR_MUL_ASSOC]);
982
983  (REWRITE_TAC [VECTOR_ARITH `a + m % u = a - t + t + n % u <=> (m - n) % u = vec 0`; VECTOR_MUL_EQ_0]);
984  (DISJ1_TAC);
985  (REWRITE_TAC[REAL_ARITH `(a * b) * &1 / b = a * (b / b)`]);
986
987
988 (* ======================================================================== *)
989
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);
994
995  (REWRITE_TAC[REAL_ARITH `!a. &1 - a = &0 <=> a = &1`]);
996  (STRIP_TAC);
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`]);
1002  (ASM_MESON_TAC[]);
1003
1004 (* ghep vao cuchuoi *)
1005
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`));
1015  (STRIP_TAC);
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);
1020  (SET_TAC[]);
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`]);
1024  (VECTOR_ARITH_TAC);
1025
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; 
1029 NORM_MUL]);
1030  (AP_THM_TAC THEN AP_TERM_TAC);
1031  (REWRITE_TAC[REAL_ABS_REFL]);
1032  (ASM_REAL_ARITH_TAC);
1033  (ASM_REWRITE_TAC[])]);;
1034
1035 (* ======================================================================= *)
1036 (* Lemma 24 *)
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
1040      ==> ~(HD ul IN
1041            convex hull
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`]);
1045  (REPEAT STRIP_TAC);
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);
1053  
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 *)
1061
1062  (NEW_GOAL `(a (HD ul)) IN voronoi_list V (truncate_simplex 1 (ul:(real^3)list))`);
1063  (EXPAND_TAC "a");
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);
1067  (EXISTS_TAC `1`);
1068  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
1069  (EXISTS_TAC `3`);
1070  (ASM_REWRITE_TAC[]);
1071  (ARITH_TAC);
1072
1073 (* Second estimation *)
1074
1075  (NEW_GOAL `((b:real^3->real^3) (a (HD ul))) IN voronoi_list V (truncate_simplex 2 (ul:(real^3)list))`);
1076  (EXPAND_TAC "b");
1077
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);
1081  (EXISTS_TAC `2`);
1082  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
1083  (EXISTS_TAC `3`);
1084  (ASM_REWRITE_TAC[]);
1085  (ARITH_TAC);
1086
1087 (* Third estimation *)
1088
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))`);
1090  (EXPAND_TAC "c");
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);
1094  (EXISTS_TAC `3`);
1095  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
1096  (EXISTS_TAC `3`);
1097  (ASM_REWRITE_TAC[]);
1098  (ARITH_TAC);
1099
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)`);
1103
1104
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]);
1113  (SET_TAC[]);
1114
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]);
1123  (SET_TAC[]);
1124
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);
1127  (ASM_SET_TAC[]);
1128
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]);
1135  (ASM_SET_TAC[]);
1136  (UP_ASM_TAC);
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`);
1140  (SET_TAC[]);
1141
1142
1143  (REWRITE_TAC[IN_INTER; voronoi_closed; IN; IN_ELIM_THM; INTERS; DIST_REFL]);
1144  (REPEAT STRIP_TAC);
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);
1164  (EXISTS_TAC `3`);
1165  (ASM_REWRITE_TAC[]);
1166  (ARITH_TAC);
1167
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)]);;
1171
1172 (* ======================================================================= *)
1173 (* Lemma 25 *)
1174 let RADIAL_VS_RADIAL_NORM = prove_by_refinement (
1175  `!(x:real^3) r C. radial r x C <=> radial_norm r x C`,
1176 [ (REPEAT GEN_TAC);
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])]);; 
1180
1181 (* ======================================================================= *)
1182 (* Lemma 26 *)
1183
1184 let EVENTUALLY_RADIAL_INTER = prove_by_refinement (
1185  `!(x:real^3) C C'. 
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]); 
1191  (REPEAT STRIP_TAC);
1192  (ASM_CASES_TAC `r >= r'`);
1193  (EXISTS_TAC `r':real`);
1194  (ASM_REWRITE_TAC[]);
1195
1196  (REWRITE_WITH `(C INTER C') INTER normball (x:real^3) r' =
1197                   (C INTER normball x r') INTER (C' INTER normball x r')`);
1198  (SET_TAC[]);
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]);
1203  (REPEAT STRIP_TAC);
1204  (REWRITE_TAC[INTER_SUBSET]);
1205
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]);
1210  (REPEAT STRIP_TAC);
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})`);
1215  (ASM_MESON_TAC[]);
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]);
1220  (REPEAT STRIP_TAC);
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[]);
1227
1228  (EXISTS_TAC `r:real`);
1229  (ASM_REWRITE_TAC[]);
1230
1231  (REWRITE_WITH `(C INTER C') INTER normball (x:real^3) r =
1232                   (C INTER normball x r) INTER (C' INTER normball x r)`);
1233  (SET_TAC[]);
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]);
1238  (REPEAT STRIP_TAC);
1239  (REWRITE_TAC[INTER_SUBSET]);
1240
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]);
1245  (REPEAT STRIP_TAC);
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'})`);
1250  (ASM_MESON_TAC[]);
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]);
1255  (REPEAT STRIP_TAC);
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[])]);;
1262
1263 (* ======================================================================= *)
1264 (* Lemma 27 *)
1265 let SET_EQ_LEMMA = SET_RULE 
1266    `A = B <=> (!x. (x IN A ==> x IN B) /\ (x IN B ==> x IN A))`;;
1267
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[])]);;
1282
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[])]);;
1295
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;
1303  REAL_ARITH_TAC]);;
1304
1305 (* ======================================================================= *)
1306 (* Lemma 28 *)
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]);
1312  (REPEAT STRIP_TAC);
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 (* ======================================================================= *)
1319 (* Lemma 29 *)
1320
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]);
1327  (REPEAT STRIP_TAC);
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`);
1332  (UP_ASM_TAC THEN 
1333    ASM_REWRITE_TAC[Topology.affine_hull_2_fan; IN; IN_ELIM_THM]);
1334  (REPEAT STRIP_TAC);
1335  (ASM_REWRITE_TAC[CONVEX_HULL_2; IN_ELIM_THM]);
1336  (EXISTS_TAC `t1:real`);
1337  (EXISTS_TAC `t2:real`);
1338  (ASM_REWRITE_TAC[]);
1339  (STRIP_TAC);
1340
1341 (* Case 1 *)
1342
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)`);
1347  (VECTOR_ARITH_TAC);
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]);
1352  (VECTOR_ARITH_TAC);
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);
1357  (STRIP_TAC);
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);
1373
1374 (* Case 2 *)
1375
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)`);
1380  (VECTOR_ARITH_TAC);
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)`);
1384
1385  (ASM_REWRITE_TAC[VECTOR_MUL_LID]);
1386  (VECTOR_ARITH_TAC);
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);
1391  (STRIP_TAC);
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);
1407
1408  (ASM_REWRITE_TAC[])]);;
1409
1410 (* ======================================================================= *)
1411 (* Lemma 30 *)
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]);
1418  (REPEAT STRIP_TAC);
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[]);
1424  (UP_ASM_TAC THEN 
1425    ASM_REWRITE_TAC[Topology.affine_hull_2_fan; IN; IN_ELIM_THM]);
1426  (REPEAT STRIP_TAC);
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`]);
1432  (STRIP_TAC);
1433
1434 (* Case 1 : &0 <= t2 *)
1435
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)`);
1440  (VECTOR_ARITH_TAC);
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)`);
1444
1445  (ASM_REWRITE_TAC[VECTOR_MUL_LID]);
1446  (VECTOR_ARITH_TAC);
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);
1451  (STRIP_TAC);
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);
1467
1468 (* Case 2 : &0 <= t1 *)
1469
1470  (ASM_CASES_TAC `t1 < &0`);
1471  (NEW_GOAL `norm (x - a) <= norm (x - b:real^3)`);
1472  (ASM_SIMP_TAC[]);
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[]);
1479
1480
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]);
1488  (VECTOR_ARITH_TAC);
1489  (REWRITE_TAC[DOT_LMUL]);
1490  (REWRITE_WITH `(b - a:real^3) dot (x - s) = -- ((x - s) dot (a - b))`);
1491  (VECTOR_ARITH_TAC);
1492  (ASM_REWRITE_TAC[]);
1493  (REAL_ARITH_TAC);
1494
1495
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]);
1503  (VECTOR_ARITH_TAC);
1504  (REWRITE_TAC[DOT_LMUL]);
1505  (REWRITE_WITH `(a - b:real^3) dot (x - s) = ((x - s) dot (a - b))`);
1506  (VECTOR_ARITH_TAC);
1507  (ASM_REWRITE_TAC[]);
1508  (REAL_ARITH_TAC);
1509
1510
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]);
1517
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]);
1522  (VECTOR_ARITH_TAC);
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]);
1527  (VECTOR_ARITH_TAC);
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);
1531  (STRIP_TAC);
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)]);;
1547
1548 (* ======================================================================= *)
1549 (* Lemma 31 *)
1550 let RCONEGE_INTER_VORONOI_CLOSED_IMP_RCONEGE = prove_by_refinement(
1551  `!V a:real^3 b r x.
1552      packing V /\
1553      saturated V /\
1554      a IN V /\
1555      b IN V /\
1556      ~(a = b) /\
1557      &0 < r /\
1558      r <= &1 /\
1559      x IN rcone_ge a b r /\
1560      x IN voronoi_closed V a ==> x IN rcone_ge b a r`,
1561
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]);
1571  (DISCH_TAC);
1572  (SWITCH_TAC THEN UP_ASM_TAC THEN REWRITE_TAC[CONVEX_HULL_2;IN;IN_ELIM_THM]);
1573  (REPEAT STRIP_TAC);
1574
1575
1576
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)`);
1581  (VECTOR_ARITH_TAC);
1582  (REWRITE_WITH `(x - a) dot (b - a:real^3) = 
1583                  (a - s) dot (a - b) - (x - s) dot (a - b)`);
1584  (VECTOR_ARITH_TAC);
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]);
1589  (VECTOR_ARITH_TAC);
1590
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]);
1594  (VECTOR_ARITH_TAC);
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]);
1606
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]);
1614  (VECTOR_ARITH_TAC);
1615  (ASM_MESON_TAC[DOT_LMUL; REAL_MUL_RZERO;DOT_SYM]);
1616  (REWRITE_WITH `norm (s - b:real^3) = norm (b - s)`);
1617  (NORM_ARITH_TAC);
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]);
1622  (VECTOR_ARITH_TAC);
1623  (REWRITE_TAC[NORM_MUL; REAL_ABS_NEG]);
1624
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]);
1632  (VECTOR_ARITH_TAC);
1633  (ASM_MESON_TAC[DOT_LMUL; REAL_MUL_RZERO;DOT_SYM]);
1634  (REWRITE_WITH `norm (s - a:real^3) = norm (a - s)`);
1635  (NORM_ARITH_TAC);
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]);
1640  (VECTOR_ARITH_TAC);
1641  (REWRITE_TAC[NORM_MUL]);
1642
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]);
1655  (REPEAT STRIP_TAC);
1656  (NEW_GOAL `dist (x,a) <= dist (x,b:real^3)`);
1657  (FIRST_ASSUM MATCH_MP_TAC);
1658  (ASM_SET_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`);
1664  (ASM_MESON_TAC[]);
1665  (UP_ASM_TAC THEN REWRITE_TAC[dist]);
1666
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]);
1674  (VECTOR_ARITH_TAC);
1675  (ASM_MESON_TAC[DOT_LMUL; REAL_MUL_RZERO;DOT_SYM]);
1676
1677  (REWRITE_WITH `norm (s - a:real^3) = norm (a - s)`);
1678  (NORM_ARITH_TAC);
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]);
1683  (VECTOR_ARITH_TAC);
1684  (REWRITE_TAC[NORM_MUL]);
1685  (REWRITE_TAC[REAL_POW_MUL; REAL_POW2_ABS]);
1686
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]);
1694  (VECTOR_ARITH_TAC);
1695  (ASM_MESON_TAC[DOT_LMUL; REAL_MUL_RZERO;DOT_SYM]);
1696  (REWRITE_WITH `norm (s - b:real^3) = norm (b - s)`);
1697  (NORM_ARITH_TAC);
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]);
1702  (VECTOR_ARITH_TAC);
1703  (REWRITE_TAC[NORM_MUL; REAL_ABS_NEG; REAL_POW2_ABS; REAL_POW_MUL]);
1704
1705  (REWRITE_TAC[REAL_ARITH `a * x + b <= c * x + b <=> &0 <= x * (c - a)`]);
1706  (STRIP_TAC);
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[]);
1722
1723
1724 (* ======================================================================== *)
1725
1726  (ASM_CASES_TAC `&0 < norm (x:real^3 - b)`);
1727  (ASM_CASES_TAC `&0 < norm (x:real^3 - a)`);
1728
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[]);
1735
1736  (MATCH_MP_TAC (REAL_ARITH `(?x. a <= x /\ x <= b) ==> a <= b`));
1737
1738  (EXISTS_TAC `((x - a) dot (b - a)) / norm (x - a:real^3)`);
1739  (STRIP_TAC);
1740
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[]);
1747  (REWRITE_WITH 
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)`);
1750  (NORM_ARITH_TAC);
1751  (REAL_ARITH_TAC);
1752  (ASM_REAL_ARITH_TAC);
1753
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);
1762
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);
1775
1776  (NEW_GOAL `F`);
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);
1783
1784  (UNDISCH_TAC `x IN voronoi_closed V (a:real^3)`);
1785  (REWRITE_TAC[voronoi_closed;IN;IN_ELIM_THM]);
1786  (STRIP_TAC);
1787  (NEW_GOAL `dist (x,a) <= dist (x,b:real^3)`);
1788  (FIRST_X_ASSUM MATCH_MP_TAC);
1789  (ASM_SET_TAC[]);
1790  (UP_ASM_TAC THEN ASM_REWRITE_TAC[DIST_REFL]);
1791  (STRIP_TAC);
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);
1798  (ASM_MESON_TAC[]);
1799  (ASM_MESON_TAC[])]);;
1800
1801 (* ======================================================================= *)
1802 (* Lemma 32 *)
1803 let OMEGA_LIST_1_EXPLICIT_NEW = prove_by_refinement (
1804  `!a:real^3 b c d V ul.
1805      saturated V /\
1806      packing V /\
1807      ul IN barV V 3 /\
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);
1817  (EXISTS_TAC `1`);
1818  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 3`]);
1819  (MP_TAC (ASSUME `ul IN barV V 3`) THEN REWRITE_TAC[IN;BARV]);
1820
1821  (REPEAT STRIP_TAC);
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]);
1829  (ASM_MESON_TAC[]);
1830  (ASM_REWRITE_TAC[OMEGA_LIST_TRUNCATE_1])]);;
1831
1832 (* ======================================================================= *)
1833 (* Lemma 33 *)
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);
1843  (ASM_SET_TAC[])]);;
1844
1845 (* ======================================================================= *)
1846 (* Lemma 34 *)
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})`,
1850
1851 [(REWRITE_TAC[BETWEEN_IN_CONVEX_HULL; CONVEX_HULL_2;IN; IN_ELIM_THM]);
1852  (REWRITE_TAC[SET_EQ_LEMMA]);
1853  (REPEAT STRIP_TAC);
1854  (UP_ASM_TAC THEN REWRITE_TAC[CONVEX_HULL_4; IN_UNION;IN;IN_ELIM_THM]);
1855  (REPEAT STRIP_TAC);
1856  (ASM_CASES_TAC `u = &0`);
1857  (DISJ1_TAC);
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);
1865  (VECTOR_ARITH_TAC);
1866  (NEW_GOAL `&0 < u `);
1867  (ASM_REAL_ARITH_TAC);
1868  (SWITCH_TAC THEN DEL_TAC);
1869  (ASM_CASES_TAC `v = &0`);
1870  (DISJ2_TAC);
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);
1878  (VECTOR_ARITH_TAC);
1879  (NEW_GOAL `&0 < v `);
1880  (ASM_REAL_ARITH_TAC);
1881  (SWITCH_TAC THEN DEL_TAC);
1882
1883
1884  (ASM_CASES_TAC `&0 < u' + v'`);
1885  (ASM_CASES_TAC `u' / (u' + v') <= u`);
1886
1887 (*CASE 1*)
1888  (DISJ2_TAC);
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]);
1895  (REPEAT STRIP_TAC);
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[]);
1905  (REAL_ARITH_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[]);
1912  (ASM_MESON_TAC[]);
1913
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[]);
1923  (REAL_ARITH_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 `]);
1929
1930  (MATCH_MP_TAC (VECTOR_ARITH `a = vec 0 /\ b = vec 0 ==> a + b = vec 0`));
1931  (STRIP_TAC);
1932  (REWRITE_TAC[VECTOR_ARITH 
1933   `(x % a - y % a = vec 0) <=> (x - y) % a = vec 0`; VECTOR_MUL_EQ_0]);
1934  (DISJ1_TAC);
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[]);
1940  (REFL_TAC);
1941
1942  (REWRITE_TAC[VECTOR_ARITH 
1943   `(x % a - y % a = vec 0) <=> (x - y) % a = vec 0`; VECTOR_MUL_EQ_0]);
1944  (DISJ1_TAC);
1945  (REAL_ARITH_TAC);
1946
1947 (*CASE 2*)
1948
1949
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);
1956
1957  (DISJ1_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]);
1964  (REPEAT STRIP_TAC);
1965
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[]);
1972
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`]);
1980
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]);
1987
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'`);
1990
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[]);
1998  (REAL_ARITH_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 `]);
2003
2004  (MATCH_MP_TAC (VECTOR_ARITH `a = vec 0 /\ b = vec 0 ==> b + a = vec 0`));
2005  (STRIP_TAC);
2006
2007  (REWRITE_TAC[VECTOR_ARITH 
2008   `(x % a - y % a = vec 0) <=> (x - y) % a = vec 0`; VECTOR_MUL_EQ_0]);
2009  (DISJ1_TAC);
2010  (REAL_ARITH_TAC);
2011  (REWRITE_TAC[VECTOR_ARITH 
2012   `(x % a - y % a = vec 0) <=> (x - y) % a = vec 0`; VECTOR_MUL_EQ_0]);
2013  (DISJ1_TAC);
2014
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[]);
2020  (REFL_TAC);
2021
2022 (* CASE 3 *)
2023
2024  (NEW_GOAL `u' + v' = &0`);
2025  (ASM_REAL_ARITH_TAC);
2026  (DISJ1_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`]);
2033  (REPEAT STRIP_TAC);
2034  (ASM_MESON_TAC[]);
2035  (ASM_MESON_TAC[]);
2036
2037 (* ================================ *)
2038
2039  (UP_ASM_TAC THEN REWRITE_TAC[IN_UNION]);
2040  (REPEAT STRIP_TAC);
2041
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]);
2050  (REPEAT STRIP_TAC);
2051  (ASM_CASES_TAC `x'' = a:real^3`);
2052  (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
2053  (ASM_SET_TAC[]);
2054  (ASM_CASES_TAC `x'' = d:real^3`);
2055  (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
2056  (ASM_SET_TAC[]);
2057  (ASM_CASES_TAC `x'' = c:real^3`);
2058  (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
2059  (ASM_SET_TAC[]);
2060  (NEW_GOAL `x'' = u % a + v % (b:real^3)`);
2061  (ASM_SET_TAC[]);
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}`);
2065  (STRIP_TAC);
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);
2070  (SET_TAC[]);
2071  (ASM_SET_TAC[]);
2072
2073 (* == *)
2074
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]);
2083  (REPEAT STRIP_TAC);
2084  (ASM_CASES_TAC `x'' = b:real^3`);
2085  (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
2086  (ASM_SET_TAC[]);
2087  (ASM_CASES_TAC `x'' = d:real^3`);
2088  (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
2089  (ASM_SET_TAC[]);
2090  (ASM_CASES_TAC `x'' = c:real^3`);
2091  (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
2092  (ASM_SET_TAC[]);
2093  (NEW_GOAL `x'' = u % a + v % (b:real^3)`);
2094  (ASM_SET_TAC[]);
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}`);
2098  (STRIP_TAC);
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);
2103  (SET_TAC[]);
2104  (ASM_SET_TAC[])]);;
2105
2106 (* ======================================================================= *)
2107 (* Lemma 35 *)
2108 let AFF_GE_BREAK_KY_LEMMA = prove_by_refinement (
2109  `!a b c d (x:real^3). 
2110     between x (c, d) /\ 
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]);
2116  (REPEAT STRIP_TAC);
2117
2118  (ASM_SIMP_TAC[AFF_GE_2_2]);
2119  (REWRITE_TAC[SET_EQ_LEMMA; IN_UNION; IN; IN_ELIM_THM]);
2120  (REPEAT STRIP_TAC);
2121
2122   (* Break to 3 subgoal *)
2123
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]);
2128  (DISJ1_TAC);
2129
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]);
2139  (DISJ2_TAC);
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);
2145
2146  (ASM_CASES_TAC `&0 < t3 + t4`);
2147  (ASM_CASES_TAC `v * (t3 + t4) >= t4`);
2148  (DISJ1_TAC);
2149  (EXISTS_TAC `t1:real` THEN EXISTS_TAC `t2:real`);
2150  (EXISTS_TAC `t3 - u * t4 / v` THEN EXISTS_TAC `t4 / v`);
2151  (REPEAT STRIP_TAC);
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]);
2159  (REAL_ARITH_TAC);
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`]);
2167
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]);
2173  (REAL_ARITH_TAC);
2174  (ASM_REWRITE_TAC[]);
2175
2176  (REWRITE_WITH 
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);
2180
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`);
2186  (REAL_ARITH_TAC);
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[]);
2192  (VECTOR_ARITH_TAC);
2193  (ASM_REWRITE_TAC[]);
2194
2195  (ASM_CASES_TAC `(u * (t3 + t4) >= t3)`);
2196  (DISJ2_TAC);
2197  (EXISTS_TAC `t1:real` THEN EXISTS_TAC `t2:real`);
2198  (EXISTS_TAC `t3 / u` THEN EXISTS_TAC `t4 - v * t3 / u`);
2199  (REPEAT STRIP_TAC);
2200  (MATCH_MP_TAC REAL_LE_DIV);
2201  (ASM_REAL_ARITH_TAC);
2202
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]);
2210  (REAL_ARITH_TAC);
2211  (ASM_REWRITE_TAC[]);
2212
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`]);
2217
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]);
2223  (REAL_ARITH_TAC);
2224  (ASM_REWRITE_TAC[]);
2225
2226  (REWRITE_WITH 
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);
2230
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`);
2236  (REAL_ARITH_TAC);
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[]);
2242  (VECTOR_ARITH_TAC);
2243  (ASM_REWRITE_TAC[]);
2244  (NEW_GOAL `F`);
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]);
2250  (REAL_ARITH_TAC);
2251  (UP_ASM_TAC THEN MESON_TAC[]);
2252  (NEW_GOAL `t3 = &0 /\ t4 = &0`);
2253  (ASM_REAL_ARITH_TAC);
2254  (DISJ1_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 *)
2259
2260  (EXISTS_TAC `t1:real` THEN EXISTS_TAC `t2:real`);
2261  (EXISTS_TAC `t3 + t4 * u` THEN EXISTS_TAC `t4 * v`);
2262  (REPEAT STRIP_TAC);
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)`);
2268  (REAL_ARITH_TAC);
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))`);
2272  (VECTOR_ARITH_TAC);
2273  (ASM_REWRITE_TAC[]);
2274
2275  (EXISTS_TAC `t1:real` THEN EXISTS_TAC `t2:real`);
2276  (EXISTS_TAC `t3 * u` THEN EXISTS_TAC `t4 + t3 * v`);
2277  (REPEAT STRIP_TAC);
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`);
2283  (REAL_ARITH_TAC);
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)`);
2287  (VECTOR_ARITH_TAC);
2288  (ASM_REWRITE_TAC[])]);;
2289
2290 (* ======================================================================= *)
2291 (* Lemma 36 *)
2292 let CONVEX_HULL_4_SUBSET_AFF_GE_2_2 = prove_by_refinement (
2293  `!a b c d:real^3. 
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]);
2298  (REPEAT STRIP_TAC);
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[]);
2306
2307 (* asm cases 1 *)
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} = {}`);
2313  (ASM_SET_TAC[]);
2314  (ONCE_REWRITE_TAC[CONVEX_HULL_AFF_GE]);
2315  (REWRITE_WITH `{a, b, a , d:real^3} = {a, d}`);
2316  (TRUONG_SET_TAC[]);
2317  (TRUONG_SET_TAC[]);
2318  (REWRITE_WITH `{a, b:real^3} DIFF {a, d:real^3} = {b}`);
2319  (TRUONG_SET_TAC[]);
2320  (NEW_GOAL `DISJOINT {b:real^3} {a, d}`);
2321  (TRUONG_SET_TAC[]);
2322  (ASM_SIMP_TAC[Fan.AFF_GE_1_2]); 
2323  (REWRITE_WITH `{a, b, a , d:real^3} = {a, b, d}`);
2324  (TRUONG_SET_TAC[]);
2325  (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM; CONVEX_HULL_3]);
2326  (REPEAT STRIP_TAC);
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`]);
2329  (VECTOR_ARITH_TAC);
2330
2331 (* asm cases 2 *)
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} = {}`);
2337  (ASM_SET_TAC[]);
2338  (ONCE_REWRITE_TAC[CONVEX_HULL_AFF_GE]);
2339  (REWRITE_WITH `{a, b, b , d:real^3} = {b, d}`);
2340  (TRUONG_SET_TAC[]);
2341  (TRUONG_SET_TAC[]);
2342  (REWRITE_WITH `{a, b:real^3} DIFF {b, d:real^3} = {a}`);
2343  (TRUONG_SET_TAC[]);
2344  (NEW_GOAL `DISJOINT {a:real^3} {b, d}`);
2345  (TRUONG_SET_TAC[]);
2346  (ASM_SIMP_TAC[Fan.AFF_GE_1_2]); 
2347  (REWRITE_WITH `{a, b, b , d:real^3} = {a, b, d}`);
2348  (TRUONG_SET_TAC[]);
2349  (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM; CONVEX_HULL_3]);
2350  (REPEAT STRIP_TAC);
2351  (EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real` THEN EXISTS_TAC `w:real`); 
2352  (ASM_REWRITE_TAC[]);
2353
2354 (* asm case 3 *)
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} = {}`);
2360  (ASM_SET_TAC[]);
2361  (ONCE_REWRITE_TAC[CONVEX_HULL_AFF_GE]);
2362  (REWRITE_WITH `{a, b, c , a:real^3} = {a, c}`);
2363  (TRUONG_SET_TAC[]);
2364  (REWRITE_TAC[SET_RULE `{x, y} = {y, x}`]);
2365  (TRUONG_SET_TAC[]);
2366
2367  (REWRITE_WITH `{a, b:real^3} DIFF {c, a:real^3} = {b}`);
2368  (TRUONG_SET_TAC[]);
2369  (NEW_GOAL `DISJOINT {b:real^3} {c, a}`);
2370  (TRUONG_SET_TAC[]);
2371  (ASM_SIMP_TAC[Fan.AFF_GE_1_2]); 
2372  (REWRITE_WITH `{a, b, c, a:real^3} = {a, b, c}`);
2373  (TRUONG_SET_TAC[]);
2374  (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM; CONVEX_HULL_3]);
2375  (REPEAT STRIP_TAC);
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`]);
2378  (VECTOR_ARITH_TAC);
2379
2380 (* last case *)
2381  (NEW_GOAL `d = b:real^3`);
2382  (ASM_SET_TAC[]);
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} = {}`);
2387  (ASM_SET_TAC[]);
2388  (ONCE_REWRITE_TAC[CONVEX_HULL_AFF_GE]);
2389  (REWRITE_WITH `{a, b, c , b:real^3} = {c, b}`);
2390  (TRUONG_SET_TAC[]);
2391  (TRUONG_SET_TAC[]);
2392  (REWRITE_WITH `{a, b:real^3} DIFF {c, b:real^3} = {a}`);
2393  (TRUONG_SET_TAC[]);
2394  (NEW_GOAL `DISJOINT {a:real^3} {c, b}`);
2395  (TRUONG_SET_TAC[]);
2396  (ASM_SIMP_TAC[Fan.AFF_GE_1_2]); 
2397  (REWRITE_WITH `{a, b, c , b:real^3} = {a, b, c}`);
2398  (TRUONG_SET_TAC[]);
2399  (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM; CONVEX_HULL_3]);
2400  (REPEAT STRIP_TAC);
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)]);;
2404
2405 (* ======================================================================= *)
2406 (* Lemma 37 *)
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);
2417
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]);
2422  (STRIP_TAC);
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]);
2436  (REPEAT STRIP_TAC);
2437
2438  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
2439  (REWRITE_WITH `{u0, u1, u2, u3} = {u1, u2, u3:real^3}`);
2440  (ASM_SET_TAC[]);
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`]);
2449  (ASM_MESON_TAC[]);
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]);
2455  (ASM_ARITH_TAC);
2456  (ASM_ARITH_TAC);
2457
2458  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
2459  (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u2, u3:real^3}`);
2460  (ASM_SET_TAC[]);
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`]);
2469  (ASM_MESON_TAC[]);
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]);
2475  (ASM_ARITH_TAC);
2476  (ASM_ARITH_TAC);
2477
2478  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
2479  (REWRITE_WITH `{u0, u1, u2, u3} = {u1, u0, u3:real^3}`);
2480  (ASM_SET_TAC[]);
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`]);
2489  (ASM_MESON_TAC[]);
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]);
2495  (ASM_ARITH_TAC);
2496  (ASM_ARITH_TAC);
2497
2498  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
2499  (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u2, u3:real^3}`);
2500  (ASM_SET_TAC[]);
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`]);
2509  (ASM_MESON_TAC[]);
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]);
2515  (ASM_ARITH_TAC);
2516  (ASM_ARITH_TAC);
2517  (ASM_MESON_TAC[set_of_list])]);;
2518
2519 (* ======================================================================= *)
2520 (* Lemma 38 *)
2521 let VORONOI_LIST_3_SINGLETON_EXPLICIT = prove_by_refinement (
2522  `!V ul.
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);
2534
2535  (NEW_GOAL `~affine_dependent {u0,u1,u2,u3:real^3}`);
2536  (ASM_MESON_TAC[set_of_list; AFF_INDEPENDENT_SET_OF_LIST_BARV]);
2537
2538  (NEW_GOAL `barV V 3 ul`);
2539  (ASM_REWRITE_TAC[]);
2540  (UP_ASM_TAC THEN REWRITE_TAC[BARV; VORONOI_NONDG]);
2541  (REPEAT STRIP_TAC);
2542
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`);
2549  (ASM_SIMP_TAC[]);
2550  (UP_ASM_TAC THEN ASM_REWRITE_TAC[LENGTH; ARITH_RULE `3 + 1 = 4`]);
2551  (DISCH_TAC);
2552  (NEW_GOAL `aff_dim (voronoi_list V [u0; u1; u2; u3:real^3]) = &0`);
2553  (ASM_ARITH_TAC);
2554  (UP_ASM_TAC THEN REWRITE_TAC[AFF_DIM_EQ_0]);
2555  (REPEAT STRIP_TAC);
2556
2557  (EXISTS_TAC `a:real^3`);
2558
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[]);
2566
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]);
2584  (REPEAT STRIP_TAC);
2585  (SWITCH_TAC);
2586
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[]);
2591  (TRUONG_SET_TAC[]);
2592
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[]);
2597  (TRUONG_SET_TAC[]);
2598
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[]);
2603  (TRUONG_SET_TAC[]);
2604
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[]);
2609  (TRUONG_SET_TAC[]);
2610
2611  (REPLICATE_TAC 4 UP_ASM_TAC THEN REWRITE_TAC[IN;IN_ELIM_THM]);
2612  (REPEAT STRIP_TAC);
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]);
2616  (DISCH_TAC);
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]);
2620  (STRIP_TAC);
2621  (EXISTS_TAC `[]:(real^3)list`);
2622  (ASM_REWRITE_TAC[APPEND]);
2623  (ARITH_TAC);
2624
2625  (NEW_GOAL `voronoi_nondg V [u0;u1;u2;u3:real^3]`);
2626  (ASM_SIMP_TAC[]);
2627  (UP_ASM_TAC THEN REWRITE_TAC[VORONOI_NONDG; set_of_list]);
2628  (SET_TAC[]);
2629
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[]);
2633
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);
2642
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);
2651
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);
2660
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[])]);;
2671
2672 (* ======================================================================= *)
2673 (* Lemma 39 *)
2674 let ORTHOGONAL_AFF_HULL_2_KY_LEMMA = prove_by_refinement (
2675  `!n a b s p:real^3.
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]);
2679  (REPEAT STRIP_TAC);
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 (* ======================================================================= *)
2683 (* Lemma 40 *)
2684
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[]);
2694  (UP_ASM_TAC);
2695  (REPEAT STRIP_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[]);
2699
2700  (EQ_TAC);
2701  (REPEAT STRIP_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]);
2710
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);
2728
2729  (STRIP_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]);
2738
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[]);
2750
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);
2757
2758  (NEW_GOAL `orthogonal (a - b) (x - s:real^3)`);
2759  (REWRITE_TAC[orthogonal]);
2760  (ONCE_REWRITE_TAC[DOT_SYM] THEN ASM_REWRITE_TAC[]);
2761
2762  (EQ_TAC);
2763  (REPEAT STRIP_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]);
2772
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);
2790
2791  (STRIP_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]);
2800
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[]);
2812
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)
2819 ]);;
2820
2821 (* ======================================================================= *)
2822 (* Lemma 41 *)
2823
2824 let SIMPLEX_FURTHEST_LT_2 = prove_by_refinement (
2825  `!a (s:real^N->bool).
2826          FINITE s
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)))`
2838   CHOOSE_TAC);
2839  (MATCH_MP_TAC SIMPLEX_FURTHEST_LE);
2840  (ASM_REWRITE_TAC[]);
2841  (STRIP_TAC);
2842  (UNDISCH_TAC `x:real^N IN convex hull s`);
2843  (ASM_REWRITE_TAC[CONVEX_HULL_EMPTY]);
2844  (SET_TAC[]);
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[])]);;
2851
2852 (* ======================================================================= *)
2853 (* Lemma 42 *)
2854
2855 let DIST_BETWEEN_FURTHEST_LT = prove_by_refinement (
2856   `!x a b s:real^3. 
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);
2866  (ASM_SET_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`])]);;
2872
2873 (* ======================================================================= *)
2874 (* Lemma 43 *)
2875
2876 let ROGERS_EXPLICIT = prove_by_refinement (
2877  `!V ul.
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]);
2893  (AP_TERM_TAC);
2894  (REWRITE_WITH `!x. x IN {0,1,2,3} <=> (x = 0 \/x = 1 \/x = 2 \/x = 3)`);
2895  (SET_TAC[]);
2896  (REWRITE_WITH 
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]);
2901  (REWRITE_WITH 
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}`);
2906  (SET_TAC[]);
2907  (REWRITE_WITH `omega_list_n V ul 0 = HD ul`);
2908  (REWRITE_TAC[OMEGA_LIST_N])]);;
2909
2910 (* ======================================================================= *)
2911 (* Lemma 44 *)
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
2920      ANTS_TAC THENL
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]]]);;
2930
2931 (* ======================================================================= *)
2932 (* Lemma 45 *)
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);
2939  (REPEAT STRIP_TAC);
2940  (REPEAT STRIP_TAC);
2941  (ASM_REWRITE_TAC[]);
2942  (ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC)]);;
2943
2944 (* ======================================================================= *)
2945 (* Lemma 46 *)
2946
2947 let MXI_EXPLICIT = prove_by_refinement(
2948  `!V ul u0 u1 u2 u3. 
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) /\
2953                  mxi V ul = s)`,
2954 [(REPEAT STRIP_TAC);
2955  (NEW_GOAL 
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);
2959  STRIP_TAC;
2960
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[]);
2969  (EXPAND_TAC "vl");
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]);
2973  (AP_TERM_TAC);
2974  (REWRITE_TAC[PAIR_EQ]);
2975  (STRIP_TAC);
2976  (EXPAND_TAC "vl");
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)`);
2980  (EXPAND_TAC "vl");
2981  (DEL_TAC THEN ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2]);
2982  (MATCH_MP_TAC XNHPWAB1);
2983  (EXISTS_TAC `2`);
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);
2989
2990 (* ======================================================================== *)
2991
2992  (NEW_GOAL `~affine_dependent {u0,u1,u2,u3:real^3}`);
2993  (ASM_MESON_TAC[set_of_list; AFF_INDEPENDENT_SET_OF_LIST_BARV]);
2994
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]);
3001
3002  (NEW_GOAL `barV V 3 ul`);
3003  (ASM_REWRITE_TAC[]);
3004  (UP_ASM_TAC THEN REWRITE_TAC[BARV; VORONOI_NONDG]);
3005  (REPEAT STRIP_TAC);
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]);
3013  (ASM_MESON_TAC[]);
3014  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_3]);
3015  (ASM_MESON_TAC[]);
3016  (UP_ASM_TAC THEN REPEAT STRIP_TAC);
3017
3018  (EXISTS_TAC `s:real^3`);
3019  (ASM_REWRITE_TAC[]);
3020  (REWRITE_TAC[mxi]);
3021  (COND_CASES_TAC);
3022  (NEW_GOAL `F`);
3023  (UNDISCH_TAC `hl (truncate_simplex 2 (ul:(real^3)list)) < sqrt (&2)`);
3024  (ASM_REWRITE_TAC[]);
3025  (ASM_REAL_ARITH_TAC);
3026
3027  (UP_ASM_TAC THEN MESON_TAC[]);
3028  (MATCH_MP_TAC SELECT_UNIQUE);
3029  (REPEAT STRIP_TAC);
3030  (REWRITE_TAC[BETA_THM]);
3031  (REWRITE_TAC[GSYM BETWEEN_IN_CONVEX_HULL;HD]);
3032  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3033  (EQ_TAC);
3034  (STRIP_TAC);
3035  (ASM_REWRITE_TAC[]);
3036  (ASM_MESON_TAC[DIST_SYM]);
3037
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)`);
3044  (ASM_MESON_TAC[]);
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]);
3049  (REPEAT STRIP_TAC);
3050
3051
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`]);
3060  (EXPAND_TAC "a");
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);
3066  (EXISTS_TAC `2`);
3067  (ASM_REWRITE_TAC[]);
3068  (EXPAND_TAC "vl" THEN DEL_TAC);
3069  (ASM_REWRITE_TAC[IN]);
3070  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
3071  (EXISTS_TAC `3`);
3072  (ASM_MESON_TAC [ARITH_RULE `2 <= 3 `]);
3073  (ASM_REWRITE_TAC[]);
3074
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`);
3083  (EXPAND_TAC "b");
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);
3091  (ASM_SET_TAC[]);
3092
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[]);
3101
3102  (REWRITE_TAC[GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`)]
3103    THEN ASM_REAL_ARITH_TAC);
3104
3105 (* ======================================================================== *)
3106
3107  (ASM_CASES_TAC `y = s:real^3`);
3108  (ASM_MESON_TAC[]);
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)`);
3116
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`);
3120  (REPEAT STRIP_TAC);
3121
3122  (ASM_REWRITE_TAC[]);
3123  (ASM_MESON_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]);
3127  (ASM_MESON_TAC[]);
3128  (ASM_REAL_ARITH_TAC);
3129
3130  (NEW_GOAL `dist (u0:real^3,s) < sqrt (&2)`);
3131  (REWRITE_TAC[ASSUME `s = a:real^3`]);
3132  (ASM_MESON_TAC[]);
3133  (ASM_REAL_ARITH_TAC);
3134
3135  (ASM_REAL_ARITH_TAC);
3136  (NEW_GOAL `F`);
3137  (UP_ASM_TAC THEN REWRITE_WITH `dist (u0,y) = dist (y,u0:real^3)`);
3138  (MESON_TAC[DIST_SYM]);
3139  (ASM_REWRITE_TAC[]);
3140  (REAL_ARITH_TAC);
3141  (UP_ASM_TAC THEN MESON_TAC[]);
3142
3143
3144  (ASM_CASES_TAC `between s (y, a:real^3)`);
3145
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`);
3149  (REPEAT STRIP_TAC);
3150
3151  (ASM_REWRITE_TAC[]);
3152  (ASM_MESON_TAC[]);
3153  (NEW_GOAL `dist (u0,s:real^3) < sqrt (&2)`);
3154  (REWRITE_TAC[ASSUME `s = a:real^3`]);
3155  (ASM_MESON_TAC[]);
3156  (ASM_REAL_ARITH_TAC);
3157
3158  (NEW_GOAL `dist (y, u0:real^3) < sqrt (&2)`);
3159  (REWRITE_TAC[ASSUME `y = a:real^3`]);
3160  (ONCE_REWRITE_TAC[DIST_SYM]);
3161  (ASM_MESON_TAC[]);
3162  (ASM_REAL_ARITH_TAC);
3163
3164  (REWRITE_WITH `dist (u0,y:real^3) = dist (y, u0)`);
3165  (MESON_TAC[DIST_SYM]);
3166  (ASM_REAL_ARITH_TAC);
3167  (NEW_GOAL `F`);
3168  (UP_ASM_TAC THEN REWRITE_WITH `dist (u0,y) = dist (y,u0:real^3)`);
3169  (MESON_TAC[DIST_SYM]);
3170  (ASM_REWRITE_TAC[]);
3171  (REAL_ARITH_TAC);
3172  (UP_ASM_TAC THEN MESON_TAC[]);
3173
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[]);
3178
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`]);
3193
3194  (STRIP_TAC);
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`]);
3201  (ASM_MESON_TAC[]);
3202  (ASM_REAL_ARITH_TAC);
3203
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`]);
3210  (STRIP_TAC);
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`]);
3217  (ASM_MESON_TAC[]);
3218  (ASM_REAL_ARITH_TAC);
3219  (VECTOR_ARITH_TAC);
3220
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)`]);
3230
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]);
3239  (REPEAT STRIP_TAC);
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`]);
3251  (DISCH_TAC);
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`]);
3255  (DISCH_TAC);
3256
3257  (NEW_GOAL `~(u'' = &0)`);
3258  (STRIP_TAC);
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);
3263  (VECTOR_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`)]);
3267  (ASM_MESON_TAC[]);
3268  (ASM_REAL_ARITH_TAC);
3269
3270  (NEW_GOAL `v = &0`);
3271  (MP_TAC (GSYM (ASSUME `&0 = u'' * v`)));
3272  (REWRITE_TAC[REAL_ENTIRE]);
3273  (ASM_MESON_TAC[]);
3274
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);
3279  (VECTOR_ARITH_TAC);
3280  (NEW_GOAL `dist (u0:real^3, s) < sqrt (&2)`);
3281  (REWRITE_TAC[GSYM (ASSUME `a = s:real^3`)]);
3282  (ASM_MESON_TAC[]);
3283  (NEW_GOAL `F`);
3284  (ASM_REAL_ARITH_TAC);
3285  (ASM_MESON_TAC[]);
3286  (UP_ASM_TAC THEN REWRITE_TAC[VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
3287  (DISCH_TAC);
3288  (NEW_GOAL `dist (u0,a:real^3) >= sqrt (&2)`);
3289  (REWRITE_TAC[(ASSUME `a = b:real^3`)]);
3290  (ASM_MESON_TAC[]);
3291  (ASM_REAL_ARITH_TAC)]);;
3292
3293 (* ======================================================================= *)
3294 (* Lemma 47 *)
3295 let CONVEX_HULL_4_IMP_2_2 = prove_by_refinement (
3296  `!a b c d p:real^3. 
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[]);
3308  (STRIP_TAC);
3309  (ASM_REAL_ARITH_TAC);
3310  (VECTOR_ARITH_TAC);
3311
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[]);
3320  (STRIP_TAC);
3321  (ASM_REAL_ARITH_TAC);
3322  (VECTOR_ARITH_TAC);
3323
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]);
3327  (REPEAT STRIP_TAC);
3328  (EXISTS_TAC `u + v` THEN EXISTS_TAC `w + z`);
3329  (REPEAT STRIP_TAC);
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`);
3335  (STRIP_TAC);
3336  (MATCH_MP_TAC REAL_DIV_REFL);
3337  (ASM_REWRITE_TAC[]);
3338  (MATCH_MP_TAC REAL_DIV_REFL);
3339  (ASM_REWRITE_TAC[]);
3340  (VECTOR_ARITH_TAC);
3341  (EXISTS_TAC `u / (u + v)` THEN EXISTS_TAC `v / (u + v)`);
3342  (ASM_REWRITE_TAC[]);
3343  (REPEAT STRIP_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[]);
3351
3352  (EXISTS_TAC `w / (w + z)` THEN EXISTS_TAC `z / (w + z)`);
3353  (ASM_REWRITE_TAC[]);
3354  (REPEAT STRIP_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[])]);;
3362
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) /\
3368                  mxi V ul = s)`,
3369   [MESON_TAC[MXI_EXPLICIT]]);;
3370
3371 (* ======================================================================= *)
3372 (* Lemma 48 *)
3373 let proj_point = new_definition 
3374 `!e x. proj_point e x = x - projection e x`;;
3375
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]);;
3379
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]);;
3383
3384 (* ======================================================================= *)
3385 (* Lemma 49 *)
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)]);;
3399
3400 (* ======================================================================= *)
3401 (* Lemma 50 *)
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[]);
3411  (VECTOR_ARITH_TAC);
3412  (VECTOR_ARITH_TAC);
3413  (ASM_CASES_TAC `((y - a:real^N) dot (b - a) = &0)`);
3414  (EXISTS_TAC `v:real`);
3415  (REPEAT STRIP_TAC);
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))`);
3421  (REPEAT STRIP_TAC);
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)) % 
3434  (b - a:real^N)) = 
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)))`);
3438  (VECTOR_ARITH_TAC);
3439  (MATCH_MP_TAC Trigonometry2.VECTOR_MUL_R_TO_L);
3440  (REPEAT STRIP_TAC);
3441  (ASM_MESON_TAC[]);
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)]);;
3451
3452 (* ======================================================================= *)
3453 (* Lemma 51 *)
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);
3458  (SUBGOAL_THEN 
3459   `(?k. k <= &1 /\ &0 <= k /\
3460         projection (b - a) (x - a:real^N) = k % projection (b - a) (y - a))`
3461    CHOOSE_TAC);
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);
3468  (STRIP_TAC);
3469  (ASM_REAL_ARITH_TAC);
3470  (REWRITE_TAC[NORM_POS_LE])]);;
3471
3472 (* ======================================================================= *)
3473 (* Lemma 52 *)
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] `,
3477 [ (REPEAT GEN_TAC);
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])]);;
3483
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] `,
3487 [ (REPEAT GEN_TAC);
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`])]);;
3491
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]`,
3495 [(REPEAT GEN_TAC);
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`])]);;
3499
3500 (* ======================================================================= *)
3501 (* Lemma 53 *)
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]);
3507  (REPEAT STRIP_TAC);
3508  (UP_ASM_TAC THEN SWITCH_TAC THEN UP_ASM_TAC THEN SET_TAC[])]);;
3509
3510 (* ======================================================================= *)
3511 (* Lemma 54 *)
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 
3515   REPEAT STRIP_TAC);
3516  (EXISTS_TAC `s:real^N->bool`);
3517  (EXISTS_TAC `u:real^N->real`);
3518  (ASM_REWRITE_TAC[]);
3519  (ASM_MESON_TAC[])]);;
3520
3521 (* ======================================================================= *)
3522 (* Lemma 55 *)
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'')`);
3533  (STRIP_TAC);
3534  (REWRITE_WITH 
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'')`);
3537  (REAL_ARITH_TAC);
3538  (ASM_REWRITE_TAC[REAL_SUB_REFL;REAL_ADD_RID]);
3539  (ASM_REWRITE_TAC[]);
3540  (VECTOR_ARITH_TAC)]);;
3541
3542 (* ======================================================================= *)
3543 (* Lemma 56 *)
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} /\ 
3548          ~(r = &1) 
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)`);
3554  (STRIP_TAC);
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[]);
3560  (REAL_ARITH_TAC);
3561  (REWRITE_WITH 
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[]);
3567  (VECTOR_ARITH_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`);
3572
3573  (MATCH_MP_TAC REAL_DIV_REFL);
3574  (ASM_REAL_ARITH_TAC);
3575  (REWRITE_TAC[REAL_SUB_REFL;VECTOR_MUL_LZERO])]);; 
3576
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} /\
3581          ~(r = &1)
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])]);;
3586
3587 (* ======================================================================= *)
3588 (* Lemma 57 *)
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} /\ 
3592                            between Z (X,Y)
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'`);
3599  (STRIP_TAC);
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)]);;
3607
3608 (* ======================================================================= *)
3609 (* Lemma 58 *)
3610 let SUM_CLAUSES_alt = prove (`(!x f s.
3611           FINITE 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]);;
3614
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`]); 
3626  (REPEAT STRIP_TAC);
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]);
3631  (ASM_ARITH_TAC);
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]);
3636  (ASM_ARITH_TAC);
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]);
3641  (ASM_ARITH_TAC);
3642  (ASM_MESON_TAC[]);
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]);
3648  SWITCH_TAC; 
3649  (COND_CASES_TAC);
3650  (NEW_GOAL `F`);
3651  (UP_ASM_TAC THEN REWRITE_TAC[SET_RULE `x IN {a,b} <=> x = a \/ x = b`]);
3652  (REPEAT STRIP_TAC);
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]);
3656  (ASM_ARITH_TAC);
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]);
3660  (ASM_ARITH_TAC);
3661  (ASM_MESON_TAC[]);
3662  SWITCH_TAC;
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]);
3668  (ASM_ARITH_TAC)]);;
3669
3670 (* ======================================================================= *)
3671 (* Lemma 59 *)
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)`]));;
3677
3678 (* ======================================================================= *)
3679 (* Lemma 60 *)
3680 let VSUM_CLAUSES_alt = prove (`(!x f s.
3681           FINITE 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`]); 
3695  (REPEAT STRIP_TAC);
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]);
3700  (ASM_ARITH_TAC);
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]);
3705  (ASM_ARITH_TAC);
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]);
3710  (ASM_ARITH_TAC);
3711  (ASM_MESON_TAC[]);
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]);
3717  SWITCH_TAC; 
3718  (COND_CASES_TAC);
3719  (NEW_GOAL `F`);
3720  (UP_ASM_TAC THEN REWRITE_TAC[SET_RULE `x IN {a,b} <=> x = a \/ x = b`]);
3721  (REPEAT STRIP_TAC);
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]);
3725  (ASM_ARITH_TAC);
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]);
3729  (ASM_ARITH_TAC);
3730  (ASM_MESON_TAC[]);
3731  SWITCH_TAC;
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]);
3737  (ASM_ARITH_TAC)]);;
3738
3739 (* ======================================================================= *)
3740 (* Lemma 61 *)
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`,
3749 [(REPEAT GEN_TAC);
3750  (REWRITE_TAC[CONVEX_HULL_4; IN;IN_ELIM_THM]);
3751  (REPEAT STRIP_TAC);
3752  (ASM_CASES_TAC `k1 = &0`);
3753  (ASM_REWRITE_TAC[]);
3754  (NEW_GOAL `F`);
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`);
3763
3764  (NEW_GOAL `f (a:real^3) = u - k1`);
3765  (EXPAND_TAC "f");
3766  (COND_CASES_TAC);
3767  (REWRITE_TAC[]);
3768  (NEW_GOAL `F`);
3769  (ASM_MESON_TAC[]);
3770  (ASM_MESON_TAC[]);
3771
3772  (NEW_GOAL `f (b:real^3) = v - k2`);
3773  (EXPAND_TAC "f");
3774  (COND_CASES_TAC);
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}`]);
3779  (COND_CASES_TAC);
3780  (REWRITE_TAC[]);
3781  (NEW_GOAL `F`);
3782  (ASM_MESON_TAC[]);
3783  (ASM_MESON_TAC[]);
3784
3785  (NEW_GOAL `f (c:real^3) = w - k3`);
3786  (EXPAND_TAC "f");
3787  (COND_CASES_TAC);
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}`]);
3792  (COND_CASES_TAC);
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}`]);
3797  (COND_CASES_TAC);
3798  (REWRITE_TAC[]);
3799  (NEW_GOAL `F`);
3800  (ASM_MESON_TAC[]);
3801  (ASM_MESON_TAC[]);
3802
3803  (NEW_GOAL `f (d:real^3) = z - k4`);
3804  (EXPAND_TAC "f");
3805  (COND_CASES_TAC);
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}`]);
3810  (COND_CASES_TAC);
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}`]);
3815  (COND_CASES_TAC);
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}`]);
3820  (COND_CASES_TAC);
3821  (REWRITE_TAC[]);
3822  (NEW_GOAL `F`);
3823  (ASM_MESON_TAC[]);
3824  (ASM_MESON_TAC[]);
3825
3826  (REPEAT STRIP_TAC);
3827  (REWRITE_TAC[Geomdetail.FINITE6]);
3828  (SET_TAC[]);
3829
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`);
3838  (STRIP_TAC);
3839  (SET_TAC[]);
3840  (ASM_REWRITE_TAC[]);
3841  (ASM_REAL_ARITH_TAC);
3842
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`]);
3852  (ASM_MESON_TAC[]);
3853  (ASM_MESON_TAC[])]);;
3854
3855 (* ======================================================================= *)
3856 (* Lemma 62 *)
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));;
3869
3870 (* ======================================================================= *)
3871 (* Lemma 63 *)
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]);
3881
3882  (ASM_CASES_TAC `between x (a,y:real^3)`);
3883  (ASM_MESON_TAC[]);
3884  (DISJ2_TAC);
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`);
3892  (REPEAT STRIP_TAC);
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[]);
3899  (ASM_MESON_TAC[]);
3900  (UP_ASM_TAC THEN REWRITE_TAC[COLLINEAR_BETWEEN_CASES]);
3901
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)`]);
3905  (REPEAT STRIP_TAC);
3906  (NEW_GOAL `F`);
3907  (ASM_MESON_TAC[]);
3908  (ASM_MESON_TAC[]);
3909  (ASM_CASES_TAC `x = y:real^3`);
3910  (REWRITE_TAC[ASSUME `x = y:real^3`; BETWEEN_REFL]);
3911
3912  (NEW_GOAL `F`);
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]);  
3917  (REPEAT STRIP_TAC);
3918
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`]);
3922
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);
3938  (STRIP_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]);
3942  (REPEAT STRIP_TAC);
3943  (ASM_REAL_ARITH_TAC);
3944
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]);
3950
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]);
3956
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[])]);;
3963
3964 (* ======================================================================= *)
3965 (* Lemma 64 *)
3966
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}`,
3970 [(REPEAT GEN_TAC);
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[]);
3974  (REWRITE_WITH `
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[]);
3978  (AP_TERM_TAC);
3979  (REWRITE_TAC[SET_OF_0_TO_2])]);;
3980
3981 (* ======================================================================= *)
3982 (* Lemma 65 *)
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);
3997
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[]);
4002
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)`);
4007  (ASM_MESON_TAC[]);
4008
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]);
4012  (REPEAT STRIP_TAC);
4013  (ASM_REWRITE_TAC[]);
4014  (EXISTS_TAC `u' + (v'/ v)`);
4015  (EXISTS_TAC `-- ((u * v')/ v)`);
4016  (REPEAT STRIP_TAC);
4017
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);
4024  (STRIP_TAC);
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);
4029  (VECTOR_ARITH_TAC);
4030  (ASM_MESON_TAC[]);
4031  (VECTOR_ARITH_TAC);
4032
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);
4039  (STRIP_TAC);
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);
4044  (VECTOR_ARITH_TAC);
4045  (ASM_MESON_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);
4051
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]);
4057  (REPEAT STRIP_TAC);
4058  (NEW_GOAL `F`);
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`]);
4063
4064  (REPEAT STRIP_TAC);
4065
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`);
4074  (STRIP_TAC);
4075  (ONCE_REWRITE_TAC[SET_RULE `{c,a,b,d} = {a,b,c,d}`]);
4076  (ASM_REWRITE_TAC[]);
4077  (REPEAT STRIP_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`);
4099  (STRIP_TAC);
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[]);
4106  (VECTOR_ARITH_TAC);
4107  (ASM_MESON_TAC[]);
4108  (ASM_MESON_TAC[])]);;
4109
4110 (* ======================================================================= *)
4111 (* Lemma 66 *)
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);;
4116
4117 (* ======================================================================= *)
4118 (* Lemma 67 *)
4119
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] /\ 
4125       TABLE 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]);;
4128
4129 (* ======================================================================= *)
4130 (* Lemma 68 *)
4131 let MEM_LEFT_ACTION_LIST_2 = prove_by_refinement (
4132  `!(ul:(A)list) p x. 
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]);
4137  (EQ_TAC);
4138  (STRIP_TAC);
4139  (POP_ASSUM MP_TAC);
4140  (ASM_SIMP_TAC[left_action_list; Packing3.EL_TABLE]);
4141  (DISCH_TAC);
4142  (ASM_CASES_TAC `i < LENGTH (ul:(A)list) - 1`);
4143  (EXISTS_TAC `inverse (p:num->num) i`);
4144  (REWRITE_TAC[]);
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`);
4150  (ASM_ARITH_TAC);
4151  (DISCH_TAC);
4152  (NEW_GOAL `inverse p permutes 0..n - 1`);
4153  (ASM_MESON_TAC[]);
4154
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]);
4159  (ASM_ARITH_TAC);
4160  (NEW_GOAL `i = LENGTH (ul:(A)list) - 1`);
4161  (ASM_ARITH_TAC);
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]);
4168  (REPEAT STRIP_TAC);
4169  (REWRITE_WITH `inverse p (n - 1) = n - 1`);
4170  (FIRST_ASSUM MATCH_MP_TAC);
4171  (REWRITE_TAC[IN_NUMSEG_0]);
4172  (ASM_ARITH_TAC);
4173
4174  (STRIP_TAC);
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]);
4180  (REPEAT STRIP_TAC);
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]);
4185  (ASM_ARITH_TAC);
4186  (UNDISCH_TAC `!y. ?!x. (p:num->num) x = y`);
4187  (REWRITE_TAC[EXISTS_UNIQUE]);
4188  (REPEAT STRIP_TAC);
4189  (NEW_GOAL `?x. p x = (p:num->num) i /\ (!y'. p y' = p i ==> y' = x)`);
4190  (ASM_MESON_TAC[]);
4191  (UP_ASM_TAC THEN STRIP_TAC);
4192  (NEW_GOAL `i = x':num`);
4193  (FIRST_ASSUM MATCH_MP_TAC);
4194  (REFL_TAC);
4195  (NEW_GOAL `(p:num->num) i = x':num`);
4196  (FIRST_ASSUM MATCH_MP_TAC);
4197  (ASM_MESON_TAC[]);
4198  (NEW_GOAL `i >= LENGTH (ul:(A)list)`);
4199  (ASM_ARITH_TAC);
4200  (NEW_GOAL `F`);
4201  (ASM_ARITH_TAC);
4202  (ASM_MESON_TAC[]);
4203  (ASM_ARITH_TAC);
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]);
4207
4208  (NEW_GOAL `i = LENGTH (ul:(A)list) - 1`);
4209  (ASM_ARITH_TAC);
4210  (EXISTS_TAC `i:num`);
4211  (ASM_REWRITE_TAC[]);
4212  (ABBREV_TAC `n = LENGTH (ul:(A)list)`);
4213  (NEW_GOAL `n - 1 < n`);
4214  (ASM_ARITH_TAC);
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]);
4220  (REPEAT STRIP_TAC);
4221  (FIRST_ASSUM MATCH_MP_TAC);
4222  (REWRITE_TAC[IN_NUMSEG_0]);
4223  (ASM_ARITH_TAC)]);;
4224
4225 (* ======================================================================= *)
4226 (* Lemma 69 *)
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]);;
4232
4233 (* ======================================================================= *)
4234 (* Lemma 70 *)
4235 let OMEGA_LIST_2_EXPLICIT_NEW = prove_by_refinement (
4236  `!a:real^3 b c d V ul.
4237      saturated V /\
4238      packing V /\
4239      ul IN barV V 3 /\
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);
4249  (EXISTS_TAC `2`);
4250  (MP_TAC (ASSUME `ul IN barV V 3`) THEN REWRITE_TAC[IN;BARV]);
4251
4252  (REPEAT STRIP_TAC);
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]);
4261  (ASM_MESON_TAC[]);
4262  (ASM_MESON_TAC[]);
4263  (ASM_REWRITE_TAC[OMEGA_LIST_TRUNCATE_2])]);;
4264 (* ======================================================================= *)
4265 (* Lemma 71 *)
4266 let INTER_RCONE_GE_IMP_BETWEEN_PROJ_POINT = prove_by_refinement (
4267  `!a:real^3 b p r. 
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]);
4278  (STRIP_TAC);
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);
4282  (ASM_SET_TAC[]);
4283  (REWRITE_TAC[rcone_ge;rconesgn;IN;IN_ELIM_THM]);
4284  (STRIP_TAC);
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);
4290  (ASM_SET_TAC[]);
4291  (REWRITE_TAC[rcone_ge;rconesgn;IN;IN_ELIM_THM]);
4292  (STRIP_TAC);
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)`]);
4300  (STRIP_TAC);
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)]);;
4307
4308 (* ======================================================================= *)
4309 (* Lemma 72 *)
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);
4323  (ASM_SET_TAC[]);
4324  (REWRITE_TAC[rcone_ge;rconesgn;IN;IN_ELIM_THM]);
4325
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]);
4353
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`]);
4362  (REAL_ARITH_TAC);
4363  (REWRITE_TAC[REAL_MUL_LID; GSYM real_div]);
4364
4365
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;
4385    REAL_ADD_LID]);
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]);
4394  (REPEAT STRIP_TAC);
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]);
4402  (VECTOR_ARITH_TAC);
4403
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);
4408  (STRIP_TAC);
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]);
4416
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)`]);
4425  (REAL_ARITH_TAC);
4426  (ASM_REAL_ARITH_TAC);
4427  (REAL_ARITH_TAC);
4428
4429  (NEW_GOAL `x IN rcone_ge (a:real^3) b r`);
4430  (EXPAND_TAC "x");
4431  (MATCH_MP_TAC RCONE_GE_TRANS);
4432  (STRIP_TAC);
4433  (SIMP_TAC[REAL_LE_DIV;DIST_POS_LE]);
4434  (ASM_REWRITE_TAC[VECTOR_ARITH `(a:real^3) + p - a = p`]);
4435  (ASM_SET_TAC[]);
4436
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]);
4443  (REPEAT STRIP_TAC);
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]);
4451  (VECTOR_ARITH_TAC);
4452
4453  (NEW_GOAL `(x - s:real^3) dot (a - s) = &0`);
4454  (EXPAND_TAC "x");
4455  (REWRITE_TAC[VECTOR_ARITH `((a + m % x) - s) dot (a - s) = (s - a) dot (s - a) - m * (x dot (s - a))`]);
4456
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)`);
4460  (VECTOR_ARITH_TAC);
4461
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;
4467    REAL_ADD_LID]);
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)`;
4472    GSYM NORM_POW_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`]);
4491  (REAL_ARITH_TAC);
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);
4510  (STRIP_TAC);
4511
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`]);
4516  (REAL_ARITH_TAC);
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);
4522  (ASM_SET_TAC[]);
4523  (REWRITE_TAC[rcone_ge;rconesgn;IN;IN_ELIM_THM; dist]);
4524  (STRIP_TAC);
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);
4545
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]);
4551  (STRIP_TAC);
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);
4574  (STRIP_TAC);
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);
4579
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]);
4587
4588  (ASM_CASES_TAC `(p = x:real^3)`);
4589  (ASM_MESON_TAC[]);
4590  (MATCH_MP_TAC DIST_BETWEEN_FURTHEST_LT);
4591  (EXISTS_TAC `x:real^3`);
4592  (REPEAT STRIP_TAC);
4593  (ASM_MESON_TAC[]);
4594  (ASM_MESON_TAC[]);
4595  (ASM_MESON_TAC[]);
4596  (UNDISCH_TAC `between p (a,x:real^3)`);
4597  (FIRST_ASSUM REWRITE_ONLY_TAC);
4598  (REWRITE_TAC[BETWEEN_REFL_EQ]);
4599  (ASM_MESON_TAC[]);
4600  (ASM_REAL_ARITH_TAC)]);;
4601
4602 let INTER_RCONE_GE_dist_lemma1 = INTER_RCONE_GE_LT_lemma;;
4603
4604 (* ======================================================================= *)
4605 (* Lemma 73 *)
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);
4620  (ASM_SET_TAC[]);
4621  (REWRITE_TAC[rcone_ge;rconesgn;IN;IN_ELIM_THM]);
4622
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]);
4650
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`]);
4659  (REAL_ARITH_TAC);
4660  (REWRITE_TAC[REAL_MUL_LID; GSYM real_div]);
4661
4662
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;
4682    REAL_ADD_LID]);
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]);
4691  (REPEAT STRIP_TAC);
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]);
4699  (VECTOR_ARITH_TAC);
4700
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);
4705  (STRIP_TAC);
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]);
4713
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)`]);
4722  (REAL_ARITH_TAC);
4723  (ASM_REAL_ARITH_TAC);
4724  (REAL_ARITH_TAC);
4725
4726  (NEW_GOAL `x IN rcone_ge (a:real^3) b r`);
4727  (EXPAND_TAC "x");
4728  (MATCH_MP_TAC RCONE_GE_TRANS);
4729  (STRIP_TAC);
4730  (SIMP_TAC[REAL_LE_DIV;DIST_POS_LE]);
4731  (ASM_REWRITE_TAC[VECTOR_ARITH `(a:real^3) + p - a = p`]);
4732  (ASM_SET_TAC[]);
4733
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]);
4740  (REPEAT STRIP_TAC);
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]);
4748  (VECTOR_ARITH_TAC);
4749
4750  (NEW_GOAL `(x - s:real^3) dot (a - s) = &0`);
4751  (EXPAND_TAC "x");
4752  (REWRITE_TAC[VECTOR_ARITH `((a + m % x) - s) dot (a - s) = (s - a) dot (s - a) - m * (x dot (s - a))`]);
4753
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)`);
4757  (VECTOR_ARITH_TAC);
4758
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;
4764    REAL_ADD_LID]);
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)`;
4769    GSYM NORM_POW_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`]);
4788  (REAL_ARITH_TAC);
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);
4807  (STRIP_TAC);
4808
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);
4815  (ASM_SET_TAC[]);
4816  (REWRITE_TAC[rcone_ge;rconesgn;IN;IN_ELIM_THM; dist]);
4817  (STRIP_TAC);
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);
4838
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]);
4844  (STRIP_TAC);
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);
4867  (STRIP_TAC);
4868  (ASM_REAL_ARITH_TAC);
4869  (REWRITE_TAC[REAL_LE_POW_2]);
4870  (ASM_REAL_ARITH_TAC);
4871
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]);
4879
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]);
4886  (SET_TAC[]);
4887  (UP_ASM_TAC THEN REWRITE_TAC[SET_RULE `a IN {x,y} <=> a = x \/ a = y`] 
4888    THEN STRIP_TAC);
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);
4893  (DISCH_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)]);;
4901
4902 (* ======================================================================= *)
4903 (* Lemma 74 *)
4904
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 /\ 
4909     p permutes 0..2 /\ 
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`,
4915
4916 [(REPEAT GEN_TAC THEN STRIP_TAC);
4917  (NEW_GOAL `barV V 3 xl`);
4918  (REWRITE_TAC[BARV]);
4919  (STRIP_TAC);
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`);
4924  (REPEAT STRIP_TAC);
4925  (ASM_CASES_TAC `initial_sublist vl (zl:(real^3)list)`);
4926  (REWRITE_TAC[VORONOI_NONDG]);
4927  (STRIP_TAC);
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`);
4932  (EXPAND_TAC "zl");
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[]);
4940  (ARITH_TAC);
4941  (ASM_ARITH_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)`);
4946  (EXPAND_TAC "zl");
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[]);
4954  (ARITH_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[]);
4967  (STRIP_TAC);
4968  (ASM_SET_TAC[]);
4969
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);
4976  (EXISTS_TAC `4`);
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[]);
4983  (ASM_ARITH_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[]);
4991  (ASM_ARITH_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]);
4994  (STRIP_TAC);
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[]);
4999  (ASM_ARITH_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]);
5005  (ASM_ARITH_TAC);
5006  (ONCE_REWRITE_TAC[GSYM VORONOI_LIST]);
5007  (ASM_ARITH_TAC);
5008
5009 (* ====== *)
5010
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);
5015  (EXISTS_TAC `2`);
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[]);
5022  (EXPAND_TAC "yl");
5023  (REWRITE_TAC[IN]);
5024  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
5025  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
5026  (ARITH_TAC);
5027  (STRIP_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]`);
5048  (REPEAT STRIP_TAC);
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`);
5059  (ASM_ARITH_TAC);
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]);
5069  (NEW_GOAL `F`);
5070  (ASM_ARITH_TAC);
5071  (UP_ASM_TAC THEN MESON_TAC[]);
5072  (ASM_MESON_TAC[ARITH_RULE `0 < 3 /\ 1 < 3 /\ 2 < 3`]);
5073
5074  (ONCE_ASM_REWRITE_TAC[]);
5075  (ASM_REWRITE_TAC[]);
5076
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);
5080  (ASM_ARITH_TAC);
5081  (ASM_REWRITE_TAC[]);
5082  (ARITH_TAC);
5083
5084 (* ======================================================================= *)
5085
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]);
5096
5097  (NEW_GOAL `?u0 q0. xl = CONS (u0:real^3) q0`);
5098  (MATCH_MP_TAC Packing3.LENGTH_IMP_CONS);
5099  (ASM_ARITH_TAC);
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]);
5105  (ARITH_TAC);
5106
5107  (NEW_GOAL `?u1 q1. q0 = CONS (u1:real^3) q1`);
5108  (MATCH_MP_TAC Packing3.LENGTH_IMP_CONS);
5109  (ASM_ARITH_TAC);
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]);
5115  (ARITH_TAC);
5116
5117  (NEW_GOAL `?u2 q2. q1 = CONS (u2:real^3) q2`);
5118  (MATCH_MP_TAC Packing3.LENGTH_IMP_CONS);
5119  (ASM_ARITH_TAC);
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]);
5125  (ARITH_TAC);
5126
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`]);
5141
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`);
5146  (STRIP_TAC);
5147  (ASM_MESON_TAC[]);
5148  (ASM_ARITH_TAC);
5149  (ASM_MESON_TAC[]);
5150  (UP_ASM_TAC THEN REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_0]);
5151  (DISCH_TAC);
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]);
5156  (NEW_GOAL `F`);
5157  (ASM_MESON_TAC[]);
5158  (ASM_MESON_TAC[]);
5159
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]`]);
5167  (MESON_TAC[]);
5168  (UP_ASM_TAC THEN REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1]);
5169  (DISCH_TAC);
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]);
5174  (NEW_GOAL `F`);
5175  (ASM_MESON_TAC[]);
5176  (ASM_MESON_TAC[]);
5177
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`);
5182  (STRIP_TAC);
5183  (ASM_MESON_TAC[]);
5184  (ASM_ARITH_TAC);
5185  (ASM_MESON_TAC[]);
5186  (UP_ASM_TAC THEN REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2]);
5187  (DISCH_TAC);
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]);
5192  (NEW_GOAL `F`);
5193  (ASM_MESON_TAC[]);
5194  (ASM_MESON_TAC[]);
5195
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[]);
5203  (ASM_ARITH_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]);
5218  (STRIP_TAC);
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]);
5228  (STRIP_TAC);
5229  (NEW_GOAL `voronoi_nondg V (ul:(real^3)list)`);
5230  (FIRST_ASSUM MATCH_MP_TAC);
5231  (REWRITE_TAC[Packing3.INITIAL_SUBLIST_REFL]);
5232  (ASM_ARITH_TAC);
5233  (UP_ASM_TAC THEN REWRITE_TAC[VORONOI_NONDG]);
5234  (MESON_TAC[]);
5235  (STRIP_TAC);
5236  (ASM_REWRITE_TAC[IN]);
5237
5238 (* =============================================================== *)
5239
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);
5246
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);
5252
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]);
5258  (STRIP_TAC);
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]);
5267  (STRIP_TAC);
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]);
5271  (ASM_MESON_TAC[]);
5272 (* ======= *)
5273
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[]);
5278
5279 (* ========================================================================== *)
5280
5281  (EQ_TAC);
5282  (SET_TAC[]);
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})`));
5285  (REPEAT STRIP_TAC);
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[]);
5296  (ASM_ARITH_TAC);
5297
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[]);
5308  (ASM_ARITH_TAC);
5309
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}`);
5321  (STRIP_TAC);
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[]);
5328
5329  (MATCH_MP_TAC OMEGA_LIST_2_EXPLICIT_NEW);
5330  (EXISTS_TAC `w3:real^3`);
5331  (REWRITE_TAC[IN]);
5332  (REPEAT STRIP_TAC);
5333  (ASM_REWRITE_TAC[]);
5334  (ASM_REWRITE_TAC[]);
5335  (ASM_REWRITE_TAC[]);
5336  (ASM_MESON_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[]);
5345  (AP_TERM_TAC);
5346  (ASM_REWRITE_TAC[]);
5347
5348 (* ===================================================================== *)
5349
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);
5356
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);
5362
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`]);
5384
5385 (* ===================================================================== *)
5386
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);
5393
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);
5399
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) /\
5402                   mxi V ul = t)`);
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);
5407
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) /\
5410                   mxi V xl = s)`);
5411  (MATCH_MP_TAC MXI_EXPLICIT);
5412  (EXISTS_TAC `w1:real^3` THEN EXISTS_TAC `w2:real^3` THEN EXISTS_TAC `w3:real^3`);
5413  (REPEAT STRIP_TAC);
5414  (ASM_REWRITE_TAC[]);
5415  (ASM_REWRITE_TAC[]);
5416  (ASM_REWRITE_TAC[]);
5417  (ASM_MESON_TAC[]);
5418  (REWRITE_WITH `hl (truncate_simplex 2 (xl:(real^3)list)) = 
5419                  hl (truncate_simplex 2 (ul:(real^3)list))`);
5420  (REWRITE_TAC[HL]);
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]);
5426  (REPEAT STRIP_TAC);
5427
5428  (NEW_GOAL `x IN {w0, w1, w2, w3:real^3}`);
5429  (UP_ASM_TAC THEN SET_TAC[]);
5430  (UP_ASM_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[]);
5443  (ARITH_TAC);
5444  (ASM_REWRITE_TAC[ARITH_RULE `2 <= 4 /\ 4 - 2 = 2`]);
5445
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`]);
5448  (REPEAT STRIP_TAC);
5449  (UP_ASM_TAC THEN SET_TAC[]);
5450  (UP_ASM_TAC THEN SET_TAC[]);
5451  (UP_ASM_TAC THEN SET_TAC[]);
5452  (NEW_GOAL `F`);
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[]);
5464  (ARITH_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]);
5472  (REPEAT STRIP_TAC);
5473  (FIRST_ASSUM MATCH_MP_TAC);
5474  (ARITH_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`]);
5477  (STRIP_TAC);
5478  (NEW_GOAL `{w0, w1, w2} = {w0, w1, w2, w3:real^3}`);
5479  (ASM_SET_TAC[]);
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[]);
5486  (ARITH_TAC);
5487  (STRIP_TAC);
5488  (NEW_GOAL `CARD {w0, w1 , w2:real^3} <= 3`);
5489  (REWRITE_TAC[Geomdetail.CARD3]);
5490  (ASM_MESON_TAC[ARITH_RULE `~(4 <= 3)`]);
5491  (ASM_MESON_TAC[]);
5492
5493
5494  (NEW_GOAL `x IN {u0, u1, u2, u3:real^3}`);
5495  (UP_ASM_TAC THEN SET_TAC[]);
5496  (UP_ASM_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[]);
5510  (ARITH_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`]);
5514  (REPEAT STRIP_TAC);
5515  (UP_ASM_TAC THEN SET_TAC[]);
5516  (UP_ASM_TAC THEN SET_TAC[]);
5517  (UP_ASM_TAC THEN SET_TAC[]);
5518  (NEW_GOAL `F`);
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`]);
5522
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]);
5529  (REPEAT STRIP_TAC);
5530  (FIRST_ASSUM MATCH_MP_TAC);
5531  (ARITH_TAC);
5532
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[]);
5541  (ARITH_TAC);
5542  (REWRITE_TAC[ARITH_RULE `4 - 1 = 3 /\ 3 < 4`]);
5543  (MATCH_MP_TAC KY_PERMUTES_2_PERMUTES_3 );
5544  (ASM_REWRITE_TAC[]);
5545
5546  (ASM_REWRITE_TAC[EL; TL; HD; 
5547    ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
5548  (STRIP_TAC);
5549  (NEW_GOAL `{u0, u1, u2} = {u0, u1, u2, u3:real^3}`);
5550  (ASM_SET_TAC[]);
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[]);
5557  (ARITH_TAC);
5558  (STRIP_TAC);
5559  (NEW_GOAL `CARD {u0, u1 , u2:real^3} <= 3`);
5560  (REWRITE_TAC[Geomdetail.CARD3]);
5561  (ASM_MESON_TAC[ARITH_RULE `~(4 <= 3)`]);
5562  (ASM_MESON_TAC[]);
5563  (ASM_REWRITE_TAC[]);
5564
5565  (REWRITE_TAC[HL]);
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[]);
5575  (ARITH_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);
5581  (UNDISCH_TAC 
5582   `between s (omega_list_n V (xl:(real^3)list) 2,omega_list_n V xl 3)` 
5583   THEN REWRITE_TAC[
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`]
5586   THEN DISCH_TAC);
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[]);
5590
5591 (* ========================================================================== *)
5592
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[]);
5603
5604  (NEW_GOAL `s2:real^3 = circumcenter (set_of_list zl)`);
5605  (EXPAND_TAC "s2");
5606  (REWRITE_WITH `omega_list_n V ul 2 = omega_list V zl`);
5607  (EXPAND_TAC "zl");
5608  (REWRITE_TAC[ASSUME `ul = [u0;u1;u2;u3:real^3]` ; OMEGA_LIST_TRUNCATE_2]);
5609  (MATCH_MP_TAC Rogers.XNHPWAB1);
5610  (EXISTS_TAC `2`);
5611  (ASM_REWRITE_TAC[IN]);
5612  (REWRITE_TAC[GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`)]);
5613  (ASM_REWRITE_TAC[]);
5614
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`);
5619  (REPEAT STRIP_TAC);
5620  (ASM_REWRITE_TAC[]);
5621  (ASM_REWRITE_TAC[]);
5622
5623 (* ========================================================================== *)
5624
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]);
5628  (REPEAT STRIP_TAC);
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]);
5634  (STRIP_TAC);
5635  (FIRST_ASSUM MATCH_MP_TAC);
5636
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[]);
5642  (STRIP_TAC);
5643  (UP_ASM_TAC THEN SET_TAC[]);
5644
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]);
5657  (STRIP_TAC);
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[]);
5666  (ARITH_TAC);
5667  (UP_ASM_TAC THEN ASM_REWRITE_TAC[AFF_DIM_EQ_0]);
5668  (SET_TAC[]);
5669
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)`));
5674  (SET_TAC[]);
5675  (STRIP_TAC);
5676  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
5677  (REWRITE_TAC[IN_AFFINE_KY_LEMMA1]);
5678  (ASM_REWRITE_TAC[]);
5679
5680  (ASM_REWRITE_TAC[]);
5681  (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list]);
5682  (NEW_GOAL `u0 IN {u0, u1, u2:real^3}`);
5683  (SET_TAC[]);
5684  (UP_ASM_TAC THEN REWRITE_TAC[IN_AFFINE_KY_LEMMA1]);
5685
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`);
5690  (REPEAT STRIP_TAC);
5691  (ASM_REWRITE_TAC[]);
5692  (ASM_REWRITE_TAC[]);
5693
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]);
5697  (REPEAT STRIP_TAC);
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]);
5703  (STRIP_TAC);
5704  (FIRST_ASSUM MATCH_MP_TAC);
5705
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[]);
5711  (STRIP_TAC);
5712  (UP_ASM_TAC THEN SET_TAC[]);
5713
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]);
5726  (STRIP_TAC);
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[]);
5735  (ARITH_TAC);
5736  (UP_ASM_TAC THEN ASM_REWRITE_TAC[AFF_DIM_EQ_0]);
5737  (SET_TAC[]);
5738
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)`));
5743  (SET_TAC[]);
5744  (STRIP_TAC);
5745  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
5746  (REWRITE_TAC[IN_AFFINE_KY_LEMMA1]);
5747  (ASM_REWRITE_TAC[]);
5748
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[]);
5767  (ARITH_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]);
5770  (REPEAT STRIP_TAC);
5771  (SET_TAC[]);
5772  (NEW_GOAL `w3 = u3:real^3`);
5773  (REWRITE_WITH `w3:real^3 = EL (p 3) xl /\ u3:real^3 = EL 3 ul`);
5774  (STRIP_TAC);
5775  (REWRITE_WITH `(p:num->num) 3 = 3`);
5776  (MP_TAC (ASSUME `p permutes 0..2`));
5777  (REWRITE_TAC[permutes; IN_NUMSEG]);
5778  (REPEAT STRIP_TAC);
5779  (FIRST_ASSUM MATCH_MP_TAC);
5780  (ARITH_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[]);
5794  (ARITH_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[]);
5798
5799  (NEW_GOAL `CARD {w0, w1, w2, w3:real^3} <= 3`);
5800  (REWRITE_WITH `{w0, w1, w2, w3:real^3} = {w0, w1, w2}`);
5801  (ASM_SET_TAC[]);
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[]);
5810  (ASM_ARITH_TAC);
5811
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)`]);
5817  (STRIP_TAC);
5818
5819
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)`]);
5825  (STRIP_TAC);
5826
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`);
5839  (STRIP_TAC);
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[]);
5845
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[]);
5861  (ARITH_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]);
5864  (REPEAT STRIP_TAC);
5865  (SET_TAC[]);
5866  (NEW_GOAL `w3 = u3:real^3`);
5867  (REWRITE_WITH `w3:real^3 = EL (p 3) xl /\ u3:real^3 = EL 3 ul`);
5868  (STRIP_TAC);
5869  (REWRITE_WITH `(p:num->num) 3 = 3`);
5870  (MP_TAC (ASSUME `p permutes 0..2`));
5871  (REWRITE_TAC[permutes; IN_NUMSEG]);
5872  (REPEAT STRIP_TAC);
5873  (FIRST_ASSUM MATCH_MP_TAC);
5874  (ARITH_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[]);
5888  (ARITH_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[]);
5892
5893  (NEW_GOAL `CARD {w0, w1, w2, w3:real^3} <= 3`);
5894  (REWRITE_WITH `{w0, w1, w2, w3:real^3} = {w0, w1, w2}`);
5895  (ASM_SET_TAC[]);
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[]);
5904  (ASM_ARITH_TAC);
5905
5906  (REWRITE_TAC[REAL_ARITH `a + b = c + b <=> a = c`]);
5907  (STRIP_TAC);
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]);
5916  (REPEAT STRIP_TAC);
5917  (UNDISCH_TAC `between t (s2,s3:real^3)`);
5918  (REWRITE_TAC[BETWEEN_IN_CONVEX_HULL; CONVEX_HULL_2; IN; IN_ELIM_THM]);
5919  (REPEAT STRIP_TAC);
5920
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]);
5934  (STRIP_TAC);
5935  (NEW_GOAL `u = u':real /\ v = v':real`);
5936  (ASM_REAL_ARITH_TAC);
5937  (ASM_REWRITE_TAC[]);
5938  (NEW_GOAL `F`);
5939  (UP_ASM_TAC THEN REWRITE_TAC[NORM_EQ_0; 
5940    VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
5941  (STRIP_TAC);
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]);
5956  (AP_TERM_TAC);
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[]);
5965  (ARITH_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]);
5969  (ASM_SET_TAC[]);
5970  (NEW_GOAL `s3:real^3 = circumcenter (set_of_list ul)`);
5971  (ASM_SET_TAC[]);
5972
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[]);
5981
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)`);
5992  (ASM_MESON_TAC[]);
5993  (UP_ASM_TAC THEN REWRITE_TAC[ASSUME `zl = 
5994    truncate_simplex 2 (ul:(real^3)list)`]);
5995  (ASM_REAL_ARITH_TAC);
5996  (ASM_MESON_TAC[]);
5997  (ASM_MESON_TAC[])]);;
5998
5999 (* ======================================================================== *)
6000 (* Lemma 75 *)
6001
6002 let MEM_LEFT_ACTION_LIST_3 = prove_by_refinement (
6003  `!(ul:(A)list) p x. 
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]);
6008  (EQ_TAC);
6009  (STRIP_TAC);
6010  (POP_ASSUM MP_TAC);
6011  (ASM_SIMP_TAC[left_action_list; Packing3.EL_TABLE]);
6012  (DISCH_TAC);
6013  (ASM_CASES_TAC `i < LENGTH (ul:(A)list) - 2`);
6014  (EXISTS_TAC `inverse (p:num->num) i`);
6015  (REWRITE_TAC[]);
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`);
6021  (ASM_ARITH_TAC);
6022  (DISCH_TAC);
6023  (NEW_GOAL `inverse p permutes 0..n - 1`);
6024  (ASM_MESON_TAC[]);
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]);
6029  (ASM_ARITH_TAC);
6030
6031 (* ====================================================================== *)
6032
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]);
6039  (REPEAT STRIP_TAC);
6040  (REWRITE_WITH `inverse p (i:num) = i`);
6041  (FIRST_ASSUM MATCH_MP_TAC);
6042  (REWRITE_TAC[IN_NUMSEG]);
6043  (STRIP_TAC);
6044  (ASM_ARITH_TAC);
6045
6046 (* ====================================================================== *)
6047
6048  (STRIP_TAC);
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]);
6054  (REPEAT STRIP_TAC);
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]);
6059  (ASM_ARITH_TAC);
6060  (UNDISCH_TAC `!y. ?!x. (p:num->num) x = y`);
6061  (REWRITE_TAC[EXISTS_UNIQUE]);
6062  (REPEAT STRIP_TAC);
6063  (NEW_GOAL `?x. p x = (p:num->num) i /\ (!y'. p y' = p i ==> y' = x)`);
6064  (ASM_MESON_TAC[]);
6065  (UP_ASM_TAC THEN STRIP_TAC);
6066  (NEW_GOAL `i = x':num`);
6067  (FIRST_ASSUM MATCH_MP_TAC);
6068  (REFL_TAC);
6069  (NEW_GOAL `(p:num->num) i = x':num`);
6070  (FIRST_ASSUM MATCH_MP_TAC);
6071  (ASM_MESON_TAC[]);
6072  (NEW_GOAL `i >= LENGTH (ul:(A)list)`);
6073  (ASM_ARITH_TAC);
6074  (NEW_GOAL `F`);
6075  (ASM_ARITH_TAC);
6076  (ASM_MESON_TAC[]);
6077  (ASM_ARITH_TAC);
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]);
6081
6082
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]);
6091  (REPEAT STRIP_TAC);
6092  (FIRST_ASSUM MATCH_MP_TAC);
6093  (REWRITE_TAC[IN_NUMSEG_0]);
6094  (ASM_ARITH_TAC)]);;
6095
6096 (* ====================================================================== *)
6097 (* Lemma 76 *)
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]);;
6103
6104 (* ====================================================================== *)
6105 (* Lemma 77 *)
6106
6107
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[]);
6116  (DISJ2_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[]);
6123  (ARITH_TAC);
6124  (ASM_REWRITE_TAC[TABLE_4]);
6125
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]);
6130  (REPEAT STRIP_TAC);
6131  (FIRST_ASSUM MATCH_MP_TAC);
6132  (UP_ASM_TAC THEN REWRITE_TAC[IN_NUMSEG]);
6133  (ASM_ARITH_TAC);
6134  (NEW_GOAL `2 IN 2..3 /\ 3 IN 2..3`);
6135  (REWRITE_TAC[IN_NUMSEG]);
6136  (ASM_ARITH_TAC);
6137  (ASM_SIMP_TAC[EL; TL; ARITH_RULE `2 = SUC 1 /\ 3 = SUC 2 /\ 1 = SUC 0`; HD]);
6138
6139
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]);
6145  (STRIP_TAC);
6146  (ASM_CASES_TAC `inverse p 0 = 1`);
6147  (ASM_REWRITE_TAC[]);
6148
6149  (ABBREV_TAC `y:num = inverse p 1`);
6150  (NEW_GOAL `?!x:num. inverse p x = y:num`);
6151  (ASM_MESON_TAC[]);
6152  (UP_ASM_TAC THEN REWRITE_TAC[EXISTS_UNIQUE]);
6153  (STRIP_TAC);
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[]);
6164  (NEW_GOAL `y = 1`);
6165  (ASM_REWRITE_TAC[]);
6166
6167  (NEW_GOAL `?!x:num. inverse p x = 1`);
6168  (ASM_MESON_TAC[]);
6169  (UP_ASM_TAC THEN REWRITE_TAC[EXISTS_UNIQUE]);
6170  (STRIP_TAC);
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[]);
6177  (NEW_GOAL `F`);
6178  (ASM_ARITH_TAC);
6179  (ASM_MESON_TAC[]);
6180  (UP_ASM_TAC THEN REWRITE_TAC[MESON[] `~ ~ s = s`; IN_NUMSEG_0]);
6181  (DISCH_TAC);
6182  (ASM_CASES_TAC `y = 1`);
6183
6184  (NEW_GOAL `?!x:num. inverse p x = 1`);
6185  (ASM_MESON_TAC[]);
6186  (UP_ASM_TAC THEN REWRITE_TAC[EXISTS_UNIQUE]);
6187  (STRIP_TAC);
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[]);
6194  (NEW_GOAL `F`);
6195  (ASM_ARITH_TAC);
6196  (ASM_MESON_TAC[]);
6197  (ASM_ARITH_TAC);
6198  (NEW_GOAL `F`);
6199
6200 (* ========================= *)
6201
6202
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`);
6210  (ASM_MESON_TAC[]);
6211  (UP_ASM_TAC THEN REWRITE_TAC[EXISTS_UNIQUE]);
6212  (STRIP_TAC);
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);
6218  (ASM_MESON_TAC[]);
6219  (NEW_GOAL `y = 1`);
6220  (ASM_REWRITE_TAC[]);
6221  (NEW_GOAL `y = 0`);
6222  (ASM_REWRITE_TAC[]);
6223  (UNDISCH_TAC `~(y IN 0..1)`);
6224  (REWRITE_TAC[IN_NUMSEG_0]);
6225  (ASM_ARITH_TAC);
6226  (NEW_GOAL `F`);
6227  (ASM_ARITH_TAC);
6228  (ASM_MESON_TAC[]);
6229
6230  (UP_ASM_TAC THEN REWRITE_TAC[MESON[] `~ ~ s = s`; IN_NUMSEG_0]);
6231  (DISCH_TAC);
6232
6233  (NEW_GOAL`y = 0`);
6234  (ASM_ARITH_TAC);
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`);
6242  (ASM_MESON_TAC[]);
6243  (UP_ASM_TAC THEN REWRITE_TAC[EXISTS_UNIQUE]);
6244  (STRIP_TAC);
6245  (NEW_GOAL `z = x:num`);
6246  (FIRST_ASSUM MATCH_MP_TAC);
6247  (ASM_REWRITE_TAC[]);
6248  (NEW_GOAL `1 = x`);
6249  (FIRST_ASSUM MATCH_MP_TAC);
6250  (ASM_REWRITE_TAC[]);
6251  (ASM_ARITH_TAC);
6252  (UP_ASM_TAC THEN REWRITE_TAC[MESON[] `~ ~ s = s`; IN_NUMSEG_0]);
6253  (DISCH_TAC);
6254
6255  (ASM_CASES_TAC `z = 0`);
6256  (NEW_GOAL `?!x:num. inverse p x = 0`);
6257  (ASM_MESON_TAC[]);
6258  (UP_ASM_TAC THEN REWRITE_TAC[EXISTS_UNIQUE]);
6259  (STRIP_TAC);
6260  (NEW_GOAL `1 = x:num`);
6261  (FIRST_ASSUM MATCH_MP_TAC);
6262  (ASM_REWRITE_TAC[]);
6263  (NEW_GOAL `0 = x`);
6264  (FIRST_ASSUM MATCH_MP_TAC);
6265  (ASM_REWRITE_TAC[]);
6266  (NEW_GOAL `F`);
6267  (ASM_ARITH_TAC);
6268  (ASM_MESON_TAC[]);
6269  (ASM_ARITH_TAC);
6270
6271  (UNDISCH_TAC `~(left_action_list p ul = ul:(real^3)list)`);
6272  (REWRITE_TAC[]);
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[]);
6279  (ARITH_TAC);
6280  (ASM_REWRITE_TAC[TABLE_4]);
6281  (NEW_GOAL `2 IN 2..3 /\ 3 IN 2..3`);
6282  (REWRITE_TAC[IN_NUMSEG]);
6283  (ASM_ARITH_TAC);
6284  (ASM_SIMP_TAC[EL; TL; ARITH_RULE `2 = SUC 1 /\ 3 = SUC 2 /\ 1 = SUC 0`; HD]);
6285  (ASM_MESON_TAC[]);
6286  (REWRITE_TAC[EL; TL; ARITH_RULE `2 = SUC 1 /\ 3 = SUC 2 /\ 1 = SUC 0`; HD])]);;
6287
6288
6289 (* ====================================================================== *)
6290 (* Lemma 78 *)
6291 (* ======================================================================= *)
6292
6293 let LEFT_ACTION_LIST_1_PROPERTIES = prove_by_refinement (
6294  `!V ul p.
6295          packing V /\
6296          saturated V /\
6297          barV V 3 ul /\
6298          p permutes 0..1 /\
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[]);
6321
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`]);
6325  (GEN_TAC);
6326  (ASM_CASES_TAC `LENGTH (vl:(real^3)list) = 1`);
6327  (STRIP_TAC);
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[]);
6333  (ARITH_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]);
6339  (STRIP_TAC);
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);
6346  (ASM_MESON_TAC[]);
6347  (ARITH_TAC);
6348
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]);
6352  (REPEAT STRIP_TAC);
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]);
6356  (ARITH_TAC);
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[]);
6367
6368
6369
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)`);
6373
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]);
6377  (DISCH_TAC);
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]);
6383  (STRIP_TAC);
6384  (REWRITE_TAC[GSYM (ASSUME `[u0;u1:real^3] = zl`); 
6385    GSYM (ASSUME `[u1;u0:real^3] = vl`); set_of_list]);
6386  (SET_TAC[]);
6387
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]);
6391  (DISCH_TAC);
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]);
6397  (STRIP_TAC);
6398  (REWRITE_TAC[GSYM (ASSUME `[u0;u1;u2:real^3] = zl`); 
6399    GSYM (ASSUME `[u1;u0;u2:real^3] = vl`); set_of_list]);
6400  (SET_TAC[]);
6401
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]);
6405  (DISCH_TAC);
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]);
6411  (STRIP_TAC);
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]);
6414  (SET_TAC[]);
6415
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]);
6419  (STRIP_TAC);
6420  (NEW_GOAL `F`);
6421  (ASM_ARITH_TAC);
6422  (ASM_MESON_TAC[]);
6423
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`);
6429  (ASM_ARITH_TAC);
6430  (REWRITE_WITH 
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[]);
6434
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]);
6438  (ASM_ARITH_TAC);
6439  (ASM_MESON_TAC[]);
6440  (UNDISCH_TAC `barV V 3 ul` THEN REWRITE_TAC[BARV; VORONOI_NONDG]);
6441  (STRIP_TAC);
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`);
6450  (ASM_ARITH_TAC);
6451
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]);
6455  (ASM_ARITH_TAC);
6456  (REWRITE_WITH `k -1 + 1 = k`);
6457  (ASM_ARITH_TAC);
6458  (ASM_MESON_TAC[]);
6459
6460
6461  (NEW_GOAL `omega_list_n V [u1; u0; u2; u3:real^3] 1 = omega_list_n V ul 1`);
6462  (REWRITE_WITH 
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[]);
6472
6473  (REWRITE_WITH 
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`);
6477  (REWRITE_TAC[IN]);
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[]);
6483  (AP_TERM_TAC);
6484  (SET_TAC[]);
6485
6486
6487
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}`]);
6492
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[]);
6498
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]);
6502  (COND_CASES_TAC);
6503  (REFL_TAC);
6504  (NEW_GOAL `F`);
6505  (ASM_MESON_TAC[]);
6506  (ASM_MESON_TAC[]);
6507
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]);
6510  (COND_CASES_TAC);
6511  (REFL_TAC);
6512  (NEW_GOAL `F`);
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[]);
6518  (ASM_MESON_TAC[]);
6519  (ASM_MESON_TAC[]);
6520
6521  (ASM_REWRITE_TAC[]);
6522
6523 (* ================================================================== *)
6524 (* New part *)
6525
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) /\
6529                   mxi V ul = t)`);
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)`]);
6535  (ASM_MESON_TAC[]);
6536
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`);
6541  (ASM_MESON_TAC[]);
6542  (MATCH_MP_TAC MXI_EXPLICIT);
6543  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
6544  (REPEAT STRIP_TAC);
6545  (ASM_REWRITE_TAC[]);
6546  (ASM_REWRITE_TAC[]);
6547  (UNDISCH_TAC `[u1; u0; u2; u3] IN barV V 3` THEN REWRITE_TAC[IN]);
6548  (REWRITE_TAC[]);
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);
6560
6561
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]);
6568  (EXPAND_TAC "s2");
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`);
6573  (ASM_MESON_TAC[]);
6574  (ASM_REAL_ARITH_TAC);
6575
6576
6577  (NEW_GOAL `s2 IN voronoi_list V [u0;u1;u2:real^3]`);
6578  (EXPAND_TAC "s2");
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]);
6584  (REPEAT STRIP_TAC);
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)`]);
6594
6595
6596  (NEW_GOAL `s3 IN voronoi_list V [u0;u1;u2:real^3]`);
6597  (EXPAND_TAC "s3");
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]`);
6602  (STRIP_TAC);
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]);
6606  (REPEAT STRIP_TAC);
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]);
6617  (SET_TAC[]);
6618
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}`);
6624  (STRIP_TAC);
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);
6630  (ASM_SET_TAC[]);
6631
6632
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[]);
6641  (REPEAT STRIP_TAC);
6642  (REWRITE_WITH `[u0; u1; u2:real^3] = truncate_simplex 2 ul`);
6643  (ASM_MESON_TAC[]);
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[]);
6652  (STRIP_TAC);
6653  (SET_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]);
6658
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[]);
6666  (REPEAT STRIP_TAC);
6667  (REWRITE_WITH `[u0; u1; u2:real^3] = truncate_simplex 2 ul`);
6668  (ASM_MESON_TAC[]);
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[]);
6677  (STRIP_TAC);
6678  (SET_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]);
6683
6684
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[]);
6692  (REPEAT STRIP_TAC);
6693  (REWRITE_WITH `[u0; u1; u2:real^3] = truncate_simplex 2 ul`);
6694  (ASM_MESON_TAC[]);
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[]);
6703  (STRIP_TAC);
6704  (SET_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]);
6709
6710  (ABBREV_TAC `s1 = omega_list_n V (ul:(real^3)list) 1`);
6711
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[]);
6720
6721  (NEW_GOAL `s2 IN voronoi_list V [u0;u1:real^3]`);
6722  (EXPAND_TAC "s2");
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]`);
6727  (STRIP_TAC);
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]);
6731  (REPEAT STRIP_TAC);
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]);
6742  (SET_TAC[]);
6743
6744  (NEW_GOAL `s1 IN voronoi_list V [u0;u1:real^3]`);
6745  (EXPAND_TAC "s1");
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]);
6751  (REPEAT STRIP_TAC);
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)`]);
6761
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[]);
6769  (REPEAT STRIP_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);
6788  (SET_TAC[]);
6789
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[]);
6797  (REPEAT STRIP_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);
6816  (SET_TAC[]);
6817  (NEW_GOAL `norm (u0 - s1) = norm (u1 - s1:real^3)`);
6818  (ASM_REWRITE_TAC[set_of_list; Rogers.CIRCUMCENTER_2; midpoint]);
6819  (NORM_ARITH_TAC);
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]);
6839  (MESON_TAC[]);
6840
6841  (SWITCH_TAC);
6842  (UP_ASM_TAC);
6843  (UNDISCH_TAC `between s (s2,s3:real^3)`);
6844  (REWRITE_TAC[BETWEEN_IN_CONVEX_HULL; IN; CONVEX_HULL_2; IN_ELIM_THM]);
6845  (STRIP_TAC);
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[]);
6850  (VECTOR_ARITH_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);
6854
6855  (UNDISCH_TAC `between t (s2,s3:real^3)`);
6856  (REWRITE_TAC[BETWEEN_IN_CONVEX_HULL; IN; CONVEX_HULL_2; IN_ELIM_THM]);
6857  (STRIP_TAC);
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[]);
6862  (VECTOR_ARITH_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`]);
6868  (STRIP_TAC);
6869  (ASM_CASES_TAC `norm (s3 - s2:real^3) pow 2 = &0`);
6870  (NEW_GOAL `F`);
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`]);
6873  (ASM_MESON_TAC[]);
6874  (ASM_MESON_TAC[]);
6875  (NEW_GOAL `v pow 2 - v' pow 2 = &0`);
6876  (UP_ASM_TAC THEN UP_ASM_TAC THEN REWRITE_TAC[REAL_ENTIRE]);
6877  (MESON_TAC[]);
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[])]);;
6885
6886 (* ====================================================================== *)
6887 (* Lemma 79 *)
6888
6889 let NUMSEG_012 = prove_by_refinement (
6890  `{0,1,2} = 0..2`,
6891 [(REWRITE_TAC[IN_NUMSEG_0; SET_EQ_LEMMA]);
6892  (REPEAT STRIP_TAC);
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`]);
6895  (SET_TAC[])]);;
6896
6897 let SET_OF_LIST_TRUN2_LEFT_ACTION_LIST2 = prove_by_refinement (
6898  `!V ul p. packing V /\ saturated V /\ barV V 3 ul /\ 
6899   p permutes 0..2 ==> 
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]);
6909
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}`);
6913  (REPEAT STRIP_TAC);
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)`);
6918  (NEW_GOAL `F`);
6919  (NEW_GOAL `inverse p j = j:num`);
6920  (ASM_SIMP_TAC[]);
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);
6926  (ASM_MESON_TAC[]);
6927  (NEW_GOAL `j = x:num`);
6928  (FIRST_ASSUM MATCH_MP_TAC);
6929  (ASM_MESON_TAC[]);
6930  (NEW_GOAL `~(i IN 0..2)`);
6931  (ASM_MESON_TAC[]);
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`]);
6934  (ASM_MESON_TAC[]);
6935  (UP_ASM_TAC THEN REWRITE_TAC[IN_NUMSEG; SET_RULE `i IN {a,b,c} <=> i = a \/ i = b \/ i = c`]);
6936  (ARITH_TAC);
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]);
6940
6941  (REWRITE_TAC[SET_EQ_LEMMA]);
6942  (REPEAT STRIP_TAC);
6943  (NEW_GOAL `!i. i IN {0,1,2} ==>
6944    EL (inverse p i) [u0; u1; u2; u3:real^3] IN {u0,u1,u2}`);
6945  (REPEAT STRIP_TAC);
6946  (NEW_GOAL `inverse (p:num->num) i IN {0, 1, 2} `);
6947  (ASM_SIMP_TAC[]);
6948  (ASM_CASES_TAC `inverse (p:num->num) i = 0`);
6949  (ASM_REWRITE_TAC[]);
6950  (SET_TAC[]);
6951  (ASM_CASES_TAC `inverse (p:num->num) i = 1`);
6952  (ASM_REWRITE_TAC[]);
6953  (SET_TAC[]);
6954  (ASM_CASES_TAC `inverse (p:num->num) i = 2`);
6955  (ASM_REWRITE_TAC[]);
6956  (SET_TAC[]);
6957  (NEW_GOAL `F`);
6958  (ASM_SET_TAC[]);
6959  (ASM_MESON_TAC[]);
6960  (ASM_SET_TAC[]);
6961
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`]);
6973  (STRIP_TAC);
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)`);
6977  (ASM_MESON_TAC[]);
6978  (UP_ASM_TAC THEN REWRITE_TAC[IN_NUMSEG_0]);
6979  (ARITH_TAC);
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[]);
6983  (ASM_SET_TAC[]);
6984
6985
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`]);
6997  (STRIP_TAC);
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)`);
7001  (ASM_MESON_TAC[]);
7002  (UP_ASM_TAC THEN REWRITE_TAC[IN_NUMSEG_0]);
7003  (ARITH_TAC);
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[]);
7007  (ASM_SET_TAC[]);
7008
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`]);
7020  (STRIP_TAC);
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)`);
7024  (ASM_MESON_TAC[]);
7025  (UP_ASM_TAC THEN REWRITE_TAC[IN_NUMSEG_0]);
7026  (ARITH_TAC);
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[]);
7030  (ASM_SET_TAC[]);
7031  (NEW_GOAL `F`);
7032  (ASM_SET_TAC[]);
7033  (ASM_MESON_TAC[])]);;
7034
7035
7036 (* ====================================================================== *)
7037 (* Lemma 80 *)
7038
7039 let SQRT2_LT_2 = prove_by_refinement (
7040  `sqrt (&2) < &2`,
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`;  
7045   SQRT_POW_2])]);;
7046
7047
7048 end;;