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.WickContraction.Uncontracted public import Physlib.Mathematics.Fin

Erasing an element from a contraction

@[expose] public section

Given a Wick contraction WickContraction n.succ and a i : Fin n.succ the Wick contraction associated with n obtained by removing i. If i is contracted with j in the new Wick contraction j will be uncontracted.

𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction n.succi:Fin n.succa:Finset (Fin n)b:Finset (Fin n)ha:Finset.map i.succAboveEmb a chb:Finset.map i.succAboveEmb b cFinset.map i.succAboveEmb a = Finset.map i.succAboveEmb b Disjoint (Finset.map i.succAboveEmb a) (Finset.map i.succAboveEmb b) All goals completed! 🐙
n:c:WickContraction n.succi:Fin n.succj:Fin nk:Fin nh:{i.succAbove j, i} chn:¬decide ({i.succAbove j, i.succAbove k} c) = falsehc:{i.succAbove j, i} = {i.succAbove j, i.succAbove k}hi:i {i.succAbove j, i.succAbove k}False n:c:WickContraction n.succi:Fin n.succj:Fin nk:Fin nh:{i.succAbove j, i} chn:¬decide ({i.succAbove j, i.succAbove k} c) = falsehc:{i.succAbove j, i} = {i.succAbove j, i.succAbove k}hi:i = i.succAbove j i = i.succAbove kFalse n:c:WickContraction n.succi:Fin n.succj:Fin nk:Fin nh:{i.succAbove j, i} chn:¬decide ({i.succAbove j, i.succAbove k} c) = falsehc:{i.succAbove j, i} = {i.succAbove j, i.succAbove k}hi:i = i.succAbove jFalsen:c:WickContraction n.succi:Fin n.succj:Fin nk:Fin nh:{i.succAbove j, i} chn:¬decide ({i.succAbove j, i.succAbove k} c) = falsehc:{i.succAbove j, i} = {i.succAbove j, i.succAbove k}hi:i = i.succAbove kFalse n:c:WickContraction n.succi:Fin n.succj:Fin nk:Fin nh:{i.succAbove j, i} chn:¬decide ({i.succAbove j, i.succAbove k} c) = falsehc:{i.succAbove j, i} = {i.succAbove j, i.succAbove k}hi:i = i.succAbove jFalse All goals completed! 🐙 n:c:WickContraction n.succi:Fin n.succj:Fin nk:Fin nh:{i.succAbove j, i} chn:¬decide ({i.succAbove j, i.succAbove k} c) = falsehc:{i.succAbove j, i} = {i.succAbove j, i.succAbove k}hi:i = i.succAbove kFalse All goals completed! 🐙n:c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isSome = truex:Fin n.succy:Fin n.succhx:x yha:{x, y} cha2:{x, y} {i, (c.getDual? i).get h}hxn:¬x = ihyn:¬y = i a' (c.erase i), {x, y} = Finset.map i.succAboveEmb a' n:c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isSome = truex:Fin n.succy:Fin n.succhx:x yha:{x, y} cha2:{x, y} {i, (c.getDual? i).get h}hxn: z, i.succAbove z = xhyn: z, i.succAbove z = y a' (c.erase i), {x, y} = Finset.map i.succAboveEmb a' n:c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isSome = truex:Fin n.succy:Fin n.succhx:x yha:{x, y} cha2:{x, y} {i, (c.getDual? i).get h}hyn: z, i.succAbove z = yx':Fin nhx':i.succAbove x' = x a' (c.erase i), {x, y} = Finset.map i.succAboveEmb a' n:c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isSome = truex:Fin n.succy:Fin n.succhx:x yha:{x, y} cha2:{x, y} {i, (c.getDual? i).get h}x':Fin nhx':i.succAbove x' = xy':Fin nhy':i.succAbove y' = y a' (c.erase i), {x, y} = Finset.map i.succAboveEmb a' n:c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isSome = truex:Fin n.succy:Fin n.succhx:x yha:{x, y} cha2:{x, y} {i, (c.getDual? i).get h}x':Fin nhx':i.succAbove x' = xy':Fin nhy':i.succAbove y' = y{x', y'} (c.erase i) {x, y} = Finset.map i.succAboveEmb {x', y'} n:c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isSome = truex':Fin ny':Fin nhx:i.succAbove x' i.succAbove y'ha:{i.succAbove x', i.succAbove y'} cha2:{i.succAbove x', i.succAbove y'} {i, (c.getDual? i).get h}{x', y'} (c.erase i) {i.succAbove x', i.succAbove y'} = Finset.map i.succAboveEmb {x', y'} n:c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isSome = truex':Fin ny':Fin nhx:i.succAbove x' i.succAbove y'ha:{i.succAbove x', i.succAbove y'} cha2:{i.succAbove x', i.succAbove y'} {i, (c.getDual? i).get h}{i.succAbove x', i.succAbove y'} c All goals completed! 🐙n:c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isNone = truex:Fin n.succy:Fin n.succhx:x yha:{x, y} chi: p c, i phxn:¬x = ihyn:¬y = i a' (c.erase i), {x, y} = Finset.map i.succAboveEmb a' n:c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isNone = truex:Fin n.succy:Fin n.succhx:x yha:{x, y} chi: p c, i phxn: z, i.succAbove z = xhyn: z, i.succAbove z = y a' (c.erase i), {x, y} = Finset.map i.succAboveEmb a' n:c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isNone = truex:Fin n.succy:Fin n.succhx:x yha:{x, y} chi: p c, i phyn: z, i.succAbove z = yx':Fin nhx':i.succAbove x' = x a' (c.erase i), {x, y} = Finset.map i.succAboveEmb a' n:c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isNone = truex:Fin n.succy:Fin n.succhx:x yha:{x, y} chi: p c, i px':Fin nhx':i.succAbove x' = xy':Fin nhy':i.succAbove y' = y a' (c.erase i), {x, y} = Finset.map i.succAboveEmb a' n:c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isNone = truex:Fin n.succy:Fin n.succhx:x yha:{x, y} chi: p c, i px':Fin nhx':i.succAbove x' = xy':Fin nhy':i.succAbove y' = y{x', y'} (c.erase i) {x, y} = Finset.map i.succAboveEmb {x', y'} n:c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isNone = truehi: p c, i px':Fin ny':Fin nhx:i.succAbove x' i.succAbove y'ha:{i.succAbove x', i.succAbove y'} c{x', y'} (c.erase i) {i.succAbove x', i.succAbove y'} = Finset.map i.succAboveEmb {x', y'} n:c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isNone = truehi: p c, i px':Fin ny':Fin nhx:i.succAbove x' i.succAbove y'ha:{i.succAbove x', i.succAbove y'} c{i.succAbove x', i.succAbove y'} c All goals completed! 🐙

