(
`!u v V X. &0 <= dihX V X (u,v)`,
[(REPEAT GEN_TAC THEN REWRITE_TAC[dihX]);
(COND_CASES_TAC);
REAL_ARITH_TAC;
(LET_TAC THEN COND_CASES_TAC);
(REWRITE_TAC[dihX2] THEN LET_TAC THEN REWRITE_TAC[
DIHV_LE_0]);
(COND_CASES_TAC);
(REWRITE_TAC[dihX3] THEN LET_TAC THEN MATCH_MP_TAC (
SUM_POS_LE));
STRIP_TAC;
(REWRITE_TAC[
left_action_list;
TABLE]);
(ABBREV_TAC `P = {p | p
permutes {0, 1, 2}}`);
(ABBREV_TAC
`VL = {vl:(real^3)list | ?p. p
permutes {0, 1, 2} /\
vl =
REVERSE (
REVERSE_TABLE (\i.
EL (
inverse p i) ul')
(
LENGTH ul')) /\
u =
EL 0 vl /\
v =
EL 1 vl}`);
(MATCH_MP_TAC
FINITE_SUBSET);
(EXISTS_TAC `(VL:(real^3)list->bool)
CROSS (P: (num->num)->bool)`);
STRIP_TAC;
(MATCH_MP_TAC
FINITE_CROSS);
(NEW_GOAL `FINITE (P:(num->num)->bool)`);
(EXPAND_TAC "P");
(REWRITE_TAC[
FINITE_PERMUTE_3]);
(ASM_REWRITE_TAC[]);
(EXPAND_TAC "VL");
(MATCH_MP_TAC
FINITE_SUBSET);
(ABBREV_TAC
`f = (\(p:num->num).
REVERSE (
REVERSE_TABLE (\i.
EL (
inverse p i)
(ul':(real^3)list)) (
LENGTH ul')))`);
(EXISTS_TAC `{vl:(real^3)list | ?p:num->num. p
IN P /\ vl = f p}`);
(STRIP_TAC);
(MATCH_MP_TAC
FINITE_IMAGE_EXPAND);
(ASM_REWRITE_TAC[]);
(EXPAND_TAC "P" THEN EXPAND_TAC "f");
(REWRITE_TAC[
SUBSET;
IN;
IN_ELIM_THM;
BETA_THM]);
(MESON_TAC[]);
(EXPAND_TAC "VL");
(EXPAND_TAC "P");
(REWRITE_TAC[
CROSS;
IN;
IN_ELIM_THM;
SUBSET]);
(REPEAT STRIP_TAC);
(EXISTS_TAC `vl:(real^3)list`);
(EXISTS_TAC `p:(num->num)`);
(REPEAT STRIP_TAC);
(EXISTS_TAC `p:(num->num)`);
(ASM_REWRITE_TAC[]);
(ASM_REWRITE_TAC[]);
(ASM_REWRITE_TAC[]);
GEN_TAC;
(REWRITE_TAC[
IN_ELIM_THM]);
(DISCH_TAC);
(CHOOSE_TAC (ASSUME `?vl p.
(p
permutes {0, 1, 2} /\
vl =
left_action_list p ul' /\
u:real^3 =
EL 0 vl /\
v =
EL 1 vl) /\
x = vl,p`)) ;
(CHOOSE_TAC (ASSUME `?p.
(p
permutes {0, 1, 2} /\
vl =
left_action_list p ul' /\
u:real^3 =
EL 0 vl /\
v =
EL 1 vl) /\
x = vl,p`)) ;
(UP_ASM_TAC THEN (REPEAT STRIP_TAC));
(REWRITE_ONLY_TAC (ASSUME `x:(real^3)list#(num->num) = vl,p`));
(REWRITE_TAC[
DIHV_LE_0]);
(COND_CASES_TAC);
(REWRITE_TAC[dihX4]);
LET_TAC;
(MATCH_MP_TAC
REAL_LE_MUL THEN REWRITE_TAC[REAL_ARITH `&0 <= &1 / &2`]);
(MATCH_MP_TAC
SUM_POS_LE);
STRIP_TAC;
(ABBREV_TAC `P = {p | p
permutes {0, 1, 2, 3}}`);
(ABBREV_TAC
`VL = {vl:(real^3)list | ?p. p
permutes {0, 1, 2, 3} /\
vl =
left_action_list p ul' /\
u =
EL 0 vl /\
v =
EL 1 vl}`);
(MATCH_MP_TAC
FINITE_SUBSET);
(EXISTS_TAC `(VL:(real^3)list->bool)
CROSS (P: (num->num)->bool)`);
STRIP_TAC;
(MATCH_MP_TAC
FINITE_CROSS);
(NEW_GOAL `FINITE (P:(num->num)->bool)`);
(EXPAND_TAC "P");
(REWRITE_TAC[
FINITE_PERMUTE_4]);
(ASM_REWRITE_TAC[]);
(EXPAND_TAC "VL");
(MATCH_MP_TAC
FINITE_SUBSET);
(ABBREV_TAC
`f = (\(p:num->num).
left_action_list p (ul':(real^3)list))`);
(EXISTS_TAC `{vl:(real^3)list | ?p:num->num. p
IN P /\ vl = f p}`);
(STRIP_TAC);
(MATCH_MP_TAC
FINITE_IMAGE_EXPAND);
(ASM_REWRITE_TAC[]);
(EXPAND_TAC "P" THEN EXPAND_TAC "f");
(REWRITE_TAC[
SUBSET;
IN;
IN_ELIM_THM;
BETA_THM]);
(MESON_TAC[]);
(EXPAND_TAC "VL");
(EXPAND_TAC "P");
(REWRITE_TAC[
CROSS;
IN;
IN_ELIM_THM;
SUBSET]);
(REPEAT STRIP_TAC);
(EXISTS_TAC `vl:(real^3)list`);
(EXISTS_TAC `p:(num->num)`);
(REPEAT STRIP_TAC);
(EXISTS_TAC `p:(num->num)`);
(ASM_REWRITE_TAC[]);
(ASM_REWRITE_TAC[]);
(ASM_REWRITE_TAC[]);
GEN_TAC;
(REWRITE_TAC[
IN_ELIM_THM]);
(DISCH_TAC);
(CHOOSE_TAC (ASSUME `?vl p.
(p
permutes {0, 1, 2, 3} /\
vl =
left_action_list p ul' /\
u:real^3 =
EL 0 vl /\
v =
EL 1 vl) /\
x = vl,p`)) ;
(CHOOSE_TAC (ASSUME `?p.
(p
permutes {0, 1, 2, 3} /\
vl =
left_action_list p ul' /\
u:real^3 =
EL 0 vl /\
v =
EL 1 vl) /\
x = vl,p`)) ;
(UP_ASM_TAC THEN (REPEAT STRIP_TAC));
(REWRITE_ONLY_TAC (ASSUME `x:(real^3)list#(num->num) = vl,p`));
(REWRITE_TAC[
DIHV_LE_0]);
REAL_ARITH_TAC ]);;