Module mathcomp.analysis.topology_theory.initial_topology
From HB Require Import structures.From mathcomp Require Import boot order algebra all_classical.
#[warning="-warn-library-file-internal-analysis"]
From mathcomp Require Import unstable.
From mathcomp Require Import interval_inference reals topology_structure.
From mathcomp Require Import uniform_structure order_topology.
From mathcomp Require Import pseudometric_structure.
# Initial topology
This file defines the initial topology for $S$ by a function $f$ whose
domain is $S$. This topology is also known as initial topology on $S$ with
respect to $f$.
NB: Before version 1.16.0, the initial topology was called the weak
topology. Though in some literature (e.g., Wilansky) it can be called that
way, we reserve "weak topology" for the topology induced on a topological
vector space by its dual.
```
initial_topology f == initial topology by a function f : S -> T
on S
S must be a choiceType and T a
topologicalType.
sub_initial_topology V S U == sub-initial topology generated by the
\val : U -> V
U has type subChoiceType S with S : pred V.
This is a subTopologicalType when V is
endowed with a topology.
This is a subConvexTvsType when V is
endowed with a convexTvsType (and when U is
subLmodType).
```
`initial_topology` is equipped with the structures of:
- uniform space
- pseudometric space (the metric space for initial topologies)
Import Order.TTheory GRing.Theory Num.Theory.
Unset SsrOldRewriteGoalsOrder.
Set Implicit Arguments.
Unset Strict Implicit.
Unset Printing Implicit Defensive.
Local Open Scope classical_set_scope.
Local Open Scope ring_scope.
Definition
initial_topology
Source code
{ : Type} { : Type}discrete_topology : Type -> Type discrete_topology is not universe polymorphic Arguments discrete_topology T%_type_scope discrete_topology is transparent Expands to: Constant mathcomp.analysis.topology_theory.discrete_topology.discrete_topology Declared in library mathcomp.analysis.topology_theory.discrete_topology, line 183, characters 11-28
Source code
( : S -> T) : Type := S.
Section Initial_Topology.
Variable ( : choiceType) ( : topologicalType) ( : S -> T).
Local Notation := (initial_topology f).
Definition
initial_open
Source code
:= [set f @^-1` A | in open].Source code
Let
initial_opT
Source code
: initial_open [set: W].Source code
Let
initial_opI
Source code
: setI_closed initial_open.Source code
Let
initial_op_bigU
Source code
( : Type) ( : I -> set W) :Source code
(forall , initial_open (g i)) -> initial_open (\bigcup_ g i).
Proof.
move=> gop.
set opi := fun => [set | open Ui /\ g i = f @^-1` Ui].
exists (\bigcup_ get (opi i)).
apply: bigcup_open => i.
by have /getPex [] : exists , opi i U by have [U] := gop i; exists U.
have g_preim i : g i = f @^-1` (get (opi i)).
by have /getPex [] : exists , opi i U by have [U] := gop i; exists U.
rewrite predeqE => s; split=> [[i _]|[i _]]; last by rewrite g_preim; exists i.
by rewrite -[_ _]/((f @^-1` _) _) -g_preim; exists i.
Qed.
set opi := fun => [set | open Ui /\ g i = f @^-1` Ui].
exists (\bigcup_ get (opi i)).
apply: bigcup_open => i.
by have /getPex [] : exists , opi i U by have [U] := gop i; exists U.
have g_preim i : g i = f @^-1` (get (opi i)).
by have /getPex [] : exists , opi i U by have [U] := gop i; exists U.
rewrite predeqE => s; split=> [[i _]|[i _]]; last by rewrite g_preim; exists i.
by rewrite -[_ _]/((f @^-1` _) _) -g_preim; exists i.
Qed.
.
instance
Source code
Source code
Definition
Source code
Source code
Choice
Source code
.on W.Source code
.
instance
Source code
Source code
Definition
Source code
Source code
isOpenTopological.Build W initial_opT initial_opI initial_op_bigU.
Lemma
initial_continuous
Source code
: continuous (f : W -> T).Source code
Proof.
Lemma
cvg_image
Source code
( : set_system S) ( : S) :Source code
Filter F -> f @` setT = setT ->
F --> (s : W) <-> ([set f @` A | in F] : set_system _) --> f s.
Proof.
move=> FF fsurj; split=> [cvFs|cvfFfs].
move=> A /initial_continuous [B [Bop Bs sBAf]].
have /cvFs FB : nbhs (s : W) B by apply: open_nbhs_nbhs.
rewrite nbhs_simpl; exists (f @^-1` A); first exact: filterS FB.
exact: image_preimage.
move=> A /= [_ [[B Bop <-] Bfs sBfA]].
have /cvfFfs [C FC fCeB] : nbhs (f s) B by rewrite nbhsE; exists B.
rewrite nbhs_filterE; apply: filterS FC.
by apply: subset_trans sBfA; rewrite -fCeB; apply: preimage_image.
Qed.
move=> A /initial_continuous [B [Bop Bs sBAf]].
have /cvFs FB : nbhs (s : W) B by apply: open_nbhs_nbhs.
rewrite nbhs_simpl; exists (f @^-1` A); first exact: filterS FB.
exact: image_preimage.
move=> A /= [_ [[B Bop <-] Bfs sBfA]].
have /cvfFfs [C FC fCeB] : nbhs (f s) B by rewrite nbhsE; exists B.
rewrite nbhs_filterE; apply: filterS FC.
by apply: subset_trans sBfA; rewrite -fCeB; apply: preimage_image.
Qed.
End Initial_Topology.
.
instance
Source code
Source code
Definition
Source code
(Source code
pointedType
Source code
) (T : topologicalType) (f : S -> T) :=Source code
Pointed.on (initial_topology f).
Definition
sub_initial_topology
Source code
( : Type) ( : pred V) ( : subChoiceType S)Source code
: Type := initial_topology (\val : U -> V).
Section SubType_isSubTopological.
Context ( : topologicalType) ( : pred V) ( : subChoiceType S).
Local Notation := (sub_initial_topology U).
.
instance
Source code
Source code
Definition
Source code
Source code
SubChoice
Source code
.on T.Source code
.
instance
Source code
Source code
Definition
Source code
Source code
Nbhs
Source code
.on T.Source code
.
instance
Source code
Source code
Definition
Source code
Source code
Topological
Source code
.on T.Source code
Let
top_continuous_valE
Source code
: continuous (val : T -> V).Source code
Proof.
.
instance
Source code
Source code
Definition
Source code
Source code
@isSubNbhs
Source code
.Build V S T top_continuous_valE.Source code
End SubType_isSubTopological.
Section initial_uniform.
Local Open Scope relation_scope.
Variable ( : choiceType) ( : uniformType) ( : pS -> U).
Let := initial_topology f.
Definition
initial_ent
Source code
: set_system (S * S) :=Source code
filter_from (@entourage U) (fun => (map_pair f)@^-1` V).
Let
initial_ent_filter
Source code
: Filter initial_ent.Source code
Proof.
apply: filter_from_filter; first by exists setT; exact: entourageT.
by move=> P Q ??; (exists (P `&` Q); first exact: filterI) => ?.
Qed.
by move=> P Q ??; (exists (P `&` Q); first exact: filterI) => ?.
Qed.
Let
initial_ent_refl
Source code
: initial_ent A -> diagonal `<=` A.Source code
Proof.
Let
initial_ent_inv
Source code
: initial_ent A -> initial_ent A^-1.Source code
Proof.
Let
initial_ent_split
Source code
: initial_ent A -> exists2 , initial_ent B & B \; B `<=` A.Source code
Proof.
Let
initial_ent_nbhs
Source code
: nbhs = nbhs_ initial_ent.Source code
Proof.
rewrite predeq2E => x V; split.
case=> [? [[B ? <-] ? BsubV]]; have: nbhs (f x) B by apply: open_nbhs_nbhs.
move=> /nbhsP [W ? WsubB]; exists ((map_pair f) @^-1` W); first by exists W.
by move=> ? ?; exact/BsubV/WsubB.
case=> W [V' entV' V'subW] /filterS; apply.
have : nbhs (f x) (xsection V' (f x)) by apply/nbhsP; exists V'.
rewrite (@nbhsE U) => [[O [openU Ofx Osub]]].
(exists (f @^-1` O); repeat split => //); first by exists O => //.
by move=> w ?; apply/mem_set; apply: V'subW; apply/set_mem; exact: Osub.
Qed.
case=> [? [[B ? <-] ? BsubV]]; have: nbhs (f x) B by apply: open_nbhs_nbhs.
move=> /nbhsP [W ? WsubB]; exists ((map_pair f) @^-1` W); first by exists W.
by move=> ? ?; exact/BsubV/WsubB.
case=> W [V' entV' V'subW] /filterS; apply.
have : nbhs (f x) (xsection V' (f x)) by apply/nbhsP; exists V'.
rewrite (@nbhsE U) => [[O [openU Ofx Osub]]].
(exists (f @^-1` O); repeat split => //); first by exists O => //.
by move=> w ?; apply/mem_set; apply: V'subW; apply/set_mem; exact: Osub.
Qed.
.
instance
Source code
Source code
Definition
Source code
Source code
@Nbhs_isUniform
Source code
.Build (initial_topology f)Source code
initial_ent initial_ent_filter initial_ent_refl initial_ent_inv
initial_ent_split initial_ent_nbhs.
End initial_uniform.
.
instance
Source code
Source code
Definition
Source code
(Source code
pointedType
Source code
) (U : uniformType) (f : pS -> U) :=Source code
Pointed.on (initial_topology f).
Section initial_pseudoMetric.
Context { : realType} ( : choiceType) ( : pseudoMetricType R) .
Variable ( : pS -> U).
Notation := (initial_topology f).
Definition
initial_ball
Source code
( : S) ( : R) ( : S) := ball (f x) r (f y).Source code
Let
initial_pseudo_metric_ball_center
Source code
( : S) ( : R) : 0 < e ->Source code
initial_ball x e x.
Proof.
Let
initial_pseudo_metric_entourageE
Source code
: entourage = entourage_ initial_ball.Source code
Proof.
rewrite /entourage /= /initial_ent -entourage_ballE /entourage_.
have -> : (fun => [set | ball (f xy.1) e (f xy.2)]) =
(preimage (map_pair f) \o fun => [set | ball xy.1 e xy.2])%FUN.
by [].
rewrite eqEsubset; split; apply/filter_fromP.
- apply: filter_from_filter; first by exists 1 => /=.
move=> e1 e2 e1pos e2pos; wlog e1lee2 : e1 e2 e1pos e2pos / e1 <= e2.
by have [?|/ltW ?] := lerP e1 e2; [exact | rewrite setIC; exact].
exists e1 => //; rewrite -preimage_setI; apply: preimage_subset.
by move=> ? ?; split => //; apply: le_ball; first exact: e1lee2.
- by move=> E [e ?] heE; exists e => //; apply: preimage_subset.
- apply: filter_from_filter.
by exists [set | ball xy.1 1 xy.2]; exists 1 => /=.
move=> E1 E2 [e1 e1pos he1E1] [e2 e2pos he2E2].
wlog ? : E1 E2 e1 e2 e1pos e2pos he1E1 he2E2 / e1 <= e2.
have [? /(_ _ _ e1 e2)|/ltW ? ] := lerP e1 e2; first exact.
by rewrite setIC => /(_ _ _ e2 e1); exact.
exists (E1 `&` E2) => //; exists e1 => // xy /= B; split; first exact: he1E1.
by apply/he2E2/le_ball; last exact: B.
- by move=> e ?; exists [set | ball xy.1 e xy.2] => //; exists e => /=.
Qed.
have -> : (fun => [set | ball (f xy.1) e (f xy.2)]) =
(preimage (map_pair f) \o fun => [set | ball xy.1 e xy.2])%FUN.
by [].
rewrite eqEsubset; split; apply/filter_fromP.
- apply: filter_from_filter; first by exists 1 => /=.
move=> e1 e2 e1pos e2pos; wlog e1lee2 : e1 e2 e1pos e2pos / e1 <= e2.
by have [?|/ltW ?] := lerP e1 e2; [exact | rewrite setIC; exact].
exists e1 => //; rewrite -preimage_setI; apply: preimage_subset.
by move=> ? ?; split => //; apply: le_ball; first exact: e1lee2.
- by move=> E [e ?] heE; exists e => //; apply: preimage_subset.
- apply: filter_from_filter.
by exists [set | ball xy.1 1 xy.2]; exists 1 => /=.
move=> E1 E2 [e1 e1pos he1E1] [e2 e2pos he2E2].
wlog ? : E1 E2 e1 e2 e1pos e2pos he1E1 he2E2 / e1 <= e2.
have [? /(_ _ _ e1 e2)|/ltW ? ] := lerP e1 e2; first exact.
by rewrite setIC => /(_ _ _ e2 e1); exact.
exists (E1 `&` E2) => //; exists e1 => // xy /= B; split; first exact: he1E1.
by apply/he2E2/le_ball; last exact: B.
- by move=> e ?; exists [set | ball xy.1 e xy.2] => //; exists e => /=.
Qed.
.
instance
Source code
Source code
Definition
Source code
Source code
Uniform_isPseudoMetric
Source code
.Build R SSource code
initial_pseudo_metric_ball_center (fun _ _ _ => @ball_sym _ _ _ _ _)
(fun _ _ _ _ _ => @ball_triangle _ _ _ _ _ _ _)
initial_pseudo_metric_entourageE.
Lemma
initial_ballE
Source code
( : R) ( : S) : f @^-1` (ball (f x) e) = ball x e.Source code
Proof.
by []. Qed.
End initial_pseudoMetric.
for an orderedTopologicalType T, and subtype U
(order_topology (sub_type U)) `<=` (initial_topology (sub_type U))
but generally the topologies are not equal!
Consider `
Section initial_order_refine.0,1[ | {2}` as a subset of `[0,3]` for an example
Context {} { : orderTopologicalType d} { : subType X}.
Let
OrdU
Source code
: orderTopologicalType d := order_topology (sub_type Y).Source code
Let
InitialU
Source code
: topologicalType := @initial_topology (sub_type Y) X val.Source code
Lemma
open_order_initial
Source code
( : set Y) : @open OrdU U -> @open InitialU U.Source code
Proof.
rewrite ?openE /= /interior => + x Ux => /(_ x Ux); rewrite itv_nbhsE /=.
move=> [][][[]l|[]] [[]r|[]][]//= _ xlr /filterS; apply.
- exists `]l, r[%classic; split => //=; exists `]\val l, \val r[%classic.
exact: itv_open.
by rewrite eqEsubset; split => z; rewrite preimage_itv.
- exists `]l, +oo[%classic; split => //=; exists `]\val l, +oo[%classic.
exact: rray_open.
by rewrite eqEsubset; split => z; rewrite preimage_itv.
- exists `]-oo, r[%classic; split => //=; exists `]-oo, \val r[%classic.
exact: lray_open.
by rewrite eqEsubset; split => z; rewrite preimage_itv.
- by rewrite set_itvE; exact: filterT.
Qed.
move=> [][][[]l|[]] [[]r|[]][]//= _ xlr /filterS; apply.
- exists `]l, r[%classic; split => //=; exists `]\val l, \val r[%classic.
exact: itv_open.
by rewrite eqEsubset; split => z; rewrite preimage_itv.
- exists `]l, +oo[%classic; split => //=; exists `]\val l, +oo[%classic.
exact: rray_open.
by rewrite eqEsubset; split => z; rewrite preimage_itv.
- exists `]-oo, r[%classic; split => //=; exists `]-oo, \val r[%classic.
exact: lray_open.
by rewrite eqEsubset; split => z; rewrite preimage_itv.
- by rewrite set_itvE; exact: filterT.
Qed.
End initial_order_refine.
Lemma
continuous_comp_initial
Source code
{ : choiceType} { : topologicalType}Source code
( : Y -> Z) ( : X -> initial_topology w) :
continuous (w \o f) -> continuous f.