Skip to content

Commit 050f5a8

Browse files
committed
feat: generalize CompleteSpace (ContinuousMultilinearMap _ _ _) to TVS (#13468)
1 parent a94c84c commit 050f5a8

File tree

4 files changed

+75
-97
lines changed

4 files changed

+75
-97
lines changed

Mathlib/Analysis/LocallyConvex/Bounded.lean

+29-17
Original file line numberDiff line numberDiff line change
@@ -359,31 +359,43 @@ end Bornology
359359

360360
section UniformAddGroup
361361

362-
variable (𝕜) [NontriviallyNormedField 𝕜] [AddCommGroup E] [Module 𝕜 E]
362+
variable (𝕜) [NormedField 𝕜] [AddCommGroup E] [Module 𝕜 E]
363363
variable [UniformSpace E] [UniformAddGroup E] [ContinuousSMul 𝕜 E]
364364

365365
theorem TotallyBounded.isVonNBounded {s : Set E} (hs : TotallyBounded s) :
366366
Bornology.IsVonNBounded 𝕜 s := by
367-
rw [totallyBounded_iff_subset_finite_iUnion_nhds_zero] at hs
368-
intro U hU
369-
have h : Filter.Tendsto (fun x : E × E => x.fst + x.snd) (𝓝 (0, 0)) (𝓝 ((0 : E) + (0 : E))) :=
370-
tendsto_add
371-
rw [add_zero] at h
372-
have h' := (nhds_basis_balanced 𝕜 E).prod (nhds_basis_balanced 𝕜 E)
373-
simp_rw [← nhds_prod_eq, id] at h'
374-
rcases h.basis_left h' U hU with ⟨x, hx, h''⟩
375-
rcases hs x.snd hx.2.1 with ⟨t, ht, hs⟩
376-
refine Absorbs.mono_right ?_ hs
377-
rw [ht.absorbs_biUnion]
378-
have hx_fstsnd : x.fst + x.snd ⊆ U := add_subset_iff.mpr fun z1 hz1 z2 hz2 ↦
379-
h'' <| mk_mem_prod hz1 hz2
380-
refine fun y _ => Absorbs.mono_left ?_ hx_fstsnd
381-
-- TODO: with dot notation, Lean timeouts on the next line. Why?
382-
exact Absorbent.vadd_absorbs (absorbent_nhds_zero hx.1.1) hx.2.2.absorbs_self
367+
if h : ∃ x : 𝕜, 1 < ‖x‖ then
368+
letI : NontriviallyNormedField 𝕜 := ⟨h⟩
369+
rw [totallyBounded_iff_subset_finite_iUnion_nhds_zero] at hs
370+
intro U hU
371+
have h : Filter.Tendsto (fun x : E × E => x.fst + x.snd) (𝓝 0) (𝓝 0) :=
372+
continuous_add.tendsto' _ _ (zero_add _)
373+
have h' := (nhds_basis_balanced 𝕜 E).prod (nhds_basis_balanced 𝕜 E)
374+
simp_rw [← nhds_prod_eq, id] at h'
375+
rcases h.basis_left h' U hU with ⟨x, hx, h''⟩
376+
rcases hs x.snd hx.2.1 with ⟨t, ht, hs⟩
377+
refine Absorbs.mono_right ?_ hs
378+
rw [ht.absorbs_biUnion]
379+
have hx_fstsnd : x.fst + x.snd ⊆ U := add_subset_iff.mpr fun z1 hz1 z2 hz2 ↦
380+
h'' <| mk_mem_prod hz1 hz2
381+
refine fun y _ => Absorbs.mono_left ?_ hx_fstsnd
382+
-- TODO: with dot notation, Lean timeouts on the next line. Why?
383+
exact Absorbent.vadd_absorbs (absorbent_nhds_zero hx.1.1) hx.2.2.absorbs_self
384+
else
385+
haveI : BoundedSpace 𝕜 := ⟨Metric.isBounded_iff.21, by simp_all [dist_eq_norm]⟩⟩
386+
exact Bornology.IsVonNBounded.of_boundedSpace
383387
#align totally_bounded.is_vonN_bounded TotallyBounded.isVonNBounded
384388

385389
end UniformAddGroup
386390

391+
variable (𝕜) in
392+
theorem Filter.Tendsto.isVonNBounded_range [NormedField 𝕜] [AddCommGroup E] [Module 𝕜 E]
393+
[TopologicalSpace E] [TopologicalAddGroup E] [ContinuousSMul 𝕜 E]
394+
{f : ℕ → E} {x : E} (hf : Tendsto f atTop (𝓝 x)) : Bornology.IsVonNBounded 𝕜 (range f) :=
395+
letI := TopologicalAddGroup.toUniformSpace E
396+
haveI := comm_topologicalAddGroup_is_uniform (G := E)
397+
hf.cauchySeq.totallyBounded_range.isVonNBounded 𝕜
398+
387399
section VonNBornologyEqMetric
388400

389401
namespace NormedSpace

Mathlib/Analysis/NormedSpace/Multilinear/Basic.lean

-76
Original file line numberDiff line numberDiff line change
@@ -1434,82 +1434,6 @@ theorem nnnorm_ofSubsingleton_id [Subsingleton ι] [Nontrivial G] (i : ι) :
14341434
NNReal.eq <| norm_ofSubsingleton_id _ _ _
14351435
#align continuous_multilinear_map.nnnorm_of_subsingleton ContinuousMultilinearMap.nnnorm_ofSubsingleton_id
14361436

1437-
variable {𝕜 G}
1438-
1439-
open Topology Filter
1440-
1441-
/-- If the target space is complete, the space of continuous multilinear maps with its norm is also
1442-
complete. The proof is essentially the same as for the space of continuous linear maps (modulo the
1443-
addition of `Finset.prod` where needed). The duplication could be avoided by deducing the linear
1444-
case from the multilinear case via a currying isomorphism. However, this would mess up imports,
1445-
and it is more satisfactory to have the simplest case as a standalone proof. -/
1446-
instance completeSpace [CompleteSpace G] : CompleteSpace (ContinuousMultilinearMap 𝕜 E G) := by
1447-
-- We show that every Cauchy sequence converges.
1448-
refine Metric.complete_of_cauchySeq_tendsto fun f hf => ?_
1449-
-- We now expand out the definition of a Cauchy sequence,
1450-
rcases cauchySeq_iff_le_tendsto_0.1 hf with ⟨b, b0, b_bound, b_lim⟩
1451-
-- and establish that the evaluation at any point `v : Π i, E i` is Cauchy.
1452-
have cau : ∀ v, CauchySeq fun n => f n v := by
1453-
intro v
1454-
apply cauchySeq_iff_le_tendsto_0.2fun n => b n * ∏ i, ‖v i‖, _, _, _⟩
1455-
· intro n
1456-
have := b0 n
1457-
positivity
1458-
· intro n m N hn hm
1459-
rw [dist_eq_norm]
1460-
apply le_trans ((f n - f m).le_opNorm v) _
1461-
exact mul_le_mul_of_nonneg_right (b_bound n m N hn hm) <| by positivity
1462-
· simpa using b_lim.mul tendsto_const_nhds
1463-
-- We assemble the limits points of those Cauchy sequences
1464-
-- (which exist as `G` is complete)
1465-
-- into a function which we call `F`.
1466-
choose F hF using fun v => cauchySeq_tendsto_of_complete (cau v)
1467-
-- Next, we show that this `F` is multilinear,
1468-
let Fmult : MultilinearMap 𝕜 E G :=
1469-
{ toFun := F
1470-
map_add' := fun v i x y => by
1471-
have A := hF (Function.update v i (x + y))
1472-
have B := (hF (Function.update v i x)).add (hF (Function.update v i y))
1473-
simp? at A B says simp only [map_add] at A B
1474-
exact tendsto_nhds_unique A B
1475-
map_smul' := fun v i c x => by
1476-
have A := hF (Function.update v i (c • x))
1477-
have B := Filter.Tendsto.smul (tendsto_const_nhds (x := c)) (hF (Function.update v i x))
1478-
simp? at A B says simp only [map_smul] at A B
1479-
exact tendsto_nhds_unique A B }
1480-
-- and that `F` has norm at most `(b 0 + ‖f 0‖)`.
1481-
have Fnorm : ∀ v, ‖F v‖ ≤ (b 0 + ‖f 0‖) * ∏ i, ‖v i‖ := by
1482-
intro v
1483-
have A : ∀ n, ‖f n v‖ ≤ (b 0 + ‖f 0‖) * ∏ i, ‖v i‖ := by
1484-
intro n
1485-
apply le_trans ((f n).le_opNorm _) _
1486-
apply mul_le_mul_of_nonneg_right _ <| by positivity
1487-
calc
1488-
‖f n‖ = ‖f n - f 0 + f 0‖ := by
1489-
congr 1
1490-
abel
1491-
_ ≤ ‖f n - f 0‖ + ‖f 0‖ := norm_add_le _ _
1492-
_ ≤ b 0 + ‖f 0‖ := by
1493-
apply add_le_add_right
1494-
simpa [dist_eq_norm] using b_bound n 0 0 (zero_le _) (zero_le _)
1495-
exact le_of_tendsto (hF v).norm (eventually_of_forall A)
1496-
-- Thus `F` is continuous, and we propose that as the limit point of our original Cauchy sequence.
1497-
let Fcont := Fmult.mkContinuous _ Fnorm
1498-
use Fcont
1499-
-- Our last task is to establish convergence to `F` in norm.
1500-
have : ∀ n, ‖f n - Fcont‖ ≤ b n := by
1501-
intro n
1502-
apply opNorm_le_bound _ (b0 n) fun v => ?_
1503-
have A : ∀ᶠ m in atTop, ‖(f n - f m) v‖ ≤ b n * ∏ i, ‖v i‖ := by
1504-
refine eventually_atTop.2 ⟨n, fun m hm => ?_⟩
1505-
apply le_trans ((f n - f m).le_opNorm _) _
1506-
exact mul_le_mul_of_nonneg_right (b_bound n m n le_rfl hm) <| by positivity
1507-
have B : Tendsto (fun m => ‖(f n - f m) v‖) atTop (𝓝 ‖(f n - Fcont) v‖) :=
1508-
Tendsto.norm (tendsto_const_nhds.sub (hF v))
1509-
exact le_of_tendsto B A
1510-
rw [tendsto_iff_norm_sub_tendsto_zero]
1511-
exact squeeze_zero (fun n => norm_nonneg _) this b_lim
1512-
15131437
end ContinuousMultilinearMap
15141438

15151439
end Norm

Mathlib/Topology/Algebra/Module/Multilinear/Topology.lean

+41-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ on `ContinuousMultilinearMap 𝕜 E F`,
1414
where `E i` is a family of vector spaces over `𝕜` with topologies
1515
and `F` is a topological vector space.
1616
-/
17-
open Bornology Set
17+
18+
open Bornology Function Set
1819
open scoped Topology UniformConvergence Filter
1920

2021
namespace ContinuousMultilinearMap
@@ -29,6 +30,22 @@ def toUniformOnFun [TopologicalSpace F] (f : ContinuousMultilinearMap 𝕜 E F)
2930
(Π i, E i) →ᵤ[{s | IsVonNBounded 𝕜 s}] F :=
3031
UniformOnFun.ofFun _ f
3132

33+
open UniformOnFun in
34+
lemma range_toUniformOnFun [DecidableEq ι] [TopologicalSpace F] :
35+
range toUniformOnFun =
36+
{f : (Π i, E i) →ᵤ[{s | IsVonNBounded 𝕜 s}] F |
37+
Continuous (toFun _ f) ∧
38+
(∀ (m : Π i, E i) i x y,
39+
toFun _ f (update m i (x + y)) = toFun _ f (update m i x) + toFun _ f (update m i y)) ∧
40+
(∀ (m : Π i, E i) i (c : 𝕜) x,
41+
toFun _ f (update m i (c • x)) = c • toFun _ f (update m i x))} := by
42+
ext f
43+
constructor
44+
· rintro ⟨f, rfl⟩
45+
exact ⟨f.cont, f.map_add, f.map_smul⟩
46+
· rintro ⟨hcont, hadd, hsmul⟩
47+
exact ⟨⟨⟨f, by intro; convert hadd, by intro; convert hsmul⟩, hcont⟩, rfl⟩
48+
3249
@[simp]
3350
lemma toUniformOnFun_toFun [TopologicalSpace F] (f : ContinuousMultilinearMap 𝕜 E F) :
3451
UniformOnFun.toFun _ f.toUniformOnFun = f :=
@@ -76,6 +93,29 @@ instance instUniformContinuousConstSMul {M : Type*}
7693
haveI := uniformContinuousConstSMul_of_continuousConstSMul M F
7794
uniformEmbedding_toUniformOnFun.uniformContinuousConstSMul fun _ _ ↦ rfl
7895

96+
variable [∀ i, ContinuousSMul 𝕜 (E i)] [ContinuousConstSMul 𝕜 F] [CompleteSpace F] [T2Space F]
97+
98+
open UniformOnFun in
99+
theorem completeSpace (h : RestrictGenTopology {s : Set (Π i, E i) | IsVonNBounded 𝕜 s}) :
100+
CompleteSpace (ContinuousMultilinearMap 𝕜 E F) := by
101+
classical
102+
have H : ∀ {m : Π i, E i},
103+
Continuous fun f : (Π i, E i) →ᵤ[{s | IsVonNBounded 𝕜 s}] F ↦ toFun _ f m :=
104+
(uniformContinuous_eval (isVonNBounded_covers) _).continuous
105+
rw [completeSpace_iff_isComplete_range uniformEmbedding_toUniformOnFun.toUniformInducing,
106+
range_toUniformOnFun]
107+
simp only [setOf_and, setOf_forall]
108+
apply_rules [IsClosed.isComplete, IsClosed.inter]
109+
· exact UniformOnFun.isClosed_setOf_continuous h
110+
· exact isClosed_iInter fun m ↦ isClosed_iInter fun i ↦
111+
isClosed_iInter fun x ↦ isClosed_iInter fun y ↦ isClosed_eq H (H.add H)
112+
· exact isClosed_iInter fun m ↦ isClosed_iInter fun i ↦
113+
isClosed_iInter fun c ↦ isClosed_iInter fun x ↦ isClosed_eq H (H.const_smul _)
114+
115+
instance instCompleteSpace [∀ i, TopologicalAddGroup (E i)] [SequentialSpace (Π i, E i)] :
116+
CompleteSpace (ContinuousMultilinearMap 𝕜 E F) :=
117+
completeSpace <| .of_seq fun _u x hux ↦ (hux.isVonNBounded_range 𝕜).insert x
118+
79119
end UniformAddGroup
80120

81121
variable [TopologicalSpace F] [TopologicalAddGroup F]

Mathlib/Topology/UniformSpace/UniformConvergenceTopology.lean

+5-3
Original file line numberDiff line numberDiff line change
@@ -861,6 +861,10 @@ theorem uniformContinuous_eval_of_mem_sUnion {x : α} (hx : x ∈ ⋃₀ 𝔖) :
861861

862862
variable {β} {𝔖}
863863

864+
theorem uniformContinuous_eval (h : ⋃₀ 𝔖 = univ) (x : α) :
865+
UniformContinuous ((Function.eval x : (α → β) → β) ∘ toFun 𝔖) :=
866+
uniformContinuous_eval_of_mem_sUnion _ _ <| h.symm ▸ mem_univ _
867+
864868
/-- If `u` is a family of uniform structures on `γ`, then
865869
`𝒱(α, γ, 𝔖, (⨅ i, u i)) = ⨅ i, 𝒱(α, γ, 𝔖, u i)`. -/
866870
protected theorem iInf_eq {u : ι → UniformSpace γ} :
@@ -990,9 +994,7 @@ that of pointwise convergence. -/
990994
protected theorem uniformContinuous_toFun (h : ⋃₀ 𝔖 = univ) :
991995
UniformContinuous (toFun 𝔖 : (α →ᵤ[𝔖] β) → α → β) := by
992996
rw [uniformContinuous_pi]
993-
intro x
994-
obtain ⟨s : Set α, hs : s ∈ 𝔖, hxs : x ∈ s⟩ := sUnion_eq_univ_iff.mp h x
995-
exact uniformContinuous_eval_of_mem β 𝔖 hxs hs
997+
exact uniformContinuous_eval h
996998
#align uniform_on_fun.uniform_continuous_to_fun UniformOnFun.uniformContinuous_toFun
997999

9981000
/-- Convergence in the topology of `𝔖`-convergence means uniform convergence on `S` (in the sense

0 commit comments

Comments
 (0)