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.ExtractEquivCardinality of Wick contractions
@[expose] public sectionn:ℕe2:WickContraction n.succ ≃ { c // (c.getDual? 0).isSome = true } ⊕ { c // ¬(c.getDual? 0).isSome = true } := (Equiv.sumCompl fun c => (c.getDual? 0).isSome = true).symm⊢ Fintype.card ({ c // (c.getDual? 0).isSome = true } ⊕ { c // ¬(c.getDual? 0).isSome = true }) =
Fintype.card { c // ¬(c.getDual? 0).isSome = true } + Fintype.card { c // (c.getDual? 0).isSome = true }
simp [add_comm] All goals completed! 🐙lemma wickContraction_zero_none_card :
Fintype.card {c : WickContraction n.succ // ¬ (c.getDual? 0).isSome} =
Fintype.card (WickContraction n) := by n:ℕ⊢ Fintype.card { c // ¬(c.getDual? 0).isSome = true } = Fintype.card (WickContraction n)
simp only [succ_eq_add_one, Bool.not_eq_true, Option.isSome_eq_false_iff,
Option.isNone_iff_eq_none] n:ℕ⊢ Fintype.card { c // c.getDual? 0 = none } = Fintype.card (WickContraction n)
symm n:ℕ⊢ Fintype.card (WickContraction n) = Fintype.card { c // c.getDual? 0 = none }
exact Fintype.card_of_bijective (insertAndContractNat_bijective 0) All goals completed! 🐙
lemma wickContraction_zero_some_eq_sum :
Fintype.card {c : WickContraction n.succ // (c.getDual? 0).isSome} =
∑ i, Fintype.card {c : WickContraction n.succ // (c.getDual? 0).isSome ∧
∀ (h : (c.getDual? 0).isSome), (c.getDual? 0).get h = Fin.succ i} := by n:ℕ⊢ Fintype.card { c // (c.getDual? 0).isSome = true } =
∑ i,
Fintype.card
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ }
let e1 : {c : WickContraction n.succ // (c.getDual? 0).isSome} ≃
Σ i, {c : WickContraction n.succ // (c.getDual? 0).isSome ∧
∀ (h : (c.getDual? 0).isSome), (c.getDual? 0).get h = Fin.succ i} := {
toFun c := ⟨((c.1.getDual? 0).get c.2).pred (by n:ℕc:{ c // (c.getDual? 0).isSome = true }⊢ ((↑c).getDual? 0).get ⋯ ≠ 0 n:ℕe1:{ c // (c.getDual? 0).isSome = true } ≃
(i : Fin n) ×
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ } :=
{ toFun := fun c => ⟨(((↑c).getDual? 0).get ⋯).pred ⋯, ⟨↑c, ⋯⟩⟩, invFun := fun c => ⟨↑c.snd, ⋯⟩, left_inv := ⋯,
right_inv := ⋯ }⊢ Fintype.card { c // (c.getDual? 0).isSome = true } =
∑ i,
Fintype.card
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ } simp All goals completed! 🐙 n:ℕe1:{ c // (c.getDual? 0).isSome = true } ≃
(i : Fin n) ×
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ } :=
{ toFun := fun c => ⟨(((↑c).getDual? 0).get ⋯).pred ⋯, ⟨↑c, ⋯⟩⟩, invFun := fun c => ⟨↑c.snd, ⋯⟩, left_inv := ⋯,
right_inv := ⋯ }⊢ Fintype.card { c // (c.getDual? 0).isSome = true } =
∑ i,
Fintype.card
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ }),
⟨c.1, ⟨c.2, by n:ℕc:{ c // (c.getDual? 0).isSome = true }⊢ ∀ (h : ((↑c).getDual? 0).isSome = true), ((↑c).getDual? 0).get h = ((((↑c).getDual? 0).get ⋯).pred ⋯).succ n:ℕe1:{ c // (c.getDual? 0).isSome = true } ≃
(i : Fin n) ×
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ } :=
{ toFun := fun c => ⟨(((↑c).getDual? 0).get ⋯).pred ⋯, ⟨↑c, ⋯⟩⟩, invFun := fun c => ⟨↑c.snd, ⋯⟩, left_inv := ⋯,
right_inv := ⋯ }⊢ Fintype.card { c // (c.getDual? 0).isSome = true } =
∑ i,
Fintype.card
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ } simp All goals completed! 🐙 n:ℕe1:{ c // (c.getDual? 0).isSome = true } ≃
(i : Fin n) ×
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ } :=
{ toFun := fun c => ⟨(((↑c).getDual? 0).get ⋯).pred ⋯, ⟨↑c, ⋯⟩⟩, invFun := fun c => ⟨↑c.snd, ⋯⟩, left_inv := ⋯,
right_inv := ⋯ }⊢ Fintype.card { c // (c.getDual? 0).isSome = true } =
∑ i,
Fintype.card
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ }⟩⟩⟩
invFun c := ⟨c.2, c.2.2.1⟩
left_inv c := rfl
right_inv c := by n:ℕc:(i : Fin n) ×
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ }⊢ (fun c => ⟨(((↑c).getDual? 0).get ⋯).pred ⋯, ⟨↑c, ⋯⟩⟩) ((fun c => ⟨↑c.snd, ⋯⟩) c) = c n:ℕe1:{ c // (c.getDual? 0).isSome = true } ≃
(i : Fin n) ×
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ } :=
{ toFun := fun c => ⟨(((↑c).getDual? 0).get ⋯).pred ⋯, ⟨↑c, ⋯⟩⟩, invFun := fun c => ⟨↑c.snd, ⋯⟩, left_inv := ⋯,
right_inv := ⋯ }⊢ Fintype.card { c // (c.getDual? 0).isSome = true } =
∑ i,
Fintype.card
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ }
ext a n:ℕc:(i : Fin n) ×
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ }⊢ ↑((fun c => ⟨(((↑c).getDual? 0).get ⋯).pred ⋯, ⟨↑c, ⋯⟩⟩) ((fun c => ⟨↑c.snd, ⋯⟩) c)).fst = ↑c.fsta n:ℕc:(i : Fin n) ×
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ }⊢ ↑((fun c => ⟨(((↑c).getDual? 0).get ⋯).pred ⋯, ⟨↑c, ⋯⟩⟩) ((fun c => ⟨↑c.snd, ⋯⟩) c)).snd = ↑c.snd n:ℕe1:{ c // (c.getDual? 0).isSome = true } ≃
(i : Fin n) ×
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ } :=
{ toFun := fun c => ⟨(((↑c).getDual? 0).get ⋯).pred ⋯, ⟨↑c, ⋯⟩⟩, invFun := fun c => ⟨↑c.snd, ⋯⟩, left_inv := ⋯,
right_inv := ⋯ }⊢ Fintype.card { c // (c.getDual? 0).isSome = true } =
∑ i,
Fintype.card
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ }
· a n:ℕc:(i : Fin n) ×
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ }⊢ ↑((fun c => ⟨(((↑c).getDual? 0).get ⋯).pred ⋯, ⟨↑c, ⋯⟩⟩) ((fun c => ⟨↑c.snd, ⋯⟩) c)).fst = ↑c.fst n:ℕe1:{ c // (c.getDual? 0).isSome = true } ≃
(i : Fin n) ×
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ } :=
{ toFun := fun c => ⟨(((↑c).getDual? 0).get ⋯).pred ⋯, ⟨↑c, ⋯⟩⟩, invFun := fun c => ⟨↑c.snd, ⋯⟩, left_inv := ⋯,
right_inv := ⋯ }⊢ Fintype.card { c // (c.getDual? 0).isSome = true } =
∑ i,
Fintype.card
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ } simp [c.2.2.2] All goals completed! 🐙 n:ℕe1:{ c // (c.getDual? 0).isSome = true } ≃
(i : Fin n) ×
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ } :=
{ toFun := fun c => ⟨(((↑c).getDual? 0).get ⋯).pred ⋯, ⟨↑c, ⋯⟩⟩, invFun := fun c => ⟨↑c.snd, ⋯⟩, left_inv := ⋯,
right_inv := ⋯ }⊢ Fintype.card { c // (c.getDual? 0).isSome = true } =
∑ i,
Fintype.card
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ }
· a n:ℕc:(i : Fin n) ×
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ }⊢ ↑((fun c => ⟨(((↑c).getDual? 0).get ⋯).pred ⋯, ⟨↑c, ⋯⟩⟩) ((fun c => ⟨↑c.snd, ⋯⟩) c)).snd = ↑c.snd n:ℕe1:{ c // (c.getDual? 0).isSome = true } ≃
(i : Fin n) ×
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ } :=
{ toFun := fun c => ⟨(((↑c).getDual? 0).get ⋯).pred ⋯, ⟨↑c, ⋯⟩⟩, invFun := fun c => ⟨↑c.snd, ⋯⟩, left_inv := ⋯,
right_inv := ⋯ }⊢ Fintype.card { c // (c.getDual? 0).isSome = true } =
∑ i,
Fintype.card
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ } rfl All goals completed! 🐙 n:ℕe1:{ c // (c.getDual? 0).isSome = true } ≃
(i : Fin n) ×
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ } :=
{ toFun := fun c => ⟨(((↑c).getDual? 0).get ⋯).pred ⋯, ⟨↑c, ⋯⟩⟩, invFun := fun c => ⟨↑c.snd, ⋯⟩, left_inv := ⋯,
right_inv := ⋯ }⊢ Fintype.card { c // (c.getDual? 0).isSome = true } =
∑ i,
Fintype.card
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ }} n:ℕe1:{ c // (c.getDual? 0).isSome = true } ≃
(i : Fin n) ×
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ } :=
{ toFun := fun c => ⟨(((↑c).getDual? 0).get ⋯).pred ⋯, ⟨↑c, ⋯⟩⟩, invFun := fun c => ⟨↑c.snd, ⋯⟩, left_inv := ⋯,
right_inv := ⋯ }⊢ Fintype.card { c // (c.getDual? 0).isSome = true } =
∑ i,
Fintype.card
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ }
rw [Fintype.card_congr e1 n:ℕe1:{ c // (c.getDual? 0).isSome = true } ≃
(i : Fin n) ×
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ } :=
{ toFun := fun c => ⟨(((↑c).getDual? 0).get ⋯).pred ⋯, ⟨↑c, ⋯⟩⟩, invFun := fun c => ⟨↑c.snd, ⋯⟩, left_inv := ⋯,
right_inv := ⋯ }⊢ Fintype.card
((i : Fin n) ×
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ }) =
∑ i,
Fintype.card
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ } n:ℕe1:{ c // (c.getDual? 0).isSome = true } ≃
(i : Fin n) ×
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ } :=
{ toFun := fun c => ⟨(((↑c).getDual? 0).get ⋯).pred ⋯, ⟨↑c, ⋯⟩⟩, invFun := fun c => ⟨↑c.snd, ⋯⟩, left_inv := ⋯,
right_inv := ⋯ }⊢ Fintype.card
((i : Fin n) ×
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ }) =
∑ i,
Fintype.card
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ }] n:ℕe1:{ c // (c.getDual? 0).isSome = true } ≃
(i : Fin n) ×
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ } :=
{ toFun := fun c => ⟨(((↑c).getDual? 0).get ⋯).pred ⋯, ⟨↑c, ⋯⟩⟩, invFun := fun c => ⟨↑c.snd, ⋯⟩, left_inv := ⋯,
right_inv := ⋯ }⊢ Fintype.card
((i : Fin n) ×
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ }) =
∑ i,
Fintype.card
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ }
simp All goals completed! 🐙lemma finset_succAbove_succ_disjoint (a : Finset (Fin n)) (i : Fin n.succ) :
Disjoint ((Finset.map (Fin.succEmb (n + 1))) ((Finset.map i.succAboveEmb) a)) {0, i.succ} := by n:ℕa:Finset (Fin n)i:Fin n.succ⊢ Disjoint (Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a)) {0, i.succ}
simp only [succ_eq_add_one, Finset.disjoint_insert_right, Finset.mem_map, Fin.succAboveEmb_apply,
Fin.coe_succEmb, exists_exists_and_eq_and, not_exists, not_and, Finset.disjoint_singleton_right,
Fin.succ_inj] n:ℕa:Finset (Fin n)i:Fin n.succ⊢ (∀ x ∈ a, ¬(i.succAbove x).succ = 0) ∧ ∀ x ∈ a, ¬i.succAbove x = i
apply And.intro left n:ℕa:Finset (Fin n)i:Fin n.succ⊢ ∀ x ∈ a, ¬(i.succAbove x).succ = 0right n:ℕa:Finset (Fin n)i:Fin n.succ⊢ ∀ x ∈ a, ¬i.succAbove x = i
· left n:ℕa:Finset (Fin n)i:Fin n.succ⊢ ∀ x ∈ a, ¬(i.succAbove x).succ = 0 exact fun x hx => Fin.succ_ne_zero (i.succAbove x) All goals completed! 🐙
· right n:ℕa:Finset (Fin n)i:Fin n.succ⊢ ∀ x ∈ a, ¬i.succAbove x = i exact fun x hx => Fin.succAbove_ne i x All goals completed! 🐙
The Wick contraction in WickContraction n.succ.succ formed by a Wick contraction
WickContraction n by inserting at the 0 and i.succ and contracting these two.
def consAddContract (i : Fin n.succ) (c : WickContraction n) :
WickContraction n.succ.succ :=
⟨(c.1.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding).map
(Finset.mapEmbedding (Fin.succEmb n.succ)).toEmbedding ∪ {{0, i.succ}}, by 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction n⊢ ∀
a ∈
Finset.map (Finset.mapEmbedding (Fin.succEmb n.succ)).toEmbedding
(Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c) ∪
{{0, i.succ}},
a.card = 2
intro a 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n.succ.succ)⊢ a ∈
Finset.map (Finset.mapEmbedding (Fin.succEmb n.succ)).toEmbedding
(Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c) ∪
{{0, i.succ}} →
a.card = 2
simp only [succ_eq_add_one, Finset.mem_union, Finset.mem_map,
RelEmbedding.coe_toEmbedding, exists_exists_and_eq_and, Finset.mem_singleton] 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n.succ.succ)⊢ (∃ a_1 ∈ ↑c, (Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a_1) = a) ∨
a = {0, i.succ} →
a.card = 2
intro h 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n.succ.succ)h:(∃ a_1 ∈ ↑c, (Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a_1) = a) ∨
a = {0, i.succ}⊢ a.card = 2
rcases h with h | h inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n.succ.succ)h:∃ a_1 ∈ ↑c, (Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a_1) = a⊢ a.card = 2inr 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n.succ.succ)h:a = {0, i.succ}⊢ a.card = 2
· inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n.succ.succ)h:∃ a_1 ∈ ↑c, (Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a_1) = a⊢ a.card = 2 obtain ⟨a, ha, rfl⟩ := h inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n)ha:a ∈ ↑c⊢ ((Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a)).card = 2
rw [Finset.mapEmbedding_apply, inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n)ha:a ∈ ↑c⊢ (Finset.map (Fin.succEmb (n + 1)) ((Finset.mapEmbedding i.succAboveEmb) a)).card = 2 inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n)ha:a ∈ ↑c⊢ (Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a)).card = 2 Finset.mapEmbedding_apply inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n)ha:a ∈ ↑c⊢ (Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a)).card = 2 inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n)ha:a ∈ ↑c⊢ (Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a)).card = 2]inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n)ha:a ∈ ↑c⊢ (Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a)).card = 2
simp only [Finset.card_map] inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n)ha:a ∈ ↑c⊢ a.card = 2
exact c.2.1 a ha All goals completed! 🐙
· inr 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n.succ.succ)h:a = {0, i.succ}⊢ a.card = 2 subst h inr 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction n⊢ {0, i.succ}.card = 2
rw [@Finset.card_eq_two inr 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction n⊢ ∃ x y, x ≠ y ∧ {0, i.succ} = {x, y} inr 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction n⊢ ∃ x y, x ≠ y ∧ {0, i.succ} = {x, y}]inr 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction n⊢ ∃ x y, x ≠ y ∧ {0, i.succ} = {x, y}
use 0, i.succ h 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction n⊢ 0 ≠ i.succ ∧ {0, i.succ} = {0, i.succ}
simp only [succ_eq_add_one, ne_eq, and_true] h 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction n⊢ ¬0 = i.succ
exact ne_of_beq_false rfl All goals completed! 🐙, by 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction n⊢ ∀
a ∈
Finset.map (Finset.mapEmbedding (Fin.succEmb n.succ)).toEmbedding
(Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c) ∪
{{0, i.succ}},
∀
b ∈
Finset.map (Finset.mapEmbedding (Fin.succEmb n.succ)).toEmbedding
(Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c) ∪
{{0, i.succ}},
a = b ∨ Disjoint a b
intro a ha b hb 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n.succ.succ)ha:a ∈
Finset.map (Finset.mapEmbedding (Fin.succEmb n.succ)).toEmbedding
(Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c) ∪
{{0, i.succ}}b:Finset (Fin n.succ.succ)hb:b ∈
Finset.map (Finset.mapEmbedding (Fin.succEmb n.succ)).toEmbedding
(Finset.map (Finset.mapEmbedding i.succAboveEmb).toEmbedding ↑c) ∪
{{0, i.succ}}⊢ a = b ∨ Disjoint a b
simp only [succ_eq_add_one, Finset.mem_union, Finset.mem_map,
RelEmbedding.coe_toEmbedding, exists_exists_and_eq_and, Finset.mem_singleton] at ha hb 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n.succ.succ)b:Finset (Fin n.succ.succ)ha:(∃ a_1 ∈ ↑c, (Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a_1) = a) ∨
a = {0, i.succ}hb:(∃ a ∈ ↑c, (Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a) = b) ∨ b = {0, i.succ}⊢ a = b ∨ Disjoint a b
rcases ha with ha | ha inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n.succ.succ)b:Finset (Fin n.succ.succ)hb:(∃ a ∈ ↑c, (Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a) = b) ∨ b = {0, i.succ}ha:∃ a_1 ∈ ↑c, (Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a_1) = a⊢ a = b ∨ Disjoint a binr 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n.succ.succ)b:Finset (Fin n.succ.succ)hb:(∃ a ∈ ↑c, (Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a) = b) ∨ b = {0, i.succ}ha:a = {0, i.succ}⊢ a = b ∨ Disjoint a b <;> inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n.succ.succ)b:Finset (Fin n.succ.succ)hb:(∃ a ∈ ↑c, (Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a) = b) ∨ b = {0, i.succ}ha:∃ a_1 ∈ ↑c, (Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a_1) = a⊢ a = b ∨ Disjoint a binr 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n.succ.succ)b:Finset (Fin n.succ.succ)hb:(∃ a ∈ ↑c, (Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a) = b) ∨ b = {0, i.succ}ha:a = {0, i.succ}⊢ a = b ∨ Disjoint a b rcases hb with hb | hb inr.inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n.succ.succ)b:Finset (Fin n.succ.succ)ha:a = {0, i.succ}hb:∃ a ∈ ↑c, (Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a) = b⊢ a = b ∨ Disjoint a binr.inr 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n.succ.succ)b:Finset (Fin n.succ.succ)ha:a = {0, i.succ}hb:b = {0, i.succ}⊢ a = b ∨ Disjoint a b
· inl.inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n.succ.succ)b:Finset (Fin n.succ.succ)ha:∃ a_1 ∈ ↑c, (Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a_1) = ahb:∃ a ∈ ↑c, (Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a) = b⊢ a = b ∨ Disjoint a b obtain ⟨a, ha, rfl⟩ := ha inl.inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction nb:Finset (Fin n.succ.succ)hb:∃ a ∈ ↑c, (Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a) = ba:Finset (Fin n)ha:a ∈ ↑c⊢ (Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a) = b ∨
Disjoint ((Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a)) b
obtain ⟨b, hb, rfl⟩ := hb inl.inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n)ha:a ∈ ↑cb:Finset (Fin n)hb:b ∈ ↑c⊢ (Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a) =
(Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) b) ∨
Disjoint ((Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a))
((Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) b))
simp only [succ_eq_add_one, EmbeddingLike.apply_eq_iff_eq] inl.inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n)ha:a ∈ ↑cb:Finset (Fin n)hb:b ∈ ↑c⊢ a = b ∨
Disjoint ((Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a))
((Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) b))
rw [Finset.mapEmbedding_apply, inl.inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n)ha:a ∈ ↑cb:Finset (Fin n)hb:b ∈ ↑c⊢ a = b ∨
Disjoint (Finset.map (Fin.succEmb (n + 1)) ((Finset.mapEmbedding i.succAboveEmb) a))
((Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) b)) inl.inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n)ha:a ∈ ↑cb:Finset (Fin n)hb:b ∈ ↑c⊢ a = b ∨ Disjoint a b Finset.mapEmbedding_apply, inl.inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n)ha:a ∈ ↑cb:Finset (Fin n)hb:b ∈ ↑c⊢ a = b ∨
Disjoint (Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a))
((Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) b))inl.inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n)ha:a ∈ ↑cb:Finset (Fin n)hb:b ∈ ↑c⊢ a = b ∨ Disjoint a b Finset.mapEmbedding_apply, inl.inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n)ha:a ∈ ↑cb:Finset (Fin n)hb:b ∈ ↑c⊢ a = b ∨
Disjoint (Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a))
(Finset.map (Fin.succEmb (n + 1)) ((Finset.mapEmbedding i.succAboveEmb) b))inl.inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n)ha:a ∈ ↑cb:Finset (Fin n)hb:b ∈ ↑c⊢ a = b ∨ Disjoint a b
Finset.mapEmbedding_apply, inl.inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n)ha:a ∈ ↑cb:Finset (Fin n)hb:b ∈ ↑c⊢ a = b ∨
Disjoint (Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a))
(Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb b))inl.inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n)ha:a ∈ ↑cb:Finset (Fin n)hb:b ∈ ↑c⊢ a = b ∨ Disjoint a b Finset.disjoint_map, inl.inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n)ha:a ∈ ↑cb:Finset (Fin n)hb:b ∈ ↑c⊢ a = b ∨ Disjoint (Finset.map i.succAboveEmb a) (Finset.map i.succAboveEmb b)inl.inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n)ha:a ∈ ↑cb:Finset (Fin n)hb:b ∈ ↑c⊢ a = b ∨ Disjoint a b Finset.disjoint_map inl.inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n)ha:a ∈ ↑cb:Finset (Fin n)hb:b ∈ ↑c⊢ a = b ∨ Disjoint a binl.inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n)ha:a ∈ ↑cb:Finset (Fin n)hb:b ∈ ↑c⊢ a = b ∨ Disjoint a b]inl.inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na: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! 🐙
· inl.inr 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n.succ.succ)b:Finset (Fin n.succ.succ)ha:∃ a_1 ∈ ↑c, (Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a_1) = ahb:b = {0, i.succ}⊢ a = b ∨ Disjoint a b obtain ⟨a, ha, rfl⟩ := ha inl.inr 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction nb:Finset (Fin n.succ.succ)hb:b = {0, i.succ}a:Finset (Fin n)ha:a ∈ ↑c⊢ (Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a) = b ∨
Disjoint ((Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a)) b
subst hb inl.inr 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n)ha:a ∈ ↑c⊢ (Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a) = {0, i.succ} ∨
Disjoint ((Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a)) {0, i.succ}
right inl.inr 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n)ha:a ∈ ↑c⊢ Disjoint ((Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a)) {0, i.succ}
rw [Finset.mapEmbedding_apply, inl.inr 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n)ha:a ∈ ↑c⊢ Disjoint (Finset.map (Fin.succEmb (n + 1)) ((Finset.mapEmbedding i.succAboveEmb) a)) {0, i.succ} inl.inr 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n)ha:a ∈ ↑c⊢ Disjoint (Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a)) {0, i.succ} Finset.mapEmbedding_apply inl.inr 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n)ha:a ∈ ↑c⊢ Disjoint (Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a)) {0, i.succ}inl.inr 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n)ha:a ∈ ↑c⊢ Disjoint (Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a)) {0, i.succ}]inl.inr 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n)ha:a ∈ ↑c⊢ Disjoint (Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a)) {0, i.succ}
exact finset_succAbove_succ_disjoint a i All goals completed! 🐙
· inr.inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n.succ.succ)b:Finset (Fin n.succ.succ)ha:a = {0, i.succ}hb:∃ a ∈ ↑c, (Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a) = b⊢ a = b ∨ Disjoint a b obtain ⟨b, hb, rfl⟩ := hb inr.inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n.succ.succ)ha:a = {0, i.succ}b:Finset (Fin n)hb:b ∈ ↑c⊢ a = (Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) b) ∨
Disjoint a ((Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) b))
subst ha inr.inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction nb:Finset (Fin n)hb:b ∈ ↑c⊢ {0, i.succ} = (Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) b) ∨
Disjoint {0, i.succ} ((Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) b))
right inr.inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction nb:Finset (Fin n)hb:b ∈ ↑c⊢ Disjoint {0, i.succ} ((Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) b))
rw [Finset.mapEmbedding_apply, inr.inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction nb:Finset (Fin n)hb:b ∈ ↑c⊢ Disjoint {0, i.succ} (Finset.map (Fin.succEmb (n + 1)) ((Finset.mapEmbedding i.succAboveEmb) b)) inr.inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction nb:Finset (Fin n)hb:b ∈ ↑c⊢ Disjoint {0, i.succ} (Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb b)) Finset.mapEmbedding_apply inr.inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction nb:Finset (Fin n)hb:b ∈ ↑c⊢ Disjoint {0, i.succ} (Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb b))inr.inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction nb:Finset (Fin n)hb:b ∈ ↑c⊢ Disjoint {0, i.succ} (Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb b))]inr.inl 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction nb:Finset (Fin n)hb:b ∈ ↑c⊢ Disjoint {0, i.succ} (Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb b))
exact Disjoint.symm (finset_succAbove_succ_disjoint b i) All goals completed! 🐙
· inr.inr 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction na:Finset (Fin n.succ.succ)b:Finset (Fin n.succ.succ)ha:a = {0, i.succ}hb:b = {0, i.succ}⊢ a = b ∨ Disjoint a b subst ha hb inr.inr 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction n⊢ {0, i.succ} = {0, i.succ} ∨ Disjoint {0, i.succ} {0, i.succ}
simp All goals completed! 🐙⟩
@[simp]
lemma consAddContract_getDual?_zero (i : Fin n.succ) (c : WickContraction n) :
(consAddContract i c).getDual? 0 = some i.succ := by n:ℕi:Fin n.succc:WickContraction n⊢ (consAddContract i c).getDual? 0 = some i.succ
rw [getDual?_eq_some_iff_mem n:ℕi:Fin n.succc:WickContraction n⊢ {0, i.succ} ∈ ↑(consAddContract i c) n:ℕi:Fin n.succc:WickContraction n⊢ {0, i.succ} ∈ ↑(consAddContract i c)] n:ℕi:Fin n.succc:WickContraction n⊢ {0, i.succ} ∈ ↑(consAddContract i c)
simp [consAddContract] All goals completed! 🐙
@[simp]
lemma consAddContract_getDual?_self_succ (i : Fin n.succ) (c : WickContraction n) :
(consAddContract i c).getDual? i.succ = some 0 := by n:ℕi:Fin n.succc:WickContraction n⊢ (consAddContract i c).getDual? i.succ = some 0
rw [getDual?_eq_some_iff_mem n:ℕi:Fin n.succc:WickContraction n⊢ {i.succ, 0} ∈ ↑(consAddContract i c) n:ℕi:Fin n.succc:WickContraction n⊢ {i.succ, 0} ∈ ↑(consAddContract i c)] n:ℕi:Fin n.succc:WickContraction n⊢ {i.succ, 0} ∈ ↑(consAddContract i c)
simp [consAddContract, Finset.pair_comm] All goals completed! 🐙
lemma mem_consAddContract_of_mem_iff (i : Fin n.succ) (c : WickContraction n) (a : Finset (Fin n)) :
a ∈ c.1 ↔ (a.map i.succAboveEmb).map (Fin.succEmb n.succ) ∈ (consAddContract i c).1 := by n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)⊢ a ∈ ↑c ↔ Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb a) ∈ ↑(consAddContract i c)
simp only [succ_eq_add_one, consAddContract, Finset.mem_union,
Finset.mem_map, RelEmbedding.coe_toEmbedding, exists_exists_and_eq_and, Finset.mem_singleton] n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)⊢ a ∈ ↑c ↔
(∃ a_1 ∈ ↑c,
(Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a_1) =
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a)) ∨
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) = {0, i.succ}
apply Iff.intro mp n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)⊢ a ∈ ↑c →
(∃ a_2 ∈ ↑c,
(Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a_2) =
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a)) ∨
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) = {0, i.succ}mpr n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)⊢ (∃ a_1 ∈ ↑c,
(Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a_1) =
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a)) ∨
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) = {0, i.succ} →
a ∈ ↑c
· mp n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)⊢ a ∈ ↑c →
(∃ a_2 ∈ ↑c,
(Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a_2) =
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a)) ∨
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) = {0, i.succ} intro h mp n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)h:a ∈ ↑c⊢ (∃ a_1 ∈ ↑c,
(Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a_1) =
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a)) ∨
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) = {0, i.succ}
left mp n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)h:a ∈ ↑c⊢ ∃ a_1 ∈ ↑c,
(Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a_1) =
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a)
use a h n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)h:a ∈ ↑c⊢ a ∈ ↑c ∧
(Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a) =
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a)
simp only [h, true_and] h n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)h:a ∈ ↑c⊢ (Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a) =
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a)
rw [Finset.mapEmbedding_apply, h n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)h:a ∈ ↑c⊢ Finset.map (Fin.succEmb (n + 1)) ((Finset.mapEmbedding i.succAboveEmb) a) =
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) All goals completed! 🐙 Finset.mapEmbedding_apply h n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)h:a ∈ ↑c⊢ Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) =
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) All goals completed! 🐙] All goals completed! 🐙
· mpr n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)⊢ (∃ a_1 ∈ ↑c,
(Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a_1) =
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a)) ∨
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) = {0, i.succ} →
a ∈ ↑c intro h mpr n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)h:(∃ a_1 ∈ ↑c,
(Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a_1) =
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a)) ∨
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) = {0, i.succ}⊢ a ∈ ↑c
rcases h with h | h mpr.inl n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)h:∃ a_1 ∈ ↑c,
(Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a_1) =
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a)⊢ a ∈ ↑cmpr.inr n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)h:Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) = {0, i.succ}⊢ a ∈ ↑c
· mpr.inl n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)h:∃ a_1 ∈ ↑c,
(Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) a_1) =
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a)⊢ a ∈ ↑c obtain ⟨b, ha⟩ := h mpr.inl n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)b:Finset (Fin n)ha:b ∈ ↑c ∧
(Finset.mapEmbedding (Fin.succEmb (n + 1))) ((Finset.mapEmbedding i.succAboveEmb) b) =
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a)⊢ a ∈ ↑c
rw [Finset.mapEmbedding_apply, mpr.inl n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)b:Finset (Fin n)ha:b ∈ ↑c ∧
Finset.map (Fin.succEmb (n + 1)) ((Finset.mapEmbedding i.succAboveEmb) b) =
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a)⊢ a ∈ ↑c mpr.inl n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)b:Finset (Fin n)ha:b ∈ ↑c ∧
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb b) =
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a)⊢ a ∈ ↑c Finset.mapEmbedding_apply mpr.inl n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)b:Finset (Fin n)ha:b ∈ ↑c ∧
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb b) =
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a)⊢ a ∈ ↑cmpr.inl n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)b:Finset (Fin n)ha:b ∈ ↑c ∧
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb b) =
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a)⊢ a ∈ ↑c] at hampr.inl n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)b:Finset (Fin n)ha:b ∈ ↑c ∧
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb b) =
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a)⊢ a ∈ ↑c
simp only [Finset.map_inj] at ha mpr.inl n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)b:Finset (Fin n)ha:b ∈ ↑c ∧ b = a⊢ a ∈ ↑c
rw [← ha.2 mpr.inl n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)b:Finset (Fin n)ha:b ∈ ↑c ∧ b = a⊢ b ∈ ↑c mpr.inl n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)b:Finset (Fin n)ha:b ∈ ↑c ∧ b = a⊢ b ∈ ↑c]mpr.inl n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)b:Finset (Fin n)ha:b ∈ ↑c ∧ b = a⊢ b ∈ ↑c
exact ha.1 All goals completed! 🐙
· mpr.inr n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)h:Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) = {0, i.succ}⊢ a ∈ ↑c have h1 := finset_succAbove_succ_disjoint a i mpr.inr n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)h:Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) = {0, i.succ}h1:Disjoint (Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a)) {0, i.succ}⊢ a ∈ ↑c
rw [h mpr.inr n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)h:Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) = {0, i.succ}h1:Disjoint {0, i.succ} {0, i.succ}⊢ a ∈ ↑c mpr.inr n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)h:Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) = {0, i.succ}h1:Disjoint {0, i.succ} {0, i.succ}⊢ a ∈ ↑c] at h1mpr.inr n:ℕi:Fin n.succc:WickContraction na:Finset (Fin n)h:Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) = {0, i.succ}h1:Disjoint {0, i.succ} {0, i.succ}⊢ a ∈ ↑c
simp at h1 All goals completed! 🐙
lemma consAddContract_injective (i : Fin n.succ) : Function.Injective (consAddContract i) := by n:ℕi:Fin n.succ⊢ Function.Injective (consAddContract i)
intro c1 c2 h n:ℕi:Fin n.succc1:WickContraction nc2:WickContraction nh:consAddContract i c1 = consAddContract i c2⊢ c1 = c2
apply Subtype.ext n:ℕi:Fin n.succc1:WickContraction nc2:WickContraction nh:consAddContract i c1 = consAddContract i c2⊢ ↑c1 = ↑c2
ext a n:ℕi:Fin n.succc1:WickContraction nc2:WickContraction nh:consAddContract i c1 = consAddContract i c2a:Finset (Fin n)⊢ a ∈ ↑c1 ↔ a ∈ ↑c2
apply Iff.intro mp n:ℕi:Fin n.succc1:WickContraction nc2:WickContraction nh:consAddContract i c1 = consAddContract i c2a:Finset (Fin n)⊢ a ∈ ↑c1 → a ∈ ↑c2mpr n:ℕi:Fin n.succc1:WickContraction nc2:WickContraction nh:consAddContract i c1 = consAddContract i c2a:Finset (Fin n)⊢ a ∈ ↑c2 → a ∈ ↑c1
· mp n:ℕi:Fin n.succc1:WickContraction nc2:WickContraction nh:consAddContract i c1 = consAddContract i c2a:Finset (Fin n)⊢ a ∈ ↑c1 → a ∈ ↑c2 intro ha mp n:ℕi:Fin n.succc1:WickContraction nc2:WickContraction nh:consAddContract i c1 = consAddContract i c2a:Finset (Fin n)ha:a ∈ ↑c1⊢ a ∈ ↑c2
have ha' : (a.map i.succAboveEmb).map (Fin.succEmb n.succ) ∈ (consAddContract i c1).1 :=
(mem_consAddContract_of_mem_iff i c1 a).mp ha mp n:ℕi:Fin n.succc1:WickContraction nc2:WickContraction nh:consAddContract i c1 = consAddContract i c2a:Finset (Fin n)ha:a ∈ ↑c1ha':Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb a) ∈ ↑(consAddContract i c1)⊢ a ∈ ↑c2
rw [h mp n:ℕi:Fin n.succc1:WickContraction nc2:WickContraction nh:consAddContract i c1 = consAddContract i c2a:Finset (Fin n)ha:a ∈ ↑c1ha':Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb a) ∈ ↑(consAddContract i c2)⊢ a ∈ ↑c2 mp n:ℕi:Fin n.succc1:WickContraction nc2:WickContraction nh:consAddContract i c1 = consAddContract i c2a:Finset (Fin n)ha:a ∈ ↑c1ha':Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb a) ∈ ↑(consAddContract i c2)⊢ a ∈ ↑c2] at ha' mp n:ℕi:Fin n.succc1:WickContraction nc2:WickContraction nh:consAddContract i c1 = consAddContract i c2a:Finset (Fin n)ha:a ∈ ↑c1ha':Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb a) ∈ ↑(consAddContract i c2)⊢ a ∈ ↑c2
rw [← mem_consAddContract_of_mem_iff mp n:ℕi:Fin n.succc1:WickContraction nc2:WickContraction nh:consAddContract i c1 = consAddContract i c2a:Finset (Fin n)ha:a ∈ ↑c1ha':a ∈ ↑c2⊢ a ∈ ↑c2 mp n:ℕi:Fin n.succc1:WickContraction nc2:WickContraction nh:consAddContract i c1 = consAddContract i c2a:Finset (Fin n)ha:a ∈ ↑c1ha':a ∈ ↑c2⊢ a ∈ ↑c2] at ha'mp n:ℕi:Fin n.succc1:WickContraction nc2:WickContraction nh:consAddContract i c1 = consAddContract i c2a:Finset (Fin n)ha:a ∈ ↑c1ha':a ∈ ↑c2⊢ a ∈ ↑c2
exact ha' All goals completed! 🐙
· mpr n:ℕi:Fin n.succc1:WickContraction nc2:WickContraction nh:consAddContract i c1 = consAddContract i c2a:Finset (Fin n)⊢ a ∈ ↑c2 → a ∈ ↑c1 intro ha mpr n:ℕi:Fin n.succc1:WickContraction nc2:WickContraction nh:consAddContract i c1 = consAddContract i c2a:Finset (Fin n)ha:a ∈ ↑c2⊢ a ∈ ↑c1
have ha' : (a.map i.succAboveEmb).map (Fin.succEmb n.succ) ∈ (consAddContract i c2).1 :=
(mem_consAddContract_of_mem_iff i c2 a).mp ha mpr n:ℕi:Fin n.succc1:WickContraction nc2:WickContraction nh:consAddContract i c1 = consAddContract i c2a:Finset (Fin n)ha:a ∈ ↑c2ha':Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb a) ∈ ↑(consAddContract i c2)⊢ a ∈ ↑c1
rw [← h mpr n:ℕi:Fin n.succc1:WickContraction nc2:WickContraction nh:consAddContract i c1 = consAddContract i c2a:Finset (Fin n)ha:a ∈ ↑c2ha':Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb a) ∈ ↑(consAddContract i c1)⊢ a ∈ ↑c1 mpr n:ℕi:Fin n.succc1:WickContraction nc2:WickContraction nh:consAddContract i c1 = consAddContract i c2a:Finset (Fin n)ha:a ∈ ↑c2ha':Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb a) ∈ ↑(consAddContract i c1)⊢ a ∈ ↑c1] at ha'mpr n:ℕi:Fin n.succc1:WickContraction nc2:WickContraction nh:consAddContract i c1 = consAddContract i c2a:Finset (Fin n)ha:a ∈ ↑c2ha':Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb a) ∈ ↑(consAddContract i c1)⊢ a ∈ ↑c1
rw [← mem_consAddContract_of_mem_iff mpr n:ℕi:Fin n.succc1:WickContraction nc2:WickContraction nh:consAddContract i c1 = consAddContract i c2a:Finset (Fin n)ha:a ∈ ↑c2ha':a ∈ ↑c1⊢ a ∈ ↑c1 mpr n:ℕi:Fin n.succc1:WickContraction nc2:WickContraction nh:consAddContract i c1 = consAddContract i c2a:Finset (Fin n)ha:a ∈ ↑c2ha':a ∈ ↑c1⊢ a ∈ ↑c1] at ha'mpr n:ℕi:Fin n.succc1:WickContraction nc2:WickContraction nh:consAddContract i c1 = consAddContract i c2a:Finset (Fin n)ha:a ∈ ↑c2ha':a ∈ ↑c1⊢ a ∈ ↑c1
exact ha' All goals completed! 🐙
lemma consAddContract_surjective_on_zero_contract (i : Fin n.succ)
(c : WickContraction n.succ.succ)
(h : (c.getDual? 0).isSome) (h2 : (c.getDual? 0).get h = i.succ) :
∃ c', consAddContract i c' = c := by n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succ⊢ ∃ c', consAddContract i c' = c
let c' : WickContraction n :=
⟨Finset.filter
(fun x => (Finset.map i.succAboveEmb x).map (Fin.succEmb n.succ) ∈ c.1) Finset.univ, by n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succ⊢ ∀ a ∈ {x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, a.card = 2 n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩⊢ ∃ c', consAddContract i c' = c
intro a ha n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succa:Finset (Fin n)ha:a ∈ {x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}⊢ a.card = 2 n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩⊢ ∃ c', consAddContract i c' = c
simp only [succ_eq_add_one, Finset.mem_filter, Finset.mem_univ, true_and] at ha n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succa:Finset (Fin n)ha:Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) ∈ ↑c⊢ a.card = 2 n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩⊢ ∃ c', consAddContract i c' = c
simpa using c.2.1 _ ha All goals completed! 🐙 n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩⊢ ∃ c', consAddContract i c' = c, by n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succ⊢ ∀ a ∈ {x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c},
∀ b ∈ {x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, a = b ∨ Disjoint a b n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩⊢ ∃ c', consAddContract i c' = c
intro a ha b hb n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succa:Finset (Fin n)ha:a ∈ {x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}b:Finset (Fin n)hb:b ∈ {x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}⊢ a = b ∨ Disjoint a b n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩⊢ ∃ c', consAddContract i c' = c
simp only [Nat.succ_eq_add_one, Finset.mem_filter, Finset.mem_univ, true_and] at ha hb n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succa:Finset (Fin n)b:Finset (Fin n)ha:Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) ∈ ↑chb:Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb b) ∈ ↑c⊢ a = b ∨ Disjoint a b n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩⊢ ∃ c', consAddContract i c' = c
rw [← Finset.disjoint_map i.succAboveEmb, n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succa:Finset (Fin n)b:Finset (Fin n)ha:Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) ∈ ↑chb:Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb b) ∈ ↑c⊢ a = b ∨ Disjoint (Finset.map i.succAboveEmb a) (Finset.map i.succAboveEmb b) n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succa:Finset (Fin n)b:Finset (Fin n)ha:Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) ∈ ↑chb:Finset.map (Fin.succEmb (n + 1)) (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) n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩⊢ ∃ c', consAddContract i c' = c ← (Finset.map_injective i.succAboveEmb).eq_iff n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succa:Finset (Fin n)b:Finset (Fin n)ha:Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) ∈ ↑chb:Finset.map (Fin.succEmb (n + 1)) (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) n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succa:Finset (Fin n)b:Finset (Fin n)ha:Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) ∈ ↑chb:Finset.map (Fin.succEmb (n + 1)) (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) n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩⊢ ∃ c', consAddContract i c' = c] n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succa:Finset (Fin n)b:Finset (Fin n)ha:Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) ∈ ↑chb:Finset.map (Fin.succEmb (n + 1)) (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) n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩⊢ ∃ c', consAddContract i c' = c
rw [← Finset.disjoint_map (Fin.succEmb n.succ), n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succa:Finset (Fin n)b:Finset (Fin n)ha:Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) ∈ ↑chb:Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb b) ∈ ↑c⊢ Finset.map i.succAboveEmb a = Finset.map i.succAboveEmb b ∨
Disjoint (Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb a))
(Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb b)) n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succa:Finset (Fin n)b:Finset (Fin n)ha:Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) ∈ ↑chb:Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb b) ∈ ↑c⊢ Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb a) =
Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb b) ∨
Disjoint (Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb a))
(Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb b)) n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩⊢ ∃ c', consAddContract i c' = c
← (Finset.map_injective (Fin.succEmb n.succ)).eq_iff n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succa:Finset (Fin n)b:Finset (Fin n)ha:Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) ∈ ↑chb:Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb b) ∈ ↑c⊢ Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb a) =
Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb b) ∨
Disjoint (Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb a))
(Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb b)) n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succa:Finset (Fin n)b:Finset (Fin n)ha:Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) ∈ ↑chb:Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb b) ∈ ↑c⊢ Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb a) =
Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb b) ∨
Disjoint (Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb a))
(Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb b)) n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩⊢ ∃ c', consAddContract i c' = c] n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succa:Finset (Fin n)b:Finset (Fin n)ha:Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) ∈ ↑chb:Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb b) ∈ ↑c⊢ Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb a) =
Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb b) ∨
Disjoint (Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb a))
(Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb b)) n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩⊢ ∃ c', consAddContract i c' = c
exact c.2.2 _ ha _ hb All goals completed! 🐙 n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩⊢ ∃ c', consAddContract i c' = c⟩ n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩⊢ ∃ c', consAddContract i c' = c
use c' h n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩⊢ consAddContract i c' = c
apply Subtype.ext h n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩⊢ ↑(consAddContract i c') = ↑c
ext a h n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)⊢ a ∈ ↑(consAddContract i c') ↔ a ∈ ↑c
simp [consAddContract] h n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)⊢ (a = {0, i.succ} ∨ ∃ a_1 ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a_1) = a) ↔ a ∈ ↑c
apply Iff.intro h.mp n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)⊢ (a = {0, i.succ} ∨ ∃ a_1 ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a_1) = a) → a ∈ ↑ch.mpr n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)⊢ a ∈ ↑c → a = {0, i.succ} ∨ ∃ a_2 ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a_2) = a
· h.mp n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)⊢ (a = {0, i.succ} ∨ ∃ a_1 ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a_1) = a) → a ∈ ↑c intro h h.mp n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)h:a = {0, i.succ} ∨ ∃ a_1 ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a_1) = a⊢ a ∈ ↑c
rcases h with h | h h.mp.inl n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)h:a = {0, i.succ}⊢ a ∈ ↑ch.mp.inr n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)h:∃ a_1 ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a_1) = a⊢ a ∈ ↑c
· h.mp.inl n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)h:a = {0, i.succ}⊢ a ∈ ↑c subst h h.mp.inl n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩⊢ {0, i.succ} ∈ ↑c
rw [← h2 h.mp.inl n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩⊢ {0, (c.getDual? 0).get h} ∈ ↑c h.mp.inl n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩⊢ {0, (c.getDual? 0).get h} ∈ ↑c]h.mp.inl n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩⊢ {0, (c.getDual? 0).get h} ∈ ↑c
simp All goals completed! 🐙
· h.mp.inr n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)h:∃ a_1 ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a_1) = a⊢ a ∈ ↑c obtain ⟨b, hb, rfl⟩ := h h.mp.inr n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩b:Finset (Fin n)hb:b ∈ ↑c'⊢ Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb b) ∈ ↑c
simp only [succ_eq_add_one, Finset.mem_filter, Finset.mem_univ, true_and, c'] at hb h.mp.inr n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩b:Finset (Fin n)hb:Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb b) ∈ ↑c⊢ Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb b) ∈ ↑c
exact hb All goals completed! 🐙
· h.mpr n:ℕi:Fin n.succc:WickContraction n.succ.succh:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)⊢ a ∈ ↑c → a = {0, i.succ} ∨ ∃ a_2 ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a_2) = a intro h h.mpr n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)h:a ∈ ↑c⊢ a = {0, i.succ} ∨ ∃ a_1 ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a_1) = a
by_cases ha : a = {0, i.succ} pos n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)h:a ∈ ↑cha:a = {0, i.succ}⊢ a = {0, i.succ} ∨ ∃ a_1 ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a_1) = aneg n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)h:a ∈ ↑cha:¬a = {0, i.succ}⊢ a = {0, i.succ} ∨ ∃ a_1 ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a_1) = a
· pos n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)h:a ∈ ↑cha:a = {0, i.succ}⊢ a = {0, i.succ} ∨ ∃ a_1 ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a_1) = a simp [ha] All goals completed! 🐙
· neg n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)h:a ∈ ↑cha:¬a = {0, i.succ}⊢ a = {0, i.succ} ∨ ∃ a_1 ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a_1) = a right neg n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)h:a ∈ ↑cha:¬a = {0, i.succ}⊢ ∃ a_1 ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a_1) = a
have hd := c.2.2 a h {0, i.succ} (by n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)h:a ∈ ↑cha:¬a = {0, i.succ}⊢ {0, i.succ} ∈ ↑c neg n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)h:a ∈ ↑cha:¬a = {0, i.succ}hd:a = {0, i.succ} ∨ Disjoint a {0, i.succ}⊢ ∃ a_1 ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a_1) = a rw [← h2 n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)h:a ∈ ↑cha:¬a = {0, i.succ}⊢ {0, (c.getDual? 0).get h✝} ∈ ↑c n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)h:a ∈ ↑cha:¬a = {0, i.succ}⊢ {0, (c.getDual? 0).get h✝} ∈ ↑cneg n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)h:a ∈ ↑cha:¬a = {0, i.succ}hd:a = {0, i.succ} ∨ Disjoint a {0, i.succ}⊢ ∃ a_1 ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a_1) = a] n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)h:a ∈ ↑cha:¬a = {0, i.succ}⊢ {0, (c.getDual? 0).get h✝} ∈ ↑cneg n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)h:a ∈ ↑cha:¬a = {0, i.succ}hd:a = {0, i.succ} ∨ Disjoint a {0, i.succ}⊢ ∃ a_1 ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a_1) = a; simp All goals completed! 🐙neg n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)h:a ∈ ↑cha:¬a = {0, i.succ}hd:a = {0, i.succ} ∨ Disjoint a {0, i.succ}⊢ ∃ a_1 ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a_1) = a)neg n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = trueh2:(c.getDual? 0).get h = i.succc':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)h:a ∈ ↑cha:¬a = {0, i.succ}hd:a = {0, i.succ} ∨ Disjoint a {0, i.succ}⊢ ∃ a_1 ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a_1) = a
simp_all only [succ_eq_add_one, Finset.disjoint_insert_right, Finset.disjoint_singleton_right,
false_or] neg n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = truec':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)h2:(c.getDual? 0).get h✝ = i.succh:a ∈ ↑cha:¬a = {0, i.succ}hd:0 ∉ a ∧ i.succ ∉ a⊢ ∃ a_1 ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a_1) = a
have ha2 := c.2.1 a h neg n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = truec':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)h2:(c.getDual? 0).get h✝ = i.succh:a ∈ ↑cha:¬a = {0, i.succ}hd:0 ∉ a ∧ i.succ ∉ aha2:a.card = 2⊢ ∃ a_1 ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a_1) = a
rw [@Finset.card_eq_two neg n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = truec':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)h2:(c.getDual? 0).get h✝ = i.succh:a ∈ ↑cha:¬a = {0, i.succ}hd:0 ∉ a ∧ i.succ ∉ aha2:∃ x y, x ≠ y ∧ a = {x, y}⊢ ∃ a_1 ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a_1) = a neg n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = truec':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)h2:(c.getDual? 0).get h✝ = i.succh:a ∈ ↑cha:¬a = {0, i.succ}hd:0 ∉ a ∧ i.succ ∉ aha2:∃ x y, x ≠ y ∧ a = {x, y}⊢ ∃ a_1 ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a_1) = a] at ha2neg n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = truec':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩a:Finset (Fin n.succ.succ)h2:(c.getDual? 0).get h✝ = i.succh:a ∈ ↑cha:¬a = {0, i.succ}hd:0 ∉ a ∧ i.succ ∉ aha2:∃ x y, x ≠ y ∧ a = {x, y}⊢ ∃ a_1 ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a_1) = a
obtain ⟨x, y, hx, rfl⟩ := ha2 neg n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = truec':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩h2:(c.getDual? 0).get h✝ = i.succx:Fin n.succ.succy:Fin n.succ.succhx:x ≠ yh:{x, y} ∈ ↑cha:¬{x, y} = {0, i.succ}hd:0 ∉ {x, y} ∧ i.succ ∉ {x, y}⊢ ∃ a ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) = {x, y}
simp_all only [succ_eq_add_one, ne_eq, Finset.mem_insert, Finset.mem_singleton, not_or] neg n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = truec':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩h2:(c.getDual? 0).get h✝ = i.succx:Fin n.succ.succy:Fin n.succ.succhx:¬x = yh:{x, y} ∈ ↑cha:¬{x, y} = {0, i.succ}hd:(¬0 = x ∧ ¬0 = y) ∧ ¬i.succ = x ∧ ¬i.succ = y⊢ ∃ a ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) = {x, y}
obtain ⟨x, rfl⟩ := Fin.exists_succ_eq (x := x).mpr (by n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = truec':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩h2:(c.getDual? 0).get h✝ = i.succx:Fin n.succ.succy:Fin n.succ.succhx:¬x = yh:{x, y} ∈ ↑cha:¬{x, y} = {0, i.succ}hd:(¬0 = x ∧ ¬0 = y) ∧ ¬i.succ = x ∧ ¬i.succ = y⊢ x ≠ 0 neg n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = truec':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩h2:(c.getDual? 0).get h✝ = i.succy:Fin n.succ.succx:Fin (n + 1)hx:¬x.succ = yh:{x.succ, y} ∈ ↑cha:¬{x.succ, y} = {0, i.succ}hd:(¬0 = x.succ ∧ ¬0 = y) ∧ ¬i.succ = x.succ ∧ ¬i.succ = y⊢ ∃ a ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) = {x.succ, y} omega All goals completed! 🐙neg n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = truec':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩h2:(c.getDual? 0).get h✝ = i.succy:Fin n.succ.succx:Fin (n + 1)hx:¬x.succ = yh:{x.succ, y} ∈ ↑cha:¬{x.succ, y} = {0, i.succ}hd:(¬0 = x.succ ∧ ¬0 = y) ∧ ¬i.succ = x.succ ∧ ¬i.succ = y⊢ ∃ a ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) = {x.succ, y})neg n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = truec':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩h2:(c.getDual? 0).get h✝ = i.succy:Fin n.succ.succx:Fin (n + 1)hx:¬x.succ = yh:{x.succ, y} ∈ ↑cha:¬{x.succ, y} = {0, i.succ}hd:(¬0 = x.succ ∧ ¬0 = y) ∧ ¬i.succ = x.succ ∧ ¬i.succ = y⊢ ∃ a ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) = {x.succ, y}
obtain ⟨y, rfl⟩ := Fin.exists_succ_eq (x := y).mpr (by n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = truec':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩h2:(c.getDual? 0).get h✝ = i.succy:Fin n.succ.succx:Fin (n + 1)hx:¬x.succ = yh:{x.succ, y} ∈ ↑cha:¬{x.succ, y} = {0, i.succ}hd:(¬0 = x.succ ∧ ¬0 = y) ∧ ¬i.succ = x.succ ∧ ¬i.succ = y⊢ y ≠ 0 neg n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = truec':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩h2:(c.getDual? 0).get h✝ = i.succx:Fin (n + 1)y:Fin (n + 1)hx:¬x.succ = y.succh:{x.succ, y.succ} ∈ ↑cha:¬{x.succ, y.succ} = {0, i.succ}hd:(¬0 = x.succ ∧ ¬0 = y.succ) ∧ ¬i.succ = x.succ ∧ ¬i.succ = y.succ⊢ ∃ a ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) = {x.succ, y.succ} omega All goals completed! 🐙neg n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = truec':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩h2:(c.getDual? 0).get h✝ = i.succx:Fin (n + 1)y:Fin (n + 1)hx:¬x.succ = y.succh:{x.succ, y.succ} ∈ ↑cha:¬{x.succ, y.succ} = {0, i.succ}hd:(¬0 = x.succ ∧ ¬0 = y.succ) ∧ ¬i.succ = x.succ ∧ ¬i.succ = y.succ⊢ ∃ a ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) = {x.succ, y.succ})neg n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = truec':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩h2:(c.getDual? 0).get h✝ = i.succx:Fin (n + 1)y:Fin (n + 1)hx:¬x.succ = y.succh:{x.succ, y.succ} ∈ ↑cha:¬{x.succ, y.succ} = {0, i.succ}hd:(¬0 = x.succ ∧ ¬0 = y.succ) ∧ ¬i.succ = x.succ ∧ ¬i.succ = y.succ⊢ ∃ a ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) = {x.succ, y.succ}
simp_all only [Fin.succ_inj] neg n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = truec':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩h2:(c.getDual? 0).get h✝ = i.succx:Fin (n + 1)y:Fin (n + 1)hx:¬x = yh:{x.succ, y.succ} ∈ ↑cha:¬{x.succ, y.succ} = {0, i.succ}hd:(¬0 = x.succ ∧ ¬0 = y.succ) ∧ ¬i = x ∧ ¬i = y⊢ ∃ a ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) = {x.succ, y.succ}
obtain ⟨x, rfl⟩ := (Fin.exists_succAbove_eq (x := x) (y := i)) (by n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = truec':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩h2:(c.getDual? 0).get h✝ = i.succx:Fin (n + 1)y:Fin (n + 1)hx:¬x = yh:{x.succ, y.succ} ∈ ↑cha:¬{x.succ, y.succ} = {0, i.succ}hd:(¬0 = x.succ ∧ ¬0 = y.succ) ∧ ¬i = x ∧ ¬i = y⊢ x ≠ i neg n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = truec':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩h2:(c.getDual? 0).get h✝ = i.succy:Fin (n + 1)x:Fin nhx:¬i.succAbove x = yh:{(i.succAbove x).succ, y.succ} ∈ ↑cha:¬{(i.succAbove x).succ, y.succ} = {0, i.succ}hd:(¬0 = (i.succAbove x).succ ∧ ¬0 = y.succ) ∧ ¬i = i.succAbove x ∧ ¬i = y⊢ ∃ a ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) = {(i.succAbove x).succ, y.succ} omega All goals completed! 🐙neg n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = truec':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩h2:(c.getDual? 0).get h✝ = i.succy:Fin (n + 1)x:Fin nhx:¬i.succAbove x = yh:{(i.succAbove x).succ, y.succ} ∈ ↑cha:¬{(i.succAbove x).succ, y.succ} = {0, i.succ}hd:(¬0 = (i.succAbove x).succ ∧ ¬0 = y.succ) ∧ ¬i = i.succAbove x ∧ ¬i = y⊢ ∃ a ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) = {(i.succAbove x).succ, y.succ})neg n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = truec':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩h2:(c.getDual? 0).get h✝ = i.succy:Fin (n + 1)x:Fin nhx:¬i.succAbove x = yh:{(i.succAbove x).succ, y.succ} ∈ ↑cha:¬{(i.succAbove x).succ, y.succ} = {0, i.succ}hd:(¬0 = (i.succAbove x).succ ∧ ¬0 = y.succ) ∧ ¬i = i.succAbove x ∧ ¬i = y⊢ ∃ a ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) = {(i.succAbove x).succ, y.succ}
obtain ⟨y, rfl⟩ := (Fin.exists_succAbove_eq (x := y) (y := i)) (by n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = truec':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩h2:(c.getDual? 0).get h✝ = i.succy:Fin (n + 1)x:Fin nhx:¬i.succAbove x = yh:{(i.succAbove x).succ, y.succ} ∈ ↑cha:¬{(i.succAbove x).succ, y.succ} = {0, i.succ}hd:(¬0 = (i.succAbove x).succ ∧ ¬0 = y.succ) ∧ ¬i = i.succAbove x ∧ ¬i = y⊢ y ≠ i neg n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = truec':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩h2:(c.getDual? 0).get h✝ = i.succx:Fin ny:Fin nhx:¬i.succAbove x = i.succAbove yh:{(i.succAbove x).succ, (i.succAbove y).succ} ∈ ↑cha:¬{(i.succAbove x).succ, (i.succAbove y).succ} = {0, i.succ}hd:(¬0 = (i.succAbove x).succ ∧ ¬0 = (i.succAbove y).succ) ∧ ¬i = i.succAbove x ∧ ¬i = i.succAbove y⊢ ∃ a ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) = {(i.succAbove x).succ, (i.succAbove y).succ} omega All goals completed! 🐙neg n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = truec':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩h2:(c.getDual? 0).get h✝ = i.succx:Fin ny:Fin nhx:¬i.succAbove x = i.succAbove yh:{(i.succAbove x).succ, (i.succAbove y).succ} ∈ ↑cha:¬{(i.succAbove x).succ, (i.succAbove y).succ} = {0, i.succ}hd:(¬0 = (i.succAbove x).succ ∧ ¬0 = (i.succAbove y).succ) ∧ ¬i = i.succAbove x ∧ ¬i = i.succAbove y⊢ ∃ a ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) = {(i.succAbove x).succ, (i.succAbove y).succ})neg n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = truec':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩h2:(c.getDual? 0).get h✝ = i.succx:Fin ny:Fin nhx:¬i.succAbove x = i.succAbove yh:{(i.succAbove x).succ, (i.succAbove y).succ} ∈ ↑cha:¬{(i.succAbove x).succ, (i.succAbove y).succ} = {0, i.succ}hd:(¬0 = (i.succAbove x).succ ∧ ¬0 = (i.succAbove y).succ) ∧ ¬i = i.succAbove x ∧ ¬i = i.succAbove y⊢ ∃ a ∈ ↑c', Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb a) = {(i.succAbove x).succ, (i.succAbove y).succ}
use {x, y} h n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = truec':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩h2:(c.getDual? 0).get h✝ = i.succx:Fin ny:Fin nhx:¬i.succAbove x = i.succAbove yh:{(i.succAbove x).succ, (i.succAbove y).succ} ∈ ↑cha:¬{(i.succAbove x).succ, (i.succAbove y).succ} = {0, i.succ}hd:(¬0 = (i.succAbove x).succ ∧ ¬0 = (i.succAbove y).succ) ∧ ¬i = i.succAbove x ∧ ¬i = i.succAbove y⊢ {x, y} ∈ ↑c' ∧
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb {x, y}) = {(i.succAbove x).succ, (i.succAbove y).succ}
simp only [c'] h n:ℕi:Fin n.succc:WickContraction n.succ.succh✝:(c.getDual? 0).isSome = truec':WickContraction n := ⟨{x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c}, ⋯⟩h2:(c.getDual? 0).get h✝ = i.succx:Fin ny:Fin nhx:¬i.succAbove x = i.succAbove yh:{(i.succAbove x).succ, (i.succAbove y).succ} ∈ ↑cha:¬{(i.succAbove x).succ, (i.succAbove y).succ} = {0, i.succ}hd:(¬0 = (i.succAbove x).succ ∧ ¬0 = (i.succAbove y).succ) ∧ ¬i = i.succAbove x ∧ ¬i = i.succAbove y⊢ {x, y} ∈ {x | Finset.map (Fin.succEmb n.succ) (Finset.map i.succAboveEmb x) ∈ ↑c} ∧
Finset.map (Fin.succEmb (n + 1)) (Finset.map i.succAboveEmb {x, y}) = {(i.succAbove x).succ, (i.succAbove y).succ}
simpa using h All goals completed! 🐙lemma consAddContract_bijection (i : Fin n.succ) :
Function.Bijective (fun c => (⟨(consAddContract i c), by 𝓕:FieldSpecificationn:ℕc✝:WickContraction ni:Fin n.succc:WickContraction n⊢ ((consAddContract i c).getDual? 0).isSome = true ∧
∀ (h : ((consAddContract i c).getDual? 0).isSome = true), ((consAddContract i c).getDual? 0).get h = i.succ simp All goals completed! 🐙⟩ :
{c : WickContraction n.succ.succ // (c.getDual? 0).isSome ∧
∀ (h : (c.getDual? 0).isSome), (c.getDual? 0).get h = Fin.succ i})) := by n:ℕi:Fin n.succ⊢ Function.Bijective fun c => ⟨consAddContract i c, ⋯⟩
apply And.intro left n:ℕi:Fin n.succ⊢ Function.Injective fun c => ⟨consAddContract i c, ⋯⟩right n:ℕi:Fin n.succ⊢ Function.Surjective fun c => ⟨consAddContract i c, ⋯⟩
· left n:ℕi:Fin n.succ⊢ Function.Injective fun c => ⟨consAddContract i c, ⋯⟩ intro c1 c2 h left n:ℕi:Fin n.succc1:WickContraction nc2:WickContraction nh:(fun c => ⟨consAddContract i c, ⋯⟩) c1 = (fun c => ⟨consAddContract i c, ⋯⟩) c2⊢ c1 = c2
simp only [succ_eq_add_one, Subtype.mk.injEq] at h left n:ℕi:Fin n.succc1:WickContraction nc2:WickContraction nh:consAddContract i c1 = consAddContract i c2⊢ c1 = c2
exact consAddContract_injective i h All goals completed! 🐙
· right n:ℕi:Fin n.succ⊢ Function.Surjective fun c => ⟨consAddContract i c, ⋯⟩ intro c right n:ℕi:Fin n.succc:{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ }⊢ ∃ a, (fun c => ⟨consAddContract i c, ⋯⟩) a = c
obtain ⟨c', hc⟩ := consAddContract_surjective_on_zero_contract i c.1 c.2.1 (c.2.2 c.2.1) right n:ℕi:Fin n.succc:{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ }c':WickContraction nhc:consAddContract i c' = ↑c⊢ ∃ a, (fun c => ⟨consAddContract i c, ⋯⟩) a = c
use c' h n:ℕi:Fin n.succc:{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ }c':WickContraction nhc:consAddContract i c' = ↑c⊢ (fun c => ⟨consAddContract i c, ⋯⟩) c' = c
simp [hc] All goals completed! 🐙
lemma wickContraction_zero_some_eq_mul :
Fintype.card {c : WickContraction n.succ.succ // (c.getDual? 0).isSome} =
(n + 1) * Fintype.card (WickContraction n) := by n:ℕ⊢ Fintype.card { c // (c.getDual? 0).isSome = true } = (n + 1) * Fintype.card (WickContraction n)
rw [wickContraction_zero_some_eq_sum n:ℕ⊢ ∑ i,
Fintype.card
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ } =
(n + 1) * Fintype.card (WickContraction n) n:ℕ⊢ ∑ i,
Fintype.card
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ } =
(n + 1) * Fintype.card (WickContraction n)] n:ℕ⊢ ∑ i,
Fintype.card
{ c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ } =
(n + 1) * Fintype.card (WickContraction n)
conv_lhs =>
enter [2, i] n:ℕi:Fin (n + 1)| Fintype.card { c // (c.getDual? 0).isSome = true ∧ ∀ (h : (c.getDual? 0).isSome = true), (c.getDual? 0).get h = i.succ }
rw [← Fintype.card_of_bijective (consAddContract_bijection i)] n:ℕi:Fin (n + 1)| Fintype.card (WickContraction n)
simp All goals completed! 🐙The cardinality of Wick's contractions as a recursive formula. This corresponds to OEIS:A000085.
def cardFun : ℕ → ℕ
| 0 => 1
| 1 => 1
| Nat.succ (Nat.succ n) => cardFun (Nat.succ n) + (n + 1) * cardFun n
The number of Wick contractions in WickContraction n is equal to the terms in
Online Encyclopedia of Integer Sequences (OEIS) A000085. That is:
1, 1, 2, 4, 10, 26, 76, 232, 764, 2620, 9496, ...
theorem card_eq_cardFun : (n : ℕ) → Fintype.card (WickContraction n) = cardFun n
| 0 => ⊢ Fintype.card (WickContraction 0) = cardFun 0 by ⊢ Fintype.card (WickContraction 0) = cardFun 0 decide All goals completed! 🐙
| 1 => ⊢ Fintype.card (WickContraction 1) = cardFun 1 by ⊢ Fintype.card (WickContraction 1) = cardFun 1 decide All goals completed! 🐙
| Nat.succ (Nat.succ n) => n:ℕ⊢ Fintype.card (WickContraction n.succ.succ) = cardFun n.succ.succ by n:ℕ⊢ Fintype.card (WickContraction n.succ.succ) = cardFun n.succ.succ
rw [wickContraction_card_eq_sum_zero_none_isSome, n:ℕ⊢ Fintype.card { c // ¬(c.getDual? 0).isSome = true } + Fintype.card { c // (c.getDual? 0).isSome = true } =
cardFun n.succ.succ n:ℕ⊢ Fintype.card (WickContraction (n + 1)) + (n + 1) * Fintype.card (WickContraction n) = cardFun n.succ.succ wickContraction_zero_none_card, n:ℕ⊢ Fintype.card (WickContraction (n + 1)) + Fintype.card { c // (c.getDual? 0).isSome = true } = cardFun n.succ.succ n:ℕ⊢ Fintype.card (WickContraction (n + 1)) + (n + 1) * Fintype.card (WickContraction n) = cardFun n.succ.succ
wickContraction_zero_some_eq_mul n:ℕ⊢ Fintype.card (WickContraction (n + 1)) + (n + 1) * Fintype.card (WickContraction n) = cardFun n.succ.succ n:ℕ⊢ Fintype.card (WickContraction (n + 1)) + (n + 1) * Fintype.card (WickContraction n) = cardFun n.succ.succ] n:ℕ⊢ Fintype.card (WickContraction (n + 1)) + (n + 1) * Fintype.card (WickContraction n) = cardFun n.succ.succ
simp only [cardFun, succ_eq_add_one] n:ℕ⊢ Fintype.card (WickContraction (n + 1)) + (n + 1) * Fintype.card (WickContraction n) =
cardFun (n + 1) + (n + 1) * cardFun n
rw [← card_eq_cardFun n, n:ℕ⊢ Fintype.card (WickContraction (n + 1)) + (n + 1) * Fintype.card (WickContraction n) =
cardFun (n + 1) + (n + 1) * Fintype.card (WickContraction n) All goals completed! 🐙 ← card_eq_cardFun (n + 1) n:ℕ⊢ Fintype.card (WickContraction (n + 1)) + (n + 1) * Fintype.card (WickContraction n) =
Fintype.card (WickContraction (n + 1)) + (n + 1) * Fintype.card (WickContraction n) All goals completed! 🐙] All goals completed! 🐙