(* ------------------------------------------------------------------ *)
(*
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 *)
(* ------------------------------------------------------------------ *)
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 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[];
]);;
(* }}} *)
(* }}} *)
(* }}} *)
(* }}} *)
(* }}} *)
(* this generalizes to arbitrary cardinalities *)
(* }}} *)
NOT_IN_EMPTY];
GEN_TAC;
MATCH_MP_TAC EQ_EXT;
GEN_TAC;
REWRITE_TAC[IN_ELIM_THM'];
ASM_MESON_TAC[IN];
]);;
(* }}} *)
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'];
]);;
(* }}} *)
(* }}} *)
(* }}} *)
(* }}} *)
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[];
]);;
(* }}} *)
(* }}} *)
(* }}} *)
(* }}} *)
(* }}} *)
(* }}} *)
(* }}} *)
(* }}} *)
(* }}} *)
(* }}} *)
(* }}} *)
(* }}} *)
(* }}} *)
(* to fix two varying descriptions of ((INTER) Y): *)
(* }}} *)
(* ------------------------------------------------------------------ *)
(* Real Preliminaries *)
(* ------------------------------------------------------------------ *)
(* }}} *)
(* twopow , DUPLICATE OF TWOPOW_MK_POS *)
(* }}} *)
(* }}} *)
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;
]);;
(* }}} *)
(* }}} *)
(* }}} *)
(* }}} *)
(* }}} *)
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;
]);;
(* }}} *)
(* }}} *)
(* 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_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_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];
]);;
(* }}} *)
(* }}} *)
(* ------------------------------------------------------------------ *)
(* 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 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 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[];
]);;
(* }}} *)
(* }}} *)
(* }}} *)
(* 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[];
]);;
(* }}} *)
(* }}} *)
(* }}} *)
(* }}} *)
(*** 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_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];
]);;
(* }}} *)
(* }}} *)
(*** 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[];
]);;
(* }}} *)
(* }}} *)
(* 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 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];
]);;
(* }}} *)
(* }}} *)
(* }}} *)
(* }}} *)
(* }}} *)
(* 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 *)
(* }}} *)
(* }}} *)
(* }}} *)
(* }}} *)
(* }}} *)
(* }}} *)
(* 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_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[];
]);;
(* }}} *)
(* }}} *)
(* }}} *)
(* }}} *)
(* induced metric *)
let gen = euclid_def `gen (X:(A->bool)->bool)
= {A | ?Y. (Y SUBSET X) /\ (A = UNIONS Y)}`;;
(* }}} *)
(* }}} *)
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 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 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[];
]);;
(* }}} *)
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;
]);;
(* }}} *)
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 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. *)
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];
]);;
(* }}} *)
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)`;;
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;
]);;
(* }}} *)
(* }}} *)
(* topology is not needed as an assumption here! *)
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 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)))`;;
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[];
]);;
(* }}} *)
(* }}} *)
(* }}} *)
(* ------------------------------------------------------------------ *)
(* 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)`;;
*)
(* }}} *)
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_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];
]);;
(* }}} *)
(* }}} *)
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[];
]);;
(* }}} *)
(* }}} *)
(* }}} *)
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 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 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_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];
]);;
(* }}} *)
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[];
]);;
(* }}} *)
(* }}} *)
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];
]);;
(* }}} *)
(* }}} *)