@@ -220,9 +220,8 @@ theorem IsCompact.disjoint_nhdsSet_left {l : Filter α} (hs : IsCompact s) :
220
220
choose! U hxU hUl using fun x hx => (nhds_basis_opens x).disjoint_iff_left.1 (H x hx)
221
221
choose hxU hUo using hxU
222
222
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⟩, ?_⟩
226
225
rw [compl_iUnion₂, biInter_finset_mem]
227
226
exact fun x hx => hUl x (hts x hx)
228
227
#align is_compact.disjoint_nhds_set_left IsCompact.disjoint_nhdsSet_left
@@ -369,26 +368,47 @@ theorem isCompact_iff_finite_subfamily_closed :
369
368
⟨fun hs => hs.elim_finite_subfamily_closed, isCompact_of_finite_subfamily_closed⟩
370
369
#align is_compact_iff_finite_subfamily_closed isCompact_iff_finite_subfamily_closed
371
370
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
+
372
400
/-- To show that `∀ y ∈ K, P x y` holds for `x` close enough to `x₀` when `K` is compact,
373
401
it is sufficient to show that for all `y₀ ∈ K` there `P x y` holds for `(x, y)` close enough
374
402
to `(x₀, y₀)`.
403
+
404
+ Provided for backwards compatibility,
405
+ see `IsCompact.mem_prod_nhdsSet_of_forall` for a stronger statement.
375
406
-/
376
407
theorem IsCompact.eventually_forall_of_forall_eventually {x₀ : α} {K : Set β} (hK : IsCompact K)
377
408
{P : α → β → Prop } (hP : ∀ y ∈ K, ∀ᶠ z : α × β in 𝓝 (x₀, y), P z.1 z.2 ) :
378
409
∀ᶠ 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
392
412
#align is_compact.eventually_forall_of_forall_eventually IsCompact.eventually_forall_of_forall_eventually
393
413
394
414
@[simp]
@@ -640,71 +660,40 @@ theorem inCompact.isBounded_iff : @IsBounded _ (inCompact α) s ↔ ∃ t, IsCom
640
660
641
661
end Bornology
642
662
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
695
683
696
684
/-- 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`. -/
698
688
theorem generalized_tube_lemma {s : Set α} (hs : IsCompact s) {t : Set β} (ht : IsCompact t)
699
689
{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⟩
704
695
#align generalized_tube_lemma generalized_tube_lemma
705
696
706
- end TubeLemma
707
-
708
697
/-- Type class for compact spaces. Separation is sometimes included in the definition, especially
709
698
in the French literature, but we do not include it here. -/
710
699
class CompactSpace (α : Type *) [TopologicalSpace α] : Prop where
0 commit comments