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.FieldSpecification.CrAnFieldOp public import Physlib.Mathematics.List

Creation and annihilation sections

In the module Physlib.QFT.PerturbationTheory.FieldSpecification.Basic we defined states for a field specification, and in the module Physlib.QFT.PerturbationTheory.FieldStatistics.CrAnFieldOp we defined a refinement of states called CrAnFieldOp which distinguishes between the creation and annihilation components of states. There exists, in particular, a map from CrAnFieldOp to FieldOp called crAnFieldOpToFieldOp.

Given a list of FieldOp, φs, in this module we define a section of φs to be a list of CrAnFieldOp, ψs, such that under the map crAnFieldOpToFieldOp, ψs is mapped to φs. That is to say, the states underlying ψs are the states in φs. We denote these sections as CrAnSection φs.

Looking forward the main consequence of this definition is the lemma FieldSpecification.FieldOpFreeAlgebra.ofFieldOpListF_sum.

In this module we define various properties of CrAnSection.

@[expose] public section

The sections in 𝓕.CrAnFieldOp over a list φs : List 𝓕.FieldOp. In terms of physics, given some fields φ₁...φₙ, the different ways one can associate each field as a creation or an annilation operator. E.g. the number of terms φ₁⁰φ₂¹...φₙ⁰ φ₁¹φ₂¹...φₙ⁰ etc. If some fields are exclusively creation or annihilation operators at this point (e.g. asymptotic states) this is accounted for.

