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.EraseInserting an element into a contraction
@[expose] public sectionInserting an element into a contraction
Given a Wick contraction c for n, a position i : Fin n.succ and
an optional uncontracted element j : Option (c.uncontracted) of c.
The Wick contraction for n.succ formed by 'inserting' i into Fin n
and contracting it optionally with j.
𝓕:FieldSpecificationn:ℕc✝:WickContraction nc:WickContraction ni:Fin n.succj✝:Option ↥c.uncontractedf:Finset (Finset (Fin (n + 1))) := Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑cf':Finset (Finset (Fin (n + 1))) :=
match j with
| none => f
| some j => insert {i, i.succAbove ↑j} fj:↥c.uncontracteda':Finset (Fin n)ha':a' ∈ ↑cb':Finset (Fin n)hb':b' ∈ ↑c⊢ a' = b' ∨ Disjoint a' b'
exact c.2.2 a' ha' b' hb' All goals completed! 🐙lemma insertAndContractNat_of_isSome (c : WickContraction n) (i : Fin n.succ)
(j : Option c.uncontracted) (hj : j.isSome) :
(insertAndContractNat c i j).1 = Insert.insert {i, i.succAbove (j.get hj)}
(Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding c.1) := by n:ℕc:WickContraction ni:Fin n.succj:Option ↥c.uncontractedhj:j.isSome = true⊢ ↑(c.insertAndContractNat i j) =
insert {i, i.succAbove ↑(j.get hj)} (Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c)
obtain ⟨j, rfl⟩ := Option.isSome_iff_exists.mp hj n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedhj:(some j).isSome = true⊢ ↑(c.insertAndContractNat i (some j)) =
insert {i, i.succAbove ↑((some j).get hj)} (Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c)
simp [insertAndContractNat] All goals completed! 🐙
@[simp]
lemma self_mem_uncontracted_of_insertAndContractNat_none (c : WickContraction n) (i : Fin n.succ) :
i ∈ (insertAndContractNat c i none).uncontracted := by n:ℕc:WickContraction ni:Fin n.succ⊢ i ∈ (c.insertAndContractNat i none).uncontracted
rw [mem_uncontracted_iff_not_contracted n:ℕc:WickContraction ni:Fin n.succ⊢ ∀ p ∈ ↑(c.insertAndContractNat i none), i ∉ p n:ℕc:WickContraction ni:Fin n.succ⊢ ∀ p ∈ ↑(c.insertAndContractNat i none), i ∉ p] n:ℕc:WickContraction ni:Fin n.succ⊢ ∀ p ∈ ↑(c.insertAndContractNat i none), i ∉ p
intro p hp n:ℕc:WickContraction ni:Fin n.succp:Finset (Fin n.succ)hp:p ∈ ↑(c.insertAndContractNat i none)⊢ i ∉ p
simp only [Nat.succ_eq_add_one, insertAndContractNat, Finset.mem_map,
RelEmbedding.coe_toEmbedding] at hp n:ℕc:WickContraction ni:Fin n.succp:Finset (Fin n.succ)hp:∃ a ∈ ↑c, (Finset.mapEmbedding i.succAboveEmb) a = p⊢ i ∉ p
obtain ⟨a, ha, ha'⟩ := hp n:ℕc:WickContraction ni:Fin n.succp:Finset (Fin n.succ)a:Finset (Fin n)ha:a ∈ ↑cha':(Finset.mapEmbedding i.succAboveEmb) a = p⊢ i ∉ p
have hc := c.2.1 a ha n:ℕc:WickContraction ni:Fin n.succp:Finset (Fin n.succ)a:Finset (Fin n)ha:a ∈ ↑cha':(Finset.mapEmbedding i.succAboveEmb) a = phc:a.card = 2⊢ i ∉ p
rw [@Finset.card_eq_two n:ℕc:WickContraction ni:Fin n.succp:Finset (Fin n.succ)a:Finset (Fin n)ha:a ∈ ↑cha':(Finset.mapEmbedding i.succAboveEmb) a = phc:∃ x y, x ≠ y ∧ a = {x, y}⊢ i ∉ p n:ℕc:WickContraction ni:Fin n.succp:Finset (Fin n.succ)a:Finset (Fin n)ha:a ∈ ↑cha':(Finset.mapEmbedding i.succAboveEmb) a = phc:∃ x y, x ≠ y ∧ a = {x, y}⊢ i ∉ p] at hc n:ℕc:WickContraction ni:Fin n.succp:Finset (Fin n.succ)a:Finset (Fin n)ha:a ∈ ↑cha':(Finset.mapEmbedding i.succAboveEmb) a = phc:∃ x y, x ≠ y ∧ a = {x, y}⊢ i ∉ p
obtain ⟨x, y, hxy, ha⟩ := hc n:ℕc:WickContraction ni:Fin n.succp:Finset (Fin n.succ)a:Finset (Fin n)ha✝:a ∈ ↑cha':(Finset.mapEmbedding i.succAboveEmb) a = px:Fin ny:Fin nhxy:x ≠ yha:a = {x, y}⊢ i ∉ p
subst ha n:ℕc:WickContraction ni:Fin n.succp:Finset (Fin n.succ)x:Fin ny:Fin nhxy:x ≠ yha:{x, y} ∈ ↑cha':(Finset.mapEmbedding i.succAboveEmb) {x, y} = p⊢ i ∉ p
subst ha' n:ℕc:WickContraction ni:Fin n.succx:Fin ny:Fin nhxy:x ≠ yha:{x, y} ∈ ↑c⊢ i ∉ (Finset.mapEmbedding i.succAboveEmb) {x, y}
rw [Finset.mapEmbedding_apply n:ℕc:WickContraction ni:Fin n.succx:Fin ny:Fin nhxy:x ≠ yha:{x, y} ∈ ↑c⊢ i ∉ Finset.map i.succAboveEmb {x, y} n:ℕc:WickContraction ni:Fin n.succx:Fin ny:Fin nhxy:x ≠ yha:{x, y} ∈ ↑c⊢ i ∉ Finset.map i.succAboveEmb {x, y}] n:ℕc:WickContraction ni:Fin n.succx:Fin ny:Fin nhxy:x ≠ yha:{x, y} ∈ ↑c⊢ i ∉ Finset.map i.succAboveEmb {x, y}
simp only [Nat.succ_eq_add_one, Finset.map_insert, Fin.succAboveEmb_apply, Finset.map_singleton,
Finset.mem_insert, Finset.mem_singleton, not_or] n:ℕc:WickContraction ni:Fin n.succx:Fin ny:Fin nhxy:x ≠ yha:{x, y} ∈ ↑c⊢ ¬i = i.succAbove x ∧ ¬i = i.succAbove y
apply And.intro left n:ℕc:WickContraction ni:Fin n.succx:Fin ny:Fin nhxy:x ≠ yha:{x, y} ∈ ↑c⊢ ¬i = i.succAbove xright n:ℕc:WickContraction ni:Fin n.succx:Fin ny:Fin nhxy:x ≠ yha:{x, y} ∈ ↑c⊢ ¬i = i.succAbove y
· left n:ℕc:WickContraction ni:Fin n.succx:Fin ny:Fin nhxy:x ≠ yha:{x, y} ∈ ↑c⊢ ¬i = i.succAbove x exact Fin.ne_succAbove i x All goals completed! 🐙
· right n:ℕc:WickContraction ni:Fin n.succx:Fin ny:Fin nhxy:x ≠ yha:{x, y} ∈ ↑c⊢ ¬i = i.succAbove y exact Fin.ne_succAbove i y All goals completed! 🐙
@[simp]
lemma self_not_mem_uncontracted_of_insertAndContractNat_some (c : WickContraction n)
(i : Fin n.succ) (j : c.uncontracted) :
i ∉ (insertAndContractNat c i (some j)).uncontracted := by n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracted⊢ i ∉ (c.insertAndContractNat i (some j)).uncontracted
rw [mem_uncontracted_iff_not_contracted n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracted⊢ ¬∀ p ∈ ↑(c.insertAndContractNat i (some j)), i ∉ p n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracted⊢ ¬∀ p ∈ ↑(c.insertAndContractNat i (some j)), i ∉ p] n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracted⊢ ¬∀ p ∈ ↑(c.insertAndContractNat i (some j)), i ∉ p
simp [insertAndContractNat] All goals completed! 🐙lemma insertAndContractNat_succAbove_mem_uncontracted_iff (c : WickContraction n) (i : Fin n.succ)
(j : Fin n) :
(i.succAbove j) ∈ (insertAndContractNat c i none).uncontracted ↔ j ∈ c.uncontracted := by n:ℕc:WickContraction ni:Fin n.succj:Fin n⊢ i.succAbove j ∈ (c.insertAndContractNat i none).uncontracted ↔ j ∈ c.uncontracted
simp [mem_uncontracted_iff_not_contracted, insertAndContractNat, Finset.mapEmbedding_apply] All goals completed! 🐙@[simp]
lemma mem_uncontracted_insertAndContractNat_none_iff (c : WickContraction n) (i : Fin n.succ)
(k : Fin n.succ) : k ∈ (insertAndContractNat c i none).uncontracted ↔
k = i ∨ ∃ j, k = i.succAbove j ∧ j ∈ c.uncontracted := by n:ℕc:WickContraction ni:Fin n.succk:Fin n.succ⊢ k ∈ (c.insertAndContractNat i none).uncontracted ↔ k = i ∨ ∃ j, k = i.succAbove j ∧ j ∈ c.uncontracted
rcases Fin.eq_self_or_eq_succAbove i k with rfl | ⟨z, rfl⟩ inl n:ℕc:WickContraction nk:Fin n.succ⊢ k ∈ (c.insertAndContractNat k none).uncontracted ↔ k = k ∨ ∃ j, k = k.succAbove j ∧ j ∈ c.uncontractedinr n:ℕc:WickContraction ni:Fin n.succz:Fin n⊢ i.succAbove z ∈ (c.insertAndContractNat i none).uncontracted ↔
i.succAbove z = i ∨ ∃ j, i.succAbove z = i.succAbove j ∧ j ∈ c.uncontracted
· inl n:ℕc:WickContraction nk:Fin n.succ⊢ k ∈ (c.insertAndContractNat k none).uncontracted ↔ k = k ∨ ∃ j, k = k.succAbove j ∧ j ∈ c.uncontracted simp All goals completed! 🐙
· inr n:ℕc:WickContraction ni:Fin n.succz:Fin n⊢ i.succAbove z ∈ (c.insertAndContractNat i none).uncontracted ↔
i.succAbove z = i ∨ ∃ j, i.succAbove z = i.succAbove j ∧ j ∈ c.uncontracted simp [insertAndContractNat_succAbove_mem_uncontracted_iff, Fin.succAbove_ne] All goals completed! 🐙lemma insertAndContractNat_none_uncontracted (c : WickContraction n) (i : Fin n.succ) :
(insertAndContractNat c i none).uncontracted =
Insert.insert i (c.uncontracted.map i.succAboveEmb) := by n:ℕc:WickContraction ni:Fin n.succ⊢ (c.insertAndContractNat i none).uncontracted = insert i (Finset.map i.succAboveEmb c.uncontracted)
ext a n:ℕc:WickContraction ni:Fin n.succa:Fin n.succ⊢ a ∈ (c.insertAndContractNat i none).uncontracted ↔ a ∈ insert i (Finset.map i.succAboveEmb c.uncontracted)
simp [mem_uncontracted_insertAndContractNat_none_iff, and_comm, eq_comm] All goals completed! 🐙
@[simp]
lemma mem_uncontracted_insertAndContractNat_some_iff (c : WickContraction n) (i : Fin n.succ)
(k : Fin n.succ) (j : c.uncontracted) :
k ∈ (insertAndContractNat c i (some j)).uncontracted ↔
∃ z, k = i.succAbove z ∧ z ∈ c.uncontracted ∧ z ≠ j := by n:ℕc:WickContraction ni:Fin n.succk:Fin n.succj:↥c.uncontracted⊢ k ∈ (c.insertAndContractNat i (some j)).uncontracted ↔ ∃ z, k = i.succAbove z ∧ z ∈ c.uncontracted ∧ z ≠ ↑j
by_cases hki : k = i pos n:ℕc:WickContraction ni:Fin n.succk:Fin n.succj:↥c.uncontractedhki:k = i⊢ k ∈ (c.insertAndContractNat i (some j)).uncontracted ↔ ∃ z, k = i.succAbove z ∧ z ∈ c.uncontracted ∧ z ≠ ↑jneg n:ℕc:WickContraction ni:Fin n.succk:Fin n.succj:↥c.uncontractedhki:¬k = i⊢ k ∈ (c.insertAndContractNat i (some j)).uncontracted ↔ ∃ z, k = i.succAbove z ∧ z ∈ c.uncontracted ∧ z ≠ ↑j
· pos n:ℕc:WickContraction ni:Fin n.succk:Fin n.succj:↥c.uncontractedhki:k = i⊢ k ∈ (c.insertAndContractNat i (some j)).uncontracted ↔ ∃ z, k = i.succAbove z ∧ z ∈ c.uncontracted ∧ z ≠ ↑j subst hki pos n:ℕc:WickContraction nk:Fin n.succj:↥c.uncontracted⊢ k ∈ (c.insertAndContractNat k (some j)).uncontracted ↔ ∃ z, k = k.succAbove z ∧ z ∈ c.uncontracted ∧ z ≠ ↑j
simp only [Nat.succ_eq_add_one, self_not_mem_uncontracted_of_insertAndContractNat_some, ne_eq,
false_iff, not_exists, not_and, Decidable.not_not] pos n:ℕc:WickContraction nk:Fin n.succj:↥c.uncontracted⊢ ∀ (x : Fin n), k = k.succAbove x → x ∈ c.uncontracted → x = ↑j
exact fun x hx => False.elim (Fin.ne_succAbove k x hx) All goals completed! 🐙
· neg n:ℕc:WickContraction ni:Fin n.succk:Fin n.succj:↥c.uncontractedhki:¬k = i⊢ k ∈ (c.insertAndContractNat i (some j)).uncontracted ↔ ∃ z, k = i.succAbove z ∧ z ∈ c.uncontracted ∧ z ≠ ↑j simp only [Nat.succ_eq_add_one, ← Fin.exists_succAbove_eq_iff] at hki neg n:ℕc:WickContraction ni:Fin n.succk:Fin n.succj:↥c.uncontractedhki:∃ z, i.succAbove z = k⊢ k ∈ (c.insertAndContractNat i (some j)).uncontracted ↔ ∃ z, k = i.succAbove z ∧ z ∈ c.uncontracted ∧ z ≠ ↑j
obtain ⟨z, hk⟩ := hki neg n:ℕc:WickContraction ni:Fin n.succk:Fin n.succj:↥c.uncontractedz:Fin nhk:i.succAbove z = k⊢ k ∈ (c.insertAndContractNat i (some j)).uncontracted ↔ ∃ z, k = i.succAbove z ∧ z ∈ c.uncontracted ∧ z ≠ ↑j
subst hk neg n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin n⊢ i.succAbove z ∈ (c.insertAndContractNat i (some j)).uncontracted ↔
∃ z_1, i.succAbove z = i.succAbove z_1 ∧ z_1 ∈ c.uncontracted ∧ z_1 ≠ ↑j
by_cases hjz : j = z pos n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:↑j = z⊢ i.succAbove z ∈ (c.insertAndContractNat i (some j)).uncontracted ↔
∃ z_1, i.succAbove z = i.succAbove z_1 ∧ z_1 ∈ c.uncontracted ∧ z_1 ≠ ↑jneg n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = z⊢ i.succAbove z ∈ (c.insertAndContractNat i (some j)).uncontracted ↔
∃ z_1, i.succAbove z = i.succAbove z_1 ∧ z_1 ∈ c.uncontracted ∧ z_1 ≠ ↑j
· pos n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:↑j = z⊢ i.succAbove z ∈ (c.insertAndContractNat i (some j)).uncontracted ↔
∃ z_1, i.succAbove z = i.succAbove z_1 ∧ z_1 ∈ c.uncontracted ∧ z_1 ≠ ↑j subst hjz pos n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracted⊢ i.succAbove ↑j ∈ (c.insertAndContractNat i (some j)).uncontracted ↔
∃ z, i.succAbove ↑j = i.succAbove z ∧ z ∈ c.uncontracted ∧ z ≠ ↑j
rw [mem_uncontracted_iff_not_contracted pos n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracted⊢ (∀ p ∈ ↑(c.insertAndContractNat i (some j)), i.succAbove ↑j ∉ p) ↔
∃ z, i.succAbove ↑j = i.succAbove z ∧ z ∈ c.uncontracted ∧ z ≠ ↑j pos n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracted⊢ (∀ p ∈ ↑(c.insertAndContractNat i (some j)), i.succAbove ↑j ∉ p) ↔
∃ z, i.succAbove ↑j = i.succAbove z ∧ z ∈ c.uncontracted ∧ z ≠ ↑j] pos n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracted⊢ (∀ p ∈ ↑(c.insertAndContractNat i (some j)), i.succAbove ↑j ∉ p) ↔
∃ z, i.succAbove ↑j = i.succAbove z ∧ z ∈ c.uncontracted ∧ z ≠ ↑j
simp only [Nat.succ_eq_add_one, insertAndContractNat, Finset.mem_insert,
Finset.mem_map, RelEmbedding.coe_toEmbedding, forall_eq_or_imp, Finset.mem_singleton,
or_true, not_true_eq_false, forall_exists_index, and_imp, forall_apply_eq_imp_iff₂,
false_and, ne_eq, false_iff, not_exists, not_and, Decidable.not_not] pos n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracted⊢ ∀ (x : Fin n), i.succAbove ↑j = i.succAbove x → x ∈ c.uncontracted → x = ↑j
intro x pos n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedx:Fin n⊢ i.succAbove ↑j = i.succAbove x → x ∈ c.uncontracted → x = ↑j
rw [Function.Injective.eq_iff (Fin.succAbove_right_injective) pos n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedx:Fin n⊢ ↑j = x → x ∈ c.uncontracted → x = ↑j pos n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedx:Fin n⊢ ↑j = x → x ∈ c.uncontracted → x = ↑j]pos n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedx:Fin n⊢ ↑j = x → x ∈ c.uncontracted → x = ↑j
exact fun a _a => a.symm All goals completed! 🐙
· neg n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = z⊢ i.succAbove z ∈ (c.insertAndContractNat i (some j)).uncontracted ↔
∃ z_1, i.succAbove z = i.succAbove z_1 ∧ z_1 ∈ c.uncontracted ∧ z_1 ≠ ↑j apply Iff.intro neg.mp n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = z⊢ i.succAbove z ∈ (c.insertAndContractNat i (some j)).uncontracted →
∃ z_1, i.succAbove z = i.succAbove z_1 ∧ z_1 ∈ c.uncontracted ∧ z_1 ≠ ↑jneg.mpr n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = z⊢ (∃ z_1, i.succAbove z = i.succAbove z_1 ∧ z_1 ∈ c.uncontracted ∧ z_1 ≠ ↑j) →
i.succAbove z ∈ (c.insertAndContractNat i (some j)).uncontracted
· neg.mp n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = z⊢ i.succAbove z ∈ (c.insertAndContractNat i (some j)).uncontracted →
∃ z_1, i.succAbove z = i.succAbove z_1 ∧ z_1 ∈ c.uncontracted ∧ z_1 ≠ ↑j intro h neg.mp n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zh:i.succAbove z ∈ (c.insertAndContractNat i (some j)).uncontracted⊢ ∃ z_1, i.succAbove z = i.succAbove z_1 ∧ z_1 ∈ c.uncontracted ∧ z_1 ≠ ↑j
use z h n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zh:i.succAbove z ∈ (c.insertAndContractNat i (some j)).uncontracted⊢ i.succAbove z = i.succAbove z ∧ z ∈ c.uncontracted ∧ z ≠ ↑j
simp only [Nat.succ_eq_add_one, ne_eq, true_and] h n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zh:i.succAbove z ∈ (c.insertAndContractNat i (some j)).uncontracted⊢ z ∈ c.uncontracted ∧ ¬z = ↑j
refine And.intro ?_ (fun a => hjz a.symm) h n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zh:i.succAbove z ∈ (c.insertAndContractNat i (some j)).uncontracted⊢ z ∈ c.uncontracted
rw [mem_uncontracted_iff_not_contracted h n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zh:i.succAbove z ∈ (c.insertAndContractNat i (some j)).uncontracted⊢ ∀ p ∈ ↑c, z ∉ p h n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zh:i.succAbove z ∈ (c.insertAndContractNat i (some j)).uncontracted⊢ ∀ p ∈ ↑c, z ∉ p]h n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zh:i.succAbove z ∈ (c.insertAndContractNat i (some j)).uncontracted⊢ ∀ p ∈ ↑c, z ∉ p
intro p hp h n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zh:i.succAbove z ∈ (c.insertAndContractNat i (some j)).uncontractedp:Finset (Fin n)hp:p ∈ ↑c⊢ z ∉ p
rw [mem_uncontracted_iff_not_contracted h n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zh:∀ p ∈ ↑(c.insertAndContractNat i (some j)), i.succAbove z ∉ pp:Finset (Fin n)hp:p ∈ ↑c⊢ z ∉ p h n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zh:∀ p ∈ ↑(c.insertAndContractNat i (some j)), i.succAbove z ∉ pp:Finset (Fin n)hp:p ∈ ↑c⊢ z ∉ p] at hh n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zh:∀ p ∈ ↑(c.insertAndContractNat i (some j)), i.succAbove z ∉ pp:Finset (Fin n)hp:p ∈ ↑c⊢ z ∉ p
simp only [Nat.succ_eq_add_one, insertAndContractNat,
Finset.mem_insert, Finset.mem_map, RelEmbedding.coe_toEmbedding, forall_eq_or_imp,
Finset.mem_singleton, not_or, forall_exists_index, and_imp, forall_apply_eq_imp_iff₂] at h h n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zp:Finset (Fin n)hp:p ∈ ↑ch:(¬i.succAbove z = i ∧ ¬i.succAbove z = i.succAbove ↑j) ∧
∀ a ∈ ↑c, i.succAbove z ∉ (Finset.mapEmbedding i.succAboveEmb) a⊢ z ∉ p
have hc := h.2 p hp h n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zp:Finset (Fin n)hp:p ∈ ↑ch:(¬i.succAbove z = i ∧ ¬i.succAbove z = i.succAbove ↑j) ∧
∀ a ∈ ↑c, i.succAbove z ∉ (Finset.mapEmbedding i.succAboveEmb) ahc:i.succAbove z ∉ (Finset.mapEmbedding i.succAboveEmb) p⊢ z ∉ p
rw [Finset.mapEmbedding_apply h n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zp:Finset (Fin n)hp:p ∈ ↑ch:(¬i.succAbove z = i ∧ ¬i.succAbove z = i.succAbove ↑j) ∧
∀ a ∈ ↑c, i.succAbove z ∉ (Finset.mapEmbedding i.succAboveEmb) ahc:i.succAbove z ∉ Finset.map i.succAboveEmb p⊢ z ∉ p h n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zp:Finset (Fin n)hp:p ∈ ↑ch:(¬i.succAbove z = i ∧ ¬i.succAbove z = i.succAbove ↑j) ∧
∀ a ∈ ↑c, i.succAbove z ∉ (Finset.mapEmbedding i.succAboveEmb) ahc:i.succAbove z ∉ Finset.map i.succAboveEmb p⊢ z ∉ p] at hch n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zp:Finset (Fin n)hp:p ∈ ↑ch:(¬i.succAbove z = i ∧ ¬i.succAbove z = i.succAbove ↑j) ∧
∀ a ∈ ↑c, i.succAbove z ∉ (Finset.mapEmbedding i.succAboveEmb) ahc:i.succAbove z ∉ Finset.map i.succAboveEmb p⊢ z ∉ p
exact (Finset.mem_map' (i.succAboveEmb)).mpr.mt hc All goals completed! 🐙
· neg.mpr n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = z⊢ (∃ z_1, i.succAbove z = i.succAbove z_1 ∧ z_1 ∈ c.uncontracted ∧ z_1 ≠ ↑j) →
i.succAbove z ∈ (c.insertAndContractNat i (some j)).uncontracted intro h neg.mpr n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zh:∃ z_1, i.succAbove z = i.succAbove z_1 ∧ z_1 ∈ c.uncontracted ∧ z_1 ≠ ↑j⊢ i.succAbove z ∈ (c.insertAndContractNat i (some j)).uncontracted
obtain ⟨z', hz'1, hz'⟩ := h neg.mpr n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zz':Fin nhz'1:i.succAbove z = i.succAbove z'hz':z' ∈ c.uncontracted ∧ z' ≠ ↑j⊢ i.succAbove z ∈ (c.insertAndContractNat i (some j)).uncontracted
rw [Function.Injective.eq_iff (Fin.succAbove_right_injective) neg.mpr n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zz':Fin nhz'1:z = z'hz':z' ∈ c.uncontracted ∧ z' ≠ ↑j⊢ i.succAbove z ∈ (c.insertAndContractNat i (some j)).uncontracted neg.mpr n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zz':Fin nhz'1:z = z'hz':z' ∈ c.uncontracted ∧ z' ≠ ↑j⊢ i.succAbove z ∈ (c.insertAndContractNat i (some j)).uncontracted] at hz'1neg.mpr n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zz':Fin nhz'1:z = z'hz':z' ∈ c.uncontracted ∧ z' ≠ ↑j⊢ i.succAbove z ∈ (c.insertAndContractNat i (some j)).uncontracted
subst hz'1 neg.mpr n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zhz':z ∈ c.uncontracted ∧ z ≠ ↑j⊢ i.succAbove z ∈ (c.insertAndContractNat i (some j)).uncontracted
rw [mem_uncontracted_iff_not_contracted neg.mpr n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zhz':z ∈ c.uncontracted ∧ z ≠ ↑j⊢ ∀ p ∈ ↑(c.insertAndContractNat i (some j)), i.succAbove z ∉ p neg.mpr n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zhz':z ∈ c.uncontracted ∧ z ≠ ↑j⊢ ∀ p ∈ ↑(c.insertAndContractNat i (some j)), i.succAbove z ∉ p]neg.mpr n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zhz':z ∈ c.uncontracted ∧ z ≠ ↑j⊢ ∀ p ∈ ↑(c.insertAndContractNat i (some j)), i.succAbove z ∉ p
simp only [Nat.succ_eq_add_one, insertAndContractNat,
Finset.mem_insert, Finset.mem_map, RelEmbedding.coe_toEmbedding, forall_eq_or_imp,
Finset.mem_singleton, not_or, forall_exists_index, and_imp, forall_apply_eq_imp_iff₂] neg.mpr n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zhz':z ∈ c.uncontracted ∧ z ≠ ↑j⊢ (¬i.succAbove z = i ∧ ¬i.succAbove z = i.succAbove ↑j) ∧
∀ a ∈ ↑c, i.succAbove z ∉ (Finset.mapEmbedding i.succAboveEmb) a
apply And.intro neg.mpr.left n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zhz':z ∈ c.uncontracted ∧ z ≠ ↑j⊢ ¬i.succAbove z = i ∧ ¬i.succAbove z = i.succAbove ↑jneg.mpr.right n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zhz':z ∈ c.uncontracted ∧ z ≠ ↑j⊢ ∀ a ∈ ↑c, i.succAbove z ∉ (Finset.mapEmbedding i.succAboveEmb) a
· neg.mpr.left n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zhz':z ∈ c.uncontracted ∧ z ≠ ↑j⊢ ¬i.succAbove z = i ∧ ¬i.succAbove z = i.succAbove ↑j rw [Function.Injective.eq_iff (Fin.succAbove_right_injective) neg.mpr.left n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zhz':z ∈ c.uncontracted ∧ z ≠ ↑j⊢ ¬i.succAbove z = i ∧ ¬z = ↑j neg.mpr.left n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zhz':z ∈ c.uncontracted ∧ z ≠ ↑j⊢ ¬i.succAbove z = i ∧ ¬z = ↑j]neg.mpr.left n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zhz':z ∈ c.uncontracted ∧ z ≠ ↑j⊢ ¬i.succAbove z = i ∧ ¬z = ↑j
exact And.intro (Fin.succAbove_ne i z) (fun a => hjz a.symm) All goals completed! 🐙
· neg.mpr.right n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zhz':z ∈ c.uncontracted ∧ z ≠ ↑j⊢ ∀ a ∈ ↑c, i.succAbove z ∉ (Finset.mapEmbedding i.succAboveEmb) a rw [mem_uncontracted_iff_not_contracted neg.mpr.right n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zhz':(∀ p ∈ ↑c, z ∉ p) ∧ z ≠ ↑j⊢ ∀ a ∈ ↑c, i.succAbove z ∉ (Finset.mapEmbedding i.succAboveEmb) a neg.mpr.right n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zhz':(∀ p ∈ ↑c, z ∉ p) ∧ z ≠ ↑j⊢ ∀ a ∈ ↑c, i.succAbove z ∉ (Finset.mapEmbedding i.succAboveEmb) a] at hz'neg.mpr.right n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedz:Fin nhjz:¬↑j = zhz':(∀ p ∈ ↑c, z ∉ p) ∧ z ≠ ↑j⊢ ∀ a ∈ ↑c, i.succAbove z ∉ (Finset.mapEmbedding i.succAboveEmb) a
exact fun a ha hc => hz'.1 a ha ((Finset.mem_map' (i.succAboveEmb)).mp hc) All goals completed! 🐙lemma insertAndContractNat_some_uncontracted (c : WickContraction n) (i : Fin n.succ)
(j : c.uncontracted) :
(insertAndContractNat c i (some j)).uncontracted =
(c.uncontracted.erase j).map i.succAboveEmb := by n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracted⊢ (c.insertAndContractNat i (some j)).uncontracted = Finset.map i.succAboveEmb (c.uncontracted.erase ↑j)
ext a n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracteda:Fin n.succ⊢ a ∈ (c.insertAndContractNat i (some j)).uncontracted ↔ a ∈ Finset.map i.succAboveEmb (c.uncontracted.erase ↑j)
simp only [Nat.succ_eq_add_one, mem_uncontracted_insertAndContractNat_some_iff, ne_eq,
Finset.map_erase, Fin.succAboveEmb_apply, Finset.mem_erase, Finset.mem_map] n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracteda:Fin n.succ⊢ (∃ z, a = i.succAbove z ∧ z ∈ c.uncontracted ∧ ¬z = ↑j) ↔
¬a = i.succAbove ↑j ∧ ∃ a_1 ∈ c.uncontracted, i.succAbove a_1 = a
grind [Fin.succAbove_right_inj] All goals completed! 🐙Insert and getDual?
set_option backward.isDefEq.respectTransparency false in
lemma insertAndContractNat_none_getDual?_isNone (c : WickContraction n) (i : Fin n.succ) :
((insertAndContractNat c i none).getDual? i).isNone := by n:ℕc:WickContraction ni:Fin n.succ⊢ ((c.insertAndContractNat i none).getDual? i).isNone = true
simp [Option.isNone_iff_eq_none, getDual?_eq_none_iff_mem_uncontracted] All goals completed! 🐙set_option backward.isDefEq.respectTransparency false in
@[simp]
lemma insertAndContractNat_none_getDual?_eq_none (c : WickContraction n) (i : Fin n.succ) :
(insertAndContractNat c i none).getDual? i = none := by n:ℕc:WickContraction ni:Fin n.succ⊢ (c.insertAndContractNat i none).getDual? i = none
simp [getDual?_eq_none_iff_mem_uncontracted] All goals completed! 🐙@[simp]
lemma insertAndContractNat_succAbove_getDual?_eq_none_iff (c : WickContraction n) (i : Fin n.succ)
(j : Fin n) :
(insertAndContractNat c i none).getDual? (i.succAbove j) = none ↔ c.getDual? j = none := by n:ℕc:WickContraction ni:Fin n.succj:Fin n⊢ (c.insertAndContractNat i none).getDual? (i.succAbove j) = none ↔ c.getDual? j = none
simpa [uncontracted] using insertAndContractNat_succAbove_mem_uncontracted_iff c i j All goals completed! 🐙@[simp]
lemma insertAndContractNat_succAbove_getDual?_isSome_iff (c : WickContraction n) (i : Fin n.succ)
(j : Fin n) :
((insertAndContractNat c i none).getDual? (i.succAbove j)).isSome ↔ (c.getDual? j).isSome := by n:ℕc:WickContraction ni:Fin n.succj:Fin n⊢ ((c.insertAndContractNat i none).getDual? (i.succAbove j)).isSome = true ↔ (c.getDual? j).isSome = true
simp [Option.isSome_iff_ne_none] All goals completed! 🐙@[simp]
lemma insertAndContractNat_succAbove_getDual?_get (c : WickContraction n) (i : Fin n.succ)
(j : Fin n) (h : ((insertAndContractNat c i none).getDual? (i.succAbove j)).isSome) :
((insertAndContractNat c i none).getDual? (i.succAbove j)).get h =
i.succAbove ((c.getDual? j).get (by 𝓕:FieldSpecificationn:ℕc✝:WickContraction nc:WickContraction ni:Fin n.succj:Fin nh:((c.insertAndContractNat i none).getDual? (i.succAbove j)).isSome = true⊢ (c.getDual? j).isSome = true simpa using h All goals completed! 🐙)) := by n:ℕc:WickContraction ni:Fin n.succj:Fin nh:((c.insertAndContractNat i none).getDual? (i.succAbove j)).isSome = true⊢ ((c.insertAndContractNat i none).getDual? (i.succAbove j)).get h = i.succAbove ((c.getDual? j).get ⋯)
refine Option.get_of_mem h ((getDual?_eq_some_iff_mem _ _ _).mpr ?_) n:ℕc:WickContraction ni:Fin n.succj:Fin nh:((c.insertAndContractNat i none).getDual? (i.succAbove j)).isSome = true⊢ {i.succAbove j, i.succAbove ((c.getDual? j).get ⋯)} ∈ ↑(c.insertAndContractNat i none)
simp only [Nat.succ_eq_add_one, insertAndContractNat, Finset.mem_map,
RelEmbedding.coe_toEmbedding] n:ℕc:WickContraction ni:Fin n.succj:Fin nh:((c.insertAndContractNat i none).getDual? (i.succAbove j)).isSome = true⊢ ∃ a ∈ ↑c, (Finset.mapEmbedding i.succAboveEmb) a = {i.succAbove j, i.succAbove ((c.getDual? j).get ⋯)}
exact ⟨_, self_getDual?_get_mem c j (by n:ℕc:WickContraction ni:Fin n.succj:Fin nh:((c.insertAndContractNat i none).getDual? (i.succAbove j)).isSome = true⊢ (c.getDual? j).isSome = true simpa using h All goals completed! 🐙),
by n:ℕc:WickContraction ni:Fin n.succj:Fin nh:((c.insertAndContractNat i none).getDual? (i.succAbove j)).isSome = true⊢ (Finset.mapEmbedding i.succAboveEmb) {j, (c.getDual? j).get ⋯} = {i.succAbove j, i.succAbove ((c.getDual? j).get ⋯)} simp [Finset.mapEmbedding_apply] All goals completed! 🐙⟩
@[simp]
lemma insertAndContractNat_some_getDual?_eq (c : WickContraction n) (i : Fin n.succ)
(j : c.uncontracted) :
(insertAndContractNat c i (some j)).getDual? i = some (i.succAbove j) := by n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracted⊢ (c.insertAndContractNat i (some j)).getDual? i = some (i.succAbove ↑j)
rw [getDual?_eq_some_iff_mem n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracted⊢ {i, i.succAbove ↑j} ∈ ↑(c.insertAndContractNat i (some j)) n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracted⊢ {i, i.succAbove ↑j} ∈ ↑(c.insertAndContractNat i (some j))] n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracted⊢ {i, i.succAbove ↑j} ∈ ↑(c.insertAndContractNat i (some j))
simp [insertAndContractNat] All goals completed! 🐙lemma insertAndContractNat_some_getDual?_ne_none (c : WickContraction n) (i : Fin n.succ)
(j : c.uncontracted) (k : Fin n) (hkj : k ≠ j.1) :
(insertAndContractNat c i (some j)).getDual? (i.succAbove k) = none ↔ c.getDual? k = none := by n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedk:Fin nhkj:k ≠ ↑j⊢ (c.insertAndContractNat i (some j)).getDual? (i.succAbove k) = none ↔ c.getDual? k = none
simp [getDual?_eq_none_iff_mem_uncontracted, hkj] All goals completed! 🐙lemma insertAndContractNat_some_getDual?_ne_isSome (c : WickContraction n) (i : Fin n.succ)
(j : c.uncontracted) (k : Fin n) (hkj : k ≠ j.1) :
((insertAndContractNat c i (some j)).getDual? (i.succAbove k)).isSome ↔
(c.getDual? k).isSome := by n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedk:Fin nhkj:k ≠ ↑j⊢ ((c.insertAndContractNat i (some j)).getDual? (i.succAbove k)).isSome = true ↔ (c.getDual? k).isSome = true
simp [Option.isSome_iff_ne_none, insertAndContractNat_some_getDual?_ne_none c i j k hkj] All goals completed! 🐙lemma insertAndContractNat_some_getDual?_ne_isSome_get (c : WickContraction n) (i : Fin n.succ)
(j : c.uncontracted) (k : Fin n) (hkj : k ≠ j.1)
(h : ((insertAndContractNat c i (some j)).getDual? (i.succAbove k)).isSome) :
((insertAndContractNat c i (some j)).getDual? (i.succAbove k)).get h =
i.succAbove ((c.getDual? k).get
(by 𝓕:FieldSpecificationn:ℕc✝:WickContraction nc:WickContraction ni:Fin n.succj:↥c.uncontractedk:Fin nhkj:k ≠ ↑jh:((c.insertAndContractNat i (some j)).getDual? (i.succAbove k)).isSome = true⊢ (c.getDual? k).isSome = true simpa [hkj, insertAndContractNat_some_getDual?_ne_isSome] using h All goals completed! 🐙)) := by n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedk:Fin nhkj:k ≠ ↑jh:((c.insertAndContractNat i (some j)).getDual? (i.succAbove k)).isSome = true⊢ ((c.insertAndContractNat i (some j)).getDual? (i.succAbove k)).get h = i.succAbove ((c.getDual? k).get ⋯)
refine Option.get_of_mem h ((getDual?_eq_some_iff_mem _ _ _).mpr ?_) n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedk:Fin nhkj:k ≠ ↑jh:((c.insertAndContractNat i (some j)).getDual? (i.succAbove k)).isSome = true⊢ {i.succAbove k, i.succAbove ((c.getDual? k).get ⋯)} ∈ ↑(c.insertAndContractNat i (some j))
simp only [Nat.succ_eq_add_one, insertAndContractNat, Finset.mem_insert,
Finset.mem_map, RelEmbedding.coe_toEmbedding] n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedk:Fin nhkj:k ≠ ↑jh:((c.insertAndContractNat i (some j)).getDual? (i.succAbove k)).isSome = true⊢ {i.succAbove k, i.succAbove ((c.getDual? k).get ⋯)} = {i, i.succAbove ↑j} ∨
∃ a ∈ ↑c, (Finset.mapEmbedding i.succAboveEmb) a = {i.succAbove k, i.succAbove ((c.getDual? k).get ⋯)}
exact Or.inr ⟨_, self_getDual?_get_mem c k
(by n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedk:Fin nhkj:k ≠ ↑jh:((c.insertAndContractNat i (some j)).getDual? (i.succAbove k)).isSome = true⊢ (c.getDual? k).isSome = true simpa [hkj, insertAndContractNat_some_getDual?_ne_isSome] using h All goals completed! 🐙),
by n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedk:Fin nhkj:k ≠ ↑jh:((c.insertAndContractNat i (some j)).getDual? (i.succAbove k)).isSome = true⊢ (Finset.mapEmbedding i.succAboveEmb) {k, (c.getDual? k).get ⋯} = {i.succAbove k, i.succAbove ((c.getDual? k).get ⋯)} simp [Finset.mapEmbedding_apply] All goals completed! 🐙⟩
@[simp]
lemma insertAndContractNat_some_getDual?_of_neq (c : WickContraction n) (i : Fin n.succ)
(j : c.uncontracted) (k : Fin n) (hkj : k ≠ j.1) :
(insertAndContractNat c i (some j)).getDual? (i.succAbove k) =
Option.map i.succAbove (c.getDual? k) := by n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedk:Fin nhkj:k ≠ ↑j⊢ (c.insertAndContractNat i (some j)).getDual? (i.succAbove k) = Option.map i.succAbove (c.getDual? k)
rcases hc : c.getDual? k with _ | d none n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedk:Fin nhkj:k ≠ ↑jhc:c.getDual? k = none⊢ (c.insertAndContractNat i (some j)).getDual? (i.succAbove k) = Option.map i.succAbove nonesome n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedk:Fin nhkj:k ≠ ↑jd:Fin nhc:c.getDual? k = some d⊢ (c.insertAndContractNat i (some j)).getDual? (i.succAbove k) = Option.map i.succAbove (some d)
· none n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedk:Fin nhkj:k ≠ ↑jhc:c.getDual? k = none⊢ (c.insertAndContractNat i (some j)).getDual? (i.succAbove k) = Option.map i.succAbove none simp [hc, insertAndContractNat_some_getDual?_ne_none c i j k hkj] All goals completed! 🐙
· some n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedk:Fin nhkj:k ≠ ↑jd:Fin nhc:c.getDual? k = some d⊢ (c.insertAndContractNat i (some j)).getDual? (i.succAbove k) = Option.map i.succAbove (some d) rw [Option.map_some, some n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedk:Fin nhkj:k ≠ ↑jd:Fin nhc:c.getDual? k = some d⊢ (c.insertAndContractNat i (some j)).getDual? (i.succAbove k) = some (i.succAbove d) some n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedk:Fin nhkj:k ≠ ↑jd:Fin nhc:c.getDual? k = some d⊢ {i.succAbove k, i.succAbove d} ∈ ↑(c.insertAndContractNat i (some j)) getDual?_eq_some_iff_mem some n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedk:Fin nhkj:k ≠ ↑jd:Fin nhc:c.getDual? k = some d⊢ {i.succAbove k, i.succAbove d} ∈ ↑(c.insertAndContractNat i (some j)) some n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedk:Fin nhkj:k ≠ ↑jd:Fin nhc:c.getDual? k = some d⊢ {i.succAbove k, i.succAbove d} ∈ ↑(c.insertAndContractNat i (some j))]some n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedk:Fin nhkj:k ≠ ↑jd:Fin nhc:c.getDual? k = some d⊢ {i.succAbove k, i.succAbove d} ∈ ↑(c.insertAndContractNat i (some j))
simp only [Nat.succ_eq_add_one, insertAndContractNat, Finset.mem_insert,
Finset.mem_map, RelEmbedding.coe_toEmbedding] some n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedk:Fin nhkj:k ≠ ↑jd:Fin nhc:c.getDual? k = some d⊢ {i.succAbove k, i.succAbove d} = {i, i.succAbove ↑j} ∨
∃ a ∈ ↑c, (Finset.mapEmbedding i.succAboveEmb) a = {i.succAbove k, i.succAbove d}
exact Or.inr ⟨{k, d}, (c.getDual?_eq_some_iff_mem k d).mp hc,
by n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontractedk:Fin nhkj:k ≠ ↑jd:Fin nhc:c.getDual? k = some d⊢ (Finset.mapEmbedding i.succAboveEmb) {k, d} = {i.succAbove k, i.succAbove d} simp [Finset.mapEmbedding_apply] All goals completed! 🐙⟩Interaction with erase.
@[simp]
lemma insertAndContractNat_erase (c : WickContraction n) (i : Fin n.succ)
(j : Option c.uncontracted) : erase (insertAndContractNat c i j) i = c := by n:ℕc:WickContraction ni:Fin n.succj:Option ↥c.uncontracted⊢ (c.insertAndContractNat i j).erase i = c
refine Subtype.ext (Finset.ext fun a => ?_) n:ℕc:WickContraction ni:Fin n.succj:Option ↥c.uncontracteda:Finset (Fin n)⊢ a ∈ ↑((c.insertAndContractNat i j).erase i) ↔ a ∈ ↑c
simp only [erase, Nat.succ_eq_add_one, insertAndContractNat, Finset.mem_filter, Finset.mem_univ,
true_and] n:ℕc:WickContraction ni:Fin n.succj:Option ↥c.uncontracteda:Finset (Fin n)⊢ (Finset.map i.succAboveEmb a ∈
match j with
| none => Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c
| some j => insert {i, i.succAbove ↑j} (Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c)) ↔
a ∈ ↑c
match j with
| none => n:ℕc:WickContraction ni:Fin n.succj:Option ↥c.uncontracteda:Finset (Fin n)⊢ (Finset.map i.succAboveEmb a ∈
match none with
| none => Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c
| some j => insert {i, i.succAbove ↑j} (Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c)) ↔
a ∈ ↑c
simp [Finset.mapEmbedding_apply, Finset.map_inj] All goals completed! 🐙
| some j => n:ℕc:WickContraction ni:Fin n.succj✝:Option ↥c.uncontracteda:Finset (Fin n)j:↥c.uncontracted⊢ (Finset.map i.succAboveEmb a ∈
match some j with
| none => Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c
| some j => insert {i, i.succAbove ↑j} (Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c)) ↔
a ∈ ↑c
have hn : Finset.map i.succAboveEmb a ≠ {i, i.succAbove j} := fun h => by n:ℕc:WickContraction ni:Fin n.succj✝:Option ↥c.uncontracteda:Finset (Fin n)j:↥c.uncontractedh:Finset.map i.succAboveEmb a = {i, i.succAbove ↑j}⊢ False n:ℕc:WickContraction ni:Fin n.succj✝:Option ↥c.uncontracteda:Finset (Fin n)j:↥c.uncontractedhn:Finset.map i.succAboveEmb a ≠ {i, i.succAbove ↑j}⊢ (Finset.map i.succAboveEmb a ∈
match some j with
| none => Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c
| some j => insert {i, i.succAbove ↑j} (Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c)) ↔
a ∈ ↑c
have hi : i ∈ Finset.map i.succAboveEmb a := h ▸ Finset.mem_insert_self i _ n:ℕc:WickContraction ni:Fin n.succj✝:Option ↥c.uncontracteda:Finset (Fin n)j:↥c.uncontractedh:Finset.map i.succAboveEmb a = {i, i.succAbove ↑j}hi:i ∈ Finset.map i.succAboveEmb a⊢ False n:ℕc:WickContraction ni:Fin n.succj✝:Option ↥c.uncontracteda:Finset (Fin n)j:↥c.uncontractedhn:Finset.map i.succAboveEmb a ≠ {i, i.succAbove ↑j}⊢ (Finset.map i.succAboveEmb a ∈
match some j with
| none => Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c
| some j => insert {i, i.succAbove ↑j} (Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c)) ↔
a ∈ ↑c
simp [Fin.succAbove_ne] at hi n:ℕc:WickContraction ni:Fin n.succj✝:Option ↥c.uncontracteda:Finset (Fin n)j:↥c.uncontractedhn:Finset.map i.succAboveEmb a ≠ {i, i.succAbove ↑j}⊢ (Finset.map i.succAboveEmb a ∈
match some j with
| none => Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c
| some j => insert {i, i.succAbove ↑j} (Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c)) ↔
a ∈ ↑c n:ℕc:WickContraction ni:Fin n.succj✝:Option ↥c.uncontracteda:Finset (Fin n)j:↥c.uncontractedhn:Finset.map i.succAboveEmb a ≠ {i, i.succAbove ↑j}⊢ (Finset.map i.succAboveEmb a ∈
match some j with
| none => Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c
| some j => insert {i, i.succAbove ↑j} (Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c)) ↔
a ∈ ↑c
simp [Finset.mapEmbedding_apply, Finset.map_inj, hn] All goals completed! 🐙set_option backward.isDefEq.respectTransparency false in
lemma insertAndContractNat_getDualErase (c : WickContraction n) (i : Fin n.succ)
(j : Option c.uncontracted) : (insertAndContractNat c i j).getDualErase i =
uncontractedCongr (c := c) (c' := (c.insertAndContractNat i j).erase i) (by 𝓕:FieldSpecificationn:ℕc✝:WickContraction nc:WickContraction ni:Fin n.succj:Option ↥c.uncontracted⊢ c = (c.insertAndContractNat i j).erase i simp All goals completed! 🐙) j := by n:ℕc:WickContraction ni:Fin n.succj:Option ↥c.uncontracted⊢ (c.insertAndContractNat i j).getDualErase i = (uncontractedCongr ⋯) j
match n with
| 0 => n:ℕc:WickContraction 0i:Fin (Nat.succ 0)j:Option ↥c.uncontracted⊢ (c.insertAndContractNat i j).getDualErase i = (uncontractedCongr ⋯) j
fin_cases j «0» n:ℕc:WickContraction 0i:Fin (Nat.succ 0)⊢ (c.insertAndContractNat i none).getDualErase i = (uncontractedCongr ⋯) none
simp [getDualErase] All goals completed! 🐙
| Nat.succ n => n✝:ℕn:ℕc:WickContraction n.succi:Fin n.succ.succj:Option ↥c.uncontracted⊢ (c.insertAndContractNat i j).getDualErase i = (uncontractedCongr ⋯) j
match j with
| none => n✝:ℕn:ℕc:WickContraction n.succi:Fin n.succ.succj:Option ↥c.uncontracted⊢ (c.insertAndContractNat i none).getDualErase i = (uncontractedCongr ⋯) none
simp [getDualErase] All goals completed! 🐙
| some j => n✝:ℕn:ℕc:WickContraction n.succi:Fin n.succ.succj✝:Option ↥c.uncontractedj:↥c.uncontracted⊢ (c.insertAndContractNat i (some j)).getDualErase i = (uncontractedCongr ⋯) (some j)
simp only [Nat.succ_eq_add_one, getDualErase, insertAndContractNat_some_getDual?_eq,
Option.isSome_some, ↓reduceDIte, Option.get_some, predAboveI_succAbove,
uncontractedCongr_some, Option.some.injEq] n✝:ℕn:ℕc:WickContraction n.succi:Fin n.succ.succj✝:Option ↥c.uncontractedj:↥c.uncontracted⊢ ⟨↑j, ⋯⟩ = (Equiv.subtypeEquivRight ⋯) j
rfl All goals completed! 🐙
@[simp]
lemma erase_insert (c : WickContraction n.succ) (i : Fin n.succ) :
insertAndContractNat (erase c i) i (getDualErase c i) = c := by n:ℕc:WickContraction n.succi:Fin n.succ⊢ (c.erase i).insertAndContractNat i (c.getDualErase i) = c
match n with
| 0 => n:ℕc:WickContraction (Nat.succ 0)i:Fin (Nat.succ 0)⊢ (c.erase i).insertAndContractNat i (c.getDualErase i) = c
apply Subtype.ext n:ℕc:WickContraction (Nat.succ 0)i:Fin (Nat.succ 0)⊢ ↑((c.erase i).insertAndContractNat i (c.getDualErase i)) = ↑c
simp only [Nat.succ_eq_add_one, Nat.reduceAdd, insertAndContractNat, getDualErase] n:ℕc:WickContraction (Nat.succ 0)i:Fin (Nat.succ 0)⊢ Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑(c.erase i) = ↑c
ext a n:ℕc:WickContraction (Nat.succ 0)i:Fin (Nat.succ 0)a:Finset (Fin 1)⊢ a ∈ Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑(c.erase i) ↔ a ∈ ↑c
simp only [Finset.mem_map, RelEmbedding.coe_toEmbedding] n:ℕc:WickContraction (Nat.succ 0)i:Fin (Nat.succ 0)a:Finset (Fin 1)⊢ (∃ a_1 ∈ ↑(c.erase i), (Finset.mapEmbedding i.succAboveEmb) a_1 = a) ↔ a ∈ ↑c
constructor mp n:ℕc:WickContraction (Nat.succ 0)i:Fin (Nat.succ 0)a:Finset (Fin 1)⊢ (∃ a_1 ∈ ↑(c.erase i), (Finset.mapEmbedding i.succAboveEmb) a_1 = a) → a ∈ ↑cmpr n:ℕc:WickContraction (Nat.succ 0)i:Fin (Nat.succ 0)a:Finset (Fin 1)⊢ a ∈ ↑c → ∃ a_2 ∈ ↑(c.erase i), (Finset.mapEmbedding i.succAboveEmb) a_2 = a
· mp n:ℕc:WickContraction (Nat.succ 0)i:Fin (Nat.succ 0)a:Finset (Fin 1)⊢ (∃ a_1 ∈ ↑(c.erase i), (Finset.mapEmbedding i.succAboveEmb) a_1 = a) → a ∈ ↑c rintro ⟨a', ha', rfl⟩ mp n:ℕc:WickContraction (Nat.succ 0)i:Fin (Nat.succ 0)a':Finset (Fin 0)ha':a' ∈ ↑(c.erase i)⊢ (Finset.mapEmbedding i.succAboveEmb) a' ∈ ↑c
exact (Finset.mem_filter.mp ha').2 All goals completed! 🐙
· mpr n:ℕc:WickContraction (Nat.succ 0)i:Fin (Nat.succ 0)a:Finset (Fin 1)⊢ a ∈ ↑c → ∃ a_2 ∈ ↑(c.erase i), (Finset.mapEmbedding i.succAboveEmb) a_2 = a intro ha mpr n:ℕc:WickContraction (Nat.succ 0)i:Fin (Nat.succ 0)a:Finset (Fin 1)ha:a ∈ ↑c⊢ ∃ a_1 ∈ ↑(c.erase i), (Finset.mapEmbedding i.succAboveEmb) a_1 = a
obtain ⟨a', ha', rfl⟩ := c.mem_not_eq_erase_of_isNone (a := a) i (by n:ℕc:WickContraction (Nat.succ 0)i:Fin (Nat.succ 0)a:Finset (Fin 1)ha:a ∈ ↑c⊢ (c.getDual? i).isNone = true mpr n:ℕc:WickContraction (Nat.succ 0)i:Fin (Nat.succ 0)a':Finset (Fin 0)ha':a' ∈ ↑(c.erase i)ha:Finset.map i.succAboveEmb a' ∈ ↑c⊢ ∃ a ∈ ↑(c.erase i), (Finset.mapEmbedding i.succAboveEmb) a = Finset.map i.succAboveEmb a' simp All goals completed! 🐙 mpr n:ℕc:WickContraction (Nat.succ 0)i:Fin (Nat.succ 0)a':Finset (Fin 0)ha':a' ∈ ↑(c.erase i)ha:Finset.map i.succAboveEmb a' ∈ ↑c⊢ ∃ a ∈ ↑(c.erase i), (Finset.mapEmbedding i.succAboveEmb) a = Finset.map i.succAboveEmb a') hampr n:ℕc:WickContraction (Nat.succ 0)i:Fin (Nat.succ 0)a':Finset (Fin 0)ha':a' ∈ ↑(c.erase i)ha:Finset.map i.succAboveEmb a' ∈ ↑c⊢ ∃ a ∈ ↑(c.erase i), (Finset.mapEmbedding i.succAboveEmb) a = Finset.map i.succAboveEmb a'
exact ⟨a', ha', rfl⟩ All goals completed! 🐙
| Nat.succ n => n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succ⊢ (c.erase i).insertAndContractNat i (c.getDualErase i) = c
apply Subtype.ext n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succ⊢ ↑((c.erase i).insertAndContractNat i (c.getDualErase i)) = ↑c
by_cases hi : (c.getDual? i).isSome pos n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = true⊢ ↑((c.erase i).insertAndContractNat i (c.getDualErase i)) = ↑cneg n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:¬(c.getDual? i).isSome = true⊢ ↑((c.erase i).insertAndContractNat i (c.getDualErase i)) = ↑c
· pos n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = true⊢ ↑((c.erase i).insertAndContractNat i (c.getDualErase i)) = ↑c rw [insertAndContractNat_of_isSome pos n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = true⊢ insert {i, i.succAbove ↑((c.getDualErase i).get ?pos.hj✝)}
(Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑(c.erase i)) =
↑cpos.hj n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = true⊢ (c.getDualErase i).isSome = true pos n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = true⊢ insert {i, i.succAbove ↑((c.getDualErase i).get ?pos.hj✝)}
(Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑(c.erase i)) =
↑cpos.hj n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = true⊢ (c.getDualErase i).isSome = true]pos n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = true⊢ insert {i, i.succAbove ↑((c.getDualErase i).get ?pos.hj✝)}
(Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑(c.erase i)) =
↑cpos.hj n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = true⊢ (c.getDualErase i).isSome = true
simp only [Nat.succ_eq_add_one, getDualErase, hi, ↓reduceDIte, Option.get_some] pos n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = true⊢ insert {i, i.succAbove (predAboveI i ((c.getDual? i).get ⋯))}
(Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑(c.erase i)) =
↑cpos.hj n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = true⊢ (c.getDualErase i).isSome = true
rw [succsAbove_predAboveI pos n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = true⊢ insert {i, (c.getDual? i).get ⋯} (Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑(c.erase i)) = ↑cpos n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = true⊢ i ≠ (c.getDual? i).get ⋯pos.hj n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = true⊢ (c.getDualErase i).isSome = true pos n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = true⊢ insert {i, (c.getDual? i).get ⋯} (Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑(c.erase i)) = ↑cpos n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = true⊢ i ≠ (c.getDual? i).get ⋯pos.hj n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = true⊢ (c.getDualErase i).isSome = true]pos n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = true⊢ insert {i, (c.getDual? i).get ⋯} (Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑(c.erase i)) = ↑cpos n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = true⊢ i ≠ (c.getDual? i).get ⋯pos.hj n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = true⊢ (c.getDualErase i).isSome = true
· pos n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = true⊢ insert {i, (c.getDual? i).get ⋯} (Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑(c.erase i)) = ↑c ext a pos n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = truea:Finset (Fin (n + 1 + 1))⊢ a ∈ insert {i, (c.getDual? i).get ⋯} (Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑(c.erase i)) ↔ a ∈ ↑c
simp only [Finset.mem_insert, Finset.mem_map, RelEmbedding.coe_toEmbedding] pos n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = truea:Finset (Fin (n + 1 + 1))⊢ (a = {i, (c.getDual? i).get ⋯} ∨ ∃ a_1 ∈ ↑(c.erase i), (Finset.mapEmbedding i.succAboveEmb) a_1 = a) ↔ a ∈ ↑c
constructor pos.mp n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = truea:Finset (Fin (n + 1 + 1))⊢ (a = {i, (c.getDual? i).get ⋯} ∨ ∃ a_1 ∈ ↑(c.erase i), (Finset.mapEmbedding i.succAboveEmb) a_1 = a) → a ∈ ↑cpos.mpr n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = truea:Finset (Fin (n + 1 + 1))⊢ a ∈ ↑c → a = {i, (c.getDual? i).get ⋯} ∨ ∃ a_2 ∈ ↑(c.erase i), (Finset.mapEmbedding i.succAboveEmb) a_2 = a
· pos.mp n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = truea:Finset (Fin (n + 1 + 1))⊢ (a = {i, (c.getDual? i).get ⋯} ∨ ∃ a_1 ∈ ↑(c.erase i), (Finset.mapEmbedding i.succAboveEmb) a_1 = a) → a ∈ ↑c rintro (rfl | ⟨a', ha', rfl⟩) pos.mp.inl n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = true⊢ {i, (c.getDual? i).get ⋯} ∈ ↑cpos.mp.inr n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = truea':Finset (Fin (n + 1))ha':a' ∈ ↑(c.erase i)⊢ (Finset.mapEmbedding i.succAboveEmb) a' ∈ ↑c
· pos.mp.inl n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = true⊢ {i, (c.getDual? i).get ⋯} ∈ ↑c simp All goals completed! 🐙
· pos.mp.inr n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = truea':Finset (Fin (n + 1))ha':a' ∈ ↑(c.erase i)⊢ (Finset.mapEmbedding i.succAboveEmb) a' ∈ ↑c exact (Finset.mem_filter.mp ha').2 All goals completed! 🐙
· pos.mpr n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = truea:Finset (Fin (n + 1 + 1))⊢ a ∈ ↑c → a = {i, (c.getDual? i).get ⋯} ∨ ∃ a_2 ∈ ↑(c.erase i), (Finset.mapEmbedding i.succAboveEmb) a_2 = a intro ha pos.mpr n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = truea:Finset (Fin (n + 1 + 1))ha:a ∈ ↑c⊢ a = {i, (c.getDual? i).get ⋯} ∨ ∃ a_1 ∈ ↑(c.erase i), (Finset.mapEmbedding i.succAboveEmb) a_1 = a
by_cases hia : a = {i, (c.getDual? i).get hi} pos n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = truea:Finset (Fin (n + 1 + 1))ha:a ∈ ↑chia:a = {i, (c.getDual? i).get hi}⊢ a = {i, (c.getDual? i).get ⋯} ∨ ∃ a_1 ∈ ↑(c.erase i), (Finset.mapEmbedding i.succAboveEmb) a_1 = aneg n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = truea:Finset (Fin (n + 1 + 1))ha:a ∈ ↑chia:¬a = {i, (c.getDual? i).get hi}⊢ a = {i, (c.getDual? i).get ⋯} ∨ ∃ a_1 ∈ ↑(c.erase i), (Finset.mapEmbedding i.succAboveEmb) a_1 = a
· pos n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = truea:Finset (Fin (n + 1 + 1))ha:a ∈ ↑chia:a = {i, (c.getDual? i).get hi}⊢ a = {i, (c.getDual? i).get ⋯} ∨ ∃ a_1 ∈ ↑(c.erase i), (Finset.mapEmbedding i.succAboveEmb) a_1 = a exact Or.inl hia All goals completed! 🐙
· neg n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = truea:Finset (Fin (n + 1 + 1))ha:a ∈ ↑chia:¬a = {i, (c.getDual? i).get hi}⊢ a = {i, (c.getDual? i).get ⋯} ∨ ∃ a_1 ∈ ↑(c.erase i), (Finset.mapEmbedding i.succAboveEmb) a_1 = a obtain ⟨a', ha', rfl⟩ := c.mem_not_eq_erase_of_isSome (a := a) i hi ha hia neg n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = truea':Finset (Fin (n + 1))ha':a' ∈ ↑(c.erase i)ha:Finset.map i.succAboveEmb a' ∈ ↑chia:¬Finset.map i.succAboveEmb a' = {i, (c.getDual? i).get hi}⊢ Finset.map i.succAboveEmb a' = {i, (c.getDual? i).get ⋯} ∨
∃ a ∈ ↑(c.erase i), (Finset.mapEmbedding i.succAboveEmb) a = Finset.map i.succAboveEmb a'
exact Or.inr ⟨a', ha', rfl⟩ All goals completed! 🐙
· pos n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = true⊢ i ≠ (c.getDual? i).get ⋯ simp All goals completed! 🐙
· pos.hj n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:(c.getDual? i).isSome = true⊢ (c.getDualErase i).isSome = true exact (getDualErase_isSome_iff_getDual?_isSome c i).mpr hi All goals completed! 🐙
· neg n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:¬(c.getDual? i).isSome = true⊢ ↑((c.erase i).insertAndContractNat i (c.getDualErase i)) = ↑c simp only [Nat.succ_eq_add_one, insertAndContractNat, getDualErase, hi, Bool.false_eq_true,
↓reduceDIte] neg n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:¬(c.getDual? i).isSome = true⊢ Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑(c.erase i) = ↑c
ext a neg n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:¬(c.getDual? i).isSome = truea:Finset (Fin (n + 1 + 1))⊢ a ∈ Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑(c.erase i) ↔ a ∈ ↑c
simp only [Finset.mem_map, RelEmbedding.coe_toEmbedding] neg n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:¬(c.getDual? i).isSome = truea:Finset (Fin (n + 1 + 1))⊢ (∃ a_1 ∈ ↑(c.erase i), (Finset.mapEmbedding i.succAboveEmb) a_1 = a) ↔ a ∈ ↑c
constructor neg.mp n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:¬(c.getDual? i).isSome = truea:Finset (Fin (n + 1 + 1))⊢ (∃ a_1 ∈ ↑(c.erase i), (Finset.mapEmbedding i.succAboveEmb) a_1 = a) → a ∈ ↑cneg.mpr n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:¬(c.getDual? i).isSome = truea:Finset (Fin (n + 1 + 1))⊢ a ∈ ↑c → ∃ a_2 ∈ ↑(c.erase i), (Finset.mapEmbedding i.succAboveEmb) a_2 = a
· neg.mp n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:¬(c.getDual? i).isSome = truea:Finset (Fin (n + 1 + 1))⊢ (∃ a_1 ∈ ↑(c.erase i), (Finset.mapEmbedding i.succAboveEmb) a_1 = a) → a ∈ ↑c rintro ⟨a', ha', rfl⟩ neg.mp n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:¬(c.getDual? i).isSome = truea':Finset (Fin (n + 1))ha':a' ∈ ↑(c.erase i)⊢ (Finset.mapEmbedding i.succAboveEmb) a' ∈ ↑c
exact (Finset.mem_filter.mp ha').2 All goals completed! 🐙
· neg.mpr n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:¬(c.getDual? i).isSome = truea:Finset (Fin (n + 1 + 1))⊢ a ∈ ↑c → ∃ a_2 ∈ ↑(c.erase i), (Finset.mapEmbedding i.succAboveEmb) a_2 = a intro ha neg.mpr n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:¬(c.getDual? i).isSome = truea:Finset (Fin (n + 1 + 1))ha:a ∈ ↑c⊢ ∃ a_1 ∈ ↑(c.erase i), (Finset.mapEmbedding i.succAboveEmb) a_1 = a
obtain ⟨a', ha', rfl⟩ := c.mem_not_eq_erase_of_isNone (a := a) i (by n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:¬(c.getDual? i).isSome = truea:Finset (Fin (n + 1 + 1))ha:a ∈ ↑c⊢ (c.getDual? i).isNone = true neg.mpr n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:¬(c.getDual? i).isSome = truea':Finset (Fin (n + 1))ha':a' ∈ ↑(c.erase i)ha:Finset.map i.succAboveEmb a' ∈ ↑c⊢ ∃ a ∈ ↑(c.erase i), (Finset.mapEmbedding i.succAboveEmb) a = Finset.map i.succAboveEmb a' simpa using hi All goals completed! 🐙neg.mpr n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:¬(c.getDual? i).isSome = truea':Finset (Fin (n + 1))ha':a' ∈ ↑(c.erase i)ha:Finset.map i.succAboveEmb a' ∈ ↑c⊢ ∃ a ∈ ↑(c.erase i), (Finset.mapEmbedding i.succAboveEmb) a = Finset.map i.succAboveEmb a') haneg.mpr n✝:ℕn:ℕc:WickContraction n.succ.succi:Fin n.succ.succhi:¬(c.getDual? i).isSome = truea':Finset (Fin (n + 1))ha':a' ∈ ↑(c.erase i)ha:Finset.map i.succAboveEmb a' ∈ ↑c⊢ ∃ a ∈ ↑(c.erase i), (Finset.mapEmbedding i.succAboveEmb) a = Finset.map i.succAboveEmb a'
exact ⟨a', ha', rfl⟩ All goals completed! 🐙
Lifts a contraction in c to a contraction in (c.insert i j).
def insertLift {c : WickContraction n} (i : Fin n.succ) (j : Option (c.uncontracted))
(a : c.1) : (c.insertAndContractNat i j).1 := ⟨a.1.map (Fin.succAboveEmb i), by 𝓕:FieldSpecificationn:ℕc✝:WickContraction nc:WickContraction ni:Fin n.succj:Option ↥c.uncontracteda:↥↑c⊢ Finset.map i.succAboveEmb ↑a ∈ ↑(c.insertAndContractNat i j)
simp only [Nat.succ_eq_add_one, insertAndContractNat] 𝓕:FieldSpecificationn:ℕc✝:WickContraction nc:WickContraction ni:Fin n.succj:Option ↥c.uncontracteda:↥↑c⊢ Finset.map i.succAboveEmb ↑a ∈
match j with
| none => Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c
| some j => insert {i, i.succAbove ↑j} (Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c)
match j with
| none => 𝓕:FieldSpecificationn:ℕc✝:WickContraction nc:WickContraction ni:Fin n.succj:Option ↥c.uncontracteda:↥↑c⊢ Finset.map i.succAboveEmb ↑a ∈
match none with
| none => Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c
| some j => insert {i, i.succAbove ↑j} (Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c)
simp only [Finset.mem_map, RelEmbedding.coe_toEmbedding] 𝓕:FieldSpecificationn:ℕc✝:WickContraction nc:WickContraction ni:Fin n.succj:Option ↥c.uncontracteda:↥↑c⊢ ∃ a_1 ∈ ↑c, (Finset.mapEmbedding i.succAboveEmb) a_1 = Finset.map i.succAboveEmb ↑a
use a h 𝓕:FieldSpecificationn:ℕc✝:WickContraction nc:WickContraction ni:Fin n.succj:Option ↥c.uncontracteda:↥↑c⊢ ↑a ∈ ↑c ∧ (Finset.mapEmbedding i.succAboveEmb) ↑a = Finset.map i.succAboveEmb ↑a
simp only [a.2, true_and] h 𝓕:FieldSpecificationn:ℕc✝:WickContraction nc:WickContraction ni:Fin n.succj:Option ↥c.uncontracteda:↥↑c⊢ (Finset.mapEmbedding i.succAboveEmb) ↑a = Finset.map i.succAboveEmb ↑a
rfl All goals completed! 🐙
| some j => 𝓕:FieldSpecificationn:ℕc✝:WickContraction nc:WickContraction ni:Fin n.succj✝:Option ↥c.uncontracteda:↥↑cj:↥c.uncontracted⊢ Finset.map i.succAboveEmb ↑a ∈
match some j with
| none => Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c
| some j => insert {i, i.succAbove ↑j} (Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c)
simp only [Finset.mem_insert, Finset.mem_map, RelEmbedding.coe_toEmbedding] 𝓕:FieldSpecificationn:ℕc✝:WickContraction nc:WickContraction ni:Fin n.succj✝:Option ↥c.uncontracteda:↥↑cj:↥c.uncontracted⊢ Finset.map i.succAboveEmb ↑a = {i, i.succAbove ↑j} ∨
∃ a_1 ∈ ↑c, (Finset.mapEmbedding i.succAboveEmb) a_1 = Finset.map i.succAboveEmb ↑a
apply Or.inr 𝓕:FieldSpecificationn:ℕc✝:WickContraction nc:WickContraction ni:Fin n.succj✝:Option ↥c.uncontracteda:↥↑cj:↥c.uncontracted⊢ ∃ a_1 ∈ ↑c, (Finset.mapEmbedding i.succAboveEmb) a_1 = Finset.map i.succAboveEmb ↑a
use a h 𝓕:FieldSpecificationn:ℕc✝:WickContraction nc:WickContraction ni:Fin n.succj✝:Option ↥c.uncontracteda:↥↑cj:↥c.uncontracted⊢ ↑a ∈ ↑c ∧ (Finset.mapEmbedding i.succAboveEmb) ↑a = Finset.map i.succAboveEmb ↑a
simp only [a.2, true_and] h 𝓕:FieldSpecificationn:ℕc✝:WickContraction nc:WickContraction ni:Fin n.succj✝:Option ↥c.uncontracteda:↥↑cj:↥c.uncontracted⊢ (Finset.mapEmbedding i.succAboveEmb) ↑a = Finset.map i.succAboveEmb ↑a
rfl All goals completed! 🐙⟩lemma insertLift_injective {c : WickContraction n} (i : Fin n.succ) (j : Option (c.uncontracted)) :
Function.Injective (insertLift i j) := fun _ _ hab =>
Subtype.ext (Finset.map_injective _ (Subtype.ext_iff.mp hab))lemma insertLift_none_surjective {c : WickContraction n} (i : Fin n.succ) :
Function.Surjective (c.insertLift i none) := by n:ℕc:WickContraction ni:Fin n.succ⊢ Function.Surjective (insertLift i none)
intro a n:ℕc:WickContraction ni:Fin n.succa:↥↑(c.insertAndContractNat i none)⊢ ∃ a_1, insertLift i none a_1 = a
obtain ⟨a', ha', ha''⟩ := Finset.mem_map.mp a.2 n:ℕc:WickContraction ni:Fin n.succa:↥↑(c.insertAndContractNat i none)a':Finset (Fin n)ha':a' ∈ ↑cha'':(Finset.mapEmbedding i.succAboveEmb).toEmbedding a' = ↑a⊢ ∃ a_1, insertLift i none a_1 = a
exact ⟨⟨a', ha'⟩, Subtype.ext ha''⟩ All goals completed! 🐙lemma insertLift_none_bijective {c : WickContraction n} (i : Fin n.succ) :
Function.Bijective (c.insertLift i none) :=
⟨insertLift_injective i none, insertLift_none_surjective i⟩@[simp]
lemma insertAndContractNat_fstFieldOfContract (c : WickContraction n) (i : Fin n.succ)
(j : Option (c.uncontracted)) (a : c.1) :
(c.insertAndContractNat i j).fstFieldOfContract (insertLift i j a) =
i.succAbove (c.fstFieldOfContract a) :=
(c.insertAndContractNat i j).eq_fstFieldOfContract_of_mem (insertLift i j a)
(i.succAbove (c.fstFieldOfContract a)) (i.succAbove (c.sndFieldOfContract a))
(Finset.mem_map_of_mem _ (fstFieldOfContract_mem c a))
(Finset.mem_map_of_mem _ (sndFieldOfContract_mem c a))
(Fin.succAbove_lt_succAbove_iff.mpr (fstFieldOfContract_lt_sndFieldOfContract c a))@[simp]
lemma insertAndContractNat_sndFieldOfContract (c : WickContraction n) (i : Fin n.succ)
(j : Option (c.uncontracted)) (a : c.1) :
(c.insertAndContractNat i j).sndFieldOfContract (insertLift i j a) =
i.succAbove (c.sndFieldOfContract a) :=
(c.insertAndContractNat i j).eq_sndFieldOfContract_of_mem (insertLift i j a)
(i.succAbove (c.fstFieldOfContract a)) (i.succAbove (c.sndFieldOfContract a))
(Finset.mem_map_of_mem _ (fstFieldOfContract_mem c a))
(Finset.mem_map_of_mem _ (sndFieldOfContract_mem c a))
(Fin.succAbove_lt_succAbove_iff.mpr (fstFieldOfContract_lt_sndFieldOfContract c a))
Given a contracted pair for a Wick contraction WickContraction n, the
corresponding contracted pair of a wick contraction (c.insert i (some j)) formed
by inserting an element i into the contraction.
def insertLiftSome {c : WickContraction n} (i : Fin n.succ) (j : c.uncontracted)
(a : Unit ⊕ c.1) : (c.insertAndContractNat i (some j)).1 :=
match a with
| Sum.inl () => ⟨{i, i.succAbove j}, by 𝓕:FieldSpecificationn:ℕc✝:WickContraction nc:WickContraction ni:Fin n.succj:↥c.uncontracteda:Unit ⊕ ↥↑c⊢ {i, i.succAbove ↑j} ∈ ↑(c.insertAndContractNat i (some j))
simp [insertAndContractNat] All goals completed! 🐙⟩
| Sum.inr a => c.insertLift i j alemma insertLiftSome_injective {c : WickContraction n} (i : Fin n.succ) (j : c.uncontracted) :
Function.Injective (insertLiftSome i j) := by n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracted⊢ Function.Injective (insertLiftSome i j)
intro a b hab n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracteda:Unit ⊕ ↥↑cb:Unit ⊕ ↥↑chab:insertLiftSome i j a = insertLiftSome i j b⊢ a = b
match a, b with
| Sum.inl (), Sum.inl () => n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracteda:Unit ⊕ ↥↑cb:Unit ⊕ ↥↑chab:insertLiftSome i j (Sum.inl ()) = insertLiftSome i j (Sum.inl ())⊢ Sum.inl () = Sum.inl () rfl All goals completed! 🐙
| Sum.inl (), Sum.inr a | Sum.inr a, Sum.inl () => n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracteda✝:Unit ⊕ ↥↑cb:Unit ⊕ ↥↑ca:↥↑chab:insertLiftSome i j (Sum.inr a) = insertLiftSome i j (Sum.inl ())⊢ Sum.inr a = Sum.inl ()n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracteda✝:Unit ⊕ ↥↑cb:Unit ⊕ ↥↑ca:↥↑chab:insertLiftSome i j (Sum.inl ()) = insertLiftSome i j (Sum.inr a)⊢ Sum.inl () = Sum.inr a
simp only [Nat.succ_eq_add_one, insertLiftSome, insertLift, Subtype.mk.injEq] at hab n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracteda✝:Unit ⊕ ↥↑cb:Unit ⊕ ↥↑ca:↥↑chab:Finset.map i.succAboveEmb ↑a = {i, i.succAbove ↑j}⊢ Sum.inr a = Sum.inl ()
have hi : i ∈ Finset.map (Fin.succAboveEmb i) a.1 := hab ▸ Finset.mem_insert_self i _ n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracteda✝:Unit ⊕ ↥↑cb:Unit ⊕ ↥↑ca:↥↑chab:Finset.map i.succAboveEmb ↑a = {i, i.succAbove ↑j}hi:i ∈ Finset.map i.succAboveEmb ↑a⊢ Sum.inr a = Sum.inl ()
simp [Fin.succAbove_ne] at hi All goals completed! 🐙
| Sum.inr a, Sum.inr b => n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracteda✝:Unit ⊕ ↥↑cb✝:Unit ⊕ ↥↑ca:↥↑cb:↥↑chab:insertLiftSome i j (Sum.inr a) = insertLiftSome i j (Sum.inr b)⊢ Sum.inr a = Sum.inr b
exact congrArg Sum.inr (insertLift_injective i (some j) hab) All goals completed! 🐙lemma insertLiftSome_surjective {c : WickContraction n} (i : Fin n.succ) (j : c.uncontracted) :
Function.Surjective (insertLiftSome i j) := by n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracted⊢ Function.Surjective (insertLiftSome i j)
intro a n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracteda:↥↑(c.insertAndContractNat i (some j))⊢ ∃ a_1, insertLiftSome i j a_1 = a
rcases Finset.mem_insert.mp a.2 with ha | ha inl n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracteda:↥↑(c.insertAndContractNat i (some j))ha:↑a = {i, i.succAbove ↑j}⊢ ∃ a_1, insertLiftSome i j a_1 = ainr n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracteda:↥↑(c.insertAndContractNat i (some j))ha:↑a ∈ Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c⊢ ∃ a_1, insertLiftSome i j a_1 = a
· inl n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracteda:↥↑(c.insertAndContractNat i (some j))ha:↑a = {i, i.succAbove ↑j}⊢ ∃ a_1, insertLiftSome i j a_1 = a exact ⟨Sum.inl (), Subtype.ext ha.symm⟩ All goals completed! 🐙
· inr n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracteda:↥↑(c.insertAndContractNat i (some j))ha:↑a ∈ Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c⊢ ∃ a_1, insertLiftSome i j a_1 = a obtain ⟨a', ha', ha''⟩ := Finset.mem_map.mp ha inr n:ℕc:WickContraction ni:Fin n.succj:↥c.uncontracteda:↥↑(c.insertAndContractNat i (some j))ha:↑a ∈ Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑ca':Finset (Fin n)ha':a' ∈ ↑cha'':(Finset.mapEmbedding i.succAboveEmb).toEmbedding a' = ↑a⊢ ∃ a_1, insertLiftSome i j a_1 = a
exact ⟨Sum.inr ⟨a', ha'⟩, Subtype.ext ha''⟩ All goals completed! 🐙lemma insertLiftSome_bijective {c : WickContraction n} (i : Fin n.succ) (j : c.uncontracted) :
Function.Bijective (insertLiftSome i j) :=
⟨insertLiftSome_injective i j, insertLiftSome_surjective i j⟩insertAndContractNat c i none and injection
set_option backward.isDefEq.respectTransparency false in
lemma insertAndContractNat_injective (i : Fin n.succ) :
Function.Injective (fun c => insertAndContractNat c i none) := fun _ _ hc =>
Subtype.ext (by n:ℕi:Fin n.succx✝¹:WickContraction nx✝:WickContraction nhc:(fun c => c.insertAndContractNat i none) x✝¹ = (fun c => c.insertAndContractNat i none) x✝⊢ ↑x✝¹ = ↑x✝ simpa [insertAndContractNat] using Subtype.ext_iff.mp hc All goals completed! 🐙)
lemma insertAndContractNat_surjective_on_nodual (i : Fin n.succ)
(c : WickContraction n.succ) (hc : c.getDual? i = none) :
∃ c', insertAndContractNat c' i none = c := by n:ℕi:Fin n.succc:WickContraction n.succhc:c.getDual? i = none⊢ ∃ c', c'.insertAndContractNat i none = c
have h0 : c.getDualErase i = none := Option.not_isSome_iff_eq_none.mp (by n:ℕi:Fin n.succc:WickContraction n.succhc:c.getDual? i = none⊢ ¬(c.getDualErase i).isSome = true n:ℕi:Fin n.succc:WickContraction n.succhc:c.getDual? i = noneh0:c.getDualErase i = none⊢ ∃ c', c'.insertAndContractNat i none = c simp [hc] All goals completed! 🐙 n:ℕi:Fin n.succc:WickContraction n.succhc:c.getDual? i = noneh0:c.getDualErase i = none⊢ ∃ c', c'.insertAndContractNat i none = c) n:ℕi:Fin n.succc:WickContraction n.succhc:c.getDual? i = noneh0:c.getDualErase i = none⊢ ∃ c', c'.insertAndContractNat i none = c
exact ⟨c.erase i, h0 ▸ erase_insert c i⟩ All goals completed! 🐙lemma insertAndContractNat_bijective (i : Fin n.succ) :
Function.Bijective (fun c => (⟨insertAndContractNat c i none, by 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction n⊢ (c.insertAndContractNat i none).getDual? i = none simp All goals completed! 🐙⟩ :
{c : WickContraction n.succ // c.getDual? i = none})) := by n:ℕi:Fin n.succ⊢ Function.Bijective fun c => ⟨c.insertAndContractNat i none, ⋯⟩
refine ⟨fun a b hab => insertAndContractNat_injective i (by n:ℕi:Fin n.succa:WickContraction nb:WickContraction nhab:(fun c => ⟨c.insertAndContractNat i none, ⋯⟩) a = (fun c => ⟨c.insertAndContractNat i none, ⋯⟩) b⊢ (fun c => c.insertAndContractNat i none) a = (fun c => c.insertAndContractNat i none) b simpa using hab All goals completed! 🐙), fun c => ?_⟩
exact (insertAndContractNat_surjective_on_nodual i c c.2).imp fun _ => Subtype.ext All goals completed! 🐙