@@ -4153,47 +4153,105 @@ rewrite !near_simpl near_withinE near_simpl => Pf; near=> y.
4153
4153
by have [->|] := eqVneq y x; [by apply: nbhs_singleton|near: y].
4154
4154
Grab Existential Variables. all: end_near. Qed .
4155
4155
4156
+ (* NB: technical lemma that comes in handy in Banach-Steinhaus' PR *)
4157
+ Lemma normrZV (R : numFieldType) (V : normedModType R) (x : V) :
4158
+ x != 0 -> `| `| x|^-1 *: x | = 1.
4159
+ Proof .
4160
+ move=> x0; rewrite normmZ normrV ?unitfE ?normr_eq0 //=.
4161
+ by rewrite normr_id mulVr // unitfE normr_eq0.
4162
+ Qed .
4163
+
4156
4164
Section LinearContinuousBounded.
4157
4165
4158
- Variables (R: numFieldType) (V W: normedModType R).
4166
+ Variables (R : numFieldType) (V W : normedModType R).
4167
+
4168
+
4169
+ (*drafts for another PR *)
4170
+ Definition absorbed (A B : set V) :=
4171
+ exists (r : R), A `<=` [ set x : V | exists y : V, B y /\ x = r *: y ].
4172
+
4173
+ Definition strong_bornology :=
4174
+ [ set A | (forall (B : set V), (nbhs (0:V) B -> absorbed A B))].
4175
+
4176
+ Lemma normed_bornological (A : set V) : bounded_set A <->
4177
+ (forall (B : set V), (nbhs (0:V) B -> absorbed A B)).
4178
+ Proof .
4179
+ Admitted .
4180
+ (*To be generalized to any topological space, with a theory of bounded *)
4181
+
4182
+
4183
+ Definition bounded_fun_on (f : V -> W) (B : set (set V)):=
4184
+ forall A, (B A -> (exists M : R, \forall x \near (0 :V), (`|f x| <= M))).
4185
+
4186
+
4187
+ Lemma linear_bounded (f : {linear V -> W} ):
4188
+ ( bounded_on f (nbhs (0 : V))) <->
4189
+ (*exists r : R, 0 <= r /\ (forall x : V, `|f x| <= r * `|x|). *)
4190
+ \forall r \near +oo, (forall x : V, `|f x| <= r * `|x|).
4191
+ Proof .
4192
+ split; last first.
4193
+ move=> /pinfty_ex_gt0 [r [r0 Bf]]; rewrite /bounded_on; near=> M; rewrite -nearE.
4194
+ near=> x; apply: le_trans; first by apply: Bf.
4195
+ apply: (le_trans (y :=r)).
4196
+ apply: ler_pimulr; apply: ltW; first by [].
4197
+ near: x; rewrite nearE.
4198
+ suff <-: ball_ normr 0 1 = (fun x : V => `|x| < 1) by apply: nbhs_ball_norm.
4199
+ by apply: funext => x /=; rewrite sub0r normrN.
4200
+ near: M; rewrite nearE /=; exists r; split; first by apply: gtr0_real.
4201
+ by move => x; apply: ltW. (* much longer *)
4202
+ rewrite /bounded_on => Bf; near=> r => x.
4203
+ have [->|x0] := eqVneq x 0; first by rewrite linear0 !normr0 mulr0.
4204
+ rewrite -ler_pdivr_mulr ; last by rewrite normr_gt0.
4205
+ rewrite -(normr_id x) mulrC.
4206
+ rewrite -normrV ?unitfE ?normr_eq0 // -normmZ -linearZ.
4207
+ move:x x0; near: r.
4208
+ (* hell on earth *)
4209
+ (* how to use hypothesis with near *)
4210
+ (* split => [[M /nbhs_ballP[a a0 Ba0]]|[r [r0 fr]]]; last first. *)
4211
+ (* exists r; apply/nbhs_ballP; exists 1 => // x. *)
4212
+ (* rewrite -ball_normE //= sub0r normrN => x1; apply: (le_trans (fr _)). *)
4213
+ (* by rewrite ler_pimulr // ltW. *)
4214
+ (* exists (M * 2 * a^-1); split. *)
4215
+ (* - rewrite !mulr_ge0 //= ?invr_ge0 ; last by apply: ltW. *)
4216
+ (* by move: (Ba0 0 (ballxx 0 a0)); rewrite linear0 normr0. *)
4217
+ (* - move=> x; rewrite mulrAC ler_pdivl_mulr //=. *)
4218
+ (* have [/eqP ->|x0] := boolP (x == 0). *)
4219
+ (* + by rewrite linear0 !(normr0,mulr0,mul0r). *)
4220
+ (* + rewrite mulrAC -lter_pdivr_mulr // -lter_pdivr_mulr ?normr_gt0 //. *)
4221
+ (* rewrite [X in X <= _](_ : _ = `|f (a / 2 / `|x| *: x)|); last first. *)
4222
+ (* rewrite linearZ normmZ 2!normrM (gtr0_norm a0) gtr0_norm //. *)
4223
+ (* by rewrite normrV ?unitfE ?normr_eq0 // normr_id -2!mulrA mulrC mulrA. *)
4224
+ (* apply: Ba0; rewrite -ball_normE /= sub0r normrN. *)
4225
+ (* rewrite normmZ normrM (@normrV _ `|x|) ?unitfE ?normr_eq0 // normr_id. *)
4226
+ (* rewrite -mulrA mulVr ?mulr1 ?unitfE ?normr_eq0 //. *)
4227
+ (* by rewrite normrM 2?gtr0_norm// gtr_pmulr // invf_lt1 // ltr1n. *)
4228
+ (* Qed . *)
4229
+ Admitted .
4230
+
4159
4231
4160
- Lemma linear_boundedP (f: {linear V -> W}) : bounded_on f (nbhs (0:V)) <->
4161
- (exists r, 0 <= r /\ (forall x : V, `|f x| <= `|x| * r )).
4232
+ Lemma linear_boundedP (f : {linear V -> W}) :
4233
+ (bounded_on f (nbhs (0 : V))) <->
4234
+ exists r : R, 0 <= r /\ (forall x : V, `|f x| <= r * `|x|).
4162
4235
Proof .
4163
- split.
4164
- - move => /ex_bound [M /nbhs_ballP [a a0 Ba0]] //=.
4165
- exists (M * 2 *a^-1).
4166
- split.
4167
- - rewrite !mulr_ge0 //= ?invr_ge0 ; last by apply: ltW.
4168
- move : (Ba0 0 (ballxx 0 a0 )); rewrite linear0 normr0 //=.
4169
- - move => x. rewrite mulrA ler_pdivl_mulr //=.
4170
- case: (boolp.EM (x=0)).
4171
- - by move => ->; rewrite linear0 !normr0 !mul0r.
4172
- - move => /eqP x0 ; rewrite -lter_pdivr_mull ?normr_gt0 //=.
4173
- rewrite [X in ( _ <= X)]mulrC -lter_pdivr_mull //=.
4174
- have ->: 2^-1 *(`|x|^-1 * (`|f x| * a))=`|f ((2^-1 * `|x|^-1 * a)*:x)|.
4175
- rewrite linearZ normmZ !normrM !ger0_norm ?invr_ge0 //= ?ltW //=.
4176
- by rewrite mulrA mulrA mulrAC.
4177
- apply: Ba0 ;rewrite -ball_normE /= sub0r normrN ?normr_gt0 //=.
4178
- rewrite normmZ !normrM !normrV ?unitfE ?normrE // !ger0_norm ?ltW //=.
4179
- rewrite mulrAC -mulrA -mulrA [_ * (_ * a)]mulrA.
4180
- rewrite mulVr ?unitf_gt0 //= ?normr_gt0 //= mul1r.
4181
- rewrite mulrC gtr_pmulr ?invr_lte1 //= ?unitfE ?ltr_spaddr //=.
4182
- - move => [r [r0 fr]]; apply/ex_bound; exists r.
4183
- rewrite nbhs_ballP; exists 1; first by [].
4184
- move=> x; rewrite -ball_normE //= sub0r normrN => x1; apply: le_trans.
4185
- apply: fr.
4186
- rewrite -[X in _ <= X]mul1r; apply: ler_pmul; rewrite ?normr_ge0 //=.
4187
- by apply: ltW.
4188
- Qed .
4236
+ split => [/linear_bounded | B].
4237
+ by move=> /pinfty_ex_gt0 [M [M0 B]]; exists M; split; first by apply: ltW.
4238
+ apply/linear_bounded; near_simpl. Admitted .
4189
4239
4190
4240
Lemma linear_continuous0 (f : {linear V -> W}) :
4191
- {for 0, continuous f} -> bounded_on f (nbhs (0:V)).
4192
- Proof .
4193
- move=> /cvg_ballP /(_ _ ltr01) .
4241
+ {for 0, continuous f} -> bounded_on f (nbhs (0 : V)).
4242
+ Proof .
4243
+ (* move=> /cvg_distP; rewrite linear0 /= => Bf. *)
4244
+ (* apply/linear_boundedP; near=> r => x. *)
4245
+ (* have [->|x0] := eqVneq x 0; first by rewrite linear0 !normr0 mulr0. *)
4246
+ (* rewrite -ler_pdivr_mulr; last by rewrite normr_gt0. *)
4247
+ (* rewrite -(normr_id x) mulrC. *)
4248
+ (* rewrite -normrV ?unitfE ?normr_eq0 // -normmZ -linearZ. *)
4249
+ (* apply: ltW. move: (Bf r) x x0; near: r. apply/near_pinfty_div2. *)
4250
+ move=> /cvg_ballP /(_ _ ltr01).
4194
4251
rewrite linear0 /= nearE => /nbhs_ex[tp ball_f]; apply/linear_boundedP.
4195
- pose t := tp%:num; exists (2 * t^-1); split => // x.
4196
- have [->|x0] := eqVneq x 0; first by rewrite linear0 !normr0 mul0r.
4252
+ pose t := tp%:num; exists (2 * t^-1); split => [|x].
4253
+ by apply: divr_ge0.
4254
+ have [->|x0] := eqVneq x 0; first by rewrite linear0 !normr0 mulr0.
4197
4255
have /ball_f : ball 0 t ((`|x|^-1 * t /2) *: x).
4198
4256
apply: ball_sym; rewrite -ball_normE /ball_ subr0 normmZ mulrC 2!normrM.
4199
4257
rewrite 2!mulrA normrV ?unitfE ?normr_eq0 // normr_id.
@@ -4202,110 +4260,78 @@ have /ball_f : ball 0 t ((`|x|^-1 * t /2) *: x).
4202
4260
rewrite -ball_normE //= sub0r normrN linearZ /= normmZ -mulrA normrM.
4203
4261
rewrite normrV ?unitfE ?normr_eq0 // normr_id -mulrA.
4204
4262
rewrite ltr_pdivr_mull ?mulr1 ?normr_gt0 // -ltr_pdivl_mull ?normr_gt0 //.
4205
- by rewrite gtr0_norm // invf_div mulrC => /ltW.
4263
+ rewrite gtr0_norm // invf_div => /ltW H. apply: le_trans; first by exact: H.
4264
+ by apply: ler_pmul.
4206
4265
Qed .
4207
4266
4208
4267
Lemma linear_bounded0 (f : {linear V -> W}) :
4209
- bounded_on f (nbhs (0: V)) -> {for 0, continuous f} .
4268
+ bounded_on f (nbhs (0 : V)) -> {for 0, continuous f} .
4210
4269
Proof .
4211
4270
move=> /linear_boundedP [r]; rewrite le0r=> [[/orP r0]]; case: r0.
4212
4271
- move/eqP => -> fr; apply: near_cst_continuous; near=> y.
4213
- by move: (fr y); rewrite mulr0 normr_le0; apply/eqP.
4272
+ by move: (fr y); rewrite mul0r normr_le0; apply/eqP.
4214
4273
- move => r0 fr; apply/cvg_ballP => e e0.
4215
4274
rewrite nearE linear0 /= nbhs_ballP.
4216
4275
exists (e / 2 / r); first by rewrite !divr_gt0.
4217
4276
move=> x; rewrite -2!ball_normE /= 2!sub0r 2!normrN => xr.
4218
4277
have /le_lt_trans -> // : `|f x| <= e / 2.
4219
- by rewrite (le_trans (fr x)) // -ler_pdivl_mulr // ltW.
4278
+ by rewrite (le_trans (fr x)) // mulrC -ler_pdivl_mulr // ltW.
4220
4279
by rewrite gtr_pmulr // invr_lt1 // ?unitfE // ltr1n.
4221
- Grab Existential Variables. by end_near.
4222
- Qed .
4280
+ Grab Existential Variables. by end_near. Qed .
4223
4281
4224
4282
Lemma continuousfor0_continuous (f : {linear V -> W}) :
4225
4283
{for 0, continuous f} -> continuous f.
4226
4284
Proof .
4227
- move=> /(linear_continuous0) /linear_boundedP [r].
4228
- rewrite le0r=> [[/orP r0]]; case: r0 => /eqP.
4229
- - move => ->; move : f => [f linf] f0 //=. (* Linear linf = f ?? *)
4230
- suff: f = fun x => 0 by move => ->; apply: cst_continuous.
4231
- by apply: funext => x; move: (f0 x); rewrite mulr0 normr_le0; apply/eqP .
4232
- - move/eqP => //= r0 fr x.
4233
- rewrite cvg_to_locally => e e0; rewrite nearE /= nbhs_ballP.
4234
- exists (e / r).
4235
- - by rewrite mulr_gt0 //= invr_gt0.
4236
- - move=> y; rewrite -!ball_normE //= => xy; rewrite -linearB.
4237
- by rewrite (le_lt_trans (fr (x - y))) // -ltr_pdivl_mulr.
4285
+ move=> /linear_continuous0 /linear_boundedP [r []].
4286
+ rewrite le_eqVlt => /orP[/eqP <- f0|r0 fr x].
4287
+ - suff : f = (fun _ => 0) :> (_ -> _) by move=> ->; exact: cst_continuous.
4288
+ by rewrite funeqE => x; move: (f0 x); rewrite mul0r normr_le0 => /eqP.
4289
+ - rewrite cvg_to_locally => e e0; rewrite nearE /= nbhs_ballP.
4290
+ exists (e / r); first by rewrite divr_gt0.
4291
+ move=> y; rewrite -!ball_normE //= => xy; rewrite -linearB.
4292
+ by rewrite (le_lt_trans (fr (x - y))) // mulrC -ltr_pdivl_mulr.
4238
4293
Qed .
4239
4294
4240
4295
Lemma linear_bounded_continuous (f : {linear V -> W}) :
4241
4296
bounded_on f (nbhs (0 : V)) <-> continuous f.
4242
4297
Proof .
4243
- split; first by move => /linear_bounded0; apply continuousfor0_continuous .
4244
- by move => /(_ 0) /linear_continuous0 /= .
4298
+ split=> [ /linear_bounded0|/(_ 0)/linear_continuous0//] .
4299
+ exact: continuousfor0_continuous .
4245
4300
Qed .
4246
4301
4247
- Definition bounded_fun_norm (f: V -> W) := forall r, exists M,
4248
- forall x, (`|x| <= r) -> (`|(f x)| <= M).
4302
+ Definition bounded_fun_norm (f : V -> W) :=
4303
+ forall r, exists M, forall x, `|x| <= r -> `|f x| <= M.
4304
+ (*bounded_fun_on bounded_sets is harder to use *)
4249
4305
4250
- Definition pointwise_bounded (F: (V -> W) -> Prop ) := forall x, exists M,
4251
- forall f , F f -> ( `|f x| <= M)%O.
4306
+ (* Definition pointwise_bounded (F : set (V -> W)) := *)
4307
+ (* forall x, exists M, forall f, F f -> `|f x| <= M. *)
4252
4308
4253
- Definition uniform_bounded (F: (V -> W) -> Prop ) := forall r, exists M,
4254
- forall f, F f -> forall x, ( `|x| <= r) -> ( `|f x| <= M)%O.
4309
+ (* Definition uniform_bounded (F : set (V -> W)) := *)
4310
+ (* forall r, exists M, forall f, F f -> forall x, `|x| <= r -> `|f x| <= M. *)
4255
4311
4256
4312
Lemma bounded_funP (f : {linear V -> W}):
4257
- bounded_fun_norm f <-> bounded_on f (nbhs (0:V)).
4258
- Proof .
4259
- split.
4260
- - move => /(_ 1) [M Bf]; apply /linear_boundedP.
4261
- have M0: (0 <= M) by move: (Bf 0); rewrite linear0 !normr0//= => /(_ ler01).
4262
- exists M; split; first by [].
4263
- move: M0; rewrite le0r => /orP; case.
4264
- - move=> /eqP M0; move: M0 Bf => -> Bf x; rewrite mulr0 normr_le0.
4265
- case: (EM (`|x| = 0)); move=>/eqP; rewrite normr_eq0=> /eqP x0.
4266
- - by rewrite x0 linear0.
4267
- - have x00: x != 0 by apply/eqP.
4268
- have : `| `|x|^-1 *: x | <= 1.
4269
- rewrite normmZ normrV ?unitf_gt0 ?normrE //=.
4270
- by rewrite mulrC mulrV ?unitf_gt0 ?normrE //=.
4271
- move=> /Bf; rewrite linearZ normr_le0 scaler_eq0 invr_eq0 => /orP.
4272
- by case ; rewrite ?normr_eq0 //=; move => /eqP ->; rewrite linear0.
4273
- - move => M0 x.
4274
- case: (EM ( x = 0)).
4275
- - by move=> ->;rewrite normr0 mul0r normr_le0 linear0.
4276
- - move => /eqP x0; rewrite mulrC -ler_pdivr_mulr ?normr_gt0 //= mulrC.
4277
- have <- : `| (`|x|^-1) | = `|x|^-1.
4278
- by apply/eqP; rewrite eqr_norm_id invr_ge0 normr_ge0.
4279
- rewrite -normmZ -linearZ; apply: (Bf (`|x|^-1 *: x)).
4280
- rewrite normmZ normrV ?unitf_gt0 ?normrE //=.
4281
- rewrite mulrC mulrV ?unitf_gt0 ?normrE //=.
4282
- - move => /linear_boundedP [r [r0 Bf]]; rewrite /bounded_fun_norm => e.
4283
- exists (e * r) => x xe; apply: le_trans; first by apply: Bf.
4284
- by apply: ler_pmul; rewrite ?normr_ge0 //=.
4285
- Qed .
4286
-
4287
-
4288
-
4289
- (* Lemma bounded_landau (f :{linear V->W}) : *)
4290
- (* bounded_fun_norm f <-> ((f : V -> W) =O_ (0:V) cst (1 : K^o)). *)
4291
- (* Proof. *)
4292
- (* split. *)
4293
- (* - rewrite eqOP => bf. *)
4294
- (* move: (bf 1) => [M bm]. *)
4295
- (* rewrite !nearE /=; exists M; split. by apply : num_real. *)
4296
- (* move => x Mx; rewrite nearE nbhs_normP /=. *)
4297
- (* exists 1; first by []. *)
4298
- (* move => y /=. rewrite -ball_normE /ball_ sub0r normrN /cst normr1 mulr1 => y1. *)
4299
- (* apply: (@le_trans _ _ M _ _). *)
4300
- (* apply: (bm y); by apply: ltW. *)
4301
- (* by apply: ltW. *)
4302
- (* - rewrite eqOP /= ; move => Bf; apply/bounded_funP; rewrite /bounded_on. *)
4303
- (* near=>M. *)
4304
- (* set P := (X in (nbhs _ X)). *)
4305
- (* have -> : P = (fun x : V => (`|f x| <= M * `|cst 1%R x|)%O). *)
4306
- (* by apply: funext => x; rewrite /cst normr1 mulr1. *)
4307
- (* by near: M. *)
4308
- (* Grab Existential Variables. all: end_near. Qed. *)
4309
-
4313
+ bounded_fun_norm f <-> bounded_on f (nbhs (0 : V)).
4314
+ Proof .
4315
+ split => [/(_ 1) [M Bf]|/linear_boundedP [r [r0 Bf]] e]; last first.
4316
+ by exists (e * r) => x xe; rewrite (le_trans (Bf _)) // mulrC ler_pmul.
4317
+ apply/linear_boundedP.
4318
+ have M0 : 0 <= M by move: (Bf 0); rewrite linear0 !normr0 => /(_ ler01).
4319
+ exists M; split => //.
4320
+ move: M0; rewrite le0r => /orP[/eqP|] M0 x.
4321
+ - rewrite M0 mul0r normr_le0.
4322
+ have [/eqP ->|x0] := boolP (x == 0); first by rewrite linear0.
4323
+ have /Bf : `| `|x|^-1 *: x | <= 1.
4324
+ rewrite normmZ normrV ?unitf_gt0 ?normrE //=.
4325
+ by rewrite mulrC mulrV ?unitf_gt0 ?normrE.
4326
+ rewrite linearZ M0 normr_le0 scaler_eq0 invr_eq0 => /orP[|//].
4327
+ by rewrite normr_eq0 => /eqP ->; rewrite linear0.
4328
+ - have [/eqP ->|x0] := boolP (x == 0).
4329
+ + by rewrite normr0 mulr0 normr_le0 linear0.
4330
+ + rewrite -ler_pdivr_mulr ?normr_gt0 //= mulrC.
4331
+ have xx1 : `| `|x|^-1 | = `|x|^-1.
4332
+ by rewrite normrV ?unitfE ?normr_eq0 // normr_id.
4333
+ rewrite -xx1 -normmZ -linearZ; apply: (Bf (`|x|^-1 *: x)).
4334
+ by rewrite normmZ xx1 mulVr // unitfE normr_eq0.
4335
+ Qed .
4310
4336
4311
4337
End LinearContinuousBounded.
0 commit comments