2 (* ========================================================================= *)
3 (* FLYSPECK - BOOK FORMALIZATION *)
5 (* Authour : VU KHAC KY *)
7 (* Chaper : Packing (Marchal Cells 3) *)
9 (* ========================================================================= *)
12 open Euler_main_theorem;;
19 open Vukhacky_tactics;;
22 open Marchal_cells_2;;
23 open Marchal_cells_2_new;;
38 open Upfzbzm_support_lemmas;;
41 let TAKE_TAC = UP_ASM_TAC THEN REPEAT STRIP_TAC;;
42 (* ==================================================================== *)
45 let HD_IN_ROGERS = prove (
46 `!V ul. saturated V /\ packing V /\ barV V 3 ul ==> HD ul IN rogers V ul`,
48 ASM_SIMP_TAC[ROGERS_EXPLICIT] THEN
49 MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET THEN SET_TAC[]);;
51 (* ==================================================================== *)
54 let ROGERS_SUBSET_VORONOI_CLOSED = prove_by_refinement (
55 `!V ul. saturated V /\ packing V /\ barV V 3 ul ==>
56 rogers V ul SUBSET voronoi_closed V (HD ul)`,
58 (ASM_SIMP_TAC[ROGERS_EXPLICIT]);
59 (NEW_GOAL `voronoi_closed V (HD ul) =
60 convex hull (voronoi_closed V ((HD ul):real^3))`);
61 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
62 (REWRITE_TAC[CONVEX_HULL_EQ]);
63 (REWRITE_TAC[Packing3.CONVEX_VORONOI_CLOSED]);
64 (ONCE_ASM_REWRITE_TAC[]);
65 (MATCH_MP_TAC Marchal_cells.CONVEX_HULL_SUBSET);
67 (NEW_GOAL `?u0 u1 u2 u3. ul = [u0;u1;u2;u3:real^3]`);
68 (MATCH_MP_TAC BARV_3_EXPLICIT);
69 (EXISTS_TAC `V:real^3->bool` THEN ASM_SET_TAC[]);
70 (UP_ASM_TAC THEN STRIP_TAC);
72 (REWRITE_TAC[GSYM OMEGA_LIST_N]);
73 (REWRITE_WITH `voronoi_closed V (omega_list_n V ul 0) =
74 voronoi_list V (truncate_simplex 0 ul)`);
75 (ASM_REWRITE_TAC[OMEGA_LIST_N; TRUNCATE_SIMPLEX_EXPLICIT_0; VORONOI_LIST;
76 VORONOI_SET; set_of_list; HD] THEN SET_TAC[]);
78 (NEW_GOAL `omega_list_n V ul 0 IN
79 voronoi_list V (truncate_simplex 0 ul)`);
80 (MATCH_MP_TAC Rogers.OMEGA_LIST_N_IN_VORONOI_LIST_GEN);
81 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
82 (NEW_GOAL `omega_list_n V ul 1 IN
83 voronoi_list V (truncate_simplex 0 ul)`);
84 (MATCH_MP_TAC Rogers.OMEGA_LIST_N_IN_VORONOI_LIST_GEN);
85 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
86 (NEW_GOAL `omega_list_n V ul 2 IN
87 voronoi_list V (truncate_simplex 0 ul)`);
88 (MATCH_MP_TAC Rogers.OMEGA_LIST_N_IN_VORONOI_LIST_GEN);
89 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
90 (NEW_GOAL `omega_list_n V ul 3 IN
91 voronoi_list V (truncate_simplex 0 ul)`);
92 (MATCH_MP_TAC Rogers.OMEGA_LIST_N_IN_VORONOI_LIST_GEN);
93 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
96 (* ==================================================================== *)
99 let HD_IN_MCELL = prove_by_refinement (
105 ~(X = {}) /\ ~(i = 0)
108 (NEW_GOAL `?u0 u1 u2 u3. ul = [u0;u1;u2;u3:real^3]`);
109 (MATCH_MP_TAC BARV_3_EXPLICIT);
110 (EXISTS_TAC `V:real^3->bool` THEN ASM_SET_TAC[]);
111 (UP_ASM_TAC THEN STRIP_TAC);
113 (ASM_REWRITE_TAC[HD]);
114 (ASM_CASES_TAC `i = 1`);
115 (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell1]);
117 (ASM_SIMP_TAC[IN_DIFF;IN_INTER; HD; TL; IN_CBALL; DIST_REFL;
118 TRUNCATE_SIMPLEX_EXPLICIT_1; rcone_gt; rconesgn]);
120 (REWRITE_WITH `u0 = HD ul /\ [u0; u1; u2; u3:real^3] = ul`);
121 (ASM_REWRITE_TAC[HD]);
122 (MATCH_MP_TAC HD_IN_ROGERS);
124 (MATCH_MP_TAC SQRT_POS_LE);
126 (UP_ASM_TAC THEN REWRITE_TAC[IN; IN_ELIM_THM; VECTOR_ARITH
127 `(u0 - u0) dot (u1 - u0) = &0`; DIST_REFL]);
130 (NEW_GOAL `X:real^3->bool = {}`);
131 (REWRITE_TAC[ASSUME `X = mcell i V ul`; ASSUME `i = 1`; MCELL_EXPLICIT; mcell1]);
140 (ASM_CASES_TAC `i = 2`);
141 (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2]);
144 (ASM_SIMP_TAC[IN_INTER; HD; TL; DIST_REFL;
145 TRUNCATE_SIMPLEX_EXPLICIT_1; rcone_ge; rconesgn; IN; IN_ELIM_THM]);
147 (REWRITE_TAC[VECTOR_ARITH `(u0 - u0) dot (u1 - u0) = &0`]);
149 (REWRITE_TAC[GSYM NORM_POW_2; GSYM dist; REAL_POW_2]);
150 (REWRITE_TAC[REAL_ARITH `a * a >= a * a * b <=> &0 <= a * a * (&1 - b)`]);
151 (MATCH_MP_TAC REAL_LE_MUL);
152 (REWRITE_TAC[DIST_POS_LE]);
153 (MATCH_MP_TAC REAL_LE_MUL);
154 (REWRITE_TAC[DIST_POS_LE]);
155 (ABBREV_TAC `s = hl (truncate_simplex 1 [u0; u1; u2; u3:real^3])`);
157 (REWRITE_TAC[REAL_ARITH `&0 <= a - b <=> b <= a`]);
158 (REWRITE_WITH `s / sqrt (&2) <= &1 <=> s <= &1 * sqrt (&2)`);
159 (MATCH_MP_TAC REAL_LE_LDIV_EQ);
160 (MATCH_MP_TAC SQRT_POS_LT THEN REAL_ARITH_TAC);
161 (ASM_REAL_ARITH_TAC);
163 (REWRITE_WITH `[u0; u1; u2; u3:real^3] = ul`);
165 (ABBREV_TAC `m = mxi V ul`);
166 (ABBREV_TAC `s3 = omega_list_n V ul 3`);
167 (REWRITE_WITH `aff_ge {u0, u1:real^3} {m, s3} u0 <=>
168 u0 IN aff_ge {u0, u1} {m, s3}`);
170 (NEW_GOAL `u0 IN convex hull {u0,u1,m,s3:real^3}`);
171 (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
173 (NEW_GOAL `convex hull {u0,u1,m,s3:real^3} SUBSET aff_ge {u0, u1} {m, s3}`);
174 (REWRITE_TAC[Marchal_cells_2_new.CONVEX_HULL_4_SUBSET_AFF_GE_2_2]);
175 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
177 (NEW_GOAL `X:real^3->bool = {}`);
178 (REWRITE_TAC[ASSUME `X = mcell i V ul`; ASSUME `i = 2`; MCELL_EXPLICIT; mcell2]);
187 (ASM_CASES_TAC `i = 3`);
188 (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell3]);
190 (REWRITE_TAC[set_of_list;TRUNCATE_SIMPLEX_EXPLICIT_2]);
191 (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
194 (NEW_GOAL `X:real^3->bool = {}`);
195 (REWRITE_TAC[ASSUME `X = mcell i V ul`; ASSUME `i = 3`; MCELL_EXPLICIT; mcell3]);
204 (ASM_CASES_TAC `i >= 4`);
205 (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4]);
207 (REWRITE_TAC[set_of_list]);
208 (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
211 (NEW_GOAL `X:real^3->bool = {}`);
212 (SIMP_TAC[ASSUME `X = mcell i V ul`; ASSUME `i >= 4`; MCELL_EXPLICIT; mcell4]);
223 (ASM_MESON_TAC[])]);;
226 (* ==================================================================== *)
229 let FINITE_MCELL_SET_lemma1 = prove_by_refinement (
235 X SUBSET ball (vec 0, r) /\
237 ==> (!u. u IN set_of_list ul ==> u IN ball (vec 0, r + &6))`,
241 (ASM_CASES_TAC `i = 0`);
242 (UNDISCH_TAC `X = mcell i V ul`THEN ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell0]);
244 (NEW_GOAL `!s. s IN rogers V ul ==> dist (HD ul, s) < &2`);
246 (NEW_GOAL `rogers V ul SUBSET voronoi_closed V (HD ul)`);
247 (ASM_SIMP_TAC[ROGERS_SUBSET_VORONOI_CLOSED]);
248 (NEW_GOAL `s:real^3 IN voronoi_closed V (HD ul)`);
250 (UNDISCH_TAC `saturated (V:real^3->bool)`);
251 (REWRITE_TAC[saturated]);
253 (NEW_GOAL `?y. y IN V /\ dist (s, y:real^3) < &2`);
255 (UP_ASM_TAC THEN STRIP_TAC);
256 (UNDISCH_TAC `s:real^3 IN voronoi_closed V (HD ul)` THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
258 (NEW_GOAL `dist (s,HD ul) <= dist (s,y:real^3)`);
259 (FIRST_ASSUM MATCH_MP_TAC);
261 (ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REAL_ARITH_TAC);
262 (NEW_GOAL `?s. s:real^3 IN X`);
264 (UP_ASM_TAC THEN STRIP_TAC);
265 (NEW_GOAL `dist (HD ul, s:real^3) < &2`);
266 (FIRST_ASSUM MATCH_MP_TAC);
269 (NEW_GOAL `set_of_list (ul:(real^3)list) SUBSET ball (HD ul,&4)`);
270 (MATCH_MP_TAC BARV_3_IMP_FINITE_lemma2);
271 (EXISTS_TAC `V:real^3->bool`);
273 (MATCH_MP_TAC Packing3.HD_IN_SET_OF_LIST);
274 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
275 CARD (set_of_list ul) = 3 + 1`);
276 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
277 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
279 (NEW_GOAL `u:real^3 IN ball (HD ul, &4)`);
281 (UP_ASM_TAC THEN REWRITE_TAC[IN_BALL]);
283 (NEW_GOAL `dist (vec 0,u) <= dist (vec 0, s) + dist (s, u:real^3)`);
284 (REWRITE_TAC[DIST_TRIANGLE]);
285 (NEW_GOAL `dist (s, u) <= dist (s, HD ul) + dist (HD ul, u:real^3)`);
286 (REWRITE_TAC[DIST_TRIANGLE]);
287 (NEW_GOAL `dist (vec 0,u) <=
288 dist (vec 0,s) + dist (s,HD ul) + dist (HD ul,u:real^3)`);
289 (ASM_REAL_ARITH_TAC);
290 (NEW_GOAL `dist (s:real^3, HD ul) < &2`);
291 (ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REWRITE_TAC[]);
292 (NEW_GOAL `dist (vec 0,s:real^3) < r`);
293 (REWRITE_TAC[GSYM IN_BALL]);
295 (ASM_REAL_ARITH_TAC);
299 (NEW_GOAL `?u0 u1 u2 u3. ul = [u0;u1;u2;u3:real^3]`);
300 (MATCH_MP_TAC BARV_3_EXPLICIT);
301 (EXISTS_TAC `V:real^3->bool` THEN ASM_SET_TAC[]);
302 (UP_ASM_TAC THEN STRIP_TAC);
303 (NEW_GOAL `(HD ul):real^3 IN X`);
304 (MATCH_MP_TAC HD_IN_MCELL);
305 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `i:num`);
307 (NEW_GOAL `(HD ul):real^3 IN ball (vec 0, r)`);
309 (UP_ASM_TAC THEN REWRITE_TAC[IN_BALL] THEN STRIP_TAC);
310 (NEW_GOAL `dist (vec 0,u) <= dist (vec 0,HD ul) + dist (HD ul, u:real^3)`);
311 (REWRITE_TAC[DIST_TRIANGLE]);
312 (NEW_GOAL `set_of_list (ul:(real^3)list) SUBSET ball (HD ul,&4)`);
313 (MATCH_MP_TAC BARV_3_IMP_FINITE_lemma2);
314 (EXISTS_TAC `V:real^3->bool`);
315 (ASM_REWRITE_TAC[HD; set_of_list]);
317 (NEW_GOAL `u:real^3 IN ball (HD ul, &4)`);
319 (UP_ASM_TAC THEN REWRITE_TAC[IN_BALL]);
321 (ASM_REAL_ARITH_TAC)]);;
324 (* ==================================================================== *)
327 let FINITE_MCELL_SET_LEMMA_concl =
328 `!V r. packing V /\ saturated V ==>
329 FINITE {X | X SUBSET ball (vec 0,r) /\ mcell_set V X}`;;
330 let FINITE_MCELL_SET_LEMMA = prove_by_refinement (
331 FINITE_MCELL_SET_LEMMA_concl,
334 (REWRITE_WITH `FINITE {X | X SUBSET ball (vec 0,r) /\ mcell_set V X} <=>
335 FINITE {X | X SUBSET ball (vec 0,r) /\ mcell_set V X /\ ~(X = {})}`);
336 (ASM_CASES_TAC `{} IN {X | X SUBSET ball (vec 0,r) /\ mcell_set V X}`);
337 (REWRITE_WITH `{X | X SUBSET ball (vec 0,r) /\ mcell_set V X} =
338 {} INSERT {X | X SUBSET ball (vec 0,r) /\ mcell_set V X /\ ~(X = {})}`);
339 (ONCE_REWRITE_TAC[SET_RULE `A = B <=> B SUBSET A /\ A SUBSET B`]);
341 (REWRITE_TAC[INSERT_SUBSET]);
344 (REWRITE_TAC[SUBSET_INSERT_DELETE]);
345 (ONCE_REWRITE_TAC[SUBSET] THEN ONCE_REWRITE_TAC[IN_DELETE] THEN REWRITE_TAC[IN_ELIM_THM]);
347 (REWRITE_TAC[FINITE_INSERT]);
348 (REWRITE_WITH `{X | X SUBSET ball (vec 0,r) /\ mcell_set V X} =
349 {X | X SUBSET ball (vec 0,r) /\ mcell_set V X /\ ~(X = {})}`);
350 (ONCE_REWRITE_TAC[SET_RULE `A = B <=> B SUBSET A /\ A SUBSET B`]);
353 (ONCE_REWRITE_TAC[SUBSET] THEN ONCE_REWRITE_TAC[IN]
354 THEN REWRITE_TAC[IN_ELIM_THM]);
358 (NEW_GOAL `{} IN {X | X SUBSET ball (vec 0,r) /\ mcell_set V X}`);
359 (ONCE_REWRITE_TAC[IN] THEN REWRITE_TAC[IN_ELIM_THM]);
364 `S = {X | X SUBSET ball (vec 0,r) /\ mcell_set V X /\ ~(X = {})}`);
365 (ABBREV_TAC `s1:(real^3->bool) = V INTER ball (vec 0, r + &6)`);
366 (ABBREV_TAC `s2 = {ul:(real^3)list | ?u0 u1 u2 u3.
371 ul = [u0; u1; u2; u3]}`);
372 (ABBREV_TAC `s3 = {(i:num, ul:(real^3)list) | i IN 0..4 /\ ul IN s2}`);
373 (NEW_GOAL`S SUBSET {X| ?t. t IN s3 /\ X = (\t. mcell (FST t) V (SND t)) t}`);
374 (EXPAND_TAC "S" THEN EXPAND_TAC "s3");
375 (ONCE_REWRITE_TAC[SUBSET] THEN ONCE_REWRITE_TAC[IN] THEN
376 REWRITE_TAC[IN_ELIM_THM; FST; SND; mcell_set]);
378 (EXISTS_TAC `((if i <= 4 then i else 4), ul:(real^3)list)`);
379 (ASM_REWRITE_TAC[FST;SND]);
381 (EXISTS_TAC `(if i <= 4 then i else 4)` THEN EXISTS_TAC `ul:(real^3)list`);
385 (ASM_REWRITE_TAC[IN_NUMSEG_0]);
386 (ASM_REWRITE_TAC[IN_NUMSEG_0] THEN ARITH_TAC);
388 (NEW_GOAL `?u0 u1 u2 u3. ul = [u0;u1;u2;u3:real^3]`);
389 (MATCH_MP_TAC BARV_3_EXPLICIT);
390 (EXISTS_TAC `V:real^3->bool` THEN ASM_SET_TAC[]);
391 (UP_ASM_TAC THEN STRIP_TAC THEN ONCE_REWRITE_TAC[IN]);
392 (REWRITE_TAC[IN_ELIM_THM]);
393 (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);
394 (EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
397 (NEW_GOAL `!u:real^3. u IN set_of_list ul ==> u IN s1`);
398 (EXPAND_TAC "s1" THEN REPEAT STRIP_TAC);
399 (REWRITE_TAC[IN_INTER]);
401 (NEW_GOAL `set_of_list ul SUBSET (V:real^3->bool)`);
402 (MATCH_MP_TAC Packing3.BARV_SUBSET);
403 (EXISTS_TAC `3` THEN ASM_MESON_TAC[IN]);
405 (NEW_GOAL `!u:real^3. u IN set_of_list ul ==> u IN ball (vec 0,r + &6)`);
406 (MATCH_MP_TAC FINITE_MCELL_SET_lemma1);
407 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `i:num` THEN
408 EXISTS_TAC `x:real^3->bool`);
412 (FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[set_of_list] THEN SET_TAC[]);
413 (FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[set_of_list] THEN SET_TAC[]);
414 (FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[set_of_list] THEN SET_TAC[]);
415 (FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[set_of_list] THEN SET_TAC[]);
421 (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
422 (MATCH_MP_TAC FINITE_SUBSET);
424 (EXISTS_TAC `{X | ?t. t IN s3 /\ X = (\t. mcell (FST t) V (SND t)) t}`);
426 (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
428 (MATCH_MP_TAC FINITE_PRODUCT);
429 (REWRITE_TAC[FINITE_NUMSEG]);
431 (MATCH_MP_TAC FINITE_SET_LIST_LEMMA);
433 (MATCH_MP_TAC Packing3.KIUMVTC);
434 (ASM_REWRITE_TAC[])]);;
438 (* ==================================================================== *)
441 let CARD_BOUNDARY_INT_BALL_BOUND_1 = prove_by_refinement (
442 `!x k1 k2. &0 < k1 /\ &0 < k2 ==>
444 &(CARD (int_ball x (r + k1) DIFF int_ball x (r - k2))) <= C * r pow 2)`,
446 (NEW_GOAL `?C. !r. k2 + sqrt (&3) <= r
448 (int_ball x (r + k1) DIFF int_ball x (r - k2))) <=
450 (MATCH_MP_TAC Vol1.bdt5_finiteness);
453 (ABBREV_TAC `D = &(CARD (int_ball x ((k2 + sqrt (&3)) + k1)))`);
454 (EXISTS_TAC `max C D`);
456 (ASM_CASES_TAC `k2 + sqrt (&3) <= r`);
458 `&(CARD (int_ball x (r + k1) DIFF int_ball x (r - k2))) <= C * r pow 2`);
460 (NEW_GOAL `C * r pow 2 <= max C D * r pow 2`);
461 (REWRITE_TAC[REAL_ARITH `a * b <= c * b <=> &0 <= (c - a) * b`]);
462 (MATCH_MP_TAC REAL_LE_MUL);
463 (REWRITE_TAC[REAL_LE_POW_2]);
465 (ASM_REAL_ARITH_TAC);
467 (NEW_GOAL `&(CARD (int_ball x (r + k1) DIFF int_ball x (r - k2))) <=
468 &(CARD (int_ball x (r + k1)))`);
469 (REWRITE_TAC[REAL_OF_NUM_LE]);
470 (MATCH_MP_TAC CARD_SUBSET);
473 (REWRITE_TAC[Vol1.finite_int_ball]);
475 (NEW_GOAL `&(CARD (int_ball x (r + k1))) <= D * r pow 2`);
476 (NEW_GOAL `&(CARD (int_ball x (r + k1))) <= D`);
478 (REWRITE_TAC[REAL_OF_NUM_LE]);
479 (MATCH_MP_TAC CARD_SUBSET);
480 (REWRITE_TAC[Vol1.finite_int_ball; int_ball; Pack1.hinhcau_ball; SUBSET;
482 (REWRITE_TAC[IN; IN_ELIM_THM]);
485 (NEW_GOAL `r + k1 <= (k2 + sqrt (&3)) + k1`);
486 (ASM_REAL_ARITH_TAC);
487 (ASM_REAL_ARITH_TAC);
488 (NEW_GOAL `D <= D * r pow 2`);
489 (REWRITE_TAC[REAL_ARITH `a <= a * b <=> &0 <= a * (b - &1)`]);
490 (MATCH_MP_TAC REAL_LE_MUL);
492 (EXPAND_TAC "D" THEN REWRITE_TAC[REAL_OF_NUM_LE; LE_0]);
493 (REWRITE_TAC[REAL_ARITH `&0 <= a - b <=> b <= a`]);
494 (ONCE_REWRITE_TAC[REAL_ARITH `&1 = (&1) pow 2`]);
495 (REWRITE_WITH `(&1) pow 2 <= r pow 2 <=> &1 <= r`);
496 (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Collect_geom.POW2_COND_LT);
497 (ASM_REAL_ARITH_TAC);
498 (ASM_REAL_ARITH_TAC);
499 (ASM_REAL_ARITH_TAC);
500 (NEW_GOAL `D * r pow 2 <= max C D * r pow 2`);
501 (REWRITE_TAC[REAL_ARITH `a * b <= c * b <=> &0 <= (c - a) * b`]);
502 (MATCH_MP_TAC REAL_LE_MUL);
503 (REWRITE_TAC[REAL_LE_POW_2]);
505 (ASM_REAL_ARITH_TAC)]);;
507 (* ==================================================================== *)
509 (* The following is a simplified version of Vol1.bdt5_finiteness, Vol1.bdt7_finiteness *)
511 let CARD_BOUNDARY_INT_BALL_BOUND = prove_by_refinement (
514 &(CARD (int_ball x (r + k1) DIFF int_ball x (r - k2))) <= C * r pow 2)`,
516 (ASM_CASES_TAC `&0 < k1 /\ &0 < k2`);
517 (ASM_MESON_TAC[CARD_BOUNDARY_INT_BALL_BOUND_1]);
518 (ASM_CASES_TAC `&0 < k2`);
520 `(?C. !r. &1 <= r ==>
521 &(CARD (int_ball x (r + &1) DIFF int_ball x (r - k2))) <= C * r pow 2)`);
522 (MATCH_MP_TAC CARD_BOUNDARY_INT_BALL_BOUND_1);
523 (ASM_REAL_ARITH_TAC);
525 (EXISTS_TAC `C:real`);
527 (NEW_GOAL `&(CARD (int_ball x (r + k1) DIFF int_ball x (r - k2))) <=
528 &(CARD (int_ball x (r + &1) DIFF int_ball x (r - k2)))`);
529 (REWRITE_TAC[REAL_OF_NUM_LE]);
530 (MATCH_MP_TAC CARD_SUBSET);
531 (SIMP_TAC[FINITE_DIFF; Vol1.finite_int_ball]);
532 (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> A DIFF C SUBSET B DIFF C`));
533 (REWRITE_TAC[int_ball; Pack1.hinhcau_ball; SUBSET; IN_INTER; IN_BALL]);
534 (REWRITE_TAC[IN; IN_ELIM_THM]);
537 (NEW_GOAL `r + k1 <= r + &1`);
538 (ASM_REAL_ARITH_TAC);
539 (ASM_REAL_ARITH_TAC);
540 (NEW_GOAL `&(CARD (int_ball x (r + &1) DIFF int_ball x (r - k2))) <=
543 (ASM_REAL_ARITH_TAC);
545 (ASM_CASES_TAC `&0 < k1`);
547 `(?C. !r. &1 <= r ==>
548 &(CARD (int_ball x (r + k1) DIFF int_ball x (r - &1))) <= C * r pow 2)`);
549 (MATCH_MP_TAC CARD_BOUNDARY_INT_BALL_BOUND_1);
550 (ASM_REAL_ARITH_TAC);
552 (EXISTS_TAC `C:real`);
554 (NEW_GOAL `&(CARD (int_ball x (r + k1) DIFF int_ball x (r - k2))) <=
555 &(CARD (int_ball x (r + k1) DIFF int_ball x (r - &1)))`);
556 (REWRITE_TAC[REAL_OF_NUM_LE]);
557 (MATCH_MP_TAC CARD_SUBSET);
558 (SIMP_TAC[FINITE_DIFF; Vol1.finite_int_ball]);
559 (MATCH_MP_TAC (SET_RULE `B SUBSET A ==> C DIFF A SUBSET C DIFF B`));
560 (REWRITE_TAC[int_ball; Pack1.hinhcau_ball; SUBSET; IN_INTER; IN_BALL]);
561 (REWRITE_TAC[IN; IN_ELIM_THM]);
564 (NEW_GOAL `r - &1 <= r - k2`);
565 (ASM_REAL_ARITH_TAC);
566 (ASM_REAL_ARITH_TAC);
567 (NEW_GOAL `&(CARD (int_ball x (r + k1) DIFF int_ball x (r - &1))) <=
570 (ASM_REAL_ARITH_TAC);
573 `(?C. !r. &1 <= r ==>
574 &(CARD (int_ball x (r + &1) DIFF int_ball x (r - &1))) <= C * r pow 2)`);
575 (MATCH_MP_TAC CARD_BOUNDARY_INT_BALL_BOUND_1);
576 (ASM_REAL_ARITH_TAC);
578 (EXISTS_TAC `C:real`);
580 (NEW_GOAL `&(CARD (int_ball x (r + k1) DIFF int_ball x (r - k2))) <=
581 &(CARD (int_ball x (r + &1) DIFF int_ball x (r - &1)))`);
582 (REWRITE_TAC[REAL_OF_NUM_LE]);
583 (MATCH_MP_TAC CARD_SUBSET);
584 (SIMP_TAC[FINITE_DIFF; Vol1.finite_int_ball]);
585 (REWRITE_TAC[IN_DIFF; int_ball; Pack1.hinhcau_ball; SUBSET; IN_INTER; IN_BALL]);
586 (REWRITE_TAC[IN; IN_ELIM_THM]);
589 (ASM_REAL_ARITH_TAC);
590 (NEW_GOAL `(!i. 1 <= i /\i <= 3 ==>integer (x'$i)) /\
591 dist (x:real^3,x') < r - k2`);
594 (ASM_REAL_ARITH_TAC);
596 (NEW_GOAL `&(CARD (int_ball x (r + &1) DIFF int_ball x (r - &1))) <=
599 (ASM_REAL_ARITH_TAC)]);;
601 (* ==================================================================== *)
604 let CARD_INJ_LE = prove_by_refinement (
605 `!s t f. FINITE s /\ FINITE t /\ INJ (f:A->B) s t ==>
607 [(REWRITE_TAC[INJ] THEN REPEAT STRIP_TAC);
608 (REWRITE_WITH `CARD s = CARD (IMAGE (f:A->B) s)`);
609 (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC CARD_IMAGE_INJ);
611 (MATCH_MP_TAC CARD_SUBSET);
612 (ASM_REWRITE_TAC[IMAGE; SUBSET]);
613 (UNDISCH_TAC `!x. x IN s ==> (f:A->B) x IN t`);
614 (REWRITE_TAC[IN; IN_ELIM_THM]);
617 (* ==================================================================== *)
620 let BOUNDARY_VOLUME = prove_by_refinement (
623 vol (ball (p:real^3,r + k1) DIFF ball (p,r - k2)) <= C * r pow 2)`,
627 `C = &4 / &3 * pi * (&3 * abs (k1 + k2) + &3 * k1 pow 2 + abs (k1 pow 3 + k2 pow 3))`);
628 (ABBREV_TAC `D = vol (ball (p:real^3, abs (k1 + k2)))`);
629 (ABBREV_TAC `E = max C (D:real)`);
630 (EXISTS_TAC `max (E:real) (&0)`);
632 (ASM_CASES_TAC `r + k1 <= r - k2`);
633 (REWRITE_WITH `ball (p,r + k1) DIFF ball (p:real^3,r - k2) = {}`);
634 (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> A DIFF B = {}`));
635 (REWRITE_TAC[SUBSET; IN_BALL] THEN REPEAT STRIP_TAC);
636 (ASM_REAL_ARITH_TAC);
637 (REWRITE_TAC[MEASURE_EMPTY]);
638 (NEW_GOAL `&0 * r pow 2 <= max E (&0) * r pow 2`);
639 (REWRITE_TAC[REAL_ARITH `a * x <= b * x <=> &0 <= (b - a) * x`]);
640 (MATCH_MP_TAC REAL_LE_MUL);
641 (ASM_REWRITE_TAC[REAL_LE_POW_2] THEN REAL_ARITH_TAC);
642 (ASM_REAL_ARITH_TAC);
644 (REWRITE_WITH `vol (ball (p,r + k1) DIFF ball (p,r - k2)) =
645 vol (ball (p,r + k1)) - vol (ball (p,r - k2))`);
646 (MATCH_MP_TAC MEASURE_DIFF_SUBSET);
647 (REWRITE_TAC[MEASURABLE_BALL; SUBSET; IN_BALL] THEN ASM_REAL_ARITH_TAC);
648 (REWRITE_TAC[VOLUME_BALL]);
649 (ASM_CASES_TAC `&0 <= r - k2`);
650 (NEW_GOAL `&0 <= r + k1`);
651 (ASM_REAL_ARITH_TAC);
653 (NEW_GOAL `vol (ball (p,r + k1)) - vol (ball (p,r - k2)) <= C * r pow 2`);
654 (ASM_SIMP_TAC [VOLUME_BALL]);
656 (REWRITE_TAC[REAL_ARITH
657 `x * pi * a - x * pi * b <= (x * pi * c) * d <=>
658 &0 <= (x * pi) * (c * d - (a - b))`]);
659 (MATCH_MP_TAC REAL_LE_MUL);
660 (ASM_SIMP_TAC[REAL_LE_MUL; REAL_LE_DIV; PI_POS_LE; REAL_ARITH `&0 <= &3 /\ &0 <= &4`]);
661 (REWRITE_TAC[REAL_ARITH `(r + k1) pow 3 - (r - k2) pow 3 = &3 * (k1 + k2) *
662 r pow 2 + &3 * (k1 pow 2 - k2 pow 2) * r + (k1 pow 3 + k2 pow 3)`]);
663 (REWRITE_TAC[REAL_ADD_RDISTRIB]);
664 (NEW_GOAL `(&3 * abs (k1 + k2)) * r pow 2 >=
665 &3 * (k1 * r pow 2 + k2 * r pow 2)`);
666 (REWRITE_TAC[REAL_ARITH
667 `(&3 * abs (k1 + k2)) * r pow 2 >= &3 * (k1 * r pow 2 + k2 * r pow 2) <=>
668 &0 <= &3 * r pow 2 * (abs (k1 + k2) - (k1 + k2))`]);
669 (MATCH_MP_TAC REAL_LE_MUL);
670 (REWRITE_TAC[REAL_ARITH `&0 <= &3`]);
671 (MATCH_MP_TAC REAL_LE_MUL);
672 (REWRITE_TAC[REAL_LE_POW_2]);
675 (NEW_GOAL `(&3 * k1 pow 2) * r pow 2 >= &3 * (k1 pow 2 - k2 pow 2) * r`);
676 (NEW_GOAL `(&3 * k1 pow 2) * r pow 2 >= (&3 * k1 pow 2) * r`);
677 (REWRITE_TAC[REAL_ARITH `x * y pow 2 >= x * y <=> &0 <= x * y * (y - &1)`]);
678 (ASM_SIMP_TAC[REAL_LE_MUL; REAL_LE_POW_2; REAL_ARITH `&1 <= a ==> &0 <= a`;
679 REAL_ARITH `&1 <= a ==> &0 <= (a - &1)`; REAL_ARITH `&0 <= &3`]);
680 (NEW_GOAL `(&3 * k1 pow 2) * r >= &3 * (k1 pow 2 - k2 pow 2) * r`);
681 (REWRITE_TAC[REAL_ARITH `(&3 * x) * r >= &3 * (x - y) * r <=> &0 <= y * r`]);
682 (ASM_SIMP_TAC[REAL_LE_MUL; REAL_LE_POW_2; REAL_ARITH `&1 <= a ==> &0 <= a`]);
683 (ASM_REAL_ARITH_TAC);
686 (NEW_GOAL `abs (k1 pow 3 + k2 pow 3) * r pow 2 >= k1 pow 3 + k2 pow 3`);
687 (NEW_GOAL `abs (k1 pow 3 + k2 pow 3) * r pow 2 >=
688 abs (k1 pow 3 + k2 pow 3)`);
689 (REWRITE_TAC[REAL_ARITH `x * y pow 2 >= x <=> &0 <= x * (y pow 2 - &1)`]);
690 (MATCH_MP_TAC REAL_LE_MUL);
691 (REWRITE_TAC[REAL_ABS_POS]);
692 (REWRITE_TAC[REAL_ARITH `&0 <= a - &1 <=> &1 pow 2 <= a`]);
693 (REWRITE_WITH `&1 pow 2 <= r pow 2 <=> &1 <= r`);
694 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
695 (MATCH_MP_TAC Collect_geom.POW2_COND_LT);
696 (ASM_REAL_ARITH_TAC);
697 (ASM_REAL_ARITH_TAC);
698 (ASM_REAL_ARITH_TAC);
699 (ASM_REAL_ARITH_TAC);
702 (NEW_GOAL `C * r pow 2 <= max E (&0) * r pow 2`);
703 (REWRITE_TAC[REAL_ARITH `a * x <= b * x <=> &0 <= (b - a) * x`]);
704 (MATCH_MP_TAC REAL_LE_MUL);
705 (ASM_REWRITE_TAC[REAL_LE_POW_2] THEN ASM_REAL_ARITH_TAC);
706 (ASM_REAL_ARITH_TAC);
709 (ASM_REAL_ARITH_TAC);
710 (NEW_GOAL `vol (ball (p,r + k1)) - vol (ball (p,r - k2)) <= D * r pow 2`);
711 (REWRITE_WITH `ball (p:real^3,r - k2) = {}`);
712 (REWRITE_TAC[SET_RULE `s = {} <=> (!x. x IN s ==> F)`]);
713 (REWRITE_TAC[IN_BALL] THEN GEN_TAC);
714 (MP_TAC (MESON[DIST_POS_LE] `&0 <= dist (p, x:real^3)`));
715 (ASM_REAL_ARITH_TAC);
717 (REWRITE_TAC[MEASURE_EMPTY; REAL_ARITH `a - &0 = a`]);
718 (NEW_GOAL `vol (ball (p,r + k1)) <= D`);
719 (EXPAND_TAC "D" THEN MATCH_MP_TAC MEASURE_SUBSET);
720 (REWRITE_TAC[MEASURABLE_BALL; SUBSET; IN_BALL]);
722 (ASM_REAL_ARITH_TAC);
723 (NEW_GOAL `D <= D * r pow 2`);
724 (REWRITE_TAC[REAL_ARITH `x <= x * y pow 2 <=> &0 <= x * (y pow 2 - &1)`]);
725 (MATCH_MP_TAC REAL_LE_MUL);
728 (MATCH_MP_TAC MEASURE_POS_LE);
729 (REWRITE_TAC[MEASURABLE_BALL]);
730 (REWRITE_TAC[REAL_ARITH `&0 <= a - &1 <=> &1 pow 2 <= a`]);
731 (REWRITE_WITH `&1 pow 2 <= r pow 2 <=> &1 <= r`);
732 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
733 (MATCH_MP_TAC Collect_geom.POW2_COND_LT);
734 (ASM_REAL_ARITH_TAC);
735 (ASM_REAL_ARITH_TAC);
736 (ASM_REAL_ARITH_TAC);
738 (NEW_GOAL `D * r pow 2 <= max E (&0) * r pow 2`);
739 (REWRITE_TAC[REAL_ARITH `a * x <= b * x <=> &0 <= (b - a) * x`]);
740 (MATCH_MP_TAC REAL_LE_MUL);
741 (ASM_REWRITE_TAC[REAL_LE_POW_2] THEN ASM_REAL_ARITH_TAC);
742 (ASM_REAL_ARITH_TAC)]);;
744 (* ==================================================================== *)
747 let PACKING_BALL_BOUNDARY = prove_by_refinement (
748 `!V p:real^3 k1 k2. packing V ==>
750 ==> &(CARD (V INTER ball (p,r + k1) DIFF V INTER ball (p,r - k2)))
753 (NEW_GOAL `?C. (!r. &1 <= r ==>
754 vol (ball (p:real^3,r + k1 + &1) DIFF ball (p,r - (k2 + &1))) <=
756 (REWRITE_TAC[BOUNDARY_VOLUME]);
757 (UP_ASM_TAC THEN STRIP_TAC);
758 (EXISTS_TAC `C:real`);
761 `B = V INTER ball (p,r + k1) DIFF V INTER ball (p:real^3,r - k2)`);
762 (ABBREV_TAC `f = (\u:real^3. ball (u, &1))`);
763 (NEW_GOAL `FINITE (B:real^3->bool)`);
765 (MATCH_MP_TAC FINITE_SUBSET);
766 (EXISTS_TAC `V INTER ball (p:real^3,r + k1)`);
767 (ASM_SIMP_TAC[FINITE_PACK_LEMMA] THEN ASM_SET_TAC[]);
769 (NEW_GOAL `sum B (\u:real^3. vol (f u)) = &(CARD B) * &4 / &3 * pi`);
771 (SIMP_TAC[VOLUME_BALL; REAL_ARITH `&0 <= &1`]);
772 (ASM_SIMP_TAC [SUM_CONST]);
775 (NEW_GOAL `sum B (\u:real^3. vol (f u)) = vol (UNIONS (IMAGE f B))`);
776 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
777 (MATCH_MP_TAC MEASURE_DISJOINT_UNIONS_IMAGE);
778 (EXPAND_TAC "f" THEN REWRITE_TAC[MEASURABLE_BALL] THEN ASM_REWRITE_TAC[]);
779 (REWRITE_TAC[SET_RULE `DISJOINT s t <=> !x. ~(x IN s /\ x IN t)`]);
780 (REWRITE_TAC[IN_BALL]);
782 (UP_ASM_TAC THEN REWRITE_TAC[] THEN ONCE_REWRITE_TAC[DIST_SYM] THEN STRIP_TAC);
783 (NEW_GOAL `dist (u, y) <= dist (u, x) + dist (x, y:real^3)`);
784 (REWRITE_TAC[DIST_TRIANGLE]);
785 (NEW_GOAL `&2 <= dist (u, y:real^3)`);
786 (UNDISCH_TAC `packing V` THEN REWRITE_TAC[packing] THEN STRIP_TAC);
787 (FIRST_ASSUM MATCH_MP_TAC);
789 (ASM_REAL_ARITH_TAC);
791 (NEW_GOAL `vol (UNIONS (IMAGE f (B:real^3->bool))) <=
792 vol (ball (p,r + k1 + &1) DIFF ball (p,r - (k2 + &1)))`);
793 (EXPAND_TAC "f" THEN REWRITE_TAC[IMAGE]);
794 (MATCH_MP_TAC MEASURE_SUBSET);
796 (MATCH_MP_TAC MEASURABLE_UNIONS);
799 (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
801 (REWRITE_TAC[IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
802 (ASM_REWRITE_TAC[MEASURABLE_BALL]);
804 (ASM_SIMP_TAC[MEASURABLE_DIFF; MEASURABLE_BALL]);
806 (REWRITE_TAC[SUBSET; IN_UNIONS; IN_BALL; IN_DIFF; IN_INTER]);
807 (REWRITE_TAC[IN_ELIM_THM; IN]);
809 (NEW_GOAL `dist (p, x) <= dist (p, x') + dist (x', x:real^3)`);
810 (REWRITE_TAC[DIST_TRIANGLE]);
811 (NEW_GOAL `dist (x',x:real^3) < &1`);
812 (UNDISCH_TAC `(t:real^3->bool) x`);
813 (ASM_REWRITE_TAC[ball; IN_ELIM_THM]);
814 (ASM_REAL_ARITH_TAC);
816 (NEW_GOAL `dist (p, x':real^3) < r - k2`);
817 (NEW_GOAL `dist (p, x') <= dist (p, x) + dist (x, x':real^3)`);
818 (REWRITE_TAC[DIST_TRIANGLE]);
819 (NEW_GOAL `dist (x,x':real^3) < &1`);
820 (ONCE_REWRITE_TAC[DIST_SYM]);
821 (UNDISCH_TAC `(t:real^3->bool) x`);
822 (ASM_REWRITE_TAC[ball; IN_ELIM_THM]);
823 (ASM_REAL_ARITH_TAC);
826 (NEW_GOAL `&(CARD (B:real^3->bool)) <= &(CARD B) * &4 / &3 * pi`);
827 (REWRITE_TAC [REAL_ARITH `a <= a * b <=> &0 <= a * (b - &1)`]);
828 (MATCH_MP_TAC REAL_LE_MUL);
829 (REWRITE_TAC[REAL_OF_NUM_LE; LE_0]);
830 (NEW_GOAL `#3.14159 < pi`);
831 (REWRITE_TAC[Flyspeck_constants.bounds]);
832 (ASM_REAL_ARITH_TAC);
833 (NEW_GOAL `vol (ball (p:real^3,r + k1 + &1) DIFF ball (p,r - (k2 + &1))) <=
836 (ASM_REAL_ARITH_TAC)]);;
838 (* ==================================================================== *)
841 let MCELL_SUBSET_BALL_4 = prove_by_refinement (
844 saturated V /\ mcell_set V X
845 ==> (?p. X SUBSET ball (p, &4))`,
846 [(REWRITE_TAC[mcell_set_2; IN; IN_ELIM_THM]);
848 (ASM_CASES_TAC `X:real^3->bool = {}`);
849 (EXISTS_TAC `(vec 0):real^3`);
850 (ASM_MESON_TAC[EMPTY_SUBSET]);
853 (ASM_CASES_TAC `i = 0`);
854 (UNDISCH_TAC `X = mcell i V ul`THEN ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell0]);
856 (NEW_GOAL `!s. s IN rogers V ul ==> dist (HD ul, s) < &2`);
858 (NEW_GOAL `rogers V ul SUBSET voronoi_closed V (HD ul)`);
859 (ASM_SIMP_TAC[ROGERS_SUBSET_VORONOI_CLOSED]);
860 (NEW_GOAL `s:real^3 IN voronoi_closed V (HD ul)`);
862 (UNDISCH_TAC `saturated (V:real^3->bool)`);
863 (REWRITE_TAC[saturated]);
865 (NEW_GOAL `?y. y IN V /\ dist (s, y:real^3) < &2`);
867 (UP_ASM_TAC THEN STRIP_TAC);
868 (UNDISCH_TAC `s:real^3 IN voronoi_closed V (HD ul)` THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
870 (NEW_GOAL `dist (s,HD ul) <= dist (s,y:real^3)`);
871 (FIRST_ASSUM MATCH_MP_TAC);
873 (ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REAL_ARITH_TAC);
874 (EXISTS_TAC `HD (ul:(real^3)list)`);
875 (REWRITE_TAC[SUBSET; IN_BALL]);
877 (NEW_GOAL `dist (HD ul, x:real^3) < &2`);
878 (FIRST_ASSUM MATCH_MP_TAC);
880 (ASM_REAL_ARITH_TAC);
883 (ASM_CASES_TAC `i = 4`);
884 (UNDISCH_TAC `X = mcell i V ul` THEN
885 ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4; ARITH_RULE `4 >= 4`]);
888 (EXISTS_TAC `omega_list V ul`);
889 (NEW_GOAL `ball (omega_list V ul,&4) = convex hull (ball (omega_list V ul,&4))`);
890 (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN REWRITE_TAC[CONVEX_HULL_EQ; CONVEX_BALL]);
891 (ONCE_ASM_REWRITE_TAC[]);
892 (MATCH_MP_TAC CONVEX_HULL_SUBSET);
893 (REWRITE_TAC[SUBSET; IN_BALL] THEN REPEAT STRIP_TAC);
894 (REWRITE_WITH `omega_list V ul = circumcenter (set_of_list ul)`);
895 (MATCH_MP_TAC Rogers.XNHPWAB1);
896 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[IN]);
897 (REWRITE_WITH `dist (circumcenter (set_of_list ul),x:real^3) = hl ul`);
898 (NEW_GOAL `(!x:real^3. x IN set_of_list ul
899 ==> dist (circumcenter (set_of_list ul),x) = hl ul)`);
900 (MATCH_MP_TAC Rogers.HL_PROPERTIES);
901 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
902 (FIRST_ASSUM MATCH_MP_TAC);
904 (NEW_GOAL `sqrt (&2) <= &2`);
905 (REWRITE_WITH `sqrt (&2) <= &2 <=> sqrt (&2) pow 2 <= &2 pow 2`);
906 (MATCH_MP_TAC Collect_geom.POW2_COND_LT);
907 (ASM_SIMP_TAC[SQRT_POS_LT; REAL_ARITH `&0 < &2`]);
908 (REWRITE_WITH `sqrt (&2) pow 2 = (&2)`);
909 (MATCH_MP_TAC SQRT_POW_2);
912 (ASM_REAL_ARITH_TAC);
918 (* Case i = 1 and i = 2 and i = 3 *)
920 (ABBREV_TAC `s = omega_list_n V ul (i - 1)`);
921 (EXISTS_TAC `s:real^3`);
922 (MATCH_MP_TAC (SET_RULE `(?x. A SUBSET x /\ x SUBSET B) ==> A SUBSET B`));
924 {rogers V (left_action_list p ul) | p permutes 0..i - 1}`);
927 (MATCH_MP_TAC Qzksykg.QZKSYKG2);
928 (ASM_REWRITE_TAC[SET_RULE `i IN {0,1,2,3,4} <=> i=0\/i=1\/i=2\/i=3\/i=4`]);
930 (REWRITE_TAC[SUBSET; IN_UNIONS; IN; IN_ELIM_THM; IN_BALL]);
932 (ABBREV_TAC `vl:(real^3)list = left_action_list p ul`);
933 (NEW_GOAL `rogers V vl SUBSET voronoi_closed V (HD vl)`);
934 (MATCH_MP_TAC ROGERS_SUBSET_VORONOI_CLOSED);
936 (MATCH_MP_TAC Qzksykg.QZKSYKG1);
937 (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num` THEN EXISTS_TAC `p:num->num`);
940 (ASM_REWRITE_TAC[SET_RULE `i IN {0,1,2,3,4} <=> i=0\/i=1\/i=2\/i=3\/i=4`]);
944 (* -------------------------------------------------------------------------- *)
946 (NEW_GOAL `barV V 3 vl /\
947 (!j. i - 1 <= j /\ j <= 3
948 ==> omega_list_n V vl j = omega_list_n V ul j)`);
949 (ASM_CASES_TAC `i <= 1`);
950 (UNDISCH_TAC `p permutes 0..i - 1`);
951 (REWRITE_WITH `i - 1 = 0`);
953 (REWRITE_TAC[Packing3.PERMUTES_TRIVIAL]);
954 (STRIP_TAC THEN EXPAND_TAC "vl" THEN REWRITE_TAC[ASSUME `p = I:num->num`;
955 Packing3.LEFT_ACTION_LIST_I]);
958 (MATCH_MP_TAC Ynhyjit.YNHYJIT);
959 (EXISTS_TAC `p:num->num`);
963 (REWRITE_TAC[SET_RULE `i IN {2,3,4} <=> i = 2 \/ i = 3 \/ i = 4`]);
965 (UNDISCH_TAC `~(X = {}:real^3->bool)` THEN ASM_REWRITE_TAC[]);
967 (ASM_CASES_TAC `i = 2`);
968 (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2; ARITH_RULE `2 - 1 = 1`]);
972 (ASM_CASES_TAC `i = 3`);
973 (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell3; ARITH_RULE `3 - 1 = 2`]);
980 (UP_ASM_TAC THEN STRIP_TAC);
982 (NEW_GOAL `s IN voronoi_list V (truncate_simplex (i - 1) vl)`);
983 (REWRITE_WITH `s = omega_list_n V vl (i - 1)`);
985 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
986 (FIRST_ASSUM MATCH_MP_TAC);
988 (MATCH_MP_TAC Packing3.OMEGA_LIST_N_IN_VORONOI_LIST);
990 (ASM_REWRITE_TAC[] THEN ASM_ARITH_TAC);
992 (NEW_GOAL `s:real^3 IN voronoi_closed V (HD vl)`);
993 (NEW_GOAL `voronoi_list V (truncate_simplex (i - 1) vl) SUBSET
994 voronoi_closed V (HD vl)`);
995 (REWRITE_TAC[VORONOI_LIST; VORONOI_SET]);
996 (NEW_GOAL `HD (vl:(real^3)list) IN
997 set_of_list (truncate_simplex (i - 1) vl)`);
998 (NEW_GOAL `LENGTH (vl:(real^3)list) = 3 + 1 /\ CARD (set_of_list vl) = 3 + 1`);
999 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1000 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1001 (REWRITE_WITH `HD (vl:(real^3)list) = HD (truncate_simplex (i - 1) vl)`);
1002 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1003 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1005 (MATCH_MP_TAC Packing3.HD_IN_SET_OF_LIST);
1006 (NEW_GOAL `?u0 u1 u2 u3. vl = [u0;u1;u2;u3:real^3]`);
1007 (MATCH_MP_TAC BARV_3_EXPLICIT);
1008 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1009 (UP_ASM_TAC THEN STRIP_TAC);
1011 (ASM_CASES_TAC `i = 1`);
1012 (ASM_REWRITE_TAC[ARITH_RULE `1 - 1 = 0`;
1013 TRUNCATE_SIMPLEX_EXPLICIT_0; LENGTH] THEN ARITH_TAC);
1014 (ASM_CASES_TAC `i = 2`);
1015 (ASM_REWRITE_TAC[ARITH_RULE `2 - 1 = 1`;
1016 TRUNCATE_SIMPLEX_EXPLICIT_1; LENGTH] THEN ARITH_TAC);
1017 (ASM_CASES_TAC `i = 3`);
1018 (ASM_REWRITE_TAC[ARITH_RULE `3 - 1 = 2`;
1019 TRUNCATE_SIMPLEX_EXPLICIT_2; LENGTH] THEN ARITH_TAC);
1023 (UP_ASM_TAC THEN SET_TAC[]);
1026 (NEW_GOAL `dist (s, x:real^3) <= dist (s, HD vl) + dist (HD vl, x)`);
1027 (REWRITE_TAC[DIST_TRIANGLE]);
1028 (NEW_GOAL `dist (s:real^3, HD vl) < &2`);
1029 (ONCE_REWRITE_TAC[DIST_SYM] THEN REWRITE_TAC[GSYM IN_BALL]);
1030 (NEW_GOAL `voronoi_closed V ((HD vl):real^3) SUBSET ball (HD vl,&2)`);
1031 (ASM_SIMP_TAC[Packing3.VORONOI_BALL2]);
1034 (NEW_GOAL `dist (HD vl, x:real^3) < &2`);
1035 (REWRITE_TAC[GSYM IN_BALL]);
1036 (NEW_GOAL `voronoi_closed V ((HD vl):real^3) SUBSET ball (HD vl,&2)`);
1037 (ASM_SIMP_TAC[Packing3.VORONOI_BALL2]);
1039 (ASM_REAL_ARITH_TAC)]);;
1041 (* ==================================================================== *)
1044 let HL_2 = prove_by_refinement (
1045 `!u v:real^3. hl [u; v] = inv (&2) * dist (u, v)`,
1046 [(REWRITE_TAC[HL; set_of_list; radV] THEN REPEAT GEN_TAC THEN
1047 MATCH_MP_TAC SELECT_UNIQUE THEN REPEAT STRIP_TAC THEN
1048 REWRITE_TAC[BETA_THM; CIRCUMCENTER_2; midpoint] THEN EQ_TAC);
1050 (REWRITE_WITH `y = dist (inv (&2) % (u + v),v:real^3)`);
1051 (FIRST_ASSUM MATCH_MP_TAC THEN
1052 REWRITE_TAC[MESON [IN] `{a, b} s <=> s IN {a, b}`] THEN SET_TAC[]);
1055 (NEW_GOAL `w = u \/ w = v:real^3`);
1056 (UP_ASM_TAC THEN REWRITE_TAC[MESON [IN] `{a, b} s <=> s IN {a, b}`] THEN SET_TAC[]);
1057 (UP_ASM_TAC THEN STRIP_TAC);
1058 (ASM_REWRITE_TAC[] THEN NORM_ARITH_TAC);
1059 (ASM_REWRITE_TAC[] THEN NORM_ARITH_TAC)]);;
1061 (* ==================================================================== *)
1064 let HL_LE_SQRT2_IMP_BARV_1 = prove_by_refinement (
1071 hl [u0;u1] < sqrt (&2) ==> barV V 1 [u0;u1:real^3]`,
1072 [(REPEAT STRIP_TAC);
1073 (REWRITE_TAC[BARV; LENGTH; ARITH_RULE `SUC (SUC 0) = 1 + 1`]);
1075 (ASM_CASES_TAC `LENGTH (vl:(real^3)list) = 1`);
1076 (NEW_GOAL `initial_sublist vl [u0; u1:real^3] /\ LENGTH vl = 0 + 1`);
1077 (ASM_REWRITE_TAC[] THEN ARITH_TAC);
1078 (UP_ASM_TAC THEN REWRITE_WITH
1079 `initial_sublist vl [u0; u1:real^3] /\ LENGTH vl = 0 + 1 <=>
1080 truncate_simplex 0 [u0;u1] = vl /\ 0 + 1 <= LENGTH [u0;u1:real^3]`);
1081 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1082 (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
1083 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1085 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_0]);
1086 (REWRITE_TAC[VORONOI_NONDG; VORONOI_LIST; VORONOI_SET; set_of_list; LENGTH;
1087 SET_RULE `INTERS {voronoi_closed V v | v IN {u0}} = voronoi_closed V u0`]);
1088 (ASM_SIMP_TAC[Packing3.AFF_DIM_VORONOI_CLOSED]);
1094 (ASM_CASES_TAC `LENGTH (vl:(real^3)list) = 2`);
1095 (NEW_GOAL `initial_sublist vl [u0; u1:real^3] /\ LENGTH vl = 1 + 1`);
1096 (ASM_REWRITE_TAC[] THEN ARITH_TAC);
1097 (UP_ASM_TAC THEN REWRITE_WITH
1098 `initial_sublist vl [u0; u1:real^3] /\ LENGTH vl = 1 + 1 <=>
1099 truncate_simplex 1 [u0;u1] = vl /\ 1 + 1 <= LENGTH [u0;u1:real^3]`);
1100 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1101 (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
1102 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1104 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1]);
1105 (REWRITE_TAC[VORONOI_NONDG]);
1106 (REWRITE_TAC[set_of_list; LENGTH]);
1112 `aff_dim (voronoi_list V [u0; u1:real^3]) =
1113 aff_dim (INTERS {bis (HD [u0; u1]) v | v | v IN set_of_list [u0; u1]})`);
1114 (MATCH_MP_TAC Rogers.YIFVQDV_lemma_aff_dim);
1115 (ASM_REWRITE_TAC[set_of_list; AFFINE_INDEPENDENT_2] THEN ASM_SET_TAC[]);
1116 (REWRITE_TAC[set_of_list; SET_RULE `a IN {b,c} <=> a =b \/ a = c`; HD]);
1117 (REWRITE_TAC[SET_RULE `INTERS {bis u0 v | v | v = u0 \/ v = u1} =
1118 bis u0 u0 INTER bis u0 u1`]);
1119 (REWRITE_WITH `!a:real^3. bis a a = (:real^3)`);
1120 (REWRITE_TAC[bis] THEN SET_TAC[]);
1121 (REWRITE_TAC[SET_RULE `(:real^3) INTER s = s`]);
1122 (MATCH_MP_TAC (ARITH_RULE `a = &2 ==> a + &(SUC(SUC 0)) = (&4):int`));
1123 (REWRITE_WITH `&2 = &(dimindex (:3)) - &1:int`);
1124 (REWRITE_TAC[DIMINDEX_3]);
1126 (REWRITE_TAC[Packing3.BIS_EQ_HYPERPLANE]);
1127 (MATCH_MP_TAC AFF_DIM_HYPERPLANE);
1128 (ASM_NORM_ARITH_TAC);
1131 (NEW_GOAL `initial_sublist vl [u0; u1:real^3] /\
1132 LENGTH vl = (LENGTH vl - 1) + 1`);
1133 (ASM_REWRITE_TAC[] THEN ASM_ARITH_TAC);
1134 (UP_ASM_TAC THEN REWRITE_WITH
1135 `initial_sublist vl [u0; u1:real^3] /\ LENGTH vl = (LENGTH vl - 1) + 1 <=>
1136 truncate_simplex (LENGTH vl - 1) [u0;u1] = vl /\
1137 (LENGTH vl - 1) + 1 <= LENGTH [u0;u1:real^3]`);
1138 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1139 (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
1140 (REWRITE_TAC[LENGTH]);
1143 (ASM_MESON_TAC[])]);;
1145 (* ==================================================================== *)
1148 let RCONE_GE_SUBSET = prove_by_refinement (
1149 `!a b u0:real^N u1. a <= b ==> rcone_ge u0 u1 b SUBSET rcone_ge u0 u1 a`,
1150 [(REPEAT STRIP_TAC);
1151 (REWRITE_TAC[rcone_ge; rconesgn; SUBSET; IN; IN_ELIM_THM]);
1154 `&0 <= dist (x,u0:real^N) * dist (u1,u0) * b - dist (x,u0) * dist (u1,u0) * a`);
1155 (REWRITE_TAC[REAL_ARITH `x * y * b - x * y * a = x * y * (b - a)`]);
1156 (MATCH_MP_TAC REAL_LE_MUL);
1157 (REWRITE_TAC[DIST_POS_LE]);
1158 (MATCH_MP_TAC REAL_LE_MUL);
1159 (REWRITE_TAC[DIST_POS_LE]);
1160 (ASM_REAL_ARITH_TAC);
1161 (ASM_REAL_ARITH_TAC)]);;
1163 (* ==================================================================== *)
1166 let RCONE_GT_SUBSET = prove_by_refinement (
1167 `!a b u0:real^N u1. a <= b ==> rcone_gt u0 u1 b SUBSET rcone_gt u0 u1 a`,
1168 [(REPEAT STRIP_TAC);
1169 (REWRITE_TAC[rcone_gt; rconesgn; SUBSET; IN; IN_ELIM_THM]);
1172 `&0 <= dist (x,u0:real^N) * dist (u1,u0) * b - dist (x,u0) * dist (u1,u0) * a`);
1173 (REWRITE_TAC[REAL_ARITH `x * y * b - x * y * a = x * y * (b - a)`]);
1174 (MATCH_MP_TAC REAL_LE_MUL);
1175 (REWRITE_TAC[DIST_POS_LE]);
1176 (MATCH_MP_TAC REAL_LE_MUL);
1177 (REWRITE_TAC[DIST_POS_LE]);
1178 (ASM_REAL_ARITH_TAC);
1179 (ASM_REAL_ARITH_TAC)]);;
1181 (* ===================================================================== *)
1182 (* The following lemmas are in the svn 126 of HOL *)
1183 (* To be done by John Harrison *)
1184 (* ===================================================================== *)
1185 (* ==================================================================== *)
1188 let BOUNDED_SING = prove
1190 REWRITE_TAC[BOUNDED_INSERT; BOUNDED_EMPTY]);;
1192 let SUBSPACE_BOUNDED_EQ_TRIVIAL = prove
1193 (`!s:real^N->bool. subspace s ==> (bounded s <=> s = {vec 0})`,
1194 REPEAT STRIP_TAC THEN EQ_TAC THEN SIMP_TAC[BOUNDED_SING] THEN
1195 ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN
1196 DISCH_THEN(MP_TAC o MATCH_MP (SET_RULE
1197 `~(s = {a}) ==> a IN s ==> ?b. b IN s /\ ~(b = a)`)) THEN
1198 ASM_SIMP_TAC[SUBSPACE_0] THEN
1199 DISCH_THEN(X_CHOOSE_THEN `v:real^N` STRIP_ASSUME_TAC) THEN
1200 REWRITE_TAC[bounded; NOT_EXISTS_THM] THEN X_GEN_TAC `B:real` THEN
1201 DISCH_THEN(MP_TAC o SPEC `(B + &1) / norm v % v:real^N`) THEN
1202 ASM_SIMP_TAC[SUBSPACE_MUL; NORM_MUL; REAL_ABS_DIV; REAL_ABS_NORM] THEN
1203 ASM_SIMP_TAC[REAL_DIV_RMUL; NORM_EQ_0] THEN REAL_ARITH_TAC);;
1205 let AFFINE_BOUNDED_EQ_TRIVIAL = prove
1207 affine s ==> (bounded s <=> s = {} \/ ?a. s = {a})`,
1208 GEN_TAC THEN ASM_CASES_TAC `s:real^N->bool = {}` THEN
1209 ASM_REWRITE_TAC[BOUNDED_EMPTY] THEN
1210 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM MEMBER_NOT_EMPTY]) THEN
1211 DISCH_THEN(X_CHOOSE_THEN `b:real^N` MP_TAC) THEN
1212 GEOM_ORIGIN_TAC `b:real^N` THEN SIMP_TAC[AFFINE_EQ_SUBSPACE] THEN
1213 REPEAT STRIP_TAC THEN ASM_SIMP_TAC[SUBSPACE_BOUNDED_EQ_TRIVIAL] THEN
1214 FIRST_ASSUM(MP_TAC o MATCH_MP SUBSPACE_0) THEN SET_TAC[]);;
1216 let AFFINE_BOUNDED_EQ_LOWDIM = prove
1218 affine s ==> (bounded s <=> aff_dim s <= &0)`,
1219 SIMP_TAC[AFF_DIM_GE; INT_ARITH
1220 `--(&1):int <= x ==> (x <= &0 <=> x = --(&1) \/ x = &0)`] THEN
1221 SIMP_TAC[AFF_DIM_EQ_0; AFF_DIM_EQ_MINUS1; AFFINE_BOUNDED_EQ_TRIVIAL]);;
1223 let BOUNDED_HYPERPLANE_EQ_TRIVIAL = prove
1224 (`!a b. bounded {x:real^N | a dot x = b} <=>
1225 if a = vec 0 then ~(b = &0) else dimindex(:N) = 1`,
1226 REPEAT GEN_TAC THEN ASM_CASES_TAC `a:real^N = vec 0` THEN
1227 ASM_REWRITE_TAC[DOT_LZERO] THENL
1228 [ASM_CASES_TAC `b = &0` THEN
1229 ASM_REWRITE_TAC[EMPTY_GSPEC; BOUNDED_EMPTY] THEN
1230 REWRITE_TAC[NOT_BOUNDED_UNIV; SET_RULE `{x | T} = UNIV`];
1231 ASM_SIMP_TAC[AFFINE_BOUNDED_EQ_LOWDIM; AFF_DIM_HYPERPLANE;
1232 AFFINE_HYPERPLANE] THEN
1233 REWRITE_TAC[INT_ARITH `a - &1:int <= &0 <=> a <= &1`; INT_OF_NUM_LE] THEN
1234 MATCH_MP_TAC(ARITH_RULE `1 <= n ==> (n <= 1 <=> n = 1)`) THEN
1235 REWRITE_TAC[DIMINDEX_GE_1]]);;
1237 let UNBOUNDED_HYPERPLANE = prove
1238 (`!a b. ~(a = vec 0) ==> ~(bounded {x:real^3 | a dot x = b})`,
1239 SIMP_TAC[BOUNDED_HYPERPLANE_EQ_TRIVIAL; DIMINDEX_3; ARITH]);;
1241 (* ==================================================================== *)
1244 let DIHV_SYM_2 = prove
1245 (`!x y z t:real^3. dihV x y z t = dihV x y t z`,
1246 REWRITE_TAC[dihV] THEN
1247 REPEAT STRIP_TAC THEN REPEAT LET_TAC THEN
1248 ASM_REWRITE_TAC[arcV; DOT_SYM; REAL_ARITH `a * b = b * a`]);;
1250 (* ==================================================================== *)
1253 let REAL_DIV_LE_1_TACTICS = prove_by_refinement (
1254 `!m n. &0 < n /\ m <= n ==> m / n <= &1`,
1255 [(REPEAT STRIP_TAC);
1256 (REWRITE_WITH `m / n <= &1 <=> m <= &1 * n`);
1257 (MATCH_MP_TAC REAL_LE_LDIV_EQ);
1258 (ASM_REWRITE_TAC[]);
1259 (ASM_REAL_ARITH_TAC)]);;
1261 (* ==================================================================== *)
1264 let REAL_DIV_GE_1_TACTICS = prove_by_refinement (
1265 `!m n. &0 < n /\ n <= m ==> &1 <= m / n`,
1266 [(REPEAT STRIP_TAC);
1267 (REWRITE_WITH `&1 <= m / n <=> &1 * n <= m`);
1268 (MATCH_MP_TAC REAL_LE_RDIV_EQ);
1269 (ASM_REWRITE_TAC[]);
1270 (ASM_REAL_ARITH_TAC)]);;
1272 (* ==================================================================== *)
1275 let REAL_DIV_LT_1_TACTICS = prove_by_refinement (
1276 `!m n. &0 < n /\ m < n ==> m / n < &1`,
1277 [(REPEAT STRIP_TAC);
1278 (REWRITE_WITH `m / n < &1 <=> m < &1 * n`);
1279 (MATCH_MP_TAC REAL_LT_LDIV_EQ);
1280 (ASM_REWRITE_TAC[]);
1281 (ASM_REAL_ARITH_TAC)]);;
1283 (* ==================================================================== *)
1286 let REAL_DIV_GT_1_TACTICS = prove_by_refinement (
1287 `!m n. &0 < n /\ n < m ==> &1 < m / n`,
1288 [(REPEAT STRIP_TAC);
1289 (REWRITE_WITH `&1 < m / n <=> &1 * n < m`);
1290 (MATCH_MP_TAC REAL_LT_RDIV_EQ);
1291 (ASM_REWRITE_TAC[]);
1292 (ASM_REAL_ARITH_TAC)]);;
1295 (* ==================================================================== *)
1296 (* The following lemmas help to prove that the *)
1297 (* definition of dihX is well-defined *)
1298 (* ==================================================================== *)
1299 (* ==================================================================== *)
1302 let MCELL_ID_OMEGA_LIST_N = prove_by_refinement (
1303 `!V i j ul vl. packing V /\ saturated V /\ barV V 3 ul /\ barV V 3 vl /\
1304 (mcell i V ul = mcell j V vl) /\
1305 ~(negligible (mcell i V ul)) /\
1308 (i = j) /\ (!k. i - 1 <= k /\ k <= 3
1309 ==> omega_list_n V ul k = omega_list_n V vl k)`,
1310 [(REPEAT GEN_TAC THEN STRIP_TAC);
1311 (NEW_GOAL `i = j /\ mcell i V ul = mcell j V vl`);
1312 (MATCH_MP_TAC Ajripqn.AJRIPQN);
1313 (ASM_REWRITE_TAC[SET_RULE `a INTER a = a` ]);
1319 (UP_ASM_TAC THEN STRIP_TAC);
1321 (ASM_REWRITE_TAC[]);
1323 (ASM_CASES_TAC `i = 4`);
1327 (ASM_REWRITE_TAC[]);
1329 (REWRITE_WITH `omega_list_n V ul 3 = omega_list V ul`);
1330 (REWRITE_TAC[OMEGA_LIST]);
1331 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
1332 CARD (set_of_list ul) = 3 + 1`);
1333 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1334 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1335 (REWRITE_TAC[ARITH_RULE `(3 + 1) - 1 = 3`]);
1337 (REWRITE_WITH `omega_list_n V vl 3 = omega_list V vl`);
1338 (REWRITE_TAC[OMEGA_LIST]);
1339 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\
1340 CARD (set_of_list vl) = 3 + 1`);
1341 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1342 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1343 (REWRITE_TAC[ARITH_RULE `(3 + 1) - 1 = 3`]);
1345 (REWRITE_WITH `omega_list V ul = circumcenter (set_of_list ul)`);
1346 (MATCH_MP_TAC Rogers.XNHPWAB1);
1347 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[IN]);
1348 (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
1350 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1351 (SIMP_TAC[ASSUME `i = 4`; MCELL_EXPLICIT; ARITH_RULE `4 >= 4`;mcell4]);
1356 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1358 (REWRITE_WITH `omega_list V vl = circumcenter (set_of_list vl)`);
1359 (MATCH_MP_TAC Rogers.XNHPWAB1);
1360 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[IN]);
1361 (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
1363 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1364 (ASM_REWRITE_TAC[]);
1365 (REWRITE_WITH `j = 4`);
1367 (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`;mcell4]);
1372 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1375 (REWRITE_WITH `set_of_list ul = set_of_list (vl:(real^3)list) <=>
1376 convex hull (set_of_list ul) = convex hull (set_of_list vl)`);
1377 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1378 (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);
1381 (NEW_GOAL `?u0 u1 u2 u3. ul = [u0;u1;u2;u3:real^3]`);
1382 (MATCH_MP_TAC BARV_3_EXPLICIT);
1383 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1384 (UP_ASM_TAC THEN STRIP_TAC);
1385 (ASM_REWRITE_TAC[set_of_list] THEN STRIP_TAC);
1386 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1387 (REWRITE_TAC[ASSUME `i = 4`]);
1388 (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`;mcell4]);
1390 (ASM_REWRITE_TAC[set_of_list]);
1391 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
1392 (MATCH_MP_TAC COPLANAR_SUBSET);
1393 (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
1394 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
1395 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
1396 (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
1397 (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
1398 (ASM_REWRITE_TAC[]);
1399 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1401 (NEW_GOAL `?u0 u1 u2 u3. vl = [u0;u1;u2;u3:real^3]`);
1402 (MATCH_MP_TAC BARV_3_EXPLICIT);
1403 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1404 (UP_ASM_TAC THEN STRIP_TAC);
1405 (ASM_REWRITE_TAC[set_of_list] THEN STRIP_TAC);
1406 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1407 (REWRITE_TAC[ASSUME `mcell i V ul = mcell j V vl`]);
1408 (REWRITE_WITH `j = 4`);
1410 (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`;mcell4]);
1412 (ASM_REWRITE_TAC[set_of_list]);
1413 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
1414 (MATCH_MP_TAC COPLANAR_SUBSET);
1415 (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
1416 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
1417 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
1418 (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
1419 (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
1420 (ASM_REWRITE_TAC[]);
1421 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1423 (MP_TAC (ASSUME `mcell i V ul = mcell j V vl`));
1424 (REWRITE_WITH `j = 4 /\ i = 4`);
1426 (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`;mcell4]);
1432 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1433 (ASM_REWRITE_TAC[]);
1434 (REWRITE_WITH `j = 4 /\ i = 4`);
1436 (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`;mcell4]);
1441 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1445 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1446 (REWRITE_WITH `j = 4 /\ i = 4`);
1448 (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`;mcell4]);
1453 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1456 (* Finish the case i = 4 *)
1457 (* ========================================================================= *)
1458 (NEW_GOAL `mcell i V ul SUBSET
1459 UNIONS {rogers V (left_action_list p ul) | p permutes 0..i - 1}`);
1460 (MATCH_MP_TAC Qzksykg.QZKSYKG2);
1461 (ASM_REWRITE_TAC[] THEN ASM_SET_TAC[]);
1463 (ABBREV_TAC `X = mcell i V ul`);
1465 UNIONS {rogers V (left_action_list p ul) | p permutes 0..i - 1} = X`);
1467 (NEW_GOAL `~negligible (X INTER
1468 UNIONS {rogers V (left_action_list p ul) | p permutes 0..i - 1})`);
1469 (ASM_REWRITE_TAC[]);
1471 (UP_ASM_TAC THEN REWRITE_TAC[INTER_UNIONS]);
1472 (NEW_GOAL `!s:(real^3->bool)->bool.
1473 ~negligible (UNIONS s) /\ FINITE s ==> (?t. t IN s /\ ~negligible t)`);
1474 (MESON_TAC[NEGLIGIBLE_UNIONS]);
1475 (REWRITE_TAC[SET_RULE
1476 `{X INTER x | x IN {rogers V (left_action_list p ul) | p permutes 0..i - 1}} =
1477 {X INTER rogers V (left_action_list p ul) | p permutes 0..i - 1}`]);
1479 `S = {X INTER rogers V (left_action_list p ul) | p permutes 0..i - 1}`);
1482 (NEW_GOAL `(?t. t IN (S:(real^3->bool)->bool) /\ ~negligible t)`);
1483 (FIRST_ASSUM MATCH_MP_TAC);
1484 (ASM_REWRITE_TAC[]);
1486 (ABBREV_TAC `f = (\p. X INTER rogers V (left_action_list p ul))`);
1488 `{X INTER rogers V (left_action_list p ul) | p permutes 0..i - 1} =
1489 {f p | p permutes 0..i-1}`);
1490 (EXPAND_TAC "f" THEN REFL_TAC);
1491 (ONCE_REWRITE_TAC[SET_RULE `{f x | P x} = {f x | x IN {x | P x}}`]);
1493 (REWRITE_TAC[SET_RULE `{f p | p IN {x | x permutes 0..i - 1} } =
1494 {y | ?p. p IN {x | x permutes 0..i - 1} /\ y = f p}`]);
1495 (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1496 (MATCH_MP_TAC FINITE_PERMUTATIONS);
1497 (REWRITE_TAC[FINITE_NUMSEG]);
1498 (UP_ASM_TAC THEN EXPAND_TAC "S" THEN REWRITE_TAC[IN; IN_ELIM_THM]
1503 (NEW_GOAL `mcell j V vl SUBSET
1504 UNIONS {rogers V (left_action_list q vl) | q permutes 0..j - 1}`);
1505 (MATCH_MP_TAC Qzksykg.QZKSYKG2);
1506 (ASM_REWRITE_TAC[] THEN ASM_SET_TAC[]);
1508 UNIONS {rogers V (left_action_list q vl) | q permutes 0..j - 1}`);
1511 UNIONS {rogers V (left_action_list q vl) | q permutes 0..j - 1} = t`);
1513 (NEW_GOAL `~negligible (t INTER
1514 UNIONS {rogers V (left_action_list q vl) | q permutes 0..j - 1})`);
1515 (ASM_REWRITE_TAC[]);
1517 (UP_ASM_TAC THEN REWRITE_TAC[INTER_UNIONS]);
1518 (REWRITE_TAC[SET_RULE
1519 `{t INTER x | x IN {rogers V (left_action_list q vl) | q permutes 0..j - 1}} =
1520 {t INTER rogers V (left_action_list q vl) | q permutes 0..j - 1}`]);
1522 (NEW_GOAL `!s:(real^3->bool)->bool.
1523 ~negligible (UNIONS s) /\ FINITE s ==> (?t. t IN s /\ ~negligible t)`);
1524 (MESON_TAC[NEGLIGIBLE_UNIONS]);
1526 `R = {t INTER rogers V (left_action_list q vl) | q permutes 0..j - 1}`);
1529 (NEW_GOAL `(?r. r IN (R:(real^3->bool)->bool) /\ ~negligible r)`);
1530 (FIRST_ASSUM MATCH_MP_TAC);
1531 (ASM_REWRITE_TAC[]);
1533 (ABBREV_TAC `f = (\q. t INTER rogers V (left_action_list q vl))`);
1535 `{t INTER rogers V (left_action_list q vl) | q permutes 0..j - 1} =
1536 {f q | q permutes 0..j - 1}`);
1537 (EXPAND_TAC "f" THEN REFL_TAC);
1538 (ONCE_REWRITE_TAC[SET_RULE `{f x | P x} = {f x | x IN {x | P x}}`]);
1540 (REWRITE_TAC[SET_RULE `{f q | q IN {x | x permutes 0..j - 1} } =
1541 {y | ?q. q IN {x | x permutes 0..j - 1} /\ y = f q}`]);
1542 (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1543 (MATCH_MP_TAC FINITE_PERMUTATIONS);
1544 (REWRITE_TAC[FINITE_NUMSEG]);
1545 (UP_ASM_TAC THEN EXPAND_TAC "R" THEN REWRITE_TAC[IN; IN_ELIM_THM]
1548 `rogers V (left_action_list p ul) = rogers V (left_action_list q vl)`);
1549 (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
1551 (NEW_GOAL `coplanar (rogers V (left_action_list p ul) INTER
1552 rogers V (left_action_list q vl))`);
1553 (MATCH_MP_TAC Rogers.DUUNHOR);
1554 (ASM_REWRITE_TAC[IN]);
1557 (MATCH_MP_TAC Qzksykg.QZKSYKG1);
1558 (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
1559 (EXISTS_TAC `p:num->num`);
1560 (ASM_REWRITE_TAC[]);
1563 (REWRITE_TAC[GSYM (ASSUME `X = mcell j V vl`)]);
1565 (UNDISCH_TAC `~NULLSET X`);
1566 (REWRITE_TAC[ASSUME `X:real^3->bool = {}`; NEGLIGIBLE_EMPTY]);
1568 (MATCH_MP_TAC Qzksykg.QZKSYKG1);
1569 (EXISTS_TAC `vl:(real^3)list` THEN EXISTS_TAC `j:num`);
1570 (EXISTS_TAC `q:num->num`);
1571 (ASM_REWRITE_TAC[]);
1574 (REWRITE_TAC[GSYM (ASSUME `X = mcell j V vl`)]);
1576 (UNDISCH_TAC `~NULLSET X`);
1577 (REWRITE_TAC[ASSUME `X:real^3->bool = {}`; NEGLIGIBLE_EMPTY]);
1578 (UNDISCH_TAC `~NULLSET r`);
1580 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1581 (EXISTS_TAC `rogers V (left_action_list p ul) INTER
1582 rogers V (left_action_list q vl)`);
1584 (ASM_SIMP_TAC[COPLANAR_IMP_NEGLIGIBLE]);
1586 (ABBREV_TAC `xl:(real^3)list = (left_action_list p ul)`);
1587 (ABBREV_TAC `yl:(real^3)list = (left_action_list q vl)`);
1590 (NEW_GOAL `barV V 3 xl /\
1591 (!k. i - 1 <= k /\ k <= 3
1592 ==> omega_list_n V xl k = omega_list_n V ul k)`);
1593 (MATCH_MP_TAC Ynhyjit.YNHYJIT);
1594 (EXISTS_TAC `p:num->num`);
1595 (ASM_REWRITE_TAC[]);
1597 (ASM_CASES_TAC `j = 2`);
1598 (UNDISCH_TAC `~NULLSET X`);
1599 (REWRITE_TAC[GSYM (ASSUME `mcell i V ul = X`); ASSUME `i = j:num`;
1600 MCELL_EXPLICIT; mcell2; ASSUME `j = 2`]);
1603 (ASM_REWRITE_TAC[ARITH_RULE `2 - 1 = 1`]);
1604 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1608 (UNDISCH_TAC `~NULLSET X`);
1609 (REWRITE_TAC[GSYM (ASSUME `mcell i V ul = X`); ASSUME `i = j:num`;
1610 MCELL_EXPLICIT; mcell3; ASSUME `j = 3`]);
1613 (ASM_REWRITE_TAC[ARITH_RULE `3 - 1 = 2`]);
1614 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1617 (NEW_GOAL `barV V 3 yl /\
1618 (!k. j - 1 <= k /\ k <= 3
1619 ==> omega_list_n V yl k = omega_list_n V vl k)`);
1620 (MATCH_MP_TAC Ynhyjit.YNHYJIT);
1621 (EXISTS_TAC `q:num->num`);
1622 (ASM_REWRITE_TAC[]);
1624 (ASM_CASES_TAC `j = 2`);
1625 (UNDISCH_TAC `~NULLSET X`);
1626 (REWRITE_TAC[ASSUME `X = mcell j V vl`; MCELL_EXPLICIT; mcell2; ASSUME `j = 2`]);
1629 (ASM_REWRITE_TAC[ARITH_RULE `2 - 1 = 1`]);
1630 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1634 (UNDISCH_TAC `~NULLSET X`);
1635 (REWRITE_TAC[ASSUME `X = mcell j V vl`; MCELL_EXPLICIT; mcell3; ASSUME `j = 3`]);
1638 (ASM_REWRITE_TAC[ARITH_RULE `3 - 1 = 2`]);
1639 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1642 (NEW_GOAL `!k. 0 <= k /\ k <= 3
1643 ==> omega_list_n V xl k = omega_list_n V yl k`);
1644 (MATCH_MP_TAC Njiutiu.NJIUTIU);
1645 (ASM_REWRITE_TAC[]);
1646 (NEW_GOAL `aff_dim (rogers V yl) <= &(dimindex (:3))`);
1647 (REWRITE_TAC[AFF_DIM_LE_UNIV]);
1648 (UP_ASM_TAC THEN REWRITE_TAC[DIMINDEX_3]);
1650 (NEW_GOAL `~(aff_dim (rogers V yl) <= &2)`);
1652 (UNDISCH_TAC `~NULLSET r` THEN REWRITE_TAC[]);
1653 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1654 (EXISTS_TAC `rogers V yl`);
1656 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
1657 (ASM_SIMP_TAC[Rogers.AFF_DIM_LE_2_IMP_COPLANAR]);
1659 (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
1661 `(!k. j - 1 <= k /\ k <= 3 ==> omega_list_n V xl k = omega_list_n V yl k)`);
1663 (FIRST_ASSUM MATCH_MP_TAC);
1664 (ASM_REWRITE_TAC[]);
1665 (NEW_GOAL `j = 2 \/ j = 3 \/ j = 4`);
1668 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
1669 (ASM_MESON_TAC[])]);;
1671 (* ==================================================================== *)
1674 let MCELL_ID_MXI = prove_by_refinement (
1681 mcell i V ul = mcell j V vl /\
1682 ~NULLSET (mcell i V ul) /\
1685 ==> mxi V ul = mxi V vl`,
1686 [(REPEAT STRIP_TAC);
1688 (!k. i - 1 <= k /\ k <= 3
1689 ==> omega_list_n V ul k = omega_list_n V vl k)`);
1690 (MATCH_MP_TAC MCELL_ID_OMEGA_LIST_N);
1691 (ASM_REWRITE_TAC[]);
1693 (UP_ASM_TAC THEN STRIP_TAC);
1695 (ASM_CASES_TAC `hl (truncate_simplex 2 (ul:(real^3)list)) >= sqrt (&2)`);
1696 (ASM_CASES_TAC `hl (truncate_simplex 2 (vl:(real^3)list)) >= sqrt (&2)`);
1698 (REWRITE_WITH `mxi V ul = omega_list_n V ul 2`);
1699 (REWRITE_TAC[mxi] THEN COND_CASES_TAC);
1700 (ASM_REWRITE_TAC[]);
1705 (REWRITE_WITH `mxi V vl = omega_list_n V vl 2`);
1706 (REWRITE_TAC[mxi] THEN COND_CASES_TAC);
1707 (ASM_REWRITE_TAC[]);
1712 (FIRST_ASSUM MATCH_MP_TAC);
1713 (NEW_GOAL `i = 2 \/ i = 3`);
1717 (UP_ASM_TAC THEN REWRITE_TAC[REAL_ARITH `~(a >= b) <=> a < b`]);
1720 (ABBREV_TAC `xl = truncate_simplex 2 (ul:(real^3)list)`);
1721 (ABBREV_TAC `yl = truncate_simplex 2 (vl:(real^3)list)`);
1723 (NEW_GOAL `set_of_list (truncate_simplex (i - 1) (ul:(real^3)list)) =
1724 set_of_list (truncate_simplex (i - 1) vl)`);
1725 (NEW_GOAL `V INTER mcell i V ul = set_of_list (truncate_simplex (i - 1) ul)`);
1726 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
1727 (NEW_GOAL `i = 2 \/ i = 3`);
1729 (ASM_REWRITE_TAC[]);
1733 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1734 (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1735 (NEW_GOAL `V INTER mcell j V vl = set_of_list (truncate_simplex (j - 1) vl)`);
1736 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
1737 (NEW_GOAL `i = 2 \/ i = 3`);
1739 (ASM_REWRITE_TAC[]);
1743 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1744 (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1748 (NEW_GOAL `hl (xl:(real^3)list) <= dist (omega_list V xl, HD xl)`);
1749 (MATCH_MP_TAC Rogers.WAUFCHE1);
1750 (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN] THEN EXPAND_TAC "xl");
1751 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
1752 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
1754 (NEW_GOAL `hl yl = dist (omega_list V yl, HD yl)`);
1755 (MATCH_MP_TAC Rogers.WAUFCHE2);
1756 (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN]);
1757 (EXPAND_TAC "yl" THEN MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
1758 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
1760 (NEW_GOAL `omega_list V xl = omega_list V yl`);
1761 (REWRITE_TAC[OMEGA_LIST]);
1762 (REWRITE_WITH `LENGTH (xl:(real^3)list) = 3 /\ LENGTH (yl:(real^3)list) = 3`);
1763 (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
1764 (REWRITE_TAC[ARITH_RULE `3 = 2 + 1`]);
1766 (MATCH_MP_TAC Packing3.LENGTH_TRUNCATE_SIMPLEX);
1767 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
1768 CARD (set_of_list ul) = 3 + 1`);
1769 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1770 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1772 (MATCH_MP_TAC Packing3.LENGTH_TRUNCATE_SIMPLEX);
1773 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\
1774 CARD (set_of_list vl) = 3 + 1`);
1775 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1776 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1778 (REWRITE_TAC[ARITH_RULE `3 - 1 = 2`]);
1779 (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
1781 `truncate_simplex 2 ul = truncate_simplex (2 + 0) (ul:(real^3)list) /\
1782 truncate_simplex 2 vl = truncate_simplex (2 + 0) (vl:(real^3)list)`);
1783 (REWRITE_TAC[ARITH_RULE `2 + 0 = 2`]);
1785 `omega_list_n V (truncate_simplex (2 + 0) ul) 2 = omega_list_n V ul 2`);
1786 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1787 (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
1788 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
1789 CARD (set_of_list ul) = 3 + 1`);
1790 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1791 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1795 `omega_list_n V (truncate_simplex (2 + 0) vl) 2 = omega_list_n V vl 2`);
1796 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1797 (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
1798 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\
1799 CARD (set_of_list vl) = 3 + 1`);
1800 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1801 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1804 (FIRST_ASSUM MATCH_MP_TAC);
1805 (NEW_GOAL `i = 2 \/ i = 3`);
1808 (NEW_GOAL `HD (xl:(real^3)list) = HD yl`);
1809 (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
1810 (REWRITE_WITH `HD (truncate_simplex 2 ul) = (HD ul):real^3`);
1811 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1812 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
1813 CARD (set_of_list ul) = 3 + 1`);
1814 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1815 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1818 (REWRITE_WITH `HD (truncate_simplex 2 vl) = (HD vl):real^3`);
1819 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1820 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\
1821 CARD (set_of_list vl) = 3 + 1`);
1822 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1823 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1825 (ASM_REWRITE_TAC[]);
1826 (NEW_GOAL `hl (yl:(real^3)list) = dist (omega_list V xl, HD xl)`);
1827 (ASM_REWRITE_TAC[]);
1828 (ASM_REAL_ARITH_TAC);
1831 (* ======================================================================= *)
1833 (UP_ASM_TAC THEN REWRITE_TAC[REAL_ARITH `~(a >= b) <=> a < b`]);
1835 (ASM_CASES_TAC `hl (truncate_simplex 2 (vl:(real^3)list)) >= sqrt (&2)`);
1837 (ABBREV_TAC `xl = truncate_simplex 2 (ul:(real^3)list)`);
1838 (ABBREV_TAC `yl = truncate_simplex 2 (vl:(real^3)list)`);
1840 (NEW_GOAL `set_of_list (truncate_simplex (i - 1) (ul:(real^3)list)) =
1841 set_of_list (truncate_simplex (i - 1) vl)`);
1842 (NEW_GOAL `V INTER mcell i V ul = set_of_list (truncate_simplex (i - 1) ul)`);
1843 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
1844 (NEW_GOAL `i = 2 \/ i = 3`);
1846 (ASM_REWRITE_TAC[]);
1850 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1851 (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1852 (NEW_GOAL `V INTER mcell j V vl = set_of_list (truncate_simplex (j - 1) vl)`);
1853 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
1854 (NEW_GOAL `i = 2 \/ i = 3`);
1856 (ASM_REWRITE_TAC[]);
1860 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1861 (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1865 (NEW_GOAL `hl (yl:(real^3)list) <= dist (omega_list V yl, HD yl)`);
1866 (MATCH_MP_TAC Rogers.WAUFCHE1);
1867 (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN] THEN EXPAND_TAC "yl");
1868 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
1869 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
1871 (NEW_GOAL `hl xl = dist (omega_list V xl, HD xl)`);
1872 (MATCH_MP_TAC Rogers.WAUFCHE2);
1873 (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN]);
1874 (EXPAND_TAC "xl" THEN MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
1875 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
1877 (NEW_GOAL `omega_list V xl = omega_list V yl`);
1878 (REWRITE_TAC[OMEGA_LIST]);
1879 (REWRITE_WITH `LENGTH (xl:(real^3)list) = 3 /\ LENGTH (yl:(real^3)list) = 3`);
1880 (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
1881 (REWRITE_TAC[ARITH_RULE `3 = 2 + 1`]);
1883 (MATCH_MP_TAC Packing3.LENGTH_TRUNCATE_SIMPLEX);
1884 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
1885 CARD (set_of_list ul) = 3 + 1`);
1886 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1887 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1889 (MATCH_MP_TAC Packing3.LENGTH_TRUNCATE_SIMPLEX);
1890 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\
1891 CARD (set_of_list vl) = 3 + 1`);
1892 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1893 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1895 (REWRITE_TAC[ARITH_RULE `3 - 1 = 2`]);
1896 (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
1898 `truncate_simplex 2 ul = truncate_simplex (2 + 0) (ul:(real^3)list) /\
1899 truncate_simplex 2 vl = truncate_simplex (2 + 0) (vl:(real^3)list)`);
1900 (REWRITE_TAC[ARITH_RULE `2 + 0 = 2`]);
1902 `omega_list_n V (truncate_simplex (2 + 0) ul) 2 = omega_list_n V ul 2`);
1903 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1904 (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
1905 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
1906 CARD (set_of_list ul) = 3 + 1`);
1907 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1908 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1912 `omega_list_n V (truncate_simplex (2 + 0) vl) 2 = omega_list_n V vl 2`);
1913 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1914 (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
1915 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\
1916 CARD (set_of_list vl) = 3 + 1`);
1917 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1918 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1921 (FIRST_ASSUM MATCH_MP_TAC);
1922 (NEW_GOAL `i = 2 \/ i = 3`);
1926 (NEW_GOAL `HD (xl:(real^3)list) = HD yl`);
1927 (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
1928 (REWRITE_WITH `HD (truncate_simplex 2 ul) = (HD ul):real^3`);
1929 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1930 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
1931 CARD (set_of_list ul) = 3 + 1`);
1932 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1933 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1936 (REWRITE_WITH `HD (truncate_simplex 2 vl) = (HD vl):real^3`);
1937 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1938 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\
1939 CARD (set_of_list vl) = 3 + 1`);
1940 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1941 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1943 (ASM_REWRITE_TAC[]);
1945 (NEW_GOAL `hl (xl:(real^3)list) = dist (omega_list V yl, HD yl)`);
1946 (ASM_REWRITE_TAC[]);
1947 (ASM_REAL_ARITH_TAC);
1949 (UP_ASM_TAC THEN REWRITE_TAC[REAL_ARITH `~(a >= b) <=> a < b`]);
1952 (* ======================================================================= *)
1954 (NEW_GOAL `sqrt (&2) <= hl (ul:(real^3)list)`);
1955 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1956 (ASM_CASES_TAC `i = 2`);
1957 (REWRITE_TAC[MCELL_EXPLICIT; ASSUME `i = 2`; mcell2]);
1960 (ASM_REWRITE_TAC[]);
1961 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1964 (REWRITE_TAC[MCELL_EXPLICIT; ASSUME `i = 3`; mcell3]);
1967 (ASM_REWRITE_TAC[]);
1968 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1970 (NEW_GOAL `sqrt (&2) <= hl (vl:(real^3)list)`);
1971 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1972 (ASM_REWRITE_TAC[]);
1973 (ASM_CASES_TAC `j = 2`);
1974 (REWRITE_TAC[MCELL_EXPLICIT; ASSUME `j = 2`; mcell2]);
1977 (ASM_REWRITE_TAC[]);
1978 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1981 (REWRITE_TAC[MCELL_EXPLICIT; ASSUME `j = 3`; mcell3]);
1984 (ASM_REWRITE_TAC[]);
1985 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1987 (ABBREV_TAC `s2 = omega_list_n V ul 2`);
1988 (ABBREV_TAC `s3 = omega_list_n V ul 3`);
1989 (NEW_GOAL `s2 = omega_list_n V vl 2`);
1990 (EXPAND_TAC "s2" THEN FIRST_ASSUM MATCH_MP_TAC);
1991 (NEW_GOAL `i = 2 \/ i = 3`);
1994 (NEW_GOAL `s3 = omega_list_n V vl 3`);
1995 (EXPAND_TAC "s3" THEN FIRST_ASSUM MATCH_MP_TAC);
1996 (NEW_GOAL `i = 2 \/ i = 3`);
1999 (ABBREV_TAC `u0:real^3 = HD ul`);
2001 (NEW_GOAL `?s. between s (s2,s3) /\
2002 dist (u0,s) = sqrt (&2) /\
2004 (EXPAND_TAC "s2" THEN EXPAND_TAC "s3");
2005 (MATCH_MP_TAC MXI_EXPLICIT);
2006 (NEW_GOAL `?v0 u1 u2 u3. ul = [v0;u1;u2;u3:real^3]`);
2007 (MATCH_MP_TAC BARV_3_EXPLICIT);
2008 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2009 (UP_ASM_TAC THEN STRIP_TAC);
2010 (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN
2011 EXISTS_TAC `u3:real^3`);
2012 (ASM_REWRITE_TAC[]);
2013 (REWRITE_WITH `v0:real^3 = HD ul`);
2014 (REWRITE_TAC[ASSUME `ul = [v0;u1;u2;u3:real^3]`; HD]);
2015 (ASM_REWRITE_TAC[]);
2016 (UP_ASM_TAC THEN STRIP_TAC);
2018 (NEW_GOAL `?t. between t (s2,s3) /\
2019 dist (u0,t) = sqrt (&2) /\
2021 (ASM_REWRITE_TAC[]);
2022 (MATCH_MP_TAC MXI_EXPLICIT);
2023 (NEW_GOAL `?v0 u1 u2 u3. vl = [v0;u1;u2;u3:real^3]`);
2024 (MATCH_MP_TAC BARV_3_EXPLICIT);
2025 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2026 (UP_ASM_TAC THEN STRIP_TAC);
2027 (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN
2028 EXISTS_TAC `u3:real^3`);
2029 (ASM_REWRITE_TAC[HD]);
2030 (UP_ASM_TAC THEN STRIP_TAC);
2031 (ASM_REWRITE_TAC[]);
2033 (NEW_GOAL `!n. between n (s2, s3:real^3) ==>
2034 dist (u0, n) pow 2 = dist (s2, n) pow 2 + dist (u0, s2) pow 2`);
2036 (REWRITE_TAC[dist]);
2037 (MATCH_MP_TAC PYTHAGORAS);
2038 (REWRITE_TAC[orthogonal]);
2039 (ABBREV_TAC `zl = truncate_simplex 2 (ul:(real^3)list)`);
2040 (REWRITE_WITH `s2:real^3 = circumcenter (set_of_list zl)`);
2041 (REWRITE_WITH `s2 = omega_list V zl`);
2042 (EXPAND_TAC "s2" THEN EXPAND_TAC "zl");
2043 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2044 (MATCH_MP_TAC Packing3.OMEGA_LIST_LEMMA);
2045 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
2046 CARD (set_of_list ul) = 3 + 1`);
2047 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2048 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2050 (MATCH_MP_TAC Rogers.XNHPWAB1);
2051 (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN]);
2053 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
2054 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
2055 (MATCH_MP_TAC Rogers.MHFTTZN4);
2056 (EXISTS_TAC `V:real^3->bool`);
2059 (ASM_REWRITE_TAC[]);
2061 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
2062 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
2064 (NEW_GOAL `s2 IN voronoi_list V zl`);
2065 (REWRITE_WITH `s2 = omega_list V zl`);
2066 (EXPAND_TAC "s2" THEN EXPAND_TAC "zl");
2067 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2068 (MATCH_MP_TAC Packing3.OMEGA_LIST_LEMMA);
2069 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
2070 CARD (set_of_list ul) = 3 + 1`);
2071 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2072 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2074 (MATCH_MP_TAC Packing3.OMEGA_LIST_IN_VORONOI_LIST);
2077 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
2078 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
2080 (NEW_GOAL `s3 IN voronoi_list V zl`);
2081 (EXPAND_TAC "s3" THEN EXPAND_TAC "zl");
2082 (MATCH_MP_TAC Rogers.OMEGA_LIST_N_IN_VORONOI_LIST_GEN);
2083 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3 /\ 3 <= 3`]);
2084 (NEW_GOAL `affine hull {s2, s3} SUBSET affine hull voronoi_list V zl`);
2085 (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);
2087 (NEW_GOAL `n IN affine hull {s2, s3:real^3}`);
2088 (NEW_GOAL `convex hull {s2,s3} SUBSET affine hull {s2,s3:real^3}`);
2089 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2090 (NEW_GOAL `n IN convex hull {s2, s3:real^3}`);
2091 (REWRITE_TAC[GSYM BETWEEN_IN_CONVEX_HULL]);
2092 (ASM_REWRITE_TAC[]);
2096 (MATCH_MP_TAC Marchal_cells_2_new.IN_AFFINE_KY_LEMMA1);
2097 (REWRITE_WITH `u0:real^3 = HD zl`);
2098 (EXPAND_TAC "zl" THEN EXPAND_TAC "u0");
2099 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2100 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2101 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
2102 CARD (set_of_list ul) = 3 + 1`);
2103 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2104 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2106 (MATCH_MP_TAC Packing3.HD_IN_SET_OF_LIST);
2108 (REWRITE_WITH `LENGTH (zl:(real^3)list) = 2 + 1 /\
2109 CARD (set_of_list zl) = 2 + 1`);
2110 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2111 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2113 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
2114 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
2117 (NEW_GOAL `dist (u0,s) pow 2 = dist (s2,s:real^3) pow 2 + dist (u0,s2) pow 2`);
2119 (NEW_GOAL `dist (u0,t) pow 2 = dist (s2,t:real^3) pow 2 + dist (u0,s2) pow 2`);
2121 (NEW_GOAL `dist (s2, s:real^3) = dist (s2, t)`);
2122 (REWRITE_TAC[DIST_EQ]);
2123 (UP_ASM_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC);
2125 (UNDISCH_TAC `between s (s2, s3:real^3)` THEN
2126 UNDISCH_TAC `between t (s2, s3:real^3)`);
2127 (REWRITE_TAC[BETWEEN_IN_CONVEX_HULL; CONVEX_HULL_2; IN; IN_ELIM_THM]);
2129 (UNDISCH_TAC `dist (s2,s) = dist (s2,t:real^3)`);
2130 (REWRITE_TAC[dist;ASSUME `s = u' % s2 + v' % s3:real^3`;
2131 ASSUME `t = u % s2 + v % s3:real^3` ]);
2132 (REWRITE_WITH `s2 - (u' % s2 + v' % s3) =
2133 (u' + v') % s2 - (u' % s2 + v' % s3:real^3)`);
2134 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
2135 (REWRITE_WITH `s2 - (u % s2 + v % s3) =
2136 (u + v) % s2 - (u % s2 + v % s3:real^3)`);
2137 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
2138 (REWRITE_TAC[VECTOR_ARITH `(u + v) % s - (u % s + v % t) = v % (s - t)`]);
2139 (REWRITE_TAC[NORM_MUL]);
2140 (REWRITE_WITH `abs v = v /\ abs v' = v'`);
2141 (ASM_SIMP_TAC[REAL_ABS_REFL]);
2142 (REWRITE_TAC[REAL_ARITH `a * b = c * b <=> (a - c) * b = &0`;REAL_ENTIRE]);
2144 (REWRITE_WITH `v = v':real /\ u = u':real`);
2145 (ASM_REAL_ARITH_TAC);
2146 (UP_ASM_TAC THEN REWRITE_TAC[NORM_EQ_0]);
2147 (REWRITE_TAC[VECTOR_ARITH `a - b = vec 0 <=> a = b`] THEN STRIP_TAC);
2149 (NEW_GOAL `hl (ul:(real^3)list) <= dist (s3,u0:real^3)`);
2150 (REWRITE_WITH `s3 = omega_list V ul /\ u0 = HD ul`);
2152 (REWRITE_TAC[GSYM (ASSUME `omega_list_n V ul 3 = s3`); OMEGA_LIST]);
2153 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
2154 CARD (set_of_list ul) = 3 + 1`);
2155 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2156 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2157 (REWRITE_TAC[ARITH_RULE `(3 + 1) - 1 = 3`]);
2158 (ASM_REWRITE_TAC[]);
2159 (MATCH_MP_TAC Rogers.WAUFCHE1);
2160 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[IN]);
2161 (ABBREV_TAC `zl:(real^3)list = truncate_simplex 2 ul`);
2162 (NEW_GOAL `hl (zl:(real^3)list) = dist (s3, u0:real^3)`);
2165 (REWRITE_WITH `s3 = omega_list V zl /\ u0 = HD zl`);
2167 (REWRITE_TAC[GSYM (ASSUME `s2:real^3 = s3`); OMEGA_LIST]);
2170 (REWRITE_WITH `LENGTH (zl:(real^3)list) = 2 + 1 /\
2171 CARD (set_of_list zl) = 2 + 1`);
2172 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2173 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2175 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
2176 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
2177 (REWRITE_TAC[ARITH_RULE `(2 + 1) - 1 = 2`]);
2180 (REWRITE_WITH `truncate_simplex 2 (ul:(real^3)list) =
2181 truncate_simplex (2 + 0) (ul:(real^3)list)`);
2182 (REWRITE_TAC[ARITH_RULE `2 + 0 = 2`]);
2183 (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
2184 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
2185 CARD (set_of_list ul) = 3 + 1`);
2186 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2187 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2190 (EXPAND_TAC "zl" THEN EXPAND_TAC "u0");
2191 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2192 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2193 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
2194 CARD (set_of_list ul) = 3 + 1`);
2195 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2196 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2198 (MATCH_MP_TAC Rogers.WAUFCHE2);
2199 (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN]);
2201 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
2202 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
2203 (ASM_REAL_ARITH_TAC);
2204 (ASM_MESON_TAC[])]);;
2207 (* ==================================================================== *)
2210 let AFFINE_HULL_3_INSERT = prove_by_refinement (
2212 a IN affine hull S ==> affine hull (a INSERT S) = affine hull S`,
2213 [(REPEAT STRIP_TAC);
2214 (MATCH_MP_TAC AFFINE_HULLS_EQ);
2215 (ASM_REWRITE_TAC[SET_SUBSET_AFFINE_HULL; INSERT_SUBSET]);
2216 (MATCH_MP_TAC (SET_RULE `a:real^3 INSERT s SUBSET t ==> s SUBSET t`));
2217 (REWRITE_TAC[SET_SUBSET_AFFINE_HULL])]);;
2219 (* ==================================================================== *)
2222 let FINITE_EDGE_X2 = prove_by_refinement (
2223 `!(V:real^3->bool) e:real^3->bool u0 u1.
2224 packing V /\ saturated V /\ e = {u0, u1} ==>
2225 FINITE {X | mcell_set V X /\ edgeX V X e}`,
2226 [(REPEAT STRIP_TAC);
2227 (MATCH_MP_TAC FINITE_SUBSET);
2228 (EXISTS_TAC `{X | mcell_set V X /\ edgeX V X e /\ ~(X = {})} UNION {{}}`);
2230 (ONCE_REWRITE_TAC[SET_RULE `A /\ B <=> B /\ A`]);
2232 (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM; IN_UNION]);
2234 (ASM_REWRITE_TAC[MESON[IN] `{{}} x <=> x IN {{}}`;
2235 SET_RULE `x IN {a} <=> x = a`]);
2237 (REWRITE_TAC [FINITE_UNION; FINITE_SING]);
2239 (MATCH_MP_TAC FINITE_SUBSET);
2240 (ABBREV_TAC `f = (\(i, ul). mcell i V ul)`);
2241 (ABBREV_TAC `s = V INTER ball (u0:real^3, &4)`);
2242 (ABBREV_TAC `S = {y | ?v0 v1 v2 v3:real^3.
2247 y = [v0; v1; v2; v3]}`);
2248 (ABBREV_TAC `S1 = {i, (ul:(real^3)list) | i IN 0..4 /\ ul IN S}`);
2249 (EXISTS_TAC `{(f:num#(real^3)list->real^3->bool) x | x IN S1}`);
2251 (REWRITE_TAC[SET_RULE `{f x |x IN s } = {y | ?x. x IN s /\ y = f x}`]);
2252 (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
2254 (MATCH_MP_TAC FINITE_PRODUCT);
2255 (REWRITE_TAC[FINITE_NUMSEG]);
2257 (MATCH_MP_TAC Ajripqn.FINITE_SET_LIST_LEMMA);
2259 (MATCH_MP_TAC Pack2.KIUMVTC THEN ASM_SIMP_TAC[]);
2261 (EXPAND_TAC "f" THEN REWRITE_TAC[SUBSET; IN; IN_ELIM_THM; mcell_set_2]);
2263 (EXISTS_TAC `(i:num, ul:(real^3)list)`);
2264 (ASM_REWRITE_TAC[]);
2265 (EXPAND_TAC "S1" THEN REWRITE_TAC[IN_ELIM_THM]);
2266 (EXISTS_TAC `i:num` THEN EXISTS_TAC `ul:(real^3)list`);
2267 (ASM_REWRITE_TAC[IN_NUMSEG_0]);
2268 (EXPAND_TAC "S" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
2269 (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
2270 (MATCH_MP_TAC BARV_3_EXPLICIT);
2271 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2272 (UP_ASM_TAC THEN REPEAT STRIP_TAC);
2273 (EXISTS_TAC `v0:real^3` THEN EXISTS_TAC `v1:real^3` THEN
2274 EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2275 (ASM_REWRITE_TAC[]);
2276 (NEW_GOAL `set_of_list ul SUBSET (s:real^3->bool)`);
2278 (REWRITE_TAC[SUBSET_INTER]);
2280 (MATCH_MP_TAC Packing3.BARV_SUBSET);
2281 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
2282 (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
2283 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2285 (NEW_GOAL `~NULLSET x`);
2286 (UNDISCH_TAC `edgeX V x e`);
2287 (REWRITE_TAC[edgeX; IN_ELIM_THM; VX]);
2290 (UNDISCH_TAC `{ } (u:real^3)`);
2291 (REWRITE_TAC[MESON[IN] `{} x <=> x IN {}`] THEN SET_TAC[]);
2294 (NEW_GOAL `VX V x = V INTER x`);
2295 (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
2296 (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
2297 (ASM_REWRITE_TAC[]);
2299 (NEW_GOAL `V INTER (x:real^3->bool) =
2300 set_of_list (truncate_simplex (i - 1) ul)`);
2301 (ASM_REWRITE_TAC[]);
2302 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
2303 (REWRITE_TAC[GSYM (ASSUME `ul = [v0;v1;v2;v3:real^3]`);
2304 GSYM (ASSUME `x = mcell i V ul`)]);
2305 (ASM_REWRITE_TAC[]);
2306 (ASM_CASES_TAC `i = 0`);
2308 (UNDISCH_TAC `edgeX V x e`);
2309 (REWRITE_TAC[edgeX; IN_ELIM_THM]);
2310 (REWRITE_WITH `VX V x = {}`);
2311 (ASM_REWRITE_TAC[]);
2312 (MATCH_MP_TAC Lepjbdj.LEPJBDJ_0);
2313 (ASM_REWRITE_TAC[]);
2316 (UNDISCH_TAC `{ } (u:real^3)`);
2317 (REWRITE_TAC[MESON[IN] `{} x <=> x IN {}`] THEN SET_TAC[]);
2319 (UP_ASM_TAC THEN ARITH_TAC);
2321 (NEW_GOAL `u0 IN VX V x`);
2322 (UNDISCH_TAC `edgeX V x e`);
2323 (REWRITE_TAC[edgeX; IN_ELIM_THM; ASSUME `e = {u0, u1:real^3}`; IN]);
2326 (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2328 (REWRITE_TAC[GSYM (ASSUME `ul = [v0; v1; v2; v3:real^3]`)]);
2330 (NEW_GOAL `set_of_list (truncate_simplex (i - 1) ul) SUBSET
2331 set_of_list (ul:(real^3)list)`);
2332 (MATCH_MP_TAC Rogers.SET_OF_LIST_TRUNCATE_SIMPLEX_SUBSET);
2333 (ASM_REWRITE_TAC[LENGTH] THEN ASM_ARITH_TAC);
2335 (REWRITE_TAC[MESON[IN] `(s:real^3->bool) v <=> v IN s`]);
2336 (UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list] THEN SET_TAC[])]);;
2339 (* ==================================================================== *)
2342 let CONTINUOUS_ON_LIFT_DOT2 = prove
2343 (`!f:real^M->real^N g s.
2344 f continuous_on s /\ g continuous_on s
2345 ==> (\x. lift(f x dot g x)) continuous_on s`,
2347 SUBGOAL_THEN `bilinear (\x y:real^N. lift(x dot y))` MP_TAC THENL
2348 [REWRITE_TAC[bilinear; linear; DOT_LADD; DOT_RADD; DOT_LMUL; DOT_RMUL] THEN
2349 REWRITE_TAC[LIFT_ADD; LIFT_CMUL];
2350 REWRITE_TAC[GSYM IMP_CONJ_ALT; GSYM CONJ_ASSOC] THEN
2351 DISCH_THEN(MP_TAC o MATCH_MP BILINEAR_CONTINUOUS_ON_COMPOSE) THEN
2354 let LIFT_MUL_CONTINUOUS_ON = prove
2355 (`!f:real^N->real g s.
2356 lift o f continuous_on s /\ lift o g continuous_on s ==>
2357 lift o (\x. f x * g x) continuous_on s`,
2358 REWRITE_TAC[o_DEF; LIFT_CMUL] THEN
2359 REPEAT STRIP_TAC THEN MATCH_MP_TAC CONTINUOUS_ON_MUL THEN
2360 ASM_REWRITE_TAC[o_DEF]);;
2362 let LIFT_DIV_CONTINUOUS_ON = prove
2363 (`!f:real^N->real g s.
2364 lift o f continuous_on s /\ lift o g continuous_on s /\
2365 (!x. x IN s ==> ~(g x = &0))==>
2366 lift o (\x. f x / g x) continuous_on s`,
2367 REWRITE_TAC[o_DEF; LIFT_CMUL; real_div] THEN
2368 REPEAT STRIP_TAC THEN MATCH_MP_TAC CONTINUOUS_ON_MUL THEN
2369 ASM_REWRITE_TAC[o_DEF] THEN
2370 MATCH_MP_TAC(REWRITE_RULE[o_DEF] CONTINUOUS_ON_INV) THEN
2371 ASM_REWRITE_TAC[]);;
2373 let LIFT_DOT_CONTINUOUS_ON = prove
2375 (lift o ((\x. (x - a) dot b))) continuous_on s`,
2376 REPEAT GEN_TAC THEN REWRITE_TAC[o_DEF] THEN
2377 MATCH_MP_TAC CONTINUOUS_ON_LIFT_DOT2 THEN
2378 ASM_SIMP_TAC[CONTINUOUS_ON_SUB; CONTINUOUS_ON_CONST; CONTINUOUS_ON_ID]);;
2380 let LIFT_NORM_CONTINUOUS_ON = prove
2382 (lift o ((\x. norm (x - a)))) continuous_on s`,
2383 REPEAT GEN_TAC THEN REWRITE_TAC[o_DEF] THEN
2384 MATCH_MP_TAC CONTINUOUS_ON_LIFT_NORM_COMPOSE THEN
2385 ASM_SIMP_TAC[CONTINUOUS_ON_SUB; CONTINUOUS_ON_CONST; CONTINUOUS_ON_ID]);;
2387 (* ==================================================================== *)
2390 let aff_ge_alt = new_definition
2391 `aff_ge_alt s t (v:real^3) <=>
2392 (?f q. FINITE q /\ q SUBSET t /\ v = lin_combo (s UNION q) f /\
2393 (!w. q w ==> &0 <= f w) /\
2394 sum (s UNION q) f = &1)`;;
2396 let smallest_angle_set = new_definition
2398 smallest_angle_set s u0 u1 =
2399 (@x. x IN s /\ (!y. y IN s ==>
2400 ((y - u0) dot (u1 - u0)) /
2401 (norm (y - u0) * norm (u1 - u0)) <=
2402 ((x - u0) dot (u1 - u0)) /
2403 (norm (x - u0) * norm (u1 - u0))))`;;
2405 let smallest_angle_line = new_definition
2407 smallest_angle_line a b c d = smallest_angle_set (convex hull {a, b}) c d`;;
2409 let SMALLEST_ANGLE_LINE_EXISTS = prove_by_refinement (
2410 `!a b u0 u1. ~(u0 = u1) /\ ~(u0 IN convex hull {a, b}) ==>
2411 (?x. (x IN convex hull {a, b:real^3} /\
2412 (!y. y IN convex hull {a, b} ==>
2413 ((y - u0) dot (u1 - u0)) /
2414 (norm (y - u0) * norm (u1 - u0)) <=
2415 ((x - u0) dot (u1 - u0)) /
2416 (norm (x - u0) * norm (u1 - u0)))))`,
2417 [(REPEAT STRIP_TAC);
2418 (ABBREV_TAC `f = (\x:real^3. ((x - u0) dot (u1 - u0)) /
2419 (norm (x - u0) * norm (u1 - u0)))`);
2421 (REWRITE_WITH `!y:real^3.
2422 ((y - u0) dot (u1 - u0)) / (norm (y - u0) * norm (u1 - u0)) = f y`);
2423 (EXPAND_TAC "f" THEN REWRITE_TAC[]);
2424 (MATCH_MP_TAC CONTINUOUS_ATTAINS_SUP);
2426 (MATCH_MP_TAC FINITE_IMP_COMPACT_CONVEX_HULL);
2427 (REWRITE_TAC[Geomdetail.FINITE6]);
2429 (REWRITE_TAC[CONVEX_HULL_EQ_EMPTY] THEN SET_TAC[]);
2430 (ABBREV_TAC `f1 = (\x. (x - u0) dot (u1 - u0:real^3))`);
2431 (ABBREV_TAC `f2 = (\x. norm (x - u0) * norm (u1 - u0:real^3))`);
2432 (REWRITE_WITH `f = (\x:real^3. f1 x / f2 x)`);
2433 (EXPAND_TAC "f" THEN EXPAND_TAC "f1" THEN EXPAND_TAC "f2");
2435 (MATCH_MP_TAC LIFT_DIV_CONTINUOUS_ON);
2439 (REWRITE_TAC[LIFT_DOT_CONTINUOUS_ON]);
2440 (ABBREV_TAC `f3 = (\x:real^3. norm (u1 - u0:real^3))`);
2441 (ABBREV_TAC `f4 = (\x:real^3. norm (x - u0:real^3))`);
2442 (REWRITE_WITH `f2 = (\x:real^3. f4 x * f3 x)`);
2443 (EXPAND_TAC "f2" THEN EXPAND_TAC "f3" THEN EXPAND_TAC "f4");
2445 (MATCH_MP_TAC LIFT_MUL_CONTINUOUS_ON);
2446 (EXPAND_TAC "f3" THEN EXPAND_TAC "f4");
2447 (REWRITE_TAC[LIFT_NORM_CONTINUOUS_ON]);
2448 (REWRITE_TAC[o_DEF; CONTINUOUS_ON_CONST]);
2449 (UP_ASM_TAC THEN EXPAND_TAC "f2" THEN REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0]);
2450 (ASM_REWRITE_TAC[VECTOR_ARITH `a - b = vec 0 <=> b = a`]);
2452 (ASM_MESON_TAC[])]);;
2454 (* ==================================================================== *)
2457 let SMALLEST_ANGLE_IN_CONVEX_HULL = prove_by_refinement (
2459 ~(p = q) /\ ~(p IN convex hull {m,n}) /\ x = smallest_angle_line m n p q
2460 ==> x IN convex hull {m, n}`,
2461 [(REPEAT STRIP_TAC);
2462 (UP_ASM_TAC THEN REWRITE_TAC[smallest_angle_line; smallest_angle_set]);
2464 (ABBREV_TAC `X = (\x:real^3. x IN convex hull {m, n} /\
2465 (!y. y IN convex hull {m, n}
2466 ==> ((y - p) dot (q - p)) / (norm (y - p) * norm (q - p)) <=
2467 ((x - p) dot (q - p)) / (norm (x - p) * norm (q - p))))`);
2468 (NEW_GOAL `(X:real^3->bool) x`);
2469 (ASM_REWRITE_TAC[] THEN MATCH_MP_TAC SELECT_AX);
2470 (EXPAND_TAC "X" THEN ASM_SIMP_TAC[SMALLEST_ANGLE_LINE_EXISTS]);
2471 (UP_ASM_TAC THEN EXPAND_TAC "X" THEN MESON_TAC[])]);;
2473 (* ==================================================================== *)
2476 let SMALLEST_ANGLE_LINE_PROPERTY = prove_by_refinement (
2479 ~(u0 IN convex hull {m,n}) /\
2480 x = smallest_angle_line m n u0 u1 /\
2481 y IN convex hull {m, n}
2482 ==> ((y - u0) dot (u1 - u0)) /
2483 (norm (y - u0) * norm (u1 - u0)) <=
2484 ((x - u0) dot (u1 - u0)) /
2485 (norm (x - u0) * norm (u1 - u0))`,
2486 [(REPEAT STRIP_TAC);
2487 (UNDISCH_TAC `x = smallest_angle_line m n u0 u1`);
2488 (REWRITE_TAC[smallest_angle_line; smallest_angle_set]);
2491 (\x:real^3. x IN convex hull {m, n} /\
2492 (!y. y IN convex hull {m, n}
2493 ==> ((y - u0) dot (u1 - u0)) / (norm (y - u0) * norm (u1 - u0)) <=
2494 ((x - u0) dot (u1 - u0)) / (norm (x - u0) * norm (u1 - u0))))`);
2495 (NEW_GOAL `(X:real^3->bool) x`);
2496 (ASM_REWRITE_TAC[] THEN MATCH_MP_TAC SELECT_AX);
2497 (EXPAND_TAC "X" THEN ASM_SIMP_TAC[SMALLEST_ANGLE_LINE_EXISTS]);
2498 (UP_ASM_TAC THEN EXPAND_TAC "X" THEN ASM_MESON_TAC[])]);;
2500 (* ==================================================================== *)
2503 let MCELL_SUBSET_BALL8_1 = prove_by_refinement (
2505 i<= 4 /\ packing V /\ saturated V /\ barV V 3 ul /\ v IN mcell i V ul ==>
2506 mcell i V ul SUBSET ball (v, &8)`,
2507 [(REPEAT STRIP_TAC);
2508 (NEW_GOAL `mcell i V ul SUBSET
2509 UNIONS {rogers V (left_action_list p ul) | p permutes 0..i - 1}`);
2510 (MATCH_MP_TAC Qzksykg.QZKSYKG2);
2511 (ASM_REWRITE_TAC[SET_RULE `i IN {0,1,2,3,4}<=> i =0\/i=1\/i=2\/i=3\/i=4`]);
2513 (NEW_GOAL `UNIONS {rogers V (left_action_list p ul) | p permutes 0..i - 1}
2514 SUBSET UNIONS {voronoi_closed V s | s IN set_of_list ul}`);
2515 (REWRITE_TAC[SUBSET; IN_UNIONS; IN;IN_ELIM_THM] THEN REPEAT STRIP_TAC);
2516 (EXISTS_TAC `voronoi_closed V ((HD (left_action_list p ul)):real^3)`);
2518 (EXISTS_TAC `(HD (left_action_list p ul)):real^3`);
2519 (REWRITE_TAC[MESON[IN] `(a:real^3->bool) s <=> s IN a`]);
2521 `set_of_list (ul:(real^3)list) = set_of_list (left_action_list p ul)`);
2522 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2523 (ASM_CASES_TAC `i = 4`);
2524 (MATCH_MP_TAC Packing3.SET_OF_LIST_LEFT_ACTION_LIST);
2525 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
2526 CARD (set_of_list ul) = 3 + 1`);
2527 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2528 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2529 (ASM_MESON_TAC[ARITH_RULE `3 + 1 = 4`]);
2531 (ASM_CASES_TAC `i = 3`);
2532 (MATCH_MP_TAC Marchal_cells_2_new.SET_OF_LIST_LEFT_ACTION_LIST_2);
2533 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
2534 CARD (set_of_list ul) = 3 + 1`);
2535 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2536 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2537 (ASM_MESON_TAC[ARITH_RULE `(3 + 1) - 2 = 3 - 1 /\ 2 <= 3 + 1`]);
2539 (ASM_CASES_TAC `i = 2`);
2540 (MATCH_MP_TAC Marchal_cells_2_new.SET_OF_LIST_LEFT_ACTION_LIST_3);
2541 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
2542 CARD (set_of_list ul) = 3 + 1`);
2543 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2544 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2545 (ASM_MESON_TAC[ARITH_RULE `(3 + 1) - 3 = 2 - 1 /\ 3 <= 3 + 1`]);
2547 (NEW_GOAL `i <= 1`);
2549 (NEW_GOAL `p permutes 0..0`);
2550 (ASM_MESON_TAC[ARITH_RULE `i <= 1 ==> i - 1 = 0`]);
2551 (UP_ASM_TAC THEN REWRITE_TAC[Packing3.PERMUTES_TRIVIAL] THEN STRIP_TAC);
2552 (ASM_REWRITE_TAC[Packing3.LEFT_ACTION_LIST_I]);
2553 (MATCH_MP_TAC Packing3.HD_IN_SET_OF_LIST);
2554 (REWRITE_TAC[Packing3.LENGTH_LEFT_ACTION_LIST]);
2555 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
2556 CARD (set_of_list ul) = 3 + 1`);
2557 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2558 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2561 (UP_ASM_TAC THEN REWRITE_TAC[MESON[IN] `(a:real^3->bool) s <=> s IN a`]);
2562 (ASM_REWRITE_TAC[]);
2563 (NEW_GOAL `rogers V (left_action_list p ul) SUBSET
2564 voronoi_closed V (HD (left_action_list p ul))`);
2565 (MATCH_MP_TAC ROGERS_SUBSET_VORONOI_CLOSED);
2566 (ASM_REWRITE_TAC[]);
2567 (MATCH_MP_TAC Qzksykg.QZKSYKG1);
2568 (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num` THEN
2569 EXISTS_TAC `p:num->num`);
2570 (ASM_REWRITE_TAC[]);
2572 (REWRITE_TAC[SET_RULE `i IN {0,1,2,3,4} <=> i=0\/i=1\/i=2\/i=3\/i=4`]);
2574 (UNDISCH_TAC `v IN mcell i V ul` THEN SET_TAC[]);
2575 (UP_ASM_TAC THEN SET_TAC[]);
2577 (NEW_GOAL `UNIONS {voronoi_closed V s | s IN set_of_list ul} SUBSET
2578 UNIONS {ball (s:real^3, &2) | s IN set_of_list ul}`);
2579 (NEW_GOAL `!s:real^3. voronoi_closed V s SUBSET ball (s, &2)`);
2580 (ASM_SIMP_TAC[Packing3.VORONOI_BALL2]);
2581 (UP_ASM_TAC THEN SET_TAC[]);
2583 (NEW_GOAL `mcell i V ul SUBSET UNIONS {ball (s,&2) | s IN set_of_list ul}`);
2585 UNIONS {rogers V (left_action_list p ul) | p permutes 0..i - 1}`);
2587 UNIONS {voronoi_closed V (s:real^3) | s IN set_of_list ul}`);
2588 (ABBREV_TAC `s3 = UNIONS {ball (s:real^3,&2) | s IN set_of_list ul}`);
2589 (DEL_TAC THEN DEL_TAC THEN DEL_TAC);
2590 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
2591 (UP_ASM_TAC THEN REWRITE_TAC[SUBSET; IN_UNIONS; IN; IN_ELIM_THM; IN_BALL]);
2593 (NEW_GOAL `?t. (?s. set_of_list ul s /\ t = ball (s:real^3,&2)) /\ t x`);
2595 (UP_ASM_TAC THEN STRIP_TAC);
2596 (NEW_GOAL `dist (s, x:real^3) < &2`);
2597 (REWRITE_TAC[GSYM IN_BALL]);
2598 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
2600 (NEW_GOAL `?t. (?s. set_of_list ul s /\ t = ball (s:real^3,&2)) /\ t v`);
2601 (FIRST_ASSUM MATCH_MP_TAC);
2603 (UP_ASM_TAC THEN STRIP_TAC);
2604 (NEW_GOAL `dist (s', v:real^3) < &2`);
2605 (REWRITE_TAC[GSYM IN_BALL]);
2606 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
2608 (NEW_GOAL `dist (v, x:real^3) <= dist (s', v) + dist (s', s) + dist (s, x)`);
2610 (NEW_GOAL `dist (s', s:real^3) < &4`);
2611 (REWRITE_TAC[GSYM IN_BALL]);
2613 (NEW_GOAL `set_of_list ul SUBSET ball (s':real^3,&4)`);
2614 (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
2615 (EXISTS_TAC `V:real^3->bool`);
2616 (ASM_REWRITE_TAC[IN]);
2618 (ASM_REAL_ARITH_TAC)]);;
2620 (* ==================================================================== *)
2623 let MCELL_SUBSET_BALL8 = prove_by_refinement (
2625 packing V /\ saturated V /\ barV V 3 ul /\ v IN mcell i V ul ==>
2626 mcell i V ul SUBSET ball (v, &8)`,
2627 [(REPEAT STRIP_TAC);
2628 (ASM_CASES_TAC `i <= 4`);
2629 (ASM_SIMP_TAC[MCELL_SUBSET_BALL8_1]);
2630 (UNDISCH_TAC `v IN mcell i V ul`);
2631 (REWRITE_WITH `mcell i V ul = mcell 4 V ul`);
2632 (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`;
2633 ARITH_RULE `~(i <= 4)==>i >= 4`]);
2635 (ASM_SIMP_TAC[MCELL_SUBSET_BALL8_1; ARITH_RULE `4 <= 4`])]);;
2637 (* ==================================================================== *)
2640 let FINITE_MCELL_SET_LEMMA_2 = prove_by_refinement (
2642 packing V /\ saturated V
2643 ==> FINITE {X | X SUBSET ball (s,r) /\ mcell_set V X}`,
2644 [(REPEAT STRIP_TAC);
2645 (MATCH_MP_TAC FINITE_SUBSET);
2646 (EXISTS_TAC `{X | X SUBSET ball (vec 0,norm (s:real^3) + r) /\
2649 (ASM_SIMP_TAC[FINITE_MCELL_SET_LEMMA]);
2650 (REWRITE_TAC[IN; SUBSET; IN_BALL; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
2651 (NEW_GOAL `dist (vec 0, x') <= norm s + dist (s, x':real^3)`);
2653 (NEW_GOAL `dist (s, x':real^3) < r`);
2655 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
2656 (ASM_REWRITE_TAC[])]);;
2658 (* ==================================================================== *)
2661 let CONIC_CAP_WEDGE_EQ_0 =prove_by_refinement (
2662 `!v0 v1 a r w1 w2. a < &1 /\ &0 < r /\
2663 vol (conic_cap v0 v1 r a INTER wedge v0 v1 w1 w2) = &0 ==>
2664 coplanar {v0,v1,w1, w2:real^3}`,
2665 [(REPEAT STRIP_TAC);
2666 (MATCH_MP_TAC (MESON[] `(~A==> F) ==> A`) THEN STRIP_TAC);
2667 (NEW_GOAL `~collinear {v0, v1, w1:real^3}`);
2668 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
2669 (EXISTS_TAC `w2:real^3` THEN ASM_REWRITE_TAC[]);
2670 (NEW_GOAL `~collinear {v0, v1, w2:real^3}`);
2671 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
2672 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`] THEN
2673 EXISTS_TAC `w1:real^3` THEN ASM_REWRITE_TAC[]);
2675 (NEW_GOAL `vol (conic_cap v0 v1 r a INTER wedge v0 v1 w1 (w2:real^3)) =
2676 (if &1 < a \/ r < &0
2678 else azim v0 v1 w1 w2 / &3 * (&1 - max a (-- &1)) * r pow 3)`);
2679 (ASM_MESON_TAC[VOLUME_CONIC_CAP_WEDGE]);
2680 (UP_ASM_TAC THEN COND_CASES_TAC);
2681 (STRIP_TAC THEN ASM_REAL_ARITH_TAC);
2682 (ASM_REWRITE_TAC[REAL_ARITH `&0 = a <=> a = &0`;
2683 REAL_ENTIRE; REAL_ARITH `a / &3 = &0 <=> a = &0`]);
2684 (REWRITE_TAC[REAL_ARITH `&1 - max a (-- &1) = &0 <=> a = &1`]);
2686 (UNDISCH_TAC `~coplanar {v0, v1, w1, w2:real^3}`);
2687 (ASM_SIMP_TAC[AZIM_EQ_0_PI_IMP_COPLANAR]);
2688 (ASM_REAL_ARITH_TAC);
2689 (UP_ASM_TAC THEN REWRITE_TAC[] THEN MATCH_MP_TAC REAL_POW_NZ);
2690 (ASM_REAL_ARITH_TAC)]);;
2692 (* ==================================================================== *)
2695 let CONIC_CAP_AFF_GT_EQ_0 =prove_by_refinement (
2696 `!v0 v1 a r w1 w2. a < &1 /\ &0 < r /\
2697 vol (conic_cap v0 v1 r a INTER aff_gt {v0, v1} {w1, w2}) = &0 ==>
2698 coplanar {v0,v1,w1, w2:real^3}`,
2699 [(REPEAT STRIP_TAC);
2700 (MATCH_MP_TAC (MESON[] `(~A==> F) ==> A`) THEN STRIP_TAC);
2701 (NEW_GOAL `~collinear {v0, v1, w1:real^3}`);
2702 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
2703 (EXISTS_TAC `w2:real^3` THEN ASM_REWRITE_TAC[]);
2704 (NEW_GOAL `~collinear {v0, v1, w2:real^3}`);
2705 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
2706 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`] THEN
2707 EXISTS_TAC `w1:real^3` THEN ASM_REWRITE_TAC[]);
2708 (ASM_CASES_TAC `azim v0 v1 w1 (w2:real^3) < pi`);
2709 (NEW_GOAL `wedge v0 v1 w1 w2 = aff_gt {v0, v1} {w1, w2:real^3}`);
2710 (ASM_MESON_TAC[WEDGE_LUNE]);
2711 (ASM_MESON_TAC[ CONIC_CAP_WEDGE_EQ_0]);
2713 (ASM_CASES_TAC `azim v0 v1 w1 (w2:real^3) > pi`);
2714 (NEW_GOAL `azim v0 v1 w2 (w1:real^3) =
2715 (if azim v0 v1 w1 w2 = &0 then &0 else &2 * pi - azim v0 v1 w1 w2)`);
2716 (MATCH_MP_TAC AZIM_COMPL);
2717 (ASM_REWRITE_TAC[]);
2718 (UP_ASM_TAC THEN COND_CASES_TAC);
2719 (UNDISCH_TAC `azim v0 v1 w1 (w2:real^3) > pi` THEN ASM_REWRITE_TAC[]);
2720 (MESON_TAC[PI_POS_LE; REAL_ARITH `&0 > a <=> ~(&0 <= a)`]);
2722 (NEW_GOAL `azim v0 v1 w2 (w1:real^3) < pi`);
2723 (ASM_REAL_ARITH_TAC);
2725 (NEW_GOAL `wedge v0 v1 w2 w1 = aff_gt {v0, v1} {w1, w2:real^3}`);
2726 (REWRITE_WITH `{w1, w2:real^3} = {w2, w1}`);
2729 (UNDISCH_TAC `~coplanar {v0, v1, w1, w2:real^3}`);
2731 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
2732 (ASM_MESON_TAC[WEDGE_LUNE]);
2734 (UNDISCH_TAC `~coplanar {v0, v1, w1, w2:real^3}`);
2736 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
2737 (ASM_MESON_TAC[ CONIC_CAP_WEDGE_EQ_0]);
2739 (NEW_GOAL `azim v0 v1 w1 (w2:real^3) = pi`);
2740 (ASM_REAL_ARITH_TAC);
2741 (ASM_MESON_TAC[AZIM_EQ_0_PI_IMP_COPLANAR])]);;
2743 (* ==================================================================== *)
2746 let CONIC_CAP_INTER_CONVEX_HULL_4_GT_0 = prove_by_refinement (
2747 `!u0:real^3 u1 w1 w2 r a.
2748 &0 < r /\ a < &1 /\ &0 <= a /\ ~coplanar {u0, u1, w1, w2} ==>
2749 vol (conic_cap u0 u1 r a INTER convex hull {u0, u1, w1, w2}) > &0`,
2750 [(REPEAT STRIP_TAC);
2751 (NEW_GOAL `measurable
2752 (conic_cap u0 u1 r a INTER convex hull {u0, u1, w1, w2:real^3})`);
2753 (MATCH_MP_TAC MEASURABLE_INTER);
2754 (REWRITE_TAC[MEASURABLE_CONIC_CAP; MEASURABLE_CONVEX_HULL]);
2755 (SIMP_TAC[MEASURABLE_CONVEX_HULL;FINITE_IMP_BOUNDED;Geomdetail.FINITE6]);
2756 (REWRITE_TAC[REAL_ARITH `a > &0 <=> &0 <= a /\ ~(a = &0)`]);
2757 (ASM_SIMP_TAC[MEASURE_POS_LE]);
2759 `vol (conic_cap u0 u1 r a INTER convex hull {u0, u1, w1, w2}) = &0 <=>
2760 NULLSET (conic_cap u0 u1 r a INTER convex hull {u0, u1, w1, w2})`);
2761 (ASM_SIMP_TAC[MEASURABLE_MEASURE_EQ_0]);
2764 (NEW_GOAL `~(u0 = u1:real^3)`);
2766 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}` THEN REWRITE_TAC[]);
2767 (REWRITE_WITH `{u0, u1, w1, w2} = {u1:real^3, w1, w2}`);
2769 (ASM_REWRITE_TAC[COPLANAR_3]);
2771 (NEW_GOAL `?r1 a1. &0 < r1 /\ a1 < &1 /\
2772 conic_cap u0 u1 r1 a1 INTER aff_ge {u0, u1} {w1, w2:real^3} =
2773 conic_cap u0 u1 r1 a1 INTER convex hull {u0, u1,w1, w2} /\
2774 conic_cap u0 u1 r1 a1 SUBSET conic_cap u0 u1 r a`);
2775 (ABBREV_TAC `s = closest_point (affine hull {u1, w1, w2:real^3}) u0`);
2776 (ABBREV_TAC `r2 = dist (u0:real^3, s)`);
2777 (ABBREV_TAC `r1 = min r2 r`);
2778 (ABBREV_TAC `s2 = smallest_angle_line w1 (w2:real^3) u0 u1`);
2780 `a2 = ((s2 - u0:real^3) dot (u1 - u0)) /(norm (s2 - u0) * norm (u1 - u0))`);
2781 (ABBREV_TAC `a1 = max a2 a`);
2782 (EXISTS_TAC `r1:real` THEN EXISTS_TAC `a1:real`);
2783 (NEW_GOAL `&0 < r1 /\ a1 < &1`);
2784 (EXPAND_TAC "r1" THEN EXPAND_TAC "a1");
2785 (REWRITE_TAC[REAL_ARITH `&0 < min a b <=> &0 < a /\ &0 < b`;
2786 REAL_ARITH `max a b < &1 <=> a < &1 /\ b < &1`;]);
2787 (ASM_REWRITE_TAC[]);
2790 (MATCH_MP_TAC DIST_POS_LT);
2793 (NEW_GOAL `u0 IN affine hull {u1, w1, w2:real^3}`);
2794 (ASM_REWRITE_TAC[]);
2795 (DEL_TAC THEN EXPAND_TAC "s");
2796 (MATCH_MP_TAC CLOSEST_POINT_IN_SET);
2797 (REWRITE_TAC[CLOSED_AFFINE_HULL; AFFINE_HULL_EQ_EMPTY] THEN SET_TAC[]);
2798 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
2800 (ONCE_REWRITE_TAC[GSYM COPLANAR_AFFINE_HULL_COPLANAR]);
2801 (REWRITE_WITH `affine hull {u0, u1, w1, w2} =
2802 affine hull {u1:real^3, w1, w2}`);
2803 (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
2804 (ASM_REWRITE_TAC[]);
2805 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR; COPLANAR_3]);
2808 (MATCH_MP_TAC REAL_DIV_LT_1_TACTICS);
2810 (NEW_GOAL `s2 IN convex hull {w1, w2:real^3}`);
2811 (MATCH_MP_TAC SMALLEST_ANGLE_IN_CONVEX_HULL);
2812 (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);
2813 (ASM_REWRITE_TAC[]);
2815 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
2817 (ONCE_REWRITE_TAC[GSYM COPLANAR_AFFINE_HULL_COPLANAR]);
2818 (REWRITE_WITH `affine hull {u0, u1, w1, w2} =
2819 affine hull {u1:real^3, w1, w2}`);
2820 (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
2821 (NEW_GOAL `convex hull {w1, w2} SUBSET affine hull {u1, w1, w2:real^3}`);
2822 (NEW_GOAL `convex hull {w1, w2} SUBSET affine hull {w1, w2:real^3}`);
2823 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2824 (NEW_GOAL `affine hull {w1, w2} SUBSET affine hull {u1, w1, w2:real^3}`);
2825 (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);
2829 (REWRITE_TAC[COPLANAR_3; COPLANAR_AFFINE_HULL_COPLANAR]);
2831 (NEW_GOAL `~(s2 = u0:real^3)`);
2833 (UNDISCH_TAC `s2 IN convex hull {w1, w2:real^3}` THEN ASM_REWRITE_TAC[]);
2835 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
2837 (ONCE_REWRITE_TAC[GSYM COPLANAR_AFFINE_HULL_COPLANAR]);
2838 (REWRITE_WITH `affine hull {u0, u1, w1, w2} =
2839 affine hull {u1:real^3, w1, w2}`);
2840 (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
2841 (NEW_GOAL `convex hull {w1, w2} SUBSET affine hull {u1, w1, w2:real^3}`);
2842 (NEW_GOAL `convex hull {w1, w2} SUBSET affine hull {w1, w2:real^3}`);
2843 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2844 (NEW_GOAL `affine hull {w1, w2} SUBSET affine hull {u1, w1, w2:real^3}`);
2845 (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);
2849 (REWRITE_TAC[COPLANAR_3; COPLANAR_AFFINE_HULL_COPLANAR]);
2852 (MATCH_MP_TAC REAL_LT_MUL);
2853 (ASM_REWRITE_TAC[NORM_POS_LT; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
2855 (REWRITE_TAC[REAL_ARITH `a < b <=> (a <= b) /\ ~(a = b)`]);
2857 (REWRITE_TAC[NORM_CAUCHY_SCHWARZ]);
2858 (REWRITE_TAC[NORM_CAUCHY_SCHWARZ_EQ]);
2862 (ABBREV_TAC `t1 = norm (s2 - u0:real^3)`);
2863 (ABBREV_TAC `t2 = norm (u1 - u0:real^3)`);
2864 (NEW_GOAL `~(t2 = &0)`);
2865 (EXPAND_TAC "t2" THEN REWRITE_TAC[NORM_EQ_0;
2866 VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
2867 (ASM_REWRITE_TAC[]);
2869 (NEW_GOAL `s2 = t1 / t2 % u1 + (t2 - t1) / t2 % u0:real^3`);
2870 (REWRITE_TAC[VECTOR_ARITH `t1 / t2 % u1 + (t2 - t1) / t2 % u0:real^3 =
2871 &1 / t2 % (t1 % u1 + (t2 - t1) % u0)`]);
2872 (REWRITE_WITH `t1 % u1 + (t2 - t1) % u0 = t2 % (s2:real^3)`);
2873 (UNDISCH_TAC `t1 % (u1 - u0) = t2 % (s2 - u0:real^3)` THEN VECTOR_ARITH_TAC);
2874 (REWRITE_TAC[VECTOR_ARITH `&1 / t2 % t2 % s2 = (t2 / t2) % s2`]);
2875 (REWRITE_WITH `t2 / t2 = &1`);
2876 (ASM_SIMP_TAC[REAL_DIV_REFL]);
2878 (UNDISCH_TAC `s2 IN convex hull {w1, w2:real^3}`);
2879 (ASM_REWRITE_TAC[IN; CONVEX_HULL_2; IN_ELIM_THM]);
2881 (ABBREV_TAC `t = t1 / t2`);
2882 (ABBREV_TAC `t' = (t1 - t2) / t2`);
2884 (NEW_GOAL `u1 IN affine hull {u0, w1, w2:real^3}`);
2885 (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2886 (EXISTS_TAC `t'/ t` THEN EXISTS_TAC `u / t` THEN EXISTS_TAC `v / t`);
2888 (ASM_REWRITE_TAC[REAL_ARITH `a / t + b/ t + c / t = (a + b + c) / t `]);
2889 (REWRITE_WITH `t' + &1 = t`);
2890 (EXPAND_TAC "t'" THEN EXPAND_TAC "t");
2891 (NEW_GOAL `t2 / t2 = &1`);
2892 (ASM_SIMP_TAC[REAL_DIV_REFL]);
2893 (UP_ASM_TAC THEN REAL_ARITH_TAC);
2894 (MATCH_MP_TAC REAL_DIV_REFL);
2896 (ONCE_REWRITE_TAC[REAL_ARITH `a / b = a * (&1 / b)`]);
2897 (REWRITE_TAC[REAL_ENTIRE]);
2898 (REWRITE_WITH `~(t1 = &0)`);
2899 (EXPAND_TAC "t1" THEN REWRITE_TAC[NORM_EQ_0; VECTOR_ARITH
2900 `a - b = vec 0 <=> a = b`] THEN ASM_REWRITE_TAC[]);
2901 (MATCH_MP_TAC Trigonometry2.NOT_EQ0_IMP_NEITHER_INVERT);
2902 (ASM_REWRITE_TAC[]);
2903 (REWRITE_TAC[VECTOR_ARITH `t' / t % u0 + u / t % w1 + v / t % w2 =
2904 &1 / t % (t' % u0 + u % w1 + v % w2)`]);
2905 (REWRITE_WITH `t' % u0 + u % w1 + v % w2 = t % u1:real^3`);
2907 (UNDISCH_TAC `t % u1 + (t2 - t1) / t2 % u0 = u % w1 + v % w2:real^3`
2908 THEN VECTOR_ARITH_TAC);
2909 (REWRITE_TAC[VECTOR_ARITH `&1 / t % t % u = t / t % u`]);
2910 (REWRITE_WITH `t / t = &1`);
2911 (MATCH_MP_TAC REAL_DIV_REFL);
2913 (ONCE_REWRITE_TAC[REAL_ARITH `a / b = a * (&1 / b)`]);
2914 (REWRITE_TAC[REAL_ENTIRE]);
2915 (REWRITE_WITH `~(t1 = &0)`);
2916 (EXPAND_TAC "t1" THEN REWRITE_TAC[NORM_EQ_0; VECTOR_ARITH
2917 `a - b = vec 0 <=> a = b`] THEN ASM_REWRITE_TAC[]);
2918 (MATCH_MP_TAC Trigonometry2.NOT_EQ0_IMP_NEITHER_INVERT);
2919 (ASM_REWRITE_TAC[]);
2922 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
2924 (ONCE_REWRITE_TAC[GSYM COPLANAR_AFFINE_HULL_COPLANAR]);
2925 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {b,a,c,d}`]);
2927 (REWRITE_WITH `affine hull {u1, u0, w1, w2} =
2928 affine hull {u0:real^3, w1, w2}`);
2929 (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
2930 (ASM_REWRITE_TAC[]);
2931 (REWRITE_TAC[COPLANAR_3; COPLANAR_AFFINE_HULL_COPLANAR]);
2933 (NEW_GOAL `conic_cap (u0:real^3) u1 r1 a1 SUBSET conic_cap u0 u1 r a`);
2934 (REWRITE_TAC[conic_cap; NORMBALL_BALL] THEN MATCH_MP_TAC
2935 (SET_RULE `a SUBSET b /\ c SUBSET d ==> a INTER c SUBSET b INTER d`));
2937 (MATCH_MP_TAC SUBSET_BALL);
2938 (EXPAND_TAC "r1" THEN REAL_ARITH_TAC);
2939 (MATCH_MP_TAC RCONE_GT_SUBSET);
2940 (EXPAND_TAC "a1" THEN REAL_ARITH_TAC);
2942 (ASM_REWRITE_TAC[]);
2944 (REWRITE_TAC[SET_RULE `b = a <=> a SUBSET b /\ b SUBSET a`]);
2946 (MATCH_MP_TAC (SET_RULE `a SUBSET b ==> x INTER a SUBSET x INTER b`));
2947 (REWRITE_TAC[Marchal_cells_2_new.CONVEX_HULL_4_SUBSET_AFF_GE_2_2]);
2948 (REWRITE_TAC[SUBSET; IN_INTER]);
2950 (ASM_REWRITE_TAC[]);
2953 (NEW_GOAL `DISJOINT {u0, u1:real^3} {w1, w2}`);
2954 (REWRITE_TAC[DISJOINT]);
2955 (ASM_CASES_TAC `w1 IN {u0, u1:real^3}`);
2957 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
2958 (REWRITE_WITH `{u0, u1, w1, w2:real^3} = {u0, u1, w2:real^3}`);
2959 (UP_ASM_TAC THEN SET_TAC[]);
2960 (REWRITE_TAC[COPLANAR_3]);
2961 (UP_ASM_TAC THEN SET_TAC[]);
2962 (ASM_CASES_TAC `w2 IN {u0, u1:real^3}`);
2964 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
2965 (REWRITE_WITH `{u0, u1, w1, w2:real^3} = {u0, u1, w1:real^3}`);
2966 (UP_ASM_TAC THEN SET_TAC[]);
2967 (REWRITE_TAC[COPLANAR_3]);
2968 (UP_ASM_TAC THEN SET_TAC[]);
2971 (ASM_SIMP_TAC[Marchal_cells_2.AFF_GE_2_2; CONVEX_HULL_4; IN; IN_ELIM_THM]);
2973 (EXISTS_TAC `t1:real` THEN EXISTS_TAC `t2:real` THEN
2974 EXISTS_TAC `t3:real` THEN EXISTS_TAC `t4:real`);
2975 (ASM_REWRITE_TAC[]);
2978 (REWRITE_TAC[REAL_ARITH `&0 <= t <=> ~(t < &0)`] THEN STRIP_TAC);
2979 (NEW_GOAL `!x. x IN affine hull {u1, w1, w2} ==>
2980 dist (u0,s:real^3) <= dist (u0,x:real^3)`);
2981 (REPEAT STRIP_TAC THEN EXPAND_TAC "s");
2982 (MATCH_MP_TAC CLOSEST_POINT_LE);
2983 (ASM_REWRITE_TAC[CLOSED_AFFINE_HULL]);
2985 (NEW_GOAL `&1 < t2 + t3+ t4`);
2986 (ASM_REAL_ARITH_TAC);
2987 (NEW_GOAL `~(t2 + t3+ t4 = &0)`);
2988 (ASM_REAL_ARITH_TAC);
2990 (ABBREV_TAC `y = t2 / (t2 + t3 + t4) % u1 + t3 / (t2 + t3 + t4) % w1 +
2991 t4 / (t2 + t3 + t4) % w2:real^3`);
2992 (NEW_GOAL `x = t1 % u0 + (t2 + t3 + t4) % (y:real^3)`);
2993 (ASM_REWRITE_TAC[] THEN EXPAND_TAC "y");
2994 (REWRITE_TAC[VECTOR_ARITH
2995 `t1 % u0 + t2 % u1 + t3 % w1 + t4 % w2 =
2996 t1 % u0 + t % (t2 / t % u1 + t3 / t % w1 + t4 / t % w2) <=>
2997 t2 % u1 + t3 % w1 + t4 % w2 = t / t % (t2 % u1 + t3 % w1 + t4 % w2)`]);
2998 (REWRITE_WITH `(t2 + t3 + t4) / (t2 + t3 + t4) = &1`);
2999 (ASM_SIMP_TAC[REAL_DIV_REFL]);
3002 (NEW_GOAL `y IN affine hull {u1, w1, w2:real^3}`);
3003 (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
3004 (EXISTS_TAC `t2 / (t2 + t3 + t4)` THEN
3005 EXISTS_TAC `t3 / (t2 + t3 + t4)` THEN EXISTS_TAC `t4 / (t2 + t3 + t4)`);
3006 (ASM_REWRITE_TAC[REAL_ARITH `a/x + b/ x + c/ x = (a+b+c) / x`]);
3007 (ASM_SIMP_TAC[REAL_DIV_REFL]);
3009 (NEW_GOAL `dist (u0, s:real^3) <= dist (u0, y:real^3)`);
3011 (NEW_GOAL `dist (u0, s) <= dist (u0, x:real^3)`);
3012 (REWRITE_TAC[ASSUME `x = t1 % u0 + (t2 + t3 + t4) % y:real^3`; dist]);
3013 (REWRITE_WITH `u0 - (t1 % u0 + (t2 + t3 + t4) % y) =
3014 (t1 + t2 + t3 + t4) % u0 - (t1 % u0 + (t2 + t3 + t4) % y:real^3)`);
3015 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
3016 (REWRITE_TAC[VECTOR_ARITH
3017 `(t1 + t) % u0 - (t1 % u0 + t % y) = t % (u0 - y)`; NORM_MUL]);
3018 (REWRITE_WITH `abs (t2 + t3 + t4) = t2 + t3 + t4`);
3019 (REWRITE_TAC[REAL_ABS_REFL] THEN ASM_REAL_ARITH_TAC);
3020 (REWRITE_TAC[GSYM dist]);
3021 (NEW_GOAL `dist (u0, y:real^3) <= (t2 + t3 + t4) * dist (u0, y)`);
3022 (REWRITE_TAC[REAL_ARITH `a <= b * a <=> &0 <= (b - &1) * a`]);
3023 (MATCH_MP_TAC REAL_LE_MUL);
3024 (REWRITE_TAC[DIST_POS_LE]);
3025 (ASM_REAL_ARITH_TAC);
3026 (ASM_REAL_ARITH_TAC);
3028 (NEW_GOAL `x IN ball (u0:real^3, r1)`);
3029 (UNDISCH_TAC `x IN conic_cap u0 (u1:real^3) r1 a1`);
3030 (REWRITE_TAC[conic_cap; NORMBALL_BALL] THEN SET_TAC[]);
3031 (UP_ASM_TAC THEN REWRITE_TAC[IN_BALL]);
3032 (EXPAND_TAC "r1" THEN EXPAND_TAC "r2");
3033 (UP_ASM_TAC THEN REAL_ARITH_TAC);
3036 (* ========================================================================= *)
3039 (REWRITE_TAC[REAL_ARITH `&0 <= t <=> ~(t < &0)`] THEN STRIP_TAC);
3040 (NEW_GOAL `!y. y IN convex hull {w1, w2:real^3}
3041 ==> ((y - u0) dot (u1 - u0)) / (norm (y - u0) * norm (u1 - u0)) <=
3042 ((s2 - u0) dot (u1 - u0)) / (norm (s2 - u0) * norm (u1 - u0))`);
3044 (MATCH_MP_TAC SMALLEST_ANGLE_LINE_PROPERTY);
3045 (EXISTS_TAC `w1:real^3` THEN EXISTS_TAC `w2:real^3`);
3046 (ASM_REWRITE_TAC[]);
3049 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
3051 (ONCE_REWRITE_TAC[GSYM COPLANAR_AFFINE_HULL_COPLANAR]);
3052 (REWRITE_WITH `affine hull {u0, u1, w1, w2} =
3053 affine hull {u1:real^3, w1, w2}`);
3054 (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
3055 (NEW_GOAL `convex hull {w1, w2:real^3} SUBSET affine hull {u1,w1, w2}`);
3056 (NEW_GOAL `convex hull {w1, w2:real^3} SUBSET affine hull {w1, w2}`);
3057 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
3058 (NEW_GOAL `affine hull {w1, w2:real^3} SUBSET affine hull {u1,w1, w2}`);
3059 (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA THEN SET_TAC[]);
3062 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR; COPLANAR_3]);
3064 (NEW_GOAL `~(t3+ t4 = &0)`);
3066 (NEW_GOAL `t3 = &0 /\ t4 = &0`);
3067 (ASM_REAL_ARITH_TAC);
3069 (NEW_GOAL `x = t1 % u0 + t2 % u1:real^3`);
3070 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
3071 (NEW_GOAL `x:real^3 IN rcone_gt u0 u1 a1`);
3072 (UNDISCH_TAC `x:real^3 IN conic_cap u0 u1 r1 a1`);
3073 (REWRITE_TAC[conic_cap] THEN SET_TAC[conic_cap]);
3074 (UP_ASM_TAC THEN REWRITE_TAC[rcone_gt; rconesgn; IN; IN_ELIM_THM] THEN STRIP_TAC);
3076 (NEW_GOAL `(x - u0) dot (u1 - u0:real^3) <= &0`);
3077 (REWRITE_TAC[ASSUME `x = t1 % u0 + t2 % u1:real^3`]);
3078 (REWRITE_WITH `(t1 % u0 + t2 % u1) - u0 =
3079 (t1 % u0 + t2 % u1) - (t1 + t2 + t3 + t4) % u0:real^3`);
3080 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
3081 (REWRITE_TAC[ASSUME `t3 = &0 /\ t4 = &0`; VECTOR_ARITH
3082 `(t1 % u0 + t2 % u1) - (t1 + t2 + &0 + &0) % u0 = t2 % (u1 - u0)`; DOT_LMUL;
3083 REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);
3084 (MATCH_MP_TAC REAL_LE_MUL);
3085 (REWRITE_TAC[DOT_POS_LE] THEN ASM_REAL_ARITH_TAC);
3086 (NEW_GOAL `&0 <= dist (x,u0) * dist (u1,u0:real^3) * a1`);
3087 (MATCH_MP_TAC REAL_LE_MUL);
3088 (REWRITE_TAC[DIST_POS_LE]);
3089 (MATCH_MP_TAC REAL_LE_MUL);
3090 (REWRITE_TAC[DIST_POS_LE]);
3091 (ASM_REAL_ARITH_TAC);
3092 (ASM_REAL_ARITH_TAC);
3094 (ABBREV_TAC `y = t3 / (t3 + t4) % w1 + t4 / (t3 + t4) % w2:real^3`);
3095 (NEW_GOAL `x = t1 % u0 + t2 % u1 + (t3 + t4) % (y:real^3)`);
3096 (ASM_REWRITE_TAC[] THEN EXPAND_TAC "y");
3097 (REWRITE_TAC[VECTOR_ARITH
3098 `t1 % u0 + t2 % u1 + t3 % w1 + t4 % w2 =
3099 t1 % u0 + t2 % u1 + t % (t3 / t % w1 + t4 / t % w2) <=>
3100 t3 % w1 + t4 % w2 = t / t % (t3 % w1 + t4 % w2)`]);
3101 (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
3102 (ASM_SIMP_TAC[REAL_DIV_REFL]);
3105 (NEW_GOAL `y IN convex hull {w1, w2:real^3}`);
3106 (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM]);
3107 (EXISTS_TAC `t3 / (t3 + t4)` THEN EXISTS_TAC `t4 / (t3 + t4)`);
3108 (ASM_REWRITE_TAC[REAL_ARITH `a / x + b / x = (a + b) / x`]);
3110 (MATCH_MP_TAC REAL_LE_DIV);
3111 (ASM_REAL_ARITH_TAC);
3112 (MATCH_MP_TAC REAL_LE_DIV);
3113 (ASM_REAL_ARITH_TAC);
3114 (ASM_SIMP_TAC[REAL_DIV_REFL]);
3116 (ABBREV_TAC `f = (\y:real^3.
3117 ((y - u0) dot (u1 - u0)) / (norm (y - u0:real^3) * norm (u1 - u0)))`);
3119 (NEW_GOAL `a1 < (f:real^3->real) x`);
3120 (NEW_GOAL `x:real^3 IN rcone_gt u0 u1 a1`);
3121 (UNDISCH_TAC `x:real^3 IN conic_cap u0 u1 r1 a1` THEN
3122 REWRITE_TAC[conic_cap] THEN SET_TAC[]);
3123 (UP_ASM_TAC THEN REWRITE_TAC[rcone_gt; rconesgn; IN; IN_ELIM_THM; dist]);
3124 (STRIP_TAC THEN EXPAND_TAC "f");
3126 `a1 < ((x - u0) dot (u1 - u0)) / (norm (x - u0) * norm (u1 - u0)) <=>
3127 a1 * (norm (x - u0) * norm (u1 - u0)) < ((x - u0:real^3) dot (u1 - u0))`);
3128 (MATCH_MP_TAC REAL_LT_RDIV_EQ);
3129 (MATCH_MP_TAC REAL_LT_MUL);
3130 (REWRITE_TAC[NORM_POS_LE; REAL_ARITH `a < b <=> (a <= b) /\ ~(b = a)`]);
3131 (SIMP_TAC[NORM_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
3132 (ASM_REWRITE_TAC[]);
3134 (NEW_GOAL `u1 IN affine hull {u0, w1, w2:real^3}`);
3135 (REWRITE_TAC[IN; IN_ELIM_THM; AFFINE_HULL_3]);
3137 (EXISTS_TAC `(t2 + t3 + t4) / t2` THEN EXISTS_TAC `(--t3) / t2`
3138 THEN EXISTS_TAC `(--t4) / t2`);
3140 (REWRITE_TAC[REAL_ARITH
3141 `(t2 + t3 + t4) / t2 + --t3 / t2 + --t4 / t2 = t2 / t2`]);
3142 (MATCH_MP_TAC REAL_DIV_REFL);
3143 (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
3144 (REWRITE_WITH `(t2 + t3 + t4) = &1 - t1`);
3145 (UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
3146 (NEW_GOAL `u0 - t1 % u0 - t3 % w1 - t4 % w2:real^3 = t2 % u1`);
3147 (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
3148 (ASM_REWRITE_TAC[VECTOR_ARITH
3149 `(&1 - t1) / t2 % u0 + --t3 / t2 % u2 + --t4 / t2 % u3 =
3150 (&1 / t2) % (u0 - t1 % u0 - t3 % u2 - t4 % u3)`]);
3151 (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
3152 (REWRITE_WITH `t2 / t2 = &1`);
3153 (MATCH_MP_TAC REAL_DIV_REFL);
3154 (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
3157 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
3159 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {b,a,c,d}`]);
3160 (ONCE_REWRITE_TAC[GSYM COPLANAR_AFFINE_HULL_COPLANAR]);
3161 (REWRITE_WITH `affine hull {u1, u0, w1, w2} =
3162 affine hull {u0:real^3, w1, w2}`);
3163 (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
3164 (ASM_REWRITE_TAC[]);
3165 (REWRITE_TAC[COPLANAR_3; COPLANAR_AFFINE_HULL_COPLANAR]);
3166 (UP_ASM_TAC THEN REAL_ARITH_TAC);
3168 (NEW_GOAL `(f:real^3->real) y <= f s2`);
3172 (NEW_GOAL `&1 < t1 + t3+ t4`);
3173 (ASM_REAL_ARITH_TAC);
3174 (NEW_GOAL `~(t1 + t3+ t4 = &0)`);
3175 (ASM_REAL_ARITH_TAC);
3177 (ABBREV_TAC `w = t1 / (t1 + t3 + t4) % u0 + t3 / (t1 + t3 + t4) % w1 +
3178 t4 / (t1 + t3 + t4) % w2:real^3`);
3180 (NEW_GOAL `(f:real^3->real) y = f w`);
3183 (REWRITE_WITH `y:real^3 - u0 =
3184 &1 / (t3 + t4) % (t3 % w1 + t4 % w2 - (t3 + t4) % u0)`);
3186 (REWRITE_TAC[VECTOR_ARITH
3187 `(t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3) - u0 =
3188 &1 / (t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0) <=>
3189 (t3 + t4) / (t3 + t4) % u0 = u0`]);
3190 (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
3191 (MATCH_MP_TAC REAL_DIV_REFL);
3192 (ASM_REWRITE_TAC[]);
3194 (REWRITE_TAC[NORM_MUL; DOT_LMUL]);
3196 (REWRITE_WITH `w:real^3 - u0 =
3197 &1 / (t1 + t3 + t4) % (t3 % w1 + t4 % w2 - (t3 + t4) % u0)`);
3199 (REWRITE_TAC[VECTOR_ARITH
3200 `(t1 / (t1 + t3 + t4) % u0 +
3201 t3 / (t1 + t3 + t4) % u2 + t4 / (t1 + t3 + t4) % u3) - u0 =
3202 &1 / (t1 + t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0) <=>
3203 (t1 + t3 + t4) / (t1 + t3 + t4) % u0 = u0`]);
3204 (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
3205 (MATCH_MP_TAC REAL_DIV_REFL);
3206 (ASM_REWRITE_TAC[]);
3208 (REWRITE_TAC[NORM_MUL; DOT_LMUL]);
3209 (REWRITE_WITH `abs (&1 / (t3 + t4)) = &1 / (t3 + t4)`);
3210 (REWRITE_TAC[REAL_ABS_REFL]);
3211 (ASM_SIMP_TAC[REAL_LE_DIV;REAL_LE_ADD; REAL_ARITH `&0 <= &1`]);
3212 (REWRITE_WITH `abs (&1 / (t1 + t3 + t4)) = &1 / (t1 + t3 + t4)`);
3213 (REWRITE_TAC[REAL_ABS_REFL]);
3214 (MATCH_MP_TAC REAL_LE_DIV THEN REWRITE_TAC[REAL_ARITH `&0 <= &1`]);
3215 (ASM_REAL_ARITH_TAC);
3217 (REWRITE_TAC[REAL_ARITH `(a * x) / ((a * y) * z) =
3218 (a * x) / (a * (y * z))`]);
3220 `b1 = norm (t3 % w1 + t4 % w2 - (t3 + t4) % u0) * norm (u1 - u0:real^3)`);
3221 (NEW_GOAL `~(b1 = &0)`);
3222 (EXPAND_TAC "b1" THEN ASM_REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0;
3223 VECTOR_ARITH `(a - b = vec 0 <=> a = b)/\(a + b-c = vec 0 <=> a + b = c)`]);
3226 (NEW_GOAL `u0 IN convex hull {w1, w2:real^3}`);
3227 (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM]);
3228 (EXISTS_TAC `t3 / (t3 + t4)` THEN EXISTS_TAC `t4 / (t3 + t4)`);
3230 (MATCH_MP_TAC REAL_LE_DIV THEN ASM_REAL_ARITH_TAC);
3231 (MATCH_MP_TAC REAL_LE_DIV THEN ASM_REAL_ARITH_TAC);
3232 (ASM_SIMP_TAC[REAL_DIV_REFL; REAL_ARITH `a / x + b / x = (a + b) / x`]);
3233 (SIMP_TAC[VECTOR_ARITH `a/ x % u + b/ x % v = &1/ x % (a % u + b % v)`]);
3234 (REWRITE_TAC[ASSUME `t3 % w1 + t4 % w2 = (t3 + t4) % u0:real^3`; VECTOR_ARITH
3235 `&1 / a % (a % b) = (a / a) % b`]);
3236 (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
3237 (ASM_SIMP_TAC[REAL_DIV_REFL]);
3240 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
3242 (ONCE_REWRITE_TAC[GSYM COPLANAR_AFFINE_HULL_COPLANAR]);
3243 (REWRITE_WITH `affine hull {u0, u1, w1, w2} =
3244 affine hull {u1:real^3, w1, w2}`);
3245 (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
3246 (NEW_GOAL `convex hull {w1, w2:real^3} SUBSET affine hull {u1,w1, w2}`);
3247 (NEW_GOAL `convex hull {w1, w2:real^3} SUBSET affine hull {w1, w2}`);
3248 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
3249 (NEW_GOAL `affine hull {w1, w2:real^3} SUBSET affine hull {u1,w1, w2}`);
3250 (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA THEN SET_TAC[]);
3253 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR; COPLANAR_3]);
3255 (NEW_GOAL `~(&1 / (t3 + t4) = &0)`);
3256 (MATCH_MP_TAC Trigonometry2.NOT_EQ0_IMP_NEITHER_INVERT);
3257 (ASM_REWRITE_TAC[]);
3260 `(&1 / (t3 + t4) * ((t3 % w1 + t4 % w2 - (t3 + t4) % u0) dot (u1 - u0))) /
3261 (&1 / (t3 + t4) * b1) =
3262 ((t3 % w1 + t4 % w2 - (t3 + t4) % u0) dot (u1 - u0:real^3)) / b1`);
3263 (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[Trigonometry1.REAL_DIV_MUL2]);
3265 (NEW_GOAL `~(&1 / (t1 + t3 + t4) = &0)`);
3266 (MATCH_MP_TAC Trigonometry2.NOT_EQ0_IMP_NEITHER_INVERT);
3267 (ASM_REWRITE_TAC[]);
3270 `(&1 / (t1 + t3 + t4) * ((t3 % w1 + t4 % w2 - (t3 + t4) % u0) dot (u1 - u0))) /
3271 (&1 / (t1 + t3 + t4) * b1) =
3272 ((t3 % w1 + t4 % w2 - (t3 + t4) % u0) dot (u1 - u0:real^3)) / b1`);
3273 (UP_ASM_TAC THEN UNDISCH_TAC `~(b1 = &0)` THEN
3274 MESON_TAC[Trigonometry1.REAL_DIV_MUL2]);
3276 (NEW_GOAL `(f:real^3->real) x <= f w`);
3280 `((x - u0) dot (u1 - u0:real^3)) / (norm (x - u0) * norm (u1 - u0)) <=
3281 ((w - u0) dot (u1 - u0)) / (norm (w - u0) * norm (u1 - u0)) <=>
3282 ((x - u0) dot (u1 - u0)) * (norm (w - u0) * norm (u1 - u0)) <=
3283 ((w - u0) dot (u1 - u0)) * (norm (x - u0) * norm (u1 - u0))`);
3284 (MATCH_MP_TAC RAT_LEMMA4);
3286 (MATCH_MP_TAC REAL_LT_MUL);
3287 (ASM_REWRITE_TAC[NORM_POS_LT; VECTOR_ARITH `x - b = vec 0 <=> x = b`]);
3290 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}` THEN REWRITE_TAC[]);
3291 (REWRITE_TAC[coplanar]);
3292 (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `w1:real^3` THEN
3293 EXISTS_TAC `w2:real^3`);
3294 (ONCE_REWRITE_TAC[SET_RULE `{u0, u1, u2, u3} = {u1, u0, u2, u3}`]);
3295 (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
3296 (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
3297 (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
3298 (EXISTS_TAC `(t2 + t3 + t4) / t2` THEN EXISTS_TAC `(--t3) / t2`
3299 THEN EXISTS_TAC `(--t4) / t2`);
3301 (REWRITE_TAC[REAL_ARITH
3302 `(t2 + t3 + t4) / t2 + --t3 / t2 + --t4 / t2 = t2 / t2`]);
3303 (MATCH_MP_TAC REAL_DIV_REFL);
3304 (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
3305 (REWRITE_WITH `(t2 + t3 + t4) = &1 - t1`);
3306 (UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
3307 (NEW_GOAL `u0 - t1 % u0 - t3 % w1 - t4 % w2:real^3 = t2 % u1`);
3308 (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
3309 (ASM_REWRITE_TAC[VECTOR_ARITH
3310 `(&1 - t1) / t2 % u0 + --t3 / t2 % u2 + --t4 / t2 % u3 =
3311 (&1 / t2) % (u0 - t1 % u0 - t3 % u2 - t4 % u3)`]);
3312 (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
3313 (REWRITE_WITH `t2 / t2 = &1`);
3314 (MATCH_MP_TAC REAL_DIV_REFL);
3315 (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
3318 (MATCH_MP_TAC REAL_LT_MUL);
3319 (REWRITE_TAC[REAL_ARITH `&0 < a <=> (&0 <= a) /\ ~(a = &0)`]);
3320 (REWRITE_TAC[NORM_POS_LE; NORM_EQ_0; VECTOR_ARITH `x - y= vec 0 <=>x = y`]);
3323 (EXPAND_TAC "w" THEN STRIP_TAC);
3324 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
3325 (REWRITE_TAC[coplanar]);
3326 (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `w1:real^3` THEN
3327 EXISTS_TAC `w2:real^3`);
3328 (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
3329 (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
3330 (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
3332 (EXISTS_TAC `&0` THEN EXISTS_TAC `t3 / (t3 + t4)`
3333 THEN EXISTS_TAC `t4 / (t3 + t4)`);
3335 (REWRITE_TAC[REAL_ARITH `&0 + t3 / (t3 + t4) + t4 / (t3 + t4) =
3336 (t3 + t4) / (t3 + t4)`]);
3337 (MATCH_MP_TAC REAL_DIV_REFL);
3338 (ASM_REWRITE_TAC[]);
3339 (ASM_REWRITE_TAC[VECTOR_ARITH
3340 `&0 % u1 + t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3 =
3341 (&1 / (t3 + t4)) % (t3 % u2 + t4 % u3)`]);
3342 (UP_ASM_TAC THEN REWRITE_TAC[VECTOR_ARITH
3343 `t1 / x % u0 + t3 / x % u2 + t4 / x % u3 =
3344 (&1 / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
3345 (REWRITE_WITH `&1 / (t1 + t3 + t4) % (t1 % u0 + t3 % w1 + t4 % w2) = u0 <=>
3346 t1 % u0 + t3 % w1 + t4 % w2 = (t1 + t3 + t4) % u0:real^3`);
3347 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3348 (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);
3349 (ASM_REWRITE_TAC[]);
3351 (REWRITE_TAC[VECTOR_ARITH `t1 % u0 + t3 % u2 + t4 % u3 = (t1 + t3 + t4) % u0
3352 <=> t3 % u2 + t4 % u3 = (t3 + t4) % u0`]);
3353 (STRIP_TAC THEN ASM_REWRITE_TAC[]);
3354 (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
3355 (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
3356 (ASM_SIMP_TAC[REAL_DIV_REFL]);
3358 (ASM_REWRITE_TAC[]);
3360 (REWRITE_WITH `x = t2 % u1 + (t1 + t3 + t4) % w:real^3`);
3361 (ASM_REWRITE_TAC[] THEN EXPAND_TAC "w");
3362 (REWRITE_TAC[VECTOR_ARITH
3363 `x % (t1 /x % u0 + t3 / x % u2 + t4 /x % u3) =
3364 (x / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
3365 (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
3366 (ASM_SIMP_TAC[REAL_DIV_REFL]);
3368 (ABBREV_TAC `t = t1 + t3 + t4`);
3369 (REWRITE_WITH `(t2 % u1 + t % w) - u0:real^3 =
3370 (t2 % u1 + t % w) - (t1 + t2 + t3 + t4) % u0`);
3371 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
3372 (REWRITE_WITH `t1 + t2 + t3 + t4 = t2 + t:real`);
3373 (EXPAND_TAC "t" THEN REAL_ARITH_TAC);
3374 (REWRITE_TAC[VECTOR_ARITH
3375 `(t2 % u1 + t % w) - (t2 + t) % u0 = t2 % (u1 - u0) + t % (w - u0)`]);
3376 (ABBREV_TAC `x1 = u1 - u0:real^3`);
3377 (ABBREV_TAC `x2 = w - u0:real^3`);
3379 (REWRITE_WITH `(t2 % x1 + t % x2) dot x1 =
3380 t2 * norm x1 pow 2 + t * x2 dot (x1:real^3)`);
3381 (REWRITE_TAC[NORM_POW_2]);
3384 (NEW_GOAL `t2 * norm x1 pow 2 * norm x2 * norm x1 <=
3385 t2 * (x2 dot x1) * norm x1 * norm (x1:real^3)`);
3386 (REWRITE_TAC[REAL_POW_2; REAL_ARITH `t2 * (x1 * x1) * x2 * x1 <=
3387 t2 * x3 * x1 * x1 <=> &0 <= (x1 pow 2) * (--t2) * (x2 * x1 - x3)`]);
3388 (MATCH_MP_TAC REAL_LE_MUL);
3389 (ASM_SIMP_TAC[REAL_LE_MUL; NORM_POS_LE]);
3390 (MATCH_MP_TAC REAL_LE_MUL);
3391 (REWRITE_TAC[REAL_ARITH `&0 <= a - b <=> b <= a`]);
3393 (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
3394 (REWRITE_TAC[NORM_CAUCHY_SCHWARZ]);
3397 `t2 * (x2 dot x1) * norm x1 * norm x1 + t * (x2 dot x1) * norm x2 * norm x1 <= (x2 dot x1) * norm (t2 % x1 + t % x2) * norm (x1:real^3)`);
3399 (REWRITE_TAC[REAL_ARITH `t2 * x3 * x1 * x1 + t * x3 * x2 * x1 <=
3400 x3 * x4 * x1 <=> &0 <= (x1 * x3) * (x4 - t2 * x1 - t * x2)`]);
3401 (MATCH_MP_TAC REAL_LE_MUL);
3403 (MATCH_MP_TAC REAL_LE_MUL);
3404 (REWRITE_TAC[NORM_POS_LE]);
3405 (ASM_CASES_TAC `x2 dot (x1:real^3) < &0`);
3407 (NEW_GOAL `(f:real^3->real) x <= &0`);
3409 (REWRITE_TAC[REAL_ARITH `a / b <= &0 <=> &0 <= (--a) / b`]);
3410 (MATCH_MP_TAC REAL_LE_DIV);
3411 (SIMP_TAC[NORM_POS_LE; REAL_LE_MUL]);
3413 (REWRITE_WITH `x = t2 % u1 + (t1 + t3 + t4) % w:real^3`);
3414 (ASM_REWRITE_TAC[] THEN EXPAND_TAC "w");
3415 (REWRITE_TAC[VECTOR_ARITH
3416 `x % (t1 /x % u0 + t3 / x % u2 + t4 /x % u3) =
3417 (x / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
3419 (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
3420 (MATCH_MP_TAC REAL_DIV_REFL);
3421 (ASM_REWRITE_TAC[]);
3424 (REWRITE_TAC[REAL_ARITH `&0 <= --a <=> a <= &0`]);
3425 (REWRITE_WITH `(t2 % u1 + (t1 + t3 + t4) % w) - u0:real^3 =
3426 (t2 % u1 + (t1 + t3 + t4) % w) - (t1 + t2 + t3 + t4) % u0`);
3427 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
3428 (REWRITE_WITH `(t2 % u1 + (t1 + t3 + t4) % w) - (t1 + t2 + t3 + t4) % u0 =
3429 t2 % x1 + t % x2:real^3`);
3430 (EXPAND_TAC "x1" THEN EXPAND_TAC "x2" THEN EXPAND_TAC "t"
3431 THEN VECTOR_ARITH_TAC);
3432 (NEW_GOAL `t % x2 dot (x1:real^3) <= &0`);
3433 (REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= a * (--b)`]);
3434 (MATCH_MP_TAC REAL_LE_MUL);
3436 (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN
3437 UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
3438 (UP_ASM_TAC THEN REAL_ARITH_TAC);
3439 (NEW_GOAL `t2 % x1 dot (x1:real^3) <= &0`);
3440 (REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);
3441 (MATCH_MP_TAC REAL_LE_MUL);
3443 (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN
3444 UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
3445 (REWRITE_TAC[DOT_POS_LE]);
3446 (REWRITE_TAC[DOT_LADD]);
3447 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3449 (UP_ASM_TAC THEN UNDISCH_TAC `a1 < (f:real^3->real) x`);
3450 (EXPAND_TAC "a1" THEN UNDISCH_TAC `&0 <= a` THEN REAL_ARITH_TAC);
3451 (UP_ASM_TAC THEN MESON_TAC[]);
3452 (UP_ASM_TAC THEN REAL_ARITH_TAC);
3454 (REWRITE_TAC [REAL_ARITH `&0 <= a - b * d - c <=> c <= a + (--b) * d`]);
3455 (REWRITE_WITH `t * norm (x2:real^3) = abs t * norm x2`);
3456 (AP_THM_TAC THEN AP_TERM_TAC);
3457 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3458 (REWRITE_TAC[REAL_ABS_REFL]);
3459 (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN
3460 UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
3461 (REWRITE_WITH `(--t2) * norm (x1:real^3) = abs (--t2) * norm x1`);
3462 (AP_THM_TAC THEN AP_TERM_TAC);
3463 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3464 (REWRITE_TAC[REAL_ABS_REFL]);
3465 (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
3466 (REWRITE_TAC[GSYM NORM_MUL]);
3468 `norm (t % x2:real^3) = norm ((t2 % x1 + t % x2) + (--t2 % x1))`);
3469 (AP_TERM_TAC THEN VECTOR_ARITH_TAC);
3470 (REWRITE_TAC[NORM_TRIANGLE]);
3471 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3473 (NEW_GOAL `(f:real^3->real) x <= f s2`);
3474 (UNDISCH_TAC `(f:real^3->real) y <= f s2`);
3475 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3477 (NEW_GOAL `(f:real^3->real) s2 <= a1`);
3479 (ASM_REWRITE_TAC[]);
3480 (EXPAND_TAC "a1" THEN REAL_ARITH_TAC);
3482 (UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC `a1 < (f:real^3->real) x`);
3485 (UP_ASM_TAC THEN STRIP_TAC);
3487 (* ========================================================================= *)
3490 `NULLSET (conic_cap u0 u1 r1 a1 INTER aff_ge {u0:real^3, u1} {w1, w2})`);
3491 (ASM_REWRITE_TAC[]);
3492 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3493 (EXISTS_TAC `conic_cap u0 u1 r a INTER convex hull {u0:real^3, u1, w1, w2}`);
3494 (ASM_REWRITE_TAC[]);
3495 (UP_ASM_TAC THEN SET_TAC[]);
3496 (NEW_GOAL `vol (conic_cap u0 u1 r1 a1 INTER aff_ge {u0, u1} {w1, w2}) = &0`);
3497 (ASM_SIMP_TAC[MEASURE_EQ_0]);
3499 (UP_ASM_TAC THEN REWRITE_WITH
3500 `vol (conic_cap u0 u1 r1 a1 INTER aff_ge {u0, u1} {w1, w2}) =
3501 vol (conic_cap u0 u1 r1 a1 INTER aff_gt {u0, u1} {w1, w2})`);
3502 (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
3503 (REWRITE_WITH `conic_cap u0 u1 r1 a1 INTER aff_gt {u0, u1} {w1, w2} DIFF
3504 conic_cap u0 u1 r1 a1 INTER aff_ge {u0, u1:real^3} {w1, w2} =
3506 (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> (C INTER A) DIFF (C INTER B) = {}`));
3507 (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);
3508 (REWRITE_TAC[SET_RULE `a UNION {} = a`]);
3510 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3511 (EXISTS_TAC `aff_ge {u0, u1:real^3} {w1, w2} DIFF
3512 aff_gt {u0, u1} {w1, w2}`);
3513 (REWRITE_TAC[SET_RULE `A INTER B DIFF A INTER C SUBSET B DIFF C`]);
3515 (REWRITE_WITH `aff_ge {u0, u1:real^3} {w1, w2} =
3516 aff_gt {u0, u1} {w1, w2} UNION
3517 UNIONS {aff_ge {u0, u1} ({w1, w2} DELETE a) | a | a IN {w1, w2}}`);
3518 (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);
3519 (REWRITE_TAC[Geomdetail.FINITE6]);
3520 (REWRITE_TAC[DISJOINT]);
3522 (ASM_CASES_TAC `w1 IN {u0, u1:real^3}`);
3524 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
3525 (REWRITE_WITH `{u0, u1, w1, w2} = {u0, u1, w2:real^3}`);
3526 (UP_ASM_TAC THEN SET_TAC[]);
3527 (REWRITE_TAC[COPLANAR_3]);
3528 (UP_ASM_TAC THEN MESON_TAC[]);
3530 (ASM_CASES_TAC `w2 IN {u0, u1:real^3}`);
3532 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
3533 (REWRITE_WITH `{u0, u1, w1, w2} = {u0, u1, w1:real^3}`);
3534 (UP_ASM_TAC THEN SET_TAC[]);
3535 (REWRITE_TAC[COPLANAR_3]);
3536 (UP_ASM_TAC THEN MESON_TAC[]);
3537 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
3541 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3543 `UNIONS {aff_ge {u0, u1:real^3} ({w1, w2} DELETE a) | a | a IN {w1, w2}}`);
3545 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3548 `aff_ge {u0, u1:real^3} {w1} UNION aff_ge {u0, u1:real^3} {w2}`);
3550 (MATCH_MP_TAC NEGLIGIBLE_UNION);
3553 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3554 (EXISTS_TAC `affine hull {u0, u1:real^3, w1}`);
3556 (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
3557 (REWRITE_WITH `{u0,u1,w1:real^3} = {u0,u1} UNION {w1}`);
3559 (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
3560 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3561 (EXISTS_TAC `affine hull {u0, u1:real^3, w2}`);
3563 (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
3564 (REWRITE_WITH `{u0,u1,w2:real^3} = {u0,u1} UNION {w2}`);
3566 (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
3567 (REWRITE_TAC[SET_RULE
3568 `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} =
3569 aff_ge {u0, u1} ({m, s3} DELETE s3)
3570 UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);
3571 (MATCH_MP_TAC (SET_RULE
3572 `A SUBSET B /\ C SUBSET D ==> A UNION C SUBSET B UNION D`));
3574 (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
3578 (REWRITE_TAC[DISJOINT]);
3579 (ASM_CASES_TAC `w1 IN {u0, u1:real^3}`);
3581 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
3582 (REWRITE_WITH `{u0, u1, w1, w2} = {u0, u1, w2:real^3}`);
3583 (UP_ASM_TAC THEN SET_TAC[]);
3584 (REWRITE_TAC[COPLANAR_3]);
3585 (UP_ASM_TAC THEN MESON_TAC[]);
3586 (UP_ASM_TAC THEN SET_TAC[]);
3588 (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
3591 (REWRITE_TAC[DISJOINT]);
3592 (ASM_CASES_TAC `w2 IN {u0, u1:real^3}`);
3594 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
3595 (REWRITE_WITH `{u0, u1, w1, w2} = {u0, u1, w1:real^3}`);
3596 (UP_ASM_TAC THEN SET_TAC[]);
3597 (REWRITE_TAC[COPLANAR_3]);
3598 (UP_ASM_TAC THEN MESON_TAC[]);
3599 (UP_ASM_TAC THEN SET_TAC[]);
3603 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}` THEN REWRITE_TAC[]);
3604 (MATCH_MP_TAC CONIC_CAP_AFF_GT_EQ_0);
3605 (EXISTS_TAC `a1:real` THEN EXISTS_TAC `r1:real`);
3606 (ASM_REWRITE_TAC[])]);;
3608 (* ==================================================================== *)
3611 let MEASURABLE_BALL_AFF_GE = prove
3612 (`!z r s t. measurable(ball(z,r) INTER aff_ge s t)`,
3613 MESON_TAC[MEASURABLE_CONVEX; CONVEX_INTER; CONVEX_AFF_GE; CONVEX_BALL;
3614 BOUNDED_INTER; BOUNDED_BALL]);;
3616 (* ==================================================================== *)
3617 (* Currently added lemmas *)
3620 let FINITE_LIST_KY_LEMMA_2 = prove
3628 REWRITE_TAC[SET_RULE
3629 `{y | ?u0 u1. u0 IN s /\ u1 IN s /\ y = [u0; u1]} =
3630 {[u0;u1] | u0 IN s /\ u1 IN s}`] THEN
3632 (GEN_TAC THEN DISCH_TAC THEN
3633 MATCH_MP_TAC FINITE_PRODUCT_DEPENDENT THEN ASM_REWRITE_TAC[]));;
3635 let FINITE_SET_PRODUCT_KY_LEMMA = prove (
3637 FINITE s ==> FINITE {{u0, u1:A} | u0 IN s /\ u1 IN s}`,
3639 (GEN_TAC THEN DISCH_TAC THEN
3640 MATCH_MP_TAC FINITE_PRODUCT_DEPENDENT THEN ASM_REWRITE_TAC[]));;
3643 (* ==================================================================== *)
3644 (* Lemma 38: BETA_PAIR_THM - formal proof by TCHales *)
3646 let pre_beta = prove_by_refinement
3647 (`!g u' v'. (?f. (!u v. f { u, v } = (g:A->A->B) u v)) ==>
3648 ((\ { u, v}. g u v) {u',v'} = g u' v')`,
3649 [REWRITE_TAC[GABS_DEF;GEQ_DEF];
3653 let WELLDEFINED_FUNCTION_2 = prove_by_refinement(
3654 `(?f:C->D. (!x:A y:B. f(s x y) = t x y)) <=>
3655 (!x x' y y'. (s x y = s x' y') ==> t x y = t x' y')`,
3656 [ MATCH_MP_TAC EQ_TRANS ;
3657 EXISTS_TAC `?f:C->D. !z. !x:A y:B. (s x y = z) ==> f z = t x y`;
3660 REWRITE_TAC[GSYM SKOLEM_THM];
3663 let well_defined_unordered_pair = prove_by_refinement
3664 (`(?f. (!u v. f { u, v} = (g:A->A->B) u v)) <=>
3665 (! u v. g u v = g v u)`,
3666 [REWRITE_TAC[WELLDEFINED_FUNCTION_2];
3667 NEW_GOAL `!u v x' y'.
3668 {u,v} = {x',y'} <=> (u:A = x' /\ v = y')\/ (u = y' /\ v = x')`;
3673 let BETA_PAIR_THM = prove_by_refinement(
3674 `!g u' v'. (!u v. (g:A->A->B) u v = g v u) ==>
3675 ((\ { u, v}. g u v) {u',v'} = g u' v')`,
3677 MATCH_MP_TAC pre_beta;
3678 REWRITE_TAC[well_defined_unordered_pair];
3679 ASM_REWRITE_TAC[]]);;
3681 (* ==================================================================== *)
3684 let DIHX_RANGE = prove_by_refinement (
3685 `!V X u v. &0 <= dihX V X (u,v) /\ dihX V X (u,v) <= pi`,
3686 [(REWRITE_TAC[dihX] THEN REPEAT GEN_TAC);
3688 (REWRITE_TAC[PI_POS_LE; REAL_ARITH `a <= a`]);
3689 (REPEAT LET_TAC THEN COND_CASES_TAC);
3690 (REWRITE_TAC[dihu2; DIHV_RANGE]);
3692 (REWRITE_TAC[dihu3; DIHV_RANGE]);
3694 (REWRITE_TAC[dihu4; DIHV_RANGE]);
3695 (REWRITE_TAC[PI_POS_LE; REAL_ARITH `a <= a`])]);;
3697 let DIHX_LE_PI = prove (`!V X u v. dihX V X (u,v) <= pi`,
3698 MESON_TAC[DIHX_RANGE]);;
3700 (* ==================================================================== *)
3703 let BOUNDED_VOLUME_MCELL = prove_by_refinement (
3704 `!V. ?c. !X. saturated V /\ packing V /\ mcell_set V X ==> vol X <= c`,
3706 (ASM_CASES_TAC `saturated V /\ packing V`);
3707 (EXISTS_TAC `&4 / &3 * pi * &8 pow 3`);
3709 (UP_ASM_TAC THEN REWRITE_TAC[mcell_set_2; IN_ELIM_THM; IN]);
3711 (ASM_CASES_TAC `X:real^3->bool = {}`);
3712 (REWRITE_TAC[MEASURE_EMPTY; ASSUME `X:real^3->bool = {}`]);
3713 (REWRITE_TAC[REAL_ARITH `&0 <= &4 / &3 * pi * &8 pow 3 <=> &0 <= pi`]);
3714 (REWRITE_TAC[PI_POS_LE]);
3715 (UP_ASM_TAC THEN REWRITE_TAC[SET_RULE `~(x = {}) <=> (?v. v IN x)`]);
3717 (NEW_GOAL `vol X <= vol (ball (v, &8))`);
3718 (MATCH_MP_TAC MEASURE_SUBSET);
3720 (ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MEASURABLE_MCELL);
3721 (ASM_REWRITE_TAC[]);
3722 (REWRITE_TAC[MEASURABLE_BALL]);
3723 (ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MCELL_SUBSET_BALL8);
3724 (ASM_REWRITE_TAC[]);
3725 (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
3726 (UP_ASM_TAC THEN SIMP_TAC[VOLUME_BALL; REAL_ARITH `&0 <= &8`]);
3728 (REPEAT STRIP_TAC THEN ASM_MESON_TAC[])]);;
3730 (* ==================================================================== *)
3733 let LEFT_ACTION_LIST_2_EXISTS = prove_by_refinement (
3734 `!u0 u1 u2 x y z d:A.
3735 CARD {u0, u1, u2, d} = 4 /\ {x, y, z} = {u0, u1, u2}
3736 ==> (?p. p permutes 0..2 /\
3737 [x; y; z; d] = left_action_list p [u0; u1; u2; d])`,
3738 [(REPEAT STRIP_TAC);
3739 (REWRITE_TAC[left_action_list; LENGTH; TABLE_4;
3740 ARITH_RULE `SUC (SUC (SUC (SUC 0))) = 4`]);
3741 (NEW_GOAL `{u0, u1, u2:A} =
3742 {EL 0 [u0;u1;u2;d] , EL 1 [u0;u1;u2;d], EL 2 [u0;u1;u2;d]}`);
3743 (REWRITE_TAC[EL; HD; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`; TL]);
3744 (NEW_GOAL `{x, y, z:A} =
3745 {EL 0 [u0;u1;u2;d] , EL 1 [u0;u1;u2;d], EL 2 [u0;u1;u2;d]}`);
3746 (ASM_REWRITE_TAC[]);
3747 (NEW_GOAL `?i1. i1 IN {0,1,2} /\ EL i1 [u0;u1;u2;d] = x:A`);
3748 (UP_ASM_TAC THEN SET_TAC[]);
3749 (FIRST_X_ASSUM CHOOSE_TAC THEN SWITCH_TAC);
3750 (NEW_GOAL `?i2. i2 IN {0,1,2} /\ EL i2 [u0;u1;u2;d] = y:A`);
3751 (UP_ASM_TAC THEN SET_TAC[]);
3752 (FIRST_X_ASSUM CHOOSE_TAC THEN SWITCH_TAC);
3753 (NEW_GOAL `?i3. i3 IN {0,1,2} /\ EL i3 [u0;u1;u2;d] = z:A`);
3754 (UP_ASM_TAC THEN SET_TAC[]);
3755 (FIRST_X_ASSUM CHOOSE_TAC THEN SWITCH_TAC);
3757 (NEW_GOAL `~(i1 = i2) /\ ~(i1 = i3) /\ ~(i2 = i3:num)`);
3759 (NEW_GOAL `{u0,u1,u2,d:A} = {x, z,d}`);
3761 (UNDISCH_TAC `CARD {u0,u1,u2,d:A} = 4` THEN ASM_REWRITE_TAC[]);
3762 (MESON_TAC[Geomdetail.CARD3; ARITH_RULE `a <= 3 ==> ~(a = 4)`]);
3763 (NEW_GOAL `{u0,u1,u2,d:A} = {x, y,d}`);
3765 (UNDISCH_TAC `CARD {u0,u1,u2,d:A} = 4` THEN ASM_REWRITE_TAC[]);
3766 (MESON_TAC[Geomdetail.CARD3; ARITH_RULE `a <= 3 ==> ~(a = 4)`]);
3767 (NEW_GOAL `{u0,u1,u2,d:A} = {x, y,d}`);
3769 (UNDISCH_TAC `CARD {u0,u1,u2,d:A} = 4` THEN ASM_REWRITE_TAC[]);
3770 (MESON_TAC[Geomdetail.CARD3; ARITH_RULE `a <= 3 ==> ~(a = 4)`]);
3771 (SWITCH_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REPEAT STRIP_TAC);
3773 (NEW_GOAL `{i1, i2, i3} = {0,1,2}`);
3776 (ABBREV_TAC `p = (\i:num. if i = i1 then 0
3777 else if i = i2 then 1
3778 else if i = i3 then 2
3780 (NEW_GOAL `p i1 = 0 /\ p i2 = 1 /\ p (i3:num) = 2`);
3783 (EXISTS_TAC `p:num->num`);
3784 (NEW_GOAL `p permutes 0..2`);
3786 (REWRITE_TAC[permutes; EXISTS_UNIQUE; IN_NUMSEG_0;
3787 ARITH_RULE `a <= 2 <=> a = 0 \/ a = 1 \/ a = 2`;
3788 SET_RULE `x = 0 \/ x = 1 \/ x = 2 <=> x IN {0,1,2}`]);
3789 (NEW_GOAL `(!x. ~(x IN {0, 1, 2}) ==> p x = x)`);
3799 (ASM_REWRITE_TAC[]);
3802 (ASM_CASES_TAC `y' = 0`);
3803 (EXISTS_TAC `i1:num`);
3804 (ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC);
3805 (ASM_CASES_TAC `y'' = i2:num`);
3807 (UNDISCH_TAC `(p:num->num) y'' = 0` THEN ASM_REWRITE_TAC[]);
3810 (ASM_CASES_TAC `y'' = i3:num`);
3812 (UNDISCH_TAC `(p:num->num) y'' = 0` THEN ASM_REWRITE_TAC[]);
3815 (ASM_CASES_TAC `~(y'' IN {0,1,2})`);
3817 (UNDISCH_TAC `(p:num->num) y'' = 0` THEN ASM_SIMP_TAC[]);
3818 (UP_ASM_TAC THEN SET_TAC[]);
3822 (ASM_CASES_TAC `y' = 1`);
3823 (EXISTS_TAC `i2:num`);
3824 (ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC);
3825 (ASM_CASES_TAC `y'' = i1:num`);
3827 (UNDISCH_TAC `(p:num->num) y'' = 1` THEN ASM_REWRITE_TAC[]);
3830 (ASM_CASES_TAC `y'' = i3:num`);
3832 (UNDISCH_TAC `(p:num->num) y'' = 1` THEN ASM_REWRITE_TAC[]);
3835 (ASM_CASES_TAC `~(y'' IN {0,1,2})`);
3837 (UNDISCH_TAC `(p:num->num) y'' = 1` THEN ASM_SIMP_TAC[]);
3838 (UP_ASM_TAC THEN SET_TAC[]);
3842 (ASM_CASES_TAC `y' = 2`);
3843 (EXISTS_TAC `i3:num`);
3844 (ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC);
3845 (ASM_CASES_TAC `y'' = i2:num`);
3847 (UNDISCH_TAC `(p:num->num) y'' = 2` THEN ASM_REWRITE_TAC[]);
3850 (ASM_CASES_TAC `y'' = i1:num`);
3852 (UNDISCH_TAC `(p:num->num) y'' = 2` THEN ASM_REWRITE_TAC[]);
3855 (ASM_CASES_TAC `~(y'' IN {0,1,2})`);
3857 (UNDISCH_TAC `(p:num->num) y'' = 2` THEN ASM_SIMP_TAC[]);
3858 (UP_ASM_TAC THEN SET_TAC[]);
3862 (NEW_GOAL `~(y' IN {0,1,2})`);
3863 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
3864 (EXISTS_TAC `y':num`);
3865 (ASM_SIMP_TAC[] THEN REPEAT STRIP_TAC);
3867 (ASM_CASES_TAC `y'' = i1:num`);
3869 (UNDISCH_TAC `(p:num->num) y'' = y'` THEN ASM_REWRITE_TAC[]);
3871 (ASM_CASES_TAC `y'' = i2:num`);
3873 (UNDISCH_TAC `(p:num->num) y'' = y'` THEN ASM_REWRITE_TAC[]);
3875 (ASM_CASES_TAC `y'' = i3:num`);
3877 (UNDISCH_TAC `(p:num->num) y'' = y'` THEN ASM_REWRITE_TAC[]);
3880 (NEW_GOAL `(p:num->num) y'' = y''`);
3881 (FIRST_ASSUM MATCH_MP_TAC);
3885 (REWRITE_WITH `inverse (p:num->num) 0 = i1 /\
3886 inverse p 1 = i2 /\ inverse p 2 = i3`);
3887 (UP_ASM_TAC THEN MESON_TAC[PERMUTES_INVERSE_EQ;
3888 ASSUME `(p:num->num) i1 = 0 /\ p i2 = 1 /\ p i3 = 2`]);
3889 (ASM_REWRITE_TAC[]);
3890 (REWRITE_WITH `inverse (p:num->num) 3 = 3`);
3891 (NEW_GOAL `p 3 = 3`);
3892 (MP_TAC (ASSUME `p permutes 0..2`) THEN REWRITE_TAC[permutes]);
3894 (FIRST_ASSUM MATCH_MP_TAC);
3895 (REWRITE_TAC[IN_NUMSEG_0] THEN ARITH_TAC);
3896 (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[PERMUTES_INVERSE_EQ]);
3897 (REWRITE_TAC[EL;HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`])]);;
3899 (* ==================================================================== *)
3901 let LEFT_ACTION_LIST_3_EXISTS = prove_by_refinement (
3902 `!u0 u1 u2 u3 x y z t:A.
3903 CARD {u0, u1, u2, u3} = 4 /\ {x, y, z, t} = {u0, u1, u2, u3}
3904 ==> (?p. p permutes 0..3 /\
3905 [x; y; z; t] = left_action_list p [u0; u1; u2; u3])`,
3906 [(REPEAT STRIP_TAC);
3907 (REWRITE_TAC[left_action_list; LENGTH; TABLE_4;
3908 ARITH_RULE `SUC (SUC (SUC (SUC 0))) = 4`]);
3909 (NEW_GOAL `{u0, u1, u2, u3:A} = {EL 0 [u0;u1;u2;u3], EL 1 [u0;u1;u2;u3],
3910 EL 2 [u0;u1;u2;u3], EL 3 [u0;u1;u2;u3]}`);
3911 (REWRITE_TAC[EL; HD; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; TL]);
3912 (NEW_GOAL `{x, y, z, t:A} = {EL 0 [u0;u1;u2;u3], EL 1 [u0;u1;u2;u3],
3913 EL 2 [u0;u1;u2;u3], EL 3 [u0;u1;u2;u3]}`);
3914 (ASM_REWRITE_TAC[]);
3915 (NEW_GOAL `?i1. i1 IN {0,1,2,3} /\ EL i1 [u0;u1;u2;u3] = x:A`);
3916 (UP_ASM_TAC THEN SET_TAC[]);
3917 (FIRST_X_ASSUM CHOOSE_TAC THEN SWITCH_TAC);
3918 (NEW_GOAL `?i2. i2 IN {0,1,2,3} /\ EL i2 [u0;u1;u2;u3] = y:A`);
3919 (UP_ASM_TAC THEN SET_TAC[]);
3920 (FIRST_X_ASSUM CHOOSE_TAC THEN SWITCH_TAC);
3921 (NEW_GOAL `?i3. i3 IN {0,1,2,3} /\ EL i3 [u0;u1;u2;u3] = z:A`);
3922 (UP_ASM_TAC THEN SET_TAC[]);
3923 (FIRST_X_ASSUM CHOOSE_TAC THEN SWITCH_TAC);
3924 (NEW_GOAL `?i4. i4 IN {0,1,2,3} /\ EL i4 [u0;u1;u2;u3] = t:A`);
3925 (UP_ASM_TAC THEN SET_TAC[]);
3926 (FIRST_X_ASSUM CHOOSE_TAC THEN SWITCH_TAC);
3928 (NEW_GOAL `~(i1 = i2) /\ ~(i1 = i3) /\ ~(i1 = i4:num) /\ ~(i2 = i3) /\
3929 ~(i2 = i4) /\ ~(i3 = i4)`);
3932 (NEW_GOAL `x = y:A`);
3934 (NEW_GOAL `{u0,u1,u2,u3:A} = {x, z,t}`);
3935 (UNDISCH_TAC `{x, y, z, t:A} = {u0, u1, u2, u3}` THEN UP_ASM_TAC
3937 (UNDISCH_TAC `CARD {u0,u1,u2,u3:A} = 4` THEN
3938 REWRITE_TAC[ASSUME `{u0, u1, u2, u3} = {x, z, t:A}`]);
3939 (MESON_TAC[Geomdetail.CARD3; ARITH_RULE `a <= 3 ==> ~(a = 4)`]);
3941 (NEW_GOAL `x = z:A`);
3943 (NEW_GOAL `{u0,u1,u2,u3:A} = {x, y,t}`);
3944 (UNDISCH_TAC `{x, y, z, t:A} = {u0, u1, u2, u3}` THEN UP_ASM_TAC
3946 (UNDISCH_TAC `CARD {u0,u1,u2,u3:A} = 4` THEN
3947 REWRITE_TAC[ASSUME `{u0, u1, u2, u3} = {x, y, t:A}`]);
3948 (MESON_TAC[Geomdetail.CARD3; ARITH_RULE `a <= 3 ==> ~(a = 4)`]);
3950 (NEW_GOAL `x = t:A`);
3952 (NEW_GOAL `{u0,u1,u2,u3:A} = {x, y, z}`);
3953 (UNDISCH_TAC `{x, y, z, t:A} = {u0, u1, u2, u3}` THEN UP_ASM_TAC
3955 (UNDISCH_TAC `CARD {u0,u1,u2,u3:A} = 4` THEN
3956 REWRITE_TAC[ASSUME `{u0, u1, u2, u3} = {x, y, z:A}`]);
3957 (MESON_TAC[Geomdetail.CARD3; ARITH_RULE `a <= 3 ==> ~(a = 4)`]);
3959 (NEW_GOAL `y = z:A`);
3961 (NEW_GOAL `{u0,u1,u2,u3:A} = {x, z,t}`);
3962 (UNDISCH_TAC `{x, y, z, t:A} = {u0, u1, u2, u3}` THEN UP_ASM_TAC
3964 (UNDISCH_TAC `CARD {u0,u1,u2,u3:A} = 4` THEN
3965 REWRITE_TAC[ASSUME `{u0, u1, u2, u3} = {x, z, t:A}`]);
3966 (MESON_TAC[Geomdetail.CARD3; ARITH_RULE `a <= 3 ==> ~(a = 4)`]);
3968 (NEW_GOAL `y = t:A`);
3970 (NEW_GOAL `{u0,u1,u2,u3:A} = {x, z,t}`);
3971 (UNDISCH_TAC `{x, y, z, t:A} = {u0, u1, u2, u3}` THEN UP_ASM_TAC
3973 (UNDISCH_TAC `CARD {u0,u1,u2,u3:A} = 4` THEN
3974 REWRITE_TAC[ASSUME `{u0, u1, u2, u3} = {x, z, t:A}`]);
3975 (MESON_TAC[Geomdetail.CARD3; ARITH_RULE `a <= 3 ==> ~(a = 4)`]);
3977 (NEW_GOAL `z = t:A`);
3979 (NEW_GOAL `{u0,u1,u2,u3:A} = {x, y,t}`);
3980 (UNDISCH_TAC `{x, y, z, t:A} = {u0, u1, u2, u3}` THEN UP_ASM_TAC
3982 (UNDISCH_TAC `CARD {u0,u1,u2,u3:A} = 4` THEN
3983 REWRITE_TAC[ASSUME `{u0, u1, u2, u3} = {x, y, t:A}`]);
3984 (MESON_TAC[Geomdetail.CARD3; ARITH_RULE `a <= 3 ==> ~(a = 4)`]);
3986 (SWITCH_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REPEAT STRIP_TAC);
3988 (NEW_GOAL `{i1, i2, i3,i4} = {0,1,2,3}`);
3989 (REWRITE_TAC[SET_EQ_LEMMA]);
3994 (ABBREV_TAC `p = (\i:num. if i = i1 then 0
3995 else if i = i2 then 1
3996 else if i = i3 then 2
3997 else if i = i4 then 3
3999 (NEW_GOAL `p i1 = 0 /\ p i2 = 1 /\ p (i3:num) = 2 /\ p i4 = 3`);
4004 (EXPAND_TAC "p" THEN COND_CASES_TAC);
4023 (EXISTS_TAC `p:num->num`);
4024 (NEW_GOAL `p permutes 0..3`);
4026 (REWRITE_TAC[permutes; EXISTS_UNIQUE; IN_NUMSEG_0;
4027 ARITH_RULE `a <= 3 <=> a = 0 \/ a = 1 \/ a = 2 \/ a = 3`;
4028 SET_RULE `x = 0 \/ x = 1 \/ x = 2 \/ x = 3 <=> x IN {0,1,2,3}`]);
4029 (NEW_GOAL `(!x. ~(x IN {0, 1, 2, 3}) ==> p x = x)`);
4034 (UNDISCH_TAC `~(x' IN {0, 1, 2, 3})` THEN ASM_REWRITE_TAC[]);
4038 (UNDISCH_TAC `~(x' IN {0, 1, 2, 3})` THEN ASM_REWRITE_TAC[]);
4042 (UNDISCH_TAC `~(x' IN {0, 1, 2, 3})` THEN ASM_REWRITE_TAC[]);
4046 (UNDISCH_TAC `~(x' IN {0, 1, 2, 3})` THEN ASM_REWRITE_TAC[]);
4050 (ASM_REWRITE_TAC[]);
4053 (ASM_CASES_TAC `y' = 0`);
4054 (EXISTS_TAC `i1:num`);
4055 (ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC);
4056 (ASM_CASES_TAC `y'' = i2:num`);
4058 (UNDISCH_TAC `(p:num->num) y'' = 0` THEN ASM_REWRITE_TAC[]);
4061 (ASM_CASES_TAC `y'' = i3:num`);
4063 (UNDISCH_TAC `(p:num->num) y'' = 0` THEN ASM_REWRITE_TAC[]);
4067 (ASM_CASES_TAC `y'' = i4:num`);
4069 (UNDISCH_TAC `(p:num->num) y'' = 0` THEN ASM_REWRITE_TAC[]);
4073 (ASM_CASES_TAC `~(y'' IN {0,1,2,3})`);
4075 (UNDISCH_TAC `(p:num->num) y'' = 0` THEN ASM_SIMP_TAC[]);
4076 (UP_ASM_TAC THEN SET_TAC[]);
4078 (REPLICATE_TAC 4 UP_ASM_TAC THEN REWRITE_TAC[] THEN
4079 UNDISCH_TAC `{i1,i2,i3,i4} = {0,1,2,3}` THEN SET_TAC[]);
4081 (ASM_CASES_TAC `y' = 1`);
4082 (EXISTS_TAC `i2:num`);
4083 (ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC);
4084 (ASM_CASES_TAC `y'' = i1:num`);
4086 (UNDISCH_TAC `(p:num->num) y'' = 1` THEN ASM_REWRITE_TAC[]);
4089 (ASM_CASES_TAC `y'' = i3:num`);
4091 (UNDISCH_TAC `(p:num->num) y'' = 1` THEN ASM_REWRITE_TAC[]);
4094 (ASM_CASES_TAC `y'' = i4:num`);
4096 (UNDISCH_TAC `(p:num->num) y'' = 1` THEN ASM_REWRITE_TAC[]);
4099 (ASM_CASES_TAC `~(y'' IN {0,1,2,3})`);
4101 (UNDISCH_TAC `(p:num->num) y'' = 1` THEN ASM_SIMP_TAC[]);
4102 (UP_ASM_TAC THEN SET_TAC[]);
4104 (REPLICATE_TAC 4 UP_ASM_TAC THEN REWRITE_TAC[] THEN
4105 UNDISCH_TAC `{i1,i2,i3,i4} = {0,1,2,3}` THEN SET_TAC[]);
4108 (ASM_CASES_TAC `y' = 2`);
4109 (EXISTS_TAC `i3:num`);
4110 (ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC);
4111 (ASM_CASES_TAC `y'' = i1:num`);
4113 (UNDISCH_TAC `(p:num->num) y'' = 2` THEN ASM_REWRITE_TAC[]);
4116 (ASM_CASES_TAC `y'' = i2:num`);
4118 (UNDISCH_TAC `(p:num->num) y'' = 2` THEN ASM_REWRITE_TAC[]);
4121 (ASM_CASES_TAC `y'' = i4:num`);
4123 (UNDISCH_TAC `(p:num->num) y'' = 2` THEN ASM_REWRITE_TAC[]);
4126 (ASM_CASES_TAC `~(y'' IN {0,1,2,3})`);
4128 (UNDISCH_TAC `(p:num->num) y'' = 2` THEN ASM_SIMP_TAC[]);
4129 (UP_ASM_TAC THEN SET_TAC[]);
4131 (REPLICATE_TAC 4 UP_ASM_TAC THEN REWRITE_TAC[] THEN
4132 UNDISCH_TAC `{i1,i2,i3,i4} = {0,1,2,3}` THEN SET_TAC[]);
4134 (ASM_CASES_TAC `y' = 3`);
4135 (EXISTS_TAC `i4:num`);
4136 (ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC);
4137 (ASM_CASES_TAC `y'' = i1:num`);
4139 (UNDISCH_TAC `(p:num->num) y'' = 3` THEN ASM_REWRITE_TAC[]);
4142 (ASM_CASES_TAC `y'' = i2:num`);
4144 (UNDISCH_TAC `(p:num->num) y'' = 3` THEN ASM_REWRITE_TAC[]);
4147 (ASM_CASES_TAC `y'' = i3:num`);
4149 (UNDISCH_TAC `(p:num->num) y'' = 3` THEN ASM_REWRITE_TAC[]);
4152 (ASM_CASES_TAC `~(y'' IN {0,1,2,3})`);
4154 (UNDISCH_TAC `(p:num->num) y'' = 3` THEN ASM_SIMP_TAC[]);
4155 (UP_ASM_TAC THEN SET_TAC[]);
4157 (REPLICATE_TAC 4 UP_ASM_TAC THEN REWRITE_TAC[] THEN
4158 UNDISCH_TAC `{i1,i2,i3,i4} = {0,1,2,3}` THEN SET_TAC[]);
4160 (NEW_GOAL `~(y' IN {0,1,2,3})`);
4161 (REPLICATE_TAC 4 UP_ASM_TAC THEN SET_TAC[]);
4162 (EXISTS_TAC `y':num`);
4163 (ASM_SIMP_TAC[] THEN REPEAT STRIP_TAC);
4165 (ASM_CASES_TAC `y'' = i1:num`);
4167 (UNDISCH_TAC `(p:num->num) y'' = y'` THEN ASM_REWRITE_TAC[]);
4169 (ASM_CASES_TAC `y'' = i2:num`);
4171 (UNDISCH_TAC `(p:num->num) y'' = y'` THEN ASM_REWRITE_TAC[]);
4173 (ASM_CASES_TAC `y'' = i3:num`);
4175 (UNDISCH_TAC `(p:num->num) y'' = y'` THEN ASM_REWRITE_TAC[]);
4177 (ASM_CASES_TAC `y'' = i4:num`);
4179 (UNDISCH_TAC `(p:num->num) y'' = y'` THEN ASM_REWRITE_TAC[]);
4182 (NEW_GOAL `(p:num->num) y'' = y''`);
4183 (FIRST_ASSUM MATCH_MP_TAC);
4184 (REPLICATE_TAC 4 UP_ASM_TAC THEN REWRITE_TAC[] THEN
4185 UNDISCH_TAC `{i1,i2,i3,i4} = {0,1,2,3}` THEN SET_TAC[]);
4188 (REWRITE_WITH `inverse (p:num->num) 0 = i1 /\ inverse p 3 = i4 /\
4189 inverse p 1 = i2 /\ inverse p 2 = i3`);
4190 (UP_ASM_TAC THEN MESON_TAC[PERMUTES_INVERSE_EQ;
4191 ASSUME `(p:num->num) i1 = 0 /\ p i2 = 1 /\ p i3 = 2 /\ p i4 = 3`]);
4192 (ASM_REWRITE_TAC[])]);;
4195 (* ==================================================================== *)
4198 let lmfun_bounded = prove_by_refinement (
4199 `!h. &0 <= h ==> lmfun h <= h0 / (h0 - &1)`,
4200 [(REPEAT STRIP_TAC THEN REWRITE_TAC[lmfun] THEN COND_CASES_TAC);
4201 (REWRITE_TAC[REAL_ARITH `(h0 - h) / (h0 - &1) <= h0 / (h0 - &1) <=>
4202 &0 <= h / (h0 - &1)`]);
4203 (MATCH_MP_TAC REAL_LE_DIV);
4204 (REWRITE_TAC[h0] THEN ASM_REAL_ARITH_TAC);
4205 (MATCH_MP_TAC REAL_LE_DIV);
4206 (REWRITE_TAC[h0] THEN REAL_ARITH_TAC)]);;
4208 (* ==================================================================== *)
4211 let lmfun_pos_le = prove_by_refinement (
4212 `!h. &0 <= lmfun h`,
4213 [(REPEAT STRIP_TAC THEN REWRITE_TAC[lmfun] THEN COND_CASES_TAC);
4214 (MATCH_MP_TAC REAL_LE_DIV);
4216 (ASM_REAL_ARITH_TAC);
4217 (ASM_REWRITE_TAC[h0] THEN REAL_ARITH_TAC);
4218 (REAL_ARITH_TAC)]);;
4220 (* ==================================================================== *)
4222 let BARV_CARD_LEMMA = prove (
4224 packing V /\ barV V k ul ==> CARD (set_of_list ul) = k + 1`,
4225 MESON_TAC[Rogers.BARV_IMP_LENGTH_EQ_CARD]);;
4227 let BARV_LENGTH_LEMMA = prove (
4229 packing V /\ barV V k ul ==> LENGTH ul = k + 1`,
4230 MESON_TAC[Rogers.BARV_IMP_LENGTH_EQ_CARD]);;
4232 (* ==================================================================== *)
4235 let MCELL_ID_MXI_2 = prove_by_refinement (
4241 mcell i V ul = mcell j V vl /\
4242 ~NULLSET (mcell i V ul) /\
4245 ==> mxi V ul = mxi V vl`,
4246 [(REPEAT STRIP_TAC);
4248 (!k. i - 1 <= k /\ k <= 3
4249 ==> omega_list_n V ul k = omega_list_n V vl k)`);
4250 (MATCH_MP_TAC MCELL_ID_OMEGA_LIST_N);
4251 (ASM_REWRITE_TAC[]);
4253 (UP_ASM_TAC THEN STRIP_TAC);
4255 (ASM_CASES_TAC `hl (truncate_simplex 2 (ul:(real^3)list)) >= sqrt (&2)`);
4256 (ASM_CASES_TAC `hl (truncate_simplex 2 (vl:(real^3)list)) >= sqrt (&2)`);
4258 (REWRITE_WITH `mxi V ul = omega_list_n V ul 2`);
4259 (REWRITE_TAC[mxi] THEN COND_CASES_TAC);
4260 (ASM_REWRITE_TAC[]);
4265 (REWRITE_WITH `mxi V vl = omega_list_n V vl 2`);
4266 (REWRITE_TAC[mxi] THEN COND_CASES_TAC);
4267 (ASM_REWRITE_TAC[]);
4272 (FIRST_ASSUM MATCH_MP_TAC);
4273 (NEW_GOAL `i = 2 \/ i = 3`);
4277 (UP_ASM_TAC THEN REWRITE_TAC[REAL_ARITH `~(a >= b) <=> a < b`]);
4280 (ABBREV_TAC `xl = truncate_simplex 2 (ul:(real^3)list)`);
4281 (ABBREV_TAC `yl = truncate_simplex 2 (vl:(real^3)list)`);
4283 (NEW_GOAL `set_of_list (truncate_simplex (i - 1) (ul:(real^3)list)) =
4284 set_of_list (truncate_simplex (i - 1) vl)`);
4285 (NEW_GOAL `V INTER mcell i V ul = set_of_list (truncate_simplex (i - 1) ul)`);
4286 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
4287 (NEW_GOAL `i = 2 \/ i = 3`);
4289 (ASM_REWRITE_TAC[]);
4293 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
4294 (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4295 (NEW_GOAL `V INTER mcell j V vl = set_of_list (truncate_simplex (j - 1) vl)`);
4296 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
4297 (NEW_GOAL `i = 2 \/ i = 3`);
4299 (ASM_REWRITE_TAC[]);
4303 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
4304 (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4308 (NEW_GOAL `hl (xl:(real^3)list) <= dist (omega_list V xl, HD xl)`);
4309 (MATCH_MP_TAC Rogers.WAUFCHE1);
4310 (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN] THEN EXPAND_TAC "xl");
4311 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4312 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
4314 (NEW_GOAL `!w:real^3. w IN set_of_list yl
4315 ==> dist (circumcenter (set_of_list yl),w) = hl yl`);
4316 (MATCH_MP_TAC Rogers.HL_PROPERTIES);
4317 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `2` THEN ASM_REWRITE_TAC[]);
4319 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4320 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
4321 (UP_ASM_TAC THEN REWRITE_WITH `circumcenter (set_of_list yl) =
4322 omega_list V (yl:(real^3)list)`);
4323 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4324 (MATCH_MP_TAC Rogers.XNHPWAB1);
4325 (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN]);
4327 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4328 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
4331 (NEW_GOAL `hl yl = dist (omega_list V yl, HD xl)`);
4332 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4333 (FIRST_ASSUM MATCH_MP_TAC);
4334 (NEW_GOAL `HD (xl:(real^3)list) = HD (truncate_simplex (i - 1) ul)`);
4335 (REWRITE_WITH `HD (xl:(real^3)list) = HD ul`);
4337 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
4338 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1`);
4339 (MATCH_MP_TAC BARV_LENGTH_LEMMA);
4340 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4342 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4343 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
4344 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1`);
4345 (MATCH_MP_TAC BARV_LENGTH_LEMMA);
4346 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4347 (UNDISCH_TAC `i IN {2,3}` THEN REWRITE_TAC[SET_RULE
4348 `x IN {2,3} <=> x = 2 \/ x = 3`]);
4350 (ASM_REWRITE_TAC[]);
4351 (NEW_GOAL `HD (xl:(real^3)list) IN
4352 set_of_list (truncate_simplex (i - 1) ul)`);
4353 (REWRITE_TAC[ASSUME `HD (xl:(real^3)list) =
4354 HD (truncate_simplex (i - 1) ul)`]);
4355 (MATCH_MP_TAC Packing3.BARV_IMP_HD_IN_SET_OF_LIST);
4356 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `i - 1`);
4357 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4358 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
4359 (UNDISCH_TAC `j IN {2,3}` THEN REWRITE_TAC[SET_RULE
4360 `x IN {2,3} <=> x = 2 \/ x = 3`] THEN ARITH_TAC);
4362 (NEW_GOAL `set_of_list (truncate_simplex (j - 1) vl) SUBSET
4363 set_of_list (yl:(real^3)list)`);
4365 (MATCH_MP_TAC Rogers.TRUNCATE_SIMPLEX_SUBSET);
4366 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1`);
4367 (MATCH_MP_TAC BARV_LENGTH_LEMMA);
4368 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4369 (UNDISCH_TAC `j IN {2,3}` THEN REWRITE_TAC[SET_RULE
4370 `x IN {2,3} <=> x = 2 \/ x = 3`]);
4372 (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
4375 (NEW_GOAL `omega_list V xl = omega_list V yl`);
4376 (REWRITE_TAC[OMEGA_LIST]);
4377 (REWRITE_WITH `LENGTH (xl:(real^3)list) = 3 /\ LENGTH (yl:(real^3)list) = 3`);
4378 (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
4379 (REWRITE_TAC[ARITH_RULE `3 = 2 + 1`]);
4381 (MATCH_MP_TAC Packing3.LENGTH_TRUNCATE_SIMPLEX);
4382 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
4383 CARD (set_of_list ul) = 3 + 1`);
4384 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4385 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4387 (MATCH_MP_TAC Packing3.LENGTH_TRUNCATE_SIMPLEX);
4388 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\
4389 CARD (set_of_list vl) = 3 + 1`);
4390 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4391 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4393 (REWRITE_TAC[ARITH_RULE `3 - 1 = 2`]);
4394 (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
4396 `truncate_simplex 2 ul = truncate_simplex (2 + 0) (ul:(real^3)list) /\
4397 truncate_simplex 2 vl = truncate_simplex (2 + 0) (vl:(real^3)list)`);
4398 (REWRITE_TAC[ARITH_RULE `2 + 0 = 2`]);
4400 `omega_list_n V (truncate_simplex (2 + 0) ul) 2 = omega_list_n V ul 2`);
4401 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4402 (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
4403 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
4404 CARD (set_of_list ul) = 3 + 1`);
4405 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4406 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4410 `omega_list_n V (truncate_simplex (2 + 0) vl) 2 = omega_list_n V vl 2`);
4411 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4412 (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
4413 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\
4414 CARD (set_of_list vl) = 3 + 1`);
4415 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4416 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4419 (FIRST_ASSUM MATCH_MP_TAC);
4420 (NEW_GOAL `i = 2 \/ i = 3`);
4424 (ASM_REWRITE_TAC[]);
4425 (NEW_GOAL `hl (yl:(real^3)list) = dist (omega_list V xl, HD xl)`);
4426 (ASM_REWRITE_TAC[]);
4427 (ASM_REAL_ARITH_TAC);
4430 (* ======================================================================= *)
4432 (UP_ASM_TAC THEN REWRITE_TAC[REAL_ARITH `~(a >= b) <=> a < b`]);
4434 (ASM_CASES_TAC `hl (truncate_simplex 2 (vl:(real^3)list)) >= sqrt (&2)`);
4436 (ABBREV_TAC `xl = truncate_simplex 2 (ul:(real^3)list)`);
4437 (ABBREV_TAC `yl = truncate_simplex 2 (vl:(real^3)list)`);
4439 (NEW_GOAL `set_of_list (truncate_simplex (i - 1) (ul:(real^3)list)) =
4440 set_of_list (truncate_simplex (i - 1) vl)`);
4441 (NEW_GOAL `V INTER mcell i V ul = set_of_list (truncate_simplex (i - 1) ul)`);
4442 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
4443 (NEW_GOAL `i = 2 \/ i = 3`);
4445 (ASM_REWRITE_TAC[]);
4449 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
4450 (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4451 (NEW_GOAL `V INTER mcell j V vl = set_of_list (truncate_simplex (j - 1) vl)`);
4452 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
4453 (NEW_GOAL `i = 2 \/ i = 3`);
4455 (ASM_REWRITE_TAC[]);
4459 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
4460 (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4464 (NEW_GOAL `hl (yl:(real^3)list) <= dist (omega_list V yl, HD yl)`);
4465 (MATCH_MP_TAC Rogers.WAUFCHE1);
4466 (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN] THEN EXPAND_TAC "yl");
4467 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4468 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
4470 (NEW_GOAL `!w:real^3. w IN set_of_list xl
4471 ==> dist (circumcenter (set_of_list xl),w) = hl xl`);
4472 (MATCH_MP_TAC Rogers.HL_PROPERTIES);
4473 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `2` THEN ASM_REWRITE_TAC[]);
4475 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4476 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
4477 (UP_ASM_TAC THEN REWRITE_WITH `circumcenter (set_of_list xl) =
4478 omega_list V (xl:(real^3)list)`);
4479 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4480 (MATCH_MP_TAC Rogers.XNHPWAB1);
4481 (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN]);
4483 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4484 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
4487 (NEW_GOAL `hl xl = dist (omega_list V xl, HD yl)`);
4488 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4489 (FIRST_ASSUM MATCH_MP_TAC);
4490 (NEW_GOAL `HD (yl:(real^3)list) = HD (truncate_simplex (i - 1) vl)`);
4491 (REWRITE_WITH `HD (yl:(real^3)list) = HD vl`);
4493 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
4494 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1`);
4495 (MATCH_MP_TAC BARV_LENGTH_LEMMA);
4496 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4498 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4499 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
4500 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1`);
4501 (MATCH_MP_TAC BARV_LENGTH_LEMMA);
4502 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4503 (UNDISCH_TAC `i IN {2,3}` THEN REWRITE_TAC[SET_RULE
4504 `x IN {2,3} <=> x = 2 \/ x = 3`]);
4507 (NEW_GOAL `HD (yl:(real^3)list) IN
4508 set_of_list (truncate_simplex (i - 1) vl)`);
4509 (REWRITE_TAC[ASSUME `HD (yl:(real^3)list) =
4510 HD (truncate_simplex (i - 1) vl)`]);
4511 (MATCH_MP_TAC Packing3.BARV_IMP_HD_IN_SET_OF_LIST);
4512 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `i - 1`);
4513 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4514 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
4515 (UNDISCH_TAC `j IN {2,3}` THEN REWRITE_TAC[SET_RULE
4516 `x IN {2,3} <=> x = 2 \/ x = 3`] THEN ARITH_TAC);
4518 (NEW_GOAL `set_of_list (truncate_simplex (i - 1) vl) SUBSET
4519 set_of_list (xl:(real^3)list)`);
4521 (REWRITE_TAC[GSYM (ASSUME
4522 `set_of_list (truncate_simplex (i - 1) (ul:(real^3)list)) =
4523 set_of_list (truncate_simplex (i - 1) vl)`)]);
4524 (MATCH_MP_TAC Rogers.TRUNCATE_SIMPLEX_SUBSET);
4525 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1`);
4526 (MATCH_MP_TAC BARV_LENGTH_LEMMA);
4527 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4528 (UNDISCH_TAC `i IN {2,3}` THEN REWRITE_TAC[SET_RULE
4529 `x IN {2,3} <=> x = 2 \/ x = 3`]);
4531 (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
4534 (NEW_GOAL `omega_list V xl = omega_list V yl`);
4535 (REWRITE_TAC[OMEGA_LIST]);
4536 (REWRITE_WITH `LENGTH (xl:(real^3)list) = 3 /\ LENGTH (yl:(real^3)list) = 3`);
4537 (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
4538 (REWRITE_TAC[ARITH_RULE `3 = 2 + 1`]);
4540 (MATCH_MP_TAC Packing3.LENGTH_TRUNCATE_SIMPLEX);
4541 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
4542 CARD (set_of_list ul) = 3 + 1`);
4543 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4544 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4546 (MATCH_MP_TAC Packing3.LENGTH_TRUNCATE_SIMPLEX);
4547 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\
4548 CARD (set_of_list vl) = 3 + 1`);
4549 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4550 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4552 (REWRITE_TAC[ARITH_RULE `3 - 1 = 2`]);
4553 (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
4555 `truncate_simplex 2 ul = truncate_simplex (2 + 0) (ul:(real^3)list) /\
4556 truncate_simplex 2 vl = truncate_simplex (2 + 0) (vl:(real^3)list)`);
4557 (REWRITE_TAC[ARITH_RULE `2 + 0 = 2`]);
4559 `omega_list_n V (truncate_simplex (2 + 0) ul) 2 = omega_list_n V ul 2`);
4560 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4561 (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
4562 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
4563 CARD (set_of_list ul) = 3 + 1`);
4564 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4565 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4569 `omega_list_n V (truncate_simplex (2 + 0) vl) 2 = omega_list_n V vl 2`);
4570 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4571 (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
4572 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\
4573 CARD (set_of_list vl) = 3 + 1`);
4574 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4575 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4578 (FIRST_ASSUM MATCH_MP_TAC);
4579 (NEW_GOAL `i = 2 \/ i = 3`);
4583 (NEW_GOAL `hl (xl:(real^3)list) = dist (omega_list V yl, HD yl)`);
4584 (ASM_REWRITE_TAC[]);
4585 (ASM_REAL_ARITH_TAC);
4587 (UP_ASM_TAC THEN REWRITE_TAC[REAL_ARITH `~(a >= b) <=> a < b`]);
4590 (* ======================================================================= *)
4592 (NEW_GOAL `sqrt (&2) <= hl (ul:(real^3)list)`);
4593 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
4594 (ASM_CASES_TAC `i = 2`);
4595 (REWRITE_TAC[MCELL_EXPLICIT; ASSUME `i = 2`; mcell2]);
4598 (ASM_REWRITE_TAC[]);
4599 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4602 (REWRITE_TAC[MCELL_EXPLICIT; ASSUME `i = 3`; mcell3]);
4605 (ASM_REWRITE_TAC[]);
4606 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4608 (NEW_GOAL `sqrt (&2) <= hl (vl:(real^3)list)`);
4609 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
4610 (ASM_REWRITE_TAC[]);
4611 (ASM_CASES_TAC `j = 2`);
4612 (REWRITE_TAC[MCELL_EXPLICIT; ASSUME `j = 2`; mcell2]);
4615 (ASM_REWRITE_TAC[]);
4616 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4619 (REWRITE_TAC[MCELL_EXPLICIT; ASSUME `j = 3`; mcell3]);
4622 (ASM_REWRITE_TAC[]);
4623 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4625 (ABBREV_TAC `s2 = omega_list_n V ul 2`);
4626 (ABBREV_TAC `s3 = omega_list_n V ul 3`);
4627 (NEW_GOAL `s2 = omega_list_n V vl 2`);
4628 (EXPAND_TAC "s2" THEN FIRST_ASSUM MATCH_MP_TAC);
4629 (NEW_GOAL `i = 2 \/ i = 3`);
4632 (NEW_GOAL `s3 = omega_list_n V vl 3`);
4633 (EXPAND_TAC "s3" THEN FIRST_ASSUM MATCH_MP_TAC);
4634 (NEW_GOAL `i = 2 \/ i = 3`);
4637 (ABBREV_TAC `u0:real^3 = HD ul`);
4639 (NEW_GOAL `?s. between s (s2,s3) /\
4640 dist (u0,s) = sqrt (&2) /\
4642 (EXPAND_TAC "s2" THEN EXPAND_TAC "s3");
4643 (MATCH_MP_TAC MXI_EXPLICIT);
4644 (NEW_GOAL `?v0 u1 u2 u3. ul = [v0;u1;u2;u3:real^3]`);
4645 (MATCH_MP_TAC BARV_3_EXPLICIT);
4646 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4647 (UP_ASM_TAC THEN STRIP_TAC);
4648 (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN
4649 EXISTS_TAC `u3:real^3`);
4650 (ASM_REWRITE_TAC[]);
4651 (REWRITE_WITH `v0:real^3 = HD ul`);
4652 (REWRITE_TAC[ASSUME `ul = [v0;u1;u2;u3:real^3]`; HD]);
4653 (ASM_REWRITE_TAC[]);
4654 (UP_ASM_TAC THEN STRIP_TAC);
4655 (ABBREV_TAC `v0:real^3 = HD vl`);
4657 (NEW_GOAL `?t. between t (s2,s3) /\
4658 dist (v0,t) = sqrt (&2) /\
4660 (ASM_REWRITE_TAC[]);
4662 (MATCH_MP_TAC MXI_EXPLICIT);
4663 (NEW_GOAL `?w0 u1 u2 u3. vl = [w0;u1;u2;u3:real^3]`);
4664 (MATCH_MP_TAC BARV_3_EXPLICIT);
4665 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4666 (UP_ASM_TAC THEN STRIP_TAC);
4667 (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN
4668 EXISTS_TAC `u3:real^3`);
4669 (ASM_REWRITE_TAC[HD]);
4671 (REWRITE_TAC[ASSUME `vl = [w0;u1;u2;u3:real^3]`; HD]);
4672 (UP_ASM_TAC THEN STRIP_TAC);
4674 (NEW_GOAL `dist (u0:real^3, t) = sqrt (&2)`);
4675 (NEW_GOAL `(t:real^3) IN voronoi_list V (truncate_simplex 2 vl)`);
4676 (NEW_GOAL `s2 IN voronoi_list V (truncate_simplex 2 vl)`);
4677 (ASM_REWRITE_TAC[]);
4678 (MATCH_MP_TAC Rogers.OMEGA_LIST_N_IN_VORONOI_LIST_GEN);
4679 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
4680 (NEW_GOAL `s3 IN voronoi_list V (truncate_simplex 2 vl)`);
4681 (ASM_REWRITE_TAC[]);
4682 (MATCH_MP_TAC Rogers.OMEGA_LIST_N_IN_VORONOI_LIST_GEN);
4683 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
4684 (NEW_GOAL `convex hull {s2, s3:real^3} SUBSET
4685 convex hull (voronoi_list V (truncate_simplex 2 vl))`);
4686 (MATCH_MP_TAC Marchal_cells.CONVEX_HULL_SUBSET THEN ASM_SET_TAC[]);
4687 (UP_ASM_TAC THEN REWRITE_WITH
4688 `convex hull voronoi_list V (truncate_simplex 2 vl) =
4689 voronoi_list V (truncate_simplex 2 vl)`);
4690 (REWRITE_TAC[CONVEX_HULL_EQ; CONVEX_VORONOI_LIST]);
4692 (NEW_GOAL `t IN convex hull {s2, s3:real^3}`);
4693 (REWRITE_TAC[GSYM BETWEEN_IN_CONVEX_HULL]);
4694 (ASM_REWRITE_TAC[]);
4695 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
4697 (NEW_GOAL `u0:real^3 IN set_of_list (truncate_simplex 2 vl)`);
4700 (NEW_GOAL `set_of_list (truncate_simplex (i - 1) (ul:(real^3)list)) =
4701 set_of_list (truncate_simplex (i - 1) vl)`);
4702 (NEW_GOAL `V INTER mcell i V ul = set_of_list (truncate_simplex (i - 1) ul)`);
4703 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
4704 (NEW_GOAL `i = 2 \/ i = 3`);
4706 (ASM_REWRITE_TAC[]);
4710 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
4711 (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4712 (NEW_GOAL `V INTER mcell j V vl = set_of_list (truncate_simplex (j - 1) vl)`);
4713 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
4714 (NEW_GOAL `i = 2 \/ i = 3`);
4716 (ASM_REWRITE_TAC[]);
4720 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
4721 (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4724 (NEW_GOAL `HD (ul:(real^3)list) = HD (truncate_simplex (i - 1) ul)`);
4725 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4726 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
4727 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1`);
4728 (MATCH_MP_TAC BARV_LENGTH_LEMMA);
4729 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4730 (UNDISCH_TAC `i IN {2,3}` THEN REWRITE_TAC[SET_RULE
4731 `x IN {2,3} <=> x = 2 \/ x = 3`]);
4734 (NEW_GOAL `HD (ul:(real^3)list) IN
4735 set_of_list (truncate_simplex (i - 1) ul)`);
4736 (REWRITE_TAC[ASSUME `HD (ul:(real^3)list) =
4737 HD (truncate_simplex (i - 1) ul)`]);
4738 (MATCH_MP_TAC Packing3.BARV_IMP_HD_IN_SET_OF_LIST);
4739 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `i - 1`);
4740 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4741 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
4742 (UNDISCH_TAC `j IN {2,3}` THEN REWRITE_TAC[SET_RULE
4743 `x IN {2,3} <=> x = 2 \/ x = 3`] THEN ARITH_TAC);
4744 (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
4745 (NEW_GOAL `set_of_list (truncate_simplex (j - 1) vl) SUBSET
4746 set_of_list (truncate_simplex 2 (vl:(real^3)list))`);
4747 (MATCH_MP_TAC Rogers.TRUNCATE_SIMPLEX_SUBSET);
4748 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1`);
4749 (MATCH_MP_TAC BARV_LENGTH_LEMMA);
4750 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4751 (UNDISCH_TAC `j IN {2,3}` THEN REWRITE_TAC[SET_RULE
4752 `x IN {2,3} <=> x = 2 \/ x = 3`]);
4754 (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
4758 (NEW_GOAL `v0:real^3 IN set_of_list (truncate_simplex 2 vl)`);
4760 (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 2 vl)`);
4761 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4762 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
4763 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1`);
4764 (MATCH_MP_TAC BARV_LENGTH_LEMMA);
4765 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4766 (UNDISCH_TAC `j IN {2,3}` THEN REWRITE_TAC[SET_RULE
4767 `x IN {2,3} <=> x = 2 \/ x = 3`]);
4769 (MATCH_MP_TAC Packing3.BARV_IMP_HD_IN_SET_OF_LIST);
4770 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `2`);
4771 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4772 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
4775 (NEW_GOAL `t:real^3 IN voronoi_closed V u0`);
4776 (UNDISCH_TAC `t:real^3 IN voronoi_list V (truncate_simplex 2 vl)`);
4777 (REWRITE_TAC[VORONOI_LIST; VORONOI_SET;]);
4779 (UP_ASM_TAC THEN REWRITE_TAC[IN; IN_ELIM_THM; voronoi_closed]);
4781 (NEW_GOAL `dist (u0:real^3, t) <= dist (v0:real^3, t)`);
4782 (ONCE_REWRITE_TAC[DIST_SYM]);
4783 (FIRST_ASSUM MATCH_MP_TAC THEN EXPAND_TAC "v0");
4784 (REWRITE_TAC[MESON[IN] `(V:real^3->bool) s <=> s IN V`]);
4785 (NEW_GOAL `HD (vl:(real^3)list) IN set_of_list vl`);
4786 (MATCH_MP_TAC Packing3.BARV_IMP_HD_IN_SET_OF_LIST);
4787 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
4788 (NEW_GOAL `set_of_list (vl:(real^3)list) SUBSET V`);
4789 (MATCH_MP_TAC Packing3.BARV_SUBSET);
4790 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
4793 (NEW_GOAL `t:real^3 IN voronoi_closed V v0`);
4794 (UNDISCH_TAC `t:real^3 IN voronoi_list V (truncate_simplex 2 vl)`);
4795 (REWRITE_TAC[VORONOI_LIST; VORONOI_SET;]);
4797 (UP_ASM_TAC THEN REWRITE_TAC[IN; IN_ELIM_THM; voronoi_closed]);
4799 (NEW_GOAL `dist (v0:real^3, t) <= dist (u0:real^3, t)`);
4800 (ONCE_REWRITE_TAC[DIST_SYM]);
4801 (FIRST_ASSUM MATCH_MP_TAC THEN EXPAND_TAC "u0");
4802 (REWRITE_TAC[MESON[IN] `(V:real^3->bool) s <=> s IN V`]);
4803 (NEW_GOAL `HD (ul:(real^3)list) IN set_of_list ul`);
4804 (MATCH_MP_TAC Packing3.BARV_IMP_HD_IN_SET_OF_LIST);
4805 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
4806 (NEW_GOAL `set_of_list (ul:(real^3)list) SUBSET V`);
4807 (MATCH_MP_TAC Packing3.BARV_SUBSET);
4808 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
4810 (ASM_REAL_ARITH_TAC);
4812 (ASM_REWRITE_TAC[]);
4814 (NEW_GOAL `!n. between n (s2, s3:real^3) ==>
4815 dist (u0, n) pow 2 = dist (s2, n) pow 2 + dist (u0, s2) pow 2`);
4817 (REWRITE_TAC[dist]);
4818 (MATCH_MP_TAC PYTHAGORAS);
4819 (REWRITE_TAC[orthogonal]);
4820 (ABBREV_TAC `zl = truncate_simplex 2 (ul:(real^3)list)`);
4821 (REWRITE_WITH `s2:real^3 = circumcenter (set_of_list zl)`);
4822 (REWRITE_WITH `s2 = omega_list V zl`);
4823 (EXPAND_TAC "s2" THEN EXPAND_TAC "zl");
4824 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4825 (MATCH_MP_TAC Packing3.OMEGA_LIST_LEMMA);
4826 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
4827 CARD (set_of_list ul) = 3 + 1`);
4828 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4829 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4831 (MATCH_MP_TAC Rogers.XNHPWAB1);
4832 (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN]);
4834 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4835 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
4836 (MATCH_MP_TAC Rogers.MHFTTZN4);
4837 (EXISTS_TAC `V:real^3->bool`);
4840 (ASM_REWRITE_TAC[]);
4842 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4843 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
4845 (NEW_GOAL `s2 IN voronoi_list V zl`);
4846 (REWRITE_WITH `s2 = omega_list V zl`);
4847 (EXPAND_TAC "s2" THEN EXPAND_TAC "zl");
4848 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4849 (MATCH_MP_TAC Packing3.OMEGA_LIST_LEMMA);
4850 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
4851 CARD (set_of_list ul) = 3 + 1`);
4852 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4853 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4855 (MATCH_MP_TAC Packing3.OMEGA_LIST_IN_VORONOI_LIST);
4858 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4859 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
4861 (NEW_GOAL `s3 IN voronoi_list V zl`);
4862 (EXPAND_TAC "s3" THEN EXPAND_TAC "zl");
4863 (MATCH_MP_TAC Rogers.OMEGA_LIST_N_IN_VORONOI_LIST_GEN);
4864 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3 /\ 3 <= 3`]);
4865 (NEW_GOAL `affine hull {s2, s3} SUBSET affine hull voronoi_list V zl`);
4866 (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);
4868 (NEW_GOAL `n IN affine hull {s2, s3:real^3}`);
4869 (NEW_GOAL `convex hull {s2,s3} SUBSET affine hull {s2,s3:real^3}`);
4870 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4871 (NEW_GOAL `n IN convex hull {s2, s3:real^3}`);
4872 (REWRITE_TAC[GSYM BETWEEN_IN_CONVEX_HULL]);
4873 (ASM_REWRITE_TAC[]);
4877 (MATCH_MP_TAC Marchal_cells_2_new.IN_AFFINE_KY_LEMMA1);
4878 (REWRITE_WITH `u0:real^3 = HD zl`);
4879 (EXPAND_TAC "zl" THEN EXPAND_TAC "u0");
4880 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4881 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
4882 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
4883 CARD (set_of_list ul) = 3 + 1`);
4884 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4885 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4887 (MATCH_MP_TAC Packing3.HD_IN_SET_OF_LIST);
4889 (REWRITE_WITH `LENGTH (zl:(real^3)list) = 2 + 1 /\
4890 CARD (set_of_list zl) = 2 + 1`);
4891 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4892 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4894 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4895 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
4898 (NEW_GOAL `dist (u0,s) pow 2 = dist (s2,s:real^3) pow 2 + dist (u0,s2) pow 2`);
4900 (NEW_GOAL `dist (u0,t) pow 2 = dist (s2,t:real^3) pow 2 + dist (u0,s2) pow 2`);
4902 (NEW_GOAL `dist (s2, s:real^3) = dist (s2, t)`);
4903 (REWRITE_TAC[DIST_EQ]);
4904 (UP_ASM_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC);
4906 (UNDISCH_TAC `between s (s2, s3:real^3)` THEN
4907 UNDISCH_TAC `between t (s2, s3:real^3)`);
4908 (REWRITE_TAC[BETWEEN_IN_CONVEX_HULL; CONVEX_HULL_2; IN; IN_ELIM_THM]);
4910 (UNDISCH_TAC `dist (s2,s) = dist (s2,t:real^3)`);
4911 (REWRITE_TAC[dist;ASSUME `s = u' % s2 + v' % s3:real^3`;
4912 ASSUME `t = u % s2 + v % s3:real^3` ]);
4913 (REWRITE_WITH `s2 - (u' % s2 + v' % s3) =
4914 (u' + v') % s2 - (u' % s2 + v' % s3:real^3)`);
4915 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
4916 (REWRITE_WITH `s2 - (u % s2 + v % s3) =
4917 (u + v) % s2 - (u % s2 + v % s3:real^3)`);
4918 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
4919 (REWRITE_TAC[VECTOR_ARITH `(u + v) % s - (u % s + v % t) = v % (s - t)`]);
4920 (REWRITE_TAC[NORM_MUL]);
4921 (REWRITE_WITH `abs v = v /\ abs v' = v'`);
4922 (ASM_SIMP_TAC[REAL_ABS_REFL]);
4923 (REWRITE_TAC[REAL_ARITH `a * b = c * b <=> (a - c) * b = &0`;REAL_ENTIRE]);
4926 (REWRITE_WITH `v = v':real /\ u = u':real`);
4927 (ASM_REAL_ARITH_TAC);
4928 (UP_ASM_TAC THEN REWRITE_TAC[NORM_EQ_0]);
4929 (REWRITE_TAC[VECTOR_ARITH `a - b = vec 0 <=> a = b`] THEN STRIP_TAC);
4931 (NEW_GOAL `hl (ul:(real^3)list) <= dist (s3,u0:real^3)`);
4932 (REWRITE_WITH `s3 = omega_list V ul /\ u0 = HD ul`);
4934 (REWRITE_TAC[GSYM (ASSUME `omega_list_n V ul 3 = s3`); OMEGA_LIST]);
4935 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
4936 CARD (set_of_list ul) = 3 + 1`);
4937 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4938 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4939 (REWRITE_TAC[ARITH_RULE `(3 + 1) - 1 = 3`]);
4940 (ASM_REWRITE_TAC[]);
4941 (MATCH_MP_TAC Rogers.WAUFCHE1);
4942 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[IN]);
4943 (ABBREV_TAC `zl:(real^3)list = truncate_simplex 2 ul`);
4944 (NEW_GOAL `hl (zl:(real^3)list) = dist (s3, u0:real^3)`);
4946 (REWRITE_WITH `s3 = omega_list V zl /\ u0 = HD zl`);
4948 (REWRITE_TAC[GSYM (ASSUME `s2:real^3 = s3`); OMEGA_LIST]);
4951 (REWRITE_WITH `LENGTH (zl:(real^3)list) = 2 + 1 /\
4952 CARD (set_of_list zl) = 2 + 1`);
4953 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4954 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4956 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4957 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
4958 (REWRITE_TAC[ARITH_RULE `(2 + 1) - 1 = 2`]);
4961 (REWRITE_WITH `truncate_simplex 2 (ul:(real^3)list) =
4962 truncate_simplex (2 + 0) (ul:(real^3)list)`);
4963 (REWRITE_TAC[ARITH_RULE `2 + 0 = 2`]);
4964 (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
4965 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
4966 CARD (set_of_list ul) = 3 + 1`);
4967 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4968 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4971 (EXPAND_TAC "zl" THEN EXPAND_TAC "u0");
4972 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4973 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
4974 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
4975 CARD (set_of_list ul) = 3 + 1`);
4976 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4977 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4979 (MATCH_MP_TAC Rogers.WAUFCHE2);
4980 (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN]);
4982 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4983 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
4984 (ASM_REAL_ARITH_TAC);
4985 (ASM_MESON_TAC[])]);;
4987 (* ==================================================================== *)
4990 let DIHV_SYM_3 = prove_by_refinement (
4992 {a,b:real^3} = {c,d} /\ {x,y} = {z,t} ==>
4993 dihV a b x y = dihV c d z t`,
4994 [(REWRITE_TAC[SET_RULE `{a,b} = {c,d} <=>
4995 (a = c /\ b = d) \/ (a = d /\ b = c)`]);
4997 (ASM_REWRITE_TAC[]);
4998 (ASM_REWRITE_TAC[DIHV_SYM_2]);
4999 (ASM_REWRITE_TAC[DIHV_SYM_2; DIHV_SYM]);
5000 (ASM_REWRITE_TAC[DIHV_SYM_2; DIHV_SYM])]);;
5002 (* ==================================================================== *)
5005 let DIHX_SYM = prove_by_refinement (
5007 packing V /\ saturated V /\ mcell_set V X /\ {u, v} IN edgeX V X
5008 ==> dihX V X (u,v) = dihX V X (v,u)`,
5009 [(REPEAT STRIP_TAC);
5010 (REWRITE_TAC[dihX]);
5014 (UP_ASM_TAC THEN MESON_TAC[]);
5016 (UP_ASM_TAC THEN MESON_TAC[]);
5017 (DEL_TAC THEN REWRITE_TAC[cell_params_d] THEN REPEAT LET_TAC);
5019 (UNDISCH_TAC `{u, v} IN edgeX V X` THEN REWRITE_TAC[edgeX; IN;IN_ELIM_THM]);
5020 (REWRITE_WITH `VX V X = V INTER X`);
5021 (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
5022 (ASM_REWRITE_TAC[]);
5023 (UNDISCH_TAC `mcell_set V X` THEN REWRITE_TAC[mcell_set;IN_ELIM_THM;IN]);
5026 (MP_TAC (ASSUME `(V INTER X) (u':real^3)`) THEN
5027 MP_TAC (ASSUME `(V INTER X) (v':real^3)`));
5028 (UNDISCH_TAC `mcell_set V X` THEN REWRITE_TAC[mcell_set_2;IN_ELIM_THM;IN]);
5030 (REWRITE_TAC[ASSUME `X = mcell i V ul''`]);
5031 (REWRITE_WITH `(V INTER mcell i V ul'') = set_of_list (truncate_simplex (i-1) ul'')`);
5032 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
5033 (ASM_REWRITE_TAC[]);
5034 (REWRITE_TAC[GSYM (ASSUME `X = mcell i V ul''`)]);
5036 (REWRITE_TAC[ARITH_RULE `1 <= i <=> ~(i = 0)`]);
5038 (MP_TAC (ASSUME `(V INTER X) (u':real^3)`));
5039 (REWRITE_WITH `V INTER X:real^3->bool = {}`);
5040 (ASM_REWRITE_TAC[]);
5041 (MATCH_MP_TAC Lepjbdj.LEPJBDJ_0);
5042 (ASM_REWRITE_TAC[]);
5043 (REWRITE_TAC[MESON[IN] `{} x <=> x IN {}`]);
5045 (UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[NEGLIGIBLE_EMPTY]);
5047 (ASM_CASES_TAC `i <= 1`);
5048 (NEW_GOAL `?w0 w1 w2 w3. ul'' = [w0;w1;w2;w3:real^3]`);
5049 (MATCH_MP_TAC BARV_3_EXPLICIT);
5050 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5051 (UP_ASM_TAC THEN STRIP_TAC);
5052 (UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (v':real^3)` THEN
5053 UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (u':real^3)`);
5054 (NEW_GOAL `i - 1 = 0`);
5055 (UNDISCH_TAC `i <= 1` THEN ARITH_TAC);
5056 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_0; set_of_list;
5057 MESON[IN] `(A:real^3->bool) b <=> b IN A`]);
5058 (REWRITE_TAC[SET_RULE `a IN {b} <=> a = b`]);
5059 (UNDISCH_TAC `~(u' = v':real^3)`);
5061 (UP_ASM_TAC THEN REWRITE_TAC[ARITH_RULE `~(i <= 1) <=> 2 <= i`]
5064 (* ========================================================================== *)
5066 (NEW_GOAL `?p. p permutes 0..i - 1 /\
5067 initial_sublist [u:real^3; v] (left_action_list p ul'')`);
5068 (NEW_GOAL `?w0 w1 w2 w3. ul'' = [w0;w1;w2;w3:real^3]`);
5069 (MATCH_MP_TAC BARV_3_EXPLICIT);
5070 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5071 (UP_ASM_TAC THEN STRIP_TAC);
5073 (ASM_CASES_TAC `i = 2`);
5074 (UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (v':real^3)` THEN
5075 UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (u':real^3)`);
5076 (NEW_GOAL `i - 1 = 1`);
5077 (UNDISCH_TAC `i = 2` THEN ARITH_TAC);
5078 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; set_of_list;
5079 MESON[IN] `(A:real^3->bool) b <=> b IN A`]);
5081 (ASM_CASES_TAC `u = w0:real^3`);
5082 (NEW_GOAL `v = w1:real^3`);
5083 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC
5084 `~(u' = v':real^3)` THEN UNDISCH_TAC `{u,v} = {u',v':real^3}`
5086 (EXISTS_TAC `I:num->num`);
5087 (ASM_REWRITE_TAC[PERMUTES_I; Packing3.LEFT_ACTION_LIST_I]);
5088 (REWRITE_WITH `initial_sublist [w0; w1] [w0; w1; w2; w3] /\
5089 LENGTH [w0;w1:real^3] = 1 + 1`);
5090 (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5091 (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; LENGTH] THEN ARITH_TAC);
5092 (NEW_GOAL `v = w0:real^3 /\ u = w1:real^3`);
5093 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC
5094 `~(u' = v':real^3)` THEN UNDISCH_TAC `{u,v} = {u',v':real^3}`
5096 (ASM_REWRITE_TAC[]);
5097 (NEW_GOAL `?p. p permutes 0..1 /\
5098 [w1; w0; w2; w3:real^3] = left_action_list p ul''`);
5099 (MATCH_MP_TAC Qzksykg.TWO_REARRANGEMENT_LEMMA);
5100 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5101 (UP_ASM_TAC THEN ASM_REWRITE_TAC[] THEN STRIP_TAC);
5102 (EXISTS_TAC `p:num->num` THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[GSYM
5103 (ASSUME `[w1; w0; w2; w3] = left_action_list p [w0; w1; w2; w3:real^3]`)]);
5104 (REWRITE_WITH `initial_sublist [w1; w0] [w1; w0; w2; w3] /\
5105 LENGTH [w1;w0:real^3] = 1 + 1`);
5106 (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5107 (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; LENGTH] THEN ARITH_TAC);
5109 (ASM_CASES_TAC `i = 3`);
5110 (UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (v':real^3)` THEN
5111 UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (u':real^3)`);
5112 (ASM_REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; TRUNCATE_SIMPLEX_EXPLICIT_2;
5113 set_of_list; MESON[IN] `(A:real^3->bool) b <=> b IN A`]);
5116 (NEW_GOAL `u IN {w0, w1, w2} /\ v IN {w0, w1, w2:real^3} /\ ~(u = v)`);
5118 (UP_ASM_TAC THEN STRIP_TAC);
5120 (NEW_GOAL `?a. {u,v, a} = {w0, w1, w2:real^3}`);
5121 (NEW_GOAL `?w:real^3. w IN {w0, w1, w2} DIFF {u, v}`);
5122 (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
5123 (REWRITE_WITH `{w0, w1, w2} DIFF {u, v:real^3} = {} <=>
5124 CARD ({w0, w1, w2} DIFF {u, v}) = 0`);
5125 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5126 (MATCH_MP_TAC CARD_EQ_0);
5127 (MATCH_MP_TAC FINITE_SUBSET);
5128 (EXISTS_TAC `{w0, w1, w2:real^3}`);
5129 (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
5131 (NEW_GOAL `CARD {w0, w1, w2} = CARD ({w0, w1, w2} DIFF {u, v:real^3}) +
5133 (MATCH_MP_TAC Hypermap.CARD_MINUS_DIFF_TWO_SET);
5134 (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
5135 (UP_ASM_TAC THEN REWRITE_WITH `CARD ({w0, w1, w2:real^3}) = 3`);
5136 (ASM_CASES_TAC `CARD {w0,w1,w2:real^3} <= 2`);
5138 (NEW_GOAL `CARD {w0, w1, w2, w3:real^3} = 4`);
5139 (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5140 (ASM_REWRITE_TAC[set_of_list]);
5141 (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\
5142 CARD (set_of_list ul'') = 3 + 1`);
5143 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5144 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5146 (UP_ASM_TAC THEN REWRITE_WITH `CARD {w0, w1, w2, w3} =
5147 CARD {w3, w0,w1,w2:real^3}`);
5148 (AP_TERM_TAC THEN SET_TAC[]);
5149 (NEW_GOAL `CARD ({w3, w0, w1, w2}) <= SUC (CARD {w0, w1, w2:real^3})`);
5150 (SIMP_TAC[Geomdetail.CARD_CLAUSES_IMP; Geomdetail.FINITE6]);
5151 (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
5153 (NEW_GOAL `CARD {w0, w1, w2:real^3} <= 3`);
5154 (REWRITE_TAC[Geomdetail.CARD3]);
5155 (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
5157 (SUBGOAL_THEN `CARD {u,v:real^3} <= 2` MP_TAC);
5158 (REWRITE_TAC[Geomdetail.CARD2]);
5160 (UP_ASM_TAC THEN STRIP_TAC);
5161 (EXISTS_TAC `w:real^3`);
5162 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5163 (UP_ASM_TAC THEN STRIP_TAC);
5165 (NEW_GOAL `?p. p permutes 0..2 /\
5166 [u; v; a; w3] = left_action_list p [w0; w1; w2; w3:real^3]`);
5167 (MATCH_MP_TAC LEFT_ACTION_LIST_2_EXISTS);
5168 (ASM_REWRITE_TAC[]);
5170 (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5171 (ASM_REWRITE_TAC[set_of_list]);
5172 (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\
5173 CARD (set_of_list ul'') = 3 + 1`);
5174 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5175 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5177 (UP_ASM_TAC THEN STRIP_TAC);
5179 (EXISTS_TAC `p:num->num`);
5180 (ASM_REWRITE_TAC[]);
5181 (REWRITE_TAC[GSYM (ASSUME `[u; v; a; w3:real^3] =
5182 left_action_list p [w0; w1; w2; w3]`)]);
5183 (REWRITE_WITH `initial_sublist [u; v] [u; v; a; w3] /\
5184 LENGTH [u; v:real^3] = 1 + 1`);
5185 (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST; LENGTH;
5186 TRUNCATE_SIMPLEX_EXPLICIT_1] THEN ARITH_TAC);
5190 (UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (v':real^3)` THEN
5191 UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (u':real^3)`);
5192 (ASM_REWRITE_TAC[ARITH_RULE `4 - 1 = 3`; TRUNCATE_SIMPLEX_EXPLICIT_3;
5193 set_of_list; MESON[IN] `(A:real^3->bool) b <=> b IN A`]);
5196 (NEW_GOAL `u IN {w0, w1, w2, w3} /\ v IN {w0, w1, w2, w3:real^3} /\
5199 (UP_ASM_TAC THEN STRIP_TAC);
5201 (NEW_GOAL `?a b. {u,v,a,b} = {w0, w1, w2, w3:real^3}`);
5203 (NEW_GOAL `?w:real^3. w IN {w0, w1, w2, w3} DIFF {u, v}`);
5204 (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
5205 (REWRITE_WITH `{w0, w1, w2, w3} DIFF {u, v:real^3} = {} <=>
5206 CARD ({w0, w1, w2, w3} DIFF {u, v}) = 0`);
5207 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5208 (MATCH_MP_TAC CARD_EQ_0);
5209 (MATCH_MP_TAC FINITE_SUBSET);
5210 (EXISTS_TAC `{w0, w1, w2, w3:real^3}`);
5211 (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
5213 (NEW_GOAL `CARD {w0, w1, w2, w3} =
5214 CARD ({w0, w1, w2, w3} DIFF {u, v:real^3}) + CARD {u, v}`);
5215 (MATCH_MP_TAC Hypermap.CARD_MINUS_DIFF_TWO_SET);
5216 (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
5218 (UP_ASM_TAC THEN REWRITE_WITH `CARD ({w0, w1, w2, w3:real^3}) = 3 + 1`);
5219 (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5220 (ASM_REWRITE_TAC[set_of_list]);
5221 (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\
5222 CARD (set_of_list ul'') = 3 + 1`);
5223 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5224 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5225 (NEW_GOAL `CARD {u, v:real^3} <= 2`);
5226 (REWRITE_TAC[Geomdetail.CARD2]);
5227 (UP_ASM_TAC THEN ARITH_TAC);
5228 (UP_ASM_TAC THEN STRIP_TAC);
5230 (NEW_GOAL `?m:real^3. m IN {w0, w1, w2, w3} DIFF {u, v, w}`);
5231 (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
5232 (REWRITE_WITH `{w0, w1, w2, w3} DIFF {u, v, w:real^3} = {} <=>
5233 CARD ({w0, w1, w2, w3} DIFF {u, v, w}) = 0`);
5234 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5235 (MATCH_MP_TAC CARD_EQ_0);
5236 (MATCH_MP_TAC FINITE_SUBSET);
5237 (EXISTS_TAC `{w0, w1, w2, w3:real^3}`);
5238 (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
5240 (NEW_GOAL `CARD ({w0, w1, w2, w3} DIFF {u,v,w:real^3}) =
5241 CARD {w0, w1, w2, w3} - CARD {u,v,w}`);
5242 (MATCH_MP_TAC CARD_DIFF);
5243 (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
5245 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5246 (UP_ASM_TAC THEN REWRITE_WITH `CARD ({w0, w1, w2, w3:real^3}) = 3 + 1`);
5247 (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5248 (ASM_REWRITE_TAC[set_of_list]);
5249 (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\
5250 CARD (set_of_list ul'') = 3 + 1`);
5251 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5252 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5253 (NEW_GOAL `CARD {u, v, w:real^3} <= 3`);
5254 (REWRITE_TAC[Geomdetail.CARD3]);
5255 (UP_ASM_TAC THEN ARITH_TAC);
5256 (UP_ASM_TAC THEN STRIP_TAC);
5258 (EXISTS_TAC `w:real^3` THEN EXISTS_TAC `m:real^3`);
5259 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN
5260 UP_ASM_TAC THEN SET_TAC[]);
5261 (UP_ASM_TAC THEN STRIP_TAC);
5263 (NEW_GOAL `?p. p permutes 0..3 /\
5264 [u; v; a; b] = left_action_list p [w0; w1; w2; w3:real^3]`);
5265 (MATCH_MP_TAC LEFT_ACTION_LIST_3_EXISTS);
5266 (ASM_REWRITE_TAC[]);
5268 (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5269 (ASM_REWRITE_TAC[set_of_list]);
5270 (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\
5271 CARD (set_of_list ul'') = 3 + 1`);
5272 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5273 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5275 (UP_ASM_TAC THEN STRIP_TAC);
5277 (EXISTS_TAC `p:num->num`);
5278 (ASM_REWRITE_TAC[]);
5279 (REWRITE_TAC[GSYM (ASSUME `[u; v; a; b:real^3] =
5280 left_action_list p [w0; w1; w2; w3]`)]);
5281 (REWRITE_WITH `initial_sublist [u; v] [u; v; a; b] /\
5282 LENGTH [u; v:real^3] = 1 + 1`);
5283 (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST; LENGTH;
5284 TRUNCATE_SIMPLEX_EXPLICIT_1] THEN ARITH_TAC);
5285 (UP_ASM_TAC THEN STRIP_TAC);
5287 (* ========================================================================== *)
5289 (NEW_GOAL `?q. q permutes 0..i - 1 /\
5290 initial_sublist [v:real^3; u] (left_action_list q ul'')`);
5291 (NEW_GOAL `?w0 w1 w2 w3. ul'' = [w0;w1;w2;w3:real^3]`);
5292 (MATCH_MP_TAC BARV_3_EXPLICIT);
5293 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5294 (UP_ASM_TAC THEN STRIP_TAC);
5296 (ASM_CASES_TAC `i = 2`);
5297 (UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (v':real^3)` THEN
5298 UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (u':real^3)`);
5299 (NEW_GOAL `i - 1 = 1`);
5300 (UNDISCH_TAC `i = 2` THEN ARITH_TAC);
5301 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; set_of_list;
5302 MESON[IN] `(A:real^3->bool) b <=> b IN A`]);
5304 (ASM_CASES_TAC `v = w0:real^3`);
5305 (NEW_GOAL `u = w1:real^3`);
5306 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC
5307 `~(u' = v':real^3)` THEN UNDISCH_TAC `{u,v} = {u',v':real^3}`
5309 (EXISTS_TAC `I:num->num`);
5310 (ASM_REWRITE_TAC[PERMUTES_I; Packing3.LEFT_ACTION_LIST_I]);
5311 (REWRITE_WITH `initial_sublist [w0; w1] [w0; w1; w2; w3] /\
5312 LENGTH [w0;w1:real^3] = 1 + 1`);
5313 (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5314 (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; LENGTH] THEN ARITH_TAC);
5315 (NEW_GOAL `u = w0:real^3 /\ v = w1:real^3`);
5316 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC
5317 `~(u' = v':real^3)` THEN UNDISCH_TAC `{u,v} = {u',v':real^3}`
5319 (ASM_REWRITE_TAC[]);
5320 (NEW_GOAL `?q. q permutes 0..1 /\
5321 [w1; w0; w2; w3:real^3] = left_action_list q ul''`);
5322 (MATCH_MP_TAC Qzksykg.TWO_REARRANGEMENT_LEMMA);
5323 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5324 (UP_ASM_TAC THEN ASM_REWRITE_TAC[] THEN STRIP_TAC);
5325 (EXISTS_TAC `q:num->num` THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[GSYM
5326 (ASSUME `[w1; w0; w2; w3] = left_action_list q [w0; w1; w2; w3:real^3]`)]);
5327 (REWRITE_WITH `initial_sublist [w1; w0] [w1; w0; w2; w3] /\
5328 LENGTH [w1;w0:real^3] = 1 + 1`);
5329 (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5330 (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; LENGTH] THEN ARITH_TAC);
5332 (ASM_CASES_TAC `i = 3`);
5333 (UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (v':real^3)` THEN
5334 UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (u':real^3)`);
5335 (ASM_REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; TRUNCATE_SIMPLEX_EXPLICIT_2;
5336 set_of_list; MESON[IN] `(A:real^3->bool) b <=> b IN A`]);
5339 (NEW_GOAL `u IN {w0, w1, w2} /\ v IN {w0, w1, w2:real^3} /\ ~(u = v)`);
5341 (UP_ASM_TAC THEN STRIP_TAC);
5343 (NEW_GOAL `?a. {u,v, a} = {w0, w1, w2:real^3}`);
5344 (NEW_GOAL `?w:real^3. w IN {w0, w1, w2} DIFF {u, v}`);
5345 (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
5346 (REWRITE_WITH `{w0, w1, w2} DIFF {u, v:real^3} = {} <=>
5347 CARD ({w0, w1, w2} DIFF {u, v}) = 0`);
5348 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5349 (MATCH_MP_TAC CARD_EQ_0);
5350 (MATCH_MP_TAC FINITE_SUBSET);
5351 (EXISTS_TAC `{w0, w1, w2:real^3}`);
5352 (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
5354 (NEW_GOAL `CARD {w0, w1, w2} = CARD ({w0, w1, w2} DIFF {u, v:real^3}) +
5356 (MATCH_MP_TAC Hypermap.CARD_MINUS_DIFF_TWO_SET);
5357 (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
5358 (UP_ASM_TAC THEN REWRITE_WITH `CARD ({w0, w1, w2:real^3}) = 3`);
5359 (ASM_CASES_TAC `CARD {w0,w1,w2:real^3} <= 2`);
5361 (NEW_GOAL `CARD {w0, w1, w2, w3:real^3} = 4`);
5362 (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5363 (ASM_REWRITE_TAC[set_of_list]);
5364 (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\
5365 CARD (set_of_list ul'') = 3 + 1`);
5366 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5367 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5369 (UP_ASM_TAC THEN REWRITE_WITH `CARD {w0, w1, w2, w3} =
5370 CARD {w3, w0,w1,w2:real^3}`);
5371 (AP_TERM_TAC THEN SET_TAC[]);
5372 (NEW_GOAL `CARD ({w3, w0, w1, w2}) <= SUC (CARD {w0, w1, w2:real^3})`);
5373 (SIMP_TAC[Geomdetail.CARD_CLAUSES_IMP; Geomdetail.FINITE6]);
5374 (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
5376 (NEW_GOAL `CARD {w0, w1, w2:real^3} <= 3`);
5377 (REWRITE_TAC[Geomdetail.CARD3]);
5378 (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
5380 (SUBGOAL_THEN `CARD {u,v:real^3} <= 2` MP_TAC);
5381 (REWRITE_TAC[Geomdetail.CARD2]);
5383 (UP_ASM_TAC THEN STRIP_TAC);
5384 (EXISTS_TAC `w:real^3`);
5385 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5386 (UP_ASM_TAC THEN STRIP_TAC);
5387 (UP_ASM_TAC THEN REWRITE_WITH `{u,v,a} = {v, u, a:real^3}`);
5391 (NEW_GOAL `?q. q permutes 0..2 /\
5392 [v; u; a; w3] = left_action_list q [w0; w1; w2; w3:real^3]`);
5393 (MATCH_MP_TAC LEFT_ACTION_LIST_2_EXISTS);
5394 (ASM_REWRITE_TAC[]);
5396 (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5397 (ASM_REWRITE_TAC[set_of_list]);
5398 (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\
5399 CARD (set_of_list ul'') = 3 + 1`);
5400 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5401 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5403 (UP_ASM_TAC THEN STRIP_TAC);
5405 (EXISTS_TAC `q:num->num`);
5406 (ASM_REWRITE_TAC[]);
5407 (REWRITE_TAC[GSYM (ASSUME `[v; u; a; w3:real^3] =
5408 left_action_list q [w0; w1; w2; w3]`)]);
5409 (REWRITE_WITH `initial_sublist [v; u] [v; u; a; w3] /\
5410 LENGTH [v; u:real^3] = 1 + 1`);
5411 (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST; LENGTH;
5412 TRUNCATE_SIMPLEX_EXPLICIT_1] THEN ARITH_TAC);
5416 (UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (v':real^3)` THEN
5417 UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (u':real^3)`);
5418 (ASM_REWRITE_TAC[ARITH_RULE `4 - 1 = 3`; TRUNCATE_SIMPLEX_EXPLICIT_3;
5419 set_of_list; MESON[IN] `(A:real^3->bool) b <=> b IN A`]);
5422 (NEW_GOAL `u IN {w0, w1, w2, w3} /\ v IN {w0, w1, w2, w3:real^3} /\
5425 (UP_ASM_TAC THEN STRIP_TAC);
5427 (NEW_GOAL `?a b. {u,v,a,b} = {w0, w1, w2, w3:real^3}`);
5429 (NEW_GOAL `?w:real^3. w IN {w0, w1, w2, w3} DIFF {u, v}`);
5430 (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
5431 (REWRITE_WITH `{w0, w1, w2, w3} DIFF {u, v:real^3} = {} <=>
5432 CARD ({w0, w1, w2, w3} DIFF {u, v}) = 0`);
5433 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5434 (MATCH_MP_TAC CARD_EQ_0);
5435 (MATCH_MP_TAC FINITE_SUBSET);
5436 (EXISTS_TAC `{w0, w1, w2, w3:real^3}`);
5437 (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
5439 (NEW_GOAL `CARD {w0, w1, w2, w3} =
5440 CARD ({w0, w1, w2, w3} DIFF {u, v:real^3}) + CARD {u, v}`);
5441 (MATCH_MP_TAC Hypermap.CARD_MINUS_DIFF_TWO_SET);
5442 (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
5444 (UP_ASM_TAC THEN REWRITE_WITH `CARD ({w0, w1, w2, w3:real^3}) = 3 + 1`);
5445 (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5446 (ASM_REWRITE_TAC[set_of_list]);
5447 (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\
5448 CARD (set_of_list ul'') = 3 + 1`);
5449 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5450 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5451 (NEW_GOAL `CARD {u, v:real^3} <= 2`);
5452 (REWRITE_TAC[Geomdetail.CARD2]);
5453 (UP_ASM_TAC THEN ARITH_TAC);
5454 (UP_ASM_TAC THEN STRIP_TAC);
5456 (NEW_GOAL `?m:real^3. m IN {w0, w1, w2, w3} DIFF {u, v, w}`);
5457 (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
5458 (REWRITE_WITH `{w0, w1, w2, w3} DIFF {u, v, w:real^3} = {} <=>
5459 CARD ({w0, w1, w2, w3} DIFF {u, v, w}) = 0`);
5460 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5461 (MATCH_MP_TAC CARD_EQ_0);
5462 (MATCH_MP_TAC FINITE_SUBSET);
5463 (EXISTS_TAC `{w0, w1, w2, w3:real^3}`);
5464 (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
5466 (NEW_GOAL `CARD ({w0, w1, w2, w3} DIFF {u,v,w:real^3}) =
5467 CARD {w0, w1, w2, w3} - CARD {u,v,w}`);
5468 (MATCH_MP_TAC CARD_DIFF);
5469 (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
5471 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5472 (UP_ASM_TAC THEN REWRITE_WITH `CARD ({w0, w1, w2, w3:real^3}) = 3 + 1`);
5473 (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5474 (ASM_REWRITE_TAC[set_of_list]);
5475 (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\
5476 CARD (set_of_list ul'') = 3 + 1`);
5477 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5478 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5479 (NEW_GOAL `CARD {u, v, w:real^3} <= 3`);
5480 (REWRITE_TAC[Geomdetail.CARD3]);
5481 (UP_ASM_TAC THEN ARITH_TAC);
5482 (UP_ASM_TAC THEN STRIP_TAC);
5484 (EXISTS_TAC `w:real^3` THEN EXISTS_TAC `m:real^3`);
5485 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN
5486 UP_ASM_TAC THEN SET_TAC[]);
5487 (UP_ASM_TAC THEN STRIP_TAC);
5488 (UP_ASM_TAC THEN REWRITE_WITH `{u,v,a,b} = {v, u, a, b:real^3}`);
5492 (NEW_GOAL `?q. q permutes 0..3 /\
5493 [v; u; a; b] = left_action_list q [w0; w1; w2; w3:real^3]`);
5494 (MATCH_MP_TAC LEFT_ACTION_LIST_3_EXISTS);
5495 (ASM_REWRITE_TAC[]);
5497 (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5498 (ASM_REWRITE_TAC[set_of_list]);
5499 (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\
5500 CARD (set_of_list ul'') = 3 + 1`);
5501 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5502 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5504 (UP_ASM_TAC THEN STRIP_TAC);
5506 (EXISTS_TAC `q:num->num`);
5507 (ASM_REWRITE_TAC[]);
5508 (REWRITE_TAC[GSYM (ASSUME `[v; u; a; b:real^3] =
5509 left_action_list q [w0; w1; w2; w3]`)]);
5510 (REWRITE_WITH `initial_sublist [v; u] [v; u; a; b] /\
5511 LENGTH [v; u:real^3] = 1 + 1`);
5512 (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST; LENGTH;
5513 TRUNCATE_SIMPLEX_EXPLICIT_1] THEN ARITH_TAC);
5514 (UP_ASM_TAC THEN STRIP_TAC);
5516 (* ========================================================================= *)
5518 (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
5521 initial_sublist [v; u] ul)`);
5522 (NEW_GOAL `(P:num#(real^3)list->bool) (k, ul)`);
5523 (REWRITE_TAC[GSYM (ASSUME `(@) (P:num#(real^3)list->bool) = k,ul`)]);
5524 (MATCH_MP_TAC SELECT_AX);
5526 (EXISTS_TAC `(i:num, left_action_list q (ul'':(real^3)list))`);
5527 (EXPAND_TAC "P" THEN REWRITE_TAC[BETA_THM]);
5528 (ASM_REWRITE_TAC[IN]);
5530 (MATCH_MP_TAC Qzksykg.QZKSYKG1);
5531 (EXISTS_TAC `ul'':(real^3)list`);
5532 (EXISTS_TAC `i:num` THEN EXISTS_TAC `q:num->num`);
5533 (ASM_REWRITE_TAC[]);
5535 (ASM_REWRITE_TAC[GSYM Ajripqn.UP_TO_4_KY_LEMMA]);
5536 (REWRITE_TAC[GSYM (ASSUME `X = mcell i V ul''`)]);
5537 (UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[NEGLIGIBLE_EMPTY]);
5538 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5539 (MATCH_MP_TAC Rvfxzbu.RVFXZBU);
5540 (ASM_REWRITE_TAC[GSYM Ajripqn.UP_TO_4_KY_LEMMA]);
5543 (ABBREV_TAC `Q = (\(k, ul). k <= 4 /\
5546 initial_sublist [u; v] ul)`);
5547 (NEW_GOAL `(Q:num#(real^3)list->bool) (k', ul')`);
5548 (REWRITE_TAC[GSYM (ASSUME `(@) (Q:num#(real^3)list->bool) = k',ul'`)]);
5549 (MATCH_MP_TAC SELECT_AX);
5551 (EXISTS_TAC `(i:num, left_action_list p (ul'':(real^3)list))`);
5552 (EXPAND_TAC "Q" THEN REWRITE_TAC[BETA_THM]);
5553 (ASM_REWRITE_TAC[IN]);
5555 (MATCH_MP_TAC Qzksykg.QZKSYKG1);
5556 (EXISTS_TAC `ul'':(real^3)list`);
5557 (EXISTS_TAC `i:num` THEN EXISTS_TAC `p:num->num`);
5558 (ASM_REWRITE_TAC[]);
5560 (ASM_REWRITE_TAC[GSYM Ajripqn.UP_TO_4_KY_LEMMA]);
5561 (REWRITE_TAC[GSYM (ASSUME `X = mcell i V ul''`)]);
5562 (UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[NEGLIGIBLE_EMPTY]);
5563 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5564 (MATCH_MP_TAC Rvfxzbu.RVFXZBU);
5565 (ASM_REWRITE_TAC[GSYM Ajripqn.UP_TO_4_KY_LEMMA]);
5567 (UP_ASM_TAC THEN EXPAND_TAC "Q" THEN REWRITE_TAC[] THEN DEL_TAC);
5568 (UP_ASM_TAC THEN EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN DEL_TAC);
5571 (NEW_GOAL `i = k:num`);
5572 (REWRITE_WITH `i = k /\ mcell i V ul'' = mcell k V ul`);
5573 (MATCH_MP_TAC Ajripqn.AJRIPQN);
5574 (ASM_REWRITE_TAC[GSYM Ajripqn.UP_TO_4_KY_LEMMA]);
5575 (REWRITE_TAC[GSYM (ASSUME `X = mcell i V ul''`);
5576 GSYM (ASSUME `X = mcell k V ul`); SET_RULE `a INTER a = a`]);
5577 (ASM_REWRITE_TAC[]);
5579 (NEW_GOAL `i = k':num`);
5580 (REWRITE_WITH `i = k' /\ mcell i V ul'' = mcell k' V ul'`);
5581 (MATCH_MP_TAC Ajripqn.AJRIPQN);
5582 (ASM_REWRITE_TAC[GSYM Ajripqn.UP_TO_4_KY_LEMMA]);
5583 (REWRITE_TAC[GSYM (ASSUME `X = mcell i V ul''`); GSYM (ASSUME `i = k:num`);
5584 GSYM (ASSUME `X = mcell k' V ul'`); SET_RULE `a INTER a = a`]);
5585 (ASM_REWRITE_TAC[]);
5587 (NEW_GOAL `i = k /\ (!k. i - 1 <= k /\ k <= 3
5588 ==> omega_list_n V ul k = omega_list_n V ul' k)`);
5589 (MATCH_MP_TAC MCELL_ID_OMEGA_LIST_N);
5590 (ASM_REWRITE_TAC[]);
5595 (REWRITE_TAC[SET_RULE `a IN {m,n,p} <=> a = m \/ a = n \/ a = p`]);
5597 (UP_ASM_TAC THEN STRIP_TAC);
5599 (REWRITE_WITH `k' = k:num`);
5602 (ASM_CASES_TAC `i < 4`);
5603 (NEW_GOAL `mxi V ul' = mxi V ul`);
5604 (MATCH_MP_TAC MCELL_ID_MXI_2);
5605 (EXISTS_TAC `k':num` THEN EXISTS_TAC `k:num`);
5606 (ASM_REWRITE_TAC[]);
5607 (REWRITE_TAC[GSYM (ASSUME `X = mcell k' V ul'`)]);
5608 (REWRITE_TAC[ASSUME `X = mcell k V ul`; ASSUME `~NULLSET X`]);
5609 (REWRITE_TAC[SET_RULE `a IN {b,c} <=> a = b \/ a = c`]);
5612 (NEW_GOAL `HD ul = HD [v; u:real^3]`);
5613 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5614 (MATCH_MP_TAC Packing3.HD_INITIAL_SUBLIST);
5615 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5617 (NEW_GOAL `HD ul' = HD [u; v:real^3]`);
5618 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5619 (MATCH_MP_TAC Packing3.HD_INITIAL_SUBLIST);
5620 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5622 (NEW_GOAL `EL 1 ul = EL 1 ([v; u:real^3])`);
5623 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5624 (REWRITE_WITH `[v; u:real^3] = truncate_simplex 1 ul`);
5625 (REWRITE_WITH `truncate_simplex 1 ul = [v;u:real^3] /\ 1 + 1 <= LENGTH ul`);
5626 (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5627 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5628 (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
5629 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
5630 CARD (set_of_list ul) = 3 + 1`);
5631 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5632 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5635 (NEW_GOAL `EL 1 ul' = EL 1 ([u; v:real^3])`);
5636 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5637 (REWRITE_WITH `[u; v:real^3] = truncate_simplex 1 ul'`);
5638 (REWRITE_WITH `truncate_simplex 1 ul' =[u;v:real^3] /\ 1 + 1 <= LENGTH ul'`);
5639 (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5640 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5641 (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
5642 (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1 /\
5643 CARD (set_of_list ul') = 3 + 1`);
5644 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5645 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5650 (REWRITE_TAC[dihu2]);
5651 (REWRITE_WITH `omega_list_n V ul 3 = omega_list_n V ul' 3`);
5652 (FIRST_ASSUM MATCH_MP_TAC);
5654 (ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `1 = SUC 0`; DIHV_SYM]);
5655 (UP_ASM_TAC THEN MESON_TAC[]);
5658 (UP_ASM_TAC THEN MESON_TAC[]);
5660 (DEL_TAC THEN DEL_TAC);
5661 (REWRITE_TAC[dihu3]);
5662 (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `1 = SUC 0`]);
5664 (REWRITE_WITH `EL 2 ul' = EL 2 (ul:(real^3)list)`);
5665 (NEW_GOAL `set_of_list (truncate_simplex 2 (ul:(real^3)list)) =
5666 set_of_list (truncate_simplex 2 ul')`);
5667 (REWRITE_TAC[ARITH_RULE `2 = 3 - 1`]);
5668 (REWRITE_WITH `set_of_list (truncate_simplex (3 - 1) ul) =
5669 (V:real^3->bool) INTER X`);
5670 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5671 (REWRITE_TAC[ASSUME `X = mcell k V ul`; ASSUME `k = 3`]);
5672 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
5673 (ASM_REWRITE_TAC[ARITH_RULE `1 <= 3 /\ 3 <= 4`]);
5674 (REWRITE_TAC[GSYM (ASSUME `X = mcell k V ul`); GSYM (ASSUME `k = 3`)]);
5675 (UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[NEGLIGIBLE_EMPTY]);
5676 (REWRITE_TAC[ASSUME `X = mcell k' V ul'`]);
5677 (REWRITE_WITH `k' = 3`);
5679 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
5680 (ASM_REWRITE_TAC[ARITH_RULE `1 <= 3 /\ 3 <= 4`]);
5681 (REWRITE_WITH `3 = k'`);
5683 (REWRITE_TAC[GSYM (ASSUME `X = mcell k' V ul'`)]);
5684 (UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[NEGLIGIBLE_EMPTY]);
5686 (NEW_GOAL `?y0 y1 y2 y3. ul = [y0;y1;y2;y3:real^3]`);
5687 (MATCH_MP_TAC BARV_3_EXPLICIT);
5688 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5689 (UP_ASM_TAC THEN STRIP_TAC);
5690 (NEW_GOAL `?z0 z1 z2 z3. ul' = [z0;z1;z2;z3:real^3]`);
5691 (MATCH_MP_TAC BARV_3_EXPLICIT);
5692 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5693 (UP_ASM_TAC THEN STRIP_TAC);
5694 (UNDISCH_TAC `EL 1 ul = EL 1 [v; u:real^3]` THEN
5695 UNDISCH_TAC `HD ul = HD [v; u:real^3]`
5696 THEN ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);
5699 (UNDISCH_TAC `EL 1 ul' = EL 1 [u; v:real^3]` THEN
5700 UNDISCH_TAC `HD ul' = HD [u; v:real^3]`
5701 THEN ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);
5703 (UNDISCH_TAC `set_of_list (truncate_simplex 2 (ul:(real^3)list)) =
5704 set_of_list (truncate_simplex 2 ul')`);
5705 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list]);
5706 (NEW_GOAL `~(y2 IN {u, v:real^3})`);
5708 (NEW_GOAL `CARD (set_of_list (ul:(real^3)list)) <= 3`);
5709 (ASM_REWRITE_TAC[set_of_list]);
5710 (REWRITE_WITH ` {v, u, y2, y3} = {v,u, y3:real^3}`);
5712 (REWRITE_TAC[Geomdetail.CARD3]);
5713 (UP_ASM_TAC THEN REWRITE_WITH`CARD (set_of_list (ul:(real^3)list)) = 3 + 1`);
5714 (MATCH_MP_TAC BARV_CARD_LEMMA);
5715 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5717 (UP_ASM_TAC THEN SET_TAC[]);
5719 (REWRITE_TAC[DIHV_SYM]);
5720 (UP_ASM_TAC THEN MESON_TAC[]);
5731 (UP_ASM_TAC THEN MESON_TAC[]);
5735 (UP_ASM_TAC THEN MESON_TAC[]);
5745 (REWRITE_TAC[dihu4]);
5747 (* ========================================================================= *)
5748 (MATCH_MP_TAC DIHV_SYM_3);
5751 (NEW_GOAL `HD ul = HD [v; u:real^3]`);
5752 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5753 (MATCH_MP_TAC Packing3.HD_INITIAL_SUBLIST);
5754 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5756 (NEW_GOAL `HD ul' = HD [u; v:real^3]`);
5757 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5758 (MATCH_MP_TAC Packing3.HD_INITIAL_SUBLIST);
5759 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5761 (NEW_GOAL `EL 1 ul = EL 1 ([v; u:real^3])`);
5762 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5763 (REWRITE_WITH `[v; u:real^3] = truncate_simplex 1 ul`);
5764 (REWRITE_WITH `truncate_simplex 1 ul = [v;u:real^3] /\ 1 + 1 <= LENGTH ul`);
5765 (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5766 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5767 (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
5768 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
5769 CARD (set_of_list ul) = 3 + 1`);
5770 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5771 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5774 (NEW_GOAL `EL 1 ul' = EL 1 ([u; v:real^3])`);
5775 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5776 (REWRITE_WITH `[u; v:real^3] = truncate_simplex 1 ul'`);
5777 (REWRITE_WITH `truncate_simplex 1 ul' =[u;v:real^3] /\ 1 + 1 <= LENGTH ul'`);
5778 (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5779 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5780 (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
5781 (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1 /\
5782 CARD (set_of_list ul') = 3 + 1`);
5783 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5784 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5787 (NEW_GOAL `?y0 y1 y2 y3. ul = [y0;y1;y2;y3:real^3]`);
5788 (MATCH_MP_TAC BARV_3_EXPLICIT);
5789 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5790 (UP_ASM_TAC THEN STRIP_TAC);
5791 (NEW_GOAL `?z0 z1 z2 z3. ul' = [z0;z1;z2;z3:real^3]`);
5792 (MATCH_MP_TAC BARV_3_EXPLICIT);
5793 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5794 (UP_ASM_TAC THEN STRIP_TAC);
5795 (UNDISCH_TAC `EL 1 ul = EL 1 [v; u:real^3]` THEN
5796 UNDISCH_TAC `HD ul = HD [v; u:real^3]` THEN
5797 UNDISCH_TAC `EL 1 ul' = EL 1 [u; v:real^3]` THEN
5798 UNDISCH_TAC `HD ul' = HD [u; v:real^3]` THEN
5799 ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `3 = SUC 2 /\2 = SUC 1 /\ 1 = SUC 0`]);
5803 (NEW_GOAL `~(z2 IN {u,v:real^3})`);
5805 (NEW_GOAL `CARD (set_of_list (ul':(real^3)list)) <= 3`);
5806 (ASM_REWRITE_TAC[set_of_list]);
5807 (REWRITE_WITH `{u, v, z2, z3} = {v,u, z3:real^3}`);
5809 (REWRITE_TAC[Geomdetail.CARD3]);
5810 (UP_ASM_TAC THEN REWRITE_WITH`CARD (set_of_list (ul':(real^3)list)) = 3 + 1`);
5811 (MATCH_MP_TAC BARV_CARD_LEMMA);
5812 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5815 (NEW_GOAL `~(z3 IN {u,v:real^3})`);
5817 (NEW_GOAL `CARD (set_of_list (ul':(real^3)list)) <= 3`);
5818 (ASM_REWRITE_TAC[set_of_list]);
5819 (REWRITE_WITH `{u, v, z2, z3} = {v,u, z2:real^3}`);
5821 (REWRITE_TAC[Geomdetail.CARD3]);
5822 (UP_ASM_TAC THEN REWRITE_WITH`CARD (set_of_list (ul':(real^3)list)) = 3 + 1`);
5823 (MATCH_MP_TAC BARV_CARD_LEMMA);
5824 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5828 (NEW_GOAL `~(y2 IN {u,v:real^3})`);
5830 (NEW_GOAL `CARD (set_of_list (ul:(real^3)list)) <= 3`);
5831 (ASM_REWRITE_TAC[set_of_list]);
5832 (REWRITE_WITH `{v, u, y2, y3} = {v,u, y3:real^3}`);
5834 (REWRITE_TAC[Geomdetail.CARD3]);
5835 (UP_ASM_TAC THEN REWRITE_WITH`CARD (set_of_list (ul:(real^3)list)) = 3 + 1`);
5836 (MATCH_MP_TAC BARV_CARD_LEMMA);
5837 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5840 (NEW_GOAL `~(y3 IN {u,v:real^3})`);
5842 (NEW_GOAL `CARD (set_of_list (ul:(real^3)list)) <= 3`);
5843 (ASM_REWRITE_TAC[set_of_list]);
5844 (REWRITE_WITH `{v, u, y2, y3} = {v,u, y2:real^3}`);
5846 (REWRITE_TAC[Geomdetail.CARD3]);
5847 (UP_ASM_TAC THEN REWRITE_WITH`CARD (set_of_list (ul:(real^3)list)) = 3 + 1`);
5848 (MATCH_MP_TAC BARV_CARD_LEMMA);
5849 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5852 (NEW_GOAL `set_of_list (truncate_simplex 3 (ul:(real^3)list)) =
5853 set_of_list (truncate_simplex 3 ul')`);
5854 (REWRITE_WITH `set_of_list (truncate_simplex 3 (ul:(real^3)list)) =
5856 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5857 (REWRITE_TAC[ASSUME `X = mcell k V ul`; ASSUME `k = 4`; ARITH_RULE `3 = 4 - 1`]);
5858 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
5859 (REWRITE_TAC[ARITH_RULE `1 <= 4 /\ 4 <= 4`]);
5860 (REWRITE_TAC[GSYM (ASSUME `X = mcell k V ul`); GSYM (ASSUME `k = 4`)]);
5862 (ASM_REWRITE_TAC[]);
5863 (ASM_REWRITE_TAC[]);
5864 (ASM_REWRITE_TAC[]);
5865 (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[NEGLIGIBLE_EMPTY]);
5866 (REWRITE_TAC[ASSUME `X = mcell k' V ul'`]);
5867 (REWRITE_WITH `k' = 4`);
5869 (REWRITE_TAC[ARITH_RULE `3 = 4 - 1`]);
5870 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
5871 (REWRITE_TAC[ARITH_RULE `1 <= 4 /\ 4 <= 4`]);
5872 (REWRITE_WITH `4 = k'`);
5874 (REWRITE_TAC[GSYM (ASSUME `X = mcell k' V ul'`)]);
5876 (ASM_REWRITE_TAC[]);
5877 (ASM_REWRITE_TAC[]);
5878 (ASM_REWRITE_TAC[]);
5879 (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[NEGLIGIBLE_EMPTY]);
5881 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_3; set_of_list]);
5884 (UP_ASM_TAC THEN MESON_TAC[]);
5886 (UP_ASM_TAC THEN MESON_TAC[]);
5888 (UP_ASM_TAC THEN MESON_TAC[]);
5890 (UP_ASM_TAC THEN MESON_TAC[]);
5893 (* ==================================================================== *)
5896 let gammaY = new_definition
5899 (\({u, v}). if {u, v} IN edgeX V X
5900 then dihX V X (u,v) * f (hl [u; v])
5903 let gamma_y_lmfun_bound = prove_by_refinement (
5904 `!V. packing V /\ saturated V
5905 ==> (?d. !X e. mcell_set V X /\ edgeX V X e ==> gammaY V X lmfun e <= d)`,
5906 [(REPEAT STRIP_TAC);
5907 (EXISTS_TAC `pi * h0 / (h0 - &1)`);
5909 (ABBREV_TAC `f = (\u v. if {u, v} IN edgeX V X
5910 then dihX V X (u,v) * lmfun (hl [u; v])
5912 (REWRITE_WITH `gammaY V X lmfun = (\({u, v}). f u v)`);
5913 (EXPAND_TAC "f" THEN REWRITE_TAC[gammaY]);
5915 (NEW_GOAL `!u v. (f:real^3->real^3->real) u v = f v u`);
5916 (EXPAND_TAC "f" THEN REWRITE_TAC[BETA_THM]);
5917 (REWRITE_TAC[HL; set_of_list; SET_RULE `{a,b} = {b,a}`]);
5918 (REPEAT GEN_TAC THEN COND_CASES_TAC);
5920 (REWRITE_WITH `dihX V X (u,v) = dihX V X (v,u)`);
5921 (MATCH_MP_TAC DIHX_SYM);
5922 (ASM_REWRITE_TAC[]);
5923 (UP_ASM_TAC THEN MESON_TAC[]);
5925 (UP_ASM_TAC THEN MESON_TAC[]);
5928 (UNDISCH_TAC `edgeX V X e` THEN REWRITE_TAC[IN;IN_ELIM_THM; edgeX]);
5930 (ASM_REWRITE_TAC[]);
5932 (REWRITE_WITH `(\({u, v}). f u v) {u, v} =
5933 (f:real^3->real^3->real) u v`);
5934 (MATCH_MP_TAC BETA_PAIR_THM);
5935 (ASM_REWRITE_TAC[]);
5940 (NEW_GOAL `dihX V X (u,v) * lmfun (hl [u;v]) <= pi * lmfun (hl [u;v])`);
5941 (REWRITE_TAC[REAL_ARITH `a * x <= b * x <=> &0 <= (b - a) * x`]);
5942 (MATCH_MP_TAC REAL_LE_MUL);
5943 (REWRITE_TAC[lmfun_pos_le; REAL_ARITH `&0 <= a - b <=> b <= a`; DIHX_LE_PI]);
5945 (NEW_GOAL `pi * lmfun (hl [u:real^3;v]) <= pi * h0 / (h0 - &1)`);
5946 (REWRITE_TAC[REAL_ARITH `a * x <= a * y <=> &0 <= (y - x) * a`]);
5947 (MATCH_MP_TAC REAL_LE_MUL);
5948 (REWRITE_TAC[PI_POS_LE; REAL_ARITH `&0 <= a - b <=> b <= a`]);
5949 (MATCH_MP_TAC lmfun_bounded);
5950 (REWRITE_TAC[HL_2; REAL_ARITH `&0 <= inv (&2) * x <=> &0 <= x`; DIST_POS_LE]);
5951 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5952 (MATCH_MP_TAC REAL_LE_MUL);
5953 (REWRITE_TAC[PI_POS_LE]);
5954 (MATCH_MP_TAC REAL_LE_DIV);
5955 (REWRITE_TAC[h0] THEN REAL_ARITH_TAC)]);;
5957 (* ==================================================================== *)
5960 let BETA_SET_2_THM = prove
5961 (`!g:(A->bool)->B u0 v0. (\({u, v}). g {u, v}) {u0, v0} = g {u0, v0}`,
5962 GEN_TAC THEN REWRITE_TAC[GABS_DEF;GEQ_DEF] THEN
5963 CONV_TAC SELECT_CONV THEN EXISTS_TAC `g:(A->bool)->B` THEN
5966 (* ==================================================================== *)
5968 (* Formal proof by John Harrison *)
5970 let SUM_PAIR_2_SET = prove
5971 (`!f s:real^N->bool d.
5973 ==> sum {(m,n) | m IN s /\ n IN s /\ ~(m = n) /\ dist(m,n) <= d}
5974 (\(m,n). f {m, n}) = &2 *
5975 sum {{m, n} | m IN s /\ n IN s /\ ~(m = n) /\ dist(m,n) <= d} f`,
5976 REPEAT STRIP_TAC THEN MP_TAC(ISPECL
5977 [`\(m:real^N,n). {m,n}`;`(\(m,n). f {m,n}):real^N#real^N->real`;
5978 `{(m,n) | m IN s /\ n IN s /\ ~(m:real^N = n) /\ dist(m,n) <= d}`;
5979 `{{m,n} | m IN s /\ n IN s /\ ~(m:real^N = n) /\ dist(m,n) <= d}`]
5983 [ONCE_REWRITE_TAC[SET_RULE
5984 `m IN s /\ n IN s /\ P m n <=>
5985 m IN s /\ n IN {n | n IN s /\ P m n}`] THEN
5986 MATCH_MP_TAC FINITE_PRODUCT_DEPENDENT THEN
5987 ASM_SIMP_TAC[FINITE_RESTRICT];
5988 REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; FORALL_IN_GSPEC] THEN SET_TAC[]];
5989 DISCH_THEN(SUBST1_TAC o SYM) THEN REWRITE_TAC[GSYM SUM_LMUL] THEN
5990 MATCH_MP_TAC SUM_EQ THEN REWRITE_TAC[FORALL_IN_GSPEC] THEN
5991 MAP_EVERY X_GEN_TAC [`m:real^N`; `n:real^N`] THEN STRIP_TAC THEN
5992 MATCH_MP_TAC EQ_TRANS THEN
5993 EXISTS_TAC `sum {(m:real^N,n), (n,m)} (\(m,n). f {m,n})` THEN
5995 [AP_THM_TAC THEN AP_TERM_TAC THEN GEN_REWRITE_TAC I [EXTENSION] THEN
5996 REWRITE_TAC[FORALL_PAIR_THM] THEN
5997 REWRITE_TAC[IN_ELIM_THM; PAIR_EQ; IN_INSERT; NOT_IN_EMPTY;
5998 SET_RULE `{a,b} = {c,d} <=> a = c /\ b = d \/ a = d /\ b = c`] THEN
5999 ASM_MESON_TAC[DIST_SYM];
6000 SIMP_TAC[SUM_CLAUSES; FINITE_INSERT; FINITE_EMPTY] THEN
6001 ASM_REWRITE_TAC[IN_SING; NOT_IN_EMPTY; PAIR_EQ; REAL_ADD_RID] THEN
6002 REWRITE_TAC[INSERT_AC] THEN REAL_ARITH_TAC]]);;
6004 (* ==================================================================== *)
6007 open Flyspeck_constants;;
6009 let H0_LT_SQRT2 = prove_by_refinement (`h0 < sqrt (&2)`,
6010 [REWRITE_TAC[h0; GSYM sqrt2];
6011 NEW_GOAL `#1.414213 < sqrt2`;
6012 REWRITE_TAC[bounds];
6013 ASM_REAL_ARITH_TAC]);;
6015 (* ==================================================================== *)
6018 let gamma_y_pos_le = prove_by_refinement (
6019 `!V X e. packing V /\ saturated V /\ mcell_set V X /\ edgeX V X e
6020 ==> &0 <= gammaY V X lmfun e`,
6021 [(REPEAT STRIP_TAC);
6022 (REWRITE_TAC[gammaY]);
6023 (NEW_GOAL `?u v. (VX V X u /\ VX V X v /\ ~(u = v)) /\ e = {u, v}`);
6024 (UP_ASM_TAC THEN REWRITE_TAC[edgeX; IN_ELIM_THM]);
6025 (UP_ASM_TAC THEN STRIP_TAC);
6026 (ASM_REWRITE_TAC[]);
6027 (ABBREV_TAC `f = (\u v. if {u, v} IN edgeX V X
6028 then dihX V X (u,v) * lmfun (hl [u; v])
6030 (REWRITE_WITH `(\({u, v}). if {u, v} IN edgeX V X
6031 then dihX V X (u,v) * lmfun (hl [u; v])
6032 else &0) = (\({u, v}). f u v)`);
6033 (EXPAND_TAC "f" THEN REWRITE_TAC[]);
6034 (REWRITE_WITH `(\({u:real^3, v}). f u v) {u, v} = (f:real^3->real^3->real) u v`);
6035 (MATCH_MP_TAC BETA_PAIR_THM);
6036 (EXPAND_TAC "f" THEN REPEAT STRIP_TAC);
6037 (REPEAT COND_CASES_TAC);
6038 (REWRITE_TAC[HL; set_of_list; SET_RULE `{a,b} = {b,a}`]);
6039 (REWRITE_WITH `dihX V X (u',v') = dihX V X (v',u')`);
6040 (MATCH_MP_TAC DIHX_SYM);
6041 (ASM_REWRITE_TAC[]);
6043 (UP_ASM_TAC THEN REWRITE_TAC[]);
6044 (ONCE_REWRITE_TAC[SET_RULE `{a,b} = {b,a}`] THEN ASM_REWRITE_TAC[]);
6047 (UP_ASM_TAC THEN REWRITE_TAC[]);
6048 (ONCE_REWRITE_TAC[SET_RULE `{a,b} = {b,a}`] THEN ASM_REWRITE_TAC[]);
6053 (MATCH_MP_TAC REAL_LE_MUL);
6054 (REWRITE_TAC[DIHX_POS;lmfun_pos_le]);
6055 (REAL_ARITH_TAC)]);;
6057 (* ==================================================================== *)
6060 let CARD_LIST_klemma = prove_by_refinement (
6061 `!s t. FINITE (s:A->bool) /\ FINITE t ==>
6062 CARD {CONS u0 y1 | u0 IN s /\ y1 IN t} = CARD s * CARD t`,
6063 [(REPEAT STRIP_TAC);
6064 (ABBREV_TAC `S = {u0:A, y1:(A)list| u0 IN s /\ y1 IN t}`);
6065 (ABBREV_TAC `f = (\(u0:A, y1:(A)list). CONS u0 y1)`);
6066 (REWRITE_WITH `{CONS u0 y1 | u0 IN s /\ y1 IN t} =
6067 (IMAGE (f:A#(A)list->(A)list) S)`);
6068 (EXPAND_TAC "f" THEN EXPAND_TAC "S" THEN REWRITE_TAC[IMAGE]);
6069 (REWRITE_TAC[SET_RULE `A = B <=> A SUBSET B /\ B SUBSET A`]);
6071 (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6072 (EXISTS_TAC `(u0:A,y1:(A)list)`);
6073 (ASM_REWRITE_TAC[]);
6074 (EXISTS_TAC `u0:A` THEN EXISTS_TAC `y1:(A)list` THEN ASM_REWRITE_TAC[]);
6075 (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6076 (UP_ASM_TAC THEN REWRITE_TAC[ASSUME `x' = u0:A,y1:(A)list`] THEN STRIP_TAC);
6077 (EXISTS_TAC `u0:A` THEN EXISTS_TAC `y1:(A)list` THEN ASM_REWRITE_TAC[]);
6078 (REWRITE_WITH `CARD (IMAGE (f:A#(A)list->(A)list) S) = CARD S`);
6079 (MATCH_MP_TAC CARD_IMAGE_INJ);
6081 (EXPAND_TAC "S" THEN EXPAND_TAC "f" THEN
6082 REWRITE_TAC[IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6083 (UP_ASM_TAC THEN REWRITE_TAC[ASSUME `x = u0:A,y1:(A)list`;
6084 ASSUME `y = u0':A,y1':(A)list`; CONS_11]);
6085 (STRIP_TAC THEN ASM_REWRITE_TAC[]);
6086 (EXPAND_TAC "S" THEN MATCH_MP_TAC FINITE_PRODUCT THEN ASM_REWRITE_TAC[]);
6087 (EXPAND_TAC "S" THEN MATCH_MP_TAC CARD_PRODUCT THEN ASM_REWRITE_TAC[])]);;
6089 (* ==================================================================== *)
6092 let CARD_LIST_klemma_2 = prove_by_refinement (
6093 `!s t. FINITE (s:A->bool) /\ FINITE t ==>
6094 CARD {[u0;y1] | u0 IN s /\ y1 IN t} = CARD s * CARD t`,
6095 [(REPEAT STRIP_TAC);
6096 (ABBREV_TAC `S = {u0:A, y1:A| u0 IN s /\ y1 IN t}`);
6097 (ABBREV_TAC `f = (\(u0:A, y1:A). [u0; y1])`);
6098 (REWRITE_WITH `{[u0; y1] | u0 IN s /\ y1 IN t} =
6099 (IMAGE (f:A#A->(A)list) S)`);
6100 (EXPAND_TAC "f" THEN EXPAND_TAC "S" THEN REWRITE_TAC[IMAGE]);
6101 (REWRITE_TAC[SET_RULE `A = B <=> A SUBSET B /\ B SUBSET A`]);
6103 (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6104 (EXISTS_TAC `(u0:A,y1:A)`);
6105 (ASM_REWRITE_TAC[]);
6106 (EXISTS_TAC `u0:A` THEN EXISTS_TAC `y1:A` THEN ASM_REWRITE_TAC[]);
6107 (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6108 (UP_ASM_TAC THEN REWRITE_TAC[ASSUME `x' = u0:A,y1:A`] THEN STRIP_TAC);
6109 (EXISTS_TAC `u0:A` THEN EXISTS_TAC `y1:A` THEN ASM_REWRITE_TAC[]);
6110 (REWRITE_WITH `CARD (IMAGE (f:A#A->(A)list) S) = CARD S`);
6111 (MATCH_MP_TAC CARD_IMAGE_INJ);
6113 (EXPAND_TAC "S" THEN EXPAND_TAC "f" THEN
6114 REWRITE_TAC[IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6115 (UP_ASM_TAC THEN REWRITE_TAC[ASSUME `x = u0:A,y1:A`;
6116 ASSUME `y = u0':A,y1':A`]);
6117 (REWRITE_TAC[PAIR_EQ]);
6119 (REWRITE_WITH `u0 = HD [u0':A; y1']`);
6120 (UP_ASM_TAC THEN MESON_TAC[HD]);
6122 (REWRITE_WITH `y1 = HD (TL [u0':A; y1'])`);
6123 (UP_ASM_TAC THEN MESON_TAC[HD; TL]);
6124 (REWRITE_TAC[HD; TL]);
6125 (EXPAND_TAC "S" THEN MATCH_MP_TAC FINITE_PRODUCT THEN ASM_REWRITE_TAC[]);
6126 (EXPAND_TAC "S" THEN MATCH_MP_TAC CARD_PRODUCT THEN ASM_REWRITE_TAC[])]);;
6128 (* ==================================================================== *)
6131 let FINITE_LIST_klemma = prove (
6132 `!s t. FINITE (s:A->bool) /\ FINITE t ==>
6133 FINITE {CONS u0 y1 | u0 IN s /\ y1 IN t}`,
6134 REPEAT STRIP_TAC THEN
6135 MATCH_MP_TAC FINITE_PRODUCT_DEPENDENT THEN ASM_REWRITE_TAC[]);;
6137 (* ==================================================================== *)
6140 let CARD_LIST_4_klemma = prove_by_refinement (
6149 y = [u0; u1; u2; u3]} = CARD s * CARD s * CARD s * CARD s`,
6151 [(REPEAT STRIP_TAC);
6152 (REWRITE_TAC[SET_RULE
6153 `{y | ?u0 u1 u2 u3. u0 IN s /\ u1 IN s /\ u2 IN s /\ u3 IN s /\
6154 y = [u0; u1; u2; u3]} =
6155 {CONS u0 y1 | u0 IN s /\
6156 y1 IN {CONS u1 y2 | u1 IN s /\
6157 y2 IN {[u2;u3] | u2 IN s /\
6159 (NEW_GOAL `FINITE {[u2:A; u3] | u2 IN s /\ u3 IN s}`);
6160 (MATCH_MP_TAC FINITE_PRODUCT_DEPENDENT THEN ASM_REWRITE_TAC[]);
6162 {CONS u1 y2 | (u1:A) IN s /\ y2 IN {[u2; u3] | u2 IN s /\ u3 IN s}}`);
6163 (MATCH_MP_TAC FINITE_PRODUCT_DEPENDENT THEN ASM_REWRITE_TAC[]);
6165 {CONS u0 y1 | u0 IN s /\
6166 y1 IN {CONS u1 y2 | u1 IN s /\
6167 y2 IN {[u2:A; u3] | u2 IN s /\ u3 IN s}}}`);
6168 (MATCH_MP_TAC FINITE_PRODUCT_DEPENDENT THEN ASM_REWRITE_TAC[]);
6170 {CONS u0 y1 | u0 IN s /\
6172 {CONS u1 y2 | u1 IN s /\ y2 IN {[u2:A; u3] | u2 IN s /\ u3 IN s}}}
6174 CARD {CONS u1 y2 | u1 IN s /\ y2 IN {[u2; u3] | u2 IN s /\ u3 IN s}}`);
6175 (ASM_SIMP_TAC[CARD_LIST_klemma]);
6177 `CARD {CONS u1 y2 | u1 IN s /\ y2 IN {[u2:A; u3] | u2 IN s /\ u3 IN s}}
6178 = CARD s * CARD {[u2; u3] | u2 IN s /\ u3 IN s}`);
6179 (ASM_SIMP_TAC[CARD_LIST_klemma]);
6181 (REWRITE_WITH `CARD {[u2:A; u3] | u2 IN s /\ u3 IN s} = CARD s * CARD s`);
6182 (ASM_SIMP_TAC[CARD_LIST_klemma_2])]);;
6184 (* ==================================================================== *)
6186 let BOUNDS_VGEN_klemma = prove_by_refinement(
6187 `!u0 V r. &0 <= r /\ packing V ==>
6188 &(CARD (V INTER ball (u0,r))) <= (r + &1) pow 3`,
6189 [(REPEAT STRIP_TAC);
6190 (NEW_GOAL `sum (V INTER ball (u0,r)) (\x. vol (ball (x:real^3, &1)))
6191 = & (CARD (V INTER ball (u0,r))) * (&4 / &3 * pi)`);
6192 (NEW_GOAL `&0 <= &1`);
6194 (REWRITE_WITH `(\x. vol (ball (x,&1))) = (\x. &4 / &3 * pi)`);
6195 (REWRITE_TAC[FUN_EQ_THM]);
6196 (ASM_SIMP_TAC[VOLUME_BALL] THEN REAL_ARITH_TAC);
6197 (MATCH_MP_TAC SUM_CONST);
6198 (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
6200 (ABBREV_TAC `f = (\x:real^3. ball (x, &1))`);
6201 (REWRITE_WITH `(\x. vol (ball (x:real^3,&1))) = (\x. vol (f x))`);
6202 (REWRITE_TAC[FUN_EQ_THM] THEN STRIP_TAC);
6203 (EXPAND_TAC "f" THEN REWRITE_TAC[]);
6204 (REWRITE_WITH `sum (V INTER ball (u0:real^3,r)) (\x. vol (f x)) =
6205 vol (UNIONS (IMAGE f (V INTER ball (u0,r))))`);
6206 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6207 (MATCH_MP_TAC MEASURE_DISJOINT_UNIONS_IMAGE);
6208 (EXPAND_TAC "f" THEN REWRITE_TAC[] THEN REPEAT STRIP_TAC);
6209 (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
6210 (REWRITE_TAC[MEASURABLE_BALL]);
6211 (REWRITE_TAC[DISJOINT; SET_RULE `a = {} <=> ~(?s. s IN a)`]);
6212 (REWRITE_TAC[IN_INTER; IN_BALL]);
6214 (UNDISCH_TAC `packing V` THEN REWRITE_TAC[packing]);
6216 (NEW_GOAL `&2 <= dist (x,y:real^3)`);
6217 (FIRST_ASSUM MATCH_MP_TAC);
6219 (NEW_GOAL `dist (x,y) <= dist (x,s) + dist (y,s:real^3)`);
6221 (ASM_REAL_ARITH_TAC);
6223 (NEW_GOAL `vol (UNIONS (IMAGE f (V INTER ball (u0:real^3,r))))
6224 <= vol (ball (u0, r + &1))`);
6225 (MATCH_MP_TAC MEASURE_SUBSET);
6226 (EXPAND_TAC "f" THEN REWRITE_TAC[IMAGE; MEASURABLE_BALL]);
6228 (MATCH_MP_TAC MEASURABLE_UNIONS);
6230 (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
6231 (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
6232 (REWRITE_TAC[IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6233 (ASM_REWRITE_TAC[MEASURABLE_BALL]);
6234 (REWRITE_TAC[UNIONS_SUBSET; IN_INTER; IN_BALL; IN_ELIM_THM; SUBSET]);
6236 (NEW_GOAL `dist (u0, x') <= dist (u0,x:real^3) + dist (x, x')`);
6238 (NEW_GOAL `dist (x,x':real^3) < &1`);
6239 (REWRITE_TAC[GSYM IN_BALL] THEN ASM_MESON_TAC[]);
6240 (ASM_REAL_ARITH_TAC);
6241 (NEW_GOAL `&(CARD (V INTER ball (u0,r))) * &4 / &3 * pi <=
6242 vol (ball (u0,r + &1))`);
6243 (ASM_REAL_ARITH_TAC);
6245 (UP_ASM_TAC THEN REWRITE_WITH
6246 `vol (ball (u0, r + &1)) = &4 / &3 * pi * (r + &1) pow 3`);
6247 (NEW_GOAL `&0 <= r + &1`);
6248 (ASM_REAL_ARITH_TAC);
6249 (SIMP_TAC[VOLUME_BALL; ASSUME `&0 <= r + &1`]);
6251 (REWRITE_TAC[REAL_ARITH `a * &4 / &3 * pi <= &4 / &3 * pi * b <=>
6252 &0 <= pi * (b - a)`]);
6254 (NEW_GOAL `&0 <= (r + &1) pow 3 - &(CARD (V INTER ball (u0:real^3,r)))`);
6255 (MATCH_MP_TAC Real_ext.REAL_PROP_NN_LCANCEL);
6257 (ASM_REWRITE_TAC[PI_POS]);
6258 (ASM_REAL_ARITH_TAC)]);;
6260 (* ==================================================================== *)
6263 let BOUNDS_V4_klemma = prove_by_refinement (
6264 `!u0 V. packing V ==> CARD (V INTER ball (u0, &4)) <= 125`,
6265 [(REPEAT STRIP_TAC);
6266 (NEW_GOAL `sum (V INTER ball (u0,&4)) (\x. vol (ball (x:real^3, &1)))
6267 = & (CARD (V INTER ball (u0,&4))) * (&4 / &3 * pi)`);
6268 (NEW_GOAL `&0 <= &1`);
6270 (REWRITE_WITH `(\x. vol (ball (x,&1))) = (\x. &4 / &3 * pi)`);
6271 (REWRITE_TAC[FUN_EQ_THM]);
6272 (ASM_SIMP_TAC[VOLUME_BALL] THEN REAL_ARITH_TAC);
6273 (MATCH_MP_TAC SUM_CONST);
6274 (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
6276 (ABBREV_TAC `f = (\x:real^3. ball (x, &1))`);
6277 (REWRITE_WITH `(\x. vol (ball (x:real^3,&1))) = (\x. vol (f x))`);
6278 (REWRITE_TAC[FUN_EQ_THM] THEN STRIP_TAC);
6279 (EXPAND_TAC "f" THEN REWRITE_TAC[]);
6280 (REWRITE_WITH `sum (V INTER ball (u0:real^3,&4)) (\x. vol (f x)) =
6281 vol (UNIONS (IMAGE f (V INTER ball (u0,&4))))`);
6282 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6283 (MATCH_MP_TAC MEASURE_DISJOINT_UNIONS_IMAGE);
6284 (EXPAND_TAC "f" THEN REWRITE_TAC[] THEN REPEAT STRIP_TAC);
6285 (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
6286 (REWRITE_TAC[MEASURABLE_BALL]);
6287 (REWRITE_TAC[DISJOINT; SET_RULE `a = {} <=> ~(?s. s IN a)`]);
6288 (REWRITE_TAC[IN_INTER; IN_BALL]);
6290 (UNDISCH_TAC `packing V` THEN REWRITE_TAC[packing]);
6292 (NEW_GOAL `&2 <= dist (x,y:real^3)`);
6293 (FIRST_ASSUM MATCH_MP_TAC);
6295 (NEW_GOAL `dist (x,y) <= dist (x,s) + dist (y,s:real^3)`);
6297 (ASM_REAL_ARITH_TAC);
6299 (NEW_GOAL `vol (UNIONS (IMAGE f (V INTER ball (u0:real^3,&4))))
6300 <= vol (ball (u0, &5))`);
6301 (MATCH_MP_TAC MEASURE_SUBSET);
6302 (EXPAND_TAC "f" THEN REWRITE_TAC[IMAGE; MEASURABLE_BALL]);
6304 (MATCH_MP_TAC MEASURABLE_UNIONS);
6306 (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
6307 (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
6308 (REWRITE_TAC[IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6309 (ASM_REWRITE_TAC[MEASURABLE_BALL]);
6310 (REWRITE_TAC[UNIONS_SUBSET; IN_INTER; IN_BALL; IN_ELIM_THM; SUBSET]);
6312 (NEW_GOAL `dist (u0, x') <= dist (u0,x:real^3) + dist (x, x')`);
6314 (NEW_GOAL `dist (x,x':real^3) < &1`);
6315 (REWRITE_TAC[GSYM IN_BALL] THEN ASM_MESON_TAC[]);
6316 (ASM_REAL_ARITH_TAC);
6317 (NEW_GOAL `&(CARD (V INTER ball (u0,&4))) * &4 / &3 * pi <=
6318 vol (ball (u0,&5))`);
6319 (ASM_REAL_ARITH_TAC);
6320 (UP_ASM_TAC THEN REWRITE_WITH
6321 `vol (ball (u0,&5)) = &4 / &3 * pi * (&5) pow 3`);
6322 (SIMP_TAC[VOLUME_BALL; REAL_ARITH `&0 <= &5`]);
6324 (REWRITE_TAC[REAL_ARITH `a * &4 / &3 * pi <= &4 / &3 * pi * b <=>
6325 &0 <= pi * (b - a)`]);
6327 (NEW_GOAL `&0 <= &5 pow 3 - &(CARD (V INTER ball (u0:real^3,&4)))`);
6328 (MATCH_MP_TAC Real_ext.REAL_PROP_NN_LCANCEL);
6330 (ASM_REWRITE_TAC[PI_POS]);
6331 (REWRITE_TAC[GSYM REAL_OF_NUM_LE]);
6332 (ASM_REAL_ARITH_TAC)]);;
6334 (* ==================================================================== *)
6337 let CARD_MCELL_CONTAINS_POINT_klemma = prove_by_refinement (
6338 `?c. (!V u0. saturated V /\ packing V /\ u0 IN V
6339 ==> CARD {X | mcell_set V X /\ VX V X u0} <= c)`,
6340 [(EXISTS_TAC `1220703125`);
6342 (ABBREV_TAC `S = {ul,i | barV V 3 ul /\ i IN 0..4 /\
6343 u0 IN set_of_list ul}`);
6344 (NEW_GOAL `FINITE (S:(real^3)list#num->bool)`);
6345 (REWRITE_WITH `S = {ul,i | ul IN {ul | barV V 3 ul /\
6346 u0 IN set_of_list ul} /\ i IN 0..4}`);
6349 (MATCH_MP_TAC FINITE_PRODUCT);
6350 (REWRITE_TAC[FINITE_NUMSEG]);
6351 (MATCH_MP_TAC FINITE_SUBSET);
6353 (ABBREV_TAC `T1 = V INTER ball (u0:real^3, &4)`);
6354 (NEW_GOAL `FINITE (T1:real^3->bool)`);
6355 (EXPAND_TAC "T1" THEN MATCH_MP_TAC FINITE_PACK_LEMMA);
6356 (ASM_REWRITE_TAC[]);
6358 (EXISTS_TAC `{ul | ?v0 v1 v2 v3.
6359 v0 IN T1 /\ v1 IN T1 /\ v2 IN T1 /\ v3 IN T1 /\
6360 ul = [v0;v1;v2;v3:real^3]}`);
6362 (MATCH_MP_TAC Ajripqn.FINITE_SET_LIST_LEMMA THEN ASM_REWRITE_TAC[]);
6364 (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM]);
6366 (NEW_GOAL `?v0 v1 v2 v3. x = [v0:real^3; v1; v2; v3]`);
6367 (MATCH_MP_TAC BARV_3_EXPLICIT);
6368 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6369 (UP_ASM_TAC THEN STRIP_TAC THEN EXISTS_TAC `v0:real^3` THEN EXISTS_TAC
6370 `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
6371 (ASM_REWRITE_TAC[]);
6372 (NEW_GOAL `set_of_list (x:(real^3)list) SUBSET T1`);
6373 (EXPAND_TAC "T1" THEN REWRITE_TAC[SUBSET_INTER]);
6375 (MATCH_MP_TAC Packing3.BARV_SUBSET);
6376 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
6377 (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
6378 (EXISTS_TAC `V:(real^3->bool)`);
6379 (ASM_REWRITE_TAC[]);
6380 (UNDISCH_TAC `set_of_list (x:(real^3)list) u0` THEN ASM_REWRITE_TAC[IN]);
6381 (UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list] THEN SET_TAC[]);
6383 (ABBREV_TAC `f = (\(ul,i). mcell i V ul)`);
6384 (NEW_GOAL `{X | mcell_set V X /\ VX V X u0} SUBSET
6385 (IMAGE (f:(real^3)list#num->real^3->bool) S) `);
6386 (EXPAND_TAC "S" THEN EXPAND_TAC "f" THEN REWRITE_TAC[IMAGE]);
6387 (REWRITE_TAC[mcell_set_2; SUBSET; IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6388 (EXISTS_TAC `ul:(real^3)list,i:num`);
6390 (ASM_REWRITE_TAC[]);
6391 (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
6392 (ASM_REWRITE_TAC[]);
6394 (REWRITE_TAC[MESON[IN] `(0..4) i <=> i IN 0..4`]);
6395 (ASM_REWRITE_TAC[IN_NUMSEG_0]);
6396 (REWRITE_TAC[MESON[IN] `(A:real^3->bool) i <=> i IN A`]);
6397 (ASM_REWRITE_TAC[IN_NUMSEG_0]);
6398 (NEW_GOAL `(u0:real^3) IN V INTER x`);
6399 (REWRITE_WITH `V INTER x = VX V x`);
6400 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6401 (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
6402 (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
6403 (ASM_REWRITE_TAC[]);
6405 (SWITCH_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[VX]);
6406 (REWRITE_TAC[MESON[IN] `(A:real^3->bool) i <=> i IN A`]);
6408 (ASM_REWRITE_TAC[IN]);
6409 (UP_ASM_TAC THEN REWRITE_WITH
6410 `V INTER (x:real^3->bool) = set_of_list (truncate_simplex (i - 1) ul)`);
6411 (ASM_REWRITE_TAC[]);
6412 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
6413 (ASM_REWRITE_TAC[]);
6414 (NEW_GOAL `VX V x = V INTER x`);
6416 (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
6417 (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
6418 (ASM_REWRITE_TAC[]);
6420 (SWITCH_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[VX]);
6421 (REWRITE_TAC[MESON[IN] `(A:real^3->bool) i <=> i IN A`]);
6424 (ASM_CASES_TAC `i = 0`);
6426 (UNDISCH_TAC `VX V x u0` THEN ASM_REWRITE_TAC[]);
6427 (ASM_SIMP_TAC [Lepjbdj.LEPJBDJ_0]);
6428 (REWRITE_TAC[MESON[IN] `(A:real^3->bool) i <=> i IN A`]);
6432 (UNDISCH_TAC `VX V x u0` THEN ASM_REWRITE_TAC[]);
6433 (REWRITE_TAC[MESON[IN] `(A:real^3->bool) i <=> i IN A`]);
6435 (REWRITE_TAC[MESON[IN] `(A:real^3->bool) i <=> i IN A`]);
6436 (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> (u0 IN A ==> u0 IN B)`));
6437 (MATCH_MP_TAC Rogers.SET_OF_LIST_TRUNCATE_SIMPLEX_SUBSET);
6438 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1`);
6439 (MATCH_MP_TAC BARV_LENGTH_LEMMA);
6440 (EXISTS_TAC `V:real^3->bool`);
6441 (ASM_REWRITE_TAC[]);
6443 (MATCH_MP_TAC (ARITH_RULE `(?b. a:num <= b /\ b <= c) ==> a <= c`));
6444 (EXISTS_TAC `CARD (IMAGE (f:(real^3)list#num->real^3->bool) S)`);
6446 (MATCH_MP_TAC CARD_SUBSET);
6447 (ASM_REWRITE_TAC[]);
6448 (MATCH_MP_TAC FINITE_IMAGE);
6449 (ASM_REWRITE_TAC[]);
6451 (MATCH_MP_TAC (ARITH_RULE `(?b. a:num <= b /\ b <= c) ==> a <= c`));
6452 (EXISTS_TAC `CARD (S:(real^3)list#num->bool)`);
6454 (MATCH_MP_TAC CARD_IMAGE_LE);
6455 (ASM_REWRITE_TAC[]);
6458 `S = {ul,i |ul IN {ul | barV V 3 ul /\ u0 IN set_of_list ul}/\ i IN 0..4}`);
6459 (EXPAND_TAC "S" THEN SET_TAC[]);
6461 `CARD {ul,i |ul IN {ul | barV V 3 ul /\ u0 IN set_of_list ul}/\ i IN 0..4} =
6462 CARD {ul | barV V 3 ul /\ u0 IN set_of_list ul} * CARD (0..4)`);
6463 (MATCH_MP_TAC CARD_PRODUCT);
6464 (REWRITE_TAC[FINITE_NUMSEG]);
6465 (MATCH_MP_TAC FINITE_SUBSET);
6467 (ABBREV_TAC `T1 = V INTER ball (u0:real^3, &4)`);
6468 (NEW_GOAL `FINITE (T1:real^3->bool)`);
6469 (EXPAND_TAC "T1" THEN MATCH_MP_TAC FINITE_PACK_LEMMA);
6470 (ASM_REWRITE_TAC[]);
6472 (EXISTS_TAC `{ul | ?v0 v1 v2 v3.
6473 v0 IN T1 /\ v1 IN T1 /\ v2 IN T1 /\ v3 IN T1 /\
6474 ul = [v0;v1;v2;v3:real^3]}`);
6476 (MATCH_MP_TAC Ajripqn.FINITE_SET_LIST_LEMMA THEN ASM_REWRITE_TAC[]);
6478 (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM]);
6480 (NEW_GOAL `?v0 v1 v2 v3. x = [v0:real^3; v1; v2; v3]`);
6481 (MATCH_MP_TAC BARV_3_EXPLICIT);
6482 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6483 (UP_ASM_TAC THEN STRIP_TAC THEN EXISTS_TAC `v0:real^3` THEN EXISTS_TAC
6484 `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
6485 (ASM_REWRITE_TAC[]);
6486 (NEW_GOAL `set_of_list (x:(real^3)list) SUBSET T1`);
6487 (EXPAND_TAC "T1" THEN REWRITE_TAC[SUBSET_INTER]);
6489 (MATCH_MP_TAC Packing3.BARV_SUBSET);
6490 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
6491 (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
6492 (EXISTS_TAC `V:(real^3->bool)`);
6493 (ASM_REWRITE_TAC[]);
6494 (UNDISCH_TAC `set_of_list (x:(real^3)list) u0` THEN ASM_REWRITE_TAC[IN]);
6495 (UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list] THEN SET_TAC[]);
6497 (REWRITE_TAC[CARD_NUMSEG; ARITH_RULE `(4 + 1) - 0 = 5`]);
6498 (REWRITE_TAC[ARITH_RULE `a * 5 <= 1220703125 <=> a <= 244140625`]);
6500 (ABBREV_TAC `T1 = V INTER ball (u0:real^3, &4)`);
6501 (NEW_GOAL `FINITE (T1:real^3->bool)`);
6502 (EXPAND_TAC "T1" THEN MATCH_MP_TAC FINITE_PACK_LEMMA);
6503 (ASM_REWRITE_TAC[]);
6505 (NEW_GOAL `{ul | barV V 3 ul /\ u0 IN set_of_list ul} SUBSET
6507 v0 IN T1 /\ v1 IN T1 /\ v2 IN T1 /\ v3 IN T1 /\
6508 ul = [v0;v1;v2;v3]}`);
6509 (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM]);
6511 (NEW_GOAL `?v0 v1 v2 v3. x = [v0:real^3; v1; v2; v3]`);
6512 (MATCH_MP_TAC BARV_3_EXPLICIT);
6513 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6514 (UP_ASM_TAC THEN STRIP_TAC THEN EXISTS_TAC `v0:real^3` THEN EXISTS_TAC
6515 `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
6516 (ASM_REWRITE_TAC[]);
6517 (NEW_GOAL `set_of_list (x:(real^3)list) SUBSET T1`);
6518 (EXPAND_TAC "T1" THEN REWRITE_TAC[SUBSET_INTER]);
6520 (MATCH_MP_TAC Packing3.BARV_SUBSET);
6521 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
6522 (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
6523 (EXISTS_TAC `V:(real^3->bool)`);
6524 (ASM_REWRITE_TAC[]);
6525 (UNDISCH_TAC `set_of_list (x:(real^3)list) u0` THEN ASM_REWRITE_TAC[IN]);
6526 (UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list] THEN SET_TAC[]);
6528 (MATCH_MP_TAC (ARITH_RULE `(?x. a <= x /\ x <= b:num) ==> a <= b`));
6529 (EXISTS_TAC `CARD {ul | ?v0 v1 v2 v3.
6534 ul = [v0:real^3; v1; v2; v3]}`);
6536 (MATCH_MP_TAC CARD_SUBSET);
6537 (ASM_REWRITE_TAC[] THEN MATCH_MP_TAC FINITE_SET_LIST_LEMMA);
6538 (ASM_REWRITE_TAC[]);
6545 y = [u0:real^3; u1; u2; u3:real^3]} =
6546 CARD T1 * CARD T1 * CARD T1 * CARD T1`);
6547 (ASM_SIMP_TAC [CARD_LIST_4_klemma]);
6548 (NEW_GOAL `CARD (T1:real^3->bool) <= 125`);
6550 (MATCH_MP_TAC BOUNDS_V4_klemma);
6551 (ASM_REWRITE_TAC[]);
6552 (NEW_GOAL `CARD (T1:real^3->bool) * CARD T1 <= 125 * 125`);
6553 (MATCH_MP_TAC LE_MULT2);
6554 (ASM_REWRITE_TAC[]);
6555 (NEW_GOAL `CARD (T1:real^3->bool) * CARD T1 * CARD T1 <= 125 * 125 * 125`);
6556 (MATCH_MP_TAC LE_MULT2);
6557 (ASM_REWRITE_TAC[]);
6558 (NEW_GOAL `CARD (T1:real^3->bool) * CARD T1 * CARD T1 * CARD T1 <=
6559 125 * 125 * 125 * 125`);
6560 (MATCH_MP_TAC LE_MULT2);
6561 (ASM_REWRITE_TAC[]);
6562 (UP_ASM_TAC THEN ARITH_TAC)]);;
6564 (* ==================================================================== *)
6566 let BOUND_BETA_BUMP = prove_by_refinement (
6568 saturated V /\ packing V /\ mcell_set V X /\ critical_edgeX V X e
6569 ==> beta_bump V e X <= c`,
6570 [(EXISTS_TAC `&614400`);
6571 (REWRITE_TAC[mcell_set_2; IN_ELIM_THM; IN; beta_bump]);
6572 (REPEAT STRIP_TAC THEN LET_TAC);
6573 (UP_ASM_TAC THEN REWRITE_TAC[cell_params]);
6575 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6577 (ABBREV_TAC `P = (\(k,ul'). k <= 4 /\ ul' IN barV V 3 /\
6578 mcell i V ul = mcell k V ul')`);
6579 (NEW_GOAL `(P:(num#(real^3)list->bool)) (k,ul')`);
6580 (ASM_REWRITE_TAC[]);
6581 (MATCH_MP_TAC SELECT_AX);
6582 (EXISTS_TAC `(i:num,ul:(real^3)list)`);
6584 (REWRITE_TAC[BETA_THM]);
6585 (ASM_REWRITE_TAC[IN]);
6586 (UP_ASM_TAC THEN EXPAND_TAC "P");
6587 (REWRITE_TAC[BETA_THM; IN] THEN STRIP_TAC);
6589 (ABBREV_TAC `S = {e',e'',p,vl | 4 = k /\
6590 {e', e''} = critical_edgeX V X /\
6593 left_action_list p ul' = vl /\
6594 {EL 0 vl, EL 1 vl} = e' /\
6595 {EL 2 vl, EL 3 vl} = e''}`);
6597 (NEW_GOAL `?u0 u1 u2 u3. ul = [u0;u1;u2;u3:real^3]`);
6598 (MATCH_MP_TAC BARV_3_EXPLICIT);
6599 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6600 (UP_ASM_TAC THEN STRIP_TAC);
6601 (ABBREV_TAC `K1 = {us:real^3->bool | us SUBSET set_of_list ul}`);
6602 (NEW_GOAL `FINITE (K1:(real^3->bool)->bool)`);
6603 (EXPAND_TAC "K1" THEN MATCH_MP_TAC FINITE_POWERSET);
6604 (ASM_REWRITE_TAC[set_of_list; Geomdetail.FINITE6]);
6606 (NEW_GOAL `critical_edgeX V X SUBSET K1`);
6607 (EXPAND_TAC "K1" THEN
6608 REWRITE_TAC[critical_edgeX; edgeX; SUBSET; IN; IN_ELIM_THM]);
6611 (NEW_GOAL `(x:real^3->bool) SUBSET set_of_list ul`);
6612 (REWRITE_TAC[ASSUME `x = {u, v:real^3}`; ASSUME `{u, v} = {u', v':real^3}`]);
6613 (NEW_GOAL `VX V X = V INTER X`);
6614 (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
6615 (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
6616 (ASM_REWRITE_TAC[]);
6618 (NEW_GOAL `VX V X = {}`);
6619 (ASM_REWRITE_TAC[VX]);
6620 (UNDISCH_TAC `VX V X u'` THEN
6621 ASM_REWRITE_TAC[MESON[IN] `{} x <=> x IN {}`] THEN SET_TAC[]);
6623 `V INTER (X:real^3->bool) = set_of_list (truncate_simplex (i - 1) ul)`);
6624 (REWRITE_TAC[ASSUME `X = mcell i V ul`]);
6625 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
6626 (ASM_REWRITE_TAC[]);
6628 (ASM_CASES_TAC `i = 0`);
6630 (NEW_GOAL `VX V X = {}`);
6631 (REWRITE_TAC[ASSUME `VX V X = V INTER X`; ASSUME `X = mcell i V ul`;
6633 (MATCH_MP_TAC Lepjbdj.LEPJBDJ_0);
6634 (ASM_REWRITE_TAC[]);
6635 (UNDISCH_TAC `VX V X u'` THEN REWRITE_TAC[ASSUME `VX V X = {}`;
6636 MESON[IN] `{} x <=> x IN {}`] THEN SET_TAC[]);
6639 (REWRITE_TAC[GSYM (ASSUME `mcell i V ul = mcell k V ul'`);
6640 GSYM (ASSUME `X = mcell i V ul`)]);
6642 (NEW_GOAL `NULLSET X`);
6643 (REWRITE_TAC[NEGLIGIBLE_EMPTY; ASSUME `X = {}:real^3->bool`]);
6644 (NEW_GOAL `VX V X = {}`);
6645 (REWRITE_TAC[VX; ASSUME `NULLSET X`]);
6646 (UNDISCH_TAC `VX V X u'` THEN REWRITE_TAC[MESON[IN] `{} x <=> x IN {}`;
6647 ASSUME `VX V X = {}`] THEN SET_TAC[]);
6648 (NEW_GOAL `set_of_list (truncate_simplex (i - 1) ul) SUBSET
6649 set_of_list (ul:(real^3)list)`);
6650 (MATCH_MP_TAC Rogers.SET_OF_LIST_TRUNCATE_SIMPLEX_SUBSET);
6651 (ASM_REWRITE_TAC[LENGTH] THEN ASM_ARITH_TAC);
6657 (S:(real^3->bool)#(real^3->bool)#(num->num)#(real^3)list->bool)`);
6659 (MATCH_MP_TAC FINITE_SUBSET);
6660 (EXISTS_TAC `{e',e'',p,vl | {e', e''} = critical_edgeX V X /\
6662 left_action_list p ul' = vl:(real^3)list}`);
6664 (MATCH_MP_TAC FINITE_SUBSET);
6665 (EXISTS_TAC `{e',e'',p,vl | (e':real^3->bool) IN K1 /\ e'' IN K1 /\
6667 left_action_list p ul' = vl:(real^3)list}`);
6669 (ABBREV_TAC `S_temp = {e',e'',p | (e':real^3->bool) IN K1 /\ e'' IN K1 /\
6672 `f_temp = (\(e':real^3->bool,e'':real^3->bool,p).
6673 e',e'',p, (left_action_list p (ul':(real^3)list)))`);
6674 (MATCH_MP_TAC FINITE_SUBSET);
6675 (EXISTS_TAC `IMAGE (f_temp:(real^3->bool)#(real^3->bool)#(num->num)->(real^3->bool)#(real^3->bool)#(num->num)#(real^3)list) S_temp`);
6677 (MATCH_MP_TAC FINITE_IMAGE);
6679 (REWRITE_WITH `S_temp = {e':real^3->bool,u | e' IN K1 /\
6680 u IN {e'', p | e'' IN K1 /\p permutes 0..3}}`);
6681 (EXPAND_TAC "S_temp");
6683 (ABBREV_TAC `K2 = {e'':real^3->bool, p | e'' IN K1 /\p permutes 0..3}`);
6684 (MATCH_MP_TAC FINITE_PRODUCT);
6685 (ASM_REWRITE_TAC[]);
6688 `K2 = {e'':real^3->bool,p | e'' IN K1 /\ p IN {p | p permutes 0..3}}`);
6689 (EXPAND_TAC "K2" THEN SET_TAC[]);
6690 (MATCH_MP_TAC FINITE_PRODUCT);
6691 (ASM_REWRITE_TAC[]);
6692 (REWRITE_TAC[GSYM NUMSEG_LE; ARITH_RULE `a <= 3 <=> a < 4`;
6693 Marchal_cells_2_new.SET_OF_0_TO_3;
6694 Upfzbzm_support_lemmas.FINITE_PERMUTE_4]);
6695 (EXPAND_TAC "f_temp" THEN EXPAND_TAC "S_temp" THEN REWRITE_TAC[IMAGE]);
6696 (REWRITE_TAC[IN; SUBSET; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6697 (EXISTS_TAC `e':real^3->bool,e'':real^3->bool,p:num->num`);
6698 (ASM_REWRITE_TAC[]);
6699 (EXISTS_TAC `e':real^3->bool` THEN
6700 EXISTS_TAC `e'':real^3->bool` THEN EXISTS_TAC `p:num->num`);
6701 (ASM_REWRITE_TAC[]);
6702 (UP_ASM_TAC THEN SET_TAC[]);
6706 (* ------------------------------------------------------------------------ *)
6707 (* Finish proving S is FINITE *)
6708 (* ------------------------------------------------------------------------ *)
6710 (MATCH_MP_TAC (REAL_ARITH `(?x. a <= x /\ x <= b) ==> a <= b`));
6712 `sum (S:(real^3->bool)#(real^3->bool)#(num->num)#(real^3)list->bool)
6715 (MATCH_MP_TAC SUM_LE);
6716 (ASM_REWRITE_TAC[]);
6717 (EXPAND_TAC "S" THEN REWRITE_TAC[IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6718 (ASM_REWRITE_TAC[]);
6719 (REWRITE_TAC[GSYM (ASSUME `4 = k`); REAL_ARITH `a / &4 <= &100 <=> a <= &400`]);
6720 (REWRITE_TAC[bump]);
6721 (REWRITE_TAC[REAL_ARITH
6722 `#0.005 * (&1 - a) - #0.005 * (&1 - b) <= &400 <=>
6724 (MATCH_MP_TAC (REAL_ARITH `(&0 <= a /\ b <= c ==> b - a <= c)`));
6726 (MATCH_MP_TAC REAL_LE_DIV);
6727 (REWRITE_TAC[Real_ext.REAL_LE_POW_2]);
6728 (REWRITE_TAC[hplus; h0; REAL_ARITH
6729 `a / (#1.3254 - #1.26) pow 2 <= &80000 <=> a <= #342.1728`]);
6730 (NEW_GOAL `barV V 3 vl`);
6731 (MATCH_MP_TAC Qzksykg.QZKSYKG1);
6732 (EXISTS_TAC `ul':(real^3)list`);
6733 (EXISTS_TAC `4` THEN EXISTS_TAC `p:num->num`);
6734 (ASM_REWRITE_TAC[ARITH_RULE `4 - 1 = 3`]);
6737 (REWRITE_TAC[GSYM (ASSUME `mcell i V ul = mcell k V ul'`);
6738 GSYM (ASSUME `X = mcell i V ul`)]);
6740 (NEW_GOAL `critical_edgeX V X = {}`);
6741 (REWRITE_TAC[critical_edgeX ; edgeX; IN; IN_ELIM_THM;
6742 SET_RULE `X = {} <=> ~(?s. s IN X)`]);
6744 (NEW_GOAL `NULLSET X`);
6745 (ASM_MESON_TAC[NEGLIGIBLE_EMPTY]);
6746 (UNDISCH_TAC `VX V X v'` THEN REWRITE_TAC[VX; ASSUME `NULLSET X`]);
6747 (REWRITE_TAC[MESON[IN] `{} x <=> x IN {}`] THEN SET_TAC[]);
6748 (UNDISCH_TAC `critical_edgeX V X e`);
6749 (REWRITE_TAC[ASSUME `critical_edgeX V X = {}`; MESON[IN] `{} x <=> x IN {}`]
6753 (NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);
6754 (MATCH_MP_TAC BARV_3_EXPLICIT);
6755 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6756 (UP_ASM_TAC THEN REPEAT STRIP_TAC);
6757 (ASM_REWRITE_TAC[EL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; HD; TL]);
6758 (REWRITE_TAC[ARITH_RULE `SUC (SUC 0) = 2`]);
6759 (NEW_GOAL `(hl [v2; v3:real^3] - #1.26) pow 2 <= (&10) pow 2`);
6760 (REWRITE_TAC[GSYM REAL_LE_SQUARE_ABS; REAL_ARITH `abs (&10) = &10`]);
6761 (ASM_CASES_TAC `&0 <= hl [v2; v3:real^3] - #1.26`);
6762 (REWRITE_WITH `abs (hl [v2; v3:real^3] - #1.26) = hl [v2; v3] - #1.26`);
6763 (ASM_REAL_ARITH_TAC);
6766 REAL_ARITH `inv (&2) * a - #1.26 <= &10 <=> a <= #22.52`]);
6767 (NEW_GOAL `set_of_list vl SUBSET ball (v2:real^3,&4)`);
6768 (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
6769 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[set_of_list]);
6771 (UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list] THEN STRIP_TAC);
6772 (SUBGOAL_THEN `v3:real^3 IN ball (v2, &k)` MP_TAC);
6773 (UP_ASM_TAC THEN SET_TAC[]);
6774 (REWRITE_TAC[IN_BALL; GSYM (ASSUME `4 = k`)]);
6776 (REWRITE_WITH `abs (hl [v2; v3] - #1.26) = #1.26 - hl [v2; v3:real^3]`);
6777 (ASM_REAL_ARITH_TAC);
6778 (MATCH_MP_TAC (REAL_ARITH `&0 <= a ==> #1.26 - a <= &10`));
6779 (REWRITE_TAC[HL_2] THEN NORM_ARITH_TAC);
6780 (UP_ASM_TAC THEN REAL_ARITH_TAC);
6781 (ASM_SIMP_TAC[SUM_CONST]);
6785 (MATCH_MP_TAC (REAL_ARITH `(?s. x <= s /\ s <= b) ==> x <= b`));
6786 (EXISTS_TAC `& (CARD {e',e'',p,vl | {e', e''} = critical_edgeX V X /\
6788 left_action_list p ul' = vl:(real^3)list}) * &100 `);
6790 (REWRITE_TAC[REAL_ARITH `a * &100 <= b * &100 <=> a <= b`]);
6791 (REWRITE_TAC[REAL_OF_NUM_LE]);
6792 (MATCH_MP_TAC CARD_SUBSET);
6795 (MATCH_MP_TAC FINITE_SUBSET);
6798 (EXISTS_TAC `{e',e'',p,vl | (e':real^3->bool) IN K1 /\ e'' IN K1 /\
6800 left_action_list p ul' = vl:(real^3)list}`);
6802 (ABBREV_TAC `S_temp = {e',e'',p | (e':real^3->bool) IN K1 /\ e'' IN K1 /\
6805 `f_temp = (\(e':real^3->bool,e'':real^3->bool,p).
6806 e',e'',p, (left_action_list p (ul':(real^3)list)))`);
6807 (MATCH_MP_TAC FINITE_SUBSET);
6808 (EXISTS_TAC `IMAGE (f_temp:(real^3->bool)#(real^3->bool)#(num->num)->(real^3->bool)#(real^3->bool)#(num->num)#(real^3)list) S_temp`);
6810 (MATCH_MP_TAC FINITE_IMAGE);
6812 (REWRITE_WITH `S_temp = {e':real^3->bool,u | e' IN K1 /\
6813 u IN {e'', p | e'' IN K1 /\p permutes 0..3}}`);
6814 (EXPAND_TAC "S_temp");
6816 (ABBREV_TAC `K2 = {e'':real^3->bool, p | e'' IN K1 /\p permutes 0..3}`);
6817 (MATCH_MP_TAC FINITE_PRODUCT);
6818 (ASM_REWRITE_TAC[]);
6821 `K2 = {e'':real^3->bool,p | e'' IN K1 /\ p IN {p | p permutes 0..3}}`);
6822 (EXPAND_TAC "K2" THEN SET_TAC[]);
6823 (MATCH_MP_TAC FINITE_PRODUCT);
6824 (ASM_REWRITE_TAC[]);
6825 (REWRITE_TAC[GSYM NUMSEG_LE; ARITH_RULE `a <= 3 <=> a < 4`;
6826 Marchal_cells_2_new.SET_OF_0_TO_3;
6827 Upfzbzm_support_lemmas.FINITE_PERMUTE_4]);
6828 (EXPAND_TAC "f_temp" THEN EXPAND_TAC "S_temp" THEN REWRITE_TAC[IMAGE]);
6829 (REWRITE_TAC[IN; SUBSET; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6830 (EXISTS_TAC `e':real^3->bool,e'':real^3->bool,p:num->num`);
6831 (ASM_REWRITE_TAC[]);
6832 (EXISTS_TAC `e':real^3->bool` THEN
6833 EXISTS_TAC `e'':real^3->bool` THEN EXISTS_TAC `p:num->num`);
6834 (ASM_REWRITE_TAC[]);
6835 (SWITCH_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
6837 (MATCH_MP_TAC (REAL_ARITH `(?s. x <= s /\ s <= b) ==> x <= b`));
6838 (EXISTS_TAC `& (CARD {e',e'',p,vl | (e':real^3->bool) IN K1 /\ e'' IN K1 /\
6840 left_action_list p ul' = vl:(real^3)list}) * &100 `);
6842 (REWRITE_TAC[REAL_ARITH `a * &100 <= b * &100 <=> a <= b`]);
6843 (REWRITE_TAC[REAL_OF_NUM_LE]);
6844 (MATCH_MP_TAC CARD_SUBSET);
6846 (SWITCH_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
6849 (ABBREV_TAC `S_temp = {e',e'',p | (e':real^3->bool) IN K1 /\ e'' IN K1 /\
6852 `f_temp = (\(e':real^3->bool,e'':real^3->bool,p).
6853 e',e'',p, (left_action_list p (ul':(real^3)list)))`);
6854 (MATCH_MP_TAC FINITE_SUBSET);
6855 (EXISTS_TAC `IMAGE (f_temp:(real^3->bool)#(real^3->bool)#(num->num)->(real^3->bool)#(real^3->bool)#(num->num)#(real^3)list) S_temp`);
6857 (MATCH_MP_TAC FINITE_IMAGE);
6859 (REWRITE_WITH `S_temp = {e':real^3->bool,u | e' IN K1 /\
6860 u IN {e'', p | e'' IN K1 /\p permutes 0..3}}`);
6861 (EXPAND_TAC "S_temp");
6863 (ABBREV_TAC `K2 = {e'':real^3->bool, p | e'' IN K1 /\p permutes 0..3}`);
6864 (MATCH_MP_TAC FINITE_PRODUCT);
6865 (ASM_REWRITE_TAC[]);
6868 `K2 = {e'':real^3->bool,p | e'' IN K1 /\ p IN {p | p permutes 0..3}}`);
6869 (EXPAND_TAC "K2" THEN SET_TAC[]);
6870 (MATCH_MP_TAC FINITE_PRODUCT);
6871 (ASM_REWRITE_TAC[]);
6872 (REWRITE_TAC[GSYM NUMSEG_LE; ARITH_RULE `a <= 3 <=> a < 4`;
6873 Marchal_cells_2_new.SET_OF_0_TO_3;
6874 Upfzbzm_support_lemmas.FINITE_PERMUTE_4]);
6875 (EXPAND_TAC "f_temp" THEN EXPAND_TAC "S_temp" THEN REWRITE_TAC[IMAGE]);
6876 (REWRITE_TAC[IN; SUBSET; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6877 (EXISTS_TAC `e':real^3->bool,e'':real^3->bool,p:num->num`);
6878 (ASM_REWRITE_TAC[]);
6879 (EXISTS_TAC `e':real^3->bool` THEN
6880 EXISTS_TAC `e'':real^3->bool` THEN EXISTS_TAC `p:num->num`);
6881 (ASM_REWRITE_TAC[]);
6884 (MATCH_MP_TAC (REAL_ARITH `(?s. x <= s /\ s <= b) ==> x <= b`));
6885 (ABBREV_TAC `S_temp = {e',e'',p | (e':real^3->bool) IN K1 /\ e'' IN K1 /\
6888 `f_temp = (\(e':real^3->bool,e'':real^3->bool,p).
6889 e',e'',p, (left_action_list p (ul':(real^3)list)))`);
6890 (EXISTS_TAC `& (CARD (IMAGE (f_temp:(real^3->bool)#(real^3->bool)#(num->num)->(real^3->bool)#(real^3->bool)#(num->num)#(real^3)list) S_temp)) * &100`);
6893 (REWRITE_TAC[REAL_ARITH `a * &100 <= b * &100 <=> a <= b`]);
6894 (REWRITE_TAC[REAL_OF_NUM_LE]);
6895 (MATCH_MP_TAC CARD_SUBSET);
6897 (EXPAND_TAC "f_temp" THEN EXPAND_TAC "S_temp" THEN REWRITE_TAC[IMAGE]);
6898 (REWRITE_TAC[IN; SUBSET; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6899 (EXISTS_TAC `e':real^3->bool,e'':real^3->bool,p:num->num`);
6900 (ASM_REWRITE_TAC[]);
6901 (EXISTS_TAC `e':real^3->bool` THEN
6902 EXISTS_TAC `e'':real^3->bool` THEN EXISTS_TAC `p:num->num`);
6903 (ASM_REWRITE_TAC[]);
6905 (MATCH_MP_TAC FINITE_IMAGE);
6906 (REWRITE_WITH `S_temp = {e':real^3->bool,u | e' IN K1 /\
6907 u IN {e'', p | e'' IN K1 /\p permutes 0..3}}`);
6908 (EXPAND_TAC "S_temp");
6910 (ABBREV_TAC `K2 = {e'':real^3->bool, p | e'' IN K1 /\p permutes 0..3}`);
6911 (MATCH_MP_TAC FINITE_PRODUCT);
6912 (ASM_REWRITE_TAC[]);
6915 `K2 = {e'':real^3->bool,p | e'' IN K1 /\ p IN {p | p permutes 0..3}}`);
6916 (EXPAND_TAC "K2" THEN SET_TAC[]);
6917 (MATCH_MP_TAC FINITE_PRODUCT);
6918 (ASM_REWRITE_TAC[]);
6919 (REWRITE_TAC[GSYM NUMSEG_LE; ARITH_RULE `a <= 3 <=> a < 4`;
6920 Marchal_cells_2_new.SET_OF_0_TO_3;
6921 Upfzbzm_support_lemmas.FINITE_PERMUTE_4]);
6923 (MATCH_MP_TAC (REAL_ARITH `(?s. x <= s /\ s <= b) ==> x <= b`));
6925 `& (CARD (S_temp:(real^3->bool)#(real^3->bool)#(num->num)->bool)) * &100`);
6927 (REWRITE_TAC[REAL_ARITH `a * &100 <= b * &100 <=> a <= b`]);
6928 (REWRITE_TAC[REAL_OF_NUM_LE]);
6929 (MATCH_MP_TAC CARD_IMAGE_LE);
6930 (REWRITE_WITH `S_temp = {e':real^3->bool,u | e' IN K1 /\
6931 u IN {e'', p | e'' IN K1 /\p permutes 0..3}}`);
6932 (EXPAND_TAC "S_temp");
6934 (ABBREV_TAC `K2 = {e'':real^3->bool, p | e'' IN K1 /\p permutes 0..3}`);
6935 (MATCH_MP_TAC FINITE_PRODUCT);
6936 (ASM_REWRITE_TAC[]);
6939 `K2 = {e'':real^3->bool,p | e'' IN K1 /\ p IN {p | p permutes 0..3}}`);
6940 (EXPAND_TAC "K2" THEN SET_TAC[]);
6941 (MATCH_MP_TAC FINITE_PRODUCT);
6942 (ASM_REWRITE_TAC[]);
6943 (REWRITE_TAC[GSYM NUMSEG_LE; ARITH_RULE `a <= 3 <=> a < 4`;
6944 Marchal_cells_2_new.SET_OF_0_TO_3;
6945 Upfzbzm_support_lemmas.FINITE_PERMUTE_4]);
6947 (REWRITE_WITH `S_temp = {e':real^3->bool,u | e' IN K1 /\
6948 u IN {e'', p | e'' IN K1 /\p permutes 0..3}}`);
6949 (EXPAND_TAC "S_temp");
6951 (ABBREV_TAC `K2 = {e'':real^3->bool, p | e'' IN K1 /\p permutes 0..3}`);
6952 (REWRITE_WITH `CARD {e':real^3->bool,u:(real^3->bool)#(num->num) |
6953 e' IN K1 /\ u IN K2} = CARD K1 * CARD K2`);
6954 (MATCH_MP_TAC CARD_PRODUCT);
6955 (ASM_REWRITE_TAC[]);
6958 `K2 = {e'':real^3->bool,p | e'' IN K1 /\ p IN {p | p permutes 0..3}}`);
6959 (EXPAND_TAC "K2" THEN SET_TAC[]);
6960 (MATCH_MP_TAC FINITE_PRODUCT);
6961 (ASM_REWRITE_TAC[]);
6962 (REWRITE_TAC[GSYM NUMSEG_LE; ARITH_RULE `a <= 3 <=> a < 4`;
6963 Marchal_cells_2_new.SET_OF_0_TO_3;
6964 Upfzbzm_support_lemmas.FINITE_PERMUTE_4]);
6966 (REWRITE_WITH `CARD (K2:(real^3->bool)#(num->num)->bool) =
6967 CARD (K1:(real^3->bool)->bool) * CARD {p | p permutes 0..3}`);
6969 `K2 = {e'':real^3->bool,p | e'' IN K1 /\ p IN {p | p permutes 0..3}}`);
6970 (EXPAND_TAC "K2" THEN SET_TAC[]);
6971 (MATCH_MP_TAC CARD_PRODUCT);
6972 (ASM_REWRITE_TAC[]);
6973 (REWRITE_TAC[GSYM NUMSEG_LE; ARITH_RULE `a <= 3 <=> a < 4`;
6974 Marchal_cells_2_new.SET_OF_0_TO_3;
6975 Upfzbzm_support_lemmas.FINITE_PERMUTE_4]);
6976 (REWRITE_WITH `CARD (K1:(real^3->bool)->bool) = 16`);
6978 (REWRITE_WITH `16 = 2 EXP (CARD (set_of_list (ul:(real^3)list)))`);
6979 (REWRITE_WITH `CARD (set_of_list (ul:(real^3)list)) = 3 + 1`);
6980 (MATCH_MP_TAC BARV_CARD_LEMMA);
6981 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6984 (MATCH_MP_TAC CARD_POWERSET);
6985 (ASM_REWRITE_TAC[set_of_list; Geomdetail.FINITE6]);
6986 (REWRITE_WITH `CARD {p | p permutes 0..3} = FACT (CARD (0..3))`);
6987 (MATCH_MP_TAC CARD_PERMUTATIONS);
6988 (REWRITE_TAC[FINITE_NUMSEG]);
6989 (REWRITE_TAC[CARD_NUMSEG; ARITH_RULE `16 * 16 * FACT ((3 + 1) - 0) = 6144`]);
6991 (REAL_ARITH_TAC)]);;
6993 (* ==================================================================== *)
6996 let MCELL_SUBSET_BALL8_2 = prove (
6997 `!V X v. packing V /\ saturated V /\ mcell_set V X /\ v IN X
6998 ==> X SUBSET ball (v,&8)`,
6999 REWRITE_TAC[mcell_set; IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN
7000 UP_ASM_TAC THEN ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
7001 MATCH_MP_TAC MCELL_SUBSET_BALL8 THEN ASM_REWRITE_TAC[] THEN ASM_SET_TAC[]);;
7003 (* ==================================================================== *)
7005 let critical_edge_subset_mcell = prove_by_refinement (
7006 `!V X x. packing V /\ saturated V /\ mcell_set V X /\ critical_edgeX V X x
7008 [(REWRITE_TAC[mcell_set_2; critical_edgeX; edgeX; IN_ELIM_THM; IN]);
7010 (NEW_GOAL `VX V X = V INTER X`);
7011 (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
7012 (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
7013 (ASM_REWRITE_TAC[]);
7014 (STRIP_TAC THEN UNDISCH_TAC `VX V X u'` THEN
7015 ASM_REWRITE_TAC[VX; MESON[IN] `{} u <=> u IN {}`] THEN SET_TAC[]);
7018 (* ==================================================================== *)
7021 let EDGEX_SUBSET_MCELL = prove_by_refinement (
7022 `!V X e. packing V /\ saturated V /\ mcell_set V X /\ edgeX V X e
7024 [(REWRITE_TAC[edgeX; IN; IN_ELIM_THM; mcell_set] THEN REPEAT STRIP_TAC);
7025 (NEW_GOAL `VX V X = V INTER X`);
7026 (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
7027 (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num` THEN ASM_REWRITE_TAC[]
7028 THEN STRIP_TAC THEN UNDISCH_TAC `VX V X u` THEN
7029 ASM_REWRITE_TAC[VX; MESON[IN] `{} x <=> x IN {}`] THEN SET_TAC[]);
7032 let CRITICAL_EDGEX_SUBSET_MCELL = prove (
7033 `!V X e. packing V /\ saturated V /\ mcell_set V X /\ critical_edgeX V X e
7035 (REPEAT STRIP_TAC) THEN
7036 (MATCH_MP_TAC EDGEX_SUBSET_MCELL) THEN
7037 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]) THEN
7038 (UP_ASM_TAC THEN REWRITE_TAC[critical_edgeX] THEN SET_TAC[]));;
7040 (* ==================================================================== *)
7043 let FINITE_VX = prove_by_refinement (
7044 `!V X. packing V /\ saturated V /\ mcell_set V X ==> FINITE (VX V X)`,
7045 [(REWRITE_TAC[mcell_set_2; IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
7046 (ASM_CASES_TAC `VX V X = {}`);
7047 (ASM_REWRITE_TAC[FINITE_EMPTY]);
7048 (REWRITE_WITH `VX V X = V INTER X`);
7049 (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
7050 (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num` THEN ASM_REWRITE_TAC[]
7051 THEN STRIP_TAC THEN UNDISCH_TAC `~(VX V X = {})` THEN
7052 ASM_REWRITE_TAC[VX]);
7053 (ASM_CASES_TAC `V INTER (X:real^3->bool) = {}`);
7054 (ASM_REWRITE_TAC[FINITE_EMPTY]);
7056 `(V:real^3->bool) INTER X = set_of_list (truncate_simplex (i-1) ul)`);
7057 (ASM_REWRITE_TAC[]);
7058 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
7059 (ASM_REWRITE_TAC[]);
7061 (ASM_CASES_TAC `i = 0`);
7063 (UNDISCH_TAC `~(V INTER (X:real^3->bool) = {})`);
7064 (ASM_REWRITE_TAC[]);
7065 (MATCH_MP_TAC Lepjbdj.LEPJBDJ_0);
7066 (ASM_REWRITE_TAC[]);
7070 (UNDISCH_TAC `~(VX V X = {})` THEN ASM_REWRITE_TAC[VX; NEGLIGIBLE_EMPTY]);
7071 (REWRITE_TAC[FINITE_SET_OF_LIST])]);;
7073 (* ==================================================================== *)
7076 let CARD_EDGEX_LE_16 = prove_by_refinement (
7077 `!V X. packing V /\ saturated V /\ mcell_set V X
7078 ==> CARD (edgeX V X) <= 16`,
7079 [(REWRITE_TAC[edgeX] THEN REPEAT STRIP_TAC);
7080 (ABBREV_TAC `S = {u, v | VX V X u /\ VX V X v /\ ~(u = v)}`);
7081 (ABBREV_TAC `f = (\(u,v:real^3). {u,v})`);
7082 (MATCH_MP_TAC (ARITH_RULE `(?x:num. y <= x /\ x <= z) ==> y <= z`));
7083 (EXISTS_TAC `CARD (IMAGE (f:(real^3#real^3)->(real^3->bool)) S)`);
7085 (MATCH_MP_TAC CARD_SUBSET);
7087 (EXPAND_TAC "f" THEN EXPAND_TAC "S" THEN
7088 REWRITE_TAC[IMAGE; SUBSET; IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
7089 (EXISTS_TAC `u:real^3,v:real^3` THEN ASM_REWRITE_TAC[]);
7090 (EXISTS_TAC `u:real^3` THEN EXISTS_TAC `v:real^3` THEN ASM_REWRITE_TAC[]);
7091 (MATCH_MP_TAC FINITE_IMAGE);
7092 (MATCH_MP_TAC FINITE_SUBSET);
7093 (EXISTS_TAC `{u,v | u IN VX V X /\ v IN VX V X}`);
7095 (MATCH_MP_TAC FINITE_PRODUCT);
7096 (REWRITE_TAC[] THEN MATCH_MP_TAC FINITE_VX);
7097 (ASM_REWRITE_TAC[]);
7100 (MATCH_MP_TAC (ARITH_RULE `(?x:num. y <= x /\ x <= z) ==> y <= z`));
7101 (EXISTS_TAC `CARD (S:(real^3#real^3)->bool)`);
7103 (MATCH_MP_TAC CARD_IMAGE_LE);
7104 (MATCH_MP_TAC FINITE_SUBSET);
7105 (EXISTS_TAC `{u,v | u IN VX V X /\ v IN VX V X}`);
7107 (MATCH_MP_TAC FINITE_PRODUCT);
7108 (REWRITE_TAC[] THEN MATCH_MP_TAC FINITE_VX);
7109 (ASM_REWRITE_TAC[]);
7112 (MATCH_MP_TAC (ARITH_RULE `(?x:num. y <= x /\ x <= z) ==> y <= z`));
7113 (EXISTS_TAC `CARD {u,v | u IN VX V X /\ v IN VX V X}`);
7115 (MATCH_MP_TAC CARD_SUBSET);
7118 (MATCH_MP_TAC FINITE_PRODUCT);
7119 (REWRITE_TAC[] THEN MATCH_MP_TAC FINITE_VX);
7120 (ASM_REWRITE_TAC[]);
7122 `CARD {u,v | u IN VX V X /\ v IN VX V X} = CARD (VX V X) * CARD (VX V X)`);
7123 (MATCH_MP_TAC CARD_PRODUCT THEN ASM_SIMP_TAC[FINITE_VX]);
7125 (UNDISCH_TAC `mcell_set V X` THEN REWRITE_TAC[mcell_set_2; IN; IN_ELIM_THM]);
7128 (ASM_CASES_TAC `VX V X = {}`);
7129 (ASM_REWRITE_TAC[CARD_CLAUSES] THEN ARITH_TAC);
7130 (REWRITE_WITH `VX V X = V INTER X`);
7131 (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
7132 (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num` THEN ASM_REWRITE_TAC[]
7133 THEN STRIP_TAC THEN UNDISCH_TAC `~(VX V X = {})` THEN
7134 ASM_REWRITE_TAC[VX]);
7135 (ASM_CASES_TAC `V INTER (X:real^3->bool) = {}`);
7136 (ASM_REWRITE_TAC[CARD_CLAUSES] THEN ARITH_TAC);
7138 `(V:real^3->bool) INTER X = set_of_list (truncate_simplex (i-1) ul)`);
7139 (ASM_REWRITE_TAC[]);
7140 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
7141 (ASM_REWRITE_TAC[]);
7143 (ASM_CASES_TAC `i = 0`);
7145 (UNDISCH_TAC `~(V INTER (X:real^3->bool) = {})`);
7146 (ASM_REWRITE_TAC[]);
7147 (MATCH_MP_TAC Lepjbdj.LEPJBDJ_0);
7148 (ASM_REWRITE_TAC[]);
7152 (UNDISCH_TAC `~(VX V X = {})` THEN ASM_REWRITE_TAC[VX; NEGLIGIBLE_EMPTY]);
7153 (NEW_GOAL `CARD (set_of_list (truncate_simplex (i - 1) ul)) <=
7154 LENGTH (truncate_simplex (i - 1) (ul:(real^3)list))`);
7155 (REWRITE_TAC[CARD_SET_OF_LIST_LE]);
7156 (UP_ASM_TAC THEN REWRITE_WITH
7157 `LENGTH (truncate_simplex (i - 1) (ul:(real^3)list)) = (i - 1 + 1)`);
7158 (MATCH_MP_TAC Packing3.LENGTH_TRUNCATE_SIMPLEX);
7159 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1`);
7160 (MATCH_MP_TAC BARV_LENGTH_LEMMA);
7161 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7165 `s = CARD (set_of_list (truncate_simplex (i - 1) (ul:(real^3)list)))`);
7166 (NEW_GOAL `s <= 4`);
7168 (NEW_GOAL `s * s <= s * 4 /\ s * 4 <= 4 * 4`);
7169 (ASM_REWRITE_TAC[LE_MULT_LCANCEL; LE_MULT_RCANCEL]);
7172 (* ==================================================================== *)
7174 let gamma_y_lmfun_bound2 = prove_by_refinement (
7175 `?d. (!V X e. packing V /\ saturated V /\ mcell_set V X /\ edgeX V X e ==> gammaY V X lmfun e <= d)`,
7177 (EXISTS_TAC `pi * h0 / (h0 - &1)`);
7179 (ABBREV_TAC `f = (\u v. if {u, v} IN edgeX V X
7180 then dihX V X (u,v) * lmfun (hl [u; v])
7182 (REWRITE_WITH `gammaY V X lmfun = (\({u, v}). f u v)`);
7183 (EXPAND_TAC "f" THEN REWRITE_TAC[gammaY]);
7185 (NEW_GOAL `!u v. (f:real^3->real^3->real) u v = f v u`);
7186 (EXPAND_TAC "f" THEN REWRITE_TAC[BETA_THM]);
7187 (REWRITE_TAC[HL; set_of_list; SET_RULE `{a,b} = {b,a}`]);
7188 (REPEAT GEN_TAC THEN COND_CASES_TAC);
7190 (REWRITE_WITH `dihX V X (u,v) = dihX V X (v,u)`);
7191 (MATCH_MP_TAC DIHX_SYM);
7192 (ASM_REWRITE_TAC[]);
7193 (UP_ASM_TAC THEN MESON_TAC[]);
7195 (UP_ASM_TAC THEN MESON_TAC[]);
7198 (UNDISCH_TAC `edgeX V X e` THEN REWRITE_TAC[IN;IN_ELIM_THM; edgeX]);
7200 (ASM_REWRITE_TAC[]);
7202 (REWRITE_WITH `(\({u, v}). f u v) {u, v} =
7203 (f:real^3->real^3->real) u v`);
7204 (MATCH_MP_TAC BETA_PAIR_THM);
7205 (ASM_REWRITE_TAC[]);
7210 (NEW_GOAL `dihX V X (u,v) * lmfun (hl [u;v]) <= pi * lmfun (hl [u;v])`);
7211 (REWRITE_TAC[REAL_ARITH `a * x <= b * x <=> &0 <= (b - a) * x`]);
7212 (MATCH_MP_TAC REAL_LE_MUL);
7213 (REWRITE_TAC[lmfun_pos_le; REAL_ARITH `&0 <= a - b <=> b <= a`; DIHX_LE_PI]);
7215 (NEW_GOAL `pi * lmfun (hl [u:real^3;v]) <= pi * h0 / (h0 - &1)`);
7216 (REWRITE_TAC[REAL_ARITH `a * x <= a * y <=> &0 <= (y - x) * a`]);
7217 (MATCH_MP_TAC REAL_LE_MUL);
7218 (REWRITE_TAC[PI_POS_LE; REAL_ARITH `&0 <= a - b <=> b <= a`]);
7219 (MATCH_MP_TAC lmfun_bounded);
7220 (REWRITE_TAC[HL_2; REAL_ARITH `&0 <= inv (&2) * x <=> &0 <= x`; DIST_POS_LE]);
7221 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7222 (MATCH_MP_TAC REAL_LE_MUL);
7223 (REWRITE_TAC[PI_POS_LE]);
7224 (MATCH_MP_TAC REAL_LE_DIV);
7225 (REWRITE_TAC[h0] THEN REAL_ARITH_TAC)]);;
7227 (* ==================================================================== *)
7229 let BOUND_GAMMA_X_lmfun = prove_by_refinement (
7231 (!V X. packing V /\ saturated V /\ mcell_set V X ==> gammaX V X lmfun <= c)`,
7232 [(MP_TAC gamma_y_lmfun_bound2 THEN STRIP_TAC);
7233 (ABBREV_TAC `e = max d (&0)`);
7234 (EXISTS_TAC `&4 / &3 * pi * (&8) pow 3 + (&8 * mm2 / pi) * &16 * e`);
7236 (REWRITE_TAC[gammaX]);
7237 (MATCH_MP_TAC (REAL_ARITH
7238 `a <= x /\ &0 <= b /\ c <= y ==> a - b + c <= x + y`));
7240 (ASM_CASES_TAC `X:real^3->bool = {}`);
7241 (ASM_REWRITE_TAC[MEASURE_EMPTY;
7242 REAL_ARITH `&0 <= &4 / &3 * pi * &8 pow 3 <=> &0 <= pi`]);
7243 (REWRITE_TAC[PI_POS_LE]);
7244 (NEW_GOAL `?p:real^3. p IN X`);
7246 (UP_ASM_TAC THEN STRIP_TAC);
7247 (REWRITE_WITH `&4 / &3 * pi * &8 pow 3 = vol (ball (p, &8))`);
7248 (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC VOLUME_BALL);
7250 (MATCH_MP_TAC MEASURE_SUBSET);
7251 (REWRITE_TAC[MEASURABLE_BALL]);
7253 (UNDISCH_TAC `mcell_set V X` THEN REWRITE_TAC[mcell_set; IN; IN_ELIM_THM]);
7255 (ASM_REWRITE_TAC[]);
7256 (MATCH_MP_TAC MEASURABLE_MCELL);
7257 (ASM_REWRITE_TAC[]);
7258 (MATCH_MP_TAC MCELL_SUBSET_BALL8_2);
7259 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7260 (MATCH_MP_TAC REAL_LE_MUL);
7262 (REWRITE_TAC[REAL_ARITH `&0 <= &2 * a <=> &0 <= a`]);
7263 (MATCH_MP_TAC REAL_LE_DIV);
7265 (NEW_GOAL `#1.012080 < mm1`);
7266 (REWRITE_TAC[Flyspeck_constants.bounds]);
7267 (ASM_REAL_ARITH_TAC);
7268 (REWRITE_TAC[PI_POS_LE]);
7269 (REWRITE_TAC[total_solid]);
7270 (MATCH_MP_TAC SUM_POS_LE);
7272 (MATCH_MP_TAC FINITE_VX);
7273 (ASM_REWRITE_TAC[]);
7276 (NEW_GOAL `eventually_radial (x:real^3) X`);
7277 (UNDISCH_TAC `mcell_set V X` THEN REWRITE_TAC[mcell_set; IN; IN_ELIM_THM]);
7279 (ASM_REWRITE_TAC[]);
7280 (MATCH_MP_TAC Urrphbz2.URRPHBZ2);
7281 (ASM_REWRITE_TAC[]);
7282 (NEW_GOAL `VX V X = V INTER X`);
7283 (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
7284 (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
7285 (ASM_REWRITE_TAC[]);
7286 (STRIP_TAC THEN UNDISCH_TAC `x IN VX V X`);
7287 (ASM_REWRITE_TAC[VX] THEN SET_TAC[]);
7289 (UP_ASM_TAC THEN REWRITE_TAC[eventually_radial]);
7292 (REWRITE_WITH `sol x X = &3 * vol (X INTER normball x r) / r pow 3`);
7294 (REWRITE_TAC[GSYM Marchal_cells_2_new.RADIAL_VS_RADIAL_NORM; NORMBALL_BALL]);
7295 (ASM_REWRITE_TAC[]);
7296 (MATCH_MP_TAC MEASURABLE_INTER);
7297 (REWRITE_TAC[MEASURABLE_BALL]);
7298 (UNDISCH_TAC `mcell_set V X` THEN REWRITE_TAC[mcell_set; IN; IN_ELIM_THM]);
7300 (ASM_REWRITE_TAC[]);
7301 (MATCH_MP_TAC MEASURABLE_MCELL);
7302 (ASM_REWRITE_TAC[]);
7303 (REWRITE_TAC[REAL_ARITH `&0 <= &3 * a <=> &0 <= a`]);
7304 (MATCH_MP_TAC REAL_LE_DIV);
7306 (MATCH_MP_TAC MEASURE_POS_LE);
7307 (REWRITE_TAC[NORMBALL_BALL]);
7308 (MATCH_MP_TAC MEASURABLE_INTER);
7309 (REWRITE_TAC[MEASURABLE_BALL]);
7310 (UNDISCH_TAC `mcell_set V X` THEN REWRITE_TAC[mcell_set; IN; IN_ELIM_THM]);
7312 (ASM_REWRITE_TAC[]);
7313 (MATCH_MP_TAC MEASURABLE_MCELL);
7314 (ASM_REWRITE_TAC[]);
7315 (MATCH_MP_TAC Real_ext.REAL_PROP_NN_POW);
7316 (ASM_REAL_ARITH_TAC);
7317 (ONCE_REWRITE_TAC[REAL_ARITH `a <= b <=> &0 <= b - a`]);
7318 (REWRITE_TAC[REAL_ARITH `a * x - a * y = a * (x - y)`]);
7319 (MATCH_MP_TAC REAL_LE_MUL);
7322 (REWRITE_TAC[REAL_ARITH `&0 <= &8 * a <=> &0 <= a`]);
7323 (MATCH_MP_TAC REAL_LE_DIV);
7325 (NEW_GOAL `#0.02541 < mm2`);
7326 (REWRITE_TAC[Flyspeck_constants.bounds]);
7327 (ASM_REAL_ARITH_TAC);
7328 (REWRITE_TAC[PI_POS_LE]);
7329 (REWRITE_TAC[GSYM gammaY]);
7330 (ONCE_REWRITE_TAC[REAL_ARITH `&0 <= b - a <=> a <= b`]);
7331 (NEW_GOAL `sum (edgeX V X) (gammaY V X lmfun) <=
7332 sum (edgeX V X) (\x. e)`);
7333 (MATCH_MP_TAC SUM_LE);
7334 (REWRITE_TAC[Upfzbzm_support_lemmas.FINITE_edgeX]);
7336 (NEW_GOAL `gammaY V X lmfun x <= d`);
7337 (FIRST_ASSUM MATCH_MP_TAC);
7338 (ASM_REWRITE_TAC[]);
7339 (UP_ASM_TAC THEN REWRITE_TAC[IN]);
7340 (ASM_REAL_ARITH_TAC);
7342 (NEW_GOAL `sum (edgeX V X) (\x. e) <= &16 * e`);
7343 (REWRITE_WITH `sum (edgeX V X) (\x. e) = &(CARD (edgeX V X)) * e`);
7344 (MATCH_MP_TAC SUM_CONST);
7345 (REWRITE_TAC[Upfzbzm_support_lemmas.FINITE_edgeX]);
7347 (ONCE_REWRITE_TAC[REAL_ARITH `a <= b <=> &0 <= b - a`]);
7348 (REWRITE_TAC[REAL_ARITH `a * x - b * x = x * (a - b)`]);
7349 (MATCH_MP_TAC REAL_LE_MUL);
7351 (ASM_REAL_ARITH_TAC);
7352 (ONCE_REWRITE_TAC[REAL_ARITH `&0 <= b - a <=> a <= b`]);
7353 (REWRITE_TAC[REAL_OF_NUM_LE]);
7354 (MATCH_MP_TAC CARD_EDGEX_LE_16);
7355 (ASM_REWRITE_TAC[]);
7356 (ASM_REAL_ARITH_TAC)]);;
7358 (* ==================================================================== *)
7360 (* ==================================================================== *)
7362 (* ==================================================================== *)