Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

completely regular spaces and locally compact implies uniform #1331

Merged
merged 14 commits into from
Oct 27, 2024
25 changes: 25 additions & 0 deletions CHANGELOG_UNRELEASED.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,33 @@

### Added

- in file `separation_axioms.v`,
+ new lemmas `compact_normal_local`, and `compact_normal`.

- in file `topology_theory/one_point_compactification.v`,
+ new definitions `one_point_compactification`, and `one_point_nbhs`.
+ new lemmas `one_point_compactification_compact`,
`one_point_compactification_some_nbhs`,
`one_point_compactification_some_continuous`,
`one_point_compactification_open_some`,
`one_point_compactification_weak_topology`, and
`one_point_compactification_hausdorff`.

- in file `normedtype.v`,
+ new definition `type` (in module `completely_regular_uniformity`)
+ new lemmas `normal_completely_regular`,
`one_point_compactification_completely_reg`,
`nbhs_one_point_compactification_weakE`,
`locally_compact_completely_regular`, and
`completely_regular_regular`.

### Changed

- in file `normedtype.v`,
changed `completely_regular_space` to depend on uniform separators
which removes the dependency on R. The old formulation can be
zstone1 marked this conversation as resolved.
Show resolved Hide resolved
recovered easily with uniform_separatorP.
zstone1 marked this conversation as resolved.
Show resolved Hide resolved

### Renamed

### Generalized
Expand Down
1 change: 1 addition & 0 deletions _CoqProject
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ theories/topology_theory/uniform_structure.v
theories/topology_theory/weak_topology.v
theories/topology_theory/num_topology.v
theories/topology_theory/quotient_topology.v
theories/topology_theory/one_point_compactification.v

theories/separation_axioms.v
theories/function_spaces.v
Expand Down
2 changes: 1 addition & 1 deletion classical/filter.v
Original file line number Diff line number Diff line change
Expand Up @@ -1565,7 +1565,7 @@ move=> A [n _]; elim: n A.
by move=> n IH A /= [B snB [C snC <-]]; apply: finI_fromI; apply: IH.
Qed.

Lemma smallest_filter_finI {T : choiceType} (D : set T) f :
Lemma smallest_filter_finI {I T : choiceType} (D : set I) (f : I -> set T) :
filter_from (finI_from D f) id = smallest (@Filter T) (f @` D).
Proof. by rewrite filterI_iter_finI filterI_iterE. Qed.

Expand Down
1 change: 1 addition & 0 deletions theories/Make
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ topology_theory/uniform_structure.v
topology_theory/weak_topology.v
topology_theory/num_topology.v
topology_theory/quotient_topology.v
topology_theory/one_point_compactification.v

ereal.v
separation_axioms.v
Expand Down
147 changes: 130 additions & 17 deletions theories/normedtype.v
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,11 @@ From mathcomp Require Export separation_axioms.
(* `uniform_separator A B` *)
(* completely_regular_space == a space where points and closed sets can *)
(* be separated by a function into R *)
(* completely_regular_uniformity == equips a completely_regular_space with *)
(* the uniformity induced by continuous *)
(* functions into the reals *)
(* note this uniformity is always the only *)
(* choice, so its placed in a module *)
(* uniform_separator A B == there is a suitable uniform space and *)
(* entourage separating A and B *)
(* nbhs_norm == neighborhoods defined by the norm *)
Expand Down Expand Up @@ -3687,17 +3692,19 @@ Proof. exact: (normal_spaceP 0%N 1%N). Qed.
End normalP.

Section completely_regular.

Context {R : realType}.

Definition completely_regular_space {T : topologicalType} :=
forall (a : T) (B : set T), closed B -> ~ B a -> exists f : T -> R, [/\
continuous f,
f a = 0 &
f @` B `<=` [set 1] ].
(**md This is equivalent to uniformizable. Note there is a subtle
distinction between being uniformizable and being uniformType.
There is often more than one possible uniformity, and being a
uniformType has a specific one.

If you don't care, you can use the `completely_regular_uniformity.type`
which builds the uniformity.
*)
Definition completely_regular_space (T : topologicalType) :=
forall (a : T) (B : set T), closed B -> ~ B a -> uniform_separator [set a] B.

(* Ideally, R should be an instance of realType here,
rather than a section variable. *)
Lemma point_uniform_separator {T : uniformType} (x : T) (B : set T) :
closed B -> ~ B x -> uniform_separator [set x] B.
Proof.
Expand All @@ -3711,36 +3718,142 @@ Qed.

Lemma uniform_completely_regular {T : uniformType} :
@completely_regular_space T.
Proof. by move=> x B clB Bx; exact: point_uniform_separator. Qed.

