Update from HH
[hl193./.git] / Jordan / metric_spaces.ml
1
2
3 (* ------------------------------------------------------------------ *)
4 (*
5    Topological Spaces, Metric Spaces,
6    Connectedness, Totally bounded spaces, compactness,
7    Hausdorff property, completeness, properties of Euclidean space,
8
9    Author: Thomas Hales 2004
10
11 *)
12
13 (* ------------------------------------------------------------------ *)
14
15
16 (* prioritize_real (or num) *)
17
18 (* ------------------------------------------------------------------ *)
19 (* Logical Preliminaries *)
20 (* ------------------------------------------------------------------ *)
21
22
23 let Q_ELIM_THM = prove_by_refinement(
24   `!P Q R . (?(u:B). (?(x:A). (u = P x) /\ (Q x)) /\ (R u)) <=>
25     (?x. (Q x) /\ R( P x))`,
26   (* {{{ proof *)
27   [
28   DISCH_ALL_TAC;
29   MESON_TAC[];
30   ]);;
31   (* }}} *)
32
33 let Q_ELIM_THM' = prove_by_refinement(
34   `!P Q R. (!(t:B). (?(x:A). P x /\ (t = Q x)) ==> R t) <=>
35     (!x. P x ==> R (Q x))`,
36   (* {{{ proof *)
37   [
38   DISCH_ALL_TAC;
39   MESON_TAC[];
40   ]);;
41   (* }}} *)
42
43 let Q_ELIM_THM'' = prove_by_refinement(
44   `!P Q R. (!(t:B). (?(x:A).  (t = Q x) /\ P x ) ==> R t) <=>
45     (!x. P x ==> R (Q x))`,
46   (* {{{ proof *)
47   [
48   DISCH_ALL_TAC;
49   MESON_TAC[];
50   ]);;
51   (* }}} *)
52
53
54 (* ------------------------------------------------------------------ *)
55 (* Set Preliminaries *)
56 (* ------------------------------------------------------------------ *)
57
58 let DIFF_SUBSET = prove_by_refinement(
59   `!X A (B:A->bool). A SUBSET (X DIFF B) <=>
60          (A SUBSET X) /\ (A INTER B = EMPTY)`,
61   (* {{{ proof *)
62   [
63   DISCH_ALL_TAC;
64   REWRITE_TAC[SUBSET;DIFF;INTER;IN];
65   EQ_TAC;
66   REWRITE_TAC[IN_ELIM_THM'];
67   DISCH_TAC;
68   CONJ_TAC;
69   ASM_MESON_TAC[];
70   MATCH_MP_TAC EQ_EXT;
71   GEN_TAC;
72   REWRITE_TAC[IN_ELIM_THM';EMPTY];
73   ASM_MESON_TAC[];
74   DISCH_ALL_TAC;
75   GEN_TAC;
76   DISCH_ALL_TAC;
77   REWRITE_TAC[IN_ELIM_THM'];
78   CONJ_TAC;
79   ASM_MESON_TAC[];
80   USE 1 (fun t-> AP_THM t `x:A`);
81   USE 1 (REWRITE_RULE[IN_ELIM_THM';EMPTY]);
82   ASM_MESON_TAC[];
83   ]);;
84   (* }}} *)
85
86 let SUBSET_INTERS = prove_by_refinement(
87   `!X (A:A->bool). A SUBSET (INTERS X) <=> (!x. X x ==> (A SUBSET x))`,
88   (* {{{ proof *)
89   [
90   REP_GEN_TAC;
91   REWRITE_TAC[SUBSET;INTERS];
92   REWRITE_TAC [IN_ELIM_THM'];
93   MESON_TAC[IN];
94   ]);;
95   (* }}} *)
96
97 let EQ_EMPTY = prove_by_refinement(
98   `!P. ({(x:A) | P x} = {}) <=> (!x. ~P x)`,
99   (* {{{ proof *)
100   [
101   DISCH_ALL_TAC;
102   EQ_TAC;
103   DISCH_TAC;
104   (USE 0 (fun t-> AP_THM t `x:A`));
105   USE 0 (REWRITE_RULE[IN_ELIM_THM';EMPTY]);
106   USE 0 (GEN_ALL);
107   ASM_REWRITE_TAC[];
108   DISCH_TAC;
109   MATCH_MP_TAC EQ_EXT;
110   GEN_TAC;
111   REWRITE_TAC[IN_ELIM_THM';EMPTY];
112   ASM_MESON_TAC[];
113   ]);;
114   (* }}} *)
115
116 let DIFF_INTER = prove_by_refinement(
117   `!A B (C:A->bool). ((A DIFF B) INTER C = EMPTY) <=>
118          ((A INTER C) SUBSET B)`,
119   (* {{{ proof *)
120   [
121   REWRITE_TAC[DIFF;INTER;SUBSET;IN_ELIM_THM'];
122   REWRITE_TAC[IN;EQ_EMPTY];
123   MESON_TAC[];
124   ]);;
125   (* }}} *)
126
127 let SUB_IMP_INTER = prove_by_refinement(
128   `!A B (C:A->bool). ((A SUBSET B) ==> (A INTER C) SUBSET B) /\
129         ((A SUBSET B) ==> (C INTER A) SUBSET B)`,
130   (* {{{ proof *)
131   [
132     DISCH_ALL_TAC;
133     SUBCONJ_TAC;
134     REWRITE_TAC[INTER;SUBSET;IN;IN_ELIM_THM'];
135     MESON_TAC[];
136     MESON_TAC[INTER_COMM];
137   ]);;
138   (* }}} *)
139
140 let SUBSET_UNIONS_INSERT = prove_by_refinement(
141   `!(A:A->bool) B C. A SUBSET (UNIONS (B INSERT C)) <=>
142            (A DIFF B) SUBSET (UNIONS C)`,
143   (* {{{ proof *)
144   [
145   DISCH_ALL_TAC;
146   SET_TAC[UNIONS;SUBSET;INSERT];
147   ]);;
148   (* }}} *)
149
150 let UNIONS_DELETE2 = prove_by_refinement(
151   `!(A:A->bool) B C. (A SUBSET (UNIONS B)) /\ (A INTER C = EMPTY) ==>
152                 (A SUBSET (UNIONS (B DELETE (C))))`,
153   (* {{{ proof *)
154   [
155   DISCH_ALL_TAC;
156   ASM SET_TAC[SUBSET;UNIONS;INTER;EMPTY;DELETE];
157   ]);;
158   (* }}} *)
159
160
161 (* this generalizes to arbitrary cardinalities *)
162 let finite_subset = prove_by_refinement(
163   `!A (f:A->B) B. (B SUBSET (IMAGE f A)) /\ (FINITE B) ==>
164      (?C. (C SUBSET A) /\ (FINITE C) /\ (B = IMAGE f C))`,
165   (* {{{ proof *)
166   [
167   DISCH_ALL_TAC;
168   USE 0 (REWRITE_RULE[SUBSET;IN_IMAGE]);
169   USE 0 (CONV_RULE NAME_CONFLICT_CONV);
170   USE 0 (CONV_RULE (quant_left_CONV "x'"));
171   USE 0 (CONV_RULE (quant_left_CONV "x'"));
172   CHO 0;
173   TYPE_THEN `IMAGE x' B` EXISTS_TAC ;
174   SUBCONJ_TAC;
175   REWRITE_TAC[SUBSET;IN_IMAGE];
176   NAME_CONFLICT_TAC;
177   GEN_TAC;
178   ASM_MESON_TAC[];
179   DISCH_ALL_TAC;
180   CONJ_TAC;
181   ASM_MESON_TAC[ FINITE_IMAGE];
182   MATCH_MP_TAC  SUBSET_ANTISYM;
183   CONJ_TAC;
184   REWRITE_TAC[SUBSET;IN_IMAGE];
185   GEN_TAC;
186   TYPE_THEN `x` (USE 0 o SPEC);
187   ASM_MESON_TAC[];
188   REWRITE_TAC[SUBSET;IN_IMAGE];
189   NAME_CONFLICT_TAC;
190   GEN_TAC;
191   DISCH_THEN CHOOSE_TAC;
192   ASM_REWRITE_TAC[];
193   AND 3;
194   CHO 3;
195   ASM_MESON_TAC[];
196   ]);;
197   (* }}} *)
198
199 let inters_singleton = prove_by_refinement(
200   `!(A:A->bool). INTERS {A} = A`,
201   (* {{{ proof *)
202   [
203   REWRITE_TAC[INSERT;INTERS];
204   REWRITE_TAC[IN_ELIM_THM';NOT_IN_EMPTY];
205   GEN_TAC;
206   MATCH_MP_TAC  EQ_EXT;
207   GEN_TAC;
208   REWRITE_TAC[IN_ELIM_THM'];
209   ASM_MESON_TAC[IN];
210   ]);;
211   (* }}} *)
212
213 let delete_empty = prove_by_refinement(
214   `!(A:A->bool) x. (A DELETE x = EMPTY) <=> (~(A = EMPTY) ==> (A = {x}))`,
215   (* {{{ proof *)
216
217   [
218   REWRITE_TAC[DELETE];
219   DISCH_ALL_TAC;
220   EQ_TAC;
221   DISCH_ALL_TAC;
222   USE 1 (fun t-> AP_THM t `u:A`);
223   USE 1 (REWRITE_RULE[IN_ELIM_THM';EMPTY]);
224   REWRITE_TAC[EMPTY;INSERT;IN];
225   USE 0 (REWRITE_RULE[EMPTY_EXISTS]);
226   USE 1 (GEN `u:A`);
227   MATCH_MP_TAC  EQ_EXT;
228   GEN_TAC;
229   REWRITE_TAC[IN_ELIM_THM'];
230   ASM_MESON_TAC[IN];
231   DISCH_ALL_TAC;
232   MATCH_MP_TAC  EQ_EXT;
233   GEN_TAC;
234   REWRITE_TAC[IN_ELIM_THM';EMPTY];
235   USE 0 (REWRITE_RULE[EMPTY_EXISTS]);
236   USE 0 (REWRITE_RULE[EMPTY;INSERT;IN]);
237   REWRITE_TAC[IN];
238   USE 0 (CONV_RULE (quant_left_CONV "u"));
239   USE 0 (SPEC `x':A`);
240   MATCH_MP_TAC  (TAUT `(a ==> b) ==> ~(a /\ ~b)`);
241   DISCH_ALL_TAC;
242   REWR 0;
243   UND  1;
244   ASM_REWRITE_TAC[];
245   REWRITE_TAC[IN_ELIM_THM'];
246   ]);;
247
248   (* }}} *)
249
250 let inters_subset = prove_by_refinement(
251   `!A (B:(A->bool)->bool). A SUBSET B ==> INTERS B SUBSET INTERS A`,
252   (* {{{ proof *)
253   [
254   DISCH_ALL_TAC;
255   REWRITE_TAC[INTERS;SUBSET;IN_ELIM_THM'];
256   ASM_MESON_TAC[SUBSET;IN];
257   ]);;
258   (* }}} *)
259
260 let delete_inters = prove_by_refinement(
261   `!V (u:A->bool). V u ==> (INTERS V = (INTERS (V DELETE u)) INTER u)`,
262   (* {{{ proof *)
263   [
264   DISCH_ALL_TAC;
265   MATCH_MP_TAC SUBSET_ANTISYM;
266   CONJ_TAC;
267   REWRITE_TAC[SUBSET_INTER];
268   CONJ_TAC;
269   MATCH_MP_TAC  inters_subset;
270   REWRITE_TAC [DELETE_SUBSET];
271   USE 0 (ONCE_REWRITE_RULE[GSYM IN]);
272   USE 0 (MATCH_MP INTERS_SUBSET);
273   ASM_REWRITE_TAC[];
274   TYPE_THEN `INTERS (V DELETE u) INTER u SUBSET u` SUBGOAL_TAC;
275   REWRITE_TAC[INTER_SUBSET];
276   REWRITE_TAC[SUBSET_INTERS];
277   DISCH_ALL_TAC;
278   DISCH_ALL_TAC;
279   TYPE_THEN `x = u` ASM_CASES_TAC;
280   ASM_MESON_TAC[];
281   TYPE_THEN `INTERS (V DELETE u) INTER u SUBSET INTERS (V DELETE u) ` SUBGOAL_TAC;
282   REWRITE_TAC[INTER_SUBSET];
283   TYPE_THEN `INTERS (V DELETE u) SUBSET x` SUBGOAL_TAC;
284   MATCH_MP_TAC  INTERS_SUBSET;
285   ASM_REWRITE_TAC [IN;DELETE;IN_ELIM_THM'];
286   ASM_MESON_TAC[SUBSET_TRANS];
287   ]);;
288   (* }}} *)
289
290 let EQ_EMPTY = prove_by_refinement(
291   `!(A:A->bool) . (A = EMPTY) <=> (!x. ~(A x))`,
292   (* {{{ proof *)
293   [
294   ASM_MESON_TAC[EMPTY_EXISTS;IN];
295   ]);;
296   (* }}} *)
297
298 let UNIONS_EQ_EMPTY = prove_by_refinement(
299   `!(U:(A->bool)->bool). (UNIONS U = {}) <=>
300      ((U = EMPTY) \/ (U = {EMPTY}))`,
301   (* {{{ proof *)
302   [
303   DISCH_ALL_TAC;
304   REWRITE_TAC[EQ_EMPTY;UNIONS;IN_ELIM_THM';INSERT;EMPTY];
305   REWRITE_TAC [IN];
306   EQ_TAC;
307   DISCH_ALL_TAC;
308   TYPE_THEN `!x. ~U x` ASM_CASES_TAC ;
309   ASM_REWRITE_TAC[];
310   ASM_REWRITE_TAC[];
311   MATCH_MP_TAC  EQ_EXT;
312   GEN_TAC;
313   REWRITE_TAC[IN_ELIM_THM'];
314   NAME_CONFLICT_TAC;
315   USE 1 (CONV_RULE (quant_left_CONV "x"));
316   CHO 1;
317   USE 0 (CONV_RULE (quant_left_CONV "u"));
318   USE 0 (CONV_RULE (quant_left_CONV "u"));
319   EQ_TAC;
320   DISCH_TAC;
321   TYPE_THEN `x` (USE 0 o SPEC);
322   ASM_MESON_TAC[];
323   DISCH_TAC;
324   COPY 0;
325   TYPE_THEN `x` (USE 0 o SPEC);
326   TYPE_THEN `x'` (USE 3 o SPEC);
327   PROOF_BY_CONTR_TAC;
328   TYPE_THEN `x' = {}` SUBGOAL_TAC;
329   PROOF_BY_CONTR_TAC;
330   USE 5 (REWRITE_RULE[EMPTY_EXISTS]);
331   CHO 5;
332   USE 5 (REWRITE_RULE[IN]);
333   ASM_MESON_TAC[];
334   USE 2 (CONV_RULE (quant_right_CONV "x'"));
335   ASM_MESON_TAC[IN;EMPTY_EXISTS];
336   DISCH_THEN DISJ_CASES_TAC;
337   ASM_MESON_TAC[];
338   ASM_REWRITE_TAC[IN_ELIM_THM'];
339   ASM_MESON_TAC[];
340   ]);;
341   (* }}} *)
342
343 let INTERS_EQ_EMPTY = prove_by_refinement(
344   `!((A:(A->bool)->bool)). ((INTERS A) = EMPTY) <=>
345     (!x . ?a.  (A a) /\ ~(a x))`,
346   (* {{{ proof *)
347   [
348   REWRITE_TAC[INTERS;EQ_EMPTY;IN_ELIM_THM'];
349   REWRITE_TAC[IN];
350   MESON_TAC[];
351    ]);;
352   (* }}} *)
353
354 let CARD_SING_CONV = prove_by_refinement(
355   `!X:A->bool. (X HAS_SIZE 1) ==> (SING X)`,
356   (* {{{ proof *)
357
358   [
359   REWRITE_TAC[HAS_SIZE ;SING ];
360   DISCH_ALL_TAC;
361   TYPE_THEN `CHOICE X` EXISTS_TAC;
362   TYPE_THEN `~(X = {})` SUBGOAL_TAC;
363   ASM_MESON_TAC[CARD_CLAUSES;ARITH_RULE`~(0=1)`];
364   DISCH_ALL_TAC;
365   TYPE_THEN `SUC (CARD (X DELETE (CHOICE X)))=1` SUBGOAL_TAC ;
366   ASM_SIMP_TAC[CARD_DELETE_CHOICE];
367   REWRITE_TAC[ARITH_RULE`(SUC a = 1) <=> (a=0)`];
368   ASSUME_TAC HAS_SIZE_0;
369   USE 3 (REWRITE_RULE [HAS_SIZE ]);
370   ASSUME_TAC FINITE_DELETE_IMP;
371   ASM_MESON_TAC[delete_empty];
372   ]);;
373
374   (* }}} *)
375
376 let countable_prod = prove_by_refinement(
377   `!(A:A->bool) (B:B->bool). (COUNTABLE A) /\ (COUNTABLE B) ==>
378    (COUNTABLE {(a,b) | (A a) /\ (B b) })`,
379   (* {{{ proof *)
380
381   [
382   DISCH_ALL_TAC;
383   IMATCH_MP_TAC  (INST_TYPE [`:num#num`,`:A`] COUNTABLE_IMAGE);
384   USE 0 (REWRITE_RULE [COUNTABLE;GE_C;IN_UNIV]);
385   USE 1 (REWRITE_RULE [COUNTABLE;GE_C;IN_UNIV]);
386   CHO 0;
387   CHO 1;
388   TYPE_THEN `{(m:num,n:num) | T}` EXISTS_TAC;
389   REWRITE_TAC[NUM2_COUNTABLE;SUBSET;IN_IMAGE];
390   REWRITE_TAC[IN_ELIM_THM];
391   TYPE_THEN `(\ (u,v) . (f u,f' v))` EXISTS_TAC;
392   DISCH_ALL_TAC;
393   CHO 2;
394   CHO 2;
395   AND 2;
396   TYPE_THEN `a` (USE 0 o SPEC);
397   TYPE_THEN `b` (USE 1 o SPEC);
398   IN_OUT_TAC;
399   REWR 2;
400   REWR 3;
401   CHO 3;
402   CHO 2;
403   TYPE_THEN `(x',x'')` EXISTS_TAC;
404   (CONV_TAC (TOP_DEPTH_CONV GEN_BETA_CONV));
405   ASM_MESON_TAC[];
406   ]);;
407
408   (* }}} *)
409
410 let IMAGE_I = prove_by_refinement(
411   `!(A:A->bool). IMAGE I A = A`,
412   (* {{{ proof *)
413   [
414   REWRITE_TAC[IMAGE;IN;I_DEF];
415   GEN_TAC;
416   MATCH_MP_TAC EQ_EXT THEN GEN_TAC ;
417   REWRITE_TAC[IN_ELIM_THM'];
418   ASM_MESON_TAC[];
419   ]);;
420   (* }}} *)
421
422 let EMPTY_NOT_EXISTS = prove_by_refinement(
423   `!X. (X = {}) <=> (~(?(u:A). X u))`,
424   (* {{{ proof *)
425   [
426   MESON_TAC [IN;EMPTY_EXISTS];
427   ]);;
428   (* }}} *)
429
430 let DIFF_SURJ = prove_by_refinement(
431   `!(f : A->B) X Y. (BIJ f X Y) ==>
432   (! t. (t SUBSET X) ==> ((IMAGE f (X DIFF t)) = (Y DIFF (IMAGE f t))))`,
433   (* {{{ proof *)
434
435   [
436   REWRITE_TAC[BIJ;INJ;SURJ;IN  ];
437   DISCH_ALL_TAC;
438   DISCH_ALL_TAC;
439   REWRITE_TAC[IMAGE;IN];
440   IMATCH_MP_TAC  EQ_EXT ;
441   REWRITE_TAC[IN_ELIM_THM'];
442   NAME_CONFLICT_TAC;
443   X_GEN_TAC `y:B`;
444   REWRITE_TAC[REWRITE_RULE[IN] IN_DIFF];
445   REWRITE_TAC[IN_ELIM_THM'];
446   ASM_MESON_TAC[SUBSET;IN ];
447   ]);;
448
449   (* }}} *)
450
451 let union_subset = prove_by_refinement(
452   `!Z1 Z2 A. ((Z1 UNION Z2) SUBSET (A:A->bool)) <=>
453      (Z1 SUBSET A) /\ (Z2 SUBSET A)`,
454   (* {{{ proof *)
455   [
456   DISCH_ALL_TAC;
457   REWRITE_TAC[UNION;SUBSET;IN;IN_ELIM_THM'];
458   ASM_MESON_TAC[];
459   ]);;
460   (* }}} *)
461
462 let preimage_disjoint = prove_by_refinement(
463   `!(f:A->B) A B X. (A INTER B = EMPTY) ==>
464     (preimage X f A INTER (preimage X f B) = EMPTY )`,
465   (* {{{ proof *)
466   [
467   DISCH_ALL_TAC;
468   REWRITE_TAC[preimage];
469   REWRITE_TAC[EQ_EMPTY];
470   DISCH_ALL_TAC;
471   USE 1( REWRITE_RULE[INTER;IN;IN_ELIM_THM']);
472   USE 0 (REWRITE_RULE[EQ_EMPTY;INTER;IN;IN_ELIM_THM']);
473   ASM_MESON_TAC[];
474   ]);;
475   (* }}} *)
476
477 let preimage_union = prove_by_refinement(
478   `!(f:A->B) A B X Z.
479        (Z SUBSET ((preimage X f A) UNION (preimage X f B))) <=>
480      (Z SUBSET X) /\ (IMAGE f Z SUBSET (A UNION B))`,
481   (* {{{ proof *)
482   [
483   DISCH_ALL_TAC;
484   REWRITE_TAC[preimage;IMAGE;UNION;SUBSET;IN;IN_ELIM_THM' ];
485   MESON_TAC[];
486   ]);;
487   (* }}} *)
488
489 let subset_preimage = prove_by_refinement(
490   `!(f:A->B) A X Z. (Z SUBSET (preimage X f A)) <=> (Z SUBSET X) /\
491         (IMAGE f Z SUBSET A)`,
492   (* {{{ proof *)
493   [
494   REWRITE_TAC[SUBSET;preimage;IMAGE;IN;IN_ELIM_THM'];
495   MESON_TAC[];
496   ]);;
497   (* }}} *)
498
499 let preimage_unions = prove_by_refinement(
500   `!dom (f:A->B) C. preimage dom f (UNIONS C) =
501      (UNIONS (IMAGE (preimage dom f) C))`,
502   (* {{{ proof *)
503   [
504   REWRITE_TAC[preimage;IN_UNIONS ];
505   REWRITE_TAC[UNIONS;IN_IMAGE ];
506   REWRITE_TAC[preimage;IN];
507   DISCH_ALL_TAC;
508   IMATCH_MP_TAC  EQ_EXT ;
509   DISCH_ALL_TAC;
510   REWRITE_TAC[IN_ELIM_THM'];
511   REWRITE_TAC[Q_ELIM_THM;IN_ELIM_THM' ];
512   MESON_TAC[];
513   ]);;
514   (* }}} *)
515
516 let preimage_subset = prove_by_refinement(
517   `!(f:A->B) X  A B. (A SUBSET B) ==>
518    (preimage X f A SUBSET (preimage X f B))`,
519   (* {{{ proof *)
520   [
521   REWRITE_TAC[SUBSET;in_preimage];
522   REWRITE_TAC[IN];
523   MESON_TAC[];
524   ]);;
525   (* }}} *)
526
527 (* to fix two varying descriptions of ((INTER) Y): *)
528 let INTER_THM = prove_by_refinement(
529   `!(X:A->bool). ((\B. B INTER X) = ((INTER) X)) /\
530     ((\B. X INTER B) = ((INTER) X))`,
531   (* {{{ proof *)
532   [
533   REWRITE_TAC[INTER_COMM];
534   GEN_TAC;
535   MATCH_MP_TAC EQ_EXT THEN BETA_TAC;
536   REWRITE_TAC[INTER_COMM];
537 ]);;
538  (* }}} *)
539
540
541 (* ------------------------------------------------------------------ *)
542 (* Real Preliminaries *)
543 (* ------------------------------------------------------------------ *)
544
545 let REAL_SUM_SQUARE_POS = prove_by_refinement(
546   `!m n x . &.0 <=. sum(m,n) (\i. (x i)*.(x i))`,
547   (* {{{ proof *)
548   [
549   DISCH_ALL_TAC;
550   MATCH_MP_TAC SUM_POS_GEN;
551   DISCH_ALL_TAC;
552   BETA_TAC;
553   REWRITE_TAC[REAL_LE_SQUARE];
554   ]);;
555   (* }}} *)
556
557 (* twopow , DUPLICATE OF TWOPOW_MK_POS *)
558 let twopow_pos = prove_by_refinement(
559   `!n. (&.0 <. twopow(n))`,
560   (* {{{ proof *)
561   [
562   GEN_TAC;
563   DISJ_CASES_TAC (SPEC `n:int` INT_IMAGE);
564   CHO 0;
565   ASM_REWRITE_TAC[TWOPOW_POS];
566   REDUCE_TAC;
567   ARITH_TAC;
568   CHO 0;
569   ASM_REWRITE_TAC[TWOPOW_NEG];
570   REDUCE_TAC;
571   ARITH_TAC;
572   ]);;
573   (* }}} *)
574
575 let twopow_double = prove_by_refinement(
576   `!n. &.2 * (twopow (--: (&: (n+1)))) = twopow (--: (&:n))`,
577   (* {{{ proof *)
578   [
579   DISCH_ALL_TAC;
580   REWRITE_TAC[TWOPOW_NEG;REAL_POW_ADD;POW_1;REAL_INV_MUL    ];
581   REWRITE_TAC [REAL_ARITH `a*b*cc = (a*cc)*b`];
582   REWRITE_TAC [REAL_RINV_2 ];
583   REAL_ARITH_TAC ;
584   ]);;
585   (* }}} *)
586
587
588 let min_finite = prove_by_refinement(
589   `!X.  (FINITE X) /\ (~(X = EMPTY )) ==>
590      (?delta. (X delta) /\ (!x. (X x) ==> (delta <=. x)))`,
591   (* {{{ proof *)
592
593   [
594   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 ;
595   DISCH_TAC;
596   DISCH_ALL_TAC;
597   TYPE_THEN `X` (USE 0 o SPEC);
598   TYPE_THEN `CARD X` (USE 0 o SPEC);
599   UND 0;
600   DISCH_THEN IMATCH_MP_TAC ;
601   ASM_REWRITE_TAC[HAS_SIZE ];
602   DISCH_THEN IMATCH_MP_TAC ;
603   CONV_TAC (quant_left_CONV "k");
604   INDUCT_TAC;
605   REWRITE_TAC[HAS_SIZE_0];
606   DISCH_ALL_TAC;
607   ASM_REWRITE_TAC[EMPTY];
608   ASM_MESON_TAC[];
609   DISCH_ALL_TAC;
610   USE 3(REWRITE_RULE[HAS_SIZE]);
611   TYPE_THEN `X DELETE (CHOICE X)` (USE 0 o SPEC);
612   ASM_CASES_TAC `k=0`;
613   REWR 3;
614   USE 3 (REWRITE_RULE [ARITH_RULE `SUC 0=1`]);
615   TYPE_THEN `SING X` SUBGOAL_TAC ;
616   IMATCH_MP_TAC  CARD_SING_CONV;
617   ASM_MESON_TAC [HAS_SIZE];
618   REWRITE_TAC[SING];
619   DISCH_TAC ;
620   CHO 5;
621   TYPE_THEN `x` EXISTS_TAC ;
622   ASM_REWRITE_TAC[REWRITE_RULE[IN] IN_SING ];
623   REAL_ARITH_TAC;
624   TYPE_THEN `FINITE (X DELETE CHOICE X) /\ ~(X DELETE CHOICE X = {}) /\ (X DELETE CHOICE X HAS_SIZE k ) ` SUBGOAL_TAC;
625   REWRITE_TAC[FINITE_DELETE;HAS_SIZE ];
626   ASM_REWRITE_TAC[];
627   REWR 3;
628   IMATCH_MP_TAC  (TAUT `(a /\ b) ==> (b /\ a)`);
629   SUBCONJ_TAC;
630   IMATCH_MP_TAC  (ARITH_RULE `(SUC x = SUC y) ==> (x = y)`);
631   COPY 3;
632   UND 3;
633   DISCH_THEN (fun t-> REWRITE_TAC[GSYM t]);
634   IMATCH_MP_TAC  CARD_DELETE_CHOICE;
635   ASM_REWRITE_TAC[];
636   IMATCH_MP_TAC  (TAUT `(b ==> ~a ) ==> (a ==> ~b)`);
637   DISCH_THEN (fun t-> ASM_REWRITE_TAC[t;CARD_CLAUSES]);
638   DISCH_TAC;
639   REWR 0;
640   CHO 0;
641   ALL_TAC; (* "ccx" *)
642   TYPE_THEN `if (delta < (CHOICE X)) then delta else (CHOICE X)` EXISTS_TAC;
643   (* REWRITE_TAC[min_real]; *)
644   COND_CASES_TAC ;
645   CONJ_TAC;
646   UND 0;
647   REWRITE_TAC[DELETE;IN ;IN_ELIM_THM' ];
648   MESON_TAC[];
649   GEN_TAC;
650   UND 0;
651   REWRITE_TAC[DELETE;IN ;IN_ELIM_THM' ];
652   DISCH_ALL_TAC;
653   TYPE_THEN  `x = CHOICE X` ASM_CASES_TAC ;
654   ASM_REWRITE_TAC[];
655   UND 6;
656   REAL_ARITH_TAC;
657   ASM_MESON_TAC[];
658   SUBCONJ_TAC;
659   IMATCH_MP_TAC  (REWRITE_RULE[IN ] CHOICE_DEF);
660   ASM_REWRITE_TAC[];
661   DISCH_TAC;
662   DISCH_ALL_TAC;
663   TYPE_THEN `x = CHOICE X` ASM_CASES_TAC ;
664   ASM_REWRITE_TAC[];
665   REAL_ARITH_TAC;
666   UND 0;
667     REWRITE_TAC[DELETE;IN ;IN_ELIM_THM' ];
668   DISCH_ALL_TAC;
669   TYPE_THEN `x` (USE 11 o SPEC);
670   REWR 11;
671   UND 11;
672   UND 6;
673   REAL_ARITH_TAC;
674   ]);;
675
676   (* }}} *)
677
678 let min_finite_delta = prove_by_refinement(
679   `!c X.  (FINITE X) /\ ( !x. (X x) ==> (c <. x) ) ==>
680      (?delta. (c <. delta) /\ (!x. (X x) ==> (delta <=. x)))`,
681   (* {{{ proof *)
682   [
683   DISCH_ALL_TAC;
684   TYPE_THEN `~(X = EMPTY)` ASM_CASES_TAC;
685   JOIN 0 2;
686   USE 0 (MATCH_MP min_finite);
687   CHO 0;
688   TYPE_THEN `delta` EXISTS_TAC;
689   ASM_REWRITE_TAC[];
690   ASM_MESON_TAC[];
691   REWR 2;
692   ASM_REWRITE_TAC[EMPTY];
693   TYPE_THEN `c +. (&.1)` EXISTS_TAC;
694   REAL_ARITH_TAC;
695   ]);;
696   (* }}} *)
697
698 let union_closed_interval = prove_by_refinement(
699   `!a b c. (a <=. b) /\ (b <=. c) ==>
700     ({x | a <= x /\ x < b} UNION {x | b <= x /\ x <= c} =
701      { x | a <= x /\ x <= c})`,
702   (* {{{ proof *)
703   [
704   DISCH_ALL_TAC;
705   REWRITE_TAC[UNION;IN;IN_ELIM_THM'];
706   IMATCH_MP_TAC  EQ_EXT ;
707   REWRITE_TAC[IN_ELIM_THM'];
708   UND 0;
709   UND 1;
710   REAL_ARITH_TAC;
711   ]);;
712   (* }}} *)
713
714 let real_half_LT = prove_by_refinement(
715   `!x y z. ((x < z/(&.2)) /\ (y < z/(&.2)) ==> (x + y < z))`,
716   (* {{{ proof *)
717   [
718   DISCH_ALL_TAC;
719   (GEN_REWRITE_TAC RAND_CONV) [GSYM REAL_HALF_DOUBLE];
720   UND 0;
721   UND 1;
722   REAL_ARITH_TAC;
723   ]);;
724   (* }}} *)
725
726 let real_half_LE = prove_by_refinement(
727   `!x y z. ((x < z/(&.2)) /\ (y <= z/(&.2)) ==> (x + y < z))`,
728   (* {{{ proof *)
729   [
730   DISCH_ALL_TAC;
731   (GEN_REWRITE_TAC RAND_CONV) [GSYM REAL_HALF_DOUBLE];
732   UND 0;
733   UND 1;
734   REAL_ARITH_TAC;
735   ]);;
736   (* }}} *)
737
738 let real_half_EL = prove_by_refinement(
739   `!x y z. ((x <= z/(&.2)) /\ (y < z/(&.2)) ==> (x + y < z))`,
740   (* {{{ proof *)
741   [
742   DISCH_ALL_TAC;
743   (GEN_REWRITE_TAC RAND_CONV) [GSYM REAL_HALF_DOUBLE];
744   UND 0;
745   UND 1;
746   REAL_ARITH_TAC;
747   ]);;
748   (* }}} *)
749
750 let real_half_LLE = prove_by_refinement(
751   `!x y z. ((x <= z/(&.2)) /\ (y <= z/(&.2)) ==> (x + y <= z))`,
752   (* {{{ proof *)
753   [
754   DISCH_ALL_TAC;
755   (GEN_REWRITE_TAC RAND_CONV) [GSYM REAL_HALF_DOUBLE];
756   UND 0;
757   UND 1;
758   REAL_ARITH_TAC;
759   ]);;
760   (* }}} *)
761
762 let interval_finite = prove_by_refinement(
763   `!N. FINITE {x | ?j. (abs x = &.j) /\ (j <=| N)}`,
764   (* {{{ proof *)
765   [
766   GEN_TAC;
767   ABBREV_TAC `inter = {n | n <=| N}`;
768   SUBGOAL_TAC `FINITE {y | ?x. (x IN inter /\ (y = (&. x)))}`;
769   MATCH_MP_TAC FINITE_IMAGE_EXPAND;
770   EXPAND_TAC "inter";
771   REWRITE_TAC[FINITE_NUMSEG_LE];
772   SUBGOAL_TAC `FINITE {y | ?x. (x IN inter /\ (y = --.(&. x)))}`;
773   MATCH_MP_TAC FINITE_IMAGE_EXPAND;
774   EXPAND_TAC "inter";
775   REWRITE_TAC[FINITE_NUMSEG_LE];
776   DISCH_ALL_TAC;
777   JOIN 1 2;
778   USE 1 (REWRITE_RULE[GSYM FINITE_UNION]);
779   UND 1;
780   SUBGOAL_TAC `!a b. ((a:real->bool) = b) ==> (FINITE a ==> FINITE b)`;
781   REP_GEN_TAC;
782   DISCH_THEN (fun t-> REWRITE_TAC[t]);
783   DISCH_THEN (fun t-> MATCH_MP_TAC t);
784   MATCH_MP_TAC EQ_EXT;
785   X_GEN_TAC `c:real`;
786   REWRITE_TAC[IN_ELIM_THM';UNION];
787   EXPAND_TAC "inter";
788   REWRITE_TAC[IN_ELIM_THM'];
789   REWRITE_TAC[real_abs];
790   EQ_TAC;
791   MATCH_MP_TAC (TAUT `(a==>b) /\ (c==>b) ==> (a \/ c ==> b)`);
792   CONJ_TAC;
793   DISCH_THEN CHOOSE_TAC;
794   AND 1;
795   ASM_REWRITE_TAC[];
796   EXISTS_TAC `x:num`;
797   ASM_REWRITE_TAC [REAL_LE;LE_0];
798   DISCH_THEN CHOOSE_TAC;
799   AND 1;
800   EXISTS_TAC `x:num`;
801   ASM_REWRITE_TAC[REAL_NEG_NEG];
802   COND_CASES_TAC;
803   UND 3;
804   REDUCE_TAC;
805   ARITH_TAC;
806   REDUCE_TAC;
807   DISCH_THEN CHOOSE_TAC;
808   AND 1;
809   UND 2;
810   COND_CASES_TAC;
811   ASM_MESON_TAC[];
812   DISCH_TAC;
813   DISJ2_TAC;
814   EXISTS_TAC `j:num`;
815   ASM_REWRITE_TAC[];
816   UND 3;
817   REAL_ARITH_TAC;
818   ]);;
819   (* }}} *)
820
821
822 (* ------------------------------------------------------------------ *)
823 (* Euclidean Space *)
824 (* ------------------------------------------------------------------ *)
825
826 let euclid_add_closure = prove_by_refinement(
827   `!f g n. (euclid n f) /\ (euclid n g) ==> (euclid n (f + g))`,
828 (* {{{ *)
829   [
830   REWRITE_TAC[euclid;euclid_plus];
831   ASM_MESON_TAC[REAL_ARITH `&0 +. (&.0) = (&.0)`];
832   ]);;
833 (* }}} *)
834
835 let euclid_scale_closure = prove_by_refinement(
836   `!n t f. (euclid n f) ==> (euclid n ((t:real) *# f))`,
837 (* {{{ *)
838   [
839   REWRITE_TAC[euclid;euclid_scale];
840   MESON_TAC[REAL_ARITH `t *.(&.0) = (&.0)`];
841   ]);;
842 (* }}} *)
843
844 let euclid_neg_closure = prove_by_refinement(
845   `!f n. (euclid n f) ==> (euclid n (-- f))`,
846 (* {{{ *)
847
848   [
849   REWRITE_TAC[euclid;euclid_neg];
850   DISCH_ALL_TAC;
851   ASM_REWRITE_TAC[REAL_ARITH `(--x = &.0) <=> (x = &.0)`];
852   ]);;
853
854 (* }}} *)
855
856 let euclid_sub_closure = prove_by_refinement(
857   `!f g n. (euclid n f ) /\ (euclid n g) ==> (euclid n (f - g))`,
858 (* {{{ *)
859
860   [
861   REWRITE_TAC[euclid;euclid_minus];
862   ASM_MESON_TAC[REAL_ARITH `&.0 -. (&.0) = (&.0)`];
863   ]);;
864
865 (* }}} *)
866
867 let neg_dim = prove_by_refinement(
868   `!f n. (euclid n f) = (euclid n (--f))`,
869 (* {{{ *)
870
871   [
872   REPEAT GEN_TAC;
873   EQ_TAC;
874   REWRITE_TAC[euclid_neg_closure];
875   REWRITE_TAC[euclid;euclid_neg];
876   DISCH_ALL_TAC;
877   ONCE_REWRITE_TAC[REAL_ARITH `(x = &.0) <=> (--x = &.0)`];
878   ASM_REWRITE_TAC[];
879   ]);;
880
881 (* }}} *)
882
883 let euclid_updim = prove_by_refinement (
884  `!f m n. (m <=| n) /\ (euclid m f) ==> (euclid n f)`,
885 (* {{{ *)
886  [
887  REWRITE_TAC[euclid];
888  MESON_TAC[LE_TRANS];
889  ]);;
890 (* }}} *)
891
892 let euclidean_add_closure = prove_by_refinement(
893  `!f g. (euclidean f) /\ (euclidean g) ==> (euclidean (f+g))`,
894 (* {{{ *)
895
896   [
897   REWRITE_TAC[euclidean];
898   DISCH_ALL_TAC;
899   UNDISCH_FIND_THEN `euclid` CHOOSE_TAC;
900   UNDISCH_FIND_THEN `(?)` CHOOSE_TAC;
901   EXISTS_TAC `n+|n'`;
902   ASSUME_TAC (ARITH_RULE `n <=| n+n'`);
903   ASSUME_TAC (ARITH_RULE `n' <=| n+n'`);
904   ASM_MESON_TAC[euclid_add_closure;euclid_updim];
905   ]);;
906
907 (* }}} *)
908
909 let euclidean_sub_closure = prove_by_refinement(
910   `!f g. (euclidean f) /\ (euclidean g) ==> (euclidean (f-g))`,
911 (* {{{ *)
912
913   [
914   REWRITE_TAC[euclidean];
915   DISCH_ALL_TAC;
916   UNDISCH_FIND_THEN `euclid` CHOOSE_TAC;
917   UNDISCH_FIND_THEN `(?)` CHOOSE_TAC;
918   EXISTS_TAC `n+|n'`;
919   ASSUME_TAC (ARITH_RULE `n <=| n+n'`);
920   ASSUME_TAC (ARITH_RULE `n' <=| n+n'`);
921   ASM_MESON_TAC[euclid_sub_closure;euclid_updim];
922   ]);;
923
924 (* }}} *)
925
926 let euclidean_scale_closure = prove_by_refinement(
927   `!s f. (euclidean f) ==> (euclidean (s *# f))`,
928 (* {{{ *)
929   [
930   REWRITE_TAC[euclidean];
931   REPEAT GEN_TAC;
932   DISCH_THEN CHOOSE_TAC;
933   EXISTS_TAC `n:num`;
934   ASM_MESON_TAC[euclid_scale_closure];
935   ]);;
936 (* }}} *)
937
938 let euclidean_neg_closure = prove_by_refinement(
939   `!f. (euclidean f) ==> (euclidean (-- f))`,
940 (* {{{ *)
941   [
942   REWRITE_TAC[euclidean];
943   GEN_TAC;
944   DISCH_THEN CHOOSE_TAC;
945   EXISTS_TAC `n:num`;
946   ASM_MESON_TAC[euclid_neg_closure];
947   ]);;
948 (* }}} *)
949
950 let euclid_add_comm = prove_by_refinement(
951   `!(f:num->real) g. (f + g = g + f)`,
952 (* {{{ *)
953   [
954   REWRITE_TAC[euclid_plus;REAL_ARITH `a+.b = b+.a`]
955   ]);;
956 (* }}} *)
957
958 let euclid_add_assoc = prove_by_refinement(
959   `!(f:num->real) g h. (f + g)+h = f + g + h`,
960 (* {{{ *)
961   [
962   REWRITE_TAC[euclid_plus;REAL_ARITH `(a+.b)+.c = a+b+c`];
963   ]);;
964 (* }}} *)
965
966 let euclid_lzero = prove_by_refinement(
967   `!f. euclid0 + f = f`,
968 (* {{{ *)
969   [
970   REWRITE_TAC[euclid_plus;euclid0;REAL_ARITH `&.0+a=a`];
971   ACCEPT_TAC (INST_TYPE [(`:num`,`:A`);(`:real`,`:B`)] ETA_AX);
972   ]);;
973 (* }}} *)
974
975 let euclid_rzero = prove_by_refinement(
976   `!f. f + euclid0  = f`,
977 (* {{{ *)
978   [
979   REWRITE_TAC[euclid_plus;euclid0;REAL_ARITH `a+(&.0)=a`];
980   ACCEPT_TAC (INST_TYPE [(`:num`,`:A`);(`:real`,`:B`)] ETA_AX);
981   ]);;
982 (* }}} *)
983
984 let euclid_ldistrib = prove_by_refinement(
985   `!f g r. r *# (f + g) = (r *# f) + (r *# g)`,
986 (* {{{ *)
987   [
988   REWRITE_TAC[euclid_plus;euclid_scale;REAL_ARITH `a*(b+.c)=a*b+a*c`];
989   ]);;
990 (* }}} *)
991
992 let euclid_rdistrib = prove_by_refinement(
993   `!f r s.  (r+s)*# f  = (r *# f) + (s *# f)`,
994 (* {{{ *)
995   [
996   REWRITE_TAC[euclid_plus;euclid_scale;REAL_ARITH `(a+b)*c= a*c+b*c`];
997   ]);;
998 (* }}} *)
999
1000 let euclid_scale_act = prove_by_refinement(
1001   `!r s f. r *# (s *# f) = (r *s) *# f`,
1002 (* {{{ *)
1003   [
1004   REWRITE_TAC[euclid_scale;REAL_ARITH `(a*b)*c = a*(b*c)`];
1005   ]);;
1006 (* }}} *)
1007
1008 let euclid_scale_one = prove_by_refinement(
1009   `!f. (&.1) *# f = f`,
1010 (* {{{ proof *)
1011   [
1012   REWRITE_TAC[euclid_scale];
1013   REDUCE_TAC;
1014   MESON_TAC[ETA_AX];
1015   ]);;
1016 (* }}} *)
1017
1018 let euclid_neg_sum = prove_by_refinement(
1019   `!x y .  euclid_minus (--x) (--y) = -- (euclid_minus x y)`,
1020   (* {{{ proof *)
1021   [
1022   REWRITE_TAC[euclid_neg;euclid_minus];
1023   DISCH_ALL_TAC;
1024   IMATCH_MP_TAC  EQ_EXT;
1025   BETA_TAC;
1026   REAL_ARITH_TAC;
1027   ]);;
1028   (* }}} *)
1029
1030 let trivial_lin_combo = prove_by_refinement(
1031   `!x t.  ((t *# x) + (&.1 - t) *# x = x)`,
1032   (* {{{ proof *)
1033   [
1034   DISCH_ALL_TAC;
1035   REWRITE_TAC[euclid_plus;euclid_scale;];
1036   IMATCH_MP_TAC  EQ_EXT  THEN BETA_TAC;
1037   REAL_ARITH_TAC ;
1038   ]);;
1039   (* }}} *)
1040
1041
1042 (* DOT PRODUCT  *)
1043
1044 let dot_euclid = prove_by_refinement(
1045  `!p f g. (euclid p f) /\ (euclid p g) ==>
1046    (dot f g = sum (0,p) (\i. (f i)* (g i)))`,
1047 (* {{{ *)
1048
1049   [
1050   REWRITE_TAC[dot];
1051     LET_TAC;
1052   REPEAT GEN_TAC;
1053   ABBREV_TAC `(P:num->bool) = \m. (euclid m f) /\ (euclid m g)`;
1054   DISCH_ALL_TAC;
1055   SUBGOAL_TAC `(P:num->bool) (p:num)`;
1056   EXPAND_TAC "P";
1057   ASM_REWRITE_TAC[];
1058   DISCH_TAC;
1059   SUBGOAL_TAC `min_num P <=| p`;
1060   ASM_MESON_TAC[min_least];
1061   DISCH_TAC;
1062   SUBGOAL_TAC
1063     `euclid (min_num (P:num->bool)) f /\ (euclid (min_num (P:num->bool)) g)`;
1064   ASM_MESON_TAC[min_least];
1065   DISCH_ALL_TAC;
1066   ABBREV_TAC `q = min_num P`;
1067   MP_TAC (SPECL [`q:num`;`p:num`] LE_EXISTS);
1068   ASM_REWRITE_TAC[];
1069   DISCH_THEN CHOOSE_TAC;
1070   ASM_REWRITE_TAC[GSYM SUM_TWO];
1071   MATCH_MP_TAC (REAL_ARITH `(u = (&.0)) ==> (x = x + u)`);
1072   SUBGOAL_THEN `!n. n>=| q  ==> ((\i. f i *. g i) n = (&.0))` (fun th -> MATCH_MP_TAC (MATCH_MP SUM_ZERO th));
1073   GEN_TAC THEN BETA_TAC;
1074   DISCH_TAC;
1075   SUBGOAL_THEN `(f:num->real) n = (&.0)` (fun th -> REWRITE_TAC[th;REAL_ARITH `(&.0)*.a =(&.0)`]);
1076   UNDISCH_TAC `euclid q f`;
1077   UNDISCH_TAC `n >=| q`;
1078   MESON_TAC[euclid;ARITH_RULE `(a<=|b) <=> (b >=| a)`];
1079   ACCEPT_TAC (ARITH_RULE `q >=| q`);
1080   ]);;
1081
1082 (* }}} *)
1083
1084 let dot_updim = prove_by_refinement (
1085  `!f g m n. (m <=|n) /\ (euclid m f) /\ (euclid m g) ==>
1086    (dot f g = sum (0,n) (\i. (f i)* (g i)))`,
1087 (* {{{ *)
1088  [
1089  REPEAT GEN_TAC;
1090  DISCH_ALL_TAC;
1091    SUBGOAL_TAC `(euclid n f) /\ (euclid n g)`;
1092  ASM_MESON_TAC[euclid_updim];
1093  MATCH_ACCEPT_TAC dot_euclid]
1094 );;
1095 (* }}} *)
1096
1097 let dot_nonneg = prove_by_refinement(
1098  `!f. (&.0 <= (dot f f))`,
1099 (* {{{ *)
1100  [
1101  REWRITE_TAC[dot];
1102    LET_TAC;
1103  GEN_TAC;
1104  SUBGOAL_TAC `(!n. (&.0 <=. (\(i:num). f i *. f i) n))`;
1105  BETA_TAC;
1106  REWRITE_TAC[REAL_LE_SQUARE];
1107  ASSUME_TAC(SPEC `\i. (f:num->real) i *. f i` SUM_POS);
1108  ASM_MESON_TAC[]]);;
1109 (* }}} *)
1110
1111 let dot_comm = prove_by_refinement(
1112   `!f g. (dot f g = dot g f)`,
1113 (* {{{ *)
1114  [
1115  REWRITE_TAC[dot];
1116  REWRITE_TAC[REAL_ARITH `a*.b = b*.a`;TAUT `a/\b <=> b/\a`]
1117  ]);;
1118 (* }}} *)
1119
1120 let dot_neg = prove_by_refinement(
1121   `!f g. (dot (--f) g) = --. (dot f g)`,
1122 (* {{{ *)
1123  [
1124  REWRITE_TAC[dot];
1125    LET_TAC;
1126   REWRITE_TAC [GSYM neg_dim];
1127   ONCE_REWRITE_TAC[GSYM SUM_NEG];
1128   REWRITE_TAC[euclid_neg];
1129   REPEAT GEN_TAC;
1130   AP_TERM_TAC;
1131   MATCH_MP_TAC EQ_EXT;
1132   BETA_TAC;
1133   GEN_TAC;
1134   REWRITE_TAC[REAL_ARITH `(--x) * y = --. (x *y)`];
1135  ]);;
1136 (* }}} *)
1137
1138 let dot_neg2 = prove_by_refinement(
1139   `!f g. (dot f (--g)) = --. (dot f g)`,
1140 (* {{{ *)
1141   [
1142   ONCE_REWRITE_TAC[dot_comm];
1143   REWRITE_TAC[dot_neg];
1144   ]);;
1145 (* }}} *)
1146
1147 let dot_scale = prove_by_refinement(
1148  `!n f g s. (euclid n f) /\ (euclid n g) ==>
1149   (dot (s *# f) g = s *. (dot f g))`,
1150 (* {{{ *)
1151  [
1152  REWRITE_TAC[euclid_scale];
1153  REPEAT GEN_TAC;
1154    DISCH_THEN (fun th -> ASSUME_TAC th THEN ASSUME_TAC (MATCH_MP dot_euclid th));
1155    SUBGOAL_THEN (`euclid n (\ (i:num). (s *. f i) ) /\ (euclid n g)`) ASSUME_TAC;
1156  ASM_REWRITE_TAC[];
1157  ASSUME_TAC(REWRITE_RULE[euclid_scale](SPECL [`n:num`;`s:real`;`f:num->real`] euclid_scale_closure));
1158  ASM_MESON_TAC[];
1159  IMP_RES_THEN ASSUME_TAC dot_euclid;
1160  ASM_REWRITE_TAC[];
1161  REWRITE_TAC[GSYM SUM_CMUL];
1162  AP_TERM_TAC;
1163  MATCH_MP_TAC EQ_EXT;
1164  GEN_TAC;
1165  BETA_TAC;
1166  REWRITE_TAC[REAL_ARITH `a*.(b*.c) = (a*b)*c`];
1167  ]);;
1168 (* }}} *)
1169
1170 let dot_scale_euclidean = prove_by_refinement(
1171   `!f g s. (euclidean f) /\ (euclidean g) ==>
1172   (dot (s *# f) g = s *. (dot f g))`,
1173 (* {{{ *)
1174
1175  [
1176  REWRITE_TAC[euclidean];
1177  DISCH_ALL_TAC;
1178  REPEAT (UNDISCH_FIND_THEN  `euclid` (CHOOSE_THEN MP_TAC));
1179  DISCH_ALL_TAC;
1180  ASSUME_TAC (ARITH_RULE `(n' <=| n+n')`);
1181  ASSUME_TAC (ARITH_RULE `(n <=| n+n')`);
1182  SUBGOAL_TAC `euclid (n+|n') f /\ euclid (n+n') g`;
1183  ASM_MESON_TAC[euclid_updim];
1184  MESON_TAC[dot_scale];
1185  ]);;
1186
1187 (* }}} *)
1188
1189 let dot_scale2 = prove_by_refinement(
1190  `!n f g s. (euclid n f) /\ (euclid n g) ==>
1191   (dot f (s *# g) = s *. (dot f g))`,
1192 (* {{{ *)
1193  [
1194  ONCE_REWRITE_TAC[dot_comm];
1195  MESON_TAC[dot_scale]
1196  ]);;
1197 (* }}} *)
1198
1199 let dot_scale2_euclidean = prove_by_refinement(
1200   `!f g s. (euclidean f) /\ (euclidean g) ==>
1201   (dot f (s *# g) = s *. (dot f g))`,
1202 (* {{{ *)
1203  [
1204  ONCE_REWRITE_TAC[dot_comm];
1205  MESON_TAC[dot_scale_euclidean];
1206  ]);;
1207 (* }}} *)
1208
1209 let dot_linear = prove_by_refinement(
1210  `!n f g h. (euclid n f) /\ (euclid n g) /\ (euclid n h) ==>
1211     ((dot (f + g) h ) = (dot f h) +. (dot g h))`,
1212 (* {{{ *)
1213   [
1214   DISCH_ALL_TAC;
1215   SUBGOAL_TAC `euclid n (f+g)`;
1216   ASM_MESON_TAC[euclid_add_closure];
1217   DISCH_TAC;
1218   MP_TAC (SPECL [`n:num`;`f:num->real`;`h:num->real`] dot_euclid);
1219   MP_TAC (SPECL [`n:num`;`g:num->real`;`h:num->real`] dot_euclid);
1220   MP_TAC (SPECL [`n:num`;`(f+g):num->real`;`h:num->real`] dot_euclid);  ASM_REWRITE_TAC[];
1221   DISCH_ALL_TAC;
1222   ASM_REWRITE_TAC[];
1223   REWRITE_TAC[GSYM SUM_ADD];
1224   AP_TERM_TAC;
1225   MATCH_MP_TAC EQ_EXT THEN GEN_TAC THEN BETA_TAC;
1226   REWRITE_TAC[euclid_plus];
1227   REWRITE_TAC[REAL_ARITH `(a+.b)*.c = a*c + b*c`];
1228   ]);;
1229 (* }}} *)
1230
1231 let dot_minus_linear = prove_by_refinement(
1232  `!n f g h. (euclid n f) /\ (euclid n g) /\ (euclid n h) ==>
1233     ((dot (f - g) h ) = (dot f h) -. (dot g h))`,
1234 (* {{{ *)
1235
1236   [
1237   DISCH_ALL_TAC;
1238   SUBGOAL_TAC `euclid n (f-g)`;
1239   ASM_MESON_TAC[euclid_sub_closure];
1240   DISCH_TAC;
1241   MP_TAC (SPECL [`n:num`;`f:num->real`;`h:num->real`] dot_euclid);
1242   MP_TAC (SPECL [`n:num`;`g:num->real`;`h:num->real`] dot_euclid);
1243   MP_TAC (SPECL [`n:num`;`(f-g):num->real`;`h:num->real`] dot_euclid);
1244   ASM_REWRITE_TAC[];
1245   DISCH_ALL_TAC;
1246   ASM_REWRITE_TAC[];
1247   REWRITE_TAC[GSYM SUM_SUB];
1248   AP_TERM_TAC;
1249   MATCH_MP_TAC EQ_EXT THEN GEN_TAC THEN BETA_TAC;
1250   REWRITE_TAC[euclid_minus];
1251   REWRITE_TAC[REAL_ARITH `(a-.b)*.c = a*c - b*c`];
1252   ]);;
1253
1254 (* }}} *)
1255
1256 let dot_linear_euclidean = prove_by_refinement(
1257  `!f g h. (euclidean f) /\ (euclidean g) /\ (euclidean h) ==>
1258     ((dot (f + g) h ) = (dot f h) +. (dot g h))`,
1259 (* {{{ *)
1260   [
1261   REWRITE_TAC[euclidean];
1262   DISCH_ALL_TAC;
1263   REPEAT (UNDISCH_FIND_THEN `euclid` (CHOOSE_THEN MP_TAC));
1264   DISCH_ALL_TAC;
1265   SUBGOAL_TAC `(euclid (n+n'+n'') f)`;
1266   ASM_MESON_TAC[ARITH_RULE `n <=| n+n'+n''`;euclid_updim];
1267   SUBGOAL_TAC `(euclid (n+n'+n'') g)`;
1268   ASM_MESON_TAC[ARITH_RULE `n' <=| n+n'+n''`;euclid_updim];
1269   SUBGOAL_TAC `(euclid (n+n'+n'') h)`;
1270   ASM_MESON_TAC[ARITH_RULE `n'' <=| n+n'+n''`;euclid_updim];
1271   MESON_TAC[dot_linear]]);;
1272 (* }}} *)
1273
1274 let dot_minus_linear_euclidean = prove_by_refinement(
1275  `!f g h. (euclidean f) /\ (euclidean g) /\ (euclidean h) ==>
1276     ((dot (f - g) h ) = (dot f h) -. (dot g h))`,
1277 (* {{{ *)
1278
1279   [
1280   REWRITE_TAC[euclidean];
1281   DISCH_ALL_TAC;
1282   REPEAT (UNDISCH_FIND_THEN `euclid` (CHOOSE_THEN MP_TAC));
1283   DISCH_ALL_TAC;
1284   SUBGOAL_TAC `(euclid (n+n'+n'') f)`;
1285   ASM_MESON_TAC[ARITH_RULE `n <=| n+n'+n''`;euclid_updim];
1286   SUBGOAL_TAC `(euclid (n+n'+n'') g)`;
1287   ASM_MESON_TAC[ARITH_RULE `n' <=| n+n'+n''`;euclid_updim];
1288   SUBGOAL_TAC `(euclid (n+n'+n'') h)`;
1289   ASM_MESON_TAC[ARITH_RULE `n'' <=| n+n'+n''`;euclid_updim];
1290   MESON_TAC[dot_minus_linear];
1291 ]);;
1292
1293 (* }}} *)
1294
1295 let dot_linear2 = prove_by_refinement(
1296   `!n f g h. (euclid n f) /\ (euclid n g) /\ (euclid n h) ==>
1297     ((dot h (f + g)) = (dot h f) +. (dot h g))`,
1298 (* {{{ *)
1299
1300   [
1301   REPEAT GEN_TAC;
1302   ONCE_REWRITE_TAC[dot_comm];
1303   MESON_TAC[dot_linear]
1304   ]);;
1305
1306 (* }}} *)
1307
1308 let dot_linear2_euclidean = prove_by_refinement(
1309   `!f g h. (euclidean f) /\ (euclidean g) /\ (euclidean h) ==>
1310     ((dot h (f + g)) = (dot h f) +. (dot h g))`,
1311 (* {{{ *)
1312   [
1313   REPEAT GEN_TAC;
1314   ONCE_REWRITE_TAC[dot_comm];
1315   MESON_TAC[dot_linear_euclidean]
1316   ]);;
1317 (* }}} *)
1318
1319 let dot_minus_linear2 = prove_by_refinement(
1320   `!n f g h. (euclid n f) /\ (euclid n g) /\ (euclid n h) ==>
1321     ((dot h (f - g)) = (dot h f) -. (dot h g))`,
1322 (* {{{ *)
1323
1324   [
1325   REPEAT GEN_TAC;
1326   ONCE_REWRITE_TAC[dot_comm];
1327   MESON_TAC[dot_minus_linear]
1328   ]);;
1329
1330 (* }}} *)
1331
1332 let dot_minus_linear2_euclidean = prove_by_refinement(
1333   `!f g h. (euclidean f) /\ (euclidean g) /\ (euclidean h) ==>
1334     ((dot h (f - g)) = (dot h f) -. (dot h g))`,
1335 (* {{{ *)
1336
1337   [
1338   REPEAT GEN_TAC;
1339   ONCE_REWRITE_TAC[dot_comm];
1340   MESON_TAC[dot_minus_linear_euclidean]
1341   ]);;
1342
1343 (* }}} *)
1344
1345 let dot_rzero = prove_by_refinement(
1346   `!f. (dot f euclid0) = &.0`,
1347 (* {{{ *)
1348    [
1349      REWRITE_TAC[dot;euclid0];
1350      LET_TAC;
1351      GEN_TAC;
1352      SUBGOAL_THEN `(\ (i:num). (f i *. (&.0))) = (\ (r:num). (&.0))` (fun t -> REWRITE_TAC[t]);
1353    REWRITE_TAC[REAL_ARITH `a*.(&.0) = (&.0)`];
1354    MESON_TAC[SUM_0];
1355    ]);;
1356 (* }}} *)
1357
1358 let dot_lzero = prove_by_refinement(
1359    `!f. (dot euclid0 f ) = &.0`,
1360 (* {{{ *)
1361    [
1362    ONCE_REWRITE_TAC[dot_comm];
1363    REWRITE_TAC[dot_rzero];
1364    ]);;
1365 (* }}} *)
1366
1367 let dot_zero = prove_by_refinement(
1368   `!f n. (euclid n f) /\ (dot f f = (&.0)) ==> (f = euclid0)`,
1369 (* {{{ *)
1370    [
1371    DISCH_ALL_TAC;
1372    UNDISCH_TAC `dot f f = (&.0)`;
1373    MP_TAC (SPECL [`n:num`;`f:num->real`;`f:num->real`] dot_euclid);
1374    ASM_REWRITE_TAC[];
1375    DISCH_THEN (fun th -> REWRITE_TAC[th]);
1376    REWRITE_TAC[euclid0];
1377    DISCH_TAC;
1378    MATCH_MP_TAC EQ_EXT;
1379    GEN_TAC THEN BETA_TAC;
1380    DISJ_CASES_TAC (ARITH_RULE `x <| n \/ (n <=| x)`);
1381    CLEAN_ASSUME_TAC (ARITH_RULE `(x <|n) ==> (SUC x <=| n)`);
1382    CLEAN_THEN (SPECL [`SUC x`;`n:num`] LE_EXISTS) CHOOSE_TAC;
1383    UNDISCH_TAC `sum(0,n) (\ (i:num). f i *. f i) = (&.0)`;
1384    ASM_REWRITE_TAC[];
1385    REWRITE_TAC[GSYM SUM_TWO;sum;ARITH_RULE `0+| x = x`];
1386    SUBGOAL_TAC `!a b. (&.0 <=. sum(a,b) (\ (i:num). f i *. f i))`;
1387    REPEAT GEN_TAC;
1388    MP_TAC (SPEC `\ (i:num). f i *. f i` SUM_POS);
1389    BETA_TAC;
1390    REWRITE_TAC[REAL_LE_SQUARE];
1391    MESON_TAC[];
1392    DISCH_ALL_TAC;
1393    IMP_RES_THEN MP_TAC (REAL_ARITH `(a+.b = &.0) ==> ((&.0 <=. b) ==> (a <=. (&.0)))`);
1394    ASM_REWRITE_TAC[];
1395    DISCH_TAC;
1396    IMP_RES_THEN MP_TAC (REAL_ARITH `(a+b <=. &.0) ==> ((&.0 <=. a) ==> (b <=. (&.0)))`);
1397    ASM_REWRITE_TAC[];
1398    ABBREV_TAC `a = (f:num->real) x`;
1399    MESON_TAC[REAL_LE_SQUARE;REAL_ARITH `a <=. (&.0) /\ (&.0 <=. a) ==> (a = (&.0))`;REAL_ENTIRE];
1400    UNDISCH_TAC `euclid n f`;
1401    REWRITE_TAC[euclid];
1402    ASM_MESON_TAC[];
1403    ]);;
1404 (* }}} *)
1405
1406 let dot_zero_euclidean = prove_by_refinement(
1407   `!f. (euclidean f) /\ (dot f f = (&.0)) ==> (f = euclid0)`,
1408 (* {{{ *)
1409    [
1410    REWRITE_TAC[euclidean];
1411    DISCH_ALL_TAC;
1412    UNDISCH_FIND_THEN `euclid` CHOOSE_TAC;
1413    ASM_MESON_TAC[dot_zero];
1414    ]);;
1415 (* }}} *)
1416
1417 (* norm *)
1418
1419 let norm_nonneg = prove_by_refinement(
1420    `!f. (&.0 <=. norm f)`,
1421 (* {{{ *)
1422    [
1423    REWRITE_TAC[norm];
1424    ONCE_REWRITE_TAC[GSYM SQRT_0];
1425    GEN_TAC;
1426    MATCH_MP_TAC SQRT_MONO_LE;
1427    REWRITE_TAC[dot_nonneg];
1428    REAL_ARITH_TAC;
1429    ]);;
1430 (* }}} *)
1431
1432 let norm_neg = prove_by_refinement(
1433   `!f. norm (--f) = norm f`,
1434 (* {{{ *)
1435
1436   [
1437   REWRITE_TAC[norm;dot_neg;dot_neg2];
1438   REWRITE_TAC[REAL_ARITH `--(--. x) = x`];
1439   ]);;
1440
1441 (* }}} *)
1442
1443 let cauchy_schwartz = prove_by_refinement(
1444   `!f g. (euclidean f) /\ (euclidean g) ==>
1445    ((abs(dot f g)) <=. (norm f)*. (norm g))`,
1446 (* {{{ *)
1447   [
1448   DISCH_ALL_TAC;
1449   DISJ_CASES_TAC (TAUT `(f = euclid0 ) \/ ~(f = euclid0)`);
1450   ASM_REWRITE_TAC[dot_lzero;norm;SQRT_0;REAL_ARITH`&.0 *. x = (&.0)`];
1451   REWRITE_TAC[ABS_0;REAL_ARITH `x <=. x`];
1452   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;
1453   REPEAT GEN_TAC;
1454   ASM_SIMP_TAC[euclidean_scale_closure;euclidean_add_closure;dot_linear_euclidean;dot_linear2_euclidean;dot_scale_euclidean;dot_scale2_euclidean];
1455   REWRITE_TAC[REAL_MUL_AC;REAL_ADD_AC;REAL_ADD_LDISTRIB];
1456   MATCH_MP_TAC (REAL_ARITH`(b+. c=e) ==> (a+b+c+d = a+ e+d)`);
1457   REWRITE_TAC[GSYM REAL_LDISTRIB];
1458   REPEAT AP_TERM_TAC;
1459   MATCH_MP_TAC (REAL_ARITH `(a=b)==> (a+.b = a*(&.2))`);
1460   REWRITE_TAC[dot_comm];
1461   FIRST_ASSUM (fun th -> ASSUME_TAC (SPECL[` --. (dot f g)`;`dot f f`] th));
1462   CLEAN_THEN (SPEC `(--.(dot f g)) *# f + (dot f f)*# g` dot_nonneg) ASSUME_TAC;
1463   REWRITE_TAC[norm];
1464   ASSUME_TAC(SPEC `f:num->real` dot_nonneg);
1465   ASSUME_TAC(SPEC `g:num->real` dot_nonneg);
1466   ASM_SIMP_TAC[GSYM SQRT_MUL];
1467   REWRITE_TAC[GSYM POW_2_SQRT_ABS;POW_2];
1468   MATCH_MP_TAC SQRT_MONO_LE;
1469   REWRITE_TAC[REAL_LE_SQUARE];
1470   SUBGOAL_TAC `&.0 <. dot f f`;
1471   MATCH_MP_TAC (REAL_ARITH `~(x = &.0) /\ (&.0 <=. x) ==> (&.0 <. x)`);
1472   ASM_REWRITE_TAC[];
1473   ASM_MESON_TAC[dot_zero_euclidean];
1474   REPEAT (UNDISCH_FIND_TAC `(<=.)` );
1475   ABBREV_TAC `a = dot f f`;
1476   ABBREV_TAC `b = dot f g`;
1477   ABBREV_TAC `c = dot g g`;
1478   POP_ASSUM_LIST (fun t -> ALL_TAC);
1479   REWRITE_TAC[REAL_ARITH `(&.2 *. x = x + x)`;REAL_ADD_AC];
1480   REWRITE_TAC[REAL_ARITH `(a *. ((--. b)*.c) = --. (a *. (b*.c)))/\ (--. ((--. a) *. b) = a *.b )`];
1481   REWRITE_TAC[REAL_ARITH `(--. b) *. a*. b + b*.b*.a = (&.0)`];
1482   REWRITE_TAC[REAL_ARITH `x +. (&.0) = x`];
1483   REWRITE_TAC[REAL_ARITH `(&.0 <=. (a*.a*.c +. (--.b)*.a*.b)) <=> (a*b*b <=. a*a*c)`];
1484   DISCH_ALL_TAC;
1485   MATCH_MP_TAC (SPEC `a:real` REAL_LE_LCANCEL_IMP);
1486   ASM_REWRITE_TAC[];
1487   ]);;
1488 (* }}} *)
1489
1490 let norm_dot = prove_by_refinement(
1491   `!h. norm(h) * norm(h) = (dot h h)`,
1492 (* {{{ *)
1493   [
1494   REWRITE_TAC[norm];
1495   ONCE_REWRITE_TAC[GSYM POW_2];
1496   REWRITE_TAC[SQRT_POW2;dot_nonneg];
1497   ]);;
1498 (* }}} *)
1499
1500 let norm_triangle = prove_by_refinement(
1501   `!f g. (euclidean f) /\ (euclidean g) ==>
1502     (norm (f+g) <=. norm(f) + norm(g))`,
1503 (* {{{ *)
1504   [
1505   DISCH_ALL_TAC;
1506   MATCH_MP_TAC square_le;
1507   REWRITE_TAC[norm_nonneg];
1508   CONJ_TAC;
1509   MATCH_MP_TAC (REAL_ARITH `(&.0 <=. x) /\ (&.0 <=. y) ==> (&.0 <= x+y)`);
1510   REWRITE_TAC[norm_nonneg];
1511   REWRITE_TAC[REAL_ADD_LDISTRIB;REAL_ADD_RDISTRIB;REAL_ADD_AC];
1512   REWRITE_TAC[norm_dot];
1513 ASM_SIMP_TAC[euclidean_add_closure;dot_linear_euclidean;dot_linear2_euclidean];
1514   REWRITE_TAC[REAL_MUL_AC];
1515   REWRITE_TAC[REAL_ADD_AC];
1516   MATCH_MP_TAC (REAL_ARITH `(b<=.c)==>((a+.b) <=. (a+c))`);
1517   MATCH_MP_TAC (REAL_ARITH `(a=b)/\ (a<=. e) ==>((a+b+c) <= (c+e+e))`);
1518   CONJ_TAC;
1519   REWRITE_TAC[dot_comm];
1520   ASM_MESON_TAC[cauchy_schwartz;REAL_LE_TRANS;REAL_ARITH `x <=. ||. x`];
1521   ]);;
1522 (* }}} *)
1523
1524
1525
1526 (* ------------------------------------------------------------------ *)
1527 (* Metric Space *)
1528 (* ------------------------------------------------------------------ *)
1529
1530 let metric_space_zero = prove_by_refinement(
1531  `!(X:A->bool) d a. (metric_space(X,d) /\ (X a) ==> (d a a = (&.0)))`,
1532 (* {{{ *)
1533   [MESON_TAC[metric_space]
1534   ]);;
1535 (* }}} *)
1536
1537 let metric_space_symm = prove_by_refinement(
1538  `!(X:A->bool) d a b. (metric_space(X,d) /\ (X a) /\ (X b) ==>
1539    (d a b = d b a))`,
1540 (* {{{ *)
1541   [
1542   MESON_TAC[metric_space];
1543   ]);;
1544 (* }}} *)
1545
1546 let metric_space_triangle = prove_by_refinement(
1547  `!(X:A->bool) d a b c. (metric_space(X,d) /\ (X a) /\ (X b) /\ (X c)
1548    ==> (d a c <=. d a b +. d b c))`,
1549 (* {{{ *)
1550   [
1551   MESON_TAC[metric_space];
1552   ]);;
1553 (* }}} *)
1554
1555 let metric_subspace = prove_by_refinement(
1556   `!X Y d. (Y SUBSET (X:A->bool)) /\ (metric_space (X,d)) ==>
1557     (metric_space (Y,d))`,
1558 (* {{{ *)
1559   [
1560   REWRITE_TAC[SUBSET;metric_space;IN];
1561   DISCH_ALL_TAC;
1562   DISCH_ALL_TAC;
1563   UNDISCH_FIND_THEN `( /\ )` (fun t -> MP_TAC (SPECL[`x:A`;`y:A`;`z:A`] t));
1564   ASM_SIMP_TAC[];
1565   ]);;
1566 (* }}} *)
1567
1568 let metric_euclidean = prove_by_refinement(
1569   `metric_space (euclidean,d_euclid)`,
1570 (* {{{ *)
1571   [
1572   REWRITE_TAC[metric_space;d_euclid];
1573   DISCH_ALL_TAC;
1574   CONJ_TAC;
1575   REWRITE_TAC[norm_nonneg];
1576   CONJ_TAC;
1577   EQ_TAC;
1578   REWRITE_TAC[norm];
1579   ONCE_REWRITE_TAC[REAL_ARITH `(&.0 = x) <=> (x = (&.0))`];
1580   ASM_SIMP_TAC[dot_nonneg;SQRT_EQ_0];
1581   DISCH_TAC;
1582   SUBGOAL_TAC `x - y = euclid0`;
1583   ASM_MESON_TAC[dot_zero_euclidean;euclidean_sub_closure];
1584   REWRITE_TAC[euclid_minus;euclid0];
1585   DISCH_TAC THEN (MATCH_MP_TAC EQ_EXT);
1586   X_GEN_TAC `n:num`;
1587   FIRST_ASSUM  (fun t -> ASSUME_TAC (BETA_RULE (AP_THM t `n:num`)));
1588   ASM_MESON_TAC [REAL_ARITH `(a = b) <=> (a-.b = (&.0))`];
1589   DISCH_THEN (fun t->REWRITE_TAC[t]);
1590   SUBGOAL_THEN `(y:num->real) - y = euclid0` (fun t-> REWRITE_TAC[t]);
1591   REWRITE_TAC[euclid0;euclid_minus];
1592   MATCH_MP_TAC EQ_EXT;
1593   GEN_TAC THEN BETA_TAC;
1594   REAL_ARITH_TAC;
1595   REWRITE_TAC[norm;dot_lzero;SQRT_0];
1596   CONJ_TAC;
1597   SUBGOAL_THEN `x - y = (euclid_neg (y-x))` ASSUME_TAC;
1598   REWRITE_TAC[euclid_neg;euclid_minus];
1599   MATCH_MP_TAC EQ_EXT THEN GEN_TAC THEN BETA_TAC;
1600   REAL_ARITH_TAC;
1601   ASM_MESON_TAC[norm_neg];
1602   SUBGOAL_THEN `(x-z) = euclid_plus(x - y)  (y-z)` (fun t -> REWRITE_TAC[t]);
1603   REWRITE_TAC[euclid_plus;euclid_minus];
1604   MATCH_MP_TAC EQ_EXT THEN GEN_TAC THEN BETA_TAC THEN REAL_ARITH_TAC;
1605   ASM_SIMP_TAC[norm_triangle;euclidean_sub_closure;euclidean_sub_closure];
1606   ]);;
1607 (* }}} *)
1608
1609 let metric_euclid = prove_by_refinement(
1610   `!n. metric_space (euclid n,d_euclid)`,
1611 (* {{{ *)
1612   [
1613   GEN_TAC;
1614   MATCH_MP_TAC (ISPEC `euclidean` metric_subspace);
1615   REWRITE_TAC[metric_euclidean;SUBSET;IN];
1616   MESON_TAC[euclidean];
1617   ]);;
1618 (* }}} *)
1619
1620 let euclid1_abs = prove_by_refinement(
1621   `!x y. (euclid 1 x) /\ (euclid 1 y) ==>
1622      ((d_euclid x y) = (abs ((x 0) -. (y 0))))`,
1623   (* {{{ proof *)
1624   [
1625   REWRITE_TAC[d_euclid;norm];
1626   DISCH_ALL_TAC;
1627   SUBGOAL_TAC `euclid 1 (x - y)`;
1628   ASM_MESON_TAC[euclid_sub_closure];
1629   DISCH_TAC;
1630   ASSUME_TAC (prove(`1 <= 1`,ARITH_TAC));
1631   MP_TAC (SPECL[`(x-y):num->real`;`(x-y):num->real`;`1`;`1`] dot_updim);
1632   ASM_REWRITE_TAC[];
1633   DISCH_THEN (fun t-> REWRITE_TAC[t]);
1634   REWRITE_TAC[prove(`1 = SUC 0`,ARITH_TAC)];
1635   REWRITE_TAC[sum];
1636   REWRITE_TAC[REAL_ARITH `&.0 + x = x`];
1637   REWRITE_TAC[ARITH_RULE `0 +| 0 = 0`];
1638   REWRITE_TAC[euclid_minus];
1639   ASM_MESON_TAC[REAL_POW_2;POW_2_SQRT_ABS];
1640   ]);;
1641   (* }}} *)
1642
1643 let coord_dirac = prove_by_refinement(
1644   `!i t. coord i (t *# dirac_delta i ) = t`,
1645   (* {{{ proof *)
1646
1647   [
1648   REWRITE_TAC[coord;dirac_delta;euclid_scale];
1649   ARITH_TAC;
1650   ]);;
1651
1652   (* }}} *)
1653
1654 let dirac_0 = prove_by_refinement(
1655   `!x. (x *# dirac_delta 0) 0 = x`,
1656   (* {{{ proof *)
1657   [
1658   GEN_TAC;
1659   REWRITE_TAC[dirac_delta;euclid_scale;];
1660   REDUCE_TAC;
1661   ]);;
1662   (* }}} *)
1663
1664 let euclid1_dirac = prove_by_refinement(
1665   `!x. euclid 1 x <=> (x = (x 0) *# (dirac_delta 0))`,
1666   (* {{{ proof *)
1667   [
1668   DISCH_ALL_TAC;
1669   REWRITE_TAC[euclid; euclid_scale;dirac_delta ];
1670   EQ_TAC;
1671   DISCH_ALL_TAC;
1672   IMATCH_MP_TAC  EQ_EXT;
1673   X_GEN_TAC `n:num`;
1674   BETA_TAC;
1675   COND_CASES_TAC;
1676   REDUCE_TAC;
1677   ASM_REWRITE_TAC[];
1678   REDUCE_TAC;
1679   ASM_SIMP_TAC[ARITH_RULE  `(~(0=m))==>(1<=| m)`];
1680   DISCH_ALL_TAC;
1681   DISCH_ALL_TAC;
1682   USE 1 (MATCH_MP (ARITH_RULE `1<= m ==> (~(0=m))`));
1683   ASM ONCE_REWRITE_TAC[];
1684   ASM_REWRITE_TAC[];
1685   REDUCE_TAC ;
1686   ]);;
1687   (* }}} *)
1688
1689 (* projection onto the ith coordinate, as a euclidean vector *)
1690 let proj = euclid_def
1691   `proj i x = (\j. (if (j=0) then (x (i:num)) else (&.0)))`;;
1692
1693 let proj_euclid1 = prove_by_refinement(
1694   `!i x. euclid 1 (proj i x)`,
1695   (* {{{ proof *)
1696   [
1697   REWRITE_TAC[proj;euclid];
1698   REPEAT GEN_TAC;
1699   COND_CASES_TAC;
1700   ASM_REWRITE_TAC[];
1701   ARITH_TAC;
1702   ARITH_TAC;
1703   ]);;
1704   (* }}} *)
1705
1706 let d_euclid_n = prove_by_refinement(
1707   `!n x y. ((euclid n x) /\ (euclid n y)) ==> ((d_euclid x y) =
1708      sqrt(sum (0,n) (\i. (x i - y i) * (x i - y i))))`,
1709   (* {{{ proof *)
1710
1711   [
1712   REPEAT GEN_TAC;
1713   REWRITE_TAC[d_euclid;norm];
1714   DISCH_ALL_TAC;
1715   ASSUME_TAC (ARITH_RULE `n <=| n`);
1716   SUBGOAL_TAC `euclid n (x - y)`;
1717   ASM_SIMP_TAC[euclid_sub_closure];
1718   DISCH_TAC;
1719   CLEAN_ASSUME_TAC (SPECL[`(x-y):num->real`;`(x-y):num->real`;`n:num`;`n:num`]dot_updim);
1720   ASM_REWRITE_TAC[euclid_minus];
1721   ]);;
1722
1723   (* }}} *)
1724
1725 let norm_n = prove_by_refinement(
1726   `!n x. ((euclid n x) ) ==> ((norm x) =
1727      sqrt(sum (0,n) (\i. (x i ) * (x i ))))`,
1728   (* {{{ proof *)
1729   [
1730   REPEAT GEN_TAC;
1731   TYPEL_THEN [`x`;`x`;`n`;`n`] (fun t-> SIMP_TAC  [norm;ISPECL t dot_updim;ARITH_RULE `n <=| n`;]);
1732   ]);;
1733   (* }}} *)
1734
1735 let proj_d_euclid = prove_by_refinement(
1736   `!i x y. d_euclid (proj i x) (proj i y) = abs (x i -. y i)`,
1737   (* {{{ proof *)
1738   [
1739   REPEAT GEN_TAC;
1740   SIMP_TAC[SPEC `1` d_euclid_n;proj_euclid1];
1741   REWRITE_TAC[ARITH_RULE `1 = SUC 0`;sum];
1742   NUM_REDUCE_TAC;
1743   REWRITE_TAC[proj];
1744   REWRITE_TAC[REAL_ARITH `&.0 + x = x`];
1745   MESON_TAC[POW_2_SQRT_ABS;REAL_POW_2];
1746   ]);;
1747   (* }}} *)
1748
1749 let d_euclid_pos = prove_by_refinement(
1750   `!x y n. (euclid n x) /\ (euclid n y) ==> (&.0 <=. d_euclid x y)`,
1751   (* {{{ proof *)
1752   [
1753   DISCH_ALL_TAC;
1754   MP_TAC metric_euclid;
1755   REWRITE_TAC[metric_space;euclidean];
1756   ASM_MESON_TAC[];
1757   ]);;
1758   (* }}} *)
1759
1760 let proj_contraction = prove_by_refinement(
1761   `!n x y i. (euclid n x) /\ (euclid n y) ==>
1762      abs (x i - (y i)) <=. d_euclid x y`,
1763   (* {{{ proof *)
1764   [
1765   DISCH_ALL_TAC;
1766   MATCH_MP_TAC REAL_POW_2_LE;
1767   REWRITE_TAC[REAL_ABS_POS];
1768   CONJ_TAC;
1769   ASM_MESON_TAC[d_euclid_pos];
1770   ASM_SIMP_TAC[SPEC `n:num` d_euclid_n];
1771   REWRITE_TAC[REAL_POW2_ABS];
1772   SUBGOAL_TAC `euclid n (x - y)`; (* why does MESON fail here??? *)
1773   MATCH_MP_TAC euclid_sub_closure;
1774   ASM_MESON_TAC[];
1775   DISCH_TAC;
1776   SUBGOAL_TAC `&.0 <=. sum (0,n) (\i. (x i - y i)*. (x i - y i))`;
1777   MATCH_MP_TAC SUM_POS_GEN;
1778   DISCH_ALL_TAC THEN BETA_TAC;
1779   REWRITE_TAC[REAL_LE_SQUARE];
1780   SIMP_TAC[SQRT_POW_2];
1781   DISCH_TAC;
1782   ASM_CASES_TAC `n <=| i`;
1783   MATCH_MP_TAC (REAL_ARITH `(x = (&.0)) /\ (&.0 <=. y) ==> (x <=. y)`);
1784   ASM_REWRITE_TAC[];
1785   REWRITE_TAC[REAL_PROP_ZERO_POW];
1786   NUM_REDUCE_TAC;
1787   ASM_MESON_TAC[euclid;euclid_minus];
1788   MP_TAC (ARITH_RULE `~(n <=| i) ==> (i < n) /\ (n = (SUC i) + (n-i-1))`);
1789   ASM_REWRITE_TAC[] THEN DISCH_ALL_TAC;
1790   ASM ONCE_REWRITE_TAC[];
1791   REWRITE_TAC[GSYM SUM_TWO];
1792   MATCH_MP_TAC (REAL_ARITH `(a <=. b) /\ (&.0 <=. c)   ==> (a <=. (b +c))`);
1793   CONJ_TAC;
1794   REWRITE_TAC[sum_DEF];
1795   REWRITE_TAC[ARITH_RULE `0 +| i = i`];
1796   MATCH_MP_TAC (REAL_ARITH `(a = c) /\ (&.0 <=. b) ==> (a <=. b+c)`);
1797   REWRITE_TAC[REAL_POW_2];
1798   MP_TAC (SPECL [`0:num`;`i:num`;`(x:num->real)- y`] REAL_SUM_SQUARE_POS);
1799   BETA_TAC;
1800   REWRITE_TAC[euclid_minus];
1801   MP_TAC (SPECL [`SUC i`;`(n:num)-i-1`;`(x:num->real)- y`] REAL_SUM_SQUARE_POS);
1802   BETA_TAC;
1803   REWRITE_TAC[euclid_minus];
1804   ]);;
1805   (* }}} *)
1806
1807 let euclid_dirac = prove_by_refinement(
1808   `!x. (euclid 1 (x *# (dirac_delta 0)))`,
1809   (* {{{ proof *)
1810   [
1811   REWRITE_TAC[euclid;dirac_delta ;euclid_scale];
1812   DISCH_ALL_TAC;
1813   USE 0 (MATCH_MP (ARITH_RULE  `1 <=| m ==> (~(0=m))`));
1814   ASM_REWRITE_TAC[];
1815   REDUCE_TAC;
1816   ]);;
1817   (* }}} *)
1818
1819 let d_euclid_pow2 = prove_by_refinement(
1820   `!n x y. (euclid n x) /\ (euclid n y) ==>
1821      ((d_euclid x y) pow 2 = sum (0,n) (\i. (x i - y i) * (x i - y i)))`,
1822   (* {{{ proof *)
1823   [
1824   DISCH_ALL_TAC;
1825   ASM_SIMP_TAC[d_euclid_n];
1826   REWRITE_TAC[SQRT_POW2];
1827   MATCH_MP_TAC SUM_POS_GEN;
1828   BETA_TAC;
1829   REDUCE_TAC;
1830   ]);;
1831   (* }}} *)
1832
1833 let D_EUCLID_BOUND = prove_by_refinement(
1834   `!n x y eps. ((euclid n x) /\ (euclid n y) /\
1835      (!i. (abs (x i -. y i) <=. eps))) ==>
1836     ( d_euclid x y <=. sqrt(&.n)*. eps )`,
1837   (* {{{ proof *)
1838
1839   [
1840   DISCH_ALL_TAC;
1841   SQUARE_TAC;
1842   SUBCONJ_TAC;
1843   JOIN 0 1;
1844   USE 0 (MATCH_MP d_euclid_pos);
1845   ASM_REWRITE_TAC[];
1846   DISCH_TAC;
1847   WITH 2 (SPEC `0`);
1848   USE 4 (MATCH_MP (REAL_ARITH `abs (x) <=. eps ==> &.0 <=. eps`));
1849   SUBCONJ_TAC;
1850   ALL_TAC;
1851   REWRITE_TAC[REAL_MUL_NN];
1852   DISJ1_TAC;
1853   CONJ_TAC;
1854   MATCH_MP_TAC SQRT_POS_LE ;
1855   REDUCE_TAC;
1856   ASM_REWRITE_TAC[];
1857   DISCH_TAC;
1858   ASM_SIMP_TAC[d_euclid_pow2];
1859   SUBGOAL_TAC `!i. ((x:num->real) i -. y i) *. (x i -. y i) <=. eps* eps`;
1860   GEN_TAC;
1861   ALL_TAC;
1862   USE 2 (SPEC `i:num`);
1863   ABBREV_TAC `t = x i - (y:num->real) i`;
1864   UND 2;
1865   REWRITE_TAC[ABS_SQUARE_LE];
1866   REWRITE_TAC[REAL_POW_MUL];
1867   ASSUME_TAC (REWRITE_RULE[] ((REDUCE_CONV `&.0 <= &.n`)));
1868   USE 6 (REWRITE_RULE[GSYM SQRT_POW2]);
1869   ASM_REWRITE_TAC[];
1870   DISCH_TAC;
1871   ALL_TAC;
1872   MATCH_MP_TAC SUM_BOUND;
1873   GEN_TAC;
1874   DISCH_TAC;
1875   BETA_TAC;
1876   REWRITE_TAC[POW_2];
1877   ASM_MESON_TAC[];
1878   ]);;
1879
1880   (* }}} *)
1881
1882 let metric_translate = prove_by_refinement(
1883   `!n x y z . (euclid n x) /\ (euclid n y) /\ (euclid n z) ==>
1884    (d_euclid (x + z) (y + z) = d_euclid x y)`,
1885   (* {{{ proof *)
1886
1887   [
1888   REWRITE_TAC[d_euclid;norm];
1889   DISCH_ALL_TAC;
1890   TYPE_THEN `euclid n (euclid_minus x y)` SUBGOAL_TAC;
1891   ASM_SIMP_TAC[euclid_sub_closure];
1892   DISCH_TAC;
1893   TYPE_THEN `euclid n (euclid_minus (euclid_plus x z) (euclid_plus y z))` SUBGOAL_TAC;
1894   ASM_SIMP_TAC[euclid_sub_closure; euclid_add_closure];
1895   DISCH_ALL_TAC;
1896   ASM_SIMP_TAC[SPEC `n:num` dot_euclid];
1897   TYPE_THEN `(x + z) - (y + z) = ((x:num->real) - y)` SUBGOAL_TAC;
1898   IMATCH_MP_TAC  EQ_EXT;
1899   X_GEN_TAC `i:num`;
1900   REWRITE_TAC[euclid_minus;euclid_plus];
1901   REAL_ARITH_TAC;
1902   DISCH_THEN (fun t-> REWRITE_TAC[t]);
1903   ]);;
1904
1905   (* }}} *)
1906
1907 let metric_translate_LEFT = prove_by_refinement(
1908   `!n x y z . (euclid n x) /\ (euclid n y) /\ (euclid n z) ==>
1909    (d_euclid (z + x ) (z + y) = d_euclid x y)`,
1910   (* {{{ proof *)
1911
1912   [
1913   REWRITE_TAC[d_euclid;norm];
1914   DISCH_ALL_TAC;
1915   TYPE_THEN `euclid n (euclid_minus x y)` SUBGOAL_TAC;
1916   ASM_SIMP_TAC[euclid_sub_closure];
1917   DISCH_TAC;
1918   TYPE_THEN `euclid n (euclid_minus (euclid_plus z x) (euclid_plus z y))` SUBGOAL_TAC;
1919   ASM_SIMP_TAC[euclid_sub_closure; euclid_add_closure];
1920   DISCH_ALL_TAC;
1921   ASM_SIMP_TAC[SPEC `n:num` dot_euclid];
1922   TYPE_THEN `(z + x) - (z + y) = ((x:num->real) - y)` SUBGOAL_TAC;
1923   IMATCH_MP_TAC  EQ_EXT;
1924   X_GEN_TAC `i:num`;
1925   REWRITE_TAC[euclid_minus;euclid_plus];
1926   REAL_ARITH_TAC;
1927   DISCH_THEN (fun t-> REWRITE_TAC[t]);
1928   ]);;
1929
1930   (* }}} *)
1931
1932 let norm_scale = prove_by_refinement(
1933   `!t t' x . (euclidean x) ==>
1934    (d_euclid (t *# x) (t' *# x) =
1935         ||. (t - t') * norm(x))`,
1936   (* {{{ proof *)
1937
1938   [
1939   REWRITE_TAC[euclidean];
1940   LEFT_TAC "n";
1941   DISCH_ALL_TAC;
1942   ASM_SIMP_TAC[d_euclid_n;norm_n;euclid_scale_closure;euclid_scale;GSYM REAL_SUB_RDISTRIB;REAL_MUL_AC;];
1943   REWRITE_TAC[GSYM REAL_POW_2   ];
1944   REWRITE_TAC[REAL_ARITH `a * a * b = b * (a * a)`;SUM_CMUL;];
1945   ASM_SIMP_TAC[SQRT_MUL;REAL_SUM_SQUARE_POS;REAL_LE_SQUARE_POW;POW_2_SQRT_ABS  ];
1946   REWRITE_TAC[REAL_POW_2];
1947   ]);;
1948
1949   (* }}} *)
1950
1951 let norm_scale_vec = prove_by_refinement(
1952   `!n t x x' . (euclid n x) /\ (euclid n x') ==>
1953    (d_euclid (t *# x) (t *# x') = ||. t * d_euclid x x')`,
1954   (* {{{ proof *)
1955
1956   [
1957   DISCH_ALL_TAC;
1958   ASM_SIMP_TAC[d_euclid_n;norm_n;euclid_scale_closure;euclid_scale;GSYM REAL_SUB_LDISTRIB;REAL_MUL_AC;];
1959   REWRITE_TAC[REAL_ARITH `t*t*b = (t*t)*b`];
1960   REWRITE_TAC[GSYM REAL_POW_2 ;SUM_CMUL   ];
1961   GEN_REWRITE_TAC (LAND_CONV o RAND_CONV o RAND_CONV o ONCE_DEPTH_CONV) [REAL_POW_2];
1962   ASM_SIMP_TAC[SQRT_MUL;REAL_SUM_SQUARE_POS;REAL_LE_SQUARE_POW;POW_2_SQRT_ABS  ];
1963   REWRITE_TAC[REAL_POW_2];
1964     ]);;
1965
1966   (* }}} *)
1967
1968
1969 (* ------------------------------------------------------------------ *)
1970 (* Topological Spaces *)
1971 (* ------------------------------------------------------------------ *)
1972
1973
1974 (* Definitions *)
1975 (* underscore is necessary to avoid Harrison's global "topology" *)
1976 (* carrier of topology is UNIONS U *)
1977
1978 let topology = euclid_def `topology_ (U:(A->bool)->bool) <=>
1979   (!A B V.  (U EMPTY) /\
1980       ((U A) /\ (U B) ==> (U (A INTER B))) /\
1981       ((V SUBSET U) ==> (U (UNIONS V))))`;;
1982
1983 let open_DEF = euclid_def `open_ (U:(A->bool)->bool) A = (U A)`;;
1984
1985 let closed = euclid_def `closed_ (U:(A->bool)->bool) B <=>
1986     (B SUBSET (UNIONS U)) /\
1987     (open_ U ((UNIONS U) DIFF B))`;;
1988
1989 let closure = euclid_def `closure (U:(A->bool)->bool) A =
1990     INTERS { B | (closed_ U B) /\ (A SUBSET B) }`;;
1991
1992 let induced_top  = euclid_def `induced_top U (A:A->bool) =
1993   IMAGE ( \B. (B INTER A)) U`;;
1994
1995 let open_ball = euclid_def
1996   `open_ball(X,d) (x:A) r = { y | (X x) /\ (X y) /\ (d x y <. r) }`;;
1997
1998 let closed_ball =euclid_def
1999   `closed_ball (X,d) (x:A) r = { y | (X x) /\ (X y) /\ (d x y <=. r) }`;;
2000
2001 let open_balls = euclid_def
2002   `open_balls (X,d) = { B | ?(x:A) r. B = open_ball (X,d) x r}`;;
2003
2004 let top_of_metric = euclid_def
2005   `top_of_metric ((X:A->bool),d) =
2006       { A | ?F. (F SUBSET (open_balls (X,d)))/\
2007      (A = UNIONS F) }`;;
2008
2009 (* basic properties *)
2010
2011 let open_EMPTY = prove_by_refinement(
2012   `!(U:(A->bool)->bool). (topology_ U ==> open_ U EMPTY)`,
2013   (* {{{ proof *)
2014   [
2015   REWRITE_TAC[topology;open_DEF];
2016   MESON_TAC[];
2017   ]);;
2018   (* }}} *)
2019
2020 let open_closed = prove_by_refinement(
2021   `!U A. (topology_ (U:(A->bool)->bool)) /\ (open_ U A) ==>
2022      (closed_ U ((UNIONS U) DIFF A))`,
2023   (* {{{ proof *)
2024   [
2025   REWRITE_TAC[closed;open_DEF];
2026   DISCH_ALL_TAC;
2027   SUBGOAL_THEN `(A:A->bool) SUBSET (UNIONS U)` ASSUME_TAC;
2028   ASM_MESON_TAC[sub_union];
2029   ASM_SIMP_TAC[DIFF_DIFF2];
2030   REWRITE_TAC[SUBSET_DIFF];
2031   ]);;
2032 (* }}} *)
2033
2034 let closed_UNIV = prove_by_refinement(
2035   `!(U:(A->bool)->bool). (topology_ U ==> closed_ U (UNIONS U))`,
2036   (* {{{ proof *)
2037
2038   [
2039   DISCH_ALL_TAC;
2040   ASM_SIMP_TAC[open_closed];
2041   REWRITE_TAC[closed;open_DEF];
2042   TYPE_THEN `a = UNIONS U` ABBREV_TAC;
2043   USE 0 (REWRITE_RULE[topology]);
2044   CONJ_TAC;
2045   MESON_TAC[SUBSET];
2046   USE 0 (CONV_RULE (quant_right_CONV "V"));
2047   USE 0 (CONV_RULE (quant_right_CONV "B"));
2048   USE 0 (CONV_RULE (quant_right_CONV "A"));
2049   AND 0;
2050   UND 2;
2051   MESON_TAC[DIFF_EQ_EMPTY];
2052   ]);;
2053
2054   (* }}} *)
2055
2056 let top_univ = prove_by_refinement(
2057   `!(U:(A->bool)->bool). (topology_ U) ==> (U (UNIONS U))`,
2058   (* {{{ proof *)
2059   [
2060   REWRITE_TAC[topology];
2061   DISCH_ALL_TAC;
2062   ASM_MESON_TAC[SUBSET_REFL];
2063   ]);;
2064   (* }}} *)
2065
2066 let empty_closed = prove_by_refinement(
2067   `!(U:(A->bool)->bool).
2068      (topology_ U) ==> closed_ U EMPTY`,
2069   (* {{{ proof *)
2070   [
2071   DISCH_ALL_TAC;
2072   REWRITE_TAC[closed;EMPTY_SUBSET;DIFF_EMPTY;open_DEF];
2073   ASM_MESON_TAC[top_univ];
2074   ]);;
2075   (* }}} *)
2076
2077 let closed_open = prove_by_refinement(
2078   `!(U:(A->bool)->bool) A.  (closed_ U A) ==>
2079     (open_ U ((UNIONS U) DIFF A))`,
2080   (* {{{ proof *)
2081   [
2082   MESON_TAC[closed];
2083   ]);;
2084 (* }}} *)
2085
2086 let closed_inter = prove_by_refinement (
2087   `!U V. (topology_ (U:(A->bool)->bool)) /\ (!a. (V a) ==> (closed_ U a))
2088     /\ ~(V = EMPTY)
2089      ==> (closed_ U (INTERS V))`,
2090   (* {{{ proof *)
2091   [
2092   REWRITE_TAC[closed];
2093   DISCH_ALL_TAC;
2094   CONJ_TAC;
2095   MATCH_MP_TAC  INTERS_SUBSET2;
2096   USE 2 (REWRITE_RULE[ EMPTY_EXISTS]);
2097   USE 2 (REWRITE_RULE[IN]);
2098   CHO 2;
2099   EXISTS_TAC `u:A->bool`;
2100   ASM_MESON_TAC[ ];
2101   ABBREV_TAC `VCOMP = IMAGE ((DIFF) (UNIONS (U:(A->bool)->bool))) V`;
2102   UNDISCH_FIND_THEN `VCOMP` (fun t -> ASSUME_TAC (GSYM t));
2103   SUBGOAL_THEN `(VCOMP:(A->bool)->bool) SUBSET U` ASSUME_TAC;
2104   ASM_REWRITE_TAC[SUBSET;IN_ELIM_THM;IMAGE];
2105   REWRITE_TAC[IN];
2106   GEN_TAC;
2107   ASM_MESON_TAC[open_DEF];
2108   SUBGOAL_THEN `open_ U (UNIONS (VCOMP:(A->bool)->bool))` ASSUME_TAC;
2109   ASM_MESON_TAC[topology;open_DEF];
2110   SUBGOAL_THEN ` (UNIONS U DIFF INTERS V)= (UNIONS (VCOMP:(A->bool)->bool))` (fun t-> (REWRITE_TAC[t]));
2111   ASM_REWRITE_TAC[UNIONS_INTERS];
2112   UNDISCH_FIND_TAC `(open_)`;
2113   REWRITE_TAC[];
2114   ]);;
2115 (* }}} *)
2116
2117 let open_nbd = prove_by_refinement(
2118   `!U (A:A->bool). (topology_ U) ==>
2119     ((U A) = (!x. ?B. (A x ) ==> ((B SUBSET A) /\ (B x) /\ (U B))))`,
2120   (* {{{ proof *)
2121   [
2122   DISCH_ALL_TAC;
2123   EQ_TAC;
2124   DISCH_ALL_TAC;
2125   GEN_TAC;
2126   EXISTS_TAC `A:A->bool`;
2127   ASM_MESON_TAC[SUBSET];
2128   CONV_TAC (quant_left_CONV "B");
2129   DISCH_THEN CHOOSE_TAC;
2130   USE 1 (CONV_RULE NAME_CONFLICT_CONV);
2131   TYPE_THEN `UNIONS (IMAGE B A)  = A` SUBGOAL_TAC;
2132   MATCH_MP_TAC  SUBSET_ANTISYM;
2133   CONJ_TAC;
2134   MATCH_MP_TAC  UNIONS_SUBSET;
2135   REWRITE_TAC[IN_IMAGE];
2136   ASM_MESON_TAC[IN];
2137   REWRITE_TAC[SUBSET;IN_UNIONS;IN_IMAGE];
2138   DISCH_ALL_TAC;
2139   NAME_CONFLICT_TAC;
2140   CONV_TAC (quant_left_CONV "x'");
2141   CONV_TAC (quant_left_CONV "x'");
2142   EXISTS_TAC `x:A`;
2143   TYPE_THEN `B x` EXISTS_TAC ;
2144   ASM_REWRITE_TAC[];
2145   ASM_MESON_TAC[IN];
2146   (* on 1*)
2147   TYPE_THEN `(IMAGE B A) SUBSET U` SUBGOAL_TAC;
2148   REWRITE_TAC[SUBSET;IN_IMAGE;];
2149   REWRITE_TAC[IN];
2150   NAME_CONFLICT_TAC;
2151   GEN_TAC;
2152   DISCH_THEN CHOOSE_TAC;
2153   ASM_REWRITE_TAC[];
2154   ASM_MESON_TAC[];
2155   TYPE_THEN `W = IMAGE B A` ABBREV_TAC;
2156   KILL 2;
2157   ASM_MESON_TAC[topology];
2158   ]);;
2159   (* }}} *)
2160
2161 let open_inters = prove_by_refinement(
2162   `!U (V:(A->bool)->bool). (topology_ U) /\ (V SUBSET U) /\
2163     (FINITE V) /\ ~(V = EMPTY)  ==>
2164                         (U (INTERS V))`,
2165   (* {{{ proof *)
2166   [
2167   REP_GEN_TAC;
2168   DISCH_ALL_TAC;
2169   TYPE_THEN `(?n. V HAS_SIZE n)` SUBGOAL_TAC;
2170   REWRITE_TAC[HAS_SIZE];
2171   ASM_MESON_TAC[];
2172   DISCH_ALL_TAC;
2173   UND 0;
2174   UND 1;
2175   UND 2;
2176   UND 3;
2177   UND 4;
2178   CONV_TAC (quant_left_CONV "n");
2179   TYPE_THEN `V` SPEC2_TAC ;
2180   TYPE_THEN `U` SPEC2_TAC ;
2181   CONV_TAC (quant_left_CONV "n");
2182   CONV_TAC (quant_left_CONV "n");
2183   INDUCT_TAC;
2184   DISCH_ALL_TAC;
2185   ASM_MESON_TAC[HAS_SIZE_0];
2186   DISCH_ALL_TAC;
2187   TYPE_THEN `U` (USE 0 o SPEC);
2188   USE 5 (REWRITE_RULE[HAS_SIZE_SUC;EMPTY_EXISTS]);
2189   AND 5;
2190   CHO 6;
2191   TYPE_THEN `u` (USE 5 o SPEC);
2192   REWR 5;
2193   TYPE_THEN `V DELETE u` (USE  0 o SPEC);
2194   REWR 0;
2195   TYPE_THEN `V={u}` ASM_CASES_TAC;
2196   ASM_REWRITE_TAC[inters_singleton];
2197   UND 6;
2198   UND 2;
2199   REWRITE_TAC [SUBSET;IN];
2200   MESON_TAC[];
2201   ALL_TAC; (* oi1 *)
2202   USE 0 (REWRITE_RULE[delete_empty]);
2203   REWR 0;
2204   USE 0 (REWRITE_RULE[FINITE_DELETE]);
2205   REWR 0;
2206   TYPE_THEN `V DELETE u SUBSET U ` SUBGOAL_TAC;
2207   ASM_MESON_TAC[DELETE_SUBSET;SUBSET_TRANS];
2208   DISCH_ALL_TAC;
2209   REWR 0;
2210   ALL_TAC; (* oi2 *)
2211   COPY 6;
2212   USE 9 (REWRITE_RULE[IN]);
2213   USE 9 (MATCH_MP delete_inters);
2214   ASM_REWRITE_TAC[];
2215   USE 1 (REWRITE_RULE[topology]);
2216   TYPEL_THEN [`(INTERS (V DELETE u))`;`u`;`U`] (USE 1 o ISPECL);
2217   AND 1;
2218   AND 1;
2219   UND 11;
2220   DISCH_THEN MATCH_MP_TAC ;
2221   ASM_REWRITE_TAC[];
2222   UND 6;
2223   UND 2;
2224   REWRITE_TAC [SUBSET;IN];
2225   ASM_MESON_TAC[];
2226   ]);;
2227   (* }}} *)
2228
2229 let top_unions = prove_by_refinement(
2230   `!(U:(A->bool)->bool) V. topology_ U /\ (V SUBSET U) ==> U (UNIONS V)`,
2231   (* {{{ proof *)
2232   [
2233   MESON_TAC[topology];
2234   ]);;
2235   (* }}} *)
2236
2237 let top_inter = prove_by_refinement(
2238   `!(U:(A->bool)-> bool) A B. topology_ U /\ (U A) /\ (U B) ==> (U (A INTER B))`,
2239   (* {{{ proof *)
2240   [
2241   MESON_TAC[topology];
2242   ]);;
2243   (* }}} *)
2244
2245
2246 (* open and closed balls in  metric spaces *)
2247
2248 let open_ball_nonempty = prove_by_refinement(
2249  `!(X:A->bool) d a r. (metric_space (X,d)) /\ (&.0 <. r) /\ (X a) ==>
2250     (a IN (open_ball(X,d) a r))`,
2251  (* {{{ proof *)
2252  [
2253  REWRITE_TAC[metric_space;IN_ELIM_THM;open_ball];
2254  DISCH_ALL_TAC;
2255  UNDISCH_FIND_THEN `( /\ )` (ASSUME_TAC o (SPECL [`a:A`;`a:A`;`a:A`]));
2256  ASM_MESON_TAC[];
2257  ]);;
2258  (* }}} *)
2259
2260 let open_ball_subset = prove_by_refinement(
2261  `!(X:A->bool) d a r. (open_ball (X,d) a r SUBSET X)`,
2262 (* {{{ proof *)
2263  [
2264  REWRITE_TAC[SUBSET;open_ball;IN_ELIM_THM];
2265  MESON_TAC[IN];
2266  ]);;
2267 (* }}} *)
2268
2269 let open_ball_subspace = prove_by_refinement(
2270   `!(X:A->bool) Y d a r. (Y SUBSET X) ==>
2271     (open_ball(Y,d) a r SUBSET open_ball(X,d) a r)`,
2272 (* {{{ proof *)
2273  [
2274  REWRITE_TAC[SUBSET;open_ball;IN_ELIM_THM];
2275  MESON_TAC[IN];
2276  ]);;
2277 (* }}} *)
2278
2279 let open_ball_empty = prove_by_refinement(
2280   `!(X:A->bool) d a r. ~(a IN X) ==> (EMPTY = open_ball (X,d) a r)`,
2281   (* {{{ proof *)
2282   [
2283   DISCH_ALL_TAC;
2284   REWRITE_TAC[open_ball];
2285   MATCH_MP_TAC EQ_EXT;
2286   REWRITE_TAC[IN_ELIM_THM;EMPTY];
2287   ASM_MESON_TAC[IN];
2288   ]);;
2289   (* }}} *)
2290
2291 (*** Old proof modified by JRH to avoid GSPEC
2292
2293 let open_ball_intersect = prove_by_refinement(
2294   `!(X:A->bool) Y d a r. (Y SUBSET X) /\ (a IN Y) ==>
2295    (open_ball(Y,d) a r = (open_ball(X,d) a r INTER Y))`,
2296   (* {{{ proof *)
2297   [
2298   REWRITE_TAC[SUBSET;IN;INTER;open_ball];
2299   REWRITE_TAC[GSPEC_THM];
2300   REWRITE_TAC[IN_ELIM_THM];
2301   REWRITE_TAC[GSPEC];
2302   DISCH_ALL_TAC;
2303   MATCH_MP_TAC EQ_EXT;
2304   GEN_TAC;
2305   BETA_TAC;
2306   ASM_MESON_TAC[];
2307   ]);;
2308   (* }}} *)
2309
2310 ***)
2311
2312 let open_ball_intersect = prove_by_refinement(
2313   `!(X:A->bool) Y d a r. (Y SUBSET X) /\ (a IN Y) ==>
2314    (open_ball(Y,d) a r = (open_ball(X,d) a r INTER Y))`,
2315   (* {{{ proof *)
2316   [
2317   REWRITE_TAC[SUBSET;IN;INTER;open_ball];
2318   REWRITE_TAC[EXTENSION; IN_ELIM_THM];
2319   MESON_TAC[]
2320   ]);;
2321   (* }}} *)
2322
2323 let open_ball_center = prove_by_refinement(
2324  `!(X:A->bool) d a b r. (metric_space (X,d)) /\
2325       (a IN (open_ball (X,d) b r)) ==>
2326      (?r'. (&.0 <. r') /\
2327          ((open_ball(X,d) a r') SUBSET (open_ball(X,d) b r)))`,
2328 (* {{{ proof *)
2329  [
2330  REWRITE_TAC[metric_space;open_ball];
2331  DISCH_ALL_TAC;
2332  EXISTS_TAC `r -. (d (a:A) (b:A))`;
2333  REWRITE_TAC[SUBSET;IN_ELIM_THM];
2334  UNDISCH_FIND_TAC `(IN)`;
2335  REWRITE_TAC[IN_ELIM_THM];
2336  DISCH_ALL_TAC;
2337  CONJ_TAC;
2338  REWRITE_TAC[REAL_ARITH `(&.0 < r -. s)= (s <. r)`];
2339  ASM_MESON_TAC[];
2340  GEN_TAC;
2341  ASM_REWRITE_TAC[];
2342  REWRITE_TAC[REAL_ARITH `(u <. v-.w) <=> (w +. u <. v)`];
2343  DISCH_ALL_TAC;
2344  ASM_REWRITE_TAC[];
2345  UNDISCH_FIND_TAC `(!)`;
2346  DISCH_THEN (fun t-> (MP_TAC (SPECL [`b:A`;`a:A`;`x:A`] t)));
2347  ASM_REWRITE_TAC[];
2348  ASM_MESON_TAC[REAL_LET_TRANS;REAL_LTE_TRANS];
2349  ]);;
2350 (* }}} *)
2351
2352 let open_ball_nonempty_center = prove_by_refinement(
2353  `!(X:A->bool) d a r. (metric_space(X,d)) ==>
2354     ((a IN (open_ball(X,d) a r)) =
2355     ~(open_ball(X,d) a r = EMPTY))`,
2356 (* {{{ proof *)
2357  [
2358  REWRITE_TAC[metric_space];
2359  DISCH_ALL_TAC;
2360  REWRITE_TAC[open_ball];
2361  REWRITE_TAC[REWRITE_CONV[IN_ELIM_THM] `(a:A) IN { y | X a /\ X y /\ (d a y <. r)}`];
2362  REWRITE_TAC[EXTENSION];
2363  REWRITE_TAC[IN_ELIM_THM;NOT_IN_EMPTY;NOT_FORALL_THM];
2364  EQ_TAC;
2365  MESON_TAC[];
2366  DISCH_THEN CHOOSE_TAC;
2367  ASM_REWRITE_TAC[];
2368  FIRST_ASSUM  (fun t -> MP_TAC (SPECL [`a:A`;`x:A`;`a:A`] t));
2369  UNDISCH_FIND_THEN `(+.)`  (fun t -> MP_TAC (SPECL [`a:A`;`a:A`;`a:A`] t));
2370  ASM_MESON_TAC[REAL_LET_TRANS;REAL_LTE_TRANS];
2371  ]);;
2372 (* }}} *)
2373
2374 (*** Old proof modified by JRH to remove apparent misnamed quantifier
2375
2376 let open_ball_neg_radius = prove_by_refinement(
2377   `!(X:A->bool) d a r. metric_space(X,d) /\ (r <. (&.0)) ==>
2378     (EMPTY = open_ball(X,d) a r)`,
2379   (* {{{ proof *)
2380   [
2381   REWRITE_TAC[open_ball;metric_space];
2382   DISCH_ALL_TAC;
2383   MATCH_MP_TAC EQ_EXT;
2384   GEN_TAC;
2385   REWRITE_TAC[EMPTY;IN_ELIM_THM];
2386   FIRST_ASSUM  (fun t -> MP_TAC (SPECL [`a:A`;`x:A`;`a:A`] t));
2387   ASSUME_TAC (REAL_ARITH `!u r. ~((dd <. r) /\ (r <. (&.0)) /\ (&.0 <=. dd))`);
2388   ASM_MESON_TAC[];
2389   ]);;
2390   (* }}} *)
2391
2392 ***)
2393
2394 let open_ball_neg_radius = prove_by_refinement(
2395   `!(X:A->bool) d a r. metric_space(X,d) /\ (r <. (&.0)) ==>
2396     (EMPTY = open_ball(X,d) a r)`,
2397   (* {{{ proof *)
2398   [
2399   REWRITE_TAC[open_ball;metric_space];
2400   DISCH_ALL_TAC;
2401   MATCH_MP_TAC EQ_EXT;
2402   GEN_TAC;
2403   REWRITE_TAC[EMPTY;IN_ELIM_THM];
2404   FIRST_ASSUM  (fun t -> MP_TAC (SPECL [`a:A`;`x:A`;`a:A`] t));
2405   ASSUME_TAC (REAL_ARITH `!d r. ~((d <. r) /\ (r <. (&.0)) /\ (&.0 <=. d))`);
2406   ASM_MESON_TAC[];
2407   ]);;
2408   (* }}} *)
2409
2410
2411 let open_ball_nest = prove_by_refinement(
2412  `!(X:A->bool) d a r r'. (r <. r') ==>
2413    ((open_ball (X,d) a r) SUBSET (open_ball(X,d) a r'))`,
2414 (* {{{ proof *)
2415   [
2416   REWRITE_TAC[SUBSET;open_ball;IN_ELIM_THM];
2417   MESON_TAC[REAL_ARITH `(r<. r') /\ (a <. r) ==> (a <. r')`];
2418   ]);;
2419 (* }}} *)
2420
2421 (* intersection of open balls contains an open ball *)
2422 let open_ball_inter = prove_by_refinement(
2423  `!(X:A->bool) d a b c r r'. (metric_space (X,d)) /\ (X a) /\ (X b) /\
2424   (c IN (open_ball(X,d) a r INTER (open_ball(X,d) b r'))) ==>
2425   (?r''. (&.0 <. r'') /\ (open_ball(X,d) c r'') SUBSET
2426     (open_ball(X,d) a r INTER (open_ball(X,d) b r')))`,
2427   (* {{{ proof *)
2428   [
2429   DISCH_ALL_TAC;
2430     UNDISCH_FIND_THEN `(INTER)` (fun t-> MP_TAC (REWRITE_RULE[IN_INTER] t) THEN DISCH_ALL_TAC);
2431   SUBGOAL_TAC `(X:A->bool) (c:A)`;
2432   ASM_MESON_TAC[SUBSET;open_ball_subset;IN];
2433   DISCH_TAC;
2434   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);
2435   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);
2436   REWRITE_TAC[SUBSET_INTER];
2437   EXISTS_TAC `(if (r'' <. r''') then (r'') else (r'''))`;
2438   COND_CASES_TAC;
2439   ASM_MESON_TAC[open_ball_nest;SUBSET_TRANS];
2440   IMP_RES_THEN DISJ_CASES_TAC (REAL_ARITH `(~(r'' <. r''')) ==> ((r''' <. r'') \/ (r'''=r''))`);
2441   ASM_MESON_TAC[open_ball_nest;SUBSET_TRANS];
2442   ASM_MESON_TAC[];
2443   ]);;
2444 (* }}} *)
2445
2446 let BALL_DIST = prove_by_refinement(
2447   `!X d x y (z:A) r. metric_space(X,d) /\ open_ball(X,d) z r x /\
2448   open_ball(X,d) z r y ==> d x y <. (&.2 * r)`,
2449   (* {{{ proof *)
2450   [
2451   REWRITE_TAC[metric_space;open_ball;IN_ELIM_THM'];
2452   DISCH_ALL_TAC;
2453   USE 0 (SPECL [`x:A`;`z:A`;`y:A`]);
2454   REWR 0;
2455   UND 0 THEN DISCH_ALL_TAC;
2456   UND 9;
2457   UND 6;
2458   ASM_REWRITE_TAC[];
2459   UND 3;
2460   REAL_ARITH_TAC;
2461   ]);;
2462   (* }}} *)
2463
2464 let BALL_DIST_CLOSED = prove_by_refinement(
2465   `!X d x y (z:A) r. metric_space(X,d) /\ closed_ball(X,d) z r x /\
2466   closed_ball(X,d) z r y ==> d x y <=. (&.2 * r)`,
2467   (* {{{ proof *)
2468
2469   [
2470   REWRITE_TAC[metric_space;closed_ball;IN_ELIM_THM'];
2471   DISCH_ALL_TAC;
2472   USE 0 (SPECL [`x:A`;`z:A`;`y:A`]);
2473   REWR 0;
2474   UND 0 THEN DISCH_ALL_TAC;
2475   UND 9;
2476   UND 6;
2477   ASM_REWRITE_TAC[];
2478   UND 3;
2479   REAL_ARITH_TAC;
2480   ]);;
2481
2482   (* }}} *)
2483
2484
2485 let open_ball_sub_closed = prove_by_refinement(
2486   `!X d (x:A) r.
2487      (open_ball(X,d) x r SUBSET (closed_ball(X,d) x r))`,
2488   (* {{{ proof *)
2489
2490   [
2491   DISCH_ALL_TAC;
2492   REWRITE_TAC[SUBSET;IN;open_ball;closed_ball;IN_ELIM_THM'];
2493   DISCH_ALL_TAC;
2494   ASM_REWRITE_TAC[];
2495   UND 2;
2496   REAL_ARITH_TAC;
2497   ]);;
2498
2499   (* }}} *)
2500
2501 let ball_symm = prove_by_refinement(
2502   `!X d (x:A) y r. metric_space(X,d) /\ (X x) /\ (X y) ==>
2503        (open_ball(X,d) x r y = open_ball(X,d) y r x)`,
2504   (* {{{ proof *)
2505   [
2506   DISCH_ALL_TAC;
2507   REWRITE_TAC [open_ball;IN_ELIM_THM'];
2508   ASM_REWRITE_TAC[];
2509   ASM_MESON_TAC [metric_space_symm];
2510   ]);;
2511   (* }}} *)
2512
2513 let ball_subset_ball = prove_by_refinement(
2514   `!X d (x:A) z r. metric_space(X,d) /\
2515        (open_ball(X,d) x r z ) ==>
2516     (open_ball(X,d) z r SUBSET (open_ball(X,d) x (&.2 * r)))`,
2517   (* {{{ proof *)
2518   [
2519     DISCH_ALL_TAC;
2520     REWRITE_TAC[SUBSET;IN];
2521     DISCH_ALL_TAC;
2522     REWRITE_TAC[open_ball;IN_ELIM_THM'];
2523     TYPE_THEN `X z /\ X x' /\ X x` SUBGOAL_TAC ;
2524     UND 2;
2525     UND 1;
2526     REWRITE_TAC[open_ball;IN_ELIM_THM'];
2527     MESON_TAC[];
2528     DISCH_ALL_TAC;
2529     TYPE_THEN `open_ball(X,d) z r x` SUBGOAL_TAC;
2530     ASM_MESON_TAC[ball_symm];
2531     ASM_MESON_TAC[BALL_DIST];
2532   ]);;
2533   (* }}} *)
2534
2535
2536 (* top_of_metric *)
2537
2538 let top_of_metric_unions = prove_by_refinement(
2539  `!(X:A->bool) d. (metric_space (X,d)) ==>
2540     (X = UNIONS (top_of_metric (X,d)))`,
2541   (* {{{ proof *)
2542  [
2543  REPEAT GEN_TAC;
2544  DISCH_TAC;
2545  MATCH_MP_TAC SUBSET_ANTISYM THEN CONJ_TAC;
2546  REWRITE_TAC[SUBSET];
2547  REWRITE_TAC[IN_UNIONS;top_of_metric];
2548  DISCH_ALL_TAC;
2549  EXISTS_TAC `open_ball(X,d) (x:A) (&.1)`;
2550  UNDISCH_TAC `(x:A) IN X` THEN (REWRITE_TAC[IN_ELIM_THM]);
2551  DISCH_ALL_TAC;
2552  CONJ_TAC;
2553  EXISTS_TAC `{(open_ball(X,d) (x:A) (&.1))}`;
2554  REWRITE_TAC[GSYM UNIONS_1;INSERT_SUBSET;EMPTY_SUBSET];
2555  REWRITE_TAC[open_balls;IN_ELIM_THM];
2556  MESON_TAC[];
2557  REWRITE_TAC[IN_ELIM_THM;open_ball];
2558  UNDISCH_FIND_TAC `(IN)`;
2559  ASM_REWRITE_TAC[IN];
2560  DISCH_TAC;
2561  ASM_REWRITE_TAC[];
2562  UNDISCH_FIND_TAC `metric_space`;
2563  REWRITE_TAC[metric_space];
2564  DISCH_THEN (fun t -> MP_TAC (ISPECL [`x:A`;`x:A`;`x:A`] t));
2565  ASM_MESON_TAC[REAL_ARITH `(&.0) <. (&.1)`];
2566  MATCH_MP_TAC UNIONS_SUBSET;
2567  GEN_TAC;
2568  REWRITE_TAC[top_of_metric;IN_ELIM_THM];
2569  DISCH_THEN CHOOSE_TAC;
2570  ASM_REWRITE_TAC[];
2571  MATCH_MP_TAC UNIONS_SUBSET;
2572  X_GEN_TAC `B:A->bool`;
2573  DISCH_TAC;
2574  SUBGOAL_TAC `(B:A->bool) IN open_balls (X,d)`;
2575  ASM SET_TAC[];
2576  REWRITE_TAC[open_balls;IN_ELIM_THM];
2577  DISCH_THEN (CHOOSE_THEN MP_TAC);
2578  DISCH_THEN (CHOOSE_THEN ASSUME_TAC);
2579  ASM_REWRITE_TAC[];
2580  REWRITE_TAC[open_ball;SUBSET;IN_ELIM_THM];
2581  MESON_TAC[IN];
2582  ]);;
2583 (* }}} *)
2584
2585 let top_of_metric_empty = prove_by_refinement(
2586  `!(X:A->bool) d.
2587    ( (top_of_metric (X,d)) EMPTY)`,
2588   (* {{{ proof  *)
2589  [
2590  REWRITE_TAC[top_of_metric];
2591  REPEAT GEN_TAC;
2592  REWRITE_TAC[IN_ELIM_THM];
2593  EXISTS_TAC `EMPTY:(A->bool)->bool`;
2594  REWRITE_TAC[UNIONS_0;EMPTY_SUBSET];
2595  ]);;
2596 (* }}} *)
2597
2598 let top_of_metric_open = prove_by_refinement(
2599  `!(X:A->bool) d F.
2600     (F SUBSET (open_balls (X,d))) ==>
2601     ((UNIONS F) IN (top_of_metric(X,d)))`,
2602  (* {{{ proof *)
2603  [
2604  REWRITE_TAC[top_of_metric;IN_ELIM_THM];
2605  MESON_TAC[];
2606  ]);;
2607  (* }}} *)
2608
2609 let top_of_metric_open_balls = prove_by_refinement(
2610  `!(X:A->bool) d.
2611     (open_balls (X,d)) SUBSET (top_of_metric(X,d))`,
2612  (* {{{ proof *)
2613  [
2614  REWRITE_TAC[SUBSET];
2615  REWRITE_TAC[top_of_metric;IN_ELIM_THM];
2616  DISCH_ALL_TAC;
2617  EXISTS_TAC `{(x:A->bool)}`;
2618  ASM SET_TAC[];
2619  ]);;
2620   (* }}} *)
2621
2622 let open_ball_open = prove_by_refinement(
2623   `! (X:A->bool) d x r. (metric_space(X,d)) ==>
2624    (top_of_metric (X,d) (open_ball (X,d) x r)) `,
2625   (* {{{ proof *)
2626   [
2627     DISCH_ALL_TAC;
2628   TYPEL_THEN [`X`;`d`] (fun t-> ASSUME_TAC ( ISPECL t top_of_metric_open_balls));
2629   USE 1 (REWRITE_RULE[open_balls;SUBSET;IN_ELIM_THM']);
2630   ASM_MESON_TAC[IN];
2631   ]);;
2632   (* }}} *)
2633
2634 (* a set is open then every point contains a ball *)
2635 let top_of_metric_nbd = prove_by_refinement(
2636  `!(X:A->bool) d A. (metric_space (X,d)) ==>
2637      ((top_of_metric (X,d) A) <=> ((A SUBSET X) /\
2638     (!a. (a IN A) ==>
2639     (?r. (&.0 <. r) /\ (open_ball(X,d) a r SUBSET A)))))`,
2640 (* {{{ proof *)
2641
2642  [
2643  (DISCH_ALL_TAC);
2644  EQ_TAC;
2645  REWRITE_TAC[top_of_metric;IN_ELIM_THM];
2646  DISCH_THEN (CHOOSE_THEN MP_TAC);
2647  DISCH_ALL_TAC;
2648  CONJ_TAC;
2649  IMP_RES_THEN ASSUME_TAC top_of_metric_unions;
2650  ASM_REWRITE_TAC[];
2651  IMP_RES_THEN ASSUME_TAC top_of_metric_open;
2652  ASM ONCE_REWRITE_TAC[];
2653  MATCH_MP_TAC UNIONS_UNIONS;
2654  ASM_MESON_TAC[SUBSET_TRANS;top_of_metric_open_balls];
2655  DISCH_ALL_TAC THEN (ASM_REWRITE_TAC[]);
2656  REWRITE_TAC[IN_UNIONS;UNIONS_SUBSET];
2657  UNDISCH_FIND_TAC `(IN)`;
2658  ASM_REWRITE_TAC[];
2659  REWRITE_TAC[IN_UNIONS];
2660  DISCH_THEN (CHOOSE_THEN ASSUME_TAC);
2661  SUBGOAL_TAC `(t IN open_balls (X:A->bool,d))`;
2662  ASM_MESON_TAC[SUBSET];
2663  REWRITE_TAC[open_balls;IN_ELIM_THM];
2664  REPEAT (DISCH_THEN (CHOOSE_THEN MP_TAC));
2665  DISCH_TAC;
2666  MP_TAC (SPECL[`(X:A->bool)`; `d:A->A->real`;`a:A`;`x:A`;`r:real`] open_ball_center);
2667  ASM_REWRITE_TAC[];
2668  SUBGOAL_TAC `(a:A) IN open_ball(X,d) x r`;
2669  ASM_MESON_TAC[];
2670  DISCH_TAC THEN (ASM_REWRITE_TAC[]);
2671  DISCH_THEN CHOOSE_TAC;
2672  EXISTS_TAC `r':real`;
2673  ASM_REWRITE_TAC[];
2674  (* to here *)
2675  SUBGOAL_TAC `!s. ((s:A->bool) IN F') ==> (s SUBSET (UNIONS F'))`;
2676  SET_TAC[];
2677  ASM_MESON_TAC[SUBSET_TRANS] ; (*second direction: *)
2678  DISCH_THEN (fun t -> ASSUME_TAC (CONJUNCT1 t) THEN MP_TAC (CONJUNCT2 t));
2679  DISCH_THEN (fun t -> MP_TAC (REWRITE_RULE[RIGHT_IMP_EXISTS_THM] t));
2680  REWRITE_TAC[SKOLEM_THM];
2681  DISCH_THEN CHOOSE_TAC;
2682  REWRITE_TAC[top_of_metric;IN_ELIM_THM];
2683  EXISTS_TAC `IMAGE (\b. (open_ball(X,d) b (r b))) (A:A->bool)`;
2684  CONJ_TAC;
2685  REWRITE_TAC[IMAGE;SUBSET];
2686  REWRITE_TAC[IN_ELIM_THM;open_balls];
2687  MESON_TAC[IN];
2688  REWRITE_TAC[IMAGE];
2689  GEN_REWRITE_TAC I [EXTENSION];
2690  X_GEN_TAC `a:A`;
2691  REWRITE_TAC[IN_UNIONS];
2692  REWRITE_TAC[IN_ELIM_THM];
2693  EQ_TAC;
2694  DISCH_TAC;
2695  EXISTS_TAC `open_ball (X,d) (a:A) (r a)`;
2696  CONJ_TAC;
2697  EXISTS_TAC `a:A`;
2698  ASM_REWRITE_TAC[];
2699  REWRITE_TAC[IN;open_ball];
2700  REWRITE_TAC[IN_ELIM_THM];
2701  ASM_MESON_TAC[metric_space_zero;IN;SUBSET];  (* last: *)
2702  DISCH_THEN (CHOOSE_THEN MP_TAC);
2703  DISCH_ALL_TAC;
2704  UNDISCH_FIND_TAC `(?)` ;
2705  DISCH_THEN (CHOOSE_THEN MP_TAC);
2706  DISCH_ALL_TAC;
2707  UNDISCH_FIND_TAC `(!)`;
2708  DISCH_THEN (fun t -> MP_TAC(SPEC `x:A` t));
2709  ASM_REWRITE_TAC[];
2710  DISCH_ALL_TAC;
2711  ASM_MESON_TAC[SUBSET;IN];
2712  ]);;
2713
2714 (* }}} *)
2715
2716 let top_of_metric_inter = prove_by_refinement(
2717  `!(X:A->bool) d. (metric_space (X,d)) ==>
2718    (!A B. (top_of_metric (X,d) A) /\ (top_of_metric (X,d) B) ==>
2719       (top_of_metric (X,d) (A INTER B)))`,
2720 (* {{{ proof *)
2721  [
2722  DISCH_ALL_TAC;
2723  DISCH_ALL_TAC;
2724  IMP_RES_THEN ASSUME_TAC (SPECL [`X:A->bool`;`d:A->A->real`] top_of_metric_nbd);
2725  UNDISCH_TAC `(top_of_metric (X,d) (B:A->bool))`;
2726  UNDISCH_TAC `(top_of_metric (X,d) (A:A->bool))`;
2727  ASM_REWRITE_TAC[];
2728  DISCH_ALL_TAC;
2729  DISCH_ALL_TAC;
2730  CONJ_TAC;
2731  ASM SET_TAC[];
2732  DISCH_ALL_TAC;
2733  UNDISCH_FIND_THEN `(INTER)` (fun t-> (MP_TAC (REWRITE_RULE[IN_INTER]t)) THEN DISCH_ALL_TAC );
2734  UNDISCH_FIND_THEN `(IN)` (fun t-> ANTE_RES_THEN MP_TAC t);
2735  UNDISCH_FIND_THEN `(IN)` (fun t-> ANTE_RES_THEN MP_TAC t);
2736  DISCH_THEN CHOOSE_TAC;
2737  DISCH_THEN CHOOSE_TAC;
2738  EXISTS_TAC `if (r<. r') then r else r'`;
2739  COND_CASES_TAC;
2740  ASM_REWRITE_TAC[SUBSET_INTER];
2741  ASM_MESON_TAC[open_ball_nest;SUBSET_TRANS];
2742  MP_TAC (ARITH_RULE `~(r<.r') ==> ((r'<. r) \/ (r'=r))`) THEN (ASM_REWRITE_TAC[]);
2743  DISCH_THEN DISJ_CASES_TAC;
2744  ASM_REWRITE_TAC[SUBSET_INTER];
2745  ASM_MESON_TAC[open_ball_nest;SUBSET_TRANS];
2746  ASM_MESON_TAC[SUBSET_INTER];
2747  ]);;
2748 (* }}} *)
2749
2750 let top_of_metric_union = prove_by_refinement(
2751   `!(X:A->bool) d. (metric_space(X,d)) ==>
2752    (!V. (V SUBSET top_of_metric(X,d)) ==>
2753       (top_of_metric(X,d) (UNIONS V)))`,
2754 (* {{{ proof *)
2755   [
2756   DISCH_ALL_TAC;
2757   MP_TAC (SPECL[`X:A->bool`;`d:A->A->real`] top_of_metric_nbd);
2758   ASM_REWRITE_TAC[];
2759   DISCH_THEN (fun t-> REWRITE_TAC[t]);
2760   DISCH_ALL_TAC;
2761   CONJ_TAC;
2762   ASM_MESON_TAC[UNIONS_UNIONS;top_of_metric_unions];
2763   GEN_TAC;
2764   REWRITE_TAC[IN_UNIONS];
2765   DISCH_THEN (CHOOSE_THEN MP_TAC);
2766   DISCH_ALL_TAC;
2767   SUBGOAL_TAC `(top_of_metric (X,d)) (t:A->bool)`;
2768   ASM_MESON_TAC[IN;SUBSET];
2769   MP_TAC (SPECL[`X:A->bool`;`d:A->A->real`] top_of_metric_nbd);
2770   ASM_REWRITE_TAC[];
2771   DISCH_TAC;
2772   ASM_REWRITE_TAC[];
2773   DISCH_ALL_TAC;
2774   UNDISCH_FIND_THEN `(!)` (fun t -> MP_TAC (SPEC `a:A` t));
2775   ASM_REWRITE_TAC[];
2776   DISCH_THEN CHOOSE_TAC;
2777   EXISTS_TAC `r:real`;
2778   ASM_REWRITE_TAC[];
2779   ASM SET_TAC[UNIONS];
2780   ]);;
2781 (* }}} *)
2782
2783 let top_of_metric_top = prove_by_refinement(
2784  `!(X:A->bool) d. ( (metric_space (X,d))) ==>
2785     (topology_ (top_of_metric (X,d)))`,
2786 (* {{{ proof *)
2787  [
2788  DISCH_ALL_TAC;
2789  REWRITE_TAC[topology];
2790  REPEAT GEN_TAC;
2791  ASM_SIMP_TAC[top_of_metric_empty;top_of_metric_inter;top_of_metric_union];
2792  ]);;
2793 (* }}} *)
2794
2795 let closed_ball_closed = prove_by_refinement(
2796   `!X d (x:A) r. (metric_space (X,d)) ==>
2797      (closed_ (top_of_metric(X,d)) (closed_ball(X,d) x r))`,
2798   (* {{{ proof *)
2799   [
2800   DISCH_ALL_TAC;
2801   TYPE_THEN `X x`  ASM_CASES_TAC ;
2802   REWRITE_TAC[closed];
2803   ASM_SIMP_TAC [GSYM top_of_metric_unions];
2804   SUBCONJ_TAC;
2805   REWRITE_TAC[closed_ball;SUBSET;IN;IN_ELIM_THM'];
2806   MESON_TAC[];
2807   DISCH_ALL_TAC;
2808   REWRITE_TAC[open_DEF];
2809   COPY 0;
2810   USE 0 (MATCH_MP top_of_metric_top);
2811   ONCE_ASM_SIMP_TAC[open_nbd];
2812   GEN_TAC;
2813   TYPE_THEN `open_ball(X,d) x' (d x x' -. r)` EXISTS_TAC;
2814   TYPE_THEN `R = (d x x' -. r)` ABBREV_TAC;
2815   DISCH_ALL_TAC;
2816   TYPE_THEN `X x'` SUBGOAL_TAC;
2817   USE 5 (REWRITE_RULE[INR IN_DIFF]);
2818   ASM_REWRITE_TAC[];
2819   DISCH_ALL_TAC;
2820   SUBCONJ_TAC;
2821   REWRITE_TAC[DIFF_SUBSET;open_ball_subset;INTER;EQ_EMPTY;IN_ELIM_THM'];
2822   X_GEN_TAC `y:A`;
2823   REWRITE_TAC[IN];
2824   ASM_REWRITE_TAC[open_ball;closed_ball];
2825   REWRITE_TAC[IN_ELIM_THM';GSYM CONJ_ASSOC];
2826   PROOF_BY_CONTR_TAC;
2827   USE 7 (REWRITE_RULE[]);
2828   AND 7;
2829   REWR 7;
2830   COPY 3;
2831   USE 3 (REWRITE_RULE[metric_space]);
2832   TYPEL_THEN [`x`;`y`;`x'`] (USE 3 o SPECL);
2833   REWR 3;
2834   ALL_TAC; (* "bb"; *)
2835   TYPE_THEN `d x' y = d y x'` SUBGOAL_TAC;
2836   TYPEL_THEN [`X`;`d`] (fun t-> MATCH_MP_TAC  (SPECL t metric_space_symm));
2837   ASM_REWRITE_TAC[];
2838   DISCH_TAC;
2839   UND 7;
2840   UND 10;
2841   AND 3;
2842   AND 3;
2843   AND 3;
2844   UND 3;
2845   EXPAND_TAC "R";
2846   ALL_TAC; (* "cb" *)
2847   REAL_ARITH_TAC;
2848   ALL_TAC; (* "cbc" *)
2849   DISCH_TAC;
2850   ASM_SIMP_TAC [open_ball_open];
2851   MATCH_MP_TAC  (INR open_ball_nonempty);
2852   ASM_REWRITE_TAC[];
2853   EXPAND_TAC "R";
2854   PROOF_BY_CONTR_TAC;
2855   USE 8 (MATCH_MP (REAL_ARITH `~(&.0 < d x x' - r) ==> (d x x' <=. r)`));
2856   USE 5 (REWRITE_RULE[INR IN_DIFF;closed_ball;IN_ELIM_THM']);
2857   ASM_MESON_TAC[];
2858   TYPE_THEN `(closed_ball (X,d) x r) = EMPTY` SUBGOAL_TAC;
2859 (**** Old step changed by JRH for modified set comprehensions
2860   ASM_REWRITE_TAC[closed_ball;EMPTY;GSPEC];
2861  ***)
2862   ASM_REWRITE_TAC[closed_ball;IN_ELIM_THM; EXTENSION; NOT_IN_EMPTY];
2863   DISCH_THEN (REWRT_TAC);
2864   ALL_TAC; (* "cbc1" *)
2865   ASM_MESON_TAC[empty_closed;top_of_metric_top];
2866   ]);;
2867   (* }}} *)
2868
2869 let open_ball_nbd = prove_by_refinement(
2870   `!X d C x. ?e. (metric_space((X:A->bool),d)) /\ (C x) /\
2871     (top_of_metric (X,d) C) ==>
2872    ((&.0 < e) /\ (open_ball (X,d) x e SUBSET C))`,
2873   (* {{{ proof *)
2874
2875   [
2876   DISCH_ALL_TAC;
2877   RIGHT_TAC "e";
2878   DISCH_ALL_TAC;
2879   USE 2 (REWRITE_RULE[top_of_metric;open_balls;IN_ELIM_THM';SUBSET;IN  ]);
2880   CHO 2;
2881   AND 2;
2882   ASM_REWRITE_TAC[];
2883   REWR 1;
2884   USE 1 (REWRITE_RULE[UNIONS;IN;IN_ELIM_THM'  ]);
2885   CHO 1;
2886   TYPE_THEN `u` (USE 3 o SPEC);
2887   REWR 3;
2888   CHO 3;
2889   CHO 3;
2890   REWR 1;
2891   TYPEL_THEN [`X`;`d`;`x`;`x'`;`r`] (fun t-> (ASSUME_TAC (ISPECL t open_ball_center)));
2892   USE 4 (REWRITE_RULE[IN ]);
2893   REWR 4;
2894   CHO 4;
2895   TYPE_THEN `r'` EXISTS_TAC;
2896   ASM_REWRITE_TAC[];
2897   REWRITE_TAC[SUBSET;UNIONS;IN;IN_ELIM_THM'];
2898   DISCH_ALL_TAC;
2899   AND 4;
2900   USE 4 (REWRITE_RULE[SUBSET;IN;IN_ELIM_THM']);
2901   ASM_MESON_TAC[];
2902   ]);;
2903
2904   (* }}} *)
2905
2906
2907 (* closure *)
2908
2909 let closure_closed = prove_by_refinement(
2910   `!U (A:A->bool). (topology_ U) /\ (A SUBSET (UNIONS U))  ==>
2911     (closed_ U (closure U A))`,
2912   (* {{{ proof *)
2913   [
2914   DISCH_ALL_TAC;
2915   REWRITE_TAC[closure];
2916   MATCH_MP_TAC closed_inter;
2917   REWRITE_TAC[IN_ELIM_THM];
2918   ASM_REWRITE_TAC[];
2919   CONJ_TAC;
2920   MESON_TAC[];
2921   REWRITE_TAC[EMPTY_EXISTS];
2922   TYPE_THEN `UNIONS U` EXISTS_TAC;
2923   ASM_REWRITE_TAC[IN_ELIM_THM'];
2924   ASM_SIMP_TAC[closed_UNIV];
2925   ]);;
2926 (* }}} *)
2927
2928 let subset_closure = prove_by_refinement(
2929   `!U (A:A->bool). (topology_ U) ==> (A SUBSET (closure U A))`,
2930   (* {{{ proof *)
2931   [
2932   DISCH_ALL_TAC;
2933   REWRITE_TAC[closure;SUBSET;IN_INTERS;IN_ELIM_THM];
2934   X_GEN_TAC `a:A`;
2935   MESON_TAC[IN];
2936   ]);;
2937   (* }}} *)
2938
2939 let closure_subset = prove_by_refinement(
2940   `!U (A:A->bool) B. (topology_ U) /\ (closed_ U B) /\ (A SUBSET B)
2941     ==> (closure U A SUBSET B)`,
2942   (* {{{ proof *)
2943   [
2944   REWRITE_TAC[closure];
2945   DISCH_ALL_TAC;
2946   MATCH_MP_TAC INTERS_SUBSET;
2947   ASM_REWRITE_TAC[IN_ELIM_THM];
2948   ]);;
2949   (* }}} *)
2950
2951 let closure_self = prove_by_refinement(
2952   `!U (A:A->bool). (topology_ U) /\ (closed_ U A) ==>
2953      (closure U A = A)`,
2954   (* {{{ proof *)
2955  [
2956  DISCH_ALL_TAC;
2957  MATCH_MP_TAC SUBSET_ANTISYM;
2958  ASM_SIMP_TAC[subset_closure];
2959  ASM_SIMP_TAC[closure_subset;SUBSET_REFL];
2960  ]);;
2961  (* }}} *)
2962
2963 let closure_close = prove_by_refinement(
2964   `!U Z (A:A->bool). (topology_ U) /\ (Z SUBSET (UNIONS U)) ==>
2965      ((A = closure U Z) = ((Z SUBSET A) /\ (closed_ U A) /\
2966          (!B. (closed_ U B) /\ ((Z SUBSET B)) ==>
2967              (A SUBSET B))))`,
2968   (* {{{ proof *)
2969   [
2970   DISCH_ALL_TAC;
2971   EQ_TAC;
2972   DISCH_THEN (REWRT_TAC);
2973   ASM_SIMP_TAC[subset_closure;closure_closed;closure_subset];
2974   DISCH_ALL_TAC;
2975   REWRITE_TAC [closure];
2976   MATCH_MP_TAC (SUBSET_ANTISYM);
2977   CONJ_TAC;
2978   REWRITE_TAC[SUBSET_INTERS];
2979   REWRITE_TAC[IN_ELIM_THM'];
2980   ASM_MESON_TAC[];
2981   MATCH_MP_TAC  INTERS_SUBSET;
2982   REWRITE_TAC[IN_ELIM_THM'];
2983   ASM_REWRITE_TAC[];
2984   ]);;
2985   (* }}} *)
2986
2987 let closure_open = prove_by_refinement(
2988   `!U Z (A:A->bool). (topology_ U) /\ (Z SUBSET (UNIONS U)) ==>
2989      ((A = closure U Z) = ((Z SUBSET A) /\ (closed_ U A) /\
2990             (!B. (open_ U B) /\ ((B INTER Z) = EMPTY) ==>
2991              ((B INTER A) = EMPTY))))`,
2992   (* {{{ proof *)
2993
2994   [
2995   REP_GEN_TAC;
2996   DISCH_TAC;
2997   ASM_SIMP_TAC[closure_close];
2998   MATCH_MP_TAC (TAUT `( A ==> (B <=> C)) ==>   (A /\ B <=> A /\ C)`);
2999   DISCH_TAC;
3000   MATCH_MP_TAC (TAUT `( A ==> (B <=> C)) ==>   (A /\ B <=> A /\ C)`);
3001   DISCH_TAC;
3002   EQ_TAC;
3003   DISCH_TAC;
3004   USE 2 (REWRITE_RULE[closed]);
3005   ASM_REWRITE_TAC[];
3006   GEN_TAC;
3007   USE 3 (SPEC `(UNIONS U) DIFF (B:A->bool)`);
3008   DISCH_ALL_TAC;
3009   UND 3;
3010   ASM_SIMP_TAC[open_closed];
3011   ASM_REWRITE_TAC[DIFF_SUBSET];
3012   DISCH_TAC;
3013   UND 5;
3014   UND 3;
3015   REWRITE_TAC[INTER_COMM];
3016   ALL_TAC; (* co1 *)
3017   DISCH_ALL_TAC;
3018   DISCH_ALL_TAC;
3019   USE 3 (SPEC `(UNIONS U) DIFF (B:A->bool)`);
3020   UND 3;
3021   ASM_SIMP_TAC[closed_open];
3022   REWRITE_TAC[DIFF_INTER];
3023   ASM_SIMP_TAC[SUB_IMP_INTER];
3024   TYPE_THEN `A SUBSET (UNIONS U INTER A)` SUBGOAL_TAC;
3025   USE 2 (REWRITE_RULE[closed]);
3026   AND 2;
3027   UND 3;
3028   ALL_TAC; (* co2 *)
3029   SET_TAC[SUBSET;INTER];
3030   MESON_TAC [SUBSET_TRANS];
3031   ]);;
3032
3033   (* }}} *)
3034
3035
3036 (* induced topology *)
3037
3038 let image_top = prove_by_refinement(
3039  `!(U:(A->bool)->bool) (f:(A->bool)->(B->bool)).
3040     ((topology_ U) /\ (EMPTY = f EMPTY) /\
3041     (!a b. (a IN U) /\ (b IN U) ==>
3042       (((f a) INTER (f b)) = f (a INTER b))) /\
3043     (!V. (V SUBSET U) ==> (UNIONS (IMAGE f V) =f (UNIONS V) )))
3044     ==> (topology_ (IMAGE f U))`,
3045   (* {{{ proof *)
3046
3047  [
3048  REWRITE_TAC[topology];
3049  DISCH_ALL_TAC;
3050  DISCH_ALL_TAC;
3051  CONJ_TAC;
3052  REWRITE_TAC[IMAGE;IN];
3053  REWRITE_TAC[IN_ELIM_THM];
3054  ASM_MESON_TAC[];
3055  CONJ_TAC;
3056  REWRITE_TAC[IMAGE;IN];
3057  REWRITE_TAC[IN_ELIM_THM];
3058  DISCH_ALL_TAC;
3059  REPEAT (UNDISCH_FIND_THEN `(?)` CHOOSE_TAC);
3060  ASM_REWRITE_TAC[];
3061  EXISTS_TAC `(x:A->bool) INTER x'`;
3062  ASM_SIMP_TAC[IN];
3063  DISCH_THEN (fun t-> MP_TAC (MATCH_MP SUBSET_PREIMAGE t));
3064  DISCH_THEN CHOOSE_TAC;
3065  ASM_REWRITE_TAC[];
3066  ASM_SIMP_TAC[];
3067  REWRITE_TAC[IMAGE;IN_ELIM_THM];
3068  EXISTS_TAC `UNIONS (Z:(A->bool)->bool)`;
3069  ASM_SIMP_TAC[IN];
3070  ]);;
3071
3072 (* }}} *)
3073
3074 let induced_top_support = prove_by_refinement(
3075  `!U (C:A->bool). (UNIONS (induced_top U C) = ((UNIONS U) INTER C))`,
3076   (* {{{ proof *)
3077  [
3078  REWRITE_TAC[UNIONS_INTER];
3079  DISCH_ALL_TAC;
3080  AP_TERM_TAC;
3081  REWRITE_TAC[induced_top];
3082  AP_THM_TAC;
3083  AP_TERM_TAC;
3084  MATCH_MP_TAC EQ_EXT THEN BETA_TAC;
3085  SET_TAC[];
3086  ]);;
3087 (* }}} *)
3088
3089 let induced_top_top = prove_by_refinement(
3090   `!U (C:A->bool). (topology_ U) ==> (topology_ (induced_top U C))`,
3091   (* {{{ proof *)
3092   [
3093   REPEAT GEN_TAC;
3094   DISCH_TAC;
3095   REWRITE_TAC[induced_top];
3096   MATCH_MP_TAC image_top;
3097   ASM_REWRITE_TAC[];
3098   CONJ_TAC;
3099   SET_TAC[];
3100   CONJ_TAC;
3101   SET_TAC[];
3102   REWRITE_TAC[UNIONS_INTER];
3103   DISCH_ALL_TAC;
3104   AP_TERM_TAC;
3105   AP_THM_TAC;
3106   AP_TERM_TAC;
3107   MATCH_MP_TAC EQ_EXT THEN BETA_TAC;
3108   SET_TAC[];
3109   ]);;
3110 (* }}} *)
3111
3112 let induced_top_open = prove_by_refinement(
3113  `!U (C:A->bool) A. (topology_ U) ==> (induced_top U C A =
3114      (?B. (U B) /\ ((B INTER C) = A)))`,
3115   (* {{{ proof *)
3116  [
3117  DISCH_ALL_TAC;
3118  REWRITE_TAC[induced_top;IMAGE];
3119  REWRITE_TAC[IN_ELIM_THM];
3120  MESON_TAC[IN];
3121  ]);;
3122 (* }}} *)
3123
3124 let induced_trans = prove_by_refinement(
3125   `! U (A:A->bool) B. (topology_ U) /\ U A /\ (induced_top U A B) ==>
3126     (U B)`,
3127   (* {{{ proof *)
3128   [
3129   REWRITE_TAC[induced_top;IMAGE;IN ;IN_ELIM_THM'  ];
3130   DISCH_ALL_TAC;
3131   CHO 2;
3132   ASM_MESON_TAC[top_inter];
3133   ]);;
3134   (* }}} *)
3135
3136 let induced_top_unions = prove_by_refinement(
3137   `!(U:(A->bool)->bool). (topology_ U) ==>
3138         ((induced_top U (UNIONS U)) = U)`,
3139   (* {{{ proof *)
3140
3141   [
3142   DISCH_ALL_TAC;
3143   IMATCH_MP_TAC  EQ_EXT;
3144   GEN_TAC;
3145   ASM_SIMP_TAC[induced_top_open];
3146   EQ_TAC;
3147   DISCH_ALL_TAC;
3148   CHO 1;
3149   USE 0 (REWRITE_RULE[topology]);
3150   TYPE_THEN `B SUBSET (UNIONS U)` SUBGOAL_TAC;
3151   ASM_MESON_TAC[sub_union ];
3152   REWRITE_TAC[SUBSET_INTER_ABSORPTION];
3153   DISCH_TAC ;
3154   ASM_MESON_TAC[];
3155   DISCH_TAC ;
3156   TYPE_THEN `x` EXISTS_TAC;
3157   ASM_REWRITE_TAC[];
3158   TYPE_THEN `x SUBSET (UNIONS U)` SUBGOAL_TAC;
3159   ASM_MESON_TAC[sub_union ];
3160   REWRITE_TAC[SUBSET_INTER_ABSORPTION];
3161   ]);;
3162
3163   (* }}} *)
3164
3165 (* induced metric *)
3166
3167 let gen = euclid_def `gen (X:(A->bool)->bool)
3168   = {A | ?Y. (Y SUBSET X) /\ (A = UNIONS Y)}`;;
3169
3170 let top_of_metric_gen = prove_by_refinement(
3171   `!(X:(A)->bool) d. gen (open_balls(X,d))= (top_of_metric(X,d))`,
3172 (* {{{ proof *)
3173   [
3174   REWRITE_TAC[gen;top_of_metric];
3175   ]);;
3176 (* }}} *)
3177
3178 let gen_subset = prove_by_refinement(
3179   `!U (V:(A->bool)->bool).  (U SUBSET V) /\
3180      (!A. (A IN V) ==> (?Y. (Y SUBSET U) /\ (A = UNIONS Y)))
3181     ==> (gen U = (gen V))`,
3182 (* {{{ proof *)
3183   [
3184   DISCH_ALL_TAC;
3185   REWRITE_TAC[EXTENSION];
3186   GEN_TAC THEN EQ_TAC;
3187   REWRITE_TAC[IN_ELIM_THM;gen];
3188   DISCH_THEN CHOOSE_TAC;
3189   ASM_MESON_TAC[SUBSET_TRANS];
3190   REWRITE_TAC[IN_ELIM_THM;gen];
3191   DISCH_THEN CHOOSE_TAC;
3192   UNDISCH_FIND_THEN `(?)` (fun t-> MP_TAC(REWRITE_RULE[RIGHT_IMP_EXISTS_THM;SKOLEM_THM]t));
3193   DISCH_THEN CHOOSE_TAC;
3194   EXISTS_TAC `UNIONS (IMAGE (Y':(A->bool)->((A->bool)->bool)) (Y:(A->bool)->bool))`;
3195   CONJ_TAC;
3196   MATCH_MP_TAC UNIONS_SUBSET;
3197   REWRITE_TAC[IN_IMAGE];
3198   GEN_TAC;
3199   DISCH_THEN CHOOSE_TAC;
3200   ASM_MESON_TAC[IN;SUBSET];
3201   ASM_REWRITE_TAC[];
3202   REWRITE_TAC[UNIONS_IMAGE_UNIONS];
3203   AP_TERM_TAC;
3204   REWRITE_TAC[GSYM IMAGE_o];
3205   REWRITE_TAC[EXTENSION];
3206   X_GEN_TAC `A:(A->bool)`;
3207   REWRITE_TAC[IN_IMAGE;o_THM];
3208   ASM_MESON_TAC[SUBSET;IN];
3209   ]);;
3210 (* }}} *)
3211
3212 let gen_subspace = prove_by_refinement(
3213   `!(X:A->bool) Y d. (Y SUBSET X) /\ (metric_space(X,d)) ==>
3214      (induced_top (top_of_metric(X,d)) Y =
3215          gen (induced_top (open_balls(X,d)) Y))`,
3216 (* {{{ proof *)
3217   [
3218   DISCH_ALL_TAC;
3219   REWRITE_TAC[induced_top];
3220   REWRITE_TAC[EXTENSION];
3221   X_GEN_TAC `B:A->bool`;
3222   REWRITE_TAC[IN_IMAGE];
3223   EQ_TAC;
3224   DISCH_THEN (X_CHOOSE_TAC `C:A->bool`);
3225   FIRST_ASSUM MP_TAC;
3226   REWRITE_TAC[top_of_metric];
3227   REWRITE_TAC[IN_ELIM_THM];
3228   DISCH_ALL_TAC;
3229   UNDISCH_FIND_TAC `(?)`;
3230   DISCH_THEN (CHOOSE_TAC);
3231   UNDISCH_FIND_TAC `(INTER)`;
3232   ASM_REWRITE_TAC[UNIONS_INTER];
3233   REWRITE_TAC[gen;IN_ELIM_THM];
3234   EXISTS_TAC `IMAGE ((INTER) Y) (F':(A->bool)->bool)`;
3235   CONJ_TAC;
3236   REWRITE_TAC[INTER_THM];
3237   MATCH_MP_TAC IMAGE_SUBSET;
3238   ASM_REWRITE_TAC[];
3239   REFL_TAC;
3240   REWRITE_TAC[gen;IN_ELIM_THM];
3241   DISCH_THEN (CHOOSE_THEN MP_TAC);
3242   DISCH_ALL_TAC;
3243   IMP_RES_THEN MP_TAC SUBSET_PREIMAGE;
3244   DISCH_THEN CHOOSE_TAC;
3245   EXISTS_TAC `UNIONS (Z:(A->bool)->bool)`;
3246   CONJ_TAC;
3247   REWRITE_TAC[UNIONS_INTER];
3248   UNDISCH_FIND_THEN `(UNIONS)` (fun t -> REWRITE_TAC[t]);
3249   AP_TERM_TAC;
3250   UNDISCH_FIND_TAC `(SUBSET)`;
3251   REWRITE_TAC[INTER_THM];
3252   ASM_MESON_TAC[];
3253   REWRITE_TAC[top_of_metric;IN_ELIM_THM];
3254   ASM_MESON_TAC[];
3255   ]);;
3256 (* }}} *)
3257
3258 let gen_induced = prove_by_refinement(
3259  `!(X:A->bool) Y d. (Y SUBSET X) /\ (metric_space (X,d)) ==>
3260     (gen (open_balls(Y,d)) = gen (induced_top (open_balls(X,d)) Y))`,
3261 (* {{{ proof *)
3262  [
3263  DISCH_ALL_TAC;
3264  MATCH_MP_TAC gen_subset;
3265  CONJ_TAC;
3266  REWRITE_TAC[induced_top;SUBSET;open_balls];
3267  REWRITE_TAC [IN_IMAGE];
3268  X_GEN_TAC `A:(A->bool)`;
3269  REWRITE_TAC[IN_ELIM_THM];
3270  REPEAT (DISCH_THEN (CHOOSE_THEN MP_TAC));
3271  DISCH_TAC;
3272  ASM_REWRITE_TAC[];
3273  ASM_CASES_TAC `(Y:A->bool) (x:A)`;
3274  CONV_TAC (relabel_bound_conv);
3275  EXISTS_TAC `open_ball (X,d) (x:A) r`;
3276  CONJ_TAC;
3277  MATCH_MP_TAC open_ball_intersect;
3278  ASM_MESON_TAC[IN];
3279  MESON_TAC[];
3280  EXISTS_TAC `open_ball (X,d) (x:A) (--. (&.1))`;
3281  CONJ_TAC;
3282  ASM_MESON_TAC[IN;INTER_EMPTY;open_ball_empty;open_ball_neg_radius;REAL_ARITH `(--.(&.1) <. (&.0))`];
3283  MESON_TAC[];  (* end of first half *)
3284  REWRITE_TAC[induced_top;IN_IMAGE];
3285  GEN_TAC;
3286  DISCH_THEN (CHOOSE_THEN MP_TAC);
3287  NAME_CONFLICT_TAC;
3288  REWRITE_TAC[IN;open_balls];
3289  REWRITE_TAC[IN_ELIM_THM'];
3290  NAME_CONFLICT_TAC;
3291  DISCH_ALL_TAC;
3292  ASM_REWRITE_TAC[];
3293  FIRST_ASSUM (CHOOSE_THEN ASSUME_TAC);
3294  FIRST_ASSUM (CHOOSE_THEN ASSUME_TAC);
3295  SUBGOAL_TAC `!(a:A). (a IN x INTER Y) ==> (?r. ((&.0) <. r) /\ open_ball(Y,d) a r SUBSET (x INTER Y))`;
3296  DISCH_ALL_TAC;
3297  TYPEL_THEN [`X`;`d`;`a`;`x'`;`r'`] (fun t -> (CLEAN_ASSUME_TAC (ISPECL t open_ball_center)));
3298  SUBGOAL_TAC `(a:A) IN open_ball(X,d) x' r'`;
3299  ASM_MESON_TAC[IN_INTER];
3300  DISCH_THEN (fun t -> ANTE_RES_THEN (MP_TAC) t);
3301  DISCH_THEN (CHOOSE_TAC);
3302  EXISTS_TAC `r'':real`;
3303  ASM_REWRITE_TAC[SUBSET_INTER;open_ball_subset];
3304  ASM_MESON_TAC[open_ball_subspace;SUBSET_TRANS];
3305  DISCH_THEN (fun t -> MP_TAC (REWRITE_RULE[RIGHT_IMP_EXISTS_THM;SKOLEM_THM] t));
3306  DISCH_THEN CHOOSE_TAC;
3307  EXISTS_TAC `IMAGE (\t. open_ball(Y,d) t (r t) ) ((x:A->bool) INTER Y)`;
3308  REWRITE_TAC[SUBSET_INTER];
3309  CONJ_TAC;
3310  REWRITE_TAC[SUBSET;IN_ELIM_THM'];
3311  REWRITE_TAC[IN_IMAGE];
3312  GEN_TAC;
3313  MESON_TAC[];
3314  MATCH_MP_TAC SUBSET_ANTISYM;
3315  CONJ_TAC;
3316  REWRITE_TAC[SUBSET];
3317  GEN_TAC;
3318  REWRITE_TAC[IN_UNIONS];
3319  DISCH_TAC;
3320  EXISTS_TAC `open_ball (Y,d) (x'':A) (r x'')`;
3321  REWRITE_TAC[IN_IMAGE];
3322  CONJ_TAC;
3323  NAME_CONFLICT_TAC;
3324  EXISTS_TAC `x'':A`;
3325  ASM_REWRITE_TAC[];
3326  MATCH_MP_TAC open_ball_nonempty;
3327  ASM_SIMP_TAC[metric_subspace];
3328  ASM_MESON_TAC[IN_INTER;IN;metric_subspace];
3329  MATCH_MP_TAC UNIONS_SUBSET;
3330  GEN_TAC;
3331  REWRITE_TAC[IN_IMAGE];
3332  DISCH_THEN CHOOSE_TAC;
3333  ASM_MESON_TAC[];
3334  ]);;
3335 (* }}} *)
3336
3337 let top_of_metric_induced = prove_by_refinement(
3338   `!(X:A->bool) Y d. (Y SUBSET X) /\ (metric_space(X,d)) ==>
3339     (induced_top (top_of_metric(X,d)) Y = (top_of_metric(Y,d)))`,
3340 (* {{{ proof *)
3341   [
3342   SIMP_TAC[gen_subspace];
3343   REPEAT GEN_TAC;
3344   REWRITE_TAC[GSYM top_of_metric_gen];
3345   MESON_TAC[gen_induced];
3346   ]);;
3347 (* }}} *)
3348
3349 (* ------------------------------------------------------------------ *)
3350 (* Continuity *)
3351 (* ------------------------------------------------------------------ *)
3352
3353
3354 let continuous = euclid_def `continuous (f:A->B) U V <=> !v.
3355   (v IN V) ==> (preimage (UNIONS U) f v) IN U`;;
3356
3357 let metric_continuous_pt = euclid_def
3358   `metric_continuous_pt (f:A->B) (X,dX) ((Y:B->bool),dY) x =
3359   !epsilon. ?delta. (((&.0) < epsilon) ==> ((&.0) <. delta) /\
3360     (!y. ((x IN X) /\ (y IN X) /\ (dX x y) <. delta) ==>
3361      (dY (f x) (f y) <. epsilon)))`;;
3362
3363 let metric_continuous = euclid_def
3364   `metric_continuous (f:A->B) (X,dX) (Y,dY) <=> !x.
3365     metric_continuous_pt f (X,dX) (Y,dY) x`;;
3366
3367 let metric_continuous_pt_domain = prove_by_refinement(`!f X dX Y dY x .
3368    ~(x IN X) ==> (metric_continuous_pt (f:A->B) (X,dX) (Y,dY) x)`,
3369   (* {{{ proof *)
3370
3371  [
3372  REWRITE_TAC[metric_continuous_pt];
3373  MESON_TAC[];
3374  ]);;
3375
3376  (* }}} *)
3377
3378 let metric_continuous_continuous = prove_by_refinement(
3379   `!f X Y dX dY. (IMAGE f X SUBSET Y) /\ (metric_space(X,dX)) /\ (metric_space(Y,dY))
3380     ==>
3381    (continuous (f:A->B) (top_of_metric(X,dX)) (top_of_metric(Y,dY))
3382    <=> (metric_continuous f (X,dX) (Y,dY)))`,
3383   (* {{{ proof *)
3384   [
3385   DISCH_ALL_TAC;
3386   EQ_TAC;
3387   REWRITE_TAC[continuous;metric_continuous];
3388   DISCH_TAC;
3389   GEN_TAC;
3390   ASM_CASES_TAC `(x:A) IN X` THENL[ALL_TAC;ASM_SIMP_TAC[metric_continuous_pt_domain]];
3391   REWRITE_TAC[metric_continuous_pt];
3392   GEN_TAC;
3393   SUBGOAL_TAC `(open_ball (Y,dY) ((f:A->B) x) epsilon) IN (top_of_metric(Y,dY))`;
3394   MATCH_MP_TAC (prove_by_refinement(`!(x:A) B. (?A. (x IN A /\ A SUBSET B)) ==> (x IN B)`,[SET_TAC[]]));
3395   EXISTS_TAC `open_balls((Y:B->bool),dY)`;
3396   REWRITE_TAC[top_of_metric_open_balls];
3397   REWRITE_TAC[open_balls;IN_ELIM_THM'];
3398   MESON_TAC[];
3399   DISCH_THEN (ANTE_RES_THEN ASSUME_TAC);
3400   REWRITE_TAC[GSYM RIGHT_IMP_EXISTS_THM];
3401   DISCH_TAC;
3402   SUBGOAL_TAC `(x:A) IN preimage (UNIONS (top_of_metric (X,dX))) f (open_ball (Y,dY) ((f:A->B) x) epsilon)`;
3403   REWRITE_TAC[in_preimage];
3404   SUBGOAL_TAC `(Y:B->bool) ((f:A->B) x )`;
3405   UNDISCH_FIND_TAC `IMAGE`;
3406   UNDISCH_TAC `(x:A) IN X`;
3407   REWRITE_TAC[SUBSET;IMAGE];
3408   REWRITE_TAC[IN_ELIM_THM'];
3409   NAME_CONFLICT_TAC;
3410   REWRITE_TAC[IN];
3411   MESON_TAC[];
3412   ASM_MESON_TAC[top_of_metric_unions;open_ball_nonempty];
3413   ABBREV_TAC `B = preimage (UNIONS (top_of_metric (X,dX))) (f:A->B) (open_ball (Y,dY) (f x) epsilon)`;
3414   DISCH_TAC;
3415   SUBGOAL_TAC `?r. (&.0 <. r) /\ (open_ball(X,dX) (x:A) r SUBSET B)`;
3416   ASSUME_TAC top_of_metric_nbd;
3417   ASM_MESON_TAC[IN];
3418   DISCH_THEN CHOOSE_TAC;
3419   EXISTS_TAC `r:real`;
3420   ASM_REWRITE_TAC[];
3421   GEN_TAC;
3422   DISCH_ALL_TAC;
3423   SUBGOAL_TAC `y:A IN B`;
3424   MATCH_MP_TAC (prove_by_refinement(`!(x:A) B. (?A. (x IN A /\ A SUBSET B)) ==> (x IN B)`,[SET_TAC[]]));
3425   EXISTS_TAC `open_ball(X,dX) (x:A) r`;
3426   ASM_REWRITE_TAC[];
3427   REWRITE_TAC[open_ball;IN_ELIM_THM'];
3428   ASM_MESON_TAC[IN];
3429   UNDISCH_FIND_TAC `preimage`;
3430   DISCH_THEN (fun t-> REWRITE_TAC[GSYM t]);
3431   REWRITE_TAC[in_preimage];
3432   REWRITE_TAC[open_ball;IN_ELIM_THM'];
3433   MESON_TAC[]; (* first half done *)
3434   REWRITE_TAC[metric_continuous];
3435   DISCH_TAC;
3436   REWRITE_TAC[continuous];
3437   GEN_TAC;
3438   DISCH_TAC;
3439   REWRITE_TAC[IN];
3440   ASM_SIMP_TAC[top_of_metric_nbd];
3441   ASM_SIMP_TAC[GSYM top_of_metric_unions];
3442   CONJ_TAC;
3443   REWRITE_TAC[SUBSET;in_preimage];
3444   MESON_TAC[];
3445   GEN_TAC;
3446   DISCH_THEN (fun t -> ASSUME_TAC t THEN (MP_TAC (REWRITE_RULE[in_preimage] t)));
3447   DISCH_ALL_TAC;
3448   SUBGOAL_TAC `?eps. (&.0 <. eps) /\ (open_ball(Y,dY) ((f:A->B) a) eps SUBSET v)`;
3449   UNDISCH_FIND_TAC `v IN top_of_metric (Y,dY)`;
3450   REWRITE_TAC[IN];
3451   ASM_SIMP_TAC[top_of_metric_nbd];
3452   DISCH_THEN CHOOSE_TAC;
3453   FIRST_ASSUM (fun t -> MP_TAC (SPEC `a:A` t));
3454   REWRITE_TAC[metric_continuous_pt];
3455   DISCH_THEN (fun t-> MP_TAC (SPEC `eps:real` t));
3456   DISCH_THEN (CHOOSE_THEN MP_TAC);
3457   ASM_REWRITE_TAC[];
3458   DISCH_ALL_TAC;
3459   EXISTS_TAC `delta:real`;
3460   ASM_REWRITE_TAC[SUBSET];
3461   REWRITE_TAC[in_preimage;open_ball];
3462   REWRITE_TAC[IN_ELIM_THM'];
3463   X_GEN_TAC `y:A`;
3464   DISCH_ALL_TAC;
3465   CONJ_TAC THENL [(ASM_REWRITE_TAC[IN]);ALL_TAC];
3466   FIRST_ASSUM (fun t -> (MP_TAC (SPEC `y:A` t)));
3467   ASM_REWRITE_TAC[IN];
3468   UNDISCH_FIND_TAC `open_ball`;
3469   REWRITE_TAC[open_ball];
3470   DISCH_THEN (fun t  -> (MP_TAC (CONJUNCT2 t)));
3471   REWRITE_TAC[SUBSET];
3472   DISCH_THEN (fun t-> (MP_TAC (SPEC `(f:A->B) y` t)));
3473   ASM_REWRITE_TAC[IN_ELIM_THM'];
3474   SUBGOAL_TAC `!x. (X x) ==> (Y ((f:A->B) x))`;
3475   UNDISCH_FIND_TAC `IMAGE`;
3476   REWRITE_TAC[SUBSET;IN_IMAGE];
3477   NAME_CONFLICT_TAC;
3478   ASM_MESON_TAC[IN];
3479   ASM_MESON_TAC[IN];
3480   ]);;
3481   (* }}} *)
3482
3483 let continuous_induced = prove_by_refinement(
3484   `!(f:A->B) U V A. (topology_ V) /\ (continuous f U V) /\ (V A) ==>
3485        (continuous f U (induced_top V A)) `,
3486   (* {{{ proof *)
3487   [
3488   REWRITE_TAC[continuous;induced_top;IN_IMAGE;Q_ELIM_THM''  ];
3489   ASM_MESON_TAC[top_inter;IN ];
3490   ]);;
3491   (* }}} *)
3492
3493 let metric_cont = prove_by_refinement(
3494   `!U X d f. (metric_space(X,d)) /\ (topology_ U) ==>
3495     ((continuous (f:A->B) U (top_of_metric(X,d))) =
3496       (!(x:B) r. U (preimage (UNIONS U) f (open_ball (X,d) x r))))`,
3497   (* {{{ proof *)
3498   [
3499   DISCH_ALL_TAC;
3500   EQ_TAC;
3501   DISCH_ALL_TAC;
3502   DISCH_ALL_TAC;
3503   USE 2 (REWRITE_RULE[continuous;IN]);
3504   UND 2 THEN (DISCH_THEN MATCH_MP_TAC );
3505   ASM_MESON_TAC [open_ball_open];
3506   REWRITE_TAC[continuous;IN];
3507   DISCH_ALL_TAC;
3508   REWRITE_TAC[top_of_metric;IN_ELIM_THM' ];
3509   DISCH_ALL_TAC;
3510   CHO 3;
3511   AND 3;
3512   ASM_REWRITE_TAC[];
3513   REWRITE_TAC[preimage_unions];
3514   IMATCH_MP_TAC  top_unions ;
3515   ASM_REWRITE_TAC[IMAGE;SUBSET;IN;IN_ELIM_THM' ];
3516   NAME_CONFLICT_TAC;
3517   REWRITE_TAC[Q_ELIM_THM'];
3518   USE 4 (REWRITE_RULE[SUBSET;IN]);
3519   DISCH_ALL_TAC;
3520   TYPE_THEN `x'` (USE 4 o SPEC);
3521   REWR 4;
3522   USE 4 (REWRITE_RULE[open_balls;IN_ELIM_THM' ]);
3523   CHO 4;
3524   CHO 4;
3525   ASM_MESON_TAC[];
3526   ]);;
3527   (* }}} *)
3528
3529 let continuous_sum = prove_by_refinement(
3530   `!U (f:A->(num->real)) g n. (topology_ U) /\
3531    (continuous f U (top_of_metric(euclid n,d_euclid))) /\
3532    (continuous g U (top_of_metric(euclid n,d_euclid))) /\
3533    (IMAGE f (UNIONS U) SUBSET (euclid n)) /\
3534    (IMAGE g (UNIONS U) SUBSET (euclid n)) ==>
3535    (continuous (\t. (f t + g t))  U (top_of_metric(euclid n,d_euclid)))`,
3536   (* {{{ proof *)
3537   [
3538   ASSUME_TAC metric_euclid;
3539   DISCH_ALL_TAC;
3540   ASM_SIMP_TAC[metric_cont];
3541   DISCH_ALL_TAC;
3542   ONCE_ASM_SIMP_TAC[open_nbd];
3543   X_GEN_TAC `t:A`;
3544   RIGHT_TAC "B";
3545   DISCH_ALL_TAC;
3546   USE 6 (REWRITE_RULE[REWRITE_RULE[IN] in_preimage]);
3547   USE 2 (REWRITE_RULE[continuous]);
3548   USE 3 (REWRITE_RULE[continuous]);
3549   AND 6;
3550   TYPE_THEN `n` (USE 0 o SPEC);
3551   COPY 0;
3552   JOIN 8 6;
3553   USE 6 (MATCH_MP (REWRITE_RULE[IN] open_ball_center));
3554   CHO 6;
3555   AND 6;
3556   TYPE_THEN `open_ball(euclid n,d_euclid) (f t) (r'/(&.2))` (USE 2 o SPEC);
3557   TYPE_THEN `open_ball(euclid n,d_euclid) (g t) (r'/(&.2))` (USE 3 o SPEC);
3558   UND 3;
3559   UND 2;
3560   REWRITE_TAC[IN];
3561   ASM_SIMP_TAC[open_ball_open];
3562   DISCH_ALL_TAC;
3563   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 ;
3564   TYPE_THEN `B` EXISTS_TAC;
3565   CONJ_TAC;
3566   (* cs1 *)
3567   USE 6 (MATCH_MP preimage_subset );
3568   TYPEL_THEN [`(\t. euclid_plus (f t) (g t))`;`UNIONS U`] (USE 6 o ISPECL);
3569   UND 6;
3570   IMATCH_MP_TAC  (prove_by_refinement(`!D B C. ((B:A->bool) SUBSET D) ==> ((D SUBSET C) ==> (B SUBSET C))`,[MESON_TAC [SUBSET_TRANS]]));
3571   REWRITE_TAC[subset_preimage];
3572   CONJ_TAC;
3573   REWRITE_TAC[SUBSET;IN;IN_ELIM_THM'];
3574   EXPAND_TAC "B";
3575   REWRITE_TAC[INTER;in_preimage;IN ;IN_ELIM_THM'  ];
3576   ASM_MESON_TAC[];
3577   REWRITE_TAC[IMAGE;SUBSET;IN;IN_ELIM_THM'];
3578   REWRITE_TAC[Q_ELIM_THM'];
3579   EXPAND_TAC "B";
3580   REWRITE_TAC[INTER;in_preimage;IN ;IN_ELIM_THM'  ];
3581   REWRITE_TAC[open_ball;IN_ELIM_THM' ];
3582   DISCH_ALL_TAC;
3583   ASM_SIMP_TAC[euclid_add_closure];
3584   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;
3585   TYPEL_THEN [`euclid n`;`d_euclid`] (fun t-> ASSUME_TAC (ISPECL t metric_space_triangle));
3586   REWR 17;
3587   UND 17 THEN DISCH_THEN IMATCH_MP_TAC  ;
3588   ASM_SIMP_TAC[euclid_add_closure];
3589   IMATCH_MP_TAC  (REAL_ARITH `b + C < d ==> (a <= b + C ==> (a < d))`);
3590   (* cs2 *)
3591   IMATCH_MP_TAC real_half_LT;
3592   CONJ_TAC;
3593   ASM_MESON_TAC  [euclid_add_closure;SPEC `n:num` metric_translate];
3594   ASM_MESON_TAC[euclid_add_closure;metric_translate_LEFT];
3595   CONJ_TAC;
3596   EXPAND_TAC "B";
3597   REWRITE_TAC[INTER;in_preimage ;IN_ELIM_THM];
3598   ASM_REWRITE_TAC[IN];
3599   UND 4;
3600   UND 5;
3601   REWRITE_TAC[SUBSET;IN;IN_IMAGE ;IN_ELIM_THM'];
3602   NAME_CONFLICT_TAC;
3603   REWRITE_TAC[Q_ELIM_THM''];
3604   USE 8 (ONCE_REWRITE_RULE [GSYM REAL_LT_HALF1]);
3605   ASM_MESON_TAC[REWRITE_RULE[IN] open_ball_nonempty];
3606   EXPAND_TAC "B";
3607   IMATCH_MP_TAC  top_inter;
3608   ASM_REWRITE_TAC[];
3609   ]);;
3610   (* }}} *)
3611
3612
3613 (* ------------------------------------------------------------------ *)
3614 (* Cauchy sequences and completeness *)
3615 (* ------------------------------------------------------------------ *)
3616
3617
3618 let sequence = euclid_def
3619   `sequence X (f:num->A) <=> (IMAGE f UNIV) SUBSET X`;;
3620
3621 let converge = euclid_def
3622   `converge (X,d) (f:num -> A) <=> (?x. (x IN (X:A->bool)) /\
3623    (!eps. ?n. (&.0 <. eps) ==>
3624         (!i. (n <=| i) ==> (d x (f i) <. eps))))`;;
3625
3626 let cauchy_seq = euclid_def
3627   `cauchy_seq (X,d) (f:num->A) <=> (sequence X f) /\
3628     (!eps. ?n. !i j. (&.0 <. eps) /\
3629         (n <= i) /\ (n <= j) ==> (d (f i) (f j) <. eps))`;;
3630
3631 let complete = euclid_def
3632   `complete (X,d) <=> !(f:num->A). cauchy_seq (X,d) f ==>
3633     converge (X,d) f`;;
3634
3635 let converge_cauchy = prove_by_refinement(
3636   `!X d f. metric_space(X,d) /\ (sequence X f) /\ (converge((X:A->bool),d) f)
3637     ==> cauchy_seq(X,d) f`,
3638   (* {{{ proof *)
3639
3640   [
3641   REWRITE_TAC[converge;metric_space];
3642   DISCH_ALL_TAC;
3643   REWRITE_TAC[cauchy_seq];
3644   ASM_REWRITE_TAC[];
3645   FIRST_ASSUM CHOOSE_TAC;
3646   GEN_TAC;
3647   UNDISCH_FIND_TAC `(IN)`;
3648   DISCH_ALL_TAC;
3649   FIRST_ASSUM (fun t-> MP_TAC (SPEC `eps/(&.2)` t));
3650   DISCH_THEN CHOOSE_TAC;
3651   EXISTS_TAC `n:num`;
3652   REPEAT GEN_TAC;
3653   DISCH_ALL_TAC;
3654   SUBGOAL_TAC ` (&.0 <. (eps/(&.2)))`;
3655   MATCH_MP_TAC REAL_LT_DIV;
3656   ASM_REWRITE_TAC[];
3657   REAL_ARITH_TAC;
3658   DISCH_THEN (ANTE_RES_THEN ASSUME_TAC);
3659   UNDISCH_TAC `n <=| i`;
3660   DISCH_THEN (ANTE_RES_THEN ASSUME_TAC);
3661   UNDISCH_TAC `n <=| j`;
3662   DISCH_THEN (ANTE_RES_THEN ASSUME_TAC);
3663   FIRST_ASSUM (fun t-> MP_TAC (SPECL [`(f:num->A) i`;`x:A`;`(f:num->A) j`] t));
3664   UNDISCH_FIND_TAC `sequence`;
3665   REWRITE_TAC[sequence;SUBSET;IN_IMAGE;IN_UNIV];
3666   NAME_CONFLICT_TAC;
3667   REWRITE_TAC[IN];
3668   DISCH_TAC;
3669   SUBGOAL_TAC `X ((f:num->A) i) /\ X x /\ X (f j)`;
3670   ASM_MESON_TAC[IN];
3671   DISCH_THEN (fun t->REWRITE_TAC[t]);
3672   DISCH_ALL_TAC;
3673   ASM_MESON_TAC[REAL_LET_TRANS;REAL_LT_ADD2;REAL_HALF_DOUBLE];
3674   ]);;
3675
3676   (* }}} *)
3677
3678
3679 (* relate the metric space version to the real numbers version *)
3680 let cauchy_seq_cauchy = prove_by_refinement(
3681   `!f. (cauchy_seq(euclid 1,d_euclid) f) ==> (cauchy (\x. (f x 0)))`,
3682   (* {{{ proof *)
3683   [
3684   GEN_TAC;
3685   REWRITE_TAC[cauchy_seq;cauchy;sequence;SUBSET;IN_IMAGE;IN_UNIV];
3686   REWRITE_TAC[IN];
3687   NAME_CONFLICT_TAC;
3688   DISCH_ALL_TAC;
3689   GEN_TAC;
3690   DISCH_TAC;
3691   FIRST_ASSUM (fun t -> MP_TAC (SPEC `e':real` t));
3692   DISCH_THEN CHOOSE_TAC;
3693   EXISTS_TAC `n':num`;
3694   REPEAT GEN_TAC;
3695   REWRITE_TAC[ARITH_RULE `a >=| b <=> b <=| a`];
3696   SUBGOAL_TAC `euclid 1 (f (m':num)) /\ euclid 1 (f (n'':num))`;
3697   ASM_MESON_TAC[];
3698   ASM_MESON_TAC[euclid1_abs];
3699   ]);;
3700   (* }}} *)
3701
3702 (* a variant of SEQ_CAUCHY *)
3703 let complete_real = prove_by_refinement(
3704   `complete (euclid 1,d_euclid)`,
3705   (* {{{ proof *)
3706
3707   [
3708   REWRITE_TAC[complete;converge];
3709   GEN_TAC;
3710   DISCH_THEN (fun t-> ASSUME_TAC t THEN MP_TAC t);
3711   DISCH_THEN (fun t -> MP_TAC (MATCH_MP cauchy_seq_cauchy t));
3712   REWRITE_TAC[SEQ_CAUCHY;SEQ_LIM;tends_num_real;SEQ_TENDS];
3713   ABBREV_TAC `z = lim (\x. f x 0)`;
3714   REWRITE_TAC[MR1_DEF];
3715   DISCH_TAC;
3716   ABBREV_TAC `c = \j. (if (j=0) then (z:real) else (&.0))`;
3717   EXISTS_TAC `(c:num->real)`;
3718   SUBGOAL_TAC `c IN (euclid 1)`;
3719   REWRITE_TAC[IN;euclid];
3720   EXPAND_TAC "c";
3721   GEN_TAC;
3722   COND_CASES_TAC;
3723   ASM_REWRITE_TAC[];
3724   ARITH_TAC;
3725   ARITH_TAC;
3726   DISCH_TAC;
3727   ASM_REWRITE_TAC[];
3728   GEN_TAC;
3729   REWRITE_TAC[GSYM RIGHT_IMP_EXISTS_THM];
3730   DISCH_TAC;
3731   FIRST_ASSUM (fun t-> (MP_TAC (SPEC `eps:real` t)));
3732   FIRST_ASSUM (fun t-> REWRITE_TAC[t]);
3733   DISCH_THEN CHOOSE_TAC;
3734   EXISTS_TAC `N:num`;
3735   GEN_TAC;
3736   SUBGOAL_TAC `euclid 1 (f (i:num))`;
3737   UNDISCH_FIND_TAC `cauchy_seq`;
3738   REWRITE_TAC[cauchy_seq;sequence;SUBSET;IN_IMAGE;IN_UNIV];
3739   DISCH_THEN (fun t-> MP_TAC (CONJUNCT1 t));
3740   REWRITE_TAC[IN];
3741   MESON_TAC[];
3742   UNDISCH_FIND_TAC `(IN)`;
3743   REWRITE_TAC[IN];
3744   SIMP_TAC[euclid1_abs];
3745   DISCH_ALL_TAC;
3746   EXPAND_TAC "c";
3747   COND_CASES_TAC;
3748   ASM_MESON_TAC[ARITH_RULE `n >=| N <=> N <= n`];
3749   ASM_MESON_TAC[];
3750   ]);;
3751
3752   (* }}} *)
3753
3754 let sequence_in = prove_by_refinement(
3755   `!X (f:num->A) i. sequence X f ==> X (f i)`,
3756   (* {{{ proof *)
3757
3758   [
3759   REPEAT GEN_TAC;
3760   REWRITE_TAC[sequence;SUBSET;IN_IMAGE;IN_UNIV];
3761   REWRITE_TAC[IN];
3762   MESON_TAC[];
3763   ]);;
3764
3765   (* }}} *)
3766
3767 let proj_cauchy = prove_by_refinement(
3768   `!i f n. cauchy_seq (euclid n,d_euclid) f ==>
3769      (cauchy_seq (euclid 1,d_euclid) ((proj i) o f))`,
3770   (* {{{ proof *)
3771
3772   [
3773   REWRITE_TAC[cauchy_seq];
3774   DISCH_ALL_TAC;
3775   SUBGOAL_TAC `sequence (euclid 1) (proj (i:num) o f)`;
3776   REWRITE_TAC[sequence;SUBSET;IN_IMAGE;o_DEF;IN_UNIV];
3777   NAME_CONFLICT_TAC;
3778   MESON_TAC[IN;proj_euclid1];
3779   DISCH_TAC;
3780   ASM_REWRITE_TAC[];
3781   GEN_TAC;
3782   FIRST_ASSUM (fun t -> CHOOSE_TAC (SPEC `eps:real` t));
3783   EXISTS_TAC `n':num`;
3784   DISCH_ALL_TAC;
3785   FIRST_ASSUM (fun t-> MP_TAC(SPECL [`i':num`;`j:num`] t));
3786   UNDISCH_FIND_THEN `d_euclid` (fun t-> ALL_TAC);
3787   ASM_REWRITE_TAC[];
3788   MATCH_MP_TAC (REAL_ARITH `a <=. b ==> (b <. eps ==> a <. eps)`);
3789   REWRITE_TAC[o_DEF;proj_d_euclid];
3790   MATCH_MP_TAC proj_contraction;
3791   EXISTS_TAC `n:num`;
3792   ASM_MESON_TAC[sequence_in];
3793   ]);;
3794
3795   (* }}} *)
3796
3797 let complete_euclid = prove_by_refinement(
3798   `!n. complete (euclid n,d_euclid)`,
3799   (* {{{ proof *)
3800   [
3801   REWRITE_TAC[complete;IN];
3802   REPEAT GEN_TAC;
3803   DISCH_ALL_TAC;
3804   IMP_RES_THEN MP_TAC proj_cauchy;
3805   DISCH_TAC;
3806   SUBGOAL_TAC `!i. converge (euclid 1,d_euclid) (proj i o f)`;
3807   GEN_TAC;
3808   ASM_MESON_TAC[complete;complete_real];
3809   REWRITE_TAC[converge;IN];
3810   DISCH_THEN (fun t-> MP_TAC (ONCE_REWRITE_RULE[SKOLEM_THM] t));
3811   DISCH_THEN (X_CHOOSE_TAC `L:num->(num->real)`);
3812   EXISTS_TAC `(\j. ((L:num->num->real) j 0))`;
3813   SUBCONJ_TAC;
3814   REWRITE_TAC[euclid];
3815   GEN_TAC;
3816   FIRST_ASSUM (fun t->(MP_TAC (SPEC `m:num` t)));
3817   DISCH_ALL_TAC;
3818   FIRST_ASSUM (fun t-> (MP_TAC (SPEC `abs((L:num->num->real) m 0)` t)));
3819   DISCH_THEN CHOOSE_TAC;
3820   PROOF_BY_CONTR_TAC;
3821   ASSUME_TAC (REAL_ARITH `!x. ~(x=(&.0)) ==> (&.0 <. abs(x))`);
3822   UNDISCH_FIND_TAC `d_euclid`;
3823   ASM_SIMP_TAC[];
3824   REWRITE_TAC[GSYM EXISTS_NOT_THM];
3825   EXISTS_TAC `(n:num)+n'`;
3826   REWRITE_TAC[o_DEF];
3827   REWRITE_TAC[ARITH_RULE `n' <=| n+| n'`];
3828   MATCH_MP_TAC(REAL_ARITH `(x = y) ==> ~(x<y)`);
3829   ALL_TAC; (* #buffer "CE1"; *)
3830   SUBGOAL_TAC `euclid 1 (proj m (f (n +| n')))`;
3831   REWRITE_TAC[proj_euclid1];
3832   ASM_SIMP_TAC[euclid1_abs];
3833   DISCH_TAC;
3834   MATCH_MP_TAC (REAL_ARITH `(&.0 = x) ==> (abs(u - x) = abs(u))`);
3835   REWRITE_TAC[proj];
3836   SUBGOAL_TAC `euclid n (f (n+| n'))`;
3837   ASM_MESON_TAC[cauchy_seq;sequence_in];
3838   REWRITE_TAC[euclid];
3839   DISCH_THEN (fun t->  ASM_SIMP_TAC[t]);
3840   ALL_TAC; (* #buffer "CE2"; *)
3841   DISCH_TAC;
3842   GEN_TAC;
3843   CONV_TAC (quant_right_CONV "n");
3844   DISCH_TAC;
3845   USE 2 (CONV_RULE (quant_left_CONV "eps"));
3846   USE 2 (CONV_RULE (quant_left_CONV "eps"));
3847   USE 2 (SPEC `eps/(&.1 +. &. n)`);
3848   USE 2 (CONV_RULE (quant_left_CONV "n'"));
3849   USE 2 (CONV_RULE (quant_left_CONV "n'"));
3850   CHO 2;
3851   SUBGOAL_TAC `&.0 <. eps/ (&.1 +. &.n)`;
3852   MATCH_MP_TAC REAL_LT_DIV;
3853   ASM_REWRITE_TAC[REAL_OF_NUM_ADD;REAL_OF_NUM_LT];
3854   ARITH_TAC;
3855   DISCH_THEN (fun t-> (USE 2 (REWRITE_RULE[t])));
3856   SUBGOAL_TAC `!i j. euclid 1 ((proj i o f) (j:num))`;
3857   ASM_MESON_TAC[cauchy_seq;sequence_in];
3858   DISCH_TAC;
3859   SUBGOAL_TAC `!i. euclid n (f (i:num))`;
3860   GEN_TAC;
3861   ASM_MESON_TAC[cauchy_seq;sequence_in];
3862   DISCH_TAC;
3863   ASM_SIMP_TAC[d_euclid_n];
3864   SUBGOAL_TAC `!(j:num). ?c. !i. (c <=| i) ==> ||. (L j 0 -. f i j) <. eps/(&.1 + &. n)`;
3865   CONV_TAC (quant_left_CONV "c");
3866   EXISTS_TAC `n':num->num`;
3867   REPEAT GEN_TAC;
3868   USE 2 ((SPEC `j:num`));
3869   UND 2;
3870   DISCH_ALL_TAC;
3871   USE 8 (SPEC `i:num`);
3872   UND 8;
3873   ASM_REWRITE_TAC[];
3874   ASM_SIMP_TAC[euclid1_abs];
3875   REWRITE_TAC[proj;o_DEF];
3876   CONV_TAC (quant_left_CONV "c");
3877   DISCH_THEN CHOOSE_TAC;
3878   ABBREV_TAC `t = (\u. (if (u <| n) then (c u) else (0)))`;
3879   SUBGOAL_TAC `?M. (!j. (t:num->num) j <=| M)`;
3880   MATCH_MP_TAC max_num_sequence;
3881   EXISTS_TAC `n:num`;
3882   GEN_TAC;
3883   EXPAND_TAC "t";
3884   COND_CASES_TAC;
3885   ASM_MESON_TAC[ARITH_RULE `m <| n ==> ~(n <= m)`];
3886   REWRITE_TAC[];
3887   DISCH_THEN CHOOSE_TAC;
3888   EXISTS_TAC `M:num`;
3889   GEN_TAC;
3890   ALL_TAC; (* #set "CE3"; *)
3891   DISCH_TAC;
3892   MATCH_MP_TAC REAL_POW_2_LT;
3893   CONJ_TAC;
3894   MATCH_MP_TAC SQRT_POS_LE;
3895   REWRITE_TAC[REAL_SUM_SQUARE_POS];
3896   CONJ_TAC;
3897   UND 4;
3898   REAL_ARITH_TAC;
3899   SIMP_TAC[REAL_SUM_SQUARE_POS;SQRT_POW_2];
3900   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)))`;
3901   MATCH_MP_TAC SUM_LE;
3902   BETA_TAC;
3903   GEN_TAC;
3904   DISCH_ALL_TAC;
3905   SUBGOAL_TAC `c (r:num) = (t:num->num) r`;
3906   EXPAND_TAC "t";
3907   COND_CASES_TAC;
3908   REFL_TAC;
3909   ASM_MESON_TAC[ARITH_RULE `n +| 0 = n`];
3910   DISCH_TAC;
3911   SUBGOAL_TAC `(abs (L r 0 - f (i:num) (r:num)) < eps/(&.1 + &.n))`;
3912   USE 7 (SPECL [`r:num`;`i:num`]);
3913   UND 7;
3914   DISCH_THEN MATCH_MP_TAC;
3915   ASM_REWRITE_TAC[];
3916   USE 9 (SPEC `r:num`);
3917   JOIN 7 10;
3918   UND 7;
3919   REWRITE_TAC[LE_TRANS];
3920   ALL_TAC; (* "CE4" *)
3921   ABBREV_TAC `b = eps/(&1 + &n)`;
3922   ABBREV_TAC `a = (L r 0 - (f:num->num->real) i r)`;
3923   REWRITE_TAC[GSYM REAL_POW_2];
3924   REWRITE_TAC[GSYM REAL_LE_SQUARE_ABS];
3925   REAL_ARITH_TAC;
3926   MATCH_MP_TAC (REAL_ARITH `(b <. c)   ==> ((a <=. b) ==> (a <. c))`);
3927   REWRITE_TAC[SUM_CONST];
3928   REWRITE_TAC[REAL_MUL_AC;real_div];
3929   SUBGOAL_TAC `eps pow 2 = eps*eps*(&. 1)`;
3930   REWRITE_TAC[REAL_POW_2];
3931   REAL_ARITH_TAC;
3932   DISCH_THEN (fun t->REWRITE_TAC[t]);
3933   MATCH_MP_TAC REAL_PROP_LT_LMUL;
3934   ASM_REWRITE_TAC[];
3935   MATCH_MP_TAC REAL_PROP_LT_LMUL;
3936   ASM_REWRITE_TAC[];
3937   SUBGOAL_TAC `&.0 <. &.1 + &.n `;
3938   REWRITE_TAC[REAL_OF_NUM_ADD;REAL_OF_NUM_LT];
3939   ARITH_TAC;
3940   ALL_TAC; (*  "CE5" *)
3941   SIMP_TAC[REAL_INV_LT];
3942   DISCH_TAC;
3943   REWRITE_TAC[REAL_OF_NUM_ADD;REAL_OF_NUM_LT;REAL_OF_NUM_MUL];
3944   REWRITE_TAC[ARITH_RULE `(1+n)*(1+n)*1 = 1+n+n+n*n`];
3945   MATCH_MP_TAC (ARITH_RULE `(0<=a)/\(0<=b) /\(0<1)  ==> (a <| 1 + a + a + b)`);
3946   CONJ_TAC;
3947   ARITH_TAC;
3948   CONJ_TAC;
3949   ONCE_REWRITE_TAC [ARITH_RULE `0 = n *| 0`];
3950   REWRITE_TAC[LE_MULT_LCANCEL];
3951   ARITH_TAC;
3952   ARITH_TAC;
3953   ]);;
3954   (* }}} *)
3955
3956 let subset_sequence = prove_by_refinement(
3957   `!(X:A->bool) S f. S SUBSET X /\ sequence S f ==>
3958          sequence X f`,
3959   (* {{{ proof *)
3960   [
3961   REWRITE_TAC[sequence];
3962   SET_TAC[];
3963   ]);;
3964   (* }}} *)
3965
3966 let subset_cauchy = prove_by_refinement(
3967   `!(X:A->bool) S d f. S SUBSET X /\ cauchy_seq(S,d) f ==>
3968          cauchy_seq(X,d) f`,
3969   (* {{{ proof *)
3970   [
3971   REPEAT GEN_TAC;
3972   REWRITE_TAC[cauchy_seq];
3973   DISCH_ALL_TAC;
3974   ASM_MESON_TAC[subset_sequence];
3975   ]);;
3976   (* }}} *)
3977
3978 let complete_closed = prove_by_refinement(
3979   `!n S. (closed_ (top_of_metric (euclid n,d_euclid)) S) /\
3980     (S SUBSET (euclid n)) ==>
3981      (complete (S,d_euclid))`,
3982   (* {{{ proof *)
3983   [
3984   REWRITE_TAC[complete];
3985   REPEAT GEN_TAC;
3986   DISCH_ALL_TAC;
3987   GEN_TAC;
3988   DISCH_TAC;
3989   USE 0 (MATCH_MP closed_open);
3990   UND 0;
3991   SIMP_TAC[GSYM top_of_metric_unions;metric_euclid];
3992   DISCH_TAC;
3993   SUBGOAL_TAC `cauchy_seq(euclid n,d_euclid) f`;
3994   ASM_MESON_TAC[subset_cauchy];
3995   DISCH_TAC;
3996   SUBGOAL_TAC `converge(euclid n,d_euclid) f`;
3997   ASM_MESON_TAC[complete_euclid;complete];
3998   REWRITE_TAC[converge];
3999   DISCH_THEN CHOOSE_TAC;
4000   EXISTS_TAC `(x:num->real)`;
4001   ASM_REWRITE_TAC[];
4002   PROOF_BY_CONTR_TAC;
4003   SUBGOAL_TAC `~(x IN S) ==> (x IN (euclid n DIFF S))`;
4004   ASM SET_TAC[];
4005   DISCH_TAC;
4006   H_MATCH_MP (HYP "6") (HYP "5");
4007   USE 0 (REWRITE_RULE[open_DEF]);
4008   USE 0 (REWRITE_RULE[(MATCH_MP (CONV_RULE (quant_right_CONV "A") top_of_metric_nbd) (SPEC `n:num` metric_euclid))]);
4009   USE 0 (CONV_RULE (quant_left_CONV "a"));
4010   USE 0 (SPEC `x:num->real`);
4011   UND 0;
4012   ASM_REWRITE_TAC[SUBSET_DIFF];
4013   ALL_TAC; (* #CC1; *)
4014   PROOF_BY_CONTR_TAC;
4015   USE 0 (REWRITE_RULE[]);
4016   CHO 0;
4017   USE 0 (REWRITE_RULE[SUBSET;IN_ELIM_THM';open_ball]);
4018   AND 0;
4019   AND 4;
4020   USE 4 (SPEC `r:real`);
4021   CHO 4;
4022   H_MATCH_MP (HYP "4") (HYP "8");
4023   USE 10 (SPEC `n':num`);
4024   USE 10 (REWRITE_RULE[ARITH_RULE `n <=| n`]);
4025   USE 0 (SPEC `(f:num->num->real) n'`);
4026   UND 0;
4027   USE 9 (REWRITE_RULE[IN]);
4028   ASM_REWRITE_TAC[];
4029   SUBGOAL_TAC `(S:(num->real)->bool) ((f:num->num->real) n')`;
4030   ASM_MESON_TAC[cauchy_seq;sequence_in];
4031   UND 1;
4032   ABBREV_TAC `X = euclid n`;
4033   ABBREV_TAC `a = (f:num->num->real) n'`;
4034   REWRITE_TAC[IN_DIFF];
4035   REWRITE_TAC[IN;SUBSET];
4036   ASM_MESON_TAC[];
4037   ]);;
4038   (* }}} *)
4039
4040
4041 (* ------------------------------------------------------------------ *)
4042 (* Totally bounded metric spaces *)
4043 (* ------------------------------------------------------------------ *)
4044
4045
4046 let totally_bounded = euclid_def `totally_bounded ((X:A->bool),d) =
4047   (!eps. ?B.  (&.0 <. eps) ==>
4048     (FINITE B) /\
4049     (!b. (B b) ==> ?x. b = open_ball(X,d) x eps) /\
4050     (X = UNIONS B))`;;
4051
4052 let totally_bounded_subset = prove_by_refinement(
4053   `!(X:A->bool) d S. (metric_space (X,d)) /\ (totally_bounded(X,d))
4054       /\ (S SUBSET X)  ==>
4055      (totally_bounded (S,d)) `,
4056   (* {{{ proof *)
4057
4058   [
4059   REPEAT GEN_TAC;
4060   REWRITE_TAC[totally_bounded];
4061   DISCH_ALL_TAC;
4062   GEN_TAC;
4063   USE 1 (SPEC `eps/(&.2)`);
4064   CHO 1;
4065   CONV_TAC (quant_right_CONV "B");
4066   DISCH_TAC;
4067   SUBGOAL_TAC `&.0 <. eps ==> &.0 <. eps/(&.2)`;
4068   DISCH_THEN (fun t-> MP_TAC (ONCE_REWRITE_RULE[GSYM REAL_HALF_DOUBLE] t));
4069   REWRITE_TAC[REAL_DIV_LZERO];
4070   REAL_ARITH_TAC;
4071   ASM_REWRITE_TAC[];
4072   DISCH_TAC;
4073   (UND 1) THEN (ASM_REWRITE_TAC[]) THEN DISCH_ALL_TAC;
4074   SUBGOAL_TAC `!b. ?s. (?t. (t IN (b:A->bool) INTER S)) ==> (s IN b INTER S)`;
4075   GEN_TAC;
4076   CONV_TAC (quant_left_CONV "t");
4077   MESON_TAC[IN];
4078   CONV_TAC (quant_left_CONV "s");
4079   DISCH_THEN CHOOSE_TAC;
4080   ALL_TAC; (* #set "TB1"; *)
4081   EXISTS_TAC `IMAGE (\c. (open_ball ((S:A->bool),d) ((s) c) eps)) (B:(A->bool)->bool)`;
4082   CONJ_TAC;
4083   MATCH_MP_TAC FINITE_IMAGE;
4084   ASM_REWRITE_TAC[];
4085   CONJ_TAC;
4086   GEN_TAC;
4087   REWRITE_TAC[IMAGE;IN_ELIM_THM'];
4088   NAME_CONFLICT_TAC;
4089   DISCH_THEN (X_CHOOSE_TAC `c:A->bool`);
4090   ASM_MESON_TAC[];
4091   MATCH_MP_TAC EQ_EXT;
4092   X_GEN_TAC `u:A`;
4093   EQ_TAC;
4094   DISCH_TAC;
4095   SUBGOAL_TAC `(X:A->bool) (u:A)`;
4096   ASM_MESON_TAC[SUBSET;IN];
4097   ASM_REWRITE_TAC[];
4098   REWRITE_TAC[REWRITE_RULE[IN] IN_UNIONS];
4099   DISCH_THEN (X_CHOOSE_TAC `b':A->bool`);
4100   USE 7 (SPEC `b':A->bool`);
4101   REWRITE_TAC[IMAGE];
4102   REWRITE_TAC[IN_ELIM_THM'];
4103   CONV_TAC (quant_left_CONV "x");
4104   CONV_TAC (quant_left_CONV "x");
4105   EXISTS_TAC `b':A->bool`;
4106   EXISTS_TAC `open_ball((S:A->bool),d) (s (b':A->bool)) eps`;
4107   ASM_REWRITE_TAC[IN];
4108   REWRITE_TAC[open_ball];
4109   REWRITE_TAC[IN_ELIM_THM'];
4110   ALL_TAC; (* #set "TB2"; *)
4111   SUBGOAL_TAC `(u:A) IN (b' INTER S)`;
4112   REWRITE_TAC[IN_INTER];
4113   ASM_MESON_TAC[IN];
4114   UND 7;
4115   CONV_TAC (quant_left_CONV "t");
4116   CONV_TAC (quant_left_CONV "t");
4117   EXISTS_TAC `u:A`;
4118   DISCH_TAC;
4119   DISCH_TAC;
4120   SUBGOAL_TAC `(S:A->bool) ((s:(A->bool)->A) b')`;
4121   UND 7;
4122   ASM_REWRITE_TAC[];
4123   REWRITE_TAC[IN_INTER];
4124   MESON_TAC[IN];
4125   DISCH_TAC;
4126   ASM_REWRITE_TAC[];
4127   SUBGOAL_TAC `(b':A->bool) ((s:(A->bool)->A) b')`;
4128   UND 11;
4129   UND 7;
4130   REWRITE_TAC[IN_INTER];
4131   ASM_MESON_TAC[IN];
4132   ALL_TAC; (* #set "TB3"; *)
4133   DISCH_TAC;
4134   AND 9;
4135   USE 5 (SPEC `b':A->bool`);
4136   H_MATCH_MP (HYP "5") (HYP "13");
4137   CHO 14;
4138   ABBREV_TAC `v = (s:(A->bool)->A) b'`;
4139   COPY 9;
4140   UND 9;
4141   UND 12;
4142   ASM_REWRITE_TAC[];
4143   REWRITE_TAC[open_ball;IN_ELIM_THM'];
4144   DISCH_ALL_TAC;
4145   SUBGOAL_TAC `(X x) /\ ((X:A->bool) u) /\ (X v)`;
4146   ASM_REWRITE_TAC[];
4147   ASM_MESON_TAC[SUBSET;IN];
4148   DISCH_ALL_TAC;
4149   USE 0 (REWRITE_RULE[metric_space]);
4150   COPY 16;
4151   KILL 1;
4152   KILL 7;
4153   KILL 11;
4154   UND 21;
4155   KILL 6;
4156   UND 14;
4157   DISCH_THEN (fun t-> ASSUME_TAC t THEN (REWRITE_TAC[t]));
4158   REWRITE_TAC[open_ball;IN_ELIM_THM'];
4159   DISCH_ALL_TAC;
4160   USE 0 (SPECL [`v:A`;`x:A`;`u:A`]);
4161   UND 0;
4162   ASM_REWRITE_TAC[];
4163   DISCH_ALL_TAC;
4164   USE 22 (MATCH_MP (REAL_ARITH `(a <=. b + c) ==> !e. (b + c <. e ==> (a <. e))`));
4165   USE 22 (SPEC `eps:real`);
4166   UND 22 THEN (DISCH_THEN (MATCH_MP_TAC));
4167   ASM_REWRITE_TAC[];
4168   UND 11;
4169   UND 17;
4170   MP_TAC (SPEC `eps:real` REAL_HALF_DOUBLE);
4171   REAL_ARITH_TAC;
4172   REWRITE_TAC[IMAGE;IN_ELIM_THM'];
4173   REWRITE_TAC[UNIONS;IN_ELIM_THM'];
4174   CONV_TAC (quant_left_CONV "x");
4175   CONV_TAC (quant_left_CONV "x");
4176   NAME_CONFLICT_TAC;
4177   CONV_TAC (quant_left_CONV "x'");
4178   X_GEN_TAC `c:A->bool`;
4179   CONV_TAC (quant_left_CONV "u'");
4180   GEN_TAC;
4181   DISCH_ALL_TAC;
4182   UND 10;
4183   ASM_REWRITE_TAC[];
4184   REWRITE_TAC[open_ball;IN_ELIM_THM'];
4185   MESON_TAC[];
4186   ]);;
4187
4188   (* }}} *)
4189
4190 let integer_cube_finite = prove_by_refinement(
4191   `!n N. FINITE { f | (euclid n f) /\
4192        (!i. (?j. (abs(f i) = &.j) /\ (j <=| N)))}`,
4193   (* {{{ proof *)
4194
4195   [
4196   REP_GEN_TAC;
4197   ABBREV_TAC `fs = FUN {m | m <| n} {x |  ?j. (abs x = &.j) /\ (j <=| N)}`;
4198   ABBREV_TAC `gs = { f | (euclid n f) /\ (!i. (?j. (abs(f i) = &.j) /\ (j <=| N)))}`;
4199   SUBGOAL_TAC `FINITE (fs:(num->real)->bool)`;
4200   EXPAND_TAC "fs";
4201   MP_TAC(prove(`!(a:num->bool) (b:real->bool). FINITE a /\ FINITE b ==> (FINITE (FUN a b))`,MESON_TAC[HAS_SIZE;FUN_SIZE]));
4202   DISCH_THEN MATCH_MP_TAC;
4203   REWRITE_TAC[interval_finite;FINITE_NUMSEG_LT];
4204   DISCH_TAC;
4205   ABBREV_TAC `G = (\ u. (\ j. if (n <=| j) then (&.0) else (u j)))`;
4206   SUBGOAL_TAC `FINITE { y | ?x. x IN fs /\ (y:(num->real) = G (x:num->real))}`;
4207   MATCH_MP_TAC FINITE_IMAGE_EXPAND;
4208   ASM_REWRITE_TAC[];
4209   SUBGOAL_TAC `!a b. ((a:(num->real)->bool) = b) ==> (FINITE a ==> FINITE b)`;
4210   REP_GEN_TAC;
4211   DISCH_THEN (fun t-> REWRITE_TAC[t]);
4212   DISCH_THEN (fun t-> MATCH_MP_TAC t);
4213   MATCH_MP_TAC EQ_EXT;
4214   GEN_TAC;
4215   EXPAND_TAC "gs";
4216   REWRITE_TAC[IN_ELIM_THM'];
4217   EXPAND_TAC "fs";
4218   REWRITE_TAC[FUN;IN_ELIM_THM'];
4219   NAME_CONFLICT_TAC;
4220   EQ_TAC;
4221   DISCH_THEN (CHOOSE_TAC );
4222   SUBGOAL_TAC `euclid n x`;
4223   REWRITE_TAC[euclid];
4224   GEN_TAC;
4225   AND 4;
4226   UND 4;
4227   EXPAND_TAC "G";
4228   DISCH_THEN (fun t->REWRITE_TAC[t]);
4229   DISCH_THEN (fun t->REWRITE_TAC[t]);
4230   DISCH_TAC THEN (ASM_REWRITE_TAC[]);
4231   GEN_TAC;
4232   AND 4;
4233   EXPAND_TAC "G";
4234   COND_CASES_TAC;
4235   REDUCE_TAC;
4236   EXISTS_TAC `0`;
4237   REDUCE_TAC;
4238   AND 6;
4239   USE 8 (SPEC `i':num`);
4240   ASM_MESON_TAC[ARITH_RULE `~(n <=| i') ==> (i' <| n)`];
4241   DISCH_ALL_TAC;
4242   EXISTS_TAC `\p. (if (p <| n) then ((x:num->real) p) else (CHOICE UNIV))`;
4243   CONJ_TAC;
4244   REWRITE_TAC[SUPP;SUBSET;IN_ELIM_THM'];
4245   NAME_CONFLICT_TAC;
4246   CONJ_TAC;
4247   GEN_TAC;
4248   DISCH_THEN (fun t->REWRITE_TAC[t]);
4249   UND 5;
4250   MESON_TAC[];
4251   GEN_TAC;
4252   COND_CASES_TAC;
4253   REWRITE_TAC[];
4254   REWRITE_TAC[];
4255   MATCH_MP_TAC EQ_EXT;
4256   X_GEN_TAC `q:num`;
4257   EXPAND_TAC "G";
4258   COND_CASES_TAC;
4259   ASM_MESON_TAC[euclid];
4260   USE 6 (MATCH_MP (ARITH_RULE `~(n <=| q) ==> (q <| n)`));
4261   ASM_REWRITE_TAC[];
4262   ]);;
4263
4264   (* }}} *)
4265
4266 let FINITE_scaled_lattice = prove_by_refinement(
4267   `!n N s. (&.0 <. s) ==> FINITE {x | euclid n x /\ (!i. (?j. abs(x i) = s*(&.j)) /\ (abs(x i) <=. (&.N) ) ) }`,
4268   (* {{{ proof *)
4269
4270   [
4271   DISCH_ALL_TAC;
4272   ABBREV_TAC `map  = ( *# ) s`;
4273   ASSUME_TAC REAL_ARCH_SIMPLE;
4274   USE 2 (SPEC `inv(s)*(&.N)`);
4275   UND 2 THEN (DISCH_THEN (X_CHOOSE_TAC `M:num`));
4276   ASSUME_TAC integer_cube_finite;
4277   USE 3 (SPECL [`n:num`;`M:num`]);
4278   USE 3 (MATCH_MP (ISPEC `map:(num->real)->(num->real)` FINITE_IMAGE_EXPAND));
4279   UND 3;
4280   MATCH_MP_TAC (prove_by_refinement (`!a b. ((b:A->bool) SUBSET a) ==> (FINITE a ==> FINITE b)`,[MESON_TAC[FINITE_SUBSET]]));
4281   REWRITE_TAC[SUBSET];
4282   X_GEN_TAC `c:num->real`;
4283   REWRITE_TAC[IN_ELIM_THM'];
4284   EXPAND_TAC "map";
4285   DISCH_ALL_TAC;
4286   EXISTS_TAC `inv(s) *# c`;
4287   REWRITE_TAC[euclid_scale_act];
4288   ASM_SIMP_TAC[euclid_scale_closure];
4289   WITH 0 (MATCH_MP (REAL_ARITH `&.0 < s ==> ~(s = &.0)`));
4290   ASM_SIMP_TAC[REAL_MUL_RINV];
4291   CONJ_TAC;
4292   GEN_TAC;
4293   USE 4 (SPEC `i:num`);
4294   AND 4;
4295   CHO 6;
4296   REWRITE_TAC[euclid_scale;REAL_ABS_MUL;REAL_ABS_INV];
4297   SUBGOAL_TAC `abs s = s`;
4298   UND 0;
4299   REAL_ARITH_TAC;
4300   DISCH_THEN (fun t-> REWRITE_TAC[t]);
4301   EXISTS_TAC `j:num`;
4302   ALL_TAC; (* save_goal "C" *)
4303   SUBCONJ_TAC;
4304   ASM_REWRITE_TAC[];
4305   UND 5;
4306   REWRITE_TAC[GSYM (CONJUNCT1 (CONJUNCT2 (REAL_MUL_AC)))];
4307   SIMP_TAC[REAL_MUL_LINV];
4308   REAL_ARITH_TAC;
4309   DISCH_TAC;
4310   REWRITE_TAC[GSYM REAL_OF_NUM_LE];
4311   USE 7 (GSYM);
4312   UND 7 THEN DISCH_THEN (fun t-> REWRITE_TAC[t]);
4313   USE 0 (MATCH_MP REAL_LT_INV);
4314   ABBREV_TAC `s' = inv(s)`;
4315   USE 0 (MATCH_MP (REAL_ARITH `&.0 < s' ==> &.0 <=. s'`));
4316   JOIN 0 4;
4317   USE 0 (MATCH_MP REAL_LE_LMUL);
4318   JOIN 0 2;
4319   UND 0;
4320   REAL_ARITH_TAC;
4321   REWRITE_TAC[euclid_scale_one];
4322   ]);;
4323
4324   (* }}} *)
4325
4326 let totally_bounded_cube = prove_by_refinement(
4327   `!n N. totally_bounded
4328         ({x | euclid n x /\ (!i. abs(x i) <=. (&.N))},d_euclid)`,
4329   (* {{{ proof *)
4330   [
4331   REP_GEN_TAC;
4332   REWRITE_TAC[totally_bounded];
4333   GEN_TAC;
4334   CONV_TAC (quant_right_CONV "B");
4335   DISCH_TAC;
4336   ABBREV_TAC `cent = {x | euclid n x /\ (!i. (?j. abs(x i) = (eps/(&.n+. &.1))*(&.j)) /\ (abs(x i) <=. (&.N) ) ) }`;
4337   SUBGOAL_TAC `&.0 <. (&.n +. &.1)`;
4338   REDUCE_TAC;
4339   ARITH_TAC;
4340   DISCH_TAC;
4341   ABBREV_TAC `s = eps/(&.n +. &.1)`;
4342   SUBGOAL_TAC `&.0 < s`;
4343   EXPAND_TAC "s";
4344   ASM_SIMP_TAC[REAL_LT_DIV];
4345   DISCH_TAC;
4346   SUBGOAL_TAC `FINITE (cent:(num->real)->bool)`;
4347   EXPAND_TAC "cent";
4348   ASM_SIMP_TAC[FINITE_scaled_lattice];
4349   DISCH_TAC;
4350   ABBREV_TAC `cube = {x | euclid n x /\ (!i. abs(x i) <=. (&.N))}`;
4351   EXISTS_TAC `IMAGE (\c. open_ball(cube,d_euclid) c eps) cent`;
4352   SUBCONJ_TAC;
4353   ASM_MESON_TAC[FINITE_IMAGE];
4354   DISCH_TAC;
4355   SUBCONJ_TAC;
4356   GEN_TAC;
4357   REWRITE_TAC[IMAGE;IN_ELIM_THM'];
4358   ASM_MESON_TAC[];
4359   DISCH_TAC;
4360   ALL_TAC; (* # TB1; *)
4361   SUBGOAL_TAC `cent SUBSET (cube:(num->real)->bool)`;
4362   REWRITE_TAC[SUBSET];
4363   EXPAND_TAC "cent";
4364   EXPAND_TAC "cube";
4365   REWRITE_TAC[IN_ELIM_THM'];
4366   MESON_TAC[];
4367   DISCH_TAC;
4368   MATCH_MP_TAC EQ_EXT;
4369   GEN_TAC;
4370   EQ_TAC;
4371   DISCH_TAC;
4372   REWRITE_TAC[UNIONS;IN_IMAGE;IN_ELIM_THM'];
4373   ASSUME_TAC REAL_ARCH_LEAST;
4374   USE 11 (SPEC `s:real`);
4375   UND 11 THEN (ASM_REWRITE_TAC[]) THEN DISCH_TAC;
4376   USE 11 (CONV_RULE (quant_left_CONV "n"));
4377   USE 11 (CONV_RULE (quant_left_CONV "n"));
4378   UND 11 THEN (DISCH_THEN (X_CHOOSE_TAC `cs:real->num`));
4379   NAME_CONFLICT_TAC;
4380   CONV_TAC (quant_left_CONV "x'");
4381   CONV_TAC (quant_left_CONV "x'");
4382   ABBREV_TAC `cx = \ (i:num) . if (&.0 <=. (x i)) then &(cs (x i))* s else --. (&.(cs (--. (x i))) * s )`;
4383   EXISTS_TAC `cx:num->real`;
4384   EXISTS_TAC `open_ball(cube,d_euclid) cx eps`;
4385   ASM_REWRITE_TAC[];
4386   ALL_TAC; (* # TB2; *)
4387   SUBGOAL_TAC `euclid n x`;
4388   UND 10;
4389   EXPAND_TAC "cube";
4390   REWRITE_TAC[IN_ELIM_THM'];
4391   MESON_TAC[];
4392   DISCH_TAC;
4393   SUBGOAL_TAC `cx IN (euclid n)`;
4394   REWRITE_TAC[IN;euclid;];
4395   DISCH_ALL_TAC;
4396   EXPAND_TAC "cx";
4397   UND 13;
4398   REWRITE_TAC[euclid];
4399   DISCH_THEN (fun t-> MP_TAC(SPEC `m:num` t));
4400   ASM_REWRITE_TAC[];
4401   DISCH_THEN (fun t-> REWRITE_TAC[t]);
4402   REDUCE_TAC;
4403   USE 11 (SPEC `&.0`);
4404   UND 11;
4405   REDUCE_TAC;
4406   ABBREV_TAC `(a:num) = (cs (&.0))`;
4407   SUBGOAL_TAC `&.0 <=. &.a *s`;
4408   REWRITE_TAC[REAL_MUL_NN];
4409   DISJ1_TAC;
4410   REDUCE_TAC;
4411   UND 4;
4412   REAL_ARITH_TAC;
4413   ABBREV_TAC `q = (&.a)*. s`;
4414   REAL_ARITH_TAC;
4415   DISCH_TAC;
4416   ALL_TAC; (* # TB3; *)
4417   SUBCONJ_TAC;
4418   EXPAND_TAC "cent";
4419   REWRITE_TAC[IN_ELIM_THM'];
4420   USE 14 (REWRITE_RULE[IN]);
4421   ASM_REWRITE_TAC[];
4422   GEN_TAC;
4423   EXPAND_TAC "cx";
4424   BETA_TAC;
4425   COND_CASES_TAC;
4426   SUBCONJ_TAC;
4427   EXISTS_TAC `((cs:real->num) (x (i:num)))`;
4428   REWRITE_TAC[REAL_ABS_MUL];
4429   REDUCE_TAC;
4430   REWRITE_TAC[REAL_MUL_AC];
4431   AP_THM_TAC;
4432   AP_TERM_TAC;
4433   UND 4;
4434   REAL_ARITH_TAC;
4435   DISCH_TAC;
4436   ALL_TAC; (* # TB4; *)
4437   SUBGOAL_TAC `(&.0 <=. &.(cs ((x:num->real) i)) * s)`;
4438   REWRITE_TAC[REAL_MUL_NN];
4439   DISJ1_TAC;
4440   REDUCE_TAC;
4441   UND 4 THEN REAL_ARITH_TAC;
4442   DISCH_THEN (fun t-> MP_TAC (REWRITE_RULE[GSYM REAL_ABS_REFL] t));
4443   DISCH_THEN (fun t-> REWRITE_TAC [t]);
4444   USE 11 (SPEC `(x:num->real) i`);
4445   UND 11;
4446   ASM_REWRITE_TAC [];
4447   UND 10;
4448   EXPAND_TAC "cube";
4449   REWRITE_TAC [IN_ELIM_THM'];
4450   DISCH_THEN (fun t -> ASSUME_TAC (CONJUNCT2 t));
4451   USE 10 (SPEC `i:num`);
4452   UND 10;
4453   ASSUME_TAC(prove(`&.0 <= x ==> (abs x = x)`,MESON_TAC[REAL_ABS_REFL]));
4454   ASM_SIMP_TAC[];
4455   MESON_TAC[REAL_LE_TRANS];
4456   ALL_TAC ; (* #TB5; *)
4457   REWRITE_TAC[REAL_ABS_NEG];
4458   SUBCONJ_TAC;
4459   EXISTS_TAC `((cs:real->num) (--. (x (i:num))))`;
4460   REWRITE_TAC [REAL_ABS_MUL];
4461   REDUCE_TAC;
4462   ASSUME_TAC(prove(`&.0 <= x ==> (abs x = x)`,MESON_TAC[REAL_ABS_REFL]));
4463   ASSUME_TAC(REAL_ARITH `&.0 < x ==> &. 0 <=. x`);
4464   ASM_SIMP_TAC[];
4465   REWRITE_TAC [REAL_MUL_AC];
4466   DISCH_TAC;
4467   USE 11 (SPEC `--. (x (i:num))`);
4468   UND 11;
4469   ASSUME_TAC (REAL_ARITH `!x. ~(&.0 <= x) ==> (&.0 <= --. x)`);
4470   ASM_SIMP_TAC[];
4471   UND 10;
4472   EXPAND_TAC "cube";
4473   REWRITE_TAC[IN_ELIM_THM'];
4474   DISCH_THEN (fun t -> ASSUME_TAC (CONJUNCT2 t));
4475   USE 10 (SPEC `i:num`);
4476   UND 10;
4477   MP_TAC(prove(`!v. (-- v <=. abs(v))`,REAL_ARITH_TAC));
4478   REWRITE_TAC [REAL_ABS_MUL];
4479   REDUCE_TAC;
4480   ASSUME_TAC(prove(`&.0 <= x ==> (abs x = x)`,MESON_TAC[REAL_ABS_REFL]));
4481   ASSUME_TAC(REAL_ARITH `&.0 < x ==> &. 0 <=. x`);
4482   ASM_SIMP_TAC[];
4483   MESON_TAC[REAL_LE_TRANS];
4484   ALL_TAC;  (* #TB6; *)
4485   DISCH_TAC;
4486   REWRITE_TAC[open_ball;IN_ELIM_THM'];
4487   ASM_REWRITE_TAC[];
4488   CONJ_TAC;
4489   UND 15;
4490   UND 9;
4491   REWRITE_TAC[SUBSET;IN];
4492   MESON_TAC[];
4493   SUBGOAL_TAC `d_euclid cx x <= sqrt(&.n)*s`;
4494   MATCH_MP_TAC D_EUCLID_BOUND;
4495   USE 14 (REWRITE_RULE[IN]);
4496   ASM_REWRITE_TAC[];
4497   GEN_TAC;
4498   EXPAND_TAC "cx";
4499   BETA_TAC;
4500   ASSUME_TAC (REAL_ARITH `!x a b. a <=. x /\ x <. b ==> abs(a - x) <= b -a`);
4501   SUBGOAL_TAC `!x. &.0 <=. x ==> abs(&.(cs x)*.s -. x) <=. s`;
4502   DISCH_ALL_TAC;
4503   USE 11 (SPEC `x':real`);
4504   H_MATCH_MP (HYP "11") (HYP "17");
4505   H_MATCH_MP (HYP "16") (HYP "18");
4506   USE 19 (REWRITE_RULE [GSYM REAL_SUB_RDISTRIB]);
4507   ALL_TAC; (* # TB7; *)
4508   USE 19 (CONV_RULE REDUCE_CONV);
4509   ASM_REWRITE_TAC [];
4510   DISCH_TAC;
4511   COND_CASES_TAC;
4512   ASM_MESON_TAC[];
4513   REWRITE_TAC[REAL_ARITH `--x - y = --(x+.y)`;REAL_ABS_NEG];
4514   REWRITE_TAC[REAL_ARITH `x+. y = (x -. (--. y))`];
4515   ASM_MESON_TAC[REAL_ARITH `!u. ~(&.0 <=. u) ==> (&.0 <=. (--. u))`];
4516   ALL_TAC; (* # TB8; *)
4517   MATCH_MP_TAC(REAL_ARITH `b < c ==> ((a<=b) ==> (a < c))`);
4518   EXPAND_TAC "s";
4519   REWRITE_TAC[real_div;REAL_MUL_AC];
4520   MATCH_MP_TAC(REAL_ARITH`(t < e *(&.1)) ==> (t <. e)`);
4521   MATCH_MP_TAC (REAL_LT_LMUL);
4522   ASM_REWRITE_TAC[];
4523   ASSUME_TAC REAL_PROP_LT_LCANCEL ;
4524   USE 16 (SPEC `&.n +. &.1`);
4525   UND 16;
4526   DISCH_THEN (MATCH_MP_TAC);
4527   REDUCE_TAC;
4528   SUBGOAL_TAC `~(&.(n+1) = &.0)`;
4529   REDUCE_TAC;
4530   ARITH_TAC;
4531   REWRITE_TAC[REAL_ARITH`a*b*c = (a*b)*c`];
4532   ALL_TAC; (* # TB8; *)
4533   SIMP_TAC[REAL_MUL_RINV];
4534   REDUCE_TAC;
4535   DISCH_TAC;
4536   CONJ_TAC;
4537   ARITH_TAC;
4538   SQUARE_TAC;
4539   SUBCONJ_TAC;
4540   MATCH_MP_TAC SQRT_POS_LE;
4541   REDUCE_TAC;
4542   DISCH_TAC;
4543   SUBCONJ_TAC;
4544   REDUCE_TAC;
4545   DISCH_TAC;
4546   SUBGOAL_TAC `&.0 <=. &.n`;
4547   REDUCE_TAC;
4548   SIMP_TAC[prove(`!x. (&.0 <=. x) ==> (sqrt(x) pow 2 = x)`,MESON_TAC[SQRT_POW2])];
4549   DISCH_TAC;
4550   REWRITE_TAC[REAL_POW_2];
4551   REDUCE_TAC;
4552   REWRITE_TAC[LEFT_ADD_DISTRIB;RIGHT_ADD_DISTRIB];
4553   REDUCE_TAC;
4554   ABBREV_TAC `m = n*|n +| n`;
4555   ARITH_TAC;
4556   ALL_TAC; (* # TB9;  *)
4557   REWRITE_TAC[UNIONS;IN_IMAGE;IN_ELIM_THM'];
4558   DISCH_THEN CHOOSE_TAC;
4559   AND 10;
4560   CHO 11;
4561   AND 11;
4562   UND 10;
4563   ASM_REWRITE_TAC[];
4564   MP_TAC (ISPEC `cube:(num->real)->bool` open_ball_subset);
4565   REWRITE_TAC[SUBSET];
4566   REWRITE_TAC[IN];
4567   MESON_TAC[];
4568   ]);;
4569   (* }}} *)
4570
4571 let center_FINITE = prove_by_refinement(
4572   `!X d  . metric_space ((X:A->bool),d) /\ (totally_bounded (X,d))
4573    ==> (!eps. (&.0 < eps) ==> (?C. (C SUBSET X) /\ (FINITE C) /\ (X = UNIONS (IMAGE (\x. open_ball(X,d) x eps) C))))`,
4574   (* {{{ proof *)
4575   [
4576   REWRITE_TAC[totally_bounded];
4577   DISCH_ALL_TAC;
4578   DISCH_ALL_TAC;
4579   USE 1 (SPEC `eps:real`);
4580   CHO 1;
4581   REWR 1;
4582   AND 1;
4583   AND 1;
4584   USE 4 (CONV_RULE ((quant_left_CONV "x")));
4585   USE 4 (CONV_RULE ((quant_left_CONV "x")));
4586   CHO 4;
4587   ABBREV_TAC `C'={z | (X (z:A)) /\ (?b. (B (b:A->bool)) /\ (z = x b))}`;
4588   EXISTS_TAC `C':A->bool`;
4589   SUBCONJ_TAC;
4590   EXPAND_TAC"C'";
4591   REWRITE_TAC[SUBSET;IN_ELIM_THM'];
4592   REWRITE_TAC[IN];
4593   MESON_TAC[];
4594   DISCH_TAC;
4595   CONJ_TAC;
4596   SUBGOAL_TAC `C' SUBSET (IMAGE (x:(A->bool)->A) B)`;
4597   EXPAND_TAC"C'";
4598   REWRITE_TAC[SUBSET;IN_IMAGE;IN_ELIM_THM'];
4599   NAME_CONFLICT_TAC;
4600   MESON_TAC[IN];
4601   DISCH_TAC;
4602   SUBGOAL_TAC `FINITE (IMAGE (x:(A->bool)->A) B)`;
4603   ASM_MESON_TAC[FINITE_IMAGE];
4604   ASM_MESON_TAC[FINITE_SUBSET];
4605   ALL_TAC; (* #g1; *)
4606   (ASM (GEN_REWRITE_TAC LAND_CONV)) [];
4607   ( (GEN_REWRITE_TAC LAND_CONV)) [UNIONS_DELETE];
4608   AP_TERM_TAC;
4609   MATCH_MP_TAC EQ_EXT;
4610   GEN_TAC;
4611   REWRITE_TAC[DELETE;IN_ELIM_THM';IMAGE];
4612   EXPAND_TAC "C'";
4613   REWRITE_TAC[IN_ELIM_THM'];
4614   NAME_CONFLICT_TAC;
4615   EQ_TAC;
4616   DISCH_ALL_TAC;
4617   USE 4 (SPEC `x':A->bool`);
4618   CONV_TAC (quant_left_CONV "b'");
4619   CONV_TAC (quant_left_CONV "b'");
4620   CONV_TAC (quant_left_CONV "b'");
4621   EXISTS_TAC `x':(A->bool)`;
4622   EXISTS_TAC `(x:(A->bool)->A) x'`;
4623   REWRITE_TAC[];
4624   USE 7 (REWRITE_RULE[IN]);
4625   H_MATCH_MP (HYP "4") (HYP"7");
4626   ALL_TAC; (* #g2 *)
4627   ABBREV_TAC `a = (x:(A->bool)->A) x'`;
4628   KILL 1;
4629   ASM_REWRITE_TAC[];
4630   UND 8;
4631   ASM_REWRITE_TAC[];
4632   MESON_TAC[open_ball_empty;IN];
4633   ALL_TAC; (* #g3 *)
4634   DISCH_THEN CHOOSE_TAC;
4635   UND 7;
4636   DISCH_ALL_TAC;
4637   CHO 8;
4638   AND 8;
4639   CONJ_TAC;
4640   KILL 1;
4641   ASM_REWRITE_TAC[];
4642   KILL 9;
4643   USE 4 (SPEC `b':A->bool`);
4644   REWR 1;
4645   ASM_MESON_TAC[IN];
4646   KILL 1;
4647   ASM_REWRITE_TAC[];
4648   UND 7;
4649   ASM_REWRITE_TAC[];
4650   ABBREV_TAC `a = (x:(A->bool)->A) b'`;
4651   DISCH_TAC;
4652   JOIN 2 7;
4653   JOIN 0 2;
4654   USE 0 (MATCH_MP open_ball_nonempty);
4655   UND 0;
4656   ABBREV_TAC `E= open_ball(X,d) (a:A) eps `;
4657   MESON_TAC[IN;EMPTY];
4658   ]);;
4659   (* }}} *)
4660
4661 let open_ball_dist = prove_by_refinement(
4662   `!X d x y r. (open_ball(X,d) x r y) ==> (d (x:A) y <. r)`,
4663   (* {{{ proof *)
4664   [
4665   REWRITE_TAC[open_ball;IN_ELIM_THM'];
4666   DISCH_ALL_TAC;
4667   ASM_REWRITE_TAC[];
4668   ]);;
4669   (* }}} *)
4670
4671 let totally_bounded_bounded = prove_by_refinement(
4672   `!(X:A->bool) d. metric_space(X,d) /\ totally_bounded (X,d) ==>
4673     (?a r. X SUBSET (open_ball(X,d) a r))`,
4674   (* {{{ proof *)
4675   [
4676   DISCH_ALL_TAC;
4677   COPY 0;
4678   JOIN 0 1;
4679   USE 0 (MATCH_MP center_FINITE);
4680   USE 0 (SPEC `&.1`);
4681   USE 0 (CONV_RULE REDUCE_CONV);
4682   CHO 0;
4683   EXISTS_TAC `CHOICE (X:A->bool)`;
4684   ASM_CASES_TAC `(X:A->bool) = EMPTY`;
4685   ASM_REWRITE_TAC[EMPTY_SUBSET];
4686   USE 1 (MATCH_MP CHOICE_DEF);
4687   UND 0 THEN DISCH_ALL_TAC;
4688   ABBREV_TAC `(dset:real->bool) = IMAGE (\c. (d (CHOICE (X:A->bool)) (c:A))) C`;
4689   SUBGOAL_TAC `FINITE (dset:real->bool)`;
4690   EXPAND_TAC"dset";
4691   MATCH_MP_TAC FINITE_IMAGE;
4692   ASM_REWRITE_TAC[];
4693   DISCH_TAC;
4694   USE 6 (MATCH_MP real_FINITE);
4695   CHO 6;
4696   EXISTS_TAC `a +. &.1`;
4697   REWRITE_TAC[SUBSET];
4698   GEN_TAC;
4699   REWRITE_TAC[open_ball;IN_ELIM_THM'];
4700   UND 1;
4701   REWRITE_TAC[IN];
4702   DISCH_ALL_TAC;
4703   UND 4;
4704   ASM_REWRITE_TAC[];
4705   DISCH_TAC;
4706   (* ASM (GEN_REWRITE_TAC LAND_CONV) []; *)
4707   USE 4(REWRITE_RULE[UNIONS;IN_IMAGE;IN_ELIM_THM']);
4708   USE 4(fun t -> AP_THM t `x:A`);
4709   UND 1;
4710   DISCH_THEN (fun t-> ((MP_TAC t) THEN (ASM_REWRITE_TAC[])) THEN ASSUME_TAC t);
4711   DISCH_TAC;
4712   USE 8 (REWRITE_RULE[IN_ELIM_THM']);
4713   CHO 8;
4714   AND 8;
4715   USE 9 (CONV_RULE NAME_CONFLICT_CONV);
4716   CHO 9;
4717   ALL_TAC; (* # "tbb"; *)
4718   REWR 8;
4719   USE 8(REWRITE_RULE[IN]);
4720   USE 8 (MATCH_MP open_ball_dist);
4721   AND 9;
4722   SUBGOAL_TAC `d (CHOICE (X:A->bool)) (x':A) IN (dset:real->bool)`;
4723   EXPAND_TAC"dset";
4724   REWRITE_TAC[IN_IMAGE];
4725   ASM_MESON_TAC[];
4726   DISCH_TAC;
4727   H_MATCH_MP (HYP"6") (HYP"11");
4728   USE 2 (REWRITE_RULE[metric_space]);
4729   USE 2 (SPECL[`(CHOICE (X:A->bool))`;`(x':A)`;`x:A`]);
4730   KILL 4;
4731   REWR 2;
4732   SUBGOAL_TAC `(X:A->bool) x'`;
4733   UND 9;
4734   UND 0;
4735   SET_TAC[IN;SUBSET];
4736   DISCH_TAC;
4737   REWR 2;
4738   UND 2 THEN DISCH_ALL_TAC;
4739   UND 8;
4740   UND 12;
4741   UND 15;
4742   ARITH_TAC;
4743   ]);;
4744   (* }}} *)
4745
4746 let subsequence_rec = prove_by_refinement(
4747   `!(X:A->bool) d f C s n r.
4748    metric_space(X,d) /\ (totally_bounded(X,d)) /\ (sequence X f) /\
4749    (C SUBSET X) /\ (&.0 < r) /\
4750    (~FINITE{j| C (f j)} /\ C(f s) /\ (!x y. (C x /\ C y) ==>
4751        d x y <. r*twopow(--: (&:n)))) ==>
4752    (? C' s'. ((C' SUBSET C) /\ (s < s') /\
4753    (~FINITE{j| C' (f j)} /\ C'(f s') /\ (!x y. (C' x /\ C' y) ==>
4754         d x y <. r*twopow(--: (&:(SUC n)))))))`,
4755   (* {{{ proof *)
4756   [
4757   DISCH_ALL_TAC;
4758   USE 1 (REWRITE_RULE[totally_bounded]);
4759   USE 1 (SPEC `r*twopow(--: (&:(n+| 2)))`);
4760   CHO 1;
4761   ASSUME_TAC twopow_pos;
4762   USE 8 (SPEC `--: (&: (n+| 2))`);
4763   ALL_TAC; (* ## need a few lines here to match Z8 with Z1. *)
4764   COPY 4;
4765   JOIN 9 8;
4766   USE 8 (MATCH_MP REAL_LT_MUL);
4767   REWR 1;
4768   UND 1 THEN DISCH_ALL_TAC;
4769   ALL_TAC ; (* "sr1"  OK TO HERE *)
4770   ASSUME_TAC (ISPECL [`UNIV:num->bool`;`f:num->A`;`B:(A->bool)->bool`;`C:A->bool`] INFINITE_PIGEONHOLE);
4771   UND 11;
4772   ASM_SIMP_TAC[UNIV];
4773   H_REWRITE_RULE[HYP "10"] (HYP "3");
4774   ASM_REWRITE_TAC [];
4775   DISCH_THEN CHOOSE_TAC;
4776   EXISTS_TAC `C INTER (b:A->bool)`;
4777   CONV_TAC (quant_right_CONV "s'");
4778   SUBCONJ_TAC;
4779   REWRITE_TAC[INTER_SUBSET];
4780   DISCH_TAC;
4781   AND 12;
4782   ASM_REWRITE_TAC[];
4783   SUBGOAL_TAC `~(FINITE ({i | (C INTER b) ((f:num->A) i)} INTER {i | s <| i}))`;
4784   PROOF_BY_CONTR_TAC;
4785   (USE 15) (REWRITE_RULE[]);
4786   USE 15 (MATCH_MP num_above_finite);
4787   UND 12;
4788   ASM_REWRITE_TAC[];
4789   DISCH_TAC;
4790   ABBREV_TAC `J = ({i | (C INTER b) ((f:num->A) i)} INTER {i | s <| i})`;
4791   EXISTS_TAC `CHOICE (J:num->bool)`; (* ok to here *)
4792   SUBGOAL_TAC `J (CHOICE (J:num->bool))`;
4793   MATCH_MP_TAC (REWRITE_RULE [IN] CHOICE_DEF);
4794   PROOF_BY_CONTR_TAC;
4795   USE 17 (REWRITE_RULE[]);
4796   H_REWRITE_RULE[(HYP "17")] (HYP "15");
4797   UND 18;
4798   REWRITE_TAC[FINITE_RULES];
4799   ALL_TAC; (* "sr2" *)
4800   ABBREV_TAC `s' = (CHOICE (J:num->bool))`;
4801   EXPAND_TAC "J";
4802   REWRITE_TAC[INTER;IN_ELIM_THM'];
4803   DISCH_ALL_TAC;
4804   ASM_REWRITE_TAC[];
4805   DISCH_ALL_TAC;
4806   KILL 5 THEN (KILL 2) THEN (KILL 1) THEN (KILL 13) THEN (KILL 12);
4807   SUBGOAL_TAC `(X x) /\ (X (y:A))`;
4808   UND 21 THEN UND 23 THEN UND 3;
4809   MESON_TAC[SUBSET;IN];
4810   USE 9 (SPEC `b:A->bool`);
4811   H_REWRITE_RULE[HYP "14"] (HYP "1");
4812   CHO 2;
4813   ALL_TAC; (* #"gg1" *)
4814   JOIN 22 24;
4815   JOIN 0 5;
4816   H_REWRITE_RULE[(HYP "2")] (HYP "0");
4817   USE 5 (REWRITE_RULE[IN]);
4818   USE 5 (MATCH_MP BALL_DIST);
4819   DISCH_ALL_TAC;
4820   UND 5;
4821   MATCH_MP_TAC (REAL_ARITH `(b = c) ==> ((a<. b) ==> (a<c))`);
4822   ALL_TAC;  (* insert here *)
4823   REWRITE_TAC[REAL_MUL_ASSOC];
4824   REWRITE_TAC[REAL_ARITH `&.2 *.r = r*. (&.2)`];
4825   REWRITE_TAC[GSYM REAL_MUL_ASSOC];
4826   REWRITE_TAC[REAL_EQ_LMUL];
4827   USE 4 (MATCH_MP (REAL_ARITH `&.0 <. r ==> ~(r = &.0)`));
4828   ASM_REWRITE_TAC[];
4829   REWRITE_TAC[TWOPOW_NEG];
4830   REWRITE_TAC[ARITH_RULE `(n+|2) = 1 + (SUC n)`];
4831   REWRITE_TAC[REAL_POW_ADD;REAL_INV_MUL];
4832   REWRITE_TAC [REAL_MUL_ASSOC];
4833   REWRITE_TAC[REAL_INV2;REAL_POW_1];
4834   REDUCE_TAC;
4835   ]);;
4836   (* }}} *)
4837
4838 let sequence_subseq = prove_by_refinement(
4839   `!(X:A->bool) f (ss:num->num). (sequence X f) ==>
4840     (sequence X (f o ss))`,
4841   (* {{{ proof *)
4842   [
4843   REWRITE_TAC[sequence;IMAGE;IN_UNIV;SUBSET;IN_ELIM_THM';o_DEF];
4844   REWRITE_TAC[IN];
4845   MESON_TAC[];
4846   ]);;
4847   (* }}} *)
4848
4849 let cauchy_subseq = prove_by_refinement(
4850   `!(X:A->bool) d f. ((metric_space(X,d))/\(totally_bounded(X,d)) /\
4851         (sequence X f)) ==>
4852      (?ss. (subseq ss) /\ (cauchy_seq(X,d) (f o ss)))`,
4853   (* {{{ proof *)
4854
4855   [
4856   DISCH_ALL_TAC;
4857   COPY 0 THEN COPY 1;
4858   JOIN 4 3;
4859   USE 3 (MATCH_MP totally_bounded_bounded);
4860   CHO 3;
4861   CHO 3;
4862   ALL_TAC; (* {{{ xxx *)
4863   ALL_TAC; (* make r pos *)
4864   ASSUME_TAC (REAL_ARITH `r <. (&.1 + abs(r))`);
4865   ASSUME_TAC (REAL_ARITH `&.0 <. (&.1 + abs(r))`);
4866   ABBREV_TAC (`r' = &.1 +. abs(r)`);
4867   SUBGOAL_TAC `open_ball(X,d) a r SUBSET open_ball(X,d) (a:A) r'`;
4868   ASM_SIMP_TAC[open_ball_nest];
4869   DISCH_TAC;
4870   JOIN 3 7;
4871   USE 3 (MATCH_MP SUBSET_TRANS);
4872   KILL 6;
4873   KILL 4;
4874   ALL_TAC; (* "cs1" *)
4875   SUBGOAL_TAC `( !(x:A) y.  (X x) /\ (X y) ==> (d x y <. &.2 *. r'))`;
4876   DISCH_ALL_TAC;
4877   USE 3 (REWRITE_RULE[SUBSET;IN]);
4878   COPY 3;
4879   USE 7 (SPEC `x:A`);
4880   USE 3 (SPEC `y:A`);
4881   H_MATCH_MP (HYP "3") (HYP "6");
4882   H_MATCH_MP (HYP "7") (HYP "4");
4883   JOIN 9 8;
4884   JOIN 0 8;
4885   USE 0 (MATCH_MP BALL_DIST);
4886   ASM_REWRITE_TAC[];
4887   DISCH_TAC;
4888   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))))`;
4889   ABBREV_TAC `R = (&.2)*r'`;
4890   ALL_TAC ; (* 0 case of recursio *)
4891   ALL_TAC; (* cs2 *)
4892   SUBGOAL_TAC ` (X SUBSET X) /\ (cond ((X:A->bool),0) 0)`;
4893   REWRITE_TAC[SUBSET_REFL];
4894   EXPAND_TAC "cond";
4895   CONV_TAC (TOP_DEPTH_CONV  GEN_BETA_CONV);
4896   USE 2 (REWRITE_RULE[sequence;SUBSET;IN_IMAGE;IN_UNIV]);
4897   USE 2 (REWRITE_RULE[IN]);
4898   USE 2 (CONV_RULE (NAME_CONFLICT_CONV));
4899   SUBGOAL_TAC `!x. X((f:num->A) x)`;
4900   ASM_MESON_TAC[];
4901   REDUCE_TAC;
4902   REWRITE_TAC[TWOPOW_0] THEN REDUCE_TAC;
4903   ASM_REWRITE_TAC[];
4904   DISCH_TAC;
4905   SUBGOAL_TAC `{ j | (X:A->bool) (f j) } = (UNIV:num->bool)`;
4906   MATCH_MP_TAC EQ_EXT;
4907   REWRITE_TAC[IN_ELIM_THM;UNIV];
4908   ASM_REWRITE_TAC[];
4909   DISCH_THEN REWRT_TAC;
4910   ASM_REWRITE_TAC[];
4911   REWRITE_TAC[num_infinite];
4912   ALL_TAC; (* #save_goal "cs3" *)
4913   SUBGOAL_TAC `&.0 <. R`;
4914   EXPAND_TAC "R";
4915   UND 5;
4916   REAL_ARITH_TAC;
4917   DISCH_ALL_TAC;
4918   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))) )`;
4919   DISCH_ALL_TAC;
4920   CONV_TAC (quant_right_CONV "cs'");
4921   DISCH_TAC;
4922   AND 11;
4923   H_REWRITE_RULE[GSYM o (HYP "6")] (HYP "11");
4924   USE 13 (CONV_RULE (SUBS_CONV[GSYM(ISPEC `cs:(A->bool)#num` PAIR)]));
4925   USE 13 (CONV_RULE (TOP_DEPTH_CONV GEN_BETA_CONV));
4926   JOIN 10 13;
4927   JOIN 12 10;
4928   JOIN 2 10;
4929   JOIN 1 2;
4930   JOIN 0 1;
4931   USE 0 (MATCH_MP subsequence_rec);
4932   CHO 0;
4933   CHO 0;
4934   EXISTS_TAC `(C':A->bool,s':num)`;
4935   ASM_REWRITE_TAC[FST;SND];
4936   EXPAND_TAC "cond";
4937   (CONV_TAC (TOP_DEPTH_CONV GEN_BETA_CONV));
4938   ASM_REWRITE_TAC[];
4939   DISCH_TAC;
4940   ALL_TAC; (* "cs4" *)
4941   USE 11 (REWRITE_RULE[SKOLEM_THM]);
4942   CHO 11;
4943   ASSUME_TAC (ISPECL[`((X:A->bool),0)`;`cs':(((A->bool)#num)->(num->(A->bool)#num))`] num_RECURSION);
4944   CHO 12;
4945   EXISTS_TAC `\i. (SND ((fn : num->(A->bool)#num) i))`;
4946   USE 11 (CONV_RULE (quant_left_CONV "n"));
4947   USE 11 (SPEC `n:num`);
4948   USE 11 (SPEC `(fn:num->(A->bool)#num) n`);
4949   AND 12;
4950   H_REWRITE_RULE[GSYM o (HYP "12")] (HYP "11");
4951   USE 14 (GEN_ALL);
4952   ABBREV_TAC `sn = (\i. SND ((fn:num->(A->bool)#num) i))`;
4953   ABBREV_TAC `Cn = (\i. FST ((fn:num->(A->bool)#num) i))`;
4954   SUBGOAL_TAC `((sn:num->num) 0 = 0) /\ (Cn 0 = (X:A->bool))`;
4955   EXPAND_TAC "sn";
4956   EXPAND_TAC "Cn";
4957   UND 13;
4958   MESON_TAC[FST;SND];
4959   DISCH_TAC;
4960   KILL 13;
4961   KILL 11;
4962   SUBGOAL_TAC `!(n:num). ((fn n):(A->bool)#num) = (Cn n,sn n)`;
4963   EXPAND_TAC "sn";
4964   EXPAND_TAC "Cn";
4965   REWRITE_TAC[PAIR];
4966   DISCH_TAC;
4967   H_REWRITE_RULE[(HYP "11")] (HYP"14");
4968   KILL 12;
4969   KILL 14;
4970   KILL 11;
4971   KILL 16;
4972   KILL 15;
4973   ALL_TAC; (* }}} *)
4974   ALL_TAC; (* KILL 10; cs4m *)
4975   KILL 8;
4976   KILL 7;
4977   KILL 3;
4978   KILL 5;
4979   ALL_TAC; (* cs5 *)
4980   TYPE_THEN `!n. (Cn n SUBSET X) /\ (cond (Cn n,sn n) n)` SUBGOAL_TAC;
4981   INDUCT_TAC;
4982   ASM_REWRITE_TAC[];
4983   SET_TAC[SUBSET];
4984   USE 13 (SPEC `n:num`);
4985   REWR 5;
4986   ASM_REWRITE_TAC[];
4987   ASM_MESON_TAC[SUBSET_TRANS];
4988   DISCH_TAC;
4989   REWR 13;
4990   SUBCONJ_TAC;
4991   ASM_REWRITE_TAC[SUBSEQ_SUC];
4992   DISCH_TAC;
4993   ASM_REWRITE_TAC[cauchy_seq];
4994   ASM_SIMP_TAC[sequence_subseq];
4995   GEN_TAC;
4996   TYPE_THEN `!i j. (i <=| j) ==> (Cn j SUBSET (Cn i))` SUBGOAL_TAC;
4997   MATCH_MP_TAC SUBSET_SUC2;
4998   ASM_REWRITE_TAC[];
4999   DISCH_TAC;
5000   ALL_TAC; (* cs6 *)
5001   SUBGOAL_TAC `!R e. ?n. (&.0 <. R)/\ (&.0 <. e) ==> R*(twopow(--: (&:n))) <. e`;
5002   DISCH_ALL_TAC;
5003   REWRITE_TAC[TWOPOW_NEG]; (* cs6b *)
5004   ASSUME_TAC (prove(`!n. &.0 < &.2 pow n`,REDUCE_TAC THEN ARITH_TAC));
5005   ONCE_REWRITE_TAC[REAL_MUL_AC];
5006   ASM_SIMP_TAC[REAL_INV_LT];
5007   ASM_SIMP_TAC[GSYM REAL_LT_LDIV_EQ];
5008   CONV_TAC (quant_right_CONV "n");
5009   DISCH_ALL_TAC;
5010   ASSUME_TAC (SPEC `R'/e` REAL_ARCH_SIMPLE);
5011   CHO 14;
5012   EXISTS_TAC `n:num`;
5013   UND 14;
5014   MESON_TAC[POW_2_LT;REAL_LET_TRANS];
5015   DISCH_TAC;
5016   USE 11 (SPECL [`R:real`;`eps:real`]);
5017   CHO 11;
5018   EXISTS_TAC `n:num`;
5019   DISCH_ALL_TAC;
5020   REWR 11;
5021   ALL_TAC; (* cs7 *)
5022   COPY 3;
5023   USE 3 (SPEC `n:num`);
5024   AND 3;
5025   UND 3;
5026   EXPAND_TAC "cond";
5027   (CONV_TAC (TOP_DEPTH_CONV GEN_BETA_CONV));
5028   DISCH_ALL_TAC;
5029   COPY 15;
5030   USE 15 (SPEC `i:num`);
5031   AND 15;
5032   UND 15;
5033   EXPAND_TAC "cond";
5034   (CONV_TAC (TOP_DEPTH_CONV GEN_BETA_CONV));
5035   DISCH_ALL_TAC;
5036   COPY 20;
5037   USE 20 (SPEC `j:num`);
5038   AND 20;
5039   UND 20;
5040   EXPAND_TAC "cond";
5041   (CONV_TAC (TOP_DEPTH_CONV GEN_BETA_CONV));
5042   DISCH_ALL_TAC;
5043   ABBREV_TAC `e2 = R * twopow (--: (&:n))`;
5044   REWRITE_TAC[o_DEF];
5045   TYPEL_THEN [`f (sn i)`;`f (sn j)`] (fun t-> (USE 19 (SPECL t)));
5046   KILL 27;
5047   KILL 23;
5048   KILL 25;
5049   KILL 21;
5050   KILL 16;
5051   KILL 9;
5052   KILL 6;
5053   KILL 28;
5054   COPY 8;
5055   USE 8 (SPECL [`n:num`;`i:num`]);
5056   USE 6 (SPECL [`n:num`;`j:num`]);
5057   UND 11;
5058   MATCH_MP_TAC (REAL_ARITH `(c < a) ==> ((a < b) ==> (c < b))`);
5059   UND 19;
5060   DISCH_THEN (MATCH_MP_TAC);
5061   UND 6;
5062   UND 8;
5063   ASM_REWRITE_TAC[];
5064   UND 22;
5065   UND 26;
5066   MESON_TAC[IN;SUBSET];
5067   ]);;
5068
5069   (* }}} *)
5070
5071 let convergent_subseq = prove_by_refinement(
5072   `!(X:A->bool) d f. metric_space(X,d) /\ (totally_bounded(X,d)) /\
5073      (complete (X,d)) /\ (sequence X f)  ==>
5074      ((?(ss:num->num). (subseq ss) /\ (converge (X,d) (f o ss))))`,
5075   (* {{{ proof *)
5076   [
5077   DISCH_ALL_TAC;
5078     TYPE_THEN `?ss. (subseq ss) /\ (cauchy_seq(X,d) (f o ss))` SUBGOAL_TAC;
5079   ASM_MESON_TAC[cauchy_subseq];
5080   DISCH_ALL_TAC;
5081   CHO 4;
5082   EXISTS_TAC `ss:num->num`;
5083   USE 2 (REWRITE_RULE[complete]);
5084   ASM_REWRITE_TAC[];
5085   ASM_MESON_TAC[];
5086   ]);;
5087   (* }}} *)
5088
5089 let dense = euclid_def `!U Z. dense U Z <=>
5090   (closure U (Z:A->bool) = UNIONS U)`;;
5091
5092 let hausdorff = euclid_def `hausdorff U  <=> (!x y.
5093    (UNIONS U (x:A) /\ UNIONS U y /\ ~(x = y)) ==>
5094    (?A B. (U A) /\ (U B) /\ (A x) /\ (B y) /\ (A INTER B = EMPTY)))`;;
5095
5096 let dense_subset = prove_by_refinement(
5097   `!U Z. (topology_ U) /\ (dense U (Z:A->bool)) ==>
5098       (Z SUBSET (UNIONS U))`,
5099   (* {{{ proof *)
5100   [
5101   REWRITE_TAC[dense];
5102   MESON_TAC[subset_closure];
5103   ]);;
5104   (* }}} *)
5105
5106 let dense_open = prove_by_refinement(
5107   `!U Z. (topology_ U) /\ (Z SUBSET (UNIONS U)) ==>
5108    (dense U (Z:A->bool) <=>
5109     (!A. (open_ U A) /\ ( (A INTER Z) = EMPTY) ==> (A = EMPTY)))`,
5110   (* {{{ proof *)
5111   [
5112   DISCH_ALL_TAC;
5113   EQ_TAC;
5114   DISCH_TAC;
5115   DISCH_ALL_TAC;
5116   COPY 3;
5117   COPY 0;
5118   JOIN 0 3;
5119   USE 0 (MATCH_MP (open_closed));
5120   TYPE_THEN `Z SUBSET (UNIONS U DIFF A)` SUBGOAL_TAC;
5121   ALL_TAC ; (* do1 *)
5122   REWRITE_TAC[DIFF_SUBSET];
5123   ONCE_REWRITE_TAC[INTER_COMM];
5124   ASM_REWRITE_TAC[];
5125   DISCH_TAC;
5126   JOIN 0 3;
5127   JOIN 6 0;
5128   USE 0 (MATCH_MP closure_subset);
5129   USE 0 (REWRITE_RULE[DIFF_SUBSET]);
5130   AND 0;
5131   USE 2 (REWRITE_RULE[dense]);
5132   H_REWRITE_RULE [(HYP "2")] (HYP "0");
5133   (USE 5 (REWRITE_RULE[open_DEF]));
5134   USE 5 (MATCH_MP sub_union);
5135   USE 5 (REWRITE_RULE[ SUBSET_INTER_ABSORPTION]);
5136   USE 5 (ONCE_REWRITE_RULE[INTER_COMM]);
5137   ASM_MESON_TAC[];
5138   REWRITE_TAC[dense];
5139   DISCH_TAC ;
5140   MATCH_MP_TAC  EQ_SYM;
5141   UND 0;
5142   UND 1;
5143   SIMP_TAC [closure_open];
5144   DISCH_TAC ;
5145   SIMP_TAC[closed_UNIV];
5146   DISCH_TAC ;
5147   DISCH_ALL_TAC;
5148   DISCH_ALL_TAC;
5149   USE 2 (SPEC `B:A->bool`);
5150   REWR 2;
5151   ASM_REWRITE_TAC[];
5152   REWRITE_TAC[INTER_EMPTY];
5153    ]);;
5154   (* }}} *)
5155
5156 let countable_dense = prove_by_refinement(
5157   `!(X:A->bool) d. (metric_space(X,d)) /\ (totally_bounded(X,d)) ==>
5158      ?Z. (COUNTABLE Z) /\ (dense (top_of_metric(X,d)) Z)`,
5159   (* {{{ proof *)
5160
5161   [
5162   DISCH_ALL_TAC;
5163   TYPE_THEN `!r. ?z. (COUNTABLE z) /\ (z SUBSET X) /\ (X = UNIONS (IMAGE (\x. open_ball(X,d) x (twopow(--: (&:r)))) z))` SUBGOAL_TAC;
5164   GEN_TAC;
5165   COPY 0;
5166   COPY 1;
5167   JOIN 2 3;
5168   USE 2 (MATCH_MP center_FINITE);
5169   USE 2 (SPEC `twopow (--: (&:r))`);
5170   H_MATCH_MP (HYP "2") (THM (SPEC `(--: (&:r))` twopow_pos));
5171   X_CHO 3 `z:A->bool`;
5172   EXISTS_TAC `z:A->bool`;
5173   ASM_REWRITE_TAC[];
5174   ASM_SIMP_TAC[FINITE_COUNTABLE];
5175   ASM_MESON_TAC[];
5176   CONV_TAC (quant_left_CONV "z");
5177   DISCH_THEN CHOOSE_TAC;
5178   TYPE_THEN  `UNIONS (IMAGE z (UNIV:num->bool))` EXISTS_TAC;
5179   CONJ_TAC;
5180   MATCH_MP_TAC  COUNTABLE_UNIONS;
5181   CONJ_TAC;
5182   MATCH_MP_TAC  (ISPEC `UNIV:num->bool` COUNTABLE_IMAGE);
5183   REWRITE_TAC[NUM_COUNTABLE];
5184   TYPE_THEN `z` EXISTS_TAC ;
5185   SET_TAC[];
5186   GEN_TAC;
5187   REWRITE_TAC[IN_IMAGE;IN_UNIV];
5188   ASM_MESON_TAC[ ];
5189   TYPE_THEN `U = top_of_metric (X,d)` ABBREV_TAC;
5190   TYPE_THEN `Z = UNIONS (IMAGE z UNIV)` ABBREV_TAC;
5191   TYPE_THEN `topology_ U /\ (Z SUBSET (UNIONS U))` SUBGOAL_TAC;
5192   EXPAND_TAC "U";
5193   KILL 3;
5194   ASM_SIMP_TAC[top_of_metric_top;GSYM top_of_metric_unions];
5195   EXPAND_TAC "Z";
5196   MATCH_MP_TAC  UNIONS_SUBSET;
5197   REWRITE_TAC[IN_IMAGE;IN_UNIV];
5198   ASM_MESON_TAC[];
5199   SIMP_TAC[dense_open];
5200   DISCH_ALL_TAC;
5201   GEN_TAC;
5202   REWRITE_TAC[open_DEF];
5203   MATCH_MP_TAC  (TAUT `( a /\ ~b ==> ~c) ==> (a /\ c ==> b)`);
5204   EXPAND_TAC "U";
5205   ASM_SIMP_TAC [top_of_metric_nbd];
5206   REWRITE_TAC[GSYM MEMBER_NOT_EMPTY];
5207   DISCH_ALL_TAC;
5208   CHO 9;
5209   TYPE_THEN `x` (fun t-> (USE 8 (SPEC t)));
5210   REWR 8;
5211   X_CHO 8 `eps:real`;
5212   ALL_TAC; (*"cd5"*)
5213   SUBGOAL_TAC `?r. twopow(--: (&:r)) < eps`;
5214   ASSUME_TAC (SPECL [`&.1`;`eps:real`] twopow_eps);
5215   USE 10 (CONV_RULE REDUCE_CONV);
5216   ASM_MESON_TAC[];
5217   DISCH_THEN CHOOSE_TAC;
5218   USE 2 (SPEC `r:num`);
5219   AND 2;
5220   AND 2;
5221   TYPE_THEN `x IN X` SUBGOAL_TAC;
5222   ASM SET_TAC[IN;SUBSET];
5223   ASM ONCE_REWRITE_TAC[];
5224   REWRITE_TAC[UNIONS;IN_ELIM_THM';IN_IMAGE];
5225   DISCH_THEN CHOOSE_TAC;
5226   AND 13;
5227   X_CHO 14 `z0:A`;
5228   REWR 13;
5229   AND 14;
5230   EXISTS_TAC `z0:A`;
5231   REWRITE_TAC[IN_INTER];
5232   USE 13  (REWRITE_RULE[IN]);
5233   USE 13 (MATCH_MP open_ball_dist);
5234   CONJ_TAC;
5235   USE 8 (REWRITE_RULE [open_ball;SUBSET]);
5236   AND 8;
5237   USE 8 (SPEC `z0:A`);
5238   USE 8 (REWRITE_RULE [IN_ELIM_THM']);
5239   UND 8;
5240   DISCH_THEN (MATCH_MP_TAC  );
5241   ALL_TAC; (* "cd6" *)
5242   SUBCONJ_TAC;
5243   ASM SET_TAC[IN;SUBSET];
5244   DISCH_TAC;
5245   SUBCONJ_TAC;
5246   ASM SET_TAC[IN;SUBSET];
5247   DISCH_TAC;
5248   UND 13;
5249   UND 10;
5250   USE 0 (REWRITE_RULE[metric_space]);
5251   TYPEL_THEN [`z0`;`x`;`z0`] (fun t-> USE 0 (SPECL t));
5252   REWR 0;
5253   UND 0;
5254   REAL_ARITH_TAC;
5255   EXPAND_TAC "Z";
5256   REWRITE_TAC[IN_UNIONS;IN_IMAGE;IN_UNIV];
5257   UND 14;
5258   MESON_TAC[];
5259   ]);;
5260
5261   (* }}} *)
5262
5263 let metric_hausdorff = prove_by_refinement(
5264   `! (X:A->bool) d. (metric_space(X,d))==>
5265     (hausdorff (top_of_metric(X,d)))`,
5266   (* {{{ proof *)
5267
5268   [
5269   DISCH_ALL_TAC;
5270   REWRITE_TAC[hausdorff;];
5271   ASM_SIMP_TAC [GSYM top_of_metric_unions];
5272   DISCH_ALL_TAC;
5273   COPY 0;
5274   USE 4 (REWRITE_RULE[metric_space]);
5275   TYPEL_THEN [`x`;`y`;`x`] (USE 4 o SPECL);
5276   REWR 4;
5277   TYPE_THEN  `r = d x y` ABBREV_TAC;
5278   SUBGOAL_TAC `&.0 <. r`;
5279   UND 4;
5280   ARITH_TAC;
5281   DISCH_TAC;
5282   TYPE_THEN  `open_ball(X,d) x (r/(&.2))`   EXISTS_TAC;
5283   TYPE_THEN  `open_ball(X,d) y (r/(&.2))`   EXISTS_TAC;
5284   ALL_TAC; (* mh1 *)
5285   KILL 4;
5286   ASM_SIMP_TAC[open_ball_open];
5287   COPY 6;
5288   USE 4 (ONCE_REWRITE_RULE[GSYM REAL_LT_HALF1]);
5289   ASM_SIMP_TAC[REWRITE_RULE[IN] open_ball_nonempty];
5290   PROOF_BY_CONTR_TAC;
5291   USE 7 (REWRITE_RULE[EMPTY_EXISTS]);
5292   CHO 7;
5293   USE 7 (REWRITE_RULE[IN_INTER]);
5294   USE 7 (REWRITE_RULE[IN]);
5295   ALL_TAC; (* mh2 *)
5296   AND 7;
5297   COPY 7;
5298   COPY 8;
5299   USE 7 (MATCH_MP open_ball_dist);
5300   USE 8 (MATCH_MP open_ball_dist);
5301   USE 0 (REWRITE_RULE[metric_space]);
5302   COPY 0;
5303   TYPEL_THEN [`x`;`u`;`y`] (fun t-> (USE 0 (ISPECL t)));
5304   TYPEL_THEN [`y`;`u`;`y`] (fun t-> (USE 11 (ISPECL t)));
5305   UND 11;
5306   UND 0;
5307   ASM_REWRITE_TAC[];
5308   TYPE_THEN `X u` SUBGOAL_TAC;
5309   ASM_MESON_TAC[ open_ball_subset;IN;SUBSET];
5310   DISCH_THEN (REWRT_TAC);
5311   DISCH_ALL_TAC;
5312   UND 14;
5313   UND 0;
5314   DISCH_THEN (fun t-> REWRITE_TAC[GSYM t]);
5315   JOIN 7 8;
5316   USE 0 (MATCH_MP (REAL_ARITH `(a <. c) /\ (b < c) ==> b+a < c + c`));
5317   USE 0 (CONV_RULE REDUCE_CONV);
5318   ASM_MESON_TAC[real_lt];
5319   ]);;
5320
5321   (* }}} *)
5322
5323 (* compactness *)
5324
5325 let compact = euclid_def `compact U (K:A->bool) <=>
5326      (K SUBSET UNIONS U) /\ (!V. (K SUBSET UNIONS V ) /\ (V SUBSET U) ==>
5327         (?W. (W SUBSET V) /\ (FINITE W) /\ (K SUBSET UNIONS W )))`;;
5328
5329 let closed_compact = prove_by_refinement(
5330   `!U K (S:A->bool). ((topology_ U) /\ (compact U K) /\
5331      (closed_ U S) /\ (S SUBSET K)) ==> (compact U S)`,
5332   (* {{{ proof *)
5333   [
5334   REWRITE_TAC[compact];
5335   DISCH_ALL_TAC;
5336   DISCH_ALL_TAC;
5337   SUBCONJ_TAC;
5338   ASM_MESON_TAC[ SUBSET_TRANS];
5339   DISCH_ALL_TAC;
5340   DISCH_ALL_TAC;
5341   TYPE_THEN `A = UNIONS U DIFF S` ABBREV_TAC;
5342   TYPE_THEN `open_ U A` SUBGOAL_TAC ;
5343   ASM_MESON_TAC[ closed_open];
5344   TYPE_THEN `V' = (A INSERT V)` ABBREV_TAC;
5345   DISCH_ALL_TAC;
5346   TYPE_THEN `V'` (USE 2 o SPEC);
5347   ALL_TAC; (* cc1 *)
5348   TYPE_THEN `K SUBSET UNIONS V'` SUBGOAL_TAC;
5349   EXPAND_TAC "V'";
5350   EXPAND_TAC "A";
5351   UND 6;
5352   UND 4;
5353   UND  1;
5354   TYPE_THEN `X = UNIONS U ` ABBREV_TAC;
5355   ALL_TAC; (* cc2 *)
5356   REWRITE_TAC[SUBSET_UNIONS_INSERT];
5357   SET_TAC[SUBSET;UNIONS;DIFF];
5358   DISCH_ALL_TAC;
5359   TYPE_THEN `V' SUBSET U` SUBGOAL_TAC;
5360   EXPAND_TAC "V'";
5361   EXPAND_TAC "A";
5362   REWRITE_TAC[INSERT_SUBSET];
5363   ASM_REWRITE_TAC[];
5364   ASM_MESON_TAC[IN;open_DEF];
5365   DISCH_ALL_TAC;
5366   REWR 2;
5367   CHO 2;
5368   TYPE_THEN `W DELETE A` EXISTS_TAC;
5369   CONJ_TAC;
5370   AND 2;
5371   UND 13;
5372   EXPAND_TAC "V'";
5373   SET_TAC[SUBSET;INSERT;DELETE];
5374   ASM_REWRITE_TAC[FINITE_DELETE];
5375   AND 2;
5376   AND 2;
5377   UND 2;
5378   UND 4;
5379   UND 1;
5380   EXPAND_TAC "A";
5381   TYPE_THEN `X = UNIONS U ` ABBREV_TAC;
5382   ALL_TAC; (* cc3 *)
5383   DISCH_ALL_TAC;
5384   MATCH_MP_TAC  UNIONS_DELETE2;
5385   CONJ_TAC;
5386   ASM_MESON_TAC[SUBSET_TRANS];
5387   SET_TAC[INTER;DIFF];
5388   ]);;
5389   (* }}} *)
5390
5391
5392 let compact_closed = prove_by_refinement(
5393   `!U (K:A->bool). (topology_ U) /\ (hausdorff U) /\ (compact U K) ==>
5394      (closed_ U K)`,
5395   (* {{{ proof *)
5396
5397   [
5398    REWRITE_TAC[hausdorff;compact;closed];
5399   DISCH_ALL_TAC;
5400   ASM_REWRITE_TAC[open_DEF];
5401   ONCE_ASM_SIMP_TAC[open_nbd];
5402   TYPE_THEN `C = UNIONS U DIFF K` ABBREV_TAC;
5403   GEN_TAC;
5404   CONV_TAC (quant_right_CONV "B");
5405   DISCH_ALL_TAC;
5406   (* cc1 *)
5407   TYPE_THEN `!y. (K y) ==> (?A B. (U A /\ U B /\ A x /\ B y /\ (A INTER B = {})))` SUBGOAL_TAC;
5408   DISCH_ALL_TAC;
5409   UND 1;
5410   DISCH_THEN MATCH_MP_TAC;
5411   CONJ_TAC;
5412   UND 5;
5413   EXPAND_TAC "C";
5414   REWRITE_TAC[DIFF;IN_ELIM_THM'];
5415   REWRITE_TAC [IN];
5416   MESON_TAC[];
5417   CONJ_TAC;
5418   UND 6;
5419   UND 2;
5420   REWRITE_TAC[SUBSET;IN];
5421   MESON_TAC[];
5422   PROOF_BY_CONTR_TAC;
5423   REWR 1;
5424   REWR 5;
5425   UND 5;
5426   UND 6;
5427   EXPAND_TAC "C";
5428   REWRITE_TAC[DIFF;IN_ELIM_THM'];
5429   MESON_TAC[IN];
5430   (* cc2 *)
5431   DISCH_ALL_TAC;
5432   USE 6 (CONV_RULE (quant_left_CONV "B"));
5433   USE 6 (CONV_RULE (quant_left_CONV "B"));
5434   USE 6 (CONV_RULE (quant_left_CONV "B"));
5435   CHO 6;
5436   TYPE_THEN `IMAGE B K` (USE 3 o SPEC);
5437   TYPE_THEN `K SUBSET UNIONS (IMAGE B K) /\ IMAGE B K SUBSET U` SUBGOAL_TAC;
5438   CONJ_TAC;
5439   REWRITE_TAC[SUBSET;UNIONS;IN_IMAGE;IN_ELIM_THM'];
5440   X_GEN_TAC `y:A`;
5441   REWRITE_TAC[IN];
5442   ASM_MESON_TAC[];
5443   REWRITE_TAC[SUBSET;IN_IMAGE];
5444   NAME_CONFLICT_TAC;
5445   CONV_TAC (quant_left_CONV "x'");
5446   CONV_TAC (quant_left_CONV "x'");
5447   ASM_MESON_TAC[IN];
5448   DISCH_TAC;
5449   REWR 3;
5450   CHO 3;
5451   (* cc3 *)
5452   AND 3;
5453   AND 3;
5454   JOIN 8 9;
5455   USE 8 (MATCH_MP finite_subset);
5456   X_CHO 8 `kc:A->bool`;
5457   USE 6 (CONV_RULE (quant_left_CONV "A"));
5458   USE 6 (CONV_RULE (quant_left_CONV "A"));
5459   CHO 6;
5460   (* cc4 *)
5461   TYPE_THEN  `K = EMPTY` ASM_CASES_TAC;
5462   REWR 4;
5463   USE 4 (REWRITE_RULE[DIFF_EMPTY]);
5464   EXISTS_TAC `C:A->bool`;
5465   ASM_REWRITE_TAC[SUBSET_REFL];
5466   EXPAND_TAC "C";
5467   USE 0 (REWRITE_RULE[topology]);
5468   UND 0;
5469   MESON_TAC[topology;IN;SUBSET_REFL];
5470   TYPE_THEN `~(kc = EMPTY)` SUBGOAL_TAC;
5471   PROOF_BY_CONTR_TAC;
5472   USE 10 (REWRITE_RULE[]);
5473   REWR 8;
5474   USE 8 (REWRITE_RULE[IMAGE_CLAUSES]);
5475   REWR 3;
5476   USE 3 (REWRITE_RULE[UNIONS_0;SUBSET_EMPTY]);
5477   ASM_MESON_TAC[ ];
5478   REWRITE_TAC[EMPTY_EXISTS];
5479   DISCH_THEN CHOOSE_TAC;
5480   ALL_TAC; (* cc5 *)
5481   TYPE_THEN `INTERS (IMAGE A kc)` EXISTS_TAC;
5482   TYPE_THEN `INTERS (IMAGE A kc) INTER (UNIONS (IMAGE B kc)) = EMPTY` SUBGOAL_TAC;
5483   REWRITE_TAC[INTER;UNIONS];
5484   MATCH_MP_TAC  EQ_EXT;
5485   GEN_TAC;
5486   REWRITE_TAC[IN_ELIM_THM';EMPTY];
5487   MATCH_MP_TAC  (TAUT `(a ==> ~b )==> ~(a /\ b)`);
5488   REWRITE_TAC[IN_INTERS;IN_IMAGE];
5489   DISCH_ALL_TAC;
5490   CHO 11;
5491   AND 11;
5492   CHO 13;
5493   IN_ELIM 13;
5494   REWR 11;
5495   USE  12 (CONV_RULE (quant_left_CONV "x"));
5496   USE  12 (CONV_RULE (quant_left_CONV "x"));
5497   TYPE_THEN `x''` (USE 12 o SPEC);
5498   TYPE_THEN `A x''` (USE 12 o SPEC);
5499   IN_ELIM 12;
5500   REWR 12;
5501   TYPE_THEN `x''` (USE 6 o SPEC);
5502   TYPE_THEN `K x''` SUBGOAL_TAC;
5503   UND 13;
5504   AND 8;
5505   UND 13;
5506   MESON_TAC[SUBSET;IN];
5507   DISCH_TAC;
5508   REWR 6;
5509   USE 6 (REWRITE_RULE [INTER]);
5510   (AND 6);
5511   (AND 6);
5512   (AND 6);
5513   (AND 6);
5514   USE 6 (fun t-> AP_THM t `x':A`);
5515   USE 6 (REWRITE_RULE[IN_ELIM_THM';EMPTY]);
5516   ASM_MESON_TAC[IN];
5517   DISCH_TAC;
5518   ALL_TAC; (* cc6 *)
5519   SUBCONJ_TAC;
5520   EXPAND_TAC "C";
5521   REWRITE_TAC[DIFF_SUBSET];
5522   CONJ_TAC;
5523   MATCH_MP_TAC  INTERS_SUBSET2;
5524   TYPE_THEN `A u` EXISTS_TAC ;
5525   REWRITE_TAC[IMAGE;IN_ELIM_THM'];
5526   CONJ_TAC;
5527   TYPE_THEN `u` EXISTS_TAC;
5528   ASM_REWRITE_TAC[];
5529   MATCH_MP_TAC  sub_union;
5530   TYPE_THEN `u` (USE 6 o SPEC);
5531   AND 8;
5532   USE 12 (REWRITE_RULE[SUBSET;IN]);
5533   ASM_MESON_TAC[IN];
5534   UND 3;
5535   ASM_REWRITE_TAC[];
5536   UND 11;
5537   TYPE_THEN `a' = INTERS (IMAGE A kc)` ABBREV_TAC;
5538   TYPE_THEN `b' = UNIONS (IMAGE B kc)` ABBREV_TAC;
5539   SET_TAC[INTER;SUBSET;EMPTY];
5540   DISCH_TAC;
5541   ALL_TAC; (* cc7 *)
5542   CONJ_TAC;
5543   REWRITE_TAC[INTERS;IN_IMAGE;IN_ELIM_THM'];
5544   GEN_TAC;
5545   DISCH_THEN CHOOSE_TAC;
5546   TYPE_THEN `x'` (USE 6 o SPEC);
5547   ASM_REWRITE_TAC[];
5548   USE 8 (REWRITE_RULE[SUBSET;IN]);
5549   ASM_MESON_TAC[IN];
5550   MATCH_MP_TAC  open_inters;
5551   ASM_REWRITE_TAC[];
5552   CONJ_TAC;
5553   REWRITE_TAC[SUBSET;IN_IMAGE;];
5554   NAME_CONFLICT_TAC;
5555   GEN_TAC;
5556   DISCH_THEN CHOOSE_TAC;
5557   USE 6 (SPEC `x':A`);
5558   USE 8 (REWRITE_RULE[SUBSET;IN]);
5559   ASM_MESON_TAC[IN];
5560   CONJ_TAC;
5561   ASM_MESON_TAC[FINITE_IMAGE];
5562   REWRITE_TAC[EMPTY_EXISTS];
5563   TYPE_THEN `A u` EXISTS_TAC;
5564   REWRITE_TAC[IN_IMAGE];
5565   ASM_MESON_TAC[];
5566   ]);;
5567
5568   (* }}} *)
5569
5570 let compact_totally_bounded = prove_by_refinement(
5571   `!(X:A->bool) d.( metric_space(X,d)) /\ (compact (top_of_metric(X,d)) X)
5572     ==> (totally_bounded (X,d))`,
5573   (* {{{ proof *)
5574   [
5575   REWRITE_TAC[totally_bounded;compact];
5576   DISCH_ALL_TAC;
5577   DISCH_ALL_TAC;
5578   CONV_TAC (quant_right_CONV "B");
5579   DISCH_TAC;
5580   TYPE_THEN `IMAGE (\x. open_ball(X,d) x eps) X` (USE 2 o SPEC);
5581   TYPE_THEN `X SUBSET UNIONS (IMAGE (\x. open_ball (X,d) x eps) X)` SUBGOAL_TAC;
5582   (REWRITE_TAC[SUBSET;IN_UNIONS;IN_IMAGE]);
5583   GEN_TAC;
5584   NAME_CONFLICT_TAC;
5585   REWRITE_TAC[IN];
5586   DISCH_TAC;
5587   CONV_TAC (quant_left_CONV "x'");
5588   CONV_TAC (quant_left_CONV "x'");
5589   TYPE_THEN `x` EXISTS_TAC;
5590   TYPE_THEN `open_ball (X,d) x eps` EXISTS_TAC;
5591   ASM_REWRITE_TAC[];
5592   ASM_MESON_TAC[open_ball_nonempty;IN];
5593   DISCH_TAC;
5594   REWR 2;
5595   ALL_TAC; (* ctb1 *)
5596   TYPE_THEN `IMAGE (\x. open_ball (X,d) x eps) X SUBSET top_of_metric (X,d)` SUBGOAL_TAC;
5597   TYPE_THEN `IMAGE (\x. open_ball (X,d) x eps) X SUBSET open_balls(X,d)` SUBGOAL_TAC;
5598   REWRITE_TAC[SUBSET;IN_IMAGE;open_balls;IN_ELIM_THM'];
5599   MESON_TAC[IN];
5600   MESON_TAC[SUBSET_TRANS;top_of_metric_open_balls];
5601   DISCH_TAC;
5602   REWR 2;
5603   CHO 2;
5604   TYPE_THEN `W` EXISTS_TAC;
5605   ASM_REWRITE_TAC[];
5606   CONJ_TAC;
5607   DISCH_ALL_TAC;
5608   AND 2;
5609   USE  7 (REWRITE_RULE [SUBSET;IN_IMAGE]);
5610   ASM_MESON_TAC[IN];
5611   MATCH_MP_TAC  SUBSET_ANTISYM;
5612   ASM_REWRITE_TAC[];
5613   TYPE_THEN `W SUBSET top_of_metric (X,d)` SUBGOAL_TAC;
5614   ASM_MESON_TAC[SUBSET_TRANS];
5615   DISCH_ALL_TAC;
5616   USE 6 (MATCH_MP UNIONS_UNIONS);
5617   ASM_MESON_TAC[top_of_metric_unions];
5618   ]);;
5619   (* }}} *)
5620
5621 (*
5622    If W is empty then INTERS W = UNIV, rather than EMPTY.
5623    Thus, extra arguments must be provided for this case. *)
5624
5625 let finite_inters = prove_by_refinement(
5626   `!U V . (topology_ U) /\ (compact U (UNIONS U)) /\ (INTERS V = EMPTY) /\
5627         (!(u:A->bool). (V u) ==> (closed_ U u))
5628     ==> (?W. (W SUBSET V) /\ (FINITE W) /\ (INTERS W = EMPTY))`,
5629   (* {{{ proof *)
5630
5631   [
5632   REWRITE_TAC[compact;SUBSET_REFL];
5633   DISCH_ALL_TAC;
5634   (* {{{ proof *)
5635
5636   TYPE_THEN `IMAGE (\r. ((UNIONS U) DIFF r)) V` (USE 1 o SPEC);
5637   TYPE_THEN `IMAGE (\r. UNIONS U DIFF r) V SUBSET U` SUBGOAL_TAC;
5638   REWRITE_TAC[IMAGE;SUBSET;IN_ELIM_THM'];
5639   GEN_TAC;
5640   DISCH_THEN CHOOSE_TAC;
5641   ASM_REWRITE_TAC[];
5642   ASM_SIMP_TAC[top_univ;IN;SUBSET_DIFF];
5643   IN_ELIM 4;
5644   TYPE_THEN `x'` (USE 3 o SPEC);
5645   REWR 3;
5646   USE 3 (REWRITE_RULE[closed;open_DEF]);
5647   ASM_REWRITE_TAC[];
5648   DISCH_TAC;
5649   REWR 1;
5650   ALL_TAC; (* fi1 *)
5651   TYPE_THEN `UNIONS U SUBSET UNIONS (IMAGE (\r. UNIONS U DIFF r) V)` SUBGOAL_TAC;
5652   REWRITE_TAC[SUBSET;IN_UNIONS;IN_IMAGE];
5653   GEN_TAC;
5654   DISCH_THEN CHOOSE_TAC;
5655   NAME_CONFLICT_TAC;
5656   USE 2 (REWRITE_RULE[INTERS_EQ_EMPTY]);
5657   TYPE_THEN `x` (USE 2 o SPEC);
5658   CHO 2;
5659   CONV_TAC (quant_left_CONV "x'");
5660   CONV_TAC (quant_left_CONV "x'");
5661   TYPE_THEN `a` EXISTS_TAC;
5662   TYPE_THEN `UNIONS U DIFF a` EXISTS_TAC ;
5663   ASM_REWRITE_TAC[IN];
5664   REWRITE_TAC[DIFF;IN_ELIM_THM';IN_UNIONS];
5665   ASM_MESON_TAC[IN];
5666   DISCH_TAC;
5667   REWR 1;
5668   CHO 1;
5669   AND 1;
5670   AND 1;
5671   JOIN 7 6;
5672 (*** Modified by JRH for changed theorem name
5673   USE 6 (MATCH_MP FINITE_SUBSET_IMAGE);
5674  ****)
5675   USE 6 (MATCH_MP FINITE_SUBSET_IMAGE_IMP);
5676   CHO 6;
5677   ALL_TAC; (* fi2*)
5678   TYPE_THEN `s'={}` ASM_CASES_TAC ;
5679   REWR 6;
5680   USE  6 (REWRITE_RULE[IMAGE_CLAUSES;SUBSET_EMPTY]);
5681   REWR 1;
5682   USE 1 (REWRITE_RULE[UNIONS_0;SUBSET_EMPTY]);
5683   USE 1 (REWRITE_RULE [UNIONS_EQ_EMPTY]);
5684   UND 1;
5685   DISCH_THEN DISJ_CASES_TAC;
5686   REWR 4;
5687   USE 4 (REWRITE_RULE[SUBSET_EMPTY;IMAGE;EQ_EMPTY;IN_ELIM_THM']);
5688   TYPE_THEN `V = {}` SUBGOAL_TAC;
5689   PROOF_BY_CONTR_TAC;
5690   USE 8 (REWRITE_RULE[EMPTY_EXISTS]);
5691   CHO 8;
5692   USE 4 (CONV_RULE (quant_left_CONV "x'"));
5693   USE 4 (CONV_RULE (quant_left_CONV "x'"));
5694   TYPE_THEN `u` (USE 4 o SPEC);
5695   TYPE_THEN `UNIONS {} DIFF u` (USE 4 o SPEC);
5696   ASM_MESON_TAC[];
5697   USE 2 (REWRITE_RULE[INTERS_EQ_EMPTY]);
5698   REWRITE_TAC[EQ_EMPTY];
5699   ASM_MESON_TAC[];
5700   ALL_TAC; (* fi3*)
5701   TYPE_THEN `V` EXISTS_TAC;
5702   ASM_REWRITE_TAC[SUBSET_REFL];
5703   USE 3 (REWRITE_RULE[closed;open_DEF]);
5704   REWR 3;
5705   USE 3 (REWRITE_RULE[REWRITE_RULE[IN] IN_SING]);
5706   TYPE_THEN `!u. V u ==> (u = EMPTY)` SUBGOAL_TAC;
5707   DISCH_ALL_TAC;
5708   TYPE_THEN `u` (USE 3 o SPEC);
5709   REWR 3;
5710   AND 3;
5711   ASM_MESON_TAC[ SUBSET_EMPTY;UNIONS_EQ_EMPTY];
5712   DISCH_TAC;
5713   TYPE_THEN `V SUBSET {EMPTY}` SUBGOAL_TAC;
5714   REWRITE_TAC[INSERT_DEF];
5715   REWRITE_TAC[IN_ELIM_THM'];
5716   REWRITE_TAC[IN;EMPTY;SUBSET];
5717   ASM_MESON_TAC[IN;EMPTY];
5718
5719   (* }}} *)
5720   MESON_TAC[FINITE_SING;FINITE_SUBSET];
5721   ALL_TAC; (* fi4*)
5722   TYPE_THEN `s'` EXISTS_TAC;
5723   ASM_REWRITE_TAC[INTERS_EQ_EMPTY];
5724   GEN_TAC;
5725   USE 7 (REWRITE_RULE[EMPTY_EXISTS]);
5726   CHO 7;
5727   TYPE_THEN `UNIONS U x` ASM_CASES_TAC ;
5728   TYPE_THEN `UNIONS W x` SUBGOAL_TAC;
5729   USE 1 (REWRITE_RULE[SUBSET;IN]);
5730   UND 8;
5731   UND 1;
5732   MESON_TAC[];
5733   DISCH_ALL_TAC;
5734   TYPE_THEN `UNIONS (IMAGE (\r. UNIONS U DIFF r) s') x` SUBGOAL_TAC;
5735   AND 6;
5736   AND 6;
5737   USE 6 (MATCH_MP UNIONS_UNIONS);
5738   USE 6 (REWRITE_RULE[SUBSET;IN]);
5739   ASM_MESON_TAC[];
5740   REWRITE_TAC[UNIONS;IN_IMAGE;IN_ELIM_THM'];
5741   REWRITE_TAC[IN];
5742   DISCH_ALL_TAC;
5743   LEFT 10 "x";
5744   LEFT 10 "x";
5745   TYPE_THEN `S:A->bool` (X_CHO 10) ;
5746   CHO 10;
5747   AND 10;
5748   REWR 10;
5749   TYPE_THEN `S` EXISTS_TAC;
5750   ASM_REWRITE_TAC[];
5751   USE 10(REWRITE_RULE[REWRITE_RULE[IN] IN_DIFF]);
5752   ASM_REWRITE_TAC[];
5753   TYPE_THEN `u` EXISTS_TAC;
5754   IN_ELIM 7;
5755   ASM_REWRITE_TAC[];
5756   PROOF_BY_CONTR_TAC;
5757   USE 9 (REWRITE_RULE[]);
5758   TYPE_THEN `V u` SUBGOAL_TAC;
5759   AND 6;
5760   AND 6;
5761   USE 11 (REWRITE_RULE[SUBSET;IN]);
5762   ASM_MESON_TAC[];
5763   DISCH_TAC;
5764   H_MATCH_MP (HYP "3") (HYP "10");
5765   USE 11(REWRITE_RULE[closed;open_DEF]);
5766   USE 11 (REWRITE_RULE [SUBSET;IN]);
5767   ASM_MESON_TAC[];
5768   ]);;
5769
5770   (* }}} *)
5771
5772
5773 (* first part of the proof of cauchy_subseq *)
5774 let cauchy_subseq_sublemma = prove_by_refinement(
5775   `!(X:A->bool) d f. ((metric_space(X,d))/\(totally_bounded(X,d)) /\
5776         (sequence X f)) ==>
5777     (?R Cn sn cond.
5778        (&0 < R) /\
5779        (!x y. X x /\ X y ==> d x y < R) /\
5780        (cond (X,0) 0) /\
5781        (sn 0 = 0) /\ (Cn 0 = X) /\
5782        (!n. Cn n SUBSET X /\ cond (Cn n,sn n) n) /\
5783        (!n. Cn (SUC n) SUBSET Cn n /\ sn n <| sn (SUC n)) /\
5784        (((\ (C,s). \n.
5785             (~FINITE {j | C (f j)}) /\
5786             (C (f s)) /\
5787            (!x y. (C x /\ C y) ==> d x y < R * (twopow (--: (&:n))))) =
5788        cond)
5789     ))`,
5790   (* {{{ proof *)
5791   [
5792   DISCH_ALL_TAC;
5793   COPY 0 THEN COPY 1;
5794   JOIN 4 3;
5795   USE 3 (MATCH_MP totally_bounded_bounded);
5796   CHO 3;
5797   CHO 3;
5798   ALL_TAC; (* {{{ xxx *)
5799   ALL_TAC; (* make r pos *)
5800   ASSUME_TAC (REAL_ARITH `r <. (&.1 + abs(r))`);
5801   ASSUME_TAC (REAL_ARITH `&.0 <. (&.1 + abs(r))`);
5802   ABBREV_TAC (`r' = &.1 +. abs(r)`);
5803   SUBGOAL_TAC `open_ball(X,d) a r SUBSET open_ball(X,d) (a:A) r'`;
5804   ASM_SIMP_TAC[open_ball_nest];
5805   DISCH_TAC;
5806   JOIN 3 7;
5807   USE 3 (MATCH_MP SUBSET_TRANS);
5808   KILL 6;
5809   KILL 4;
5810   ALL_TAC; (* "cs1" *)
5811   SUBGOAL_TAC `( !(x:A) y.  (X x) /\ (X y) ==> (d x y <. &.2 *. r'))`;
5812   DISCH_ALL_TAC;
5813   USE 3 (REWRITE_RULE[SUBSET;IN]);
5814   COPY 3;
5815   USE 7 (SPEC `x:A`);
5816   USE 3 (SPEC `y:A`);
5817   H_MATCH_MP (HYP "3") (HYP "6");
5818   H_MATCH_MP (HYP "7") (HYP "4");
5819   JOIN 9 8;
5820   JOIN 0 8;
5821   USE 0 (MATCH_MP BALL_DIST);
5822   ASM_REWRITE_TAC[];
5823   DISCH_TAC;
5824   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))))`;
5825   ABBREV_TAC `R = (&.2)*r'`;
5826   ALL_TAC ; (* 0 case of recursio *)
5827   ALL_TAC; (* cs2 *)
5828   SUBGOAL_TAC ` (X SUBSET X) /\ (cond ((X:A->bool),0) 0)`;
5829   REWRITE_TAC[SUBSET_REFL];
5830   EXPAND_TAC "cond";
5831   CONV_TAC (TOP_DEPTH_CONV  GEN_BETA_CONV);
5832   USE 2 (REWRITE_RULE[sequence;SUBSET;IN_IMAGE;IN_UNIV]);
5833   USE 2 (REWRITE_RULE[IN]);
5834   USE 2 (CONV_RULE (NAME_CONFLICT_CONV));
5835   SUBGOAL_TAC `!x. X((f:num->A) x)`;
5836   ASM_MESON_TAC[];
5837   REDUCE_TAC;
5838   REWRITE_TAC[TWOPOW_0] THEN REDUCE_TAC;
5839   ASM_REWRITE_TAC[];
5840   DISCH_TAC;
5841   SUBGOAL_TAC `{ j | (X:A->bool) (f j) } = (UNIV:num->bool)`;
5842   MATCH_MP_TAC EQ_EXT;
5843   REWRITE_TAC[IN_ELIM_THM;UNIV];
5844   ASM_REWRITE_TAC[];
5845   DISCH_THEN REWRT_TAC;
5846   ASM_REWRITE_TAC[];
5847   REWRITE_TAC[num_infinite];
5848   ALL_TAC; (* #save_goal "cs3" *)
5849   SUBGOAL_TAC `&.0 <. R`;
5850   EXPAND_TAC "R";
5851   UND 5;
5852   REAL_ARITH_TAC;
5853   DISCH_ALL_TAC;
5854   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))) )`;
5855   DISCH_ALL_TAC;
5856   CONV_TAC (quant_right_CONV "cs'");
5857   DISCH_TAC;
5858   AND 11;
5859   H_REWRITE_RULE[GSYM o (HYP "6")] (HYP "11");
5860   USE 13 (CONV_RULE (SUBS_CONV[GSYM(ISPEC `cs:(A->bool)#num` PAIR)]));
5861   USE 13 (CONV_RULE (TOP_DEPTH_CONV GEN_BETA_CONV));
5862   JOIN 10 13;
5863   JOIN 12 10;
5864   JOIN 2 10;
5865   JOIN 1 2;
5866   JOIN 0 1;
5867   USE 0 (MATCH_MP subsequence_rec);
5868   CHO 0;
5869   CHO 0;
5870   EXISTS_TAC `(C':A->bool,s':num)`;
5871   ASM_REWRITE_TAC[FST;SND];
5872   EXPAND_TAC "cond";
5873   (CONV_TAC (TOP_DEPTH_CONV GEN_BETA_CONV));
5874   ASM_REWRITE_TAC[];
5875   DISCH_TAC;
5876   ALL_TAC; (* "cs4" *)
5877   USE 11 (REWRITE_RULE[SKOLEM_THM]);
5878   CHO 11;
5879   ASSUME_TAC (ISPECL[`((X:A->bool),0)`;`cs':(((A->bool)#num)->(num->(A->bool)#num))`] num_RECURSION);
5880   CHO 12;
5881   ALL_TAC;(* EXISTS_TAC `\i. (SND ((fn : num->(A->bool)#num) i))`; *)
5882   USE 11 (CONV_RULE (quant_left_CONV "n"));
5883   USE 11 (SPEC `n:num`);
5884   USE 11 (SPEC `(fn:num->(A->bool)#num) n`);
5885   AND 12;
5886   H_REWRITE_RULE[GSYM o (HYP "12")] (HYP "11");
5887   USE 14 (GEN_ALL);
5888   ABBREV_TAC `sn = (\i. SND ((fn:num->(A->bool)#num) i))`;
5889   ABBREV_TAC `Cn = (\i. FST ((fn:num->(A->bool)#num) i))`;
5890   SUBGOAL_TAC `((sn:num->num) 0 = 0) /\ (Cn 0 = (X:A->bool))`;
5891   EXPAND_TAC "sn";
5892   EXPAND_TAC "Cn";
5893   UND 13;
5894   MESON_TAC[FST;SND];
5895   DISCH_TAC;
5896   KILL 13;
5897   KILL 11;
5898   SUBGOAL_TAC `!(n:num). ((fn n):(A->bool)#num) = (Cn n,sn n)`;
5899   EXPAND_TAC "sn";
5900   EXPAND_TAC "Cn";
5901   REWRITE_TAC[PAIR];
5902   DISCH_TAC;
5903   H_REWRITE_RULE[(HYP "11")] (HYP"14");
5904   KILL 12;
5905   KILL 14;
5906   KILL 11;
5907   KILL 16;
5908   KILL 15;
5909   ALL_TAC; (* }}} *)
5910   ALL_TAC; (* KILL 10; cs4m *)
5911   KILL 8;
5912   KILL 7;
5913   KILL 3;
5914   KILL 5;
5915   ALL_TAC; (* cs5 *)
5916   TYPE_THEN `!n. (Cn n SUBSET X) /\ (cond (Cn n,sn n) n)` SUBGOAL_TAC;
5917   INDUCT_TAC;
5918   ASM_REWRITE_TAC[];
5919   SET_TAC[SUBSET];
5920   USE 13 (SPEC `n:num`);
5921   REWR 5;
5922   ASM_REWRITE_TAC[];
5923   ASM_MESON_TAC[SUBSET_TRANS];
5924   DISCH_TAC;
5925   REWR 13;
5926   ALL_TAC; (* TO HERE EVERYTHING WORKS GENERALLY *)
5927   TYPE_THEN `R` EXISTS_TAC;
5928   TYPE_THEN `Cn` EXISTS_TAC;
5929   TYPE_THEN `sn` EXISTS_TAC;
5930   TYPE_THEN `cond` EXISTS_TAC;
5931   ASM_REWRITE_TAC[];
5932   ]);;
5933   (* }}} *)
5934
5935 (* more on metric spaces and topology *)
5936
5937 let subseq_cauchy = prove_by_refinement(
5938   `!(X:A->bool) d f s. (metric_space(X,d)) /\
5939     (cauchy_seq (X,d) f) /\ (subseq s) /\
5940     (converge(X,d) (f o s)) ==> (converge(X,d) f)`,
5941   (* {{{ proof *)
5942   [
5943   REWRITE_TAC[cauchy_seq;converge;sequence_in];
5944   DISCH_ALL_TAC;
5945   CHO 4;
5946   TYPE_THEN `x` EXISTS_TAC ;
5947   ASM_REWRITE_TAC[];
5948   DISCH_ALL_TAC;
5949   AND 4;
5950   TYPE_THEN `eps/(&.2)` (USE 2 o SPEC);
5951   TYPE_THEN `eps/(&.2)` (USE 4 o SPEC);
5952   CHO 4;
5953   CHO 2;
5954   CONV_TAC (quant_right_CONV "n");
5955   DISCH_ALL_TAC;
5956   USE 2 (REWRITE_RULE[REAL_LT_HALF1]);
5957   USE 4 (REWRITE_RULE[REAL_LT_HALF1]);
5958   REWR 2;
5959   REWR 4;
5960   TYPE_THEN `n'` EXISTS_TAC ;
5961   DISCH_ALL_TAC;
5962   TYPE_THEN `n +| n'` (USE 4 o SPEC);
5963   USE 4 (REWRITE_RULE[ARITH_RULE `n  <=| n +| n'`]);
5964   TYPE_THEN `s(n +| n')` (USE 2 o SPEC);
5965   TYPE_THEN `i` (USE 2 o SPEC);
5966   TYPE_THEN `n' <=| s (n +| n')` SUBGOAL_TAC;
5967   USE 3 (MATCH_MP SEQ_SUBLE);
5968   TYPE_THEN `n +| n'` (USE 3 o SPEC);
5969   ASM_MESON_TAC[ LE_TRANS; ARITH_RULE `n' <=| n +| n'`];
5970   DISCH_TAC;
5971   REWR 2;
5972   USE 4 (REWRITE_RULE[o_DEF]);
5973   (* save_goal"sc1"; *)
5974   TYPEL_THEN [`X`;`d`;`x`;`f (s(n +| n'))`;`f i`] (fun t-> ASSUME_TAC (ISPECL t metric_space_triangle));
5975   USE 5 (REWRITE_RULE[IN]);
5976   REWR 9;
5977   USE 1 (MATCH_MP sequence_in);
5978   REWR 9;
5979   UND 9;
5980   UND 4;
5981   UND 2;
5982   MP_TAC (SPEC `eps:real` REAL_HALF_DOUBLE);
5983   TYPE_THEN `a = d (f (s (n +| n'))) (f i)` ABBREV_TAC ;
5984   TYPE_THEN `b = d x (f (s (n +| n')))` ABBREV_TAC ;
5985   TYPE_THEN `c = d x (f i)` ABBREV_TAC ;
5986   REAL_ARITH_TAC;
5987   ]);;
5988   (* }}} *)
5989
5990 let compact_complete = prove_by_refinement(
5991   `!(X:A->bool) d. metric_space(X,d) /\
5992      (compact (top_of_metric(X,d)) X) ==>
5993      (complete(X,d))`,
5994   (* {{{ proof *)
5995
5996   [
5997   REWRITE_TAC [complete];
5998   DISCH_ALL_TAC;
5999   DISCH_ALL_TAC;
6000   COPY 0;
6001   COPY 1;
6002   JOIN 3 4;
6003   USE 3 (MATCH_MP compact_totally_bounded);
6004   COPY 2;
6005   USE 4 (REWRITE_RULE[cauchy_seq]);
6006   AND 4;
6007   COPY 0;
6008   COPY 3;
6009   COPY 5;
6010   JOIN 7 8;
6011   JOIN 6 7;
6012   USE 6 (MATCH_MP cauchy_subseq_sublemma);
6013   CHO 6;
6014   CHO 6;
6015   CHO 6;
6016   CHO 6;
6017   (AND 6);
6018   (AND 6);
6019   (AND 6);
6020   (AND 6);
6021   (AND 6);
6022   (AND 6);
6023   (AND 6);
6024   ALL_TAC ; (* cc1 *)
6025   MATCH_MP_TAC subseq_cauchy;
6026   TYPE_THEN `sn` EXISTS_TAC;
6027   ASM_REWRITE_TAC [converge];
6028   SUBCONJ_TAC;
6029   REWRITE_TAC[SUBSEQ_SUC];
6030   ASM_MESON_TAC[ ];
6031   DISCH_ALL_TAC;
6032   TYPE_THEN `~(INTERS {z | ?n. z = closed_ball(X,d) (f (sn n)) (R* twopow(--: (&:n)))} =EMPTY)` SUBGOAL_TAC;
6033   PROOF_BY_CONTR_TAC ;
6034   REWR 15;
6035   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));
6036   REWR 16;
6037   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 ;
6038   ASM_SIMP_TAC[GSYM top_of_metric_unions;];
6039   ASM_SIMP_TAC[top_of_metric_top];
6040   REWRITE_TAC[IN_ELIM_THM'];
6041   ASM_MESON_TAC[closed_ball_closed];
6042   DISCH_TAC;
6043   REWR 16;
6044   CHO 16;
6045   ALL_TAC ; (* cc2 *)
6046   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 ;
6047   MATCH_MP_TAC  EQ_EXT;
6048   GEN_TAC ;
6049   REWRITE_TAC[IN_ELIM_THM';INR IN_IMAGE;UNIV];
6050   DISCH_TAC;
6051   REWR 16;
6052   AND 16;
6053   AND 16;
6054   JOIN 20 19;
6055 (*** Modified by JRH for new theorem name
6056   USE 19 (MATCH_MP FINITE_SUBSET_IMAGE);
6057  ***)
6058   USE 19 (MATCH_MP FINITE_SUBSET_IMAGE_IMP);
6059   CHO 19;
6060   AND 19;
6061   AND 19;
6062 (*** JRH --- originally for implicational num_FINITE:
6063   USE 20 (MATCH_MP num_FINITE);
6064  ***)
6065   USE 20 (CONV_RULE (REWR_CONV num_FINITE));
6066   CHO 20;
6067   TYPE_THEN `f (sn a) IN (INTERS W)` SUBGOAL_TAC ;
6068   REWRITE_TAC[IN_INTERS];
6069   REWRITE_TAC[IN];
6070   DISCH_ALL_TAC;
6071   USE 19 (REWRITE_RULE [SUBSET;IN_IMAGE]);
6072   TYPE_THEN `t` (USE 19 o SPEC);
6073   USE 19 (REWRITE_RULE [IN]);
6074   REWR 19;
6075   X_CHO 19 `m:num`;
6076   USE 20 (SPEC `m:num`);
6077   USE 20 (REWRITE_RULE[IN]);
6078   REWR 20;
6079   TYPE_THEN `Cn m SUBSET closed_ball (X,d) (f (sn m)) (R * twopow (--: (&:m)))` SUBGOAL_TAC ;
6080   REWRITE_TAC[SUBSET;closed_ball;IN_ELIM_THM'];
6081   USE 12 (SPEC `m:num`);
6082   UND 12;
6083   EXPAND_TAC "cond";
6084   (CONV_TAC (TOP_DEPTH_CONV GEN_BETA_CONV));
6085   REWRITE_TAC[SUBSET];
6086   MESON_TAC[IN;REAL_ARITH `x <. y ==> x <=. y`];
6087   REWRITE_TAC[SUBSET;IN];
6088   DISCH_THEN (MATCH_MP_TAC  );
6089   ALL_TAC ; (* cc3 *)
6090   TYPE_THEN `Cn a SUBSET Cn m` SUBGOAL_TAC ;
6091   UND 13;
6092   UND 20;
6093   MESON_TAC [SUBSET_SUC2];
6094   REWRITE_TAC[SUBSET;IN];
6095   DISCH_THEN (MATCH_MP_TAC  );
6096   USE 12 (SPEC `a:num`);
6097   AND 12;
6098   UND 12;
6099   EXPAND_TAC "cond";
6100   (CONV_TAC (TOP_DEPTH_CONV GEN_BETA_CONV));
6101   MESON_TAC[];
6102   ASM_REWRITE_TAC [NOT_IN_EMPTY];
6103   DISCH_TAC;
6104   ALL_TAC ; (* cc4 *)
6105   USE 15 (REWRITE_RULE[EMPTY_EXISTS]);
6106   CHO 15;
6107   TYPE_THEN `u` EXISTS_TAC ;
6108   REWRITE_TAC[IN];
6109   SUBCONJ_TAC;
6110   USE 15 (REWRITE_RULE [IN_INTERS]);
6111   TYPE_THEN `closed_ball (X,d) (f (sn 0)) (R * twopow (--: (&:0)))` (USE 15 o SPEC);
6112   USE 15 (REWRITE_RULE[IN_ELIM_THM']);
6113   LEFT 15 "n";
6114   TYPE_THEN `0` (USE 15 o SPEC);
6115   USE 15 (REWRITE_RULE[IN;closed_ball]);
6116   USE 15 (REWRITE_RULE [IN_ELIM_THM']);
6117   ASM_REWRITE_TAC[];
6118   DISCH_ALL_TAC;
6119   DISCH_ALL_TAC;
6120   CONV_TAC (quant_right_CONV "n");
6121   DISCH_ALL_TAC;
6122   TYPEL_THEN [`(&.2)*R`;`eps`] (fun t-> ASSUME_TAC (ISPECL t twopow_eps));
6123   CHO 18;
6124   REWR 18;
6125   TYPE_THEN `n` EXISTS_TAC;
6126   DISCH_ALL_TAC;
6127   TYPE_THEN `&0 < &2 * R ` SUBGOAL_TAC;
6128   MATCH_MP_TAC  REAL_PROP_POS_MUL2;
6129   REDUCE_TAC;
6130   ASM_REWRITE_TAC[];
6131   ARITH_TAC;
6132   DISCH_ALL_TAC;
6133   REWR 18;
6134   UND 18;
6135   MATCH_MP_TAC  (REAL_ARITH `x <= a ==> ((a < b) ==> (x < b))`);
6136   USE 15 (REWRITE_RULE[IN_INTERS]);
6137   TYPE_THEN `closed_ball (X,d) (f (sn n)) (R * twopow (--: (&:n)))` (USE 15 o SPEC);
6138   USE 15 (REWRITE_RULE[IN_ELIM_THM']);
6139   LEFT 15 "n'";
6140   USE 15 (SPEC `n:num`);
6141   REWR 15;
6142   TYPE_THEN `Cn n SUBSET closed_ball (X,d) (f (sn n)) (R * twopow (--: (&:n)))`  SUBGOAL_TAC ;
6143   REWRITE_TAC[SUBSET;closed_ball;IN_ELIM_THM'];
6144   USE 12 (SPEC `n:num`);
6145   UND 12;
6146   EXPAND_TAC "cond";
6147   (CONV_TAC (TOP_DEPTH_CONV GEN_BETA_CONV));
6148   REWRITE_TAC[SUBSET];
6149   MESON_TAC[IN;REAL_ARITH `x <. y ==> x <=. y`];
6150   DISCH_TAC;
6151   TYPE_THEN `Cn i SUBSET Cn n` SUBGOAL_TAC ;
6152   UND 13;
6153   UND 19;
6154   MESON_TAC [SUBSET_SUC2];
6155   ALL_TAC ; (* REWRITE_TAC[SUBSET;IN];*)
6156   DISCH_ALL_TAC;
6157   USE 12 (SPEC `i:num`);
6158   AND 12;
6159   UND 12;
6160   EXPAND_TAC "cond";
6161   (CONV_TAC (TOP_DEPTH_CONV GEN_BETA_CONV));
6162   DISCH_ALL_TAC;
6163   TYPE_THEN `((f o sn) i)  IN closed_ball (X,d) (f (sn n)) (R * twopow (--: (&:n)))` SUBGOAL_TAC;
6164   KILL 1;
6165   KILL 0;
6166   KILL 2;
6167   KILL 3;
6168   KILL 5;
6169   KILL 4;
6170   JOIN  21 18;
6171   USE 0 (MATCH_MP SUBSET_TRANS);
6172   ALL_TAC; (* "CC5"; *)
6173   ASM_MESON_TAC[IN;o_DEF;SUBSET];
6174   REWRITE_TAC[GSYM REAL_MUL_ASSOC];
6175   UND 15;
6176   TYPE_THEN  `r = R * twopow (--: (&:n))` ABBREV_TAC;
6177   UND 0;
6178   REWRITE_TAC[IN];
6179   MESON_TAC[BALL_DIST_CLOSED];
6180   ]);;
6181
6182   (* }}} *)
6183
6184 let countable_cover = prove_by_refinement(
6185   `!(X:A->bool) d U. (metric_space(X,d)) /\ (totally_bounded(X,d)) /\
6186        (X SUBSET (UNIONS U)) /\ (U SUBSET (top_of_metric(X,d))) ==>
6187      (?V. (V SUBSET U) /\ (X SUBSET (UNIONS V)) /\ (COUNTABLE V))`,
6188   (* {{{ proof *)
6189
6190   [
6191   DISCH_ALL_TAC;
6192   TYPE_THEN `(?Z. COUNTABLE Z /\ dense (top_of_metric (X,d)) Z)` SUBGOAL_TAC;
6193   ASM_MESON_TAC[countable_dense];
6194   DISCH_ALL_TAC;
6195   CHO 4;
6196   TYPE_THEN  `S = {(z,n) | ?A. (Z z) /\ (open_ball(X,d) z (twopow(--: (&:n))) SUBSET A) /\ U A}` ABBREV_TAC ;
6197   TYPE_THEN `COUNTABLE S` SUBGOAL_TAC;
6198   IMATCH_MP_TAC  (INST_TYPE [`:A#num`,`:A`] COUNTABLE_IMAGE);
6199   TYPE_THEN `{(z,(n:num)) | (Z z) /\ (UNIV n)}` EXISTS_TAC ;
6200   CONJ_TAC ;
6201   IMATCH_MP_TAC  countable_prod;
6202   ASM_REWRITE_TAC [NUM_COUNTABLE];
6203   TYPE_THEN `I:(A#num) -> (A#num)` EXISTS_TAC;
6204   REWRITE_TAC[IMAGE_I;UNIV;SUBSET];
6205   IN_OUT_TAC;
6206   EXPAND_TAC "S";
6207   GEN_TAC;
6208   REWRITE_TAC[IN_ELIM_THM'];
6209   ASM_MESON_TAC[GSPEC];
6210   DISCH_TAC;
6211   TYPE_THEN `!z n. (S (z,n) ==> ?A. Z z /\ open_ball (X,d) z (twopow (--: (&:n))) SUBSET A /\ U A)` SUBGOAL_TAC;
6212   EXPAND_TAC "S";
6213   REWRITE_TAC[IN_ELIM_THM'];
6214   DISCH_ALL_TAC;
6215   CHO 7;
6216   CHO 7;
6217   AND 7;
6218   CHO 8;
6219   TYPE_THEN `A` EXISTS_TAC;
6220   ASM_MESON_TAC[PAIR_EQ];
6221   DISCH_TAC ;
6222   LEFT 7 "A";
6223   LEFT 7 "A";
6224   LEFT 7 "A";
6225   CHO 7;
6226   ALL_TAC ; (* "cc1"; *)
6227   TYPE_THEN `IMAGE (\ (z,n). A z n) S` EXISTS_TAC;
6228   SUBCONJ_TAC ;
6229   REWRITE_TAC[SUBSET;IN_IMAGE];
6230   NAME_CONFLICT_TAC;
6231   TYPE_THEN `Azn:A->bool`  X_GEN_TAC;
6232   DISCH_THEN (X_CHOOSE_TAC `zn:A#num`);
6233   USE 8 (SUBS [(ISPEC `zn:A#num` (GSYM PAIR))]);
6234   USE 8 (GBETA_RULE);
6235   TYPE_THEN `z = FST zn`  ABBREV_TAC ;
6236   TYPE_THEN `n = SND zn`  ABBREV_TAC ;
6237   IN_OUT_TAC;
6238   ASM_MESON_TAC[];
6239   DISCH_TAC;
6240   CONJ_TAC ;
6241   REWRITE_TAC[SUBSET];
6242   USE 2 (REWRITE_RULE[SUBSET;IN_UNIONS]);
6243   IN_OUT_TAC;
6244   DISCH_ALL_TAC;
6245   TYPE_THEN `x` (  USE 6 o SPEC);
6246   REWR 6;
6247   CHO 6;
6248   TYPE_THEN `top_of_metric (X,d) t` SUBGOAL_TAC;
6249   AND 6;
6250   UND 10;
6251   UND 5;
6252   REWRITE_TAC[SUBSET;IN];
6253   MESON_TAC[];
6254   ASM_SIMP_TAC[top_of_metric_nbd];
6255   DISCH_ALL_TAC;
6256   TYPE_THEN `x` (USE 11 o SPEC);
6257   IN_OUT_TAC;
6258   REWR 0;
6259   CHO 0;
6260   AND 0;
6261   ASSUME_TAC (SPECL[`&.1`;`r:real`] twopow_eps);
6262   CHO 13;
6263   USE 13 (CONV_RULE REDUCE_CONV);
6264   REWR 13;
6265   TYPEL_THEN [`X`;`d`;`x`] (fun t-> USE 13 (MATCH_MP (SPECL t open_ball_nest)));
6266   JOIN 13 0;
6267   USE 0 (MATCH_MP SUBSET_TRANS);
6268   ASSUME_TAC (SPEC `(--: (&:n))` twopow_pos);
6269   WITH 3 (MATCH_MP top_of_metric_top);
6270   AND 7;
6271   COPY 7;
6272   COPY 14;
6273   JOIN  14 7;
6274   USE 7 (MATCH_MP dense_subset);
6275   UND 16;
6276   ASM_SIMP_TAC [dense_open];
6277   DISCH_TAC ;
6278   TYPE_THEN `(open_ball(X,d) x (twopow (--: (&:(n+1)))))` (USE 14 o SPEC);
6279   ALL_TAC ; (* "cc2"; *)
6280   TYPE_THEN `open_ball (X,d) x (twopow (--: (&:(n +| 1)))) x` SUBGOAL_TAC;
6281   IMATCH_MP_TAC  open_ball_nonempty;
6282   ASM_REWRITE_TAC[];
6283   DISCH_TAC;
6284   TYPE_THEN `?z. (Z z) /\ (open_ball(X,d) x (twopow (--: (&:(n+1)))) z)` SUBGOAL_TAC;
6285   UND 14;
6286   REWRITE_TAC[open_DEF];
6287   ASM_SIMP_TAC[open_ball_open];
6288   UND 16;
6289   TYPE_THEN `B = open_ball (X,d) x (twopow (--: (&:(n +| 1))))` ABBREV_TAC ;
6290   REWRITE_TAC[INTER;IN];
6291   POP_ASSUM_LIST (fun t->ALL_TAC);
6292   REWRITE_TAC[EMPTY_NOT_EXISTS];
6293   REWRITE_TAC[IN_ELIM_THM'];
6294   MESON_TAC[];
6295   DISCH_TAC;
6296   CHO 18;
6297   AND 18;
6298   WITH 3 (MATCH_MP top_of_metric_unions);
6299   USE 20 (SYM);
6300   REWR 7;
6301   TYPE_THEN `X z` SUBGOAL_TAC;
6302   UND 7;
6303   UND 19;
6304   MESON_TAC[SUBSET;IN];
6305   DISCH_TAC;
6306   TYPE_THEN `open_ball (X,d) z (twopow (--: (&:(n +| 1)))) x` SUBGOAL_TAC;
6307   ASM_MESON_TAC[ball_symm];
6308   DISCH_TAC;
6309   ALL_TAC ; (* "cc3"; *)
6310   REWRITE_TAC[UNIONS;IN_IMAGE;IN_ELIM_THM'];
6311   REWRITE_TAC[IN];
6312   LEFT_TAC "x";
6313   LEFT_TAC "x";
6314   TYPE_THEN `(z,n+1)` EXISTS_TAC;
6315   TYPE_THEN `A z (n+1)` EXISTS_TAC;
6316   GBETA_TAC;
6317   EXPAND_TAC "S";
6318   REWRITE_TAC[IN_ELIM_THM'];
6319   LEFT_TAC "z'";
6320   TYPE_THEN `z` EXISTS_TAC;
6321   LEFT_TAC "n'";
6322   TYPE_THEN `n + 1` EXISTS_TAC;
6323   REWRITE_TAC[];
6324   LEFT_TAC "A";
6325   TYPE_THEN `t` EXISTS_TAC;
6326   ASM_REWRITE_TAC[];
6327   ALL_TAC ; (* "cc4"; *)
6328   SUBCONJ_TAC ;
6329   TYPE_THEN `open_ball (X,d) z (twopow (--: (&:(n +| 1)))) SUBSET (open_ball (X,d) x (twopow (--: (&:n))))`  SUBGOAL_TAC ;
6330   CONV_TAC (RAND_CONV (ONCE_REWRITE_CONV [(GSYM twopow_double)]));
6331   IMATCH_MP_TAC  ball_subset_ball;
6332   ASM_REWRITE_TAC[];
6333   UND 0;
6334   MESON_TAC[SUBSET_TRANS];
6335   DISCH_TAC ;
6336   TYPEL_THEN [`z`;`n+1`] (fun t -> USE 10 (SPECL t));
6337   USE 10 (REWRITE_RULE [SUBSET ]);
6338   IN_OUT_TAC ;
6339   ALL_TAC ; (* "cc5" *)
6340   TYPE_THEN `S (z,n +| 1)` SUBGOAL_TAC ;
6341   EXPAND_TAC "S";
6342   REWRITE_TAC[IN_ELIM_THM' ];
6343   TYPE_THEN `z` EXISTS_TAC ;
6344   TYPE_THEN `n + 1` EXISTS_TAC;
6345   ASM_REWRITE_TAC[];
6346   TYPE_THEN `t` EXISTS_TAC;
6347   ASM_REWRITE_TAC[];
6348   DISCH_TAC ;
6349   REWR 13;
6350   AND  13;
6351   TYPE_THEN `x` (USE 25 o SPEC );
6352   UND 25;
6353   ASM_REWRITE_TAC[];
6354   TYPE_THEN `S` ( fun t-> IMATCH_MP_TAC  ( ISPEC t COUNTABLE_IMAGE)) ;
6355   ASM_REWRITE_TAC[];
6356   TYPE_THEN `\ (z,n). A z n` EXISTS_TAC;
6357   REWRITE_TAC[SUBSET_REFL ];
6358   ]);;
6359
6360   (* }}} *)
6361
6362 let complete_compact = prove_by_refinement(
6363   `!(X:A->bool) d . (metric_space(X,d)) /\ (totally_bounded(X,d)) /\
6364   (complete (X,d)) ==> (compact (top_of_metric(X,d)) X)`,
6365   (* {{{ proof *)
6366   [
6367   DISCH_ALL_TAC;
6368   REWRITE_TAC[compact];
6369   CONJ_TAC ;
6370   UND 0;
6371   SIMP_TAC[GSYM   top_of_metric_unions ];
6372   REWRITE_TAC[SUBSET_REFL];
6373   GEN_TAC;
6374   DISCH_ALL_TAC;
6375   TYPE_THEN `(?V'. (V' SUBSET V) /\ (X SUBSET (UNIONS V')) /\ (COUNTABLE V'))` SUBGOAL_TAC ;
6376   IMATCH_MP_TAC  countable_cover;
6377   TYPE_THEN `d` EXISTS_TAC;
6378   ASM_REWRITE_TAC[];
6379   DISCH_THEN (CHOOSE_THEN MP_TAC);
6380   DISCH_ALL_TAC;
6381   ALL_TAC; (* ASM_MESON_TAC[]; *)
6382   ALL_TAC; (* DISCH_THEN (CHOOSE_THEN MP_TAC); *)
6383   ALL_TAC; (* DISCH_ALL_TAC;  *)
6384   USE 7 (REWRITE_RULE[COUNTABLE;GE_C;UNIV]);
6385   IN_OUT_TAC;
6386   CHO 0;
6387   TYPE_THEN `B = \i. (IMAGE f { u | (u <=| i )  /\ V' (f u)}) ` ABBREV_TAC ;
6388   TYPE_THEN `?i . UNIONS (B i ) = X ` ASM_CASES_TAC;
6389   CHO 9;
6390   TYPE_THEN `B i ` EXISTS_TAC;
6391   EXPAND_TAC "B";
6392   CONJ_TAC;
6393   REWRITE_TAC[IMAGE;SUBSET ;IN  ];
6394   GEN_TAC;
6395   REWRITE_TAC[IN_ELIM_THM'];
6396   NAME_CONFLICT_TAC;
6397   UND 2;
6398   REWRITE_TAC[SUBSET;IN ];
6399   MESON_TAC[];
6400   CONJ_TAC ;
6401   IMATCH_MP_TAC  FINITE_IMAGE;
6402   IMATCH_MP_TAC  FINITE_SUBSET;
6403   TYPE_THEN `{u | u <=| i }` EXISTS_TAC;
6404   REWRITE_TAC[FINITE_NUMSEG_LE;SUBSET;IN ;IN_ELIM_THM' ];
6405   MESON_TAC[];
6406   UND 9;
6407   DISCH_THEN (fun t-> REWRITE_TAC[GSYM t]);
6408   EXPAND_TAC "B";
6409   REWRITE_TAC[SUBSET_REFL ];
6410   ALL_TAC ; (* "sv1" *)
6411   LEFT 9 "i";
6412   TYPE_THEN `UNIONS V' SUBSET X` SUBGOAL_TAC;
6413   JOIN 2 3;
6414   USE 2 (MATCH_MP SUBSET_TRANS );
6415   USE 2 (MATCH_MP UNIONS_UNIONS );
6416   UND 2;
6417   ASM_MESON_TAC[top_of_metric_unions ];
6418   DISCH_TAC ;
6419   TYPE_THEN `!i. UNIONS (B i) SUBSET X` SUBGOAL_TAC;
6420   GEN_TAC;
6421   UND 10;
6422   EXPAND_TAC "B";
6423   REWRITE_TAC[SUBSET;IN_UNIONS;IN_IMAGE  ];
6424   REWRITE_TAC[IN;IN_ELIM_THM'  ];
6425   MESON_TAC[];
6426   DISCH_TAC ;
6427   COPY 11;
6428   COPY 9;
6429   JOIN 12 13;
6430   LEFT 12 "i";
6431   USE 12 (REWRITE_RULE [GSYM PSUBSET ;PSUBSET_MEMBER;IN  ]);
6432   LEFT 12 "y";
6433   LEFT 12 "y";
6434   CHO 12;
6435   ALL_TAC ; (* "sv2" *)
6436   TYPE_THEN `(?ss. subseq ss /\ converge (X,d) (y o ss))` SUBGOAL_TAC;
6437   IMATCH_MP_TAC  convergent_subseq ;
6438   ASM_REWRITE_TAC[sequence];
6439   REWRITE_TAC[SUBSET;UNIV;IN_IMAGE  ];
6440   REWRITE_TAC[IN];
6441   ASM_MESON_TAC[];
6442   DISCH_TAC;
6443   CHO 13;
6444   AND 13;
6445   COPY 13;
6446   USE 13 (REWRITE_RULE[converge;IN ]);
6447   CHO 13;
6448   AND 13;
6449   USE 1 (REWRITE_RULE[SUBSET;UNIONS;IN;IN_ELIM_THM' ]);
6450   TYPE_THEN `x` (USE 1 o SPEC);
6451   REWR 1;
6452   CHO 1;
6453   TYPE_THEN `u` (USE 0 o SPEC);
6454   REWR 0;
6455   X_CHO 0 `j:num`;
6456   TYPE_THEN `(UNIONS (B j)) x` SUBGOAL_TAC;
6457   EXPAND_TAC "B";
6458   REWRITE_TAC[UNIONS;IN_IMAGE ];
6459   REWRITE_TAC[IN;IN_ELIM_THM'  ];
6460   TYPE_THEN `u` EXISTS_TAC;
6461   ASM_REWRITE_TAC[];
6462   TYPE_THEN `j` EXISTS_TAC;
6463   ASM_MESON_TAC[ARITH_RULE `j <=| j`];
6464   DISCH_TAC;
6465   TYPE_THEN `u SUBSET (UNIONS (B j))` SUBGOAL_TAC;
6466   IMATCH_MP_TAC  sub_union;
6467   EXPAND_TAC "B";
6468   REWRITE_TAC[IMAGE;IN;IN_ELIM_THM'  ];
6469   TYPE_THEN `j` EXISTS_TAC;
6470   ASM_MESON_TAC[ARITH_RULE `j <=| j`];
6471   DISCH_TAC;
6472   JOIN 2 3;
6473   USE 2 (MATCH_MP SUBSET_TRANS);
6474   ALL_TAC ; (* "sv3" *)
6475   TYPE_THEN `top_of_metric(X,d) u` SUBGOAL_TAC;
6476   USE 2 (REWRITE_RULE[SUBSET;IN ]);
6477   ASM_MESON_TAC[];
6478   ASM_SIMP_TAC[top_of_metric_nbd];
6479   REWRITE_TAC[IN ];
6480   DISCH_ALL_TAC;
6481   TYPE_THEN `x` (USE 19 o SPEC);
6482   REWR 1;
6483   REWR 19;
6484   CHO 19;
6485   TYPE_THEN `r` (USE 13 o SPEC);
6486   CHO 13;
6487   REWR 13;
6488   REWR 0;
6489   TYPE_THEN `n +| (j)` (USE 13 o SPEC);
6490   USE 13 (REWRITE_RULE[ARITH_RULE `n<=| (n+| a)`]);
6491   AND 19;
6492   TYPE_THEN `u ((y o ss) (n +| j) )` SUBGOAL_TAC;
6493   USE 19 (REWRITE_RULE[SUBSET;open_ball;IN ;IN_ELIM_THM' ]);
6494   TYPE_THEN `((y o ss) (n +| j))` (USE 19 o SPEC);
6495   ASM_REWRITE_TAC[];
6496   UND 19;
6497   DISCH_THEN IMATCH_MP_TAC  ;
6498   ASM_REWRITE_TAC[];
6499   TYPE_THEN `(ss (n +| j))` (USE 12 o SPEC);
6500   ASM_REWRITE_TAC[o_DEF ];
6501   DISCH_TAC;
6502   TYPE_THEN `z = ((y o ss) (n +| j))` ABBREV_TAC;
6503   TYPE_THEN `UNIONS (B (ss (n+| j))) ((y o ss) (n +| j))` SUBGOAL_TAC;
6504   EXPAND_TAC "B";
6505   ASM_REWRITE_TAC[];
6506   REWRITE_TAC[UNIONS;IN_IMAGE];
6507   REWRITE_TAC[IN; IN_ELIM_THM'];
6508   TYPE_THEN `u` EXISTS_TAC;
6509   ASM_REWRITE_TAC[];
6510   TYPE_THEN `j` EXISTS_TAC;
6511   ASM_REWRITE_TAC[];
6512   IMATCH_MP_TAC  (ARITH_RULE `j <= a /\ a <= ss(a) ==> (j <=| (ss (a)))`);
6513   ASM_SIMP_TAC[SEQ_SUBLE];
6514   ARITH_TAC;
6515   REWRITE_TAC[o_DEF];
6516   TYPE_THEN `ss(n +| j)` (USE 12 o SPEC);
6517   UND 12;
6518   MESON_TAC[];
6519   ]);;
6520   (* }}} *)
6521
6522 let uniformly_continuous = euclid_def
6523   `uniformly_continuous (f:A->B) ((X:A->bool),dX) ((Y:B->bool),dY) <=>
6524   (!epsilon. ?delta. (&.0 < epsilon) ==> (&.0 <. delta) /\
6525     (!x y. (X x) /\ (X y) /\
6526          (dX x y < delta) ==> (dY (f x) (f y) < epsilon)))`;;
6527
6528 (* NB. It is not part of the hypothesis on metric_continuous
6529    that the IMAGE of f on X is contained in Y.  Hence the
6530    extra hypothesis.  *)
6531
6532 let compact_uniformly_continuous = prove_by_refinement(
6533   `!f X dX Y dY. metric_continuous f (X,dX) (Y,dY) /\ (metric_space(X,dX))
6534     /\ (metric_space(Y,dY)) /\ (compact(top_of_metric(X,dX)) X) /\
6535     (IMAGE f X SUBSET Y) ==>
6536     uniformly_continuous (f:A->B) ((X:A->bool),dX) ((Y:B->bool),dY)`,
6537   (* {{{ proof *)
6538
6539   [
6540   REWRITE_TAC[uniformly_continuous;metric_continuous;metric_continuous_pt];
6541   DISCH_ALL_TAC;
6542   GEN_TAC;
6543   LEFT 0 "epsilon";
6544   TYPE_THEN `epsilon/(&.2)` (USE 0 o SPEC);
6545   LEFT 0 "delta";
6546   CHO 0;
6547   TYPE_THEN `cov = IMAGE (\x. open_ball (X,dX) x ((delta x)/(&.2))) X` ABBREV_TAC;
6548   USE 3 (REWRITE_RULE[compact]);
6549   UND 3;
6550   ASM_SIMP_TAC[GSYM top_of_metric_unions;SUBSET_REFL ];
6551   DISCH_TAC;
6552   TYPE_THEN `cov` (USE 3 o SPEC);
6553   CONV_TAC (quant_right_CONV  "delta");
6554   DISCH_TAC;
6555   WITH 6 (ONCE_REWRITE_RULE [GSYM REAL_LT_HALF1]);
6556   REWR 0;
6557   TYPE_THEN `!x. (&.0 < (delta x)/(&.2))` SUBGOAL_TAC;
6558   ASM_MESON_TAC[REAL_LT_HALF1];
6559   DISCH_TAC;
6560   TYPE_THEN `X SUBSET UNIONS cov /\ cov SUBSET top_of_metric (X,dX)` SUBGOAL_TAC;
6561   SUBCONJ_TAC;
6562   REWRITE_TAC[SUBSET;UNIONS;IN;IN_ELIM_THM' ];
6563   DISCH_ALL_TAC;
6564   TYPE_THEN `open_ball (X,dX) x ((delta x)/(&.2))` EXISTS_TAC;
6565   CONJ_TAC;
6566   EXPAND_TAC "cov";
6567   REWRITE_TAC[IMAGE;IN ;IN_ELIM_THM'  ];
6568   ASM_MESON_TAC[];
6569   IMATCH_MP_TAC  (REWRITE_RULE[IN] open_ball_nonempty);
6570   ASM_REWRITE_TAC[];
6571   DISCH_TAC ;
6572   REWRITE_TAC[SUBSET;IN ];
6573   EXPAND_TAC "cov";
6574   REWRITE_TAC[IMAGE;IN;IN_ELIM_THM' ];
6575   NAME_CONFLICT_TAC;
6576   DISCH_ALL_TAC;
6577   CHO 10;
6578   AND 10;
6579   ASM_REWRITE_TAC[];
6580   ASM_MESON_TAC[open_ball_open];
6581   DISCH_TAC;
6582   REWR 3;
6583   CHO 3;
6584   ALL_TAC; (* "cc1"; *)
6585   AND 3;
6586   AND 3;
6587   JOIN 11 10;
6588   UND 10;
6589   EXPAND_TAC "cov";
6590   DISCH_TAC;
6591 (*** Modified by JRH for changed theorem name
6592   USE 10 (MATCH_MP FINITE_SUBSET_IMAGE);
6593  ***)
6594   USE 10 (MATCH_MP FINITE_SUBSET_IMAGE_IMP);
6595   X_CHO 10 `S:A->bool`;
6596   TYPE_THEN `ds = IMAGE delta S` ABBREV_TAC ;
6597   TYPE_THEN `(FINITE ds) /\ ( !x. (ds x) ==> (&.0 <. x) )` SUBGOAL_TAC;
6598   EXPAND_TAC "ds";
6599   CONJ_TAC;
6600   IMATCH_MP_TAC  FINITE_IMAGE ;
6601   ASM_REWRITE_TAC[];
6602   REWRITE_TAC[IMAGE;IN;IN_ELIM_THM' ];
6603   NAME_CONFLICT_TAC ;
6604   DISCH_ALL_TAC;
6605   CHO 12;
6606   ASM_REWRITE_TAC[];
6607   DISCH_TAC;
6608   USE 12 (MATCH_MP min_finite_delta);
6609   CHO 12;
6610   TYPE_THEN `delta'/(&.2)` EXISTS_TAC;
6611   ASM_REWRITE_TAC[];
6612   ALL_TAC ; (* "cc2" *)
6613   ASM_REWRITE_TAC[REAL_LT_HALF1];
6614   DISCH_ALL_TAC;
6615   AND 10;
6616   AND 10;
6617   USE 10(  MATCH_MP UNIONS_UNIONS );
6618   JOIN 3 10;
6619   USE 3 (MATCH_MP SUBSET_TRANS);
6620   USE 3 (REWRITE_RULE [SUBSET;IN;UNIONS;IN_ELIM_THM'  ]);
6621   USE 3 (REWRITE_RULE[IMAGE;IN ;IN_ELIM_THM' ]);
6622   TYPE_THEN `x` (WITH 3 o SPEC);
6623   TYPE_THEN `y` (WITH 3 o SPEC);
6624   KILL 3; (* start of yest *)
6625   H_MATCH_MP (HYP "18")(HYP "14");
6626   H_MATCH_MP (HYP "10") (HYP "13");
6627   CHO 19;
6628   CHO 3;
6629   AND 19;
6630   CHO 20;
6631   AND 20;
6632   USE 20 (REWRITE_RULE [open_ball]);
6633   REWR 19;
6634   USE 19 (REWRITE_RULE [IN_ELIM_THM']);
6635   AND 19;
6636   AND 19;
6637   TYPE_THEN `dX x' x < delta x'` SUBGOAL_TAC;
6638   UND 19;
6639   IMATCH_MP_TAC  (REAL_ARITH `((u <. v) ==> (a< u)==>(a <v))`);
6640   TYPE_THEN `x'` (USE 8 o SPEC);
6641   UND 8;
6642   REWRITE_TAC[REAL_LT_HALF2;REAL_LT_HALF1 ];
6643   DISCH_TAC;
6644   ALL_TAC ; (* cc3 *)
6645   TYPE_THEN `dX x' y < delta x'` SUBGOAL_TAC;
6646   CONV_TAC (RAND_CONV (ONCE_REWRITE_CONV [GSYM REAL_HALF_DOUBLE]));
6647   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)`);
6648   ASM_REWRITE_TAC[];
6649   CONJ_TAC;
6650   UND 15;
6651   IMATCH_MP_TAC  (REAL_ARITH `((u <=. v) ==> (a< u)==>(a <v))`);
6652   IMATCH_MP_TAC  (REAL_ARITH `(u + u) <= (v +. v) ==> (u <= v)`);
6653   REWRITE_TAC[REAL_HALF_DOUBLE];
6654   AND 12;
6655   UND 12;
6656   DISCH_THEN (MATCH_MP_TAC);
6657   EXPAND_TAC "ds";
6658   REWRITE_TAC[IMAGE;IN; IN_ELIM_THM' ];
6659   UND 21;
6660   MESON_TAC[];
6661   IMATCH_MP_TAC  metric_space_triangle;
6662   TYPE_THEN `X` EXISTS_TAC;
6663   ASM_REWRITE_TAC[];
6664   DISCH_ALL_TAC;
6665   CONV_TAC (RAND_CONV (ONCE_REWRITE_CONV [GSYM REAL_HALF_DOUBLE]));
6666   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)));
6667   TYPE_THEN `x'` (USE 0 o SPEC);
6668   AND 0;
6669   USE 0 (REWRITE_RULE[IN ]);
6670   TYPE_THEN `y` (WITH  0  o SPEC);
6671   TYPE_THEN `x` (USE 0 o  SPEC);
6672   ALL_TAC; (* cc4 *)
6673   TYPE_THEN `Y (f x) /\ Y (f y) /\ Y (f x')` SUBGOAL_TAC;
6674   UND 4;
6675   REWRITE_TAC[SUBSET;IN_IMAGE;  ];
6676   REWRITE_TAC[IN ];
6677   UND 13;
6678   UND 14;
6679   UND 22;
6680   MESON_TAC[];
6681   DISCH_ALL_TAC;
6682   CONJ_TAC;
6683   TYPE_THEN `dY (f x) (f x') = dY (f x') (f x)` SUBGOAL_TAC;
6684   UND 2;
6685   UND 28;
6686   UND 30;
6687   TYPEL_THEN [`Y`;`dY`;`f x`;`f x'`] (fun t-> MP_TAC(ISPECL t metric_space_symm));
6688   MESON_TAC[];
6689   DISCH_THEN (fun t-> REWRITE_TAC[t]);
6690   UND 0;
6691   DISCH_THEN IMATCH_MP_TAC ;
6692   ASM_REWRITE_TAC[];
6693   CONJ_TAC;
6694   UND 27;
6695   DISCH_THEN IMATCH_MP_TAC ;
6696   ASM_REWRITE_TAC[];
6697   TYPEL_THEN [`Y`;`dY`;`f x`;`f x'`;`f y`] (fun t-> MP_TAC(ISPECL t metric_space_triangle));
6698   DISCH_THEN IMATCH_MP_TAC ;
6699   ASM_REWRITE_TAC[];
6700   ]);;
6701
6702   (* }}} *)
6703
6704 (* I'm rather surprised that this lemma did not need the
6705    hypothesis that U and- V are topologies. *)
6706
6707 let image_compact = prove_by_refinement(
6708   `!U V (f:A->B) K. (continuous f U V ) /\
6709       (compact U K) /\ (IMAGE f K SUBSET (UNIONS V))
6710   ==> (compact V (IMAGE f K))`,
6711   (* {{{ proof *)
6712   [
6713   DISCH_ALL_TAC;
6714   REWRITE_TAC[compact];
6715   ASM_REWRITE_TAC[];
6716   DISCH_ALL_TAC;
6717   TYPE_THEN `cov = IMAGE (\v. preimage (UNIONS U) f v ) V'`  ABBREV_TAC ;
6718   TYPE_THEN `cov SUBSET U` SUBGOAL_TAC ;
6719   EXPAND_TAC "cov";
6720   REWRITE_TAC[SUBSET;IN_IMAGE ];
6721   NAME_CONFLICT_TAC;
6722   GEN_TAC;
6723   DISCH_ALL_TAC;
6724   CHO 6;
6725   AND 6;
6726   ASM_REWRITE_TAC[];
6727   USE 4 (REWRITE_RULE[SUBSET]);
6728   TYPE_THEN `x'` (USE 4 o SPEC);
6729   REWR 4;
6730   UND 4;
6731   UND 0;
6732   REWRITE_TAC[continuous];
6733   MESON_TAC[];
6734   TYPE_THEN `K SUBSET UNIONS cov` SUBGOAL_TAC;
6735   ALL_TAC; (* ic1 *)
6736   UND 3;
6737   REWRITE_TAC[SUBSET;IN_IMAGE ];
6738   NAME_CONFLICT_TAC;
6739   REWRITE_TAC[IN];
6740   DISCH_ALL_TAC;
6741   LEFT 3 "x'";
6742   DISCH_ALL_TAC;
6743   LEFT 3 "x'";
6744   TYPE_THEN `x'` (USE 3 o SPEC);
6745   TYPE_THEN `f x'` (USE 3 o SPEC);
6746   REWR 3;
6747   UND 3;
6748   REWRITE_TAC[UNIONS;IN;IN_ELIM_THM'  ];
6749   USE 5 (REWRITE_RULE[IMAGE]);
6750   EXPAND_TAC "cov";
6751   REWRITE_TAC[IN_ELIM_THM';IN ];
6752   DISCH_ALL_TAC;
6753   CHO 5;
6754   CONV_TAC (quant_left_CONV "x");
6755   CONV_TAC (quant_left_CONV "x");
6756   TYPE_THEN `u` EXISTS_TAC;
6757   NAME_CONFLICT_TAC;
6758   TYPE_THEN `preimage (UNIONS U) f u` EXISTS_TAC;
6759   ASM_REWRITE_TAC[preimage;IN_ELIM_THM' ;IN ];
6760   USE 1 (REWRITE_RULE[compact;SUBSET;IN  ]);
6761   AND 1;
6762   UND 7;
6763   UND 6;
6764   MESON_TAC[];
6765   DISCH_ALL_TAC;
6766   USE 1 (REWRITE_RULE[compact]);
6767   AND 1;
6768   TYPE_THEN `cov` (USE 1 o SPEC);
6769   REWR 1;
6770   CHO 1;
6771   ALL_TAC ; (* ic2 *)
6772   TYPE_THEN `(?V''. V'' SUBSET V' /\ FINITE V'' /\ (W = IMAGE (\v. preimage (UNIONS U) f v) V''))` SUBGOAL_TAC;
6773   IMATCH_MP_TAC  finite_subset ;
6774   ASM_MESON_TAC[];
6775   DISCH_ALL_TAC;
6776   CHO 9;
6777   TYPE_THEN `V''` EXISTS_TAC;
6778   ASM_REWRITE_TAC[];
6779   REWRITE_TAC[SUBSET;IN_IMAGE];
6780   REWRITE_TAC[IN;UNIONS;IN_ELIM_THM' ];
6781   NAME_CONFLICT_TAC;
6782   CONV_TAC (quant_left_CONV "x'");
6783   CONV_TAC (quant_left_CONV "x'");
6784   DISCH_ALL_TAC;
6785   ASM_REWRITE_TAC[];
6786   AND 1;
6787   AND 1;
6788   USE 1 (REWRITE_RULE[SUBSET;UNIONS;IN;IN_ELIM_THM'  ]);
6789   TYPE_THEN `x'` (USE 1 o SPEC);
6790   REWR 1;
6791   CHO 1;
6792   AND 1;
6793   USE 14 (REWRITE_RULE[IMAGE;IN ;IN_ELIM_THM' ]);
6794   TYPE_THEN `u':B->bool` (X_CHO 14);
6795   TYPE_THEN `u'` EXISTS_TAC;
6796   ASM_REWRITE_TAC[];
6797   UND 1;
6798   ASM_REWRITE_TAC[preimage;IN;IN_ELIM_THM' ];
6799   MESON_TAC [];
6800   ]);;
6801   (* }}} *)
6802
6803 let metric_bounded = euclid_def
6804   `metric_bounded (X,d) <=>
6805      ?(x:A) r. X SUBSET (open_ball(X,d) x r)`;;
6806
6807 let euclid_ball_cube = prove_by_refinement(
6808   `!n x r. ?N. (open_ball(euclid n,d_euclid) x r) SUBSET
6809       {x | euclid n x /\ (!i. abs (x i) <= &N)}`,
6810   (* {{{ proof *)
6811   [
6812   DISCH_ALL_TAC;
6813   REWRITE_TAC[SUBSET;IN;IN_ELIM_THM';open_ball; ];
6814   ASSUME_TAC  REAL_ARCH_SIMPLE;
6815   TYPE_THEN ` (d_euclid x (\i. &.0) +. r)` (USE 0 o SPEC);
6816   X_CHO 0 `N:num`;
6817   TYPE_THEN `N` EXISTS_TAC;
6818   DISCH_ALL_TAC;
6819   ASM_REWRITE_TAC[];
6820   GEN_TAC ;
6821   ASSUME_TAC proj_contraction;
6822   TYPEL_THEN [`n`;`x'`;`(\(i :num). &.0)`;`i`] (USE 4 o SPECL);
6823   USE 4 BETA_RULE ;
6824   USE 4 (CONV_RULE REDUCE_CONV );
6825   TYPE_THEN `euclid n (\i. &.0)` SUBGOAL_TAC ;
6826   REWRITE_TAC[euclid];
6827   DISCH_TAC;
6828   REWR 4;
6829   ASSUME_TAC metric_euclid;
6830   TYPE_THEN `n` (USE 6 o SPEC);
6831   TYPE_THEN `d_euclid x' (\i. &.0) <=. d_euclid x' x + d_euclid x (\i. &0)` SUBGOAL_TAC;
6832   IMATCH_MP_TAC  metric_space_triangle;
6833   TYPE_THEN `euclid n` EXISTS_TAC;
6834   ASM_REWRITE_TAC[];
6835   TYPE_THEN `d_euclid x' x = d_euclid x x'` SUBGOAL_TAC;
6836   IMATCH_MP_TAC  metric_space_symm;
6837   TYPE_THEN `euclid n` EXISTS_TAC;
6838   ASM_REWRITE_TAC[];
6839   UND 0;
6840   UND 3;
6841   UND 4;
6842   REAL_ARITH_TAC;
6843   ]);;
6844   (* }}} *)
6845
6846 let totally_bounded_euclid = prove_by_refinement(
6847   `!X n. (metric_bounded (X,d_euclid) /\
6848     (X SUBSET (euclid n))) ==>
6849    (totally_bounded (X,d_euclid))`,
6850   (* {{{ proof *)
6851   [
6852   REWRITE_TAC[metric_bounded];
6853   DISCH_ALL_TAC;
6854   IMATCH_MP_TAC  totally_bounded_subset;
6855   CHO 0;
6856   CHO 0;
6857   ASSUME_TAC euclid_ball_cube;
6858   TYPEL_THEN [`n`;`x`;`r`] (USE 2 o SPECL);
6859   CHO 2;
6860   ASSUME_TAC open_ball_subspace;
6861   TYPEL_THEN [`euclid n`;`X`;`d_euclid`;`x`;`r`] (USE 3 o ISPECL);
6862   REWR 3;
6863   JOIN 0 3;
6864   USE 0 (MATCH_MP SUBSET_TRANS);
6865   JOIN 0 2;
6866   USE 0 (MATCH_MP SUBSET_TRANS);
6867   TYPE_THEN `{x | euclid n x /\ (!i. abs (x i) <= &N)}` EXISTS_TAC;
6868   ASM_REWRITE_TAC[totally_bounded_cube ];
6869   IMATCH_MP_TAC  metric_subspace;
6870   TYPE_THEN `euclid n` EXISTS_TAC;
6871   REWRITE_TAC[metric_euclid];
6872   REWRITE_TAC[SUBSET;IN;IN_ELIM_THM' ];
6873   MESON_TAC[];
6874   ]);;
6875   (* }}} *)
6876
6877 (* topology  is not needed as an assumption here!  *)
6878 let induced_compact = prove_by_refinement(
6879   `!U (K:A->bool). (K SUBSET (UNIONS U)) ==>
6880      (compact U K <=> (compact (induced_top U K) K))`,
6881   (* {{{ proof *)
6882
6883   [
6884   DISCH_ALL_TAC;
6885   ASM_REWRITE_TAC[compact];
6886   EQ_TAC;
6887   DISCH_ALL_TAC;
6888   ASM_REWRITE_TAC[induced_top_support;SUBSET_INTER;SUBSET_REFL  ];
6889   DISCH_ALL_TAC;
6890   USE 3 (REWRITE_RULE[induced_top;SUBSET;IN_IMAGE  ]);
6891   LEFT 3 "x'";
6892   LEFT 3 "x'";
6893   X_CHO 3 `u:(A->bool)->(A->bool)`;
6894   TYPE_THEN `IMAGE u V` (USE 1 o SPEC);
6895   TYPE_THEN `K SUBSET UNIONS (IMAGE u V) /\ IMAGE u V SUBSET U` SUBGOAL_TAC;
6896   REWRITE_TAC[IMAGE;SUBSET;IN_UNIONS;IN_ELIM_THM'  ];
6897   CONJ_TAC;
6898   REWRITE_TAC[IN];
6899   DISCH_ALL_TAC;
6900   USE 2 (REWRITE_RULE[SUBSET;IN_UNIONS ]);
6901   USE 2 (REWRITE_RULE[IN ]);
6902   TYPE_THEN `x` (USE 2 o SPEC);
6903   REWR 2;
6904   X_CHO 2 `v:A->bool`;
6905   NAME_CONFLICT_TAC;
6906   CONV_TAC (quant_left_CONV "x'");
6907   CONV_TAC (quant_left_CONV "x'");
6908   TYPE_THEN `v` EXISTS_TAC;
6909   TYPE_THEN `u v` EXISTS_TAC;
6910   ASM_REWRITE_TAC[];
6911   TYPE_THEN `v` (USE 3 o SPEC);
6912   USE 3 (REWRITE_RULE[IN]);
6913   REWR 3;
6914   ASSUME_TAC INTER_SUBSET;
6915   USE 5 (CONJUNCT1);
6916   TYPEL_THEN [`u v`;`K`] (USE 5 o ISPECL);
6917   ASM_MESON_TAC[SUBSET;IN];
6918   NAME_CONFLICT_TAC;
6919   REWRITE_TAC[IN ];
6920   ASM_MESON_TAC[IN];
6921   DISCH_TAC;
6922   REWR 1;
6923   CHO 1;
6924   AND 1;
6925   AND 1;
6926   JOIN 6 5;
6927 (*** Modified by JRH for changed theorem name
6928   USE 5 (MATCH_MP FINITE_SUBSET_IMAGE);
6929  ***)
6930   USE 5 (MATCH_MP FINITE_SUBSET_IMAGE_IMP);
6931   X_CHO 5 `W':(A->bool)->bool`;
6932   TYPE_THEN `W'` EXISTS_TAC;
6933   ASM_REWRITE_TAC[];
6934   TYPE_THEN `K SUBSET UNIONS (IMAGE u W')` SUBGOAL_TAC;
6935   ASM_MESON_TAC[UNIONS_UNIONS ;SUBSET_TRANS];
6936   REWRITE_TAC[SUBSET;IN_UNIONS;IN_IMAGE; ];
6937   NAME_CONFLICT_TAC;
6938   REWRITE_TAC[IN];
6939   DISCH_ALL_TAC;
6940   DISCH_ALL_TAC;
6941   TYPE_THEN `x'` (USE 6 o SPEC);
6942   REWR 6;
6943   CHO 6;
6944   AND 6;
6945   CHO 8;
6946   AND 5;
6947   AND 5;
6948   USE 10 (REWRITE_RULE[SUBSET;IN ]);
6949   TYPE_THEN `x''` (USE 10 o SPEC);
6950   REWR 10;
6951   USE 3 (REWRITE_RULE[IN]);
6952   TYPE_THEN `x''` (USE 3 o SPEC);
6953   REWR 3;
6954   TYPE_THEN `x''` EXISTS_TAC;
6955   ASM_REWRITE_TAC[];
6956   ASM ONCE_REWRITE_TAC[];
6957   REWRITE_TAC[INTER;IN;IN_ELIM_THM' ];
6958   ASM_MESON_TAC[];
6959   ALL_TAC ; (* dd1*)
6960   DISCH_ALL_TAC;
6961   DISCH_ALL_TAC;
6962   TYPE_THEN  `VK = IMAGE (\b. (b INTER K)) V` ABBREV_TAC ;
6963   TYPE_THEN `VK` (USE 2 o SPEC);
6964   TYPE_THEN `K SUBSET UNIONS VK /\ VK SUBSET induced_top U K` SUBGOAL_TAC;
6965   CONJ_TAC;
6966   EXPAND_TAC "VK";
6967   REWRITE_TAC[INTER_THM;GSYM UNIONS_INTER ];
6968   ASM_REWRITE_TAC[SUBSET_INTER;SUBSET_REFL  ]; (* end of branch *)
6969   REWRITE_TAC[induced_top];
6970   EXPAND_TAC "VK";
6971   REWRITE_TAC[INTER_THM ];
6972   IMATCH_MP_TAC  IMAGE_SUBSET;
6973   ASM_REWRITE_TAC[];
6974   DISCH_ALL_TAC;
6975   REWR 2;
6976   X_CHO 2 `WK:(A->bool)->bool`;
6977   TYPEL_THEN [`V`;`(INTER) K`;`WK`] (fun t-> MP_TAC (ISPECL t finite_subset ));
6978   ASM_REWRITE_TAC[];
6979   AND 2;
6980   UND 8;
6981   EXPAND_TAC "VK";
6982   REWRITE_TAC[INTER_THM];
6983   DISCH_ALL_TAC;
6984   REWR 8;
6985   CHO 8;
6986   TYPE_THEN `C` EXISTS_TAC;
6987   ASM_REWRITE_TAC[];
6988   REWR 2;
6989   AND 2;
6990   USE 2 (REWRITE_RULE[GSYM UNIONS_INTER]);
6991   UND 2;
6992   TYPE_THEN `R = UNIONS C` ABBREV_TAC;
6993   SET_TAC[];
6994   ]);;
6995
6996   (* }}} *)
6997
6998 let compact_euclid = prove_by_refinement(
6999   `!X n. (X SUBSET euclid n) ==>
7000         (compact (top_of_metric(euclid n,d_euclid)) X <=>
7001         (closed_ (top_of_metric(euclid n,d_euclid)) X /\
7002         (metric_bounded(X,d_euclid))))`,
7003   (* {{{ proof *)
7004   [
7005   DISCH_ALL_TAC;
7006   TYPE_THEN `top_of_metric (X,d_euclid) = induced_top (top_of_metric(euclid n,d_euclid)) X` SUBGOAL_TAC;
7007   IMATCH_MP_TAC  (GSYM top_of_metric_induced);
7008   ASM_REWRITE_TAC[metric_euclid];
7009   DISCH_TAC;
7010   TYPE_THEN `metric_space (X,d_euclid)` SUBGOAL_TAC ;
7011   ASM_MESON_TAC [metric_euclid;metric_subspace];
7012   DISCH_TAC ;
7013   EQ_TAC;
7014   DISCH_ALL_TAC;
7015   CONJ_TAC;
7016   IMATCH_MP_TAC  compact_closed;
7017   SIMP_TAC [metric_euclid;metric_hausdorff;top_of_metric_top ];
7018   ASM_REWRITE_TAC[];
7019   REWRITE_TAC[metric_bounded];
7020   IMATCH_MP_TAC  totally_bounded_bounded;
7021   ASM_REWRITE_TAC[];
7022   IMATCH_MP_TAC  compact_totally_bounded ;
7023   ASM_REWRITE_TAC[];
7024   ASM_MESON_TAC[induced_compact;top_of_metric_unions;metric_euclid ];
7025   DISCH_ALL_TAC;
7026   TYPE_THEN `X SUBSET (UNIONS (top_of_metric (euclid n,d_euclid)))` SUBGOAL_TAC;
7027   ASM_MESON_TAC[top_of_metric_unions ; metric_euclid];
7028   ASM_SIMP_TAC [induced_compact ];
7029   ASSUME_TAC metric_euclid;
7030   DISCH_TAC;
7031   TYPE_THEN `induced_top (top_of_metric(euclid n,d_euclid)) X = top_of_metric(X,d_euclid)` SUBGOAL_TAC;
7032   IMATCH_MP_TAC  top_of_metric_induced;
7033   ASM_REWRITE_TAC[];
7034   DISCH_THEN REWRT_TAC;
7035   IMATCH_MP_TAC  complete_compact;
7036   ASM_REWRITE_TAC[];
7037   CONJ_TAC ;
7038   ASM_MESON_TAC[totally_bounded_euclid];
7039   IMATCH_MP_TAC  complete_closed;
7040   TYPE_THEN `n` EXISTS_TAC;
7041   ASM_REWRITE_TAC[];
7042   ]);;
7043   (* }}} *)
7044
7045
7046 let neg_continuous = prove_by_refinement(
7047   `!n. metric_continuous (euclid_neg) (euclid n,d_euclid) (euclid n,d_euclid)`,
7048   (* {{{ proof *)
7049   [
7050   DISCH_ALL_TAC;
7051   REWRITE_TAC[metric_continuous;metric_continuous_pt];
7052   DISCH_ALL_TAC;
7053   RIGHT_TAC "delta";
7054   DISCH_TAC;
7055   TYPE_THEN `epsilon` EXISTS_TAC;
7056   ASM_REWRITE_TAC[IN ];
7057   DISCH_ALL_TAC;
7058   REWRITE_TAC[d_euclid];
7059   REWRITE_TAC[euclid_neg_sum];
7060   REWRITE_TAC[norm_neg];
7061   REWRITE_TAC[GSYM d_euclid];
7062   ASM_REWRITE_TAC[];
7063   ]);;
7064   (* }}} *)
7065
7066 let continuous_comp = prove_by_refinement(
7067   `!(f:A->B) (g:B->C) U V W.
7068       continuous f U V /\ continuous g V W /\
7069       (IMAGE f (UNIONS U) SUBSET (UNIONS V)) ==>
7070      continuous (g o f) U W`,
7071   (* {{{ proof *)
7072
7073   [
7074   REWRITE_TAC[continuous;IN;preimage];
7075   DISCH_ALL_TAC;
7076   X_GEN_TAC `w :C->bool`;
7077   DISCH_TAC;
7078   TYPE_THEN `w ` (USE  1 o SPEC);
7079   REWR 1;
7080   TYPE_THEN `{x | UNIONS V x /\ w (g x)}` (USE 0 o SPEC);
7081   REWR 0;
7082   USE 0 (REWRITE_RULE[IN_ELIM_THM' ]);
7083   REWRITE_TAC[o_DEF ];
7084   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;
7085   AP_TERM_TAC;
7086   IMATCH_MP_TAC  EQ_EXT;
7087   DISCH_ALL_TAC;
7088   REWRITE_TAC[IN_ELIM_THM'];
7089   IMATCH_MP_TAC  (TAUT `(a ==> b) ==> ((a /\ b /\ c) <=> (a /\ c ))`);
7090   TYPE_THEN  `UU = UNIONS U ` ABBREV_TAC;
7091   TYPE_THEN `VV = UNIONS V` ABBREV_TAC ;
7092   USE 2 (REWRITE_RULE[SUBSET;IN_IMAGE ]);
7093   ASM_MESON_TAC[IN];
7094   DISCH_THEN (fun  t-> (USE 0 ( REWRITE_RULE[t])));
7095   ASM_REWRITE_TAC[];
7096   ]);;
7097
7098   (* }}} *)
7099
7100
7101 let compact_max = prove_by_refinement(
7102   `!(f:A->(num->real)) U K.
7103        (continuous f U (top_of_metric(euclid 1,d_euclid))) /\
7104        (IMAGE f K SUBSET (euclid 1)) /\
7105         (compact U K) /\ ~(K=EMPTY)==>
7106      (?x. K x /\ (!y. (K y) ==> (f y 0 <= f x 0)))`,
7107   (* {{{ proof *)
7108
7109   [
7110   DISCH_ALL_TAC;
7111   COPY 2;
7112   COPY 1;
7113   TYPE_THEN `euclid 1 = UNIONS (top_of_metric (euclid 1,d_euclid))` SUBGOAL_TAC;
7114   MESON_TAC[top_of_metric_unions;metric_euclid];
7115   DISCH_THEN (fun t-> USE 5 (ONCE_REWRITE_RULE[t]));
7116   JOIN 4 5;
7117   COPY 0;
7118   JOIN 0 4;
7119   WITH  0 (MATCH_MP image_compact);
7120   UND 4;
7121   ASM_SIMP_TAC[compact_euclid];
7122   DISCH_ALL_TAC;
7123   TYPE_THEN `P = (IMAGE (coord 0) (IMAGE f K))` ABBREV_TAC ;
7124   TYPE_THEN `(?s. !y. (?x. P x /\ y <. x) <=> y <. s)` SUBGOAL_TAC;
7125   IMATCH_MP_TAC  REAL_SUP_EXISTS;
7126   CONJ_TAC;
7127   USE 3 (REWRITE_RULE[EMPTY_EXISTS;IN ]);
7128   CHO 3;
7129   TYPE_THEN `f u 0` EXISTS_TAC;
7130   EXPAND_TAC "P";
7131   REWRITE_TAC[IMAGE;IN;IN_ELIM_THM';coord ];
7132   NAME_CONFLICT_TAC;
7133   LEFT_TAC "x'";
7134   LEFT_TAC "x'";
7135   TYPE_THEN `u` EXISTS_TAC;
7136   ASM_MESON_TAC[];
7137   USE 6 (REWRITE_RULE[metric_bounded;open_ball;SUBSET;IN_IMAGE  ]);
7138   X_CHO 6 `x0:num->real`;
7139   X_CHO 6 `r:real`;
7140   USE 6 (REWRITE_RULE[IN;IN_ELIM_THM' ]);
7141   EXPAND_TAC "P";
7142   REWRITE_TAC[IMAGE;IN;IN_ELIM_THM';coord];
7143   NAME_CONFLICT_TAC;
7144   TYPE_THEN `x0 0 +. r` EXISTS_TAC;
7145   DISCH_ALL_TAC;
7146   X_CHO 8 `fx:num->real`;
7147   AND 8;
7148   ASM_REWRITE_TAC[];
7149   KILL 8;
7150   X_CHO 9 `x:A`;
7151   LEFT 6 "x";
7152   LEFT 6 "x";
7153   TYPE_THEN `x` (USE 6 o SPEC);
7154   TYPE_THEN `fx` (USE 6 o SPEC);
7155   REWR 6;
7156   TYPE_THEN `(d_euclid x0 (f x) = abs (x0 0 - (f x 0)))` SUBGOAL_TAC;
7157   IMATCH_MP_TAC  euclid1_abs;
7158   USE 1 (REWRITE_RULE[SUBSET;IN ]);
7159   ASM_MESON_TAC[];
7160   AND 6;
7161   AND 6;
7162   DISCH_TAC;
7163   REWR 6;
7164   UND 6;
7165   REAL_ARITH_TAC;
7166   DISCH_TAC;
7167   ALL_TAC ; (* cc1 *)
7168   TYPE_THEN `(!u. (P u) ==> (u <=. sup P)) /\ (P (sup P))` SUBGOAL_TAC;
7169   REWRITE_TAC[sup];
7170   SELECT_TAC;
7171   CHO 8;
7172   ASM_REWRITE_TAC[];
7173   DISCH_TAC;
7174   TYPE_THEN `s = t` SUBGOAL_TAC;
7175   PROOF_BY_CONTR_TAC;
7176   USE 10 (MATCH_MP  (REAL_ARITH `~(s=t) ==> (s<. t) \/ (t <. s)`));
7177   TYPE_THEN `s ` (WITH 9 o SPEC);
7178   TYPE_THEN `t` (WITH 9 o SPEC);
7179   ASM_MESON_TAC[REAL_ARITH `~(x <. x)`];
7180   DISCH_TAC;
7181   REWR 8;
7182   SUBCONJ_TAC;
7183   DISCH_ALL_TAC;
7184   TYPE_THEN `t` (USE 8 o SPEC);
7185   UND 8;
7186   REWRITE_TAC[REAL_ARITH `~(x <. x)`];
7187   LEFT_TAC "x";
7188   LEFT_TAC "x";
7189   TYPE_THEN `u` EXISTS_TAC;
7190   ASM_REWRITE_TAC[];
7191   REAL_ARITH_TAC;
7192   DISCH_ALL_TAC;
7193   PROOF_BY_CONTR_TAC;
7194   TYPE_THEN `~ (IMAGE f K) (t *# (dirac_delta 0))` SUBGOAL_TAC;
7195   PROOF_BY_CONTR_TAC;
7196   REWR 13;
7197   UND 12;
7198   EXPAND_TAC "P";
7199   ONCE_REWRITE_TAC[IMAGE];
7200   ONCE_REWRITE_TAC[IMAGE];
7201   ONCE_REWRITE_TAC[IMAGE];
7202   REWRITE_TAC[IN_ELIM_THM';IN];
7203   TYPE_THEN `t *# (dirac_delta 0)` EXISTS_TAC;
7204   ASM_REWRITE_TAC[];
7205   ALL_TAC ; (* cc2 *)
7206   REWRITE_TAC[coord_dirac];
7207   DISCH_TAC;
7208   USE 4 (MATCH_MP closed_open);
7209   ASSUME_TAC (SPEC `1` metric_euclid);
7210   WITH 14 (MATCH_MP top_of_metric_unions);
7211   WITH 15 (GSYM);
7212   REWR 4;
7213   TYPE_THEN `z = t *# dirac_delta 0`  ABBREV_TAC ;
7214   TYPE_THEN `(euclid 1 DIFF (IMAGE f K)) z` SUBGOAL_TAC ;
7215   REWRITE_TAC[REWRITE_RULE[IN] IN_DIFF];
7216   ASM_REWRITE_TAC[];
7217   EXPAND_TAC "z";
7218   REWRITE_TAC[euclid;euclid_scale;dirac_delta];
7219   DISCH_ALL_TAC;
7220   ASSUME_TAC (ARITH_RULE `1 <=| m ==> (~(0=m))`);
7221   REWR 19;
7222   ASM_REWRITE_TAC[];
7223   REDUCE_TAC;
7224   REWRITE_TAC[];
7225   UND 16;
7226   DISCH_THEN (fun t-> ONCE_REWRITE_TAC [GSYM t]);
7227   UND 4;
7228   REWRITE_TAC[open_DEF];
7229     ASM_SIMP_TAC[top_of_metric_nbd];
7230   DISCH_ALL_TAC;
7231   IN_OUT_TAC ;
7232   TYPE_THEN `z` (USE  0 o SPEC);
7233   KILL 12;
7234   KILL 13;
7235   KILL 9;
7236   UND 14;
7237   UND 3;
7238   REWRITE_TAC[];
7239   DISCH_THEN (fun t-> ONCE_REWRITE_TAC[GSYM t]);
7240   DISCH_ALL_TAC;
7241   REWR 0;
7242   CHO 0;
7243   AND 0;
7244   USE 0 (REWRITE_RULE[SUBSET;IN; open_ball;IN_ELIM_THM' ]);
7245   COPY 0;
7246   TYPE_THEN `(t- (r/(&.2)))*# (dirac_delta 0)` (USE 0 o SPEC);
7247   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;
7248   EXPAND_TAC "z";
7249   SUBCONJ_TAC;
7250   REWRITE_TAC[euclid;dirac_delta;euclid_scale];
7251   GEN_TAC;
7252   SIMP_TAC [ (ARITH_RULE `1 <=| m ==> (~(0=m))`)];
7253   REWRITE_TAC[REAL_ARITH `t*(&.0) = (&.0)`];
7254   DISCH_ALL_TAC;
7255   SUBCONJ_TAC;
7256   REWRITE_TAC[euclid;dirac_delta;euclid_scale];
7257   GEN_TAC;
7258   SIMP_TAC [ (ARITH_RULE `1 <=| m ==> (~(0=m))`)];
7259   REWRITE_TAC[REAL_ARITH `t*(&.0) = (&.0)`];
7260   ALL_TAC ; (* cc3 *)
7261   UND 13 ;
7262   SIMP_TAC[euclid1_abs];
7263   DISCH_ALL_TAC;
7264   REWRITE_TAC[euclid_minus ; euclid_scale;dirac_delta ];
7265   REDUCE_TAC ;
7266   REWRITE_TAC[REAL_ARITH `t - (t - (r/(&.2))) = r/(&.2)`];
7267   WITH  9 (ONCE_REWRITE_RULE[GSYM REAL_LT_HALF1]);
7268   WITH 19 (MATCH_MP (REAL_ARITH `&.0 < x ==> (&.0 <= x)`));
7269   WITH 20 (REWRITE_RULE[GSYM REAL_ABS_REFL]);
7270   ASM_REWRITE_TAC[];
7271   REWRITE_TAC[REAL_LT_HALF2];
7272   ASM_REWRITE_TAC[];
7273   DISCH_THEN (fun t-> (USE 0 (REWRITE_RULE[t])));
7274   ALL_TAC ; (* cc4 *)
7275   TYPE_THEN `t - (r/(&.2)) ` (USE 10 o SPEC);
7276   TYPE_THEN `t - r / &2 < t` SUBGOAL_TAC;
7277   IMATCH_MP_TAC  (REAL_ARITH `&.0 < x ==> (t - x < t)`);
7278   WITH  9 (ONCE_REWRITE_RULE[GSYM REAL_LT_HALF1]);
7279   ASM_REWRITE_TAC[];
7280   DISCH_TAC ;
7281   REWR 10;
7282   X_CHO 10 `u:real`;
7283   TYPE_THEN `u` (USE 7 o SPEC);
7284   REWR 7;
7285   TYPE_THEN `(euclid 1 DIFF IMAGE f K) (u *# (dirac_delta 0))` SUBGOAL_TAC ;
7286   UND 12;
7287   DISCH_THEN (IMATCH_MP_TAC  );
7288   EXPAND_TAC "z";
7289   SUBCONJ_TAC;
7290   REWRITE_TAC[euclid;euclid_scale;dirac_delta];
7291   REWRITE_TAC[ (ARITH_RULE `1 <=| m <=> (~(0=m))`)];
7292   DISCH_ALL_TAC;
7293   ASM_REWRITE_TAC[];
7294   REAL_ARITH_TAC;
7295   DISCH_ALL_TAC;
7296   SUBCONJ_TAC;
7297   REWRITE_TAC[euclid;euclid_scale;dirac_delta];
7298   REWRITE_TAC[ (ARITH_RULE `1 <=| m <=> (~(0=m))`)];
7299   DISCH_ALL_TAC;
7300   ASM_REWRITE_TAC[];
7301   REAL_ARITH_TAC;
7302   DISCH_ALL_TAC;
7303   ASM_SIMP_TAC[euclid1_abs];
7304   EXPAND_TAC "z";
7305   REWRITE_TAC[dirac_delta;euclid_scale;euclid_minus];
7306   REDUCE_TAC;
7307   AND 10;
7308   REWRITE_TAC[GSYM ABS_BETWEEN];
7309   ASM_REWRITE_TAC[];
7310   CONJ_TAC;
7311   UND 7;
7312   UND 9;
7313   REAL_ARITH_TAC;
7314   UND 10;
7315   IMATCH_MP_TAC  (REAL_ARITH `y <. x ==> ((t - y <. u) ==> (t <. u + x))`);
7316   REWRITE_TAC[REAL_LT_HALF2];
7317   ASM_REWRITE_TAC[];
7318   REWRITE_TAC[REWRITE_RULE[IN] IN_DIFF];
7319   IMATCH_MP_TAC  (TAUT `B ==> (~(A /\ ~B))`);
7320   AND 10;
7321   UND 14;
7322   EXPAND_TAC "P";
7323   TYPE_THEN  `B = IMAGE f K` ABBREV_TAC ;
7324   ALL_TAC ; (* cc5 *)
7325   REWRITE_TAC[IMAGE;coord;IN;IN_ELIM_THM' ];
7326   DISCH_TAC;
7327   CHO 19;
7328   AND 19;
7329   ASM_REWRITE_TAC[];
7330   USE 17 (REWRITE_RULE[SUBSET;IN]);
7331   TYPE_THEN `x` (USE 17 o SPEC);
7332   REWR 17;
7333   USE 17 (REWRITE_RULE[euclid1_dirac]);
7334   ASM_MESON_TAC[];
7335   ASM_MESON_TAC[];
7336   TYPE_THEN `t = sup P` ABBREV_TAC;
7337   DISCH_ALL_TAC;
7338   UND 11;
7339   EXPAND_TAC "P";
7340   REWRITE_TAC[];
7341   ONCE_REWRITE_TAC[IMAGE];
7342   REWRITE_TAC[IN_IMAGE;IN_ELIM_THM';IN ];
7343   NAME_CONFLICT_TAC;
7344   DISCH_ALL_TAC;
7345   CHO 11;
7346   AND 11;
7347   CHO 12;
7348   REWR 11;
7349   TYPE_THEN `x'` EXISTS_TAC;
7350   ASM_REWRITE_TAC[];
7351   DISCH_ALL_TAC;
7352   UND 10;
7353   EXPAND_TAC "P";
7354   REWRITE_TAC[];
7355   ONCE_REWRITE_TAC[IMAGE];
7356   REWRITE_TAC[IN_IMAGE;IN_ELIM_THM' ];
7357   REWRITE_TAC[IN];
7358   ASM_REWRITE_TAC[];
7359   REWRITE_TAC[coord];
7360   NAME_CONFLICT_TAC;
7361   DISCH_ALL_TAC;
7362   TYPE_THEN `f y' 0` (USE 10 o SPEC);
7363   UND 10;
7364   DISCH_THEN IMATCH_MP_TAC  ;
7365   LEFT_TAC "x'";
7366   LEFT_TAC "x'";
7367   ASM_MESON_TAC[];
7368   (* finish *)
7369   ]);;
7370
7371   (* }}} *)
7372
7373 (* ------------------------------------------------------------------ *)
7374 (* homeomorphisms *)
7375 (* ------------------------------------------------------------------ *)
7376
7377 let homeomorphism = euclid_def `homeomorphism (f:A->B) U V <=>
7378   (BIJ f (UNIONS U) (UNIONS V) ) /\ (continuous f U V) /\
7379   (!A. (U A) ==> (V (IMAGE f A)))`;;
7380
7381 let INV_homeomorphism  = prove_by_refinement(
7382   `!f U V. homeomorphism (f:A-> B) U V ==>
7383     (continuous (INV f (UNIONS U) (UNIONS V)) V U)`,
7384   (* {{{ proof *)
7385
7386   [
7387   REWRITE_TAC[continuous;IN;preimage];
7388   REWRITE_TAC[homeomorphism];
7389   DISCH_ALL_TAC;
7390   X_GEN_TAC `u:A->bool`;
7391   DISCH_ALL_TAC;
7392   TYPE_THEN `{ x | UNIONS V x /\ u (INV f (UNIONS U) (UNIONS V) x)} = IMAGE f u` SUBGOAL_TAC;
7393   IMATCH_MP_TAC  EQ_EXT ;
7394   X_GEN_TAC `t:B`;
7395   REWRITE_TAC[IN_ELIM_THM';IMAGE ;IN ];
7396   EQ_TAC ;
7397   DISCH_ALL_TAC;
7398   TYPE_THEN `(INV f (UNIONS U) (UNIONS V) t)` EXISTS_TAC;
7399   ASM_REWRITE_TAC[];
7400   ASM_MESON_TAC[INVERSE_DEF;IN;BIJ ];
7401   DISCH_ALL_TAC;
7402   CHO 4;
7403   SUBCONJ_TAC;
7404   USE 0 (REWRITE_RULE[BIJ;INJ]);
7405   IN_OUT_TAC ;
7406   ASM_REWRITE_TAC[];
7407   AND 4;
7408   AND 5;
7409   TYPE_THEN `x` (USE 6 o SPEC);
7410   UND 6;
7411   DISCH_THEN (IMATCH_MP_TAC );
7412   REWRITE_TAC[UNIONS;IN;IN_ELIM_THM' ];
7413   ASM_MESON_TAC[];
7414   DISCH_TAC ;
7415   TYPE_THEN `INV f (UNIONS U) (UNIONS V) t = x` SUBGOAL_TAC;
7416   (* stop here this is an example that ASM_MESON_TAC should catch *)
7417   (* ASM_MESON_TAC[INVERSE_XY;IN ;UNIONS ]; *)
7418   TYPE_THEN `(UNIONS U x)` SUBGOAL_TAC;
7419   REWRITE_TAC[UNIONS;IN_ELIM_THM';IN   ];
7420   ASM_MESON_TAC[];
7421   ASM_MESON_TAC[INVERSE_XY;IN ];
7422   DISCH_THEN (fun t-> REWRITE_TAC[t]);
7423   ASM_REWRITE_TAC[];
7424   DISCH_THEN (fun t-> REWRITE_TAC[t]);
7425   UND 2;
7426   DISCH_THEN IMATCH_MP_TAC ;
7427   ASM_REWRITE_TAC[];
7428   ]);;
7429
7430   (* }}} *)
7431
7432 let bicont_homeomorphism = prove_by_refinement(
7433   `!f U V. (BIJ (f:A->B) (UNIONS U) (UNIONS V)) /\ (continuous f U V) /\
7434     (continuous (INV  f (UNIONS U) (UNIONS V)) V U) ==>
7435      (homeomorphism f U V)`,
7436   (* {{{ proof *)
7437
7438   [
7439   REWRITE_TAC[homeomorphism];
7440   DISCH_ALL_TAC;
7441   ASM_REWRITE_TAC[];
7442   DISCH_ALL_TAC;
7443   UND 2;
7444   REWRITE_TAC[continuous;IN;preimage ];
7445   DISCH_ALL_TAC;
7446   TYPE_THEN `A` (USE 2 o SPEC);
7447   REWR 2;
7448   TYPE_THEN `{x | UNIONS V x /\ A (INV f (UNIONS U) (UNIONS V) x)}= (IMAGE f A) ` SUBGOAL_TAC;
7449   IMATCH_MP_TAC  EQ_EXT ;
7450   X_GEN_TAC `t:B`;
7451   REWRITE_TAC[IN_ELIM_THM';IMAGE ;IN ];
7452   EQ_TAC ;
7453   DISCH_ALL_TAC;
7454   TYPE_THEN `(INV f (UNIONS U) (UNIONS V) t)` EXISTS_TAC;
7455   ASM_REWRITE_TAC[];
7456   ASM_MESON_TAC[INVERSE_DEF;IN;BIJ ];
7457   DISCH_ALL_TAC;
7458   CHO 4;
7459   SUBCONJ_TAC;
7460   USE 0 (REWRITE_RULE[BIJ;INJ]);
7461   IN_OUT_TAC ;
7462   ASM_REWRITE_TAC[];
7463   AND 4;
7464   AND 5;
7465   TYPE_THEN `x` (USE 6 o SPEC);
7466   UND 6;
7467   DISCH_THEN (IMATCH_MP_TAC );
7468   REWRITE_TAC[UNIONS;IN;IN_ELIM_THM' ];
7469   ASM_MESON_TAC[];
7470   DISCH_TAC ;
7471   TYPE_THEN `INV f (UNIONS U) (UNIONS V) t = x` SUBGOAL_TAC;
7472   TYPE_THEN `(UNIONS U x)` SUBGOAL_TAC;
7473   REWRITE_TAC[UNIONS;IN_ELIM_THM';IN   ];
7474   ASM_MESON_TAC[];
7475   ASM_MESON_TAC[INVERSE_XY;IN ];
7476   DISCH_THEN (fun t-> REWRITE_TAC[t]);
7477   ASM_REWRITE_TAC[];
7478   DISCH_THEN (fun t-> REWRITE_TAC[GSYM t]);
7479   ASM_REWRITE_TAC[];
7480   ]);;
7481
7482   (* }}} *)
7483
7484 let open_and_closed = prove_by_refinement(
7485   `!(f:A->B) U V. (topology_ U) /\ (topology_ V) /\
7486      (BIJ f (UNIONS U) (UNIONS V)) ==>
7487      ((!A. (U A ==> V (IMAGE f A))) <=>
7488     (!B. (closed_ U B) ==> (closed_ V (IMAGE f B))))`,
7489   (* {{{ proof *)
7490
7491   [
7492   DISCH_ALL_TAC;
7493   REWRITE_TAC[closed];
7494   EQ_TAC;
7495   DISCH_ALL_TAC;
7496   DISCH_ALL_TAC;
7497   SUBCONJ_TAC;
7498   UND 4;
7499   UND 2;
7500   (* should have worked:
7501     ASM_MESON_TAC[SUBSET;IN;BIJ;INJ;IMAGE;IN_ELIM_THM'  ];
7502     bug found?  *)
7503   REWRITE_TAC[BIJ;IN;INJ;SUBSET;IMAGE;IN_ELIM_THM'  ];
7504   DISCH_ALL_TAC;
7505   NAME_CONFLICT_TAC;
7506   TYPE_THEN `y:B`  X_GEN_TAC;
7507   ASM_MESON_TAC[];
7508   DISCH_ALL_TAC;
7509   REWRITE_TAC[open_DEF];
7510   USE 5 (REWRITE_RULE[open_DEF]);
7511   TYPE_THEN `UNIONS U DIFF B` (USE 3 o SPEC);
7512   REWR 3;
7513   TYPE_THEN `IMAGE f (UNIONS U DIFF B) = (UNIONS V DIFF IMAGE f B)` SUBGOAL_TAC;
7514   ASM_MESON_TAC[DIFF_SURJ];
7515   ASM_MESON_TAC[];
7516   REWRITE_TAC[open_DEF];
7517   DISCH_ALL_TAC;
7518   DISCH_ALL_TAC;
7519   TYPE_THEN `UNIONS U DIFF A` (USE 3 o SPEC);
7520   TYPE_THEN `UNIONS U DIFF A SUBSET UNIONS U /\ U (UNIONS U DIFF (UNIONS U DIFF A))` SUBGOAL_TAC;
7521   ASM_SIMP_TAC[sub_union ; DIFF_DIFF2 ];
7522   ASM_REWRITE_TAC[SUBSET_DIFF];
7523   DISCH_TAC ;
7524   REWR 3;
7525   TYPE_THEN `UNIONS V DIFF IMAGE f (UNIONS U DIFF A) = IMAGE f A` SUBGOAL_TAC;
7526   ASM_MESON_TAC[DIFF_SURJ; sub_union; DIFF_DIFF2];
7527   ASM_MESON_TAC[];
7528   ]);;
7529
7530   (* }}} *)
7531
7532 let hausdorff_homeomorphsim = prove_by_refinement(
7533   `!f U V. (BIJ (f:A->B) (UNIONS U) (UNIONS V)) /\ (continuous f U V) /\
7534     (compact U (UNIONS U)) /\ (hausdorff V) /\ (topology_ U) /\
7535     (topology_ V) ==> (homeomorphism f U V)`,
7536   (* {{{ proof *)
7537   [
7538   DISCH_ALL_TAC;
7539   ASM_REWRITE_TAC[homeomorphism];
7540   ASM_SIMP_TAC[open_and_closed];
7541   DISCH_ALL_TAC;
7542   TYPEL_THEN [`U`;`UNIONS U`;`B`] (fun t-> ASSUME_TAC (SPECL t closed_compact));
7543   REWR 7;
7544   WITH 6 (REWRITE_RULE[closed]);
7545   REWR 7;
7546   IMATCH_MP_TAC  compact_closed ;
7547   ASM_REWRITE_TAC[];
7548   IMATCH_MP_TAC image_compact;
7549   TYPE_THEN `U` EXISTS_TAC;
7550   ASM_REWRITE_TAC[];
7551   AND 8;
7552   USE 0 (REWRITE_RULE[BIJ;INJ;IN ]);
7553   AND 0;
7554   AND 10;
7555   REWRITE_TAC[SUBSET;IN_IMAGE];
7556   REWRITE_TAC[IN];
7557   USE 9 (REWRITE_RULE[SUBSET;IN]);
7558   ASM_MESON_TAC[];
7559   ]);;
7560   (* }}} *)
7561
7562
7563 (* ------------------------------------------------------------------ *)
7564 (* the metric and topology on the real numbers *)
7565 (* ------------------------------------------------------------------ *)
7566
7567 let d_real = euclid_def `d_real x y = ||. (x -. y)`;;
7568
7569 (*
7570 let real_topology = euclid_def
7571      `real_topology = top_of_metric (UNIV,d_real)`;;
7572 *)
7573
7574 let metric_real = prove_by_refinement(
7575   `metric_space (UNIV,d_real)`,
7576   (* {{{ proof *)
7577   [
7578   REWRITE_TAC[metric_space;UNIV;d_real ];
7579   REAL_ARITH_TAC;
7580   ]);;
7581   (* }}} *)
7582
7583 let continuous_euclid1 = prove_by_refinement(
7584   `!i  n. continuous (coord i)
7585     (top_of_metric (euclid n,d_euclid))
7586     (top_of_metric (UNIV,d_real))`,
7587   (* {{{ proof *)
7588
7589   [
7590   TYPE_THEN `!i  n . IMAGE (coord i) (euclid n) SUBSET (UNIV) /\ metric_space (euclid n,d_euclid) /\ metric_space (UNIV,d_real)` SUBGOAL_TAC;
7591   REP_GEN_TAC;
7592   REWRITE_TAC[UNIV ;SUBSET;IN];
7593   REWRITE_TAC[metric_euclid;metric_real;GSYM UNIV];
7594   DISCH_TAC;
7595   DISCH_ALL_TAC;
7596   TYPEL_THEN [`i`;`n`] (USE 0 o SPECL);
7597   USE 0 (IMATCH_MP metric_continuous_continuous);
7598   ASM_REWRITE_TAC[];
7599   REWRITE_TAC[metric_continuous;metric_continuous_pt];
7600   DISCH_ALL_TAC;
7601   RIGHT_TAC "delta";
7602   DISCH_ALL_TAC;
7603   REWRITE_TAC[d_real;IN;coord];
7604   TYPE_THEN `epsilon` EXISTS_TAC;
7605   ASM_REWRITE_TAC[];
7606   GEN_TAC;
7607   DISCH_ALL_TAC;
7608   UND 4;
7609   IMATCH_MP_TAC  (REAL_ARITH  `(a <=. b) ==> ((b <. e) ==> (a <. e))`);
7610   ASM_MESON_TAC[proj_contraction];
7611   ]);;
7612
7613   (* }}} *)
7614
7615
7616 let interval_closed_ball = prove_by_refinement(
7617    `!a b . ? x r. (a <=. b) ==>
7618    ({x | euclid 1 x /\ a <= x 0 /\ x 0 <= b} =
7619     (closed_ball(euclid 1,d_euclid)) x r)`,
7620   (* {{{ proof *)
7621   [
7622   DISCH_ALL_TAC;
7623   TYPE_THEN `((a +b)/(&.2)) *# (dirac_delta 0)` EXISTS_TAC;
7624   TYPE_THEN `((b -a)/(&.2))` EXISTS_TAC;
7625   DISCH_ALL_TAC;
7626   IMATCH_MP_TAC  EQ_EXT;
7627   REWRITE_TAC[closed_ball;IN_ELIM_THM'];
7628   DISCH_ALL_TAC;
7629   IMATCH_MP_TAC  (TAUT `(a ==> (b <=> d /\ c))  ==> (a /\ b <=> d /\ a /\ c)`);
7630   DISCH_ALL_TAC;
7631   TYPE_THEN `z = ((a + b) / &2 *# dirac_delta 0)` ABBREV_TAC;
7632   TYPE_THEN `euclid 1 z` SUBGOAL_TAC;
7633   EXPAND_TAC "z";
7634   MESON_TAC[euclid_dirac];
7635   DISCH_TAC;
7636   ASM_REWRITE_TAC[];
7637   ASM_SIMP_TAC[euclid1_abs];
7638   EXPAND_TAC "z";
7639   TYPE_THEN `t = x 0` ABBREV_TAC ;
7640   REWRITE_TAC[dirac_delta;euclid_scale];
7641   REDUCE_TAC ;
7642   REWRITE_TAC[GSYM INTERVAL_ABS ];
7643   IMATCH_MP_TAC  (TAUT `((a = d) /\ (b = C))    ==> ((a /\ b) <=> (C /\ d))`);
7644   ONCE_REWRITE_TAC[REAL_ARITH `((x <=. u + v) <=> (x - v <=. u)) /\ ((x - u <= v) <=> (x <=. v + u))`];
7645   CONJ_TAC;
7646   TYPE_THEN `(a + b) / &2 - (b - a) / &2 = a` SUBGOAL_TAC ;
7647   REWRITE_TAC[real_div];
7648   REWRITE_TAC[REAL_ARITH `(a+b)*C - (b-a)*C  = a*(&.2*C) `];
7649   REDUCE_TAC ;
7650   DISCH_THEN (fun t-> REWRITE_TAC[t]);
7651   TYPE_THEN `(a+ b) /(&.2) + (b - a)/(&.2) = b` SUBGOAL_TAC;
7652   REWRITE_TAC[real_div];
7653   REWRITE_TAC[REAL_ARITH `(a+b) * C + (b - a) * C = b *(&.2*C)`];
7654   REDUCE_TAC;
7655   DISCH_THEN (fun t-> REWRITE_TAC[t]);
7656    ]);;
7657   (* }}} *)
7658
7659 let interval_euclid1_closed = prove_by_refinement(
7660   `!a b. closed_ (top_of_metric (euclid 1,d_euclid))
7661  {x | euclid 1 x /\ a <= x 0 /\ x 0 <= b}`,
7662   (* {{{ proof *)
7663   [
7664   DISCH_ALL_TAC;
7665   ASM_CASES_TAC `a <=. b`;
7666   ASSUME_TAC interval_closed_ball;
7667   TYPEL_THEN [`a`;`b`] (USE 1 o SPECL);
7668   (CHO 1);
7669   CHO 1;
7670   REWR 1;
7671   ASM_REWRITE_TAC[];
7672   IMATCH_MP_TAC closed_ball_closed;
7673   REWRITE_TAC[metric_euclid];
7674   TYPE_THEN `{x | euclid 1 x /\ a <= x 0 /\ x 0 <= b}= EMPTY ` SUBGOAL_TAC ;
7675   REWRITE_TAC[EQ_EMPTY;IN_ELIM_THM' ];
7676   GEN_TAC;
7677   TYPE_THEN `t = x 0 ` ABBREV_TAC;
7678   KILL 1;
7679   IMATCH_MP_TAC  (TAUT `~(b /\ C) ==> ~( a /\ b/\ C)`);
7680   UND 0;
7681   REAL_ARITH_TAC;
7682   DISCH_THEN (fun t-> REWRITE_TAC[t]);
7683   IMATCH_MP_TAC  empty_closed;
7684   IMATCH_MP_TAC  top_of_metric_top  ;
7685   REWRITE_TAC[metric_euclid];
7686   ]);;
7687   (* }}} *)
7688
7689 let interval_euclid1_bounded = prove_by_refinement(
7690   `!a b. metric_bounded
7691     ({x | euclid 1 x /\ a <= x 0 /\ x 0 <= b},d_euclid)`,
7692   (* {{{ proof *)
7693   [
7694   DISCH_ALL_TAC;
7695   REWRITE_TAC[metric_bounded];
7696   ASSUME_TAC interval_closed_ball;
7697   TYPEL_THEN [`a`;`b`] (USE 0 o SPECL);
7698   CHO 0;
7699   CHO 0;
7700   ASM_CASES_TAC `a <=. b`;
7701   REWR 0;
7702   ASM_REWRITE_TAC[];
7703   TYPE_THEN `x` EXISTS_TAC;
7704   TYPE_THEN `r + (&.1) ` EXISTS_TAC;
7705   REWRITE_TAC[open_ball;SUBSET;IN ;IN_ELIM_THM' ];
7706   DISCH_ALL_TAC;
7707   ASM_REWRITE_TAC[];
7708   UND 2;
7709   REWRITE_TAC[closed_ball;IN_ELIM_THM' ];
7710   DISCH_ALL_TAC;
7711   ASM_REWRITE_TAC[];
7712   UND 4;
7713   ASM_SIMP_TAC[euclid1_abs ];
7714   TYPE_THEN  `t = x 0` ABBREV_TAC;
7715   TYPE_THEN `s = x' 0` ABBREV_TAC;
7716   DISCH_ALL_TAC;
7717   TYPE_THEN `&.0 <=. r` SUBGOAL_TAC;
7718   UND 6;
7719   REAL_ARITH_TAC;
7720   DISCH_ALL_TAC;
7721   REDUCE_TAC;
7722   ASM_REWRITE_TAC[];
7723   UND 6;
7724   UND 7;
7725   REAL_ARITH_TAC ;
7726   TYPE_THEN `{x | euclid 1 x /\ a <= x 0 /\ x 0 <= b} = EMPTY` SUBGOAL_TAC;
7727   REWRITE_TAC[EQ_EMPTY;IN_ELIM_THM' ];
7728   GEN_TAC;
7729   TYPE_THEN `t = x 0 ` ABBREV_TAC;
7730   KILL 2;
7731   IMATCH_MP_TAC  (TAUT `~(b /\ C) ==> ~( a /\ b/\ C)`);
7732   UND 1;
7733   REAL_ARITH_TAC;
7734   DISCH_THEN (fun t-> REWRITE_TAC[t]);
7735   REWRITE_TAC[EMPTY_SUBSET];
7736   ]);;
7737   (* }}} *)
7738
7739 let interval_euclid1_compact = prove_by_refinement(
7740   `!a b. compact (top_of_metric(euclid 1,d_euclid))
7741     {x | (euclid 1 x) /\ (a <=. (x 0)) /\ (x 0 <= b)}`,
7742   (* {{{ proof *)
7743   [
7744   DISCH_ALL_TAC;
7745   TYPE_THEN `{x | euclid 1 x /\ a <= x 0 /\ x 0 <= b} SUBSET (euclid 1)` SUBGOAL_TAC;
7746   REWRITE_TAC [SUBSET;IN;IN_ELIM_THM' ];
7747   MESON_TAC[];
7748   DISCH_TAC;
7749   ASM_SIMP_TAC[compact_euclid];
7750   CONJ_TAC;
7751   MATCH_ACCEPT_TAC interval_euclid1_closed;
7752   MATCH_ACCEPT_TAC interval_euclid1_bounded;
7753   ]);;
7754   (* }}} *)
7755
7756 let interval_image = prove_by_refinement(
7757   `!a b. {x | a <=. x /\ (x <= b)} =
7758     IMAGE (coord 0) {x | euclid 1 x /\ a <= x 0 /\ x 0 <= b}`,
7759   (* {{{ proof *)
7760
7761   [
7762   DISCH_ALL_TAC;
7763   IMATCH_MP_TAC  EQ_EXT;
7764   REWRITE_TAC[IN_ELIM_THM';IMAGE];
7765   GEN_TAC;
7766   EQ_TAC;
7767   DISCH_ALL_TAC;
7768   TYPE_THEN `x *# (dirac_delta 0)` EXISTS_TAC;
7769   REWRITE_TAC[coord_dirac;euclid_dirac;dirac_0];
7770   ASM_REWRITE_TAC[];
7771   DISCH_ALL_TAC;
7772   CHO 0;
7773   USE 0 (REWRITE_RULE[coord]);
7774   ASM_REWRITE_TAC[];
7775   ]);;
7776
7777   (* }}} *)
7778
7779 let interval_compact = prove_by_refinement(
7780   `!a b. compact (top_of_metric (UNIV,d_real))
7781         {x | a <=. x /\ (x <=. b)} `,
7782   (* {{{ proof *)
7783   [
7784   DISCH_ALL_TAC;
7785   REWRITE_TAC[interval_image];
7786   IMATCH_MP_TAC  image_compact;
7787   TYPE_THEN `(top_of_metric (euclid 1,d_euclid))` EXISTS_TAC;
7788   REWRITE_TAC[continuous_euclid1;interval_euclid1_compact];
7789   SIMP_TAC[GSYM top_of_metric_unions;metric_real];
7790   REWRITE_TAC[UNIV;SUBSET;IN];
7791   ]);;
7792   (* }}} *)
7793
7794 let half_open = prove_by_refinement(
7795   `!a. top_of_metric(UNIV,d_real ) { x | x <. a}`,
7796   (* {{{ proof *)
7797   [
7798   GEN_TAC;
7799   ASSUME_TAC open_nbd ;
7800   TYPEL_THEN [`top_of_metric (UNIV,d_real)`;` {x | x < a}`] (USE 0 o ISPECL);
7801   USE 0 (SIMP_RULE[top_of_metric_top;metric_real ]);
7802   ASM_REWRITE_TAC[];
7803   GEN_TAC;
7804   TYPE_THEN `open_ball (UNIV,d_real) x (a - x)` EXISTS_TAC;
7805   REWRITE_TAC[IN_ELIM_THM'];
7806   DISCH_ALL_TAC;
7807   CONJ_TAC;
7808   REWRITE_TAC[open_ball;d_real ;IN;IN_ELIM_THM';UNIV ;SUBSET ];
7809   GEN_TAC ;
7810   UND 1;
7811   REAL_ARITH_TAC;
7812   CONJ_TAC;
7813   IMATCH_MP_TAC  (REWRITE_RULE[IN] open_ball_nonempty);
7814   REWRITE_TAC[metric_real; UNIV ];
7815   UND 1;
7816   REAL_ARITH_TAC;
7817   IMATCH_MP_TAC  open_ball_open;
7818   REWRITE_TAC[metric_real];
7819   ]);;
7820   (* }}} *)
7821
7822 let half_open_above = prove_by_refinement(
7823   `!a. top_of_metric(UNIV,d_real ) { x | a <. x}`,
7824   (* {{{ proof *)
7825   [
7826   GEN_TAC;
7827   ASSUME_TAC open_nbd ;
7828   TYPEL_THEN [`top_of_metric (UNIV,d_real)`;` {x | a <. x}`] (USE 0 o ISPECL);
7829   USE 0 (SIMP_RULE[top_of_metric_top;metric_real ]);
7830   ASM_REWRITE_TAC[];
7831   GEN_TAC;
7832   TYPE_THEN `open_ball (UNIV,d_real) x (x -. a)` EXISTS_TAC;
7833   REWRITE_TAC[IN_ELIM_THM'];
7834   DISCH_ALL_TAC;
7835   CONJ_TAC;
7836   REWRITE_TAC[open_ball;d_real ;IN;IN_ELIM_THM';UNIV ;SUBSET ];
7837   GEN_TAC ;
7838   UND 1;
7839   REAL_ARITH_TAC;
7840   CONJ_TAC;
7841   IMATCH_MP_TAC  (REWRITE_RULE[IN] open_ball_nonempty);
7842   REWRITE_TAC[metric_real; UNIV ];
7843   UND 1;
7844   REAL_ARITH_TAC;
7845   IMATCH_MP_TAC  open_ball_open;
7846   REWRITE_TAC[metric_real];
7847   ]);;
7848   (* }}} *)
7849
7850 let joinf = euclid_def `joinf (f:real -> A)  g a =
7851   (\ x . (if (x <. a) then (f x) else (g x)))`;;
7852
7853 let joinf_cont = prove_by_refinement(
7854   `!U a  (f:real -> A) g.
7855    (continuous f (top_of_metric(UNIV,d_real)) U) /\
7856    (continuous g (top_of_metric(UNIV,d_real)) U) /\
7857    (f a = (g a)) ==>
7858    ( (continuous (joinf f g a) (top_of_metric(UNIV,d_real)) U))`,
7859   (* {{{ proof *)
7860   [
7861   REWRITE_TAC[continuous];
7862   DISCH_ALL_TAC;
7863   DISCH_ALL_TAC;
7864   REWRITE_TAC[IN ];
7865   ASSUME_TAC open_nbd;
7866   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);
7867   USE 4 (SIMP_RULE [top_of_metric_top;metric_real  ]);
7868   ASM_REWRITE_TAC[];
7869   GEN_TAC;
7870   REWRITE_TAC[subset_preimage];
7871   RIGHT_TAC "B";
7872   DISCH_TAC;
7873   SIMP_TAC[GSYM top_of_metric_unions; metric_real];
7874   REWRITE_TAC[SUBSET_UNIV];
7875   MP_TAC (REAL_ARITH `(x = a) \/ (x <. a) \/ (a <. x)`);
7876   REP_CASES_TAC;
7877   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 ;
7878   TYPE_THEN `B` EXISTS_TAC;
7879   CONJ_TAC;
7880   REWRITE_TAC[SUBSET;IN_IMAGE;IN  ];
7881   GEN_TAC;
7882   LEFT_TAC "x";
7883   GEN_TAC ;
7884   DISCH_ALL_TAC;
7885   ASM_REWRITE_TAC[];
7886   UND 9;
7887   EXPAND_TAC "B";
7888   REWRITE_TAC[INTER;IN_ELIM_THM';IN  ];
7889   REWRITE_TAC[REWRITE_RULE[IN] in_preimage;joinf ];
7890   COND_CASES_TAC;
7891   MESON_TAC[];
7892   MESON_TAC[];
7893   CONJ_TAC ;
7894   ASM_REWRITE_TAC[];
7895   UND 5;
7896   EXPAND_TAC "B";
7897   REWRITE_TAC[INTER;IN;IN_ELIM_THM'];
7898   REWRITE_TAC[REWRITE_RULE[IN] in_preimage];
7899   ASM_REWRITE_TAC[];
7900   REWRITE_TAC[joinf];
7901   REWRITE_TAC[REAL_ARITH `~(a<. a)`];
7902   ASSUME_TAC top_of_metric_top;
7903   TYPEL_THEN [`UNIV:real -> bool`;`d_real `] (USE 8 o ISPECL);
7904   USE 8 (REWRITE_RULE[metric_real ]);
7905   USE 8 (REWRITE_RULE[topology]);
7906   EXPAND_TAC "B";
7907   KILL 7;
7908   TYPE_THEN `v` (USE 0 o SPEC);
7909   TYPE_THEN `v` (USE 1 o SPEC);
7910   ASM_MESON_TAC[IN ];
7911   (* 2nd case x < a *)
7912   TYPE_THEN `B = { x | x <. a } INTER (preimage (UNIONS (top_of_metric (UNIV,d_real))) f v)` ABBREV_TAC ;
7913   TYPE_THEN `B` EXISTS_TAC;
7914   CONJ_TAC;
7915   ASM_REWRITE_TAC[SUBSET;IN_IMAGE ; IN;joinf ];
7916   GEN_TAC ;
7917   LEFT_TAC "x";
7918   GEN_TAC ;
7919   DISCH_ALL_TAC;
7920   ASM_REWRITE_TAC[];
7921   UND 9;
7922   EXPAND_TAC "B";
7923   REWRITE_TAC[INTER ;IN ;IN_ELIM_THM'];
7924   DISCH_ALL_TAC;
7925   ASM_REWRITE_TAC[];
7926   USE 10 (REWRITE_RULE[REWRITE_RULE[IN] in_preimage]);
7927   ASM_REWRITE_TAC[];
7928   CONJ_TAC;
7929   UND 5;
7930   EXPAND_TAC "B";
7931   REWRITE_TAC[INTER;IN;IN_ELIM_THM'];
7932   REWRITE_TAC[REWRITE_RULE[IN] in_preimage];
7933   ASM_REWRITE_TAC[];
7934   DISCH_ALL_TAC;
7935   ASM_REWRITE_TAC[];
7936   UND 8;
7937   REWRITE_TAC[joinf];
7938   ASM_REWRITE_TAC[];
7939   ASSUME_TAC top_of_metric_top;
7940   TYPEL_THEN [`UNIV:real -> bool`;`d_real `] (USE 8 o ISPECL);
7941   USE 8 (REWRITE_RULE[metric_real ]);
7942   USE 8 (REWRITE_RULE[topology]);
7943   TYPE_THEN `v` (USE 0 o SPEC);
7944   TYPE_THEN `v` (USE 1 o SPEC);
7945   EXPAND_TAC "B";
7946   KILL 7;
7947   KILL 5;
7948   KILL 4;
7949   KILL 1;
7950   KILL 6;
7951   TYPEL_THEN [`{x | x < a}`;`preimage (UNIONS (top_of_metric (UNIV,d_real))) f v`] (USE 8 o ISPECL);
7952   RIGHT 1 "V";
7953   RIGHT 1 "V";
7954   AND 1;
7955   AND 1;
7956   REWR 0;
7957   USE 0 (REWRITE_RULE[IN]);
7958   REWR 5;
7959   USE 5 (REWRITE_RULE[half_open]);
7960   ASM_REWRITE_TAC[];
7961   (* case 3 a < x *)
7962   TYPE_THEN `B = { x | a <. x } INTER (preimage (UNIONS (top_of_metric (UNIV,d_real))) g v)` ABBREV_TAC ;
7963   TYPE_THEN `B` EXISTS_TAC;
7964   CONJ_TAC;
7965   ASM_REWRITE_TAC[SUBSET;IN_IMAGE ; IN;joinf ];
7966   GEN_TAC ;
7967   LEFT_TAC "x";
7968   GEN_TAC ;
7969   DISCH_ALL_TAC;
7970   ASM_REWRITE_TAC[];
7971   UND 9;
7972   EXPAND_TAC "B";
7973   REWRITE_TAC[INTER ;IN ;IN_ELIM_THM'];
7974   DISCH_ALL_TAC;
7975   ASM_REWRITE_TAC[];
7976   USE 10 (REWRITE_RULE[REWRITE_RULE[IN] in_preimage]);
7977   ASM_REWRITE_TAC[];
7978   USE 9 (MATCH_MP (REAL_ARITH `a < x'' ==> (~(x'' <. a))`));
7979   ASM_REWRITE_TAC[];
7980   CONJ_TAC;
7981   UND 5;
7982   EXPAND_TAC "B";
7983   REWRITE_TAC[INTER;IN;IN_ELIM_THM'];
7984   REWRITE_TAC[REWRITE_RULE[IN] in_preimage];
7985   ASM_REWRITE_TAC[];
7986   DISCH_ALL_TAC;
7987   ASM_REWRITE_TAC[];
7988   UND 8;
7989   REWRITE_TAC[joinf];
7990   USE 6 (MATCH_MP (REAL_ARITH `a < x'' ==> (~(x'' <. a))`));
7991   ASM_REWRITE_TAC[];
7992   ASSUME_TAC top_of_metric_top;
7993   TYPEL_THEN [`UNIV:real -> bool`;`d_real `] (USE 8 o ISPECL);
7994   USE 8 (REWRITE_RULE[metric_real ]);
7995   USE 8 (REWRITE_RULE[topology]);
7996   TYPE_THEN `v` (USE 0 o SPEC);
7997   TYPE_THEN `v` (USE 1 o SPEC);
7998   EXPAND_TAC "B";
7999   KILL 7;
8000   KILL 5;
8001   KILL 4;
8002   KILL 0;
8003   KILL 6;
8004   TYPEL_THEN [`{x | a < x}`;`preimage (UNIONS (top_of_metric (UNIV,d_real))) g v`] (USE 8 o ISPECL);
8005   RIGHT 0 "V";
8006   RIGHT 0 "V";
8007   AND 0;
8008   AND 0;
8009   REWR 1;
8010   USE 1 (REWRITE_RULE[IN]);
8011   REWR 5;
8012   USE 5 (REWRITE_RULE[half_open_above]);
8013   ASM_REWRITE_TAC[];
8014   ]);;
8015   (* }}} *)
8016
8017 let neg_cont = prove_by_refinement(
8018   `continuous ( --.)
8019      (top_of_metric(UNIV,d_real)) (top_of_metric(UNIV,d_real))  `,
8020   (* {{{ proof *)
8021   [
8022   TYPE_THEN `IMAGE ( --. ) (UNIV) SUBSET (UNIV)` SUBGOAL_TAC;
8023   REWRITE_TAC[SUBSET;IN;UNION;UNIV ];
8024   DISCH_TAC;
8025   ASM_SIMP_TAC[metric_continuous_continuous;metric_real ];
8026   REWRITE_TAC[metric_continuous;metric_continuous_pt];
8027   DISCH_ALL_TAC;
8028   TYPE_THEN `epsilon` EXISTS_TAC;
8029   DISCH_ALL_TAC;
8030   ASM_REWRITE_TAC[UNIV;IN;d_real  ];
8031   REAL_ARITH_TAC;
8032   ]);;
8033   (* }}} *)
8034
8035 let add_cont = prove_by_refinement(
8036   `!u. (continuous ( (+.) u))
8037       (top_of_metric(UNIV,d_real)) (top_of_metric(UNIV,d_real))  `,
8038   (* {{{ proof *)
8039
8040   [
8041   GEN_TAC;
8042   TYPE_THEN `IMAGE ( (+.) u ) (UNIV) SUBSET (UNIV)` SUBGOAL_TAC;
8043   REWRITE_TAC[SUBSET;IN;UNION;UNIV ];
8044   DISCH_TAC;
8045   ASM_SIMP_TAC[metric_continuous_continuous;metric_real ];
8046   REWRITE_TAC[metric_continuous;metric_continuous_pt];
8047   DISCH_ALL_TAC;
8048   TYPE_THEN `epsilon` EXISTS_TAC;
8049   DISCH_ALL_TAC;
8050   ASM_REWRITE_TAC[UNIV;IN;d_real  ];
8051   REAL_ARITH_TAC;
8052   ]);;
8053
8054   (* }}} *)
8055
8056 let continuous_scale = prove_by_refinement(
8057   `!x n. (euclid n x) ==>
8058      (continuous (\t. (t *# x)) (top_of_metric(UNIV,d_real))
8059      (top_of_metric(euclid n,d_euclid)))`,
8060   (* {{{ proof *)
8061
8062   [
8063   DISCH_ALL_TAC;
8064   ASSUME_TAC metric_euclid;
8065   ASSUME_TAC metric_real ;
8066   TYPE_THEN `IMAGE (\t. (t *# x)) (UNIV) SUBSET (euclid n)` SUBGOAL_TAC;
8067   REWRITE_TAC[SUBSET;IN_IMAGE;IN_ELIM_THM'];
8068   REWRITE_TAC[Q_ELIM_THM'';IN ; UNIV ];
8069   ASM_MESON_TAC[euclid_scale_closure];
8070   ASM_SIMP_TAC[metric_continuous_continuous];
8071   DISCH_TAC;
8072   REWRITE_TAC[metric_continuous;metric_continuous_pt];
8073   DISCH_ALL_TAC;
8074   REWRITE_TAC[IN;UNIV];
8075   TYPE_THEN `euclidean x` SUBGOAL_TAC;
8076   ASM_MESON_TAC[euclidean];
8077   ASM_SIMP_TAC[norm_scale;d_real];
8078   DISCH_TAC;
8079   TYPE_THEN `norm x <=. &.1`  ASM_CASES_TAC ;
8080   TYPE_THEN `epsilon` EXISTS_TAC;
8081   DISCH_ALL_TAC;
8082   ASM_REWRITE_TAC[];
8083   DISCH_ALL_TAC;
8084   MP_TAC (SPEC `x' -. y` REAL_ABS_POS);
8085   DISCH_TAC ;
8086   USE 5 (MATCH_MP (SPEC `x' -. y` REAL_PROP_LE_LABS));
8087   USE 5 (CONV_RULE REDUCE_CONV);
8088   UND 5;
8089   UND 7;
8090   REAL_ARITH_TAC ;
8091   TYPE_THEN `epsilon / norm x` EXISTS_TAC;
8092   DISCH_ALL_TAC;
8093   CONJ_TAC;
8094   IMATCH_MP_TAC  REAL_LT_DIV;
8095   ASM_REWRITE_TAC[];
8096   UND 5;
8097   REAL_ARITH_TAC;
8098   DISCH_ALL_TAC;
8099   ASM_MESON_TAC[REAL_ARITH `~(x <= &.1) ==> (&.0 <. x)`;REAL_LT_RDIV_EQ];
8100   ]);;
8101
8102   (* }}} *)
8103
8104 let continuous_lin_combo = prove_by_refinement(
8105   `! x y n. (euclid n x) /\ (euclid n y) ==>
8106     (continuous (\t. (t *# x + (&.1 - t) *# y))
8107      (top_of_metric(UNIV,d_real))
8108      (top_of_metric(euclid n,d_euclid)))`,
8109   (* {{{ proof *)
8110
8111   let comp_elim_tac = (  IMATCH_MP_TAC  continuous_comp THEN
8112   TYPE_THEN `(top_of_metric (UNIV,d_real))` EXISTS_TAC THEN
8113   ASM_SIMP_TAC[add_cont;neg_cont;continuous_scale] THEN
8114   REWRITE_TAC[SUBSET;IN_IMAGE;Q_ELIM_THM''] THEN
8115   SIMP_TAC[GSYM top_of_metric_unions ;metric_real;IN_UNIV ] ) in
8116   [
8117   DISCH_ALL_TAC;
8118   IMATCH_MP_TAC  continuous_sum;
8119   ASM_SIMP_TAC[metric_real;metric_euclid;top_of_metric_top;continuous_scale;SUBSET ;IN_IMAGE;Q_ELIM_THM'' ];
8120   ASM_SIMP_TAC[IN;euclid_scale_closure;continuous_scale];
8121   TYPE_THEN `(\t . (&. 1 - t) *# y) = (\t. t *# y) o ((--.) o ((+.) (--. (&.1))))` SUBGOAL_TAC;
8122   IMATCH_MP_TAC  EQ_EXT;
8123   REWRITE_TAC[o_DEF;REAL_ARITH `--.(--. u +. v) = (u -. v)`];
8124   DISCH_THEN (fun t-> REWRITE_TAC [t]);
8125   REPEAT comp_elim_tac;
8126   ]);;
8127
8128   (* }}} *)
8129
8130
8131 (* ------------------------------------------------------------------ *)
8132 (* Connected Sets  *)
8133 (* ------------------------------------------------------------------ *)
8134
8135 let connected = euclid_def `connected U (Z:A->bool) <=>
8136    (Z SUBSET (UNIONS U)) /\
8137    (!A B. (U A) /\ (U B) /\ (A INTER B = EMPTY ) /\
8138     (Z SUBSET (A UNION B)) ==> ((Z SUBSET A) \/ (Z SUBSET B)))`;;
8139
8140 let connected_unions = prove_by_refinement(
8141   `!U (Z1:A->bool) Z2. (connected U Z1) /\ (connected U Z2) /\
8142     ~(Z1 INTER Z2 = EMPTY) ==> (connected U (Z1 UNION Z2))`,
8143   (* {{{ proof *)
8144   [
8145   REWRITE_TAC[connected];
8146   DISCH_ALL_TAC;
8147   DISCH_ALL_TAC;
8148   SUBCONJ_TAC;
8149   REWRITE_TAC[UNION;SUBSET;IN;IN_ELIM_THM'   ];
8150   ASM_MESON_TAC[SUBSET ;IN];
8151   DISCH_TAC ;
8152   DISCH_ALL_TAC;
8153   TYPEL_THEN [`A`;`B`] (USE 1 o SPECL);
8154   REWR 1;
8155   TYPEL_THEN [`A`;`B`] (USE 3 o SPECL);
8156   REWR 3;
8157   WITH 9 (REWRITE_RULE[union_subset]);
8158   REWR 1;
8159   REWR 3;
8160   IMATCH_MP_TAC (TAUT  `(~b ==> a)   ==> (a \/ b)`);
8161   DISCH_ALL_TAC;
8162   USE 11 (REWRITE_RULE[union_subset]);
8163   (* start a case *)
8164   USE 4 (REWRITE_RULE[EMPTY_EXISTS]);
8165   CHO 4;
8166   USE 4 (REWRITE_RULE[IN;INTER;IN_ELIM_THM'  ]);
8167   REWRITE_TAC[union_subset];
8168   TYPE_THEN `~((Z1 SUBSET A) /\ (Z2 SUBSET B))` SUBGOAL_TAC;
8169   DISCH_ALL_TAC;
8170   USE 8 (REWRITE_RULE[EQ_EMPTY]);
8171   USE 8 (REWRITE_RULE[INTER;IN;IN_ELIM_THM' ]);
8172   ASM_MESON_TAC[SUBSET;IN];
8173   TYPE_THEN `~((Z2 SUBSET A) /\ (Z1 SUBSET B))` SUBGOAL_TAC;
8174   DISCH_ALL_TAC;
8175   USE 8 (REWRITE_RULE[EQ_EMPTY]);
8176   USE 8 (REWRITE_RULE[INTER;IN;IN_ELIM_THM' ]);
8177   ASM_MESON_TAC[SUBSET;IN];
8178   ASM_MESON_TAC[];
8179   ]);;
8180   (* }}} *)
8181
8182 let component_DEF = euclid_def `component U (x:A) y <=>
8183   (?Z. (connected U Z) /\ (Z x) /\ (Z y))`;;
8184
8185 let connected_sing = prove_by_refinement(
8186   `!U (x:A). (UNIONS U x) ==> (connected U {x})`,
8187   (* {{{ proof *)
8188   [
8189   REWRITE_TAC[connected];
8190   DISCH_ALL_TAC;
8191   CONJ_TAC;
8192   REWRITE_TAC[SUBSET;IN_SING ];
8193   ASM_MESON_TAC[IN];
8194   DISCH_ALL_TAC;
8195   UND 4;
8196   SET_TAC[];
8197   ]);;
8198   (* }}} *)
8199
8200 let component_refl = prove_by_refinement(
8201   `!U x. (UNIONS U x) ==> (component U x (x:A))`,
8202   (* {{{ proof *)
8203   [
8204   REWRITE_TAC[component_DEF];
8205   ASM_MESON_TAC[IN_SING;IN;connected_sing];
8206   ]);;
8207   (* }}} *)
8208
8209 let component_symm = prove_by_refinement(
8210   `!U x y.  (component U x y) ==>
8211    (component U (y:A) x)`,
8212   (* {{{ proof *)
8213   [
8214   MESON_TAC[component_DEF];
8215   ]);;
8216   (* }}} *)
8217
8218 let component_trans = prove_by_refinement(
8219   `!U (x:A) y z. (component U x y) /\ (component U y z) ==>
8220    (component U x z)`,
8221   (* {{{ proof *)
8222   [
8223   REWRITE_TAC[component_DEF];
8224   DISCH_ALL_TAC;
8225   CHO 0;
8226   CHO 1;
8227   TYPE_THEN `connected U (Z UNION Z')` SUBGOAL_TAC;
8228   IMATCH_MP_TAC connected_unions;
8229   ASM_REWRITE_TAC[];
8230   REWRITE_TAC[EMPTY_EXISTS ];
8231   REWRITE_TAC[IN;INTER;IN_ELIM_THM' ];
8232   TYPE_THEN `y` EXISTS_TAC;
8233   ASM_REWRITE_TAC[];
8234   DISCH_ALL_TAC;
8235   TYPE_THEN `Z UNION Z'` EXISTS_TAC;
8236   ASM_REWRITE_TAC[];
8237   REWRITE_TAC[UNION;IN;IN_ELIM_THM' ];
8238   ASM_REWRITE_TAC[];
8239   ]);;
8240   (* }}} *)
8241
8242 (* based on the Bolzano lemma *)
8243
8244 let connect_real = prove_by_refinement(
8245   `!a b. connected (top_of_metric (UNIV,d_real))
8246     {x | a <=. x /\ x <=. b }`,
8247   (* {{{ proof *)
8248   [
8249   DISCH_ALL_TAC;
8250   REWRITE_TAC[connected];
8251   ASSUME_TAC metric_real;
8252   ASM_SIMP_TAC[GSYM top_of_metric_unions];
8253   SUBCONJ_TAC;
8254   REWRITE_TAC[UNIV;SUBSET;IN ];
8255   DISCH_TAC;
8256   DISCH_ALL_TAC;
8257   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 ));
8258   UND 6;
8259   GBETA_TAC ;
8260   IMATCH_MP_TAC  (TAUT `((b ==> c ) /\ a ) ==> ((a ==> b) ==> c  )`);
8261   CONJ_TAC;
8262   DISCH_ALL_TAC;
8263   TYPEL_THEN [`a`;`b`] ((USE 6 o SPECL));
8264   USE 6 (REWRITE_RULE[ARITH_RULE `~(a <. a)`]);
8265   ASM_CASES_TAC `a <=. b`;
8266   REWR 6;
8267   TYPE_THEN `{x | a <=. x /\ x <=. b} = EMPTY ` SUBGOAL_TAC;
8268   IMATCH_MP_TAC  EQ_EXT;
8269   REWRITE_TAC[IN_ELIM_THM';EMPTY];
8270   GEN_TAC;
8271   UND 7;
8272   REAL_ARITH_TAC;
8273   DISCH_THEN (fun t-> REWRITE_TAC[t]);
8274   REWRITE_TAC[EMPTY_SUBSET];
8275   CONJ_TAC;
8276   DISCH_ALL_TAC;
8277   UND 8;
8278   UND 9;
8279   (* c1 *)
8280   USE 4 (REWRITE_RULE[EQ_EMPTY;INTER;IN;IN_ELIM_THM' ]);
8281   TYPE_THEN `b'` (USE 4 o SPEC);
8282   TYPE_THEN `{x | a' <=. x /\ x <=. b' } b'` SUBGOAL_TAC;
8283   ASM_REWRITE_TAC[IN_ELIM_THM'];
8284   REAL_ARITH_TAC;
8285   DISCH_TAC;
8286   TYPE_THEN `{x | b' <=. x /\ x <=. c  } b'` SUBGOAL_TAC;
8287   ASM_REWRITE_TAC[IN_ELIM_THM'];
8288   REAL_ARITH_TAC;
8289   DISCH_TAC;
8290   TYPE_THEN `{x | a' <=. x /\ x <=. b' } UNION {x | b' <=. x /\ x <= c  } = { x | a' <=. x /\ x <=. c }` SUBGOAL_TAC;
8291   REWRITE_TAC[UNION;IN;IN_ELIM_THM'];
8292   IMATCH_MP_TAC  EQ_EXT ;
8293   GEN_TAC;
8294   REWRITE_TAC[IN_ELIM_THM'];
8295   UND 6;
8296   UND 7;
8297   REAL_ARITH_TAC;
8298   DISCH_TAC;
8299   (* cr 1*)
8300   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)`]));
8301   IMATCH_MP_TAC  (TAUT `c  ==> (a \/ b \/ c \/ d)`);
8302   UND 10;
8303   DISCH_THEN (fun t-> REWRITE_TAC [GSYM t]);
8304   ASM_REWRITE_TAC[union_subset];
8305   (* ASM_MESON_TAC[SUBSET;IN]; should have worked *)
8306   PROOF_BY_CONTR_TAC;
8307   UND 11;
8308   UND 12;
8309   UND 9;
8310   UND 8;
8311   UND 4;
8312   REWRITE_TAC[SUBSET;IN];
8313   TYPE_THEN `R ={x | a' <=. x /\ x <=. b'}` ABBREV_TAC;
8314   TYPE_THEN `S = {x | b' <=. x /\ x <=. c}` ABBREV_TAC;
8315   MESON_TAC[]; (* ok now it works *)
8316   PROOF_BY_CONTR_TAC;
8317   UND 11;
8318   UND 12;
8319   UND 9;
8320   UND 8;
8321   UND 4;
8322   REWRITE_TAC[SUBSET;IN];
8323   TYPE_THEN `R ={x | a' <=. x /\ x <=. b'}` ABBREV_TAC;
8324   TYPE_THEN `S = {x | b' <=. x /\ x <=. c}` ABBREV_TAC;
8325   MESON_TAC[]; (* ok now it works *)
8326   IMATCH_MP_TAC  (TAUT `d  ==> (a \/ b \/ c \/ d)`);
8327   UND 10;
8328   DISCH_THEN (fun t-> REWRITE_TAC [GSYM t]);
8329   ASM_REWRITE_TAC[union_subset];
8330   (* cr 2*)
8331   DISCH_ALL_TAC;
8332   ASM_CASES_TAC `x <. a`;
8333   TYPE_THEN `&.1` EXISTS_TAC;
8334   REDUCE_TAC;
8335   DISCH_ALL_TAC;
8336   DISJ1_TAC ;
8337   UND 7;
8338   UND 6;
8339   REAL_ARITH_TAC;
8340   ASM_CASES_TAC `b <. x`;
8341   TYPE_THEN `&.1` EXISTS_TAC;
8342   REDUCE_TAC;
8343   DISCH_ALL_TAC;
8344   DISJ2_TAC;
8345   DISJ1_TAC;
8346   UND 9;
8347   UND 7;
8348   REAL_ARITH_TAC;
8349   TYPE_THEN ` (A UNION B) x` SUBGOAL_TAC;
8350   USE 5 (REWRITE_RULE[SUBSET;IN]);
8351   UND 5;
8352   DISCH_THEN (IMATCH_MP_TAC );
8353    REWRITE_TAC[IN_ELIM_THM'];
8354   UND 7;
8355   UND 6;
8356   REAL_ARITH_TAC;
8357   DISCH_TAC;
8358   (* cr3 *)
8359   TYPEL_THEN [`UNIV:real -> bool`;`d_real`] (fun t-> (ASSUME_TAC (ISPECL t open_ball_nbd)));  (* --//-- *)
8360   USE 8 (REWRITE_RULE[REWRITE_RULE[IN] IN_UNION]);
8361   TYPE_THEN `A x` ASM_CASES_TAC; (*   *)
8362   TYPE_THEN `A` (USE 9 o SPEC);
8363   TYPE_THEN `x` (USE 9 o SPEC);  (* --//-- *)
8364   CHO 9;
8365   REWR 9;
8366   USE 9 (REWRITE_RULE[open_ball;d_real;UNIV ]);
8367   TYPE_THEN `e` EXISTS_TAC;
8368   ASM_REWRITE_TAC[];
8369   DISCH_ALL_TAC;
8370   IMATCH_MP_TAC  (TAUT `C ==> (a \/ b \/ C\/ d)`);
8371   AND 9;
8372   UND 9;
8373   TYPE_THEN `{x | a' <=. x /\ x <=. b'} SUBSET {y | abs (x - y) <. e}` SUBGOAL_TAC;
8374   REWRITE_TAC[SUBSET;IN;IN_ELIM_THM'];
8375   GEN_TAC;
8376   UND 11;
8377   UND 12;
8378   UND 13;
8379   REAL_ARITH_TAC;
8380   REWRITE_TAC[SUBSET;IN;IN_ELIM_THM' ];
8381   MESON_TAC[];
8382   REWR 8;
8383   TYPE_THEN `B` (USE 9 o SPEC);
8384   TYPE_THEN `x` (USE 9 o SPEC);  (* --//-- *)
8385   CHO 9;
8386   REWR 9;
8387   USE 9 (REWRITE_RULE[open_ball;d_real;UNIV ]);
8388   TYPE_THEN `e` EXISTS_TAC;
8389   ASM_REWRITE_TAC[];
8390   DISCH_ALL_TAC;
8391   IMATCH_MP_TAC  (TAUT `d ==> (a \/ b \/ C\/ d)`);
8392   AND 9;
8393   UND 9;
8394   TYPE_THEN `{x | a' <=. x /\ x <=. b'} SUBSET {y | abs (x - y) <. e}` SUBGOAL_TAC;
8395   REWRITE_TAC[SUBSET;IN;IN_ELIM_THM'];
8396   GEN_TAC;
8397   UND 11;
8398   UND 12;
8399   UND 13;
8400   REAL_ARITH_TAC;
8401   REWRITE_TAC[SUBSET;IN;IN_ELIM_THM' ];
8402   MESON_TAC[];
8403   ]);;
8404   (* }}} *)
8405
8406 let connect_image = prove_by_refinement(
8407   `!f U V Z. (continuous (f:A->B) U V) /\
8408     (IMAGE f Z SUBSET (UNIONS V)) /\ (connected U Z) ==>
8409     (connected V (IMAGE f Z))`,
8410   (* {{{ proof *)
8411
8412   [
8413   REWRITE_TAC[connected];
8414   DISCH_ALL_TAC;
8415   ASM_REWRITE_TAC[];
8416   DISCH_ALL_TAC;
8417   USE 0 (REWRITE_RULE[continuous;IN ]);
8418   TYPE_THEN `A` (WITH 0 o SPEC);
8419   TYPE_THEN `B` (USE  0 o SPEC);
8420   TYPE_THEN `(preimage (UNIONS U) f A)` (USE 3 o SPEC);
8421   TYPE_THEN `(preimage (UNIONS U) f B)` (USE 3 o SPEC);
8422   USE 6 (MATCH_MP preimage_disjoint  );
8423   TYPE_THEN `Z SUBSET preimage (UNIONS U) f A UNION preimage (UNIONS U) f B` SUBGOAL_TAC;
8424   REWRITE_TAC[preimage_union];
8425   ASM_REWRITE_TAC[];
8426   USE 3 (REWRITE_RULE[subset_preimage ]);
8427   ASM_MESON_TAC[];
8428   ]);;
8429
8430   (* }}} *)
8431
8432 let path = euclid_def `path U x y <=>
8433   (?f a b. (continuous f (top_of_metric(UNIV,d_real )) U ) /\
8434     (f a = (x:A)) /\ (f b = y))`;;
8435
8436 (**** Old proof modified by JRH to avoid use of GSPEC
8437
8438 let const_continuous = prove_by_refinement(
8439   `!U V y. (topology_ U)  ==>
8440     (continuous (\ (x:A). (y:B)) U V)`,
8441   (* {{{ proof *)
8442   [
8443   REWRITE_TAC[continuous];
8444   DISCH_ALL_TAC;
8445   REWRITE_TAC[IN];
8446   DISCH_ALL_TAC;
8447   REWRITE_TAC[preimage;IN ];
8448   TYPE_THEN `v y` ASM_CASES_TAC ;
8449   ASM_REWRITE_TAC[IN_ELIM_THM;GSPEC  ];
8450   USE 0 (MATCH_MP top_univ);
8451   TYPE_THEN`t = UNIONS U`  ABBREV_TAC;
8452   UND 0;
8453   REWRITE_TAC[ETA_AX];
8454   ASM_REWRITE_TAC[GSPEC ];
8455   USE 0 (MATCH_MP open_EMPTY);
8456   USE 0 (REWRITE_RULE[open_DEF ;EMPTY]);
8457   ASM_REWRITE_TAC[];
8458   ]);;
8459
8460   (* }}} *)
8461
8462 ****)
8463
8464 let const_continuous = prove_by_refinement(
8465   `!U V y. (topology_ U)  ==>
8466     (continuous (\ (x:A). (y:B)) U V)`,
8467   (* {{{ proof *)
8468   [
8469   REWRITE_TAC[continuous];
8470   DISCH_ALL_TAC;
8471   REWRITE_TAC[IN];
8472   DISCH_ALL_TAC;
8473   REWRITE_TAC[preimage;IN ];
8474   TYPE_THEN `v y` ASM_CASES_TAC ;
8475   ASM_REWRITE_TAC[IN_ELIM_THM];
8476   USE 0 (MATCH_MP top_univ);
8477   TYPE_THEN`t = UNIONS U`  ABBREV_TAC;
8478   UND 0;
8479   MATCH_MP_TAC(TAUT `(a <=> b) ==> a ==> b`);
8480   AP_TERM_TAC;
8481   REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN];
8482   USE 0 (MATCH_MP open_EMPTY);
8483   USE 0 (REWRITE_RULE[open_DEF ;EMPTY]);
8484   ASM_REWRITE_TAC[];
8485   SUBGOAL_THEN `{x:A | F} = \x. F` SUBST1_TAC;
8486   REWRITE_TAC[EXTENSION; IN; IN_ELIM_THM];
8487   ASM_REWRITE_TAC[]
8488   ]);;
8489   (* }}} *)
8490
8491 let path_component = euclid_def `path_component U x y <=>
8492   (?f a b. (continuous f (top_of_metric(UNIV,d_real )) U ) /\ (a <. b) /\
8493     (f a = (x:A)) /\ (f b = y) /\
8494     (IMAGE f { t | a <=. t /\ t <=. b } SUBSET (UNIONS U)))`;;
8495
8496 let path_refl = prove_by_refinement(
8497   `!U x.  (UNIONS U x) ==> (path_component U x (x:A))`,
8498   (* {{{ proof *)
8499   [
8500   DISCH_ALL_TAC;
8501   ASSUME_TAC (top_of_metric_top );
8502   TYPEL_THEN [`UNIV:real ->bool`;`d_real`] (USE 1 o ISPECL);
8503   USE 1 (REWRITE_RULE[metric_real ]);
8504   USE 1 (MATCH_MP const_continuous);
8505   REWRITE_TAC[path_component];
8506   TYPE_THEN `(\ (t:real). x)` EXISTS_TAC;
8507   ASM_REWRITE_TAC[IMAGE;IN;];
8508   TYPE_THEN `&.0` EXISTS_TAC;
8509   TYPE_THEN `&.1` EXISTS_TAC;
8510   CONJ_TAC;
8511   REAL_ARITH_TAC;
8512   REWRITE_TAC[SUBSET;IN;IN_ELIM_THM'];
8513   ASM_MESON_TAC[];
8514   ]);;
8515   (* }}} *)
8516
8517
8518 let path_symm = prove_by_refinement(
8519 `!U x y . (path_component U x (y:A)) ==> (path_component U y (x:A))`,
8520   (* {{{ proof *)
8521
8522   [
8523   REWRITE_TAC[path_component];
8524   DISCH_ALL_TAC;
8525   (CHO 0);
8526   (CHO 0);
8527   (CHO 0);
8528   TYPE_THEN `f o (--.)` EXISTS_TAC;
8529   TYPE_THEN `--. b` EXISTS_TAC;
8530   TYPE_THEN `--. a` EXISTS_TAC;
8531   CONJ_TAC;
8532   IMATCH_MP_TAC  continuous_comp;
8533   TYPE_THEN `(top_of_metric (UNIV,d_real))` EXISTS_TAC;
8534   REWRITE_TAC[neg_cont];
8535   SIMP_TAC[top_of_metric_top;  metric_real;  metric_euclidean;  metric_euclid;  metric_hausdorff;  GSYM top_of_metric_unions;  open_ball_open;];
8536   ASM_REWRITE_TAC[];
8537   REWRITE_TAC[UNIV;IN;SUBSET  ];
8538   CONJ_TAC ;
8539   AND 0;
8540   AND 0;
8541   UND 2;
8542   REAL_ARITH_TAC ;
8543   REWRITE_TAC[o_DEF ;];
8544   REDUCE_TAC ;
8545   ASM_REWRITE_TAC[];
8546   UND 0;
8547   REWRITE_TAC[IMAGE;IN;SUBSET;IN_ELIM_THM'];
8548   DISCH_ALL_TAC;
8549   DISCH_ALL_TAC;
8550   CHO 5;
8551   USE 4 (CONV_RULE NAME_CONFLICT_CONV );
8552   TYPE_THEN `x'` (USE 4 o SPEC);
8553   UND 4;
8554   DISCH_THEN IMATCH_MP_TAC ;
8555   NAME_CONFLICT_TAC;
8556   TYPE_THEN `--. x''` EXISTS_TAC;
8557   ASM_REWRITE_TAC[];
8558   UND 5;
8559   REAL_ARITH_TAC ;
8560   ]);;
8561
8562   (* }}} *)
8563
8564 let path_symm_eq = prove_by_refinement(
8565 `!U x y . (path_component U x (y:A)) <=> (path_component U y (x:A))`,
8566   (* {{{ proof *)
8567   [
8568   MESON_TAC[path_symm];
8569   ]);;
8570   (* }}} *)
8571
8572
8573 let path_trans = prove_by_refinement(
8574   `!U x y (z:A). (path_component U x y) /\ (path_component U y z) ==>
8575   (path_component U x z)`,
8576   (* {{{ proof *)
8577
8578   [
8579   REWRITE_TAC[path_component];
8580   DISCH_ALL_TAC;
8581   CHO 0;
8582   CHO 0;
8583   CHO 0;
8584   CHO 1;
8585   CHO 1;
8586   CHO 1;
8587   TYPE_THEN `joinf f (f' o ((+.) (a' -. b))) b` EXISTS_TAC;
8588   TYPE_THEN `a` EXISTS_TAC;
8589   TYPE_THEN `b' +. (b - a')` EXISTS_TAC;
8590   CONJ_TAC; (* start of continuity *)
8591   IMATCH_MP_TAC  joinf_cont;
8592   ASM_REWRITE_TAC[];
8593   CONJ_TAC;
8594   IMATCH_MP_TAC  continuous_comp;
8595   TYPE_THEN `(top_of_metric (UNIV,d_real))` EXISTS_TAC;
8596   ASM_REWRITE_TAC [top_of_metric_top;  metric_real;  metric_euclidean;  metric_euclid;  metric_hausdorff;  GSYM top_of_metric_unions;  open_ball_open;];
8597   REWRITE_TAC[add_cont];
8598   ASM_SIMP_TAC [top_of_metric_top;  metric_real;  metric_euclidean;  metric_euclid;  metric_hausdorff;  GSYM top_of_metric_unions;  open_ball_open;];
8599   REWRITE_TAC[SUBSET;UNIV;IN;IN_ELIM_THM'];
8600   REWRITE_TAC[o_DEF];
8601   REDUCE_TAC;
8602   ASM_REWRITE_TAC[]; (* end of continuity *)
8603   CONJ_TAC; (* start real ineq *)
8604   AND 1;
8605   AND 1;
8606   AND 0;
8607   AND 0;
8608   UND 5;
8609   UND 3;
8610   REAL_ARITH_TAC; (* end of real ineq *)
8611   CONJ_TAC;
8612   REWRITE_TAC[joinf;o_DEF];
8613   ASM_REWRITE_TAC[]; (* end of JOIN statement *)
8614   CONJ_TAC; (* next JOIN statement *)
8615   REWRITE_TAC[joinf;o_DEF];
8616   TYPE_THEN `~(b' +. b -. a' <. b)` SUBGOAL_TAC;
8617   TYPE_THEN `(a' <. b') /\ (a <. b)` SUBGOAL_TAC;
8618   ASM_REWRITE_TAC[];
8619   REAL_ARITH_TAC;
8620   DISCH_THEN (fun t-> REWRITE_TAC[t]);
8621   TYPE_THEN ` a' -. b +. b' +. b -. a' = b'` SUBGOAL_TAC;
8622   REAL_ARITH_TAC ;
8623     DISCH_THEN (fun t-> REWRITE_TAC[t]);
8624   ASM_REWRITE_TAC[]; (* end of next joinf *)
8625   TYPE_THEN `(a <=. b) /\ (b <=. (b' + b - a'))` SUBGOAL_TAC; (* subreal *)
8626   TYPE_THEN `(a' <. b') /\ (a <. b)` SUBGOAL_TAC;
8627   ASM_REWRITE_TAC[];
8628   REAL_ARITH_TAC;
8629   DISCH_TAC; (* end of subreal *)
8630   USE 2 (MATCH_MP union_closed_interval);
8631   UND 2;
8632   DISCH_THEN (fun t-> REWRITE_TAC[GSYM t]);
8633   REWRITE_TAC[IMAGE_UNION;union_subset];
8634   CONJ_TAC; (* start of FIRST interval *)
8635   TYPE_THEN `IMAGE (joinf f (f' o (+.) (a' -. b)) b) {t | a <=. t /\ t <. b} = IMAGE f {t | a <=. t /\ t <. b}` SUBGOAL_TAC;
8636   REWRITE_TAC[joinf;IMAGE;IN_IMAGE ];
8637   IMATCH_MP_TAC  EQ_EXT;
8638   X_GEN_TAC `t:A`;
8639   REWRITE_TAC[IN_ELIM_THM'];
8640   EQ_TAC;
8641   DISCH_ALL_TAC;
8642   CHO 2;
8643   UND 2;
8644   DISCH_ALL_TAC;
8645   REWR 4;
8646   ASM_MESON_TAC[];
8647   DISCH_ALL_TAC;
8648   CHO 2;
8649   UND 2;
8650   DISCH_ALL_TAC;
8651  TYPE_THEN `x'` EXISTS_TAC;
8652   ASM_REWRITE_TAC[];
8653   DISCH_THEN (fun t-> REWRITE_TAC[t]); (* FIRST interval still *)
8654   TYPE_THEN `IMAGE f {t | a <=. t /\ t <. b} SUBSET IMAGE f {t | a <=. t /\ t <=. b} ` SUBGOAL_TAC;
8655   REWRITE_TAC[SUBSET;IN_IMAGE ;IN_ELIM_THM'];
8656   GEN_TAC;
8657   DISCH_THEN (CHOOSE_THEN MP_TAC);
8658   MESON_TAC[REAL_ARITH `a <. b ==> a<=. b`];
8659   KILL 1;
8660   UND 0;
8661   DISCH_ALL_TAC;
8662   JOIN 0 5;
8663   USE 0 (MATCH_MP SUBSET_TRANS );
8664   ASM_REWRITE_TAC[]; (* end of FIRST interval *)
8665   (* lc 1*)
8666   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;
8667   REWRITE_TAC[joinf;IMAGE;IN_IMAGE ];
8668   IMATCH_MP_TAC  EQ_EXT;
8669   REWRITE_TAC[IN_ELIM_THM'];
8670   NAME_CONFLICT_TAC ;
8671   X_GEN_TAC `t:A`;
8672   EQ_TAC;
8673   DISCH_ALL_TAC;
8674   CHO 2;
8675   UND 2;
8676   DISCH_ALL_TAC;
8677   TYPE_THEN `~(x' <. b)` SUBGOAL_TAC;
8678   UND 2;
8679   REAL_ARITH_TAC ;
8680   DISCH_TAC ;
8681   REWR 4;
8682   USE 4 (REWRITE_RULE[o_DEF]);
8683   TYPE_THEN `a' -. b +. x'` EXISTS_TAC; (* * *)
8684   ASM_REWRITE_TAC[];
8685   TYPE_THEN `(a' <. b') /\ (a <. b) /\ (b <=. x') /\ (x' <=. b' +. b -. a')` SUBGOAL_TAC;
8686   ASM_REWRITE_TAC[];
8687   REAL_ARITH_TAC;
8688   DISCH_ALL_TAC;
8689   CHO 2;
8690   UND 2;
8691   DISCH_ALL_TAC;
8692   TYPE_THEN `x' +. b -. a'` EXISTS_TAC;
8693   ASM_REWRITE_TAC[];
8694   SUBCONJ_TAC;
8695   UND 2;
8696   UND 3;
8697   REAL_ARITH_TAC;
8698   DISCH_ALL_TAC;
8699   TYPE_THEN `~(x' +. b -. a' <. b)` SUBGOAL_TAC;
8700   UND 5;
8701   REAL_ARITH_TAC ;
8702   DISCH_THEN (fun t-> REWRITE_TAC[t]);
8703   REWRITE_TAC[o_DEF];
8704   AP_TERM_TAC;
8705   REAL_ARITH_TAC ;
8706   DISCH_THEN (fun t -> REWRITE_TAC [t]);
8707   ASM_REWRITE_TAC[];
8708   ]);;
8709
8710   (* }}} *)
8711
8712 let loc_path_conn = euclid_def `loc_path_conn U <=>
8713   !A x. (U A) /\ (A (x:A)) ==>
8714        (U (path_component (induced_top U A) x))`;;
8715
8716
8717 let path_eq_conn = prove_by_refinement(
8718   `!U (x:A). (loc_path_conn U) /\ (topology_ U) ==>
8719     (path_component U x = component U x)`,
8720   (* {{{ proof *)
8721
8722   [
8723   DISCH_ALL_TAC;
8724   MATCH_MP_TAC EQ_EXT;
8725   X_GEN_TAC `y:A`;
8726   EQ_TAC ;
8727   REWRITE_TAC[path_component];
8728   DISCH_ALL_TAC;
8729   CHO 2;
8730   CHO 2;
8731   CHO 2;
8732   UND 2 THEN DISCH_ALL_TAC;
8733   REWRITE_TAC[component_DEF];
8734   TYPE_THEN `IMAGE f {t | a <= t /\ t <= b}` EXISTS_TAC;
8735   CONJ_TAC;
8736   IMATCH_MP_TAC  connect_image ;
8737   NAME_CONFLICT_TAC;
8738   TYPE_THEN `(top_of_metric (UNIV,d_real))` EXISTS_TAC ;
8739   ASM_REWRITE_TAC[connect_real ];
8740   REWRITE_TAC[IMAGE;IN;IN_ELIM_THM' ];
8741   CONJ_TAC;
8742   TYPE_THEN `a` EXISTS_TAC;
8743   ASM_REWRITE_TAC[];
8744   UND 3;
8745   REAL_ARITH_TAC ;
8746   TYPE_THEN `b` EXISTS_TAC;
8747   ASM_REWRITE_TAC[];
8748   UND 3;
8749   REAL_ARITH_TAC;
8750   REWRITE_TAC[component_DEF];
8751   DISCH_ALL_TAC;
8752   CHO 2;
8753   UND 2 THEN DISCH_ALL_TAC;
8754   USE 2 (REWRITE_RULE[connected]);
8755   UND 2 THEN DISCH_ALL_TAC;
8756   TYPE_THEN `path_component U x` (USE 5 o SPEC);
8757   TYPE_THEN `A = path_component U x` ABBREV_TAC;
8758   TYPE_THEN `B = UNIONS (IMAGE (\z. (path_component U z)) (Z DIFF A))` ABBREV_TAC ;
8759   TYPE_THEN `B` (USE 5 o SPEC);
8760   TYPE_THEN `U A /\ U B /\ (A INTER B = {}) /\ Z SUBSET A UNION B` SUBGOAL_TAC;
8761   WITH  0 (REWRITE_RULE[loc_path_conn]);
8762   TYPE_THEN `(UNIONS U)` (USE 8 o SPEC);
8763   TYPE_THEN `x` (USE   8 o SPEC);
8764   UND 8;
8765   ASM_SIMP_TAC[induced_top_unions];
8766   ASM_SIMP_TAC[top_univ];
8767   TYPE_THEN `UNIONS U x` SUBGOAL_TAC;
8768   USE 2 (REWRITE_RULE[SUBSET;IN;]);
8769   ASM_MESON_TAC[];
8770   DISCH_ALL_TAC;
8771   REWR 8;
8772   ASM_REWRITE_TAC[];
8773   (* dd *)
8774   CONJ_TAC;
8775   EXPAND_TAC "B";
8776   WITH  1 (REWRITE_RULE[topology]);
8777   TYPEL_THEN [`EMPTY:A->bool`;`EMPTY:A->bool`;`(IMAGE (\z. path_component U z) (Z DIFF A))`] (USE 10 o ISPECL);
8778   UND 10 THEN DISCH_ALL_TAC;
8779   UND 12 THEN (DISCH_THEN IMATCH_MP_TAC );
8780   REWRITE_TAC[SUBSET;IN_IMAGE];
8781   REWRITE_TAC[IN];
8782   NAME_CONFLICT_TAC;
8783   DISCH_ALL_TAC;
8784   CHO 12;
8785   ASM_REWRITE_TAC[];
8786   USE 0 (REWRITE_RULE[loc_path_conn]);
8787   TYPE_THEN `(UNIONS U)` (USE 0 o SPEC);
8788   USE 0 (  CONV_RULE NAME_CONFLICT_CONV);
8789   TYPE_THEN `x'` (USE   0 o SPEC);
8790   UND 0;
8791   ASM_SIMP_TAC[induced_top_unions];
8792   DISCH_THEN MATCH_MP_TAC;
8793   ASM_SIMP_TAC[top_univ];
8794   AND 12;
8795   USE 2 (REWRITE_RULE[SUBSET;IN]);
8796   USE 0 (REWRITE_RULE[DIFF;IN;IN_ELIM_THM' ]);
8797   ASM_MESON_TAC[];
8798   CONJ_TAC;
8799   REWRITE_TAC[EQ_EMPTY];
8800   DISCH_ALL_TAC;
8801   USE 10 (REWRITE_RULE[INTER;IN;IN_ELIM_THM' ]);
8802   AND 10;
8803   UND 10;
8804   EXPAND_TAC "B";
8805   REWRITE_TAC[UNIONS;IN_IMAGE ;IN_ELIM_THM' ];
8806   REWRITE_TAC[IN];
8807   LEFT_TAC "u";
8808   DISCH_ALL_TAC;
8809   AND 10;
8810   CHO 12;
8811   AND 12;
8812   REWR 10;
8813   UND 11;
8814   EXPAND_TAC "A";
8815   USE 10 (ONCE_REWRITE_RULE [path_symm_eq]);
8816   DISCH_TAC;
8817   JOIN 11 10;
8818   USE 10 (MATCH_MP path_trans);
8819   REWR 10;
8820   UND 10;
8821   UND 12;
8822   REWRITE_TAC[DIFF;IN;IN_ELIM_THM'];
8823   MESON_TAC[];
8824   REWRITE_TAC[SUBSET;IN;UNION;IN_ELIM_THM'];
8825   DISCH_ALL_TAC;
8826   TYPE_THEN `A x'` ASM_CASES_TAC;
8827   ASM_REWRITE_TAC[];
8828   DISJ2_TAC ;
8829   EXPAND_TAC "B";
8830   REWRITE_TAC[UNIONS;IN_IMAGE;IN_ELIM_THM' ];
8831   REWRITE_TAC[IN];
8832   LEFT_TAC "x";
8833   LEFT_TAC "x";
8834   TYPE_THEN `x'` EXISTS_TAC;
8835   TYPE_THEN `path_component U x'` EXISTS_TAC;
8836   ASM_REWRITE_TAC[DIFF;IN;IN_ELIM_THM' ];
8837   IMATCH_MP_TAC  path_refl;
8838   USE 2 (REWRITE_RULE[SUBSET;IN]);
8839   ASM_MESON_TAC[];
8840   DISCH_TAC ;
8841   REWR 5;
8842   UND 5;
8843   DISCH_THEN DISJ_CASES_TAC ;
8844   USE 5 (REWRITE_RULE[SUBSET;IN ;]);
8845   ASM_MESON_TAC[];
8846   UND 8 THEN DISCH_ALL_TAC;
8847   USE 10 (REWRITE_RULE[EQ_EMPTY]);
8848   TYPE_THEN `x` (USE 10 o SPEC);
8849   USE 10 (REWRITE_RULE[INTER;IN;IN_ELIM_THM']);
8850   USE 5 (REWRITE_RULE[SUBSET;IN;IN_ELIM_THM']);
8851   TYPE_THEN `A x` SUBGOAL_TAC;
8852   EXPAND_TAC "A";
8853   IMATCH_MP_TAC  path_refl ;
8854   USE 2 (REWRITE_RULE[SUBSET;IN;IN_ELIM_THM']);
8855   ASM_MESON_TAC[];
8856   ASM_MESON_TAC[];
8857   ]);;
8858
8859   (* }}} *)
8860
8861
8862 let open_ball_star = prove_by_refinement(
8863   `!x r y t n. (open_ball(euclid n,d_euclid) x r y) /\
8864     (&.0 <=. t) /\ (t <=. &.1) ==>
8865    (open_ball(euclid n,d_euclid) x r ((t *# x + (&.1-t)*#y)))`,
8866   (* {{{ proof *)
8867
8868   [
8869   REWRITE_TAC[open_ball;IN_ELIM_THM' ];
8870   DISCH_ALL_TAC;
8871   ASM_SIMP_TAC[euclid_scale_closure;euclid_add_closure];
8872   GEN_REWRITE_TAC (LAND_CONV o LAND_CONV) [GSYM trivial_lin_combo];
8873   ASSUME_TAC (SPEC `n:num` metric_translate_LEFT);
8874   TYPEL_THEN [`(&.1 - t) *# x`;`(&.1 - t)*# y`;`t *# x`] (USE 5 o ISPECL);
8875   UND 5;
8876   ASM_SIMP_TAC [euclid_scale_closure];
8877   ASM_MESON_TAC[norm_scale_vec;REAL_ARITH  `(&.0 <=. t) /\ (t <=. (&.1)) ==> (||. (&.1 - t) <=. &.1)`;REAL_ARITH `(b <= a) ==> ((a < C) ==> (b < C))`;GSYM REAL_MUL_LID;REAL_LE_RMUL;d_euclid_pos];
8878   ]);;
8879
8880   (* }}} *)
8881
8882 let open_ball_path = prove_by_refinement(
8883   `!x r y n. (open_ball(euclid n,d_euclid) x r y) ==>
8884     (path_component
8885       (top_of_metric(open_ball(euclid n,d_euclid) x r,d_euclid)) y x)`,
8886   (* {{{ proof *)
8887
8888   [
8889   REWRITE_TAC[path_component ;];
8890   DISCH_ALL_TAC;
8891   TYPE_THEN `(\t. (t *# x + (&.1 - t) *# y))` EXISTS_TAC;
8892   EXISTS_TAC `&.0`;
8893   EXISTS_TAC `&.1`;
8894   REDUCE_TAC;
8895   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;
8896   ASM_MESON_TAC[open_ball_subset;metric_euclid;top_of_metric_induced ];
8897   DISCH_TAC ;
8898   TYPE_THEN `euclid n x /\ euclid n y` SUBGOAL_TAC;
8899   USE 0 (REWRITE_RULE[open_ball;IN_ELIM_THM' ]);
8900   ASM_REWRITE_TAC[];
8901   DISCH_ALL_TAC;
8902   CONJ_TAC;
8903   ASM_REWRITE_TAC[];
8904   IMATCH_MP_TAC continuous_induced;
8905   ASM_SIMP_TAC [top_of_metric_top;metric_euclid;open_ball_open];
8906   IMATCH_MP_TAC  continuous_lin_combo ;
8907   ASM_REWRITE_TAC[];
8908   CONJ_TAC;
8909   REWRITE_TAC[euclid_plus;euclid_scale];
8910   IMATCH_MP_TAC  EQ_EXT THEN BETA_TAC ;
8911   REDUCE_TAC;
8912   CONJ_TAC;
8913   REWRITE_TAC[euclid_plus;euclid_scale];
8914   IMATCH_MP_TAC  EQ_EXT THEN BETA_TAC ;
8915   REDUCE_TAC;
8916   REWRITE_TAC[SUBSET;IN_IMAGE;Q_ELIM_THM'' ];
8917   REWRITE_TAC[IN;IN_ELIM_THM'];
8918   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;
8919   IMATCH_MP_TAC  (GSYM top_of_metric_unions);
8920   IMATCH_MP_TAC  metric_subspace;
8921   ASM_MESON_TAC[metric_euclid;open_ball_subset];
8922   DISCH_THEN (fun t->REWRITE_TAC[t]);
8923   ASM_MESON_TAC [open_ball_star];
8924   ]);;
8925
8926   (* }}} *)
8927
8928 let path_domain = prove_by_refinement(
8929   `!U x (y:A). path_component U x y <=>
8930   (?f a b. (continuous f (top_of_metric(UNIV,d_real )) U ) /\ (a <. b) /\
8931     (f a = (x:A)) /\ (f b = y) /\
8932     (IMAGE f UNIV SUBSET (UNIONS U)))`,
8933   (* {{{ proof *)
8934
8935   [
8936   REWRITE_TAC[path_component];
8937   DISCH_ALL_TAC;
8938   EQ_TAC;
8939   DISCH_TAC ;
8940   CHO 0;
8941   CHO 0;
8942   CHO 0;
8943   TYPE_THEN `joinf (\t. (f a)) (joinf f (\t. (f b)) b) a` EXISTS_TAC;
8944   TYPE_THEN `a` EXISTS_TAC;
8945   TYPE_THEN `b` EXISTS_TAC;
8946   ASM_REWRITE_TAC[];
8947   CONJ_TAC;
8948   IMATCH_MP_TAC  joinf_cont;
8949   ASM_SIMP_TAC[const_continuous;top_of_metric_top;metric_real];
8950   CONJ_TAC;
8951   IMATCH_MP_TAC  joinf_cont;
8952   ASM_REWRITE_TAC[];
8953   ASM_SIMP_TAC[const_continuous;top_of_metric_top;metric_real];
8954   REWRITE_TAC[joinf];
8955   ASM_REWRITE_TAC[];
8956   CONJ_TAC;
8957   ASM_REWRITE_TAC[joinf;REAL_ARITH `~(a<a)`];
8958   CONJ_TAC;
8959   UND 0;
8960   DISCH_ALL_TAC;
8961   USE 1 (MATCH_MP (REAL_ARITH `(a < b) ==> (~(b < a))`));
8962   ASM_REWRITE_TAC  [joinf;REAL_ARITH `~(b < b)`];
8963   REWRITE_TAC[SUBSET;IN_IMAGE;Q_ELIM_THM'';joinf   ];
8964   REWRITE_TAC[IN_UNIV];
8965   GEN_TAC;
8966   UND 0;
8967   DISCH_ALL_TAC;
8968   USE 4 (REWRITE_RULE[SUBSET;IN_IMAGE;Q_ELIM_THM'';]);
8969   USE 4 (REWRITE_RULE[IN;IN_ELIM_THM' ]);
8970   (* cc1 *)
8971   TYPE_THEN `a` (WITH 4 o SPEC);
8972   TYPE_THEN `b` (WITH  4 o SPEC);
8973   TYPE_THEN `x'` (USE 4 o SPEC);
8974   DISJ_CASES_TAC (REAL_ARITH `x' < a \/ (a <= x')`);
8975   ASM_REWRITE_TAC[IN];
8976   ASM_MESON_TAC[REAL_ARITH `(a <=a) /\ ((a < b) ==> (a <= b))`];
8977   DISJ_CASES_TAC (REAL_ARITH `x' < b \/ (b <= x')`);
8978   REWR 4;
8979   USE 7 (MATCH_MP (REAL_ARITH `a <= x' ==> (~(x' < a))`));
8980   ASM_REWRITE_TAC[IN ];
8981   ASM_MESON_TAC[REAL_ARITH `x' < b ==> x' <= b`];
8982   USE 7 (MATCH_MP (REAL_ARITH `a <= x' ==> (~(x' < a))`));
8983   ASM_REWRITE_TAC[];
8984   USE 8 (MATCH_MP (REAL_ARITH `b <= x' ==> ~(x' < b)`));
8985   ASM_REWRITE_TAC[IN];
8986   ASM_MESON_TAC[REAL_ARITH `b <=b /\ ((a < b) ==> (a <= b))`];
8987   DISCH_TAC ;
8988   CHO 0;
8989   CHO 0;
8990   CHO 0;
8991   TYPE_THEN `f` EXISTS_TAC;
8992   TYPE_THEN `a ` EXISTS_TAC;
8993   TYPE_THEN `b` EXISTS_TAC;
8994   ASM_REWRITE_TAC[];
8995   UND 0;
8996   REWRITE_TAC[SUBSET;IN_IMAGE ;Q_ELIM_THM''];
8997   REWRITE_TAC[IN_UNIV];
8998   REWRITE_TAC[IN;IN_ELIM_THM'];
8999   ASM_MESON_TAC[];
9000   ]);;
9001
9002   (* }}} *)
9003
9004 let path_component_subspace = prove_by_refinement(
9005   `!X Y d (y:A). ((Y SUBSET X) /\ (metric_space(X,d) /\ (Y y))) ==>
9006     ((path_component(top_of_metric(Y,d)) y) SUBSET
9007       (path_component(top_of_metric(X,d)) y))`,
9008   (* {{{ proof *)
9009   [
9010   DISCH_ALL_TAC;
9011   REWRITE_TAC[SUBSET;IN;path_domain];
9012   DISCH_ALL_TAC;
9013   CHO 3;
9014   CHO 3;
9015   CHO 3;
9016   TYPE_THEN `f` EXISTS_TAC;
9017   TYPE_THEN `a` EXISTS_TAC;
9018   TYPE_THEN `b` EXISTS_TAC;
9019   ASM_REWRITE_TAC[];
9020   TYPE_THEN `metric_space(Y,d)` SUBGOAL_TAC;
9021   ASM_MESON_TAC[metric_subspace];
9022   DISCH_TAC;
9023   UND 3;
9024   ASM_SIMP_TAC[GSYM top_of_metric_unions];
9025   DISCH_ALL_TAC;
9026   CONJ_TAC;
9027   UND 3;
9028   TYPE_THEN `IMAGE f UNIV SUBSET X /\ IMAGE f UNIV SUBSET Y` SUBGOAL_TAC;
9029   ASM_MESON_TAC[SUBSET;IN];
9030   DISCH_TAC;
9031   ASM_SIMP_TAC[metric_continuous_continuous;metric_real];
9032   REWRITE_TAC[metric_continuous;metric_continuous_pt];
9033   ASM_MESON_TAC[SUBSET;IN];
9034   ]);;
9035   (* }}} *)
9036
9037 let path_component_in  = prove_by_refinement(
9038   `!x (y:A) U. (path_component U x y) ==> (UNIONS U y)`,
9039   (* {{{ proof *)
9040   [
9041   REWRITE_TAC[path_component];
9042   DISCH_ALL_TAC;
9043   CHO 0;
9044   CHO 0;
9045   CHO 0;
9046   UND 0;
9047   DISCH_ALL_TAC;
9048   USE 4 (REWRITE_RULE[SUBSET;IN_IMAGE;Q_ELIM_THM'']);
9049   USE 4 (REWRITE_RULE[IN_ELIM_THM';IN]);
9050   TYPE_THEN `b` (USE 4 o SPEC);
9051   ASM_MESON_TAC[REAL_ARITH `(a < b) ==> ((a<=. b) /\ (b <= b))`];
9052   ]);;
9053   (* }}} *)
9054
9055 let loc_path_conn_euclid = prove_by_refinement(
9056   `!n A. (top_of_metric(euclid n,d_euclid)) A ==>
9057    (loc_path_conn (top_of_metric(A,d_euclid)))`,
9058   (* {{{ proof *)
9059   [
9060   DISCH_ALL_TAC;
9061   REWRITE_TAC[loc_path_conn];
9062   DISCH_ALL_TAC;
9063   TYPE_THEN `metric_space (A,d_euclid)` SUBGOAL_TAC;
9064   IMATCH_MP_TAC  metric_subspace;
9065   TYPE_THEN `euclid n` EXISTS_TAC;
9066   REWRITE_TAC[metric_euclid];
9067   USE 0 (MATCH_MP sub_union);
9068   ASM_MESON_TAC[top_of_metric_unions;metric_euclid];
9069   DISCH_ALL_TAC;
9070   WITH  3 (MATCH_MP top_of_metric_nbd);
9071   UND 4;
9072   DISCH_THEN (fun t-> REWRITE_TAC[t]);
9073   TYPE_THEN `A' SUBSET A` SUBGOAL_TAC;
9074   USE 1 (MATCH_MP sub_union);
9075   ASM_MESON_TAC[top_of_metric_unions];
9076   DISCH_TAC;
9077   ASM_SIMP_TAC[top_of_metric_induced];
9078   TYPE_THEN `metric_space(A',d_euclid)` SUBGOAL_TAC;
9079   ASM_MESON_TAC[metric_subspace];
9080   DISCH_TAC ;
9081   SUBCONJ_TAC;
9082   REWRITE_TAC[SUBSET;IN];
9083   REWRITE_TAC[path_component];
9084   DISCH_ALL_TAC;
9085   CHO 6;
9086   CHO 6;
9087   CHO 6;
9088   USE 6 (REWRITE_RULE[SUBSET;IN_IMAGE ;IN_ELIM_THM';Q_ELIM_THM'']);
9089   UND 6;
9090   DISCH_ALL_TAC;
9091   TYPE_THEN `b` (USE 10 o SPEC);
9092   USE 4 (REWRITE_RULE[SUBSET;IN]);
9093   UND 4;
9094   DISCH_THEN IMATCH_MP_TAC ;
9095   USE 5 (MATCH_MP top_of_metric_unions);
9096   UND 10;
9097   UND 4;
9098   DISCH_THEN (fun t -> ONCE_REWRITE_TAC[GSYM t]);
9099   ASM_REWRITE_TAC[IN];
9100   ASM_MESON_TAC[REAL_ARITH `b <=. b /\ ((a < b)==> (a <=. b))`];
9101   DISCH_TAC;
9102   REWRITE_TAC[IN];
9103   DISCH_ALL_TAC;
9104   (* c2 *)
9105   WITH 7 (MATCH_MP path_component_in);
9106   TYPE_THEN `A' a` SUBGOAL_TAC;
9107   UND 8;
9108   ASM_SIMP_TAC[GSYM top_of_metric_unions;];
9109   DISCH_TAC;
9110   TYPE_THEN `A SUBSET (euclid n)` SUBGOAL_TAC;
9111   USE 0 (MATCH_MP sub_union);
9112   UND 0;
9113   ASM_SIMP_TAC[GSYM top_of_metric_unions;metric_euclid];
9114   DISCH_TAC;
9115   TYPE_THEN `top_of_metric(euclid n,d_euclid) A'` SUBGOAL_TAC;
9116   IMATCH_MP_TAC  induced_trans;
9117   TYPE_THEN `A` EXISTS_TAC;
9118   ASM_REWRITE_TAC[];
9119   ASM_SIMP_TAC[top_of_metric_top;metric_euclid;top_of_metric_induced ];
9120   DISCH_TAC;
9121   COPY 11;
9122   UND 12;
9123   SIMP_TAC[top_of_metric_nbd;metric_euclid];
9124   DISCH_ALL_TAC;
9125   TYPE_THEN `a` (USE 13 o SPEC);
9126   USE 13 (REWRITE_RULE[IN]);
9127   REWR 13;
9128   CHO 13;
9129   TYPE_THEN `r` EXISTS_TAC;
9130   ASM_REWRITE_TAC[];
9131   TYPE_THEN `open_ball (A,d_euclid) a r SUBSET path_component (top_of_metric (A',d_euclid)) a` SUBGOAL_TAC ;
9132   TYPE_THEN `open_ball (euclid n,d_euclid) a r SUBSET path_component (top_of_metric (A',d_euclid)) a` SUBGOAL_TAC ;
9133   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;
9134   REWRITE_TAC[SUBSET;IN];
9135   MESON_TAC[open_ball_path;SUBSET;IN;path_symm];
9136   IMATCH_MP_TAC  (prove_by_refinement(`!A B C. (B:A->bool) SUBSET C ==> (A SUBSET B ==> A SUBSET C)`,[MESON_TAC[SUBSET_TRANS]]));
9137   IMATCH_MP_TAC  path_component_subspace;
9138   ASM_REWRITE_TAC[];
9139   IMATCH_MP_TAC  (REWRITE_RULE[IN] open_ball_nonempty);
9140   ASM_SIMP_TAC[metric_euclid];
9141   ASM_MESON_TAC[SUBSET;IN];
9142   IMATCH_MP_TAC  (prove_by_refinement (`!A B C. (A:A->bool) SUBSET B ==> (B SUBSET C ==> A SUBSET C)`,[MESON_TAC[SUBSET_TRANS]]));
9143   ASM_SIMP_TAC[open_ball_subspace];
9144   IMATCH_MP_TAC  (prove_by_refinement(`!A B C. (B:A->bool) SUBSET C ==> (A SUBSET B ==> A SUBSET C)`,[MESON_TAC[SUBSET_TRANS]]));
9145   REWRITE_TAC[SUBSET;IN];
9146   GEN_TAC;
9147   UND 7;
9148   MESON_TAC[path_trans];
9149   ]);;
9150   (* }}} *)
9151
9152 let loc_path_euclid_cor = prove_by_refinement(
9153   `!n A . (top_of_metric(euclid n,d_euclid)) A ==>
9154      (path_component (top_of_metric(A,d_euclid)) =
9155       component (top_of_metric(A,d_euclid)))`,
9156   (* {{{ proof *)
9157   [
9158   DISCH_ALL_TAC;
9159   WITH 0 (MATCH_MP loc_path_conn_euclid);
9160   IMATCH_MP_TAC  EQ_EXT;
9161   GEN_TAC;
9162   IMATCH_MP_TAC path_eq_conn;
9163   ASM_REWRITE_TAC[];
9164   IMATCH_MP_TAC  top_of_metric_top;
9165   USE 0 (MATCH_MP sub_union);
9166   UND 0;
9167   ASM_SIMP_TAC[GSYM top_of_metric_unions ;metric_euclid];
9168   ASM_MESON_TAC[metric_subspace;metric_euclid];
9169   ]);;
9170   (* }}} *)