Skip to content

Commit 7ac23e8

Browse files
LehengChenclaude
andcommitted
port(coordinate-ball): coordinate-ball chart predicates (IsCoordinateBall family)
Ports the Lee Smooth Manifolds coordinate-ball predicates into the new OpenGALib/Manifold foundations domain. Pure addition, design-neutral (Mathlib ChartedSpace/IsManifold only), 0 sorry. Source: import/smooth-manifolds-lee @ a5f308c Chap01/Sec01/Definition_1_extra_2.lean Chap01/Sec01_03/Definition_1_3_extra_1.lean Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 2772bc4 commit 7ac23e8

3 files changed

Lines changed: 185 additions & 0 deletions

File tree

OpenGALib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import OpenGALib.Algebraic
2+
import OpenGALib.Manifold
23
import OpenGALib.Tensor
34
import OpenGALib.MetricGeometry
45
import OpenGALib.Riemannian

OpenGALib/Manifold.lean

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import OpenGALib.Manifold.Charts.CoordinateBall
2+
3+
/-!
4+
# Manifold
5+
6+
Manifold-foundations domain: chart-level and atlas-level structure on
7+
topological and smooth manifolds, stated directly on Mathlib's
8+
`ChartedSpace` / `IsManifold` API. Sits below `Riemannian` in the library
9+
layering. Currently provides coordinate-ball predicates for charts.
10+
-/
Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
import Mathlib.Analysis.InnerProductSpace.PiL2
2+
import Mathlib.Geometry.Manifold.ChartedSpace
3+
import Mathlib.Geometry.Manifold.ContMDiff.Atlas
4+
import Mathlib.Geometry.Manifold.Instances.Real
5+
import Mathlib.Topology.Bases
6+
import Mathlib.Topology.Separation.Basic
7+
8+
/-!
9+
# Coordinate balls
10+
11+
Coordinate-ball predicates for charts on a topological or smooth manifold. A
12+
chart is a *coordinate ball* when its image is an open metric ball, a
13+
*coordinate box* when its image is a product of open intervals, and *centered*
14+
at a point when it sends that point to the origin. On a smooth manifold these
15+
combine into the notions of a *smooth coordinate ball* (the source of a chart in
16+
the maximal atlas whose image is an open ball) and a *regular coordinate ball*
17+
(one whose closure sits inside a larger concentric chart).
18+
19+
## Main definitions
20+
21+
* `OpenPartialHomeomorph.IsCoordinateBall` — the chart's image is an open metric ball.
22+
* `OpenPartialHomeomorph.IsCenteredAt` — the chart sends the point to `0`.
23+
* `OpenPartialHomeomorph.IsCoordinateBox` — the chart's image is a product of open intervals.
24+
* `OpenPartialHomeomorph.centerAt` — translate a chart so a source point maps to `0`.
25+
* `Manifold.IsSmoothCoordinateBall` — source of a maximal-atlas chart whose image is an open ball.
26+
* `Manifold.IsRegularCoordinateBall` — a coordinate ball whose closure sits in a larger chart.
27+
28+
## Main results
29+
30+
* `OpenPartialHomeomorph.isCoordinateBall_of_target_eq_ball` — a chart with ball image is a coordinate ball.
31+
* `OpenPartialHomeomorph.isCoordinateBox_of_target_eq` — a chart with box image is a coordinate box.
32+
* `OpenPartialHomeomorph.centerAt_isCenteredAt` — the centered chart is centered at its point.
33+
* `Manifold.IsRegularCoordinateBall.exists_smoothCoordinateBall_superset` — a regular
34+
coordinate ball lies in a surrounding smooth coordinate ball.
35+
36+
Reference: Lee, *Introduction to Smooth Manifolds*, §1.
37+
38+
Ported from SmoothManifoldsLee Chap01/Sec01/Definition_1_extra_2.lean (a5f308c)
39+
Ported from SmoothManifoldsLee Chap01/Sec01_03/Definition_1_3_extra_1.lean (a5f308c)
40+
-/
41+
42+
noncomputable section
43+
44+
open Set
45+
open scoped Manifold Topology
46+
47+
universe u v
48+
49+
section Charts
50+
51+
variable {H : Type*} [PseudoMetricSpace H]
52+
variable {n : ℕ} {M : Type u} [TopologicalSpace M]
53+
54+
/-- **Math.** The chart `e` is a *coordinate ball*: its image is some open metric
55+
ball `Metric.ball c r` of positive radius. **Eng.** Predicate on
56+
`OpenPartialHomeomorph M H`; existentially quantifies over a center `c` and radius
57+
`r` with `e.target = Metric.ball c r`. Stated on Mathlib's metric-space chart so it
58+
applies to any model space, not just `EuclideanSpace`. -/
59+
def OpenPartialHomeomorph.IsCoordinateBall (e : OpenPartialHomeomorph M H) : Prop :=
60+
∃ c : H, ∃ r : ℝ, 0 < r ∧ e.target = Metric.ball c r
61+
62+
/-- **Math.** A chart whose image is the open ball `Metric.ball c r` is a coordinate
63+
ball. **Eng.** Introduction rule for `IsCoordinateBall`: feed the witnessing center,
64+
radius, positivity and target equality straight into the existential. -/
65+
theorem OpenPartialHomeomorph.isCoordinateBall_of_target_eq_ball
66+
(e : OpenPartialHomeomorph M H) (c : H) (r : ℝ) (hr : 0 < r)
67+
(h : e.target = Metric.ball c r) : e.IsCoordinateBall :=
68+
⟨c, r, hr, h⟩
69+
70+
variable (e : OpenPartialHomeomorph M (EuclideanSpace ℝ (Fin n)))
71+
72+
/-- **Math.** The chart `e` is *centered at* `p`: the point `p` lies in the chart's
73+
source and `e` sends it to the origin `0`. **Eng.** Predicate packaging
74+
`p ∈ e.source` with the coordinate condition `e p = 0`; the codomain is the
75+
Euclidean model space so `0` is the literal zero vector. -/
76+
def OpenPartialHomeomorph.IsCenteredAt (p : M) : Prop :=
77+
p ∈ e.source ∧ e p = 0
78+
79+
/-- **Math.** The chart `e` is a *coordinate box*: its image is a product of open
80+
intervals `∏ᵢ (aᵢ, bᵢ)`. **Eng.** Existential over endpoint vectors `a b` with
81+
`a i < b i` coordinatewise and `e.target` equal to the set of points whose every
82+
coordinate lies in the corresponding `Set.Ioo`. -/
83+
def OpenPartialHomeomorph.IsCoordinateBox : Prop :=
84+
∃ a b : EuclideanSpace ℝ (Fin n),
85+
(∀ i, a i < b i) ∧ e.target = { x | ∀ i : Fin n, x i ∈ Set.Ioo (a i) (b i) }
86+
87+
/-- **Math.** A chart whose image is the open box `∏ᵢ (aᵢ, bᵢ)` is a coordinate box.
88+
**Eng.** Introduction rule for `IsCoordinateBox`: supply the endpoint vectors, the
89+
coordinatewise strict-order hypothesis and the target equality to the existential. -/
90+
theorem OpenPartialHomeomorph.isCoordinateBox_of_target_eq
91+
(e : OpenPartialHomeomorph M (EuclideanSpace ℝ (Fin n)))
92+
(a b : EuclideanSpace ℝ (Fin n))
93+
(hab : ∀ i, a i < b i)
94+
(h : e.target = { x | ∀ i : Fin n, x i ∈ Set.Ioo (a i) (b i) }) : e.IsCoordinateBox :=
95+
⟨a, b, hab, h⟩
96+
97+
/-- **Math.** *Center* the chart `e` at a source point `p`, producing a chart with
98+
the same source that sends `p` to the origin. **Eng.** Postcompose `e` with the
99+
translation homeomorphism `Homeomorph.addRight (-e p)` via `transHomeomorph`; this
100+
shifts coordinates so the image of `p` becomes `0` while leaving the source set
101+
unchanged. -/
102+
def OpenPartialHomeomorph.centerAt (p : e.source) :
103+
OpenPartialHomeomorph M (EuclideanSpace ℝ (Fin n)) :=
104+
e.transHomeomorph (Homeomorph.addRight (-e p))
105+
106+
/-- **Math.** Centering a chart leaves its domain of definition unchanged. **Eng.**
107+
The translation only affects the codomain, so `(e.centerAt p).source = e.source`
108+
holds definitionally; `@[simp]` so downstream goals reduce automatically. -/
109+
@[simp] theorem OpenPartialHomeomorph.centerAt_source (p : e.source) :
110+
(e.centerAt p).source = e.source :=
111+
rfl
112+
113+
/-- **Math.** The chart obtained by centering `e` at `p` is indeed centered at `p`.
114+
**Eng.** Membership of `p` in the source is unchanged; the coordinate condition
115+
`(e.centerAt p) p = 0` follows from unfolding `centerAt` and simplifying the
116+
translation by `-e p`. -/
117+
theorem OpenPartialHomeomorph.centerAt_isCenteredAt (p : e.source) :
118+
(e.centerAt p).IsCenteredAt p := by
119+
exact ⟨p.2, by simp [OpenPartialHomeomorph.centerAt]⟩
120+
121+
end Charts
122+
123+
namespace Manifold
124+
125+
variable {E : Type u} [NormedAddCommGroup E] [NormedSpace ℝ E]
126+
variable {M : Type v} [TopologicalSpace M] [ChartedSpace E M]
127+
variable [IsManifold (modelWithCornersSelf ℝ E) (⊤ : WithTop ℕ∞) M]
128+
129+
/-- **Math.** A *smooth coordinate ball* is a subset `B ⊆ M` that is the source of a
130+
chart in the maximal smooth atlas whose image is an open metric ball in the model
131+
space `E`. **Eng.** Existential over a chart `φ` lying in
132+
`IsManifold.maximalAtlas` with `φ.source = B` and `φ.IsCoordinateBall`. Stated on
133+
Mathlib's `ChartedSpace`/`IsManifold` over `modelWithCornersSelf ℝ E`, with no
134+
OpenGA packaging class. -/
135+
def IsSmoothCoordinateBall (E : Type u) [NormedAddCommGroup E] [NormedSpace ℝ E]
136+
{M : Type v} [TopologicalSpace M] [ChartedSpace E M]
137+
[IsManifold (modelWithCornersSelf ℝ E) (⊤ : WithTop ℕ∞) M] (B : Set M) : Prop :=
138+
∃ φ : OpenPartialHomeomorph M E,
139+
φ ∈ IsManifold.maximalAtlas (modelWithCornersSelf ℝ E) (⊤ : WithTop ℕ∞) M ∧
140+
φ.source = B ∧ φ.IsCoordinateBall
141+
142+
/-- **Math.** A *regular coordinate ball* is a subset `B` whose closure lies inside a
143+
larger maximal-atlas chart that sends `B` and its closure to concentric open and
144+
closed balls of radius `r`, while the chart's whole image is a strictly larger ball
145+
of radius `r' > r`. **Eng.** Existential over a chart and radii `r < r'` recording
146+
`chart '' B = Metric.ball 0 r`, `chart '' closure B = Metric.closedBall 0 r`, and
147+
`chart.target = Metric.ball 0 r'`, all in the model space `E`. -/
148+
def IsRegularCoordinateBall (E : Type u) [NormedAddCommGroup E] [NormedSpace ℝ E]
149+
{M : Type v} [TopologicalSpace M] [ChartedSpace E M]
150+
[IsManifold (modelWithCornersSelf ℝ E) (⊤ : WithTop ℕ∞) M] (B : Set M) : Prop :=
151+
∃ chart : OpenPartialHomeomorph M E,
152+
chart ∈ IsManifold.maximalAtlas (modelWithCornersSelf ℝ E) (⊤ : WithTop ℕ∞) M ∧
153+
closure B ⊆ chart.source ∧
154+
∃ r r' : ℝ,
155+
0 < r ∧
156+
r < r' ∧
157+
chart '' B = Metric.ball (0 : E) r ∧
158+
chart '' closure B = Metric.closedBall (0 : E) r ∧
159+
chart.target = Metric.ball (0 : E) r'
160+
161+
/-- **Math.** Every regular coordinate ball is contained in a surrounding smooth
162+
coordinate ball: namely the source of its defining larger chart, which itself is a
163+
smooth coordinate ball, and which contains the closure of `B`. **Eng.** Destructure
164+
the regular-ball witness, take `B' := chart.source`, and rebuild the smooth-ball
165+
data from the same chart using `isCoordinateBall_of_target_eq_ball` with radius `r'`
166+
(positive since `0 < r < r'`). -/
167+
theorem IsRegularCoordinateBall.exists_smoothCoordinateBall_superset {B : Set M}
168+
(hB : IsRegularCoordinateBall E B) :
169+
∃ B' : Set M, IsSmoothCoordinateBall E B' ∧ closure B ⊆ B' := by
170+
rcases hB with ⟨chart, hchart, hclosure, r, r', hr, hr', -, -, htarget⟩
171+
refine ⟨chart.source, ⟨chart, hchart, rfl, ?_⟩, hclosure⟩
172+
exact chart.isCoordinateBall_of_target_eq_ball (0 : E) r' (lt_trans hr hr') htarget
173+
174+
end Manifold

0 commit comments

Comments
 (0)