(* ========================================================================= *)
(* FLYSPECK - BOOK FORMALIZATION *)
(* *)
(* Authour : VU KHAC KY *)
(* Book lemma: URRPHBZ2 *)
(* Chaper : Packing (Marchal Cells) *)
(* Date : December 2011 *)
(* With special thanks to John Harrison for the lemma OPEN_RCONE_GT *)
(* ========================================================================= *)
(* FILES NEED TO BE LOADED *)
(* flyspeck_needs "packing/marchal_cells_2.hl";; *)
(* flyspeck_needs "packing/LEPJBDJ.hl" *)
(* ========================================================================= *)
module Urrphbz2 = struct
open Rogers;;
open Vukhacky_tactics;;
open Pack_defs;;
open Pack_concl;;
open Pack1;;
open Sphere;;
open Marchal_cells;;
open Emnwuus;;
open Marchal_cells_2_new;;
open Lepjbdj;;
(* ========================================================================== *)
(* This lemma is in multivariate/flyspeck.hl *)
(* ========================================================================== *)
(* ======================================================================= *)
let EVENTUALLY_RADIAL_AFF_GE = prove_by_refinement(
`!a b c d:real^3.
DISJOINT {a,b} {c, d}
==>
eventually_radial a (aff_ge {a,b}{c,d})`,
[(STRIP_TAC THEN REWRITE_TAC[
eventually_radial; radial]);
(REPEAT STRIP_TAC);
(REWRITE_TAC[SET_RULE `a
INTER b
SUBSET b`]);
(EXISTS_TAC `&1` THEN REWRITE_TAC[REAL_ARITH `&1 > &0`]);
(ASM_SIMP_TAC[
AFF_GE_2_2]);
(REWRITE_TAC[
IN_INTER;
IN;
IN_ELIM_THM] THEN REPEAT STRIP_TAC);
(EXISTS_TAC `&1 - t * t2 - t * t3 - t * t4`);
(EXISTS_TAC `t * t2` THEN EXISTS_TAC `t * t3` THEN EXISTS_TAC `t * t4`);
(ASM_SIMP_TAC[
REAL_LE_MUL; REAL_ARITH `t > &0 ==> &0 <= t`]);
(STRIP_TAC);
(REAL_ARITH_TAC);
(REWRITE_WITH `u =
t1 % a + t2 % b + t3 % c + t4 % d - a:real^3`);
(UNDISCH_TAC `a + u:real^3 =
t1 % a + t2 % b + t3 % c + t4 % d` THEN VECTOR_ARITH_TAC);
(REWRITE_WITH
`a + t % (
t1 % a + t2 % b + t3 % c + t4 % d - a) =
(&1 - t * t2 - t * t3 - t * t4) % a +
(t * t2) % (b:real^3) + (t * t3) % c + (t * t4) % d
<=> (t *
t1 + t * t2 + t * t3 + t * t4 - t) % a =
vec 0`);
(VECTOR_ARITH_TAC);
(ASM_REWRITE_TAC[REAL_ARITH `t *
t1 + t * t2 + t * t3 + t * t4 - t = t * ((
t1
+ t2 + t3 + t4) - &1)`;
REAL_SUB_REFL;
REAL_MUL_RZERO;
VECTOR_MUL_LZERO]);
(REWRITE_TAC[
ball;
IN_ELIM_THM;
dist; VECTOR_ARITH `a - (a + t % s) =
(-- t) % s`;
NORM_MUL;
REAL_ABS_NEG]);
(REWRITE_WITH `abs t = t`);
(ASM_SIMP_TAC[
REAL_ABS_REFL; REAL_ARITH `t > &0 ==> &0 <= t`]);
(ASM_REWRITE_TAC[])]);;
(* ======================================================================= *)
let FUN_AFFINE_KLEMMA = prove_by_refinement (
`!a:real^3 b c d.
aff_dim {a,b,c} = &2 /\ ~(d
IN affine hull {a,b,c})
==> ~(a
IN convex hull {b,c,d})`,
[(REWRITE_TAC[
CONVEX_HULL_3;
AFFINE_HULL_3;
IN;
IN_ELIM_THM]);
(REPEAT STRIP_TAC);
(ASM_CASES_TAC `~(w = &0)`);
(NEW_GOAL `?u v w. u + v + w = &1 /\ d = u % a + v % b + w % c:real^3`);
(EXISTS_TAC `&1 / w` THEN EXISTS_TAC `-- u / w` THEN EXISTS_TAC `-- v/ w`);
(STRIP_TAC);
(REWRITE_TAC[REAL_ARITH `&1 / w + --u / w + --v / w = (&1 - u - v) / w`;
GSYM (ASSUME `u + v + w = &1`); REAL_ARITH `(u + v + w) - u - v = w`]);
(ASM_REWRITE_TAC[] THEN ASM_SIMP_TAC[
REAL_DIV_REFL]);
(REWRITE_TAC[VECTOR_ARITH `&1 / w % a + --u / w % b + --v / w % c =
(&1 / w) % (a - u % b - v % c)`]);
(ASM_REWRITE_TAC[VECTOR_ARITH `(a + b + c) - a - b = c:real^3`;
VECTOR_MUL_ASSOC]);
(REWRITE_WITH `&1 / w * w = &1`);
(ASM_REWRITE_TAC[GSYM Trigonometry2.NOT_0_INVERTABLE]);
(VECTOR_ARITH_TAC);
(ASM_MESON_TAC[]);
(UP_ASM_TAC THEN REWRITE_TAC[]);
(STRIP_TAC);
(SWITCH_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[
VECTOR_MUL_LZERO;
VECTOR_ADD_RID]);
(STRIP_TAC);
(UNDISCH_TAC `
aff_dim {a, b, c:real^3} = &2`);
(REWRITE_TAC[]);
(ONCE_REWRITE_TAC[GSYM
AFF_DIM_AFFINE_HULL]);
(REWRITE_WITH `
affine hull {a,b,c} =
affine hull {b,c:real^3}`);
(MATCH_MP_TAC
AFFINE_HULLS_EQ);
(REPEAT STRIP_TAC);
(REWRITE_TAC[
SUBSET;
AFFINE_HULL_2;
SET_RULE `x
IN {a,b,c} <=> (x = a \/x = b \/ x = c)`;
IN;
IN_ELIM_THM]);
(REPEAT STRIP_TAC);
(EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real` THEN ASM_REWRITE_TAC[]);
(ASM_REAL_ARITH_TAC);
(EXISTS_TAC `&1` THEN EXISTS_TAC `&0` THEN ASM_REWRITE_TAC[]);
(STRIP_TAC);
(ASM_REAL_ARITH_TAC);
(VECTOR_ARITH_TAC);
(EXISTS_TAC `&0` THEN EXISTS_TAC `&1` THEN ASM_REWRITE_TAC[]);
(STRIP_TAC);
(ASM_REAL_ARITH_TAC);
(VECTOR_ARITH_TAC);
(REWRITE_TAC[
SUBSET;
AFFINE_HULL_3;
SET_RULE `x
IN {b,c} <=> (x = b \/ x = c)`;
IN;
IN_ELIM_THM]);
(REPEAT STRIP_TAC);
(EXISTS_TAC `&0` THEN EXISTS_TAC `&1` THEN EXISTS_TAC `&0` THEN ASM_REWRITE_TAC[]);
(STRIP_TAC);
(REAL_ARITH_TAC);
(VECTOR_ARITH_TAC);
(EXISTS_TAC `&0` THEN EXISTS_TAC `&0` THEN EXISTS_TAC `&1` THEN ASM_REWRITE_TAC[]);
(STRIP_TAC);
(REAL_ARITH_TAC);
(VECTOR_ARITH_TAC);
(ONCE_REWRITE_TAC[
AFF_DIM_AFFINE_HULL]);
(REWRITE_TAC[
AFF_DIM_2]);
(COND_CASES_TAC);
(ARITH_TAC);
(ARITH_TAC)]);;
(* ========================================================================== *)
(* ========================================================================== *)
(* The main theorem *)
(* ========================================================================== *)
(* ========================================================================== *)
let URRPHBZ2 = prove_by_refinement (URRPHBZ2_concl,
[(REPEAT STRIP_TAC);
(SUBGOAL_THEN `? u0 u1 u2 u3. (ul:(real^3)list) = [u0:real^3;u1;u2;u3]` CHOOSE_TAC);
(MP_TAC (ASSUME `barV V 3 ul`));
(REWRITE_TAC[BARV_3_EXPLICIT]);
(FIRST_X_ASSUM CHOOSE_TAC);
(FIRST_X_ASSUM CHOOSE_TAC);
(FIRST_X_ASSUM CHOOSE_TAC);
(ASM_CASES_TAC `~ (mcell k V ul) (v:real^3)`);
(MATCH_MP_TAC EVENTUALLY_RADIAL_NOT_IN_CLOSED_SET);
(ASM_REWRITE_TAC[]);
(ASM_MESON_TAC[CLOSED_MCELL]);
(UP_ASM_TAC THEN REWRITE_TAC[MESON[] `~ ~A <=> A`] THEN DISCH_TAC);
(* ====Case 1: k = 0 ====== *) (* FINISHED *)
(ASM_CASES_TAC `k = 0`);
(NEW_GOAL `v = u0:real^3`);
(REWRITE_WITH `u0:real^3 = HD ul`);
(ASM_REWRITE_TAC[HD]);
(MATCH_MP_TAC ROGERS_INTER_V_LEMMA);
(EXISTS_TAC `V:real^3->bool`);
(ASM_REWRITE_TAC[]);
(SWITCH_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[MCELL_EXPLICIT;mcell0]);
(REWRITE_TAC[DIFF;IN_ELIM_THM]);
(MESON_TAC[IN]);
(ASM_REWRITE_TAC[]);
(MATCH_MP_TAC EVENTUALLY_RADIAL_NOT_IN_CLOSED_SET );
(STRIP_TAC);
(REWRITE_TAC[MCELL_EXPLICIT; mcell0]);
(REWRITE_TAC[DIFF;IN_ELIM_THM; MESON[] `!X Y. ~(X /\ ~Y) <=> (~X \/ Y) `]);
(DISJ2_TAC);
(REWRITE_TAC[HD;ball;IN;IN_ELIM_THM;DIST_REFL]);
(MATCH_MP_TAC SQRT_POS_LT);
(REAL_ARITH_TAC);
(MATCH_MP_TAC CLOSED_MCELL);
(ASM_MESON_TAC[]);
(* ====Case 2: k = 1 ====== *) (* Finished *)
(ASM_CASES_TAC `k = 1`);
(ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell1]);
(COND_CASES_TAC);
(REWRITE_TAC[HD;TL;TRUNCATE_SIMPLEX_EXPLICIT_1;rcone_gt;rconesgn]);
(REWRITE_WITH
` rogers V [u0; u1; u2; u3:real^3] INTER cball (u0,sqrt (&2)) DIFF
{x | (x - u0) dot (u1 - u0) >
dist (x,u0) * dist (u1,u0) * hl [u0; u1] / sqrt (&2)} =
rogers V [u0; u1; u2; u3] INTER cball (u0,sqrt (&2)) INTER
{x | (x - u0) dot (u1 - u0) <=
dist (x,u0) * dist (u1,u0) * hl [u0; u1] / sqrt (&2)}`);
(REWRITE_TAC[Vol1.SET_EQ; IN_INTER; IN_DIFF; IN; IN_ELIM_THM]);
(REPEAT STRIP_TAC);
(ASM_REWRITE_TAC[]);
(ASM_REWRITE_TAC[]);
(ASM_REAL_ARITH_TAC);
(ASM_REWRITE_TAC[]);
(ASM_REWRITE_TAC[]);
(ASM_REAL_ARITH_TAC);
(NEW_GOAL `v = u0:real^3`);
(REWRITE_WITH `u0:real^3 = HD ul`);
(ASM_REWRITE_TAC[HD]);
(MATCH_MP_TAC ROGERS_INTER_V_LEMMA);
(EXISTS_TAC `V:real^3->bool`);
(ASM_REWRITE_TAC[IN]);
(NEW_GOAL `mcell 1 V ul (v:real^3)`);
(ASM_MESON_TAC[]);
(UP_ASM_TAC THEN REWRITE_TAC[MCELL_EXPLICIT; mcell1]);
(COND_CASES_TAC);
(TRUONG_SET_TAC[]);
(DISCH_TAC THEN NEW_GOAL `F`);
(UP_ASM_TAC THEN ASM_MESON_TAC[GSYM IN; NOT_IN_EMPTY]);
(UP_ASM_TAC THEN MESON_TAC[]);
(MATCH_MP_TAC EVENTUALLY_RADIAL_INTER);
(STRIP_TAC);
(* e_radial rogers *)
(REWRITE_TAC[ROGERS; LENGTH; ARITH_RULE `SUC (SUC (SUC (SUC 0))) = 4`]);
(REWRITE_TAC [SET_OF_0_TO_3]);
(REWRITE_WITH `IMAGE (omega_list_n V [u0; u1; u2; u3:real^3]) {0, 1, 2, 3} =
{omega_list_n V [u0; u1; u2; u3] 0, omega_list_n V [u0; u1; u2; u3] 1,
omega_list_n V [u0; u1; u2; u3] 2, omega_list_n V [u0; u1; u2; u3] 3}`);
(REWRITE_TAC[IMAGE]);
(SET_TAC[]);
(ABBREV_TAC `a = omega_list_n V [u0; u1; u2; u3:real^3] 0`);
(REWRITE_WITH `a = u0:real^3`);
(EXPAND_TAC "a" THEN REWRITE_TAC[OMEGA_LIST_N;HD]);
(ONCE_ASM_REWRITE_TAC[]);
(MATCH_MP_TAC EVENTUALLY_RADIAL_CONVEX_HULL_4_sub1);
(ABBREV_TAC `vl = [u0;u1;u2;u3:real^3]`);
(REWRITE_WITH `u0:real^3 = HD vl`);
(EXPAND_TAC "vl" THEN ASM_REWRITE_TAC[HD]);
(MATCH_MP_TAC U0_NOT_IN_CONVEX_HULL_FROM_ROGERS) ;
(ASM_MESON_TAC[]);
(* e_radial cball *)
(MATCH_MP_TAC EVENTUALLY_RADIAL_INTER);
(STRIP_TAC);
(ASM_REWRITE_TAC[eventually_radial]);
(EXISTS_TAC `&1`);
(REWRITE_TAC[radial; REAL_ARITH `&1 > &0`; INTER_SUBSET]);
(REPEAT STRIP_TAC);
(REWRITE_WITH `cball (u0:real^3,sqrt (&2)) INTER ball (u0,&1) = ball (u0, &1)`);
(MATCH_MP_TAC (SET_RULE `b SUBSET a ==> a INTER b = b`));
(REWRITE_TAC[SUBSET; ball; cball; IN; IN_ELIM_THM]);
(REPEAT STRIP_TAC);
(NEW_GOAL `&1 < sqrt (&2)`);
(REWRITE_TAC[ZERO_LT_SQRT_2]);
(ASM_REAL_ARITH_TAC);
(REWRITE_TAC[ball; IN; IN_ELIM_THM; dist; VECTOR_ARITH `a - (a + b:real^3) = --b`; NORM_NEG; NORM_MUL]);
(REWRITE_WITH `abs t = t`);
(REWRITE_TAC[REAL_ABS_REFL]);
(ASM_REAL_ARITH_TAC);
(ASM_REWRITE_TAC[]);
(* e_radial R^3 \ rcone_gt *)
(ASM_REWRITE_TAC[eventually_radial]);
(EXISTS_TAC `&1`);
(REWRITE_TAC[radial; REAL_ARITH `&1 > &0`; INTER_SUBSET; IN_INTER; IN; IN_ELIM_THM]);
(REPEAT STRIP_TAC);
(REWRITE_WITH `((u0 + t % u) - u0) dot (u1 - u0:real^3) =
t * (((u0 + u) - u0) dot (u1 - u0))`);
(VECTOR_ARITH_TAC);
(REWRITE_WITH `dist (u0 + t % u,u0) = abs t * dist (u0 + u,u0:real^3)`);
(REWRITE_TAC[dist; VECTOR_ARITH `(a + (b:real^3)) - a = b`; NORM_MUL]);
(REWRITE_WITH `abs t = t`);
(REWRITE_TAC[REAL_ABS_REFL]);
(ASM_REAL_ARITH_TAC);
(REWRITE_TAC [REAL_ARITH `t * s <= (t * a) * b <=> &0 <= t * (a * b - s)`]);
(MATCH_MP_TAC REAL_LE_MUL);
(ASM_REAL_ARITH_TAC);
(REWRITE_TAC[ball;IN_ELIM_THM]);
(REWRITE_WITH `dist (u0,u0 + t % u) = abs t * norm (u:real^3)`);
(REWRITE_TAC[dist; VECTOR_ARITH `(a + (b:real^3)) - a = b /\
r:real^3 - (r + t) = -- t`; NORM_MUL; NORM_NEG]);
(REWRITE_WITH `abs t = t`);
(REWRITE_TAC[REAL_ABS_REFL]);
(ASM_REAL_ARITH_TAC);
(ASM_MESON_TAC[]);
(REWRITE_TAC[EVENTUALLY_RADIAL_EMPTY]);
(* ======================================================================= *)
(* ====Case 2: k >= 4 ====== *)
(ASM_CASES_TAC `k >= 4`);
(UNDISCH_TAC `mcell k V ul v`);
(REWRITE_WITH `mcell k V ul = mcell4 V ul`);
(MP_TAC MCELL_EXPLICIT THEN STRIP_TAC);
(NEW_GOAL `mcell 0 V ul = mcell0 V ul /\
mcell 1 V ul = mcell1 V ul /\
mcell 2 V ul = mcell2 V ul /\
mcell 3 V ul = mcell3 V ul /\
(k >= 4 ==> mcell k V ul = mcell4 V ul)`);
(ASM_REWRITE_TAC[]);
(UP_ASM_TAC THEN STRIP_TAC);
(FIRST_ASSUM MATCH_MP_TAC);
(ASM_SIMP_TAC[]);
(REWRITE_TAC[mcell4]);
(COND_CASES_TAC);
(ASM_REWRITE_TAC[set_of_list]);
(STRIP_TAC);
(ABBREV_TAC `S = {u0, u1,u2, u3:real^3}`);
(ABBREV_TAC `s3 = omega_list V (ul:(real^3)list)`);
(NEW_GOAL `v IN {u0, u1 ,u2:real^3, u3}`);
(ASM_CASES_TAC `(v:real^3) IN S`);
(ASM_MESON_TAC[]);
(NEW_GOAL `!x:real^3. x IN convex hull S /\ ~(x IN S)
==> (?y. y IN S /\ norm (x - s3) < norm (y - s3))`);
(MATCH_MP_TAC SIMPLEX_FURTHEST_LT_2);
(EXPAND_TAC "S");
(REWRITE_TAC[Geomdetail.FINITE6]);
(NEW_GOAL `?y:real^3. y IN S /\ norm (v - s3) < norm (y - s3)`);
(FIRST_ASSUM MATCH_MP_TAC);
(ASM_REWRITE_TAC[IN]);
(UP_ASM_TAC THEN EXPAND_TAC "S" THEN STRIP_TAC);
(NEW_GOAL `s3 IN (voronoi_closed V (y:real^3))`);
(EXPAND_TAC "s3");
(MATCH_MP_TAC (SET_RULE `(?b. a IN b /\ b SUBSET c) ==> a IN c`));
(EXISTS_TAC `voronoi_list V (ul:(real^3)list)`);
(STRIP_TAC);
(MATCH_MP_TAC Packing3.OMEGA_LIST_IN_VORONOI_LIST);
(EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
(ASM_REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list]);
(NEW_GOAL `y:real^3 IN S`);
(ASM_MESON_TAC[]);
(ASM_SET_TAC[]);
(UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
(ONCE_REWRITE_TAC[DIST_SYM]);
(REWRITE_TAC[dist]);
(STRIP_TAC);
(NEW_GOAL `F`);
(NEW_GOAL `norm (y - s3) <= norm (v - s3:real^3)`);
(FIRST_ASSUM MATCH_MP_TAC);
(UNDISCH_TAC `v:real^3 IN V` THEN MESON_TAC[IN]);
(ASM_REAL_ARITH_TAC);
(ASM_MESON_TAC[]);
(* Case v = u0 *)
(ASM_CASES_TAC `v = u0:real^3`);
(ASM_REWRITE_TAC[]);
(EXPAND_TAC "S");
(MATCH_MP_TAC EVENTUALLY_RADIAL_CONVEX_HULL_4_sub1);
(NEW_GOAL `aff_dim {u0,u1,u2,u3:real^3} = &3`);
(REWRITE_WITH `{u0,u1,u2,u3:real^3} = set_of_list ul`);
(ASM_REWRITE_TAC[set_of_list]);
(MATCH_MP_TAC Rogers.MHFTTZN1);
(EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
(STRIP_TAC);
(NEW_GOAL `aff_dim {u0,u1,u2,u3:real^3} <= &3 - &1`);
(REWRITE_WITH `{u0,u1,u2,u3:real^3} = u0 INSERT {u1,u2,u3:real^3}`);
(SET_TAC[]);
(ONCE_REWRITE_TAC[AFF_DIM_INSERT]);
(COND_CASES_TAC);
(NEW_GOAL `CARD {u1,u2,u3:real^3} <= 3`);
(REWRITE_TAC[Geomdetail.CARD3]);
(NEW_GOAL `aff_dim {u1, u2, u3} <= &(CARD{u1,u2,u3:real^3}) - &1`);
(MATCH_MP_TAC AFF_DIM_LE_CARD);
(REWRITE_TAC[Geomdetail.FINITE6]);
(ASM_ARITH_TAC);
(NEW_GOAL `F`);
(NEW_GOAL `u0 IN affine hull {u1,u2,u3:real^3}`);
(UNDISCH_TAC `u0 IN convex hull {u1, u2, u3:real^3}`);
(MATCH_MP_TAC (SET_RULE `(b SUBSET c) ==> ((a IN b) ==> (a IN c))`));
(REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
(ASM_MESON_TAC[]);
(ASM_MESON_TAC[]);
(ASM_ARITH_TAC);
(* Case v = u1 *)
(ASM_CASES_TAC `v = u1:real^3`);
(ASM_REWRITE_TAC[]);
(EXPAND_TAC "S");
(REWRITE_WITH `{u0, u1, u2, u3} = {u1, u0, u2, u3:real^3}`);
(SET_TAC[]);
(MATCH_MP_TAC EVENTUALLY_RADIAL_CONVEX_HULL_4_sub1);
(NEW_GOAL `aff_dim {u1, u0, u2, u3:real^3} = &3`);
(REWRITE_WITH `{u1, u0, u2, u3:real^3} = set_of_list ul`);
(ASM_REWRITE_TAC[set_of_list]);
(EXPAND_TAC "S" THEN SET_TAC[]);
(MATCH_MP_TAC Rogers.MHFTTZN1);
(EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
(STRIP_TAC);
(NEW_GOAL `aff_dim {u1, u0, u2, u3:real^3} <= &3 - &1`);
(REWRITE_WITH `{u1, u0, u2, u3:real^3} = u1 INSERT {u0,u2,u3:real^3}`);
(SET_TAC[]);
(ONCE_REWRITE_TAC[AFF_DIM_INSERT]);
(COND_CASES_TAC);
(NEW_GOAL `CARD {u0,u2,u3:real^3} <= 3`);
(REWRITE_TAC[Geomdetail.CARD3]);
(NEW_GOAL `aff_dim {u0, u2, u3} <= &(CARD{u0,u2,u3:real^3}) - &1`);
(MATCH_MP_TAC AFF_DIM_LE_CARD);
(REWRITE_TAC[Geomdetail.FINITE6]);
(ASM_ARITH_TAC);
(NEW_GOAL `F`);
(NEW_GOAL `u1 IN affine hull {u0,u2,u3:real^3}`);
(UNDISCH_TAC `u1 IN convex hull {u0, u2, u3:real^3}`);
(MATCH_MP_TAC (SET_RULE `(b SUBSET c) ==> ((a IN b) ==> (a IN c))`));
(REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
(ASM_MESON_TAC[]);
(ASM_MESON_TAC[]);
(ASM_ARITH_TAC);
(* Case v = u2 *)
(ASM_CASES_TAC `v = u2:real^3`);
(ASM_REWRITE_TAC[]);
(EXPAND_TAC "S");
(REWRITE_WITH `{u0, u1, u2, u3} = {u2, u0, u1, u3:real^3}`);
(SET_TAC[]);
(MATCH_MP_TAC EVENTUALLY_RADIAL_CONVEX_HULL_4_sub1);
(NEW_GOAL `aff_dim {u2, u0, u1, u3:real^3} = &3`);
(REWRITE_WITH `{u2, u0, u1, u3:real^3} = set_of_list ul`);
(ASM_REWRITE_TAC[set_of_list]);
(EXPAND_TAC "S" THEN SET_TAC[]);
(MATCH_MP_TAC Rogers.MHFTTZN1);
(EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
(STRIP_TAC);
(NEW_GOAL `aff_dim {u2, u0, u1, u3:real^3} <= &3 - &1`);
(REWRITE_WITH `{u2, u0, u1, u3:real^3} = u2 INSERT {u0,u1,u3:real^3}`);
(SET_TAC[]);
(ONCE_REWRITE_TAC[AFF_DIM_INSERT]);
(COND_CASES_TAC);
(NEW_GOAL `CARD {u0,u1,u3:real^3} <= 3`);
(REWRITE_TAC[Geomdetail.CARD3]);
(NEW_GOAL `aff_dim {u0,u1,u3:real^3} <= &(CARD {u0,u1,u3:real^3}) - &1`);
(MATCH_MP_TAC AFF_DIM_LE_CARD);
(REWRITE_TAC[Geomdetail.FINITE6]);
(ASM_ARITH_TAC);
(NEW_GOAL `F`);
(NEW_GOAL `u2 IN affine hull {u0,u1,u3:real^3}`);
(UNDISCH_TAC `u2 IN convex hull {u0,u1,u3:real^3}`);
(MATCH_MP_TAC (SET_RULE `(b SUBSET c) ==> ((a IN b) ==> (a IN c))`));
(REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
(ASM_MESON_TAC[]);
(ASM_MESON_TAC[]);
(ASM_ARITH_TAC);
(* Case v = u2 *)
(ASM_CASES_TAC `v = u3:real^3`);
(ASM_REWRITE_TAC[]);
(EXPAND_TAC "S");
(REWRITE_WITH `{u0, u1, u2, u3} = {u3, u0, u1, u2:real^3}`);
(SET_TAC[]);
(MATCH_MP_TAC EVENTUALLY_RADIAL_CONVEX_HULL_4_sub1);
(NEW_GOAL `aff_dim {u3, u0, u1, u2:real^3} = &3`);
(REWRITE_WITH `{u3, u0, u1, u2:real^3} = set_of_list ul`);
(ASM_REWRITE_TAC[set_of_list]);
(EXPAND_TAC "S" THEN SET_TAC[]);
(MATCH_MP_TAC Rogers.MHFTTZN1);
(EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
(STRIP_TAC);
(NEW_GOAL `aff_dim {u3, u0, u1, u2:real^3} <= &3 - &1`);
(ONCE_REWRITE_TAC[AFF_DIM_INSERT]);
(COND_CASES_TAC);
(NEW_GOAL `CARD {u0,u1,u2:real^3} <= 3`);
(REWRITE_TAC[Geomdetail.CARD3]);
(NEW_GOAL `aff_dim {u0,u1,u2:real^3} <= &(CARD {u0,u1,u2:real^3}) - &1`);
(MATCH_MP_TAC AFF_DIM_LE_CARD);
(REWRITE_TAC[Geomdetail.FINITE6]);
(ASM_ARITH_TAC);
(NEW_GOAL `F`);
(NEW_GOAL `u3 IN affine hull {u0,u1,u2:real^3}`);
(UNDISCH_TAC `u3 IN convex hull {u0,u1,u2:real^3}`);
(MATCH_MP_TAC (SET_RULE `(b SUBSET c) ==> ((a IN b) ==> (a IN c))`));
(REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
(ASM_MESON_TAC[]);
(ASM_MESON_TAC[]);
(ASM_ARITH_TAC);
(NEW_GOAL `F`);
(ASM_SET_TAC[]);
(ASM_MESON_TAC[]);
(STRIP_TAC);
(NEW_GOAL `v:real^3 IN {}`);
(ASM_REWRITE_TAC[IN]);
(NEW_GOAL `F`);
(UP_ASM_TAC THEN REWRITE_TAC[NOT_IN_EMPTY]);
(ASM_MESON_TAC[]);
(* ======================================================================= *)
(* ====Case 4: k = 3 ====== *)
(ASM_CASES_TAC `k = 3`);
(ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell3]);
(COND_CASES_TAC);
(REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list]);
(NEW_GOAL
`V INTER mcell k V ul = set_of_list (truncate_simplex (k - 1) ul)`);
(MATCH_MP_TAC LEPJBDJ);
(ASM_REWRITE_TAC[ARITH_RULE `1 <= 3 /\ 3 <= 4`]);
(STRIP_TAC);
(NEW_GOAL `v IN mcell 3 V ul`);
(ASM_SET_TAC[]);
(ASM_SET_TAC[]);
(UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list; TRUNCATE_SIMPLEX_EXPLICIT_2; ARITH_RULE `3 - 1 = 2`]);
(STRIP_TAC);
(NEW_GOAL `v IN {u0, u1, u2:real^3}`);
(ASM_SET_TAC[]);
(ABBREV_TAC `m = mxi V [u0;u1;u2;u3:real^3]`);
(REWRITE_TAC[SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
(NEW_GOAL `aff_dim {u0, u1, u2:real^3} = &2`);
(REWRITE_WITH `{u0,u1,u2:real^3} = set_of_list (truncate_simplex 2 ul)`);
(ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list]);
(MATCH_MP_TAC Rogers.MHFTTZN1);
(EXISTS_TAC `V:real^3->bool`);
(ASM_REWRITE_TAC[]);
(MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
(EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
(ASM_MESON_TAC[]);
(NEW_GOAL `~(m IN affine hull {u0,u1,u2:real^3})`);
(ABBREV_TAC `s2 = omega_list_n V [u0; u1; u2; u3] 2`);
(ABBREV_TAC `s3 = omega_list_n V [u0; u1; u2; u3] 3`);
(NEW_GOAL `s2 IN voronoi_list V [u0;u1;u2:real^3]`);
(EXPAND_TAC "s2");
(REWRITE_TAC[OMEGA_LIST_N; ARITH_RULE `2 = SUC 1`]);
(ASM_REWRITE_TAC[ARITH_RULE `SUC 1 = 2`; TRUNCATE_SIMPLEX_EXPLICIT_2]);
(MATCH_MP_TAC CLOSEST_POINT_IN_SET);
(REWRITE_TAC[Packing3.CLOSED_VORONOI_LIST]);
(UNDISCH_TAC `barV V 3 ul` THEN REWRITE_TAC[BARV]);
(REPEAT STRIP_TAC);
(NEW_GOAL `voronoi_nondg V ([u0;u1;u2:real^3])`);
(FIRST_ASSUM MATCH_MP_TAC);
(REWRITE_TAC[Sphere.INITIAL_SUBLIST; LENGTH; ARITH_RULE `0 < SUC (SUC (SUC 0))`]);
(EXISTS_TAC `[u3:real^3]` THEN ASM_REWRITE_TAC[APPEND]);
(UP_ASM_TAC THEN ASM_REWRITE_TAC[VORONOI_NONDG; LENGTH;
ARITH_RULE `SUC (SUC (SUC 0)) = 3`; AFF_DIM_EMPTY]);
(REWRITE_TAC[ARITH_RULE `-- &1 + &3:int = &3 - &1`]);
(REWRITE_TAC[MESON[INT_OF_NUM_SUB; ARITH_RULE `1 <= 3`] `&3:int - &1 = &(3 - 1)`]);
(REWRITE_TAC[ARITH_RULE `3 - 1= 2 /\ ~(&2:int = &4)`]);
(NEW_GOAL `s3 IN voronoi_list V [u0;u1;u2:real^3]`);
(EXPAND_TAC "s3");
(REWRITE_TAC[OMEGA_LIST_N; ARITH_RULE `3 = SUC 2`]);
(ASM_REWRITE_TAC[ARITH_RULE `SUC 2 = 3`; TRUNCATE_SIMPLEX_EXPLICIT_3]);
(MATCH_MP_TAC (SET_RULE `(?b. a IN b /\ b SUBSET c) ==> a IN c`));
(EXISTS_TAC `voronoi_list V [u0; u1; u2; u3:real^3]`);
(STRIP_TAC);
(MATCH_MP_TAC CLOSEST_POINT_IN_SET);
(REWRITE_TAC[Packing3.CLOSED_VORONOI_LIST]);
(UNDISCH_TAC `barV V 3 ul` THEN REWRITE_TAC[BARV]);
(REPEAT STRIP_TAC);
(NEW_GOAL `voronoi_nondg V ([u0;u1;u2;u3:real^3])`);
(FIRST_ASSUM MATCH_MP_TAC);
(REWRITE_TAC[Sphere.INITIAL_SUBLIST; LENGTH; ARITH_RULE `0 < SUC (SUC (SUC (SUC 0)))`]);
(EXISTS_TAC `[]:(real^3)list` THEN ASM_REWRITE_TAC[APPEND]);
(UP_ASM_TAC THEN ASM_REWRITE_TAC[VORONOI_NONDG; LENGTH;
ARITH_RULE `SUC(SUC (SUC (SUC 0))) = 4`; AFF_DIM_EMPTY]);
(REWRITE_TAC[ARITH_RULE `-- &1 + &4:int = &4 - &1`]);
(REWRITE_TAC[MESON[INT_OF_NUM_SUB; ARITH_RULE `1 <= 4`] `&4:int - &1 = &(4 - 1)`]);
(REWRITE_TAC[ARITH_RULE `4 - 1= 3 /\ ~(&3:int = &4)`]);
(REWRITE_TAC[VORONOI_LIST; set_of_list; VORONOI_SET]);
(SET_TAC[]);
(NEW_GOAL `?s. between s (omega_list_n V ul 2,omega_list_n V ul 3) /\
dist (u0,s) = sqrt (&2) /\
mxi V ul = s`);
(MATCH_MP_TAC MXI_EXPLICIT);
(EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
(ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2]);
(REWRITE_WITH `[u0; u1; u2:real^3] = truncate_simplex 2 [u0; u1; u2; u3]`);
(REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2]);
(ASM_REWRITE_TAC[]);
(UP_ASM_TAC THEN ASM_REWRITE_TAC[] THEN STRIP_TAC);
(NEW_GOAL `convex hull {s2,s3:real^3} SUBSET voronoi_list V [u0; u1; u2]`);
(REWRITE_WITH `convex hull {s2, s3} SUBSET voronoi_list V [u0; u1; u2:real^3] <=> convex hull {s2, s3} SUBSET convex hull (voronoi_list V [u0; u1; u2])`);
(ONCE_REWRITE_TAC[EQ_SYM_EQ]);
(REWRITE_WITH `convex hull (voronoi_list V [u0; u1; u2]) = voronoi_list V [u0; u1; u2:real^3]`);
(REWRITE_TAC[CONVEX_HULL_EQ; Packing3.CONVEX_VORONOI_LIST]);
(MATCH_MP_TAC Marchal_cells.CONVEX_HULL_SUBSET);
(ASM_SET_TAC[]);
(NEW_GOAL `s IN voronoi_list V [u0;u1;u2:real^3]`);
(UNDISCH_TAC `between s (s2, s3:real^3)`);
(REWRITE_TAC[BETWEEN_IN_CONVEX_HULL]);
(ASM_SET_TAC[]);
(NEW_GOAL `s2 = circumcenter (set_of_list [u0;u1;u2:real^3])`);
(REWRITE_TAC[set_of_list]);
(EXPAND_TAC "s2");
(MATCH_MP_TAC OMEGA_LIST_2_EXPLICIT_NEW);
(EXISTS_TAC `u3:(real^3)` THEN ASM_REWRITE_TAC[]);
(REWRITE_TAC[GSYM (ASSUME `ul = [u0; u1; u2; u3:real^3]`); IN]);
(ASM_REWRITE_TAC[]);
(REWRITE_WITH `[u0; u1; u2:real^3] = truncate_simplex 2 [u0; u1; u2; u3]`);
(REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2]);
(ASM_REWRITE_TAC[]);
(STRIP_TAC);
(NEW_GOAL `(m - s2:real^3) dot (m - s2) = &0`);
(REWRITE_TAC[ASSUME `s2 = circumcenter (set_of_list [u0; u1; u2:real^3])`]);
(MATCH_MP_TAC Rogers.MHFTTZN4);
(EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `2`);
(REWRITE_TAC[set_of_list]);
(ASM_REWRITE_TAC[]);
(ASM_SIMP_TAC[IN_AFFINE_KY_LEMMA1]);
(REWRITE_WITH `[u0; u1; u2:real^3] = truncate_simplex 2 ul`);
(ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2]);
(MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
(EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
(UP_ASM_TAC THEN REWRITE_TAC[DOT_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
(STRIP_TAC);
(NEW_GOAL `hl (truncate_simplex 2 [u0;u1;u2;u3]) = dist (s, u0:real^3)`);
(REWRITE_WITH `s = s2:real^3`);
(ASM_MESON_TAC[]);
(REWRITE_TAC[ASSUME `s2 = circumcenter (set_of_list [u0; u1; u2:real^3])`]);
(REWRITE_WITH `dist (circumcenter (set_of_list [u0; u1; u2]),u0) = dist
(circumcenter (set_of_list [u0; u1; u2]),HD [u0; u1; u2:real^3])`);
(REWRITE_TAC[HD]);
(REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2]);
(MATCH_MP_TAC Rogers.HL_EQ_DIST0);
(EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `2`);
(ASM_REWRITE_TAC[]);
(REWRITE_WITH `[u0; u1; u2:real^3] = truncate_simplex 2 ul`);
(ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2]);
(MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
(EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
(UP_ASM_TAC THEN REWRITE_TAC[] THEN ONCE_REWRITE_TAC[DIST_SYM]);
(ASM_REAL_ARITH_TAC);
(ASM_CASES_TAC `v = u0:real^3`);
(ASM_REWRITE_TAC[]);
(MATCH_MP_TAC EVENTUALLY_RADIAL_CONVEX_HULL_4_sub1);
(MATCH_MP_TAC FUN_AFFINE_KLEMMA);
(ASM_SET_TAC[]);
(ASM_CASES_TAC `v = u1:real^3`);
(ASM_REWRITE_TAC[]);
(REWRITE_WITH `{u0, u1, u2, m:real^3} = {u1, u0, u2, m}`);
(SET_TAC[]);
(MATCH_MP_TAC EVENTUALLY_RADIAL_CONVEX_HULL_4_sub1);
(MATCH_MP_TAC FUN_AFFINE_KLEMMA);
(REWRITE_WITH `{u1, u0, u2} = {u0, u1, u2:real^3}`);
(SET_TAC[]);
(ASM_SET_TAC[]);
(ASM_CASES_TAC `v = u2:real^3`);
(ASM_REWRITE_TAC[]);
(REWRITE_WITH `{u0, u1, u2, m:real^3} = {u2, u0, u1, m}`);
(SET_TAC[]);
(MATCH_MP_TAC EVENTUALLY_RADIAL_CONVEX_HULL_4_sub1);
(MATCH_MP_TAC FUN_AFFINE_KLEMMA);
(REWRITE_WITH `{u2, u0, u1} = {u0, u1, u2:real^3}`);
(SET_TAC[]);
(ASM_SET_TAC[]);
(NEW_GOAL `F`);
(ASM_SET_TAC[]);
(ASM_MESON_TAC[]);
(REWRITE_TAC[EVENTUALLY_RADIAL_EMPTY]);
(* ======================================================================= *)
(* ====Case 5: k = 2 ====== *)
(ASM_CASES_TAC `k = 2`);
(ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2]);
(COND_CASES_TAC);
(LET_TAC);
(REWRITE_TAC[HD;TL]);
(ABBREV_TAC `s3 = omega_list_n V [u0; u1; u2; u3] 3`);
(ABBREV_TAC `m = mxi V [u0; u1; u2; u3]`);
(NEW_GOAL
`V INTER mcell k V ul = set_of_list (truncate_simplex (k - 1) ul)`);
(MATCH_MP_TAC LEPJBDJ);
(ASM_REWRITE_TAC[ARITH_RULE `1 <= 2 /\ 2 <= 4`]);
(STRIP_TAC);
(NEW_GOAL `v IN mcell 3 V ul`);
(ASM_SET_TAC[]);
(ASM_SET_TAC[]);
(UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list; TRUNCATE_SIMPLEX_EXPLICIT_1; ARITH_RULE `2 - 1 = 1`]);
(STRIP_TAC);
(NEW_GOAL `v IN {u0, u1:real^3}`);
(ASM_SET_TAC[]);
(NEW_GOAL `~(u0 = u1:real^3)`);
(STRIP_TAC);
(NEW_GOAL `CARD {u0,u1,u2,u3:real^3} = 4`);
(REWRITE_WITH `{u0,u1,u2,u3:real^3} = set_of_list ul`);
(ASM_REWRITE_TAC[set_of_list]);
(REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ CARD (set_of_list ul) = 3 + 1`);
(MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
(EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
(ARITH_TAC);
(UP_ASM_TAC THEN ASM_REWRITE_TAC[SET_RULE `{a,a,b,c} = {a,b,c}`]);
(NEW_GOAL `CARD {u1,u2,u3:real^3} <= 3`);
(REWRITE_TAC[Geomdetail.CARD3]);
(ASM_ARITH_TAC);
(NEW_GOAL `hl [u0;u1:real^3] = inv(&2) * dist (u1,u0)`);
(REWRITE_WITH `hl [u0;u1:real^3] =
dist (circumcenter (set_of_list [u0;u1]),HD [u0;u1])`);
(MATCH_MP_TAC Rogers.HL_EQ_DIST0);
(EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `1`);
(ASM_REWRITE_TAC[]);
(REWRITE_WITH `[u0;u1:real^3] = truncate_simplex 1 ul`);
(ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1]);
(MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
(EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `1 <= 3`]);
(REWRITE_TAC[set_of_list; Rogers.CIRCUMCENTER_2; midpoint; HD; dist]);
(NORM_ARITH_TAC);
(NEW_GOAL `&0 < a /\ a < &1`);
(EXPAND_TAC "a");
(REWRITE_TAC[]);
(STRIP_TAC);
(MATCH_MP_TAC REAL_LT_DIV);
(SIMP_TAC[SQRT_POS_LT; ARITH_RULE `&0 < &2`]);
(REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1]);
(ASM_REWRITE_TAC[]);
(MATCH_MP_TAC REAL_LT_MUL);
(ASM_SIMP_TAC[REAL_LT_INV; ARITH_RULE `&0 < &2`]);
(MATCH_MP_TAC DIST_POS_LT THEN ASM_MESON_TAC[]);
(REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1]);
(REWRITE_WITH `hl [u0; u1:real^3] / sqrt (&2) < &1 <=>
hl [u0; u1] < &1 * sqrt (&2)`);
(MATCH_MP_TAC REAL_LT_LDIV_EQ);
(SIMP_TAC[SQRT_POS_LT; ARITH_RULE `&0 < &2`]);
(REWRITE_TAC[REAL_MUL_LID]);
(REWRITE_WITH `[u0;u1:real^3] = truncate_simplex 1 [u0; u1; u2; u3]`);
(ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1]);
(ASM_REWRITE_TAC[]);
(MATCH_MP_TAC EVENTUALLY_RADIAL_INTER);
(STRIP_TAC);
(ASM_CASES_TAC `v = u0:real^3`);
(ASM_REWRITE_TAC[EVENTUALLY_RADIAL_RCONE_GE_ABC_A]);
(ASM_CASES_TAC `v = u1:real^3`);
(ASM_REWRITE_TAC[]);
(MATCH_MP_TAC EVENTUALLY_RADIAL_RCONE_GE_ABC_B);
(ASM_REWRITE_TAC[]);
(NEW_GOAL `F`);
(ASM_SET_TAC[]);
(ASM_MESON_TAC[]);
(MATCH_MP_TAC EVENTUALLY_RADIAL_INTER);
(STRIP_TAC);
(ASM_CASES_TAC `v = u1:real^3`);
(ASM_REWRITE_TAC[EVENTUALLY_RADIAL_RCONE_GE_ABC_A]);
(ASM_CASES_TAC `v = u0:real^3`);
(ASM_REWRITE_TAC[]);
(MATCH_MP_TAC EVENTUALLY_RADIAL_RCONE_GE_ABC_B);
(ASM_REWRITE_TAC[]);
(NEW_GOAL `F`);
(ASM_SET_TAC[]);
(ASM_MESON_TAC[]);
(* ========================================================================== *)
(NEW_GOAL `DISJOINT {u0, u1:real^3} {m, s3}`);
(* ========================================================================== *)
(ABBREV_TAC `s2 = omega_list_n V ul 2`);
(NEW_GOAL `s2 IN voronoi_list V [u0;u1]`);
(REWRITE_WITH `[u0;u1:real^3] = truncate_simplex 1 ul`);
(ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1]);
(EXPAND_TAC "s2");
(MATCH_MP_TAC Rogers.OMEGA_LIST_N_IN_VORONOI_LIST_GEN);
(EXISTS_TAC `3`);
(ASM_REWRITE_TAC[ARITH_RULE `1 <= 2 /\ 2 <= 3`]);
(NEW_GOAL `s3 IN voronoi_list V [u0;u1]`);
(REWRITE_WITH `[u0;u1:real^3] = truncate_simplex 1 ul`);
(ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1]);
(EXPAND_TAC "s3");
(REWRITE_TAC[GSYM (ASSUME `ul = [u0; u1; u2; u3:real^3]`)]);
(MATCH_MP_TAC Rogers.OMEGA_LIST_N_IN_VORONOI_LIST_GEN);
(EXISTS_TAC `3`);
(ASM_REWRITE_TAC[ARITH_RULE `1 <= 3 /\ 3 <= 3`]);
(NEW_GOAL `m IN voronoi_list V [u0; u1]`);
(ASM_CASES_TAC `hl (truncate_simplex 2 (ul:(real^3)list)) < sqrt (&2)`);
(NEW_GOAL `?s. between s (omega_list_n V ul 2,omega_list_n V ul 3) /\
dist (u0,s) = sqrt (&2) /\
m = s`);
(EXPAND_TAC "m");
(REWRITE_TAC[GSYM (ASSUME `ul = [u0; u1; u2; u3:real^3]`)]);
(MATCH_MP_TAC MXI_EXPLICIT);
(EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN
EXISTS_TAC `u3:real^3`);
(ASM_REWRITE_TAC[]);
(UP_ASM_TAC THEN ASM_REWRITE_TAC[] THEN STRIP_TAC);
(NEW_GOAL `convex hull {s2,s3:real^3} SUBSET voronoi_list V [u0; u1]`);
(REWRITE_WITH `convex hull {s2, s3} SUBSET voronoi_list V [u0; u1:real^3] <=> convex hull {s2, s3} SUBSET convex hull (voronoi_list V [u0; u1])`);
(ONCE_REWRITE_TAC[EQ_SYM_EQ]);
(REWRITE_WITH `convex hull (voronoi_list V [u0; u1]) = voronoi_list V [u0; u1:real^3]`);
(REWRITE_TAC[CONVEX_HULL_EQ; Packing3.CONVEX_VORONOI_LIST]);
(MATCH_MP_TAC Marchal_cells.CONVEX_HULL_SUBSET);
(ASM_SET_TAC[]);
(ASM_REWRITE_TAC[]);
(UNDISCH_TAC `between s (s2, s3:real^3)`);
(REWRITE_TAC[BETWEEN_IN_CONVEX_HULL]);
(ASM_SET_TAC[]);
(EXPAND_TAC "m" THEN REWRITE_TAC[mxi]);
(COND_CASES_TAC);
(ASM_MESON_TAC[]);
(NEW_GOAL `F`);
(UP_ASM_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC);
(ASM_MESON_TAC[]);
(NEW_GOAL `~(m IN {u0,u1:real^3})`);
(REWRITE_TAC[SET_RULE `a IN {b,c} <=> a = b \/ a = c`] THEN STRIP_TAC);
(NEW_GOAL `m:real^3 IN voronoi_closed V u1`);
(UNDISCH_TAC `m IN voronoi_list V [u0; u1]` THEN REWRITE_TAC[VORONOI_LIST;
VORONOI_SET; set_of_list]);
(SET_TAC[]);
(UP_ASM_TAC THEN ASM_REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
(STRIP_TAC);
(NEW_GOAL `dist (u0, u1:real^3) <= dist (u0, u0)`);
(FIRST_ASSUM MATCH_MP_TAC);
(ASM_SET_TAC[]);
(UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL; REAL_ARITH `~(a <= b) <=> b < a`]);
(ASM_SIMP_TAC[DIST_POS_LT]);
(NEW_GOAL `m:real^3 IN voronoi_closed V u0`);
(UNDISCH_TAC `m IN voronoi_list V [u0; u1]` THEN REWRITE_TAC[VORONOI_LIST;
VORONOI_SET; set_of_list]);
(SET_TAC[]);
(UP_ASM_TAC THEN ASM_REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
(STRIP_TAC);
(NEW_GOAL `dist (u1, u0:real^3) <= dist (u1, u1)`);
(FIRST_ASSUM MATCH_MP_TAC);
(ASM_SET_TAC[]);
(UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL; REAL_ARITH `~(a <= b) <=> b < a`]);
(ASM_SIMP_TAC[DIST_POS_LT]);
(NEW_GOAL `~(s3 IN {u0, u1:real^3})`);
(REWRITE_TAC[SET_RULE `a IN {b,c} <=> a = b \/ a = c`] THEN STRIP_TAC);
(NEW_GOAL `s3:real^3 IN voronoi_closed V u1`);
(UNDISCH_TAC `s3 IN voronoi_list V [u0; u1]` THEN REWRITE_TAC[VORONOI_LIST;
VORONOI_SET; set_of_list]);
(SET_TAC[]);
(UP_ASM_TAC THEN ASM_REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
(STRIP_TAC);
(NEW_GOAL `dist (u0, u1:real^3) <= dist (u0, u0)`);
(FIRST_ASSUM MATCH_MP_TAC);
(ASM_SET_TAC[]);
(UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL; REAL_ARITH `~(a <= b) <=> b < a`]);
(ASM_SIMP_TAC[DIST_POS_LT]);
(NEW_GOAL `s3:real^3 IN voronoi_closed V u0`);
(UNDISCH_TAC `s3 IN voronoi_list V [u0; u1]` THEN REWRITE_TAC[VORONOI_LIST;
VORONOI_SET; set_of_list]);
(SET_TAC[]);
(UP_ASM_TAC THEN ASM_REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
(STRIP_TAC);
(NEW_GOAL `dist (u1, u0:real^3) <= dist (u1, u1)`);
(FIRST_ASSUM MATCH_MP_TAC);
(ASM_SET_TAC[]);
(UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL; REAL_ARITH `~(a <= b) <=> b < a`]);
(ASM_SIMP_TAC[DIST_POS_LT]);
(REWRITE_TAC[DISJOINT]);
(ASM_SET_TAC[]);
(* ========================================================================== *)
(* ========================================================================== *)
(ASM_CASES_TAC `v = u0:real^3`);
(ASM_REWRITE_TAC[]);
(MATCH_MP_TAC EVENTUALLY_RADIAL_AFF_GE);
(ASM_REWRITE_TAC[]);
(ASM_CASES_TAC `v = u1:real^3`);
(ASM_REWRITE_TAC[]);
(REWRITE_WITH `{u0,u1:real^3} = {u1,u0}`);
(SET_TAC[]);
(MATCH_MP_TAC EVENTUALLY_RADIAL_AFF_GE);
(REWRITE_WITH `{u1,u0:real^3} = {u0,u1}`);
(SET_TAC[]);
(ASM_REWRITE_TAC[]);
(NEW_GOAL `F`);
(ASM_SET_TAC[]);
(ASM_MESON_TAC[]);
(REWRITE_TAC[EVENTUALLY_RADIAL_EMPTY]);
(NEW_GOAL `F`);
(ASM_ARITH_TAC);
(ASM_MESON_TAC[])]);;
end;;