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.BasicUncontracted 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; simp All goals completed! 🐙))@[simp]
lemma uncontractedCongr_none {c c': WickContraction n} (h : c = c') :
(uncontractedCongr h) none = none := by n:ℕc:WickContraction nc':WickContraction nh:c = c'⊢ (uncontractedCongr h) none = none
simp [uncontractedCongr] All goals completed! 🐙
@[simp]
lemma uncontractedCongr_some {c c': WickContraction n} (h : c = c') (i : c.uncontracted) :
(uncontractedCongr h) (some i) = some (Equiv.subtypeEquivRight (by 𝓕:FieldSpecificationn:ℕc✝:WickContraction nc:WickContraction nc':WickContraction nh:c = c'i:↥c.uncontracted⊢ ∀ (x : Fin n), x ∈ c.uncontracted ↔ x ∈ c'.uncontracted rw [h 𝓕:FieldSpecificationn:ℕc✝:WickContraction nc:WickContraction nc':WickContraction nh:c = c'i:↥c.uncontracted⊢ ∀ (x : Fin n), x ∈ c'.uncontracted ↔ x ∈ c'.uncontracted 𝓕:FieldSpecificationn:ℕc✝:WickContraction nc:WickContraction nc':WickContraction nh:c = c'i:↥c.uncontracted⊢ ∀ (x : Fin n), x ∈ c'.uncontracted ↔ x ∈ c'.uncontracted] 𝓕:FieldSpecificationn:ℕc✝:WickContraction nc:WickContraction nc':WickContraction nh:c = c'i:↥c.uncontracted⊢ ∀ (x : Fin n), x ∈ c'.uncontracted ↔ x ∈ c'.uncontracted; simp All goals completed! 🐙) i) := by n:ℕc:WickContraction nc':WickContraction nh:c = c'i:↥c.uncontracted⊢ (uncontractedCongr h) (some i) = some ((Equiv.subtypeEquivRight ⋯) i)
simp [uncontractedCongr] All goals completed! 🐙
lemma mem_uncontracted_iff_not_contracted (i : Fin n) :
i ∈ c.uncontracted ↔ ∀ p ∈ c.1, i ∉ p := by n:ℕc:WickContraction ni:Fin n⊢ i ∈ c.uncontracted ↔ ∀ p ∈ ↑c, i ∉ p
simp only [uncontracted, getDual?, Finset.mem_filter, Finset.mem_univ, true_and] n:ℕc:WickContraction ni:Fin n⊢ (Fin.find? fun j => decide ({i, j} ∈ ↑c)) = none ↔ ∀ p ∈ ↑c, i ∉ p
apply Iff.intro mp n:ℕc:WickContraction ni:Fin n⊢ (Fin.find? fun j => decide ({i, j} ∈ ↑c)) = none → ∀ p ∈ ↑c, i ∉ pmpr n:ℕc:WickContraction ni:Fin n⊢ (∀ p ∈ ↑c, i ∉ p) → (Fin.find? fun j => decide ({i, j} ∈ ↑c)) = none
· mp n:ℕc:WickContraction ni:Fin n⊢ (Fin.find? fun j => decide ({i, j} ∈ ↑c)) = none → ∀ p ∈ ↑c, i ∉ p intro h p hp mp n:ℕc:WickContraction ni:Fin nh:(Fin.find? fun j => decide ({i, j} ∈ ↑c)) = nonep:Finset (Fin n)hp:p ∈ ↑c⊢ i ∉ p
have hp := c.2.1 p hp mp n:ℕc:WickContraction ni:Fin nh:(Fin.find? fun j => decide ({i, j} ∈ ↑c)) = nonep:Finset (Fin n)hp✝:p ∈ ↑chp:p.card = 2⊢ i ∉ p
rw [Finset.card_eq_two mp n:ℕc:WickContraction ni:Fin nh:(Fin.find? fun j => decide ({i, j} ∈ ↑c)) = nonep:Finset (Fin n)hp✝:p ∈ ↑chp:∃ x y, x ≠ y ∧ p = {x, y}⊢ i ∉ p mp n:ℕc:WickContraction ni:Fin nh:(Fin.find? fun j => decide ({i, j} ∈ ↑c)) = nonep:Finset (Fin n)hp✝:p ∈ ↑chp:∃ x y, x ≠ y ∧ p = {x, y}⊢ i ∉ p] at hp mp n:ℕc:WickContraction ni:Fin nh:(Fin.find? fun j => decide ({i, j} ∈ ↑c)) = nonep:Finset (Fin n)hp✝:p ∈ ↑chp:∃ x y, x ≠ y ∧ p = {x, y}⊢ i ∉ p
obtain ⟨a, b, ha, hb, hab⟩ := hp mp n:ℕc:WickContraction ni:Fin nh:(Fin.find? fun j => decide ({i, j} ∈ ↑c)) = nonea:Fin nb:Fin nha:a ≠ bhp:{a, b} ∈ ↑c⊢ i ∉ {a, b}
rw [Fin.find?_eq_none_iff mp n:ℕc:WickContraction ni:Fin nh:∀ (i_1 : Fin n), decide ({i, i_1} ∈ ↑c) = falsea:Fin nb:Fin nha:a ≠ bhp:{a, b} ∈ ↑c⊢ i ∉ {a, b} mp n:ℕc:WickContraction ni:Fin nh:∀ (i_1 : Fin n), decide ({i, i_1} ∈ ↑c) = falsea:Fin nb:Fin nha:a ≠ bhp:{a, b} ∈ ↑c⊢ i ∉ {a, b}] at hmp n:ℕc:WickContraction ni:Fin nh:∀ (i_1 : Fin n), decide ({i, i_1} ∈ ↑c) = falsea:Fin nb:Fin nha:a ≠ bhp:{a, b} ∈ ↑c⊢ i ∉ {a, b}
by_contra hn mp n:ℕc:WickContraction ni:Fin nh:∀ (i_1 : Fin n), decide ({i, i_1} ∈ ↑c) = falsea:Fin nb:Fin nha:a ≠ bhp:{a, b} ∈ ↑chn:i ∈ {a, b}⊢ False
simp only [Finset.mem_insert, Finset.mem_singleton] at hn mp n:ℕc:WickContraction ni:Fin nh:∀ (i_1 : Fin n), decide ({i, i_1} ∈ ↑c) = falsea:Fin nb:Fin nha:a ≠ bhp:{a, b} ∈ ↑chn:i = a ∨ i = b⊢ False
rcases hn with hn | hn mp.inl n:ℕc:WickContraction ni:Fin nh:∀ (i_1 : Fin n), decide ({i, i_1} ∈ ↑c) = falsea:Fin nb:Fin nha:a ≠ bhp:{a, b} ∈ ↑chn:i = a⊢ Falsemp.inr n:ℕc:WickContraction ni:Fin nh:∀ (i_1 : Fin n), decide ({i, i_1} ∈ ↑c) = falsea:Fin nb:Fin nha:a ≠ bhp:{a, b} ∈ ↑chn:i = b⊢ False
· mp.inl n:ℕc:WickContraction ni:Fin nh:∀ (i_1 : Fin n), decide ({i, i_1} ∈ ↑c) = falsea:Fin nb:Fin nha:a ≠ bhp:{a, b} ∈ ↑chn:i = a⊢ False subst hn mp.inl n:ℕc:WickContraction ni:Fin nh:∀ (i_1 : Fin n), decide ({i, i_1} ∈ ↑c) = falseb:Fin nha:i ≠ bhp:{i, b} ∈ ↑c⊢ False
simp at h mp.inl n:ℕc:WickContraction ni:Fin nb:Fin nha:i ≠ bhp:{i, b} ∈ ↑ch:∀ (i_1 : Fin n), {i, i_1} ∉ ↑c⊢ False
exact h b hp All goals completed! 🐙
· mp.inr n:ℕc:WickContraction ni:Fin nh:∀ (i_1 : Fin n), decide ({i, i_1} ∈ ↑c) = falsea:Fin nb:Fin nha:a ≠ bhp:{a, b} ∈ ↑chn:i = b⊢ False subst hn mp.inr n:ℕc:WickContraction ni:Fin nh:∀ (i_1 : Fin n), decide ({i, i_1} ∈ ↑c) = falsea:Fin nha:a ≠ ihp:{a, i} ∈ ↑c⊢ False
rw [Finset.pair_comm mp.inr n:ℕc:WickContraction ni:Fin nh:∀ (i_1 : Fin n), decide ({i, i_1} ∈ ↑c) = falsea:Fin nha:a ≠ ihp:{i, a} ∈ ↑c⊢ False mp.inr n:ℕc:WickContraction ni:Fin nh:∀ (i_1 : Fin n), decide ({i, i_1} ∈ ↑c) = falsea:Fin nha:a ≠ ihp:{i, a} ∈ ↑c⊢ False] at hpmp.inr n:ℕc:WickContraction ni:Fin nh:∀ (i_1 : Fin n), decide ({i, i_1} ∈ ↑c) = falsea:Fin nha:a ≠ ihp:{i, a} ∈ ↑c⊢ False
simp at h mp.inr n:ℕc:WickContraction ni:Fin na:Fin nha:a ≠ ihp:{i, a} ∈ ↑ch:∀ (i_1 : Fin n), {i, i_1} ∉ ↑c⊢ False
exact h a hp All goals completed! 🐙
· mpr n:ℕc:WickContraction ni:Fin n⊢ (∀ p ∈ ↑c, i ∉ p) → (Fin.find? fun j => decide ({i, j} ∈ ↑c)) = none intro h mpr n:ℕc:WickContraction ni:Fin nh:∀ p ∈ ↑c, i ∉ p⊢ (Fin.find? fun j => decide ({i, j} ∈ ↑c)) = none
rw [Fin.find?_eq_none_iff mpr n:ℕc:WickContraction ni:Fin nh:∀ p ∈ ↑c, i ∉ p⊢ ∀ (i_1 : Fin n), decide ({i, i_1} ∈ ↑c) = false mpr n:ℕc:WickContraction ni:Fin nh:∀ p ∈ ↑c, i ∉ p⊢ ∀ (i_1 : Fin n), decide ({i, i_1} ∈ ↑c) = false]mpr n:ℕc:WickContraction ni:Fin nh:∀ p ∈ ↑c, i ∉ p⊢ ∀ (i_1 : Fin n), decide ({i, i_1} ∈ ↑c) = false
by_contra hn mpr n:ℕc:WickContraction ni:Fin nh:∀ p ∈ ↑c, i ∉ phn:¬∀ (i_1 : Fin n), decide ({i, i_1} ∈ ↑c) = false⊢ False
simp only [decide_eq_false_iff_not, not_forall, Decidable.not_not] at hn mpr n:ℕc:WickContraction ni:Fin nh:∀ p ∈ ↑c, i ∉ phn:∃ x, {i, x} ∈ ↑c⊢ False
obtain ⟨j, hj⟩ := hn mpr n:ℕc:WickContraction ni:Fin nh:∀ p ∈ ↑c, i ∉ pj:Fin nhj:{i, j} ∈ ↑c⊢ False
apply h {i, j} hj mpr n:ℕc:WickContraction ni:Fin nh:∀ p ∈ ↑c, i ∉ pj:Fin nhj:{i, j} ∈ ↑c⊢ i ∈ {i, j}
simp All goals completed! 🐙
lemma mem_uncontracted_empty (i : Fin n) : i ∈ empty.uncontracted := by n:ℕi:Fin n⊢ i ∈ empty.uncontracted
rw [@mem_uncontracted_iff_not_contracted n:ℕi:Fin n⊢ ∀ p ∈ ↑empty, i ∉ p n:ℕi:Fin n⊢ ∀ p ∈ ↑empty, i ∉ p] n:ℕi:Fin n⊢ ∀ p ∈ ↑empty, i ∉ p
intro p hp n:ℕi:Fin np:Finset (Fin n)hp:p ∈ ↑empty⊢ i ∉ p
simp [empty] at hp All goals completed! 🐙@[simp]
lemma getDual?_empty_eq_none (i : Fin n) : empty.getDual? i = none := by n:ℕi:Fin n⊢ empty.getDual? i = none
simpa [uncontracted] using mem_uncontracted_empty i All goals completed! 🐙@[simp]
lemma uncontracted_empty {n : ℕ} : (@empty n).uncontracted = Finset.univ := by n:ℕ⊢ empty.uncontracted = Finset.univ
simp [uncontracted] All goals completed! 🐙lemma uncontracted_card_le (c : WickContraction n) : c.uncontracted.card ≤ n := by n:ℕc:WickContraction n⊢ c.uncontracted.card ≤ n
simp only [uncontracted] n:ℕc:WickContraction n⊢ {i | c.getDual? i = none}.card ≤ n
apply le_of_le_of_eq (Finset.card_filter_le _ _) n:ℕc:WickContraction n⊢ Finset.univ.card = n
simp All goals completed! 🐙
lemma uncontracted_card_eq_iff (c : WickContraction n) :
c.uncontracted.card = n ↔ c = empty := by n:ℕc:WickContraction n⊢ c.uncontracted.card = n ↔ c = empty
apply Iff.intro mp n:ℕc:WickContraction n⊢ c.uncontracted.card = n → c = emptympr n:ℕc:WickContraction n⊢ c = empty → c.uncontracted.card = n
· mp n:ℕc:WickContraction n⊢ c.uncontracted.card = n → c = empty intro h mp n:ℕc:WickContraction nh:c.uncontracted.card = n⊢ c = empty
have hc : c.uncontracted.card = (Finset.univ (α := Fin n)).card := by n:ℕc:WickContraction n⊢ c.uncontracted.card = n ↔ c = empty mp n:ℕc:WickContraction nh:c.uncontracted.card = nhc:c.uncontracted.card = Finset.univ.card⊢ c = empty simpa using h mp n:ℕc:WickContraction nh:c.uncontracted.card = nhc:c.uncontracted.card = Finset.univ.card⊢ c = emptymp n:ℕc:WickContraction nh:c.uncontracted.card = nhc:c.uncontracted.card = Finset.univ.card⊢ c = empty
simp only [uncontracted] at hc mp n:ℕc:WickContraction nh:c.uncontracted.card = nhc:{i | c.getDual? i = none}.card = Finset.univ.card⊢ c = empty
rw [Finset.card_filter_eq_iff mp n:ℕc:WickContraction nh:c.uncontracted.card = nhc:∀ x ∈ Finset.univ, c.getDual? x = none⊢ c = empty mp n:ℕc:WickContraction nh:c.uncontracted.card = nhc:∀ x ∈ Finset.univ, c.getDual? x = none⊢ c = empty] at hcmp n:ℕc:WickContraction nh:c.uncontracted.card = nhc:∀ x ∈ Finset.univ, c.getDual? x = none⊢ c = empty
by_contra hn mp n:ℕc:WickContraction nh:c.uncontracted.card = nhc:∀ x ∈ Finset.univ, c.getDual? x = nonehn:¬c = empty⊢ False
have hc' := exists_pair_of_not_eq_empty c hn mp n:ℕc:WickContraction nh:c.uncontracted.card = nhc:∀ x ∈ Finset.univ, c.getDual? x = nonehn:¬c = emptyhc':∃ i j, {i, j} ∈ ↑c⊢ False
obtain ⟨i, j, hij⟩ := hc' mp n:ℕc:WickContraction nh:c.uncontracted.card = nhc:∀ x ∈ Finset.univ, c.getDual? x = nonehn:¬c = emptyi:Fin nj:Fin nhij:{i, j} ∈ ↑c⊢ False
have hci : c.getDual? i = some j := by n:ℕc:WickContraction n⊢ c.uncontracted.card = n ↔ c = empty mp 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
rw [@getDual?_eq_some_iff_mem n:ℕc:WickContraction nh:c.uncontracted.card = nhc:∀ x ∈ Finset.univ, c.getDual? x = nonehn:¬c = emptyi:Fin nj:Fin nhij:{i, j} ∈ ↑c⊢ {i, j} ∈ ↑c n:ℕc:WickContraction nh:c.uncontracted.card = nhc:∀ x ∈ Finset.univ, c.getDual? x = nonehn:¬c = emptyi:Fin nj:Fin nhij:{i, j} ∈ ↑c⊢ {i, j} ∈ ↑cmp 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] n:ℕc:WickContraction nh:c.uncontracted.card = nhc:∀ x ∈ Finset.univ, c.getDual? x = nonehn:¬c = emptyi:Fin nj:Fin nhij:{i, j} ∈ ↑c⊢ {i, j} ∈ ↑cmp 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
exact hijmp 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⊢ Falsemp 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
simp_all All goals completed! 🐙
· mpr n:ℕc:WickContraction n⊢ c = empty → c.uncontracted.card = n intro h mpr n:ℕc:WickContraction nh:c = empty⊢ c.uncontracted.card = n
subst h mpr n:ℕ⊢ empty.uncontracted.card = n
simp All goals completed! 🐙