Zulip Chat Archive

Stream: Is there code for X?

Topic: Operations on uniform limits


Vincent Beffara (Oct 23 2022 at 19:52):

Do we have this somewhere where I didn't find it? docs#tendsto_uniformly_on.mul is for uniform groups.

variables {ΞΉ Ξ± π•œ : Type*} [normed_field π•œ] {p : filter ΞΉ} [ne_bot p] {K s : set Ξ±} {m mf mg : ℝ}
  {F G : ΞΉ β†’ Ξ± β†’ π•œ} {f g : Ξ± β†’ π•œ}

lemma tendsto_uniformly_on.inv_of_le (hF : tendsto_uniformly_on F f p s)
  (hm : 0 < m) (hf : βˆ€ x ∈ s, m ≀ βˆ₯f xβˆ₯) :
  tendsto_uniformly_on F⁻¹ f⁻¹ p s := sorry

lemma tendsto_uniformly_on.mul_of_le
  (hF : tendsto_uniformly_on F f p s) (hG : tendsto_uniformly_on G g p s)
  (hf : βˆ€αΆ  i in p, βˆ€ x ∈ s, βˆ₯F i xβˆ₯ ≀ mf) (hg : βˆ€αΆ  i in p, βˆ€ x ∈ s, βˆ₯G i xβˆ₯ ≀ mg) :
  tendsto_uniformly_on (F * G) (f * g) p s := sorry

lemma tendsto_uniformly_on.mul_of_bound
  (hF : tendsto_uniformly_on F f p s) (hG : tendsto_uniformly_on G g p s)
  (hf : βˆ€ x ∈ s, βˆ₯f xβˆ₯ ≀ mf) (hg : βˆ€ x ∈ s, βˆ₯g xβˆ₯ ≀ mg) :
  tendsto_uniformly_on (F * G) (f * g) p s := sorry

I have proofs but they are too ugly to be displayed in public :sweat_smile:

Patrick Massot (Oct 23 2022 at 20:38):

I'm not surprised this isn't there yet. I'm not even sure we have the statement that inversion in a topological field is uniformly continuous on a set whose closure doesn't contain zero.

Patrick Massot (Oct 23 2022 at 20:46):

Probably you would even need something like: if p and q are filters on π•œπ•œ such that p βŠ“ 𝓝 0 = βŠ₯ and q βŠ“ 𝓝 0 = βŠ₯ then map (Ξ» x : π•œ Γ— π•œ, (x.1⁻¹, x.2 ⁻¹)) (𝓀 π•œ βŠ“ (p Γ—αΆ  q)) ≀ 𝓀 π•œ.

Patrick Massot (Oct 23 2022 at 20:48):

Note this is totally untested and I didn't think very hard. It simply looks good and the kind of thing that would help in writing a nice proof of your first lemma.

Patrick Massot (Oct 23 2022 at 20:51):

This inequality would be meant to be used with the one appearing in docs#tendsto_uniformly_on_iff_tendsto

Vincent Beffara (Oct 23 2022 at 20:51):

p βŠ“ 𝓝 0 = βŠ₯ as in "eventually bounded below" ?

Patrick Massot (Oct 23 2022 at 20:55):

I was thinking of p and q as π“Ÿ (f '' s) and 𝓝˒ (f '' s) (or the other way around)

Vincent Beffara (Oct 24 2022 at 13:36):

Here is what I have for step 1:

