(* ========================================================================= *)
(* FLYSPECK - BOOK FORMALIZATION *)
(* *)
(* Authour : VU KHAC KY *)
(* Book lemma: NJIUTIU *)
(* Chaper : Packing (Marchal cells) *)
(* *)
(* ========================================================================= *)
(* ========================================================================= *)
module Njiutiu = 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;;
let NJIUTIU_concl =
`!V ul vl.
saturated V /\ packing V /\
barV V 3 ul /\ barV V 3 vl /\
rogers V ul = rogers V vl /\ aff_dim (rogers V ul) = &3
==> (!i. 0 <= i /\ i <= 3
==> omega_list_n V ul i = omega_list_n V vl i)`;;
(* ========================================================================= *)
(* supporting lemmas *)
(* ---------------------------------------------------------------------------*)
let AFF_DEPENDENT_AFF_DIM_4 = prove_by_refinement (
`!a b c d:real^3.
affine_dependent {a,b,c,d} ==>
aff_dim {a,b,c,d} <= &2`,
[(REWRITE_TAC[
affine_dependent]);
(REPEAT STRIP_TAC);
(ASM_CASES_TAC `x = a:real^3`);
(ONCE_REWRITE_TAC [
AFF_DIM_INSERT]);
(COND_CASES_TAC);
(NEW_GOAL `
aff_dim {b,c,d:real^3} <= &(
CARD {b,c,d}) - &1`);
(MATCH_MP_TAC
AFF_DIM_LE_CARD);
(REWRITE_TAC[Geomdetail.FINITE6]);
(NEW_GOAL `&(
CARD {b, c, d:real^3}) <= &3:int`);
(REWRITE_TAC[
INT_OF_NUM_LE; Geomdetail.CARD3]);
(ASM_ARITH_TAC);
(NEW_GOAL `F`);
(NEW_GOAL `
affine hull({a, b, c, d:real^3}
DELETE x)
SUBSET affine hull {b, c, d}`);
(MATCH_MP_TAC
AFFINE_SUBSET_KY_LEMMA);
(ASM_REWRITE_TAC[] THEN SET_TAC[]);
(ASM_SET_TAC[]);
(ASM_MESON_TAC[]);
(ASM_CASES_TAC `x = b:real^3`);
(ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {b,a,c,d}`]);
(ONCE_REWRITE_TAC [
AFF_DIM_INSERT]);
(COND_CASES_TAC);
(NEW_GOAL `
aff_dim {a,c,d:real^3} <= &(
CARD {a,c,d}) - &1`);
(MATCH_MP_TAC
AFF_DIM_LE_CARD);
(REWRITE_TAC[Geomdetail.FINITE6]);
(NEW_GOAL `&(
CARD {a, c, d:real^3}) <= &3:int`);
(REWRITE_TAC[
INT_OF_NUM_LE; Geomdetail.CARD3]);
(ASM_ARITH_TAC);
(NEW_GOAL `F`);
(NEW_GOAL `
affine hull({a, b, c, d:real^3}
DELETE x)
SUBSET affine hull {a, c, d}`);
(MATCH_MP_TAC
AFFINE_SUBSET_KY_LEMMA);
(ASM_REWRITE_TAC[] THEN SET_TAC[]);
(ASM_SET_TAC[]);
(ASM_MESON_TAC[]);
(ASM_CASES_TAC `x = c:real^3`);
(ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {c,a,b,d}`]);
(ONCE_REWRITE_TAC [
AFF_DIM_INSERT]);
(COND_CASES_TAC);
(NEW_GOAL `
aff_dim {a,b,d:real^3} <= &(
CARD {a,b,d}) - &1`);
(MATCH_MP_TAC
AFF_DIM_LE_CARD);
(REWRITE_TAC[Geomdetail.FINITE6]);
(NEW_GOAL `&(
CARD {a, b, d:real^3}) <= &3:int`);
(REWRITE_TAC[
INT_OF_NUM_LE; Geomdetail.CARD3]);
(ASM_ARITH_TAC);
(NEW_GOAL `F`);
(NEW_GOAL `
affine hull({a, b, c, d:real^3}
DELETE x)
SUBSET affine hull {a, b, d}`);
(MATCH_MP_TAC
AFFINE_SUBSET_KY_LEMMA);
(ASM_REWRITE_TAC[] THEN SET_TAC[]);
(ASM_SET_TAC[]);
(ASM_MESON_TAC[]);
(ASM_CASES_TAC `x = d:real^3`);
(ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {d,a,b,c}`]);
(ONCE_REWRITE_TAC [
AFF_DIM_INSERT]);
(COND_CASES_TAC);
(NEW_GOAL `
aff_dim {a,b,c:real^3} <= &(
CARD {a,b,c}) - &1`);
(MATCH_MP_TAC
AFF_DIM_LE_CARD);
(REWRITE_TAC[Geomdetail.FINITE6]);
(NEW_GOAL `&(
CARD {a, b,c:real^3}) <= &3:int`);
(REWRITE_TAC[
INT_OF_NUM_LE; Geomdetail.CARD3]);
(ASM_ARITH_TAC);
(NEW_GOAL `F`);
(NEW_GOAL `
affine hull({a, b, c, d:real^3}
DELETE x)
SUBSET affine hull {a, b, c}`);
(MATCH_MP_TAC
AFFINE_SUBSET_KY_LEMMA);
(ASM_REWRITE_TAC[] THEN SET_TAC[]);
(ASM_SET_TAC[]);
(ASM_MESON_TAC[]);
(NEW_GOAL `F`);
(ASM_SET_TAC[]);
(ASM_MESON_TAC[])]);;
(* ========================================================================== *)
(* Main theorem *)
(* ========================================================================== *)
let NJIUTIU = prove_by_refinement (NJIUTIU_concl,
[(REPEAT GEN_TAC THEN STRIP_TAC);
(NEW_GOAL
`rogers V ul =
convex hull
{HD ul, omega_list_n V ul 1, omega_list_n V ul 2, omega_list_n V ul 3}`);
(ASM_MESON_TAC[ROGERS_EXPLICIT]);
(NEW_GOAL
`rogers V vl =
convex hull
{HD vl, omega_list_n V vl 1, omega_list_n V vl 2, omega_list_n V vl 3}`);
(ASM_MESON_TAC[ROGERS_EXPLICIT]);
(NEW_GOAL
`{HD (ul:(real^3)list), omega_list_n V ul 1, omega_list_n V ul 2,
omega_list_n V ul 3}
= {HD vl, omega_list_n V vl 1, omega_list_n V vl 2, omega_list_n V vl 3}`);
(REWRITE_WITH
`{HD (ul:(real^3)list), omega_list_n V ul 1, omega_list_n V ul 2,
omega_list_n V ul 3}
= {HD vl, omega_list_n V vl 1, omega_list_n V vl 2, omega_list_n V vl 3} <=>
convex hull
{HD ul, omega_list_n V ul 1, omega_list_n V ul 2, omega_list_n V ul 3}
= convex hull
{HD vl, omega_list_n V vl 1, omega_list_n V vl 2, omega_list_n V vl 3}`);
(ONCE_REWRITE_TAC[EQ_SYM_EQ]);
(MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);
(REPEAT STRIP_TAC);
(NEW_GOAL `aff_dim {HD (ul:(real^3)list), omega_list_n V ul 1,
omega_list_n V ul 2, omega_list_n V ul 3} <= &2`);
(MATCH_MP_TAC AFF_DEPENDENT_AFF_DIM_4);
(ASM_REWRITE_TAC[]);
(UP_ASM_TAC THEN PURE_ONCE_REWRITE_TAC[GSYM AFF_DIM_CONVEX_HULL]);
(REWRITE_TAC[GSYM (ASSUME `rogers V ul =
convex hull
{HD ul, omega_list_n V ul 1, omega_list_n V ul 2, omega_list_n V ul 3}`)]);
(ASM_ARITH_TAC);
(NEW_GOAL `aff_dim {HD (vl:(real^3)list), omega_list_n V vl 1,
omega_list_n V vl 2, omega_list_n V vl 3} <= &2`);
(MATCH_MP_TAC AFF_DEPENDENT_AFF_DIM_4);
(ASM_REWRITE_TAC[]);
(UP_ASM_TAC THEN PURE_ONCE_REWRITE_TAC[GSYM AFF_DIM_CONVEX_HULL]);
(REWRITE_TAC[GSYM (ASSUME `rogers V vl =
convex hull
{HD vl, omega_list_n V vl 1, omega_list_n V vl 2, omega_list_n V vl 3}`)]);
(REWRITE_TAC[GSYM (ASSUME `rogers V ul = rogers V vl`)]);
(ASM_ARITH_TAC);
(ASM_MESON_TAC[]);
(ABBREV_TAC `W = {HD (ul:(real^3)list), omega_list_n V ul 1,
omega_list_n V ul 2, omega_list_n V ul 3}`);
(NEW_GOAL `!i j.
i < 4 /\ j < 4 /\ ~(i = j)
==> ~(omega_list_n V ul i = omega_list_n V ul j)`);
(MATCH_MP_TAC Rogers.ROGERS_AFF_DIM_FULL);
(ASM_REWRITE_TAC[]);
(NEW_GOAL
`~(omega_list_n V ul 0 = omega_list_n V ul 1) /\
~(omega_list_n V ul 0 = omega_list_n V ul 2) /\
~(omega_list_n V ul 0 = omega_list_n V ul 3) /\
~(omega_list_n V ul 1 = omega_list_n V ul 2) /\
~(omega_list_n V ul 1 = omega_list_n V ul 3) /\
~(omega_list_n V ul 2 = omega_list_n V ul 3)`);
(ASM_SIMP_TAC[ARITH_RULE
`0 < 4 /\ 1 < 4 /\ 2 < 4 /\ 3 < 4 /\ ~(0 = 1) /\ ~(0 = 2) /\ ~(0 = 3) /\
~(1 = 2) /\ ~(2 = 3) /\ ~(1 = 3)`]);
(NEW_GOAL `(omega_list_n V ul 1) IN voronoi_list V (truncate_simplex 1 ul)`);
(MATCH_MP_TAC Packing3.OMEGA_LIST_N_IN_VORONOI_LIST);
(EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `1 <= 3`]);
(NEW_GOAL `(omega_list_n V ul 2) IN voronoi_list V (truncate_simplex 2 ul)`);
(MATCH_MP_TAC Packing3.OMEGA_LIST_N_IN_VORONOI_LIST);
(EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
(NEW_GOAL `(omega_list_n V ul 3) IN voronoi_list V (truncate_simplex 3 ul)`);
(MATCH_MP_TAC Packing3.OMEGA_LIST_N_IN_VORONOI_LIST);
(EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `3 <= 3`]);
(NEW_GOAL `?u0 u1 u2 u3. ul = [u0;u1;u2;u3:real^3]`);
(MATCH_MP_TAC BARV_3_EXPLICIT);
(EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
(UP_ASM_TAC THEN STRIP_TAC);
(NEW_GOAL `voronoi_list V (truncate_simplex 2 ul) SUBSET
voronoi_list V (truncate_simplex 1 ul) /\
voronoi_list V (truncate_simplex 3 ul) SUBSET
voronoi_list V (truncate_simplex 1 ul) /\
voronoi_list V (truncate_simplex 3 ul) SUBSET
voronoi_list V (truncate_simplex 2 ul)`);
(ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; TRUNCATE_SIMPLEX_EXPLICIT_2; TRUNCATE_SIMPLEX_EXPLICIT_3; VORONOI_LIST;VORONOI_SET; set_of_list]);
(SET_TAC[]);
(UP_ASM_TAC THEN STRIP_TAC);
(NEW_GOAL `!i j.
i < 4 /\ j < 4 /\ ~(i = j)
==> ~(omega_list_n V vl i = omega_list_n V vl j)`);
(MATCH_MP_TAC Rogers.ROGERS_AFF_DIM_FULL);
(ASM_MESON_TAC[]);
(NEW_GOAL
`~(omega_list_n V vl 0 = omega_list_n V vl 1) /\
~(omega_list_n V vl 0 = omega_list_n V vl 2) /\
~(omega_list_n V vl 0 = omega_list_n V vl 3) /\
~(omega_list_n V vl 1 = omega_list_n V vl 2) /\
~(omega_list_n V vl 1 = omega_list_n V vl 3) /\
~(omega_list_n V vl 2 = omega_list_n V vl 3)`);
(ASM_SIMP_TAC[ARITH_RULE
`0 < 4 /\ 1 < 4 /\ 2 < 4 /\ 3 < 4 /\ ~(0 = 1) /\ ~(0 = 2) /\ ~(0 = 3) /\
~(1 = 2) /\ ~(2 = 3) /\ ~(1 = 3)`]);
(NEW_GOAL `(omega_list_n V vl 1) IN voronoi_list V (truncate_simplex 1 vl)`);
(MATCH_MP_TAC Packing3.OMEGA_LIST_N_IN_VORONOI_LIST);
(EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `1 <= 3`]);
(NEW_GOAL `(omega_list_n V vl 2) IN voronoi_list V (truncate_simplex 2 vl)`);
(MATCH_MP_TAC Packing3.OMEGA_LIST_N_IN_VORONOI_LIST);
(EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
(NEW_GOAL `(omega_list_n V vl 3) IN voronoi_list V (truncate_simplex 3 vl)`);
(MATCH_MP_TAC Packing3.OMEGA_LIST_N_IN_VORONOI_LIST);
(EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `3 <= 3`]);
(NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);
(MATCH_MP_TAC BARV_3_EXPLICIT);
(EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
(UP_ASM_TAC THEN STRIP_TAC);
(NEW_GOAL `voronoi_list V (truncate_simplex 2 vl) SUBSET
voronoi_list V (truncate_simplex 1 vl) /\
voronoi_list V (truncate_simplex 3 vl) SUBSET
voronoi_list V (truncate_simplex 1 vl) /\
voronoi_list V (truncate_simplex 3 vl) SUBSET
voronoi_list V (truncate_simplex 2 vl)`);
(ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; TRUNCATE_SIMPLEX_EXPLICIT_2; TRUNCATE_SIMPLEX_EXPLICIT_3; VORONOI_LIST;VORONOI_SET; set_of_list]);
(SET_TAC[]);
(UP_ASM_TAC THEN STRIP_TAC);
(NEW_GOAL `HD (ul:(real^3)list) = HD vl`);
(MATCH_MP_TAC ROGERS_INTER_V_LEMMA);
(EXISTS_TAC `V:real^3->bool`);
(REPEAT STRIP_TAC);
(ASM_REWRITE_TAC[]);
(ASM_REWRITE_TAC[]);
(ASM_REWRITE_TAC[]);
(NEW_GOAL `set_of_list ul SUBSET (V:real^3->bool)`);
(MATCH_MP_TAC Packing3.BARV_SUBSET);
(EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
(UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list; HD] THEN SET_TAC[]);
(REWRITE_TAC[GSYM (ASSUME `rogers V ul = rogers V vl`)]);
(ONCE_REWRITE_TAC[MESON[IN] `rogers V ul s <=> s IN rogers V ul`]);
(REWRITE_WITH `rogers V ul =
convex hull
{HD ul, omega_list_n V ul 1, omega_list_n V ul 2, omega_list_n V
ul
3}`);
(ASM_SIMP_TAC[ROGERS_EXPLICIT]);
(MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
(SET_TAC[]);
(NEW_GOAL `omega_list_n V ul 0 = omega_list_n V vl 0`);
(REWRITE_TAC[OMEGA_LIST_N]);
(ASM_MESON_TAC[]);
(* Case 1: i = 1 *)
(NEW_GOAL `omega_list_n V ul 1 = omega_list_n V vl 1`);
(REWRITE_WITH `omega_list_n V ul 1 =
closest_point (convex hull (W DIFF {HD ul})) (omega_list_n V ul 0)`);
(MATCH_MP_TAC CLOSEST_POINT_SUBSET_lemma);
(EXISTS_TAC `voronoi_list V (truncate_simplex (SUC 0) ul)`);
(REPEAT STRIP_TAC); (* 7 subgoals *)
(REWRITE_TAC[OMEGA_LIST_N; ARITH_RULE `1 = SUC 0`]); (* finish subgoal 1 *)
(MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
(EXPAND_TAC "W");
(REWRITE_WITH `HD ul = omega_list_n V ul 0`);
(REWRITE_TAC[OMEGA_LIST_N]);
(ASM_SET_TAC[]); (* finish subgoal 2 *)
(NEW_GOAL `voronoi_list V (truncate_simplex (SUC 0) ul) =
convex hull (voronoi_list V (truncate_simplex (SUC 0) ul))`);
(ONCE_REWRITE_TAC[EQ_SYM_EQ]);
(REWRITE_TAC[CONVEX_HULL_EQ;Packing3.CONVEX_VORONOI_LIST]);
(ONCE_REWRITE_TAC[ASSUME
`voronoi_list V (truncate_simplex (SUC 0) ul) =
convex hull (voronoi_list V (truncate_simplex (SUC 0) ul))`]);
(MATCH_MP_TAC Marchal_cells.CONVEX_HULL_SUBSET);
(REWRITE_WITH `W:real^3->bool DIFF {HD ul} =
{omega_list_n V ul 1, omega_list_n V ul 2, omega_list_n V ul 3}`);
(EXPAND_TAC "W" THEN REWRITE_WITH `HD ul = omega_list_n V ul 0`);
(REWRITE_TAC[OMEGA_LIST_N]);
(ASM_SET_TAC[]);
(REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
(ASM_SET_TAC[]); (* finish subgoal 3 *)
(REWRITE_TAC[CONVEX_CONVEX_HULL]); (* finish subgoal 4 *)
(MATCH_MP_TAC CLOSED_CONVEX_HULL_FINITE);
(MATCH_MP_TAC FINITE_DIFF);
(EXPAND_TAC "W" THEN REWRITE_TAC[Geomdetail.FINITE6]); (* finish subgoal 5 *)
(REWRITE_TAC[Packing3.CLOSED_VORONOI_LIST]); (* finish subgoal 6 *)
(UP_ASM_TAC THEN REWRITE_TAC[CONVEX_HULL_EQ_EMPTY]);
(EXPAND_TAC "W" THEN REWRITE_WITH `HD ul = omega_list_n V ul 0`);
(REWRITE_TAC[OMEGA_LIST_N]);
(ASM_SET_TAC[]); (* finish subgoal 7 *)
(REWRITE_WITH `omega_list_n V vl 1 =
closest_point (convex hull (W DIFF {HD vl})) (omega_list_n V vl 0)`);
(MATCH_MP_TAC CLOSEST_POINT_SUBSET_lemma);
(EXISTS_TAC `voronoi_list V (truncate_simplex (SUC 0) vl)`);
(REPEAT STRIP_TAC); (* 7 subgoals *)
(REWRITE_TAC[OMEGA_LIST_N; ARITH_RULE `1 = SUC 0`]); (* finish subgoal 1 *)
(MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
(EXPAND_TAC "W");
(REWRITE_WITH `HD vl = omega_list_n V vl 0`);
(REWRITE_TAC[OMEGA_LIST_N]);
(ASM_SET_TAC[]); (* finish subgoal 2 *)
(NEW_GOAL `voronoi_list V (truncate_simplex (SUC 0) vl) =
convex hull (voronoi_list V (truncate_simplex (SUC 0) vl))`);
(ONCE_REWRITE_TAC[EQ_SYM_EQ]);
(REWRITE_TAC[CONVEX_HULL_EQ;Packing3.CONVEX_VORONOI_LIST]);
(ONCE_REWRITE_TAC[ASSUME
`voronoi_list V (truncate_simplex (SUC 0) vl) =
convex hull (voronoi_list V (truncate_simplex (SUC 0) vl))`]);
(MATCH_MP_TAC Marchal_cells.CONVEX_HULL_SUBSET);
(REWRITE_WITH `W:real^3->bool DIFF {HD vl} =
{omega_list_n V vl 1, omega_list_n V vl 2, omega_list_n V vl 3}`);
(REWRITE_TAC[ASSUME `W:real^3->bool =
{HD vl, omega_list_n V vl 1, omega_list_n V vl 2, omega_list_n V vl 3}`]);
(REWRITE_WITH `HD vl = omega_list_n V vl 0`);
(REWRITE_TAC[OMEGA_LIST_N]);
(ASM_SET_TAC[]);
(REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
(ASM_SET_TAC[]); (* finish subgoal 3 *)
(REWRITE_TAC[CONVEX_CONVEX_HULL]); (* finish subgoal 4 *)
(MATCH_MP_TAC CLOSED_CONVEX_HULL_FINITE);
(MATCH_MP_TAC FINITE_DIFF);
(EXPAND_TAC "W" THEN REWRITE_TAC[Geomdetail.FINITE6]); (* finish subgoal 5 *)
(REWRITE_TAC[Packing3.CLOSED_VORONOI_LIST]); (* finish subgoal 6 *)
(UP_ASM_TAC THEN REWRITE_TAC[CONVEX_HULL_EQ_EMPTY]);
(REWRITE_TAC[ASSUME `W:real^3->bool =
{HD vl, omega_list_n V vl 1, omega_list_n V vl 2, omega_list_n V vl 3}`]);
(REWRITE_WITH `HD vl = omega_list_n V vl 0`);
(REWRITE_TAC[OMEGA_LIST_N]);
(ASM_SET_TAC[]); (* finish subgoal 7 *)
(ASM_MESON_TAC[]);
(* ------------------------------------------------------------------------- *)
(* Case 2: i = 2 *)
(NEW_GOAL `omega_list_n V ul 2 = omega_list_n V vl 2`);
(REWRITE_WITH `omega_list_n V ul 2 =
closest_point (convex hull (W DIFF {HD ul, omega_list_n V ul 1})) (omega_list_n V ul 1)`);
(MATCH_MP_TAC CLOSEST_POINT_SUBSET_lemma);
(EXISTS_TAC `voronoi_list V (truncate_simplex (SUC 1) ul)`);
(REPEAT STRIP_TAC); (* 7 subgoals *)
(REWRITE_TAC[OMEGA_LIST_N; ARITH_RULE `2 = SUC 1`]); (* finish subgoal 1 *)
(MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
(EXPAND_TAC "W");
(REWRITE_WITH `HD ul = omega_list_n V ul 0`);
(REWRITE_TAC[OMEGA_LIST_N]);
(ASM_SET_TAC[]); (* finish subgoal 2 *)
(NEW_GOAL `voronoi_list V (truncate_simplex (SUC 1) ul) =
convex hull (voronoi_list V (truncate_simplex (SUC 1) ul))`);
(ONCE_REWRITE_TAC[EQ_SYM_EQ]);
(REWRITE_TAC[CONVEX_HULL_EQ;Packing3.CONVEX_VORONOI_LIST]);
(ONCE_REWRITE_TAC[ASSUME
`voronoi_list V (truncate_simplex (SUC 1) ul) =
convex hull (voronoi_list V (truncate_simplex (SUC 1) ul))`]);
(MATCH_MP_TAC Marchal_cells.CONVEX_HULL_SUBSET);
(REWRITE_WITH `W:real^3->bool DIFF {HD ul, omega_list_n V ul 1} =
{omega_list_n V ul 2, omega_list_n V ul 3}`);
(EXPAND_TAC "W" THEN REWRITE_WITH `HD ul = omega_list_n V ul 0`);
(REWRITE_TAC[OMEGA_LIST_N]);
(ASM_SET_TAC[]);
(REWRITE_TAC[ARITH_RULE `SUC 1 = 2`]);
(ASM_SET_TAC[]); (* finish subgoal 3 *)
(REWRITE_TAC[CONVEX_CONVEX_HULL]); (* finish subgoal 4 *)
(MATCH_MP_TAC CLOSED_CONVEX_HULL_FINITE);
(MATCH_MP_TAC FINITE_DIFF);
(EXPAND_TAC "W" THEN REWRITE_TAC[Geomdetail.FINITE6]); (* finish subgoal 5 *)
(REWRITE_TAC[Packing3.CLOSED_VORONOI_LIST]); (* finish subgoal 6 *)
(UP_ASM_TAC THEN REWRITE_TAC[CONVEX_HULL_EQ_EMPTY]);
(EXPAND_TAC "W" THEN REWRITE_WITH `HD ul = omega_list_n V ul 0`);
(REWRITE_TAC[OMEGA_LIST_N]);
(ASM_SET_TAC[]); (* finish subgoal 7 *)
(REWRITE_WITH
`omega_list_n V vl 2 =
closest_point (convex hull (W DIFF {HD vl, omega_list_n V vl 1}))
(omega_list_n V vl 1)`);
(MATCH_MP_TAC CLOSEST_POINT_SUBSET_lemma);
(EXISTS_TAC `voronoi_list V (truncate_simplex (SUC 1) vl)`);
(REPEAT STRIP_TAC); (* 7 subgoals *)
(REWRITE_TAC[OMEGA_LIST_N; ARITH_RULE `2 = SUC 1`]); (* finish subgoal 1 *)
(MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
(REWRITE_TAC[ASSUME `W:real^3->bool =
{HD vl, omega_list_n V vl 1, omega_list_n V vl 2, omega_list_n V vl 3}`]);
(REWRITE_WITH `HD vl = omega_list_n V vl 0`);
(REWRITE_TAC[OMEGA_LIST_N]);
(ASM_SET_TAC[]); (* finish subgoal 2 *)
(NEW_GOAL `voronoi_list V (truncate_simplex (SUC 1) vl) =
convex hull (voronoi_list V (truncate_simplex (SUC 1) vl))`);
(ONCE_REWRITE_TAC[EQ_SYM_EQ]);
(REWRITE_TAC[CONVEX_HULL_EQ;Packing3.CONVEX_VORONOI_LIST]);
(ONCE_REWRITE_TAC[ASSUME
`voronoi_list V (truncate_simplex (SUC 1) vl) =
convex hull (voronoi_list V (truncate_simplex (SUC 1) vl))`]);
(MATCH_MP_TAC Marchal_cells.CONVEX_HULL_SUBSET);
(REWRITE_WITH `W:real^3->bool DIFF {HD vl, omega_list_n V vl 1} =
{omega_list_n V vl 2, omega_list_n V vl 3}`);
(REWRITE_TAC[ASSUME `W:real^3->bool =
{HD vl, omega_list_n V vl 1, omega_list_n V vl 2, omega_list_n V vl 3}`]);
(REWRITE_WITH `HD vl = omega_list_n V vl 0`);
(REWRITE_TAC[OMEGA_LIST_N]);
(ASM_SET_TAC[]);
(REWRITE_TAC[ARITH_RULE `SUC 1 = 2`]);
(ASM_SET_TAC[]); (* finish subgoal 3 *)
(REWRITE_TAC[CONVEX_CONVEX_HULL]); (* finish subgoal 4 *)
(MATCH_MP_TAC CLOSED_CONVEX_HULL_FINITE);
(MATCH_MP_TAC FINITE_DIFF);
(EXPAND_TAC "W" THEN REWRITE_TAC[Geomdetail.FINITE6]); (* finish subgoal 5 *)
(REWRITE_TAC[Packing3.CLOSED_VORONOI_LIST]); (* finish subgoal 6 *)
(UP_ASM_TAC THEN REWRITE_TAC[CONVEX_HULL_EQ_EMPTY]);
(REWRITE_TAC[ASSUME `W:real^3->bool =
{HD vl, omega_list_n V vl 1, omega_list_n V vl 2, omega_list_n V vl 3}`]);
(REWRITE_WITH `HD vl = omega_list_n V vl 0`);
(REWRITE_TAC[OMEGA_LIST_N]);
(ASM_SET_TAC[]); (* finish subgoal 7 *)
(ASM_MESON_TAC[]);
(* ------------------------------------------------------------------------- *)
(* Case 3: i = 3 *)
(NEW_GOAL `omega_list_n V ul 3 = omega_list_n V vl 3`);
(REWRITE_WITH
`omega_list_n V ul 3 = closest_point
(convex hull (W DIFF {HD ul, omega_list_n V ul 1, omega_list_n V ul 2}))
(omega_list_n V ul 2)`);
(MATCH_MP_TAC CLOSEST_POINT_SUBSET_lemma);
(EXISTS_TAC `voronoi_list V (truncate_simplex (SUC 2) ul)`);
(REPEAT STRIP_TAC); (* 7 subgoals *)
(REWRITE_TAC[OMEGA_LIST_N; ARITH_RULE `3 = SUC 2`]); (* finish subgoal 1 *)
(MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
(EXPAND_TAC "W");
(REWRITE_WITH `HD ul = omega_list_n V ul 0`);
(REWRITE_TAC[OMEGA_LIST_N]);
(ASM_SET_TAC[]); (* finish subgoal 2 *)
(NEW_GOAL `voronoi_list V (truncate_simplex (SUC 2) ul) =
convex hull (voronoi_list V (truncate_simplex (SUC 2) ul))`);
(ONCE_REWRITE_TAC[EQ_SYM_EQ]);
(REWRITE_TAC[CONVEX_HULL_EQ;Packing3.CONVEX_VORONOI_LIST]);
(ONCE_REWRITE_TAC[ASSUME
`voronoi_list V (truncate_simplex (SUC 2) ul) =
convex hull (voronoi_list V (truncate_simplex (SUC 2) ul))`]);
(MATCH_MP_TAC Marchal_cells.CONVEX_HULL_SUBSET);
(REWRITE_WITH
`W:real^3->bool DIFF {HD ul, omega_list_n V ul 1, omega_list_n V ul 2} =
{omega_list_n V ul 3}`);
(EXPAND_TAC "W" THEN REWRITE_WITH `HD ul = omega_list_n V ul 0`);
(REWRITE_TAC[OMEGA_LIST_N]);
(ASM_SET_TAC[]);
(REWRITE_TAC[ARITH_RULE `SUC 2 = 3`]);
(ASM_SET_TAC[]); (* finish subgoal 3 *)
(REWRITE_TAC[CONVEX_CONVEX_HULL]); (* finish subgoal 4 *)
(MATCH_MP_TAC CLOSED_CONVEX_HULL_FINITE);
(MATCH_MP_TAC FINITE_DIFF);
(EXPAND_TAC "W" THEN REWRITE_TAC[Geomdetail.FINITE6]); (* finish subgoal 5 *)
(REWRITE_TAC[Packing3.CLOSED_VORONOI_LIST]); (* finish subgoal 6 *)
(UP_ASM_TAC THEN REWRITE_TAC[CONVEX_HULL_EQ_EMPTY]);
(EXPAND_TAC "W" THEN REWRITE_WITH `HD ul = omega_list_n V ul 0`);
(REWRITE_TAC[OMEGA_LIST_N]);
(ASM_SET_TAC[]); (* finish subgoal 7 *)
(REWRITE_WITH
`omega_list_n V vl 3 =
closest_point
(convex hull (W DIFF {HD vl, omega_list_n V vl 1, omega_list_n V vl 2}))
(omega_list_n V vl 2)`);
(MATCH_MP_TAC CLOSEST_POINT_SUBSET_lemma);
(EXISTS_TAC `voronoi_list V (truncate_simplex (SUC 2) vl)`);
(REPEAT STRIP_TAC); (* 7 subgoals *)
(REWRITE_TAC[OMEGA_LIST_N; ARITH_RULE `3 = SUC 2`]); (* finish subgoal 1 *)
(MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
(REWRITE_TAC[ASSUME `W:real^3->bool =
{HD vl, omega_list_n V vl 1, omega_list_n V vl 2, omega_list_n V vl 3}`]);
(REWRITE_WITH `HD vl = omega_list_n V vl 0`);
(REWRITE_TAC[OMEGA_LIST_N]);
(ASM_SET_TAC[]); (* finish subgoal 2 *)
(NEW_GOAL `voronoi_list V (truncate_simplex (SUC 2) vl) =
convex hull (voronoi_list V (truncate_simplex (SUC 2) vl))`);
(ONCE_REWRITE_TAC[EQ_SYM_EQ]);
(REWRITE_TAC[CONVEX_HULL_EQ;Packing3.CONVEX_VORONOI_LIST]);
(ONCE_REWRITE_TAC[ASSUME
`voronoi_list V (truncate_simplex (SUC 2) vl) =
convex hull (voronoi_list V (truncate_simplex (SUC 2) vl))`]);
(MATCH_MP_TAC Marchal_cells.CONVEX_HULL_SUBSET);
(REWRITE_WITH
`W:real^3->bool DIFF {HD vl, omega_list_n V vl 1, omega_list_n V vl 2}
= {omega_list_n V vl 3}`);
(REWRITE_TAC[ASSUME `W:real^3->bool =
{HD vl, omega_list_n V vl 1, omega_list_n V vl 2, omega_list_n V vl 3}`]);
(REWRITE_WITH `HD vl = omega_list_n V vl 0`);
(REWRITE_TAC[OMEGA_LIST_N]);
(ASM_SET_TAC[]);
(REWRITE_TAC[ARITH_RULE `SUC 2 = 3`]);
(ASM_SET_TAC[]); (* finish subgoal 3 *)
(REWRITE_TAC[CONVEX_CONVEX_HULL]); (* finish subgoal 4 *)
(MATCH_MP_TAC CLOSED_CONVEX_HULL_FINITE);
(MATCH_MP_TAC FINITE_DIFF);
(EXPAND_TAC "W" THEN REWRITE_TAC[Geomdetail.FINITE6]); (* finish subgoal 5 *)
(REWRITE_TAC[Packing3.CLOSED_VORONOI_LIST]); (* finish subgoal 6 *)
(UP_ASM_TAC THEN REWRITE_TAC[CONVEX_HULL_EQ_EMPTY]);
(REWRITE_TAC[ASSUME `W:real^3->bool =
{HD vl, omega_list_n V vl 1, omega_list_n V vl 2, omega_list_n V vl 3}`]);
(REWRITE_WITH `HD vl = omega_list_n V vl 0`);
(REWRITE_TAC[OMEGA_LIST_N]);
(ASM_SET_TAC[]); (* finish subgoal 7 *)
(ASM_MESON_TAC[]);
(REPEAT STRIP_TAC);
(ASM_CASES_TAC `i = 0`);
(ASM_MESON_TAC[]);
(ASM_CASES_TAC `i = 1`);
(ASM_MESON_TAC[]);
(ASM_CASES_TAC `i = 2`);
(ASM_MESON_TAC[]);
(ASM_CASES_TAC `i = 3`);
(ASM_MESON_TAC[]);
(NEW_GOAL `F`);
(ASM_ARITH_TAC);
(ASM_MESON_TAC[])]);;
end;;