Given a Wick contraction c : WickContraction n.succ and a i : Fin n.succ the (optional) element of (erase c i).uncontracted which comes from the element in c contracted with i.

𝓕:FieldSpecificationn✝¹:c✝:WickContraction n✝n✝:n:c:WickContraction n.succ.succi:Fin n.succ.succhj:(c.getDual? i).isSome = true{(c.getDual? i).get hj, i} c𝓕:FieldSpecificationn✝¹:c✝:WickContraction n✝n✝:n:c:WickContraction n.succ.succi:Fin n.succ.succhj:(c.getDual? i).isSome = truei (c.getDual? i).get hj 𝓕:FieldSpecificationn✝¹:c✝:WickContraction n✝n✝:n:c:WickContraction n.succ.succi:Fin n.succ.succhj:(c.getDual? i).isSome = true{(c.getDual? i).get hj, i} c All goals completed! 🐙 𝓕:FieldSpecificationn✝¹:c✝:WickContraction n✝n✝:n:c:WickContraction n.succ.succi:Fin n.succ.succhj:(c.getDual? i).isSome = truei (c.getDual? i).get hj 𝓕:FieldSpecificationn✝¹:c✝:WickContraction n✝n✝:n:c:WickContraction n.succ.succi:Fin n.succ.succhj:(c.getDual? i).isSome = truec.getDual? i = some ((c.getDual? i).get hj) All goals completed! 🐙
@[simp] lemma getDualErase_isSome_iff_getDual?_isSome (c : WickContraction n.succ) (i : Fin n.succ) : (c.getDualErase i).isSome (c.getDual? i).isSome := n:c:WickContraction n.succi:Fin n.succ(c.getDualErase i).isSome = true (c.getDual? i).isSome = true match n with n:c:WickContraction (Nat.succ 0)i:Fin (Nat.succ 0)(c.getDualErase i).isSome = true (c.getDual? i).isSome = true n:c:WickContraction (Nat.succ 0)(c.getDualErase ((fun i => i) 0, )).isSome = true (c.getDual? ((fun i => i) 0, )).isSome = true All goals completed! 🐙 n✝:n:c:WickContraction n.succ.succi:Fin n.succ.succ(c.getDualErase i).isSome = true (c.getDual? i).isSome = true All goals completed! 🐙@[simp] lemma getDualErase_one (c : WickContraction 1) (i : Fin 1) : c.getDualErase i = none := c:WickContraction 1i:Fin 1c.getDualErase i = none c:WickContraction 1c.getDualErase ((fun i => i) 0, ) = none All goals completed! 🐙