Skip to content

Commit c1f3395

Browse files
committed
Pare down interior/boundary file to the necesssary basics; sorry-free.
Everything else requires advanced technology not in mathlib yet.
1 parent 4febc74 commit c1f3395

File tree

3 files changed

+74
-134
lines changed

3 files changed

+74
-134
lines changed

Mathlib/Geometry/Manifold/IntegralCurve.lean

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,6 @@ variable
4242
{H' : Type*} [TopologicalSpace H'] {I' : ModelWithCorners 𝕜 E' H'}
4343
{M' : Type*} [TopologicalSpace M'] [ChartedSpace H' M'] [SmoothManifoldWithCorners I' M']
4444

45-
lemma ModelWithCorners.isOpen_target [I.Boundaryless] {x : M} :
46-
IsOpen (extChartAt I x).target := LocalHomeomorph.isOpen_extend_target ..
47-
48-
/-- If `M` has no boundary, every point of `M` is an interior point. -/
49-
lemma ModelWithCorners.isInteriorPoint [I.Boundaryless] {x : M} : I.IsInteriorPoint x := by
50-
rw [ModelWithCorners.IsInteriorPoint, IsOpen.interior_eq I.isOpen_target]
51-
exact LocalEquiv.map_source _ (mem_extChartAt_source _ _)
52-
5345
variable (I)
5446
def tangentCoordChange (x y : M) := (tangentBundleCore I M).coordChange (achart H x) (achart H y)
5547

Lines changed: 61 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,36 @@
11
/-
22
Copyright (c) 2023 Michael Rothgang. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
4-
Authors: Michael Rothgang, Winston Yin
4+
Authors: Michael Rothgang
55
-/
66

77
import Mathlib.Geometry.Manifold.SmoothManifoldWithCorners
88

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-
149
/-!
1510
# Interior and boundary of a manifold
16-
1711
Define the interior and boundary of a manifold.
1812
1913
## Main definitions
2014
- **IsInteriorPoint x**: `p ∈ M` is an interior point if, for `φ` being the preferred chart at `x`,
2115
`φ 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)`.
2317
- **interior I M** is the **interior** of `M`, the set of its interior points.
2418
- **boundary I M** is the **boundary** of `M`, the set of its boundary points.
2519
2620
## Main results
2721
- `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
3834
3935
## Tags
4036
manifold, interior, boundary
@@ -52,136 +48,75 @@ variable {𝕜 : Type*} [NontriviallyNormedField 𝕜]
5248
for `φ` being the preferred chart at `x`, `φ x` is an interior point of `φ.target`. -/
5349
def ModelWithCorners.IsInteriorPoint (x : M) := extChartAt I x x ∈ interior (extChartAt I x).target
5450

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)
6054

6155
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`?
6357

6458
variable (I M) in
6559
/-- The **interior** of a manifold `M` is the set of its interior points. -/
6660
protected def interior : Set M := { x : M | I.IsInteriorPoint x}
6761

62+
lemma _root_.ModelWithCorners.isInteriorPoint_iff {x : M} :
63+
I.IsInteriorPoint x ↔ extChartAt I x x ∈ interior (extChartAt I x).target := Iff.rfl
64+
6865
variable (I M) in
6966
/-- The **boundary** of a manifold `M` is the set of its boundary points. -/
7067
protected def boundary : Set M := { x : M | I.IsBoundaryPoint x}
71-
end SmoothManifoldWithCorners
7268

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
13971

14072
/-- Every point is either an interior or a boundary point. -/
14173
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
14375
· 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')
14581

146-
variable (I M) in
14782
/-- A manifold decomposes into interior and boundary. -/
14883
lemma univ_eq_interior_union_boundary : (SmoothManifoldWithCorners.interior I M) ∪
14984
(SmoothManifoldWithCorners.boundary I M) = (univ : Set M) :=
15085
le_antisymm (fun _ _ ↦ trivial) (fun x _ ↦ isInteriorPoint_or_isBoundaryPoint x)
15186

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. -/
15388
lemma interior_boundary_disjoint :
15489
(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
185102
end SmoothManifoldWithCorners
186103

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]

Mathlib/Geometry/Manifold/SmoothManifoldWithCorners.lean

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1028,6 +1028,19 @@ theorem extend_target_mem_nhdsWithin {y : M} (hy : y ∈ f.source) :
10281028
theorem extend_target_subset_range : (f.extend I).target ⊆ range I := by simp only [mfld_simps]
10291029
#align local_homeomorph.extend_target_subset_range LocalHomeomorph.extend_target_subset_range
10301030

1031+
lemma interior_extend_target_subset_interior_range :
1032+
interior (f.extend I).target ⊆ interior (range I) := by
1033+
rw [f.extend_target, interior_inter, (f.open_target.preimage I.continuous_symm).interior_eq]
1034+
exact inter_subset_right _ _
1035+
1036+
/-- If `y ∈ f.target` and `I y ∈ interior (range I)`,
1037+
then `I y` is an interior point of `(I ∘ f).target`. -/
1038+
lemma mem_interior_extend_target {y : H} (hy : y ∈ f.target)
1039+
(hy' : I y ∈ interior (range I)) : I y ∈ interior (f.extend I).target := by
1040+
rw [f.extend_target, interior_inter, (f.open_target.preimage I.continuous_symm).interior_eq,
1041+
mem_inter_iff, mem_preimage]
1042+
exact ⟨mem_of_eq_of_mem (I.left_inv (y)) hy, hy'⟩
1043+
10311044
theorem nhdsWithin_extend_target_eq {y : M} (hy : y ∈ f.source) :
10321045
𝓝[(f.extend I).target] f.extend I y = 𝓝[range I] f.extend I y :=
10331046
(nhdsWithin_mono _ (extend_target_subset_range _ _)).antisymm <|

0 commit comments

Comments
 (0)