@@ -2663,6 +2663,19 @@ rewrite [in X in _ <= X]/normr /= mx_normrE.
2663
2663
by apply/BigmaxBigminr.bigmaxr_gerP; right => /=; exists j.
2664
2664
Qed .
2665
2665
2666
+ Lemma ereal_nbhs'_le (R : numFieldType) (x : {ereal R}) :
2667
+ ereal_nbhs' x --> ereal_nbhs x.
2668
+ Proof .
2669
+ move: x => [x P [_/posnumP[e] HP] |x P|x P] //=.
2670
+ by exists e%:num => // ???; apply: HP.
2671
+ Qed .
2672
+
2673
+ Lemma ereal_nbhs'_le_finite (R : numFieldType) (x : R) :
2674
+ ereal_nbhs' x%:E --> nbhs x%:E.
2675
+ Proof .
2676
+ by move=> P [_/posnumP[e] HP] //=; exists e%:num => // ???; apply: HP.
2677
+ Qed .
2678
+
2666
2679
Section open_closed_sets_ereal.
2667
2680
Variable R : realFieldType (* TODO: generalize to numFieldType? *).
2668
2681
Implicit Types x y : {ereal R}.
@@ -2844,3 +2857,184 @@ rewrite !nbhs_nearE !near_map !near_nbhs in fxP *; have /= := cfx P fxP.
2844
2857
rewrite !near_simpl near_withinE near_simpl => Pf; near=> y.
2845
2858
by have [->|] := eqVneq y x; [by apply: nbhs_singleton|near: y].
2846
2859
Grab Existential Variables. all: end_near. Qed .
2860
+
2861
+ (* NB: technical lemma that comes in handy in Banach-Steinhaus' PR *)
2862
+ Lemma normrZV (R : numFieldType) (V : normedModType R) (x : V) :
2863
+ x != 0 -> `| `| x|^-1 *: x | = 1.
2864
+ Proof .
2865
+ move=> x0; rewrite normmZ normrV ?unitfE ?normr_eq0 //=.
2866
+ by rewrite normr_id mulVr // unitfE normr_eq0.
2867
+ Qed .
2868
+
2869
+ Section LinearContinuousBounded.
2870
+
2871
+ Variables (R : numFieldType) (V W : normedModType R).
2872
+ (* TODO : rename bounded_on by bounded_near *)
2873
+
2874
+ (*drafts for another PR *)
2875
+ Definition absorbed (A B : set V) :=
2876
+ exists (r : R), A `<=` [ set x : V | exists y : V, B y /\ x = r *: y ].
2877
+
2878
+ Definition strong_bornology :=
2879
+ [ set A | (forall (B : set V), (nbhs (0:V) B -> absorbed A B))].
2880
+
2881
+ Lemma normed_bornological (A : set V) : bounded_set A <->
2882
+ (forall (B : set V), (nbhs (0:V) B -> absorbed A B)).
2883
+ Proof .
2884
+ Admitted .
2885
+ (*To be generalized to any topological space, with a theory of bounded *)
2886
+
2887
+ (*TBA topology.v. present in closed_ball *)
2888
+
2889
+ Lemma nbhs0_lt e :
2890
+ 0 < e -> \forall x \near (nbhs (0 : V)), `|x| < e.
2891
+ Proof .
2892
+ move=> e_gt0; apply/nbhs_ballP; exists e => // x.
2893
+ by rewrite -ball_normE /= sub0r normrN.
2894
+ Qed .
2895
+
2896
+ Lemma nbhs'0_lt e :
2897
+ 0 < e -> \forall x \near (nbhs' (0 : V)), `|x| < e.
2898
+ Proof .
2899
+ move=> e_gt0; apply/nbhs_ballP; exists e => // x.
2900
+ by rewrite -ball_normE /= sub0r normrN.
2901
+ Qed .
2902
+
2903
+ Definition bounded_fun_on (f : V -> W) (B : set (set V)):=
2904
+ forall A, (B A -> (exists M : R, \forall x \near (0 :V), (`|f x| <= M))).
2905
+
2906
+ Lemma linear_bounded (f : {linear V -> W} ):
2907
+ ( bounded_on f (nbhs (0 : V))) <->
2908
+ \forall r \near +oo, (forall x : V, `|f x| <= r * `|x|).
2909
+ Proof .
2910
+ split; last first.
2911
+ move => /pinfty_ex_gt0 [r [r0 Bf]]; rewrite /bounded_on nearE /=.
2912
+ exists r; split; first by apply:gtr0_real.
2913
+ move => x rx. rewrite nbhs_ballP; exists 1 => // z.
2914
+ rewrite -ball_normE //= sub0r normrN => x1; apply: (le_trans (Bf _)).
2915
+ have lem: r * `|z| < r by rewrite gtr_pmulr.
2916
+ apply: le_trans; first by apply: ltW; exact: lem.
2917
+ by apply: ltW.
2918
+ rewrite /bounded_on => /pinfty_ex_gt0 [M M0 /nbhs_ballP [_/posnumP[a Ba]]].
2919
+ near (nbhs' (0 : R^o) : set (set R^o)) => e.
2920
+ near=> r => x.
2921
+ have [->|x0] := eqVneq x 0; first by rewrite linear0 !normr0 mulr0.
2922
+ rewrite -ler_pdivr_mulr ?normr_gt0// -[ `|x|]normr_id mulrC.
2923
+ have ne_gt0: 0 < `|e| by rewrite normr_gt0; near:e; exists 1.
2924
+ rewrite -(ler_pmul2l ne_gt0) -!normfV -!normmZ scalerA -linearZ.
2925
+ rewrite (le_trans (Ba _ _)) //.
2926
+ rewrite -ball_normE /= sub0r normrN -scalerA normmZ normrZV //.
2927
+ rewrite mulr1; near: e; apply/nbhs_ballP; exists ((a)%:num) => // z.
2928
+ by rewrite -ball_normE /= sub0r normrN //.
2929
+ rewrite -ler_pdivr_mull //.
2930
+ near: r; apply: nbhs_pinfty_ge_real.
2931
+ by rewrite rpredM// ?ger0_real ?invr_ge0// ltW.
2932
+ Grab Existential Variables. by end_near. by end_near. Qed .
2933
+
2934
+
2935
+ Lemma linear_boundedP (f : {linear V -> W}) :
2936
+ (bounded_on f (nbhs (0 : V))) <->
2937
+ exists r : R, 0 <= r /\ (forall x : V, `|f x| <= r * `|x|).
2938
+ Proof .
2939
+ split => [/linear_bounded | B].
2940
+ by move=> /pinfty_ex_gt0 [M [M0 B]]; exists M; split; first by apply: ltW.
2941
+ apply/linear_bounded; near_simpl. Admitted .
2942
+
2943
+ Lemma linear_continuous0 (f : {linear V -> W}) :
2944
+ {for 0, continuous f} -> bounded_on f (nbhs (0 : V)).
2945
+ Proof .
2946
+ (* move=> /cvg_distP; rewrite linear0 /= => Bf. *)
2947
+ (* apply/linear_boundedP; near=> r => x. *)
2948
+ (* have [->|x0] := eqVneq x 0; first by rewrite linear0 !normr0 mulr0. *)
2949
+ (* rewrite -ler_pdivr_mulr; last by rewrite normr_gt0. *)
2950
+ (* rewrite -(normr_id x) mulrC. *)
2951
+ (* rewrite -normrV ?unitfE ?normr_eq0 // -normmZ -linearZ. *)
2952
+ (* apply: ltW. move: (Bf r) x x0; near: r. apply/near_pinfty_div2. *)
2953
+ move=> /cvg_ballP /(_ _ ltr01).
2954
+ rewrite linear0 /= nearE => /nbhs_ex[tp ball_f]; apply/linear_boundedP.
2955
+ pose t := tp%:num; exists (2 * t^-1); split => [|x].
2956
+ by apply: divr_ge0.
2957
+ have [->|x0] := eqVneq x 0; first by rewrite linear0 !normr0 mulr0.
2958
+ have /ball_f : ball 0 t ((`|x|^-1 * t /2) *: x).
2959
+ apply: ball_sym; rewrite -ball_normE /ball_ subr0 normmZ mulrC 2!normrM.
2960
+ rewrite 2!mulrA normrV ?unitfE ?normr_eq0 // normr_id.
2961
+ rewrite divrr ?mul1r ?unitfE ?normr_eq0 // gtr0_norm // gtr_pmulr //.
2962
+ by rewrite gtr0_norm // invr_lt1 // ?unitfE // ltr1n.
2963
+ rewrite -ball_normE //= sub0r normrN linearZ /= normmZ -mulrA normrM.
2964
+ rewrite normrV ?unitfE ?normr_eq0 // normr_id -mulrA.
2965
+ rewrite ltr_pdivr_mull ?mulr1 ?normr_gt0 // -ltr_pdivl_mull ?normr_gt0 //.
2966
+ rewrite gtr0_norm // invf_div => /ltW H. apply: le_trans; first by exact: H.
2967
+ by apply: ler_pmul.
2968
+ Qed .
2969
+
2970
+ Lemma linear_bounded0 (f : {linear V -> W}) :
2971
+ bounded_on f (nbhs (0 : V)) -> {for 0, continuous f} .
2972
+ Proof .
2973
+ move=> /linear_boundedP [r]; rewrite le0r=> [[/orP r0]]; case: r0.
2974
+ - move/eqP => -> fr; apply: near_cst_continuous; near=> y.
2975
+ by move: (fr y); rewrite mul0r normr_le0; apply/eqP.
2976
+ - move => r0 fr; apply/cvg_ballP => e e0.
2977
+ rewrite nearE linear0 /= nbhs_ballP.
2978
+ exists (e / 2 / r); first by rewrite !divr_gt0.
2979
+ move=> x; rewrite -2!ball_normE /= 2!sub0r 2!normrN => xr.
2980
+ have /le_lt_trans -> // : `|f x| <= e / 2.
2981
+ by rewrite (le_trans (fr x)) // mulrC -ler_pdivl_mulr // ltW.
2982
+ by rewrite gtr_pmulr // invr_lt1 // ?unitfE // ltr1n.
2983
+ Grab Existential Variables. by end_near. Qed .
2984
+
2985
+ Lemma continuousfor0_continuous (f : {linear V -> W}) :
2986
+ {for 0, continuous f} -> continuous f.
2987
+ Proof .
2988
+ move=> /linear_continuous0 /linear_boundedP [r []].
2989
+ rewrite le_eqVlt => /orP[/eqP <- f0|r0 fr x].
2990
+ - suff : f = (fun _ => 0) :> (_ -> _) by move=> ->; exact: cst_continuous.
2991
+ by rewrite funeqE => x; move: (f0 x); rewrite mul0r normr_le0 => /eqP.
2992
+ - rewrite cvg_to_locally => e e0; rewrite nearE /= nbhs_ballP.
2993
+ exists (e / r); first by rewrite divr_gt0.
2994
+ move=> y; rewrite -!ball_normE //= => xy; rewrite -linearB.
2995
+ by rewrite (le_lt_trans (fr (x - y))) // mulrC -ltr_pdivl_mulr.
2996
+ Qed .
2997
+
2998
+ Lemma linear_bounded_continuous (f : {linear V -> W}) :
2999
+ bounded_on f (nbhs (0 : V)) <-> continuous f.
3000
+ Proof .
3001
+ split=> [/linear_bounded0|/(_ 0)/linear_continuous0//].
3002
+ exact: continuousfor0_continuous.
3003
+ Qed .
3004
+
3005
+ Definition bounded_fun_norm (f : V -> W) :=
3006
+ forall r, exists M, forall x, `|x| <= r -> `|f x| <= M.
3007
+ (*bounded_fun_on bounded_sets is harder to use *)
3008
+
3009
+ (* Definition pointwise_bounded (F : set (V -> W)) := *)
3010
+ (* forall x, exists M, forall f, F f -> `|f x| <= M. *)
3011
+
3012
+ (* Definition uniform_bounded (F : set (V -> W)) := *)
3013
+ (* forall r, exists M, forall f, F f -> forall x, `|x| <= r -> `|f x| <= M. *)
3014
+
3015
+ Lemma bounded_funP (f : {linear V -> W}):
3016
+ bounded_fun_norm f <-> bounded_on f (nbhs (0 : V)).
3017
+ Proof .
3018
+ split => [/(_ 1) [M Bf]|/linear_boundedP [r [r0 Bf]] e]; last first.
3019
+ by exists (e * r) => x xe; rewrite (le_trans (Bf _)) // mulrC ler_pmul.
3020
+ apply/linear_boundedP.
3021
+ have M0 : 0 <= M by move: (Bf 0); rewrite linear0 !normr0 => /(_ ler01).
3022
+ exists M; split => //.
3023
+ move: M0; rewrite le0r => /orP[/eqP|] M0 x.
3024
+ - rewrite M0 mul0r normr_le0.
3025
+ have [/eqP ->|x0] := boolP (x == 0); first by rewrite linear0.
3026
+ have /Bf : `| `|x|^-1 *: x | <= 1.
3027
+ rewrite normmZ normrV ?unitf_gt0 ?normrE //=.
3028
+ by rewrite mulrC mulrV ?unitf_gt0 ?normrE.
3029
+ rewrite linearZ M0 normr_le0 scaler_eq0 invr_eq0 => /orP[|//].
3030
+ by rewrite normr_eq0 => /eqP ->; rewrite linear0.
3031
+ - have [/eqP ->|x0] := boolP (x == 0).
3032
+ + by rewrite normr0 mulr0 normr_le0 linear0.
3033
+ + rewrite -ler_pdivr_mulr ?normr_gt0 //= mulrC.
3034
+ have xx1 : `| `|x|^-1 | = `|x|^-1.
3035
+ by rewrite normrV ?unitfE ?normr_eq0 // normr_id.
3036
+ rewrite -xx1 -normmZ -linearZ; apply: (Bf (`|x|^-1 *: x)).
3037
+ by rewrite normmZ xx1 mulVr // unitfE normr_eq0.
3038
+ Qed .
3039
+
3040
+ End LinearContinuousBounded.
0 commit comments