feat: Add general definition of Feynman diagrams
This commit is contained in:
parent
98ce6af255
commit
a5e9d04941
1 changed files with 249 additions and 0 deletions
249
HepLean/FeynmanDiagrams/Basic.lean
Normal file
249
HepLean/FeynmanDiagrams/Basic.lean
Normal file
|
@ -0,0 +1,249 @@
|
||||||
|
/-
|
||||||
|
Copyright (c) 2024 Joseph Tooby-Smith. All rights reserved.
|
||||||
|
Released under Apache 2.0 license.
|
||||||
|
Authors: Joseph Tooby-Smith
|
||||||
|
-/
|
||||||
|
import Mathlib.Logic.Equiv.Fin
|
||||||
|
import Mathlib.Tactic.FinCases
|
||||||
|
import Mathlib.Data.Finset.Card
|
||||||
|
import Mathlib.CategoryTheory.IsomorphismClasses
|
||||||
|
import Mathlib.CategoryTheory.Functor.Category
|
||||||
|
import Mathlib.CategoryTheory.Comma.Over
|
||||||
|
import Mathlib.Data.Fintype.Pi
|
||||||
|
import Mathlib.CategoryTheory.Limits.Shapes.Terminal
|
||||||
|
import Mathlib.Data.Fintype.Prod
|
||||||
|
import Mathlib.Data.Fintype.Perm
|
||||||
|
import Mathlib.Combinatorics.SimpleGraph.Basic
|
||||||
|
import Mathlib.Combinatorics.SimpleGraph.Connectivity
|
||||||
|
import Mathlib.SetTheory.Cardinal.Basic
|
||||||
|
/-!
|
||||||
|
# Feynman diagrams
|
||||||
|
|
||||||
|
Feynman diagrams are a graphical representation of the terms in the perturbation expansion of
|
||||||
|
a quantum field theory.
|
||||||
|
|
||||||
|
|
||||||
|
-/
|
||||||
|
|
||||||
|
open CategoryTheory
|
||||||
|
/-!
|
||||||
|
|
||||||
|
## The definition of Pre Feynman rules
|
||||||
|
|
||||||
|
We define the notion of a pre-Feynman rule, which specifies the possible
|
||||||
|
half-edges, edges and vertices in a diagram. It does not specify how to turn a diagram
|
||||||
|
into an algebraic expression.
|
||||||
|
|
||||||
|
## TODO
|
||||||
|
Prove that the `halfEdgeLimit` functor lands on limits of functors.
|
||||||
|
|
||||||
|
-/
|
||||||
|
|
||||||
|
/-- A `PreFeynmanRule` is a set of rules specifying the allowed half-edges,
|
||||||
|
edges and vertices in a diagram. (It does not specify how to turn the diagram
|
||||||
|
into an algebraic expression.) -/
|
||||||
|
structure PreFeynmanRule where
|
||||||
|
/-- The type labelling the different half-edges. -/
|
||||||
|
HalfEdgeLabel : Type
|
||||||
|
/-- A type labelling the different types of edges. -/
|
||||||
|
EdgeLabel : Type
|
||||||
|
/-- A type labelling the different types of vertices. -/
|
||||||
|
VertexLabel : Type
|
||||||
|
/-- A function taking `EdgeLabels` to the half edges it contains. -/
|
||||||
|
edgeLabelMap : EdgeLabel → CategoryTheory.Over HalfEdgeLabel
|
||||||
|
/-- A function taking `VertexLabels` to the half edges it contains. -/
|
||||||
|
vertexLabelMap : VertexLabel → CategoryTheory.Over HalfEdgeLabel
|
||||||
|
|
||||||
|
namespace PreFeynmanRule
|
||||||
|
|
||||||
|
variable (P : PreFeynmanRule)
|
||||||
|
|
||||||
|
/-- The functor from `Over (P.HalfEdgeLabel × P.EdgeLabel × P.VertexLabel)`
|
||||||
|
to `Over (P.VertexLabel)` induced by projections on products. -/
|
||||||
|
@[simps!]
|
||||||
|
def toVertex {𝓔 𝓥 : Type} : Over (P.HalfEdgeLabel × 𝓔 × 𝓥) ⥤ Over 𝓥 :=
|
||||||
|
Over.map <| Prod.snd ∘ Prod.snd
|
||||||
|
|
||||||
|
/-- The functor from `Over (P.HalfEdgeLabel × P.EdgeLabel × P.VertexLabel)`
|
||||||
|
to `Over (P.EdgeLabel)` induced by projections on products. -/
|
||||||
|
@[simps!]
|
||||||
|
def toEdge {𝓔 𝓥 : Type} : Over (P.HalfEdgeLabel × 𝓔 × 𝓥) ⥤ Over 𝓔 :=
|
||||||
|
Over.map <| Prod.fst ∘ Prod.snd
|
||||||
|
|
||||||
|
/-- The functor from `Over (P.HalfEdgeLabel × P.EdgeLabel × P.VertexLabel)`
|
||||||
|
to `Over (P.HalfEdgeLabel)` induced by projections on products. -/
|
||||||
|
@[simps!]
|
||||||
|
def toHalfEdge {𝓔 𝓥 : Type} : Over (P.HalfEdgeLabel × 𝓔 × 𝓥) ⥤ Over P.HalfEdgeLabel :=
|
||||||
|
Over.map Prod.fst
|
||||||
|
|
||||||
|
/-- The functor from `Over P.VertexLabel` to `Type` induced by pull-back along insertion of
|
||||||
|
`v : P.VertexLabel`. -/
|
||||||
|
@[simps!]
|
||||||
|
def preimageType' {𝓥 : Type} (v : 𝓥) : Over 𝓥 ⥤ Type where
|
||||||
|
obj := fun f => f.hom ⁻¹' {v}
|
||||||
|
map {f g} F := fun x =>
|
||||||
|
⟨F.left x.1, by
|
||||||
|
have h := congrFun F.w x
|
||||||
|
simp only [Functor.const_obj_obj, Functor.id_obj, Functor.id_map, types_comp_apply,
|
||||||
|
CostructuredArrow.right_eq_id, Functor.const_obj_map, types_id_apply] at h
|
||||||
|
simpa [h] using x.2⟩
|
||||||
|
|
||||||
|
/-- The functor from `Over (P.HalfEdgeLabel × P.EdgeLabel × P.VertexLabel)` to
|
||||||
|
`Over P.HalfEdgeLabel` induced by pull-back along insertion of `v : P.VertexLabel`. -/
|
||||||
|
def preimageVertex {𝓔 𝓥 : Type} (v : 𝓥) :
|
||||||
|
Over (P.HalfEdgeLabel × 𝓔 × 𝓥) ⥤ Over P.HalfEdgeLabel where
|
||||||
|
obj f := Over.mk (fun x => Prod.fst (f.hom x.1) :
|
||||||
|
(P.toVertex ⋙ preimageType' v).obj f ⟶ P.HalfEdgeLabel)
|
||||||
|
map {f g} F := Over.homMk ((P.toVertex ⋙ preimageType' v).map F)
|
||||||
|
(funext <| fun x => congrArg Prod.fst <| congrFun F.w x.1)
|
||||||
|
|
||||||
|
/-- The functor from `Over (P.HalfEdgeLabel × P.EdgeLabel × P.VertexLabel)` to
|
||||||
|
`Over P.HalfEdgeLabel` induced by pull-back along insertion of `v : P.EdgeLabel`. -/
|
||||||
|
def preimageEdge {𝓔 𝓥 : Type} (v : 𝓔) :
|
||||||
|
Over (P.HalfEdgeLabel × 𝓔 × 𝓥) ⥤ Over P.HalfEdgeLabel where
|
||||||
|
obj f := Over.mk (fun x => Prod.fst (f.hom x.1) :
|
||||||
|
(P.toEdge ⋙ preimageType' v).obj f ⟶ P.HalfEdgeLabel)
|
||||||
|
map {f g} F := Over.homMk ((P.toEdge ⋙ preimageType' v).map F)
|
||||||
|
(funext <| fun x => congrArg Prod.fst <| congrFun F.w x.1)
|
||||||
|
|
||||||
|
/-- The proposition on vertices which must be satisfied by an object
|
||||||
|
`F : Over (P.HalfEdgeLabel × P.EdgeLabel × P.VertexLabel)` for it to be a Feynman diagram.
|
||||||
|
This condition corresponds to the vertices of `F` having the correct half-edges associated
|
||||||
|
with them. -/
|
||||||
|
def diagramVertexProp {𝓔 𝓥 : Type} (F : Over (P.HalfEdgeLabel × 𝓔 × 𝓥))
|
||||||
|
(f : 𝓥 ⟶ P.VertexLabel) :=
|
||||||
|
∀ v, IsIsomorphic (P.vertexLabelMap (f v)) ((P.preimageVertex v).obj F)
|
||||||
|
|
||||||
|
|
||||||
|
/-- The proposition on edges which must be satisfied by an object
|
||||||
|
`F : Over (P.HalfEdgeLabel × P.EdgeLabel × P.VertexLabel)` for it to be a Feynman diagram.
|
||||||
|
This condition corresponds to the edges of `F` having the correct half-edges associated
|
||||||
|
with them. -/
|
||||||
|
def diagramEdgeProp {𝓔 𝓥 : Type} (F : Over (P.HalfEdgeLabel × 𝓔 × 𝓥))
|
||||||
|
(f : 𝓔 ⟶ P.EdgeLabel) :=
|
||||||
|
∀ v, IsIsomorphic (P.edgeLabelMap (f v)) ((P.preimageEdge v).obj F)
|
||||||
|
|
||||||
|
/-- The proposition which must be satisfied by an object
|
||||||
|
`F : Over (P.HalfEdgeLabel × P.EdgeLabel × P.VertexLabel)` for it to be a Feynman diagram. cs-/
|
||||||
|
def diagramProp {𝓔 𝓥 : Type} (F : Over (P.HalfEdgeLabel × 𝓔 × 𝓥))
|
||||||
|
(f𝓔 : 𝓔 ⟶ P.EdgeLabel) (f𝓥 : 𝓥 ⟶ P.VertexLabel) :=
|
||||||
|
diagramVertexProp P F f𝓥 ∧ diagramEdgeProp P F f𝓔
|
||||||
|
|
||||||
|
end PreFeynmanRule
|
||||||
|
|
||||||
|
/-!
|
||||||
|
|
||||||
|
## The definition of Feynman diagrams
|
||||||
|
|
||||||
|
We now define the type of Feynman diagrams for a given pre-Feynman rule.
|
||||||
|
|
||||||
|
-/
|
||||||
|
|
||||||
|
open PreFeynmanRule
|
||||||
|
|
||||||
|
/-- The type of Feynman diagrams given a `PreFeynmanRule`. -/
|
||||||
|
structure FeynmanDiagram (P : PreFeynmanRule) where
|
||||||
|
/-- The type of edges in the Feynman diagram, labelled by their type. -/
|
||||||
|
𝓔𝓞 : Over P.EdgeLabel
|
||||||
|
/-- The type of vertices in the Feynman diagram, labelled by their type. -/
|
||||||
|
𝓥𝓞 : Over P.VertexLabel
|
||||||
|
/-- The type of half-edges in the Feynman diagram, labelled by their type, the edge it
|
||||||
|
belongs to, and the vertex they belong to. -/
|
||||||
|
𝓱𝓔To𝓔𝓥 : Over (P.HalfEdgeLabel × 𝓔𝓞.left × 𝓥𝓞.left)
|
||||||
|
/-- Each edge has the correct type of half edges. -/
|
||||||
|
𝓔Cond : P.diagramEdgeProp 𝓱𝓔 𝓔𝓞.hom
|
||||||
|
/-- Each vertex has the correct sort of half edges. -/
|
||||||
|
𝓥Cond : P.diagramVertexProp 𝓱𝓔 𝓥𝓞.hom
|
||||||
|
|
||||||
|
namespace FeynmanDiagram
|
||||||
|
|
||||||
|
variable {P : PreFeynmanRule} (F : FeynmanDiagram P)
|
||||||
|
|
||||||
|
/-- The type of edges. -/
|
||||||
|
def 𝓔 : Type := F.𝓔𝓞.left
|
||||||
|
|
||||||
|
/-- The type of vertices. -/
|
||||||
|
def 𝓥 : Type := F.𝓥𝓞.left
|
||||||
|
|
||||||
|
/-- The type of half-edges. -/
|
||||||
|
def 𝓱𝓔 : Type := F.𝓱𝓔To𝓔𝓥.left
|
||||||
|
|
||||||
|
/-- The object in Over P.HalfEdgeLabel generated by a Feynman diagram. -/
|
||||||
|
def 𝓱𝓔𝓞 : Over P.HalfEdgeLabel := P.toHalfEdge.obj F.𝓱𝓔To𝓔𝓥
|
||||||
|
|
||||||
|
/-- Given two maps `F.𝓔𝓞 ⟶ G.𝓔𝓞` and `F.𝓥𝓞 ⟶ G.𝓥𝓞` the corresponding map
|
||||||
|
`P.HalfEdgeLabel × F.𝓔𝓞.left × F.𝓥𝓞.left → P.HalfEdgeLabel × G.𝓔𝓞.left × G.𝓥𝓞.left`. -/
|
||||||
|
def edgeVertexMap {F G : FeynmanDiagram P} (𝓔 : F.𝓔𝓞 ⟶ G.𝓔𝓞) (𝓥 : F.𝓥𝓞 ⟶ G.𝓥𝓞) :
|
||||||
|
P.HalfEdgeLabel × F.𝓔𝓞.left × F.𝓥𝓞.left → P.HalfEdgeLabel × G.𝓔𝓞.left × G.𝓥𝓞.left :=
|
||||||
|
fun x => ⟨x.1, 𝓔.left x.2.1, 𝓥.left x.2.2⟩
|
||||||
|
|
||||||
|
/-- The functor of over-categories generated by `edgeVertexMap`. -/
|
||||||
|
def edgeVertexFunc {F G : FeynmanDiagram P} (𝓔 : F.𝓔𝓞 ⟶ G.𝓔𝓞) (𝓥 : F.𝓥𝓞 ⟶ G.𝓥𝓞) :
|
||||||
|
Over (P.HalfEdgeLabel × F.𝓔𝓞.left × F.𝓥𝓞.left)
|
||||||
|
⥤ Over (P.HalfEdgeLabel × G.𝓔𝓞.left × G.𝓥𝓞.left) :=
|
||||||
|
Over.map <| edgeVertexMap 𝓔 𝓥
|
||||||
|
|
||||||
|
/-- A morphism of Feynman diagrams. -/
|
||||||
|
structure Hom (F G : FeynmanDiagram P) where
|
||||||
|
/-- The morphism of edge objects. -/
|
||||||
|
𝓔 : F.𝓔𝓞 ⟶ G.𝓔𝓞
|
||||||
|
/-- The morphism of vertex objects. -/
|
||||||
|
𝓥 : F.𝓥𝓞 ⟶ G.𝓥𝓞
|
||||||
|
/-- The morphism of half-edge objects. -/
|
||||||
|
𝓱𝓔 : (edgeVertexFunc 𝓔 𝓥).obj F.𝓱𝓔To𝓔𝓥 ⟶ G.𝓱𝓔To𝓔𝓥
|
||||||
|
|
||||||
|
namespace Hom
|
||||||
|
|
||||||
|
/-- The identity morphism for a Feynman diagram. -/
|
||||||
|
def id (F : FeynmanDiagram P) : Hom F F where
|
||||||
|
𝓔 := 𝟙 F.𝓔𝓞
|
||||||
|
𝓥 := 𝟙 F.𝓥𝓞
|
||||||
|
𝓱𝓔 := 𝟙 F.𝓱𝓔To𝓔𝓥
|
||||||
|
|
||||||
|
/-- The composition of two morphisms of Feynman diagrams. -/
|
||||||
|
def comp {F G H : FeynmanDiagram P} (f : Hom F G) (g : Hom G H) : Hom F H where
|
||||||
|
𝓔 := f.𝓔 ≫ g.𝓔
|
||||||
|
𝓥 := f.𝓥 ≫ g.𝓥
|
||||||
|
𝓱𝓔 := (edgeVertexFunc g.𝓔 g.𝓥).map f.𝓱𝓔 ≫ g.𝓱𝓔
|
||||||
|
|
||||||
|
lemma ext {F G : FeynmanDiagram P} {f g : Hom F G} (h𝓔 : f.𝓔 = g.𝓔)
|
||||||
|
(h𝓥 : f.𝓥 = g.𝓥) (h𝓱𝓔 : f.𝓱𝓔.left = g.𝓱𝓔.left) : f = g := by
|
||||||
|
cases f
|
||||||
|
cases g
|
||||||
|
subst h𝓔 h𝓥
|
||||||
|
simp_all only [mk.injEq, heq_eq_eq, true_and]
|
||||||
|
ext a : 2
|
||||||
|
simp_all only
|
||||||
|
|
||||||
|
end Hom
|
||||||
|
|
||||||
|
/-- Feynman diagrams form a category. -/
|
||||||
|
instance : Category (FeynmanDiagram P) where
|
||||||
|
Hom := Hom
|
||||||
|
id := Hom.id
|
||||||
|
comp := Hom.comp
|
||||||
|
|
||||||
|
/-- The functor from Feynman diagrams to category over edge labels. -/
|
||||||
|
def toOverEdgeLabel : FeynmanDiagram P ⥤ Over P.EdgeLabel where
|
||||||
|
obj F := F.𝓔𝓞
|
||||||
|
map f := f.𝓔
|
||||||
|
|
||||||
|
/-- The functor from Feynman diagrams to category over vertex labels. -/
|
||||||
|
def toOverVertexLabel : FeynmanDiagram P ⥤ Over P.VertexLabel where
|
||||||
|
obj F := F.𝓥𝓞
|
||||||
|
map f := f.𝓥
|
||||||
|
|
||||||
|
/-- The functor from Feynman diagrams to category over half-edge labels. -/
|
||||||
|
def toOverHalfEdgeLabel : FeynmanDiagram P ⥤ Over P.HalfEdgeLabel where
|
||||||
|
obj F := F.𝓱𝓔𝓞
|
||||||
|
map f := P.toHalfEdge.map f.𝓱𝓔
|
||||||
|
|
||||||
|
/-- The type of isomorphisms of a Feynman diagram. -/
|
||||||
|
def symmetryType : Type := F ≅ F
|
||||||
|
|
||||||
|
/-- The symmetry factor can be defined as the cardinal of the symmetry type.
|
||||||
|
In general this is not a finite number. -/
|
||||||
|
def symmetryFactor : Cardinal := Cardinal.mk (F.symmetryType)
|
||||||
|
|
||||||
|
|
||||||
|
end FeynmanDiagram
|
Loading…
Add table
Add a link
Reference in a new issue