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.FieldSpecification.Basic

Wick contractions

@[expose] public section

Given a natural number n, which will correspond to the number of fields needing contracting, a Wick contraction is a finite set of pairs of Fin n (numbers 0, ..., n-1), such that no element of Fin n occurs in more than one pair. The pairs are the positions of fields we 'contract' together.

def WickContraction (n : ) : Type := {f : Finset ((Finset (Fin n))) // ( a f, a.card = 2) ( a f, b f, a = b Disjoint a b)}

Wick contractions are decidable.

instance : DecidableEq (WickContraction n) := Subtype.instDecidableEq

The contraction consisting of no contracted pairs.

def empty : WickContraction n := , 𝓕:FieldSpecificationn:c:WickContraction n a , a.card = 2 All goals completed! 🐙, 𝓕:FieldSpecificationn:c:WickContraction n a , b , a = b Disjoint a b All goals completed! 🐙
All goals completed! 🐙lemma exists_pair_of_not_eq_empty (c : WickContraction n) (h : c empty) : i j, {i, j} c.1 := n:c:WickContraction nh:c empty i j, {i, j} c n:c:WickContraction nh:c emptya:Finset (Fin n)ha:a c i j, {i, j} c n:c:WickContraction nh:c emptyi:Fin nj:Fin nha:{i, j} c i j, {i, j} c All goals completed! 🐙

The equivalence between WickContraction n and WickContraction m derived from a propositional equality of n and m.

def congr : {n m : } (h : n = m) WickContraction n WickContraction m | n, .(n), rfl => Equiv.refl _
@[simp] lemma congr_refl : c.congr rfl = c := rfl@[simp] lemma card_congr {n m : } (h : n = m) (c : WickContraction n) : (congr h c).1.card = c.1.card := n:m:h:n = mc:WickContraction n(↑((congr h) c)).card = (↑c).card n:c:WickContraction n(↑((congr ) c)).card = (↑c).card All goals completed! 🐙lemma congr_contractions {n m : } (h : n = m) (c : WickContraction n) : ((congr h) c).1 = Finset.map (Finset.mapEmbedding (finCongr h)).toEmbedding c.1 := n:m:h:n = mc:WickContraction n((congr h) c) = Finset.map (Finset.mapEmbedding (finCongr h).toEmbedding).toEmbedding c n:c:WickContraction n((congr ) c) = Finset.map (Finset.mapEmbedding (finCongr ).toEmbedding).toEmbedding c n:c:WickContraction na:Finset (Fin n)a ((congr ) c) a Finset.map (Finset.mapEmbedding (finCongr ).toEmbedding).toEmbedding c n:c:WickContraction na:Finset (Fin n)a c a_1 c, (Finset.mapEmbedding (Function.Embedding.refl (Fin n))) a_1 = a All goals completed! 🐙@[simp] lemma congr_trans {n m o : } (h1 : n = m) (h2 : m = o) : (congr h1).trans (congr h2) = congr (h1.trans h2) := n:m:o:h1:n = mh2:m = o(congr h1).trans (congr h2) = congr n:(congr ).trans (congr ) = congr All goals completed! 🐙@[simp] lemma congr_trans_apply {n m o : } (h1 : n = m) (h2 : m = o) (c : WickContraction n) : (congr h2) ((congr h1) c) = congr (h1.trans h2) c := n:m:o:h1:n = mh2:m = oc:WickContraction n(congr h2) ((congr h1) c) = (congr ) c n:c:WickContraction n(congr ) ((congr ) c) = (congr ) c All goals completed! 🐙lemma mem_congr_iff {n m : } (h : n = m) {c : WickContraction n } {a : Finset (Fin m)} : a (congr h c).1 Finset.map (finCongr h.symm).toEmbedding a c.1 := n:m:h:n = mc:WickContraction na:Finset (Fin m)a ((congr h) c) Finset.map (finCongr ).toEmbedding a c n:c:WickContraction na:Finset (Fin n)a ((congr ) c) Finset.map (finCongr ).toEmbedding a c All goals completed! 🐙

Given a contracted pair in c : WickContraction n the contracted pair in congr h c.

def congrLift {n m : } (h : n = m) {c : WickContraction n} (a : c.1) : (congr h c).1 := a.1.map (finCongr h).toEmbedding, 𝓕:FieldSpecificationn✝:c✝:WickContraction n✝n:m:h:n = mc:WickContraction na:cFinset.map (finCongr h).toEmbedding a ((congr h) c) All goals completed! 🐙
@[simp] lemma congrLift_rfl {n : } {c : WickContraction n} : c.congrLift rfl = id := n:c:WickContraction ncongrLift = id n:c:WickContraction na:ccongrLift a = id a All goals completed! 🐙lemma congrLift_injective {n m : } {c : WickContraction n} (h : n = m) : Function.Injective (c.congrLift h) := n:m:c:WickContraction nh:n = mFunction.Injective (congrLift h) n:c:WickContraction nFunction.Injective (congrLift ) All goals completed! 🐙lemma congrLift_surjective {n m : } {c : WickContraction n} (h : n = m) : Function.Surjective (c.congrLift h) := n:m:c:WickContraction nh:n = mFunction.Surjective (congrLift h) n:c:WickContraction nFunction.Surjective (congrLift ) All goals completed! 🐙lemma congrLift_bijective {n m : } {c : WickContraction n} (h : n = m) : Function.Bijective (c.congrLift h) := c.congrLift_injective h, c.congrLift_surjective h

Given a contracted pair in c : WickContraction n the contracted pair in congr h c.

def congrLiftInv {n m : } (h : n = m) {c : WickContraction n} (a : (congr h c).1) : c.1 := a.1.map (finCongr h.symm).toEmbedding, 𝓕:FieldSpecificationn✝:c✝:WickContraction n✝n:m:h:n = mc:WickContraction na:((congr h) c)Finset.map (finCongr ).toEmbedding a c All goals completed! 🐙
lemma congrLiftInv_rfl {n : } {c : WickContraction n} : c.congrLiftInv rfl = id := n:c:WickContraction ncongrLiftInv = id n:c:WickContraction na:((congr ) c)congrLiftInv a = id a All goals completed! 🐙lemma eq_filter_mem_self : c.1 = Finset.filter (fun x => x c.1) Finset.univ := (Finset.filter_univ_mem c.1).symm

For a contraction c : WickContraction n and i : Fin n the j such that {i, j} is a contracted pair in c. If such an j does not exist, this returns none.

def getDual? (i : Fin n) : Option (Fin n) := Fin.find? (fun j => {i, j} c.1)
lemma getDual?_congr {n m : } (h : n = m) (c : WickContraction n) (i : Fin m) : (congr h c).getDual? i = Option.map (finCongr h) (c.getDual? (finCongr h.symm i)) := n:m:h:n = mc:WickContraction ni:Fin m((congr h) c).getDual? i = Option.map (⇑(finCongr h)) (c.getDual? ((finCongr ) i)) n:c:WickContraction ni:Fin n((congr ) c).getDual? i = Option.map (⇑(finCongr )) (c.getDual? ((finCongr ) i)) All goals completed! 🐙lemma getDual?_congr_get {n m : } (h : n = m) (c : WickContraction n) (i : Fin m) (hg : ((congr h c).getDual? i).isSome) : ((congr h c).getDual? i).get hg = (finCongr h ((c.getDual? (finCongr h.symm i)).get (𝓕:FieldSpecificationn✝:c✝:WickContraction n✝n:m:h:n = mc:WickContraction ni:Fin mhg:(((congr h) c).getDual? i).isSome = true(c.getDual? ((finCongr ) i)).isSome = true All goals completed! 🐙))) := n:m:h:n = mc:WickContraction ni:Fin mhg:(((congr h) c).getDual? i).isSome = true(((congr h) c).getDual? i).get hg = (finCongr h) ((c.getDual? ((finCongr ) i)).get ) All goals completed! 🐙n:c:WickContraction ni:Fin nj:Fin nh:{i, j} ck:Fin nhkj:k < jhk:{i, k} cheq:{i, j} = {i, k}hkm:k = i k = jFalse n:c:WickContraction nj:Fin nk:Fin nhkj:k < jh:{k, j} chk:{k, k} cheq:{k, j} = {k, k}Falsen:c:WickContraction ni:Fin nk:Fin nhk:{i, k} ch:{i, k} chkj:k < kheq:{i, k} = {i, k}False n:c:WickContraction nj:Fin nk:Fin nhkj:k < jh:{k, j} chk:{k, k} cheq:{k, j} = {k, k}False All goals completed! 🐙 n:c:WickContraction ni:Fin nk:Fin nhk:{i, k} ch:{i, k} chkj:k < kheq:{i, k} = {i, k}False All goals completed! 🐙 n:c:WickContraction ni:Fin nj:Fin nh:{i, j} ck:Fin nhkj:k < jhk:{i, k} chdisj:Disjoint {i, j} {i, k}False All goals completed! 🐙c:WickContraction 1i:Fin 1h:¬c.getDual? i = nonea:Fin 1ha:{i, a} cFalse simpa [show a = i c:WickContraction 1i:Fin 1c.getDual? i = none All goals completed! 🐙] using c.2.1 _ haAll goals completed! 🐙All goals completed! 🐙n:c:WickContraction ni:Fin nj:Fin nh:{i, j} c¬i = j n:c:WickContraction ni:Fin nh:{i, i} cFalse All goals completed! 🐙@[simp] lemma self_ne_getDual?_get (i : Fin n) (h : (c.getDual? i).isSome) : ¬ i = (c.getDual? i).get h := c.getDual?_eq_some_neq _ _ (Option.some_get h).symm@[simp] lemma getDual?_get_self_neq (i : Fin n) (h : (c.getDual? i).isSome) : ¬ (c.getDual? i).get h = i := Ne.symm (c.self_ne_getDual?_get i h)n:c:WickContraction ni:Fin nx✝: a, i aa:cx:Fin nhxy:a = {i, x} a, {i, a} c All goals completed! 🐙lemma getDual?_isSome_of_mem (a : c.1) (i : a.1) : (c.getDual? i).isSome := (c.getDual?_isSome_iff i).mpr a, i.2@[simp] lemma getDual?_getDual?_get_get (i : Fin n) (h : (c.getDual? i).isSome) : c.getDual? ((c.getDual? i).get h) = some i := n:c:WickContraction ni:Fin nh:(c.getDual? i).isSome = truec.getDual? ((c.getDual? i).get h) = some i All goals completed! 🐙lemma getDual?_getDual?_get_isSome (i : Fin n) (h : (c.getDual? i).isSome) : (c.getDual? ((c.getDual? i).get h)).isSome := n:c:WickContraction ni:Fin nh:(c.getDual? i).isSome = true(c.getDual? ((c.getDual? i).get h)).isSome = true All goals completed! 🐙lemma getDual?_getDual?_get_not_none (i : Fin n) (h : (c.getDual? i).isSome) : ¬ (c.getDual? ((c.getDual? i).get h)) = none := n:c:WickContraction ni:Fin nh:(c.getDual? i).isSome = true¬c.getDual? ((c.getDual? i).get h) = none All goals completed! 🐙

Extracting parts from a contraction.

The smallest of the two positions in a contracted pair given a Wick contraction.

def fstFieldOfContract (c : WickContraction n) (a : c.1) : Fin n := (a.1.sort (· ·)).head (𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction na:c((↑a).sort fun x1 x2 => x1 x2) [] 𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction na:chx:((↑a).sort fun x1 x2 => x1 x2).length = (↑a).card((↑a).sort fun x1 x2 => x1 x2) [] 𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction na:chx:((↑a).sort fun x1 x2 => x1 x2).length = (↑a).cardhn:((↑a).sort fun x1 x2 => x1 x2) = []False All goals completed! 🐙)
@[simp] lemma fstFieldOfContract_congr {n m : } (h : n = m) (c : WickContraction n) (a : c.1) : (congr h c).fstFieldOfContract (c.congrLift h a) = (finCongr h) (c.fstFieldOfContract a) := n:m:h:n = mc:WickContraction na:c((congr h) c).fstFieldOfContract (congrLift h a) = (finCongr h) (c.fstFieldOfContract a) n:c:WickContraction na:c((congr ) c).fstFieldOfContract (congrLift a) = (finCongr ) (c.fstFieldOfContract a) All goals completed! 🐙

The largest of the two positions in a contracted pair given a Wick contraction.

def sndFieldOfContract (c : WickContraction n) (a : c.1) : Fin n := (a.1.sort (· ·)).tail.head (𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction na:c((↑a).sort fun x1 x2 => x1 x2).tail [] 𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction na:chx:((↑a).sort fun x1 x2 => x1 x2).length = (↑a).card((↑a).sort fun x1 x2 => x1 x2).tail [] 𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction na:chx:((↑a).sort fun x1 x2 => x1 x2).length = (↑a).cardhn:((↑a).sort fun x1 x2 => x1 x2).tail = []False 𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction na:chx:((↑a).sort fun x1 x2 => x1 x2).length = (↑a).cardhn✝:((↑a).sort fun x1 x2 => x1 x2).tail = []hn:((↑a).sort fun x1 x2 => x1 x2).tail.length = [].lengthFalse All goals completed! 🐙)
@[simp] lemma sndFieldOfContract_congr {n m : } (h : n = m) (c : WickContraction n) (a : c.1) : (congr h c).sndFieldOfContract (c.congrLift h a) = (finCongr h) (c.sndFieldOfContract a) := n:m:h:n = mc:WickContraction na:c((congr h) c).sndFieldOfContract (congrLift h a) = (finCongr h) (c.sndFieldOfContract a) n:c:WickContraction na:c((congr ) c).sndFieldOfContract (congrLift a) = (finCongr ) (c.sndFieldOfContract a) All goals completed! 🐙n:c:WickContraction na:cx:Fin ny:Fin nhxy:x < yha:a = {x, y}h1: b {y}, x bhs:((↑a).sort fun x1 x2 => x1 x2) = [x, y]{x, y} = {c.fstFieldOfContract a, c.sndFieldOfContract a} All goals completed! 🐙lemma fstFieldOfContract_ne_sndFieldOfContract (c : WickContraction n) (a : c.1) : c.fstFieldOfContract a c.sndFieldOfContract a := n:c:WickContraction na:cc.fstFieldOfContract a c.sndFieldOfContract a n:c:WickContraction na:chn:c.fstFieldOfContract a = c.sndFieldOfContract aFalse All goals completed! 🐙lemma fstFieldOfContract_le_sndFieldOfContract (c : WickContraction n) (a : c.1) : c.fstFieldOfContract a c.sndFieldOfContract a := (Finset.pairwise_sort ..).rel_head_tail (List.head_mem _)lemma fstFieldOfContract_lt_sndFieldOfContract (c : WickContraction n) (a : c.1) : c.fstFieldOfContract a < c.sndFieldOfContract a := lt_of_le_of_ne (c.fstFieldOfContract_le_sndFieldOfContract a) (c.fstFieldOfContract_ne_sndFieldOfContract a)@[simp] lemma fstFieldOfContract_mem (c : WickContraction n) (a : c.1) : c.fstFieldOfContract a a.1 := n:c:WickContraction na:cc.fstFieldOfContract a a All goals completed! 🐙lemma fstFieldOfContract_getDual?_isSome (c : WickContraction n) (a : c.1) : (c.getDual? (c.fstFieldOfContract a)).isSome := (c.getDual?_isSome_iff _).mpr a, fstFieldOfContract_mem c a@[simp] lemma fstFieldOfContract_getDual? (c : WickContraction n) (a : c.1) : c.getDual? (c.fstFieldOfContract a) = some (c.sndFieldOfContract a) := n:c:WickContraction na:cc.getDual? (c.fstFieldOfContract a) = some (c.sndFieldOfContract a) All goals completed! 🐙@[simp] lemma sndFieldOfContract_mem (c : WickContraction n) (a : c.1) : c.sndFieldOfContract a a.1 := n:c:WickContraction na:cc.sndFieldOfContract a a All goals completed! 🐙lemma sndFieldOfContract_getDual?_isSome (c : WickContraction n) (a : c.1) : (c.getDual? (c.sndFieldOfContract a)).isSome := (c.getDual?_isSome_iff _).mpr a, sndFieldOfContract_mem c an:c:WickContraction na:ca c All goals completed! 🐙n:c:WickContraction na:ci:Fin nj:Fin nhi:i {c.fstFieldOfContract a, c.sndFieldOfContract a}hj:j {c.fstFieldOfContract a, c.sndFieldOfContract a}hij:i < jhlt:c.fstFieldOfContract a < c.sndFieldOfContract ac.fstFieldOfContract a = i n:c:WickContraction na:ci:Fin nj:Fin nhij:i < jhlt:c.fstFieldOfContract a < c.sndFieldOfContract ahi:i = c.fstFieldOfContract a i = c.sndFieldOfContract ahj:j = c.fstFieldOfContract a j = c.sndFieldOfContract ac.fstFieldOfContract a = i n:c:WickContraction na:cj:Fin nhlt:c.fstFieldOfContract a < c.sndFieldOfContract ahj:j = c.fstFieldOfContract a j = c.sndFieldOfContract ahij:c.fstFieldOfContract a < jc.fstFieldOfContract a = c.fstFieldOfContract an:c:WickContraction na:cj:Fin nhlt:c.fstFieldOfContract a < c.sndFieldOfContract ahj:j = c.fstFieldOfContract a j = c.sndFieldOfContract ahij:c.sndFieldOfContract a < jc.fstFieldOfContract a = c.sndFieldOfContract a n:c:WickContraction na:cj:Fin nhlt:c.fstFieldOfContract a < c.sndFieldOfContract ahj:j = c.fstFieldOfContract a j = c.sndFieldOfContract ahij:c.fstFieldOfContract a < jc.fstFieldOfContract a = c.fstFieldOfContract an:c:WickContraction na:cj:Fin nhlt:c.fstFieldOfContract a < c.sndFieldOfContract ahj:j = c.fstFieldOfContract a j = c.sndFieldOfContract ahij:c.sndFieldOfContract a < jc.fstFieldOfContract a = c.sndFieldOfContract a n:c:WickContraction na:chlt:c.fstFieldOfContract a < c.sndFieldOfContract ahij:c.sndFieldOfContract a < c.fstFieldOfContract ac.fstFieldOfContract a = c.sndFieldOfContract an:c:WickContraction na:chlt:c.fstFieldOfContract a < c.sndFieldOfContract ahij:c.sndFieldOfContract a < c.sndFieldOfContract ac.fstFieldOfContract a = c.sndFieldOfContract a n:c:WickContraction na:chlt:c.fstFieldOfContract a < c.sndFieldOfContract ahij:c.fstFieldOfContract a < c.fstFieldOfContract ac.fstFieldOfContract a = c.fstFieldOfContract an:c:WickContraction na:chlt:c.fstFieldOfContract a < c.sndFieldOfContract ahij:c.fstFieldOfContract a < c.sndFieldOfContract ac.fstFieldOfContract a = c.fstFieldOfContract an:c:WickContraction na:chlt:c.fstFieldOfContract a < c.sndFieldOfContract ahij:c.sndFieldOfContract a < c.fstFieldOfContract ac.fstFieldOfContract a = c.sndFieldOfContract an:c:WickContraction na:chlt:c.fstFieldOfContract a < c.sndFieldOfContract ahij:c.sndFieldOfContract a < c.sndFieldOfContract ac.fstFieldOfContract a = c.sndFieldOfContract a All goals completed! 🐙n:c:WickContraction na:ci:Fin nj:Fin nhi:i {c.fstFieldOfContract a, c.sndFieldOfContract a}hj:j {c.fstFieldOfContract a, c.sndFieldOfContract a}hij:i < jhlt:c.fstFieldOfContract a < c.sndFieldOfContract ac.sndFieldOfContract a = j n:c:WickContraction na:ci:Fin nj:Fin nhij:i < jhlt:c.fstFieldOfContract a < c.sndFieldOfContract ahi:i = c.fstFieldOfContract a i = c.sndFieldOfContract ahj:j = c.fstFieldOfContract a j = c.sndFieldOfContract ac.sndFieldOfContract a = j n:c:WickContraction na:cj:Fin nhlt:c.fstFieldOfContract a < c.sndFieldOfContract ahj:j = c.fstFieldOfContract a j = c.sndFieldOfContract ahij:c.fstFieldOfContract a < jc.sndFieldOfContract a = jn:c:WickContraction na:cj:Fin nhlt:c.fstFieldOfContract a < c.sndFieldOfContract ahj:j = c.fstFieldOfContract a j = c.sndFieldOfContract ahij:c.sndFieldOfContract a < jc.sndFieldOfContract a = j n:c:WickContraction na:cj:Fin nhlt:c.fstFieldOfContract a < c.sndFieldOfContract ahj:j = c.fstFieldOfContract a j = c.sndFieldOfContract ahij:c.fstFieldOfContract a < jc.sndFieldOfContract a = jn:c:WickContraction na:cj:Fin nhlt:c.fstFieldOfContract a < c.sndFieldOfContract ahj:j = c.fstFieldOfContract a j = c.sndFieldOfContract ahij:c.sndFieldOfContract a < jc.sndFieldOfContract a = j n:c:WickContraction na:chlt:c.fstFieldOfContract a < c.sndFieldOfContract ahij:c.sndFieldOfContract a < c.fstFieldOfContract ac.sndFieldOfContract a = c.fstFieldOfContract an:c:WickContraction na:chlt:c.fstFieldOfContract a < c.sndFieldOfContract ahij:c.sndFieldOfContract a < c.sndFieldOfContract ac.sndFieldOfContract a = c.sndFieldOfContract a n:c:WickContraction na:chlt:c.fstFieldOfContract a < c.sndFieldOfContract ahij:c.fstFieldOfContract a < c.fstFieldOfContract ac.sndFieldOfContract a = c.fstFieldOfContract an:c:WickContraction na:chlt:c.fstFieldOfContract a < c.sndFieldOfContract ahij:c.fstFieldOfContract a < c.sndFieldOfContract ac.sndFieldOfContract a = c.sndFieldOfContract an:c:WickContraction na:chlt:c.fstFieldOfContract a < c.sndFieldOfContract ahij:c.sndFieldOfContract a < c.fstFieldOfContract ac.sndFieldOfContract a = c.fstFieldOfContract an:c:WickContraction na:chlt:c.fstFieldOfContract a < c.sndFieldOfContract ahij:c.sndFieldOfContract a < c.sndFieldOfContract ac.sndFieldOfContract a = c.sndFieldOfContract a All goals completed! 🐙

As a type, any pair of contractions is equivalent to Fin 2 with 0 being associated with c.fstFieldOfContract a and 1 being associated with c.sndFieldOfContract.

𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction na:ci:aha:a = {c.fstFieldOfContract a, c.sndFieldOfContract a}hi:i = c.sndFieldOfContract a(match 1 with | 0 => c.fstFieldOfContract a, | 1 => c.sndFieldOfContract a, ) = i𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction na:ci:aha:a = {c.fstFieldOfContract a, c.sndFieldOfContract a}hi:i = c.sndFieldOfContract a¬c.sndFieldOfContract a = c.fstFieldOfContract a 𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction na:ci:aha:a = {c.fstFieldOfContract a, c.sndFieldOfContract a}hi:i = c.sndFieldOfContract a(match 1 with | 0 => c.fstFieldOfContract a, | 1 => c.sndFieldOfContract a, ) = i All goals completed! 🐙 𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction na:ci:aha:a = {c.fstFieldOfContract a, c.sndFieldOfContract a}hi:i = c.sndFieldOfContract a¬c.sndFieldOfContract a = c.fstFieldOfContract a All goals completed! 🐙 right_inv i := 𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction na:ci:Fin 2(fun i => if i = c.fstFieldOfContract a then 0 else 1) ((fun i => match i with | 0 => c.fstFieldOfContract a, | 1 => c.sndFieldOfContract a, ) i) = i 𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction na:c(fun i => if i = c.fstFieldOfContract a then 0 else 1) ((fun i => match i with | 0 => c.fstFieldOfContract a, | 1 => c.sndFieldOfContract a, ) ((fun i => i) 0, )) = (fun i => i) 0, 𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction na:c(fun i => if i = c.fstFieldOfContract a then 0 else 1) ((fun i => match i with | 0 => c.fstFieldOfContract a, | 1 => c.sndFieldOfContract a, ) ((fun i => i) 1, )) = (fun i => i) 1, 𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction na:c(fun i => if i = c.fstFieldOfContract a then 0 else 1) ((fun i => match i with | 0 => c.fstFieldOfContract a, | 1 => c.sndFieldOfContract a, ) ((fun i => i) 0, )) = (fun i => i) 0, All goals completed! 🐙 𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction na:c(fun i => if i = c.fstFieldOfContract a then 0 else 1) ((fun i => match i with | 0 => c.fstFieldOfContract a, | 1 => c.sndFieldOfContract a, ) ((fun i => i) 1, )) = (fun i => i) 1, 𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction na:c¬c.sndFieldOfContract a = c.fstFieldOfContract a All goals completed! 🐙
n:M:Type u_1c:WickContraction na:cf:a Minst✝:CommMonoid M i, f ((c.contractEquivFinTwo a).symm i) = f c.fstFieldOfContract a, * f c.sndFieldOfContract a, All goals completed! 🐙

For a field specification 𝓕, φs a list of 𝓕.FieldOp and a Wick contraction φsΛ of φs, the Wick contraction φsΛ is said to be GradingCompliant if for every pair in φsΛ the contracted fields are either both fermionic or both bosonic. In other words, in a GradingCompliant Wick contraction if no contracted pairs occur between fermionic and bosonic fields.

def GradingCompliant (φs : List 𝓕.FieldOp) (φsΛ : WickContraction φs.length) := (a : φsΛ.1), (𝓕 |>ₛ φs[(φsΛ.fstFieldOfContract a).1]) = (𝓕 |>ₛ φs[(φsΛ.sndFieldOfContract a).1])
lemma gradingCompliant_congr {φs φs' : List 𝓕.FieldOp} (h : φs = φs') (φsΛ : WickContraction φs.length) : GradingCompliant φs φsΛ GradingCompliant φs' (congr (𝓕:FieldSpecificationn:c:WickContraction nφs:List 𝓕.FieldOpφs':List 𝓕.FieldOph:φs = φs'φsΛ:WickContraction φs.lengthφs.length = φs'.length All goals completed! 🐙) φsΛ) := 𝓕:FieldSpecificationφs:List 𝓕.FieldOpφs':List 𝓕.FieldOph:φs = φs'φsΛ:WickContraction φs.lengthGradingCompliant φs φsΛ GradingCompliant φs' ((congr ) φsΛ) 𝓕:FieldSpecificationφs:List 𝓕.FieldOpφsΛ:WickContraction φs.lengthGradingCompliant φs φsΛ GradingCompliant φs ((congr ) φsΛ) All goals completed! 🐙

