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

Uncontracted elements

@[expose] public section

For a Wick contraction c, c.uncontracted is defined as the finset of elements of Fin n which are not in any contracted pair.

def uncontracted : Finset (Fin n) := Finset.filter (fun i => c.getDual? i = none) (Finset.univ)
lemma congr_uncontracted {n m : } (c : WickContraction n) (h : n = m) : (c.congr h).uncontracted = Finset.map (finCongr h).toEmbedding c.uncontracted := n:m:c:WickContraction nh:n = m((congr h) c).uncontracted = Finset.map (finCongr h).toEmbedding c.uncontracted n:c:WickContraction n((congr ) c).uncontracted = Finset.map (finCongr ).toEmbedding c.uncontracted All goals completed! 🐙lemma getDual?_eq_none_iff_mem_uncontracted (i : Fin n) : c.getDual? i = none i c.uncontracted := n:c:WickContraction ni:Fin nc.getDual? i = none i c.uncontracted All goals completed! 🐙

The equivalence of Option c.uncontracted for two propositionally equal Wick contractions.

𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction nc':WickContraction nh:c = c' (x : Fin n), x c'.uncontracted x c'.uncontracted; All goals completed! 🐙))
@[simp] lemma uncontractedCongr_none {c c': WickContraction n} (h : c = c') : (uncontractedCongr h) none = none := n:c:WickContraction nc':WickContraction nh:c = c'(uncontractedCongr h) none = none All goals completed! 🐙𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction nc':WickContraction nh:c = c'i:c.uncontracted (x : Fin n), x c'.uncontracted x c'.uncontracted; All goals completed! 🐙) i) := n:c:WickContraction nc':WickContraction nh:c = c'i:c.uncontracted(uncontractedCongr h) (some i) = some ((Equiv.subtypeEquivRight ) i) All goals completed! 🐙n:c:WickContraction ni:Fin nh: p c, i p (i_1 : Fin n), decide ({i, i_1} c) = false n:c:WickContraction ni:Fin nh: p c, i phn:¬ (i_1 : Fin n), decide ({i, i_1} c) = falseFalse n:c:WickContraction ni:Fin nh: p c, i phn: x, {i, x} cFalse n:c:WickContraction ni:Fin nh: p c, i pj:Fin nhj:{i, j} cFalse n:c:WickContraction ni:Fin nh: p c, i pj:Fin nhj:{i, j} ci {i, j} All goals completed! 🐙n:i:Fin n p empty, i p n:i:Fin np:Finset (Fin n)hp:p emptyi p All goals completed! 🐙@[simp] lemma getDual?_empty_eq_none (i : Fin n) : empty.getDual? i = none := n:i:Fin nempty.getDual? i = none All goals completed! 🐙@[simp] lemma uncontracted_empty {n : } : (@empty n).uncontracted = Finset.univ := n:empty.uncontracted = Finset.univ All goals completed! 🐙lemma uncontracted_card_le (c : WickContraction n) : c.uncontracted.card n := n:c:WickContraction nc.uncontracted.card n n:c:WickContraction n{i | c.getDual? i = none}.card n n:c:WickContraction nFinset.univ.card = n All goals completed! 🐙n:c:WickContraction nh:c.uncontracted.card = nhc: x Finset.univ, c.getDual? x = nonehn:¬c = emptyi:Fin nj:Fin nhij:{i, j} chci:c.getDual? i = some jFalse All goals completed! 🐙 n:c:WickContraction nc = empty c.uncontracted.card = n n:c:WickContraction nh:c = emptyc.uncontracted.card = n n:empty.uncontracted.card = n All goals completed! 🐙