1
1
/-
2
2
Copyright (c) 2023 Michael Rothgang. All rights reserved.
3
3
Released under Apache 2.0 license as described in the file LICENSE.
4
- Authors: Michael Rothgang, Winston Yin
4
+ Authors: Michael Rothgang
5
5
-/
6
6
7
7
import Mathlib.Geometry.Manifold.SmoothManifoldWithCorners
8
8
9
- -- FIXME: should this be its own file or go in SmoothManifoldWithCorners?
10
- -- the latter is already huge, or its own file - move other results about boundaryless here?
11
- -- xxx: if I can use dot notation, how set things up so they're also available for smooth manifolds?
12
- -- manually re-declare them?
13
-
14
9
/-!
15
10
# Interior and boundary of a manifold
16
-
17
11
Define the interior and boundary of a manifold.
18
12
19
13
## Main definitions
20
14
- **IsInteriorPoint x** : `p ∈ M` is an interior point if, for `φ` being the preferred chart at `x`,
21
15
`φ x` is an interior point of `φ.target`.
22
- - **IsBoundaryPoint x** : `p ∈ M` is a boundary point if, for `φ` being the preferred chart at `x`,
16
+ - **IsBoundaryPoint x** : `p ∈ M` is a boundary point if, `(extChartAt I x) x ∈ frontier (range I)`.
23
17
- **interior I M** is the **interior** of `M`, the set of its interior points.
24
18
- **boundary I M** is the **boundary** of `M`, the set of its boundary points.
25
19
26
20
## Main results
27
21
- `univ_eq_interior_union_boundary`: `M` is the union of its interior and boundary
28
- - `interior_isOpen`: `interior I M` is open
29
- - `boundary_isClosed`: `boundary I M` is closed
30
-
31
- **TODO**
32
- - under suitable assumptions, `boundary I M` has empty interior
33
- (if `M` is finite-dimensional, `boundary I M` should have measure 0, which implies this)
34
- - `interior I M` is a manifold without boundary
35
- (need to upgrade the model used; map the charts from an open ball to entire ℝ^n)
36
- - the boundary is a submanifold of codimension 1, perhaps with boundary and corners
37
- (this requires a definition of submanifolds)
22
+ - `interior_boundary_disjoint`: interior and boundary of `M` are disjoint
23
+ - if `M` is boundaryless, every point is an interior point
24
+
25
+ ## TODO
26
+ - if `M` is finite-dimensional, its interior is always open,
27
+ hence the boundary is closed (and nowhere dense)
28
+ This requires e.g. the homology of spheres.
29
+ - the interior of `M` is a smooth manifold without boundary
30
+ - `boundary M` is a smooth submanifold (possibly with boundary and corners):
31
+ follows from the corresponding statement for the model with corners `I`;
32
+ this requires a definition of submanifolds
33
+ - if `M` is finite-dimensional, its boundary has measure zero
38
34
39
35
## Tags
40
36
manifold, interior, boundary
@@ -52,136 +48,75 @@ variable {𝕜 : Type*} [NontriviallyNormedField 𝕜]
52
48
for `φ` being the preferred chart at `x`, `φ x` is an interior point of `φ.target`. -/
53
49
def ModelWithCorners.IsInteriorPoint (x : M) := extChartAt I x x ∈ interior (extChartAt I x).target
54
50
55
- /-- `p ∈ M` is a boundary point of a manifold `M` iff it is not an interior point.
56
- This means that, for `φ` being the preferred chart at `x`, `φ x` is not an interior point of
57
- `φ.target`. We do not say "boundary point" as `frontier φ.target` has two components, one on the
58
- boundary of range I and another on the boundary of e.target (which we don't want). -/
59
- def ModelWithCorners.IsBoundaryPoint (x : M) := extChartAt I x x ∉ interior (extChartAt I x).target
51
+ /-- `p ∈ M` is a boundary point of a manifold `M` iff its image in the extended chart
52
+ lies on the boundary of the model space. -/
53
+ def ModelWithCorners.IsBoundaryPoint (x : M) := extChartAt I x x ∈ frontier (range I)
60
54
61
55
namespace SmoothManifoldWithCorners
62
- -- FIXME(MR) : can I enable dot notation, like `M.interior I` or so ?
56
+ -- TODO : can I enable dot notation as in, say, `M.interior I`?
63
57
64
58
variable (I M) in
65
59
/-- The **interior** of a manifold `M` is the set of its interior points. -/
66
60
protected def interior : Set M := { x : M | I.IsInteriorPoint x}
67
61
62
+ lemma _root_.ModelWithCorners.isInteriorPoint_iff {x : M} :
63
+ I.IsInteriorPoint x ↔ extChartAt I x x ∈ interior (extChartAt I x).target := Iff.rfl
64
+
68
65
variable (I M) in
69
66
/-- The **boundary** of a manifold `M` is the set of its boundary points. -/
70
67
protected def boundary : Set M := { x : M | I.IsBoundaryPoint x}
71
- end SmoothManifoldWithCorners
72
68
73
- namespace LocalHomeomorph -- move to SmoothManifoldsWithCorners!
74
- variable {e e' : LocalHomeomorph M H}
75
-
76
- -- more general lemma underlying foobar. xxx: find a better name!
77
- lemma foobar_abstract {f : LocalHomeomorph H H} {y : H} (hy : y ∈ f.source)
78
- (h : I y ∈ interior (range I)) : I (f y) ∈ interior (range I) := by
79
- sorry
80
-
81
- -- xxx: needs better name!
82
- -- the interior of the target of an extended local homeo is contained in the interior of its
83
- -- model's range
84
- lemma extend_interior_target_subset : interior (e.extend I).target ⊆ interior (range I) := by
85
- rw [e.extend_target, interior_inter, (e.open_target.preimage I.continuous_symm).interior_eq]
86
- exact inter_subset_right _ _
87
-
88
- -- xxx: find a good name!!
89
- lemma foobaz {y : H} (hy : y ∈ e.target) (hy' : I y ∈ interior (range ↑I)) :
90
- I y ∈ interior (e.extend I).target := by
91
- rw [e.extend_target, interior_inter, (e.open_target.preimage I.continuous_symm).interior_eq,
92
- mem_inter_iff, mem_preimage]
93
- exact ⟨mem_of_eq_of_mem (I.left_inv (y)) hy, hy'⟩
94
-
95
- /-- If `e` and `e'` are two charts, the transition map maps interior points to interior points. -/
96
- -- as we only need continuity property, e or e' being in the atlas is not required
97
- lemma foobar {x : M} (hx : x ∈ e.source ∩ e'.source) :
98
- (e.extend I) x ∈ interior (e.extend I).target ↔
99
- (e'.extend I) x ∈ interior (e'.extend I).target := by
100
- rcases ((mem_inter_iff x _ _).mp hx) with ⟨hxe, hxe'⟩
101
- -- reduction, step 1: simplify what the interior means
102
- have : (e.extend I) x ∈ interior (e.extend I).target ↔ I (e x) ∈ interior (range I) :=
103
- ⟨fun hx ↦ extend_interior_target_subset hx, fun hx ↦ foobaz (e.map_source hxe) hx⟩
104
- rw [this]
105
- have : (e'.extend I) x ∈ interior (e'.extend I).target ↔ I (e' x) ∈ interior (range I) :=
106
- ⟨fun hx ↦ extend_interior_target_subset hx, fun hx ↦ foobaz (e'.map_source hxe') hx⟩
107
- rw [this]
108
- -- step 2: rewrite in terms of coordinate changes
109
- constructor
110
- · intro h
111
- let f := e.symm.trans e'
112
- have h2 : e x ∈ f.source := by
113
- have : e.symm (e x) = x := e.left_inv' hxe
114
- rw [LocalHomeomorph.trans_source, mem_inter_iff (e x), e.symm_source, mem_preimage, this]
115
- exact ⟨e.map_source hxe, hxe'⟩
116
- rw [← (e.left_inv' hxe)]
117
- exact foobar_abstract h2 h
118
- · sorry -- exactly the same... what's the best way to deduplicate?
119
- end LocalHomeomorph
120
-
121
- namespace SmoothManifoldWithCorners
122
- -- FIXME(MR): find a better wording for the next two docstrings
123
- variable (I) in
124
- /-- Whether `x` is an interior point can equivalently be described by any chart
125
- whose source contains `x`. -/
126
- -- as we only need continuity properties, `e` being in the atlas is not required
127
- lemma isInteriorPoint_iff {e : LocalHomeomorph M H} {x : M} (hx : x ∈ e.source) :
128
- I.IsInteriorPoint x ↔ (e.extend I) x ∈ interior (e.extend I).target :=
129
- (chartAt H x).foobar (mem_inter (mem_chart_source H x) hx)
130
-
131
- variable (I) in
132
- /-- Whether `x` is a boundary point of `M` can equivalently be described by any chart
133
- whose source contains `x`. -/
134
- lemma isBoundaryPoint_iff {e : LocalHomeomorph M H} {x : M} (hx : x ∈ e.source) :
135
- I.IsBoundaryPoint x ↔ (e.extend I) x ∉ interior (e.extend I).target := by
136
- -- This lemma is just the "negation" (applying not_iff_not) to isInteriorPoint_iff.
137
- rw [← not_iff_not.mpr (isInteriorPoint_iff I hx)]
138
- exact Iff.rfl
69
+ lemma _root_.ModelWithCorners.isBoundaryPoint_iff {x : M} :
70
+ I.IsBoundaryPoint x ↔ extChartAt I x x ∈ frontier (range I) := Iff.rfl
139
71
140
72
/-- Every point is either an interior or a boundary point. -/
141
73
lemma isInteriorPoint_or_isBoundaryPoint (x : M) : I.IsInteriorPoint x ∨ I.IsBoundaryPoint x := by
142
- by_cases extChartAt I x x ∈ interior (extChartAt I x).target
74
+ by_cases h : extChartAt I x x ∈ interior (extChartAt I x).target
143
75
· exact Or.inl h
144
- · exact Or.inr h
76
+ · right -- Otherwise, we have a boundary point.
77
+ rw [I.isBoundaryPoint_iff, ← closure_diff_interior, I.closed_range.closure_eq]
78
+ refine ⟨mem_range_self _, ?_⟩
79
+ by_contra h'
80
+ exact h ((chartAt H x).mem_interior_extend_target I (mem_chart_target H x) h')
145
81
146
- variable (I M) in
147
82
/-- A manifold decomposes into interior and boundary. -/
148
83
lemma univ_eq_interior_union_boundary : (SmoothManifoldWithCorners.interior I M) ∪
149
84
(SmoothManifoldWithCorners.boundary I M) = (univ : Set M) :=
150
85
le_antisymm (fun _ _ ↦ trivial) (fun x _ ↦ isInteriorPoint_or_isBoundaryPoint x)
151
86
152
- /-- The interior and boundary of `M` are disjoint. -/ -- xxx: name `..._eq_empty` instead?
87
+ /-- The interior and boundary of a manifold `M` are disjoint. -/
153
88
lemma interior_boundary_disjoint :
154
89
(SmoothManifoldWithCorners.interior I M) ∩ (SmoothManifoldWithCorners.boundary I M) = ∅ := by
155
- ext
156
- exact ⟨fun h ↦ (not_mem_of_mem_diff h) (mem_of_mem_diff h), by exfalso⟩
157
-
158
- /-- The interior of a manifold is an open subset. -/
159
- lemma interior_isOpen : IsOpen (SmoothManifoldWithCorners.interior I M) := by
160
- apply isOpen_iff_forall_mem_open.mpr
161
- intro x hx
162
- -- Consider the preferred chart at `x`. Its extended chart has open interior.
163
- let e := chartAt H x
164
- let U := interior (e.extend I).target
165
- -- For all `y ∈ e.source`, `y` is an interior point iff its image lies in `U`.
166
- -- FIXME: should this be a separate lemma?
167
- refine ⟨(e.extend I).source ∩ (e.extend I) ⁻¹' U, ?_, ?_, ?_⟩
168
- · intro y hy
169
- rw [e.extend_source] at hy
170
- apply (isInteriorPoint_iff I (mem_of_mem_inter_left hy)).mpr
171
- exact mem_of_mem_inter_right (a := e.source) hy
172
- · exact (e.continuousOn_extend I).preimage_open_of_open (e.isOpen_extend_source I) isOpen_interior
173
- · have : x ∈ (e.extend I).source := by
174
- rw [e.extend_source]
175
- exact mem_chart_source H x
176
- exact mem_inter this hx
177
-
178
- /-- The boundary of a manifold is a closed subset. -/
179
- lemma boundary_isClosed : IsClosed (SmoothManifoldWithCorners.boundary I M) := by
180
- apply isOpen_compl_iff.mp
181
- have : (SmoothManifoldWithCorners.interior I M)ᶜ = SmoothManifoldWithCorners.boundary I M :=
182
- (compl_unique interior_boundary_disjoint (univ_eq_interior_union_boundary I M))
183
- rw [← this, compl_compl]
184
- exact interior_isOpen
90
+ by_contra h
91
+ -- Choose some x in the intersection of interior and boundary.
92
+ choose x hx using nmem_singleton_empty.mp h
93
+ rcases hx with ⟨h1, h2⟩
94
+ show (extChartAt I x) x ∈ (∅ : Set E)
95
+ rw [← interior_frontier_disjoint]
96
+ exact ⟨(chartAt H x).interior_extend_target_subset_interior_range I h1, h2⟩
97
+
98
+ /-- The boundary is the complement of the interior. -/
99
+ lemma boundary_eq_complement_interior :
100
+ SmoothManifoldWithCorners.boundary I M = (SmoothManifoldWithCorners.interior I M)ᶜ :=
101
+ (compl_unique interior_boundary_disjoint univ_eq_interior_union_boundary).symm
185
102
end SmoothManifoldWithCorners
186
103
187
- -- TODO: interior I M is a manifold
104
+ /-- If `M` has no boundary, every point of `M` is an interior point. -/
105
+ lemma ModelWithCorners.isInteriorPoint [I.Boundaryless] {x : M} : I.IsInteriorPoint x := by
106
+ let r := ((chartAt H x).isOpen_extend_target I).interior_eq
107
+ have : extChartAt I x = (chartAt H x).extend I := rfl
108
+ rw [← this] at r
109
+ rw [ModelWithCorners.IsInteriorPoint, r]
110
+ exact LocalEquiv.map_source _ (mem_extChartAt_source _ _)
111
+
112
+ /-- If `I` is boundaryless, `M` has full interior interior. -/
113
+ lemma ModelWithCorners.interior_eq_univ [I.Boundaryless] :
114
+ SmoothManifoldWithCorners.interior I M = univ := by
115
+ ext
116
+ refine ⟨fun _ ↦ trivial, fun _ ↦ I.isInteriorPoint⟩
117
+
118
+ /-- If `I` is boundaryless, `M` has empty boundary. -/
119
+ lemma ModelWithCorners.Boundaryless.boundary_eq_empty [I.Boundaryless] :
120
+ SmoothManifoldWithCorners.boundary I M = ∅ := by
121
+ rw [SmoothManifoldWithCorners.boundary_eq_complement_interior, I.interior_eq_univ,
122
+ compl_empty_iff]
0 commit comments