topology.locally_finite
⟷
Mathlib.Topology.LocallyFinite
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(last sync)
𝓝[⋃ i, s i] a
(#18321)
Add theorem nhds_within_eq_nhds
, nhds_within_bUnion
, nhds_within_sUnion
, nhds_within_Union
, nhds_within_inter_of_mem'
.
Add locally_finite.nhds_within_Union
, use it to golf locally_finite.is_closed_Union
and locally_finite.closure_Union
.
Reformulate continuous_subtype_nhds_cover
in terms of continuous_on
, rename to continuous_of_cover_nhds
.
Reformulate continuous_subtype_is_closed_cover
in terms of continuous_on
, several versions are named locally_finite.continuous_on_Union
, locally_finite.continuous
, and primed versions of these lemmas.
Reorder imports.
Co-authored-by: Yaël Dillies <yael.dillies@gmail.com>
@@ -3,7 +3,7 @@ Copyright (c) 2022 Yury Kudryashov. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Yury Kudryashov
-/
-import topology.basic
+import topology.continuous_on
import order.filter.small_sets
/-!
@@ -69,6 +69,50 @@ lemma exists_mem_basis {ι' : Sort*} (hf : locally_finite f) {p : ι' → Prop}
let ⟨i, hpi, hi⟩ := hb.small_sets.eventually_iff.mp (hf.eventually_small_sets x)
in ⟨i, hpi, hi subset.rfl⟩
+protected theorem nhds_within_Union (hf : locally_finite f) (a : X) :
+ 𝓝[⋃ i, f i] a = ⨆ i, 𝓝[f i] a :=
+begin
+ rcases hf a with ⟨U, haU, hfin⟩,
+ refine le_antisymm _ (supr_le $ λ i, nhds_within_mono _ (subset_Union _ _)),
+ calc 𝓝[⋃ i, f i] a = 𝓝[⋃ i, f i ∩ U] a :
+ by rw [← Union_inter, ← nhds_within_inter_of_mem' (nhds_within_le_nhds haU)]
+ ... = 𝓝[⋃ i ∈ {j | (f j ∩ U).nonempty}, (f i ∩ U)] a :
+ by simp only [mem_set_of_eq, Union_nonempty_self]
+ ... = ⨆ i ∈ {j | (f j ∩ U).nonempty}, 𝓝[f i ∩ U] a :
+ nhds_within_bUnion hfin _ _
+ ... ≤ ⨆ i, 𝓝[f i ∩ U] a : supr₂_le_supr _ _
+ ... ≤ ⨆ i, 𝓝[f i] a : supr_mono (λ i, nhds_within_mono _ $ inter_subset_left _ _)
+end
+
+lemma continuous_on_Union' {g : X → Y} (hf : locally_finite f)
+ (hc : ∀ i x, x ∈ closure (f i) → continuous_within_at g (f i) x) :
+ continuous_on g (⋃ i, f i) :=
+begin
+ rintro x -,
+ rw [continuous_within_at, hf.nhds_within_Union, tendsto_supr],
+ intro i,
+ by_cases hx : x ∈ closure (f i),
+ { exact hc i _ hx },
+ { rw [mem_closure_iff_nhds_within_ne_bot, not_ne_bot] at hx,
+ rw [hx],
+ exact tendsto_bot }
+end
+
+lemma continuous_on_Union {g : X → Y} (hf : locally_finite f) (h_cl : ∀ i, is_closed (f i))
+ (h_cont : ∀ i, continuous_on g (f i)) :
+ continuous_on g (⋃ i, f i) :=
+hf.continuous_on_Union' $ λ i x hx, h_cont i x $ (h_cl i).closure_subset hx
+
+protected lemma continuous' {g : X → Y} (hf : locally_finite f) (h_cov : (⋃ i, f i) = univ)
+ (hc : ∀ i x, x ∈ closure (f i) → continuous_within_at g (f i) x) :
+ continuous g :=
+continuous_iff_continuous_on_univ.2 $ h_cov ▸ hf.continuous_on_Union' hc
+
+protected lemma continuous {g : X → Y} (hf : locally_finite f) (h_cov : (⋃ i, f i) = univ)
+ (h_cl : ∀ i, is_closed (f i)) (h_cont : ∀ i, continuous_on g (f i)) :
+ continuous g :=
+continuous_iff_continuous_on_univ.2 $ h_cov ▸ hf.continuous_on_Union h_cl h_cont
+
protected lemma closure (hf : locally_finite f) : locally_finite (λ i, closure (f i)) :=
begin
intro x,
@@ -78,26 +122,15 @@ begin
(inter_subset_inter_right _ interior_subset)
end
-lemma is_closed_Union (hf : locally_finite f) (hc : ∀i, is_closed (f i)) :
- is_closed (⋃i, f i) :=
+lemma closure_Union (h : locally_finite f) : closure (⋃ i, f i) = ⋃ i, closure (f i) :=
begin
- simp only [← is_open_compl_iff, compl_Union, is_open_iff_mem_nhds, mem_Inter],
- intros a ha,
- replace ha : ∀ i, (f i)ᶜ ∈ 𝓝 a := λ i, (hc i).is_open_compl.mem_nhds (ha i),
- rcases hf a with ⟨t, h_nhds, h_fin⟩,
- have : t ∩ (⋂ i ∈ {i | (f i ∩ t).nonempty}, (f i)ᶜ) ∈ 𝓝 a,
- from inter_mem h_nhds ((bInter_mem h_fin).2 (λ i _, ha i)),
- filter_upwards [this],
- simp only [mem_inter_iff, mem_Inter],
- rintros b ⟨hbt, hn⟩ i hfb,
- exact hn i ⟨b, hfb, hbt⟩ hfb,
+ ext x,
+ simp only [mem_closure_iff_nhds_within_ne_bot, h.nhds_within_Union, supr_ne_bot, mem_Union]
end
-lemma closure_Union (h : locally_finite f) : closure (⋃ i, f i) = ⋃ i, closure (f i) :=
-subset.antisymm
- (closure_minimal (Union_mono $ λ _, subset_closure) $
- h.closure.is_closed_Union $ λ _, is_closed_closure)
- (Union_subset $ λ i, closure_mono $ subset_Union _ _)
+lemma is_closed_Union (hf : locally_finite f) (hc : ∀ i, is_closed (f i)) :
+ is_closed (⋃ i, f i) :=
+by simp only [← closure_eq_iff_is_closed, hf.closure_Union, (hc _).closure_eq]
/-- If `f : β → set α` is a locally finite family of closed sets, then for any `x : α`, the
intersection of the complements to `f i`, `x ∉ f i`, is a neighbourhood of `x`. -/
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
@@ -18,7 +18,7 @@ In this file we give the definition and prove basic properties of locally finite
/- locally finite family [General Topology (Bourbaki, 1995)] -/
open set function filter
-open_locale topological_space filter
+open_locale topology filter
universe u
variables {ι : Type u} {ι' α X Y : Type*} [topological_space X] [topological_space Y]
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(first ported)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -127,7 +127,7 @@ theorem continuousOn_iUnion' {g : X → Y} (hf : LocallyFinite f)
intro i
by_cases hx : x ∈ closure (f i)
· exact hc i _ hx
- · rw [mem_closure_iff_nhdsWithin_neBot, not_ne_bot] at hx
+ · rw [mem_closure_iff_nhdsWithin_neBot, not_ne_bot] at hx
rw [hx]
exact tendsto_bot
#align locally_finite.continuous_on_Union' LocallyFinite.continuousOn_iUnion'
@@ -188,7 +188,7 @@ theorem iInter_compl_mem_nhds (hf : LocallyFinite f) (hc : ∀ i, IsClosed (f i)
by
refine' IsOpen.mem_nhds _ (mem_Inter₂.2 fun i => id)
suffices IsClosed (⋃ i : { i // x ∉ f i }, f i) by
- rwa [← isOpen_compl_iff, compl_Union, Inter_subtype] at this
+ rwa [← isOpen_compl_iff, compl_Union, Inter_subtype] at this
exact (hf.comp_injective Subtype.coe_injective).isClosed_iUnion_of_finite fun i => hc _
#align locally_finite.Inter_compl_mem_nhds LocallyFinite.iInter_compl_mem_nhds
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,8 +3,8 @@ Copyright (c) 2022 Yury Kudryashov. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Yury Kudryashov
-/
-import Mathbin.Topology.ContinuousOn
-import Mathbin.Order.Filter.SmallSets
+import Topology.ContinuousOn
+import Order.Filter.SmallSets
#align_import topology.locally_finite from "leanprover-community/mathlib"@"55d771df074d0dd020139ee1cd4b95521422df9f"
mathlib commit https://github.com/leanprover-community/mathlib/commit/442a83d738cb208d3600056c489be16900ba701d
@@ -189,7 +189,7 @@ theorem iInter_compl_mem_nhds (hf : LocallyFinite f) (hc : ∀ i, IsClosed (f i)
refine' IsOpen.mem_nhds _ (mem_Inter₂.2 fun i => id)
suffices IsClosed (⋃ i : { i // x ∉ f i }, f i) by
rwa [← isOpen_compl_iff, compl_Union, Inter_subtype] at this
- exact (hf.comp_injective Subtype.coe_injective).isClosed_iUnion fun i => hc _
+ exact (hf.comp_injective Subtype.coe_injective).isClosed_iUnion_of_finite fun i => hc _
#align locally_finite.Inter_compl_mem_nhds LocallyFinite.iInter_compl_mem_nhds
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/63721b2c3eba6c325ecf8ae8cca27155a4f6306f
@@ -81,7 +81,7 @@ theorem locallyFinite_iff_smallSets :
LocallyFinite f ↔ ∀ x, ∀ᶠ s in (𝓝 x).smallSets, {i | (f i ∩ s).Nonempty}.Finite :=
forall_congr' fun x =>
Iff.symm <|
- eventually_small_sets' fun s t hst ht =>
+ eventually_smallSets' fun s t hst ht =>
ht.Subset fun i hi => hi.mono <| inter_subset_inter_right _ hst
#align locally_finite_iff_small_sets locallyFinite_iff_smallSets
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,15 +2,12 @@
Copyright (c) 2022 Yury Kudryashov. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Yury Kudryashov
-
-! This file was ported from Lean 3 source module topology.locally_finite
-! leanprover-community/mathlib commit 55d771df074d0dd020139ee1cd4b95521422df9f
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.Topology.ContinuousOn
import Mathbin.Order.Filter.SmallSets
+#align_import topology.locally_finite from "leanprover-community/mathlib"@"55d771df074d0dd020139ee1cd4b95521422df9f"
+
/-!
### Locally finite families of sets
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -42,33 +42,44 @@ def LocallyFinite (f : ι → Set X) :=
#align locally_finite LocallyFinite
-/
+#print locallyFinite_of_finite /-
theorem locallyFinite_of_finite [Finite ι] (f : ι → Set X) : LocallyFinite f := fun x =>
⟨univ, univ_mem, toFinite _⟩
#align locally_finite_of_finite locallyFinite_of_finite
+-/
namespace LocallyFinite
+#print LocallyFinite.point_finite /-
theorem point_finite (hf : LocallyFinite f) (x : X) : {b | x ∈ f b}.Finite :=
let ⟨t, hxt, ht⟩ := hf x
ht.Subset fun b hb => ⟨x, hb, mem_of_mem_nhds hxt⟩
#align locally_finite.point_finite LocallyFinite.point_finite
+-/
+#print LocallyFinite.subset /-
protected theorem subset (hf : LocallyFinite f) (hg : ∀ i, g i ⊆ f i) : LocallyFinite g := fun a =>
let ⟨t, ht₁, ht₂⟩ := hf a
⟨t, ht₁, ht₂.Subset fun i hi => hi.mono <| inter_subset_inter (hg i) Subset.rfl⟩
#align locally_finite.subset LocallyFinite.subset
+-/
+#print LocallyFinite.comp_injOn /-
theorem comp_injOn {g : ι' → ι} (hf : LocallyFinite f) (hg : InjOn g {i | (f (g i)).Nonempty}) :
LocallyFinite (f ∘ g) := fun x =>
let ⟨t, htx, htf⟩ := hf x
⟨t, htx, htf.Preimage <| hg.mono fun i hi => hi.out.mono <| inter_subset_left _ _⟩
#align locally_finite.comp_inj_on LocallyFinite.comp_injOn
+-/
+#print LocallyFinite.comp_injective /-
theorem comp_injective {g : ι' → ι} (hf : LocallyFinite f) (hg : Injective g) :
LocallyFinite (f ∘ g) :=
hf.comp_injOn (hg.InjOn _)
#align locally_finite.comp_injective LocallyFinite.comp_injective
+-/
+#print locallyFinite_iff_smallSets /-
theorem locallyFinite_iff_smallSets :
LocallyFinite f ↔ ∀ x, ∀ᶠ s in (𝓝 x).smallSets, {i | (f i ∩ s).Nonempty}.Finite :=
forall_congr' fun x =>
@@ -76,18 +87,24 @@ theorem locallyFinite_iff_smallSets :
eventually_small_sets' fun s t hst ht =>
ht.Subset fun i hi => hi.mono <| inter_subset_inter_right _ hst
#align locally_finite_iff_small_sets locallyFinite_iff_smallSets
+-/
+#print LocallyFinite.eventually_smallSets /-
protected theorem eventually_smallSets (hf : LocallyFinite f) (x : X) :
∀ᶠ s in (𝓝 x).smallSets, {i | (f i ∩ s).Nonempty}.Finite :=
locallyFinite_iff_smallSets.mp hf x
#align locally_finite.eventually_small_sets LocallyFinite.eventually_smallSets
+-/
+#print LocallyFinite.exists_mem_basis /-
theorem exists_mem_basis {ι' : Sort _} (hf : LocallyFinite f) {p : ι' → Prop} {s : ι' → Set X}
{x : X} (hb : (𝓝 x).HasBasis p s) : ∃ (i : _) (hi : p i), {j | (f j ∩ s i).Nonempty}.Finite :=
let ⟨i, hpi, hi⟩ := hb.smallSets.eventually_iff.mp (hf.eventually_smallSets x)
⟨i, hpi, hi Subset.rfl⟩
#align locally_finite.exists_mem_basis LocallyFinite.exists_mem_basis
+-/
+#print LocallyFinite.nhdsWithin_iUnion /-
protected theorem nhdsWithin_iUnion (hf : LocallyFinite f) (a : X) :
𝓝[⋃ i, f i] a = ⨆ i, 𝓝[f i] a :=
by
@@ -102,7 +119,9 @@ protected theorem nhdsWithin_iUnion (hf : LocallyFinite f) (a : X) :
_ ≤ ⨆ i, 𝓝[f i ∩ U] a := (iSup₂_le_iSup _ _)
_ ≤ ⨆ i, 𝓝[f i] a := iSup_mono fun i => nhdsWithin_mono _ <| inter_subset_left _ _
#align locally_finite.nhds_within_Union LocallyFinite.nhdsWithin_iUnion
+-/
+#print LocallyFinite.continuousOn_iUnion' /-
theorem continuousOn_iUnion' {g : X → Y} (hf : LocallyFinite f)
(hc : ∀ i x, x ∈ closure (f i) → ContinuousWithinAt g (f i) x) : ContinuousOn g (⋃ i, f i) :=
by
@@ -115,22 +134,30 @@ theorem continuousOn_iUnion' {g : X → Y} (hf : LocallyFinite f)
rw [hx]
exact tendsto_bot
#align locally_finite.continuous_on_Union' LocallyFinite.continuousOn_iUnion'
+-/
+#print LocallyFinite.continuousOn_iUnion /-
theorem continuousOn_iUnion {g : X → Y} (hf : LocallyFinite f) (h_cl : ∀ i, IsClosed (f i))
(h_cont : ∀ i, ContinuousOn g (f i)) : ContinuousOn g (⋃ i, f i) :=
hf.continuousOn_iUnion' fun i x hx => h_cont i x <| (h_cl i).closure_subset hx
#align locally_finite.continuous_on_Union LocallyFinite.continuousOn_iUnion
+-/
+#print LocallyFinite.continuous' /-
protected theorem continuous' {g : X → Y} (hf : LocallyFinite f) (h_cov : (⋃ i, f i) = univ)
(hc : ∀ i x, x ∈ closure (f i) → ContinuousWithinAt g (f i) x) : Continuous g :=
continuous_iff_continuousOn_univ.2 <| h_cov ▸ hf.continuousOn_iUnion' hc
#align locally_finite.continuous' LocallyFinite.continuous'
+-/
+#print LocallyFinite.continuous /-
protected theorem continuous {g : X → Y} (hf : LocallyFinite f) (h_cov : (⋃ i, f i) = univ)
(h_cl : ∀ i, IsClosed (f i)) (h_cont : ∀ i, ContinuousOn g (f i)) : Continuous g :=
continuous_iff_continuousOn_univ.2 <| h_cov ▸ hf.continuousOn_iUnion h_cl h_cont
#align locally_finite.continuous LocallyFinite.continuous
+-/
+#print LocallyFinite.closure /-
protected theorem closure (hf : LocallyFinite f) : LocallyFinite fun i => closure (f i) :=
by
intro x
@@ -140,17 +167,23 @@ protected theorem closure (hf : LocallyFinite f) : LocallyFinite fun i => closur
(hi.mono is_open_interior.closure_inter).of_closure.mono
(inter_subset_inter_right _ interior_subset)
#align locally_finite.closure LocallyFinite.closure
+-/
+#print LocallyFinite.closure_iUnion /-
theorem closure_iUnion (h : LocallyFinite f) : closure (⋃ i, f i) = ⋃ i, closure (f i) :=
by
ext x
simp only [mem_closure_iff_nhdsWithin_neBot, h.nhds_within_Union, supr_ne_bot, mem_Union]
#align locally_finite.closure_Union LocallyFinite.closure_iUnion
+-/
+#print LocallyFinite.isClosed_iUnion /-
theorem isClosed_iUnion (hf : LocallyFinite f) (hc : ∀ i, IsClosed (f i)) : IsClosed (⋃ i, f i) :=
by simp only [← closure_eq_iff_isClosed, hf.closure_Union, (hc _).closure_eq]
#align locally_finite.is_closed_Union LocallyFinite.isClosed_iUnion
+-/
+#print LocallyFinite.iInter_compl_mem_nhds /-
/-- If `f : β → set α` is a locally finite family of closed sets, then for any `x : α`, the
intersection of the complements to `f i`, `x ∉ f i`, is a neighbourhood of `x`. -/
theorem iInter_compl_mem_nhds (hf : LocallyFinite f) (hc : ∀ i, IsClosed (f i)) (x : X) :
@@ -161,6 +194,7 @@ theorem iInter_compl_mem_nhds (hf : LocallyFinite f) (hc : ∀ i, IsClosed (f i)
rwa [← isOpen_compl_iff, compl_Union, Inter_subtype] at this
exact (hf.comp_injective Subtype.coe_injective).isClosed_iUnion fun i => hc _
#align locally_finite.Inter_compl_mem_nhds LocallyFinite.iInter_compl_mem_nhds
+-/
#print LocallyFinite.exists_forall_eventually_eq_prod /-
/-- Let `f : ℕ → Π a, β a` be a sequence of (dependent) functions on a topological space. Suppose
@@ -213,40 +247,52 @@ theorem exists_forall_eventually_atTop_eventuallyEq {f : ℕ → X → α}
#align locally_finite.exists_forall_eventually_at_top_eventually_eq LocallyFinite.exists_forall_eventually_atTop_eventuallyEq
-/
+#print LocallyFinite.preimage_continuous /-
theorem preimage_continuous {g : Y → X} (hf : LocallyFinite f) (hg : Continuous g) :
LocallyFinite fun i => g ⁻¹' f i := fun x =>
let ⟨s, hsx, hs⟩ := hf (g x)
⟨g ⁻¹' s, hg.ContinuousAt hsx, hs.Subset fun i ⟨y, hy⟩ => ⟨g y, hy⟩⟩
#align locally_finite.preimage_continuous LocallyFinite.preimage_continuous
+-/
end LocallyFinite
+#print Equiv.locallyFinite_comp_iff /-
@[simp]
theorem Equiv.locallyFinite_comp_iff (e : ι' ≃ ι) : LocallyFinite (f ∘ e) ↔ LocallyFinite f :=
⟨fun h => by simpa only [(· ∘ ·), e.apply_symm_apply] using h.comp_injective e.symm.injective,
fun h => h.comp_injective e.Injective⟩
#align equiv.locally_finite_comp_iff Equiv.locallyFinite_comp_iff
+-/
+#print locallyFinite_sum /-
theorem locallyFinite_sum {f : Sum ι ι' → Set X} :
LocallyFinite f ↔ LocallyFinite (f ∘ Sum.inl) ∧ LocallyFinite (f ∘ Sum.inr) := by
simp only [locallyFinite_iff_smallSets, ← forall_and, ← finite_preimage_inl_and_inr,
preimage_set_of_eq, (· ∘ ·), eventually_and]
#align locally_finite_sum locallyFinite_sum
+-/
+#print LocallyFinite.sum_elim /-
theorem LocallyFinite.sum_elim {g : ι' → Set X} (hf : LocallyFinite f) (hg : LocallyFinite g) :
LocallyFinite (Sum.elim f g) :=
locallyFinite_sum.mpr ⟨hf, hg⟩
#align locally_finite.sum_elim LocallyFinite.sum_elim
+-/
+#print locallyFinite_option /-
theorem locallyFinite_option {f : Option ι → Set X} : LocallyFinite f ↔ LocallyFinite (f ∘ some) :=
by
simp only [← (Equiv.optionEquivSumPUnit.{u} ι).symm.locallyFinite_comp_iff, locallyFinite_sum,
locallyFinite_of_finite, and_true_iff]
rfl
#align locally_finite_option locallyFinite_option
+-/
+#print LocallyFinite.option_elim' /-
theorem LocallyFinite.option_elim' (hf : LocallyFinite f) (s : Set X) :
LocallyFinite (Option.elim' s f) :=
locallyFinite_option.2 hf
#align locally_finite.option_elim LocallyFinite.option_elim'
+-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/7e5137f579de09a059a5ce98f364a04e221aabf0
@@ -101,7 +101,6 @@ protected theorem nhdsWithin_iUnion (hf : LocallyFinite f) (a : X) :
_ = ⨆ i ∈ {j | (f j ∩ U).Nonempty}, 𝓝[f i ∩ U] a := (nhdsWithin_biUnion hfin _ _)
_ ≤ ⨆ i, 𝓝[f i ∩ U] a := (iSup₂_le_iSup _ _)
_ ≤ ⨆ i, 𝓝[f i] a := iSup_mono fun i => nhdsWithin_mono _ <| inter_subset_left _ _
-
#align locally_finite.nhds_within_Union LocallyFinite.nhdsWithin_iUnion
theorem continuousOn_iUnion' {g : X → Y} (hf : LocallyFinite f)
@@ -187,7 +186,6 @@ theorem exists_forall_eventually_eq_prod {π : X → Sort _} {f : ℕ → ∀ x
f n y = f (N x + 1) y := hN _ _ hn _ hy
_ = f (max (N x + 1) (N y + 1)) y := (hN _ _ (le_max_left _ _) _ hy).symm
_ = f (N y + 1) y := hN _ _ (le_max_right _ _) _ (mem_of_mem_nhds <| hUx y)
-
#align locally_finite.exists_forall_eventually_eq_prod LocallyFinite.exists_forall_eventually_eq_prod
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -38,7 +38,7 @@ variable {ι : Type u} {ι' α X Y : Type _} [TopologicalSpace X] [TopologicalSp
/-- A family of sets in `set X` is locally finite if at every point `x : X`,
there is a neighborhood of `x` which meets only finitely many sets in the family. -/
def LocallyFinite (f : ι → Set X) :=
- ∀ x : X, ∃ t ∈ 𝓝 x, { i | (f i ∩ t).Nonempty }.Finite
+ ∀ x : X, ∃ t ∈ 𝓝 x, {i | (f i ∩ t).Nonempty}.Finite
#align locally_finite LocallyFinite
-/
@@ -48,7 +48,7 @@ theorem locallyFinite_of_finite [Finite ι] (f : ι → Set X) : LocallyFinite f
namespace LocallyFinite
-theorem point_finite (hf : LocallyFinite f) (x : X) : { b | x ∈ f b }.Finite :=
+theorem point_finite (hf : LocallyFinite f) (x : X) : {b | x ∈ f b}.Finite :=
let ⟨t, hxt, ht⟩ := hf x
ht.Subset fun b hb => ⟨x, hb, mem_of_mem_nhds hxt⟩
#align locally_finite.point_finite LocallyFinite.point_finite
@@ -58,7 +58,7 @@ protected theorem subset (hf : LocallyFinite f) (hg : ∀ i, g i ⊆ f i) : Loca
⟨t, ht₁, ht₂.Subset fun i hi => hi.mono <| inter_subset_inter (hg i) Subset.rfl⟩
#align locally_finite.subset LocallyFinite.subset
-theorem comp_injOn {g : ι' → ι} (hf : LocallyFinite f) (hg : InjOn g { i | (f (g i)).Nonempty }) :
+theorem comp_injOn {g : ι' → ι} (hf : LocallyFinite f) (hg : InjOn g {i | (f (g i)).Nonempty}) :
LocallyFinite (f ∘ g) := fun x =>
let ⟨t, htx, htf⟩ := hf x
⟨t, htx, htf.Preimage <| hg.mono fun i hi => hi.out.mono <| inter_subset_left _ _⟩
@@ -70,7 +70,7 @@ theorem comp_injective {g : ι' → ι} (hf : LocallyFinite f) (hg : Injective g
#align locally_finite.comp_injective LocallyFinite.comp_injective
theorem locallyFinite_iff_smallSets :
- LocallyFinite f ↔ ∀ x, ∀ᶠ s in (𝓝 x).smallSets, { i | (f i ∩ s).Nonempty }.Finite :=
+ LocallyFinite f ↔ ∀ x, ∀ᶠ s in (𝓝 x).smallSets, {i | (f i ∩ s).Nonempty}.Finite :=
forall_congr' fun x =>
Iff.symm <|
eventually_small_sets' fun s t hst ht =>
@@ -78,12 +78,12 @@ theorem locallyFinite_iff_smallSets :
#align locally_finite_iff_small_sets locallyFinite_iff_smallSets
protected theorem eventually_smallSets (hf : LocallyFinite f) (x : X) :
- ∀ᶠ s in (𝓝 x).smallSets, { i | (f i ∩ s).Nonempty }.Finite :=
+ ∀ᶠ s in (𝓝 x).smallSets, {i | (f i ∩ s).Nonempty}.Finite :=
locallyFinite_iff_smallSets.mp hf x
#align locally_finite.eventually_small_sets LocallyFinite.eventually_smallSets
theorem exists_mem_basis {ι' : Sort _} (hf : LocallyFinite f) {p : ι' → Prop} {s : ι' → Set X}
- {x : X} (hb : (𝓝 x).HasBasis p s) : ∃ (i : _) (hi : p i), { j | (f j ∩ s i).Nonempty }.Finite :=
+ {x : X} (hb : (𝓝 x).HasBasis p s) : ∃ (i : _) (hi : p i), {j | (f j ∩ s i).Nonempty}.Finite :=
let ⟨i, hpi, hi⟩ := hb.smallSets.eventually_iff.mp (hf.eventually_smallSets x)
⟨i, hpi, hi Subset.rfl⟩
#align locally_finite.exists_mem_basis LocallyFinite.exists_mem_basis
@@ -96,9 +96,9 @@ protected theorem nhdsWithin_iUnion (hf : LocallyFinite f) (a : X) :
calc
𝓝[⋃ i, f i] a = 𝓝[⋃ i, f i ∩ U] a := by
rw [← Union_inter, ← nhdsWithin_inter_of_mem' (nhdsWithin_le_nhds haU)]
- _ = 𝓝[⋃ i ∈ { j | (f j ∩ U).Nonempty }, f i ∩ U] a := by
+ _ = 𝓝[⋃ i ∈ {j | (f j ∩ U).Nonempty}, f i ∩ U] a := by
simp only [mem_set_of_eq, Union_nonempty_self]
- _ = ⨆ i ∈ { j | (f j ∩ U).Nonempty }, 𝓝[f i ∩ U] a := (nhdsWithin_biUnion hfin _ _)
+ _ = ⨆ i ∈ {j | (f j ∩ U).Nonempty}, 𝓝[f i ∩ U] a := (nhdsWithin_biUnion hfin _ _)
_ ≤ ⨆ i, 𝓝[f i ∩ U] a := (iSup₂_le_iSup _ _)
_ ≤ ⨆ i, 𝓝[f i] a := iSup_mono fun i => nhdsWithin_mono _ <| inter_subset_left _ _
@@ -171,7 +171,7 @@ interval `[N, +∞)` and a neighbourhood of `x`.
We formulate the conclusion in terms of the product of filter `filter.at_top` and `𝓝 x`. -/
theorem exists_forall_eventually_eq_prod {π : X → Sort _} {f : ℕ → ∀ x : X, π x}
- (hf : LocallyFinite fun n => { x | f (n + 1) x ≠ f n x }) :
+ (hf : LocallyFinite fun n => {x | f (n + 1) x ≠ f n x}) :
∃ F : ∀ x : X, π x, ∀ x, ∀ᶠ p : ℕ × X in atTop ×ᶠ 𝓝 x, f p.1 p.2 = F p.2 :=
by
choose U hUx hU using hf
@@ -197,7 +197,7 @@ that the family of sets `s n = {x | f (n + 1) x ≠ f n x}` is locally finite. T
function `F : Π a, β a` such that for any `x`, for sufficiently large values of `n`, we have
`f n y = F y` in a neighbourhood of `x`. -/
theorem exists_forall_eventually_atTop_eventually_eq' {π : X → Sort _} {f : ℕ → ∀ x : X, π x}
- (hf : LocallyFinite fun n => { x | f (n + 1) x ≠ f n x }) :
+ (hf : LocallyFinite fun n => {x | f (n + 1) x ≠ f n x}) :
∃ F : ∀ x : X, π x, ∀ x, ∀ᶠ n : ℕ in atTop, ∀ᶠ y : X in 𝓝 x, f n y = F y :=
hf.exists_forall_eventually_eq_prod.imp fun F hF x => (hF x).curry
#align locally_finite.exists_forall_eventually_at_top_eventually_eq' LocallyFinite.exists_forall_eventually_atTop_eventually_eq'
@@ -209,7 +209,7 @@ that the family of sets `s n = {x | f (n + 1) x ≠ f n x}` is locally finite. T
function `F : α → β` such that for any `x`, for sufficiently large values of `n`, we have
`f n =ᶠ[𝓝 x] F`. -/
theorem exists_forall_eventually_atTop_eventuallyEq {f : ℕ → X → α}
- (hf : LocallyFinite fun n => { x | f (n + 1) x ≠ f n x }) :
+ (hf : LocallyFinite fun n => {x | f (n + 1) x ≠ f n x}) :
∃ F : X → α, ∀ x, ∀ᶠ n : ℕ in atTop, f n =ᶠ[𝓝 x] F :=
hf.exists_forall_eventually_atTop_eventually_eq'
#align locally_finite.exists_forall_eventually_at_top_eventually_eq LocallyFinite.exists_forall_eventually_atTop_eventuallyEq
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -83,7 +83,7 @@ protected theorem eventually_smallSets (hf : LocallyFinite f) (x : X) :
#align locally_finite.eventually_small_sets LocallyFinite.eventually_smallSets
theorem exists_mem_basis {ι' : Sort _} (hf : LocallyFinite f) {p : ι' → Prop} {s : ι' → Set X}
- {x : X} (hb : (𝓝 x).HasBasis p s) : ∃ (i : _)(hi : p i), { j | (f j ∩ s i).Nonempty }.Finite :=
+ {x : X} (hb : (𝓝 x).HasBasis p s) : ∃ (i : _) (hi : p i), { j | (f j ∩ s i).Nonempty }.Finite :=
let ⟨i, hpi, hi⟩ := hb.smallSets.eventually_iff.mp (hf.eventually_smallSets x)
⟨i, hpi, hi Subset.rfl⟩
#align locally_finite.exists_mem_basis LocallyFinite.exists_mem_basis
@@ -112,7 +112,7 @@ theorem continuousOn_iUnion' {g : X → Y} (hf : LocallyFinite f)
intro i
by_cases hx : x ∈ closure (f i)
· exact hc i _ hx
- · rw [mem_closure_iff_nhdsWithin_neBot, not_ne_bot] at hx
+ · rw [mem_closure_iff_nhdsWithin_neBot, not_ne_bot] at hx
rw [hx]
exact tendsto_bot
#align locally_finite.continuous_on_Union' LocallyFinite.continuousOn_iUnion'
@@ -159,7 +159,7 @@ theorem iInter_compl_mem_nhds (hf : LocallyFinite f) (hc : ∀ i, IsClosed (f i)
by
refine' IsOpen.mem_nhds _ (mem_Inter₂.2 fun i => id)
suffices IsClosed (⋃ i : { i // x ∉ f i }, f i) by
- rwa [← isOpen_compl_iff, compl_Union, Inter_subtype] at this
+ rwa [← isOpen_compl_iff, compl_Union, Inter_subtype] at this
exact (hf.comp_injective Subtype.coe_injective).isClosed_iUnion fun i => hc _
#align locally_finite.Inter_compl_mem_nhds LocallyFinite.iInter_compl_mem_nhds
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -27,7 +27,7 @@ In this file we give the definition and prove basic properties of locally finite
-- locally finite family [General Topology (Bourbaki, 1995)]
open Set Function Filter
-open Topology Filter
+open scoped Topology Filter
universe u
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -42,69 +42,33 @@ def LocallyFinite (f : ι → Set X) :=
#align locally_finite LocallyFinite
-/
-/- warning: locally_finite_of_finite -> locallyFinite_of_finite is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {X : Type.{u2}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_3 : Finite.{succ u1} ι] (f : ι -> (Set.{u2} X)), LocallyFinite.{u1, u2} ι X _inst_1 f
-but is expected to have type
- forall {ι : Type.{u2}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] [_inst_3 : Finite.{succ u2} ι] (f : ι -> (Set.{u1} X)), LocallyFinite.{u2, u1} ι X _inst_1 f
-Case conversion may be inaccurate. Consider using '#align locally_finite_of_finite locallyFinite_of_finiteₓ'. -/
theorem locallyFinite_of_finite [Finite ι] (f : ι → Set X) : LocallyFinite f := fun x =>
⟨univ, univ_mem, toFinite _⟩
#align locally_finite_of_finite locallyFinite_of_finite
namespace LocallyFinite
-/- warning: locally_finite.point_finite -> LocallyFinite.point_finite is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {X : Type.{u2}} [_inst_1 : TopologicalSpace.{u2} X] {f : ι -> (Set.{u2} X)}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (forall (x : X), Set.Finite.{u1} ι (setOf.{u1} ι (fun (b : ι) => Membership.Mem.{u2, u2} X (Set.{u2} X) (Set.hasMem.{u2} X) x (f b))))
-but is expected to have type
- forall {ι : Type.{u2}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : ι -> (Set.{u1} X)}, (LocallyFinite.{u2, u1} ι X _inst_1 f) -> (forall (x : X), Set.Finite.{u2} ι (setOf.{u2} ι (fun (b : ι) => Membership.mem.{u1, u1} X (Set.{u1} X) (Set.instMembershipSet.{u1} X) x (f b))))
-Case conversion may be inaccurate. Consider using '#align locally_finite.point_finite LocallyFinite.point_finiteₓ'. -/
theorem point_finite (hf : LocallyFinite f) (x : X) : { b | x ∈ f b }.Finite :=
let ⟨t, hxt, ht⟩ := hf x
ht.Subset fun b hb => ⟨x, hb, mem_of_mem_nhds hxt⟩
#align locally_finite.point_finite LocallyFinite.point_finite
-/- warning: locally_finite.subset -> LocallyFinite.subset is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {X : Type.{u2}} [_inst_1 : TopologicalSpace.{u2} X] {f : ι -> (Set.{u2} X)} {g : ι -> (Set.{u2} X)}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (forall (i : ι), HasSubset.Subset.{u2} (Set.{u2} X) (Set.hasSubset.{u2} X) (g i) (f i)) -> (LocallyFinite.{u1, u2} ι X _inst_1 g)
-but is expected to have type
- forall {ι : Type.{u2}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : ι -> (Set.{u1} X)} {g : ι -> (Set.{u1} X)}, (LocallyFinite.{u2, u1} ι X _inst_1 f) -> (forall (i : ι), HasSubset.Subset.{u1} (Set.{u1} X) (Set.instHasSubsetSet.{u1} X) (g i) (f i)) -> (LocallyFinite.{u2, u1} ι X _inst_1 g)
-Case conversion may be inaccurate. Consider using '#align locally_finite.subset LocallyFinite.subsetₓ'. -/
protected theorem subset (hf : LocallyFinite f) (hg : ∀ i, g i ⊆ f i) : LocallyFinite g := fun a =>
let ⟨t, ht₁, ht₂⟩ := hf a
⟨t, ht₁, ht₂.Subset fun i hi => hi.mono <| inter_subset_inter (hg i) Subset.rfl⟩
#align locally_finite.subset LocallyFinite.subset
-/- warning: locally_finite.comp_inj_on -> LocallyFinite.comp_injOn is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {ι' : Type.{u2}} {X : Type.{u3}} [_inst_1 : TopologicalSpace.{u3} X] {f : ι -> (Set.{u3} X)} {g : ι' -> ι}, (LocallyFinite.{u1, u3} ι X _inst_1 f) -> (Set.InjOn.{u2, u1} ι' ι g (setOf.{u2} ι' (fun (i : ι') => Set.Nonempty.{u3} X (f (g i))))) -> (LocallyFinite.{u2, u3} ι' X _inst_1 (Function.comp.{succ u2, succ u1, succ u3} ι' ι (Set.{u3} X) f g))
-but is expected to have type
- forall {ι : Type.{u3}} {ι' : Type.{u1}} {X : Type.{u2}} [_inst_1 : TopologicalSpace.{u2} X] {f : ι -> (Set.{u2} X)} {g : ι' -> ι}, (LocallyFinite.{u3, u2} ι X _inst_1 f) -> (Set.InjOn.{u1, u3} ι' ι g (setOf.{u1} ι' (fun (i : ι') => Set.Nonempty.{u2} X (f (g i))))) -> (LocallyFinite.{u1, u2} ι' X _inst_1 (Function.comp.{succ u1, succ u3, succ u2} ι' ι (Set.{u2} X) f g))
-Case conversion may be inaccurate. Consider using '#align locally_finite.comp_inj_on LocallyFinite.comp_injOnₓ'. -/
theorem comp_injOn {g : ι' → ι} (hf : LocallyFinite f) (hg : InjOn g { i | (f (g i)).Nonempty }) :
LocallyFinite (f ∘ g) := fun x =>
let ⟨t, htx, htf⟩ := hf x
⟨t, htx, htf.Preimage <| hg.mono fun i hi => hi.out.mono <| inter_subset_left _ _⟩
#align locally_finite.comp_inj_on LocallyFinite.comp_injOn
-/- warning: locally_finite.comp_injective -> LocallyFinite.comp_injective is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {ι' : Type.{u2}} {X : Type.{u3}} [_inst_1 : TopologicalSpace.{u3} X] {f : ι -> (Set.{u3} X)} {g : ι' -> ι}, (LocallyFinite.{u1, u3} ι X _inst_1 f) -> (Function.Injective.{succ u2, succ u1} ι' ι g) -> (LocallyFinite.{u2, u3} ι' X _inst_1 (Function.comp.{succ u2, succ u1, succ u3} ι' ι (Set.{u3} X) f g))
-but is expected to have type
- forall {ι : Type.{u3}} {ι' : Type.{u1}} {X : Type.{u2}} [_inst_1 : TopologicalSpace.{u2} X] {f : ι -> (Set.{u2} X)} {g : ι' -> ι}, (LocallyFinite.{u3, u2} ι X _inst_1 f) -> (Function.Injective.{succ u1, succ u3} ι' ι g) -> (LocallyFinite.{u1, u2} ι' X _inst_1 (Function.comp.{succ u1, succ u3, succ u2} ι' ι (Set.{u2} X) f g))
-Case conversion may be inaccurate. Consider using '#align locally_finite.comp_injective LocallyFinite.comp_injectiveₓ'. -/
theorem comp_injective {g : ι' → ι} (hf : LocallyFinite f) (hg : Injective g) :
LocallyFinite (f ∘ g) :=
hf.comp_injOn (hg.InjOn _)
#align locally_finite.comp_injective LocallyFinite.comp_injective
-/- warning: locally_finite_iff_small_sets -> locallyFinite_iff_smallSets is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {X : Type.{u2}} [_inst_1 : TopologicalSpace.{u2} X] {f : ι -> (Set.{u2} X)}, Iff (LocallyFinite.{u1, u2} ι X _inst_1 f) (forall (x : X), Filter.Eventually.{u2} (Set.{u2} X) (fun (s : Set.{u2} X) => Set.Finite.{u1} ι (setOf.{u1} ι (fun (i : ι) => Set.Nonempty.{u2} X (Inter.inter.{u2} (Set.{u2} X) (Set.hasInter.{u2} X) (f i) s)))) (Filter.smallSets.{u2} X (nhds.{u2} X _inst_1 x)))
-but is expected to have type
- forall {ι : Type.{u2}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : ι -> (Set.{u1} X)}, Iff (LocallyFinite.{u2, u1} ι X _inst_1 f) (forall (x : X), Filter.Eventually.{u1} (Set.{u1} X) (fun (s : Set.{u1} X) => Set.Finite.{u2} ι (setOf.{u2} ι (fun (i : ι) => Set.Nonempty.{u1} X (Inter.inter.{u1} (Set.{u1} X) (Set.instInterSet.{u1} X) (f i) s)))) (Filter.smallSets.{u1} X (nhds.{u1} X _inst_1 x)))
-Case conversion may be inaccurate. Consider using '#align locally_finite_iff_small_sets locallyFinite_iff_smallSetsₓ'. -/
theorem locallyFinite_iff_smallSets :
LocallyFinite f ↔ ∀ x, ∀ᶠ s in (𝓝 x).smallSets, { i | (f i ∩ s).Nonempty }.Finite :=
forall_congr' fun x =>
@@ -113,35 +77,17 @@ theorem locallyFinite_iff_smallSets :
ht.Subset fun i hi => hi.mono <| inter_subset_inter_right _ hst
#align locally_finite_iff_small_sets locallyFinite_iff_smallSets
-/- warning: locally_finite.eventually_small_sets -> LocallyFinite.eventually_smallSets is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {X : Type.{u2}} [_inst_1 : TopologicalSpace.{u2} X] {f : ι -> (Set.{u2} X)}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (forall (x : X), Filter.Eventually.{u2} (Set.{u2} X) (fun (s : Set.{u2} X) => Set.Finite.{u1} ι (setOf.{u1} ι (fun (i : ι) => Set.Nonempty.{u2} X (Inter.inter.{u2} (Set.{u2} X) (Set.hasInter.{u2} X) (f i) s)))) (Filter.smallSets.{u2} X (nhds.{u2} X _inst_1 x)))
-but is expected to have type
- forall {ι : Type.{u2}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : ι -> (Set.{u1} X)}, (LocallyFinite.{u2, u1} ι X _inst_1 f) -> (forall (x : X), Filter.Eventually.{u1} (Set.{u1} X) (fun (s : Set.{u1} X) => Set.Finite.{u2} ι (setOf.{u2} ι (fun (i : ι) => Set.Nonempty.{u1} X (Inter.inter.{u1} (Set.{u1} X) (Set.instInterSet.{u1} X) (f i) s)))) (Filter.smallSets.{u1} X (nhds.{u1} X _inst_1 x)))
-Case conversion may be inaccurate. Consider using '#align locally_finite.eventually_small_sets LocallyFinite.eventually_smallSetsₓ'. -/
protected theorem eventually_smallSets (hf : LocallyFinite f) (x : X) :
∀ᶠ s in (𝓝 x).smallSets, { i | (f i ∩ s).Nonempty }.Finite :=
locallyFinite_iff_smallSets.mp hf x
#align locally_finite.eventually_small_sets LocallyFinite.eventually_smallSets
-/- warning: locally_finite.exists_mem_basis -> LocallyFinite.exists_mem_basis is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {X : Type.{u2}} [_inst_1 : TopologicalSpace.{u2} X] {f : ι -> (Set.{u2} X)} {ι' : Sort.{u3}}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (forall {p : ι' -> Prop} {s : ι' -> (Set.{u2} X)} {x : X}, (Filter.HasBasis.{u2, u3} X ι' (nhds.{u2} X _inst_1 x) p s) -> (Exists.{u3} ι' (fun (i : ι') => Exists.{0} (p i) (fun (hi : p i) => Set.Finite.{u1} ι (setOf.{u1} ι (fun (j : ι) => Set.Nonempty.{u2} X (Inter.inter.{u2} (Set.{u2} X) (Set.hasInter.{u2} X) (f j) (s i))))))))
-but is expected to have type
- forall {ι : Type.{u2}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : ι -> (Set.{u1} X)} {ι' : Sort.{u3}}, (LocallyFinite.{u2, u1} ι X _inst_1 f) -> (forall {p : ι' -> Prop} {s : ι' -> (Set.{u1} X)} {x : X}, (Filter.HasBasis.{u1, u3} X ι' (nhds.{u1} X _inst_1 x) p s) -> (Exists.{u3} ι' (fun (i : ι') => And (p i) (Set.Finite.{u2} ι (setOf.{u2} ι (fun (j : ι) => Set.Nonempty.{u1} X (Inter.inter.{u1} (Set.{u1} X) (Set.instInterSet.{u1} X) (f j) (s i))))))))
-Case conversion may be inaccurate. Consider using '#align locally_finite.exists_mem_basis LocallyFinite.exists_mem_basisₓ'. -/
theorem exists_mem_basis {ι' : Sort _} (hf : LocallyFinite f) {p : ι' → Prop} {s : ι' → Set X}
{x : X} (hb : (𝓝 x).HasBasis p s) : ∃ (i : _)(hi : p i), { j | (f j ∩ s i).Nonempty }.Finite :=
let ⟨i, hpi, hi⟩ := hb.smallSets.eventually_iff.mp (hf.eventually_smallSets x)
⟨i, hpi, hi Subset.rfl⟩
#align locally_finite.exists_mem_basis LocallyFinite.exists_mem_basis
-/- warning: locally_finite.nhds_within_Union -> LocallyFinite.nhdsWithin_iUnion is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {X : Type.{u2}} [_inst_1 : TopologicalSpace.{u2} X] {f : ι -> (Set.{u2} X)}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (forall (a : X), Eq.{succ u2} (Filter.{u2} X) (nhdsWithin.{u2} X _inst_1 a (Set.iUnion.{u2, succ u1} X ι (fun (i : ι) => f i))) (iSup.{u2, succ u1} (Filter.{u2} X) (ConditionallyCompleteLattice.toHasSup.{u2} (Filter.{u2} X) (CompleteLattice.toConditionallyCompleteLattice.{u2} (Filter.{u2} X) (Filter.completeLattice.{u2} X))) ι (fun (i : ι) => nhdsWithin.{u2} X _inst_1 a (f i))))
-but is expected to have type
- forall {ι : Type.{u2}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : ι -> (Set.{u1} X)}, (LocallyFinite.{u2, u1} ι X _inst_1 f) -> (forall (a : X), Eq.{succ u1} (Filter.{u1} X) (nhdsWithin.{u1} X _inst_1 a (Set.iUnion.{u1, succ u2} X ι (fun (i : ι) => f i))) (iSup.{u1, succ u2} (Filter.{u1} X) (ConditionallyCompleteLattice.toSupSet.{u1} (Filter.{u1} X) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Filter.{u1} X) (Filter.instCompleteLatticeFilter.{u1} X))) ι (fun (i : ι) => nhdsWithin.{u1} X _inst_1 a (f i))))
-Case conversion may be inaccurate. Consider using '#align locally_finite.nhds_within_Union LocallyFinite.nhdsWithin_iUnionₓ'. -/
protected theorem nhdsWithin_iUnion (hf : LocallyFinite f) (a : X) :
𝓝[⋃ i, f i] a = ⨆ i, 𝓝[f i] a :=
by
@@ -158,12 +104,6 @@ protected theorem nhdsWithin_iUnion (hf : LocallyFinite f) (a : X) :
#align locally_finite.nhds_within_Union LocallyFinite.nhdsWithin_iUnion
-/- warning: locally_finite.continuous_on_Union' -> LocallyFinite.continuousOn_iUnion' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {X : Type.{u2}} {Y : Type.{u3}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u3} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (forall (i : ι) (x : X), (Membership.Mem.{u2, u2} X (Set.{u2} X) (Set.hasMem.{u2} X) x (closure.{u2} X _inst_1 (f i))) -> (ContinuousWithinAt.{u2, u3} X Y _inst_1 _inst_2 g (f i) x)) -> (ContinuousOn.{u2, u3} X Y _inst_1 _inst_2 g (Set.iUnion.{u2, succ u1} X ι (fun (i : ι) => f i)))
-but is expected to have type
- forall {ι : Type.{u3}} {X : Type.{u2}} {Y : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u1} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u3, u2} ι X _inst_1 f) -> (forall (i : ι) (x : X), (Membership.mem.{u2, u2} X (Set.{u2} X) (Set.instMembershipSet.{u2} X) x (closure.{u2} X _inst_1 (f i))) -> (ContinuousWithinAt.{u2, u1} X Y _inst_1 _inst_2 g (f i) x)) -> (ContinuousOn.{u2, u1} X Y _inst_1 _inst_2 g (Set.iUnion.{u2, succ u3} X ι (fun (i : ι) => f i)))
-Case conversion may be inaccurate. Consider using '#align locally_finite.continuous_on_Union' LocallyFinite.continuousOn_iUnion'ₓ'. -/
theorem continuousOn_iUnion' {g : X → Y} (hf : LocallyFinite f)
(hc : ∀ i x, x ∈ closure (f i) → ContinuousWithinAt g (f i) x) : ContinuousOn g (⋃ i, f i) :=
by
@@ -177,45 +117,21 @@ theorem continuousOn_iUnion' {g : X → Y} (hf : LocallyFinite f)
exact tendsto_bot
#align locally_finite.continuous_on_Union' LocallyFinite.continuousOn_iUnion'
-/- warning: locally_finite.continuous_on_Union -> LocallyFinite.continuousOn_iUnion is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {X : Type.{u2}} {Y : Type.{u3}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u3} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (forall (i : ι), IsClosed.{u2} X _inst_1 (f i)) -> (forall (i : ι), ContinuousOn.{u2, u3} X Y _inst_1 _inst_2 g (f i)) -> (ContinuousOn.{u2, u3} X Y _inst_1 _inst_2 g (Set.iUnion.{u2, succ u1} X ι (fun (i : ι) => f i)))
-but is expected to have type
- forall {ι : Type.{u3}} {X : Type.{u2}} {Y : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u1} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u3, u2} ι X _inst_1 f) -> (forall (i : ι), IsClosed.{u2} X _inst_1 (f i)) -> (forall (i : ι), ContinuousOn.{u2, u1} X Y _inst_1 _inst_2 g (f i)) -> (ContinuousOn.{u2, u1} X Y _inst_1 _inst_2 g (Set.iUnion.{u2, succ u3} X ι (fun (i : ι) => f i)))
-Case conversion may be inaccurate. Consider using '#align locally_finite.continuous_on_Union LocallyFinite.continuousOn_iUnionₓ'. -/
theorem continuousOn_iUnion {g : X → Y} (hf : LocallyFinite f) (h_cl : ∀ i, IsClosed (f i))
(h_cont : ∀ i, ContinuousOn g (f i)) : ContinuousOn g (⋃ i, f i) :=
hf.continuousOn_iUnion' fun i x hx => h_cont i x <| (h_cl i).closure_subset hx
#align locally_finite.continuous_on_Union LocallyFinite.continuousOn_iUnion
-/- warning: locally_finite.continuous' -> LocallyFinite.continuous' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {X : Type.{u2}} {Y : Type.{u3}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u3} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (Eq.{succ u2} (Set.{u2} X) (Set.iUnion.{u2, succ u1} X ι (fun (i : ι) => f i)) (Set.univ.{u2} X)) -> (forall (i : ι) (x : X), (Membership.Mem.{u2, u2} X (Set.{u2} X) (Set.hasMem.{u2} X) x (closure.{u2} X _inst_1 (f i))) -> (ContinuousWithinAt.{u2, u3} X Y _inst_1 _inst_2 g (f i) x)) -> (Continuous.{u2, u3} X Y _inst_1 _inst_2 g)
-but is expected to have type
- forall {ι : Type.{u3}} {X : Type.{u2}} {Y : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u1} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u3, u2} ι X _inst_1 f) -> (Eq.{succ u2} (Set.{u2} X) (Set.iUnion.{u2, succ u3} X ι (fun (i : ι) => f i)) (Set.univ.{u2} X)) -> (forall (i : ι) (x : X), (Membership.mem.{u2, u2} X (Set.{u2} X) (Set.instMembershipSet.{u2} X) x (closure.{u2} X _inst_1 (f i))) -> (ContinuousWithinAt.{u2, u1} X Y _inst_1 _inst_2 g (f i) x)) -> (Continuous.{u2, u1} X Y _inst_1 _inst_2 g)
-Case conversion may be inaccurate. Consider using '#align locally_finite.continuous' LocallyFinite.continuous'ₓ'. -/
protected theorem continuous' {g : X → Y} (hf : LocallyFinite f) (h_cov : (⋃ i, f i) = univ)
(hc : ∀ i x, x ∈ closure (f i) → ContinuousWithinAt g (f i) x) : Continuous g :=
continuous_iff_continuousOn_univ.2 <| h_cov ▸ hf.continuousOn_iUnion' hc
#align locally_finite.continuous' LocallyFinite.continuous'
-/- warning: locally_finite.continuous -> LocallyFinite.continuous is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {X : Type.{u2}} {Y : Type.{u3}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u3} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (Eq.{succ u2} (Set.{u2} X) (Set.iUnion.{u2, succ u1} X ι (fun (i : ι) => f i)) (Set.univ.{u2} X)) -> (forall (i : ι), IsClosed.{u2} X _inst_1 (f i)) -> (forall (i : ι), ContinuousOn.{u2, u3} X Y _inst_1 _inst_2 g (f i)) -> (Continuous.{u2, u3} X Y _inst_1 _inst_2 g)
-but is expected to have type
- forall {ι : Type.{u3}} {X : Type.{u2}} {Y : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u1} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u3, u2} ι X _inst_1 f) -> (Eq.{succ u2} (Set.{u2} X) (Set.iUnion.{u2, succ u3} X ι (fun (i : ι) => f i)) (Set.univ.{u2} X)) -> (forall (i : ι), IsClosed.{u2} X _inst_1 (f i)) -> (forall (i : ι), ContinuousOn.{u2, u1} X Y _inst_1 _inst_2 g (f i)) -> (Continuous.{u2, u1} X Y _inst_1 _inst_2 g)
-Case conversion may be inaccurate. Consider using '#align locally_finite.continuous LocallyFinite.continuousₓ'. -/
protected theorem continuous {g : X → Y} (hf : LocallyFinite f) (h_cov : (⋃ i, f i) = univ)
(h_cl : ∀ i, IsClosed (f i)) (h_cont : ∀ i, ContinuousOn g (f i)) : Continuous g :=
continuous_iff_continuousOn_univ.2 <| h_cov ▸ hf.continuousOn_iUnion h_cl h_cont
#align locally_finite.continuous LocallyFinite.continuous
-/- warning: locally_finite.closure -> LocallyFinite.closure is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {X : Type.{u2}} [_inst_1 : TopologicalSpace.{u2} X] {f : ι -> (Set.{u2} X)}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (LocallyFinite.{u1, u2} ι X _inst_1 (fun (i : ι) => closure.{u2} X _inst_1 (f i)))
-but is expected to have type
- forall {ι : Type.{u2}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : ι -> (Set.{u1} X)}, (LocallyFinite.{u2, u1} ι X _inst_1 f) -> (LocallyFinite.{u2, u1} ι X _inst_1 (fun (i : ι) => closure.{u1} X _inst_1 (f i)))
-Case conversion may be inaccurate. Consider using '#align locally_finite.closure LocallyFinite.closureₓ'. -/
protected theorem closure (hf : LocallyFinite f) : LocallyFinite fun i => closure (f i) :=
by
intro x
@@ -226,34 +142,16 @@ protected theorem closure (hf : LocallyFinite f) : LocallyFinite fun i => closur
(inter_subset_inter_right _ interior_subset)
#align locally_finite.closure LocallyFinite.closure
-/- warning: locally_finite.closure_Union -> LocallyFinite.closure_iUnion is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {X : Type.{u2}} [_inst_1 : TopologicalSpace.{u2} X] {f : ι -> (Set.{u2} X)}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (Eq.{succ u2} (Set.{u2} X) (closure.{u2} X _inst_1 (Set.iUnion.{u2, succ u1} X ι (fun (i : ι) => f i))) (Set.iUnion.{u2, succ u1} X ι (fun (i : ι) => closure.{u2} X _inst_1 (f i))))
-but is expected to have type
- forall {ι : Type.{u2}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : ι -> (Set.{u1} X)}, (LocallyFinite.{u2, u1} ι X _inst_1 f) -> (Eq.{succ u1} (Set.{u1} X) (closure.{u1} X _inst_1 (Set.iUnion.{u1, succ u2} X ι (fun (i : ι) => f i))) (Set.iUnion.{u1, succ u2} X ι (fun (i : ι) => closure.{u1} X _inst_1 (f i))))
-Case conversion may be inaccurate. Consider using '#align locally_finite.closure_Union LocallyFinite.closure_iUnionₓ'. -/
theorem closure_iUnion (h : LocallyFinite f) : closure (⋃ i, f i) = ⋃ i, closure (f i) :=
by
ext x
simp only [mem_closure_iff_nhdsWithin_neBot, h.nhds_within_Union, supr_ne_bot, mem_Union]
#align locally_finite.closure_Union LocallyFinite.closure_iUnion
-/- warning: locally_finite.is_closed_Union -> LocallyFinite.isClosed_iUnion is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {X : Type.{u2}} [_inst_1 : TopologicalSpace.{u2} X] {f : ι -> (Set.{u2} X)}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (forall (i : ι), IsClosed.{u2} X _inst_1 (f i)) -> (IsClosed.{u2} X _inst_1 (Set.iUnion.{u2, succ u1} X ι (fun (i : ι) => f i)))
-but is expected to have type
- forall {ι : Type.{u2}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : ι -> (Set.{u1} X)}, (LocallyFinite.{u2, u1} ι X _inst_1 f) -> (forall (i : ι), IsClosed.{u1} X _inst_1 (f i)) -> (IsClosed.{u1} X _inst_1 (Set.iUnion.{u1, succ u2} X ι (fun (i : ι) => f i)))
-Case conversion may be inaccurate. Consider using '#align locally_finite.is_closed_Union LocallyFinite.isClosed_iUnionₓ'. -/
theorem isClosed_iUnion (hf : LocallyFinite f) (hc : ∀ i, IsClosed (f i)) : IsClosed (⋃ i, f i) :=
by simp only [← closure_eq_iff_isClosed, hf.closure_Union, (hc _).closure_eq]
#align locally_finite.is_closed_Union LocallyFinite.isClosed_iUnion
-/- warning: locally_finite.Inter_compl_mem_nhds -> LocallyFinite.iInter_compl_mem_nhds is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {X : Type.{u2}} [_inst_1 : TopologicalSpace.{u2} X] {f : ι -> (Set.{u2} X)}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (forall (i : ι), IsClosed.{u2} X _inst_1 (f i)) -> (forall (x : X), Membership.Mem.{u2, u2} (Set.{u2} X) (Filter.{u2} X) (Filter.hasMem.{u2} X) (Set.iInter.{u2, succ u1} X ι (fun (i : ι) => Set.iInter.{u2, 0} X (Not (Membership.Mem.{u2, u2} X (Set.{u2} X) (Set.hasMem.{u2} X) x (f i))) (fun (hi : Not (Membership.Mem.{u2, u2} X (Set.{u2} X) (Set.hasMem.{u2} X) x (f i))) => HasCompl.compl.{u2} (Set.{u2} X) (BooleanAlgebra.toHasCompl.{u2} (Set.{u2} X) (Set.booleanAlgebra.{u2} X)) (f i)))) (nhds.{u2} X _inst_1 x))
-but is expected to have type
- forall {ι : Type.{u2}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : ι -> (Set.{u1} X)}, (LocallyFinite.{u2, u1} ι X _inst_1 f) -> (forall (i : ι), IsClosed.{u1} X _inst_1 (f i)) -> (forall (x : X), Membership.mem.{u1, u1} (Set.{u1} X) (Filter.{u1} X) (instMembershipSetFilter.{u1} X) (Set.iInter.{u1, succ u2} X ι (fun (i : ι) => Set.iInter.{u1, 0} X (Not (Membership.mem.{u1, u1} X (Set.{u1} X) (Set.instMembershipSet.{u1} X) x (f i))) (fun (hi : Not (Membership.mem.{u1, u1} X (Set.{u1} X) (Set.instMembershipSet.{u1} X) x (f i))) => HasCompl.compl.{u1} (Set.{u1} X) (BooleanAlgebra.toHasCompl.{u1} (Set.{u1} X) (Set.instBooleanAlgebraSet.{u1} X)) (f i)))) (nhds.{u1} X _inst_1 x))
-Case conversion may be inaccurate. Consider using '#align locally_finite.Inter_compl_mem_nhds LocallyFinite.iInter_compl_mem_nhdsₓ'. -/
/-- If `f : β → set α` is a locally finite family of closed sets, then for any `x : α`, the
intersection of the complements to `f i`, `x ∉ f i`, is a neighbourhood of `x`. -/
theorem iInter_compl_mem_nhds (hf : LocallyFinite f) (hc : ∀ i, IsClosed (f i)) (x : X) :
@@ -317,12 +215,6 @@ theorem exists_forall_eventually_atTop_eventuallyEq {f : ℕ → X → α}
#align locally_finite.exists_forall_eventually_at_top_eventually_eq LocallyFinite.exists_forall_eventually_atTop_eventuallyEq
-/
-/- warning: locally_finite.preimage_continuous -> LocallyFinite.preimage_continuous is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {X : Type.{u2}} {Y : Type.{u3}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u3} Y] {f : ι -> (Set.{u2} X)} {g : Y -> X}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (Continuous.{u3, u2} Y X _inst_2 _inst_1 g) -> (LocallyFinite.{u1, u3} ι Y _inst_2 (fun (i : ι) => Set.preimage.{u3, u2} Y X g (f i)))
-but is expected to have type
- forall {ι : Type.{u3}} {X : Type.{u2}} {Y : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u1} Y] {f : ι -> (Set.{u2} X)} {g : Y -> X}, (LocallyFinite.{u3, u2} ι X _inst_1 f) -> (Continuous.{u1, u2} Y X _inst_2 _inst_1 g) -> (LocallyFinite.{u3, u1} ι Y _inst_2 (fun (i : ι) => Set.preimage.{u1, u2} Y X g (f i)))
-Case conversion may be inaccurate. Consider using '#align locally_finite.preimage_continuous LocallyFinite.preimage_continuousₓ'. -/
theorem preimage_continuous {g : Y → X} (hf : LocallyFinite f) (hg : Continuous g) :
LocallyFinite fun i => g ⁻¹' f i := fun x =>
let ⟨s, hsx, hs⟩ := hf (g x)
@@ -331,47 +223,23 @@ theorem preimage_continuous {g : Y → X} (hf : LocallyFinite f) (hg : Continuou
end LocallyFinite
-/- warning: equiv.locally_finite_comp_iff -> Equiv.locallyFinite_comp_iff is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {ι' : Type.{u2}} {X : Type.{u3}} [_inst_1 : TopologicalSpace.{u3} X] {f : ι -> (Set.{u3} X)} (e : Equiv.{succ u2, succ u1} ι' ι), Iff (LocallyFinite.{u2, u3} ι' X _inst_1 (Function.comp.{succ u2, succ u1, succ u3} ι' ι (Set.{u3} X) f (coeFn.{max 1 (max (succ u2) (succ u1)) (succ u1) (succ u2), max (succ u2) (succ u1)} (Equiv.{succ u2, succ u1} ι' ι) (fun (_x : Equiv.{succ u2, succ u1} ι' ι) => ι' -> ι) (Equiv.hasCoeToFun.{succ u2, succ u1} ι' ι) e))) (LocallyFinite.{u1, u3} ι X _inst_1 f)
-but is expected to have type
- forall {ι : Type.{u2}} {ι' : Type.{u3}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : ι -> (Set.{u1} X)} (e : Equiv.{succ u3, succ u2} ι' ι), Iff (LocallyFinite.{u3, u1} ι' X _inst_1 (Function.comp.{succ u3, succ u2, succ u1} ι' ι (Set.{u1} X) f (FunLike.coe.{max (succ u2) (succ u3), succ u3, succ u2} (Equiv.{succ u3, succ u2} ι' ι) ι' (fun (_x : ι') => (fun (x._@.Mathlib.Logic.Equiv.Defs._hyg.812 : ι') => ι) _x) (Equiv.instFunLikeEquiv.{succ u3, succ u2} ι' ι) e))) (LocallyFinite.{u2, u1} ι X _inst_1 f)
-Case conversion may be inaccurate. Consider using '#align equiv.locally_finite_comp_iff Equiv.locallyFinite_comp_iffₓ'. -/
@[simp]
theorem Equiv.locallyFinite_comp_iff (e : ι' ≃ ι) : LocallyFinite (f ∘ e) ↔ LocallyFinite f :=
⟨fun h => by simpa only [(· ∘ ·), e.apply_symm_apply] using h.comp_injective e.symm.injective,
fun h => h.comp_injective e.Injective⟩
#align equiv.locally_finite_comp_iff Equiv.locallyFinite_comp_iff
-/- warning: locally_finite_sum -> locallyFinite_sum is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {ι' : Type.{u2}} {X : Type.{u3}} [_inst_1 : TopologicalSpace.{u3} X] {f : (Sum.{u1, u2} ι ι') -> (Set.{u3} X)}, Iff (LocallyFinite.{max u1 u2, u3} (Sum.{u1, u2} ι ι') X _inst_1 f) (And (LocallyFinite.{u1, u3} ι X _inst_1 (Function.comp.{succ u1, max (succ u1) (succ u2), succ u3} ι (Sum.{u1, u2} ι ι') (Set.{u3} X) f (Sum.inl.{u1, u2} ι ι'))) (LocallyFinite.{u2, u3} ι' X _inst_1 (Function.comp.{succ u2, max (succ u1) (succ u2), succ u3} ι' (Sum.{u1, u2} ι ι') (Set.{u3} X) f (Sum.inr.{u1, u2} ι ι'))))
-but is expected to have type
- forall {ι : Type.{u3}} {ι' : Type.{u2}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : (Sum.{u3, u2} ι ι') -> (Set.{u1} X)}, Iff (LocallyFinite.{max u3 u2, u1} (Sum.{u3, u2} ι ι') X _inst_1 f) (And (LocallyFinite.{u3, u1} ι X _inst_1 (Function.comp.{succ u3, max (succ u3) (succ u2), succ u1} ι (Sum.{u3, u2} ι ι') (Set.{u1} X) f (Sum.inl.{u3, u2} ι ι'))) (LocallyFinite.{u2, u1} ι' X _inst_1 (Function.comp.{succ u2, max (succ u3) (succ u2), succ u1} ι' (Sum.{u3, u2} ι ι') (Set.{u1} X) f (Sum.inr.{u3, u2} ι ι'))))
-Case conversion may be inaccurate. Consider using '#align locally_finite_sum locallyFinite_sumₓ'. -/
theorem locallyFinite_sum {f : Sum ι ι' → Set X} :
LocallyFinite f ↔ LocallyFinite (f ∘ Sum.inl) ∧ LocallyFinite (f ∘ Sum.inr) := by
simp only [locallyFinite_iff_smallSets, ← forall_and, ← finite_preimage_inl_and_inr,
preimage_set_of_eq, (· ∘ ·), eventually_and]
#align locally_finite_sum locallyFinite_sum
-/- warning: locally_finite.sum_elim -> LocallyFinite.sum_elim is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {ι' : Type.{u2}} {X : Type.{u3}} [_inst_1 : TopologicalSpace.{u3} X] {f : ι -> (Set.{u3} X)} {g : ι' -> (Set.{u3} X)}, (LocallyFinite.{u1, u3} ι X _inst_1 f) -> (LocallyFinite.{u2, u3} ι' X _inst_1 g) -> (LocallyFinite.{max u1 u2, u3} (Sum.{u1, u2} ι ι') X _inst_1 (Sum.elim.{u1, u2, succ u3} ι ι' (Set.{u3} X) f g))
-but is expected to have type
- forall {ι : Type.{u2}} {ι' : Type.{u1}} {X : Type.{u3}} [_inst_1 : TopologicalSpace.{u3} X] {f : ι -> (Set.{u3} X)} {g : ι' -> (Set.{u3} X)}, (LocallyFinite.{u2, u3} ι X _inst_1 f) -> (LocallyFinite.{u1, u3} ι' X _inst_1 g) -> (LocallyFinite.{max u1 u2, u3} (Sum.{u2, u1} ι ι') X _inst_1 (Sum.elim.{u2, u1, succ u3} ι ι' (Set.{u3} X) f g))
-Case conversion may be inaccurate. Consider using '#align locally_finite.sum_elim LocallyFinite.sum_elimₓ'. -/
theorem LocallyFinite.sum_elim {g : ι' → Set X} (hf : LocallyFinite f) (hg : LocallyFinite g) :
LocallyFinite (Sum.elim f g) :=
locallyFinite_sum.mpr ⟨hf, hg⟩
#align locally_finite.sum_elim LocallyFinite.sum_elim
-/- warning: locally_finite_option -> locallyFinite_option is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {X : Type.{u2}} [_inst_1 : TopologicalSpace.{u2} X] {f : (Option.{u1} ι) -> (Set.{u2} X)}, Iff (LocallyFinite.{u1, u2} (Option.{u1} ι) X _inst_1 f) (LocallyFinite.{u1, u2} ι X _inst_1 (Function.comp.{succ u1, succ u1, succ u2} ι (Option.{u1} ι) (Set.{u2} X) f (Option.some.{u1} ι)))
-but is expected to have type
- forall {ι : Type.{u2}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : (Option.{u2} ι) -> (Set.{u1} X)}, Iff (LocallyFinite.{u2, u1} (Option.{u2} ι) X _inst_1 f) (LocallyFinite.{u2, u1} ι X _inst_1 (Function.comp.{succ u2, succ u2, succ u1} ι (Option.{u2} ι) (Set.{u1} X) f (Option.some.{u2} ι)))
-Case conversion may be inaccurate. Consider using '#align locally_finite_option locallyFinite_optionₓ'. -/
theorem locallyFinite_option {f : Option ι → Set X} : LocallyFinite f ↔ LocallyFinite (f ∘ some) :=
by
simp only [← (Equiv.optionEquivSumPUnit.{u} ι).symm.locallyFinite_comp_iff, locallyFinite_sum,
@@ -379,12 +247,6 @@ theorem locallyFinite_option {f : Option ι → Set X} : LocallyFinite f ↔ Loc
rfl
#align locally_finite_option locallyFinite_option
-/- warning: locally_finite.option_elim -> LocallyFinite.option_elim' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {X : Type.{u2}} [_inst_1 : TopologicalSpace.{u2} X] {f : ι -> (Set.{u2} X)}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (forall (s : Set.{u2} X), LocallyFinite.{u1, u2} (Option.{u1} ι) X _inst_1 (Option.elim'.{u1, u2} ι (Set.{u2} X) s f))
-but is expected to have type
- forall {ι : Type.{u2}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : ι -> (Set.{u1} X)}, (LocallyFinite.{u2, u1} ι X _inst_1 f) -> (forall (s : Set.{u1} X), LocallyFinite.{u2, u1} (Option.{u2} ι) X _inst_1 (Option.elim'.{u2, u1} ι (Set.{u1} X) s f))
-Case conversion may be inaccurate. Consider using '#align locally_finite.option_elim LocallyFinite.option_elim'ₓ'. -/
theorem LocallyFinite.option_elim' (hf : LocallyFinite f) (s : Set X) :
LocallyFinite (Option.elim' s f) :=
locallyFinite_option.2 hf
mathlib commit https://github.com/leanprover-community/mathlib/commit/95a87616d63b3cb49d3fe678d416fbe9c4217bf4
@@ -335,7 +335,7 @@ end LocallyFinite
lean 3 declaration is
forall {ι : Type.{u1}} {ι' : Type.{u2}} {X : Type.{u3}} [_inst_1 : TopologicalSpace.{u3} X] {f : ι -> (Set.{u3} X)} (e : Equiv.{succ u2, succ u1} ι' ι), Iff (LocallyFinite.{u2, u3} ι' X _inst_1 (Function.comp.{succ u2, succ u1, succ u3} ι' ι (Set.{u3} X) f (coeFn.{max 1 (max (succ u2) (succ u1)) (succ u1) (succ u2), max (succ u2) (succ u1)} (Equiv.{succ u2, succ u1} ι' ι) (fun (_x : Equiv.{succ u2, succ u1} ι' ι) => ι' -> ι) (Equiv.hasCoeToFun.{succ u2, succ u1} ι' ι) e))) (LocallyFinite.{u1, u3} ι X _inst_1 f)
but is expected to have type
- forall {ι : Type.{u2}} {ι' : Type.{u3}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : ι -> (Set.{u1} X)} (e : Equiv.{succ u3, succ u2} ι' ι), Iff (LocallyFinite.{u3, u1} ι' X _inst_1 (Function.comp.{succ u3, succ u2, succ u1} ι' ι (Set.{u1} X) f (FunLike.coe.{max (succ u2) (succ u3), succ u3, succ u2} (Equiv.{succ u3, succ u2} ι' ι) ι' (fun (_x : ι') => (fun (x._@.Mathlib.Logic.Equiv.Defs._hyg.808 : ι') => ι) _x) (Equiv.instFunLikeEquiv.{succ u3, succ u2} ι' ι) e))) (LocallyFinite.{u2, u1} ι X _inst_1 f)
+ forall {ι : Type.{u2}} {ι' : Type.{u3}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : ι -> (Set.{u1} X)} (e : Equiv.{succ u3, succ u2} ι' ι), Iff (LocallyFinite.{u3, u1} ι' X _inst_1 (Function.comp.{succ u3, succ u2, succ u1} ι' ι (Set.{u1} X) f (FunLike.coe.{max (succ u2) (succ u3), succ u3, succ u2} (Equiv.{succ u3, succ u2} ι' ι) ι' (fun (_x : ι') => (fun (x._@.Mathlib.Logic.Equiv.Defs._hyg.812 : ι') => ι) _x) (Equiv.instFunLikeEquiv.{succ u3, succ u2} ι' ι) e))) (LocallyFinite.{u2, u1} ι X _inst_1 f)
Case conversion may be inaccurate. Consider using '#align equiv.locally_finite_comp_iff Equiv.locallyFinite_comp_iffₓ'. -/
@[simp]
theorem Equiv.locallyFinite_comp_iff (e : ι' ≃ ι) : LocallyFinite (f ∘ e) ↔ LocallyFinite f :=
mathlib commit https://github.com/leanprover-community/mathlib/commit/e3fb84046afd187b710170887195d50bada934ee
@@ -136,35 +136,35 @@ theorem exists_mem_basis {ι' : Sort _} (hf : LocallyFinite f) {p : ι' → Prop
⟨i, hpi, hi Subset.rfl⟩
#align locally_finite.exists_mem_basis LocallyFinite.exists_mem_basis
-/- warning: locally_finite.nhds_within_Union -> LocallyFinite.nhdsWithin_unionᵢ is a dubious translation:
+/- warning: locally_finite.nhds_within_Union -> LocallyFinite.nhdsWithin_iUnion is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {X : Type.{u2}} [_inst_1 : TopologicalSpace.{u2} X] {f : ι -> (Set.{u2} X)}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (forall (a : X), Eq.{succ u2} (Filter.{u2} X) (nhdsWithin.{u2} X _inst_1 a (Set.unionᵢ.{u2, succ u1} X ι (fun (i : ι) => f i))) (supᵢ.{u2, succ u1} (Filter.{u2} X) (ConditionallyCompleteLattice.toHasSup.{u2} (Filter.{u2} X) (CompleteLattice.toConditionallyCompleteLattice.{u2} (Filter.{u2} X) (Filter.completeLattice.{u2} X))) ι (fun (i : ι) => nhdsWithin.{u2} X _inst_1 a (f i))))
+ forall {ι : Type.{u1}} {X : Type.{u2}} [_inst_1 : TopologicalSpace.{u2} X] {f : ι -> (Set.{u2} X)}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (forall (a : X), Eq.{succ u2} (Filter.{u2} X) (nhdsWithin.{u2} X _inst_1 a (Set.iUnion.{u2, succ u1} X ι (fun (i : ι) => f i))) (iSup.{u2, succ u1} (Filter.{u2} X) (ConditionallyCompleteLattice.toHasSup.{u2} (Filter.{u2} X) (CompleteLattice.toConditionallyCompleteLattice.{u2} (Filter.{u2} X) (Filter.completeLattice.{u2} X))) ι (fun (i : ι) => nhdsWithin.{u2} X _inst_1 a (f i))))
but is expected to have type
- forall {ι : Type.{u2}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : ι -> (Set.{u1} X)}, (LocallyFinite.{u2, u1} ι X _inst_1 f) -> (forall (a : X), Eq.{succ u1} (Filter.{u1} X) (nhdsWithin.{u1} X _inst_1 a (Set.unionᵢ.{u1, succ u2} X ι (fun (i : ι) => f i))) (supᵢ.{u1, succ u2} (Filter.{u1} X) (ConditionallyCompleteLattice.toSupSet.{u1} (Filter.{u1} X) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Filter.{u1} X) (Filter.instCompleteLatticeFilter.{u1} X))) ι (fun (i : ι) => nhdsWithin.{u1} X _inst_1 a (f i))))
-Case conversion may be inaccurate. Consider using '#align locally_finite.nhds_within_Union LocallyFinite.nhdsWithin_unionᵢₓ'. -/
-protected theorem nhdsWithin_unionᵢ (hf : LocallyFinite f) (a : X) :
+ forall {ι : Type.{u2}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : ι -> (Set.{u1} X)}, (LocallyFinite.{u2, u1} ι X _inst_1 f) -> (forall (a : X), Eq.{succ u1} (Filter.{u1} X) (nhdsWithin.{u1} X _inst_1 a (Set.iUnion.{u1, succ u2} X ι (fun (i : ι) => f i))) (iSup.{u1, succ u2} (Filter.{u1} X) (ConditionallyCompleteLattice.toSupSet.{u1} (Filter.{u1} X) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Filter.{u1} X) (Filter.instCompleteLatticeFilter.{u1} X))) ι (fun (i : ι) => nhdsWithin.{u1} X _inst_1 a (f i))))
+Case conversion may be inaccurate. Consider using '#align locally_finite.nhds_within_Union LocallyFinite.nhdsWithin_iUnionₓ'. -/
+protected theorem nhdsWithin_iUnion (hf : LocallyFinite f) (a : X) :
𝓝[⋃ i, f i] a = ⨆ i, 𝓝[f i] a :=
by
rcases hf a with ⟨U, haU, hfin⟩
- refine' le_antisymm _ (supᵢ_le fun i => nhdsWithin_mono _ (subset_Union _ _))
+ refine' le_antisymm _ (iSup_le fun i => nhdsWithin_mono _ (subset_Union _ _))
calc
𝓝[⋃ i, f i] a = 𝓝[⋃ i, f i ∩ U] a := by
rw [← Union_inter, ← nhdsWithin_inter_of_mem' (nhdsWithin_le_nhds haU)]
_ = 𝓝[⋃ i ∈ { j | (f j ∩ U).Nonempty }, f i ∩ U] a := by
simp only [mem_set_of_eq, Union_nonempty_self]
- _ = ⨆ i ∈ { j | (f j ∩ U).Nonempty }, 𝓝[f i ∩ U] a := (nhdsWithin_bunionᵢ hfin _ _)
- _ ≤ ⨆ i, 𝓝[f i ∩ U] a := (supᵢ₂_le_supᵢ _ _)
- _ ≤ ⨆ i, 𝓝[f i] a := supᵢ_mono fun i => nhdsWithin_mono _ <| inter_subset_left _ _
+ _ = ⨆ i ∈ { j | (f j ∩ U).Nonempty }, 𝓝[f i ∩ U] a := (nhdsWithin_biUnion hfin _ _)
+ _ ≤ ⨆ i, 𝓝[f i ∩ U] a := (iSup₂_le_iSup _ _)
+ _ ≤ ⨆ i, 𝓝[f i] a := iSup_mono fun i => nhdsWithin_mono _ <| inter_subset_left _ _
-#align locally_finite.nhds_within_Union LocallyFinite.nhdsWithin_unionᵢ
+#align locally_finite.nhds_within_Union LocallyFinite.nhdsWithin_iUnion
-/- warning: locally_finite.continuous_on_Union' -> LocallyFinite.continuousOn_unionᵢ' is a dubious translation:
+/- warning: locally_finite.continuous_on_Union' -> LocallyFinite.continuousOn_iUnion' is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {X : Type.{u2}} {Y : Type.{u3}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u3} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (forall (i : ι) (x : X), (Membership.Mem.{u2, u2} X (Set.{u2} X) (Set.hasMem.{u2} X) x (closure.{u2} X _inst_1 (f i))) -> (ContinuousWithinAt.{u2, u3} X Y _inst_1 _inst_2 g (f i) x)) -> (ContinuousOn.{u2, u3} X Y _inst_1 _inst_2 g (Set.unionᵢ.{u2, succ u1} X ι (fun (i : ι) => f i)))
+ forall {ι : Type.{u1}} {X : Type.{u2}} {Y : Type.{u3}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u3} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (forall (i : ι) (x : X), (Membership.Mem.{u2, u2} X (Set.{u2} X) (Set.hasMem.{u2} X) x (closure.{u2} X _inst_1 (f i))) -> (ContinuousWithinAt.{u2, u3} X Y _inst_1 _inst_2 g (f i) x)) -> (ContinuousOn.{u2, u3} X Y _inst_1 _inst_2 g (Set.iUnion.{u2, succ u1} X ι (fun (i : ι) => f i)))
but is expected to have type
- forall {ι : Type.{u3}} {X : Type.{u2}} {Y : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u1} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u3, u2} ι X _inst_1 f) -> (forall (i : ι) (x : X), (Membership.mem.{u2, u2} X (Set.{u2} X) (Set.instMembershipSet.{u2} X) x (closure.{u2} X _inst_1 (f i))) -> (ContinuousWithinAt.{u2, u1} X Y _inst_1 _inst_2 g (f i) x)) -> (ContinuousOn.{u2, u1} X Y _inst_1 _inst_2 g (Set.unionᵢ.{u2, succ u3} X ι (fun (i : ι) => f i)))
-Case conversion may be inaccurate. Consider using '#align locally_finite.continuous_on_Union' LocallyFinite.continuousOn_unionᵢ'ₓ'. -/
-theorem continuousOn_unionᵢ' {g : X → Y} (hf : LocallyFinite f)
+ forall {ι : Type.{u3}} {X : Type.{u2}} {Y : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u1} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u3, u2} ι X _inst_1 f) -> (forall (i : ι) (x : X), (Membership.mem.{u2, u2} X (Set.{u2} X) (Set.instMembershipSet.{u2} X) x (closure.{u2} X _inst_1 (f i))) -> (ContinuousWithinAt.{u2, u1} X Y _inst_1 _inst_2 g (f i) x)) -> (ContinuousOn.{u2, u1} X Y _inst_1 _inst_2 g (Set.iUnion.{u2, succ u3} X ι (fun (i : ι) => f i)))
+Case conversion may be inaccurate. Consider using '#align locally_finite.continuous_on_Union' LocallyFinite.continuousOn_iUnion'ₓ'. -/
+theorem continuousOn_iUnion' {g : X → Y} (hf : LocallyFinite f)
(hc : ∀ i x, x ∈ closure (f i) → ContinuousWithinAt g (f i) x) : ContinuousOn g (⋃ i, f i) :=
by
rintro x -
@@ -175,39 +175,39 @@ theorem continuousOn_unionᵢ' {g : X → Y} (hf : LocallyFinite f)
· rw [mem_closure_iff_nhdsWithin_neBot, not_ne_bot] at hx
rw [hx]
exact tendsto_bot
-#align locally_finite.continuous_on_Union' LocallyFinite.continuousOn_unionᵢ'
+#align locally_finite.continuous_on_Union' LocallyFinite.continuousOn_iUnion'
-/- warning: locally_finite.continuous_on_Union -> LocallyFinite.continuousOn_unionᵢ is a dubious translation:
+/- warning: locally_finite.continuous_on_Union -> LocallyFinite.continuousOn_iUnion is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {X : Type.{u2}} {Y : Type.{u3}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u3} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (forall (i : ι), IsClosed.{u2} X _inst_1 (f i)) -> (forall (i : ι), ContinuousOn.{u2, u3} X Y _inst_1 _inst_2 g (f i)) -> (ContinuousOn.{u2, u3} X Y _inst_1 _inst_2 g (Set.unionᵢ.{u2, succ u1} X ι (fun (i : ι) => f i)))
+ forall {ι : Type.{u1}} {X : Type.{u2}} {Y : Type.{u3}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u3} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (forall (i : ι), IsClosed.{u2} X _inst_1 (f i)) -> (forall (i : ι), ContinuousOn.{u2, u3} X Y _inst_1 _inst_2 g (f i)) -> (ContinuousOn.{u2, u3} X Y _inst_1 _inst_2 g (Set.iUnion.{u2, succ u1} X ι (fun (i : ι) => f i)))
but is expected to have type
- forall {ι : Type.{u3}} {X : Type.{u2}} {Y : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u1} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u3, u2} ι X _inst_1 f) -> (forall (i : ι), IsClosed.{u2} X _inst_1 (f i)) -> (forall (i : ι), ContinuousOn.{u2, u1} X Y _inst_1 _inst_2 g (f i)) -> (ContinuousOn.{u2, u1} X Y _inst_1 _inst_2 g (Set.unionᵢ.{u2, succ u3} X ι (fun (i : ι) => f i)))
-Case conversion may be inaccurate. Consider using '#align locally_finite.continuous_on_Union LocallyFinite.continuousOn_unionᵢₓ'. -/
-theorem continuousOn_unionᵢ {g : X → Y} (hf : LocallyFinite f) (h_cl : ∀ i, IsClosed (f i))
+ forall {ι : Type.{u3}} {X : Type.{u2}} {Y : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u1} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u3, u2} ι X _inst_1 f) -> (forall (i : ι), IsClosed.{u2} X _inst_1 (f i)) -> (forall (i : ι), ContinuousOn.{u2, u1} X Y _inst_1 _inst_2 g (f i)) -> (ContinuousOn.{u2, u1} X Y _inst_1 _inst_2 g (Set.iUnion.{u2, succ u3} X ι (fun (i : ι) => f i)))
+Case conversion may be inaccurate. Consider using '#align locally_finite.continuous_on_Union LocallyFinite.continuousOn_iUnionₓ'. -/
+theorem continuousOn_iUnion {g : X → Y} (hf : LocallyFinite f) (h_cl : ∀ i, IsClosed (f i))
(h_cont : ∀ i, ContinuousOn g (f i)) : ContinuousOn g (⋃ i, f i) :=
- hf.continuousOn_unionᵢ' fun i x hx => h_cont i x <| (h_cl i).closure_subset hx
-#align locally_finite.continuous_on_Union LocallyFinite.continuousOn_unionᵢ
+ hf.continuousOn_iUnion' fun i x hx => h_cont i x <| (h_cl i).closure_subset hx
+#align locally_finite.continuous_on_Union LocallyFinite.continuousOn_iUnion
/- warning: locally_finite.continuous' -> LocallyFinite.continuous' is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {X : Type.{u2}} {Y : Type.{u3}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u3} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (Eq.{succ u2} (Set.{u2} X) (Set.unionᵢ.{u2, succ u1} X ι (fun (i : ι) => f i)) (Set.univ.{u2} X)) -> (forall (i : ι) (x : X), (Membership.Mem.{u2, u2} X (Set.{u2} X) (Set.hasMem.{u2} X) x (closure.{u2} X _inst_1 (f i))) -> (ContinuousWithinAt.{u2, u3} X Y _inst_1 _inst_2 g (f i) x)) -> (Continuous.{u2, u3} X Y _inst_1 _inst_2 g)
+ forall {ι : Type.{u1}} {X : Type.{u2}} {Y : Type.{u3}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u3} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (Eq.{succ u2} (Set.{u2} X) (Set.iUnion.{u2, succ u1} X ι (fun (i : ι) => f i)) (Set.univ.{u2} X)) -> (forall (i : ι) (x : X), (Membership.Mem.{u2, u2} X (Set.{u2} X) (Set.hasMem.{u2} X) x (closure.{u2} X _inst_1 (f i))) -> (ContinuousWithinAt.{u2, u3} X Y _inst_1 _inst_2 g (f i) x)) -> (Continuous.{u2, u3} X Y _inst_1 _inst_2 g)
but is expected to have type
- forall {ι : Type.{u3}} {X : Type.{u2}} {Y : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u1} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u3, u2} ι X _inst_1 f) -> (Eq.{succ u2} (Set.{u2} X) (Set.unionᵢ.{u2, succ u3} X ι (fun (i : ι) => f i)) (Set.univ.{u2} X)) -> (forall (i : ι) (x : X), (Membership.mem.{u2, u2} X (Set.{u2} X) (Set.instMembershipSet.{u2} X) x (closure.{u2} X _inst_1 (f i))) -> (ContinuousWithinAt.{u2, u1} X Y _inst_1 _inst_2 g (f i) x)) -> (Continuous.{u2, u1} X Y _inst_1 _inst_2 g)
+ forall {ι : Type.{u3}} {X : Type.{u2}} {Y : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u1} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u3, u2} ι X _inst_1 f) -> (Eq.{succ u2} (Set.{u2} X) (Set.iUnion.{u2, succ u3} X ι (fun (i : ι) => f i)) (Set.univ.{u2} X)) -> (forall (i : ι) (x : X), (Membership.mem.{u2, u2} X (Set.{u2} X) (Set.instMembershipSet.{u2} X) x (closure.{u2} X _inst_1 (f i))) -> (ContinuousWithinAt.{u2, u1} X Y _inst_1 _inst_2 g (f i) x)) -> (Continuous.{u2, u1} X Y _inst_1 _inst_2 g)
Case conversion may be inaccurate. Consider using '#align locally_finite.continuous' LocallyFinite.continuous'ₓ'. -/
protected theorem continuous' {g : X → Y} (hf : LocallyFinite f) (h_cov : (⋃ i, f i) = univ)
(hc : ∀ i x, x ∈ closure (f i) → ContinuousWithinAt g (f i) x) : Continuous g :=
- continuous_iff_continuousOn_univ.2 <| h_cov ▸ hf.continuousOn_unionᵢ' hc
+ continuous_iff_continuousOn_univ.2 <| h_cov ▸ hf.continuousOn_iUnion' hc
#align locally_finite.continuous' LocallyFinite.continuous'
/- warning: locally_finite.continuous -> LocallyFinite.continuous is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {X : Type.{u2}} {Y : Type.{u3}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u3} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (Eq.{succ u2} (Set.{u2} X) (Set.unionᵢ.{u2, succ u1} X ι (fun (i : ι) => f i)) (Set.univ.{u2} X)) -> (forall (i : ι), IsClosed.{u2} X _inst_1 (f i)) -> (forall (i : ι), ContinuousOn.{u2, u3} X Y _inst_1 _inst_2 g (f i)) -> (Continuous.{u2, u3} X Y _inst_1 _inst_2 g)
+ forall {ι : Type.{u1}} {X : Type.{u2}} {Y : Type.{u3}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u3} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (Eq.{succ u2} (Set.{u2} X) (Set.iUnion.{u2, succ u1} X ι (fun (i : ι) => f i)) (Set.univ.{u2} X)) -> (forall (i : ι), IsClosed.{u2} X _inst_1 (f i)) -> (forall (i : ι), ContinuousOn.{u2, u3} X Y _inst_1 _inst_2 g (f i)) -> (Continuous.{u2, u3} X Y _inst_1 _inst_2 g)
but is expected to have type
- forall {ι : Type.{u3}} {X : Type.{u2}} {Y : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u1} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u3, u2} ι X _inst_1 f) -> (Eq.{succ u2} (Set.{u2} X) (Set.unionᵢ.{u2, succ u3} X ι (fun (i : ι) => f i)) (Set.univ.{u2} X)) -> (forall (i : ι), IsClosed.{u2} X _inst_1 (f i)) -> (forall (i : ι), ContinuousOn.{u2, u1} X Y _inst_1 _inst_2 g (f i)) -> (Continuous.{u2, u1} X Y _inst_1 _inst_2 g)
+ forall {ι : Type.{u3}} {X : Type.{u2}} {Y : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u1} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u3, u2} ι X _inst_1 f) -> (Eq.{succ u2} (Set.{u2} X) (Set.iUnion.{u2, succ u3} X ι (fun (i : ι) => f i)) (Set.univ.{u2} X)) -> (forall (i : ι), IsClosed.{u2} X _inst_1 (f i)) -> (forall (i : ι), ContinuousOn.{u2, u1} X Y _inst_1 _inst_2 g (f i)) -> (Continuous.{u2, u1} X Y _inst_1 _inst_2 g)
Case conversion may be inaccurate. Consider using '#align locally_finite.continuous LocallyFinite.continuousₓ'. -/
protected theorem continuous {g : X → Y} (hf : LocallyFinite f) (h_cov : (⋃ i, f i) = univ)
(h_cl : ∀ i, IsClosed (f i)) (h_cont : ∀ i, ContinuousOn g (f i)) : Continuous g :=
- continuous_iff_continuousOn_univ.2 <| h_cov ▸ hf.continuousOn_unionᵢ h_cl h_cont
+ continuous_iff_continuousOn_univ.2 <| h_cov ▸ hf.continuousOn_iUnion h_cl h_cont
#align locally_finite.continuous LocallyFinite.continuous
/- warning: locally_finite.closure -> LocallyFinite.closure is a dubious translation:
@@ -226,44 +226,44 @@ protected theorem closure (hf : LocallyFinite f) : LocallyFinite fun i => closur
(inter_subset_inter_right _ interior_subset)
#align locally_finite.closure LocallyFinite.closure
-/- warning: locally_finite.closure_Union -> LocallyFinite.closure_unionᵢ is a dubious translation:
+/- warning: locally_finite.closure_Union -> LocallyFinite.closure_iUnion is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {X : Type.{u2}} [_inst_1 : TopologicalSpace.{u2} X] {f : ι -> (Set.{u2} X)}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (Eq.{succ u2} (Set.{u2} X) (closure.{u2} X _inst_1 (Set.unionᵢ.{u2, succ u1} X ι (fun (i : ι) => f i))) (Set.unionᵢ.{u2, succ u1} X ι (fun (i : ι) => closure.{u2} X _inst_1 (f i))))
+ forall {ι : Type.{u1}} {X : Type.{u2}} [_inst_1 : TopologicalSpace.{u2} X] {f : ι -> (Set.{u2} X)}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (Eq.{succ u2} (Set.{u2} X) (closure.{u2} X _inst_1 (Set.iUnion.{u2, succ u1} X ι (fun (i : ι) => f i))) (Set.iUnion.{u2, succ u1} X ι (fun (i : ι) => closure.{u2} X _inst_1 (f i))))
but is expected to have type
- forall {ι : Type.{u2}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : ι -> (Set.{u1} X)}, (LocallyFinite.{u2, u1} ι X _inst_1 f) -> (Eq.{succ u1} (Set.{u1} X) (closure.{u1} X _inst_1 (Set.unionᵢ.{u1, succ u2} X ι (fun (i : ι) => f i))) (Set.unionᵢ.{u1, succ u2} X ι (fun (i : ι) => closure.{u1} X _inst_1 (f i))))
-Case conversion may be inaccurate. Consider using '#align locally_finite.closure_Union LocallyFinite.closure_unionᵢₓ'. -/
-theorem closure_unionᵢ (h : LocallyFinite f) : closure (⋃ i, f i) = ⋃ i, closure (f i) :=
+ forall {ι : Type.{u2}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : ι -> (Set.{u1} X)}, (LocallyFinite.{u2, u1} ι X _inst_1 f) -> (Eq.{succ u1} (Set.{u1} X) (closure.{u1} X _inst_1 (Set.iUnion.{u1, succ u2} X ι (fun (i : ι) => f i))) (Set.iUnion.{u1, succ u2} X ι (fun (i : ι) => closure.{u1} X _inst_1 (f i))))
+Case conversion may be inaccurate. Consider using '#align locally_finite.closure_Union LocallyFinite.closure_iUnionₓ'. -/
+theorem closure_iUnion (h : LocallyFinite f) : closure (⋃ i, f i) = ⋃ i, closure (f i) :=
by
ext x
simp only [mem_closure_iff_nhdsWithin_neBot, h.nhds_within_Union, supr_ne_bot, mem_Union]
-#align locally_finite.closure_Union LocallyFinite.closure_unionᵢ
+#align locally_finite.closure_Union LocallyFinite.closure_iUnion
-/- warning: locally_finite.is_closed_Union -> LocallyFinite.isClosed_unionᵢ is a dubious translation:
+/- warning: locally_finite.is_closed_Union -> LocallyFinite.isClosed_iUnion is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {X : Type.{u2}} [_inst_1 : TopologicalSpace.{u2} X] {f : ι -> (Set.{u2} X)}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (forall (i : ι), IsClosed.{u2} X _inst_1 (f i)) -> (IsClosed.{u2} X _inst_1 (Set.unionᵢ.{u2, succ u1} X ι (fun (i : ι) => f i)))
+ forall {ι : Type.{u1}} {X : Type.{u2}} [_inst_1 : TopologicalSpace.{u2} X] {f : ι -> (Set.{u2} X)}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (forall (i : ι), IsClosed.{u2} X _inst_1 (f i)) -> (IsClosed.{u2} X _inst_1 (Set.iUnion.{u2, succ u1} X ι (fun (i : ι) => f i)))
but is expected to have type
- forall {ι : Type.{u2}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : ι -> (Set.{u1} X)}, (LocallyFinite.{u2, u1} ι X _inst_1 f) -> (forall (i : ι), IsClosed.{u1} X _inst_1 (f i)) -> (IsClosed.{u1} X _inst_1 (Set.unionᵢ.{u1, succ u2} X ι (fun (i : ι) => f i)))
-Case conversion may be inaccurate. Consider using '#align locally_finite.is_closed_Union LocallyFinite.isClosed_unionᵢₓ'. -/
-theorem isClosed_unionᵢ (hf : LocallyFinite f) (hc : ∀ i, IsClosed (f i)) : IsClosed (⋃ i, f i) :=
+ forall {ι : Type.{u2}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : ι -> (Set.{u1} X)}, (LocallyFinite.{u2, u1} ι X _inst_1 f) -> (forall (i : ι), IsClosed.{u1} X _inst_1 (f i)) -> (IsClosed.{u1} X _inst_1 (Set.iUnion.{u1, succ u2} X ι (fun (i : ι) => f i)))
+Case conversion may be inaccurate. Consider using '#align locally_finite.is_closed_Union LocallyFinite.isClosed_iUnionₓ'. -/
+theorem isClosed_iUnion (hf : LocallyFinite f) (hc : ∀ i, IsClosed (f i)) : IsClosed (⋃ i, f i) :=
by simp only [← closure_eq_iff_isClosed, hf.closure_Union, (hc _).closure_eq]
-#align locally_finite.is_closed_Union LocallyFinite.isClosed_unionᵢ
+#align locally_finite.is_closed_Union LocallyFinite.isClosed_iUnion
-/- warning: locally_finite.Inter_compl_mem_nhds -> LocallyFinite.interᵢ_compl_mem_nhds is a dubious translation:
+/- warning: locally_finite.Inter_compl_mem_nhds -> LocallyFinite.iInter_compl_mem_nhds is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {X : Type.{u2}} [_inst_1 : TopologicalSpace.{u2} X] {f : ι -> (Set.{u2} X)}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (forall (i : ι), IsClosed.{u2} X _inst_1 (f i)) -> (forall (x : X), Membership.Mem.{u2, u2} (Set.{u2} X) (Filter.{u2} X) (Filter.hasMem.{u2} X) (Set.interᵢ.{u2, succ u1} X ι (fun (i : ι) => Set.interᵢ.{u2, 0} X (Not (Membership.Mem.{u2, u2} X (Set.{u2} X) (Set.hasMem.{u2} X) x (f i))) (fun (hi : Not (Membership.Mem.{u2, u2} X (Set.{u2} X) (Set.hasMem.{u2} X) x (f i))) => HasCompl.compl.{u2} (Set.{u2} X) (BooleanAlgebra.toHasCompl.{u2} (Set.{u2} X) (Set.booleanAlgebra.{u2} X)) (f i)))) (nhds.{u2} X _inst_1 x))
+ forall {ι : Type.{u1}} {X : Type.{u2}} [_inst_1 : TopologicalSpace.{u2} X] {f : ι -> (Set.{u2} X)}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (forall (i : ι), IsClosed.{u2} X _inst_1 (f i)) -> (forall (x : X), Membership.Mem.{u2, u2} (Set.{u2} X) (Filter.{u2} X) (Filter.hasMem.{u2} X) (Set.iInter.{u2, succ u1} X ι (fun (i : ι) => Set.iInter.{u2, 0} X (Not (Membership.Mem.{u2, u2} X (Set.{u2} X) (Set.hasMem.{u2} X) x (f i))) (fun (hi : Not (Membership.Mem.{u2, u2} X (Set.{u2} X) (Set.hasMem.{u2} X) x (f i))) => HasCompl.compl.{u2} (Set.{u2} X) (BooleanAlgebra.toHasCompl.{u2} (Set.{u2} X) (Set.booleanAlgebra.{u2} X)) (f i)))) (nhds.{u2} X _inst_1 x))
but is expected to have type
- forall {ι : Type.{u2}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : ι -> (Set.{u1} X)}, (LocallyFinite.{u2, u1} ι X _inst_1 f) -> (forall (i : ι), IsClosed.{u1} X _inst_1 (f i)) -> (forall (x : X), Membership.mem.{u1, u1} (Set.{u1} X) (Filter.{u1} X) (instMembershipSetFilter.{u1} X) (Set.interᵢ.{u1, succ u2} X ι (fun (i : ι) => Set.interᵢ.{u1, 0} X (Not (Membership.mem.{u1, u1} X (Set.{u1} X) (Set.instMembershipSet.{u1} X) x (f i))) (fun (hi : Not (Membership.mem.{u1, u1} X (Set.{u1} X) (Set.instMembershipSet.{u1} X) x (f i))) => HasCompl.compl.{u1} (Set.{u1} X) (BooleanAlgebra.toHasCompl.{u1} (Set.{u1} X) (Set.instBooleanAlgebraSet.{u1} X)) (f i)))) (nhds.{u1} X _inst_1 x))
-Case conversion may be inaccurate. Consider using '#align locally_finite.Inter_compl_mem_nhds LocallyFinite.interᵢ_compl_mem_nhdsₓ'. -/
+ forall {ι : Type.{u2}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : ι -> (Set.{u1} X)}, (LocallyFinite.{u2, u1} ι X _inst_1 f) -> (forall (i : ι), IsClosed.{u1} X _inst_1 (f i)) -> (forall (x : X), Membership.mem.{u1, u1} (Set.{u1} X) (Filter.{u1} X) (instMembershipSetFilter.{u1} X) (Set.iInter.{u1, succ u2} X ι (fun (i : ι) => Set.iInter.{u1, 0} X (Not (Membership.mem.{u1, u1} X (Set.{u1} X) (Set.instMembershipSet.{u1} X) x (f i))) (fun (hi : Not (Membership.mem.{u1, u1} X (Set.{u1} X) (Set.instMembershipSet.{u1} X) x (f i))) => HasCompl.compl.{u1} (Set.{u1} X) (BooleanAlgebra.toHasCompl.{u1} (Set.{u1} X) (Set.instBooleanAlgebraSet.{u1} X)) (f i)))) (nhds.{u1} X _inst_1 x))
+Case conversion may be inaccurate. Consider using '#align locally_finite.Inter_compl_mem_nhds LocallyFinite.iInter_compl_mem_nhdsₓ'. -/
/-- If `f : β → set α` is a locally finite family of closed sets, then for any `x : α`, the
intersection of the complements to `f i`, `x ∉ f i`, is a neighbourhood of `x`. -/
-theorem interᵢ_compl_mem_nhds (hf : LocallyFinite f) (hc : ∀ i, IsClosed (f i)) (x : X) :
+theorem iInter_compl_mem_nhds (hf : LocallyFinite f) (hc : ∀ i, IsClosed (f i)) (x : X) :
(⋂ (i) (hi : x ∉ f i), f iᶜ) ∈ 𝓝 x :=
by
refine' IsOpen.mem_nhds _ (mem_Inter₂.2 fun i => id)
suffices IsClosed (⋃ i : { i // x ∉ f i }, f i) by
rwa [← isOpen_compl_iff, compl_Union, Inter_subtype] at this
- exact (hf.comp_injective Subtype.coe_injective).isClosed_unionᵢ fun i => hc _
-#align locally_finite.Inter_compl_mem_nhds LocallyFinite.interᵢ_compl_mem_nhds
+ exact (hf.comp_injective Subtype.coe_injective).isClosed_iUnion fun i => hc _
+#align locally_finite.Inter_compl_mem_nhds LocallyFinite.iInter_compl_mem_nhds
#print LocallyFinite.exists_forall_eventually_eq_prod /-
/-- Let `f : ℕ → Π a, β a` be a sequence of (dependent) functions on a topological space. Suppose
mathlib commit https://github.com/leanprover-community/mathlib/commit/0148d455199ed64bf8eb2f493a1e7eb9211ce170
@@ -136,6 +136,12 @@ theorem exists_mem_basis {ι' : Sort _} (hf : LocallyFinite f) {p : ι' → Prop
⟨i, hpi, hi Subset.rfl⟩
#align locally_finite.exists_mem_basis LocallyFinite.exists_mem_basis
+/- warning: locally_finite.nhds_within_Union -> LocallyFinite.nhdsWithin_unionᵢ is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {X : Type.{u2}} [_inst_1 : TopologicalSpace.{u2} X] {f : ι -> (Set.{u2} X)}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (forall (a : X), Eq.{succ u2} (Filter.{u2} X) (nhdsWithin.{u2} X _inst_1 a (Set.unionᵢ.{u2, succ u1} X ι (fun (i : ι) => f i))) (supᵢ.{u2, succ u1} (Filter.{u2} X) (ConditionallyCompleteLattice.toHasSup.{u2} (Filter.{u2} X) (CompleteLattice.toConditionallyCompleteLattice.{u2} (Filter.{u2} X) (Filter.completeLattice.{u2} X))) ι (fun (i : ι) => nhdsWithin.{u2} X _inst_1 a (f i))))
+but is expected to have type
+ forall {ι : Type.{u2}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : ι -> (Set.{u1} X)}, (LocallyFinite.{u2, u1} ι X _inst_1 f) -> (forall (a : X), Eq.{succ u1} (Filter.{u1} X) (nhdsWithin.{u1} X _inst_1 a (Set.unionᵢ.{u1, succ u2} X ι (fun (i : ι) => f i))) (supᵢ.{u1, succ u2} (Filter.{u1} X) (ConditionallyCompleteLattice.toSupSet.{u1} (Filter.{u1} X) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Filter.{u1} X) (Filter.instCompleteLatticeFilter.{u1} X))) ι (fun (i : ι) => nhdsWithin.{u1} X _inst_1 a (f i))))
+Case conversion may be inaccurate. Consider using '#align locally_finite.nhds_within_Union LocallyFinite.nhdsWithin_unionᵢₓ'. -/
protected theorem nhdsWithin_unionᵢ (hf : LocallyFinite f) (a : X) :
𝓝[⋃ i, f i] a = ⨆ i, 𝓝[f i] a :=
by
@@ -146,13 +152,19 @@ protected theorem nhdsWithin_unionᵢ (hf : LocallyFinite f) (a : X) :
rw [← Union_inter, ← nhdsWithin_inter_of_mem' (nhdsWithin_le_nhds haU)]
_ = 𝓝[⋃ i ∈ { j | (f j ∩ U).Nonempty }, f i ∩ U] a := by
simp only [mem_set_of_eq, Union_nonempty_self]
- _ = ⨆ i ∈ { j | (f j ∩ U).Nonempty }, 𝓝[f i ∩ U] a := (nhdsWithin_bUnion hfin _ _)
+ _ = ⨆ i ∈ { j | (f j ∩ U).Nonempty }, 𝓝[f i ∩ U] a := (nhdsWithin_bunionᵢ hfin _ _)
_ ≤ ⨆ i, 𝓝[f i ∩ U] a := (supᵢ₂_le_supᵢ _ _)
_ ≤ ⨆ i, 𝓝[f i] a := supᵢ_mono fun i => nhdsWithin_mono _ <| inter_subset_left _ _
#align locally_finite.nhds_within_Union LocallyFinite.nhdsWithin_unionᵢ
-theorem continuousOn_Union' {g : X → Y} (hf : LocallyFinite f)
+/- warning: locally_finite.continuous_on_Union' -> LocallyFinite.continuousOn_unionᵢ' is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {X : Type.{u2}} {Y : Type.{u3}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u3} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (forall (i : ι) (x : X), (Membership.Mem.{u2, u2} X (Set.{u2} X) (Set.hasMem.{u2} X) x (closure.{u2} X _inst_1 (f i))) -> (ContinuousWithinAt.{u2, u3} X Y _inst_1 _inst_2 g (f i) x)) -> (ContinuousOn.{u2, u3} X Y _inst_1 _inst_2 g (Set.unionᵢ.{u2, succ u1} X ι (fun (i : ι) => f i)))
+but is expected to have type
+ forall {ι : Type.{u3}} {X : Type.{u2}} {Y : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u1} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u3, u2} ι X _inst_1 f) -> (forall (i : ι) (x : X), (Membership.mem.{u2, u2} X (Set.{u2} X) (Set.instMembershipSet.{u2} X) x (closure.{u2} X _inst_1 (f i))) -> (ContinuousWithinAt.{u2, u1} X Y _inst_1 _inst_2 g (f i) x)) -> (ContinuousOn.{u2, u1} X Y _inst_1 _inst_2 g (Set.unionᵢ.{u2, succ u3} X ι (fun (i : ι) => f i)))
+Case conversion may be inaccurate. Consider using '#align locally_finite.continuous_on_Union' LocallyFinite.continuousOn_unionᵢ'ₓ'. -/
+theorem continuousOn_unionᵢ' {g : X → Y} (hf : LocallyFinite f)
(hc : ∀ i x, x ∈ closure (f i) → ContinuousWithinAt g (f i) x) : ContinuousOn g (⋃ i, f i) :=
by
rintro x -
@@ -163,18 +175,36 @@ theorem continuousOn_Union' {g : X → Y} (hf : LocallyFinite f)
· rw [mem_closure_iff_nhdsWithin_neBot, not_ne_bot] at hx
rw [hx]
exact tendsto_bot
-#align locally_finite.continuous_on_Union' LocallyFinite.continuousOn_Union'
+#align locally_finite.continuous_on_Union' LocallyFinite.continuousOn_unionᵢ'
+/- warning: locally_finite.continuous_on_Union -> LocallyFinite.continuousOn_unionᵢ is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {X : Type.{u2}} {Y : Type.{u3}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u3} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (forall (i : ι), IsClosed.{u2} X _inst_1 (f i)) -> (forall (i : ι), ContinuousOn.{u2, u3} X Y _inst_1 _inst_2 g (f i)) -> (ContinuousOn.{u2, u3} X Y _inst_1 _inst_2 g (Set.unionᵢ.{u2, succ u1} X ι (fun (i : ι) => f i)))
+but is expected to have type
+ forall {ι : Type.{u3}} {X : Type.{u2}} {Y : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u1} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u3, u2} ι X _inst_1 f) -> (forall (i : ι), IsClosed.{u2} X _inst_1 (f i)) -> (forall (i : ι), ContinuousOn.{u2, u1} X Y _inst_1 _inst_2 g (f i)) -> (ContinuousOn.{u2, u1} X Y _inst_1 _inst_2 g (Set.unionᵢ.{u2, succ u3} X ι (fun (i : ι) => f i)))
+Case conversion may be inaccurate. Consider using '#align locally_finite.continuous_on_Union LocallyFinite.continuousOn_unionᵢₓ'. -/
theorem continuousOn_unionᵢ {g : X → Y} (hf : LocallyFinite f) (h_cl : ∀ i, IsClosed (f i))
(h_cont : ∀ i, ContinuousOn g (f i)) : ContinuousOn g (⋃ i, f i) :=
- hf.continuousOn_Union' fun i x hx => h_cont i x <| (h_cl i).closure_subset hx
+ hf.continuousOn_unionᵢ' fun i x hx => h_cont i x <| (h_cl i).closure_subset hx
#align locally_finite.continuous_on_Union LocallyFinite.continuousOn_unionᵢ
+/- warning: locally_finite.continuous' -> LocallyFinite.continuous' is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {X : Type.{u2}} {Y : Type.{u3}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u3} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (Eq.{succ u2} (Set.{u2} X) (Set.unionᵢ.{u2, succ u1} X ι (fun (i : ι) => f i)) (Set.univ.{u2} X)) -> (forall (i : ι) (x : X), (Membership.Mem.{u2, u2} X (Set.{u2} X) (Set.hasMem.{u2} X) x (closure.{u2} X _inst_1 (f i))) -> (ContinuousWithinAt.{u2, u3} X Y _inst_1 _inst_2 g (f i) x)) -> (Continuous.{u2, u3} X Y _inst_1 _inst_2 g)
+but is expected to have type
+ forall {ι : Type.{u3}} {X : Type.{u2}} {Y : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u1} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u3, u2} ι X _inst_1 f) -> (Eq.{succ u2} (Set.{u2} X) (Set.unionᵢ.{u2, succ u3} X ι (fun (i : ι) => f i)) (Set.univ.{u2} X)) -> (forall (i : ι) (x : X), (Membership.mem.{u2, u2} X (Set.{u2} X) (Set.instMembershipSet.{u2} X) x (closure.{u2} X _inst_1 (f i))) -> (ContinuousWithinAt.{u2, u1} X Y _inst_1 _inst_2 g (f i) x)) -> (Continuous.{u2, u1} X Y _inst_1 _inst_2 g)
+Case conversion may be inaccurate. Consider using '#align locally_finite.continuous' LocallyFinite.continuous'ₓ'. -/
protected theorem continuous' {g : X → Y} (hf : LocallyFinite f) (h_cov : (⋃ i, f i) = univ)
(hc : ∀ i x, x ∈ closure (f i) → ContinuousWithinAt g (f i) x) : Continuous g :=
- continuous_iff_continuousOn_univ.2 <| h_cov ▸ hf.continuousOn_Union' hc
+ continuous_iff_continuousOn_univ.2 <| h_cov ▸ hf.continuousOn_unionᵢ' hc
#align locally_finite.continuous' LocallyFinite.continuous'
+/- warning: locally_finite.continuous -> LocallyFinite.continuous is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {X : Type.{u2}} {Y : Type.{u3}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u3} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (Eq.{succ u2} (Set.{u2} X) (Set.unionᵢ.{u2, succ u1} X ι (fun (i : ι) => f i)) (Set.univ.{u2} X)) -> (forall (i : ι), IsClosed.{u2} X _inst_1 (f i)) -> (forall (i : ι), ContinuousOn.{u2, u3} X Y _inst_1 _inst_2 g (f i)) -> (Continuous.{u2, u3} X Y _inst_1 _inst_2 g)
+but is expected to have type
+ forall {ι : Type.{u3}} {X : Type.{u2}} {Y : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u1} Y] {f : ι -> (Set.{u2} X)} {g : X -> Y}, (LocallyFinite.{u3, u2} ι X _inst_1 f) -> (Eq.{succ u2} (Set.{u2} X) (Set.unionᵢ.{u2, succ u3} X ι (fun (i : ι) => f i)) (Set.univ.{u2} X)) -> (forall (i : ι), IsClosed.{u2} X _inst_1 (f i)) -> (forall (i : ι), ContinuousOn.{u2, u1} X Y _inst_1 _inst_2 g (f i)) -> (Continuous.{u2, u1} X Y _inst_1 _inst_2 g)
+Case conversion may be inaccurate. Consider using '#align locally_finite.continuous LocallyFinite.continuousₓ'. -/
protected theorem continuous {g : X → Y} (hf : LocallyFinite f) (h_cov : (⋃ i, f i) = univ)
(h_cl : ∀ i, IsClosed (f i)) (h_cont : ∀ i, ContinuousOn g (f i)) : Continuous g :=
continuous_iff_continuousOn_univ.2 <| h_cov ▸ hf.continuousOn_unionᵢ h_cl h_cont
mathlib commit https://github.com/leanprover-community/mathlib/commit/55d771df074d0dd020139ee1cd4b95521422df9f
@@ -4,11 +4,11 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Yury Kudryashov
! This file was ported from Lean 3 source module topology.locally_finite
-! leanprover-community/mathlib commit fac369018417f980cec5fcdafc766a69f88d8cfe
+! leanprover-community/mathlib commit 55d771df074d0dd020139ee1cd4b95521422df9f
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
-import Mathbin.Topology.Basic
+import Mathbin.Topology.ContinuousOn
import Mathbin.Order.Filter.SmallSets
/-!
@@ -136,6 +136,50 @@ theorem exists_mem_basis {ι' : Sort _} (hf : LocallyFinite f) {p : ι' → Prop
⟨i, hpi, hi Subset.rfl⟩
#align locally_finite.exists_mem_basis LocallyFinite.exists_mem_basis
+protected theorem nhdsWithin_unionᵢ (hf : LocallyFinite f) (a : X) :
+ 𝓝[⋃ i, f i] a = ⨆ i, 𝓝[f i] a :=
+ by
+ rcases hf a with ⟨U, haU, hfin⟩
+ refine' le_antisymm _ (supᵢ_le fun i => nhdsWithin_mono _ (subset_Union _ _))
+ calc
+ 𝓝[⋃ i, f i] a = 𝓝[⋃ i, f i ∩ U] a := by
+ rw [← Union_inter, ← nhdsWithin_inter_of_mem' (nhdsWithin_le_nhds haU)]
+ _ = 𝓝[⋃ i ∈ { j | (f j ∩ U).Nonempty }, f i ∩ U] a := by
+ simp only [mem_set_of_eq, Union_nonempty_self]
+ _ = ⨆ i ∈ { j | (f j ∩ U).Nonempty }, 𝓝[f i ∩ U] a := (nhdsWithin_bUnion hfin _ _)
+ _ ≤ ⨆ i, 𝓝[f i ∩ U] a := (supᵢ₂_le_supᵢ _ _)
+ _ ≤ ⨆ i, 𝓝[f i] a := supᵢ_mono fun i => nhdsWithin_mono _ <| inter_subset_left _ _
+
+#align locally_finite.nhds_within_Union LocallyFinite.nhdsWithin_unionᵢ
+
+theorem continuousOn_Union' {g : X → Y} (hf : LocallyFinite f)
+ (hc : ∀ i x, x ∈ closure (f i) → ContinuousWithinAt g (f i) x) : ContinuousOn g (⋃ i, f i) :=
+ by
+ rintro x -
+ rw [ContinuousWithinAt, hf.nhds_within_Union, tendsto_supr]
+ intro i
+ by_cases hx : x ∈ closure (f i)
+ · exact hc i _ hx
+ · rw [mem_closure_iff_nhdsWithin_neBot, not_ne_bot] at hx
+ rw [hx]
+ exact tendsto_bot
+#align locally_finite.continuous_on_Union' LocallyFinite.continuousOn_Union'
+
+theorem continuousOn_unionᵢ {g : X → Y} (hf : LocallyFinite f) (h_cl : ∀ i, IsClosed (f i))
+ (h_cont : ∀ i, ContinuousOn g (f i)) : ContinuousOn g (⋃ i, f i) :=
+ hf.continuousOn_Union' fun i x hx => h_cont i x <| (h_cl i).closure_subset hx
+#align locally_finite.continuous_on_Union LocallyFinite.continuousOn_unionᵢ
+
+protected theorem continuous' {g : X → Y} (hf : LocallyFinite f) (h_cov : (⋃ i, f i) = univ)
+ (hc : ∀ i x, x ∈ closure (f i) → ContinuousWithinAt g (f i) x) : Continuous g :=
+ continuous_iff_continuousOn_univ.2 <| h_cov ▸ hf.continuousOn_Union' hc
+#align locally_finite.continuous' LocallyFinite.continuous'
+
+protected theorem continuous {g : X → Y} (hf : LocallyFinite f) (h_cov : (⋃ i, f i) = univ)
+ (h_cl : ∀ i, IsClosed (f i)) (h_cont : ∀ i, ContinuousOn g (f i)) : Continuous g :=
+ continuous_iff_continuousOn_univ.2 <| h_cov ▸ hf.continuousOn_unionᵢ h_cl h_cont
+#align locally_finite.continuous LocallyFinite.continuous
+
/- warning: locally_finite.closure -> LocallyFinite.closure is a dubious translation:
lean 3 declaration is
forall {ι : Type.{u1}} {X : Type.{u2}} [_inst_1 : TopologicalSpace.{u2} X] {f : ι -> (Set.{u2} X)}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (LocallyFinite.{u1, u2} ι X _inst_1 (fun (i : ι) => closure.{u2} X _inst_1 (f i)))
@@ -152,26 +196,6 @@ protected theorem closure (hf : LocallyFinite f) : LocallyFinite fun i => closur
(inter_subset_inter_right _ interior_subset)
#align locally_finite.closure LocallyFinite.closure
-/- warning: locally_finite.is_closed_Union -> LocallyFinite.isClosed_unionᵢ is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {X : Type.{u2}} [_inst_1 : TopologicalSpace.{u2} X] {f : ι -> (Set.{u2} X)}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (forall (i : ι), IsClosed.{u2} X _inst_1 (f i)) -> (IsClosed.{u2} X _inst_1 (Set.unionᵢ.{u2, succ u1} X ι (fun (i : ι) => f i)))
-but is expected to have type
- forall {ι : Type.{u2}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : ι -> (Set.{u1} X)}, (LocallyFinite.{u2, u1} ι X _inst_1 f) -> (forall (i : ι), IsClosed.{u1} X _inst_1 (f i)) -> (IsClosed.{u1} X _inst_1 (Set.unionᵢ.{u1, succ u2} X ι (fun (i : ι) => f i)))
-Case conversion may be inaccurate. Consider using '#align locally_finite.is_closed_Union LocallyFinite.isClosed_unionᵢₓ'. -/
-theorem isClosed_unionᵢ (hf : LocallyFinite f) (hc : ∀ i, IsClosed (f i)) : IsClosed (⋃ i, f i) :=
- by
- simp only [← isOpen_compl_iff, compl_Union, isOpen_iff_mem_nhds, mem_Inter]
- intro a ha
- replace ha : ∀ i, f iᶜ ∈ 𝓝 a := fun i => (hc i).isOpen_compl.mem_nhds (ha i)
- rcases hf a with ⟨t, h_nhds, h_fin⟩
- have : (t ∩ ⋂ i ∈ { i | (f i ∩ t).Nonempty }, f iᶜ) ∈ 𝓝 a :=
- inter_mem h_nhds ((bInter_mem h_fin).2 fun i _ => ha i)
- filter_upwards [this]
- simp only [mem_inter_iff, mem_Inter]
- rintro b ⟨hbt, hn⟩ i hfb
- exact hn i ⟨b, hfb, hbt⟩ hfb
-#align locally_finite.is_closed_Union LocallyFinite.isClosed_unionᵢ
-
/- warning: locally_finite.closure_Union -> LocallyFinite.closure_unionᵢ is a dubious translation:
lean 3 declaration is
forall {ι : Type.{u1}} {X : Type.{u2}} [_inst_1 : TopologicalSpace.{u2} X] {f : ι -> (Set.{u2} X)}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (Eq.{succ u2} (Set.{u2} X) (closure.{u2} X _inst_1 (Set.unionᵢ.{u2, succ u1} X ι (fun (i : ι) => f i))) (Set.unionᵢ.{u2, succ u1} X ι (fun (i : ι) => closure.{u2} X _inst_1 (f i))))
@@ -179,12 +203,21 @@ but is expected to have type
forall {ι : Type.{u2}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : ι -> (Set.{u1} X)}, (LocallyFinite.{u2, u1} ι X _inst_1 f) -> (Eq.{succ u1} (Set.{u1} X) (closure.{u1} X _inst_1 (Set.unionᵢ.{u1, succ u2} X ι (fun (i : ι) => f i))) (Set.unionᵢ.{u1, succ u2} X ι (fun (i : ι) => closure.{u1} X _inst_1 (f i))))
Case conversion may be inaccurate. Consider using '#align locally_finite.closure_Union LocallyFinite.closure_unionᵢₓ'. -/
theorem closure_unionᵢ (h : LocallyFinite f) : closure (⋃ i, f i) = ⋃ i, closure (f i) :=
- Subset.antisymm
- (closure_minimal (unionᵢ_mono fun _ => subset_closure) <|
- h.closure.isClosed_unionᵢ fun _ => isClosed_closure)
- (unionᵢ_subset fun i => closure_mono <| subset_unionᵢ _ _)
+ by
+ ext x
+ simp only [mem_closure_iff_nhdsWithin_neBot, h.nhds_within_Union, supr_ne_bot, mem_Union]
#align locally_finite.closure_Union LocallyFinite.closure_unionᵢ
+/- warning: locally_finite.is_closed_Union -> LocallyFinite.isClosed_unionᵢ is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {X : Type.{u2}} [_inst_1 : TopologicalSpace.{u2} X] {f : ι -> (Set.{u2} X)}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (forall (i : ι), IsClosed.{u2} X _inst_1 (f i)) -> (IsClosed.{u2} X _inst_1 (Set.unionᵢ.{u2, succ u1} X ι (fun (i : ι) => f i)))
+but is expected to have type
+ forall {ι : Type.{u2}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : ι -> (Set.{u1} X)}, (LocallyFinite.{u2, u1} ι X _inst_1 f) -> (forall (i : ι), IsClosed.{u1} X _inst_1 (f i)) -> (IsClosed.{u1} X _inst_1 (Set.unionᵢ.{u1, succ u2} X ι (fun (i : ι) => f i)))
+Case conversion may be inaccurate. Consider using '#align locally_finite.is_closed_Union LocallyFinite.isClosed_unionᵢₓ'. -/
+theorem isClosed_unionᵢ (hf : LocallyFinite f) (hc : ∀ i, IsClosed (f i)) : IsClosed (⋃ i, f i) :=
+ by simp only [← closure_eq_iff_isClosed, hf.closure_Union, (hc _).closure_eq]
+#align locally_finite.is_closed_Union LocallyFinite.isClosed_unionᵢ
+
/- warning: locally_finite.Inter_compl_mem_nhds -> LocallyFinite.interᵢ_compl_mem_nhds is a dubious translation:
lean 3 declaration is
forall {ι : Type.{u1}} {X : Type.{u2}} [_inst_1 : TopologicalSpace.{u2} X] {f : ι -> (Set.{u2} X)}, (LocallyFinite.{u1, u2} ι X _inst_1 f) -> (forall (i : ι), IsClosed.{u2} X _inst_1 (f i)) -> (forall (x : X), Membership.Mem.{u2, u2} (Set.{u2} X) (Filter.{u2} X) (Filter.hasMem.{u2} X) (Set.interᵢ.{u2, succ u1} X ι (fun (i : ι) => Set.interᵢ.{u2, 0} X (Not (Membership.Mem.{u2, u2} X (Set.{u2} X) (Set.hasMem.{u2} X) x (f i))) (fun (hi : Not (Membership.Mem.{u2, u2} X (Set.{u2} X) (Set.hasMem.{u2} X) x (f i))) => HasCompl.compl.{u2} (Set.{u2} X) (BooleanAlgebra.toHasCompl.{u2} (Set.{u2} X) (Set.booleanAlgebra.{u2} X)) (f i)))) (nhds.{u2} X _inst_1 x))
mathlib commit https://github.com/leanprover-community/mathlib/commit/3180fab693e2cee3bff62675571264cb8778b212
@@ -272,7 +272,7 @@ end LocallyFinite
lean 3 declaration is
forall {ι : Type.{u1}} {ι' : Type.{u2}} {X : Type.{u3}} [_inst_1 : TopologicalSpace.{u3} X] {f : ι -> (Set.{u3} X)} (e : Equiv.{succ u2, succ u1} ι' ι), Iff (LocallyFinite.{u2, u3} ι' X _inst_1 (Function.comp.{succ u2, succ u1, succ u3} ι' ι (Set.{u3} X) f (coeFn.{max 1 (max (succ u2) (succ u1)) (succ u1) (succ u2), max (succ u2) (succ u1)} (Equiv.{succ u2, succ u1} ι' ι) (fun (_x : Equiv.{succ u2, succ u1} ι' ι) => ι' -> ι) (Equiv.hasCoeToFun.{succ u2, succ u1} ι' ι) e))) (LocallyFinite.{u1, u3} ι X _inst_1 f)
but is expected to have type
- forall {ι : Type.{u2}} {ι' : Type.{u3}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : ι -> (Set.{u1} X)} (e : Equiv.{succ u3, succ u2} ι' ι), Iff (LocallyFinite.{u3, u1} ι' X _inst_1 (Function.comp.{succ u3, succ u2, succ u1} ι' ι (Set.{u1} X) f (FunLike.coe.{max (succ u2) (succ u3), succ u3, succ u2} (Equiv.{succ u3, succ u2} ι' ι) ι' (fun (_x : ι') => (fun (x._@.Mathlib.Logic.Equiv.Defs._hyg.805 : ι') => ι) _x) (Equiv.instFunLikeEquiv.{succ u3, succ u2} ι' ι) e))) (LocallyFinite.{u2, u1} ι X _inst_1 f)
+ forall {ι : Type.{u2}} {ι' : Type.{u3}} {X : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} X] {f : ι -> (Set.{u1} X)} (e : Equiv.{succ u3, succ u2} ι' ι), Iff (LocallyFinite.{u3, u1} ι' X _inst_1 (Function.comp.{succ u3, succ u2, succ u1} ι' ι (Set.{u1} X) f (FunLike.coe.{max (succ u2) (succ u3), succ u3, succ u2} (Equiv.{succ u3, succ u2} ι' ι) ι' (fun (_x : ι') => (fun (x._@.Mathlib.Logic.Equiv.Defs._hyg.808 : ι') => ι) _x) (Equiv.instFunLikeEquiv.{succ u3, succ u2} ι' ι) e))) (LocallyFinite.{u2, u1} ι X _inst_1 f)
Case conversion may be inaccurate. Consider using '#align equiv.locally_finite_comp_iff Equiv.locallyFinite_comp_iffₓ'. -/
@[simp]
theorem Equiv.locallyFinite_comp_iff (e : ι' ≃ ι) : LocallyFinite (f ∘ e) ↔ LocallyFinite f :=
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
have
, replace
and suffices
(#10640)
No changes to tactic file, it's just boring fixes throughout the library.
This follows on from #6964.
Co-authored-by: sgouezel <sebastien.gouezel@univ-rennes1.fr> Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
@@ -157,10 +157,10 @@ theorem exists_forall_eventually_eq_prod {π : X → Sort*} {f : ℕ → ∀ x :
∃ F : ∀ x : X, π x, ∀ x, ∀ᶠ p : ℕ × X in atTop ×ˢ 𝓝 x, f p.1 p.2 = F p.2 := by
choose U hUx hU using hf
choose N hN using fun x => (hU x).bddAbove
- replace hN : ∀ (x), ∀ n > N x, ∀ y ∈ U x, f (n + 1) y = f n y
- exact fun x n hn y hy => by_contra fun hne => hn.lt.not_le <| hN x ⟨y, hne, hy⟩
- replace hN : ∀ (x), ∀ n ≥ N x + 1, ∀ y ∈ U x, f n y = f (N x + 1) y
- exact fun x n hn y hy => Nat.le_induction rfl (fun k hle => (hN x _ hle _ hy).trans) n hn
+ replace hN : ∀ (x), ∀ n > N x, ∀ y ∈ U x, f (n + 1) y = f n y :=
+ fun x n hn y hy => by_contra fun hne => hn.lt.not_le <| hN x ⟨y, hne, hy⟩
+ replace hN : ∀ (x), ∀ n ≥ N x + 1, ∀ y ∈ U x, f n y = f (N x + 1) y :=
+ fun x n hn y hy => Nat.le_induction rfl (fun k hle => (hN x _ hle _ hy).trans) n hn
refine ⟨fun x => f (N x + 1) x, fun x => ?_⟩
filter_upwards [Filter.prod_mem_prod (eventually_gt_atTop (N x)) (hUx x)]
rintro ⟨n, y⟩ ⟨hn : N x < n, hy : y ∈ U x⟩
From sphere-eversion; I'm just submitting this upstream.
@@ -233,3 +233,10 @@ theorem LocallyFinite.option_elim' (hf : LocallyFinite f) (s : Set X) :
LocallyFinite (Option.elim' s f) :=
locallyFinite_option.2 hf
#align locally_finite.option_elim LocallyFinite.option_elim'
+
+theorem LocallyFinite.eventually_subset {s : ι → Set X}
+ (hs : LocallyFinite s) (hs' : ∀ i, IsClosed (s i)) (x : X) :
+ ∀ᶠ y in 𝓝 x, {i | y ∈ s i} ⊆ {i | x ∈ s i} := by
+ filter_upwards [hs.iInter_compl_mem_nhds hs' x] with y hy i hi
+ simp only [mem_iInter, mem_compl_iff] at hy
+ exact not_imp_not.mp (hy i) hi
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -20,7 +20,7 @@ In this file we give the definition and prove basic properties of locally finite
-- locally finite family [General Topology (Bourbaki, 1995)]
open Set Function Filter Topology
-variable {ι ι' α X Y : Type _} [TopologicalSpace X] [TopologicalSpace Y] {f g : ι → Set X}
+variable {ι ι' α X Y : Type*} [TopologicalSpace X] [TopologicalSpace Y] {f g : ι → Set X}
/-- A family of sets in `Set X` is locally finite if at every point `x : X`,
there is a neighborhood of `x` which meets only finitely many sets in the family. -/
@@ -68,7 +68,7 @@ protected theorem eventually_smallSets (hf : LocallyFinite f) (x : X) :
locallyFinite_iff_smallSets.mp hf x
#align locally_finite.eventually_small_sets LocallyFinite.eventually_smallSets
-theorem exists_mem_basis {ι' : Sort _} (hf : LocallyFinite f) {p : ι' → Prop} {s : ι' → Set X}
+theorem exists_mem_basis {ι' : Sort*} (hf : LocallyFinite f) {p : ι' → Prop} {s : ι' → Set X}
{x : X} (hb : (𝓝 x).HasBasis p s) : ∃ i, p i ∧ { j | (f j ∩ s i).Nonempty }.Finite :=
let ⟨i, hpi, hi⟩ := hb.smallSets.eventually_iff.mp (hf.eventually_smallSets x)
⟨i, hpi, hi Subset.rfl⟩
@@ -152,7 +152,7 @@ function `F : Π a, β a` such that for any `x`, we have `f n x = F x` on the pr
interval `[N, +∞)` and a neighbourhood of `x`.
We formulate the conclusion in terms of the product of filter `Filter.atTop` and `𝓝 x`. -/
-theorem exists_forall_eventually_eq_prod {π : X → Sort _} {f : ℕ → ∀ x : X, π x}
+theorem exists_forall_eventually_eq_prod {π : X → Sort*} {f : ℕ → ∀ x : X, π x}
(hf : LocallyFinite fun n => { x | f (n + 1) x ≠ f n x }) :
∃ F : ∀ x : X, π x, ∀ x, ∀ᶠ p : ℕ × X in atTop ×ˢ 𝓝 x, f p.1 p.2 = F p.2 := by
choose U hUx hU using hf
@@ -174,7 +174,7 @@ theorem exists_forall_eventually_eq_prod {π : X → Sort _} {f : ℕ → ∀ x
that the family of sets `s n = {x | f (n + 1) x ≠ f n x}` is locally finite. Then there exists a
function `F : Π a, β a` such that for any `x`, for sufficiently large values of `n`, we have
`f n y = F y` in a neighbourhood of `x`. -/
-theorem exists_forall_eventually_atTop_eventually_eq' {π : X → Sort _} {f : ℕ → ∀ x : X, π x}
+theorem exists_forall_eventually_atTop_eventually_eq' {π : X → Sort*} {f : ℕ → ∀ x : X, π x}
(hf : LocallyFinite fun n => { x | f (n + 1) x ≠ f n x }) :
∃ F : ∀ x : X, π x, ∀ x, ∀ᶠ n : ℕ in atTop, ∀ᶠ y : X in 𝓝 x, f n y = F y :=
hf.exists_forall_eventually_eq_prod.imp fun _F hF x => (hF x).curry
@@ -59,7 +59,7 @@ theorem comp_injective {g : ι' → ι} (hf : LocallyFinite f) (hg : Injective g
theorem _root_.locallyFinite_iff_smallSets :
LocallyFinite f ↔ ∀ x, ∀ᶠ s in (𝓝 x).smallSets, { i | (f i ∩ s).Nonempty }.Finite :=
forall_congr' fun _ => Iff.symm <|
- eventually_small_sets' fun _s _t hst ht =>
+ eventually_smallSets' fun _s _t hst ht =>
ht.subset fun _i hi => hi.mono <| inter_subset_inter_right _ hst
#align locally_finite_iff_small_sets locallyFinite_iff_smallSets
A typo restricted LocallyFinite.prod_left
to (f g : ι → Set Y)
instead of (f : ι → Set X) (g : ι → Set Y)
.
@@ -199,7 +199,7 @@ theorem preimage_continuous {g : Y → X} (hf : LocallyFinite f) (hg : Continuou
theorem prod_right (hf : LocallyFinite f) (g : ι → Set Y) : LocallyFinite (fun i ↦ f i ×ˢ g i) :=
(hf.preimage_continuous continuous_fst).subset fun _ ↦ prod_subset_preimage_fst _ _
-theorem prod_left {g : ι → Set Y} (hg : LocallyFinite g) (f : ι → Set Y) :
+theorem prod_left {g : ι → Set Y} (hg : LocallyFinite g) (f : ι → Set X) :
LocallyFinite (fun i ↦ f i ×ˢ g i) :=
(hg.preimage_continuous continuous_snd).subset fun _ ↦ prod_subset_preimage_snd _ _
@@ -2,15 +2,12 @@
Copyright (c) 2022 Yury Kudryashov. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Yury Kudryashov
-
-! This file was ported from Lean 3 source module topology.locally_finite
-! leanprover-community/mathlib commit 55d771df074d0dd020139ee1cd4b95521422df9f
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.Topology.ContinuousOn
import Mathlib.Order.Filter.SmallSets
+#align_import topology.locally_finite from "leanprover-community/mathlib"@"55d771df074d0dd020139ee1cd4b95521422df9f"
+
/-!
### Locally finite families of sets
LocallyFinite.prod_left
and LocallyFinite.prod_right
(#5953)
From the sphere eversion project.
@@ -194,11 +194,18 @@ theorem exists_forall_eventually_atTop_eventuallyEq {f : ℕ → X → α}
#align locally_finite.exists_forall_eventually_at_top_eventually_eq LocallyFinite.exists_forall_eventually_atTop_eventuallyEq
theorem preimage_continuous {g : Y → X} (hf : LocallyFinite f) (hg : Continuous g) :
- LocallyFinite fun i => g ⁻¹' f i := fun x =>
+ LocallyFinite (g ⁻¹' f ·) := fun x =>
let ⟨s, hsx, hs⟩ := hf (g x)
⟨g ⁻¹' s, hg.continuousAt hsx, hs.subset fun _ ⟨y, hy⟩ => ⟨g y, hy⟩⟩
#align locally_finite.preimage_continuous LocallyFinite.preimage_continuous
+theorem prod_right (hf : LocallyFinite f) (g : ι → Set Y) : LocallyFinite (fun i ↦ f i ×ˢ g i) :=
+ (hf.preimage_continuous continuous_fst).subset fun _ ↦ prod_subset_preimage_fst _ _
+
+theorem prod_left {g : ι → Set Y} (hg : LocallyFinite g) (f : ι → Set Y) :
+ LocallyFinite (fun i ↦ f i ×ˢ g i) :=
+ (hg.preimage_continuous continuous_snd).subset fun _ ↦ prod_subset_preimage_snd _ _
+
end LocallyFinite
@[simp]
@@ -109,13 +109,13 @@ theorem continuousOn_iUnion {g : X → Y} (hf : LocallyFinite f) (h_cl : ∀ i,
hf.continuousOn_iUnion' fun i x hx ↦ h_cont i x <| (h_cl i).closure_subset hx
#align locally_finite.continuous_on_Union LocallyFinite.continuousOn_iUnion
-protected theorem continuous' {g : X → Y} (hf : LocallyFinite f) (h_cov : (⋃ i, f i) = univ)
+protected theorem continuous' {g : X → Y} (hf : LocallyFinite f) (h_cov : ⋃ i, f i = univ)
(hc : ∀ i x, x ∈ closure (f i) → ContinuousWithinAt g (f i) x) :
Continuous g :=
continuous_iff_continuousOn_univ.2 <| h_cov ▸ hf.continuousOn_iUnion' hc
#align locally_finite.continuous' LocallyFinite.continuous'
-protected theorem continuous {g : X → Y} (hf : LocallyFinite f) (h_cov : (⋃ i, f i) = univ)
+protected theorem continuous {g : X → Y} (hf : LocallyFinite f) (h_cov : ⋃ i, f i = univ)
(h_cl : ∀ i, IsClosed (f i)) (h_cont : ∀ i, ContinuousOn g (f i)) :
Continuous g :=
continuous_iff_continuousOn_univ.2 <| h_cov ▸ hf.continuousOn_iUnion h_cl h_cont
@@ -142,7 +142,7 @@ theorem isClosed_iUnion (hf : LocallyFinite f) (hc : ∀ i, IsClosed (f i)) :
/-- If `f : β → Set α` is a locally finite family of closed sets, then for any `x : α`, the
intersection of the complements to `f i`, `x ∉ f i`, is a neighbourhood of `x`. -/
theorem iInter_compl_mem_nhds (hf : LocallyFinite f) (hc : ∀ i, IsClosed (f i)) (x : X) :
- (⋂ (i) (_ : x ∉ f i), f iᶜ) ∈ 𝓝 x := by
+ (⋂ (i) (_ : x ∉ f i), (f i)ᶜ) ∈ 𝓝 x := by
refine' IsOpen.mem_nhds _ (mem_iInter₂.2 fun i => id)
suffices IsClosed (⋃ i : { i // x ∉ f i }, f i) by
rwa [← isOpen_compl_iff, compl_iUnion, iInter_subtype] at this
@@ -142,7 +142,7 @@ theorem isClosed_iUnion (hf : LocallyFinite f) (hc : ∀ i, IsClosed (f i)) :
/-- If `f : β → Set α` is a locally finite family of closed sets, then for any `x : α`, the
intersection of the complements to `f i`, `x ∉ f i`, is a neighbourhood of `x`. -/
theorem iInter_compl_mem_nhds (hf : LocallyFinite f) (hc : ∀ i, IsClosed (f i)) (x : X) :
- (⋂ (i) (_hi : x ∉ f i), f iᶜ) ∈ 𝓝 x := by
+ (⋂ (i) (_ : x ∉ f i), f iᶜ) ∈ 𝓝 x := by
refine' IsOpen.mem_nhds _ (mem_iInter₂.2 fun i => id)
suffices IsClosed (⋃ i : { i // x ∉ f i }, f i) by
rwa [← isOpen_compl_iff, compl_iUnion, iInter_subtype] at this
SProd
to implement overloaded notation · ×ˢ ·
(#4200)
Currently, the following notations are changed from · ×ˢ ·
because Lean 4 can't deal with ambiguous notations.
| Definition | Notation |
| :
Co-authored-by: Jeremy Tan Jie Rui <reddeloostw@gmail.com> Co-authored-by: Kyle Miller <kmill31415@gmail.com> Co-authored-by: Chris Hughes <chrishughes24@gmail.com>
@@ -157,7 +157,7 @@ interval `[N, +∞)` and a neighbourhood of `x`.
We formulate the conclusion in terms of the product of filter `Filter.atTop` and `𝓝 x`. -/
theorem exists_forall_eventually_eq_prod {π : X → Sort _} {f : ℕ → ∀ x : X, π x}
(hf : LocallyFinite fun n => { x | f (n + 1) x ≠ f n x }) :
- ∃ F : ∀ x : X, π x, ∀ x, ∀ᶠ p : ℕ × X in atTop ×ᶠ 𝓝 x, f p.1 p.2 = F p.2 := by
+ ∃ F : ∀ x : X, π x, ∀ x, ∀ᶠ p : ℕ × X in atTop ×ˢ 𝓝 x, f p.1 p.2 = F p.2 := by
choose U hUx hU using hf
choose N hN using fun x => (hU x).bddAbove
replace hN : ∀ (x), ∀ n > N x, ∀ y ∈ U x, f (n + 1) y = f n y
fix-comments.py
on all files.@@ -139,7 +139,7 @@ theorem isClosed_iUnion (hf : LocallyFinite f) (hc : ∀ i, IsClosed (f i)) :
simp only [← closure_eq_iff_isClosed, hf.closure_iUnion, (hc _).closure_eq]
#align locally_finite.is_closed_Union LocallyFinite.isClosed_iUnion
-/-- If `f : β → set α` is a locally finite family of closed sets, then for any `x : α`, the
+/-- If `f : β → Set α` is a locally finite family of closed sets, then for any `x : α`, the
intersection of the complements to `f i`, `x ∉ f i`, is a neighbourhood of `x`. -/
theorem iInter_compl_mem_nhds (hf : LocallyFinite f) (hc : ∀ i, IsClosed (f i)) (x : X) :
(⋂ (i) (_hi : x ∉ f i), f iᶜ) ∈ 𝓝 x := by
sSup
/iSup
(#3938)
As discussed on Zulip
supₛ
→ sSup
infₛ
→ sInf
supᵢ
→ iSup
infᵢ
→ iInf
bsupₛ
→ bsSup
binfₛ
→ bsInf
bsupᵢ
→ biSup
binfᵢ
→ biInf
csupₛ
→ csSup
cinfₛ
→ csInf
csupᵢ
→ ciSup
cinfᵢ
→ ciInf
unionₛ
→ sUnion
interₛ
→ sInter
unionᵢ
→ iUnion
interᵢ
→ iInter
bunionₛ
→ bsUnion
binterₛ
→ bsInter
bunionᵢ
→ biUnion
binterᵢ
→ biInter
Co-authored-by: Parcly Taxel <reddeloostw@gmail.com>
@@ -77,48 +77,48 @@ theorem exists_mem_basis {ι' : Sort _} (hf : LocallyFinite f) {p : ι' → Prop
⟨i, hpi, hi Subset.rfl⟩
#align locally_finite.exists_mem_basis LocallyFinite.exists_mem_basis
-protected theorem nhdsWithin_unionᵢ (hf : LocallyFinite f) (a : X) :
+protected theorem nhdsWithin_iUnion (hf : LocallyFinite f) (a : X) :
𝓝[⋃ i, f i] a = ⨆ i, 𝓝[f i] a := by
rcases hf a with ⟨U, haU, hfin⟩
- refine le_antisymm ?_ (Monotone.le_map_supᵢ fun _ _ ↦ nhdsWithin_mono _)
+ refine le_antisymm ?_ (Monotone.le_map_iSup fun _ _ ↦ nhdsWithin_mono _)
calc
𝓝[⋃ i, f i] a = 𝓝[⋃ i, f i ∩ U] a := by
- rw [← unionᵢ_inter, ← nhdsWithin_inter_of_mem' (nhdsWithin_le_nhds haU)]
+ rw [← iUnion_inter, ← nhdsWithin_inter_of_mem' (nhdsWithin_le_nhds haU)]
_ = 𝓝[⋃ i ∈ {j | (f j ∩ U).Nonempty}, (f i ∩ U)] a := by
- simp only [mem_setOf_eq, unionᵢ_nonempty_self]
- _ = ⨆ i ∈ {j | (f j ∩ U).Nonempty}, 𝓝[f i ∩ U] a := nhdsWithin_bunionᵢ hfin _ _
- _ ≤ ⨆ i, 𝓝[f i ∩ U] a := supᵢ₂_le_supᵢ _ _
- _ ≤ ⨆ i, 𝓝[f i] a := supᵢ_mono fun i ↦ nhdsWithin_mono _ <| inter_subset_left _ _
-#align locally_finite.nhds_within_Union LocallyFinite.nhdsWithin_unionᵢ
+ simp only [mem_setOf_eq, iUnion_nonempty_self]
+ _ = ⨆ i ∈ {j | (f j ∩ U).Nonempty}, 𝓝[f i ∩ U] a := nhdsWithin_biUnion hfin _ _
+ _ ≤ ⨆ i, 𝓝[f i ∩ U] a := iSup₂_le_iSup _ _
+ _ ≤ ⨆ i, 𝓝[f i] a := iSup_mono fun i ↦ nhdsWithin_mono _ <| inter_subset_left _ _
+#align locally_finite.nhds_within_Union LocallyFinite.nhdsWithin_iUnion
-theorem continuousOn_unionᵢ' {g : X → Y} (hf : LocallyFinite f)
+theorem continuousOn_iUnion' {g : X → Y} (hf : LocallyFinite f)
(hc : ∀ i x, x ∈ closure (f i) → ContinuousWithinAt g (f i) x) :
ContinuousOn g (⋃ i, f i) := by
rintro x -
- rw [ContinuousWithinAt, hf.nhdsWithin_unionᵢ, tendsto_supᵢ]
+ rw [ContinuousWithinAt, hf.nhdsWithin_iUnion, tendsto_iSup]
intro i
by_cases hx : x ∈ closure (f i)
· exact hc i _ hx
· rw [mem_closure_iff_nhdsWithin_neBot, not_neBot] at hx
rw [hx]
exact tendsto_bot
-#align locally_finite.continuous_on_Union' LocallyFinite.continuousOn_unionᵢ'
+#align locally_finite.continuous_on_Union' LocallyFinite.continuousOn_iUnion'
-theorem continuousOn_unionᵢ {g : X → Y} (hf : LocallyFinite f) (h_cl : ∀ i, IsClosed (f i))
+theorem continuousOn_iUnion {g : X → Y} (hf : LocallyFinite f) (h_cl : ∀ i, IsClosed (f i))
(h_cont : ∀ i, ContinuousOn g (f i)) : ContinuousOn g (⋃ i, f i) :=
- hf.continuousOn_unionᵢ' fun i x hx ↦ h_cont i x <| (h_cl i).closure_subset hx
-#align locally_finite.continuous_on_Union LocallyFinite.continuousOn_unionᵢ
+ hf.continuousOn_iUnion' fun i x hx ↦ h_cont i x <| (h_cl i).closure_subset hx
+#align locally_finite.continuous_on_Union LocallyFinite.continuousOn_iUnion
protected theorem continuous' {g : X → Y} (hf : LocallyFinite f) (h_cov : (⋃ i, f i) = univ)
(hc : ∀ i x, x ∈ closure (f i) → ContinuousWithinAt g (f i) x) :
Continuous g :=
- continuous_iff_continuousOn_univ.2 <| h_cov ▸ hf.continuousOn_unionᵢ' hc
+ continuous_iff_continuousOn_univ.2 <| h_cov ▸ hf.continuousOn_iUnion' hc
#align locally_finite.continuous' LocallyFinite.continuous'
protected theorem continuous {g : X → Y} (hf : LocallyFinite f) (h_cov : (⋃ i, f i) = univ)
(h_cl : ∀ i, IsClosed (f i)) (h_cont : ∀ i, ContinuousOn g (f i)) :
Continuous g :=
- continuous_iff_continuousOn_univ.2 <| h_cov ▸ hf.continuousOn_unionᵢ h_cl h_cont
+ continuous_iff_continuousOn_univ.2 <| h_cov ▸ hf.continuousOn_iUnion h_cl h_cont
#align locally_finite.continuous LocallyFinite.continuous
protected theorem closure (hf : LocallyFinite f) : LocallyFinite fun i => closure (f i) := by
@@ -129,25 +129,25 @@ protected theorem closure (hf : LocallyFinite f) : LocallyFinite fun i => closur
(inter_subset_inter_right _ interior_subset)
#align locally_finite.closure LocallyFinite.closure
-theorem closure_unionᵢ (h : LocallyFinite f) : closure (⋃ i, f i) = ⋃ i, closure (f i) := by
+theorem closure_iUnion (h : LocallyFinite f) : closure (⋃ i, f i) = ⋃ i, closure (f i) := by
ext x
- simp only [mem_closure_iff_nhdsWithin_neBot, h.nhdsWithin_unionᵢ, supᵢ_neBot, mem_unionᵢ]
-#align locally_finite.closure_Union LocallyFinite.closure_unionᵢ
+ simp only [mem_closure_iff_nhdsWithin_neBot, h.nhdsWithin_iUnion, iSup_neBot, mem_iUnion]
+#align locally_finite.closure_Union LocallyFinite.closure_iUnion
-theorem isClosed_unionᵢ (hf : LocallyFinite f) (hc : ∀ i, IsClosed (f i)) :
+theorem isClosed_iUnion (hf : LocallyFinite f) (hc : ∀ i, IsClosed (f i)) :
IsClosed (⋃ i, f i) := by
- simp only [← closure_eq_iff_isClosed, hf.closure_unionᵢ, (hc _).closure_eq]
-#align locally_finite.is_closed_Union LocallyFinite.isClosed_unionᵢ
+ simp only [← closure_eq_iff_isClosed, hf.closure_iUnion, (hc _).closure_eq]
+#align locally_finite.is_closed_Union LocallyFinite.isClosed_iUnion
/-- If `f : β → set α` is a locally finite family of closed sets, then for any `x : α`, the
intersection of the complements to `f i`, `x ∉ f i`, is a neighbourhood of `x`. -/
-theorem interᵢ_compl_mem_nhds (hf : LocallyFinite f) (hc : ∀ i, IsClosed (f i)) (x : X) :
+theorem iInter_compl_mem_nhds (hf : LocallyFinite f) (hc : ∀ i, IsClosed (f i)) (x : X) :
(⋂ (i) (_hi : x ∉ f i), f iᶜ) ∈ 𝓝 x := by
- refine' IsOpen.mem_nhds _ (mem_interᵢ₂.2 fun i => id)
+ refine' IsOpen.mem_nhds _ (mem_iInter₂.2 fun i => id)
suffices IsClosed (⋃ i : { i // x ∉ f i }, f i) by
- rwa [← isOpen_compl_iff, compl_unionᵢ, interᵢ_subtype] at this
- exact (hf.comp_injective Subtype.val_injective).isClosed_unionᵢ fun i => hc _
-#align locally_finite.Inter_compl_mem_nhds LocallyFinite.interᵢ_compl_mem_nhds
+ rwa [← isOpen_compl_iff, compl_iUnion, iInter_subtype] at this
+ exact (hf.comp_injective Subtype.val_injective).isClosed_iUnion fun i => hc _
+#align locally_finite.Inter_compl_mem_nhds LocallyFinite.iInter_compl_mem_nhds
/-- Let `f : ℕ → Π a, β a` be a sequence of (dependent) functions on a topological space. Suppose
that the family of sets `s n = {x | f (n + 1) x ≠ f n x}` is locally finite. Then there exists a
@@ -4,11 +4,11 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Yury Kudryashov
! This file was ported from Lean 3 source module topology.locally_finite
-! leanprover-community/mathlib commit f2ce6086713c78a7f880485f7917ea547a215982
+! leanprover-community/mathlib commit 55d771df074d0dd020139ee1cd4b95521422df9f
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
-import Mathlib.Topology.Basic
+import Mathlib.Topology.ContinuousOn
import Mathlib.Order.Filter.SmallSets
/-!
@@ -77,36 +77,68 @@ theorem exists_mem_basis {ι' : Sort _} (hf : LocallyFinite f) {p : ι' → Prop
⟨i, hpi, hi Subset.rfl⟩
#align locally_finite.exists_mem_basis LocallyFinite.exists_mem_basis
+protected theorem nhdsWithin_unionᵢ (hf : LocallyFinite f) (a : X) :
+ 𝓝[⋃ i, f i] a = ⨆ i, 𝓝[f i] a := by
+ rcases hf a with ⟨U, haU, hfin⟩
+ refine le_antisymm ?_ (Monotone.le_map_supᵢ fun _ _ ↦ nhdsWithin_mono _)
+ calc
+ 𝓝[⋃ i, f i] a = 𝓝[⋃ i, f i ∩ U] a := by
+ rw [← unionᵢ_inter, ← nhdsWithin_inter_of_mem' (nhdsWithin_le_nhds haU)]
+ _ = 𝓝[⋃ i ∈ {j | (f j ∩ U).Nonempty}, (f i ∩ U)] a := by
+ simp only [mem_setOf_eq, unionᵢ_nonempty_self]
+ _ = ⨆ i ∈ {j | (f j ∩ U).Nonempty}, 𝓝[f i ∩ U] a := nhdsWithin_bunionᵢ hfin _ _
+ _ ≤ ⨆ i, 𝓝[f i ∩ U] a := supᵢ₂_le_supᵢ _ _
+ _ ≤ ⨆ i, 𝓝[f i] a := supᵢ_mono fun i ↦ nhdsWithin_mono _ <| inter_subset_left _ _
+#align locally_finite.nhds_within_Union LocallyFinite.nhdsWithin_unionᵢ
+
+theorem continuousOn_unionᵢ' {g : X → Y} (hf : LocallyFinite f)
+ (hc : ∀ i x, x ∈ closure (f i) → ContinuousWithinAt g (f i) x) :
+ ContinuousOn g (⋃ i, f i) := by
+ rintro x -
+ rw [ContinuousWithinAt, hf.nhdsWithin_unionᵢ, tendsto_supᵢ]
+ intro i
+ by_cases hx : x ∈ closure (f i)
+ · exact hc i _ hx
+ · rw [mem_closure_iff_nhdsWithin_neBot, not_neBot] at hx
+ rw [hx]
+ exact tendsto_bot
+#align locally_finite.continuous_on_Union' LocallyFinite.continuousOn_unionᵢ'
+
+theorem continuousOn_unionᵢ {g : X → Y} (hf : LocallyFinite f) (h_cl : ∀ i, IsClosed (f i))
+ (h_cont : ∀ i, ContinuousOn g (f i)) : ContinuousOn g (⋃ i, f i) :=
+ hf.continuousOn_unionᵢ' fun i x hx ↦ h_cont i x <| (h_cl i).closure_subset hx
+#align locally_finite.continuous_on_Union LocallyFinite.continuousOn_unionᵢ
+
+protected theorem continuous' {g : X → Y} (hf : LocallyFinite f) (h_cov : (⋃ i, f i) = univ)
+ (hc : ∀ i x, x ∈ closure (f i) → ContinuousWithinAt g (f i) x) :
+ Continuous g :=
+ continuous_iff_continuousOn_univ.2 <| h_cov ▸ hf.continuousOn_unionᵢ' hc
+#align locally_finite.continuous' LocallyFinite.continuous'
+
+protected theorem continuous {g : X → Y} (hf : LocallyFinite f) (h_cov : (⋃ i, f i) = univ)
+ (h_cl : ∀ i, IsClosed (f i)) (h_cont : ∀ i, ContinuousOn g (f i)) :
+ Continuous g :=
+ continuous_iff_continuousOn_univ.2 <| h_cov ▸ hf.continuousOn_unionᵢ h_cl h_cont
+#align locally_finite.continuous LocallyFinite.continuous
+
protected theorem closure (hf : LocallyFinite f) : LocallyFinite fun i => closure (f i) := by
intro x
rcases hf x with ⟨s, hsx, hsf⟩
refine' ⟨interior s, interior_mem_nhds.2 hsx, hsf.subset fun i hi => _⟩
- exact
- (hi.mono isOpen_interior.closure_inter).of_closure.mono
- (inter_subset_inter_right _ interior_subset)
+ exact (hi.mono isOpen_interior.closure_inter).of_closure.mono
+ (inter_subset_inter_right _ interior_subset)
#align locally_finite.closure LocallyFinite.closure
+theorem closure_unionᵢ (h : LocallyFinite f) : closure (⋃ i, f i) = ⋃ i, closure (f i) := by
+ ext x
+ simp only [mem_closure_iff_nhdsWithin_neBot, h.nhdsWithin_unionᵢ, supᵢ_neBot, mem_unionᵢ]
+#align locally_finite.closure_Union LocallyFinite.closure_unionᵢ
+
theorem isClosed_unionᵢ (hf : LocallyFinite f) (hc : ∀ i, IsClosed (f i)) :
IsClosed (⋃ i, f i) := by
- simp only [← isOpen_compl_iff, compl_unionᵢ, isOpen_iff_mem_nhds, mem_interᵢ]
- intro a ha
- replace ha : ∀ i, f iᶜ ∈ 𝓝 a := fun i => (hc i).compl_mem_nhds (ha i)
- rcases hf a with ⟨t, h_nhds, h_fin⟩
- have : (t ∩ ⋂ i ∈ { i | (f i ∩ t).Nonempty }, f iᶜ) ∈ 𝓝 a :=
- inter_mem h_nhds ((binterᵢ_mem h_fin).2 fun i _ => ha i)
- filter_upwards [this]
- simp only [mem_inter_iff, mem_interᵢ]
- rintro b ⟨hbt, hn⟩ i hfb
- exact hn i ⟨b, hfb, hbt⟩ hfb
+ simp only [← closure_eq_iff_isClosed, hf.closure_unionᵢ, (hc _).closure_eq]
#align locally_finite.is_closed_Union LocallyFinite.isClosed_unionᵢ
-theorem closure_unionᵢ (h : LocallyFinite f) : closure (⋃ i, f i) = ⋃ i, closure (f i) :=
- Subset.antisymm
- (closure_minimal (unionᵢ_mono fun _ => subset_closure) <|
- h.closure.isClosed_unionᵢ fun _ => isClosed_closure)
- (unionᵢ_subset fun _ => closure_mono <| subset_unionᵢ _ _)
-#align locally_finite.closure_Union LocallyFinite.closure_unionᵢ
-
/-- If `f : β → set α` is a locally finite family of closed sets, then for any `x : α`, the
intersection of the complements to `f i`, `x ∉ f i`, is a neighbourhood of `x`. -/
theorem interᵢ_compl_mem_nhds (hf : LocallyFinite f) (hc : ∀ i, IsClosed (f i)) (x : X) :
This PR resyncs the first 28 entries of https://leanprover-community.github.io/mathlib-port-status/out-of-sync.html after sorting by diff size.
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Yury Kudryashov
! This file was ported from Lean 3 source module topology.locally_finite
-! leanprover-community/mathlib commit f7fc89d5d5ff1db2d1242c7bb0e9062ce47ef47c
+! leanprover-community/mathlib commit f2ce6086713c78a7f880485f7917ea547a215982
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
The unported dependencies are