def CrAnSection (φs : List 𝓕.FieldOp) : Type := {ψs : List 𝓕.CrAnFieldOp // ψs.map 𝓕.crAnFieldOpToFieldOp = φs}
-- Π i, 𝓕.fieldOpToCreateAnnihilateType (φs.get i) namespace CrAnSection@[simp] lemma length_eq (ψs : CrAnSection φs) : ψs.1.length = φs.length := 𝓕:FieldSpecificationφs:List 𝓕.FieldOpψs:CrAnSection φs(↑ψs).length = φs.length All goals completed! 🐙

The tail of a section for φs.

𝓕✝:FieldSpecification𝓕:FieldSpecificationφs✝:List 𝓕.FieldOpφ:𝓕.FieldOpφs:List 𝓕.FieldOpψ:𝓕.CrAnFieldOpψs:List 𝓕.CrAnFieldOph:𝓕.crAnFieldOpToFieldOp ψ = φ List.map 𝓕.crAnFieldOpToFieldOp ψs = φsList.map 𝓕.crAnFieldOpToFieldOp ψs = (φ :: φs).tail; All goals completed! 🐙
lemma head_state_eq {φ : 𝓕.FieldOp} : (ψs : CrAnSection (φ :: φs)) (ψs.1.head (𝓕✝:FieldSpecification𝓕:FieldSpecificationφs:List 𝓕.FieldOpφ:𝓕.FieldOpψs:CrAnSection (φ :: φs)ψs [] All goals completed! 🐙)).1 = φ | [], h => False.elim (𝓕:FieldSpecificationφs:List 𝓕.FieldOpφ:𝓕.FieldOph:List.map 𝓕.crAnFieldOpToFieldOp [] = φ :: φsFalse All goals completed! 🐙) 𝓕:FieldSpecificationφs:List 𝓕.FieldOpφ:𝓕.FieldOpψ:𝓕.CrAnFieldOpψs:List 𝓕.CrAnFieldOph:List.map 𝓕.crAnFieldOpToFieldOp (ψ :: ψs) = φ :: φs((↑ψ :: ψs, h).head ).fst = φ 𝓕:FieldSpecificationφs:List 𝓕.FieldOpφ:𝓕.FieldOpψ:𝓕.CrAnFieldOpψs:List 𝓕.CrAnFieldOph:List.map 𝓕.crAnFieldOpToFieldOp (ψ :: ψs) = φ :: φs((↑ψ :: ψs, h).head ).fst = φ 𝓕:FieldSpecificationφs:List 𝓕.FieldOpφ:𝓕.FieldOpψ:𝓕.CrAnFieldOpψs:List 𝓕.CrAnFieldOph✝:List.map 𝓕.crAnFieldOpToFieldOp (ψ :: ψs) = φ :: φsh:𝓕.crAnFieldOpToFieldOp ψ = φ List.map 𝓕.crAnFieldOpToFieldOp ψs = φs((↑ψ :: ψs, h).head ).fst = φ All goals completed! 🐙All goals completed! 🐙All goals completed! 🐙

The head of a section for φ :: φs as an element in 𝓕.fieldOpToCreateAnnihilateType φ.

def head : {φ : 𝓕.FieldOp} (ψs : CrAnSection (φ :: φs)) 𝓕.fieldOpToCrAnType φ | φ, [], h => False.elim (𝓕✝:FieldSpecification𝓕:FieldSpecificationφs:List 𝓕.FieldOpφ:𝓕.FieldOph:List.map 𝓕.crAnFieldOpToFieldOp [] = φ :: φsFalse All goals completed! 🐙) | φ, ψ :: ψs, h => 𝓕.fieldOpToCreateAnnihilateTypeCongr (𝓕✝:FieldSpecification𝓕:FieldSpecificationφs:List 𝓕.FieldOpφ:𝓕.FieldOpψ:𝓕.CrAnFieldOpψs:List 𝓕.CrAnFieldOph:List.map 𝓕.crAnFieldOpToFieldOp (ψ :: ψs) = φ :: φsψ.fst = φ All goals completed! 🐙) ψ.2
lemma eq_head_cons_tail {φ : 𝓕.FieldOp} {ψs : CrAnSection (φ :: φs)} : ψs.1 = φ, head ψs :: ψs.tail.1 := 𝓕:FieldSpecificationφs:List 𝓕.FieldOpφ:𝓕.FieldOpψs:CrAnSection (φ :: φs)ψs = φ, ψs.head :: ψs.tail match ψs with 𝓕:FieldSpecificationφs:List 𝓕.FieldOpφ:𝓕.FieldOpψs:CrAnSection (φ :: φs)h:List.map 𝓕.crAnFieldOpToFieldOp [] = φ :: φs[], h = φ, head [], h :: (tail [], h) exact False.elim (𝓕:FieldSpecificationφs:List 𝓕.FieldOpφ:𝓕.FieldOpψs:CrAnSection (φ :: φs)h:List.map 𝓕.crAnFieldOpToFieldOp [] = φ :: φsFalse All goals completed! 🐙) 𝓕:FieldSpecificationφs:List 𝓕.FieldOpφ:𝓕.FieldOpψs✝:CrAnSection (φ :: φs)ψ:𝓕.CrAnFieldOpψs:List 𝓕.CrAnFieldOph:List.map 𝓕.crAnFieldOpToFieldOp (ψ :: ψs) = φ :: φsψ :: ψs, h = φ, head ψ :: ψs, h :: (tail ψ :: ψs, h) 𝓕:FieldSpecificationφs:List 𝓕.FieldOpφ:𝓕.FieldOpψs✝:CrAnSection (φ :: φs)ψ:𝓕.CrAnFieldOpψs:List 𝓕.CrAnFieldOph:List.map 𝓕.crAnFieldOpToFieldOp (ψ :: ψs) = φ :: φsh2:((↑ψ :: ψs, h).head ).fst = φψ :: ψs, h = φ, head ψ :: ψs, h :: (tail ψ :: ψs, h) 𝓕:FieldSpecificationφs:List 𝓕.FieldOpφ:𝓕.FieldOpψs✝:CrAnSection (φ :: φs)ψ:𝓕.CrAnFieldOpψs:List 𝓕.CrAnFieldOph:List.map 𝓕.crAnFieldOpToFieldOp (ψ :: ψs) = φ :: φsh2:ψ.fst = φψ :: ψs, h = φ, head ψ :: ψs, h :: (tail ψ :: ψs, h) 𝓕:FieldSpecificationφs:List 𝓕.FieldOpψ:𝓕.CrAnFieldOpψs✝:List 𝓕.CrAnFieldOpψs:CrAnSection (ψ.fst :: φs)h:List.map 𝓕.crAnFieldOpToFieldOp (ψ :: ψs✝) = ψ.fst :: φsψ :: ψs✝, h = ψ.fst, head ψ :: ψs✝, h :: (tail ψ :: ψs✝, h) All goals completed! 🐙

The creation of a section from for φ : φs from a section for φs and a element of 𝓕.fieldOpToCreateAnnihilateType φ.

def cons {φ : 𝓕.FieldOp} (ψ : 𝓕.fieldOpToCrAnType φ) (ψs : CrAnSection φs) : CrAnSection (φ :: φs) := φ, ψ :: ψs.1, 𝓕✝:FieldSpecification𝓕:FieldSpecificationφs:List 𝓕.FieldOpφ:𝓕.FieldOpψ:𝓕.fieldOpToCrAnType φψs:CrAnSection φsList.map 𝓕.crAnFieldOpToFieldOp (φ, ψ :: ψs) = φ :: φs All goals completed! 🐙

For the empty list of states there is only one CrAnSection. Corresponding to the empty list of CrAnFieldOp.

def nilEquiv : CrAnSection (𝓕 := 𝓕) [] Unit where toFun _ := () invFun _ := [], rfl left_inv ψs := Subtype.ext <| 𝓕✝:FieldSpecification𝓕:FieldSpecificationφs:List 𝓕.FieldOpψs:CrAnSection []((fun x => [], ) ((fun x => ()) ψs)) = ψs 𝓕✝:FieldSpecification𝓕:FieldSpecificationφs:List 𝓕.FieldOpψs:CrAnSection []h2:List.map 𝓕.crAnFieldOpToFieldOp ψs = []((fun x => [], ) ((fun x => ()) ψs)) = ψs 𝓕✝:FieldSpecification𝓕:FieldSpecificationφs:List 𝓕.FieldOpψs:CrAnSection []h2:ψs = []((fun x => [], ) ((fun x => ()) ψs)) = ψs All goals completed! 🐙 right_inv _ := 𝓕✝:FieldSpecification𝓕:FieldSpecificationφs:List 𝓕.FieldOpx✝:Unit(fun x => ()) ((fun x => [], ) x✝) = x✝ All goals completed! 🐙

The creation and annihilation sections for a singleton list is given by a choice of 𝓕.fieldOpToCreateAnnihilateType φ. If φ is a asymptotic state there is no choice here, else there are two choices.

𝓕✝:FieldSpecification𝓕:FieldSpecificationφs:List 𝓕.FieldOpφ:𝓕.FieldOpψs:CrAnSection [φ]h1:ψs = φ, ψs.head :: ψs.tail[φ, ψs.head] = φ, ψs.head :: ψs.tail 𝓕✝:FieldSpecification𝓕:FieldSpecificationφs:List 𝓕.FieldOpφ:𝓕.FieldOpψs:CrAnSection [φ]h1:ψs = φ, ψs.head :: ψs.tailh2:List.map 𝓕.crAnFieldOpToFieldOp ψs.tail = [φ].tail[φ, ψs.head] = φ, ψs.head :: ψs.tail 𝓕✝:FieldSpecification𝓕:FieldSpecificationφs:List 𝓕.FieldOpφ:𝓕.FieldOpψs:CrAnSection [φ]h1:ψs = φ, ψs.head :: ψs.tailh2:ψs.tail = [][φ, ψs.head] = φ, ψs.head :: ψs.tail All goals completed! 🐙 right_inv ψ := 𝓕✝:FieldSpecification𝓕:FieldSpecificationφs:List 𝓕.FieldOpφ:𝓕.FieldOpψ:𝓕.fieldOpToCrAnType φ(fun ψs => ψs.head) ((fun ψ => [φ, ψ], ) ψ) = ψ 𝓕✝:FieldSpecification𝓕:FieldSpecificationφs:List 𝓕.FieldOpφ:𝓕.FieldOpψ:𝓕.fieldOpToCrAnType φ(𝓕.fieldOpToCreateAnnihilateTypeCongr ) ψ = ψ All goals completed! 🐙

An equivalence separating the head of a creation and annihilation section from the tail.

def consEquiv {φ : 𝓕.FieldOp} {φs : List 𝓕.FieldOp} : CrAnSection (φ :: φs) 𝓕.fieldOpToCrAnType φ × CrAnSection φs where toFun ψs := ψs.head, ψs.tail invFun ψψs := match ψψs with | (ψ, ψs) => cons ψ ψs left_inv ψs := 𝓕✝:FieldSpecification𝓕:FieldSpecificationφs✝:List 𝓕.FieldOpφ:𝓕.FieldOpφs:List 𝓕.FieldOpψs:CrAnSection (φ :: φs)(fun ψψs => match ψψs with | (ψ, ψs) => cons ψ ψs) ((fun ψs => (ψs.head, ψs.tail)) ψs) = ψs 𝓕✝:FieldSpecification𝓕:FieldSpecificationφs✝:List 𝓕.FieldOpφ:𝓕.FieldOpφs:List 𝓕.FieldOpψs:CrAnSection (φ :: φs)((fun ψψs => match ψψs with | (ψ, ψs) => cons ψ ψs) ((fun ψs => (ψs.head, ψs.tail)) ψs)) = ψs All goals completed! 🐙 right_inv ψψs := 𝓕✝:FieldSpecification𝓕:FieldSpecificationφs✝:List 𝓕.FieldOpφ:𝓕.FieldOpφs:List 𝓕.FieldOpψψs:𝓕.fieldOpToCrAnType φ × CrAnSection φs(fun ψs => (ψs.head, ψs.tail)) ((fun ψψs => match ψψs with | (ψ, ψs) => cons ψ ψs) ψψs) = ψψs match ψψs with 𝓕✝:FieldSpecification𝓕:FieldSpecificationφs✝:List 𝓕.FieldOpφ:𝓕.FieldOpφs:List 𝓕.FieldOpψψs:𝓕.fieldOpToCrAnType φ × CrAnSection φsψ:𝓕.fieldOpToCrAnType φψs:CrAnSection φs(fun ψs => (ψs.head, ψs.tail)) ((fun ψψs => match ψψs with | (ψ, ψs) => cons ψ ψs) (ψ, ψs)) = (ψ, ψs) All goals completed! 🐙

The instance of a finite type on CrAnSections defined recursively through consEquiv.

instance fintype : (φs : List 𝓕.FieldOp) Fintype (CrAnSection φs) | [] => Fintype.ofEquiv _ nilEquiv.symm | _ :: φs => haveI : Fintype (CrAnSection φs) := fintype φs Fintype.ofEquiv _ consEquiv.symm
𝓕:FieldSpecificationFintype.card Unit = 1 All goals completed! 🐙𝓕:FieldSpecificationφ:𝓕.FieldOpφs:List 𝓕.FieldOpFintype.card (𝓕.fieldOpToCrAnType φ × CrAnSection φs) = Fintype.card (𝓕.fieldOpToCrAnType φ) * Fintype.card (CrAnSection φs) All goals completed! 🐙𝓕:FieldSpecificationa✝:((f : 𝓕.Field) × 𝓕.AsymptoticLabel f) × Momentumφs:List 𝓕.FieldOpFintype.card (𝓕.fieldOpToCrAnType (FieldOp.outAsymp a✝)) * 2 ^ List.countP 𝓕.statesIsPosition φs = 2 ^ List.countP 𝓕.statesIsPosition φs All goals completed! 🐙𝓕:FieldSpecificationφs:List 𝓕.FieldOpφs':List 𝓕.FieldOph:φs.Perm φs'2 ^ List.countP 𝓕.statesIsPosition φs = 2 ^ List.countP 𝓕.statesIsPosition φs' 𝓕:FieldSpecificationφs:List 𝓕.FieldOpφs':List 𝓕.FieldOph:φs.Perm φs'List.countP 𝓕.statesIsPosition φs = List.countP 𝓕.statesIsPosition φs' All goals completed! 🐙𝓕:FieldSpecificationM:Type u_1f:CrAnSection [] Minst✝:AddCommMonoid M i, f (nilEquiv.symm i) = f [], 𝓕:FieldSpecificationM:Type u_1f:CrAnSection [] Minst✝:AddCommMonoid Mf (nilEquiv.symm PUnit.unit) = f [], All goals completed! 🐙𝓕:FieldSpecificationφs:List 𝓕.FieldOpφ:𝓕.FieldOpM:Type u_1f:CrAnSection (φ :: φs) Minst✝:AddCommMonoid M x, y, f (consEquiv.symm (x, y)) = a, s, f (cons a s) All goals completed! 🐙𝓕:FieldSpecificationφs:List 𝓕.FieldOpM:Type u_1s:CrAnSection φsf:Fin (↑s).length Minst✝:AddCommMonoid M n, f n = i, f (Fin.cast ((finCongr ) i)) All goals completed! 🐙

The equivalence between CrAnSection φs and CrAnSection φs' induced by an equality φs = φs'.

def congr : {φs φs' : List 𝓕.FieldOp} (h : φs = φs') CrAnSection φs CrAnSection φs' | _, _, rfl => Equiv.refl _
@[simp] lemma congr_fst {φs φs' : List 𝓕.FieldOp} (h : φs = φs') (ψs : CrAnSection φs) : (congr h ψs).1 = ψs.1 := 𝓕:FieldSpecificationφs:List 𝓕.FieldOpφs':List 𝓕.FieldOph:φs = φs'ψs:CrAnSection φs((congr h) ψs) = ψs 𝓕:FieldSpecificationφs:List 𝓕.FieldOpψs:CrAnSection φs((congr ) ψs) = ψs All goals completed! 🐙@[simp] lemma congr_symm {φs φs' : List 𝓕.FieldOp} (h : φs = φs') : (congr h).symm = congr h.symm := 𝓕:FieldSpecificationφs:List 𝓕.FieldOpφs':List 𝓕.FieldOph:φs = φs'(congr h).symm = congr 𝓕:FieldSpecificationφs:List 𝓕.FieldOp(congr ).symm = congr All goals completed! 🐙All goals completed! 🐙) ψs := 𝓕:FieldSpecificationφs:List 𝓕.FieldOpφs':List 𝓕.FieldOpφs'':List 𝓕.FieldOph1:φs = φs'h2:φs' = φs''ψs:CrAnSection φs(congr h2) ((congr h1) ψs) = (congr ) ψs 𝓕:FieldSpecificationφs:List 𝓕.FieldOpψs:CrAnSection φs(congr ) ((congr ) ψs) = (congr ) ψs All goals completed! 🐙

