@@ -160,19 +160,103 @@ elim: n => [|n IH]; first by rewrite !big_geq.
160160by rewrite !big_nat_recr //= EFinD IH.
161161Qed .
162162
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_sum (big_cat_nat _ ab) //= lerDl.
188+ rewrite (big_morph (@^~ y) (id1:=0) (op1:=GRing.add)) //=.
189+ rewrite sumr_ge0 // => i _.
190+ by rewrite mulr_ge0 // invr_ge0 exprn_ge0.
191+ Qed .
192+
193+ Local Lemma cvgn_f_sum y : cvgn (f_sum^~ y).
194+ Proof .
195+ apply: nondecreasing_is_cvgn; first exact: ndf_sum.
196+ exists 1 => z /= [m] _ <-.
197+ have -> : 1 = 2^-1 / (1 - 2^-1) :> R.
198+ rewrite -[LHS](@mulfV _ (2^-1)) //; congr (_ / _).
199+ by rewrite [X in X - _](splitr 1) mul1r addrK.
200+ rewrite f_sumE.
201+ apply: le_trans (geometric_le_lim m _ _ _) => //; last first.
202+ by rewrite ltr_norml (@lt_trans _ _ 0) //= invf_lt1 // ltr1n.
203+ rewrite ler_sum // => i _.
204+ by rewrite /geometric /= -exprS -exprVn ler_piMl.
205+ Qed .
206+
207+ Local Lemma f_sum_lim n y :
208+ f y = f_sum n y + limn (fun n' => \sum_(n <= k < n') f_n k y * 2^- k.+1).
209+ Proof .
210+ have Hcvg := cvgn_f_sum.
211+ have /= := nondecreasing_telescope_sumey n _ (ndf_sum y).
212+ rewrite EFin_lim //= fin_numE /= => /(_ isT).
213+ rewrite (eq_eseriesr (g:=fun i => ((f_n i \* cst (2 ^- i.+1)) y)%:E));
214+ last first.
215+ move => i _.
216+ rewrite /f_sum -EFinD big_nat_recr //=.
217+ by rewrite [X in X _ _ y]/GRing.add /= addrAC subrr add0r.
218+ move/(f_equal (fun x => (f_sum n y)%:E + x)).
219+ rewrite addrA addrAC -EFinB subrr add0r => H.
220+ apply: EFin_inj.
221+ rewrite -H EFinD; congr (_ + _).
222+ rewrite -EFin_lim.
223+ apply/congr_lim/boolp.funext => k /=.
224+ exact/esym/big_morph.
225+ by rewrite is_cvg_series_restrict -f_sumE'.
226+ Qed .
227+
228+ Local Lemma sum_f_n_oo n y :
229+ 0 <= \big[+%R/0]_(n <= k <oo) (f_n k y / 2 ^+ k.+1) <= 2^-n.
230+ Proof .
231+ have Hcvg := @cvgn_f_sum y.
232+ apply/andP; split.
233+ have := nondecreasing_cvgn_le (ndf_sum y) Hcvg n.
234+ by rewrite [limn _](f_sum_lim n) lerDl.
235+ have H2n : 0 <= 2^-n :> R by rewrite -exprVn exprn_ge0.
236+ rewrite -lee_fin.
237+ apply: le_trans (epsilon_trick0 xpredT H2n).
238+ rewrite -EFin_lim; last by rewrite is_cvg_series_restrict -f_sumE'.
239+ under [EFin \o _]boolp.funext do
240+ rewrite /= (big_morph EFin (id1:=0) (op1:=GRing.add)) //.
241+ rewrite -nneseries_addn; last by move=> i; rewrite lee_fin mulr_ge0.
242+ apply: lee_nneseries => i _.
243+ by rewrite lee_fin mulr_ge0.
244+ by rewrite lee_fin natrX -!exprVn -exprD addnS addnC ler_piMl.
245+ Qed .
246+ End f_n.
247+
163248Local Lemma perfectly_normal_space_12 : perfectly_normal_space_Gdelta -> perfectly_normal_space 0.
164249Proof .
165250move=> pnsGd E cE.
166251case: (pnsGd) => nT cEGdE.
167252have[U oU HE]:= cEGdE E cE.
168- have/boolp.choice[f_n Hn]: forall n, exists f : T -> R,
253+ have/boolp.choice[f_n Hn] n : exists f : T -> R,
169254 [/\ continuous f, range f `<=` `[0, 1], f @` E `<=` [set 0] & f @` (~` U n) `<=` [set 1]].
170- move=> n.
171- apply/uniform_separatorP.
172- apply: normal_uniform_separator => //.
255+ apply /uniform_separatorP /normal_uniform_separator => //.
173256 - by rewrite closedC.
174257 - rewrite HE -subsets_disjoint.
175258 exact: bigcap_inf.
259+ have cf_n i : continuous (f_n i) by case: (Hn i).
176260have f_n_ge0 i y : 0 <= f_n i y.
177261 case: (Hn i) => _ Hr _ _.
178262 have /Hr /= := imageT (f_n i) y.
@@ -182,39 +266,15 @@ have f_n_le1 i y : f_n i y <= 1.
182266 have /Hr /= := imageT (f_n i) y.
183267 by rewrite in_itv /= => /andP[].
184268pose f_sum := fun n => \sum_(0 <= k < n) (f_n k \* cst (2^-k.+1)).
185- have cf_sum n : continuous (f_sum n).
186- rewrite /f_sum => x; elim: n => [|n IH].
187- rewrite big_geq //; exact: cst_continuous.
188- rewrite big_nat_recr //=; apply: continuousD => //.
189- apply/continuousM/cst_continuous.
190- by case: (Hn n) => /(_ x).
191- have f_sumE x n : f_sum n x = [series f_n k x * 2^-k.+1]_k n
192- by exact: (big_morph (@^~ x)).
193- have f_sumE' x := boolp.funext (f_sumE x).
194- pose f := fun x => limn (f_sum^~ x); rewrite /= in f.
269+ have cf_sum := cf_sum cf_n.
270+ pose f x := limn (f_sum ^~ x).
195271exists f.
196- have ndf_sum y : {homo f_sum^~ y : a b / (a <= b)%N >-> a <= b}.
197- move=> a b ab.
198- rewrite /f_sum (big_cat_nat _ ab) //= lerDl.
199- rewrite (big_morph (@^~ y) (id1:=0) (op1:=GRing.add)) //=.
200- rewrite sumr_ge0 // => i _.
201- by rewrite mulr_ge0 // invr_ge0 exprn_ge0.
202- have Hcvg y : cvgn (f_sum^~ y).
203- apply: nondecreasing_is_cvgn => //.
204- exists 1 => z /= [m] _ <-.
205- have -> : 1 = 2^-1 / (1 - 2^-1) :> R.
206- rewrite -[LHS](@mulfV _ (2^-1)) //; congr (_ / _).
207- by rewrite [X in X - _](splitr 1) mul1r addrK.
208- rewrite f_sumE.
209- apply: le_trans (geometric_le_lim m _ _ _) => //; last first.
210- by rewrite ltr_norml (@lt_trans _ _ 0) //= invf_lt1 // ltr1n.
211- rewrite ler_sum // => i _.
212- by rewrite /geometric /= -exprS -exprVn ler_piMl.
213272split.
214273 move=> x Nfx.
215274 rewrite -filter_from_ballE.
216275 case => eps /= eps0 HB.
217276 pose n := (2 + truncn (- ln eps / ln 2))%N.
277+ have Hf := f_sum_lim f_n_ge0 f_n_le1 n.
218278 have eps0' : eps / 2 > 0 by exact: divr_gt0.
219279 move/continuousP/(_ _ (ball_open (f_sum n x) eps0')) : (cf_sum n) => /= ofs.
220280 rewrite nbhs_filterE fmapE nbhsE /=.
@@ -223,44 +283,13 @@ split.
223283 split => //; exact: ballxx.
224284 apply: subset_trans (preimage_subset (f:=f) HB).
225285 rewrite /B /preimage /ball => t /=.
226- have Hf y :
227- f y = f_sum n y + limn (fun n' => \sum_(n <= k < n') f_n k y * 2^- k.+1).
228- have /= := nondecreasing_telescope_sumey n _ (ndf_sum y).
229- rewrite EFin_lim // fin_numE /= => /(_ isT).
230- rewrite (eq_eseriesr (g:=fun i => ((f_n i \* cst (2 ^- i.+1)) y)%:E));
231- last first.
232- move => i _.
233- rewrite /f_sum -EFinD big_nat_recr //=.
234- by rewrite [X in X _ _ y]/GRing.add /= addrAC subrr add0r.
235- move/(f_equal (fun x => (f_sum n y)%:E + x)).
236- rewrite addrA addrAC -EFinB subrr add0r => H.
237- apply: EFin_inj.
238- rewrite -H EFinD; congr (_ + _).
239- rewrite -EFin_lim.
240- apply/congr_lim/boolp.funext => k /=.
241- exact/esym/big_morph.
242- by rewrite is_cvg_series_restrict -f_sumE'.
243286 move=> feps.
244- rewrite !Hf opprD addrA (addrAC (f_sum n x)) -(addrA (_ - _)).
287+ rewrite /f !Hf opprD addrA (addrAC (f_sum n x)) -(addrA (_ - _)).
245288 apply: (le_lt_trans (ler_normD _ _)).
246289 rewrite (splitr eps).
247290 apply: ltr_leD => //.
248- have Hfn y : 0 <= \big[+%R/0]_(n <= k <oo) (f_n k y / 2 ^+ k.+1) <= 2^-n.
249- apply/andP; split.
250- have := nondecreasing_cvgn_le (ndf_sum y) (Hcvg y) n.
251- by rewrite [limn _]Hf lerDl.
252- have H2n : 0 <= 2^-n :> R by rewrite -exprVn exprn_ge0.
253- rewrite -lee_fin.
254- apply: le_trans (epsilon_trick0 xpredT H2n).
255- rewrite -EFin_lim; last by rewrite is_cvg_series_restrict -f_sumE'.
256- under [EFin \o _]boolp.funext do
257- rewrite /= (big_morph EFin (id1:=0) (op1:=GRing.add)) //.
258- rewrite -nneseries_addn; last by move=> i; rewrite lee_fin mulr_ge0.
259- apply: lee_nneseries => i _.
260- by rewrite lee_fin mulr_ge0.
261- by rewrite lee_fin natrX -!exprVn -exprD addnS addnC ler_piMl.
262- have Hfn0 x := proj1 (elimT andP (Hfn x)).
263- have {Hfn}Hfn1 x := proj2 (elimT andP (Hfn x)).
291+ have Hfn0 x := proj1 (elimT andP (sum_f_n_oo f_n_ge0 f_n_le1 n x)).
292+ have Hfn1 x := proj2 (elimT andP (sum_f_n_oo f_n_ge0 f_n_le1 n x)).
264293 apply: (@le_trans _ _ (2^-n)).
265294 rewrite ler_norml !lerBDl (le_trans (Hfn1 t)) ?lerDl //=.
266295 by rewrite (le_trans (Hfn1 x)) // lerDr.
@@ -270,6 +299,7 @@ split.
270299 rewrite -ler_ndivrMr ?posrE; last by rewrite oppr_lt0 ln_gt0 // ltr1n.
271300 by rewrite invrN mulrN mulNr ltW // truncnS_gt.
272301apply/seteqP; split => x /= Hx.
302+ have Hcvg := cvgn_f_sum f_n_ge0 f_n_le1 (y:=x).
273303 apply: EFin_inj.
274304 rewrite -EFin_lim // f_sumE' EFin_series /= eseries0 // => i _ _ /=.
275305 case: (Hn i) => _ _ /(_ (f_n i x)) /= => ->.
@@ -279,15 +309,16 @@ apply: contraPP Hx.
279309rewrite (_ : (~ E x) = setC E x) // HE setC_bigcap /= => -[] i _ HU.
280310case: (Hn i) => _ _ _ /(_ (f_n i x)) /= => Hfix.
281311rewrite /f => Hf.
282- have := (nondecreasing_cvgn_le (ndf_sum x) (Hcvg x) i.+1).
283- have := ndf_sum x _ _ (leq0n i.+1).
284- rewrite Hf {1}/f_sum big_geq // => /[swap] fi_le0.
312+ have Hcvg := cvgn_f_sum f_n_ge0 f_n_le1 (y:=x).
313+ have := nondecreasing_cvgn_le (ndf_sum f_n_ge0 x) Hcvg i.+1.
314+ have := ndf_sum f_n_ge0 x (leq0n i.+1).
315+ rewrite Hf big_geq // => /[swap] fi_le0.
285316rewrite le0r ltNge fi_le0 orbF.
286- rewrite /f_sum big_nat_recr //= [X in X _ _ x]/GRing.add /= -/(f_sum i).
317+ rewrite big_nat_recr //= [X in X _ _ x]/GRing.add /= -/(f_sum i).
287318rewrite Hfix; last by exists x.
288319rewrite mul1r /cst => /eqP fi0.
289- have := ndf_sum x _ _ (leq0n i).
290- rewrite {1}/f_sum big_geq // -[0 x]fi0 gerDl.
320+ have := ndf_sum f_n_ge0 x (leq0n i).
321+ rewrite big_geq // -[0 x]fi0 gerDl.
291322by rewrite leNgt invr_gt0 exprn_gt0.
292323Qed .
293324
0 commit comments