@@ -19,9 +19,10 @@ Set Implicit Arguments.
1919Unset Strict Implicit .
2020Unset Printing Implicit Defensive.
2121
22- Import Order.TTheory GRing.Theory Num.Theory.
22+ Import Order.TTheory GRing.Theory Num.Theory Num.Def .
2323Import numFieldNormedType.Exports.
2424Import numFieldTopology.Exports.
25+ Import exp.
2526
2627Local Open Scope classical_set_scope.
2728Local Open Scope ring_scope.
@@ -126,16 +127,301 @@ move/eqP.
126127by rewrite eq_sym -subr_eq opprB subrKC eq_sym => /eqP.
127128Qed .
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+
129134Definition 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.
138355Proof .
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
141427End perfectlynormalspace.
0 commit comments