1 (* ========================================================================= *)
2 (* FLYSPECK - BOOK FORMALIZATION *)
4 (* Authour : VU KHAC KY *)
5 (* Book lemma: EMNWUUS *)
6 (* Chaper : Packing (Marchal Cells) *)
7 (* Date : October 3, 2010 *)
9 (* ========================================================================= *)
11 #use "/usr/programs/hollight/hollight-svn75/hol.ml";;
12 loads "Multivariate/flyspeck.ml";;
13 #use "/home/ky/flyspeck/working/boot.hl";;
14 flyspeck_needs "trigonometry/trig1.hl";;
15 flyspeck_needs "trigonometry/trig2.hl";;
16 flyspeck_needs "trigonometry/trigonometry.hl";;
18 (* ================= Loaded files ======================================== *)
20 flyspeck_needs "leg/collect_geom.hl";;
21 flyspeck_needs "fan/fan_defs.hl";;
22 flyspeck_needs "fan/introduction.hl";;
23 flyspeck_needs "fan/topology.hl";;
24 flyspeck_needs "fan/fan_misc.hl";;
25 flyspeck_needs "fan/HypermapAndFan.hl";;
26 flyspeck_needs "packing/pack_defs.hl";;
27 flyspeck_needs "packing/pack_concl.hl";;
28 flyspeck_needs "packing/pack1.hl";;
29 flyspeck_needs "packing/pack2.hl";;
30 flyspeck_needs "packing/pack3.hl";;
31 flyspeck_needs "packing/Rogers.hl";;
32 flyspeck_needs "nonlinear/vukhacky_tactics.hl";;
34 (* ====================== Open appropriate files ============================ *)
35 flyspeck_needs "packing/marchal_cells.hl";;
37 module Emnwuus = struct
40 open Prove_by_refinement;;
41 open Vukhacky_tactics;;
49 let (tms,tm) = top_goal () in
50 let vss = map frees (tm::tms) in
51 let vs = setify (flat vss) in
54 (* ======================= Begin working ==================================== *)
55 (* ========================================================================= *)
57 let EMNWUUS1 = prove_by_refinement ( EMNWUUS1_concl,
58 [ (REWRITE_TAC[mcell4] THEN REPEAT STRIP_TAC THEN EQ_TAC THEN COND_CASES_TAC);
60 (NEW_GOAL `set_of_list (ul:(real^3)list) = {}`);
61 (ASM_MESON_TAC[CONVEX_HULL_EQ_EMPTY]);
62 (NEW_GOAL `ul:(real^3)list = []`);
63 (NEW_GOAL `~(?h t. ul:(real^3)list = CONS h t)`);
65 (NEW_GOAL `(h:real^3) IN set_of_list ul`);
66 (REWRITE_TAC [ASSUME `ul = CONS (h:real^3) t`; IN_SET_OF_LIST;MEM]);
68 (ASM_MESON_TAC[list_CASES]);
69 (UNDISCH_TAC `barV V 3 (ul:(real^3)list)`);
72 (NEW_GOAL `LENGTH (ul:(real^3)list) = 0`);
73 (ASM_MESON_TAC[ASSUME `ul:(real^3)list =[]`;LENGTH]);
80 (* ========================================================================= *)
82 let EMNWUUS2 = prove_by_refinement (EMNWUUS2_concl,
83 [ (REPEAT GEN_TAC THEN STRIP_TAC);
87 (* Break into 4 cases *)
89 (* =============== Case 1 ================================ *)
91 (REWRITE_TAC[mcell0]);
92 (REWRITE_TAC[SET_RULE `x DIFF y = {} <=> (!a. a IN x ==> a IN y)`]);
93 (REWRITE_TAC[ROGERS;IMAGE;IN;ball;SUBSET;IN_ELIM_THM]);
95 (MATCH_MP_TAC BALL_CONVEX_HULL_LEMMA);
97 (GEN_TAC THEN REWRITE_TAC[IN_ELIM_THM]);
100 (* New_subgoal 1.1 *)
101 (NEW_GOAL `hl (truncate_simplex x' (ul:(real^3)list))
102 <= hl (truncate_simplex (LENGTH ul - 1) ul)`);
103 (ASM_CASES_TAC `x' < LENGTH (ul:(real^3)list) - 1`);
104 (MATCH_MP_TAC (REAL_ARITH `a < b ==> a <= b`));
105 (NEW_GOAL `x' < (LENGTH (ul:(real^3)list) - 1) /\ LENGTH ul - 1 <= 3`);
106 (ASM_REWRITE_TAC[] THEN UNDISCH_TAC `barV V 3 ul`);
107 (REWRITE_TAC[BARV] THEN ARITH_TAC);
109 (NEW_GOAL `ul IN barV V 3`);
111 (ASM_MESON_TAC[XNHPWAB4; ARITH_RULE `3 <= 3`]);
112 (MATCH_MP_TAC (REAL_ARITH `a = b ==> a <= b`));
113 (REWRITE_WITH `LENGTH (ul:(real^3)list) - 1 = x'`);
115 (* End subgoal 1.1 *)
117 (* New subgoal 1.2 *)
118 (NEW_GOAL `hl (truncate_simplex (LENGTH ul - 1) ul) = hl (ul:(real^3)list)`);
120 (REWRITE_TAC[TRUNCATE_SIMPLEX]);
121 (MATCH_MP_TAC SELECT_UNIQUE);
122 (GEN_TAC THEN REWRITE_TAC[IN_ELIM_THM;INITIAL_SUBLIST] THEN EQ_TAC);
124 (NEW_GOAL `LENGTH (ul:(real^3)list) =
125 LENGTH (y:(real^3)list) + LENGTH (yl:(real^3)list)`);
126 (ASM_MESON_TAC[LENGTH_APPEND]);
127 (NEW_GOAL `LENGTH (yl:(real^3)list) = 0`);
129 (NEW_GOAL `(yl:(real^3)list) = []`);
130 (ASM_MESON_TAC[LENGTH_EQ_NIL]);
131 (ASM_MESON_TAC[APPEND_NIL]);
135 (EXISTS_TAC `[]:(real^3)list`);
136 (ASM_MESON_TAC[APPEND_NIL]);
137 (* End subgoal 1.2 *)
139 (* New subgoal 1.3 *)
141 (NEW_GOAL `?u0 u1 u2 u3:real^3. ul = [u0;u1;u2;u3]`);
142 (ASM_MESON_TAC[BARV_3_EXPLICIT]);
143 (REPEAT (FIRST_X_ASSUM CHOOSE_TAC));
144 (REWRITE_TAC[ASSUME `ul = [u0:real^3; u1; u2; u3]`; HD]);
146 (* ---------------------------------------------- *)
147 (* Consider case x' = 0 *)
149 (ASM_CASES_TAC `x' = 0`);
150 (REWRITE_WITH `x:real^3 = u0`);
151 (MP_TAC (ASSUME `x:real^3 = omega_list_n V ul x'`));
152 (ASM_MESON_TAC[OMEGA_LIST_0_EXPLICIT; GSYM IN]);
153 (ASM_REWRITE_TAC[DIST_REFL]);
154 (MESON_TAC[SQRT_LT_0;REAL_ARITH `&0 <= &2 /\ &0 < &2`]);
156 (* ---------------------------------------------- *)
157 (* Consider case x' = 1 *)
159 (ASM_CASES_TAC `x' = 1`);
160 (REWRITE_WITH `x:real^3 = circumcenter {u0, u1}`);
161 (MP_TAC (ASSUME `x:real^3 = omega_list_n V ul x'`));
162 (ASM_MESON_TAC[OMEGA_LIST_1_EXPLICIT; GSYM IN]);
163 (ONCE_REWRITE_TAC[DIST_SYM]);
164 (REWRITE_WITH `dist (circumcenter {u0:real^3, u1},u0)
165 = hl (truncate_simplex x' (ul:(real^3)list))`);
166 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1;HL;radV]);
167 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
168 (MATCH_MP_TAC SELECT_UNIQUE);
169 (GEN_TAC THEN REWRITE_TAC[IN_ELIM_THM; MESON[set_of_list]
170 `set_of_list [u0:real^3;u1] = {u0, u1}`] THEN EQ_TAC);
171 (DISCH_TAC THEN (FIRST_ASSUM MATCH_MP_TAC));
172 (SUBGOAL_THEN `(u0:real^3) IN {u0, u1}` ASSUME_TAC);
176 (NEW_GOAL `w IN {u0,u1:real^3}`);
177 (UP_ASM_TAC THEN MESON_TAC[IN]);
179 `(!w. w IN {u0,u1:real^3} ==> radV {u0,u1} = dist (circumcenter {u0,u1},w))`);
180 (MATCH_MP_TAC OAPVION2);
181 (REWRITE_TAC[AFFINE_INDEPENDENT_2]);
183 (NEW_GOAL `(radV {u0,u1:real^3} = dist (circumcenter {u0,u1},w))`);
185 (NEW_GOAL `(radV {u0,u1:real^3} = dist (circumcenter {u0,u1},u0))`);
186 (FIRST_ASSUM MATCH_MP_TAC);
189 (ASM_REAL_ARITH_TAC);
191 (* ---------------------------------------------- *)
192 (* Consider case x' = 2 *)
194 (ASM_CASES_TAC `x' = 2`);
195 (REWRITE_WITH `x:real^3 = circumcenter {u0, u1, u2}`);
196 (MP_TAC (ASSUME `x:real^3 = omega_list_n V ul x'`));
197 (ASM_MESON_TAC[OMEGA_LIST_2_EXPLICIT; GSYM IN]);
198 (ONCE_REWRITE_TAC[DIST_SYM]);
199 (REWRITE_WITH `dist (circumcenter {u0:real^3, u1, u2},u0)
200 = hl (truncate_simplex x' (ul:(real^3)list))`);
201 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2;HL;radV]);
202 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
203 (MATCH_MP_TAC SELECT_UNIQUE);
204 (GEN_TAC THEN REWRITE_TAC[IN_ELIM_THM; MESON[set_of_list]
205 `set_of_list [u0:real^3;u1;u2] = {u0, u1, u2}`] THEN EQ_TAC);
206 (DISCH_TAC THEN (FIRST_ASSUM MATCH_MP_TAC));
207 (SUBGOAL_THEN `(u0:real^3) IN {u0, u1, u2}` ASSUME_TAC);
211 (NEW_GOAL `w IN {u0,u1:real^3,u2}`);
212 (UP_ASM_TAC THEN MESON_TAC[IN]);
213 (NEW_GOAL `(!w. w IN {u0,u1:real^3, u2} ==>
214 radV {u0,u1,u2} = dist (circumcenter {u0,u1,u2},w))`);
215 (MATCH_MP_TAC OAPVION2);
216 (MATCH_MP_TAC AFFINE_INDEPENDENT_SUBSET);
217 (EXISTS_TAC `{u0, u1, u2, u3:real^3}`);
218 (REWRITE_TAC[SET_RULE `{a, b:A, c} SUBSET {a, b , c, d:A}`]);
219 (REWRITE_TAC[AFFINE_INDEPENDENT_IFF_CARD]);
221 (REWRITE_TAC[FINITE_SET_OF_LIST; MESON[set_of_list]
222 `{u0, u1, u2,u3} = set_of_list [u0;u1;u2:real^3;u3]`]);
223 (NEW_GOAL `aff_dim {u0,u1,u2,u3:real^3} = &3`);
224 (REWRITE_TAC[MESON[set_of_list]
225 `{u0, u1, u2,u3} = set_of_list [u0;u1;u2:real^3;u3]`]);
226 (MATCH_MP_TAC MHFTTZN1);
227 (EXISTS_TAC `V:real^3->bool`);
228 (ASM_MESON_TAC[ARITH_RULE `3 <= 3`]);
229 (ONCE_ASM_REWRITE_TAC[]);
230 (NEW_GOAL `FINITE {u1, u2, u3:real^3}`);
231 (REWRITE_TAC[FINITE_SET_OF_LIST; MESON[set_of_list]
232 `{u1, u2,u3} = set_of_list [u1;u2:real^3;u3]`]);
233 (MATCH_MP_TAC (ARITH_RULE
234 `(a = int_of_num 4) ==> (int_of_num 3 = a - int_of_num 1)`));
235 (MATCH_MP_TAC (ARITH_RULE `a = b ==> int_of_num a = int_of_num b`));
236 (NEW_GOAL `CARD {u0:real^3, u1, u2, u3} =
237 (if u0 IN {u1, u2, u3} then CARD {u1, u2, u3}
238 else SUC (CARD {u1, u2, u3} ))`);
239 (UP_ASM_TAC THEN REWRITE_TAC[CARD_CLAUSES]);
240 (UP_ASM_TAC THEN COND_CASES_TAC);
242 (NEW_GOAL `aff_dim {u0:real^3, u1, u2, u3} < &3`);
243 (REWRITE_WITH `{u0,u1,u2,u3:real^3} = {u1, u2,u3}`);
244 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
245 (NEW_GOAL `CARD {u1, u2, u3} = CARD {u0, u1, u2, u3} <=>
246 {u1, u2, u3:real^3} = {u0, u1, u2, u3}`);
247 (MATCH_MP_TAC SUBSET_CARD_EQ);
249 (REWRITE_TAC[MESON[set_of_list]
250 `{u0, u1, u2, u3:real^3} = set_of_list [u0;u1;u2;u3]`;FINITE_SET_OF_LIST]);
254 (REWRITE_TAC[MESON[set_of_list]
255 `{u1:real^3,u2, u3} = set_of_list [u1;u2;u3]`]);
256 (MATCH_MP_TAC AFF_DIM_LE_LENGTH);
257 (REWRITE_TAC[LENGTH]);
260 (ASM_MESON_TAC[ARITH_RULE `a = int_of_num 3 /\ a < int_of_num 3 ==> F`]);
263 (NEW_GOAL `CARD {u1:real^3, u2, u3} = 3`);
264 (NEW_GOAL `CARD {u1,u2,u3:real^3} <= 3`);
265 (MATCH_MP_TAC (ARITH_RULE
266 `a <= LENGTH [u1;u2;u3:real^3] /\ LENGTH [u1;u2;u3:real^3] <= b ==> a <= b`));
268 (REWRITE_TAC[MESON[set_of_list]
269 `{u1,u2,u3:real^3} = set_of_list [u1;u2;u3]`;CARD_SET_OF_LIST_LE]);
270 (REWRITE_TAC[LENGTH] THEN ARITH_TAC);
271 (ASM_CASES_TAC `CARD {u1:real^3, u2, u3} <= 2`);
272 (NEW_GOAL `CARD {u0,u1,u2,u3:real^3} <= 3`);
273 (NEW_GOAL `CARD {u0:real^3, u1, u2, u3} =
274 (if u0 IN {u1,u2,u3} then CARD {u1,u2,u3} else SUC (CARD {u1,u2,u3}))`);
275 (NEW_GOAL `FINITE {u1,u2,u3:real^3}`);
276 (REWRITE_TAC[MESON[set_of_list]
277 `{u1,u2,u3:real^3} = set_of_list [u1;u2;u3]`;FINITE_SET_OF_LIST]);
278 (ASM_REWRITE_TAC[CARD_CLAUSES]);
279 (UP_ASM_TAC THEN COND_CASES_TAC);
282 (ABBREV_TAC `xl = list_of_set {u0, u1, u2, u3:real^3}`);
285 (NEW_GOAL `aff_dim {u0:real^3, u1, u2, u3}
286 < int_of_num (CARD {u0, u1, u2, u3})`);
287 (REWRITE_WITH `{u0,u1,u2,u3:real^3} = set_of_list (xl:(real^3)list)`);
289 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
290 (MATCH_MP_TAC SET_OF_LIST_OF_SET);
291 (REWRITE_TAC[MESON[set_of_list]
292 `{u0, u1, u2, u3:real^3} = set_of_list [u0;u1;u2;u3]`;FINITE_SET_OF_LIST]);
293 (MATCH_MP_TAC AFF_DIM_LE_LENGTH);
294 (REWRITE_WITH `set_of_list (xl:(real^3)list) = {u0, u1, u2, u3:real^3}`);
296 (MATCH_MP_TAC SET_OF_LIST_OF_SET);
297 (REWRITE_TAC[MESON[set_of_list]
298 `{u0,u1,u2,u3:real^3} = set_of_list [u0;u1;u2;u3]`;FINITE_SET_OF_LIST]);
300 (MATCH_MP_TAC LENGTH_LIST_OF_SET);
301 (REWRITE_TAC[MESON[set_of_list]
302 `{u0,u1,u2,u3:real^3} = set_of_list [u0;u1;u2;u3]`;FINITE_SET_OF_LIST]);
308 (MATCH_MP_TAC (REAL_ARITH
309 `radV {u0,u1,u2:real^3} = a /\ radV {u0,u1,u2} = b ==> a = b`));
312 (FIRST_ASSUM MATCH_MP_TAC);
314 (FIRST_ASSUM MATCH_MP_TAC);
316 (ASM_REAL_ARITH_TAC);
318 (* ---------------------------------------------- *)
319 (* Consider case x' = 3 *)
321 (ASM_CASES_TAC `x' = 3`);
322 (REWRITE_WITH `x = circumcenter {u0,u1,u2,u3:real^3}`);
324 (MATCH_MP_TAC OMEGA_LIST_3_EXPLICIT);
325 (ASM_MESON_TAC[GSYM IN]);
326 (NEW_GOAL `dist (u0,circumcenter {u0:real^3, u1, u2, u3})
327 = hl (ul:(real^3)list)`);
328 (ASM_REWRITE_TAC[HL]);
329 (REWRITE_WITH `set_of_list [u0:real^3; u1; u2; u3] = {u0,u1,u2,u3}`);
330 (MESON_TAC[set_of_list]);
332 (NEW_GOAL `(!w. w IN {u0,u1:real^3, u2,u3} ==>
333 radV {u0,u1,u2,u3} = dist (circumcenter {u0,u1,u2,u3},w))`);
334 (MATCH_MP_TAC OAPVION2);
335 (REWRITE_TAC[AFFINE_INDEPENDENT_IFF_CARD]);
337 (REWRITE_TAC[FINITE_SET_OF_LIST; MESON[set_of_list]
338 `{u0, u1, u2,u3} = set_of_list [u0;u1;u2:real^3;u3]`]);
339 (NEW_GOAL `aff_dim {u0,u1,u2,u3:real^3} = &3`);
340 (REWRITE_TAC[MESON[set_of_list]
341 `{u0, u1, u2,u3} = set_of_list [u0;u1;u2:real^3;u3]`]);
342 (MATCH_MP_TAC MHFTTZN1);
343 (EXISTS_TAC `V:real^3->bool`);
344 (ASM_MESON_TAC[ARITH_RULE `3 <= 3`]);
345 (ONCE_ASM_REWRITE_TAC[]);
346 (MATCH_MP_TAC (ARITH_RULE
347 `(a = int_of_num 4) ==> (int_of_num 3 = a - int_of_num 1)`));
348 (MATCH_MP_TAC (ARITH_RULE `a = b ==> int_of_num a = int_of_num b`));
350 (NEW_GOAL `FINITE {u1, u2, u3:real^3}`);
351 (REWRITE_TAC[FINITE_SET_OF_LIST; MESON[set_of_list]
352 `{u1, u2,u3} = set_of_list [u1;u2:real^3;u3]`]);
353 (NEW_GOAL `CARD {u0:real^3, u1, u2, u3} =
354 (if u0 IN {u1, u2, u3} then CARD {u1, u2, u3}
355 else SUC (CARD {u1, u2, u3} ))`);
356 (UP_ASM_TAC THEN REWRITE_TAC[CARD_CLAUSES]);
357 (UP_ASM_TAC THEN COND_CASES_TAC);
359 (NEW_GOAL `aff_dim {u0:real^3, u1, u2, u3} < &3`);
360 (REWRITE_WITH `{u0,u1,u2,u3:real^3} = {u1, u2,u3}`);
361 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
362 (NEW_GOAL `CARD {u1, u2, u3} = CARD {u0, u1, u2, u3} <=>
363 {u1, u2, u3:real^3} = {u0, u1, u2, u3}`);
364 (MATCH_MP_TAC SUBSET_CARD_EQ);
366 (REWRITE_TAC[MESON[set_of_list]
367 `{u0, u1, u2, u3:real^3} = set_of_list [u0;u1;u2;u3]`;FINITE_SET_OF_LIST]);
368 (SET_TAC[]); (* check *)
371 (REWRITE_TAC[MESON[set_of_list]
372 `{u1:real^3,u2, u3} = set_of_list [u1;u2;u3]`]);
373 (MATCH_MP_TAC AFF_DIM_LE_LENGTH);
374 (REWRITE_TAC[LENGTH]);
377 (ASM_MESON_TAC[ARITH_RULE `a = int_of_num 3 /\ a < int_of_num 3 ==> F`]);
380 (NEW_GOAL `CARD {u1:real^3, u2, u3} = 3`);
381 (NEW_GOAL `CARD {u1,u2,u3:real^3} <= 3`);
382 (MATCH_MP_TAC (ARITH_RULE
383 `a <= LENGTH [u1;u2;u3:real^3] /\ LENGTH [u1;u2;u3:real^3] <= b ==> a <= b`));
385 (REWRITE_TAC[MESON[set_of_list]
386 `{u1,u2,u3:real^3} = set_of_list [u1;u2;u3]`;CARD_SET_OF_LIST_LE]);
387 (REWRITE_TAC[LENGTH] THEN ARITH_TAC);
388 (ASM_CASES_TAC `CARD {u1:real^3, u2, u3} <= 2`);
389 (NEW_GOAL `CARD {u0,u1,u2,u3:real^3} <= 3`);
390 (NEW_GOAL `CARD {u0:real^3, u1, u2, u3} =
391 (if u0 IN {u1,u2,u3} then CARD {u1,u2,u3} else SUC (CARD {u1,u2,u3}))`);
392 (NEW_GOAL `FINITE {u1,u2,u3:real^3}`);
393 (REWRITE_TAC[MESON[set_of_list]
394 `{u1,u2,u3:real^3} = set_of_list [u1;u2;u3]`;FINITE_SET_OF_LIST]);
395 (ASM_REWRITE_TAC[CARD_CLAUSES]);
396 (UP_ASM_TAC THEN COND_CASES_TAC);
399 (ABBREV_TAC `xl = list_of_set {u0, u1, u2, u3:real^3}`);
402 (NEW_GOAL `aff_dim {u0:real^3, u1, u2, u3}
403 < int_of_num (CARD {u0, u1, u2, u3})`);
404 (REWRITE_WITH `{u0,u1,u2,u3:real^3} = set_of_list (xl:(real^3)list)`);
406 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
407 (MATCH_MP_TAC SET_OF_LIST_OF_SET);
408 (REWRITE_TAC[MESON[set_of_list]
409 `{u0, u1, u2, u3:real^3} = set_of_list [u0;u1;u2;u3]`;FINITE_SET_OF_LIST]);
410 (MATCH_MP_TAC AFF_DIM_LE_LENGTH);
411 (REWRITE_WITH `set_of_list (xl:(real^3)list) = {u0, u1, u2, u3:real^3}`);
413 (MATCH_MP_TAC SET_OF_LIST_OF_SET);
414 (REWRITE_TAC[MESON[set_of_list]
415 `{u0,u1,u2,u3:real^3} = set_of_list [u0;u1;u2;u3]`;FINITE_SET_OF_LIST]);
417 (MATCH_MP_TAC LENGTH_LIST_OF_SET);
418 (REWRITE_TAC[MESON[set_of_list]
419 `{u0,u1,u2,u3:real^3} = set_of_list [u0;u1;u2;u3]`;FINITE_SET_OF_LIST]);
425 (MATCH_MP_TAC (REAL_ARITH
426 `radV {u0,u1,u2:real^3,u3} = a /\ radV {u0,u1,u2,u3} = b ==> a = b`));
428 (ONCE_REWRITE_TAC[DIST_SYM] THEN FIRST_ASSUM MATCH_MP_TAC);
434 (* --------------------------------------------- *)
436 (UNDISCH_TAC `barV V 3 (ul:(real^3)list)`);
444 Here we have finished the first part `mcell0 V ul = {}`;there are 3 parts left:
450 (* =============== Case 2 =================================== *)
452 (REWRITE_TAC[mcell1]);
455 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
456 (UP_ASM_TAC THEN MESON_TAC[]);
459 (* =============== Case 3 =================================== *)
460 (REWRITE_TAC[mcell2]);
463 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
464 (UP_ASM_TAC THEN MESON_TAC[]);
467 (* =============== Case 4 =================================== *)
469 (REWRITE_TAC[mcell3]);
472 (ASM_REAL_ARITH_TAC);
477 (* =============== Reverse part =============================== *)
480 (ASM_CASES_TAC `hl (ul:(real^3)list) >= sqrt (&2)`);
481 (NEW_GOAL `omega_list V (ul:(real^3)list) IN mcell0 V ul`);
482 (REWRITE_TAC[mcell0; IN_DIFF;ROGERS]);
484 (NEW_GOAL`LENGTH (ul:(real^3)list) = 4`);
485 (NEW_GOAL `?u0 u1 u2 u3:real^3. ul = [u0; u1; u2; u3]`);
486 (MATCH_MP_TAC BARV_3_EXPLICIT);
487 (EXISTS_TAC `V:real^3->bool`);
489 (FIRST_X_ASSUM CHOOSE_TAC);
490 (FIRST_X_ASSUM CHOOSE_TAC);
491 (FIRST_X_ASSUM CHOOSE_TAC);
492 (FIRST_X_ASSUM CHOOSE_TAC);
493 (ASM_REWRITE_TAC[LENGTH]);
495 (ASM_REWRITE_TAC[OMEGA_LIST; ARITH_RULE `4 - 1 = 3`]);
496 (REWRITE_TAC[IMAGE; CONVEX_HULL_EXPLICIT; IN; IN_ELIM_THM]);
497 (EXISTS_TAC `{omega_list_n V (ul:(real^3)list) 3}`);
498 (ABBREV_TAC `u = (\x:real^3. &1 )`);
500 (EXISTS_TAC `(\x:real^3. &1)`);
502 (MESON_TAC[FINITE_SING]);
503 (REWRITE_TAC[SUBSET;IN;IN_ELIM_THM; Geomdetail.IN_ACT_SING]);
504 (GEN_TAC THEN DISCH_TAC THEN ASM_REWRITE_TAC[]);
506 (ASM_REWRITE_TAC[ARITH_RULE `3 < 4`]);
507 (REWRITE_TAC[BETA_THM]);
509 (REWRITE_TAC[SUM_SING]);
510 (REWRITE_TAC[VSUM_SING]);
512 (REWRITE_TAC[IN; ball; IN_ELIM_THM]);
513 (ONCE_REWRITE_TAC[DIST_SYM]);
514 (MATCH_MP_TAC (REAL_ARITH `x <= y ==> ~(y < x)`));
515 (MATCH_MP_TAC (REAL_ARITH `hl (ul:(real^3)list) >= x /\ hl ul <= z ==> x <= z`));
517 (MATCH_MP_TAC WAUFCHE1);
519 (ASM_REWRITE_TAC[IN]);
521 (UP_ASM_TAC THEN UNDISCH_TAC `mcell0 V (ul:(real^3)list) = {}`);
523 (UP_ASM_TAC THEN MESON_TAC[]);
524 (UP_ASM_TAC THEN REAL_ARITH_TAC)]);;