Imports
/-
Copyright (c) 2024 Joseph Tooby-Smith. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Tooby-Smith
-/
module
public import Physlib.Relativity.Tensors.RealTensor.Vector.MinkowskiProductLorentz Velocities
In this module we define Lorentz velocities to be Lorentz vectors which have norm equal to one and which are future-directed.
@[expose] public sectionA Lorentz Velocity is a Lorentz vector which has norm equal to one and which is future-directed.
def Velocity (d : ℕ := 3) : Set (Vector d) := fun v => ⟪v, v⟫ₘ = (1 : ℝ)
∧ 0 < v.timeComponent@[ext]
lemma ext {v w : Velocity d} (h : v.1 = w.1) : v = w := d:ℕv:↑(Velocity d)w:↑(Velocity d)h:↑v = ↑w⊢ v = w
All goals completed! 🐙lemma mem_iff {v : Vector d} : v ∈ Velocity d ↔ ⟪v, v⟫ₘ = (1 : ℝ) ∧ 0 < v.timeComponent := d:ℕv:Vector d⊢ v ∈ Velocity d ↔ (minkowskiProduct v) v = 1 ∧ 0 < v.timeComponent
All goals completed! 🐙@[simp]
lemma minkowskiProduct_self_eq_one (v : Velocity d) : ⟪v.1, v.1⟫ₘ = (1 : ℝ) := v.2.1@[simp]
lemma timeComponent_pos (v : Velocity d) : 0 < v.1.timeComponent := v.2.2@[simp]
lemma timeComponent_nonneg (v : Velocity d) : 0 ≤ v.1.timeComponent := d:ℕv:↑(Velocity d)⊢ 0 ≤ (↑v).timeComponent
All goals completed! 🐙@[simp]
lemma timeComponent_abs (v : Velocity d) :
|v.1.timeComponent| = v.1.timeComponent := d:ℕv:↑(Velocity d)⊢ |(↑v).timeComponent| = (↑v).timeComponent
All goals completed! 🐙d:ℕv:↑(Velocity d)⊢ ‖(↑v).timeComponent‖ ^ 2 - ‖(↑v).spatialPart‖ ^ 2 + ‖(↑v).spatialPart‖ ^ 2 ≤ ‖(↑v).timeComponent‖ ^ 2
simp All goals completed! 🐙
lemma norm_spatialPart_sq_eq (v : Velocity d) :
‖v.1.spatialPart‖ ^ 2 = (v.1 (Sum.inl 0))^2 - 1 := by d:ℕv:↑(Velocity d)⊢ ‖(↑v).spatialPart‖ ^ 2 = ↑v (Sum.inl 0) ^ 2 - 1
rw [← minkowskiProduct_self_eq_one v d:ℕv:↑(Velocity d)⊢ ‖(↑v).spatialPart‖ ^ 2 = ↑v (Sum.inl 0) ^ 2 - (minkowskiProduct ↑v) ↑v d:ℕv:↑(Velocity d)⊢ ‖(↑v).spatialPart‖ ^ 2 = ↑v (Sum.inl 0) ^ 2 - (minkowskiProduct ↑v) ↑v] d:ℕv:↑(Velocity d)⊢ ‖(↑v).spatialPart‖ ^ 2 = ↑v (Sum.inl 0) ^ 2 - (minkowskiProduct ↑v) ↑v
rw [minkowskiProduct_self_eq_timeComponent_spatialPart d:ℕv:↑(Velocity d)⊢ ‖(↑v).spatialPart‖ ^ 2 = ↑v (Sum.inl 0) ^ 2 - (‖(↑v).timeComponent‖ ^ 2 - ‖(↑v).spatialPart‖ ^ 2) d:ℕv:↑(Velocity d)⊢ ‖(↑v).spatialPart‖ ^ 2 = ↑v (Sum.inl 0) ^ 2 - (‖(↑v).timeComponent‖ ^ 2 - ‖(↑v).spatialPart‖ ^ 2)] d:ℕv:↑(Velocity d)⊢ ‖(↑v).spatialPart‖ ^ 2 = ↑v (Sum.inl 0) ^ 2 - (‖(↑v).timeComponent‖ ^ 2 - ‖(↑v).spatialPart‖ ^ 2)
simp [timeComponent] All goals completed! 🐙
lemma zero_le_minkowskiProduct (u v : Velocity d) :
0 ≤ ⟪u.1, v.1⟫ₘ := by d:ℕu:↑(Velocity d)v:↑(Velocity d)⊢ 0 ≤ (minkowskiProduct ↑u) ↑v
trans ‖u.1.timeComponent‖ * ‖v.1.timeComponent‖ - ‖u.1.spatialPart‖ * ‖v.1.spatialPart‖ d:ℕu:↑(Velocity d)v:↑(Velocity d)⊢ 0 ≤ ‖(↑u).timeComponent‖ * ‖(↑v).timeComponent‖ - ‖(↑u).spatialPart‖ * ‖(↑v).spatialPart‖d:ℕu:↑(Velocity d)v:↑(Velocity d)⊢ ‖(↑u).timeComponent‖ * ‖(↑v).timeComponent‖ - ‖(↑u).spatialPart‖ * ‖(↑v).spatialPart‖ ≤ (minkowskiProduct ↑u) ↑v
· d:ℕu:↑(Velocity d)v:↑(Velocity d)⊢ 0 ≤ ‖(↑u).timeComponent‖ * ‖(↑v).timeComponent‖ - ‖(↑u).spatialPart‖ * ‖(↑v).spatialPart‖ rw [sub_nonneg d:ℕu:↑(Velocity d)v:↑(Velocity d)⊢ ‖(↑u).spatialPart‖ * ‖(↑v).spatialPart‖ ≤ ‖(↑u).timeComponent‖ * ‖(↑v).timeComponent‖ d:ℕu:↑(Velocity d)v:↑(Velocity d)⊢ ‖(↑u).spatialPart‖ * ‖(↑v).spatialPart‖ ≤ ‖(↑u).timeComponent‖ * ‖(↑v).timeComponent‖] d:ℕu:↑(Velocity d)v:↑(Velocity d)⊢ ‖(↑u).spatialPart‖ * ‖(↑v).spatialPart‖ ≤ ‖(↑u).timeComponent‖ * ‖(↑v).timeComponent‖
apply mul_le_mul h₁ d:ℕu:↑(Velocity d)v:↑(Velocity d)⊢ ‖(↑u).spatialPart‖ ≤ ‖(↑u).timeComponent‖h₂ d:ℕu:↑(Velocity d)v:↑(Velocity d)⊢ ‖(↑v).spatialPart‖ ≤ ‖(↑v).timeComponent‖c0 d:ℕu:↑(Velocity d)v:↑(Velocity d)⊢ 0 ≤ ‖(↑v).spatialPart‖b0 d:ℕu:↑(Velocity d)v:↑(Velocity d)⊢ 0 ≤ ‖(↑u).timeComponent‖
· h₁ d:ℕu:↑(Velocity d)v:↑(Velocity d)⊢ ‖(↑u).spatialPart‖ ≤ ‖(↑u).timeComponent‖ exact norm_spatialPart_le_timeComponent u All goals completed! 🐙
· h₂ d:ℕu:↑(Velocity d)v:↑(Velocity d)⊢ ‖(↑v).spatialPart‖ ≤ ‖(↑v).timeComponent‖ exact norm_spatialPart_le_timeComponent v All goals completed! 🐙
· c0 d:ℕu:↑(Velocity d)v:↑(Velocity d)⊢ 0 ≤ ‖(↑v).spatialPart‖ exact norm_nonneg v.1.spatialPart All goals completed! 🐙
· b0 d:ℕu:↑(Velocity d)v:↑(Velocity d)⊢ 0 ≤ ‖(↑u).timeComponent‖ exact norm_nonneg u.1.timeComponent All goals completed! 🐙
rw [minkowskiProduct_eq_timeComponent_spatialPart d:ℕu:↑(Velocity d)v:↑(Velocity d)⊢ ‖(↑u).timeComponent‖ * ‖(↑v).timeComponent‖ - ‖(↑u).spatialPart‖ * ‖(↑v).spatialPart‖ ≤
(↑u).timeComponent * (↑v).timeComponent - inner ℝ (↑u).spatialPart (↑v).spatialPart d:ℕu:↑(Velocity d)v:↑(Velocity d)⊢ ‖(↑u).timeComponent‖ * ‖(↑v).timeComponent‖ - ‖(↑u).spatialPart‖ * ‖(↑v).spatialPart‖ ≤
(↑u).timeComponent * (↑v).timeComponent - inner ℝ (↑u).spatialPart (↑v).spatialPart] d:ℕu:↑(Velocity d)v:↑(Velocity d)⊢ ‖(↑u).timeComponent‖ * ‖(↑v).timeComponent‖ - ‖(↑u).spatialPart‖ * ‖(↑v).spatialPart‖ ≤
(↑u).timeComponent * (↑v).timeComponent - inner ℝ (↑u).spatialPart (↑v).spatialPart
apply sub_le_sub hab d:ℕu:↑(Velocity d)v:↑(Velocity d)⊢ ‖(↑u).timeComponent‖ * ‖(↑v).timeComponent‖ ≤ (↑u).timeComponent * (↑v).timeComponenthcd d:ℕu:↑(Velocity d)v:↑(Velocity d)⊢ inner ℝ (↑u).spatialPart (↑v).spatialPart ≤ ‖(↑u).spatialPart‖ * ‖(↑v).spatialPart‖
· hab d:ℕu:↑(Velocity d)v:↑(Velocity d)⊢ ‖(↑u).timeComponent‖ * ‖(↑v).timeComponent‖ ≤ (↑u).timeComponent * (↑v).timeComponent simp All goals completed! 🐙
· hcd d:ℕu:↑(Velocity d)v:↑(Velocity d)⊢ inner ℝ (↑u).spatialPart (↑v).spatialPart ≤ ‖(↑u).spatialPart‖ * ‖(↑v).spatialPart‖ exact real_inner_le_norm u.1.spatialPart v.1.spatialPart All goals completed! 🐙lemma one_add_minkowskiProduct_ne_zero (u v : Velocity d) :
1 + ⟪u.1, v.1⟫ₘ ≠ 0 := by d:ℕu:↑(Velocity d)v:↑(Velocity d)⊢ 1 + (minkowskiProduct ↑u) ↑v ≠ 0
linarith [zero_le_minkowskiProduct u v] All goals completed! 🐙lemma minkowskiProduct_continuous_snd (u : Vector d) :
Continuous fun (x : Velocity d) => ⟪u, x.1⟫ₘ := by d:ℕu:Vector d⊢ Continuous fun x => (minkowskiProduct u) ↑x
fun_prop All goals completed! 🐙
@[fun_prop]
lemma minkowskiProduct_continuous_fst (u : Vector d) :
Continuous fun (x : Velocity d) => ⟪x.1, u⟫ₘ := by d:ℕu:Vector d⊢ Continuous fun x => (minkowskiProduct ↑x) u
have h1 : (fun (x : Velocity d) => ⟪x.1, u⟫ₘ) =
(fun (x : Velocity d) => ⟪u, x.1⟫ₘ) := by
ext x d:ℕu:Vector dx:↑(Velocity d)⊢ (minkowskiProduct ↑x) u = (minkowskiProduct u) ↑x d:ℕu:Vector dh1:(fun x => (minkowskiProduct ↑x) u) = fun x => (minkowskiProduct u) ↑x⊢ Continuous fun x => (minkowskiProduct ↑x) u
rw [minkowskiProduct_symm d:ℕu:Vector dx:↑(Velocity d)⊢ (minkowskiProduct u) ↑x = (minkowskiProduct u) ↑x d:ℕu:Vector dh1:(fun x => (minkowskiProduct ↑x) u) = fun x => (minkowskiProduct u) ↑x⊢ Continuous fun x => (minkowskiProduct ↑x) u] d:ℕu:Vector dh1:(fun x => (minkowskiProduct ↑x) u) = fun x => (minkowskiProduct u) ↑x⊢ Continuous fun x => (minkowskiProduct ↑x) u d:ℕu:Vector dh1:(fun x => (minkowskiProduct ↑x) u) = fun x => (minkowskiProduct u) ↑x⊢ Continuous fun x => (minkowskiProduct ↑x) u
rw [h1 d:ℕu:Vector dh1:(fun x => (minkowskiProduct ↑x) u) = fun x => (minkowskiProduct u) ↑x⊢ Continuous fun x => (minkowskiProduct u) ↑x d:ℕu:Vector dh1:(fun x => (minkowskiProduct ↑x) u) = fun x => (minkowskiProduct u) ↑x⊢ Continuous fun x => (minkowskiProduct u) ↑x] d:ℕu:Vector dh1:(fun x => (minkowskiProduct ↑x) u) = fun x => (minkowskiProduct u) ↑x⊢ Continuous fun x => (minkowskiProduct u) ↑x
exact minkowskiProduct_continuous_snd u All goals completed! 🐙Zero
@[simp]
lemma zero_timeComponent : (0 : Velocity d).1.timeComponent = 1 := by d:ℕ⊢ (↑0).timeComponent = 1
change (Vector.basis (Sum.inl 0)).timeComponent = 1 d:ℕ⊢ (basis (Sum.inl 0)).timeComponent = 1
simp All goals completed! 🐙Topology
lemma isPathConnected : IsPathConnected (@Set.univ (Velocity d)) := by d:ℕ⊢ IsPathConnected Set.univ
use (zero (d := d)) h d:ℕ⊢ zero ∈ Set.univ ∧ ∀ ⦃y : ↑(Velocity d)⦄, y ∈ Set.univ → JoinedIn Set.univ zero y
apply And.intro trivial ?_ d:ℕ⊢ ∀ ⦃y : ↑(Velocity d)⦄, y ∈ Set.univ → JoinedIn Set.univ zero y
intro y a d:ℕy:↑(Velocity d)a:y ∈ Set.univ⊢ JoinedIn Set.univ zero y
use pathFromZero (d := d) y h d:ℕy:↑(Velocity d)a:y ∈ Set.univ⊢ ∀ (t : ↑unitInterval), (pathFromZero y) t ∈ Set.univ
exact fun _ => a All goals completed! 🐙