Module mathcomp.analysis.normedtype_theory.urysohn
From HB Require Import structures.From mathcomp Require Import boot order finmap ssralg ssrnum ssrint.
From mathcomp Require Import interval interval_inference archimedean.
#[warning="-warn-library-file-internal-analysis"]
From mathcomp Require Import unstable.
From mathcomp Require Import boolp classical_sets functions cardinality.
From mathcomp Require Import set_interval ereal reals topology tvs.
From mathcomp Require Import num_normedtype pseudometric_normed_Zmodule.
From mathcomp Require Import normed_module.
Unset SsrOldRewriteGoalsOrder.
Set Implicit Arguments.
Unset Strict Implicit.
Unset Printing Implicit Defensive.
Import Order.TTheory GRing.Theory Num.Theory.
Import numFieldNormedType.Exports.
Local Open Scope classical_set_scope.
Local Open Scope ring_scope.
Section pseudoMetricDist.
Context { : realType} { : pseudoMetricType R}.
Implicit Types r : R.
Definition
Source code
ereal_inf (EFin @` [set | 0 < r /\ ball xy.1 r xy.2]).
Lemma
Source code
Proof.
Lemma
Source code
Proof.
Lemma
Source code
Proof.
by move/ltW/le_ball; exact.
Qed.
Lemma
Source code
0 < r -> ball xy.1 r xy.2 -> (edist xy <= r%:E)%E.
Proof.
by move=> ? -> /=; exists r%:num; split.
Qed.
Lemma
Source code
(edist xy = +oo)%E <-> (forall , 0 < r -> ~ ball xy.1 r xy.2).
Proof.
Lemma
Source code
(edist xy \is a fin_num)%E <-> exists2 , 0 < r & ball xy.1 r xy.2.
Proof.
Lemma
Source code
Proof.
exists (ball z.1 r%:num, ball z.2 r%:num); first by split; exact: nbhsx_ballx.
case=> a b [bza bzb]; apply/edist_finP; exists (r%:num + r%:num + r%:num) => //.
exact/(ball_triangle _ bzb)/(ball_triangle _ bzr)/ball_sym.
Qed.
Lemma
Source code
Proof.
move=> w [/edist_finP [] _/posnumP[r] babr [bz1w1 bz2w2]]; apply/edist_finP.
exists (1 + (r%:num + 1)) => //.
exact/(ball_triangle bz1w1)/(ball_triangle babr)/ball_sym.
Qed.
Lemma
Source code
Proof.
by rewrite eqEsubset; split => z; rewrite /= ?ge0_fin_numE// ltey => /eqP.
Qed.
Lemma
Source code
Lemma
Source code
(edist (x, z) <= edist (x, y) + edist (y, z))%E.
Proof.
have [->|] := eqVneq (edist (y, z)) +oo%E; first by rewrite addey ?leey.
rewrite -?ltey -?ge0_fin_numE//.
move=> /edist_finP [_/posnumP[r2] /= yz] /edist_finP [_/posnumP[r1] /= xy].
have [|] := eqVneq (edist (x, z)) +oo%E.
move/edist_pinftyP /(_ (r1%:num + r2%:num) _) => -[//|].
exact: (ball_triangle xy).
rewrite -ltey -ge0_fin_numE// => /[dup] xzfin.
move/edist_finP => [_/posnumP[del] /= xz].
rewrite /edist /= ?ereal_inf_EFin.
- by exists 0 => ? /= [/ltW].
- by exists (r1%:num + r2%:num); split => //; apply: (ball_triangle xy).
- by exists 0 => ? /= [/ltW].
- by exists r1%:num; split.
- by exists 0 => ? /= [/ltW].
- by exists r2%:num; split.
rewrite -EFinD lee_fin -inf_sumE //.
- by split; [exists r1%:num; split| exists 0 => ? /= [/ltW]].
- by split; [exists r2%:num; split| exists 0 => ? /= [/ltW]].
apply: lb_le_inf.
by exists (r1%:num + r2%:num); exists r1%:num => //; exists r2%:num.
move=> ? [+ []] => _/posnumP[p] xpy [+ []] => _/posnumP[q] yqz <-.
apply: ge_inf; first by exists 0 => ? /= [/ltW].
by split => //; exact: (ball_triangle xpy).
Qed.
Lemma
Source code
Proof.
rewrite nbhs_simpl /=; apply (@filterS _ _ _ [set | edist xy = +oo]%E).
by move=> z /= ->; apply: nbhs_singleton; move: pE Upinf => ->.
by apply: open_nbhs_nbhs; split => //; exact: edist_pinfty_open.
rewrite -ltey -ge0_fin_numE// => efin.
rewrite /continuous_at -[edist (x, y)]fineK//; apply: cvg_EFin.
by have := edist_fin_open efin; apply: filter_app; near=> w.
apply/cvgrPdist_le => _/posnumP[eps].
suff: \forall \near (nbhs x, nbhs y),
`|fine (edist (x, y)) - fine (edist t)| <= eps%:num by [].
rewrite -near2_pair; near=> a b => /=.
have abxy : (edist (a, b) <= edist (x, a) + edist (x, y) + edist (y, b))%E.
rewrite (edist_sym x a) -addeA.
by rewrite (le_trans (@edist_triangle _ x _)) ?leeD ?edist_triangle.
have xyab : (edist (x, y) <= edist (x, a) + edist (a, b) + edist (y, b))%E.
rewrite (edist_sym y b) -addeA.
by rewrite (le_trans (@edist_triangle _ a _))// ?leeD// ?edist_triangle.
have xafin : edist (x, a) \is a fin_num.
by apply/edist_finP; exists 1 =>//; near: a; exact: nbhsx_ballx.
have ybfin : edist (y, b) \is a fin_num.
by apply/edist_finP; exists 1 =>//; near: b; exact: nbhsx_ballx.
have abfin : edist (a, b) \is a fin_num.
by rewrite ge0_fin_numE// (le_lt_trans abxy) ?lte_add_pinfty// -ge0_fin_numE.
have xyabfin : (edist (x, y) - edist (a, b))%E \is a fin_num
by rewrite fin_numB abfin efin.
rewrite -fineB// -fine_abse// -lee_fin fineK ?abse_fin_num//.
rewrite (@le_trans _ _ (edist (x, a) + edist (y, b))%E)//; last first.
by rewrite [eps%:num]splitr/= EFinD leeD//; apply: edist_fin => //=;
[near: a | near: b]; exact: nbhsx_ballx.
have [ab_le_xy|/ltW xy_le_ab] := leP (edist (a, b)) (edist (x, y)).
by rewrite gee0_abs ?subre_ge0// leeBlDr// addeAC.
rewrite lee0_abs ?sube_le0// oppeB ?fin_num_adde_defr//.
by rewrite addeC leeBlDr// addeAC.
Unshelve. all: end_near. Qed.
Lemma
Source code
Proof.
by apply: (@edist_lt_ball _ (x, y)); rewrite edist0.
case: ltgtP (edist_ge0 (x, y)) => // dpos _.
have xxfin : edist (x, y) \is a fin_num.
rewrite ge0_fin_numE// (@le_lt_trans _ _ 1%:E) ?ltey// edist_fin//.
exact: bxy (widen_itv 1%:itv).
have dpose : fine (edist (x, y)) > 0 by rewrite -lte_fin fineK.
pose eps := PosNum dpose.
have : (edist (x, y) <= (eps%:num / 2)%:E)%E.
apply: ereal_inf_lbound; exists (eps%:num / 2) => //; split => //.
exact: (bxy (eps%:num / 2)%:pos).
apply: contra_leP => _.
by rewrite /= EFinM fineK// lte_pdivrMr// lte_pmulr// lte1n.
Qed.
Lemma
Source code
Proof.
Lemma
Source code
Proof.
by rewrite -[edist (y, z)]add0e -xy0 edist_triangle.
by rewrite -[edist (x, z)]add0e -xy0 [edist (x, y)]edist_sym edist_triangle.
Qed.
End pseudoMetricDist.
#[global]
Hint Extern 0 (is_true (0%R <= edist _)%E) => solve [apply: edist_ge0] : core.
#[global]
Hint Extern 0 (is_true (edist _ != -oo%E)) => solve [apply: edist_neqNy] : core.
Section edist_inf.
Context { : realType} { : pseudoMetricType R} ( : set T).
Definition
Source code
Lemma
Source code
Proof.
Lemma
Source code
Proof.
Lemma
Source code
Proof.
by rewrite /edist_inf A0 ?image_set0 ?ereal_inf0 addey.
have [fyn|] := boolP (edist_inf y \is a fin_num); first last.
by rewrite ge0_fin_numE// ?ltey negbK => /eqP->; rewrite addey ?leey.
have [xyfin|] := boolP (edist (x, y) \is a fin_num); first last.
by rewrite ge0_fin_numE// ?ltey // negbK => /eqP->; rewrite addye ?leey.
apply/lee_addgt0Pr => _/posnumP[eps].
have [//|? [a Aa <-] yaeps] := @lb_ereal_inf_adherent R _ eps%:num _ fyn.
apply: le_trans.
by apply: (@ereal_inf_lbound _ _ (edist (x, a))); exists a.
apply: le_trans; first exact: (@edist_triangle _ _ _ y).
by rewrite -addeA leeD2lE // ltW.
Qed.
Lemma
Source code
Proof.
rewrite /edist_inf A0.
under eq_fun do rewrite image_set0 ereal_inf0.
exact: cvg_cst.
have [] := eqVneq (edist_inf z) +oo%E.
move=> /[dup] fzp /ereal_inf_pinfty => zAp U /= Ufz.
have : nbhs z (ball z 1) by exact: nbhsx_ballx.
apply: filter_app; near_simpl; near=> w => bz1w.
suff /= -> : (edist_inf w) = +oo%E by apply: nbhs_singleton; rewrite -fzp.
apply/ereal_inf_pinfty => r [a Aa] war; apply/zAp; exists a => //.
have /gee0P[|[r' r'pos war']] := edist_ge0 (w, a).
by rewrite war => ->; apply: zAp; exists a.
have := @edist_triangle _ _ z w a; rewrite war'; apply: contra_leP => _.
rewrite (@le_lt_trans _ _ (1 + r'%:E)%E) ?leeD2r ?edist_fin//.
by rewrite -EFinD [edist (z, a)]zAp ?ltey //; exists a.
rewrite -ltey -ge0_fin_numE ?edist_inf_ge0 // => fz_fin.
rewrite /continuous_at -[edist_inf z]fineK //; apply/fine_cvgP.
have fwfin : \forall \near z, edist_inf w \is a fin_num.
(have : nbhs z (ball z 1) by exact: nbhsx_ballx); apply: filter_app.
near=> t => bz1; rewrite ge0_fin_numE ?edist_inf_ge0 //.
rewrite (le_lt_trans (edist_inf_triangle _ z))//.
rewrite -ge0_fin_numE ?adde_ge0 ?edist_inf_ge0 //.
rewrite fin_numD fz_fin andbT; apply/edist_finP; exists 1 => //.
exact/ball_sym.
split => //; apply/cvgrPdist_le => _/posnumP[eps].
have : nbhs z (ball z eps%:num) by exact: nbhsx_ballx.
apply: filter_app; near_simpl; move: fwfin; apply: filter_app.
near=> t => tfin /= /[dup] ?.
have ztfin : edist (z, t) \is a fin_num by apply/edist_finP; exists eps%:num.
move=> /(@edist_fin _ _ _ (z, t)) - /(_ trivial).
rewrite -[edist (z, t)]fineK ?lee_fin //; apply: le_trans.
rewrite ler_norml; apply/andP; split.
rewrite lerBrDr addrC lerBlDr addrC -fineD //.
rewrite -lee_fin ?fineK // ?fin_numD ?ztfin ?fz_fin // edist_sym.
exact: edist_inf_triangle.
rewrite lerBlDr -fineD // -lee_fin ?fineK // ?fin_numD ?tfin ?ztfin //.
exact: edist_inf_triangle.
Unshelve. all: by end_near. Qed.
Lemma
Source code
Proof.
by apply: ereal_inf_lbound; exists a => //; exact: edist_refl.
Qed.
End edist_inf.
#[global]
Hint Extern 0 (is_true (0 <= edist_inf _ _)%E) =>
solve [apply: edist_inf_ge0] : core.
#[global]
Hint Extern 0 (is_true (edist_inf _ _ != -oo%E)) =>
solve [apply: edist_inf_neqNy] : core.
Section urysohn_separator.
Context { : uniformType} { : realType}.
Context ( : set T) ( : set (T * T)).
Hypothesis
Source code
Hypothesis
Source code
Local Notation := [the pseudoMetricType R of gauge.type entE].
Local Lemma
Source code
[/\ continuous f, range f `<=` `[0, 1],
f @` A `<=` [set 0] & f @` B `<=` [set 1] ].
Proof.
Source code
forall ( : T'), A x -> B y -> ~ ball x eps%:num y.
have : @entourage T' E by exists O => /=.
rewrite -entourage_ballE; case=> _/posnumP[eps] epsdiv; exists eps.
move=> x y Ax By bxy; have divxy := epsdiv (x, y) bxy.
by have : set0 (x, y) by rewrite -AB0; split.
have [->|/set0P[a A0]] := eqVneq A set0.
exists (cst 1); split; first exact: cst_continuous.
- by move=> ? [? _ <-]; rewrite /= in_itv /=; apply/andP; split => //.
- by rewrite image_set0.
- by move=> ? [? ? <-].
have dfin x : @edist_inf R T' A x \is a fin_num.
rewrite ge0_fin_numE ?edist_inf_ge0 //; apply: le_lt_trans.
by apply: ereal_inf_lbound; exists a.
rewrite -ge0_fin_numE ?edist_ge0 //; apply/edist_finP => /=; exists 2 => //.
exact: countable_uniform.countable_uniform_bounded.
pose f' := (fun => fine (@edist_inf R T' A z)) \min (fun=> eps%:num).
pose f := (f' z)/eps%:num; exists f; split.
- move=> x; rewrite /f; apply: (@cvgM R T (nbhs x)) => //.
suff : {for x, continuous (f' : T' -> R)}.
move=> Q U; rewrite nbhs_simpl /= => f'U.
have [J /(gauge.gauge_ent entE) entJ/filterS] := Q _ f'U; apply.
by rewrite nbhs_simpl /= -nbhs_entourageE /=; exists J.
apply: continuous_min; last exact: cst_continuous.
apply: fine_cvg; first exact: nbhs_filter.
rewrite fineK //; first exact: edist_inf_continuous.
- move=> _ [x _ <-]; rewrite set_itvE /=; apply/andP; split.
by rewrite /f divr_ge0 // /f' /= le_min fine_ge0//= edist_inf_ge0.
by rewrite /f ler_pdivrMr // mul1r /f' /= ge_min lexx orbT.
- by move=> ? [z Az] <-; rewrite /f/f' /= edist_inf0 // fine0 min_l// mul0r.
- move=> ? [b Bb] <-; rewrite /f /f'/=; case: ltP; rewrite ?divff//.
rewrite -lte_fin fineK// => /ereal_inf_lt [_ [z Az <-]] ebz.
by have [] := exy _ _ Az Bb; exact/ball_sym/(@edist_lt_ball R T' _ (b, z)).
Qed.
End urysohn_separator.
Section topological_urysohn_separator.
Context { : topologicalType} { : realType}.
Definition
Source code
exists ( : @Uniform.axioms_ T^o) ( : set (T * T)),
let := Uniform.Pack uT in [/\
@entourage UT E, A `*` B `&` E = set0 &
(forall , @nbhs UT UT x `<=` @nbhs T T x)].
Local Lemma
Source code
[/\ continuous f,
range f `<=` `[0, 1]
& uniform_separator A B ->
f @` A `<=` [set 0] /\ f @` B `<=` [set 1]].
Proof.
have [f] := @urysohn_separation _ R _ _ _ entE ABE0.
by case=> ctsf ? ? ?; exists f; split => // ? ? /= ?; exact/coarseT/ctsf.
exists (cst 1); split => //; first exact: cst_continuous.
by move=> ? [? _ <-]/=; rewrite bound_itvE.
Qed.
Definition
Source code
Section urysohn_facts.
Lemma
Source code
Lemma
Source code
Lemma
Source code
uniform_separator A B -> Urysohn A B @` A `<=` [set 0].
Lemma
Source code
uniform_separator A B -> Urysohn A B @` B `<=` [set 1].
Lemma
Source code
uniform_separator A B -> A !=set0 -> Urysohn A B @` A = [set 0].
Proof.
Lemma
Source code
uniform_separator A B -> (B !=set0) -> (Urysohn A B) @` B = [set 1].
Proof.
End urysohn_facts.
End topological_urysohn_separator.
Lemma
Source code
(exists2 , entourage E & A `*` B `&` E = set0) ->
uniform_separator A B.
Section Urysohn.
Local Open Scope relation_scope.
Context { : topologicalType}.
Hypothesis
Source code
Section normal_uniform_separators.
Context ( : set T).
Let
Source code
(UV.2 `*` UV.2) `|` (~` closure UV.1 `*` ~` closure UV.1).
Let
Source code
[/\ open UV.1, open UV.2, A `<=` UV.1 & closure UV.1 `<=`UV.2].
Let
Source code
Local Lemma
Source code
Proof.
Local Lemma
Source code
Proof.
Local Lemma
Source code
exists , [/\ ury_base E1, ury_base E2 &
(E1 `&` E2) \; (E1 `&` E2) `<=` E].
Proof.
have [R' []] : exists , [/\ open R', closure L `<=` R' & closure R' `<=` R].
have := @normalT (closure L) (@closed_closure T L).
case/(_ R); first by move=> x /cLR ?; apply: open_nbhs_nbhs.
move=> V /set_nbhsP [U] [? ? ? cVR]; exists U; split => //.
by apply: (subset_trans _ cVR); exact: closureS.
move=> oR' cLR' cR'R; exists (apxU (L, R')), (apxU (R', R)).
split; first by exists (L, R').
exists (R', R) => //; split => //; apply: (subset_trans AL).
by apply: (subset_trans _ cLR'); exact: subset_closure.
case=> x z /= [y [+ +] []].
(do 4 (case; case=> /= ? ?)); try (by left); try (by right);
match goal with nG : (~ closure ?S ?y), G : ?S ?y |- _ =>
by move/subset_closure: G
end.
Qed.
Let
Source code
Instance
Source code
Proof.
Local Lemma
Source code
Proof.
Local Lemma
Source code
Proof.
split => // K /ury_base_inv/urF /= ?; exists (K^-1)%classic => //.
by rewrite set_prod_invK.
by move=> R FR <-; rewrite set_prod_invK.
Qed.
Local Lemma
Source code
filterI_iter ury_base n E -> exists2 : set (T * T),
filterI_iter ury_base n.+1 K & K \; K `<=` E.
Proof.
- move=> ->; exists setT => //; exists setT; first by left.
by exists setT; rewrite ?setIT; first by left.
- move=> /[dup] /ury_base_split [E1 [E2] [? ? ? ?]]; exists (E1 `&` E2) => //.
by (exists E1; first by right); exists E2; first by right.
move=> n IH E /= [E1 /IH [F1 F1n1 F1E1]] [E2 /IH [F2 F2n1 F2E2]] E12E.
exists (F1 `&` F2); first by exists F1 => //; exists F2.
move=> /= [x z ] [y /= [K1xy K2xy] [K1yz K2yz]]; rewrite -E12E; split.
by apply: F1E1; exists y.
by apply: F2E2; exists y.
Qed.
Local Lemma
Source code
exists2 , ury_unif K & K \; K `<=` E.
Proof.
move=> K SnK KG GE; exists K; first by exists K => //; exists n.+1.
exact: (subset_trans _ GE).
Qed.
Local Lemma
Source code
Proof.
elim: n G sG.
move=> g [-> //| [[P Q]]] [/= _ _ AP cPQ <-] [x y] [/= /AP ? ?].
by left; split => //=; apply/cPQ/subset_closure => //; exact: AP.
by move=> n IH G [R] /IH AAR [M] /IH AAM <- z; split; [exact: AAR | exact: AAM].
Qed.
Definition
pinfty_nbhs : forall R : numFieldType, set_system R pinfty_nbhs is not universe polymorphic Arguments pinfty_nbhs R _ pinfty_nbhs is transparent Expands to: Constant mathcomp.analysis.normedtype_theory.num_normedtype.pinfty_nbhs Declared in library mathcomp.analysis.normedtype_theory.num_normedtype, line 219, characters 11-22
Source code
.
Source code
Source code
Source code
.
Source code
Source code
isUniform.Build urysohnType ury_unif_filter ury_unif_refl ury_unif_inv
ury_unif_split.
.
Source code
Source code
Source code
Lemma
Source code
closed A -> closed B -> A `&` B = set0 -> uniform_separator A B.
Proof.
apply: open_nbhs_nbhs; split => //.
- exact/closed_openC.
- by move: x Ax; apply/ disjoints_subset.
move=> V /set_nbhsP [U [oU AU UV]] cVcb.
exists (Uniform.class urysohnType), (apxU (U, ~` B)); split => //.
- move=> ?; apply:sub_gen_smallest; exists (U, ~`B) => //; split => //=.
exact/closed_openC.
by move: UV => /closureS/subset_trans; apply.
- rewrite eqEsubset; split; case=> // a b [/=[Aa Bb] [[//]|]].
by have /subset_closure ? := AU _ Aa; case.
move=> x ? [E gE] /(@filterS T); apply; move: gE.
rewrite /= /ury_unif filterI_iterE; case => K /= [i _] /= uiK KE.
suff : @nbhs T T x [set | K (x, y)] by apply: filterS => y /KE/xsectionP.
elim: i K uiK {E KE}; last by move=> ? H ? [N] /H ? [M] /H ? <-; apply: filterI.
move=> K [->|]; first exact: filterT.
move=> [[/= P Q] [/= oP oQ AP cPQ <-]]; rewrite /apxU /=.
set M := [set | _ \/ _].
have [Qx|nQx] := pselect (Q x); first last.
suff -> : M = ~` closure P.
apply: open_nbhs_nbhs; split; first exact/closed_openC/closed_closure.
by move/cPQ.
rewrite eqEsubset /M; split => z; first by do 2!case.
by move=> ?; right; split => // /cPQ.
have [nPx|cPx] := pselect (closure P x).
suff -> : M = Q by apply: open_nbhs_nbhs; split.
rewrite eqEsubset /M; split => z; first by do 2!case.
by move=> ?; left; split.
suff -> : M = setT by exact: filterT.
rewrite eqEsubset; split => // z _.
by have [Qz|/(subsetC cPQ)] := pselect (Q z); constructor.
Qed.
End normal_uniform_separators.
End Urysohn.
Lemma
Source code
uniform_separator A B <->
exists ( : T -> R), [/\ continuous f, range f `<=` `[0, 1],
f @` A `<=` [set 0] & f @` B `<=` [set 1]].
Proof.
- exact: Urysohn_continuous.
- exact: Urysohn_range.
- exact: Urysohn_sub0.
- exact: Urysohn_sub1.
case=> f [ctsf f01 fA0 fB1].
pose T' : uniformType := initial_topology f.
exists (Uniform.class T'), ([set | ball (f xy.1) 1 (f xy.2)]); split.
- exists [set | ball xy.1 1 xy.2]; last by case.
by rewrite -entourage_ballE; exists 1 => //=.
- rewrite -subset0 => -[a b [[/= Aa Bb]]].
by rewrite (imsub1 fA0)// (imsub1 fB1)// /ball/= sub0r normrN normr1 ltxx.
- move=> x U [V [[W oW <- /=]]] ? /filterS; apply.
by apply: ctsf; exact: open_nbhs_nbhs.
Qed.
Section normalP.
Context { : realType} { : topologicalType}.
Let
Source code
normal_space T;
forall ( : set T), closed A -> closed B -> A `&` B = set0 ->
uniform_separator A B;
forall ( : set T), closed A -> closed B -> A `&` B = set0 ->
exists , [/\ open U, open V, A `<=` U, B `<=` V & U `&` V = set0] ].
Proof.
- move=> + A B clA clB AB0 => /(_ _ _ clA clB AB0) /(@uniform_separatorP _ R).
case=> f [cf f01 /imsub1P/subset_trans fa0 /imsub1P/subset_trans fb1].
exists (f@^-1` `]-1, 1/2[), (f @^-1` `]1/2, 2[); split.
+ by apply: open_comp; [|exact: interval_open].
+ by apply: open_comp; [|exact: interval_open].
+ by apply: fa0 => x/= ->; rewrite (@in_itv _ R)/=; apply/andP; split.
+ apply: fb1 => x/= ->; rewrite (@in_itv _ R)/= ltr_pdivrMr// mul1r.
by rewrite ltr1n.
+ rewrite -preimage_setI ?set_itvoo -subset0 => t [] /andP [_ +] /andP [+ _].
by move=> /lt_trans /[apply]; rewrite ltxx.
move=> + A clA B /set_nbhsP [C [oC AC CB]].
have AC0 : A `&` ~` C = set0 by apply/disjoints_subset; rewrite setCK.
case/(_ _ _ clA (open_closedC oC) AC0) => U [V] [oU oV AU nCV UV0].
exists (~` closure V).
apply/set_nbhsP; exists U; split => //.
apply/subsetCr; have := open_closedC oU; rewrite closure_id => ->.
by apply/closureS/disjoints_subset; rewrite setIC.
apply/(subset_trans _ CB)/subsetCP; apply: (subset_trans nCV).
apply/subsetCr; have := open_closedC oV; rewrite closure_id => ->.
exact/closureS/subsetC/subset_closure.
Qed.
Lemma
Source code
forall ( : set T), closed A -> closed B -> A `&` B = set0 ->
exists , [/\ open U, open V, A `<=` U, B `<=` V & U `&` V = set0].
Proof.
Lemma
Source code
forall ( : set T), closed A -> closed B -> A `&` B = set0 ->
uniform_separator A B.
Proof.
End normalP.
Section completely_regular.
Context { : realType}.
ninfty_nbhs : forall R : numFieldType, set_system R ninfty_nbhs is not universe polymorphic Arguments ninfty_nbhs R _ ninfty_nbhs is transparent Expands to: Constant mathcomp.analysis.normedtype_theory.num_normedtype.ninfty_nbhs Declared in library mathcomp.analysis.normedtype_theory.num_normedtype, line 222, characters 11-22
Source code
forall ( : T) ( : set T), closed B -> ~ B a -> uniform_separator [set a] B.
Lemma
Source code
closed B -> ~ B x -> uniform_separator [set x] B.
Proof.
rewrite openE => /(_ _ nBx); rewrite /interior /= -nbhs_entourageE.
case=> E entE EnB.
pose T' : pseudoMetricType R := gauge.type entE.
exists (Uniform.class T); exists E; split => //; last by move => ?.
by rewrite -subset0 => -[? w [/= [-> ? /xsectionP ?]]]; exact: (EnB w).
Qed.
Lemma
Source code
@completely_regular_space T.
Proof.
Lemma
Source code
normal_space T -> accessible_space T -> completely_regular_space T.
Proof.
by apply/disjoints_subset => ? ->.
Qed.
Lemma
Source code
Proof.
move/(subset_trans (ent_closure entE)) => ExA.
by exists (xsection (split_ent E) x) => //; exists (split_ent E).
Qed.
End completely_regular.
Module
Source code
Section completely_regular_uniformity.
Context { : realType} { : topologicalType}.
Hypothesis
Source code
Let : uniformType := @sup_topology X { : X -> R | continuous f}
(fun => Uniform.class (initial_topology (projT1 f))).
Let
Source code
Proof.
apply/cvg_sup => -[f ctsf] U [/= _ [[V /= oV <- /= Vfx]]] /filterS.
by apply; exact/ctsf/open_nbhs_nbhs.
move=> U; wlog oU : U / @open X U.
move=> WH; rewrite nbhsE => -[V [oV Vx /filterS]].
apply; first exact: (@nbhs_filter X').
by apply: WH => //; move: oV; rewrite openE; exact.
move=> /[dup] nUx /nbhs_singleton Ux.
have ufs : uniform_separator [set x] (~` U).
by apply: crs; [exact: open_closedC | exact].
have /uniform_separatorP := ufs => /(_ R)[f [ctsf f01 fx0 fU1]].
rewrite -nbhs_entourageE /entourage /= /sup_ent /= smallest_filter_finI.
pose E := map_pair f @^-1` (fun => ball pq.1 1 pq.2).
exists E; first last.
move=> z /= /set_mem; rewrite /E /=.
have -> : f x = 0 by apply: fx0; exists x.
rewrite /ball /= sub0r normrN; apply: contraPP => cUz.
suff -> : f z = 1 by rewrite normr1 ltxx.
by apply: fU1; exists z.
move=> r /= [_]; apply => /=.
pose f' : {classic { : X -> R | continuous f}} := exist _ f ctsf.
suff /asboolP entE : @entourage (initial_topology f) (f', E).2.
by exists (exist _ (f', E) entE).
exists (fun => ball pq.1 1 pq.2) => //=.
by rewrite /entourage /=; exists 1 => /=.
Qed.
Definition
is_interval : forall [R : numDomainType], set R -> Prop is_interval is not universe polymorphic Arguments is_interval [R] E%_classical_set_scope is_interval is transparent Expands to: Constant mathcomp.analysis.normedtype_theory.num_normedtype.is_interval Declared in library mathcomp.analysis.normedtype_theory.num_normedtype, line 737, characters 11-22
Source code
Source code
Source code
Source code
Source code
Source code
Source code
Source code
Source code
type
(@entourage X')
(@entourage_filter X')
(@entourage_diagonal_subproof X')
(@entourage_inv X')
(@entourage_split_ex X')
completely_regular_nbhsE.
End completely_regular_uniformity.
Module
Source code
End completely_regular_uniformity.
Export completely_regular_uniformity.Exports.
Section locally_compact_uniform.
Context { : topologicalType} { : realType}.
Hypothesis
Source code
Hypothesis
Source code
Let
Source code
Lemma
Source code
completely_regular_space opc.
Proof.
apply: compact_normal.
exact: one_point_compactification_hausdorff.
exact: one_point_compactification_compact.
by apply: hausdorff_accessible; exact: one_point_compactification_hausdorff.
Qed.
Source code
.
Source code
Source code
Source code
(@completely_regular_uniformity.type R _
one_point_compactification_completely_reg).
Let := @initial_topology X opc Some.
Lemma
Source code
Proof.
Source code
Source code
.
Source code
Source code
Source code
X
(@entourage X')
(@entourage_filter X')
(@entourage_diagonal_subproof X')
(@entourage_inv X')
(@entourage_split_ex X')
nbhs_one_point_compactification_weakE.
Lemma
Source code
Proof.
End locally_compact_uniform.
Lemma
Source code
completely_regular_space X -> @regular_space X.
Proof.
exact: (@uniform_regular P').
Qed.
Section pseudometric_normal.
Lemma
Source code
{for x, @regular_space T} <-> forall , closed A -> ~ A x ->
exists : set T, [/\ open U, open V, U x, A `<=` V & U `&` V = set0].
Proof.
move=> + A clA nAx => /(_ (~` A)) [].
by apply: open_nbhs_nbhs; split => //; exact: closed_openC.
move=> U Ux /subsetC; rewrite setCK => AclU; exists U°.
exists (~` closure U) ; split => //; first exact: open_interior.
exact/closed_openC/closed_closure.
apply/disjoints_subset; rewrite setCK.
exact: (subset_trans (@interior_subset _ _) (@subset_closure _ _)).
move=> + A Ax => /(_ (~` A°)) []; [|exact|].
exact/open_closedC/open_interior.
move=> U [V] [oU oV Ux /subsetC cAV /disjoints_subset UV]; exists U.
exact/open_nbhs_nbhs.
apply: (subset_trans (closureS UV)).
move/open_closedC/closure_id : oV => <-.
by apply: (subset_trans cAV); rewrite setCK; exact: interior_subset.
Qed.
Lemma
Source code
normal_space X.
Proof.
have eps' ( : set X) : closed D -> forall , exists
Source code
ball x eps%:num `&` D = set0.
move=> clD x; have [nDx|?] := pselect (~ D x); last by exists 1%:pos.
have /regular_openP/(_ _ clD) [//|] := @uniform_regular X x.
move=> U [V] [+ oV] Ux /subsetC BV /disjoints_subset UV0.
rewrite openE /interior => /(_ _ Ux); rewrite -nbhs_ballE => -[].
move => _/posnumP[eps] beU; exists eps => _; apply/disjoints_subset.
exact: (subset_trans beU (subset_trans UV0 _)).
pose epsA := projT1 (cid (eps' _ clB x)).
pose epsB := projT1 (cid (eps' _ clA x)).
exists (\bigcup_( in A) interior (ball x ((epsA x)%:num / 2)%:pos%:num)).
exists (\bigcup_( in B) interior (ball x ((epsB x)%:num / 2)%:pos%:num)).
split.
- by apply: bigcup_open => ? ?; exact: open_interior.
- by apply: bigcup_open => ? ?; exact: open_interior.
- by move=> x ?; exists x => //; exact: nbhsx_ballx.
- by move=> y ?; exists y => //; exact: nbhsx_ballx.
- apply/nonemptyPn => -[z [[x Ax /interior_subset Axe]]].
case=> y By /interior_subset Bye; have nAy : ~ A y.
by move: AB0; rewrite setIC => /disjoints_subset; exact.
have nBx : ~ B x by move/disjoints_subset: AB0; exact.
have [|/ltW] := leP ((epsA x)%:num / 2) ((epsB y)%:num / 2).
move/ball_sym: Axe => /[swap] /le_ball /[apply] /(ball_triangle Bye).
rewrite -splitr => byx; have := projT2 (cid (eps' _ clA y)) nAy.
by rewrite -subset0; apply; split; [exact: byx|].
move/ball_sym: Bye =>/[swap] /le_ball /[apply] /(ball_triangle Axe).
rewrite -splitr => byx; have := projT2 (cid (eps' _ clB x)) nBx.
by rewrite -subset0; apply; split; [exact: byx|].
Qed.
End pseudometric_normal.