Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
171af4c
sorgenfreyline and properties
motikaku Apr 23, 2025
fc56955
make
motikaku Apr 23, 2025
3825cc9
add Definition perfectly_normal_space
motikaku May 7, 2025
cc5886f
add Definition sdist
motikaku May 7, 2025
0049b38
simplify b_join
t6s May 9, 2025
56ff7d6
simplify open_separatend and subset_separated
t6s May 10, 2025
91fdb6d
simplify sorgenfrey_totally_disconnected
t6s May 10, 2025
fddffe8
almost complete proof of continuous_sdist
garrigue May 12, 2025
187db8b
simplify abs_subr_min
garrigue May 13, 2025
c75057f
fix Definition perfectly_normal_space
motikaku Jun 4, 2025
4e36b69
prove zeroset_sdist
garrigue May 14, 2025
7159793
clarify
garrigue May 14, 2025
39100b7
dl_shift
garrigue May 14, 2025
5f31565
add section
garrigue Jun 4, 2025
10b62e3
remove Admitted
motikaku Jun 20, 2025
4f05afc
add sorgenfrey epsilon delta
motikaku Jun 25, 2025
0e840fb
refactor and add inf_dlxz
motikaku Jul 2, 2025
a6ac2b7
better use of subrK/addKr
garrigue Jul 2, 2025
935b89b
refactor
motikaku Jul 9, 2025
940c0e9
remore duplication and shorten
garrigue Jul 9, 2025
ef027ad
extract sdist_in_lt and restructure
garrigue Jul 9, 2025
61e6c3a
extract lerPnormB
garrigue Jul 9, 2025
a9941f0
renaming and style
garrigue Jul 9, 2025
455ba84
simplify zeroset_sdist
garrigue Jul 10, 2025
f4223b3
typo
garrigue Jul 10, 2025
341f6fb
inf_shift
garrigue Jul 10, 2025
8661816
dlE drE
t6s Jul 10, 2025
517fbb8
shiftN, centerN
t6s Jul 10, 2025
a6f5ee7
simplify dlE drE
t6s Jul 10, 2025
dcbfa70
lt_(dl,dr)_set0
t6s Jul 10, 2025
e66798b
dr_shift/dl_shift
garrigue Jul 11, 2025
e00e50e
elim
garrigue Jul 11, 2025
90899ab
small clean up
garrigue Jul 22, 2025
fa36e57
move Section perfectlynormalspace separation_axioms.v to borel_hierar…
motikaku Jul 30, 2025
5c96415
fix indent
motikaku Jul 30, 2025
a1bd73e
WIP : add Vedenissoff theorem
motikaku Sep 3, 2025
8edfc7e
rebase
motikaku Sep 8, 2025
cf3b823
add proof of Vedenissoff
motikaku Sep 8, 2025
db97ab4
add proof of perfectly_normal_space_41
motikaku Sep 13, 2025
256f266
proof Lemmas perfectly_normal_space01_normal and perfectly_normal_spa…
motikaku Sep 17, 2025
d8f1632
rename and add Vedenissof proof
motikaku Oct 1, 2025
6a8942c
add proof of perfectly_normal_space_12
motikaku Oct 1, 2025
cfcadcb
wip
garrigue Oct 2, 2025
5702fc1
1 -> 2 almost done
garrigue Oct 2, 2025
b9fb7a7
use big_morph
garrigue Oct 6, 2025
4abd608
finish proof of 1 => 2
garrigue Oct 22, 2025
7c2e9ae
completed proof of Vedenissoff
motikaku Oct 29, 2025
d381d8c
use Urysohn in perfectly_normal_space01_normal
motikaku Oct 29, 2025
81ded63
small simp
garrigue Oct 29, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion _CoqProject
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ reals/constructive_ereal.v
reals/reals.v
reals/real_interval.v
reals/signed.v
reals/interval_inference.v
reals/prodnormedzmodule.v
reals/all_reals.v
experimental_reals/xfinmap.v
Expand Down Expand Up @@ -120,5 +119,6 @@ theories/kernel.v
theories/pi_irrational.v
theories/gauss_integral.v
theories/showcase/summability.v
theories/showcase/sorgenfreyline.v
analysis_stdlib/Rstruct_topology.v
analysis_stdlib/showcase/uniform_bigO.v
2 changes: 1 addition & 1 deletion experimental_reals/discrete.v
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
(* Copyright (c) - 2016--2018 - Polytechnique *)

