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.Erase

Inserting an element into a contraction

@[expose] public section

Inserting 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' ca' = b' Disjoint a' b' 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) := 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) 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) All goals completed! 🐙n:c:WickContraction ni:Fin n.succx:Fin ny:Fin nhxy:x yha:{x, y} ci Finset.map i.succAboveEmb {x, y} n:c:WickContraction ni:Fin n.succx:Fin ny:Fin nhxy:x yha:{x, y} c¬i = i.succAbove x ¬i = i.succAbove y n:c:WickContraction ni:Fin n.succx:Fin ny:Fin nhxy:x yha:{x, y} c¬i = i.succAbove xn:c:WickContraction ni:Fin n.succx:Fin ny:Fin nhxy:x yha:{x, y} c¬i = i.succAbove y n:c:WickContraction ni:Fin n.succx:Fin ny:Fin nhxy:x yha:{x, y} c¬i = i.succAbove x All goals completed! 🐙 n:c:WickContraction ni:Fin n.succx:Fin ny:Fin nhxy:x yha:{x, y} c¬i = i.succAbove y All goals completed! 🐙n:c:WickContraction ni:Fin n.succj:c.uncontracted¬ p (c.insertAndContractNat i (some j)), i p 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 := n:c:WickContraction ni:Fin n.succj:Fin ni.succAbove j (c.insertAndContractNat i none).uncontracted j c.uncontracted 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 := n:c:WickContraction ni:Fin n.succk:Fin n.succk (c.insertAndContractNat i none).uncontracted k = i j, k = i.succAbove j j c.uncontracted n:c:WickContraction nk:Fin n.succk (c.insertAndContractNat k none).uncontracted k = k j, k = k.succAbove j j c.uncontractedn:c:WickContraction ni:Fin n.succz:Fin ni.succAbove z (c.insertAndContractNat i none).uncontracted i.succAbove z = i j, i.succAbove z = i.succAbove j j c.uncontracted n:c:WickContraction nk:Fin n.succk (c.insertAndContractNat k none).uncontracted k = k j, k = k.succAbove j j c.uncontracted All goals completed! 🐙 n:c:WickContraction ni:Fin n.succz:Fin ni.succAbove z (c.insertAndContractNat i none).uncontracted i.succAbove z = i j, i.succAbove z = i.succAbove j j c.uncontracted 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) := n:c:WickContraction ni:Fin n.succ(c.insertAndContractNat i none).uncontracted = insert i (Finset.map i.succAboveEmb c.uncontracted) n:c:WickContraction ni:Fin n.succa:Fin n.succa (c.insertAndContractNat i none).uncontracted a insert i (Finset.map i.succAboveEmb c.uncontracted) All goals completed! 🐙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 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 := n:c:WickContraction ni:Fin n.succj:c.uncontracted(c.insertAndContractNat i (some j)).uncontracted = Finset.map i.succAboveEmb (c.uncontracted.erase j) n:c:WickContraction ni:Fin n.succj:c.uncontracteda:Fin n.succa (c.insertAndContractNat i (some j)).uncontracted a Finset.map i.succAboveEmb (c.uncontracted.erase j) 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 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 := n:c:WickContraction ni:Fin n.succ((c.insertAndContractNat i none).getDual? i).isNone = true 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 := n:c:WickContraction ni:Fin n.succ(c.insertAndContractNat i none).getDual? i = none 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 := n:c:WickContraction ni:Fin n.succj:Fin n(c.insertAndContractNat i none).getDual? (i.succAbove j) = none c.getDual? j = none 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 := n:c:WickContraction ni:Fin n.succj:Fin n((c.insertAndContractNat i none).getDual? (i.succAbove j)).isSome = true (c.getDual? j).isSome = true 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 (𝓕: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 All goals completed! 🐙)) := 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 ) 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) 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 (n:c:WickContraction ni:Fin n.succj:Fin nh:((c.insertAndContractNat i none).getDual? (i.succAbove j)).isSome = true(c.getDual? j).isSome = true All goals completed! 🐙), 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 )} All goals completed! 🐙n:c:WickContraction ni:Fin n.succj:c.uncontracted{i, i.succAbove j} (c.insertAndContractNat i (some j)) 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 := 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 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 := 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 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 (𝓕: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 All goals completed! 🐙)) := 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 ) 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)) 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 (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 All goals completed! 🐙), 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 )} All goals completed! 🐙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)) 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, 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} All goals completed! 🐙

