Update from HH
[Flyspeck/.git] / text_formalization / packing / REUHADY.hl
1 (* ========================================================================= *)
2 (*                FLYSPECK - BOOK FORMALIZATION                              *)
3 (*                                                                           *)
4 (*      Author    : VU KHAC KY                                               *)
5 (*      Book lemma: REUHADY                                                  *)
6 (*      Chapter    : Packing (Marchal cells)                                 *)
7 (*      Date    : Nov 2012                                                   *)
8 (*                                                                           *)
9 (* ========================================================================= *)
10
11 module Reuhady = struct
12
13 open Sphere;;
14 open Euler_main_theorem;;
15 open Pack_defs;;
16 open Pack_concl;; 
17 open Pack1;;
18 open Pack2;;
19 open Packing3;;
20 open Rogers;; 
21 open Vukhacky_tactics;;
22 open Marchal_cells;;
23 open Emnwuus;;
24 (* open Marchal_cells_2;; *)
25 open Marchal_cells_2_new;;
26 open Urrphbz1;;
27 open Lepjbdj;;
28 open Hdtfnfz;;
29 open Rvfxzbu;;
30 open Sltstlo;;
31 open Urrphbz2;;
32 open Urrphbz3;;
33 open Ynhyjit;;
34 open Njiutiu;;
35 open Tezffsk;;
36 open Qzksykg;;
37 open Ddzuphj;;
38 open Ajripqn;;
39 open Qzyzmjc;;
40 open Upfzbzm_support_lemmas;;
41 open Marchal_cells_3;;
42 open Grutoti;;
43 open Kizhltl;;
44 open Sum_gammax_lmfun_estimate;; 
45 open Upfzbzm;;
46 open Rdwkarc;;
47 open Ineq;;
48 open Merge_ineq;;
49 open Hales_tactic;;
50
51
52 let wedge_ge = new_definition `wedge_ge  v0 v1 w1 w2 = { z |
53 &0 <= azim v0 v1 w1 z /\ azim v0 v1 w1 z <= azim v0 v1 w1 w2 }`;;
54
55 let BARV_2_IMP_NOT_COLLINEAR_SET_OF_LIST = prove_by_refinement (
56  `!V ul. packing V /\ barV V 2 ul ==> 
57            ~collinear (set_of_list ul)`,
58 [(REWRITE_TAC[COLLINEAR_AFF_DIM]);
59  (REPEAT STRIP_TAC);
60  (NEW_GOAL `aff_dim (set_of_list (ul:(real^3)list)) = &2`);
61  (MATCH_MP_TAC MHFTTZN1);
62  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
63  (ASM_ARITH_TAC)]);;
64
65 (* ========================================================================= *)
66 (* ====            Harrison lemmas about WEDGE_GE                      ===== *)
67 (* ========================================================================= *)
68
69 let WEDGE_SIMPLE = prove
70  (`!v0 v1 w1 w2.
71         wedge v0 v1 w1 w2 =
72         {y | &0 < azim v0 v1 w1 y /\ azim v0 v1 w1 y < azim v0 v1 w1 w2}`,
73   REPEAT GEN_TAC THEN REWRITE_TAC[wedge] THEN
74   MATCH_MP_TAC(SET_RULE
75    `(!x. P x ==> ~Q x) ==> {x | ~P x /\ Q x /\ R x} = {x | Q x /\ R x}`) THEN
76   SIMP_TAC[AZIM_DEGENERATE; REAL_LT_REFL]);;
77
78 let WEDGE_GE_WEDGE = prove
79  (`!v0 v1 w1 w2.
80         wedge_ge v0 v1 w1 w2 =
81         wedge v0 v1 w1 w2 UNION
82         {z | azim v0 v1 w1 z = &0} UNION
83         {z | azim v0 v1 w1 z = azim v0 v1 w1 w2}`,
84   REWRITE_TAC[wedge_ge; WEDGE_SIMPLE; EXTENSION; IN_UNION; IN_ELIM_THM] THEN
85   REPEAT GEN_TAC THEN
86   MP_TAC(ISPECL [`v0:real^3`; `v1:real^3`; `w1:real^3`; `w2:real^3`] azim) THEN
87   REAL_ARITH_TAC);;
88
89 let ARG_EQ_SUBSET_HALFLINE = prove
90  (`!a. ?b. ~(b = vec 0) /\ {z | Arg z = a} SUBSET aff_ge {vec 0} {b}`,
91   GEN_TAC THEN ASM_CASES_TAC `{z | Arg z = a} SUBSET {vec 0}` THENL
92    [EXISTS_TAC `basis 1:real^2` THEN
93     SIMP_TAC[BASIS_NONZERO; DIMINDEX_2; ARITH] THEN
94     FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
95        SUBSET_TRANS)) THEN SIMP_TAC[SUBSET; IN_SING; ENDS_IN_HALFLINE];
96     ALL_TAC] THEN
97   FIRST_X_ASSUM(MP_TAC o MATCH_MP (SET_RULE
98    `~(s SUBSET {a}) ==> ?z. ~(a = z) /\ z IN s`)) THEN
99   MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `z:complex` THEN
100   REWRITE_TAC[IN_ELIM_THM] THEN DISCH_THEN(STRIP_ASSUME_TAC o GSYM) THEN
101   ASM_REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN
102   X_GEN_TAC `x:complex` THEN
103   ASM_CASES_TAC `x:complex = vec 0` THEN ASM_REWRITE_TAC[ENDS_IN_HALFLINE] THEN
104   RULE_ASSUM_TAC(REWRITE_RULE[COMPLEX_VEC_0]) THEN ASM_SIMP_TAC[ARG_EQ] THEN
105   DISCH_THEN(X_CHOOSE_THEN `u:real` STRIP_ASSUME_TAC) THEN
106   ASM_REWRITE_TAC[GSYM COMPLEX_CMUL] THEN
107   REWRITE_TAC[HALFLINE_EXPLICIT; IN_ELIM_THM; VECTOR_MUL_RZERO] THEN
108   MAP_EVERY EXISTS_TAC [`&1 - u`; `u:real`] THEN
109   ASM_SIMP_TAC[VECTOR_ADD_LID; REAL_LT_IMP_LE] THEN ASM_REAL_ARITH_TAC);;
110
111 let ARG_DIV_EQ_SUBSET_HALFLINE = prove
112  (`!w a. ~(w = vec 0)
113          ==> ?b. ~(b = vec 0) /\
114                  {z | Arg(z / w) = a} SUBSET aff_ge {vec 0} {b}`,
115   REPEAT GEN_TAC THEN GEOM_BASIS_MULTIPLE_TAC 1 `w:complex` THEN
116   X_GEN_TAC `w:real` THEN ASM_CASES_TAC `w = &0` THEN
117   ASM_REWRITE_TAC[VECTOR_MUL_LZERO; REAL_LE_LT] THEN DISCH_TAC THEN
118   X_GEN_TAC `a:real` THEN DISCH_THEN(K ALL_TAC) THEN
119   ASM_SIMP_TAC[ARG_DIV_CX; COMPLEX_CMUL; COMPLEX_BASIS; GSYM CX_MUL;
120                REAL_MUL_RID; ARG_EQ_SUBSET_HALFLINE]);;
121
122 let COPLANAR_AZIM_EQ = prove
123  (`!v0 v1 w1 a.
124      (collinear{v0,v1,w1} ==> ~(a = &0))
125      ==> coplanar {z | azim v0 v1 w1 z = a}`,
126   REPEAT GEN_TAC THEN ASM_CASES_TAC `collinear{v0:real^3,v1,w1}` THENL
127    [ASM_SIMP_TAC[azim_def; EMPTY_GSPEC; COPLANAR_EMPTY]; ALL_TAC] THEN
128   ASM_REWRITE_TAC[] THEN POP_ASSUM MP_TAC THEN
129   GEOM_ORIGIN_TAC `v0:real^3` THEN
130   GEOM_BASIS_MULTIPLE_TAC 3 `v1:real^3` THEN
131   X_GEN_TAC `v1:real` THEN ASM_CASES_TAC `v1 = &0` THENL
132    [ASM_REWRITE_TAC[VECTOR_MUL_LZERO; INSERT_AC; COLLINEAR_2]; ALL_TAC] THEN
133   ASM_SIMP_TAC[REAL_LE_LT; COLLINEAR_SPECIAL_SCALE] THEN REPEAT STRIP_TAC THEN
134   ASM_SIMP_TAC[AZIM_SPECIAL_SCALE; AZIM_ARG] THEN
135   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE RAND_CONV [COLLINEAR_BASIS_3]) THEN
136   POP_ASSUM_LIST(K ALL_TAC) THEN DISCH_THEN(X_CHOOSE_THEN `b:real^2`
137    STRIP_ASSUME_TAC o SPEC `a:real` o MATCH_MP ARG_DIV_EQ_SUBSET_HALFLINE) THEN
138   REWRITE_TAC[coplanar] THEN MAP_EVERY EXISTS_TAC
139    [`vec 0:real^3`; `pushin 3 (&0) (b:real^2):real^3`; `basis 3:real^3`] THEN
140   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
141   REWRITE_TAC[AFFINE_HULL_3; HALFLINE; SUBSET; IN_ELIM_THM] THEN
142   DISCH_THEN(fun th -> X_GEN_TAC `x:real^3` THEN DISCH_TAC THEN
143    MP_TAC(SPEC `(dropout 3:real^3->real^2) x` th)) THEN
144   ASM_REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_ADD_LID] THEN
145   DISCH_THEN(X_CHOOSE_THEN `v:real` STRIP_ASSUME_TAC) THEN
146   MAP_EVERY EXISTS_TAC [`&1 - v - (x:real^3)$3`; `v:real`; `(x:real^3)$3`] THEN
147   CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN
148   FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [CART_EQ]) THEN
149   SIMP_TAC[CART_EQ; DIMINDEX_2; DIMINDEX_3; FORALL_2; FORALL_3; LAMBDA_BETA;
150            dropout; pushin; VECTOR_ADD_COMPONENT; VECTOR_MUL_COMPONENT; ARITH;
151            BASIS_COMPONENT] THEN
152   REAL_ARITH_TAC);;
153
154 (* ------------------------------------------------------------------------- *)
155 (* The actual theorems.                                                      *)
156 (* ------------------------------------------------------------------------- *)
157
158 let UNIV_GSPEC = prove
159  (`{x | T} = UNIV`,
160   SET_TAC[]);;
161
162
163 let MEASURABLE_CONIC_CAP_WEDGE_GE = prove
164  (`!v0 v1 w1 w2 r a.
165     measurable (conic_cap v0 v1 r a INTER wedge_ge v0 v1 w1 w2)`,
166   REPEAT STRIP_TAC THEN REWRITE_TAC[WEDGE_GE_WEDGE] THEN
167   ASM_CASES_TAC `collinear{v0:real^3,v1,w1}` THENL
168    [ASM_SIMP_TAC[AZIM_DEGENERATE; UNIV_GSPEC; UNION_UNIV; INTER_UNIV] THEN
169     REWRITE_TAC[MEASURABLE_CONIC_CAP];
170     REWRITE_TAC[UNION_OVER_INTER] THEN MATCH_MP_TAC MEASURABLE_UNION THEN
171     REWRITE_TAC[MEASURABLE_CONIC_CAP_WEDGE] THEN
172     MATCH_MP_TAC MEASURABLE_UNION THEN CONJ_TAC THEN
173     MATCH_MP_TAC NEGLIGIBLE_IMP_MEASURABLE THEN
174     MATCH_MP_TAC NEGLIGIBLE_INTER THEN DISJ2_TAC THEN
175     MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE THEN
176     ASM_SIMP_TAC[COPLANAR_AZIM_EQ]]);;
177
178
179 let VOLUME_CONIC_CAP_WEDGE_GE_VS_CONIC_CAP = prove
180  (`!v0 v1 w1 w2 r a.
181         &0 < a /\ a < &1 /\
182         &0 < r /\ r <= &1 /\
183         ~collinear {v0, v1, w1} /\
184         ~collinear {v0, v1, w2}
185         ==> vol (conic_cap v0 v1 r a INTER wedge_ge v0 v1 w1 w2) =
186             vol (conic_cap v0 v1 r a) * (azim v0 v1 w1 w2) / (&2 * pi)`,
187   REPEAT STRIP_TAC THEN MATCH_MP_TAC EQ_TRANS THEN
188   EXISTS_TAC `vol (conic_cap v0 v1 r a INTER wedge v0 v1 w1 w2)` THEN
189   CONJ_TAC THENL
190    [MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF THEN
191     REWRITE_TAC[GSYM UNION_OVER_INTER; SET_RULE
192         `s INTER t DIFF s INTER y = s INTER (t DIFF y)`] THEN
193     MATCH_MP_TAC NEGLIGIBLE_INTER THEN DISJ2_TAC THEN
194     REWRITE_TAC[WEDGE_GE_WEDGE; SET_RULE
195      `((s UNION t) DIFF s) UNION (s DIFF (s UNION t)) = t DIFF s`] THEN
196     MATCH_MP_TAC NEGLIGIBLE_DIFF THEN MATCH_MP_TAC NEGLIGIBLE_UNION THEN
197     CONJ_TAC THEN MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE THEN
198     ASM_SIMP_TAC[COPLANAR_AZIM_EQ];
199     ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE; VOLUME_CONIC_CAP] THEN
200     ASM_SIMP_TAC[REAL_ARITH `a < b ==> ~(b < a) /\ ~(b <= a)`] THEN
201     ASM_CASES_TAC `v1:real^3 = v0` THENL
202      [ASM_MESON_TAC[INSERT_AC; COLLINEAR_2]; ASM_REWRITE_TAC[]] THEN
203     ASM_SIMP_TAC[REAL_ARITH `&0 < a ==> max a (--(&1)) = a`] THEN
204     MP_TAC PI_POS THEN CONV_TAC REAL_FIELD]);;
205
206 (* ======================================================================== *)
207
208 let REUHADY_concl1_new = 
209   `!V u0 u1 vl1 vl2 v1 v2 e.
210        saturated V /\
211        packing V /\
212        u0 IN V /\
213        u1 IN V /\
214        ~(u0 = u1) /\
215        hl [u0; u1] < sqrt (&2) /\
216        e = {u0, u1} /\
217        wedge_ge u0 u1 n1 n2 INTER wedge_ge u0 u1 n2 n1 SUBSET 
218        aff_ge {u0,u1} {n1} UNION aff_ge {u0,u1} {n2} /\
219        ~(azim u0 u1 n1 n2 = &0) /\
220        ~(vl1 = vl2) /\
221        hl vl1 < sqrt2 /\
222        hl vl2 < sqrt2 /\
223        vl1 IN barV V 2 /\
224        vl2 IN barV V 2 /\
225        set_of_list (truncate_simplex 1 vl1) = e /\
226        set_of_list (truncate_simplex 1 vl2) = e /\
227        n1 = EL 2 vl1 /\
228        n2 = EL 2 vl2 /\
229        (!X. X IN mcell_set V /\ e IN edgeX V X
230             ==> X SUBSET wedge_ge u0 u1 n1 n2 \/
231                 X SUBSET wedge_ge u0 u1 n2 n1)
232        ==> sum
233           {X | mcell_set V X /\ e IN edgeX V X /\ X SUBSET wedge_ge u0 u1 n1 n2}
234            (\t. dihX V t (u0,u1)) = 
235            azim u0 u1 n1 n2`;;
236
237 (* ========================================================================= *)
238 (* ========================================================================= *)
239
240 let REUHADY1 = prove_by_refinement (REUHADY_concl1_new,
241 [(REPEAT STRIP_TAC);
242  (NEW_GOAL `barV V 1 [u0;u1:real^3]`);
243  (MATCH_MP_TAC HL_LE_SQRT2_IMP_BARV_1);
244  (ASM_REWRITE_TAC[]);
245  (NEW_GOAL 
246   `{k | k IN 1..3 /\
247         voronoi_list V [u0;u1:real^3] =
248         UNIONS
249           {convex hull
250           ({omega_list_n V vl i | i IN 1..k - 1} UNION
251             voronoi_list V vl) | vl | barV V k vl /\
252                                       truncate_simplex 1 vl = [u0;u1]}} =
253              1..3`);
254  (MATCH_MP_TAC Rogers.GLTVHUM_lemma1);
255  (ASM_REWRITE_TAC[] THEN ARITH_TAC);
256  (NEW_GOAL 
257  `3 IN {k | k IN 1..3 /\
258           voronoi_list V [u0; u1] =
259           UNIONS
260           {convex hull
261          ({omega_list_n V vl i | i IN 1..k - 1} UNION voronoi_list V vl) | vl | 
262           barV V k vl /\
263           truncate_simplex 1 vl = [u0; u1]}}`);
264  (ASM_REWRITE_TAC[IN_NUMSEG] THEN ARITH_TAC);
265  (UP_ASM_TAC THEN ONCE_REWRITE_TAC[IN] THEN REWRITE_TAC[IN_ELIM_THM]);
266  (REWRITE_WITH 
267    `UNIONS
268    {convex hull ({omega_list_n V vl i | i IN 1..3 - 1} UNION voronoi_list V vl)      | vl | barV V 3 vl /\
269            truncate_simplex 1 vl = [u0; u1]} = 
270    UNIONS {convex hull {omega_list_n V vl 1, omega_list_n V vl 2, 
271            omega_list_n V vl 3} | vl | barV V 3 vl /\
272                                        truncate_simplex 1 vl = [u0; u1]}`);
273  (ONCE_REWRITE_TAC[SET_EQ_LEMMA]);
274  (REWRITE_TAC[IN_UNIONS] THEN ONCE_REWRITE_TAC[IN] THEN 
275    REWRITE_TAC[IN_ELIM_THM]);
276  (REPEAT STRIP_TAC);
277  (EXISTS_TAC `t:real^3->bool` THEN ASM_REWRITE_TAC[]);
278  (EXISTS_TAC `vl:(real^3)list`);
279  (ASM_REWRITE_TAC[]);
280  (NEW_GOAL `?a. voronoi_list V vl = {a} /\
281                     a = circumcenter (set_of_list vl) /\
282                     hl vl = dist (HD vl,a)`);
283  (MATCH_MP_TAC Marchal_cells_2_new.VORONOI_LIST_3_SINGLETON_EXPLICIT);
284  (ASM_REWRITE_TAC[]);
285  (UP_ASM_TAC THEN STRIP_TAC);
286
287  (NEW_GOAL `omega_list_n V vl 3 IN voronoi_list V vl`);
288  (REWRITE_WITH `omega_list_n V vl 3 = omega_list V vl`);
289  (REWRITE_TAC[OMEGA_LIST]);
290  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ 
291                  CARD (set_of_list vl) = 3 + 1`);
292  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
293  (EXISTS_TAC `V:real^3->bool`);
294  (ASM_REWRITE_TAC[]);
295  (REWRITE_TAC[ARITH_RULE `(3 + 1) - 1 = 3`]);
296  (MATCH_MP_TAC Packing3.OMEGA_LIST_IN_VORONOI_LIST);
297  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
298  (NEW_GOAL `omega_list_n V vl 3 = a`);
299  (ASM_SET_TAC[]);
300  (ASM_REWRITE_TAC[]);
301  (REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; IN_NUMSEG; 
302    ARITH_RULE `1 <= i /\ i <= 2 <=> i = 1 \/ i = 2`]);
303  (REWRITE_WITH `{omega_list_n V vl i | i = 1 \/ i = 2} = 
304                  {omega_list_n V vl 1,omega_list_n V vl 2}`);
305  (SET_TAC[]);
306  (REWRITE_WITH `{omega_list_n V vl 1, omega_list_n V vl 2} UNION
307    {circumcenter (set_of_list vl)} = {omega_list_n V vl 1, omega_list_n V vl 2,      circumcenter (set_of_list vl)}`);
308  (SET_TAC[]);
309
310  (EXISTS_TAC `t:real^3->bool` THEN ASM_REWRITE_TAC[]);
311  (EXISTS_TAC `vl:(real^3)list`);
312  (ASM_REWRITE_TAC[]);
313  (NEW_GOAL `?a. voronoi_list V vl = {a} /\
314                     a = circumcenter (set_of_list vl) /\
315                     hl vl = dist (HD vl,a)`);
316  (MATCH_MP_TAC Marchal_cells_2_new.VORONOI_LIST_3_SINGLETON_EXPLICIT);
317  (ASM_REWRITE_TAC[]);
318  (UP_ASM_TAC THEN STRIP_TAC);
319
320
321  (NEW_GOAL `omega_list_n V vl 3 IN voronoi_list V vl`);
322  (REWRITE_WITH `omega_list_n V vl 3 = omega_list V vl`);
323  (REWRITE_TAC[OMEGA_LIST]);
324  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ 
325                  CARD (set_of_list vl) = 3 + 1`);
326  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
327  (EXISTS_TAC `V:real^3->bool`);
328  (ASM_REWRITE_TAC[]);
329  (REWRITE_TAC[ARITH_RULE `(3 + 1) - 1 = 3`]);
330  (MATCH_MP_TAC Packing3.OMEGA_LIST_IN_VORONOI_LIST);
331  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
332  (NEW_GOAL `omega_list_n V vl 3 = a`);
333  (ASM_SET_TAC[]);
334  (ASM_REWRITE_TAC[]);
335  (REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; IN_NUMSEG; 
336    ARITH_RULE `1 <= i /\ i <= 2 <=> i = 1 \/ i = 2`]);
337  (REWRITE_WITH `{omega_list_n V vl i | i = 1 \/ i = 2} = 
338                  {omega_list_n V vl 1,omega_list_n V vl 2}`);
339  (SET_TAC[]);
340  (REWRITE_WITH `{omega_list_n V vl 1, omega_list_n V vl 2} UNION
341    {circumcenter (set_of_list vl)} = {omega_list_n V vl 1, omega_list_n V vl 2,
342     circumcenter (set_of_list vl)}`);
343  (SET_TAC[]);
344  (STRIP_TAC);
345
346 (* ======================================================================= *)
347
348  (ABBREV_TAC `p = circumcenter {u0, u1:real^3}`);
349  (NEW_GOAL `aff_dim (u0 INSERT voronoi_list V [u0;u1]) = &3`);
350  (REWRITE_TAC[AFF_DIM_INSERT]);
351  (COND_CASES_TAC);
352  (NEW_GOAL `F`);
353
354  (NEW_GOAL `affine hull voronoi_list V [u0; u1] SUBSET 
355    affine hull {x | &2 % (u0 - u1) dot x = norm u0 pow 2 - norm u1 pow 2}`);
356  (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);
357  (REWRITE_TAC[VORONOI_LIST; set_of_list; Packing3.VORONOI_SET_2]);
358  (ONCE_REWRITE_TAC[SET_RULE `a INTER b = b INTER a`]);
359  (ASM_SIMP_TAC[Pack2.INTER_VORONOI_SUBSET_BISECTOR]);
360  (NEW_GOAL 
361   `affine hull {x | &2 % (u0 - u1) dot x = norm u0 pow 2 - norm u1 pow 2} = 
362    {x:real^3 | &2 % (u0 - u1) dot x = norm u0 pow 2 - norm u1 pow 2}`);
363  (REWRITE_TAC[AFFINE_HULL_EQ]);
364  (REWRITE_TAC[AFFINE_HYPERPLANE]);
365  (NEW_GOAL 
366  `~(u0 IN {x:real^3 | &2 % (u0 - u1) dot x = norm u0 pow 2 - norm u1 pow 2})`);
367  (REWRITE_TAC[IN; IN_ELIM_THM; NORM_POW_2]);
368  (ONCE_REWRITE_TAC [REAL_ARITH `a = b <=> a - b = &0`]);
369  (REWRITE_TAC[VECTOR_ARITH `&2 % (u0 - u1) dot u0 - (u0 dot u0 - u1 dot u1) = 
370                 (u0 - u1) dot (u0 - u1)`]);
371  (REWRITE_TAC[DOT_EQ_0] THEN ASM_NORM_ARITH_TAC);
372  (ASM_SET_TAC[]);
373  (ASM_MESON_TAC[]);
374  (REWRITE_TAC[ARITH_RULE `a + &1 = b:int <=> a = b - &1`]);
375  (MATCH_MP_TAC Packing3.AFF_DIM_VORONOI_LIST);
376  (ASM_REWRITE_TAC[]);
377
378  (NEW_GOAL `aff_dim (u0 INSERT voronoi_list V [u0; u1]) = &(dimindex (:3))`);
379  (ASM_REWRITE_TAC[DIMINDEX_3]);
380  (UP_ASM_TAC THEN REWRITE_TAC[AFF_DIM_EQ_FULL]);
381  (STRIP_TAC);
382
383  (ABBREV_TAC `S = voronoi_list V [u0;u1]`);
384  (NEW_GOAL `!x. x IN S ==> (x - u0) dot (u1 - u0) = 
385                             dist (p, u0) * dist (u1, u0:real^3)`);
386  (REPEAT STRIP_TAC);
387  (NEW_GOAL `p = inv (&2) % (u0 + (u1:real^3))`);
388  (EXPAND_TAC "p" THEN REWRITE_TAC[Rogers.CIRCUMCENTER_2; midpoint]);
389  (REWRITE_TAC[dist]);
390  (REWRITE_WITH `u1 - u0 = &2 % (p - u0:real^3)`);
391  (ASM_REWRITE_TAC[]);
392  (VECTOR_ARITH_TAC);
393  (REWRITE_TAC[NORM_MUL; REAL_ARITH `abs (&2) = &2`;
394    REAL_ARITH `a * b * a = b * a pow 2`; NORM_POW_2; DOT_RMUL]);
395  (REWRITE_WITH `(x - u0) dot (p - u0:real^3) = 
396                  (p - u0) dot (p - u0) - (x - p) dot (u0 - p)`);
397  (VECTOR_ARITH_TAC);
398  (REWRITE_WITH `(x - p) dot (u0 - p:real^3) = &0`);
399  (EXPAND_TAC "p");
400  (REWRITE_WITH `{u0, u1} = set_of_list [u0; u1:real^3]`);
401  (REWRITE_TAC[set_of_list]);
402  (MATCH_MP_TAC Rogers.MHFTTZN4);
403  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `1`);
404  (REPEAT STRIP_TAC);
405  (ASM_REWRITE_TAC[]);
406  (ASM_REWRITE_TAC[]);
407  (NEW_GOAL `S SUBSET affine hull voronoi_list V [u0; u1]`);
408  (EXPAND_TAC "S");
409  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
410  (ASM_SET_TAC[]);
411  (REWRITE_TAC[set_of_list]);
412  (NEW_GOAL `{u0,u1} SUBSET affine hull {u0,u1:real^3}`);
413  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
414  (ASM_SET_TAC[]);
415  (REAL_ARITH_TAC);
416
417 (* ========================================================================= *)
418
419  (ABBREV_TAC `S1 = {x:real^3 | &2 % (u0 - u1) dot x = 
420                                 norm u0 pow 2 - norm u1 pow 2}`);
421  (ABBREV_TAC `S2:real^3->bool = (S1 DIFF (relative_interior S))`);
422  (NEW_GOAL `closed_in (subtopology euclidean (S1:real^3->bool)) S2`);
423  (EXPAND_TAC "S2");
424  (MATCH_MP_TAC CLOSED_IN_DIFF);
425  (STRIP_TAC);
426  (NEW_GOAL `closed (S1:real^3->bool)`);
427  (EXPAND_TAC "S1" THEN REWRITE_TAC[CLOSED_HYPERPLANE]);
428  (MATCH_MP_TAC CLOSED_SUBSET);
429  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
430
431  (REWRITE_WITH `S1 = affine hull (S:real^3->bool)`);
432  (EXPAND_TAC "S");
433  (NEW_GOAL `affine hull S1 = S1:real^3->bool`);
434  (REWRITE_TAC[AFFINE_HULL_EQ]);
435  (EXPAND_TAC "S1" THEN REWRITE_TAC[AFFINE_HYPERPLANE]);
436  (ONCE_REWRITE_TAC[GSYM (ASSUME `affine hull S1 = S1:real^3->bool`)]);
437  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
438  (MATCH_MP_TAC AFF_DIM_EQ_AFFINE_HULL);
439  (STRIP_TAC);
440  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
441    SET_RULE `INTERS {f x | x IN {a, b}} = f a INTER f b`]);
442  (DEL_TAC THEN EXPAND_TAC "S1");
443  (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);
444  (ASM_REWRITE_TAC[]);
445  (REWRITE_WITH `aff_dim (S1:(real^3->bool)) = &(dimindex (:3)) - &1`);
446  (DEL_TAC THEN EXPAND_TAC "S1");
447  (MATCH_MP_TAC AFF_DIM_HYPERPLANE);
448  (REWRITE_TAC[VECTOR_ARITH `&2 % (s - t) = vec 0 <=> s = t`]);
449  (ASM_REWRITE_TAC[]);
450  (REWRITE_TAC[DIMINDEX_3]);
451  (REWRITE_WITH `aff_dim (voronoi_list V [u0;u1:real^3]) = &3 - &1`);
452  (MATCH_MP_TAC Packing3.AFF_DIM_VORONOI_LIST);
453  (ASM_REWRITE_TAC[]);
454  (ARITH_TAC);
455
456  (REWRITE_TAC[OPEN_IN_RELATIVE_INTERIOR]);
457
458  (NEW_GOAL `closed (S2:real^3->bool)`);
459  (MATCH_MP_TAC CLOSED_IN_CLOSED_TRANS);
460  (EXISTS_TAC `S1:real^3->bool`);
461  (ASM_REWRITE_TAC[]);
462  (EXPAND_TAC "S1");
463  (REWRITE_TAC[CLOSED_HYPERPLANE]);
464
465
466  (NEW_GOAL `~(S2:real^3->bool = {})`);
467  (EXPAND_TAC "S2");
468  (REWRITE_TAC [SET_RULE `A DIFF B = {} <=> A SUBSET B`]);
469  (REPEAT STRIP_TAC);
470  (NEW_GOAL `S1 SUBSET S:real^3->bool`);
471  (NEW_GOAL `relative_interior S SUBSET S:real^3->bool`);
472  (REWRITE_TAC[RELATIVE_INTERIOR_SUBSET]);
473  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
474
475  (NEW_GOAL `S1 = S:real^3->bool`);
476  (NEW_GOAL `S SUBSET S1:real^3->bool`);
477  (EXPAND_TAC "S");
478  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
479    SET_RULE `INTERS {f x | x IN {a, b}} = f a INTER f b`]);
480  (EXPAND_TAC "S1");
481  (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);
482  (ASM_REWRITE_TAC[]);
483  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
484
485  (NEW_GOAL `bounded (S1:real^3->bool)`);
486  (REWRITE_TAC[ASSUME `S1 = S:real^3->bool`]);
487  (DEL_TAC THEN EXPAND_TAC "S");
488  (MATCH_MP_TAC Packing3.BOUNDED_VORONOI_LIST);
489  (EXISTS_TAC `1`);
490  (ASM_REWRITE_TAC[]);
491  
492  (NEW_GOAL `~bounded (S1:real^3->bool)`);
493  (EXPAND_TAC "S1");
494  (MATCH_MP_TAC UNBOUNDED_HYPERPLANE);
495  (REWRITE_TAC[VECTOR_ARITH `&2 % (u0 - u1) = vec 0 <=> u0 = u1`]);
496  (ASM_REWRITE_TAC[]);
497  (ASM_MESON_TAC[]);
498
499  (NEW_GOAL `?z:real^3. z IN S2 /\ 
500                 (!w. w IN S2 ==> dist (u0,z) <= dist (u0,w))`);
501  (MATCH_MP_TAC DISTANCE_ATTAINS_INF);
502  (ASM_REWRITE_TAC[]);
503  (UP_ASM_TAC THEN STRIP_TAC);
504
505 (* ======================================================================== *)
506
507  (ABBREV_TAC `a = dist (p, u0:real^3) / dist (z, u0)`);
508  (NEW_GOAL `&0 < a /\ a < &1`);
509  (EXPAND_TAC "a");
510  (NEW_GOAL `~(u0:real^3 IN S1)`);
511  (EXPAND_TAC "S1" THEN REWRITE_TAC[IN; IN_ELIM_THM; NORM_POW_2]);
512  (REWRITE_TAC[REAL_ARITH `a = b - c <=> a + c - b = &0`]);
513  (REWRITE_TAC[VECTOR_ARITH `&2 % (u0 - u1) dot u0 + u1 dot u1 - u0 dot u0 = 
514   (u0 - u1) dot (u0 - u1)`]);
515  (REWRITE_TAC[DOT_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
516  (ASM_REWRITE_TAC[]);
517  (NEW_GOAL `&0 < dist (p,u0:real^3)`);
518  (MATCH_MP_TAC DIST_POS_LT);
519  (EXPAND_TAC "p" THEN REWRITE_TAC[Rogers.CIRCUMCENTER_2; midpoint]);
520  (REWRITE_TAC[VECTOR_ARITH `inv (&2) % (u0 + u1) = u0 <=> u0 = u1`]);
521  (ASM_REWRITE_TAC[]);
522  (NEW_GOAL `&0 < dist (z,u0:real^3)`);
523  (MATCH_MP_TAC DIST_POS_LT);
524  (STRIP_TAC);
525  (NEW_GOAL `z:real^3 IN S1`);
526  (ASM_SET_TAC[]);
527  (ASM_MESON_TAC[]);
528  (STRIP_TAC);
529  (MATCH_MP_TAC REAL_LT_DIV);
530  (ASM_REWRITE_TAC[]);
531  (REWRITE_WITH 
532   `dist (p,u0) / dist (z,u0:real^3) < &1 <=> dist (p,u0) < &1 * dist (z,u0)`);
533  (ASM_SIMP_TAC[REAL_LT_LDIV_EQ]);
534  (REWRITE_TAC[REAL_MUL_LID]);
535  (MATCH_MP_TAC Tactics_jordan.REAL_POW_2_LT);
536  (REPEAT STRIP_TAC);
537  (ASM_REAL_ARITH_TAC);
538  (ASM_REAL_ARITH_TAC);
539  (REWRITE_TAC[dist]);
540  (REWRITE_WITH `norm (z - u0:real^3) pow 2 = 
541                  norm (p - u0) pow 2 + norm (z - p) pow 2`);
542  (MATCH_MP_TAC PYTHAGORAS);
543  (REWRITE_TAC[orthogonal]);
544  (REWRITE_WITH `p = circumcenter (set_of_list [u0;u1:real^3])`);
545  (ASM_REWRITE_TAC[set_of_list]);
546  (ONCE_REWRITE_TAC[DOT_SYM]);
547  (MATCH_MP_TAC Rogers.MHFTTZN4);
548  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `1`);
549  (REPEAT STRIP_TAC);
550  (ASM_REWRITE_TAC[]);
551  (ASM_REWRITE_TAC[]);
552
553  (REWRITE_TAC[ASSUME `voronoi_list V [u0; u1] = S`]);
554  (REWRITE_WITH `affine hull (S:real^3->bool) = S1`);
555  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
556  (EXPAND_TAC "S");
557  (NEW_GOAL `affine hull S1 = S1:real^3->bool`);
558  (REWRITE_TAC[AFFINE_HULL_EQ]);
559  (EXPAND_TAC "S1" THEN REWRITE_TAC[AFFINE_HYPERPLANE]);
560  (ONCE_REWRITE_TAC[GSYM (ASSUME `affine hull S1 = S1:real^3->bool`)]);
561  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
562  (MATCH_MP_TAC AFF_DIM_EQ_AFFINE_HULL);
563  (STRIP_TAC);
564  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
565    SET_RULE `INTERS {f x | x IN {a, b}} = f a INTER f b`]);
566  (DEL_TAC THEN EXPAND_TAC "S1");
567  (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);
568  (ASM_REWRITE_TAC[]);
569  (REWRITE_WITH `aff_dim (S1:(real^3->bool)) = &(dimindex (:3)) - &1`);
570  (DEL_TAC THEN EXPAND_TAC "S1");
571  (MATCH_MP_TAC AFF_DIM_HYPERPLANE);
572  (REWRITE_TAC[VECTOR_ARITH `&2 % (s - t) = vec 0 <=> s = t`]);
573  (ASM_REWRITE_TAC[]);
574  (REWRITE_TAC[DIMINDEX_3]);
575  (REWRITE_WITH `aff_dim (voronoi_list V [u0;u1:real^3]) = &3 - &1`);
576  (MATCH_MP_TAC Packing3.AFF_DIM_VORONOI_LIST);
577  (ASM_REWRITE_TAC[]);
578  (ARITH_TAC);
579  (ASM_SET_TAC[]);
580  (REWRITE_TAC[set_of_list]);
581  (NEW_GOAL `{u0, u1:real^3} SUBSET affine hull {u0, u1}`);
582  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
583  (ASM_SET_TAC[]);
584  (REWRITE_TAC[REAL_ARITH `a < a + b <=> &0 < b`; NORM_POW_2; DOT_POS_LT]);
585  (REWRITE_TAC[VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
586  (STRIP_TAC);
587  (NEW_GOAL `~(z:real^3 IN S2)`);
588  (REWRITE_TAC[ASSUME `z = p:real^3`]);
589  (EXPAND_TAC "S2");
590  (NEW_GOAL `p:real^3 IN relative_interior S`);
591
592
593  (ABBREV_TAC `B = V INTER ball (p:real^3, &8)`);
594  (ABBREV_TAC `A = B DIFF {u0, u1:real^3}`);
595  (NEW_GOAL `FINITE (A:real^3->bool)`);
596  (EXPAND_TAC "A");
597  (MATCH_MP_TAC FINITE_DIFF);
598  (EXPAND_TAC "B");
599  (MATCH_MP_TAC Packing3.KIUMVTC THEN ASM_REWRITE_TAC[]);
600  (NEW_GOAL `?y. dist (p,y:real^3) = &4`);
601  (MATCH_MP_TAC VECTOR_CHOOSE_DIST);
602  (REAL_ARITH_TAC);
603  (UP_ASM_TAC THEN STRIP_TAC);
604  (UNDISCH_TAC `saturated (V:real^3->bool)`);
605  (REWRITE_TAC[saturated] THEN STRIP_TAC);
606  (NEW_GOAL `?z. z IN V /\ dist (y:real^3, z) < &2`);
607  (ASM_REWRITE_TAC[]);
608  (UP_ASM_TAC THEN STRIP_TAC);
609
610  (NEW_GOAL `z':real^3 IN A`);
611  (EXPAND_TAC "A" THEN EXPAND_TAC "B");
612  (REWRITE_TAC[IN_DIFF; IN_INTER; IN_BALL]);
613  (REPEAT STRIP_TAC);
614  (ASM_REWRITE_TAC[]);
615
616  (NEW_GOAL `dist (p,z') <= dist (p, y) + dist (y, z':real^3)`);
617  (REWRITE_TAC[DIST_TRIANGLE]);
618  (ASM_REAL_ARITH_TAC);
619  (NEW_GOAL `dist (p, y) <= dist (p, z') + dist (z', y:real^3)`);
620  (REWRITE_TAC[DIST_TRIANGLE]);
621  (UP_ASM_TAC THEN ASM_REWRITE_TAC[] THEN ONCE_REWRITE_TAC[DIST_SYM]);
622  (STRIP_TAC);
623  (NEW_GOAL `&2 < dist (z', p:real^3)`);
624  (ASM_REAL_ARITH_TAC);
625  (UP_ASM_TAC THEN REWRITE_TAC[] THEN ONCE_REWRITE_TAC[DIST_SYM]);
626  (REWRITE_WITH `p = circumcenter (set_of_list [u0;u1:real^3])`);
627  (ASM_MESON_TAC[set_of_list]);
628  (NEW_GOAL `(!w. w IN set_of_list [u0;u1:real^3]
629                ==> dist (circumcenter (set_of_list [u0;u1]),w) = hl [u0;u1])`);
630  (MATCH_MP_TAC Rogers.HL_PROPERTIES);
631  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `1`);
632  (ASM_REWRITE_TAC[]);
633
634  (REWRITE_WITH `dist (circumcenter (set_of_list [u0; u1:real^3]),z') = 
635    hl [u0; u1]`);
636  (FIRST_ASSUM MATCH_MP_TAC);
637  (ASM_REWRITE_TAC[set_of_list]);
638  (NEW_GOAL `sqrt (&2) <= &2`);
639  (MATCH_MP_TAC Tactics_jordan.REAL_POW_2_LE);
640  (SIMP_TAC[REAL_ARITH `&0 <= &2`; SQRT_POS_LE; SQRT_POW_2]);
641  (REAL_ARITH_TAC);
642  (ASM_REAL_ARITH_TAC);
643
644  (NEW_GOAL `?a:real^3. a IN A /\ (!x. x IN A ==> dist (p,a) <= dist (p,x))`);
645  (MATCH_MP_TAC Packing3.REAL_FINITE_ARGMIN);
646  (ASM_REWRITE_TAC[]);
647  (UP_ASM_TAC THEN SET_TAC[]);
648  (UP_ASM_TAC THEN STRIP_TAC);
649
650  (ABBREV_TAC `d = inv (&4) * (dist (p, a') - dist (p, u0:real^3))`);
651  (NEW_GOAL `&0 < d`);
652  (EXPAND_TAC "d");
653  (MATCH_MP_TAC REAL_LT_MUL);
654  (STRIP_TAC);
655  (REAL_ARITH_TAC);
656  (REWRITE_TAC[REAL_ARITH `&0 < a - b <=> a > b`]);
657  (ONCE_REWRITE_TAC[DIST_SYM]);
658  (NEW_GOAL `!u v. u IN {u0,u1} /\ v IN V DIFF {u0,u1} ==> 
659                    dist (v,p) > dist (u,p:real^3)`);
660  (MATCH_MP_TAC Rogers.XYOFCGX);
661  (REPEAT STRIP_TAC);
662  (ASM_REWRITE_TAC[]);
663  (ASM_SET_TAC[]);
664  (UP_ASM_TAC THEN REWRITE_TAC[AFFINE_INDEPENDENT_2]);
665  (ASM_MESON_TAC[set_of_list]);
666  (REWRITE_WITH `radV {u0, u1:real^3} = hl [u0;u1]`);
667  (REWRITE_TAC[HL;set_of_list]);
668  (ASM_REWRITE_TAC[]);
669  (FIRST_ASSUM MATCH_MP_TAC);
670  (ASM_SET_TAC[]);
671
672  (REWRITE_TAC[relative_interior; IN; IN_ELIM_THM]);
673  (ABBREV_TAC `St = S INTER ball (p:real^3, d)`);
674  (EXISTS_TAC `St:real^3->bool`);
675  (REPEAT STRIP_TAC);
676
677  (REWRITE_TAC[open_in]);
678  (REPEAT STRIP_TAC);
679  (NEW_GOAL `S SUBSET affine hull (S:real^3->bool)`);
680  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
681  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
682  (EXISTS_TAC `d - dist (p:real^3, x)`);
683  (REPEAT STRIP_TAC);
684  (REWRITE_TAC[REAL_ARITH `&0 < a - b <=> b < a`]);
685  (REWRITE_TAC[GSYM IN_BALL]);
686  (ASM_SET_TAC[]);
687  (EXPAND_TAC "St");
688  (REWRITE_TAC[IN_INTER]);
689  (STRIP_TAC);
690
691  (NEW_GOAL `dist (x',x:real^3) < d`);
692  (NEW_GOAL `&0 <= dist (p,x:real^3)`);
693  (REWRITE_TAC[DIST_POS_LE]);
694  (ASM_REAL_ARITH_TAC);
695
696  (NEW_GOAL `x' IN voronoi_closed V (u0:real^3)`);
697  (REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
698  (REPEAT STRIP_TAC);
699
700  (ASM_CASES_TAC `w IN {u0, u1:real^3}`);
701  (ASM_CASES_TAC `w = u0:real^3`);
702  (REWRITE_TAC[ASSUME `w = u0:real^3`]);
703  (REAL_ARITH_TAC);
704  (NEW_GOAL `w = u1:real^3`);
705  (ASM_SET_TAC[]);
706  (REWRITE_TAC[ASSUME `w = u1:real^3`]);
707  (MATCH_MP_TAC (REAL_ARITH `a = b ==> a <= b`));
708
709  (NEW_GOAL `x':real^3 IN S1`);
710  (NEW_GOAL `affine hull S SUBSET affine hull (S1:real^3->bool)`);
711  (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);
712  (EXPAND_TAC "S1" THEN REWRITE_TAC[GSYM 
713   (ASSUME `voronoi_list V [u0; u1] = S`); VORONOI_LIST; VORONOI_SET; 
714   set_of_list; SET_RULE `INTERS {f v | v IN {a, b}} = f a INTER f b`]);
715  (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);
716  (ASM_REWRITE_TAC[]);
717  (REWRITE_WITH `x' IN S1 <=> x':real^3 IN affine hull S1`);
718  (REWRITE_WITH `affine hull S1 = S1:real^3->bool`);
719  (REWRITE_TAC[AFFINE_HULL_EQ]);
720  (EXPAND_TAC "S1" THEN REWRITE_TAC[AFFINE_HYPERPLANE]);
721  (ASM_SET_TAC[]);
722
723  (UP_ASM_TAC THEN EXPAND_TAC "S1" THEN REWRITE_TAC[IN_ELIM_THM; NORM_POW_2]);
724  (ONCE_REWRITE_TAC[REAL_ARITH `a = b <=> a - b = &0`]);
725  (REWRITE_TAC[
726    VECTOR_ARITH `&2 % (u0 - u1) dot x - (u0 dot u0 - u1 dot u1) = 
727                 (u1 - x) dot (u1 - x) - (u0 - x) dot (u0 - x)`]);
728  (REWRITE_TAC[REAL_ARITH `a - b = &0 <=> a = b`; GSYM NORM_POW_2; GSYM dist]);
729  (STRIP_TAC);
730  (REWRITE_TAC[DIST_EQ]);
731  (ONCE_REWRITE_TAC[DIST_SYM]);
732  (ASM_REWRITE_TAC[]);
733
734  (NEW_GOAL `dist (x', u0:real^3) <= dist (x', x) + dist (x, u0)`);
735  (REWRITE_TAC[DIST_TRIANGLE]);
736  (NEW_GOAL `dist (x, u0:real^3) <= dist (x, p:real^3) + dist (p, u0)`);
737  (REWRITE_TAC[DIST_TRIANGLE]);
738  (NEW_GOAL `dist (x,p:real^3) < d`);
739  (NEW_GOAL `x IN ball (p:real^3, d)`);
740  (ASM_SET_TAC[]);
741  (UP_ASM_TAC THEN REWRITE_TAC[IN_BALL]);
742  (REWRITE_TAC[DIST_SYM]);
743  (NEW_GOAL `dist (x',u0) < &2 * d + dist (p:real^3,u0)`);
744  (ASM_REAL_ARITH_TAC);
745
746  (NEW_GOAL `dist (p, w:real^3)- &2 * d <= dist (x',w)`);
747  (NEW_GOAL `dist (x, w:real^3) <= dist (x, x') + dist (x', w)`);
748  (REWRITE_TAC[DIST_TRIANGLE]);
749  (NEW_GOAL `dist (p, w:real^3) <= dist (p, x) + dist (x, w)`);
750  (REWRITE_TAC[DIST_TRIANGLE]);
751  (NEW_GOAL `dist (x, x':real^3) < d /\ dist (p, x:real^3) < d`);
752  (ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REWRITE_TAC[]);
753  (ASM_REAL_ARITH_TAC);
754  (NEW_GOAL `dist (p, u0) + &4 * d <= dist (p, w:real^3)`);
755  (EXPAND_TAC "d");
756  (REWRITE_TAC[REAL_ARITH `&4 * inv (&4) * a = a`]);
757  (REWRITE_TAC[REAL_ARITH `a + b - a = b`]);
758
759  (ASM_CASES_TAC `w:real^3 IN B`);
760  (FIRST_ASSUM MATCH_MP_TAC);
761  (ASM_SET_TAC[]);
762  (NEW_GOAL `~(dist (p,w:real^3) < &8)`);
763  (REWRITE_TAC[GSYM IN_BALL]);
764  (ASM_SET_TAC[]);
765  (NEW_GOAL `dist (p,a':real^3) < &8`);
766  (REWRITE_TAC[GSYM IN_BALL]);
767  (ASM_SET_TAC[]);
768  (ASM_REAL_ARITH_TAC);
769  (ASM_REAL_ARITH_TAC);
770
771  (NEW_GOAL `x' IN voronoi_closed V (u1:real^3)`);
772  (NEW_GOAL `x':real^3 IN S1`);
773  (NEW_GOAL `affine hull S SUBSET affine hull (S1:real^3->bool)`);
774  (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);
775  (EXPAND_TAC "S1" THEN REWRITE_TAC[GSYM 
776   (ASSUME `voronoi_list V [u0; u1] = S`); VORONOI_LIST; VORONOI_SET; 
777   set_of_list; SET_RULE `INTERS {f v | v IN {a, b}} = f a INTER f b`]);
778  (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);
779  (ASM_REWRITE_TAC[]);
780  (REWRITE_WITH `x' IN S1 <=> x':real^3 IN affine hull S1`);
781  (REWRITE_WITH `affine hull S1 = S1:real^3->bool`);
782  (REWRITE_TAC[AFFINE_HULL_EQ]);
783  (EXPAND_TAC "S1" THEN REWRITE_TAC[AFFINE_HYPERPLANE]);
784  (ASM_SET_TAC[]);
785
786  (UP_ASM_TAC THEN EXPAND_TAC "S1" THEN REWRITE_TAC[IN_ELIM_THM; NORM_POW_2]);
787  (ONCE_REWRITE_TAC[REAL_ARITH `a = b <=> a - b = &0`]);
788  (REWRITE_TAC[
789    VECTOR_ARITH `&2 % (u0 - u1) dot x - (u0 dot u0 - u1 dot u1) = 
790                 (u1 - x) dot (u1 - x) - (u0 - x) dot (u0 - x)`]);
791  (REWRITE_TAC[REAL_ARITH `a - b = &0 <=> a = b`; GSYM NORM_POW_2; GSYM dist]);
792  (STRIP_TAC);
793  (UNDISCH_TAC `x' IN voronoi_closed V (u0:real^3)`);
794  (REWRITE_TAC[voronoi_closed; IN_ELIM_THM; IN]);
795  (REPEAT STRIP_TAC);
796  (REWRITE_WITH `dist (x', u1)= dist (x', u0:real^3)`);
797  (ONCE_REWRITE_TAC[DIST_SYM]);
798  (ASM_REWRITE_TAC[DIST_EQ]);
799  (ASM_SIMP_TAC[]);
800
801  (REWRITE_TAC[GSYM 
802   (ASSUME `voronoi_list V [u0; u1] = S`); VORONOI_LIST; VORONOI_SET; 
803   set_of_list; SET_RULE `INTERS {f v | v IN {a, b}} = f a INTER f b`]);
804  (ASM_REWRITE_TAC[IN_INTER]);
805
806  (REWRITE_TAC[IN_BALL]);
807  (NEW_GOAL `dist (p,x':real^3) <= dist (p,x) + dist (x, x':real^3)`);
808  (REWRITE_TAC[DIST_TRIANGLE]);
809  (NEW_GOAL `dist (x,x':real^3) = dist (x',x)`);
810  (REWRITE_TAC[DIST_SYM]);
811  (ASM_REAL_ARITH_TAC);
812  (REWRITE_WITH `St p <=> p:real^3 IN St`);
813  (REWRITE_TAC[IN]);
814  (EXPAND_TAC "St" THEN REWRITE_TAC[IN_INTER; IN_BALL; DIST_REFL]);
815  (STRIP_TAC);
816  (REWRITE_WITH `p = omega_list V [u0; u1]`);
817  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
818  (REWRITE_WITH `p = circumcenter (set_of_list [u0;u1:real^3])`);
819  (ASM_MESON_TAC[set_of_list]);
820  (MATCH_MP_TAC Rogers.XNHPWAB1);
821  (EXISTS_TAC `1`);
822  (ASM_REWRITE_TAC[IN]);
823  (REWRITE_TAC[GSYM (ASSUME `voronoi_list V [u0;u1] = S`)]);
824  (MATCH_MP_TAC Packing3.OMEGA_LIST_IN_VORONOI_LIST);
825  (EXISTS_TAC `1` THEN ASM_REWRITE_TAC[]);
826  (ASM_REWRITE_TAC[]);
827  (UP_ASM_TAC THEN SET_TAC[]);
828  (UP_ASM_TAC THEN SET_TAC[]);
829  (ASM_MESON_TAC[]);
830
831 (* ======================================================================== *)
832
833  (NEW_GOAL `?b. &0 < b /\ b < &1 /\ 
834                   rcone_gt u0 u1 b SUBSET aff_ge_alt {u0:real^3} S`);
835
836  (EXISTS_TAC `a:real`);
837  (REPEAT STRIP_TAC);
838  (ASM_REWRITE_TAC[]);
839  (ASM_REWRITE_TAC[]);
840  (REWRITE_TAC[SET_RULE `A SUBSET B <=> (!x. ~(x IN B) ==> ~(x IN A))`]);
841  (REPEAT STRIP_TAC);
842  (NEW_GOAL `x:real^3 IN affine hull (u0 INSERT S)`);
843  (ASM_SET_TAC[]);
844  (UP_ASM_TAC THEN REWRITE_TAC[AFFINE_HULL_EXPLICIT_ALT; IN; IN_ELIM_THM]);
845  (REPEAT STRIP_TAC);
846
847  (ABBREV_TAC `h = sum (s DELETE u0:real^3) u`);
848  (NEW_GOAL `(x - u0) dot (u1 - u0:real^3) = 
849               h * dist (p, u0) * dist (u1, u0:real^3)`);
850  (EXPAND_TAC "x");
851  (NEW_GOAL `u0 = vsum s (\v:real^3. (u:real^3->real) v % (u0:real^3))`);
852  (ASM_SIMP_TAC[VSUM_RMUL]);
853  (VECTOR_ARITH_TAC);
854  (REWRITE_WITH `vsum (s:real^3->bool) (\v. u v % v) - u0:real^3 = 
855                  vsum s (\v. u v % v) - vsum s (\v:real^3. u v % u0)`);
856  (ASM_REWRITE_TAC[]);
857  (UP_ASM_TAC THEN MESON_TAC[]);
858  (REWRITE_WITH `vsum s (\v. u v % v) - vsum s (\v:real^3. u v % u0:real^3) = 
859                  vsum s (\x. (\v. u v % v) x - (\v. u v % u0) x)`);
860  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
861  (MATCH_MP_TAC VSUM_SUB);
862  (ASM_REWRITE_TAC[]);
863  (REWRITE_TAC[VECTOR_ARITH `a % x - a % y = a % (x - y)`]);
864  (REWRITE_WITH `vsum s (\x:real^3. u x % (x - u0)) dot (u1 - u0) = 
865                  sum s (\x. (\x. u x % (x - u0)) x dot (u1 - u0:real^3))`);
866  (ASM_SIMP_TAC[DOT_LSUM]);
867  (REWRITE_TAC[DOT_LMUL]);
868  (REWRITE_WITH `sum s (\x:real^3. u x * ((x - u0) dot (u1 - u0:real^3))) = 
869    sum (s DELETE u0) (\x. u x * (dist (p,u0) * dist (u1,u0)))`);
870  (ASM_CASES_TAC `u0:real^3 IN s`);
871  (NEW_GOAL `s = u0 INSERT (s DELETE u0:real^3)`);
872  (ASM_SET_TAC[]);
873  (NEW_GOAL `FINITE (s DELETE u0:real^3)`);
874  (MATCH_MP_TAC FINITE_SUBSET);
875  (EXISTS_TAC `s:real^3->bool` THEN ASM_REWRITE_TAC[] THEN SET_TAC[]);
876
877  (REWRITE_WITH `sum s (\x:real^3. u x * ((x - u0) dot (u1 - u0:real^3))) = 
878    sum (u0 INSERT (s DELETE u0))  (\x. u x * ((x - u0) dot (u1 - u0)))`);
879  (ASM_MESON_TAC[]);
880  (ABBREV_TAC `f = (\x:real^3. u x * ((x - u0) dot (u1 - u0:real^3)))`);
881  (REWRITE_WITH `sum (u0:real^3 INSERT (s DELETE u0)) f = 
882          (if u0 IN (s DELETE u0) then sum (s DELETE u0) f 
883           else f u0 + sum (s DELETE u0) f)`);
884  (MATCH_MP_TAC Marchal_cells_2_new.SUM_CLAUSES_alt);
885  (ASM_REWRITE_TAC[]);
886  (COND_CASES_TAC);
887  (NEW_GOAL `F`);
888  (ASM_SET_TAC[]);
889  (ASM_MESON_TAC[]);
890  (REWRITE_WITH `f (u0:real^3) = &0`);
891  (EXPAND_TAC "f");
892  (REWRITE_TAC[VECTOR_ARITH `(u0 - u0) dot (u1 - u0) = &0`]);
893  (REAL_ARITH_TAC);
894  (REWRITE_TAC[REAL_ARITH `&0 + a = a`]);
895  (MATCH_MP_TAC SUM_EQ);
896  (EXPAND_TAC "f");
897  (REPEAT STRIP_TAC);
898  (REWRITE_TAC[REAL_ARITH `a * x = a * y * z <=> a * (x - y * z) = &0`]);
899  (NEW_GOAL `(x' - u0) dot (u1 - u0) - dist (p,u0) * dist (u1,u0:real^3) = &0`);
900  (REWRITE_TAC[REAL_ARITH `a - b = &0 <=> a = b`]);
901  (FIRST_ASSUM MATCH_MP_TAC);
902  (ASM_SET_TAC[]);
903  (ASM_REWRITE_TAC[]);
904  (REAL_ARITH_TAC);
905  (REWRITE_WITH `s DELETE u0:real^3 = s`);
906  (ASM_SET_TAC[]);
907  (MATCH_MP_TAC SUM_EQ);
908  (REPEAT STRIP_TAC);
909  (REWRITE_TAC[]);
910  (REWRITE_TAC[REAL_ARITH `a * x = a * y * z <=> a * (x - y * z) = &0`]);
911  (NEW_GOAL `(x' - u0) dot (u1 - u0) - dist (p,u0) * dist (u1,u0:real^3) = &0`);
912  (REWRITE_TAC[REAL_ARITH `a - b = &0 <=> a = b`]);
913  (FIRST_ASSUM MATCH_MP_TAC);
914  (ASM_SET_TAC[]);
915  (ASM_REWRITE_TAC[]);
916  (REAL_ARITH_TAC);
917  (NEW_GOAL `FINITE (s DELETE u0:real^3)`);
918  (MATCH_MP_TAC FINITE_SUBSET);
919  (EXISTS_TAC `s:real^3->bool` THEN ASM_REWRITE_TAC[] THEN SET_TAC[]);
920  (ASM_SIMP_TAC[SUM_RMUL]);
921
922  (ASM_CASES_TAC `h <= &0`);
923  (NEW_GOAL `~(x IN rcone_gt u0 (u1:real^3) a)`);
924  (REWRITE_TAC[rcone_gt; rconesgn; IN; IN_ELIM_THM]);
925  (ASM_REWRITE_TAC[]);
926  (MATCH_MP_TAC (REAL_ARITH `&0 <= x /\ y <= &0 ==> ~(y > x)`));
927  (STRIP_TAC);
928  (MATCH_MP_TAC REAL_LE_MUL);
929  (REWRITE_TAC[DIST_POS_LE]);
930  (MATCH_MP_TAC REAL_LE_MUL);
931  (REWRITE_TAC[DIST_POS_LE]);
932  (ASM_REAL_ARITH_TAC);
933
934  (REWRITE_TAC[REAL_ARITH `a * b * c <= &0 <=> &0 <= b * c * (--a)`]);
935  (MATCH_MP_TAC REAL_LE_MUL);
936  (REWRITE_TAC[DIST_POS_LE]);
937  (MATCH_MP_TAC REAL_LE_MUL);
938  (REWRITE_TAC[DIST_POS_LE]);
939  (ASM_REAL_ARITH_TAC);
940  (NEW_GOAL `F`);
941  (ASM_MESON_TAC[]);
942  (ASM_MESON_TAC[]);
943
944  (ABBREV_TAC `y = inv (h) % vsum (s DELETE u0) (\v:real^3. u v % v)`);
945  (NEW_GOAL `?t. t + h = &1 /\ x = t % u0 + h % (y:real^3)`);
946  (EXISTS_TAC `&1 - h`);
947  (STRIP_TAC);
948  (REAL_ARITH_TAC);
949  (ASM_CASES_TAC `u0:real^3 IN s`);
950  (REWRITE_TAC[GSYM (ASSUME `sum s (u:real^3->real) = &1`)]);
951
952  (EXPAND_TAC "h");
953  (REWRITE_WITH `sum s u = sum (u0 INSERT (s DELETE u0)) (u:real^3->real)`);
954  (REWRITE_WITH `(u0 INSERT (s DELETE u0:real^3)) = s`);
955  (ASM_SET_TAC[]);
956  (NEW_GOAL `FINITE (s DELETE u0:real^3)`);
957  (MATCH_MP_TAC FINITE_SUBSET);
958  (EXISTS_TAC `s:real^3->bool` THEN ASM_REWRITE_TAC[] THEN SET_TAC[]);
959
960  (SIMP_TAC[Marchal_cells_2_new.SUM_CLAUSES_alt; 
961    ASSUME `FINITE (s DELETE u0:real^3)`]);
962  (COND_CASES_TAC);
963  (NEW_GOAL `F`);
964  (UP_ASM_TAC THEN SET_TAC[]);
965  (ASM_MESON_TAC[]);
966  (REWRITE_TAC[REAL_ARITH `(a + b:real) - b = a`]);
967  (ASM_REWRITE_TAC[]);
968  (EXPAND_TAC "y");
969  (REWRITE_TAC[VECTOR_MUL_ASSOC]);
970  (REWRITE_WITH `h * inv h = &1`);
971  (NEW_GOAL `~(h = &0)`);
972  (ASM_REAL_ARITH_TAC);
973  (ASM_SIMP_TAC[Trigonometry2.REAL_MUL_LRINV]);
974  (REWRITE_TAC[VECTOR_MUL_LID]);
975  (EXPAND_TAC "x");
976
977  (REWRITE_WITH `vsum s (\v. u v % v) = 
978    vsum (u0 INSERT (s DELETE u0)) (\v:real^3. u v % v)`);
979  (REWRITE_WITH `(u0 INSERT (s DELETE u0:real^3)) = s`);
980  (ASM_SET_TAC[]);
981  (SIMP_TAC[Marchal_cells_2_new.VSUM_CLAUSES_alt; 
982    ASSUME `FINITE (s DELETE u0:real^3)`]);
983  (COND_CASES_TAC);
984  (NEW_GOAL `F`);
985  (UP_ASM_TAC THEN SET_TAC[]);
986  (ASM_MESON_TAC[]);
987  (REFL_TAC);
988
989  (NEW_GOAL `h = &1`);
990  (EXPAND_TAC "h" THEN REWRITE_WITH `s DELETE u0:real^3 = s`);
991  (ASM_SET_TAC[]);
992  (ASM_REWRITE_TAC[]);
993  (EXPAND_TAC "y" THEN REWRITE_TAC[ASSUME `h = &1`]);
994  (REWRITE_WITH `s DELETE u0:real^3 = s`);
995  (ASM_SET_TAC[]);
996  (ASM_REWRITE_TAC[REAL_ARITH `inv (&1) = &1 /\ &1 - &1 = &0`]);
997  (VECTOR_ARITH_TAC);
998  (UP_ASM_TAC THEN STRIP_TAC);
999
1000  (NEW_GOAL `~(y:real^3 IN S)`);
1001  (STRIP_TAC);
1002  (NEW_GOAL `x IN aff_ge_alt {u0:real^3} S`);
1003  (REWRITE_TAC[IN; aff_ge_alt; lin_combo]);
1004
1005  (ABBREV_TAC `f = (\v:real^3. if v = u0 then t 
1006                                 else if v = y then h else &0)`);
1007  (EXISTS_TAC `f:real^3->real`);
1008  (EXISTS_TAC `{y:real^3}`);
1009
1010  (REPEAT STRIP_TAC);
1011  (REWRITE_TAC[FINITE_SING]);
1012  (ASM_SET_TAC[]);
1013
1014  (REWRITE_TAC[SET_RULE `{a} UNION {b} = {a, b}`]);
1015  (REWRITE_WITH `vsum {u0:real^3, y} (\v. f v % v) = 
1016                 (\v. f v % v) u0 + (\v. f v % v) y`);
1017  (MATCH_MP_TAC Geomdetail.VSUM_DIS2);
1018  (STRIP_TAC);
1019  (NEW_GOAL `~(u0:real^3 IN S)`);
1020  (EXPAND_TAC "S");
1021  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
1022    SET_RULE `v IN {a,b} <=> v = a \/ v = b`]);
1023  (STRIP_TAC);
1024  (NEW_GOAL `u0 IN voronoi_closed V (u1:real^3)`);
1025  (ASM_SET_TAC[]);
1026  (UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
1027  (REPEAT STRIP_TAC);
1028  (NEW_GOAL `dist (u0,u1) <= dist (u0,u0:real^3)`);
1029  (FIRST_ASSUM MATCH_MP_TAC);
1030  (ASM_SET_TAC[]);
1031  (UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL; REAL_ARITH `~(a <= b) <=> b < a`]);
1032  (MATCH_MP_TAC DIST_POS_LT);
1033  (ASM_REWRITE_TAC[]);
1034  (ASM_MESON_TAC[]);
1035
1036  (REWRITE_WITH `(f:real^3->real) u0 = t`);
1037  (EXPAND_TAC "f");
1038  (COND_CASES_TAC);
1039  (REFL_TAC);
1040  (NEW_GOAL `F`);
1041  (ASM_MESON_TAC[]);
1042  (ASM_MESON_TAC[]);
1043
1044  (REWRITE_WITH `(f:real^3->real) y = h`);
1045  (EXPAND_TAC "f");
1046  (COND_CASES_TAC);
1047  (NEW_GOAL `F`);
1048  (NEW_GOAL `~(u0:real^3 IN S)`);
1049  (EXPAND_TAC "S");
1050  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
1051    SET_RULE `v IN {a,b} <=> v = a \/ v = b`]);
1052  (STRIP_TAC);
1053  (NEW_GOAL `u0 IN voronoi_closed V (u1:real^3)`);
1054  (ASM_SET_TAC[]);
1055  (UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
1056  (REPEAT STRIP_TAC);
1057  (NEW_GOAL `dist (u0,u1) <= dist (u0,u0:real^3)`);
1058  (FIRST_ASSUM MATCH_MP_TAC);
1059  (ASM_SET_TAC[]);
1060  (UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL; REAL_ARITH `~(a <= b) <=> b < a`]);
1061  (MATCH_MP_TAC DIST_POS_LT);
1062  (ASM_REWRITE_TAC[]);
1063  (ASM_MESON_TAC[]);
1064  (ASM_MESON_TAC[]);
1065  (COND_CASES_TAC);
1066  (REFL_TAC);
1067  (NEW_GOAL `F`);
1068  (ASM_MESON_TAC[]);
1069  (ASM_MESON_TAC[]);
1070  (ASM_REWRITE_TAC[]);
1071
1072  (EXPAND_TAC "f");
1073  (COND_CASES_TAC);
1074  (NEW_GOAL `F`);
1075  (NEW_GOAL `~({y:real^3} u0)`);
1076  (REWRITE_WITH `~({y} u0) <=> ~(u0:real^3 IN {y})`);
1077  (MESON_TAC[IN]);
1078  (REWRITE_TAC[IN_SING]);
1079  (STRIP_TAC);
1080
1081  (NEW_GOAL `~(u0:real^3 IN S)`);
1082  (EXPAND_TAC "S");
1083  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
1084    SET_RULE `v IN {a,b} <=> v = a \/ v = b`]);
1085  (STRIP_TAC);
1086
1087  (NEW_GOAL `u0 IN voronoi_closed V (u1:real^3)`);
1088  (ASM_SET_TAC[]);
1089  (UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
1090  (REPEAT STRIP_TAC);
1091  (NEW_GOAL `dist (u0,u1) <= dist (u0,u0:real^3)`);
1092  (FIRST_ASSUM MATCH_MP_TAC);
1093  (ASM_SET_TAC[]);
1094  (UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL; REAL_ARITH `~(a <= b) <=> b < a`]);
1095  (MATCH_MP_TAC DIST_POS_LT);
1096  (ASM_REWRITE_TAC[]);
1097  (ASM_MESON_TAC[]);
1098  (ASM_MESON_TAC[]);
1099  (ASM_MESON_TAC[]);
1100
1101  (COND_CASES_TAC);
1102  (ASM_REAL_ARITH_TAC);
1103  (REAL_ARITH_TAC);
1104
1105  (REWRITE_TAC[SET_RULE `{a} UNION {b} = {a,b}`]);
1106  (REWRITE_WITH `sum {u0:real^3, y} f = f u0 + f y`);
1107  (MATCH_MP_TAC Geomdetail.SUM_DIS2);
1108  (STRIP_TAC);
1109  (NEW_GOAL `~(u0:real^3 IN S)`);
1110  (EXPAND_TAC "S");
1111  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
1112    SET_RULE `v IN {a,b} <=> v = a \/ v = b`]);
1113  (STRIP_TAC);
1114  (NEW_GOAL `u0 IN voronoi_closed V (u1:real^3)`);
1115  (ASM_SET_TAC[]);
1116  (UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
1117  (REPEAT STRIP_TAC);
1118  (NEW_GOAL `dist (u0,u1) <= dist (u0,u0:real^3)`);
1119  (FIRST_ASSUM MATCH_MP_TAC);
1120  (ASM_SET_TAC[]);
1121  (UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL; REAL_ARITH `~(a <= b) <=> b < a`]);
1122  (MATCH_MP_TAC DIST_POS_LT);
1123  (ASM_REWRITE_TAC[]);
1124  (ASM_MESON_TAC[]);
1125
1126  (REWRITE_WITH `(f:real^3->real) u0 = t`);
1127  (EXPAND_TAC "f");
1128  (COND_CASES_TAC);
1129  (REFL_TAC);
1130  (NEW_GOAL `F`);
1131  (ASM_MESON_TAC[]);
1132  (ASM_MESON_TAC[]);
1133
1134  (REWRITE_WITH `(f:real^3->real) y = h`);
1135  (EXPAND_TAC "f");
1136  (COND_CASES_TAC);
1137  (NEW_GOAL `F`);
1138  (NEW_GOAL `~(u0:real^3 IN S)`);
1139  (EXPAND_TAC "S");
1140  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
1141    SET_RULE `v IN {a,b} <=> v = a \/ v = b`]);
1142  (STRIP_TAC);
1143  (NEW_GOAL `u0 IN voronoi_closed V (u1:real^3)`);
1144  (ASM_SET_TAC[]);
1145  (UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
1146  (REPEAT STRIP_TAC);
1147  (NEW_GOAL `dist (u0,u1) <= dist (u0,u0:real^3)`);
1148  (FIRST_ASSUM MATCH_MP_TAC);
1149  (ASM_SET_TAC[]);
1150  (UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL; REAL_ARITH `~(a <= b) <=> b < a`]);
1151  (MATCH_MP_TAC DIST_POS_LT);
1152  (ASM_REWRITE_TAC[]);
1153  (ASM_MESON_TAC[]);
1154  (ASM_MESON_TAC[]);
1155
1156  (COND_CASES_TAC);
1157  (REFL_TAC);
1158  (NEW_GOAL `F`);
1159  (ASM_MESON_TAC[]);
1160  (ASM_MESON_TAC[]);
1161  (ASM_REWRITE_TAC[]);
1162  (ASM_MESON_TAC[]);
1163
1164  (NEW_GOAL `y:real^3 IN S2`);
1165  (EXPAND_TAC "S2");
1166  (NEW_GOAL `y:real^3 IN S1`);
1167  (NEW_GOAL `y:real^3 IN affine hull S`);
1168  (REWRITE_TAC[AFFINE_HULL_EXPLICIT_ALT]);
1169  (REWRITE_TAC[IN; IN_ELIM_THM]);
1170  (EXISTS_TAC `s DELETE u0:real^3`);
1171  (EXISTS_TAC `(\v:real^3. inv h * u v)`);
1172  (REPEAT STRIP_TAC);
1173  (ASM_REWRITE_TAC[FINITE_DELETE]);
1174  (ASM_SET_TAC[]);
1175  (REWRITE_TAC[SUM_LMUL]);
1176  (ASM_REWRITE_TAC[]);
1177  (ASM_SIMP_TAC[Trigonometry2.REAL_MUL_LRINV; 
1178    REAL_ARITH `~(h <= &0) ==> ~(h = &0)`]);
1179  (REWRITE_TAC[GSYM VECTOR_MUL_ASSOC]);
1180  (ASM_SIMP_TAC[VSUM_LMUL; FINITE_DELETE]);
1181  (NEW_GOAL `affine hull S1 = S1:real^3->bool`);
1182  (REWRITE_TAC[AFFINE_HULL_EQ]);
1183  (EXPAND_TAC "S1" THEN REWRITE_TAC[AFFINE_HYPERPLANE]);
1184
1185  (NEW_GOAL `affine hull S SUBSET affine hull (S1:real^3->bool)`);
1186  (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);
1187  (EXPAND_TAC "S");
1188  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
1189    SET_RULE `INTERS {f x | x IN {a, b}} = f a INTER f b`]);
1190  (DEL_TAC THEN EXPAND_TAC "S1");
1191  (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);
1192  (ASM_REWRITE_TAC[]);
1193  (ASM_SET_TAC[]);
1194
1195  (NEW_GOAL `relative_interior S SUBSET S:real^3->bool`);
1196  (REWRITE_TAC[RELATIVE_INTERIOR_SUBSET]);
1197  (ASM_SET_TAC[]);
1198
1199  (NEW_GOAL `dist (z,u0) <= dist (y,u0:real^3)`);
1200  (ONCE_REWRITE_TAC[DIST_SYM]);
1201  (ASM_SIMP_TAC[]);
1202  (UNDISCH_TAC `x:real^3 IN rcone_gt u0 u1 a`);
1203  (REWRITE_TAC[rcone_gt; rconesgn; IN; IN_ELIM_THM]);
1204  (ASM_REWRITE_TAC[]);
1205  (REWRITE_WITH `dist (t % u0 + h % y,u0) = h * dist (y, u0:real^3)`);
1206  (REWRITE_TAC[dist]);
1207  (REWRITE_WITH `(t % u0 + h % y:real^3) - u0 = (t % u0 + h % y) - (t + h) % u0`);
1208  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
1209  (REWRITE_TAC[VECTOR_ARITH `(t % u0 + h % y) - (t + h) % u0 = h % (y - u0)`]);
1210  (REWRITE_TAC[NORM_MUL]);
1211  (REWRITE_WITH `abs h = h`);
1212  (REWRITE_TAC[REAL_ABS_REFL]);
1213  (ASM_REAL_ARITH_TAC);
1214
1215  (REWRITE_TAC[REAL_ARITH `~(a > b) <=> a <= b`]);
1216  (REWRITE_WITH `h * dist (p,u0:real^3) * dist (u1,u0) = 
1217             (h * dist (z,u0)) * dist (u1,u0) * a`);
1218  (EXPAND_TAC "a");
1219  (REWRITE_TAC[REAL_ARITH `(a * b) * c * d / b = (a * d * c) * (b / b)`]);
1220  (REWRITE_WITH `dist (z,u0) / dist (z,u0:real^3) = &1`);
1221  (MATCH_MP_TAC REAL_DIV_REFL);
1222  (REWRITE_TAC[DIST_EQ_0]);
1223  (STRIP_TAC);
1224
1225  (NEW_GOAL `~(u0:real^3 IN S1)`);
1226  (EXPAND_TAC "S1" THEN REWRITE_TAC[IN; IN_ELIM_THM; NORM_POW_2]);
1227  (REWRITE_TAC[REAL_ARITH `a = b - c <=> a + c - b = &0`]);
1228  (REWRITE_TAC[VECTOR_ARITH `&2 % (u0 - u1) dot u0 + u1 dot u1 - u0 dot u0 = 
1229   (u0 - u1) dot (u0 - u1)`]);
1230  (REWRITE_TAC[DOT_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
1231  (ASM_REWRITE_TAC[]);
1232  (NEW_GOAL `z:real^3 IN S1`);
1233  (ASM_SET_TAC[]);
1234  (ASM_MESON_TAC[]);
1235
1236  (REAL_ARITH_TAC);
1237  (REWRITE_TAC[REAL_ARITH 
1238   `(a * x) * b * c <= (a * y) * b * c <=> &0 <= a * b * c *(y - x)`]);
1239  (MATCH_MP_TAC REAL_LE_MUL);
1240  (STRIP_TAC);
1241  (ASM_REAL_ARITH_TAC);
1242  (MATCH_MP_TAC REAL_LE_MUL);
1243  (REWRITE_TAC[DIST_POS_LE]);
1244  (MATCH_MP_TAC REAL_LE_MUL);
1245  (STRIP_TAC);
1246  (ASM_REAL_ARITH_TAC);
1247  (ASM_REAL_ARITH_TAC);
1248
1249  (UP_ASM_TAC THEN STRIP_TAC);
1250
1251 (* OK until here *)
1252 (* ========================================================================= *)
1253
1254  (ABBREV_TAC `W = aff_ge_alt {u0:real^3} S`);
1255  (ABBREV_TAC `c = max b (hl[u0;u1:real^3] / sqrt (&2))`);
1256  (NEW_GOAL `&0 < c /\ c < &1`);
1257  (EXPAND_TAC "c" THEN REWRITE_TAC[REAL_LT_MAX]);
1258  (ASM_REWRITE_TAC[]);
1259  (EXPAND_TAC "c" THEN REWRITE_TAC[REAL_MAX_LT]);
1260  (STRIP_TAC);
1261  (ASM_REWRITE_TAC[]);
1262  (REWRITE_WITH `hl [u0; u1:real^3] / sqrt (&2) < &1 <=> 
1263                  hl [u0; u1] < &1 * sqrt (&2)`);
1264  (MATCH_MP_TAC REAL_LT_LDIV_EQ);
1265  (ASM_SIMP_TAC[SQRT_POS_LT; REAL_ARITH `&0 < &2`]);
1266  (ASM_REAL_ARITH_TAC);
1267
1268  (NEW_GOAL `rcone_gt u0 u1 c SUBSET 
1269              W INTER (rcone_gt u0 u1 (hl [u0; u1:real^3] / sqrt (&2)))`);
1270  (REWRITE_TAC[SUBSET_INTER]);
1271  (STRIP_TAC);
1272  (NEW_GOAL `rcone_gt (u0:real^3) u1 c SUBSET rcone_gt u0 u1 b`);
1273  (MATCH_MP_TAC RCONE_GT_SUBSET);
1274  (EXPAND_TAC "c" THEN REAL_ARITH_TAC);
1275  (ASM_SET_TAC[]);
1276  (MATCH_MP_TAC RCONE_GT_SUBSET);
1277  (EXPAND_TAC "c" THEN REAL_ARITH_TAC);
1278
1279  (ABBREV_TAC `C = ball (u0:real^3,&1) INTER rcone_gt u0 u1 c`);
1280  (NEW_GOAL `C SUBSET 
1281       UNIONS
1282       {rogers V vl | vl | barV V 3 vl /\ truncate_simplex 1 vl = [u0; u1]}`);
1283  (REWRITE_TAC[SUBSET]);
1284  (REPEAT STRIP_TAC);
1285  (NEW_GOAL `x IN ball (u0:real^3,&1)  /\ x IN aff_ge_alt {u0} S`);
1286  (ASM_SET_TAC[]);
1287  (UP_ASM_TAC THEN STRIP_TAC);
1288
1289  (NEW_GOAL `(x:real^3) IN convex hull (u0 INSERT S)`);
1290  (REWRITE_TAC[CONVEX_HULL_EXPLICIT; IN; IN_ELIM_THM]);
1291
1292  (UP_ASM_TAC THEN REWRITE_TAC[IN; aff_ge_alt; lin_combo]);
1293  (REPEAT STRIP_TAC);
1294  (EXISTS_TAC `{u0:real^3} UNION q`);
1295  (EXISTS_TAC `f:real^3->real`);
1296  (REPEAT STRIP_TAC);
1297  (REWRITE_TAC[SET_RULE `{a} UNION b = a INSERT b`; FINITE_INSERT]);
1298  (ASM_REWRITE_TAC[]);
1299  (ASM_SET_TAC[]);
1300  (ASM_CASES_TAC `x':real^3 IN q`);
1301  (FIRST_ASSUM MATCH_MP_TAC);
1302  (UP_ASM_TAC THEN MESON_TAC[IN]);
1303  (REWRITE_WITH `x' = u0:real^3`);
1304  (NEW_GOAL `x' IN ({u0:real^3} UNION q)`);
1305  (ASM_REWRITE_TAC[IN]);
1306  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
1307  (REWRITE_TAC[REAL_ARITH `&0 <= x <=> ~(x < &0)`]);
1308  (STRIP_TAC);
1309  (UNDISCH_TAC `x IN ball (u0:real^3,&1)`);
1310  (ASM_REWRITE_TAC[IN_BALL; SET_RULE `{u} UNION q = u INSERT (q DELETE u)`]);
1311  (REWRITE_WITH `vsum (u0 INSERT (q DELETE u0:real^3)) (\v. f v % v) = 
1312   (if u0 IN (q DELETE u0) then vsum (q DELETE u0) (\v. f v % v)
1313    else (\v. f v % v) u0 + vsum (q DELETE u0) (\v. f v % v))`);
1314  (MATCH_MP_TAC Marchal_cells_2_new.VSUM_CLAUSES_alt);
1315  (ASM_REWRITE_TAC[FINITE_DELETE]);
1316  (COND_CASES_TAC);
1317  (NEW_GOAL `F`);
1318  (UP_ASM_TAC THEN SET_TAC[]);
1319  (ASM_MESON_TAC[]);
1320  (ONCE_REWRITE_TAC[DIST_SYM]);
1321  (REWRITE_TAC[dist]);
1322  (REWRITE_WITH `!a. a - u0 = a - (sum ({u0:real^3} UNION q) f) % u0`);
1323  (ASM_REWRITE_TAC[]);
1324  (VECTOR_ARITH_TAC);
1325
1326  (NEW_GOAL `sum ({u0} UNION q) f = f u0 + sum (q DELETE u0:real^3) f`);
1327  (REWRITE_TAC[SET_RULE `{u} UNION q = u INSERT (q DELETE u)`]);
1328  (REWRITE_WITH `sum (u0 INSERT (q DELETE u0:real^3)) f = 
1329   (if u0 IN (q DELETE u0) then sum (q DELETE u0) f
1330    else f u0 + sum (q DELETE u0) f)`);
1331  (MATCH_MP_TAC Marchal_cells_2_new.SUM_CLAUSES_alt);
1332  (ASM_REWRITE_TAC[FINITE_DELETE]);
1333  (COND_CASES_TAC);
1334  (NEW_GOAL `F`);
1335  (UP_ASM_TAC THEN SET_TAC[]);
1336  (ASM_MESON_TAC[]);
1337  (ASM_REWRITE_TAC[]);
1338  (REWRITE_TAC[VECTOR_ADD_RDISTRIB;
1339    VECTOR_ARITH `(a + b) - (a + c:real^3) = b - c`;
1340    ASSUME `sum ({u0} UNION q) f = f u0 + sum (q DELETE u0:real^3) f`; ]);
1341  (ABBREV_TAC `h = sum (q DELETE u0:real^3) f`);
1342  (ABBREV_TAC `y = inv (h) % vsum (q DELETE u0) (\v:real^3. f v % v)`);
1343  (NEW_GOAL `h > &1`);
1344  (ASM_REAL_ARITH_TAC);
1345  (REWRITE_WITH `vsum (q DELETE u0) (\v. f v % v) = h % y:real^3`);
1346  (EXPAND_TAC "y");
1347  (REWRITE_TAC[VECTOR_MUL_ASSOC]);
1348  (REWRITE_WITH `h * inv h = &1`);
1349  (ASM_SIMP_TAC [Trigonometry2.REAL_MUL_LRINV; REAL_ARITH `h > &1 ==> ~(h = &0)`]);
1350  (VECTOR_ARITH_TAC);
1351  (REWRITE_TAC[VECTOR_ARITH `h % a - h % b = h % (a - b)`; NORM_MUL]);
1352  (REWRITE_TAC[REAL_ARITH `~(a < b) <=> b <= a`]);
1353
1354  (NEW_GOAL `norm (p - u0) <= norm (y - u0:real^3)`);
1355  (MATCH_MP_TAC Tactics_jordan.REAL_POW_2_LE);
1356  (REWRITE_TAC[NORM_POS_LE]);
1357  (REWRITE_WITH 
1358   `norm (y - u0) pow 2 = norm (p - u0) pow 2 + norm (y - p:real^3) pow 2`);
1359  (MATCH_MP_TAC PYTHAGORAS);
1360  (REWRITE_TAC[orthogonal]);
1361  (REWRITE_WITH `p = circumcenter (set_of_list [u0;u1:real^3])`);
1362  (ASM_REWRITE_TAC[set_of_list]);
1363  (ONCE_REWRITE_TAC[DOT_SYM]);
1364  (MATCH_MP_TAC Rogers.MHFTTZN4);
1365  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `1`);
1366  (REPEAT STRIP_TAC);
1367  (ASM_REWRITE_TAC[]);
1368  (ASM_REWRITE_TAC[]);
1369
1370  (REWRITE_TAC[ASSUME `voronoi_list V [u0; u1] = S`]);
1371  (REWRITE_TAC[AFFINE_HULL_EXPLICIT_ALT; IN; IN_ELIM_THM]);
1372  (EXISTS_TAC `q DELETE u0:real^3`);
1373  (EXISTS_TAC `(\v:real^3. inv h * f v)`);
1374  (REPEAT STRIP_TAC);
1375  (ASM_REWRITE_TAC[FINITE_DELETE]);
1376  (ASM_SET_TAC[]);
1377  (ASM_REWRITE_TAC[SUM_LMUL]);
1378  (ASM_SIMP_TAC [Trigonometry2.REAL_MUL_LRINV; REAL_ARITH `h > &1 ==> ~(h = &0)`]);
1379  (REWRITE_TAC[GSYM VECTOR_MUL_ASSOC]);
1380  (ASM_REWRITE_TAC[VSUM_LMUL]);
1381
1382  (REWRITE_TAC[set_of_list]);
1383  (NEW_GOAL `{u0, u1:real^3} SUBSET affine hull {u0, u1}`);
1384  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
1385  (ASM_SET_TAC[]);
1386  (REWRITE_TAC[REAL_ARITH `a <= a + b <=> &0 <= b`; NORM_POW_2; DOT_POS_LE]);
1387
1388  (NEW_GOAL `&1 <= norm (p - u0:real^3)`);
1389  (EXPAND_TAC "p");
1390  (REWRITE_TAC[CIRCUMCENTER_2; midpoint; 
1391    VECTOR_ARITH `inv (&2) % (u0 + u1) - u0 = inv (&2) % (u1 - u0)`; 
1392    NORM_MUL; REAL_ARITH `abs (inv(&2)) = inv (&2)`]);
1393  (REWRITE_TAC[GSYM dist]);
1394  (REWRITE_WITH `&1 = inv (&2) * &2`);
1395  (REAL_ARITH_TAC);
1396  (REWRITE_TAC[REAL_ARITH `inv (&2) * &2 <= inv (&2) * a <=> &2 <= a`]);
1397  (MP_TAC (ASSUME `packing (V:real^3->bool)`));
1398  (REWRITE_TAC[packing] THEN STRIP_TAC);
1399  (FIRST_ASSUM MATCH_MP_TAC);
1400  (ASM_REWRITE_TAC[] THEN ASM_SET_TAC[]);
1401  (REWRITE_WITH `abs h = h`);
1402  (ASM_REAL_ARITH_TAC);
1403
1404  (NEW_GOAL `h <= h * norm (y - u0:real^3)`);
1405  (REWRITE_TAC[REAL_ARITH `h <= h * a <=> &0 <= h * (a - &1)`]);
1406  (MATCH_MP_TAC REAL_LE_MUL);
1407  (ASM_REAL_ARITH_TAC);
1408  (ASM_REAL_ARITH_TAC);
1409
1410  (ASM_REWRITE_TAC[]);
1411  (ASM_REWRITE_TAC[]);
1412
1413  (NEW_GOAL `~(S:real^3->bool = {})`);
1414  (STRIP_TAC);
1415  (NEW_GOAL `~(aff_dim (u0:real^3 INSERT S) = &3)`);
1416  (REWRITE_TAC[ASSUME `S:real^3->bool = {}`; AFF_DIM_SING]);
1417  (ARITH_TAC);
1418  (ASM_MESON_TAC[]);
1419  (SWITCH_TAC);
1420  (UP_ASM_TAC THEN SIMP_TAC[CONVEX_HULL_INSERT; 
1421    ASSUME `~(S:real^3->bool = {})`]);
1422  (REWRITE_WITH `convex hull S = S:real^3->bool`);
1423  (REWRITE_TAC[CONVEX_HULL_EQ]);
1424  (EXPAND_TAC "S" THEN REWRITE_TAC[Packing3.CONVEX_VORONOI_LIST]);
1425  (ASM_REWRITE_TAC[]);
1426  (REWRITE_TAC[IN_UNIONS; IN; IN_ELIM_THM]);
1427  (REPEAT STRIP_TAC);
1428
1429  (EXISTS_TAC `rogers V vl`);
1430  (REPEAT STRIP_TAC);
1431  (EXISTS_TAC `vl:(real^3)list`);
1432  (ASM_REWRITE_TAC[]);
1433
1434  (ASM_SIMP_TAC[Marchal_cells_2_new.ROGERS_EXPLICIT]);
1435  (REWRITE_TAC[CONVEX_HULL_4; IN_ELIM_THM]);
1436
1437  (UNDISCH_TAC `(t:real^3->bool) b'`);
1438  (ASM_REWRITE_TAC[CONVEX_HULL_3; IN_ELIM_THM]);
1439  (REPEAT STRIP_TAC);
1440
1441  (EXISTS_TAC `u:real`);
1442  (EXISTS_TAC `v * u'`);
1443  (EXISTS_TAC `v * v'`);
1444  (EXISTS_TAC `v * w`);
1445  (ASM_SIMP_TAC[REAL_LE_MUL]);
1446  (STRIP_TAC);
1447
1448  (REWRITE_TAC[REAL_ARITH `u + v * u' + v * v' + v * w = u + v * (u' + v' +w)`]);
1449  (ASM_REWRITE_TAC[]);
1450  (ASM_REAL_ARITH_TAC);
1451
1452  (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);
1453  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1454  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1455  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ CARD (set_of_list vl) = 3 + 1`);
1456  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1457  (EXISTS_TAC `V:real^3->bool`);
1458  (ASM_REWRITE_TAC[]);
1459  (ARITH_TAC);
1460
1461  (ASM_REWRITE_TAC[HD]);
1462  (VECTOR_ARITH_TAC);
1463
1464 (* ========================================================================== *)
1465
1466  (NEW_GOAL 
1467  `!X. mcell_set V X /\ ~NULLSET (X INTER C)
1468      ==> (?k vl.
1469               2 <= k /\
1470               barV V 3 vl /\
1471               X = mcell k V vl /\
1472               truncate_simplex 1 vl = [u0; u1])`);
1473
1474  (REWRITE_TAC[mcell_set_2; IN_ELIM_THM]);
1475  (REPEAT STRIP_TAC);
1476
1477  (NEW_GOAL `~NULLSET (X INTER UNIONS
1478       {rogers V vl | vl | barV V 3 vl /\ truncate_simplex 1 vl = [u0; u1]})`);
1479  (STRIP_TAC);
1480  (UNDISCH_TAC `~NULLSET (X INTER C)`);
1481  (REWRITE_TAC[]);
1482  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1483  (EXISTS_TAC `X INTER
1484        UNIONS
1485        {rogers V vl | vl | barV V 3 vl /\ truncate_simplex 1 vl = [u0; u1]}`);
1486  (STRIP_TAC);
1487  (ASM_REWRITE_TAC[]);
1488  (ASM_SET_TAC[]);
1489  (UP_ASM_TAC THEN REWRITE_TAC[INTER_UNIONS]);
1490  (STRIP_TAC);
1491
1492  (NEW_GOAL 
1493   `!s. ~NULLSET (UNIONS s) /\ FINITE s ==> (?t. t IN s /\ ~NULLSET t)`);
1494  (MESON_TAC[NEGLIGIBLE_UNIONS]);
1495  (ABBREV_TAC `St = {X INTER x | x IN
1496                     {rogers V vl | vl | barV V 3 vl /\
1497                                         truncate_simplex 1 vl = [u0; u1]}}`);
1498  (NEW_GOAL `?t. t IN St /\ ~NULLSET t`);
1499  (FIRST_ASSUM MATCH_MP_TAC);
1500  (ASM_REWRITE_TAC[]);
1501  (EXPAND_TAC "St");
1502  (ABBREV_TAC `Sr = {rogers V vl | vl | barV V 3 vl /\
1503                                   truncate_simplex 1 vl = [u0; u1]}`);
1504  (ABBREV_TAC `f = (\x:real^3->bool. X INTER x)`);
1505  (MATCH_MP_TAC FINITE_SUBSET);
1506  (EXISTS_TAC `{y:real^3->bool | ?x:real^3->bool. x IN Sr /\ y = f x }`);
1507  (STRIP_TAC);
1508
1509  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1510  (ABBREV_TAC `Ss = {vl | barV V 3 vl /\ truncate_simplex 1 vl = [u0; u1]}`);
1511  (MATCH_MP_TAC FINITE_SUBSET);
1512  (EXISTS_TAC `{y | ?vl. vl IN Ss /\ y = rogers V vl}`);
1513  (STRIP_TAC);
1514  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1515  (ABBREV_TAC `Sx = V INTER ball (u0:real^3, &4)`);
1516  (MATCH_MP_TAC FINITE_SUBSET);
1517  (EXISTS_TAC `{y | ?u0 u1 u2 u3:real^3.
1518                       u0 IN Sx /\
1519                       u1 IN Sx /\
1520                       u2 IN Sx /\
1521                       u3 IN Sx /\
1522                       y = [u0; u1; u2; u3]}`);
1523  (STRIP_TAC);
1524  (MATCH_MP_TAC Ajripqn.FINITE_SET_LIST_LEMMA);
1525  (EXPAND_TAC "Sx");
1526  (MATCH_MP_TAC Pack2.KIUMVTC);
1527  (ASM_REWRITE_TAC[]);
1528  (EXPAND_TAC "Ss");
1529  (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM]);
1530  (REPEAT STRIP_TAC);
1531
1532  (NEW_GOAL `?v0 v1 v2 v3. x = [v0;v1;v2;v3:real^3]`);
1533  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
1534  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1535  (UP_ASM_TAC THEN STRIP_TAC);
1536  (EXISTS_TAC `v0:real^3`);
1537  (EXISTS_TAC `v1:real^3`);
1538  (EXISTS_TAC `v2:real^3`);
1539  (EXISTS_TAC `v3:real^3`);
1540  (ASM_REWRITE_TAC[]);
1541
1542  (NEW_GOAL `{v0, v1, v2, v3:real^3} SUBSET Sx`);
1543  (EXPAND_TAC "Sx");
1544  (REWRITE_TAC[SUBSET_INTER]);
1545  (REWRITE_WITH `{v0, v1, v2, v3:real^3} = set_of_list x`);
1546  (ASM_REWRITE_TAC[set_of_list]);
1547  (STRIP_TAC);
1548  (MATCH_MP_TAC Packing3.BARV_SUBSET);
1549  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
1550  (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
1551  (EXISTS_TAC `V:real^3->bool`);
1552  (ASM_REWRITE_TAC[]);
1553  (NEW_GOAL `HD (truncate_simplex 1 x) = u0:real^3`);
1554  (ASM_REWRITE_TAC[HD]);
1555  (NEW_GOAL `HD (truncate_simplex 1 x) = v0:real^3`);
1556  (REWRITE_TAC[ASSUME `x = [v0; v1; v2; v3:real^3]`;  
1557    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
1558
1559  (REWRITE_WITH `u0 = v0:real^3`);
1560  (ASM_MESON_TAC[]);
1561  (REWRITE_TAC[set_of_list] THEN SET_TAC[]);
1562  (UP_ASM_TAC THEN SET_TAC[]);
1563
1564  (EXPAND_TAC "Sr" THEN EXPAND_TAC "Ss");
1565  (SET_TAC[]);
1566  (REWRITE_WITH `{X INTER x:real^3->bool | x IN Sr} = {f x | x IN Sr}`);
1567  (EXPAND_TAC "f");
1568  (REFL_TAC);
1569  (SET_TAC[]);
1570  (UP_ASM_TAC THEN EXPAND_TAC "St" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
1571  (REPEAT STRIP_TAC);
1572
1573  (NEW_GOAL `x SUBSET UNIONS {mcell i V vl | i <= 4}`);
1574  (ASM_REWRITE_TAC[SUBSET; IN_UNIONS; IN; IN_ELIM_THM]);
1575  (REPEAT STRIP_TAC);
1576  (NEW_GOAL `?i. i <= 4 /\ x' IN mcell i V vl`);
1577  (MATCH_MP_TAC Sltstlo.SLTSTLO1);
1578  (ASM_REWRITE_TAC[IN]);
1579  (UP_ASM_TAC THEN STRIP_TAC);
1580  (EXISTS_TAC `mcell i' V vl`);
1581  (STRIP_TAC);
1582  (EXISTS_TAC `i':num` THEN ASM_REWRITE_TAC[]);
1583  (UP_ASM_TAC THEN REWRITE_TAC[IN]);
1584
1585  (NEW_GOAL `~NULLSET (X INTER UNIONS {mcell i V vl | i <= 4})`);
1586  (STRIP_TAC);
1587  (UNDISCH_TAC `~NULLSET (t)`);
1588  (REWRITE_TAC[ASSUME `t:real^3->bool = X INTER x`]);
1589  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1590  (EXISTS_TAC `X INTER UNIONS {mcell i V vl | i <= 4}`);
1591  (STRIP_TAC);
1592  (ASM_REWRITE_TAC[]);
1593  (ASM_SET_TAC[]);
1594  (UP_ASM_TAC THEN REWRITE_TAC[INTER_UNIONS]);
1595  (STRIP_TAC);
1596
1597  (NEW_GOAL 
1598   `!s. ~NULLSET (UNIONS s) /\ FINITE s ==> (?t. t IN s /\ ~NULLSET t)`);
1599  (MESON_TAC[NEGLIGIBLE_UNIONS]);
1600  (ABBREV_TAC `Sx = {X INTER x | x IN {mcell i V vl | i <= 4}}`);
1601  (NEW_GOAL `?t. t IN Sx /\ ~NULLSET t`);
1602  (FIRST_ASSUM MATCH_MP_TAC);
1603  (ASM_REWRITE_TAC[]);
1604  (EXPAND_TAC "Sx");
1605  (ABBREV_TAC `Sy = {mcell i V vl | i <= 4}`);
1606  (ABBREV_TAC `f = (\x:real^3->bool. X INTER x)`);
1607  (MATCH_MP_TAC FINITE_SUBSET);
1608  (EXISTS_TAC `{y:real^3->bool | ?x:real^3->bool. x IN Sy /\ y = f x }`);
1609  (STRIP_TAC);
1610  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1611  (EXPAND_TAC "Sy");
1612  (REWRITE_TAC[GSYM IN_NUMSEG_0]);
1613  (ABBREV_TAC `g = (\i:num. mcell i V vl)`);
1614  (REWRITE_WITH `{mcell i V vl | i IN 0..4} = {g i | i IN 0..4}`);
1615  (EXPAND_TAC "g" THEN REWRITE_TAC[]);
1616  (MATCH_MP_TAC FINITE_SUBSET);
1617  (EXISTS_TAC `{y:real^3->bool | ?i. i IN 0..4 /\ y = g i}`);
1618  (STRIP_TAC);
1619  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1620  (REWRITE_TAC[FINITE_NUMSEG]);
1621  (SET_TAC[]);
1622  (REWRITE_WITH `{X INTER x:real^3->bool | x IN Sy} = {f x | x IN Sy}`);
1623  (EXPAND_TAC "f" THEN REWRITE_TAC[]);
1624  (SET_TAC[]);
1625  (UP_ASM_TAC THEN EXPAND_TAC "Sx" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
1626  (REPEAT STRIP_TAC);
1627
1628 (* ========================================================================= *)
1629
1630  (NEW_GOAL `i = i' /\ mcell i V ul = mcell i' V vl`);
1631  (MATCH_MP_TAC Ajripqn.AJRIPQN);
1632  (ASM_REWRITE_TAC[GSYM Ajripqn.UP_TO_4_KY_LEMMA]);
1633  (REPEAT STRIP_TAC);
1634  (UNDISCH_TAC `ul IN barV V 3` THEN REWRITE_TAC[IN]);
1635  (UNDISCH_TAC `~NULLSET t'`);
1636  (ASM_REWRITE_TAC[]);
1637  (EXISTS_TAC `i:num` THEN EXISTS_TAC `vl:(real^3)list`);
1638  (ASM_REWRITE_TAC[]);
1639
1640 (* ========================================================================= *)
1641
1642  (ASM_CASES_TAC `i' = 0`);
1643  (NEW_GOAL `F`);
1644  (UNDISCH_TAC `~NULLSET (X INTER C)`);
1645  (REWRITE_TAC[]);
1646  (REWRITE_WITH `X INTER C = {}:real^3->bool`);
1647  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell0]);
1648  (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);
1649  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1650  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1651  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ CARD (set_of_list vl) = 3 + 1`);
1652  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1653  (EXISTS_TAC `V:real^3->bool`);
1654  (ASM_REWRITE_TAC[]);
1655  (ARITH_TAC);
1656  (ASM_REWRITE_TAC[HD]);
1657  (NEW_GOAL `C SUBSET ball (u0:real^3, sqrt (&2))`);
1658  (NEW_GOAL `ball (u0:real^3, &1) SUBSET ball (u0, sqrt (&2))`);
1659  (MATCH_MP_TAC SUBSET_BALL);
1660  (MATCH_MP_TAC (REAL_ARITH `a < b ==> a <= b`));
1661  (REWRITE_TAC[Marchal_cells_2_new.ZERO_LT_SQRT_2]);
1662  (ASM_SET_TAC[]);
1663  (UP_ASM_TAC THEN SET_TAC[]);
1664  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1665  (ASM_MESON_TAC[]);
1666
1667  (ASM_CASES_TAC `i' = 1`);
1668  (NEW_GOAL `F`);
1669  (UNDISCH_TAC `~NULLSET (X INTER C)`);
1670  (REWRITE_TAC[]);
1671  (REWRITE_WITH `X INTER C = {}:real^3->bool`);
1672  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell1]);
1673  (COND_CASES_TAC);
1674  (NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);
1675  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
1676  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1677  (UP_ASM_TAC THEN STRIP_TAC);
1678  (ASM_REWRITE_TAC[HD; TL]);
1679
1680  (REWRITE_WITH `v0 = u0:real^3`);
1681  (NEW_GOAL `HD (truncate_simplex 1 vl) = u0:real^3`);
1682  (ASM_REWRITE_TAC[HD]);
1683  (NEW_GOAL `HD (truncate_simplex 1 vl) = v0:real^3`);
1684  (REWRITE_TAC[ASSUME `vl = [v0; v1; v2; v3:real^3]`;  
1685    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
1686  (ASM_MESON_TAC[]);
1687
1688  (REWRITE_WITH `v1 = u1:real^3`);
1689  (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = u1:real^3`);
1690  (ASM_REWRITE_TAC[HD; TL]);
1691  (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = v1:real^3`);
1692  (REWRITE_TAC[ASSUME `vl = [v0; v1; v2; v3:real^3]`;  
1693    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
1694  (ASM_MESON_TAC[]);
1695
1696  (NEW_GOAL `C SUBSET (rcone_gt u0 u1 (hl [u0:real^3; u1] / sqrt (&2)))`);
1697  (EXPAND_TAC "C");
1698  (SET_TAC[ASSUME `rcone_gt u0 u1 c SUBSET
1699                    W INTER rcone_gt u0 u1 (hl [u0:real^3; u1] / sqrt (&2))`]);
1700  (UP_ASM_TAC THEN SET_TAC[]);
1701  (SET_TAC[]);
1702  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1703  (UP_ASM_TAC THEN MESON_TAC[]);
1704  (ASM_ARITH_TAC);
1705
1706 (* ========================================================================= *)
1707
1708  (ABBREV_TAC `f1 = 
1709   (\ul. dist (u0:real^3, 
1710               closest_point (affine hull {u1, EL 2 ul, mxi V ul}) u0))`);
1711
1712  (ABBREV_TAC `P1 = { (f1:(real^3)list->real) ul |ul | barV V 3 ul /\
1713                                  ~NULLSET (mcell 3 V ul INTER C) /\
1714                                   truncate_simplex 1 ul = [u0; u1]}`);
1715
1716  (NEW_GOAL `~(P1 = {}) ==> (?b:real. b IN P1 /\ (!x. x IN P1 ==> b <= x))`);
1717  (STRIP_TAC);
1718  (MATCH_MP_TAC INF_FINITE_LEMMA);
1719  (ASM_REWRITE_TAC[]);
1720  (EXPAND_TAC "P1");
1721  (ONCE_REWRITE_TAC [SET_RULE `{f x| x | P x} = {f x | x IN {y | P y}}`]);
1722  (ONCE_REWRITE_TAC [SET_RULE `{f x| x IN s} = {y | ?x. x IN s /\ y = f x}`]);
1723  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1724  (MATCH_MP_TAC FINITE_SUBSET);
1725  (EXISTS_TAC `{y | ?v0:real^3 v1 u2 u3.
1726                       v0 IN (V INTER ball (u0:real^3, &4)) /\
1727                       v1 IN (V INTER ball (u0, &4)) /\
1728                       u2 IN (V INTER ball (u0, &4)) /\
1729                       u3 IN (V INTER ball (u0, &4)) /\
1730                       y = [v0; v1; u2; u3]}`);
1731  (STRIP_TAC);
1732  (MATCH_MP_TAC FINITE_SET_LIST_LEMMA);
1733  (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
1734  (REWRITE_TAC[SUBSET] THEN ONCE_REWRITE_TAC[IN] THEN REWRITE_TAC[IN_ELIM_THM]);
1735  (REPEAT STRIP_TAC);
1736  (NEW_GOAL `?v0 v1 u2 u3. x = [v0; v1; u2; u3:real^3]`);
1737  (MATCH_MP_TAC BARV_3_EXPLICIT);
1738  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1739  (UP_ASM_TAC THEN STRIP_TAC);
1740  (EXISTS_TAC `v0:real^3` THEN EXISTS_TAC `v1:real^3` THEN     
1741    EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
1742  (ASM_REWRITE_TAC[]);
1743  (NEW_GOAL `v0 = u0:real^3`);
1744  (REWRITE_WITH `v0 = HD (x:(real^3)list)`);
1745  (ASM_REWRITE_TAC[HD]);
1746  (REWRITE_WITH `u0 = HD (truncate_simplex 1 (x:(real^3)list))`);
1747  (ASM_REWRITE_TAC[HD]);
1748  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1749  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
1750  (NEW_GOAL `set_of_list x SUBSET ball (u0:real^3,&4)`);
1751  (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
1752  (EXISTS_TAC `V:real^3->bool`);
1753  (ASM_REWRITE_TAC[set_of_list]);
1754  (SET_TAC[]);
1755  (NEW_GOAL `set_of_list x SUBSET V:real^3->bool`);
1756  (MATCH_MP_TAC Packing3.BARV_SUBSET);
1757  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
1758  (UP_ASM_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list]);
1759  (SET_TAC[]);
1760
1761  (ABBREV_TAC `r1 = (if (P1 = {}:real->bool) then &1 
1762                     else (@b. b IN P1 /\ (!x. x IN P1 ==> b <= x)))`);
1763  (NEW_GOAL `&0 < r1`);
1764  (EXPAND_TAC "r1");
1765  (COND_CASES_TAC);
1766  (REAL_ARITH_TAC);
1767  (NEW_GOAL `?b:real. b IN P1 /\ (!x. x IN P1 ==> b <= x)`);
1768  (ASM_SIMP_TAC[]);
1769  (UP_ASM_TAC THEN STRIP_TAC);
1770  (ABBREV_TAC `P  = (\b:real. b IN P1 /\ (!x. x IN P1 ==> b <= x))`);
1771  (ABBREV_TAC `zz = (@) (P:real->bool)`);
1772  (NEW_GOAL `(P:real->bool) zz`);
1773  (EXPAND_TAC "zz");
1774  (MATCH_MP_TAC SELECT_AX);
1775  (EXISTS_TAC `b':real`);
1776  (EXPAND_TAC "P" THEN ASM_REWRITE_TAC[]);
1777  (UP_ASM_TAC THEN EXPAND_TAC "P" THEN REWRITE_TAC[]);
1778  (EXPAND_TAC "P1" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
1779  (REPEAT STRIP_TAC);
1780  (ASM_REWRITE_TAC[]);
1781  (EXPAND_TAC "f1");
1782  (MATCH_MP_TAC DIST_POS_LT);
1783  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1784  (REWRITE_WITH `closest_point (affine hull {u1, EL 2 ul, mxi V ul}) u0 = u0
1785   <=> u0 IN (affine hull {u1:real^3, EL 2 ul, mxi V ul})`);
1786  (MATCH_MP_TAC CLOSEST_POINT_REFL);
1787  (REWRITE_TAC[CLOSED_AFFINE_HULL]);
1788  (REWRITE_TAC[AFFINE_HULL_EQ_EMPTY] THEN SET_TAC[]);
1789  (STRIP_TAC);
1790  (UNDISCH_TAC `~NULLSET (mcell 3 V ul INTER C)`);
1791  (REWRITE_TAC[] THEN MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1792  (EXISTS_TAC `mcell 3 V ul`);
1793  (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);
1794  (REWRITE_TAC[MCELL_EXPLICIT; mcell3]);
1795  (COND_CASES_TAC);
1796
1797  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);
1798  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
1799  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1800  (UP_ASM_TAC THEN STRIP_TAC);
1801  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list]);
1802
1803  (REWRITE_WITH `v0 = u0:real^3`);
1804  (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);
1805  (ASM_REWRITE_TAC[HD]);
1806  (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);
1807  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
1808    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
1809  (ASM_MESON_TAC[]);
1810
1811  (REWRITE_WITH `v1 = u1:real^3`);
1812  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);
1813  (ASM_REWRITE_TAC[HD; TL]);
1814  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);
1815  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
1816    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
1817  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
1818  (REWRITE_TAC[SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
1819
1820  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1821  (EXISTS_TAC `affine hull {u0, u1, v2, mxi V [u0; u1; v2; v3]}`);
1822  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
1823  (REWRITE_WITH `affine hull {u0, u1, v2, mxi V [u0; u1; v2; v3]} = 
1824                  affine hull {u1, v2, mxi V [u0; u1; v2; v3]}`);
1825  (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
1826  (REWRITE_WITH `affine hull {u1, v2, mxi V [u0; u1; v2; v3]} = 
1827                  affine hull {u1, EL 2 ul, mxi V ul}`);
1828  (ASM_REWRITE_TAC[EL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`; HD; TL]);
1829
1830  (REWRITE_WITH `v0 = u0:real^3`);
1831  (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);
1832  (ASM_REWRITE_TAC[HD]);
1833  (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);
1834  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
1835    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
1836  (ASM_MESON_TAC[]);
1837
1838  (REWRITE_WITH `v1 = u1:real^3`);
1839  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);
1840  (ASM_REWRITE_TAC[HD; TL]);
1841  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);
1842  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
1843    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
1844  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
1845  (ASM_REWRITE_TAC[]);
1846  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
1847  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1848
1849 (* ========================================================================= *)
1850
1851  (ABBREV_TAC `f2 = 
1852   (\ul. dist (u0:real^3, 
1853               closest_point (affine hull {u1, EL 2 ul, EL 3 ul}) u0))`);
1854
1855  (ABBREV_TAC `P2 = { (f2:(real^3)list->real) ul |ul | barV V 3 ul /\
1856                                  ~NULLSET (mcell 4 V ul INTER C) /\
1857                                   truncate_simplex 1 ul = [u0; u1]}`);
1858
1859  (NEW_GOAL `~(P2 = {}) ==> (?b:real. b IN P2 /\ (!x. x IN P2 ==> b <= x))`);
1860  (STRIP_TAC);
1861  (MATCH_MP_TAC INF_FINITE_LEMMA);
1862  (ASM_REWRITE_TAC[]);
1863  (EXPAND_TAC "P2");
1864  (ONCE_REWRITE_TAC [SET_RULE `{f x| x | P x} = {f x | x IN {y | P y}}`]);
1865  (ONCE_REWRITE_TAC [SET_RULE `{f x| x IN s} = {y | ?x. x IN s /\ y = f x}`]);
1866  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1867  (MATCH_MP_TAC FINITE_SUBSET);
1868  (EXISTS_TAC `{y | ?v0:real^3 v1 u2 u3.
1869                       v0 IN (V INTER ball (u0:real^3, &4)) /\
1870                       v1 IN (V INTER ball (u0, &4)) /\
1871                       u2 IN (V INTER ball (u0, &4)) /\
1872                       u3 IN (V INTER ball (u0, &4)) /\
1873                       y = [v0; v1; u2; u3]}`);
1874  (STRIP_TAC);
1875  (MATCH_MP_TAC FINITE_SET_LIST_LEMMA);
1876  (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
1877  (REWRITE_TAC[SUBSET] THEN ONCE_REWRITE_TAC[IN] THEN REWRITE_TAC[IN_ELIM_THM]);
1878  (REPEAT STRIP_TAC);
1879  (NEW_GOAL `?v0 v1 u2 u3. x = [v0; v1; u2; u3:real^3]`);
1880  (MATCH_MP_TAC BARV_3_EXPLICIT);
1881  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1882  (UP_ASM_TAC THEN STRIP_TAC);
1883  (EXISTS_TAC `v0:real^3` THEN EXISTS_TAC `v1:real^3` THEN     
1884    EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
1885  (ASM_REWRITE_TAC[]);
1886  (NEW_GOAL `v0 = u0:real^3`);
1887  (REWRITE_WITH `v0 = HD (x:(real^3)list)`);
1888  (ASM_REWRITE_TAC[HD]);
1889  (REWRITE_WITH `u0 = HD (truncate_simplex 1 (x:(real^3)list))`);
1890  (ASM_REWRITE_TAC[HD]);
1891  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1892  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
1893  (NEW_GOAL `set_of_list x SUBSET ball (u0:real^3,&4)`);
1894  (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
1895  (EXISTS_TAC `V:real^3->bool`);
1896  (ASM_REWRITE_TAC[set_of_list]);
1897  (SET_TAC[]);
1898  (NEW_GOAL `set_of_list x SUBSET V:real^3->bool`);
1899  (MATCH_MP_TAC Packing3.BARV_SUBSET);
1900  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
1901  (UP_ASM_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list]);
1902  (SET_TAC[]);
1903
1904  (ABBREV_TAC `r2 = (if (P2 = {}:real->bool) then &1 
1905                     else (@b. b IN P2 /\ (!x. x IN P2 ==> b <= x)))`);
1906
1907  (NEW_GOAL `&0 < r2`);
1908  (EXPAND_TAC "r2");
1909  (COND_CASES_TAC);
1910  (REAL_ARITH_TAC);
1911  (NEW_GOAL `?b:real. b IN P2 /\ (!x. x IN P2 ==> b <= x)`);
1912  (ASM_SIMP_TAC[]);
1913  (UP_ASM_TAC THEN STRIP_TAC);
1914  (ABBREV_TAC `P  = (\b:real. b IN P2 /\ (!x. x IN P2 ==> b <= x))`);
1915  (ABBREV_TAC `zz = (@) (P:real->bool)`);
1916  (NEW_GOAL `(P:real->bool) zz`);
1917  (EXPAND_TAC "zz");
1918  (MATCH_MP_TAC SELECT_AX);
1919  (EXISTS_TAC `b':real`);
1920  (EXPAND_TAC "P" THEN ASM_REWRITE_TAC[]);
1921  (UP_ASM_TAC THEN EXPAND_TAC "P" THEN REWRITE_TAC[]);
1922  (EXPAND_TAC "P2" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
1923  (REPEAT STRIP_TAC);
1924  (ASM_REWRITE_TAC[]);
1925  (EXPAND_TAC "f2");
1926  (MATCH_MP_TAC DIST_POS_LT);
1927  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1928  (REWRITE_WITH `closest_point (affine hull {u1, EL 2 ul, EL 3 ul}) u0 = u0
1929   <=> u0 IN (affine hull {u1:real^3, EL 2 ul, EL 3 ul})`);
1930  (MATCH_MP_TAC CLOSEST_POINT_REFL);
1931  (REWRITE_TAC[CLOSED_AFFINE_HULL]);
1932  (REWRITE_TAC[AFFINE_HULL_EQ_EMPTY] THEN SET_TAC[]);
1933  (STRIP_TAC);
1934  (UNDISCH_TAC `~NULLSET (mcell 4 V ul INTER C)`);
1935  (REWRITE_TAC[] THEN MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1936  (EXISTS_TAC `mcell 4 V ul`);
1937  (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);
1938  (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4]);
1939  (COND_CASES_TAC);
1940
1941  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);
1942  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
1943  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1944  (UP_ASM_TAC THEN STRIP_TAC);
1945  (ASM_REWRITE_TAC[set_of_list]);
1946
1947  (REWRITE_WITH `v0 = u0:real^3`);
1948  (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);
1949  (ASM_REWRITE_TAC[HD]);
1950  (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);
1951  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
1952    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
1953  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
1954
1955  (REWRITE_WITH `v1 = u1:real^3`);
1956  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);
1957  (ASM_REWRITE_TAC[HD; TL]);
1958  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);
1959  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
1960    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
1961  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
1962
1963  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1964  (EXISTS_TAC `affine hull {u0, u1, v2, v3:real^3}`);
1965  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
1966  (REWRITE_WITH `affine hull {u0, u1, v2, v3:real^3} = 
1967                  affine hull {u1, v2, v3}`);
1968  (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
1969  (REWRITE_WITH `affine hull {u1, v2, v3:real^3} = 
1970                  affine hull {u1, EL 2 ul, EL 3 ul}`);
1971  (ASM_REWRITE_TAC[EL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; HD; TL]);
1972  (ASM_REWRITE_TAC[]);
1973
1974  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
1975  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1976
1977 (* ========================================================================= *)
1978
1979  (ABBREV_TAC `r = min (&1) (min r1 r2)`);
1980  (NEW_GOAL `&0 < r`);
1981  (EXPAND_TAC "r");
1982  (UNDISCH_TAC `&0 < r1` THEN UNDISCH_TAC `&0  < r2` THEN REAL_ARITH_TAC);
1983
1984 (* ========================================================================= *)
1985
1986  (ABBREV_TAC `f3 = 
1987   (\ul. (((smallest_angle_line (EL 2 ul)  (mxi V ul) u0 u1) - u0)
1988    dot (u1 - u0)) / 
1989    (norm ((smallest_angle_line (EL 2 ul)  (mxi V ul) u0 u1) - u0)
1990    * norm (u1 - u0)))`);
1991
1992  (ABBREV_TAC `P3 = {(f3:(real^3)list->real) ul |ul | barV V 3 ul /\
1993                                  ~NULLSET (mcell 3 V ul INTER C) /\
1994                                   truncate_simplex 1 ul = [u0; u1]}`);
1995
1996  (NEW_GOAL `~(P3 = {}) ==> (?b:real. b IN P3 /\ (!x. x IN P3 ==> x <= b))`);
1997  (STRIP_TAC);
1998  (MATCH_MP_TAC SUP_FINITE_LEMMA);
1999  (ASM_REWRITE_TAC[]);
2000  (EXPAND_TAC "P3");
2001  (ONCE_REWRITE_TAC [SET_RULE `{f x| x | P x} = {f x | x IN {y | P y}}`]);
2002  (ONCE_REWRITE_TAC [SET_RULE `{f x| x IN s} = {y | ?x. x IN s /\ y = f x}`]);
2003  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
2004  (MATCH_MP_TAC FINITE_SUBSET);
2005  (EXISTS_TAC `{y | ?v0:real^3 v1 u2 u3.
2006                       v0 IN (V INTER ball (u0:real^3, &4)) /\
2007                       v1 IN (V INTER ball (u0, &4)) /\
2008                       u2 IN (V INTER ball (u0, &4)) /\
2009                       u3 IN (V INTER ball (u0, &4)) /\
2010                       y = [v0; v1; u2; u3]}`);
2011  (STRIP_TAC);
2012  (MATCH_MP_TAC FINITE_SET_LIST_LEMMA);
2013  (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
2014  (REWRITE_TAC[SUBSET] THEN ONCE_REWRITE_TAC[IN] THEN REWRITE_TAC[IN_ELIM_THM]);
2015  (REPEAT STRIP_TAC);
2016  (NEW_GOAL `?v0 v1 u2 u3. x = [v0; v1; u2; u3:real^3]`);
2017  (MATCH_MP_TAC BARV_3_EXPLICIT);
2018  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2019  (UP_ASM_TAC THEN STRIP_TAC);
2020  (EXISTS_TAC `v0:real^3` THEN EXISTS_TAC `v1:real^3` THEN     
2021    EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
2022  (ASM_REWRITE_TAC[]);
2023  (NEW_GOAL `v0 = u0:real^3`);
2024  (REWRITE_WITH `v0 = HD (x:(real^3)list)`);
2025  (ASM_REWRITE_TAC[HD]);
2026  (REWRITE_WITH `u0 = HD (truncate_simplex 1 (x:(real^3)list))`);
2027  (ASM_REWRITE_TAC[HD]);
2028  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2029  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
2030  (NEW_GOAL `set_of_list x SUBSET ball (u0:real^3,&4)`);
2031  (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
2032  (EXISTS_TAC `V:real^3->bool`);
2033  (ASM_REWRITE_TAC[set_of_list]);
2034  (SET_TAC[]);
2035  (NEW_GOAL `set_of_list x SUBSET V:real^3->bool`);
2036  (MATCH_MP_TAC Packing3.BARV_SUBSET);
2037  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
2038  (UP_ASM_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list]);
2039  (SET_TAC[]);
2040
2041  (ABBREV_TAC `d1 = (if (P3 = {}:real->bool) then c 
2042                     else (@b. b IN P3 /\ (!x. x IN P3 ==> x <= b)))`);
2043
2044  (NEW_GOAL `d1 < &1`);
2045  (EXPAND_TAC "d1");
2046  (COND_CASES_TAC);
2047  (ASM_REWRITE_TAC[]);
2048  (NEW_GOAL `?b:real. b IN P3 /\ (!x. x IN P3 ==> x <= b)`);
2049  (ASM_SIMP_TAC[]);
2050  (UP_ASM_TAC THEN STRIP_TAC);
2051  (ABBREV_TAC `P  = (\b:real. b IN P3 /\ (!x. x IN P3 ==> x <= b))`);
2052  (ABBREV_TAC `zz = (@) (P:real->bool)`);
2053  (NEW_GOAL `(P:real->bool) zz`);
2054  (EXPAND_TAC "zz");
2055  (MATCH_MP_TAC SELECT_AX);
2056  (EXISTS_TAC `b':real`);
2057  (EXPAND_TAC "P" THEN ASM_REWRITE_TAC[]);
2058  (UP_ASM_TAC THEN EXPAND_TAC "P" THEN REWRITE_TAC[]);
2059  (EXPAND_TAC "P3" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
2060  (REPEAT STRIP_TAC);
2061  (ASM_REWRITE_TAC[]);
2062  (EXPAND_TAC "f3");
2063
2064  (ABBREV_TAC `xx = smallest_angle_line (EL 2 ul) (mxi V ul) u0 u1`);
2065  (MATCH_MP_TAC REAL_DIV_LT_1_TACTICS);
2066  (STRIP_TAC);
2067  (MATCH_MP_TAC (REAL_ARITH `&0 <= a /\ ~(a = &0) ==> &0 < a`));
2068  (STRIP_TAC);
2069  (SIMP_TAC[REAL_LE_MUL; NORM_POS_LE]);
2070  (REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
2071  (ASM_REWRITE_TAC[]);
2072  (EXPAND_TAC "xx");
2073  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN 
2074    REWRITE_TAC[smallest_angle_line; smallest_angle_set]);
2075  (STRIP_TAC);
2076  (ABBREV_TAC `Q = (\x:real^3. x IN convex hull {EL 2 ul, mxi V ul} /\
2077            (!y. y IN convex hull {EL 2 ul, mxi V ul}
2078                 ==> ((y - u0) dot (u1 - u0)) /
2079                     (norm (y - u0) * norm (u1 - u0)) <=
2080                     ((x - u0) dot (u1 - u0)) /
2081                     (norm (x - u0) * norm (u1 - u0))))`);
2082  (NEW_GOAL `(Q:real^3->bool) u0`);
2083  (REWRITE_TAC[ASSUME `u0 = (@) (Q:real^3->bool)`]);
2084  (MATCH_MP_TAC SELECT_AX);
2085  (EXPAND_TAC "Q");
2086  (MATCH_MP_TAC SMALLEST_ANGLE_LINE_EXISTS);
2087  (STRIP_TAC);
2088  (ASM_REWRITE_TAC[]);
2089
2090  (NEW_GOAL `?v1 v2 v3. ul = [u0; v1; v2; v3:real^3]`);
2091  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
2092  (MATCH_MP_TAC BARV_3_EXPLICIT);
2093  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2094  (UP_ASM_TAC THEN STRIP_TAC);
2095  (EXISTS_TAC `v1:real^3` THEN     
2096    EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2097  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
2098
2099  (NEW_GOAL `v0 = u0:real^3`);
2100  (REWRITE_WITH `v0 = HD (ul:(real^3)list)`);
2101  (ASM_REWRITE_TAC[HD]);
2102  (REWRITE_WITH `u0 = HD (truncate_simplex 1 (ul:(real^3)list))`);
2103  (ASM_REWRITE_TAC[HD]);
2104  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2105  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
2106  (REWRITE_TAC[ASSUME `v0 = u0:real^3`]);
2107  (UP_ASM_TAC THEN STRIP_TAC);
2108  (REWRITE_WITH `EL 2 ul = v2:real^3`);
2109  (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);
2110  (STRIP_TAC);
2111
2112  (UNDISCH_TAC `~NULLSET (mcell 3 V ul INTER C)`);
2113  (REWRITE_TAC[]);
2114  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2115  (EXISTS_TAC `mcell 3 V ul` THEN STRIP_TAC);
2116  (REWRITE_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
2117    TRUNCATE_SIMPLEX_EXPLICIT_2; ASSUME `ul = [u0; v1; v2; v3:real^3]`;
2118    SET_RULE `{a,b,c} UNION {d} = {a,b, c,d}`]);
2119  (COND_CASES_TAC);
2120  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2121  (EXISTS_TAC `affine hull {u0, v1, v2, mxi V ul}`);
2122  (STRIP_TAC);
2123  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
2124  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
2125  (REWRITE_TAC[coplanar]);
2126  (UNDISCH_TAC `u0 IN convex hull {v2, mxi V ul}`);
2127  (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
2128  (EXISTS_TAC `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN 
2129    EXISTS_TAC `mxi V ul`);
2130  (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));
2131  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
2132  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2133  (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
2134  (STRIP_TAC);
2135  (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);
2136  (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
2137  (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2138  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
2139  (SET_TAC[]);
2140
2141  (UP_ASM_TAC THEN EXPAND_TAC "Q");
2142  (STRIP_TAC);
2143  (UNDISCH_TAC `~NULLSET (mcell 3 V ul INTER C)` THEN REWRITE_TAC[]);
2144  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2145  (EXISTS_TAC `mcell 3 V ul`);
2146  (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);
2147  (REWRITE_TAC[MCELL_EXPLICIT; mcell3]);
2148  (COND_CASES_TAC);
2149  (NEW_GOAL `?v2 v3. ul = [u0;u1;v2;v3:real^3]`);
2150  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);
2151  (MATCH_MP_TAC BARV_3_EXPLICIT);
2152  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2153  (UP_ASM_TAC THEN STRIP_TAC);
2154  (EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2155  (REWRITE_TAC[ASSUME `ul = [v0;v1;v2;v3:real^3]`]);
2156
2157  (REWRITE_WITH `v0 = u0:real^3`);
2158  (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);
2159  (ASM_REWRITE_TAC[HD]);
2160  (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);
2161  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
2162    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
2163  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2164
2165  (REWRITE_WITH `v1 = u1:real^3`);
2166  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);
2167  (ASM_REWRITE_TAC[HD; TL]);
2168  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);
2169  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
2170    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
2171  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2172  (UP_ASM_TAC THEN STRIP_TAC);
2173  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list; 
2174    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
2175  (REWRITE_TAC[GSYM (ASSUME `u0 = (@) (Q:real^3->bool)`)]);
2176
2177  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2178  (EXISTS_TAC `affine hull {u0, u1, v2, mxi V ul}`);
2179  (REWRITE_TAC[ASSUME `ul = [u0; u1; v2; v3:real^3]`;   
2180                CONVEX_HULL_SUBSET_AFFINE_HULL]);
2181  (REWRITE_WITH `affine hull {u0, u1, v2, mxi V [u0; u1; v2; v3]} = 
2182                  affine hull {u1, v2, mxi V [u0; u1; v2; v3]}`);
2183  (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
2184
2185  (NEW_GOAL `convex hull {EL 2 ul, mxi V ul} SUBSET 
2186              affine hull {EL 2 ul, mxi V ul}`);
2187  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2188  (NEW_GOAL `affine hull {EL 2 ul, mxi V ul} SUBSET 
2189              affine hull {u1, v2, mxi V [u0; u1; v2; v3]}`);
2190  (MATCH_MP_TAC AFFINE_SUBSET_KY_LEMMA);
2191  (ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);
2192  (SET_TAC[]);
2193  (UP_ASM_TAC THEN UP_ASM_TAC THEN 
2194    UNDISCH_TAC `u0 IN convex hull {EL 2 ul, mxi V ul}` THEN SET_TAC[]);
2195  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
2196  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
2197
2198  (MATCH_MP_TAC (REAL_ARITH `(a <= b) /\ ~(a = b) ==> a < b`));
2199  (REWRITE_TAC[NORM_CAUCHY_SCHWARZ; NORM_CAUCHY_SCHWARZ_EQ]);
2200  (NEW_GOAL `xx IN convex hull {(EL 2 ul) ,(mxi V ul)}`);
2201  (MATCH_MP_TAC SMALLEST_ANGLE_IN_CONVEX_HULL);
2202  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);
2203  (ASM_REWRITE_TAC[]);
2204
2205  (NEW_GOAL `?v1 v2 v3. ul = [u0; v1; v2; v3:real^3]`);
2206  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
2207  (MATCH_MP_TAC BARV_3_EXPLICIT);
2208  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2209  (UP_ASM_TAC THEN STRIP_TAC);
2210  (EXISTS_TAC `v1:real^3` THEN     
2211    EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2212  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
2213
2214  (NEW_GOAL `v0 = u0:real^3`);
2215  (REWRITE_WITH `v0 = HD (ul:(real^3)list)`);
2216  (ASM_REWRITE_TAC[HD]);
2217  (REWRITE_WITH `u0 = HD (truncate_simplex 1 (ul:(real^3)list))`);
2218  (ASM_REWRITE_TAC[HD]);
2219  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2220  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
2221  (REWRITE_TAC[ASSUME `v0 = u0:real^3`]);
2222  (UP_ASM_TAC THEN STRIP_TAC);
2223  (REWRITE_WITH `EL 2 ul = v2:real^3`);
2224  (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);
2225  (STRIP_TAC);
2226
2227  (UNDISCH_TAC `~NULLSET (mcell 3 V ul INTER C)`);
2228  (REWRITE_TAC[]);
2229  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2230  (EXISTS_TAC `mcell 3 V ul` THEN STRIP_TAC);
2231  (REWRITE_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
2232    TRUNCATE_SIMPLEX_EXPLICIT_2; ASSUME `ul = [u0; v1; v2; v3:real^3]`;
2233    SET_RULE `{a,b,c} UNION {d} = {a,b, c,d}`]);
2234  (COND_CASES_TAC);
2235  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2236  (EXISTS_TAC `affine hull {u0, v1, v2, mxi V ul}`);
2237  (STRIP_TAC);
2238  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
2239  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
2240  (REWRITE_TAC[coplanar]);
2241  (UNDISCH_TAC `u0 IN convex hull {v2, mxi V ul}`);
2242  (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
2243  (EXISTS_TAC `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN 
2244    EXISTS_TAC `mxi V ul`);
2245  (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));
2246  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
2247  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2248  (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
2249  (STRIP_TAC);
2250  (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);
2251  (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
2252  (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2253  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
2254  (SET_TAC[]);
2255
2256  (STRIP_TAC);
2257
2258  (UNDISCH_TAC `~NULLSET (mcell 3 V ul INTER C)` THEN REWRITE_TAC[]);
2259  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2260  (EXISTS_TAC `mcell 3 V ul`);
2261  (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);
2262  (REWRITE_TAC[MCELL_EXPLICIT; mcell3]);
2263  (COND_CASES_TAC);
2264  (NEW_GOAL `?v2 v3. ul = [u0;u1;v2;v3:real^3]`);
2265  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);
2266  (MATCH_MP_TAC BARV_3_EXPLICIT);
2267  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2268  (UP_ASM_TAC THEN STRIP_TAC);
2269  (EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2270  (ASM_REWRITE_TAC[]);
2271
2272  (REWRITE_WITH `v0 = u0:real^3`);
2273  (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);
2274  (ASM_REWRITE_TAC[HD]);
2275  (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);
2276  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
2277    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
2278  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2279
2280  (REWRITE_WITH `v1 = u1:real^3`);
2281  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);
2282  (ASM_REWRITE_TAC[HD; TL]);
2283  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);
2284  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
2285    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
2286  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2287  (UP_ASM_TAC THEN STRIP_TAC);
2288  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list; 
2289    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
2290
2291  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2292  (EXISTS_TAC `affine hull {u0, u1, v2, mxi V ul}`);
2293  (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2294  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
2295  (ABBREV_TAC `m = mxi V ul`);
2296  (NEW_GOAL `mxi V [u0; u1;v2;v3] = m`);
2297  (EXPAND_TAC "m" THEN AP_TERM_TAC THEN ASM_REWRITE_TAC[]);
2298  (ASM_REWRITE_TAC[]);
2299  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
2300  (ABBREV_TAC `k1 = norm (xx - u0:real^3)`);
2301  (ABBREV_TAC `k2 = norm (u1 - u0:real^3)`);
2302  (UNDISCH_TAC `xx IN convex hull {EL 2 ul, m:real^3}`);
2303  (ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `2 = SUC 1/\ 1 = SUC 0`; 
2304    CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
2305  (UNDISCH_TAC `k1 % (u1 - u0) = k2 % (xx - u0:real^3)`);
2306  (ASM_REWRITE_TAC[]);
2307
2308  (STRIP_TAC);
2309
2310  (REWRITE_TAC[coplanar]);
2311  (NEW_GOAL `~(k2 = &0)`);
2312  (EXPAND_TAC "k2");
2313  (REWRITE_TAC[NORM_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> b = a`]);
2314  (ASM_REWRITE_TAC[]);
2315
2316
2317  (ASM_CASES_TAC `~(v = &0)`);
2318  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3` THEN 
2319    EXISTS_TAC `v2:real^3`);
2320
2321  (MATCH_MP_TAC (SET_RULE `{a,b,c} SUBSET X /\ d IN X ==> {a,b,c,d} SUBSET X`));
2322  (STRIP_TAC);
2323  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
2324  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2325  (EXISTS_TAC `(k2 - k1:real) / (k2 * v)`);
2326  (EXISTS_TAC `k1 / (k2 * v)`);
2327  (EXISTS_TAC `(--k2 * u) / (k2 * v)`);
2328  (STRIP_TAC);
2329  (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);
2330  (REWRITE_WITH `k2 - k1 + k1 + --k2 * u = k2 * (u + v) - k1 + k1 + --k2 * u`);
2331  (ASM_REWRITE_TAC[ARITH_RULE `SUC 0 = 1`] THEN REAL_ARITH_TAC);
2332  (REWRITE_TAC[REAL_ARITH `k2 * (u + v) - k1 + k1 + --k2 * u = k2 * v`]);
2333  (MATCH_MP_TAC REAL_DIV_REFL);
2334  (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2335
2336  (REWRITE_TAC[VECTOR_ARITH `a / x % u0 + b / x % u1 + d / x % u2 = 
2337                             (&1 / x) % (a % u0 + b % u1 + d % u2)`]);
2338  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2339  (REWRITE_WITH
2340   `&1 / (k2 * v) % ((k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2) = m:real^3  <=> 
2341    ((k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2) = (k2 * v) % m`);
2342  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2343  (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);
2344  (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2345  (ASM_REWRITE_TAC[VECTOR_ARITH 
2346   `(k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2 = (k2 * v) % m <=> 
2347     k1 % (u1 - u0) = k2 % ((u % v2 + v % m) - u0)`]);
2348
2349  (NEW_GOAL `~(u = &0)`);
2350  (UP_ASM_TAC THEN UNDISCH_TAC `u + v = &(SUC 0):real` THEN  
2351    REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
2352  (REAL_ARITH_TAC);
2353
2354  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3` THEN 
2355    EXISTS_TAC `m:real^3`);
2356  (MATCH_MP_TAC (SET_RULE `{a,b,c} SUBSET X /\ d IN X ==> {a,b,d,c} SUBSET X`));
2357  (STRIP_TAC);
2358  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
2359  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2360
2361  (EXISTS_TAC `(k2 - k1:real) / (k2 * u)`);
2362  (EXISTS_TAC `k1 / (k2 * u)`);
2363  (EXISTS_TAC `(--k2 * v) / (k2 * u)`);
2364  (STRIP_TAC);
2365  (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);
2366  (REWRITE_WITH `k2 - k1 + k1 + --k2 * v = k2 * (u + v) - k1 + k1 + --k2 * v`);
2367  (ASM_REWRITE_TAC[ARITH_RULE `SUC 0 = 1`] THEN REAL_ARITH_TAC);
2368  (REWRITE_TAC[REAL_ARITH `k2 * (u + v) - k1 + k1 + --k2 * v = k2 * u`]);
2369  (MATCH_MP_TAC REAL_DIV_REFL);
2370  (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2371
2372  (REWRITE_TAC[VECTOR_ARITH `a / x % u0 + b / x % u1 + d / x % u2 = 
2373                             (&1 / x) % (a % u0 + b % u1 + d % u2)`]);
2374  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2375  (REWRITE_WITH
2376   `&1 / (k2 * u) % ((k2 - k1) % u0 + k1 % u1 + (--k2 * v) % m) = v2:real^3  <=> 
2377    ((k2 - k1) % u0 + k1 % u1 + (--k2 * v) % m) = (k2 * u) % v2`);
2378  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2379  (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);
2380  (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2381  (ASM_REWRITE_TAC[VECTOR_ARITH 
2382   `(k2 - k1) % u0 + k1 % u1 + (--k2 * v) % m = (k2 * u) % v2 <=> 
2383     k1 % (u1 - u0) = k2 % ((u % v2 + v % m) - u0)`]);
2384
2385  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
2386
2387 (* ========================================================================== *)
2388
2389  (ABBREV_TAC `f4 = 
2390   (\ul. (((smallest_angle_line (EL 2 ul)  (EL 3 ul) u0 u1) - u0)
2391    dot (u1 - u0)) / 
2392    (norm ((smallest_angle_line (EL 2 ul)  (EL 3 ul) u0 u1) - u0)
2393    * norm (u1 - u0)))`);
2394
2395  (ABBREV_TAC `P4 = {(f4:(real^3)list->real) ul |ul | barV V 3 ul /\
2396                                  ~NULLSET (mcell 4 V ul INTER C) /\
2397                                   truncate_simplex 1 ul = [u0; u1]}`);
2398
2399  (NEW_GOAL `~(P4 = {}) ==> (?b:real. b IN P4 /\ (!x. x IN P4 ==> x <= b))`);
2400  (STRIP_TAC);
2401  (MATCH_MP_TAC SUP_FINITE_LEMMA);
2402  (ASM_REWRITE_TAC[]);
2403  (EXPAND_TAC "P4");
2404  (ONCE_REWRITE_TAC [SET_RULE `{f x| x | P x} = {f x | x IN {y | P y}}`]);
2405  (ONCE_REWRITE_TAC [SET_RULE `{f x| x IN s} = {y | ?x. x IN s /\ y = f x}`]);
2406  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
2407  (MATCH_MP_TAC FINITE_SUBSET);
2408  (EXISTS_TAC `{y | ?v0:real^3 v1 u2 u3.
2409                       v0 IN (V INTER ball (u0:real^3, &4)) /\
2410                       v1 IN (V INTER ball (u0, &4)) /\
2411                       u2 IN (V INTER ball (u0, &4)) /\
2412                       u3 IN (V INTER ball (u0, &4)) /\
2413                       y = [v0; v1; u2; u3]}`);
2414  (STRIP_TAC);
2415  (MATCH_MP_TAC FINITE_SET_LIST_LEMMA);
2416  (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
2417  (REWRITE_TAC[SUBSET] THEN ONCE_REWRITE_TAC[IN] THEN REWRITE_TAC[IN_ELIM_THM]);
2418  (REPEAT STRIP_TAC);
2419  (NEW_GOAL `?v0 v1 u2 u3. x = [v0; v1; u2; u3:real^3]`);
2420  (MATCH_MP_TAC BARV_3_EXPLICIT);
2421  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2422  (UP_ASM_TAC THEN STRIP_TAC);
2423  (EXISTS_TAC `v0:real^3` THEN EXISTS_TAC `v1:real^3` THEN     
2424    EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
2425  (ASM_REWRITE_TAC[]);
2426  (NEW_GOAL `v0 = u0:real^3`);
2427  (REWRITE_WITH `v0 = HD (x:(real^3)list)`);
2428  (ASM_REWRITE_TAC[HD]);
2429  (REWRITE_WITH `u0 = HD (truncate_simplex 1 (x:(real^3)list))`);
2430  (ASM_REWRITE_TAC[HD]);
2431  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2432  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
2433  (NEW_GOAL `set_of_list x SUBSET ball (u0:real^3,&4)`);
2434  (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
2435  (EXISTS_TAC `V:real^3->bool`);
2436  (ASM_REWRITE_TAC[set_of_list]);
2437  (SET_TAC[]);
2438  (NEW_GOAL `set_of_list x SUBSET V:real^3->bool`);
2439  (MATCH_MP_TAC Packing3.BARV_SUBSET);
2440  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
2441  (UP_ASM_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list]);
2442  (SET_TAC[]);
2443
2444  (ABBREV_TAC `d2 = (if (P4 = {}:real->bool) then c 
2445                     else (@b. b IN P4 /\ (!x. x IN P4 ==> x <= b)))`);
2446  (NEW_GOAL `d2 < &1`);
2447  (EXPAND_TAC "d2");
2448  (COND_CASES_TAC);
2449  (ASM_REWRITE_TAC[]);
2450  (NEW_GOAL `?b:real. b IN P4 /\ (!x. x IN P4 ==> x <= b)`);
2451  (ASM_SIMP_TAC[]);
2452  (UP_ASM_TAC THEN STRIP_TAC);
2453  (ABBREV_TAC `P  = (\b:real. b IN P4 /\ (!x. x IN P4 ==> x <= b))`);
2454  (ABBREV_TAC `zz = (@) (P:real->bool)`);
2455  (NEW_GOAL `(P:real->bool) zz`);
2456  (EXPAND_TAC "zz");
2457  (MATCH_MP_TAC SELECT_AX);
2458  (EXISTS_TAC `b':real`);
2459  (EXPAND_TAC "P" THEN ASM_REWRITE_TAC[]);
2460  (UP_ASM_TAC THEN EXPAND_TAC "P" THEN REWRITE_TAC[]);
2461  (EXPAND_TAC "P4" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
2462  (REPEAT STRIP_TAC);
2463  (ASM_REWRITE_TAC[]);
2464  (EXPAND_TAC "f4");
2465
2466  (ABBREV_TAC `xx = smallest_angle_line (EL 2 ul) (EL 3 ul) u0 u1`);
2467  (MATCH_MP_TAC REAL_DIV_LT_1_TACTICS);
2468  (STRIP_TAC);
2469  (MATCH_MP_TAC (REAL_ARITH `&0 <= a /\ ~(a = &0) ==> &0 < a`));
2470  (STRIP_TAC);
2471  (SIMP_TAC[REAL_LE_MUL; NORM_POS_LE]);
2472  (REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
2473  (ASM_REWRITE_TAC[]);
2474  (EXPAND_TAC "xx");
2475  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN 
2476    REWRITE_TAC[smallest_angle_line; smallest_angle_set]);
2477  (STRIP_TAC);
2478  (ABBREV_TAC `Q = (\x:real^3. x IN convex hull {EL 2 ul, EL 3 ul} /\
2479            (!y. y IN convex hull {EL 2 ul, EL 3 ul}
2480                 ==> ((y - u0) dot (u1 - u0)) /
2481                     (norm (y - u0) * norm (u1 - u0)) <=
2482                     ((x - u0) dot (u1 - u0)) /
2483                     (norm (x - u0) * norm (u1 - u0))))`);
2484  (NEW_GOAL `(Q:real^3->bool) u0`);
2485  (ONCE_ASM_REWRITE_TAC[]);
2486  (MATCH_MP_TAC SELECT_AX);
2487  (EXPAND_TAC "Q");
2488
2489  (MATCH_MP_TAC SMALLEST_ANGLE_LINE_EXISTS);
2490  (STRIP_TAC);
2491  (ASM_REWRITE_TAC[]);
2492
2493  (NEW_GOAL `?v1 v2 v3. ul = [u0; v1; v2; v3:real^3]`);
2494  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
2495  (MATCH_MP_TAC BARV_3_EXPLICIT);
2496  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2497  (UP_ASM_TAC THEN STRIP_TAC);
2498  (EXISTS_TAC `v1:real^3` THEN     
2499    EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2500  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
2501
2502  (NEW_GOAL `v0 = u0:real^3`);
2503  (REWRITE_WITH `v0 = HD (ul:(real^3)list)`);
2504  (ASM_REWRITE_TAC[HD]);
2505  (REWRITE_WITH `u0 = HD (truncate_simplex 1 (ul:(real^3)list))`);
2506  (ASM_REWRITE_TAC[HD]);
2507  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2508  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
2509  (REWRITE_TAC[ASSUME `v0 = u0:real^3`]);
2510  (UP_ASM_TAC THEN STRIP_TAC);
2511  (REWRITE_WITH `EL 2 ul = v2:real^3 /\ EL 3 ul = v3`);
2512  (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `3 = SUC 2 /\2 = SUC 1 /\ 1 = SUC 0`]);
2513  (STRIP_TAC);
2514
2515  (UNDISCH_TAC `~NULLSET (mcell 4 V ul INTER C)`);
2516  (REWRITE_TAC[]);
2517  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2518  (EXISTS_TAC `mcell 4 V ul` THEN STRIP_TAC);
2519  (SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list;ARITH_RULE `4 >= 4`; 
2520    ASSUME `ul = [u0; v1; v2; v3:real^3]`]);
2521  (COND_CASES_TAC);
2522
2523  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2524  (EXISTS_TAC `affine hull {u0, v1, v2, v3:real^3}`);
2525  (STRIP_TAC);
2526  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
2527  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
2528  (REWRITE_TAC[coplanar]);
2529  (UNDISCH_TAC `u0 IN convex hull {v2, v3:real^3}`);
2530  (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
2531  (EXISTS_TAC `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN 
2532    EXISTS_TAC `v3:real^3`);
2533  (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));
2534  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
2535  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2536  (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
2537  (STRIP_TAC);
2538  (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);
2539  (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
2540  (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2541  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
2542  (SET_TAC[]);
2543
2544  (UP_ASM_TAC THEN EXPAND_TAC "Q");
2545  (STRIP_TAC);
2546  (UNDISCH_TAC `~NULLSET (mcell 4 V ul INTER C)` THEN REWRITE_TAC[]);
2547  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2548  (EXISTS_TAC `mcell 4 V ul`);
2549  (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);
2550  (SIMP_TAC[MCELL_EXPLICIT; mcell4; ARITH_RULE `4 >= 4`]);
2551  (COND_CASES_TAC);
2552  (NEW_GOAL `?v2 v3. ul = [u0;u1;v2;v3:real^3]`);
2553  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);
2554  (MATCH_MP_TAC BARV_3_EXPLICIT);
2555  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2556  (UP_ASM_TAC THEN STRIP_TAC);
2557  (EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2558  (ASM_REWRITE_TAC[]);
2559
2560  (REWRITE_WITH `v0 = u0:real^3`);
2561  (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);
2562  (ASM_REWRITE_TAC[HD]);
2563  (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);
2564  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
2565    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
2566  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2567
2568  (REWRITE_WITH `v1 = u1:real^3`);
2569  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);
2570  (ASM_REWRITE_TAC[HD; TL]);
2571  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);
2572  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
2573    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
2574  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2575  (ASM_REWRITE_TAC[]);
2576  (UP_ASM_TAC THEN STRIP_TAC);
2577
2578  (ASM_REWRITE_TAC[set_of_list]);
2579  (REWRITE_TAC[GSYM (ASSUME `u0 = (@) (Q:real^3->bool)`)]);
2580  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2581  (EXISTS_TAC `affine hull {u0, u1, v2, v3:real^3}`);
2582  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2583  (REWRITE_WITH `affine hull {u0, u1, v2, v3} = 
2584                  affine hull {u1, v2, v3:real^3}`);
2585  (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
2586
2587  (NEW_GOAL `convex hull {EL 2 ul, (EL 3 ul):real^3} SUBSET 
2588              affine hull {EL 2 ul, EL 3 ul}`);
2589  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2590  (NEW_GOAL `affine hull {EL 2 ul, (EL 3 ul):real^3} SUBSET 
2591              affine hull {u1, v2, v3}`);
2592  (MATCH_MP_TAC AFFINE_SUBSET_KY_LEMMA);
2593  (ASM_REWRITE_TAC[EL; HD; TL; 
2594    ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
2595  (SET_TAC[]);
2596  (UP_ASM_TAC THEN UP_ASM_TAC THEN 
2597    UNDISCH_TAC `u0 IN convex hull {EL 2 ul, (EL 3 ul):real^3}` THEN SET_TAC[]);
2598  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
2599  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
2600
2601  (MATCH_MP_TAC (REAL_ARITH `(a <= b) /\ ~(a = b) ==> a < b`));
2602  (REWRITE_TAC[NORM_CAUCHY_SCHWARZ; NORM_CAUCHY_SCHWARZ_EQ]);
2603  (NEW_GOAL `xx IN convex hull {(EL 2 ul) ,(EL 3 ul):real^3}`);
2604  (MATCH_MP_TAC SMALLEST_ANGLE_IN_CONVEX_HULL);
2605  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);
2606  (ASM_REWRITE_TAC[]);
2607
2608  (NEW_GOAL `?v1 v2 v3. ul = [u0; v1; v2; v3:real^3]`);
2609  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
2610  (MATCH_MP_TAC BARV_3_EXPLICIT);
2611  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2612  (UP_ASM_TAC THEN STRIP_TAC);
2613  (EXISTS_TAC `v1:real^3` THEN     
2614    EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2615  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
2616
2617  (NEW_GOAL `v0 = u0:real^3`);
2618  (REWRITE_WITH `v0 = HD (ul:(real^3)list)`);
2619  (ASM_REWRITE_TAC[HD]);
2620  (REWRITE_WITH `u0 = HD (truncate_simplex 1 (ul:(real^3)list))`);
2621  (ASM_REWRITE_TAC[HD]);
2622  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2623  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
2624  (REWRITE_TAC[ASSUME `v0 = u0:real^3`]);
2625  (UP_ASM_TAC THEN STRIP_TAC);
2626  (REWRITE_WITH `EL 2 ul = v2:real^3 /\ EL 3 ul = v3`);
2627  (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `3 = SUC 2 /\2 = SUC 1 /\ 1 = SUC 0`]);
2628  (STRIP_TAC);
2629
2630  (UNDISCH_TAC `~NULLSET (mcell 4 V ul INTER C)`);
2631  (REWRITE_TAC[]);
2632  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2633  (EXISTS_TAC `mcell 4 V ul` THEN STRIP_TAC);
2634  (SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list;ARITH_RULE `4 >= 4`; 
2635    ASSUME `ul = [u0; v1; v2; v3:real^3]`]);
2636  (COND_CASES_TAC);
2637
2638  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2639  (EXISTS_TAC `affine hull {u0, v1, v2, v3:real^3}`);
2640  (STRIP_TAC);
2641  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
2642  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
2643  (REWRITE_TAC[coplanar]);
2644  (UNDISCH_TAC `u0 IN convex hull {v2, v3:real^3}`);
2645  (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
2646  (EXISTS_TAC `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN 
2647    EXISTS_TAC `v3:real^3`);
2648  (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));
2649  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
2650  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2651  (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
2652  (STRIP_TAC);
2653  (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);
2654  (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
2655  (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2656  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
2657  (SET_TAC[]);
2658
2659  (STRIP_TAC);
2660
2661  (UNDISCH_TAC `~NULLSET (mcell 4 V ul INTER C)` THEN REWRITE_TAC[]);
2662  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2663  (EXISTS_TAC `mcell 4 V ul`);
2664  (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);
2665  (SIMP_TAC[MCELL_EXPLICIT; mcell4; ARITH_RULE `4 >= 4`]);
2666  (COND_CASES_TAC);
2667  (NEW_GOAL `?v2 v3. ul = [u0;u1;v2;v3:real^3]`);
2668  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);
2669  (MATCH_MP_TAC BARV_3_EXPLICIT);
2670  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2671  (UP_ASM_TAC THEN STRIP_TAC);
2672  (EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2673  (ASM_REWRITE_TAC[]);
2674
2675  (REWRITE_WITH `v0 = u0:real^3`);
2676  (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);
2677  (ASM_REWRITE_TAC[HD]);
2678  (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);
2679  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
2680    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
2681  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2682
2683  (REWRITE_WITH `v1 = u1:real^3`);
2684  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);
2685  (ASM_REWRITE_TAC[HD; TL]);
2686  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);
2687  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
2688    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
2689  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2690  (UP_ASM_TAC THEN STRIP_TAC);
2691  (ASM_REWRITE_TAC[set_of_list]);
2692
2693  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2694  (EXISTS_TAC `affine hull {u0, u1, v2, v3:real^3}`);
2695  (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2696  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
2697  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
2698  (ABBREV_TAC `k1 = norm (xx - u0:real^3)`);
2699  (ABBREV_TAC `k2 = norm (u1 - u0:real^3)`);
2700  (UNDISCH_TAC `xx IN convex hull {EL 2 ul,(EL 3 ul):real^3}`);
2701  (ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1/\ 1 = SUC 0`; 
2702    CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
2703  (UNDISCH_TAC `k1 % (u1 - u0) = k2 % (xx - u0:real^3)`);
2704  (ASM_REWRITE_TAC[]);
2705
2706  (STRIP_TAC);
2707
2708  (REWRITE_TAC[coplanar]);
2709  (NEW_GOAL `~(k2 = &0)`);
2710  (EXPAND_TAC "k2");
2711  (REWRITE_TAC[NORM_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> b = a`]);
2712  (ASM_REWRITE_TAC[]);
2713
2714  (ASM_CASES_TAC `~(v = &0)`);
2715  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3` THEN 
2716    EXISTS_TAC `v2:real^3`);
2717  (MATCH_MP_TAC (SET_RULE `{a,b,c} SUBSET X /\ d IN X ==> {a,b,c,d} SUBSET X`));
2718  (STRIP_TAC);
2719  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
2720  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2721  (EXISTS_TAC `(k2 - k1:real) / (k2 * v)`);
2722  (EXISTS_TAC `k1 / (k2 * v)`);
2723  (EXISTS_TAC `(--k2 * u) / (k2 * v)`);
2724  (STRIP_TAC);
2725  (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);
2726  (REWRITE_WITH `k2 - k1 + k1 + --k2 * u = k2 * (u + v) - k1 + k1 + --k2 * u`);
2727  (ASM_REWRITE_TAC[ARITH_RULE `SUC 0 = 1`] THEN REAL_ARITH_TAC);
2728  (REWRITE_TAC[REAL_ARITH `k2 * (u + v) - k1 + k1 + --k2 * u = k2 * v`]);
2729  (MATCH_MP_TAC REAL_DIV_REFL);
2730  (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2731
2732  (REWRITE_TAC[VECTOR_ARITH `a / x % u0 + b / x % u1 + d / x % u2 = 
2733                             (&1 / x) % (a % u0 + b % u1 + d % u2)`]);
2734  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2735  (REWRITE_WITH
2736   `&1 / (k2 * v) % ((k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2) = v3:real^3  <=> 
2737    ((k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2) = (k2 * v) % v3`);
2738  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2739  (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);
2740  (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2741  (ASM_REWRITE_TAC[VECTOR_ARITH 
2742   `(k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2 = (k2 * v) % v3 <=> 
2743     k1 % (u1 - u0) = k2 % ((u % v2 + v % v3) - u0)`]);
2744
2745  (NEW_GOAL `~(u = &0)`);
2746  (UP_ASM_TAC THEN UNDISCH_TAC `u + v = &(SUC 0):real` THEN  
2747    REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
2748  (REAL_ARITH_TAC);
2749
2750  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3` THEN 
2751    EXISTS_TAC `v3:real^3`);
2752  (MATCH_MP_TAC (SET_RULE `{a,b,c} SUBSET X /\ d IN X ==> {a,b,d,c} SUBSET X`));
2753  (STRIP_TAC);
2754  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
2755  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2756
2757  (EXISTS_TAC `(k2 - k1:real) / (k2 * u)`);
2758  (EXISTS_TAC `k1 / (k2 * u)`);
2759  (EXISTS_TAC `(--k2 * v) / (k2 * u)`);
2760  (STRIP_TAC);
2761  (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);
2762  (REWRITE_WITH `k2 - k1 + k1 + --k2 * v = k2 * (u + v) - k1 + k1 + --k2 * v`);
2763  (ASM_REWRITE_TAC[ARITH_RULE `SUC 0 = 1`] THEN REAL_ARITH_TAC);
2764  (REWRITE_TAC[REAL_ARITH `k2 * (u + v) - k1 + k1 + --k2 * v = k2 * u`]);
2765  (MATCH_MP_TAC REAL_DIV_REFL);
2766  (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2767
2768  (REWRITE_TAC[VECTOR_ARITH `a / x % u0 + b / x % u1 + d / x % u2 = 
2769                             (&1 / x) % (a % u0 + b % u1 + d % u2)`]);
2770  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2771  (REWRITE_WITH
2772   `&1 / (k2 * u) % ((k2 - k1) % u0 + k1 % u1 + (--k2 * v) % v3) = v2:real^3  <=> 
2773    ((k2 - k1) % u0 + k1 % u1 + (--k2 * v) % v3) = (k2 * u) % v2`);
2774  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2775  (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);
2776  (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2777  (ASM_REWRITE_TAC[VECTOR_ARITH 
2778   `(k2 - k1) % u0 + k1 % u1 + (--k2 * v) % m = (k2 * u) % v2 <=> 
2779     k1 % (u1 - u0) = k2 % ((u % v2 + v % m) - u0)`]);
2780  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
2781
2782 (* ========================================================================== *)
2783
2784  (ABBREV_TAC `d = max c (max d1 d2)`);
2785  (NEW_GOAL `d < &1`);
2786  (UNDISCH_TAC `d2 < &1` THEN UNDISCH_TAC `d1 < &1` THEN 
2787    UNDISCH_TAC `&0 < c /\ c < &1`);
2788  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
2789
2790 (* ========================================================================== *)
2791  (ABBREV_TAC `D = ball (u0:real^3,r) INTER rcone_gt u0 u1 d`);
2792  (NEW_GOAL `D SUBSET C:real^3->bool`);
2793  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
2794  (MATCH_MP_TAC (SET_RULE 
2795   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
2796  (STRIP_TAC);
2797  (MATCH_MP_TAC SUBSET_BALL);
2798  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
2799  (MATCH_MP_TAC RCONE_GT_SUBSET);
2800  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
2801
2802  (NEW_GOAL `!X. mcell_set V X /\ ~NULLSET (X INTER D)
2803           ==> (?k vl.
2804                    2 <= k /\
2805                    barV V 3 vl /\
2806                    X = mcell k V vl /\
2807                    truncate_simplex 1 vl = [u0; u1])`);
2808  (REPEAT STRIP_TAC);
2809  (FIRST_ASSUM MATCH_MP_TAC);
2810  (ASM_REWRITE_TAC[]);
2811  (STRIP_TAC);
2812  (UNDISCH_TAC `~NULLSET (X INTER D)`);
2813  (REWRITE_TAC[] THEN MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2814  (EXISTS_TAC `X INTER C:real^3->bool`);
2815  (ASM_REWRITE_TAC[] THEN UNDISCH_TAC `D SUBSET C:real^3->bool`);
2816  (SET_TAC[]);
2817
2818 (* ========================================================================= *)
2819
2820  (NEW_GOAL `D = conic_cap (u0:real^3) u1 r d`);
2821  (EXPAND_TAC "D" THEN REWRITE_TAC[conic_cap; NORMBALL_BALL]);
2822
2823  (NEW_GOAL `!X. mcell_set V X /\ ~NULLSET (X INTER D) ==>
2824    vol (X INTER D) = vol (D) * (dihX V X (u0,u1)) / (&2 * pi)`);
2825  (REPEAT STRIP_TAC);
2826  (NEW_GOAL `?k vl.
2827                    2 <= k /\
2828                    barV V 3 vl /\
2829                    X = mcell k V vl /\
2830                    truncate_simplex 1 vl = [u0; u1]`);
2831  (FIRST_ASSUM MATCH_MP_TAC);
2832  (ASM_REWRITE_TAC[]);
2833  (UP_ASM_TAC THEN REPEAT STRIP_TAC);
2834
2835 (* ========================================================================= *)
2836 (*  Case k = 2                                                               *)
2837 (* ========================================================================= *)
2838
2839  (ASM_CASES_TAC `k = 2`);
2840  (ABBREV_TAC `m = mxi V vl`);
2841  (ABBREV_TAC `s3 = omega_list_n V vl 3`);
2842  (ABBREV_TAC `L = aff_ge{u0, u1} {m, s3:real^3}`);
2843
2844  (REWRITE_WITH `vol (X INTER D) = vol (L INTER D)`);
2845  (AP_TERM_TAC);
2846  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2]);
2847  (LET_TAC);
2848  (COND_CASES_TAC);
2849  (NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);
2850  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
2851  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2852  (UP_ASM_TAC THEN STRIP_TAC);
2853
2854  (REWRITE_WITH `HD vl = u0 /\ HD (TL vl) = u1:real^3`);
2855  (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);
2856  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2857  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2858  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
2859  (ASM_REWRITE_TAC[HD; TL]);
2860  (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = u1:real^3`);
2861  (ASM_REWRITE_TAC[HD; TL]);
2862  (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = v1:real^3`);
2863  (REWRITE_TAC[ASSUME `vl = [v0; v1; v2; v3:real^3]`;  
2864    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
2865  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2866
2867  (EXPAND_TAC "L");
2868  (REWRITE_TAC [SET_RULE `(A INTER B INTER C) INTER D = C INTER D 
2869                        <=> (!x. x IN C INTER D ==> x IN A /\ x IN B)`]);
2870
2871  (REPEAT GEN_TAC THEN STRIP_TAC);
2872  (NEW_GOAL `x:real^3 IN D`);
2873  (UP_ASM_TAC THEN UNDISCH_TAC `D = conic_cap (u0:real^3) u1 r d`);
2874  (SET_TAC[]);
2875  (UP_ASM_TAC THEN EXPAND_TAC "D" THEN STRIP_TAC);
2876  (NEW_GOAL `x:real^3 IN rcone_gt u0 u1 a'`);
2877  (NEW_GOAL `rcone_gt (u0:real^3) u1 d SUBSET rcone_gt u0 u1 c`);
2878  (MATCH_MP_TAC RCONE_GT_SUBSET);
2879  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
2880  (UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC 
2881    `rcone_gt (u0:real^3) u1 c SUBSET W INTER rcone_gt u0 u1 a'`);
2882  (SET_TAC[]);
2883  (STRIP_TAC);
2884  (UP_ASM_TAC THEN SET_TAC[RCONE_GT_SUBSET_RCONE_GE]);
2885
2886 (* ========================================================================== *)
2887  (UP_ASM_TAC THEN REWRITE_TAC[rcone_ge; rconesgn; rcone_gt; IN; IN_ELIM_THM]);
2888  (STRIP_TAC);
2889
2890  (ABBREV_TAC `y = u0 + proj_point (u1 - u0:real^3) (x - u0)`);
2891  (NEW_GOAL `orthogonal (x - y) (u1 - u0:real^3)`);
2892  (REWRITE_WITH `x - y = (x - u0) - proj_point (u1 - u0) (x - u0:real^3)`);
2893  (EXPAND_TAC "y" THEN VECTOR_ARITH_TAC);
2894  (REWRITE_TAC[GSYM Marchal_cells_2_new.projection_proj_point]);
2895  (REWRITE_TAC[orthogonal; Packing3.PROJECTION_ORTHOGONAL]);
2896
2897  (NEW_GOAL `norm (x - u0) pow 2 = norm (y - u0) pow 2 + norm (x - y:real^3) pow 2`);
2898  (MATCH_MP_TAC PYTHAGORAS);
2899  (REWRITE_TAC[orthogonal]);
2900  (ONCE_REWRITE_TAC[VECTOR_ARITH `(a - b) dot c = --(c dot (b - a))`]);
2901  (REWRITE_WITH `y - u0 = proj_point (u1 - u0) (x - u0:real^3)`);
2902  (EXPAND_TAC "y" THEN REWRITE_TAC[VECTOR_ARITH `(a + b) - a:real^3 = b`]);
2903  (REWRITE_TAC[PRO_EXP; DOT_RMUL]);
2904  (UP_ASM_TAC THEN REWRITE_TAC[orthogonal] THEN STRIP_TAC);
2905  (ASM_REWRITE_TAC[]);
2906  (REAL_ARITH_TAC);
2907
2908  (NEW_GOAL `norm (x - u1) pow 2 = norm (y - u1) pow 2 + norm (x - y:real^3) pow 2`);
2909  (MATCH_MP_TAC PYTHAGORAS);
2910  (REWRITE_TAC[orthogonal]);
2911  (ONCE_REWRITE_TAC[VECTOR_ARITH `(a - b) dot c = c dot (a - b)`]);
2912  (REWRITE_WITH `u1 - y = (u1 - u0) - proj_point (u1 - u0) (x - u0:real^3)`);
2913  (EXPAND_TAC "y" THEN VECTOR_ARITH_TAC);
2914  (REWRITE_TAC[PRO_EXP; VECTOR_ARITH `x - a % x = (&1 - a) % x`]);
2915  (REWRITE_TAC[DOT_RMUL] THEN DEL_TAC);
2916  (UP_ASM_TAC THEN REWRITE_TAC[orthogonal] THEN STRIP_TAC);
2917  (ASM_REWRITE_TAC[]);
2918  (REAL_ARITH_TAC);
2919
2920  (MP_TAC (ASSUME `(x - u0:real^3) dot (u1 - u0) > 
2921                 dist (x,u0) * dist (u1,u0) * a'`));
2922  (REWRITE_WITH `(x - u0) dot (u1 - u0) = 
2923                  (x - y) dot (u1 - u0) + (y - u0) dot (u1 - u0:real^3)`);
2924  (VECTOR_ARITH_TAC);
2925  (REWRITE_WITH `(x - u1) dot (u0 - u1) = 
2926                  (x - y) dot (u0 - u1) + (y - u1) dot (u0 - u1:real^3)`);
2927  (VECTOR_ARITH_TAC);
2928  (REWRITE_WITH `(x - y) dot (u1 - u0:real^3) = &0`);
2929  (ASM_REWRITE_TAC[GSYM orthogonal]);
2930  (REWRITE_WITH `(x - y) dot (u0 - u1:real^3) = &0`);
2931  (ONCE_REWRITE_TAC[VECTOR_ARITH `a dot (u0 - u1) = --(a dot (u1 - u0))`]);
2932  (REWRITE_TAC[REAL_ARITH `--a = &0 <=> a = &0`]);
2933  (ASM_REWRITE_TAC[GSYM orthogonal]);
2934  (REWRITE_TAC[REAL_ARITH `&0 + a = a`]);
2935
2936  (STRIP_TAC);
2937  (NEW_GOAL `(y - u0) dot (u1 - u0) = norm (y - u0) * norm (u1 - u0:real^3)`);
2938  (REWRITE_TAC[NORM_CAUCHY_SCHWARZ_EQ]);
2939  (REWRITE_WITH `y - u0 = proj_point (u1 - u0) (x - u0:real^3)`);
2940  (EXPAND_TAC "y" THEN REWRITE_TAC[VECTOR_ARITH `(a + b) - a:real^3 = b`]);
2941  (REWRITE_TAC[PRO_EXP; NORM_MUL; VECTOR_MUL_ASSOC]);
2942  (MATCH_MP_TAC (MESON[] `a = b ==> a % x = b % x`));
2943  (REWRITE_TAC[REAL_ARITH `a * norm b = norm b * a`]);
2944  (MATCH_MP_TAC (MESON[] `a = b ==> x * a = x * b`));
2945  (REWRITE_TAC[REAL_ABS_REFL]);
2946  (MATCH_MP_TAC REAL_LE_DIV);
2947  (REWRITE_TAC[DOT_POS_LE]);
2948
2949  (REWRITE_WITH `(x - u0) dot (u1 - u0) = 
2950                  (x - y) dot (u1 - u0) + (y - u0) dot (u1 - u0:real^3)`);
2951  (VECTOR_ARITH_TAC);
2952  (REWRITE_WITH `(x - y) dot (u1 - u0:real^3) = &0`);
2953  (ASM_REWRITE_TAC[GSYM orthogonal]);
2954  (REWRITE_TAC[REAL_ARITH `&0 + a = a`]);
2955
2956  (NEW_GOAL `y IN convex hull {u0, u1:real^3}`);
2957  (NEW_GOAL `y IN affine hull {u0, u1:real^3}`);
2958  (REWRITE_TAC[AFFINE_HULL_2; IN; IN_ELIM_THM]);
2959  (EXPAND_TAC "y" THEN REWRITE_TAC[PRO_EXP]);
2960  (ABBREV_TAC `rtemp = ((x - u0) dot (u1 - u0)) / ((u1 - u0) dot (u1 - 
2961                 u0:real^3))`);
2962  (EXISTS_TAC `&1 - rtemp` THEN EXISTS_TAC `rtemp:real`);
2963  (STRIP_TAC);
2964  (REAL_ARITH_TAC);
2965  (VECTOR_ARITH_TAC);
2966  (UP_ASM_TAC THEN REWRITE_TAC[IN; AFFINE_HULL_2; CONVEX_HULL_2; IN_ELIM_THM]);
2967  (REPEAT STRIP_TAC);
2968  (EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
2969  (ASM_REWRITE_TAC[]);
2970
2971  (NEW_GOAL `y - u0 = v % (u1 - u0:real^3)`);
2972  (NEW_GOAL `y - u0 = y - (u + v) % u0:real^3`);
2973  (REWRITE_TAC[ASSUME `u + v = &1`; VECTOR_MUL_LID]);
2974  (UP_ASM_TAC THEN REWRITE_WITH `y - (u + v) % u0 = v % (u1 - u0:real^3)`);
2975  (REWRITE_TAC[ASSUME `y = u % u0 + v % u1:real^3`] THEN VECTOR_ARITH_TAC);
2976
2977  (ASM_CASES_TAC `u < &0`);
2978  (NEW_GOAL `F`);
2979  (NEW_GOAL `norm (y - u0) <= norm (x - u0:real^3)`);
2980  (MATCH_MP_TAC Tactics_jordan.REAL_POW_2_LE);
2981  (REWRITE_TAC[NORM_POS_LE; ASSUME 
2982   `norm (x - u0:real^3) pow 2 = norm (y - u0) pow 2 + norm (x - y) pow 2`; 
2983    REAL_ARITH `a <= a + b <=> &0 <= b`; REAL_LE_POW_2]);
2984  (NEW_GOAL `norm (x - u0:real^3) < &1`);
2985  (REWRITE_TAC[GSYM dist] THEN ONCE_REWRITE_TAC[DIST_SYM] THEN 
2986    REWRITE_TAC[GSYM IN_BALL]);
2987  (NEW_GOAL `ball (u0:real^3, r) SUBSET ball (u0, &1)`);
2988  (MATCH_MP_TAC SUBSET_BALL);
2989  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
2990  (UP_ASM_TAC THEN UNDISCH_TAC 
2991   `x IN ball (u0:real^3,r) INTER rcone_gt u0 u1 d` THEN SET_TAC[]);
2992
2993  (NEW_GOAL `norm (y - u0) = v * norm (u1:real^3 - u0)`);
2994  (ASM_REWRITE_TAC[NORM_MUL]);
2995
2996  (REWRITE_WITH `abs v = v`);
2997  (REWRITE_TAC[REAL_ABS_REFL]);
2998  (UNDISCH_TAC `u + v = &1` THEN UNDISCH_TAC `u < &0` THEN REAL_ARITH_TAC);
2999  (NEW_GOAL `&2 <= norm (u1 - u0:real^3)`);
3000  (REWRITE_TAC[GSYM dist]);
3001  (UNDISCH_TAC `packing (V:real^3->bool)` THEN REWRITE_TAC[packing]);
3002  (REPEAT STRIP_TAC);
3003  (FIRST_ASSUM MATCH_MP_TAC);
3004  (ASM_REWRITE_TAC[]);
3005  (ONCE_REWRITE_TAC[MESON[IN] `V x <=> x IN (V:real^3->bool)`]);
3006  (ASM_REWRITE_TAC[]);
3007
3008  (NEW_GOAL `v * &2 <= v * norm (u1 - u0:real^3)`);
3009  (REWRITE_TAC[REAL_ARITH `a * b <= a * c <=> &0 <= a * (c - b)`]);
3010  (MATCH_MP_TAC REAL_LE_MUL);
3011  (UNDISCH_TAC `u + v = &1` THEN UNDISCH_TAC `u < &0` THEN UP_ASM_TAC);
3012  (REAL_ARITH_TAC);
3013
3014  (NEW_GOAL `&1 < v`);
3015  (UNDISCH_TAC `u + v = &1` THEN UNDISCH_TAC `u < &0` THEN REAL_ARITH_TAC);
3016  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN 
3017    UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3018  (UP_ASM_TAC THEN MESON_TAC[]);
3019
3020  (ASM_CASES_TAC `v < &0`);
3021  (NEW_GOAL `F`);
3022  (NEW_GOAL `(y - u0) dot (u1 - u0:real^3) <= &0`);
3023  (ASM_REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);
3024  (MATCH_MP_TAC REAL_LE_MUL);
3025  (REWRITE_TAC[DOT_POS_LE]);
3026  (UP_ASM_TAC THEN REAL_ARITH_TAC);
3027
3028  (NEW_GOAL `&0 <= dist (x,u0) * dist (u1,u0:real^3) * a'`);
3029  (MATCH_MP_TAC REAL_LE_MUL);
3030  (REWRITE_TAC[DIST_POS_LE]);
3031  (MATCH_MP_TAC REAL_LE_MUL);
3032  (REWRITE_TAC[DIST_POS_LE]);
3033  (EXPAND_TAC "a'" THEN MATCH_MP_TAC REAL_LE_DIV);
3034  (STRIP_TAC);
3035  (REWRITE_TAC[HL_2]);
3036  (MATCH_MP_TAC REAL_LE_MUL);
3037  (REWRITE_TAC[DIST_POS_LE] THEN REAL_ARITH_TAC);
3038  (MATCH_MP_TAC SQRT_POS_LE THEN REAL_ARITH_TAC);
3039  (UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC 
3040  `(y - u0:real^3) dot (u1 - u0) > dist (x,u0) * dist (u1,u0) * a'`);
3041  (REAL_ARITH_TAC);
3042  (UP_ASM_TAC THEN MESON_TAC[]);
3043  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3044
3045  (NEW_GOAL `&0 <= dist (x,u0) * dist (u1,u0:real^3) * a'`);
3046  (MATCH_MP_TAC REAL_LE_MUL);
3047  (REWRITE_TAC[DIST_POS_LE]);
3048  (MATCH_MP_TAC REAL_LE_MUL);
3049  (REWRITE_TAC[DIST_POS_LE]);
3050  (EXPAND_TAC "a'" THEN MATCH_MP_TAC REAL_LE_DIV);
3051  (STRIP_TAC);
3052  (REWRITE_TAC[HL_2]);
3053  (MATCH_MP_TAC REAL_LE_MUL);
3054  (REWRITE_TAC[DIST_POS_LE] THEN REAL_ARITH_TAC);
3055  (MATCH_MP_TAC SQRT_POS_LE THEN REAL_ARITH_TAC);
3056  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3057
3058  (NEW_GOAL `(y - u1) dot (u0 - u1) = norm (y - u1) * norm (u0 - u1:real^3)`);
3059  (REWRITE_TAC[NORM_CAUCHY_SCHWARZ_EQ]);
3060  (REWRITE_WITH `y - u1 = proj_point (u1 - u0) (x - u0:real^3) - (u1 - u0)`);
3061  (EXPAND_TAC "y" THEN VECTOR_ARITH_TAC);
3062  (REWRITE_TAC[PRO_EXP; VECTOR_ARITH `x % a - a = (x - &1) % a`; NORM_MUL;
3063                VECTOR_MUL_ASSOC]);
3064  (REWRITE_WITH ` 
3065    (norm (u0 - u1) *
3066    (((x - u0) dot (u1 - u0)) / ((u1 - u0) dot (u1 - u0)) - &1)) % (u1 - u0) =  
3067    (norm (u0 - u1:real^3) *
3068    (&1 - ((x - u0) dot (u1 - u0)) / ((u1 - u0) dot (u1 - u0)))) % (u0 - u1)`);
3069  (VECTOR_ARITH_TAC);
3070  (MATCH_MP_TAC (MESON[] `a = b ==> a % x = b % x`));
3071  (REWRITE_TAC[REAL_ARITH `a * norm b = norm b * a`]);
3072  (REWRITE_TAC[NORM_ARITH `norm (a - b) = norm (b - a)`]);
3073  (MATCH_MP_TAC (MESON[] `a = b ==> x * a = x * b`));
3074  (REWRITE_TAC[REAL_ARITH `abs (x - &1) = abs (&1 - x)`]);
3075  (REWRITE_TAC[REAL_ABS_REFL; REAL_ARITH `&0 <= a - b <=> b <= a`]);
3076  (REWRITE_WITH `((x - u0) dot (u1 - u0)) / ((u1 - u0) dot (u1 - u0)) <= &1
3077   <=> ((x - u0) dot (u1 - u0)) <= &1 * ((u1 - u0) dot (u1 - u0:real^3))`);
3078  (MATCH_MP_TAC REAL_LE_LDIV_EQ);
3079  (REWRITE_TAC[DOT_POS_LT; VECTOR_ARITH `a - b = vec 0 <=> b = a`]);
3080  (ASM_REWRITE_TAC[]);
3081  (NEW_GOAL `(x - u0) dot (u1 - u0) <= norm (x - u0) * norm (u1 - u0:real^3)`);
3082  (REWRITE_TAC[NORM_CAUCHY_SCHWARZ]);
3083
3084  (NEW_GOAL `norm (x - u0) * norm (u1 - u0) <= &1 * norm (u1 - u0:real^3)`);
3085  (REWRITE_TAC[REAL_ARITH `a * x <= b * x <=> &0 <= (b - a) * x`]);
3086  (MATCH_MP_TAC REAL_LE_MUL);
3087  (REWRITE_TAC[NORM_POS_LE; REAL_ARITH `&0 <= a - b <=> b <= a`; GSYM dist]);
3088  (MATCH_MP_TAC (REAL_ARITH `a < x ==> a <= x`));
3089  (ONCE_REWRITE_TAC[DIST_SYM] THEN REWRITE_TAC[GSYM IN_BALL]);
3090  (NEW_GOAL `ball (u0:real^3, r) SUBSET ball (u0, &1)`);
3091  (MATCH_MP_TAC SUBSET_BALL);
3092  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
3093  (UP_ASM_TAC THEN UNDISCH_TAC 
3094   `x IN ball (u0:real^3,r) INTER rcone_gt u0 u1 d` THEN SET_TAC[]);
3095  (REWRITE_TAC[GSYM NORM_POW_2; REAL_ARITH `&1 * a pow 2 = a * a`]);
3096  (NEW_GOAL `&1 * norm (u1 - u0) <= norm (u1 - u0) * norm (u1 - u0:real^3)`);
3097  (REWRITE_TAC[REAL_ARITH `a * x <= b * x <=> &0 <= (b - a) * x`]);
3098  (MATCH_MP_TAC REAL_LE_MUL);
3099  (REWRITE_TAC[NORM_POS_LE; REAL_ARITH `&0 <= a - b <=> b <= a`; GSYM dist]);
3100  (MATCH_MP_TAC (REAL_ARITH `&2 <= x ==> &1 <= x`));
3101  (UNDISCH_TAC `packing (V:real^3->bool)` THEN REWRITE_TAC[packing]);
3102  (STRIP_TAC);
3103  (FIRST_ASSUM MATCH_MP_TAC);
3104  (ASM_REWRITE_TAC[]);
3105  (ONCE_REWRITE_TAC[MESON[IN] `V x <=> x IN (V:real^3->bool)`]);
3106  (ASM_REWRITE_TAC[]);
3107  (UNDISCH_TAC `(x - u0:real^3) dot (u1 - u0) <= 
3108                 norm (x - u0) * norm (u1 - u0)` THEN 
3109    UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3110  (ASM_REWRITE_TAC[dist]);
3111  (REWRITE_TAC[REAL_ARITH `a * b >= x * b * c <=> &0 <= b * (a - x * c)`]);
3112  (MATCH_MP_TAC REAL_LE_MUL);
3113  (REWRITE_TAC[NORM_POS_LE; REAL_ARITH `&0 <= a - b <=> b <= a`]);
3114  (MATCH_MP_TAC Tactics_jordan.REAL_POW_2_LE);
3115  (STRIP_TAC);
3116
3117  (MATCH_MP_TAC REAL_LE_MUL);
3118  (REWRITE_TAC[NORM_POS_LE]);
3119  (EXPAND_TAC "a'" THEN MATCH_MP_TAC REAL_LE_DIV);
3120  (STRIP_TAC);
3121  (REWRITE_TAC[HL_2]);
3122  (MATCH_MP_TAC REAL_LE_MUL);
3123  (REWRITE_TAC[DIST_POS_LE] THEN REAL_ARITH_TAC);
3124  (MATCH_MP_TAC SQRT_POS_LE THEN REAL_ARITH_TAC);
3125  (REWRITE_TAC[NORM_POS_LE; REAL_ARITH `(a * b) pow 2 = a pow 2 * b pow 2`]);
3126  (ASM_REWRITE_TAC[]);
3127  (REWRITE_TAC[REAL_ARITH `(a + b) * x <= a <=> b * x <= (&1 - x) * a`]);
3128
3129  (UNDISCH_TAC `(y - u0) dot (u1 - u0) > dist (x,u0) * dist (u1,u0:real^3) * a'`);
3130  (ASM_REWRITE_TAC[dist]);
3131  (REWRITE_TAC[REAL_ARITH `a * b > x * b * c <=> &0 < b * (a - x * c)`]);
3132  (REWRITE_TAC[REAL_MUL_POS_LT]);
3133  (REWRITE_WITH `~(norm (u1 - u0:real^3) < &0 /\ 
3134                    norm (y - u0) - norm (x - u0) * a' < &0)`);
3135  (NEW_GOAL `&0 <= norm (u1 - u0:real^3)`);
3136  (REWRITE_TAC[NORM_POS_LE]);
3137  (UP_ASM_TAC THEN REAL_ARITH_TAC);
3138  (REWRITE_TAC[REAL_ARITH `&0 < a - b <=> b < a`]);
3139  (REWRITE_WITH `norm (x - u0) * a' < norm (y - u0:real^3) <=> 
3140                 (norm (x - u0) * a') pow 2 < norm (y - u0) pow 2`);
3141  (MATCH_MP_TAC Pack1.bp_bdt);
3142  (STRIP_TAC);
3143  (MATCH_MP_TAC REAL_LE_MUL);
3144  (REWRITE_TAC[NORM_POS_LE]);
3145  (EXPAND_TAC "a'" THEN MATCH_MP_TAC REAL_LE_DIV);
3146  (STRIP_TAC);
3147  (REWRITE_TAC[HL_2]);
3148  (MATCH_MP_TAC REAL_LE_MUL);
3149  (REWRITE_TAC[DIST_POS_LE] THEN REAL_ARITH_TAC);
3150  (MATCH_MP_TAC SQRT_POS_LE THEN REAL_ARITH_TAC);
3151  (REWRITE_TAC[NORM_POS_LE]);
3152
3153  (ASM_REWRITE_TAC[REAL_ARITH `(a * b) pow 2 = a pow 2 * b pow 2`]);
3154  (REWRITE_TAC[REAL_ARITH `(a + b) * x < a <=> b * x < (&1 - x) * a`]);
3155  (STRIP_TAC);
3156  
3157  (NEW_GOAL `(&1 - a' pow 2) * norm (y - u0) pow 2 <= 
3158              (&1 - a' pow 2) * norm (y - u1:real^3) pow 2`);
3159  (REWRITE_TAC[REAL_ARITH `a * x <= a * y <=> &0 <= a * (y - x)`]);
3160  (MATCH_MP_TAC REAL_LE_MUL);
3161  (STRIP_TAC);
3162  (REWRITE_TAC[REAL_ARITH `&0 <= &1 - b <=> b <= &1 pow 2`]);
3163  (REWRITE_WITH `a' pow 2 <= &1 pow 2 <=> a' <= &1`);
3164  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3165  (MATCH_MP_TAC Collect_geom.POW2_COND);
3166  (REWRITE_TAC[REAL_ARITH `&0 <= &1`]);
3167  (EXPAND_TAC "a'" THEN MATCH_MP_TAC REAL_LE_DIV);
3168  (STRIP_TAC);
3169  (REWRITE_TAC[HL_2]);
3170  (MATCH_MP_TAC REAL_LE_MUL);
3171  (REWRITE_TAC[DIST_POS_LE] THEN REAL_ARITH_TAC);
3172  (MATCH_MP_TAC SQRT_POS_LE THEN REAL_ARITH_TAC);
3173
3174  (EXPAND_TAC "a'");
3175  (MATCH_MP_TAC REAL_DIV_LE_1_TACTICS);
3176  (ASM_SIMP_TAC[SQRT_POS_LT; REAL_ARITH `&0 < &2`]);
3177  (UNDISCH_TAC `hl [u0; u1:real^3] < sqrt (&2)` THEN REAL_ARITH_TAC);
3178  (NEW_GOAL `norm (x - u0) pow 2 <= norm (x - u1:real^3) pow 2`);
3179  (REWRITE_WITH `norm (x - u0) pow 2 <= norm (x - u1:real^3) pow 2 <=>
3180                  norm (x - u0)  <= norm (x - u1:real^3)`);
3181  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3182  (MATCH_MP_TAC Collect_geom.POW2_COND);
3183  (REWRITE_TAC[NORM_POS_LE]);
3184  (MATCH_MP_TAC (REAL_ARITH `&2 * x <= x + y ==> x <= y`));
3185  (REWRITE_TAC[GSYM dist]);
3186
3187  (NEW_GOAL `dist (x, u0:real^3) < &1`);
3188  (ONCE_REWRITE_TAC[DIST_SYM] THEN REWRITE_TAC[GSYM IN_BALL]);
3189  (NEW_GOAL `ball (u0:real^3, r) SUBSET ball (u0, &1)`);
3190  (MATCH_MP_TAC SUBSET_BALL);
3191  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
3192  (UP_ASM_TAC THEN UNDISCH_TAC 
3193   `x IN ball (u0:real^3,r) INTER rcone_gt u0 u1 d` THEN SET_TAC[]);
3194  (NEW_GOAL `&2 * dist (x, u0:real^3) < &2`);
3195  (UP_ASM_TAC THEN REAL_ARITH_TAC);
3196  (NEW_GOAL `&2 <= dist (x, u0) + dist (x, u1:real^3)`);
3197  (NEW_GOAL `&2 <= dist (u0, u1:real^3)`);
3198  (UNDISCH_TAC `packing (V:real^3->bool)` THEN REWRITE_TAC[packing]);
3199  (STRIP_TAC);
3200  (FIRST_ASSUM MATCH_MP_TAC);
3201  (ASM_REWRITE_TAC[]);
3202  (ONCE_REWRITE_TAC[MESON[IN] `V a <=> a:real^3 IN V`]);
3203  (ASM_REWRITE_TAC[]);
3204
3205  (NEW_GOAL `dist (u0, u1:real^3) <= dist (u0, x) + dist (x, u1)`);
3206  (REWRITE_TAC[DIST_TRIANGLE]);
3207  (UP_ASM_TAC THEN REWRITE_TAC[DIST_SYM]);
3208  (UP_ASM_TAC THEN REAL_ARITH_TAC);
3209  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3210  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
3211  (REAL_ARITH_TAC);
3212  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3213
3214  (NEW_GOAL `F`);
3215  (UNDISCH_TAC `~NULLSET (X INTER D)`);
3216  (REWRITE_TAC[]);
3217  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3218  (EXISTS_TAC `X INTER C:real^3->bool`);
3219  (ASM_SIMP_TAC [SET_RULE `A SUBSET B ==> X INTER A SUBSET X INTER B`]);
3220  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2; SET_RULE `{} INTER s = {}`]);
3221  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
3222  (UP_ASM_TAC THEN MESON_TAC[]);
3223
3224  (NEW_GOAL `~coplanar {u0, u1:real^3, m, s3}`);
3225  (ONCE_REWRITE_TAC[GSYM COPLANAR_AFFINE_HULL_COPLANAR]);
3226  (STRIP_TAC);
3227  (NEW_GOAL `NULLSET X`);
3228  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3229  (EXISTS_TAC `affine hull {u0, u1, m, s3:real^3}`);
3230  (STRIP_TAC);
3231  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
3232  (UP_ASM_TAC THEN MESON_TAC[]);
3233  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2]);
3234  (COND_CASES_TAC);
3235  (LET_TAC);
3236  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> M INTER N INTER A SUBSET B`));
3237
3238  (NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);
3239  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
3240  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3241  (UP_ASM_TAC THEN STRIP_TAC);
3242  (REWRITE_WITH `HD vl = u0 /\ HD (TL vl) = u1:real^3`);
3243  (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);
3244  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3245  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
3246  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
3247  (ASM_REWRITE_TAC[HD; TL]);
3248  (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = u1:real^3`);
3249  (ASM_REWRITE_TAC[HD; TL]);
3250  (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = v1:real^3`);
3251  (REWRITE_TAC[ASSUME `vl = [v0; v1; v2; v3:real^3]`;  
3252    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
3253  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
3254  (REWRITE_WITH `{u0, u1, m, s3} = {u0, u1} UNION {m:real^3, s3}`);
3255  (SET_TAC[]);
3256  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
3257  (SET_TAC[]);
3258  (UNDISCH_TAC `~NULLSET (X INTER D)`);
3259  (REWRITE_TAC[] THEN MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3260  (EXISTS_TAC `X:real^3->bool`);
3261  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
3262
3263 (* ========================================================================= *)
3264  (ASM_CASES_TAC `azim u0 u1 m (s3:real^3) < pi`);
3265  (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 m s3)`);
3266  (ASM_SIMP_TAC[WEDGE_LUNE]);
3267  (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d = 
3268                  conic_cap u0 u1 r d INTER L`);
3269  (SET_TAC[]);
3270  (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
3271  (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER 
3272    aff_gt {u0, u1} {m, s3} DIFF conic_cap u0 u1 r d INTER L = {}`);
3273  (EXPAND_TAC "L");
3274  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));
3275  (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);
3276  (REWRITE_TAC[SET_RULE `A UNION {} = A`]);
3277  (EXPAND_TAC "L");
3278
3279  (REWRITE_WITH `aff_ge {u0, u1:real^3} {m, s3} =
3280                  aff_gt {u0, u1} {m, s3} UNION 
3281    UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN  {m, s3}}`);
3282  (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);
3283  (REWRITE_TAC[Geomdetail.FINITE6]);
3284  (REWRITE_TAC[DISJOINT]);
3285
3286  (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
3287  (NEW_GOAL `F`);
3288  (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);
3289  (REWRITE_WITH `{u0, u1, m, s3} = {u0, u1, s3:real^3}`);
3290  (UP_ASM_TAC THEN SET_TAC[]);
3291  (REWRITE_TAC[COPLANAR_3]);
3292  (UP_ASM_TAC THEN MESON_TAC[]);
3293
3294  (ASM_CASES_TAC `s3 IN {u0, u1:real^3}`);
3295  (NEW_GOAL `F`);
3296  (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);
3297  (REWRITE_WITH `{u0, u1, m, s3} = {u0, u1, m:real^3}`);
3298  (UP_ASM_TAC THEN SET_TAC[]);
3299  (REWRITE_TAC[COPLANAR_3]);
3300  (UP_ASM_TAC THEN MESON_TAC[]);
3301  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
3302
3303  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3304  (EXISTS_TAC 
3305   `UNIONS {aff_ge {u0, u1:real^3} ({m, s3} DELETE a) | a | a IN {m, s3}}`);
3306  (STRIP_TAC);
3307  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3308  (EXISTS_TAC 
3309   `aff_ge {u0, u1:real^3} {m} UNION aff_ge {u0, u1:real^3} {s3}`);
3310  (STRIP_TAC);
3311  (MATCH_MP_TAC NEGLIGIBLE_UNION);
3312  (STRIP_TAC);
3313
3314  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3315  (EXISTS_TAC `affine hull {u0, u1:real^3, m}`);
3316  (STRIP_TAC);
3317  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
3318  (REWRITE_WITH `{u0,u1,m:real^3} = {u0,u1} UNION {m}`);
3319  (SET_TAC[]);
3320  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
3321  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3322  (EXISTS_TAC `affine hull {u0, u1:real^3, s3}`);
3323  (STRIP_TAC);
3324  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
3325  (REWRITE_WITH `{u0,u1,s3:real^3} = {u0,u1} UNION {s3}`);
3326  (SET_TAC[]);
3327  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
3328  (REWRITE_TAC[SET_RULE 
3329   `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} = 
3330          aff_ge {u0, u1} ({m, s3} DELETE s3) 
3331    UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);
3332  (MATCH_MP_TAC (SET_RULE 
3333   `A SUBSET B /\ C SUBSET D ==> A UNION C SUBSET B UNION D`));
3334  (STRIP_TAC);
3335  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
3336  (STRIP_TAC);
3337  (SET_TAC[]);
3338
3339  (REWRITE_TAC[DISJOINT]);
3340  (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
3341  (NEW_GOAL `F`);
3342  (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);
3343  (REWRITE_WITH `{u0, u1, m, s3} = {u0, u1, s3:real^3}`);
3344  (UP_ASM_TAC THEN SET_TAC[]);
3345  (REWRITE_TAC[COPLANAR_3]);
3346  (UP_ASM_TAC THEN MESON_TAC[]);
3347  (UP_ASM_TAC THEN SET_TAC[]);
3348
3349  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
3350  (STRIP_TAC);
3351  (SET_TAC[]);
3352  (REWRITE_TAC[DISJOINT]);
3353  (ASM_CASES_TAC `s3 IN {u0, u1:real^3}`);
3354  (NEW_GOAL `F`);
3355  (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);
3356  (REWRITE_WITH `{u0, u1, m, s3} = {u0, u1, m:real^3}`);
3357  (UP_ASM_TAC THEN SET_TAC[]);
3358  (REWRITE_TAC[COPLANAR_3]);
3359  (UP_ASM_TAC THEN MESON_TAC[]);
3360  (UP_ASM_TAC THEN SET_TAC[]);
3361
3362  (SET_TAC[]);
3363
3364  (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);
3365  (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 m s3) =
3366              (if &1 < d \/ r < &0
3367               then &0
3368               else azim u0 u1 m s3 / &3 * (&1 - max d (-- &1)) * r pow 3)`);
3369  (NEW_GOAL `~collinear {u0:real^3, u1, m} /\ ~collinear {u0, u1, s3}`);
3370  (STRIP_TAC);
3371  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3372  (EXISTS_TAC `s3:real^3`);
3373  (ASM_REWRITE_TAC[]);
3374  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3375  (EXISTS_TAC `m:real^3`);
3376  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
3377  (ASM_REWRITE_TAC[]);
3378
3379  (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);
3380  (COND_CASES_TAC);
3381  (NEW_GOAL `F`);
3382  (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN 
3383    UP_ASM_TAC THEN REAL_ARITH_TAC);
3384  (UP_ASM_TAC THEN MESON_TAC[]);
3385
3386  (REWRITE_WITH `azim (u0:real^3) u1 m s3 = dihV u0 u1 m s3`);
3387  (MATCH_MP_TAC AZIM_DIHV_SAME);
3388  (ASM_REWRITE_TAC[]);
3389  (STRIP_TAC);
3390  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3391  (EXISTS_TAC `s3:real^3`);
3392  (ASM_REWRITE_TAC[]);
3393  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3394  (EXISTS_TAC `m:real^3`);
3395  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
3396  (ASM_REWRITE_TAC[]);
3397
3398  (REWRITE_TAC[dihX]);
3399  (COND_CASES_TAC);
3400  (NEW_GOAL `F`);
3401  (UNDISCH_TAC `~NULLSET (X INTER D)`);
3402  (REWRITE_TAC[]);
3403  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3404  (EXISTS_TAC `X:real^3->bool`);
3405  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
3406  (UP_ASM_TAC THEN MESON_TAC[]);
3407
3408  (LET_TAC);
3409
3410  (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
3411  (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
3412            ul IN barV V 3 /\
3413            X = mcell k V ul /\
3414            initial_sublist [u0; u1] ul)`);
3415  (STRIP_TAC);
3416  (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
3417  (MATCH_MP_TAC SELECT_AX);
3418  (EXISTS_TAC `(2, vl:(real^3)list)`);
3419  (EXPAND_TAC "P");
3420  (REWRITE_TAC[BETA_THM]);
3421  (REWRITE_TAC[IN; ARITH_RULE `2 <= 4`] THEN ASM_REWRITE_TAC[]);
3422  (REWRITE_WITH `initial_sublist [u0;u1:real^3] vl /\ LENGTH [u0;u1] = 1 + 1`);
3423  (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
3424  (ASM_REWRITE_TAC[]);
3425
3426  (NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);
3427  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
3428  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3429  (UP_ASM_TAC THEN STRIP_TAC);
3430  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
3431  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
3432  (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);
3433
3434  (NEW_GOAL `k' = 2 /\ mcell k' V ul = mcell 2 V vl`);
3435  (MATCH_MP_TAC Ajripqn.AJRIPQN);
3436  (ASM_REWRITE_TAC[]);
3437  (REWRITE_WITH `mcell k' V ul INTER mcell 2 V vl = X`);
3438  (SET_TAC[ASSUME `X = mcell k' V ul`; 
3439                ASSUME `X = mcell k V vl`; ASSUME `k = 2`]);
3440  (REPEAT STRIP_TAC);
3441  (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE 
3442    `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);
3443  (SET_TAC[]);
3444  (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[]);
3445
3446  (COND_CASES_TAC);
3447  (REWRITE_TAC[dihu2]);
3448
3449  (REWRITE_WITH `omega_list_n V ul 3 = s3`);
3450  (EXPAND_TAC "s3");
3451  (NEW_GOAL `2  = 2 /\
3452              (!k. 2 - 1 <= k /\ k <= 3
3453                   ==> omega_list_n V ul k = omega_list_n V vl k)`);
3454  (MATCH_MP_TAC MCELL_ID_OMEGA_LIST_N);
3455  (ASM_REWRITE_TAC[SET_RULE `2 IN {2,3,4}`]);
3456  (REWRITE_TAC[GSYM (ASSUME `X = mcell k' V ul`); GSYM (ASSUME `k' = 2`)]);
3457  (ASM_REWRITE_TAC[]);
3458  (UP_ASM_TAC THEN STRIP_TAC);
3459
3460  (FIRST_ASSUM MATCH_MP_TAC);
3461  (ARITH_TAC);
3462
3463  (REWRITE_WITH `mxi V ul = m`);
3464  (EXPAND_TAC "m");
3465  (MATCH_MP_TAC MCELL_ID_MXI);
3466  (EXISTS_TAC `2` THEN EXISTS_TAC `2`);
3467  (ASM_REWRITE_TAC[SET_RULE `2 IN {2,3}`]);
3468  (STRIP_TAC);
3469
3470  (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);
3471  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3472  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
3473  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ 
3474                  CARD (set_of_list vl) = 3 + 1`);
3475  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3476  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3477  (ARITH_TAC);
3478  (ASM_REWRITE_TAC[HD]);
3479
3480  (REWRITE_WITH `(HD ul):real^3 = HD (truncate_simplex 1 ul)`);
3481  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3482  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
3483  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
3484                  CARD (set_of_list ul) = 3 + 1`);
3485  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3486  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3487  (ARITH_TAC);
3488
3489  (REWRITE_WITH `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
3490  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
3491  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
3492  (REWRITE_TAC[HD]);
3493  (REWRITE_TAC[GSYM (ASSUME `X = mcell k' V ul`); GSYM (ASSUME `k' = 2`)]);
3494  (ASM_REWRITE_TAC[]);
3495
3496  (NEW_GOAL `initial_sublist [u0; u1:real^3] ul /\ LENGTH [u0; u1] = 1 + 1`);
3497  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
3498  (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
3499  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
3500  (ASM_REWRITE_TAC[]);
3501
3502  (REWRITE_WITH `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);
3503  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3504  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
3505  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
3506                  CARD (set_of_list ul) = 3 + 1`);
3507  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3508  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3509  (ARITH_TAC);
3510
3511  (REWRITE_WITH `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);
3512  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3513  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
3514  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
3515                  CARD (set_of_list ul) = 3 + 1`);
3516  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3517  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3518  (ARITH_TAC);
3519  (ASM_REWRITE_TAC[EL; HD; ARITH_RULE `1 = SUC 0`; TL]);
3520  (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);
3521  (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);
3522  (AP_THM_TAC THEN AP_TERM_TAC);
3523
3524  (REWRITE_WITH 
3525   `measurable (conic_cap u0 u1 r d) /\
3526              vol (conic_cap u0 u1 r d) =
3527              (if u1 = u0 \/ &1 <= d \/ r < &0
3528               then &0
3529               else &2 / &3 * pi * (&1 - d) * r pow 3)`);
3530  (MATCH_MP_TAC VOLUME_CONIC_CAP);
3531  (EXPAND_TAC "d");
3532  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
3533  (COND_CASES_TAC);
3534  (NEW_GOAL `F`);
3535  (UP_ASM_TAC THEN STRIP_TAC);
3536  (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN MESON_TAC[]);
3537  (UNDISCH_TAC `d < &1` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3538  (UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3539  (UP_ASM_TAC THEN MESON_TAC[]);
3540  (REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
3541
3542  (REWRITE_WITH `max d (--(&1)) = d`);
3543  (MATCH_MP_TAC (REAL_ARITH `&0 < d /\ --(&1) < &0 ==> max d (--(&1)) = d`));
3544  (REWRITE_TAC[REAL_NEG_LT0]);
3545  (STRIP_TAC);
3546  (EXPAND_TAC "d");
3547  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
3548  (REAL_ARITH_TAC);
3549
3550  (REWRITE_WITH `
3551   (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *   
3552   ((&2 * pi) / (&2 * pi))`);
3553  (REAL_ARITH_TAC);
3554  (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);
3555  (MATCH_MP_TAC REAL_DIV_REFL);
3556  (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);
3557  (REAL_ARITH_TAC);
3558  (NEW_GOAL `F`);
3559  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
3560  (UP_ASM_TAC THEN MESON_TAC[]);
3561
3562 (* ========================================================================= *)
3563 (* OK here *)
3564
3565  (ASM_CASES_TAC `azim u0 u1 s3 (m:real^3) < pi`);
3566  (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);
3567  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
3568  (STRIP_TAC);
3569  (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 s3 m)`);
3570  (ASM_SIMP_TAC[WEDGE_LUNE]);
3571  (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d = 
3572                  conic_cap u0 u1 r d INTER L`);
3573  (SET_TAC[]);
3574  (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
3575
3576  (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER 
3577    aff_gt {u0, u1} {s3, m} DIFF conic_cap u0 u1 r d INTER L = {}`);
3578  (EXPAND_TAC "L");
3579  (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);
3580  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));
3581  (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);
3582  (REWRITE_TAC[SET_RULE `A UNION {} = A`]);
3583  (EXPAND_TAC "L");
3584  (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);
3585
3586  (REWRITE_WITH `aff_ge {u0, u1:real^3} {m, s3} =
3587                  aff_gt {u0, u1} {m, s3} UNION 
3588    UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN  {m, s3}}`);
3589  (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);
3590  (REWRITE_TAC[Geomdetail.FINITE6]);
3591  (REWRITE_TAC[DISJOINT]);
3592
3593  (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
3594  (NEW_GOAL `F`);
3595  (UNDISCH_TAC `~coplanar {u0, u1, s3, m:real^3}`);
3596  (REWRITE_WITH `{u0, u1, s3, m} = {u0, u1, s3:real^3}`);
3597  (UP_ASM_TAC THEN SET_TAC[]);
3598  (REWRITE_TAC[COPLANAR_3]);
3599  (UP_ASM_TAC THEN MESON_TAC[]);
3600
3601  (ASM_CASES_TAC `s3 IN {u0, u1:real^3}`);
3602  (NEW_GOAL `F`);
3603  (UNDISCH_TAC `~coplanar {u0, u1, s3, m:real^3}`);
3604  (REWRITE_WITH `{u0, u1, s3, m} = {u0, u1, m:real^3}`);
3605  (UP_ASM_TAC THEN SET_TAC[]);
3606  (REWRITE_TAC[COPLANAR_3]);
3607  (UP_ASM_TAC THEN MESON_TAC[]);
3608  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
3609
3610  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3611  (EXISTS_TAC 
3612   `UNIONS {aff_ge {u0, u1:real^3} ({m, s3} DELETE a) | a | a IN {m, s3}}`);
3613  (STRIP_TAC);
3614  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3615  (EXISTS_TAC 
3616   `aff_ge {u0, u1:real^3} {m} UNION aff_ge {u0, u1:real^3} {s3}`);
3617  (STRIP_TAC);
3618  (MATCH_MP_TAC NEGLIGIBLE_UNION);
3619  (STRIP_TAC);
3620
3621  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3622  (EXISTS_TAC `affine hull {u0, u1:real^3, m}`);
3623  (STRIP_TAC);
3624  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
3625  (REWRITE_WITH `{u0,u1,m:real^3} = {u0,u1} UNION {m}`);
3626  (SET_TAC[]);
3627  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
3628  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3629  (EXISTS_TAC `affine hull {u0, u1:real^3, s3}`);
3630  (STRIP_TAC);
3631  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
3632  (REWRITE_WITH `{u0,u1,s3:real^3} = {u0,u1} UNION {s3}`);
3633  (SET_TAC[]);
3634  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
3635  (REWRITE_TAC[SET_RULE 
3636   `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} = 
3637          aff_ge {u0, u1} ({m, s3} DELETE s3) 
3638    UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);
3639  (MATCH_MP_TAC (SET_RULE 
3640   `A SUBSET B /\ C SUBSET D ==> A UNION C SUBSET B UNION D`));
3641  (STRIP_TAC);
3642  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
3643  (STRIP_TAC);
3644  (SET_TAC[]);
3645
3646  (REWRITE_TAC[DISJOINT]);
3647  (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
3648  (NEW_GOAL `F`);
3649  (UNDISCH_TAC `~coplanar {u0, u1, s3, m:real^3}`);
3650  (REWRITE_WITH `{u0, u1, s3, m} = {u0, u1, s3:real^3}`);
3651  (UP_ASM_TAC THEN SET_TAC[]);
3652  (REWRITE_TAC[COPLANAR_3]);
3653  (UP_ASM_TAC THEN MESON_TAC[]);
3654  (UP_ASM_TAC THEN SET_TAC[]);
3655
3656  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
3657  (STRIP_TAC);
3658  (SET_TAC[]);
3659  (REWRITE_TAC[DISJOINT]);
3660  (ASM_CASES_TAC `s3 IN {u0, u1:real^3}`);
3661  (NEW_GOAL `F`);
3662  (UNDISCH_TAC `~coplanar {u0, u1, s3, m:real^3}`);
3663  (REWRITE_WITH `{u0, u1, s3, m} = {u0, u1, m:real^3}`);
3664  (UP_ASM_TAC THEN SET_TAC[]);
3665  (REWRITE_TAC[COPLANAR_3]);
3666  (UP_ASM_TAC THEN MESON_TAC[]);
3667  (UP_ASM_TAC THEN SET_TAC[]);
3668
3669  (SET_TAC[]);
3670
3671  (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);
3672  (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 s3 m) =
3673              (if &1 < d \/ r < &0
3674               then &0
3675               else azim u0 u1 s3 m / &3 * (&1 - max d (-- &1)) * r pow 3)`);
3676  (NEW_GOAL `~collinear {u0:real^3, u1, m} /\ ~collinear {u0, u1, s3}`);
3677  (STRIP_TAC);
3678  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3679  (EXISTS_TAC `s3:real^3`);
3680  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
3681  (ASM_REWRITE_TAC[]);
3682  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3683  (EXISTS_TAC `m:real^3`);
3684  (ASM_REWRITE_TAC[]);
3685
3686  (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);
3687  (COND_CASES_TAC);
3688  (NEW_GOAL `F`);
3689
3690  (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN 
3691    UP_ASM_TAC THEN REAL_ARITH_TAC);
3692  (UP_ASM_TAC THEN MESON_TAC[]);
3693
3694  (REWRITE_WITH `azim (u0:real^3) u1 s3 m = dihV u0 u1 s3 m`);
3695  (MATCH_MP_TAC AZIM_DIHV_SAME);
3696  (ASM_REWRITE_TAC[]);
3697  (STRIP_TAC);
3698
3699  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3700  (EXISTS_TAC `m:real^3`);
3701  (ASM_REWRITE_TAC[]);
3702  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3703  (EXISTS_TAC `s3:real^3`);
3704  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
3705  (ASM_REWRITE_TAC[]);
3706
3707  (REWRITE_TAC[dihX]);
3708  (COND_CASES_TAC);
3709  (NEW_GOAL `F`);
3710  (UNDISCH_TAC `~NULLSET (X INTER D)`);
3711  (REWRITE_TAC[]);
3712  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3713  (EXISTS_TAC `X:real^3->bool`);
3714  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
3715  (UP_ASM_TAC THEN MESON_TAC[]);
3716
3717  (LET_TAC);
3718
3719  (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
3720  (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
3721            ul IN barV V 3 /\
3722            X = mcell k V ul /\
3723            initial_sublist [u0; u1] ul)`);
3724  (STRIP_TAC);
3725  (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
3726  (MATCH_MP_TAC SELECT_AX);
3727  (EXISTS_TAC `(2, vl:(real^3)list)`);
3728  (EXPAND_TAC "P");
3729  (REWRITE_TAC[BETA_THM]);
3730  (REWRITE_TAC[IN; ARITH_RULE `2 <= 4`] THEN ASM_REWRITE_TAC[]);
3731  (REWRITE_WITH `initial_sublist [u0;u1:real^3] vl /\ LENGTH [u0;u1] = 1 + 1`);
3732  (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
3733  (ASM_REWRITE_TAC[]);
3734
3735  (NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);
3736  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
3737  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3738  (UP_ASM_TAC THEN STRIP_TAC);
3739  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
3740  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
3741  (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);
3742
3743  (NEW_GOAL `k' = 2 /\ mcell k' V ul = mcell 2 V vl`);
3744  (MATCH_MP_TAC Ajripqn.AJRIPQN);
3745  (ASM_REWRITE_TAC[]);
3746  (REWRITE_WITH `mcell k' V ul INTER mcell 2 V vl = X`);
3747  (REWRITE_TAC[ASSUME `X = mcell k V vl`; GSYM (ASSUME `X = mcell k' V ul`);
3748    ASSUME `k = 2`]);
3749  (SET_TAC[]);
3750  (REPEAT STRIP_TAC);
3751  (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE 
3752    `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);
3753  (SET_TAC[]);
3754  (UNDISCH_TAC `~NULLSET X` THEN UP_ASM_TAC THEN MESON_TAC[]);
3755
3756  (COND_CASES_TAC);
3757  (REWRITE_TAC[dihu2]);
3758  (REWRITE_WITH `omega_list_n V ul 3 = s3`);
3759  (EXPAND_TAC "s3");
3760  (NEW_GOAL `2  = 2 /\
3761              (!k. 2 - 1 <= k /\ k <= 3
3762                   ==> omega_list_n V ul k = omega_list_n V vl k)`);
3763  (MATCH_MP_TAC MCELL_ID_OMEGA_LIST_N);
3764  (ASM_REWRITE_TAC[SET_RULE `2 IN {2,3,4}`]);
3765  (STRIP_TAC);
3766  (MESON_TAC[ASSUME `X = mcell k V vl`; ASSUME `X = mcell k' V ul`;
3767    ASSUME `k = 2`; ASSUME `k' = 2`]);
3768  (REWRITE_WITH `mcell 2 V ul = X`);
3769  (MESON_TAC[ASSUME `X = mcell k' V ul`; ASSUME `k' = 2`]);
3770  (ASM_REWRITE_TAC[]);
3771  (UP_ASM_TAC THEN STRIP_TAC);
3772  (FIRST_ASSUM MATCH_MP_TAC);
3773  (ARITH_TAC);
3774
3775  (REWRITE_WITH `mxi V ul = m`);
3776  (EXPAND_TAC "m");
3777  (MATCH_MP_TAC MCELL_ID_MXI);
3778  (EXISTS_TAC `2` THEN EXISTS_TAC `2`);
3779  (ASM_REWRITE_TAC[SET_RULE `2 IN {2,3}`]);
3780  (STRIP_TAC);
3781
3782  (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);
3783  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3784  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
3785  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ 
3786                  CARD (set_of_list vl) = 3 + 1`);
3787  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3788  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3789  (ARITH_TAC);
3790  (ASM_REWRITE_TAC[HD]);
3791
3792  (REWRITE_WITH `(HD ul):real^3 = HD (truncate_simplex 1 ul)`);
3793  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3794  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
3795  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
3796                  CARD (set_of_list ul) = 3 + 1`);
3797  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3798  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3799  (ARITH_TAC);
3800
3801  (REWRITE_WITH `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
3802  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
3803  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
3804  (REWRITE_TAC[HD]);
3805
3806  (STRIP_TAC);
3807  (MESON_TAC[ASSUME `X = mcell k V vl`; ASSUME `X = mcell k' V ul`;
3808    ASSUME `k = 2`; ASSUME `k' = 2`]);
3809  (REWRITE_WITH `mcell 2 V ul = X`);
3810  (MESON_TAC[ASSUME `X = mcell k' V ul`; ASSUME `k' = 2`]);
3811  (ASM_REWRITE_TAC[]);
3812
3813  (NEW_GOAL `initial_sublist [u0; u1:real^3] ul /\ LENGTH [u0; u1] = 1 + 1`);
3814  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
3815  (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
3816  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
3817  (ASM_REWRITE_TAC[]);
3818
3819  (REWRITE_WITH `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);
3820  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3821  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
3822  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
3823                  CARD (set_of_list ul) = 3 + 1`);
3824  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3825  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3826  (ARITH_TAC);
3827
3828  (REWRITE_WITH `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);
3829  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3830  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
3831  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
3832                  CARD (set_of_list ul) = 3 + 1`);
3833  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3834  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3835  (ARITH_TAC);
3836  (ASM_REWRITE_TAC[EL; HD; ARITH_RULE `1 = SUC 0`; TL]);
3837  (REWRITE_TAC[DIHV_SYM_2]);
3838  (REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
3839
3840  (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);
3841  (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);
3842  (AP_THM_TAC THEN AP_TERM_TAC);
3843  (REWRITE_WITH 
3844   `measurable (conic_cap u0 u1 r d) /\
3845              vol (conic_cap u0 u1 r d) =
3846              (if u1 = u0 \/ &1 <= d \/ r < &0
3847               then &0
3848               else &2 / &3 * pi * (&1 - d) * r pow 3)`);
3849  (MATCH_MP_TAC VOLUME_CONIC_CAP);
3850  (EXPAND_TAC "d");
3851  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
3852  (COND_CASES_TAC);
3853  (NEW_GOAL `F`);
3854  (UP_ASM_TAC THEN STRIP_TAC);
3855  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
3856
3857  (UP_ASM_TAC THEN UNDISCH_TAC `d < &1` THEN REAL_ARITH_TAC);
3858  (UP_ASM_TAC THEN UNDISCH_TAC `&0 < r` THEN REAL_ARITH_TAC);
3859  (UP_ASM_TAC THEN MESON_TAC[]);
3860
3861  (REWRITE_WITH `max d (--(&1)) = d`);
3862  (MATCH_MP_TAC (REAL_ARITH `&0 < d ==> max d (--(&1)) = d`));
3863  (EXPAND_TAC "d");
3864  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
3865  (REWRITE_WITH `
3866   (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *   
3867   ((&2 * pi) / (&2 * pi))`);
3868  (REAL_ARITH_TAC);
3869  (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);
3870  (MATCH_MP_TAC REAL_DIV_REFL);
3871  (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);
3872  (REAL_ARITH_TAC);
3873  (NEW_GOAL `F`);
3874  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
3875  (UP_ASM_TAC THEN MESON_TAC[]);
3876
3877 (* ========================================================================== *)
3878
3879  (NEW_GOAL `F`);
3880  (NEW_GOAL `azim (u0:real^3) u1 s3 m = 
3881   (if azim u0 u1 m s3 = &0 then &0 else &2 * pi - azim u0 u1 m s3)`);
3882  (MATCH_MP_TAC AZIM_COMPL);
3883  (STRIP_TAC);
3884
3885  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3886  (EXISTS_TAC `s3:real^3`);
3887  (ASM_REWRITE_TAC[]);
3888  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3889  (EXISTS_TAC `m:real^3`);
3890  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b, d, c}`]);
3891  (ASM_REWRITE_TAC[]);
3892  (UP_ASM_TAC THEN COND_CASES_TAC);
3893  (NEW_GOAL `F`);
3894  (NEW_GOAL `(&0 < pi)`);
3895  (REWRITE_TAC[PI_POS]);
3896  (UNDISCH_TAC `~(azim (u0:real^3) u1 m s3 < pi)`);
3897  (ASM_REWRITE_TAC[]);
3898  (UP_ASM_TAC THEN MESON_TAC[]);
3899  (STRIP_TAC);
3900
3901  (NEW_GOAL `azim (u0:real^3) u1 m s3 = pi`);
3902  (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3903  (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);
3904  (REWRITE_TAC[] THEN MATCH_MP_TAC AZIM_EQ_0_PI_IMP_COPLANAR);
3905  (ASM_REWRITE_TAC[]);
3906  (UP_ASM_TAC THEN MESON_TAC[]);
3907
3908
3909 (* ========================================================================= *)
3910 (*  Case k >= 4                                                              *)
3911 (* ========================================================================= *)
3912
3913  (ASM_CASES_TAC `k >= 4`);
3914  (NEW_GOAL `?u2 u3. vl = [u0; u1;u2;u3:real^3]`);
3915  (NEW_GOAL `?v0 v1 u2 u3. vl = [v0; v1;u2;u3:real^3]`);
3916  (MATCH_MP_TAC BARV_3_EXPLICIT);
3917  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3918  (UP_ASM_TAC THEN STRIP_TAC);
3919  (EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
3920
3921  (REWRITE_WITH `u0 = v0:real^3`);
3922  (REWRITE_WITH `v0:real^3 = HD (truncate_simplex 1 vl)`);
3923  (REWRITE_TAC[ASSUME `vl = [v0;v1;u2;u3:real^3]`; 
3924    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
3925  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
3926
3927  (REWRITE_WITH `u1 = v1:real^3`);
3928  (REWRITE_WITH `v1:real^3 = HD (TL (truncate_simplex 1 vl))`);
3929  (REWRITE_TAC[ASSUME `vl = [v0;v1;u2;u3:real^3]`; 
3930    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
3931  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
3932  (ASM_REWRITE_TAC[]);
3933  (UP_ASM_TAC THEN STRIP_TAC);
3934
3935  (ABBREV_TAC `L = aff_ge{u0, u1} {u2, u3:real^3}`);
3936
3937  (REWRITE_WITH `vol (X INTER D) = vol (L INTER D)`);
3938  (AP_TERM_TAC);
3939  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4; ARITH_RULE `4 >= 4`;set_of_list]);
3940  (COND_CASES_TAC);
3941
3942  (EXPAND_TAC "L");
3943  (REWRITE_TAC[SET_RULE `A = B <=> A SUBSET B /\ B SUBSET A`]);
3944  (STRIP_TAC);
3945  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> A INTER X SUBSET B INTER X`));
3946  (REWRITE_TAC[Marchal_cells_2_new.CONVEX_HULL_4_SUBSET_AFF_GE_2_2]);
3947  (MATCH_MP_TAC (SET_RULE `(!x. x IN A /\ x IN B ==> x IN C) ==>
3948                             A INTER B SUBSET C INTER B`));
3949  (NEW_GOAL `DISJOINT {u0,u1:real^3} {u2, u3}`);
3950  (REWRITE_TAC[DISJOINT]);
3951  (MATCH_MP_TAC (MESON[] `(~A:bool ==> F) ==> A`));
3952  (STRIP_TAC);
3953  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
3954  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3955  (EXISTS_TAC `X:real^3->bool` THEN REWRITE_TAC[SET_RULE `A INTER X SUBSET A`]);
3956  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list]);
3957  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3958  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
3959  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
3960  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
3961  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
3962  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
3963  (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u3:real^3}`);
3964  (UP_ASM_TAC THEN SET_TAC[]);
3965  (REWRITE_TAC[COPLANAR_3]);
3966  (NEW_GOAL `u3 IN {u0, u1:real^3}`);
3967  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
3968  (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u2:real^3}`);
3969  (UP_ASM_TAC THEN SET_TAC[]);
3970  (REWRITE_TAC[COPLANAR_3]);
3971
3972  (SIMP_TAC[ASSUME `DISJOINT {u0, u1} {u2, u3:real^3}`; AFF_GE_2_2]);
3973  (REWRITE_TAC[CONVEX_HULL_4; IN; IN_ELIM_THM]);
3974  (REPEAT STRIP_TAC);
3975  (EXISTS_TAC `t1:real` THEN EXISTS_TAC `t2:real` THEN 
3976    EXISTS_TAC `t3:real` THEN EXISTS_TAC `t4:real`);
3977  (ASM_REWRITE_TAC[]);
3978  (STRIP_TAC);
3979
3980  (REWRITE_TAC[REAL_ARITH `&0 <= a <=> (a < &0 ==> F)`]);
3981  (STRIP_TAC);
3982  (UNDISCH_TAC `conic_cap (u0:real^3) u1 r d x`);
3983  (REWRITE_TAC[MESON[IN] `conic_cap u0 u1 r d x <=> x IN conic_cap u0 u1 r d`;
3984    GSYM (ASSUME `D = conic_cap (u0:real^3) u1 r d`)]);
3985  (EXPAND_TAC "D");
3986  (REWRITE_TAC[IN_INTER; MESON[] `~(x:bool /\ y) <=> (~x \/ ~y)`]);
3987  (DISJ1_TAC);
3988  (REWRITE_TAC[IN_BALL] THEN STRIP_TAC);
3989
3990  (NEW_GOAL `(?b1:real. b1 IN P2 /\ (!x. x IN P2 ==> b1 <= x))`);
3991  (FIRST_ASSUM MATCH_MP_TAC);
3992  (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
3993  (EXISTS_TAC `(f2:(real^3)list -> real) vl`);
3994  (EXPAND_TAC "P2" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
3995  (EXISTS_TAC `vl:(real^3)list`);
3996  (ASM_REWRITE_TAC[]);
3997  (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
3998  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
3999  (STRIP_TAC);
4000  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4001  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4002  (EXISTS_TAC `X INTER (C:real^3->bool)`);
4003  (STRIP_TAC);
4004  (ASM_REWRITE_TAC[]);
4005  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
4006  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
4007  (MATCH_MP_TAC (SET_RULE 
4008   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
4009  (STRIP_TAC);
4010  (MATCH_MP_TAC SUBSET_BALL);
4011  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
4012  (MATCH_MP_TAC RCONE_GT_SUBSET);
4013  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
4014  (FIRST_X_ASSUM CHOOSE_TAC);
4015
4016  (NEW_GOAL `r2 = (@b. b IN P2 /\ (!x. x IN P2 ==> b <= x:real))`);
4017  (EXPAND_TAC "r2");
4018  (COND_CASES_TAC);
4019  (NEW_GOAL `F`);
4020  (UP_ASM_TAC THEN REWRITE_TAC[]);
4021  (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
4022  (EXISTS_TAC `(f2:(real^3)list -> real) vl`);
4023  (EXPAND_TAC "P2" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
4024  (EXISTS_TAC `vl:(real^3)list`);
4025  (ASM_REWRITE_TAC[]);
4026  (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
4027  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
4028  (STRIP_TAC);
4029  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4030  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4031  (EXISTS_TAC `X INTER (C:real^3->bool)`);
4032  (STRIP_TAC);
4033  (ASM_REWRITE_TAC[]);
4034  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
4035  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
4036  (MATCH_MP_TAC (SET_RULE 
4037   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
4038  (STRIP_TAC);
4039  (MATCH_MP_TAC SUBSET_BALL);
4040  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
4041  (MATCH_MP_TAC RCONE_GT_SUBSET);
4042  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
4043  (UP_ASM_TAC THEN MESON_TAC[]);
4044  (REWRITE_TAC[]);
4045
4046  (ABBREV_TAC `Q1 = (\b:real. b IN P2 /\ (!x. x IN P2 ==> b <= x))`);
4047  (NEW_GOAL `(Q1:real->bool) r2`);
4048  (ASM_REWRITE_TAC[]);
4049  (MATCH_MP_TAC SELECT_AX);
4050  (EXISTS_TAC `b1:real` THEN EXPAND_TAC "Q1");
4051  (ASM_REWRITE_TAC[]);
4052  (UP_ASM_TAC THEN EXPAND_TAC "Q1" THEN REPEAT STRIP_TAC);
4053  (NEW_GOAL `r2 <= f2 (vl:(real^3)list)`);
4054  (FIRST_ASSUM MATCH_MP_TAC);
4055  (EXPAND_TAC "P2" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
4056  (EXISTS_TAC `vl:(real^3)list`);
4057  (ASM_REWRITE_TAC[]);
4058  (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
4059  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
4060  (STRIP_TAC);
4061  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4062  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4063  (EXISTS_TAC `X INTER (C:real^3->bool)`);
4064  (STRIP_TAC);
4065  (ASM_REWRITE_TAC[]);
4066  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
4067  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
4068  (MATCH_MP_TAC (SET_RULE 
4069   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
4070  (STRIP_TAC);
4071  (MATCH_MP_TAC SUBSET_BALL);
4072  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
4073  (MATCH_MP_TAC RCONE_GT_SUBSET);
4074  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
4075
4076  (UP_ASM_TAC THEN EXPAND_TAC "f2" THEN REWRITE_TAC[EL; HD; TL; 
4077    ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; 
4078    ASSUME `vl= [u0; u1; u2; u3:real^3]`] THEN STRIP_TAC);
4079  (NEW_GOAL `!v. v IN affine hull {u1, u2, u3:real^3} ==> r2 <= dist (u0, v)`);
4080  (REPEAT STRIP_TAC);
4081  (NEW_GOAL `dist (u0,closest_point (affine hull {u1, u2, u3}) u0) <= 
4082              dist (u0, v:real^3)`);
4083  (MATCH_MP_TAC CLOSEST_POINT_LE);
4084  (ASM_REWRITE_TAC[CLOSED_AFFINE_HULL]);
4085  (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
4086
4087  (NEW_GOAL `r <= dist (u0:real^3, x)`);
4088  (REWRITE_TAC[dist]);
4089  (REWRITE_WITH `u0:real^3 - x = (t1 + t2 + t3 + t4) % u0 - x`);
4090  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
4091  (REWRITE_TAC[VECTOR_ADD_RDISTRIB]);
4092  (ASM_REWRITE_TAC[VECTOR_ARITH `(t1 % u0 + t2 % u0 + t3 % u0 + t4 % u0) -
4093   (t1 % u0 + t2 % u1 + t3 % u2 + t4 % u3) = 
4094   (t2 + t3 + t4) % u0 - (t2 % u1 + t3 % u2 + t4 % u3)`]);
4095  (ABBREV_TAC `y:real^3 = t2 /(t2 + t3 + t4) % u1 + 
4096                           t3 /(t2 + t3 + t4) % u2 + 
4097                           t4 /(t2 + t3 + t4) % u3`);
4098  (REWRITE_WITH `(t2 % u1 + t3 % u2 + t4 % u3) = (t2 + t3 + t4) % (y:real^3)`);
4099  (EXPAND_TAC "y");
4100  (REWRITE_TAC[VECTOR_ARITH `x % (t2 / x % u1 +  t3 / x % u2 + t4 / x % u3) = 
4101    (x / x) % (t2 % u1 + t3 % u2 + t4 % u3)`]);
4102  (REWRITE_WITH `(t2 + t3 + t4) / (t2 + t3 + t4) = &1`);
4103  (MATCH_MP_TAC REAL_DIV_REFL);
4104  (UNDISCH_TAC `t1 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1`);
4105  (REAL_ARITH_TAC);
4106  (VECTOR_ARITH_TAC);
4107  (REWRITE_TAC[VECTOR_ARITH `a % x - a % y = a % (x - y)`; NORM_MUL]);
4108
4109  (NEW_GOAL `&1 < t2 + t3 + t4`);
4110  (UNDISCH_TAC `t1 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1`);
4111  (REAL_ARITH_TAC);
4112  (REWRITE_WITH `abs (t2 + t3 + t4) = t2 + t3 + t4`);
4113  (REWRITE_TAC[REAL_ABS_REFL] THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
4114  (REWRITE_TAC[GSYM dist]);
4115  (NEW_GOAL `r2 <= dist (u0, y:real^3)`);
4116  (FIRST_ASSUM MATCH_MP_TAC);
4117  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
4118  (EXISTS_TAC `t2 / (t2 + t3 + t4)` THEN EXISTS_TAC `t3 / (t2 + t3 + t4)` THEN
4119    EXISTS_TAC `t4 / (t2 + t3 + t4)`);
4120  (STRIP_TAC);
4121  (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);
4122  (MATCH_MP_TAC REAL_DIV_REFL);
4123  (UP_ASM_TAC THEN REAL_ARITH_TAC);
4124  (ASM_REWRITE_TAC[]);
4125
4126  (NEW_GOAL `r2 <= (t2 + t3 + t4) * dist (u0,y:real^3)`);
4127  (NEW_GOAL `dist (u0,y) <= (t2 + t3 + t4) * dist (u0,y:real^3)`);
4128  (REWRITE_TAC[REAL_ARITH `a <= b * a <=> &0 <= (b - &1) * a`]);
4129  (MATCH_MP_TAC REAL_LE_MUL);
4130  (REWRITE_TAC[DIST_POS_LE]);
4131  (DEL_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
4132  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
4133  (EXPAND_TAC "r" THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
4134  (UNDISCH_TAC `dist (u0, x:real^3) < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
4135
4136 (* ========================================================================== *)
4137
4138  (REWRITE_TAC[REAL_ARITH `&0 <= a <=> (a < &0 ==> F)`]);
4139  (STRIP_TAC);
4140  (UNDISCH_TAC `conic_cap (u0:real^3) u1 r d x`);
4141  (REWRITE_TAC[MESON[IN] `conic_cap u0 u1 r d x <=> x IN conic_cap u0 u1 r d`;
4142    GSYM (ASSUME `D = conic_cap (u0:real^3) u1 r d`)]);
4143  (EXPAND_TAC "D");
4144  (REWRITE_TAC[IN_INTER; MESON[] `~(x:bool /\ y) <=> (~x \/ ~y)`]);
4145  (DISJ2_TAC);
4146  (REWRITE_TAC[IN; IN_ELIM_THM; rcone_gt; rconesgn] THEN STRIP_TAC);
4147
4148  (NEW_GOAL `(?b1:real. b1 IN P4 /\ (!x. x IN P4 ==> x <= b1))`);
4149  (FIRST_ASSUM MATCH_MP_TAC);
4150  (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
4151  (EXISTS_TAC `(f4:(real^3)list -> real) vl`);
4152  (EXPAND_TAC "P4" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
4153  (EXISTS_TAC `vl:(real^3)list`);
4154  (ASM_REWRITE_TAC[]);
4155  (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
4156  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
4157  (STRIP_TAC);
4158  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4159  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4160  (EXISTS_TAC `X INTER (C:real^3->bool)`);
4161  (STRIP_TAC);
4162  (ASM_REWRITE_TAC[]);
4163  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
4164  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
4165  (MATCH_MP_TAC (SET_RULE 
4166   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
4167  (STRIP_TAC);
4168  (MATCH_MP_TAC SUBSET_BALL);
4169  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
4170  (MATCH_MP_TAC RCONE_GT_SUBSET);
4171  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
4172  (FIRST_X_ASSUM CHOOSE_TAC);
4173
4174  (NEW_GOAL `d2 = (@b. b IN P4 /\ (!x. x IN P4 ==> x <= b:real))`);
4175  (EXPAND_TAC "d2");
4176  (COND_CASES_TAC);
4177  (NEW_GOAL `F`);
4178  (UP_ASM_TAC THEN REWRITE_TAC[]);
4179  (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
4180  (EXISTS_TAC `(f4:(real^3)list -> real) vl`);
4181  (EXPAND_TAC "P4" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
4182  (EXISTS_TAC `vl:(real^3)list`);
4183  (ASM_REWRITE_TAC[]);
4184  (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
4185  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
4186  (STRIP_TAC);
4187  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4188  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4189  (EXISTS_TAC `X INTER (C:real^3->bool)`);
4190  (STRIP_TAC);
4191  (ASM_REWRITE_TAC[]);
4192  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
4193  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
4194  (MATCH_MP_TAC (SET_RULE 
4195   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
4196  (STRIP_TAC);
4197  (MATCH_MP_TAC SUBSET_BALL);
4198  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
4199  (MATCH_MP_TAC RCONE_GT_SUBSET);
4200  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
4201  (UP_ASM_TAC THEN MESON_TAC[]);
4202  (REWRITE_TAC[]);
4203
4204  (ABBREV_TAC `Q1 = (\b:real. b IN P4 /\ (!x. x IN P4 ==> x <= b))`);
4205  (NEW_GOAL `(Q1:real->bool) d2`);
4206  (ASM_REWRITE_TAC[]);
4207  (MATCH_MP_TAC SELECT_AX);
4208  (EXISTS_TAC `b1:real` THEN EXPAND_TAC "Q1");
4209  (ASM_REWRITE_TAC[]);
4210  (UP_ASM_TAC THEN EXPAND_TAC "Q1" THEN REPEAT STRIP_TAC);
4211
4212  (NEW_GOAL `f4 (vl:(real^3)list) <= d2`);
4213  (FIRST_ASSUM MATCH_MP_TAC);
4214  (EXPAND_TAC "P4" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
4215  (EXISTS_TAC `vl:(real^3)list`);
4216  (ASM_REWRITE_TAC[]);
4217  (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
4218  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
4219  (STRIP_TAC);
4220  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4221  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4222  (EXISTS_TAC `X INTER (C:real^3->bool)`);
4223  (STRIP_TAC);
4224  (ASM_REWRITE_TAC[]);
4225  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
4226  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
4227  (MATCH_MP_TAC (SET_RULE 
4228   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
4229  (STRIP_TAC);
4230  (MATCH_MP_TAC SUBSET_BALL);
4231  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
4232  (MATCH_MP_TAC RCONE_GT_SUBSET);
4233  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
4234
4235  (UP_ASM_TAC THEN EXPAND_TAC "f4");
4236  (REWRITE_TAC[EL; HD; TL; 
4237    ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; 
4238    ASSUME `vl= [u0; u1; u2; u3:real^3]`] THEN STRIP_TAC);
4239  (ABBREV_TAC `xx = smallest_angle_line u2 u3 u0 u1`);
4240
4241  (MP_TAC (ASSUME `smallest_angle_line u2 u3 u0 u1 = xx`));
4242  (REWRITE_TAC[smallest_angle_line; smallest_angle_set]);
4243  (ABBREV_TAC `Q2 = 
4244  (\x:real^3. x IN convex hull {u2, u3} /\
4245              (!y. y IN convex hull {u2, u3}
4246                   ==> ((y - u0) dot (u1 - u0)) /
4247                       (norm (y - u0) * norm (u1 - u0)) <=
4248                       ((x - u0) dot (u1 - u0)) /
4249                       (norm (x - u0) * norm (u1 - u0))))`);
4250  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN STRIP_TAC);
4251  (NEW_GOAL `(Q2:real^3->bool) xx`);
4252  (ONCE_ASM_REWRITE_TAC[]);
4253  (MATCH_MP_TAC SELECT_AX);
4254  (EXPAND_TAC "Q2");
4255
4256  (MATCH_MP_TAC SMALLEST_ANGLE_LINE_EXISTS);
4257  (STRIP_TAC);
4258  (ASM_REWRITE_TAC[]);
4259  (STRIP_TAC);
4260
4261  (UNDISCH_TAC `~NULLSET (X INTER D)`);
4262  (REWRITE_TAC[]);
4263  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4264  (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);
4265  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list;ARITH_RULE `4 >= 4`]);
4266  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4267
4268  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4269  (STRIP_TAC);
4270  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4271  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4272  (REWRITE_TAC[coplanar]);
4273  (UNDISCH_TAC `u0 IN convex hull {u2, u3:real^3}`);
4274  (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
4275  (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
4276    EXISTS_TAC `u3:real^3`);
4277  (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));
4278  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
4279  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
4280  (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
4281  (STRIP_TAC);
4282  (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);
4283  (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
4284  (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4285  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4286  (SET_TAC[]);
4287
4288  (UP_ASM_TAC THEN EXPAND_TAC "Q2");
4289  (STRIP_TAC);
4290  (ABBREV_TAC `g = (\y:real^3. ((y - u0) dot (u1 - u0)) / 
4291                                (norm (y - u0) * norm (u1 - u0)))`);
4292
4293  (NEW_GOAL `d < (g:real^3->real) x`);
4294  (EXPAND_TAC "g");
4295  (REWRITE_WITH 
4296   `d < ((x - u0) dot (u1 - u0)) / (norm (x - u0) * norm (u1 - u0:real^3)) <=>
4297    d * (norm (x - u0) * norm (u1 - u0)) < (x - u0) dot (u1 - u0)`);
4298  (MATCH_MP_TAC REAL_LT_RDIV_EQ);
4299  (MATCH_MP_TAC (REAL_ARITH `&0 <= a /\ ~(a = &0) ==> &0 < a`));
4300  (STRIP_TAC);
4301  (MATCH_MP_TAC REAL_LE_MUL);
4302  (ASM_REWRITE_TAC[NORM_POS_LE]);
4303  (REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0; VECTOR_ARITH `x - y = vec 0 <=> x = y`]);
4304  (ASM_REWRITE_TAC[]);
4305  (REWRITE_WITH `t1 % u0 + t2 % u1 + t3 % u2 + t4 % u3 = u0:real^3 <=>
4306   t1 % u0 + t2 % u1 + t3 % u2 + t4 % u3 = (t1 + t2 + t3 + t4) % u0`);
4307  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
4308  (REWRITE_TAC[VECTOR_ARITH `t1 % u0 + u = (t1 + t2) % u0 <=> u = t2 % u0`]);
4309  (STRIP_TAC);
4310
4311  (MP_TAC (ASSUME `~NULLSET (X INTER D)`) THEN REWRITE_TAC[]);
4312  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4313  (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);
4314  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4;set_of_list]);
4315  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4316  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4317  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4318  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4319  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4320  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
4321  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
4322  (REWRITE_TAC[affine_dependent]);
4323  (EXISTS_TAC `u1:real^3`);
4324  (STRIP_TAC);
4325  (SET_TAC[]);
4326
4327  (NEW_GOAL `~(u1 IN {u0, u2, u3:real^3})`);
4328  (STRIP_TAC);
4329  (MP_TAC (ASSUME `~NULLSET (X INTER D)`) THEN REWRITE_TAC[]);
4330  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4331  (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);
4332  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4;set_of_list]);
4333  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4334  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4335  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4336  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4337  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4338  (REWRITE_WITH `{u0, u1, u2, u3} = {u0:real^3,u2, u3}`);
4339  (UP_ASM_TAC THEN SET_TAC[]);
4340  (REWRITE_TAC[COPLANAR_3]);
4341  (SET_TAC[]);
4342  (REWRITE_WITH `{u0, u1, u2, u3} DELETE u1 = {u0, u2, u3:real^3}`);
4343  (UP_ASM_TAC THEN SET_TAC[]);
4344  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
4345  (EXISTS_TAC `(t2 + t3 + t4) / t2`);
4346  (EXISTS_TAC `(-- t3) / t2`);
4347  (EXISTS_TAC `(-- t4) / t2`);
4348
4349  (STRIP_TAC);
4350  (REWRITE_WITH `(t2 + t3 + t4) / t2 + --t3 / t2 + --t4 / t2 = t2 / t2`);
4351  (REAL_ARITH_TAC);
4352  (MATCH_MP_TAC REAL_DIV_REFL);
4353  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
4354  (REWRITE_WITH 
4355   `u1 = (t2 + t3 + t4) / t2 % u0 + --t3 / t2 % u2 + --t4 / t2 % u3:real^3 <=> 
4356    u1 = (&1 / t2) % ((t2 + t3 + t4) % u0 - t3 % u2 - t4 % u3)`);
4357  (VECTOR_ARITH_TAC);
4358  (REWRITE_TAC[GSYM (ASSUME `t2 % u1 + t3 % u2 + t4 % u3 = 
4359                              (t2 + t3 + t4) % u0:real^3`)]);
4360  (REWRITE_TAC[VECTOR_ARITH 
4361   `(t2 % u1 + t3 % u2 + t4 % u3) - t3 % u2 - t4 % u3 = t2 % u1`]);
4362  (REWRITE_TAC[VECTOR_MUL_ASSOC]);
4363  (REWRITE_WITH `&1 / t2 * t2 = &1`);
4364  (REWRITE_TAC[REAL_ARITH `&1 / t2 * t2 = t2 / t2`]);
4365  (MATCH_MP_TAC REAL_DIV_REFL);
4366  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
4367  (VECTOR_ARITH_TAC);
4368  (SET_TAC[]);
4369  (REWRITE_TAC[REAL_ARITH `a * b * c < d <=> d > b * c * a`; GSYM dist]);
4370  (ASM_REWRITE_TAC[]);
4371
4372  (NEW_GOAL `g x <= (g:real^3->real) xx`);
4373  (NEW_GOAL `!y. y IN convex hull {u2 , u3:real^3} ==> g y <= g xx`);
4374  (EXPAND_TAC "g" THEN ASM_REWRITE_TAC[]);
4375  (NEW_GOAL `&0 < (t3 + t4)`);
4376  (MATCH_MP_TAC (REAL_ARITH `(&0 <= x) /\ ~(x = &0)  ==> &0 < x`));
4377  (STRIP_TAC);
4378  (MATCH_MP_TAC REAL_LE_ADD);
4379  (ASM_REWRITE_TAC[]);
4380  (STRIP_TAC);
4381  (NEW_GOAL `t3 = &0 /\ t4 = &0`);
4382  (UNDISCH_TAC `&0 <= t3` THEN UNDISCH_TAC `&0 <= t4` THEN 
4383    UP_ASM_TAC THEN REAL_ARITH_TAC);
4384  (UP_ASM_TAC THEN STRIP_TAC);
4385
4386  (NEW_GOAL `F`);
4387  (UNDISCH_TAC `(x - u0) dot (u1 - u0:real^3) > dist (x,u0) * dist (u1,u0) * d`);
4388  (REWRITE_WITH `x = t1 % u0 + t2 % u1:real^3`);
4389  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
4390  (MATCH_MP_TAC (REAL_ARITH `a <= &0 /\ &0 <= b ==> ~(a > b)`));
4391  (STRIP_TAC);
4392  (REWRITE_WITH `(t1 % u0 + t2 % u1) - u0 = (t1 % u0 + t2 % u1) - 
4393                  (t1 + t2 + t3 + t4) % u0:real^3`);
4394  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
4395  (REWRITE_TAC[ASSUME `t3 = &0`; ASSUME `t4 = &0`; VECTOR_ARITH 
4396   `(t1 % u0 + t2 % u1) - (t1 + t2 + &0 + &0) % u0 = t2 % (u1 - u0)`; 
4397    DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);
4398  (MATCH_MP_TAC REAL_LE_MUL);
4399  (REWRITE_TAC[DOT_POS_LE]);
4400  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
4401  (MATCH_MP_TAC REAL_LE_MUL);
4402  (REWRITE_TAC[DIST_POS_LE]);
4403  (MATCH_MP_TAC REAL_LE_MUL);
4404  (REWRITE_TAC[DIST_POS_LE]);
4405  (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c/\ c < &1`);
4406  (REAL_ARITH_TAC);
4407  (UP_ASM_TAC THEN MESON_TAC[]);
4408
4409  (ABBREV_TAC `y = t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3:real^3`);
4410  (NEW_GOAL `(g:real^3->real) y <= g xx`);
4411  (FIRST_ASSUM MATCH_MP_TAC);
4412  (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM]);
4413  (EXISTS_TAC `t3 / (t3 + t4)` THEN EXISTS_TAC `t4 / (t3 + t4)`);
4414  (REPEAT STRIP_TAC);
4415  (MATCH_MP_TAC REAL_LE_DIV);
4416  (ASM_SIMP_TAC[REAL_LE_ADD]);
4417  (ASM_SIMP_TAC[REAL_LE_ADD; REAL_LE_DIV]);
4418  (REWRITE_TAC[REAL_ARITH `a / x + b / x = (a + b) / x`]);
4419  (MATCH_MP_TAC REAL_DIV_REFL);
4420  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
4421  (ASM_REWRITE_TAC[]);
4422
4423  (ABBREV_TAC `w = t1 / (t1 + t3 + t4) % u0 + t3 / (t1 + t3 + t4) % u2 + 
4424                    t4 / (t1 + t3 + t4) % u3:real^3`);
4425  (NEW_GOAL `(g:real^3->real) y = g w`);
4426  (EXPAND_TAC "g");
4427
4428  (REWRITE_WITH `y:real^3 - u0 = 
4429                 &1 / (t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0)`);
4430  (EXPAND_TAC "y");
4431  (REWRITE_TAC[VECTOR_ARITH 
4432   `(t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3) - u0 =
4433    &1 / (t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0) <=> 
4434    (t3 + t4) / (t3 + t4) % u0 = u0`]);
4435  (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
4436  (MATCH_MP_TAC REAL_DIV_REFL);
4437  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
4438  (VECTOR_ARITH_TAC);
4439  (REWRITE_TAC[NORM_MUL; DOT_LMUL]);
4440
4441  (REWRITE_WITH `w:real^3 - u0 = 
4442                 &1 / (t1 + t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0)`);
4443  (EXPAND_TAC "w");
4444  (REWRITE_TAC[VECTOR_ARITH 
4445    `(t1 / (t1 + t3 + t4) % u0 +
4446     t3 / (t1 + t3 + t4) % u2 + t4 / (t1 + t3 + t4) % u3) - u0 =
4447     &1 / (t1 + t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0) <=> 
4448     (t1 + t3 + t4) / (t1 + t3 + t4) % u0 = u0`]);
4449  (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
4450  (MATCH_MP_TAC REAL_DIV_REFL);
4451  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` 
4452    THEN REAL_ARITH_TAC);
4453  (VECTOR_ARITH_TAC);
4454  (REWRITE_TAC[NORM_MUL; DOT_LMUL]);
4455  (REWRITE_WITH `abs (&1 / (t3 + t4)) = &1 / (t3 + t4)`);
4456  (REWRITE_TAC[REAL_ABS_REFL]);
4457  (ASM_SIMP_TAC[REAL_LE_DIV;REAL_LE_ADD; REAL_ARITH `&0 <= &1`]);
4458  (REWRITE_WITH `abs (&1 / (t1 + t3 + t4)) = &1 / (t1 + t3 + t4)`);
4459  (REWRITE_TAC[REAL_ABS_REFL]);
4460  (MATCH_MP_TAC REAL_LE_DIV THEN REWRITE_TAC[REAL_ARITH `&0 <= &1`]);
4461  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` 
4462    THEN REAL_ARITH_TAC);
4463  (REWRITE_TAC[REAL_ARITH `(a * x) / ((a * y) * z) = 
4464                            (a * x) / (a * (y * z))`]);
4465  (ABBREV_TAC 
4466   `a1 = norm (t3 % u2 + t4 % u3 - (t3 + t4) % u0) * norm (u1 - u0:real^3)`);
4467  (NEW_GOAL `~(a1 = &0)`);
4468  (EXPAND_TAC "a1" THEN ASM_REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0; 
4469    VECTOR_ARITH `(a - b = vec 0 <=> a = b)/\(a + b-c = vec 0 <=> a + b = c)`]);
4470  (STRIP_TAC);
4471
4472  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4473  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4474  (EXISTS_TAC `(X:real^3->bool)`);
4475  (STRIP_TAC);
4476  (ASM_SIMP_TAC[mcell4; MCELL_EXPLICIT; set_of_list]);
4477  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4478  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4479  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4480  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4481  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4482  (REWRITE_TAC[coplanar]);
4483  (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
4484    EXISTS_TAC `u3:real^3`);
4485  (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
4486  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
4487  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
4488  (EXISTS_TAC `&0` THEN EXISTS_TAC `t3 / (t3 + t4)` 
4489    THEN EXISTS_TAC `t4 / (t3 + t4)`);
4490  (REPEAT STRIP_TAC);
4491  (REWRITE_TAC[REAL_ARITH `&0 + t3 / (t3 + t4) + t4 / (t3 + t4) = 
4492                           (t3 + t4) / (t3 + t4)`]);
4493  (MATCH_MP_TAC REAL_DIV_REFL);
4494  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
4495  (ASM_REWRITE_TAC[VECTOR_ARITH 
4496    `&0 % u1 + t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3 = 
4497     (&1 / (t3 + t4)) % (t3 % u2 + t4 % u3)`]);
4498  (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
4499  (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
4500  (MATCH_MP_TAC REAL_DIV_REFL);
4501  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
4502  (VECTOR_ARITH_TAC);
4503  (SET_TAC[]);
4504
4505  (NEW_GOAL `~(&1 / (t3 + t4) = &0)`);
4506  (NEW_GOAL `&0 < &1 / (t3 + t4)`);
4507  (MATCH_MP_TAC REAL_LT_DIV);
4508  (ASM_REWRITE_TAC[REAL_ARITH `&0 < &1`]);
4509  (UP_ASM_TAC THEN REAL_ARITH_TAC);
4510
4511  (REWRITE_WITH 
4512  `(&1 / (t3 + t4) * ((t3 % u2 + t4 % u3 - (t3 + t4) % u0) dot (u1 - u0))) /
4513   (&1 / (t3 + t4) * a1) = 
4514   ((t3 % u2 + t4 % u3 - (t3 + t4) % u0) dot (u1 - u0:real^3)) / a1`);
4515  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[Trigonometry1.REAL_DIV_MUL2]);
4516
4517  (NEW_GOAL `~(&1 / (t1 + t3 + t4) = &0)`);
4518  (NEW_GOAL `&0 < &1 / (t1 + t3 + t4)`);
4519  (MATCH_MP_TAC REAL_LT_DIV);
4520  (ASM_REWRITE_TAC[REAL_ARITH `&0 < &1`]);
4521  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
4522    REAL_ARITH_TAC);
4523  (UP_ASM_TAC THEN REAL_ARITH_TAC);
4524
4525  (REWRITE_WITH 
4526  `(&1 / (t1 + t3 + t4) * ((t3 % u2 + t4 % u3 - (t3 + t4) % u0) dot (u1 - u0))) /
4527   (&1 / (t1 + t3 + t4) * a1) = 
4528   ((t3 % u2 + t4 % u3 - (t3 + t4) % u0) dot (u1 - u0:real^3)) / a1`);
4529  (UP_ASM_TAC THEN UNDISCH_TAC `~(a1 = &0)` THEN
4530    MESON_TAC[Trigonometry1.REAL_DIV_MUL2]);
4531
4532  (NEW_GOAL `(g:real^3->real) x <= g w`);
4533  (EXPAND_TAC "g");
4534
4535  (REWRITE_WITH 
4536   `((x - u0) dot (u1 - u0:real^3)) / (norm (x - u0) * norm (u1 - u0)) <=
4537   ((w - u0) dot (u1 - u0)) / (norm (w - u0) * norm (u1 - u0)) <=>
4538   ((x - u0) dot (u1 - u0)) * (norm (w - u0) * norm (u1 - u0)) <= 
4539   ((w - u0) dot (u1 - u0)) * (norm (x - u0) * norm (u1 - u0))`);
4540  (MATCH_MP_TAC RAT_LEMMA4);
4541  (STRIP_TAC);
4542  (MATCH_MP_TAC REAL_LT_MUL);
4543  (ASM_REWRITE_TAC[NORM_POS_LT; VECTOR_ARITH `x - b = vec 0 <=> x = b`]);
4544  (STRIP_TAC);
4545  (UNDISCH_TAC `~NULLSET (X INTER D)`);
4546  (REWRITE_TAC[]);
4547
4548  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4549  (EXISTS_TAC `(X:real^3->bool)`);
4550  (STRIP_TAC);
4551  (ASM_SIMP_TAC[mcell4; MCELL_EXPLICIT; set_of_list]);
4552  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4553  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4554  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4555  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4556  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4557  (REWRITE_TAC[coplanar]);
4558  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
4559    EXISTS_TAC `u3:real^3`);
4560  (ONCE_REWRITE_TAC[SET_RULE `{u0, u1, u2, u3} = {u1, u0, u2, u3}`]);
4561  (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
4562  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
4563  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
4564  (EXISTS_TAC `(t2 + t3 + t4) / t2` THEN EXISTS_TAC `(--t3) / t2` 
4565    THEN EXISTS_TAC `(--t4) / t2`);
4566  (REPEAT STRIP_TAC);
4567  (REWRITE_TAC[REAL_ARITH 
4568    `(t2 + t3 + t4) / t2 + --t3 / t2 + --t4 / t2 = t2 / t2`]);
4569  (MATCH_MP_TAC REAL_DIV_REFL);
4570  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
4571  (REWRITE_WITH `(t2 + t3 + t4) = &1 - t1`);
4572  (UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
4573  (NEW_GOAL `u0 - t1 % u0 - t3 % u2 - t4 % u3:real^3 = t2 % u1`);
4574  (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
4575  (ASM_REWRITE_TAC[VECTOR_ARITH 
4576    `(&1 - t1) / t2 % u0 + --t3 / t2 % u2 + --t4 / t2 % u3 = 
4577     (&1 / t2) % (u0 - t1 % u0 - t3 % u2 - t4 % u3)`]);
4578  (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
4579  (REWRITE_WITH `t2 / t2 = &1`);
4580  (MATCH_MP_TAC REAL_DIV_REFL);
4581  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
4582  (VECTOR_ARITH_TAC);
4583  (SET_TAC[]);
4584
4585  (MATCH_MP_TAC REAL_LT_MUL);
4586  (ASM_REWRITE_TAC[NORM_POS_LT; VECTOR_ARITH `x - b = vec 0 <=> x = b`]);
4587  (EXPAND_TAC "w" THEN STRIP_TAC);
4588  (UNDISCH_TAC `~NULLSET (X INTER D)`);
4589  (REWRITE_TAC[]);
4590
4591  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4592  (EXISTS_TAC `(X:real^3->bool)`);
4593  (STRIP_TAC);
4594  (ASM_SIMP_TAC[mcell4; MCELL_EXPLICIT; set_of_list]);
4595  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4596  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4597  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4598  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4599  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4600  (REWRITE_TAC[coplanar]);
4601  (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
4602    EXISTS_TAC `u3:real^3`);
4603  (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
4604  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
4605  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
4606
4607  (EXISTS_TAC `&0` THEN EXISTS_TAC `t3 / (t3 + t4)` 
4608    THEN EXISTS_TAC `t4 / (t3 + t4)`);
4609  (REPEAT STRIP_TAC);
4610  (REWRITE_TAC[REAL_ARITH `&0 + t3 / (t3 + t4) + t4 / (t3 + t4) = 
4611                           (t3 + t4) / (t3 + t4)`]);
4612  (MATCH_MP_TAC REAL_DIV_REFL);
4613  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
4614  (ASM_REWRITE_TAC[VECTOR_ARITH 
4615    `&0 % u1 + t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3 = 
4616     (&1 / (t3 + t4)) % (t3 % u2 + t4 % u3)`]);
4617  (UP_ASM_TAC THEN REWRITE_TAC[VECTOR_ARITH 
4618    `t1 / x % u0 + t3 / x % u2 + t4 / x % u3 = 
4619     (&1 / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
4620  (REWRITE_WITH `&1 / (t1 + t3 + t4) % (t1 % u0 + t3 % u2 + t4 % u3) = u0 <=> 
4621                  t1 % u0 + t3 % u2 + t4 % u3 = (t1 + t3 + t4) % u0:real^3`);
4622  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4623  (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);
4624  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 +t3 + t4 = &1` THEN 
4625    REAL_ARITH_TAC);
4626
4627  (REWRITE_TAC[VECTOR_ARITH `t1 % u0 + t3 % u2 + t4 % u3 = (t1 + t3 + t4) % u0
4628    <=> t3 % u2 + t4 % u3 = (t3 + t4) % u0`]);
4629  (STRIP_TAC THEN ASM_REWRITE_TAC[]);
4630  (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
4631  (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
4632  (MATCH_MP_TAC REAL_DIV_REFL);
4633  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
4634  (VECTOR_ARITH_TAC);
4635  (SET_TAC[]);
4636
4637  (REWRITE_WITH `x = t2 % u1 + (t1 + t3 + t4) % w:real^3`);
4638  (ASM_REWRITE_TAC[] THEN EXPAND_TAC "w");
4639  (REWRITE_TAC[VECTOR_ARITH 
4640   `x % (t1 /x % u0 + t3 / x % u2 + t4 /x  % u3) = 
4641    (x / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
4642  (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
4643  (MATCH_MP_TAC REAL_DIV_REFL);
4644  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
4645    REAL_ARITH_TAC);
4646  (VECTOR_ARITH_TAC);
4647  (ABBREV_TAC `t = t1 + t3 + t4`);
4648  (REWRITE_WITH `(t2 % u1 + t % w) - u0:real^3 = 
4649                 (t2 % u1 + t % w) - (t1 + t2 + t3 + t4) % u0`);
4650  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
4651  (REWRITE_WITH `t1 + t2 + t3 + t4 = t2 + t:real`);
4652  (EXPAND_TAC "t" THEN REAL_ARITH_TAC);
4653  (REWRITE_TAC[VECTOR_ARITH 
4654   `(t2 % u1 + t % w) - (t2 + t) % u0 = t2 % (u1 - u0) + t % (w - u0)`]);
4655  (ABBREV_TAC `x1 = u1 - u0:real^3`);
4656  (ABBREV_TAC `x2 = w - u0:real^3`);
4657
4658  (REWRITE_WITH `(t2 % x1 + t % x2) dot x1 = 
4659    t2 * norm x1 pow 2 + t * x2 dot (x1:real^3)`);
4660  (REWRITE_TAC[NORM_POW_2]);
4661  (VECTOR_ARITH_TAC);
4662
4663  (NEW_GOAL `t2 * norm x1 pow 2 * norm x2 * norm x1 <= 
4664              t2 * (x2 dot x1) * norm x1 * norm (x1:real^3)`);
4665  (REWRITE_TAC[REAL_POW_2; REAL_ARITH `t2 * (x1 * x1) * x2 * x1 <=
4666    t2 * x3 * x1 * x1 <=> &0 <= (x1 pow 2) * (--t2) * (x2 * x1 - x3)`]);
4667  (MATCH_MP_TAC REAL_LE_MUL);
4668  (ASM_SIMP_TAC[REAL_LE_MUL; NORM_POS_LE]);
4669  (MATCH_MP_TAC REAL_LE_MUL);
4670  (REWRITE_TAC[REAL_ARITH `&0 <= a - b <=> b <= a`]);
4671  (STRIP_TAC);
4672  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
4673  (REWRITE_TAC[NORM_CAUCHY_SCHWARZ]);
4674
4675  (NEW_GOAL 
4676  `t2 * (x2 dot x1) * norm x1 * norm x1 + t * (x2 dot x1) * norm x2 * norm x1 <= 
4677   (x2 dot x1) * norm (t2 % x1 + t % x2) * norm (x1:real^3)`);
4678
4679  (REWRITE_TAC[REAL_ARITH `t2 * x3 * x1 * x1 + t * x3 * x2 * x1 <=
4680  x3 * x4 * x1 <=> &0 <= (x1 * x3) * (x4 - t2 * x1 - t * x2)`]);
4681  (MATCH_MP_TAC REAL_LE_MUL);
4682  (STRIP_TAC);
4683  (MATCH_MP_TAC REAL_LE_MUL);
4684  (REWRITE_TAC[NORM_POS_LE]);
4685  (ASM_CASES_TAC `x2 dot (x1:real^3) < &0`);
4686  (NEW_GOAL `F`);
4687  (NEW_GOAL `(g:real^3->real) x <= &0`);
4688  (EXPAND_TAC "g");
4689  (REWRITE_TAC[REAL_ARITH `a / b <= &0 <=> &0 <= (--a) / b`]);
4690  (MATCH_MP_TAC REAL_LE_DIV);
4691  (SIMP_TAC[NORM_POS_LE; REAL_LE_MUL]);
4692
4693  (REWRITE_WITH `x = t2 % u1 + (t1 + t3 + t4) % w:real^3`);
4694  (ASM_REWRITE_TAC[] THEN EXPAND_TAC "w");
4695  (REWRITE_TAC[VECTOR_ARITH 
4696   `x % (t1 /x % u0 + t3 / x % u2 + t4 /x  % u3) = 
4697    (x / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
4698  (EXPAND_TAC "t");
4699  (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
4700  (MATCH_MP_TAC REAL_DIV_REFL);
4701  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
4702    REAL_ARITH_TAC);
4703  (VECTOR_ARITH_TAC);
4704
4705  (REWRITE_TAC[REAL_ARITH `&0 <= --a <=> a <= &0`]);
4706  (REWRITE_WITH `(t2 % u1 + (t1 + t3 + t4) % w) - u0:real^3 = 
4707                  (t2 % u1 + (t1 + t3 + t4) % w) - (t1 + t2 + t3 + t4) % u0`);
4708  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
4709  (REWRITE_WITH `(t2 % u1 + (t1 + t3 + t4) % w) - (t1 + t2 + t3 + t4) % u0 = 
4710    t2 % x1 + t % x2:real^3`);
4711  (EXPAND_TAC "x1" THEN EXPAND_TAC "x2" THEN EXPAND_TAC "t"
4712    THEN VECTOR_ARITH_TAC);
4713  (NEW_GOAL `t % x2 dot (x1:real^3) <= &0`);
4714  (REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= a * (--b)`]);
4715  (MATCH_MP_TAC REAL_LE_MUL);
4716  (STRIP_TAC);
4717  (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN 
4718    UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
4719  (UP_ASM_TAC THEN REAL_ARITH_TAC);
4720  (NEW_GOAL `t2 % x1 dot (x1:real^3) <= &0`);
4721  (REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);
4722  (MATCH_MP_TAC REAL_LE_MUL);
4723  (STRIP_TAC);
4724  (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN 
4725    UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
4726  (REWRITE_TAC[DOT_POS_LE]);
4727  (REWRITE_TAC[DOT_LADD]);
4728  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
4729  (UP_ASM_TAC THEN UNDISCH_TAC `d < (g:real^3->real) x`);
4730  (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1`);
4731  (REAL_ARITH_TAC);
4732  (UP_ASM_TAC THEN MESON_TAC[]);
4733  (UP_ASM_TAC THEN REAL_ARITH_TAC);
4734
4735  (REWRITE_TAC [REAL_ARITH `&0 <= a - b * d - c <=> c <= a + (--b) * d`]);
4736  (REWRITE_WITH `t * norm (x2:real^3) = abs t * norm x2`);
4737  (AP_THM_TAC THEN AP_TERM_TAC);
4738  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4739  (REWRITE_TAC[REAL_ABS_REFL]);
4740  (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN 
4741    UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
4742  (REWRITE_WITH `(--t2) * norm (x1:real^3) = abs (--t2) * norm x1`);
4743  (AP_THM_TAC THEN AP_TERM_TAC);
4744  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4745  (REWRITE_TAC[REAL_ABS_REFL]);
4746  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
4747  (REWRITE_TAC[GSYM NORM_MUL]);
4748  (REWRITE_WITH 
4749   `norm (t % x2:real^3) = norm ((t2 % x1 + t % x2) + (--t2 % x1))`);
4750  (AP_TERM_TAC THEN VECTOR_ARITH_TAC);
4751  (REWRITE_TAC[NORM_TRIANGLE]);
4752  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
4753  (UNDISCH_TAC `(g:real^3->real) y <= g xx`);
4754  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
4755
4756  (NEW_GOAL `(g:real^3->real) xx <= d2`);
4757  (FIRST_ASSUM MATCH_MP_TAC);
4758  (EXPAND_TAC "P4");
4759  (EXPAND_TAC "g" THEN EXPAND_TAC "f4");
4760  (REWRITE_TAC[IN_ELIM_THM; IN]);
4761  (EXISTS_TAC `vl:(real^3)list`);
4762  (REWRITE_TAC[ASSUME `barV V 3 vl`; ASSUME `vl = [u0;u1;u2;u3:real^3]`; 
4763                TRUNCATE_SIMPLEX_EXPLICIT_1]);
4764  (SIMP_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
4765  (EXPAND_TAC "xx");
4766  (SIMP_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
4767  (REWRITE_WITH `mcell 4 V vl = mcell k V vl`);
4768  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
4769  (REWRITE_TAC[GSYM (ASSUME `X = mcell k V vl`)]);
4770  (STRIP_TAC);
4771
4772  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4773  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4774  (EXISTS_TAC `X INTER (C:real^3->bool)`);
4775  (STRIP_TAC);
4776  (ASM_REWRITE_TAC[]);
4777  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
4778  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
4779  (MATCH_MP_TAC (SET_RULE 
4780   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
4781  (STRIP_TAC);
4782  (MATCH_MP_TAC SUBSET_BALL);
4783  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
4784  (MATCH_MP_TAC RCONE_GT_SUBSET);
4785  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
4786
4787  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN EXPAND_TAC "d");
4788  (REAL_ARITH_TAC);
4789
4790  (NEW_GOAL `F`);
4791  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4792  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4793  (EXISTS_TAC `(X:real^3->bool)`);
4794  (STRIP_TAC);
4795  (ASM_SIMP_TAC[mcell4; MCELL_EXPLICIT; set_of_list]);
4796  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4797  (SET_TAC[]);
4798  (UP_ASM_TAC THEN MESON_TAC[]);
4799
4800 (* ========================================================================= *)
4801
4802  (NEW_GOAL `~coplanar {u0, u1, u2, u3:real^3}`);
4803  (STRIP_TAC);
4804  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4805  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4806  (EXISTS_TAC `X:real^3->bool`);
4807  (STRIP_TAC);
4808  (ASM_SIMP_TAC[mcell4; MCELL_EXPLICIT; set_of_list]);
4809  (COND_CASES_TAC);
4810  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4811  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4812  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4813  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4814  (ASM_REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4815  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4816  (SET_TAC[]);
4817
4818  (ASM_CASES_TAC `azim u0 u1 u2 (u3:real^3) < pi`);
4819  (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 u2 u3)`);
4820  (ASM_SIMP_TAC[WEDGE_LUNE]);
4821  (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d = 
4822                  conic_cap u0 u1 r d INTER L`);
4823  (SET_TAC[]);
4824  (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
4825  (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER 
4826    aff_gt {u0, u1} {u2, u3} DIFF conic_cap u0 u1 r d INTER L = {}`);
4827  (EXPAND_TAC "L");
4828  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));
4829  (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);
4830  (REWRITE_TAC[SET_RULE `A UNION {} = A`]);
4831  (EXPAND_TAC "L");
4832
4833  (REWRITE_WITH `aff_ge {u0, u1:real^3} {u2, u3} =
4834                  aff_gt {u0, u1} {u2, u3} UNION 
4835    UNIONS {aff_ge {u0, u1} ({u2, u3} DELETE a) | a | a IN  {u2, u3}}`);
4836  (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);
4837  (REWRITE_TAC[Geomdetail.FINITE6]);
4838  (REWRITE_TAC[DISJOINT]);
4839
4840  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
4841  (NEW_GOAL `F`);
4842  (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);
4843  (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u3:real^3}`);
4844  (UP_ASM_TAC THEN SET_TAC[]);
4845  (REWRITE_TAC[COPLANAR_3]);
4846  (UP_ASM_TAC THEN MESON_TAC[]);
4847
4848  (ASM_CASES_TAC `u3 IN {u0, u1:real^3}`);
4849  (NEW_GOAL `F`);
4850  (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);
4851  (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u2:real^3}`);
4852  (UP_ASM_TAC THEN SET_TAC[]);
4853  (REWRITE_TAC[COPLANAR_3]);
4854  (UP_ASM_TAC THEN MESON_TAC[]);
4855  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
4856
4857  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4858  (EXISTS_TAC 
4859   `UNIONS {aff_ge {u0, u1:real^3} ({u2, u3} DELETE a) | a | a IN {u2, u3}}`);
4860  (STRIP_TAC);
4861  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4862  (EXISTS_TAC 
4863   `aff_ge {u0, u1:real^3} {u2} UNION aff_ge {u0, u1:real^3} {u3}`);
4864  (STRIP_TAC);
4865  (MATCH_MP_TAC NEGLIGIBLE_UNION);
4866  (STRIP_TAC);
4867
4868  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4869  (EXISTS_TAC `affine hull {u0, u1:real^3, u2}`);
4870  (STRIP_TAC);
4871  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
4872  (REWRITE_WITH `{u0,u1,u2:real^3} = {u0,u1} UNION {u2}`);
4873  (SET_TAC[]);
4874  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
4875  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4876  (EXISTS_TAC `affine hull {u0, u1:real^3, u3}`);
4877  (STRIP_TAC);
4878  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
4879  (REWRITE_WITH `{u0,u1,u3:real^3} = {u0,u1} UNION {u3}`);
4880  (SET_TAC[]);
4881  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
4882  (REWRITE_TAC[SET_RULE 
4883   `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} = 
4884          aff_ge {u0, u1} ({m, s3} DELETE s3) 
4885    UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);
4886  (MATCH_MP_TAC (SET_RULE 
4887   `A SUBSET B /\ C SUBSET D ==> A UNION C SUBSET B UNION D`));
4888  (STRIP_TAC);
4889  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
4890  (STRIP_TAC);
4891  (SET_TAC[]);
4892
4893  (REWRITE_TAC[DISJOINT]);
4894  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
4895  (NEW_GOAL `F`);
4896  (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);
4897  (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u3:real^3}`);
4898  (UP_ASM_TAC THEN SET_TAC[]);
4899  (REWRITE_TAC[COPLANAR_3]);
4900  (UP_ASM_TAC THEN MESON_TAC[]);
4901  (UP_ASM_TAC THEN SET_TAC[]);
4902
4903  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
4904  (STRIP_TAC);
4905  (SET_TAC[]);
4906  (REWRITE_TAC[DISJOINT]);
4907  (ASM_CASES_TAC `u3 IN {u0, u1:real^3}`);
4908  (NEW_GOAL `F`);
4909  (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);
4910  (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u2:real^3}`);
4911  (UP_ASM_TAC THEN SET_TAC[]);
4912  (REWRITE_TAC[COPLANAR_3]);
4913  (UP_ASM_TAC THEN MESON_TAC[]);
4914  (UP_ASM_TAC THEN SET_TAC[]);
4915
4916  (SET_TAC[]);
4917
4918 (* begin the computation *)
4919
4920  (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);
4921  (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 u2 u3) =
4922              (if &1 < d \/ r < &0
4923               then &0
4924               else azim u0 u1 u2 u3 / &3 * (&1 - max d (-- &1)) * r pow 3)`);
4925  (NEW_GOAL `~collinear {u0:real^3, u1, u2} /\ ~collinear {u0, u1, u3}`);
4926  (STRIP_TAC);
4927  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4928  (EXISTS_TAC `u3:real^3`);
4929  (ASM_REWRITE_TAC[]);
4930  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4931  (EXISTS_TAC `u2:real^3`);
4932  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
4933  (ASM_REWRITE_TAC[]);
4934
4935  (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);
4936  (COND_CASES_TAC);
4937  (NEW_GOAL `F`);
4938  (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN 
4939    UP_ASM_TAC THEN REAL_ARITH_TAC);
4940  (UP_ASM_TAC THEN MESON_TAC[]);
4941
4942  (REWRITE_WITH `azim (u0:real^3) u1 u2 u3 = dihV u0 u1 u2 u3`);
4943  (MATCH_MP_TAC AZIM_DIHV_SAME);
4944  (ASM_REWRITE_TAC[]);
4945  (STRIP_TAC);
4946  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4947  (EXISTS_TAC `u3:real^3`);
4948  (ASM_REWRITE_TAC[]);
4949  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4950  (EXISTS_TAC `u2:real^3`);
4951  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
4952  (ASM_REWRITE_TAC[]);
4953
4954  (REWRITE_TAC[dihX]);
4955  (COND_CASES_TAC);
4956  (NEW_GOAL `F`);
4957  (UNDISCH_TAC `~NULLSET (X INTER D)`);
4958  (REWRITE_TAC[]);
4959  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4960  (EXISTS_TAC `X:real^3->bool`);
4961  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
4962  (UP_ASM_TAC THEN MESON_TAC[]);
4963
4964  (LET_TAC);
4965
4966  (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
4967  (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
4968            ul IN barV V 3 /\
4969            X = mcell k V ul /\
4970            initial_sublist [u0; u1] ul)`);
4971  (STRIP_TAC);
4972  (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
4973  (MATCH_MP_TAC SELECT_AX);
4974  (EXISTS_TAC `(4, vl:(real^3)list)`);
4975  (EXPAND_TAC "P");
4976  (REWRITE_TAC[BETA_THM]);
4977  (REWRITE_TAC[IN; ARITH_RULE `4 <= 4`] THEN ASM_REWRITE_TAC[]);
4978  (STRIP_TAC);
4979  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
4980
4981  (REWRITE_WITH `initial_sublist [u0;u1:real^3] [u0; u1; u2; u3] /\ 
4982                  LENGTH [u0;u1] = 1 + 1`);
4983  (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
4984  (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
4985  (ASM_REWRITE_TAC[]);
4986  (REWRITE_TAC[LENGTH] THEN ARITH_TAC);
4987  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
4988  (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);
4989
4990  (NEW_GOAL `k' = 4 /\ mcell k' V ul = mcell 4 V vl`);
4991  (MATCH_MP_TAC Ajripqn.AJRIPQN);
4992  (ASM_REWRITE_TAC[]);
4993  (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
4994  (REWRITE_WITH `mcell k' V ul INTER mcell 4 V vl = X`);
4995  (REWRITE_WITH `mcell 4 V vl = X`);
4996  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
4997  (SET_TAC[ASSUME `X = mcell k' V ul`]);
4998
4999  (REPEAT STRIP_TAC);
5000  (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE 
5001    `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);
5002  (SET_TAC[]);
5003  (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[]);
5004
5005  (COND_CASES_TAC);
5006  (NEW_GOAL `F`);
5007  (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
5008  (UP_ASM_TAC THEN MESON_TAC[]);
5009  (COND_CASES_TAC);
5010  (NEW_GOAL `F`);
5011  (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
5012  (UP_ASM_TAC THEN MESON_TAC[]);
5013  (COND_CASES_TAC);
5014
5015  (REWRITE_TAC[dihu4]);
5016
5017  (REWRITE_WITH `dihV (EL 0 (ul:(real^3)list)) (EL 1 ul) (EL 2 ul) (EL 3 ul) = 
5018    dihV u0 u1 u2 (u3:real^3)`);
5019
5020  (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
5021  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5022  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5023
5024  (NEW_GOAL `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);
5025  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5026  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
5027  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
5028                  CARD (set_of_list ul) = 3 + 1`);
5029  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5030  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5031  (ARITH_TAC);
5032
5033  (NEW_GOAL `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);
5034  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5035  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
5036  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
5037                  CARD (set_of_list ul) = 3 + 1`);
5038  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5039  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5040  (ARITH_TAC);
5041
5042  (NEW_GOAL `{EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = {u0, u1,u2,u3:real^3}`);
5043  (REWRITE_WITH `
5044     {EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = {u0, u1,u2,u3:real^3} <=>
5045     convex hull {EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = 
5046     convex hull {u0, u1,u2,u3:real^3}`);
5047  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5048  (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);
5049  (REPEAT STRIP_TAC);
5050
5051  (UNDISCH_TAC `~NULLSET X`);
5052  (REWRITE_TAC[]);
5053  (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; 
5054    ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);
5055  (COND_CASES_TAC);
5056  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
5057  (MATCH_MP_TAC BARV_3_EXPLICIT);
5058  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5059  (UP_ASM_TAC THEN STRIP_TAC);
5060  (ASM_REWRITE_TAC[set_of_list]);
5061  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5062  (EXISTS_TAC `affine hull {v0, v1, v2, v3:real^3}`);
5063  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
5064  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
5065  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
5066  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
5067  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
5068  (UNDISCH_TAC 
5069    `affine_dependent {EL 0 ul, EL 1 ul, EL 2 ul, (EL 3 ul):real^3}`);
5070  (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; 
5071                ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
5072
5073  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
5074
5075  (UNDISCH_TAC `~NULLSET X`);
5076  (REWRITE_TAC[]);
5077  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);
5078  (COND_CASES_TAC);
5079  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5080  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
5081  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
5082  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
5083  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
5084  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
5085  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
5086  (ASM_REWRITE_TAC[]);
5087  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
5088
5089  (REWRITE_WITH `convex hull {u0, u1, u2, u3:real^3} = X`);
5090  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);
5091  (COND_CASES_TAC);
5092  (MESON_TAC[]);
5093  (NEW_GOAL `F`);
5094  (UNDISCH_TAC `~NULLSET X`);
5095  (REWRITE_TAC[]);
5096  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);
5097  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
5098  (UP_ASM_TAC THEN MESON_TAC[]);
5099
5100  (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; 
5101    ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);
5102  (COND_CASES_TAC);
5103  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
5104  (MATCH_MP_TAC BARV_3_EXPLICIT);
5105  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5106  (UP_ASM_TAC THEN STRIP_TAC);
5107  (REWRITE_TAC[set_of_list; ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
5108  (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
5109  (NEW_GOAL `F`);
5110  (UNDISCH_TAC `~NULLSET X`);
5111  (REWRITE_TAC[]);
5112  (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; 
5113    ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);
5114  (COND_CASES_TAC);
5115  (NEW_GOAL `F`);
5116  (UP_ASM_TAC THEN UP_ASM_TAC THEN REWRITE_TAC[]);
5117  (UP_ASM_TAC THEN MESON_TAC[]);
5118  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
5119  (UP_ASM_TAC THEN MESON_TAC[]);
5120
5121  (UP_ASM_TAC THEN ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `1 = SUC 0`]);
5122  (STRIP_TAC);
5123
5124  (ASM_CASES_TAC `EL 2 ul = u2:real^3`);
5125  (NEW_GOAL `EL 3 ul = u3:real^3`);
5126  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
5127  (STRIP_TAC);
5128  (NEW_GOAL `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2:real^3}`);
5129  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5130  (UNDISCH_TAC `~coplanar {u0,u1,u2,u3:real^3}` THEN REWRITE_TAC[
5131    GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
5132    ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2:real^3}`; COPLANAR_3]);
5133  (ASM_REWRITE_TAC[]);
5134
5135  (NEW_GOAL `EL 2 ul = u3:real^3`);
5136  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
5137  (STRIP_TAC);
5138  (NEW_GOAL `{u0:real^3, u1, EL 2 ul, EL 3 ul} = {u0, u1, EL 3 ul}`);
5139  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5140  (UNDISCH_TAC `~coplanar {u0,u1,u2,u3:real^3}` THEN REWRITE_TAC[
5141    GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
5142    ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0,u1:real^3, EL 3 ul}`; COPLANAR_3]);
5143
5144  (NEW_GOAL `EL 3 ul = u2:real^3`);
5145  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
5146  (STRIP_TAC);
5147  (NEW_GOAL `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u3:real^3}`);
5148  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5149  (UNDISCH_TAC `~coplanar {u0,u1,u2,u3:real^3}` THEN REWRITE_TAC[
5150    GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
5151    ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u3:real^3}`; COPLANAR_3]);
5152  (ASM_REWRITE_TAC[]);
5153  (REWRITE_TAC[DIHV_SYM_2]);
5154
5155  (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);
5156  (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);
5157  (AP_THM_TAC THEN AP_TERM_TAC);
5158
5159  (REWRITE_WITH 
5160   `measurable (conic_cap u0 u1 r d) /\
5161              vol (conic_cap u0 u1 r d) =
5162              (if u1 = u0 \/ &1 <= d \/ r < &0
5163               then &0
5164               else &2 / &3 * pi * (&1 - d) * r pow 3)`);
5165  (MATCH_MP_TAC VOLUME_CONIC_CAP);
5166  (EXPAND_TAC "d");
5167  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
5168  (COND_CASES_TAC);
5169  (NEW_GOAL `F`);
5170  (UP_ASM_TAC THEN STRIP_TAC);
5171  (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN MESON_TAC[]);
5172  (UNDISCH_TAC `d < &1` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5173  (UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5174  (UP_ASM_TAC THEN MESON_TAC[]);
5175  (REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
5176
5177  (REWRITE_WITH `max d (--(&1)) = d`);
5178  (MATCH_MP_TAC (REAL_ARITH `&0 < d /\ --(&1) < &0 ==> max d (--(&1)) = d`));
5179  (REWRITE_TAC[REAL_NEG_LT0]);
5180  (STRIP_TAC);
5181  (EXPAND_TAC "d");
5182  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
5183  (REAL_ARITH_TAC);
5184
5185  (REWRITE_WITH `
5186   (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *   
5187   ((&2 * pi) / (&2 * pi))`);
5188  (REAL_ARITH_TAC);
5189  (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);
5190  (MATCH_MP_TAC REAL_DIV_REFL);
5191  (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);
5192  (REAL_ARITH_TAC);
5193  (NEW_GOAL `F`);
5194  (UP_ASM_TAC THEN UNDISCH_TAC `k' = 4 /\ mcell k' V ul = mcell 4 V vl`
5195    THEN MESON_TAC[]);
5196  (UP_ASM_TAC THEN MESON_TAC[]);
5197
5198 (* ========================================================================= *)
5199 (* OK here *)
5200
5201  (ASM_CASES_TAC `azim u0 u1 u3 (u2:real^3) < pi`);
5202  (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);
5203  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
5204  (STRIP_TAC);
5205  (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 u3 u2)`);
5206  (ASM_SIMP_TAC[WEDGE_LUNE]);
5207  (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d = 
5208                  conic_cap u0 u1 r d INTER L`);
5209  (SET_TAC[]);
5210  (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
5211
5212  (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER 
5213    aff_gt {u0, u1} {u3, u2} DIFF conic_cap u0 u1 r d INTER L = {}`);
5214  (EXPAND_TAC "L");
5215  (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);
5216  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));
5217  (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);
5218  (REWRITE_TAC[SET_RULE `A UNION {} = A`]);
5219  (EXPAND_TAC "L");
5220  (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);
5221
5222  (REWRITE_WITH `aff_ge {u0, u1:real^3} {u2, u3} =
5223                  aff_gt {u0, u1} {u2, u3} UNION 
5224    UNIONS {aff_ge {u0, u1} ({u2, u3} DELETE a) | a | a IN  {u2, u3}}`);
5225  (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);
5226  (REWRITE_TAC[Geomdetail.FINITE6]);
5227  (REWRITE_TAC[DISJOINT]);
5228
5229  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
5230  (NEW_GOAL `F`);
5231  (UNDISCH_TAC `~coplanar {u0, u1, u3, u2:real^3}`);
5232  (REWRITE_WITH `{u0, u1, u3, u2} = {u0, u1, u3:real^3}`);
5233  (UP_ASM_TAC THEN SET_TAC[]);
5234  (REWRITE_TAC[COPLANAR_3]);
5235  (UP_ASM_TAC THEN MESON_TAC[]);
5236
5237  (ASM_CASES_TAC `u3 IN {u0, u1:real^3}`);
5238  (NEW_GOAL `F`);
5239  (UNDISCH_TAC `~coplanar {u0, u1, u3, u2:real^3}`);
5240  (REWRITE_WITH `{u0, u1, u3, u2} = {u0, u1, u2:real^3}`);
5241  (UP_ASM_TAC THEN SET_TAC[]);
5242  (REWRITE_TAC[COPLANAR_3]);
5243  (UP_ASM_TAC THEN MESON_TAC[]);
5244  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5245
5246  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5247  (EXISTS_TAC 
5248   `UNIONS {aff_ge {u0, u1:real^3} ({u2, u3} DELETE a) | a | a IN {u2, u3}}`);
5249  (STRIP_TAC);
5250  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5251  (EXISTS_TAC 
5252   `aff_ge {u0, u1:real^3} {u2} UNION aff_ge {u0, u1:real^3} {u3}`);
5253  (STRIP_TAC);
5254  (MATCH_MP_TAC NEGLIGIBLE_UNION);
5255  (STRIP_TAC);
5256
5257  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5258  (EXISTS_TAC `affine hull {u0, u1:real^3, u2}`);
5259  (STRIP_TAC);
5260  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
5261  (REWRITE_WITH `{u0,u1,u2:real^3} = {u0,u1} UNION {u2}`);
5262  (SET_TAC[]);
5263  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
5264  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5265  (EXISTS_TAC `affine hull {u0, u1:real^3, u3}`);
5266  (STRIP_TAC);
5267  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
5268  (REWRITE_WITH `{u0,u1,u3:real^3} = {u0,u1} UNION {u3}`);
5269  (SET_TAC[]);
5270  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
5271  (REWRITE_TAC[SET_RULE 
5272   `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} = 
5273          aff_ge {u0, u1} ({m, s3} DELETE s3) 
5274    UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);
5275  (MATCH_MP_TAC (SET_RULE 
5276   `A SUBSET B /\ C SUBSET D ==> A UNION C SUBSET B UNION D`));
5277  (STRIP_TAC);
5278  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
5279  (STRIP_TAC);
5280  (SET_TAC[]);
5281
5282  (REWRITE_TAC[DISJOINT]);
5283  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
5284  (NEW_GOAL `F`);
5285  (UNDISCH_TAC `~coplanar {u0, u1, u3, u2:real^3}`);
5286  (REWRITE_WITH `{u0, u1, u3, u2} = {u0, u1, u3:real^3}`);
5287  (UP_ASM_TAC THEN SET_TAC[]);
5288  (REWRITE_TAC[COPLANAR_3]);
5289  (UP_ASM_TAC THEN MESON_TAC[]);
5290  (UP_ASM_TAC THEN SET_TAC[]);
5291
5292  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
5293  (STRIP_TAC);
5294  (SET_TAC[]);
5295  (REWRITE_TAC[DISJOINT]);
5296  (ASM_CASES_TAC `u3 IN {u0, u1:real^3}`);
5297  (NEW_GOAL `F`);
5298  (UNDISCH_TAC `~coplanar {u0, u1, u3, u2:real^3}`);
5299  (REWRITE_WITH `{u0, u1, u3, u2} = {u0, u1, u2:real^3}`);
5300  (UP_ASM_TAC THEN SET_TAC[]);
5301  (REWRITE_TAC[COPLANAR_3]);
5302  (UP_ASM_TAC THEN MESON_TAC[]);
5303  (UP_ASM_TAC THEN SET_TAC[]);
5304
5305  (SET_TAC[]);
5306
5307  (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);
5308  (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 u3 u2) =
5309              (if &1 < d \/ r < &0
5310               then &0
5311               else azim u0 u1 u3 u2 / &3 * (&1 - max d (-- &1)) * r pow 3)`);
5312  (NEW_GOAL `~collinear {u0:real^3, u1, u2} /\ ~collinear {u0, u1, u3}`);
5313  (STRIP_TAC);
5314  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
5315  (EXISTS_TAC `u3:real^3`);
5316  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
5317  (ASM_REWRITE_TAC[]);
5318  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
5319  (EXISTS_TAC `u2:real^3`);
5320  (ASM_REWRITE_TAC[]);
5321
5322  (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);
5323  (COND_CASES_TAC);
5324  (NEW_GOAL `F`);
5325
5326  (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN 
5327    UP_ASM_TAC THEN REAL_ARITH_TAC);
5328  (UP_ASM_TAC THEN MESON_TAC[]);
5329
5330  (REWRITE_WITH `azim (u0:real^3) u1 u3 u2 = dihV u0 u1 u3 u2`);
5331  (MATCH_MP_TAC AZIM_DIHV_SAME);
5332  (ASM_REWRITE_TAC[]);
5333  (STRIP_TAC);
5334
5335  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
5336  (EXISTS_TAC `u2:real^3`);
5337  (ASM_REWRITE_TAC[]);
5338  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
5339  (EXISTS_TAC `u3:real^3`);
5340  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
5341  (ASM_REWRITE_TAC[]);
5342
5343  (REWRITE_TAC[dihX]);
5344  (COND_CASES_TAC);
5345  (NEW_GOAL `F`);
5346  (UNDISCH_TAC `~NULLSET (X INTER D)`);
5347  (REWRITE_TAC[]);
5348  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5349  (EXISTS_TAC `X:real^3->bool`);
5350  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
5351  (UP_ASM_TAC THEN MESON_TAC[]);
5352
5353  (LET_TAC);
5354
5355  (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
5356  (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
5357            ul IN barV V 3 /\
5358            X = mcell k V ul /\
5359            initial_sublist [u0; u1] ul)`);
5360  (STRIP_TAC);
5361  (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
5362  (MATCH_MP_TAC SELECT_AX);
5363  (EXISTS_TAC `(4, vl:(real^3)list)`);
5364  (EXPAND_TAC "P");
5365  (REWRITE_TAC[BETA_THM]);
5366  (REWRITE_TAC[IN; ARITH_RULE `4 <= 4`] THEN ASM_REWRITE_TAC[]);
5367  (STRIP_TAC);
5368  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
5369
5370  (REWRITE_WITH `initial_sublist [u0;u1:real^3] [u0; u1; u2; u3] /\ 
5371                  LENGTH [u0;u1] = 1 + 1`);
5372  (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5373  (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
5374  (ASM_REWRITE_TAC[]);
5375  (REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5376  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
5377  (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);
5378
5379  (NEW_GOAL `k' = 4 /\ mcell k' V ul = mcell 4 V vl`);
5380  (MATCH_MP_TAC Ajripqn.AJRIPQN);
5381  (ASM_REWRITE_TAC[]);
5382  (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
5383  (REWRITE_WITH `mcell k' V ul INTER mcell 4 V vl = X`);
5384  (REWRITE_WITH `mcell 4 V vl = X`);
5385  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
5386  (SET_TAC[ASSUME `X = mcell k' V ul`]);
5387
5388  (REPEAT STRIP_TAC);
5389  (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE 
5390    `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);
5391  (SET_TAC[]);
5392  (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[]);
5393
5394  (COND_CASES_TAC);
5395  (NEW_GOAL `F`);
5396  (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
5397  (UP_ASM_TAC THEN MESON_TAC[]);
5398  (COND_CASES_TAC);
5399  (NEW_GOAL `F`);
5400  (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
5401  (UP_ASM_TAC THEN MESON_TAC[]);
5402  (COND_CASES_TAC);
5403
5404  (REWRITE_TAC[dihu4]);
5405
5406  (REWRITE_WITH `dihV (EL 0 (ul:(real^3)list)) (EL 1 ul) (EL 2 ul) (EL 3 ul) = 
5407    dihV u0 u1 u2 (u3:real^3)`);
5408
5409  (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
5410  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5411  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5412
5413  (NEW_GOAL `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);
5414  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5415  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
5416  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
5417                  CARD (set_of_list ul) = 3 + 1`);
5418  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5419  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5420  (ARITH_TAC);
5421
5422  (NEW_GOAL `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);
5423  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5424  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
5425  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
5426                  CARD (set_of_list ul) = 3 + 1`);
5427  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5428  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5429  (ARITH_TAC);
5430
5431  (NEW_GOAL `{EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = {u0, u1,u2,u3:real^3}`);
5432  (REWRITE_WITH `
5433     {EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = {u0, u1,u2,u3:real^3} <=>
5434     convex hull {EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = 
5435     convex hull {u0, u1,u2,u3:real^3}`);
5436  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5437  (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);
5438  (REPEAT STRIP_TAC);
5439
5440  (UNDISCH_TAC `~NULLSET X`);
5441  (REWRITE_TAC[]);
5442  (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; 
5443    ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);
5444  (COND_CASES_TAC);
5445  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
5446  (MATCH_MP_TAC BARV_3_EXPLICIT);
5447  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5448  (UP_ASM_TAC THEN STRIP_TAC);
5449  (ASM_REWRITE_TAC[set_of_list]);
5450  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5451  (EXISTS_TAC `affine hull {v0, v1, v2, v3:real^3}`);
5452  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
5453  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
5454  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
5455  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
5456  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
5457  (UNDISCH_TAC 
5458    `affine_dependent {EL 0 ul, EL 1 ul, EL 2 ul, (EL 3 ul):real^3}`);
5459  (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; 
5460                ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
5461
5462  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
5463
5464  (UNDISCH_TAC `~NULLSET X`);
5465  (REWRITE_TAC[]);
5466  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);
5467  (COND_CASES_TAC);
5468  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5469  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
5470  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
5471  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
5472  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
5473  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
5474  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
5475  (ASM_REWRITE_TAC[]);
5476  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
5477
5478  (REWRITE_WITH `convex hull {u0, u1, u2, u3:real^3} = X`);
5479  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);
5480  (COND_CASES_TAC);
5481  (MESON_TAC[]);
5482  (NEW_GOAL `F`);
5483  (UNDISCH_TAC `~NULLSET X`);
5484  (REWRITE_TAC[]);
5485  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);
5486  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
5487  (UP_ASM_TAC THEN MESON_TAC[]);
5488
5489  (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; 
5490    ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);
5491  (COND_CASES_TAC);
5492  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
5493  (MATCH_MP_TAC BARV_3_EXPLICIT);
5494  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5495  (UP_ASM_TAC THEN STRIP_TAC);
5496  (REWRITE_TAC[set_of_list; ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
5497  (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
5498  (NEW_GOAL `F`);
5499  (UNDISCH_TAC `~NULLSET X`);
5500  (REWRITE_TAC[]);
5501  (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; 
5502    ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);
5503  (COND_CASES_TAC);
5504  (NEW_GOAL `F`);
5505  (UP_ASM_TAC THEN UP_ASM_TAC THEN REWRITE_TAC[]);
5506  (UP_ASM_TAC THEN MESON_TAC[]);
5507  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
5508  (UP_ASM_TAC THEN MESON_TAC[]);
5509
5510  (UP_ASM_TAC THEN ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `1 = SUC 0`]);
5511  (STRIP_TAC);
5512
5513  (ASM_CASES_TAC `EL 2 ul = u2:real^3`);
5514  (NEW_GOAL `EL 3 ul = u3:real^3`);
5515  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
5516  (STRIP_TAC);
5517  (NEW_GOAL `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2:real^3}`);
5518  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5519  (UNDISCH_TAC `~coplanar {u0,u1,u3,u2:real^3}`);
5520  (REWRITE_TAC[]);
5521  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
5522  (REWRITE_TAC[
5523    GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
5524    ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2:real^3}`; COPLANAR_3]);
5525  (ASM_REWRITE_TAC[]);
5526
5527  (NEW_GOAL `EL 2 ul = u3:real^3`);
5528  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
5529  (STRIP_TAC);
5530  (NEW_GOAL `{u0:real^3, u1, EL 2 ul, EL 3 ul} = {u0, u1, EL 3 ul}`);
5531  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5532  (UNDISCH_TAC `~coplanar {u0,u1,u3,u2:real^3}`);
5533  (REWRITE_TAC[]);
5534  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
5535
5536  (REWRITE_TAC[
5537    GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
5538    ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0,u1:real^3, EL 3 ul}`; COPLANAR_3]);
5539  (NEW_GOAL `EL 3 ul = u2:real^3`);
5540  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
5541  (STRIP_TAC);
5542  (NEW_GOAL `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u3:real^3}`);
5543  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5544  (UNDISCH_TAC `~coplanar {u0,u1,u3,u2:real^3}`);
5545  (REWRITE_TAC[]);
5546  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
5547
5548  (REWRITE_TAC[
5549    GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
5550    ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u3:real^3}`; COPLANAR_3]);
5551  (ASM_REWRITE_TAC[]);
5552  (REWRITE_TAC[DIHV_SYM_2]);
5553
5554  (REWRITE_TAC[DIHV_SYM_2]);
5555  (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);
5556  (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);
5557  (AP_THM_TAC THEN AP_TERM_TAC);
5558
5559  (REWRITE_WITH 
5560   `measurable (conic_cap u0 u1 r d) /\
5561              vol (conic_cap u0 u1 r d) =
5562              (if u1 = u0 \/ &1 <= d \/ r < &0
5563               then &0
5564               else &2 / &3 * pi * (&1 - d) * r pow 3)`);
5565  (MATCH_MP_TAC VOLUME_CONIC_CAP);
5566  (EXPAND_TAC "d");
5567  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
5568  (COND_CASES_TAC);
5569  (NEW_GOAL `F`);
5570  (UP_ASM_TAC THEN STRIP_TAC);
5571  (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN MESON_TAC[]);
5572  (UNDISCH_TAC `d < &1` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5573  (UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5574  (UP_ASM_TAC THEN MESON_TAC[]);
5575
5576  (REWRITE_WITH `max d (--(&1)) = d`);
5577  (MATCH_MP_TAC (REAL_ARITH `&0 < d /\ --(&1) < &0 ==> max d (--(&1)) = d`));
5578  (REWRITE_TAC[REAL_NEG_LT0]);
5579  (STRIP_TAC);
5580  (EXPAND_TAC "d");
5581  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
5582  (REAL_ARITH_TAC);
5583
5584  (REWRITE_WITH `
5585   (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *   
5586   ((&2 * pi) / (&2 * pi))`);
5587  (REAL_ARITH_TAC);
5588  (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);
5589  (MATCH_MP_TAC REAL_DIV_REFL);
5590  (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);
5591  (REAL_ARITH_TAC);
5592  (NEW_GOAL `F`);
5593  (UP_ASM_TAC THEN UNDISCH_TAC `k' = 4 /\ mcell k' V ul = mcell 4 V vl`
5594    THEN MESON_TAC[]);
5595  (UP_ASM_TAC THEN MESON_TAC[]);
5596
5597 (* ========================================================================== *)
5598
5599  (NEW_GOAL `F`);
5600  (NEW_GOAL `azim (u0:real^3) u1 u3 u2 = 
5601   (if azim u0 u1 u2 u3 = &0 then &0 else &2 * pi - azim u0 u1 u2 u3)`);
5602  (MATCH_MP_TAC AZIM_COMPL);
5603  (STRIP_TAC);
5604
5605  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
5606  (EXISTS_TAC `u3:real^3`);
5607  (ASM_REWRITE_TAC[]);
5608  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
5609  (EXISTS_TAC `u2:real^3`);
5610  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b, d, c}`]);
5611  (ASM_REWRITE_TAC[]);
5612  (UP_ASM_TAC THEN COND_CASES_TAC);
5613  (NEW_GOAL `F`);
5614  (NEW_GOAL `(&0 < pi)`);
5615  (REWRITE_TAC[PI_POS]);
5616  (UNDISCH_TAC `~(azim (u0:real^3) u1 u2 u3 < pi)`);
5617  (ASM_REWRITE_TAC[]);
5618  (UP_ASM_TAC THEN MESON_TAC[]);
5619  (STRIP_TAC);
5620
5621  (NEW_GOAL `azim (u0:real^3) u1 u2 u3 = pi`);
5622  (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5623  (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);
5624  (REWRITE_TAC[] THEN MATCH_MP_TAC AZIM_EQ_0_PI_IMP_COPLANAR);
5625  (ASM_REWRITE_TAC[]);
5626  (UP_ASM_TAC THEN MESON_TAC[]);
5627
5628 (* ========================================================================= *)
5629 (*  Case k = 3                                                               *)
5630 (* ========================================================================= *)
5631
5632  (NEW_GOAL `k = 3`);
5633  (UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC `2 <= k` THEN ARITH_TAC);
5634  (NEW_GOAL `?u2 u3. vl = [u0; u1;u2;u3:real^3]`);
5635  (NEW_GOAL `?v0 v1 u2 u3. vl = [v0; v1;u2;u3:real^3]`);
5636  (MATCH_MP_TAC BARV_3_EXPLICIT);
5637  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5638  (UP_ASM_TAC THEN STRIP_TAC);
5639  (EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
5640
5641  (REWRITE_WITH `u0 = v0:real^3`);
5642  (REWRITE_WITH `v0:real^3 = HD (truncate_simplex 1 vl)`);
5643  (REWRITE_TAC[ASSUME `vl = [v0;v1;u2;u3:real^3]`; 
5644    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
5645  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
5646
5647  (REWRITE_WITH `u1 = v1:real^3`);
5648  (REWRITE_WITH `v1:real^3 = HD (TL (truncate_simplex 1 vl))`);
5649  (REWRITE_TAC[ASSUME `vl = [v0;v1;u2;u3:real^3]`; 
5650    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
5651  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
5652  (ASM_REWRITE_TAC[]);
5653  (UP_ASM_TAC THEN STRIP_TAC);
5654
5655  (ABBREV_TAC `L = aff_ge{u0, u1} {u2, mxi V vl}`);
5656
5657  (REWRITE_WITH `vol (X INTER D) = vol (L INTER D)`);
5658  (AP_TERM_TAC);
5659  (ASM_SIMP_TAC[MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2; 
5660    mcell3; set_of_list; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
5661  (COND_CASES_TAC);
5662  (ABBREV_TAC `m = mxi V vl`);
5663  (REWRITE_WITH `mxi V [u0; u1; u2; u3] = m`);
5664  (EXPAND_TAC "m" THEN DEL_TAC THEN ASM_REWRITE_TAC[]);
5665
5666  (EXPAND_TAC "L");
5667  (REWRITE_TAC[SET_RULE `A = B <=> A SUBSET B /\ B SUBSET A`]);
5668  (STRIP_TAC);
5669  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> A INTER X SUBSET B INTER X`));
5670  (REWRITE_TAC[Marchal_cells_2_new.CONVEX_HULL_4_SUBSET_AFF_GE_2_2]);
5671  (MATCH_MP_TAC (SET_RULE `(!x. x IN A /\ x IN B ==> x IN C) ==>
5672                             A INTER B SUBSET C INTER B`));
5673  (NEW_GOAL `DISJOINT {u0,u1:real^3} {u2, m}`);
5674  (REWRITE_TAC[DISJOINT]);
5675  (MATCH_MP_TAC (MESON[] `(~A:bool ==> F) ==> A`));
5676  (STRIP_TAC);
5677  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
5678  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5679  (EXISTS_TAC `X:real^3->bool` THEN REWRITE_TAC[SET_RULE `A INTER X SUBSET A`]);
5680
5681  (ASM_SIMP_TAC[MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2; 
5682    mcell3; set_of_list; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
5683  (REWRITE_WITH `mxi V [u0; u1; u2; u3] = m`);
5684  (EXPAND_TAC "m" THEN REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
5685  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5686  (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
5687  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
5688  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
5689  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
5690
5691  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
5692  (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, m:real^3}`);
5693  (UP_ASM_TAC THEN SET_TAC[]);
5694  (REWRITE_TAC[COPLANAR_3]);
5695  (NEW_GOAL `m IN {u0, u1:real^3}`);
5696  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5697  (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, u2:real^3}`);
5698  (UP_ASM_TAC THEN SET_TAC[]);
5699  (REWRITE_TAC[COPLANAR_3]);
5700
5701  (SIMP_TAC[ASSUME `DISJOINT {u0, u1} {u2, m:real^3}`; AFF_GE_2_2]);
5702  (REWRITE_TAC[CONVEX_HULL_4; IN; IN_ELIM_THM]);
5703  (REPEAT STRIP_TAC);
5704  (EXISTS_TAC `t1:real` THEN EXISTS_TAC `t2:real` THEN 
5705    EXISTS_TAC `t3:real` THEN EXISTS_TAC `t4:real`);
5706  (ASM_REWRITE_TAC[]);
5707  (STRIP_TAC);
5708
5709  (REWRITE_TAC[REAL_ARITH `&0 <= a <=> (a < &0 ==> F)`]);
5710  (STRIP_TAC);
5711  (UNDISCH_TAC `conic_cap (u0:real^3) u1 r d x`);
5712  (REWRITE_TAC[MESON[IN] `conic_cap u0 u1 r d x <=> x IN conic_cap u0 u1 r d`;
5713    GSYM (ASSUME `D = conic_cap (u0:real^3) u1 r d`)]);
5714  (EXPAND_TAC "D");
5715  (REWRITE_TAC[IN_INTER; MESON[] `~(x:bool /\ y) <=> (~x \/ ~y)`]);
5716  (DISJ1_TAC);
5717  (REWRITE_TAC[IN_BALL] THEN STRIP_TAC);
5718
5719  (NEW_GOAL `(?b1:real. b1 IN P1 /\ (!x. x IN P1 ==> b1 <= x))`);
5720  (FIRST_ASSUM MATCH_MP_TAC);
5721  (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
5722  (EXISTS_TAC `(f1:(real^3)list -> real) vl`);
5723  (EXPAND_TAC "P1" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
5724  (EXISTS_TAC `vl:(real^3)list`);
5725  (ASM_REWRITE_TAC[]);
5726  (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
5727  (ASM_REWRITE_TAC[]);
5728  (STRIP_TAC);
5729  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
5730  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5731  (EXISTS_TAC `X INTER (C:real^3->bool)`);
5732  (STRIP_TAC);
5733  (ASM_REWRITE_TAC[]);
5734  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
5735  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
5736  (MATCH_MP_TAC (SET_RULE 
5737   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
5738  (STRIP_TAC);
5739  (MATCH_MP_TAC SUBSET_BALL);
5740  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
5741  (MATCH_MP_TAC RCONE_GT_SUBSET);
5742  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
5743  (FIRST_X_ASSUM CHOOSE_TAC);
5744
5745  (NEW_GOAL `r1 = (@b. b IN P1 /\ (!x. x IN P1 ==> b <= x:real))`);
5746  (EXPAND_TAC "r1");
5747  (COND_CASES_TAC);
5748  (NEW_GOAL `F`);
5749  (UP_ASM_TAC THEN REWRITE_TAC[]);
5750  (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
5751  (EXISTS_TAC `(f1:(real^3)list -> real) vl`);
5752  (EXPAND_TAC "P1" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
5753  (EXISTS_TAC `vl:(real^3)list`);
5754  (ASM_REWRITE_TAC[]);
5755  (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
5756  (ASM_SIMP_TAC[]);
5757  (STRIP_TAC);
5758  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
5759  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5760  (EXISTS_TAC `X INTER (C:real^3->bool)`);
5761  (STRIP_TAC);
5762  (ASM_REWRITE_TAC[]);
5763  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
5764  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
5765  (MATCH_MP_TAC (SET_RULE 
5766   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
5767  (STRIP_TAC);
5768  (MATCH_MP_TAC SUBSET_BALL);
5769  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
5770  (MATCH_MP_TAC RCONE_GT_SUBSET);
5771  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
5772  (UP_ASM_TAC THEN MESON_TAC[]);
5773  (REWRITE_TAC[]);
5774
5775  (ABBREV_TAC `Q1 = (\b:real. b IN P1 /\ (!x. x IN P1 ==> b <= x))`);
5776  (NEW_GOAL `(Q1:real->bool) r1`);
5777  (ASM_REWRITE_TAC[]);
5778  (MATCH_MP_TAC SELECT_AX);
5779  (EXISTS_TAC `b1:real` THEN EXPAND_TAC "Q1");
5780  (ASM_REWRITE_TAC[]);
5781  (UP_ASM_TAC THEN EXPAND_TAC "Q1" THEN REPEAT STRIP_TAC);
5782  (NEW_GOAL `r1 <= f1 (vl:(real^3)list)`);
5783  (FIRST_ASSUM MATCH_MP_TAC);
5784  (EXPAND_TAC "P1" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
5785  (EXISTS_TAC `vl:(real^3)list`);
5786  (ASM_REWRITE_TAC[]);
5787  (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
5788  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
5789  (STRIP_TAC);
5790  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
5791  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5792  (EXISTS_TAC `X INTER (C:real^3->bool)`);
5793  (STRIP_TAC);
5794  (ASM_REWRITE_TAC[]);
5795  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
5796  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
5797  (MATCH_MP_TAC (SET_RULE 
5798   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
5799  (STRIP_TAC);
5800  (MATCH_MP_TAC SUBSET_BALL);
5801  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
5802  (MATCH_MP_TAC RCONE_GT_SUBSET);
5803  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
5804
5805  (UP_ASM_TAC THEN EXPAND_TAC "f1" THEN REWRITE_TAC[EL; HD; TL; 
5806    ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; 
5807    ASSUME `vl= [u0; u1; u2; u3:real^3]`]);
5808  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
5809  (EXPAND_TAC "m");
5810  (REWRITE_TAC[ASSUME `vl = [u0;u1;u2;u3:real^3]`]);
5811  (STRIP_TAC);
5812
5813  (NEW_GOAL `!v. v IN affine hull {u1, u2, m:real^3} ==> r1 <= dist (u0, v)`);
5814  (REPEAT STRIP_TAC);
5815  (NEW_GOAL `dist (u0,closest_point (affine hull {u1, u2, m}) u0) <= 
5816              dist (u0, v:real^3)`);
5817  (MATCH_MP_TAC CLOSEST_POINT_LE);
5818  (ASM_REWRITE_TAC[CLOSED_AFFINE_HULL]);
5819  (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5820
5821  (NEW_GOAL `r <= dist (u0:real^3, x)`);
5822  (REWRITE_TAC[dist]);
5823  (REWRITE_WITH `u0:real^3 - x = (t1 + t2 + t3 + t4) % u0 - x`);
5824  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
5825  (REWRITE_TAC[VECTOR_ADD_RDISTRIB]);
5826  (ASM_REWRITE_TAC[VECTOR_ARITH `(t1 % u0 + t2 % u0 + t3 % u0 + t4 % u0) -
5827   (t1 % u0 + t2 % u1 + t3 % u2 + t4 % u3) = 
5828   (t2 + t3 + t4) % u0 - (t2 % u1 + t3 % u2 + t4 % u3)`]);
5829  (ABBREV_TAC `y:real^3 = t2 /(t2 + t3 + t4) % u1 + 
5830                           t3 /(t2 + t3 + t4) % u2 + 
5831                           t4 /(t2 + t3 + t4) % m`);
5832  (REWRITE_WITH `(t2 % u1 + t3 % u2 + t4 % m) = (t2 + t3 + t4) % (y:real^3)`);
5833  (EXPAND_TAC "y");
5834  (REWRITE_TAC[VECTOR_ARITH `x % (t2 / x % u1 +  t3 / x % u2 + t4 / x % u3) = 
5835    (x / x) % (t2 % u1 + t3 % u2 + t4 % u3)`]);
5836  (REWRITE_WITH `(t2 + t3 + t4) / (t2 + t3 + t4) = &1`);
5837  (MATCH_MP_TAC REAL_DIV_REFL);
5838  (UNDISCH_TAC `t1 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1`);
5839  (REAL_ARITH_TAC);
5840  (VECTOR_ARITH_TAC);
5841  (REWRITE_TAC[VECTOR_ARITH `a % x - a % y = a % (x - y)`; NORM_MUL]);
5842
5843  (NEW_GOAL `&1 < t2 + t3 + t4`);
5844  (UNDISCH_TAC `t1 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1`);
5845  (REAL_ARITH_TAC);
5846  (REWRITE_WITH `abs (t2 + t3 + t4) = t2 + t3 + t4`);
5847  (REWRITE_TAC[REAL_ABS_REFL] THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5848  (REWRITE_TAC[GSYM dist]);
5849  (NEW_GOAL `r1 <= dist (u0, y:real^3)`);
5850  (FIRST_ASSUM MATCH_MP_TAC);
5851  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
5852  (EXISTS_TAC `t2 / (t2 + t3 + t4)` THEN EXISTS_TAC `t3 / (t2 + t3 + t4)` THEN
5853    EXISTS_TAC `t4 / (t2 + t3 + t4)`);
5854  (STRIP_TAC);
5855  (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);
5856  (MATCH_MP_TAC REAL_DIV_REFL);
5857  (UP_ASM_TAC THEN REAL_ARITH_TAC);
5858  (ASM_REWRITE_TAC[]);
5859
5860  (NEW_GOAL `r1 <= (t2 + t3 + t4) * dist (u0,y:real^3)`);
5861  (NEW_GOAL `dist (u0,y) <= (t2 + t3 + t4) * dist (u0,y:real^3)`);
5862  (REWRITE_TAC[REAL_ARITH `a <= b * a <=> &0 <= (b - &1) * a`]);
5863  (MATCH_MP_TAC REAL_LE_MUL);
5864  (REWRITE_TAC[DIST_POS_LE]);
5865  (DEL_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5866  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5867  (EXPAND_TAC "r" THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5868  (UNDISCH_TAC `dist (u0, x:real^3) < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5869
5870 (* ========================================================================== *)
5871
5872  (REWRITE_TAC[REAL_ARITH `&0 <= a <=> (a < &0 ==> F)`]);
5873  (STRIP_TAC);
5874  (UNDISCH_TAC `conic_cap (u0:real^3) u1 r d x`);
5875  (REWRITE_TAC[MESON[IN] `conic_cap u0 u1 r d x <=> x IN conic_cap u0 u1 r d`;
5876    GSYM (ASSUME `D = conic_cap (u0:real^3) u1 r d`)]);
5877  (EXPAND_TAC "D");
5878  (REWRITE_TAC[IN_INTER; MESON[] `~(x:bool /\ y) <=> (~x \/ ~y)`]);
5879  (DISJ2_TAC);
5880  (REWRITE_TAC[IN; IN_ELIM_THM; rcone_gt; rconesgn] THEN STRIP_TAC);
5881
5882  (NEW_GOAL `(?b1:real. b1 IN P3 /\ (!x. x IN P3 ==> x <= b1))`);
5883  (FIRST_ASSUM MATCH_MP_TAC);
5884  (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
5885  (EXISTS_TAC `(f3:(real^3)list -> real) vl`);
5886  (EXPAND_TAC "P3" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
5887  (EXISTS_TAC `vl:(real^3)list`);
5888  (ASM_REWRITE_TAC[]);
5889  (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
5890  (ASM_SIMP_TAC[MCELL_EXPLICIT]);
5891  (STRIP_TAC);
5892  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
5893  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5894  (EXISTS_TAC `X INTER (C:real^3->bool)`);
5895  (STRIP_TAC);
5896  (ASM_REWRITE_TAC[]);
5897  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
5898  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
5899  (MATCH_MP_TAC (SET_RULE 
5900   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
5901  (STRIP_TAC);
5902  (MATCH_MP_TAC SUBSET_BALL);
5903  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
5904  (MATCH_MP_TAC RCONE_GT_SUBSET);
5905  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
5906  (FIRST_X_ASSUM CHOOSE_TAC);
5907
5908  (NEW_GOAL `d1 = (@b. b IN P3 /\ (!x. x IN P3 ==> x <= b:real))`);
5909  (EXPAND_TAC "d1");
5910  (COND_CASES_TAC);
5911  (NEW_GOAL `F`);
5912  (UP_ASM_TAC THEN REWRITE_TAC[]);
5913  (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
5914  (EXISTS_TAC `(f3:(real^3)list -> real) vl`);
5915  (EXPAND_TAC "P3" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
5916  (EXISTS_TAC `vl:(real^3)list`);
5917  (ASM_REWRITE_TAC[]);
5918  (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
5919  (ASM_SIMP_TAC[MCELL_EXPLICIT]);
5920  (STRIP_TAC);
5921  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
5922  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5923  (EXISTS_TAC `X INTER (C:real^3->bool)`);
5924  (STRIP_TAC);
5925  (ASM_REWRITE_TAC[]);
5926  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
5927  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
5928  (MATCH_MP_TAC (SET_RULE 
5929   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
5930  (STRIP_TAC);
5931  (MATCH_MP_TAC SUBSET_BALL);
5932  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
5933  (MATCH_MP_TAC RCONE_GT_SUBSET);
5934  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
5935  (UP_ASM_TAC THEN MESON_TAC[]);
5936  (REWRITE_TAC[]);
5937
5938  (ABBREV_TAC `Q1 = (\b:real. b IN P3 /\ (!x. x IN P3 ==> x <= b))`);
5939  (NEW_GOAL `(Q1:real->bool) d1`);
5940  (ASM_REWRITE_TAC[]);
5941  (MATCH_MP_TAC SELECT_AX);
5942  (EXISTS_TAC `b1:real` THEN EXPAND_TAC "Q1");
5943  (ASM_REWRITE_TAC[]);
5944  (UP_ASM_TAC THEN EXPAND_TAC "Q1" THEN REPEAT STRIP_TAC);
5945
5946  (NEW_GOAL `f3 (vl:(real^3)list) <= d1`);
5947  (FIRST_ASSUM MATCH_MP_TAC);
5948  (EXPAND_TAC "P3" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
5949  (EXISTS_TAC `vl:(real^3)list`);
5950  (ASM_REWRITE_TAC[]);
5951  (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
5952  (ASM_SIMP_TAC[MCELL_EXPLICIT]);
5953  (STRIP_TAC);
5954  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
5955  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5956  (EXISTS_TAC `X INTER (C:real^3->bool)`);
5957  (STRIP_TAC);
5958  (ASM_REWRITE_TAC[]);
5959  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
5960  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
5961  (MATCH_MP_TAC (SET_RULE 
5962   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
5963  (STRIP_TAC);
5964  (MATCH_MP_TAC SUBSET_BALL);
5965  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
5966  (MATCH_MP_TAC RCONE_GT_SUBSET);
5967  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
5968
5969  (UP_ASM_TAC THEN EXPAND_TAC "f3");
5970  (REWRITE_TAC[EL; HD; TL; 
5971    ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; ASSUME `mxi V vl = m`; 
5972    ASSUME `vl= [u0; u1; u2; u3:real^3]`] THEN STRIP_TAC);
5973
5974  (ABBREV_TAC `xx = smallest_angle_line u2 m u0 u1`);
5975
5976  (MP_TAC (ASSUME `smallest_angle_line u2 m u0 u1 = xx`));
5977  (REWRITE_TAC[smallest_angle_line; smallest_angle_set]);
5978  (ABBREV_TAC `Q2 = 
5979  (\x:real^3. x IN convex hull {u2, m} /\
5980              (!y. y IN convex hull {u2, m}
5981                   ==> ((y - u0) dot (u1 - u0)) /
5982                       (norm (y - u0) * norm (u1 - u0)) <=
5983                       ((x - u0) dot (u1 - u0)) /
5984                       (norm (x - u0) * norm (u1 - u0))))`);
5985  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN STRIP_TAC);
5986  (NEW_GOAL `(Q2:real^3->bool) xx`);
5987  (ONCE_ASM_REWRITE_TAC[]);
5988  (MATCH_MP_TAC SELECT_AX);
5989  (EXPAND_TAC "Q2");
5990
5991  (MATCH_MP_TAC SMALLEST_ANGLE_LINE_EXISTS);
5992  (STRIP_TAC);
5993  (ASM_REWRITE_TAC[]);
5994  (STRIP_TAC);
5995
5996  (UNDISCH_TAC `~NULLSET (X INTER D)`);
5997  (REWRITE_TAC[]);
5998  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5999  (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);
6000  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell3; set_of_list;TRUNCATE_SIMPLEX_EXPLICIT_2;
6001     SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6002  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6003  (EXPAND_TAC "m");
6004  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6005
6006  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6007
6008  (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
6009  (STRIP_TAC);
6010  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6011  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6012  (REWRITE_TAC[coplanar]);
6013  (UNDISCH_TAC `u0 IN convex hull {u2, m:real^3}`);
6014  (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
6015  (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
6016    EXISTS_TAC `m:real^3`);
6017  (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));
6018  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
6019  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
6020  (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
6021  (STRIP_TAC);
6022  (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);
6023  (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
6024  (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6025  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
6026  (SET_TAC[]);
6027
6028  (UP_ASM_TAC THEN EXPAND_TAC "Q2");
6029  (STRIP_TAC);
6030  (ABBREV_TAC `g = (\y:real^3. ((y - u0) dot (u1 - u0)) / 
6031                                (norm (y - u0) * norm (u1 - u0)))`);
6032
6033  (NEW_GOAL `d < (g:real^3->real) x`);
6034  (EXPAND_TAC "g");
6035  (REWRITE_WITH 
6036   `d < ((x - u0) dot (u1 - u0)) / (norm (x - u0) * norm (u1 - u0:real^3)) <=>
6037    d * (norm (x - u0) * norm (u1 - u0)) < (x - u0) dot (u1 - u0)`);
6038  (MATCH_MP_TAC REAL_LT_RDIV_EQ);
6039  (MATCH_MP_TAC (REAL_ARITH `&0 <= a /\ ~(a = &0) ==> &0 < a`));
6040  (STRIP_TAC);
6041  (MATCH_MP_TAC REAL_LE_MUL);
6042  (ASM_REWRITE_TAC[NORM_POS_LE]);
6043  (REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0; VECTOR_ARITH `x - y = vec 0 <=> x = y`]);
6044  (ASM_REWRITE_TAC[]);
6045  (REWRITE_WITH `t1 % u0 + t2 % u1 + t3 % u2 + t4 % m = u0:real^3 <=>
6046   t1 % u0 + t2 % u1 + t3 % u2 + t4 % m = (t1 + t2 + t3 + t4) % u0`);
6047  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
6048  (REWRITE_TAC[VECTOR_ARITH `t1 % u0 + u = (t1 + t2) % u0 <=> u = t2 % u0`]);
6049  (STRIP_TAC);
6050
6051  (MP_TAC (ASSUME `~NULLSET (X INTER D)`) THEN REWRITE_TAC[]);
6052  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6053  (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);
6054  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell3;set_of_list; 
6055    TRUNCATE_SIMPLEX_EXPLICIT_2; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6056  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6057  (EXPAND_TAC "m");
6058  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6059  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6060
6061  (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
6062  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6063  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6064  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6065  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
6066  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
6067  (REWRITE_TAC[affine_dependent]);
6068  (EXISTS_TAC `u1:real^3`);
6069  (STRIP_TAC);
6070  (SET_TAC[]);
6071
6072  (NEW_GOAL `~(u1 IN {u0, u2, m:real^3})`);
6073  (STRIP_TAC);
6074  (MP_TAC (ASSUME `~NULLSET (X INTER D)`) THEN REWRITE_TAC[]);
6075  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6076  (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);
6077  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell3;set_of_list; 
6078    TRUNCATE_SIMPLEX_EXPLICIT_2; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6079  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6080  (EXPAND_TAC "m");
6081  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6082  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6083  (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
6084  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6085  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6086  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6087  (REWRITE_WITH `{u0, u1, u2, m} = {u0:real^3,u2, m}`);
6088  (UP_ASM_TAC THEN SET_TAC[]);
6089  (REWRITE_TAC[COPLANAR_3]);
6090  (SET_TAC[]);
6091  (REWRITE_WITH `{u0, u1, u2, m} DELETE u1 = {u0, u2, m:real^3}`);
6092  (UP_ASM_TAC THEN SET_TAC[]);
6093  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
6094  (EXISTS_TAC `(t2 + t3 + t4) / t2`);
6095  (EXISTS_TAC `(-- t3) / t2`);
6096  (EXISTS_TAC `(-- t4) / t2`);
6097
6098  (STRIP_TAC);
6099  (REWRITE_WITH `(t2 + t3 + t4) / t2 + --t3 / t2 + --t4 / t2 = t2 / t2`);
6100  (REAL_ARITH_TAC);
6101  (MATCH_MP_TAC REAL_DIV_REFL);
6102  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
6103  (REWRITE_WITH 
6104   `u1 = (t2 + t3 + t4) / t2 % u0 + --t3 / t2 % u2 + --t4 / t2 % m:real^3 <=> 
6105    u1 = (&1 / t2) % ((t2 + t3 + t4) % u0 - t3 % u2 - t4 % m)`);
6106  (VECTOR_ARITH_TAC);
6107  (REWRITE_TAC[GSYM (ASSUME `t2 % u1 + t3 % u2 + t4 % m = 
6108                              (t2 + t3 + t4) % u0:real^3`)]);
6109  (REWRITE_TAC[VECTOR_ARITH 
6110   `(t2 % u1 + t3 % u2 + t4 % u3) - t3 % u2 - t4 % u3 = t2 % u1`]);
6111  (REWRITE_TAC[VECTOR_MUL_ASSOC]);
6112  (REWRITE_WITH `&1 / t2 * t2 = &1`);
6113  (REWRITE_TAC[REAL_ARITH `&1 / t2 * t2 = t2 / t2`]);
6114  (MATCH_MP_TAC REAL_DIV_REFL);
6115  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
6116  (VECTOR_ARITH_TAC);
6117  (SET_TAC[]);
6118  (REWRITE_TAC[REAL_ARITH `a * b * c < d <=> d > b * c * a`; GSYM dist]);
6119  (ASM_REWRITE_TAC[]);
6120
6121  (NEW_GOAL `g x <= (g:real^3->real) xx`);
6122  (NEW_GOAL `!y. y IN convex hull {u2 , m:real^3} ==> g y <= g xx`);
6123  (EXPAND_TAC "g" THEN ASM_REWRITE_TAC[]);
6124  (NEW_GOAL `&0 < (t3 + t4)`);
6125  (MATCH_MP_TAC (REAL_ARITH `(&0 <= x) /\ ~(x = &0)  ==> &0 < x`));
6126  (STRIP_TAC);
6127  (MATCH_MP_TAC REAL_LE_ADD);
6128  (ASM_REWRITE_TAC[]);
6129  (STRIP_TAC);
6130  (NEW_GOAL `t3 = &0 /\ t4 = &0`);
6131  (UNDISCH_TAC `&0 <= t3` THEN UNDISCH_TAC `&0 <= t4` THEN 
6132    UP_ASM_TAC THEN REAL_ARITH_TAC);
6133  (UP_ASM_TAC THEN STRIP_TAC);
6134
6135  (NEW_GOAL `F`);
6136  (UNDISCH_TAC `(x - u0) dot (u1 - u0:real^3) > dist (x,u0) * dist (u1,u0) * d`);
6137  (REWRITE_WITH `x = t1 % u0 + t2 % u1:real^3`);
6138  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
6139  (MATCH_MP_TAC (REAL_ARITH `a <= &0 /\ &0 <= b ==> ~(a > b)`));
6140  (STRIP_TAC);
6141  (REWRITE_WITH `(t1 % u0 + t2 % u1) - u0 = (t1 % u0 + t2 % u1) - 
6142                  (t1 + t2 + t3 + t4) % u0:real^3`);
6143  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
6144  (REWRITE_TAC[ASSUME `t3 = &0`; ASSUME `t4 = &0`; VECTOR_ARITH 
6145   `(t1 % u0 + t2 % u1) - (t1 + t2 + &0 + &0) % u0 = t2 % (u1 - u0)`; 
6146    DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);
6147  (MATCH_MP_TAC REAL_LE_MUL);
6148  (REWRITE_TAC[DOT_POS_LE]);
6149  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
6150  (MATCH_MP_TAC REAL_LE_MUL);
6151  (REWRITE_TAC[DIST_POS_LE]);
6152  (MATCH_MP_TAC REAL_LE_MUL);
6153  (REWRITE_TAC[DIST_POS_LE]);
6154  (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c/\ c < &1`);
6155  (REAL_ARITH_TAC);
6156  (UP_ASM_TAC THEN MESON_TAC[]);
6157
6158  (ABBREV_TAC `y = t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % m:real^3`);
6159  (NEW_GOAL `(g:real^3->real) y <= g xx`);
6160  (FIRST_ASSUM MATCH_MP_TAC);
6161  (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM]);
6162  (EXISTS_TAC `t3 / (t3 + t4)` THEN EXISTS_TAC `t4 / (t3 + t4)`);
6163  (REPEAT STRIP_TAC);
6164  (MATCH_MP_TAC REAL_LE_DIV);
6165  (ASM_SIMP_TAC[REAL_LE_ADD]);
6166  (ASM_SIMP_TAC[REAL_LE_ADD; REAL_LE_DIV]);
6167  (REWRITE_TAC[REAL_ARITH `a / x + b / x = (a + b) / x`]);
6168  (MATCH_MP_TAC REAL_DIV_REFL);
6169  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
6170  (ASM_REWRITE_TAC[]);
6171
6172  (ABBREV_TAC `w = t1 / (t1 + t3 + t4) % u0 + t3 / (t1 + t3 + t4) % u2 + 
6173                    t4 / (t1 + t3 + t4) % m:real^3`);
6174  (NEW_GOAL `(g:real^3->real) y = g w`);
6175  (EXPAND_TAC "g");
6176
6177  (REWRITE_WITH `y:real^3 - u0 = 
6178                 &1 / (t3 + t4) % (t3 % u2 + t4 % m - (t3 + t4) % u0)`);
6179  (EXPAND_TAC "y");
6180  (REWRITE_TAC[VECTOR_ARITH 
6181   `(t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3) - u0 =
6182    &1 / (t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0) <=> 
6183    (t3 + t4) / (t3 + t4) % u0 = u0`]);
6184  (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
6185  (MATCH_MP_TAC REAL_DIV_REFL);
6186  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
6187  (VECTOR_ARITH_TAC);
6188  (REWRITE_TAC[NORM_MUL; DOT_LMUL]);
6189
6190  (REWRITE_WITH `w:real^3 - u0 = 
6191                 &1 / (t1 + t3 + t4) % (t3 % u2 + t4 % m - (t3 + t4) % u0)`);
6192  (EXPAND_TAC "w");
6193  (REWRITE_TAC[VECTOR_ARITH 
6194    `(t1 / (t1 + t3 + t4) % u0 +
6195     t3 / (t1 + t3 + t4) % u2 + t4 / (t1 + t3 + t4) % u3) - u0 =
6196     &1 / (t1 + t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0) <=> 
6197     (t1 + t3 + t4) / (t1 + t3 + t4) % u0 = u0`]);
6198  (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
6199  (MATCH_MP_TAC REAL_DIV_REFL);
6200  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` 
6201    THEN REAL_ARITH_TAC);
6202  (VECTOR_ARITH_TAC);
6203  (REWRITE_TAC[NORM_MUL; DOT_LMUL]);
6204  (REWRITE_WITH `abs (&1 / (t3 + t4)) = &1 / (t3 + t4)`);
6205  (REWRITE_TAC[REAL_ABS_REFL]);
6206  (ASM_SIMP_TAC[REAL_LE_DIV;REAL_LE_ADD; REAL_ARITH `&0 <= &1`]);
6207  (REWRITE_WITH `abs (&1 / (t1 + t3 + t4)) = &1 / (t1 + t3 + t4)`);
6208  (REWRITE_TAC[REAL_ABS_REFL]);
6209  (MATCH_MP_TAC REAL_LE_DIV THEN REWRITE_TAC[REAL_ARITH `&0 <= &1`]);
6210  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` 
6211    THEN REAL_ARITH_TAC);
6212  (REWRITE_TAC[REAL_ARITH `(a * x) / ((a * y) * z) = 
6213                            (a * x) / (a * (y * z))`]);
6214  (ABBREV_TAC 
6215   `a1 = norm (t3 % u2 + t4 % m - (t3 + t4) % u0) * norm (u1 - u0:real^3)`);
6216  (NEW_GOAL `~(a1 = &0)`);
6217  (EXPAND_TAC "a1" THEN ASM_REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0; 
6218    VECTOR_ARITH `(a - b = vec 0 <=> a = b)/\(a + b-c = vec 0 <=> a + b = c)`]);
6219  (STRIP_TAC);
6220
6221  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
6222  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6223  (EXISTS_TAC `(X:real^3->bool)`);
6224  (STRIP_TAC);
6225
6226  (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2; 
6227                 set_of_list; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6228  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6229  (EXPAND_TAC "m");
6230  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6231
6232  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6233  (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
6234  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6235  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6236  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6237  (REWRITE_TAC[coplanar]);
6238  (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
6239    EXISTS_TAC `m:real^3`);
6240  (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
6241  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
6242  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
6243  (EXISTS_TAC `&0` THEN EXISTS_TAC `t3 / (t3 + t4)` 
6244    THEN EXISTS_TAC `t4 / (t3 + t4)`);
6245  (REPEAT STRIP_TAC);
6246  (REWRITE_TAC[REAL_ARITH `&0 + t3 / (t3 + t4) + t4 / (t3 + t4) = 
6247                           (t3 + t4) / (t3 + t4)`]);
6248  (MATCH_MP_TAC REAL_DIV_REFL);
6249  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
6250  (ASM_REWRITE_TAC[VECTOR_ARITH 
6251    `&0 % u1 + t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3 = 
6252     (&1 / (t3 + t4)) % (t3 % u2 + t4 % u3)`]);
6253  (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
6254  (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
6255  (MATCH_MP_TAC REAL_DIV_REFL);
6256  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
6257  (VECTOR_ARITH_TAC);
6258  (SET_TAC[]);
6259
6260  (NEW_GOAL `~(&1 / (t3 + t4) = &0)`);
6261  (NEW_GOAL `&0 < &1 / (t3 + t4)`);
6262  (MATCH_MP_TAC REAL_LT_DIV);
6263  (ASM_REWRITE_TAC[REAL_ARITH `&0 < &1`]);
6264  (UP_ASM_TAC THEN REAL_ARITH_TAC);
6265
6266  (REWRITE_WITH 
6267  `(&1 / (t3 + t4) * ((t3 % u2 + t4 % m - (t3 + t4) % u0) dot (u1 - u0))) /
6268   (&1 / (t3 + t4) * a1) = 
6269   ((t3 % u2 + t4 % m - (t3 + t4) % u0) dot (u1 - u0:real^3)) / a1`);
6270  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[Trigonometry1.REAL_DIV_MUL2]);
6271
6272  (NEW_GOAL `~(&1 / (t1 + t3 + t4) = &0)`);
6273  (NEW_GOAL `&0 < &1 / (t1 + t3 + t4)`);
6274  (MATCH_MP_TAC REAL_LT_DIV);
6275  (ASM_REWRITE_TAC[REAL_ARITH `&0 < &1`]);
6276  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
6277    REAL_ARITH_TAC);
6278  (UP_ASM_TAC THEN REAL_ARITH_TAC);
6279
6280  (REWRITE_WITH 
6281  `(&1 / (t1 + t3 + t4) * ((t3 % u2 + t4 % m - (t3 + t4) % u0) dot (u1 - u0))) /
6282   (&1 / (t1 + t3 + t4) * a1) = 
6283   ((t3 % u2 + t4 % m - (t3 + t4) % u0) dot (u1 - u0:real^3)) / a1`);
6284  (UP_ASM_TAC THEN UNDISCH_TAC `~(a1 = &0)` THEN
6285    MESON_TAC[Trigonometry1.REAL_DIV_MUL2]);
6286
6287  (NEW_GOAL `(g:real^3->real) x <= g w`);
6288  (EXPAND_TAC "g");
6289
6290  (REWRITE_WITH 
6291   `((x - u0) dot (u1 - u0:real^3)) / (norm (x - u0) * norm (u1 - u0)) <=
6292   ((w - u0) dot (u1 - u0)) / (norm (w - u0) * norm (u1 - u0)) <=>
6293   ((x - u0) dot (u1 - u0)) * (norm (w - u0) * norm (u1 - u0)) <= 
6294   ((w - u0) dot (u1 - u0)) * (norm (x - u0) * norm (u1 - u0))`);
6295  (MATCH_MP_TAC RAT_LEMMA4);
6296  (STRIP_TAC);
6297  (MATCH_MP_TAC REAL_LT_MUL);
6298  (ASM_REWRITE_TAC[NORM_POS_LT; VECTOR_ARITH `x - b = vec 0 <=> x = b`]);
6299  (STRIP_TAC);
6300  (UNDISCH_TAC `~NULLSET (X INTER D)`);
6301  (REWRITE_TAC[]);
6302
6303  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6304  (EXISTS_TAC `(X:real^3->bool)`);
6305  (STRIP_TAC);
6306  (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
6307    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6308  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6309  (EXPAND_TAC "m");
6310  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6311  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6312  (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
6313  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6314  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6315  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6316  (REWRITE_TAC[coplanar]);
6317  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
6318    EXISTS_TAC `m:real^3`);
6319  (ONCE_REWRITE_TAC[SET_RULE `{u0, u1, u2, u3} = {u1, u0, u2, u3}`]);
6320  (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
6321  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
6322  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
6323  (EXISTS_TAC `(t2 + t3 + t4) / t2` THEN EXISTS_TAC `(--t3) / t2` 
6324    THEN EXISTS_TAC `(--t4) / t2`);
6325  (REPEAT STRIP_TAC);
6326  (REWRITE_TAC[REAL_ARITH 
6327    `(t2 + t3 + t4) / t2 + --t3 / t2 + --t4 / t2 = t2 / t2`]);
6328  (MATCH_MP_TAC REAL_DIV_REFL);
6329  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
6330  (REWRITE_WITH `(t2 + t3 + t4) = &1 - t1`);
6331  (UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
6332  (NEW_GOAL `u0 - t1 % u0 - t3 % u2 - t4 % m:real^3 = t2 % u1`);
6333  (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
6334  (ASM_REWRITE_TAC[VECTOR_ARITH 
6335    `(&1 - t1) / t2 % u0 + --t3 / t2 % u2 + --t4 / t2 % u3 = 
6336     (&1 / t2) % (u0 - t1 % u0 - t3 % u2 - t4 % u3)`]);
6337  (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
6338  (REWRITE_WITH `t2 / t2 = &1`);
6339  (MATCH_MP_TAC REAL_DIV_REFL);
6340  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
6341  (VECTOR_ARITH_TAC);
6342  (SET_TAC[]);
6343
6344  (MATCH_MP_TAC REAL_LT_MUL);
6345  (ASM_REWRITE_TAC[NORM_POS_LT; VECTOR_ARITH `x - b = vec 0 <=> x = b`]);
6346  (EXPAND_TAC "w" THEN STRIP_TAC);
6347  (UNDISCH_TAC `~NULLSET (X INTER D)`);
6348  (REWRITE_TAC[]);
6349
6350  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6351  (EXISTS_TAC `(X:real^3->bool)`);
6352  (STRIP_TAC);
6353  (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
6354    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6355  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6356  (EXPAND_TAC "m");
6357  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6358  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6359  (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
6360  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6361  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6362  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6363  (REWRITE_TAC[coplanar]);
6364  (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
6365    EXISTS_TAC `m:real^3`);
6366  (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
6367  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
6368  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
6369
6370  (EXISTS_TAC `&0` THEN EXISTS_TAC `t3 / (t3 + t4)` 
6371    THEN EXISTS_TAC `t4 / (t3 + t4)`);
6372  (REPEAT STRIP_TAC);
6373  (REWRITE_TAC[REAL_ARITH `&0 + t3 / (t3 + t4) + t4 / (t3 + t4) = 
6374                           (t3 + t4) / (t3 + t4)`]);
6375  (MATCH_MP_TAC REAL_DIV_REFL);
6376  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
6377  (ASM_REWRITE_TAC[VECTOR_ARITH 
6378    `&0 % u1 + t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3 = 
6379     (&1 / (t3 + t4)) % (t3 % u2 + t4 % u3)`]);
6380  (UP_ASM_TAC THEN REWRITE_TAC[VECTOR_ARITH 
6381    `t1 / x % u0 + t3 / x % u2 + t4 / x % u3 = 
6382     (&1 / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
6383  (REWRITE_WITH `&1 / (t1 + t3 + t4) % (t1 % u0 + t3 % u2 + t4 % m) = u0 <=> 
6384                  t1 % u0 + t3 % u2 + t4 % m = (t1 + t3 + t4) % u0:real^3`);
6385  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6386  (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);
6387  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 +t3 + t4 = &1` THEN 
6388    REAL_ARITH_TAC);
6389
6390  (REWRITE_TAC[VECTOR_ARITH `t1 % u0 + t3 % u2 + t4 % u3 = (t1 + t3 + t4) % u0
6391    <=> t3 % u2 + t4 % u3 = (t3 + t4) % u0`]);
6392  (STRIP_TAC THEN ASM_REWRITE_TAC[]);
6393  (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
6394  (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
6395  (MATCH_MP_TAC REAL_DIV_REFL);
6396  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
6397  (VECTOR_ARITH_TAC);
6398  (SET_TAC[]);
6399
6400  (REWRITE_WITH `x = t2 % u1 + (t1 + t3 + t4) % w:real^3`);
6401  (ASM_REWRITE_TAC[] THEN EXPAND_TAC "w");
6402  (REWRITE_TAC[VECTOR_ARITH 
6403   `x % (t1 /x % u0 + t3 / x % u2 + t4 /x  % u3) = 
6404    (x / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
6405  (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
6406  (MATCH_MP_TAC REAL_DIV_REFL);
6407  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
6408    REAL_ARITH_TAC);
6409  (VECTOR_ARITH_TAC);
6410  (ABBREV_TAC `t = t1 + t3 + t4`);
6411  (REWRITE_WITH `(t2 % u1 + t % w) - u0:real^3 = 
6412                 (t2 % u1 + t % w) - (t1 + t2 + t3 + t4) % u0`);
6413  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
6414  (REWRITE_WITH `t1 + t2 + t3 + t4 = t2 + t:real`);
6415  (EXPAND_TAC "t" THEN REAL_ARITH_TAC);
6416  (REWRITE_TAC[VECTOR_ARITH 
6417   `(t2 % u1 + t % w) - (t2 + t) % u0 = t2 % (u1 - u0) + t % (w - u0)`]);
6418  (ABBREV_TAC `x1 = u1 - u0:real^3`);
6419  (ABBREV_TAC `x2 = w - u0:real^3`);
6420
6421  (REWRITE_WITH `(t2 % x1 + t % x2) dot x1 = 
6422    t2 * norm x1 pow 2 + t * x2 dot (x1:real^3)`);
6423  (REWRITE_TAC[NORM_POW_2]);
6424  (VECTOR_ARITH_TAC);
6425
6426  (NEW_GOAL `t2 * norm x1 pow 2 * norm x2 * norm x1 <= 
6427              t2 * (x2 dot x1) * norm x1 * norm (x1:real^3)`);
6428  (REWRITE_TAC[REAL_POW_2; REAL_ARITH `t2 * (x1 * x1) * x2 * x1 <=
6429    t2 * x3 * x1 * x1 <=> &0 <= (x1 pow 2) * (--t2) * (x2 * x1 - x3)`]);
6430  (MATCH_MP_TAC REAL_LE_MUL);
6431  (ASM_SIMP_TAC[REAL_LE_MUL; NORM_POS_LE]);
6432  (MATCH_MP_TAC REAL_LE_MUL);
6433  (REWRITE_TAC[REAL_ARITH `&0 <= a - b <=> b <= a`]);
6434  (STRIP_TAC);
6435  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
6436  (REWRITE_TAC[NORM_CAUCHY_SCHWARZ]);
6437
6438  (NEW_GOAL 
6439  `t2 * (x2 dot x1) * norm x1 * norm x1 + t * (x2 dot x1) * norm x2 * norm x1 <=    (x2 dot x1) * norm (t2 % x1 + t % x2) * norm (x1:real^3)`);
6440
6441  (REWRITE_TAC[REAL_ARITH `t2 * x3 * x1 * x1 + t * x3 * x2 * x1 <=
6442  x3 * x4 * x1 <=> &0 <= (x1 * x3) * (x4 - t2 * x1 - t * x2)`]);
6443  (MATCH_MP_TAC REAL_LE_MUL);
6444  (STRIP_TAC);
6445  (MATCH_MP_TAC REAL_LE_MUL);
6446  (REWRITE_TAC[NORM_POS_LE]);
6447  (ASM_CASES_TAC `x2 dot (x1:real^3) < &0`);
6448  (NEW_GOAL `F`);
6449  (NEW_GOAL `(g:real^3->real) x <= &0`);
6450  (EXPAND_TAC "g");
6451  (REWRITE_TAC[REAL_ARITH `a / b <= &0 <=> &0 <= (--a) / b`]);
6452  (MATCH_MP_TAC REAL_LE_DIV);
6453  (SIMP_TAC[NORM_POS_LE; REAL_LE_MUL]);
6454
6455  (REWRITE_WITH `x = t2 % u1 + (t1 + t3 + t4) % w:real^3`);
6456  (ASM_REWRITE_TAC[] THEN EXPAND_TAC "w");
6457  (REWRITE_TAC[VECTOR_ARITH 
6458   `x % (t1 /x % u0 + t3 / x % u2 + t4 /x  % u3) = 
6459    (x / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
6460  (EXPAND_TAC "t");
6461  (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
6462  (MATCH_MP_TAC REAL_DIV_REFL);
6463  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
6464    REAL_ARITH_TAC);
6465  (VECTOR_ARITH_TAC);
6466
6467  (REWRITE_TAC[REAL_ARITH `&0 <= --a <=> a <= &0`]);
6468  (REWRITE_WITH `(t2 % u1 + (t1 + t3 + t4) % w) - u0:real^3 = 
6469                  (t2 % u1 + (t1 + t3 + t4) % w) - (t1 + t2 + t3 + t4) % u0`);
6470  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
6471  (REWRITE_WITH `(t2 % u1 + (t1 + t3 + t4) % w) - (t1 + t2 + t3 + t4) % u0 = 
6472    t2 % x1 + t % x2:real^3`);
6473  (EXPAND_TAC "x1" THEN EXPAND_TAC "x2" THEN EXPAND_TAC "t"
6474    THEN VECTOR_ARITH_TAC);
6475  (NEW_GOAL `t % x2 dot (x1:real^3) <= &0`);
6476  (REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= a * (--b)`]);
6477  (MATCH_MP_TAC REAL_LE_MUL);
6478  (STRIP_TAC);
6479  (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN 
6480    UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
6481  (UP_ASM_TAC THEN REAL_ARITH_TAC);
6482  (NEW_GOAL `t2 % x1 dot (x1:real^3) <= &0`);
6483  (REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);
6484  (MATCH_MP_TAC REAL_LE_MUL);
6485  (STRIP_TAC);
6486  (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN 
6487    UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
6488  (REWRITE_TAC[DOT_POS_LE]);
6489  (REWRITE_TAC[DOT_LADD]);
6490  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
6491  (UP_ASM_TAC THEN UNDISCH_TAC `d < (g:real^3->real) x`);
6492  (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1`);
6493  (REAL_ARITH_TAC);
6494  (UP_ASM_TAC THEN MESON_TAC[]);
6495  (UP_ASM_TAC THEN REAL_ARITH_TAC);
6496
6497  (REWRITE_TAC [REAL_ARITH `&0 <= a - b * d - c <=> c <= a + (--b) * d`]);
6498  (REWRITE_WITH `t * norm (x2:real^3) = abs t * norm x2`);
6499  (AP_THM_TAC THEN AP_TERM_TAC);
6500  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6501  (REWRITE_TAC[REAL_ABS_REFL]);
6502  (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN 
6503    UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
6504  (REWRITE_WITH `(--t2) * norm (x1:real^3) = abs (--t2) * norm x1`);
6505  (AP_THM_TAC THEN AP_TERM_TAC);
6506  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6507  (REWRITE_TAC[REAL_ABS_REFL]);
6508  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
6509  (REWRITE_TAC[GSYM NORM_MUL]);
6510  (REWRITE_WITH 
6511   `norm (t % x2:real^3) = norm ((t2 % x1 + t % x2) + (--t2 % x1))`);
6512  (AP_TERM_TAC THEN VECTOR_ARITH_TAC);
6513  (REWRITE_TAC[NORM_TRIANGLE]);
6514  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
6515  (UNDISCH_TAC `(g:real^3->real) y <= g xx`);
6516  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
6517
6518  (NEW_GOAL `(g:real^3->real) xx <= d1`);
6519  (FIRST_ASSUM MATCH_MP_TAC);
6520  (EXPAND_TAC "P3");
6521  (EXPAND_TAC "g" THEN EXPAND_TAC "f3");
6522  (REWRITE_TAC[IN_ELIM_THM; IN]);
6523  (EXISTS_TAC `vl:(real^3)list`);
6524  (REWRITE_TAC[ASSUME `barV V 3 vl`; ASSUME `vl = [u0;u1;u2;u3:real^3]`; 
6525                TRUNCATE_SIMPLEX_EXPLICIT_1]);
6526  (STRIP_TAC);
6527  (SIMP_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
6528  (REWRITE_WITH `mcell 3 V vl = mcell k V vl`);
6529  (ASM_SIMP_TAC[]);
6530  (REWRITE_TAC[GSYM (ASSUME `X = mcell k V vl`)]);
6531  (STRIP_TAC);
6532
6533  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
6534  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6535  (EXISTS_TAC `X INTER (C:real^3->bool)`);
6536  (STRIP_TAC);
6537  (ASM_REWRITE_TAC[]);
6538  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
6539  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
6540  (MATCH_MP_TAC (SET_RULE 
6541   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
6542  (STRIP_TAC);
6543  (MATCH_MP_TAC SUBSET_BALL);
6544  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
6545  (MATCH_MP_TAC RCONE_GT_SUBSET);
6546  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
6547
6548  (EXPAND_TAC "xx");
6549  (SIMP_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
6550  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6551  (EXPAND_TAC "m");
6552  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6553
6554  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN EXPAND_TAC "d");
6555  (REAL_ARITH_TAC);
6556
6557  (NEW_GOAL `F`);
6558  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
6559  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6560  (EXISTS_TAC `(X:real^3->bool)`);
6561  (STRIP_TAC);
6562  (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2; 
6563                set_of_list; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6564  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
6565  (SET_TAC[]);
6566  (UP_ASM_TAC THEN MESON_TAC[]);
6567
6568 (* ========================================================================= *)
6569
6570  (ABBREV_TAC `m = mxi V vl`);
6571  (NEW_GOAL `~coplanar {u0, u1, u2, m:real^3}`);
6572  (STRIP_TAC);
6573  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
6574  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6575  (EXISTS_TAC `X:real^3->bool`);
6576  (STRIP_TAC);
6577  (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; set_of_list]);
6578  (COND_CASES_TAC);
6579  (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
6580    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6581  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6582  (EXPAND_TAC "m");
6583  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6584
6585  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6586  (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
6587  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6588  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6589  (ASM_REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6590  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
6591  (SET_TAC[]);
6592
6593  (ASM_CASES_TAC `azim u0 u1 u2 (m:real^3) < pi`);
6594  (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 u2 m)`);
6595  (ASM_SIMP_TAC[WEDGE_LUNE]);
6596  (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d = 
6597                  conic_cap u0 u1 r d INTER L`);
6598  (SET_TAC[]);
6599  (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
6600  (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER 
6601    aff_gt {u0, u1} {u2, m} DIFF conic_cap u0 u1 r d INTER L = {}`);
6602  (EXPAND_TAC "L");
6603  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));
6604  (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);
6605  (REWRITE_TAC[SET_RULE `A UNION {} = A`]);
6606  (EXPAND_TAC "L");
6607
6608  (REWRITE_WITH `aff_ge {u0, u1:real^3} {u2, m} =
6609                  aff_gt {u0, u1} {u2, m} UNION 
6610    UNIONS {aff_ge {u0, u1} ({u2, m} DELETE a) | a | a IN  {u2, m}}`);
6611  (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);
6612  (REWRITE_TAC[Geomdetail.FINITE6]);
6613  (REWRITE_TAC[DISJOINT]);
6614
6615  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
6616  (NEW_GOAL `F`);
6617  (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);
6618  (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, m:real^3}`);
6619  (UP_ASM_TAC THEN SET_TAC[]);
6620  (REWRITE_TAC[COPLANAR_3]);
6621  (UP_ASM_TAC THEN MESON_TAC[]);
6622
6623  (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
6624  (NEW_GOAL `F`);
6625  (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);
6626  (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, u2:real^3}`);
6627  (UP_ASM_TAC THEN SET_TAC[]);
6628  (REWRITE_TAC[COPLANAR_3]);
6629  (UP_ASM_TAC THEN MESON_TAC[]);
6630  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
6631
6632  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6633  (EXISTS_TAC 
6634   `UNIONS {aff_ge {u0, u1:real^3} ({u2, m} DELETE a) | a | a IN {u2, m}}`);
6635  (STRIP_TAC);
6636  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6637  (EXISTS_TAC 
6638   `aff_ge {u0, u1:real^3} {u2} UNION aff_ge {u0, u1:real^3} {m}`);
6639  (STRIP_TAC);
6640  (MATCH_MP_TAC NEGLIGIBLE_UNION);
6641  (STRIP_TAC);
6642
6643  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6644  (EXISTS_TAC `affine hull {u0, u1:real^3, u2}`);
6645  (STRIP_TAC);
6646  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
6647  (REWRITE_WITH `{u0,u1,u2:real^3} = {u0,u1} UNION {u2}`);
6648  (SET_TAC[]);
6649  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
6650  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6651  (EXISTS_TAC `affine hull {u0, u1:real^3, m}`);
6652  (STRIP_TAC);
6653  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
6654  (REWRITE_WITH `{u0,u1,m:real^3} = {u0,u1} UNION {m}`);
6655  (SET_TAC[]);
6656  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
6657  (REWRITE_TAC[SET_RULE 
6658   `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} = 
6659          aff_ge {u0, u1} ({m, s3} DELETE s3) 
6660    UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);
6661  (MATCH_MP_TAC (SET_RULE 
6662   `A SUBSET B /\ C SUBSET D ==> A UNION C SUBSET B UNION D`));
6663  (STRIP_TAC);
6664  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
6665  (STRIP_TAC);
6666  (SET_TAC[]);
6667
6668  (REWRITE_TAC[DISJOINT]);
6669  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
6670  (NEW_GOAL `F`);
6671  (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);
6672  (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, m:real^3}`);
6673  (UP_ASM_TAC THEN SET_TAC[]);
6674  (REWRITE_TAC[COPLANAR_3]);
6675  (UP_ASM_TAC THEN MESON_TAC[]);
6676  (UP_ASM_TAC THEN SET_TAC[]);
6677
6678  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
6679  (STRIP_TAC);
6680  (SET_TAC[]);
6681  (REWRITE_TAC[DISJOINT]);
6682  (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
6683  (NEW_GOAL `F`);
6684  (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);
6685  (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, u2:real^3}`);
6686  (UP_ASM_TAC THEN SET_TAC[]);
6687  (REWRITE_TAC[COPLANAR_3]);
6688  (UP_ASM_TAC THEN MESON_TAC[]);
6689  (UP_ASM_TAC THEN SET_TAC[]);
6690
6691  (SET_TAC[]);
6692
6693 (* begin the computation *)
6694
6695  (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);
6696  (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 u2 m) =
6697              (if &1 < d \/ r < &0
6698               then &0
6699               else azim u0 u1 u2 m / &3 * (&1 - max d (-- &1)) * r pow 3)`);
6700  (NEW_GOAL `~collinear {u0:real^3, u1, u2} /\ ~collinear {u0, u1, m}`);
6701  (STRIP_TAC);
6702  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
6703  (EXISTS_TAC `m:real^3`);
6704  (ASM_REWRITE_TAC[]);
6705  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
6706  (EXISTS_TAC `u2:real^3`);
6707  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
6708  (ASM_REWRITE_TAC[]);
6709  (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);
6710
6711  (COND_CASES_TAC);
6712  (NEW_GOAL `F`);
6713  (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN 
6714    UP_ASM_TAC THEN REAL_ARITH_TAC);
6715  (UP_ASM_TAC THEN MESON_TAC[]);
6716
6717  (REWRITE_WITH `azim (u0:real^3) u1 u2 m = dihV u0 u1 u2 m`);
6718  (MATCH_MP_TAC AZIM_DIHV_SAME);
6719  (ASM_REWRITE_TAC[]);
6720  (STRIP_TAC);
6721  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
6722  (EXISTS_TAC `m:real^3`);
6723  (ASM_REWRITE_TAC[]);
6724  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
6725  (EXISTS_TAC `u2:real^3`);
6726  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
6727  (ASM_REWRITE_TAC[]);
6728
6729  (REWRITE_TAC[dihX]);
6730  (COND_CASES_TAC);
6731  (NEW_GOAL `F`);
6732  (UNDISCH_TAC `~NULLSET (X INTER D)`);
6733  (REWRITE_TAC[]);
6734  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6735  (EXISTS_TAC `X:real^3->bool`);
6736  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
6737  (UP_ASM_TAC THEN MESON_TAC[]);
6738
6739  (LET_TAC);
6740
6741  (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
6742  (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
6743            ul IN barV V 3 /\
6744            X = mcell k V ul /\
6745            initial_sublist [u0; u1] ul)`);
6746  (STRIP_TAC);
6747  (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
6748  (MATCH_MP_TAC SELECT_AX);
6749  (EXISTS_TAC `(3, vl:(real^3)list)`);
6750  (EXPAND_TAC "P");
6751  (REWRITE_TAC[BETA_THM]);
6752  (REWRITE_TAC[IN; ARITH_RULE `3 <= 4`] THEN ASM_REWRITE_TAC[]);
6753  (REWRITE_WITH `initial_sublist [u0;u1:real^3] [u0; u1; u2; u3] /\ 
6754                  LENGTH [u0;u1] = 1 + 1`);
6755  (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
6756  (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
6757  (ASM_REWRITE_TAC[]);
6758  (REWRITE_TAC[LENGTH] THEN ARITH_TAC);
6759  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
6760  (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);
6761
6762  (NEW_GOAL `k' = 3 /\ mcell k' V ul = mcell 3 V vl`);
6763  (MATCH_MP_TAC Ajripqn.AJRIPQN);
6764  (ASM_REWRITE_TAC[]);
6765  (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
6766  (REWRITE_WITH `mcell k' V ul INTER mcell 3 V vl = X`);
6767  (REWRITE_WITH `mcell 3 V vl = X`);
6768  (ASM_SIMP_TAC[]);
6769  (SET_TAC[ASSUME `X = mcell k' V ul`]);
6770
6771  (REPEAT STRIP_TAC);
6772  (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE 
6773    `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);
6774  (SET_TAC[]);
6775  (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[]);
6776
6777  (COND_CASES_TAC);
6778  (NEW_GOAL `F`);
6779  (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
6780  (UP_ASM_TAC THEN MESON_TAC[]);
6781  (COND_CASES_TAC);
6782
6783  (REWRITE_TAC[dihu3]);
6784
6785  (REWRITE_WITH `dihV (EL 0 ul) (EL 1 ul) (EL 2 ul) (mxi V ul) = 
6786    dihV u0 u1 u2 (m:real^3)`);
6787
6788  (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
6789  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
6790  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
6791
6792  (NEW_GOAL `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);
6793  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6794  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
6795  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
6796                  CARD (set_of_list ul) = 3 + 1`);
6797  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
6798  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6799  (ARITH_TAC);
6800
6801  (NEW_GOAL `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);
6802  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6803  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
6804  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
6805                  CARD (set_of_list ul) = 3 + 1`);
6806  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
6807  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6808  (ARITH_TAC);
6809
6810  (NEW_GOAL `{EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} = {u0, u1,u2,m:real^3}`);
6811  (REWRITE_WITH `
6812     {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} = {u0, u1,u2,m:real^3} <=>
6813     convex hull {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} = 
6814     convex hull {u0, u1,u2,m:real^3}`);
6815  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6816  (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);
6817  (REPEAT STRIP_TAC);
6818
6819  (UNDISCH_TAC `~NULLSET X`);
6820  (REWRITE_TAC[]);
6821  (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);
6822  (COND_CASES_TAC);
6823  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
6824  (MATCH_MP_TAC BARV_3_EXPLICIT);
6825  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6826  (UP_ASM_TAC THEN STRIP_TAC);
6827  (ASM_REWRITE_TAC[set_of_list; TRUNCATE_SIMPLEX_EXPLICIT_2; 
6828                    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6829  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6830  (EXISTS_TAC `affine hull {v0, v1, v2, mxi V [v0; v1; v2; v3]}`);
6831  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6832  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6833  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6834  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
6835  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
6836  (UNDISCH_TAC `affine_dependent {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul}`);
6837  (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; 
6838                ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
6839
6840  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
6841
6842  (UNDISCH_TAC `~NULLSET X`);
6843  (REWRITE_TAC[]);
6844  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
6845    TRUNCATE_SIMPLEX_EXPLICIT_2; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6846  (COND_CASES_TAC);
6847  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6848  (EXISTS_TAC `affine hull {u0, u1, u2, mxi V [u0; u1; u2; u3]}`);
6849  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6850  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6851  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6852  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
6853  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
6854  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6855  (EXPAND_TAC "m");
6856  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6857  (ASM_REWRITE_TAC[]);
6858
6859  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
6860
6861  (REWRITE_WITH `convex hull {u0, u1, u2, m:real^3} = X`);
6862  (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; set_of_list]);
6863  (COND_CASES_TAC);
6864  (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
6865    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6866  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6867  (EXPAND_TAC "m");
6868  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6869
6870  (NEW_GOAL `F`);
6871  (UNDISCH_TAC `~NULLSET X`);
6872  (REWRITE_TAC[]);
6873  (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; set_of_list]);
6874  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
6875  (UP_ASM_TAC THEN MESON_TAC[]);
6876
6877  (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);
6878  (COND_CASES_TAC);
6879  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
6880  (MATCH_MP_TAC BARV_3_EXPLICIT);
6881  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6882  (UP_ASM_TAC THEN STRIP_TAC);
6883  (REWRITE_TAC[set_of_list; ASSUME `ul = [v0; v1; v2; v3:real^3]`;
6884                TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
6885                SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6886  (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
6887  (NEW_GOAL `F`);
6888  (UNDISCH_TAC `~NULLSET X`);
6889  (REWRITE_TAC[]);
6890  (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);
6891  (ASM_REWRITE_TAC[]);
6892  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
6893  (UP_ASM_TAC THEN MESON_TAC[]);
6894
6895  (UP_ASM_TAC THEN ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `1 = SUC 0`]);
6896
6897  (NEW_GOAL `mxi V ul = m`);
6898  (EXPAND_TAC "m");
6899  (MATCH_MP_TAC MCELL_ID_MXI);
6900  (EXISTS_TAC `k':num` THEN EXISTS_TAC `k:num`);
6901  (ASM_REWRITE_TAC[SET_RULE `3 IN {2, 3}`]);
6902  (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
6903  (ASM_REWRITE_TAC[]);
6904  (ASM_REWRITE_TAC[HD]);
6905  (REWRITE_WITH `HD (ul) = (HD (truncate_simplex 1 ul)):real^3`);
6906  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6907  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
6908  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
6909                  CARD (set_of_list ul) = 3 + 1`);
6910  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
6911  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6912  (ARITH_TAC);
6913  (ASM_REWRITE_TAC[HD]);
6914  (ASM_REWRITE_TAC[]);
6915
6916  (STRIP_TAC);
6917  (NEW_GOAL `EL 2 ul = u2:real^3`);
6918  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
6919  (STRIP_TAC);
6920  (NEW_GOAL `{u0, u1, EL 2 ul, m} = {u0, u1, m:real^3}`);
6921  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
6922  (UNDISCH_TAC `~coplanar {u0,u1,u2,m:real^3}` THEN REWRITE_TAC[
6923    GSYM (ASSUME `{u0, u1, EL 2 ul, m} = {u0, u1, u2, m:real^3}`);
6924    ASSUME `{u0, u1, EL 2 ul, m} = {u0, u1, m:real^3}`; COPLANAR_3]);
6925  (ASM_REWRITE_TAC[]);
6926
6927  (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);
6928  (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);
6929  (AP_THM_TAC THEN AP_TERM_TAC);
6930
6931  (REWRITE_WITH 
6932   `measurable (conic_cap u0 u1 r d) /\
6933              vol (conic_cap u0 u1 r d) =
6934              (if u1 = u0 \/ &1 <= d \/ r < &0
6935               then &0
6936               else &2 / &3 * pi * (&1 - d) * r pow 3)`);
6937  (MATCH_MP_TAC VOLUME_CONIC_CAP);
6938  (EXPAND_TAC "d");
6939  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
6940  (COND_CASES_TAC);
6941  (NEW_GOAL `F`);
6942  (UP_ASM_TAC THEN STRIP_TAC);
6943  (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN MESON_TAC[]);
6944  (UNDISCH_TAC `d < &1` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
6945  (UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
6946  (UP_ASM_TAC THEN MESON_TAC[]);
6947  (REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
6948
6949  (REWRITE_WITH `max d (--(&1)) = d`);
6950  (MATCH_MP_TAC (REAL_ARITH `&0 < d /\ --(&1) < &0 ==> max d (--(&1)) = d`));
6951  (REWRITE_TAC[REAL_NEG_LT0]);
6952  (STRIP_TAC);
6953  (EXPAND_TAC "d");
6954  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
6955  (REAL_ARITH_TAC);
6956
6957  (REWRITE_WITH `
6958   (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *   
6959   ((&2 * pi) / (&2 * pi))`);
6960  (REAL_ARITH_TAC);
6961  (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);
6962  (MATCH_MP_TAC REAL_DIV_REFL);
6963  (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);
6964  (REAL_ARITH_TAC);
6965  (NEW_GOAL `F`);
6966  (UP_ASM_TAC THEN UNDISCH_TAC `k' = 3 /\ mcell k' V ul = mcell 3 V vl`
6967    THEN MESON_TAC[]);
6968  (UP_ASM_TAC THEN MESON_TAC[]);
6969
6970 (* ========================================================================= *)
6971
6972  (ASM_CASES_TAC `azim u0 u1 m (u2:real^3) < pi`);
6973  (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);
6974  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
6975  (STRIP_TAC);
6976  (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 m u2)`);
6977  (ASM_SIMP_TAC[WEDGE_LUNE]);
6978  (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d = 
6979                  conic_cap u0 u1 r d INTER L`);
6980  (SET_TAC[]);
6981  (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
6982
6983  (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER 
6984    aff_gt {u0, u1} {m, u2} DIFF conic_cap u0 u1 r d INTER L = {}`);
6985  (EXPAND_TAC "L");
6986  (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);
6987  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));
6988  (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);
6989  (REWRITE_TAC[SET_RULE `A UNION {} = A`]);
6990  (EXPAND_TAC "L");
6991  (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);
6992
6993  (REWRITE_WITH `aff_ge {u0, u1:real^3} {m, u2} =
6994                  aff_gt {u0, u1} {m, u2} UNION 
6995    UNIONS {aff_ge {u0, u1} ({m, u2} DELETE a) | a | a IN  {m, u2}}`);
6996  (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);
6997  (REWRITE_TAC[Geomdetail.FINITE6]);
6998  (REWRITE_TAC[DISJOINT]);
6999
7000  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
7001  (NEW_GOAL `F`);
7002  (UNDISCH_TAC `~coplanar {u0, u1, m, u2:real^3}`);
7003  (REWRITE_WITH `{u0, u1, m, u2} = {u0, u1, m:real^3}`);
7004  (UP_ASM_TAC THEN SET_TAC[]);
7005  (REWRITE_TAC[COPLANAR_3]);
7006  (UP_ASM_TAC THEN MESON_TAC[]);
7007
7008  (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
7009  (NEW_GOAL `F`);
7010  (UNDISCH_TAC `~coplanar {u0, u1, m, u2:real^3}`);
7011  (REWRITE_WITH `{u0, u1, m, u2} = {u0, u1, u2:real^3}`);
7012  (UP_ASM_TAC THEN SET_TAC[]);
7013  (REWRITE_TAC[COPLANAR_3]);
7014  (UP_ASM_TAC THEN MESON_TAC[]);
7015  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
7016
7017  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7018  (EXISTS_TAC 
7019   `UNIONS {aff_ge {u0, u1:real^3} ({m, u2} DELETE a) | a | a IN {m, u2}}`);
7020  (STRIP_TAC);
7021  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7022  (EXISTS_TAC 
7023   `aff_ge {u0, u1:real^3} {u2} UNION aff_ge {u0, u1:real^3} {m}`);
7024  (STRIP_TAC);
7025  (MATCH_MP_TAC NEGLIGIBLE_UNION);
7026  (STRIP_TAC);
7027
7028  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7029  (EXISTS_TAC `affine hull {u0, u1:real^3, u2}`);
7030  (STRIP_TAC);
7031  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
7032  (REWRITE_WITH `{u0,u1,u2:real^3} = {u0,u1} UNION {u2}`);
7033  (SET_TAC[]);
7034  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
7035  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7036  (EXISTS_TAC `affine hull {u0, u1:real^3, m}`);
7037  (STRIP_TAC);
7038  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
7039  (REWRITE_WITH `{u0,u1,m:real^3} = {u0,u1} UNION {m}`);
7040  (SET_TAC[]);
7041  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
7042  (REWRITE_TAC[SET_RULE 
7043   `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} = 
7044          aff_ge {u0, u1} ({m, s3} DELETE s3) 
7045    UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);
7046  (MATCH_MP_TAC (SET_RULE 
7047   `A SUBSET D /\ C SUBSET B ==> A UNION C SUBSET B UNION D`));
7048  (STRIP_TAC);
7049  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
7050  (STRIP_TAC);
7051  (SET_TAC[]);
7052
7053  (REWRITE_TAC[DISJOINT]);
7054  (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
7055  (NEW_GOAL `F`);
7056  (UNDISCH_TAC `~coplanar {u0, u1, m, u2:real^3}`);
7057  (REWRITE_WITH `{u0, u1, m, u2} = {u0, u1, u2:real^3}`);
7058  (UP_ASM_TAC THEN SET_TAC[]);
7059  (REWRITE_TAC[COPLANAR_3]);
7060  (UP_ASM_TAC THEN MESON_TAC[]);
7061  (UP_ASM_TAC THEN SET_TAC[]);
7062
7063  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
7064  (STRIP_TAC);
7065  (SET_TAC[]);
7066  (REWRITE_TAC[DISJOINT]);
7067  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
7068  (NEW_GOAL `F`);
7069  (UNDISCH_TAC `~coplanar {u0, u1, m, u2:real^3}`);
7070  (REWRITE_WITH `{u0, u1, m, u2} = {u0, u1, m:real^3}`);
7071  (UP_ASM_TAC THEN SET_TAC[]);
7072  (REWRITE_TAC[COPLANAR_3]);
7073  (UP_ASM_TAC THEN MESON_TAC[]);
7074  (UP_ASM_TAC THEN SET_TAC[]);
7075
7076  (SET_TAC[]);
7077
7078  (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);
7079  (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 m u2) =
7080              (if &1 < d \/ r < &0
7081               then &0
7082               else azim u0 u1 m u2 / &3 * (&1 - max d (-- &1)) * r pow 3)`);
7083  (NEW_GOAL `~collinear {u0:real^3, u1, u2} /\ ~collinear {u0, u1, m}`);
7084  (STRIP_TAC);
7085  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
7086  (EXISTS_TAC `m:real^3`);
7087  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
7088  (ASM_REWRITE_TAC[]);
7089  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
7090  (EXISTS_TAC `u2:real^3`);
7091  (ASM_REWRITE_TAC[]);
7092
7093  (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);
7094  (COND_CASES_TAC);
7095  (NEW_GOAL `F`);
7096
7097  (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN 
7098    UP_ASM_TAC THEN REAL_ARITH_TAC);
7099  (UP_ASM_TAC THEN MESON_TAC[]);
7100
7101  (REWRITE_WITH `azim (u0:real^3) u1 m u2 = dihV u0 u1 m u2`);
7102  (MATCH_MP_TAC AZIM_DIHV_SAME);
7103  (ASM_REWRITE_TAC[]);
7104  (STRIP_TAC);
7105
7106  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
7107  (EXISTS_TAC `u2:real^3`);
7108  (ASM_REWRITE_TAC[]);
7109  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
7110  (EXISTS_TAC `m:real^3`);
7111  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
7112  (ASM_REWRITE_TAC[]);
7113
7114  (REWRITE_TAC[dihX]);
7115  (COND_CASES_TAC);
7116  (NEW_GOAL `F`);
7117  (UNDISCH_TAC `~NULLSET (X INTER D)`);
7118  (REWRITE_TAC[]);
7119  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7120  (EXISTS_TAC `X:real^3->bool`);
7121  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
7122  (UP_ASM_TAC THEN MESON_TAC[]);
7123
7124  (LET_TAC);
7125
7126  (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
7127  (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
7128            ul IN barV V 3 /\
7129            X = mcell k V ul /\
7130            initial_sublist [u0; u1] ul)`);
7131  (STRIP_TAC);
7132  (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
7133  (MATCH_MP_TAC SELECT_AX);
7134  (EXISTS_TAC `(3, vl:(real^3)list)`);
7135  (EXPAND_TAC "P");
7136  (REWRITE_TAC[BETA_THM]);
7137  (REWRITE_TAC[IN; ARITH_RULE `3 <= 4`] THEN ASM_REWRITE_TAC[]);
7138
7139  (REWRITE_WITH `initial_sublist [u0;u1:real^3] [u0; u1; u2; u3] /\ 
7140                  LENGTH [u0;u1] = 1 + 1`);
7141  (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
7142  (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
7143  (ASM_REWRITE_TAC[]);
7144  (REWRITE_TAC[LENGTH] THEN ARITH_TAC);
7145  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
7146  (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);
7147
7148  (NEW_GOAL `k' = 3 /\ mcell k' V ul = mcell 3 V vl`);
7149  (MATCH_MP_TAC Ajripqn.AJRIPQN);
7150  (ASM_REWRITE_TAC[]);
7151  (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
7152  (REWRITE_WITH `mcell k' V ul INTER mcell 3 V vl = X`);
7153  (REWRITE_WITH `mcell 3 V vl = X`);
7154  (ASM_SIMP_TAC[]);
7155  (SET_TAC[ASSUME `X = mcell k' V ul`]);
7156
7157  (REPEAT STRIP_TAC);
7158  (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE 
7159    `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);
7160  (SET_TAC[]);
7161  (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[]);
7162
7163  (COND_CASES_TAC);
7164  (NEW_GOAL `F`);
7165  (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
7166  (UP_ASM_TAC THEN MESON_TAC[]);
7167  (COND_CASES_TAC);
7168
7169  (REWRITE_TAC[dihu3]);
7170
7171  (REWRITE_WITH `dihV (EL 0 ul) (EL 1 ul) (EL 2 ul) (mxi V ul) = 
7172    dihV u0 u1 u2 (m:real^3)`);
7173
7174  (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
7175  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
7176  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
7177
7178  (NEW_GOAL `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);
7179  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
7180  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
7181  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
7182                  CARD (set_of_list ul) = 3 + 1`);
7183  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
7184  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7185  (ARITH_TAC);
7186
7187  (NEW_GOAL `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);
7188  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
7189  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
7190  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
7191                  CARD (set_of_list ul) = 3 + 1`);
7192  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
7193  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7194  (ARITH_TAC);
7195
7196  (NEW_GOAL `{EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} = {u0, u1,u2,m:real^3}`);
7197  (REWRITE_WITH `
7198     {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} = {u0, u1,u2,m:real^3} <=>
7199     convex hull {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} = 
7200     convex hull {u0, u1,u2,m:real^3}`);
7201  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
7202  (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);
7203  (REPEAT STRIP_TAC);
7204
7205  (UNDISCH_TAC `~NULLSET X`);
7206  (REWRITE_TAC[]);
7207  (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);
7208  (COND_CASES_TAC);
7209  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
7210  (MATCH_MP_TAC BARV_3_EXPLICIT);
7211  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7212  (UP_ASM_TAC THEN STRIP_TAC);
7213  (ASM_REWRITE_TAC[set_of_list; TRUNCATE_SIMPLEX_EXPLICIT_2; 
7214                    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
7215  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7216  (EXISTS_TAC `affine hull {v0, v1, v2, mxi V [v0; v1; v2; v3]}`);
7217  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
7218  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
7219  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
7220  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
7221  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
7222  (UNDISCH_TAC `affine_dependent {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul}`);
7223  (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; 
7224                ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
7225
7226  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
7227
7228  (UNDISCH_TAC `~NULLSET X`);
7229  (REWRITE_TAC[]);
7230  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
7231    TRUNCATE_SIMPLEX_EXPLICIT_2; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
7232  (COND_CASES_TAC);
7233  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7234  (EXISTS_TAC `affine hull {u0, u1, u2, mxi V [u0; u1; u2; u3]}`);
7235  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
7236  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
7237  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
7238  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
7239  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
7240  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
7241  (EXPAND_TAC "m");
7242  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
7243  (ASM_REWRITE_TAC[]);
7244
7245  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
7246
7247  (REWRITE_WITH `convex hull {u0, u1, u2, m:real^3} = X`);
7248  (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; set_of_list]);
7249  (COND_CASES_TAC);
7250  (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
7251    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
7252  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
7253  (EXPAND_TAC "m");
7254  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
7255
7256  (NEW_GOAL `F`);
7257  (UNDISCH_TAC `~NULLSET X`);
7258  (REWRITE_TAC[]);
7259  (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; set_of_list]);
7260  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
7261  (UP_ASM_TAC THEN MESON_TAC[]);
7262
7263  (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);
7264  (COND_CASES_TAC);
7265  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
7266  (MATCH_MP_TAC BARV_3_EXPLICIT);
7267  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7268  (UP_ASM_TAC THEN STRIP_TAC);
7269  (REWRITE_TAC[set_of_list; ASSUME `ul = [v0; v1; v2; v3:real^3]`;
7270                TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
7271                SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
7272  (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
7273  (NEW_GOAL `F`);
7274  (UNDISCH_TAC `~NULLSET X`);
7275  (REWRITE_TAC[]);
7276  (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);
7277  (ASM_REWRITE_TAC[]);
7278  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
7279  (UP_ASM_TAC THEN MESON_TAC[]);
7280
7281  (UP_ASM_TAC THEN ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `1 = SUC 0`]);
7282
7283  (NEW_GOAL `mxi V ul = m`);
7284  (EXPAND_TAC "m");
7285  (MATCH_MP_TAC MCELL_ID_MXI);
7286  (EXISTS_TAC `k':num` THEN EXISTS_TAC `k:num`);
7287  (ASM_REWRITE_TAC[SET_RULE `3 IN {2, 3}`]);
7288  (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
7289  (ASM_REWRITE_TAC[]);
7290  (ASM_REWRITE_TAC[HD]);
7291  (REWRITE_WITH `HD (ul) = (HD (truncate_simplex 1 ul)):real^3`);
7292  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
7293  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
7294  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
7295                  CARD (set_of_list ul) = 3 + 1`);
7296  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
7297  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7298  (ARITH_TAC);
7299  (ASM_REWRITE_TAC[HD]);
7300  (ASM_REWRITE_TAC[]);
7301
7302  (STRIP_TAC);
7303  (NEW_GOAL `EL 2 ul = u2:real^3`);
7304  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
7305  (STRIP_TAC);
7306  (NEW_GOAL `{u0, u1, EL 2 ul, m} = {u0, u1, m:real^3}`);
7307  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
7308  (UNDISCH_TAC `~coplanar {u0,u1,m,u2:real^3}`);
7309  (REWRITE_TAC[]);
7310  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
7311  (REWRITE_TAC[GSYM (ASSUME `{u0, u1, EL 2 ul, m} = {u0, u1, u2, m:real^3}`);
7312               ASSUME `{u0, u1, EL 2 ul, m} = {u0, u1, m:real^3}`; COPLANAR_3]);
7313  (ASM_REWRITE_TAC[]);
7314  (REWRITE_TAC[DIHV_SYM_2]);
7315
7316  (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);
7317  (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);
7318  (AP_THM_TAC THEN AP_TERM_TAC);
7319
7320  (REWRITE_WITH 
7321   `measurable (conic_cap u0 u1 r d) /\
7322              vol (conic_cap u0 u1 r d) =
7323              (if u1 = u0 \/ &1 <= d \/ r < &0
7324               then &0
7325               else &2 / &3 * pi * (&1 - d) * r pow 3)`);
7326  (MATCH_MP_TAC VOLUME_CONIC_CAP);
7327  (EXPAND_TAC "d");
7328  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
7329  (COND_CASES_TAC);
7330  (NEW_GOAL `F`);
7331  (UP_ASM_TAC THEN STRIP_TAC);
7332  (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN MESON_TAC[]);
7333  (UNDISCH_TAC `d < &1` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7334  (UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7335  (UP_ASM_TAC THEN MESON_TAC[]);
7336  (REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
7337
7338  (REWRITE_WITH `max d (--(&1)) = d`);
7339  (MATCH_MP_TAC (REAL_ARITH `&0 < d /\ --(&1) < &0 ==> max d (--(&1)) = d`));
7340  (REWRITE_TAC[REAL_NEG_LT0]);
7341  (STRIP_TAC);
7342  (EXPAND_TAC "d");
7343  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
7344  (REAL_ARITH_TAC);
7345
7346  (REWRITE_WITH `
7347   (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *   
7348   ((&2 * pi) / (&2 * pi))`);
7349  (REAL_ARITH_TAC);
7350  (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);
7351  (MATCH_MP_TAC REAL_DIV_REFL);
7352  (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);
7353  (REAL_ARITH_TAC);
7354  (NEW_GOAL `F`);
7355  (UP_ASM_TAC THEN UNDISCH_TAC `k' = 3 /\ mcell k' V ul = mcell 3 V vl`
7356    THEN MESON_TAC[]);
7357  (UP_ASM_TAC THEN MESON_TAC[]);
7358
7359 (* ========================================================================= *)
7360
7361  (NEW_GOAL `F`);
7362  (NEW_GOAL `azim (u0:real^3) u1 m u2 = 
7363   (if azim u0 u1 u2 m = &0 then &0 else &2 * pi - azim u0 u1 u2 m)`);
7364  (MATCH_MP_TAC AZIM_COMPL);
7365  (STRIP_TAC);
7366
7367  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
7368  (EXISTS_TAC `m:real^3`);
7369  (ASM_REWRITE_TAC[]);
7370  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
7371  (EXISTS_TAC `u2:real^3`);
7372  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b, d, c}`]);
7373  (ASM_REWRITE_TAC[]);
7374  (UP_ASM_TAC THEN COND_CASES_TAC);
7375  (NEW_GOAL `F`);
7376  (NEW_GOAL `(&0 < pi)`);
7377  (REWRITE_TAC[PI_POS]);
7378  (UNDISCH_TAC `~(azim (u0:real^3) u1 u2 m < pi)`);
7379  (ASM_REWRITE_TAC[]);
7380  (UP_ASM_TAC THEN MESON_TAC[]);
7381  (STRIP_TAC);
7382
7383  (NEW_GOAL `azim (u0:real^3) u1 u2 m = pi`);
7384  (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7385  (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);
7386  (REWRITE_TAC[] THEN MATCH_MP_TAC AZIM_EQ_0_PI_IMP_COPLANAR);
7387  (ASM_REWRITE_TAC[]);
7388  (UP_ASM_TAC THEN MESON_TAC[]);
7389
7390 (* ========================================================================= *)
7391 (* ========================================================================= *)
7392
7393  (ABBREV_TAC `E = D INTER wedge_ge u0 u1 n1 n2`);
7394  (ABBREV_TAC 
7395    `s = {X | mcell_set V X /\ edgeX V X e /\ X SUBSET wedge_ge u0 u1 n1 n2}`);
7396  (NEW_GOAL `sum s (\t. vol (t INTER E)) = vol (E)`);
7397  (ABBREV_TAC `f = (\t:real^3->bool. t INTER E)`);
7398  (REWRITE_WITH `(\t. vol (t INTER E)) = (\x:real^3->bool. vol (f x))`);
7399  (EXPAND_TAC "f");
7400  (REWRITE_TAC[]);
7401  (REWRITE_WITH `sum s (\x:real^3->bool. vol (f x)) = vol (UNIONS (IMAGE f s))`);
7402  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
7403  (MATCH_MP_TAC MEASURE_NEGLIGIBLE_UNIONS_IMAGE);
7404  (REPEAT STRIP_TAC);
7405
7406  (EXPAND_TAC "s");
7407  (MATCH_MP_TAC FINITE_SUBSET);
7408  (EXISTS_TAC `{X | mcell_set V X /\ edgeX V X e}`);
7409  (STRIP_TAC);
7410  (MATCH_MP_TAC FINITE_EDGE_X2);
7411  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);
7412  (ASM_REWRITE_TAC[]);
7413  (SET_TAC[]);
7414
7415  (EXPAND_TAC "f");
7416  (MATCH_MP_TAC MEASURABLE_INTER);
7417  (STRIP_TAC);
7418  (UP_ASM_TAC THEN EXPAND_TAC "s");
7419  (REWRITE_TAC[mcell_set; IN; IN_ELIM_THM]);
7420  (REPEAT STRIP_TAC);
7421  (ASM_SIMP_TAC[MEASURABLE_MCELL]);
7422  (EXPAND_TAC "E");
7423  (REWRITE_TAC[ASSUME `D:real^3->bool = conic_cap u0 u1 r d`]);
7424  (REWRITE_TAC[MEASURABLE_CONIC_CAP_WEDGE_GE]);
7425
7426
7427  (EXPAND_TAC "f");
7428  (UNDISCH_TAC `(x:real^3->bool) IN s` THEN 
7429    UNDISCH_TAC `(y:real^3->bool) IN s` THEN EXPAND_TAC "s");
7430  (REWRITE_TAC[mcell_set_2; IN; IN_ELIM_THM]);
7431  (REPEAT STRIP_TAC);
7432  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7433  (EXISTS_TAC `x INTER (y:real^3->bool)`);
7434  (ASM_REWRITE_TAC[SET_RULE `(x INTER D) INTER y INTER D SUBSET x INTER y`]);
7435  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
7436  (STRIP_TAC);
7437
7438  (NEW_GOAL `i' = i /\ mcell i' V ul' = mcell i V ul`);
7439  (MATCH_MP_TAC Ajripqn.AJRIPQN);
7440  (ASM_REWRITE_TAC[SET_RULE `i IN {0, 1, 2, 3, 4} <=>
7441                              i = 0 \/ i = 1 \/ i = 2 \/ i = 3 \/ i = 4`]);
7442  (UNDISCH_TAC `i <= 4` THEN UNDISCH_TAC `i' <= 4` THEN ARITH_TAC);
7443  (UNDISCH_TAC `~(x = y:real^3->bool)` THEN ASM_REWRITE_TAC[]);
7444
7445  (EXPAND_TAC "s");
7446  (EXPAND_TAC "f" THEN REWRITE_TAC[IMAGE]);
7447
7448
7449  (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
7450  (REWRITE_WITH 
7451    `UNIONS
7452   {y | ?x. x IN
7453           {X | mcell_set V X /\ edgeX V X e /\ X SUBSET wedge_ge u0 u1 n1 n2} /\
7454           y = x INTER E} DIFF E = {}`);
7455  (REWRITE_TAC[SET_RULE `A DIFF B = {} <=> A SUBSET B`]);
7456  (REWRITE_TAC[UNIONS_SUBSET; IN; IN_ELIM_THM]);
7457  (SET_TAC[]);
7458  (REWRITE_TAC[SET_RULE `{} UNION A = A`]);
7459
7460  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7461  (EXISTS_TAC `UNIONS {y | ?x. x IN {X | mcell_set V X /\ NULLSET (X INTER E) /\ 
7462               ~(X INTER E = {})} /\  y = x INTER E}`);
7463  (STRIP_TAC);
7464  (MATCH_MP_TAC NEGLIGIBLE_UNIONS);
7465  (STRIP_TAC);
7466  (REWRITE_WITH 
7467   `{y | ?x. x IN
7468           {X | mcell_set V X /\ NULLSET (X INTER E) /\ ~(X INTER E = {})} /\
7469           y = x INTER E} = 
7470    {y | ?x. x IN
7471           {X | mcell_set V X /\ NULLSET (X INTER E) /\ ~(X INTER E = {})} /\
7472           y = f x}`);
7473  (EXPAND_TAC "f" THEN REWRITE_TAC[]);
7474  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
7475
7476  (MATCH_MP_TAC FINITE_SUBSET);
7477  (EXISTS_TAC `{X | X SUBSET ball (u0, &10) /\ mcell_set V X}`);
7478  (STRIP_TAC);
7479  (ASM_SIMP_TAC[FINITE_MCELL_SET_LEMMA_2]);
7480  (REWRITE_TAC[SUBSET; IN_BALL; IN; IN_ELIM_THM; mcell_set] THEN 
7481    REPEAT STRIP_TAC);
7482
7483  (NEW_GOAL `?v1:real^3. v1 IN x /\ v1 IN D`);
7484  (REWRITE_TAC[GSYM IN_INTER]);
7485  (UNDISCH_TAC `~(x:real^3->bool INTER E = {})` THEN EXPAND_TAC "E" THEN SET_TAC[]);
7486  (UP_ASM_TAC THEN STRIP_TAC);
7487  (NEW_GOAL `dist (u0, x') <= dist (u0, v1:real^3) + dist (v1, x')`);
7488  (NORM_ARITH_TAC);
7489  (NEW_GOAL `dist (u0, v1:real^3) < &1`);
7490  (REWRITE_TAC[GSYM IN_BALL]);
7491  (NEW_GOAL `D SUBSET ball (u0:real^3, &1)`);
7492  (EXPAND_TAC "D");
7493  (NEW_GOAL `ball (u0, r) SUBSET ball (u0:real^3, &1)`);
7494  (MATCH_MP_TAC SUBSET_BALL);
7495  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
7496  (UP_ASM_TAC THEN SET_TAC[]);
7497  (UP_ASM_TAC THEN UNDISCH_TAC `v1:real^3 IN D` THEN SET_TAC[]);
7498  (NEW_GOAL `dist (v1,x':real^3) < &8`);
7499  (REWRITE_TAC[GSYM IN_BALL]);
7500
7501  (NEW_GOAL `x SUBSET ball (v1:real^3, &8)`);
7502  (ASM_REWRITE_TAC[]);
7503  (MATCH_MP_TAC MCELL_SUBSET_BALL8);
7504  (REWRITE_TAC[GSYM (ASSUME `x = mcell i V ul`)] THEN ASM_REWRITE_TAC[]);
7505  (UNDISCH_TAC `(x:real^3->bool) x'` THEN UP_ASM_TAC THEN SET_TAC[]);
7506  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7507  (EXISTS_TAC `i:num` THEN EXISTS_TAC `ul:(real^3)list`);
7508  (ASM_REWRITE_TAC[]);
7509
7510  (REWRITE_TAC[IN; IN_ELIM_THM]);
7511  (REPEAT STRIP_TAC);
7512  (REWRITE_TAC[ASSUME `t:real^3->bool = x INTER E`]);
7513  (ASM_REWRITE_TAC[]);
7514
7515 (* ========================================================================= *)
7516
7517  (REWRITE_TAC[SUBSET; IN_UNIONS]);
7518  (REPEAT STRIP_TAC);
7519
7520  (NEW_GOAL `?v:real^3. v IN V /\ x IN voronoi_closed V v`);
7521  (ASM_SIMP_TAC[TIWWFYQ]);
7522  (UP_ASM_TAC THEN STRIP_TAC);
7523  (UP_ASM_TAC THEN REWRITE_WITH 
7524    `x IN voronoi_closed V v <=>  (?vl. vl IN barV V 3 /\ x IN rogers V vl /\
7525                                        truncate_simplex 0 vl = [v])`);
7526  (ASM_SIMP_TAC[GLTVHUM]);
7527  (REWRITE_TAC[IN] THEN STRIP_TAC);
7528  (NEW_GOAL `?i. i <= 4 /\ x IN mcell i V vl`);
7529  (ASM_SIMP_TAC[IN;SLTSTLO1]);
7530  (UP_ASM_TAC THEN STRIP_TAC);
7531
7532  (ABBREV_TAC `X = mcell i V vl`);
7533  (NEW_GOAL `~NULLSET (X INTER E) ==> F`);
7534  (STRIP_TAC);
7535
7536  (NEW_GOAL `?k ul.
7537                    2 <= k /\
7538                    barV V 3 ul /\
7539                    X = mcell k V ul /\
7540                    truncate_simplex 1 ul = [u0; u1]`);
7541  (FIRST_ASSUM MATCH_MP_TAC);
7542  (STRIP_TAC);
7543  (REWRITE_TAC[mcell_set; IN_ELIM_THM; IN]);
7544  (EXISTS_TAC `i:num` THEN EXISTS_TAC `vl:(real^3)list`);
7545  (ASM_REWRITE_TAC[]);
7546  (STRIP_TAC);
7547  (UNDISCH_TAC `~NULLSET (X INTER E)` THEN REWRITE_TAC[]);
7548  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7549  (EXISTS_TAC `X INTER (D:real^3->bool)`);
7550  (STRIP_TAC);
7551  (ASM_REWRITE_TAC[]);
7552  (EXPAND_TAC "E" THEN SET_TAC[]);
7553  (UP_ASM_TAC THEN STRIP_TAC);
7554
7555  (MP_TAC (ASSUME `x IN
7556       E DIFF
7557       UNIONS
7558       {y | ?x. x IN
7559                {X | mcell_set V X /\
7560                     edgeX V X e /\
7561                     (!x. x IN X ==> x IN wedge_ge u0 u1 n1 n2)} /\
7562                y = x INTER E}`));
7563  (REWRITE_TAC[IN_DIFF; MESON[] `~(A /\ ~B) <=> ~A \/ B`]);
7564  (DISJ2_TAC);
7565  (REWRITE_TAC[IN_UNIONS; IN; IN_ELIM_THM]);
7566  (EXISTS_TAC `X INTER (E:real^3->bool)`);
7567  (STRIP_TAC);
7568
7569  (EXISTS_TAC `(X:real^3->bool)`);
7570  (REWRITE_TAC[mcell_set; IN; IN_ELIM_THM] THEN STRIP_TAC);
7571  (EXISTS_TAC `i:num` THEN EXISTS_TAC `vl:(real^3)list`);
7572  (ASM_REWRITE_TAC[]);
7573
7574  (REWRITE_TAC[edgeX; IN_ELIM_THM]);
7575  (STRIP_TAC);
7576  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);
7577  (STRIP_TAC);
7578
7579  (NEW_GOAL `VX V X = V INTER X`);
7580  (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
7581  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `(if k < 4 then k else 4)`);
7582  (ASM_REWRITE_TAC[]);
7583  (STRIP_TAC);
7584  (COND_CASES_TAC);
7585  (MESON_TAC[]);
7586  (NEW_GOAL `k >= 4`);
7587  (UP_ASM_TAC THEN ARITH_TAC);
7588  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ]);
7589  (UNDISCH_TAC `~NULLSET (X INTER E)` THEN ASM_REWRITE_TAC[]);
7590  (MESON_TAC[NEGLIGIBLE_SUBSET; SET_RULE `A INTER B SUBSET A`]);
7591
7592  (NEW_GOAL `(V:real^3->bool) INTER X = 
7593             set_of_list (truncate_simplex ((if k < 4 then k else 4) - 1) ul)`);
7594  (REWRITE_WITH `X = mcell (if k < 4 then k else 4) V ul`);
7595  (ASM_REWRITE_TAC[]);
7596  (COND_CASES_TAC);
7597  (REFL_TAC);
7598  (NEW_GOAL `k >= 4`);
7599  (UP_ASM_TAC THEN ARITH_TAC);
7600  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ]);
7601
7602  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
7603  (ASM_REWRITE_TAC[]);
7604  (STRIP_TAC);
7605  (UNDISCH_TAC `2 <= k` THEN ARITH_TAC);
7606  (STRIP_TAC);
7607  (UNDISCH_TAC `2 <= k` THEN ARITH_TAC);
7608  (REWRITE_WITH `mcell (if k < 4 then k else 4) V ul = X`);
7609  (ASM_REWRITE_TAC[]);
7610  (COND_CASES_TAC);
7611  (REFL_TAC);
7612  (NEW_GOAL `k >= 4`);
7613  (UP_ASM_TAC THEN ARITH_TAC);
7614  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ]);
7615  (STRIP_TAC);
7616  (UNDISCH_TAC `~NULLSET (X INTER E)` THEN 
7617    REWRITE_TAC[ASSUME `X = {}:real^3->bool`; SET_RULE `{} INTER x = {}`;
7618    NEGLIGIBLE_EMPTY]);
7619  (ASM_REWRITE_TAC[]);
7620  (NEW_GOAL `set_of_list (truncate_simplex 1 (ul:(real^3)list)) SUBSET 
7621            set_of_list (truncate_simplex ((if k < 4 then k else 4) - 1) ul)`);
7622  (MATCH_MP_TAC Rogers.TRUNCATE_SIMPLEX_SUBSET);
7623  (REWRITE_WITH `LENGTH ul = 3 + 1 /\ 
7624                  CARD (set_of_list (ul:(real^3)list)) = 3 + 1`);
7625  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
7626  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7627  (UNDISCH_TAC `2 <= k` THEN ARITH_TAC);
7628  (REWRITE_TAC[MESON[IN] `(s:real^3->bool) u <=> u IN s`]);
7629
7630  (UP_ASM_TAC THEN REWRITE_TAC[ASSUME `truncate_simplex 1 ul = [u0; u1:real^3]`;
7631     set_of_list]);
7632  (SET_TAC[]);
7633  (ASM_REWRITE_TAC[]);
7634
7635  (REWRITE_TAC[MESON[IN] `(X:real^3->bool) a <=> a IN X`]);
7636  (REWRITE_TAC[GSYM SUBSET]);
7637
7638  (NEW_GOAL `X SUBSET wedge_ge u0 u1 n1 n2 \/ X SUBSET wedge_ge u0 u1 n2 n1`);
7639  (FIRST_ASSUM MATCH_MP_TAC);
7640  (STRIP_TAC);
7641  (REWRITE_TAC[mcell_set; IN; IN_ELIM_THM]);
7642  (EXISTS_TAC `k:num` THEN EXISTS_TAC `ul:(real^3)list` THEN ASM_REWRITE_TAC[]);
7643
7644  (REWRITE_TAC[edgeX; IN; IN_ELIM_THM]);
7645  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);
7646
7647  (NEW_GOAL `VX V X = V INTER X`);
7648  (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
7649  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `(if k < 4 then k else 4)`);
7650  (ASM_REWRITE_TAC[]);
7651  (STRIP_TAC);
7652  (COND_CASES_TAC);
7653  (MESON_TAC[]);
7654  (NEW_GOAL `k >= 4`);
7655  (UP_ASM_TAC THEN ARITH_TAC);
7656  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ]);
7657  (UNDISCH_TAC `~NULLSET (X INTER E)` THEN ASM_REWRITE_TAC[]);
7658  (MESON_TAC[NEGLIGIBLE_SUBSET; SET_RULE `A INTER B SUBSET A`]);
7659
7660  (NEW_GOAL `(V:real^3->bool) INTER X = 
7661             set_of_list (truncate_simplex ((if k < 4 then k else 4) - 1) ul)`);
7662  (REWRITE_WITH `X = mcell (if k < 4 then k else 4) V ul`);
7663  (ASM_REWRITE_TAC[]);
7664  (COND_CASES_TAC);
7665  (REFL_TAC);
7666  (NEW_GOAL `k >= 4`);
7667  (UP_ASM_TAC THEN ARITH_TAC);
7668  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ]);
7669
7670  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
7671  (ASM_REWRITE_TAC[]);
7672  (STRIP_TAC);
7673  (UNDISCH_TAC `2 <= k` THEN ARITH_TAC);
7674  (STRIP_TAC);
7675  (UNDISCH_TAC `2 <= k` THEN ARITH_TAC);
7676  (REWRITE_WITH `mcell (if k < 4 then k else 4) V ul = X`);
7677  (ASM_REWRITE_TAC[]);
7678  (COND_CASES_TAC);
7679  (REFL_TAC);
7680  (NEW_GOAL `k >= 4`);
7681  (UP_ASM_TAC THEN ARITH_TAC);
7682  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ]);
7683  (STRIP_TAC);
7684  (UNDISCH_TAC `~NULLSET (X INTER E)` THEN 
7685    REWRITE_TAC[ASSUME `X = {}:real^3->bool`; SET_RULE `{} INTER x = {}`;
7686    NEGLIGIBLE_EMPTY]);
7687  (ASM_REWRITE_TAC[]);
7688  (NEW_GOAL `set_of_list (truncate_simplex 1 (ul:(real^3)list)) SUBSET 
7689            set_of_list (truncate_simplex ((if k < 4 then k else 4) - 1) ul)`);
7690  (MATCH_MP_TAC Rogers.TRUNCATE_SIMPLEX_SUBSET);
7691  (REWRITE_WITH `LENGTH ul = 3 + 1 /\ 
7692                  CARD (set_of_list (ul:(real^3)list)) = 3 + 1`);
7693  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
7694  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7695  (UNDISCH_TAC `2 <= k` THEN ARITH_TAC);
7696  (REWRITE_TAC[MESON[IN] `(s:real^3->bool) u <=> u IN s`]);
7697
7698  (UP_ASM_TAC THEN REWRITE_TAC[ASSUME `truncate_simplex 1 ul = [u0; u1:real^3]`;
7699     set_of_list]);
7700  (SET_TAC[]);
7701
7702  (UP_ASM_TAC THEN STRIP_TAC);
7703  (NEW_GOAL `F`);
7704  (NEW_GOAL 
7705   `X INTER E SUBSET (wedge_ge u0 u1 n1 n2 INTER wedge_ge u0 u1 n2 n1)`);
7706  (REWRITE_TAC[SUBSET_INTER]);
7707  (STRIP_TAC);
7708  (EXPAND_TAC "E" THEN SET_TAC[]);
7709  (UP_ASM_TAC THEN SET_TAC[]);
7710  (UNDISCH_TAC `~NULLSET (X INTER E)` THEN REWRITE_TAC[]);
7711  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7712  (EXISTS_TAC `wedge_ge u0 u1 n1 n2 INTER wedge_ge u0 u1 n2 n1`);
7713  (STRIP_TAC);
7714  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7715  (EXISTS_TAC `aff_ge {u0,u1} {n1} UNION aff_ge {u0,u1} {n2:real^3}`);
7716  (STRIP_TAC);
7717
7718  (MATCH_MP_TAC NEGLIGIBLE_UNION);
7719  (STRIP_TAC);
7720  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7721  (EXISTS_TAC `affine hull {u0,u1,n1:real^3}`);
7722  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
7723  (REWRITE_TAC[SET_RULE `{a,b,c} = {a,b} UNION {c}`;  
7724                AFF_GE_SUBSET_AFFINE_HULL]);
7725
7726  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7727  (EXISTS_TAC `affine hull {u0,u1,n2:real^3}`);
7728  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
7729  (REWRITE_TAC[SET_RULE `{a,b,c} = {a,b} UNION {c}`;  
7730                AFF_GE_SUBSET_AFFINE_HULL]);
7731
7732  (REWRITE_TAC[ASSUME `wedge_ge u0 u1 n1 n2 INTER wedge_ge u0 u1 n2 n1 
7733    SUBSET aff_ge {u0, u1} {n1} UNION aff_ge {u0, u1:real^3} {n2}`]);
7734  (ASM_REWRITE_TAC[]);
7735  (UP_ASM_TAC THEN MESON_TAC[]);
7736
7737  (NEW_GOAL `(x:real^3) IN E`);
7738  (UNDISCH_TAC `x IN
7739       E DIFF
7740       UNIONS
7741       {y | ?x. x IN
7742                {X | mcell_set V X /\
7743                     edgeX V X e /\
7744                     (!x. x IN X ==> x IN wedge_ge u0 u1 n1 n2)} /\
7745                y = x INTER E}` THEN SET_TAC[]);
7746
7747  (REWRITE_TAC[MESON[IN] `(X INTER Y) a <=> a IN (X INTER Y)`]);
7748  (REWRITE_TAC[IN_INTER]);
7749  (ASM_REWRITE_TAC[]);
7750
7751  (EXISTS_TAC `X INTER (E:real^3 ->bool)`);
7752  (STRIP_TAC);
7753  (REWRITE_TAC[IN_ELIM_THM]);
7754  (EXISTS_TAC `X:real^3->bool`);
7755  (ASM_REWRITE_TAC[mcell_set; IN_ELIM_THM]);
7756  (UP_ASM_TAC THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);
7757  (EXISTS_TAC `i:num` THEN EXISTS_TAC `vl:(real^3)list`);
7758  (ASM_REWRITE_TAC[]);
7759  (ASM_REWRITE_TAC[]);
7760  (NEW_GOAL `(x:real^3) IN X INTER E`);
7761  (REWRITE_TAC[IN_INTER]);
7762  (ASM_REWRITE_TAC[]);
7763  (UNDISCH_TAC `x IN
7764       E DIFF
7765       UNIONS
7766       {y | ?x. x IN
7767                {X | mcell_set V X /\
7768                     edgeX V X e /\
7769                     (!x. x IN X ==> x IN wedge_ge u0 u1 n1 n2)} /\
7770                y = x INTER E}` THEN SET_TAC[]);
7771  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
7772
7773  (REWRITE_TAC[MESON[IN] `(X INTER Y) a <=> a IN (X INTER Y)`]);
7774  (REWRITE_TAC[IN_INTER]);
7775  (ASM_REWRITE_TAC[]);
7776  (UNDISCH_TAC `x IN
7777       E DIFF
7778       UNIONS
7779       {y | ?x. x IN
7780                {X | mcell_set V X /\
7781                     edgeX V X e /\
7782                     (!x. x IN X ==> x IN wedge_ge u0 u1 n1 n2)} /\
7783                y = x INTER E}` THEN SET_TAC[]);
7784
7785  (UP_ASM_TAC THEN 
7786    REWRITE_WITH `sum s (\t. vol (t INTER E)) = sum s (\t. vol (t INTER D))`);
7787  (MATCH_MP_TAC SUM_EQ);
7788  (EXPAND_TAC "s" THEN REWRITE_TAC[IN; IN_ELIM_THM; BETA_THM] THEN 
7789    REPEAT STRIP_TAC);
7790  (AP_TERM_TAC);
7791  (EXPAND_TAC "E" THEN UP_ASM_TAC THEN SET_TAC[]);
7792
7793
7794 (* ========================================================================= *)
7795
7796  (ABBREV_TAC 
7797   `t = {X | mcell_set V X /\ edgeX V X e /\ X SUBSET wedge_ge u0 u1 n1 n2 /\
7798            ~NULLSET (X INTER D)}`);
7799
7800  (REWRITE_WITH `sum s (\t. dihX V t (u0,u1)) = 
7801                  sum t (\t. dihX V t (u0,u1))`);
7802  (MATCH_MP_TAC SUM_SUPERSET);
7803  (EXPAND_TAC "s" THEN EXPAND_TAC "t" THEN REPEAT STRIP_TAC);
7804  (SET_TAC[]);
7805
7806  (NEW_GOAL `NULLSET (x INTER D)`);
7807  (UP_ASM_TAC THEN UP_ASM_TAC THEN REWRITE_TAC[IN; IN_ELIM_THM] );
7808  (MESON_TAC[]);
7809
7810  (NEW_GOAL `mcell_set V x /\ edgeX V x e`);
7811  (UNDISCH_TAC 
7812   `x IN {X | mcell_set V X /\ edgeX V X e /\ X SUBSET wedge_ge u0 u1 n1 n2}`);
7813  (REWRITE_TAC[IN; IN_ELIM_THM]);
7814  (MESON_TAC[]);
7815  (UP_ASM_TAC THEN REWRITE_TAC[mcell_set_2; IN_ELIM_THM;IN] THEN STRIP_TAC);
7816
7817  (NEW_GOAL `~NULLSET x`);
7818  (UP_ASM_TAC THEN REWRITE_TAC[edgeX; VX; IN_ELIM_THM]);
7819  (COND_CASES_TAC THEN REPEAT STRIP_TAC);
7820  (UNDISCH_TAC `{} (u:real^3)` THEN REWRITE_TAC[MESON[IN] `{} x <=> x IN {}`]);
7821  (SET_TAC[]);
7822
7823  (NEW_GOAL `VX V x = V INTER (x:real^3->bool)`);
7824  (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
7825  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
7826  (ASM_REWRITE_TAC[]);
7827
7828  (NEW_GOAL `V INTER (x:real^3->bool) = 
7829              set_of_list (truncate_simplex (i - 1) ul)`);
7830  (ASM_REWRITE_TAC[]);
7831  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
7832  (ASM_REWRITE_TAC[]);
7833  (STRIP_TAC);
7834  (ASM_CASES_TAC `i = 0`);
7835  (NEW_GOAL `V INTER (x:real^3->bool) = {}`);
7836  (ASM_REWRITE_TAC[]);
7837  (MATCH_MP_TAC Lepjbdj.LEPJBDJ_0);
7838  (ASM_REWRITE_TAC[]);
7839  (NEW_GOAL `F`);
7840  (UNDISCH_TAC `edgeX V x e` THEN REWRITE_TAC[edgeX; IN_ELIM_THM]);
7841  (STRIP_TAC);
7842  (UNDISCH_TAC `VX V x u` THEN ASM_REWRITE_TAC[MESON[IN] `{} x <=> x IN {}`]);
7843  (SET_TAC[]);
7844  (UP_ASM_TAC THEN MESON_TAC[]);
7845  (UP_ASM_TAC THEN ARITH_TAC);
7846  (REWRITE_TAC[GSYM (ASSUME `x = mcell i V ul`)] THEN STRIP_TAC);
7847  (UNDISCH_TAC `~NULLSET x` THEN REWRITE_TAC[ASSUME `x:real^3->bool = {}`;
7848    NEGLIGIBLE_EMPTY]);
7849
7850  (NEW_GOAL `(u0:real^3) IN VX V x /\ u1 IN VX V x`);
7851  (UNDISCH_TAC `edgeX V x e` THEN REWRITE_TAC[edgeX; IN_ELIM_THM; 
7852    ASSUME `e = {u0, u1:real^3}`]);
7853  (STRIP_TAC);
7854  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
7855
7856 (* ========================================================================== *)
7857  (NEW_GOAL `F`);
7858
7859  (ASM_CASES_TAC `i <= 1`);
7860  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2 ;v3:real^3]`);
7861  (MATCH_MP_TAC BARV_3_EXPLICIT);
7862  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7863  (UP_ASM_TAC THEN STRIP_TAC);
7864  (NEW_GOAL `i - 1 = 0`);
7865  (UNDISCH_TAC `i <= 1` THEN ARITH_TAC);
7866  (UNDISCH_TAC `u0 IN VX V x /\ u1 IN VX V x`);
7867  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_0; set_of_list]);
7868  (UNDISCH_TAC `~(u0 = u1:real^3)` THEN SET_TAC[]);
7869
7870  (ASM_CASES_TAC `i = 3`);
7871  (NEW_GOAL `vol (x INTER D) > &0`);
7872  (ONCE_REWRITE_TAC[SET_RULE `a INTER b = b INTER a`]);
7873  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2 ;v3:real^3]`);
7874  (MATCH_MP_TAC BARV_3_EXPLICIT);
7875  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7876  (UP_ASM_TAC THEN STRIP_TAC);
7877  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell3; TRUNCATE_SIMPLEX_EXPLICIT_2; 
7878    set_of_list; SET_RULE `{a,c,d} UNION {x} = {a,c,d,x}`]);
7879  (COND_CASES_TAC);
7880  (NEW_GOAL `i - 1 = 2`);
7881  (UNDISCH_TAC `i = 3` THEN ARITH_TAC);
7882  (UNDISCH_TAC `u0 IN VX V x /\ u1 IN VX V x`);
7883  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list]);
7884  (STRIP_TAC);
7885  (NEW_GOAL `?v:real^3. {u0, u1, v} = {v0, v1, v2}`);
7886  (NEW_GOAL `?v:real^3. v IN {v0, v1, v2} DIFF {u0, u1}`);
7887  (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
7888  (REWRITE_WITH `{v0, v1, v2} DIFF {u0, u1:real^3} = {} <=> 
7889                   CARD ({v0, v1, v2} DIFF {u0, u1}) = 0`);
7890  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
7891  (MATCH_MP_TAC CARD_EQ_0);
7892  (MATCH_MP_TAC FINITE_SUBSET);
7893  (EXISTS_TAC `{v0, v1, v2:real^3}`);
7894  (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
7895  (REWRITE_TAC[ARITH_RULE `~(a = 0) <=> 1 <= a`]);
7896
7897  (NEW_GOAL `CARD {v0, v1, v2} = CARD ({v0, v1, v2} DIFF {u0, u1:real^3}) +
7898                                  CARD {u0, u1}`);
7899  (MATCH_MP_TAC Hypermap.CARD_MINUS_DIFF_TWO_SET);
7900  (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
7901  (UP_ASM_TAC THEN REWRITE_WITH `CARD ({v0, v1, v2:real^3}) = 3`);
7902  (REWRITE_WITH `{v0, v1, v2:real^3} = set_of_list (truncate_simplex 2 ul)`);
7903  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list]);
7904  (ABBREV_TAC `xl = truncate_simplex 2 (ul:(real^3)list)`);
7905  (REWRITE_WITH `LENGTH (xl:(real^3)list) = 2 + 1 /\ 
7906                  CARD (set_of_list xl) = 2 + 1`);
7907  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
7908  (EXISTS_TAC `V:real^3->bool` THEN STRIP_TAC);
7909  (ASM_REWRITE_TAC[]);
7910  (EXPAND_TAC "xl" THEN MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
7911  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
7912  (ARITH_TAC);
7913
7914  (NEW_GOAL `CARD {u0, u1:real^3} <= 2`);
7915  (REWRITE_TAC[Geomdetail.CARD2]);
7916  (UP_ASM_TAC THEN ARITH_TAC);
7917  (UP_ASM_TAC THEN STRIP_TAC);
7918  (EXISTS_TAC `v:real^3`);
7919  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN 
7920    UNDISCH_TAC `~(u0 = u1:real^3)` THEN SET_TAC[]);
7921  (UP_ASM_TAC THEN STRIP_TAC);
7922  (NEW_GOAL `{v0, v1, v2, mxi V [v0; v1; v2; v3]} = 
7923              {u0, u1, v, mxi V [v0; v1; v2; v3]}`);
7924  (UP_ASM_TAC THEN SET_TAC[]);
7925  (ASM_REWRITE_TAC[]);
7926  (MATCH_MP_TAC CONIC_CAP_INTER_CONVEX_HULL_4_GT_0);
7927  (ASM_REWRITE_TAC[]);
7928  (STRIP_TAC);
7929  (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
7930  (REWRITE_TAC[GSYM (ASSUME `{v0, v1, v2, mxi V [v0; v1; v2; v3]} =
7931                {u0, u1, v, mxi V [v0; v1; v2; v3]}`)] THEN STRIP_TAC);
7932  (UNDISCH_TAC `~NULLSET x`);
7933  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
7934    TRUNCATE_SIMPLEX_EXPLICIT_2]);
7935  (REWRITE_TAC[SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
7936  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7937  (EXISTS_TAC `affine hull {v0, v1, v2, mxi V [v0; v1; v2; v3]}`);
7938  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
7939  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
7940  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
7941  (ASM_REWRITE_TAC[]);
7942
7943  (NEW_GOAL `F`);
7944  (UNDISCH_TAC `~NULLSET x`);
7945  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
7946    TRUNCATE_SIMPLEX_EXPLICIT_2]);
7947  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
7948  (UP_ASM_TAC THEN MESON_TAC[]);
7949
7950  (NEW_GOAL `vol (x INTER D) = &0`);
7951  (MATCH_MP_TAC MEASURE_EQ_0);
7952  (ASM_REWRITE_TAC[]);
7953  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7954
7955
7956 (* ========================================== *)
7957
7958  (ASM_CASES_TAC `i = 4`);
7959  (NEW_GOAL `vol (x INTER D) > &0`);
7960  (ONCE_REWRITE_TAC[SET_RULE `a INTER b = b INTER a`]);
7961  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2 ;v3:real^3]`);
7962  (MATCH_MP_TAC BARV_3_EXPLICIT);
7963  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7964  (UP_ASM_TAC THEN STRIP_TAC);
7965  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4; ARITH_RULE `4 >= 4`; 
7966    set_of_list]);
7967  (COND_CASES_TAC);
7968  (NEW_GOAL `i - 1 = 3`);
7969  (UNDISCH_TAC `i = 4` THEN ARITH_TAC);
7970  (UNDISCH_TAC `u0 IN VX V x /\ u1 IN VX V x`);
7971  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_3; set_of_list]);
7972  (STRIP_TAC);
7973
7974  (NEW_GOAL `?v w:real^3. {u0, u1, v, w} = {v0, v1, v2, v3}`);
7975
7976  (NEW_GOAL `?v:real^3. v IN {v0, v1, v2, v3} DIFF {u0, u1}`);
7977  (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
7978  (REWRITE_WITH `{v0, v1, v2, v3} DIFF {u0, u1:real^3} = {} <=> 
7979                   CARD ({v0, v1, v2, v3} DIFF {u0, u1}) = 0`);
7980  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
7981  (MATCH_MP_TAC CARD_EQ_0);
7982  (MATCH_MP_TAC FINITE_SUBSET);
7983  (EXISTS_TAC `{v0, v1, v2, v3:real^3}`);
7984  (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
7985  (REWRITE_TAC[ARITH_RULE `~(a = 0) <=> 1 <= a`]);
7986
7987  (NEW_GOAL `CARD {v0, v1, v2, v3} = 
7988              CARD ({v0, v1, v2, v3} DIFF {u0, u1:real^3}) + CARD {u0, u1}`);
7989  (MATCH_MP_TAC Hypermap.CARD_MINUS_DIFF_TWO_SET);
7990  (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
7991
7992  (UP_ASM_TAC THEN REWRITE_WITH `CARD ({v0, v1, v2, v3:real^3}) = 3 + 1`);
7993  (REWRITE_WITH `{v0, v1, v2, v3:real^3} = set_of_list ul`);
7994  (ASM_REWRITE_TAC[set_of_list]);
7995  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
7996                  CARD (set_of_list ul) = 3 + 1`);
7997  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
7998  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7999  (NEW_GOAL `CARD {u0, u1:real^3} <= 2`);
8000  (REWRITE_TAC[Geomdetail.CARD2]);
8001  (UP_ASM_TAC THEN ARITH_TAC);
8002  (UP_ASM_TAC THEN STRIP_TAC);
8003
8004  (NEW_GOAL `?w:real^3. w IN {v0, v1, v2, v3} DIFF {u0, u1, v}`);
8005  (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
8006  (REWRITE_WITH `{v0, v1, v2, v3} DIFF {u0, u1, v:real^3} = {} <=> 
8007                   CARD ({v0, v1, v2, v3} DIFF {u0, u1, v}) = 0`);
8008  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
8009  (MATCH_MP_TAC CARD_EQ_0);
8010  (MATCH_MP_TAC FINITE_SUBSET);
8011  (EXISTS_TAC `{v0, v1, v2, v3:real^3}`);
8012  (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
8013  (REWRITE_TAC[ARITH_RULE `~(a = 0) <=> 1 <= a`]);
8014
8015  (NEW_GOAL `CARD ({v0, v1, v2, v3} DIFF {u0, u1,v:real^3}) = 
8016              CARD {v0, v1, v2, v3} - CARD {u0,u1,v}`);
8017  (MATCH_MP_TAC CARD_DIFF);
8018  (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
8019  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
8020  (UP_ASM_TAC THEN REWRITE_WITH `CARD ({v0, v1, v2, v3:real^3}) = 3 + 1`);
8021  (REWRITE_WITH `{v0, v1, v2, v3:real^3} = set_of_list ul`);
8022  (ASM_REWRITE_TAC[set_of_list]);
8023  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
8024                  CARD (set_of_list ul) = 3 + 1`);
8025  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
8026  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
8027  (NEW_GOAL `CARD {u0, u1, v:real^3} <= 3`);
8028  (REWRITE_TAC[Geomdetail.CARD3]);
8029  (UP_ASM_TAC THEN ARITH_TAC);
8030  (UP_ASM_TAC THEN STRIP_TAC);
8031
8032  (EXISTS_TAC `v:real^3` THEN EXISTS_TAC `w:real^3`);
8033  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN 
8034    UNDISCH_TAC `~(u0 = u1:real^3)` THEN SET_TAC[]);
8035  (UP_ASM_TAC THEN STRIP_TAC);
8036  (REWRITE_TAC[GSYM (ASSUME `{u0:real^3, u1, v, w} = {v0, v1, v2, v3}`)]);
8037  (MATCH_MP_TAC CONIC_CAP_INTER_CONVEX_HULL_4_GT_0);
8038  (ASM_REWRITE_TAC[]);
8039  (STRIP_TAC);
8040  (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
8041  (STRIP_TAC);
8042  (UNDISCH_TAC `~NULLSET x`);
8043  (SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list; ARITH_RULE `4 >= 4`; 
8044    ASSUME `x  = mcell i V ul`; ASSUME `i = 4`; 
8045    ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
8046  (COND_CASES_TAC);
8047  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
8048  (EXISTS_TAC `affine hull {v0, v1, v2, v3:real^3}`);
8049  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
8050  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
8051  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
8052  (ASM_REWRITE_TAC[]);
8053  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
8054
8055  (NEW_GOAL `F`);
8056  (UNDISCH_TAC `~NULLSET x`);
8057  (SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list; ARITH_RULE `4 >= 4`; 
8058    ASSUME `x  = mcell i V ul`; ASSUME `i = 4`; 
8059    ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
8060  (COND_CASES_TAC);
8061  (NEW_GOAL `F`);
8062  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
8063  (UP_ASM_TAC THEN MESON_TAC[]);
8064  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
8065  (UP_ASM_TAC THEN MESON_TAC[]);
8066
8067  (NEW_GOAL `vol (x INTER D) = &0`);
8068  (MATCH_MP_TAC MEASURE_EQ_0);
8069  (ASM_REWRITE_TAC[]);
8070  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
8071
8072 (* ========================================== *)
8073
8074  (NEW_GOAL `i = 2`);
8075  (UNDISCH_TAC `i <= 4` THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC 
8076    THEN ARITH_TAC);
8077
8078  (NEW_GOAL `vol (x INTER D) > &0`);
8079  (ONCE_REWRITE_TAC[SET_RULE `a INTER b = b INTER a`]);
8080  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2 ;v3:real^3]`);
8081  (MATCH_MP_TAC BARV_3_EXPLICIT);
8082  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
8083  (UP_ASM_TAC THEN STRIP_TAC);
8084  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2; TRUNCATE_SIMPLEX_EXPLICIT_1; 
8085    set_of_list; HD; TL]);
8086  (LET_TAC);
8087  (COND_CASES_TAC);
8088
8089  (NEW_GOAL `i - 1 = 1`);
8090  (UNDISCH_TAC `i = 2` THEN ARITH_TAC);
8091  (UNDISCH_TAC `u0 IN VX V x /\ u1 IN VX V x`);
8092  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; set_of_list]);
8093  (STRIP_TAC);
8094  (NEW_GOAL `{u0, u1} = {v0, v1:real^3}`);
8095  (UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN
8096    SET_TAC[]);
8097  (REWRITE_TAC[SET_RULE `A INTER B INTER C INTER D = 
8098                         (A INTER (B INTER C)) INTER D`]);
8099  (REWRITE_WITH `rcone_ge v0 v1 a' INTER rcone_ge v1 v0 a' = 
8100                  rcone_ge u0 u1 a' INTER rcone_ge u1 (u0:real^3) a'`);
8101  (ASM_CASES_TAC `u0:real^3 = v0`);
8102  (NEW_GOAL `u1 = v1:real^3`);
8103  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
8104  (ASM_REWRITE_TAC[]);
8105  (NEW_GOAL `u0 = v1:real^3`);
8106  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
8107  (NEW_GOAL `u1 = v0:real^3`);
8108  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
8109  (ASM_REWRITE_TAC[]);
8110  (SET_TAC[]);
8111
8112  (REWRITE_WITH 
8113   `conic_cap u0 u1 r d INTER rcone_ge u0 u1 a' INTER rcone_ge u1 u0 a' =
8114    conic_cap (u0:real^3) u1 r d`);
8115  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> A INTER B = A`));
8116
8117  (NEW_GOAL `conic_cap (u0:real^3) u1 r d SUBSET rcone_ge u0 u1 a'`);
8118  (REWRITE_TAC[conic_cap]);
8119  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A SUBSET B`));
8120  (NEW_GOAL `rcone_gt u0 u1 d SUBSET rcone_gt (u0:real^3) u1 a'`);
8121  (MATCH_MP_TAC RCONE_GT_SUBSET);
8122  (EXPAND_TAC "d" THEN EXPAND_TAC "c");
8123  (MATCH_MP_TAC (REAL_ARITH `a = x ==> a <= max (max y x) (max z t)`));
8124  (EXPAND_TAC "a'" THEN REWRITE_TAC[HL; set_of_list] THEN ASM_REWRITE_TAC[]);
8125  (NEW_GOAL `rcone_gt u0 u1 a' SUBSET rcone_ge (u0:real^3) u1 a'`);
8126  (REWRITE_TAC[RCONE_GT_SUBSET_RCONE_GE]);
8127  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
8128  (REWRITE_TAC[SUBSET_INTER] THEN STRIP_TAC);
8129  (ASM_REWRITE_TAC[]);
8130
8131  (REWRITE_TAC[SUBSET]);
8132  (REPEAT STRIP_TAC);
8133  (MATCH_MP_TAC Marchal_cells_2_new.RCONEGE_INTER_VORONOI_CLOSED_IMP_RCONEGE);
8134  (EXISTS_TAC `V:real^3->bool`);
8135  (ASM_REWRITE_TAC[]);
8136  (REPEAT STRIP_TAC);
8137
8138  (REWRITE_WITH `a' = hl [u0; u1:real^3] / sqrt (&2)`);
8139  (EXPAND_TAC "a'");
8140  (REWRITE_TAC[HL; set_of_list] THEN ASM_REWRITE_TAC[]);
8141  (MATCH_MP_TAC REAL_LT_DIV);
8142  (REWRITE_TAC[HL_2]);
8143  (STRIP_TAC);
8144  (MATCH_MP_TAC REAL_LT_MUL);
8145  (REWRITE_TAC[REAL_ARITH `&0 < inv (&2)`]);
8146  (MATCH_MP_TAC DIST_POS_LT);
8147  (ASM_REWRITE_TAC[]);
8148  (MATCH_MP_TAC SQRT_POS_LT);
8149  (REAL_ARITH_TAC);
8150  (EXPAND_TAC "a'");
8151  (MATCH_MP_TAC REAL_DIV_LE_1_TACTICS);
8152  (STRIP_TAC);
8153  (MATCH_MP_TAC SQRT_POS_LT);
8154  (REAL_ARITH_TAC);
8155  (MATCH_MP_TAC (REAL_ARITH `a < b ==> a <= b`));
8156  (ASM_REWRITE_TAC[]);
8157
8158  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
8159  (NEW_GOAL `x':real^3 IN ball (u0, (&1))`);
8160  (UP_ASM_TAC THEN REWRITE_TAC[conic_cap;NORMBALL_BALL] THEN STRIP_TAC);
8161  (NEW_GOAL `ball (u0, r) SUBSET ball (u0:real^3, &1)`);
8162  (MATCH_MP_TAC SUBSET_BALL);
8163  (EXPAND_TAC "r");
8164  (REAL_ARITH_TAC);
8165  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
8166  (UP_ASM_TAC THEN REWRITE_TAC[IN_BALL] THEN ONCE_REWRITE_TAC[DIST_SYM] 
8167    THEN STRIP_TAC);
8168  (REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
8169  (REPEAT STRIP_TAC);
8170  (ASM_CASES_TAC `u0 = w:real^3`);
8171  (ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC);
8172  (NEW_GOAL `&2 <= dist (u0, w:real^3)`);
8173  (UNDISCH_TAC `packing (V:real^3->bool)` THEN REWRITE_TAC[packing]);
8174  (STRIP_TAC);
8175  (FIRST_ASSUM MATCH_MP_TAC);
8176  (ASM_REWRITE_TAC[]);
8177  (UNDISCH_TAC `u0:real^3 IN V` THEN REWRITE_TAC[IN]);
8178  (NEW_GOAL `dist (x', u0) >= dist (u0, w) - dist (x', w:real^3)`);
8179  (NORM_ARITH_TAC);
8180  (UP_ASM_TAC THEN UP_ASM_TAC THEN DEL_TAC THEN DEL_TAC THEN UP_ASM_TAC
8181    THEN REAL_ARITH_TAC);
8182  (ABBREV_TAC `M = mxi V [v0; v1; v2; v3]`);
8183  (ABBREV_TAC `R = omega_list_n V [v0; v1; v2; v3] 3`);
8184
8185  (NEW_GOAL `vol (conic_cap u0 u1 r d INTER convex hull {v0:real^3,v1,M,R}) 
8186          <=  vol (conic_cap u0 u1 r d INTER aff_ge {v0, v1} {M, R})`);
8187  (MATCH_MP_TAC MEASURE_SUBSET);
8188  (REPEAT STRIP_TAC);
8189  (MATCH_MP_TAC MEASURABLE_INTER);
8190  (REWRITE_TAC[MEASURABLE_CONIC_CAP]);
8191  (MATCH_MP_TAC MEASURABLE_CONVEX_HULL);
8192  (MATCH_MP_TAC FINITE_IMP_BOUNDED);
8193  (REWRITE_TAC[Geomdetail.FINITE6]);
8194
8195  (REWRITE_TAC[conic_cap; NORMBALL_BALL]);
8196  (ONCE_REWRITE_TAC[SET_RULE `(a INTER b) INTER c = 
8197                               (a INTER b) INTER (a INTER c)`]);
8198  (MATCH_MP_TAC MEASURABLE_INTER);
8199  (REWRITE_TAC[MEASURABLE_BALL_AFF_GE]);
8200  (REWRITE_TAC[GSYM conic_cap; GSYM NORMBALL_BALL; MEASURABLE_CONIC_CAP]);
8201
8202  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A SUBSET C INTER B`));
8203  (REWRITE_TAC[Marchal_cells_2_new.CONVEX_HULL_4_SUBSET_AFF_GE_2_2]);
8204
8205
8206
8207  (NEW_GOAL `vol (conic_cap u0 u1 r d INTER convex hull {v0, v1, M, R}) > &0`);
8208  (REWRITE_WITH `{v0, v1, M, R} = {u0, u1, M, R:real^3}`);
8209  (UNDISCH_TAC `{u0, u1} = {v0, v1:real^3}` THEN SET_TAC[]);
8210  (MATCH_MP_TAC CONIC_CAP_INTER_CONVEX_HULL_4_GT_0);
8211  (ASM_REWRITE_TAC[]);
8212  (REPEAT STRIP_TAC);
8213  (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
8214
8215  (UNDISCH_TAC `~NULLSET x`);
8216  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2; set_of_list;
8217    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
8218  (LET_TAC);
8219  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
8220  (EXISTS_TAC `aff_ge {v0, v1} {M, R:real^3}`);
8221  (REWRITE_TAC[SET_RULE `a INTER B INTER c SUBSET c`]);
8222  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
8223  (EXISTS_TAC `affine hull ({v0, v1} UNION {M, R:real^3})`);
8224  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL; SET_RULE 
8225   `{a, b} UNION {c, d} = {a,b,c,d}`]);
8226  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
8227  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
8228  (REWRITE_WITH `{v0, v1, M, R} = {u0, u1, M, R:real^3}`);
8229  (UNDISCH_TAC `{u0, u1} = {v0, v1:real^3}` THEN SET_TAC[]);
8230  (ASM_REWRITE_TAC[]);
8231  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
8232
8233  (NEW_GOAL `F`);
8234  (UNDISCH_TAC `~NULLSET x`);
8235  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2; set_of_list;
8236    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
8237  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
8238  (UP_ASM_TAC THEN MESON_TAC[]);
8239
8240  (NEW_GOAL `vol (x INTER D) = &0`);
8241  (MATCH_MP_TAC MEASURE_EQ_0);
8242  (ASM_REWRITE_TAC[]);
8243  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
8244  (UP_ASM_TAC THEN MESON_TAC[]);
8245
8246 (* ========================================== *)
8247
8248  (REWRITE_WITH `sum s (\t. vol (t INTER D)) = 
8249                  sum t (\t. vol (t INTER D))`);
8250  (MATCH_MP_TAC SUM_SUPERSET);
8251  (EXPAND_TAC "s" THEN EXPAND_TAC "t" THEN REPEAT STRIP_TAC);
8252  (SET_TAC[]);
8253  (MATCH_MP_TAC MEASURE_EQ_0);
8254  (UP_ASM_TAC THEN UP_ASM_TAC THEN REWRITE_TAC[IN; IN_ELIM_THM] );
8255  (MESON_TAC[]);
8256
8257  (REWRITE_WITH `sum t (\t. vol (t INTER D)) = 
8258                  sum t (\t. vol D * dihX V t (u0,u1) / (&2 * pi))`);
8259  (MATCH_MP_TAC SUM_EQ);
8260  (EXPAND_TAC "t" THEN REWRITE_TAC[IN_ELIM_THM; IN] THEN REPEAT STRIP_TAC);
8261  (ASM_SIMP_TAC[]);
8262
8263  (REWRITE_TAC[REAL_ARITH `a * b / c = (a / c) * b`]);
8264  (REWRITE_TAC[SUM_LMUL]);
8265  (ABBREV_TAC `R = sum t (\t. dihX V t (u0,u1))`);
8266
8267  (REWRITE_WITH `vol E = vol D * azim u0 u1 n1 n2 / (&2 * pi)`);
8268  (EXPAND_TAC "E" THEN 
8269    REWRITE_TAC[ASSUME `D:real^3->bool = conic_cap u0 u1 r d`]);
8270  (MATCH_MP_TAC VOLUME_CONIC_CAP_WEDGE_GE_VS_CONIC_CAP);
8271  (REPEAT STRIP_TAC);
8272  (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
8273  (ASM_REWRITE_TAC[]);
8274  (ASM_REWRITE_TAC[]);
8275  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
8276
8277  (UP_ASM_TAC THEN REWRITE_TAC[]);
8278  (NEW_GOAL `?a0 a1 a2. vl1 = [a0;a1;a2:real^3]`);
8279  (MATCH_MP_TAC Qzksykg.BARV_2_EXPLICIT);
8280  (EXISTS_TAC `V:real^3->bool` THEN 
8281    ASM_REWRITE_TAC[MESON[IN] `barV V 2 vl1 <=> vl1 IN barV V 2`]);
8282  (UP_ASM_TAC THEN STRIP_TAC);
8283  (REWRITE_WITH `{u0,u1,n1:real^3} = set_of_list vl1`);
8284  (ASM_REWRITE_TAC[set_of_list; EL; HD; TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);
8285  (NEW_GOAL `{a0, a1:real^3} = {u0,u1}`);
8286  (REWRITE_TAC[GSYM (ASSUME `e = {u0,u1:real^3}`); 
8287    GSYM (ASSUME `set_of_list (truncate_simplex 1 vl1) = e:real^3->bool`)]);
8288  (REWRITE_TAC[ASSUME `vl1 = [a0; a1; a2:real^3]`; TRUNCATE_SIMPLEX_EXPLICIT_1; 
8289                set_of_list]);
8290  (UP_ASM_TAC THEN SET_TAC[]);
8291  (MATCH_MP_TAC BARV_2_IMP_NOT_COLLINEAR_SET_OF_LIST);
8292  (EXISTS_TAC `V:real^3->bool` THEN 
8293    ASM_REWRITE_TAC[MESON[IN] `barV V 2 vl1 <=> vl1 IN barV V 2`]);
8294
8295
8296  (UP_ASM_TAC THEN REWRITE_TAC[]);
8297  (NEW_GOAL `?a0 a1 a2. vl2 = [a0;a1;a2:real^3]`);
8298  (MATCH_MP_TAC Qzksykg.BARV_2_EXPLICIT);
8299  (EXISTS_TAC `V:real^3->bool` THEN 
8300    ASM_REWRITE_TAC[MESON[IN] `barV V 2 vl2 <=> vl2 IN barV V 2`]);
8301  (UP_ASM_TAC THEN STRIP_TAC);
8302  (REWRITE_WITH `{u0,u1,n2:real^3} = set_of_list vl2`);
8303  (ASM_REWRITE_TAC[set_of_list; EL; HD; TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);
8304  (NEW_GOAL `{a0, a1:real^3} = {u0,u1}`);
8305  (REWRITE_TAC[GSYM (ASSUME `e = {u0,u1:real^3}`); 
8306    GSYM (ASSUME `set_of_list (truncate_simplex 1 vl2) = e:real^3->bool`)]);
8307  (REWRITE_TAC[ASSUME `vl2 = [a0; a1; a2:real^3]`; TRUNCATE_SIMPLEX_EXPLICIT_1; 
8308                set_of_list]);
8309  (UP_ASM_TAC THEN SET_TAC[]);
8310  (MATCH_MP_TAC BARV_2_IMP_NOT_COLLINEAR_SET_OF_LIST);
8311  (EXISTS_TAC `V:real^3->bool` THEN 
8312    ASM_REWRITE_TAC[MESON[IN] `barV V 2 vl2 <=> vl2 IN barV V 2`]);
8313
8314  (REWRITE_TAC[REAL_ARITH `a / b * c = (a * c) / b`]);
8315  (REWRITE_WITH 
8316    `(vol D * R) / (&2 * pi) = vol D * azim u0 u1 n1 n2 / (&2 * pi) <=>
8317     (vol D * R) = (vol D * azim u0 u1 n1 n2 / (&2 * pi)) * (&2 * pi)`);
8318  (MATCH_MP_TAC REAL_EQ_LDIV_EQ);
8319  (MATCH_MP_TAC REAL_LT_MUL);
8320  (REWRITE_TAC[PI_POS]);
8321  (REAL_ARITH_TAC);
8322  (REWRITE_TAC[REAL_ARITH `(a * b / c) * c = (a * b)  * c/c`]);
8323  (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);
8324  (MATCH_MP_TAC REAL_DIV_REFL);
8325  (MATCH_MP_TAC (REAL_ARITH `&0 < a ==> ~(a = &0)`));
8326  (MATCH_MP_TAC REAL_LT_MUL);
8327  (REWRITE_TAC[PI_POS]);
8328  (REAL_ARITH_TAC);
8329  (REWRITE_TAC[REAL_ARITH `a * x = (a * t) * &1 <=> a * (x - t) = &0`]);
8330  (REWRITE_TAC[REAL_ENTIRE]);
8331  (STRIP_TAC);
8332  (NEW_GOAL `F`);
8333  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
8334
8335  (NEW_GOAL `&0 < d`);
8336  (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
8337  (ASM_SIMP_TAC[VOLUME_CONIC_CAP]);
8338  (COND_CASES_TAC);
8339  (REWRITE_TAC[]);
8340  (UNDISCH_TAC `d < &1` THEN UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC 
8341    THEN REAL_ARITH_TAC);
8342  (REWRITE_TAC[REAL_ARITH `&2 / &3 * a = &0 <=> a = &0`]);
8343  (REWRITE_TAC[REAL_ENTIRE]);
8344  (NEW_GOAL `~(pi = &0)`);
8345  (MP_TAC PI_POS THEN REAL_ARITH_TAC);
8346  (NEW_GOAL `~(&1 - d = &0)`);
8347  (UNDISCH_TAC `d < &1` THEN REAL_ARITH_TAC);
8348  (NEW_GOAL `~(r pow 3 = &0)`);
8349  (MATCH_MP_TAC REAL_POW_NZ);
8350  (UNDISCH_TAC `&0 < r` THEN REAL_ARITH_TAC);
8351  (ASM_REWRITE_TAC[]);
8352  (UP_ASM_TAC THEN MESON_TAC[]);
8353  (UP_ASM_TAC THEN REAL_ARITH_TAC)]);;
8354
8355 (* ========================================================================= *)
8356 (* ========================================================================= *)
8357
8358 end;;