(* -------------------------------------------------------------------- *)
From Corelib Require Setoid.
From Coq Require Setoid.
From HB Require Import structures.
From mathcomp Require Import all_ssreflect all_algebra.
From mathcomp.classical Require Import boolp.
Expand Down
1 change: 0 additions & 1 deletion reals/all_reals.v
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
From mathcomp Require Export interval_inference.
From mathcomp Require Export constructive_ereal.
From mathcomp Require Export reals.
From mathcomp Require Export real_interval.
Expand Down
1,642 changes: 0 additions & 1,642 deletions reals/interval_inference.v

This file was deleted.

2 changes: 1 addition & 1 deletion reals/reals.v
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
(* *)
(******************************************************************************)

From Corelib Require Import Setoid.
From Coq Require Import Setoid.
From HB Require Import structures.
From mathcomp Require Import all_ssreflect all_algebra archimedean.
From mathcomp Require Import boolp classical_sets set_interval.
Expand Down
1 change: 1 addition & 0 deletions theories/Make
Original file line number Diff line number Diff line change
Expand Up @@ -86,3 +86,4 @@ pi_irrational.v
gauss_integral.v
all_analysis.v
showcase/summability.v
showcase/sorgenfreyline.v
304 changes: 303 additions & 1 deletion theories/borel_hierarchy.v
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,13 @@ Set Implicit Arguments.
Unset Strict Implicit.
Unset Printing Implicit Defensive.

Import Order.TTheory GRing.Theory Num.Theory.
Import Order.TTheory GRing.Theory Num.Theory Num.Def.
Import numFieldNormedType.Exports.
Import numFieldTopology.Exports.
Import exp.

Local Open Scope classical_set_scope.
Local Open Scope ring_scope.

Section Gdelta_Fsigma.
Context {T : topologicalType}.
Expand Down Expand Up @@ -94,3 +97,302 @@ have /Baire : forall n, open (C n) /\ dense (C n).
- by apply: denseI => //; apply oB.
by rewrite -C0; exact: dense0.
Qed.

Section perfectlynormalspace.
Context (R : realType) (T : topologicalType).

Definition perfectly_normal_space (x : R) :=
forall E : set T, closed E ->
exists f : T -> R, continuous f /\ E = f @^-1` [set x].

Lemma perfectly_normal_spaceP x y : perfectly_normal_space x -> perfectly_normal_space y.
Proof.
move=>px E cE.
case:(px E cE) => f [] cf ->.
pose f' := f + cst (y - x).
exists f'.
split.
rewrite /f'.
move=> z.
apply: continuousD.
exact:cf.
exact:cst_continuous.
apply/seteqP.
rewrite /f' /cst /=.
split => z /=.
rewrite addrfctE => ->.
by rewrite subrKC.
rewrite addrfctE.
move/eqP.
by rewrite eq_sym -subr_eq opprB subrKC eq_sym => /eqP.
Qed.

Definition perfectly_normal_space' (x : R) :=
forall E : set T, open E ->
exists f : T -> R, continuous f /\ E = f @^-1` ~`[set x].

Definition perfectly_normal_space01 :=
forall E F : set T, closed E -> closed F -> [disjoint E & F] ->
exists f : T -> R,
[/\ continuous f, E = f @^-1` [set 0], F = f @^-1` [set 1]
& range f `<=` `[0, 1]%classic].

Definition perfectly_normal_space_Gdelta :=
normal_space T /\ forall E : set T, closed E -> Gdelta E.

Lemma perfectly_normal_space01_normal :
perfectly_normal_space01 -> normal_space T.
Proof.
move=> pns01.
rewrite (@normal_separatorP R).
move=> A B cA cB /eqP AB.
apply/uniform_separatorP.
have[f [] cf Af Bf f01] := pns01 _ _ cA cB AB.
exists f.
by split => //; rewrite (Af, Bf); exact:image_preimage_subset.
Qed.

Lemma EFin_series (f : R^nat) : EFin \o series f = eseries (EFin \o f).
Proof.
apply/boolp.funext => n.
rewrite /series /eseries /=.
elim: n => [|n IH]; first by rewrite !big_geq.
by rewrite !big_nat_recr //= EFinD IH.
Qed.

