Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit b8c810e

Browse files
committed
refactor(topology/{fiber,vector}_bundle): make vector_bundle a mixin (#17505)
Previously, `is_fiber_bundle`* was a propositional typeclass on a function `p : Z → B`, stating the existence of local trivializations covering `Z`. Then `vector_bundle`* was a class with data on a type `E : X → Type*` (with the projection from `Σ x : B, E x` to `B` playing the role of `p`), giving a fixed atlas of fibrewise-linear local trivializations. We change this definition so that (i) the data is all held in `fiber_bundle`, with `vector_bundle` a mixin stating fibrewise-linearity (ii) only sigma-types can be fiber bundles, not general topological spaces This allows bundles to carry instances of typeclasses in which the scalar field, `R`, does not appear as a parameter. Notably, we would like a vector bundle over `R` with fibre `F` over base `B` to be a `charted_space (B × F)`, with the trivializations providing the charts. This would be a dangerous instance for typeclass inference, because `R` does not appear as a parameter in `charted_space (B × F)`. But if the data of the trivializations is held in `fiber_bundle`, then a *fibre* bundle with fibre `F` over base `B` can be a `charted_space (B × F)`, and this is safe for typeclass inference. We expect that this refector will also streamline constructions of fibre bundles with similar underlying structure (e.g., the same bundle being both a real and complex vector bundle). [Here](https://leanprover.zulipchat.com/#narrow/stream/116395-maths/topic/Smooth.20vector.20bundles/near/306023372) is the relevant Zulip discussion. *We take the opportunity to rename `topological_{fiber,vector}_bundle` to `{fiber,vector}_bundle`, since in the upcoming definition of smooth bundles, smoothness will be another mixin for `fiber_bundle`. Co-authored-by: Floris van Doorn [fpvdoorn@gmail.com](mailto:fpvdoorn@gmail.com)
1 parent bf2a9e0 commit b8c810e

File tree

11 files changed

+727
-611
lines changed

11 files changed

+727
-611
lines changed

docs/overview.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,8 @@ Topology:
211211
connectedness: 'connected_space'
212212
compact open topology: 'continuous_map.compact_open'
213213
Stone-Cech compactification: 'stone_cech'
214-
topological fiber bundle: 'is_topological_fiber_bundle'
214+
topological fiber bundle: 'fiber_bundle'
215+
topological vector bundle: 'vector_bundle'
215216
Urysohn's lemma: 'exists_continuous_zero_one_of_closed'
216217
Stone-Weierstrass theorem: 'continuous_map.subalgebra_topological_closure_eq_top_of_separates_points'
217218
Uniform notions:

src/analysis/complex/re_im_topology.lean

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ topological properties of `complex.re` and `complex.im`.
1616
1717
Each statement about `complex.re` listed below has a counterpart about `complex.im`.
1818
19-
* `complex.is_trivial_topological_fiber_bundle_re`: `complex.re` turns `ℂ` into a trivial
19+
* `complex.is_homeomorphic_trivial_fiber_bundle_re`: `complex.re` turns `ℂ` into a trivial
2020
topological fiber bundle over `ℝ`;
2121
* `complex.is_open_map_re`, `complex.quotient_map_re`: in particular, `complex.re` is an open map
2222
and is a quotient map;
@@ -37,24 +37,18 @@ noncomputable theory
3737
namespace complex
3838

3939
/-- `complex.re` turns `ℂ` into a trivial topological fiber bundle over `ℝ`. -/
40-
lemma is_trivial_topological_fiber_bundle_re : is_trivial_topological_fiber_bundle ℝ re :=
40+
lemma is_homeomorphic_trivial_fiber_bundle_re : is_homeomorphic_trivial_fiber_bundle ℝ re :=
4141
⟨equiv_real_prodₗ.to_homeomorph, λ z, rfl⟩
4242

4343
/-- `complex.im` turns `ℂ` into a trivial topological fiber bundle over `ℝ`. -/
44-
lemma is_trivial_topological_fiber_bundle_im : is_trivial_topological_fiber_bundle ℝ im :=
44+
lemma is_homeomorphic_trivial_fiber_bundle_im : is_homeomorphic_trivial_fiber_bundle ℝ im :=
4545
⟨equiv_real_prodₗ.to_homeomorph.trans (homeomorph.prod_comm ℝ ℝ), λ z, rfl⟩
4646

47-
lemma is_topological_fiber_bundle_re : is_topological_fiber_bundle ℝ re :=
48-
is_trivial_topological_fiber_bundle_re.is_topological_fiber_bundle
47+
lemma is_open_map_re : is_open_map re := is_homeomorphic_trivial_fiber_bundle_re.is_open_map_proj
48+
lemma is_open_map_im : is_open_map im := is_homeomorphic_trivial_fiber_bundle_im.is_open_map_proj
4949

50-
lemma is_topological_fiber_bundle_im : is_topological_fiber_bundle ℝ im :=
51-
is_trivial_topological_fiber_bundle_im.is_topological_fiber_bundle
52-
53-
lemma is_open_map_re : is_open_map re := is_topological_fiber_bundle_re.is_open_map_proj
54-
lemma is_open_map_im : is_open_map im := is_topological_fiber_bundle_im.is_open_map_proj
55-
56-
lemma quotient_map_re : quotient_map re := is_topological_fiber_bundle_re.quotient_map_proj
57-
lemma quotient_map_im : quotient_map im := is_topological_fiber_bundle_im.quotient_map_proj
50+
lemma quotient_map_re : quotient_map re := is_homeomorphic_trivial_fiber_bundle_re.quotient_map_proj
51+
lemma quotient_map_im : quotient_map im := is_homeomorphic_trivial_fiber_bundle_im.quotient_map_proj
5852

5953
lemma interior_preimage_re (s : set ℝ) : interior (re ⁻¹' s) = re ⁻¹' (interior s) :=
6054
(is_open_map_re.preimage_interior_eq_interior_preimage continuous_re _).symm

src/geometry/manifold/cont_mdiff_mfderiv.lean

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -443,30 +443,30 @@ variables (Z : basic_smooth_vector_bundle_core I M E')
443443

444444
/-- A version of `cont_mdiff_at_iff_target` when the codomain is the total space of
445445
a `basic_smooth_vector_bundle_core`. The continuity condition in the RHS is weaker. -/
446-
lemma cont_mdiff_at_iff_target {f : N → Z.to_topological_vector_bundle_core.total_space}
446+
lemma cont_mdiff_at_iff_target {f : N → Z.to_vector_bundle_core.total_space}
447447
{x : N} {n : ℕ∞} :
448448
cont_mdiff_at J (I.prod 𝓘(𝕜, E')) n f x ↔ continuous_at (bundle.total_space.proj ∘ f) x ∧
449449
cont_mdiff_at J 𝓘(𝕜, E × E') n (ext_chart_at (I.prod 𝓘(𝕜, E')) (f x) ∘ f) x :=
450450
begin
451-
let Z' := Z.to_topological_vector_bundle_core,
451+
let Z' := Z.to_vector_bundle_core,
452452
rw [cont_mdiff_at_iff_target, and.congr_left_iff],
453453
refine λ hf, ⟨λ h, Z'.continuous_proj.continuous_at.comp h, λ h, _⟩,
454454
exact (Z'.local_triv ⟨chart_at _ (f x).1, chart_mem_atlas _ _⟩)
455455
.continuous_at_of_comp_left h (mem_chart_source _ _) (h.prod hf.continuous_at.snd)
456456
end
457457

458-
lemma smooth_iff_target {f : N → Z.to_topological_vector_bundle_core.total_space} :
458+
lemma smooth_iff_target {f : N → Z.to_vector_bundle_core.total_space} :
459459
smooth J (I.prod 𝓘(𝕜, E')) f ↔ continuous (bundle.total_space.proj ∘ f) ∧
460460
∀ x, smooth_at J 𝓘(𝕜, E × E') (ext_chart_at (I.prod 𝓘(𝕜, E')) (f x) ∘ f) x :=
461461
by simp_rw [smooth, smooth_at, cont_mdiff, Z.cont_mdiff_at_iff_target, forall_and_distrib,
462462
continuous_iff_continuous_at]
463463

464464
lemma cont_mdiff_proj :
465-
cont_mdiff (I.prod 𝓘(𝕜, E')) I n Z.to_topological_vector_bundle_core.proj :=
465+
cont_mdiff (I.prod 𝓘(𝕜, E')) I n Z.to_vector_bundle_core.proj :=
466466
begin
467467
assume x,
468468
rw [cont_mdiff_at, cont_mdiff_within_at_iff'],
469-
refine ⟨Z.to_topological_vector_bundle_core.continuous_proj.continuous_within_at, _⟩,
469+
refine ⟨Z.to_vector_bundle_core.continuous_proj.continuous_within_at, _⟩,
470470
simp only [(∘), chart_at, chart] with mfld_simps,
471471
apply cont_diff_within_at_fst.congr,
472472
{ rintros ⟨a, b⟩ hab,
@@ -476,39 +476,39 @@ begin
476476
end
477477

478478
lemma smooth_proj :
479-
smooth (I.prod 𝓘(𝕜, E')) I Z.to_topological_vector_bundle_core.proj :=
479+
smooth (I.prod 𝓘(𝕜, E')) I Z.to_vector_bundle_core.proj :=
480480
cont_mdiff_proj Z
481481

482-
lemma cont_mdiff_on_proj {s : set (Z.to_topological_vector_bundle_core.total_space)} :
482+
lemma cont_mdiff_on_proj {s : set (Z.to_vector_bundle_core.total_space)} :
483483
cont_mdiff_on (I.prod 𝓘(𝕜, E')) I n
484-
Z.to_topological_vector_bundle_core.proj s :=
484+
Z.to_vector_bundle_core.proj s :=
485485
Z.cont_mdiff_proj.cont_mdiff_on
486486

487-
lemma smooth_on_proj {s : set (Z.to_topological_vector_bundle_core.total_space)} :
488-
smooth_on (I.prod 𝓘(𝕜, E')) I Z.to_topological_vector_bundle_core.proj s :=
487+
lemma smooth_on_proj {s : set (Z.to_vector_bundle_core.total_space)} :
488+
smooth_on (I.prod 𝓘(𝕜, E')) I Z.to_vector_bundle_core.proj s :=
489489
cont_mdiff_on_proj Z
490490

491-
lemma cont_mdiff_at_proj {p : Z.to_topological_vector_bundle_core.total_space} :
491+
lemma cont_mdiff_at_proj {p : Z.to_vector_bundle_core.total_space} :
492492
cont_mdiff_at (I.prod 𝓘(𝕜, E')) I n
493-
Z.to_topological_vector_bundle_core.proj p :=
493+
Z.to_vector_bundle_core.proj p :=
494494
Z.cont_mdiff_proj.cont_mdiff_at
495495

496-
lemma smooth_at_proj {p : Z.to_topological_vector_bundle_core.total_space} :
497-
smooth_at (I.prod 𝓘(𝕜, E')) I Z.to_topological_vector_bundle_core.proj p :=
496+
lemma smooth_at_proj {p : Z.to_vector_bundle_core.total_space} :
497+
smooth_at (I.prod 𝓘(𝕜, E')) I Z.to_vector_bundle_core.proj p :=
498498
Z.cont_mdiff_at_proj
499499

500500
lemma cont_mdiff_within_at_proj
501-
{s : set (Z.to_topological_vector_bundle_core.total_space)}
502-
{p : Z.to_topological_vector_bundle_core.total_space} :
501+
{s : set (Z.to_vector_bundle_core.total_space)}
502+
{p : Z.to_vector_bundle_core.total_space} :
503503
cont_mdiff_within_at (I.prod 𝓘(𝕜, E')) I n
504-
Z.to_topological_vector_bundle_core.proj s p :=
504+
Z.to_vector_bundle_core.proj s p :=
505505
Z.cont_mdiff_at_proj.cont_mdiff_within_at
506506

507507
lemma smooth_within_at_proj
508-
{s : set (Z.to_topological_vector_bundle_core.total_space)}
509-
{p : Z.to_topological_vector_bundle_core.total_space} :
508+
{s : set (Z.to_vector_bundle_core.total_space)}
509+
{p : Z.to_vector_bundle_core.total_space} :
510510
smooth_within_at (I.prod 𝓘(𝕜, E')) I
511-
Z.to_topological_vector_bundle_core.proj s p :=
511+
Z.to_vector_bundle_core.proj s p :=
512512
Z.cont_mdiff_within_at_proj
513513

514514
/-- If an element of `E'` is invariant under all coordinate changes, then one can define a
@@ -518,24 +518,24 @@ section of the endomorphism bundle of a vector bundle. -/
518518
lemma smooth_const_section (v : E')
519519
(h : ∀ (i j : atlas H M), ∀ x ∈ i.1.source ∩ j.1.source, Z.coord_change i j (i.1 x) v = v) :
520520
smooth I (I.prod 𝓘(𝕜, E'))
521-
(show M → Z.to_topological_vector_bundle_core.total_space, from λ x, ⟨x, v⟩) :=
521+
(show M → Z.to_vector_bundle_core.total_space, from λ x, ⟨x, v⟩) :=
522522
begin
523523
assume x,
524524
rw [cont_mdiff_at, cont_mdiff_within_at_iff'],
525525
split,
526526
{ apply continuous.continuous_within_at,
527-
apply topological_fiber_bundle_core.continuous_const_section,
527+
apply fiber_bundle_core.continuous_const_section,
528528
assume i j y hy,
529529
exact h _ _ _ hy },
530530
{ have : cont_diff 𝕜 ⊤ (λ (y : E), (y, v)) := cont_diff_id.prod cont_diff_const,
531531
apply this.cont_diff_within_at.congr,
532532
{ assume y hy,
533533
simp only with mfld_simps at hy,
534-
simp only [chart, hy, chart_at, prod.mk.inj_iff, to_topological_vector_bundle_core]
534+
simp only [chart, hy, chart_at, prod.mk.inj_iff, to_vector_bundle_core]
535535
with mfld_simps,
536536
apply h,
537537
simp only [hy, subtype.val_eq_coe] with mfld_simps },
538-
{ simp only [chart, chart_at, prod.mk.inj_iff, to_topological_vector_bundle_core]
538+
{ simp only [chart, chart_at, prod.mk.inj_iff, to_vector_bundle_core]
539539
with mfld_simps,
540540
apply h,
541541
simp only [subtype.val_eq_coe] with mfld_simps } }
@@ -634,7 +634,7 @@ begin
634634
{ exact differentiable_at_id'.prod (differentiable_at_const _) } },
635635
simp only [tangent_bundle.zero_section, tangent_map, mfderiv,
636636
A, dif_pos, chart_at, basic_smooth_vector_bundle_core.chart,
637-
basic_smooth_vector_bundle_core.to_topological_vector_bundle_core, tangent_bundle_core,
637+
basic_smooth_vector_bundle_core.to_vector_bundle_core, tangent_bundle_core,
638638
function.comp, continuous_linear_map.map_zero] with mfld_simps,
639639
rw ← fderiv_within_inter N (I.unique_diff (I ((chart_at H x) x)) (set.mem_range_self _)) at B,
640640
rw [← fderiv_within_inter N (I.unique_diff (I ((chart_at H x) x)) (set.mem_range_self _)), ← B],

src/geometry/manifold/mfderiv.lean

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1425,7 +1425,7 @@ begin
14251425
-- a trivial instance is needed after the rewrite, handle it right now.
14261426
rotate, { apply_instance },
14271427
simp only [continuous_linear_map.coe_coe, basic_smooth_vector_bundle_core.chart, h,
1428-
tangent_bundle_core, basic_smooth_vector_bundle_core.to_topological_vector_bundle_core,
1428+
tangent_bundle_core, basic_smooth_vector_bundle_core.to_vector_bundle_core,
14291429
chart_at, sigma.mk.inj_iff] with mfld_simps,
14301430
end
14311431

@@ -1695,7 +1695,7 @@ variables {F : Type*} [normed_add_comm_group F] [normed_space 𝕜 F]
16951695
/-- In a smooth fiber bundle constructed from core, the preimage under the projection of a set with
16961696
unique differential in the basis also has unique differential. -/
16971697
lemma unique_mdiff_on.smooth_bundle_preimage (hs : unique_mdiff_on I s) :
1698-
unique_mdiff_on (I.prod (𝓘(𝕜, F))) (Z.to_topological_vector_bundle_core.proj ⁻¹' s) :=
1698+
unique_mdiff_on (I.prod (𝓘(𝕜, F))) (Z.to_vector_bundle_core.proj ⁻¹' s) :=
16991699
begin
17001700
/- Using a chart (and the fact that unique differentiability is invariant under charts), we
17011701
reduce the situation to the model space, where we can use the fact that products respect
@@ -1706,14 +1706,14 @@ begin
17061706
let e := chart_at (model_prod H F) p,
17071707
-- It suffices to prove unique differentiability in a chart
17081708
suffices h : unique_mdiff_on (I.prod (𝓘(𝕜, F)))
1709-
(e.target ∩ e.symm⁻¹' (Z.to_topological_vector_bundle_core.proj ⁻¹' s)),
1709+
(e.target ∩ e.symm⁻¹' (Z.to_vector_bundle_core.proj ⁻¹' s)),
17101710
{ have A : unique_mdiff_on (I.prod (𝓘(𝕜, F))) (e.symm.target ∩
1711-
e.symm.symm ⁻¹' (e.target ∩ e.symm⁻¹' (Z.to_topological_vector_bundle_core.proj ⁻¹' s))),
1711+
e.symm.symm ⁻¹' (e.target ∩ e.symm⁻¹' (Z.to_vector_bundle_core.proj ⁻¹' s))),
17121712
{ apply h.unique_mdiff_on_preimage,
17131713
exact (mdifferentiable_of_mem_atlas _ (chart_mem_atlas _ _)).symm,
17141714
apply_instance },
17151715
have : p ∈ e.symm.target ∩
1716-
e.symm.symm ⁻¹' (e.target ∩ e.symm⁻¹' (Z.to_topological_vector_bundle_core.proj ⁻¹' s)),
1716+
e.symm.symm ⁻¹' (e.target ∩ e.symm⁻¹' (Z.to_vector_bundle_core.proj ⁻¹' s)),
17171717
by simp only [e, hp] with mfld_simps,
17181718
apply (A _ this).mono,
17191719
assume q hq,

0 commit comments

Comments
 (0)