Returns the first n elements of a section and its underlying list.

def take (n : ) (ψs : CrAnSection φs) : CrAnSection (φs.take n) := ψs.1.take n, 𝓕✝:FieldSpecification𝓕:FieldSpecificationφs:List 𝓕.FieldOpn:ψs:CrAnSection φsList.map 𝓕.crAnFieldOpToFieldOp (List.take n ψs) = List.take n φs All goals completed! 🐙
All goals completed! 🐙) (take n ψs) := 𝓕:FieldSpecificationφs:List 𝓕.FieldOpφs':List 𝓕.FieldOph:φs = φs'n:ψs:CrAnSection φstake n ((congr h) ψs) = (congr ) (take n ψs) 𝓕:FieldSpecificationφs:List 𝓕.FieldOpn:ψs:CrAnSection φstake n ((congr ) ψs) = (congr ) (take n ψs) All goals completed! 🐙

Removes the first n elements of a section and its underlying list.

def drop (n : ) (ψs : CrAnSection φs) : CrAnSection (φs.drop n) := ψs.1.drop n, 𝓕✝:FieldSpecification𝓕:FieldSpecificationφs:List 𝓕.FieldOpn:ψs:CrAnSection φsList.map 𝓕.crAnFieldOpToFieldOp (List.drop n ψs) = List.drop n φs All goals completed! 🐙
All goals completed! 🐙) (drop n ψs) := 𝓕:FieldSpecificationφs:List 𝓕.FieldOpφs':List 𝓕.FieldOph:φs = φs'n:ψs:CrAnSection φsdrop n ((congr h) ψs) = (congr ) (drop n ψs) 𝓕:FieldSpecificationφs:List 𝓕.FieldOpn:ψs:CrAnSection φsdrop n ((congr ) ψs) = (congr ) (drop n ψs) All goals completed! 🐙