variables {ΞΉ Ξ± π•œ : Type*} [normed_field π•œ] {p : filter ΞΉ} [ne_bot p] {K s : set Ξ±} {m mf mg : ℝ}
  {F G : ΞΉ β†’ Ξ± β†’ π•œ} {f g : Ξ± β†’ π•œ} {x y : π•œ} {Ξ· Ξ·' : ℝ}

lemma toto (hΞ· : 0 < Ξ·) (hΞ·' : 0 < Ξ·') (hx : x βˆ‰ ball (0:π•œ) Ξ·) (hy : y βˆ‰ ball (0:π•œ) Ξ·') :
  dist x⁻¹ y⁻¹ ≀ dist x y / (Ξ· * Ξ·') :=
begin
  have h1 : x β‰  0 := Ξ» h, by simpa [h, hΞ·] using hx,
  have h2 : y β‰  0 := Ξ» h, by simpa [h, hΞ·'] using hy,
  simp [dist_eq_norm] at hx hy,
  rw [dist_eq_norm, inv_sub_inv h1 h2, norm_div, norm_mul, dist_comm, dist_eq_norm],
  exact div_le_div (norm_nonneg _) le_rfl (mul_pos hΞ· hΞ·') (mul_le_mul hx hy hΞ·'.le (norm_nonneg _))
end

lemma titi {p q : filter π•œ} (hp : p βŠ“ 𝓝 0 = βŠ₯) (hq : q βŠ“ 𝓝 0 = βŠ₯) :
  map (Ξ» x : π•œ Γ— π•œ, (x.1⁻¹, x.2⁻¹)) (𝓀 π•œ βŠ“ (p Γ—αΆ  q)) ≀ 𝓀 π•œ :=
begin
  obtain ⟨U, hU, V, hV, hUV⟩ := inf_eq_bot_iff.mp hp,
  obtain ⟨U', hU', V', hV', hUV'⟩ := inf_eq_bot_iff.mp hq,
  obtain ⟨η, hη, hV⟩ := metric.mem_nhds_iff.mp hV,
  obtain ⟨η', hη', hV'⟩ := metric.mem_nhds_iff.mp hV',
  have hΞ·Ξ·' : 0 < Ξ· * Ξ·' := mul_pos hΞ· hΞ·',
  rintro u hu,
  obtain ⟨Ρ, hΡ, hu⟩ := mem_uniformity_dist.mp hu,
  rw mem_map_iff_exists_image,
  refine ⟨_, inter_mem_inf (dist_mem_uniformity (mul_pos hΡ hηη')) (prod_mem_prod hU hU'), _⟩,
  rintro z ⟨x, ⟨hx1, hx2⟩, rfl⟩,
  have hx'1 : x.1 βˆ‰ ball (0 : π•œ) Ξ·,
  from Ξ» h, (nonempty_of_mem (mem_inter hx2.1 (hV h))).ne_empty hUV,
  have hx'2 : x.2 βˆ‰ ball (0 : π•œ) Ξ·',
  from Ξ» h, (nonempty_of_mem (mem_inter hx2.2 (hV' h))).ne_empty hUV',
  refine hu ((toto hΞ· hΞ·' hx'1 hx'2).trans_lt _),
  convert (div_lt_div_right hΞ·Ξ·').mpr hx1,
  field_simp [hΞ·.lt.ne.symm, hΞ·'.lt.ne.symm]; ring
end

Vincent Beffara (Oct 24 2022 at 13:56):

example (hΞ· : 0 < Ξ·) : uniform_continuous_on (Ξ» x, x⁻¹) (ball (0 : π•œ) Ξ·)ᢜ :=
begin
  rw [uniform_continuous_on, tendsto, ← prod_principal_principal],
  refine titi (inf_eq_bot_iff.mpr _) (inf_eq_bot_iff.mpr _);
  exact ⟨(ball 0 η)ᢜ, mem_principal_self _, ball 0 η, ball_mem_nhds _ hη, compl_inter_self _⟩
end

Vincent Beffara (Oct 24 2022 at 13:59):

I mean,

example {s : set π•œ} (hs : π“Ÿ s βŠ“ 𝓝 0 = βŠ₯) : uniform_continuous_on (Ξ» x, x⁻¹) s :=
by simpa only [uniform_continuous_on, tendsto, ← prod_principal_principal] using titi hs hs

Vincent Beffara (Oct 24 2022 at 17:07):

@Patrick Massot I seem to be stuck at this point writing the proof that at the moment feels natural:

example (hF : tendsto_uniformly_on F f p s) (hf : π“Ÿ (f '' s) βŠ“ 𝓝 0 = βŠ₯) :
  tendsto_uniformly_on F⁻¹ f⁻¹ p s :=
begin
  rw [tendsto_uniformly_on_iff_tendsto, tendsto] at hF ⊒,
  have h1 : map (Ξ» (q : ΞΉ Γ— Ξ±), (f q.snd, F q.fst q.snd)) (p Γ—αΆ  π“Ÿ s) ≀ π“Ÿ (f '' s) Γ—αΆ  𝓝˒ (f '' s),
  { sorry },
  have h2 := le_inf hF h1,
  have h3 : monotone (filter.map (Ξ» (x : π•œ Γ— π•œ), ((x.fst)⁻¹, (x.snd)⁻¹))) := filter.map_mono,
  have h4 : 𝓝˒ (f '' s) βŠ“ 𝓝 0 = βŠ₯, sorry, -- but this should work
  exact (h3 h2).trans (titi hf h4)
end

(with titi as above). h1 fits very well with the rest, but I'm not sure it is true; I also have trouble proving the simpler map (Ξ» (q : ΞΉ Γ— Ξ±), F q.1 q.2) (p Γ—αΆ  π“Ÿ s) ≀ 𝓝˒ (f '' s). I somehow convinced myself that it is not true and one should replace 𝓝˒ (f '' s) with a uniform version to be able to exploit hypothesis hF so that the same element of p works everywhere. Is that completely off?

Patrick Massot (Oct 24 2022 at 18:38):

Indeed that suggestion was probably a bit too optimistic. There is clearly a notion of uniform neighborhood of a set in a uniform space, but I'm not sure how to phrase it nicely, and we clearly don't have it in mathlib.

Junyan Xu (Oct 24 2022 at 18:48):

This topic is about uniform neighborhoods right?

Vincent Beffara (Oct 24 2022 at 18:51):

So ⋃ x ∈ A, ball x V for V ∈ 𝓀 Ξ± is the uniform neighborhood I was looking for

Patrick Massot (Oct 24 2022 at 18:55):

It is a basis for the filter you were asking for

Vincent Beffara (Oct 24 2022 at 19:25):

Like this?

def uniform_thickening (s : set Ξ±) (u : set (Ξ± Γ— Ξ±)) : set Ξ± :=
⋃ x ∈ s, uniform_space.ball x u

def uniform_nhds_set [uniform_space Ξ±] (s : set Ξ±) : filter (set Ξ±) :=
filter.generate ((Ξ» u, {t | uniform_thickening s u βŠ† t}) '' (𝓀 Ξ±).sets)

Anatole Dedecker (Oct 24 2022 at 19:28):

Yes, but the goal is to make it less readable more easy to apply the API to by defining it in terms of all the filter operations we have (e.g the usual infimum, supremum, pushforward and pullback, but also docs#filter.lift or docs#filter.lift')

Anatole Dedecker (Oct 24 2022 at 19:31):

(I'm not sure that's possible, I didn't find anything like this for the uniformity generating the topology of uniform convergence, so it's completely possible we don't have a nice way to do it, but I'm mentioning it because it's worth thinking about)

Patrick Massot (Oct 24 2022 at 19:41):

Yes, there should be a nice description but I don't immediately see it (and I'm really late with many things so I should really really resist the temptation to spend the evening thinking about this).

Vincent Beffara (Oct 24 2022 at 19:49):

def uniform_nhds_set [uniform_space Ξ±] (s : set Ξ±) : filter (set Ξ±) :=
β¨… u ∈ 𝓀 Ξ±, π“Ÿ {t | uniform_thickening s u βŠ† t}

Vincent Beffara (Oct 24 2022 at 19:59):

def uniform_nhds_set [uniform_space Ξ±] (s : set Ξ±) : filter (set Ξ±) :=
(𝓀 Ξ±).lift' (Ξ» u, {t | uniform_thickening s u βŠ† t})

Vincent Beffara (Oct 24 2022 at 19:59):

Not sure which one is "more easy to apply the API to"

Vincent Beffara (Oct 24 2022 at 20:41):

Ah, actually this makes more sense probably:

def uniform_nhds_set [uniform_space Ξ±] (s : set Ξ±) : filter Ξ± :=
(𝓀 Ξ±).lift' (uniform_thickening s)

Anatole Dedecker (Oct 24 2022 at 20:48):

Oh indeed I didn't realize your first suggestion didn't have the good type (as in, not the same as docs#nhds_set)

Vincent Beffara (Oct 25 2022 at 08:07):

The definition above is quite workable:

def uniform_thickening (s : set Ξ±) (u : set (Ξ± Γ— Ξ±)) : set Ξ± :=
⋃ x ∈ s, uniform_space.ball x u

lemma monotone_uniform_thickening {s : set Ξ±} : monotone (uniform_thickening s) :=
Ξ» u v huv, Unionβ‚‚_mono (Ξ» i hi, by simpa [uniform_space.ball] using preimage_mono huv)

def uniform_nhds_set [uniform_space Ξ±] (s : set Ξ±) : filter Ξ± :=
(𝓀 Ξ±).lift' (uniform_thickening s)

lemma lemma1 (hF : tendsto_uniformly_on F f p s) (hf : π“Ÿ (f '' s) βŠ“ 𝓝 0 = βŠ₯) :
  map (Ξ» (q : ΞΉ Γ— Ξ±), (f q.2, F q.1 q.2)) (p Γ—αΆ  π“Ÿ s) ≀ π“Ÿ (f '' s) Γ—αΆ  uniform_nhds_set (f '' s) :=
begin
  rintro u hu,
  obtain ⟨t1, ht1, t2, ht2, h⟩ := filter.mem_prod_iff.mp hu,
  simp only [uniform_nhds_set, mem_lift'_sets monotone_uniform_thickening, exists_prop] at ht2,
  obtain ⟨v, hv1, hv2⟩ := ht2,
  rw mem_map_iff_exists_image,
  refine ⟨_ Γ—Λ’ s, prod_mem_prod (hF v hv1) (mem_principal_self s), subset.trans _ h⟩,
  rintro ⟨x1, x2⟩ ⟨⟨i, a⟩, ⟨h1, h2⟩, h3⟩,
  replace h1 : βˆƒ b ∈ s, (f b, F i a) ∈ v := ⟨a, h2, by simp [h1 a h2]⟩,
  rcases prod.mk.inj_iff.mp h3 with ⟨rfl, rfl⟩,
  simp [mem_principal.mp ht1 (mem_image_of_mem f h2), prod_mk_mem_set_prod_eq, true_and],
  refine hv2 _,
  simpa [uniform_space.ball, uniform_thickening] using h1
end

lemma lemma2 {t : set π•œ} (hf : π“Ÿ t βŠ“ 𝓝 0 = βŠ₯) : (uniform_nhds_set t) βŠ“ 𝓝 0 = βŠ₯ :=
sorry

(the proof of lemma1 is a bit clumsy but it works well enough for now). @Anatole Dedecker what is your feeling about the separation lemma lemma2 here? I can prove it in a metric space but the whole point is to work in a uniform space, where some additional assumption could be needed.

Anatole Dedecker (Oct 25 2022 at 08:18):

I think this is true. You can certainly prove it as a direct consequence of docs#disjoint.exists_uniform_thickening applied to the compact {0} and to the closed set closure t (which 0 does not belong to by the hypothesis)

Anatole Dedecker (Oct 25 2022 at 08:28):

That said a direct proof would work well too and maybe it is more β€œmorally satisfying”: you take a U ball around 0 that does not meet t, split it in half using docs#comp_mem_uniformity_sets, and with the V you get, you have that the V ball around 0 does not meet the V uniform thickening of t

Anatole Dedecker (Oct 25 2022 at 08:32):

There’s also a more practical reason why this second proof is better, which is that we definitely want to rewrite some things using this uniform_nhds_set filter, like we have rewritten a lot of things using nhds_set (e.g in separation axioms). I need to look more at the current library to get a better feel of how it would fit the best, but at least it suggests that using β€œhigh level” results about uniform space is not a good choice

Vincent Beffara (Oct 25 2022 at 08:36):

Ah, this is what I did in a metric space but comp_mem_uniformity_sets is what I did not find (the name is difficult to guess ...) so thanks! I will try to use it and see what happens.

Anatole Dedecker (Oct 25 2022 at 08:38):

For example, I’d argue docs#uniform_space.regular_space should be proven using your lemma2 (or a variation of it), first because it feels more β€œmathlib”-y than the current proof, and because anyone looking at the proof would easily find your uniform version of regularity, which is arguably more useful and intuitive than closed entourages being a basis of uniformity

Vincent Beffara (Oct 25 2022 at 08:38):

π“α΅˜ s as a notation?

Anatole Dedecker (Oct 25 2022 at 08:38):

Ah yes, this is the key fact that makes uniform spaces nice: you have an β€œepsilon/2” principle

Patrick Massot (Oct 25 2022 at 08:40):

I'm sure the proof of lemma1 can be made nicer, but I really don't have time so I'll let Anatole handle it. He will probably start with removing the hf argument that looks like a copy-paste mistake

Vincent Beffara (Oct 25 2022 at 08:50):

I will work further on that proof

Anatole Dedecker (Oct 25 2022 at 10:48):

Sorry, I couldn't resist working on it anyway :sweat_smile: There are probably a dozen more way to do it, so feel free to work on it too, we will almost surely learn something by comparing the versions.

Vincent Beffara (Oct 26 2022 at 21:57):

Here is what I have for now for the uniform separation lemma, together with a bit of API around uniform neighborhoods of sets:

import topology.uniform_space.uniform_convergence

open set filter uniform_space
open_locale filter uniformity topological_space

variables {ΞΉ Ξ± Ξ² : Type*} {a : Ξ±} {s t : set Ξ±} {u v : set (Ξ± Γ— Ξ±)}

lemma comp_symm_of_uniformity' [uniform_space Ξ±] (hu : u ∈ 𝓀 Ξ±) :
  βˆƒ t ∈ 𝓀 Ξ±, symmetric_rel t ∧ t β—‹ t βŠ† u :=
let ⟨v, hv, hvu, hu⟩ := comp_symm_of_uniformity hu in ⟨v, hv, by { ext ⟨_,_⟩, exact ⟨hvu,hvu⟩ }, hu⟩

-----------------------------------------------------------------------------

namespace uniform_space -- uniform thickening

def thickening (s : set Ξ±) (u : set (Ξ± Γ— Ξ±)) : set Ξ± :=
⋃ x ∈ s, ball x u

@[simp] lemma thickening_singleton : thickening {a} = ball a :=
by { ext, simp [thickening] }

@[simp] lemma monotone_thickening : monotone (thickening s) :=
Ξ» u v huv, Unionβ‚‚_mono (Ξ» i hi, by simpa [ball] using preimage_mono huv)

lemma thickening_mono (h : s βŠ† t) : thickening s ≀ thickening t :=
pi.le_def.mpr (Ξ» u, Unionβ‚‚_mono' (Ξ» a ha, ⟨a, h ha, subset_rfl⟩))

@[simp] lemma thickening_comp : thickening (thickening s u) v = thickening s (u β—‹ v) :=
by { ext, simp [thickening, ball] }

lemma disjoint_ball_iff : disjoint (ball a u) t ↔ βˆ€ b ∈ t, (a, b) βˆ‰ u :=
by { rw [← compl_compl (ball a u), disjoint_compl_left_iff_subset]; refl }

lemma thickening_inter_eq_empty : thickening s u ∩ t = βˆ… ↔ βˆ€ (a ∈ s) (b ∈ t), (a, b) βˆ‰ u :=
by simp [thickening, ← disjoint_iff_inter_eq_empty, disjoint_ball_iff]

lemma thickening_inter_eq_empty_comm (hu : symmetric_rel u) :
  thickening s u ∩ t = βˆ… ↔ s ∩ thickening t u = βˆ… :=
begin
  simp [thickening_inter_eq_empty, inter_comm s],
  split; exact Ξ» h a ha b hb hab, h b hb a ha (hu.mk_mem_comm.mp hab)
end

lemma thickening_inter_thickening_eq_empty_of_comp (hv : symmetric_rel v) (hvu : v β—‹ v βŠ† u)
  (hST : thickening s u ∩ t = βˆ…) :
  thickening s v ∩ thickening t v = βˆ… :=
begin
  simp [← thickening_inter_eq_empty_comm hv],
  exact subset_empty_iff.mp (hST β–Έ inter_subset_inter_left t (monotone_thickening hvu))
end

end uniform_space

-----------------------------------------------------------------------------

def uniform_nhds_set [uniform_space Ξ±] (s : set Ξ±) : filter Ξ± :=
(𝓀 Ξ±).lift' (uniform_space.thickening s)

localized "notation (name := uniform_nhds_set) `π“α΅˜` := uniform_nhds_set" in uniformity

namespace uniform_space -- uniform_nhds_set

variables [uniform_space Ξ±]

lemma uniform_nhds_set_mono (h : s βŠ† t) : π“α΅˜ s ≀ π“α΅˜ t :=
lift'_mono le_rfl (thickening_mono h)

lemma uniform_nhds_set_singleton : π“α΅˜ {a} = 𝓝 a :=
by simp [nhds_eq_uniformity, uniform_nhds_set]

lemma mem_uniform_nhds_set_iff : s ∈ π“α΅˜ t ↔ βˆƒ u ∈ 𝓀 Ξ±, thickening t u βŠ† s :=
by simp [uniform_nhds_set, mem_lift'_sets]

lemma nhds_le_uniform_nhds_set (ha : a ∈ s) : 𝓝 a ≀ π“α΅˜ s :=
by simpa [← uniform_nhds_set_singleton] using uniform_nhds_set_mono (singleton_subset_iff.mpr ha)

lemma nhds_set_le_uniform_nhds_set : 𝓝˒ s ≀ π“α΅˜ s :=
by simpa [nhds_set] using Ξ» a, nhds_le_uniform_nhds_set

lemma uniform_nhds_inf_uniform_nhds_eq_bot (h : π“α΅˜ s βŠ“ π“Ÿ t = βŠ₯) : π“α΅˜ s βŠ“ π“α΅˜ t = βŠ₯ :=
begin
  simp_rw [inf_principal_eq_bot, inf_eq_bot_iff, mem_uniform_nhds_set_iff] at h ⊒,
  obtain ⟨u, hu, hsu⟩ := h,
  obtain ⟨v, hv, hvs, hvu⟩ := comp_symm_of_uniformity' hu,
  refine ⟨_, ⟨v, hv, subset_rfl⟩, _, ⟨v, hv, subset_rfl⟩, _⟩,
  refine thickening_inter_thickening_eq_empty_of_comp hvs hvu _,
  exact (subset_compl_iff_disjoint_right.mp hsu).inter_eq,
end

lemma nhds_inf_uniform_nhds_eq_bot (hf : 𝓝 a βŠ“ π“Ÿ s = βŠ₯) : 𝓝 a βŠ“ π“α΅˜ s = βŠ₯ :=
by { rw [← uniform_nhds_set_singleton] at hf ⊒; exact uniform_nhds_inf_uniform_nhds_eq_bot hf }

end uniform_space

Anatole Dedecker (Oct 28 2022 at 11:15):

If you add

@[simp] lemma lift'_inter {f : filter Ξ±} {g h : set Ξ± β†’ set Ξ²} :
  f.lift' (Ξ»x, g x ∩ h x) = f.lift' g βŠ“ f.lift' h :=
calc f.lift' (λx, g x ∩ h x)
    = f.lift (Ξ»x, (π“Ÿ $ g x) βŠ“ (π“Ÿ $ h x)) : by simp [filter.lift']
... = f.lift' g βŠ“ f.lift' h : lift_inf

lemma lift_eq_bot_iff {f : filter Ξ±} {g : set Ξ± β†’ filter Ξ²} (hm : monotone g) :
  f.lift g = βŠ₯ ↔ βˆƒ s ∈ f, g s = βŠ₯ :=
by simp only [← empty_mem_iff_bot, mem_lift_sets hm]

lemma lift'_eq_bot_iff {f : filter Ξ±} {g : set Ξ± β†’ set Ξ²} (hm : monotone g) :
  f.lift' g = βŠ₯ ↔ βˆƒ s ∈ f, g s = βˆ… :=
by simp_rw [filter.lift', lift_eq_bot_iff (monotone_principal.comp hm),
  ← principal_empty, principal_eq_iff_eq]

You can do:

lemma uniform_nhds_inf_uniform_nhds_eq_bot (h : π“α΅˜ s βŠ“ π“Ÿ t = βŠ₯) : π“α΅˜ s βŠ“ π“α΅˜ t = βŠ₯ :=
begin
  simp only [uniform_nhds_set, lift'_inf_principal_eq, ← lift'_inter, lift'_eq_bot_iff,
              monotone_thickening.inter monotone_const,
              monotone_thickening.inter monotone_thickening] at h ⊒,
  obtain ⟨u, hu, hsu⟩ := h,
  obtain ⟨v, hv, hvs, hvu⟩ := comp_symm_of_uniformity' hu,
  exact ⟨v, hv, thickening_inter_thickening_eq_empty_of_comp hvs hvu hsu⟩
end

It's not really shorter so you can keep your version, I just really wanted to give it a try :sweat_smile:

Anatole Dedecker (Oct 28 2022 at 11:17):

But the whole thing is quite nice, I'd say you can open a PR with what you have right now (unless you want to do more things with it first of course)

Vincent Beffara (Oct 28 2022 at 11:19):

I want to add that the uniform neighborhood of a compact is its set neighborhood. (If it is true.) But first I have to go teach...

Anatole Dedecker (Oct 28 2022 at 11:27):

Is it true and we do have it! You just have to rephrase docs#is_compact.nhds_set_basis_uniformity as π“α΅˜ K = 𝓝˒ K but that should be straightforward

Anatole Dedecker (Oct 28 2022 at 11:29):

But if you think you can shorten the proof using API then you should absolutely go for that!

Vincent Beffara (Oct 28 2022 at 11:30):

Also I wanted to swap the arguments of uniform_space.thickening to match metric.thickening

Patrick Massot (Oct 28 2022 at 12:33):

This is still abusing dot notation to obfuscate code. It is especially confusing when ff is a filter and gg and hh are maps...

Vincent Beffara (Oct 28 2022 at 13:30):

Patrick Massot said:

This is still abusing dot notation to obfuscate code. It is especially confusing when ff is a filter and gg and hh are maps...

Which part exactly is abusing dot notation?

Patrick Massot (Oct 28 2022 at 13:52):

Lines like f.lift' (Ξ»x, g x ∩ h x) = f.lift' g βŠ“ f.lift' h

Vincent Beffara (Oct 28 2022 at 14:14):

Also here then?

def uniform_nhds_set [uniform_space Ξ±] (s : set Ξ±) : filter Ξ± :=
(𝓀 Ξ±).lift' (uniform_space.thickening s)

Vincent Beffara (Oct 28 2022 at 17:10):

lemma lemma3 (hs : is_compact s) : 𝓝˒ s = π“α΅˜ s :=
(hs.nhds_set_basis_uniformity (basis_sets _)).eq_of_same_basis ⟨λ t, mem_uniform_nhds_set_iff⟩

Last updated: Dec 20 2023 at 11:08 UTC