(* ------------------------------------------------------------------ *)
(*
Topological Spaces, Metric Spaces,
Connectedness, Totally bounded spaces, compactness,
Hausdorff property, completeness, properties of Euclidean space,
Author: Thomas Hales 2004
*)
(* ------------------------------------------------------------------ *)
(* prioritize_real (or num) *)
(* ------------------------------------------------------------------ *)
(* Logical Preliminaries *)
(* ------------------------------------------------------------------ *)
let Q_ELIM_THM = prove_by_refinement(
`!P Q R . (?(u:B). (?(x:A). (u = P x) /\ (Q x)) /\ (R u)) <=>
(?x. (Q x) /\ R( P x))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
MESON_TAC[];
]);;
(* }}} *)
(* }}} *)
(* }}} *)
(* ------------------------------------------------------------------ *)
(* Set Preliminaries *)
(* ------------------------------------------------------------------ *)
let DIFF_SUBSET = prove_by_refinement(
`!X A (B:A->bool). A SUBSET (X DIFF B) <=>
(A SUBSET X) /\ (A INTER B = EMPTY)`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
REWRITE_TAC[SUBSET;DIFF;INTER;IN];
EQ_TAC;
REWRITE_TAC[IN_ELIM_THM'];
DISCH_TAC;
CONJ_TAC;
ASM_MESON_TAC[];
MATCH_MP_TAC EQ_EXT;
GEN_TAC;
REWRITE_TAC[IN_ELIM_THM';
EMPTY];
ASM_MESON_TAC[];
DISCH_ALL_TAC;
GEN_TAC;
DISCH_ALL_TAC;
REWRITE_TAC[IN_ELIM_THM'];
CONJ_TAC;
ASM_MESON_TAC[];
USE 1 (fun t-> AP_THM t `x:A`);
USE 1 (REWRITE_RULE[IN_ELIM_THM';EMPTY]);
ASM_MESON_TAC[];
]);;
(* }}} *)
let SUBSET_INTERS = prove_by_refinement(
`!X (A:A->bool). A SUBSET (INTERS X) <=> (!x. X x ==> (A SUBSET x))`,
(* {{{ proof *)
[
REP_GEN_TAC;
REWRITE_TAC[SUBSET;INTERS];
REWRITE_TAC [IN_ELIM_THM'];
MESON_TAC[IN];
]);;
(* }}} *)
let EQ_EMPTY = prove_by_refinement(
`!P. ({(x:A) | P x} = {}) <=> (!x. ~P x)`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
EQ_TAC;
DISCH_TAC;
(USE 0 (fun t-> AP_THM t `x:A`));
USE 0 (REWRITE_RULE[IN_ELIM_THM';
EMPTY]);
USE 0 (GEN_ALL);
ASM_REWRITE_TAC[];
DISCH_TAC;
MATCH_MP_TAC EQ_EXT;
GEN_TAC;
REWRITE_TAC[IN_ELIM_THM';EMPTY];
ASM_MESON_TAC[];
]);;
(* }}} *)
let DIFF_INTER = prove_by_refinement(
`!A B (C:A->bool). ((A DIFF B) INTER C = EMPTY) <=>
((A INTER C) SUBSET B)`,
(* {{{ proof *)
[
REWRITE_TAC[DIFF;INTER;SUBSET;IN_ELIM_THM'];
REWRITE_TAC[IN;
EQ_EMPTY];
MESON_TAC[];
]);;
(* }}} *)
let SUB_IMP_INTER = prove_by_refinement(
`!A B (C:A->bool). ((A SUBSET B) ==> (A INTER C) SUBSET B) /\
((A SUBSET B) ==> (C INTER A) SUBSET B)`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
SUBCONJ_TAC;
REWRITE_TAC[INTER;SUBSET;IN;IN_ELIM_THM'];
MESON_TAC[];
MESON_TAC[INTER_COMM];
]);;
(* }}} *)
(* }}} *)
let UNIONS_DELETE2 = prove_by_refinement(
`!(A:A->bool) B C. (A SUBSET (UNIONS B)) /\ (A INTER C = EMPTY) ==>
(A SUBSET (UNIONS (B DELETE (C))))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
ASM SET_TAC[SUBSET;UNIONS;INTER;EMPTY;DELETE];
]);;
(* }}} *)
(* this generalizes to arbitrary cardinalities *)
let finite_subset = prove_by_refinement(
`!A (f:A->B) B. (B SUBSET (IMAGE f A)) /\ (FINITE B) ==>
(?C. (C SUBSET A) /\ (FINITE C) /\ (B = IMAGE f C))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
USE 0 (REWRITE_RULE[SUBSET;IN_IMAGE]);
USE 0 (CONV_RULE NAME_CONFLICT_CONV);
USE 0 (CONV_RULE (quant_left_CONV "x'"));
USE 0 (CONV_RULE (quant_left_CONV "x'"));
CHO 0;
TYPE_THEN `IMAGE x' B` EXISTS_TAC ;
SUBCONJ_TAC;
REWRITE_TAC[SUBSET;IN_IMAGE];
NAME_CONFLICT_TAC;
GEN_TAC;
ASM_MESON_TAC[];
DISCH_ALL_TAC;
CONJ_TAC;
ASM_MESON_TAC[ FINITE_IMAGE];
MATCH_MP_TAC SUBSET_ANTISYM;
CONJ_TAC;
REWRITE_TAC[SUBSET;IN_IMAGE];
GEN_TAC;
TYPE_THEN `x` (USE 0 o SPEC);
ASM_MESON_TAC[];
REWRITE_TAC[SUBSET;IN_IMAGE];
NAME_CONFLICT_TAC;
GEN_TAC;
DISCH_THEN CHOOSE_TAC;
ASM_REWRITE_TAC[];
AND 3;
CHO 3;
ASM_MESON_TAC[];
]);;
(* }}} *)
NOT_IN_EMPTY];
GEN_TAC;
MATCH_MP_TAC EQ_EXT;
GEN_TAC;
REWRITE_TAC[IN_ELIM_THM'];
ASM_MESON_TAC[IN];
]);;
(* }}} *)
let delete_empty = prove_by_refinement(
`!(A:A->bool) x. (A DELETE x = EMPTY) <=> (~(A = EMPTY) ==> (A = {x}))`,
(* {{{ proof *)
[
REWRITE_TAC[DELETE];
DISCH_ALL_TAC;
EQ_TAC;
DISCH_ALL_TAC;
USE 1 (fun t-> AP_THM t `u:A`);
USE 1 (REWRITE_RULE[IN_ELIM_THM';
EMPTY]);
REWRITE_TAC[EMPTY;INSERT;IN];
USE 0 (REWRITE_RULE[EMPTY_EXISTS]);
USE 1 (GEN `u:A`);
MATCH_MP_TAC EQ_EXT;
GEN_TAC;
REWRITE_TAC[IN_ELIM_THM'];
ASM_MESON_TAC[IN];
DISCH_ALL_TAC;
MATCH_MP_TAC EQ_EXT;
GEN_TAC;
REWRITE_TAC[IN_ELIM_THM';EMPTY];
USE 0 (REWRITE_RULE[EMPTY_EXISTS]);
USE 0 (REWRITE_RULE[EMPTY;INSERT;IN]);
REWRITE_TAC[IN];
USE 0 (CONV_RULE (quant_left_CONV "u"));
USE 0 (SPEC `x':A`);
MATCH_MP_TAC (TAUT `(a ==> b) ==> ~(a /\ ~b)`);
DISCH_ALL_TAC;
REWR 0;
UND 1;
ASM_REWRITE_TAC[];
REWRITE_TAC[IN_ELIM_THM'];
]);;
(* }}} *)
let inters_subset = prove_by_refinement(
`!A (B:(A->bool)->bool). A SUBSET B ==> INTERS B SUBSET INTERS A`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
REWRITE_TAC[INTERS;SUBSET;IN_ELIM_THM'];
ASM_MESON_TAC[SUBSET;IN];
]);;
(* }}} *)
let delete_inters = prove_by_refinement(
`!V (u:A->bool). V u ==> (INTERS V = (INTERS (V DELETE u)) INTER u)`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
MATCH_MP_TAC SUBSET_ANTISYM;
CONJ_TAC;
REWRITE_TAC[
SUBSET_INTER];
CONJ_TAC;
MATCH_MP_TAC
inters_subset;
REWRITE_TAC [DELETE_SUBSET];
USE 0 (ONCE_REWRITE_RULE[GSYM IN]);
USE 0 (MATCH_MP
INTERS_SUBSET);
ASM_REWRITE_TAC[];
TYPE_THEN `INTERS (V DELETE u) INTER u SUBSET u` SUBGOAL_TAC;
REWRITE_TAC[INTER_SUBSET];
REWRITE_TAC[
SUBSET_INTERS];
DISCH_ALL_TAC;
DISCH_ALL_TAC;
TYPE_THEN `x = u` ASM_CASES_TAC;
ASM_MESON_TAC[];
TYPE_THEN `INTERS (V DELETE u) INTER u SUBSET INTERS (V DELETE u) ` SUBGOAL_TAC;
REWRITE_TAC[INTER_SUBSET];
TYPE_THEN `INTERS (V DELETE u) SUBSET x` SUBGOAL_TAC;
MATCH_MP_TAC
INTERS_SUBSET;
ASM_REWRITE_TAC [IN;DELETE;IN_ELIM_THM'];
ASM_MESON_TAC[SUBSET_TRANS];
]);;
(* }}} *)
(* }}} *)
INSERT;EMPTY];
REWRITE_TAC [IN];
EQ_TAC;
DISCH_ALL_TAC;
TYPE_THEN `!x. ~U x` ASM_CASES_TAC ;
ASM_REWRITE_TAC[];
ASM_REWRITE_TAC[];
MATCH_MP_TAC EQ_EXT;
GEN_TAC;
REWRITE_TAC[IN_ELIM_THM'];
NAME_CONFLICT_TAC;
USE 1 (CONV_RULE (quant_left_CONV "x"));
CHO 1;
USE 0 (CONV_RULE (quant_left_CONV "u"));
USE 0 (CONV_RULE (quant_left_CONV "u"));
EQ_TAC;
DISCH_TAC;
TYPE_THEN `x` (USE 0 o SPEC);
ASM_MESON_TAC[];
DISCH_TAC;
COPY 0;
TYPE_THEN `x` (USE 0 o SPEC);
TYPE_THEN `x'` (USE 3 o SPEC);
PROOF_BY_CONTR_TAC;
TYPE_THEN `x' = {}` SUBGOAL_TAC;
PROOF_BY_CONTR_TAC;
USE 5 (REWRITE_RULE[EMPTY_EXISTS]);
CHO 5;
USE 5 (REWRITE_RULE[IN]);
ASM_MESON_TAC[];
USE 2 (CONV_RULE (quant_right_CONV "x'"));
ASM_MESON_TAC[IN;EMPTY_EXISTS];
DISCH_THEN DISJ_CASES_TAC;
ASM_MESON_TAC[];
ASM_REWRITE_TAC[IN_ELIM_THM'];
ASM_MESON_TAC[];
]);;
(* }}} *)
(* }}} *)
let CARD_SING_CONV = prove_by_refinement(
`!X:A->bool. (X HAS_SIZE 1) ==> (SING X)`,
(* {{{ proof *)
[
REWRITE_TAC[HAS_SIZE ;SING ];
DISCH_ALL_TAC;
TYPE_THEN `CHOICE X` EXISTS_TAC;
TYPE_THEN `~(X = {})` SUBGOAL_TAC;
ASM_MESON_TAC[CARD_CLAUSES;ARITH_RULE`~(0=1)`];
DISCH_ALL_TAC;
TYPE_THEN `SUC (CARD (X DELETE (CHOICE X)))=1` SUBGOAL_TAC ;
ASM_SIMP_TAC[
CARD_DELETE_CHOICE];
REWRITE_TAC[ARITH_RULE`(SUC a = 1) <=> (a=0)`];
ASSUME_TAC HAS_SIZE_0;
USE 3 (REWRITE_RULE [HAS_SIZE ]);
ASSUME_TAC FINITE_DELETE_IMP;
ASM_MESON_TAC[
delete_empty];
]);;
(* }}} *)
let countable_prod = prove_by_refinement(
`!(A:A->bool) (B:B->bool). (COUNTABLE A) /\ (COUNTABLE B) ==>
(COUNTABLE {(a,b) | (A a) /\ (B b) })`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
IMATCH_MP_TAC (INST_TYPE [`:num#num`,`:A`]
COUNTABLE_IMAGE);
USE 0 (REWRITE_RULE [COUNTABLE;GE_C;IN_UNIV]);
USE 1 (REWRITE_RULE [COUNTABLE;GE_C;IN_UNIV]);
CHO 0;
CHO 1;
TYPE_THEN `{(m:num,n:num) | T}` EXISTS_TAC;
REWRITE_TAC[
NUM2_COUNTABLE;SUBSET;IN_IMAGE];
REWRITE_TAC[IN_ELIM_THM];
TYPE_THEN `(\ (u,v) . (f u,f' v))` EXISTS_TAC;
DISCH_ALL_TAC;
CHO 2;
CHO 2;
AND 2;
TYPE_THEN `a` (USE 0 o SPEC);
TYPE_THEN `b` (USE 1 o SPEC);
IN_OUT_TAC;
REWR 2;
REWR 3;
CHO 3;
CHO 2;
TYPE_THEN `(x',x'')` EXISTS_TAC;
(CONV_TAC (TOP_DEPTH_CONV GEN_BETA_CONV));
ASM_MESON_TAC[];
]);;
(* }}} *)
let IMAGE_I = prove_by_refinement(
`!(A:A->bool). IMAGE I A = A`,
(* {{{ proof *)
[
REWRITE_TAC[IMAGE;IN;I_DEF];
GEN_TAC;
MATCH_MP_TAC EQ_EXT THEN GEN_TAC ;
REWRITE_TAC[IN_ELIM_THM'];
ASM_MESON_TAC[];
]);;
(* }}} *)
(* }}} *)
let DIFF_SURJ = prove_by_refinement(
`!(f : A->B) X Y. (BIJ f X Y) ==>
(! t. (t SUBSET X) ==> ((IMAGE f (X DIFF t)) = (Y DIFF (IMAGE f t))))`,
(* {{{ proof *)
[
REWRITE_TAC[BIJ;INJ;SURJ;IN ];
DISCH_ALL_TAC;
DISCH_ALL_TAC;
REWRITE_TAC[IMAGE;IN];
IMATCH_MP_TAC EQ_EXT ;
REWRITE_TAC[IN_ELIM_THM'];
NAME_CONFLICT_TAC;
X_GEN_TAC `y:B`;
REWRITE_TAC[REWRITE_RULE[IN] IN_DIFF];
REWRITE_TAC[IN_ELIM_THM'];
ASM_MESON_TAC[SUBSET;IN ];
]);;
(* }}} *)
let union_subset = prove_by_refinement(
`!Z1 Z2 A. ((Z1 UNION Z2) SUBSET (A:A->bool)) <=>
(Z1 SUBSET A) /\ (Z2 SUBSET A)`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
REWRITE_TAC[UNION;SUBSET;IN;IN_ELIM_THM'];
ASM_MESON_TAC[];
]);;
(* }}} *)
let preimage_disjoint = prove_by_refinement(
`!(f:A->B) A B X. (A INTER B = EMPTY) ==>
(preimage X f A INTER (preimage X f B) = EMPTY )`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
REWRITE_TAC[preimage];
REWRITE_TAC[
EQ_EMPTY];
DISCH_ALL_TAC;
USE 1( REWRITE_RULE[INTER;IN;IN_ELIM_THM']);
USE 0 (REWRITE_RULE[
EQ_EMPTY;INTER;IN;IN_ELIM_THM']);
ASM_MESON_TAC[];
]);;
(* }}} *)
let preimage_union = prove_by_refinement(
`!(f:A->B) A B X Z.
(Z SUBSET ((preimage X f A) UNION (preimage X f B))) <=>
(Z SUBSET X) /\ (IMAGE f Z SUBSET (A UNION B))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
REWRITE_TAC[preimage;IMAGE;UNION;SUBSET;IN;IN_ELIM_THM' ];
MESON_TAC[];
]);;
(* }}} *)
let subset_preimage = prove_by_refinement(
`!(f:A->B) A X Z. (Z SUBSET (preimage X f A)) <=> (Z SUBSET X) /\
(IMAGE f Z SUBSET A)`,
(* {{{ proof *)
[
REWRITE_TAC[SUBSET;preimage;IMAGE;IN;IN_ELIM_THM'];
MESON_TAC[];
]);;
(* }}} *)
let preimage_unions = prove_by_refinement(
`!dom (f:A->B) C. preimage dom f (UNIONS C) =
(UNIONS (IMAGE (preimage dom f) C))`,
(* {{{ proof *)
[
REWRITE_TAC[preimage;IN_UNIONS ];
REWRITE_TAC[UNIONS;IN_IMAGE ];
REWRITE_TAC[preimage;IN];
DISCH_ALL_TAC;
IMATCH_MP_TAC EQ_EXT ;
DISCH_ALL_TAC;
REWRITE_TAC[IN_ELIM_THM'];
REWRITE_TAC[
Q_ELIM_THM;IN_ELIM_THM' ];
MESON_TAC[];
]);;
(* }}} *)
(* }}} *)
(* to fix two varying descriptions of ((INTER) Y): *)
let INTER_THM = prove_by_refinement(
`!(X:A->bool). ((\B. B INTER X) = ((INTER) X)) /\
((\B. X INTER B) = ((INTER) X))`,
(* {{{ proof *)
[
REWRITE_TAC[INTER_COMM];
GEN_TAC;
MATCH_MP_TAC EQ_EXT THEN BETA_TAC;
REWRITE_TAC[INTER_COMM];
]);;
(* }}} *)
(* ------------------------------------------------------------------ *)
(* Real Preliminaries *)
(* ------------------------------------------------------------------ *)
let REAL_SUM_SQUARE_POS = prove_by_refinement(
`!m n x . &.0 <=. sum(m,n) (\i. (x i)*.(x i))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
MATCH_MP_TAC SUM_POS_GEN;
DISCH_ALL_TAC;
BETA_TAC;
REWRITE_TAC[REAL_LE_SQUARE];
]);;
(* }}} *)
(* twopow , DUPLICATE OF TWOPOW_MK_POS *)
(* }}} *)
let twopow_double = prove_by_refinement(
`!n. &.2 * (twopow (--: (&: (n+1)))) = twopow (--: (&:n))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
REWRITE_TAC[
TWOPOW_NEG;REAL_POW_ADD;POW_1;REAL_INV_MUL ];
REWRITE_TAC [REAL_ARITH `a*b*cc = (a*cc)*b`];
REWRITE_TAC [
REAL_RINV_2 ];
REAL_ARITH_TAC ;
]);;
(* }}} *)
let min_finite = prove_by_refinement(
`!X. (FINITE X) /\ (~(X = EMPTY )) ==>
(?delta. (X delta) /\ (!x. (X x) ==> (delta <=. x)))`,
(* {{{ proof *)
[
TYPE_THEN `(!X k. FINITE X /\ (~(X = EMPTY )) /\ (X HAS_SIZE k) ==> (?delta. X delta /\ (!x. X x ==> delta <= x))) ==>(!X. FINITE X /\ (~(X = EMPTY )) ==> (?delta. X delta /\ (!x. X x ==> delta <= x)))` SUBGOAL_TAC ;
DISCH_TAC;
DISCH_ALL_TAC;
TYPE_THEN `X` (USE 0 o SPEC);
TYPE_THEN `CARD X` (USE 0 o SPEC);
UND 0;
DISCH_THEN IMATCH_MP_TAC ;
ASM_REWRITE_TAC[HAS_SIZE ];
DISCH_THEN IMATCH_MP_TAC ;
CONV_TAC (quant_left_CONV "k");
INDUCT_TAC;
REWRITE_TAC[HAS_SIZE_0];
DISCH_ALL_TAC;
ASM_REWRITE_TAC[EMPTY];
ASM_MESON_TAC[];
DISCH_ALL_TAC;
USE 3(REWRITE_RULE[HAS_SIZE]);
TYPE_THEN `X DELETE (CHOICE X)` (USE 0 o SPEC);
ASM_CASES_TAC `k=0`;
REWR 3;
USE 3 (REWRITE_RULE [ARITH_RULE `SUC 0=1`]);
TYPE_THEN `SING X` SUBGOAL_TAC ;
IMATCH_MP_TAC
CARD_SING_CONV;
ASM_MESON_TAC [HAS_SIZE];
REWRITE_TAC[SING];
DISCH_TAC ;
CHO 5;
TYPE_THEN `x` EXISTS_TAC ;
ASM_REWRITE_TAC[REWRITE_RULE[IN] IN_SING ];
REAL_ARITH_TAC;
TYPE_THEN `FINITE (X DELETE CHOICE X) /\ ~(X DELETE CHOICE X = {}) /\ (X DELETE CHOICE X HAS_SIZE k ) ` SUBGOAL_TAC;
REWRITE_TAC[FINITE_DELETE;HAS_SIZE ];
ASM_REWRITE_TAC[];
REWR 3;
IMATCH_MP_TAC (TAUT `(a /\ b) ==> (b /\ a)`);
SUBCONJ_TAC;
IMATCH_MP_TAC (ARITH_RULE `(SUC x = SUC y) ==> (x = y)`);
COPY 3;
UND 3;
DISCH_THEN (fun t-> REWRITE_TAC[GSYM t]);
IMATCH_MP_TAC
CARD_DELETE_CHOICE;
ASM_REWRITE_TAC[];
IMATCH_MP_TAC (TAUT `(b ==> ~a ) ==> (a ==> ~b)`);
DISCH_THEN (fun t-> ASM_REWRITE_TAC[t;CARD_CLAUSES]);
DISCH_TAC;
REWR 0;
CHO 0;
ALL_TAC; (* "ccx" *)
TYPE_THEN `if (delta < (CHOICE X)) then delta else (CHOICE X)` EXISTS_TAC;
(* REWRITE_TAC[min_real]; *)
COND_CASES_TAC ;
CONJ_TAC;
UND 0;
REWRITE_TAC[DELETE;IN ;IN_ELIM_THM' ];
MESON_TAC[];
GEN_TAC;
UND 0;
REWRITE_TAC[DELETE;IN ;IN_ELIM_THM' ];
DISCH_ALL_TAC;
TYPE_THEN `x = CHOICE X` ASM_CASES_TAC ;
ASM_REWRITE_TAC[];
UND 6;
REAL_ARITH_TAC;
ASM_MESON_TAC[];
SUBCONJ_TAC;
IMATCH_MP_TAC (REWRITE_RULE[IN ] CHOICE_DEF);
ASM_REWRITE_TAC[];
DISCH_TAC;
DISCH_ALL_TAC;
TYPE_THEN `x = CHOICE X` ASM_CASES_TAC ;
ASM_REWRITE_TAC[];
REAL_ARITH_TAC;
UND 0;
REWRITE_TAC[DELETE;IN ;IN_ELIM_THM' ];
DISCH_ALL_TAC;
TYPE_THEN `x` (USE 11 o SPEC);
REWR 11;
UND 11;
UND 6;
REAL_ARITH_TAC;
]);;
(* }}} *)
let min_finite_delta = prove_by_refinement(
`!c X. (FINITE X) /\ ( !x. (X x) ==> (c <. x) ) ==>
(?delta. (c <. delta) /\ (!x. (X x) ==> (delta <=. x)))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
TYPE_THEN `~(X = EMPTY)` ASM_CASES_TAC;
JOIN 0 2;
USE 0 (MATCH_MP
min_finite);
CHO 0;
TYPE_THEN `delta` EXISTS_TAC;
ASM_REWRITE_TAC[];
ASM_MESON_TAC[];
REWR 2;
ASM_REWRITE_TAC[EMPTY];
TYPE_THEN `c +. (&.1)` EXISTS_TAC;
REAL_ARITH_TAC;
]);;
(* }}} *)
let union_closed_interval = prove_by_refinement(
`!a b c. (a <=. b) /\ (b <=. c) ==>
({x | a <= x /\ x < b} UNION {x | b <= x /\ x <= c} =
{ x | a <= x /\ x <= c})`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
REWRITE_TAC[UNION;IN;IN_ELIM_THM'];
IMATCH_MP_TAC EQ_EXT ;
REWRITE_TAC[IN_ELIM_THM'];
UND 0;
UND 1;
REAL_ARITH_TAC;
]);;
(* }}} *)
let real_half_LT = prove_by_refinement(
`!x y z. ((x < z/(&.2)) /\ (y < z/(&.2)) ==> (x + y < z))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
(GEN_REWRITE_TAC RAND_CONV) [GSYM REAL_HALF_DOUBLE];
UND 0;
UND 1;
REAL_ARITH_TAC;
]);;
(* }}} *)
let real_half_LE = prove_by_refinement(
`!x y z. ((x < z/(&.2)) /\ (y <= z/(&.2)) ==> (x + y < z))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
(GEN_REWRITE_TAC RAND_CONV) [GSYM REAL_HALF_DOUBLE];
UND 0;
UND 1;
REAL_ARITH_TAC;
]);;
(* }}} *)
let real_half_EL = prove_by_refinement(
`!x y z. ((x <= z/(&.2)) /\ (y < z/(&.2)) ==> (x + y < z))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
(GEN_REWRITE_TAC RAND_CONV) [GSYM REAL_HALF_DOUBLE];
UND 0;
UND 1;
REAL_ARITH_TAC;
]);;
(* }}} *)
let real_half_LLE = prove_by_refinement(
`!x y z. ((x <= z/(&.2)) /\ (y <= z/(&.2)) ==> (x + y <= z))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
(GEN_REWRITE_TAC RAND_CONV) [GSYM REAL_HALF_DOUBLE];
UND 0;
UND 1;
REAL_ARITH_TAC;
]);;
(* }}} *)
let interval_finite = prove_by_refinement(
`!N. FINITE {x | ?j. (abs x = &.j) /\ (j <=| N)}`,
(* {{{ proof *)
[
GEN_TAC;
ABBREV_TAC `inter = {n | n <=| N}`;
SUBGOAL_TAC `FINITE {y | ?x. (x IN inter /\ (y = (&. x)))}`;
MATCH_MP_TAC FINITE_IMAGE_EXPAND;
EXPAND_TAC "inter";
REWRITE_TAC[FINITE_NUMSEG_LE];
SUBGOAL_TAC `FINITE {y | ?x. (x IN inter /\ (y = --.(&. x)))}`;
MATCH_MP_TAC FINITE_IMAGE_EXPAND;
EXPAND_TAC "inter";
REWRITE_TAC[FINITE_NUMSEG_LE];
DISCH_ALL_TAC;
JOIN 1 2;
USE 1 (REWRITE_RULE[GSYM FINITE_UNION]);
UND 1;
SUBGOAL_TAC `!a b. ((a:real->bool) = b) ==> (FINITE a ==> FINITE b)`;
REP_GEN_TAC;
DISCH_THEN (fun t-> REWRITE_TAC[t]);
DISCH_THEN (fun t-> MATCH_MP_TAC t);
MATCH_MP_TAC EQ_EXT;
X_GEN_TAC `c:real`;
REWRITE_TAC[IN_ELIM_THM';UNION];
EXPAND_TAC "inter";
REWRITE_TAC[IN_ELIM_THM'];
REWRITE_TAC[real_abs];
EQ_TAC;
MATCH_MP_TAC (TAUT `(a==>b) /\ (c==>b) ==> (a \/ c ==> b)`);
CONJ_TAC;
DISCH_THEN CHOOSE_TAC;
AND 1;
ASM_REWRITE_TAC[];
EXISTS_TAC `x:num`;
ASM_REWRITE_TAC [REAL_LE;LE_0];
DISCH_THEN CHOOSE_TAC;
AND 1;
EXISTS_TAC `x:num`;
ASM_REWRITE_TAC[REAL_NEG_NEG];
COND_CASES_TAC;
UND 3;
REDUCE_TAC;
ARITH_TAC;
REDUCE_TAC;
DISCH_THEN CHOOSE_TAC;
AND 1;
UND 2;
COND_CASES_TAC;
ASM_MESON_TAC[];
DISCH_TAC;
DISJ2_TAC;
EXISTS_TAC `j:num`;
ASM_REWRITE_TAC[];
UND 3;
REAL_ARITH_TAC;
]);;
(* }}} *)
(* ------------------------------------------------------------------ *)
(* Euclidean Space *)
(* ------------------------------------------------------------------ *)
let euclid_add_closure = prove_by_refinement(
`!f g n. (euclid n f) /\ (euclid n g) ==> (euclid n (f + g))`,
(* {{{ *)
[
REWRITE_TAC[euclid;euclid_plus];
ASM_MESON_TAC[REAL_ARITH `&0 +. (&.0) = (&.0)`];
]);;
(* }}} *)
(* }}} *)
let euclid_neg_closure = prove_by_refinement(
`!f n. (euclid n f) ==> (euclid n (-- f))`,
(* {{{ *)
[
REWRITE_TAC[euclid;euclid_neg];
DISCH_ALL_TAC;
ASM_REWRITE_TAC[REAL_ARITH `(--x = &.0) <=> (x = &.0)`];
]);;
(* }}} *)
let euclid_sub_closure = prove_by_refinement(
`!f g n. (euclid n f ) /\ (euclid n g) ==> (euclid n (f - g))`,
(* {{{ *)
[
REWRITE_TAC[euclid;euclid_minus];
ASM_MESON_TAC[REAL_ARITH `&.0 -. (&.0) = (&.0)`];
]);;
(* }}} *)
let neg_dim = prove_by_refinement(
`!f n. (euclid n f) = (euclid n (--f))`,
(* {{{ *)
[
REPEAT GEN_TAC;
EQ_TAC;
REWRITE_TAC[
euclid_neg_closure];
REWRITE_TAC[euclid;euclid_neg];
DISCH_ALL_TAC;
ONCE_REWRITE_TAC[REAL_ARITH `(x = &.0) <=> (--x = &.0)`];
ASM_REWRITE_TAC[];
]);;
(* }}} *)
(* }}} *)
let euclidean_add_closure = prove_by_refinement(
`!f g. (euclidean f) /\ (euclidean g) ==> (euclidean (f+g))`,
(* {{{ *)
[
REWRITE_TAC[euclidean];
DISCH_ALL_TAC;
UNDISCH_FIND_THEN `euclid` CHOOSE_TAC;
UNDISCH_FIND_THEN `(?)` CHOOSE_TAC;
EXISTS_TAC `n+|n'`;
ASSUME_TAC (ARITH_RULE `n <=| n+n'`);
ASSUME_TAC (ARITH_RULE `n' <=| n+n'`);
ASM_MESON_TAC[
euclid_add_closure;
euclid_updim];
]);;
(* }}} *)
let euclidean_sub_closure = prove_by_refinement(
`!f g. (euclidean f) /\ (euclidean g) ==> (euclidean (f-g))`,
(* {{{ *)
[
REWRITE_TAC[euclidean];
DISCH_ALL_TAC;
UNDISCH_FIND_THEN `euclid` CHOOSE_TAC;
UNDISCH_FIND_THEN `(?)` CHOOSE_TAC;
EXISTS_TAC `n+|n'`;
ASSUME_TAC (ARITH_RULE `n <=| n+n'`);
ASSUME_TAC (ARITH_RULE `n' <=| n+n'`);
ASM_MESON_TAC[
euclid_sub_closure;
euclid_updim];
]);;
(* }}} *)
(* }}} *)
(* }}} *)
(* }}} *)
(* }}} *)
let euclid_lzero = prove_by_refinement(
`!f. euclid0 + f = f`,
(* {{{ *)
[
REWRITE_TAC[euclid_plus;euclid0;REAL_ARITH `&.0+a=a`];
ACCEPT_TAC (INST_TYPE [(`:num`,`:A`);(`:real`,`:B`)] ETA_AX);
]);;
(* }}} *)
let euclid_rzero = prove_by_refinement(
`!f. f + euclid0 = f`,
(* {{{ *)
[
REWRITE_TAC[euclid_plus;euclid0;REAL_ARITH `a+(&.0)=a`];
ACCEPT_TAC (INST_TYPE [(`:num`,`:A`);(`:real`,`:B`)] ETA_AX);
]);;
(* }}} *)
(* }}} *)
(* }}} *)
(* }}} *)
(* }}} *)
let euclid_neg_sum = prove_by_refinement(
`!x y . euclid_minus (--x) (--y) = -- (euclid_minus x y)`,
(* {{{ proof *)
[
REWRITE_TAC[euclid_neg;euclid_minus];
DISCH_ALL_TAC;
IMATCH_MP_TAC EQ_EXT;
BETA_TAC;
REAL_ARITH_TAC;
]);;
(* }}} *)
let trivial_lin_combo = prove_by_refinement(
`!x t. ((t *# x) + (&.1 - t) *# x = x)`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
REWRITE_TAC[euclid_plus;euclid_scale;];
IMATCH_MP_TAC EQ_EXT THEN BETA_TAC;
REAL_ARITH_TAC ;
]);;
(* }}} *)
(* DOT PRODUCT *)
let dot_euclid = prove_by_refinement(
`!p f g. (euclid p f) /\ (euclid p g) ==>
(dot f g = sum (0,p) (\i. (f i)* (g i)))`,
(* {{{ *)
[
REWRITE_TAC[dot];
LET_TAC;
REPEAT GEN_TAC;
ABBREV_TAC `(P:num->bool) = \m. (euclid m f) /\ (euclid m g)`;
DISCH_ALL_TAC;
SUBGOAL_TAC `(P:num->bool) (p:num)`;
EXPAND_TAC "P";
ASM_REWRITE_TAC[];
DISCH_TAC;
SUBGOAL_TAC `min_num P <=| p`;
ASM_MESON_TAC[min_least];
DISCH_TAC;
SUBGOAL_TAC
`euclid (min_num (P:num->bool)) f /\ (euclid (min_num (P:num->bool)) g)`;
ASM_MESON_TAC[min_least];
DISCH_ALL_TAC;
ABBREV_TAC `q = min_num P`;
MP_TAC (SPECL [`q:num`;`p:num`] LE_EXISTS);
ASM_REWRITE_TAC[];
DISCH_THEN CHOOSE_TAC;
ASM_REWRITE_TAC[GSYM SUM_TWO];
MATCH_MP_TAC (REAL_ARITH `(u = (&.0)) ==> (x = x + u)`);
SUBGOAL_THEN `!n. n>=| q ==> ((\i. f i *. g i) n = (&.0))` (fun th -> MATCH_MP_TAC (MATCH_MP SUM_ZERO th));
GEN_TAC THEN BETA_TAC;
DISCH_TAC;
SUBGOAL_THEN `(f:num->real) n = (&.0)` (fun th -> REWRITE_TAC[th;REAL_ARITH `(&.0)*.a =(&.0)`]);
UNDISCH_TAC `euclid q f`;
UNDISCH_TAC `n >=| q`;
MESON_TAC[euclid;ARITH_RULE `(a<=|b) <=> (b >=| a)`];
ACCEPT_TAC (ARITH_RULE `q >=| q`);
]);;
(* }}} *)
let dot_updim = prove_by_refinement (
`!f g m n. (m <=|n) /\ (euclid m f) /\ (euclid m g) ==>
(dot f g = sum (0,n) (\i. (f i)* (g i)))`,
(* {{{ *)
[
REPEAT GEN_TAC;
DISCH_ALL_TAC;
SUBGOAL_TAC `(euclid n f) /\ (euclid n g)`;
ASM_MESON_TAC[
euclid_updim];
MATCH_ACCEPT_TAC
dot_euclid]
);;
(* }}} *)
let dot_nonneg = prove_by_refinement(
`!f. (&.0 <= (dot f f))`,
(* {{{ *)
[
REWRITE_TAC[dot];
LET_TAC;
GEN_TAC;
SUBGOAL_TAC `(!n. (&.0 <=. (\(i:num). f i *. f i) n))`;
BETA_TAC;
REWRITE_TAC[REAL_LE_SQUARE];
ASSUME_TAC(SPEC `\i. (f:num->real) i *. f i` SUM_POS);
ASM_MESON_TAC[]]);;
(* }}} *)
let dot_comm = prove_by_refinement(
`!f g. (dot f g = dot g f)`,
(* {{{ *)
[
REWRITE_TAC[dot];
REWRITE_TAC[REAL_ARITH `a*.b = b*.a`;TAUT `a/\b <=> b/\a`]
]);;
(* }}} *)
let dot_neg = prove_by_refinement(
`!f g. (dot (--f) g) = --. (dot f g)`,
(* {{{ *)
[
REWRITE_TAC[dot];
LET_TAC;
REWRITE_TAC [GSYM
neg_dim];
ONCE_REWRITE_TAC[GSYM SUM_NEG];
REWRITE_TAC[euclid_neg];
REPEAT GEN_TAC;
AP_TERM_TAC;
MATCH_MP_TAC EQ_EXT;
BETA_TAC;
GEN_TAC;
REWRITE_TAC[REAL_ARITH `(--x) * y = --. (x *y)`];
]);;
(* }}} *)
(* }}} *)
let dot_scale = prove_by_refinement(
`!n f g s. (euclid n f) /\ (euclid n g) ==>
(dot (s *# f) g = s *. (dot f g))`,
(* {{{ *)
[
REWRITE_TAC[euclid_scale];
REPEAT GEN_TAC;
DISCH_THEN (fun th -> ASSUME_TAC th THEN ASSUME_TAC (MATCH_MP
dot_euclid th));
SUBGOAL_THEN (`euclid n (\ (i:num). (s *. f i) ) /\ (euclid n g)`) ASSUME_TAC;
ASM_REWRITE_TAC[];
ASSUME_TAC(REWRITE_RULE[euclid_scale](SPECL [`n:num`;`s:real`;`f:num->real`]
euclid_scale_closure));
ASM_MESON_TAC[];
IMP_RES_THEN ASSUME_TAC
dot_euclid;
ASM_REWRITE_TAC[];
REWRITE_TAC[GSYM SUM_CMUL];
AP_TERM_TAC;
MATCH_MP_TAC EQ_EXT;
GEN_TAC;
BETA_TAC;
REWRITE_TAC[REAL_ARITH `a*.(b*.c) = (a*b)*c`];
]);;
(* }}} *)
let dot_scale_euclidean = prove_by_refinement(
`!f g s. (euclidean f) /\ (euclidean g) ==>
(dot (s *# f) g = s *. (dot f g))`,
(* {{{ *)
[
REWRITE_TAC[euclidean];
DISCH_ALL_TAC;
REPEAT (UNDISCH_FIND_THEN `euclid` (CHOOSE_THEN MP_TAC));
DISCH_ALL_TAC;
ASSUME_TAC (ARITH_RULE `(n' <=| n+n')`);
ASSUME_TAC (ARITH_RULE `(n <=| n+n')`);
SUBGOAL_TAC `euclid (n+|n') f /\ euclid (n+n') g`;
ASM_MESON_TAC[
euclid_updim];
MESON_TAC[
dot_scale];
]);;
(* }}} *)
(* }}} *)
(* }}} *)
let dot_linear = prove_by_refinement(
`!n f g h. (euclid n f) /\ (euclid n g) /\ (euclid n h) ==>
((dot (f + g) h ) = (dot f h) +. (dot g h))`,
(* {{{ *)
[
DISCH_ALL_TAC;
SUBGOAL_TAC `euclid n (f+g)`;
ASM_MESON_TAC[
euclid_add_closure];
DISCH_TAC;
MP_TAC (SPECL [`n:num`;`f:num->real`;`h:num->real`]
dot_euclid);
MP_TAC (SPECL [`n:num`;`g:num->real`;`h:num->real`]
dot_euclid);
MP_TAC (SPECL [`n:num`;`(f+g):num->real`;`h:num->real`]
dot_euclid); ASM_REWRITE_TAC[];
DISCH_ALL_TAC;
ASM_REWRITE_TAC[];
REWRITE_TAC[GSYM SUM_ADD];
AP_TERM_TAC;
MATCH_MP_TAC EQ_EXT THEN GEN_TAC THEN BETA_TAC;
REWRITE_TAC[euclid_plus];
REWRITE_TAC[REAL_ARITH `(a+.b)*.c = a*c + b*c`];
]);;
(* }}} *)
let dot_minus_linear = prove_by_refinement(
`!n f g h. (euclid n f) /\ (euclid n g) /\ (euclid n h) ==>
((dot (f - g) h ) = (dot f h) -. (dot g h))`,
(* {{{ *)
[
DISCH_ALL_TAC;
SUBGOAL_TAC `euclid n (f-g)`;
ASM_MESON_TAC[
euclid_sub_closure];
DISCH_TAC;
MP_TAC (SPECL [`n:num`;`f:num->real`;`h:num->real`]
dot_euclid);
MP_TAC (SPECL [`n:num`;`g:num->real`;`h:num->real`]
dot_euclid);
MP_TAC (SPECL [`n:num`;`(f-g):num->real`;`h:num->real`]
dot_euclid);
ASM_REWRITE_TAC[];
DISCH_ALL_TAC;
ASM_REWRITE_TAC[];
REWRITE_TAC[GSYM SUM_SUB];
AP_TERM_TAC;
MATCH_MP_TAC EQ_EXT THEN GEN_TAC THEN BETA_TAC;
REWRITE_TAC[euclid_minus];
REWRITE_TAC[REAL_ARITH `(a-.b)*.c = a*c - b*c`];
]);;
(* }}} *)
let dot_linear_euclidean = prove_by_refinement(
`!f g h. (euclidean f) /\ (euclidean g) /\ (euclidean h) ==>
((dot (f + g) h ) = (dot f h) +. (dot g h))`,
(* {{{ *)
[
REWRITE_TAC[euclidean];
DISCH_ALL_TAC;
REPEAT (UNDISCH_FIND_THEN `euclid` (CHOOSE_THEN MP_TAC));
DISCH_ALL_TAC;
SUBGOAL_TAC `(euclid (n+n'+n'') f)`;
ASM_MESON_TAC[ARITH_RULE `n <=| n+n'+n''`;
euclid_updim];
SUBGOAL_TAC `(euclid (n+n'+n'') g)`;
ASM_MESON_TAC[ARITH_RULE `n' <=| n+n'+n''`;
euclid_updim];
SUBGOAL_TAC `(euclid (n+n'+n'') h)`;
ASM_MESON_TAC[ARITH_RULE `n'' <=| n+n'+n''`;
euclid_updim];
MESON_TAC[
dot_linear]]);;
(* }}} *)
let dot_minus_linear_euclidean = prove_by_refinement(
`!f g h. (euclidean f) /\ (euclidean g) /\ (euclidean h) ==>
((dot (f - g) h ) = (dot f h) -. (dot g h))`,
(* {{{ *)
[
REWRITE_TAC[euclidean];
DISCH_ALL_TAC;
REPEAT (UNDISCH_FIND_THEN `euclid` (CHOOSE_THEN MP_TAC));
DISCH_ALL_TAC;
SUBGOAL_TAC `(euclid (n+n'+n'') f)`;
ASM_MESON_TAC[ARITH_RULE `n <=| n+n'+n''`;
euclid_updim];
SUBGOAL_TAC `(euclid (n+n'+n'') g)`;
ASM_MESON_TAC[ARITH_RULE `n' <=| n+n'+n''`;
euclid_updim];
SUBGOAL_TAC `(euclid (n+n'+n'') h)`;
ASM_MESON_TAC[ARITH_RULE `n'' <=| n+n'+n''`;
euclid_updim];
MESON_TAC[
dot_minus_linear];
]);;
(* }}} *)
(* }}} *)
(* }}} *)
(* }}} *)
(* }}} *)
let dot_rzero = prove_by_refinement(
`!f. (dot f euclid0) = &.0`,
(* {{{ *)
[
REWRITE_TAC[dot;euclid0];
LET_TAC;
GEN_TAC;
SUBGOAL_THEN `(\ (i:num). (f i *. (&.0))) = (\ (r:num). (&.0))` (fun t -> REWRITE_TAC[t]);
REWRITE_TAC[REAL_ARITH `a*.(&.0) = (&.0)`];
MESON_TAC[SUM_0];
]);;
(* }}} *)
(* }}} *)
let dot_zero = prove_by_refinement(
`!f n. (euclid n f) /\ (dot f f = (&.0)) ==> (f = euclid0)`,
(* {{{ *)
[
DISCH_ALL_TAC;
UNDISCH_TAC `dot f f = (&.0)`;
MP_TAC (SPECL [`n:num`;`f:num->real`;`f:num->real`]
dot_euclid);
ASM_REWRITE_TAC[];
DISCH_THEN (fun th -> REWRITE_TAC[th]);
REWRITE_TAC[euclid0];
DISCH_TAC;
MATCH_MP_TAC EQ_EXT;
GEN_TAC THEN BETA_TAC;
DISJ_CASES_TAC (ARITH_RULE `x <| n \/ (n <=| x)`);
CLEAN_ASSUME_TAC (ARITH_RULE `(x <|n) ==> (SUC x <=| n)`);
CLEAN_THEN (SPECL [`SUC x`;`n:num`] LE_EXISTS) CHOOSE_TAC;
UNDISCH_TAC `sum(0,n) (\ (i:num). f i *. f i) = (&.0)`;
ASM_REWRITE_TAC[];
REWRITE_TAC[GSYM SUM_TWO;sum;ARITH_RULE `0+| x = x`];
SUBGOAL_TAC `!a b. (&.0 <=. sum(a,b) (\ (i:num). f i *. f i))`;
REPEAT GEN_TAC;
MP_TAC (SPEC `\ (i:num). f i *. f i` SUM_POS);
BETA_TAC;
REWRITE_TAC[REAL_LE_SQUARE];
MESON_TAC[];
DISCH_ALL_TAC;
IMP_RES_THEN MP_TAC (REAL_ARITH `(a+.b = &.0) ==> ((&.0 <=. b) ==> (a <=. (&.0)))`);
ASM_REWRITE_TAC[];
DISCH_TAC;
IMP_RES_THEN MP_TAC (REAL_ARITH `(a+b <=. &.0) ==> ((&.0 <=. a) ==> (b <=. (&.0)))`);
ASM_REWRITE_TAC[];
ABBREV_TAC `a = (f:num->real) x`;
MESON_TAC[REAL_LE_SQUARE;REAL_ARITH `a <=. (&.0) /\ (&.0 <=. a) ==> (a = (&.0))`;REAL_ENTIRE];
UNDISCH_TAC `euclid n f`;
REWRITE_TAC[euclid];
ASM_MESON_TAC[];
]);;
(* }}} *)
(* }}} *)
(* norm *)
(* }}} *)
(* }}} *)
let cauchy_schwartz = prove_by_refinement(
`!f g. (euclidean f) /\ (euclidean g) ==>
((abs(dot f g)) <=. (norm f)*. (norm g))`,
(* {{{ *)
[
DISCH_ALL_TAC;
DISJ_CASES_TAC (TAUT `(f = euclid0 ) \/ ~(f = euclid0)`);
ASM_REWRITE_TAC[
dot_lzero;norm;SQRT_0;REAL_ARITH`&.0 *. x = (&.0)`];
REWRITE_TAC[ABS_0;REAL_ARITH `x <=. x`];
SUBGOAL_THEN `!a b. (dot (a *# f + b *# g) (a *# f + b *# g)) = a*a*(dot f f) + (&.2)*a*b*(dot f g) + b*b*(dot g g)` ASSUME_TAC;
REPEAT GEN_TAC;
ASM_SIMP_TAC[
euclidean_scale_closure;
euclidean_add_closure;
dot_linear_euclidean;
dot_linear2_euclidean;
dot_scale_euclidean;
dot_scale2_euclidean];
REWRITE_TAC[REAL_MUL_AC;REAL_ADD_AC;REAL_ADD_LDISTRIB];
MATCH_MP_TAC (REAL_ARITH`(b+. c=e) ==> (a+b+c+d = a+ e+d)`);
REWRITE_TAC[GSYM REAL_LDISTRIB];
REPEAT AP_TERM_TAC;
MATCH_MP_TAC (REAL_ARITH `(a=b)==> (a+.b = a*(&.2))`);
REWRITE_TAC[
dot_comm];
FIRST_ASSUM (fun th -> ASSUME_TAC (SPECL[` --. (dot f g)`;`dot f f`] th));
CLEAN_THEN (SPEC `(--.(dot f g)) *# f + (dot f f)*# g`
dot_nonneg) ASSUME_TAC;
REWRITE_TAC[norm];
ASSUME_TAC(SPEC `f:num->real`
dot_nonneg);
ASSUME_TAC(SPEC `g:num->real`
dot_nonneg);
ASM_SIMP_TAC[GSYM SQRT_MUL];
REWRITE_TAC[GSYM POW_2_SQRT_ABS;POW_2];
MATCH_MP_TAC SQRT_MONO_LE;
REWRITE_TAC[REAL_LE_SQUARE];
SUBGOAL_TAC `&.0 <. dot f f`;
MATCH_MP_TAC (REAL_ARITH `~(x = &.0) /\ (&.0 <=. x) ==> (&.0 <. x)`);
ASM_REWRITE_TAC[];
ASM_MESON_TAC[
dot_zero_euclidean];
REPEAT (UNDISCH_FIND_TAC `(<=.)` );
ABBREV_TAC `a = dot f f`;
ABBREV_TAC `b = dot f g`;
ABBREV_TAC `c = dot g g`;
POP_ASSUM_LIST (fun t -> ALL_TAC);
REWRITE_TAC[REAL_ARITH `(&.2 *. x = x + x)`;REAL_ADD_AC];
REWRITE_TAC[REAL_ARITH `(a *. ((--. b)*.c) = --. (a *. (b*.c)))/\ (--. ((--. a) *. b) = a *.b )`];
REWRITE_TAC[REAL_ARITH `(--. b) *. a*. b + b*.b*.a = (&.0)`];
REWRITE_TAC[REAL_ARITH `x +. (&.0) = x`];
REWRITE_TAC[REAL_ARITH `(&.0 <=. (a*.a*.c +. (--.b)*.a*.b)) <=> (a*b*b <=. a*a*c)`];
DISCH_ALL_TAC;
MATCH_MP_TAC (SPEC `a:real` REAL_LE_LCANCEL_IMP);
ASM_REWRITE_TAC[];
]);;
(* }}} *)
(* }}} *)
(* }}} *)
(* ------------------------------------------------------------------ *)
(* Metric Space *)
(* ------------------------------------------------------------------ *)
(* }}} *)
(* }}} *)
(* }}} *)
let metric_subspace = prove_by_refinement(
`!X Y d. (Y SUBSET (X:A->bool)) /\ (metric_space (X,d)) ==>
(metric_space (Y,d))`,
(* {{{ *)
[
REWRITE_TAC[SUBSET;metric_space;IN];
DISCH_ALL_TAC;
DISCH_ALL_TAC;
UNDISCH_FIND_THEN `( /\ )` (fun t -> MP_TAC (SPECL[`x:A`;`y:A`;`z:A`] t));
ASM_SIMP_TAC[];
]);;
(* }}} *)
let metric_euclidean = prove_by_refinement(
`metric_space (euclidean,d_euclid)`,
(* {{{ *)
[
REWRITE_TAC[metric_space;d_euclid];
DISCH_ALL_TAC;
CONJ_TAC;
REWRITE_TAC[
norm_nonneg];
CONJ_TAC;
EQ_TAC;
REWRITE_TAC[norm];
ONCE_REWRITE_TAC[REAL_ARITH `(&.0 = x) <=> (x = (&.0))`];
ASM_SIMP_TAC[
dot_nonneg;SQRT_EQ_0];
DISCH_TAC;
SUBGOAL_TAC `x - y = euclid0`;
ASM_MESON_TAC[
dot_zero_euclidean;
euclidean_sub_closure];
REWRITE_TAC[euclid_minus;euclid0];
DISCH_TAC THEN (MATCH_MP_TAC EQ_EXT);
X_GEN_TAC `n:num`;
FIRST_ASSUM (fun t -> ASSUME_TAC (BETA_RULE (AP_THM t `n:num`)));
ASM_MESON_TAC [REAL_ARITH `(a = b) <=> (a-.b = (&.0))`];
DISCH_THEN (fun t->REWRITE_TAC[t]);
SUBGOAL_THEN `(y:num->real) - y = euclid0` (fun t-> REWRITE_TAC[t]);
REWRITE_TAC[euclid0;euclid_minus];
MATCH_MP_TAC EQ_EXT;
GEN_TAC THEN BETA_TAC;
REAL_ARITH_TAC;
REWRITE_TAC[norm;
dot_lzero;SQRT_0];
CONJ_TAC;
SUBGOAL_THEN `x - y = (euclid_neg (y-x))` ASSUME_TAC;
REWRITE_TAC[euclid_neg;euclid_minus];
MATCH_MP_TAC EQ_EXT THEN GEN_TAC THEN BETA_TAC;
REAL_ARITH_TAC;
ASM_MESON_TAC[
norm_neg];
SUBGOAL_THEN `(x-z) = euclid_plus(x - y) (y-z)` (fun t -> REWRITE_TAC[t]);
REWRITE_TAC[euclid_plus;euclid_minus];
MATCH_MP_TAC EQ_EXT THEN GEN_TAC THEN BETA_TAC THEN REAL_ARITH_TAC;
ASM_SIMP_TAC[
norm_triangle;
euclidean_sub_closure;
euclidean_sub_closure];
]);;
(* }}} *)
(* }}} *)
let euclid1_abs = prove_by_refinement(
`!x y. (euclid 1 x) /\ (euclid 1 y) ==>
((d_euclid x y) = (abs ((x 0) -. (y 0))))`,
(* {{{ proof *)
[
REWRITE_TAC[d_euclid;norm];
DISCH_ALL_TAC;
SUBGOAL_TAC `euclid 1 (x - y)`;
ASM_MESON_TAC[
euclid_sub_closure];
DISCH_TAC;
ASSUME_TAC (prove(`1 <= 1`,ARITH_TAC));
MP_TAC (SPECL[`(x-y):num->real`;`(x-y):num->real`;`1`;`1`]
dot_updim);
ASM_REWRITE_TAC[];
DISCH_THEN (fun t-> REWRITE_TAC[t]);
REWRITE_TAC[prove(`1 = SUC 0`,ARITH_TAC)];
REWRITE_TAC[sum];
REWRITE_TAC[REAL_ARITH `&.0 + x = x`];
REWRITE_TAC[ARITH_RULE `0 +| 0 = 0`];
REWRITE_TAC[euclid_minus];
ASM_MESON_TAC[REAL_POW_2;POW_2_SQRT_ABS];
]);;
(* }}} *)
(* }}} *)
(* }}} *)
let euclid1_dirac = prove_by_refinement(
`!x. euclid 1 x <=> (x = (x 0) *# (
dirac_delta 0))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
REWRITE_TAC[euclid; euclid_scale;
dirac_delta ];
EQ_TAC;
DISCH_ALL_TAC;
IMATCH_MP_TAC EQ_EXT;
X_GEN_TAC `n:num`;
BETA_TAC;
COND_CASES_TAC;
REDUCE_TAC;
ASM_REWRITE_TAC[];
REDUCE_TAC;
ASM_SIMP_TAC[ARITH_RULE `(~(0=m))==>(1<=| m)`];
DISCH_ALL_TAC;
DISCH_ALL_TAC;
USE 1 (MATCH_MP (ARITH_RULE `1<= m ==> (~(0=m))`));
ASM ONCE_REWRITE_TAC[];
ASM_REWRITE_TAC[];
REDUCE_TAC ;
]);;
(* }}} *)
(* projection onto the ith coordinate, as a euclidean vector *)
let proj = euclid_def
`proj i x = (\j. (if (j=0) then (x (i:num)) else (&.0)))`;;
let proj_euclid1 = prove_by_refinement(
`!i x. euclid 1 (proj i x)`,
(* {{{ proof *)
[
REWRITE_TAC[proj;euclid];
REPEAT GEN_TAC;
COND_CASES_TAC;
ASM_REWRITE_TAC[];
ARITH_TAC;
ARITH_TAC;
]);;
(* }}} *)
let d_euclid_n = prove_by_refinement(
`!n x y. ((euclid n x) /\ (euclid n y)) ==> ((d_euclid x y) =
sqrt(sum (0,n) (\i. (x i - y i) * (x i - y i))))`,
(* {{{ proof *)
[
REPEAT GEN_TAC;
REWRITE_TAC[d_euclid;norm];
DISCH_ALL_TAC;
ASSUME_TAC (ARITH_RULE `n <=| n`);
SUBGOAL_TAC `euclid n (x - y)`;
ASM_SIMP_TAC[
euclid_sub_closure];
DISCH_TAC;
CLEAN_ASSUME_TAC (SPECL[`(x-y):num->real`;`(x-y):num->real`;`n:num`;`n:num`]
dot_updim);
ASM_REWRITE_TAC[euclid_minus];
]);;
(* }}} *)
let norm_n = prove_by_refinement(
`!n x. ((euclid n x) ) ==> ((norm x) =
sqrt(sum (0,n) (\i. (x i ) * (x i ))))`,
(* {{{ proof *)
[
REPEAT GEN_TAC;
TYPEL_THEN [`x`;`x`;`n`;`n`] (fun t-> SIMP_TAC [norm;ISPECL t
dot_updim;ARITH_RULE `n <=| n`;]);
]);;
(* }}} *)
let proj_d_euclid = prove_by_refinement(
`!i x y. d_euclid (proj i x) (proj i y) = abs (x i -. y i)`,
(* {{{ proof *)
[
REPEAT GEN_TAC;
SIMP_TAC[SPEC `1`
d_euclid_n;
proj_euclid1];
REWRITE_TAC[ARITH_RULE `1 = SUC 0`;sum];
NUM_REDUCE_TAC;
REWRITE_TAC[proj];
REWRITE_TAC[REAL_ARITH `&.0 + x = x`];
MESON_TAC[POW_2_SQRT_ABS;REAL_POW_2];
]);;
(* }}} *)
(* }}} *)
let proj_contraction = prove_by_refinement(
`!n x y i. (euclid n x) /\ (euclid n y) ==>
abs (x i - (y i)) <=. d_euclid x y`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
MATCH_MP_TAC
REAL_POW_2_LE;
REWRITE_TAC[REAL_ABS_POS];
CONJ_TAC;
ASM_MESON_TAC[
d_euclid_pos];
ASM_SIMP_TAC[SPEC `n:num`
d_euclid_n];
REWRITE_TAC[REAL_POW2_ABS];
SUBGOAL_TAC `euclid n (x - y)`; (* why does MESON fail here??? *)
MATCH_MP_TAC
euclid_sub_closure;
ASM_MESON_TAC[];
DISCH_TAC;
SUBGOAL_TAC `&.0 <=. sum (0,n) (\i. (x i - y i)*. (x i - y i))`;
MATCH_MP_TAC SUM_POS_GEN;
DISCH_ALL_TAC THEN BETA_TAC;
REWRITE_TAC[REAL_LE_SQUARE];
SIMP_TAC[SQRT_POW_2];
DISCH_TAC;
ASM_CASES_TAC `n <=| i`;
MATCH_MP_TAC (REAL_ARITH `(x = (&.0)) /\ (&.0 <=. y) ==> (x <=. y)`);
ASM_REWRITE_TAC[];
REWRITE_TAC[REAL_PROP_ZERO_POW];
NUM_REDUCE_TAC;
ASM_MESON_TAC[euclid;euclid_minus];
MP_TAC (ARITH_RULE `~(n <=| i) ==> (i < n) /\ (n = (SUC i) + (n-i-1))`);
ASM_REWRITE_TAC[] THEN DISCH_ALL_TAC;
ASM ONCE_REWRITE_TAC[];
REWRITE_TAC[GSYM SUM_TWO];
MATCH_MP_TAC (REAL_ARITH `(a <=. b) /\ (&.0 <=. c) ==> (a <=. (b +c))`);
CONJ_TAC;
REWRITE_TAC[sum_DEF];
REWRITE_TAC[ARITH_RULE `0 +| i = i`];
MATCH_MP_TAC (REAL_ARITH `(a = c) /\ (&.0 <=. b) ==> (a <=. b+c)`);
REWRITE_TAC[REAL_POW_2];
MP_TAC (SPECL [`0:num`;`i:num`;`(x:num->real)- y`]
REAL_SUM_SQUARE_POS);
BETA_TAC;
REWRITE_TAC[euclid_minus];
MP_TAC (SPECL [`SUC i`;`(n:num)-i-1`;`(x:num->real)- y`]
REAL_SUM_SQUARE_POS);
BETA_TAC;
REWRITE_TAC[euclid_minus];
]);;
(* }}} *)
(* }}} *)
let d_euclid_pow2 = prove_by_refinement(
`!n x y. (euclid n x) /\ (euclid n y) ==>
((d_euclid x y) pow 2 = sum (0,n) (\i. (x i - y i) * (x i - y i)))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
ASM_SIMP_TAC[
d_euclid_n];
REWRITE_TAC[SQRT_POW2];
MATCH_MP_TAC SUM_POS_GEN;
BETA_TAC;
REDUCE_TAC;
]);;
(* }}} *)
let D_EUCLID_BOUND = prove_by_refinement(
`!n x y eps. ((euclid n x) /\ (euclid n y) /\
(!i. (abs (x i -. y i) <=. eps))) ==>
( d_euclid x y <=. sqrt(&.n)*. eps )`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
SQUARE_TAC;
SUBCONJ_TAC;
JOIN 0 1;
USE 0 (MATCH_MP
d_euclid_pos);
ASM_REWRITE_TAC[];
DISCH_TAC;
WITH 2 (SPEC `0`);
USE 4 (MATCH_MP (REAL_ARITH `abs (x) <=. eps ==> &.0 <=. eps`));
SUBCONJ_TAC;
ALL_TAC;
REWRITE_TAC[
REAL_MUL_NN];
DISJ1_TAC;
CONJ_TAC;
MATCH_MP_TAC SQRT_POS_LE ;
REDUCE_TAC;
ASM_REWRITE_TAC[];
DISCH_TAC;
ASM_SIMP_TAC[
d_euclid_pow2];
SUBGOAL_TAC `!i. ((x:num->real) i -. y i) *. (x i -. y i) <=. eps* eps`;
GEN_TAC;
ALL_TAC;
USE 2 (SPEC `i:num`);
ABBREV_TAC `t = x i - (y:num->real) i`;
UND 2;
REWRITE_TAC[
ABS_SQUARE_LE];
REWRITE_TAC[REAL_POW_MUL];
ASSUME_TAC (REWRITE_RULE[] ((REDUCE_CONV `&.0 <= &.n`)));
USE 6 (REWRITE_RULE[GSYM SQRT_POW2]);
ASM_REWRITE_TAC[];
DISCH_TAC;
ALL_TAC;
MATCH_MP_TAC SUM_BOUND;
GEN_TAC;
DISCH_TAC;
BETA_TAC;
REWRITE_TAC[POW_2];
ASM_MESON_TAC[];
]);;
(* }}} *)
let metric_translate = prove_by_refinement(
`!n x y z . (euclid n x) /\ (euclid n y) /\ (euclid n z) ==>
(d_euclid (x + z) (y + z) = d_euclid x y)`,
(* {{{ proof *)
[
REWRITE_TAC[d_euclid;norm];
DISCH_ALL_TAC;
TYPE_THEN `euclid n (euclid_minus x y)` SUBGOAL_TAC;
ASM_SIMP_TAC[
euclid_sub_closure];
DISCH_TAC;
TYPE_THEN `euclid n (euclid_minus (euclid_plus x z) (euclid_plus y z))` SUBGOAL_TAC;
ASM_SIMP_TAC[
euclid_sub_closure;
euclid_add_closure];
DISCH_ALL_TAC;
ASM_SIMP_TAC[SPEC `n:num`
dot_euclid];
TYPE_THEN `(x + z) - (y + z) = ((x:num->real) - y)` SUBGOAL_TAC;
IMATCH_MP_TAC EQ_EXT;
X_GEN_TAC `i:num`;
REWRITE_TAC[euclid_minus;euclid_plus];
REAL_ARITH_TAC;
DISCH_THEN (fun t-> REWRITE_TAC[t]);
]);;
(* }}} *)
let metric_translate_LEFT = prove_by_refinement(
`!n x y z . (euclid n x) /\ (euclid n y) /\ (euclid n z) ==>
(d_euclid (z + x ) (z + y) = d_euclid x y)`,
(* {{{ proof *)
[
REWRITE_TAC[d_euclid;norm];
DISCH_ALL_TAC;
TYPE_THEN `euclid n (euclid_minus x y)` SUBGOAL_TAC;
ASM_SIMP_TAC[
euclid_sub_closure];
DISCH_TAC;
TYPE_THEN `euclid n (euclid_minus (euclid_plus z x) (euclid_plus z y))` SUBGOAL_TAC;
ASM_SIMP_TAC[
euclid_sub_closure;
euclid_add_closure];
DISCH_ALL_TAC;
ASM_SIMP_TAC[SPEC `n:num`
dot_euclid];
TYPE_THEN `(z + x) - (z + y) = ((x:num->real) - y)` SUBGOAL_TAC;
IMATCH_MP_TAC EQ_EXT;
X_GEN_TAC `i:num`;
REWRITE_TAC[euclid_minus;euclid_plus];
REAL_ARITH_TAC;
DISCH_THEN (fun t-> REWRITE_TAC[t]);
]);;
(* }}} *)
let norm_scale = prove_by_refinement(
`!t t' x . (euclidean x) ==>
(d_euclid (t *# x) (t' *# x) =
||. (t - t') * norm(x))`,
(* {{{ proof *)
[
REWRITE_TAC[euclidean];
LEFT_TAC "n";
DISCH_ALL_TAC;
ASM_SIMP_TAC[d_euclid_n;norm_n;euclid_scale_closure;euclid_scale;GSYM REAL_SUB_RDISTRIB;REAL_MUL_AC;];
REWRITE_TAC[GSYM REAL_POW_2 ];
REWRITE_TAC[REAL_ARITH `a * a * b = b * (a * a)`;SUM_CMUL;];
ASM_SIMP_TAC[SQRT_MUL;REAL_SUM_SQUARE_POS;REAL_LE_SQUARE_POW;POW_2_SQRT_ABS ];
REWRITE_TAC[REAL_POW_2];
]);;
(* }}} *)
let norm_scale_vec = prove_by_refinement(
`!n t x x' . (euclid n x) /\ (euclid n x') ==>
(d_euclid (t *# x) (t *# x') = ||. t * d_euclid x x')`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
ASM_SIMP_TAC[
d_euclid_n;
norm_n;
euclid_scale_closure;euclid_scale;GSYM REAL_SUB_LDISTRIB;REAL_MUL_AC;];
REWRITE_TAC[REAL_ARITH `t*t*b = (t*t)*b`];
REWRITE_TAC[GSYM REAL_POW_2 ;SUM_CMUL ];
GEN_REWRITE_TAC (LAND_CONV o RAND_CONV o RAND_CONV o ONCE_DEPTH_CONV) [REAL_POW_2];
ASM_SIMP_TAC[SQRT_MUL;
REAL_SUM_SQUARE_POS;REAL_LE_SQUARE_POW;POW_2_SQRT_ABS ];
REWRITE_TAC[REAL_POW_2];
]);;
(* }}} *)
(* ------------------------------------------------------------------ *)
(* Topological Spaces *)
(* ------------------------------------------------------------------ *)
(* Definitions *)
(* underscore is necessary to avoid Harrison's global "topology" *)
(* carrier of topology is UNIONS U *)
let topology = euclid_def `topology_ (U:(A->bool)->bool) <=>
(!A B V. (U EMPTY) /\
((U A) /\ (U B) ==> (U (A INTER B))) /\
((V SUBSET U) ==> (U (UNIONS V))))`;;
let open_DEF = euclid_def `open_ (U:(A->bool)->bool) A = (U A)`;;
let closed = euclid_def `closed_ (U:(A->bool)->bool) B <=>
(B SUBSET (UNIONS U)) /\
(open_ U ((UNIONS U) DIFF B))`;;
let closure = euclid_def `closure (U:(A->bool)->bool) A =
INTERS { B | (closed_ U B) /\ (A SUBSET B) }`;;
let induced_top = euclid_def `induced_top U (A:A->bool) =
IMAGE ( \B. (B INTER A)) U`;;
let open_ball = euclid_def
`open_ball(X,d) (x:A) r = { y | (X x) /\ (X y) /\ (d x y <. r) }`;;
let closed_ball =euclid_def
`closed_ball (X,d) (x:A) r = { y | (X x) /\ (X y) /\ (d x y <=. r) }`;;
let open_balls = euclid_def
`open_balls (X,d) = { B | ?(x:A) r. B = open_ball (X,d) x r}`;;
let top_of_metric = euclid_def
`top_of_metric ((X:A->bool),d) =
{ A | ?F. (F SUBSET (open_balls (X,d)))/\
(A = UNIONS F) }`;;
(* basic properties *)
let open_EMPTY = prove_by_refinement(
`!(U:(A->bool)->bool). (topology_ U ==> open_ U EMPTY)`,
(* {{{ proof *)
[
REWRITE_TAC[topology;open_DEF];
MESON_TAC[];
]);;
(* }}} *)
let open_closed = prove_by_refinement(
`!U A. (topology_ (U:(A->bool)->bool)) /\ (open_ U A) ==>
(closed_ U ((UNIONS U) DIFF A))`,
(* {{{ proof *)
[
REWRITE_TAC[closed;open_DEF];
DISCH_ALL_TAC;
SUBGOAL_THEN `(A:A->bool) SUBSET (UNIONS U)` ASSUME_TAC;
ASM_MESON_TAC[
sub_union];
ASM_SIMP_TAC[
DIFF_DIFF2];
REWRITE_TAC[SUBSET_DIFF];
]);;
(* }}} *)
let closed_UNIV = prove_by_refinement(
`!(U:(A->bool)->bool). (topology_ U ==> closed_ U (UNIONS U))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
ASM_SIMP_TAC[
open_closed];
REWRITE_TAC[closed;open_DEF];
TYPE_THEN `a = UNIONS U` ABBREV_TAC;
USE 0 (REWRITE_RULE[topology]);
CONJ_TAC;
MESON_TAC[SUBSET];
USE 0 (CONV_RULE (quant_right_CONV "V"));
USE 0 (CONV_RULE (quant_right_CONV "B"));
USE 0 (CONV_RULE (quant_right_CONV "A"));
AND 0;
UND 2;
MESON_TAC[DIFF_EQ_EMPTY];
]);;
(* }}} *)
let top_univ = prove_by_refinement(
`!(U:(A->bool)->bool). (topology_ U) ==> (U (UNIONS U))`,
(* {{{ proof *)
[
REWRITE_TAC[topology];
DISCH_ALL_TAC;
ASM_MESON_TAC[SUBSET_REFL];
]);;
(* }}} *)
let empty_closed = prove_by_refinement(
`!(U:(A->bool)->bool).
(topology_ U) ==> closed_ U EMPTY`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
REWRITE_TAC[closed;EMPTY_SUBSET;DIFF_EMPTY;open_DEF];
ASM_MESON_TAC[
top_univ];
]);;
(* }}} *)
(* }}} *)
let closed_inter = prove_by_refinement (
`!U V. (topology_ (U:(A->bool)->bool)) /\ (!a. (V a) ==> (closed_ U a))
/\ ~(V = EMPTY)
==> (closed_ U (INTERS V))`,
(* {{{ proof *)
[
REWRITE_TAC[closed];
DISCH_ALL_TAC;
CONJ_TAC;
MATCH_MP_TAC
INTERS_SUBSET2;
USE 2 (REWRITE_RULE[
EMPTY_EXISTS]);
USE 2 (REWRITE_RULE[IN]);
CHO 2;
EXISTS_TAC `u:A->bool`;
ASM_MESON_TAC[ ];
ABBREV_TAC `VCOMP = IMAGE ((DIFF) (UNIONS (U:(A->bool)->bool))) V`;
UNDISCH_FIND_THEN `VCOMP` (fun t -> ASSUME_TAC (GSYM t));
SUBGOAL_THEN `(VCOMP:(A->bool)->bool) SUBSET U` ASSUME_TAC;
ASM_REWRITE_TAC[SUBSET;IN_ELIM_THM;IMAGE];
REWRITE_TAC[IN];
GEN_TAC;
ASM_MESON_TAC[open_DEF];
SUBGOAL_THEN `open_ U (UNIONS (VCOMP:(A->bool)->bool))` ASSUME_TAC;
ASM_MESON_TAC[topology;open_DEF];
SUBGOAL_THEN ` (UNIONS U DIFF INTERS V)= (UNIONS (VCOMP:(A->bool)->bool))` (fun t-> (REWRITE_TAC[t]));
ASM_REWRITE_TAC[
UNIONS_INTERS];
UNDISCH_FIND_TAC `(open_)`;
REWRITE_TAC[];
]);;
(* }}} *)
let open_nbd = prove_by_refinement(
`!U (A:A->bool). (topology_ U) ==>
((U A) = (!x. ?B. (A x ) ==> ((B SUBSET A) /\ (B x) /\ (U B))))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
EQ_TAC;
DISCH_ALL_TAC;
GEN_TAC;
EXISTS_TAC `A:A->bool`;
ASM_MESON_TAC[SUBSET];
CONV_TAC (quant_left_CONV "B");
DISCH_THEN CHOOSE_TAC;
USE 1 (CONV_RULE NAME_CONFLICT_CONV);
TYPE_THEN `UNIONS (IMAGE B A) = A` SUBGOAL_TAC;
MATCH_MP_TAC SUBSET_ANTISYM;
CONJ_TAC;
MATCH_MP_TAC
UNIONS_SUBSET;
REWRITE_TAC[IN_IMAGE];
ASM_MESON_TAC[IN];
REWRITE_TAC[SUBSET;IN_UNIONS;IN_IMAGE];
DISCH_ALL_TAC;
NAME_CONFLICT_TAC;
CONV_TAC (quant_left_CONV "x'");
CONV_TAC (quant_left_CONV "x'");
EXISTS_TAC `x:A`;
TYPE_THEN `B x` EXISTS_TAC ;
ASM_REWRITE_TAC[];
ASM_MESON_TAC[IN];
(* on 1*)
TYPE_THEN `(IMAGE B A) SUBSET U` SUBGOAL_TAC;
REWRITE_TAC[SUBSET;IN_IMAGE;];
REWRITE_TAC[IN];
NAME_CONFLICT_TAC;
GEN_TAC;
DISCH_THEN CHOOSE_TAC;
ASM_REWRITE_TAC[];
ASM_MESON_TAC[];
TYPE_THEN `W = IMAGE B A` ABBREV_TAC;
KILL 2;
ASM_MESON_TAC[topology];
]);;
(* }}} *)
let open_inters = prove_by_refinement(
`!U (V:(A->bool)->bool). (topology_ U) /\ (V SUBSET U) /\
(FINITE V) /\ ~(V = EMPTY) ==>
(U (INTERS V))`,
(* {{{ proof *)
[
REP_GEN_TAC;
DISCH_ALL_TAC;
TYPE_THEN `(?n. V HAS_SIZE n)` SUBGOAL_TAC;
REWRITE_TAC[HAS_SIZE];
ASM_MESON_TAC[];
DISCH_ALL_TAC;
UND 0;
UND 1;
UND 2;
UND 3;
UND 4;
CONV_TAC (quant_left_CONV "n");
TYPE_THEN `V` SPEC2_TAC ;
TYPE_THEN `U` SPEC2_TAC ;
CONV_TAC (quant_left_CONV "n");
CONV_TAC (quant_left_CONV "n");
INDUCT_TAC;
DISCH_ALL_TAC;
ASM_MESON_TAC[HAS_SIZE_0];
DISCH_ALL_TAC;
TYPE_THEN `U` (USE 0 o SPEC);
USE 5 (REWRITE_RULE[HAS_SIZE_SUC;
EMPTY_EXISTS]);
AND 5;
CHO 6;
TYPE_THEN `u` (USE 5 o SPEC);
REWR 5;
TYPE_THEN `V DELETE u` (USE 0 o SPEC);
REWR 0;
TYPE_THEN `V={u}` ASM_CASES_TAC;
ASM_REWRITE_TAC[
inters_singleton];
UND 6;
UND 2;
REWRITE_TAC [SUBSET;IN];
MESON_TAC[];
ALL_TAC; (* oi1 *)
USE 0 (REWRITE_RULE[
delete_empty]);
REWR 0;
USE 0 (REWRITE_RULE[FINITE_DELETE]);
REWR 0;
TYPE_THEN `V DELETE u SUBSET U ` SUBGOAL_TAC;
ASM_MESON_TAC[DELETE_SUBSET;SUBSET_TRANS];
DISCH_ALL_TAC;
REWR 0;
ALL_TAC; (* oi2 *)
COPY 6;
USE 9 (REWRITE_RULE[IN]);
USE 9 (MATCH_MP
delete_inters);
ASM_REWRITE_TAC[];
USE 1 (REWRITE_RULE[topology]);
TYPEL_THEN [`(INTERS (V DELETE u))`;`u`;`U`] (USE 1 o ISPECL);
AND 1;
AND 1;
UND 11;
DISCH_THEN MATCH_MP_TAC ;
ASM_REWRITE_TAC[];
UND 6;
UND 2;
REWRITE_TAC [SUBSET;IN];
ASM_MESON_TAC[];
]);;
(* }}} *)
(* }}} *)
let top_inter = prove_by_refinement(
`!(U:(A->bool)-> bool) A B. topology_ U /\ (U A) /\ (U B) ==> (U (A INTER B))`,
(* {{{ proof *)
[
MESON_TAC[topology];
]);;
(* }}} *)
(* open and closed balls in metric spaces *)
let open_ball_nonempty = prove_by_refinement(
`!(X:A->bool) d a r. (metric_space (X,d)) /\ (&.0 <. r) /\ (X a) ==>
(a IN (open_ball(X,d) a r))`,
(* {{{ proof *)
[
REWRITE_TAC[metric_space;IN_ELIM_THM;open_ball];
DISCH_ALL_TAC;
UNDISCH_FIND_THEN `( /\ )` (ASSUME_TAC o (SPECL [`a:A`;`a:A`;`a:A`]));
ASM_MESON_TAC[];
]);;
(* }}} *)
(* }}} *)
let open_ball_subspace = prove_by_refinement(
`!(X:A->bool) Y d a r. (Y SUBSET X) ==>
(open_ball(Y,d) a r SUBSET open_ball(X,d) a r)`,
(* {{{ proof *)
[
REWRITE_TAC[SUBSET;open_ball;IN_ELIM_THM];
MESON_TAC[IN];
]);;
(* }}} *)
let open_ball_empty = prove_by_refinement(
`!(X:A->bool) d a r. ~(a IN X) ==> (EMPTY = open_ball (X,d) a r)`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
REWRITE_TAC[open_ball];
MATCH_MP_TAC EQ_EXT;
REWRITE_TAC[IN_ELIM_THM;EMPTY];
ASM_MESON_TAC[IN];
]);;
(* }}} *)
(*** Old proof modified by JRH to avoid GSPEC
let open_ball_intersect = prove_by_refinement(
`!(X:A->bool) Y d a r. (Y SUBSET X) /\ (a IN Y) ==>
(open_ball(Y,d) a r = (open_ball(X,d) a r INTER Y))`,
(* {{{ proof *)
[
REWRITE_TAC[SUBSET;IN;INTER;open_ball];
REWRITE_TAC[GSPEC_THM];
REWRITE_TAC[IN_ELIM_THM];
REWRITE_TAC[GSPEC];
DISCH_ALL_TAC;
MATCH_MP_TAC EQ_EXT;
GEN_TAC;
BETA_TAC;
ASM_MESON_TAC[];
]);;
(* }}} *)
***)
let open_ball_intersect = prove_by_refinement(
`!(X:A->bool) Y d a r. (Y SUBSET X) /\ (a IN Y) ==>
(open_ball(Y,d) a r = (open_ball(X,d) a r INTER Y))`,
(* {{{ proof *)
[
REWRITE_TAC[SUBSET;IN;INTER;open_ball];
REWRITE_TAC[EXTENSION; IN_ELIM_THM];
MESON_TAC[]
]);;
(* }}} *)
let open_ball_center = prove_by_refinement(
`!(X:A->bool) d a b r. (metric_space (X,d)) /\
(a IN (open_ball (X,d) b r)) ==>
(?r'. (&.0 <. r') /\
((open_ball(X,d) a r') SUBSET (open_ball(X,d) b r)))`,
(* {{{ proof *)
[
REWRITE_TAC[metric_space;open_ball];
DISCH_ALL_TAC;
EXISTS_TAC `r -. (d (a:A) (b:A))`;
REWRITE_TAC[SUBSET;IN_ELIM_THM];
UNDISCH_FIND_TAC `(IN)`;
REWRITE_TAC[IN_ELIM_THM];
DISCH_ALL_TAC;
CONJ_TAC;
REWRITE_TAC[REAL_ARITH `(&.0 < r -. s)= (s <. r)`];
ASM_MESON_TAC[];
GEN_TAC;
ASM_REWRITE_TAC[];
REWRITE_TAC[REAL_ARITH `(u <. v-.w) <=> (w +. u <. v)`];
DISCH_ALL_TAC;
ASM_REWRITE_TAC[];
UNDISCH_FIND_TAC `(!)`;
DISCH_THEN (fun t-> (MP_TAC (SPECL [`b:A`;`a:A`;`x:A`] t)));
ASM_REWRITE_TAC[];
ASM_MESON_TAC[REAL_LET_TRANS;REAL_LTE_TRANS];
]);;
(* }}} *)
let open_ball_nonempty_center = prove_by_refinement(
`!(X:A->bool) d a r. (metric_space(X,d)) ==>
((a IN (open_ball(X,d) a r)) =
~(open_ball(X,d) a r = EMPTY))`,
(* {{{ proof *)
[
REWRITE_TAC[metric_space];
DISCH_ALL_TAC;
REWRITE_TAC[open_ball];
REWRITE_TAC[REWRITE_CONV[IN_ELIM_THM] `(a:A) IN { y | X a /\ X y /\ (d a y <. r)}`];
REWRITE_TAC[EXTENSION];
REWRITE_TAC[IN_ELIM_THM;NOT_IN_EMPTY;NOT_FORALL_THM];
EQ_TAC;
MESON_TAC[];
DISCH_THEN CHOOSE_TAC;
ASM_REWRITE_TAC[];
FIRST_ASSUM (fun t -> MP_TAC (SPECL [`a:A`;`x:A`;`a:A`] t));
UNDISCH_FIND_THEN `(+.)` (fun t -> MP_TAC (SPECL [`a:A`;`a:A`;`a:A`] t));
ASM_MESON_TAC[REAL_LET_TRANS;REAL_LTE_TRANS];
]);;
(* }}} *)
(*** Old proof modified by JRH to remove apparent misnamed quantifier
let open_ball_neg_radius = prove_by_refinement(
`!(X:A->bool) d a r. metric_space(X,d) /\ (r <. (&.0)) ==>
(EMPTY = open_ball(X,d) a r)`,
(* {{{ proof *)
[
REWRITE_TAC[open_ball;metric_space];
DISCH_ALL_TAC;
MATCH_MP_TAC EQ_EXT;
GEN_TAC;
REWRITE_TAC[EMPTY;IN_ELIM_THM];
FIRST_ASSUM (fun t -> MP_TAC (SPECL [`a:A`;`x:A`;`a:A`] t));
ASSUME_TAC (REAL_ARITH `!u r. ~((dd <. r) /\ (r <. (&.0)) /\ (&.0 <=. dd))`);
ASM_MESON_TAC[];
]);;
(* }}} *)
***)
let open_ball_neg_radius = prove_by_refinement(
`!(X:A->bool) d a r. metric_space(X,d) /\ (r <. (&.0)) ==>
(EMPTY = open_ball(X,d) a r)`,
(* {{{ proof *)
[
REWRITE_TAC[open_ball;metric_space];
DISCH_ALL_TAC;
MATCH_MP_TAC EQ_EXT;
GEN_TAC;
REWRITE_TAC[EMPTY;IN_ELIM_THM];
FIRST_ASSUM (fun t -> MP_TAC (SPECL [`a:A`;`x:A`;`a:A`] t));
ASSUME_TAC (REAL_ARITH `!d r. ~((d <. r) /\ (r <. (&.0)) /\ (&.0 <=. d))`);
ASM_MESON_TAC[];
]);;
(* }}} *)
let open_ball_nest = prove_by_refinement(
`!(X:A->bool) d a r r'. (r <. r') ==>
((open_ball (X,d) a r) SUBSET (open_ball(X,d) a r'))`,
(* {{{ proof *)
[
REWRITE_TAC[SUBSET;open_ball;IN_ELIM_THM];
MESON_TAC[REAL_ARITH `(r<. r') /\ (a <. r) ==> (a <. r')`];
]);;
(* }}} *)
(* intersection of open balls contains an open ball *)
let open_ball_inter = prove_by_refinement(
`!(X:A->bool) d a b c r r'. (metric_space (X,d)) /\ (X a) /\ (X b) /\
(c IN (open_ball(X,d) a r INTER (open_ball(X,d) b r'))) ==>
(?r''. (&.0 <. r'') /\ (open_ball(X,d) c r'') SUBSET
(open_ball(X,d) a r INTER (open_ball(X,d) b r')))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
UNDISCH_FIND_THEN `(INTER)` (fun t-> MP_TAC (REWRITE_RULE[IN_INTER] t) THEN DISCH_ALL_TAC);
SUBGOAL_TAC `(X:A->bool) (c:A)`;
ASM_MESON_TAC[SUBSET;
open_ball_subset;IN];
DISCH_TAC;
MP_TAC (SPECL[`X:A->bool`;`d:A->A->real`;`c:A`;`b:A`;`r':real`]
open_ball_center) THEN (ASM_REWRITE_TAC[]) THEN (DISCH_THEN CHOOSE_TAC);
MP_TAC (SPECL[`X:A->bool`;`d:A->A->real`;`c:A`;`a:A`;`r:real`]
open_ball_center) THEN (ASM_REWRITE_TAC[]) THEN (DISCH_THEN CHOOSE_TAC);
REWRITE_TAC[
SUBSET_INTER];
EXISTS_TAC `(if (r'' <. r''') then (r'') else (r'''))`;
COND_CASES_TAC;
ASM_MESON_TAC[
open_ball_nest;SUBSET_TRANS];
IMP_RES_THEN DISJ_CASES_TAC (REAL_ARITH `(~(r'' <. r''')) ==> ((r''' <. r'') \/ (r'''=r''))`);
ASM_MESON_TAC[
open_ball_nest;SUBSET_TRANS];
ASM_MESON_TAC[];
]);;
(* }}} *)
let BALL_DIST = prove_by_refinement(
`!X d x y (z:A) r. metric_space(X,d) /\ open_ball(X,d) z r x /\
open_ball(X,d) z r y ==> d x y <. (&.2 * r)`,
(* {{{ proof *)
[
REWRITE_TAC[metric_space;open_ball;IN_ELIM_THM'];
DISCH_ALL_TAC;
USE 0 (SPECL [`x:A`;`z:A`;`y:A`]);
REWR 0;
UND 0 THEN DISCH_ALL_TAC;
UND 9;
UND 6;
ASM_REWRITE_TAC[];
UND 3;
REAL_ARITH_TAC;
]);;
(* }}} *)
let BALL_DIST_CLOSED = prove_by_refinement(
`!X d x y (z:A) r. metric_space(X,d) /\ closed_ball(X,d) z r x /\
closed_ball(X,d) z r y ==> d x y <=. (&.2 * r)`,
(* {{{ proof *)
[
REWRITE_TAC[metric_space;closed_ball;IN_ELIM_THM'];
DISCH_ALL_TAC;
USE 0 (SPECL [`x:A`;`z:A`;`y:A`]);
REWR 0;
UND 0 THEN DISCH_ALL_TAC;
UND 9;
UND 6;
ASM_REWRITE_TAC[];
UND 3;
REAL_ARITH_TAC;
]);;
(* }}} *)
let open_ball_sub_closed = prove_by_refinement(
`!X d (x:A) r.
(open_ball(X,d) x r SUBSET (closed_ball(X,d) x r))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
REWRITE_TAC[SUBSET;IN;open_ball;closed_ball;IN_ELIM_THM'];
DISCH_ALL_TAC;
ASM_REWRITE_TAC[];
UND 2;
REAL_ARITH_TAC;
]);;
(* }}} *)
let ball_symm = prove_by_refinement(
`!X d (x:A) y r. metric_space(X,d) /\ (X x) /\ (X y) ==>
(open_ball(X,d) x r y = open_ball(X,d) y r x)`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
REWRITE_TAC [open_ball;IN_ELIM_THM'];
ASM_REWRITE_TAC[];
ASM_MESON_TAC [
metric_space_symm];
]);;
(* }}} *)
let ball_subset_ball = prove_by_refinement(
`!X d (x:A) z r. metric_space(X,d) /\
(open_ball(X,d) x r z ) ==>
(open_ball(X,d) z r SUBSET (open_ball(X,d) x (&.2 * r)))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
REWRITE_TAC[SUBSET;IN];
DISCH_ALL_TAC;
REWRITE_TAC[open_ball;IN_ELIM_THM'];
TYPE_THEN `X z /\ X x' /\ X x` SUBGOAL_TAC ;
UND 2;
UND 1;
REWRITE_TAC[open_ball;IN_ELIM_THM'];
MESON_TAC[];
DISCH_ALL_TAC;
TYPE_THEN `open_ball(X,d) z r x` SUBGOAL_TAC;
ASM_MESON_TAC[
ball_symm];
ASM_MESON_TAC[
BALL_DIST];
]);;
(* }}} *)
(* top_of_metric *)
let top_of_metric_unions = prove_by_refinement(
`!(X:A->bool) d. (metric_space (X,d)) ==>
(X = UNIONS (top_of_metric (X,d)))`,
(* {{{ proof *)
[
REPEAT GEN_TAC;
DISCH_TAC;
MATCH_MP_TAC SUBSET_ANTISYM THEN CONJ_TAC;
REWRITE_TAC[SUBSET];
REWRITE_TAC[IN_UNIONS;top_of_metric];
DISCH_ALL_TAC;
EXISTS_TAC `open_ball(X,d) (x:A) (&.1)`;
UNDISCH_TAC `(x:A) IN X` THEN (REWRITE_TAC[IN_ELIM_THM]);
DISCH_ALL_TAC;
CONJ_TAC;
EXISTS_TAC `{(open_ball(X,d) (x:A) (&.1))}`;
REWRITE_TAC[GSYM UNIONS_1;INSERT_SUBSET;EMPTY_SUBSET];
REWRITE_TAC[open_balls;IN_ELIM_THM];
MESON_TAC[];
REWRITE_TAC[IN_ELIM_THM;open_ball];
UNDISCH_FIND_TAC `(IN)`;
ASM_REWRITE_TAC[IN];
DISCH_TAC;
ASM_REWRITE_TAC[];
UNDISCH_FIND_TAC `metric_space`;
REWRITE_TAC[metric_space];
DISCH_THEN (fun t -> MP_TAC (ISPECL [`x:A`;`x:A`;`x:A`] t));
ASM_MESON_TAC[REAL_ARITH `(&.0) <. (&.1)`];
MATCH_MP_TAC
UNIONS_SUBSET;
GEN_TAC;
REWRITE_TAC[top_of_metric;IN_ELIM_THM];
DISCH_THEN CHOOSE_TAC;
ASM_REWRITE_TAC[];
MATCH_MP_TAC
UNIONS_SUBSET;
X_GEN_TAC `B:A->bool`;
DISCH_TAC;
SUBGOAL_TAC `(B:A->bool) IN open_balls (X,d)`;
ASM SET_TAC[];
REWRITE_TAC[open_balls;IN_ELIM_THM];
DISCH_THEN (CHOOSE_THEN MP_TAC);
DISCH_THEN (CHOOSE_THEN ASSUME_TAC);
ASM_REWRITE_TAC[];
REWRITE_TAC[open_ball;SUBSET;IN_ELIM_THM];
MESON_TAC[IN];
]);;
(* }}} *)
let top_of_metric_empty = prove_by_refinement(
`!(X:A->bool) d.
( (top_of_metric (X,d)) EMPTY)`,
(* {{{ proof *)
[
REWRITE_TAC[top_of_metric];
REPEAT GEN_TAC;
REWRITE_TAC[IN_ELIM_THM];
EXISTS_TAC `EMPTY:(A->bool)->bool`;
REWRITE_TAC[UNIONS_0;EMPTY_SUBSET];
]);;
(* }}} *)
let top_of_metric_open = prove_by_refinement(
`!(X:A->bool) d F.
(F SUBSET (open_balls (X,d))) ==>
((UNIONS F) IN (top_of_metric(X,d)))`,
(* {{{ proof *)
[
REWRITE_TAC[top_of_metric;IN_ELIM_THM];
MESON_TAC[];
]);;
(* }}} *)
let top_of_metric_open_balls = prove_by_refinement(
`!(X:A->bool) d.
(open_balls (X,d)) SUBSET (top_of_metric(X,d))`,
(* {{{ proof *)
[
REWRITE_TAC[SUBSET];
REWRITE_TAC[top_of_metric;IN_ELIM_THM];
DISCH_ALL_TAC;
EXISTS_TAC `{(x:A->bool)}`;
ASM SET_TAC[];
]);;
(* }}} *)
let open_ball_open = prove_by_refinement(
`! (X:A->bool) d x r. (metric_space(X,d)) ==>
(top_of_metric (X,d) (open_ball (X,d) x r)) `,
(* {{{ proof *)
[
DISCH_ALL_TAC;
TYPEL_THEN [`X`;`d`] (fun t-> ASSUME_TAC ( ISPECL t
top_of_metric_open_balls));
USE 1 (REWRITE_RULE[open_balls;SUBSET;IN_ELIM_THM']);
ASM_MESON_TAC[IN];
]);;
(* }}} *)
(* a set is open then every point contains a ball *)
let top_of_metric_nbd = prove_by_refinement(
`!(X:A->bool) d A. (metric_space (X,d)) ==>
((top_of_metric (X,d) A) <=> ((A SUBSET X) /\
(!a. (a IN A) ==>
(?r. (&.0 <. r) /\ (open_ball(X,d) a r SUBSET A)))))`,
(* {{{ proof *)
[
(DISCH_ALL_TAC);
EQ_TAC;
REWRITE_TAC[top_of_metric;IN_ELIM_THM];
DISCH_THEN (CHOOSE_THEN MP_TAC);
DISCH_ALL_TAC;
CONJ_TAC;
IMP_RES_THEN ASSUME_TAC
top_of_metric_unions;
ASM_REWRITE_TAC[];
IMP_RES_THEN ASSUME_TAC
top_of_metric_open;
ASM ONCE_REWRITE_TAC[];
MATCH_MP_TAC
UNIONS_UNIONS;
ASM_MESON_TAC[SUBSET_TRANS;
top_of_metric_open_balls];
DISCH_ALL_TAC THEN (ASM_REWRITE_TAC[]);
REWRITE_TAC[IN_UNIONS;
UNIONS_SUBSET];
UNDISCH_FIND_TAC `(IN)`;
ASM_REWRITE_TAC[];
REWRITE_TAC[IN_UNIONS];
DISCH_THEN (CHOOSE_THEN ASSUME_TAC);
SUBGOAL_TAC `(t IN open_balls (X:A->bool,d))`;
ASM_MESON_TAC[SUBSET];
REWRITE_TAC[open_balls;IN_ELIM_THM];
REPEAT (DISCH_THEN (CHOOSE_THEN MP_TAC));
DISCH_TAC;
MP_TAC (SPECL[`(X:A->bool)`; `d:A->A->real`;`a:A`;`x:A`;`r:real`]
open_ball_center);
ASM_REWRITE_TAC[];
SUBGOAL_TAC `(a:A) IN open_ball(X,d) x r`;
ASM_MESON_TAC[];
DISCH_TAC THEN (ASM_REWRITE_TAC[]);
DISCH_THEN CHOOSE_TAC;
EXISTS_TAC `r':real`;
ASM_REWRITE_TAC[];
(* to here *)
SUBGOAL_TAC `!s. ((s:A->bool) IN F') ==> (s SUBSET (UNIONS F'))`;
SET_TAC[];
ASM_MESON_TAC[SUBSET_TRANS] ; (*second direction: *)
DISCH_THEN (fun t -> ASSUME_TAC (CONJUNCT1 t) THEN MP_TAC (CONJUNCT2 t));
DISCH_THEN (fun t -> MP_TAC (REWRITE_RULE[RIGHT_IMP_EXISTS_THM] t));
REWRITE_TAC[SKOLEM_THM];
DISCH_THEN CHOOSE_TAC;
REWRITE_TAC[top_of_metric;IN_ELIM_THM];
EXISTS_TAC `IMAGE (\b. (open_ball(X,d) b (r b))) (A:A->bool)`;
CONJ_TAC;
REWRITE_TAC[IMAGE;SUBSET];
REWRITE_TAC[IN_ELIM_THM;open_balls];
MESON_TAC[IN];
REWRITE_TAC[IMAGE];
GEN_REWRITE_TAC I [EXTENSION];
X_GEN_TAC `a:A`;
REWRITE_TAC[IN_UNIONS];
REWRITE_TAC[IN_ELIM_THM];
EQ_TAC;
DISCH_TAC;
EXISTS_TAC `open_ball (X,d) (a:A) (r a)`;
CONJ_TAC;
EXISTS_TAC `a:A`;
ASM_REWRITE_TAC[];
REWRITE_TAC[IN;open_ball];
REWRITE_TAC[IN_ELIM_THM];
ASM_MESON_TAC[
metric_space_zero;IN;SUBSET]; (* last: *)
DISCH_THEN (CHOOSE_THEN MP_TAC);
DISCH_ALL_TAC;
UNDISCH_FIND_TAC `(?)` ;
DISCH_THEN (CHOOSE_THEN MP_TAC);
DISCH_ALL_TAC;
UNDISCH_FIND_TAC `(!)`;
DISCH_THEN (fun t -> MP_TAC(SPEC `x:A` t));
ASM_REWRITE_TAC[];
DISCH_ALL_TAC;
ASM_MESON_TAC[SUBSET;IN];
]);;
(* }}} *)
let top_of_metric_inter = prove_by_refinement(
`!(X:A->bool) d. (metric_space (X,d)) ==>
(!A B. (top_of_metric (X,d) A) /\ (top_of_metric (X,d) B) ==>
(top_of_metric (X,d) (A INTER B)))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
DISCH_ALL_TAC;
IMP_RES_THEN ASSUME_TAC (SPECL [`X:A->bool`;`d:A->A->real`]
top_of_metric_nbd);
UNDISCH_TAC `(top_of_metric (X,d) (B:A->bool))`;
UNDISCH_TAC `(top_of_metric (X,d) (A:A->bool))`;
ASM_REWRITE_TAC[];
DISCH_ALL_TAC;
DISCH_ALL_TAC;
CONJ_TAC;
ASM SET_TAC[];
DISCH_ALL_TAC;
UNDISCH_FIND_THEN `(INTER)` (fun t-> (MP_TAC (REWRITE_RULE[IN_INTER]t)) THEN DISCH_ALL_TAC );
UNDISCH_FIND_THEN `(IN)` (fun t-> ANTE_RES_THEN MP_TAC t);
UNDISCH_FIND_THEN `(IN)` (fun t-> ANTE_RES_THEN MP_TAC t);
DISCH_THEN CHOOSE_TAC;
DISCH_THEN CHOOSE_TAC;
EXISTS_TAC `if (r<. r') then r else r'`;
COND_CASES_TAC;
ASM_REWRITE_TAC[
SUBSET_INTER];
ASM_MESON_TAC[
open_ball_nest;SUBSET_TRANS];
MP_TAC (ARITH_RULE `~(r<.r') ==> ((r'<. r) \/ (r'=r))`) THEN (ASM_REWRITE_TAC[]);
DISCH_THEN DISJ_CASES_TAC;
ASM_REWRITE_TAC[
SUBSET_INTER];
ASM_MESON_TAC[
open_ball_nest;SUBSET_TRANS];
ASM_MESON_TAC[
SUBSET_INTER];
]);;
(* }}} *)
let top_of_metric_union = prove_by_refinement(
`!(X:A->bool) d. (metric_space(X,d)) ==>
(!V. (V SUBSET top_of_metric(X,d)) ==>
(top_of_metric(X,d) (UNIONS V)))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
MP_TAC (SPECL[`X:A->bool`;`d:A->A->real`]
top_of_metric_nbd);
ASM_REWRITE_TAC[];
DISCH_THEN (fun t-> REWRITE_TAC[t]);
DISCH_ALL_TAC;
CONJ_TAC;
ASM_MESON_TAC[
UNIONS_UNIONS;
top_of_metric_unions];
GEN_TAC;
REWRITE_TAC[IN_UNIONS];
DISCH_THEN (CHOOSE_THEN MP_TAC);
DISCH_ALL_TAC;
SUBGOAL_TAC `(top_of_metric (X,d)) (t:A->bool)`;
ASM_MESON_TAC[IN;SUBSET];
MP_TAC (SPECL[`X:A->bool`;`d:A->A->real`]
top_of_metric_nbd);
ASM_REWRITE_TAC[];
DISCH_TAC;
ASM_REWRITE_TAC[];
DISCH_ALL_TAC;
UNDISCH_FIND_THEN `(!)` (fun t -> MP_TAC (SPEC `a:A` t));
ASM_REWRITE_TAC[];
DISCH_THEN CHOOSE_TAC;
EXISTS_TAC `r:real`;
ASM_REWRITE_TAC[];
ASM SET_TAC[UNIONS];
]);;
(* }}} *)
(* }}} *)
let closed_ball_closed = prove_by_refinement(
`!X d (x:A) r. (metric_space (X,d)) ==>
(closed_ (top_of_metric(X,d)) (closed_ball(X,d) x r))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
TYPE_THEN `X x` ASM_CASES_TAC ;
REWRITE_TAC[closed];
ASM_SIMP_TAC [GSYM
top_of_metric_unions];
SUBCONJ_TAC;
REWRITE_TAC[closed_ball;SUBSET;IN;IN_ELIM_THM'];
MESON_TAC[];
DISCH_ALL_TAC;
REWRITE_TAC[open_DEF];
COPY 0;
USE 0 (MATCH_MP
top_of_metric_top);
ONCE_ASM_SIMP_TAC[
open_nbd];
GEN_TAC;
TYPE_THEN `open_ball(X,d) x' (d x x' -. r)` EXISTS_TAC;
TYPE_THEN `R = (d x x' -. r)` ABBREV_TAC;
DISCH_ALL_TAC;
TYPE_THEN `X x'` SUBGOAL_TAC;
USE 5 (REWRITE_RULE[INR IN_DIFF]);
ASM_REWRITE_TAC[];
DISCH_ALL_TAC;
SUBCONJ_TAC;
REWRITE_TAC[
DIFF_SUBSET;
open_ball_subset;INTER;
EQ_EMPTY;IN_ELIM_THM'];
X_GEN_TAC `y:A`;
REWRITE_TAC[IN];
ASM_REWRITE_TAC[open_ball;closed_ball];
REWRITE_TAC[IN_ELIM_THM';
GSYM CONJ_ASSOC];
PROOF_BY_CONTR_TAC;
USE 7 (REWRITE_RULE[]);
AND 7;
REWR 7;
COPY 3;
USE 3 (REWRITE_RULE[metric_space]);
TYPEL_THEN [`x`;`y`;`x'`] (USE 3 o SPECL);
REWR 3;
ALL_TAC; (* "bb"; *)
TYPE_THEN `d x' y = d y x'` SUBGOAL_TAC;
TYPEL_THEN [`X`;`d`] (fun t-> MATCH_MP_TAC (SPECL t metric_space_symm));
ASM_REWRITE_TAC[];
DISCH_TAC;
UND 7;
UND 10;
AND 3;
AND 3;
AND 3;
UND 3;
EXPAND_TAC "R";
ALL_TAC; (* "cb" *)
REAL_ARITH_TAC;
ALL_TAC; (* "cbc" *)
DISCH_TAC;
ASM_SIMP_TAC [open_ball_open];
MATCH_MP_TAC (INR open_ball_nonempty);
ASM_REWRITE_TAC[];
EXPAND_TAC "R";
PROOF_BY_CONTR_TAC;
USE 8 (MATCH_MP (REAL_ARITH `~(&.0 < d x x' - r) ==> (d x x' <=. r)`));
USE 5 (REWRITE_RULE[INR IN_DIFF;closed_ball;IN_ELIM_THM']);
ASM_MESON_TAC[];
TYPE_THEN `(closed_ball (X,d) x r) = EMPTY` SUBGOAL_TAC;
(**** Old step changed by JRH for modified set comprehensions
ASM_REWRITE_TAC[closed_ball;EMPTY;GSPEC];
***)
ASM_REWRITE_TAC[closed_ball;IN_ELIM_THM; EXTENSION; NOT_IN_EMPTY];
DISCH_THEN (REWRT_TAC);
ALL_TAC; (* "cbc1" *)
ASM_MESON_TAC[empty_closed;top_of_metric_top];
]);;
(* }}} *)
let open_ball_nbd = prove_by_refinement(
`!X d C x. ?e. (metric_space((X:A->bool),d)) /\ (C x) /\
(top_of_metric (X,d) C) ==>
((&.0 < e) /\ (open_ball (X,d) x e SUBSET C))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
RIGHT_TAC "e";
DISCH_ALL_TAC;
USE 2 (REWRITE_RULE[top_of_metric;open_balls;IN_ELIM_THM';SUBSET;IN ]);
CHO 2;
AND 2;
ASM_REWRITE_TAC[];
REWR 1;
USE 1 (REWRITE_RULE[UNIONS;IN;IN_ELIM_THM' ]);
CHO 1;
TYPE_THEN `u` (USE 3 o SPEC);
REWR 3;
CHO 3;
CHO 3;
REWR 1;
TYPEL_THEN [`X`;`d`;`x`;`x'`;`r`] (fun t-> (ASSUME_TAC (ISPECL t open_ball_center)));
USE 4 (REWRITE_RULE[IN ]);
REWR 4;
CHO 4;
TYPE_THEN `r'` EXISTS_TAC;
ASM_REWRITE_TAC[];
REWRITE_TAC[SUBSET;UNIONS;IN;IN_ELIM_THM'];
DISCH_ALL_TAC;
AND 4;
USE 4 (REWRITE_RULE[SUBSET;IN;IN_ELIM_THM']);
ASM_MESON_TAC[];
]);;
(* }}} *)
(* closure *)
let closure_closed = prove_by_refinement(
`!U (A:A->bool). (topology_ U) /\ (A SUBSET (UNIONS U)) ==>
(closed_ U (closure U A))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
REWRITE_TAC[closure];
MATCH_MP_TAC
closed_inter;
REWRITE_TAC[IN_ELIM_THM];
ASM_REWRITE_TAC[];
CONJ_TAC;
MESON_TAC[];
REWRITE_TAC[
EMPTY_EXISTS];
TYPE_THEN `UNIONS U` EXISTS_TAC;
ASM_REWRITE_TAC[IN_ELIM_THM'];
ASM_SIMP_TAC[
closed_UNIV];
]);;
(* }}} *)
let subset_closure = prove_by_refinement(
`!U (A:A->bool). (topology_ U) ==> (A SUBSET (closure U A))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
REWRITE_TAC[closure;SUBSET;IN_INTERS;IN_ELIM_THM];
X_GEN_TAC `a:A`;
MESON_TAC[IN];
]);;
(* }}} *)
let closure_subset = prove_by_refinement(
`!U (A:A->bool) B. (topology_ U) /\ (closed_ U B) /\ (A SUBSET B)
==> (closure U A SUBSET B)`,
(* {{{ proof *)
[
REWRITE_TAC[closure];
DISCH_ALL_TAC;
MATCH_MP_TAC
INTERS_SUBSET;
ASM_REWRITE_TAC[IN_ELIM_THM];
]);;
(* }}} *)
(* }}} *)
let closure_close = prove_by_refinement(
`!U Z (A:A->bool). (topology_ U) /\ (Z SUBSET (UNIONS U)) ==>
((A = closure U Z) = ((Z SUBSET A) /\ (closed_ U A) /\
(!B. (closed_ U B) /\ ((Z SUBSET B)) ==>
(A SUBSET B))))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
EQ_TAC;
DISCH_THEN (REWRT_TAC);
ASM_SIMP_TAC[
subset_closure;
closure_closed;
closure_subset];
DISCH_ALL_TAC;
REWRITE_TAC [closure];
MATCH_MP_TAC (SUBSET_ANTISYM);
CONJ_TAC;
REWRITE_TAC[
SUBSET_INTERS];
REWRITE_TAC[IN_ELIM_THM'];
ASM_MESON_TAC[];
MATCH_MP_TAC
INTERS_SUBSET;
REWRITE_TAC[IN_ELIM_THM'];
ASM_REWRITE_TAC[];
]);;
(* }}} *)
let closure_open = prove_by_refinement(
`!U Z (A:A->bool). (topology_ U) /\ (Z SUBSET (UNIONS U)) ==>
((A = closure U Z) = ((Z SUBSET A) /\ (closed_ U A) /\
(!B. (open_ U B) /\ ((B INTER Z) = EMPTY) ==>
((B INTER A) = EMPTY))))`,
(* {{{ proof *)
[
REP_GEN_TAC;
DISCH_TAC;
ASM_SIMP_TAC[
closure_close];
MATCH_MP_TAC (TAUT `( A ==> (B <=> C)) ==> (A /\ B <=> A /\ C)`);
DISCH_TAC;
MATCH_MP_TAC (TAUT `( A ==> (B <=> C)) ==> (A /\ B <=> A /\ C)`);
DISCH_TAC;
EQ_TAC;
DISCH_TAC;
USE 2 (REWRITE_RULE[closed]);
ASM_REWRITE_TAC[];
GEN_TAC;
USE 3 (SPEC `(UNIONS U) DIFF (B:A->bool)`);
DISCH_ALL_TAC;
UND 3;
ASM_SIMP_TAC[
open_closed];
ASM_REWRITE_TAC[
DIFF_SUBSET];
DISCH_TAC;
UND 5;
UND 3;
REWRITE_TAC[INTER_COMM];
ALL_TAC; (* co1 *)
DISCH_ALL_TAC;
DISCH_ALL_TAC;
USE 3 (SPEC `(UNIONS U) DIFF (B:A->bool)`);
UND 3;
ASM_SIMP_TAC[
closed_open];
REWRITE_TAC[
DIFF_INTER];
ASM_SIMP_TAC[
SUB_IMP_INTER];
TYPE_THEN `A SUBSET (UNIONS U INTER A)` SUBGOAL_TAC;
USE 2 (REWRITE_RULE[closed]);
AND 2;
UND 3;
ALL_TAC; (* co2 *)
SET_TAC[SUBSET;INTER];
MESON_TAC [SUBSET_TRANS];
]);;
(* }}} *)
(* induced topology *)
let image_top = prove_by_refinement(
`!(U:(A->bool)->bool) (f:(A->bool)->(B->bool)).
((topology_ U) /\ (EMPTY = f EMPTY) /\
(!a b. (a IN U) /\ (b IN U) ==>
(((f a) INTER (f b)) = f (a INTER b))) /\
(!V. (V SUBSET U) ==> (UNIONS (IMAGE f V) =f (UNIONS V) )))
==> (topology_ (IMAGE f U))`,
(* {{{ proof *)
[
REWRITE_TAC[topology];
DISCH_ALL_TAC;
DISCH_ALL_TAC;
CONJ_TAC;
REWRITE_TAC[IMAGE;IN];
REWRITE_TAC[IN_ELIM_THM];
ASM_MESON_TAC[];
CONJ_TAC;
REWRITE_TAC[IMAGE;IN];
REWRITE_TAC[IN_ELIM_THM];
DISCH_ALL_TAC;
REPEAT (UNDISCH_FIND_THEN `(?)` CHOOSE_TAC);
ASM_REWRITE_TAC[];
EXISTS_TAC `(x:A->bool) INTER x'`;
ASM_SIMP_TAC[IN];
DISCH_THEN (fun t-> MP_TAC (MATCH_MP
SUBSET_PREIMAGE t));
DISCH_THEN CHOOSE_TAC;
ASM_REWRITE_TAC[];
ASM_SIMP_TAC[];
REWRITE_TAC[IMAGE;IN_ELIM_THM];
EXISTS_TAC `UNIONS (Z:(A->bool)->bool)`;
ASM_SIMP_TAC[IN];
]);;
(* }}} *)
let induced_top_support = prove_by_refinement(
`!U (C:A->bool). (UNIONS (induced_top U C) = ((UNIONS U) INTER C))`,
(* {{{ proof *)
[
REWRITE_TAC[
UNIONS_INTER];
DISCH_ALL_TAC;
AP_TERM_TAC;
REWRITE_TAC[induced_top];
AP_THM_TAC;
AP_TERM_TAC;
MATCH_MP_TAC EQ_EXT THEN BETA_TAC;
SET_TAC[];
]);;
(* }}} *)
let induced_top_top = prove_by_refinement(
`!U (C:A->bool). (topology_ U) ==> (topology_ (induced_top U C))`,
(* {{{ proof *)
[
REPEAT GEN_TAC;
DISCH_TAC;
REWRITE_TAC[induced_top];
MATCH_MP_TAC
image_top;
ASM_REWRITE_TAC[];
CONJ_TAC;
SET_TAC[];
CONJ_TAC;
SET_TAC[];
REWRITE_TAC[
UNIONS_INTER];
DISCH_ALL_TAC;
AP_TERM_TAC;
AP_THM_TAC;
AP_TERM_TAC;
MATCH_MP_TAC EQ_EXT THEN BETA_TAC;
SET_TAC[];
]);;
(* }}} *)
let induced_top_open = prove_by_refinement(
`!U (C:A->bool) A. (topology_ U) ==> (induced_top U C A =
(?B. (U B) /\ ((B INTER C) = A)))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
REWRITE_TAC[induced_top;IMAGE];
REWRITE_TAC[IN_ELIM_THM];
MESON_TAC[IN];
]);;
(* }}} *)
let induced_trans = prove_by_refinement(
`! U (A:A->bool) B. (topology_ U) /\ U A /\ (induced_top U A B) ==>
(U B)`,
(* {{{ proof *)
[
REWRITE_TAC[induced_top;IMAGE;IN ;IN_ELIM_THM' ];
DISCH_ALL_TAC;
CHO 2;
ASM_MESON_TAC[
top_inter];
]);;
(* }}} *)
let induced_top_unions = prove_by_refinement(
`!(U:(A->bool)->bool). (topology_ U) ==>
((induced_top U (UNIONS U)) = U)`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
IMATCH_MP_TAC EQ_EXT;
GEN_TAC;
ASM_SIMP_TAC[
induced_top_open];
EQ_TAC;
DISCH_ALL_TAC;
CHO 1;
USE 0 (REWRITE_RULE[topology]);
TYPE_THEN `B SUBSET (UNIONS U)` SUBGOAL_TAC;
ASM_MESON_TAC[
sub_union ];
REWRITE_TAC[SUBSET_INTER_ABSORPTION];
DISCH_TAC ;
ASM_MESON_TAC[];
DISCH_TAC ;
TYPE_THEN `x` EXISTS_TAC;
ASM_REWRITE_TAC[];
TYPE_THEN `x SUBSET (UNIONS U)` SUBGOAL_TAC;
ASM_MESON_TAC[
sub_union ];
REWRITE_TAC[SUBSET_INTER_ABSORPTION];
]);;
(* }}} *)
(* induced metric *)
let gen = euclid_def `gen (X:(A->bool)->bool)
= {A | ?Y. (Y SUBSET X) /\ (A = UNIONS Y)}`;;
(* }}} *)
let gen_subset = prove_by_refinement(
`!U (V:(A->bool)->bool). (U SUBSET V) /\
(!A. (A IN V) ==> (?Y. (Y SUBSET U) /\ (A = UNIONS Y)))
==> (gen U = (gen V))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
REWRITE_TAC[EXTENSION];
GEN_TAC THEN EQ_TAC;
REWRITE_TAC[IN_ELIM_THM;gen];
DISCH_THEN CHOOSE_TAC;
ASM_MESON_TAC[SUBSET_TRANS];
REWRITE_TAC[IN_ELIM_THM;gen];
DISCH_THEN CHOOSE_TAC;
UNDISCH_FIND_THEN `(?)` (fun t-> MP_TAC(REWRITE_RULE[RIGHT_IMP_EXISTS_THM;SKOLEM_THM]t));
DISCH_THEN CHOOSE_TAC;
EXISTS_TAC `UNIONS (IMAGE (Y':(A->bool)->((A->bool)->bool)) (Y:(A->bool)->bool))`;
CONJ_TAC;
MATCH_MP_TAC
UNIONS_SUBSET;
REWRITE_TAC[IN_IMAGE];
GEN_TAC;
DISCH_THEN CHOOSE_TAC;
ASM_MESON_TAC[IN;SUBSET];
ASM_REWRITE_TAC[];
REWRITE_TAC[
UNIONS_IMAGE_UNIONS];
AP_TERM_TAC;
REWRITE_TAC[GSYM IMAGE_o];
REWRITE_TAC[EXTENSION];
X_GEN_TAC `A:(A->bool)`;
REWRITE_TAC[IN_IMAGE;o_THM];
ASM_MESON_TAC[SUBSET;IN];
]);;
(* }}} *)
let gen_subspace = prove_by_refinement(
`!(X:A->bool) Y d. (Y SUBSET X) /\ (metric_space(X,d)) ==>
(induced_top (top_of_metric(X,d)) Y =
gen (induced_top (open_balls(X,d)) Y))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
REWRITE_TAC[induced_top];
REWRITE_TAC[EXTENSION];
X_GEN_TAC `B:A->bool`;
REWRITE_TAC[IN_IMAGE];
EQ_TAC;
DISCH_THEN (X_CHOOSE_TAC `C:A->bool`);
FIRST_ASSUM MP_TAC;
REWRITE_TAC[top_of_metric];
REWRITE_TAC[IN_ELIM_THM];
DISCH_ALL_TAC;
UNDISCH_FIND_TAC `(?)`;
DISCH_THEN (CHOOSE_TAC);
UNDISCH_FIND_TAC `(INTER)`;
ASM_REWRITE_TAC[
UNIONS_INTER];
REWRITE_TAC[gen;IN_ELIM_THM];
EXISTS_TAC `IMAGE ((INTER) Y) (F':(A->bool)->bool)`;
CONJ_TAC;
REWRITE_TAC[
INTER_THM];
MATCH_MP_TAC IMAGE_SUBSET;
ASM_REWRITE_TAC[];
REFL_TAC;
REWRITE_TAC[gen;IN_ELIM_THM];
DISCH_THEN (CHOOSE_THEN MP_TAC);
DISCH_ALL_TAC;
IMP_RES_THEN MP_TAC
SUBSET_PREIMAGE;
DISCH_THEN CHOOSE_TAC;
EXISTS_TAC `UNIONS (Z:(A->bool)->bool)`;
CONJ_TAC;
REWRITE_TAC[
UNIONS_INTER];
UNDISCH_FIND_THEN `(UNIONS)` (fun t -> REWRITE_TAC[t]);
AP_TERM_TAC;
UNDISCH_FIND_TAC `(SUBSET)`;
REWRITE_TAC[
INTER_THM];
ASM_MESON_TAC[];
REWRITE_TAC[top_of_metric;IN_ELIM_THM];
ASM_MESON_TAC[];
]);;
(* }}} *)
let gen_induced = prove_by_refinement(
`!(X:A->bool) Y d. (Y SUBSET X) /\ (metric_space (X,d)) ==>
(gen (open_balls(Y,d)) = gen (induced_top (open_balls(X,d)) Y))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
MATCH_MP_TAC
gen_subset;
CONJ_TAC;
REWRITE_TAC[induced_top;SUBSET;open_balls];
REWRITE_TAC [IN_IMAGE];
X_GEN_TAC `A:(A->bool)`;
REWRITE_TAC[IN_ELIM_THM];
REPEAT (DISCH_THEN (CHOOSE_THEN MP_TAC));
DISCH_TAC;
ASM_REWRITE_TAC[];
ASM_CASES_TAC `(Y:A->bool) (x:A)`;
CONV_TAC (relabel_bound_conv);
EXISTS_TAC `open_ball (X,d) (x:A) r`;
CONJ_TAC;
MATCH_MP_TAC
open_ball_intersect;
ASM_MESON_TAC[IN];
MESON_TAC[];
EXISTS_TAC `open_ball (X,d) (x:A) (--. (&.1))`;
CONJ_TAC;
ASM_MESON_TAC[IN;INTER_EMPTY;
open_ball_empty;
open_ball_neg_radius;REAL_ARITH `(--.(&.1) <. (&.0))`];
MESON_TAC[]; (* end of first half *)
REWRITE_TAC[induced_top;IN_IMAGE];
GEN_TAC;
DISCH_THEN (CHOOSE_THEN MP_TAC);
NAME_CONFLICT_TAC;
REWRITE_TAC[IN;open_balls];
REWRITE_TAC[IN_ELIM_THM'];
NAME_CONFLICT_TAC;
DISCH_ALL_TAC;
ASM_REWRITE_TAC[];
FIRST_ASSUM (CHOOSE_THEN ASSUME_TAC);
FIRST_ASSUM (CHOOSE_THEN ASSUME_TAC);
SUBGOAL_TAC `!(a:A). (a IN x INTER Y) ==> (?r. ((&.0) <. r) /\ open_ball(Y,d) a r SUBSET (x INTER Y))`;
DISCH_ALL_TAC;
TYPEL_THEN [`X`;`d`;`a`;`x'`;`r'`] (fun t -> (CLEAN_ASSUME_TAC (ISPECL t
open_ball_center)));
SUBGOAL_TAC `(a:A) IN open_ball(X,d) x' r'`;
ASM_MESON_TAC[IN_INTER];
DISCH_THEN (fun t -> ANTE_RES_THEN (MP_TAC) t);
DISCH_THEN (CHOOSE_TAC);
EXISTS_TAC `r'':real`;
ASM_REWRITE_TAC[
SUBSET_INTER;
open_ball_subset];
ASM_MESON_TAC[
open_ball_subspace;SUBSET_TRANS];
DISCH_THEN (fun t -> MP_TAC (REWRITE_RULE[RIGHT_IMP_EXISTS_THM;SKOLEM_THM] t));
DISCH_THEN CHOOSE_TAC;
EXISTS_TAC `IMAGE (\t. open_ball(Y,d) t (r t) ) ((x:A->bool) INTER Y)`;
REWRITE_TAC[
SUBSET_INTER];
CONJ_TAC;
REWRITE_TAC[SUBSET;IN_ELIM_THM'];
REWRITE_TAC[IN_IMAGE];
GEN_TAC;
MESON_TAC[];
MATCH_MP_TAC SUBSET_ANTISYM;
CONJ_TAC;
REWRITE_TAC[SUBSET];
GEN_TAC;
REWRITE_TAC[IN_UNIONS];
DISCH_TAC;
EXISTS_TAC `open_ball (Y,d) (x'':A) (r x'')`;
REWRITE_TAC[IN_IMAGE];
CONJ_TAC;
NAME_CONFLICT_TAC;
EXISTS_TAC `x'':A`;
ASM_REWRITE_TAC[];
MATCH_MP_TAC
open_ball_nonempty;
ASM_SIMP_TAC[
metric_subspace];
ASM_MESON_TAC[IN_INTER;IN;
metric_subspace];
MATCH_MP_TAC
UNIONS_SUBSET;
GEN_TAC;
REWRITE_TAC[IN_IMAGE];
DISCH_THEN CHOOSE_TAC;
ASM_MESON_TAC[];
]);;
(* }}} *)
(* }}} *)
(* ------------------------------------------------------------------ *)
(* Continuity *)
(* ------------------------------------------------------------------ *)
let continuous = euclid_def `continuous (f:A->B) U V <=> !v.
(v IN V) ==> (preimage (UNIONS U) f v) IN U`;;
let metric_continuous_pt = euclid_def
`metric_continuous_pt (f:A->B) (X,dX) ((Y:B->bool),dY) x =
!epsilon. ?delta. (((&.0) < epsilon) ==> ((&.0) <. delta) /\
(!y. ((x IN X) /\ (y IN X) /\ (dX x y) <. delta) ==>
(dY (f x) (f y) <. epsilon)))`;;
let metric_continuous = euclid_def
`metric_continuous (f:A->B) (X,dX) (Y,dY) <=> !x.
metric_continuous_pt f (X,dX) (Y,dY) x`;;
(* }}} *)
let metric_continuous_continuous = prove_by_refinement(
`!f X Y dX dY. (IMAGE f X SUBSET Y) /\ (metric_space(X,dX)) /\ (metric_space(Y,dY))
==>
(continuous (f:A->B) (top_of_metric(X,dX)) (top_of_metric(Y,dY))
<=> (metric_continuous f (X,dX) (Y,dY)))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
EQ_TAC;
REWRITE_TAC[continuous;metric_continuous];
DISCH_TAC;
GEN_TAC;
ASM_CASES_TAC `(x:A) IN X` THENL[ALL_TAC;ASM_SIMP_TAC[
metric_continuous_pt_domain]];
REWRITE_TAC[metric_continuous_pt];
GEN_TAC;
SUBGOAL_TAC `(open_ball (Y,dY) ((f:A->B) x) epsilon) IN (top_of_metric(Y,dY))`;
MATCH_MP_TAC (prove_by_refinement(`!(x:A) B. (?A. (x IN A /\ A SUBSET B)) ==> (x IN B)`,[SET_TAC[]]));
EXISTS_TAC `open_balls((Y:B->bool),dY)`;
REWRITE_TAC[
top_of_metric_open_balls];
REWRITE_TAC[open_balls;IN_ELIM_THM'];
MESON_TAC[];
DISCH_THEN (ANTE_RES_THEN ASSUME_TAC);
REWRITE_TAC[GSYM RIGHT_IMP_EXISTS_THM];
DISCH_TAC;
SUBGOAL_TAC `(x:A) IN preimage (UNIONS (top_of_metric (X,dX))) f (open_ball (Y,dY) ((f:A->B) x) epsilon)`;
REWRITE_TAC[
in_preimage];
SUBGOAL_TAC `(Y:B->bool) ((f:A->B) x )`;
UNDISCH_FIND_TAC `IMAGE`;
UNDISCH_TAC `(x:A) IN X`;
REWRITE_TAC[SUBSET;IMAGE];
REWRITE_TAC[IN_ELIM_THM'];
NAME_CONFLICT_TAC;
REWRITE_TAC[IN];
MESON_TAC[];
ASM_MESON_TAC[
top_of_metric_unions;
open_ball_nonempty];
ABBREV_TAC `B = preimage (UNIONS (top_of_metric (X,dX))) (f:A->B) (open_ball (Y,dY) (f x) epsilon)`;
DISCH_TAC;
SUBGOAL_TAC `?r. (&.0 <. r) /\ (open_ball(X,dX) (x:A) r SUBSET B)`;
ASSUME_TAC
top_of_metric_nbd;
ASM_MESON_TAC[IN];
DISCH_THEN CHOOSE_TAC;
EXISTS_TAC `r:real`;
ASM_REWRITE_TAC[];
GEN_TAC;
DISCH_ALL_TAC;
SUBGOAL_TAC `y:A IN B`;
MATCH_MP_TAC (prove_by_refinement(`!(x:A) B. (?A. (x IN A /\ A SUBSET B)) ==> (x IN B)`,[SET_TAC[]]));
EXISTS_TAC `open_ball(X,dX) (x:A) r`;
ASM_REWRITE_TAC[];
REWRITE_TAC[open_ball;IN_ELIM_THM'];
ASM_MESON_TAC[IN];
UNDISCH_FIND_TAC `preimage`;
DISCH_THEN (fun t-> REWRITE_TAC[GSYM t]);
REWRITE_TAC[
in_preimage];
REWRITE_TAC[open_ball;IN_ELIM_THM'];
MESON_TAC[]; (* first half done *)
REWRITE_TAC[metric_continuous];
DISCH_TAC;
REWRITE_TAC[continuous];
GEN_TAC;
DISCH_TAC;
REWRITE_TAC[IN];
ASM_SIMP_TAC[
top_of_metric_nbd];
ASM_SIMP_TAC[GSYM
top_of_metric_unions];
CONJ_TAC;
REWRITE_TAC[SUBSET;
in_preimage];
MESON_TAC[];
GEN_TAC;
DISCH_THEN (fun t -> ASSUME_TAC t THEN (MP_TAC (REWRITE_RULE[
in_preimage] t)));
DISCH_ALL_TAC;
SUBGOAL_TAC `?eps. (&.0 <. eps) /\ (open_ball(Y,dY) ((f:A->B) a) eps SUBSET v)`;
UNDISCH_FIND_TAC `v IN top_of_metric (Y,dY)`;
REWRITE_TAC[IN];
ASM_SIMP_TAC[
top_of_metric_nbd];
DISCH_THEN CHOOSE_TAC;
FIRST_ASSUM (fun t -> MP_TAC (SPEC `a:A` t));
REWRITE_TAC[metric_continuous_pt];
DISCH_THEN (fun t-> MP_TAC (SPEC `eps:real` t));
DISCH_THEN (CHOOSE_THEN MP_TAC);
ASM_REWRITE_TAC[];
DISCH_ALL_TAC;
EXISTS_TAC `delta:real`;
ASM_REWRITE_TAC[SUBSET];
REWRITE_TAC[
in_preimage;open_ball];
REWRITE_TAC[IN_ELIM_THM'];
X_GEN_TAC `y:A`;
DISCH_ALL_TAC;
CONJ_TAC THENL [(ASM_REWRITE_TAC[IN]);ALL_TAC];
FIRST_ASSUM (fun t -> (MP_TAC (SPEC `y:A` t)));
ASM_REWRITE_TAC[IN];
UNDISCH_FIND_TAC `open_ball`;
REWRITE_TAC[open_ball];
DISCH_THEN (fun t -> (MP_TAC (CONJUNCT2 t)));
REWRITE_TAC[SUBSET];
DISCH_THEN (fun t-> (MP_TAC (SPEC `(f:A->B) y` t)));
ASM_REWRITE_TAC[IN_ELIM_THM'];
SUBGOAL_TAC `!x. (X x) ==> (Y ((f:A->B) x))`;
UNDISCH_FIND_TAC `IMAGE`;
REWRITE_TAC[SUBSET;IN_IMAGE];
NAME_CONFLICT_TAC;
ASM_MESON_TAC[IN];
ASM_MESON_TAC[IN];
]);;
(* }}} *)
let continuous_induced = prove_by_refinement(
`!(f:A->B) U V A. (topology_ V) /\ (continuous f U V) /\ (V A) ==>
(continuous f U (induced_top V A)) `,
(* {{{ proof *)
[
REWRITE_TAC[continuous;induced_top;IN_IMAGE;Q_ELIM_THM'' ];
ASM_MESON_TAC[
top_inter;IN ];
]);;
(* }}} *)
let metric_cont = prove_by_refinement(
`!U X d f. (metric_space(X,d)) /\ (topology_ U) ==>
((continuous (f:A->B) U (top_of_metric(X,d))) =
(!(x:B) r. U (preimage (UNIONS U) f (open_ball (X,d) x r))))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
EQ_TAC;
DISCH_ALL_TAC;
DISCH_ALL_TAC;
USE 2 (REWRITE_RULE[continuous;IN]);
UND 2 THEN (DISCH_THEN MATCH_MP_TAC );
ASM_MESON_TAC [
open_ball_open];
REWRITE_TAC[continuous;IN];
DISCH_ALL_TAC;
REWRITE_TAC[top_of_metric;IN_ELIM_THM' ];
DISCH_ALL_TAC;
CHO 3;
AND 3;
ASM_REWRITE_TAC[];
REWRITE_TAC[
preimage_unions];
IMATCH_MP_TAC
top_unions ;
ASM_REWRITE_TAC[IMAGE;SUBSET;IN;IN_ELIM_THM' ];
NAME_CONFLICT_TAC;
REWRITE_TAC[Q_ELIM_THM'];
USE 4 (REWRITE_RULE[SUBSET;IN]);
DISCH_ALL_TAC;
TYPE_THEN `x'` (USE 4 o SPEC);
REWR 4;
USE 4 (REWRITE_RULE[open_balls;IN_ELIM_THM' ]);
CHO 4;
CHO 4;
ASM_MESON_TAC[];
]);;
(* }}} *)
let continuous_sum = prove_by_refinement(
`!U (f:A->(num->real)) g n. (topology_ U) /\
(continuous f U (top_of_metric(euclid n,d_euclid))) /\
(continuous g U (top_of_metric(euclid n,d_euclid))) /\
(IMAGE f (UNIONS U) SUBSET (euclid n)) /\
(IMAGE g (UNIONS U) SUBSET (euclid n)) ==>
(continuous (\t. (f t + g t)) U (top_of_metric(euclid n,d_euclid)))`,
(* {{{ proof *)
[
ASSUME_TAC
metric_euclid;
DISCH_ALL_TAC;
ASM_SIMP_TAC[
metric_cont];
DISCH_ALL_TAC;
ONCE_ASM_SIMP_TAC[
open_nbd];
X_GEN_TAC `t:A`;
RIGHT_TAC "B";
DISCH_ALL_TAC;
USE 6 (REWRITE_RULE[REWRITE_RULE[IN] in_preimage]);
USE 2 (REWRITE_RULE[continuous]);
USE 3 (REWRITE_RULE[continuous]);
AND 6;
TYPE_THEN `n` (USE 0 o SPEC);
COPY 0;
JOIN 8 6;
USE 6 (MATCH_MP (REWRITE_RULE[IN] open_ball_center));
CHO 6;
AND 6;
TYPE_THEN `open_ball(euclid n,d_euclid) (f t) (r'/(&.2))` (USE 2 o SPEC);
TYPE_THEN `open_ball(euclid n,d_euclid) (g t) (r'/(&.2))` (USE 3 o SPEC);
UND 3;
UND 2;
REWRITE_TAC[IN];
ASM_SIMP_TAC[open_ball_open];
DISCH_ALL_TAC;
TYPE_THEN `B = (preimage (UNIONS U) f (open_ball (euclid n,d_euclid) (f t) (r' / &2))) INTER (preimage (UNIONS U) g (open_ball (euclid n,d_euclid) (g t) (r' / &2)))` ABBREV_TAC ;
TYPE_THEN `B` EXISTS_TAC;
CONJ_TAC;
(* cs1 *)
USE 6 (MATCH_MP preimage_subset );
TYPEL_THEN [`(\t. euclid_plus (f t) (g t))`;`UNIONS U`] (USE 6 o ISPECL);
UND 6;
IMATCH_MP_TAC (prove_by_refinement(`!D B C. ((B:A->bool) SUBSET D) ==> ((D SUBSET C) ==> (B SUBSET C))`,[MESON_TAC [SUBSET_TRANS]]));
REWRITE_TAC[subset_preimage];
CONJ_TAC;
REWRITE_TAC[SUBSET;IN;IN_ELIM_THM'];
EXPAND_TAC "B";
REWRITE_TAC[INTER;in_preimage;IN ;IN_ELIM_THM' ];
ASM_MESON_TAC[];
REWRITE_TAC[IMAGE;SUBSET;IN;IN_ELIM_THM'];
REWRITE_TAC[Q_ELIM_THM'];
EXPAND_TAC "B";
REWRITE_TAC[INTER;in_preimage;IN ;IN_ELIM_THM' ];
REWRITE_TAC[open_ball;IN_ELIM_THM' ];
DISCH_ALL_TAC;
ASM_SIMP_TAC[euclid_add_closure];
TYPE_THEN `d_euclid (f t + (g t)) (f x' + g x') <=. (d_euclid (f t + (g t)) (f x' + g t)) + (d_euclid (f x' + g t) (f x' + g x'))` SUBGOAL_TAC;
TYPEL_THEN [`euclid n`;`d_euclid`] (fun t-> ASSUME_TAC (ISPECL t metric_space_triangle));
REWR 17;
UND 17 THEN DISCH_THEN IMATCH_MP_TAC ;
ASM_SIMP_TAC[euclid_add_closure];
IMATCH_MP_TAC (REAL_ARITH `b + C < d ==> (a <= b + C ==> (a < d))`);
(* cs2 *)
IMATCH_MP_TAC real_half_LT;
CONJ_TAC;
ASM_MESON_TAC [euclid_add_closure;SPEC `n:num` metric_translate];
ASM_MESON_TAC[euclid_add_closure;metric_translate_LEFT];
CONJ_TAC;
EXPAND_TAC "B";
REWRITE_TAC[INTER;in_preimage ;IN_ELIM_THM];
ASM_REWRITE_TAC[IN];
UND 4;
UND 5;
REWRITE_TAC[SUBSET;IN;IN_IMAGE ;IN_ELIM_THM'];
NAME_CONFLICT_TAC;
REWRITE_TAC[Q_ELIM_THM''];
USE 8 (ONCE_REWRITE_RULE [GSYM REAL_LT_HALF1]);
ASM_MESON_TAC[REWRITE_RULE[IN] open_ball_nonempty];
EXPAND_TAC "B";
IMATCH_MP_TAC top_inter;
ASM_REWRITE_TAC[];
]);;
(* }}} *)
(* ------------------------------------------------------------------ *)
(* Cauchy sequences and completeness *)
(* ------------------------------------------------------------------ *)
let sequence = euclid_def
`sequence X (f:num->A) <=> (IMAGE f UNIV) SUBSET X`;;
let converge = euclid_def
`converge (X,d) (f:num -> A) <=> (?x. (x IN (X:A->bool)) /\
(!eps. ?n. (&.0 <. eps) ==>
(!i. (n <=| i) ==> (d x (f i) <. eps))))`;;
let cauchy_seq = euclid_def
`cauchy_seq (X,d) (f:num->A) <=> (sequence X f) /\
(!eps. ?n. !i j. (&.0 <. eps) /\
(n <= i) /\ (n <= j) ==> (d (f i) (f j) <. eps))`;;
let complete = euclid_def
`complete (X,d) <=> !(f:num->A). cauchy_seq (X,d) f ==>
converge (X,d) f`;;
let converge_cauchy = prove_by_refinement(
`!X d f. metric_space(X,d) /\ (sequence X f) /\ (converge((X:A->bool),d) f)
==> cauchy_seq(X,d) f`,
(* {{{ proof *)
[
REWRITE_TAC[converge;metric_space];
DISCH_ALL_TAC;
REWRITE_TAC[cauchy_seq];
ASM_REWRITE_TAC[];
FIRST_ASSUM CHOOSE_TAC;
GEN_TAC;
UNDISCH_FIND_TAC `(IN)`;
DISCH_ALL_TAC;
FIRST_ASSUM (fun t-> MP_TAC (SPEC `eps/(&.2)` t));
DISCH_THEN CHOOSE_TAC;
EXISTS_TAC `n:num`;
REPEAT GEN_TAC;
DISCH_ALL_TAC;
SUBGOAL_TAC ` (&.0 <. (eps/(&.2)))`;
MATCH_MP_TAC REAL_LT_DIV;
ASM_REWRITE_TAC[];
REAL_ARITH_TAC;
DISCH_THEN (ANTE_RES_THEN ASSUME_TAC);
UNDISCH_TAC `n <=| i`;
DISCH_THEN (ANTE_RES_THEN ASSUME_TAC);
UNDISCH_TAC `n <=| j`;
DISCH_THEN (ANTE_RES_THEN ASSUME_TAC);
FIRST_ASSUM (fun t-> MP_TAC (SPECL [`(f:num->A) i`;`x:A`;`(f:num->A) j`] t));
UNDISCH_FIND_TAC `sequence`;
REWRITE_TAC[sequence;SUBSET;IN_IMAGE;IN_UNIV];
NAME_CONFLICT_TAC;
REWRITE_TAC[IN];
DISCH_TAC;
SUBGOAL_TAC `X ((f:num->A) i) /\ X x /\ X (f j)`;
ASM_MESON_TAC[IN];
DISCH_THEN (fun t->REWRITE_TAC[t]);
DISCH_ALL_TAC;
ASM_MESON_TAC[REAL_LET_TRANS;REAL_LT_ADD2;REAL_HALF_DOUBLE];
]);;
(* }}} *)
(* relate the metric space version to the real numbers version *)
let cauchy_seq_cauchy = prove_by_refinement(
`!f. (cauchy_seq(euclid 1,d_euclid) f) ==> (cauchy (\x. (f x 0)))`,
(* {{{ proof *)
[
GEN_TAC;
REWRITE_TAC[cauchy_seq;cauchy;sequence;SUBSET;IN_IMAGE;IN_UNIV];
REWRITE_TAC[IN];
NAME_CONFLICT_TAC;
DISCH_ALL_TAC;
GEN_TAC;
DISCH_TAC;
FIRST_ASSUM (fun t -> MP_TAC (SPEC `e':real` t));
DISCH_THEN CHOOSE_TAC;
EXISTS_TAC `n':num`;
REPEAT GEN_TAC;
REWRITE_TAC[ARITH_RULE `a >=| b <=> b <=| a`];
SUBGOAL_TAC `euclid 1 (f (m':num)) /\ euclid 1 (f (n'':num))`;
ASM_MESON_TAC[];
ASM_MESON_TAC[
euclid1_abs];
]);;
(* }}} *)
(* a variant of SEQ_CAUCHY *)
let complete_real = prove_by_refinement(
`complete (euclid 1,d_euclid)`,
(* {{{ proof *)
[
REWRITE_TAC[complete;converge];
GEN_TAC;
DISCH_THEN (fun t-> ASSUME_TAC t THEN MP_TAC t);
DISCH_THEN (fun t -> MP_TAC (MATCH_MP
cauchy_seq_cauchy t));
REWRITE_TAC[SEQ_CAUCHY;SEQ_LIM;tends_num_real;SEQ_TENDS];
ABBREV_TAC `z = lim (\x. f x 0)`;
REWRITE_TAC[MR1_DEF];
DISCH_TAC;
ABBREV_TAC `c = \j. (if (j=0) then (z:real) else (&.0))`;
EXISTS_TAC `(c:num->real)`;
SUBGOAL_TAC `c IN (euclid 1)`;
REWRITE_TAC[IN;euclid];
EXPAND_TAC "c";
GEN_TAC;
COND_CASES_TAC;
ASM_REWRITE_TAC[];
ARITH_TAC;
ARITH_TAC;
DISCH_TAC;
ASM_REWRITE_TAC[];
GEN_TAC;
REWRITE_TAC[GSYM RIGHT_IMP_EXISTS_THM];
DISCH_TAC;
FIRST_ASSUM (fun t-> (MP_TAC (SPEC `eps:real` t)));
FIRST_ASSUM (fun t-> REWRITE_TAC[t]);
DISCH_THEN CHOOSE_TAC;
EXISTS_TAC `N:num`;
GEN_TAC;
SUBGOAL_TAC `euclid 1 (f (i:num))`;
UNDISCH_FIND_TAC `cauchy_seq`;
REWRITE_TAC[cauchy_seq;sequence;SUBSET;IN_IMAGE;IN_UNIV];
DISCH_THEN (fun t-> MP_TAC (CONJUNCT1 t));
REWRITE_TAC[IN];
MESON_TAC[];
UNDISCH_FIND_TAC `(IN)`;
REWRITE_TAC[IN];
SIMP_TAC[euclid1_abs];
DISCH_ALL_TAC;
EXPAND_TAC "c";
COND_CASES_TAC;
ASM_MESON_TAC[ARITH_RULE `n >=| N <=> N <= n`];
ASM_MESON_TAC[];
]);;
(* }}} *)
let sequence_in = prove_by_refinement(
`!X (f:num->A) i. sequence X f ==> X (f i)`,
(* {{{ proof *)
[
REPEAT GEN_TAC;
REWRITE_TAC[sequence;SUBSET;IN_IMAGE;IN_UNIV];
REWRITE_TAC[IN];
MESON_TAC[];
]);;
(* }}} *)
let proj_cauchy = prove_by_refinement(
`!i f n. cauchy_seq (euclid n,d_euclid) f ==>
(cauchy_seq (euclid 1,d_euclid) ((proj i) o f))`,
(* {{{ proof *)
[
REWRITE_TAC[cauchy_seq];
DISCH_ALL_TAC;
SUBGOAL_TAC `sequence (euclid 1) (proj (i:num) o f)`;
REWRITE_TAC[sequence;SUBSET;IN_IMAGE;o_DEF;IN_UNIV];
NAME_CONFLICT_TAC;
MESON_TAC[IN;
proj_euclid1];
DISCH_TAC;
ASM_REWRITE_TAC[];
GEN_TAC;
FIRST_ASSUM (fun t -> CHOOSE_TAC (SPEC `eps:real` t));
EXISTS_TAC `n':num`;
DISCH_ALL_TAC;
FIRST_ASSUM (fun t-> MP_TAC(SPECL [`i':num`;`j:num`] t));
UNDISCH_FIND_THEN `d_euclid` (fun t-> ALL_TAC);
ASM_REWRITE_TAC[];
MATCH_MP_TAC (REAL_ARITH `a <=. b ==> (b <. eps ==> a <. eps)`);
REWRITE_TAC[o_DEF;
proj_d_euclid];
MATCH_MP_TAC
proj_contraction;
EXISTS_TAC `n:num`;
ASM_MESON_TAC[
sequence_in];
]);;
(* }}} *)
let complete_euclid = prove_by_refinement(
`!n. complete (euclid n,d_euclid)`,
(* {{{ proof *)
[
REWRITE_TAC[complete;IN];
REPEAT GEN_TAC;
DISCH_ALL_TAC;
IMP_RES_THEN MP_TAC
proj_cauchy;
DISCH_TAC;
SUBGOAL_TAC `!i. converge (euclid 1,d_euclid) (proj i o f)`;
GEN_TAC;
ASM_MESON_TAC[complete;
complete_real];
REWRITE_TAC[converge;IN];
DISCH_THEN (fun t-> MP_TAC (ONCE_REWRITE_RULE[SKOLEM_THM] t));
DISCH_THEN (X_CHOOSE_TAC `L:num->(num->real)`);
EXISTS_TAC `(\j. ((L:num->num->real) j 0))`;
SUBCONJ_TAC;
REWRITE_TAC[euclid];
GEN_TAC;
FIRST_ASSUM (fun t->(MP_TAC (SPEC `m:num` t)));
DISCH_ALL_TAC;
FIRST_ASSUM (fun t-> (MP_TAC (SPEC `abs((L:num->num->real) m 0)` t)));
DISCH_THEN CHOOSE_TAC;
PROOF_BY_CONTR_TAC;
ASSUME_TAC (REAL_ARITH `!x. ~(x=(&.0)) ==> (&.0 <. abs(x))`);
UNDISCH_FIND_TAC `d_euclid`;
ASM_SIMP_TAC[];
REWRITE_TAC[GSYM EXISTS_NOT_THM];
EXISTS_TAC `(n:num)+n'`;
REWRITE_TAC[o_DEF];
REWRITE_TAC[ARITH_RULE `n' <=| n+| n'`];
MATCH_MP_TAC(REAL_ARITH `(x = y) ==> ~(x<y)`);
ALL_TAC; (* #buffer "CE1"; *)
SUBGOAL_TAC `euclid 1 (proj m (f (n +| n')))`;
REWRITE_TAC[
proj_euclid1];
ASM_SIMP_TAC[
euclid1_abs];
DISCH_TAC;
MATCH_MP_TAC (REAL_ARITH `(&.0 = x) ==> (abs(u - x) = abs(u))`);
REWRITE_TAC[proj];
SUBGOAL_TAC `euclid n (f (n+| n'))`;
ASM_MESON_TAC[cauchy_seq;
sequence_in];
REWRITE_TAC[euclid];
DISCH_THEN (fun t-> ASM_SIMP_TAC[t]);
ALL_TAC; (* #buffer "CE2"; *)
DISCH_TAC;
GEN_TAC;
CONV_TAC (quant_right_CONV "n");
DISCH_TAC;
USE 2 (CONV_RULE (quant_left_CONV "eps"));
USE 2 (CONV_RULE (quant_left_CONV "eps"));
USE 2 (SPEC `eps/(&.1 +. &. n)`);
USE 2 (CONV_RULE (quant_left_CONV "n'"));
USE 2 (CONV_RULE (quant_left_CONV "n'"));
CHO 2;
SUBGOAL_TAC `&.0 <. eps/ (&.1 +. &.n)`;
MATCH_MP_TAC REAL_LT_DIV;
ASM_REWRITE_TAC[REAL_OF_NUM_ADD;REAL_OF_NUM_LT];
ARITH_TAC;
DISCH_THEN (fun t-> (USE 2 (REWRITE_RULE[t])));
SUBGOAL_TAC `!i j. euclid 1 ((proj i o f) (j:num))`;
ASM_MESON_TAC[cauchy_seq;
sequence_in];
DISCH_TAC;
SUBGOAL_TAC `!i. euclid n (f (i:num))`;
GEN_TAC;
ASM_MESON_TAC[cauchy_seq;
sequence_in];
DISCH_TAC;
ASM_SIMP_TAC[
d_euclid_n];
SUBGOAL_TAC `!(j:num). ?c. !i. (c <=| i) ==> ||. (L j 0 -. f i j) <. eps/(&.1 + &. n)`;
CONV_TAC (quant_left_CONV "c");
EXISTS_TAC `n':num->num`;
REPEAT GEN_TAC;
USE 2 ((SPEC `j:num`));
UND 2;
DISCH_ALL_TAC;
USE 8 (SPEC `i:num`);
UND 8;
ASM_REWRITE_TAC[];
ASM_SIMP_TAC[
euclid1_abs];
REWRITE_TAC[proj;o_DEF];
CONV_TAC (quant_left_CONV "c");
DISCH_THEN CHOOSE_TAC;
ABBREV_TAC `t = (\u. (if (u <| n) then (c u) else (0)))`;
SUBGOAL_TAC `?M. (!j. (t:num->num) j <=| M)`;
MATCH_MP_TAC
max_num_sequence;
EXISTS_TAC `n:num`;
GEN_TAC;
EXPAND_TAC "t";
COND_CASES_TAC;
ASM_MESON_TAC[ARITH_RULE `m <| n ==> ~(n <= m)`];
REWRITE_TAC[];
DISCH_THEN CHOOSE_TAC;
EXISTS_TAC `M:num`;
GEN_TAC;
ALL_TAC; (* #set "CE3"; *)
DISCH_TAC;
MATCH_MP_TAC REAL_POW_2_LT;
CONJ_TAC;
MATCH_MP_TAC SQRT_POS_LE;
REWRITE_TAC[REAL_SUM_SQUARE_POS];
CONJ_TAC;
UND 4;
REAL_ARITH_TAC;
SIMP_TAC[REAL_SUM_SQUARE_POS;SQRT_POW_2];
SUBGOAL_TAC `sum (0,n) (\i'. (L i' 0 - f (i:num) i') * (L i' 0 - f i i')) <=. sum (0,n) (\i'. (eps/(&.1 + &.n)) * (eps/(&.1 + &.n)))`;
MATCH_MP_TAC SUM_LE;
BETA_TAC;
GEN_TAC;
DISCH_ALL_TAC;
SUBGOAL_TAC `c (r:num) = (t:num->num) r`;
EXPAND_TAC "t";
COND_CASES_TAC;
REFL_TAC;
ASM_MESON_TAC[ARITH_RULE `n +| 0 = n`];
DISCH_TAC;
SUBGOAL_TAC `(abs (L r 0 - f (i:num) (r:num)) < eps/(&.1 + &.n))`;
USE 7 (SPECL [`r:num`;`i:num`]);
UND 7;
DISCH_THEN MATCH_MP_TAC;
ASM_REWRITE_TAC[];
USE 9 (SPEC `r:num`);
JOIN 7 10;
UND 7;
REWRITE_TAC[LE_TRANS];
ALL_TAC; (* "CE4" *)
ABBREV_TAC `b = eps/(&1 + &n)`;
ABBREV_TAC `a = (L r 0 - (f:num->num->real) i r)`;
REWRITE_TAC[GSYM REAL_POW_2];
REWRITE_TAC[GSYM REAL_LE_SQUARE_ABS];
REAL_ARITH_TAC;
MATCH_MP_TAC (REAL_ARITH `(b <. c) ==> ((a <=. b) ==> (a <. c))`);
REWRITE_TAC[SUM_CONST];
REWRITE_TAC[REAL_MUL_AC;real_div];
SUBGOAL_TAC `eps pow 2 = eps*eps*(&. 1)`;
REWRITE_TAC[REAL_POW_2];
REAL_ARITH_TAC;
DISCH_THEN (fun t->REWRITE_TAC[t]);
MATCH_MP_TAC REAL_PROP_LT_LMUL;
ASM_REWRITE_TAC[];
MATCH_MP_TAC REAL_PROP_LT_LMUL;
ASM_REWRITE_TAC[];
SUBGOAL_TAC `&.0 <. &.1 + &.n `;
REWRITE_TAC[REAL_OF_NUM_ADD;REAL_OF_NUM_LT];
ARITH_TAC;
ALL_TAC; (* "CE5" *)
SIMP_TAC[REAL_INV_LT];
DISCH_TAC;
REWRITE_TAC[REAL_OF_NUM_ADD;REAL_OF_NUM_LT;REAL_OF_NUM_MUL];
REWRITE_TAC[ARITH_RULE `(1+n)*(1+n)*1 = 1+n+n+n*n`];
MATCH_MP_TAC (ARITH_RULE `(0<=a)/\(0<=b) /\(0<1) ==> (a <| 1 + a + a + b)`);
CONJ_TAC;
ARITH_TAC;
CONJ_TAC;
ONCE_REWRITE_TAC [ARITH_RULE `0 = n *| 0`];
REWRITE_TAC[LE_MULT_LCANCEL];
ARITH_TAC;
ARITH_TAC;
]);;
(* }}} *)
(* }}} *)
(* }}} *)
let complete_closed = prove_by_refinement(
`!n S. (closed_ (top_of_metric (euclid n,d_euclid)) S) /\
(S SUBSET (euclid n)) ==>
(complete (S,d_euclid))`,
(* {{{ proof *)
[
REWRITE_TAC[complete];
REPEAT GEN_TAC;
DISCH_ALL_TAC;
GEN_TAC;
DISCH_TAC;
USE 0 (MATCH_MP
closed_open);
UND 0;
SIMP_TAC[GSYM
top_of_metric_unions;
metric_euclid];
DISCH_TAC;
SUBGOAL_TAC `cauchy_seq(euclid n,d_euclid) f`;
ASM_MESON_TAC[
subset_cauchy];
DISCH_TAC;
SUBGOAL_TAC `converge(euclid n,d_euclid) f`;
ASM_MESON_TAC[
complete_euclid;complete];
REWRITE_TAC[converge];
DISCH_THEN CHOOSE_TAC;
EXISTS_TAC `(x:num->real)`;
ASM_REWRITE_TAC[];
PROOF_BY_CONTR_TAC;
SUBGOAL_TAC `~(x IN S) ==> (x IN (euclid n DIFF S))`;
ASM SET_TAC[];
DISCH_TAC;
H_MATCH_MP (HYP "6") (HYP "5");
USE 0 (REWRITE_RULE[open_DEF]);
USE 0 (REWRITE_RULE[(MATCH_MP (CONV_RULE (quant_right_CONV "A")
top_of_metric_nbd) (SPEC `n:num`
metric_euclid))]);
USE 0 (CONV_RULE (quant_left_CONV "a"));
USE 0 (SPEC `x:num->real`);
UND 0;
ASM_REWRITE_TAC[SUBSET_DIFF];
ALL_TAC; (* #CC1; *)
PROOF_BY_CONTR_TAC;
USE 0 (REWRITE_RULE[]);
CHO 0;
USE 0 (REWRITE_RULE[SUBSET;IN_ELIM_THM';
open_ball]);
AND 0;
AND 4;
USE 4 (SPEC `r:real`);
CHO 4;
H_MATCH_MP (HYP "4") (HYP "8");
USE 10 (SPEC `n':num`);
USE 10 (REWRITE_RULE[ARITH_RULE `n <=| n`]);
USE 0 (SPEC `(f:num->num->real) n'`);
UND 0;
USE 9 (REWRITE_RULE[IN]);
ASM_REWRITE_TAC[];
SUBGOAL_TAC `(S:(num->real)->bool) ((f:num->num->real) n')`;
ASM_MESON_TAC[cauchy_seq;sequence_in];
UND 1;
ABBREV_TAC `X = euclid n`;
ABBREV_TAC `a = (f:num->num->real) n'`;
REWRITE_TAC[IN_DIFF];
REWRITE_TAC[IN;SUBSET];
ASM_MESON_TAC[];
]);;
(* }}} *)
(* ------------------------------------------------------------------ *)
(* Totally bounded metric spaces *)
(* ------------------------------------------------------------------ *)
let totally_bounded = euclid_def `totally_bounded ((X:A->bool),d) =
(!eps. ?B. (&.0 <. eps) ==>
(FINITE B) /\
(!b. (B b) ==> ?x. b = open_ball(X,d) x eps) /\
(X = UNIONS B))`;;
let totally_bounded_subset = prove_by_refinement(
`!(X:A->bool) d S. (metric_space (X,d)) /\ (totally_bounded(X,d))
/\ (S SUBSET X) ==>
(totally_bounded (S,d)) `,
(* {{{ proof *)
[
REPEAT GEN_TAC;
REWRITE_TAC[totally_bounded];
DISCH_ALL_TAC;
GEN_TAC;
USE 1 (SPEC `eps/(&.2)`);
CHO 1;
CONV_TAC (quant_right_CONV "B");
DISCH_TAC;
SUBGOAL_TAC `&.0 <. eps ==> &.0 <. eps/(&.2)`;
DISCH_THEN (fun t-> MP_TAC (ONCE_REWRITE_RULE[GSYM REAL_HALF_DOUBLE] t));
REWRITE_TAC[REAL_DIV_LZERO];
REAL_ARITH_TAC;
ASM_REWRITE_TAC[];
DISCH_TAC;
(UND 1) THEN (ASM_REWRITE_TAC[]) THEN DISCH_ALL_TAC;
SUBGOAL_TAC `!b. ?s. (?t. (t IN (b:A->bool) INTER S)) ==> (s IN b INTER S)`;
GEN_TAC;
CONV_TAC (quant_left_CONV "t");
MESON_TAC[IN];
CONV_TAC (quant_left_CONV "s");
DISCH_THEN CHOOSE_TAC;
ALL_TAC; (* #set "TB1"; *)
EXISTS_TAC `IMAGE (\c. (open_ball ((S:A->bool),d) ((s) c) eps)) (B:(A->bool)->bool)`;
CONJ_TAC;
MATCH_MP_TAC FINITE_IMAGE;
ASM_REWRITE_TAC[];
CONJ_TAC;
GEN_TAC;
REWRITE_TAC[IMAGE;IN_ELIM_THM'];
NAME_CONFLICT_TAC;
DISCH_THEN (X_CHOOSE_TAC `c:A->bool`);
ASM_MESON_TAC[];
MATCH_MP_TAC EQ_EXT;
X_GEN_TAC `u:A`;
EQ_TAC;
DISCH_TAC;
SUBGOAL_TAC `(X:A->bool) (u:A)`;
ASM_MESON_TAC[SUBSET;IN];
ASM_REWRITE_TAC[];
REWRITE_TAC[REWRITE_RULE[IN] IN_UNIONS];
DISCH_THEN (X_CHOOSE_TAC `b':A->bool`);
USE 7 (SPEC `b':A->bool`);
REWRITE_TAC[IMAGE];
REWRITE_TAC[IN_ELIM_THM'];
CONV_TAC (quant_left_CONV "x");
CONV_TAC (quant_left_CONV "x");
EXISTS_TAC `b':A->bool`;
EXISTS_TAC `open_ball((S:A->bool),d) (s (b':A->bool)) eps`;
ASM_REWRITE_TAC[IN];
REWRITE_TAC[open_ball];
REWRITE_TAC[IN_ELIM_THM'];
ALL_TAC; (* #set "TB2"; *)
SUBGOAL_TAC `(u:A) IN (b' INTER S)`;
REWRITE_TAC[IN_INTER];
ASM_MESON_TAC[IN];
UND 7;
CONV_TAC (quant_left_CONV "t");
CONV_TAC (quant_left_CONV "t");
EXISTS_TAC `u:A`;
DISCH_TAC;
DISCH_TAC;
SUBGOAL_TAC `(S:A->bool) ((s:(A->bool)->A) b')`;
UND 7;
ASM_REWRITE_TAC[];
REWRITE_TAC[IN_INTER];
MESON_TAC[IN];
DISCH_TAC;
ASM_REWRITE_TAC[];
SUBGOAL_TAC `(b':A->bool) ((s:(A->bool)->A) b')`;
UND 11;
UND 7;
REWRITE_TAC[IN_INTER];
ASM_MESON_TAC[IN];
ALL_TAC; (* #set "TB3"; *)
DISCH_TAC;
AND 9;
USE 5 (SPEC `b':A->bool`);
H_MATCH_MP (HYP "5") (HYP "13");
CHO 14;
ABBREV_TAC `v = (s:(A->bool)->A) b'`;
COPY 9;
UND 9;
UND 12;
ASM_REWRITE_TAC[];
REWRITE_TAC[open_ball;IN_ELIM_THM'];
DISCH_ALL_TAC;
SUBGOAL_TAC `(X x) /\ ((X:A->bool) u) /\ (X v)`;
ASM_REWRITE_TAC[];
ASM_MESON_TAC[SUBSET;IN];
DISCH_ALL_TAC;
USE 0 (REWRITE_RULE[metric_space]);
COPY 16;
KILL 1;
KILL 7;
KILL 11;
UND 21;
KILL 6;
UND 14;
DISCH_THEN (fun t-> ASSUME_TAC t THEN (REWRITE_TAC[t]));
REWRITE_TAC[open_ball;IN_ELIM_THM'];
DISCH_ALL_TAC;
USE 0 (SPECL [`v:A`;`x:A`;`u:A`]);
UND 0;
ASM_REWRITE_TAC[];
DISCH_ALL_TAC;
USE 22 (MATCH_MP (REAL_ARITH `(a <=. b + c) ==> !e. (b + c <. e ==> (a <. e))`));
USE 22 (SPEC `eps:real`);
UND 22 THEN (DISCH_THEN (MATCH_MP_TAC));
ASM_REWRITE_TAC[];
UND 11;
UND 17;
MP_TAC (SPEC `eps:real` REAL_HALF_DOUBLE);
REAL_ARITH_TAC;
REWRITE_TAC[IMAGE;IN_ELIM_THM'];
REWRITE_TAC[UNIONS;IN_ELIM_THM'];
CONV_TAC (quant_left_CONV "x");
CONV_TAC (quant_left_CONV "x");
NAME_CONFLICT_TAC;
CONV_TAC (quant_left_CONV "x'");
X_GEN_TAC `c:A->bool`;
CONV_TAC (quant_left_CONV "u'");
GEN_TAC;
DISCH_ALL_TAC;
UND 10;
ASM_REWRITE_TAC[];
REWRITE_TAC[open_ball;IN_ELIM_THM'];
MESON_TAC[];
]);;
(* }}} *)
let integer_cube_finite = prove_by_refinement(
`!n N. FINITE { f | (euclid n f) /\
(!i. (?j. (abs(f i) = &.j) /\ (j <=| N)))}`,
(* {{{ proof *)
[
REP_GEN_TAC;
ABBREV_TAC `fs =
FUN {m | m <| n} {x | ?j. (abs x = &.j) /\ (j <=| N)}`;
ABBREV_TAC `gs = { f | (euclid n f) /\ (!i. (?j. (abs(f i) = &.j) /\ (j <=| N)))}`;
SUBGOAL_TAC `FINITE (fs:(num->real)->bool)`;
EXPAND_TAC "fs";
MP_TAC(prove(`!(a:num->bool) (b:real->bool). FINITE a /\ FINITE b ==> (FINITE (FUN a b))`,MESON_TAC[HAS_SIZE;FUN_SIZE]));
DISCH_THEN MATCH_MP_TAC;
REWRITE_TAC[interval_finite;FINITE_NUMSEG_LT];
DISCH_TAC;
ABBREV_TAC `G = (\ u. (\ j. if (n <=| j) then (&.0) else (u j)))`;
SUBGOAL_TAC `FINITE { y | ?x. x IN fs /\ (y:(num->real) = G (x:num->real))}`;
MATCH_MP_TAC FINITE_IMAGE_EXPAND;
ASM_REWRITE_TAC[];
SUBGOAL_TAC `!a b. ((a:(num->real)->bool) = b) ==> (FINITE a ==> FINITE b)`;
REP_GEN_TAC;
DISCH_THEN (fun t-> REWRITE_TAC[t]);
DISCH_THEN (fun t-> MATCH_MP_TAC t);
MATCH_MP_TAC EQ_EXT;
GEN_TAC;
EXPAND_TAC "gs";
REWRITE_TAC[IN_ELIM_THM'];
EXPAND_TAC "fs";
REWRITE_TAC[FUN;IN_ELIM_THM'];
NAME_CONFLICT_TAC;
EQ_TAC;
DISCH_THEN (CHOOSE_TAC );
SUBGOAL_TAC `euclid n x`;
REWRITE_TAC[euclid];
GEN_TAC;
AND 4;
UND 4;
EXPAND_TAC "G";
DISCH_THEN (fun t->REWRITE_TAC[t]);
DISCH_THEN (fun t->REWRITE_TAC[t]);
DISCH_TAC THEN (ASM_REWRITE_TAC[]);
GEN_TAC;
AND 4;
EXPAND_TAC "G";
COND_CASES_TAC;
REDUCE_TAC;
EXISTS_TAC `0`;
REDUCE_TAC;
AND 6;
USE 8 (SPEC `i':num`);
ASM_MESON_TAC[ARITH_RULE `~(n <=| i') ==> (i' <| n)`];
DISCH_ALL_TAC;
EXISTS_TAC `\p. (if (p <| n) then ((x:num->real) p) else (CHOICE UNIV))`;
CONJ_TAC;
REWRITE_TAC[SUPP;SUBSET;IN_ELIM_THM'];
NAME_CONFLICT_TAC;
CONJ_TAC;
GEN_TAC;
DISCH_THEN (fun t->REWRITE_TAC[t]);
UND 5;
MESON_TAC[];
GEN_TAC;
COND_CASES_TAC;
REWRITE_TAC[];
REWRITE_TAC[];
MATCH_MP_TAC EQ_EXT;
X_GEN_TAC `q:num`;
EXPAND_TAC "G";
COND_CASES_TAC;
ASM_MESON_TAC[euclid];
USE 6 (MATCH_MP (ARITH_RULE `~(n <=| q) ==> (q <| n)`));
ASM_REWRITE_TAC[];
]);;
(* }}} *)
let FINITE_scaled_lattice = prove_by_refinement(
`!n N s. (&.0 <. s) ==> FINITE {x | euclid n x /\ (!i. (?j. abs(x i) = s*(&.j)) /\ (abs(x i) <=. (&.N) ) ) }`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
ABBREV_TAC `map = ( *# ) s`;
ASSUME_TAC REAL_ARCH_SIMPLE;
USE 2 (SPEC `inv(s)*(&.N)`);
UND 2 THEN (DISCH_THEN (X_CHOOSE_TAC `M:num`));
ASSUME_TAC
integer_cube_finite;
USE 3 (SPECL [`n:num`;`M:num`]);
USE 3 (MATCH_MP (ISPEC `map:(num->real)->(num->real)` FINITE_IMAGE_EXPAND));
UND 3;
MATCH_MP_TAC (prove_by_refinement (`!a b. ((b:A->bool) SUBSET a) ==> (FINITE a ==> FINITE b)`,[MESON_TAC[FINITE_SUBSET]]));
REWRITE_TAC[SUBSET];
X_GEN_TAC `c:num->real`;
REWRITE_TAC[IN_ELIM_THM'];
EXPAND_TAC "map";
DISCH_ALL_TAC;
EXISTS_TAC `inv(s) *# c`;
REWRITE_TAC[euclid_scale_act];
ASM_SIMP_TAC[euclid_scale_closure];
WITH 0 (MATCH_MP (REAL_ARITH `&.0 < s ==> ~(s = &.0)`));
ASM_SIMP_TAC[REAL_MUL_RINV];
CONJ_TAC;
GEN_TAC;
USE 4 (SPEC `i:num`);
AND 4;
CHO 6;
REWRITE_TAC[euclid_scale;REAL_ABS_MUL;REAL_ABS_INV];
SUBGOAL_TAC `abs s = s`;
UND 0;
REAL_ARITH_TAC;
DISCH_THEN (fun t-> REWRITE_TAC[t]);
EXISTS_TAC `j:num`;
ALL_TAC; (* save_goal "C" *)
SUBCONJ_TAC;
ASM_REWRITE_TAC[];
UND 5;
REWRITE_TAC[GSYM (CONJUNCT1 (CONJUNCT2 (REAL_MUL_AC)))];
SIMP_TAC[REAL_MUL_LINV];
REAL_ARITH_TAC;
DISCH_TAC;
REWRITE_TAC[GSYM REAL_OF_NUM_LE];
USE 7 (GSYM);
UND 7 THEN DISCH_THEN (fun t-> REWRITE_TAC[t]);
USE 0 (MATCH_MP REAL_LT_INV);
ABBREV_TAC `s' = inv(s)`;
USE 0 (MATCH_MP (REAL_ARITH `&.0 < s' ==> &.0 <=. s'`));
JOIN 0 4;
USE 0 (MATCH_MP REAL_LE_LMUL);
JOIN 0 2;
UND 0;
REAL_ARITH_TAC;
REWRITE_TAC[euclid_scale_one];
]);;
(* }}} *)
let totally_bounded_cube = prove_by_refinement(
`!n N. totally_bounded
({x | euclid n x /\ (!i. abs(x i) <=. (&.N))},d_euclid)`,
(* {{{ proof *)
[
REP_GEN_TAC;
REWRITE_TAC[totally_bounded];
GEN_TAC;
CONV_TAC (quant_right_CONV "B");
DISCH_TAC;
ABBREV_TAC `cent = {x | euclid n x /\ (!i. (?j. abs(x i) = (eps/(&.n+. &.1))*(&.j)) /\ (abs(x i) <=. (&.N) ) ) }`;
SUBGOAL_TAC `&.0 <. (&.n +. &.1)`;
REDUCE_TAC;
ARITH_TAC;
DISCH_TAC;
ABBREV_TAC `s = eps/(&.n +. &.1)`;
SUBGOAL_TAC `&.0 < s`;
EXPAND_TAC "s";
ASM_SIMP_TAC[REAL_LT_DIV];
DISCH_TAC;
SUBGOAL_TAC `FINITE (cent:(num->real)->bool)`;
EXPAND_TAC "cent";
ASM_SIMP_TAC[FINITE_scaled_lattice];
DISCH_TAC;
ABBREV_TAC `cube = {x | euclid n x /\ (!i. abs(x i) <=. (&.N))}`;
EXISTS_TAC `IMAGE (\c. open_ball(cube,d_euclid) c eps) cent`;
SUBCONJ_TAC;
ASM_MESON_TAC[FINITE_IMAGE];
DISCH_TAC;
SUBCONJ_TAC;
GEN_TAC;
REWRITE_TAC[IMAGE;IN_ELIM_THM'];
ASM_MESON_TAC[];
DISCH_TAC;
ALL_TAC; (* # TB1; *)
SUBGOAL_TAC `cent SUBSET (cube:(num->real)->bool)`;
REWRITE_TAC[SUBSET];
EXPAND_TAC "cent";
EXPAND_TAC "cube";
REWRITE_TAC[IN_ELIM_THM'];
MESON_TAC[];
DISCH_TAC;
MATCH_MP_TAC EQ_EXT;
GEN_TAC;
EQ_TAC;
DISCH_TAC;
REWRITE_TAC[UNIONS;IN_IMAGE;IN_ELIM_THM'];
ASSUME_TAC REAL_ARCH_LEAST;
USE 11 (SPEC `s:real`);
UND 11 THEN (ASM_REWRITE_TAC[]) THEN DISCH_TAC;
USE 11 (CONV_RULE (quant_left_CONV "n"));
USE 11 (CONV_RULE (quant_left_CONV "n"));
UND 11 THEN (DISCH_THEN (X_CHOOSE_TAC `cs:real->num`));
NAME_CONFLICT_TAC;
CONV_TAC (quant_left_CONV "x'");
CONV_TAC (quant_left_CONV "x'");
ABBREV_TAC `cx = \ (i:num) . if (&.0 <=. (x i)) then &(cs (x i))* s else --. (&.(cs (--. (x i))) * s )`;
EXISTS_TAC `cx:num->real`;
EXISTS_TAC `open_ball(cube,d_euclid) cx eps`;
ASM_REWRITE_TAC[];
ALL_TAC; (* # TB2; *)
SUBGOAL_TAC `euclid n x`;
UND 10;
EXPAND_TAC "cube";
REWRITE_TAC[IN_ELIM_THM'];
MESON_TAC[];
DISCH_TAC;
SUBGOAL_TAC `cx IN (euclid n)`;
REWRITE_TAC[IN;euclid;];
DISCH_ALL_TAC;
EXPAND_TAC "cx";
UND 13;
REWRITE_TAC[euclid];
DISCH_THEN (fun t-> MP_TAC(SPEC `m:num` t));
ASM_REWRITE_TAC[];
DISCH_THEN (fun t-> REWRITE_TAC[t]);
REDUCE_TAC;
USE 11 (SPEC `&.0`);
UND 11;
REDUCE_TAC;
ABBREV_TAC `(a:num) = (cs (&.0))`;
SUBGOAL_TAC `&.0 <=. &.a *s`;
REWRITE_TAC[REAL_MUL_NN];
DISJ1_TAC;
REDUCE_TAC;
UND 4;
REAL_ARITH_TAC;
ABBREV_TAC `q = (&.a)*. s`;
REAL_ARITH_TAC;
DISCH_TAC;
ALL_TAC; (* # TB3; *)
SUBCONJ_TAC;
EXPAND_TAC "cent";
REWRITE_TAC[IN_ELIM_THM'];
USE 14 (REWRITE_RULE[IN]);
ASM_REWRITE_TAC[];
GEN_TAC;
EXPAND_TAC "cx";
BETA_TAC;
COND_CASES_TAC;
SUBCONJ_TAC;
EXISTS_TAC `((cs:real->num) (x (i:num)))`;
REWRITE_TAC[REAL_ABS_MUL];
REDUCE_TAC;
REWRITE_TAC[REAL_MUL_AC];
AP_THM_TAC;
AP_TERM_TAC;
UND 4;
REAL_ARITH_TAC;
DISCH_TAC;
ALL_TAC; (* # TB4; *)
SUBGOAL_TAC `(&.0 <=. &.(cs ((x:num->real) i)) * s)`;
REWRITE_TAC[REAL_MUL_NN];
DISJ1_TAC;
REDUCE_TAC;
UND 4 THEN REAL_ARITH_TAC;
DISCH_THEN (fun t-> MP_TAC (REWRITE_RULE[GSYM REAL_ABS_REFL] t));
DISCH_THEN (fun t-> REWRITE_TAC [t]);
USE 11 (SPEC `(x:num->real) i`);
UND 11;
ASM_REWRITE_TAC [];
UND 10;
EXPAND_TAC "cube";
REWRITE_TAC [IN_ELIM_THM'];
DISCH_THEN (fun t -> ASSUME_TAC (CONJUNCT2 t));
USE 10 (SPEC `i:num`);
UND 10;
ASSUME_TAC(prove(`&.0 <= x ==> (abs x = x)`,MESON_TAC[REAL_ABS_REFL]));
ASM_SIMP_TAC[];
MESON_TAC[REAL_LE_TRANS];
ALL_TAC ; (* #TB5; *)
REWRITE_TAC[REAL_ABS_NEG];
SUBCONJ_TAC;
EXISTS_TAC `((cs:real->num) (--. (x (i:num))))`;
REWRITE_TAC [REAL_ABS_MUL];
REDUCE_TAC;
ASSUME_TAC(prove(`&.0 <= x ==> (abs x = x)`,MESON_TAC[REAL_ABS_REFL]));
ASSUME_TAC(REAL_ARITH `&.0 < x ==> &. 0 <=. x`);
ASM_SIMP_TAC[];
REWRITE_TAC [REAL_MUL_AC];
DISCH_TAC;
USE 11 (SPEC `--. (x (i:num))`);
UND 11;
ASSUME_TAC (REAL_ARITH `!x. ~(&.0 <= x) ==> (&.0 <= --. x)`);
ASM_SIMP_TAC[];
UND 10;
EXPAND_TAC "cube";
REWRITE_TAC[IN_ELIM_THM'];
DISCH_THEN (fun t -> ASSUME_TAC (CONJUNCT2 t));
USE 10 (SPEC `i:num`);
UND 10;
MP_TAC(prove(`!v. (-- v <=. abs(v))`,REAL_ARITH_TAC));
REWRITE_TAC [REAL_ABS_MUL];
REDUCE_TAC;
ASSUME_TAC(prove(`&.0 <= x ==> (abs x = x)`,MESON_TAC[REAL_ABS_REFL]));
ASSUME_TAC(REAL_ARITH `&.0 < x ==> &. 0 <=. x`);
ASM_SIMP_TAC[];
MESON_TAC[REAL_LE_TRANS];
ALL_TAC; (* #TB6; *)
DISCH_TAC;
REWRITE_TAC[open_ball;IN_ELIM_THM'];
ASM_REWRITE_TAC[];
CONJ_TAC;
UND 15;
UND 9;
REWRITE_TAC[SUBSET;IN];
MESON_TAC[];
SUBGOAL_TAC `d_euclid cx x <= sqrt(&.n)*s`;
MATCH_MP_TAC D_EUCLID_BOUND;
USE 14 (REWRITE_RULE[IN]);
ASM_REWRITE_TAC[];
GEN_TAC;
EXPAND_TAC "cx";
BETA_TAC;
ASSUME_TAC (REAL_ARITH `!x a b. a <=. x /\ x <. b ==> abs(a - x) <= b -a`);
SUBGOAL_TAC `!x. &.0 <=. x ==> abs(&.(cs x)*.s -. x) <=. s`;
DISCH_ALL_TAC;
USE 11 (SPEC `x':real`);
H_MATCH_MP (HYP "11") (HYP "17");
H_MATCH_MP (HYP "16") (HYP "18");
USE 19 (REWRITE_RULE [GSYM REAL_SUB_RDISTRIB]);
ALL_TAC; (* # TB7; *)
USE 19 (CONV_RULE REDUCE_CONV);
ASM_REWRITE_TAC [];
DISCH_TAC;
COND_CASES_TAC;
ASM_MESON_TAC[];
REWRITE_TAC[REAL_ARITH `--x - y = --(x+.y)`;REAL_ABS_NEG];
REWRITE_TAC[REAL_ARITH `x+. y = (x -. (--. y))`];
ASM_MESON_TAC[REAL_ARITH `!u. ~(&.0 <=. u) ==> (&.0 <=. (--. u))`];
ALL_TAC; (* # TB8; *)
MATCH_MP_TAC(REAL_ARITH `b < c ==> ((a<=b) ==> (a < c))`);
EXPAND_TAC "s";
REWRITE_TAC[real_div;REAL_MUL_AC];
MATCH_MP_TAC(REAL_ARITH`(t < e *(&.1)) ==> (t <. e)`);
MATCH_MP_TAC (REAL_LT_LMUL);
ASM_REWRITE_TAC[];
ASSUME_TAC REAL_PROP_LT_LCANCEL ;
USE 16 (SPEC `&.n +. &.1`);
UND 16;
DISCH_THEN (MATCH_MP_TAC);
REDUCE_TAC;
SUBGOAL_TAC `~(&.(n+1) = &.0)`;
REDUCE_TAC;
ARITH_TAC;
REWRITE_TAC[REAL_ARITH`a*b*c = (a*b)*c`];
ALL_TAC; (* # TB8; *)
SIMP_TAC[REAL_MUL_RINV];
REDUCE_TAC;
DISCH_TAC;
CONJ_TAC;
ARITH_TAC;
SQUARE_TAC;
SUBCONJ_TAC;
MATCH_MP_TAC SQRT_POS_LE;
REDUCE_TAC;
DISCH_TAC;
SUBCONJ_TAC;
REDUCE_TAC;
DISCH_TAC;
SUBGOAL_TAC `&.0 <=. &.n`;
REDUCE_TAC;
SIMP_TAC[prove(`!x. (&.0 <=. x) ==> (sqrt(x) pow 2 = x)`,MESON_TAC[SQRT_POW2])];
DISCH_TAC;
REWRITE_TAC[REAL_POW_2];
REDUCE_TAC;
REWRITE_TAC[LEFT_ADD_DISTRIB;RIGHT_ADD_DISTRIB];
REDUCE_TAC;
ABBREV_TAC `m = n*|n +| n`;
ARITH_TAC;
ALL_TAC; (* # TB9; *)
REWRITE_TAC[UNIONS;IN_IMAGE;IN_ELIM_THM'];
DISCH_THEN CHOOSE_TAC;
AND 10;
CHO 11;
AND 11;
UND 10;
ASM_REWRITE_TAC[];
MP_TAC (ISPEC `cube:(num->real)->bool` open_ball_subset);
REWRITE_TAC[SUBSET];
REWRITE_TAC[IN];
MESON_TAC[];
]);;
(* }}} *)
let center_FINITE = prove_by_refinement(
`!X d . metric_space ((X:A->bool),d) /\ (totally_bounded (X,d))
==> (!eps. (&.0 < eps) ==> (?C. (C SUBSET X) /\ (FINITE C) /\ (X = UNIONS (IMAGE (\x. open_ball(X,d) x eps) C))))`,
(* {{{ proof *)
[
REWRITE_TAC[totally_bounded];
DISCH_ALL_TAC;
DISCH_ALL_TAC;
USE 1 (SPEC `eps:real`);
CHO 1;
REWR 1;
AND 1;
AND 1;
USE 4 (CONV_RULE ((quant_left_CONV "x")));
USE 4 (CONV_RULE ((quant_left_CONV "x")));
CHO 4;
ABBREV_TAC `C'={z | (X (z:A)) /\ (?b. (B (b:A->bool)) /\ (z = x b))}`;
EXISTS_TAC `C':A->bool`;
SUBCONJ_TAC;
EXPAND_TAC"C'";
REWRITE_TAC[SUBSET;IN_ELIM_THM'];
REWRITE_TAC[IN];
MESON_TAC[];
DISCH_TAC;
CONJ_TAC;
SUBGOAL_TAC `C' SUBSET (IMAGE (x:(A->bool)->A) B)`;
EXPAND_TAC"C'";
REWRITE_TAC[SUBSET;IN_IMAGE;IN_ELIM_THM'];
NAME_CONFLICT_TAC;
MESON_TAC[IN];
DISCH_TAC;
SUBGOAL_TAC `FINITE (IMAGE (x:(A->bool)->A) B)`;
ASM_MESON_TAC[FINITE_IMAGE];
ASM_MESON_TAC[FINITE_SUBSET];
ALL_TAC; (* #g1; *)
(ASM (GEN_REWRITE_TAC LAND_CONV)) [];
( (GEN_REWRITE_TAC LAND_CONV)) [UNIONS_DELETE];
AP_TERM_TAC;
MATCH_MP_TAC EQ_EXT;
GEN_TAC;
REWRITE_TAC[DELETE;IN_ELIM_THM';IMAGE];
EXPAND_TAC "C'";
REWRITE_TAC[IN_ELIM_THM'];
NAME_CONFLICT_TAC;
EQ_TAC;
DISCH_ALL_TAC;
USE 4 (SPEC `x':A->bool`);
CONV_TAC (quant_left_CONV "b'");
CONV_TAC (quant_left_CONV "b'");
CONV_TAC (quant_left_CONV "b'");
EXISTS_TAC `x':(A->bool)`;
EXISTS_TAC `(x:(A->bool)->A) x'`;
REWRITE_TAC[];
USE 7 (REWRITE_RULE[IN]);
H_MATCH_MP (HYP "4") (HYP"7");
ALL_TAC; (* #g2 *)
ABBREV_TAC `a = (x:(A->bool)->A) x'`;
KILL 1;
ASM_REWRITE_TAC[];
UND 8;
ASM_REWRITE_TAC[];
MESON_TAC[open_ball_empty;IN];
ALL_TAC; (* #g3 *)
DISCH_THEN CHOOSE_TAC;
UND 7;
DISCH_ALL_TAC;
CHO 8;
AND 8;
CONJ_TAC;
KILL 1;
ASM_REWRITE_TAC[];
KILL 9;
USE 4 (SPEC `b':A->bool`);
REWR 1;
ASM_MESON_TAC[IN];
KILL 1;
ASM_REWRITE_TAC[];
UND 7;
ASM_REWRITE_TAC[];
ABBREV_TAC `a = (x:(A->bool)->A) b'`;
DISCH_TAC;
JOIN 2 7;
JOIN 0 2;
USE 0 (MATCH_MP open_ball_nonempty);
UND 0;
ABBREV_TAC `E= open_ball(X,d) (a:A) eps `;
MESON_TAC[IN;EMPTY];
]);;
(* }}} *)
let open_ball_dist = prove_by_refinement(
`!X d x y r. (open_ball(X,d) x r y) ==> (d (x:A) y <. r)`,
(* {{{ proof *)
[
REWRITE_TAC[open_ball;IN_ELIM_THM'];
DISCH_ALL_TAC;
ASM_REWRITE_TAC[];
]);;
(* }}} *)
let totally_bounded_bounded = prove_by_refinement(
`!(X:A->bool) d. metric_space(X,d) /\ totally_bounded (X,d) ==>
(?a r. X SUBSET (open_ball(X,d) a r))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
COPY 0;
JOIN 0 1;
USE 0 (MATCH_MP
center_FINITE);
USE 0 (SPEC `&.1`);
USE 0 (CONV_RULE REDUCE_CONV);
CHO 0;
EXISTS_TAC `CHOICE (X:A->bool)`;
ASM_CASES_TAC `(X:A->bool) = EMPTY`;
ASM_REWRITE_TAC[EMPTY_SUBSET];
USE 1 (MATCH_MP CHOICE_DEF);
UND 0 THEN DISCH_ALL_TAC;
ABBREV_TAC `(dset:real->bool) = IMAGE (\c. (d (CHOICE (X:A->bool)) (c:A))) C`;
SUBGOAL_TAC `FINITE (dset:real->bool)`;
EXPAND_TAC"dset";
MATCH_MP_TAC FINITE_IMAGE;
ASM_REWRITE_TAC[];
DISCH_TAC;
USE 6 (MATCH_MP real_FINITE);
CHO 6;
EXISTS_TAC `a +. &.1`;
REWRITE_TAC[SUBSET];
GEN_TAC;
REWRITE_TAC[open_ball;IN_ELIM_THM'];
UND 1;
REWRITE_TAC[IN];
DISCH_ALL_TAC;
UND 4;
ASM_REWRITE_TAC[];
DISCH_TAC;
(* ASM (GEN_REWRITE_TAC LAND_CONV) []; *)
USE 4(REWRITE_RULE[UNIONS;IN_IMAGE;IN_ELIM_THM']);
USE 4(fun t -> AP_THM t `x:A`);
UND 1;
DISCH_THEN (fun t-> ((MP_TAC t) THEN (ASM_REWRITE_TAC[])) THEN ASSUME_TAC t);
DISCH_TAC;
USE 8 (REWRITE_RULE[IN_ELIM_THM']);
CHO 8;
AND 8;
USE 9 (CONV_RULE NAME_CONFLICT_CONV);
CHO 9;
ALL_TAC; (* # "tbb"; *)
REWR 8;
USE 8(REWRITE_RULE[IN]);
USE 8 (MATCH_MP open_ball_dist);
AND 9;
SUBGOAL_TAC `d (CHOICE (X:A->bool)) (x':A) IN (dset:real->bool)`;
EXPAND_TAC"dset";
REWRITE_TAC[IN_IMAGE];
ASM_MESON_TAC[];
DISCH_TAC;
H_MATCH_MP (HYP"6") (HYP"11");
USE 2 (REWRITE_RULE[metric_space]);
USE 2 (SPECL[`(CHOICE (X:A->bool))`;`(x':A)`;`x:A`]);
KILL 4;
REWR 2;
SUBGOAL_TAC `(X:A->bool) x'`;
UND 9;
UND 0;
SET_TAC[IN;SUBSET];
DISCH_TAC;
REWR 2;
UND 2 THEN DISCH_ALL_TAC;
UND 8;
UND 12;
UND 15;
ARITH_TAC;
]);;
(* }}} *)
let subsequence_rec = prove_by_refinement(
`!(X:A->bool) d f C s n r.
metric_space(X,d) /\ (totally_bounded(X,d)) /\ (sequence X f) /\
(C SUBSET X) /\ (&.0 < r) /\
(~FINITE{j| C (f j)} /\ C(f s) /\ (!x y. (C x /\ C y) ==>
d x y <. r*twopow(--: (&:n)))) ==>
(? C' s'. ((C' SUBSET C) /\ (s < s') /\
(~FINITE{j| C' (f j)} /\ C'(f s') /\ (!x y. (C' x /\ C' y) ==>
d x y <. r*twopow(--: (&:(SUC n)))))))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
USE 1 (REWRITE_RULE[totally_bounded]);
USE 1 (SPEC `r*twopow(--: (&:(n+| 2)))`);
CHO 1;
ASSUME_TAC
twopow_pos;
USE 8 (SPEC `--: (&: (n+| 2))`);
ALL_TAC; (* ## need a few lines here to match Z8 with Z1. *)
COPY 4;
JOIN 9 8;
USE 8 (MATCH_MP REAL_LT_MUL);
REWR 1;
UND 1 THEN DISCH_ALL_TAC;
ALL_TAC ; (* "sr1" OK TO HERE *)
ASSUME_TAC (ISPECL [`UNIV:num->bool`;`f:num->A`;`B:(A->bool)->bool`;`C:A->bool`]
INFINITE_PIGEONHOLE);
UND 11;
ASM_SIMP_TAC[UNIV];
H_REWRITE_RULE[HYP "10"] (HYP "3");
ASM_REWRITE_TAC [];
DISCH_THEN CHOOSE_TAC;
EXISTS_TAC `C INTER (b:A->bool)`;
CONV_TAC (quant_right_CONV "s'");
SUBCONJ_TAC;
REWRITE_TAC[INTER_SUBSET];
DISCH_TAC;
AND 12;
ASM_REWRITE_TAC[];
SUBGOAL_TAC `~(FINITE ({i | (C INTER b) ((f:num->A) i)} INTER {i | s <| i}))`;
PROOF_BY_CONTR_TAC;
(USE 15) (REWRITE_RULE[]);
USE 15 (MATCH_MP
num_above_finite);
UND 12;
ASM_REWRITE_TAC[];
DISCH_TAC;
ABBREV_TAC `J = ({i | (C INTER b) ((f:num->A) i)} INTER {i | s <| i})`;
EXISTS_TAC `CHOICE (J:num->bool)`; (* ok to here *)
SUBGOAL_TAC `J (CHOICE (J:num->bool))`;
MATCH_MP_TAC (REWRITE_RULE [IN] CHOICE_DEF);
PROOF_BY_CONTR_TAC;
USE 17 (REWRITE_RULE[]);
H_REWRITE_RULE[(HYP "17")] (HYP "15");
UND 18;
REWRITE_TAC[FINITE_RULES];
ALL_TAC; (* "sr2" *)
ABBREV_TAC `s' = (CHOICE (J:num->bool))`;
EXPAND_TAC "J";
REWRITE_TAC[INTER;IN_ELIM_THM'];
DISCH_ALL_TAC;
ASM_REWRITE_TAC[];
DISCH_ALL_TAC;
KILL 5 THEN (KILL 2) THEN (KILL 1) THEN (KILL 13) THEN (KILL 12);
SUBGOAL_TAC `(X x) /\ (X (y:A))`;
UND 21 THEN UND 23 THEN UND 3;
MESON_TAC[SUBSET;IN];
USE 9 (SPEC `b:A->bool`);
H_REWRITE_RULE[HYP "14"] (HYP "1");
CHO 2;
ALL_TAC; (* #"gg1" *)
JOIN 22 24;
JOIN 0 5;
H_REWRITE_RULE[(HYP "2")] (HYP "0");
USE 5 (REWRITE_RULE[IN]);
USE 5 (MATCH_MP BALL_DIST);
DISCH_ALL_TAC;
UND 5;
MATCH_MP_TAC (REAL_ARITH `(b = c) ==> ((a<. b) ==> (a<c))`);
ALL_TAC; (* insert here *)
REWRITE_TAC[REAL_MUL_ASSOC];
REWRITE_TAC[REAL_ARITH `&.2 *.r = r*. (&.2)`];
REWRITE_TAC[GSYM REAL_MUL_ASSOC];
REWRITE_TAC[REAL_EQ_LMUL];
USE 4 (MATCH_MP (REAL_ARITH `&.0 <. r ==> ~(r = &.0)`));
ASM_REWRITE_TAC[];
REWRITE_TAC[TWOPOW_NEG];
REWRITE_TAC[ARITH_RULE `(n+|2) = 1 + (SUC n)`];
REWRITE_TAC[REAL_POW_ADD;REAL_INV_MUL];
REWRITE_TAC [REAL_MUL_ASSOC];
REWRITE_TAC[REAL_INV2;REAL_POW_1];
REDUCE_TAC;
]);;
(* }}} *)
let sequence_subseq = prove_by_refinement(
`!(X:A->bool) f (ss:num->num). (sequence X f) ==>
(sequence X (f o ss))`,
(* {{{ proof *)
[
REWRITE_TAC[sequence;IMAGE;IN_UNIV;SUBSET;IN_ELIM_THM';
o_DEF];
REWRITE_TAC[IN];
MESON_TAC[];
]);;
(* }}} *)
let cauchy_subseq = prove_by_refinement(
`!(X:A->bool) d f. ((metric_space(X,d))/\(totally_bounded(X,d)) /\
(sequence X f)) ==>
(?ss. (subseq ss) /\ (cauchy_seq(X,d) (f o ss)))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
COPY 0 THEN COPY 1;
JOIN 4 3;
USE 3 (MATCH_MP
totally_bounded_bounded);
CHO 3;
CHO 3;
ALL_TAC; (* {{{ xxx *)
ALL_TAC; (* make r pos *)
ASSUME_TAC (REAL_ARITH `r <. (&.1 + abs(r))`);
ASSUME_TAC (REAL_ARITH `&.0 <. (&.1 + abs(r))`);
ABBREV_TAC (`r' = &.1 +. abs(r)`);
SUBGOAL_TAC `open_ball(X,d) a r SUBSET open_ball(X,d) (a:A) r'`;
ASM_SIMP_TAC[
open_ball_nest];
DISCH_TAC;
JOIN 3 7;
USE 3 (MATCH_MP SUBSET_TRANS);
KILL 6;
KILL 4;
ALL_TAC; (* "cs1" *)
SUBGOAL_TAC `( !(x:A) y. (X x) /\ (X y) ==> (d x y <. &.2 *. r'))`;
DISCH_ALL_TAC;
USE 3 (REWRITE_RULE[SUBSET;IN]);
COPY 3;
USE 7 (SPEC `x:A`);
USE 3 (SPEC `y:A`);
H_MATCH_MP (HYP "3") (HYP "6");
H_MATCH_MP (HYP "7") (HYP "4");
JOIN 9 8;
JOIN 0 8;
USE 0 (MATCH_MP
BALL_DIST);
ASM_REWRITE_TAC[];
DISCH_TAC;
ABBREV_TAC `cond = (\ ((C:A->bool),(s:num)) n. ~FINITE{j| C (f j)} /\ (C(f s)) /\ (!x y. (C x /\ C y) ==> d x y <. (&.2*.r')*. twopow(--: (&:n))))`;
ABBREV_TAC `R = (&.2)*r'`;
ALL_TAC ; (* 0 case of recursio *)
ALL_TAC; (* cs2 *)
SUBGOAL_TAC ` (X SUBSET X) /\ (cond ((X:A->bool),0) 0)`;
REWRITE_TAC[SUBSET_REFL];
EXPAND_TAC "cond";
CONV_TAC (TOP_DEPTH_CONV GEN_BETA_CONV);
USE 2 (REWRITE_RULE[sequence;SUBSET;IN_IMAGE;IN_UNIV]);
USE 2 (REWRITE_RULE[IN]);
USE 2 (CONV_RULE (NAME_CONFLICT_CONV));
SUBGOAL_TAC `!x. X((f:num->A) x)`;
ASM_MESON_TAC[];
REDUCE_TAC;
REWRITE_TAC[TWOPOW_0] THEN REDUCE_TAC;
ASM_REWRITE_TAC[];
DISCH_TAC;
SUBGOAL_TAC `{ j | (X:A->bool) (f j) } = (UNIV:num->bool)`;
MATCH_MP_TAC EQ_EXT;
REWRITE_TAC[IN_ELIM_THM;UNIV];
ASM_REWRITE_TAC[];
DISCH_THEN REWRT_TAC;
ASM_REWRITE_TAC[];
REWRITE_TAC[num_infinite];
ALL_TAC; (* #save_goal "cs3" *)
SUBGOAL_TAC `&.0 <. R`;
EXPAND_TAC "R";
UND 5;
REAL_ARITH_TAC;
DISCH_ALL_TAC;
SUBGOAL_TAC `!cs n. ?cs' . (FST cs SUBSET X) /\ (cond cs n)==>( (FST cs' SUBSET (FST cs)) /\(SND cs <| ((SND:((A->bool)#num)->num) cs') /\ (cond cs' (SUC n))) )`;
DISCH_ALL_TAC;
CONV_TAC (quant_right_CONV "cs'");
DISCH_TAC;
AND 11;
H_REWRITE_RULE[GSYM o (HYP "6")] (HYP "11");
USE 13 (CONV_RULE (SUBS_CONV[GSYM(ISPEC `cs:(A->bool)#num` PAIR)]));
USE 13 (CONV_RULE (TOP_DEPTH_CONV GEN_BETA_CONV));
JOIN 10 13;
JOIN 12 10;
JOIN 2 10;
JOIN 1 2;
JOIN 0 1;
USE 0 (MATCH_MP subsequence_rec);
CHO 0;
CHO 0;
EXISTS_TAC `(C':A->bool,s':num)`;
ASM_REWRITE_TAC[FST;SND];
EXPAND_TAC "cond";
(CONV_TAC (TOP_DEPTH_CONV GEN_BETA_CONV));
ASM_REWRITE_TAC[];
DISCH_TAC;
ALL_TAC; (* "cs4" *)
USE 11 (REWRITE_RULE[SKOLEM_THM]);
CHO 11;
ASSUME_TAC (ISPECL[`((X:A->bool),0)`;`cs':(((A->bool)#num)->(num->(A->bool)#num))`] num_RECURSION);
CHO 12;
EXISTS_TAC `\i. (SND ((fn : num->(A->bool)#num) i))`;
USE 11 (CONV_RULE (quant_left_CONV "n"));
USE 11 (SPEC `n:num`);
USE 11 (SPEC `(fn:num->(A->bool)#num) n`);
AND 12;
H_REWRITE_RULE[GSYM o (HYP "12")] (HYP "11");
USE 14 (GEN_ALL);
ABBREV_TAC `sn = (\i. SND ((fn:num->(A->bool)#num) i))`;
ABBREV_TAC `Cn = (\i. FST ((fn:num->(A->bool)#num) i))`;
SUBGOAL_TAC `((sn:num->num) 0 = 0) /\ (Cn 0 = (X:A->bool))`;
EXPAND_TAC "sn";
EXPAND_TAC "Cn";
UND 13;
MESON_TAC[FST;SND];
DISCH_TAC;
KILL 13;
KILL 11;
SUBGOAL_TAC `!(n:num). ((fn n):(A->bool)#num) = (Cn n,sn n)`;
EXPAND_TAC "sn";
EXPAND_TAC "Cn";
REWRITE_TAC[PAIR];
DISCH_TAC;
H_REWRITE_RULE[(HYP "11")] (HYP"14");
KILL 12;
KILL 14;
KILL 11;
KILL 16;
KILL 15;
ALL_TAC; (* }}} *)
ALL_TAC; (* KILL 10; cs4m *)
KILL 8;
KILL 7;
KILL 3;
KILL 5;
ALL_TAC; (* cs5 *)
TYPE_THEN `!n. (Cn n SUBSET X) /\ (cond (Cn n,sn n) n)` SUBGOAL_TAC;
INDUCT_TAC;
ASM_REWRITE_TAC[];
SET_TAC[SUBSET];
USE 13 (SPEC `n:num`);
REWR 5;
ASM_REWRITE_TAC[];
ASM_MESON_TAC[SUBSET_TRANS];
DISCH_TAC;
REWR 13;
SUBCONJ_TAC;
ASM_REWRITE_TAC[SUBSEQ_SUC];
DISCH_TAC;
ASM_REWRITE_TAC[cauchy_seq];
ASM_SIMP_TAC[sequence_subseq];
GEN_TAC;
TYPE_THEN `!i j. (i <=| j) ==> (Cn j SUBSET (Cn i))` SUBGOAL_TAC;
MATCH_MP_TAC SUBSET_SUC2;
ASM_REWRITE_TAC[];
DISCH_TAC;
ALL_TAC; (* cs6 *)
SUBGOAL_TAC `!R e. ?n. (&.0 <. R)/\ (&.0 <. e) ==> R*(twopow(--: (&:n))) <. e`;
DISCH_ALL_TAC;
REWRITE_TAC[TWOPOW_NEG]; (* cs6b *)
ASSUME_TAC (prove(`!n. &.0 < &.2 pow n`,REDUCE_TAC THEN ARITH_TAC));
ONCE_REWRITE_TAC[REAL_MUL_AC];
ASM_SIMP_TAC[REAL_INV_LT];
ASM_SIMP_TAC[GSYM REAL_LT_LDIV_EQ];
CONV_TAC (quant_right_CONV "n");
DISCH_ALL_TAC;
ASSUME_TAC (SPEC `R'/e` REAL_ARCH_SIMPLE);
CHO 14;
EXISTS_TAC `n:num`;
UND 14;
MESON_TAC[POW_2_LT;REAL_LET_TRANS];
DISCH_TAC;
USE 11 (SPECL [`R:real`;`eps:real`]);
CHO 11;
EXISTS_TAC `n:num`;
DISCH_ALL_TAC;
REWR 11;
ALL_TAC; (* cs7 *)
COPY 3;
USE 3 (SPEC `n:num`);
AND 3;
UND 3;
EXPAND_TAC "cond";
(CONV_TAC (TOP_DEPTH_CONV GEN_BETA_CONV));
DISCH_ALL_TAC;
COPY 15;
USE 15 (SPEC `i:num`);
AND 15;
UND 15;
EXPAND_TAC "cond";
(CONV_TAC (TOP_DEPTH_CONV GEN_BETA_CONV));
DISCH_ALL_TAC;
COPY 20;
USE 20 (SPEC `j:num`);
AND 20;
UND 20;
EXPAND_TAC "cond";
(CONV_TAC (TOP_DEPTH_CONV GEN_BETA_CONV));
DISCH_ALL_TAC;
ABBREV_TAC `e2 = R * twopow (--: (&:n))`;
REWRITE_TAC[o_DEF];
TYPEL_THEN [`f (sn i)`;`f (sn j)`] (fun t-> (USE 19 (SPECL t)));
KILL 27;
KILL 23;
KILL 25;
KILL 21;
KILL 16;
KILL 9;
KILL 6;
KILL 28;
COPY 8;
USE 8 (SPECL [`n:num`;`i:num`]);
USE 6 (SPECL [`n:num`;`j:num`]);
UND 11;
MATCH_MP_TAC (REAL_ARITH `(c < a) ==> ((a < b) ==> (c < b))`);
UND 19;
DISCH_THEN (MATCH_MP_TAC);
UND 6;
UND 8;
ASM_REWRITE_TAC[];
UND 22;
UND 26;
MESON_TAC[IN;SUBSET];
]);;
(* }}} *)
let convergent_subseq = prove_by_refinement(
`!(X:A->bool) d f. metric_space(X,d) /\ (totally_bounded(X,d)) /\
(complete (X,d)) /\ (sequence X f) ==>
((?(ss:num->num). (subseq ss) /\ (converge (X,d) (f o ss))))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
TYPE_THEN `?ss. (subseq ss) /\ (cauchy_seq(X,d) (f o ss))` SUBGOAL_TAC;
ASM_MESON_TAC[
cauchy_subseq];
DISCH_ALL_TAC;
CHO 4;
EXISTS_TAC `ss:num->num`;
USE 2 (REWRITE_RULE[complete]);
ASM_REWRITE_TAC[];
ASM_MESON_TAC[];
]);;
(* }}} *)
let dense = euclid_def `!U Z. dense U Z <=>
(closure U (Z:A->bool) = UNIONS U)`;;
let hausdorff = euclid_def `hausdorff U <=> (!x y.
(UNIONS U (x:A) /\ UNIONS U y /\ ~(x = y)) ==>
(?A B. (U A) /\ (U B) /\ (A x) /\ (B y) /\ (A INTER B = EMPTY)))`;;
(* }}} *)
let dense_open = prove_by_refinement(
`!U Z. (topology_ U) /\ (Z SUBSET (UNIONS U)) ==>
(dense U (Z:A->bool) <=>
(!A. (open_ U A) /\ ( (A INTER Z) = EMPTY) ==> (A = EMPTY)))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
EQ_TAC;
DISCH_TAC;
DISCH_ALL_TAC;
COPY 3;
COPY 0;
JOIN 0 3;
USE 0 (MATCH_MP (
open_closed));
TYPE_THEN `Z SUBSET (UNIONS U DIFF A)` SUBGOAL_TAC;
ALL_TAC ; (* do1 *)
REWRITE_TAC[
DIFF_SUBSET];
ONCE_REWRITE_TAC[INTER_COMM];
ASM_REWRITE_TAC[];
DISCH_TAC;
JOIN 0 3;
JOIN 6 0;
USE 0 (MATCH_MP
closure_subset);
USE 0 (REWRITE_RULE[
DIFF_SUBSET]);
AND 0;
USE 2 (REWRITE_RULE[dense]);
H_REWRITE_RULE [(HYP "2")] (HYP "0");
(USE 5 (REWRITE_RULE[open_DEF]));
USE 5 (MATCH_MP
sub_union);
USE 5 (REWRITE_RULE[ SUBSET_INTER_ABSORPTION]);
USE 5 (ONCE_REWRITE_RULE[INTER_COMM]);
ASM_MESON_TAC[];
REWRITE_TAC[dense];
DISCH_TAC ;
MATCH_MP_TAC EQ_SYM;
UND 0;
UND 1;
SIMP_TAC [
closure_open];
DISCH_TAC ;
SIMP_TAC[
closed_UNIV];
DISCH_TAC ;
DISCH_ALL_TAC;
DISCH_ALL_TAC;
USE 2 (SPEC `B:A->bool`);
REWR 2;
ASM_REWRITE_TAC[];
REWRITE_TAC[INTER_EMPTY];
]);;
(* }}} *)
let countable_dense = prove_by_refinement(
`!(X:A->bool) d. (metric_space(X,d)) /\ (totally_bounded(X,d)) ==>
?Z. (COUNTABLE Z) /\ (dense (top_of_metric(X,d)) Z)`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
TYPE_THEN `!r. ?z. (COUNTABLE z) /\ (z SUBSET X) /\ (X = UNIONS (IMAGE (\x. open_ball(X,d) x (twopow(--: (&:r)))) z))` SUBGOAL_TAC;
GEN_TAC;
COPY 0;
COPY 1;
JOIN 2 3;
USE 2 (MATCH_MP
center_FINITE);
USE 2 (SPEC `twopow (--: (&:r))`);
H_MATCH_MP (HYP "2") (THM (SPEC `(--: (&:r))`
twopow_pos));
X_CHO 3 `z:A->bool`;
EXISTS_TAC `z:A->bool`;
ASM_REWRITE_TAC[];
ASM_SIMP_TAC[
FINITE_COUNTABLE];
ASM_MESON_TAC[];
CONV_TAC (quant_left_CONV "z");
DISCH_THEN CHOOSE_TAC;
TYPE_THEN `UNIONS (IMAGE z (UNIV:num->bool))` EXISTS_TAC;
CONJ_TAC;
MATCH_MP_TAC
COUNTABLE_UNIONS;
CONJ_TAC;
MATCH_MP_TAC (ISPEC `UNIV:num->bool`
COUNTABLE_IMAGE);
REWRITE_TAC[
NUM_COUNTABLE];
TYPE_THEN `z` EXISTS_TAC ;
SET_TAC[];
GEN_TAC;
REWRITE_TAC[IN_IMAGE;IN_UNIV];
ASM_MESON_TAC[ ];
TYPE_THEN `U = top_of_metric (X,d)` ABBREV_TAC;
TYPE_THEN `Z = UNIONS (IMAGE z UNIV)` ABBREV_TAC;
TYPE_THEN `topology_ U /\ (Z SUBSET (UNIONS U))` SUBGOAL_TAC;
EXPAND_TAC "U";
KILL 3;
ASM_SIMP_TAC[top_of_metric_top;GSYM top_of_metric_unions];
EXPAND_TAC "Z";
MATCH_MP_TAC UNIONS_SUBSET;
REWRITE_TAC[IN_IMAGE;IN_UNIV];
ASM_MESON_TAC[];
SIMP_TAC[dense_open];
DISCH_ALL_TAC;
GEN_TAC;
REWRITE_TAC[open_DEF];
MATCH_MP_TAC (TAUT `( a /\ ~b ==> ~c) ==> (a /\ c ==> b)`);
EXPAND_TAC "U";
ASM_SIMP_TAC [top_of_metric_nbd];
REWRITE_TAC[GSYM MEMBER_NOT_EMPTY];
DISCH_ALL_TAC;
CHO 9;
TYPE_THEN `x` (fun t-> (USE 8 (SPEC t)));
REWR 8;
X_CHO 8 `eps:real`;
ALL_TAC; (*"cd5"*)
SUBGOAL_TAC `?r. twopow(--: (&:r)) < eps`;
ASSUME_TAC (SPECL [`&.1`;`eps:real`] twopow_eps);
USE 10 (CONV_RULE REDUCE_CONV);
ASM_MESON_TAC[];
DISCH_THEN CHOOSE_TAC;
USE 2 (SPEC `r:num`);
AND 2;
AND 2;
TYPE_THEN `x IN X` SUBGOAL_TAC;
ASM SET_TAC[IN;SUBSET];
ASM ONCE_REWRITE_TAC[];
REWRITE_TAC[UNIONS;IN_ELIM_THM';IN_IMAGE];
DISCH_THEN CHOOSE_TAC;
AND 13;
X_CHO 14 `z0:A`;
REWR 13;
AND 14;
EXISTS_TAC `z0:A`;
REWRITE_TAC[IN_INTER];
USE 13 (REWRITE_RULE[IN]);
USE 13 (MATCH_MP open_ball_dist);
CONJ_TAC;
USE 8 (REWRITE_RULE [open_ball;SUBSET]);
AND 8;
USE 8 (SPEC `z0:A`);
USE 8 (REWRITE_RULE [IN_ELIM_THM']);
UND 8;
DISCH_THEN (MATCH_MP_TAC );
ALL_TAC; (* "cd6" *)
SUBCONJ_TAC;
ASM SET_TAC[IN;SUBSET];
DISCH_TAC;
SUBCONJ_TAC;
ASM SET_TAC[IN;SUBSET];
DISCH_TAC;
UND 13;
UND 10;
USE 0 (REWRITE_RULE[metric_space]);
TYPEL_THEN [`z0`;`x`;`z0`] (fun t-> USE 0 (SPECL t));
REWR 0;
UND 0;
REAL_ARITH_TAC;
EXPAND_TAC "Z";
REWRITE_TAC[IN_UNIONS;IN_IMAGE;IN_UNIV];
UND 14;
MESON_TAC[];
]);;
(* }}} *)
let metric_hausdorff = prove_by_refinement(
`! (X:A->bool) d. (metric_space(X,d))==>
(hausdorff (top_of_metric(X,d)))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
REWRITE_TAC[hausdorff;];
ASM_SIMP_TAC [GSYM
top_of_metric_unions];
DISCH_ALL_TAC;
COPY 0;
USE 4 (REWRITE_RULE[metric_space]);
TYPEL_THEN [`x`;`y`;`x`] (USE 4 o SPECL);
REWR 4;
TYPE_THEN `r = d x y` ABBREV_TAC;
SUBGOAL_TAC `&.0 <. r`;
UND 4;
ARITH_TAC;
DISCH_TAC;
TYPE_THEN `open_ball(X,d) x (r/(&.2))` EXISTS_TAC;
TYPE_THEN `open_ball(X,d) y (r/(&.2))` EXISTS_TAC;
ALL_TAC; (* mh1 *)
KILL 4;
ASM_SIMP_TAC[
open_ball_open];
COPY 6;
USE 4 (ONCE_REWRITE_RULE[GSYM REAL_LT_HALF1]);
ASM_SIMP_TAC[REWRITE_RULE[IN]
open_ball_nonempty];
PROOF_BY_CONTR_TAC;
USE 7 (REWRITE_RULE[
EMPTY_EXISTS]);
CHO 7;
USE 7 (REWRITE_RULE[IN_INTER]);
USE 7 (REWRITE_RULE[IN]);
ALL_TAC; (* mh2 *)
AND 7;
COPY 7;
COPY 8;
USE 7 (MATCH_MP
open_ball_dist);
USE 8 (MATCH_MP
open_ball_dist);
USE 0 (REWRITE_RULE[metric_space]);
COPY 0;
TYPEL_THEN [`x`;`u`;`y`] (fun t-> (USE 0 (ISPECL t)));
TYPEL_THEN [`y`;`u`;`y`] (fun t-> (USE 11 (ISPECL t)));
UND 11;
UND 0;
ASM_REWRITE_TAC[];
TYPE_THEN `X u` SUBGOAL_TAC;
ASM_MESON_TAC[
open_ball_subset;IN;SUBSET];
DISCH_THEN (REWRT_TAC);
DISCH_ALL_TAC;
UND 14;
UND 0;
DISCH_THEN (fun t-> REWRITE_TAC[GSYM t]);
JOIN 7 8;
USE 0 (MATCH_MP (REAL_ARITH `(a <. c) /\ (b < c) ==> b+a < c + c`));
USE 0 (CONV_RULE REDUCE_CONV);
ASM_MESON_TAC[real_lt];
]);;
(* }}} *)
(* compactness *)
let compact = euclid_def `compact U (K:A->bool) <=>
(K SUBSET UNIONS U) /\ (!V. (K SUBSET UNIONS V ) /\ (V SUBSET U) ==>
(?W. (W SUBSET V) /\ (FINITE W) /\ (K SUBSET UNIONS W )))`;;
let closed_compact = prove_by_refinement(
`!U K (S:A->bool). ((topology_ U) /\ (compact U K) /\
(closed_ U S) /\ (S SUBSET K)) ==> (compact U S)`,
(* {{{ proof *)
[
REWRITE_TAC[compact];
DISCH_ALL_TAC;
DISCH_ALL_TAC;
SUBCONJ_TAC;
ASM_MESON_TAC[ SUBSET_TRANS];
DISCH_ALL_TAC;
DISCH_ALL_TAC;
TYPE_THEN `A = UNIONS U DIFF S` ABBREV_TAC;
TYPE_THEN `open_ U A` SUBGOAL_TAC ;
ASM_MESON_TAC[
closed_open];
TYPE_THEN `V' = (A INSERT V)` ABBREV_TAC;
DISCH_ALL_TAC;
TYPE_THEN `V'` (USE 2 o SPEC);
ALL_TAC; (* cc1 *)
TYPE_THEN `K SUBSET UNIONS V'` SUBGOAL_TAC;
EXPAND_TAC "V'";
EXPAND_TAC "A";
UND 6;
UND 4;
UND 1;
TYPE_THEN `X = UNIONS U ` ABBREV_TAC;
ALL_TAC; (* cc2 *)
REWRITE_TAC[SUBSET_UNIONS_INSERT];
SET_TAC[SUBSET;UNIONS;DIFF];
DISCH_ALL_TAC;
TYPE_THEN `V' SUBSET U` SUBGOAL_TAC;
EXPAND_TAC "V'";
EXPAND_TAC "A";
REWRITE_TAC[INSERT_SUBSET];
ASM_REWRITE_TAC[];
ASM_MESON_TAC[IN;open_DEF];
DISCH_ALL_TAC;
REWR 2;
CHO 2;
TYPE_THEN `W DELETE A` EXISTS_TAC;
CONJ_TAC;
AND 2;
UND 13;
EXPAND_TAC "V'";
SET_TAC[SUBSET;INSERT;DELETE];
ASM_REWRITE_TAC[FINITE_DELETE];
AND 2;
AND 2;
UND 2;
UND 4;
UND 1;
EXPAND_TAC "A";
TYPE_THEN `X = UNIONS U ` ABBREV_TAC;
ALL_TAC; (* cc3 *)
DISCH_ALL_TAC;
MATCH_MP_TAC UNIONS_DELETE2;
CONJ_TAC;
ASM_MESON_TAC[SUBSET_TRANS];
SET_TAC[INTER;DIFF];
]);;
(* }}} *)
let compact_closed = prove_by_refinement(
`!U (K:A->bool). (topology_ U) /\ (hausdorff U) /\ (compact U K) ==>
(closed_ U K)`,
(* {{{ proof *)
[
REWRITE_TAC[hausdorff;compact;closed];
DISCH_ALL_TAC;
ASM_REWRITE_TAC[open_DEF];
ONCE_ASM_SIMP_TAC[
open_nbd];
TYPE_THEN `C = UNIONS U DIFF K` ABBREV_TAC;
GEN_TAC;
CONV_TAC (quant_right_CONV "B");
DISCH_ALL_TAC;
(* cc1 *)
TYPE_THEN `!y. (K y) ==> (?A B. (U A /\ U B /\ A x /\ B y /\ (A INTER B = {})))` SUBGOAL_TAC;
DISCH_ALL_TAC;
UND 1;
DISCH_THEN MATCH_MP_TAC;
CONJ_TAC;
UND 5;
EXPAND_TAC "C";
REWRITE_TAC[DIFF;IN_ELIM_THM'];
REWRITE_TAC [IN];
MESON_TAC[];
CONJ_TAC;
UND 6;
UND 2;
REWRITE_TAC[SUBSET;IN];
MESON_TAC[];
PROOF_BY_CONTR_TAC;
REWR 1;
REWR 5;
UND 5;
UND 6;
EXPAND_TAC "C";
REWRITE_TAC[DIFF;IN_ELIM_THM'];
MESON_TAC[IN];
(* cc2 *)
DISCH_ALL_TAC;
USE 6 (CONV_RULE (quant_left_CONV "B"));
USE 6 (CONV_RULE (quant_left_CONV "B"));
USE 6 (CONV_RULE (quant_left_CONV "B"));
CHO 6;
TYPE_THEN `IMAGE B K` (USE 3 o SPEC);
TYPE_THEN `K SUBSET UNIONS (IMAGE B K) /\ IMAGE B K SUBSET U` SUBGOAL_TAC;
CONJ_TAC;
REWRITE_TAC[SUBSET;UNIONS;IN_IMAGE;IN_ELIM_THM'];
X_GEN_TAC `y:A`;
REWRITE_TAC[IN];
ASM_MESON_TAC[];
REWRITE_TAC[SUBSET;IN_IMAGE];
NAME_CONFLICT_TAC;
CONV_TAC (quant_left_CONV "x'");
CONV_TAC (quant_left_CONV "x'");
ASM_MESON_TAC[IN];
DISCH_TAC;
REWR 3;
CHO 3;
(* cc3 *)
AND 3;
AND 3;
JOIN 8 9;
USE 8 (MATCH_MP finite_subset);
X_CHO 8 `kc:A->bool`;
USE 6 (CONV_RULE (quant_left_CONV "A"));
USE 6 (CONV_RULE (quant_left_CONV "A"));
CHO 6;
(* cc4 *)
TYPE_THEN `K = EMPTY` ASM_CASES_TAC;
REWR 4;
USE 4 (REWRITE_RULE[DIFF_EMPTY]);
EXISTS_TAC `C:A->bool`;
ASM_REWRITE_TAC[SUBSET_REFL];
EXPAND_TAC "C";
USE 0 (REWRITE_RULE[topology]);
UND 0;
MESON_TAC[topology;IN;SUBSET_REFL];
TYPE_THEN `~(kc = EMPTY)` SUBGOAL_TAC;
PROOF_BY_CONTR_TAC;
USE 10 (REWRITE_RULE[]);
REWR 8;
USE 8 (REWRITE_RULE[IMAGE_CLAUSES]);
REWR 3;
USE 3 (REWRITE_RULE[UNIONS_0;SUBSET_EMPTY]);
ASM_MESON_TAC[ ];
REWRITE_TAC[EMPTY_EXISTS];
DISCH_THEN CHOOSE_TAC;
ALL_TAC; (* cc5 *)
TYPE_THEN `INTERS (IMAGE A kc)` EXISTS_TAC;
TYPE_THEN `INTERS (IMAGE A kc) INTER (UNIONS (IMAGE B kc)) = EMPTY` SUBGOAL_TAC;
REWRITE_TAC[INTER;UNIONS];
MATCH_MP_TAC EQ_EXT;
GEN_TAC;
REWRITE_TAC[IN_ELIM_THM';EMPTY];
MATCH_MP_TAC (TAUT `(a ==> ~b )==> ~(a /\ b)`);
REWRITE_TAC[IN_INTERS;IN_IMAGE];
DISCH_ALL_TAC;
CHO 11;
AND 11;
CHO 13;
IN_ELIM 13;
REWR 11;
USE 12 (CONV_RULE (quant_left_CONV "x"));
USE 12 (CONV_RULE (quant_left_CONV "x"));
TYPE_THEN `x''` (USE 12 o SPEC);
TYPE_THEN `A x''` (USE 12 o SPEC);
IN_ELIM 12;
REWR 12;
TYPE_THEN `x''` (USE 6 o SPEC);
TYPE_THEN `K x''` SUBGOAL_TAC;
UND 13;
AND 8;
UND 13;
MESON_TAC[SUBSET;IN];
DISCH_TAC;
REWR 6;
USE 6 (REWRITE_RULE [INTER]);
(AND 6);
(AND 6);
(AND 6);
(AND 6);
USE 6 (fun t-> AP_THM t `x':A`);
USE 6 (REWRITE_RULE[IN_ELIM_THM';EMPTY]);
ASM_MESON_TAC[IN];
DISCH_TAC;
ALL_TAC; (* cc6 *)
SUBCONJ_TAC;
EXPAND_TAC "C";
REWRITE_TAC[DIFF_SUBSET];
CONJ_TAC;
MATCH_MP_TAC INTERS_SUBSET2;
TYPE_THEN `A u` EXISTS_TAC ;
REWRITE_TAC[IMAGE;IN_ELIM_THM'];
CONJ_TAC;
TYPE_THEN `u` EXISTS_TAC;
ASM_REWRITE_TAC[];
MATCH_MP_TAC sub_union;
TYPE_THEN `u` (USE 6 o SPEC);
AND 8;
USE 12 (REWRITE_RULE[SUBSET;IN]);
ASM_MESON_TAC[IN];
UND 3;
ASM_REWRITE_TAC[];
UND 11;
TYPE_THEN `a' = INTERS (IMAGE A kc)` ABBREV_TAC;
TYPE_THEN `b' = UNIONS (IMAGE B kc)` ABBREV_TAC;
SET_TAC[INTER;SUBSET;EMPTY];
DISCH_TAC;
ALL_TAC; (* cc7 *)
CONJ_TAC;
REWRITE_TAC[INTERS;IN_IMAGE;IN_ELIM_THM'];
GEN_TAC;
DISCH_THEN CHOOSE_TAC;
TYPE_THEN `x'` (USE 6 o SPEC);
ASM_REWRITE_TAC[];
USE 8 (REWRITE_RULE[SUBSET;IN]);
ASM_MESON_TAC[IN];
MATCH_MP_TAC open_inters;
ASM_REWRITE_TAC[];
CONJ_TAC;
REWRITE_TAC[SUBSET;IN_IMAGE;];
NAME_CONFLICT_TAC;
GEN_TAC;
DISCH_THEN CHOOSE_TAC;
USE 6 (SPEC `x':A`);
USE 8 (REWRITE_RULE[SUBSET;IN]);
ASM_MESON_TAC[IN];
CONJ_TAC;
ASM_MESON_TAC[FINITE_IMAGE];
REWRITE_TAC[EMPTY_EXISTS];
TYPE_THEN `A u` EXISTS_TAC;
REWRITE_TAC[IN_IMAGE];
ASM_MESON_TAC[];
]);;
(* }}} *)
let compact_totally_bounded = prove_by_refinement(
`!(X:A->bool) d.( metric_space(X,d)) /\ (compact (top_of_metric(X,d)) X)
==> (totally_bounded (X,d))`,
(* {{{ proof *)
[
REWRITE_TAC[totally_bounded;compact];
DISCH_ALL_TAC;
DISCH_ALL_TAC;
CONV_TAC (quant_right_CONV "B");
DISCH_TAC;
TYPE_THEN `IMAGE (\x. open_ball(X,d) x eps) X` (USE 2 o SPEC);
TYPE_THEN `X SUBSET UNIONS (IMAGE (\x. open_ball (X,d) x eps) X)` SUBGOAL_TAC;
(REWRITE_TAC[SUBSET;IN_UNIONS;IN_IMAGE]);
GEN_TAC;
NAME_CONFLICT_TAC;
REWRITE_TAC[IN];
DISCH_TAC;
CONV_TAC (quant_left_CONV "x'");
CONV_TAC (quant_left_CONV "x'");
TYPE_THEN `x` EXISTS_TAC;
TYPE_THEN `open_ball (X,d) x eps` EXISTS_TAC;
ASM_REWRITE_TAC[];
ASM_MESON_TAC[
open_ball_nonempty;IN];
DISCH_TAC;
REWR 2;
ALL_TAC; (* ctb1 *)
TYPE_THEN `IMAGE (\x. open_ball (X,d) x eps) X SUBSET top_of_metric (X,d)` SUBGOAL_TAC;
TYPE_THEN `IMAGE (\x. open_ball (X,d) x eps) X SUBSET open_balls(X,d)` SUBGOAL_TAC;
REWRITE_TAC[SUBSET;IN_IMAGE;open_balls;IN_ELIM_THM'];
MESON_TAC[IN];
MESON_TAC[SUBSET_TRANS;
top_of_metric_open_balls];
DISCH_TAC;
REWR 2;
CHO 2;
TYPE_THEN `W` EXISTS_TAC;
ASM_REWRITE_TAC[];
CONJ_TAC;
DISCH_ALL_TAC;
AND 2;
USE 7 (REWRITE_RULE [SUBSET;IN_IMAGE]);
ASM_MESON_TAC[IN];
MATCH_MP_TAC SUBSET_ANTISYM;
ASM_REWRITE_TAC[];
TYPE_THEN `W SUBSET top_of_metric (X,d)` SUBGOAL_TAC;
ASM_MESON_TAC[SUBSET_TRANS];
DISCH_ALL_TAC;
USE 6 (MATCH_MP
UNIONS_UNIONS);
ASM_MESON_TAC[
top_of_metric_unions];
]);;
(* }}} *)
(*
If W is empty then INTERS W = UNIV, rather than EMPTY.
Thus, extra arguments must be provided for this case. *)
let finite_inters = prove_by_refinement(
`!U V . (topology_ U) /\ (compact U (UNIONS U)) /\ (INTERS V = EMPTY) /\
(!(u:A->bool). (V u) ==> (closed_ U u))
==> (?W. (W SUBSET V) /\ (FINITE W) /\ (INTERS W = EMPTY))`,
(* {{{ proof *)
[
REWRITE_TAC[compact;SUBSET_REFL];
DISCH_ALL_TAC;
(* {{{ proof *)
TYPE_THEN `IMAGE (\r. ((UNIONS U) DIFF r)) V` (USE 1 o SPEC);
TYPE_THEN `IMAGE (\r. UNIONS U DIFF r) V SUBSET U` SUBGOAL_TAC;
REWRITE_TAC[IMAGE;SUBSET;IN_ELIM_THM'];
GEN_TAC;
DISCH_THEN CHOOSE_TAC;
ASM_REWRITE_TAC[];
ASM_SIMP_TAC[
top_univ;IN;SUBSET_DIFF];
IN_ELIM 4;
TYPE_THEN `x'` (USE 3 o SPEC);
REWR 3;
USE 3 (REWRITE_RULE[closed;open_DEF]);
ASM_REWRITE_TAC[];
DISCH_TAC;
REWR 1;
ALL_TAC; (* fi1 *)
TYPE_THEN `UNIONS U SUBSET UNIONS (IMAGE (\r. UNIONS U DIFF r) V)` SUBGOAL_TAC;
REWRITE_TAC[SUBSET;IN_UNIONS;IN_IMAGE];
GEN_TAC;
DISCH_THEN CHOOSE_TAC;
NAME_CONFLICT_TAC;
USE 2 (REWRITE_RULE[
INTERS_EQ_EMPTY]);
TYPE_THEN `x` (USE 2 o SPEC);
CHO 2;
CONV_TAC (quant_left_CONV "x'");
CONV_TAC (quant_left_CONV "x'");
TYPE_THEN `a` EXISTS_TAC;
TYPE_THEN `UNIONS U DIFF a` EXISTS_TAC ;
ASM_REWRITE_TAC[IN];
REWRITE_TAC[DIFF;IN_ELIM_THM';
IN_UNIONS];
ASM_MESON_TAC[IN];
DISCH_TAC;
REWR 1;
CHO 1;
AND 1;
AND 1;
JOIN 7 6;
(*** Modified by JRH for changed theorem name
USE 6 (MATCH_MP FINITE_SUBSET_IMAGE);
****)
USE 6 (MATCH_MP FINITE_SUBSET_IMAGE_IMP);
CHO 6;
ALL_TAC; (* fi2*)
TYPE_THEN `s'={}` ASM_CASES_TAC ;
REWR 6;
USE 6 (REWRITE_RULE[IMAGE_CLAUSES;SUBSET_EMPTY]);
REWR 1;
USE 1 (REWRITE_RULE[UNIONS_0;SUBSET_EMPTY]);
USE 1 (REWRITE_RULE [UNIONS_EQ_EMPTY]);
UND 1;
DISCH_THEN DISJ_CASES_TAC;
REWR 4;
USE 4 (REWRITE_RULE[SUBSET_EMPTY;IMAGE;EQ_EMPTY;IN_ELIM_THM']);
TYPE_THEN `V = {}` SUBGOAL_TAC;
PROOF_BY_CONTR_TAC;
USE 8 (REWRITE_RULE[EMPTY_EXISTS]);
CHO 8;
USE 4 (CONV_RULE (quant_left_CONV "x'"));
USE 4 (CONV_RULE (quant_left_CONV "x'"));
TYPE_THEN `u` (USE 4 o SPEC);
TYPE_THEN `UNIONS {} DIFF u` (USE 4 o SPEC);
ASM_MESON_TAC[];
USE 2 (REWRITE_RULE[INTERS_EQ_EMPTY]);
REWRITE_TAC[EQ_EMPTY];
ASM_MESON_TAC[];
ALL_TAC; (* fi3*)
TYPE_THEN `V` EXISTS_TAC;
ASM_REWRITE_TAC[SUBSET_REFL];
USE 3 (REWRITE_RULE[closed;open_DEF]);
REWR 3;
USE 3 (REWRITE_RULE[REWRITE_RULE[IN] IN_SING]);
TYPE_THEN `!u. V u ==> (u = EMPTY)` SUBGOAL_TAC;
DISCH_ALL_TAC;
TYPE_THEN `u` (USE 3 o SPEC);
REWR 3;
AND 3;
ASM_MESON_TAC[ SUBSET_EMPTY;UNIONS_EQ_EMPTY];
DISCH_TAC;
TYPE_THEN `V SUBSET {EMPTY}` SUBGOAL_TAC;
REWRITE_TAC[INSERT_DEF];
REWRITE_TAC[IN_ELIM_THM'];
REWRITE_TAC[IN;EMPTY;SUBSET];
ASM_MESON_TAC[IN;EMPTY];
(* }}} *)
MESON_TAC[FINITE_SING;FINITE_SUBSET];
ALL_TAC; (* fi4*)
TYPE_THEN `s'` EXISTS_TAC;
ASM_REWRITE_TAC[INTERS_EQ_EMPTY];
GEN_TAC;
USE 7 (REWRITE_RULE[EMPTY_EXISTS]);
CHO 7;
TYPE_THEN `UNIONS U x` ASM_CASES_TAC ;
TYPE_THEN `UNIONS W x` SUBGOAL_TAC;
USE 1 (REWRITE_RULE[SUBSET;IN]);
UND 8;
UND 1;
MESON_TAC[];
DISCH_ALL_TAC;
TYPE_THEN `UNIONS (IMAGE (\r. UNIONS U DIFF r) s') x` SUBGOAL_TAC;
AND 6;
AND 6;
USE 6 (MATCH_MP UNIONS_UNIONS);
USE 6 (REWRITE_RULE[SUBSET;IN]);
ASM_MESON_TAC[];
REWRITE_TAC[UNIONS;IN_IMAGE;IN_ELIM_THM'];
REWRITE_TAC[IN];
DISCH_ALL_TAC;
LEFT 10 "x";
LEFT 10 "x";
TYPE_THEN `S:A->bool` (X_CHO 10) ;
CHO 10;
AND 10;
REWR 10;
TYPE_THEN `S` EXISTS_TAC;
ASM_REWRITE_TAC[];
USE 10(REWRITE_RULE[REWRITE_RULE[IN] IN_DIFF]);
ASM_REWRITE_TAC[];
TYPE_THEN `u` EXISTS_TAC;
IN_ELIM 7;
ASM_REWRITE_TAC[];
PROOF_BY_CONTR_TAC;
USE 9 (REWRITE_RULE[]);
TYPE_THEN `V u` SUBGOAL_TAC;
AND 6;
AND 6;
USE 11 (REWRITE_RULE[SUBSET;IN]);
ASM_MESON_TAC[];
DISCH_TAC;
H_MATCH_MP (HYP "3") (HYP "10");
USE 11(REWRITE_RULE[closed;open_DEF]);
USE 11 (REWRITE_RULE [SUBSET;IN]);
ASM_MESON_TAC[];
]);;
(* }}} *)
(* first part of the proof of cauchy_subseq *)
let cauchy_subseq_sublemma = prove_by_refinement(
`!(X:A->bool) d f. ((metric_space(X,d))/\(totally_bounded(X,d)) /\
(sequence X f)) ==>
(?R Cn sn cond.
(&0 < R) /\
(!x y. X x /\ X y ==> d x y < R) /\
(cond (X,0) 0) /\
(sn 0 = 0) /\ (Cn 0 = X) /\
(!n. Cn n SUBSET X /\ cond (Cn n,sn n) n) /\
(!n. Cn (SUC n) SUBSET Cn n /\ sn n <| sn (SUC n)) /\
(((\ (C,s). \n.
(~FINITE {j | C (f j)}) /\
(C (f s)) /\
(!x y. (C x /\ C y) ==> d x y < R * (twopow (--: (&:n))))) =
cond)
))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
COPY 0 THEN COPY 1;
JOIN 4 3;
USE 3 (MATCH_MP
totally_bounded_bounded);
CHO 3;
CHO 3;
ALL_TAC; (* {{{ xxx *)
ALL_TAC; (* make r pos *)
ASSUME_TAC (REAL_ARITH `r <. (&.1 + abs(r))`);
ASSUME_TAC (REAL_ARITH `&.0 <. (&.1 + abs(r))`);
ABBREV_TAC (`r' = &.1 +. abs(r)`);
SUBGOAL_TAC `open_ball(X,d) a r SUBSET open_ball(X,d) (a:A) r'`;
ASM_SIMP_TAC[
open_ball_nest];
DISCH_TAC;
JOIN 3 7;
USE 3 (MATCH_MP SUBSET_TRANS);
KILL 6;
KILL 4;
ALL_TAC; (* "cs1" *)
SUBGOAL_TAC `( !(x:A) y. (X x) /\ (X y) ==> (d x y <. &.2 *. r'))`;
DISCH_ALL_TAC;
USE 3 (REWRITE_RULE[SUBSET;IN]);
COPY 3;
USE 7 (SPEC `x:A`);
USE 3 (SPEC `y:A`);
H_MATCH_MP (HYP "3") (HYP "6");
H_MATCH_MP (HYP "7") (HYP "4");
JOIN 9 8;
JOIN 0 8;
USE 0 (MATCH_MP
BALL_DIST);
ASM_REWRITE_TAC[];
DISCH_TAC;
ABBREV_TAC `cond = (\ ((C:A->bool),(s:num)) n. ~FINITE{j| C (f j)} /\ (C(f s)) /\ (!x y. (C x /\ C y) ==> d x y <. (&.2*.r')*. twopow(--: (&:n))))`;
ABBREV_TAC `R = (&.2)*r'`;
ALL_TAC ; (* 0 case of recursio *)
ALL_TAC; (* cs2 *)
SUBGOAL_TAC ` (X SUBSET X) /\ (cond ((X:A->bool),0) 0)`;
REWRITE_TAC[SUBSET_REFL];
EXPAND_TAC "cond";
CONV_TAC (TOP_DEPTH_CONV GEN_BETA_CONV);
USE 2 (REWRITE_RULE[sequence;SUBSET;IN_IMAGE;IN_UNIV]);
USE 2 (REWRITE_RULE[IN]);
USE 2 (CONV_RULE (NAME_CONFLICT_CONV));
SUBGOAL_TAC `!x. X((f:num->A) x)`;
ASM_MESON_TAC[];
REDUCE_TAC;
REWRITE_TAC[TWOPOW_0] THEN REDUCE_TAC;
ASM_REWRITE_TAC[];
DISCH_TAC;
SUBGOAL_TAC `{ j | (X:A->bool) (f j) } = (UNIV:num->bool)`;
MATCH_MP_TAC EQ_EXT;
REWRITE_TAC[IN_ELIM_THM;UNIV];
ASM_REWRITE_TAC[];
DISCH_THEN REWRT_TAC;
ASM_REWRITE_TAC[];
REWRITE_TAC[num_infinite];
ALL_TAC; (* #save_goal "cs3" *)
SUBGOAL_TAC `&.0 <. R`;
EXPAND_TAC "R";
UND 5;
REAL_ARITH_TAC;
DISCH_ALL_TAC;
SUBGOAL_TAC `!cs n. ?cs' . (FST cs SUBSET X) /\ (cond cs n)==>( (FST cs' SUBSET (FST cs)) /\(SND cs <| ((SND:((A->bool)#num)->num) cs') /\ (cond cs' (SUC n))) )`;
DISCH_ALL_TAC;
CONV_TAC (quant_right_CONV "cs'");
DISCH_TAC;
AND 11;
H_REWRITE_RULE[GSYM o (HYP "6")] (HYP "11");
USE 13 (CONV_RULE (SUBS_CONV[GSYM(ISPEC `cs:(A->bool)#num` PAIR)]));
USE 13 (CONV_RULE (TOP_DEPTH_CONV GEN_BETA_CONV));
JOIN 10 13;
JOIN 12 10;
JOIN 2 10;
JOIN 1 2;
JOIN 0 1;
USE 0 (MATCH_MP subsequence_rec);
CHO 0;
CHO 0;
EXISTS_TAC `(C':A->bool,s':num)`;
ASM_REWRITE_TAC[FST;SND];
EXPAND_TAC "cond";
(CONV_TAC (TOP_DEPTH_CONV GEN_BETA_CONV));
ASM_REWRITE_TAC[];
DISCH_TAC;
ALL_TAC; (* "cs4" *)
USE 11 (REWRITE_RULE[SKOLEM_THM]);
CHO 11;
ASSUME_TAC (ISPECL[`((X:A->bool),0)`;`cs':(((A->bool)#num)->(num->(A->bool)#num))`] num_RECURSION);
CHO 12;
ALL_TAC;(* EXISTS_TAC `\i. (SND ((fn : num->(A->bool)#num) i))`; *)
USE 11 (CONV_RULE (quant_left_CONV "n"));
USE 11 (SPEC `n:num`);
USE 11 (SPEC `(fn:num->(A->bool)#num) n`);
AND 12;
H_REWRITE_RULE[GSYM o (HYP "12")] (HYP "11");
USE 14 (GEN_ALL);
ABBREV_TAC `sn = (\i. SND ((fn:num->(A->bool)#num) i))`;
ABBREV_TAC `Cn = (\i. FST ((fn:num->(A->bool)#num) i))`;
SUBGOAL_TAC `((sn:num->num) 0 = 0) /\ (Cn 0 = (X:A->bool))`;
EXPAND_TAC "sn";
EXPAND_TAC "Cn";
UND 13;
MESON_TAC[FST;SND];
DISCH_TAC;
KILL 13;
KILL 11;
SUBGOAL_TAC `!(n:num). ((fn n):(A->bool)#num) = (Cn n,sn n)`;
EXPAND_TAC "sn";
EXPAND_TAC "Cn";
REWRITE_TAC[PAIR];
DISCH_TAC;
H_REWRITE_RULE[(HYP "11")] (HYP"14");
KILL 12;
KILL 14;
KILL 11;
KILL 16;
KILL 15;
ALL_TAC; (* }}} *)
ALL_TAC; (* KILL 10; cs4m *)
KILL 8;
KILL 7;
KILL 3;
KILL 5;
ALL_TAC; (* cs5 *)
TYPE_THEN `!n. (Cn n SUBSET X) /\ (cond (Cn n,sn n) n)` SUBGOAL_TAC;
INDUCT_TAC;
ASM_REWRITE_TAC[];
SET_TAC[SUBSET];
USE 13 (SPEC `n:num`);
REWR 5;
ASM_REWRITE_TAC[];
ASM_MESON_TAC[SUBSET_TRANS];
DISCH_TAC;
REWR 13;
ALL_TAC; (* TO HERE EVERYTHING WORKS GENERALLY *)
TYPE_THEN `R` EXISTS_TAC;
TYPE_THEN `Cn` EXISTS_TAC;
TYPE_THEN `sn` EXISTS_TAC;
TYPE_THEN `cond` EXISTS_TAC;
ASM_REWRITE_TAC[];
]);;
(* }}} *)
(* more on metric spaces and topology *)
let subseq_cauchy = prove_by_refinement(
`!(X:A->bool) d f s. (metric_space(X,d)) /\
(cauchy_seq (X,d) f) /\ (subseq s) /\
(converge(X,d) (f o s)) ==> (converge(X,d) f)`,
(* {{{ proof *)
[
REWRITE_TAC[cauchy_seq;converge;
sequence_in];
DISCH_ALL_TAC;
CHO 4;
TYPE_THEN `x` EXISTS_TAC ;
ASM_REWRITE_TAC[];
DISCH_ALL_TAC;
AND 4;
TYPE_THEN `eps/(&.2)` (USE 2 o SPEC);
TYPE_THEN `eps/(&.2)` (USE 4 o SPEC);
CHO 4;
CHO 2;
CONV_TAC (quant_right_CONV "n");
DISCH_ALL_TAC;
USE 2 (REWRITE_RULE[REAL_LT_HALF1]);
USE 4 (REWRITE_RULE[REAL_LT_HALF1]);
REWR 2;
REWR 4;
TYPE_THEN `n'` EXISTS_TAC ;
DISCH_ALL_TAC;
TYPE_THEN `n +| n'` (USE 4 o SPEC);
USE 4 (REWRITE_RULE[ARITH_RULE `n <=| n +| n'`]);
TYPE_THEN `s(n +| n')` (USE 2 o SPEC);
TYPE_THEN `i` (USE 2 o SPEC);
TYPE_THEN `n' <=| s (n +| n')` SUBGOAL_TAC;
USE 3 (MATCH_MP SEQ_SUBLE);
TYPE_THEN `n +| n'` (USE 3 o SPEC);
ASM_MESON_TAC[ LE_TRANS; ARITH_RULE `n' <=| n +| n'`];
DISCH_TAC;
REWR 2;
USE 4 (REWRITE_RULE[o_DEF]);
(* save_goal"sc1"; *)
TYPEL_THEN [`X`;`d`;`x`;`f (s(n +| n'))`;`f i`] (fun t-> ASSUME_TAC (ISPECL t
metric_space_triangle));
USE 5 (REWRITE_RULE[IN]);
REWR 9;
USE 1 (MATCH_MP
sequence_in);
REWR 9;
UND 9;
UND 4;
UND 2;
MP_TAC (SPEC `eps:real` REAL_HALF_DOUBLE);
TYPE_THEN `a = d (f (s (n +| n'))) (f i)` ABBREV_TAC ;
TYPE_THEN `b = d x (f (s (n +| n')))` ABBREV_TAC ;
TYPE_THEN `c = d x (f i)` ABBREV_TAC ;
REAL_ARITH_TAC;
]);;
(* }}} *)
let compact_complete = prove_by_refinement(
`!(X:A->bool) d. metric_space(X,d) /\
(compact (top_of_metric(X,d)) X) ==>
(complete(X,d))`,
(* {{{ proof *)
[
REWRITE_TAC [complete];
DISCH_ALL_TAC;
DISCH_ALL_TAC;
COPY 0;
COPY 1;
JOIN 3 4;
USE 3 (MATCH_MP
compact_totally_bounded);
COPY 2;
USE 4 (REWRITE_RULE[cauchy_seq]);
AND 4;
COPY 0;
COPY 3;
COPY 5;
JOIN 7 8;
JOIN 6 7;
USE 6 (MATCH_MP
cauchy_subseq_sublemma);
CHO 6;
CHO 6;
CHO 6;
CHO 6;
(AND 6);
(AND 6);
(AND 6);
(AND 6);
(AND 6);
(AND 6);
(AND 6);
ALL_TAC ; (* cc1 *)
MATCH_MP_TAC
subseq_cauchy;
TYPE_THEN `sn` EXISTS_TAC;
ASM_REWRITE_TAC [converge];
SUBCONJ_TAC;
REWRITE_TAC[SUBSEQ_SUC];
ASM_MESON_TAC[ ];
DISCH_ALL_TAC;
TYPE_THEN `~(INTERS {z | ?n. z = closed_ball(X,d) (f (sn n)) (R* twopow(--: (&:n)))} =EMPTY)` SUBGOAL_TAC;
PROOF_BY_CONTR_TAC ;
REWR 15;
TYPEL_THEN [`top_of_metric(X,d)`;`{z | ?n. z = closed_ball (X,d) (f(sn n)) (R * twopow (--: (&:n)))}`] (fun t-> ASSUME_TAC (ISPECL t
finite_inters));
REWR 16;
TYPE_THEN `topology_ (top_of_metric (X,d)) /\ compact (top_of_metric (X,d)) (UNIONS (top_of_metric (X,d))) /\ (!u. {z | ?n. z = closed_ball (X,d) (f(sn n)) (R * twopow (--: (&:n)))} u ==> closed_ (top_of_metric (X,d)) u)` SUBGOAL_TAC ;
ASM_SIMP_TAC[GSYM
top_of_metric_unions;];
ASM_SIMP_TAC[
top_of_metric_top];
REWRITE_TAC[IN_ELIM_THM'];
ASM_MESON_TAC[
closed_ball_closed];
DISCH_TAC;
REWR 16;
CHO 16;
ALL_TAC ; (* cc2 *)
TYPE_THEN `{z | ?n. z = closed_ball (X,d) (f (sn n)) (R * twopow (--: (&:n)))} = IMAGE (\n. closed_ball (X,d) (f (sn n)) (R * twopow (--: (&:n)))) (UNIV)` SUBGOAL_TAC ;
MATCH_MP_TAC EQ_EXT;
GEN_TAC ;
REWRITE_TAC[IN_ELIM_THM';
INR IN_IMAGE;UNIV];
DISCH_TAC;
REWR 16;
AND 16;
AND 16;
JOIN 20 19;
(*** Modified by JRH for new theorem name
USE 19 (MATCH_MP FINITE_SUBSET_IMAGE);
***)
USE 19 (MATCH_MP FINITE_SUBSET_IMAGE_IMP);
CHO 19;
AND 19;
AND 19;
(*** JRH --- originally for implicational num_FINITE:
USE 20 (MATCH_MP num_FINITE);
***)
USE 20 (CONV_RULE (REWR_CONV num_FINITE));
CHO 20;
TYPE_THEN `f (sn a) IN (INTERS W)` SUBGOAL_TAC ;
REWRITE_TAC[IN_INTERS];
REWRITE_TAC[IN];
DISCH_ALL_TAC;
USE 19 (REWRITE_RULE [SUBSET;IN_IMAGE]);
TYPE_THEN `t` (USE 19 o SPEC);
USE 19 (REWRITE_RULE [IN]);
REWR 19;
X_CHO 19 `m:num`;
USE 20 (SPEC `m:num`);
USE 20 (REWRITE_RULE[IN]);
REWR 20;
TYPE_THEN `Cn m SUBSET closed_ball (X,d) (f (sn m)) (R * twopow (--: (&:m)))` SUBGOAL_TAC ;
REWRITE_TAC[SUBSET;closed_ball;IN_ELIM_THM'];
USE 12 (SPEC `m:num`);
UND 12;
EXPAND_TAC "cond";
(CONV_TAC (TOP_DEPTH_CONV GEN_BETA_CONV));
REWRITE_TAC[SUBSET];
MESON_TAC[IN;REAL_ARITH `x <. y ==> x <=. y`];
REWRITE_TAC[SUBSET;IN];
DISCH_THEN (MATCH_MP_TAC );
ALL_TAC ; (* cc3 *)
TYPE_THEN `Cn a SUBSET Cn m` SUBGOAL_TAC ;
UND 13;
UND 20;
MESON_TAC [SUBSET_SUC2];
REWRITE_TAC[SUBSET;IN];
DISCH_THEN (MATCH_MP_TAC );
USE 12 (SPEC `a:num`);
AND 12;
UND 12;
EXPAND_TAC "cond";
(CONV_TAC (TOP_DEPTH_CONV GEN_BETA_CONV));
MESON_TAC[];
ASM_REWRITE_TAC [NOT_IN_EMPTY];
DISCH_TAC;
ALL_TAC ; (* cc4 *)
USE 15 (REWRITE_RULE[EMPTY_EXISTS]);
CHO 15;
TYPE_THEN `u` EXISTS_TAC ;
REWRITE_TAC[IN];
SUBCONJ_TAC;
USE 15 (REWRITE_RULE [IN_INTERS]);
TYPE_THEN `closed_ball (X,d) (f (sn 0)) (R * twopow (--: (&:0)))` (USE 15 o SPEC);
USE 15 (REWRITE_RULE[IN_ELIM_THM']);
LEFT 15 "n";
TYPE_THEN `0` (USE 15 o SPEC);
USE 15 (REWRITE_RULE[IN;closed_ball]);
USE 15 (REWRITE_RULE [IN_ELIM_THM']);
ASM_REWRITE_TAC[];
DISCH_ALL_TAC;
DISCH_ALL_TAC;
CONV_TAC (quant_right_CONV "n");
DISCH_ALL_TAC;
TYPEL_THEN [`(&.2)*R`;`eps`] (fun t-> ASSUME_TAC (ISPECL t twopow_eps));
CHO 18;
REWR 18;
TYPE_THEN `n` EXISTS_TAC;
DISCH_ALL_TAC;
TYPE_THEN `&0 < &2 * R ` SUBGOAL_TAC;
MATCH_MP_TAC REAL_PROP_POS_MUL2;
REDUCE_TAC;
ASM_REWRITE_TAC[];
ARITH_TAC;
DISCH_ALL_TAC;
REWR 18;
UND 18;
MATCH_MP_TAC (REAL_ARITH `x <= a ==> ((a < b) ==> (x < b))`);
USE 15 (REWRITE_RULE[IN_INTERS]);
TYPE_THEN `closed_ball (X,d) (f (sn n)) (R * twopow (--: (&:n)))` (USE 15 o SPEC);
USE 15 (REWRITE_RULE[IN_ELIM_THM']);
LEFT 15 "n'";
USE 15 (SPEC `n:num`);
REWR 15;
TYPE_THEN `Cn n SUBSET closed_ball (X,d) (f (sn n)) (R * twopow (--: (&:n)))` SUBGOAL_TAC ;
REWRITE_TAC[SUBSET;closed_ball;IN_ELIM_THM'];
USE 12 (SPEC `n:num`);
UND 12;
EXPAND_TAC "cond";
(CONV_TAC (TOP_DEPTH_CONV GEN_BETA_CONV));
REWRITE_TAC[SUBSET];
MESON_TAC[IN;REAL_ARITH `x <. y ==> x <=. y`];
DISCH_TAC;
TYPE_THEN `Cn i SUBSET Cn n` SUBGOAL_TAC ;
UND 13;
UND 19;
MESON_TAC [SUBSET_SUC2];
ALL_TAC ; (* REWRITE_TAC[SUBSET;IN];*)
DISCH_ALL_TAC;
USE 12 (SPEC `i:num`);
AND 12;
UND 12;
EXPAND_TAC "cond";
(CONV_TAC (TOP_DEPTH_CONV GEN_BETA_CONV));
DISCH_ALL_TAC;
TYPE_THEN `((f o sn) i) IN closed_ball (X,d) (f (sn n)) (R * twopow (--: (&:n)))` SUBGOAL_TAC;
KILL 1;
KILL 0;
KILL 2;
KILL 3;
KILL 5;
KILL 4;
JOIN 21 18;
USE 0 (MATCH_MP SUBSET_TRANS);
ALL_TAC; (* "CC5"; *)
ASM_MESON_TAC[IN;o_DEF;SUBSET];
REWRITE_TAC[GSYM REAL_MUL_ASSOC];
UND 15;
TYPE_THEN `r = R * twopow (--: (&:n))` ABBREV_TAC;
UND 0;
REWRITE_TAC[IN];
MESON_TAC[BALL_DIST_CLOSED];
]);;
(* }}} *)
let countable_cover = prove_by_refinement(
`!(X:A->bool) d U. (metric_space(X,d)) /\ (totally_bounded(X,d)) /\
(X SUBSET (UNIONS U)) /\ (U SUBSET (top_of_metric(X,d))) ==>
(?V. (V SUBSET U) /\ (X SUBSET (UNIONS V)) /\ (COUNTABLE V))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
TYPE_THEN `(?Z. COUNTABLE Z /\ dense (top_of_metric (X,d)) Z)` SUBGOAL_TAC;
ASM_MESON_TAC[
countable_dense];
DISCH_ALL_TAC;
CHO 4;
TYPE_THEN `S = {(z,n) | ?A. (Z z) /\ (open_ball(X,d) z (twopow(--: (&:n))) SUBSET A) /\ U A}` ABBREV_TAC ;
TYPE_THEN `COUNTABLE S` SUBGOAL_TAC;
IMATCH_MP_TAC (INST_TYPE [`:A#num`,`:A`]
COUNTABLE_IMAGE);
TYPE_THEN `{(z,(n:num)) | (Z z) /\ (UNIV n)}` EXISTS_TAC ;
CONJ_TAC ;
IMATCH_MP_TAC
countable_prod;
ASM_REWRITE_TAC [
NUM_COUNTABLE];
TYPE_THEN `I:(A#num) -> (A#num)` EXISTS_TAC;
REWRITE_TAC[
IMAGE_I;UNIV;SUBSET];
IN_OUT_TAC;
EXPAND_TAC "S";
GEN_TAC;
REWRITE_TAC[IN_ELIM_THM'];
ASM_MESON_TAC[GSPEC];
DISCH_TAC;
TYPE_THEN `!z n. (S (z,n) ==> ?A. Z z /\ open_ball (X,d) z (twopow (--: (&:n))) SUBSET A /\ U A)` SUBGOAL_TAC;
EXPAND_TAC "S";
REWRITE_TAC[IN_ELIM_THM'];
DISCH_ALL_TAC;
CHO 7;
CHO 7;
AND 7;
CHO 8;
TYPE_THEN `A` EXISTS_TAC;
ASM_MESON_TAC[PAIR_EQ];
DISCH_TAC ;
LEFT 7 "A";
LEFT 7 "A";
LEFT 7 "A";
CHO 7;
ALL_TAC ; (* "cc1"; *)
TYPE_THEN `IMAGE (\ (z,n). A z n) S` EXISTS_TAC;
SUBCONJ_TAC ;
REWRITE_TAC[SUBSET;IN_IMAGE];
NAME_CONFLICT_TAC;
TYPE_THEN `Azn:A->bool` X_GEN_TAC;
DISCH_THEN (X_CHOOSE_TAC `zn:A#num`);
USE 8 (SUBS [(ISPEC `zn:A#num` (GSYM PAIR))]);
USE 8 (GBETA_RULE);
TYPE_THEN `z = FST zn` ABBREV_TAC ;
TYPE_THEN `n = SND zn` ABBREV_TAC ;
IN_OUT_TAC;
ASM_MESON_TAC[];
DISCH_TAC;
CONJ_TAC ;
REWRITE_TAC[SUBSET];
USE 2 (REWRITE_RULE[SUBSET;IN_UNIONS]);
IN_OUT_TAC;
DISCH_ALL_TAC;
TYPE_THEN `x` ( USE 6 o SPEC);
REWR 6;
CHO 6;
TYPE_THEN `top_of_metric (X,d) t` SUBGOAL_TAC;
AND 6;
UND 10;
UND 5;
REWRITE_TAC[SUBSET;IN];
MESON_TAC[];
ASM_SIMP_TAC[top_of_metric_nbd];
DISCH_ALL_TAC;
TYPE_THEN `x` (USE 11 o SPEC);
IN_OUT_TAC;
REWR 0;
CHO 0;
AND 0;
ASSUME_TAC (SPECL[`&.1`;`r:real`] twopow_eps);
CHO 13;
USE 13 (CONV_RULE REDUCE_CONV);
REWR 13;
TYPEL_THEN [`X`;`d`;`x`] (fun t-> USE 13 (MATCH_MP (SPECL t open_ball_nest)));
JOIN 13 0;
USE 0 (MATCH_MP SUBSET_TRANS);
ASSUME_TAC (SPEC `(--: (&:n))` twopow_pos);
WITH 3 (MATCH_MP top_of_metric_top);
AND 7;
COPY 7;
COPY 14;
JOIN 14 7;
USE 7 (MATCH_MP dense_subset);
UND 16;
ASM_SIMP_TAC [dense_open];
DISCH_TAC ;
TYPE_THEN `(open_ball(X,d) x (twopow (--: (&:(n+1)))))` (USE 14 o SPEC);
ALL_TAC ; (* "cc2"; *)
TYPE_THEN `open_ball (X,d) x (twopow (--: (&:(n +| 1)))) x` SUBGOAL_TAC;
IMATCH_MP_TAC open_ball_nonempty;
ASM_REWRITE_TAC[];
DISCH_TAC;
TYPE_THEN `?z. (Z z) /\ (open_ball(X,d) x (twopow (--: (&:(n+1)))) z)` SUBGOAL_TAC;
UND 14;
REWRITE_TAC[open_DEF];
ASM_SIMP_TAC[open_ball_open];
UND 16;
TYPE_THEN `B = open_ball (X,d) x (twopow (--: (&:(n +| 1))))` ABBREV_TAC ;
REWRITE_TAC[INTER;IN];
POP_ASSUM_LIST (fun t->ALL_TAC);
REWRITE_TAC[EMPTY_NOT_EXISTS];
REWRITE_TAC[IN_ELIM_THM'];
MESON_TAC[];
DISCH_TAC;
CHO 18;
AND 18;
WITH 3 (MATCH_MP top_of_metric_unions);
USE 20 (SYM);
REWR 7;
TYPE_THEN `X z` SUBGOAL_TAC;
UND 7;
UND 19;
MESON_TAC[SUBSET;IN];
DISCH_TAC;
TYPE_THEN `open_ball (X,d) z (twopow (--: (&:(n +| 1)))) x` SUBGOAL_TAC;
ASM_MESON_TAC[ball_symm];
DISCH_TAC;
ALL_TAC ; (* "cc3"; *)
REWRITE_TAC[UNIONS;IN_IMAGE;IN_ELIM_THM'];
REWRITE_TAC[IN];
LEFT_TAC "x";
LEFT_TAC "x";
TYPE_THEN `(z,n+1)` EXISTS_TAC;
TYPE_THEN `A z (n+1)` EXISTS_TAC;
GBETA_TAC;
EXPAND_TAC "S";
REWRITE_TAC[IN_ELIM_THM'];
LEFT_TAC "z'";
TYPE_THEN `z` EXISTS_TAC;
LEFT_TAC "n'";
TYPE_THEN `n + 1` EXISTS_TAC;
REWRITE_TAC[];
LEFT_TAC "A";
TYPE_THEN `t` EXISTS_TAC;
ASM_REWRITE_TAC[];
ALL_TAC ; (* "cc4"; *)
SUBCONJ_TAC ;
TYPE_THEN `open_ball (X,d) z (twopow (--: (&:(n +| 1)))) SUBSET (open_ball (X,d) x (twopow (--: (&:n))))` SUBGOAL_TAC ;
CONV_TAC (RAND_CONV (ONCE_REWRITE_CONV [(GSYM twopow_double)]));
IMATCH_MP_TAC ball_subset_ball;
ASM_REWRITE_TAC[];
UND 0;
MESON_TAC[SUBSET_TRANS];
DISCH_TAC ;
TYPEL_THEN [`z`;`n+1`] (fun t -> USE 10 (SPECL t));
USE 10 (REWRITE_RULE [SUBSET ]);
IN_OUT_TAC ;
ALL_TAC ; (* "cc5" *)
TYPE_THEN `S (z,n +| 1)` SUBGOAL_TAC ;
EXPAND_TAC "S";
REWRITE_TAC[IN_ELIM_THM' ];
TYPE_THEN `z` EXISTS_TAC ;
TYPE_THEN `n + 1` EXISTS_TAC;
ASM_REWRITE_TAC[];
TYPE_THEN `t` EXISTS_TAC;
ASM_REWRITE_TAC[];
DISCH_TAC ;
REWR 13;
AND 13;
TYPE_THEN `x` (USE 25 o SPEC );
UND 25;
ASM_REWRITE_TAC[];
TYPE_THEN `S` ( fun t-> IMATCH_MP_TAC ( ISPEC t COUNTABLE_IMAGE)) ;
ASM_REWRITE_TAC[];
TYPE_THEN `\ (z,n). A z n` EXISTS_TAC;
REWRITE_TAC[SUBSET_REFL ];
]);;
(* }}} *)
let complete_compact = prove_by_refinement(
`!(X:A->bool) d . (metric_space(X,d)) /\ (totally_bounded(X,d)) /\
(complete (X,d)) ==> (compact (top_of_metric(X,d)) X)`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
REWRITE_TAC[compact];
CONJ_TAC ;
UND 0;
SIMP_TAC[GSYM
top_of_metric_unions ];
REWRITE_TAC[SUBSET_REFL];
GEN_TAC;
DISCH_ALL_TAC;
TYPE_THEN `(?V'. (V' SUBSET V) /\ (X SUBSET (UNIONS V')) /\ (COUNTABLE V'))` SUBGOAL_TAC ;
IMATCH_MP_TAC
countable_cover;
TYPE_THEN `d` EXISTS_TAC;
ASM_REWRITE_TAC[];
DISCH_THEN (CHOOSE_THEN MP_TAC);
DISCH_ALL_TAC;
ALL_TAC; (* ASM_MESON_TAC[]; *)
ALL_TAC; (* DISCH_THEN (CHOOSE_THEN MP_TAC); *)
ALL_TAC; (* DISCH_ALL_TAC; *)
USE 7 (REWRITE_RULE[COUNTABLE;GE_C;UNIV]);
IN_OUT_TAC;
CHO 0;
TYPE_THEN `B = \i. (IMAGE f { u | (u <=| i ) /\ V' (f u)}) ` ABBREV_TAC ;
TYPE_THEN `?i . UNIONS (B i ) = X ` ASM_CASES_TAC;
CHO 9;
TYPE_THEN `B i ` EXISTS_TAC;
EXPAND_TAC "B";
CONJ_TAC;
REWRITE_TAC[IMAGE;SUBSET ;IN ];
GEN_TAC;
REWRITE_TAC[IN_ELIM_THM'];
NAME_CONFLICT_TAC;
UND 2;
REWRITE_TAC[SUBSET;IN ];
MESON_TAC[];
CONJ_TAC ;
IMATCH_MP_TAC FINITE_IMAGE;
IMATCH_MP_TAC FINITE_SUBSET;
TYPE_THEN `{u | u <=| i }` EXISTS_TAC;
REWRITE_TAC[FINITE_NUMSEG_LE;SUBSET;IN ;IN_ELIM_THM' ];
MESON_TAC[];
UND 9;
DISCH_THEN (fun t-> REWRITE_TAC[GSYM t]);
EXPAND_TAC "B";
REWRITE_TAC[SUBSET_REFL ];
ALL_TAC ; (* "sv1" *)
LEFT 9 "i";
TYPE_THEN `UNIONS V' SUBSET X` SUBGOAL_TAC;
JOIN 2 3;
USE 2 (MATCH_MP SUBSET_TRANS );
USE 2 (MATCH_MP UNIONS_UNIONS );
UND 2;
ASM_MESON_TAC[top_of_metric_unions ];
DISCH_TAC ;
TYPE_THEN `!i. UNIONS (B i) SUBSET X` SUBGOAL_TAC;
GEN_TAC;
UND 10;
EXPAND_TAC "B";
REWRITE_TAC[SUBSET;IN_UNIONS;IN_IMAGE ];
REWRITE_TAC[IN;IN_ELIM_THM' ];
MESON_TAC[];
DISCH_TAC ;
COPY 11;
COPY 9;
JOIN 12 13;
LEFT 12 "i";
USE 12 (REWRITE_RULE [GSYM PSUBSET ;PSUBSET_MEMBER;IN ]);
LEFT 12 "y";
LEFT 12 "y";
CHO 12;
ALL_TAC ; (* "sv2" *)
TYPE_THEN `(?ss. subseq ss /\ converge (X,d) (y o ss))` SUBGOAL_TAC;
IMATCH_MP_TAC convergent_subseq ;
ASM_REWRITE_TAC[sequence];
REWRITE_TAC[SUBSET;UNIV;IN_IMAGE ];
REWRITE_TAC[IN];
ASM_MESON_TAC[];
DISCH_TAC;
CHO 13;
AND 13;
COPY 13;
USE 13 (REWRITE_RULE[converge;IN ]);
CHO 13;
AND 13;
USE 1 (REWRITE_RULE[SUBSET;UNIONS;IN;IN_ELIM_THM' ]);
TYPE_THEN `x` (USE 1 o SPEC);
REWR 1;
CHO 1;
TYPE_THEN `u` (USE 0 o SPEC);
REWR 0;
X_CHO 0 `j:num`;
TYPE_THEN `(UNIONS (B j)) x` SUBGOAL_TAC;
EXPAND_TAC "B";
REWRITE_TAC[UNIONS;IN_IMAGE ];
REWRITE_TAC[IN;IN_ELIM_THM' ];
TYPE_THEN `u` EXISTS_TAC;
ASM_REWRITE_TAC[];
TYPE_THEN `j` EXISTS_TAC;
ASM_MESON_TAC[ARITH_RULE `j <=| j`];
DISCH_TAC;
TYPE_THEN `u SUBSET (UNIONS (B j))` SUBGOAL_TAC;
IMATCH_MP_TAC sub_union;
EXPAND_TAC "B";
REWRITE_TAC[IMAGE;IN;IN_ELIM_THM' ];
TYPE_THEN `j` EXISTS_TAC;
ASM_MESON_TAC[ARITH_RULE `j <=| j`];
DISCH_TAC;
JOIN 2 3;
USE 2 (MATCH_MP SUBSET_TRANS);
ALL_TAC ; (* "sv3" *)
TYPE_THEN `top_of_metric(X,d) u` SUBGOAL_TAC;
USE 2 (REWRITE_RULE[SUBSET;IN ]);
ASM_MESON_TAC[];
ASM_SIMP_TAC[top_of_metric_nbd];
REWRITE_TAC[IN ];
DISCH_ALL_TAC;
TYPE_THEN `x` (USE 19 o SPEC);
REWR 1;
REWR 19;
CHO 19;
TYPE_THEN `r` (USE 13 o SPEC);
CHO 13;
REWR 13;
REWR 0;
TYPE_THEN `n +| (j)` (USE 13 o SPEC);
USE 13 (REWRITE_RULE[ARITH_RULE `n<=| (n+| a)`]);
AND 19;
TYPE_THEN `u ((y o ss) (n +| j) )` SUBGOAL_TAC;
USE 19 (REWRITE_RULE[SUBSET;open_ball;IN ;IN_ELIM_THM' ]);
TYPE_THEN `((y o ss) (n +| j))` (USE 19 o SPEC);
ASM_REWRITE_TAC[];
UND 19;
DISCH_THEN IMATCH_MP_TAC ;
ASM_REWRITE_TAC[];
TYPE_THEN `(ss (n +| j))` (USE 12 o SPEC);
ASM_REWRITE_TAC[o_DEF ];
DISCH_TAC;
TYPE_THEN `z = ((y o ss) (n +| j))` ABBREV_TAC;
TYPE_THEN `UNIONS (B (ss (n+| j))) ((y o ss) (n +| j))` SUBGOAL_TAC;
EXPAND_TAC "B";
ASM_REWRITE_TAC[];
REWRITE_TAC[UNIONS;IN_IMAGE];
REWRITE_TAC[IN; IN_ELIM_THM'];
TYPE_THEN `u` EXISTS_TAC;
ASM_REWRITE_TAC[];
TYPE_THEN `j` EXISTS_TAC;
ASM_REWRITE_TAC[];
IMATCH_MP_TAC (ARITH_RULE `j <= a /\ a <= ss(a) ==> (j <=| (ss (a)))`);
ASM_SIMP_TAC[SEQ_SUBLE];
ARITH_TAC;
REWRITE_TAC[o_DEF];
TYPE_THEN `ss(n +| j)` (USE 12 o SPEC);
UND 12;
MESON_TAC[];
]);;
(* }}} *)
let uniformly_continuous = euclid_def
`uniformly_continuous (f:A->B) ((X:A->bool),dX) ((Y:B->bool),dY) <=>
(!epsilon. ?delta. (&.0 < epsilon) ==> (&.0 <. delta) /\
(!x y. (X x) /\ (X y) /\
(dX x y < delta) ==> (dY (f x) (f y) < epsilon)))`;;
(* NB. It is not part of the hypothesis on metric_continuous
that the IMAGE of f on X is contained in Y. Hence the
extra hypothesis. *)
let compact_uniformly_continuous = prove_by_refinement(
`!f X dX Y dY. metric_continuous f (X,dX) (Y,dY) /\ (metric_space(X,dX))
/\ (metric_space(Y,dY)) /\ (compact(top_of_metric(X,dX)) X) /\
(IMAGE f X SUBSET Y) ==>
uniformly_continuous (f:A->B) ((X:A->bool),dX) ((Y:B->bool),dY)`,
(* {{{ proof *)
[
REWRITE_TAC[uniformly_continuous;metric_continuous;metric_continuous_pt];
DISCH_ALL_TAC;
GEN_TAC;
LEFT 0 "epsilon";
TYPE_THEN `epsilon/(&.2)` (USE 0 o SPEC);
LEFT 0 "delta";
CHO 0;
TYPE_THEN `cov = IMAGE (\x. open_ball (X,dX) x ((delta x)/(&.2))) X` ABBREV_TAC;
USE 3 (REWRITE_RULE[compact]);
UND 3;
ASM_SIMP_TAC[GSYM top_of_metric_unions;SUBSET_REFL ];
DISCH_TAC;
TYPE_THEN `cov` (USE 3 o SPEC);
CONV_TAC (quant_right_CONV "delta");
DISCH_TAC;
WITH 6 (ONCE_REWRITE_RULE [GSYM REAL_LT_HALF1]);
REWR 0;
TYPE_THEN `!x. (&.0 < (delta x)/(&.2))` SUBGOAL_TAC;
ASM_MESON_TAC[REAL_LT_HALF1];
DISCH_TAC;
TYPE_THEN `X SUBSET UNIONS cov /\ cov SUBSET top_of_metric (X,dX)` SUBGOAL_TAC;
SUBCONJ_TAC;
REWRITE_TAC[SUBSET;UNIONS;IN;IN_ELIM_THM' ];
DISCH_ALL_TAC;
TYPE_THEN `open_ball (X,dX) x ((delta x)/(&.2))` EXISTS_TAC;
CONJ_TAC;
EXPAND_TAC "cov";
REWRITE_TAC[IMAGE;IN ;IN_ELIM_THM' ];
ASM_MESON_TAC[];
IMATCH_MP_TAC (REWRITE_RULE[IN] open_ball_nonempty);
ASM_REWRITE_TAC[];
DISCH_TAC ;
REWRITE_TAC[SUBSET;IN ];
EXPAND_TAC "cov";
REWRITE_TAC[IMAGE;IN;IN_ELIM_THM' ];
NAME_CONFLICT_TAC;
DISCH_ALL_TAC;
CHO 10;
AND 10;
ASM_REWRITE_TAC[];
ASM_MESON_TAC[open_ball_open];
DISCH_TAC;
REWR 3;
CHO 3;
ALL_TAC; (* "cc1"; *)
AND 3;
AND 3;
JOIN 11 10;
UND 10;
EXPAND_TAC "cov";
DISCH_TAC;
(*** Modified by JRH for changed theorem name
USE 10 (MATCH_MP FINITE_SUBSET_IMAGE);
***)
USE 10 (MATCH_MP FINITE_SUBSET_IMAGE_IMP);
X_CHO 10 `S:A->bool`;
TYPE_THEN `ds = IMAGE delta S` ABBREV_TAC ;
TYPE_THEN `(FINITE ds) /\ ( !x. (ds x) ==> (&.0 <. x) )` SUBGOAL_TAC;
EXPAND_TAC "ds";
CONJ_TAC;
IMATCH_MP_TAC FINITE_IMAGE ;
ASM_REWRITE_TAC[];
REWRITE_TAC[IMAGE;IN;IN_ELIM_THM' ];
NAME_CONFLICT_TAC ;
DISCH_ALL_TAC;
CHO 12;
ASM_REWRITE_TAC[];
DISCH_TAC;
USE 12 (MATCH_MP min_finite_delta);
CHO 12;
TYPE_THEN `delta'/(&.2)` EXISTS_TAC;
ASM_REWRITE_TAC[];
ALL_TAC ; (* "cc2" *)
ASM_REWRITE_TAC[REAL_LT_HALF1];
DISCH_ALL_TAC;
AND 10;
AND 10;
USE 10( MATCH_MP UNIONS_UNIONS );
JOIN 3 10;
USE 3 (MATCH_MP SUBSET_TRANS);
USE 3 (REWRITE_RULE [SUBSET;IN;UNIONS;IN_ELIM_THM' ]);
USE 3 (REWRITE_RULE[IMAGE;IN ;IN_ELIM_THM' ]);
TYPE_THEN `x` (WITH 3 o SPEC);
TYPE_THEN `y` (WITH 3 o SPEC);
KILL 3; (* start of yest *)
H_MATCH_MP (HYP "18")(HYP "14");
H_MATCH_MP (HYP "10") (HYP "13");
CHO 19;
CHO 3;
AND 19;
CHO 20;
AND 20;
USE 20 (REWRITE_RULE [open_ball]);
REWR 19;
USE 19 (REWRITE_RULE [IN_ELIM_THM']);
AND 19;
AND 19;
TYPE_THEN `dX x' x < delta x'` SUBGOAL_TAC;
UND 19;
IMATCH_MP_TAC (REAL_ARITH `((u <. v) ==> (a< u)==>(a <v))`);
TYPE_THEN `x'` (USE 8 o SPEC);
UND 8;
REWRITE_TAC[REAL_LT_HALF2;REAL_LT_HALF1 ];
DISCH_TAC;
ALL_TAC ; (* cc3 *)
TYPE_THEN `dX x' y < delta x'` SUBGOAL_TAC;
CONV_TAC (RAND_CONV (ONCE_REWRITE_CONV [GSYM REAL_HALF_DOUBLE]));
IMATCH_MP_TAC (REAL_ARITH `(dX x' x <. u) /\ (dX x y <. u) /\ (dX x' y <= dX x' x +. dX x y) ==> (dX x' y <. u + u)`);
ASM_REWRITE_TAC[];
CONJ_TAC;
UND 15;
IMATCH_MP_TAC (REAL_ARITH `((u <=. v) ==> (a< u)==>(a <v))`);
IMATCH_MP_TAC (REAL_ARITH `(u + u) <= (v +. v) ==> (u <= v)`);
REWRITE_TAC[REAL_HALF_DOUBLE];
AND 12;
UND 12;
DISCH_THEN (MATCH_MP_TAC);
EXPAND_TAC "ds";
REWRITE_TAC[IMAGE;IN; IN_ELIM_THM' ];
UND 21;
MESON_TAC[];
IMATCH_MP_TAC metric_space_triangle;
TYPE_THEN `X` EXISTS_TAC;
ASM_REWRITE_TAC[];
DISCH_ALL_TAC;
CONV_TAC (RAND_CONV (ONCE_REWRITE_CONV [GSYM REAL_HALF_DOUBLE]));
TYPE_THEN `(dY (f x) (f x') <. u0) /\ (dY (f x') (f y) <. u0) /\ (dY (f x) (f y) <= (dY (f x) (f x')) + (dY (f x') (f y))) ==> ((dY (f x) (f y)) < u0 + u0)` (fun t-> (IMATCH_MP_TAC (REAL_ARITH t)));
TYPE_THEN `x'` (USE 0 o SPEC);
AND 0;
USE 0 (REWRITE_RULE[IN ]);
TYPE_THEN `y` (WITH 0 o SPEC);
TYPE_THEN `x` (USE 0 o SPEC);
ALL_TAC; (* cc4 *)
TYPE_THEN `Y (f x) /\ Y (f y) /\ Y (f x')` SUBGOAL_TAC;
UND 4;
REWRITE_TAC[SUBSET;IN_IMAGE; ];
REWRITE_TAC[IN ];
UND 13;
UND 14;
UND 22;
MESON_TAC[];
DISCH_ALL_TAC;
CONJ_TAC;
TYPE_THEN `dY (f x) (f x') = dY (f x') (f x)` SUBGOAL_TAC;
UND 2;
UND 28;
UND 30;
TYPEL_THEN [`Y`;`dY`;`f x`;`f x'`] (fun t-> MP_TAC(ISPECL t metric_space_symm));
MESON_TAC[];
DISCH_THEN (fun t-> REWRITE_TAC[t]);
UND 0;
DISCH_THEN IMATCH_MP_TAC ;
ASM_REWRITE_TAC[];
CONJ_TAC;
UND 27;
DISCH_THEN IMATCH_MP_TAC ;
ASM_REWRITE_TAC[];
TYPEL_THEN [`Y`;`dY`;`f x`;`f x'`;`f y`] (fun t-> MP_TAC(ISPECL t metric_space_triangle));
DISCH_THEN IMATCH_MP_TAC ;
ASM_REWRITE_TAC[];
]);;
(* }}} *)
(* I'm rather surprised that this lemma did not need the
hypothesis that U and- V are topologies. *)
let image_compact = prove_by_refinement(
`!U V (f:A->B) K. (continuous f U V ) /\
(compact U K) /\ (IMAGE f K SUBSET (UNIONS V))
==> (compact V (IMAGE f K))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
REWRITE_TAC[compact];
ASM_REWRITE_TAC[];
DISCH_ALL_TAC;
TYPE_THEN `cov = IMAGE (\v. preimage (UNIONS U) f v ) V'` ABBREV_TAC ;
TYPE_THEN `cov SUBSET U` SUBGOAL_TAC ;
EXPAND_TAC "cov";
REWRITE_TAC[SUBSET;IN_IMAGE ];
NAME_CONFLICT_TAC;
GEN_TAC;
DISCH_ALL_TAC;
CHO 6;
AND 6;
ASM_REWRITE_TAC[];
USE 4 (REWRITE_RULE[SUBSET]);
TYPE_THEN `x'` (USE 4 o SPEC);
REWR 4;
UND 4;
UND 0;
REWRITE_TAC[continuous];
MESON_TAC[];
TYPE_THEN `K SUBSET UNIONS cov` SUBGOAL_TAC;
ALL_TAC; (* ic1 *)
UND 3;
REWRITE_TAC[SUBSET;IN_IMAGE ];
NAME_CONFLICT_TAC;
REWRITE_TAC[IN];
DISCH_ALL_TAC;
LEFT 3 "x'";
DISCH_ALL_TAC;
LEFT 3 "x'";
TYPE_THEN `x'` (USE 3 o SPEC);
TYPE_THEN `f x'` (USE 3 o SPEC);
REWR 3;
UND 3;
REWRITE_TAC[UNIONS;IN;IN_ELIM_THM' ];
USE 5 (REWRITE_RULE[IMAGE]);
EXPAND_TAC "cov";
REWRITE_TAC[IN_ELIM_THM';IN ];
DISCH_ALL_TAC;
CHO 5;
CONV_TAC (quant_left_CONV "x");
CONV_TAC (quant_left_CONV "x");
TYPE_THEN `u` EXISTS_TAC;
NAME_CONFLICT_TAC;
TYPE_THEN `preimage (UNIONS U) f u` EXISTS_TAC;
ASM_REWRITE_TAC[preimage;IN_ELIM_THM' ;IN ];
USE 1 (REWRITE_RULE[compact;SUBSET;IN ]);
AND 1;
UND 7;
UND 6;
MESON_TAC[];
DISCH_ALL_TAC;
USE 1 (REWRITE_RULE[compact]);
AND 1;
TYPE_THEN `cov` (USE 1 o SPEC);
REWR 1;
CHO 1;
ALL_TAC ; (* ic2 *)
TYPE_THEN `(?V''. V'' SUBSET V' /\ FINITE V'' /\ (W = IMAGE (\v. preimage (UNIONS U) f v) V''))` SUBGOAL_TAC;
IMATCH_MP_TAC finite_subset ;
ASM_MESON_TAC[];
DISCH_ALL_TAC;
CHO 9;
TYPE_THEN `V''` EXISTS_TAC;
ASM_REWRITE_TAC[];
REWRITE_TAC[SUBSET;IN_IMAGE];
REWRITE_TAC[IN;UNIONS;IN_ELIM_THM' ];
NAME_CONFLICT_TAC;
CONV_TAC (quant_left_CONV "x'");
CONV_TAC (quant_left_CONV "x'");
DISCH_ALL_TAC;
ASM_REWRITE_TAC[];
AND 1;
AND 1;
USE 1 (REWRITE_RULE[SUBSET;UNIONS;IN;IN_ELIM_THM' ]);
TYPE_THEN `x'` (USE 1 o SPEC);
REWR 1;
CHO 1;
AND 1;
USE 14 (REWRITE_RULE[IMAGE;IN ;IN_ELIM_THM' ]);
TYPE_THEN `u':B->bool` (X_CHO 14);
TYPE_THEN `u'` EXISTS_TAC;
ASM_REWRITE_TAC[];
UND 1;
ASM_REWRITE_TAC[preimage;IN;IN_ELIM_THM' ];
MESON_TAC [];
]);;
(* }}} *)
let metric_bounded = euclid_def
`metric_bounded (X,d) <=>
?(x:A) r. X SUBSET (open_ball(X,d) x r)`;;
let euclid_ball_cube = prove_by_refinement(
`!n x r. ?N. (open_ball(euclid n,d_euclid) x r) SUBSET
{x | euclid n x /\ (!i. abs (x i) <= &N)}`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
REWRITE_TAC[SUBSET;IN;IN_ELIM_THM';
open_ball; ];
ASSUME_TAC REAL_ARCH_SIMPLE;
TYPE_THEN ` (d_euclid x (\i. &.0) +. r)` (USE 0 o SPEC);
X_CHO 0 `N:num`;
TYPE_THEN `N` EXISTS_TAC;
DISCH_ALL_TAC;
ASM_REWRITE_TAC[];
GEN_TAC ;
ASSUME_TAC proj_contraction;
TYPEL_THEN [`n`;`x'`;`(\(i :num). &.0)`;`i`] (USE 4 o SPECL);
USE 4 BETA_RULE ;
USE 4 (CONV_RULE REDUCE_CONV );
TYPE_THEN `euclid n (\i. &.0)` SUBGOAL_TAC ;
REWRITE_TAC[euclid];
DISCH_TAC;
REWR 4;
ASSUME_TAC metric_euclid;
TYPE_THEN `n` (USE 6 o SPEC);
TYPE_THEN `d_euclid x' (\i. &.0) <=. d_euclid x' x + d_euclid x (\i. &0)` SUBGOAL_TAC;
IMATCH_MP_TAC metric_space_triangle;
TYPE_THEN `euclid n` EXISTS_TAC;
ASM_REWRITE_TAC[];
TYPE_THEN `d_euclid x' x = d_euclid x x'` SUBGOAL_TAC;
IMATCH_MP_TAC metric_space_symm;
TYPE_THEN `euclid n` EXISTS_TAC;
ASM_REWRITE_TAC[];
UND 0;
UND 3;
UND 4;
REAL_ARITH_TAC;
]);;
(* }}} *)
let totally_bounded_euclid = prove_by_refinement(
`!X n. (metric_bounded (X,d_euclid) /\
(X SUBSET (euclid n))) ==>
(totally_bounded (X,d_euclid))`,
(* {{{ proof *)
[
REWRITE_TAC[metric_bounded];
DISCH_ALL_TAC;
IMATCH_MP_TAC
totally_bounded_subset;
CHO 0;
CHO 0;
ASSUME_TAC
euclid_ball_cube;
TYPEL_THEN [`n`;`x`;`r`] (USE 2 o SPECL);
CHO 2;
ASSUME_TAC
open_ball_subspace;
TYPEL_THEN [`euclid n`;`X`;`d_euclid`;`x`;`r`] (USE 3 o ISPECL);
REWR 3;
JOIN 0 3;
USE 0 (MATCH_MP SUBSET_TRANS);
JOIN 0 2;
USE 0 (MATCH_MP SUBSET_TRANS);
TYPE_THEN `{x | euclid n x /\ (!i. abs (x i) <= &N)}` EXISTS_TAC;
ASM_REWRITE_TAC[
totally_bounded_cube ];
IMATCH_MP_TAC
metric_subspace;
TYPE_THEN `euclid n` EXISTS_TAC;
REWRITE_TAC[
metric_euclid];
REWRITE_TAC[SUBSET;IN;IN_ELIM_THM' ];
MESON_TAC[];
]);;
(* }}} *)
(* topology is not needed as an assumption here! *)
let induced_compact = prove_by_refinement(
`!U (K:A->bool). (K SUBSET (UNIONS U)) ==>
(compact U K <=> (compact (induced_top U K) K))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
ASM_REWRITE_TAC[compact];
EQ_TAC;
DISCH_ALL_TAC;
ASM_REWRITE_TAC[
induced_top_support;
SUBSET_INTER;SUBSET_REFL ];
DISCH_ALL_TAC;
USE 3 (REWRITE_RULE[induced_top;SUBSET;IN_IMAGE ]);
LEFT 3 "x'";
LEFT 3 "x'";
X_CHO 3 `u:(A->bool)->(A->bool)`;
TYPE_THEN `IMAGE u V` (USE 1 o SPEC);
TYPE_THEN `K SUBSET UNIONS (IMAGE u V) /\ IMAGE u V SUBSET U` SUBGOAL_TAC;
REWRITE_TAC[IMAGE;SUBSET;IN_UNIONS;IN_ELIM_THM' ];
CONJ_TAC;
REWRITE_TAC[IN];
DISCH_ALL_TAC;
USE 2 (REWRITE_RULE[SUBSET;IN_UNIONS ]);
USE 2 (REWRITE_RULE[IN ]);
TYPE_THEN `x` (USE 2 o SPEC);
REWR 2;
X_CHO 2 `v:A->bool`;
NAME_CONFLICT_TAC;
CONV_TAC (quant_left_CONV "x'");
CONV_TAC (quant_left_CONV "x'");
TYPE_THEN `v` EXISTS_TAC;
TYPE_THEN `u v` EXISTS_TAC;
ASM_REWRITE_TAC[];
TYPE_THEN `v` (USE 3 o SPEC);
USE 3 (REWRITE_RULE[IN]);
REWR 3;
ASSUME_TAC INTER_SUBSET;
USE 5 (CONJUNCT1);
TYPEL_THEN [`u v`;`K`] (USE 5 o ISPECL);
ASM_MESON_TAC[SUBSET;IN];
NAME_CONFLICT_TAC;
REWRITE_TAC[IN ];
ASM_MESON_TAC[IN];
DISCH_TAC;
REWR 1;
CHO 1;
AND 1;
AND 1;
JOIN 6 5;
(*** Modified by JRH for changed theorem name
USE 5 (MATCH_MP FINITE_SUBSET_IMAGE);
***)
USE 5 (MATCH_MP FINITE_SUBSET_IMAGE_IMP);
X_CHO 5 `W':(A->bool)->bool`;
TYPE_THEN `W'` EXISTS_TAC;
ASM_REWRITE_TAC[];
TYPE_THEN `K SUBSET UNIONS (IMAGE u W')` SUBGOAL_TAC;
ASM_MESON_TAC[UNIONS_UNIONS ;SUBSET_TRANS];
REWRITE_TAC[SUBSET;IN_UNIONS;IN_IMAGE; ];
NAME_CONFLICT_TAC;
REWRITE_TAC[IN];
DISCH_ALL_TAC;
DISCH_ALL_TAC;
TYPE_THEN `x'` (USE 6 o SPEC);
REWR 6;
CHO 6;
AND 6;
CHO 8;
AND 5;
AND 5;
USE 10 (REWRITE_RULE[SUBSET;IN ]);
TYPE_THEN `x''` (USE 10 o SPEC);
REWR 10;
USE 3 (REWRITE_RULE[IN]);
TYPE_THEN `x''` (USE 3 o SPEC);
REWR 3;
TYPE_THEN `x''` EXISTS_TAC;
ASM_REWRITE_TAC[];
ASM ONCE_REWRITE_TAC[];
REWRITE_TAC[INTER;IN;IN_ELIM_THM' ];
ASM_MESON_TAC[];
ALL_TAC ; (* dd1*)
DISCH_ALL_TAC;
DISCH_ALL_TAC;
TYPE_THEN `VK = IMAGE (\b. (b INTER K)) V` ABBREV_TAC ;
TYPE_THEN `VK` (USE 2 o SPEC);
TYPE_THEN `K SUBSET UNIONS VK /\ VK SUBSET induced_top U K` SUBGOAL_TAC;
CONJ_TAC;
EXPAND_TAC "VK";
REWRITE_TAC[INTER_THM;GSYM UNIONS_INTER ];
ASM_REWRITE_TAC[SUBSET_INTER;SUBSET_REFL ]; (* end of branch *)
REWRITE_TAC[induced_top];
EXPAND_TAC "VK";
REWRITE_TAC[INTER_THM ];
IMATCH_MP_TAC IMAGE_SUBSET;
ASM_REWRITE_TAC[];
DISCH_ALL_TAC;
REWR 2;
X_CHO 2 `WK:(A->bool)->bool`;
TYPEL_THEN [`V`;`(INTER) K`;`WK`] (fun t-> MP_TAC (ISPECL t finite_subset ));
ASM_REWRITE_TAC[];
AND 2;
UND 8;
EXPAND_TAC "VK";
REWRITE_TAC[INTER_THM];
DISCH_ALL_TAC;
REWR 8;
CHO 8;
TYPE_THEN `C` EXISTS_TAC;
ASM_REWRITE_TAC[];
REWR 2;
AND 2;
USE 2 (REWRITE_RULE[GSYM UNIONS_INTER]);
UND 2;
TYPE_THEN `R = UNIONS C` ABBREV_TAC;
SET_TAC[];
]);;
(* }}} *)
let compact_euclid = prove_by_refinement(
`!X n. (X SUBSET euclid n) ==>
(compact (top_of_metric(euclid n,d_euclid)) X <=>
(closed_ (top_of_metric(euclid n,d_euclid)) X /\
(metric_bounded(X,d_euclid))))`,
(* }}} *)
let neg_continuous = prove_by_refinement(
`!n. metric_continuous (euclid_neg) (euclid n,d_euclid) (euclid n,d_euclid)`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
REWRITE_TAC[metric_continuous;metric_continuous_pt];
DISCH_ALL_TAC;
RIGHT_TAC "delta";
DISCH_TAC;
TYPE_THEN `epsilon` EXISTS_TAC;
ASM_REWRITE_TAC[IN ];
DISCH_ALL_TAC;
REWRITE_TAC[d_euclid];
REWRITE_TAC[euclid_neg_sum];
REWRITE_TAC[norm_neg];
REWRITE_TAC[GSYM d_euclid];
ASM_REWRITE_TAC[];
]);;
(* }}} *)
let continuous_comp = prove_by_refinement(
`!(f:A->B) (g:B->C) U V W.
continuous f U V /\ continuous g V W /\
(IMAGE f (UNIONS U) SUBSET (UNIONS V)) ==>
continuous (g o f) U W`,
(* {{{ proof *)
[
REWRITE_TAC[continuous;IN;preimage];
DISCH_ALL_TAC;
X_GEN_TAC `w :C->bool`;
DISCH_TAC;
TYPE_THEN `w ` (USE 1 o SPEC);
REWR 1;
TYPE_THEN `{x | UNIONS V x /\ w (g x)}` (USE 0 o SPEC);
REWR 0;
USE 0 (REWRITE_RULE[IN_ELIM_THM' ]);
REWRITE_TAC[o_DEF ];
TYPE_THEN `U {x | UNIONS U x /\ UNIONS V (f x) /\ w (g (f x))} = U {x | UNIONS U x /\ w (g (f x))}` SUBGOAL_TAC;
AP_TERM_TAC;
IMATCH_MP_TAC EQ_EXT;
DISCH_ALL_TAC;
REWRITE_TAC[IN_ELIM_THM'];
IMATCH_MP_TAC (TAUT `(a ==> b) ==> ((a /\ b /\ c) <=> (a /\ c ))`);
TYPE_THEN `UU = UNIONS U ` ABBREV_TAC;
TYPE_THEN `VV = UNIONS V` ABBREV_TAC ;
USE 2 (REWRITE_RULE[SUBSET;IN_IMAGE ]);
ASM_MESON_TAC[IN];
DISCH_THEN (fun t-> (USE 0 ( REWRITE_RULE[t])));
ASM_REWRITE_TAC[];
]);;
(* }}} *)
let compact_max = prove_by_refinement(
`!(f:A->(num->real)) U K.
(continuous f U (top_of_metric(euclid 1,d_euclid))) /\
(IMAGE f K SUBSET (euclid 1)) /\
(compact U K) /\ ~(K=EMPTY)==>
(?x. K x /\ (!y. (K y) ==> (f y 0 <= f x 0)))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
COPY 2;
COPY 1;
TYPE_THEN `euclid 1 = UNIONS (top_of_metric (euclid 1,d_euclid))` SUBGOAL_TAC;
MESON_TAC[
top_of_metric_unions;
metric_euclid];
DISCH_THEN (fun t-> USE 5 (ONCE_REWRITE_RULE[t]));
JOIN 4 5;
COPY 0;
JOIN 0 4;
WITH 0 (MATCH_MP
image_compact);
UND 4;
ASM_SIMP_TAC[
compact_euclid];
DISCH_ALL_TAC;
TYPE_THEN `P = (IMAGE (coord 0) (IMAGE f K))` ABBREV_TAC ;
TYPE_THEN `(?s. !y. (?x. P x /\ y <. x) <=> y <. s)` SUBGOAL_TAC;
IMATCH_MP_TAC REAL_SUP_EXISTS;
CONJ_TAC;
USE 3 (REWRITE_RULE[
EMPTY_EXISTS;IN ]);
CHO 3;
TYPE_THEN `f u 0` EXISTS_TAC;
EXPAND_TAC "P";
REWRITE_TAC[IMAGE;IN;IN_ELIM_THM';coord ];
NAME_CONFLICT_TAC;
LEFT_TAC "x'";
LEFT_TAC "x'";
TYPE_THEN `u` EXISTS_TAC;
ASM_MESON_TAC[];
USE 6 (REWRITE_RULE[metric_bounded;open_ball;SUBSET;IN_IMAGE ]);
X_CHO 6 `x0:num->real`;
X_CHO 6 `r:real`;
USE 6 (REWRITE_RULE[IN;IN_ELIM_THM' ]);
EXPAND_TAC "P";
REWRITE_TAC[IMAGE;IN;IN_ELIM_THM';coord];
NAME_CONFLICT_TAC;
TYPE_THEN `x0 0 +. r` EXISTS_TAC;
DISCH_ALL_TAC;
X_CHO 8 `fx:num->real`;
AND 8;
ASM_REWRITE_TAC[];
KILL 8;
X_CHO 9 `x:A`;
LEFT 6 "x";
LEFT 6 "x";
TYPE_THEN `x` (USE 6 o SPEC);
TYPE_THEN `fx` (USE 6 o SPEC);
REWR 6;
TYPE_THEN `(d_euclid x0 (f x) = abs (x0 0 - (f x 0)))` SUBGOAL_TAC;
IMATCH_MP_TAC euclid1_abs;
USE 1 (REWRITE_RULE[SUBSET;IN ]);
ASM_MESON_TAC[];
AND 6;
AND 6;
DISCH_TAC;
REWR 6;
UND 6;
REAL_ARITH_TAC;
DISCH_TAC;
ALL_TAC ; (* cc1 *)
TYPE_THEN `(!u. (P u) ==> (u <=. sup P)) /\ (P (sup P))` SUBGOAL_TAC;
REWRITE_TAC[sup];
SELECT_TAC;
CHO 8;
ASM_REWRITE_TAC[];
DISCH_TAC;
TYPE_THEN `s = t` SUBGOAL_TAC;
PROOF_BY_CONTR_TAC;
USE 10 (MATCH_MP (REAL_ARITH `~(s=t) ==> (s<. t) \/ (t <. s)`));
TYPE_THEN `s ` (WITH 9 o SPEC);
TYPE_THEN `t` (WITH 9 o SPEC);
ASM_MESON_TAC[REAL_ARITH `~(x <. x)`];
DISCH_TAC;
REWR 8;
SUBCONJ_TAC;
DISCH_ALL_TAC;
TYPE_THEN `t` (USE 8 o SPEC);
UND 8;
REWRITE_TAC[REAL_ARITH `~(x <. x)`];
LEFT_TAC "x";
LEFT_TAC "x";
TYPE_THEN `u` EXISTS_TAC;
ASM_REWRITE_TAC[];
REAL_ARITH_TAC;
DISCH_ALL_TAC;
PROOF_BY_CONTR_TAC;
TYPE_THEN `~ (IMAGE f K) (t *# (dirac_delta 0))` SUBGOAL_TAC;
PROOF_BY_CONTR_TAC;
REWR 13;
UND 12;
EXPAND_TAC "P";
ONCE_REWRITE_TAC[IMAGE];
ONCE_REWRITE_TAC[IMAGE];
ONCE_REWRITE_TAC[IMAGE];
REWRITE_TAC[IN_ELIM_THM';IN];
TYPE_THEN `t *# (dirac_delta 0)` EXISTS_TAC;
ASM_REWRITE_TAC[];
ALL_TAC ; (* cc2 *)
REWRITE_TAC[coord_dirac];
DISCH_TAC;
USE 4 (MATCH_MP closed_open);
ASSUME_TAC (SPEC `1` metric_euclid);
WITH 14 (MATCH_MP top_of_metric_unions);
WITH 15 (GSYM);
REWR 4;
TYPE_THEN `z = t *# dirac_delta 0` ABBREV_TAC ;
TYPE_THEN `(euclid 1 DIFF (IMAGE f K)) z` SUBGOAL_TAC ;
REWRITE_TAC[REWRITE_RULE[IN] IN_DIFF];
ASM_REWRITE_TAC[];
EXPAND_TAC "z";
REWRITE_TAC[euclid;euclid_scale;dirac_delta];
DISCH_ALL_TAC;
ASSUME_TAC (ARITH_RULE `1 <=| m ==> (~(0=m))`);
REWR 19;
ASM_REWRITE_TAC[];
REDUCE_TAC;
REWRITE_TAC[];
UND 16;
DISCH_THEN (fun t-> ONCE_REWRITE_TAC [GSYM t]);
UND 4;
REWRITE_TAC[open_DEF];
ASM_SIMP_TAC[top_of_metric_nbd];
DISCH_ALL_TAC;
IN_OUT_TAC ;
TYPE_THEN `z` (USE 0 o SPEC);
KILL 12;
KILL 13;
KILL 9;
UND 14;
UND 3;
REWRITE_TAC[];
DISCH_THEN (fun t-> ONCE_REWRITE_TAC[GSYM t]);
DISCH_ALL_TAC;
REWR 0;
CHO 0;
AND 0;
USE 0 (REWRITE_RULE[SUBSET;IN; open_ball;IN_ELIM_THM' ]);
COPY 0;
TYPE_THEN `(t- (r/(&.2)))*# (dirac_delta 0)` (USE 0 o SPEC);
TYPE_THEN `euclid 1 z /\ euclid 1 ((t - r / &2) *# dirac_delta 0) /\ d_euclid z ((t - r / &2) *# dirac_delta 0) < r` SUBGOAL_TAC;
EXPAND_TAC "z";
SUBCONJ_TAC;
REWRITE_TAC[euclid;dirac_delta;euclid_scale];
GEN_TAC;
SIMP_TAC [ (ARITH_RULE `1 <=| m ==> (~(0=m))`)];
REWRITE_TAC[REAL_ARITH `t*(&.0) = (&.0)`];
DISCH_ALL_TAC;
SUBCONJ_TAC;
REWRITE_TAC[euclid;dirac_delta;euclid_scale];
GEN_TAC;
SIMP_TAC [ (ARITH_RULE `1 <=| m ==> (~(0=m))`)];
REWRITE_TAC[REAL_ARITH `t*(&.0) = (&.0)`];
ALL_TAC ; (* cc3 *)
UND 13 ;
SIMP_TAC[euclid1_abs];
DISCH_ALL_TAC;
REWRITE_TAC[euclid_minus ; euclid_scale;dirac_delta ];
REDUCE_TAC ;
REWRITE_TAC[REAL_ARITH `t - (t - (r/(&.2))) = r/(&.2)`];
WITH 9 (ONCE_REWRITE_RULE[GSYM REAL_LT_HALF1]);
WITH 19 (MATCH_MP (REAL_ARITH `&.0 < x ==> (&.0 <= x)`));
WITH 20 (REWRITE_RULE[GSYM REAL_ABS_REFL]);
ASM_REWRITE_TAC[];
REWRITE_TAC[REAL_LT_HALF2];
ASM_REWRITE_TAC[];
DISCH_THEN (fun t-> (USE 0 (REWRITE_RULE[t])));
ALL_TAC ; (* cc4 *)
TYPE_THEN `t - (r/(&.2)) ` (USE 10 o SPEC);
TYPE_THEN `t - r / &2 < t` SUBGOAL_TAC;
IMATCH_MP_TAC (REAL_ARITH `&.0 < x ==> (t - x < t)`);
WITH 9 (ONCE_REWRITE_RULE[GSYM REAL_LT_HALF1]);
ASM_REWRITE_TAC[];
DISCH_TAC ;
REWR 10;
X_CHO 10 `u:real`;
TYPE_THEN `u` (USE 7 o SPEC);
REWR 7;
TYPE_THEN `(euclid 1 DIFF IMAGE f K) (u *# (dirac_delta 0))` SUBGOAL_TAC ;
UND 12;
DISCH_THEN (IMATCH_MP_TAC );
EXPAND_TAC "z";
SUBCONJ_TAC;
REWRITE_TAC[euclid;euclid_scale;dirac_delta];
REWRITE_TAC[ (ARITH_RULE `1 <=| m <=> (~(0=m))`)];
DISCH_ALL_TAC;
ASM_REWRITE_TAC[];
REAL_ARITH_TAC;
DISCH_ALL_TAC;
SUBCONJ_TAC;
REWRITE_TAC[euclid;euclid_scale;dirac_delta];
REWRITE_TAC[ (ARITH_RULE `1 <=| m <=> (~(0=m))`)];
DISCH_ALL_TAC;
ASM_REWRITE_TAC[];
REAL_ARITH_TAC;
DISCH_ALL_TAC;
ASM_SIMP_TAC[euclid1_abs];
EXPAND_TAC "z";
REWRITE_TAC[dirac_delta;euclid_scale;euclid_minus];
REDUCE_TAC;
AND 10;
REWRITE_TAC[GSYM ABS_BETWEEN];
ASM_REWRITE_TAC[];
CONJ_TAC;
UND 7;
UND 9;
REAL_ARITH_TAC;
UND 10;
IMATCH_MP_TAC (REAL_ARITH `y <. x ==> ((t - y <. u) ==> (t <. u + x))`);
REWRITE_TAC[REAL_LT_HALF2];
ASM_REWRITE_TAC[];
REWRITE_TAC[REWRITE_RULE[IN] IN_DIFF];
IMATCH_MP_TAC (TAUT `B ==> (~(A /\ ~B))`);
AND 10;
UND 14;
EXPAND_TAC "P";
TYPE_THEN `B = IMAGE f K` ABBREV_TAC ;
ALL_TAC ; (* cc5 *)
REWRITE_TAC[IMAGE;coord;IN;IN_ELIM_THM' ];
DISCH_TAC;
CHO 19;
AND 19;
ASM_REWRITE_TAC[];
USE 17 (REWRITE_RULE[SUBSET;IN]);
TYPE_THEN `x` (USE 17 o SPEC);
REWR 17;
USE 17 (REWRITE_RULE[euclid1_dirac]);
ASM_MESON_TAC[];
ASM_MESON_TAC[];
TYPE_THEN `t = sup P` ABBREV_TAC;
DISCH_ALL_TAC;
UND 11;
EXPAND_TAC "P";
REWRITE_TAC[];
ONCE_REWRITE_TAC[IMAGE];
REWRITE_TAC[IN_IMAGE;IN_ELIM_THM';IN ];
NAME_CONFLICT_TAC;
DISCH_ALL_TAC;
CHO 11;
AND 11;
CHO 12;
REWR 11;
TYPE_THEN `x'` EXISTS_TAC;
ASM_REWRITE_TAC[];
DISCH_ALL_TAC;
UND 10;
EXPAND_TAC "P";
REWRITE_TAC[];
ONCE_REWRITE_TAC[IMAGE];
REWRITE_TAC[IN_IMAGE;IN_ELIM_THM' ];
REWRITE_TAC[IN];
ASM_REWRITE_TAC[];
REWRITE_TAC[coord];
NAME_CONFLICT_TAC;
DISCH_ALL_TAC;
TYPE_THEN `f y' 0` (USE 10 o SPEC);
UND 10;
DISCH_THEN IMATCH_MP_TAC ;
LEFT_TAC "x'";
LEFT_TAC "x'";
ASM_MESON_TAC[];
(* finish *)
]);;
(* }}} *)
(* ------------------------------------------------------------------ *)
(* homeomorphisms *)
(* ------------------------------------------------------------------ *)
let homeomorphism = euclid_def `homeomorphism (f:A->B) U V <=>
(BIJ f (UNIONS U) (UNIONS V) ) /\ (continuous f U V) /\
(!A. (U A) ==> (V (IMAGE f A)))`;;
let INV_homeomorphism = prove_by_refinement(
`!f U V. homeomorphism (f:A-> B) U V ==>
(continuous (INV f (UNIONS U) (UNIONS V)) V U)`,
(* {{{ proof *)
[
REWRITE_TAC[continuous;IN;preimage];
REWRITE_TAC[homeomorphism];
DISCH_ALL_TAC;
X_GEN_TAC `u:A->bool`;
DISCH_ALL_TAC;
TYPE_THEN `{ x | UNIONS V x /\ u (INV f (UNIONS U) (UNIONS V) x)} = IMAGE f u` SUBGOAL_TAC;
IMATCH_MP_TAC EQ_EXT ;
X_GEN_TAC `t:B`;
REWRITE_TAC[IN_ELIM_THM';
IMAGE ;IN ];
EQ_TAC ;
DISCH_ALL_TAC;
TYPE_THEN `(INV f (UNIONS U) (UNIONS V) t)` EXISTS_TAC;
ASM_REWRITE_TAC[];
ASM_MESON_TAC[INVERSE_DEF;IN;BIJ ];
DISCH_ALL_TAC;
CHO 4;
SUBCONJ_TAC;
USE 0 (REWRITE_RULE[BIJ;INJ]);
IN_OUT_TAC ;
ASM_REWRITE_TAC[];
AND 4;
AND 5;
TYPE_THEN `x` (USE 6 o SPEC);
UND 6;
DISCH_THEN (IMATCH_MP_TAC );
REWRITE_TAC[UNIONS;IN;IN_ELIM_THM' ];
ASM_MESON_TAC[];
DISCH_TAC ;
TYPE_THEN `INV f (UNIONS U) (UNIONS V) t = x` SUBGOAL_TAC;
(* stop here this is an example that ASM_MESON_TAC should catch *)
(* ASM_MESON_TAC[INVERSE_XY;IN ;UNIONS ]; *)
TYPE_THEN `(UNIONS U x)` SUBGOAL_TAC;
REWRITE_TAC[UNIONS;IN_ELIM_THM';IN ];
ASM_MESON_TAC[];
ASM_MESON_TAC[INVERSE_XY;IN ];
DISCH_THEN (fun t-> REWRITE_TAC[t]);
ASM_REWRITE_TAC[];
DISCH_THEN (fun t-> REWRITE_TAC[t]);
UND 2;
DISCH_THEN IMATCH_MP_TAC ;
ASM_REWRITE_TAC[];
]);;
(* }}} *)
let bicont_homeomorphism = prove_by_refinement(
`!f U V. (BIJ (f:A->B) (UNIONS U) (UNIONS V)) /\ (continuous f U V) /\
(continuous (INV f (UNIONS U) (UNIONS V)) V U) ==>
(homeomorphism f U V)`,
(* {{{ proof *)
[
REWRITE_TAC[homeomorphism];
DISCH_ALL_TAC;
ASM_REWRITE_TAC[];
DISCH_ALL_TAC;
UND 2;
REWRITE_TAC[continuous;IN;preimage ];
DISCH_ALL_TAC;
TYPE_THEN `A` (USE 2 o SPEC);
REWR 2;
TYPE_THEN `{x | UNIONS V x /\ A (INV f (UNIONS U) (UNIONS V) x)}= (IMAGE f A) ` SUBGOAL_TAC;
IMATCH_MP_TAC EQ_EXT ;
X_GEN_TAC `t:B`;
REWRITE_TAC[IN_ELIM_THM';
IMAGE ;IN ];
EQ_TAC ;
DISCH_ALL_TAC;
TYPE_THEN `(INV f (UNIONS U) (UNIONS V) t)` EXISTS_TAC;
ASM_REWRITE_TAC[];
ASM_MESON_TAC[INVERSE_DEF;IN;BIJ ];
DISCH_ALL_TAC;
CHO 4;
SUBCONJ_TAC;
USE 0 (REWRITE_RULE[BIJ;INJ]);
IN_OUT_TAC ;
ASM_REWRITE_TAC[];
AND 4;
AND 5;
TYPE_THEN `x` (USE 6 o SPEC);
UND 6;
DISCH_THEN (IMATCH_MP_TAC );
REWRITE_TAC[UNIONS;IN;IN_ELIM_THM' ];
ASM_MESON_TAC[];
DISCH_TAC ;
TYPE_THEN `INV f (UNIONS U) (UNIONS V) t = x` SUBGOAL_TAC;
TYPE_THEN `(UNIONS U x)` SUBGOAL_TAC;
REWRITE_TAC[UNIONS;IN_ELIM_THM';IN ];
ASM_MESON_TAC[];
ASM_MESON_TAC[INVERSE_XY;IN ];
DISCH_THEN (fun t-> REWRITE_TAC[t]);
ASM_REWRITE_TAC[];
DISCH_THEN (fun t-> REWRITE_TAC[GSYM t]);
ASM_REWRITE_TAC[];
]);;
(* }}} *)
let open_and_closed = prove_by_refinement(
`!(f:A->B) U V. (topology_ U) /\ (topology_ V) /\
(BIJ f (UNIONS U) (UNIONS V)) ==>
((!A. (U A ==> V (IMAGE f A))) <=>
(!B. (closed_ U B) ==> (closed_ V (IMAGE f B))))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
REWRITE_TAC[closed];
EQ_TAC;
DISCH_ALL_TAC;
DISCH_ALL_TAC;
SUBCONJ_TAC;
UND 4;
UND 2;
(* should have worked:
ASM_MESON_TAC[SUBSET;IN;BIJ;INJ;IMAGE;IN_ELIM_THM' ];
bug found? *)
REWRITE_TAC[BIJ;IN;INJ;SUBSET;IMAGE;IN_ELIM_THM' ];
DISCH_ALL_TAC;
NAME_CONFLICT_TAC;
TYPE_THEN `y:B` X_GEN_TAC;
ASM_MESON_TAC[];
DISCH_ALL_TAC;
REWRITE_TAC[open_DEF];
USE 5 (REWRITE_RULE[open_DEF]);
TYPE_THEN `UNIONS U DIFF B` (USE 3 o SPEC);
REWR 3;
TYPE_THEN `IMAGE f (UNIONS U DIFF B) = (UNIONS V DIFF IMAGE f B)` SUBGOAL_TAC;
ASM_MESON_TAC[
DIFF_SURJ];
ASM_MESON_TAC[];
REWRITE_TAC[open_DEF];
DISCH_ALL_TAC;
DISCH_ALL_TAC;
TYPE_THEN `UNIONS U DIFF A` (USE 3 o SPEC);
TYPE_THEN `UNIONS U DIFF A SUBSET UNIONS U /\ U (UNIONS U DIFF (UNIONS U DIFF A))` SUBGOAL_TAC;
ASM_SIMP_TAC[
sub_union ;
DIFF_DIFF2 ];
ASM_REWRITE_TAC[SUBSET_DIFF];
DISCH_TAC ;
REWR 3;
TYPE_THEN `UNIONS V DIFF IMAGE f (UNIONS U DIFF A) = IMAGE f A` SUBGOAL_TAC;
ASM_MESON_TAC[
DIFF_SURJ;
sub_union;
DIFF_DIFF2];
ASM_MESON_TAC[];
]);;
(* }}} *)
let hausdorff_homeomorphsim = prove_by_refinement(
`!f U V. (BIJ (f:A->B) (UNIONS U) (UNIONS V)) /\ (continuous f U V) /\
(compact U (UNIONS U)) /\ (hausdorff V) /\ (topology_ U) /\
(topology_ V) ==> (homeomorphism f U V)`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
ASM_REWRITE_TAC[homeomorphism];
ASM_SIMP_TAC[
open_and_closed];
DISCH_ALL_TAC;
TYPEL_THEN [`U`;`UNIONS U`;`B`] (fun t-> ASSUME_TAC (SPECL t
closed_compact));
REWR 7;
WITH 6 (REWRITE_RULE[closed]);
REWR 7;
IMATCH_MP_TAC
compact_closed ;
ASM_REWRITE_TAC[];
IMATCH_MP_TAC
image_compact;
TYPE_THEN `U` EXISTS_TAC;
ASM_REWRITE_TAC[];
AND 8;
USE 0 (REWRITE_RULE[BIJ;INJ;IN ]);
AND 0;
AND 10;
REWRITE_TAC[SUBSET;IN_IMAGE];
REWRITE_TAC[IN];
USE 9 (REWRITE_RULE[SUBSET;IN]);
ASM_MESON_TAC[];
]);;
(* }}} *)
(* ------------------------------------------------------------------ *)
(* the metric and topology on the real numbers *)
(* ------------------------------------------------------------------ *)
let d_real = euclid_def `d_real x y = ||. (x -. y)`;;
(*
let real_topology = euclid_def
`real_topology = top_of_metric (UNIV,d_real)`;;
*)
(* }}} *)
let continuous_euclid1 = prove_by_refinement(
`!i n. continuous (coord i)
(top_of_metric (euclid n,d_euclid))
(top_of_metric (UNIV,d_real))`,
(* {{{ proof *)
[
TYPE_THEN `!i n . IMAGE (coord i) (euclid n) SUBSET (UNIV) /\ metric_space (euclid n,d_euclid) /\ metric_space (UNIV,d_real)` SUBGOAL_TAC;
REP_GEN_TAC;
REWRITE_TAC[UNIV ;SUBSET;IN];
REWRITE_TAC[
metric_euclid;
metric_real;GSYM UNIV];
DISCH_TAC;
DISCH_ALL_TAC;
TYPEL_THEN [`i`;`n`] (USE 0 o SPECL);
USE 0 (IMATCH_MP
metric_continuous_continuous);
ASM_REWRITE_TAC[];
REWRITE_TAC[metric_continuous;metric_continuous_pt];
DISCH_ALL_TAC;
RIGHT_TAC "delta";
DISCH_ALL_TAC;
REWRITE_TAC[d_real;IN;coord];
TYPE_THEN `epsilon` EXISTS_TAC;
ASM_REWRITE_TAC[];
GEN_TAC;
DISCH_ALL_TAC;
UND 4;
IMATCH_MP_TAC (REAL_ARITH `(a <=. b) ==> ((b <. e) ==> (a <. e))`);
ASM_MESON_TAC[proj_contraction];
]);;
(* }}} *)
let interval_closed_ball = prove_by_refinement(
`!a b . ? x r. (a <=. b) ==>
({x | euclid 1 x /\ a <= x 0 /\ x 0 <= b} =
(closed_ball(euclid 1,d_euclid)) x r)`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
TYPE_THEN `((a +b)/(&.2)) *# (
dirac_delta 0)` EXISTS_TAC;
TYPE_THEN `((b -a)/(&.2))` EXISTS_TAC;
DISCH_ALL_TAC;
IMATCH_MP_TAC EQ_EXT;
REWRITE_TAC[closed_ball;IN_ELIM_THM'];
DISCH_ALL_TAC;
IMATCH_MP_TAC (TAUT `(a ==> (b <=> d /\ c)) ==> (a /\ b <=> d /\ a /\ c)`);
DISCH_ALL_TAC;
TYPE_THEN `z = ((a + b) / &2 *#
dirac_delta 0)` ABBREV_TAC;
TYPE_THEN `euclid 1 z` SUBGOAL_TAC;
EXPAND_TAC "z";
MESON_TAC[euclid_dirac];
DISCH_TAC;
ASM_REWRITE_TAC[];
ASM_SIMP_TAC[euclid1_abs];
EXPAND_TAC "z";
TYPE_THEN `t = x 0` ABBREV_TAC ;
REWRITE_TAC[dirac_delta;euclid_scale];
REDUCE_TAC ;
REWRITE_TAC[GSYM INTERVAL_ABS ];
IMATCH_MP_TAC (TAUT `((a = d) /\ (b = C)) ==> ((a /\ b) <=> (C /\ d))`);
ONCE_REWRITE_TAC[REAL_ARITH `((x <=. u + v) <=> (x - v <=. u)) /\ ((x - u <= v) <=> (x <=. v + u))`];
CONJ_TAC;
TYPE_THEN `(a + b) / &2 - (b - a) / &2 = a` SUBGOAL_TAC ;
REWRITE_TAC[real_div];
REWRITE_TAC[REAL_ARITH `(a+b)*C - (b-a)*C = a*(&.2*C) `];
REDUCE_TAC ;
DISCH_THEN (fun t-> REWRITE_TAC[t]);
TYPE_THEN `(a+ b) /(&.2) + (b - a)/(&.2) = b` SUBGOAL_TAC;
REWRITE_TAC[real_div];
REWRITE_TAC[REAL_ARITH `(a+b) * C + (b - a) * C = b *(&.2*C)`];
REDUCE_TAC;
DISCH_THEN (fun t-> REWRITE_TAC[t]);
]);;
(* }}} *)
let interval_euclid1_closed = prove_by_refinement(
`!a b. closed_ (top_of_metric (euclid 1,d_euclid))
{x | euclid 1 x /\ a <= x 0 /\ x 0 <= b}`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
ASM_CASES_TAC `a <=. b`;
ASSUME_TAC
interval_closed_ball;
TYPEL_THEN [`a`;`b`] (USE 1 o SPECL);
(CHO 1);
CHO 1;
REWR 1;
ASM_REWRITE_TAC[];
IMATCH_MP_TAC
closed_ball_closed;
REWRITE_TAC[
metric_euclid];
TYPE_THEN `{x | euclid 1 x /\ a <= x 0 /\ x 0 <= b}= EMPTY ` SUBGOAL_TAC ;
REWRITE_TAC[
EQ_EMPTY;IN_ELIM_THM' ];
GEN_TAC;
TYPE_THEN `t = x 0 ` ABBREV_TAC;
KILL 1;
IMATCH_MP_TAC (TAUT `~(b /\ C) ==> ~( a /\ b/\ C)`);
UND 0;
REAL_ARITH_TAC;
DISCH_THEN (fun t-> REWRITE_TAC[t]);
IMATCH_MP_TAC
empty_closed;
IMATCH_MP_TAC
top_of_metric_top ;
REWRITE_TAC[
metric_euclid];
]);;
(* }}} *)
let interval_euclid1_bounded = prove_by_refinement(
`!a b. metric_bounded
({x | euclid 1 x /\ a <= x 0 /\ x 0 <= b},d_euclid)`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
REWRITE_TAC[metric_bounded];
ASSUME_TAC
interval_closed_ball;
TYPEL_THEN [`a`;`b`] (USE 0 o SPECL);
CHO 0;
CHO 0;
ASM_CASES_TAC `a <=. b`;
REWR 0;
ASM_REWRITE_TAC[];
TYPE_THEN `x` EXISTS_TAC;
TYPE_THEN `r + (&.1) ` EXISTS_TAC;
REWRITE_TAC[open_ball;SUBSET;IN ;IN_ELIM_THM' ];
DISCH_ALL_TAC;
ASM_REWRITE_TAC[];
UND 2;
REWRITE_TAC[closed_ball;IN_ELIM_THM' ];
DISCH_ALL_TAC;
ASM_REWRITE_TAC[];
UND 4;
ASM_SIMP_TAC[
euclid1_abs ];
TYPE_THEN `t = x 0` ABBREV_TAC;
TYPE_THEN `s = x' 0` ABBREV_TAC;
DISCH_ALL_TAC;
TYPE_THEN `&.0 <=. r` SUBGOAL_TAC;
UND 6;
REAL_ARITH_TAC;
DISCH_ALL_TAC;
REDUCE_TAC;
ASM_REWRITE_TAC[];
UND 6;
UND 7;
REAL_ARITH_TAC ;
TYPE_THEN `{x | euclid 1 x /\ a <= x 0 /\ x 0 <= b} = EMPTY` SUBGOAL_TAC;
REWRITE_TAC[
EQ_EMPTY;IN_ELIM_THM' ];
GEN_TAC;
TYPE_THEN `t = x 0 ` ABBREV_TAC;
KILL 2;
IMATCH_MP_TAC (TAUT `~(b /\ C) ==> ~( a /\ b/\ C)`);
UND 1;
REAL_ARITH_TAC;
DISCH_THEN (fun t-> REWRITE_TAC[t]);
REWRITE_TAC[EMPTY_SUBSET];
]);;
(* }}} *)
(* }}} *)
let interval_image = prove_by_refinement(
`!a b. {x | a <=. x /\ (x <= b)} =
IMAGE (coord 0) {x | euclid 1 x /\ a <= x 0 /\ x 0 <= b}`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
IMATCH_MP_TAC EQ_EXT;
REWRITE_TAC[IN_ELIM_THM';
IMAGE];
GEN_TAC;
EQ_TAC;
DISCH_ALL_TAC;
TYPE_THEN `x *# (dirac_delta 0)` EXISTS_TAC;
REWRITE_TAC[coord_dirac;euclid_dirac;dirac_0];
ASM_REWRITE_TAC[];
DISCH_ALL_TAC;
CHO 0;
USE 0 (REWRITE_RULE[coord]);
ASM_REWRITE_TAC[];
]);;
(* }}} *)
(* }}} *)
let half_open = prove_by_refinement(
`!a. top_of_metric(UNIV,d_real ) { x | x <. a}`,
(* {{{ proof *)
[
GEN_TAC;
ASSUME_TAC
open_nbd ;
TYPEL_THEN [`top_of_metric (UNIV,d_real)`;` {x | x < a}`] (USE 0 o ISPECL);
USE 0 (SIMP_RULE[
top_of_metric_top;
metric_real ]);
ASM_REWRITE_TAC[];
GEN_TAC;
TYPE_THEN `open_ball (UNIV,d_real) x (a - x)` EXISTS_TAC;
REWRITE_TAC[IN_ELIM_THM'];
DISCH_ALL_TAC;
CONJ_TAC;
REWRITE_TAC[open_ball;d_real ;IN;IN_ELIM_THM';
UNIV ;SUBSET ];
GEN_TAC ;
UND 1;
REAL_ARITH_TAC;
CONJ_TAC;
IMATCH_MP_TAC (REWRITE_RULE[IN] open_ball_nonempty);
REWRITE_TAC[metric_real; UNIV ];
UND 1;
REAL_ARITH_TAC;
IMATCH_MP_TAC open_ball_open;
REWRITE_TAC[metric_real];
]);;
(* }}} *)
let half_open_above = prove_by_refinement(
`!a. top_of_metric(UNIV,d_real ) { x | a <. x}`,
(* {{{ proof *)
[
GEN_TAC;
ASSUME_TAC
open_nbd ;
TYPEL_THEN [`top_of_metric (UNIV,d_real)`;` {x | a <. x}`] (USE 0 o ISPECL);
USE 0 (SIMP_RULE[
top_of_metric_top;
metric_real ]);
ASM_REWRITE_TAC[];
GEN_TAC;
TYPE_THEN `open_ball (UNIV,d_real) x (x -. a)` EXISTS_TAC;
REWRITE_TAC[IN_ELIM_THM'];
DISCH_ALL_TAC;
CONJ_TAC;
REWRITE_TAC[open_ball;d_real ;IN;IN_ELIM_THM';
UNIV ;SUBSET ];
GEN_TAC ;
UND 1;
REAL_ARITH_TAC;
CONJ_TAC;
IMATCH_MP_TAC (REWRITE_RULE[IN] open_ball_nonempty);
REWRITE_TAC[metric_real; UNIV ];
UND 1;
REAL_ARITH_TAC;
IMATCH_MP_TAC open_ball_open;
REWRITE_TAC[metric_real];
]);;
(* }}} *)
let joinf = euclid_def `joinf (f:real -> A) g a =
(\ x . (if (x <. a) then (f x) else (g x)))`;;
let joinf_cont = prove_by_refinement(
`!U a (f:real -> A) g.
(continuous f (top_of_metric(UNIV,d_real)) U) /\
(continuous g (top_of_metric(UNIV,d_real)) U) /\
(f a = (g a)) ==>
( (continuous (joinf f g a) (top_of_metric(UNIV,d_real)) U))`,
(* {{{ proof *)
[
REWRITE_TAC[continuous];
DISCH_ALL_TAC;
DISCH_ALL_TAC;
REWRITE_TAC[IN ];
ASSUME_TAC
open_nbd;
TYPEL_THEN [`top_of_metric (UNIV,d_real)`;`(preimage (UNIONS (top_of_metric (UNIV,d_real))) (joinf f g a) v)`] (USE 4 o ISPECL);
USE 4 (SIMP_RULE [
top_of_metric_top;
metric_real ]);
ASM_REWRITE_TAC[];
GEN_TAC;
REWRITE_TAC[
subset_preimage];
RIGHT_TAC "B";
DISCH_TAC;
SIMP_TAC[GSYM top_of_metric_unions; metric_real];
REWRITE_TAC[SUBSET_UNIV];
MP_TAC (REAL_ARITH `(x = a) \/ (x <. a) \/ (a <. x)`);
REP_CASES_TAC;
TYPE_THEN `B = (preimage (UNIONS (top_of_metric (UNIV,d_real))) f v) INTER (preimage (UNIONS (top_of_metric (UNIV,d_real))) g v)` ABBREV_TAC ;
TYPE_THEN `B` EXISTS_TAC;
CONJ_TAC;
REWRITE_TAC[SUBSET;IN_IMAGE;IN ];
GEN_TAC;
LEFT_TAC "x";
GEN_TAC ;
DISCH_ALL_TAC;
ASM_REWRITE_TAC[];
UND 9;
EXPAND_TAC "B";
REWRITE_TAC[INTER;IN_ELIM_THM';IN ];
REWRITE_TAC[REWRITE_RULE[IN] in_preimage;joinf ];
COND_CASES_TAC;
MESON_TAC[];
MESON_TAC[];
CONJ_TAC ;
ASM_REWRITE_TAC[];
UND 5;
EXPAND_TAC "B";
REWRITE_TAC[INTER;IN;IN_ELIM_THM'];
REWRITE_TAC[REWRITE_RULE[IN] in_preimage];
ASM_REWRITE_TAC[];
REWRITE_TAC[joinf];
REWRITE_TAC[REAL_ARITH `~(a<. a)`];
ASSUME_TAC top_of_metric_top;
TYPEL_THEN [`UNIV:real -> bool`;`d_real `] (USE 8 o ISPECL);
USE 8 (REWRITE_RULE[metric_real ]);
USE 8 (REWRITE_RULE[topology]);
EXPAND_TAC "B";
KILL 7;
TYPE_THEN `v` (USE 0 o SPEC);
TYPE_THEN `v` (USE 1 o SPEC);
ASM_MESON_TAC[IN ];
(* 2nd case x < a *)
TYPE_THEN `B = { x | x <. a } INTER (preimage (UNIONS (top_of_metric (UNIV,d_real))) f v)` ABBREV_TAC ;
TYPE_THEN `B` EXISTS_TAC;
CONJ_TAC;
ASM_REWRITE_TAC[SUBSET;IN_IMAGE ; IN;joinf ];
GEN_TAC ;
LEFT_TAC "x";
GEN_TAC ;
DISCH_ALL_TAC;
ASM_REWRITE_TAC[];
UND 9;
EXPAND_TAC "B";
REWRITE_TAC[INTER ;IN ;IN_ELIM_THM'];
DISCH_ALL_TAC;
ASM_REWRITE_TAC[];
USE 10 (REWRITE_RULE[REWRITE_RULE[IN] in_preimage]);
ASM_REWRITE_TAC[];
CONJ_TAC;
UND 5;
EXPAND_TAC "B";
REWRITE_TAC[INTER;IN;IN_ELIM_THM'];
REWRITE_TAC[REWRITE_RULE[IN] in_preimage];
ASM_REWRITE_TAC[];
DISCH_ALL_TAC;
ASM_REWRITE_TAC[];
UND 8;
REWRITE_TAC[joinf];
ASM_REWRITE_TAC[];
ASSUME_TAC top_of_metric_top;
TYPEL_THEN [`UNIV:real -> bool`;`d_real `] (USE 8 o ISPECL);
USE 8 (REWRITE_RULE[metric_real ]);
USE 8 (REWRITE_RULE[topology]);
TYPE_THEN `v` (USE 0 o SPEC);
TYPE_THEN `v` (USE 1 o SPEC);
EXPAND_TAC "B";
KILL 7;
KILL 5;
KILL 4;
KILL 1;
KILL 6;
TYPEL_THEN [`{x | x < a}`;`preimage (UNIONS (top_of_metric (UNIV,d_real))) f v`] (USE 8 o ISPECL);
RIGHT 1 "V";
RIGHT 1 "V";
AND 1;
AND 1;
REWR 0;
USE 0 (REWRITE_RULE[IN]);
REWR 5;
USE 5 (REWRITE_RULE[half_open]);
ASM_REWRITE_TAC[];
(* case 3 a < x *)
TYPE_THEN `B = { x | a <. x } INTER (preimage (UNIONS (top_of_metric (UNIV,d_real))) g v)` ABBREV_TAC ;
TYPE_THEN `B` EXISTS_TAC;
CONJ_TAC;
ASM_REWRITE_TAC[SUBSET;IN_IMAGE ; IN;joinf ];
GEN_TAC ;
LEFT_TAC "x";
GEN_TAC ;
DISCH_ALL_TAC;
ASM_REWRITE_TAC[];
UND 9;
EXPAND_TAC "B";
REWRITE_TAC[INTER ;IN ;IN_ELIM_THM'];
DISCH_ALL_TAC;
ASM_REWRITE_TAC[];
USE 10 (REWRITE_RULE[REWRITE_RULE[IN] in_preimage]);
ASM_REWRITE_TAC[];
USE 9 (MATCH_MP (REAL_ARITH `a < x'' ==> (~(x'' <. a))`));
ASM_REWRITE_TAC[];
CONJ_TAC;
UND 5;
EXPAND_TAC "B";
REWRITE_TAC[INTER;IN;IN_ELIM_THM'];
REWRITE_TAC[REWRITE_RULE[IN] in_preimage];
ASM_REWRITE_TAC[];
DISCH_ALL_TAC;
ASM_REWRITE_TAC[];
UND 8;
REWRITE_TAC[joinf];
USE 6 (MATCH_MP (REAL_ARITH `a < x'' ==> (~(x'' <. a))`));
ASM_REWRITE_TAC[];
ASSUME_TAC top_of_metric_top;
TYPEL_THEN [`UNIV:real -> bool`;`d_real `] (USE 8 o ISPECL);
USE 8 (REWRITE_RULE[metric_real ]);
USE 8 (REWRITE_RULE[topology]);
TYPE_THEN `v` (USE 0 o SPEC);
TYPE_THEN `v` (USE 1 o SPEC);
EXPAND_TAC "B";
KILL 7;
KILL 5;
KILL 4;
KILL 0;
KILL 6;
TYPEL_THEN [`{x | a < x}`;`preimage (UNIONS (top_of_metric (UNIV,d_real))) g v`] (USE 8 o ISPECL);
RIGHT 0 "V";
RIGHT 0 "V";
AND 0;
AND 0;
REWR 1;
USE 1 (REWRITE_RULE[IN]);
REWR 5;
USE 5 (REWRITE_RULE[half_open_above]);
ASM_REWRITE_TAC[];
]);;
(* }}} *)
let neg_cont = prove_by_refinement(
`continuous ( --.)
(top_of_metric(UNIV,d_real)) (top_of_metric(UNIV,d_real)) `,
(* {{{ proof *)
[
TYPE_THEN `IMAGE ( --. ) (UNIV) SUBSET (UNIV)` SUBGOAL_TAC;
REWRITE_TAC[SUBSET;IN;UNION;UNIV ];
DISCH_TAC;
ASM_SIMP_TAC[
metric_continuous_continuous;
metric_real ];
REWRITE_TAC[metric_continuous;metric_continuous_pt];
DISCH_ALL_TAC;
TYPE_THEN `epsilon` EXISTS_TAC;
DISCH_ALL_TAC;
ASM_REWRITE_TAC[UNIV;IN;d_real ];
REAL_ARITH_TAC;
]);;
(* }}} *)
let add_cont = prove_by_refinement(
`!u. (continuous ( (+.) u))
(top_of_metric(UNIV,d_real)) (top_of_metric(UNIV,d_real)) `,
(* {{{ proof *)
[
GEN_TAC;
TYPE_THEN `IMAGE ( (+.) u ) (UNIV) SUBSET (UNIV)` SUBGOAL_TAC;
REWRITE_TAC[SUBSET;IN;UNION;UNIV ];
DISCH_TAC;
ASM_SIMP_TAC[
metric_continuous_continuous;
metric_real ];
REWRITE_TAC[metric_continuous;metric_continuous_pt];
DISCH_ALL_TAC;
TYPE_THEN `epsilon` EXISTS_TAC;
DISCH_ALL_TAC;
ASM_REWRITE_TAC[UNIV;IN;d_real ];
REAL_ARITH_TAC;
]);;
(* }}} *)
let continuous_scale = prove_by_refinement(
`!x n. (euclid n x) ==>
(continuous (\t. (t *# x)) (top_of_metric(UNIV,d_real))
(top_of_metric(euclid n,d_euclid)))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
ASSUME_TAC
metric_euclid;
ASSUME_TAC
metric_real ;
TYPE_THEN `IMAGE (\t. (t *# x)) (UNIV) SUBSET (euclid n)` SUBGOAL_TAC;
REWRITE_TAC[SUBSET;IN_IMAGE;IN_ELIM_THM'];
REWRITE_TAC[Q_ELIM_THM'';
IN ; UNIV ];
ASM_MESON_TAC[euclid_scale_closure];
ASM_SIMP_TAC[metric_continuous_continuous];
DISCH_TAC;
REWRITE_TAC[metric_continuous;metric_continuous_pt];
DISCH_ALL_TAC;
REWRITE_TAC[IN;UNIV];
TYPE_THEN `euclidean x` SUBGOAL_TAC;
ASM_MESON_TAC[euclidean];
ASM_SIMP_TAC[norm_scale;d_real];
DISCH_TAC;
TYPE_THEN `norm x <=. &.1` ASM_CASES_TAC ;
TYPE_THEN `epsilon` EXISTS_TAC;
DISCH_ALL_TAC;
ASM_REWRITE_TAC[];
DISCH_ALL_TAC;
MP_TAC (SPEC `x' -. y` REAL_ABS_POS);
DISCH_TAC ;
USE 5 (MATCH_MP (SPEC `x' -. y` REAL_PROP_LE_LABS));
USE 5 (CONV_RULE REDUCE_CONV);
UND 5;
UND 7;
REAL_ARITH_TAC ;
TYPE_THEN `epsilon / norm x` EXISTS_TAC;
DISCH_ALL_TAC;
CONJ_TAC;
IMATCH_MP_TAC REAL_LT_DIV;
ASM_REWRITE_TAC[];
UND 5;
REAL_ARITH_TAC;
DISCH_ALL_TAC;
ASM_MESON_TAC[REAL_ARITH `~(x <= &.1) ==> (&.0 <. x)`;REAL_LT_RDIV_EQ];
]);;
(* }}} *)
(* }}} *)
(* ------------------------------------------------------------------ *)
(* Connected Sets *)
(* ------------------------------------------------------------------ *)
let connected = euclid_def `connected U (Z:A->bool) <=>
(Z SUBSET (UNIONS U)) /\
(!A B. (U A) /\ (U B) /\ (A INTER B = EMPTY ) /\
(Z SUBSET (A UNION B)) ==> ((Z SUBSET A) \/ (Z SUBSET B)))`;;
let connected_unions = prove_by_refinement(
`!U (Z1:A->bool) Z2. (connected U Z1) /\ (connected U Z2) /\
~(Z1 INTER Z2 = EMPTY) ==> (connected U (Z1 UNION Z2))`,
(* {{{ proof *)
[
REWRITE_TAC[connected];
DISCH_ALL_TAC;
DISCH_ALL_TAC;
SUBCONJ_TAC;
REWRITE_TAC[UNION;SUBSET;IN;IN_ELIM_THM' ];
ASM_MESON_TAC[SUBSET ;IN];
DISCH_TAC ;
DISCH_ALL_TAC;
TYPEL_THEN [`A`;`B`] (USE 1 o SPECL);
REWR 1;
TYPEL_THEN [`A`;`B`] (USE 3 o SPECL);
REWR 3;
WITH 9 (REWRITE_RULE[
union_subset]);
REWR 1;
REWR 3;
IMATCH_MP_TAC (TAUT `(~b ==> a) ==> (a \/ b)`);
DISCH_ALL_TAC;
USE 11 (REWRITE_RULE[
union_subset]);
(* start a case *)
USE 4 (REWRITE_RULE[
EMPTY_EXISTS]);
CHO 4;
USE 4 (REWRITE_RULE[IN;INTER;IN_ELIM_THM' ]);
REWRITE_TAC[
union_subset];
TYPE_THEN `~((Z1 SUBSET A) /\ (Z2 SUBSET B))` SUBGOAL_TAC;
DISCH_ALL_TAC;
USE 8 (REWRITE_RULE[
EQ_EMPTY]);
USE 8 (REWRITE_RULE[INTER;IN;IN_ELIM_THM' ]);
ASM_MESON_TAC[SUBSET;IN];
TYPE_THEN `~((Z2 SUBSET A) /\ (Z1 SUBSET B))` SUBGOAL_TAC;
DISCH_ALL_TAC;
USE 8 (REWRITE_RULE[
EQ_EMPTY]);
USE 8 (REWRITE_RULE[INTER;IN;IN_ELIM_THM' ]);
ASM_MESON_TAC[SUBSET;IN];
ASM_MESON_TAC[];
]);;
(* }}} *)
let component_DEF = euclid_def `component U (x:A) y <=>
(?Z. (connected U Z) /\ (Z x) /\ (Z y))`;;
let connected_sing = prove_by_refinement(
`!U (x:A). (UNIONS U x) ==> (connected U {x})`,
(* {{{ proof *)
[
REWRITE_TAC[connected];
DISCH_ALL_TAC;
CONJ_TAC;
REWRITE_TAC[SUBSET;IN_SING ];
ASM_MESON_TAC[IN];
DISCH_ALL_TAC;
UND 4;
SET_TAC[];
]);;
(* }}} *)
(* }}} *)
(* }}} *)
let component_trans = prove_by_refinement(
`!U (x:A) y z. (component U x y) /\ (component U y z) ==>
(component U x z)`,
(* {{{ proof *)
[
REWRITE_TAC[component_DEF];
DISCH_ALL_TAC;
CHO 0;
CHO 1;
TYPE_THEN `connected U (Z UNION Z')` SUBGOAL_TAC;
IMATCH_MP_TAC
connected_unions;
ASM_REWRITE_TAC[];
REWRITE_TAC[
EMPTY_EXISTS ];
REWRITE_TAC[IN;INTER;IN_ELIM_THM' ];
TYPE_THEN `y` EXISTS_TAC;
ASM_REWRITE_TAC[];
DISCH_ALL_TAC;
TYPE_THEN `Z UNION Z'` EXISTS_TAC;
ASM_REWRITE_TAC[];
REWRITE_TAC[UNION;IN;IN_ELIM_THM' ];
ASM_REWRITE_TAC[];
]);;
(* }}} *)
(* based on the Bolzano lemma *)
let connect_real = prove_by_refinement(
`!a b. connected (top_of_metric (UNIV,d_real))
{x | a <=. x /\ x <=. b }`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
REWRITE_TAC[connected];
ASSUME_TAC
metric_real;
ASM_SIMP_TAC[GSYM
top_of_metric_unions];
SUBCONJ_TAC;
REWRITE_TAC[UNIV;SUBSET;IN ];
DISCH_TAC;
DISCH_ALL_TAC;
TYPE_THEN `\ (u ,v ). ( u <. a) \/ (b <. v) \/ ({x | u <=. x /\ x <=. v } SUBSET A) \/ ({x | u <=. x /\ x <=. v } SUBSET B)` (fun t-> ASSUME_TAC (SPEC t BOLZANO_LEMMA ));
UND 6;
GBETA_TAC ;
IMATCH_MP_TAC (TAUT `((b ==> c ) /\ a ) ==> ((a ==> b) ==> c )`);
CONJ_TAC;
DISCH_ALL_TAC;
TYPEL_THEN [`a`;`b`] ((USE 6 o SPECL));
USE 6 (REWRITE_RULE[ARITH_RULE `~(a <. a)`]);
ASM_CASES_TAC `a <=. b`;
REWR 6;
TYPE_THEN `{x | a <=. x /\ x <=. b} = EMPTY ` SUBGOAL_TAC;
IMATCH_MP_TAC EQ_EXT;
REWRITE_TAC[IN_ELIM_THM';
EMPTY];
GEN_TAC;
UND 7;
REAL_ARITH_TAC;
DISCH_THEN (fun t-> REWRITE_TAC[t]);
REWRITE_TAC[EMPTY_SUBSET];
CONJ_TAC;
DISCH_ALL_TAC;
UND 8;
UND 9;
(* c1 *)
USE 4 (REWRITE_RULE[EQ_EMPTY;INTER;IN;IN_ELIM_THM' ]);
TYPE_THEN `b'` (USE 4 o SPEC);
TYPE_THEN `{x | a' <=. x /\ x <=. b' } b'` SUBGOAL_TAC;
ASM_REWRITE_TAC[IN_ELIM_THM'];
REAL_ARITH_TAC;
DISCH_TAC;
TYPE_THEN `{x | b' <=. x /\ x <=. c } b'` SUBGOAL_TAC;
ASM_REWRITE_TAC[IN_ELIM_THM'];
REAL_ARITH_TAC;
DISCH_TAC;
TYPE_THEN `{x | a' <=. x /\ x <=. b' } UNION {x | b' <=. x /\ x <= c } = { x | a' <=. x /\ x <=. c }` SUBGOAL_TAC;
REWRITE_TAC[UNION;IN;IN_ELIM_THM'];
IMATCH_MP_TAC EQ_EXT ;
GEN_TAC;
REWRITE_TAC[IN_ELIM_THM'];
UND 6;
UND 7;
REAL_ARITH_TAC;
DISCH_TAC;
(* cr 1*)
REPEAT (DISCH_THEN (REPEAT_TCL DISJ_CASES_THEN ASSUME_TAC)) THEN ASM_REWRITE_TAC[] THEN (TRY (GEN_MESON_TAC 0 7 1[REAL_ARITH `(b < b' /\ b' <=. c ==> b <. c ) /\ (a' <=. b' /\ b' <. a ==> a' <. a)`]));
IMATCH_MP_TAC (TAUT `c ==> (a \/ b \/ c \/ d)`);
UND 10;
DISCH_THEN (fun t-> REWRITE_TAC [GSYM t]);
ASM_REWRITE_TAC[union_subset];
(* ASM_MESON_TAC[SUBSET;IN]; should have worked *)
PROOF_BY_CONTR_TAC;
UND 11;
UND 12;
UND 9;
UND 8;
UND 4;
REWRITE_TAC[SUBSET;IN];
TYPE_THEN `R ={x | a' <=. x /\ x <=. b'}` ABBREV_TAC;
TYPE_THEN `S = {x | b' <=. x /\ x <=. c}` ABBREV_TAC;
MESON_TAC[]; (* ok now it works *)
PROOF_BY_CONTR_TAC;
UND 11;
UND 12;
UND 9;
UND 8;
UND 4;
REWRITE_TAC[SUBSET;IN];
TYPE_THEN `R ={x | a' <=. x /\ x <=. b'}` ABBREV_TAC;
TYPE_THEN `S = {x | b' <=. x /\ x <=. c}` ABBREV_TAC;
MESON_TAC[]; (* ok now it works *)
IMATCH_MP_TAC (TAUT `d ==> (a \/ b \/ c \/ d)`);
UND 10;
DISCH_THEN (fun t-> REWRITE_TAC [GSYM t]);
ASM_REWRITE_TAC[union_subset];
(* cr 2*)
DISCH_ALL_TAC;
ASM_CASES_TAC `x <. a`;
TYPE_THEN `&.1` EXISTS_TAC;
REDUCE_TAC;
DISCH_ALL_TAC;
DISJ1_TAC ;
UND 7;
UND 6;
REAL_ARITH_TAC;
ASM_CASES_TAC `b <. x`;
TYPE_THEN `&.1` EXISTS_TAC;
REDUCE_TAC;
DISCH_ALL_TAC;
DISJ2_TAC;
DISJ1_TAC;
UND 9;
UND 7;
REAL_ARITH_TAC;
TYPE_THEN ` (A UNION B) x` SUBGOAL_TAC;
USE 5 (REWRITE_RULE[SUBSET;IN]);
UND 5;
DISCH_THEN (IMATCH_MP_TAC );
REWRITE_TAC[IN_ELIM_THM'];
UND 7;
UND 6;
REAL_ARITH_TAC;
DISCH_TAC;
(* cr3 *)
TYPEL_THEN [`UNIV:real -> bool`;`d_real`] (fun t-> (ASSUME_TAC (ISPECL t open_ball_nbd))); (* --//-- *)
USE 8 (REWRITE_RULE[REWRITE_RULE[IN] IN_UNION]);
TYPE_THEN `A x` ASM_CASES_TAC; (* *)
TYPE_THEN `A` (USE 9 o SPEC);
TYPE_THEN `x` (USE 9 o SPEC); (* --//-- *)
CHO 9;
REWR 9;
USE 9 (REWRITE_RULE[open_ball;d_real;UNIV ]);
TYPE_THEN `e` EXISTS_TAC;
ASM_REWRITE_TAC[];
DISCH_ALL_TAC;
IMATCH_MP_TAC (TAUT `C ==> (a \/ b \/ C\/ d)`);
AND 9;
UND 9;
TYPE_THEN `{x | a' <=. x /\ x <=. b'} SUBSET {y | abs (x - y) <. e}` SUBGOAL_TAC;
REWRITE_TAC[SUBSET;IN;IN_ELIM_THM'];
GEN_TAC;
UND 11;
UND 12;
UND 13;
REAL_ARITH_TAC;
REWRITE_TAC[SUBSET;IN;IN_ELIM_THM' ];
MESON_TAC[];
REWR 8;
TYPE_THEN `B` (USE 9 o SPEC);
TYPE_THEN `x` (USE 9 o SPEC); (* --//-- *)
CHO 9;
REWR 9;
USE 9 (REWRITE_RULE[open_ball;d_real;UNIV ]);
TYPE_THEN `e` EXISTS_TAC;
ASM_REWRITE_TAC[];
DISCH_ALL_TAC;
IMATCH_MP_TAC (TAUT `d ==> (a \/ b \/ C\/ d)`);
AND 9;
UND 9;
TYPE_THEN `{x | a' <=. x /\ x <=. b'} SUBSET {y | abs (x - y) <. e}` SUBGOAL_TAC;
REWRITE_TAC[SUBSET;IN;IN_ELIM_THM'];
GEN_TAC;
UND 11;
UND 12;
UND 13;
REAL_ARITH_TAC;
REWRITE_TAC[SUBSET;IN;IN_ELIM_THM' ];
MESON_TAC[];
]);;
(* }}} *)
let connect_image = prove_by_refinement(
`!f U V Z. (continuous (f:A->B) U V) /\
(IMAGE f Z SUBSET (UNIONS V)) /\ (connected U Z) ==>
(connected V (IMAGE f Z))`,
(* {{{ proof *)
[
REWRITE_TAC[connected];
DISCH_ALL_TAC;
ASM_REWRITE_TAC[];
DISCH_ALL_TAC;
USE 0 (REWRITE_RULE[continuous;IN ]);
TYPE_THEN `A` (WITH 0 o SPEC);
TYPE_THEN `B` (USE 0 o SPEC);
TYPE_THEN `(preimage (UNIONS U) f A)` (USE 3 o SPEC);
TYPE_THEN `(preimage (UNIONS U) f B)` (USE 3 o SPEC);
USE 6 (MATCH_MP
preimage_disjoint );
TYPE_THEN `Z SUBSET preimage (UNIONS U) f A UNION preimage (UNIONS U) f B` SUBGOAL_TAC;
REWRITE_TAC[
preimage_union];
ASM_REWRITE_TAC[];
USE 3 (REWRITE_RULE[
subset_preimage ]);
ASM_MESON_TAC[];
]);;
(* }}} *)
let path = euclid_def `path U x y <=>
(?f a b. (continuous f (top_of_metric(UNIV,d_real )) U ) /\
(f a = (x:A)) /\ (f b = y))`;;
(**** Old proof modified by JRH to avoid use of GSPEC
let const_continuous = prove_by_refinement(
`!U V y. (topology_ U) ==>
(continuous (\ (x:A). (y:B)) U V)`,
(* {{{ proof *)
[
REWRITE_TAC[continuous];
DISCH_ALL_TAC;
REWRITE_TAC[IN];
DISCH_ALL_TAC;
REWRITE_TAC[preimage;IN ];
TYPE_THEN `v y` ASM_CASES_TAC ;
ASM_REWRITE_TAC[IN_ELIM_THM;GSPEC ];
USE 0 (MATCH_MP top_univ);
TYPE_THEN`t = UNIONS U` ABBREV_TAC;
UND 0;
REWRITE_TAC[ETA_AX];
ASM_REWRITE_TAC[GSPEC ];
USE 0 (MATCH_MP open_EMPTY);
USE 0 (REWRITE_RULE[open_DEF ;EMPTY]);
ASM_REWRITE_TAC[];
]);;
(* }}} *)
****)
let const_continuous = prove_by_refinement(
`!U V y. (topology_ U) ==>
(continuous (\ (x:A). (y:B)) U V)`,
(* {{{ proof *)
[
REWRITE_TAC[continuous];
DISCH_ALL_TAC;
REWRITE_TAC[IN];
DISCH_ALL_TAC;
REWRITE_TAC[preimage;IN ];
TYPE_THEN `v y` ASM_CASES_TAC ;
ASM_REWRITE_TAC[IN_ELIM_THM];
USE 0 (MATCH_MP
top_univ);
TYPE_THEN`t = UNIONS U` ABBREV_TAC;
UND 0;
MATCH_MP_TAC(TAUT `(a <=> b) ==> a ==> b`);
AP_TERM_TAC;
REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN];
USE 0 (MATCH_MP
open_EMPTY);
USE 0 (REWRITE_RULE[open_DEF ;EMPTY]);
ASM_REWRITE_TAC[];
SUBGOAL_THEN `{x:A | F} = \x. F` SUBST1_TAC;
REWRITE_TAC[EXTENSION; IN; IN_ELIM_THM];
ASM_REWRITE_TAC[]
]);;
(* }}} *)
let path_component = euclid_def `path_component U x y <=>
(?f a b. (continuous f (top_of_metric(UNIV,d_real )) U ) /\ (a <. b) /\
(f a = (x:A)) /\ (f b = y) /\
(IMAGE f { t | a <=. t /\ t <=. b } SUBSET (UNIONS U)))`;;
let path_refl = prove_by_refinement(
`!U x. (UNIONS U x) ==> (path_component U x (x:A))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
ASSUME_TAC (
top_of_metric_top );
TYPEL_THEN [`UNIV:real ->bool`;`d_real`] (USE 1 o ISPECL);
USE 1 (REWRITE_RULE[
metric_real ]);
USE 1 (MATCH_MP
const_continuous);
REWRITE_TAC[path_component];
TYPE_THEN `(\ (t:real). x)` EXISTS_TAC;
ASM_REWRITE_TAC[IMAGE;IN;];
TYPE_THEN `&.0` EXISTS_TAC;
TYPE_THEN `&.1` EXISTS_TAC;
CONJ_TAC;
REAL_ARITH_TAC;
REWRITE_TAC[SUBSET;IN;IN_ELIM_THM'];
ASM_MESON_TAC[];
]);;
(* }}} *)
let path_symm = prove_by_refinement(
`!U x y . (path_component U x (y:A)) ==> (path_component U y (x:A))`,
(* {{{ proof *)
[
REWRITE_TAC[path_component];
DISCH_ALL_TAC;
(CHO 0);
(CHO 0);
(CHO 0);
TYPE_THEN `f o (--.)` EXISTS_TAC;
TYPE_THEN `--. b` EXISTS_TAC;
TYPE_THEN `--. a` EXISTS_TAC;
CONJ_TAC;
IMATCH_MP_TAC
continuous_comp;
TYPE_THEN `(top_of_metric (UNIV,d_real))` EXISTS_TAC;
REWRITE_TAC[
neg_cont];
SIMP_TAC[
top_of_metric_top;
metric_real;
metric_euclidean;
metric_euclid;
metric_hausdorff; GSYM
top_of_metric_unions;
open_ball_open;];
ASM_REWRITE_TAC[];
REWRITE_TAC[UNIV;IN;SUBSET ];
CONJ_TAC ;
AND 0;
AND 0;
UND 2;
REAL_ARITH_TAC ;
REWRITE_TAC[o_DEF ;];
REDUCE_TAC ;
ASM_REWRITE_TAC[];
UND 0;
REWRITE_TAC[IMAGE;IN;SUBSET;IN_ELIM_THM'];
DISCH_ALL_TAC;
DISCH_ALL_TAC;
CHO 5;
USE 4 (CONV_RULE NAME_CONFLICT_CONV );
TYPE_THEN `x'` (USE 4 o SPEC);
UND 4;
DISCH_THEN IMATCH_MP_TAC ;
NAME_CONFLICT_TAC;
TYPE_THEN `--. x''` EXISTS_TAC;
ASM_REWRITE_TAC[];
UND 5;
REAL_ARITH_TAC ;
]);;
(* }}} *)
(* }}} *)
let path_trans = prove_by_refinement(
`!U x y (z:A). (path_component U x y) /\ (path_component U y z) ==>
(path_component U x z)`,
(* {{{ proof *)
[
REWRITE_TAC[path_component];
DISCH_ALL_TAC;
CHO 0;
CHO 0;
CHO 0;
CHO 1;
CHO 1;
CHO 1;
TYPE_THEN `joinf f (f' o ((+.) (a' -. b))) b` EXISTS_TAC;
TYPE_THEN `a` EXISTS_TAC;
TYPE_THEN `b' +. (b - a')` EXISTS_TAC;
CONJ_TAC; (* start of continuity *)
IMATCH_MP_TAC
joinf_cont;
ASM_REWRITE_TAC[];
CONJ_TAC;
IMATCH_MP_TAC
continuous_comp;
TYPE_THEN `(top_of_metric (UNIV,d_real))` EXISTS_TAC;
ASM_REWRITE_TAC [
top_of_metric_top;
metric_real;
metric_euclidean;
metric_euclid;
metric_hausdorff; GSYM
top_of_metric_unions;
open_ball_open;];
REWRITE_TAC[
add_cont];
ASM_SIMP_TAC [
top_of_metric_top;
metric_real;
metric_euclidean;
metric_euclid;
metric_hausdorff; GSYM
top_of_metric_unions;
open_ball_open;];
REWRITE_TAC[SUBSET;UNIV;IN;IN_ELIM_THM'];
REWRITE_TAC[o_DEF];
REDUCE_TAC;
ASM_REWRITE_TAC[]; (* end of continuity *)
CONJ_TAC; (* start real ineq *)
AND 1;
AND 1;
AND 0;
AND 0;
UND 5;
UND 3;
REAL_ARITH_TAC; (* end of real ineq *)
CONJ_TAC;
REWRITE_TAC[joinf;o_DEF];
ASM_REWRITE_TAC[]; (* end of JOIN statement *)
CONJ_TAC; (* next JOIN statement *)
REWRITE_TAC[joinf;o_DEF];
TYPE_THEN `~(b' +. b -. a' <. b)` SUBGOAL_TAC;
TYPE_THEN `(a' <. b') /\ (a <. b)` SUBGOAL_TAC;
ASM_REWRITE_TAC[];
REAL_ARITH_TAC;
DISCH_THEN (fun t-> REWRITE_TAC[t]);
TYPE_THEN ` a' -. b +. b' +. b -. a' = b'` SUBGOAL_TAC;
REAL_ARITH_TAC ;
DISCH_THEN (fun t-> REWRITE_TAC[t]);
ASM_REWRITE_TAC[]; (* end of next joinf *)
TYPE_THEN `(a <=. b) /\ (b <=. (b' + b - a'))` SUBGOAL_TAC; (* subreal *)
TYPE_THEN `(a' <. b') /\ (a <. b)` SUBGOAL_TAC;
ASM_REWRITE_TAC[];
REAL_ARITH_TAC;
DISCH_TAC; (* end of subreal *)
USE 2 (MATCH_MP
union_closed_interval);
UND 2;
DISCH_THEN (fun t-> REWRITE_TAC[GSYM t]);
REWRITE_TAC[IMAGE_UNION;
union_subset];
CONJ_TAC; (* start of FIRST interval *)
TYPE_THEN `IMAGE (joinf f (f' o (+.) (a' -. b)) b) {t | a <=. t /\ t <. b} = IMAGE f {t | a <=. t /\ t <. b}` SUBGOAL_TAC;
REWRITE_TAC[joinf;IMAGE;IN_IMAGE ];
IMATCH_MP_TAC EQ_EXT;
X_GEN_TAC `t:A`;
REWRITE_TAC[IN_ELIM_THM'];
EQ_TAC;
DISCH_ALL_TAC;
CHO 2;
UND 2;
DISCH_ALL_TAC;
REWR 4;
ASM_MESON_TAC[];
DISCH_ALL_TAC;
CHO 2;
UND 2;
DISCH_ALL_TAC;
TYPE_THEN `x'` EXISTS_TAC;
ASM_REWRITE_TAC[];
DISCH_THEN (fun t-> REWRITE_TAC[t]); (* FIRST interval still *)
TYPE_THEN `IMAGE f {t | a <=. t /\ t <. b} SUBSET IMAGE f {t | a <=. t /\ t <=. b} ` SUBGOAL_TAC;
REWRITE_TAC[SUBSET;IN_IMAGE ;IN_ELIM_THM'];
GEN_TAC;
DISCH_THEN (CHOOSE_THEN MP_TAC);
MESON_TAC[REAL_ARITH `a <. b ==> a<=. b`];
KILL 1;
UND 0;
DISCH_ALL_TAC;
JOIN 0 5;
USE 0 (MATCH_MP SUBSET_TRANS );
ASM_REWRITE_TAC[]; (* end of FIRST interval *)
(* lc 1*)
TYPE_THEN `IMAGE (joinf f (f' o (+.) (a' -. b)) b) {t | b <=. t /\ t <=. b' + b -. a'} = IMAGE f' {t | a' <=. t /\ t <=. b'}` SUBGOAL_TAC;
REWRITE_TAC[joinf;IMAGE;IN_IMAGE ];
IMATCH_MP_TAC EQ_EXT;
REWRITE_TAC[IN_ELIM_THM'];
NAME_CONFLICT_TAC ;
X_GEN_TAC `t:A`;
EQ_TAC;
DISCH_ALL_TAC;
CHO 2;
UND 2;
DISCH_ALL_TAC;
TYPE_THEN `~(x' <. b)` SUBGOAL_TAC;
UND 2;
REAL_ARITH_TAC ;
DISCH_TAC ;
REWR 4;
USE 4 (REWRITE_RULE[o_DEF]);
TYPE_THEN `a' -. b +. x'` EXISTS_TAC; (* * *)
ASM_REWRITE_TAC[];
TYPE_THEN `(a' <. b') /\ (a <. b) /\ (b <=. x') /\ (x' <=. b' +. b -. a')` SUBGOAL_TAC;
ASM_REWRITE_TAC[];
REAL_ARITH_TAC;
DISCH_ALL_TAC;
CHO 2;
UND 2;
DISCH_ALL_TAC;
TYPE_THEN `x' +. b -. a'` EXISTS_TAC;
ASM_REWRITE_TAC[];
SUBCONJ_TAC;
UND 2;
UND 3;
REAL_ARITH_TAC;
DISCH_ALL_TAC;
TYPE_THEN `~(x' +. b -. a' <. b)` SUBGOAL_TAC;
UND 5;
REAL_ARITH_TAC ;
DISCH_THEN (fun t-> REWRITE_TAC[t]);
REWRITE_TAC[o_DEF];
AP_TERM_TAC;
REAL_ARITH_TAC ;
DISCH_THEN (fun t -> REWRITE_TAC [t]);
ASM_REWRITE_TAC[];
]);;
(* }}} *)
let loc_path_conn = euclid_def `loc_path_conn U <=>
!A x. (U A) /\ (A (x:A)) ==>
(U (path_component (induced_top U A) x))`;;
let path_eq_conn = prove_by_refinement(
`!U (x:A). (loc_path_conn U) /\ (topology_ U) ==>
(path_component U x = component U x)`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
MATCH_MP_TAC EQ_EXT;
X_GEN_TAC `y:A`;
EQ_TAC ;
REWRITE_TAC[path_component];
DISCH_ALL_TAC;
CHO 2;
CHO 2;
CHO 2;
UND 2 THEN DISCH_ALL_TAC;
REWRITE_TAC[component_DEF];
TYPE_THEN `IMAGE f {t | a <= t /\ t <= b}` EXISTS_TAC;
CONJ_TAC;
IMATCH_MP_TAC
connect_image ;
NAME_CONFLICT_TAC;
TYPE_THEN `(top_of_metric (UNIV,d_real))` EXISTS_TAC ;
ASM_REWRITE_TAC[
connect_real ];
REWRITE_TAC[IMAGE;IN;IN_ELIM_THM' ];
CONJ_TAC;
TYPE_THEN `a` EXISTS_TAC;
ASM_REWRITE_TAC[];
UND 3;
REAL_ARITH_TAC ;
TYPE_THEN `b` EXISTS_TAC;
ASM_REWRITE_TAC[];
UND 3;
REAL_ARITH_TAC;
REWRITE_TAC[component_DEF];
DISCH_ALL_TAC;
CHO 2;
UND 2 THEN DISCH_ALL_TAC;
USE 2 (REWRITE_RULE[connected]);
UND 2 THEN DISCH_ALL_TAC;
TYPE_THEN `path_component U x` (USE 5 o SPEC);
TYPE_THEN `A = path_component U x` ABBREV_TAC;
TYPE_THEN `B = UNIONS (IMAGE (\z. (path_component U z)) (Z DIFF A))` ABBREV_TAC ;
TYPE_THEN `B` (USE 5 o SPEC);
TYPE_THEN `U A /\ U B /\ (A INTER B = {}) /\ Z SUBSET A UNION B` SUBGOAL_TAC;
WITH 0 (REWRITE_RULE[loc_path_conn]);
TYPE_THEN `(UNIONS U)` (USE 8 o SPEC);
TYPE_THEN `x` (USE 8 o SPEC);
UND 8;
ASM_SIMP_TAC[
induced_top_unions];
ASM_SIMP_TAC[
top_univ];
TYPE_THEN `UNIONS U x` SUBGOAL_TAC;
USE 2 (REWRITE_RULE[SUBSET;IN;]);
ASM_MESON_TAC[];
DISCH_ALL_TAC;
REWR 8;
ASM_REWRITE_TAC[];
(* dd *)
CONJ_TAC;
EXPAND_TAC "B";
WITH 1 (REWRITE_RULE[topology]);
TYPEL_THEN [`EMPTY:A->bool`;`EMPTY:A->bool`;`(IMAGE (\z. path_component U z) (Z DIFF A))`] (USE 10 o ISPECL);
UND 10 THEN DISCH_ALL_TAC;
UND 12 THEN (DISCH_THEN IMATCH_MP_TAC );
REWRITE_TAC[SUBSET;IN_IMAGE];
REWRITE_TAC[IN];
NAME_CONFLICT_TAC;
DISCH_ALL_TAC;
CHO 12;
ASM_REWRITE_TAC[];
USE 0 (REWRITE_RULE[loc_path_conn]);
TYPE_THEN `(UNIONS U)` (USE 0 o SPEC);
USE 0 ( CONV_RULE NAME_CONFLICT_CONV);
TYPE_THEN `x'` (USE 0 o SPEC);
UND 0;
ASM_SIMP_TAC[induced_top_unions];
DISCH_THEN MATCH_MP_TAC;
ASM_SIMP_TAC[top_univ];
AND 12;
USE 2 (REWRITE_RULE[SUBSET;IN]);
USE 0 (REWRITE_RULE[DIFF;IN;IN_ELIM_THM' ]);
ASM_MESON_TAC[];
CONJ_TAC;
REWRITE_TAC[EQ_EMPTY];
DISCH_ALL_TAC;
USE 10 (REWRITE_RULE[INTER;IN;IN_ELIM_THM' ]);
AND 10;
UND 10;
EXPAND_TAC "B";
REWRITE_TAC[UNIONS;IN_IMAGE ;IN_ELIM_THM' ];
REWRITE_TAC[IN];
LEFT_TAC "u";
DISCH_ALL_TAC;
AND 10;
CHO 12;
AND 12;
REWR 10;
UND 11;
EXPAND_TAC "A";
USE 10 (ONCE_REWRITE_RULE [path_symm_eq]);
DISCH_TAC;
JOIN 11 10;
USE 10 (MATCH_MP path_trans);
REWR 10;
UND 10;
UND 12;
REWRITE_TAC[DIFF;IN;IN_ELIM_THM'];
MESON_TAC[];
REWRITE_TAC[SUBSET;IN;UNION;IN_ELIM_THM'];
DISCH_ALL_TAC;
TYPE_THEN `A x'` ASM_CASES_TAC;
ASM_REWRITE_TAC[];
DISJ2_TAC ;
EXPAND_TAC "B";
REWRITE_TAC[UNIONS;IN_IMAGE;IN_ELIM_THM' ];
REWRITE_TAC[IN];
LEFT_TAC "x";
LEFT_TAC "x";
TYPE_THEN `x'` EXISTS_TAC;
TYPE_THEN `path_component U x'` EXISTS_TAC;
ASM_REWRITE_TAC[DIFF;IN;IN_ELIM_THM' ];
IMATCH_MP_TAC path_refl;
USE 2 (REWRITE_RULE[SUBSET;IN]);
ASM_MESON_TAC[];
DISCH_TAC ;
REWR 5;
UND 5;
DISCH_THEN DISJ_CASES_TAC ;
USE 5 (REWRITE_RULE[SUBSET;IN ;]);
ASM_MESON_TAC[];
UND 8 THEN DISCH_ALL_TAC;
USE 10 (REWRITE_RULE[EQ_EMPTY]);
TYPE_THEN `x` (USE 10 o SPEC);
USE 10 (REWRITE_RULE[INTER;IN;IN_ELIM_THM']);
USE 5 (REWRITE_RULE[SUBSET;IN;IN_ELIM_THM']);
TYPE_THEN `A x` SUBGOAL_TAC;
EXPAND_TAC "A";
IMATCH_MP_TAC path_refl ;
USE 2 (REWRITE_RULE[SUBSET;IN;IN_ELIM_THM']);
ASM_MESON_TAC[];
ASM_MESON_TAC[];
]);;
(* }}} *)
let open_ball_star = prove_by_refinement(
`!x r y t n. (open_ball(euclid n,d_euclid) x r y) /\
(&.0 <=. t) /\ (t <=. &.1) ==>
(open_ball(euclid n,d_euclid) x r ((t *# x + (&.1-t)*#y)))`,
(* }}} *)
let open_ball_path = prove_by_refinement(
`!x r y n. (open_ball(euclid n,d_euclid) x r y) ==>
(path_component
(top_of_metric(open_ball(euclid n,d_euclid) x r,d_euclid)) y x)`,
(* {{{ proof *)
[
REWRITE_TAC[path_component ;];
DISCH_ALL_TAC;
TYPE_THEN `(\t. (t *# x + (&.1 - t) *# y))` EXISTS_TAC;
EXISTS_TAC `&.0`;
EXISTS_TAC `&.1`;
REDUCE_TAC;
TYPE_THEN `top_of_metric (open_ball (euclid n,d_euclid) x r,d_euclid) = (induced_top(top_of_metric(euclid n,d_euclid)) (open_ball (euclid n,d_euclid) x r))` SUBGOAL_TAC;
ASM_MESON_TAC[
open_ball_subset;
metric_euclid;
top_of_metric_induced ];
DISCH_TAC ;
TYPE_THEN `euclid n x /\ euclid n y` SUBGOAL_TAC;
USE 0 (REWRITE_RULE[open_ball;IN_ELIM_THM' ]);
ASM_REWRITE_TAC[];
DISCH_ALL_TAC;
CONJ_TAC;
ASM_REWRITE_TAC[];
IMATCH_MP_TAC
continuous_induced;
ASM_SIMP_TAC [
top_of_metric_top;
metric_euclid;
open_ball_open];
IMATCH_MP_TAC
continuous_lin_combo ;
ASM_REWRITE_TAC[];
CONJ_TAC;
REWRITE_TAC[euclid_plus;euclid_scale];
IMATCH_MP_TAC EQ_EXT THEN BETA_TAC ;
REDUCE_TAC;
CONJ_TAC;
REWRITE_TAC[euclid_plus;euclid_scale];
IMATCH_MP_TAC EQ_EXT THEN BETA_TAC ;
REDUCE_TAC;
REWRITE_TAC[SUBSET;IN_IMAGE;Q_ELIM_THM'' ];
REWRITE_TAC[IN;IN_ELIM_THM'];
TYPE_THEN `(UNIONS (top_of_metric (open_ball (euclid n,d_euclid) x r,d_euclid))) = (open_ball(euclid n,d_euclid) x r)` SUBGOAL_TAC;
IMATCH_MP_TAC (GSYM
top_of_metric_unions);
IMATCH_MP_TAC
metric_subspace;
ASM_MESON_TAC[
metric_euclid;
open_ball_subset];
DISCH_THEN (fun t->REWRITE_TAC[t]);
ASM_MESON_TAC [
open_ball_star];
]);;
(* }}} *)
let path_domain = prove_by_refinement(
`!U x (y:A). path_component U x y <=>
(?f a b. (continuous f (top_of_metric(UNIV,d_real )) U ) /\ (a <. b) /\
(f a = (x:A)) /\ (f b = y) /\
(IMAGE f UNIV SUBSET (UNIONS U)))`,
(* {{{ proof *)
[
REWRITE_TAC[path_component];
DISCH_ALL_TAC;
EQ_TAC;
DISCH_TAC ;
CHO 0;
CHO 0;
CHO 0;
TYPE_THEN `joinf (\t. (f a)) (joinf f (\t. (f b)) b) a` EXISTS_TAC;
TYPE_THEN `a` EXISTS_TAC;
TYPE_THEN `b` EXISTS_TAC;
ASM_REWRITE_TAC[];
CONJ_TAC;
IMATCH_MP_TAC
joinf_cont;
ASM_SIMP_TAC[
const_continuous;
top_of_metric_top;
metric_real];
CONJ_TAC;
IMATCH_MP_TAC
joinf_cont;
ASM_REWRITE_TAC[];
ASM_SIMP_TAC[
const_continuous;
top_of_metric_top;
metric_real];
REWRITE_TAC[joinf];
ASM_REWRITE_TAC[];
CONJ_TAC;
ASM_REWRITE_TAC[joinf;REAL_ARITH `~(a<a)`];
CONJ_TAC;
UND 0;
DISCH_ALL_TAC;
USE 1 (MATCH_MP (REAL_ARITH `(a < b) ==> (~(b < a))`));
ASM_REWRITE_TAC [joinf;REAL_ARITH `~(b < b)`];
REWRITE_TAC[SUBSET;IN_IMAGE;Q_ELIM_THM'';
joinf ];
REWRITE_TAC[IN_UNIV];
GEN_TAC;
UND 0;
DISCH_ALL_TAC;
USE 4 (REWRITE_RULE[SUBSET;IN_IMAGE;Q_ELIM_THM'';]);
USE 4 (REWRITE_RULE[IN;IN_ELIM_THM' ]);
(* cc1 *)
TYPE_THEN `a` (WITH 4 o SPEC);
TYPE_THEN `b` (WITH 4 o SPEC);
TYPE_THEN `x'` (USE 4 o SPEC);
DISJ_CASES_TAC (REAL_ARITH `x' < a \/ (a <= x')`);
ASM_REWRITE_TAC[IN];
ASM_MESON_TAC[REAL_ARITH `(a <=a) /\ ((a < b) ==> (a <= b))`];
DISJ_CASES_TAC (REAL_ARITH `x' < b \/ (b <= x')`);
REWR 4;
USE 7 (MATCH_MP (REAL_ARITH `a <= x' ==> (~(x' < a))`));
ASM_REWRITE_TAC[IN ];
ASM_MESON_TAC[REAL_ARITH `x' < b ==> x' <= b`];
USE 7 (MATCH_MP (REAL_ARITH `a <= x' ==> (~(x' < a))`));
ASM_REWRITE_TAC[];
USE 8 (MATCH_MP (REAL_ARITH `b <= x' ==> ~(x' < b)`));
ASM_REWRITE_TAC[IN];
ASM_MESON_TAC[REAL_ARITH `b <=b /\ ((a < b) ==> (a <= b))`];
DISCH_TAC ;
CHO 0;
CHO 0;
CHO 0;
TYPE_THEN `f` EXISTS_TAC;
TYPE_THEN `a ` EXISTS_TAC;
TYPE_THEN `b` EXISTS_TAC;
ASM_REWRITE_TAC[];
UND 0;
REWRITE_TAC[SUBSET;IN_IMAGE ;Q_ELIM_THM''];
REWRITE_TAC[IN_UNIV];
REWRITE_TAC[IN;IN_ELIM_THM'];
ASM_MESON_TAC[];
]);;
(* }}} *)
let path_component_subspace = prove_by_refinement(
`!X Y d (y:A). ((Y SUBSET X) /\ (metric_space(X,d) /\ (Y y))) ==>
((path_component(top_of_metric(Y,d)) y) SUBSET
(path_component(top_of_metric(X,d)) y))`,
(* {{{ proof *)
[
DISCH_ALL_TAC;
REWRITE_TAC[SUBSET;IN;
path_domain];
DISCH_ALL_TAC;
CHO 3;
CHO 3;
CHO 3;
TYPE_THEN `f` EXISTS_TAC;
TYPE_THEN `a` EXISTS_TAC;
TYPE_THEN `b` EXISTS_TAC;
ASM_REWRITE_TAC[];
TYPE_THEN `metric_space(Y,d)` SUBGOAL_TAC;
ASM_MESON_TAC[
metric_subspace];
DISCH_TAC;
UND 3;
ASM_SIMP_TAC[GSYM
top_of_metric_unions];
DISCH_ALL_TAC;
CONJ_TAC;
UND 3;
TYPE_THEN `IMAGE f UNIV SUBSET X /\ IMAGE f UNIV SUBSET Y` SUBGOAL_TAC;
ASM_MESON_TAC[SUBSET;IN];
DISCH_TAC;
ASM_SIMP_TAC[
metric_continuous_continuous;
metric_real];
REWRITE_TAC[metric_continuous;metric_continuous_pt];
ASM_MESON_TAC[SUBSET;IN];
]);;
(* }}} *)
let path_component_in = prove_by_refinement(
`!x (y:A) U. (path_component U x y) ==> (UNIONS U y)`,
(* {{{ proof *)
[
REWRITE_TAC[path_component];
DISCH_ALL_TAC;
CHO 0;
CHO 0;
CHO 0;
UND 0;
DISCH_ALL_TAC;
USE 4 (REWRITE_RULE[SUBSET;IN_IMAGE;Q_ELIM_THM'']);
USE 4 (REWRITE_RULE[IN_ELIM_THM';
IN]);
TYPE_THEN `b` (USE 4 o SPEC);
ASM_MESON_TAC[REAL_ARITH `(a < b) ==> ((a<=. b) /\ (b <= b))`];
]);;
(* }}} *)
Q_ELIM_THM'']);
UND 6;
DISCH_ALL_TAC;
TYPE_THEN `b` (USE 10 o SPEC);
USE 4 (REWRITE_RULE[SUBSET;IN]);
UND 4;
DISCH_THEN IMATCH_MP_TAC ;
USE 5 (MATCH_MP top_of_metric_unions);
UND 10;
UND 4;
DISCH_THEN (fun t -> ONCE_REWRITE_TAC[GSYM t]);
ASM_REWRITE_TAC[IN];
ASM_MESON_TAC[REAL_ARITH `b <=. b /\ ((a < b)==> (a <=. b))`];
DISCH_TAC;
REWRITE_TAC[IN];
DISCH_ALL_TAC;
(* c2 *)
WITH 7 (MATCH_MP path_component_in);
TYPE_THEN `A' a` SUBGOAL_TAC;
UND 8;
ASM_SIMP_TAC[GSYM top_of_metric_unions;];
DISCH_TAC;
TYPE_THEN `A SUBSET (euclid n)` SUBGOAL_TAC;
USE 0 (MATCH_MP sub_union);
UND 0;
ASM_SIMP_TAC[GSYM top_of_metric_unions;metric_euclid];
DISCH_TAC;
TYPE_THEN `top_of_metric(euclid n,d_euclid) A'` SUBGOAL_TAC;
IMATCH_MP_TAC induced_trans;
TYPE_THEN `A` EXISTS_TAC;
ASM_REWRITE_TAC[];
ASM_SIMP_TAC[top_of_metric_top;metric_euclid;top_of_metric_induced ];
DISCH_TAC;
COPY 11;
UND 12;
SIMP_TAC[top_of_metric_nbd;metric_euclid];
DISCH_ALL_TAC;
TYPE_THEN `a` (USE 13 o SPEC);
USE 13 (REWRITE_RULE[IN]);
REWR 13;
CHO 13;
TYPE_THEN `r` EXISTS_TAC;
ASM_REWRITE_TAC[];
TYPE_THEN `open_ball (A,d_euclid) a r SUBSET path_component (top_of_metric (A',d_euclid)) a` SUBGOAL_TAC ;
TYPE_THEN `open_ball (euclid n,d_euclid) a r SUBSET path_component (top_of_metric (A',d_euclid)) a` SUBGOAL_TAC ;
TYPE_THEN `open_ball (euclid n,d_euclid) a r SUBSET path_component (top_of_metric ((open_ball(euclid n,d_euclid) a r),d_euclid)) a` SUBGOAL_TAC;
REWRITE_TAC[SUBSET;IN];
MESON_TAC[open_ball_path;SUBSET;IN;path_symm];
IMATCH_MP_TAC (prove_by_refinement(`!A B C. (B:A->bool) SUBSET C ==> (A SUBSET B ==> A SUBSET C)`,[MESON_TAC[SUBSET_TRANS]]));
IMATCH_MP_TAC path_component_subspace;
ASM_REWRITE_TAC[];
IMATCH_MP_TAC (REWRITE_RULE[IN] open_ball_nonempty);
ASM_SIMP_TAC[metric_euclid];
ASM_MESON_TAC[SUBSET;IN];
IMATCH_MP_TAC (prove_by_refinement (`!A B C. (A:A->bool) SUBSET B ==> (B SUBSET C ==> A SUBSET C)`,[MESON_TAC[SUBSET_TRANS]]));
ASM_SIMP_TAC[open_ball_subspace];
IMATCH_MP_TAC (prove_by_refinement(`!A B C. (B:A->bool) SUBSET C ==> (A SUBSET B ==> A SUBSET C)`,[MESON_TAC[SUBSET_TRANS]]));
REWRITE_TAC[SUBSET;IN];
GEN_TAC;
UND 7;
MESON_TAC[path_trans];
]);;
(* }}} *)
(* }}} *)