Local Lemma perfectly_normal_space_12 : perfectly_normal_space_Gdelta -> perfectly_normal_space 0.
Proof.
move=> pnsGd E cE.
case: (pnsGd) => nT cEGdE.
have[U oU HE]:= cEGdE E cE.
have/boolp.choice[f_n Hn]: forall n, exists f : T -> R,
[/\ continuous f, range f `<=` `[0, 1], f @` E `<=` [set 0] & f @` (~` U n) `<=` [set 1]].
move=> n.
apply/uniform_separatorP.
apply: normal_uniform_separator => //.
- by rewrite closedC.
- rewrite HE -subsets_disjoint.
exact: bigcap_inf.
have f_n_ge0 i y : 0 <= f_n i y.
case: (Hn i) => _ Hr _ _.
have /Hr /= := imageT (f_n i) y.
by rewrite in_itv /= => /andP[].
have f_n_le1 i y : f_n i y <= 1.
case: (Hn i) => _ Hr _ _.
have /Hr /= := imageT (f_n i) y.
by rewrite in_itv /= => /andP[].
pose f_sum := fun n => \sum_(0 <= k < n) (f_n k \* cst (2^-k.+1)).
have cf_sum n : continuous (f_sum n).
rewrite /f_sum => x; elim: n => [|n IH].
rewrite big_geq //; exact: cst_continuous.
rewrite big_nat_recr //=; apply: continuousD => //.
apply/continuousM/cst_continuous.
by case: (Hn n) => /(_ x).
have f_sumE x n : f_sum n x = [series f_n k x * 2^-k.+1]_k n
by exact: (big_morph (@^~ x)).
have f_sumE' x := boolp.funext (f_sumE x).
pose f := fun x => limn (f_sum^~ x); rewrite /= in f.
exists f.
have ndf_sum y : {homo f_sum^~ y : a b / (a <= b)%N >-> a <= b}.
move=> a b ab.
rewrite /f_sum (big_cat_nat _ ab) //= lerDl.
rewrite (big_morph (@^~ y) (id1:=0) (op1:=GRing.add)) //=.
rewrite sumr_ge0 // => i _.
by rewrite mulr_ge0 // invr_ge0 exprn_ge0.
have Hcvg y : cvgn (f_sum^~ y).
apply: nondecreasing_is_cvgn => //.
exists 1 => z /= [m] _ <-.
have -> : 1 = 2^-1 / (1 - 2^-1) :> R.
rewrite -[LHS](@mulfV _ (2^-1)) //; congr (_ / _).
by rewrite [X in X - _](splitr 1) mul1r addrK.
rewrite f_sumE.
apply: le_trans (geometric_le_lim m _ _ _) => //; last first.
by rewrite ltr_norml (@lt_trans _ _ 0) //= invf_lt1 // ltr1n.
rewrite ler_sum // => i _.
by rewrite /geometric /= -exprS -exprVn ler_piMl.
split.
move=> x Nfx.
rewrite -filter_from_ballE.
case => eps /= eps0 HB.
pose n := (2 + truncn (- ln eps / ln 2))%N.
have eps0' : eps / 2 > 0 by exact: divr_gt0.
move/continuousP/(_ _ (ball_open (f_sum n x) eps0')) : (cf_sum n) => /= ofs.
rewrite nbhs_filterE fmapE nbhsE /=.
set B := _ @^-1` _ in ofs.
exists B.
split => //; exact: ballxx.
apply: subset_trans (preimage_subset (f:=f) HB).
rewrite /B /preimage /ball => t /=.
have Hf y :
f y = f_sum n y + limn (fun n' => \sum_(n <= k < n') f_n k y * 2^- k.+1).
have /= := nondecreasing_telescope_sumey n _ (ndf_sum y).
rewrite EFin_lim // fin_numE /= => /(_ isT).
rewrite (eq_eseriesr (g:=fun i => ((f_n i \* cst (2 ^- i.+1)) y)%:E));
last first.
move => i _.
rewrite /f_sum -EFinD big_nat_recr //=.
by rewrite [X in X _ _ y]/GRing.add /= addrAC subrr add0r.
move/(f_equal (fun x => (f_sum n y)%:E + x)).
rewrite addrA addrAC -EFinB subrr add0r => H.
apply: EFin_inj.
rewrite -H EFinD; congr (_ + _).
rewrite -EFin_lim.
apply/congr_lim/boolp.funext => k /=.
exact/esym/big_morph.
by rewrite is_cvg_series_restrict -f_sumE'.
move=> feps.
rewrite !Hf opprD addrA (addrAC (f_sum n x)) -(addrA (_ - _)).
apply: (le_lt_trans (ler_normD _ _)).
rewrite (splitr eps).
apply: ltr_leD => //.
have Hfn y : 0 <= \big[+%R/0]_(n <= k <oo) (f_n k y / 2 ^+ k.+1) <= 2^-n.
apply/andP; split.
have := nondecreasing_cvgn_le (ndf_sum y) (Hcvg y) n.
by rewrite [limn _]Hf lerDl.
have H2n : 0 <= 2^-n :> R by rewrite -exprVn exprn_ge0.
rewrite -lee_fin.
apply: le_trans (epsilon_trick0 xpredT H2n).
rewrite -EFin_lim; last by rewrite is_cvg_series_restrict -f_sumE'.
under [EFin \o _]boolp.funext do
rewrite /= (big_morph EFin (id1:=0) (op1:=GRing.add)) //.
rewrite -nneseries_addn; last by move=> i; rewrite lee_fin mulr_ge0.
apply: lee_nneseries => i _.
by rewrite lee_fin mulr_ge0.
by rewrite lee_fin natrX -!exprVn -exprD addnS addnC ler_piMl.
have Hfn0 x := proj1 (elimT andP (Hfn x)).
have {Hfn}Hfn1 x := proj2 (elimT andP (Hfn x)).
apply: (@le_trans _ _ (2^-n)).
rewrite ler_norml !lerBDl (le_trans (Hfn1 t)) ?lerDl //=.
by rewrite (le_trans (Hfn1 x)) // lerDr.
rewrite /n -exprVn addSnnS exprD expr1 ler_pdivrMl //.
rewrite mulrA (mulrC 2) mulfK // -(@lnK _ (2^-1)) ?posrE //.
rewrite -expRM_natl -{2}(@lnK _ eps) // ler_expR lnV ?posrE //.
rewrite -ler_ndivrMr ?posrE; last by rewrite oppr_lt0 ln_gt0 // ltr1n.
by rewrite invrN mulrN mulNr ltW // truncnS_gt.
apply/seteqP; split => x /= Hx.
apply: EFin_inj.
rewrite -EFin_lim // f_sumE' EFin_series /= eseries0 // => i _ _ /=.
case: (Hn i) => _ _ /(_ (f_n i x)) /= => ->.
by rewrite mul0r.
by exists x.
apply: contraPP Hx.
rewrite (_ : (~ E x) = setC E x) // HE setC_bigcap /= => -[] i _ HU.
case: (Hn i) => _ _ _ /(_ (f_n i x)) /= => Hfix.
rewrite /f => Hf.
have := (nondecreasing_cvgn_le (ndf_sum x) (Hcvg x) i.+1).
have := ndf_sum x _ _ (leq0n i.+1).
rewrite Hf {1}/f_sum big_geq // => /[swap] fi_le0.
rewrite le0r ltNge fi_le0 orbF.
rewrite /f_sum big_nat_recr //= [X in X _ _ x]/GRing.add /= -/(f_sum i).
rewrite Hfix; last by exists x.
rewrite mul1r /cst => /eqP fi0.
have := ndf_sum x _ _ (leq0n i).
rewrite {1}/f_sum big_geq // -[0 x]fi0 gerDl.
by rewrite leNgt invr_gt0 exprn_gt0.
Qed.

Local Lemma perfectly_normal_space_23 : perfectly_normal_space 0 -> perfectly_normal_space' 0.
Proof.
move=> pns' E cE; case: (pns' (~`E)).
by rewrite closedC.
move=> f [cf f0]; exists f.
split.
by [].
by rewrite -[LHS]setCK f0 preimage_setC.
Qed.