Appends two sections and their underlying lists.

def append {φs φs' : List 𝓕.FieldOp} (ψs : CrAnSection φs) (ψs' : CrAnSection φs') : CrAnSection (φs ++ φs') := ψs.1 ++ ψs'.1, 𝓕✝:FieldSpecification𝓕:FieldSpecificationφs✝:List 𝓕.FieldOpφs:List 𝓕.FieldOpφs':List 𝓕.FieldOpψs:CrAnSection φsψs':CrAnSection φs'List.map 𝓕.crAnFieldOpToFieldOp (ψs ++ ψs') = φs ++ φs' All goals completed! 🐙
lemma append_assoc {φs φs' φs'' : List 𝓕.FieldOp} (ψs : CrAnSection φs) (ψs' : CrAnSection φs') (ψs'' : CrAnSection φs'') : append ψs (append ψs' ψs'') = congr (𝓕✝:FieldSpecification𝓕:FieldSpecificationφs✝:List 𝓕.FieldOpφs:List 𝓕.FieldOpφs':List 𝓕.FieldOpφs'':List 𝓕.FieldOpψs:CrAnSection φsψs':CrAnSection φs'ψs'':CrAnSection φs''φs ++ φs' ++ φs'' = φs ++ (φs' ++ φs'') All goals completed! 🐙) (append (append ψs ψs') ψs'') := 𝓕:FieldSpecificationφs:List 𝓕.FieldOpφs':List 𝓕.FieldOpφs'':List 𝓕.FieldOpψs:CrAnSection φsψs':CrAnSection φs'ψs'':CrAnSection φs''ψs.append (ψs'.append ψs'') = (congr ) ((ψs.append ψs').append ψs'') 𝓕:FieldSpecificationφs:List 𝓕.FieldOpφs':List 𝓕.FieldOpφs'':List 𝓕.FieldOpψs:CrAnSection φsψs':CrAnSection φs'ψs'':CrAnSection φs''(ψs.append (ψs'.append ψs'')) = ((congr ) ((ψs.append ψs').append ψs'')) All goals completed! 🐙lemma append_assoc' {φs φs' φs'' : List 𝓕.FieldOp} (ψs : CrAnSection φs) (ψs' : CrAnSection φs') (ψs'' : CrAnSection φs'') : (append (append ψs ψs') ψs'') = congr (𝓕✝:FieldSpecification𝓕:FieldSpecificationφs✝:List 𝓕.FieldOpφs:List 𝓕.FieldOpφs':List 𝓕.FieldOpφs'':List 𝓕.FieldOpψs:CrAnSection φsψs':CrAnSection φs'ψs'':CrAnSection φs''φs ++ (φs' ++ φs'') = φs ++ φs' ++ φs'' All goals completed! 🐙) (append ψs (append ψs' ψs'')) := 𝓕:FieldSpecificationφs:List 𝓕.FieldOpφs':List 𝓕.FieldOpφs'':List 𝓕.FieldOpψs:CrAnSection φsψs':CrAnSection φs'ψs'':CrAnSection φs''(ψs.append ψs').append ψs'' = (congr ) (ψs.append (ψs'.append ψs'')) 𝓕:FieldSpecificationφs:List 𝓕.FieldOpφs':List 𝓕.FieldOpφs'':List 𝓕.FieldOpψs:CrAnSection φsψs':CrAnSection φs'ψs'':CrAnSection φs''((ψs.append ψs').append ψs'') = ((congr ) (ψs.append (ψs'.append ψs''))) All goals completed! 🐙lemma singletonEquiv_append_eq_cons {φs : List 𝓕.FieldOp} {φ : 𝓕.FieldOp} (ψs : CrAnSection φs) (ψ : 𝓕.fieldOpToCrAnType φ) : append (singletonEquiv.symm ψ) ψs = cons ψ ψs := 𝓕:FieldSpecificationφs:List 𝓕.FieldOpφ:𝓕.FieldOpψs:CrAnSection φsψ:𝓕.fieldOpToCrAnType φ(singletonEquiv.symm ψ).append ψs = cons ψ ψs 𝓕:FieldSpecificationφs:List 𝓕.FieldOpφ:𝓕.FieldOpψs:CrAnSection φsψ:𝓕.fieldOpToCrAnType φ((singletonEquiv.symm ψ).append ψs) = (cons ψ ψs) All goals completed! 🐙@[simp] lemma take_append_drop {n : } (ψs : CrAnSection φs) : append (take n ψs) (drop n ψs) = congr (List.take_append_drop n φs).symm ψs := 𝓕:FieldSpecificationφs:List 𝓕.FieldOpn:ψs:CrAnSection φs(take n ψs).append (drop n ψs) = (congr ) ψs 𝓕:FieldSpecificationφs:List 𝓕.FieldOpn:ψs:CrAnSection φs((take n ψs).append (drop n ψs)) = ((congr ) ψs) All goals completed! 🐙All goals completed! 🐙) (append ψs1 ψs2) := 𝓕:FieldSpecificationφs1:List 𝓕.FieldOpφs1':List 𝓕.FieldOpφs2:List 𝓕.FieldOpφs2':List 𝓕.FieldOph1:φs1 = φs1'h2:φs2 = φs2'ψs1:CrAnSection φs1ψs2:CrAnSection φs2((congr h1) ψs1).append ((congr h2) ψs2) = (congr ) (ψs1.append ψs2) 𝓕:FieldSpecificationφs1:List 𝓕.FieldOpφs2:List 𝓕.FieldOpψs1:CrAnSection φs1ψs2:CrAnSection φs2((congr ) ψs1).append ((congr ) ψs2) = (congr ) (ψs1.append ψs2) All goals completed! 🐙All goals completed! 🐙) (append ψs1 ψs2) := 𝓕:FieldSpecificationφs1:List 𝓕.FieldOpφs1':List 𝓕.FieldOpφs2:List 𝓕.FieldOph1:φs1 = φs1'ψs1:CrAnSection φs1ψs2:CrAnSection φs2((congr h1) ψs1).append ψs2 = (congr ) (ψs1.append ψs2) 𝓕:FieldSpecificationφs1:List 𝓕.FieldOpφs2:List 𝓕.FieldOpψs1:CrAnSection φs1ψs2:CrAnSection φs2((congr ) ψs1).append ψs2 = (congr ) (ψs1.append ψs2) All goals completed! 🐙All goals completed! 🐙) (append ψs1 ψs2) := 𝓕:FieldSpecificationφs1:List 𝓕.FieldOpφs2:List 𝓕.FieldOpφs2':List 𝓕.FieldOph2:φs2 = φs2'ψs1:CrAnSection φs1ψs2:CrAnSection φs2ψs1.append ((congr h2) ψs2) = (congr ) (ψs1.append ψs2) 𝓕:FieldSpecificationφs1:List 𝓕.FieldOpφs2:List 𝓕.FieldOpψs1:CrAnSection φs1ψs2:CrAnSection φs2ψs1.append ((congr ) ψs2) = (congr ) (ψs1.append ψs2) All goals completed! 🐙@[simp] lemma take_left {φs φs' : List 𝓕.FieldOp} (ψs : CrAnSection φs) (ψs' : CrAnSection φs') : take φs.length (ψs.append ψs') = congr (𝓕✝:FieldSpecification𝓕:FieldSpecificationφs✝:List 𝓕.FieldOpφs:List 𝓕.FieldOpφs':List 𝓕.FieldOpψs:CrAnSection φsψs':CrAnSection φs'φs = List.take φs.length (φs ++ φs') All goals completed! 🐙) ψs := 𝓕:FieldSpecificationφs:List 𝓕.FieldOpφs':List 𝓕.FieldOpψs:CrAnSection φsψs':CrAnSection φs'take φs.length (ψs.append ψs') = (congr ) ψs 𝓕:FieldSpecificationφs:List 𝓕.FieldOpφs':List 𝓕.FieldOpψs:CrAnSection φsψs':CrAnSection φs'(take φs.length (ψs.append ψs')) = ((congr ) ψs) All goals completed! 🐙@[simp] lemma drop_left {φs φs' : List 𝓕.FieldOp} (ψs : CrAnSection φs) (ψs' : CrAnSection φs') : drop φs.length (ψs.append ψs') = congr (𝓕✝:FieldSpecification𝓕:FieldSpecificationφs✝:List 𝓕.FieldOpφs:List 𝓕.FieldOpφs':List 𝓕.FieldOpψs:CrAnSection φsψs':CrAnSection φs'φs' = List.drop φs.length (φs ++ φs') All goals completed! 🐙) ψs' := 𝓕:FieldSpecificationφs:List 𝓕.FieldOpφs':List 𝓕.FieldOpψs:CrAnSection φsψs':CrAnSection φs'drop φs.length (ψs.append ψs') = (congr ) ψs' 𝓕:FieldSpecificationφs:List 𝓕.FieldOpφs':List 𝓕.FieldOpψs:CrAnSection φsψs':CrAnSection φs'(drop φs.length (ψs.append ψs')) = ((congr ) ψs') All goals completed! 🐙

The equivalence between CrAnSection (φs ++ φs') and CrAnSection φs × CrAnSection φs formed by append, take and drop and their interrelationship.

def appendEquiv {φs φs' : List 𝓕.FieldOp} : CrAnSection (φs ++ φs') CrAnSection φs × CrAnSection φs' where toFun ψs := (congr (List.take_left (l₁ := φs) (l₂ := φs')) (take φs.length ψs), congr (List.drop_left (l₁ := φs) (l₂ := φs')) (drop φs.length ψs)) invFun ψsψs' := append ψsψs'.1 ψsψs'.2 left_inv ψs := 𝓕✝:FieldSpecification𝓕:FieldSpecificationφs✝:List 𝓕.FieldOpφs:List 𝓕.FieldOpφs':List 𝓕.FieldOpψs:CrAnSection (φs ++ φs')(fun ψsψs' => ψsψs'.1.append ψsψs'.2) ((fun ψs => ((congr ) (take φs.length ψs), (congr ) (drop φs.length ψs))) ψs) = ψs 𝓕✝:FieldSpecification𝓕:FieldSpecificationφs✝:List 𝓕.FieldOpφs:List 𝓕.FieldOpφs':List 𝓕.FieldOpψs:CrAnSection (φs ++ φs')((fun ψsψs' => ψsψs'.1.append ψsψs'.2) ((fun ψs => ((congr ) (take φs.length ψs), (congr ) (drop φs.length ψs))) ψs)) = ψs All goals completed! 🐙 right_inv ψsψs' := 𝓕✝:FieldSpecification𝓕:FieldSpecificationφs✝:List 𝓕.FieldOpφs:List 𝓕.FieldOpφs':List 𝓕.FieldOpψsψs':CrAnSection φs × CrAnSection φs'(fun ψs => ((congr ) (take φs.length ψs), (congr ) (drop φs.length ψs))) ((fun ψsψs' => ψsψs'.1.append ψsψs'.2) ψsψs') = ψsψs' match ψsψs' with 𝓕✝:FieldSpecification𝓕:FieldSpecificationφs✝:List 𝓕.FieldOpφs:List 𝓕.FieldOpφs':List 𝓕.FieldOpψsψs':CrAnSection φs × CrAnSection φs'ψs:CrAnSection φsψs':CrAnSection φs'(fun ψs => ((congr ) (take φs.length ψs), (congr ) (drop φs.length ψs))) ((fun ψsψs' => ψsψs'.1.append ψsψs'.2) (ψs, ψs')) = (ψs, ψs') 𝓕✝:FieldSpecification𝓕:FieldSpecificationφs✝:List 𝓕.FieldOpφs:List 𝓕.FieldOpφs':List 𝓕.FieldOpψsψs':CrAnSection φs × CrAnSection φs'ψs:CrAnSection φsψs':CrAnSection φs'(congr ) ((congr ) ψs) = ψs (congr ) ((congr ) ψs') = ψs' 𝓕✝:FieldSpecification𝓕:FieldSpecificationφs✝:List 𝓕.FieldOpφs:List 𝓕.FieldOpφs':List 𝓕.FieldOpψsψs':CrAnSection φs × CrAnSection φs'ψs:CrAnSection φsψs':CrAnSection φs'((congr ) ((congr ) ψs)) = ψs𝓕✝:FieldSpecification𝓕:FieldSpecificationφs✝:List 𝓕.FieldOpφs:List 𝓕.FieldOpφs':List 𝓕.FieldOpψsψs':CrAnSection φs × CrAnSection φs'ψs:CrAnSection φsψs':CrAnSection φs'((congr ) ((congr ) ψs')) = ψs' 𝓕✝:FieldSpecification𝓕:FieldSpecificationφs✝:List 𝓕.FieldOpφs:List 𝓕.FieldOpφs':List 𝓕.FieldOpψsψs':CrAnSection φs × CrAnSection φs'ψs:CrAnSection φsψs':CrAnSection φs'((congr ) ((congr ) ψs)) = ψs𝓕✝:FieldSpecification𝓕:FieldSpecificationφs✝:List 𝓕.FieldOpφs:List 𝓕.FieldOpφs':List 𝓕.FieldOpψsψs':CrAnSection φs × CrAnSection φs'ψs:CrAnSection φsψs':CrAnSection φs'((congr ) ((congr ) ψs')) = ψs' All goals completed! 🐙
@[simp] lemma _root_.List.map_eraseIdx {α β : Type} (f : α β) : (l : List α) (n : ) List.map f (l.eraseIdx n) = (List.map f l).eraseIdx n | [], _ => rfl | a :: l, 0 => rfl α:Typeβ:Typef:α βa:αl:List αn:List.map f ((a :: l).eraseIdx (n + 1)) = (List.map f (a :: l)).eraseIdx (n + 1) α:Typeβ:Typef:α βa:αl:List αn:List.map f ((a :: l).eraseIdx (n + 1)) = (List.map f (a :: l)).eraseIdx (n + 1) α:Typeβ:Typef:α βa:αl:List αn:List.map f (l.eraseIdx n) = (List.map f l).eraseIdx n All goals completed! 🐙

Erasing an element from a section and it's underlying list.

def eraseIdx (n : ) (ψs : CrAnSection φs) : CrAnSection (φs.eraseIdx n) := ψs.1.eraseIdx n, 𝓕✝:FieldSpecification𝓕:FieldSpecificationφs:List 𝓕.FieldOpn:ψs:CrAnSection φsList.map 𝓕.crAnFieldOpToFieldOp ((↑ψs).eraseIdx n) = φs.eraseIdx n All goals completed! 🐙

The equivalence formed by extracting an element from a section.

def eraseIdxEquiv (n : ) (φs : List 𝓕.FieldOp) (hn : n < φs.length) : CrAnSection φs 𝓕.fieldOpToCrAnType φs[n] × CrAnSection (φs.eraseIdx n) := (congr (𝓕✝:FieldSpecification𝓕:FieldSpecificationφs✝:List 𝓕.FieldOpn:φs:List 𝓕.FieldOphn:n < φs.lengthφs = List.take n φs ++ [φs[n]] ++ List.drop (n + 1) φs All goals completed! 🐙)).trans <| appendEquiv.trans <| (Equiv.prodCongr (appendEquiv.trans (Equiv.prodComm _ _)) (Equiv.refl _)).trans <| (Equiv.prodAssoc _ _ _).trans <| Equiv.prodCongr singletonEquiv <| appendEquiv.symm.trans <| congr (List.eraseIdx_eq_take_drop_succ φs n).symm
𝓕:FieldSpecificationφs:List 𝓕.FieldOpn:ψs:CrAnSection φshn:n < φs.lengthList.take (min n n.succ) ψs ++ List.drop n.succ ψs = (↑ψs).eraseIdx n 𝓕:FieldSpecificationφs:List 𝓕.FieldOpn:ψs:CrAnSection φshn:n < φs.lengthList.take n ψs ++ List.drop (n + 1) ψs = (↑ψs).eraseIdx n All goals completed! 🐙All goals completed! 🐙𝓕:FieldSpecificationn:φs:List 𝓕.FieldOphn:n < φs.lengtha:𝓕.fieldOpToCrAnType φs[n]s:CrAnSection (φs.eraseIdx n)h0:min n (φs.eraseIdx n).length = n(φs[n], a :: List.drop n s)[n - min n (φs.eraseIdx n).length] = φs[n], a All goals completed! 🐙𝓕:FieldSpecificationn:φs:List 𝓕.FieldOphn:n < φs.lengtha:𝓕.fieldOpToCrAnType φs[n]s:CrAnSection (φs.eraseIdx n)((eraseIdxEquiv n φs hn) ((eraseIdxEquiv n φs hn).symm (a, s))).2 = s All goals completed! 🐙All goals completed! 🐙