Skip to content

Commit 4fc8ab6

Browse files
motikakut6s
authored andcommitted
add the statement of the Vedenissoff theorem and prove it
Co-authored-by: @garrigue
1 parent 19187b2 commit 4fc8ab6

File tree

2 files changed

+294
-8
lines changed

2 files changed

+294
-8
lines changed

theories/borel_hierarchy.v

Lines changed: 292 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,10 @@ Set Implicit Arguments.
1919
Unset Strict Implicit.
2020
Unset Printing Implicit Defensive.
2121

22-
Import Order.TTheory GRing.Theory Num.Theory.
22+
Import Order.TTheory GRing.Theory Num.Theory Num.Def.
2323
Import numFieldNormedType.Exports.
2424
Import numFieldTopology.Exports.
25+
Import exp.
2526

2627
Local Open Scope classical_set_scope.
2728
Local Open Scope ring_scope.
@@ -126,16 +127,301 @@ move/eqP.
126127
by rewrite eq_sym -subr_eq opprB subrKC eq_sym => /eqP.
127128
Qed.
128129

130+
Definition perfectly_normal_space' (x : R) :=
131+
forall E : set T, open E ->
132+
exists f : T -> R, continuous f /\ E = f @^-1` ~`[set x].
133+
129134
Definition perfectly_normal_space01 :=
130135
forall E F : set T, closed E -> closed F -> [disjoint E & F] ->
131-
exists f : T -> R, continuous f /\ E = f @^-1` [set 0] /\ F = f @^-1` [set 1]
132-
/\ f @` [set: T] = `[0, 1]%classic.
136+
exists f : T -> R,
137+
[/\ continuous f, E = f @^-1` [set 0], F = f @^-1` [set 1]
138+
& range f `<=` `[0, 1]%classic].
133139

134-
Definition perfectly_normal_space_G_delta :=
140+
Definition perfectly_normal_space_Gdelta :=
135141
normal_space T /\ forall E : set T, closed E -> Gdelta E.
136142

137-
Lemma perfectly_normal_space01P : perfectly_normal_space <-> perfectly_normal_space01.
143+
Lemma perfectly_normal_space01_normal :
144+
perfectly_normal_space01 -> normal_space T.
145+
Proof.
146+
move=> pns01.
147+
rewrite (@normal_separatorP R).
148+
move=> A B cA cB /eqP AB.
149+
apply/uniform_separatorP.
150+
have[f [] cf Af Bf f01] := pns01 _ _ cA cB AB.
151+
exists f.
152+
by split => //; rewrite (Af, Bf); exact:image_preimage_subset.
153+
Qed.
154+
155+
Lemma EFin_series (f : R^nat) : EFin \o series f = eseries (EFin \o f).
156+
Proof.
157+
apply/boolp.funext => n.
158+
rewrite /series /eseries /=.
159+
elim: n => [|n IH]; first by rewrite !big_geq.
160+
by rewrite !big_nat_recr //= EFinD IH.
161+
Qed.
162+
163+
Section f_n.
164+
Variable f_n : nat -> T -> R.
165+
Hypothesis cf_n : forall i, continuous (f_n i).
166+
Hypothesis f_n_ge0 : forall i y, 0 <= f_n i y.
167+
Hypothesis f_n_le1 : forall i y, f_n i y <= 1.
168+
Let f_sum := fun n : nat => \sum_(0 <= k < n) f_n k \* cst (2 ^- k.+1).
169+
170+
Local Lemma cf_sum n : continuous (f_sum n).
171+
Proof.
172+
rewrite /f_sum => x; elim: n => [|n IH].
173+
rewrite big_geq //; exact: cst_continuous.
174+
rewrite big_nat_recr //=; apply: continuousD => //.
175+
exact/continuousM/cst_continuous/cf_n.
176+
Qed.
177+
178+
Local Lemma f_sumE x n : f_sum n x = [series f_n k x / 2 ^+ k.+1]_k n.
179+
Proof. exact: (big_morph (@^~ x)). Qed.
180+
Local Definition f_sumE' x := boolp.funext (f_sumE x).
181+
182+
Let f x := limn (f_sum^~ x).
183+
184+
Local Lemma ndf_sum y : {homo f_sum^~ y : a b / (a <= b)%N >-> a <= b}.
185+
Proof.
186+
move=> a b ab.
187+
rewrite !f_sumE -subr_ge0 sub_series_geq // sumr_ge0 //= => i _.
188+
by rewrite mulr_ge0.
189+
Qed.
190+
191+
Local Lemma cvgn_f_sum y : cvgn (f_sum^~ y).
192+
Proof.
193+
apply: nondecreasing_is_cvgn; first exact: ndf_sum.
194+
exists 1 => z /= [m] _ <-.
195+
have -> : 1 = 2^-1 / (1 - 2^-1) :> R.
196+
rewrite -[LHS](@mulfV _ (2^-1)) //; congr (_ / _).
197+
by rewrite [X in X - _](splitr 1) mul1r addrK.
198+
rewrite f_sumE.
199+
apply: le_trans (geometric_le_lim m _ _ _) => //; last first.
200+
by rewrite ltr_norml (@lt_trans _ _ 0) //= invf_lt1 // ltr1n.
201+
rewrite ler_sum // => i _.
202+
by rewrite /geometric /= -exprS -exprVn ler_piMl.
203+
Qed.
204+
205+
Local Lemma f_sum_lim n y :
206+
f y = f_sum n y + limn (fun n' => \sum_(n <= k < n') f_n k y * 2^- k.+1).
207+
Proof.
208+
have Hcvg := cvgn_f_sum.
209+
have /= := nondecreasing_telescope_sumey n _ (ndf_sum y).
210+
rewrite EFin_lim //= fin_numE /= => /(_ isT).
211+
rewrite (eq_eseriesr (g:=fun i => ((f_n i \* cst (2 ^- i.+1)) y)%:E));
212+
last first.
213+
move => i _.
214+
rewrite /f_sum -EFinD big_nat_recr //=.
215+
by rewrite [X in X _ _ y]/GRing.add /= addrAC subrr add0r.
216+
move/(f_equal (fun x => (f_sum n y)%:E + x)).
217+
rewrite addrA addrAC -EFinB subrr add0r => H.
218+
apply: EFin_inj.
219+
rewrite -H EFinD; congr (_ + _).
220+
rewrite -EFin_lim.
221+
apply/congr_lim/boolp.funext => k /=.
222+
exact/esym/big_morph.
223+
by rewrite is_cvg_series_restrict -f_sumE'.
224+
Qed.
225+
226+
Local Lemma sum_f_n_oo n y :
227+
0 <= \big[+%R/0]_(n <= k <oo) (f_n k y / 2 ^+ k.+1) <= 2^-n.
228+
Proof.
229+
have Hcvg := @cvgn_f_sum y.
230+
apply/andP; split.
231+
have := nondecreasing_cvgn_le (ndf_sum y) Hcvg n.
232+
by rewrite [limn _](f_sum_lim n) lerDl.
233+
have H2n : 0 <= 2^-n :> R by rewrite -exprVn exprn_ge0.
234+
rewrite -lee_fin.
235+
apply: le_trans (epsilon_trick0 xpredT H2n).
236+
rewrite -EFin_lim; last by rewrite is_cvg_series_restrict -f_sumE'.
237+
under [EFin \o _]boolp.funext do
238+
rewrite /= (big_morph EFin (id1:=0) (op1:=GRing.add)) //.
239+
rewrite -nneseries_addn; last by move=> i; rewrite lee_fin mulr_ge0.
240+
apply: lee_nneseries => i _.
241+
by rewrite lee_fin mulr_ge0.
242+
by rewrite lee_fin natrX -!exprVn -exprD addnS addnC ler_piMl.
243+
Qed.
244+
End f_n.
245+
246+
Local Lemma perfectly_normal_space_12 : perfectly_normal_space_Gdelta -> perfectly_normal_space 0.
247+
Proof.
248+
move=> pnsGd E cE.
249+
case: (pnsGd) => nT cEGdE.
250+
have[U oU HE]:= cEGdE E cE.
251+
have/boolp.choice[f_n Hn] n : exists f : T -> R,
252+
[/\ continuous f, range f `<=` `[0, 1], f @` E `<=` [set 0] & f @` (~` U n) `<=` [set 1]].
253+
apply /uniform_separatorP /normal_uniform_separator => //.
254+
- by rewrite closedC.
255+
- rewrite HE -subsets_disjoint.
256+
exact: bigcap_inf.
257+
have cf_n i : continuous (f_n i) by case: (Hn i).
258+
have f_n_ge0 i y : 0 <= f_n i y.
259+
case: (Hn i) => _ Hr _ _.
260+
have /Hr /= := imageT (f_n i) y.
261+
by rewrite in_itv /= => /andP[].
262+
have f_n_le1 i y : f_n i y <= 1.
263+
case: (Hn i) => _ Hr _ _.
264+
have /Hr /= := imageT (f_n i) y.
265+
by rewrite in_itv /= => /andP[].
266+
pose f_sum := fun n => \sum_(0 <= k < n) (f_n k \* cst (2^-k.+1)).
267+
have cf_sum := cf_sum cf_n.
268+
pose f x := limn (f_sum ^~ x).
269+
exists f.
270+
split.
271+
move=> x Nfx.
272+
rewrite -filter_from_ballE.
273+
case => eps /= eps0 HB.
274+
pose n := (2 + truncn (- ln eps / ln 2))%N.
275+
have Hf := f_sum_lim f_n_ge0 f_n_le1 n.
276+
have eps0' : eps / 2 > 0 by exact: divr_gt0.
277+
move/continuousP/(_ _ (ball_open (f_sum n x) eps0')) : (cf_sum n) => /= ofs.
278+
rewrite nbhs_filterE fmapE nbhsE /=.
279+
set B := _ @^-1` _ in ofs.
280+
exists B.
281+
split => //; exact: ballxx.
282+
apply: subset_trans (preimage_subset (f:=f) HB).
283+
rewrite /B /preimage /ball => t /=.
284+
move=> feps.
285+
rewrite /f !Hf opprD addrA (addrAC (f_sum n x)) -(addrA (_ - _)).
286+
apply: (le_lt_trans (ler_normD _ _)).
287+
rewrite (splitr eps).
288+
apply: ltr_leD => //.
289+
have Hfn0 x := proj1 (andP (sum_f_n_oo f_n_ge0 f_n_le1 n x)).
290+
have Hfn1 x := proj2 (andP (sum_f_n_oo f_n_ge0 f_n_le1 n x)).
291+
apply: (@le_trans _ _ (2^-n)).
292+
rewrite ler_norml !lerBDl (le_trans (Hfn1 t)) ?lerDl //=.
293+
by rewrite (le_trans (Hfn1 x)) // lerDr.
294+
rewrite /n -exprVn addSnnS exprD expr1 ler_pdivrMl //.
295+
rewrite mulrA (mulrC 2) mulfK // -(@lnK _ (2^-1)) ?posrE //.
296+
rewrite -expRM_natl -{2}(@lnK _ eps) // ler_expR lnV ?posrE //.
297+
rewrite -ler_ndivrMr ?posrE; last by rewrite oppr_lt0 ln_gt0 // ltr1n.
298+
by rewrite invrN mulrN mulNr ltW // truncnS_gt.
299+
apply/seteqP; split => x /= Hx.
300+
have Hcvg := cvgn_f_sum f_n_ge0 f_n_le1 (y:=x).
301+
apply: EFin_inj.
302+
rewrite -EFin_lim // f_sumE' EFin_series /= eseries0 // => i _ _ /=.
303+
case: (Hn i) => _ _ /(_ (f_n i x)) /= => ->.
304+
by rewrite mul0r.
305+
by exists x.
306+
apply: contraPP Hx.
307+
rewrite (_ : (~ E x) = setC E x) // HE setC_bigcap /= => -[] i _ HU.
308+
case: (Hn i) => _ _ _ /(_ (f_n i x)) /= => Hfix.
309+
rewrite /f => Hf.
310+
have Hcvg := cvgn_f_sum f_n_ge0 f_n_le1 (y:=x).
311+
have := nondecreasing_cvgn_le (ndf_sum f_n_ge0 x) Hcvg i.+1.
312+
have := ndf_sum f_n_ge0 x (leq0n i.+1).
313+
rewrite Hf big_geq // => /[swap] fi_le0.
314+
rewrite le0r ltNge fi_le0 orbF.
315+
rewrite big_nat_recr //= [X in X _ _ x]/GRing.add /= -/(f_sum i).
316+
rewrite Hfix; last by exists x.
317+
rewrite mul1r /cst => /eqP fi0.
318+
have := ndf_sum f_n_ge0 x (leq0n i).
319+
rewrite big_geq // -[0 x]fi0 gerDl.
320+
by rewrite leNgt invr_gt0 exprn_gt0.
321+
Qed.
322+
323+
Local Lemma perfectly_normal_space_23 : perfectly_normal_space 0 -> perfectly_normal_space' 0.
324+
Proof.
325+
move=> pns' E cE; case: (pns' (~`E)).
326+
by rewrite closedC.
327+
move=> f [cf f0]; exists f.
328+
split.
329+
by [].
330+
by rewrite -[LHS]setCK f0 preimage_setC.
331+
Qed.
332+
333+
Local Lemma perfectly_normal_space_32 : perfectly_normal_space' 0 -> perfectly_normal_space 0.
334+
Proof.
335+
move=> pns' E cE; case: (pns' (~`E)).
336+
by rewrite openC.
337+
move=> f [cf f0]; exists f.
338+
split.
339+
by [].
340+
by rewrite -[RHS]setCK preimage_setC -f0 setCK.
341+
Qed.
342+
343+
(* (norm \o f) @^-1` [set 0] = f @^-1` [set 0] *)
344+
Lemma norm_preimage0 (f : T -> R) :
345+
continuous f ->
346+
exists f' : T -> R, [/\ continuous f', (forall x, f' x >= 0)
347+
& f' @^-1` [set 0] = f @^-1` [set 0]].
348+
Proof.
349+
move=> cf; exists (fun x => `|f x|); split => //.
350+
- move=> x; exact/continuous_comp/norm_continuous/cf.
351+
- apply/seteqP; split => [x|x /= ->]; [exact: normr0_eq0 | by rewrite normr0].
352+
Qed.
353+
354+
Local Lemma perfectly_normal_space_24 : perfectly_normal_space 0 -> perfectly_normal_space01.
138355
Proof.
139-
Admitted.
356+
move=> pns0 E F cE cF EF.
357+
have [_ [/norm_preimage0 [f [cf f_ge0 <-]] E0]] := pns0 E cE.
358+
have [_ [/norm_preimage0 [g [cg g_ge0 <-]] F0]] := pns0 F cF.
359+
have fg_gt0 x : f x + g x > 0.
360+
move: (f_ge0 x) (g_ge0 x).
361+
rewrite !le_eqVlt => /orP[/eqP|] Hf /orP[/eqP|] Hg; last exact: addr_gt0.
362+
+ by move: EF; rewrite E0 F0 => /disj_setPRL/(_ x); elim.
363+
+ by rewrite -Hf add0r.
364+
+ by rewrite -Hg addr0.
365+
have fg_neq0 x : f x + g x != 0 by apply: lt0r_neq0.
366+
exists (fun x => f x / (f x + g x)); split.
367+
- move=> x; apply: (continuousM (cf x)).
368+
apply: continuous_comp; [exact/continuousD/cg/cf | exact: inv_continuous].
369+
- rewrite E0.
370+
apply/seteqP; split => x /=; first by move->; rewrite mul0r.
371+
move/(f_equal (GRing.mul ^~ (f x + g x))).
372+
by rewrite -mulrA mulVf // mulr1 mul0r.
373+
- rewrite F0.
374+
apply/seteqP; split => x /=.
375+
rewrite -{1}(addr0 (f x)) => <-; exact: mulfV.
376+
move/(f_equal (GRing.mul ^~ (f x + g x))).
377+
rewrite -mulrA mulVf // mulr1 mul1r => /eqP.
378+
by rewrite addrC -subr_eq subrr eq_sym => /eqP.
379+
- move=> _ [x] _ /= <-.
380+
have fgx : (f x + g x)^-1 >= 0 by apply/ltW; rewrite invr_gt0.
381+
by rewrite in_itv /= mulr_ge0 //= -(mulfV (fg_neq0 x)) ler_pM // lerDl.
382+
Qed.
383+
384+
Local Lemma perfectly_normal_space_42 :
385+
perfectly_normal_space01 -> perfectly_normal_space 0.
386+
Proof.
387+
move=> + E cE => /(_ E set0 cE closed0).
388+
rewrite disj_set2E setI0 eqxx => /(_ erefl).
389+
case=> f [] cf [] Ef [] _ _.
390+
by exists f; split.
391+
Qed.
392+
393+
Local Lemma perfectly_normal_space_41 :
394+
perfectly_normal_space01 -> perfectly_normal_space_Gdelta.
395+
Proof.
396+
move=> pns01; split; first exact: perfectly_normal_space01_normal.
397+
move=> E cE; case:(perfectly_normal_space_42 pns01 cE) => // f [] cf Ef.
398+
exists (fun n => f @^-1` `]-n.+1%:R^-1,n.+1%:R^-1[%classic).
399+
by move=> n; move/continuousP: cf; apply; exact: itv_open.
400+
rewrite -preimage_bigcap (_ : bigcap _ _ = [set 0])//.
401+
rewrite eqEsubset; split; last first.
402+
by move=> x -> n _ /=; rewrite in_itv//= oppr_lt0 andbb invr_gt0.
403+
apply: subsetC2; rewrite setC_bigcap => x /= /eqP x0.
404+
exists (trunc `|x^-1|) => //=; rewrite in_itv/= -ltr_norml ltNge.
405+
apply/negP; rewrite negbK.
406+
by rewrite invf_ple ?posrE// ?normr_gt0// -normfV ltW// truncnS_gt.
407+
Qed.
408+
409+
Theorem Vedenissoff_closed : perfectly_normal_space_Gdelta <-> perfectly_normal_space 0.
410+
Proof.
411+
move: perfectly_normal_space_12 perfectly_normal_space_24 perfectly_normal_space_41.
412+
tauto.
413+
Qed.
414+
415+
Theorem Vedenissoff_open : perfectly_normal_space_Gdelta <-> perfectly_normal_space' 0.
416+
Proof.
417+
move: Vedenissoff_closed perfectly_normal_space_23 perfectly_normal_space_32.
418+
tauto.
419+
Qed.
420+
421+
Theorem Vedenissoff01 : perfectly_normal_space_Gdelta <-> perfectly_normal_space01.
422+
Proof.
423+
move: perfectly_normal_space_12 perfectly_normal_space_24 perfectly_normal_space_41.
424+
tauto.
425+
Qed.
140426

141427
End perfectlynormalspace.

theories/showcase/sorgenfreyline.v

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ From mathcomp Require Import all_ssreflect all_algebra all_fingroup.
33
From mathcomp Require Import wochoice contra mathcomp_extra.
44
From mathcomp Require Import boolp classical_sets set_interval.
55
From mathcomp Require Import topology_structure separation_axioms connected.
6-
From mathcomp Require Import reals.
6+
From mathcomp Require Import reals borel_hierarchy.
77

88
Set Implicit Arguments.
99
Unset Strict Implicit.
@@ -452,7 +452,7 @@ Qed.
452452
End distance.
453453

454454
Lemma sorgenfrey_line_perfectly_normal_space :
455-
perfectly_normal_space R sorgenfrey.
455+
perfectly_normal_space sorgenfrey (0 : R).
456456
Proof.
457457
move=> E cE.
458458
exists (sdist E).

0 commit comments

Comments
 (0)