Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 6cf5dc5

Browse files
committed
feat(topology/support): add lemma locally_finite.exists_finset_nhd_mul_support_subset (#13006)
When using a partition of unity to glue together a family of functions, this lemma allows us to pass to a finite family in the neighbourhood of any point. Formalized as part of the Sphere Eversion project.
1 parent 912f195 commit 6cf5dc5

File tree

3 files changed

+56
-1
lines changed

3 files changed

+56
-1
lines changed

src/data/finset/basic.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1471,6 +1471,10 @@ multiset.subset_of_le (multiset.monotone_filter_right s.val h)
14711471
@[simp, norm_cast] lemma coe_filter (s : finset α) : ↑(s.filter p) = ({x ∈ ↑s | p x} : set α) :=
14721472
set.ext $ λ _, mem_filter
14731473

1474+
lemma subset_coe_filter_of_subset_forall (s : finset α) {t : set α}
1475+
(h₁ : t ⊆ s) (h₂ : ∀ x ∈ t, p x) : t ⊆ s.filter p :=
1476+
λ x hx, (s.coe_filter p).symm ▸ ⟨h₁ hx, h₂ x hx⟩
1477+
14741478
theorem filter_singleton (a : α) : filter p (singleton a) = if p a then singleton a else ∅ :=
14751479
by { classical, ext x, simp, split_ifs with h; by_cases h' : x = a; simp [h, h'] }
14761480

src/topology/partition_of_unity.lean

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,9 +145,17 @@ lemma le_one (i : ι) (x : X) : f i x ≤ 1 :=
145145

146146
/-- A partition of unity `f i` is subordinate to a family of sets `U i` indexed by the same type if
147147
for each `i` the closure of the support of `f i` is a subset of `U i`. -/
148-
def is_subordinate (f : partition_of_unity ι X s) (U : ι → set X) : Prop :=
148+
def is_subordinate (U : ι → set X) : Prop :=
149149
∀ i, tsupport (f i) ⊆ U i
150150

151+
variables {f}
152+
153+
lemma exists_finset_nhd_support_subset {U : ι → set X}
154+
(hso : f.is_subordinate U) (ho : ∀ i, is_open (U i)) (x : X) :
155+
∃ (is : finset ι) {n : set X} (hn₁ : n ∈ 𝓝 x) (hn₂ : n ⊆ ⋂ i ∈ is, U i), ∀ (z ∈ n),
156+
support (λ i, f i z) ⊆ is :=
157+
f.locally_finite.exists_finset_nhd_support_subset hso ho x
158+
151159
end partition_of_unity
152160

153161
namespace bump_covering

src/topology/support.lean

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,3 +214,46 @@ begin
214214
end
215215

216216
end mul_zero_class
217+
218+
namespace locally_finite
219+
220+
variables {ι : Type*} {U : ι → set X} [topological_space X] [has_one R]
221+
222+
/-- If a family of functions `f` has locally-finite multiplicative support, subordinate to a family
223+
of open sets, then for any point we can find a neighbourhood on which only finitely-many members of
224+
`f` are not equal to 1. -/
225+
@[to_additive
226+
/-" If a family of functions `f` has locally-finite support, subordinate to a family of open sets,
227+
then for any point we can find a neighbourhood on which only finitely-many members of `f` are
228+
non-zero. "-/]
229+
lemma exists_finset_nhd_mul_support_subset
230+
{f : ι → X → R} (hlf : locally_finite (λ i, mul_support (f i)))
231+
(hso : ∀ i, mul_tsupport (f i) ⊆ U i) (ho : ∀ i, is_open (U i)) (x : X) :
232+
∃ (is : finset ι) {n : set X} (hn₁ : n ∈ 𝓝 x) (hn₂ : n ⊆ ⋂ i ∈ is, U i), ∀ (z ∈ n),
233+
mul_support (λ i, f i z) ⊆ is :=
234+
begin
235+
obtain ⟨n, hn, hnf⟩ := hlf x,
236+
classical,
237+
let is := hnf.to_finset.filter (λ i, x ∈ U i),
238+
let js := hnf.to_finset.filter (λ j, x ∉ U j),
239+
refine ⟨is, n ∩ (⋂ j ∈ js, (mul_tsupport (f j))ᶜ) ∩ (⋂ i ∈ is, U i),
240+
inter_mem (inter_mem hn _) _, inter_subset_right _ _, λ z hz, _⟩,
241+
{ exact (bInter_finset_mem js).mpr (λ j hj, is_closed.compl_mem_nhds
242+
(is_closed_mul_tsupport _) (set.not_mem_subset (hso j) (finset.mem_filter.mp hj).2)), },
243+
{ exact (bInter_finset_mem is).mpr (λ i hi, (ho i).mem_nhds (finset.mem_filter.mp hi).2) },
244+
{ have hzn : z ∈ n,
245+
{ rw inter_assoc at hz,
246+
exact mem_of_mem_inter_left hz, },
247+
replace hz := mem_of_mem_inter_right (mem_of_mem_inter_left hz),
248+
simp only [finset.mem_filter, finite.mem_to_finset, mem_set_of_eq, mem_Inter, and_imp] at hz,
249+
suffices : mul_support (λ i, f i z) ⊆ hnf.to_finset,
250+
{ refine hnf.to_finset.subset_coe_filter_of_subset_forall _ this (λ i hi, _),
251+
specialize hz i ⟨z, ⟨hi, hzn⟩⟩,
252+
contrapose hz,
253+
simp [hz, subset_mul_tsupport (f i) hi], },
254+
intros i hi,
255+
simp only [finite.coe_to_finset, mem_set_of_eq],
256+
exact ⟨z, ⟨hi, hzn⟩⟩, },
257+
end
258+
259+
end locally_finite

0 commit comments

Comments
 (0)