Imports
/-
Copyright (c) 2025 Joseph Tooby-Smith. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Matteo Cipollina, Joseph Tooby-Smith
-/
module
public import Physlib.Relativity.Tensors.RealTensor.Vector.MinkowskiProductCausality of Lorentz vectors
@[expose] public sectionClassification of lorentz vectors based on their causal character.
inductive CausalCharacter
| timeLike
| lightLike
| spaceLike
deriving DecidableEq
A Lorentz vector p is
lightLike if ⟪p, p⟫ₘ = 0.
timeLike if 0 < ⟪p, p⟫ₘ.
spaceLike if ⟪p, p⟫ₘ < 0.
Note that ⟪p, p⟫ₘ is defined in the +--- convention.
def causalCharacter {d : ℕ} (p : Vector d) : CausalCharacter :=
let v0 := ⟪p, p⟫ₘ
if v0 = 0 then CausalCharacter.lightLike
else if 0 < v0 then CausalCharacter.timeLike
else CausalCharacter.spaceLike
causalCharacter are invariant under an action of the Lorentz group.
All goals completed! 🐙
lemma spaceLike_iff_norm_sq_neg {d : ℕ} (p : Vector d) :
causalCharacter p = CausalCharacter.spaceLike ↔ ⟪p, p⟫ₘ < 0 := by d:ℕp:Vector d⊢ p.causalCharacter = CausalCharacter.spaceLike ↔ (minkowskiProduct p) p < 0
simp only [causalCharacter] d:ℕp:Vector d⊢ (if (minkowskiProduct p) p = 0 then CausalCharacter.lightLike
else if 0 < (minkowskiProduct p) p then CausalCharacter.timeLike else CausalCharacter.spaceLike) =
CausalCharacter.spaceLike ↔
(minkowskiProduct p) p < 0
split isTrue d:ℕp:Vector dh✝:(minkowskiProduct p) p = 0⊢ CausalCharacter.lightLike = CausalCharacter.spaceLike ↔ (minkowskiProduct p) p < 0isFalse d:ℕp:Vector dh✝:¬(minkowskiProduct p) p = 0⊢ (if 0 < (minkowskiProduct p) p then CausalCharacter.timeLike else CausalCharacter.spaceLike) =
CausalCharacter.spaceLike ↔
(minkowskiProduct p) p < 0
· isTrue d:ℕp:Vector dh✝:(minkowskiProduct p) p = 0⊢ CausalCharacter.lightLike = CausalCharacter.spaceLike ↔ (minkowskiProduct p) p < 0 rename_i h isTrue d:ℕp:Vector dh:(minkowskiProduct p) p = 0⊢ CausalCharacter.lightLike = CausalCharacter.spaceLike ↔ (minkowskiProduct p) p < 0
simp only [reduceCtorEq, h, lt_self_iff_false] All goals completed! 🐙
· isFalse d:ℕp:Vector dh✝:¬(minkowskiProduct p) p = 0⊢ (if 0 < (minkowskiProduct p) p then CausalCharacter.timeLike else CausalCharacter.spaceLike) =
CausalCharacter.spaceLike ↔
(minkowskiProduct p) p < 0 split isFalse.isTrue d:ℕp:Vector dh✝¹:¬(minkowskiProduct p) p = 0h✝:0 < (minkowskiProduct p) p⊢ CausalCharacter.timeLike = CausalCharacter.spaceLike ↔ (minkowskiProduct p) p < 0isFalse.isFalse d:ℕp:Vector dh✝¹:¬(minkowskiProduct p) p = 0h✝:¬0 < (minkowskiProduct p) p⊢ CausalCharacter.spaceLike = CausalCharacter.spaceLike ↔ (minkowskiProduct p) p < 0
· isFalse.isTrue d:ℕp:Vector dh✝¹:¬(minkowskiProduct p) p = 0h✝:0 < (minkowskiProduct p) p⊢ CausalCharacter.timeLike = CausalCharacter.spaceLike ↔ (minkowskiProduct p) p < 0 rename_i h isFalse.isTrue d:ℕp:Vector dh✝:¬(minkowskiProduct p) p = 0h:0 < (minkowskiProduct p) p⊢ CausalCharacter.timeLike = CausalCharacter.spaceLike ↔ (minkowskiProduct p) p < 0
simp only [reduceCtorEq, false_iff, not_lt] isFalse.isTrue d:ℕp:Vector dh✝:¬(minkowskiProduct p) p = 0h:0 < (minkowskiProduct p) p⊢ 0 ≤ (minkowskiProduct p) p
exact le_of_lt h All goals completed! 🐙
· isFalse.isFalse d:ℕp:Vector dh✝¹:¬(minkowskiProduct p) p = 0h✝:¬0 < (minkowskiProduct p) p⊢ CausalCharacter.spaceLike = CausalCharacter.spaceLike ↔ (minkowskiProduct p) p < 0 rename_i h1 h2 isFalse.isFalse d:ℕp:Vector dh1:¬(minkowskiProduct p) p = 0h2:¬0 < (minkowskiProduct p) p⊢ CausalCharacter.spaceLike = CausalCharacter.spaceLike ↔ (minkowskiProduct p) p < 0
simp only [true_iff] isFalse.isFalse d:ℕp:Vector dh1:¬(minkowskiProduct p) p = 0h2:¬0 < (minkowskiProduct p) p⊢ (minkowskiProduct p) p < 0
rw [not_lt_iff_eq_or_lt isFalse.isFalse d:ℕp:Vector dh1:¬(minkowskiProduct p) p = 0h2:0 = (minkowskiProduct p) p ∨ (minkowskiProduct p) p < 0⊢ (minkowskiProduct p) p < 0 isFalse.isFalse d:ℕp:Vector dh1:¬(minkowskiProduct p) p = 0h2:0 = (minkowskiProduct p) p ∨ (minkowskiProduct p) p < 0⊢ (minkowskiProduct p) p < 0] at h2 isFalse.isFalse d:ℕp:Vector dh1:¬(minkowskiProduct p) p = 0h2:0 = (minkowskiProduct p) p ∨ (minkowskiProduct p) p < 0⊢ (minkowskiProduct p) p < 0
rw [eq_comm isFalse.isFalse d:ℕp:Vector dh1:¬(minkowskiProduct p) p = 0h2:(minkowskiProduct p) p = 0 ∨ (minkowskiProduct p) p < 0⊢ (minkowskiProduct p) p < 0 isFalse.isFalse d:ℕp:Vector dh1:¬(minkowskiProduct p) p = 0h2:(minkowskiProduct p) p = 0 ∨ (minkowskiProduct p) p < 0⊢ (minkowskiProduct p) p < 0] at h2isFalse.isFalse d:ℕp:Vector dh1:¬(minkowskiProduct p) p = 0h2:(minkowskiProduct p) p = 0 ∨ (minkowskiProduct p) p < 0⊢ (minkowskiProduct p) p < 0
simp_all All goals completed! 🐙
The Lorentz vector p and -p have the same causalCharacter
lemma neg_causalCharacter_eq_self {d : ℕ} (p : Vector d) :
causalCharacter (-p) = causalCharacter p := by d:ℕp:Vector d⊢ (-p).causalCharacter = p.causalCharacter
have h : ⟪-p, -p⟫ₘ = ⟪p, p⟫ₘ := by
rw [minkowskiProduct_toCoord d:ℕp:Vector d⊢ (-p) (Sum.inl 0) * (-p) (Sum.inl 0) - ∑ i, (-p) (Sum.inr i) * (-p) (Sum.inr i) = (minkowskiProduct p) p d:ℕp:Vector d⊢ (-p) (Sum.inl 0) * (-p) (Sum.inl 0) - ∑ i, (-p) (Sum.inr i) * (-p) (Sum.inr i) = (minkowskiProduct p) p d:ℕp:Vector dh:(minkowskiProduct (-p)) (-p) = (minkowskiProduct p) p⊢ (-p).causalCharacter = p.causalCharacter] d:ℕp:Vector d⊢ (-p) (Sum.inl 0) * (-p) (Sum.inl 0) - ∑ i, (-p) (Sum.inr i) * (-p) (Sum.inr i) = (minkowskiProduct p) p d:ℕp:Vector dh:(minkowskiProduct (-p)) (-p) = (minkowskiProduct p) p⊢ (-p).causalCharacter = p.causalCharacter
simp [minkowskiProduct_toCoord] d:ℕp:Vector dh:(minkowskiProduct (-p)) (-p) = (minkowskiProduct p) p⊢ (-p).causalCharacter = p.causalCharacter d:ℕp:Vector dh:(minkowskiProduct (-p)) (-p) = (minkowskiProduct p) p⊢ (-p).causalCharacter = p.causalCharacter
simp only [causalCharacter, h] All goals completed! 🐙
The future light cone of a Lorentz vector p is defined as those
vectors q such that
causalCharacter (q - p) is timeLike and
(q - p) (Sum.inl 0) is positive.
def interiorFutureLightCone {d : ℕ} (p : Vector d) : Set (Vector d) :=
{q | causalCharacter (q - p) = .timeLike ∧ 0 < (q - p) (Sum.inl 0)}
The backward light cone of a Lorentz vector p is defined as those
vectors q such that
causalCharacter (q - p) is timeLike and
(q - p) (Sum.inl 0) is negative.
def interiorPastLightCone {d : ℕ} (p : Vector d) : Set (Vector d) :=
{q | causalCharacter (q - p) = .timeLike ∧ (q - p) (Sum.inl 0) < 0}
The light cone boundary (null surface) of a spacetime point p.
def lightConeBoundary {d : ℕ} (p : Vector d) : Set (Vector d) :=
{q | causalCharacter (q - p) = .lightLike}
The future light cone boundary (null surface) of a spacetime point p.
def futureLightConeBoundary {d : ℕ} (p : Vector d) : Set (Vector d) :=
{q | causalCharacter (q - p) = .lightLike ∧ 0 ≤ (q - p) (Sum.inl 0)}
The past light cone boundary (null surface) of a spacetime point p.
def pastLightConeBoundary {d : ℕ} (p : Vector d) : Set (Vector d) :=
{q | causalCharacter (q - p) = .lightLike ∧ (q - p) (Sum.inl 0) ≤ 0}
Any point p lies on its own light cone boundary, as p - p = 0 has
zero Minkowski norm squared.
lemma self_mem_lightConeBoundary {d : ℕ} (p : Vector d) : p ∈ lightConeBoundary p := by d:ℕp:Vector d⊢ p ∈ p.lightConeBoundary
simp [causalCharacter, lightConeBoundary] All goals completed! 🐙
A proposition which is true if q is in the causal future of event p.
def causallyFollows {d : ℕ} (p q : Vector d) : Prop :=
q ∈ interiorFutureLightCone p ∨ q ∈ futureLightConeBoundary p
A proposition which is true if q is in the causal past of event p.
def causallyPrecedes {d : ℕ} (p q : Vector d) : Prop :=
q ∈ interiorPastLightCone p ∨ q ∈ pastLightConeBoundary p
Events p and q are causally related.
def causallyRelated {d : ℕ} (p q : Vector d) : Prop :=
causallyFollows p q ∨ causallyFollows q pEvents p and q are causally unrelated (spacelike separated).
def {d : ℕ} (p q : Vector d) : Prop :=
causalCharacter (p - q) = CausalCharacter.spaceLikeThe causal diamond between events p and q, where p is assumed to causally precede q.
def causalDiamond {d : ℕ} (p q : Vector d) : Set (Vector d) :=
{r | causallyFollows p r ∧ causallyFollows r q}In Minkowski spacetime with (+---) signature, we can define future-directed vectors as having positive time components (by convention)
def isFutureDirected {d : ℕ} (v : Vector d) : Prop :=
0 < timeComponent vIn Minkowski spacetime with (+---) signature, we can define past-directed vectors as having negative time components (by convention)
def isPastDirected {d : ℕ} (v : Vector d) : Prop :=
timeComponent v < 0