@@ -13,9 +13,10 @@ From mathcomp Require Import num_topology product_topology separation_axioms.
1313(* *)
1414(* ``` *)
1515(* metricType K == metric structure with distance mdist *)
16- (* The mixin is defined by extending PseudoMetric. *)
1716(* The HB class is Metric. *)
1817(* R^o with R : numFieldType is shown to be a metric space. *)
18+ (* The mixin PseudoMetric_isMetric extends PseudoMetric. *)
19+ (* The factor isMetric just requires a distance. *)
1920(* ``` *)
2021(***************************************************************************** *)
2122
@@ -29,7 +30,7 @@ Import numFieldTopology.Exports.
2930Local Open Scope classical_set_scope.
3031Local Open Scope ring_scope.
3132
32- HB.mixin Record isMetric (K : numDomainType) M of PseudoMetric K M := {
33+ HB.mixin Record PseudoMetric_isMetric (K : numDomainType) M of PseudoMetric K M := {
3334 mdist : M -> M -> K ;
3435 mdist_ge0 : forall x y, 0 <= mdist x y ;
3536 mdist_positivity : forall x y, mdist x y = 0 -> x = y;
@@ -38,7 +39,7 @@ HB.mixin Record isMetric (K : numDomainType) M of PseudoMetric K M := {
3839
3940#[short(type="metricType")]
4041HB.structure Definition Metric (K : numDomainType) :=
41- { M of PseudoMetric K M & isMetric K M }.
42+ { M of PseudoMetric K M & PseudoMetric_isMetric K M }.
4243
4344Section metric_lemmas.
4445Context {R : realFieldType} (T : metricType R).
8990
9091End metric_lemmas.
9192
93+ HB.factory Record isMetric (K : numFieldType) (M : Type ) of Choice M := {
94+ mdist : M -> M -> K ;
95+ mdistxx : forall x, mdist x x = 0 ;
96+ mdist_positivity : forall x y, mdist x y = 0 -> x = y ;
97+ mdist_sym : forall x y, mdist x y = mdist y x ;
98+ mdist_triangle : forall y x z, mdist x z <= mdist x y + mdist y z
99+ }.
100+
101+ HB.builders Context K M of isMetric K M.
102+
103+ Let ball (x : M) e : set M := [set y | mdist x y < e].
104+
105+ Let ent : set_system (M * M) := entourage_ ball.
106+
107+ Let nbhs (x : M) : set_system M := nbhs_ ent x.
108+
109+ Let nbhsE : nbhs = nbhs_ ent. Proof . by []. Qed .
110+
111+ HB.instance Definition _ := hasNbhs.Build M nbhs.
112+
113+ Let ball_center x (e : K) : 0 < e -> ball x e x.
114+ Proof . by move=> e0; rewrite /ball/= mdistxx. Qed .
115+
116+ Let ball_sym x y (e : K) : ball x e y -> ball y e x.
117+ Proof . by rewrite /ball/= mdist_sym. Qed .
118+
119+ Let ball_triangle x y z e1 e2 : ball x e1 y -> ball y e2 z ->
120+ ball x (e1 + e2) z.
121+ Proof .
122+ by rewrite /ball/= => ? ?; rewrite (le_lt_trans (mdist_triangle y _ _))// ltrD.
123+ Qed .
124+
125+ Let entourageE : ent = entourage_ ball. Proof . by []. Qed .
126+
127+ HB.instance Definition _ := @Nbhs_isPseudoMetric.Build K M
128+ ent nbhsE ball ball_center ball_sym ball_triangle entourageE.
129+
130+ Let mdist_ge0 x y : 0 <= mdist x y.
131+ Proof .
132+ rewrite -(@pmulrn_lge0 _ _ 2)// -(mdistxx x).
133+ by rewrite (le_trans (mdist_triangle y _ _))// mdist_sym -mulr2n.
134+ Qed .
135+
136+ Let ballEmdist x d : ball x d = [set y | mdist x y < d]. Proof . by []. Qed .
137+
138+ HB.instance Definition _ := PseudoMetric_isMetric.Build K M
139+ mdist_ge0 mdist_positivity ballEmdist.
140+
141+ HB.end .
142+
92143Section numFieldType_metric.
93144Context {R : numFieldType}.
94145Implicit Type x y : R.
@@ -105,7 +156,7 @@ Let ballEmdist x d : ball x d = [set y | dist x y < d].
105156Proof . by apply/seteqP; split => [|]/= A; rewrite /ball/= distrC. Qed .
106157
107158HB.instance Definition _ :=
108- @isMetric .Build R R^o dist dist_ge0 dist_positivity ballEmdist.
159+ @PseudoMetric_isMetric .Build R R^o dist dist_ge0 dist_positivity ballEmdist.
109160
110161End numFieldType_metric.
111162
0 commit comments