(* ========================================================================= *)
(* FLYSPECK - BOOK FORMALIZATION *)
(* *)
(* Authour : VU KHAC KY *)
(* Book lemma: EMNWUUS *)
(* Chaper : Packing (Marchal Cells) *)
(* Date : October 3, 2010 *)
(* *)
(* ========================================================================= *)
(* About this lemma:
! I have proved EMNWUUS1.
! In part EMNWUUS2, I have prove the implication part (==>)
! and haven't done the ! Inverse part (<==).
! So the only thing to do with this lemma is to prove the following :
!
! `mcell0 V ul = {} /\ mcell1 V ul = {} /\ mcell2 V ul = {} /\ mcell3 V ul = {}
! ==> hl ul < sqrt (&2)`
*)
(* ========================================================================= *)
(* FILES NEED TO BE LOADED *)
(* ========================================================================= *)
flyspeck_needs "nonlinear/vukhacky_tactics.hl";;
flyspeck_needs "packing/pack_defs.hl";;
flyspeck_needs "packing/pack_concl.hl";;
flyspeck_needs "packing/pack1.hl";;
module EMNWUUS = struct
(* dmtcp: needs "flyspeck_load.hl";; *)
open Pack_defs;;
open Pack_concl;;
open Vukhacky_tactics;;
open Pack1;;
needs "marchal_cells.hl";;
(* ============== Axioms in previous parts ===================================*)
let XNHPWAB1 = new_axiom XNHPWAB1_concl;;
let XNHPWAB4 = new_axiom XNHPWAB4_concl;;
let WAUFCHE1 = new_axiom WAUFCHE1_concl;;
let WAUFCHE2 = new_axiom WAUFCHE2_concl;;
let OAPVION2 = new_axiom OAPVION2_concl;;
let MHFTTZN1 = new_axiom MHFTTZN1_concl;;
let MHFTTZN4 = new_axiom MHFTTZN4_concl;;
(* ========================================================================= *)
let EMNWUUS1 = prove_by_refinement ( EMNWUUS1_concl,
[ (REWRITE_TAC[mcell4] THEN REPEAT STRIP_TAC THEN EQ_TAC THEN COND_CASES_TAC);
(REPEAT STRIP_TAC);
(NEW_GOAL `set_of_list (ul:(real^3)list) = {}`);
(ASM_MESON_TAC[CONVEX_HULL_EQ_EMPTY]);
(NEW_GOAL `ul:(real^3)list = []`);
(NEW_GOAL `~(?h t. ul:(real^3)list = CONS h t)`);
STRIP_TAC;
(NEW_GOAL `(h:real^3) IN set_of_list ul`);
(REWRITE_TAC [ASSUME `ul = CONS (h:real^3) t`; IN_SET_OF_LIST;MEM]);
(ASM_SET_TAC[]);
(ASM_MESON_TAC[list_CASES]);
(UNDISCH_TAC `barV V 3 (ul:(real^3)list)`);
(REWRITE_TAC[BARV]);
STRIP_TAC;
(NEW_GOAL `LENGTH (ul:(real^3)list) = 0`);
(ASM_MESON_TAC[ASSUME `ul:(real^3)list =[]`;LENGTH]);
(ASM_ARITH_TAC);
(MESON_TAC[]);
(MESON_TAC[]);
(MESON_TAC[]) ]);;
(* ========================================================================= *)
g EMNWUUS2_concl;;
e (REPEAT GEN_TAC THEN STRIP_TAC);;
(* ! Note: The inverse part of this lemma has not been Done *)
e (EQ_TAC);;
e (REPEAT STRIP_TAC);;
(* Break into 4 cases *)
(* =============== Case 1 ================================ *) (* OK *)
e (REWRITE_TAC[mcell0]);;
e (REWRITE_TAC[SET_RULE `x DIFF y = {} <=> (!a. a IN x ==> a IN y)`]);;
e (REWRITE_TAC[ROGERS;IMAGE;IN;ball;SUBSET;IN_ELIM_THM]);;
e GEN_TAC;;
e (MATCH_MP_TAC BALL_CONVEX_HULL_LEMMA);;
e (GEN_TAC THEN REWRITE_TAC[IN_ELIM_THM]);;
e (STRIP_TAC);;
(* New_subgoal 1.1 *)
e (NEW_GOAL `hl (truncate_simplex x' (ul:(real^3)list))
<= hl (truncate_simplex (LENGTH ul - 1) ul)`);;
e (ASM_CASES_TAC `x' < LENGTH (ul:(real^3)list) - 1`);;
e (MATCH_MP_TAC (REAL_ARITH `a < b ==> a <= b`));;
e (NEW_GOAL `x' < (LENGTH (ul:(real^3)list) - 1) /\ LENGTH ul - 1 <= 3`);;
e (ASM_REWRITE_TAC[] THEN UNDISCH_TAC `barV V 3 ul`);;
e (REWRITE_TAC[BARV] THEN ARITH_TAC);;
e (UP_ASM_TAC);;
e (NEW_GOAL `ul IN barV V 3`);;
e (ASM_MESON_TAC[IN]);;
e (ASM_MESON_TAC[XNHPWAB4; ARITH_RULE `3 <= 3`]);;
e (MATCH_MP_TAC (REAL_ARITH `a = b ==> a <= b`));;
e (REWRITE_WITH `LENGTH (ul:(real^3)list) - 1 = x'`);;
e (ASM_ARITH_TAC);;
(* End subgoal 1.1 *)
(* New subgoal 1.2 *)
e (NEW_GOAL `hl (truncate_simplex (LENGTH ul - 1) ul) = hl (ul:(real^3)list)`);;
e (AP_TERM_TAC);;
e (REWRITE_TAC[TRUNCATE_SIMPLEX]);;
e (MATCH_MP_TAC SELECT_UNIQUE);;
e (GEN_TAC THEN REWRITE_TAC[IN_ELIM_THM;INITIAL_SUBLIST] THEN EQ_TAC);;
e STRIP_TAC;;
e (NEW_GOAL `LENGTH (ul:(real^3)list) =
LENGTH (y:(real^3)list) + LENGTH (yl:(real^3)list)`);;
e (ASM_MESON_TAC[LENGTH_APPEND]);;
e (NEW_GOAL `LENGTH (yl:(real^3)list) = 0`);;
e (ASM_ARITH_TAC);;
e (NEW_GOAL `(yl:(real^3)list) = []`);;
e (ASM_MESON_TAC[LENGTH_EQ_NIL]);;
e (ASM_MESON_TAC[APPEND_NIL]);;
e (REPEAT STRIP_TAC);;
e (ASM_REWRITE_TAC[]);;
e (ASM_ARITH_TAC);;
e (EXISTS_TAC `[]:(real^3)list`);;
e (ASM_MESON_TAC[APPEND_NIL]);;
(* End subgoal 1.2 *)
(* New subgoal 1.3 *)
e (NEW_GOAL `?u0 u1 u2 u3:real^3. ul = [u0;u1;u2;u3]`);;
e (ASM_MESON_TAC[BARV_3_EXPLICIT]);;
e (REPEAT (FIRST_X_ASSUM CHOOSE_TAC));;
e (REWRITE_TAC[ASSUME `ul = [u0:real^3; u1; u2; u3]`; HD]);;
(* ---------------------------------------------- *)
(* Consider case x' = 0 *)
e (ASM_CASES_TAC `x' = 0`);;
e (REWRITE_WITH `x:real^3 = u0`);;
e (MP_TAC (ASSUME `x:real^3 = omega_list_n V ul x'`));;
e (ASM_MESON_TAC[OMEGA_LIST_0_EXPLICIT; GSYM IN]);;
e (ASM_REWRITE_TAC[DIST_REFL]);;
e (MESON_TAC[SQRT_LT_0;REAL_ARITH `&0 <= &2 /\ &0 < &2`]);;
(* ---------------------------------------------- *)
(* Consider case x' = 1 *)
e (ASM_CASES_TAC `x' = 1`);;
e (REWRITE_WITH `x:real^3 = circumcenter {u0, u1}`);;
e (MP_TAC (ASSUME `x:real^3 = omega_list_n V ul x'`));;
e (ASM_MESON_TAC[OMEGA_LIST_1_EXPLICIT; GSYM IN]);;
e (ONCE_REWRITE_TAC[DIST_SYM]);;
e (REWRITE_WITH `dist (circumcenter {u0:real^3, u1},u0)
= hl (truncate_simplex x' (ul:(real^3)list))`);;
e (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1;HL;radV]);;
e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
e (MATCH_MP_TAC SELECT_UNIQUE);;
e (GEN_TAC THEN REWRITE_TAC[IN_ELIM_THM; MESON[set_of_list]
`set_of_list [u0:real^3;u1] = {u0, u1}`] THEN EQ_TAC);;
e (DISCH_TAC THEN (FIRST_ASSUM MATCH_MP_TAC));;
e (SET_TAC[]);;
e (REPEAT STRIP_TAC);;
e (NEW_GOAL `w IN {u0,u1:real^3}`);;
e (UP_ASM_TAC THEN SET_TAC[]);;
e (NEW_GOAL
`(!w. w IN {u0,u1:real^3} ==> radV {u0,u1} = dist (circumcenter {u0,u1},w))`);;
e (MATCH_MP_TAC OAPVION2);;
e (REWRITE_TAC[AFFINE_INDEPENDENT_2]);;
e (ASM_REWRITE_TAC[]);;
e (NEW_GOAL `(radV {u0,u1:real^3} = dist (circumcenter {u0,u1},w))`);;
e (ASM_SIMP_TAC[]);;
e (NEW_GOAL `(radV {u0,u1:real^3} = dist (circumcenter {u0,u1},u0))`);;
e (FIRST_ASSUM MATCH_MP_TAC);;
e (SET_TAC[]);;
e (ASM_MESON_TAC[]);;
e (ASM_REAL_ARITH_TAC);;
(* ---------------------------------------------- *)
(* Consider case x' = 2 *)
e (ASM_CASES_TAC `x' = 2`);;
e (REWRITE_WITH `x:real^3 = circumcenter {u0, u1, u2}`);;
e (MP_TAC (ASSUME `x:real^3 = omega_list_n V ul x'`));;
e (ASM_MESON_TAC[OMEGA_LIST_2_EXPLICIT; GSYM IN]);;
e (ONCE_REWRITE_TAC[DIST_SYM]);;
e (REWRITE_WITH `dist (circumcenter {u0:real^3, u1, u2},u0)
= hl (truncate_simplex x' (ul:(real^3)list))`);;
e (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2;HL;radV]);;
e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
e (MATCH_MP_TAC SELECT_UNIQUE);;
e (GEN_TAC THEN REWRITE_TAC[IN_ELIM_THM; MESON[set_of_list]
`set_of_list [u0:real^3;u1;u2] = {u0, u1, u2}`] THEN EQ_TAC);;
e (DISCH_TAC THEN (FIRST_ASSUM MATCH_MP_TAC));;
e (SET_TAC[]);;
e (REPEAT STRIP_TAC);;
e (NEW_GOAL `w IN {u0,u1:real^3,u2}`);;
e (UP_ASM_TAC THEN SET_TAC[]);;
e (NEW_GOAL `(!w. w IN {u0,u1:real^3, u2} ==>
radV {u0,u1,u2} = dist (circumcenter {u0,u1,u2},w))`);;
e (MATCH_MP_TAC OAPVION2);;
e (MATCH_MP_TAC AFFINE_INDEPENDENT_SUBSET);;
e (EXISTS_TAC `{u0, u1, u2, u3:real^3}`);;
e (REWRITE_TAC[SET_RULE `{a, b:A, c} SUBSET {a, b , c, d:A}`]);;
e (REWRITE_TAC[AFFINE_INDEPENDENT_IFF_CARD]);;
e STRIP_TAC;;
e (REWRITE_TAC[FINITE_SET_OF_LIST; MESON[set_of_list]
`{u0, u1, u2,u3} = set_of_list [u0;u1;u2:real^3;u3]`]);;
e (NEW_GOAL `aff_dim {u0,u1,u2,u3:real^3} = &3`);;
e (REWRITE_TAC[MESON[set_of_list]
`{u0, u1, u2,u3} = set_of_list [u0;u1;u2:real^3;u3]`]);;
e (MATCH_MP_TAC MHFTTZN1);;
e (EXISTS_TAC `V:real^3->bool`);;
e (ASM_MESON_TAC[ARITH_RULE `3 <= 3`]);;
e (ONCE_ASM_REWRITE_TAC[]);;
e (NEW_GOAL `FINITE {u1, u2, u3:real^3}`);;
e (REWRITE_TAC[FINITE_SET_OF_LIST; MESON[set_of_list]
`{u1, u2,u3} = set_of_list [u1;u2:real^3;u3]`]);;
e (MATCH_MP_TAC (ARITH_RULE
`(a = int_of_num 4) ==> (int_of_num 3 = a - int_of_num 1)`));;
e (MATCH_MP_TAC (ARITH_RULE `a = b ==> int_of_num a = int_of_num b`));;
e (NEW_GOAL `CARD {u0:real^3, u1, u2, u3} =
(if u0 IN {u1, u2, u3} then CARD {u1, u2, u3}
else SUC (CARD {u1, u2, u3} ))`);;
e (UP_ASM_TAC THEN REWRITE_TAC[CARD_CLAUSES]);;
e (UP_ASM_TAC THEN COND_CASES_TAC);;
e (DISCH_TAC);;
e (NEW_GOAL `aff_dim {u0:real^3, u1, u2, u3} < &3`);;
e (REWRITE_WITH `{u0,u1,u2,u3:real^3} = {u1, u2,u3}`);;
e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
e (NEW_GOAL `CARD {u1, u2, u3} = CARD {u0, u1, u2, u3} <=>
{u1, u2, u3:real^3} = {u0, u1, u2, u3}`);;
e (MATCH_MP_TAC SUBSET_CARD_EQ);;
e (STRIP_TAC);;
e (REWRITE_TAC[MESON[set_of_list]
`{u0, u1, u2, u3:real^3} = set_of_list [u0;u1;u2;u3]`;FINITE_SET_OF_LIST]);;
e (SET_TAC[]);;
e (ASM_MESON_TAC[]);;
e (REWRITE_TAC[MESON[set_of_list]
`{u1:real^3,u2, u3} = set_of_list [u1;u2;u3]`]);;
e (MATCH_MP_TAC AFF_DIM_LE_LENGTH);;
e (REWRITE_TAC[LENGTH]);;
e (ARITH_TAC);;
e (NEW_GOAL `F`);;
e (ASM_MESON_TAC[ARITH_RULE `a = int_of_num 3 /\ a < int_of_num 3 ==> F`]);;
e (ASM_MESON_TAC[]);;
e STRIP_TAC;;
e (NEW_GOAL `CARD {u1:real^3, u2, u3} = 3`);;
e (NEW_GOAL `CARD {u1,u2,u3:real^3} <= 3`);;
e (MATCH_MP_TAC (ARITH_RULE
`a <= LENGTH [u1;u2;u3:real^3] /\ LENGTH [u1;u2;u3:real^3] <= b ==> a <= b`));;
e STRIP_TAC;;
e (REWRITE_TAC[MESON[set_of_list]
`{u1,u2,u3:real^3} = set_of_list [u1;u2;u3]`;CARD_SET_OF_LIST_LE]);;
e (REWRITE_TAC[LENGTH] THEN ARITH_TAC);;
e (ASM_CASES_TAC `CARD {u1:real^3, u2, u3} <= 2`);;
e (NEW_GOAL `CARD {u0,u1,u2,u3:real^3} <= 3`);;
e (NEW_GOAL `CARD {u0:real^3, u1, u2, u3} =
(if u0 IN {u1,u2,u3} then CARD {u1,u2,u3} else SUC (CARD {u1,u2,u3}))`);;
e (NEW_GOAL `FINITE {u1,u2,u3:real^3}`);;
e (REWRITE_TAC[MESON[set_of_list]
`{u1,u2,u3:real^3} = set_of_list [u1;u2;u3]`;FINITE_SET_OF_LIST]);;
e (ASM_REWRITE_TAC[CARD_CLAUSES]);;
e (UP_ASM_TAC THEN COND_CASES_TAC);;
e (ASM_ARITH_TAC);;
e (ASM_ARITH_TAC);;
e (ABBREV_TAC `xl = list_of_set {u0, u1, u2, u3:real^3}`);;
e (NEW_GOAL `aff_dim {u0:real^3, u1, u2, u3}
< int_of_num (CARD {u0, u1, u2, u3})`);;
e (REWRITE_WITH `{u0,u1,u2,u3:real^3} = set_of_list (xl:(real^3)list)`);;
e (EXPAND_TAC "xl");;
e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
e (MATCH_MP_TAC SET_OF_LIST_OF_SET);;
e (REWRITE_TAC[MESON[set_of_list]
`{u0, u1, u2, u3:real^3} = set_of_list [u0;u1;u2;u3]`;FINITE_SET_OF_LIST]);;
e (MATCH_MP_TAC AFF_DIM_LE_LENGTH);;
e (REWRITE_WITH `set_of_list (xl:(real^3)list) = {u0, u1, u2, u3:real^3}`);;
e (EXPAND_TAC "xl");;
e (MATCH_MP_TAC SET_OF_LIST_OF_SET);;
e (REWRITE_TAC[MESON[set_of_list]
`{u0,u1,u2,u3:real^3} = set_of_list [u0;u1;u2;u3]`;FINITE_SET_OF_LIST]);;
e (EXPAND_TAC "xl");;
e (MATCH_MP_TAC LENGTH_LIST_OF_SET);;
e (REWRITE_TAC[MESON[set_of_list]
`{u0,u1,u2,u3:real^3} = set_of_list [u0;u1;u2;u3]`;FINITE_SET_OF_LIST]);;
e (NEW_GOAL `F`);;
e (ASM_ARITH_TAC);;
e (ASM_MESON_TAC[]);;
e (ASM_ARITH_TAC);;
e ASM_ARITH_TAC;;
e (MATCH_MP_TAC (REAL_ARITH
`radV {u0,u1,u2:real^3} = a /\ radV {u0,u1,u2} = b ==> a = b`));;
e STRIP_TAC;;
e (ASM_REWRITE_TAC[]);;
e (FIRST_ASSUM MATCH_MP_TAC);;
e (SET_TAC[]);;
e (FIRST_ASSUM MATCH_MP_TAC);;
e (ASM_REWRITE_TAC[]);;
e (ASM_REAL_ARITH_TAC);;
(* ---------------------------------------------- *)
(* Consider case x' = 3 *)
e (ASM_CASES_TAC `x' = 3`);;
e (REWRITE_WITH `x = circumcenter {u0,u1,u2,u3:real^3}`);;
e (ASM_REWRITE_TAC[]);;
e (MATCH_MP_TAC OMEGA_LIST_3_EXPLICIT);;
e (ASM_MESON_TAC[GSYM IN]);;
e (NEW_GOAL `dist (u0,circumcenter {u0:real^3, u1, u2, u3})
= hl (ul:(real^3)list)`);;
e (ASM_REWRITE_TAC[HL]);;
e (REWRITE_WITH `set_of_list [u0:real^3; u1; u2; u3] = {u0,u1,u2,u3}`);;
e (MESON_TAC[set_of_list]);;
e (NEW_GOAL `(!w. w IN {u0,u1:real^3, u2,u3} ==>
radV {u0,u1,u2,u3} = dist (circumcenter {u0,u1,u2,u3},w))`);;
e (MATCH_MP_TAC OAPVION2);;
e (REWRITE_TAC[AFFINE_INDEPENDENT_IFF_CARD]);;
e STRIP_TAC;;
e (REWRITE_TAC[FINITE_SET_OF_LIST; MESON[set_of_list]
`{u0, u1, u2,u3} = set_of_list [u0;u1;u2:real^3;u3]`]);;
e (NEW_GOAL `aff_dim {u0,u1,u2,u3:real^3} = &3`);;
e (REWRITE_TAC[MESON[set_of_list]
`{u0, u1, u2,u3} = set_of_list [u0;u1;u2:real^3;u3]`]);;
e (MATCH_MP_TAC MHFTTZN1);;
e (EXISTS_TAC `V:real^3->bool`);;
e (ASM_MESON_TAC[ARITH_RULE `3 <= 3`]);;
e (ONCE_ASM_REWRITE_TAC[]);;
e (MATCH_MP_TAC (ARITH_RULE
`(a = int_of_num 4) ==> (int_of_num 3 = a - int_of_num 1)`));;
e (MATCH_MP_TAC (ARITH_RULE `a = b ==> int_of_num a = int_of_num b`));;
e (NEW_GOAL `FINITE {u1, u2, u3:real^3}`);;
e (REWRITE_TAC[FINITE_SET_OF_LIST; MESON[set_of_list]
`{u1, u2,u3} = set_of_list [u1;u2:real^3;u3]`]);;
e (NEW_GOAL `CARD {u0:real^3, u1, u2, u3} =
(if u0 IN {u1, u2, u3} then CARD {u1, u2, u3}
else SUC (CARD {u1, u2, u3} ))`);;
e (UP_ASM_TAC THEN REWRITE_TAC[CARD_CLAUSES]);;
e (UP_ASM_TAC THEN COND_CASES_TAC);;
e (DISCH_TAC);;
e (NEW_GOAL `aff_dim {u0:real^3, u1, u2, u3} < &3`);;
e (REWRITE_WITH `{u0,u1,u2,u3:real^3} = {u1, u2,u3}`);;
e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
e (NEW_GOAL `CARD {u1, u2, u3} = CARD {u0, u1, u2, u3} <=>
{u1, u2, u3:real^3} = {u0, u1, u2, u3}`);;
e (MATCH_MP_TAC SUBSET_CARD_EQ);;
e (STRIP_TAC);;
e (REWRITE_TAC[MESON[set_of_list]
`{u0, u1, u2, u3:real^3} = set_of_list [u0;u1;u2;u3]`;FINITE_SET_OF_LIST]);;
e (SET_TAC[]);;
e (ASM_MESON_TAC[]);;
e (REWRITE_TAC[MESON[set_of_list]
`{u1:real^3,u2, u3} = set_of_list [u1;u2;u3]`]);;
e (MATCH_MP_TAC AFF_DIM_LE_LENGTH);;
e (REWRITE_TAC[LENGTH]);;
e (ARITH_TAC);;
e (NEW_GOAL `F`);;
e (ASM_MESON_TAC[ARITH_RULE `a = int_of_num 3 /\ a < int_of_num 3 ==> F`]);;
e (ASM_MESON_TAC[]);;
e STRIP_TAC;;
e (NEW_GOAL `CARD {u1:real^3, u2, u3} = 3`);;
e (NEW_GOAL `CARD {u1,u2,u3:real^3} <= 3`);;
e (MATCH_MP_TAC (ARITH_RULE
`a <= LENGTH [u1;u2;u3:real^3] /\ LENGTH [u1;u2;u3:real^3] <= b ==> a <= b`));;
e STRIP_TAC;;
e (REWRITE_TAC[MESON[set_of_list]
`{u1,u2,u3:real^3} = set_of_list [u1;u2;u3]`;CARD_SET_OF_LIST_LE]);;
e (REWRITE_TAC[LENGTH] THEN ARITH_TAC);;
e (ASM_CASES_TAC `CARD {u1:real^3, u2, u3} <= 2`);;
e (NEW_GOAL `CARD {u0,u1,u2,u3:real^3} <= 3`);;
e (NEW_GOAL `CARD {u0:real^3, u1, u2, u3} =
(if u0 IN {u1,u2,u3} then CARD {u1,u2,u3} else SUC (CARD {u1,u2,u3}))`);;
e (NEW_GOAL `FINITE {u1,u2,u3:real^3}`);;
e (REWRITE_TAC[MESON[set_of_list]
`{u1,u2,u3:real^3} = set_of_list [u1;u2;u3]`;FINITE_SET_OF_LIST]);;
e (ASM_REWRITE_TAC[CARD_CLAUSES]);;
e (UP_ASM_TAC THEN COND_CASES_TAC);;
e (ASM_ARITH_TAC);;
e (ASM_ARITH_TAC);;
e (ABBREV_TAC `xl = list_of_set {u0, u1, u2, u3:real^3}`);;
e (NEW_GOAL `aff_dim {u0:real^3, u1, u2, u3}
< int_of_num (CARD {u0, u1, u2, u3})`);;
e (REWRITE_WITH `{u0,u1,u2,u3:real^3} = set_of_list (xl:(real^3)list)`);;
e (EXPAND_TAC "xl");;
e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
e (MATCH_MP_TAC SET_OF_LIST_OF_SET);;
e (REWRITE_TAC[MESON[set_of_list]
`{u0, u1, u2, u3:real^3} = set_of_list [u0;u1;u2;u3]`;FINITE_SET_OF_LIST]);;
e (MATCH_MP_TAC AFF_DIM_LE_LENGTH);;
e (REWRITE_WITH `set_of_list (xl:(real^3)list) = {u0, u1, u2, u3:real^3}`);;
e (EXPAND_TAC "xl");;
e (MATCH_MP_TAC SET_OF_LIST_OF_SET);;
e (REWRITE_TAC[MESON[set_of_list]
`{u0,u1,u2,u3:real^3} = set_of_list [u0;u1;u2;u3]`;FINITE_SET_OF_LIST]);;
e (EXPAND_TAC "xl");;
e (MATCH_MP_TAC LENGTH_LIST_OF_SET);;
e (REWRITE_TAC[MESON[set_of_list]
`{u0,u1,u2,u3:real^3} = set_of_list [u0;u1;u2;u3]`;FINITE_SET_OF_LIST]);;
e (NEW_GOAL `F`);;
e (ASM_ARITH_TAC);;
e (ASM_MESON_TAC[]);;
e (ASM_ARITH_TAC);;
e ASM_ARITH_TAC;;
e (MATCH_MP_TAC (REAL_ARITH
`radV {u0,u1,u2:real^3,u3} = a /\ radV {u0,u1,u2,u3} = b ==> a = b`));;
e STRIP_TAC;;
e (ONCE_REWRITE_TAC[DIST_SYM] THEN FIRST_ASSUM MATCH_MP_TAC);;
e (SET_TAC[]);;
e (MESON_TAC[]);;
e (ASM_MESON_TAC[]);;
(* --------------------------------------------- *)
e (UNDISCH_TAC `barV V 3 (ul:(real^3)list)`);;
e (REWRITE_TAC[BARV]);;
e (STRIP_TAC);;
e (NEW_GOAL `F`);;
e (ASM_ARITH_TAC);;
e (ASM_MESON_TAC[]);;
(*
Here we have finished the first part `mcell0 V ul = {}`;there are 3 parts left:
mcell1 V ul = {}
mcell2 V ul = {}
mcell3 V ul = {}
*)
(* =============== Case 2 =================================== *) ( Finished *)
e (REWRITE_TAC[mcell1]);;
e (COND_CASES_TAC);;
e (NEW_GOAL `F`);;
e (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
e (UP_ASM_TAC THEN MESON_TAC[]);;
e (REWRITE_TAC[]);;
(* =============== Case 3 =================================== *) (* Finished *)
e (REWRITE_TAC[mcell2]);;
e (COND_CASES_TAC);;
e (NEW_GOAL `F`);;
e (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
e (UP_ASM_TAC THEN MESON_TAC[]);;
e (REWRITE_TAC[]);;
(* =============== Case 4 =================================== *) ( Finished *)
e (REWRITE_TAC[mcell3]);;
e (COND_CASES_TAC);;
e (NEW_GOAL `F`);;
e (ASM_REAL_ARITH_TAC);;
e (ASM_MESON_TAC[]);;
e (MESON_TAC[]);;
(* =============== Reverse part =============================== *)
(* .............................................................*)
(* ! Need to be done later ...................................... *)
(* Good luck *)
end;;