Imports
/- Copyright (c) 2025 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.QFT.PerturbationTheory.WickAlgebra.WickTerm

Wick's theorem

This file constrains the time-dependent version of Wick's theorem for lists of fields containing both fermions and bosons.

Wick's theorem is related to Isserlis' theorem in mathematics.

@[expose] public section

Wick terms

Wick's theorem

lemma wicks_theorem_congr {φs φs' : List 𝓕.FieldOp} (h : φs = φs') : (φsΛ : WickContraction φs.length), φsΛ.wickTerm = (φs'Λ : WickContraction φs'.length), φs'Λ.wickTerm := h rfl

For a list φs of 𝓕.FieldOp, Wick's theorem states that

𝓣(φs) = ∑ φsΛ, φsΛ.wickTerm

where the sum is over all Wick contraction φsΛ.

The proof is via induction on φs.

    The base case φs = [] is handled by wickTerm_empty_nil.

The inductive step works as follows:

For the LHS:

    timeOrder_eq_maxTimeField_mul_finset is used to write 𝓣(φ₀…φₙ) as 𝓢(φᵢ,φ₀…φᵢ₋₁) • φᵢ * 𝓣(φ₀…φᵢ₋₁φᵢ₊₁φₙ) where φᵢ is the maximal time field in φ₀…φₙ

    The induction hypothesis is then used on 𝓣(φ₀…φᵢ₋₁φᵢ₊₁φₙ) to expand it as a sum over Wick contractions of φ₀…φᵢ₋₁φᵢ₊₁φₙ.

    This gives terms of the form φᵢ * φsΛ.wickTerm on which mul_wickTerm_eq_sum is used where φsΛ is a Wick contraction of φ₀…φᵢ₋₁φᵢ₊₁φ, to rewrite terms as a sum over optional uncontracted elements of φsΛ

On the LHS we now have a sum over Wick contractions φsΛ of φ₀…φᵢ₋₁φᵢ₊₁φ (from 2) and optional uncontracted elements of φsΛ (from 3)

For the RHS:

    The sum over Wick contractions of φ₀…φₙ on the RHS is split via insertLift_sum into a sum over Wick contractions φsΛ of φ₀…φᵢ₋₁φᵢ₊₁φ and sum over optional uncontracted elements of φsΛ.

Both sides are now sums over the same thing and their terms equate by the nature of the lemmas used.

