@@ -28,6 +28,13 @@ of `M` and `N`.
28
28
- `ModelWithCorners.boundary_prod`: the boundary of `M × N` is `∂M × N ∪ (M × ∂N)`.
29
29
- `ModelWithCorners.BoundarylessManifold.prod`: if `M` and `N` are boundaryless, so is `M × N`
30
30
31
+ - `ModelWithCorners.interior_disjointUnion`: the interior of a disjoint union `M ⊔ M'`
32
+ is the union of the interior of `M` and `M'`
33
+ - `ModelWithCorners.boundary_disjointUnion`: the boundary of a disjoint union `M ⊔ M'`
34
+ is the union of the boundaries of `M` and `M'`
35
+ - `ModelWithCorners.boundaryless_disjointUnion`: if `M` and `M'` are boundaryless,
36
+ so is their disjoint union `M ⊔ M'`
37
+
31
38
## Tags
32
39
manifold, interior, boundary
33
40
@@ -85,7 +92,7 @@ lemma isBoundaryPoint_iff {x : M} : I.IsBoundaryPoint x ↔ extChartAt I x x ∈
85
92
lemma isInteriorPoint_or_isBoundaryPoint (x : M) : I.IsInteriorPoint x ∨ I.IsBoundaryPoint x := by
86
93
rw [IsInteriorPoint, or_iff_not_imp_left, I.isBoundaryPoint_iff, ← closure_diff_interior,
87
94
I.isClosed_range.closure_eq, mem_diff]
88
- exact fun h => ⟨mem_range_self _, h⟩
95
+ exact fun h ↦ ⟨mem_range_self _, h⟩
89
96
90
97
/-- A manifold decomposes into interior and boundary. -/
91
98
lemma interior_union_boundary_eq_univ : (I.interior M) ∪ (I.boundary M) = (univ : Set M) :=
@@ -97,13 +104,22 @@ lemma disjoint_interior_boundary : Disjoint (I.interior M) (I.boundary M) := by
97
104
-- Choose some x in the intersection of interior and boundary.
98
105
obtain ⟨x, h1, h2⟩ := not_disjoint_iff.mp h
99
106
rw [← mem_empty_iff_false (extChartAt I x x),
100
- ← disjoint_iff_inter_eq_empty.mp ( disjoint_interior_frontier (s := range I)) , mem_inter_iff]
107
+ ← disjoint_iff_inter_eq_empty.mp disjoint_interior_frontier, mem_inter_iff]
101
108
exact ⟨h1, h2⟩
102
109
110
+ lemma isInteriorPoint_iff_not_isBoundaryPoint (x : M) :
111
+ I.IsInteriorPoint x ↔ ¬I.IsBoundaryPoint x := by
112
+ refine ⟨?_,
113
+ by simpa only [or_iff_not_imp_right] using isInteriorPoint_or_isBoundaryPoint x (I := I)⟩
114
+ by_contra! h
115
+ rw [← mem_empty_iff_false (extChartAt I x x),
116
+ ← disjoint_iff_inter_eq_empty.mp disjoint_interior_frontier, mem_inter_iff]
117
+ exact h
118
+
103
119
/-- The boundary is the complement of the interior. -/
104
120
lemma compl_interior : (I.interior M)ᶜ = I.boundary M:= by
105
121
apply compl_unique ?_ I.interior_union_boundary_eq_univ
106
- exact disjoint_iff_inter_eq_empty.mp ( I.disjoint_interior_boundary)
122
+ exact disjoint_iff_inter_eq_empty.mp I.disjoint_interior_boundary
107
123
108
124
/-- The interior is the complement of the boundary. -/
109
125
lemma compl_boundary : (I.boundary M)ᶜ = I.interior M:= by
@@ -231,4 +247,115 @@ instance BoundarylessManifold.prod [BoundarylessManifold I M] [BoundarylessManif
231
247
232
248
end prod
233
249
250
+ section disjointUnion
251
+
252
+ variable {M' : Type *} [TopologicalSpace M'] [ChartedSpace H M'] {n : WithTop ℕ∞}
253
+ [hM : IsManifold I n M] [hM' : IsManifold I n M']
254
+ [Nonempty M] [Nonempty M'] [Nonempty H]
255
+ {E' : Type *} [NormedAddCommGroup E'] [NormedSpace 𝕜 E'] {H' : Type *} [TopologicalSpace H']
256
+ {J : Type *} {J : ModelWithCorners 𝕜 E' H'}
257
+ {N N' : Type *} [TopologicalSpace N] [TopologicalSpace N'] [ChartedSpace H' N] [ChartedSpace H' N']
258
+ [IsManifold J n N] [IsManifold J n N'] [Nonempty N] [Nonempty N'] [Nonempty H']
259
+
260
+ open Topology
261
+
262
+ lemma interiorPoint_inl (x : M) (hx : I.IsInteriorPoint x) :
263
+ I.IsInteriorPoint (.inl x: M ⊕ M') := by
264
+ rw [I.isInteriorPoint_iff, extChartAt, ChartedSpace.sum_chartAt_inl]
265
+ dsimp only [PartialHomeomorph.extend.eq_1, PartialEquiv.trans_target, toPartialEquiv_coe_symm,
266
+ PartialHomeomorph.lift_openEmbedding_target, PartialEquiv.coe_trans, toPartialEquiv_coe,
267
+ PartialHomeomorph.toFun_eq_coe, PartialHomeomorph.lift_openEmbedding_toFun, Function.comp_apply]
268
+ rw [Sum.inl_injective.extend_apply (chartAt H x)]
269
+ simpa [I.isInteriorPoint_iff, extChartAt] using hx
270
+
271
+ lemma boundaryPoint_inl (x : M) (hx : I.IsBoundaryPoint x) :
272
+ I.IsBoundaryPoint (.inl x: M ⊕ M') := by
273
+ rw [I.isBoundaryPoint_iff, extChartAt, ChartedSpace.sum_chartAt_inl]
274
+ dsimp
275
+ rw [Sum.inl_injective.extend_apply (chartAt H x)]
276
+ simpa [I.isBoundaryPoint_iff, extChartAt] using hx
277
+
278
+ lemma interiorPoint_inr (x : M') (hx : I.IsInteriorPoint x) :
279
+ I.IsInteriorPoint (.inr x : M ⊕ M') := by
280
+ rw [I.isInteriorPoint_iff, extChartAt, ChartedSpace.sum_chartAt_inr]
281
+ dsimp
282
+ rw [Sum.inr_injective.extend_apply (chartAt H x)]
283
+ simpa [I.isInteriorPoint_iff, extChartAt] using hx
284
+
285
+ lemma boundaryPoint_inr (x : M') (hx : I.IsBoundaryPoint x) :
286
+ I.IsBoundaryPoint (.inr x : M ⊕ M') := by
287
+ rw [I.isBoundaryPoint_iff, extChartAt, ChartedSpace.sum_chartAt_inr]
288
+ dsimp
289
+ rw [Sum.inr_injective.extend_apply (chartAt H x)]
290
+ simpa [I.isBoundaryPoint_iff, extChartAt] using hx
291
+
292
+ -- Converse to the previous direction: if `x` were not an interior point,
293
+ -- it had to be a boundary point, hence `p` were a boundary point also, contradiction.
294
+ lemma isInteriorPoint_disjointUnion_left {p : M ⊕ M'} (hp : I.IsInteriorPoint p)
295
+ (hleft : Sum.isLeft p) : I.IsInteriorPoint (Sum.getLeft p hleft) := by
296
+ by_contra h
297
+ set x := Sum.getLeft p hleft
298
+ rw [isInteriorPoint_iff_not_isBoundaryPoint x, not_not] at h
299
+ rw [isInteriorPoint_iff_not_isBoundaryPoint p] at hp
300
+ have := boundaryPoint_inl (M' := M') x (by tauto)
301
+ rw [← Sum.eq_left_getLeft_of_isLeft hleft] at this
302
+ exact hp this
303
+
304
+ lemma isInteriorPoint_disjointUnion_right {p : M ⊕ M'} (hp : I.IsInteriorPoint p)
305
+ (hright : Sum.isRight p) : I.IsInteriorPoint (Sum.getRight p hright) := by
306
+ by_contra h
307
+ set x := Sum.getRight p hright
308
+ rw [← mem_empty_iff_false p, ← (disjoint_interior_boundary (I := I)).inter_eq]
309
+ constructor
310
+ · rw [ModelWithCorners.interior, mem_setOf]; exact hp
311
+ · rw [ModelWithCorners.boundary, mem_setOf, Sum.eq_right_getRight_of_isRight hright]
312
+ have := isInteriorPoint_or_isBoundaryPoint (I := I) x
313
+ exact boundaryPoint_inr (M' := M') x (by tauto)
314
+
315
+ lemma interior_disjointUnion :
316
+ ModelWithCorners.interior (I := I) (M ⊕ M') =
317
+ Sum.inl '' (ModelWithCorners.interior (I := I) M)
318
+ ∪ Sum.inr '' (ModelWithCorners.interior (I := I) M') := by
319
+ ext p
320
+ constructor
321
+ · intro hp
322
+ by_cases h : Sum.isLeft p
323
+ · left
324
+ exact ⟨Sum.getLeft p h, isInteriorPoint_disjointUnion_left hp h, Sum.inl_getLeft p h⟩
325
+ · replace h := Sum.not_isLeft.mp h
326
+ right
327
+ exact ⟨Sum.getRight p h, isInteriorPoint_disjointUnion_right hp h, Sum.inr_getRight p h⟩
328
+ · intro hp
329
+ by_cases h : Sum.isLeft p
330
+ · set x := Sum.getLeft p h with x_eq
331
+ rw [Sum.eq_left_getLeft_of_isLeft h]
332
+ apply interiorPoint_inl x
333
+ have hp : p ∈ Sum.inl '' (ModelWithCorners.interior (I := I) M) := by
334
+ obtain (good | ⟨y, hy, hxy⟩) := hp
335
+ exacts [good, (not_isLeft_and_isRight ⟨h, by rw [← hxy]; exact rfl⟩).elim]
336
+ obtain ⟨x', hx', hx'p⟩ := hp
337
+ simpa [x_eq, ← hx'p, Sum.getLeft_inl]
338
+ · set x := Sum.getRight p (Sum.not_isLeft.mp h) with x_eq
339
+ rw [Sum.eq_right_getRight_of_isRight (Sum.not_isLeft.mp h)]
340
+ apply interiorPoint_inr x
341
+ have hp : p ∈ Sum.inr '' (ModelWithCorners.interior (I := I) M') := by
342
+ obtain (⟨y, hy, hxy⟩ | good) := hp
343
+ exacts [(not_isLeft_and_isRight ⟨by rw [← hxy]; exact rfl, Sum.not_isLeft.mp h⟩).elim, good]
344
+ obtain ⟨x', hx', hx'p⟩ := hp
345
+ simpa [x_eq, ← hx'p, Sum.getRight_inr]
346
+
347
+ lemma boundary_disjointUnion : ModelWithCorners.boundary (I := I) (M ⊕ M') =
348
+ Sum.inl '' (ModelWithCorners.boundary (I := I) M)
349
+ ∪ Sum.inr '' (ModelWithCorners.boundary (I := I) M') := by
350
+ simp only [← ModelWithCorners.compl_interior, interior_disjointUnion, inl_compl_union_inr_compl]
351
+
352
+ /-- If `M` and `M'` are boundaryless, so is their disjoint union `M ⊔ M'`. -/
353
+ instance boundaryless_disjointUnion
354
+ [hM: BoundarylessManifold I M] [hM': BoundarylessManifold I M'] :
355
+ BoundarylessManifold I (M ⊕ M') := by
356
+ rw [← Boundaryless.iff_boundary_eq_empty] at hM hM' ⊢
357
+ simp [boundary_disjointUnion, hM, hM']
358
+
359
+ end disjointUnion
360
+
234
361
end ModelWithCorners
0 commit comments