Lemma normal_completely_regular {T : topologicalType} :
normal_space T -> accessible_space T -> completely_regular_space T.
Proof.
move=> x B clB Bx.
have /(@uniform_separatorP _ R) [f] := point_uniform_separator clB Bx.
by case=> ? _; rewrite image_set1 => fx ?; exists f; split => //; exact: fx.
move/normal_separatorP => + /accessible_closed_set1 cl1 x A ? ?; apply => //.
by apply/disjoints_subset => ? ->.
Qed.

End completely_regular.

Section pseudometric_normal.

Lemma uniform_regular {X : uniformType} : @regular_space X.
Proof.
move=> x A; rewrite /= -nbhs_entourageE => -[E entE].
move/(subset_trans (ent_closure entE)) => ExA.
by exists (xsection (split_ent E) x) => //; exists (split_ent E).
Qed.

End completely_regular.

Module completely_regular_uniformity.
Section completely_regular_uniformity.
Context {R : realType} {X : topologicalType}.
Hypothesis crs : completely_regular_space X.

Let X' : uniformType := @sup_topology X {f : X -> R | continuous f}
(fun f => Uniform.class (weak_topology (projT1 f))).

Let completely_regular_nbhsE : @nbhs X X = nbhs_ (@entourage X').
Proof.
rewrite nbhs_entourageE; apply/funext => x; apply/seteqP; split; first last.
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 pq => 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 {f : X -> R | continuous f}} := exist _ f ctsf.
suff /asboolP entE : @entourage (weak_topology f) (f', E).2.
by exists (exist _ (f', E) entE).
exists (fun pq => ball pq.1 1 pq.2) => //=.
by rewrite /entourage /=; exists 1 => /=.
Qed.

Definition type : Type := let _ := completely_regular_nbhsE in X.

#[export] HB.instance Definition _ := Topological.copy type X.
#[export] HB.instance Definition _ := @Nbhs_isUniform.Build
type
(@entourage X')
(@entourage_filter X')
(@entourage_diagonal_subproof X')
(@entourage_inv X')
(@entourage_split_ex X')
completely_regular_nbhsE.
#[export] HB.instance Definition _ := Uniform.on type.

End completely_regular_uniformity.
Module Exports. HB.reexport. End Exports.
End completely_regular_uniformity.
Export completely_regular_uniformity.Exports.

Section locally_compact_uniform.
Context {X : topologicalType} {R : realType}.
Hypothesis lcpt : locally_compact [set: X].
Hypothesis hsdf : hausdorff_space X.

Let opc := @one_point_compactification X.

Lemma one_point_compactification_completely_reg :
completely_regular_space opc.
Proof.
apply: (@normal_completely_regular R).
apply: compact_normal.
exact: one_point_compactification_hausdorff.
exact: one_point_compactification_compact.
by apply: hausdorff_accessible; exact: one_point_compactification_hausdorff.
Qed.

#[local]
HB.instance Definition _ := Uniform.copy opc
(@completely_regular_uniformity.type R _
one_point_compactification_completely_reg).

Let X' := @weak_topology X opc Some.
Lemma nbhs_one_point_compactification_weakE : @nbhs X X = nbhs_ (@entourage X').
Proof. by rewrite nbhs_entourageE one_point_compactification_weak_topology. Qed.

#[local, non_forgetful_inheritance]
HB.instance Definition _ := @Nbhs_isUniform.Build
X
(@entourage X')
(@entourage_filter X')
(@entourage_diagonal_subproof X')
(@entourage_inv X')
(@entourage_split_ex X')
nbhs_one_point_compactification_weakE.

Lemma locally_compact_completely_regular : completely_regular_space X.
Proof. exact: uniform_completely_regular. Qed.

End locally_compact_uniform.

Lemma completely_regular_regular {R : realType} {X : topologicalType} :
completely_regular_space X -> @regular_space X.
Proof.
move=> crsX; pose P' := @completely_regular_uniformity.type R _ crsX.
exact: (@uniform_regular P').
Qed.

Section pseudometric_normal.

Lemma regular_openP {T : topologicalType} (x : T) :
{for x, @regular_space T} <-> forall A, closed A -> ~ A x ->
exists U V : set T, [/\ open U, open V, U x, A `<=` V & U `&` V = set0].
Proof.
split.
move=> + A clA nAx => /(_ (~` A)) [].
by apply: open_nbhs_nbhs; split => //; exact: closed_openC.
move=> U Ux /subsetC; rewrite setCK => AclU; exists (interior U).
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 => /(_ (~` interior A)) []; [|exact|].
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.
Expand Down
70 changes: 70 additions & 0 deletions theories/separation_axioms.v
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,28 @@ Import numFieldTopology.Exports.
Lemma Rhausdorff (R : realFieldType) : hausdorff_space R.
Proof. exact: order_hausdorff. Qed.

Lemma one_point_compactification_hausdorff {X : topologicalType} :
locally_compact [set: X] ->
hausdorff_space X ->
hausdorff_space (one_point_compactification X).
Proof.
move=> lcpt hsdfX [x|] [y|] //=.
- move=> clxy; congr Some; apply: hsdfX => U V Ux Vy.
have [] := clxy (Some @` U) (Some @` V).
by apply: filterS Ux; exact: preimage_image.
by apply: filterS Vy; exact: preimage_image.
by case=> [_|] [] /= [// p /[swap] -[] <- Up] [q /[swap] -[] -> Vp]; exists p.
- have [U] := lcpt x I; rewrite withinET => Ux [cU clU].
case/(_ (Some @` U) (Some @` (~` U) `|` [set None])).
+ exact: one_point_compactification_some_nbhs.
+ by exists U.
+ by move=> [?|] [][]// z /[swap] -[] <- ? []//= [? /[swap] -[] ->].
- have [U] := lcpt y I; rewrite withinET => Uy [cU clU].
case/(_ (Some @` (~` U) `|` [set None]) (Some @` U)); first by exists U.
exact: one_point_compactification_some_nbhs.
by case=> [?|] [] [] //= + [] ? // /[swap] -[] -> => -[? /[swap] -[] <-].
Qed.

Section hausdorff_topologicalType.
Variable T : topologicalType.
Implicit Types x y : T.
Expand Down Expand Up @@ -465,6 +487,54 @@ have /closure_id -> : closed (~` B); first by exact: open_closedC.
by apply/closure_subset/disjoints_subset; rewrite setIC.
Qed.

Lemma compact_normal_local (K : set T) : hausdorff_space T -> compact K ->
forall A : set T, A `<=` K^° -> {for A, normal_space}.
Proof.
move=> hT cptV A AK clA B snAB; have /compact_near_coveringP cvA : compact A.
apply/(subclosed_compact clA cptV)/(subset_trans AK).
exact: interior_subset.
have snbC (U : set T) : Filter (filter_from (set_nbhs U) closure).
apply: filter_from_filter; first by exists setT; apply: filterT.
by move=> P Q sAP sAQ; exists (P `&` Q); [apply filterI|exact: closureI].
have [/(congr1 setC)|/set0P[b0 B0]] := eqVneq (~` B) set0.
by rewrite setCK setC0 => ->; exact: filterT.
have PsnA : ProperFilter (filter_from (set_nbhs (~` B)) closure).
apply: filter_from_proper => ? P.
by exists b0; apply/subset_closure; apply: nbhs_singleton; exact: P.
pose F := powerset_filter_from (filter_from (set_nbhs (~` B)) closure).
have PF : Filter F by exact: powerset_filter_from_filter.
have cvP (x : T) : A x -> \forall x' \near x & i \near F, (~` i) x'.
move=> Ax; case/set_nbhsP : snAB => C [oC AC CB].
have [] := @compact_regular x _ hT cptV _ C; first exact: AK.
by rewrite nbhsE /=; exists C => //; split => //; exact: AC.
move=> D /nbhs_interior nD cDC.
have snBD : filter_from (set_nbhs (~` B)) closure (closure (~` closure D)).
exists (closure (~` closure D)) => [z|].
move=> nBZ; apply: filterS; first exact: subset_closure.
apply: open_nbhs_nbhs; split; first exact/closed_openC/closed_closure.
exact/(subsetC _ nBZ)/(subset_trans cDC).
by have := @closed_closure _ (~` closure D); rewrite closure_id => <-.
near=> y U => /=; have Dy : D^° y by exact: (near nD _).
have UclD : U `<=` closure (~` closure D).
exact: (near (small_set_sub snBD) U).
move=> Uy; have [z [/= + Dz]] := UclD _ Uy _ Dy.
by apply; exact: subset_closure.
case/(_ _ _ _ _ cvP) : cvA => R /= [RA Rmono [U RU] RBx].
have [V /set_nbhsP [W [oW cBW WV] clVU]] := RA _ RU; exists (~` W).
apply/set_nbhsP; exists (~` closure W); split.
- exact/closed_openC/closed_closure.
- by move=> y /(RBx _ RU) + Wy; apply; exact/clVU/(closure_subset WV).
- by apply: subsetC; exact/subset_closure.
have : closed (~` W) by exact: open_closedC.
by rewrite closure_id => <-; exact: subsetCl.
Unshelve. all: by end_near. Qed.

Lemma compact_normal : hausdorff_space T -> compact [set: T] -> normal_space.
Proof.
move=> ? /compact_normal_local + A clA; apply => //.
by move=> z ?; exact: filterT.
Qed.

End set_separations.

Arguments normal_space : clear implicits.
Expand Down
Loading