Skip to content

Commit 2e3b63a

Browse files
Merge pull request #73 from MathNetwork/develop
Fix main CI: drop unused import (shake 39→38)
2 parents fc57b59 + c60d023 commit 2e3b63a

4 files changed

Lines changed: 262 additions & 6 deletions

File tree

OpenGALib/Manifold.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import OpenGALib.Manifold.Charts.CoordinateBall
2+
import OpenGALib.Manifold.Charts.PrecompactBasis
23

34
/-!
45
# Manifold

OpenGALib/Manifold/Charts/CoordinateBall.lean

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import Mathlib.Analysis.InnerProductSpace.PiL2
22
import Mathlib.Geometry.Manifold.ChartedSpace
3-
import Mathlib.Geometry.Manifold.ContMDiff.Atlas
43
import Mathlib.Geometry.Manifold.Instances.Real
54
import Mathlib.Topology.Bases
65
import Mathlib.Topology.Separation.Basic
Lines changed: 256 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,256 @@
1+
import Mathlib.Analysis.InnerProductSpace.PiL2
2+
import Mathlib.Geometry.Manifold.ChartedSpace
3+
import Mathlib.Geometry.Manifold.Instances.Real
4+
import Mathlib.Topology.Bases
5+
import Mathlib.Topology.Compactness.Paracompact
6+
import Mathlib.Topology.Compactness.SigmaCompact
7+
import Mathlib.Topology.Separation.Basic
8+
import Mathlib.Topology.Sets.OpenCover
9+
import OpenGALib.Manifold.Charts.CoordinateBall
10+
11+
/-!
12+
# Precompact coordinate balls and locally finite refinements
13+
14+
Covering infrastructure beneath partitions of unity and exhaustions. A
15+
*precompact coordinate ball* is the source of a coordinate-ball chart with
16+
compact closure; on a topological `n`-manifold (Hausdorff, second-countable,
17+
charted over `EuclideanSpace ℝ (Fin n)`) these form a countable basis, and
18+
together with paracompactness every open cover admits a countable, locally
19+
finite refinement by precompact coordinate balls subordinate to it.
20+
21+
The development is layered: the basis results need only the ambient topology
22+
and a chart; the refinement adds paracompactness, factored through an abstract
23+
basis-refinement lemma (`exists_countable_locallyFinite_refinement_of_isTopologicalBasis`)
24+
reusable for any topological basis.
25+
26+
## Main definitions
27+
28+
* `Manifold.IsPrecompactCoordinateBall` — source of a coordinate-ball chart with compact closure.
29+
30+
## Main results
31+
32+
* `Manifold.IsPrecompactCoordinateBall.isOpen` — a precompact coordinate ball is open.
33+
* `Manifold.isTopologicalBasis_isPrecompactCoordinateBall` — precompact coordinate balls form a basis.
34+
* `Manifold.exists_countable_precompact_coordinate_ball_basis` — that basis can be taken countable.
35+
* `Manifold.paracompactSpace_of_manifold` — a topological manifold is paracompact.
36+
* `Manifold.exists_countable_locally_finite_precompact_coordinate_ball_refinement` —
37+
every open cover has a countable locally finite refinement by precompact coordinate balls.
38+
39+
Provenance: SmoothManifoldsLee a5f308c — Lemma_1_10, Theorem_1_15.
40+
-/
41+
42+
open Set TopologicalSpace
43+
open scoped Topology
44+
45+
universe u v
46+
47+
namespace Manifold
48+
49+
section Basis
50+
51+
variable {n : ℕ} {M : Type u} [TopologicalSpace M]
52+
53+
/-- **Math.** A set `s ⊆ M` is a *precompact coordinate ball*: it is the source of
54+
some coordinate-ball chart and its closure is compact. -/
55+
def IsPrecompactCoordinateBall (n : ℕ) (s : Set M) : Prop :=
56+
(∃ e : OpenPartialHomeomorph M (EuclideanSpace ℝ (Fin n)),
57+
e.source = s ∧ e.IsCoordinateBall) ∧
58+
IsCompact (closure s)
59+
60+
/-- **Math.** A precompact coordinate ball is open. -/
61+
theorem IsPrecompactCoordinateBall.isOpen {s : Set M}
62+
(hs : IsPrecompactCoordinateBall n s) : IsOpen s := by
63+
rcases hs.1 with ⟨e, rfl, -⟩
64+
simpa using e.open_source
65+
66+
/-- **Math.** A precompact coordinate ball has compact closure. -/
67+
theorem IsPrecompactCoordinateBall.isCompact_closure {s : Set M}
68+
(hs : IsPrecompactCoordinateBall n s) : IsCompact (closure s) :=
69+
hs.2
70+
71+
variable [T2Space M] [SecondCountableTopology M]
72+
[ChartedSpace (EuclideanSpace ℝ (Fin n)) M]
73+
74+
omit [SecondCountableTopology M] [ChartedSpace (EuclideanSpace ℝ (Fin n)) M] in
75+
/-- **Math.** Restricting a chart to a Euclidean open ball whose closed ball is
76+
compactly contained in the chart target produces a precompact coordinate ball in
77+
`M`. -/
78+
theorem isPrecompactCoordinateBall_chart_preimage_metric_ball
79+
(e : OpenPartialHomeomorph M (EuclideanSpace ℝ (Fin n))) {c : EuclideanSpace ℝ (Fin n)}
80+
{r : ℝ} (hr : 0 < r) (hclosed : Metric.closedBall c r ⊆ e.target) :
81+
IsPrecompactCoordinateBall n (e.symm '' Metric.ball c r) := by
82+
let e' := e.trans (OpenPartialHomeomorph.ofSet (Metric.ball c r) Metric.isOpen_ball)
83+
have hball_target : Metric.ball c r ⊆ e.target := by
84+
exact (Metric.ball_subset_closedBall : Metric.ball c r ⊆ Metric.closedBall c r).trans hclosed
85+
have hsource : e'.source = e.symm '' Metric.ball c r := by
86+
-- The restricted chart is defined exactly on the inverse image of the chosen ball.
87+
dsimp [e']
88+
exact (e.symm_image_eq_source_inter_preimage hball_target).symm
89+
have htarget : e'.target = Metric.ball c r := by
90+
-- On the target side, the restriction keeps precisely the chosen Euclidean ball.
91+
dsimp [e']
92+
exact inter_eq_left.2 hball_target
93+
have hcompactCarrier : IsCompact (e.symm '' Metric.closedBall c r) := by
94+
-- The closed ball is compact in Euclidean space, and the inverse chart is continuous on it.
95+
exact (isCompact_closedBall (x := c) (r := r)).image_of_continuousOn
96+
(e.continuousOn_symm.mono hclosed)
97+
have hclosureCompact : IsCompact (closure (e.symm '' Metric.ball c r)) := by
98+
-- The closure stays inside the compact pullback of the closed Euclidean ball.
99+
exact hcompactCarrier.closure_of_subset
100+
(Set.image_mono (Metric.ball_subset_closedBall : Metric.ball c r ⊆ Metric.closedBall c r))
101+
refine ⟨?_, hclosureCompact⟩
102+
refine ⟨e', hsource, ?_⟩
103+
exact OpenPartialHomeomorph.isCoordinateBall_of_target_eq_ball e' c r hr htarget
104+
105+
omit [SecondCountableTopology M] in
106+
/-- **Math.** Every point of an open set lies in a precompact coordinate ball
107+
contained in that open set. -/
108+
theorem exists_isPrecompactCoordinateBall_subset_of_mem_open {x : M}
109+
{u : Set M} (hx : x ∈ u) (hu : IsOpen u) :
110+
∃ s : Set M, IsPrecompactCoordinateBall n s ∧ x ∈ s ∧ s ⊆ u := by
111+
let e := chartAt (EuclideanSpace ℝ (Fin n)) x
112+
let y : EuclideanSpace ℝ (Fin n) := e x
113+
let w : Set (EuclideanSpace ℝ (Fin n)) := e '' (e.source ∩ u)
114+
have hxsource : x ∈ e.source := mem_chart_source _ x
115+
have hyw : y ∈ w := by
116+
refine ⟨x, ⟨hxsource, hx⟩, rfl⟩
117+
have hw_open : IsOpen w := by
118+
-- The image of the open neighborhood inside the chart source is open in Euclidean space.
119+
simpa [w] using e.isOpen_image_source_inter hu
120+
obtain ⟨r, hr, hclosed⟩ :
121+
∃ r : ℝ, 0 < r ∧ Metric.closedBall y r ⊆ w := by
122+
-- Choose a small closed Euclidean ball around the charted point inside that open image.
123+
exact Metric.nhds_basis_closedBall.mem_iff.1 (hw_open.mem_nhds hyw)
124+
have hw_target : w ⊆ e.target := by
125+
-- The chart image of any subset of the source stays in the chart target.
126+
simpa [w] using (Set.image_mono (show e.source ∩ u ⊆ e.source from inter_subset_left)).trans
127+
e.image_source_eq_target.subset
128+
let s : Set M := e.symm '' Metric.ball y r
129+
have hs_precompact : IsPrecompactCoordinateBall n s := by
130+
-- Pull back the chosen Euclidean ball through the chart.
131+
simpa [s, y] using isPrecompactCoordinateBall_chart_preimage_metric_ball
132+
(n := n) e hr (hclosed.trans hw_target)
133+
have hxs : x ∈ s := by
134+
-- The charted point lies in every positive-radius ball centered at itself.
135+
refine ⟨y, Metric.mem_ball_self hr, ?_⟩
136+
simpa [y] using e.left_inv hxsource
137+
have hs_subset_source_u : s ⊆ e.source ∩ u := by
138+
-- The pulled-back ball lies inside the original open neighborhood because its image does.
139+
have hball_w : Metric.ball y r ⊆ w := by
140+
exact (Metric.ball_subset_closedBall : Metric.ball y r ⊆ Metric.closedBall y r).trans hclosed
141+
change e.symm '' Metric.ball y r ⊆ e.source ∩ u
142+
refine (Set.image_mono hball_w).trans ?_
143+
have himage : e.symm '' w = e.source ∩ u := by
144+
simpa [w] using e.symm_image_image_of_subset_source
145+
(s := e.source ∩ u) (show e.source ∩ u ⊆ e.source from inter_subset_left)
146+
exact himage.subset
147+
exact ⟨s, hs_precompact, hxs, fun z hz ↦ (hs_subset_source_u hz).2
148+
149+
omit [SecondCountableTopology M] in
150+
/-- **Math.** Precompact coordinate balls form a topological basis on a topological
151+
manifold. -/
152+
theorem isTopologicalBasis_isPrecompactCoordinateBall :
153+
IsTopologicalBasis { s : Set M | IsPrecompactCoordinateBall n s } := by
154+
-- The local chart construction gives a basis element inside every open neighborhood.
155+
refine isTopologicalBasis_of_isOpen_of_nhds ?_ ?_
156+
· intro s hs
157+
exact hs.isOpen
158+
· intro x u hx hu
159+
obtain ⟨s, hs, hxs, hsu⟩ := exists_isPrecompactCoordinateBall_subset_of_mem_open
160+
(n := n) hx hu
161+
exact ⟨s, hs, hxs, hsu⟩
162+
163+
/-- **Math.** Lemma 1.10: every topological manifold has a *countable* topological
164+
basis consisting of precompact coordinate balls. -/
165+
theorem exists_countable_precompact_coordinate_ball_basis :
166+
∃ b : Set (Set M),
167+
b.Countable ∧ IsTopologicalBasis b ∧ ∀ s ∈ b, IsPrecompactCoordinateBall n s := by
168+
let B : Set (Set M) := { s : Set M | IsPrecompactCoordinateBall n s }
169+
have hB : IsTopologicalBasis B := isTopologicalBasis_isPrecompactCoordinateBall (n := n)
170+
-- Once the local basis is available, second countability lets us thin it to a countable subbasis.
171+
obtain ⟨b, hbB, hbCountable, hbBasis⟩ := hB.exists_countable
172+
exact ⟨b, hbCountable, hbBasis, fun s hs ↦ hbB hs⟩
173+
174+
end Basis
175+
176+
section Refinement
177+
178+
variable {n : ℕ} {M : Type u} [TopologicalSpace M] [T2Space M]
179+
[SecondCountableTopology M] [ChartedSpace (EuclideanSpace ℝ (Fin n)) M]
180+
181+
include n in
182+
/-- **Math.** A topological manifold is paracompact. -/
183+
theorem paracompactSpace_of_manifold : ParacompactSpace M := by
184+
letI : LocallyCompactSpace M :=
185+
ChartedSpace.locallyCompactSpace (EuclideanSpace ℝ (Fin n)) M
186+
letI : SigmaCompactSpace M := sigmaCompactSpace_of_locallyCompact_secondCountable
187+
infer_instance
188+
189+
/-- **Math.** Companion bridge: given an open cover of a locally compact,
190+
sigma-compact, Hausdorff space and any basis for its topology, there is a countable
191+
locally finite refinement by basis elements subordinate to the cover. -/
192+
theorem exists_countable_locallyFinite_refinement_of_isTopologicalBasis {X : Type u}
193+
[TopologicalSpace X] [LocallyCompactSpace X] [SigmaCompactSpace X] [T2Space X]
194+
{ι : Type v} {U : ι → Opens X}
195+
(hU : IsOpenCover U) {B : Set (Set X)} (hB : IsTopologicalBasis B) :
196+
∃ (κ : Type u), Countable κ ∧ ∃ V : κ → Opens X,
197+
IsOpenCover V ∧ LocallyFinite (fun j ↦ (V j : Set X)) ∧
198+
(∀ j, (V j : Set X) ∈ B) ∧
199+
(∀ j, ∃ i, (V j : Set X) ⊆ U i) := by
200+
-- Choose, at each point, one member of the original cover that contains that point.
201+
choose i hi using fun x : X ↦ hU.exists_mem_nhds x
202+
have hBU :
203+
∀ x : X,
204+
(𝓝 x).HasBasis
205+
(fun s : Set X ↦ s ∈ B ∧ x ∈ s ∧ s ⊆ U (i x))
206+
id := by
207+
intro x
208+
let hxB : (𝓝 x).HasBasis (fun s : Set X ↦ s ∈ B ∧ x ∈ s) id := hB.nhds_hasBasis
209+
simpa [and_assoc] using hxB.restrict_subset (hi x)
210+
-- Feed the subordinate neighborhood bases into the standard locally finite refinement theorem.
211+
rcases refinement_of_locallyCompact_sigmaCompact_of_nhds_basis hBU with
212+
⟨κ, c, W, hW_basis, hW_cover, hW_locallyFinite⟩
213+
have hκ : Countable κ := by
214+
simpa [Set.countable_univ_iff] using
215+
hW_locallyFinite.countable_univ fun j ↦ ⟨c j, (hW_basis j).2.1
216+
refine ⟨κ, hκ, ?_⟩
217+
refine ⟨fun j ↦ ⟨W j, hB.isOpen (hW_basis j).1⟩, ?_, hW_locallyFinite, ?_, ?_⟩
218+
· exact IsOpenCover.of_sets (fun j ↦ hB.isOpen (hW_basis j).1) hW_cover
219+
· exact fun j ↦ (hW_basis j).1
220+
· exact fun j ↦ ⟨i (c j), (hW_basis j).2.2
221+
222+
/-- **Math.** Theorem 1.15: given an open cover of a topological manifold, there is a
223+
countable locally finite refinement by precompact coordinate balls subordinate to
224+
the cover. -/
225+
theorem exists_countable_locally_finite_precompact_coordinate_ball_refinement
226+
{ι : Type v} {U : ι → Opens M} (hU : IsOpenCover U) :
227+
∃ (κ : Type u), Countable κ ∧ ∃ V : κ → Opens M,
228+
IsOpenCover V ∧ LocallyFinite (fun j ↦ (V j : Set M)) ∧
229+
(∀ j, IsPrecompactCoordinateBall n (V j : Set M)) ∧
230+
(∀ j, ∃ i, (V j : Set M) ⊆ U i) := by
231+
-- Start from the countable basis of precompact coordinate balls supplied earlier.
232+
have hBasis :
233+
∃ B : Set (Set M),
234+
B.Countable ∧ IsTopologicalBasis B ∧ ∀ s ∈ B, IsPrecompactCoordinateBall n s :=
235+
exists_countable_precompact_coordinate_ball_basis
236+
rcases hBasis with ⟨B, -, hB_basis, hB_precompact⟩
237+
-- Apply the abstract refinement theorem to this specific basis.
238+
have hRefinement :
239+
∃ (κ : Type u), Countable κ ∧ ∃ V : κ → Opens M,
240+
IsOpenCover V ∧ LocallyFinite (fun j ↦ (V j : Set M)) ∧
241+
(∀ j, (V j : Set M) ∈ B) ∧
242+
(∀ j, ∃ i, (V j : Set M) ⊆ U i) :=
243+
by
244+
letI : LocallyCompactSpace M :=
245+
ChartedSpace.locallyCompactSpace (EuclideanSpace ℝ (Fin n)) M
246+
letI : SigmaCompactSpace M := sigmaCompactSpace_of_locallyCompact_secondCountable
247+
exact exists_countable_locallyFinite_refinement_of_isTopologicalBasis hU hB_basis
248+
rcases hRefinement with
249+
⟨κ, hκ, V, hV_cover, hV_locallyFinite, hV_mem, hV_subordinate⟩
250+
refine ⟨κ, hκ, V, hV_cover, hV_locallyFinite, ?_, hV_subordinate⟩
251+
intro j
252+
exact hB_precompact _ (hV_mem j)
253+
254+
end Refinement
255+
256+
end Manifold

docs/log/2026-06-12-smooth-manifolds-lee/WORKLIST.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -115,11 +115,11 @@ strict match to the table above). Actual status takes precedence:
115115
| PR | Branch | Content | Status |
116116
|---|---|---|---|
117117
| #65 | `port/coordinate-ball` | coordinate-ball chart predicates | **merged to develop** (docstrings house-style-revised in db767b1, serves as the exemplar) |
118-
| #66 | `port/precompact-basis` | precompact coordinate-ball countable basis + locally-finite refinement | open, pending feedback: retarget base to develop, revise docstrings |
119-
| #67 | `port/charted-space-core` | manifold from a chart-family core | open, same |
120-
| #68 | `port/exhaustion-cutoff` | exhaustion functions + local smoothness + partition-of-unity ⇒ paracompact | open, same |
121-
| #69 | `port/curve-velocity-mfderiv` | curve velocity + mfderiv (has snake_case defs to rename) | open, same |
122-
| #70 | `port/coordinate-components` | coordinate tangent components (has snake_case defs; inlines `tangent_coordinates_change`) | open, same |
118+
| #66 | `port/precompact-basis` | precompact coordinate-ball countable basis + locally-finite refinement | **merged to develop** (cherry-pick 498d57e, docstrings house-style-revised; second exemplar) |
119+
| #67 | `port/charted-space-core` | manifold from a chart-family core | open, feedback posted |
120+
| #68 | `port/exhaustion-cutoff` | exhaustion functions + local smoothness + partition-of-unity ⇒ paracompact | open, feedback posted |
121+
| #69 | `port/curve-velocity-mfderiv` | curve velocity + mfderiv (has snake_case defs to rename) | open, feedback posted |
122+
| #70 | `port/coordinate-components` | coordinate tangent components (has snake_case defs; inlines `tangent_coordinates_change`) | open, feedback posted |
123123

124124
Common feedback (pointing at merged #65 as the exemplar): ① docstring house
125125
style (single Math tags / architecture narrative / provenance footer); ②

0 commit comments

Comments
 (0)