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.FinErasing 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.
refine_2 𝓕: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 ∈ ↑c⊢ Finset.map i.succAboveEmb a = Finset.map i.succAboveEmb b ∨
Disjoint (Finset.map i.succAboveEmb a) (Finset.map i.succAboveEmb b)
exact c.2.2 _ ha _ hb All goals completed! 🐙
lemma mem_erase_uncontracted_iff (c : WickContraction n.succ) (i : Fin n.succ) (j : Fin n) :
j ∈ (c.erase i).uncontracted ↔
i.succAbove j ∈ c.uncontracted ∨ c.getDual? (i.succAbove j) = some i := by n:ℕc:WickContraction n.succi:Fin n.succj:Fin n⊢ j ∈ (c.erase i).uncontracted ↔ i.succAbove j ∈ c.uncontracted ∨ c.getDual? (i.succAbove j) = some i
rw [getDual?_eq_some_iff_mem n:ℕc:WickContraction n.succi:Fin n.succj:Fin n⊢ j ∈ (c.erase i).uncontracted ↔ i.succAbove j ∈ c.uncontracted ∨ {i.succAbove j, i} ∈ ↑c n:ℕc:WickContraction n.succi:Fin n.succj:Fin n⊢ j ∈ (c.erase i).uncontracted ↔ i.succAbove j ∈ c.uncontracted ∨ {i.succAbove j, i} ∈ ↑c] n:ℕc:WickContraction n.succi:Fin n.succj:Fin n⊢ j ∈ (c.erase i).uncontracted ↔ i.succAbove j ∈ c.uncontracted ∨ {i.succAbove j, i} ∈ ↑c
simp only [uncontracted, getDual?, erase, Nat.succ_eq_add_one, Finset.mem_filter, Finset.mem_univ,
Finset.map_insert, Fin.succAboveEmb_apply, Finset.map_singleton, true_and] n:ℕc:WickContraction n.succi:Fin n.succj:Fin n⊢ (Fin.find? fun j_1 => decide ({i.succAbove j, i.succAbove j_1} ∈ ↑c)) = none ↔
(Fin.find? fun j_1 => decide ({i.succAbove j, j_1} ∈ ↑c)) = none ∨ {i.succAbove j, i} ∈ ↑c
rw [Fin.find?_eq_none_iff, n:ℕc:WickContraction n.succi:Fin n.succj:Fin n⊢ (∀ (i_1 : Fin n), decide ({i.succAbove j, i.succAbove i_1} ∈ ↑c) = false) ↔
(Fin.find? fun j_1 => decide ({i.succAbove j, j_1} ∈ ↑c)) = none ∨ {i.succAbove j, i} ∈ ↑c n:ℕc:WickContraction n.succi:Fin n.succj:Fin n⊢ (∀ (i_1 : Fin n), decide ({i.succAbove j, i.succAbove i_1} ∈ ↑c) = false) ↔
(∀ (i_1 : Fin (n + 1)), decide ({i.succAbove j, i_1} ∈ ↑c) = false) ∨ {i.succAbove j, i} ∈ ↑c Fin.find?_eq_none_iff n:ℕc:WickContraction n.succi:Fin n.succj:Fin n⊢ (∀ (i_1 : Fin n), decide ({i.succAbove j, i.succAbove i_1} ∈ ↑c) = false) ↔
(∀ (i_1 : Fin (n + 1)), decide ({i.succAbove j, i_1} ∈ ↑c) = false) ∨ {i.succAbove j, i} ∈ ↑c n:ℕc:WickContraction n.succi:Fin n.succj:Fin n⊢ (∀ (i_1 : Fin n), decide ({i.succAbove j, i.succAbove i_1} ∈ ↑c) = false) ↔
(∀ (i_1 : Fin (n + 1)), decide ({i.succAbove j, i_1} ∈ ↑c) = false) ∨ {i.succAbove j, i} ∈ ↑c] n:ℕc:WickContraction n.succi:Fin n.succj:Fin n⊢ (∀ (i_1 : Fin n), decide ({i.succAbove j, i.succAbove i_1} ∈ ↑c) = false) ↔
(∀ (i_1 : Fin (n + 1)), decide ({i.succAbove j, i_1} ∈ ↑c) = false) ∨ {i.succAbove j, i} ∈ ↑c
apply Iff.intro mp n:ℕc:WickContraction n.succi:Fin n.succj:Fin n⊢ (∀ (i_1 : Fin n), decide ({i.succAbove j, i.succAbove i_1} ∈ ↑c) = false) →
(∀ (i_1 : Fin (n + 1)), decide ({i.succAbove j, i_1} ∈ ↑c) = false) ∨ {i.succAbove j, i} ∈ ↑cmpr n:ℕc:WickContraction n.succi:Fin n.succj:Fin n⊢ (∀ (i_1 : Fin (n + 1)), decide ({i.succAbove j, i_1} ∈ ↑c) = false) ∨ {i.succAbove j, i} ∈ ↑c →
∀ (i_1 : Fin n), decide ({i.succAbove j, i.succAbove i_1} ∈ ↑c) = false
· mp n:ℕc:WickContraction n.succi:Fin n.succj:Fin n⊢ (∀ (i_1 : Fin n), decide ({i.succAbove j, i.succAbove i_1} ∈ ↑c) = false) →
(∀ (i_1 : Fin (n + 1)), decide ({i.succAbove j, i_1} ∈ ↑c) = false) ∨ {i.succAbove j, i} ∈ ↑c intro h mp n:ℕc:WickContraction n.succi:Fin n.succj:Fin nh:∀ (i_1 : Fin n), decide ({i.succAbove j, i.succAbove i_1} ∈ ↑c) = false⊢ (∀ (i_1 : Fin (n + 1)), decide ({i.succAbove j, i_1} ∈ ↑c) = false) ∨ {i.succAbove j, i} ∈ ↑c
by_cases hi : {i.succAbove j, i} ∈ c.1 pos n:ℕc:WickContraction n.succi:Fin n.succj:Fin nh:∀ (i_1 : Fin n), decide ({i.succAbove j, i.succAbove i_1} ∈ ↑c) = falsehi:{i.succAbove j, i} ∈ ↑c⊢ (∀ (i_1 : Fin (n + 1)), decide ({i.succAbove j, i_1} ∈ ↑c) = false) ∨ {i.succAbove j, i} ∈ ↑cneg n:ℕc:WickContraction n.succi:Fin n.succj:Fin nh:∀ (i_1 : Fin n), decide ({i.succAbove j, i.succAbove i_1} ∈ ↑c) = falsehi:{i.succAbove j, i} ∉ ↑c⊢ (∀ (i_1 : Fin (n + 1)), decide ({i.succAbove j, i_1} ∈ ↑c) = false) ∨ {i.succAbove j, i} ∈ ↑c
· pos n:ℕc:WickContraction n.succi:Fin n.succj:Fin nh:∀ (i_1 : Fin n), decide ({i.succAbove j, i.succAbove i_1} ∈ ↑c) = falsehi:{i.succAbove j, i} ∈ ↑c⊢ (∀ (i_1 : Fin (n + 1)), decide ({i.succAbove j, i_1} ∈ ↑c) = false) ∨ {i.succAbove j, i} ∈ ↑c simp [hi] All goals completed! 🐙
· neg n:ℕc:WickContraction n.succi:Fin n.succj:Fin nh:∀ (i_1 : Fin n), decide ({i.succAbove j, i.succAbove i_1} ∈ ↑c) = falsehi:{i.succAbove j, i} ∉ ↑c⊢ (∀ (i_1 : Fin (n + 1)), decide ({i.succAbove j, i_1} ∈ ↑c) = false) ∨ {i.succAbove j, i} ∈ ↑c apply Or.inl neg n:ℕc:WickContraction n.succi:Fin n.succj:Fin nh:∀ (i_1 : Fin n), decide ({i.succAbove j, i.succAbove i_1} ∈ ↑c) = falsehi:{i.succAbove j, i} ∉ ↑c⊢ ∀ (i_1 : Fin (n + 1)), decide ({i.succAbove j, i_1} ∈ ↑c) = false
intro k neg n:ℕc:WickContraction n.succi:Fin n.succj:Fin nh:∀ (i_1 : Fin n), decide ({i.succAbove j, i.succAbove i_1} ∈ ↑c) = falsehi:{i.succAbove j, i} ∉ ↑ck:Fin (n + 1)⊢ decide ({i.succAbove j, k} ∈ ↑c) = false
by_cases hi' : k = i pos n:ℕc:WickContraction n.succi:Fin n.succj:Fin nh:∀ (i_1 : Fin n), decide ({i.succAbove j, i.succAbove i_1} ∈ ↑c) = falsehi:{i.succAbove j, i} ∉ ↑ck:Fin (n + 1)hi':k = i⊢ decide ({i.succAbove j, k} ∈ ↑c) = falseneg n:ℕc:WickContraction n.succi:Fin n.succj:Fin nh:∀ (i_1 : Fin n), decide ({i.succAbove j, i.succAbove i_1} ∈ ↑c) = falsehi:{i.succAbove j, i} ∉ ↑ck:Fin (n + 1)hi':¬k = i⊢ decide ({i.succAbove j, k} ∈ ↑c) = false
· pos n:ℕc:WickContraction n.succi:Fin n.succj:Fin nh:∀ (i_1 : Fin n), decide ({i.succAbove j, i.succAbove i_1} ∈ ↑c) = falsehi:{i.succAbove j, i} ∉ ↑ck:Fin (n + 1)hi':k = i⊢ decide ({i.succAbove j, k} ∈ ↑c) = false subst hi' pos n:ℕc:WickContraction n.succj:Fin nk:Fin (n + 1)h:∀ (i : Fin n), decide ({k.succAbove j, k.succAbove i} ∈ ↑c) = falsehi:{k.succAbove j, k} ∉ ↑c⊢ decide ({k.succAbove j, k} ∈ ↑c) = false
simpa using hi All goals completed! 🐙
· neg n:ℕc:WickContraction n.succi:Fin n.succj:Fin nh:∀ (i_1 : Fin n), decide ({i.succAbove j, i.succAbove i_1} ∈ ↑c) = falsehi:{i.succAbove j, i} ∉ ↑ck:Fin (n + 1)hi':¬k = i⊢ decide ({i.succAbove j, k} ∈ ↑c) = false simp only [← Fin.exists_succAbove_eq_iff] at hi' neg n:ℕc:WickContraction n.succi:Fin n.succj:Fin nh:∀ (i_1 : Fin n), decide ({i.succAbove j, i.succAbove i_1} ∈ ↑c) = falsehi:{i.succAbove j, i} ∉ ↑ck:Fin (n + 1)hi':∃ z, i.succAbove z = k⊢ decide ({i.succAbove j, k} ∈ ↑c) = false
obtain ⟨z, hz⟩ := hi' neg n:ℕc:WickContraction n.succi:Fin n.succj:Fin nh:∀ (i_1 : Fin n), decide ({i.succAbove j, i.succAbove i_1} ∈ ↑c) = falsehi:{i.succAbove j, i} ∉ ↑ck:Fin (n + 1)z:Fin nhz:i.succAbove z = k⊢ decide ({i.succAbove j, k} ∈ ↑c) = false
subst hz neg n:ℕc:WickContraction n.succi:Fin n.succj:Fin nh:∀ (i_1 : Fin n), decide ({i.succAbove j, i.succAbove i_1} ∈ ↑c) = falsehi:{i.succAbove j, i} ∉ ↑cz:Fin n⊢ decide ({i.succAbove j, i.succAbove z} ∈ ↑c) = false
exact h z All goals completed! 🐙
· mpr n:ℕc:WickContraction n.succi:Fin n.succj:Fin n⊢ (∀ (i_1 : Fin (n + 1)), decide ({i.succAbove j, i_1} ∈ ↑c) = false) ∨ {i.succAbove j, i} ∈ ↑c →
∀ (i_1 : Fin n), decide ({i.succAbove j, i.succAbove i_1} ∈ ↑c) = false intro h k mpr n:ℕc:WickContraction n.succi:Fin n.succj:Fin nh:(∀ (i_1 : Fin (n + 1)), decide ({i.succAbove j, i_1} ∈ ↑c) = false) ∨ {i.succAbove j, i} ∈ ↑ck:Fin n⊢ decide ({i.succAbove j, i.succAbove k} ∈ ↑c) = false
rcases h with h | h mpr.inl n:ℕc:WickContraction n.succi:Fin n.succj:Fin nk:Fin nh:∀ (i_1 : Fin (n + 1)), decide ({i.succAbove j, i_1} ∈ ↑c) = false⊢ decide ({i.succAbove j, i.succAbove k} ∈ ↑c) = falsempr.inr n:ℕc:WickContraction n.succi:Fin n.succj:Fin nk:Fin nh:{i.succAbove j, i} ∈ ↑c⊢ decide ({i.succAbove j, i.succAbove k} ∈ ↑c) = false
· mpr.inl n:ℕc:WickContraction n.succi:Fin n.succj:Fin nk:Fin nh:∀ (i_1 : Fin (n + 1)), decide ({i.succAbove j, i_1} ∈ ↑c) = false⊢ decide ({i.succAbove j, i.succAbove k} ∈ ↑c) = false exact h (i.succAbove k) All goals completed! 🐙
· mpr.inr n:ℕc:WickContraction n.succi:Fin n.succj:Fin nk:Fin nh:{i.succAbove j, i} ∈ ↑c⊢ decide ({i.succAbove j, i.succAbove k} ∈ ↑c) = false by_contra hn mpr.inr 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) = false⊢ False
have hc := c.2.2 _ h _ (by 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) = false⊢ ?m.131 ∈ ↑c mpr.inr 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} ∨ Disjoint {i.succAbove j, i} {i.succAbove j, i.succAbove k}⊢ False simpa using hn All goals completed! 🐙mpr.inr 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} ∨ Disjoint {i.succAbove j, i} {i.succAbove j, i.succAbove k}⊢ False)mpr.inr 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} ∨ Disjoint {i.succAbove j, i} {i.succAbove j, i.succAbove k}⊢ False
simp only [Nat.succ_eq_add_one, Finset.disjoint_insert_right, Finset.mem_insert,
Finset.mem_singleton, true_or, not_true_eq_false, Finset.disjoint_singleton_right, not_or,
false_and, or_false] at hc mpr.inr 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}⊢ False
have hi : i ∈ ({i.succAbove j, i.succAbove k} : Finset (Fin n.succ)) := by n:ℕc:WickContraction n.succi:Fin n.succj:Fin n⊢ j ∈ (c.erase i).uncontracted ↔ i.succAbove j ∈ c.uncontracted ∨ c.getDual? (i.succAbove j) = some i mpr.inr 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
simp [← hc]mpr.inr 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}⊢ Falsempr.inr 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
simp only [Nat.succ_eq_add_one, Finset.mem_insert, Finset.mem_singleton] at hi mpr.inr 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 k⊢ False
rcases hi with hi | hi mpr.inr.inl 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⊢ Falsempr.inr.inr 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 k⊢ False
· mpr.inr.inl 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⊢ False exact False.elim (Fin.succAbove_ne _ _ hi.symm) All goals completed! 🐙
· mpr.inr.inr 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 k⊢ False exact False.elim (Fin.succAbove_ne _ _ hi.symm) All goals completed! 🐙
lemma mem_not_eq_erase_of_isSome (c : WickContraction n.succ) (i : Fin n.succ)
(h : (c.getDual? i).isSome) (ha : a ∈ c.1) (ha2 : a ≠ {i, (c.getDual? i).get h}) :
∃ a', a' ∈ (c.erase i).1 ∧ a = Finset.map i.succAboveEmb a' := by n:ℕa:Finset (Fin n.succ)c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isSome = trueha:a ∈ ↑cha2:a ≠ {i, (c.getDual? i).get h}⊢ ∃ a' ∈ ↑(c.erase i), a = Finset.map i.succAboveEmb a'
have h2a := c.2.1 a ha n:ℕa:Finset (Fin n.succ)c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isSome = trueha:a ∈ ↑cha2:a ≠ {i, (c.getDual? i).get h}h2a:a.card = 2⊢ ∃ a' ∈ ↑(c.erase i), a = Finset.map i.succAboveEmb a'
rw [@Finset.card_eq_two n:ℕa:Finset (Fin n.succ)c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isSome = trueha:a ∈ ↑cha2:a ≠ {i, (c.getDual? i).get h}h2a:∃ x y, x ≠ y ∧ a = {x, y}⊢ ∃ a' ∈ ↑(c.erase i), a = Finset.map i.succAboveEmb a' n:ℕa:Finset (Fin n.succ)c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isSome = trueha:a ∈ ↑cha2:a ≠ {i, (c.getDual? i).get h}h2a:∃ x y, x ≠ y ∧ a = {x, y}⊢ ∃ a' ∈ ↑(c.erase i), a = Finset.map i.succAboveEmb a'] at h2a n:ℕa:Finset (Fin n.succ)c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isSome = trueha:a ∈ ↑cha2:a ≠ {i, (c.getDual? i).get h}h2a:∃ x y, x ≠ y ∧ a = {x, y}⊢ ∃ a' ∈ ↑(c.erase i), a = Finset.map i.succAboveEmb a'
obtain ⟨x, y, hx,hy⟩ := h2a n:ℕa:Finset (Fin n.succ)c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isSome = trueha:a ∈ ↑cha2:a ≠ {i, (c.getDual? i).get h}x:Fin n.succy:Fin n.succhx:x ≠ yhy:a = {x, y}⊢ ∃ a' ∈ ↑(c.erase i), a = Finset.map i.succAboveEmb a'
subst hy 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}⊢ ∃ a' ∈ ↑(c.erase i), {x, y} = Finset.map i.succAboveEmb a'
have hxn : ¬ x = i := by n:ℕa:Finset (Fin n.succ)c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isSome = trueha:a ∈ ↑cha2:a ≠ {i, (c.getDual? i).get h}⊢ ∃ a' ∈ ↑(c.erase i), a = 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:¬x = i⊢ ∃ a' ∈ ↑(c.erase i), {x, y} = Finset.map i.succAboveEmb a'
by_contra hx 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}hx:x = i⊢ False 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 = i⊢ ∃ a' ∈ ↑(c.erase i), {x, y} = Finset.map i.succAboveEmb a'
subst hx n:ℕc:WickContraction n.succx:Fin n.succy:Fin n.succhx:x ≠ yha:{x, y} ∈ ↑ch:(c.getDual? x).isSome = trueha2:{x, y} ≠ {x, (c.getDual? x).get h}⊢ False 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 = i⊢ ∃ a' ∈ ↑(c.erase i), {x, y} = Finset.map i.succAboveEmb a'
rw [← @getDual?_eq_some_iff_mem n:ℕc:WickContraction n.succx:Fin n.succy:Fin n.succhx:x ≠ yha:c.getDual? x = some yh:(c.getDual? x).isSome = trueha2:{x, y} ≠ {x, (c.getDual? x).get h}⊢ False n:ℕc:WickContraction n.succx:Fin n.succy:Fin n.succhx:x ≠ yha:c.getDual? x = some yh:(c.getDual? x).isSome = trueha2:{x, y} ≠ {x, (c.getDual? x).get h}⊢ False 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 = i⊢ ∃ a' ∈ ↑(c.erase i), {x, y} = Finset.map i.succAboveEmb a'] at ha n:ℕc:WickContraction n.succx:Fin n.succy:Fin n.succhx:x ≠ yha:c.getDual? x = some yh:(c.getDual? x).isSome = trueha2:{x, y} ≠ {x, (c.getDual? x).get h}⊢ False 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 = i⊢ ∃ a' ∈ ↑(c.erase i), {x, y} = Finset.map i.succAboveEmb a'
rw [(Option.get_of_mem h ha) n:ℕc:WickContraction n.succx:Fin n.succy:Fin n.succhx:x ≠ yha:c.getDual? x = some yh:(c.getDual? x).isSome = trueha2:{x, y} ≠ {x, y}⊢ False n:ℕc:WickContraction n.succx:Fin n.succy:Fin n.succhx:x ≠ yha:c.getDual? x = some yh:(c.getDual? x).isSome = trueha2:{x, y} ≠ {x, y}⊢ False 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 = i⊢ ∃ a' ∈ ↑(c.erase i), {x, y} = Finset.map i.succAboveEmb a'] at ha2 n:ℕc:WickContraction n.succx:Fin n.succy:Fin n.succhx:x ≠ yha:c.getDual? x = some yh:(c.getDual? x).isSome = trueha2:{x, y} ≠ {x, y}⊢ False 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 = i⊢ ∃ a' ∈ ↑(c.erase i), {x, y} = Finset.map i.succAboveEmb a'
simp at ha2 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 = 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:¬x = i⊢ ∃ a' ∈ ↑(c.erase i), {x, y} = Finset.map i.succAboveEmb a'
have hyn : ¬ y = i := by n:ℕa:Finset (Fin n.succ)c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isSome = trueha:a ∈ ↑cha2:a ≠ {i, (c.getDual? i).get h}⊢ ∃ a' ∈ ↑(c.erase i), a = 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:¬x = ihyn:¬y = i⊢ ∃ a' ∈ ↑(c.erase i), {x, y} = Finset.map i.succAboveEmb a'
by_contra hy 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 = ihy:y = i⊢ False 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'
subst hy n:ℕc:WickContraction n.succx:Fin n.succy:Fin n.succhx:x ≠ yha:{x, y} ∈ ↑ch:(c.getDual? y).isSome = trueha2:{x, y} ≠ {y, (c.getDual? y).get h}hxn:¬x = y⊢ False 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'
rw [@Finset.pair_comm n:ℕc:WickContraction n.succx:Fin n.succy:Fin n.succhx:x ≠ yha:{y, x} ∈ ↑ch:(c.getDual? y).isSome = trueha2:{x, y} ≠ {y, (c.getDual? y).get h}hxn:¬x = y⊢ False n:ℕc:WickContraction n.succx:Fin n.succy:Fin n.succhx:x ≠ yha:{y, x} ∈ ↑ch:(c.getDual? y).isSome = trueha2:{x, y} ≠ {y, (c.getDual? y).get h}hxn:¬x = y⊢ False 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'] at ha n:ℕc:WickContraction n.succx:Fin n.succy:Fin n.succhx:x ≠ yha:{y, x} ∈ ↑ch:(c.getDual? y).isSome = trueha2:{x, y} ≠ {y, (c.getDual? y).get h}hxn:¬x = y⊢ False 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'
rw [← @getDual?_eq_some_iff_mem n:ℕc:WickContraction n.succx:Fin n.succy:Fin n.succhx:x ≠ yha:c.getDual? y = some xh:(c.getDual? y).isSome = trueha2:{x, y} ≠ {y, (c.getDual? y).get h}hxn:¬x = y⊢ False n:ℕc:WickContraction n.succx:Fin n.succy:Fin n.succhx:x ≠ yha:c.getDual? y = some xh:(c.getDual? y).isSome = trueha2:{x, y} ≠ {y, (c.getDual? y).get h}hxn:¬x = y⊢ False 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'] at ha n:ℕc:WickContraction n.succx:Fin n.succy:Fin n.succhx:x ≠ yha:c.getDual? y = some xh:(c.getDual? y).isSome = trueha2:{x, y} ≠ {y, (c.getDual? y).get h}hxn:¬x = y⊢ False 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'
rw [(Option.get_of_mem h ha) n:ℕc:WickContraction n.succx:Fin n.succy:Fin n.succhx:x ≠ yha:c.getDual? y = some xh:(c.getDual? y).isSome = trueha2:{x, y} ≠ {y, x}hxn:¬x = y⊢ False n:ℕc:WickContraction n.succx:Fin n.succy:Fin n.succhx:x ≠ yha:c.getDual? y = some xh:(c.getDual? y).isSome = trueha2:{x, y} ≠ {y, x}hxn:¬x = y⊢ False 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'] at ha2 n:ℕc:WickContraction n.succx:Fin n.succy:Fin n.succhx:x ≠ yha:c.getDual? y = some xh:(c.getDual? y).isSome = trueha2:{x, y} ≠ {y, x}hxn:¬x = y⊢ False 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'
simp [Finset.pair_comm] at ha2 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:¬x = ihyn:¬y = i⊢ ∃ a' ∈ ↑(c.erase i), {x, y} = Finset.map i.succAboveEmb a'
simp only [Nat.succ_eq_add_one, ← Fin.exists_succAbove_eq_iff] at hxn hyn 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'
obtain ⟨x', hx'⟩ := hxn 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'
obtain ⟨y', hy'⟩ := hyn 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'
use {x', y'} h 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'}
subst hx' hy' h 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'}
simp only [erase, Nat.succ_eq_add_one, Finset.mem_filter, Finset.mem_univ, Finset.map_insert,
Fin.succAboveEmb_apply, Finset.map_singleton, true_and, and_true] h 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
exact ha All goals completed! 🐙
lemma mem_not_eq_erase_of_isNone (c : WickContraction n.succ) (i : Fin n.succ)
(h : (c.getDual? i).isNone) (ha : a ∈ c.1) :
∃ a', a' ∈ (c.erase i).1 ∧ a = Finset.map i.succAboveEmb a' := by n:ℕa:Finset (Fin n.succ)c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isNone = trueha:a ∈ ↑c⊢ ∃ a' ∈ ↑(c.erase i), a = Finset.map i.succAboveEmb a'
have h2a := c.2.1 a ha n:ℕa:Finset (Fin n.succ)c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isNone = trueha:a ∈ ↑ch2a:a.card = 2⊢ ∃ a' ∈ ↑(c.erase i), a = Finset.map i.succAboveEmb a'
rw [@Finset.card_eq_two n:ℕa:Finset (Fin n.succ)c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isNone = trueha:a ∈ ↑ch2a:∃ x y, x ≠ y ∧ a = {x, y}⊢ ∃ a' ∈ ↑(c.erase i), a = Finset.map i.succAboveEmb a' n:ℕa:Finset (Fin n.succ)c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isNone = trueha:a ∈ ↑ch2a:∃ x y, x ≠ y ∧ a = {x, y}⊢ ∃ a' ∈ ↑(c.erase i), a = Finset.map i.succAboveEmb a'] at h2a n:ℕa:Finset (Fin n.succ)c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isNone = trueha:a ∈ ↑ch2a:∃ x y, x ≠ y ∧ a = {x, y}⊢ ∃ a' ∈ ↑(c.erase i), a = Finset.map i.succAboveEmb a'
obtain ⟨x, y, hx,hy⟩ := h2a n:ℕa:Finset (Fin n.succ)c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isNone = trueha:a ∈ ↑cx:Fin n.succy:Fin n.succhx:x ≠ yhy:a = {x, y}⊢ ∃ a' ∈ ↑(c.erase i), a = Finset.map i.succAboveEmb a'
subst hy n:ℕc:WickContraction n.succi:Fin n.succh:(c.getDual? i).isNone = truex:Fin n.succy:Fin n.succhx:x ≠ yha:{x, y} ∈ ↑c⊢ ∃ a' ∈ ↑(c.erase i), {x, y} = Finset.map i.succAboveEmb a'
have hi : i ∈ c.uncontracted := by n:ℕa:Finset (Fin n.succ)c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isNone = trueha:a ∈ ↑c⊢ ∃ a' ∈ ↑(c.erase i), a = 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:i ∈ c.uncontracted⊢ ∃ a' ∈ ↑(c.erase i), {x, y} = Finset.map i.succAboveEmb a'
simp only [Nat.succ_eq_add_one, uncontracted, Finset.mem_filter, Finset.mem_univ, true_and] n:ℕc:WickContraction n.succi:Fin n.succh:(c.getDual? i).isNone = truex:Fin n.succy:Fin n.succhx:x ≠ yha:{x, y} ∈ ↑c⊢ c.getDual? i = none n:ℕc:WickContraction n.succi:Fin n.succh:(c.getDual? i).isNone = truex:Fin n.succy:Fin n.succhx:x ≠ yha:{x, y} ∈ ↑chi:i ∈ c.uncontracted⊢ ∃ a' ∈ ↑(c.erase i), {x, y} = Finset.map i.succAboveEmb a'
simp_all only [Nat.succ_eq_add_one, Option.isNone_iff_eq_none, ne_eq] n:ℕc:WickContraction n.succi:Fin n.succh:(c.getDual? i).isNone = truex:Fin n.succy:Fin n.succhx:x ≠ yha:{x, y} ∈ ↑chi:i ∈ c.uncontracted⊢ ∃ 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:i ∈ c.uncontracted⊢ ∃ a' ∈ ↑(c.erase i), {x, y} = Finset.map i.succAboveEmb a'
rw [@mem_uncontracted_iff_not_contracted 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 ∉ p⊢ ∃ 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 ∉ p⊢ ∃ a' ∈ ↑(c.erase i), {x, y} = Finset.map i.succAboveEmb a'] at hi 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 ∉ p⊢ ∃ a' ∈ ↑(c.erase i), {x, y} = Finset.map i.succAboveEmb a'
have hxn : ¬ x = i := by n:ℕa:Finset (Fin n.succ)c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isNone = trueha:a ∈ ↑c⊢ ∃ a' ∈ ↑(c.erase i), a = 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:¬x = i⊢ ∃ a' ∈ ↑(c.erase i), {x, y} = Finset.map i.succAboveEmb a'
by_contra hx 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 ∉ phx:x = i⊢ False 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 = i⊢ ∃ a' ∈ ↑(c.erase i), {x, y} = Finset.map i.succAboveEmb a'
subst hx n:ℕc:WickContraction n.succx:Fin n.succy:Fin n.succhx:x ≠ yha:{x, y} ∈ ↑ch:(c.getDual? x).isNone = truehi:∀ p ∈ ↑c, x ∉ p⊢ False 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 = i⊢ ∃ a' ∈ ↑(c.erase i), {x, y} = Finset.map i.succAboveEmb a'
exact hi {x, y} ha (by n:ℕc:WickContraction n.succx:Fin n.succy:Fin n.succhx:x ≠ yha:{x, y} ∈ ↑ch:(c.getDual? x).isNone = truehi:∀ p ∈ ↑c, x ∉ p⊢ x ∈ {x, y} 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 = i⊢ ∃ a' ∈ ↑(c.erase i), {x, y} = Finset.map i.succAboveEmb a' simp 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 = 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:¬x = i⊢ ∃ a' ∈ ↑(c.erase i), {x, y} = Finset.map i.succAboveEmb a'
have hyn : ¬ y = i := by n:ℕa:Finset (Fin n.succ)c:WickContraction n.succi:Fin n.succh:(c.getDual? i).isNone = trueha:a ∈ ↑c⊢ ∃ a' ∈ ↑(c.erase i), a = 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:¬x = ihyn:¬y = i⊢ ∃ a' ∈ ↑(c.erase i), {x, y} = Finset.map i.succAboveEmb a'
by_contra hy 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 = ihy:y = i⊢ False 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'
subst hy n:ℕc:WickContraction n.succx:Fin n.succy:Fin n.succhx:x ≠ yha:{x, y} ∈ ↑ch:(c.getDual? y).isNone = truehi:∀ p ∈ ↑c, y ∉ phxn:¬x = y⊢ False 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'
exact hi {x, y} ha (by n:ℕc:WickContraction n.succx:Fin n.succy:Fin n.succhx:x ≠ yha:{x, y} ∈ ↑ch:(c.getDual? y).isNone = truehi:∀ p ∈ ↑c, y ∉ phxn:¬x = y⊢ y ∈ {x, y} 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' simp 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:¬x = ihyn:¬y = i⊢ ∃ a' ∈ ↑(c.erase i), {x, y} = Finset.map i.succAboveEmb a'
simp only [Nat.succ_eq_add_one, ← Fin.exists_succAbove_eq_iff] at hxn hyn 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'
obtain ⟨x', hx'⟩ := hxn 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'
obtain ⟨y', hy'⟩ := hyn 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'
use {x', y'} h 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'}
subst hx' hy' h 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'}
simp only [erase, Nat.succ_eq_add_one, Finset.mem_filter, Finset.mem_univ, Finset.map_insert,
Fin.succAboveEmb_apply, Finset.map_singleton, true_and, and_true] h 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
exact ha 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.
def getDualErase {n : ℕ} (c : WickContraction n.succ) (i : Fin n.succ) :
Option ((erase c i).uncontracted) := by 𝓕:FieldSpecificationn✝:ℕc✝:WickContraction n✝n:ℕc:WickContraction n.succi:Fin n.succ⊢ Option ↥(c.erase i).uncontracted
match n with
| 0 => 𝓕:FieldSpecificationn✝:ℕc✝:WickContraction n✝n:ℕc:WickContraction (Nat.succ 0)i:Fin (Nat.succ 0)⊢ Option ↥(c.erase i).uncontracted exact none All goals completed! 🐙
| Nat.succ n => 𝓕:FieldSpecificationn✝¹:ℕc✝:WickContraction n✝n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succ⊢ Option ↥(c.erase i).uncontracted
refine if hj : (c.getDual? i).isSome then some ⟨(predAboveI i ((c.getDual? i).get hj)), ?_⟩
else none 𝓕:FieldSpecificationn✝¹:ℕc✝:WickContraction n✝n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhj:(c.getDual? i).isSome = true⊢ predAboveI i ((c.getDual? i).get hj) ∈ (c.erase i).uncontracted
rw [mem_erase_uncontracted_iff 𝓕:FieldSpecificationn✝¹:ℕc✝:WickContraction n✝n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhj:(c.getDual? i).isSome = true⊢ i.succAbove (predAboveI i ((c.getDual? i).get hj)) ∈ c.uncontracted ∨
c.getDual? (i.succAbove (predAboveI i ((c.getDual? i).get hj))) = some i 𝓕:FieldSpecificationn✝¹:ℕc✝:WickContraction n✝n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhj:(c.getDual? i).isSome = true⊢ i.succAbove (predAboveI i ((c.getDual? i).get hj)) ∈ c.uncontracted ∨
c.getDual? (i.succAbove (predAboveI i ((c.getDual? i).get hj))) = some i] 𝓕:FieldSpecificationn✝¹:ℕc✝:WickContraction n✝n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhj:(c.getDual? i).isSome = true⊢ i.succAbove (predAboveI i ((c.getDual? i).get hj)) ∈ c.uncontracted ∨
c.getDual? (i.succAbove (predAboveI i ((c.getDual? i).get hj))) = some i
apply Or.inr 𝓕:FieldSpecificationn✝¹:ℕc✝:WickContraction n✝n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhj:(c.getDual? i).isSome = true⊢ c.getDual? (i.succAbove (predAboveI i ((c.getDual? i).get hj))) = some i
rw [succsAbove_predAboveI, 𝓕:FieldSpecificationn✝¹:ℕc✝:WickContraction n✝n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhj:(c.getDual? i).isSome = true⊢ c.getDual? ((c.getDual? i).get hj) = some i𝓕:FieldSpecificationn✝¹:ℕc✝:WickContraction n✝n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhj:(c.getDual? i).isSome = true⊢ i ≠ (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𝓕:FieldSpecificationn✝¹:ℕc✝:WickContraction n✝n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhj:(c.getDual? i).isSome = true⊢ i ≠ (c.getDual? i).get hj getDual?_eq_some_iff_mem 𝓕: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 = true⊢ i ≠ (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𝓕:FieldSpecificationn✝¹:ℕc✝:WickContraction n✝n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhj:(c.getDual? i).isSome = true⊢ i ≠ (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𝓕:FieldSpecificationn✝¹:ℕc✝:WickContraction n✝n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhj:(c.getDual? i).isSome = true⊢ i ≠ (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 simp All goals completed! 🐙
· 𝓕:FieldSpecificationn✝¹:ℕc✝:WickContraction n✝n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhj:(c.getDual? i).isSome = true⊢ i ≠ (c.getDual? i).get hj apply c.getDual?_eq_some_neq _ _ _ 𝓕:FieldSpecificationn✝¹:ℕc✝:WickContraction n✝n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhj:(c.getDual? i).isSome = true⊢ c.getDual? i = some ((c.getDual? i).get hj)
simp 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 := by n:ℕc:WickContraction n.succi:Fin n.succ⊢ (c.getDualErase i).isSome = true ↔ (c.getDual? i).isSome = true
match n with
| 0 => n:ℕc:WickContraction (Nat.succ 0)i:Fin (Nat.succ 0)⊢ (c.getDualErase i).isSome = true ↔ (c.getDual? i).isSome = true
fin_cases i «0» n:ℕc:WickContraction (Nat.succ 0)⊢ (c.getDualErase ((fun i => i) ⟨0, ⋯⟩)).isSome = true ↔ (c.getDual? ((fun i => i) ⟨0, ⋯⟩)).isSome = true
simp [getDualErase] All goals completed! 🐙
| Nat.succ n => n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succ⊢ (c.getDualErase i).isSome = true ↔ (c.getDual? i).isSome = true
simp [getDualErase] All goals completed! 🐙@[simp]
lemma getDualErase_one (c : WickContraction 1) (i : Fin 1) :
c.getDualErase i = none := by c:WickContraction 1i:Fin 1⊢ c.getDualErase i = none
fin_cases i «0» c:WickContraction 1⊢ c.getDualErase ((fun i => i) ⟨0, ⋯⟩) = none
simp [getDualErase] All goals completed! 🐙