Skip to content

Commit 7b3a505

Browse files
committed
extract some lemmas
1 parent 81ded63 commit 7b3a505

File tree

1 file changed

+102
-71
lines changed

1 file changed

+102
-71
lines changed

theories/borel_hierarchy.v

Lines changed: 102 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -160,19 +160,103 @@ elim: n => [|n IH]; first by rewrite !big_geq.
160160
by rewrite !big_nat_recr //= EFinD IH.
161161
Qed.
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+
163248
Local Lemma perfectly_normal_space_12 : perfectly_normal_space_Gdelta -> perfectly_normal_space 0.
164249
Proof.
165250
move=> pnsGd E cE.
166251
case: (pnsGd) => nT cEGdE.
167252
have[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).
176260
have 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[].
184268
pose 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).
195271
exists 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.
213272
split.
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.
272301
apply/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.
279309
rewrite (_ : (~ E x) = setC E x) // HE setC_bigcap /= => -[] i _ HU.
280310
case: (Hn i) => _ _ _ /(_ (f_n i x)) /= => Hfix.
281311
rewrite /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.
285316
rewrite 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).
287318
rewrite Hfix; last by exists x.
288319
rewrite 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.
291322
by rewrite leNgt invr_gt0 exprn_gt0.
292323
Qed.
293324

0 commit comments

Comments
 (0)