Skip to content

Commit 03c21fa

Browse files
committed
feat(Topology): add IsCompact.nhdsSet_prod_eq etc (#6961)
Also delete `NhdsContainBoxes` and related lemmas as they were only used for another proof of `generalized_tube_lemma`.
1 parent 18d1194 commit 03c21fa

File tree

1 file changed

+64
-75
lines changed

1 file changed

+64
-75
lines changed

Mathlib/Topology/SubsetProperties.lean

Lines changed: 64 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -220,9 +220,8 @@ theorem IsCompact.disjoint_nhdsSet_left {l : Filter α} (hs : IsCompact s) :
220220
choose! U hxU hUl using fun x hx => (nhds_basis_opens x).disjoint_iff_left.1 (H x hx)
221221
choose hxU hUo using hxU
222222
rcases hs.elim_nhds_subcover U fun x hx => (hUo x hx).mem_nhds (hxU x hx) with ⟨t, hts, hst⟩
223-
refine'
224-
(hasBasis_nhdsSet _).disjoint_iff_left.2
225-
⟨⋃ x ∈ t, U x, ⟨isOpen_biUnion fun x hx => hUo x (hts x hx), hst⟩, _⟩
223+
refine (hasBasis_nhdsSet _).disjoint_iff_left.2
224+
⟨⋃ x ∈ t, U x, ⟨isOpen_biUnion fun x hx => hUo x (hts x hx), hst⟩, ?_⟩
226225
rw [compl_iUnion₂, biInter_finset_mem]
227226
exact fun x hx => hUl x (hts x hx)
228227
#align is_compact.disjoint_nhds_set_left IsCompact.disjoint_nhdsSet_left
@@ -369,26 +368,47 @@ theorem isCompact_iff_finite_subfamily_closed :
369368
fun hs => hs.elim_finite_subfamily_closed, isCompact_of_finite_subfamily_closed⟩
370369
#align is_compact_iff_finite_subfamily_closed isCompact_iff_finite_subfamily_closed
371370

371+
/-- If `s : Set (α × β)` belongs to `𝓝 x ×ˢ l` for all `x` from a compact set `K`,
372+
then it belongs to `(𝓝ˢ K) ×ˢ l`,
373+
i.e., there exist an open `U ⊇ K` and `t ∈ l` such that `U ×ˢ t ⊆ s`. -/
374+
theorem IsCompact.mem_nhdsSet_prod_of_forall {K : Set α} {l : Filter β} {s : Set (α × β)}
375+
(hK : IsCompact K) (hs : ∀ x ∈ K, s ∈ 𝓝 x ×ˢ l) : s ∈ (𝓝ˢ K) ×ˢ l := by
376+
refine hK.induction_on (by simp) (fun t t' ht hs ↦ ?_) (fun t t' ht ht' ↦ ?_) fun x hx ↦ ?_
377+
· exact prod_mono (nhdsSet_mono ht) le_rfl hs
378+
· simp [sup_prod, *]
379+
· rcases ((nhds_basis_opens _).prod l.basis_sets).mem_iff.1 (hs x hx)
380+
with ⟨⟨u, v⟩, ⟨⟨hx, huo⟩, hv⟩, hs⟩
381+
refine ⟨u, nhdsWithin_le_nhds (huo.mem_nhds hx), mem_of_superset ?_ hs⟩
382+
exact prod_mem_prod (huo.mem_nhdsSet.2 Subset.rfl) hv
383+
384+
theorem IsCompact.nhdsSet_prod_eq_biSup {K : Set α} (hK : IsCompact K) (l : Filter β) :
385+
(𝓝ˢ K) ×ˢ l = ⨆ x ∈ K, 𝓝 x ×ˢ l :=
386+
le_antisymm (fun s hs ↦ hK.mem_nhdsSet_prod_of_forall <| by simpa using hs)
387+
(iSup₂_le fun x hx ↦ prod_mono (nhds_le_nhdsSet hx) le_rfl)
388+
389+
theorem IsCompact.prod_nhdsSet_eq_biSup {K : Set β} (hK : IsCompact K) (l : Filter α) :
390+
l ×ˢ (𝓝ˢ K) = ⨆ y ∈ K, l ×ˢ 𝓝 y := by
391+
simp only [prod_comm (f := l), hK.nhdsSet_prod_eq_biSup, map_iSup]
392+
393+
/-- If `s : Set (α × β)` belongs to `l ×ˢ 𝓝 y` for all `y` from a compact set `K`,
394+
then it belongs to `l ×ˢ (𝓝ˢ K)`,
395+
i.e., there exist `t ∈ l` and an open `U ⊇ K` such that `t ×ˢ U ⊆ s`. -/
396+
theorem IsCompact.mem_prod_nhdsSet_of_forall {K : Set β} {l : Filter α} {s : Set (α × β)}
397+
(hK : IsCompact K) (hs : ∀ y ∈ K, s ∈ l ×ˢ 𝓝 y) : s ∈ l ×ˢ 𝓝ˢ K :=
398+
(hK.prod_nhdsSet_eq_biSup l).symm ▸ by simpa using hs
399+
372400
/-- To show that `∀ y ∈ K, P x y` holds for `x` close enough to `x₀` when `K` is compact,
373401
it is sufficient to show that for all `y₀ ∈ K` there `P x y` holds for `(x, y)` close enough
374402
to `(x₀, y₀)`.
403+
404+
Provided for backwards compatibility,
405+
see `IsCompact.mem_prod_nhdsSet_of_forall` for a stronger statement.
375406
-/
376407
theorem IsCompact.eventually_forall_of_forall_eventually {x₀ : α} {K : Set β} (hK : IsCompact K)
377408
{P : α → β → Prop} (hP : ∀ y ∈ K, ∀ᶠ z : α × β in 𝓝 (x₀, y), P z.1 z.2) :
378409
∀ᶠ x in 𝓝 x₀, ∀ y ∈ K, P x y := by
379-
refine' hK.induction_on _ _ _ _
380-
· exact eventually_of_forall fun x y => False.elim
381-
· intro s t hst ht
382-
refine' ht.mono fun x h y hys => h y <| hst hys
383-
· intro s t hs ht
384-
filter_upwards [hs, ht]
385-
rintro x h1 h2 y (hys | hyt)
386-
exacts [h1 y hys, h2 y hyt]
387-
· intro y hyK
388-
specialize hP y hyK
389-
rw [nhds_prod_eq, eventually_prod_iff] at hP
390-
rcases hP with ⟨p, hp, q, hq, hpq⟩
391-
exact ⟨{ y | q y }, mem_nhdsWithin_of_mem_nhds hq, eventually_of_mem hp @hpq⟩
410+
simp only [nhds_prod_eq, ← eventually_iSup, ← hK.prod_nhdsSet_eq_biSup] at hP
411+
exact hP.curry.mono fun _ h ↦ h.self_of_nhdsSet
392412
#align is_compact.eventually_forall_of_forall_eventually IsCompact.eventually_forall_of_forall_eventually
393413

394414
@[simp]
@@ -640,71 +660,40 @@ theorem inCompact.isBounded_iff : @IsBounded _ (inCompact α) s ↔ ∃ t, IsCom
640660

641661
end Bornology
642662

643-
section TubeLemma
644-
645-
/-- `NhdsContainBoxes s t` means that any open neighborhood of `s × t` in `α × β` includes
646-
a product of an open neighborhood of `s` by an open neighborhood of `t`. -/
647-
def NhdsContainBoxes (s : Set α) (t : Set β) : Prop :=
648-
∀ n : Set (α × β), IsOpen n → (s ×ˢ t ⊆ n) →
649-
∃ (u : Set α) (v : Set β), IsOpen u ∧ IsOpen v ∧ s ⊆ u ∧ t ⊆ v ∧ u ×ˢ v ⊆ n
650-
#align nhds_contain_boxes NhdsContainBoxes
651-
652-
@[symm]
653-
theorem NhdsContainBoxes.symm {s : Set α} {t : Set β} :
654-
NhdsContainBoxes s t → NhdsContainBoxes t s := fun H n hn hp =>
655-
let ⟨u, v, uo, vo, su, tv, p⟩ :=
656-
H (Prod.swap ⁻¹' n) (hn.preimage continuous_swap) (by rwa [← image_subset_iff, image_swap_prod])
657-
⟨v, u, vo, uo, tv, su, by rwa [← image_subset_iff, image_swap_prod] at p⟩
658-
#align nhds_contain_boxes.symm NhdsContainBoxes.symm
659-
660-
theorem NhdsContainBoxes.comm {s : Set α} {t : Set β} :
661-
NhdsContainBoxes s t ↔ NhdsContainBoxes t s :=
662-
Iff.intro NhdsContainBoxes.symm NhdsContainBoxes.symm
663-
#align nhds_contain_boxes.comm NhdsContainBoxes.comm
664-
665-
theorem nhdsContainBoxes_of_singleton {x : α} {y : β} :
666-
NhdsContainBoxes ({x} : Set α) ({y} : Set β) := fun n hn hp =>
667-
let ⟨u, v, uo, vo, xu, yv, hp'⟩ := isOpen_prod_iff.mp hn x y (hp <| by simp)
668-
⟨u, v, uo, vo, by simpa, by simpa, hp'⟩
669-
#align nhds_contain_boxes_of_singleton nhdsContainBoxes_of_singleton
670-
671-
theorem nhdsContainBoxes_of_compact {s : Set α} (hs : IsCompact s) (t : Set β)
672-
(H : ∀ x ∈ s, NhdsContainBoxes ({x} : Set α) t) : NhdsContainBoxes s t := fun n hn hp =>
673-
have :
674-
∀ x : s,
675-
∃ uv : Set α × Set β, IsOpen uv.1 ∧ IsOpen uv.2 ∧ {↑x} ⊆ uv.1 ∧ t ⊆ uv.2 ∧ uv.1 ×ˢ uv.2 ⊆ n :=
676-
fun ⟨x, hx⟩ =>
677-
have : ({x} : Set α) ×ˢ t ⊆ n := Subset.trans (prod_mono (by simpa) Subset.rfl) hp
678-
let ⟨ux, vx, H1⟩ := H x hx n hn this
679-
⟨⟨ux, vx⟩, H1⟩
680-
let ⟨uvs, h⟩ := Classical.axiom_of_choice this
681-
have us_cover : s ⊆ ⋃ i, (uvs i).1 := fun x hx =>
682-
subset_iUnion _ ⟨x, hx⟩ (by simpa using (h ⟨x, hx⟩).2.2.1)
683-
let ⟨s0, s0_cover⟩ := hs.elim_finite_subcover _ (fun i => (h i).1) us_cover
684-
let u := ⋃ i ∈ s0, (uvs i).1
685-
let v := ⋂ i ∈ s0, (uvs i).2
686-
have : IsOpen u := isOpen_biUnion fun i _ => (h i).1
687-
have : IsOpen v := isOpen_biInter s0.finite_toSet fun i _ => (h i).2.1
688-
have : t ⊆ v := subset_iInter₂ fun i _ => (h i).2.2.2.1
689-
have : u ×ˢ v ⊆ n := fun ⟨x', y'⟩ ⟨hx', hy'⟩ =>
690-
have : ∃ i ∈ s0, x' ∈ (uvs i).1 := by simpa using hx'
691-
let ⟨i, is0, hi⟩ := this
692-
(h i).2.2.2.2 ⟨hi, (biInter_subset_of_mem is0 : v ⊆ (uvs i).2) hy'⟩
693-
⟨u, v, ‹IsOpen u›, ‹IsOpen v›, s0_cover, ‹t ⊆ v›, ‹u ×ˢ v ⊆ n›⟩
694-
#align nhds_contain_boxes_of_compact nhdsContainBoxes_of_compact
663+
#noalign nhds_contain_boxes
664+
#noalign nhds_contain_boxes.symm
665+
#noalign nhds_contain_boxes.comm
666+
#noalign nhds_contain_boxes_of_singleton
667+
#noalign nhds_contain_boxes_of_compact
668+
669+
/-- If `s` and `t` are compact sets, then the set neighborhoods filter of `s ×ˢ t`
670+
is the product of set neighborhoods filters for `s` and `t`.
671+
672+
For general sets, only the `≤` inequality holds, see `nhdsSet_prod_le`. -/
673+
theorem IsCompact.nhdsSet_prod_eq {s : Set α} {t : Set β} (hs : IsCompact s) (ht : IsCompact t) :
674+
𝓝ˢ (s ×ˢ t) = 𝓝ˢ s ×ˢ 𝓝ˢ t := by
675+
simp_rw [hs.nhdsSet_prod_eq_biSup, ht.prod_nhdsSet_eq_biSup, nhdsSet, sSup_image, biSup_prod,
676+
nhds_prod_eq]
677+
678+
/-- The product of a neighborhood of `s` and a neighborhood of `t` is a neighborhood of `s ×ˢ t`,
679+
formulated in terms of a filter inequality. -/
680+
theorem nhdsSet_prod_le (s : Set α) (t : Set β) : 𝓝ˢ (s ×ˢ t) ≤ 𝓝ˢ s ×ˢ 𝓝ˢ t :=
681+
((hasBasis_nhdsSet _).prod (hasBasis_nhdsSet _)).ge_iff.2 fun (_u, _v) ⟨⟨huo, hsu⟩, hvo, htv⟩ ↦
682+
(huo.prod hvo).mem_nhdsSet.2 <| prod_mono hsu htv
695683

696684
/-- If `s` and `t` are compact sets and `n` is an open neighborhood of `s × t`, then there exist
697-
open neighborhoods `u ⊇ s` and `v ⊇ t` such that `u × v ⊆ n`. -/
685+
open neighborhoods `u ⊇ s` and `v ⊇ t` such that `u × v ⊆ n`.
686+
687+
See also `IsCompact.nhdsSet_prod_eq`. -/
698688
theorem generalized_tube_lemma {s : Set α} (hs : IsCompact s) {t : Set β} (ht : IsCompact t)
699689
{n : Set (α × β)} (hn : IsOpen n) (hp : s ×ˢ t ⊆ n) :
700-
∃ (u : Set α) (v : Set β), IsOpen u ∧ IsOpen v ∧ s ⊆ u ∧ t ⊆ v ∧ u ×ˢ v ⊆ n :=
701-
have := nhdsContainBoxes_of_compact hs t fun x _ => NhdsContainBoxes.symm <|
702-
nhdsContainBoxes_of_compact ht {x} fun _ _ => nhdsContainBoxes_of_singleton
703-
this n hn hp
690+
∃ (u : Set α) (v : Set β), IsOpen u ∧ IsOpen v ∧ s ⊆ u ∧ t ⊆ v ∧ u ×ˢ v ⊆ n := by
691+
rw [← hn.mem_nhdsSet, hs.nhdsSet_prod_eq ht,
692+
((hasBasis_nhdsSet _).prod (hasBasis_nhdsSet _)).mem_iff] at hp
693+
rcases hp with ⟨⟨u, v⟩, ⟨⟨huo, hsu⟩, hvo, htv⟩, hn⟩
694+
exact ⟨u, v, huo, hvo, hsu, htv, hn⟩
704695
#align generalized_tube_lemma generalized_tube_lemma
705696

706-
end TubeLemma
707-
708697
/-- Type class for compact spaces. Separation is sometimes included in the definition, especially
709698
in the French literature, but we do not include it here. -/
710699
class CompactSpace (α : Type*) [TopologicalSpace α] : Prop where

0 commit comments

Comments
 (0)