Update from HH
[Flyspeck/.git] / text_formalization / packing / TSKAJXY_lemmas.hl
1 (* ========================================================================== *)
2 (* FLYSPECK - BOOK FORMALIZATION                                              *)
3 (*                                                                            *)
4 (* Chapter: Packing                                                           *)
5 (* Lemma: TSKAJXY                                                             *)
6 (* Author: Vu Khac Ky                                                         *)
7 (* Date: 2012-11                                                              *)
8 (* ========================================================================== *)
9
10
11 module Tskajxy_lemmas = 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 open Collect_geom;;
51
52 (* ------------------------------------------------------------------------ *)
53 (*                     Changed by Vu Khac Ky - 15 Nov 2012                  *)
54 (*   The tactic SET_TAC has been changed collect_geom.hl, therefore         *)
55 (*   other files cannot be processed. It causes some troubles,              *)
56 (*    so I change it back to the original one here.                         *)
57 (* ------------------------------------------------------------------------ *)
58
59 let SET_TAC =
60   let PRESET_TAC =
61     POP_ASSUM_LIST(K ALL_TAC) THEN REPEAT COND_CASES_TAC THEN
62     REWRITE_TAC[EXTENSION; SUBSET; PSUBSET; DISJOINT; SING] THEN
63     REWRITE_TAC[NOT_IN_EMPTY; IN_UNIV; IN_UNION; IN_INTER; IN_DIFF; IN_INSERT;
64                 IN_DELETE; IN_REST; IN_INTERS; IN_UNIONS; IN_IMAGE;
65                 IN_ELIM_THM; IN] in
66   fun ths ->
67     (if ths = [] then ALL_TAC else MP_TAC(end_itlist CONJ ths)) THEN
68     PRESET_TAC THEN
69     MESON_TAC[];;
70
71 let SET_RULE tm = prove(tm,SET_TAC[]);;
72
73 (* ------------------------------------------------------------------------ *)
74
75 let AFF_GE_1_3 = prove(`!x u v w.
76          DISJOINT {x} {u, v, w}
77          ==> aff_ge {x} {u, v, w} =
78              {y | ?t1 t2 t3 t4.
79                       &0 <= t2 /\
80                       &0 <= t3 /\
81                       &0 <= t4 /\
82                       t1 + t2 + t3 + t4 = &1 /\
83                       y = t1 % x + t2 % u + t3 % v + t4 % w}`,
84 AFF_TAC);;
85
86 (* ------------------------------------------------------------------------ *)
87
88 let KY_COPLANAR_3 = prove (
89  `!a b c:real^3. coplanar {a,b,c}`, 
90   REPEAT GEN_TAC THEN REWRITE_TAC[coplanar] THEN EXISTS_TAC `a:real^3` THEN 
91   EXISTS_TAC `b:real^3` THEN EXISTS_TAC `c:real^3` THEN 
92   REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);;
93
94 (* ------------------------------------------------------------------------ *)
95
96 let NEGLIGIBLE_MEASURE_UNION_klema = prove_by_refinement (
97  `!s t. measurable s /\ measurable t /\ negligible t ==>
98 vol (s UNION t) = vol s`,
99 [(REPEAT STRIP_TAC);
100  (REWRITE_WITH `vol (s UNION t) = vol s + vol t - vol (s INTER t)`);
101  (ASM_SIMP_TAC[MEASURE_UNION]);
102  (REWRITE_WITH `vol t = &0`);
103  (ASM_SIMP_TAC[MEASURE_EQ_0]);
104  (REWRITE_WITH `vol (s INTER t) = &0`);
105  (MATCH_MP_TAC MEASURE_EQ_0);
106  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
107  (EXISTS_TAC `t:real^3->bool` THEN ASM_REWRITE_TAC[] THEN SET_TAC[]);
108  (REAL_ARITH_TAC)]);;
109
110 (* ------------------------------------------------------------------------ *)
111 let SOL_SOLID_TRIANGLE = prove_by_refinement (
112  `!v0 v1 v2 v3 a123 a231 a312. 
113         ~coplanar {v0, v1, v2, v3} /\ 
114         a = dihV v0 v1 v2 v3 /\
115         b = dihV v0 v2 v3 v1 /\
116         c = dihV v0 v3 v1 v2 
117         ==> sol v0 (convex hull {v0,v1,v2,v3}) = a + b + c - pi`,
118 [(REPEAT STRIP_TAC);
119
120  (NEW_GOAL `CARD {v0, v1, v2, v3:real^3} = 4`);
121  (MATCH_MP_TAC Collect_geom2.NOT_COPLANAR_IMP_CARD4);
122  (ASM_REWRITE_TAC[coplanar_alt; GSYM Trigonometry2.coplanar1]);
123
124  (NEW_GOAL `~(v0 = v1:real^3) /\ ~(v0 = v2) /\ ~(v0 = v3) /\ 
125              ~(v1 = v2) /\ ~(v1 = v3) /\ ~(v2 = v3)`);
126  (REPEAT STRIP_TAC);
127  (NEW_GOAL `CARD {v0, v1, v2, v3:real^3} <= 3`);
128  (REWRITE_TAC[ASSUME `v0 = v1:real^3`; 
129    SET_RULE `{v1, v1, v2, v3} = {v1,v2,v3}`;Geomdetail.CARD3 ]);
130  (ASM_ARITH_TAC);
131  (NEW_GOAL `CARD {v0, v1, v2, v3:real^3} <= 3`);
132  (REWRITE_TAC[ASSUME `v0 = v2:real^3`; 
133    SET_RULE `{v2, v1, v2, v3} = {v1,v2,v3}`;Geomdetail.CARD3 ]);
134  (ASM_ARITH_TAC);
135  (NEW_GOAL `CARD {v0, v1, v2, v3:real^3} <= 3`);
136  (REWRITE_TAC[ASSUME `v0 = v3:real^3`; 
137    SET_RULE `{v3, v1, v2, v3} = {v1,v2,v3}`;Geomdetail.CARD3 ]);
138  (ASM_ARITH_TAC);
139  (NEW_GOAL `CARD {v0, v1, v2, v3:real^3} <= 3`);
140  (REWRITE_TAC[ASSUME `v1 = v2:real^3`; 
141    SET_RULE `{v0, v2, v2, v3} = {v0,v2,v3}`;Geomdetail.CARD3 ]);
142  (ASM_ARITH_TAC);
143  (NEW_GOAL `CARD {v0, v1, v2, v3:real^3} <= 3`);
144  (REWRITE_TAC[ASSUME `v1 = v3:real^3`; 
145    SET_RULE `{v0, v3, v2, v3} = {v0,v2,v3}`;Geomdetail.CARD3 ]);
146  (ASM_ARITH_TAC);
147  (NEW_GOAL `CARD {v0, v1, v2, v3:real^3} <= 3`);
148  (REWRITE_TAC[ASSUME `v2 = v3:real^3`; 
149    SET_RULE `{v0, v1, v3, v3} = {v0,v1,v3}`;Geomdetail.CARD3 ]);
150  (ASM_ARITH_TAC);
151
152  (REWRITE_TAC[sol]);
153  (ABBREV_TAC `s = closest_point (convex hull {v1,v2,v3:real^3}) v0`);
154  (NEW_GOAL `s IN convex hull {v1,v2,v3:real^3} /\
155            (!y. y IN convex hull {v1,v2,v3}  ==> dist (v0,s) <= dist (v0,y))`);
156  (EXPAND_TAC "s");
157  (MATCH_MP_TAC CLOSEST_POINT_EXISTS);
158  (STRIP_TAC);
159  (MATCH_MP_TAC Marchal_cells_2_new.CLOSED_CONVEX_HULL_FINITE);
160  (REWRITE_TAC[Geomdetail.FINITE6]);
161  (REWRITE_TAC[CONVEX_HULL_EQ_EMPTY] THEN SET_TAC[]);
162  (UP_ASM_TAC THEN STRIP_TAC);
163  (ABBREV_TAC `r = dist (v0, s:real^3)`);
164  (ABBREV_TAC `C = convex hull {v0,v1,v2,v3:real^3}`);
165  (NEW_GOAL `r > &0 /\
166              measurable (C INTER normball (v0:real^3) r) /\
167              radial_norm r v0 (C INTER normball v0 r)`);
168  (NEW_GOAL `r > &0`);
169  (EXPAND_TAC "r");
170  (REWRITE_TAC[NORM_ARITH `dist (x,y) > &0 <=> ~(x = y)`]);
171  (STRIP_TAC);
172
173  (UNDISCH_TAC `~coplanar {v0,v1,v2,v3:real^3}`);
174  (REWRITE_TAC[coplanar]);
175  (EXISTS_TAC `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN 
176    EXISTS_TAC `v3:real^3`);
177  (REWRITE_TAC[SUBSET; SET_RULE `a IN {x,y,z,t} <=> a=x\/a=y\/a=z\/a=t`]);
178  (REPEAT STRIP_TAC);
179  (ASM_REWRITE_TAC[]);
180  (MATCH_MP_TAC (SET_RULE `(?s. a IN s /\ s SUBSET t) ==> a IN t`));
181  (EXISTS_TAC `convex hull {v1,v2,v3:real^3}`);
182  (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
183  (ASM_REWRITE_TAC[]);
184  (MATCH_MP_TAC (SET_RULE `(?s. a IN s /\ s SUBSET t) ==> a IN t`));
185  (EXISTS_TAC `{v1,v2,v3:real^3}`);
186  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
187  (SET_TAC[]);
188  (ASM_REWRITE_TAC[]);
189  (MATCH_MP_TAC (SET_RULE `(?s. a IN s /\ s SUBSET t) ==> a IN t`));
190  (EXISTS_TAC `{v1,v2,v3:real^3}`);
191  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
192  (SET_TAC[]);
193  (ASM_REWRITE_TAC[]);
194  (MATCH_MP_TAC (SET_RULE `(?s. a IN s /\ s SUBSET t) ==> a IN t`));
195  (EXISTS_TAC `{v1,v2,v3:real^3}`);
196  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
197  (SET_TAC[]);
198
199  (ASM_REWRITE_TAC[]);
200  (NEW_GOAL `measurable (C INTER normball (v0:real^3) r)`);
201  (MATCH_MP_TAC MEASURABLE_INTER);
202  (REWRITE_TAC[NORMBALL_BALL; MEASURABLE_BALL]);
203  (EXPAND_TAC "C");
204  (MATCH_MP_TAC MEASURABLE_CONVEX_HULL);
205  (MATCH_MP_TAC FINITE_IMP_BOUNDED);
206  (REWRITE_TAC[Geomdetail.FINITE6]);
207  (ASM_REWRITE_TAC[]);
208
209  (REWRITE_TAC[GSYM Marchal_cells_2_new.RADIAL_VS_RADIAL_NORM; radial]);
210  (REWRITE_TAC[NORMBALL_BALL; SET_RULE `a INTER s SUBSET s`]);
211  (REWRITE_TAC[IN_INTER]);
212  (EXPAND_TAC "C");
213  (REWRITE_TAC[Marchal_cells_2_new.CONVEX_HULL_4; IN; IN_ELIM_THM]);
214  (REPEAT STRIP_TAC);
215
216  (EXISTS_TAC `&1 - t * (v + w + z)`);
217  (EXISTS_TAC `t*v` THEN EXISTS_TAC `t*w` THEN EXISTS_TAC `t*z`);
218  (NEW_GOAL `&0 <= t`);
219  (ASM_REAL_ARITH_TAC);
220  (ASM_SIMP_TAC[REAL_LE_MUL]);
221  (REWRITE_TAC[REAL_ARITH `&1 - t * (v + w + z) + t * v + t * w + t * z = &1`]);
222  (STRIP_TAC);
223  (REWRITE_TAC[REAL_ARITH `&0 <= a - b <=> ~(a < b)`]);
224  (STRIP_TAC);
225  (ABBREV_TAC `t' = &1 / (v + w + z)`);
226  (NEW_GOAL `v0 + t' % u IN convex hull {v1,v2,v3:real^3}`);
227  (REWRITE_TAC[IN; CONVEX_HULL_3; IN_ELIM_THM]);
228  (EXISTS_TAC `v/(v+w+z)` THEN EXISTS_TAC `w/(v+w+z)` THEN EXISTS_TAC `z/(v+w+z)`);
229  (REPEAT STRIP_TAC);
230  (MATCH_MP_TAC REAL_LE_DIV);
231  (ASM_SIMP_TAC[REAL_LE_ADD]);
232  (MATCH_MP_TAC REAL_LE_DIV);
233  (ASM_SIMP_TAC[REAL_LE_ADD]);
234  (MATCH_MP_TAC REAL_LE_DIV);
235  (ASM_SIMP_TAC[REAL_LE_ADD]);
236  (REWRITE_TAC[REAL_ARITH `a/x+b/x+c/x = (a+b+c)/x`]);
237  (MATCH_MP_TAC REAL_DIV_REFL);
238  (STRIP_TAC);
239  (UNDISCH_TAC `&1 < t * (v + w + z)` THEN ASM_REWRITE_TAC[]);
240  (REAL_ARITH_TAC);
241  (REWRITE_TAC[VECTOR_ARITH `v / (v + w + z) % v1 + w / (v + w + z) % v2 + 
242                 z / (v + w + z) % v3 = (&1/(v+w+z)) % (v%v1+w%v2+z%v3)`]);
243  (REWRITE_WITH `v%v1+w%v2+z%v3 = (v0:real^3) + u - u' % v0`);
244  (UNDISCH_TAC `v0 + u = u' % v0 + v % v1 + w % v2 + z % (v3:real^3)`);
245  (VECTOR_ARITH_TAC);
246  (MATCH_MP_TAC Trigonometry2.VECTOR_MUL_R_TO_L);
247  (STRIP_TAC);
248  (STRIP_TAC);
249  (UNDISCH_TAC `&1 < t * (v + w + z)` THEN ASM_REWRITE_TAC[]);
250  (REAL_ARITH_TAC);
251  (REWRITE_TAC[VECTOR_ARITH `(v + w + z) % (v0 + t' % u) = v0 + u - u' % v0 <=>
252    (u' + v + w + z) % v0 + ((v + w + z) * t') % u = v0 + u`]);
253  (EXPAND_TAC "t'" THEN REWRITE_TAC[ASSUME `u' + v + w + z = &1`; ARITH_RULE 
254   `x * &1 / x = x / x`; VECTOR_ARITH `&1 % x + y = x + z <=> y = z`]);
255  (REWRITE_WITH `(v + w + z) / (v + w + z) = &1`);
256  (MATCH_MP_TAC REAL_DIV_REFL);
257  (STRIP_TAC);
258  (UNDISCH_TAC `&1 < t * (v + w + z)` THEN ASM_REWRITE_TAC[]);
259  (REAL_ARITH_TAC);
260  (VECTOR_ARITH_TAC);
261
262  (NEW_GOAL `r <= dist(v0:real^3, v0 + t' % u)`);
263  (ASM_SIMP_TAC[]);
264  (NEW_GOAL `t' < t:real`);
265  (REWRITE_TAC[REAL_ARITH `a < b <=> ~(b <= a)`] THEN STRIP_TAC);
266  (NEW_GOAL `t' * (v+ w + z) = &1`);
267  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
268  (REWRITE_WITH `&1 = t' * (v + w + z) <=> &1/(v+w+z) = t'`);
269  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
270  (MATCH_MP_TAC REAL_EQ_LDIV_EQ);
271  (NEW_GOAL `&0 <= v + w + z`);
272  (ASM_SIMP_TAC[REAL_LE_ADD]);
273  (NEW_GOAL `~(v + w + z = &0)`);
274  (STRIP_TAC);
275  (UNDISCH_TAC `&1 < t * (v + w + z)` THEN ASM_REWRITE_TAC[]);
276  (REAL_ARITH_TAC);
277  (ASM_REAL_ARITH_TAC);
278  (ASM_REWRITE_TAC[]);
279  (NEW_GOAL `t * (v + w + z) <= t' * (v + w + z)`);
280  (REWRITE_TAC[REAL_ARITH `a * x <= b * x <=> &0 <= (b - a) * x`]);
281  (MATCH_MP_TAC REAL_LE_MUL);
282  (ASM_SIMP_TAC[REAL_LE_ADD]);
283  (ASM_REAL_ARITH_TAC);
284  (ASM_REAL_ARITH_TAC);
285
286  (NEW_GOAL `v0 + t' % u IN ball (v0:real^3, r)`);
287  (REWRITE_TAC[IN_BALL; dist; VECTOR_ARITH `v0 - (v0 + t' % u) = --t' % u`]);
288  (REWRITE_TAC[NORM_MUL; REAL_ARITH `abs (-- t) = abs (t)`]);
289  (REWRITE_WITH `abs (t') = t'`);
290  (REWRITE_TAC[REAL_ABS_REFL]);
291  (EXPAND_TAC "t'" THEN MATCH_MP_TAC REAL_LE_DIV THEN ASM_SIMP_TAC[REAL_LE_ADD]);
292  (REAL_ARITH_TAC);
293  (NEW_GOAL `t' * norm u <= t * norm (u:real^3)`);
294  (REWRITE_TAC[REAL_ARITH `a * x <= b * x <=> &0 <= (b - a) * x`]);
295  (MATCH_MP_TAC REAL_LE_MUL);
296  (ASM_SIMP_TAC[NORM_POS_LE]);
297  (ASM_REAL_ARITH_TAC);
298  (ASM_REAL_ARITH_TAC);
299  (UP_ASM_TAC THEN REWRITE_TAC[IN_BALL]);
300  (ASM_REAL_ARITH_TAC);
301  (REWRITE_TAC[VECTOR_ARITH `v0 + t % u =
302   (&1 - t * (v + w + z)) % v0 + (t * v) % v1 + (t * w) % v2 + (t * z) % v3 <=> 
303   t % u = t % (v % v1 + w % v2 + z % v3 - (v+w+z) % v0)`]);
304  (AP_TERM_TAC);
305  (REWRITE_TAC[VECTOR_ARITH `u = v % v1 + w % v2 + z % v3 - (v + w + z) % v0      
306   <=> (u'+v+w+z) % v0 + u = u' % v0 + v % v1 + w % v2 + z % v3 `]);
307  (ASM_REWRITE_TAC[VECTOR_ARITH `&1 % a = a`]);
308  (REWRITE_TAC[MESON[IN] `(V:real^3->bool) x <=> x IN V`]);
309
310  (REWRITE_TAC[IN_BALL; dist; VECTOR_ARITH `v0 - (v0 + t' % u) = --t' % u`]);
311  (REWRITE_TAC[NORM_MUL; REAL_ARITH `abs (-- t) = abs (t)`]);
312  (REWRITE_WITH `abs (t) = t`);
313  (REWRITE_TAC[REAL_ABS_REFL]);
314  (ASM_REAL_ARITH_TAC);
315  (ASM_REWRITE_TAC[]);
316
317  (ASM_SIMP_TAC[sol]);
318
319  (NEW_GOAL `C INTER normball v0 r = 
320              aff_ge {v0:real^3} {v1,v2,v3} INTER normball v0 r`);
321  (MATCH_MP_TAC (SET_RULE `A SUBSET B /\ B SUBSET A ==> A = B`));
322  (STRIP_TAC);
323  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> A INTER C SUBSET B INTER C`));
324  (EXPAND_TAC "C");
325
326  (NEW_GOAL `DISJOINT {v0} {v1,v2,v3:real^3}`);
327  (REWRITE_TAC[DISJOINT; SET_RULE 
328   `{v0} INTER {v1, v2, v3} = {} <=> ~(v0 = v1 \/ v0 = v2 \/ v0 = v3)`]);
329  (REPEAT STRIP_TAC);
330  (UNDISCH_TAC `~coplanar {v0,v1,v2,v3:real^3}`);
331  (ASM_REWRITE_TAC[SET_RULE `{a,a,c,d} = {a,c,d}`; KY_COPLANAR_3]);
332  (UNDISCH_TAC `~coplanar {v0,v1,v2,v3:real^3}`);
333  (ASM_REWRITE_TAC[SET_RULE `{c,a,c,d} = {a,c,d}`; KY_COPLANAR_3]);
334  (UNDISCH_TAC `~coplanar {v0,v1,v2,v3:real^3}`);
335  (ASM_REWRITE_TAC[SET_RULE `{d,a,c,d} = {a,c,d}`; KY_COPLANAR_3]);
336  (ASM_SIMP_TAC[AFF_GE_1_3]);
337  (EXPAND_TAC "C" THEN REWRITE_TAC[SUBSET; CONVEX_HULL_4; IN; IN_ELIM_THM]);
338  (REPEAT STRIP_TAC);
339  (EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real` THEN 
340    EXISTS_TAC `w:real` THEN EXISTS_TAC `z:real` THEN ASM_REWRITE_TAC[]);
341
342  (REWRITE_TAC[SUBSET; IN_INTER]);
343  (NEW_GOAL `DISJOINT {v0} {v1,v2,v3:real^3}`);
344  (REWRITE_TAC[DISJOINT; SET_RULE 
345   `{v0} INTER {v1, v2, v3} = {} <=> ~(v0 = v1 \/ v0 = v2 \/ v0 = v3)`]);
346  (REPEAT STRIP_TAC);
347  (UNDISCH_TAC `~coplanar {v0,v1,v2,v3:real^3}`);
348  (ASM_REWRITE_TAC[SET_RULE `{a,a,c,d} = {a,c,d}`; KY_COPLANAR_3]);
349  (UNDISCH_TAC `~coplanar {v0,v1,v2,v3:real^3}`);
350  (ASM_REWRITE_TAC[SET_RULE `{c,a,c,d} = {a,c,d}`; KY_COPLANAR_3]);
351  (UNDISCH_TAC `~coplanar {v0,v1,v2,v3:real^3}`);
352  (ASM_REWRITE_TAC[SET_RULE `{d,a,c,d} = {a,c,d}`; KY_COPLANAR_3]);
353  (ASM_SIMP_TAC[AFF_GE_1_3]);
354  (EXPAND_TAC "C" THEN REWRITE_TAC[SUBSET; CONVEX_HULL_4; IN; IN_ELIM_THM]);
355  (REPEAT STRIP_TAC);
356  (EXISTS_TAC `t1:real` THEN EXISTS_TAC `t2:real` THEN 
357    EXISTS_TAC `t3:real` THEN EXISTS_TAC `t4:real` THEN ASM_REWRITE_TAC[]);
358
359  (REWRITE_TAC[ARITH_RULE `&0 <= s <=> ~(s < &0)`] THEN STRIP_TAC);
360  (NEW_GOAL `&1 < t2 + t3 + t4`);
361  (ASM_REAL_ARITH_TAC);
362
363  (ABBREV_TAC `u = &1 / (t2 + t3 + t4)`);
364  (NEW_GOAL `v0 + u % (x - v0) IN convex hull {v1,v2,v3:real^3}`);
365  (REWRITE_TAC[IN; CONVEX_HULL_3; IN_ELIM_THM]);
366  (EXISTS_TAC `t2/(t2+t3+t4)` THEN EXISTS_TAC `t3/(t2+t3+t4)` THEN EXISTS_TAC `t4/(t2+t3+t4)`);
367  (REPEAT STRIP_TAC);
368  (MATCH_MP_TAC REAL_LE_DIV);
369  (ASM_SIMP_TAC[REAL_LE_ADD]);
370  (MATCH_MP_TAC REAL_LE_DIV);
371  (ASM_SIMP_TAC[REAL_LE_ADD]);
372  (MATCH_MP_TAC REAL_LE_DIV);
373  (ASM_SIMP_TAC[REAL_LE_ADD]);
374  (REWRITE_TAC[REAL_ARITH `a/x+b/x+c/x = (a+b+c)/x`]);
375  (MATCH_MP_TAC REAL_DIV_REFL);
376  (ASM_REAL_ARITH_TAC);
377  (REWRITE_TAC[VECTOR_ARITH `v / (v + w + z) % v1 + w / (v + w + z) % v2 + 
378                 z / (v + w + z) % v3 = (&1/(v+w+z)) % (v%v1+w%v2+z%v3)`]);
379  (REWRITE_WITH `t2 % v1 + t3 % v2 + t4 % v3 = 
380                  (x - v0:real^3) + (&1 - t1) % v0`);
381  (UNDISCH_TAC `x = t1 % v0 + t2 % v1 + t3 % v2 + t4 % (v3:real^3)`);
382  (VECTOR_ARITH_TAC);
383  (MATCH_MP_TAC Trigonometry2.VECTOR_MUL_R_TO_L);
384  (STRIP_TAC);
385  (ASM_REAL_ARITH_TAC);
386  (REWRITE_TAC[VECTOR_ARITH 
387   `(t2 + t3 + t4) % (v0 + u % (x - v0)) = x - v0 + (&1 - t1) % v0 <=>
388   (t1 + t2 + t3 + t4) % v0 + ((t2 + t3 + t4) * u) % (x - v0) = v0 + (x - v0)`]);
389  (EXPAND_TAC "u" THEN REWRITE_TAC[ASSUME `t1 + t2 + t3 + t4 = &1`; 
390    ARITH_RULE `x * &1 / x = x / x`; 
391    VECTOR_ARITH `&1 % x + y = x + z <=> y = z`]);
392  (REWRITE_WITH `(t2 + t3 + t4) / (t2 + t3 + t4) = &1`);
393  (MATCH_MP_TAC REAL_DIV_REFL);
394  (ASM_REAL_ARITH_TAC);
395  (VECTOR_ARITH_TAC);
396
397  (NEW_GOAL `r <= dist(v0:real^3, v0 + u % (x - v0))`);
398  (ASM_SIMP_TAC[]);
399  (UP_ASM_TAC THEN REWRITE_TAC[dist; 
400    VECTOR_ARITH `v0 - (v0 + u % (x - v0)) = --u % (x - v0)`; 
401    NORM_MUL; REAL_ARITH `abs (-- t) = abs (t)`]);
402  (REWRITE_WITH `abs (u) = u`);
403  (REWRITE_TAC[REAL_ABS_REFL]);
404  (EXPAND_TAC "u");
405  (MATCH_MP_TAC REAL_LE_DIV);
406  (ASM_REAL_ARITH_TAC);
407  (REWRITE_TAC[GSYM dist]);
408  (REWRITE_TAC[REAL_ARITH `a < b <=> ~(b <= a)`] THEN STRIP_TAC);
409
410  (NEW_GOAL `u * dist (x,v0:real^3) <= dist (x,v0:real^3)`);
411  (REWRITE_TAC[REAL_ARITH `a * b <= b <=> &0 <= (&1 - a) * b`]);
412  (MATCH_MP_TAC REAL_LE_MUL);
413  (REWRITE_TAC[DIST_POS_LE; REAL_ARITH `&0 <= a - b <=> b <= a`]);
414  (EXPAND_TAC "u");
415  (REWRITE_WITH `&1 / (t2 + t3 + t4) <= &1 <=> &1 <= (t2 + t3 + t4)`);
416  (MATCH_MP_TAC Packing3.REAL_DIV_LE_1);
417  (ASM_REAL_ARITH_TAC);
418  (ASM_REAL_ARITH_TAC);
419  (NEW_GOAL `r <= dist (v0, x:real^3)`);
420  (ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REAL_ARITH_TAC);
421  (UNDISCH_TAC `normball (v0:real^3) r x` THEN REWRITE_TAC[NORMBALL_BALL]);
422  (REWRITE_TAC[MESON[IN] `(V:real^3->bool) x <=> x IN V`; IN_BALL]);
423  (ASM_REAL_ARITH_TAC);
424  (ASM_REWRITE_TAC[]);
425
426  (REWRITE_WITH `vol (aff_ge {v0} {v1, v2, v3} INTER normball v0 r) = 
427                  vol (ball (v0,r) INTER aff_gt {v0} {v1, v2, v3})`);
428  (REWRITE_TAC[SET_RULE `a INTER normball v0 r = normball v0 r INTER a`]);
429  (REWRITE_TAC[NORMBALL_BALL]);
430
431  (REWRITE_WITH 
432   `aff_ge {v0} {v1, v2, v3:real^3} = 
433    aff_gt {v0} {v1, v2, v3} UNION 
434    UNIONS {aff_ge {v0} ({v1, v2, v3} DELETE a) | a | a IN {v1, v2, v3}}`);
435  (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);
436  (REWRITE_TAC[Geomdetail.FINITE6]);
437
438  (REWRITE_TAC[DISJOINT; SET_RULE 
439   `{v0} INTER {v1, v2, v3} = {} <=> ~(v0 = v1 \/ v0 = v2 \/ v0 = v3)`]);
440  (REPEAT STRIP_TAC);
441  (UNDISCH_TAC `~coplanar {v0,v1,v2,v3:real^3}`);
442  (ASM_REWRITE_TAC[SET_RULE `{a,a,c,d} = {a,c,d}`; KY_COPLANAR_3]);
443  (UNDISCH_TAC `~coplanar {v0,v1,v2,v3:real^3}`);
444  (ASM_REWRITE_TAC[SET_RULE `{c,a,c,d} = {a,c,d}`; KY_COPLANAR_3]);
445  (UNDISCH_TAC `~coplanar {v0,v1,v2,v3:real^3}`);
446  (ASM_REWRITE_TAC[SET_RULE `{d,a,c,d} = {a,c,d}`; KY_COPLANAR_3]);
447
448  (REWRITE_TAC[SET_RULE `A INTER (B UNION C) = (A INTER B) UNION (A INTER C)`]);
449  (MATCH_MP_TAC NEGLIGIBLE_MEASURE_UNION_klema);
450  (REWRITE_TAC[MEASURABLE_BALL_AFF_GT]);
451  (STRIP_TAC);
452  (REWRITE_WITH `ball (v0:real^3,r) INTER
453   UNIONS {aff_ge {v0} ({v1, v2, v3} DELETE a) | a | a IN {v1, v2, v3}} = 
454   UNIONS {ball (v0,r) INTER aff_ge {v0} ({v1, v2, v3} DELETE a) | a | a IN {v1, v2, v3}}`);
455  (REWRITE_TAC[SET_EQ_LEMMA; IN_INTER; IN_UNIONS] THEN REPEAT STRIP_TAC);
456  (EXISTS_TAC `ball (v0:real^3, r) INTER t`);
457  (STRIP_TAC);
458  (DEL_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
459  (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
460  (NEW_GOAL `(t:real^3->bool) SUBSET ball(v0:real^3, r)`);
461  (DEL_TAC THEN UP_ASM_TAC THEN REWRITE_TAC[IN; IN_ELIM_THM] THEN STRIP_TAC);
462  (UP_ASM_TAC THEN SET_TAC[]);
463  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);   
464  (SWITCH_TAC THEN UP_ASM_TAC THEN ONCE_REWRITE_TAC[IN] THEN
465    REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC);
466
467  (EXISTS_TAC `aff_ge {v0:real^3} ({v1, v2, v3} DELETE a')`);
468  (ONCE_REWRITE_TAC[MESON[IN] `(V:real^3->bool) x <=> x IN V`]);
469  (STRIP_TAC);
470  (EXISTS_TAC `a':real^3`);
471  (ASM_REWRITE_TAC[]);
472  (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
473
474  (MATCH_MP_TAC MEASURABLE_UNIONS);
475  (REPEAT STRIP_TAC);
476
477  (ABBREV_TAC 
478   `fun = (\a:real^3. ball (v0,r) INTER aff_ge {v0} ({v1, v2, v3} DELETE a))`);
479  (REWRITE_WITH 
480   `{ball (v0,r) INTER aff_ge {v0} ({v1, v2, v3} DELETE a) | a | a IN
481                                                                 {v1, v2, v3}} =
482    {fun a | a | a IN {v1,v2,v3:real^3}}`);
483  (EXPAND_TAC "fun" THEN REWRITE_TAC[]);
484  (REWRITE_WITH `{(fun:real^3->real^3->bool) a | a IN {v1, v2, v3:real^3}} = 
485                  {y | ?a. a IN {v1,v2,v3} /\ y = fun a}`);
486  (ONCE_REWRITE_TAC[SET_EQ_LEMMA]);
487  (ONCE_REWRITE_TAC[IN]);
488  (REWRITE_TAC[IN_ELIM_THM]);
489  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
490  (REWRITE_TAC[Geomdetail.FINITE6]);
491
492  (UP_ASM_TAC THEN REWRITE_TAC[IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
493  (ASM_REWRITE_TAC[MEASURABLE_BALL_AFF_GE]);
494  (MATCH_MP_TAC NEGLIGIBLE_INTER);
495  (DISJ2_TAC);
496  (MATCH_MP_TAC NEGLIGIBLE_UNIONS);
497  (STRIP_TAC);
498
499  (ABBREV_TAC 
500   `fun = (\a:real^3. aff_ge {v0} ({v1, v2, v3} DELETE a))`);
501  (REWRITE_WITH 
502   `{aff_ge {v0} ({v1, v2, v3} DELETE a) | a | a IN {v1, v2, v3}} =
503    {fun a | a | a IN {v1,v2,v3:real^3}}`);
504  (EXPAND_TAC "fun" THEN REWRITE_TAC[]);
505  (REWRITE_WITH `{(fun:real^3->real^3->bool) a | a IN {v1, v2, v3:real^3}} = 
506                  {y | ?a. a IN {v1,v2,v3} /\ y = fun a}`);
507  (ONCE_REWRITE_TAC[SET_EQ_LEMMA]);
508  (ONCE_REWRITE_TAC[IN]);
509  (REWRITE_TAC[IN_ELIM_THM]);
510  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
511  (REWRITE_TAC[Geomdetail.FINITE6]);
512
513  (ONCE_REWRITE_TAC[IN] THEN REWRITE_TAC[SET_RULE `a IN {x,y,z} <=> 
514    a = x \/ a = y \/ a = z`; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
515  (ASM_REWRITE_TAC[]);
516  (REWRITE_WITH `{v1, v2, v3} DELETE v1 = {v2,v3:real^3}`);
517  (UNDISCH_TAC `~(v0 = v1:real^3) /\ ~(v0 = v2) /\ ~(v0 = v3) /\
518                 ~(v1 = v2) /\ ~(v1 = v3) /\ ~(v2 = v3)`);
519  (SET_TAC[]);
520  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
521  (EXISTS_TAC `affine hull {v0,v2,v3:real^3}`);
522  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
523  (REWRITE_TAC[SET_RULE `{a,b,c} = {a} UNION {b,c}`]);
524  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
525
526  (ASM_REWRITE_TAC[]);
527  (REWRITE_WITH `{v1, v2, v3} DELETE v2 = {v1,v3:real^3}`);
528  (UNDISCH_TAC `~(v0 = v1:real^3) /\ ~(v0 = v2) /\ ~(v0 = v3) /\
529                 ~(v1 = v2) /\ ~(v1 = v3) /\ ~(v2 = v3)`);
530  (SET_TAC[]);
531  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
532  (EXISTS_TAC `affine hull {v0,v1,v3:real^3}`);
533  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
534  (REWRITE_TAC[SET_RULE `{a,b,c} = {a} UNION {b,c}`]);
535  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
536
537  (ASM_REWRITE_TAC[]);
538  (REWRITE_WITH `{v1, v2, v3} DELETE v3 = {v1,v2:real^3}`);
539  (UNDISCH_TAC `~(v0 = v1:real^3) /\ ~(v0 = v2) /\ ~(v0 = v3) /\
540                 ~(v1 = v2) /\ ~(v1 = v3) /\ ~(v2 = v3)`);
541  (SET_TAC[]);
542  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
543  (EXISTS_TAC `affine hull {v0,v1,v2:real^3}`);
544  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
545  (REWRITE_TAC[SET_RULE `{a,b,c} = {a} UNION {b,c}`]);
546  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
547
548  (REWRITE_WITH `vol (ball (v0,r) INTER aff_gt {v0} {v1, v2, v3}) =
549              (let a123 = dihV v0 v1 v2 v3 in
550               let a231 = dihV v0 v2 v3 v1 in
551               let a312 = dihV v0 v3 v1 v2 in
552               (a123 + a231 + a312 - pi) * r pow 3 / &3)`);
553  (MATCH_MP_TAC VOLUME_SOLID_TRIANGLE);
554  (ASM_REWRITE_TAC[]);
555  (ASM_REAL_ARITH_TAC);
556  (REPEAT LET_TAC);
557  (REWRITE_TAC[REAL_ARITH 
558   `&3 * (x * r pow 3 / &3) / r pow 3 = x * (r pow 3 / r pow 3)`]);
559  (REWRITE_WITH `r pow 3 / r pow 3 = &1`);
560  (MATCH_MP_TAC REAL_DIV_REFL);
561  (REWRITE_TAC[REAL_POW_EQ_0; ARITH_RULE `~(3 = 0)`]);
562  (ASM_REAL_ARITH_TAC);
563  (REAL_ARITH_TAC)]);;
564
565 (* ---------------------------------------------------------------------- *)
566
567 let DIHX_DIH_Y_lemma = prove_by_refinement (
568  `!V X ul u0 u1 u2 u3 i y1 y2 y3 y4 y5 y6.
569      saturated V /\
570      packing V /\
571      barV V 3 ul /\
572      i >= 4 /\
573      X = mcell i V ul /\
574      ~NULLSET X /\
575      ul = [u0; u1; u2; u3] /\
576      dist (u0,u1) = y1 /\
577      dist (u0,u2) = y2 /\
578      dist (u0,u3) = y3 /\
579      dist (u2,u3) = y4 /\
580      dist (u1,u3) = y5 /\
581      dist (u1,u2) = y6
582      ==> 
583       dihX V X (u0,u1) = dih_y y1 y2 y3 y4 y5 y6 /\
584       dihX V X (u0,u2) = dih_y y2 y3 y1 y5 y6 y4 /\
585       dihX V X (u0,u3) = dih_y y3 y1 y2 y6 y4 y5 /\
586       dihX V X (u2,u3) = dih_y y4 y3 y5 y1 y6 y2 /\
587       dihX V X (u1,u3) = dih_y y5 y1 y6 y2 y4 y3 /\
588       dihX V X (u1,u2) = dih_y y6 y1 y5 y3 y4 y2`,
589 [(REPEAT GEN_TAC THEN STRIP_TAC);
590  (NEW_GOAL `~(X:real^3->bool = {})`);
591  (STRIP_TAC THEN UNDISCH_TAC `~NULLSET X` THEN 
592    REWRITE_TAC[ASSUME `X:real^3->bool = {}`; NEGLIGIBLE_EMPTY]);
593
594  (NEW_GOAL `X = mcell4 V ul`);
595  (ASM_REWRITE_TAC[]);
596  (ASM_SIMP_TAC[MCELL_EXPLICIT]);
597  (UP_ASM_TAC THEN REWRITE_TAC[mcell4]);
598  (COND_CASES_TAC);
599  (REWRITE_TAC[ASSUME `ul = [u0; u1; u2; u3:real^3]`; set_of_list]);
600  (STRIP_TAC);
601
602  (NEW_GOAL `VX V X = {u0,u1,u2,u3}`);
603  (REWRITE_WITH `VX V X = V INTER X`);
604  (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
605  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
606  (ASM_REWRITE_TAC[]);
607
608  (REWRITE_WITH `X = mcell 4 V ul`);
609  (ASM_REWRITE_TAC[]);
610  (MESON_TAC[ARITH_RULE `4 >= 4`; ASSUME `i >= 4`; MCELL_EXPLICIT]);
611
612  (REWRITE_WITH 
613   `V INTER mcell 4 V ul = set_of_list (truncate_simplex (4 - 1) ul)`);
614  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
615  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 4 /\ 4 <= 4`]);
616  (REWRITE_WITH ` mcell 4 V [u0; u1; u2; u3] = X`);
617  (ASM_REWRITE_TAC[]);
618  (MESON_TAC[ARITH_RULE `4 >= 4`; ASSUME `i >= 4`; MCELL_EXPLICIT]);
619  (ASM_REWRITE_TAC[]);
620  (ASM_REWRITE_TAC[ARITH_RULE `4 - 1 = 3`; TRUNCATE_SIMPLEX_EXPLICIT_3;
621                    set_of_list]);
622
623 (* ---------------------------------------------------------------- *)
624  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} = 4`);
625  (REWRITE_TAC[ARITH_RULE `4 = 3 + 1`; GSYM set_of_list;
626    GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`)]);
627  (MATCH_MP_TAC Marchal_cells_3.BARV_CARD_LEMMA);
628  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
629  (NEW_GOAL `~(u0 = u1:real^3) /\ ~(u0 = u2) /\ ~(u0 = u3) /\ 
630              ~(u1 = u2) /\ ~(u1 = u3) /\ ~(u2 = u3)`);
631  (REPEAT STRIP_TAC);
632  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
633  (REWRITE_TAC[ASSUME `u0 = u1:real^3`; 
634    SET_RULE `{u1, u1, u2, u3} = {u1,u2,u3}`;Geomdetail.CARD3 ]);
635  (ASM_ARITH_TAC);
636  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
637  (REWRITE_TAC[ASSUME `u0 = u2:real^3`; 
638    SET_RULE `{u2, u1, u2, u3} = {u1,u2,u3}`;Geomdetail.CARD3 ]);
639  (ASM_ARITH_TAC);
640  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
641  (REWRITE_TAC[ASSUME `u0 = u3:real^3`; 
642    SET_RULE `{u3, u1, u2, u3} = {u1,u2,u3}`;Geomdetail.CARD3 ]);
643  (ASM_ARITH_TAC);
644  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
645  (REWRITE_TAC[ASSUME `u1 = u2:real^3`; 
646    SET_RULE `{u0, u2, u2, u3} = {u0,u2,u3}`;Geomdetail.CARD3 ]);
647  (ASM_ARITH_TAC);
648  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
649  (REWRITE_TAC[ASSUME `u1 = u3:real^3`; 
650    SET_RULE `{u0, u3, u2, u3} = {u0,u2,u3}`;Geomdetail.CARD3 ]);
651  (ASM_ARITH_TAC);
652  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
653  (REWRITE_TAC[ASSUME `u2 = u3:real^3`; 
654    SET_RULE `{u0, u1, u3, u3} = {u0,u1,u3}`;Geomdetail.CARD3 ]);
655  (ASM_ARITH_TAC);
656
657  (NEW_GOAL `edgeX V X = {{u0,u1:real^3}, {u0,u2}, {u0,u3}, 
658                           {u1,u2}, {u1,u3}, {u2,u3}}`);
659  (REWRITE_TAC[edgeX]);
660  (ONCE_REWRITE_TAC[SET_EQ_LEMMA]);
661  (REWRITE_TAC[IN_ELIM_THM]);
662  (REPEAT STRIP_TAC);
663
664  (UNDISCH_TAC `VX V X u` THEN UNDISCH_TAC `VX V X v`);
665  (REWRITE_TAC[MESON[IN] `VX V X s <=> s IN VX V X`]);
666  (ASM_REWRITE_TAC[SET_RULE `v IN {u0, u1, u2, u3} <=> 
667                              v = u0 \/ v = u1 \/ v = u2 \/ v = u3`]);
668  (REPEAT STRIP_TAC);
669  (NEW_GOAL `F`);
670  (ASM_MESON_TAC[]);
671  (ASM_MESON_TAC[]);
672  (REWRITE_WITH `{u,v} = {v,u:real^3}`);
673  (SET_TAC[]);
674  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
675  (REWRITE_WITH `{u,v} = {v,u:real^3}`);
676  (SET_TAC[]);
677  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
678  (REWRITE_WITH `{u,v} = {v,u:real^3}`);
679  (SET_TAC[]);
680  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
681  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
682  (NEW_GOAL `F`);
683  (ASM_MESON_TAC[]);
684  (ASM_MESON_TAC[]);
685  (REWRITE_WITH `{u,v} = {v,u:real^3}`);
686  (SET_TAC[]);
687  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
688  (REWRITE_WITH `{u,v} = {v,u:real^3}`);
689  (SET_TAC[]);
690  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
691  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
692  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
693  (NEW_GOAL `F`);
694  (ASM_MESON_TAC[]);
695  (ASM_MESON_TAC[]);
696  (REWRITE_WITH `{u,v} = {v,u:real^3}`);
697  (SET_TAC[]);
698  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
699  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
700  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
701  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
702  (NEW_GOAL `F`);
703  (ASM_MESON_TAC[]);
704  (ASM_MESON_TAC[]);
705
706  (UP_ASM_TAC THEN REWRITE_TAC[SET_RULE `x IN {a,b,c,d,e,f} <=> 
707    x = a \/ x = b \/ x = c \/ x = d \/ x = e \/ x = f`]);
708  (REWRITE_TAC[MESON[IN] `VX V X s <=> s IN VX V X`]);
709  (ASM_REWRITE_TAC[SET_RULE `v IN {u0, u1, u2, u3} <=> 
710                              v = u0 \/ v = u1 \/ v = u2 \/ v = u3`]);
711  (REPEAT STRIP_TAC);
712  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3` THEN ASM_REWRITE_TAC[]);
713  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u2:real^3` THEN ASM_REWRITE_TAC[]);
714  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u3:real^3` THEN ASM_REWRITE_TAC[]);
715  (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN ASM_REWRITE_TAC[]);
716  (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u3:real^3` THEN ASM_REWRITE_TAC[]);
717  (EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3` THEN ASM_REWRITE_TAC[]);
718
719 (* ==================================== *)
720  (REPEAT STRIP_TAC);
721
722  (REWRITE_TAC[dihX]);
723  (COND_CASES_TAC);
724  (NEW_GOAL `F`);
725  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
726  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
727
728  (LET_TAC);
729  (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
730  (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
731            ul IN barV V 3 /\
732            X = mcell k V ul /\
733            initial_sublist [u0; u1] ul)`);
734  (STRIP_TAC);
735  (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
736  (MATCH_MP_TAC SELECT_AX);
737  (EXISTS_TAC `(4, ul:(real^3)list)`);
738  (EXPAND_TAC "P");
739  (REWRITE_TAC[BETA_THM]);
740  (ASM_REWRITE_TAC[IN; ARITH_RULE `4 <= 4`]);
741  (STRIP_TAC);
742  (MESON_TAC[MCELL_EXPLICIT; ASSUME `i >= 4`; ARITH_RULE `4 >= 4`]);
743  (REWRITE_TAC[INITIAL_SUBLIST]);
744  (EXISTS_TAC `[u2;u3:real^3]` THEN REWRITE_TAC[APPEND]);
745
746  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
747  (EXPAND_TAC "P" THEN REWRITE_TAC[IN]);
748
749  (REPEAT STRIP_TAC);
750  (ASM_CASES_TAC `2 <= k`);
751  (NEW_GOAL `k = 4`);
752  (NEW_GOAL `4 = k /\
753              (!t. 4 - 1 <= t /\ t <= 3
754                   ==> omega_list_n V ul t = omega_list_n V ul' t)`);
755  (MATCH_MP_TAC Marchal_cells_3.MCELL_ID_OMEGA_LIST_N);
756  (ASM_REWRITE_TAC[SET_RULE `x IN {2,3,4} <=> x=2\/x=3\/x=4`]);
757  (REWRITE_TAC[GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`)]);
758  (REWRITE_WITH `mcell 4 V ul = X`);
759  (REWRITE_TAC[ASSUME `X = mcell i V ul`]);
760  (MESON_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ASSUME `i >= 4`]);
761  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `~NULLSET X`]);
762  (ASM_ARITH_TAC);
763  (ASM_REWRITE_TAC[]);
764  (COND_CASES_TAC);
765  (NEW_GOAL `F`);
766  (ASM_ARITH_TAC);
767  (UP_ASM_TAC THEN MESON_TAC[]);
768  (COND_CASES_TAC);
769  (NEW_GOAL `F`);
770  (ASM_ARITH_TAC);
771  (UP_ASM_TAC THEN MESON_TAC[]);
772  (COND_CASES_TAC);
773  (REWRITE_TAC[dihu4]);
774  (NEW_GOAL `?v0 v1 v2 v3. ul' = [v0;v1;v2;v3:real^3]`);
775  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
776  (EXISTS_TAC `V:real^3->bool`);
777  (ASM_REWRITE_TAC[]);
778  (UP_ASM_TAC THEN STRIP_TAC);
779
780  (NEW_GOAL `u0 = v0:real^3`);
781  (NEW_GOAL`u0 = HD [u0;u1:real^3]`);
782  (REWRITE_TAC[HD]);
783  (ONCE_REWRITE_TAC[ASSUME `u0 = HD[u0;u1:real^3]`]);
784  (REWRITE_WITH `v0:real^3 = HD ul'`);
785  (ASM_REWRITE_TAC[HD]);
786  (REWRITE_WITH `[u0;u1:real^3] = truncate_simplex 1 ul'`);
787  (NEW_GOAL `[u0;u1:real^3] = truncate_simplex (LENGTH [u0;u1] - 1) ul' /\
788                   LENGTH [u0;u1] <= LENGTH ul'`);
789  (MATCH_MP_TAC Packing3.INITIAL_SUBLIST_IMP_TRUNCATE_SIMPLEX);
790  (ASM_REWRITE_TAC[LENGTH]);
791  (ARITH_TAC);
792  (UP_ASM_TAC THEN REWRITE_TAC[LENGTH; ARITH_RULE `SUC(SUC(0)) - 1 = 1`]);
793  (MESON_TAC[]);
794  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
795  (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1`);
796  (MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA);
797  (EXISTS_TAC `V:real^3->bool`);
798  (ASM_REWRITE_TAC[]);
799  (ARITH_TAC);
800
801  (NEW_GOAL `u1 = v1:real^3`);
802  (NEW_GOAL`u1 = EL 1 [u0;u1:real^3]`);
803  (REWRITE_TAC[EL; ARITH_RULE `1 = SUC 0`; TL; HD]);
804  (ONCE_REWRITE_TAC[ASSUME `u1 = EL 1 [u0;u1:real^3]`]);
805
806  (REWRITE_WITH `v1:real^3 = EL 1 ul'`);
807  (ASM_REWRITE_TAC[EL; ARITH_RULE `1 = SUC 0`; TL; HD]);
808  (REWRITE_WITH `[u0;u1:real^3] = truncate_simplex 1 ul'`);
809  (NEW_GOAL `[u0;u1:real^3] = truncate_simplex (LENGTH [u0;u1] - 1) ul' /\
810                   LENGTH [u0;u1] <= LENGTH ul'`);
811  (MATCH_MP_TAC Packing3.INITIAL_SUBLIST_IMP_TRUNCATE_SIMPLEX);
812  (ASM_REWRITE_TAC[LENGTH]);
813  (ARITH_TAC);
814  (UP_ASM_TAC THEN REWRITE_TAC[LENGTH; ARITH_RULE `SUC(SUC(0)) - 1 = 1`]);
815  (MESON_TAC[]);
816  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
817  (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1`);
818  (MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA);
819  (EXISTS_TAC `V:real^3->bool`);
820  (ASM_REWRITE_TAC[]);
821  (ARITH_TAC);
822
823  (NEW_GOAL `{u0,u1,u2,u3:real^3} = {v0,v1,v2,v3}`);
824  (NEW_GOAL `{u0,u1,u2,u3:real^3} = {v0,v1,v2,v3} <=> 
825    convex hull {u0,u1,u2,u3:real^3} = convex hull {v0,v1,v2,v3}`);
826  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
827  (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);
828  (REWRITE_TAC[GSYM set_of_list; GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`); 
829    GSYM (ASSUME `ul' = [v0;v1;v2;v3:real^3]`)]);
830  (STRIP_TAC);
831  (MATCH_MP_TAC Rogers.BARV_AFFINE_INDEPENDENT);
832  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
833  (MATCH_MP_TAC Rogers.BARV_AFFINE_INDEPENDENT);
834  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
835  (ONCE_REWRITE_TAC[ASSUME `{u0, u1, u2, u3:real^3} = {v0, v1, v2, v3} <=>
836       convex hull {u0, u1, u2, u3} = convex hull {v0, v1, v2, v3}`]);
837  (REWRITE_TAC[GSYM set_of_list; GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`); 
838    GSYM (ASSUME `ul' = [v0;v1;v2;v3:real^3]`)]);
839  (REWRITE_WITH `convex hull set_of_list ul= X:real^3->bool`);
840  (REWRITE_TAC[ASSUME `X = mcell i V ul`]);
841  (REWRITE_WITH `mcell i V ul = mcell4 V ul`);
842  (MESON_TAC[ASSUME `i >= 4`; MCELL_EXPLICIT]);
843  (REWRITE_TAC[mcell4]);
844  (COND_CASES_TAC);
845  (REFL_TAC);
846  (NEW_GOAL `F`);
847  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
848  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
849
850  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 4`]);
851  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
852  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
853  (REWRITE_TAC[mcell4]);
854  (COND_CASES_TAC);
855  (REFL_TAC);
856  (NEW_GOAL `F`);
857  (NEW_GOAL `X:real^3->bool = {}`);
858  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 4`]);
859  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
860  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
861  (REWRITE_TAC[mcell4]);
862  (COND_CASES_TAC);
863  (NEW_GOAL `F`);
864  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
865  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
866  (REFL_TAC);
867  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
868  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
869  (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
870  (NEW_GOAL `(v2 = u2 /\ v3 = u3:real^3) \/ (v2 = u3 /\ v3 = u2)`);
871
872
873  (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1) /\ ~(u0 = u2) /\ ~(u0 = u3) /\
874       ~(u1 = u2) /\ ~(u1 = u3) /\ ~(u2 = u3:real^3)`);
875  (ASM_REWRITE_TAC[]);
876  (SET_TAC[]);
877  (UP_ASM_TAC THEN STRIP_TAC);
878
879  (GMATCH_SIMP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] DIHV_EQ_DIH_Y));
880  (STRIP_TAC);
881  (STRIP_TAC);
882  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
883  (EXISTS_TAC `v3:real^3`);
884  (REWRITE_TAC[coplanar] THEN STRIP_TAC);
885  (NEW_GOAL `affine hull {v0, v1, v2, v3:real^3} SUBSET 
886              affine hull (affine hull {u, v, w})`);
887  (ASM_SIMP_TAC[Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA]);
888  (UP_ASM_TAC THEN REWRITE_WITH `affine hull (affine hull {u, v, w}) = 
889                                  affine hull {u:real^3, v, w}`);
890  (REWRITE_TAC[AFFINE_HULL_EQ; AFFINE_AFFINE_HULL]);
891  (STRIP_TAC);
892  (NEW_GOAL `NULLSET X`);
893  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
894  (EXISTS_TAC `affine hull {v0, v1, v2,v3:real^3}`);
895  (STRIP_TAC);
896  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
897  (EXISTS_TAC `affine hull {u,v,w:real^3}`);
898  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
899  (ASM_REWRITE_TAC[]);
900  (REWRITE_TAC[ASSUME `k = 4`; ASSUME `X = mcell k V ul'`]);
901  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
902  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
903  (REWRITE_TAC[mcell4]);
904  (COND_CASES_TAC);
905  (ASM_REWRITE_TAC[set_of_list; CONVEX_HULL_SUBSET_AFFINE_HULL]);
906  (SET_TAC[]);
907  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
908
909  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
910  (EXISTS_TAC `v2:real^3`);
911  (ONCE_REWRITE_TAC[SET_RULE ` {v0, v1, v3, v2} =  {v0, v1, v2, v3}`]);
912  (REWRITE_TAC[coplanar] THEN STRIP_TAC);
913  (NEW_GOAL `affine hull {v0, v1, v2, v3:real^3} SUBSET 
914              affine hull (affine hull {u, v, w})`);
915  (ASM_SIMP_TAC[Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA]);
916  (UP_ASM_TAC THEN REWRITE_WITH `affine hull (affine hull {u, v, w}) = 
917                                  affine hull {u:real^3, v, w}`);
918  (REWRITE_TAC[AFFINE_HULL_EQ; AFFINE_AFFINE_HULL]);
919  (STRIP_TAC);
920  (NEW_GOAL `NULLSET X`);
921  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
922  (EXISTS_TAC `affine hull {v0, v1, v2,v3:real^3}`);
923  (STRIP_TAC);
924  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
925  (EXISTS_TAC `affine hull {u,v,w:real^3}`);
926  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
927  (ASM_REWRITE_TAC[]);
928  (REWRITE_TAC[ASSUME `k = 4`; ASSUME `X = mcell k V ul'`]);
929  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
930  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
931  (REWRITE_TAC[mcell4]);
932  (COND_CASES_TAC);
933  (ASM_REWRITE_TAC[set_of_list; CONVEX_HULL_SUBSET_AFFINE_HULL]);
934  (SET_TAC[]);
935  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
936
937  (ASM_REWRITE_TAC[]);
938  (REWRITE_TAC[GSYM (ASSUME `u0 = v0:real^3`); GSYM (ASSUME `u1 = v1:real^3`)]);
939  (EXPAND_TAC "y1" THEN EXPAND_TAC "y2" THEN EXPAND_TAC "y3");
940  (EXPAND_TAC "y4" THEN EXPAND_TAC "y5" THEN EXPAND_TAC "y6");
941  (REFL_TAC);
942
943  (GMATCH_SIMP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] DIHV_EQ_DIH_Y));
944  (STRIP_TAC);
945  (STRIP_TAC);
946  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
947  (EXISTS_TAC `v3:real^3`);
948  (REWRITE_TAC[coplanar] THEN STRIP_TAC);
949  (NEW_GOAL `affine hull {v0, v1, v2, v3:real^3} SUBSET 
950              affine hull (affine hull {u, v, w})`);
951  (ASM_SIMP_TAC[Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA]);
952  (UP_ASM_TAC THEN REWRITE_WITH `affine hull (affine hull {u, v, w}) = 
953                                  affine hull {u:real^3, v, w}`);
954  (REWRITE_TAC[AFFINE_HULL_EQ; AFFINE_AFFINE_HULL]);
955  (STRIP_TAC);
956  (NEW_GOAL `NULLSET X`);
957  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
958  (EXISTS_TAC `affine hull {v0, v1, v2,v3:real^3}`);
959  (STRIP_TAC);
960  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
961  (EXISTS_TAC `affine hull {u,v,w:real^3}`);
962  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
963  (ASM_REWRITE_TAC[]);
964  (REWRITE_TAC[ASSUME `k = 4`; ASSUME `X = mcell k V ul'`]);
965  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
966  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
967  (REWRITE_TAC[mcell4]);
968  (COND_CASES_TAC);
969  (ASM_REWRITE_TAC[set_of_list; CONVEX_HULL_SUBSET_AFFINE_HULL]);
970  (SET_TAC[]);
971  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
972
973  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
974  (EXISTS_TAC `v2:real^3`);
975  (ONCE_REWRITE_TAC[SET_RULE ` {v0, v1, v3, v2} =  {v0, v1, v2, v3}`]);
976  (REWRITE_TAC[coplanar] THEN STRIP_TAC);
977  (NEW_GOAL `affine hull {v0, v1, v2, v3:real^3} SUBSET 
978              affine hull (affine hull {u, v, w})`);
979  (ASM_SIMP_TAC[Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA]);
980  (UP_ASM_TAC THEN REWRITE_WITH `affine hull (affine hull {u, v, w}) = 
981                                  affine hull {u:real^3, v, w}`);
982  (REWRITE_TAC[AFFINE_HULL_EQ; AFFINE_AFFINE_HULL]);
983  (STRIP_TAC);
984  (NEW_GOAL `NULLSET X`);
985  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
986  (EXISTS_TAC `affine hull {v0, v1, v2,v3:real^3}`);
987  (STRIP_TAC);
988  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
989  (EXISTS_TAC `affine hull {u,v,w:real^3}`);
990  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
991  (ASM_REWRITE_TAC[]);
992  (REWRITE_TAC[ASSUME `k = 4`; ASSUME `X = mcell k V ul'`]);
993  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
994  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
995  (REWRITE_TAC[mcell4]);
996  (COND_CASES_TAC);
997  (ASM_REWRITE_TAC[set_of_list; CONVEX_HULL_SUBSET_AFFINE_HULL]);
998  (SET_TAC[]);
999  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1000
1001  (ASM_REWRITE_TAC[]);
1002  (REWRITE_TAC[GSYM (ASSUME `u0 = v0:real^3`); GSYM (ASSUME `u1 = v1:real^3`)]);
1003  (EXPAND_TAC "y1" THEN EXPAND_TAC "y2" THEN EXPAND_TAC "y3");
1004  (EXPAND_TAC "y4" THEN EXPAND_TAC "y5" THEN EXPAND_TAC "y6");
1005  (REWRITE_TAC[Nonlinear_lemma.dih_y_sym; DIST_SYM]);
1006  (NEW_GOAL `F`);
1007  (ASM_ARITH_TAC);
1008  (UP_ASM_TAC THEN MESON_TAC[]);
1009
1010  (NEW_GOAL `F`);
1011  (NEW_GOAL `V INTER (X:real^3->bool) = set_of_list (truncate_simplex (4 - 1) ul)`);
1012  (REWRITE_TAC[ASSUME `X = mcell i V ul`]);
1013  (REWRITE_WITH `mcell i V ul = mcell 4 V ul`);
1014  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT; ASSUME `i >= 4`]);
1015  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
1016  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 4 /\ 4 <= 4`]);
1017  (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
1018  (ASM_REWRITE_TAC[]);
1019  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT; ASSUME `i >= 4`]);
1020  (ASM_REWRITE_TAC[]);
1021  (UP_ASM_TAC THEN REWRITE_TAC[ARITH_RULE `4 - 1 = 3`; 
1022    ASSUME `ul = [u0;u1;u2;u3:real^3]`; TRUNCATE_SIMPLEX_EXPLICIT_3]);
1023  (REWRITE_TAC[GSYM (ASSUME `ul = [u0; u1; u2; u3:real^3]`)]);
1024  (ASM_CASES_TAC `k = 1`);
1025
1026  (REWRITE_WITH `V INTER (X:real^3->bool) = 
1027                  set_of_list (truncate_simplex (k - 1) ul')`);
1028  (REWRITE_TAC[ASSUME `X = mcell k V ul'`]);
1029  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
1030  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 1 /\ 1 <= 4`]);
1031  (REWRITE_WITH `mcell 1 V ul' = X`);
1032  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 1`]);
1033  (ASM_REWRITE_TAC[]);
1034  (REWRITE_TAC[ARITH_RULE `1 - 1 = 0`; ASSUME `k = 1`]);
1035  (REWRITE_WITH `truncate_simplex 0 (ul':(real^3)list) = [HD ul']`);
1036  (MATCH_MP_TAC Packing3.TRUNCATE_0_EQ_HEAD);
1037  (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1`);
1038  (MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA);
1039  (EXISTS_TAC `V:real^3->bool`);
1040  (ASM_REWRITE_TAC[]);
1041  (ARITH_TAC);
1042
1043  (STRIP_TAC);
1044  (NEW_GOAL `CARD (set_of_list [(HD ul'):real^3]) = 
1045              CARD (set_of_list (ul:(real^3)list))`);
1046  (AP_TERM_TAC THEN ASM_REWRITE_TAC[]);
1047  (UP_ASM_TAC THEN REWRITE_WITH `CARD (set_of_list (ul:(real^3)list)) = 3 + 1`);
1048  (MATCH_MP_TAC Marchal_cells_3.BARV_CARD_LEMMA);
1049  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1050  (REWRITE_TAC[set_of_list; Geomdetail.CARD_SING] THEN ARITH_TAC);
1051  (NEW_GOAL `k = 0`);
1052  (ASM_ARITH_TAC);
1053
1054  (REWRITE_WITH `V INTER X = {}:real^3->bool`);
1055  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 0`]);
1056  (MATCH_MP_TAC Lepjbdj.LEPJBDJ_0);
1057  (ASM_REWRITE_TAC[]);
1058  (ASM_REWRITE_TAC[set_of_list]);
1059  (NEW_GOAL `u0 IN {u0,u1,u2,u3:real^3}`);
1060  (SET_TAC[]);
1061  (UP_ASM_TAC THEN SET_TAC[]);
1062  (UP_ASM_TAC THEN MESON_TAC[]);
1063
1064 (* ========================================================================= *)
1065
1066  (REWRITE_TAC[dihX]);
1067  (COND_CASES_TAC);
1068  (NEW_GOAL `F`);
1069  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1070  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1071
1072  (LET_TAC);
1073  (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
1074  (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
1075            ul IN barV V 3 /\
1076            X = mcell k V ul /\
1077            initial_sublist [u0; u2] ul)`);
1078  (STRIP_TAC);
1079  (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
1080  (MATCH_MP_TAC SELECT_AX);
1081
1082  (ABBREV_TAC `wl = [u0;u2;u1;u3:real^3]`);
1083
1084   (* Need to list properties of wl at this point *)
1085  (NEW_GOAL `?p. p permutes 0..3 /\
1086                   wl:(real^3)list = left_action_list p ul`);
1087  (ASM_REWRITE_TAC[] THEN EXPAND_TAC "wl");
1088  (MATCH_MP_TAC Marchal_cells_3.LEFT_ACTION_LIST_3_EXISTS);
1089  (STRIP_TAC);
1090  (REWRITE_TAC[GSYM set_of_list; GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`)]);
1091  (REWRITE_TAC[ARITH_RULE `4 = 3 + 1`]);
1092  (MATCH_MP_TAC Marchal_cells_3.BARV_CARD_LEMMA);
1093  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1094  (SET_TAC[]);
1095  (UP_ASM_TAC THEN STRIP_TAC);
1096  (NEW_GOAL `barV V 3 wl`);
1097  (MATCH_MP_TAC Qzksykg.QZKSYKG1);
1098  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `4` THEN EXISTS_TAC `p:num->num`);
1099  (ASM_REWRITE_TAC[SET_RULE `4 IN {0,1,2,3,4}`; ARITH_RULE `4 - 1 = 3`]);
1100  (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
1101  (ASM_REWRITE_TAC[]);
1102  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT; ASSUME `i >= 4`]);
1103  (ASM_REWRITE_TAC[]);
1104
1105  (EXISTS_TAC `(4, wl:(real^3)list)`);
1106  (EXPAND_TAC "P");
1107  (REWRITE_TAC[BETA_THM]);
1108  (ASM_REWRITE_TAC[IN; ARITH_RULE `4 <= 4`]);
1109  (STRIP_TAC);
1110
1111  (REWRITE_WITH `mcell i V [u0; u1; u2; u3] = mcell 4 V [u0; u1; u2; u3]`);
1112  (MESON_TAC[MCELL_EXPLICIT; ASSUME `i >= 4`; ARITH_RULE `4 >= 4`]);
1113  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1114  (MATCH_MP_TAC Rvfxzbu.RVFXZBU);
1115  (ASM_REWRITE_TAC[SET_RULE `4 IN {0,1,2,3,4}`; ARITH_RULE `4 - 1 = 3`]);
1116  (REWRITE_TAC[GSYM (ASSUME `ul = [u0; u1; u2; u3:real^3]`)]);
1117  (ASM_REWRITE_TAC[]);
1118  (REWRITE_TAC[GSYM (ASSUME `ul = [u0; u1; u2; u3:real^3]`)]);
1119  (REWRITE_TAC[GSYM (ASSUME `wl:(real^3)list = left_action_list p ul`)]);
1120  (EXPAND_TAC "wl");
1121  (REWRITE_WITH `[u0; u2; u1; u3] = APPEND [u0; u2] [u1; u3:real^3]`);
1122  (REWRITE_TAC[APPEND]);
1123  (REWRITE_TAC[Packing3.INITIAL_SUBLIST_APPEND]);
1124
1125  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1126  (EXPAND_TAC "P" THEN REWRITE_TAC[IN]);
1127
1128  (REPEAT STRIP_TAC);
1129  (ASM_CASES_TAC `2 <= k`);
1130  (NEW_GOAL `k = 4`);
1131  (NEW_GOAL `4 = k /\
1132              (!t. 4 - 1 <= t /\ t <= 3
1133                   ==> omega_list_n V ul t = omega_list_n V ul' t)`);
1134  (MATCH_MP_TAC Marchal_cells_3.MCELL_ID_OMEGA_LIST_N);
1135  (ASM_REWRITE_TAC[SET_RULE `x IN {2,3,4} <=> x=2\/x=3\/x=4`]);
1136  (REWRITE_TAC[GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`)]);
1137  (REWRITE_WITH `mcell 4 V ul = X`);
1138  (REWRITE_TAC[ASSUME `X = mcell i V ul`]);
1139  (MESON_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ASSUME `i >= 4`]);
1140  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `~NULLSET X`]);
1141  (ASM_ARITH_TAC);
1142  (ASM_REWRITE_TAC[]);
1143  (COND_CASES_TAC);
1144  (NEW_GOAL `F`);
1145  (ASM_ARITH_TAC);
1146  (UP_ASM_TAC THEN MESON_TAC[]);
1147  (COND_CASES_TAC);
1148  (NEW_GOAL `F`);
1149  (ASM_ARITH_TAC);
1150  (UP_ASM_TAC THEN MESON_TAC[]);
1151  (COND_CASES_TAC);
1152  (REWRITE_TAC[dihu4]);
1153  (NEW_GOAL `?v0 v1 v2 v3. ul' = [v0;v1;v2;v3:real^3]`);
1154  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
1155  (EXISTS_TAC `V:real^3->bool`);
1156  (ASM_REWRITE_TAC[]);
1157  (UP_ASM_TAC THEN STRIP_TAC);
1158
1159  (NEW_GOAL `u0 = v0:real^3`);
1160  (NEW_GOAL`u0 = HD [u0;u2:real^3]`);
1161  (REWRITE_TAC[HD]);
1162  (ONCE_REWRITE_TAC[ASSUME `u0 = HD[u0;u2:real^3]`]);
1163  (REWRITE_WITH `v0:real^3 = HD ul'`);
1164  (ASM_REWRITE_TAC[HD]);
1165  (REWRITE_WITH `[u0;u2:real^3] = truncate_simplex 1 ul'`);
1166  (NEW_GOAL `[u0;u2:real^3] = truncate_simplex (LENGTH [u0;u2] - 1) ul' /\
1167                   LENGTH [u0;u2] <= LENGTH ul'`);
1168  (MATCH_MP_TAC Packing3.INITIAL_SUBLIST_IMP_TRUNCATE_SIMPLEX);
1169  (ASM_REWRITE_TAC[LENGTH]);
1170  (ARITH_TAC);
1171  (UP_ASM_TAC THEN REWRITE_TAC[LENGTH; ARITH_RULE `SUC(SUC(0)) - 1 = 1`]);
1172  (MESON_TAC[]);
1173  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1174  (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1`);
1175  (MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA);
1176  (EXISTS_TAC `V:real^3->bool`);
1177  (ASM_REWRITE_TAC[]);
1178  (ARITH_TAC);
1179
1180  (NEW_GOAL `u2 = v1:real^3`);
1181  (NEW_GOAL`u2 = EL 1 [u0;u2:real^3]`);
1182  (REWRITE_TAC[EL; ARITH_RULE `1 = SUC 0`; TL; HD]);
1183  (ONCE_REWRITE_TAC[ASSUME `u2 = EL 1 [u0;u2:real^3]`]);
1184
1185  (REWRITE_WITH `v1:real^3 = EL 1 ul'`);
1186  (ASM_REWRITE_TAC[EL; ARITH_RULE `1 = SUC 0`; TL; HD]);
1187  (REWRITE_WITH `[u0;u2:real^3] = truncate_simplex 1 ul'`);
1188  (NEW_GOAL `[u0;u2:real^3] = truncate_simplex (LENGTH [u0;u2] - 1) ul' /\
1189                   LENGTH [u0;u2] <= LENGTH ul'`);
1190  (MATCH_MP_TAC Packing3.INITIAL_SUBLIST_IMP_TRUNCATE_SIMPLEX);
1191  (ASM_REWRITE_TAC[LENGTH]);
1192  (ARITH_TAC);
1193  (UP_ASM_TAC THEN REWRITE_TAC[LENGTH; ARITH_RULE `SUC(SUC(0)) - 1 = 1`]);
1194  (MESON_TAC[]);
1195  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
1196  (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1`);
1197  (MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA);
1198  (EXISTS_TAC `V:real^3->bool`);
1199  (ASM_REWRITE_TAC[]);
1200  (ARITH_TAC);
1201
1202  (NEW_GOAL `{u0,u1,u2,u3:real^3} = {v0,v1,v2,v3}`);
1203  (NEW_GOAL `{u0,u1,u2,u3:real^3} = {v0,v1,v2,v3} <=> 
1204    convex hull {u0,u1,u2,u3:real^3} = convex hull {v0,v1,v2,v3}`);
1205  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1206  (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);
1207  (REWRITE_TAC[GSYM set_of_list; GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`); 
1208    GSYM (ASSUME `ul' = [v0;v1;v2;v3:real^3]`)]);
1209  (STRIP_TAC);
1210  (MATCH_MP_TAC Rogers.BARV_AFFINE_INDEPENDENT);
1211  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
1212  (MATCH_MP_TAC Rogers.BARV_AFFINE_INDEPENDENT);
1213  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
1214  (ONCE_REWRITE_TAC[ASSUME `{u0, u1, u2, u3:real^3} = {v0, v1, v2, v3} <=>
1215       convex hull {u0, u1, u2, u3} = convex hull {v0, v1, v2, v3}`]);
1216  (REWRITE_TAC[GSYM set_of_list; GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`); 
1217    GSYM (ASSUME `ul' = [v0;v1;v2;v3:real^3]`)]);
1218  (REWRITE_WITH `convex hull set_of_list ul= X:real^3->bool`);
1219  (REWRITE_TAC[ASSUME `X = mcell i V ul`]);
1220  (REWRITE_WITH `mcell i V ul = mcell4 V ul`);
1221  (MESON_TAC[ASSUME `i >= 4`; MCELL_EXPLICIT]);
1222  (REWRITE_TAC[mcell4]);
1223  (COND_CASES_TAC);
1224  (REFL_TAC);
1225  (NEW_GOAL `F`);
1226  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1227  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1228
1229  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 4`]);
1230  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
1231  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
1232  (REWRITE_TAC[mcell4]);
1233  (COND_CASES_TAC);
1234  (REFL_TAC);
1235  (NEW_GOAL `F`);
1236  (NEW_GOAL `X:real^3->bool = {}`);
1237  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 4`]);
1238  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
1239  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
1240  (REWRITE_TAC[mcell4]);
1241  (COND_CASES_TAC);
1242  (NEW_GOAL `F`);
1243  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1244  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1245  (REFL_TAC);
1246  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1247  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1248
1249  (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
1250
1251  (NEW_GOAL `(v2 = u1 /\ v3 = u3:real^3) \/ (v2 = u3 /\ v3 = u1)`);
1252  (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1) /\ ~(u0 = u2) /\ ~(u0 = u3) /\
1253       ~(u1 = u2) /\ ~(u1 = u3) /\ ~(u2 = u3:real^3)`);
1254  (ASM_REWRITE_TAC[]);
1255  (SET_TAC[]);
1256  (UP_ASM_TAC THEN STRIP_TAC);
1257
1258  (GMATCH_SIMP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] DIHV_EQ_DIH_Y));
1259  (STRIP_TAC);
1260  (STRIP_TAC);
1261  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
1262  (EXISTS_TAC `v3:real^3`);
1263  (REWRITE_TAC[coplanar] THEN STRIP_TAC);
1264  (NEW_GOAL `affine hull {v0, v1, v2, v3:real^3} SUBSET 
1265              affine hull (affine hull {u, v, w})`);
1266  (ASM_SIMP_TAC[Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA]);
1267  (UP_ASM_TAC THEN REWRITE_WITH `affine hull (affine hull {u, v, w}) = 
1268                                  affine hull {u:real^3, v, w}`);
1269  (REWRITE_TAC[AFFINE_HULL_EQ; AFFINE_AFFINE_HULL]);
1270  (STRIP_TAC);
1271  (NEW_GOAL `NULLSET X`);
1272  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1273  (EXISTS_TAC `affine hull {v0, v1, v2,v3:real^3}`);
1274  (STRIP_TAC);
1275  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1276  (EXISTS_TAC `affine hull {u,v,w:real^3}`);
1277  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
1278  (ASM_REWRITE_TAC[]);
1279  (REWRITE_TAC[ASSUME `k = 4`; ASSUME `X = mcell k V ul'`]);
1280  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
1281  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
1282  (REWRITE_TAC[mcell4]);
1283  (COND_CASES_TAC);
1284  (ASM_REWRITE_TAC[set_of_list; CONVEX_HULL_SUBSET_AFFINE_HULL]);
1285  (SET_TAC[]);
1286  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1287
1288  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
1289  (EXISTS_TAC `v2:real^3`);
1290  (ONCE_REWRITE_TAC[SET_RULE ` {v0, v1, v3, v2} =  {v0, v1, v2, v3}`]);
1291  (REWRITE_TAC[coplanar] THEN STRIP_TAC);
1292  (NEW_GOAL `affine hull {v0, v1, v2, v3:real^3} SUBSET 
1293              affine hull (affine hull {u, v, w})`);
1294  (ASM_SIMP_TAC[Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA]);
1295  (UP_ASM_TAC THEN REWRITE_WITH `affine hull (affine hull {u, v, w}) = 
1296                                  affine hull {u:real^3, v, w}`);
1297  (REWRITE_TAC[AFFINE_HULL_EQ; AFFINE_AFFINE_HULL]);
1298  (STRIP_TAC);
1299  (NEW_GOAL `NULLSET X`);
1300  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1301  (EXISTS_TAC `affine hull {v0, v1, v2,v3:real^3}`);
1302  (STRIP_TAC);
1303  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1304  (EXISTS_TAC `affine hull {u,v,w:real^3}`);
1305  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
1306  (ASM_REWRITE_TAC[]);
1307  (REWRITE_TAC[ASSUME `k = 4`; ASSUME `X = mcell k V ul'`]);
1308  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
1309  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
1310  (REWRITE_TAC[mcell4]);
1311  (COND_CASES_TAC);
1312  (ASM_REWRITE_TAC[set_of_list; CONVEX_HULL_SUBSET_AFFINE_HULL]);
1313  (SET_TAC[]);
1314  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1315
1316  (ASM_REWRITE_TAC[]);
1317  (REWRITE_TAC[GSYM (ASSUME `u0 = v0:real^3`); GSYM (ASSUME `u2 = v1:real^3`)]);
1318  (EXPAND_TAC "y1" THEN EXPAND_TAC "y2" THEN EXPAND_TAC "y3");
1319  (EXPAND_TAC "y4" THEN EXPAND_TAC "y5" THEN EXPAND_TAC "y6");
1320  (REWRITE_TAC[Nonlinear_lemma.dih_y_sym; DIST_SYM]);
1321
1322  (GMATCH_SIMP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] DIHV_EQ_DIH_Y));
1323  (STRIP_TAC);
1324  (STRIP_TAC);
1325  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
1326  (EXISTS_TAC `v3:real^3`);
1327  (REWRITE_TAC[coplanar] THEN STRIP_TAC);
1328  (NEW_GOAL `affine hull {v0, v1, v2, v3:real^3} SUBSET 
1329              affine hull (affine hull {u, v, w})`);
1330  (ASM_SIMP_TAC[Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA]);
1331  (UP_ASM_TAC THEN REWRITE_WITH `affine hull (affine hull {u, v, w}) = 
1332                                  affine hull {u:real^3, v, w}`);
1333  (REWRITE_TAC[AFFINE_HULL_EQ; AFFINE_AFFINE_HULL]);
1334  (STRIP_TAC);
1335  (NEW_GOAL `NULLSET X`);
1336  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1337  (EXISTS_TAC `affine hull {v0, v1, v2,v3:real^3}`);
1338  (STRIP_TAC);
1339  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1340  (EXISTS_TAC `affine hull {u,v,w:real^3}`);
1341  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
1342  (ASM_REWRITE_TAC[]);
1343  (REWRITE_TAC[ASSUME `k = 4`; ASSUME `X = mcell k V ul'`]);
1344  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
1345  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
1346  (REWRITE_TAC[mcell4]);
1347  (COND_CASES_TAC);
1348  (ASM_REWRITE_TAC[set_of_list; CONVEX_HULL_SUBSET_AFFINE_HULL]);
1349  (SET_TAC[]);
1350  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1351
1352  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
1353  (EXISTS_TAC `v2:real^3`);
1354  (ONCE_REWRITE_TAC[SET_RULE ` {v0, v1, v3, v2} =  {v0, v1, v2, v3}`]);
1355  (REWRITE_TAC[coplanar] THEN STRIP_TAC);
1356  (NEW_GOAL `affine hull {v0, v1, v2, v3:real^3} SUBSET 
1357              affine hull (affine hull {u, v, w})`);
1358  (ASM_SIMP_TAC[Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA]);
1359  (UP_ASM_TAC THEN REWRITE_WITH `affine hull (affine hull {u, v, w}) = 
1360                                  affine hull {u:real^3, v, w}`);
1361  (REWRITE_TAC[AFFINE_HULL_EQ; AFFINE_AFFINE_HULL]);
1362  (STRIP_TAC);
1363  (NEW_GOAL `NULLSET X`);
1364  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1365  (EXISTS_TAC `affine hull {v0, v1, v2,v3:real^3}`);
1366  (STRIP_TAC);
1367  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1368  (EXISTS_TAC `affine hull {u,v,w:real^3}`);
1369  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
1370  (ASM_REWRITE_TAC[]);
1371  (REWRITE_TAC[ASSUME `k = 4`; ASSUME `X = mcell k V ul'`]);
1372  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
1373  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
1374  (REWRITE_TAC[mcell4]);
1375  (COND_CASES_TAC);
1376  (ASM_REWRITE_TAC[set_of_list; CONVEX_HULL_SUBSET_AFFINE_HULL]);
1377  (SET_TAC[]);
1378  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1379
1380  (ASM_REWRITE_TAC[]);
1381  (REWRITE_TAC[GSYM (ASSUME `u0 = v0:real^3`); GSYM (ASSUME `u2 = v1:real^3`)]);
1382  (EXPAND_TAC "y1" THEN EXPAND_TAC "y2" THEN EXPAND_TAC "y3");
1383  (EXPAND_TAC "y4" THEN EXPAND_TAC "y5" THEN EXPAND_TAC "y6");
1384  (REWRITE_TAC[DIST_SYM]);
1385  (NEW_GOAL `F`);
1386  (ASM_ARITH_TAC);
1387  (UP_ASM_TAC THEN MESON_TAC[]);
1388
1389  (NEW_GOAL `F`);
1390  (NEW_GOAL `V INTER (X:real^3->bool) = set_of_list (truncate_simplex (4 - 1) ul)`);
1391  (REWRITE_TAC[ASSUME `X = mcell i V ul`]);
1392  (REWRITE_WITH `mcell i V ul = mcell 4 V ul`);
1393  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT; ASSUME `i >= 4`]);
1394  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
1395  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 4 /\ 4 <= 4`]);
1396  (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
1397  (ASM_REWRITE_TAC[]);
1398  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT; ASSUME `i >= 4`]);
1399  (ASM_REWRITE_TAC[]);
1400  (UP_ASM_TAC THEN REWRITE_TAC[ARITH_RULE `4 - 1 = 3`; 
1401    ASSUME `ul = [u0;u1;u2;u3:real^3]`; TRUNCATE_SIMPLEX_EXPLICIT_3]);
1402  (REWRITE_TAC[GSYM (ASSUME `ul = [u0; u1; u2; u3:real^3]`)]);
1403  (ASM_CASES_TAC `k = 1`);
1404
1405  (REWRITE_WITH `V INTER (X:real^3->bool) = 
1406                  set_of_list (truncate_simplex (k - 1) ul')`);
1407  (REWRITE_TAC[ASSUME `X = mcell k V ul'`]);
1408  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
1409  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 1 /\ 1 <= 4`]);
1410  (REWRITE_WITH `mcell 1 V ul' = X`);
1411  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 1`]);
1412  (ASM_REWRITE_TAC[]);
1413  (REWRITE_TAC[ARITH_RULE `1 - 1 = 0`; ASSUME `k = 1`]);
1414  (REWRITE_WITH `truncate_simplex 0 (ul':(real^3)list) = [HD ul']`);
1415  (MATCH_MP_TAC Packing3.TRUNCATE_0_EQ_HEAD);
1416  (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1`);
1417  (MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA);
1418  (EXISTS_TAC `V:real^3->bool`);
1419  (ASM_REWRITE_TAC[]);
1420  (ARITH_TAC);
1421
1422  (STRIP_TAC);
1423  (NEW_GOAL `CARD (set_of_list [(HD ul'):real^3]) = 
1424              CARD (set_of_list (ul:(real^3)list))`);
1425  (AP_TERM_TAC THEN ASM_REWRITE_TAC[]);
1426  (UP_ASM_TAC THEN REWRITE_WITH `CARD (set_of_list (ul:(real^3)list)) = 3 + 1`);
1427  (MATCH_MP_TAC Marchal_cells_3.BARV_CARD_LEMMA);
1428  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1429  (REWRITE_TAC[set_of_list; Geomdetail.CARD_SING] THEN ARITH_TAC);
1430  (NEW_GOAL `k = 0`);
1431  (ASM_ARITH_TAC);
1432
1433  (REWRITE_WITH `V INTER X = {}:real^3->bool`);
1434  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 0`]);
1435  (MATCH_MP_TAC Lepjbdj.LEPJBDJ_0);
1436  (ASM_REWRITE_TAC[]);
1437  (ASM_REWRITE_TAC[set_of_list]);
1438  (NEW_GOAL `u0 IN {u0,u1,u2,u3:real^3}`);
1439  (SET_TAC[]);
1440  (UP_ASM_TAC THEN SET_TAC[]);
1441  (UP_ASM_TAC THEN MESON_TAC[]);
1442
1443 (* ========================================================================= *)
1444
1445  (REWRITE_TAC[dihX]);
1446
1447  (COND_CASES_TAC);
1448  (NEW_GOAL `F`);
1449  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1450  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1451
1452  (LET_TAC);
1453  (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
1454  (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
1455            ul IN barV V 3 /\
1456            X = mcell k V ul /\
1457            initial_sublist [u0; u3] ul)`);
1458  (STRIP_TAC);
1459  (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
1460  (MATCH_MP_TAC SELECT_AX);
1461
1462  (ABBREV_TAC `wl = [u0;u3;u1;u2:real^3]`);
1463
1464   (* Need to list properties of wl at this point *)
1465  (NEW_GOAL `?p. p permutes 0..3 /\
1466                   wl:(real^3)list = left_action_list p ul`);
1467  (ASM_REWRITE_TAC[] THEN EXPAND_TAC "wl");
1468  (MATCH_MP_TAC Marchal_cells_3.LEFT_ACTION_LIST_3_EXISTS);
1469  (STRIP_TAC);
1470  (REWRITE_TAC[GSYM set_of_list; GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`)]);
1471  (REWRITE_TAC[ARITH_RULE `4 = 3 + 1`]);
1472  (MATCH_MP_TAC Marchal_cells_3.BARV_CARD_LEMMA);
1473  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1474  (SET_TAC[]);
1475  (UP_ASM_TAC THEN STRIP_TAC);
1476  (NEW_GOAL `barV V 3 wl`);
1477  (MATCH_MP_TAC Qzksykg.QZKSYKG1);
1478  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `4` THEN EXISTS_TAC `p:num->num`);
1479  (ASM_REWRITE_TAC[SET_RULE `4 IN {0,1,2,3,4}`; ARITH_RULE `4 - 1 = 3`]);
1480  (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
1481  (ASM_REWRITE_TAC[]);
1482  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT; ASSUME `i >= 4`]);
1483  (ASM_REWRITE_TAC[]);
1484
1485  (EXISTS_TAC `(4, wl:(real^3)list)`);
1486  (EXPAND_TAC "P");
1487  (REWRITE_TAC[BETA_THM]);
1488  (ASM_REWRITE_TAC[IN; ARITH_RULE `4 <= 4`]);
1489  (STRIP_TAC);
1490
1491  (REWRITE_WITH `mcell i V [u0; u1; u2; u3] = mcell 4 V [u0; u1; u2; u3]`);
1492  (MESON_TAC[MCELL_EXPLICIT; ASSUME `i >= 4`; ARITH_RULE `4 >= 4`]);
1493  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1494  (MATCH_MP_TAC Rvfxzbu.RVFXZBU);
1495  (ASM_REWRITE_TAC[SET_RULE `4 IN {0,1,2,3,4}`; ARITH_RULE `4 - 1 = 3`]);
1496  (REWRITE_TAC[GSYM (ASSUME `ul = [u0; u1; u2; u3:real^3]`)]);
1497  (ASM_REWRITE_TAC[]);
1498  (REWRITE_TAC[GSYM (ASSUME `ul = [u0; u1; u2; u3:real^3]`)]);
1499  (REWRITE_TAC[GSYM (ASSUME `wl:(real^3)list = left_action_list p ul`)]);
1500  (EXPAND_TAC "wl");
1501  (REWRITE_WITH `[u0; u3; u1; u2] = APPEND [u0; u3] [u1; u2:real^3]`);
1502  (REWRITE_TAC[APPEND]);
1503  (REWRITE_TAC[Packing3.INITIAL_SUBLIST_APPEND]);
1504
1505  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1506  (EXPAND_TAC "P" THEN REWRITE_TAC[IN]);
1507
1508  (REPEAT STRIP_TAC);
1509  (ASM_CASES_TAC `2 <= k`);
1510  (NEW_GOAL `k = 4`);
1511  (NEW_GOAL `4 = k /\
1512              (!t. 4 - 1 <= t /\ t <= 3
1513                   ==> omega_list_n V ul t = omega_list_n V ul' t)`);
1514  (MATCH_MP_TAC Marchal_cells_3.MCELL_ID_OMEGA_LIST_N);
1515  (ASM_REWRITE_TAC[SET_RULE `x IN {2,3,4} <=> x=2\/x=3\/x=4`]);
1516  (REWRITE_TAC[GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`)]);
1517  (REWRITE_WITH `mcell 4 V ul = X`);
1518  (REWRITE_TAC[ASSUME `X = mcell i V ul`]);
1519  (MESON_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ASSUME `i >= 4`]);
1520  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `~NULLSET X`]);
1521  (ASM_ARITH_TAC);
1522  (ASM_REWRITE_TAC[]);
1523  (COND_CASES_TAC);
1524  (NEW_GOAL `F`);
1525  (ASM_ARITH_TAC);
1526  (UP_ASM_TAC THEN MESON_TAC[]);
1527  (COND_CASES_TAC);
1528  (NEW_GOAL `F`);
1529  (ASM_ARITH_TAC);
1530  (UP_ASM_TAC THEN MESON_TAC[]);
1531  (COND_CASES_TAC);
1532  (REWRITE_TAC[dihu4]);
1533  (NEW_GOAL `?v0 v1 v2 v3. ul' = [v0;v1;v2;v3:real^3]`);
1534  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
1535  (EXISTS_TAC `V:real^3->bool`);
1536  (ASM_REWRITE_TAC[]);
1537  (UP_ASM_TAC THEN STRIP_TAC);
1538
1539  (NEW_GOAL `u0 = v0:real^3`);
1540  (NEW_GOAL`u0 = HD [u0;u3:real^3]`);
1541  (REWRITE_TAC[HD]);
1542  (ONCE_REWRITE_TAC[ASSUME `u0 = HD[u0;u3:real^3]`]);
1543  (REWRITE_WITH `v0:real^3 = HD ul'`);
1544  (ASM_REWRITE_TAC[HD]);
1545  (REWRITE_WITH `[u0;u3:real^3] = truncate_simplex 1 ul'`);
1546  (NEW_GOAL `[u0;u3:real^3] = truncate_simplex (LENGTH [u0;u3] - 1) ul' /\
1547                   LENGTH [u0;u3] <= LENGTH ul'`);
1548  (MATCH_MP_TAC Packing3.INITIAL_SUBLIST_IMP_TRUNCATE_SIMPLEX);
1549  (ASM_REWRITE_TAC[LENGTH]);
1550  (ARITH_TAC);
1551  (UP_ASM_TAC THEN REWRITE_TAC[LENGTH; ARITH_RULE `SUC(SUC(0)) - 1 = 1`]);
1552  (MESON_TAC[]);
1553  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1554  (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1`);
1555  (MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA);
1556  (EXISTS_TAC `V:real^3->bool`);
1557  (ASM_REWRITE_TAC[]);
1558  (ARITH_TAC);
1559
1560  (NEW_GOAL `u3 = v1:real^3`);
1561  (NEW_GOAL`u3 = EL 1 [u0;u3:real^3]`);
1562  (REWRITE_TAC[EL; ARITH_RULE `1 = SUC 0`; TL; HD]);
1563  (ONCE_REWRITE_TAC[ASSUME `u3 = EL 1 [u0;u3:real^3]`]);
1564
1565  (REWRITE_WITH `v1:real^3 = EL 1 ul'`);
1566  (ASM_REWRITE_TAC[EL; ARITH_RULE `1 = SUC 0`; TL; HD]);
1567  (REWRITE_WITH `[u0;u3:real^3] = truncate_simplex 1 ul'`);
1568  (NEW_GOAL `[u0;u3:real^3] = truncate_simplex (LENGTH [u0;u3] - 1) ul' /\
1569                   LENGTH [u0;u3] <= LENGTH ul'`);
1570  (MATCH_MP_TAC Packing3.INITIAL_SUBLIST_IMP_TRUNCATE_SIMPLEX);
1571  (ASM_REWRITE_TAC[LENGTH]);
1572  (ARITH_TAC);
1573  (UP_ASM_TAC THEN REWRITE_TAC[LENGTH; ARITH_RULE `SUC(SUC(0)) - 1 = 1`]);
1574  (MESON_TAC[]);
1575  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
1576  (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1`);
1577  (MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA);
1578  (EXISTS_TAC `V:real^3->bool`);
1579  (ASM_REWRITE_TAC[]);
1580  (ARITH_TAC);
1581
1582  (NEW_GOAL `{u0,u1,u2,u3:real^3} = {v0,v1,v2,v3}`);
1583  (NEW_GOAL `{u0,u1,u2,u3:real^3} = {v0,v1,v2,v3} <=> 
1584    convex hull {u0,u1,u2,u3:real^3} = convex hull {v0,v1,v2,v3}`);
1585  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1586  (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);
1587  (REWRITE_TAC[GSYM set_of_list; GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`); 
1588    GSYM (ASSUME `ul' = [v0;v1;v2;v3:real^3]`)]);
1589  (STRIP_TAC);
1590  (MATCH_MP_TAC Rogers.BARV_AFFINE_INDEPENDENT);
1591  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
1592  (MATCH_MP_TAC Rogers.BARV_AFFINE_INDEPENDENT);
1593  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
1594  (ONCE_REWRITE_TAC[ASSUME `{u0, u1, u2, u3:real^3} = {v0, v1, v2, v3} <=>
1595       convex hull {u0, u1, u2, u3} = convex hull {v0, v1, v2, v3}`]);
1596  (REWRITE_TAC[GSYM set_of_list; GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`); 
1597    GSYM (ASSUME `ul' = [v0;v1;v2;v3:real^3]`)]);
1598  (REWRITE_WITH `convex hull set_of_list ul= X:real^3->bool`);
1599  (REWRITE_TAC[ASSUME `X = mcell i V ul`]);
1600  (REWRITE_WITH `mcell i V ul = mcell4 V ul`);
1601  (MESON_TAC[ASSUME `i >= 4`; MCELL_EXPLICIT]);
1602  (REWRITE_TAC[mcell4]);
1603  (COND_CASES_TAC);
1604  (REFL_TAC);
1605  (NEW_GOAL `F`);
1606  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1607  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1608
1609  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 4`]);
1610  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
1611  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
1612  (REWRITE_TAC[mcell4]);
1613  (COND_CASES_TAC);
1614  (REFL_TAC);
1615  (NEW_GOAL `F`);
1616  (NEW_GOAL `X:real^3->bool = {}`);
1617  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 4`]);
1618  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
1619  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
1620  (REWRITE_TAC[mcell4]);
1621  (COND_CASES_TAC);
1622  (NEW_GOAL `F`);
1623  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1624  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1625  (REFL_TAC);
1626  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1627  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1628
1629  (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
1630
1631  (NEW_GOAL `(v2 = u1 /\ v3 = u2:real^3) \/ (v2 = u2 /\ v3 = u1)`);
1632  (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1) /\ ~(u0 = u2) /\ ~(u0 = u3) /\
1633       ~(u1 = u2) /\ ~(u1 = u3) /\ ~(u2 = u3:real^3)`);
1634  (ASM_REWRITE_TAC[]);
1635  (SET_TAC[]);
1636  (UP_ASM_TAC THEN STRIP_TAC);
1637
1638  (GMATCH_SIMP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] DIHV_EQ_DIH_Y));
1639  (STRIP_TAC);
1640  (STRIP_TAC);
1641  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
1642  (EXISTS_TAC `v3:real^3`);
1643  (REWRITE_TAC[coplanar] THEN STRIP_TAC);
1644  (NEW_GOAL `affine hull {v0, v1, v2, v3:real^3} SUBSET 
1645              affine hull (affine hull {u, v, w})`);
1646  (ASM_SIMP_TAC[Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA]);
1647  (UP_ASM_TAC THEN REWRITE_WITH `affine hull (affine hull {u, v, w}) = 
1648                                  affine hull {u:real^3, v, w}`);
1649  (REWRITE_TAC[AFFINE_HULL_EQ; AFFINE_AFFINE_HULL]);
1650  (STRIP_TAC);
1651  (NEW_GOAL `NULLSET X`);
1652  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1653  (EXISTS_TAC `affine hull {v0, v1, v2,v3:real^3}`);
1654  (STRIP_TAC);
1655  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1656  (EXISTS_TAC `affine hull {u,v,w:real^3}`);
1657  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
1658  (ASM_REWRITE_TAC[]);
1659  (REWRITE_TAC[ASSUME `k = 4`; ASSUME `X = mcell k V ul'`]);
1660  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
1661  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
1662  (REWRITE_TAC[mcell4]);
1663  (COND_CASES_TAC);
1664  (ASM_REWRITE_TAC[set_of_list; CONVEX_HULL_SUBSET_AFFINE_HULL]);
1665  (SET_TAC[]);
1666  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1667
1668  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
1669  (EXISTS_TAC `v2:real^3`);
1670  (ONCE_REWRITE_TAC[SET_RULE ` {v0, v1, v3, v2} =  {v0, v1, v2, v3}`]);
1671  (REWRITE_TAC[coplanar] THEN STRIP_TAC);
1672  (NEW_GOAL `affine hull {v0, v1, v2, v3:real^3} SUBSET 
1673              affine hull (affine hull {u, v, w})`);
1674  (ASM_SIMP_TAC[Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA]);
1675  (UP_ASM_TAC THEN REWRITE_WITH `affine hull (affine hull {u, v, w}) = 
1676                                  affine hull {u:real^3, v, w}`);
1677  (REWRITE_TAC[AFFINE_HULL_EQ; AFFINE_AFFINE_HULL]);
1678  (STRIP_TAC);
1679  (NEW_GOAL `NULLSET X`);
1680  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1681  (EXISTS_TAC `affine hull {v0, v1, v2,v3:real^3}`);
1682  (STRIP_TAC);
1683  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1684  (EXISTS_TAC `affine hull {u,v,w:real^3}`);
1685  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
1686  (ASM_REWRITE_TAC[]);
1687  (REWRITE_TAC[ASSUME `k = 4`; ASSUME `X = mcell k V ul'`]);
1688  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
1689  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
1690  (REWRITE_TAC[mcell4]);
1691  (COND_CASES_TAC);
1692  (ASM_REWRITE_TAC[set_of_list; CONVEX_HULL_SUBSET_AFFINE_HULL]);
1693  (SET_TAC[]);
1694  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1695
1696  (ASM_REWRITE_TAC[]);
1697  (REWRITE_TAC[GSYM (ASSUME `u0 = v0:real^3`); GSYM (ASSUME `u3 = v1:real^3`)]);
1698  (EXPAND_TAC "y1" THEN EXPAND_TAC "y2" THEN EXPAND_TAC "y3");
1699  (EXPAND_TAC "y4" THEN EXPAND_TAC "y5" THEN EXPAND_TAC "y6");
1700  (REWRITE_TAC[Nonlinear_lemma.dih_y_sym; Nonlinear_lemma.dih_y_sym2;
1701                DIST_SYM]);
1702
1703  (GMATCH_SIMP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] DIHV_EQ_DIH_Y));
1704  (STRIP_TAC);
1705  (STRIP_TAC);
1706  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
1707  (EXISTS_TAC `v3:real^3`);
1708  (REWRITE_TAC[coplanar] THEN STRIP_TAC);
1709  (NEW_GOAL `affine hull {v0, v1, v2, v3:real^3} SUBSET 
1710              affine hull (affine hull {u, v, w})`);
1711  (ASM_SIMP_TAC[Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA]);
1712  (UP_ASM_TAC THEN REWRITE_WITH `affine hull (affine hull {u, v, w}) = 
1713                                  affine hull {u:real^3, v, w}`);
1714  (REWRITE_TAC[AFFINE_HULL_EQ; AFFINE_AFFINE_HULL]);
1715  (STRIP_TAC);
1716  (NEW_GOAL `NULLSET X`);
1717  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1718  (EXISTS_TAC `affine hull {v0, v1, v2,v3:real^3}`);
1719  (STRIP_TAC);
1720  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1721  (EXISTS_TAC `affine hull {u,v,w:real^3}`);
1722  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
1723  (ASM_REWRITE_TAC[]);
1724  (REWRITE_TAC[ASSUME `k = 4`; ASSUME `X = mcell k V ul'`]);
1725  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
1726  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
1727  (REWRITE_TAC[mcell4]);
1728  (COND_CASES_TAC);
1729  (ASM_REWRITE_TAC[set_of_list; CONVEX_HULL_SUBSET_AFFINE_HULL]);
1730  (SET_TAC[]);
1731  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1732
1733  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
1734  (EXISTS_TAC `v2:real^3`);
1735  (ONCE_REWRITE_TAC[SET_RULE ` {v0, v1, v3, v2} =  {v0, v1, v2, v3}`]);
1736  (REWRITE_TAC[coplanar] THEN STRIP_TAC);
1737  (NEW_GOAL `affine hull {v0, v1, v2, v3:real^3} SUBSET 
1738              affine hull (affine hull {u, v, w})`);
1739  (ASM_SIMP_TAC[Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA]);
1740  (UP_ASM_TAC THEN REWRITE_WITH `affine hull (affine hull {u, v, w}) = 
1741                                  affine hull {u:real^3, v, w}`);
1742  (REWRITE_TAC[AFFINE_HULL_EQ; AFFINE_AFFINE_HULL]);
1743  (STRIP_TAC);
1744  (NEW_GOAL `NULLSET X`);
1745  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1746  (EXISTS_TAC `affine hull {v0, v1, v2,v3:real^3}`);
1747  (STRIP_TAC);
1748  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1749  (EXISTS_TAC `affine hull {u,v,w:real^3}`);
1750  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
1751  (ASM_REWRITE_TAC[]);
1752  (REWRITE_TAC[ASSUME `k = 4`; ASSUME `X = mcell k V ul'`]);
1753  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
1754  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
1755  (REWRITE_TAC[mcell4]);
1756  (COND_CASES_TAC);
1757  (ASM_REWRITE_TAC[set_of_list; CONVEX_HULL_SUBSET_AFFINE_HULL]);
1758  (SET_TAC[]);
1759  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1760
1761  (ASM_REWRITE_TAC[]);
1762  (REWRITE_TAC[GSYM (ASSUME `u0 = v0:real^3`); GSYM (ASSUME `u3 = v1:real^3`)]);
1763  (EXPAND_TAC "y1" THEN EXPAND_TAC "y2" THEN EXPAND_TAC "y3");
1764  (EXPAND_TAC "y4" THEN EXPAND_TAC "y5" THEN EXPAND_TAC "y6");
1765  (REWRITE_TAC[Nonlinear_lemma.dih_y_sym; Nonlinear_lemma.dih_y_sym2;
1766                DIST_SYM]);
1767  (NEW_GOAL `F`);
1768  (ASM_ARITH_TAC);
1769  (UP_ASM_TAC THEN MESON_TAC[]);
1770
1771  (NEW_GOAL `F`);
1772  (NEW_GOAL `V INTER (X:real^3->bool) = set_of_list (truncate_simplex (4 - 1) ul)`);
1773  (REWRITE_TAC[ASSUME `X = mcell i V ul`]);
1774  (REWRITE_WITH `mcell i V ul = mcell 4 V ul`);
1775  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT; ASSUME `i >= 4`]);
1776  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
1777  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 4 /\ 4 <= 4`]);
1778  (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
1779  (ASM_REWRITE_TAC[]);
1780  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT; ASSUME `i >= 4`]);
1781  (ASM_REWRITE_TAC[]);
1782  (UP_ASM_TAC THEN REWRITE_TAC[ARITH_RULE `4 - 1 = 3`; 
1783    ASSUME `ul = [u0;u1;u2;u3:real^3]`; TRUNCATE_SIMPLEX_EXPLICIT_3]);
1784  (REWRITE_TAC[GSYM (ASSUME `ul = [u0; u1; u2; u3:real^3]`)]);
1785  (ASM_CASES_TAC `k = 1`);
1786
1787  (REWRITE_WITH `V INTER (X:real^3->bool) = 
1788                  set_of_list (truncate_simplex (k - 1) ul')`);
1789  (REWRITE_TAC[ASSUME `X = mcell k V ul'`]);
1790  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
1791  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 1 /\ 1 <= 4`]);
1792  (REWRITE_WITH `mcell 1 V ul' = X`);
1793  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 1`]);
1794  (ASM_REWRITE_TAC[]);
1795  (REWRITE_TAC[ARITH_RULE `1 - 1 = 0`; ASSUME `k = 1`]);
1796  (REWRITE_WITH `truncate_simplex 0 (ul':(real^3)list) = [HD ul']`);
1797  (MATCH_MP_TAC Packing3.TRUNCATE_0_EQ_HEAD);
1798  (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1`);
1799  (MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA);
1800  (EXISTS_TAC `V:real^3->bool`);
1801  (ASM_REWRITE_TAC[]);
1802  (ARITH_TAC);
1803
1804  (STRIP_TAC);
1805  (NEW_GOAL `CARD (set_of_list [(HD ul'):real^3]) = 
1806              CARD (set_of_list (ul:(real^3)list))`);
1807  (AP_TERM_TAC THEN ASM_REWRITE_TAC[]);
1808  (UP_ASM_TAC THEN REWRITE_WITH `CARD (set_of_list (ul:(real^3)list)) = 3 + 1`);
1809  (MATCH_MP_TAC Marchal_cells_3.BARV_CARD_LEMMA);
1810  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1811  (REWRITE_TAC[set_of_list; Geomdetail.CARD_SING] THEN ARITH_TAC);
1812  (NEW_GOAL `k = 0`);
1813  (ASM_ARITH_TAC);
1814
1815  (REWRITE_WITH `V INTER X = {}:real^3->bool`);
1816  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 0`]);
1817  (MATCH_MP_TAC Lepjbdj.LEPJBDJ_0);
1818  (ASM_REWRITE_TAC[]);
1819  (ASM_REWRITE_TAC[set_of_list]);
1820  (NEW_GOAL `u0 IN {u0,u1,u2,u3:real^3}`);
1821  (SET_TAC[]);
1822  (UP_ASM_TAC THEN SET_TAC[]);
1823  (UP_ASM_TAC THEN MESON_TAC[]);
1824
1825 (* ========================================================================= *)
1826
1827  (REWRITE_TAC[dihX]);
1828
1829  (COND_CASES_TAC);
1830  (NEW_GOAL `F`);
1831  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1832  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1833
1834  (LET_TAC);
1835  (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
1836  (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
1837            ul IN barV V 3 /\
1838            X = mcell k V ul /\
1839            initial_sublist [u2; u3] ul)`);
1840  (STRIP_TAC);
1841  (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
1842  (MATCH_MP_TAC SELECT_AX);
1843
1844  (ABBREV_TAC `wl = [u2;u3;u0;u1:real^3]`);
1845
1846   (* Need to list properties of wl at this point *)
1847  (NEW_GOAL `?p. p permutes 0..3 /\
1848                   wl:(real^3)list = left_action_list p ul`);
1849  (ASM_REWRITE_TAC[] THEN EXPAND_TAC "wl");
1850  (MATCH_MP_TAC Marchal_cells_3.LEFT_ACTION_LIST_3_EXISTS);
1851  (STRIP_TAC);
1852  (REWRITE_TAC[GSYM set_of_list; GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`)]);
1853  (REWRITE_TAC[ARITH_RULE `4 = 3 + 1`]);
1854  (MATCH_MP_TAC Marchal_cells_3.BARV_CARD_LEMMA);
1855  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1856  (SET_TAC[]);
1857  (UP_ASM_TAC THEN STRIP_TAC);
1858  (NEW_GOAL `barV V 3 wl`);
1859  (MATCH_MP_TAC Qzksykg.QZKSYKG1);
1860  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `4` THEN EXISTS_TAC `p:num->num`);
1861  (ASM_REWRITE_TAC[SET_RULE `4 IN {0,1,2,3,4}`; ARITH_RULE `4 - 1 = 3`]);
1862  (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
1863  (ASM_REWRITE_TAC[]);
1864  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT; ASSUME `i >= 4`]);
1865  (ASM_REWRITE_TAC[]);
1866
1867  (EXISTS_TAC `(4, wl:(real^3)list)`);
1868  (EXPAND_TAC "P");
1869  (REWRITE_TAC[BETA_THM]);
1870  (ASM_REWRITE_TAC[IN; ARITH_RULE `4 <= 4`]);
1871  (STRIP_TAC);
1872
1873  (REWRITE_WITH `mcell i V [u0; u1; u2; u3] = mcell 4 V [u0; u1; u2; u3]`);
1874  (MESON_TAC[MCELL_EXPLICIT; ASSUME `i >= 4`; ARITH_RULE `4 >= 4`]);
1875  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1876  (MATCH_MP_TAC Rvfxzbu.RVFXZBU);
1877  (ASM_REWRITE_TAC[SET_RULE `4 IN {0,1,2,3,4}`; ARITH_RULE `4 - 1 = 3`]);
1878  (REWRITE_TAC[GSYM (ASSUME `ul = [u0; u1; u2; u3:real^3]`)]);
1879  (ASM_REWRITE_TAC[]);
1880  (REWRITE_TAC[GSYM (ASSUME `ul = [u0; u1; u2; u3:real^3]`)]);
1881  (REWRITE_TAC[GSYM (ASSUME `wl:(real^3)list = left_action_list p ul`)]);
1882  (EXPAND_TAC "wl");
1883  (REWRITE_WITH `[u2; u3; u0; u1] = APPEND [u2; u3] [u0; u1:real^3]`);
1884  (REWRITE_TAC[APPEND]);
1885  (REWRITE_TAC[Packing3.INITIAL_SUBLIST_APPEND]);
1886
1887  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1888  (EXPAND_TAC "P" THEN REWRITE_TAC[IN]);
1889
1890  (REPEAT STRIP_TAC);
1891  (ASM_CASES_TAC `2 <= k`);
1892  (NEW_GOAL `k = 4`);
1893  (NEW_GOAL `4 = k /\
1894              (!t. 4 - 1 <= t /\ t <= 3
1895                   ==> omega_list_n V ul t = omega_list_n V ul' t)`);
1896  (MATCH_MP_TAC Marchal_cells_3.MCELL_ID_OMEGA_LIST_N);
1897  (ASM_REWRITE_TAC[SET_RULE `x IN {2,3,4} <=> x=2\/x=3\/x=4`]);
1898  (REWRITE_TAC[GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`)]);
1899  (REWRITE_WITH `mcell 4 V ul = X`);
1900  (REWRITE_TAC[ASSUME `X = mcell i V ul`]);
1901  (MESON_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ASSUME `i >= 4`]);
1902  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `~NULLSET X`]);
1903  (ASM_ARITH_TAC);
1904  (ASM_REWRITE_TAC[]);
1905  (COND_CASES_TAC);
1906  (NEW_GOAL `F`);
1907  (ASM_ARITH_TAC);
1908  (UP_ASM_TAC THEN MESON_TAC[]);
1909  (COND_CASES_TAC);
1910  (NEW_GOAL `F`);
1911  (ASM_ARITH_TAC);
1912  (UP_ASM_TAC THEN MESON_TAC[]);
1913  (COND_CASES_TAC);
1914  (REWRITE_TAC[dihu4]);
1915  (NEW_GOAL `?v0 v1 v2 v3. ul' = [v0;v1;v2;v3:real^3]`);
1916  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
1917  (EXISTS_TAC `V:real^3->bool`);
1918  (ASM_REWRITE_TAC[]);
1919  (UP_ASM_TAC THEN STRIP_TAC);
1920
1921  (NEW_GOAL `u2 = v0:real^3`);
1922  (NEW_GOAL`u2 = HD [u2;u3:real^3]`);
1923  (REWRITE_TAC[HD]);
1924  (ONCE_REWRITE_TAC[ASSUME `u2 = HD[u2;u3:real^3]`]);
1925  (REWRITE_WITH `v0:real^3 = HD ul'`);
1926  (ASM_REWRITE_TAC[HD]);
1927  (REWRITE_WITH `[u2;u3:real^3] = truncate_simplex 1 ul'`);
1928  (NEW_GOAL `[u2;u3:real^3] = truncate_simplex (LENGTH [u2;u3] - 1) ul' /\
1929                   LENGTH [u2;u3] <= LENGTH ul'`);
1930  (MATCH_MP_TAC Packing3.INITIAL_SUBLIST_IMP_TRUNCATE_SIMPLEX);
1931  (ASM_REWRITE_TAC[LENGTH]);
1932  (ARITH_TAC);
1933  (UP_ASM_TAC THEN REWRITE_TAC[LENGTH; ARITH_RULE `SUC(SUC(0)) - 1 = 1`]);
1934  (MESON_TAC[]);
1935  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1936  (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1`);
1937  (MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA);
1938  (EXISTS_TAC `V:real^3->bool`);
1939  (ASM_REWRITE_TAC[]);
1940  (ARITH_TAC);
1941
1942  (NEW_GOAL `u3 = v1:real^3`);
1943  (NEW_GOAL`u3 = EL 1 [u2;u3:real^3]`);
1944  (REWRITE_TAC[EL; ARITH_RULE `1 = SUC 0`; TL; HD]);
1945  (ONCE_REWRITE_TAC[ASSUME `u3 = EL 1 [u2;u3:real^3]`]);
1946
1947  (REWRITE_WITH `v1:real^3 = EL 1 ul'`);
1948  (ASM_REWRITE_TAC[EL; ARITH_RULE `1 = SUC 0`; TL; HD]);
1949  (REWRITE_WITH `[u2;u3:real^3] = truncate_simplex 1 ul'`);
1950  (NEW_GOAL `[u2;u3:real^3] = truncate_simplex (LENGTH [u2;u3] - 1) ul' /\
1951                   LENGTH [u2;u3] <= LENGTH ul'`);
1952  (MATCH_MP_TAC Packing3.INITIAL_SUBLIST_IMP_TRUNCATE_SIMPLEX);
1953  (ASM_REWRITE_TAC[LENGTH]);
1954  (ARITH_TAC);
1955  (UP_ASM_TAC THEN REWRITE_TAC[LENGTH; ARITH_RULE `SUC(SUC(0)) - 1 = 1`]);
1956  (MESON_TAC[]);
1957  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
1958  (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1`);
1959  (MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA);
1960  (EXISTS_TAC `V:real^3->bool`);
1961  (ASM_REWRITE_TAC[]);
1962  (ARITH_TAC);
1963
1964  (NEW_GOAL `{u0,u1,u2,u3:real^3} = {v0,v1,v2,v3}`);
1965  (NEW_GOAL `{u0,u1,u2,u3:real^3} = {v0,v1,v2,v3} <=> 
1966    convex hull {u0,u1,u2,u3:real^3} = convex hull {v0,v1,v2,v3}`);
1967  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1968  (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);
1969  (REWRITE_TAC[GSYM set_of_list; GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`); 
1970    GSYM (ASSUME `ul' = [v0;v1;v2;v3:real^3]`)]);
1971  (STRIP_TAC);
1972  (MATCH_MP_TAC Rogers.BARV_AFFINE_INDEPENDENT);
1973  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
1974  (MATCH_MP_TAC Rogers.BARV_AFFINE_INDEPENDENT);
1975  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
1976  (ONCE_REWRITE_TAC[ASSUME `{u0, u1, u2, u3:real^3} = {v0, v1, v2, v3} <=>
1977       convex hull {u0, u1, u2, u3} = convex hull {v0, v1, v2, v3}`]);
1978  (REWRITE_TAC[GSYM set_of_list; GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`); 
1979    GSYM (ASSUME `ul' = [v0;v1;v2;v3:real^3]`)]);
1980  (REWRITE_WITH `convex hull set_of_list ul= X:real^3->bool`);
1981  (REWRITE_TAC[ASSUME `X = mcell i V ul`]);
1982  (REWRITE_WITH `mcell i V ul = mcell4 V ul`);
1983  (MESON_TAC[ASSUME `i >= 4`; MCELL_EXPLICIT]);
1984  (REWRITE_TAC[mcell4]);
1985  (COND_CASES_TAC);
1986  (REFL_TAC);
1987  (NEW_GOAL `F`);
1988  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1989  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
1990
1991  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 4`]);
1992  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
1993  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
1994  (REWRITE_TAC[mcell4]);
1995  (COND_CASES_TAC);
1996  (REFL_TAC);
1997  (NEW_GOAL `F`);
1998  (NEW_GOAL `X:real^3->bool = {}`);
1999  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 4`]);
2000  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
2001  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
2002  (REWRITE_TAC[mcell4]);
2003  (COND_CASES_TAC);
2004  (NEW_GOAL `F`);
2005  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2006  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2007  (REFL_TAC);
2008  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2009  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2010
2011  (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
2012
2013  (NEW_GOAL `(v2 = u0 /\ v3 = u1:real^3) \/ (v2 = u1 /\ v3 = u0)`);
2014  (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1) /\ ~(u0 = u2) /\ ~(u0 = u3) /\
2015       ~(u1 = u2) /\ ~(u1 = u3) /\ ~(u2 = u3:real^3)`);
2016  (ASM_REWRITE_TAC[]);
2017  (SET_TAC[]);
2018  (UP_ASM_TAC THEN STRIP_TAC);
2019
2020  (GMATCH_SIMP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] DIHV_EQ_DIH_Y));
2021  (STRIP_TAC);
2022  (STRIP_TAC);
2023  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
2024  (EXISTS_TAC `v3:real^3`);
2025  (REWRITE_TAC[coplanar] THEN STRIP_TAC);
2026  (NEW_GOAL `affine hull {v0, v1, v2, v3:real^3} SUBSET 
2027              affine hull (affine hull {u, v, w})`);
2028  (ASM_SIMP_TAC[Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA]);
2029  (UP_ASM_TAC THEN REWRITE_WITH `affine hull (affine hull {u, v, w}) = 
2030                                  affine hull {u:real^3, v, w}`);
2031  (REWRITE_TAC[AFFINE_HULL_EQ; AFFINE_AFFINE_HULL]);
2032  (STRIP_TAC);
2033  (NEW_GOAL `NULLSET X`);
2034  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2035  (EXISTS_TAC `affine hull {v0, v1, v2,v3:real^3}`);
2036  (STRIP_TAC);
2037  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2038  (EXISTS_TAC `affine hull {u,v,w:real^3}`);
2039  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
2040  (ASM_REWRITE_TAC[]);
2041  (REWRITE_TAC[ASSUME `k = 4`; ASSUME `X = mcell k V ul'`]);
2042  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
2043  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
2044  (REWRITE_TAC[mcell4]);
2045  (COND_CASES_TAC);
2046  (ASM_REWRITE_TAC[set_of_list; CONVEX_HULL_SUBSET_AFFINE_HULL]);
2047  (SET_TAC[]);
2048  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2049
2050  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
2051  (EXISTS_TAC `v2:real^3`);
2052  (ONCE_REWRITE_TAC[SET_RULE ` {v0, v1, v3, v2} =  {v0, v1, v2, v3}`]);
2053  (REWRITE_TAC[coplanar] THEN STRIP_TAC);
2054  (NEW_GOAL `affine hull {v0, v1, v2, v3:real^3} SUBSET 
2055              affine hull (affine hull {u, v, w})`);
2056  (ASM_SIMP_TAC[Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA]);
2057  (UP_ASM_TAC THEN REWRITE_WITH `affine hull (affine hull {u, v, w}) = 
2058                                  affine hull {u:real^3, v, w}`);
2059  (REWRITE_TAC[AFFINE_HULL_EQ; AFFINE_AFFINE_HULL]);
2060  (STRIP_TAC);
2061  (NEW_GOAL `NULLSET X`);
2062  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2063  (EXISTS_TAC `affine hull {v0, v1, v2,v3:real^3}`);
2064  (STRIP_TAC);
2065  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2066  (EXISTS_TAC `affine hull {u,v,w:real^3}`);
2067  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
2068  (ASM_REWRITE_TAC[]);
2069  (REWRITE_TAC[ASSUME `k = 4`; ASSUME `X = mcell k V ul'`]);
2070  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
2071  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
2072  (REWRITE_TAC[mcell4]);
2073  (COND_CASES_TAC);
2074  (ASM_REWRITE_TAC[set_of_list; CONVEX_HULL_SUBSET_AFFINE_HULL]);
2075  (SET_TAC[]);
2076  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2077
2078  (ASM_REWRITE_TAC[]);
2079  (REWRITE_TAC[GSYM (ASSUME `u2 = v0:real^3`); GSYM (ASSUME `u3 = v1:real^3`)]);
2080  (EXPAND_TAC "y1" THEN EXPAND_TAC "y2" THEN EXPAND_TAC "y3");
2081  (EXPAND_TAC "y4" THEN EXPAND_TAC "y5" THEN EXPAND_TAC "y6");
2082  (REWRITE_TAC[DIST_SYM]);
2083  (REWRITE_WITH 
2084  `dih_y (dist (u2,u3)) (dist (u0,u2)) (dist (u1,u2)) (dist (u0,u1))
2085  (dist (u1,u3:real^3))
2086  (dist (u0,u3)) =
2087   dih_y (dist (u2,u3)) (dist (u1,u2)) (dist (u0,u2)) (dist (u0,u1))
2088  (dist (u0,u3)) 
2089  (dist (u1,u3:real^3))`);
2090  (REWRITE_TAC[Nonlinear_lemma.dih_y_sym]);
2091  (REWRITE_TAC[Nonlinear_lemma.dih_y_sym2]);
2092
2093  (GMATCH_SIMP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] DIHV_EQ_DIH_Y));
2094  (STRIP_TAC);
2095  (STRIP_TAC);
2096  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
2097  (EXISTS_TAC `v3:real^3`);
2098  (REWRITE_TAC[coplanar] THEN STRIP_TAC);
2099  (NEW_GOAL `affine hull {v0, v1, v2, v3:real^3} SUBSET 
2100              affine hull (affine hull {u, v, w})`);
2101  (ASM_SIMP_TAC[Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA]);
2102  (UP_ASM_TAC THEN REWRITE_WITH `affine hull (affine hull {u, v, w}) = 
2103                                  affine hull {u:real^3, v, w}`);
2104  (REWRITE_TAC[AFFINE_HULL_EQ; AFFINE_AFFINE_HULL]);
2105  (STRIP_TAC);
2106  (NEW_GOAL `NULLSET X`);
2107  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2108  (EXISTS_TAC `affine hull {v0, v1, v2,v3:real^3}`);
2109  (STRIP_TAC);
2110  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2111  (EXISTS_TAC `affine hull {u,v,w:real^3}`);
2112  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
2113  (ASM_REWRITE_TAC[]);
2114  (REWRITE_TAC[ASSUME `k = 4`; ASSUME `X = mcell k V ul'`]);
2115  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
2116  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
2117  (REWRITE_TAC[mcell4]);
2118  (COND_CASES_TAC);
2119  (ASM_REWRITE_TAC[set_of_list; CONVEX_HULL_SUBSET_AFFINE_HULL]);
2120  (SET_TAC[]);
2121  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2122
2123  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
2124  (EXISTS_TAC `v2:real^3`);
2125  (ONCE_REWRITE_TAC[SET_RULE ` {v0, v1, v3, v2} =  {v0, v1, v2, v3}`]);
2126  (REWRITE_TAC[coplanar] THEN STRIP_TAC);
2127  (NEW_GOAL `affine hull {v0, v1, v2, v3:real^3} SUBSET 
2128              affine hull (affine hull {u, v, w})`);
2129  (ASM_SIMP_TAC[Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA]);
2130  (UP_ASM_TAC THEN REWRITE_WITH `affine hull (affine hull {u, v, w}) = 
2131                                  affine hull {u:real^3, v, w}`);
2132  (REWRITE_TAC[AFFINE_HULL_EQ; AFFINE_AFFINE_HULL]);
2133  (STRIP_TAC);
2134  (NEW_GOAL `NULLSET X`);
2135  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2136  (EXISTS_TAC `affine hull {v0, v1, v2,v3:real^3}`);
2137  (STRIP_TAC);
2138  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2139  (EXISTS_TAC `affine hull {u,v,w:real^3}`);
2140  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
2141  (ASM_REWRITE_TAC[]);
2142  (REWRITE_TAC[ASSUME `k = 4`; ASSUME `X = mcell k V ul'`]);
2143  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
2144  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
2145  (REWRITE_TAC[mcell4]);
2146  (COND_CASES_TAC);
2147  (ASM_REWRITE_TAC[set_of_list; CONVEX_HULL_SUBSET_AFFINE_HULL]);
2148  (SET_TAC[]);
2149  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2150
2151  (ASM_REWRITE_TAC[]);
2152  (REWRITE_TAC[GSYM (ASSUME `u2 = v0:real^3`); GSYM (ASSUME `u3 = v1:real^3`)]);
2153  (EXPAND_TAC "y1" THEN EXPAND_TAC "y2" THEN EXPAND_TAC "y3");
2154  (EXPAND_TAC "y4" THEN EXPAND_TAC "y5" THEN EXPAND_TAC "y6");
2155  (REWRITE_TAC[DIST_SYM]);
2156  (REWRITE_WITH 
2157  `dih_y (dist (u2,u3)) (dist (u0,u2)) (dist (u1,u2)) (dist (u0,u1))
2158  (dist (u1,u3))
2159  (dist (u0,u3:real^3)) =
2160   dih_y (dist (u2,u3)) (dist (u1,u2)) (dist (u0,u2)) (dist (u0,u1))
2161  (dist (u0,u3))
2162  (dist (u1,u3))`);
2163  (REWRITE_TAC[Nonlinear_lemma.dih_y_sym]);
2164  (REWRITE_TAC[Nonlinear_lemma.dih_y_sym2]);
2165
2166  (NEW_GOAL `F`);
2167  (ASM_ARITH_TAC);
2168  (UP_ASM_TAC THEN MESON_TAC[]);
2169
2170  (NEW_GOAL `F`);
2171  (NEW_GOAL `V INTER (X:real^3->bool) = set_of_list (truncate_simplex (4 - 1) ul)`);
2172  (REWRITE_TAC[ASSUME `X = mcell i V ul`]);
2173  (REWRITE_WITH `mcell i V ul = mcell 4 V ul`);
2174  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT; ASSUME `i >= 4`]);
2175  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
2176  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 4 /\ 4 <= 4`]);
2177  (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
2178  (ASM_REWRITE_TAC[]);
2179  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT; ASSUME `i >= 4`]);
2180  (ASM_REWRITE_TAC[]);
2181  (UP_ASM_TAC THEN REWRITE_TAC[ARITH_RULE `4 - 1 = 3`; 
2182    ASSUME `ul = [u0;u1;u2;u3:real^3]`; TRUNCATE_SIMPLEX_EXPLICIT_3]);
2183  (REWRITE_TAC[GSYM (ASSUME `ul = [u0; u1; u2; u3:real^3]`)]);
2184  (ASM_CASES_TAC `k = 1`);
2185
2186  (REWRITE_WITH `V INTER (X:real^3->bool) = 
2187                  set_of_list (truncate_simplex (k - 1) ul')`);
2188  (REWRITE_TAC[ASSUME `X = mcell k V ul'`]);
2189  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
2190  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 1 /\ 1 <= 4`]);
2191  (REWRITE_WITH `mcell 1 V ul' = X`);
2192  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 1`]);
2193  (ASM_REWRITE_TAC[]);
2194  (REWRITE_TAC[ARITH_RULE `1 - 1 = 0`; ASSUME `k = 1`]);
2195  (REWRITE_WITH `truncate_simplex 0 (ul':(real^3)list) = [HD ul']`);
2196  (MATCH_MP_TAC Packing3.TRUNCATE_0_EQ_HEAD);
2197  (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1`);
2198  (MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA);
2199  (EXISTS_TAC `V:real^3->bool`);
2200  (ASM_REWRITE_TAC[]);
2201  (ARITH_TAC);
2202
2203  (STRIP_TAC);
2204  (NEW_GOAL `CARD (set_of_list [(HD ul'):real^3]) = 
2205              CARD (set_of_list (ul:(real^3)list))`);
2206  (AP_TERM_TAC THEN ASM_REWRITE_TAC[]);
2207  (UP_ASM_TAC THEN REWRITE_WITH `CARD (set_of_list (ul:(real^3)list)) = 3 + 1`);
2208  (MATCH_MP_TAC Marchal_cells_3.BARV_CARD_LEMMA);
2209  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2210  (REWRITE_TAC[set_of_list; Geomdetail.CARD_SING] THEN ARITH_TAC);
2211  (NEW_GOAL `k = 0`);
2212  (ASM_ARITH_TAC);
2213
2214  (REWRITE_WITH `V INTER X = {}:real^3->bool`);
2215  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 0`]);
2216  (MATCH_MP_TAC Lepjbdj.LEPJBDJ_0);
2217  (ASM_REWRITE_TAC[]);
2218  (ASM_REWRITE_TAC[set_of_list]);
2219  (NEW_GOAL `u0 IN {u0,u1,u2,u3:real^3}`);
2220  (SET_TAC[]);
2221  (UP_ASM_TAC THEN SET_TAC[]);
2222  (UP_ASM_TAC THEN MESON_TAC[]);
2223
2224 (* ========================================================================= *)
2225
2226  (REWRITE_TAC[dihX]);
2227
2228  (COND_CASES_TAC);
2229  (NEW_GOAL `F`);
2230  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2231  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2232
2233  (LET_TAC);
2234  (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
2235  (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
2236            ul IN barV V 3 /\
2237            X = mcell k V ul /\
2238            initial_sublist [u1; u3] ul)`);
2239  (STRIP_TAC);
2240  (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
2241  (MATCH_MP_TAC SELECT_AX);
2242
2243  (ABBREV_TAC `wl = [u1;u3;u0;u2:real^3]`);
2244
2245   (* Need to list properties of wl at this point *)
2246  (NEW_GOAL `?p. p permutes 0..3 /\
2247                   wl:(real^3)list = left_action_list p ul`);
2248  (ASM_REWRITE_TAC[] THEN EXPAND_TAC "wl");
2249  (MATCH_MP_TAC Marchal_cells_3.LEFT_ACTION_LIST_3_EXISTS);
2250  (STRIP_TAC);
2251  (REWRITE_TAC[GSYM set_of_list; GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`)]);
2252  (REWRITE_TAC[ARITH_RULE `4 = 3 + 1`]);
2253  (MATCH_MP_TAC Marchal_cells_3.BARV_CARD_LEMMA);
2254  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2255  (SET_TAC[]);
2256  (UP_ASM_TAC THEN STRIP_TAC);
2257  (NEW_GOAL `barV V 3 wl`);
2258  (MATCH_MP_TAC Qzksykg.QZKSYKG1);
2259  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `4` THEN EXISTS_TAC `p:num->num`);
2260  (ASM_REWRITE_TAC[SET_RULE `4 IN {0,1,2,3,4}`; ARITH_RULE `4 - 1 = 3`]);
2261  (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
2262  (ASM_REWRITE_TAC[]);
2263  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT; ASSUME `i >= 4`]);
2264  (ASM_REWRITE_TAC[]);
2265
2266  (EXISTS_TAC `(4, wl:(real^3)list)`);
2267  (EXPAND_TAC "P");
2268  (REWRITE_TAC[BETA_THM]);
2269  (ASM_REWRITE_TAC[IN; ARITH_RULE `4 <= 4`]);
2270  (STRIP_TAC);
2271
2272  (REWRITE_WITH `mcell i V [u0; u1; u2; u3] = mcell 4 V [u0; u1; u2; u3]`);
2273  (MESON_TAC[MCELL_EXPLICIT; ASSUME `i >= 4`; ARITH_RULE `4 >= 4`]);
2274  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2275  (MATCH_MP_TAC Rvfxzbu.RVFXZBU);
2276  (ASM_REWRITE_TAC[SET_RULE `4 IN {0,1,2,3,4}`; ARITH_RULE `4 - 1 = 3`]);
2277  (REWRITE_TAC[GSYM (ASSUME `ul = [u0; u1; u2; u3:real^3]`)]);
2278  (ASM_REWRITE_TAC[]);
2279  (REWRITE_TAC[GSYM (ASSUME `ul = [u0; u1; u2; u3:real^3]`)]);
2280  (REWRITE_TAC[GSYM (ASSUME `wl:(real^3)list = left_action_list p ul`)]);
2281  (EXPAND_TAC "wl");
2282  (REWRITE_WITH `[u1; u3; u0; u2] = APPEND [u1; u3] [u0; u2:real^3]`);
2283  (REWRITE_TAC[APPEND]);
2284  (REWRITE_TAC[Packing3.INITIAL_SUBLIST_APPEND]);
2285
2286  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2287  (EXPAND_TAC "P" THEN REWRITE_TAC[IN]);
2288
2289  (REPEAT STRIP_TAC);
2290  (ASM_CASES_TAC `2 <= k`);
2291  (NEW_GOAL `k = 4`);
2292  (NEW_GOAL `4 = k /\
2293              (!t. 4 - 1 <= t /\ t <= 3
2294                   ==> omega_list_n V ul t = omega_list_n V ul' t)`);
2295  (MATCH_MP_TAC Marchal_cells_3.MCELL_ID_OMEGA_LIST_N);
2296  (ASM_REWRITE_TAC[SET_RULE `x IN {2,3,4} <=> x=2\/x=3\/x=4`]);
2297  (REWRITE_TAC[GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`)]);
2298  (REWRITE_WITH `mcell 4 V ul = X`);
2299  (REWRITE_TAC[ASSUME `X = mcell i V ul`]);
2300  (MESON_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ASSUME `i >= 4`]);
2301  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `~NULLSET X`]);
2302  (ASM_ARITH_TAC);
2303  (ASM_REWRITE_TAC[]);
2304  (COND_CASES_TAC);
2305  (NEW_GOAL `F`);
2306  (ASM_ARITH_TAC);
2307  (UP_ASM_TAC THEN MESON_TAC[]);
2308  (COND_CASES_TAC);
2309  (NEW_GOAL `F`);
2310  (ASM_ARITH_TAC);
2311  (UP_ASM_TAC THEN MESON_TAC[]);
2312  (COND_CASES_TAC);
2313  (REWRITE_TAC[dihu4]);
2314  (NEW_GOAL `?v0 v1 v2 v3. ul' = [v0;v1;v2;v3:real^3]`);
2315  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
2316  (EXISTS_TAC `V:real^3->bool`);
2317  (ASM_REWRITE_TAC[]);
2318  (UP_ASM_TAC THEN STRIP_TAC);
2319
2320  (NEW_GOAL `u1 = v0:real^3`);
2321  (NEW_GOAL`u1 = HD [u1;u3:real^3]`);
2322  (REWRITE_TAC[HD]);
2323  (ONCE_REWRITE_TAC[ASSUME `u1 = HD[u1;u3:real^3]`]);
2324  (REWRITE_WITH `v0:real^3 = HD ul'`);
2325  (ASM_REWRITE_TAC[HD]);
2326  (REWRITE_WITH `[u1;u3:real^3] = truncate_simplex 1 ul'`);
2327  (NEW_GOAL `[u1;u3:real^3] = truncate_simplex (LENGTH [u1;u3] - 1) ul' /\
2328                   LENGTH [u1;u3] <= LENGTH ul'`);
2329  (MATCH_MP_TAC Packing3.INITIAL_SUBLIST_IMP_TRUNCATE_SIMPLEX);
2330  (ASM_REWRITE_TAC[LENGTH]);
2331  (ARITH_TAC);
2332  (UP_ASM_TAC THEN REWRITE_TAC[LENGTH; ARITH_RULE `SUC(SUC(0)) - 1 = 1`]);
2333  (MESON_TAC[]);
2334  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2335  (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1`);
2336  (MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA);
2337  (EXISTS_TAC `V:real^3->bool`);
2338  (ASM_REWRITE_TAC[]);
2339  (ARITH_TAC);
2340
2341  (NEW_GOAL `u3 = v1:real^3`);
2342  (NEW_GOAL`u3 = EL 1 [u1;u3:real^3]`);
2343  (REWRITE_TAC[EL; ARITH_RULE `1 = SUC 0`; TL; HD]);
2344  (ONCE_REWRITE_TAC[ASSUME `u3 = EL 1 [u1;u3:real^3]`]);
2345
2346  (REWRITE_WITH `v1:real^3 = EL 1 ul'`);
2347  (ASM_REWRITE_TAC[EL; ARITH_RULE `1 = SUC 0`; TL; HD]);
2348  (REWRITE_WITH `[u1;u3:real^3] = truncate_simplex 1 ul'`);
2349  (NEW_GOAL `[u1;u3:real^3] = truncate_simplex (LENGTH [u1;u3] - 1) ul' /\
2350                   LENGTH [u1;u3] <= LENGTH ul'`);
2351  (MATCH_MP_TAC Packing3.INITIAL_SUBLIST_IMP_TRUNCATE_SIMPLEX);
2352  (ASM_REWRITE_TAC[LENGTH]);
2353  (ARITH_TAC);
2354  (UP_ASM_TAC THEN REWRITE_TAC[LENGTH; ARITH_RULE `SUC(SUC(0)) - 1 = 1`]);
2355  (MESON_TAC[]);
2356  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
2357  (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1`);
2358  (MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA);
2359  (EXISTS_TAC `V:real^3->bool`);
2360  (ASM_REWRITE_TAC[]);
2361  (ARITH_TAC);
2362
2363  (NEW_GOAL `{u0,u1,u2,u3:real^3} = {v0,v1,v2,v3}`);
2364  (NEW_GOAL `{u0,u1,u2,u3:real^3} = {v0,v1,v2,v3} <=> 
2365    convex hull {u0,u1,u2,u3:real^3} = convex hull {v0,v1,v2,v3}`);
2366  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2367  (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);
2368  (REWRITE_TAC[GSYM set_of_list; GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`); 
2369    GSYM (ASSUME `ul' = [v0;v1;v2;v3:real^3]`)]);
2370  (STRIP_TAC);
2371  (MATCH_MP_TAC Rogers.BARV_AFFINE_INDEPENDENT);
2372  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
2373  (MATCH_MP_TAC Rogers.BARV_AFFINE_INDEPENDENT);
2374  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
2375  (ONCE_REWRITE_TAC[ASSUME `{u0, u1, u2, u3:real^3} = {v0, v1, v2, v3} <=>
2376       convex hull {u0, u1, u2, u3} = convex hull {v0, v1, v2, v3}`]);
2377  (REWRITE_TAC[GSYM set_of_list; GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`); 
2378    GSYM (ASSUME `ul' = [v0;v1;v2;v3:real^3]`)]);
2379  (REWRITE_WITH `convex hull set_of_list ul= X:real^3->bool`);
2380  (REWRITE_TAC[ASSUME `X = mcell i V ul`]);
2381  (REWRITE_WITH `mcell i V ul = mcell4 V ul`);
2382  (MESON_TAC[ASSUME `i >= 4`; MCELL_EXPLICIT]);
2383  (REWRITE_TAC[mcell4]);
2384  (COND_CASES_TAC);
2385  (REFL_TAC);
2386  (NEW_GOAL `F`);
2387  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2388  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2389
2390  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 4`]);
2391  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
2392  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
2393  (REWRITE_TAC[mcell4]);
2394  (COND_CASES_TAC);
2395  (REFL_TAC);
2396  (NEW_GOAL `F`);
2397  (NEW_GOAL `X:real^3->bool = {}`);
2398  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 4`]);
2399  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
2400  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
2401  (REWRITE_TAC[mcell4]);
2402  (COND_CASES_TAC);
2403  (NEW_GOAL `F`);
2404  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2405  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2406  (REFL_TAC);
2407  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2408  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2409
2410  (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
2411
2412  (NEW_GOAL `(v2 = u0 /\ v3 = u2:real^3) \/ (v2 = u2 /\ v3 = u0)`);
2413  (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1) /\ ~(u0 = u2) /\ ~(u0 = u3) /\
2414       ~(u1 = u2) /\ ~(u1 = u3) /\ ~(u2 = u3:real^3)`);
2415  (ASM_REWRITE_TAC[]);
2416  (SET_TAC[]);
2417  (UP_ASM_TAC THEN STRIP_TAC);
2418
2419  (GMATCH_SIMP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] DIHV_EQ_DIH_Y));
2420  (STRIP_TAC);
2421  (STRIP_TAC);
2422  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
2423  (EXISTS_TAC `v3:real^3`);
2424  (REWRITE_TAC[coplanar] THEN STRIP_TAC);
2425  (NEW_GOAL `affine hull {v0, v1, v2, v3:real^3} SUBSET 
2426              affine hull (affine hull {u, v, w})`);
2427  (ASM_SIMP_TAC[Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA]);
2428  (UP_ASM_TAC THEN REWRITE_WITH `affine hull (affine hull {u, v, w}) = 
2429                                  affine hull {u:real^3, v, w}`);
2430  (REWRITE_TAC[AFFINE_HULL_EQ; AFFINE_AFFINE_HULL]);
2431  (STRIP_TAC);
2432  (NEW_GOAL `NULLSET X`);
2433  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2434  (EXISTS_TAC `affine hull {v0, v1, v2,v3:real^3}`);
2435  (STRIP_TAC);
2436  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2437  (EXISTS_TAC `affine hull {u,v,w:real^3}`);
2438  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
2439  (ASM_REWRITE_TAC[]);
2440  (REWRITE_TAC[ASSUME `k = 4`; ASSUME `X = mcell k V ul'`]);
2441  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
2442  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
2443  (REWRITE_TAC[mcell4]);
2444  (COND_CASES_TAC);
2445  (ASM_REWRITE_TAC[set_of_list; CONVEX_HULL_SUBSET_AFFINE_HULL]);
2446  (SET_TAC[]);
2447  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2448
2449  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
2450  (EXISTS_TAC `v2:real^3`);
2451  (ONCE_REWRITE_TAC[SET_RULE ` {v0, v1, v3, v2} =  {v0, v1, v2, v3}`]);
2452  (REWRITE_TAC[coplanar] THEN STRIP_TAC);
2453  (NEW_GOAL `affine hull {v0, v1, v2, v3:real^3} SUBSET 
2454              affine hull (affine hull {u, v, w})`);
2455  (ASM_SIMP_TAC[Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA]);
2456  (UP_ASM_TAC THEN REWRITE_WITH `affine hull (affine hull {u, v, w}) = 
2457                                  affine hull {u:real^3, v, w}`);
2458  (REWRITE_TAC[AFFINE_HULL_EQ; AFFINE_AFFINE_HULL]);
2459  (STRIP_TAC);
2460  (NEW_GOAL `NULLSET X`);
2461  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2462  (EXISTS_TAC `affine hull {v0, v1, v2,v3:real^3}`);
2463  (STRIP_TAC);
2464  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2465  (EXISTS_TAC `affine hull {u,v,w:real^3}`);
2466  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
2467  (ASM_REWRITE_TAC[]);
2468  (REWRITE_TAC[ASSUME `k = 4`; ASSUME `X = mcell k V ul'`]);
2469  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
2470  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
2471  (REWRITE_TAC[mcell4]);
2472  (COND_CASES_TAC);
2473  (ASM_REWRITE_TAC[set_of_list; CONVEX_HULL_SUBSET_AFFINE_HULL]);
2474  (SET_TAC[]);
2475  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2476
2477  (ASM_REWRITE_TAC[]);
2478  (REWRITE_TAC[GSYM (ASSUME `u1 = v0:real^3`); GSYM (ASSUME `u3 = v1:real^3`)]);
2479  (EXPAND_TAC "y1" THEN EXPAND_TAC "y2" THEN EXPAND_TAC "y3");
2480  (EXPAND_TAC "y4" THEN EXPAND_TAC "y5" THEN EXPAND_TAC "y6");
2481  (REWRITE_TAC[DIST_SYM]);
2482
2483  (GMATCH_SIMP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] DIHV_EQ_DIH_Y));
2484  (STRIP_TAC);
2485  (STRIP_TAC);
2486  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
2487  (EXISTS_TAC `v3:real^3`);
2488  (REWRITE_TAC[coplanar] THEN STRIP_TAC);
2489  (NEW_GOAL `affine hull {v0, v1, v2, v3:real^3} SUBSET 
2490              affine hull (affine hull {u, v, w})`);
2491  (ASM_SIMP_TAC[Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA]);
2492  (UP_ASM_TAC THEN REWRITE_WITH `affine hull (affine hull {u, v, w}) = 
2493                                  affine hull {u:real^3, v, w}`);
2494  (REWRITE_TAC[AFFINE_HULL_EQ; AFFINE_AFFINE_HULL]);
2495  (STRIP_TAC);
2496  (NEW_GOAL `NULLSET X`);
2497  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2498  (EXISTS_TAC `affine hull {v0, v1, v2,v3:real^3}`);
2499  (STRIP_TAC);
2500  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2501  (EXISTS_TAC `affine hull {u,v,w:real^3}`);
2502  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
2503  (ASM_REWRITE_TAC[]);
2504  (REWRITE_TAC[ASSUME `k = 4`; ASSUME `X = mcell k V ul'`]);
2505  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
2506  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
2507  (REWRITE_TAC[mcell4]);
2508  (COND_CASES_TAC);
2509  (ASM_REWRITE_TAC[set_of_list; CONVEX_HULL_SUBSET_AFFINE_HULL]);
2510  (SET_TAC[]);
2511  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2512
2513  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
2514  (EXISTS_TAC `v2:real^3`);
2515  (ONCE_REWRITE_TAC[SET_RULE ` {v0, v1, v3, v2} =  {v0, v1, v2, v3}`]);
2516  (REWRITE_TAC[coplanar] THEN STRIP_TAC);
2517  (NEW_GOAL `affine hull {v0, v1, v2, v3:real^3} SUBSET 
2518              affine hull (affine hull {u, v, w})`);
2519  (ASM_SIMP_TAC[Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA]);
2520  (UP_ASM_TAC THEN REWRITE_WITH `affine hull (affine hull {u, v, w}) = 
2521                                  affine hull {u:real^3, v, w}`);
2522  (REWRITE_TAC[AFFINE_HULL_EQ; AFFINE_AFFINE_HULL]);
2523  (STRIP_TAC);
2524  (NEW_GOAL `NULLSET X`);
2525  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2526  (EXISTS_TAC `affine hull {v0, v1, v2,v3:real^3}`);
2527  (STRIP_TAC);
2528  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2529  (EXISTS_TAC `affine hull {u,v,w:real^3}`);
2530  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
2531  (ASM_REWRITE_TAC[]);
2532  (REWRITE_TAC[ASSUME `k = 4`; ASSUME `X = mcell k V ul'`]);
2533  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
2534  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
2535  (REWRITE_TAC[mcell4]);
2536  (COND_CASES_TAC);
2537  (ASM_REWRITE_TAC[set_of_list; CONVEX_HULL_SUBSET_AFFINE_HULL]);
2538  (SET_TAC[]);
2539  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2540
2541  (ASM_REWRITE_TAC[]);
2542  (REWRITE_TAC[GSYM (ASSUME `u1 = v0:real^3`); GSYM (ASSUME `u3 = v1:real^3`)]);
2543  (EXPAND_TAC "y1" THEN EXPAND_TAC "y2" THEN EXPAND_TAC "y3");
2544  (EXPAND_TAC "y4" THEN EXPAND_TAC "y5" THEN EXPAND_TAC "y6");
2545  (REWRITE_TAC[DIST_SYM]);
2546  (REWRITE_TAC[Nonlinear_lemma.dih_y_sym]);
2547
2548  (NEW_GOAL `F`);
2549  (ASM_ARITH_TAC);
2550  (UP_ASM_TAC THEN MESON_TAC[]);
2551
2552  (NEW_GOAL `F`);
2553  (NEW_GOAL `V INTER (X:real^3->bool) = set_of_list (truncate_simplex (4 - 1) ul)`);
2554  (REWRITE_TAC[ASSUME `X = mcell i V ul`]);
2555  (REWRITE_WITH `mcell i V ul = mcell 4 V ul`);
2556  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT; ASSUME `i >= 4`]);
2557  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
2558  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 4 /\ 4 <= 4`]);
2559  (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
2560  (ASM_REWRITE_TAC[]);
2561  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT; ASSUME `i >= 4`]);
2562  (ASM_REWRITE_TAC[]);
2563  (UP_ASM_TAC THEN REWRITE_TAC[ARITH_RULE `4 - 1 = 3`; 
2564    ASSUME `ul = [u0;u1;u2;u3:real^3]`; TRUNCATE_SIMPLEX_EXPLICIT_3]);
2565  (REWRITE_TAC[GSYM (ASSUME `ul = [u0; u1; u2; u3:real^3]`)]);
2566  (ASM_CASES_TAC `k = 1`);
2567
2568  (REWRITE_WITH `V INTER (X:real^3->bool) = 
2569                  set_of_list (truncate_simplex (k - 1) ul')`);
2570  (REWRITE_TAC[ASSUME `X = mcell k V ul'`]);
2571  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
2572  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 1 /\ 1 <= 4`]);
2573  (REWRITE_WITH `mcell 1 V ul' = X`);
2574  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 1`]);
2575  (ASM_REWRITE_TAC[]);
2576  (REWRITE_TAC[ARITH_RULE `1 - 1 = 0`; ASSUME `k = 1`]);
2577  (REWRITE_WITH `truncate_simplex 0 (ul':(real^3)list) = [HD ul']`);
2578  (MATCH_MP_TAC Packing3.TRUNCATE_0_EQ_HEAD);
2579  (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1`);
2580  (MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA);
2581  (EXISTS_TAC `V:real^3->bool`);
2582  (ASM_REWRITE_TAC[]);
2583  (ARITH_TAC);
2584
2585  (STRIP_TAC);
2586  (NEW_GOAL `CARD (set_of_list [(HD ul'):real^3]) = 
2587              CARD (set_of_list (ul:(real^3)list))`);
2588  (AP_TERM_TAC THEN ASM_REWRITE_TAC[]);
2589  (UP_ASM_TAC THEN REWRITE_WITH `CARD (set_of_list (ul:(real^3)list)) = 3 + 1`);
2590  (MATCH_MP_TAC Marchal_cells_3.BARV_CARD_LEMMA);
2591  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2592  (REWRITE_TAC[set_of_list; Geomdetail.CARD_SING] THEN ARITH_TAC);
2593  (NEW_GOAL `k = 0`);
2594  (ASM_ARITH_TAC);
2595
2596  (REWRITE_WITH `V INTER X = {}:real^3->bool`);
2597  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 0`]);
2598  (MATCH_MP_TAC Lepjbdj.LEPJBDJ_0);
2599  (ASM_REWRITE_TAC[]);
2600  (ASM_REWRITE_TAC[set_of_list]);
2601  (NEW_GOAL `u0 IN {u0,u1,u2,u3:real^3}`);
2602  (SET_TAC[]);
2603  (UP_ASM_TAC THEN SET_TAC[]);
2604  (UP_ASM_TAC THEN MESON_TAC[]);
2605
2606 (* ========================================================================= *)
2607
2608  (REWRITE_TAC[dihX]);
2609
2610  (COND_CASES_TAC);
2611  (NEW_GOAL `F`);
2612  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2613  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2614
2615  (LET_TAC);
2616  (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
2617  (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
2618            ul IN barV V 3 /\
2619            X = mcell k V ul /\
2620            initial_sublist [u1; u2] ul)`);
2621  (STRIP_TAC);
2622  (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
2623  (MATCH_MP_TAC SELECT_AX);
2624
2625  (ABBREV_TAC `wl = [u1;u2;u0;u3:real^3]`);
2626
2627   (* Need to list properties of wl at this point *)
2628  (NEW_GOAL `?p. p permutes 0..3 /\
2629                   wl:(real^3)list = left_action_list p ul`);
2630  (ASM_REWRITE_TAC[] THEN EXPAND_TAC "wl");
2631  (MATCH_MP_TAC Marchal_cells_3.LEFT_ACTION_LIST_3_EXISTS);
2632  (STRIP_TAC);
2633  (REWRITE_TAC[GSYM set_of_list; GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`)]);
2634  (REWRITE_TAC[ARITH_RULE `4 = 3 + 1`]);
2635  (MATCH_MP_TAC Marchal_cells_3.BARV_CARD_LEMMA);
2636  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2637  (SET_TAC[]);
2638  (UP_ASM_TAC THEN STRIP_TAC);
2639  (NEW_GOAL `barV V 3 wl`);
2640  (MATCH_MP_TAC Qzksykg.QZKSYKG1);
2641  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `4` THEN EXISTS_TAC `p:num->num`);
2642  (ASM_REWRITE_TAC[SET_RULE `4 IN {0,1,2,3,4}`; ARITH_RULE `4 - 1 = 3`]);
2643  (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
2644  (ASM_REWRITE_TAC[]);
2645  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT; ASSUME `i >= 4`]);
2646  (ASM_REWRITE_TAC[]);
2647
2648  (EXISTS_TAC `(4, wl:(real^3)list)`);
2649  (EXPAND_TAC "P");
2650  (REWRITE_TAC[BETA_THM]);
2651  (ASM_REWRITE_TAC[IN; ARITH_RULE `4 <= 4`]);
2652  (STRIP_TAC);
2653
2654  (REWRITE_WITH `mcell i V [u0; u1; u2; u3] = mcell 4 V [u0; u1; u2; u3]`);
2655  (MESON_TAC[MCELL_EXPLICIT; ASSUME `i >= 4`; ARITH_RULE `4 >= 4`]);
2656  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2657  (MATCH_MP_TAC Rvfxzbu.RVFXZBU);
2658  (ASM_REWRITE_TAC[SET_RULE `4 IN {0,1,2,3,4}`; ARITH_RULE `4 - 1 = 3`]);
2659  (REWRITE_TAC[GSYM (ASSUME `ul = [u0; u1; u2; u3:real^3]`)]);
2660  (ASM_REWRITE_TAC[]);
2661  (REWRITE_TAC[GSYM (ASSUME `ul = [u0; u1; u2; u3:real^3]`)]);
2662  (REWRITE_TAC[GSYM (ASSUME `wl:(real^3)list = left_action_list p ul`)]);
2663  (EXPAND_TAC "wl");
2664  (REWRITE_WITH `[u1; u2; u0; u3] = APPEND [u1; u2] [u0; u3:real^3]`);
2665  (REWRITE_TAC[APPEND]);
2666  (REWRITE_TAC[Packing3.INITIAL_SUBLIST_APPEND]);
2667
2668  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2669  (EXPAND_TAC "P" THEN REWRITE_TAC[IN]);
2670
2671  (REPEAT STRIP_TAC);
2672  (ASM_CASES_TAC `2 <= k`);
2673  (NEW_GOAL `k = 4`);
2674  (NEW_GOAL `4 = k /\
2675              (!t. 4 - 1 <= t /\ t <= 3
2676                   ==> omega_list_n V ul t = omega_list_n V ul' t)`);
2677  (MATCH_MP_TAC Marchal_cells_3.MCELL_ID_OMEGA_LIST_N);
2678  (ASM_REWRITE_TAC[SET_RULE `x IN {2,3,4} <=> x=2\/x=3\/x=4`]);
2679  (REWRITE_TAC[GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`)]);
2680  (REWRITE_WITH `mcell 4 V ul = X`);
2681  (REWRITE_TAC[ASSUME `X = mcell i V ul`]);
2682  (MESON_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ASSUME `i >= 4`]);
2683  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `~NULLSET X`]);
2684  (ASM_ARITH_TAC);
2685  (ASM_REWRITE_TAC[]);
2686  (COND_CASES_TAC);
2687  (NEW_GOAL `F`);
2688  (ASM_ARITH_TAC);
2689  (UP_ASM_TAC THEN MESON_TAC[]);
2690  (COND_CASES_TAC);
2691  (NEW_GOAL `F`);
2692  (ASM_ARITH_TAC);
2693  (UP_ASM_TAC THEN MESON_TAC[]);
2694  (COND_CASES_TAC);
2695  (REWRITE_TAC[dihu4]);
2696  (NEW_GOAL `?v0 v1 v2 v3. ul' = [v0;v1;v2;v3:real^3]`);
2697  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
2698  (EXISTS_TAC `V:real^3->bool`);
2699  (ASM_REWRITE_TAC[]);
2700  (UP_ASM_TAC THEN STRIP_TAC);
2701
2702  (NEW_GOAL `u1 = v0:real^3`);
2703  (NEW_GOAL`u1 = HD [u1;u2:real^3]`);
2704  (REWRITE_TAC[HD]);
2705  (ONCE_REWRITE_TAC[ASSUME `u1 = HD[u1;u2:real^3]`]);
2706  (REWRITE_WITH `v0:real^3 = HD ul'`);
2707  (ASM_REWRITE_TAC[HD]);
2708  (REWRITE_WITH `[u1;u2:real^3] = truncate_simplex 1 ul'`);
2709  (NEW_GOAL `[u1;u2:real^3] = truncate_simplex (LENGTH [u1;u2] - 1) ul' /\
2710                   LENGTH [u1;u2] <= LENGTH ul'`);
2711  (MATCH_MP_TAC Packing3.INITIAL_SUBLIST_IMP_TRUNCATE_SIMPLEX);
2712  (ASM_REWRITE_TAC[LENGTH]);
2713  (ARITH_TAC);
2714  (UP_ASM_TAC THEN REWRITE_TAC[LENGTH; ARITH_RULE `SUC(SUC(0)) - 1 = 1`]);
2715  (MESON_TAC[]);
2716  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2717  (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1`);
2718  (MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA);
2719  (EXISTS_TAC `V:real^3->bool`);
2720  (ASM_REWRITE_TAC[]);
2721  (ARITH_TAC);
2722
2723  (NEW_GOAL `u2 = v1:real^3`);
2724  (NEW_GOAL`u2 = EL 1 [u1;u2:real^3]`);
2725  (REWRITE_TAC[EL; ARITH_RULE `1 = SUC 0`; TL; HD]);
2726  (ONCE_REWRITE_TAC[ASSUME `u2 = EL 1 [u1;u2:real^3]`]);
2727
2728  (REWRITE_WITH `v1:real^3 = EL 1 ul'`);
2729  (ASM_REWRITE_TAC[EL; ARITH_RULE `1 = SUC 0`; TL; HD]);
2730  (REWRITE_WITH `[u1;u2:real^3] = truncate_simplex 1 ul'`);
2731  (NEW_GOAL `[u1;u2:real^3] = truncate_simplex (LENGTH [u1;u2] - 1) ul' /\
2732                   LENGTH [u1;u2] <= LENGTH ul'`);
2733  (MATCH_MP_TAC Packing3.INITIAL_SUBLIST_IMP_TRUNCATE_SIMPLEX);
2734  (ASM_REWRITE_TAC[LENGTH]);
2735  (ARITH_TAC);
2736  (UP_ASM_TAC THEN REWRITE_TAC[LENGTH; ARITH_RULE `SUC(SUC(0)) - 1 = 1`]);
2737  (MESON_TAC[]);
2738  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
2739  (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1`);
2740  (MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA);
2741  (EXISTS_TAC `V:real^3->bool`);
2742  (ASM_REWRITE_TAC[]);
2743  (ARITH_TAC);
2744
2745  (NEW_GOAL `{u0,u1,u2,u3:real^3} = {v0,v1,v2,v3}`);
2746  (NEW_GOAL `{u0,u1,u2,u3:real^3} = {v0,v1,v2,v3} <=> 
2747    convex hull {u0,u1,u2,u3:real^3} = convex hull {v0,v1,v2,v3}`);
2748  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2749  (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);
2750  (REWRITE_TAC[GSYM set_of_list; GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`); 
2751    GSYM (ASSUME `ul' = [v0;v1;v2;v3:real^3]`)]);
2752  (STRIP_TAC);
2753  (MATCH_MP_TAC Rogers.BARV_AFFINE_INDEPENDENT);
2754  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
2755  (MATCH_MP_TAC Rogers.BARV_AFFINE_INDEPENDENT);
2756  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
2757  (ONCE_REWRITE_TAC[ASSUME `{u0, u1, u2, u3:real^3} = {v0, v1, v2, v3} <=>
2758       convex hull {u0, u1, u2, u3} = convex hull {v0, v1, v2, v3}`]);
2759  (REWRITE_TAC[GSYM set_of_list; GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`); 
2760    GSYM (ASSUME `ul' = [v0;v1;v2;v3:real^3]`)]);
2761  (REWRITE_WITH `convex hull set_of_list ul= X:real^3->bool`);
2762  (REWRITE_TAC[ASSUME `X = mcell i V ul`]);
2763  (REWRITE_WITH `mcell i V ul = mcell4 V ul`);
2764  (MESON_TAC[ASSUME `i >= 4`; MCELL_EXPLICIT]);
2765  (REWRITE_TAC[mcell4]);
2766  (COND_CASES_TAC);
2767  (REFL_TAC);
2768  (NEW_GOAL `F`);
2769  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2770  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2771
2772  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 4`]);
2773  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
2774  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
2775  (REWRITE_TAC[mcell4]);
2776  (COND_CASES_TAC);
2777  (REFL_TAC);
2778  (NEW_GOAL `F`);
2779  (NEW_GOAL `X:real^3->bool = {}`);
2780  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 4`]);
2781  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
2782  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
2783  (REWRITE_TAC[mcell4]);
2784  (COND_CASES_TAC);
2785  (NEW_GOAL `F`);
2786  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2787  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2788  (REFL_TAC);
2789  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2790  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2791
2792  (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
2793
2794  (NEW_GOAL `(v2 = u0 /\ v3 = u3:real^3) \/ (v2 = u3 /\ v3 = u0)`);
2795  (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1) /\ ~(u0 = u2) /\ ~(u0 = u3) /\
2796       ~(u1 = u2) /\ ~(u1 = u3) /\ ~(u2 = u3:real^3)`);
2797  (ASM_REWRITE_TAC[]);
2798  (SET_TAC[]);
2799  (UP_ASM_TAC THEN STRIP_TAC);
2800
2801  (GMATCH_SIMP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] DIHV_EQ_DIH_Y));
2802  (STRIP_TAC);
2803  (STRIP_TAC);
2804  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
2805  (EXISTS_TAC `v3:real^3`);
2806  (REWRITE_TAC[coplanar] THEN STRIP_TAC);
2807  (NEW_GOAL `affine hull {v0, v1, v2, v3:real^3} SUBSET 
2808              affine hull (affine hull {u, v, w})`);
2809  (ASM_SIMP_TAC[Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA]);
2810  (UP_ASM_TAC THEN REWRITE_WITH `affine hull (affine hull {u, v, w}) = 
2811                                  affine hull {u:real^3, v, w}`);
2812  (REWRITE_TAC[AFFINE_HULL_EQ; AFFINE_AFFINE_HULL]);
2813  (STRIP_TAC);
2814  (NEW_GOAL `NULLSET X`);
2815  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2816  (EXISTS_TAC `affine hull {v0, v1, v2,v3:real^3}`);
2817  (STRIP_TAC);
2818  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2819  (EXISTS_TAC `affine hull {u,v,w:real^3}`);
2820  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
2821  (ASM_REWRITE_TAC[]);
2822  (REWRITE_TAC[ASSUME `k = 4`; ASSUME `X = mcell k V ul'`]);
2823  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
2824  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
2825  (REWRITE_TAC[mcell4]);
2826  (COND_CASES_TAC);
2827  (ASM_REWRITE_TAC[set_of_list; CONVEX_HULL_SUBSET_AFFINE_HULL]);
2828  (SET_TAC[]);
2829  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2830
2831  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
2832  (EXISTS_TAC `v2:real^3`);
2833  (ONCE_REWRITE_TAC[SET_RULE ` {v0, v1, v3, v2} =  {v0, v1, v2, v3}`]);
2834  (REWRITE_TAC[coplanar] THEN STRIP_TAC);
2835  (NEW_GOAL `affine hull {v0, v1, v2, v3:real^3} SUBSET 
2836              affine hull (affine hull {u, v, w})`);
2837  (ASM_SIMP_TAC[Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA]);
2838  (UP_ASM_TAC THEN REWRITE_WITH `affine hull (affine hull {u, v, w}) = 
2839                                  affine hull {u:real^3, v, w}`);
2840  (REWRITE_TAC[AFFINE_HULL_EQ; AFFINE_AFFINE_HULL]);
2841  (STRIP_TAC);
2842  (NEW_GOAL `NULLSET X`);
2843  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2844  (EXISTS_TAC `affine hull {v0, v1, v2,v3:real^3}`);
2845  (STRIP_TAC);
2846  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2847  (EXISTS_TAC `affine hull {u,v,w:real^3}`);
2848  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
2849  (ASM_REWRITE_TAC[]);
2850  (REWRITE_TAC[ASSUME `k = 4`; ASSUME `X = mcell k V ul'`]);
2851  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
2852  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
2853  (REWRITE_TAC[mcell4]);
2854  (COND_CASES_TAC);
2855  (ASM_REWRITE_TAC[set_of_list; CONVEX_HULL_SUBSET_AFFINE_HULL]);
2856  (SET_TAC[]);
2857  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2858
2859  (ASM_REWRITE_TAC[]);
2860  (REWRITE_TAC[GSYM (ASSUME `u1 = v0:real^3`); GSYM (ASSUME `u2 = v1:real^3`)]);
2861  (EXPAND_TAC "y1" THEN EXPAND_TAC "y2" THEN EXPAND_TAC "y3");
2862  (EXPAND_TAC "y4" THEN EXPAND_TAC "y5" THEN EXPAND_TAC "y6");
2863  (REWRITE_TAC[DIST_SYM]);
2864
2865  (GMATCH_SIMP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] DIHV_EQ_DIH_Y));
2866  (STRIP_TAC);
2867  (STRIP_TAC);
2868  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
2869  (EXISTS_TAC `v3:real^3`);
2870  (REWRITE_TAC[coplanar] THEN STRIP_TAC);
2871  (NEW_GOAL `affine hull {v0, v1, v2, v3:real^3} SUBSET 
2872              affine hull (affine hull {u, v, w})`);
2873  (ASM_SIMP_TAC[Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA]);
2874  (UP_ASM_TAC THEN REWRITE_WITH `affine hull (affine hull {u, v, w}) = 
2875                                  affine hull {u:real^3, v, w}`);
2876  (REWRITE_TAC[AFFINE_HULL_EQ; AFFINE_AFFINE_HULL]);
2877  (STRIP_TAC);
2878  (NEW_GOAL `NULLSET X`);
2879  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2880  (EXISTS_TAC `affine hull {v0, v1, v2,v3:real^3}`);
2881  (STRIP_TAC);
2882  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2883  (EXISTS_TAC `affine hull {u,v,w:real^3}`);
2884  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
2885  (ASM_REWRITE_TAC[]);
2886  (REWRITE_TAC[ASSUME `k = 4`; ASSUME `X = mcell k V ul'`]);
2887  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
2888  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
2889  (REWRITE_TAC[mcell4]);
2890  (COND_CASES_TAC);
2891  (ASM_REWRITE_TAC[set_of_list; CONVEX_HULL_SUBSET_AFFINE_HULL]);
2892  (SET_TAC[]);
2893  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2894
2895  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
2896  (EXISTS_TAC `v2:real^3`);
2897  (ONCE_REWRITE_TAC[SET_RULE ` {v0, v1, v3, v2} =  {v0, v1, v2, v3}`]);
2898  (REWRITE_TAC[coplanar] THEN STRIP_TAC);
2899  (NEW_GOAL `affine hull {v0, v1, v2, v3:real^3} SUBSET 
2900              affine hull (affine hull {u, v, w})`);
2901  (ASM_SIMP_TAC[Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA]);
2902  (UP_ASM_TAC THEN REWRITE_WITH `affine hull (affine hull {u, v, w}) = 
2903                                  affine hull {u:real^3, v, w}`);
2904  (REWRITE_TAC[AFFINE_HULL_EQ; AFFINE_AFFINE_HULL]);
2905  (STRIP_TAC);
2906  (NEW_GOAL `NULLSET X`);
2907  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2908  (EXISTS_TAC `affine hull {v0, v1, v2,v3:real^3}`);
2909  (STRIP_TAC);
2910  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2911  (EXISTS_TAC `affine hull {u,v,w:real^3}`);
2912  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
2913  (ASM_REWRITE_TAC[]);
2914  (REWRITE_TAC[ASSUME `k = 4`; ASSUME `X = mcell k V ul'`]);
2915  (REWRITE_WITH `mcell 4 V ul' = mcell4 V ul'`);
2916  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT]);
2917  (REWRITE_TAC[mcell4]);
2918  (COND_CASES_TAC);
2919  (ASM_REWRITE_TAC[set_of_list; CONVEX_HULL_SUBSET_AFFINE_HULL]);
2920  (SET_TAC[]);
2921  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2922
2923  (ASM_REWRITE_TAC[]);
2924  (REWRITE_TAC[GSYM (ASSUME `u1 = v0:real^3`); GSYM (ASSUME `u2 = v1:real^3`)]);
2925  (EXPAND_TAC "y1" THEN EXPAND_TAC "y2" THEN EXPAND_TAC "y3");
2926  (EXPAND_TAC "y4" THEN EXPAND_TAC "y5" THEN EXPAND_TAC "y6");
2927  (REWRITE_TAC[DIST_SYM]);
2928  (REWRITE_TAC[Nonlinear_lemma.dih_y_sym]);
2929
2930  (NEW_GOAL `F`);
2931  (ASM_ARITH_TAC);
2932  (UP_ASM_TAC THEN MESON_TAC[]);
2933
2934  (NEW_GOAL `F`);
2935  (NEW_GOAL `V INTER (X:real^3->bool) = set_of_list (truncate_simplex (4 - 1) ul)`);
2936  (REWRITE_TAC[ASSUME `X = mcell i V ul`]);
2937  (REWRITE_WITH `mcell i V ul = mcell 4 V ul`);
2938  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT; ASSUME `i >= 4`]);
2939  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
2940  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 4 /\ 4 <= 4`]);
2941  (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
2942  (ASM_REWRITE_TAC[]);
2943  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT; ASSUME `i >= 4`]);
2944  (ASM_REWRITE_TAC[]);
2945  (UP_ASM_TAC THEN REWRITE_TAC[ARITH_RULE `4 - 1 = 3`; 
2946    ASSUME `ul = [u0;u1;u2;u3:real^3]`; TRUNCATE_SIMPLEX_EXPLICIT_3]);
2947  (REWRITE_TAC[GSYM (ASSUME `ul = [u0; u1; u2; u3:real^3]`)]);
2948  (ASM_CASES_TAC `k = 1`);
2949
2950  (REWRITE_WITH `V INTER (X:real^3->bool) = 
2951                  set_of_list (truncate_simplex (k - 1) ul')`);
2952  (REWRITE_TAC[ASSUME `X = mcell k V ul'`]);
2953  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
2954  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 1 /\ 1 <= 4`]);
2955  (REWRITE_WITH `mcell 1 V ul' = X`);
2956  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 1`]);
2957  (ASM_REWRITE_TAC[]);
2958  (REWRITE_TAC[ARITH_RULE `1 - 1 = 0`; ASSUME `k = 1`]);
2959  (REWRITE_WITH `truncate_simplex 0 (ul':(real^3)list) = [HD ul']`);
2960  (MATCH_MP_TAC Packing3.TRUNCATE_0_EQ_HEAD);
2961  (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1`);
2962  (MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA);
2963  (EXISTS_TAC `V:real^3->bool`);
2964  (ASM_REWRITE_TAC[]);
2965  (ARITH_TAC);
2966
2967  (STRIP_TAC);
2968  (NEW_GOAL `CARD (set_of_list [(HD ul'):real^3]) = 
2969              CARD (set_of_list (ul:(real^3)list))`);
2970  (AP_TERM_TAC THEN ASM_REWRITE_TAC[]);
2971  (UP_ASM_TAC THEN REWRITE_WITH `CARD (set_of_list (ul:(real^3)list)) = 3 + 1`);
2972  (MATCH_MP_TAC Marchal_cells_3.BARV_CARD_LEMMA);
2973  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2974  (REWRITE_TAC[set_of_list; Geomdetail.CARD_SING] THEN ARITH_TAC);
2975  (NEW_GOAL `k = 0`);
2976  (ASM_ARITH_TAC);
2977
2978  (REWRITE_WITH `V INTER X = {}:real^3->bool`);
2979  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 0`]);
2980  (MATCH_MP_TAC Lepjbdj.LEPJBDJ_0);
2981  (ASM_REWRITE_TAC[]);
2982  (ASM_REWRITE_TAC[set_of_list]);
2983  (NEW_GOAL `u0 IN {u0,u1,u2,u3:real^3}`);
2984  (SET_TAC[]);
2985  (UP_ASM_TAC THEN SET_TAC[]);
2986  (UP_ASM_TAC THEN MESON_TAC[]);
2987
2988  (STRIP_TAC);
2989  (NEW_GOAL `F`);
2990  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2991  (UP_ASM_TAC THEN ASM_REWRITE_TAC[])]);;
2992
2993 (* ---------------------------------------------------------------------- *)
2994
2995 let SOL_SOL_Y_EXPLICIT = prove_by_refinement (
2996  `!V X ul u0 u1 u2 u3 i y1 y2 y3 y4 y5 y6.
2997      saturated V /\
2998      packing V /\
2999      barV V 3 ul /\
3000      i >= 4 /\
3001      X = mcell i V ul /\
3002      ~NULLSET X /\
3003      ul = [u0; u1; u2; u3] /\
3004      dist (u0,u1) = y1 /\
3005      dist (u0,u2) = y2 /\
3006      dist (u0,u3) = y3 /\
3007      dist (u2,u3) = y4 /\
3008      dist (u1,u3) = y5 /\
3009      dist (u1,u2) = y6
3010      ==> 
3011       sol u0 X = sol_y y1 y2 y3 y4 y5 y6 /\
3012       sol u1 X = sol_y y1 y5 y6 y4 y2 y3 /\
3013       sol u2 X = sol_y y4 y2 y6 y1 y5 y3 /\
3014       sol u3 X = sol_y y4 y5 y3 y1 y2 y6`,
3015
3016 [(REPEAT GEN_TAC THEN STRIP_TAC);
3017  (NEW_GOAL `~(X:real^3->bool = {})`);
3018  (STRIP_TAC THEN UNDISCH_TAC `~NULLSET X` THEN 
3019    REWRITE_TAC[ASSUME `X:real^3->bool = {}`; NEGLIGIBLE_EMPTY]);
3020
3021  (NEW_GOAL `X = mcell4 V ul`);
3022  (ASM_REWRITE_TAC[]);
3023  (ASM_SIMP_TAC[MCELL_EXPLICIT]);
3024  (UP_ASM_TAC THEN REWRITE_TAC[mcell4]);
3025  (COND_CASES_TAC);
3026  (REWRITE_TAC[ASSUME `ul = [u0; u1; u2; u3:real^3]`; set_of_list]);
3027  (STRIP_TAC);
3028
3029  (NEW_GOAL `VX V X = {u0,u1,u2,u3}`);
3030  (REWRITE_WITH `VX V X = V INTER X`);
3031  (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
3032  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
3033  (ASM_REWRITE_TAC[]);
3034
3035  (REWRITE_WITH `X = mcell 4 V ul`);
3036  (ASM_REWRITE_TAC[]);
3037  (MESON_TAC[ARITH_RULE `4 >= 4`; ASSUME `i >= 4`; MCELL_EXPLICIT]);
3038
3039  (REWRITE_WITH 
3040   `V INTER mcell 4 V ul = set_of_list (truncate_simplex (4 - 1) ul)`);
3041  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
3042  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 4 /\ 4 <= 4`]);
3043  (REWRITE_WITH ` mcell 4 V [u0; u1; u2; u3] = X`);
3044  (ASM_REWRITE_TAC[]);
3045  (MESON_TAC[ARITH_RULE `4 >= 4`; ASSUME `i >= 4`; MCELL_EXPLICIT]);
3046  (ASM_REWRITE_TAC[]);
3047  (ASM_REWRITE_TAC[ARITH_RULE `4 - 1 = 3`; TRUNCATE_SIMPLEX_EXPLICIT_3;
3048                    set_of_list]);
3049
3050  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} = 4`);
3051  (REWRITE_TAC[ARITH_RULE `4 = 3 + 1`; GSYM set_of_list;
3052    GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`)]);
3053  (MATCH_MP_TAC Marchal_cells_3.BARV_CARD_LEMMA);
3054  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3055  (NEW_GOAL `~(u0 = u1:real^3) /\ ~(u0 = u2) /\ ~(u0 = u3) /\ 
3056              ~(u1 = u2) /\ ~(u1 = u3) /\ ~(u2 = u3)`);
3057  (REPEAT STRIP_TAC);
3058  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
3059  (REWRITE_TAC[ASSUME `u0 = u1:real^3`; 
3060    SET_RULE `{u1, u1, u2, u3} = {u1,u2,u3}`;Geomdetail.CARD3 ]);
3061  (ASM_ARITH_TAC);
3062  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
3063  (REWRITE_TAC[ASSUME `u0 = u2:real^3`; 
3064    SET_RULE `{u2, u1, u2, u3} = {u1,u2,u3}`;Geomdetail.CARD3 ]);
3065  (ASM_ARITH_TAC);
3066  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
3067  (REWRITE_TAC[ASSUME `u0 = u3:real^3`; 
3068    SET_RULE `{u3, u1, u2, u3} = {u1,u2,u3}`;Geomdetail.CARD3 ]);
3069  (ASM_ARITH_TAC);
3070  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
3071  (REWRITE_TAC[ASSUME `u1 = u2:real^3`; 
3072    SET_RULE `{u0, u2, u2, u3} = {u0,u2,u3}`;Geomdetail.CARD3 ]);
3073  (ASM_ARITH_TAC);
3074  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
3075  (REWRITE_TAC[ASSUME `u1 = u3:real^3`; 
3076    SET_RULE `{u0, u3, u2, u3} = {u0,u2,u3}`;Geomdetail.CARD3 ]);
3077  (ASM_ARITH_TAC);
3078  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
3079  (REWRITE_TAC[ASSUME `u2 = u3:real^3`; 
3080    SET_RULE `{u0, u1, u3, u3} = {u0,u1,u3}`;Geomdetail.CARD3 ]);
3081  (ASM_ARITH_TAC);
3082
3083
3084  (NEW_GOAL `~(coplanar {u0,u1,u2,u3:real^3})`);
3085  (REWRITE_TAC[coplanar] THEN STRIP_TAC);
3086  (NEW_GOAL `affine hull {u0, u1, u2, u3:real^3} SUBSET 
3087              affine hull (affine hull {u, v, w})`);
3088  (ASM_SIMP_TAC[Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA]);
3089  (UP_ASM_TAC THEN REWRITE_WITH `affine hull (affine hull {u, v, w}) = 
3090                                  affine hull {u:real^3, v, w}`);
3091  (REWRITE_TAC[AFFINE_HULL_EQ; AFFINE_AFFINE_HULL]);
3092  (STRIP_TAC);
3093  (NEW_GOAL `NULLSET X`);
3094  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3095  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
3096  (STRIP_TAC);
3097  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3098  (EXISTS_TAC `affine hull {u,v,w:real^3}`);
3099  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
3100  (ASM_REWRITE_TAC[]);
3101  (REWRITE_TAC[ASSUME `X = mcell i V ul`]);
3102  (REWRITE_WITH `mcell i V ul = mcell4 V ul`);
3103  (MESON_TAC[ARITH_RULE `4 >= 4`; MCELL_EXPLICIT; ASSUME `i >= 4`]);
3104  (REWRITE_TAC[mcell4]);
3105  (COND_CASES_TAC);
3106  (ASM_REWRITE_TAC[set_of_list; CONVEX_HULL_SUBSET_AFFINE_HULL]);
3107  (SET_TAC[]);
3108  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
3109
3110  (REPEAT STRIP_TAC);
3111  (REWRITE_TAC[sol_y]);
3112  (REWRITE_WITH `dih_y y1 y2 y3 y4 y5 y6 = dihV (u0:real^3) u1 u2 u3`);
3113  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3114  (MP_TAC Merge_ineq.DIHV_EQ_DIH_Y);
3115  (REWRITE_TAC[LET_DEF; LET_END_DEF]);
3116  (EXPAND_TAC "y1");
3117  (EXPAND_TAC "y2");
3118  (EXPAND_TAC "y3");
3119  (EXPAND_TAC "y4");
3120  (EXPAND_TAC "y5");
3121  (EXPAND_TAC "y6");
3122  (STRIP_TAC);
3123  (FIRST_ASSUM MATCH_MP_TAC);
3124  (STRIP_TAC);
3125
3126  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3127  (EXISTS_TAC `u3:real^3` THEN ASM_REWRITE_TAC[]);
3128  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3129  (EXISTS_TAC `u2:real^3`);
3130  (ONCE_REWRITE_TAC[SET_RULE `{u0,u1,u3,u2} = {u0,u1,u2,u3}`]);
3131  (ASM_REWRITE_TAC[]);
3132
3133  (REWRITE_WITH `dih_y y2 y3 y1 y5 y6 y4 = dihV (u0:real^3) u2 u3 u1`);
3134  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3135  (MP_TAC Merge_ineq.DIHV_EQ_DIH_Y);
3136  (REWRITE_TAC[LET_DEF; LET_END_DEF]);
3137  (EXPAND_TAC "y1");
3138  (EXPAND_TAC "y2");
3139  (EXPAND_TAC "y3");
3140  (EXPAND_TAC "y4");
3141  (EXPAND_TAC "y5");
3142  (EXPAND_TAC "y6");
3143  (STRIP_TAC);
3144  (REWRITE_WITH 
3145 `dih_y (dist (u0,u2:real^3)) (dist (u0,u3)) (dist (u0,u1)) (dist (u1,u3))
3146  (dist (u1,u2)) (dist (u2,u3)) = 
3147  dih_y (dist (u0,u2)) (dist (u0,u3)) (dist (u0,u1)) (dist (u3,u1))
3148  (dist (u2,u1)) (dist (u2,u3))`);
3149  (REWRITE_TAC[DIST_SYM]);
3150  (FIRST_ASSUM MATCH_MP_TAC);
3151  (STRIP_TAC);
3152  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3153  (EXISTS_TAC `u1:real^3` THEN ASM_REWRITE_TAC[]);
3154  (ONCE_REWRITE_TAC[SET_RULE `{u0,u2,u3,u1} = {u0,u1,u2,u3}`]);
3155  (ASM_REWRITE_TAC[]);
3156  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3157  (EXISTS_TAC `u3:real^3`);
3158  (ONCE_REWRITE_TAC[SET_RULE `{u0,u2,u1,u3} = {u0,u1,u2,u3}`]);
3159  (ASM_REWRITE_TAC[]);
3160
3161  (REWRITE_WITH `dih_y y3 y1 y2 y6 y4 y5 = dihV (u0:real^3) u3 u1 u2`);
3162  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3163  (MP_TAC Merge_ineq.DIHV_EQ_DIH_Y);
3164  (REWRITE_TAC[LET_DEF; LET_END_DEF]);
3165  (EXPAND_TAC "y1");
3166  (EXPAND_TAC "y2");
3167  (EXPAND_TAC "y3");
3168  (EXPAND_TAC "y4");
3169  (EXPAND_TAC "y5");
3170  (EXPAND_TAC "y6");
3171  (STRIP_TAC);
3172  (REWRITE_WITH 
3173 `dih_y (dist (u0,u3)) (dist (u0,u1)) (dist (u0,u2)) (dist (u1,u2))
3174  (dist (u2,u3:real^3))
3175  (dist (u1,u3)) = 
3176  dih_y (dist (u0,u3)) (dist (u0,u1)) (dist (u0,u2)) (dist (u1,u2))
3177  (dist (u3,u2))
3178  (dist (u3,u1))`);
3179  (REWRITE_TAC[DIST_SYM]);
3180  (FIRST_ASSUM MATCH_MP_TAC);
3181  (STRIP_TAC);
3182  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3183  (EXISTS_TAC `u2:real^3` THEN ASM_REWRITE_TAC[]);
3184  (ONCE_REWRITE_TAC[SET_RULE `{u0,u3,u1,u2} = {u0,u1,u2,u3}`]);
3185  (ASM_REWRITE_TAC[]);
3186  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3187  (EXISTS_TAC `u1:real^3`);
3188  (ONCE_REWRITE_TAC[SET_RULE `{u0,u3, u2,u1} = {u0,u1,u2,u3}`]);
3189  (ASM_REWRITE_TAC[]);
3190  (REWRITE_WITH `X = convex hull {u0,u1,u2,u3:real^3}`);
3191  (ASM_SIMP_TAC[MCELL_EXPLICIT; ASSUME `i >= 4`; mcell4; set_of_list]);
3192  (MATCH_MP_TAC SOL_SOLID_TRIANGLE);
3193  (ASM_REWRITE_TAC[]);
3194
3195 (* ----- *)
3196  (REWRITE_TAC[sol_y]);
3197  (REWRITE_WITH `dih_y y1 y5 y6 y4 y2 y3 = dihV (u1:real^3) u0 u3 u2`);
3198  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3199  (MP_TAC Merge_ineq.DIHV_EQ_DIH_Y);
3200  (REWRITE_TAC[LET_DEF; LET_END_DEF]);
3201  (EXPAND_TAC "y1");
3202  (EXPAND_TAC "y2");
3203  (EXPAND_TAC "y3");
3204  (EXPAND_TAC "y4");
3205  (EXPAND_TAC "y5");
3206  (EXPAND_TAC "y6");
3207  (STRIP_TAC);
3208  (REWRITE_WITH 
3209 `dih_y (dist (u0,u1)) (dist (u1,u3)) (dist (u1,u2)) (dist (u2,u3))
3210  (dist (u0,u2:real^3))
3211  (dist (u0,u3)) = 
3212  dih_y (dist (u1,u0)) (dist (u1,u3)) (dist (u1,u2)) (dist (u3,u2))
3213  (dist (u0,u2))
3214  (dist (u0,u3))`);
3215  (REWRITE_TAC[DIST_SYM]);
3216  (FIRST_ASSUM MATCH_MP_TAC);
3217  (STRIP_TAC);
3218
3219  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3220  (EXISTS_TAC `u2:real^3` THEN ASM_REWRITE_TAC[]);
3221  (ONCE_REWRITE_TAC[SET_RULE `{u1,u0,u3,u2} = {u0,u1,u2,u3}`]);
3222  (ASM_REWRITE_TAC[]);
3223
3224  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3225  (EXISTS_TAC `u3:real^3`);
3226  (ONCE_REWRITE_TAC[SET_RULE `{u1,u0,u2,u3} = {u0,u1,u2,u3}`]);
3227  (ASM_REWRITE_TAC[]);
3228
3229  (REWRITE_WITH `dih_y y5 y6 y1 y2 y3 y4 = dihV (u1:real^3) u3 u2 u0`);
3230  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3231  (MP_TAC Merge_ineq.DIHV_EQ_DIH_Y);
3232  (REWRITE_TAC[LET_DEF; LET_END_DEF]);
3233  (EXPAND_TAC "y1");
3234  (EXPAND_TAC "y2");
3235  (EXPAND_TAC "y3");
3236  (EXPAND_TAC "y4");
3237  (EXPAND_TAC "y5");
3238  (EXPAND_TAC "y6");
3239  (STRIP_TAC);
3240  (REWRITE_WITH 
3241 `dih_y (dist (u1,u3)) (dist (u1,u2)) (dist (u0,u1)) (dist (u0,u2))
3242  (dist (u0,u3:real^3))
3243  (dist (u2,u3)) = 
3244  dih_y (dist (u1,u3)) (dist (u1,u2)) (dist (u1,u0)) (dist (u2,u0))
3245  (dist (u3,u0))
3246  (dist (u3,u2))`);
3247  (REWRITE_TAC[DIST_SYM]);
3248  (FIRST_ASSUM MATCH_MP_TAC);
3249  (STRIP_TAC);
3250  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3251  (EXISTS_TAC `u0:real^3` THEN ASM_REWRITE_TAC[]);
3252  (ONCE_REWRITE_TAC[SET_RULE `{u1,u3,u2,u0} = {u0,u1,u2,u3}`]);
3253  (ASM_REWRITE_TAC[]);
3254  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3255  (EXISTS_TAC `u2:real^3`);
3256  (ONCE_REWRITE_TAC[SET_RULE `{u1,u3,u0,u2} = {u0,u1,u2,u3}`]);
3257  (ASM_REWRITE_TAC[]);
3258
3259  (REWRITE_WITH `dih_y y6 y1 y5 y3 y4 y2 = dihV (u1:real^3) u2 u0 u3`);
3260  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3261  (MP_TAC Merge_ineq.DIHV_EQ_DIH_Y);
3262  (REWRITE_TAC[LET_DEF; LET_END_DEF]);
3263  (EXPAND_TAC "y1");
3264  (EXPAND_TAC "y2");
3265  (EXPAND_TAC "y3");
3266  (EXPAND_TAC "y4");
3267  (EXPAND_TAC "y5");
3268  (EXPAND_TAC "y6");
3269  (STRIP_TAC);
3270  (REWRITE_WITH 
3271 `dih_y (dist (u1,u2)) (dist (u0,u1)) (dist (u1,u3)) (dist (u0,u3))
3272  (dist (u2,u3:real^3))
3273  (dist (u0,u2)) = 
3274  dih_y (dist (u1,u2)) (dist (u1,u0)) (dist (u1,u3)) (dist (u0,u3))
3275  (dist (u2,u3))
3276  (dist (u2,u0))`);
3277  (REWRITE_TAC[DIST_SYM]);
3278  (FIRST_ASSUM MATCH_MP_TAC);
3279  (STRIP_TAC);
3280
3281  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3282  (EXISTS_TAC `u3:real^3`);
3283  (ONCE_REWRITE_TAC[SET_RULE `{u1,u2,u0,u3} = {u0,u1,u2,u3}`]);
3284  (ASM_REWRITE_TAC[]);
3285  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3286  (EXISTS_TAC `u0:real^3`);
3287  (ONCE_REWRITE_TAC[SET_RULE `{u1,u2, u3,u0} = {u0,u1,u2,u3}`]);
3288  (ASM_REWRITE_TAC[]);
3289
3290  (REWRITE_WITH `X = convex hull {u0,u1,u2,u3:real^3}`);
3291  (ASM_SIMP_TAC[MCELL_EXPLICIT; ASSUME `i >= 4`; mcell4; set_of_list]);
3292  (ONCE_REWRITE_TAC[SET_RULE `{u0,u1,u2,u3} = {u1,u2,u0,u3}`]);
3293
3294  (ONCE_REWRITE_TAC[REAL_ARITH `a + b + c - s = c + a + b - s`]);
3295  (MATCH_MP_TAC SOL_SOLID_TRIANGLE);
3296  (ONCE_REWRITE_TAC[GSYM (SET_RULE `{u0,u1,u2,u3} = {u1,u2,u0,u3}`)]);
3297  (ASM_REWRITE_TAC[]);
3298
3299  (REWRITE_TAC[sol_y]);
3300  (REWRITE_WITH `dih_y y4 y2 y6 y1 y5 y3 = dihV (u2:real^3) u3 u0 u1`);
3301  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);  
3302  (MP_TAC Merge_ineq.DIHV_EQ_DIH_Y);
3303  (REWRITE_TAC[LET_DEF; LET_END_DEF]);
3304  (EXPAND_TAC "y1");
3305  (EXPAND_TAC "y2");
3306  (EXPAND_TAC "y3");
3307  (EXPAND_TAC "y4");
3308  (EXPAND_TAC "y5");
3309  (EXPAND_TAC "y6");
3310  (STRIP_TAC);
3311  (REWRITE_WITH 
3312 `dih_y (dist (u2,u3)) (dist (u0,u2)) (dist (u1,u2)) (dist (u0,u1))
3313  (dist (u1,u3:real^3))
3314  (dist (u0,u3)) = 
3315  dih_y (dist (u2,u3)) (dist (u2,u0)) (dist (u2,u1)) (dist (u0,u1))
3316  (dist (u3,u1))
3317  (dist (u3,u0))`);
3318  (REWRITE_TAC[DIST_SYM]);
3319  (FIRST_ASSUM MATCH_MP_TAC);
3320  (STRIP_TAC);
3321  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3322  (EXISTS_TAC `u1:real^3` THEN ASM_REWRITE_TAC[]);
3323  (ONCE_REWRITE_TAC[SET_RULE `{u2,u3,u0,u1} = {u0,u1,u2,u3}`]);
3324  (ASM_REWRITE_TAC[]);
3325  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3326  (EXISTS_TAC `u0:real^3`);
3327  (ONCE_REWRITE_TAC[SET_RULE `{u2,u3,u1,u0} = {u0,u1,u2,u3}`]);
3328  (ASM_REWRITE_TAC[]);
3329
3330  (REWRITE_WITH `dih_y y2 y6 y4 y5 y3 y1 = dihV (u2:real^3) u0 u1 u3`);
3331  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3332  (MP_TAC Merge_ineq.DIHV_EQ_DIH_Y);
3333  (REWRITE_TAC[LET_DEF; LET_END_DEF]);
3334  (EXPAND_TAC "y1");
3335  (EXPAND_TAC "y2");
3336  (EXPAND_TAC "y3");
3337  (EXPAND_TAC "y4");
3338  (EXPAND_TAC "y5");
3339  (EXPAND_TAC "y6");
3340  (STRIP_TAC);
3341  (REWRITE_WITH 
3342 `dih_y (dist (u0,u2)) (dist (u1,u2)) (dist (u2,u3)) (dist (u1,u3))
3343  (dist (u0,u3:real^3))
3344  (dist (u0,u1)) = 
3345  dih_y (dist (u2,u0)) (dist (u2,u1)) (dist (u2,u3)) (dist (u1,u3))
3346  (dist (u0,u3))
3347  (dist (u0,u1))`);
3348  (REWRITE_TAC[DIST_SYM]);
3349  (FIRST_ASSUM MATCH_MP_TAC);
3350  (STRIP_TAC);
3351  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3352  (EXISTS_TAC `u3:real^3`);
3353  (ONCE_REWRITE_TAC[SET_RULE `{u2,u0,u1,u3} = {u0,u1,u2,u3}`]);
3354  (ASM_REWRITE_TAC[]);
3355  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3356  (EXISTS_TAC `u1:real^3`);
3357  (ONCE_REWRITE_TAC[SET_RULE `{u2, u0, u3,u1} = {u0,u1,u2,u3}`]);
3358  (ASM_REWRITE_TAC[]);
3359
3360  (REWRITE_WITH `dih_y y6 y4 y2 y3 y1 y5 = dihV (u2:real^3) u1 u3 u0`);
3361  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3362  (MP_TAC Merge_ineq.DIHV_EQ_DIH_Y);
3363  (REWRITE_TAC[LET_DEF; LET_END_DEF]);
3364  (EXPAND_TAC "y1");
3365  (EXPAND_TAC "y2");
3366  (EXPAND_TAC "y3");
3367  (EXPAND_TAC "y4");
3368  (EXPAND_TAC "y5");
3369  (EXPAND_TAC "y6");
3370  (STRIP_TAC);
3371  (REWRITE_WITH 
3372 `dih_y (dist (u1,u2)) (dist (u2,u3)) (dist (u0,u2)) (dist (u0,u3))
3373  (dist (u0,u1:real^3))
3374  (dist (u1,u3)) = 
3375  dih_y (dist (u2,u1)) (dist (u2,u3)) (dist (u2,u0)) (dist (u3,u0))
3376  (dist (u1,u0))
3377  (dist (u1,u3))`);
3378  (REWRITE_TAC[DIST_SYM]);
3379  (FIRST_ASSUM MATCH_MP_TAC);
3380  (STRIP_TAC);
3381
3382  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3383  (EXISTS_TAC `u0:real^3`);
3384  (ONCE_REWRITE_TAC[SET_RULE `{u2,u1,u3,u0} = {u0,u1,u2,u3}`]);
3385  (ASM_REWRITE_TAC[]);
3386  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3387  (EXISTS_TAC `u3:real^3`);
3388  (ONCE_REWRITE_TAC[SET_RULE `{u2,u1,u0,u3} = {u0,u1,u2,u3}`]);
3389  (ASM_REWRITE_TAC[]);
3390
3391  (REWRITE_WITH `X = convex hull {u0,u1,u2,u3:real^3}`);
3392  (ASM_SIMP_TAC[MCELL_EXPLICIT; ASSUME `i >= 4`; mcell4; set_of_list]);
3393  (ONCE_REWRITE_TAC[SET_RULE `{u0,u1,u2,u3} = {u2,u3,u0,u1}`]);
3394
3395  (MATCH_MP_TAC SOL_SOLID_TRIANGLE);
3396  (ONCE_REWRITE_TAC[SET_RULE `{u2,u3,u0,u1} = {u0, u1, u2, u3}`]);
3397  (ASM_REWRITE_TAC[]);
3398
3399
3400  (REWRITE_TAC[sol_y]);
3401  (REWRITE_WITH `dih_y y4 y5 y3 y1 y2 y6 = dihV (u3:real^3) u2 u1 u0`);
3402  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);  
3403  (MP_TAC Merge_ineq.DIHV_EQ_DIH_Y);
3404  (REWRITE_TAC[LET_DEF; LET_END_DEF]);
3405  (EXPAND_TAC "y1");
3406  (EXPAND_TAC "y2");
3407  (EXPAND_TAC "y3");
3408  (EXPAND_TAC "y4");
3409  (EXPAND_TAC "y5");
3410  (EXPAND_TAC "y6");
3411  (STRIP_TAC);
3412  (REWRITE_WITH 
3413 `dih_y (dist (u2,u3)) (dist (u1,u3)) (dist (u0,u3)) (dist (u0,u1))
3414  (dist (u0,u2))
3415  (dist (u1,u2)) = 
3416  dih_y (dist (u3,u2)) (dist (u3,u1)) (dist (u3,u0)) (dist (u1,u0))
3417  (dist (u2,u0:real^3))
3418  (dist (u2,u1))`);
3419  (REWRITE_TAC[DIST_SYM]);
3420  (FIRST_ASSUM MATCH_MP_TAC);
3421  (STRIP_TAC);
3422  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3423  (EXISTS_TAC `u0:real^3` THEN ASM_REWRITE_TAC[]);
3424  (ONCE_REWRITE_TAC[SET_RULE `{u3,u2,u1,u0} = {u0,u1,u2,u3}`]);
3425  (ASM_REWRITE_TAC[]);
3426
3427  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3428  (EXISTS_TAC `u1:real^3`);
3429  (ONCE_REWRITE_TAC[SET_RULE `{u3,u2,u0,u1} = {u0,u1,u2,u3}`]);
3430  (ASM_REWRITE_TAC[]);
3431
3432  (REWRITE_WITH `dih_y y5 y3 y4 y2 y6 y1 = dihV (u3:real^3) u1 u0 u2`);
3433  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3434  (MP_TAC Merge_ineq.DIHV_EQ_DIH_Y);
3435  (REWRITE_TAC[LET_DEF; LET_END_DEF]);
3436  (EXPAND_TAC "y1");
3437  (EXPAND_TAC "y2");
3438  (EXPAND_TAC "y3");
3439  (EXPAND_TAC "y4");
3440  (EXPAND_TAC "y5");
3441  (EXPAND_TAC "y6");
3442  (STRIP_TAC);
3443  (REWRITE_WITH 
3444 `dih_y (dist (u1,u3)) (dist (u0,u3)) (dist (u2,u3)) (dist (u0,u2))
3445  (dist (u1,u2:real^3))
3446  (dist (u0,u1)) = 
3447  dih_y (dist (u3,u1)) (dist (u3,u0)) (dist (u3,u2)) (dist (u0,u2))
3448  (dist (u1,u2))
3449  (dist (u1,u0))`);
3450  (REWRITE_TAC[DIST_SYM]);
3451  (FIRST_ASSUM MATCH_MP_TAC);
3452  (STRIP_TAC);
3453  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3454  (EXISTS_TAC `u2:real^3` THEN ASM_REWRITE_TAC[]);
3455  (ONCE_REWRITE_TAC[SET_RULE `{u3,u1,u0,u2} = {u0,u1,u2,u3}`]);
3456  (ASM_REWRITE_TAC[]);
3457  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3458  (EXISTS_TAC `u0:real^3`);
3459  (ONCE_REWRITE_TAC[SET_RULE `{u3, u1, u2,u0} = {u0,u1,u2,u3}`]);
3460  (ASM_REWRITE_TAC[]);
3461
3462  (REWRITE_WITH `dih_y y3 y4 y5 y6 y1 y2 = dihV (u3:real^3) u0 u2 u1`);
3463  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3464  (MP_TAC Merge_ineq.DIHV_EQ_DIH_Y);
3465  (REWRITE_TAC[LET_DEF; LET_END_DEF]);
3466  (EXPAND_TAC "y1");
3467  (EXPAND_TAC "y2");
3468  (EXPAND_TAC "y3");
3469  (EXPAND_TAC "y4");
3470  (EXPAND_TAC "y5");
3471  (EXPAND_TAC "y6");
3472  (STRIP_TAC);
3473  (REWRITE_WITH 
3474 `dih_y (dist (u0,u3)) (dist (u2,u3)) (dist (u1,u3)) (dist (u1,u2))
3475  (dist (u0,u1:real^3))
3476  (dist (u0,u2)) = 
3477  dih_y (dist (u3,u0)) (dist (u3,u2)) (dist (u3,u1)) (dist (u2,u1))
3478  (dist (u0,u1))
3479  (dist (u0,u2:real^3))`);
3480  (REWRITE_TAC[DIST_SYM]);
3481  (FIRST_ASSUM MATCH_MP_TAC);
3482  (STRIP_TAC);
3483
3484  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3485  (EXISTS_TAC `u1:real^3`);
3486  (ONCE_REWRITE_TAC[SET_RULE `{u3,u0,u2,u1} = {u0,u1,u2,u3}`]);
3487  (ASM_REWRITE_TAC[]);
3488  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3489  (EXISTS_TAC `u2:real^3`);
3490  (ONCE_REWRITE_TAC[SET_RULE `{u3,u0,u1,u2} = {u0,u1,u2,u3}`]);
3491  (ASM_REWRITE_TAC[]);
3492
3493  (REWRITE_WITH `X = convex hull {u0,u1,u2,u3:real^3}`);
3494  (ASM_SIMP_TAC[MCELL_EXPLICIT; ASSUME `i >= 4`; mcell4; set_of_list]);
3495  (ONCE_REWRITE_TAC[SET_RULE `{u0,u1,u2,u3} = {u3,u0,u2,u1}`]);
3496
3497  (ONCE_REWRITE_TAC[REAL_ARITH `a + b + c - s = c + a + b - s`]);
3498  (MATCH_MP_TAC SOL_SOLID_TRIANGLE);
3499  (ONCE_REWRITE_TAC[GSYM (SET_RULE `{u0,u1,u2,u3} = {u3, u0, u2, u1}`)]);
3500  (ASM_REWRITE_TAC[]);
3501
3502  (STRIP_TAC THEN NEW_GOAL `F`);
3503  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
3504  (UP_ASM_TAC THEN ASM_REWRITE_TAC[])]);;
3505
3506 (* ---------------------------------------------------------------------- *)
3507
3508 let gammaX_gamm4fgcy = prove_by_refinement (
3509  `!V X ul u0 u1 u2 u3 i y1 y2 y3 y4 y5 y6.
3510      saturated V /\
3511      packing V /\
3512      barV V 3 ul /\
3513      i >= 4 /\
3514      X = mcell i V ul /\
3515      ~NULLSET X /\
3516      ul = [u0; u1; u2; u3] /\
3517      dist (u0,u1) = y1 /\
3518      dist (u0,u2) = y2 /\
3519      dist (u0,u3) = y3 /\
3520      dist (u2,u3) = y4 /\
3521      dist (u1,u3) = y5 /\
3522      dist (u1,u2) = y6
3523      ==> 
3524       vol X = vol_y y1 y2 y3 y4 y5 y6 /\
3525       gammaX V X lmfun = gamma4fgcy y1 y2 y3 y4 y5 y6 lmfun`,
3526
3527 [(REPEAT GEN_TAC THEN STRIP_TAC);
3528  (NEW_GOAL `~(X:real^3->bool = {})`);
3529  (STRIP_TAC THEN UNDISCH_TAC `~NULLSET X` THEN 
3530    REWRITE_TAC[ASSUME `X:real^3->bool = {}`; NEGLIGIBLE_EMPTY]);
3531
3532  (NEW_GOAL `X = mcell4 V ul`);
3533  (ASM_REWRITE_TAC[]);
3534  (ASM_SIMP_TAC[MCELL_EXPLICIT]);
3535  (UP_ASM_TAC THEN REWRITE_TAC[mcell4]);
3536  (COND_CASES_TAC);
3537  (REWRITE_TAC[ASSUME `ul = [u0; u1; u2; u3:real^3]`; set_of_list]);
3538  (STRIP_TAC);
3539
3540  (NEW_GOAL `VX V X = {u0,u1,u2,u3}`);
3541  (REWRITE_WITH `VX V X = V INTER X`);
3542  (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
3543  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
3544  (ASM_REWRITE_TAC[]);
3545
3546  (REWRITE_WITH `X = mcell 4 V ul`);
3547  (ASM_REWRITE_TAC[]);
3548  (MESON_TAC[ARITH_RULE `4 >= 4`; ASSUME `i >= 4`; MCELL_EXPLICIT]);
3549
3550  (REWRITE_WITH 
3551   `V INTER mcell 4 V ul = set_of_list (truncate_simplex (4 - 1) ul)`);
3552  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
3553  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 4 /\ 4 <= 4`]);
3554  (REWRITE_WITH ` mcell 4 V [u0; u1; u2; u3] = X`);
3555  (ASM_REWRITE_TAC[]);
3556  (MESON_TAC[ARITH_RULE `4 >= 4`; ASSUME `i >= 4`; MCELL_EXPLICIT]);
3557  (ASM_REWRITE_TAC[]);
3558  (ASM_REWRITE_TAC[ARITH_RULE `4 - 1 = 3`; TRUNCATE_SIMPLEX_EXPLICIT_3;
3559                    set_of_list]);
3560
3561  (REWRITE_TAC[gammaX; gamma4fgcy;gamma4f]);
3562
3563  (REWRITE_WITH `vol X = vol_y y1 y2 y3 y4 y5 y6`);
3564  (REWRITE_TAC[vol_y; y_of_x; vol_x; 
3565    ASSUME `X = convex hull {u0, u1, u2, u3:real^3}`;
3566    VOLUME_OF_CLOSED_TETRAHEDRON; REAL_POW_2]);
3567  (ASM_REWRITE_TAC[]);
3568  (REWRITE_TAC[REAL_ARITH `a - b + c = a - d <=> d = b - c`; vol4f]);
3569
3570 (* ---------------------------------------------------------------- *)
3571  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} = 4`);
3572  (REWRITE_TAC[ARITH_RULE `4 = 3 + 1`; GSYM set_of_list;
3573    GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`)]);
3574  (MATCH_MP_TAC Marchal_cells_3.BARV_CARD_LEMMA);
3575  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3576  (NEW_GOAL `~(u0 = u1:real^3) /\ ~(u0 = u2) /\ ~(u0 = u3) /\ 
3577              ~(u1 = u2) /\ ~(u1 = u3) /\ ~(u2 = u3)`);
3578  (REPEAT STRIP_TAC);
3579  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
3580  (REWRITE_TAC[ASSUME `u0 = u1:real^3`; 
3581    SET_RULE `{u1, u1, u2, u3} = {u1,u2,u3}`;Geomdetail.CARD3 ]);
3582  (ASM_ARITH_TAC);
3583  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
3584  (REWRITE_TAC[ASSUME `u0 = u2:real^3`; 
3585    SET_RULE `{u2, u1, u2, u3} = {u1,u2,u3}`;Geomdetail.CARD3 ]);
3586  (ASM_ARITH_TAC);
3587  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
3588  (REWRITE_TAC[ASSUME `u0 = u3:real^3`; 
3589    SET_RULE `{u3, u1, u2, u3} = {u1,u2,u3}`;Geomdetail.CARD3 ]);
3590  (ASM_ARITH_TAC);
3591  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
3592  (REWRITE_TAC[ASSUME `u1 = u2:real^3`; 
3593    SET_RULE `{u0, u2, u2, u3} = {u0,u2,u3}`;Geomdetail.CARD3 ]);
3594  (ASM_ARITH_TAC);
3595  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
3596  (REWRITE_TAC[ASSUME `u1 = u3:real^3`; 
3597    SET_RULE `{u0, u3, u2, u3} = {u0,u2,u3}`;Geomdetail.CARD3 ]);
3598  (ASM_ARITH_TAC);
3599  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
3600  (REWRITE_TAC[ASSUME `u2 = u3:real^3`; 
3601    SET_RULE `{u0, u1, u3, u3} = {u0,u1,u3}`;Geomdetail.CARD3 ]);
3602  (ASM_ARITH_TAC);
3603
3604  (NEW_GOAL `edgeX V X = {{u0,u1:real^3}, {u0,u2}, {u0,u3}, 
3605                           {u1,u2}, {u1,u3}, {u2,u3}}`);
3606  (REWRITE_TAC[edgeX]);
3607  (ONCE_REWRITE_TAC[SET_EQ_LEMMA]);
3608  (REWRITE_TAC[IN_ELIM_THM]);
3609  (REPEAT STRIP_TAC);
3610
3611  (UNDISCH_TAC `VX V X u` THEN UNDISCH_TAC `VX V X v`);
3612  (REWRITE_TAC[MESON[IN] `VX V X s <=> s IN VX V X`]);
3613  (ASM_REWRITE_TAC[SET_RULE `v IN {u0, u1, u2, u3} <=> 
3614                              v = u0 \/ v = u1 \/ v = u2 \/ v = u3`]);
3615  (REPEAT STRIP_TAC);
3616  (NEW_GOAL `F`);
3617  (ASM_MESON_TAC[]);
3618  (ASM_MESON_TAC[]);
3619  (REWRITE_WITH `{u,v} = {v,u:real^3}`);
3620  (SET_TAC[]);
3621  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
3622  (REWRITE_WITH `{u,v} = {v,u:real^3}`);
3623  (SET_TAC[]);
3624  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
3625  (REWRITE_WITH `{u,v} = {v,u:real^3}`);
3626  (SET_TAC[]);
3627  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
3628  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
3629  (NEW_GOAL `F`);
3630  (ASM_MESON_TAC[]);
3631  (ASM_MESON_TAC[]);
3632  (REWRITE_WITH `{u,v} = {v,u:real^3}`);
3633  (SET_TAC[]);
3634  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
3635  (REWRITE_WITH `{u,v} = {v,u:real^3}`);
3636  (SET_TAC[]);
3637  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
3638  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
3639  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
3640  (NEW_GOAL `F`);
3641  (ASM_MESON_TAC[]);
3642  (ASM_MESON_TAC[]);
3643  (REWRITE_WITH `{u,v} = {v,u:real^3}`);
3644  (SET_TAC[]);
3645  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
3646  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
3647  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
3648  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
3649  (NEW_GOAL `F`);
3650  (ASM_MESON_TAC[]);
3651  (ASM_MESON_TAC[]);
3652
3653  (UP_ASM_TAC THEN REWRITE_TAC[SET_RULE `x IN {a,b,c,d,e,f} <=> 
3654    x = a \/ x = b \/ x = c \/ x = d \/ x = e \/ x = f`]);
3655  (REWRITE_TAC[MESON[IN] `VX V X s <=> s IN VX V X`]);
3656  (ASM_REWRITE_TAC[SET_RULE `v IN {u0, u1, u2, u3} <=> 
3657                              v = u0 \/ v = u1 \/ v = u2 \/ v = u3`]);
3658  (REPEAT STRIP_TAC);
3659  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3` THEN ASM_REWRITE_TAC[]);
3660  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u2:real^3` THEN ASM_REWRITE_TAC[]);
3661  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u3:real^3` THEN ASM_REWRITE_TAC[]);
3662  (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN ASM_REWRITE_TAC[]);
3663  (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u3:real^3` THEN ASM_REWRITE_TAC[]);
3664  (EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3` THEN ASM_REWRITE_TAC[]);
3665
3666
3667  (ABBREV_TAC `f = 
3668  (\({u, v}). if {u, v} IN edgeX V X
3669              then dihX V X (u,v) * lmfun (hl [u; v])
3670              else &0)`);
3671  (MATCH_MP_TAC (REAL_ARITH `y = b /\ x = a ==> a - b = x - y`));
3672  (STRIP_TAC);
3673  (AP_TERM_TAC);
3674  (ASM_REWRITE_TAC[]);
3675
3676  (ABBREV_TAC `S5 = {{u0, u2}, {u0, u3}, {u1, u2}, {u1, u3}, {u2, u3:real^3}}`);
3677  (REWRITE_WITH `sum ({u0,u1:real^3} INSERT S5) f = 
3678    (if {u0,u1} IN S5 then sum S5 f else f {u0,u1} + sum S5 f)`);
3679  (MATCH_MP_TAC Marchal_cells_2_new.SUM_CLAUSES_alt);
3680  (EXPAND_TAC "S5");
3681  (REWRITE_TAC[Geomdetail.FINITE6]);
3682  (COND_CASES_TAC);
3683  (NEW_GOAL `F`);
3684  (UP_ASM_TAC THEN EXPAND_TAC "S5");
3685  (REWRITE_TAC[SET_RULE `x IN {a,b,c,d,e} <=> x=a\/x=b\/x=c\/x=d\/x=e`]);
3686  (SET_TAC[ASSUME 
3687    `~(u0 = u1:real^3) /\ ~(u0 = u2) /\ ~(u0 = u3) /\ ~(u1 = u2) /\
3688     ~(u1 = u3) /\ ~(u2 = u3)`]);
3689  (UP_ASM_TAC THEN MESON_TAC[]);
3690  (EXPAND_TAC "S5");
3691
3692  (ABBREV_TAC `S4 = {{u0, u3}, {u1, u2}, {u1, u3}, {u2, u3:real^3}}`);
3693  (REWRITE_WITH `sum ({u0,u2:real^3} INSERT S4) f = 
3694    (if {u0,u2} IN S4 then sum S4 f else f {u0,u2} + sum S4 f)`);
3695  (MATCH_MP_TAC Marchal_cells_2_new.SUM_CLAUSES_alt);
3696  (EXPAND_TAC "S4");
3697  (REWRITE_TAC[Geomdetail.FINITE6]);
3698  (COND_CASES_TAC);
3699  (NEW_GOAL `F`);
3700  (UP_ASM_TAC THEN EXPAND_TAC "S4");
3701  (REWRITE_TAC[SET_RULE `x IN {a,b,c,d} <=> x=a\/x=b\/x=c\/x=d`]);
3702  (SET_TAC[ASSUME 
3703    `~(u0 = u1:real^3) /\ ~(u0 = u2) /\ ~(u0 = u3) /\ ~(u1 = u2) /\
3704     ~(u1 = u3) /\ ~(u2 = u3)`]);
3705  (UP_ASM_TAC THEN MESON_TAC[]);
3706
3707
3708  (EXPAND_TAC "S4");
3709  (ABBREV_TAC `S3 = {{u1, u2}, {u1, u3}, {u2, u3:real^3}}`);
3710  (REWRITE_WITH `sum ({u0,u3:real^3} INSERT S3) f = 
3711    (if {u0,u3} IN S3 then sum S3 f else f {u0,u3} + sum S3 f)`);
3712  (MATCH_MP_TAC Marchal_cells_2_new.SUM_CLAUSES_alt);
3713  (EXPAND_TAC "S3");
3714  (REWRITE_TAC[Geomdetail.FINITE6]);
3715  (COND_CASES_TAC);
3716  (NEW_GOAL `F`);
3717  (UP_ASM_TAC THEN EXPAND_TAC "S3");
3718  (REWRITE_TAC[SET_RULE `x IN {a,b,c} <=> x=a\/x=b\/x=c`]);
3719  (SET_TAC[ASSUME 
3720    `~(u0 = u1:real^3) /\ ~(u0 = u2) /\ ~(u0 = u3) /\ ~(u1 = u2) /\
3721     ~(u1 = u3) /\ ~(u2 = u3)`]);
3722  (UP_ASM_TAC THEN MESON_TAC[]);
3723
3724  (EXPAND_TAC "S3");
3725  (ABBREV_TAC `S2 = {{u1, u3}, {u2, u3:real^3}}`);
3726  (REWRITE_WITH `sum ({u1,u2:real^3} INSERT S2) f = 
3727    (if {u1,u2} IN S2 then sum S2 f else f {u1,u2} + sum S2 f)`);
3728  (MATCH_MP_TAC Marchal_cells_2_new.SUM_CLAUSES_alt);
3729  (EXPAND_TAC "S2");
3730  (REWRITE_TAC[Geomdetail.FINITE6]);
3731  (COND_CASES_TAC);
3732  (NEW_GOAL `F`);
3733  (UP_ASM_TAC THEN EXPAND_TAC "S2");
3734  (REWRITE_TAC[SET_RULE `x IN {a,b} <=> x=a\/x=b`]);
3735  (SET_TAC[ASSUME 
3736    `~(u0 = u1:real^3) /\ ~(u0 = u2) /\ ~(u0 = u3) /\ ~(u1 = u2) /\
3737     ~(u1 = u3) /\ ~(u2 = u3)`]);
3738  (UP_ASM_TAC THEN MESON_TAC[]);
3739
3740  (EXPAND_TAC "S2");
3741  (ABBREV_TAC `S1 = {{u2, u3:real^3}}`);
3742  (REWRITE_WITH `sum ({u1,u3:real^3} INSERT S1) f = 
3743    (if {u1,u3} IN S1 then sum S1 f else f {u1,u3} + sum S1 f)`);
3744  (MATCH_MP_TAC Marchal_cells_2_new.SUM_CLAUSES_alt);
3745  (EXPAND_TAC "S1");
3746  (REWRITE_TAC[Geomdetail.FINITE6]);
3747  (COND_CASES_TAC);
3748  (NEW_GOAL `F`);
3749  (UP_ASM_TAC THEN EXPAND_TAC "S1");
3750  (REWRITE_TAC[SET_RULE `x IN {a} <=> x=a`]);
3751  (SET_TAC[ASSUME 
3752    `~(u0 = u1:real^3) /\ ~(u0 = u2) /\ ~(u0 = u3) /\ ~(u1 = u2) /\
3753     ~(u1 = u3) /\ ~(u2 = u3)`]);
3754  (UP_ASM_TAC THEN MESON_TAC[]);
3755  (EXPAND_TAC "S1" THEN REWRITE_TAC[SUM_SING]);
3756
3757 (* ========================================================================= *)
3758
3759  (REWRITE_WITH `f {u0, u1:real^3} = lmfun (y1 / &2) * dih_y y1 y2 y3 y4 y5 y6`);
3760  (EXPAND_TAC "f");
3761
3762  (ABBREV_TAC `g = (\u v. if {u, v:real^3} IN edgeX V X
3763                           then dihX V X (u,v) * lmfun (hl [u; v])
3764                           else &0)`);
3765  (REWRITE_WITH `(\({u, v}). if {u, v} IN edgeX V X
3766              then dihX V X (u,v) * lmfun (hl [u; v])
3767              else &0) = (\({u, v:real^3}). g u v)`);
3768  (EXPAND_TAC "g" THEN REWRITE_TAC[]);
3769  (REWRITE_WITH `(\({u, v:real^3}). g u v) {u0, u1} = (g u0 u1):real`);
3770  (MATCH_MP_TAC BETA_PAIR_THM);
3771  (REPEAT STRIP_TAC THEN EXPAND_TAC "g" );
3772  (COND_CASES_TAC);
3773  (COND_CASES_TAC);
3774  (REWRITE_WITH `dihX V X (u,v) = dihX V X (v,u)`);
3775  (MATCH_MP_TAC Marchal_cells_3.DIHX_SYM);
3776  (REWRITE_TAC[mcell_set; IN_ELIM_THM]);
3777  (ASM_REWRITE_TAC[IN]);
3778  (EXISTS_TAC `i:num` THEN EXISTS_TAC `ul:(real^3)list` THEN ASM_REWRITE_TAC[]);
3779  (REWRITE_TAC[HL; set_of_list; SET_RULE `{a,b} = {b,a}`]);
3780  (NEW_GOAL `F`);
3781  (UP_ASM_TAC THEN REWRITE_TAC[]);
3782  (ONCE_REWRITE_TAC[SET_RULE `{a,b} = {b,a}`]);
3783  (ASM_REWRITE_TAC[]);
3784  (UP_ASM_TAC THEN MESON_TAC[]);
3785  (COND_CASES_TAC);
3786  (NEW_GOAL `F`);
3787  (UP_ASM_TAC THEN REWRITE_TAC[]);
3788  (ONCE_REWRITE_TAC[SET_RULE `{a,b} = {b,a}`]);
3789  (ASM_REWRITE_TAC[]);
3790  (UP_ASM_TAC THEN MESON_TAC[]);
3791  (REFL_TAC);
3792  (EXPAND_TAC "g");
3793  (COND_CASES_TAC);
3794  (REWRITE_TAC[HL_2; REAL_ARITH  `inv(&2) * a = a / &2`]);
3795  (REWRITE_TAC[REAL_ARITH ` t * lmfun(s) = lmfun(s) * t`]);
3796  (EXPAND_TAC "y1" THEN AP_TERM_TAC);
3797  (REWRITE_TAC[ASSUME `dist (u0,u1:real^3) = y1`]);
3798  (REWRITE_WITH 
3799    `dihX V X (u0,u1) = dih_y y1 y2 y3 y4 y5 y6 /\
3800     dihX V X (u0,u2) = dih_y y2 y3 y1 y5 y6 y4 /\
3801     dihX V X (u0,u3) = dih_y y3 y1 y2 y6 y4 y5 /\
3802     dihX V X (u2,u3) = dih_y y4 y3 y5 y1 y6 y2 /\
3803     dihX V X (u1,u3) = dih_y y5 y1 y6 y2 y4 y3 /\
3804     dihX V X (u1,u2) = dih_y y6 y1 y5 y3 y4 y2`);
3805  (MATCH_MP_TAC DIHX_DIH_Y_lemma);
3806  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
3807  (ASM_REWRITE_TAC[]);
3808
3809  (NEW_GOAL `F`);
3810  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
3811  (SET_TAC[]);
3812  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
3813
3814 (* ========================================================================= *)
3815
3816  (REWRITE_WITH `f {u0, u2:real^3} = lmfun (y2 / &2) * dih_y y2 y3 y1 y5 y6 y4`);
3817  (EXPAND_TAC "f");
3818  (ABBREV_TAC `g = (\u v. if {u, v:real^3} IN edgeX V X
3819                           then dihX V X (u,v) * lmfun (hl [u; v])
3820                           else &0)`);
3821  (REWRITE_WITH `(\({u, v}). if {u, v} IN edgeX V X
3822              then dihX V X (u,v) * lmfun (hl [u; v])
3823              else &0) = (\({u, v:real^3}). g u v)`);
3824  (EXPAND_TAC "g" THEN REWRITE_TAC[]);
3825  (REWRITE_WITH `(\({u, v:real^3}). g u v) {u0, u2} = (g u0 u2):real`);
3826  (MATCH_MP_TAC BETA_PAIR_THM);
3827  (REPEAT STRIP_TAC THEN EXPAND_TAC "g" );
3828  (COND_CASES_TAC);
3829  (COND_CASES_TAC);
3830  (REWRITE_WITH `dihX V X (u,v) = dihX V X (v,u)`);
3831  (MATCH_MP_TAC Marchal_cells_3.DIHX_SYM);
3832  (REWRITE_TAC[mcell_set; IN_ELIM_THM]);
3833  (ASM_REWRITE_TAC[IN]);
3834  (EXISTS_TAC `i:num` THEN EXISTS_TAC `ul:(real^3)list` THEN ASM_REWRITE_TAC[]);
3835  (REWRITE_TAC[HL; set_of_list; SET_RULE `{a,b} = {b,a}`]);
3836  (NEW_GOAL `F`);
3837  (UP_ASM_TAC THEN REWRITE_TAC[]);
3838  (ONCE_REWRITE_TAC[SET_RULE `{a,b} = {b,a}`]);
3839  (ASM_REWRITE_TAC[]);
3840  (UP_ASM_TAC THEN MESON_TAC[]);
3841  (COND_CASES_TAC);
3842  (NEW_GOAL `F`);
3843  (UP_ASM_TAC THEN REWRITE_TAC[]);
3844  (ONCE_REWRITE_TAC[SET_RULE `{a,b} = {b,a}`]);
3845  (ASM_REWRITE_TAC[]);
3846  (UP_ASM_TAC THEN MESON_TAC[]);
3847  (REFL_TAC);
3848  (EXPAND_TAC "g");
3849  (COND_CASES_TAC);
3850  (REWRITE_TAC[HL_2; REAL_ARITH  `inv(&2) * a = a / &2`]);
3851  (REWRITE_TAC[REAL_ARITH ` t * lmfun(s) = lmfun(s) * t`]);
3852  (EXPAND_TAC "y2" THEN AP_TERM_TAC);
3853  (REWRITE_TAC[ASSUME `dist (u0,u2:real^3) = y2`]);
3854  (REWRITE_WITH 
3855    `dihX V X (u0,u1) = dih_y y1 y2 y3 y4 y5 y6 /\
3856     dihX V X (u0,u2) = dih_y y2 y3 y1 y5 y6 y4 /\
3857     dihX V X (u0,u3) = dih_y y3 y1 y2 y6 y4 y5 /\
3858     dihX V X (u2,u3) = dih_y y4 y3 y5 y1 y6 y2 /\
3859     dihX V X (u1,u3) = dih_y y5 y1 y6 y2 y4 y3 /\
3860     dihX V X (u1,u2) = dih_y y6 y1 y5 y3 y4 y2`);
3861  (MATCH_MP_TAC DIHX_DIH_Y_lemma);
3862  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
3863  (ASM_REWRITE_TAC[]);
3864
3865  (NEW_GOAL `F`);
3866  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
3867  (EXPAND_TAC "S5" THEN SET_TAC[]);
3868  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
3869
3870 (* ========================================================================= *)
3871
3872  (REWRITE_WITH `f {u0, u3:real^3} = lmfun (y3 / &2) * dih_y y3 y1 y2 y6 y4 y5`);
3873  (EXPAND_TAC "f");
3874  (ABBREV_TAC `g = (\u v. if {u, v:real^3} IN edgeX V X
3875                           then dihX V X (u,v) * lmfun (hl [u; v])
3876                           else &0)`);
3877  (REWRITE_WITH `(\({u, v}). if {u, v} IN edgeX V X
3878              then dihX V X (u,v) * lmfun (hl [u; v])
3879              else &0) = (\({u, v:real^3}). g u v)`);
3880  (EXPAND_TAC "g" THEN REWRITE_TAC[]);
3881  (REWRITE_WITH `(\({u, v:real^3}). g u v) {u0, u3} = (g u0 u3):real`);
3882  (MATCH_MP_TAC BETA_PAIR_THM);
3883  (REPEAT STRIP_TAC THEN EXPAND_TAC "g" );
3884  (COND_CASES_TAC);
3885  (COND_CASES_TAC);
3886  (REWRITE_WITH `dihX V X (u,v) = dihX V X (v,u)`);
3887  (MATCH_MP_TAC Marchal_cells_3.DIHX_SYM);
3888  (REWRITE_TAC[mcell_set; IN_ELIM_THM]);
3889  (ASM_REWRITE_TAC[IN]);
3890  (EXISTS_TAC `i:num` THEN EXISTS_TAC `ul:(real^3)list` THEN ASM_REWRITE_TAC[]);
3891  (REWRITE_TAC[HL; set_of_list; SET_RULE `{a,b} = {b,a}`]);
3892  (NEW_GOAL `F`);
3893  (UP_ASM_TAC THEN REWRITE_TAC[]);
3894  (ONCE_REWRITE_TAC[SET_RULE `{a,b} = {b,a}`]);
3895  (ASM_REWRITE_TAC[]);
3896  (UP_ASM_TAC THEN MESON_TAC[]);
3897  (COND_CASES_TAC);
3898  (NEW_GOAL `F`);
3899  (UP_ASM_TAC THEN REWRITE_TAC[]);
3900  (ONCE_REWRITE_TAC[SET_RULE `{a,b} = {b,a}`]);
3901  (ASM_REWRITE_TAC[]);
3902  (UP_ASM_TAC THEN MESON_TAC[]);
3903  (REFL_TAC);
3904  (EXPAND_TAC "g");
3905  (COND_CASES_TAC);
3906  (REWRITE_TAC[HL_2; REAL_ARITH  `inv(&2) * a = a / &2`]);
3907  (REWRITE_TAC[REAL_ARITH ` t * lmfun(s) = lmfun(s) * t`]);
3908  (EXPAND_TAC "y3" THEN AP_TERM_TAC);
3909  (REWRITE_TAC[ASSUME `dist (u0,u3:real^3) = y3`]);
3910  (REWRITE_WITH 
3911    `dihX V X (u0,u1) = dih_y y1 y2 y3 y4 y5 y6 /\
3912     dihX V X (u0,u2) = dih_y y2 y3 y1 y5 y6 y4 /\
3913     dihX V X (u0,u3) = dih_y y3 y1 y2 y6 y4 y5 /\
3914     dihX V X (u2,u3) = dih_y y4 y3 y5 y1 y6 y2 /\
3915     dihX V X (u1,u3) = dih_y y5 y1 y6 y2 y4 y3 /\
3916     dihX V X (u1,u2) = dih_y y6 y1 y5 y3 y4 y2`);
3917  (MATCH_MP_TAC DIHX_DIH_Y_lemma);
3918  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
3919  (ASM_REWRITE_TAC[]);
3920
3921  (NEW_GOAL `F`);
3922  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
3923  (EXPAND_TAC "S5" THEN EXPAND_TAC "S4" THEN SET_TAC[]);
3924  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
3925
3926 (* ========================================================================= *)
3927
3928  (REWRITE_WITH `f {u2, u3:real^3} = lmfun (y4 / &2) * dih_y y4 y3 y5 y1 y6 y2`);
3929  (EXPAND_TAC "f");
3930  (ABBREV_TAC `g = (\u v. if {u, v:real^3} IN edgeX V X
3931                           then dihX V X (u,v) * lmfun (hl [u; v])
3932                           else &0)`);
3933  (REWRITE_WITH `(\({u, v}). if {u, v} IN edgeX V X
3934              then dihX V X (u,v) * lmfun (hl [u; v])
3935              else &0) = (\({u, v:real^3}). g u v)`);
3936  (EXPAND_TAC "g" THEN REWRITE_TAC[]);
3937  (REWRITE_WITH `(\({u, v:real^3}). g u v) {u2, u3} = (g u2 u3):real`);
3938  (MATCH_MP_TAC BETA_PAIR_THM);
3939  (REPEAT STRIP_TAC THEN EXPAND_TAC "g" );
3940  (COND_CASES_TAC);
3941  (COND_CASES_TAC);
3942  (REWRITE_WITH `dihX V X (u,v) = dihX V X (v,u)`);
3943  (MATCH_MP_TAC Marchal_cells_3.DIHX_SYM);
3944  (REWRITE_TAC[mcell_set; IN_ELIM_THM]);
3945  (ASM_REWRITE_TAC[IN]);
3946  (EXISTS_TAC `i:num` THEN EXISTS_TAC `ul:(real^3)list` THEN ASM_REWRITE_TAC[]);
3947  (REWRITE_TAC[HL; set_of_list; SET_RULE `{a,b} = {b,a}`]);
3948  (NEW_GOAL `F`);
3949  (UP_ASM_TAC THEN REWRITE_TAC[]);
3950  (ONCE_REWRITE_TAC[SET_RULE `{a,b} = {b,a}`]);
3951  (ASM_REWRITE_TAC[]);
3952  (UP_ASM_TAC THEN MESON_TAC[]);
3953  (COND_CASES_TAC);
3954  (NEW_GOAL `F`);
3955  (UP_ASM_TAC THEN REWRITE_TAC[]);
3956  (ONCE_REWRITE_TAC[SET_RULE `{a,b} = {b,a}`]);
3957  (ASM_REWRITE_TAC[]);
3958  (UP_ASM_TAC THEN MESON_TAC[]);
3959  (REFL_TAC);
3960  (EXPAND_TAC "g");
3961  (COND_CASES_TAC);
3962  (REWRITE_TAC[HL_2; REAL_ARITH  `inv(&2) * a = a / &2`]);
3963  (REWRITE_TAC[REAL_ARITH ` t * lmfun(s) = lmfun(s) * t`]);
3964  (EXPAND_TAC "y4" THEN AP_TERM_TAC);
3965
3966  (REWRITE_TAC[ASSUME `dist (u2,u3:real^3) = y4`]);
3967  (REWRITE_WITH 
3968    `dihX V X (u0,u1) = dih_y y1 y2 y3 y4 y5 y6 /\
3969     dihX V X (u0,u2) = dih_y y2 y3 y1 y5 y6 y4 /\
3970     dihX V X (u0,u3) = dih_y y3 y1 y2 y6 y4 y5 /\
3971     dihX V X (u2,u3) = dih_y y4 y3 y5 y1 y6 y2 /\
3972     dihX V X (u1,u3) = dih_y y5 y1 y6 y2 y4 y3 /\
3973     dihX V X (u1,u2) = dih_y y6 y1 y5 y3 y4 y2`);
3974  (MATCH_MP_TAC DIHX_DIH_Y_lemma);
3975  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
3976  (ASM_REWRITE_TAC[]);
3977
3978  (NEW_GOAL `F`);
3979  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
3980  (EXPAND_TAC "S5" THEN EXPAND_TAC "S4" THEN EXPAND_TAC "S3" THEN 
3981    EXPAND_TAC "S2" THEN EXPAND_TAC "S1"THEN SET_TAC[]);
3982  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
3983
3984 (* ========================================================================= *)
3985
3986  (REWRITE_WITH `f {u1, u3:real^3} = lmfun (y5 / &2) * dih_y y5 y1 y6 y2 y4 y3`);
3987  (EXPAND_TAC "f");
3988  (ABBREV_TAC `g = (\u v. if {u, v:real^3} IN edgeX V X
3989                           then dihX V X (u,v) * lmfun (hl [u; v])
3990                           else &0)`);
3991  (REWRITE_WITH `(\({u, v}). if {u, v} IN edgeX V X
3992              then dihX V X (u,v) * lmfun (hl [u; v])
3993              else &0) = (\({u, v:real^3}). g u v)`);
3994  (EXPAND_TAC "g" THEN REWRITE_TAC[]);
3995  (REWRITE_WITH `(\({u, v:real^3}). g u v) {u1, u3} = (g u1 u3):real`);
3996  (MATCH_MP_TAC BETA_PAIR_THM);
3997  (REPEAT STRIP_TAC THEN EXPAND_TAC "g" );
3998  (COND_CASES_TAC);
3999  (COND_CASES_TAC);
4000  (REWRITE_WITH `dihX V X (u,v) = dihX V X (v,u)`);
4001  (MATCH_MP_TAC Marchal_cells_3.DIHX_SYM);
4002  (REWRITE_TAC[mcell_set; IN_ELIM_THM]);
4003  (ASM_REWRITE_TAC[IN]);
4004  (EXISTS_TAC `i:num` THEN EXISTS_TAC `ul:(real^3)list` THEN ASM_REWRITE_TAC[]);
4005  (REWRITE_TAC[HL; set_of_list; SET_RULE `{a,b} = {b,a}`]);
4006  (NEW_GOAL `F`);
4007  (UP_ASM_TAC THEN REWRITE_TAC[]);
4008  (ONCE_REWRITE_TAC[SET_RULE `{a,b} = {b,a}`]);
4009  (ASM_REWRITE_TAC[]);
4010  (UP_ASM_TAC THEN MESON_TAC[]);
4011  (COND_CASES_TAC);
4012  (NEW_GOAL `F`);
4013  (UP_ASM_TAC THEN REWRITE_TAC[]);
4014  (ONCE_REWRITE_TAC[SET_RULE `{a,b} = {b,a}`]);
4015  (ASM_REWRITE_TAC[]);
4016  (UP_ASM_TAC THEN MESON_TAC[]);
4017  (REFL_TAC);
4018  (EXPAND_TAC "g");
4019  (COND_CASES_TAC);
4020  (REWRITE_TAC[HL_2; REAL_ARITH  `inv(&2) * a = a / &2`]);
4021  (REWRITE_TAC[REAL_ARITH ` t * lmfun(s) = lmfun(s) * t`]);
4022  (EXPAND_TAC "y5" THEN AP_TERM_TAC);
4023
4024  (REWRITE_TAC[ASSUME `dist (u1,u3:real^3) = y5`]);
4025  (REWRITE_WITH 
4026    `dihX V X (u0,u1) = dih_y y1 y2 y3 y4 y5 y6 /\
4027     dihX V X (u0,u2) = dih_y y2 y3 y1 y5 y6 y4 /\
4028     dihX V X (u0,u3) = dih_y y3 y1 y2 y6 y4 y5 /\
4029     dihX V X (u2,u3) = dih_y y4 y3 y5 y1 y6 y2 /\
4030     dihX V X (u1,u3) = dih_y y5 y1 y6 y2 y4 y3 /\
4031     dihX V X (u1,u2) = dih_y y6 y1 y5 y3 y4 y2`);
4032  (MATCH_MP_TAC DIHX_DIH_Y_lemma);
4033  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
4034  (ASM_REWRITE_TAC[]);
4035
4036  (NEW_GOAL `F`);
4037  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
4038  (EXPAND_TAC "S5" THEN EXPAND_TAC "S4" THEN EXPAND_TAC "S3" THEN 
4039    EXPAND_TAC "S2" THEN EXPAND_TAC "S1"THEN SET_TAC[]);
4040  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
4041
4042 (* ========================================================================= *)
4043
4044  (REWRITE_WITH `f {u1, u2:real^3} =  lmfun (y6 / &2) * dih_y y6 y1 y5 y3 y4 y2`);
4045  (EXPAND_TAC "f");
4046  (ABBREV_TAC `g = (\u v. if {u, v:real^3} IN edgeX V X
4047                           then dihX V X (u,v) * lmfun (hl [u; v])
4048                           else &0)`);
4049  (REWRITE_WITH `(\({u, v}). if {u, v} IN edgeX V X
4050              then dihX V X (u,v) * lmfun (hl [u; v])
4051              else &0) = (\({u, v:real^3}). g u v)`);
4052  (EXPAND_TAC "g" THEN REWRITE_TAC[]);
4053  (REWRITE_WITH `(\({u, v:real^3}). g u v) {u1, u2} = (g u1 u2):real`);
4054  (MATCH_MP_TAC BETA_PAIR_THM);
4055  (REPEAT STRIP_TAC THEN EXPAND_TAC "g" );
4056  (COND_CASES_TAC);
4057  (COND_CASES_TAC);
4058  (REWRITE_WITH `dihX V X (u,v) = dihX V X (v,u)`);
4059  (MATCH_MP_TAC Marchal_cells_3.DIHX_SYM);
4060  (REWRITE_TAC[mcell_set; IN_ELIM_THM]);
4061  (ASM_REWRITE_TAC[IN]);
4062  (EXISTS_TAC `i:num` THEN EXISTS_TAC `ul:(real^3)list` THEN ASM_REWRITE_TAC[]);
4063  (REWRITE_TAC[HL; set_of_list; SET_RULE `{a,b} = {b,a}`]);
4064  (NEW_GOAL `F`);
4065  (UP_ASM_TAC THEN REWRITE_TAC[]);
4066  (ONCE_REWRITE_TAC[SET_RULE `{a,b} = {b,a}`]);
4067  (ASM_REWRITE_TAC[]);
4068  (UP_ASM_TAC THEN MESON_TAC[]);
4069  (COND_CASES_TAC);
4070  (NEW_GOAL `F`);
4071  (UP_ASM_TAC THEN REWRITE_TAC[]);
4072  (ONCE_REWRITE_TAC[SET_RULE `{a,b} = {b,a}`]);
4073  (ASM_REWRITE_TAC[]);
4074  (UP_ASM_TAC THEN MESON_TAC[]);
4075  (REFL_TAC);
4076  (EXPAND_TAC "g");
4077  (COND_CASES_TAC);
4078  (REWRITE_TAC[HL_2; REAL_ARITH  `inv(&2) * a = a / &2`]);
4079  (REWRITE_TAC[REAL_ARITH ` t * lmfun(s) = lmfun(s) * t`]);
4080  (EXPAND_TAC "y6" THEN AP_TERM_TAC);
4081
4082  (REWRITE_TAC[ASSUME `dist (u1,u2:real^3) = y6`]);
4083  (REWRITE_WITH 
4084    `dihX V X (u0,u1) = dih_y y1 y2 y3 y4 y5 y6 /\
4085     dihX V X (u0,u2) = dih_y y2 y3 y1 y5 y6 y4 /\
4086     dihX V X (u0,u3) = dih_y y3 y1 y2 y6 y4 y5 /\
4087     dihX V X (u2,u3) = dih_y y4 y3 y5 y1 y6 y2 /\
4088     dihX V X (u1,u3) = dih_y y5 y1 y6 y2 y4 y3 /\
4089     dihX V X (u1,u2) = dih_y y6 y1 y5 y3 y4 y2`);
4090  (MATCH_MP_TAC DIHX_DIH_Y_lemma);
4091  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
4092  (ASM_REWRITE_TAC[]);
4093
4094  (NEW_GOAL `F`);
4095  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
4096  (EXPAND_TAC "S5" THEN EXPAND_TAC "S4" THEN EXPAND_TAC "S3" THEN 
4097    EXPAND_TAC "S2" THEN EXPAND_TAC "S1"THEN SET_TAC[]);
4098  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
4099
4100 (* ==================================== *)
4101  (REAL_ARITH_TAC);
4102  (AP_TERM_TAC);
4103
4104  (REWRITE_TAC[total_solid]);
4105  (REWRITE_TAC[ASSUME `VX V X = {u0,u1,u2,u3}`]);
4106  (ABBREV_TAC `h = (\x. sol x X)`);
4107
4108  (ABBREV_TAC `S3 = {u1,u2,u3:real^3}`);
4109  (REWRITE_WITH `sum (u0:real^3 INSERT S3) h = 
4110    (if u0 IN S3 then sum S3 h else h u0 + sum S3 h)`);
4111  (MATCH_MP_TAC Marchal_cells_2_new.SUM_CLAUSES_alt);
4112  (EXPAND_TAC "S3");
4113  (REWRITE_TAC[Geomdetail.FINITE6]);
4114  (COND_CASES_TAC);
4115  (NEW_GOAL `F`);
4116  (UP_ASM_TAC THEN EXPAND_TAC "S3");
4117  (REWRITE_TAC[SET_RULE `x IN {a,b,c} <=> x=a\/x=b\/x=c`]);
4118  (SET_TAC[ASSUME 
4119    `~(u0 = u1:real^3) /\ ~(u0 = u2) /\ ~(u0 = u3) /\ ~(u1 = u2) /\
4120     ~(u1 = u3) /\ ~(u2 = u3)`]);
4121  (UP_ASM_TAC THEN MESON_TAC[]);
4122
4123  (EXPAND_TAC "S3");
4124  (ABBREV_TAC `S2 = {u2,u3:real^3}`);
4125  (REWRITE_WITH `sum (u1:real^3 INSERT S2) h = 
4126    (if u1 IN S2 then sum S2 h else h u1 + sum S2 h)`);
4127  (MATCH_MP_TAC Marchal_cells_2_new.SUM_CLAUSES_alt);
4128  (EXPAND_TAC "S2");
4129  (REWRITE_TAC[Geomdetail.FINITE6]);
4130  (COND_CASES_TAC);
4131  (NEW_GOAL `F`);
4132  (UP_ASM_TAC THEN EXPAND_TAC "S2");
4133  (REWRITE_TAC[SET_RULE `x IN {a,b} <=> x = a \/ x = b`]);
4134  (SET_TAC[ASSUME 
4135    `~(u0 = u1:real^3) /\ ~(u0 = u2) /\ ~(u0 = u3) /\ ~(u1 = u2) /\
4136     ~(u1 = u3) /\ ~(u2 = u3)`]);
4137  (UP_ASM_TAC THEN MESON_TAC[]);
4138
4139  (EXPAND_TAC "S2");
4140  (ABBREV_TAC `S1 = {u3:real^3}`);
4141  (REWRITE_WITH `sum (u2:real^3 INSERT S1) h = 
4142    (if u2 IN S1 then sum S1 h else h u2 + sum S1 h)`);
4143  (MATCH_MP_TAC Marchal_cells_2_new.SUM_CLAUSES_alt);
4144  (EXPAND_TAC "S1");
4145  (REWRITE_TAC[Geomdetail.FINITE6]);
4146  (COND_CASES_TAC);
4147  (NEW_GOAL `F`);
4148  (UP_ASM_TAC THEN EXPAND_TAC "S1");
4149  (REWRITE_TAC[SET_RULE `x IN {a} <=> x = a`]);
4150  (SET_TAC[ASSUME 
4151    `~(u0 = u1:real^3) /\ ~(u0 = u2) /\ ~(u0 = u3) /\ ~(u1 = u2) /\
4152     ~(u1 = u3) /\ ~(u2 = u3)`]);
4153  (UP_ASM_TAC THEN MESON_TAC[]);
4154
4155  (EXPAND_TAC "S1" THEN REWRITE_TAC[SUM_SING]);
4156  (EXPAND_TAC "h" THEN REWRITE_TAC[BETA_THM]);
4157
4158  (REWRITE_WITH 
4159             `sol u0 X = sol_y y1 y2 y3 y4 y5 y6 /\
4160              sol u1 X = sol_y y1 y5 y6 y4 y2 y3 /\
4161              sol u2 X = sol_y y4 y2 y6 y1 y5 y3 /\
4162              sol u3 X = sol_y y4 y5 y3 y1 y2 y6`);
4163  (MATCH_MP_TAC SOL_SOL_Y_EXPLICIT);
4164  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `ul:(real^3)list` THEN
4165    EXISTS_TAC `i:num`);
4166  (ASM_REWRITE_TAC[]);
4167  (REAL_ARITH_TAC);
4168
4169  (STRIP_TAC THEN NEW_GOAL `F`);
4170  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
4171  (UP_ASM_TAC THEN ASM_REWRITE_TAC[])]);;
4172
4173 (* ---------------------------------------------------------------------- *)
4174
4175
4176 (* ====================================================================== *)
4177
4178 let gammaX_gamma3f = prove_by_refinement (
4179  `!V X ul u0 u1 u2 u3 y4 y5 y6.
4180      saturated V /\
4181      packing V /\
4182      barV V 3 ul /\
4183      X = mcell 3 V ul /\
4184      ~NULLSET X /\
4185      ul = [u0; u1; u2; u3] /\
4186      dist (u1, u2) = y4 /\
4187      dist (u0, u2) = y5 /\
4188      dist (u0, u1) = y6
4189      ==> 
4190       vol X = vol_y sqrt2 sqrt2 sqrt2 y4 y5 y6 /\
4191       sol u0 X = sol_y y5 y6 sqrt2 sqrt2 sqrt2 y4 /\
4192       sol u1 X = sol_y y6 y4 sqrt2 sqrt2 sqrt2 y5 /\
4193       sol u2 X = sol_y y4 y5 sqrt2 sqrt2 sqrt2 y6 /\
4194       dihX V X (u0,u1) = dih_y y6 y4 sqrt2 sqrt2 sqrt2 y5 /\
4195       dihX V X (u0,u2) = dih_y y5 y6 sqrt2 sqrt2 sqrt2 y4 /\
4196       dihX V X (u1,u2) = dih_y y4 y5 sqrt2 sqrt2 sqrt2 y6 /\
4197       gammaX V X lmfun = gamma3f y4 y5 y6 sqrt2 lmfun`,
4198 [(REPEAT GEN_TAC THEN STRIP_TAC);
4199
4200  (NEW_GOAL `~(X:real^3->bool = {})`);
4201  (STRIP_TAC THEN UNDISCH_TAC `~NULLSET X` THEN 
4202    REWRITE_TAC[ASSUME `X:real^3->bool = {}`; NEGLIGIBLE_EMPTY]);
4203
4204  (NEW_GOAL `X = mcell3 V ul`);
4205  (ASM_REWRITE_TAC[]);
4206  (ASM_SIMP_TAC[MCELL_EXPLICIT]);
4207  (UP_ASM_TAC THEN REWRITE_TAC[mcell3]);
4208  (COND_CASES_TAC);
4209  (STRIP_TAC);
4210
4211  (NEW_GOAL `(?s. between s (omega_list_n V ul 2,omega_list_n V ul 3) /\
4212                   dist (u0,s) = sqrt (&2) /\
4213                   mxi V ul = s)`);
4214  (MATCH_MP_TAC MXI_EXPLICIT);
4215  (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
4216  (ASM_REWRITE_TAC[]);
4217  (UP_ASM_TAC THEN STRIP_TAC);
4218  (ABBREV_TAC `s2 = omega_list_n V ul 2`);
4219  (ABBREV_TAC `s3 = omega_list_n V ul 3`);
4220  (ABBREV_TAC `vl = truncate_simplex 2 (ul:(real^3)list)`);
4221  (NEW_GOAL `s2 IN voronoi_list V vl`);
4222  (EXPAND_TAC "s2" THEN EXPAND_TAC "vl");
4223  (MATCH_MP_TAC Rogers.OMEGA_LIST_N_IN_VORONOI_LIST_GEN);
4224  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
4225  (ARITH_TAC);
4226
4227  (NEW_GOAL `s3 IN voronoi_list V vl`);
4228  (EXPAND_TAC "s3" THEN EXPAND_TAC "vl");
4229  (MATCH_MP_TAC Rogers.OMEGA_LIST_N_IN_VORONOI_LIST_GEN);
4230  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
4231  (ARITH_TAC);
4232
4233  (NEW_GOAL `s IN voronoi_list V vl`);
4234  (MATCH_MP_TAC (SET_RULE `(?x. s IN x /\ x SUBSET t)==> s IN t`));
4235  (EXISTS_TAC `convex hull {s2,s3:real^3}`);
4236  (STRIP_TAC);
4237  (ASM_REWRITE_TAC[GSYM BETWEEN_IN_CONVEX_HULL]);
4238  (NEW_GOAL `voronoi_list V vl = convex hull (voronoi_list V vl)`);
4239  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4240  (REWRITE_TAC[CONVEX_HULL_EQ; Packing3.CONVEX_VORONOI_LIST]);
4241  (ONCE_REWRITE_TAC[ASSUME `voronoi_list V vl = convex hull voronoi_list V vl`]);
4242  (MATCH_MP_TAC Marchal_cells.CONVEX_HULL_SUBSET);
4243  (ASM_SET_TAC[]);
4244
4245  (MP_TAC (ASSUME `s IN voronoi_list V vl`));
4246  (EXPAND_TAC "vl" THEN REWRITE_TAC[ASSUME `ul = [u0;u1;u2;u3:real^3]`;
4247    TRUNCATE_SIMPLEX_EXPLICIT_2; VORONOI_LIST; VORONOI_SET; set_of_list;
4248    SET_RULE `x IN {a,b,c} <=> x=a\/x=b\/x=c`; IN_INTERS]);
4249  (STRIP_TAC);
4250  (NEW_GOAL `s IN voronoi_closed V u0 /\ s IN voronoi_closed V u1 /\ 
4251              s IN voronoi_closed V (u2:real^3)`);
4252  (UP_ASM_TAC THEN SET_TAC[]);
4253  (UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM] THEN
4254    STRIP_TAC);
4255
4256  (NEW_GOAL `u0 IN V /\ u1 IN V /\ u2 IN V /\ (u3:real^3) IN V`);
4257  (REWRITE_TAC[SET_RULE `u0 IN V /\ u1 IN V /\ u2 IN V /\ (u3:real^3) IN V <=>
4258                          {u0,u1,u2,u3} SUBSET V`; GSYM set_of_list; GSYM 
4259                          (ASSUME `ul = [u0;u1;u2;u3:real^3]`)]);
4260  (MATCH_MP_TAC BARV_SUBSET);
4261  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
4262  (FIRST_ASSUM MP_TAC THEN REWRITE_TAC[IN] THEN STRIP_TAC);
4263
4264  (NEW_GOAL `dist (s,u1:real^3) = sqrt(&2)`);
4265  (REWRITE_TAC[GSYM (ASSUME `dist (u0:real^3, s) = sqrt (&2)`)]);
4266  (REWRITE_WITH `dist (u0,s:real^3) = dist (s,u0)`);
4267  (NORM_ARITH_TAC);
4268  (REWRITE_TAC[REAL_ARITH `a = b <=> a <= b /\ b <= a`]);
4269  (ASM_SIMP_TAC[]);
4270  (NEW_GOAL `dist (s,u2:real^3) = sqrt(&2)`);
4271  (REWRITE_TAC[GSYM (ASSUME `dist (u0:real^3, s) = sqrt (&2)`)]);
4272  (REWRITE_WITH `dist (u0,s:real^3) = dist (s,u0)`);
4273  (NORM_ARITH_TAC);
4274  (REWRITE_TAC[REAL_ARITH `a = b <=> a <= b /\ b <= a`]);
4275  (ASM_SIMP_TAC[]);
4276
4277  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} = 4`);
4278  (REWRITE_TAC[ARITH_RULE `4 = 3 + 1`; GSYM set_of_list;
4279    GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`)]);
4280  (MATCH_MP_TAC Marchal_cells_3.BARV_CARD_LEMMA);
4281  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4282  (NEW_GOAL `~(u0 = u1:real^3) /\ ~(u0 = u2) /\ ~(u0 = u3) /\ 
4283              ~(u1 = u2) /\ ~(u1 = u3) /\ ~(u2 = u3)`);
4284  (REPEAT STRIP_TAC);
4285  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
4286  (REWRITE_TAC[ASSUME `u0 = u1:real^3`; 
4287    SET_RULE `{u1, u1, u2, u3} = {u1,u2,u3}`;Geomdetail.CARD3 ]);
4288  (ASM_ARITH_TAC);
4289  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
4290  (REWRITE_TAC[ASSUME `u0 = u2:real^3`; 
4291    SET_RULE `{u2, u1, u2, u3} = {u1,u2,u3}`;Geomdetail.CARD3 ]);
4292  (ASM_ARITH_TAC);
4293  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
4294  (REWRITE_TAC[ASSUME `u0 = u3:real^3`; 
4295    SET_RULE `{u3, u1, u2, u3} = {u1,u2,u3}`;Geomdetail.CARD3 ]);
4296  (ASM_ARITH_TAC);
4297  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
4298  (REWRITE_TAC[ASSUME `u1 = u2:real^3`; 
4299    SET_RULE `{u0, u2, u2, u3} = {u0,u2,u3}`;Geomdetail.CARD3 ]);
4300  (ASM_ARITH_TAC);
4301  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
4302  (REWRITE_TAC[ASSUME `u1 = u3:real^3`; 
4303    SET_RULE `{u0, u3, u2, u3} = {u0,u2,u3}`;Geomdetail.CARD3 ]);
4304  (ASM_ARITH_TAC);
4305  (NEW_GOAL `CARD {u0, u1, u2, u3:real^3} <= 3`);
4306  (REWRITE_TAC[ASSUME `u2 = u3:real^3`; 
4307    SET_RULE `{u0, u1, u3, u3} = {u0,u1,u3}`;Geomdetail.CARD3 ]);
4308  (ASM_ARITH_TAC);
4309
4310
4311  (NEW_GOAL `VX V X = {u0,u1,u2}`);
4312  (REWRITE_WITH `VX V X = V INTER X`);
4313  (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
4314  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `3`);
4315  (ASM_REWRITE_TAC[]);
4316  (REWRITE_WITH `X = mcell 3 V ul`);
4317  (ASM_REWRITE_TAC[]);
4318  (REWRITE_WITH 
4319   `V INTER mcell 3 V ul = set_of_list (truncate_simplex (3 - 1) ul)`);
4320  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
4321  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 3 /\ 3 <= 4`]);
4322  (REWRITE_WITH ` mcell 3 V [u0; u1; u2; u3] = X`);
4323  (ASM_REWRITE_TAC[]);
4324  (ASM_REWRITE_TAC[]);
4325  (ASM_REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; TRUNCATE_SIMPLEX_EXPLICIT_2;
4326                    set_of_list]);
4327
4328  (UNDISCH_TAC `X = convex hull (set_of_list vl UNION {mxi V ul})`);
4329  (EXPAND_TAC "vl" THEN REWRITE_TAC[set_of_list; TRUNCATE_SIMPLEX_EXPLICIT_2;
4330    ASSUME `ul = [u0;u1;u2;u3:real^3]`;
4331    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
4332  (REWRITE_WITH `mxi V [u0; u1; u2; u3] = s`);
4333  (EXPAND_TAC "s" THEN AP_TERM_TAC THEN ASM_REWRITE_TAC[]);
4334  (STRIP_TAC);
4335
4336  (NEW_GOAL `~coplanar {u0,u1,u2,s:real^3}`);
4337  (ONCE_REWRITE_TAC[GSYM COPLANAR_AFFINE_HULL_COPLANAR]);
4338  (STRIP_TAC);
4339  (NEW_GOAL `NULLSET X`);
4340  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4341  (REWRITE_TAC[ASSUME `X = convex hull {u0, u1, u2, s:real^3}`]);
4342  (MATCH_MP_TAC COPLANAR_SUBSET);
4343  (EXISTS_TAC `affine hull {u0, u1, u2, s:real^3}`);
4344  (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4345  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
4346
4347  (NEW_GOAL `CARD {u0, u1, u2, s:real^3} = 4`);
4348  (NEW_GOAL `CARD {u0, u1, u2, s:real^3} <= 4`);
4349  (REWRITE_TAC[Geomdetail.CARD4]);
4350  (ASM_CASES_TAC `CARD {u0, u1, u2, s:real^3} <= 3`);
4351  (NEW_GOAL `F`);
4352  (UNDISCH_TAC `~coplanar {u0, u1, u2, s:real^3}`);
4353  (REWRITE_TAC[] THEN MATCH_MP_TAC COPLANAR_SMALL);
4354  (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
4355  (UP_ASM_TAC THEN MESON_TAC[]);
4356  (ASM_ARITH_TAC);
4357
4358  (NEW_GOAL `~(u0 = s:real^3) /\ ~(u1 = s) /\ ~(u2 = s)`);
4359  (REPEAT STRIP_TAC);
4360  (NEW_GOAL `CARD {u0, u1, u2,s:real^3} <= 3`);
4361  (REWRITE_TAC[ASSUME `u0 = s:real^3`; 
4362    SET_RULE `{s, u1, u2, s} = {s,u1,u2}`;Geomdetail.CARD3 ]);
4363  (ASM_ARITH_TAC);
4364  (NEW_GOAL `CARD {u0, u1, u2, s:real^3} <= 3`);
4365  (REWRITE_TAC[ASSUME `u1 = s:real^3`; 
4366    SET_RULE `{u0, s, u2, s} = {u0,u2,s}`;Geomdetail.CARD3 ]);
4367  (ASM_ARITH_TAC);
4368  (NEW_GOAL `CARD {u0, u1, u2, s:real^3} <= 3`);
4369  (REWRITE_TAC[ASSUME `u2 = s:real^3`; 
4370    SET_RULE `{u0, u1, s, s} = {u0,u1,s}`;Geomdetail.CARD3 ]);
4371  (ASM_ARITH_TAC);
4372
4373 (* ========================================================================= *)
4374
4375  (NEW_GOAL `vol X = vol_y sqrt2 sqrt2 sqrt2 y4 y5 y6`);
4376
4377  (REWRITE_TAC[vol_y; y_of_x; vol_x; 
4378    ASSUME `X = convex hull {u0, u1, u2, s:real^3}`]);
4379  (ONCE_REWRITE_TAC[SET_RULE `{u0, u1, u2,s} = {s, u0,u1, u2}`]);
4380  (REWRITE_TAC[VOLUME_OF_CLOSED_TETRAHEDRON; REAL_POW_2]);
4381  (ASM_REWRITE_TAC[]);
4382  (ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REWRITE_TAC[sqrt2]);
4383
4384  (REWRITE_TAC[gamma3f; gammaX; vol3r;vol3f]);
4385  (REWRITE_TAC[ASSUME `vol X = vol_y sqrt2 sqrt2 sqrt2 y4 y5 y6`]);
4386
4387
4388 (* ========================================================================= *)
4389
4390  (REWRITE_TAC[total_solid; ASSUME `VX V X = {u0,u1,u2:real^3}`]);
4391  (ABBREV_TAC `h = (\x. sol x X)`);
4392
4393  (ABBREV_TAC `S2 = {u1,u2:real^3}`);
4394  (REWRITE_WITH `sum (u0:real^3 INSERT S2) h = 
4395    (if u0 IN S2 then sum S2 h else h u0 + sum S2 h)`);
4396  (MATCH_MP_TAC Marchal_cells_2_new.SUM_CLAUSES_alt);
4397  (EXPAND_TAC "S2");
4398  (REWRITE_TAC[Geomdetail.FINITE6]);
4399  (COND_CASES_TAC);
4400  (NEW_GOAL `F`);
4401  (UP_ASM_TAC THEN EXPAND_TAC "S2");
4402  (REWRITE_TAC[SET_RULE `x IN {a,b} <=> x = a \/ x = b`]);
4403  (SET_TAC[ASSUME 
4404    `~(u0 = u1:real^3) /\ ~(u0 = u2) /\ ~(u0 = u3) /\ ~(u1 = u2) /\
4405     ~(u1 = u3) /\ ~(u2 = u3)`]);
4406  (UP_ASM_TAC THEN MESON_TAC[]);
4407
4408  (EXPAND_TAC "S2");
4409  (ABBREV_TAC `S1 = {u2:real^3}`);
4410  (REWRITE_WITH `sum (u1:real^3 INSERT S1) h = 
4411    (if u1 IN S1 then sum S1 h else h u1 + sum S1 h)`);
4412  (MATCH_MP_TAC Marchal_cells_2_new.SUM_CLAUSES_alt);
4413  (EXPAND_TAC "S1");
4414  (REWRITE_TAC[Geomdetail.FINITE6]);
4415  (COND_CASES_TAC);
4416  (NEW_GOAL `F`);
4417  (UP_ASM_TAC THEN EXPAND_TAC "S1");
4418  (REWRITE_TAC[SET_RULE `x IN {a} <=> x = a`]);
4419  (SET_TAC[ASSUME 
4420    `~(u0 = u1:real^3) /\ ~(u0 = u2) /\ ~(u0 = u3) /\ ~(u1 = u2) /\
4421     ~(u1 = u3) /\ ~(u2 = u3)`]);
4422  (UP_ASM_TAC THEN MESON_TAC[]);
4423
4424  (EXPAND_TAC "S1" THEN REWRITE_TAC[SUM_SING]);
4425  (EXPAND_TAC "h" THEN REWRITE_TAC[BETA_THM]);
4426
4427 (* ======================================================================== *)
4428
4429  (REWRITE_WITH `sol u0 X = sol_y y5 y6 sqrt2 sqrt2 sqrt2 y4`);
4430  (REWRITE_TAC[sol_y]);
4431  (REWRITE_WITH `dih_y y5 y6 sqrt2 sqrt2 sqrt2 y4 = dihV (u0:real^3) u2 u1 s`);
4432  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4433  (MP_TAC Merge_ineq.DIHV_EQ_DIH_Y);
4434  (REWRITE_TAC[LET_DEF; LET_END_DEF]);
4435  (EXPAND_TAC "y4");
4436  (EXPAND_TAC "y5");
4437  (EXPAND_TAC "y6");
4438  (STRIP_TAC);
4439  (REWRITE_WITH 
4440   `dih_y (dist (u0,u2)) (dist (u0,u1)) sqrt2 sqrt2 sqrt2 (dist (u1,u2)) =
4441    dih_y (dist (u0,u2)) (dist (u0,u1)) (dist (u0,s)) 
4442   (dist (u1,s)) (dist (u2,s)) (dist (u2,u1:real^3))`);
4443  (ASM_REWRITE_TAC[DIST_SYM; sqrt2]);
4444  (FIRST_ASSUM MATCH_MP_TAC);
4445  (STRIP_TAC);
4446
4447  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4448  (EXISTS_TAC `s:real^3`);
4449  (ONCE_REWRITE_TAC[SET_RULE `{u0,u2,u1,s} = {u0,u1,u2,s}`]);
4450  (ASM_REWRITE_TAC[]);
4451  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4452  (EXISTS_TAC `u1:real^3`);
4453  (ONCE_REWRITE_TAC[SET_RULE `{u0,u2,s,u1} = {u0,u1,u2,s}`]);
4454  (ASM_REWRITE_TAC[]);
4455
4456  (REWRITE_WITH `dih_y y6 sqrt2 y5 sqrt2 y4 sqrt2 = 
4457                  dihV (u0:real^3) u1 s u2`);
4458  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4459  (MP_TAC Merge_ineq.DIHV_EQ_DIH_Y);
4460  (REWRITE_TAC[LET_DEF; LET_END_DEF]);
4461  (EXPAND_TAC "y4");
4462  (EXPAND_TAC "y5");
4463  (EXPAND_TAC "y6");
4464  (STRIP_TAC);
4465  (REWRITE_WITH 
4466 `dih_y (dist (u0,u1)) sqrt2 (dist (u0,u2)) sqrt2 (dist (u1,u2)) sqrt2 = 
4467  dih_y (dist (u0,u1)) (dist (u0,s)) (dist (u0,u2)) (dist (s,u2))
4468  (dist (u1,u2)) (dist (u1,s:real^3))`);
4469  (ASM_REWRITE_TAC[DIST_SYM; sqrt2]);
4470  (FIRST_ASSUM MATCH_MP_TAC);
4471  (STRIP_TAC);
4472  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4473  (EXISTS_TAC `u2:real^3`);
4474  (ONCE_REWRITE_TAC[SET_RULE `{u0,u1,s,u2} = {u0,u1,u2,s}`]);
4475  (ASM_REWRITE_TAC[]);
4476  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4477  (EXISTS_TAC `s:real^3`);
4478  (ASM_REWRITE_TAC[]);
4479
4480  (REWRITE_WITH `dih_y sqrt2 y5 y6 y4 sqrt2 sqrt2 = 
4481                  dihV (u0:real^3) s u2 u1`);
4482  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4483  (MP_TAC Merge_ineq.DIHV_EQ_DIH_Y);
4484  (REWRITE_TAC[LET_DEF; LET_END_DEF]);
4485  (EXPAND_TAC "y4");
4486  (EXPAND_TAC "y5");
4487  (EXPAND_TAC "y6");
4488  (STRIP_TAC);
4489  (REWRITE_WITH 
4490 `dih_y sqrt2 (dist (u0,u2)) (dist (u0,u1)) (dist (u1,u2)) sqrt2 sqrt2 = 
4491  dih_y (dist (u0,s)) (dist (u0,u2)) (dist (u0,u1)) (dist (u2,u1))
4492  (dist (s,u1)) (dist (s,u2:real^3))`);
4493  (ASM_REWRITE_TAC[DIST_SYM;sqrt2]);
4494  (FIRST_ASSUM MATCH_MP_TAC);
4495  (STRIP_TAC);
4496  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4497  (EXISTS_TAC `u1:real^3`);
4498  (ONCE_REWRITE_TAC[SET_RULE `{u0,s,u2,u1} = {u0,u1,u2,s}`]);
4499  (ASM_REWRITE_TAC[]);
4500  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4501  (EXISTS_TAC `u2:real^3`);
4502  (ONCE_REWRITE_TAC[SET_RULE `{u0,s, u1,u2} = {u0,u1,u2,s}`]);
4503  (ASM_REWRITE_TAC[]);
4504
4505  (REWRITE_TAC[ASSUME `X = convex hull {u0,u1,u2,s:real^3}`]);
4506  (ONCE_REWRITE_TAC[REAL_ARITH `a + b + c = b + a + c`]);
4507  (MATCH_MP_TAC SOL_SOLID_TRIANGLE);
4508  (ASM_REWRITE_TAC[DIHV_SYM_2]);
4509
4510 (* ======================================================================== *)
4511
4512  (REWRITE_WITH `sol u1 X = sol_y y6 y4 sqrt2 sqrt2 sqrt2 y5`);
4513  (REWRITE_TAC[sol_y]);
4514  (REWRITE_WITH `dih_y y6 y4 sqrt2 sqrt2 sqrt2 y5 = dihV (u1:real^3) u0 u2 s`);
4515  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4516  (MP_TAC Merge_ineq.DIHV_EQ_DIH_Y);
4517  (REWRITE_TAC[LET_DEF; LET_END_DEF]);
4518  (EXPAND_TAC "y4");
4519  (EXPAND_TAC "y5");
4520  (EXPAND_TAC "y6");
4521  (STRIP_TAC);
4522  (REWRITE_WITH 
4523   `dih_y (dist (u0,u1)) (dist (u1,u2)) sqrt2 sqrt2 sqrt2 (dist (u0,u2)) =
4524    dih_y (dist (u1,u0)) (dist (u1,u2)) (dist (u1,s)) 
4525   (dist (u2,s)) (dist (u0,s)) (dist (u0,u2:real^3))`);
4526  (ASM_REWRITE_TAC[DIST_SYM; sqrt2]);
4527  (FIRST_ASSUM MATCH_MP_TAC);
4528  (STRIP_TAC);
4529
4530  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4531  (EXISTS_TAC `s:real^3`);
4532  (ONCE_REWRITE_TAC[SET_RULE `{u1,u0,u2,s} = {u0,u1,u2,s}`]);
4533  (ASM_REWRITE_TAC[]);
4534  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4535  (EXISTS_TAC `u2:real^3`);
4536  (ONCE_REWRITE_TAC[SET_RULE `{u1,u0,s,u2} = {u0,u1,u2,s}`]);
4537  (ASM_REWRITE_TAC[]);
4538
4539  (REWRITE_WITH `dih_y y4 sqrt2 y6 sqrt2 y5 sqrt2 = 
4540                  dihV (u1:real^3) u2 s u0`);
4541  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4542  (MP_TAC Merge_ineq.DIHV_EQ_DIH_Y);
4543  (REWRITE_TAC[LET_DEF; LET_END_DEF]);
4544  (EXPAND_TAC "y4");
4545  (EXPAND_TAC "y5");
4546  (EXPAND_TAC "y6");
4547  (STRIP_TAC);
4548  (REWRITE_WITH 
4549 `dih_y (dist (u1,u2)) sqrt2 (dist (u0,u1)) sqrt2 (dist (u0,u2)) sqrt2 = 
4550  dih_y (dist (u1,u2)) (dist (u1,s)) (dist (u1,u0)) (dist (s,u0))
4551  (dist (u2,u0)) (dist (u2,s:real^3))`);
4552  (REWRITE_WITH `dist (s,u0:real^3) = dist (u0,s)`);
4553  (REWRITE_TAC[DIST_SYM]);
4554  (ASM_REWRITE_TAC[DIST_SYM; sqrt2]);
4555  (FIRST_ASSUM MATCH_MP_TAC);
4556  (STRIP_TAC);
4557  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4558  (EXISTS_TAC `u0:real^3`);
4559  (ONCE_REWRITE_TAC[SET_RULE `{u1,u2,s,u0} = {u0,u1,u2,s}`]);
4560  (ASM_REWRITE_TAC[]);
4561  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4562  (EXISTS_TAC `s:real^3`);
4563  (ONCE_REWRITE_TAC[SET_RULE `{u1,u2,u0,s} = {u0,u1,u2,s}`]);
4564  (ASM_REWRITE_TAC[]);
4565
4566  (REWRITE_WITH `dih_y sqrt2 y6 y4 y5 sqrt2 sqrt2 = 
4567                  dihV (u1:real^3) s u0 u2`);
4568  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4569  (MP_TAC Merge_ineq.DIHV_EQ_DIH_Y);
4570  (REWRITE_TAC[LET_DEF; LET_END_DEF]);
4571  (EXPAND_TAC "y4");
4572  (EXPAND_TAC "y5");
4573  (EXPAND_TAC "y6");
4574  (STRIP_TAC);
4575  (REWRITE_WITH 
4576 `dih_y sqrt2 (dist (u0,u1)) (dist (u1,u2)) (dist (u0,u2)) sqrt2 sqrt2 = 
4577  dih_y (dist (u1,s)) (dist (u1,u0)) (dist (u1,u2)) (dist (u0,u2))
4578  (dist (s,u2)) (dist (s,u0:real^3))`);
4579  (REWRITE_WITH `dist (s,u0:real^3) = dist (u0,s)`);
4580  (REWRITE_TAC[DIST_SYM]);
4581  (ASM_REWRITE_TAC[DIST_SYM;sqrt2]);
4582  (FIRST_ASSUM MATCH_MP_TAC);
4583  (STRIP_TAC);
4584  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4585  (EXISTS_TAC `u2:real^3`);
4586  (ONCE_REWRITE_TAC[SET_RULE `{u1,s,u0,u2} = {u0,u1,u2,s}`]);
4587  (ASM_REWRITE_TAC[]);
4588  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4589  (EXISTS_TAC `u0:real^3`);
4590  (ONCE_REWRITE_TAC[SET_RULE `{u1,s, u2,u0} = {u0,u1,u2,s}`]);
4591  (ASM_REWRITE_TAC[]);
4592
4593  (REWRITE_TAC[ASSUME `X = convex hull {u0,u1,u2,s:real^3}`]);
4594  (ONCE_REWRITE_TAC[SET_RULE `{u0, u1, u2, s} = {u1,u0,u2,s}`]);
4595  (MATCH_MP_TAC SOL_SOLID_TRIANGLE);
4596  (ONCE_REWRITE_TAC[GSYM (SET_RULE `{u0, u1, u2, s} = {u1,u0,u2,s}`)]);
4597  (ASM_REWRITE_TAC[]);
4598
4599 (* ======================================================================== *)
4600
4601  (REWRITE_WITH `sol u2 X = sol_y y4 y5 sqrt2 sqrt2 sqrt2 y6`);
4602  (REWRITE_TAC[sol_y]);
4603  (REWRITE_WITH `dih_y y4 y5 sqrt2 sqrt2 sqrt2 y6 = 
4604                  dihV (u2:real^3) u1 u0 s`);
4605  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4606  (MP_TAC Merge_ineq.DIHV_EQ_DIH_Y);
4607  (REWRITE_TAC[LET_DEF; LET_END_DEF]);
4608  (EXPAND_TAC "y4");
4609  (EXPAND_TAC "y5");
4610  (EXPAND_TAC "y6");
4611  (STRIP_TAC);
4612  (REWRITE_WITH 
4613   `dih_y (dist (u1,u2)) (dist (u0,u2)) sqrt2 sqrt2 sqrt2 (dist (u0,u1)) =
4614    dih_y (dist (u2,u1)) (dist (u2,u0)) (dist (u2,s)) 
4615   (dist (u0,s)) (dist (u1,s)) (dist (u1,u0:real^3))`);
4616  (ASM_REWRITE_TAC[DIST_SYM; sqrt2]);
4617  (FIRST_ASSUM MATCH_MP_TAC);
4618  (STRIP_TAC);
4619
4620  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4621  (EXISTS_TAC `s:real^3`);
4622  (ONCE_REWRITE_TAC[SET_RULE `{u2,u1,u0,s} = {u0,u1,u2,s}`]);
4623  (ASM_REWRITE_TAC[]);
4624  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4625  (EXISTS_TAC `u0:real^3`);
4626  (ONCE_REWRITE_TAC[SET_RULE `{u2,u1,s,u0} = {u0,u1,u2,s}`]);
4627  (ASM_REWRITE_TAC[]);
4628
4629  (REWRITE_WITH `dih_y y5 sqrt2 y4 sqrt2 y6 sqrt2 = 
4630                  dihV (u2:real^3) u0 s u1`);
4631  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4632  (MP_TAC Merge_ineq.DIHV_EQ_DIH_Y);
4633  (REWRITE_TAC[LET_DEF; LET_END_DEF]);
4634  (EXPAND_TAC "y4");
4635  (EXPAND_TAC "y5");
4636  (EXPAND_TAC "y6");
4637  (STRIP_TAC);
4638  (REWRITE_WITH 
4639 `dih_y (dist (u0,u2)) sqrt2 (dist (u1,u2)) sqrt2 (dist (u0,u1)) sqrt2 = 
4640  dih_y (dist (u2,u0)) (dist (u2,s)) (dist (u2,u1)) (dist (s,u1))
4641  (dist (u0,u1)) (dist (u0,s:real^3))`);
4642  (ASM_REWRITE_TAC[DIST_SYM; sqrt2]);
4643  (FIRST_ASSUM MATCH_MP_TAC);
4644  (STRIP_TAC);
4645  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4646  (EXISTS_TAC `u1:real^3`);
4647  (ONCE_REWRITE_TAC[SET_RULE `{u2,u0,s,u1} = {u0,u1,u2,s}`]);
4648  (ASM_REWRITE_TAC[]);
4649  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4650  (EXISTS_TAC `s:real^3`);
4651  (ONCE_REWRITE_TAC[SET_RULE `{u2,u0,u1,s} = {u0,u1,u2,s}`]);
4652  (ASM_REWRITE_TAC[]);
4653
4654  (REWRITE_WITH `dih_y sqrt2 y4 y5 y6 sqrt2 sqrt2 = 
4655                  dihV (u2:real^3) s u1 u0`);
4656  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4657  (MP_TAC Merge_ineq.DIHV_EQ_DIH_Y);
4658  (REWRITE_TAC[LET_DEF; LET_END_DEF]);
4659  (EXPAND_TAC "y4");
4660  (EXPAND_TAC "y5");
4661  (EXPAND_TAC "y6");
4662  (STRIP_TAC);
4663  (REWRITE_WITH 
4664 `dih_y sqrt2 (dist (u1,u2)) (dist (u0,u2)) (dist (u0,u1)) sqrt2 sqrt2 = 
4665  dih_y (dist (u2,s)) (dist (u2,u1)) (dist (u2,u0)) (dist (u1,u0))
4666  (dist (s,u0)) (dist (s,u1:real^3))`);
4667  (REWRITE_WITH `dist (s,u0:real^3) = dist (u0,s)`);
4668  (REWRITE_TAC[DIST_SYM]);
4669  (ASM_REWRITE_TAC[DIST_SYM;sqrt2]);
4670  (FIRST_ASSUM MATCH_MP_TAC);
4671  (STRIP_TAC);
4672  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4673  (EXISTS_TAC `u0:real^3`);
4674  (ONCE_REWRITE_TAC[SET_RULE `{u2,s,u1,u0} = {u0,u1,u2,s}`]);
4675  (ASM_REWRITE_TAC[]);
4676  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4677  (EXISTS_TAC `u1:real^3`);
4678  (ONCE_REWRITE_TAC[SET_RULE `{u2,s, u0,u1} = {u0,u1,u2,s}`]);
4679  (ASM_REWRITE_TAC[]);
4680
4681  (REWRITE_TAC[ASSUME `X = convex hull {u0,u1,u2,s:real^3}`]);
4682  (ONCE_REWRITE_TAC[SET_RULE `{u0, u1, u2, s} = {u2,u1,u0,s}`]);
4683  (MATCH_MP_TAC SOL_SOLID_TRIANGLE);
4684  (ONCE_REWRITE_TAC[SET_RULE `{u2, u1, u0, s} = {u0,u1,u2,s}`]);
4685  (ASM_REWRITE_TAC[]);
4686
4687 (* ===================================================================== *)
4688  (NEW_GOAL `dihX V X (u0,u1) = dih_y y6 y4 sqrt2 sqrt2 sqrt2 y5`);
4689  (REWRITE_TAC[dihX]);
4690
4691  (COND_CASES_TAC);
4692  (NEW_GOAL `F`);
4693  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
4694  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
4695
4696  (LET_TAC);
4697  (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
4698  (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
4699            ul IN barV V 3 /\
4700            X = mcell k V ul /\
4701            initial_sublist [u0; u1] ul)`);
4702  (STRIP_TAC);
4703  (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
4704  (MATCH_MP_TAC SELECT_AX);
4705  (EXISTS_TAC `(3, ul:(real^3)list)`);
4706  (EXPAND_TAC "P");
4707  (REWRITE_TAC[BETA_THM]);
4708  (ASM_REWRITE_TAC[IN; ARITH_RULE `3 <= 4`]);
4709  (REWRITE_TAC[INITIAL_SUBLIST]);
4710  (EXISTS_TAC `[u2;u3:real^3]` THEN REWRITE_TAC[APPEND]);
4711
4712  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
4713  (EXPAND_TAC "P" THEN REWRITE_TAC[IN]);
4714
4715  (REPEAT STRIP_TAC);
4716  (ASM_CASES_TAC `2 <= k`);
4717  (NEW_GOAL `k = 3`);
4718
4719  (NEW_GOAL `3 = k /\
4720              (!t. 3 - 1 <= t /\ t <= 3
4721                   ==> omega_list_n V ul t = omega_list_n V ul' t)`);
4722  (MATCH_MP_TAC Marchal_cells_3.MCELL_ID_OMEGA_LIST_N);
4723  (ASM_REWRITE_TAC[SET_RULE `x IN {2,3,4} <=> x=2\/x=3\/x=4`]);
4724  (REWRITE_TAC[GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`)]);
4725  (REWRITE_WITH `mcell 3 V ul = X`);
4726  (ASM_REWRITE_TAC[]);
4727  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `~NULLSET X`]);
4728  (ASM_ARITH_TAC);
4729  (ASM_REWRITE_TAC[]);
4730  (COND_CASES_TAC);
4731  (NEW_GOAL `F`);
4732  (ASM_ARITH_TAC);
4733  (UP_ASM_TAC THEN MESON_TAC[]);
4734  (COND_CASES_TAC);
4735
4736 (* This part is harder than the previous *)
4737
4738  (REWRITE_TAC[dihu3]);
4739  (NEW_GOAL `?v0 v1 v2 v3. ul' = [v0;v1;v2;v3:real^3]`);
4740  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
4741  (EXISTS_TAC `V:real^3->bool`);
4742  (ASM_REWRITE_TAC[]);
4743  (UP_ASM_TAC THEN STRIP_TAC);
4744
4745  (NEW_GOAL `u0 = v0:real^3`);
4746  (NEW_GOAL`u0 = HD [u0;u1:real^3]`);
4747  (REWRITE_TAC[HD]);
4748  (ONCE_REWRITE_TAC[ASSUME `u0 = HD[u0;u1:real^3]`]);
4749  (REWRITE_WITH `v0:real^3 = HD ul'`);
4750  (ASM_REWRITE_TAC[HD]);
4751  (REWRITE_WITH `[u0;u1:real^3] = truncate_simplex 1 ul'`);
4752  (NEW_GOAL `[u0;u1:real^3] = truncate_simplex (LENGTH [u0;u1] - 1) ul' /\
4753                   LENGTH [u0;u1] <= LENGTH ul'`);
4754  (MATCH_MP_TAC Packing3.INITIAL_SUBLIST_IMP_TRUNCATE_SIMPLEX);
4755  (ASM_REWRITE_TAC[LENGTH]);
4756  (ARITH_TAC);
4757  (UP_ASM_TAC THEN REWRITE_TAC[LENGTH; ARITH_RULE `SUC(SUC(0)) - 1 = 1`]);
4758  (MESON_TAC[]);
4759  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
4760  (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1`);
4761  (MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA);
4762  (EXISTS_TAC `V:real^3->bool`);
4763  (ASM_REWRITE_TAC[]);
4764  (ARITH_TAC);
4765
4766  (NEW_GOAL `u1 = v1:real^3`);
4767  (NEW_GOAL`u1 = EL 1 [u0;u1:real^3]`);
4768  (REWRITE_TAC[EL; ARITH_RULE `1 = SUC 0`; TL; HD]);
4769  (ONCE_REWRITE_TAC[ASSUME `u1 = EL 1 [u0;u1:real^3]`]);
4770
4771  (REWRITE_WITH `v1:real^3 = EL 1 ul'`);
4772  (ASM_REWRITE_TAC[EL; ARITH_RULE `1 = SUC 0`; TL; HD]);
4773  (REWRITE_WITH `[u0;u1:real^3] = truncate_simplex 1 ul'`);
4774  (NEW_GOAL `[u0;u1:real^3] = truncate_simplex (LENGTH [u0;u1] - 1) ul' /\
4775                   LENGTH [u0;u1] <= LENGTH ul'`);
4776  (MATCH_MP_TAC Packing3.INITIAL_SUBLIST_IMP_TRUNCATE_SIMPLEX);
4777  (ASM_REWRITE_TAC[LENGTH]);
4778  (ARITH_TAC);
4779  (UP_ASM_TAC THEN REWRITE_TAC[LENGTH; ARITH_RULE `SUC(SUC(0)) - 1 = 1`]);
4780  (MESON_TAC[]);
4781  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
4782  (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1`);
4783  (MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA);
4784  (EXISTS_TAC `V:real^3->bool`);
4785  (ASM_REWRITE_TAC[]);
4786  (ARITH_TAC);
4787
4788  (NEW_GOAL `{u0,u1,u2:real^3} = {v0,v1,v2}`);
4789  (REWRITE_TAC[GSYM set_of_list]);
4790  (REWRITE_WITH `[u0; u1; u2:real^3] = truncate_simplex (3 - 1) ul`);
4791  (ASM_REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; TRUNCATE_SIMPLEX_EXPLICIT_2]);
4792  (REWRITE_WITH `set_of_list (truncate_simplex (3 - 1) ul) = 
4793                  V INTER (mcell 3 V ul)`);
4794  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4795  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
4796  (REWRITE_WITH `mcell 3 V ul = X`);
4797  (ASM_REWRITE_TAC[]);
4798  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 3 /\ 3 <= 4`]);
4799  (REWRITE_WITH `mcell 3 V ul = X`);
4800  (ASM_REWRITE_TAC[]);
4801  (REWRITE_WITH `X = mcell 3 V ul'`);
4802  (ASM_MESON_TAC[]);
4803  (REWRITE_WITH `[v0; v1; v2:real^3] = truncate_simplex (3 - 1) ul'`);
4804  (ASM_REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; TRUNCATE_SIMPLEX_EXPLICIT_2]);
4805  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
4806  (REWRITE_WITH `mcell 3 V ul' = X`);
4807  (ASM_MESON_TAC[]);
4808  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 3 /\ 3 <= 4`]);
4809  (NEW_GOAL `u2:real^3 = v2`);
4810  (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1) /\ ~(u0 = u2) /\ ~(u0 = u3) /\
4811                                 ~(u1 = u2) /\ ~(u1 = u3) /\ ~(u2 = u3:real^3)`
4812    THEN ASM_REWRITE_TAC[]);
4813  (EXPAND_TAC "S1" THEN REWRITE_TAC[]);
4814  (SET_TAC[]);
4815  (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);
4816
4817  (REWRITE_WITH `mxi V [v0; v1; v2; v3] = s`);
4818  (EXPAND_TAC "s");
4819  (MATCH_MP_TAC Marchal_cells_3.MCELL_ID_MXI_2);
4820  (EXISTS_TAC `3` THEN EXISTS_TAC `3`);
4821  (REWRITE_TAC[GSYM (ASSUME `ul' = [v0; v1; v2; v3:real^3]`)]);
4822  (REWRITE_WITH `mcell 3 V ul' = X`);
4823  (ASM_MESON_TAC[]);
4824  (ASM_REWRITE_TAC[SET_RULE `3 IN {2,3}`]);
4825  (REWRITE_TAC[GSYM (ASSUME `u0 = v0:real^3`); 
4826                GSYM (ASSUME `u1 = v1:real^3`);
4827                GSYM (ASSUME `u2 = v2:real^3`)]);
4828  (EXPAND_TAC "y4" THEN EXPAND_TAC "y5" THEN EXPAND_TAC "y6");
4829  (ONCE_REWRITE_TAC[DIHV_SYM]);
4830
4831  (REWRITE_WITH 
4832   `dih_y (dist (u0,u1)) (dist (u1,u2)) sqrt2 sqrt2 sqrt2 (dist (u0,u2)) = 
4833    dih_y (dist (u1,u0)) (dist (u1,u2)) (dist (u1,s)) 
4834          (dist (u2,s)) (dist (u0,s)) (dist (u0,u2:real^3))`);
4835  (REWRITE_WITH `dist (u1,s) = dist (s,u1:real^3) /\ 
4836                  dist (u2,s) = dist (s,u2) /\ dist (s,u0) = dist (u0,s)`);
4837  (REWRITE_TAC[DIST_SYM]);
4838  (ASM_REWRITE_TAC[DIST_SYM; sqrt2]);
4839
4840  (GMATCH_SIMP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] DIHV_EQ_DIH_Y));
4841  (STRIP_TAC);
4842  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4843  (EXISTS_TAC `s:real^3`);
4844  (ONCE_REWRITE_TAC[SET_RULE `{u1,u0,u2,s} = {u0,u1,u2,s}`]);
4845  (ASM_REWRITE_TAC[]);
4846  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4847  (EXISTS_TAC `u2:real^3`);
4848  (ONCE_REWRITE_TAC[SET_RULE `{u1,u0,s,u2} = {u0,u1,u2,s}`]);
4849  (ASM_REWRITE_TAC[]);
4850
4851  (NEW_GOAL `F`);
4852  (ASM_ARITH_TAC);
4853  (UP_ASM_TAC THEN MESON_TAC[]);
4854  (NEW_GOAL `F`);
4855  (NEW_GOAL `V INTER (X:real^3->bool) = set_of_list (truncate_simplex (3 - 1) ul)`);
4856  (REWRITE_TAC[ASSUME `X = mcell 3 V ul`]);
4857  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
4858  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 3 /\ 3 <= 4`]);
4859  (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
4860  (ASM_REWRITE_TAC[]);
4861  (ASM_REWRITE_TAC[]);
4862  (UP_ASM_TAC THEN REWRITE_TAC[]);
4863
4864  (ASM_CASES_TAC `k = 1`);
4865  (REWRITE_WITH `V INTER (X:real^3->bool) = 
4866                  set_of_list (truncate_simplex (k - 1) ul')`);
4867  (REWRITE_TAC[ASSUME `X = mcell k V ul'`]);
4868  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
4869  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 1 /\ 1 <= 4`]);
4870  (REWRITE_WITH `mcell 1 V ul' = X`);
4871  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 1`]);
4872  (ASM_REWRITE_TAC[]);
4873
4874  (REWRITE_TAC[ARITH_RULE `1 - 1 = 0`; ASSUME `k = 1`]);
4875  (REWRITE_WITH `truncate_simplex 0 (ul':(real^3)list) = [HD ul']`);
4876  (MATCH_MP_TAC Packing3.TRUNCATE_0_EQ_HEAD);
4877  (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1`);
4878  (MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA);
4879  (EXISTS_TAC `V:real^3->bool`);
4880  (ASM_REWRITE_TAC[]);
4881  (ARITH_TAC);
4882  (ASM_REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; 
4883    TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list; HD]);
4884  (UNDISCH_TAC `~(u0 = u1) /\ ~(u0 = u2) /\ ~(u0 = u3) /\
4885                                 ~(u1 = u2) /\ ~(u1 = u3) /\ ~(u2 =   u3:real^3)`);
4886  (EXPAND_TAC "S2" THEN EXPAND_TAC "S1" THEN SET_TAC[]);
4887  (NEW_GOAL `k = 0`);
4888  (ASM_ARITH_TAC);
4889
4890  (REWRITE_WITH `V INTER X = {}:real^3->bool`);
4891  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 0`]);
4892  (MATCH_MP_TAC Lepjbdj.LEPJBDJ_0);
4893  (ASM_REWRITE_TAC[]);
4894  (ASM_REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; 
4895    TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list]);
4896  (NEW_GOAL `u0 IN {u0,u1,u2:real^3}`);
4897  (SET_TAC[]);
4898  (UP_ASM_TAC THEN SET_TAC[]);
4899  (UP_ASM_TAC THEN MESON_TAC[]);
4900
4901 (* ======================================================================= *)
4902  (NEW_GOAL `dihX V X (u0,u2) = dih_y y5 y6 sqrt2 sqrt2 sqrt2 y4`);
4903  (REWRITE_TAC[dihX]);
4904
4905  (COND_CASES_TAC);
4906  (NEW_GOAL `F`);
4907  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
4908  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
4909
4910  (LET_TAC);
4911  (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
4912  (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
4913            ul IN barV V 3 /\
4914            X = mcell k V ul /\
4915            initial_sublist [u0; u2] ul)`);
4916  (STRIP_TAC);
4917  (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
4918  (MATCH_MP_TAC SELECT_AX);
4919
4920  (ABBREV_TAC `wl = [u0;u2;u1;u3:real^3]`);
4921  (NEW_GOAL `?p. p permutes 0..2 /\
4922                  wl:(real^3)list = left_action_list p ul`);
4923  (ASM_REWRITE_TAC[] THEN EXPAND_TAC "wl");
4924  (MATCH_MP_TAC Marchal_cells_3.LEFT_ACTION_LIST_2_EXISTS);
4925  (STRIP_TAC);
4926  (ASM_REWRITE_TAC[]);
4927  (EXPAND_TAC "S2" THEN EXPAND_TAC "S1" THEN SET_TAC[]);
4928  (UP_ASM_TAC THEN STRIP_TAC);
4929
4930  (NEW_GOAL `barV V 3 wl`);
4931  (MATCH_MP_TAC Qzksykg.QZKSYKG1);
4932  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `3` THEN EXISTS_TAC `p:num->num`);
4933  (ASM_REWRITE_TAC[SET_RULE `3 IN {0,1,2,3,4}`; ARITH_RULE `3 - 1 = 2`]);
4934  (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
4935  (ASM_REWRITE_TAC[]);
4936  (ASM_REWRITE_TAC[]);
4937
4938  (EXISTS_TAC `(3, wl:(real^3)list)`);
4939  (EXPAND_TAC "P");
4940  (REWRITE_TAC[BETA_THM]);
4941  (ASM_REWRITE_TAC[IN; ARITH_RULE `3 <= 4`]);
4942  (STRIP_TAC);
4943
4944  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4945  (MATCH_MP_TAC Rvfxzbu.RVFXZBU);
4946  (ASM_REWRITE_TAC[SET_RULE `3 IN {0,1,2,3,4}`; ARITH_RULE `3 - 1 = 2`]);
4947  (REWRITE_TAC[GSYM (ASSUME `ul = [u0; u1; u2; u3:real^3]`)]);
4948  (ASM_REWRITE_TAC[]);
4949  (REWRITE_TAC[GSYM (ASSUME `ul = [u0; u1; u2; u3:real^3]`)]);
4950  (REWRITE_TAC[GSYM (ASSUME `wl:(real^3)list = left_action_list p ul`)]);
4951  (EXPAND_TAC "wl");
4952  (REWRITE_WITH `[u0; u2; u1; u3] = APPEND [u0; u2] [u1; u3:real^3]`);
4953  (REWRITE_TAC[APPEND]);
4954  (REWRITE_TAC[Packing3.INITIAL_SUBLIST_APPEND]);
4955
4956  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
4957  (EXPAND_TAC "P" THEN REWRITE_TAC[IN]);
4958
4959  (REPEAT STRIP_TAC);
4960
4961  (ASM_CASES_TAC `2 <= k`);
4962  (NEW_GOAL `k = 3`);
4963
4964  (NEW_GOAL `3 = k /\
4965              (!t. 3 - 1 <= t /\ t <= 3
4966                   ==> omega_list_n V ul t = omega_list_n V ul' t)`);
4967  (MATCH_MP_TAC Marchal_cells_3.MCELL_ID_OMEGA_LIST_N);
4968  (ASM_REWRITE_TAC[SET_RULE `x IN {2,3,4} <=> x=2\/x=3\/x=4`]);
4969  (REWRITE_TAC[GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`)]);
4970  (REWRITE_WITH `mcell 3 V ul = X`);
4971  (ASM_REWRITE_TAC[]);
4972  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `~NULLSET X`]);
4973  (ASM_ARITH_TAC);
4974  (ASM_REWRITE_TAC[]);
4975
4976  (COND_CASES_TAC);
4977  (NEW_GOAL `F`);
4978  (ASM_ARITH_TAC);
4979  (UP_ASM_TAC THEN MESON_TAC[]);
4980  (COND_CASES_TAC);
4981
4982 (* This part is harder than the previous *)
4983  (REWRITE_TAC[dihu3]);
4984  (NEW_GOAL `?v0 v1 v2 v3. ul' = [v0;v1;v2;v3:real^3]`);
4985  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
4986  (EXISTS_TAC `V:real^3->bool`);
4987  (ASM_REWRITE_TAC[]);
4988  (UP_ASM_TAC THEN STRIP_TAC);
4989
4990  (NEW_GOAL `u0 = v0:real^3`);
4991  (NEW_GOAL`u0 = HD [u0;u2:real^3]`);
4992  (REWRITE_TAC[HD]);
4993  (ONCE_REWRITE_TAC[ASSUME `u0 = HD[u0;u2:real^3]`]);
4994  (REWRITE_WITH `v0:real^3 = HD ul'`);
4995  (ASM_REWRITE_TAC[HD]);
4996  (REWRITE_WITH `[u0;u2:real^3] = truncate_simplex 1 ul'`);
4997  (NEW_GOAL `[u0;u2:real^3] = truncate_simplex (LENGTH [u0;u2] - 1) ul' /\
4998                   LENGTH [u0;u2] <= LENGTH ul'`);
4999  (MATCH_MP_TAC Packing3.INITIAL_SUBLIST_IMP_TRUNCATE_SIMPLEX);
5000  (ASM_REWRITE_TAC[LENGTH]);
5001  (ARITH_TAC);
5002  (UP_ASM_TAC THEN REWRITE_TAC[LENGTH; ARITH_RULE `SUC(SUC(0)) - 1 = 1`]);
5003  (MESON_TAC[]);
5004  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
5005  (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1`);
5006  (MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA);
5007  (EXISTS_TAC `V:real^3->bool`);
5008  (ASM_REWRITE_TAC[]);
5009  (ARITH_TAC);
5010
5011  (NEW_GOAL `u2 = v1:real^3`);
5012  (NEW_GOAL`u2 = EL 1 [u0;u2:real^3]`);
5013  (REWRITE_TAC[EL; ARITH_RULE `1 = SUC 0`; TL; HD]);
5014  (ONCE_REWRITE_TAC[ASSUME `u2 = EL 1 [u0;u2:real^3]`]);
5015
5016  (REWRITE_WITH `v1:real^3 = EL 1 ul'`);
5017  (ASM_REWRITE_TAC[EL; ARITH_RULE `1 = SUC 0`; TL; HD]);
5018  (REWRITE_WITH `[u0;u2:real^3] = truncate_simplex 1 ul'`);
5019  (NEW_GOAL `[u0;u2:real^3] = truncate_simplex (LENGTH [u0;u2] - 1) ul' /\
5020                   LENGTH [u0;u2] <= LENGTH ul'`);
5021  (MATCH_MP_TAC Packing3.INITIAL_SUBLIST_IMP_TRUNCATE_SIMPLEX);
5022  (ASM_REWRITE_TAC[LENGTH]);
5023  (ARITH_TAC);
5024  (UP_ASM_TAC THEN REWRITE_TAC[LENGTH; ARITH_RULE `SUC(SUC(0)) - 1 = 1`]);
5025  (MESON_TAC[]);
5026  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
5027  (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1`);
5028  (MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA);
5029  (EXISTS_TAC `V:real^3->bool`);
5030  (ASM_REWRITE_TAC[]);
5031  (ARITH_TAC);
5032
5033  (NEW_GOAL `{u0,u1,u2:real^3} = {v0,v1,v2}`);
5034  (REWRITE_TAC[GSYM set_of_list]);
5035  (REWRITE_WITH `[u0; u1; u2:real^3] = truncate_simplex (3 - 1) ul`);
5036  (ASM_REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; TRUNCATE_SIMPLEX_EXPLICIT_2]);
5037  (REWRITE_WITH `set_of_list (truncate_simplex (3 - 1) ul) = 
5038                  V INTER (mcell 3 V ul)`);
5039  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5040  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
5041  (REWRITE_WITH `mcell 3 V ul = X`);
5042  (ASM_REWRITE_TAC[]);
5043  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 3 /\ 3 <= 4`]);
5044  (REWRITE_WITH `mcell 3 V ul = X`);
5045  (ASM_REWRITE_TAC[]);
5046  (REWRITE_WITH `X = mcell 3 V ul'`);
5047  (ASM_MESON_TAC[]);
5048  (REWRITE_WITH `[v0; v1; v2:real^3] = truncate_simplex (3 - 1) ul'`);
5049  (ASM_REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; TRUNCATE_SIMPLEX_EXPLICIT_2]);
5050  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
5051  (REWRITE_WITH `mcell 3 V ul' = X`);
5052  (ASM_MESON_TAC[]);
5053  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 3 /\ 3 <= 4`]);
5054
5055  (NEW_GOAL `u1:real^3 = v2`);
5056  (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1) /\ ~(u0 = u2) /\ ~(u0 = u3) /\
5057                                 ~(u1 = u2) /\ ~(u1 = u3) /\ ~(u2 = u3:real^3)`
5058    THEN ASM_REWRITE_TAC[]);
5059  (EXPAND_TAC "S2" THEN EXPAND_TAC "S1" THEN SET_TAC[]);
5060
5061  (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);
5062  (REWRITE_WITH `mxi V [v0; v1; v2; v3] = s`);
5063  (EXPAND_TAC "s");
5064  (MATCH_MP_TAC Marchal_cells_3.MCELL_ID_MXI_2);
5065  (EXISTS_TAC `3` THEN EXISTS_TAC `3`);
5066  (REWRITE_TAC[GSYM (ASSUME `ul' = [v0; v1; v2; v3:real^3]`)]);
5067  (REWRITE_WITH `mcell 3 V ul' = X`);
5068  (ASM_MESON_TAC[]);
5069  (ASM_REWRITE_TAC[SET_RULE `3 IN {2,3}`]);
5070  (REWRITE_TAC[GSYM (ASSUME `u0 = v0:real^3`); 
5071                GSYM (ASSUME `u2 = v1:real^3`);
5072                GSYM (ASSUME `u1 = v2:real^3`)]);
5073  (EXPAND_TAC "y4" THEN EXPAND_TAC "y5" THEN EXPAND_TAC "y6");
5074
5075  (REWRITE_WITH 
5076   `dih_y (dist (u0,u2)) (dist (u0,u1)) sqrt2 sqrt2 sqrt2 (dist (u1,u2)) = 
5077    dih_y (dist (u0,u2)) (dist (u0,u1)) (dist (u0,s)) 
5078          (dist (u1,s)) (dist (u2,s)) (dist (u2,u1:real^3))`);
5079  (REWRITE_WITH `dist (u1,s) = dist (s,u1:real^3) /\ 
5080                  dist (u2,s) = dist (s,u2) /\ dist (s,u0) = dist (u0,s)`);
5081  (REWRITE_TAC[DIST_SYM]);
5082  (ASM_REWRITE_TAC[DIST_SYM; sqrt2]);
5083
5084  (GMATCH_SIMP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] DIHV_EQ_DIH_Y));
5085  (STRIP_TAC);
5086  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
5087  (EXISTS_TAC `s:real^3`);
5088  (ONCE_REWRITE_TAC[SET_RULE `{u0,u2,u1,s} = {u0,u1,u2,s}`]);
5089  (ASM_REWRITE_TAC[]);
5090  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
5091  (EXISTS_TAC `u1:real^3`);
5092  (ONCE_REWRITE_TAC[SET_RULE `{u0,u2,s,u1} = {u0,u1,u2,s}`]);
5093  (ASM_REWRITE_TAC[]);
5094
5095  (NEW_GOAL `F`);
5096  (ASM_ARITH_TAC);
5097  (UP_ASM_TAC THEN MESON_TAC[]);
5098  (NEW_GOAL `F`);
5099  (NEW_GOAL `V INTER (X:real^3->bool) = set_of_list (truncate_simplex (3 - 1) ul)`);
5100  (REWRITE_TAC[ASSUME `X = mcell 3 V ul`]);
5101  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
5102  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 3 /\ 3 <= 4`]);
5103  (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
5104  (ASM_REWRITE_TAC[]);
5105  (ASM_REWRITE_TAC[]);
5106  (UP_ASM_TAC THEN REWRITE_TAC[]);
5107
5108  (ASM_CASES_TAC `k = 1`);
5109  (REWRITE_WITH `V INTER (X:real^3->bool) = 
5110                  set_of_list (truncate_simplex (k - 1) ul')`);
5111  (REWRITE_TAC[ASSUME `X = mcell k V ul'`]);
5112  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
5113  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 1 /\ 1 <= 4`]);
5114  (REWRITE_WITH `mcell 1 V ul' = X`);
5115  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 1`]);
5116  (ASM_REWRITE_TAC[]);
5117
5118  (REWRITE_TAC[ARITH_RULE `1 - 1 = 0`; ASSUME `k = 1`]);
5119  (REWRITE_WITH `truncate_simplex 0 (ul':(real^3)list) = [HD ul']`);
5120  (MATCH_MP_TAC Packing3.TRUNCATE_0_EQ_HEAD);
5121  (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1`);
5122  (MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA);
5123  (EXISTS_TAC `V:real^3->bool`);
5124  (ASM_REWRITE_TAC[]);
5125  (ARITH_TAC);
5126  (ASM_REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; 
5127    TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list; HD]);
5128
5129  (UNDISCH_TAC `~(u0 = u1) /\ ~(u0 = u2) /\ ~(u0 = u3) /\
5130                               ~(u1 = u2) /\ ~(u1 = u3) /\ ~(u2 = u3:real^3)`);
5131  (EXPAND_TAC "S2" THEN EXPAND_TAC "S1" THEN SET_TAC[]);
5132  (NEW_GOAL `k = 0`);
5133  (ASM_ARITH_TAC);
5134
5135  (REWRITE_WITH `V INTER X = {}:real^3->bool`);
5136  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 0`]);
5137  (MATCH_MP_TAC Lepjbdj.LEPJBDJ_0);
5138  (ASM_REWRITE_TAC[]);
5139  (ASM_REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; 
5140    TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list]);
5141  (NEW_GOAL `u0 IN {u0,u1,u2:real^3}`);
5142  (SET_TAC[]);
5143  (UP_ASM_TAC THEN SET_TAC[]);
5144  (UP_ASM_TAC THEN MESON_TAC[]);
5145
5146 (* ========================================================================= *)
5147
5148  (NEW_GOAL `dihX V X (u1,u2) = dih_y y4 y5 sqrt2 sqrt2 sqrt2 y6`);
5149  (REWRITE_TAC[dihX]);
5150
5151  (COND_CASES_TAC);
5152  (NEW_GOAL `F`);
5153  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
5154  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
5155
5156  (LET_TAC);
5157  (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
5158  (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
5159            ul IN barV V 3 /\
5160            X = mcell k V ul /\
5161            initial_sublist [u1; u2] ul)`);
5162  (STRIP_TAC);
5163  (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
5164  (MATCH_MP_TAC SELECT_AX);
5165
5166  (ABBREV_TAC `wl = [u1;u2;u0;u3:real^3]`);
5167  (NEW_GOAL `?p. p permutes 0..2 /\
5168                  wl:(real^3)list = left_action_list p ul`);
5169  (ASM_REWRITE_TAC[] THEN EXPAND_TAC "wl");
5170  (MATCH_MP_TAC Marchal_cells_3.LEFT_ACTION_LIST_2_EXISTS);
5171  (ASM_REWRITE_TAC[]);
5172  (EXPAND_TAC "S2" THEN EXPAND_TAC "S1" THEN SET_TAC[]);
5173  (UP_ASM_TAC THEN STRIP_TAC);
5174
5175  (NEW_GOAL `barV V 3 wl`);
5176  (MATCH_MP_TAC Qzksykg.QZKSYKG1);
5177  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `3` THEN EXISTS_TAC `p:num->num`);
5178  (ASM_REWRITE_TAC[SET_RULE `3 IN {0,1,2,3,4}`; ARITH_RULE `3 - 1 = 2`]);
5179  (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
5180  (ASM_REWRITE_TAC[]);
5181  (ASM_REWRITE_TAC[]);
5182
5183  (EXISTS_TAC `(3, wl:(real^3)list)`);
5184  (EXPAND_TAC "P");
5185  (REWRITE_TAC[BETA_THM]);
5186  (ASM_REWRITE_TAC[IN; ARITH_RULE `3 <= 4`]);
5187  (STRIP_TAC);
5188
5189  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5190  (MATCH_MP_TAC Rvfxzbu.RVFXZBU);
5191  (ASM_REWRITE_TAC[SET_RULE `3 IN {0,1,2,3,4}`; ARITH_RULE `3 - 1 = 2`]);
5192  (REWRITE_TAC[GSYM (ASSUME `ul = [u0; u1; u2; u3:real^3]`)]);
5193  (ASM_REWRITE_TAC[]);
5194  (REWRITE_TAC[GSYM (ASSUME `ul = [u0; u1; u2; u3:real^3]`)]);
5195  (REWRITE_TAC[GSYM (ASSUME `wl:(real^3)list = left_action_list p ul`)]);
5196  (EXPAND_TAC "wl");
5197  (REWRITE_WITH `[u1; u2; u0; u3] = APPEND [u1; u2] [u0; u3:real^3]`);
5198  (REWRITE_TAC[APPEND]);
5199  (REWRITE_TAC[Packing3.INITIAL_SUBLIST_APPEND]);
5200
5201  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
5202  (EXPAND_TAC "P" THEN REWRITE_TAC[IN]);
5203
5204  (REPEAT STRIP_TAC);
5205
5206  (ASM_CASES_TAC `2 <= k`);
5207  (NEW_GOAL `k = 3`);
5208
5209  (NEW_GOAL `3 = k /\
5210              (!t. 3 - 1 <= t /\ t <= 3
5211                   ==> omega_list_n V ul t = omega_list_n V ul' t)`);
5212  (MATCH_MP_TAC Marchal_cells_3.MCELL_ID_OMEGA_LIST_N);
5213  (ASM_REWRITE_TAC[SET_RULE `x IN {2,3,4} <=> x=2\/x=3\/x=4`]);
5214  (REWRITE_TAC[GSYM (ASSUME `ul = [u0;u1;u2;u3:real^3]`)]);
5215  (REWRITE_WITH `mcell 3 V ul = X`);
5216  (ASM_REWRITE_TAC[]);
5217  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `~NULLSET X`]);
5218  (ASM_ARITH_TAC);
5219  (ASM_REWRITE_TAC[]);
5220
5221  (COND_CASES_TAC);
5222  (NEW_GOAL `F`);
5223  (ASM_ARITH_TAC);
5224  (UP_ASM_TAC THEN MESON_TAC[]);
5225  (COND_CASES_TAC);
5226
5227 (* This part is harder than the previous *)
5228  (REWRITE_TAC[dihu3]);
5229  (NEW_GOAL `?v0 v1 v2 v3. ul' = [v0;v1;v2;v3:real^3]`);
5230  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
5231  (EXISTS_TAC `V:real^3->bool`);
5232  (ASM_REWRITE_TAC[]);
5233  (UP_ASM_TAC THEN STRIP_TAC);
5234
5235  (NEW_GOAL `u1 = v0:real^3`);
5236  (NEW_GOAL`u1 = HD [u1;u2:real^3]`);
5237  (REWRITE_TAC[HD]);
5238  (ONCE_REWRITE_TAC[ASSUME `u1 = HD[u1;u2:real^3]`]);
5239  (REWRITE_WITH `v0:real^3 = HD ul'`);
5240  (ASM_REWRITE_TAC[HD]);
5241  (REWRITE_WITH `[u1;u2:real^3] = truncate_simplex 1 ul'`);
5242  (NEW_GOAL `[u1;u2:real^3] = truncate_simplex (LENGTH [u1;u2] - 1) ul' /\
5243                   LENGTH [u1;u2] <= LENGTH ul'`);
5244  (MATCH_MP_TAC Packing3.INITIAL_SUBLIST_IMP_TRUNCATE_SIMPLEX);
5245  (ASM_REWRITE_TAC[LENGTH]);
5246  (ARITH_TAC);
5247  (UP_ASM_TAC THEN REWRITE_TAC[LENGTH; ARITH_RULE `SUC(SUC(0)) - 1 = 1`]);
5248  (MESON_TAC[]);
5249  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
5250  (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1`);
5251  (MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA);
5252  (EXISTS_TAC `V:real^3->bool`);
5253  (ASM_REWRITE_TAC[]);
5254  (ARITH_TAC);
5255
5256  (NEW_GOAL `u2 = v1:real^3`);
5257  (NEW_GOAL`u2 = EL 1 [u1;u2:real^3]`);
5258  (REWRITE_TAC[EL; ARITH_RULE `1 = SUC 0`; TL; HD]);
5259  (ONCE_REWRITE_TAC[ASSUME `u2 = EL 1 [u1;u2:real^3]`]);
5260
5261  (REWRITE_WITH `v1:real^3 = EL 1 ul'`);
5262  (ASM_REWRITE_TAC[EL; ARITH_RULE `1 = SUC 0`; TL; HD]);
5263  (REWRITE_WITH `[u1;u2:real^3] = truncate_simplex 1 ul'`);
5264  (NEW_GOAL `[u1;u2:real^3] = truncate_simplex (LENGTH [u1;u2] - 1) ul' /\
5265                   LENGTH [u1;u2] <= LENGTH ul'`);
5266  (MATCH_MP_TAC Packing3.INITIAL_SUBLIST_IMP_TRUNCATE_SIMPLEX);
5267  (ASM_REWRITE_TAC[LENGTH]);
5268  (ARITH_TAC);
5269
5270  (UP_ASM_TAC THEN REWRITE_TAC[LENGTH; ARITH_RULE `SUC(SUC(0)) - 1 = 1`]);
5271  (MESON_TAC[]);
5272  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
5273  (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1`);
5274  (MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA);
5275  (EXISTS_TAC `V:real^3->bool`);
5276  (ASM_REWRITE_TAC[]);
5277  (ARITH_TAC);
5278
5279  (NEW_GOAL `{u0,u1,u2:real^3} = {v0,v1,v2}`);
5280  (REWRITE_TAC[GSYM set_of_list]);
5281  (REWRITE_WITH `[u0; u1; u2:real^3] = truncate_simplex (3 - 1) ul`);
5282  (ASM_REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; TRUNCATE_SIMPLEX_EXPLICIT_2]);
5283  (REWRITE_WITH `set_of_list (truncate_simplex (3 - 1) ul) = 
5284                  V INTER (mcell 3 V ul)`);
5285  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5286  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
5287  (REWRITE_WITH `mcell 3 V ul = X`);
5288  (ASM_REWRITE_TAC[]);
5289  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 3 /\ 3 <= 4`]);
5290  (REWRITE_WITH `mcell 3 V ul = X`);
5291  (ASM_REWRITE_TAC[]);
5292  (REWRITE_WITH `X = mcell 3 V ul'`);
5293  (ASM_MESON_TAC[]);
5294  (REWRITE_WITH `[v0; v1; v2:real^3] = truncate_simplex (3 - 1) ul'`);
5295  (ASM_REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; TRUNCATE_SIMPLEX_EXPLICIT_2]);
5296  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
5297  (REWRITE_WITH `mcell 3 V ul' = X`);
5298  (ASM_MESON_TAC[]);
5299  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 3 /\ 3 <= 4`]);
5300
5301  (NEW_GOAL `u0:real^3 = v2`);
5302  (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1) /\ ~(u0 = u2) /\ ~(u0 = u3) /\
5303                                 ~(u1 = u2) /\ ~(u1 = u3) /\ ~(u2 = u3:real^3)`
5304    THEN ASM_REWRITE_TAC[]);
5305  (EXPAND_TAC "S2" THEN EXPAND_TAC "S1" THEN SET_TAC[]);
5306
5307  (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);
5308  (REWRITE_WITH `mxi V [v0; v1; v2; v3] = s`);
5309  (EXPAND_TAC "s");
5310  (MATCH_MP_TAC Marchal_cells_3.MCELL_ID_MXI_2);
5311  (EXISTS_TAC `3` THEN EXISTS_TAC `3`);
5312  (REWRITE_TAC[GSYM (ASSUME `ul' = [v0; v1; v2; v3:real^3]`)]);
5313  (REWRITE_WITH `mcell 3 V ul' = X`);
5314  (ASM_MESON_TAC[]);
5315  (ASM_REWRITE_TAC[SET_RULE `3 IN {2,3}`]);
5316  (REWRITE_TAC[GSYM (ASSUME `u1 = v0:real^3`); 
5317                GSYM (ASSUME `u2 = v1:real^3`);
5318                GSYM (ASSUME `u0 = v2:real^3`)]);
5319  (EXPAND_TAC "y4" THEN EXPAND_TAC "y5" THEN EXPAND_TAC "y6");
5320  (ONCE_REWRITE_TAC[DIHV_SYM]);
5321  (REWRITE_WITH 
5322   `dih_y (dist (u1,u2)) (dist (u0,u2)) sqrt2 sqrt2 sqrt2 (dist (u0,u1)) = 
5323    dih_y (dist (u2,u1)) (dist (u2,u0)) (dist (u2,s)) 
5324          (dist (u0,s)) (dist (u1,s)) (dist (u1,u0:real^3))`);
5325  (REWRITE_WITH `dist (u1,s) = dist (s,u1:real^3) /\ 
5326                  dist (u2,s) = dist (s,u2) /\ dist (s,u0) = dist (u0,s)`);
5327  (REWRITE_TAC[DIST_SYM]);
5328  (ASM_REWRITE_TAC[DIST_SYM; sqrt2]);
5329
5330  (GMATCH_SIMP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] DIHV_EQ_DIH_Y));
5331  (STRIP_TAC);
5332  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
5333  (EXISTS_TAC `s:real^3`);
5334  (ONCE_REWRITE_TAC[SET_RULE `{u2,u1,u0,s} = {u0,u1,u2,s}`]);
5335  (ASM_REWRITE_TAC[]);
5336  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
5337  (EXISTS_TAC `u0:real^3`);
5338  (ONCE_REWRITE_TAC[SET_RULE `{u2,u1,s,u0} = {u0,u1,u2,s}`]);
5339  (ASM_REWRITE_TAC[]);
5340
5341  (NEW_GOAL `F`);
5342  (ASM_ARITH_TAC);
5343  (UP_ASM_TAC THEN MESON_TAC[]);
5344  (NEW_GOAL `F`);
5345  (NEW_GOAL `V INTER (X:real^3->bool) = set_of_list (truncate_simplex (3 - 1) ul)`);
5346  (REWRITE_TAC[ASSUME `X = mcell 3 V ul`]);
5347  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
5348  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 3 /\ 3 <= 4`]);
5349  (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
5350  (ASM_REWRITE_TAC[]);
5351  (ASM_REWRITE_TAC[]);
5352  (UP_ASM_TAC THEN REWRITE_TAC[]);
5353
5354  (ASM_CASES_TAC `k = 1`);
5355  (REWRITE_WITH `V INTER (X:real^3->bool) = 
5356                  set_of_list (truncate_simplex (k - 1) ul')`);
5357  (REWRITE_TAC[ASSUME `X = mcell k V ul'`]);
5358  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
5359  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 1 /\ 1 <= 4`]);
5360  (REWRITE_WITH `mcell 1 V ul' = X`);
5361  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 1`]);
5362  (ASM_REWRITE_TAC[]);
5363
5364  (REWRITE_TAC[ARITH_RULE `1 - 1 = 0`; ASSUME `k = 1`]);
5365  (REWRITE_WITH `truncate_simplex 0 (ul':(real^3)list) = [HD ul']`);
5366  (MATCH_MP_TAC Packing3.TRUNCATE_0_EQ_HEAD);
5367  (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1`);
5368  (MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA);
5369  (EXISTS_TAC `V:real^3->bool`);
5370  (ASM_REWRITE_TAC[]);
5371  (ARITH_TAC);
5372  (ASM_REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; 
5373    TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list; HD]);
5374  (UNDISCH_TAC `~(u0 = u1) /\ ~(u0 = u2) /\ ~(u0 = u3) /\
5375                               ~(u1 = u2) /\ ~(u1 = u3) /\ ~(u2 = u3:real^3)`);
5376  (EXPAND_TAC "S2" THEN EXPAND_TAC "S1" THEN SET_TAC[]);
5377  (NEW_GOAL `k = 0`);
5378  (ASM_ARITH_TAC);
5379
5380  (REWRITE_WITH `V INTER X = {}:real^3->bool`);
5381  (REWRITE_TAC[ASSUME `X = mcell k V ul'`; ASSUME `k = 0`]);
5382  (MATCH_MP_TAC Lepjbdj.LEPJBDJ_0);
5383  (ASM_REWRITE_TAC[]);
5384  (ASM_REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; 
5385    TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list]);
5386  (NEW_GOAL `u0 IN {u0,u1,u2:real^3}`);
5387  (SET_TAC[]);
5388  (UP_ASM_TAC THEN SET_TAC[]);
5389  (UP_ASM_TAC THEN MESON_TAC[]);
5390
5391  (REWRITE_TAC[ASSUME `dihX V X (u0,u1) = dih_y y6 y4 sqrt2 sqrt2 sqrt2 y5`]);
5392  (REWRITE_TAC[ASSUME `dihX V X (u0,u2) = dih_y y5 y6 sqrt2 sqrt2 sqrt2 y4`]);
5393  (REWRITE_TAC[ASSUME `dihX V X (u1,u2) = dih_y y4 y5 sqrt2 sqrt2 sqrt2 y6`]);
5394
5395 (* ======================================================================== *)
5396
5397  (MATCH_MP_TAC (
5398    REAL_ARITH `(a:real) = x /\ b = y /\ c = z ==> (a - b + c = x - (y - z))`));
5399  (REPEAT STRIP_TAC);
5400  (REFL_TAC);
5401  (AP_TERM_TAC);
5402  (REAL_ARITH_TAC);
5403  (AP_TERM_TAC);
5404
5405  (NEW_GOAL `edgeX V X = {{u0,u1:real^3}, {u0,u2}, {u1,u2}}`);
5406  (REWRITE_TAC[edgeX]);
5407  (ONCE_REWRITE_TAC[SET_EQ_LEMMA]);
5408  (REWRITE_TAC[IN_ELIM_THM]);
5409  (REPEAT STRIP_TAC);
5410
5411  (UNDISCH_TAC `VX V X u` THEN UNDISCH_TAC `VX V X v`);
5412  (REWRITE_TAC[MESON[IN] `VX V X s <=> s IN VX V X`]);
5413  (REWRITE_TAC[ASSUME `VX V X  = {u0,u1,u2}`;
5414                SET_RULE `v IN {u0, u1, u2} <=> v=u0 \/ v = u1 \/ v = u2`]);
5415  (REPEAT STRIP_TAC);
5416  (NEW_GOAL `F`);
5417  (ASM_MESON_TAC[]);
5418  (ASM_MESON_TAC[]);
5419  (REWRITE_WITH `{u,v} = {v,u:real^3}`);
5420  (SET_TAC[]);
5421  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
5422  (REWRITE_WITH `{u,v} = {v,u:real^3}`);
5423  (SET_TAC[]);
5424
5425  (REWRITE_TAC[ASSUME `x = {u, v:real^3}`; ASSUME `u = u2:real^3`; 
5426    ASSUME `v = u0:real^3`] THEN SET_TAC[]);
5427  (REWRITE_WITH `{u,v} = {v,u:real^3}`);
5428  (SET_TAC[]);
5429  (REWRITE_TAC[ASSUME `x = {u, v:real^3}`; ASSUME `u = u0:real^3`; 
5430    ASSUME `v = u1:real^3`] THEN SET_TAC[]);
5431  (NEW_GOAL `F`);
5432  (ASM_MESON_TAC[]);
5433  (ASM_MESON_TAC[]);
5434  (REWRITE_WITH `{u,v} = {v,u:real^3}`);
5435  (SET_TAC[]);
5436  (REWRITE_TAC[ASSUME `x = {u, v:real^3}`; ASSUME `u = u2:real^3`; 
5437    ASSUME `v = u1:real^3`] THEN SET_TAC[]);
5438  (REWRITE_TAC[ASSUME `x = {u, v:real^3}`; ASSUME `u = u0:real^3`; 
5439    ASSUME `v = u2:real^3`] THEN SET_TAC[]);
5440  (REWRITE_TAC[ASSUME `x = {u, v:real^3}`; ASSUME `u = u1:real^3`; 
5441    ASSUME `v = u2:real^3`] THEN SET_TAC[]);
5442  (NEW_GOAL `F`);
5443  (ASM_MESON_TAC[]);
5444  (ASM_MESON_TAC[]);
5445
5446  (UP_ASM_TAC THEN REWRITE_TAC[SET_RULE `x IN {a,b,c} <=> x=a\/x=b\/x=c`]);
5447  (REWRITE_TAC[MESON[IN] `VX V X s <=> s IN VX V X`]);
5448  (REWRITE_TAC[ASSUME `VX V X = {u0,u1,u2:real^3}`;
5449                SET_RULE `v IN {u0, u1, u2} <=> v = u0 \/ v = u1 \/ v = u2`]);
5450  (REPEAT STRIP_TAC);
5451  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3` THEN ASM_REWRITE_TAC[]);
5452  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u2:real^3` THEN ASM_REWRITE_TAC[]);
5453  (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN ASM_REWRITE_TAC[]);
5454
5455  (ABBREV_TAC `f = 
5456  (\({u, v}). if {u, v} IN edgeX V X
5457              then dihX V X (u,v) * lmfun (hl [u; v])
5458              else &0)`);
5459  (REWRITE_TAC[ASSUME `edgeX V X = {{u0, u1}, {u0, u2}, {u1, u2}}`]);
5460
5461  (ABBREV_TAC `H2 = {{u0, u2}, {u1, u2:real^3}}`);
5462  (REWRITE_WITH `sum ({u0,u1:real^3} INSERT H2) f = 
5463    (if {u0,u1} IN H2 then sum H2 f else f {u0,u1} + sum H2 f)`);
5464  (MATCH_MP_TAC Marchal_cells_2_new.SUM_CLAUSES_alt);
5465  (EXPAND_TAC "H2");
5466  (REWRITE_TAC[Geomdetail.FINITE6]);
5467  (COND_CASES_TAC);
5468  (NEW_GOAL `F`);
5469  (UP_ASM_TAC THEN EXPAND_TAC "H2");
5470  (REWRITE_TAC[SET_RULE `x IN {a,b} <=> x=a\/x=b`]);
5471  (SET_TAC[ASSUME 
5472    `~(u0 = u1:real^3) /\ ~(u0 = u2) /\ ~(u0 = u3) /\ ~(u1 = u2) /\
5473     ~(u1 = u3) /\ ~(u2 = u3)`]);
5474  (UP_ASM_TAC THEN MESON_TAC[]);
5475
5476  (EXPAND_TAC "H2");
5477  (ABBREV_TAC `H1 = {{u1, u2:real^3}}`);
5478  (REWRITE_WITH `sum ({u0,u2:real^3} INSERT H1) f = 
5479    (if {u0,u2} IN H1 then sum H1 f else f {u0,u2} + sum H1 f)`);
5480  (MATCH_MP_TAC Marchal_cells_2_new.SUM_CLAUSES_alt);
5481  (EXPAND_TAC "H1");
5482  (REWRITE_TAC[Geomdetail.FINITE6]);
5483
5484  (COND_CASES_TAC);
5485  (NEW_GOAL `F`);
5486  (UP_ASM_TAC THEN EXPAND_TAC "H1");
5487  (REWRITE_TAC[SET_RULE `x IN {a} <=> x=a`]);
5488  (SET_TAC[ASSUME 
5489    `~(u0 = u1:real^3) /\ ~(u0 = u2) /\ ~(u0 = u3) /\ ~(u1 = u2) /\
5490     ~(u1 = u3) /\ ~(u2 = u3)`]);
5491  (UP_ASM_TAC THEN MESON_TAC[]);
5492  (EXPAND_TAC "H1" THEN REWRITE_TAC[SUM_SING]);
5493
5494  (REWRITE_WITH `f {u0, u1:real^3} = 
5495                  lmfun (y6 / &2) * dih_y y6 y4 sqrt2 sqrt2 sqrt2 y5`);
5496  (EXPAND_TAC "f");
5497
5498  (ABBREV_TAC `g = (\u v. if {u, v:real^3} IN edgeX V X
5499                           then dihX V X (u,v) * lmfun (hl [u; v])
5500                           else &0)`);
5501  (REWRITE_WITH `(\({u, v}). if {u, v} IN edgeX V X
5502              then dihX V X (u,v) * lmfun (hl [u; v])
5503              else &0) = (\({u, v:real^3}). g u v)`);
5504  (EXPAND_TAC "g" THEN REWRITE_TAC[]);
5505  (REWRITE_WITH `(\({u, v:real^3}). g u v) {u0, u1} = (g u0 u1):real`);
5506  (MATCH_MP_TAC BETA_PAIR_THM);
5507  (REPEAT STRIP_TAC THEN EXPAND_TAC "g" );
5508  (COND_CASES_TAC);
5509  (COND_CASES_TAC);
5510  (REWRITE_WITH `dihX V X (u,v) = dihX V X (v,u)`);
5511  (MATCH_MP_TAC Marchal_cells_3.DIHX_SYM);
5512  (REWRITE_TAC[mcell_set; IN_ELIM_THM]);
5513  (ASM_REWRITE_TAC[IN]);
5514  (EXISTS_TAC `3:num` THEN EXISTS_TAC `ul:(real^3)list` THEN ASM_REWRITE_TAC[]);
5515  (REWRITE_TAC[HL; set_of_list; SET_RULE `{a,b} = {b,a}`]);
5516  (NEW_GOAL `F`);
5517  (UP_ASM_TAC THEN REWRITE_TAC[]);
5518  (ONCE_REWRITE_TAC[SET_RULE `{a,b} = {b,a}`]);
5519  (ASM_REWRITE_TAC[]);
5520  (UP_ASM_TAC THEN MESON_TAC[]);
5521  (COND_CASES_TAC);
5522  (NEW_GOAL `F`);
5523  (UP_ASM_TAC THEN REWRITE_TAC[]);
5524  (ONCE_REWRITE_TAC[SET_RULE `{a,b} = {b,a}`]);
5525  (ASM_REWRITE_TAC[]);
5526  (UP_ASM_TAC THEN MESON_TAC[]);
5527  (REFL_TAC);
5528  (EXPAND_TAC "g");
5529  (COND_CASES_TAC);
5530  (REWRITE_TAC[HL_2; REAL_ARITH  `inv(&2) * a = a / &2`]);
5531  (REWRITE_TAC[REAL_ARITH ` t * lmfun(s) = lmfun(s) * t`]);
5532  (EXPAND_TAC "y6" THEN AP_TERM_TAC);
5533
5534  (REWRITE_TAC[ASSUME `dist (u0,u1:real^3) = y6`]);
5535  (ASM_REWRITE_TAC[]);
5536
5537  (NEW_GOAL `F`);
5538  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
5539  (SET_TAC[]);
5540  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
5541
5542
5543  (REWRITE_WITH `f {u0, u2:real^3} = 
5544                  lmfun (y5 / &2) * dih_y y5 y6 sqrt2 sqrt2 sqrt2 y4`);
5545  (EXPAND_TAC "f");
5546
5547  (ABBREV_TAC `g = (\u v. if {u, v:real^3} IN edgeX V X
5548                           then dihX V X (u,v) * lmfun (hl [u; v])
5549                           else &0)`);
5550  (REWRITE_WITH `(\({u, v}). if {u, v} IN edgeX V X
5551              then dihX V X (u,v) * lmfun (hl [u; v])
5552              else &0) = (\({u, v:real^3}). g u v)`);
5553  (EXPAND_TAC "g" THEN REWRITE_TAC[]);
5554  (REWRITE_WITH `(\({u, v:real^3}). g u v) {u0, u2} = (g u0 u2):real`);
5555  (MATCH_MP_TAC BETA_PAIR_THM);
5556  (REPEAT STRIP_TAC THEN EXPAND_TAC "g" );
5557  (COND_CASES_TAC);
5558  (COND_CASES_TAC);
5559  (REWRITE_WITH `dihX V X (u,v) = dihX V X (v,u)`);
5560  (MATCH_MP_TAC Marchal_cells_3.DIHX_SYM);
5561  (REWRITE_TAC[mcell_set; IN_ELIM_THM]);
5562  (ASM_REWRITE_TAC[IN]);
5563  (EXISTS_TAC `3:num` THEN EXISTS_TAC `ul:(real^3)list` THEN ASM_REWRITE_TAC[]);
5564  (REWRITE_TAC[HL; set_of_list; SET_RULE `{a,b} = {b,a}`]);
5565  (NEW_GOAL `F`);
5566  (UP_ASM_TAC THEN REWRITE_TAC[]);
5567  (ONCE_REWRITE_TAC[SET_RULE `{a,b} = {b,a}`]);
5568  (ASM_REWRITE_TAC[]);
5569  (UP_ASM_TAC THEN MESON_TAC[]);
5570  (COND_CASES_TAC);
5571  (NEW_GOAL `F`);
5572  (UP_ASM_TAC THEN REWRITE_TAC[]);
5573  (ONCE_REWRITE_TAC[SET_RULE `{a,b} = {b,a}`]);
5574  (ASM_REWRITE_TAC[]);
5575  (UP_ASM_TAC THEN MESON_TAC[]);
5576  (REFL_TAC);
5577  (EXPAND_TAC "g");
5578  (COND_CASES_TAC);
5579
5580  (REWRITE_TAC[HL_2; REAL_ARITH  `inv(&2) * a = a / &2`]);
5581  (REWRITE_TAC[REAL_ARITH ` t * lmfun(s) = lmfun(s) * t`]);
5582  (EXPAND_TAC "y5" THEN AP_TERM_TAC);
5583
5584  (REWRITE_TAC[ASSUME `dist (u0,u2:real^3) = y5`]);
5585  (ASM_REWRITE_TAC[]);
5586
5587  (NEW_GOAL `F`);
5588  (UP_ASM_TAC THEN REWRITE_TAC[ASSUME `edgeX V X = {u0, u1} INSERT H2`]);
5589  (EXPAND_TAC "H2" THEN SET_TAC[]);
5590  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
5591
5592
5593  (REWRITE_WITH `f {u1, u2:real^3} = 
5594                  lmfun (y4 / &2) * dih_y y4 y5 sqrt2 sqrt2 sqrt2 y6`);
5595  (EXPAND_TAC "f");
5596
5597  (ABBREV_TAC `g = (\u v. if {u, v:real^3} IN edgeX V X
5598                           then dihX V X (u,v) * lmfun (hl [u; v])
5599                           else &0)`);
5600  (REWRITE_WITH `(\({u, v}). if {u, v} IN edgeX V X
5601              then dihX V X (u,v) * lmfun (hl [u; v])
5602              else &0) = (\({u, v:real^3}). g u v)`);
5603  (EXPAND_TAC "g" THEN REWRITE_TAC[]);
5604  (REWRITE_WITH `(\({u, v:real^3}). g u v) {u1, u2} = (g u1 u2):real`);
5605  (MATCH_MP_TAC BETA_PAIR_THM);
5606  (REPEAT STRIP_TAC THEN EXPAND_TAC "g" );
5607  (COND_CASES_TAC);
5608  (COND_CASES_TAC);
5609  (REWRITE_WITH `dihX V X (u,v) = dihX V X (v,u)`);
5610  (MATCH_MP_TAC Marchal_cells_3.DIHX_SYM);
5611  (REWRITE_TAC[mcell_set; IN_ELIM_THM]);
5612  (ASM_REWRITE_TAC[IN]);
5613  (EXISTS_TAC `3` THEN EXISTS_TAC `ul:(real^3)list` THEN ASM_REWRITE_TAC[]);
5614  (REWRITE_TAC[HL; set_of_list; SET_RULE `{a,b} = {b,a}`]);
5615  (NEW_GOAL `F`);
5616  (UP_ASM_TAC THEN REWRITE_TAC[]);
5617  (ONCE_REWRITE_TAC[SET_RULE `{a,b} = {b,a}`]);
5618  (ASM_REWRITE_TAC[]);
5619  (UP_ASM_TAC THEN MESON_TAC[]);
5620  (COND_CASES_TAC);
5621  (NEW_GOAL `F`);
5622  (UP_ASM_TAC THEN REWRITE_TAC[]);
5623  (ONCE_REWRITE_TAC[SET_RULE `{a,b} = {b,a}`]);
5624  (ASM_REWRITE_TAC[]);
5625  (UP_ASM_TAC THEN MESON_TAC[]);
5626  (REFL_TAC);
5627  (EXPAND_TAC "g");
5628  (COND_CASES_TAC);
5629
5630  (REWRITE_TAC[HL_2; REAL_ARITH  `inv(&2) * a = a / &2`]);
5631  (REWRITE_TAC[REAL_ARITH ` t * lmfun(s) = lmfun(s) * t`]);
5632  (EXPAND_TAC "y4" THEN AP_TERM_TAC);
5633
5634
5635  (REWRITE_TAC[ASSUME `dist (u1,u2:real^3) = y4`]);
5636  (ASM_REWRITE_TAC[]);
5637
5638  (NEW_GOAL `F`);
5639  (UP_ASM_TAC THEN REWRITE_TAC[ASSUME `edgeX V X = {u0, u1} INSERT H2`]);
5640  (EXPAND_TAC "H2" THEN EXPAND_TAC "H1" THEN SET_TAC[]);
5641  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
5642
5643  (REAL_ARITH_TAC);
5644  (STRIP_TAC THEN NEW_GOAL `F`);
5645  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
5646  (UP_ASM_TAC THEN ASM_REWRITE_TAC[])]);;
5647
5648 (* ======================================================================= *)
5649 (*                   From Thomas Hales                                     *)
5650 (* ======================================================================= *)
5651
5652 let HJKDESR1a_1cell = prove_by_refinement(
5653   `&0 <  &8 * pi * sqrt2 / &3  -  &8 * mm1 `,
5654   (* {{{ proof *)
5655   [
5656   REWRITE_TAC[ arith `&8 * pi * sqrt2 / &3 = (&8 / &3) * (pi * sqrt2)`];
5657   MATCH_MP_TAC (arith `&3 * mm1 < z ==> &0 < (&8/ &3) * z  - &8 * mm1`);
5658   MATCH_MP_TAC REAL_LT_TRANS;
5659   EXISTS_TAC (`&3 * #1.3`);
5660   GMATCH_SIMP_TAC REAL_LT_LMUL_EQ;
5661   GMATCH_SIMP_TAC REAL_LT_MUL2;
5662   MP_TAC Flyspeck_constants.bounds;
5663   BY(REAL_ARITH_TAC)
5664   ]);;
5665
5666
5667
5668 end;;