An equivalence from the sigma type (a : c.1) × a to the subtype of Fin n consisting of those positions which are contracted.

𝓕:FieldSpecificationn:c:WickContraction nx:(a : c) × ahxa: (x1 x2 : (a : c) × a), x1.fst = x2.fst x1.snd = x2.snd x1 = x2a:ci:ahc:a = {i, (c.getDual? i).get } Disjoint a {i, (c.getDual? i).get }hn:¬Disjoint a {i, (c.getDual? i).get }((fun x => {x, (c.getDual? x).get }, , x, ) ((fun x => x.snd, ) a, i)).fst = a, i.fst 𝓕:FieldSpecificationn:c:WickContraction nx:(a : c) × ahxa: (x1 x2 : (a : c) × a), x1.fst = x2.fst x1.snd = x2.snd x1 = x2a:ci:ahc:a = {i, (c.getDual? i).get }{i, (c.getDual? i).get }, = a All goals completed! 🐙 𝓕:FieldSpecificationn:c:WickContraction nx:(a : c) × ahxa: (x1 x2 : (a : c) × a), x1.fst = x2.fst x1.snd = x2.snd x1 = x2a:ci:a((fun x => {x, (c.getDual? x).get }, , x, ) ((fun x => x.snd, ) a, i)).snd = a, i.snd All goals completed! 🐙 right_inv := 𝓕:FieldSpecificationn:c:WickContraction nFunction.RightInverse (fun x => {x, (c.getDual? x).get }, , x, ) fun x => x.snd, 𝓕:FieldSpecificationn:c:WickContraction nx:{ x // (c.getDual? x).isSome = true }(fun x => x.snd, ) ((fun x => {x, (c.getDual? x).get }, , x, ) x) = x 𝓕:FieldSpecificationn:c:WickContraction nval✝:Fin nproperty✝:(c.getDual? val✝).isSome = true(fun x => x.snd, ) ((fun x => {x, (c.getDual? x).get }, , x, ) val✝, property✝) = val✝, property✝ All goals completed! 🐙