PhysLean/HepLean/SpaceTime/LorentzTensor/Notation.lean
2024-08-01 06:35:32 -04:00

74 lines
2.7 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/-
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
-/
import HepLean.SpaceTime.LorentzTensor.Real.Basic
import Init.NotationExtra
/-!
# Notation for Lorentz Tensors
This file is currently a stub.
We plan to set up index-notation for dealing with tensors.
Some examples:
- `ψᵘ¹ᵘ²φᵤ₁` should correspond to the contraction of the first index of `ψ` and the
only index of `φ`.
- `ψᵘ¹ᵘ² = ψᵘ²ᵘ¹` should define the symmetry of `ψ` under the exchange of its indices.
- `θᵤ₂(ψᵘ¹ᵘ²φᵤ₁) = (θᵤ₂ψᵘ¹ᵘ²)φᵤ₁` should correspond to an associativity properity of
contraction.
It should also be possible to define this generically for any `LorentzTensorStructure`.
Further we plan to make easy to define tensors with indices. E.g. `(ψ : Tenᵘ¹ᵘ²ᵤ₃)`
should correspond to a (real Lorentz) tensors with 3 indices, two upper and one lower.
For `(ψ : Tenᵘ¹ᵘ²ᵤ₃)`, if one writes e.g. `ψᵤ₁ᵘ²ᵤ₃`, this should correspond to a
lowering of the first index of `ψ`.
Further, it will be nice if we can have implicit contractions of indices
e.g. in Weyl fermions.
-/
open Lean
open Lean
open Lean.Parser
open Lean.Elab
open Lean.Elab.Command
variable {R : Type} [CommSemiring R]
class IndexNotation (𝓣 : TensorStructure R) where
nota : 𝓣.Color → Char
namespace IndexNotation
variable (𝓣 : TensorStructure R) [IndexNotation 𝓣]
variable [Fintype 𝓣.Color] [DecidableEq 𝓣.Color]
def IsIndexSpecifier (c : Char) : Bool :=
if ∃ (μ : 𝓣.Color), c = nota μ then true else false
def IsIndexId (c : Char) : Bool :=
if c = '₀' c = '₁' c = '₂' c = '₃' c = '₄' c = '₅' c = '₆'
c = '₇' c = '₈' c = '₉' c = '⁰' c = '¹' c = '²' c = '³' c = '⁴'
c = '⁵' c = '⁶' c = '⁷' c = '⁸' c = '⁹' then true else false
partial def takeWhileFnFstAux (n : ) (p1 : Char → Bool) (p : Char → Bool) : ParserFn := fun c s =>
let i := s.pos
if h : c.input.atEnd i then s
else if ¬ ((n = 0 ∧ p1 (c.input.get' i h)) (n ≠ 0 ∧ p (c.input.get' i h))) then s
else takeWhileFnFstAux n.succ p1 p c (s.next' c.input i h)
def takeWhileFnFst (p1 : Char → Bool) (p : Char → Bool) : ParserFn := takeWhileFnFstAux 0 p1 p
/-- Parser for index structures. -/
def indexParser : ParserFn := (takeWhileFnFst (IsIndexSpecifier 𝓣) IsIndexId)
def indexParserMany : ParserFn := Lean.Parser.many1Fn (indexParser 𝓣)
def singleTensorElab : Lean.Elab.Term.TermElab := fun stx expectedType => do
return mkNatLit 0
end IndexNotation