Zulip Chat Archive
Stream: mathlib4
Topic: Generalising Tangent Bundles to Vector Bundles
Dominic Steinitz (Feb 05 2026 at 15:15):
I have a proof for the existence of a Riemannian metric which works for tangent bundles (https://github.com/leanprover-community/mathlib4/pull/33714) and which I am trying to generalise.
For reasons I don't understand I have to cast and as far as I can see stops the specialised proof being generalised.
import Mathlib.Analysis.InnerProductSpace.LinearMap
import Mathlib.Geometry.Manifold.VectorBundle.Tangent
import Mathlib.Topology.VectorBundle.Hom
open Bundle ContDiff Manifold
variable
{EB : Type*} [NormedAddCommGroup EB] [InnerProductSpace ℝ EB]
{HB : Type*} [TopologicalSpace HB] {IB : ModelWithCorners ℝ EB HB} {n : WithTop ℕ∞}
{B : Type*} [TopologicalSpace B] [ChartedSpace HB B]
{F : Type*} [NormedAddCommGroup F] [InnerProductSpace ℝ F]
{E : B → Type*} [TopologicalSpace (TotalSpace F E)]
[∀ x, NormedAddCommGroup (E x)]
[∀ x, NormedSpace ℝ (E x)]
[FiberBundle F E] [VectorBundle ℝ F E]
[IsManifold IB ω B] [ContMDiffVectorBundle ω F E IB]
variable [FiniteDimensional ℝ EB] [SigmaCompactSpace B] [T2Space B]
variable [FiniteDimensional ℝ F]
noncomputable instance : TopologicalSpace (TotalSpace EB (TangentSpace (M := B) IB)) :=
inferInstanceAs (TopologicalSpace (TangentBundle IB B))
noncomputable instance (p : B) : NormedAddCommGroup (TangentSpace IB p) := by
change NormedAddCommGroup EB
infer_instance
noncomputable instance (p : B) : NormedSpace ℝ (TangentSpace IB p) := by
change NormedSpace ℝ EB
infer_instance
-- The general definition
noncomputable
def g_bilin_1g (i b : B) :
(TotalSpace (F →L[ℝ] F →L[ℝ] ℝ)
(fun (x : B) ↦ E x →L[ℝ] E x →L[ℝ] ℝ)) := by
let ψ := trivializationAt (F →L[ℝ] F →L[ℝ] ℝ)
(fun (x : B) ↦ E x →L[ℝ] E x →L[ℝ] ℝ) i
by_cases h : (b, (fun (x : B) ↦ innerSL ℝ) b) ∈ ψ.target
· exact ψ.invFun (b, (fun (x : B) ↦ innerSL ℝ) b)
· exact ⟨b, 0⟩
-- Specialise to tangent spaces
noncomputable
def g_bilin_1 (i b : B) :
(TotalSpace (EB →L[ℝ] EB →L[ℝ] ℝ)
(fun (x : B) ↦ TangentSpace IB x →L[ℝ] TangentSpace IB x →L[ℝ] ℝ)) :=
g_bilin_1g i b
-- The other general definition
noncomputable
def g_bilin_2g (i p : B) : E p →L[ℝ] (E p →L[ℝ] ℝ) := by
let χ := trivializationAt F E i
by_cases h : p ∈ χ.baseSet
· exact (innerSL ℝ).comp (χ.continuousLinearMapAt ℝ p) |>.flip.comp (χ.continuousLinearMapAt ℝ p)
· exact 0
-- Also specialised to tangent spaces
noncomputable
def g_bilin_2 (i p : B) :
(TangentSpace IB) p →L[ℝ] ((TangentSpace IB) p →L[ℝ] ℝ) :=
g_bilin_2g (F := EB) i p
-- This checks
lemma g_bilin_eqt (i b : B)
(hha : (b, innerSL ℝ) ∈
(trivializationAt (EB →L[ℝ] EB →L[ℝ] ℝ)
(fun x ↦ TangentSpace IB x →L[ℝ] TangentSpace IB x →L[ℝ] ℝ) i).target)
(hhb : (b, innerSL (E := EB) ℝ) ∈
((chartAt HB i).source ∩ ((chartAt HB i).source ∩ Set.univ)) ×ˢ Set.univ)
-- This is true for tangent spaces so we don't really need it as a hypothesis we could just use
-- `TangentBundle.trivializationAt_baseSet` but there is no general version
(hhz : ∀ x, (trivializationAt EB (TangentSpace IB) x).baseSet = (chartAt HB (M := B) x).source)
(α β : TangentSpace IB b) :
(g_bilin_1 (IB := IB) i b).snd.toFun α β = (g_bilin_2 i b).toFun α β := by
unfold g_bilin_1 g_bilin_2 g_bilin_1g g_bilin_2g
let ψ := FiberBundle.trivializationAt (EB →L[ℝ] EB →L[ℝ] ℝ)
(fun (x : B) ↦ TangentSpace IB x →L[ℝ] TangentSpace IB x →L[ℝ] ℝ) i
let χ := trivializationAt EB (TangentSpace (M := B) IB) i
let w := ψ.symm b (innerSL ℝ)
simp only []
simp only [hom_trivializationAt_target,
hom_trivializationAt_baseSet,
Trivial.fiberBundle_trivializationAt', Trivial.trivialization_baseSet,
PartialEquiv.invFun_as_coe, OpenPartialHomeomorph.coe_coe_symm,
dite_eq_ite,
AddHom.toFun_eq_coe, LinearMap.coe_toAddHom, ContinuousLinearMap.coe_coe]
have hhc : b ∈ (chartAt HB i).source := Set.mem_of_mem_inter_left hhb.1
have hhd : ((ψ.toOpenPartialHomeomorph.symm (b, innerSL ℝ)).snd α) β =
((innerSL ℝ) ((Trivialization.linearMapAt ℝ χ b) β))
((Trivialization.linearMapAt ℝ χ b) α) :=
sorry -- I have a proof for this
rw [hhz i]
rw [if_pos hhc, if_pos hhb]
exact hhd
omit [SigmaCompactSpace B] [T2Space B] [FiniteDimensional ℝ F] in
lemma g_bilin_1g_proj (i b : B) :
(g_bilin_1g (E := E) (F := F) i b).proj = b := by
unfold g_bilin_1g
let ψ := FiberBundle.trivializationAt (F →L[ℝ] F →L[ℝ] ℝ)
(fun (x : B) ↦ E x →L[ℝ] E x →L[ℝ] ℝ) i
dsimp only []
split_ifs with h
· exact Trivialization.proj_symm_apply ψ h
· rfl
-- In the generalised version I seem to have to write `cast`
lemma g_bilin_eqg (i b : B)
(hha : (b, innerSL ℝ) ∈
(trivializationAt (F →L[ℝ] F →L[ℝ] ℝ)
(fun x ↦ E x →L[ℝ] E x →L[ℝ] ℝ) i).target)
(hhb : (b, innerSL (E := F) ℝ) ∈
((chartAt HB i).source ∩ ((chartAt HB i).source ∩ Set.univ)) ×ˢ Set.univ)
(hhz : ∀ x, (trivializationAt F E x).baseSet = (chartAt HB (M := B) x).source)
(α β : E b) :
(g_bilin_1g (E := E) (F := F) i b).snd.toFun
(cast (by rw [g_bilin_1g_proj]) α)
(cast (by rw [g_bilin_1g_proj]) β)
= (g_bilin_2g (F := F) i b).toFun α β := by
unfold g_bilin_1g g_bilin_2g
let ψ := FiberBundle.trivializationAt (F →L[ℝ] F →L[ℝ] ℝ)
(fun (x : B) ↦ E x →L[ℝ] E x →L[ℝ] ℝ) i
let χ := trivializationAt F E i
let w := ψ.symm b (innerSL ℝ)
simp only []
simp only [hom_trivializationAt_target,
hom_trivializationAt_baseSet,
Trivial.fiberBundle_trivializationAt', Trivial.trivialization_baseSet,
PartialEquiv.invFun_as_coe, OpenPartialHomeomorph.coe_coe_symm,
dite_eq_ite,
AddHom.toFun_eq_coe, LinearMap.coe_toAddHom, ContinuousLinearMap.coe_coe]
have hhc : b ∈ (chartAt HB i).source := Set.mem_of_mem_inter_left hhb.1
have hhd : ((ψ.toOpenPartialHomeomorph.symm (b, innerSL ℝ)).snd α) β =
((innerSL ℝ) ((Trivialization.linearMapAt ℝ χ b) β))
((Trivialization.linearMapAt ℝ χ b) α) :=
sorry -- I have a proof for this
rw [hhz i] -- this fails
rw [if_pos hhc, if_pos hhb]
exact hhd
Dominic Steinitz (Feb 06 2026 at 10:41):
Changing the definition worked but how one is supposed to know this is beyond me.
noncomputable
def g_bilin_1g (i b : B) :
(TotalSpace (F →L[ℝ] F →L[ℝ] ℝ)
(fun (x : B) ↦ E x →L[ℝ] E x →L[ℝ] ℝ)) :=
⟨b, by
let ψ := trivializationAt (F →L[ℝ] F →L[ℝ] ℝ)
(fun (x : B) ↦ E x →L[ℝ] E x →L[ℝ] ℝ) i
by_cases h : (b, (fun (x : B) ↦ innerSL ℝ) b) ∈ ψ.target
· exact (ψ.invFun (b, (fun (x : B) ↦ innerSL ℝ) b)).snd
· exact 0⟩
Last updated: Feb 28 2026 at 14:05 UTC