Local Lemma perfectly_normal_space_32 : perfectly_normal_space' 0 -> perfectly_normal_space 0.
Proof.
move=> pns' E cE; case: (pns' (~`E)).
by rewrite openC.
move=> f [cf f0]; exists f.
split.
by [].
by rewrite -[RHS]setCK preimage_setC -f0 setCK.
Qed.

(* (norm \o f) @^-1` [set 0] = f @^-1` [set 0] *)
Lemma norm_preimage0 (f : T -> R) :
continuous f ->
exists f' : T -> R, [/\ continuous f', (forall x, f' x >= 0)
& f' @^-1` [set 0] = f @^-1` [set 0]].
Proof.
move=> cf; exists (fun x => `|f x|); split => //.
- move=> x; exact/continuous_comp/norm_continuous/cf.
- apply/seteqP; split => [x|x /= ->]; [exact: normr0_eq0 | by rewrite normr0].
Qed.

Local Lemma perfectly_normal_space_24 : perfectly_normal_space 0 -> perfectly_normal_space01.
Proof.
move=> pns0 E F cE cF EF.
have [_ [/norm_preimage0 [f [cf f_ge0 <-]] E0]] := pns0 E cE.
have [_ [/norm_preimage0 [g [cg g_ge0 <-]] F0]] := pns0 F cF.
have fg_gt0 x : f x + g x > 0.
move: (f_ge0 x) (g_ge0 x).
rewrite !le_eqVlt => /orP[/eqP|] Hf /orP[/eqP|] Hg; last exact: addr_gt0.
+ by move: EF; rewrite E0 F0 => /disj_setPRL/(_ x); elim.
+ by rewrite -Hf add0r.
+ by rewrite -Hg addr0.
have fg_neq0 x : f x + g x != 0 by apply: lt0r_neq0.
exists (fun x => f x / (f x + g x)); split.
- move=> x; apply: (continuousM (cf x)).
apply: continuous_comp; [exact/continuousD/cg/cf | exact: inv_continuous].
- rewrite E0.
apply/seteqP; split => x /=; first by move->; rewrite mul0r.
move/(f_equal (GRing.mul ^~ (f x + g x))).
by rewrite -mulrA mulVf // mulr1 mul0r.
- rewrite F0.
apply/seteqP; split => x /=.
rewrite -{1}(addr0 (f x)) => <-; exact: mulfV.
move/(f_equal (GRing.mul ^~ (f x + g x))).
rewrite -mulrA mulVf // mulr1 mul1r => /eqP.
by rewrite addrC -subr_eq subrr eq_sym => /eqP.
- move=> _ [x] _ /= <-.
have fgx : (f x + g x)^-1 >= 0 by apply/ltW; rewrite invr_gt0.
by rewrite in_itv /= mulr_ge0 //= -(mulfV (fg_neq0 x)) ler_pM // lerDl.
Qed.

