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

Commit f8d5c64

Browse files
committed
feat(topology/vector_bundle): use trivialization.symm to simplify the product of vector bundles (#14361)
1 parent 660918b commit f8d5c64

File tree

1 file changed

+30
-81
lines changed

1 file changed

+30
-81
lines changed

src/topology/vector_bundle.lean

Lines changed: 30 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -169,9 +169,9 @@ by rw [e.mk_symm hb, e.apply_symm_apply (e.mk_mem_target.mpr hb)]
169169

170170
/-- A pretrivialization for a topological vector bundle defines linear equivalences between the
171171
fibers and the model space. -/
172-
def linear_equiv_at (e : pretrivialization R F E) (b : B)
173-
(hb : b ∈ e.base_set) : E b ≃ₗ[R] F :=
174-
{ to_fun := λ y, (e ⟨b, y⟩).2,
172+
@[simps] def linear_equiv_at (e : pretrivialization R F E) (b : B) (hb : b ∈ e.base_set) :
173+
E b ≃ₗ[R] F :=
174+
{ to_fun := λ y, (e (total_space_mk E b y)).2,
175175
inv_fun := e.symm b,
176176
left_inv := e.symm_apply_apply_mk hb,
177177
right_inv := λ v, by simp_rw [e.apply_mk_symm hb v],
@@ -393,9 +393,9 @@ namespace trivialization
393393

394394
/-- In a topological vector bundle, a trivialization in the fiber (which is a priori only linear)
395395
is in fact a continuous linear equiv between the fibers and the model fiber. -/
396-
def continuous_linear_equiv_at (e : trivialization R F E) (b : B)
396+
@[simps apply symm_apply] def continuous_linear_equiv_at (e : trivialization R F E) (b : B)
397397
(hb : b ∈ e.base_set) : E b ≃L[R] F :=
398-
{ to_fun := λ y, (e ⟨b, y⟩).2,
398+
{ to_fun := λ y, (e (total_space_mk E b y)).2,
399399
inv_fun := e.symm b,
400400
continuous_to_fun := continuous_snd.comp (e.to_local_homeomorph.continuous_on.comp_continuous
401401
(total_space_mk_inducing R F E b).continuous (λ x, e.mem_source.mpr hb)),
@@ -406,9 +406,6 @@ def continuous_linear_equiv_at (e : trivialization R F E) (b : B)
406406
end,
407407
.. e.to_pretrivialization.linear_equiv_at b hb }
408408

409-
@[simp] lemma continuous_linear_equiv_at_apply (e : trivialization R F E) (b : B)
410-
(hb : b ∈ e.base_set) (y : E b) : e.continuous_linear_equiv_at b hb y = (e ⟨b, y⟩).2 := rfl
411-
412409
@[simp] lemma continuous_linear_equiv_at_apply' (e : trivialization R F E)
413410
(x : total_space E) (hx : x ∈ e.source) :
414411
e.continuous_linear_equiv_at (proj E x) (e.mem_source.1 hx) x.2 = (e x).2 := by { cases x, refl }
@@ -902,18 +899,18 @@ variables (E₁ : B → Type*) (E₂ : B → Type*)
902899
variables [topological_space (total_space E₁)] [topological_space (total_space E₂)]
903900

904901
/-- Equip the total space of the fibrewise product of two topological vector bundles `E₁`, `E₂` with
905-
the induced topology from the diagonal embedding into `(total_space E₁) × (total_space E₂)`. -/
902+
the induced topology from the diagonal embedding into `total_space E₁ × total_space E₂`. -/
906903
instance prod.topological_space :
907904
topological_space (total_space (E₁ ×ᵇ E₂)) :=
908905
topological_space.induced
909906
(λ p, ((⟨p.1, p.2.1⟩ : total_space E₁), (⟨p.1, p.2.2⟩ : total_space E₂)))
910-
(by apply_instance : topological_space ((total_space E₁) × (total_space E₂)))
907+
(by apply_instance : topological_space (total_space E₁ × total_space E₂))
911908

912909
/-- The diagonal map from the total space of the fibrewise product of two topological vector bundles
913-
`E₁`, `E₂` into `(total_space E₁) × (total_space E₂)` is `inducing`. -/
910+
`E₁`, `E₂` into `total_space E₁ × total_space E₂` is `inducing`. -/
914911
lemma prod.inducing_diag : inducing
915912
(λ p, (⟨p.1, p.2.1⟩, ⟨p.1, p.2.2⟩) :
916-
total_space (E₁ ×ᵇ E₂) → (total_space E₁) × (total_space E₂)) :=
913+
total_space (E₁ ×ᵇ E₂) → total_space E₁ × total_space E₂) :=
917914
⟨rfl⟩
918915

919916
end defs
@@ -965,95 +962,50 @@ end
965962

966963
variables (e₁ e₂)
967964

968-
variables [Π x : B, topological_space (E₁ x)] [Π x : B, topological_space (E₂ x)]
969-
[topological_vector_bundle R F₁ E₁] [topological_vector_bundle R F₂ E₂]
970-
971965
/-- Given trivializations `e₁`, `e₂` for vector bundles `E₁`, `E₂` over a base `B`, the inverse
972966
function for the construction `topological_vector_bundle.trivialization.prod`, the induced
973967
trivialization for the direct sum of `E₁` and `E₂`. -/
974968
def prod.inv_fun' (p : B × (F₁ × F₂)) : total_space (E₁ ×ᵇ E₂) :=
975-
begin
976-
obtain ⟨x, w₁, w₂⟩ := p,
977-
refine ⟨x, _, _⟩,
978-
{ by_cases h : x ∈ e₁.base_set,
979-
{ exact (e₁.continuous_linear_equiv_at x h).symm w₁ },
980-
{ exact 0 } },
981-
{ by_cases h : x ∈ e₂.base_set,
982-
{ exact (e₂.continuous_linear_equiv_at x h).symm w₂ },
983-
{ exact 0 } },
984-
end
969+
⟨p.1, e₁.symm p.1 p.2.1, e₂.symm p.1 p.2.2
985970

986971
variables {e₁ e₂}
987972

988-
lemma prod.inv_fun'_apply {x : B} (hx₁ : x ∈ e₁.base_set) (hx₂ : x ∈ e₂.base_set)
989-
(w₁ : F₁) (w₂ : F₂) :
990-
prod.inv_fun' e₁ e₂ ⟨x, w₁, w₂⟩
991-
= ⟨x, ((e₁.continuous_linear_equiv_at x hx₁).symm w₁,
992-
(e₂.continuous_linear_equiv_at x hx₂).symm w₂)⟩ :=
993-
begin
994-
dsimp [prod.inv_fun'],
995-
rw [dif_pos, dif_pos],
996-
end
997-
998973
lemma prod.left_inv {x : total_space (E₁ ×ᵇ E₂)}
999974
(h : x ∈ proj (E₁ ×ᵇ E₂) ⁻¹' (e₁.base_set ∩ e₂.base_set)) :
1000975
prod.inv_fun' e₁ e₂ (prod.to_fun' e₁ e₂ x) = x :=
1001976
begin
1002977
obtain ⟨x, v₁, v₂⟩ := x,
1003-
simp only [prod.to_fun', prod.inv_fun', sigma.mk.inj_iff, true_and, eq_self_iff_true,
1004-
prod.mk.inj_iff, heq_iff_eq],
1005-
split,
1006-
{ rw [dif_pos, ← e₁.continuous_linear_equiv_at_apply x h.1,
1007-
continuous_linear_equiv.symm_apply_apply] },
1008-
{ rw [dif_pos, ← e₂.continuous_linear_equiv_at_apply x h.2,
1009-
continuous_linear_equiv.symm_apply_apply] },
978+
obtain ⟨h₁ : x ∈ e₁.base_set, h₂ : x ∈ e₂.base_set⟩ := h,
979+
simp only [prod.to_fun', prod.inv_fun', symm_apply_apply_mk, h₁, h₂]
1010980
end
1011981

1012982
lemma prod.right_inv {x : B × F₁ × F₂}
1013983
(h : x ∈ (e₁.base_set ∩ e₂.base_set) ×ˢ (univ : set (F₁ × F₂))) :
1014984
prod.to_fun' e₁ e₂ (prod.inv_fun' e₁ e₂ x) = x :=
1015985
begin
1016986
obtain ⟨x, w₁, w₂⟩ := x,
1017-
obtain ⟨h, -⟩ := h,
1018-
dsimp only [prod.to_fun', prod.inv_fun'],
1019-
simp only [prod.mk.inj_iff, eq_self_iff_true, true_and],
1020-
split,
1021-
{ rw [dif_pos, ← e₁.continuous_linear_equiv_at_apply x h.1,
1022-
continuous_linear_equiv.apply_symm_apply] },
1023-
{ rw [dif_pos, ← e₂.continuous_linear_equiv_at_apply x h.2,
1024-
continuous_linear_equiv.apply_symm_apply] },
987+
obtain ⟨⟨h₁ : x ∈ e₁.base_set, h₂ : x ∈ e₂.base_set⟩, -⟩ := h,
988+
simp only [prod.to_fun', prod.inv_fun', apply_mk_symm, h₁, h₂]
1025989
end
1026990

1027991
lemma prod.continuous_inv_fun :
1028992
continuous_on (prod.inv_fun' e₁ e₂) ((e₁.base_set ∩ e₂.base_set) ×ˢ (univ : set (F₁ × F₂))) :=
1029993
begin
1030994
rw (prod.inducing_diag E₁ E₂).continuous_on_iff,
1031-
suffices : continuous_on (λ p : B × F₁ × F₂,
1032-
(e₁.to_local_homeomorph.symm ⟨p.1, p.2.1⟩, e₂.to_local_homeomorph.symm ⟨p.1, p.2.2⟩))
1033-
((e₁.base_set ∩ e₂.base_set) ×ˢ (univ : set (F₁ × F₂))),
1034-
{ refine this.congr _,
1035-
rintros ⟨b, v₁, v₂⟩ ⟨⟨h₁, h₂⟩, _⟩,
1036-
dsimp at ⊢ h₁ h₂,
1037-
rw [prod.inv_fun'_apply h₁ h₂, e₁.symm_apply_eq_mk_continuous_linear_equiv_at_symm b h₁,
1038-
e₂.symm_apply_eq_mk_continuous_linear_equiv_at_symm b h₂] },
1039995
have H₁ : continuous (λ p : B × F₁ × F₂, ((p.1, p.2.1), (p.1, p.2.2))) :=
1040996
(continuous_id.prod_map continuous_fst).prod_mk (continuous_id.prod_map continuous_snd),
1041-
have H₂ := e₁.to_local_homeomorph.symm.continuous_on.prod_map
1042-
e₂.to_local_homeomorph.symm.continuous_on,
1043-
refine H₂.comp H₁.continuous_on (λ x h, ⟨_, _⟩),
1044-
{ dsimp,
1045-
rw e₁.target_eq,
1046-
exact ⟨h.1.1, mem_univ _⟩ },
1047-
{ dsimp,
1048-
rw e₂.target_eq,
1049-
exact ⟨h.1.2, mem_univ _⟩ }
997+
refine (e₁.continuous_on_symm.prod_map e₂.continuous_on_symm).comp H₁.continuous_on _,
998+
exact λ x h, ⟨⟨h.1.1, mem_univ _⟩, ⟨h.1.2, mem_univ _⟩⟩
1050999
end
10511000

10521001
variables (e₁ e₂)
1002+
variables [Π x : B, topological_space (E₁ x)] [Π x : B, topological_space (E₂ x)]
1003+
[topological_vector_bundle R F₁ E₁] [topological_vector_bundle R F₂ E₂]
10531004

10541005
/-- Given trivializations `e₁`, `e₂` for vector bundles `E₁`, `E₂` over a base `B`, the induced
10551006
trivialization for the direct sum of `E₁` and `E₂`, whose base set is `e₁.base_set ∩ e₂.base_set`.
10561007
-/
1008+
@[nolint unused_arguments]
10571009
def prod : trivialization R (F₁ × F₂) (E₁ ×ᵇ E₂) :=
10581010
{ to_fun := prod.to_fun' e₁ e₂,
10591011
inv_fun := prod.inv_fun' e₁ e₂,
@@ -1066,7 +1018,7 @@ def prod : trivialization R (F₁ × F₂) (E₁ ×ᵇ E₂) :=
10661018
open_source := begin
10671019
refine (e₁.open_base_set.inter e₂.open_base_set).preimage _,
10681020
have : continuous (proj E₁) := continuous_proj R B F₁,
1069-
exact this.comp (continuous_fst.comp (prod.inducing_diag E₁ E₂).continuous),
1021+
exact this.comp (prod.inducing_diag E₁ E₂).continuous.fst,
10701022
end,
10711023
open_target := (e₁.open_base_set.inter e₂.open_base_set).prod is_open_univ,
10721024
continuous_to_fun := prod.continuous_to_fun,
@@ -1093,11 +1045,9 @@ lemma prod_apply {x : B} (hx₁ : x ∈ e₁.base_set) (hx₂ : x ∈ e₂.base_
10931045
= ⟨x, e₁.continuous_linear_equiv_at x hx₁ v₁, e₂.continuous_linear_equiv_at x hx₂ v₂⟩ :=
10941046
rfl
10951047

1096-
lemma prod_symm_apply {x : B} (hx₁ : x ∈ e₁.base_set) (hx₂ : x ∈ e₂.base_set) (w₁ : F₁) (w₂ : F₂) :
1097-
(prod e₁ e₂).to_local_equiv.symm (x, (w₁, w₂))
1098-
= ⟨x, ((e₁.continuous_linear_equiv_at x hx₁).symm w₁,
1099-
(e₂.continuous_linear_equiv_at x hx₂).symm w₂)⟩ :=
1100-
prod.inv_fun'_apply hx₁ hx₂ w₁ w₂
1048+
lemma prod_symm_apply (x : B) (w₁ : F₁) (w₂ : F₂) : (prod e₁ e₂).to_local_equiv.symm (x, w₁, w₂)
1049+
= ⟨x, e₁.symm x w₁, e₂.symm x w₂⟩ :=
1050+
rfl
11011051

11021052
end trivialization
11031053

@@ -1128,7 +1078,7 @@ instance _root_.bundle.prod.topological_vector_bundle :
11281078
let ε := coord_change he₁ he'₁,
11291079
let η := coord_change he₂ he'₂,
11301080
have fact : (s ∩ t) ×ˢ (univ : set $ F₁ × F₂) =
1131-
(e₁.base_set ∩ e₂.base_set ∩ (e'₁.base_set ∩ e'₂.base_set)) ×ˢ (univ : set $ F₁ × F₂),
1081+
(e₁.base_set ∩ e₂.base_set ∩ (e'₁.base_set ∩ e'₂.base_set)) ×ˢ (univ : set $ F₁ × F₂),
11321082
by mfld_set_tac,
11331083
refine ⟨s ∩ t, _, _, λ b, (ε b).prod (η b), _, _⟩,
11341084
{ rw fact,
@@ -1139,14 +1089,13 @@ instance _root_.bundle.prod.topological_vector_bundle :
11391089
have hη := (continuous_on_coord_change he₂ he'₂).mono (inter_subset_right s t),
11401090
exact hε.prod_map_equivL R hη },
11411091
{ rintros b ⟨hbs, hbt⟩ ⟨u, v⟩,
1142-
have h : (e₁.prod e₂).to_local_homeomorph.symm _ = _ := prod_symm_apply hbs.1 hbt.1 u v,
1143-
simp only [ε, η, h, prod_apply hbs.2 hbt.2,
1144-
← comp_continuous_linear_equiv_at_eq_coord_change he₁ he'₁ hbs,
1092+
have h : (e₁.prod e₂).to_local_homeomorph.symm _ = _ := prod_symm_apply b u v,
1093+
simp_rw [ε, local_equiv.coe_trans, local_homeomorph.coe_coe_symm, local_homeomorph.coe_coe,
1094+
function.comp_app, h, η, topological_vector_bundle.trivialization.coe_coe,
1095+
prod_apply hbs.2 hbt.2, ← comp_continuous_linear_equiv_at_eq_coord_change he₁ he'₁ hbs,
11451096
← comp_continuous_linear_equiv_at_eq_coord_change he₂ he'₂ hbt,
1146-
eq_self_iff_true, function.comp_app, local_equiv.coe_trans, local_homeomorph.coe_coe,
1147-
local_homeomorph.coe_coe_symm, prod.mk.inj_iff,
1148-
topological_vector_bundle.trivialization.coe_coe, true_and,
1149-
continuous_linear_equiv.prod_apply, continuous_linear_equiv.trans_apply] },
1097+
continuous_linear_equiv.prod_apply, continuous_linear_equiv.trans_apply,
1098+
continuous_linear_equiv_at_symm_apply] },
11501099
end }
11511100

11521101
variables {R F₁ E₁ F₂ E₂}

0 commit comments

Comments
 (0)