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 n⊢ c.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) = false⊢ False n:ℕc:WickContraction ni:Fin nh:∀ p ∈ ↑c, i ∉ phn:∃ x, {i, x} ∈ ↑c⊢ False n:ℕc:WickContraction ni:Fin nh:∀ p ∈ ↑c, i ∉ pj:Fin nhj:{i, j} ∈ ↑c⊢ False n:ℕc:WickContraction ni:Fin nh:∀ p ∈ ↑c, i ∉ pj:Fin nhj:{i, j} ∈ ↑c⊢ i ∈ {i, j} All goals completed! 🐙n:ℕi:Fin n⊢ ∀ p ∈ ↑empty, i ∉ p n:ℕi:Fin np:Finset (Fin n)hp:p ∈ ↑empty⊢ i ∉ p All goals completed! 🐙@[simp] lemma getDual?_empty_eq_none (i : Fin n) : empty.getDual? i = none := n:ℕi:Fin n⊢ empty.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 n⊢ c.uncontracted.card ≤ n n:ℕc:WickContraction n⊢ {i | c.getDual? i = none}.card ≤ n n:ℕc:WickContraction n⊢ Finset.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 j⊢ False All goals completed! 🐙 n:ℕc:WickContraction n⊢ c = empty → c.uncontracted.card = n n:ℕc:WickContraction nh:c = empty⊢ c.uncontracted.card = n n:ℕ⊢ empty.uncontracted.card = n All goals completed! 🐙