Interaction with erase.

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 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) (𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction ni:Fin n.succj:Option c.uncontractedc = (c.insertAndContractNat i j).erase i All goals completed! 🐙) j := n:c:WickContraction ni:Fin n.succj:Option c.uncontracted(c.insertAndContractNat i j).getDualErase i = (uncontractedCongr ) j match n with n:c:WickContraction 0i:Fin (Nat.succ 0)j:Option c.uncontracted(c.insertAndContractNat i j).getDualErase i = (uncontractedCongr ) j n:c:WickContraction 0i:Fin (Nat.succ 0)(c.insertAndContractNat i none).getDualErase i = (uncontractedCongr ) none All goals completed! 🐙 n✝:n:c:WickContraction n.succi:Fin n.succ.succj:Option c.uncontracted(c.insertAndContractNat i j).getDualErase i = (uncontractedCongr ) j match j with n✝:n:c:WickContraction n.succi:Fin n.succ.succj:Option c.uncontracted(c.insertAndContractNat i none).getDualErase i = (uncontractedCongr ) none All goals completed! 🐙 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) n✝:n:c:WickContraction n.succi:Fin n.succ.succj✝:Option c.uncontractedj:c.uncontractedj, = (Equiv.subtypeEquivRight ) j All goals completed! 🐙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' 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), 𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction ni:Fin n.succj:Option c.uncontracteda:cFinset.map i.succAboveEmb a (c.insertAndContractNat i j) 𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction ni:Fin n.succj:Option c.uncontracteda:cFinset.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 𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction ni:Fin n.succj:Option c.uncontracteda:cFinset.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) 𝓕: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 𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction ni:Fin n.succj:Option c.uncontracteda:ca c (Finset.mapEmbedding i.succAboveEmb) a = Finset.map i.succAboveEmb a 𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction ni:Fin n.succj:Option c.uncontracteda:c(Finset.mapEmbedding i.succAboveEmb) a = Finset.map i.succAboveEmb a All goals completed! 🐙 𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction ni:Fin n.succj✝:Option c.uncontracteda:cj:c.uncontractedFinset.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) 𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction ni:Fin n.succj✝:Option c.uncontracteda:cj:c.uncontractedFinset.map i.succAboveEmb a = {i, i.succAbove j} a_1 c, (Finset.mapEmbedding i.succAboveEmb) a_1 = Finset.map i.succAboveEmb a 𝓕: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 𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction ni:Fin n.succj✝:Option c.uncontracteda:cj:c.uncontracteda c (Finset.mapEmbedding i.succAboveEmb) a = Finset.map i.succAboveEmb a 𝓕: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 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) := n:c:WickContraction ni:Fin n.succFunction.Surjective (insertLift i none) n:c:WickContraction ni:Fin n.succa:(c.insertAndContractNat i none) a_1, insertLift i none a_1 = a 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 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}, 𝓕:FieldSpecificationn:c✝:WickContraction nc:WickContraction ni:Fin n.succj:c.uncontracteda:Unit c{i, i.succAbove j} (c.insertAndContractNat i (some j)) All goals completed! 🐙 | Sum.inr a => c.insertLift i j a
lemma insertLiftSome_injective {c : WickContraction n} (i : Fin n.succ) (j : c.uncontracted) : Function.Injective (insertLiftSome i j) := n:c:WickContraction ni:Fin n.succj:c.uncontractedFunction.Injective (insertLiftSome i j) n:c:WickContraction ni:Fin n.succj:c.uncontracteda:Unit cb:Unit chab:insertLiftSome i j a = insertLiftSome i j ba = b match a, b with 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 () All goals completed! 🐙 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 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 () 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 aSum.inr a = Sum.inl () All goals completed! 🐙 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 All goals completed! 🐙lemma insertLiftSome_surjective {c : WickContraction n} (i : Fin n.succ) (j : c.uncontracted) : Function.Surjective (insertLiftSome i j) := n:c:WickContraction ni:Fin n.succj:c.uncontractedFunction.Surjective (insertLiftSome i j) n:c:WickContraction ni:Fin n.succj:c.uncontracteda:(c.insertAndContractNat i (some j)) a_1, insertLiftSome i j a_1 = a 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 = an: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 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 All goals completed! 🐙 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 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 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 (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✝ 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 All goals completed! 🐙lemma insertAndContractNat_bijective (i : Fin n.succ) : Function.Bijective (fun c => (insertAndContractNat c i none, 𝓕:FieldSpecificationn:c✝:WickContraction ni:Fin n.succc:WickContraction n(c.insertAndContractNat i none).getDual? i = none All goals completed! 🐙 : {c : WickContraction n.succ // c.getDual? i = none})) := n:i:Fin n.succFunction.Bijective fun c => c.insertAndContractNat i none, refine fun a b hab => insertAndContractNat_injective i (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 All goals completed! 🐙), fun c => ?_ All goals completed! 🐙