@@ -2854,6 +2854,81 @@ Hint Extern 0 (entourage (get _)) => exact: entourage_split_ent : core.
28542854Arguments entourage_split {M} z {x y A}.
28552855Hint Extern 0 (nbhs _ (to_set _ _)) => exact: nbhs_entourage : core.
28562856
2857+ Lemma continuous_withinNx {U V : uniformType} (f : U -> V) x :
2858+ {for x, continuous f} <-> f @ nbhs' x --> f x.
2859+ Proof .
2860+ split=> - cfx P /= fxP.
2861+ rewrite /nbhs' !near_simpl near_withinE.
2862+ by rewrite /nbhs'; apply: cvg_within; apply/cfx.
2863+ (* :BUG: ssr apply: does not work,
2864+ because the type of the filter is not inferred *)
2865+ rewrite !nbhs_nearE !near_map !near_nbhs in fxP *; have /= := cfx P fxP.
2866+ rewrite !near_simpl near_withinE near_simpl => Pf; near=> y.
2867+ by have [->|] := eqVneq y x; [by apply: nbhs_singleton|near: y].
2868+ Grab Existential Variables. all: end_near. Qed .
2869+
2870+ Section uniform_closeness.
2871+
2872+ Variable (U : uniformType).
2873+
2874+ Lemma open_nbhs_entourage (x : U) (A : set (U * U)) :
2875+ entourage A -> open_nbhs x (to_set A x)^°.
2876+ Proof .
2877+ move=> entA; split; first exact: open_interior.
2878+ by apply: nbhs_singleton; apply: nbhs_interior; apply: nbhs_entourage.
2879+ Qed .
2880+
2881+ Lemma entourage_close (x y : U) :
2882+ close x y = forall A, entourage A -> A (x, y).
2883+ Proof .
2884+ rewrite propeqE; split=> [cxy A entA|cxy].
2885+ have /entourage_split_ent entsA := entA.
2886+ have [z [/interior_subset zx /interior_subset /= zy]] :=
2887+ cxy _ (open_nbhs_entourage _ (entourage_inv entsA))
2888+ _ (open_nbhs_entourage _ entsA).
2889+ exact: (entourage_split z).
2890+ move=> A /open_nbhs_nbhs/nbhsP[E1 entE1 sE1A].
2891+ move=> B /open_nbhs_nbhs/nbhsP[E2 entE2 sE2B].
2892+ by exists y; split; [apply/sE2B; apply: cxy|apply/sE1A; apply: entourage_refl].
2893+ Qed .
2894+
2895+ Lemma close_trans (y x z : U) : close x y -> close y z -> close x z.
2896+ Proof .
2897+ rewrite !entourage_close => cxy cyz A entA.
2898+ exact: entourage_split (cxy _ _) (cyz _ _).
2899+ Qed .
2900+
2901+ Lemma close_cvgxx (x y : U) : close x y -> x --> y.
2902+ Proof .
2903+ rewrite entourage_close => cxy P /= /nbhsP[A entA sAP].
2904+ apply/nbhsP; exists (split_ent A) => // z xz; apply: sAP.
2905+ apply: (entourage_split x) => //.
2906+ by have := cxy _ (entourage_inv (entourage_split_ent entA)).
2907+ Qed .
2908+
2909+ Lemma cvg_closeP (F : set (set U)) (l : U) : ProperFilter F ->
2910+ F --> l <-> ([cvg F in U] /\ close (lim F) l).
2911+ Proof .
2912+ move=> FF; split=> [Fl|[cvF]Cl].
2913+ by have /cvgP := Fl; split=> //; apply: (@cvg_close _ F).
2914+ by apply: cvg_trans (close_cvgxx Cl).
2915+ Qed .
2916+
2917+ Lemma close_cluster (x y : U) : close x y = cluster (nbhs x) y.
2918+ Proof .
2919+ rewrite propeqE; split => xy.
2920+ - move=> A B xA; rewrite -nbhs_entourageE => -[E entE sEB].
2921+ exists x; split; first exact: nbhs_singleton.
2922+ by apply/sEB; move/close_sym: xy; rewrite entourage_close; apply.
2923+ - rewrite entourage_close => A entA.
2924+ have /entourage_split_ent entsA := entA.
2925+ have [z [/= zx zy]] :=
2926+ xy _ _ (nbhs_entourage _ entsA) (nbhs_entourage _ (entourage_inv entsA)).
2927+ exact: (entourage_split z).
2928+ Qed .
2929+
2930+ End uniform_closeness.
2931+
28572932Definition unif_continuous (U V : uniformType) (f : U -> V) :=
28582933 (fun xy => (f xy.1, f xy.2)) @ entourage --> entourage.
28592934
@@ -3393,26 +3468,6 @@ move=> A /open_nbhs_nbhs/nbhs_ballP[_/posnumP[e1 e1A]].
33933468by exists y; split; [apply/e1A|apply/e2B/ballxx].
33943469Qed .
33953470
3396- Lemma close_trans (y x z : M) : close x y -> close y z -> close x z.
3397- Proof .
3398- by rewrite !ball_close => cxy cyz eps; apply: ball_split (cxy _) (cyz _).
3399- Qed .
3400-
3401- Lemma close_cvgxx (x y : M) : close x y -> x --> y.
3402- Proof .
3403- rewrite ball_close => cxy P /= /nbhs_ballP /= [_/posnumP [eps] epsP].
3404- apply/nbhs_ballP; exists (eps%:num / 2) => // z bxz.
3405- by apply: epsP; apply: ball_splitr (cxy _) bxz.
3406- Qed .
3407-
3408- Lemma cvg_closeP (F : set (set M)) (l : M) : ProperFilter F ->
3409- F --> l <-> ([cvg F in M] /\ close (lim F) l).
3410- Proof .
3411- move=> FF; split=> [Fl|[cvF]Cl].
3412- by have /cvgP := Fl; split=> //; apply: (@cvg_close _ F).
3413- by apply: cvg_trans (close_cvgxx Cl).
3414- Qed .
3415-
34163471End pseudoMetricType_numFieldType.
34173472
34183473Section ball_hausdorff.
@@ -3435,20 +3490,6 @@ by rewrite (subsetI_eq0 _ _ brs_eq0)//; apply: interior_subset.
34353490Qed .
34363491End ball_hausdorff.
34373492
3438- Lemma close_cluster (R : numFieldType) (T : pseudoMetricType R) (x y : T) :
3439- close x y = cluster (nbhs x) y.
3440- Proof .
3441- rewrite propeqE; split => xy.
3442- - move=> A B xA; rewrite -nbhs_ballE => -[_/posnumP[e] yeB].
3443- exists x; split; first exact: nbhs_singleton.
3444- by apply/yeB/ball_sym; move: e {yeB}; rewrite -ball_close.
3445- - rewrite ball_close => e.
3446- have e20 : 0 < e%:num / 2 by apply: divr_gt0.
3447- set e2 := PosNum e20.
3448- case: (xy _ _ (nbhsx_ballx x e2) (nbhsx_ballx y e2)) => z [xz /ball_sym zy].
3449- by rewrite (splitr e%:num); exact: (ball_triangle xz).
3450- Qed .
3451-
34523493Section entourages.
34533494Variable R : numDomainType.
34543495Lemma unif_continuousP (U V : pseudoMetricType R) (f : U -> V) :
0 commit comments