𝓕:FieldSpecificationφ:𝓕.FieldOpφs:List 𝓕.FieldOpih:timeOrder (ofFieldOpList (eraseMaxTimeField φ φs)) = φsΛ, φsΛ.wickTermh1:φ :: φs = (eraseMaxTimeField φ φs).insertIdx (↑(maxTimeFieldPosFin φ φs)) (maxTimeField φ φs)c:WickContraction (eraseMaxTimeField φ φs).lengthx✝:c Finset.univ((exchangeSign (𝓕|>ₛmaxTimeField φ φs)) (ofFinset 𝓕.fieldOpStatistic (eraseMaxTimeField φ φs).get {x | (maxTimeFieldPosFin φ φs).succAbove x < maxTimeFieldPosFin φ φs}) * (exchangeSign (𝓕|>ₛmaxTimeField φ φs)) (ofFinset 𝓕.fieldOpStatistic (eraseMaxTimeField φ φs).get {x | (maxTimeFieldPosFin φ φs).succAbove x < maxTimeFieldPosFin φ φs})) k, (c↩Λ(maxTimeField φ φs)(maxTimeFieldPosFin φ φs)k).wickTerm = k, (c↩Λ(maxTimeField φ φs)(maxTimeFieldPosFin φ φs)k).wickTerm𝓕:FieldSpecificationφ:𝓕.FieldOpφs:List 𝓕.FieldOpih:timeOrder (ofFieldOpList (eraseMaxTimeField φ φs)) = φsΛ, φsΛ.wickTermh1:φ :: φs = (eraseMaxTimeField φ φs).insertIdx (↑(maxTimeFieldPosFin φ φs)) (maxTimeField φ φs)c:WickContraction (eraseMaxTimeField φ φs).lengthx✝:c Finset.univ (k : Fin (eraseMaxTimeField φ φs).length), timeOrderRel (maxTimeField φ φs) (eraseMaxTimeField φ φs)[k]𝓕:FieldSpecificationφ:𝓕.FieldOpφs:List 𝓕.FieldOpih:timeOrder (ofFieldOpList (eraseMaxTimeField φ φs)) = φsΛ, φsΛ.wickTermh1:φ :: φs = (eraseMaxTimeField φ φs).insertIdx (↑(maxTimeFieldPosFin φ φs)) (maxTimeField φ φs)c:WickContraction (eraseMaxTimeField φ φs).lengthx✝:c Finset.univ (k : Fin (eraseMaxTimeField φ φs).length), (maxTimeFieldPosFin φ φs).succAbove k < maxTimeFieldPosFin φ φs ¬timeOrderRel (eraseMaxTimeField φ φs)[k] (maxTimeField φ φs) 𝓕:FieldSpecificationφ:𝓕.FieldOpφs:List 𝓕.FieldOpih:timeOrder (ofFieldOpList (eraseMaxTimeField φ φs)) = φsΛ, φsΛ.wickTermh1:φ :: φs = (eraseMaxTimeField φ φs).insertIdx (↑(maxTimeFieldPosFin φ φs)) (maxTimeField φ φs)c:WickContraction (eraseMaxTimeField φ φs).lengthx✝:c Finset.univ (k : Fin (eraseMaxTimeField φ φs).length), timeOrderRel (maxTimeField φ φs) (eraseMaxTimeField φ φs)[k]𝓕:FieldSpecificationφ:𝓕.FieldOpφs:List 𝓕.FieldOpih:timeOrder (ofFieldOpList (eraseMaxTimeField φ φs)) = φsΛ, φsΛ.wickTermh1:φ :: φs = (eraseMaxTimeField φ φs).insertIdx (↑(maxTimeFieldPosFin φ φs)) (maxTimeField φ φs)c:WickContraction (eraseMaxTimeField φ φs).lengthx✝:c Finset.univ (k : Fin (eraseMaxTimeField φ φs).length), (maxTimeFieldPosFin φ φs).succAbove k < maxTimeFieldPosFin φ φs ¬timeOrderRel (eraseMaxTimeField φ φs)[k] (maxTimeField φ φs) 𝓕:FieldSpecificationφ:𝓕.FieldOpφs:List 𝓕.FieldOpih:timeOrder (ofFieldOpList (eraseMaxTimeField φ φs)) = φsΛ, φsΛ.wickTermh1:φ :: φs = (eraseMaxTimeField φ φs).insertIdx (↑(maxTimeFieldPosFin φ φs)) (maxTimeField φ φs)c:WickContraction (eraseMaxTimeField φ φs).lengthx✝:c Finset.univ (k : Fin (eraseMaxTimeField φ φs).length), timeOrderRel (maxTimeField φ φs) (eraseMaxTimeField φ φs)[k] All goals completed! 🐙 𝓕:FieldSpecificationφ:𝓕.FieldOpφs:List 𝓕.FieldOpih:timeOrder (ofFieldOpList (eraseMaxTimeField φ φs)) = φsΛ, φsΛ.wickTermh1:φ :: φs = (eraseMaxTimeField φ φs).insertIdx (↑(maxTimeFieldPosFin φ φs)) (maxTimeField φ φs)c:WickContraction (eraseMaxTimeField φ φs).lengthx✝:c Finset.univ (k : Fin (eraseMaxTimeField φ φs).length), (maxTimeFieldPosFin φ φs).succAbove k < maxTimeFieldPosFin φ φs ¬timeOrderRel (eraseMaxTimeField φ φs)[k] (maxTimeField φ φs) All goals completed! 🐙 termination_by φs => φs.length