Local Lemma perfectly_normal_space_42 :
perfectly_normal_space01 -> perfectly_normal_space 0.
Proof.
move=> + E cE => /(_ E set0 cE closed0).
rewrite disj_set2E setI0 eqxx => /(_ erefl).
case=> f [] cf [] Ef [] _ _.
by exists f; split.
Qed.

Local Lemma perfectly_normal_space_41 :
perfectly_normal_space01 -> perfectly_normal_space_Gdelta.
Proof.
move=> pns01; split; first exact: perfectly_normal_space01_normal.
move=> E cE; case:(perfectly_normal_space_42 pns01 cE) => // f [] cf Ef.
exists (fun n => f @^-1` `]-n.+1%:R^-1,n.+1%:R^-1[%classic).
by move=> n; move/continuousP: cf; apply; exact: itv_open.
rewrite -preimage_bigcap (_ : bigcap _ _ = [set 0])//.
rewrite eqEsubset; split; last first.
by move=> x -> n _ /=; rewrite in_itv//= oppr_lt0 andbb invr_gt0.
apply: subsetC2; rewrite setC_bigcap => x /= /eqP x0.
exists (trunc `|x^-1|) => //=; rewrite in_itv/= -ltr_norml ltNge.
apply/negP; rewrite negbK.
by rewrite invf_ple ?posrE// ?normr_gt0// -normfV ltW// truncnS_gt.
Qed.

Theorem Vedenissoff_closed : perfectly_normal_space_Gdelta <-> perfectly_normal_space 0.
Proof.
move: perfectly_normal_space_12 perfectly_normal_space_24 perfectly_normal_space_41.
tauto.
Qed.

Theorem Vedenissoff_open : perfectly_normal_space_Gdelta <-> perfectly_normal_space' 0.
Proof.
move: Vedenissoff_closed perfectly_normal_space_23 perfectly_normal_space_32.
tauto.
Qed.

Theorem Vedenissoff01 : perfectly_normal_space_Gdelta <-> perfectly_normal_space01.
Proof.
move: perfectly_normal_space_12 perfectly_normal_space_24 perfectly_normal_space_41.
tauto.
Qed.

End perfectlynormalspace.
16 changes: 16 additions & 0 deletions theories/normedtype_theory/pseudometric_normed_Zmodule.v
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,22 @@ Proof. by rewrite funeqE => x /=; rewrite addr0. Qed.
Lemma center0 : center 0 = id.
Proof. by rewrite oppr0 shift0. Qed.

Lemma centerN (x y : R) : center x (- y) = - shift x y.
Proof. by rewrite /shift opprD. Qed.

Lemma shiftN (x y : R) : shift x (- y) = - center x y.
Proof. by rewrite /shift opprD opprK. Qed.

Lemma image_centerN (E : set R) (x : R) :
[set center x (- y) | y in E] =[set - (shift x y) | y in E].
Proof.
by apply/seteqP; split => y [] u Eu <- /=; exists u => //; rewrite opprD.
Qed.

Lemma image_shiftN (E : set R) (x : R) :
[set shift x (- y) | y in E] = [set - (center x y) | y in E].
Proof. by rewrite -(opprK x) image_centerN opprK. Qed.

End Shift.
Arguments shift {R} x / y.
Notation center c := (shift (- c)).
Expand Down
Loading
Loading