Module mathcomp.analysis.topology_theory.pseudometric_structure
From HB Require Import structures.From mathcomp Require Import boot order algebra all_classical.
From mathcomp Require Import interval_inference reals topology_structure.
From mathcomp Require Import uniform_structure.
# PseudoMetric Spaces
This file provides pseudometric spaces, complete pseudometric spaces,
and the corresponding theory. Note that a classic metric space is simply
pseudometric + hausdorff. However we will make extensive use of the
non-hausdorff case, such as in our proof of Urysohn's lemma.
## Mathematical structures
### PseudoMetrics
```
entourage_ ball == entourages defined using balls
pseudoMetricType == interface type for pseudo metric space
structure: a type equipped with balls
The HB class is PseudoMetric.
pseudoPMetricType == a pointed pseudoMetric space
ball x e == ball of center x and radius e
nbhs_ball_ ball == nbhs defined using the given balls
nbhs_ball == nbhs defined using balls in a
pseudometric space
```
### Factories
```
Nbhs_isPseudoMetric == factory to build a topological space
from a mixin for a pseudoMetric space
```
### Complete Pseudometrics
```
ball_ N == balls defined by the norm/absolute
value N
completePseudoMetricType == interface type for a complete
pseudometric space structure
The HB class is CompletePseudoMetric.
cauchy_ex F <-> the set of sets F is a cauchy filter
(epsilon-delta definition)
cauchy_ball F <-> the set of sets F is a cauchy filter
(using the near notations)
```
Import Order.TTheory GRing.Theory Num.Theory.
Unset SsrOldRewriteGoalsOrder.
Set Implicit Arguments.
Unset Strict Implicit.
Unset Printing Implicit Defensive.
#[local]
Obligation Tactic := idtac.
Local Open Scope classical_set_scope.
Local Open Scope ring_scope.
Definition
entourage_
Source code
{ : numDomainType} { } (Source code
ball
Source code
: T -> R -> set T') :=Source code
@filter_from R _ [set | 0 < x] (fun => [set | ball xy.1 e xy.2]).
Lemma
entourage_E
Source code
{ : numDomainType} { } (Source code
ball
Source code
: T -> R -> set T') :Source code
entourage_ ball =
@filter_from R _ [set | 0 < x] (fun => [set | ball xy.1 e xy.2]).
Proof.
by []. Qed.
.
mixin
Source code
Source code
Record
Source code
Source code
Uniform_isPseudoMetric
Source code
(Source code
numDomainType
Source code
) M & Uniform M := {Source code
ball : M -> R -> M -> Prop ;
ball_center_subproof : forall ( : R), 0 < e -> ball x e x ;
ball_sym_subproof : forall ( : R), ball x e y -> ball y e x ;
ball_triangle_subproof :
forall , ball x e1 y -> ball y e2 z -> ball x (e1 + e2) z;
entourageE_subproof : entourage = entourage_ ball
}.
#[short
Source code
(Source code
type=
Source code
Source code
"pseudoMetricType"
Source code
)Source code
.
structure
Source code
Source code
Definition
Source code
Source code
PseudoMetric
Source code
(Source code
numDomainType
Source code
) :=Source code
{ of Uniform T & Uniform_isPseudoMetric R T}.
#[short
Source code
(Source code
type=
Source code
Source code
"pseudoPMetricType"
Source code
)Source code
.
structure
Source code
Source code
Definition
Source code
Source code
PseudoPointedMetric
Source code
(Source code
numDomainType
Source code
) :=Source code
{ of Pointed T & Uniform T & Uniform_isPseudoMetric R T}.
.
factory
Source code
Source code
Record
Source code
Source code
Nbhs_isPseudoMetric
Source code
(Source code
numFieldType
Source code
) M & Nbhs M := {Source code
ent : set_system (M * M);
nbhsE : nbhs = nbhs_ ent;
ball : M -> R -> M -> Prop ;
ball_center : forall ( : R), 0 < e -> ball x e x ;
ball_sym : forall ( : R), ball x e y -> ball y e x ;
ball_triangle :
forall , ball x e1 y -> ball y e2 z -> ball x (e1 + e2) z;
entourageE : ent = entourage_ ball
}.
.
builders
Source code
Source code
Context
Source code
Source code
Nbhs_isPseudoMetric
Source code
R M.Source code
Local Open Scope relation_scope.
Let
ball_le
Source code
: {homo ball x : / e1 <= e2 >-> e1 `<=` e2}.Source code
Proof.
move=> e1 e2 le12 y xe1_y.
move: le12; rewrite le_eqVlt => /orP [/eqP <- //|].
rewrite -subr_gt0 => lt12.
rewrite -[e2](subrK e1); apply: ball_triangle xe1_y.
suff : ball x (PosNum lt12)%:num x by [].
exact: ball_center.
Qed.
move: le12; rewrite le_eqVlt => /orP [/eqP <- //|].
rewrite -subr_gt0 => lt12.
rewrite -[e2](subrK e1); apply: ball_triangle xe1_y.
suff : ball x (PosNum lt12)%:num x by [].
exact: ball_center.
Qed.
Let
entourage_filter_subproof
Source code
: Filter ent.Source code
Proof.
Let
ball_sym_subproof
Source code
: ent A -> diagonal `<=` A.Source code
Proof.
rewrite entourageE; move=> [e egt0 sbeA] xy xey.
by apply: sbeA; rewrite /= xey; exact: ball_center.
Qed.
by apply: sbeA; rewrite /= xey; exact: ball_center.
Qed.
Let
ball_triangle_subproof
Source code
: ent A -> ent A^-1.Source code
Proof.
Let
entourageE_subproof
Source code
: ent A -> exists2 , ent B & B \; B `<=` A.Source code
Proof.
.
instance
Source code
Source code
Definition
Source code
Source code
Nbhs_isUniform
Source code
.Build MSource code
entourage_filter_subproof ball_sym_subproof ball_triangle_subproof
entourageE_subproof nbhsE.
.
instance
Source code
Source code
Definition
Source code
Source code
Uniform_isPseudoMetric
Source code
.Build R MSource code
ball_center ball_sym ball_triangle entourageE.
.
end
Source code
.Source code
Lemma
entourage_ballE
Source code
{ : numDomainType} { : pseudoMetricType R} :Source code
entourage_ (@ball R M) = entourage.
Proof.
Lemma
entourage_from_ballE
Source code
{ : numDomainType} { : pseudoMetricType R} :Source code
@filter_from R _ [set : R | 0 < x]
(fun => [set | @ball R M xy.1 e xy.2]) = entourage.
Proof.
Lemma
entourage_ball
Source code
{ : numDomainType} ( : pseudoMetricType R)Source code
( : {posnum R}) : entourage [set : M * M | ball xy.1 e%:num xy.2].
Proof.
Definition
nbhs_ball_
Source code
{ : numDomainType} { } (Source code
ball
Source code
: T -> R -> set T')Source code
( : T) := @filter_from R _ [set | e > 0] (ball x).
Definition
nbhs_ball
Source code
{ : numDomainType} { : pseudoMetricType R} :=Source code
nbhs_ball_ (@ball R M).
Lemma
nbhs_ballE
Source code
{ : numDomainType} { : pseudoMetricType R} :Source code
@nbhs_ball R M = nbhs.
Proof.
Lemma
filter_from_ballE
Source code
{ : numDomainType} { : pseudoMetricType R} :Source code
@filter_from R _ [set : R | 0 < x] (@ball R M x) = nbhs x.
Proof.
Module Export
NbhsBall
Source code
.Source code
Definition
nbhs_simpl
Source code
:= (nbhs_simpl,@filter_from_ballE,@nbhs_ballE).Source code
End NbhsBall.
Lemma
nbhs_ballP
Source code
{ : numDomainType} { : pseudoMetricType R} ( : M) :Source code
nbhs x P <-> nbhs_ball x P.
Proof.
Lemma
ball_center
Source code
{ : numDomainType} ( : pseudoMetricType R) ( : M)Source code
( : {posnum R}) : ball x e%:num x.
Proof.
Section pseudoMetricType_numDomainType.
Context { : numDomainType} { : pseudoMetricType R}.
Implicit Types x y z : M.
Lemma
ballxx
Source code
( : R) : 0 < e -> ball x e x.Source code
Proof.
Lemma
ball_sym
Source code
( : R) : ball x e y -> ball y e x.Source code
Proof.
Lemma
ball_symE
Source code
( : R) : ball x e y = ball y e x.Source code
Lemma
ball_triangle
Source code
( : R) :Source code
ball x e1 y -> ball y e2 z -> ball x (e1 + e2) z.
Proof.
Lemma
nbhsx_ballx
Source code
(Source code
eps
Source code
: R) : 0 < eps -> nbhs x (ball x eps).Source code
Proof.
Lemma
open_nbhs_ball
Source code
(Source code
eps
Source code
: {posnum R}) : open_nbhs x (ball x eps%:num)°.Source code
Proof.
split; first exact: open_interior.
by apply: nbhs_singleton; apply: nbhs_interior; exact: nbhsx_ballx.
Qed.
by apply: nbhs_singleton; apply: nbhs_interior; exact: nbhsx_ballx.
Qed.
Lemma
le_ball
Source code
( : R) : e1 <= e2 -> ball x e1 `<=` ball x e2.Source code
Proof.
move=> le12 y. case: comparableP le12 => [lte12 _|//|//|->//].
by rewrite -[e2](subrK e1); apply/ball_triangle/ballxx; rewrite subr_gt0.
Qed.
by rewrite -[e2](subrK e1); apply/ball_triangle/ballxx; rewrite subr_gt0.
Qed.
Lemma
near_ball
Source code
(Source code
eps
Source code
: R) : 0 < eps -> \forall \near y, ball y eps y'.Source code
Proof.
Lemma
dnbhs_ball
Source code
( : R) : (0 < e)%R -> x^' (ball x e `\ x).Source code
Proof.
Lemma
fcvg_ballP
Source code
{} { : Filter F} ( : M) :Source code
F --> y <-> forall
eps
Source code
: R, 0 < eps -> \forall \near F, ball y eps y'.Source code
Proof.
Lemma
fcvg_ball
Source code
{} { : Filter F} ( : M) :Source code
F --> y -> forall
eps
Source code
: R, 0 < eps -> \forall \near F, ball y eps y'.Source code
Proof.
Lemma
cvg_ballP
Source code
{} {} { : Filter F} ( : T -> M) :Source code
f @ F --> y <-> forall
eps
Source code
: R, 0 < eps -> \forall \near F, ball y eps (f x).Source code
Proof.
Lemma
cvg_ball
Source code
{} {} { : Filter F} ( : T -> M) :Source code
f @ F --> y -> forall
eps
Source code
: R, 0 < eps -> \forall \near F, ball y eps (f x).Source code
Proof.
Lemma
cvgi_ballP
Source code
{} { : Filter F} ( : T -> M -> Prop) :Source code
f `@ F --> y <->
forall
eps
Source code
: R, 0 < eps -> \forall \near F, exists , f x z /\ ball y eps z.Source code
Proof.
split=> [Fy _/posnumP[eps] |Fy P] /=; first exact/Fy/nbhsx_ballx.
move=> /nbhs_ballP[_ /posnumP[eps] subP].
rewrite near_simpl near_mapi; near=> x.
have [//|z [fxz yz]] := near (Fy _ (gt0 eps)) x.
by exists z => //; split => //; apply: subP.
Unshelve. all: end_near. Qed.
move=> /nbhs_ballP[_ /posnumP[eps] subP].
rewrite near_simpl near_mapi; near=> x.
have [//|z [fxz yz]] := near (Fy _ (gt0 eps)) x.
by exists z => //; split => //; apply: subP.
Unshelve. all: end_near. Qed.
Lemma
cvgi_ball
Source code
{} { : Filter F} ( : T -> M -> Prop) :Source code
f `@ F --> y ->
forall
eps
Source code
: R, 0 < eps -> F [set | exists , f x z /\ ball y eps z].Source code
Proof.
End pseudoMetricType_numDomainType.
#[global] Hint Resolve nbhsx_ballx : core.
Global Instance
entourage_proper_filter
Source code
{ : numDomainType}Source code
{ : pseudoPMetricType R} : ProperFilter (@entourage M).
Proof.
apply: Build_ProperFilter_ex; rewrite -entourage_ballE => A [_/posnumP[e] sbeA].
by exists (point, point); apply: sbeA; apply: ballxx.
Qed.
by exists (point, point); apply: sbeA; apply: ballxx.
Qed.
Arguments nbhsx_ballx {R M} x eps.
Arguments near_ball {R M} y eps.
Section pseudoMetricType_numFieldType.
Context { : numFieldType} { : pseudoMetricType R}.
Lemma
ball_split
Source code
( : M) ( : R) :Source code
ball x (e / 2) z -> ball z (e / 2) y -> ball x e y.
Proof.
Lemma
ball_splitr
Source code
( : M) ( : R) :Source code
ball z (e / 2) x -> ball z (e / 2) y -> ball x e y.
Proof.
Lemma
ball_splitl
Source code
( : M) ( : R) :Source code
ball x (e / 2) z -> ball y (e / 2) z -> ball x e y.
Proof.
End pseudoMetricType_numFieldType.
Section entourages.
Variable : numDomainType.
Lemma
unif_continuousP
Source code
( : pseudoMetricType R) ( : U -> V) :Source code
unif_continuous f <->
forall , e > 0 -> exists2 , d > 0 &
forall , ball x.1 d x.2 -> ball (f x.1) e (f x.2).
Proof.
have fappF : Filter ((fun => (f xy.1, f xy.2)) @ entourage_ ball).
by rewrite entourage_ballE; apply: fmap_filter.
by rewrite /unif_continuous -!entourage_ballE filter_fromP.
Qed.
by rewrite entourage_ballE; apply: fmap_filter.
by rewrite /unif_continuous -!entourage_ballE filter_fromP.
Qed.
End entourages.
Lemma
countable_uniformity_metric
Source code
{ : realType} { : pseudoMetricType R} :Source code
countable_uniformity T.
Proof.
apply/countable_uniformityP.
exists (fun => [set : T * T | ball xy.1 n.+1%:R^-1 xy.2]); last first.
by move=> n; exact: (entourage_ball _ n.+1%:R^-1%:pos).
move=> E; rewrite -entourage_ballE => -[e e0 subE].
exists (Num.truncn e^-1); apply: subset_trans subE => xy; apply: le_ball.
by rewrite /= -[leRHS]invrK lef_pV2 ?posrE ?invr_gt0// ltW// truncnS_gt.
Qed.
exists (fun => [set : T * T | ball xy.1 n.+1%:R^-1 xy.2]); last first.
by move=> n; exact: (entourage_ball _ n.+1%:R^-1%:pos).
move=> E; rewrite -entourage_ballE => -[e e0 subE].
exists (Num.truncn e^-1); apply: subset_trans subE => xy; apply: le_ball.
by rewrite /= -[leRHS]invrK lef_pV2 ?posrE ?invr_gt0// ltW// truncnS_gt.
Qed.
Specific pseudoMetric spaces
.
instance
Source code
Source code
Definition
Source code
(Source code
zmodType
Source code
) := isPointed.Build R 0.Source code
Definition
ball_
Source code
Source code
( : numDomainType) ( : zmodType) (
norm
Source code
: V -> R) ( : V) ( : R) :=Source code
[set | norm (x - y) < e].
Arguments ball_ {R} {V} norm x e%_R y /.
Lemma
subset_ball_prop_in_itv
Source code
( : realDomainType) ( : R) :Source code
ball_ Num.Def.normr x e `<=` P <->
{in `](x - e), (x + e)[, forall , P y}.
Proof.
Lemma
subset_ball_prop_in_itvcc
Source code
( : realDomainType) ( : R) : 0 < e ->Source code
ball_ Num.Def.normr x (2 * e) `<=` P ->
{in `[(x - e), (x + e)], forall , P y}.
Proof.
move=> e_gt0 PP y; rewrite in_itv/= -ler_distlC => ye; apply: PP => /=.
by rewrite (le_lt_trans ye)// ltr_pMl// ltr1n.
Qed.
by rewrite (le_lt_trans ye)// ltr_pMl// ltr1n.
Qed.
Global Instance
ball_filter
Source code
( : realDomainType) ( : R) : FilterSource code
[set | exists2 : R, 0 < i & ball_ Num.norm t i `<=` P].
Proof.
apply: Build_Filter; [by exists 1 | move=> P Q | move=> P Q PQ]; rewrite /mkset.
- move=> -[x x0 xP] [y ? yQ]; exists (Num.min x y); first by rewrite lt_min x0.
move=> z tz; split.
by apply: xP; rewrite /= (lt_le_trans tz) // ge_min lexx.
by apply: yQ; rewrite /= (lt_le_trans tz) // ge_min lexx orbT.
- by move=> -[x ? xP]; exists x => //; apply: (subset_trans xP).
Qed.
- move=> -[x x0 xP] [y ? yQ]; exists (Num.min x y); first by rewrite lt_min x0.
move=> z tz; split.
by apply: xP; rewrite /= (lt_le_trans tz) // ge_min lexx.
by apply: yQ; rewrite /= (lt_le_trans tz) // ge_min lexx orbT.
- by move=> -[x ? xP]; exists x => //; apply: (subset_trans xP).
Qed.
#[global] Hint Extern 0 (Filter [set | exists2 , _ & ball_ _ _ i `<=` P]) =>
(apply: ball_filter) : typeclass_instances.
Section pseudoMetric_of_normedDomain.
Context { : numDomainType} { : normedZmodType K}.
Lemma
ball_norm_center
Source code
( : R) ( : K) : 0 < e -> ball_ Num.norm x e x.Source code
Lemma
ball_norm_symmetric
Source code
( : R) ( : K) :Source code
ball_ Num.norm x e y -> ball_ Num.norm y e x.
Proof.
Lemma
ball_norm_triangle
Source code
( : R) ( : K) :Source code
ball_ Num.norm x e1 y -> ball_ Num.norm y e2 z -> ball_ Num.norm x (e1 + e2) z.
Proof.
Lemma
nbhs_ball_normE
Source code
:Source code
@nbhs_ball_ K R R (ball_ Num.norm) = nbhs_ (entourage_ (ball_ Num.norm)).
Proof.
End pseudoMetric_of_normedDomain.
.
instance
Source code
Source code
Definition
Source code
(Source code
zmodType
Source code
) := Pointed.on R^o.Source code
#[short
Source code
(Source code
type=
Source code
Source code
"completePseudoMetricType"
Source code
)Source code
.
structure
Source code
Source code
Definition
Source code
Source code
CompletePseudoMetric
Source code
Source code
{ of Complete T & PseudoPointedMetric R T}.
Definition
cauchy_ex
Source code
{ : numDomainType} { : pseudoMetricType R}Source code
( : set_system T) :=
forall
eps
Source code
: R, 0 < eps -> exists , F (ball x eps).Source code
Definition
cauchy_ball
Source code
{ : numDomainType} { : pseudoMetricType R}mx_ent : forall (m n : nat) (T : uniformType), set_system ('M_(m, n) * 'M_(m, n)) mx_ent is not universe polymorphic Arguments mx_ent (m n)%_nat_scope T _ mx_ent is transparent Expands to: Constant mathcomp.analysis.topology_theory.matrix_topology.mx_ent Declared in library mathcomp.analysis.topology_theory.matrix_topology, line 66, characters 11-17
Source code
( : set_system T) :=
forall , e > 0 -> \forall & \near F, ball x e y.
Lemma
cauchy_ballP
Source code
( : numDomainType) ( : pseudoMetricType R)Source code
( : set_system T) ( : Filter F) :
cauchy_ball F <-> cauchy F.
Proof.
split=> cauchyF; last first.
by move=> _/posnumP[eps]; apply/cauchyF/entourage_ball.
move=> U; rewrite -entourage_ballE => - [_/posnumP[eps] xyepsU].
by near do apply: xyepsU; apply: cauchyF.
Unshelve. all: by end_near. Qed.
by move=> _/posnumP[eps]; apply/cauchyF/entourage_ball.
move=> U; rewrite -entourage_ballE => - [_/posnumP[eps] xyepsU].
by near do apply: xyepsU; apply: cauchyF.
Unshelve. all: by end_near. Qed.
Lemma
cauchy_exP
Source code
( : numFieldType) ( : pseudoMetricType R)Source code
( : set_system T) ( : Filter F) :
cauchy_ex F -> cauchy F.
Proof.
move=> Fc A; rewrite !nbhs_simpl /= -entourage_ballE => -[_/posnumP[e] sdeA].
have /Fc [z /= Fze] := [gt0 of e%:num / 2]; near=> x y; apply: sdeA => /=.
by apply: (@ball_splitr _ _ z); [near: x|near: y].
Unshelve. all: by end_near. Qed.
have /Fc [z /= Fze] := [gt0 of e%:num / 2]; near=> x y; apply: sdeA => /=.
by apply: (@ball_splitr _ _ z); [near: x|near: y].
Unshelve. all: by end_near. Qed.
Lemma
cauchyP
Source code
( : numFieldType) ( : pseudoMetricType R)Source code
( : set_system T) ( : ProperFilter F) :
cauchy F <-> cauchy_ex F.
Proof.
split=> [Fcauchy _/posnumP[e] |/cauchy_exP//].
near F => x; exists x; near: x; apply: (@nearP_dep _ _ F F).
exact/Fcauchy/entourage_ball.
Unshelve. all: by end_near. Qed.
near F => x; exists x; near: x; apply: (@nearP_dep _ _ F F).
exact/Fcauchy/entourage_ball.
Unshelve. all: by end_near. Qed.