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.Particles.SuperSymmetry.SU5.ChargeSpectrum.MinimallyAllowsTerm.OfFinset
public import Physlib.StringTheory.FTheory.SU5.Fluxes.NoExotics.CompletenessQuanta of 10d representations
i. Overview
The 10d representations of the SU(5)ΓU(1) carry
the quantum numbers of their U(1) charges and their fluxes.
In this module we define the data structure for these quanta and properties thereof.
ii. Key results
TenQuanta is the type of quanta of 10d representations.
TenQuanta.toFluxesTen is the underlying FluxesTen of a TenQuanta.
TenQuanta.toCharges is the underlying Multiset charges of a TenQuanta.
TenQuanta.reduce is the reduction of a TenQuanta which adds together
all the fluxes corresponding to the same charge (i.e. representation).
TenQuanta.liftCharges given a charge c the TenQuanta which have
charge c and no exotics or zero fluxes.
TenQuanta.anomalyCoefficient is the anomaly coefficient associated with a TenQuanta.
iii. Table of contents
A. The definition of TenQuanta
A.1. The map to underlying fluxes
A.2. The map to underlying charges
A.3. The map from charges to fluxes
B. The reduction of a TenQuanta
B.1. The reduced TenQuanta has no duplicate elements
B.2. The underlying charges of the reduced TenQuanta are the deduped charges
B.3. Membership condition on the reduced TenQuanta
B.4. Filter of the reduced TenQuanta by a charge
B.5. The reduction is idempotent
B.6. Preservation of certain sums under reduction
B.7. Reduction does nothing if no duplicate charges
B.8. The charge map is preserved by reduction
B.9. A fluxes in the reduced TenQuanta is a sum of fluxes in the original TenQuanta
B.10. No exotics condition on the reduced TenQuanta
B.10.1. Number of chiral U
B.10.2. Number of anti-chiral U
B.10.3. Number of chiral Q
B.10.4. Number of anti-chiral Q
B.10.5. Number of chiral E
B.10.6. Number of anti-chiral E
B.10.7. The NoExotics condition on the reduced TenQuanta
B.11. Reduce member of FLuxesTen.elemsNoExotics
C. Decomposition of a TenQuanta into basic fluxes
C.1. Decomposition of fluxes
C.2. Decomposition of a TenQuanta (with no exotics)
C.2.1. Decomposition distributes over addition
C.2.2. Decomposition commutes with filtering charges
C.2.3. Decomposition preserves the charge map
C.2.4. Decomposition preserves the charges
C.2.5. Decomposition preserves the reduction
C.2.6. Fluxes of the decomposition of a TenQuanta
D. Lifting charges to TenQuanta
D.1. liftCharge c: multiset of ten-quanta for a finite set of charges c with no exotics
D.2. TenQuanta in liftCharge c have a finite set of charges c
D.3. TenQuanta in liftCharge c have no duplicate charges
D.4. Membership in liftCharge c iff is reduction of TenQuanta with given fluxes
D.5. TenQuanta in liftCharge c do not have zero fluxes
D.6. TenQuanta in liftCharge c have no exotics
D.7. Membership in liftCharge c iff have no exotics, no zero fluxes, and charges c
D.8. liftCharge c is preserved under a map if reduced
E. Anomaly cancellation coefficients
E.1. Anomaly coefficients of a TenQuanta
E.2. Anomaly coefficients under a map
E.3. Anomaly coefficients is preserved under reduce
iv. References
A reference for the anomaly cancellation conditions is arXiv:1401.5084.
@[expose] public section
A. The definition of TenQuanta
The quanta of w0d representations corresponding to a multiset of
(q, M, N) for each particle. (M, N) are defined in the FluxesFive module.
abbrev TenQuanta (π© : Type := β€) : Type := Multiset (π© Γ Fluxes)A.1. The map to underlying fluxes
The underlying FluxesTen from a TenQuanta.
A.2. The map to underlying charges
The underlying Multiset charges from a TenQuanta.
def toCharges (x : TenQuanta π©) : Multiset π© := x.map Prod.fstA.3. The map from charges to fluxes
The map which takes a charge to the overall flux it
corresponds to in a TenQuanta.
def toChargeMap [DecidableEq π©] (x : TenQuanta π©) : π© β Fluxes :=
fun z => ((x.filter fun p => p.1 = z).map Prod.snd).sumlemma toChargeMap_of_not_mem [DecidableEq π©] (x : TenQuanta π©) {z : π©} (h : z β x.toCharges) :
x.toChargeMap z = 0 := π©:Typeinstβ:DecidableEq π©x:TenQuanta π©z:π©h:z β x.toChargesβ’ x.toChargeMap z = 0
π©:Typeinstβ:DecidableEq π©x:TenQuanta π©z:π©h:z β x.toChargeshl:Multiset.filter (fun p => p.1 = z) x = 0β’ x.toChargeMap z = 0
All goals completed! π
B. The reduction of a TenQuanta
The reduce of TenQuanta is a new TenQuanta with all the fluxes
corresponding to the same charge (i.e. representation) added together.
def reduce (x : TenQuanta π©) : TenQuanta π© :=
x.toCharges.dedup.map fun q10 => (q10, ((x.filter (fun f => f.1 = q10)).map (fun y => y.2)).sum)
B.1. The reduced TenQuanta has no duplicate elements
π©:Typeinstβ:DecidableEq π©x:TenQuanta π©β’ (Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum))
x.toCharges.dedup).Nodup
exact Multiset.Nodup.map (fun _ _ h => congrArg Prod.fst h) (Multiset.nodup_dedup _) All goals completed! π@[simp]
lemma reduce_dedup (x : TenQuanta π©) : x.reduce.dedup = x.reduce :=
Multiset.Nodup.dedup x.reduce_nodup
B.2. The underlying charges of the reduced TenQuanta are the deduped charges
lemma reduce_toCharges (x : TenQuanta π©) : x.reduce.toCharges = x.toCharges.dedup := by π©:Typeinstβ:DecidableEq π©x:TenQuanta π©β’ x.reduce.toCharges = x.toCharges.dedup
simp [reduce, toCharges] All goals completed! π
B.3. Membership condition on the reduced TenQuanta
lemma mem_reduce_iff (x : TenQuanta π©) (p : π© Γ Fluxes) :
p β x.reduce β p.1 β x.toCharges β§
p.2 = ((x.filter (fun f => f.1 = p.1)).map (fun y => y.2)).sum := by π©:Typeinstβ:DecidableEq π©x:TenQuanta π©p:π© Γ Fluxesβ’ p β x.reduce β p.1 β x.toCharges β§ p.2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x)).sum
simp [reduce] π©:Typeinstβ:DecidableEq π©x:TenQuanta π©p:π© Γ Fluxesβ’ (β a β x.toCharges, (a, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = a) x)).sum) = p) β
p.1 β x.toCharges β§ p.2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x)).sum
constructor mp π©:Typeinstβ:DecidableEq π©x:TenQuanta π©p:π© Γ Fluxesβ’ (β a β x.toCharges, (a, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = a) x)).sum) = p) β
p.1 β x.toCharges β§ p.2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x)).summpr π©:Typeinstβ:DecidableEq π©x:TenQuanta π©p:π© Γ Fluxesβ’ p.1 β x.toCharges β§ p.2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x)).sum β
β a β x.toCharges, (a, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = a) x)).sum) = p
Β· mp π©:Typeinstβ:DecidableEq π©x:TenQuanta π©p:π© Γ Fluxesβ’ (β a β x.toCharges, (a, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = a) x)).sum) = p) β
p.1 β x.toCharges β§ p.2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x)).sum rintro β¨q, hq, rflβ© mp π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©hq:q β x.toChargesβ’ (q, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum).1 β x.toCharges β§
(q, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum).2 =
(Multiset.map (fun y => y.2)
(Multiset.filter
(fun f => f.1 = (q, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum).1) x)).sum
exact β¨hq, rflβ© All goals completed! π
Β· mpr π©:Typeinstβ:DecidableEq π©x:TenQuanta π©p:π© Γ Fluxesβ’ p.1 β x.toCharges β§ p.2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x)).sum β
β a β x.toCharges, (a, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = a) x)).sum) = p rintro β¨h1, h2β© mpr π©:Typeinstβ:DecidableEq π©x:TenQuanta π©p:π© Γ Fluxesh1:p.1 β x.toChargesh2:p.2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x)).sumβ’ β a β x.toCharges, (a, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = a) x)).sum) = p
exact β¨p.1, h1, by π©:Typeinstβ:DecidableEq π©x:TenQuanta π©p:π© Γ Fluxesh1:p.1 β x.toChargesh2:p.2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x)).sumβ’ (p.1, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x)).sum) = p rw [β h2 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©p:π© Γ Fluxesh1:p.1 β x.toChargesh2:p.2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x)).sumβ’ (p.1, p.2) = p All goals completed! π] All goals completed! πβ©
B.4. Filter of the reduced TenQuanta by a charge
lemma reduce_filter (x : TenQuanta π©) (q : π©) (h : q β x.toCharges) :
x.reduce.filter (fun f => f.1 = q) =
{(q, ((x.filter (fun f => f.1 = q)).map (fun y => y.2)).sum)} := by π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ Multiset.filter (fun f => f.1 = q) x.reduce =
{(q, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum)}
simp [reduce] π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ Multiset.filter (fun f => f.1 = q)
(Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum))
x.toCharges.dedup) =
{(q, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum)}
rw [Multiset.filter_map π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum))
(Multiset.filter
((fun f => f.1 = q) β fun q10 =>
(q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum))
x.toCharges.dedup) =
{(q, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum)} π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum))
(Multiset.filter
((fun f => f.1 = q) β fun q10 =>
(q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum))
x.toCharges.dedup) =
{(q, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum)}] π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum))
(Multiset.filter
((fun f => f.1 = q) β fun q10 =>
(q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum))
x.toCharges.dedup) =
{(q, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum)}
simp only [Function.comp_apply] π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum))
(Multiset.filter (fun x => x = q) x.toCharges.dedup) =
{(q, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum)}
have hx : (Multiset.filter (fun x => x = q) x.toCharges.dedup) = {q} := by π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ Multiset.filter (fun f => f.1 = q) x.reduce =
{(q, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum)} π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargeshx:Multiset.filter (fun x => x = q) x.toCharges.dedup = {q}β’ Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum))
(Multiset.filter (fun x => x = q) x.toCharges.dedup) =
{(q, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum)}
rw [Multiset.filter_eq', π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ Multiset.replicate (Multiset.count q x.toCharges.dedup) q = {q} π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargeshx:Multiset.filter (fun x => x = q) x.toCharges.dedup = {q}β’ Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum))
(Multiset.filter (fun x => x = q) x.toCharges.dedup) =
{(q, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum)} Multiset.count_dedup, π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ Multiset.replicate (if q β x.toCharges then 1 else 0) q = {q} π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargeshx:Multiset.filter (fun x => x = q) x.toCharges.dedup = {q}β’ Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum))
(Multiset.filter (fun x => x = q) x.toCharges.dedup) =
{(q, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum)} if_pos h, π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ Multiset.replicate 1 q = {q} π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargeshx:Multiset.filter (fun x => x = q) x.toCharges.dedup = {q}β’ Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum))
(Multiset.filter (fun x => x = q) x.toCharges.dedup) =
{(q, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum)} Multiset.replicate_one π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ {q} = {q} π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargeshx:Multiset.filter (fun x => x = q) x.toCharges.dedup = {q}β’ Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum))
(Multiset.filter (fun x => x = q) x.toCharges.dedup) =
{(q, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum)}] π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargeshx:Multiset.filter (fun x => x = q) x.toCharges.dedup = {q}β’ Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum))
(Multiset.filter (fun x => x = q) x.toCharges.dedup) =
{(q, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum)} π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargeshx:Multiset.filter (fun x => x = q) x.toCharges.dedup = {q}β’ Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum))
(Multiset.filter (fun x => x = q) x.toCharges.dedup) =
{(q, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum)}
rw [hx π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargeshx:Multiset.filter (fun x => x = q) x.toCharges.dedup = {q}β’ Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum)) {q} =
{(q, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum)} π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargeshx:Multiset.filter (fun x => x = q) x.toCharges.dedup = {q}β’ Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum)) {q} =
{(q, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum)}] π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargeshx:Multiset.filter (fun x => x = q) x.toCharges.dedup = {q}β’ Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum)) {q} =
{(q, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum)}
simp All goals completed! πB.5. The reduction is idempotent
@[simp]
lemma reduce_reduce (x : TenQuanta π©) :
x.reduce.reduce = x.reduce := by π©:Typeinstβ:DecidableEq π©x:TenQuanta π©β’ x.reduce.reduce = x.reduce
refine Multiset.Nodup.toFinset_inj (reduce_nodup x.reduce) (reduce_nodup x) ?_ π©:Typeinstβ:DecidableEq π©x:TenQuanta π©β’ Multiset.toFinset x.reduce.reduce = Multiset.toFinset x.reduce
ext p π©:Typeinstβ:DecidableEq π©x:TenQuanta π©p:π© Γ Fluxesβ’ p β Multiset.toFinset x.reduce.reduce β p β Multiset.toFinset x.reduce
simp only [Multiset.mem_toFinset] π©:Typeinstβ:DecidableEq π©x:TenQuanta π©p:π© Γ Fluxesβ’ p β x.reduce.reduce β p β x.reduce
rw [mem_reduce_iff, π©:Typeinstβ:DecidableEq π©x:TenQuanta π©p:π© Γ Fluxesβ’ p.1 β x.reduce.toCharges β§ p.2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x.reduce)).sum β
p β x.reduce π©:Typeinstβ:DecidableEq π©x:TenQuanta π©p:π© Γ Fluxesβ’ p.1 β x.toCharges.dedup β§ p.2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x.reduce)).sum β
p.1 β x.toCharges β§ p.2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x)).sum reduce_toCharges, π©:Typeinstβ:DecidableEq π©x:TenQuanta π©p:π© Γ Fluxesβ’ p.1 β x.toCharges.dedup β§ p.2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x.reduce)).sum β
p β x.reduce π©:Typeinstβ:DecidableEq π©x:TenQuanta π©p:π© Γ Fluxesβ’ p.1 β x.toCharges.dedup β§ p.2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x.reduce)).sum β
p.1 β x.toCharges β§ p.2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x)).sum mem_reduce_iff π©:Typeinstβ:DecidableEq π©x:TenQuanta π©p:π© Γ Fluxesβ’ p.1 β x.toCharges.dedup β§ p.2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x.reduce)).sum β
p.1 β x.toCharges β§ p.2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x)).sum π©:Typeinstβ:DecidableEq π©x:TenQuanta π©p:π© Γ Fluxesβ’ p.1 β x.toCharges.dedup β§ p.2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x.reduce)).sum β
p.1 β x.toCharges β§ p.2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x)).sum] π©:Typeinstβ:DecidableEq π©x:TenQuanta π©p:π© Γ Fluxesβ’ p.1 β x.toCharges.dedup β§ p.2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x.reduce)).sum β
p.1 β x.toCharges β§ p.2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x)).sum
simp only [Multiset.mem_dedup, and_congr_right_iff] π©:Typeinstβ:DecidableEq π©x:TenQuanta π©p:π© Γ Fluxesβ’ p.1 β x.toCharges β
(p.2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x.reduce)).sum β
p.2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x)).sum)
intro hp π©:Typeinstβ:DecidableEq π©x:TenQuanta π©p:π© Γ Fluxeshp:p.1 β x.toChargesβ’ p.2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x.reduce)).sum β
p.2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x)).sum
rw [reduce_filter x p.1 hp, π©:Typeinstβ:DecidableEq π©x:TenQuanta π©p:π© Γ Fluxeshp:p.1 β x.toChargesβ’ p.2 =
(Multiset.map (fun y => y.2)
{(p.1, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x)).sum)}).sum β
p.2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x)).sum All goals completed! π Multiset.map_singleton, π©:Typeinstβ:DecidableEq π©x:TenQuanta π©p:π© Γ Fluxeshp:p.1 β x.toChargesβ’ p.2 = {(p.1, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x)).sum).2}.sum β
p.2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x)).sum All goals completed! π Multiset.sum_singleton π©:Typeinstβ:DecidableEq π©x:TenQuanta π©p:π© Γ Fluxeshp:p.1 β x.toChargesβ’ p.2 = (p.1, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x)).sum).2 β
p.2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x)).sum All goals completed! π] All goals completed! πB.6. Preservation of certain sums under reduction
lemma reduce_sum_eq_sum_toCharges {M} [AddCommMonoid M] (x : TenQuanta π©) (f : π© β Fluxes β+ M) :
(x.reduce.map fun (q, x) => f q x).sum = (x.map fun (q, x) => f q x).sum := by π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mβ’ (Multiset.map
(fun x =>
match x with
| (q, x) => (f q) x)
x.reduce).sum =
(Multiset.map
(fun x =>
match x with
| (q, x) => (f q) x)
x).sum
calc _
_ = β q β x.toCharges.toFinset,
f q ((x.filter (fun f => f.1 = q)).map (fun y => y.2)).sum := by π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mβ’ (Multiset.map
(fun x =>
match x with
| (q, x) => (f q) x)
x.reduce).sum =
β q β x.toCharges.toFinset, (f q) (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum
rw [reduce π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mβ’ (Multiset.map
(fun x =>
match x with
| (q, x) => (f q) x)
(Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum))
x.toCharges.dedup)).sum =
β q β x.toCharges.toFinset, (f q) (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mβ’ (Multiset.map
(fun x =>
match x with
| (q, x) => (f q) x)
(Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum))
x.toCharges.dedup)).sum =
β q β x.toCharges.toFinset, (f q) (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum] π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mβ’ (Multiset.map
(fun x =>
match x with
| (q, x) => (f q) x)
(Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum))
x.toCharges.dedup)).sum =
β q β x.toCharges.toFinset, (f q) (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum
simp [Finset.sum] All goals completed! π
_ = β q β x.toCharges.toFinset,
(((x.filter (fun f => f.1 = q)).map (fun y => f q y.2))).sum := by π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mβ’ β q β x.toCharges.toFinset, (f q) (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum =
β q β x.toCharges.toFinset, (Multiset.map (fun y => (f q) y.2) (Multiset.filter (fun f => f.1 = q) x)).sum
congr e_f π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mβ’ (fun q => (f q) (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum) = fun q =>
(Multiset.map (fun y => (f q) y.2) (Multiset.filter (fun f => f.1 = q) x)).sum
funext q5 e_f π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mq5:π©β’ (f q5) (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q5) x)).sum =
(Multiset.map (fun y => (f q5) y.2) (Multiset.filter (fun f => f.1 = q5) x)).sum
rw [AddMonoidHom.map_multiset_sum, e_f π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mq5:π©β’ (Multiset.map (β(f q5)) (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q5) x))).sum =
(Multiset.map (fun y => (f q5) y.2) (Multiset.filter (fun f => f.1 = q5) x)).sum e_f π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mq5:π©β’ (Multiset.map (β(f q5) β fun y => y.2) (Multiset.filter (fun f => f.1 = q5) x)).sum =
(Multiset.map (fun y => (f q5) y.2) (Multiset.filter (fun f => f.1 = q5) x)).sum Multiset.map_map e_f π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mq5:π©β’ (Multiset.map (β(f q5) β fun y => y.2) (Multiset.filter (fun f => f.1 = q5) x)).sum =
(Multiset.map (fun y => (f q5) y.2) (Multiset.filter (fun f => f.1 = q5) x)).sume_f π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mq5:π©β’ (Multiset.map (β(f q5) β fun y => y.2) (Multiset.filter (fun f => f.1 = q5) x)).sum =
(Multiset.map (fun y => (f q5) y.2) (Multiset.filter (fun f => f.1 = q5) x)).sum]e_f π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mq5:π©β’ (Multiset.map (β(f q5) β fun y => y.2) (Multiset.filter (fun f => f.1 = q5) x)).sum =
(Multiset.map (fun y => (f q5) y.2) (Multiset.filter (fun f => f.1 = q5) x)).sum
rfl All goals completed! π
_ = (x.toCharges.dedup.bind fun q =>
((x.filter (fun f => f.1 = q)).map (fun y => f q y.2))).sum := by π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mβ’ β q β x.toCharges.toFinset, (Multiset.map (fun y => (f q) y.2) (Multiset.filter (fun f => f.1 = q) x)).sum =
(x.toCharges.dedup.bind fun q => Multiset.map (fun y => (f q) y.2) (Multiset.filter (fun f => f.1 = q) x)).sum
rw [Multiset.sum_bind π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mβ’ β q β x.toCharges.toFinset, (Multiset.map (fun y => (f q) y.2) (Multiset.filter (fun f => f.1 = q) x)).sum =
(Multiset.map (fun a => (Multiset.map (fun y => (f a) y.2) (Multiset.filter (fun f => f.1 = a) x)).sum)
x.toCharges.dedup).sum π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mβ’ β q β x.toCharges.toFinset, (Multiset.map (fun y => (f q) y.2) (Multiset.filter (fun f => f.1 = q) x)).sum =
(Multiset.map (fun a => (Multiset.map (fun y => (f a) y.2) (Multiset.filter (fun f => f.1 = a) x)).sum)
x.toCharges.dedup).sum] π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mβ’ β q β x.toCharges.toFinset, (Multiset.map (fun y => (f q) y.2) (Multiset.filter (fun f => f.1 = q) x)).sum =
(Multiset.map (fun a => (Multiset.map (fun y => (f a) y.2) (Multiset.filter (fun f => f.1 = a) x)).sum)
x.toCharges.dedup).sum
simp [Finset.sum] All goals completed! π
_ = (((x.toCharges.dedup.bind fun q =>
((x.filter (fun f => f.1 = q)))).map (fun y => f y.1 y.2))).sum := by π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mβ’ (x.toCharges.dedup.bind fun q => Multiset.map (fun y => (f q) y.2) (Multiset.filter (fun f => f.1 = q) x)).sum =
(Multiset.map (fun y => (f y.1) y.2) (x.toCharges.dedup.bind fun q => Multiset.filter (fun f => f.1 = q) x)).sum
congr π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mβ’ (x.toCharges.dedup.bind fun q => Multiset.map (fun y => (f q) y.2) (Multiset.filter (fun f => f.1 = q) x)) =
Multiset.map (fun y => (f y.1) y.2) (x.toCharges.dedup.bind fun q => Multiset.filter (fun f => f.1 = q) x)
rw [Multiset.map_bind π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mβ’ (x.toCharges.dedup.bind fun q => Multiset.map (fun y => (f q) y.2) (Multiset.filter (fun f => f.1 = q) x)) =
x.toCharges.dedup.bind fun a => Multiset.map (fun y => (f y.1) y.2) (Multiset.filter (fun f => f.1 = a) x) π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mβ’ (x.toCharges.dedup.bind fun q => Multiset.map (fun y => (f q) y.2) (Multiset.filter (fun f => f.1 = q) x)) =
x.toCharges.dedup.bind fun a => Multiset.map (fun y => (f y.1) y.2) (Multiset.filter (fun f => f.1 = a) x)] π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mβ’ (x.toCharges.dedup.bind fun q => Multiset.map (fun y => (f q) y.2) (Multiset.filter (fun f => f.1 = q) x)) =
x.toCharges.dedup.bind fun a => Multiset.map (fun y => (f y.1) y.2) (Multiset.filter (fun f => f.1 = a) x)
congr e_f π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mβ’ (fun q => Multiset.map (fun y => (f q) y.2) (Multiset.filter (fun f => f.1 = q) x)) = fun a =>
Multiset.map (fun y => (f y.1) y.2) (Multiset.filter (fun f => f.1 = a) x)
funext q e_f π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mq:π©β’ Multiset.map (fun y => (f q) y.2) (Multiset.filter (fun f => f.1 = q) x) =
Multiset.map (fun y => (f y.1) y.2) (Multiset.filter (fun f => f.1 = q) x)
refine Multiset.map_congr rfl ?_ e_f π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mq:π©β’ β x_1 β Multiset.filter (fun f => f.1 = q) x, (f q) x_1.2 = (f x_1.1) x_1.2
intro y hy e_f π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mq:π©y:π© Γ Fluxeshy:y β Multiset.filter (fun f => f.1 = q) xβ’ (f q) y.2 = (f y.1) y.2
simp at hy e_f π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mq:π©y:π© Γ Fluxeshy:y β x β§ y.1 = qβ’ (f q) y.2 = (f y.1) y.2
rw [hy.2 e_f π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mq:π©y:π© Γ Fluxeshy:y β x β§ y.1 = qβ’ (f q) y.2 = (f q) y.2 All goals completed! π] All goals completed! π
_ = ((x.map (fun y => f y.1 y.2))).sum := by π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mβ’ (Multiset.map (fun y => (f y.1) y.2) (x.toCharges.dedup.bind fun q => Multiset.filter (fun f => f.1 = q) x)).sum =
(Multiset.map (fun y => (f y.1) y.2) x).sum
congr e_s π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mβ’ (x.toCharges.dedup.bind fun q => Multiset.filter (fun f => f.1 = q) x) = x
apply Multiset.ext.mpr e_s π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mβ’ β (a : π© Γ Fluxes),
Multiset.count a (x.toCharges.dedup.bind fun q => Multiset.filter (fun f => f.1 = q) x) = Multiset.count a x
intro p e_s π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesβ’ Multiset.count p (x.toCharges.dedup.bind fun q => Multiset.filter (fun f => f.1 = q) x) = Multiset.count p x
trans ((x.map Prod.fst).dedup.map (fun y => if p.1 = y then x.count p else 0)).sum π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesβ’ Multiset.count p (x.toCharges.dedup.bind fun q => Multiset.filter (fun f => f.1 = q) x) =
(Multiset.map (fun y => if p.1 = y then Multiset.count p x else 0) (Multiset.map Prod.fst x).dedup).sumπ©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesβ’ (Multiset.map (fun y => if p.1 = y then Multiset.count p x else 0) (Multiset.map Prod.fst x).dedup).sum =
Multiset.count p x
Β· π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesβ’ Multiset.count p (x.toCharges.dedup.bind fun q => Multiset.filter (fun f => f.1 = q) x) =
(Multiset.map (fun y => if p.1 = y then Multiset.count p x else 0) (Multiset.map Prod.fst x).dedup).sum rw [@Multiset.count_bind π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesβ’ (Multiset.map (fun b => Multiset.count p (Multiset.filter (fun f => f.1 = b) x)) x.toCharges.dedup).sum =
(Multiset.map (fun y => if p.1 = y then Multiset.count p x else 0) (Multiset.map Prod.fst x).dedup).sum π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesβ’ (Multiset.map (fun b => Multiset.count p (Multiset.filter (fun f => f.1 = b) x)) x.toCharges.dedup).sum =
(Multiset.map (fun y => if p.1 = y then Multiset.count p x else 0) (Multiset.map Prod.fst x).dedup).sum] π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesβ’ (Multiset.map (fun b => Multiset.count p (Multiset.filter (fun f => f.1 = b) x)) x.toCharges.dedup).sum =
(Multiset.map (fun y => if p.1 = y then Multiset.count p x else 0) (Multiset.map Prod.fst x).dedup).sum
congr e_f π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesβ’ (fun b => Multiset.count p (Multiset.filter (fun f => f.1 = b) x)) = fun y => if p.1 = y then Multiset.count p x else 0
funext q5 e_f π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesq5:π©β’ Multiset.count p (Multiset.filter (fun f => f.1 = q5) x) = if p.1 = q5 then Multiset.count p x else 0
rw [Multiset.count_filter e_f π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesq5:π©β’ (if p.1 = q5 then Multiset.count p x else 0) = if p.1 = q5 then Multiset.count p x else 0 All goals completed! π] All goals completed! π
by_cases h_mem : p.1 β x.map Prod.fst pos π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xβ’ (Multiset.map (fun y => if p.1 = y then Multiset.count p x else 0) (Multiset.map Prod.fst x).dedup).sum =
Multiset.count p xneg π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xβ’ (Multiset.map (fun y => if p.1 = y then Multiset.count p x else 0) (Multiset.map Prod.fst x).dedup).sum =
Multiset.count p x
Β· pos π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xβ’ (Multiset.map (fun y => if p.1 = y then Multiset.count p x else 0) (Multiset.map Prod.fst x).dedup).sum =
Multiset.count p x have h_mem_dedup : p.1 β (x.map Prod.fst).dedup := by π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mβ’ (Multiset.map (fun y => (f y.1) y.2) (x.toCharges.dedup.bind fun q => Multiset.filter (fun f => f.1 = q) x)).sum =
(Multiset.map (fun y => (f y.1) y.2) x).sum pos π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xh_mem_dedup:p.1 β (Multiset.map Prod.fst x).dedupβ’ (Multiset.map (fun y => if p.1 = y then Multiset.count p x else 0) (Multiset.map Prod.fst x).dedup).sum =
Multiset.count p x rwa [Multiset.mem_dedup π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xβ’ p.1 β Multiset.map Prod.fst xpos π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xh_mem_dedup:p.1 β (Multiset.map Prod.fst x).dedupβ’ (Multiset.map (fun y => if p.1 = y then Multiset.count p x else 0) (Multiset.map Prod.fst x).dedup).sum =
Multiset.count p x] π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xβ’ p.1 β Multiset.map Prod.fst xpos π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xh_mem_dedup:p.1 β (Multiset.map Prod.fst x).dedupβ’ (Multiset.map (fun y => if p.1 = y then Multiset.count p x else 0) (Multiset.map Prod.fst x).dedup).sum =
Multiset.count p xpos π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xh_mem_dedup:p.1 β (Multiset.map Prod.fst x).dedupβ’ (Multiset.map (fun y => if p.1 = y then Multiset.count p x else 0) (Multiset.map Prod.fst x).dedup).sum =
Multiset.count p x
rw [Multiset.sum_map_eq_nsmul_single p.1 pos π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xh_mem_dedup:p.1 β (Multiset.map Prod.fst x).dedupβ’ (Multiset.count p.1 (Multiset.map Prod.fst x).dedup β’ if p.1 = p.1 then Multiset.count p x else 0) = Multiset.count p xpos π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xh_mem_dedup:p.1 β (Multiset.map Prod.fst x).dedupβ’ β (i' : π©), i' β p.1 β i' β (Multiset.map Prod.fst x).dedup β (if p.1 = i' then Multiset.count p x else 0) = 0 pos π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xh_mem_dedup:p.1 β (Multiset.map Prod.fst x).dedupβ’ (Multiset.count p.1 (Multiset.map Prod.fst x).dedup β’ if p.1 = p.1 then Multiset.count p x else 0) = Multiset.count p xpos π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xh_mem_dedup:p.1 β (Multiset.map Prod.fst x).dedupβ’ β (i' : π©), i' β p.1 β i' β (Multiset.map Prod.fst x).dedup β (if p.1 = i' then Multiset.count p x else 0) = 0]pos π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xh_mem_dedup:p.1 β (Multiset.map Prod.fst x).dedupβ’ (Multiset.count p.1 (Multiset.map Prod.fst x).dedup β’ if p.1 = p.1 then Multiset.count p x else 0) = Multiset.count p xpos π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xh_mem_dedup:p.1 β (Multiset.map Prod.fst x).dedupβ’ β (i' : π©), i' β p.1 β i' β (Multiset.map Prod.fst x).dedup β (if p.1 = i' then Multiset.count p x else 0) = 0
simp only [βreduceIte, smul_eq_mul] pos π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xh_mem_dedup:p.1 β (Multiset.map Prod.fst x).dedupβ’ Multiset.count p.1 (Multiset.map Prod.fst x).dedup * Multiset.count p x = Multiset.count p xpos π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xh_mem_dedup:p.1 β (Multiset.map Prod.fst x).dedupβ’ β (i' : π©), i' β p.1 β i' β (Multiset.map Prod.fst x).dedup β (if p.1 = i' then Multiset.count p x else 0) = 0
have h_count_one : Multiset.count p.1 (Multiset.map Prod.fst x).dedup = 1 := by π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mβ’ (Multiset.map (fun y => (f y.1) y.2) (x.toCharges.dedup.bind fun q => Multiset.filter (fun f => f.1 = q) x)).sum =
(Multiset.map (fun y => (f y.1) y.2) x).sum pos π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xh_mem_dedup:p.1 β (Multiset.map Prod.fst x).deduph_count_one:Multiset.count p.1 (Multiset.map Prod.fst x).dedup = 1β’ Multiset.count p.1 (Multiset.map Prod.fst x).dedup * Multiset.count p x = Multiset.count p xpos π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xh_mem_dedup:p.1 β (Multiset.map Prod.fst x).dedupβ’ β (i' : π©), i' β p.1 β i' β (Multiset.map Prod.fst x).dedup β (if p.1 = i' then Multiset.count p x else 0) = 0
refine Multiset.count_eq_one_of_mem ?_ h_mem_dedup π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xh_mem_dedup:p.1 β (Multiset.map Prod.fst x).dedupβ’ (Multiset.map Prod.fst x).dedup.Noduppos π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xh_mem_dedup:p.1 β (Multiset.map Prod.fst x).deduph_count_one:Multiset.count p.1 (Multiset.map Prod.fst x).dedup = 1β’ Multiset.count p.1 (Multiset.map Prod.fst x).dedup * Multiset.count p x = Multiset.count p xpos π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xh_mem_dedup:p.1 β (Multiset.map Prod.fst x).dedupβ’ β (i' : π©), i' β p.1 β i' β (Multiset.map Prod.fst x).dedup β (if p.1 = i' then Multiset.count p x else 0) = 0
exact Multiset.nodup_dedup (Multiset.map Prod.fst x)pos π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xh_mem_dedup:p.1 β (Multiset.map Prod.fst x).deduph_count_one:Multiset.count p.1 (Multiset.map Prod.fst x).dedup = 1β’ Multiset.count p.1 (Multiset.map Prod.fst x).dedup * Multiset.count p x = Multiset.count p xpos π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xh_mem_dedup:p.1 β (Multiset.map Prod.fst x).dedupβ’ β (i' : π©), i' β p.1 β i' β (Multiset.map Prod.fst x).dedup β (if p.1 = i' then Multiset.count p x else 0) = 0pos π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xh_mem_dedup:p.1 β (Multiset.map Prod.fst x).deduph_count_one:Multiset.count p.1 (Multiset.map Prod.fst x).dedup = 1β’ Multiset.count p.1 (Multiset.map Prod.fst x).dedup * Multiset.count p x = Multiset.count p xpos π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xh_mem_dedup:p.1 β (Multiset.map Prod.fst x).dedupβ’ β (i' : π©), i' β p.1 β i' β (Multiset.map Prod.fst x).dedup β (if p.1 = i' then Multiset.count p x else 0) = 0
simp [h_count_one] pos π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xh_mem_dedup:p.1 β (Multiset.map Prod.fst x).dedupβ’ β (i' : π©), i' β p.1 β i' β (Multiset.map Prod.fst x).dedup β (if p.1 = i' then Multiset.count p x else 0) = 0
intro q5' h h2 pos π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xh_mem_dedup:p.1 β (Multiset.map Prod.fst x).dedupq5':π©h:q5' β p.1h2:q5' β (Multiset.map Prod.fst x).dedupβ’ (if p.1 = q5' then Multiset.count p x else 0) = 0
simp_all [eq_comm] All goals completed! π
Β· neg π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xβ’ (Multiset.map (fun y => if p.1 = y then Multiset.count p x else 0) (Multiset.map Prod.fst x).dedup).sum =
Multiset.count p x rw [Multiset.sum_eq_zero neg π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xβ’ 0 = Multiset.count p xneg π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xβ’ β x_1 β Multiset.map (fun y => if p.1 = y then Multiset.count p x else 0) (Multiset.map Prod.fst x).dedup, x_1 = 0 neg π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xβ’ 0 = Multiset.count p xneg π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xβ’ β x_1 β Multiset.map (fun y => if p.1 = y then Multiset.count p x else 0) (Multiset.map Prod.fst x).dedup, x_1 = 0]neg π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xβ’ 0 = Multiset.count p xneg π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xβ’ β x_1 β Multiset.map (fun y => if p.1 = y then Multiset.count p x else 0) (Multiset.map Prod.fst x).dedup, x_1 = 0
refine Eq.symm (Multiset.count_eq_zero_of_notMem ?_) neg π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xβ’ p β xneg π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xβ’ β x_1 β Multiset.map (fun y => if p.1 = y then Multiset.count p x else 0) (Multiset.map Prod.fst x).dedup, x_1 = 0
intro h neg π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xh:p β xβ’ Falseneg π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xβ’ β x_1 β Multiset.map (fun y => if p.1 = y then Multiset.count p x else 0) (Multiset.map Prod.fst x).dedup, x_1 = 0
have h_mem : p.1 β Multiset.map Prod.fst x := by π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mβ’ (Multiset.map (fun y => (f y.1) y.2) (x.toCharges.dedup.bind fun q => Multiset.filter (fun f => f.1 = q) x)).sum =
(Multiset.map (fun y => (f y.1) y.2) x).sum neg π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_memβ:p.1 β Multiset.map Prod.fst xh:p β xh_mem:p.1 β Multiset.map Prod.fst xβ’ Falseneg π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xβ’ β x_1 β Multiset.map (fun y => if p.1 = y then Multiset.count p x else 0) (Multiset.map Prod.fst x).dedup, x_1 = 0
simp_allneg π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_memβ:p.1 β Multiset.map Prod.fst xh:p β xh_mem:p.1 β Multiset.map Prod.fst xβ’ Falseneg π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xβ’ β x_1 β Multiset.map (fun y => if p.1 = y then Multiset.count p x else 0) (Multiset.map Prod.fst x).dedup, x_1 = 0neg π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_memβ:p.1 β Multiset.map Prod.fst xh:p β xh_mem:p.1 β Multiset.map Prod.fst xβ’ Falseneg π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xβ’ β x_1 β Multiset.map (fun y => if p.1 = y then Multiset.count p x else 0) (Multiset.map Prod.fst x).dedup, x_1 = 0
(expose_names neg π©:Typeinst:DecidableEq π©M:Type u_1inst_1:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem_1:p.1 β Multiset.map Prod.fst xh:p β xh_mem:p.1 β Multiset.map Prod.fst xβ’ Falseneg π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xβ’ β x_1 β Multiset.map (fun y => if p.1 = y then Multiset.count p x else 0) (Multiset.map Prod.fst x).dedup, x_1 = 0; exact h_mem_1 h_mem neg π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xβ’ β x_1 β Multiset.map (fun y => if p.1 = y then Multiset.count p x else 0) (Multiset.map Prod.fst x).dedup, x_1 = 0)
intro p' hp neg π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xp':βhp:p' β Multiset.map (fun y => if p.1 = y then Multiset.count p x else 0) (Multiset.map Prod.fst x).dedupβ’ p' = 0
simp at hp neg π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xp':βhp:β a, (β x_1, (a, x_1) β x) β§ (if p.1 = a then Multiset.count p x else 0) = p'β’ p' = 0
obtain β¨q5', β¨f1, hfβ©, hp'β© := hp neg π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xp':βq5':π©hp':(if p.1 = q5' then Multiset.count p x else 0) = p'f1:Fluxeshf:(q5', f1) β xβ’ p' = 0
by_cases h_eq : p.1 = q5' pos π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xp':βq5':π©hp':(if p.1 = q5' then Multiset.count p x else 0) = p'f1:Fluxeshf:(q5', f1) β xh_eq:p.1 = q5'β’ p' = 0neg π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xp':βq5':π©hp':(if p.1 = q5' then Multiset.count p x else 0) = p'f1:Fluxeshf:(q5', f1) β xh_eq:Β¬p.1 = q5'β’ p' = 0
Β· pos π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xp':βq5':π©hp':(if p.1 = q5' then Multiset.count p x else 0) = p'f1:Fluxeshf:(q5', f1) β xh_eq:p.1 = q5'β’ p' = 0 simp_all All goals completed! π
Β· neg π©:TypeinstβΒΉ:DecidableEq π©M:Type u_1instβ:AddCommMonoid Mx:TenQuanta π©f:π© β Fluxes β+ Mp:π© Γ Fluxesh_mem:p.1 β Multiset.map Prod.fst xp':βq5':π©hp':(if p.1 = q5' then Multiset.count p x else 0) = p'f1:Fluxeshf:(q5', f1) β xh_eq:Β¬p.1 = q5'β’ p' = 0 simp_all All goals completed! πB.7. Reduction does nothing if no duplicate charges
lemma reduce_eq_self_of_ofCharges_nodup (x : TenQuanta π©) (h : x.toCharges.Nodup) :
x.reduce = x := by π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:x.toCharges.Nodupβ’ x.reduce = x
rw [reduce, π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:x.toCharges.Nodupβ’ Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum))
x.toCharges.dedup =
x π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:x.toCharges.Nodupβ’ Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum))
x.toCharges =
x Multiset.Nodup.dedup h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:x.toCharges.Nodupβ’ Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum))
x.toCharges =
x π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:x.toCharges.Nodupβ’ Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum))
x.toCharges =
x] π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:x.toCharges.Nodupβ’ Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum))
x.toCharges =
x
simp [toCharges] π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:x.toCharges.Nodupβ’ Multiset.map (fun x_1 => (x_1.1, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = x_1.1) x)).sum)) x = x
conv_rhs => rw [β Multiset.map_id x] π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:x.toCharges.Nodup| Multiset.map id x
apply Multiset.map_congr rfl π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:x.toCharges.Nodupβ’ β x_1 β x, (x_1.1, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = x_1.1) x)).sum) = id x_1
intro p hp π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:x.toCharges.Nodupp:π© Γ Fluxeshp:p β xβ’ (p.1, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x)).sum) = id p
simp only [id_eq] π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:x.toCharges.Nodupp:π© Γ Fluxeshp:p β xβ’ (p.1, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x)).sum) = p
have x_noDup : x.Nodup := Multiset.Nodup.of_map Prod.fst h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:x.toCharges.Nodupp:π© Γ Fluxeshp:p β xx_noDup:Multiset.Nodup xβ’ (p.1, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x)).sum) = p
suffices (Multiset.filter (fun f => f.1 = p.1) x) = {p} by π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:x.toCharges.Nodupp:π© Γ Fluxeshp:p β xx_noDup:Multiset.Nodup xthis:Multiset.filter (fun f => f.1 = p.1) x = {p}β’ (p.1, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = p.1) x)).sum) = p π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:x.toCharges.Nodupp:π© Γ Fluxeshp:p β xx_noDup:Multiset.Nodup xβ’ Multiset.filter (fun f => f.1 = p.1) x = {p} simp [this] π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:x.toCharges.Nodupp:π© Γ Fluxeshp:p β xx_noDup:Multiset.Nodup xβ’ Multiset.filter (fun f => f.1 = p.1) x = {p} π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:x.toCharges.Nodupp:π© Γ Fluxeshp:p β xx_noDup:Multiset.Nodup xβ’ Multiset.filter (fun f => f.1 = p.1) x = {p}
refine (Multiset.Nodup.ext ?_ ?_).mpr ?_ refine_1 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:x.toCharges.Nodupp:π© Γ Fluxeshp:p β xx_noDup:Multiset.Nodup xβ’ (Multiset.filter (fun f => f.1 = p.1) x).Noduprefine_2 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:x.toCharges.Nodupp:π© Γ Fluxeshp:p β xx_noDup:Multiset.Nodup xβ’ {p}.Noduprefine_3 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:x.toCharges.Nodupp:π© Γ Fluxeshp:p β xx_noDup:Multiset.Nodup xβ’ β (a : π© Γ Fluxes), a β Multiset.filter (fun f => f.1 = p.1) x β a β {p}
Β· refine_1 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:x.toCharges.Nodupp:π© Γ Fluxeshp:p β xx_noDup:Multiset.Nodup xβ’ (Multiset.filter (fun f => f.1 = p.1) x).Nodup exact Multiset.Nodup.filter (fun f => f.1 = p.1) x_noDup All goals completed! π
Β· refine_2 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:x.toCharges.Nodupp:π© Γ Fluxeshp:p β xx_noDup:Multiset.Nodup xβ’ {p}.Nodup exact Multiset.nodup_singleton p All goals completed! π
intro p' refine_3 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:x.toCharges.Nodupp:π© Γ Fluxeshp:p β xx_noDup:Multiset.Nodup xp':π© Γ Fluxesβ’ p' β Multiset.filter (fun f => f.1 = p.1) x β p' β {p}
simp only [Multiset.mem_filter, Multiset.mem_singleton] refine_3 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:x.toCharges.Nodupp:π© Γ Fluxeshp:p β xx_noDup:Multiset.Nodup xp':π© Γ Fluxesβ’ p' β x β§ p'.1 = p.1 β p' = p
constructor refine_3.mp π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:x.toCharges.Nodupp:π© Γ Fluxeshp:p β xx_noDup:Multiset.Nodup xp':π© Γ Fluxesβ’ p' β x β§ p'.1 = p.1 β p' = prefine_3.mpr π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:x.toCharges.Nodupp:π© Γ Fluxeshp:p β xx_noDup:Multiset.Nodup xp':π© Γ Fluxesβ’ p' = p β p' β x β§ p'.1 = p.1
Β· refine_3.mp π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:x.toCharges.Nodupp:π© Γ Fluxeshp:p β xx_noDup:Multiset.Nodup xp':π© Γ Fluxesβ’ p' β x β§ p'.1 = p.1 β p' = p rintro β¨h1, h2β© refine_3.mp π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:x.toCharges.Nodupp:π© Γ Fluxeshp:p β xx_noDup:Multiset.Nodup xp':π© Γ Fluxesh1:p' β xh2:p'.1 = p.1β’ p' = p
simp [toCharges] at h refine_3.mp π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:(Multiset.map Prod.fst x).Nodupp:π© Γ Fluxeshp:p β xx_noDup:Multiset.Nodup xp':π© Γ Fluxesh1:p' β xh2:p'.1 = p.1β’ p' = p
rw [Multiset.nodup_map_iff_inj_on x_noDup refine_3.mp π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:β x_1 β x, β y β x, x_1.1 = y.1 β x_1 = yp:π© Γ Fluxeshp:p β xx_noDup:Multiset.Nodup xp':π© Γ Fluxesh1:p' β xh2:p'.1 = p.1β’ p' = p refine_3.mp π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:β x_1 β x, β y β x, x_1.1 = y.1 β x_1 = yp:π© Γ Fluxeshp:p β xx_noDup:Multiset.Nodup xp':π© Γ Fluxesh1:p' β xh2:p'.1 = p.1β’ p' = p] at hrefine_3.mp π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:β x_1 β x, β y β x, x_1.1 = y.1 β x_1 = yp:π© Γ Fluxeshp:p β xx_noDup:Multiset.Nodup xp':π© Γ Fluxesh1:p' β xh2:p'.1 = p.1β’ p' = p
exact h p' h1 p hp h2 All goals completed! π
Β· refine_3.mpr π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:x.toCharges.Nodupp:π© Γ Fluxeshp:p β xx_noDup:Multiset.Nodup xp':π© Γ Fluxesβ’ p' = p β p' β x β§ p'.1 = p.1 rintro β¨rflβ© refine_3.mpr π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h:x.toCharges.Nodupp:π© Γ Fluxeshp:p β xx_noDup:Multiset.Nodup xβ’ p β x β§ p.1 = p.1
simp_all All goals completed! πB.8. The charge map is preserved by reduction
lemma reduce_toChargeMap_eq (x : TenQuanta π©) :
x.reduce.toChargeMap = x.toChargeMap := by π©:Typeinstβ:DecidableEq π©x:TenQuanta π©β’ x.reduce.toChargeMap = x.toChargeMap
funext q π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©β’ x.reduce.toChargeMap q = x.toChargeMap q
by_cases h : q β x.toCharges pos π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ x.reduce.toChargeMap q = x.toChargeMap qneg π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ x.reduce.toChargeMap q = x.toChargeMap q
Β· pos π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ x.reduce.toChargeMap q = x.toChargeMap q rw [toChargeMap, pos π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ (Multiset.map Prod.snd (Multiset.filter (fun p => p.1 = q) x.reduce)).sum = x.toChargeMap q pos π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ (Multiset.map Prod.snd {(q, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum)}).sum =
x.toChargeMap qpos.h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ q β x.toCharges reduce_filter pos π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ (Multiset.map Prod.snd {(q, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum)}).sum =
x.toChargeMap qpos.h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ q β x.toCharges pos π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ (Multiset.map Prod.snd {(q, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum)}).sum =
x.toChargeMap qpos.h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ q β x.toCharges]pos π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ (Multiset.map Prod.snd {(q, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum)}).sum =
x.toChargeMap qpos.h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ q β x.toCharges
Β· pos π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ (Multiset.map Prod.snd {(q, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum)}).sum =
x.toChargeMap q simp [toChargeMap] All goals completed! π
Β· pos.h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ q β x.toCharges exact h All goals completed! π
Β· neg π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ x.reduce.toChargeMap q = x.toChargeMap q rw [toChargeMap_of_not_mem, neg π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ 0 = x.toChargeMap qneg.h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ q β x.reduce.toCharges neg.h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ q β x.toChargesneg.h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ q β x.reduce.toCharges toChargeMap_of_not_mem neg π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ 0 = 0neg.h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ q β x.toChargesneg.h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ q β x.reduce.toChargesneg.h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ q β x.toChargesneg.h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ q β x.reduce.toCharges]neg.h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ q β x.toChargesneg.h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ q β x.reduce.toCharges
Β· neg.h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ q β x.toCharges exact h All goals completed! π
Β· neg.h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ q β x.reduce.toCharges rw [reduce_toCharges neg.h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ q β x.toCharges.dedup neg.h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ q β x.toCharges.dedup]neg.h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ q β x.toCharges.dedup
simp only [Multiset.mem_dedup] neg.h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©h:q β x.toChargesβ’ q β x.toCharges
exact h All goals completed! π
B.9. A fluxes in the reduced TenQuanta is a sum of fluxes in the original TenQuanta
lemma mem_powerset_sum_of_mem_reduce_toFluxesTen {F : TenQuanta π©}
{f : Fluxes} (hf : f β F.reduce.toFluxesTen) :
f β (Multiset.powerset F.toFluxesTen).map fun s => s.sum := by π©:Typeinstβ:DecidableEq π©F:TenQuanta π©f:Fluxeshf:f β F.reduce.toFluxesTenβ’ f β Multiset.map (fun s => s.sum) (Multiset.powerset F.toFluxesTen)
rw [toFluxesTen, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©f:Fluxeshf:f β Multiset.map Prod.snd F.reduceβ’ f β Multiset.map (fun s => s.sum) (Multiset.powerset F.toFluxesTen) π©:Typeinstβ:DecidableEq π©F:TenQuanta π©f:Fluxeshf:β a β F.reduce, a.2 = fβ’ f β Multiset.map (fun s => s.sum) (Multiset.powerset F.toFluxesTen) Multiset.mem_map π©:Typeinstβ:DecidableEq π©F:TenQuanta π©f:Fluxeshf:β a β F.reduce, a.2 = fβ’ f β Multiset.map (fun s => s.sum) (Multiset.powerset F.toFluxesTen) π©:Typeinstβ:DecidableEq π©F:TenQuanta π©f:Fluxeshf:β a β F.reduce, a.2 = fβ’ f β Multiset.map (fun s => s.sum) (Multiset.powerset F.toFluxesTen)] at hf π©:Typeinstβ:DecidableEq π©F:TenQuanta π©f:Fluxeshf:β a β F.reduce, a.2 = fβ’ f β Multiset.map (fun s => s.sum) (Multiset.powerset F.toFluxesTen)
obtain β¨β¨q, fβ©, hp, rflβ© := hf π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©f:Fluxeshp:(q, f) β F.reduceβ’ (q, f).2 β Multiset.map (fun s => s.sum) (Multiset.powerset F.toFluxesTen)
rw [mem_reduce_iff π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©f:Fluxeshp:(q, f).1 β F.toCharges β§ (q, f).2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f_1 => f_1.1 = (q, f).1) F)).sumβ’ (q, f).2 β Multiset.map (fun s => s.sum) (Multiset.powerset F.toFluxesTen) π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©f:Fluxeshp:(q, f).1 β F.toCharges β§ (q, f).2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f_1 => f_1.1 = (q, f).1) F)).sumβ’ (q, f).2 β Multiset.map (fun s => s.sum) (Multiset.powerset F.toFluxesTen)] at hp π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©f:Fluxeshp:(q, f).1 β F.toCharges β§ (q, f).2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f_1 => f_1.1 = (q, f).1) F)).sumβ’ (q, f).2 β Multiset.map (fun s => s.sum) (Multiset.powerset F.toFluxesTen)
simp at hp π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©f:Fluxeshp:q β F.toCharges β§ f = (Multiset.map (fun x => x.2) (Multiset.filter (fun x => x.1 = q) F)).sumβ’ (q, f).2 β Multiset.map (fun s => s.sum) (Multiset.powerset F.toFluxesTen)
obtain β¨hq, rflβ© := hp π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©hq:q β F.toChargesβ’ (q, (Multiset.map (fun x => x.2) (Multiset.filter (fun x => x.1 = q) F)).sum).2 β
Multiset.map (fun s => s.sum) (Multiset.powerset F.toFluxesTen)
simp only [Multiset.mem_map, Multiset.mem_powerset] π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©hq:q β F.toChargesβ’ β a β€ F.toFluxesTen, a.sum = (Multiset.map (fun x => x.2) (Multiset.filter (fun x => x.1 = q) F)).sum
use (Multiset.map (fun x => x.2) (Multiset.filter (fun x => x.1 = q) F)) h π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©hq:q β F.toChargesβ’ Multiset.map (fun x => x.2) (Multiset.filter (fun x => x.1 = q) F) β€ F.toFluxesTen β§
(Multiset.map (fun x => x.2) (Multiset.filter (fun x => x.1 = q) F)).sum =
(Multiset.map (fun x => x.2) (Multiset.filter (fun x => x.1 = q) F)).sum
simp only [and_true] h π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©hq:q β F.toChargesβ’ Multiset.map (fun x => x.2) (Multiset.filter (fun x => x.1 = q) F) β€ F.toFluxesTen
rw [toFluxesTen h π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©hq:q β F.toChargesβ’ Multiset.map (fun x => x.2) (Multiset.filter (fun x => x.1 = q) F) β€ Multiset.map Prod.snd F h π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©hq:q β F.toChargesβ’ Multiset.map (fun x => x.2) (Multiset.filter (fun x => x.1 = q) F) β€ Multiset.map Prod.snd F]h π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©hq:q β F.toChargesβ’ Multiset.map (fun x => x.2) (Multiset.filter (fun x => x.1 = q) F) β€ Multiset.map Prod.snd F
refine Multiset.map_le_map ?_ h π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©hq:q β F.toChargesβ’ Multiset.filter (fun x => x.1 = q) F β€ F
exact Multiset.filter_le (fun x => x.1 = q) F All goals completed! π
lemma mem_powerset_sum_of_mem_reduce_toFluxesTen_filter {F : TenQuanta π©}
{f : Fluxes} (hf : f β F.reduce.toFluxesTen) :
f β (F.toFluxesTen.powerset.filter fun s => s β 0).map fun s => s.sum := by π©:Typeinstβ:DecidableEq π©F:TenQuanta π©f:Fluxeshf:f β F.reduce.toFluxesTenβ’ f β Multiset.map (fun s => s.sum) (Multiset.filter (fun s => s β 0) (Multiset.powerset F.toFluxesTen))
rw [toFluxesTen, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©f:Fluxeshf:f β Multiset.map Prod.snd F.reduceβ’ f β Multiset.map (fun s => s.sum) (Multiset.filter (fun s => s β 0) (Multiset.powerset F.toFluxesTen)) π©:Typeinstβ:DecidableEq π©F:TenQuanta π©f:Fluxeshf:β a β F.reduce, a.2 = fβ’ f β Multiset.map (fun s => s.sum) (Multiset.filter (fun s => s β 0) (Multiset.powerset F.toFluxesTen)) Multiset.mem_map π©:Typeinstβ:DecidableEq π©F:TenQuanta π©f:Fluxeshf:β a β F.reduce, a.2 = fβ’ f β Multiset.map (fun s => s.sum) (Multiset.filter (fun s => s β 0) (Multiset.powerset F.toFluxesTen)) π©:Typeinstβ:DecidableEq π©F:TenQuanta π©f:Fluxeshf:β a β F.reduce, a.2 = fβ’ f β Multiset.map (fun s => s.sum) (Multiset.filter (fun s => s β 0) (Multiset.powerset F.toFluxesTen))] at hf π©:Typeinstβ:DecidableEq π©F:TenQuanta π©f:Fluxeshf:β a β F.reduce, a.2 = fβ’ f β Multiset.map (fun s => s.sum) (Multiset.filter (fun s => s β 0) (Multiset.powerset F.toFluxesTen))
obtain β¨β¨q, fβ©, hp, rflβ© := hf π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©f:Fluxeshp:(q, f) β F.reduceβ’ (q, f).2 β Multiset.map (fun s => s.sum) (Multiset.filter (fun s => s β 0) (Multiset.powerset F.toFluxesTen))
rw [mem_reduce_iff π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©f:Fluxeshp:(q, f).1 β F.toCharges β§ (q, f).2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f_1 => f_1.1 = (q, f).1) F)).sumβ’ (q, f).2 β Multiset.map (fun s => s.sum) (Multiset.filter (fun s => s β 0) (Multiset.powerset F.toFluxesTen)) π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©f:Fluxeshp:(q, f).1 β F.toCharges β§ (q, f).2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f_1 => f_1.1 = (q, f).1) F)).sumβ’ (q, f).2 β Multiset.map (fun s => s.sum) (Multiset.filter (fun s => s β 0) (Multiset.powerset F.toFluxesTen))] at hp π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©f:Fluxeshp:(q, f).1 β F.toCharges β§ (q, f).2 = (Multiset.map (fun y => y.2) (Multiset.filter (fun f_1 => f_1.1 = (q, f).1) F)).sumβ’ (q, f).2 β Multiset.map (fun s => s.sum) (Multiset.filter (fun s => s β 0) (Multiset.powerset F.toFluxesTen))
simp at hp π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©f:Fluxeshp:q β F.toCharges β§ f = (Multiset.map (fun x => x.2) (Multiset.filter (fun x => x.1 = q) F)).sumβ’ (q, f).2 β Multiset.map (fun s => s.sum) (Multiset.filter (fun s => s β 0) (Multiset.powerset F.toFluxesTen))
obtain β¨hq, rflβ© := hp π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©hq:q β F.toChargesβ’ (q, (Multiset.map (fun x => x.2) (Multiset.filter (fun x => x.1 = q) F)).sum).2 β
Multiset.map (fun s => s.sum) (Multiset.filter (fun s => s β 0) (Multiset.powerset F.toFluxesTen))
simp only [Multiset.mem_map] π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©hq:q β F.toChargesβ’ β a β Multiset.filter (fun s => s β 0) (Multiset.powerset F.toFluxesTen),
a.sum = (Multiset.map (fun x => x.2) (Multiset.filter (fun x => x.1 = q) F)).sum
use (Multiset.map (fun x => x.2) (Multiset.filter (fun x => x.1 = q) F)) h π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©hq:q β F.toChargesβ’ Multiset.map (fun x => x.2) (Multiset.filter (fun x => x.1 = q) F) β
Multiset.filter (fun s => s β 0) (Multiset.powerset F.toFluxesTen) β§
(Multiset.map (fun x => x.2) (Multiset.filter (fun x => x.1 = q) F)).sum =
(Multiset.map (fun x => x.2) (Multiset.filter (fun x => x.1 = q) F)).sum
simp only [ne_eq, Multiset.mem_filter, Multiset.mem_powerset, Multiset.map_eq_zero,
Multiset.filter_eq_nil, Prod.forall, not_forall, Decidable.not_not, and_true] h π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©hq:q β F.toChargesβ’ Multiset.map (fun x => x.2) (Multiset.filter (fun x => x.1 = q) F) β€ F.toFluxesTen β§
β x x_1, β (_ : (x, x_1) β F), x = q
apply And.intro h.left π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©hq:q β F.toChargesβ’ Multiset.map (fun x => x.2) (Multiset.filter (fun x => x.1 = q) F) β€ F.toFluxesTenh.right π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©hq:q β F.toChargesβ’ β x x_1, β (_ : (x, x_1) β F), x = q
rw [toFluxesTen h.left π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©hq:q β F.toChargesβ’ Multiset.map (fun x => x.2) (Multiset.filter (fun x => x.1 = q) F) β€ Multiset.map Prod.snd Fh.right π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©hq:q β F.toChargesβ’ β x x_1, β (_ : (x, x_1) β F), x = q h.left π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©hq:q β F.toChargesβ’ Multiset.map (fun x => x.2) (Multiset.filter (fun x => x.1 = q) F) β€ Multiset.map Prod.snd Fh.right π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©hq:q β F.toChargesβ’ β x x_1, β (_ : (x, x_1) β F), x = q]h.left π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©hq:q β F.toChargesβ’ Multiset.map (fun x => x.2) (Multiset.filter (fun x => x.1 = q) F) β€ Multiset.map Prod.snd Fh.right π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©hq:q β F.toChargesβ’ β x x_1, β (_ : (x, x_1) β F), x = q
refine Multiset.map_le_map ?_ h.left π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©hq:q β F.toChargesβ’ Multiset.filter (fun x => x.1 = q) F β€ Fh.right π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©hq:q β F.toChargesβ’ β x x_1, β (_ : (x, x_1) β F), x = q
exact Multiset.filter_le (fun x => x.1 = q) F h.right π©:Typeinstβ:DecidableEq π©F:TenQuanta π©q:π©hq:q β F.toChargesβ’ β x x_1, β (_ : (x, x_1) β F), x = q
simpa [toCharges] using hq All goals completed! π
B.10. No exotics condition on the reduced TenQuanta
B.10.1. Number of chiral U
lemma reduce_numChiralU_of_mem_elemsNoExotics {F : TenQuanta π©}
(hx : F.toFluxesTen β FluxesTen.elemsNoExotics) :
F.reduce.toFluxesTen.numChiralU = 3 := by π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ F.reduce.toFluxesTen.numChiralU = 3
have hE : F.toFluxesTen.NoExotics := ((FluxesTen.noExotics_iff_mem_elemsNoExotics _).mpr hx).1 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsβ’ F.reduce.toFluxesTen.numChiralU = 3
have numChiralU_eq_sum := F.toFluxesTen.numChiralU_eq_sum_sub_numAntiChiralU π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:F.toFluxesTen.numChiralU = F.toFluxesTen.chiralIndicesOfU.sum - F.toFluxesTen.numAntiChiralUβ’ F.reduce.toFluxesTen.numChiralU = 3
rw [hE.2.2.1, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = F.toFluxesTen.chiralIndicesOfU.sum - F.toFluxesTen.numAntiChiralUβ’ F.reduce.toFluxesTen.numChiralU = 3 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralU = 3 hE.2.2.2.1, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = F.toFluxesTen.chiralIndicesOfU.sum - 0β’ F.reduce.toFluxesTen.numChiralU = 3 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralU = 3 sub_zero, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = F.toFluxesTen.chiralIndicesOfU.sumβ’ F.reduce.toFluxesTen.numChiralU = 3 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralU = 3 FluxesTen.chiralIndicesOfU π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralU = 3 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralU = 3] at numChiralU_eq_sum π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralU = 3
have hmap : (F.reduce.toFluxesTen.map (fun f => f.M - f.N)).sum =
(F.toFluxesTen.map (fun f => f.M - f.N)).sum := by
have h := reduce_sum_eq_sum_toCharges F
(fun _ => (β¨β¨fun f => f.M - f.N, by π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumxβ:π©β’ Fluxes.M 0 - Fluxes.N 0 = 0 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumh:(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M - f.N, map_zero' := β―, map_add' := β― } x)
F.reduce).sum =
(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M - f.N, map_zero' := β―, map_add' := β― } x)
F).sumβ’ (Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sum π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralU = 3 simp All goals completed! π π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumh:(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M - f.N, map_zero' := β―, map_add' := β― } x)
F.reduce).sum =
(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M - f.N, map_zero' := β―, map_add' := β― } x)
F).sumβ’ (Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sum π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralU = 3β©, fun a b => by π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumxβ:π©a:Fluxesb:Fluxesβ’ { toFun := fun f => f.M - f.N, map_zero' := β― }.toFun (a + b) =
{ toFun := fun f => f.M - f.N, map_zero' := β― }.toFun a + { toFun := fun f => f.M - f.N, map_zero' := β― }.toFun b π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumh:(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M - f.N, map_zero' := β―, map_add' := β― } x)
F.reduce).sum =
(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M - f.N, map_zero' := β―, map_add' := β― } x)
F).sumβ’ (Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sum π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralU = 3 simp π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumxβ:π©a:Fluxesb:Fluxesβ’ a.M + b.M - (a.N + b.N) = a.M - a.N + (b.M - b.N) π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumh:(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M - f.N, map_zero' := β―, map_add' := β― } x)
F.reduce).sum =
(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M - f.N, map_zero' := β―, map_add' := β― } x)
F).sumβ’ (Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sum π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralU = 3; ring All goals completed! π π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumh:(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M - f.N, map_zero' := β―, map_add' := β― } x)
F.reduce).sum =
(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M - f.N, map_zero' := β―, map_add' := β― } x)
F).sumβ’ (Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sum π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralU = 3β© : Fluxes β+ β€)) π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumh:(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M - f.N, map_zero' := β―, map_add' := β― } x)
F.reduce).sum =
(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M - f.N, map_zero' := β―, map_add' := β― } x)
F).sumβ’ (Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sum π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralU = 3
simpa [toFluxesTen, Multiset.map_map, Function.comp] using h π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralU = 3 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralU = 3
rw [FluxesTen.numChiralU, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ (Multiset.filter (fun x => 0 β€ x) F.reduce.toFluxesTen.chiralIndicesOfU).sum = 3 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sum = 3π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ β a β Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen, 0 β€ a FluxesTen.chiralIndicesOfU, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ (Multiset.filter (fun x => 0 β€ x) (Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen)).sum = 3 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sum = 3π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ β a β Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen, 0 β€ a Multiset.filter_eq_self.mpr, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ (Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = 3π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ β a β Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen, 0 β€ a π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sum = 3π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ β a β Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen, 0 β€ a hmap π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sum = 3π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ β a β Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen, 0 β€ a π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sum = 3π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ β a β Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen, 0 β€ a] π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sum = 3π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ β a β Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen, 0 β€ a
Β· π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumβ’ (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sum = 3 exact numChiralU_eq_sum.symm All goals completed! π
intro a ha π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).suma:β€ha:a β Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTenβ’ 0 β€ a
obtain β¨f, hf, rflβ© := Multiset.mem_map.mp ha π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumf:Fluxeshf:f β F.reduce.toFluxesTenha:f.M - f.N β Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTenβ’ 0 β€ f.M - f.N
replace hf := mem_powerset_sum_of_mem_reduce_toFluxesTen hf π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralU_eq_sum:3 = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M - f.N) F.toFluxesTen).sumf:Fluxesha:f.M - f.N β Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTenhf:f β Multiset.map (fun s => s.sum) (Multiset.powerset F.toFluxesTen)β’ 0 β€ f.M - f.N
clear ha hmap numChiralU_eq_sum hE π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsf:Fluxeshf:f β Multiset.map (fun s => s.sum) (Multiset.powerset F.toFluxesTen)β’ 0 β€ f.M - f.N
generalize F.toFluxesTen = G at * π©:Typeinstβ:DecidableEq π©F:TenQuanta π©f:FluxesG:FluxesTenhx:G β FluxesTen.elemsNoExoticshf:f β Multiset.map (fun s => s.sum) (Multiset.powerset G)β’ 0 β€ f.M - f.N
revert f π©:Typeinstβ:DecidableEq π©F:TenQuanta π©G:FluxesTenhx:G β FluxesTen.elemsNoExoticsβ’ β f β Multiset.map (fun s => s.sum) (Multiset.powerset G), 0 β€ f.M - f.N
revert G π©:Typeinstβ:DecidableEq π©F:TenQuanta π©β’ β G β FluxesTen.elemsNoExotics, β f β Multiset.map (fun s => s.sum) (Multiset.powerset G), 0 β€ f.M - f.N
decide All goals completed! π
B.10.2. Number of anti-chiral U
lemma reduce_numAntiChiralU_of_mem_elemsNoExotics {F : TenQuanta π©}
(hx : F.toFluxesTen β FluxesTen.elemsNoExotics) :
F.reduce.toFluxesTen.numAntiChiralU = 0 := by π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ F.reduce.toFluxesTen.numAntiChiralU = 0
rw [FluxesTen.numAntiChiralU, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ (Multiset.filter (fun x => x < 0) F.reduce.toFluxesTen.chiralIndicesOfU).sum = 0 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ β a β Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen, Β¬a < 0 FluxesTen.chiralIndicesOfU, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ (Multiset.filter (fun x => x < 0) (Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen)).sum = 0 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ β a β Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen, Β¬a < 0 Multiset.filter_eq_nil.mpr, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ Multiset.sum 0 = 0π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ β a β Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen, Β¬a < 0 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ β a β Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen, Β¬a < 0
Multiset.sum_zero π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ 0 = 0π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ β a β Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen, Β¬a < 0 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ β a β Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen, Β¬a < 0] π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ β a β Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTen, Β¬a < 0
intro a ha π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsa:β€ha:a β Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTenβ’ Β¬a < 0
obtain β¨f, hf, rflβ© := Multiset.mem_map.mp ha π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsf:Fluxeshf:f β F.reduce.toFluxesTenha:f.M - f.N β Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTenβ’ Β¬f.M - f.N < 0
replace hf := mem_powerset_sum_of_mem_reduce_toFluxesTen hf π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsf:Fluxesha:f.M - f.N β Multiset.map (fun f => f.M - f.N) F.reduce.toFluxesTenhf:f β Multiset.map (fun s => s.sum) (Multiset.powerset F.toFluxesTen)β’ Β¬f.M - f.N < 0
clear ha π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsf:Fluxeshf:f β Multiset.map (fun s => s.sum) (Multiset.powerset F.toFluxesTen)β’ Β¬f.M - f.N < 0
generalize F.toFluxesTen = G at * π©:Typeinstβ:DecidableEq π©F:TenQuanta π©f:FluxesG:FluxesTenhx:G β FluxesTen.elemsNoExoticshf:f β Multiset.map (fun s => s.sum) (Multiset.powerset G)β’ Β¬f.M - f.N < 0
revert f π©:Typeinstβ:DecidableEq π©F:TenQuanta π©G:FluxesTenhx:G β FluxesTen.elemsNoExoticsβ’ β f β Multiset.map (fun s => s.sum) (Multiset.powerset G), Β¬f.M - f.N < 0
revert G π©:Typeinstβ:DecidableEq π©F:TenQuanta π©β’ β G β FluxesTen.elemsNoExotics, β f β Multiset.map (fun s => s.sum) (Multiset.powerset G), Β¬f.M - f.N < 0
decide All goals completed! π
B.10.3. Number of chiral Q
lemma reduce_numChiralQ_of_mem_elemsNoExotics {F : TenQuanta π©}
(hx : F.toFluxesTen β FluxesTen.elemsNoExotics) :
F.reduce.toFluxesTen.numChiralQ = 3 := by π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ F.reduce.toFluxesTen.numChiralQ = 3
have hE : F.toFluxesTen.NoExotics := ((FluxesTen.noExotics_iff_mem_elemsNoExotics _).mpr hx).1 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsβ’ F.reduce.toFluxesTen.numChiralQ = 3
have numChiralQ_eq_sum := F.toFluxesTen.numChiralQ_eq_sum_sub_numAntiChiralQ π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:F.toFluxesTen.numChiralQ = F.toFluxesTen.chiralIndicesOfQ.sum - F.toFluxesTen.numAntiChiralQβ’ F.reduce.toFluxesTen.numChiralQ = 3
rw [hE.1, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = F.toFluxesTen.chiralIndicesOfQ.sum - F.toFluxesTen.numAntiChiralQβ’ F.reduce.toFluxesTen.numChiralQ = 3 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralQ = 3 hE.2.1, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = F.toFluxesTen.chiralIndicesOfQ.sum - 0β’ F.reduce.toFluxesTen.numChiralQ = 3 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralQ = 3 sub_zero, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = F.toFluxesTen.chiralIndicesOfQ.sumβ’ F.reduce.toFluxesTen.numChiralQ = 3 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralQ = 3 FluxesTen.chiralIndicesOfQ π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralQ = 3 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralQ = 3] at numChiralQ_eq_sum π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralQ = 3
have hmap : (F.reduce.toFluxesTen.map (fun f => f.M)).sum =
(F.toFluxesTen.map (fun f => f.M)).sum := by
have h := reduce_sum_eq_sum_toCharges F
(fun _ => (β¨β¨fun f => f.M, by π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumxβ:π©β’ Fluxes.M 0 = 0 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumh:(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M, map_zero' := β―, map_add' := β― } x)
F.reduce).sum =
(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M, map_zero' := β―, map_add' := β― } x)
F).sumβ’ (Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sum π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralQ = 3 simp All goals completed! π π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumh:(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M, map_zero' := β―, map_add' := β― } x)
F.reduce).sum =
(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M, map_zero' := β―, map_add' := β― } x)
F).sumβ’ (Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sum π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralQ = 3β©, fun a b => by π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumxβ:π©a:Fluxesb:Fluxesβ’ { toFun := fun f => f.M, map_zero' := β― }.toFun (a + b) =
{ toFun := fun f => f.M, map_zero' := β― }.toFun a + { toFun := fun f => f.M, map_zero' := β― }.toFun b π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumh:(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M, map_zero' := β―, map_add' := β― } x)
F.reduce).sum =
(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M, map_zero' := β―, map_add' := β― } x)
F).sumβ’ (Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sum π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralQ = 3 simp All goals completed! π π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumh:(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M, map_zero' := β―, map_add' := β― } x)
F.reduce).sum =
(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M, map_zero' := β―, map_add' := β― } x)
F).sumβ’ (Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sum π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralQ = 3β© : Fluxes β+ β€)) π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumh:(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M, map_zero' := β―, map_add' := β― } x)
F.reduce).sum =
(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M, map_zero' := β―, map_add' := β― } x)
F).sumβ’ (Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sum π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralQ = 3
simpa [toFluxesTen, Multiset.map_map, Function.comp] using h π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralQ = 3 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralQ = 3
rw [FluxesTen.numChiralQ, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ (Multiset.filter (fun x => 0 β€ x) F.reduce.toFluxesTen.chiralIndicesOfQ).sum = 3 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ (Multiset.map (fun f => f.M) F.toFluxesTen).sum = 3π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ β a β Multiset.map (fun f => f.M) F.reduce.toFluxesTen, 0 β€ a FluxesTen.chiralIndicesOfQ, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ (Multiset.filter (fun x => 0 β€ x) (Multiset.map (fun f => f.M) F.reduce.toFluxesTen)).sum = 3 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ (Multiset.map (fun f => f.M) F.toFluxesTen).sum = 3π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ β a β Multiset.map (fun f => f.M) F.reduce.toFluxesTen, 0 β€ a Multiset.filter_eq_self.mpr, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ (Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = 3π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ β a β Multiset.map (fun f => f.M) F.reduce.toFluxesTen, 0 β€ a π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ (Multiset.map (fun f => f.M) F.toFluxesTen).sum = 3π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ β a β Multiset.map (fun f => f.M) F.reduce.toFluxesTen, 0 β€ a hmap π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ (Multiset.map (fun f => f.M) F.toFluxesTen).sum = 3π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ β a β Multiset.map (fun f => f.M) F.reduce.toFluxesTen, 0 β€ a π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ (Multiset.map (fun f => f.M) F.toFluxesTen).sum = 3π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ β a β Multiset.map (fun f => f.M) F.reduce.toFluxesTen, 0 β€ a] π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ (Multiset.map (fun f => f.M) F.toFluxesTen).sum = 3π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ β a β Multiset.map (fun f => f.M) F.reduce.toFluxesTen, 0 β€ a
Β· π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sumβ’ (Multiset.map (fun f => f.M) F.toFluxesTen).sum = 3 exact numChiralQ_eq_sum.symm All goals completed! π
intro a ha π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).suma:β€ha:a β Multiset.map (fun f => f.M) F.reduce.toFluxesTenβ’ 0 β€ a
obtain β¨f, hf, rflβ© := Multiset.mem_map.mp ha π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sumf:Fluxeshf:f β F.reduce.toFluxesTenha:f.M β Multiset.map (fun f => f.M) F.reduce.toFluxesTenβ’ 0 β€ f.M
replace hf := mem_powerset_sum_of_mem_reduce_toFluxesTen hf π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralQ_eq_sum:3 = (Multiset.map (fun f => f.M) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M) F.toFluxesTen).sumf:Fluxesha:f.M β Multiset.map (fun f => f.M) F.reduce.toFluxesTenhf:f β Multiset.map (fun s => s.sum) (Multiset.powerset F.toFluxesTen)β’ 0 β€ f.M
clear ha hmap numChiralQ_eq_sum hE π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsf:Fluxeshf:f β Multiset.map (fun s => s.sum) (Multiset.powerset F.toFluxesTen)β’ 0 β€ f.M
generalize F.toFluxesTen = G at * π©:Typeinstβ:DecidableEq π©F:TenQuanta π©f:FluxesG:FluxesTenhx:G β FluxesTen.elemsNoExoticshf:f β Multiset.map (fun s => s.sum) (Multiset.powerset G)β’ 0 β€ f.M
revert f π©:Typeinstβ:DecidableEq π©F:TenQuanta π©G:FluxesTenhx:G β FluxesTen.elemsNoExoticsβ’ β f β Multiset.map (fun s => s.sum) (Multiset.powerset G), 0 β€ f.M
revert G π©:Typeinstβ:DecidableEq π©F:TenQuanta π©β’ β G β FluxesTen.elemsNoExotics, β f β Multiset.map (fun s => s.sum) (Multiset.powerset G), 0 β€ f.M
decide All goals completed! π
B.10.4. Number of anti-chiral Q
lemma reduce_numAntiChiralQ_of_mem_elemsNoExotics {F : TenQuanta π©}
(hx : F.toFluxesTen β FluxesTen.elemsNoExotics) :
F.reduce.toFluxesTen.numAntiChiralQ = 0 := by π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ F.reduce.toFluxesTen.numAntiChiralQ = 0
rw [FluxesTen.numAntiChiralQ, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ (Multiset.filter (fun x => x < 0) F.reduce.toFluxesTen.chiralIndicesOfQ).sum = 0 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ β a β Multiset.map (fun f => f.M) F.reduce.toFluxesTen, Β¬a < 0 FluxesTen.chiralIndicesOfQ, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ (Multiset.filter (fun x => x < 0) (Multiset.map (fun f => f.M) F.reduce.toFluxesTen)).sum = 0 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ β a β Multiset.map (fun f => f.M) F.reduce.toFluxesTen, Β¬a < 0 Multiset.filter_eq_nil.mpr, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ Multiset.sum 0 = 0π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ β a β Multiset.map (fun f => f.M) F.reduce.toFluxesTen, Β¬a < 0 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ β a β Multiset.map (fun f => f.M) F.reduce.toFluxesTen, Β¬a < 0
Multiset.sum_zero π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ 0 = 0π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ β a β Multiset.map (fun f => f.M) F.reduce.toFluxesTen, Β¬a < 0 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ β a β Multiset.map (fun f => f.M) F.reduce.toFluxesTen, Β¬a < 0] π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ β a β Multiset.map (fun f => f.M) F.reduce.toFluxesTen, Β¬a < 0
intro a ha π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsa:β€ha:a β Multiset.map (fun f => f.M) F.reduce.toFluxesTenβ’ Β¬a < 0
obtain β¨f, hf, rflβ© := Multiset.mem_map.mp ha π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsf:Fluxeshf:f β F.reduce.toFluxesTenha:f.M β Multiset.map (fun f => f.M) F.reduce.toFluxesTenβ’ Β¬f.M < 0
replace hf := mem_powerset_sum_of_mem_reduce_toFluxesTen hf π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsf:Fluxesha:f.M β Multiset.map (fun f => f.M) F.reduce.toFluxesTenhf:f β Multiset.map (fun s => s.sum) (Multiset.powerset F.toFluxesTen)β’ Β¬f.M < 0
clear ha π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsf:Fluxeshf:f β Multiset.map (fun s => s.sum) (Multiset.powerset F.toFluxesTen)β’ Β¬f.M < 0
generalize F.toFluxesTen = G at * π©:Typeinstβ:DecidableEq π©F:TenQuanta π©f:FluxesG:FluxesTenhx:G β FluxesTen.elemsNoExoticshf:f β Multiset.map (fun s => s.sum) (Multiset.powerset G)β’ Β¬f.M < 0
revert f π©:Typeinstβ:DecidableEq π©F:TenQuanta π©G:FluxesTenhx:G β FluxesTen.elemsNoExoticsβ’ β f β Multiset.map (fun s => s.sum) (Multiset.powerset G), Β¬f.M < 0
revert G π©:Typeinstβ:DecidableEq π©F:TenQuanta π©β’ β G β FluxesTen.elemsNoExotics, β f β Multiset.map (fun s => s.sum) (Multiset.powerset G), Β¬f.M < 0
decide All goals completed! π
B.10.5. Number of chiral E
lemma reduce_numChiralE_of_mem_elemsNoExotics {F : TenQuanta π©}
(hx : F.toFluxesTen β FluxesTen.elemsNoExotics) :
F.reduce.toFluxesTen.numChiralE = 3 := by π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ F.reduce.toFluxesTen.numChiralE = 3
have hE : F.toFluxesTen.NoExotics := ((FluxesTen.noExotics_iff_mem_elemsNoExotics _).mpr hx).1 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsβ’ F.reduce.toFluxesTen.numChiralE = 3
have numChiralE_eq_sum := F.toFluxesTen.numChiralE_eq_sum_sub_numAntiChiralE π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:F.toFluxesTen.numChiralE = F.toFluxesTen.chiralIndicesOfE.sum - F.toFluxesTen.numAntiChiralEβ’ F.reduce.toFluxesTen.numChiralE = 3
rw [hE.2.2.2.2.1, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = F.toFluxesTen.chiralIndicesOfE.sum - F.toFluxesTen.numAntiChiralEβ’ F.reduce.toFluxesTen.numChiralE = 3 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralE = 3 hE.2.2.2.2.2, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = F.toFluxesTen.chiralIndicesOfE.sum - 0β’ F.reduce.toFluxesTen.numChiralE = 3 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralE = 3 sub_zero, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = F.toFluxesTen.chiralIndicesOfE.sumβ’ F.reduce.toFluxesTen.numChiralE = 3 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralE = 3 FluxesTen.chiralIndicesOfE π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralE = 3 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralE = 3] at numChiralE_eq_sum π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralE = 3
have hmap : (F.reduce.toFluxesTen.map (fun f => f.M + f.N)).sum =
(F.toFluxesTen.map (fun f => f.M + f.N)).sum := by
have h := reduce_sum_eq_sum_toCharges F
(fun _ => (β¨β¨fun f => f.M + f.N, by π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumxβ:π©β’ Fluxes.M 0 + Fluxes.N 0 = 0 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumh:(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M + f.N, map_zero' := β―, map_add' := β― } x)
F.reduce).sum =
(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M + f.N, map_zero' := β―, map_add' := β― } x)
F).sumβ’ (Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sum π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralE = 3 simp All goals completed! π π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumh:(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M + f.N, map_zero' := β―, map_add' := β― } x)
F.reduce).sum =
(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M + f.N, map_zero' := β―, map_add' := β― } x)
F).sumβ’ (Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sum π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralE = 3β©, fun a b => by π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumxβ:π©a:Fluxesb:Fluxesβ’ { toFun := fun f => f.M + f.N, map_zero' := β― }.toFun (a + b) =
{ toFun := fun f => f.M + f.N, map_zero' := β― }.toFun a + { toFun := fun f => f.M + f.N, map_zero' := β― }.toFun b π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumh:(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M + f.N, map_zero' := β―, map_add' := β― } x)
F.reduce).sum =
(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M + f.N, map_zero' := β―, map_add' := β― } x)
F).sumβ’ (Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sum π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralE = 3 simp π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumxβ:π©a:Fluxesb:Fluxesβ’ a.M + b.M + (a.N + b.N) = a.M + a.N + (b.M + b.N) π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumh:(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M + f.N, map_zero' := β―, map_add' := β― } x)
F.reduce).sum =
(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M + f.N, map_zero' := β―, map_add' := β― } x)
F).sumβ’ (Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sum π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralE = 3; ring All goals completed! π π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumh:(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M + f.N, map_zero' := β―, map_add' := β― } x)
F.reduce).sum =
(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M + f.N, map_zero' := β―, map_add' := β― } x)
F).sumβ’ (Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sum π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralE = 3β© : Fluxes β+ β€)) π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumh:(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M + f.N, map_zero' := β―, map_add' := β― } x)
F.reduce).sum =
(Multiset.map
(fun x =>
match x with
| (q, x) => { toFun := fun f => f.M + f.N, map_zero' := β―, map_add' := β― } x)
F).sumβ’ (Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sum π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralE = 3
simpa [toFluxesTen, Multiset.map_map, Function.comp] using h π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralE = 3 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ F.reduce.toFluxesTen.numChiralE = 3
rw [FluxesTen.numChiralE, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ (Multiset.filter (fun x => 0 β€ x) F.reduce.toFluxesTen.chiralIndicesOfE).sum = 3 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sum = 3π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ β a β Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen, 0 β€ a FluxesTen.chiralIndicesOfE, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ (Multiset.filter (fun x => 0 β€ x) (Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen)).sum = 3 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sum = 3π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ β a β Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen, 0 β€ a Multiset.filter_eq_self.mpr, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ (Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = 3π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ β a β Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen, 0 β€ a π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sum = 3π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ β a β Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen, 0 β€ a hmap π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sum = 3π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ β a β Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen, 0 β€ a π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sum = 3π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ β a β Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen, 0 β€ a] π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sum = 3π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ β a β Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen, 0 β€ a
Β· π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumβ’ (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sum = 3 exact numChiralE_eq_sum.symm All goals completed! π
intro a ha π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).suma:β€ha:a β Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTenβ’ 0 β€ a
obtain β¨f, hf, rflβ© := Multiset.mem_map.mp ha π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumf:Fluxeshf:f β F.reduce.toFluxesTenha:f.M + f.N β Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTenβ’ 0 β€ f.M + f.N
replace hf := mem_powerset_sum_of_mem_reduce_toFluxesTen hf π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticshE:F.toFluxesTen.NoExoticsnumChiralE_eq_sum:3 = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumhmap:(Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen).sum = (Multiset.map (fun f => f.M + f.N) F.toFluxesTen).sumf:Fluxesha:f.M + f.N β Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTenhf:f β Multiset.map (fun s => s.sum) (Multiset.powerset F.toFluxesTen)β’ 0 β€ f.M + f.N
clear ha hmap numChiralE_eq_sum hE π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsf:Fluxeshf:f β Multiset.map (fun s => s.sum) (Multiset.powerset F.toFluxesTen)β’ 0 β€ f.M + f.N
generalize F.toFluxesTen = G at * π©:Typeinstβ:DecidableEq π©F:TenQuanta π©f:FluxesG:FluxesTenhx:G β FluxesTen.elemsNoExoticshf:f β Multiset.map (fun s => s.sum) (Multiset.powerset G)β’ 0 β€ f.M + f.N
revert f π©:Typeinstβ:DecidableEq π©F:TenQuanta π©G:FluxesTenhx:G β FluxesTen.elemsNoExoticsβ’ β f β Multiset.map (fun s => s.sum) (Multiset.powerset G), 0 β€ f.M + f.N
revert G π©:Typeinstβ:DecidableEq π©F:TenQuanta π©β’ β G β FluxesTen.elemsNoExotics, β f β Multiset.map (fun s => s.sum) (Multiset.powerset G), 0 β€ f.M + f.N
decide All goals completed! π
B.10.6. Number of anti-chiral E
lemma reduce_numAntiChiralE_of_mem_elemsNoExotics {F : TenQuanta π©}
(hx : F.toFluxesTen β FluxesTen.elemsNoExotics) :
F.reduce.toFluxesTen.numAntiChiralE = 0 := by π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ F.reduce.toFluxesTen.numAntiChiralE = 0
rw [FluxesTen.numAntiChiralE, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ (Multiset.filter (fun x => x < 0) F.reduce.toFluxesTen.chiralIndicesOfE).sum = 0 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ β a β Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen, Β¬a < 0 FluxesTen.chiralIndicesOfE, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ (Multiset.filter (fun x => x < 0) (Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen)).sum = 0 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ β a β Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen, Β¬a < 0 Multiset.filter_eq_nil.mpr, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ Multiset.sum 0 = 0π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ β a β Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen, Β¬a < 0 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ β a β Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen, Β¬a < 0
Multiset.sum_zero π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ 0 = 0π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ β a β Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen, Β¬a < 0 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ β a β Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen, Β¬a < 0] π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ β a β Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTen, Β¬a < 0
intro a ha π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsa:β€ha:a β Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTenβ’ Β¬a < 0
obtain β¨f, hf, rflβ© := Multiset.mem_map.mp ha π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsf:Fluxeshf:f β F.reduce.toFluxesTenha:f.M + f.N β Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTenβ’ Β¬f.M + f.N < 0
replace hf := mem_powerset_sum_of_mem_reduce_toFluxesTen hf π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsf:Fluxesha:f.M + f.N β Multiset.map (fun f => f.M + f.N) F.reduce.toFluxesTenhf:f β Multiset.map (fun s => s.sum) (Multiset.powerset F.toFluxesTen)β’ Β¬f.M + f.N < 0
clear ha π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsf:Fluxeshf:f β Multiset.map (fun s => s.sum) (Multiset.powerset F.toFluxesTen)β’ Β¬f.M + f.N < 0
generalize F.toFluxesTen = G at * π©:Typeinstβ:DecidableEq π©F:TenQuanta π©f:FluxesG:FluxesTenhx:G β FluxesTen.elemsNoExoticshf:f β Multiset.map (fun s => s.sum) (Multiset.powerset G)β’ Β¬f.M + f.N < 0
revert f π©:Typeinstβ:DecidableEq π©F:TenQuanta π©G:FluxesTenhx:G β FluxesTen.elemsNoExoticsβ’ β f β Multiset.map (fun s => s.sum) (Multiset.powerset G), Β¬f.M + f.N < 0
revert G π©:Typeinstβ:DecidableEq π©F:TenQuanta π©β’ β G β FluxesTen.elemsNoExotics, β f β Multiset.map (fun s => s.sum) (Multiset.powerset G), Β¬f.M + f.N < 0
decide All goals completed! π
B.10.7. The NoExotics condition on the reduced TenQuanta
lemma reduce_noExotics_of_mem_elemsNoExotics {F : TenQuanta π©}
(hx : F.toFluxesTen β FluxesTen.elemsNoExotics) :
F.reduce.toFluxesTen.NoExotics := by π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ F.reduce.toFluxesTen.NoExotics
rw [FluxesTen.NoExotics, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ F.reduce.toFluxesTen.numChiralQ = 3 β§
F.reduce.toFluxesTen.numAntiChiralQ = 0 β§
F.reduce.toFluxesTen.numChiralU = 3 β§
F.reduce.toFluxesTen.numAntiChiralU = 0 β§
F.reduce.toFluxesTen.numChiralE = 3 β§ F.reduce.toFluxesTen.numAntiChiralE = 0 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ 3 = 3 β§ 0 = 0 β§ 3 = 3 β§ 0 = 0 β§ 3 = 3 β§ 0 = 0 reduce_numChiralU_of_mem_elemsNoExotics hx, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ F.reduce.toFluxesTen.numChiralQ = 3 β§
F.reduce.toFluxesTen.numAntiChiralQ = 0 β§
3 = 3 β§
F.reduce.toFluxesTen.numAntiChiralU = 0 β§
F.reduce.toFluxesTen.numChiralE = 3 β§ F.reduce.toFluxesTen.numAntiChiralE = 0 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ 3 = 3 β§ 0 = 0 β§ 3 = 3 β§ 0 = 0 β§ 3 = 3 β§ 0 = 0
reduce_numAntiChiralU_of_mem_elemsNoExotics hx, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ F.reduce.toFluxesTen.numChiralQ = 3 β§
F.reduce.toFluxesTen.numAntiChiralQ = 0 β§
3 = 3 β§ 0 = 0 β§ F.reduce.toFluxesTen.numChiralE = 3 β§ F.reduce.toFluxesTen.numAntiChiralE = 0 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ 3 = 3 β§ 0 = 0 β§ 3 = 3 β§ 0 = 0 β§ 3 = 3 β§ 0 = 0 reduce_numChiralQ_of_mem_elemsNoExotics hx, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ 3 = 3 β§
F.reduce.toFluxesTen.numAntiChiralQ = 0 β§
3 = 3 β§ 0 = 0 β§ F.reduce.toFluxesTen.numChiralE = 3 β§ F.reduce.toFluxesTen.numAntiChiralE = 0 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ 3 = 3 β§ 0 = 0 β§ 3 = 3 β§ 0 = 0 β§ 3 = 3 β§ 0 = 0
reduce_numAntiChiralQ_of_mem_elemsNoExotics hx, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ 3 = 3 β§ 0 = 0 β§ 3 = 3 β§ 0 = 0 β§ F.reduce.toFluxesTen.numChiralE = 3 β§ F.reduce.toFluxesTen.numAntiChiralE = 0 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ 3 = 3 β§ 0 = 0 β§ 3 = 3 β§ 0 = 0 β§ 3 = 3 β§ 0 = 0 reduce_numChiralE_of_mem_elemsNoExotics hx, π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ 3 = 3 β§ 0 = 0 β§ 3 = 3 β§ 0 = 0 β§ 3 = 3 β§ F.reduce.toFluxesTen.numAntiChiralE = 0 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ 3 = 3 β§ 0 = 0 β§ 3 = 3 β§ 0 = 0 β§ 3 = 3 β§ 0 = 0
reduce_numAntiChiralE_of_mem_elemsNoExotics hx π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ 3 = 3 β§ 0 = 0 β§ 3 = 3 β§ 0 = 0 β§ 3 = 3 β§ 0 = 0 π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ 3 = 3 β§ 0 = 0 β§ 3 = 3 β§ 0 = 0 β§ 3 = 3 β§ 0 = 0] π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ 3 = 3 β§ 0 = 0 β§ 3 = 3 β§ 0 = 0 β§ 3 = 3 β§ 0 = 0
simp All goals completed! π
B.11. Reduce member of FLuxesTen.elemsNoExotics
lemma reduce_mem_elemsNoExotics {F : TenQuanta π©}
(hx : F.toFluxesTen β FluxesTen.elemsNoExotics) :
F.reduce.toFluxesTen β FluxesTen.elemsNoExotics := by π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ F.reduce.toFluxesTen β FluxesTen.elemsNoExotics
rw [β FluxesTen.noExotics_iff_mem_elemsNoExotics π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ F.reduce.toFluxesTen.NoExotics β§ F.reduce.toFluxesTen.HasNoZero π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ F.reduce.toFluxesTen.NoExotics β§ F.reduce.toFluxesTen.HasNoZero] π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ F.reduce.toFluxesTen.NoExotics β§ F.reduce.toFluxesTen.HasNoZero
refine β¨reduce_noExotics_of_mem_elemsNoExotics hx, ?_β© π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsβ’ F.reduce.toFluxesTen.HasNoZero
intro h π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsh:0 β F.reduce.toFluxesTenβ’ False
replace h := mem_powerset_sum_of_mem_reduce_toFluxesTen_filter h π©:Typeinstβ:DecidableEq π©F:TenQuanta π©hx:F.toFluxesTen β FluxesTen.elemsNoExoticsh:0 β Multiset.map (fun s => s.sum) (Multiset.filter (fun s => s β 0) (Multiset.powerset F.toFluxesTen))β’ False
generalize F.toFluxesTen = G at * π©:Typeinstβ:DecidableEq π©F:TenQuanta π©G:FluxesTenhx:G β FluxesTen.elemsNoExoticsh:0 β Multiset.map (fun s => s.sum) (Multiset.filter (fun s => s β 0) (Multiset.powerset G))β’ False
revert G π©:Typeinstβ:DecidableEq π©F:TenQuanta π©β’ β G β FluxesTen.elemsNoExotics,
0 β Multiset.map (fun s => s.sum) (Multiset.filter (fun s => s β 0) (Multiset.powerset G)) β False
decide All goals completed! π
C. Decomposition of a TenQuanta into basic fluxes
C.1. Decomposition of fluxes
The decomposition of a relevant flux into β¨1, 0β©, β¨1, 1β© and β¨1, -1β© .
def decomposeFluxes (f : Fluxes) : Multiset Fluxes :=
if f = β¨1, 0β© then {β¨1, 0β©}
else if f = β¨1, 1β© then {β¨1, 1β©}
else if f = β¨1, -1β© then {β¨1, -1β©}
else if f = β¨2, 1β© then {β¨1, 1β©, β¨1, 0β©}
else if f = β¨2, -1β© then {β¨1, -1β©, β¨1, 0β©}
else if f = β¨3, 0β© then {β¨1, 0β©, β¨1, 0β©, β¨1, 0β©}
else if f = β¨2, 0β© then {β¨1, 0β©, β¨1, 0β©}
else {f}lemma decomposeFluxes_sum_of_noExotics (f : Fluxes) (hf : β F β FluxesTen.elemsNoExotics, f β F) :
(decomposeFluxes f).sum = f := by f:Fluxeshf:β F β FluxesTen.elemsNoExotics, f β Fβ’ (decomposeFluxes f).sum = f
obtain β¨F, hF, hfFβ© := hf f:FluxesF:FluxesTenhF:F β FluxesTen.elemsNoExoticshfF:f β Fβ’ (decomposeFluxes f).sum = f
revert f F:FluxesTenhF:F β FluxesTen.elemsNoExoticsβ’ β f β F, (decomposeFluxes f).sum = f
revert F β’ β F β FluxesTen.elemsNoExotics, β f β F, (decomposeFluxes f).sum = f
decide All goals completed! π
C.2. Decomposition of a TenQuanta (with no exotics)
The decomposition of a TenQuanta into a TenQuanta which has the
same reduce by has fluxes {β¨1, 0β©, β¨1, 0β©, β¨1, 0β©} or {β¨1, 1β©, β¨1, -1β©, β¨1, 0β©} only.
This only works for fluxes which have no exotics or zeros.
def decompose (x : TenQuanta π©) : TenQuanta π© :=
x.bind fun p => (decomposeFluxes p.2).map fun f => (p.1, f)C.2.1. Decomposition distributes over addition
lemma decompose_add (x y : TenQuanta π©) :
(x + y).decompose = x.decompose + y.decompose := by π©:Typex:TenQuanta π©y:TenQuanta π©β’ (x + y).decompose = x.decompose + y.decompose
simp [decompose] All goals completed! πC.2.2. Decomposition commutes with filtering charges
lemma decompose_filter_charge [DecidableEq π©] (x : TenQuanta π©) (q : π©) :
(x.decompose).filter (fun p => p.1 = q) =
decompose (x.filter (fun p => p.1 = q)) := by π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©β’ Multiset.filter (fun p => p.1 = q) x.decompose = decompose (Multiset.filter (fun p => p.1 = q) x)
rw [decompose π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©β’ Multiset.filter (fun p => p.1 = q) (Multiset.bind x fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (Multiset.filter (fun p => p.1 = q) x) π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©β’ Multiset.filter (fun p => p.1 = q) (Multiset.bind x fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (Multiset.filter (fun p => p.1 = q) x)] π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©β’ Multiset.filter (fun p => p.1 = q) (Multiset.bind x fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (Multiset.filter (fun p => p.1 = q) x)
revert x π©:Typeinstβ:DecidableEq π©q:π©β’ β (x : TenQuanta π©),
Multiset.filter (fun p => p.1 = q) (Multiset.bind x fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (Multiset.filter (fun p => p.1 = q) x)
apply Multiset.induction empty π©:Typeinstβ:DecidableEq π©q:π©β’ Multiset.filter (fun p => p.1 = q) (Multiset.bind 0 fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (Multiset.filter (fun p => p.1 = q) 0)cons π©:Typeinstβ:DecidableEq π©q:π©β’ β (a : π© Γ Fluxes) (s : Multiset (π© Γ Fluxes)),
Multiset.filter (fun p => p.1 = q) (s.bind fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (Multiset.filter (fun p => p.1 = q) s) β
Multiset.filter (fun p => p.1 = q)
((a ::β s).bind fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (Multiset.filter (fun p => p.1 = q) (a ::β s))
Β· empty π©:Typeinstβ:DecidableEq π©q:π©β’ Multiset.filter (fun p => p.1 = q) (Multiset.bind 0 fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (Multiset.filter (fun p => p.1 = q) 0) simp [decompose] All goals completed! π
Β· cons π©:Typeinstβ:DecidableEq π©q:π©β’ β (a : π© Γ Fluxes) (s : Multiset (π© Γ Fluxes)),
Multiset.filter (fun p => p.1 = q) (s.bind fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (Multiset.filter (fun p => p.1 = q) s) β
Multiset.filter (fun p => p.1 = q)
((a ::β s).bind fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (Multiset.filter (fun p => p.1 = q) (a ::β s)) intro a x ih cons π©:Typeinstβ:DecidableEq π©q:π©a:π© Γ Fluxesx:Multiset (π© Γ Fluxes)ih:Multiset.filter (fun p => p.1 = q) (x.bind fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (Multiset.filter (fun p => p.1 = q) x)β’ Multiset.filter (fun p => p.1 = q) ((a ::β x).bind fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (Multiset.filter (fun p => p.1 = q) (a ::β x))
simp only [Multiset.cons_bind, Multiset.filter_add] cons π©:Typeinstβ:DecidableEq π©q:π©a:π© Γ Fluxesx:Multiset (π© Γ Fluxes)ih:Multiset.filter (fun p => p.1 = q) (x.bind fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (Multiset.filter (fun p => p.1 = q) x)β’ Multiset.filter (fun p => p.1 = q) (Multiset.map (fun f => (a.1, f)) (decomposeFluxes a.2)) +
Multiset.filter (fun p => p.1 = q) (x.bind fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (Multiset.filter (fun p => p.1 = q) (a ::β x))
rw [Multiset.filter_cons, cons π©:Typeinstβ:DecidableEq π©q:π©a:π© Γ Fluxesx:Multiset (π© Γ Fluxes)ih:Multiset.filter (fun p => p.1 = q) (x.bind fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (Multiset.filter (fun p => p.1 = q) x)β’ Multiset.filter (fun p => p.1 = q) (Multiset.map (fun f => (a.1, f)) (decomposeFluxes a.2)) +
Multiset.filter (fun p => p.1 = q) (x.bind fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose ((if a.1 = q then {a} else 0) + Multiset.filter (fun p => p.1 = q) x) cons π©:Typeinstβ:DecidableEq π©q:π©a:π© Γ Fluxesx:Multiset (π© Γ Fluxes)ih:Multiset.filter (fun p => p.1 = q) (x.bind fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (Multiset.filter (fun p => p.1 = q) x)β’ Multiset.filter (fun p => p.1 = q) (Multiset.map (fun f => (a.1, f)) (decomposeFluxes a.2)) +
decompose (Multiset.filter (fun p => p.1 = q) x) =
decompose (if a.1 = q then {a} else 0) + decompose (Multiset.filter (fun p => p.1 = q) x) decompose_add, cons π©:Typeinstβ:DecidableEq π©q:π©a:π© Γ Fluxesx:Multiset (π© Γ Fluxes)ih:Multiset.filter (fun p => p.1 = q) (x.bind fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (Multiset.filter (fun p => p.1 = q) x)β’ Multiset.filter (fun p => p.1 = q) (Multiset.map (fun f => (a.1, f)) (decomposeFluxes a.2)) +
Multiset.filter (fun p => p.1 = q) (x.bind fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (if a.1 = q then {a} else 0) + decompose (Multiset.filter (fun p => p.1 = q) x)cons π©:Typeinstβ:DecidableEq π©q:π©a:π© Γ Fluxesx:Multiset (π© Γ Fluxes)ih:Multiset.filter (fun p => p.1 = q) (x.bind fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (Multiset.filter (fun p => p.1 = q) x)β’ Multiset.filter (fun p => p.1 = q) (Multiset.map (fun f => (a.1, f)) (decomposeFluxes a.2)) +
decompose (Multiset.filter (fun p => p.1 = q) x) =
decompose (if a.1 = q then {a} else 0) + decompose (Multiset.filter (fun p => p.1 = q) x) ih cons π©:Typeinstβ:DecidableEq π©q:π©a:π© Γ Fluxesx:Multiset (π© Γ Fluxes)ih:Multiset.filter (fun p => p.1 = q) (x.bind fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (Multiset.filter (fun p => p.1 = q) x)β’ Multiset.filter (fun p => p.1 = q) (Multiset.map (fun f => (a.1, f)) (decomposeFluxes a.2)) +
decompose (Multiset.filter (fun p => p.1 = q) x) =
decompose (if a.1 = q then {a} else 0) + decompose (Multiset.filter (fun p => p.1 = q) x)cons π©:Typeinstβ:DecidableEq π©q:π©a:π© Γ Fluxesx:Multiset (π© Γ Fluxes)ih:Multiset.filter (fun p => p.1 = q) (x.bind fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (Multiset.filter (fun p => p.1 = q) x)β’ Multiset.filter (fun p => p.1 = q) (Multiset.map (fun f => (a.1, f)) (decomposeFluxes a.2)) +
decompose (Multiset.filter (fun p => p.1 = q) x) =
decompose (if a.1 = q then {a} else 0) + decompose (Multiset.filter (fun p => p.1 = q) x)]cons π©:Typeinstβ:DecidableEq π©q:π©a:π© Γ Fluxesx:Multiset (π© Γ Fluxes)ih:Multiset.filter (fun p => p.1 = q) (x.bind fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (Multiset.filter (fun p => p.1 = q) x)β’ Multiset.filter (fun p => p.1 = q) (Multiset.map (fun f => (a.1, f)) (decomposeFluxes a.2)) +
decompose (Multiset.filter (fun p => p.1 = q) x) =
decompose (if a.1 = q then {a} else 0) + decompose (Multiset.filter (fun p => p.1 = q) x)
congr cons.e_a π©:Typeinstβ:DecidableEq π©q:π©a:π© Γ Fluxesx:Multiset (π© Γ Fluxes)ih:Multiset.filter (fun p => p.1 = q) (x.bind fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (Multiset.filter (fun p => p.1 = q) x)β’ Multiset.filter (fun p => p.1 = q) (Multiset.map (fun f => (a.1, f)) (decomposeFluxes a.2)) =
decompose (if a.1 = q then {a} else 0)
obtain β¨q', fβ© := a cons.e_a π©:Typeinstβ:DecidableEq π©q:π©x:Multiset (π© Γ Fluxes)ih:Multiset.filter (fun p => p.1 = q) (x.bind fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (Multiset.filter (fun p => p.1 = q) x)q':π©f:Fluxesβ’ Multiset.filter (fun p => p.1 = q) (Multiset.map (fun f_1 => ((q', f).1, f_1)) (decomposeFluxes (q', f).2)) =
decompose (if (q', f).1 = q then {(q', f)} else 0)
simp [decomposeFluxes] cons.e_a π©:Typeinstβ:DecidableEq π©q:π©x:Multiset (π© Γ Fluxes)ih:Multiset.filter (fun p => p.1 = q) (x.bind fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (Multiset.filter (fun p => p.1 = q) x)q':π©f:Fluxesβ’ Multiset.filter (fun p => p.1 = q)
(Multiset.map (fun x => (q', x))
(if f = { M := 1, N := 0 } then {{ M := 1, N := 0 }}
else
if f = { M := 1, N := 1 } then {{ M := 1, N := 1 }}
else
if f = { M := 1, N := -1 } then {{ M := 1, N := -1 }}
else
if f = { M := 2, N := 1 } then { M := 1, N := 1 } ::β {{ M := 1, N := 0 }}
else
if f = { M := 2, N := -1 } then { M := 1, N := -1 } ::β {{ M := 1, N := 0 }}
else
if f = { M := 3, N := 0 } then { M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }}
else if f = { M := 2, N := 0 } then { M := 1, N := 0 } ::β {{ M := 1, N := 0 }} else {f})) =
decompose (if q' = q then {(q', f)} else 0)
by_cases h : q' = q pos π©:Typeinstβ:DecidableEq π©q:π©x:Multiset (π© Γ Fluxes)ih:Multiset.filter (fun p => p.1 = q) (x.bind fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (Multiset.filter (fun p => p.1 = q) x)q':π©f:Fluxesh:q' = qβ’ Multiset.filter (fun p => p.1 = q)
(Multiset.map (fun x => (q', x))
(if f = { M := 1, N := 0 } then {{ M := 1, N := 0 }}
else
if f = { M := 1, N := 1 } then {{ M := 1, N := 1 }}
else
if f = { M := 1, N := -1 } then {{ M := 1, N := -1 }}
else
if f = { M := 2, N := 1 } then { M := 1, N := 1 } ::β {{ M := 1, N := 0 }}
else
if f = { M := 2, N := -1 } then { M := 1, N := -1 } ::β {{ M := 1, N := 0 }}
else
if f = { M := 3, N := 0 } then { M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }}
else if f = { M := 2, N := 0 } then { M := 1, N := 0 } ::β {{ M := 1, N := 0 }} else {f})) =
decompose (if q' = q then {(q', f)} else 0)neg π©:Typeinstβ:DecidableEq π©q:π©x:Multiset (π© Γ Fluxes)ih:Multiset.filter (fun p => p.1 = q) (x.bind fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (Multiset.filter (fun p => p.1 = q) x)q':π©f:Fluxesh:Β¬q' = qβ’ Multiset.filter (fun p => p.1 = q)
(Multiset.map (fun x => (q', x))
(if f = { M := 1, N := 0 } then {{ M := 1, N := 0 }}
else
if f = { M := 1, N := 1 } then {{ M := 1, N := 1 }}
else
if f = { M := 1, N := -1 } then {{ M := 1, N := -1 }}
else
if f = { M := 2, N := 1 } then { M := 1, N := 1 } ::β {{ M := 1, N := 0 }}
else
if f = { M := 2, N := -1 } then { M := 1, N := -1 } ::β {{ M := 1, N := 0 }}
else
if f = { M := 3, N := 0 } then { M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }}
else if f = { M := 2, N := 0 } then { M := 1, N := 0 } ::β {{ M := 1, N := 0 }} else {f})) =
decompose (if q' = q then {(q', f)} else 0)
Β· pos π©:Typeinstβ:DecidableEq π©q:π©x:Multiset (π© Γ Fluxes)ih:Multiset.filter (fun p => p.1 = q) (x.bind fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (Multiset.filter (fun p => p.1 = q) x)q':π©f:Fluxesh:q' = qβ’ Multiset.filter (fun p => p.1 = q)
(Multiset.map (fun x => (q', x))
(if f = { M := 1, N := 0 } then {{ M := 1, N := 0 }}
else
if f = { M := 1, N := 1 } then {{ M := 1, N := 1 }}
else
if f = { M := 1, N := -1 } then {{ M := 1, N := -1 }}
else
if f = { M := 2, N := 1 } then { M := 1, N := 1 } ::β {{ M := 1, N := 0 }}
else
if f = { M := 2, N := -1 } then { M := 1, N := -1 } ::β {{ M := 1, N := 0 }}
else
if f = { M := 3, N := 0 } then { M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }}
else if f = { M := 2, N := 0 } then { M := 1, N := 0 } ::β {{ M := 1, N := 0 }} else {f})) =
decompose (if q' = q then {(q', f)} else 0) subst h pos π©:Typeinstβ:DecidableEq π©x:Multiset (π© Γ Fluxes)q':π©f:Fluxesih:Multiset.filter (fun p => p.1 = q') (x.bind fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (Multiset.filter (fun p => p.1 = q') x)β’ Multiset.filter (fun p => p.1 = q')
(Multiset.map (fun x => (q', x))
(if f = { M := 1, N := 0 } then {{ M := 1, N := 0 }}
else
if f = { M := 1, N := 1 } then {{ M := 1, N := 1 }}
else
if f = { M := 1, N := -1 } then {{ M := 1, N := -1 }}
else
if f = { M := 2, N := 1 } then { M := 1, N := 1 } ::β {{ M := 1, N := 0 }}
else
if f = { M := 2, N := -1 } then { M := 1, N := -1 } ::β {{ M := 1, N := 0 }}
else
if f = { M := 3, N := 0 } then { M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }}
else if f = { M := 2, N := 0 } then { M := 1, N := 0 } ::β {{ M := 1, N := 0 }} else {f})) =
decompose (if q' = q' then {(q', f)} else 0)
simp [decompose, decomposeFluxes] All goals completed! π
Β· neg π©:Typeinstβ:DecidableEq π©q:π©x:Multiset (π© Γ Fluxes)ih:Multiset.filter (fun p => p.1 = q) (x.bind fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
decompose (Multiset.filter (fun p => p.1 = q) x)q':π©f:Fluxesh:Β¬q' = qβ’ Multiset.filter (fun p => p.1 = q)
(Multiset.map (fun x => (q', x))
(if f = { M := 1, N := 0 } then {{ M := 1, N := 0 }}
else
if f = { M := 1, N := 1 } then {{ M := 1, N := 1 }}
else
if f = { M := 1, N := -1 } then {{ M := 1, N := -1 }}
else
if f = { M := 2, N := 1 } then { M := 1, N := 1 } ::β {{ M := 1, N := 0 }}
else
if f = { M := 2, N := -1 } then { M := 1, N := -1 } ::β {{ M := 1, N := 0 }}
else
if f = { M := 3, N := 0 } then { M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }}
else if f = { M := 2, N := 0 } then { M := 1, N := 0 } ::β {{ M := 1, N := 0 }} else {f})) =
decompose (if q' = q then {(q', f)} else 0) simp [h, decompose] All goals completed! πC.2.3. Decomposition preserves the charge map
lemma decompose_toChargeMap [DecidableEq π©] (x : TenQuanta π©)
(hx : x.toFluxesTen β FluxesTen.elemsNoExotics) :
x.decompose.toChargeMap = x.toChargeMap := by π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ x.decompose.toChargeMap = x.toChargeMap
ext q π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©β’ x.decompose.toChargeMap q = x.toChargeMap q
rw [toChargeMap, π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©β’ (Multiset.map Prod.snd (Multiset.filter (fun p => p.1 = q) x.decompose)).sum = x.toChargeMap q π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©β’ (Multiset.map Prod.snd (decompose (Multiset.filter (fun p => p.1 = q) x))).sum = x.toChargeMap q decompose_filter_charge π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©β’ (Multiset.map Prod.snd (decompose (Multiset.filter (fun p => p.1 = q) x))).sum = x.toChargeMap q π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©β’ (Multiset.map Prod.snd (decompose (Multiset.filter (fun p => p.1 = q) x))).sum = x.toChargeMap q] π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©β’ (Multiset.map Prod.snd (decompose (Multiset.filter (fun p => p.1 = q) x))).sum = x.toChargeMap q
simp [decompose] π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©β’ (Multiset.map Prod.snd
((Multiset.filter (fun p => p.1 = q) x).bind fun p =>
Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2))).sum =
x.toChargeMap q
rw [Multiset.map_bind π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©β’ ((Multiset.filter (fun p => p.1 = q) x).bind fun a =>
Multiset.map Prod.snd (Multiset.map (fun f => (a.1, f)) (decomposeFluxes a.2))).sum =
x.toChargeMap q π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©β’ ((Multiset.filter (fun p => p.1 = q) x).bind fun a =>
Multiset.map Prod.snd (Multiset.map (fun f => (a.1, f)) (decomposeFluxes a.2))).sum =
x.toChargeMap q] π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©β’ ((Multiset.filter (fun p => p.1 = q) x).bind fun a =>
Multiset.map Prod.snd (Multiset.map (fun f => (a.1, f)) (decomposeFluxes a.2))).sum =
x.toChargeMap q
simp only [Multiset.map_map, Function.comp_apply, Multiset.map_id', Multiset.sum_bind] π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©β’ (Multiset.map (fun a => (decomposeFluxes a.2).sum) (Multiset.filter (fun p => p.1 = q) x)).sum = x.toChargeMap q
rw [toChargeMap π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©β’ (Multiset.map (fun a => (decomposeFluxes a.2).sum) (Multiset.filter (fun p => p.1 = q) x)).sum =
(Multiset.map Prod.snd (Multiset.filter (fun p => p.1 = q) x)).sum π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©β’ (Multiset.map (fun a => (decomposeFluxes a.2).sum) (Multiset.filter (fun p => p.1 = q) x)).sum =
(Multiset.map Prod.snd (Multiset.filter (fun p => p.1 = q) x)).sum] π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©β’ (Multiset.map (fun a => (decomposeFluxes a.2).sum) (Multiset.filter (fun p => p.1 = q) x)).sum =
(Multiset.map Prod.snd (Multiset.filter (fun p => p.1 = q) x)).sum
congr 1 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©β’ Multiset.map (fun a => (decomposeFluxes a.2).sum) (Multiset.filter (fun p => p.1 = q) x) =
Multiset.map Prod.snd (Multiset.filter (fun p => p.1 = q) x)
refine Multiset.map_congr rfl fun a ha => ?_ π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©a:π© Γ Fluxesha:a β Multiset.filter (fun p => p.1 = q) xβ’ (decomposeFluxes a.2).sum = a.2
apply decomposeFluxes_sum_of_noExotics π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©a:π© Γ Fluxesha:a β Multiset.filter (fun p => p.1 = q) xβ’ β F β FluxesTen.elemsNoExotics, a.2 β F
use x.toFluxesTen h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©a:π© Γ Fluxesha:a β Multiset.filter (fun p => p.1 = q) xβ’ x.toFluxesTen β FluxesTen.elemsNoExotics β§ a.2 β x.toFluxesTen
simp_all [toFluxesTen] h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©a:π© Γ Fluxeshx:Multiset.map Prod.snd x β FluxesTen.elemsNoExoticsha:a β x β§ a.1 = qβ’ β a_1, (a_1, a.2) β x
use a.1 h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©a:π© Γ Fluxeshx:Multiset.map Prod.snd x β FluxesTen.elemsNoExoticsha:a β x β§ a.1 = qβ’ (a.1, a.2) β x
exact ha.1 All goals completed! πC.2.4. Decomposition preserves the charges
lemma decompose_toCharges_dedup [DecidableEq π©] (x : TenQuanta π©)
(hx : x.toFluxesTen β FluxesTen.elemsNoExotics) :
x.decompose.toCharges.dedup = x.toCharges.dedup := by π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ x.decompose.toCharges.dedup = x.toCharges.dedup
refine Multiset.dedup_ext.mpr ?_ π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ β (a : π©), a β x.decompose.toCharges β a β x.toCharges
intro q π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©β’ q β x.decompose.toCharges β q β x.toCharges
simp [decompose, toCharges, -existsAndEq] π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©β’ (β x_1 a b, (a, b) β x β§ x_1 β decomposeFluxes b β§ a = q) β β x_1, (q, x_1) β x
constructor mp π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©β’ (β x_1 a b, (a, b) β x β§ x_1 β decomposeFluxes b β§ a = q) β β x_1, (q, x_1) β xmpr π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©β’ (β x_1, (q, x_1) β x) β β x_1 a b, (a, b) β x β§ x_1 β decomposeFluxes b β§ a = q
Β· mp π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©β’ (β x_1 a b, (a, b) β x β§ x_1 β decomposeFluxes b β§ a = q) β β x_1, (q, x_1) β x rintro β¨a, b, c, h1, h2, rflβ© mp π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsa:Fluxesb:π©c:Fluxesh1:(b, c) β xh2:a β decomposeFluxes cβ’ β x_1, (b, x_1) β x
exact β¨c, h1β© All goals completed! π
Β· mpr π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©β’ (β x_1, (q, x_1) β x) β β x_1 a b, (a, b) β x β§ x_1 β decomposeFluxes b β§ a = q rintro β¨c, h1β© mpr π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©c:Fluxesh1:(q, c) β xβ’ β x_1 a b, (a, b) β x β§ x_1 β decomposeFluxes b β§ a = q
have hn : (decomposeFluxes c) β 0 := by π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ x.decompose.toCharges.dedup = x.toCharges.dedup mpr π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©c:Fluxesh1:(q, c) β xhn:decomposeFluxes c β 0β’ β x_1 a b, (a, b) β x β§ x_1 β decomposeFluxes b β§ a = q
have c_mem_f : c β x.toFluxesTen := by π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ x.decompose.toCharges.dedup = x.toCharges.dedup π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©c:Fluxesh1:(q, c) β xc_mem_f:c β x.toFluxesTenβ’ decomposeFluxes c β 0 mpr π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©c:Fluxesh1:(q, c) β xhn:decomposeFluxes c β 0β’ β x_1 a b, (a, b) β x β§ x_1 β decomposeFluxes b β§ a = q
simp [toFluxesTen] π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©c:Fluxesh1:(q, c) β xβ’ β a, (a, c) β x π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©c:Fluxesh1:(q, c) β xc_mem_f:c β x.toFluxesTenβ’ decomposeFluxes c β 0mpr π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©c:Fluxesh1:(q, c) β xhn:decomposeFluxes c β 0β’ β x_1 a b, (a, b) β x β§ x_1 β decomposeFluxes b β§ a = q
use q π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©c:Fluxesh1:(q, c) β xc_mem_f:c β x.toFluxesTenβ’ decomposeFluxes c β 0mpr π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©c:Fluxesh1:(q, c) β xhn:decomposeFluxes c β 0β’ β x_1 a b, (a, b) β x β§ x_1 β decomposeFluxes b β§ a = q π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©c:Fluxesh1:(q, c) β xc_mem_f:c β x.toFluxesTenβ’ decomposeFluxes c β 0mpr π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©c:Fluxesh1:(q, c) β xhn:decomposeFluxes c β 0β’ β x_1 a b, (a, b) β x β§ x_1 β decomposeFluxes b β§ a = q
generalize x.toFluxesTen = F at * π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©c:Fluxesh1:(q, c) β xF:FluxesTenhx:F β FluxesTen.elemsNoExoticsc_mem_f:c β Fβ’ decomposeFluxes c β 0mpr π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©c:Fluxesh1:(q, c) β xhn:decomposeFluxes c β 0β’ β x_1 a b, (a, b) β x β§ x_1 β decomposeFluxes b β§ a = q
clear h1 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©c:FluxesF:FluxesTenhx:F β FluxesTen.elemsNoExoticsc_mem_f:c β Fβ’ decomposeFluxes c β 0mpr π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©c:Fluxesh1:(q, c) β xhn:decomposeFluxes c β 0β’ β x_1 a b, (a, b) β x β§ x_1 β decomposeFluxes b β§ a = q
revert c π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©F:FluxesTenhx:F β FluxesTen.elemsNoExoticsβ’ β c β F, decomposeFluxes c β 0mpr π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©c:Fluxesh1:(q, c) β xhn:decomposeFluxes c β 0β’ β x_1 a b, (a, b) β x β§ x_1 β decomposeFluxes b β§ a = q
revert F π©:Typeinstβ:DecidableEq π©x:TenQuanta π©q:π©β’ β F β FluxesTen.elemsNoExotics, β c β F, decomposeFluxes c β 0mpr π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©c:Fluxesh1:(q, c) β xhn:decomposeFluxes c β 0β’ β x_1 a b, (a, b) β x β§ x_1 β decomposeFluxes b β§ a = q
decidempr π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©c:Fluxesh1:(q, c) β xhn:decomposeFluxes c β 0β’ β x_1 a b, (a, b) β x β§ x_1 β decomposeFluxes b β§ a = qmpr π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©c:Fluxesh1:(q, c) β xhn:decomposeFluxes c β 0β’ β x_1 a b, (a, b) β x β§ x_1 β decomposeFluxes b β§ a = q
apply Multiset.exists_mem_of_ne_zero at hn mpr π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©c:Fluxesh1:(q, c) β xhn:β a, a β decomposeFluxes cβ’ β x_1 a b, (a, b) β x β§ x_1 β decomposeFluxes b β§ a = q
obtain β¨c', hβ© := hn mpr π©:Typeinstβ:DecidableEq π©x:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©c:Fluxesh1:(q, c) β xc':Fluxesh:c' β decomposeFluxes cβ’ β x_1 a b, (a, b) β x β§ x_1 β decomposeFluxes b β§ a = q
use c', q, c All goals completed! πC.2.5. Decomposition preserves the reduction
lemma decompose_reduce (x : TenQuanta π©) [DecidableEq π©]
(hx : x.toFluxesTen β FluxesTen.elemsNoExotics) :
x.decompose.reduce = x.reduce := by π©:Typex:TenQuanta π©instβ:DecidableEq π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ x.decompose.reduce = x.reduce
rw [reduce, π©:Typex:TenQuanta π©instβ:DecidableEq π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x.decompose)).sum))
x.decompose.toCharges.dedup =
x.reduce π©:Typex:TenQuanta π©instβ:DecidableEq π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x.decompose)).sum))
x.decompose.toCharges.dedup =
Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum))
x.toCharges.dedup reduce π©:Typex:TenQuanta π©instβ:DecidableEq π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x.decompose)).sum))
x.decompose.toCharges.dedup =
Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum))
x.toCharges.dedup π©:Typex:TenQuanta π©instβ:DecidableEq π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x.decompose)).sum))
x.decompose.toCharges.dedup =
Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum))
x.toCharges.dedup] π©:Typex:TenQuanta π©instβ:DecidableEq π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x.decompose)).sum))
x.decompose.toCharges.dedup =
Multiset.map (fun q10 => (q10, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q10) x)).sum))
x.toCharges.dedup
refine Multiset.map_congr (decompose_toCharges_dedup x hx) fun q hx' => ?_ π©:Typex:TenQuanta π©instβ:DecidableEq π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©hx':q β x.toCharges.dedupβ’ (q, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x.decompose)).sum) =
(q, (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum)
simp only [Prod.mk.injEq, true_and] π©:Typex:TenQuanta π©instβ:DecidableEq π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©hx':q β x.toCharges.dedupβ’ (Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x.decompose)).sum =
(Multiset.map (fun y => y.2) (Multiset.filter (fun f => f.1 = q) x)).sum
change x.decompose.toChargeMap q = x.toChargeMap q π©:Typex:TenQuanta π©instβ:DecidableEq π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©hx':q β x.toCharges.dedupβ’ x.decompose.toChargeMap q = x.toChargeMap q
rw [decompose_toChargeMap x hx π©:Typex:TenQuanta π©instβ:DecidableEq π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsq:π©hx':q β x.toCharges.dedupβ’ x.toChargeMap q = x.toChargeMap q All goals completed! π] All goals completed! π
C.2.6. Fluxes of the decomposition of a TenQuanta
lemma decompose_toFluxesTen (x : TenQuanta π©)
(hx : x.toFluxesTen β FluxesTen.elemsNoExotics) :
x.decompose.toFluxesTen = {β¨1, 0β©, β¨1, 0β©, β¨1, 0β©} β¨
x.decompose.toFluxesTen = {β¨1, 1β©, β¨1, -1β©, β¨1, 0β©} := by π©:Typex:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ x.decompose.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
x.decompose.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}
rw [toFluxesTen, π©:Typex:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ Multiset.map Prod.snd x.decompose = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
Multiset.map Prod.snd x.decompose = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }} π©:Typex:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ Multiset.map Prod.snd (Multiset.bind x fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
{{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
Multiset.map Prod.snd (Multiset.bind x fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
{{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }} decompose π©:Typex:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ Multiset.map Prod.snd (Multiset.bind x fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
{{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
Multiset.map Prod.snd (Multiset.bind x fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
{{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }} π©:Typex:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ Multiset.map Prod.snd (Multiset.bind x fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
{{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
Multiset.map Prod.snd (Multiset.bind x fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
{{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}] π©:Typex:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ Multiset.map Prod.snd (Multiset.bind x fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
{{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
Multiset.map Prod.snd (Multiset.bind x fun p => Multiset.map (fun f => (p.1, f)) (decomposeFluxes p.2)) =
{{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}
rw [Multiset.map_bind π©:Typex:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ (Multiset.bind x fun a => Multiset.map Prod.snd (Multiset.map (fun f => (a.1, f)) (decomposeFluxes a.2))) =
{{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
(Multiset.bind x fun a => Multiset.map Prod.snd (Multiset.map (fun f => (a.1, f)) (decomposeFluxes a.2))) =
{{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }} π©:Typex:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ (Multiset.bind x fun a => Multiset.map Prod.snd (Multiset.map (fun f => (a.1, f)) (decomposeFluxes a.2))) =
{{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
(Multiset.bind x fun a => Multiset.map Prod.snd (Multiset.map (fun f => (a.1, f)) (decomposeFluxes a.2))) =
{{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}] π©:Typex:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ (Multiset.bind x fun a => Multiset.map Prod.snd (Multiset.map (fun f => (a.1, f)) (decomposeFluxes a.2))) =
{{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
(Multiset.bind x fun a => Multiset.map Prod.snd (Multiset.map (fun f => (a.1, f)) (decomposeFluxes a.2))) =
{{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}
simp only [Multiset.map_map, Function.comp_apply, Multiset.map_id', Multiset.insert_eq_cons,
Int.reduceNeg] π©:Typex:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ (Multiset.bind x fun a => decomposeFluxes a.2) = { M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }} β¨
(Multiset.bind x fun a => decomposeFluxes a.2) = { M := 1, N := 1 } ::β { M := 1, N := -1 } ::β {{ M := 1, N := 0 }}
have hx : (Multiset.bind x fun a => decomposeFluxes a.2) =
(Multiset.bind x.toFluxesTen fun a => decomposeFluxes a) := by π©:Typex:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ x.decompose.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
x.decompose.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }} π©:Typex:TenQuanta π©hxβ:x.toFluxesTen β FluxesTen.elemsNoExoticshx:(Multiset.bind x fun a => decomposeFluxes a.2) = Multiset.bind x.toFluxesTen fun a => decomposeFluxes aβ’ (Multiset.bind x fun a => decomposeFluxes a.2) = { M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }} β¨
(Multiset.bind x fun a => decomposeFluxes a.2) = { M := 1, N := 1 } ::β { M := 1, N := -1 } ::β {{ M := 1, N := 0 }}
rw [toFluxesTen, π©:Typex:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ (Multiset.bind x fun a => decomposeFluxes a.2) = (Multiset.map Prod.snd x).bind fun a => decomposeFluxes a π©:Typex:TenQuanta π©hxβ:x.toFluxesTen β FluxesTen.elemsNoExoticshx:(Multiset.bind x fun a => decomposeFluxes a.2) = Multiset.bind x.toFluxesTen fun a => decomposeFluxes aβ’ (Multiset.bind x fun a => decomposeFluxes a.2) = { M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }} β¨
(Multiset.bind x fun a => decomposeFluxes a.2) = { M := 1, N := 1 } ::β { M := 1, N := -1 } ::β {{ M := 1, N := 0 }} Multiset.bind_map π©:Typex:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ (Multiset.bind x fun a => decomposeFluxes a.2) = Multiset.bind x fun a => decomposeFluxes a.2 π©:Typex:TenQuanta π©hxβ:x.toFluxesTen β FluxesTen.elemsNoExoticshx:(Multiset.bind x fun a => decomposeFluxes a.2) = Multiset.bind x.toFluxesTen fun a => decomposeFluxes aβ’ (Multiset.bind x fun a => decomposeFluxes a.2) = { M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }} β¨
(Multiset.bind x fun a => decomposeFluxes a.2) = { M := 1, N := 1 } ::β { M := 1, N := -1 } ::β {{ M := 1, N := 0 }}] π©:Typex:TenQuanta π©hxβ:x.toFluxesTen β FluxesTen.elemsNoExoticshx:(Multiset.bind x fun a => decomposeFluxes a.2) = Multiset.bind x.toFluxesTen fun a => decomposeFluxes aβ’ (Multiset.bind x fun a => decomposeFluxes a.2) = { M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }} β¨
(Multiset.bind x fun a => decomposeFluxes a.2) = { M := 1, N := 1 } ::β { M := 1, N := -1 } ::β {{ M := 1, N := 0 }} π©:Typex:TenQuanta π©hxβ:x.toFluxesTen β FluxesTen.elemsNoExoticshx:(Multiset.bind x fun a => decomposeFluxes a.2) = Multiset.bind x.toFluxesTen fun a => decomposeFluxes aβ’ (Multiset.bind x fun a => decomposeFluxes a.2) = { M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }} β¨
(Multiset.bind x fun a => decomposeFluxes a.2) = { M := 1, N := 1 } ::β { M := 1, N := -1 } ::β {{ M := 1, N := 0 }}
rw [hx π©:Typex:TenQuanta π©hxβ:x.toFluxesTen β FluxesTen.elemsNoExoticshx:(Multiset.bind x fun a => decomposeFluxes a.2) = Multiset.bind x.toFluxesTen fun a => decomposeFluxes aβ’ (Multiset.bind x.toFluxesTen fun a => decomposeFluxes a) =
{ M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }} β¨
(Multiset.bind x.toFluxesTen fun a => decomposeFluxes a) =
{ M := 1, N := 1 } ::β { M := 1, N := -1 } ::β {{ M := 1, N := 0 }} π©:Typex:TenQuanta π©hxβ:x.toFluxesTen β FluxesTen.elemsNoExoticshx:(Multiset.bind x fun a => decomposeFluxes a.2) = Multiset.bind x.toFluxesTen fun a => decomposeFluxes aβ’ (Multiset.bind x.toFluxesTen fun a => decomposeFluxes a) =
{ M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }} β¨
(Multiset.bind x.toFluxesTen fun a => decomposeFluxes a) =
{ M := 1, N := 1 } ::β { M := 1, N := -1 } ::β {{ M := 1, N := 0 }}] π©:Typex:TenQuanta π©hxβ:x.toFluxesTen β FluxesTen.elemsNoExoticshx:(Multiset.bind x fun a => decomposeFluxes a.2) = Multiset.bind x.toFluxesTen fun a => decomposeFluxes aβ’ (Multiset.bind x.toFluxesTen fun a => decomposeFluxes a) =
{ M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }} β¨
(Multiset.bind x.toFluxesTen fun a => decomposeFluxes a) =
{ M := 1, N := 1 } ::β { M := 1, N := -1 } ::β {{ M := 1, N := 0 }}
clear hx π©:Typex:TenQuanta π©hx:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ (Multiset.bind x.toFluxesTen fun a => decomposeFluxes a) =
{ M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }} β¨
(Multiset.bind x.toFluxesTen fun a => decomposeFluxes a) =
{ M := 1, N := 1 } ::β { M := 1, N := -1 } ::β {{ M := 1, N := 0 }}
generalize x.toFluxesTen = F at * π©:Typex:TenQuanta π©F:FluxesTenhx:F β FluxesTen.elemsNoExoticsβ’ (Multiset.bind F fun a => decomposeFluxes a) = { M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }} β¨
(Multiset.bind F fun a => decomposeFluxes a) = { M := 1, N := 1 } ::β { M := 1, N := -1 } ::β {{ M := 1, N := 0 }}
revert F π©:Typex:TenQuanta π©β’ β F β FluxesTen.elemsNoExotics,
(Multiset.bind F fun a => decomposeFluxes a) = { M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }} β¨
(Multiset.bind F fun a => decomposeFluxes a) = { M := 1, N := 1 } ::β { M := 1, N := -1 } ::β {{ M := 1, N := 0 }}
decide All goals completed! π
D. Lifting charges to TenQuanta
D.1. liftCharge c: multiset of ten-quanta for a finite set of charges c with no exotics
This is an efficient definition, we will later show that it gives the correct answer
Given a finite set of charges c the TenQuanta
which do not have exotics, duplicate charges or zero fluxes, which map down to c.
This is defined to be as efficient as possible.
def liftCharge (c : Finset π©) : Multiset (TenQuanta π©) :=
/- The {(1, 0), (1, 0), (1, 0)} case. -/
/- The multisets of cardinality 3 containing 3 elements of `c`. -/
let S10 : Multiset (Multiset π©) := toMultisetsThree c
let F1 : Multiset (TenQuanta π©) :=
(S10.map (fun s => s.map (fun z => (z, β¨1, 0β©)))).filter (fun s => c.val β€ s.toCharges)
/- The {(1, 1), (1, -1), (1, 0)} case. -/
let F2 : Multiset (TenQuanta π©) := ((c.product <| c.product <| c).val.map
fun (x, y, z) => {(x, β¨1, 1β©), (y, β¨1, -1β©), (z, β¨1, 0β©)}).filter (fun s => c.val β€ s.toCharges)
/- All together-/
(F1 + F2).map reduce
D.2. TenQuanta in liftCharge c have a finite set of charges c
lemma toCharge_toFinset_of_mem_liftCharge (c : Finset π©)
{x : TenQuanta π©} (h : x β liftCharge c) :
x.toCharges.toFinset = c := by π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x β liftCharge cβ’ x.toCharges.toFinset = c
rw [liftCharge, π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x β
Multiset.map reduce
(Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val))β’ x.toCharges.toFinset = c π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:β
a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val),
a.reduce = xβ’ x.toCharges.toFinset = c Multiset.mem_map π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:β
a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val),
a.reduce = xβ’ x.toCharges.toFinset = c π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:β
a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val),
a.reduce = xβ’ x.toCharges.toFinset = c] at h π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:β
a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val),
a.reduce = xβ’ x.toCharges.toFinset = c
obtain β¨a, h, rflβ© := h π©:Typeinstβ:DecidableEq π©c:Finset π©a:TenQuanta π©h:a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val)β’ a.reduce.toCharges.toFinset = c
rw [reduce_toCharges π©:Typeinstβ:DecidableEq π©c:Finset π©a:TenQuanta π©h:a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val)β’ a.toCharges.dedup.toFinset = c π©:Typeinstβ:DecidableEq π©c:Finset π©a:TenQuanta π©h:a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val)β’ a.toCharges.dedup.toFinset = c] π©:Typeinstβ:DecidableEq π©c:Finset π©a:TenQuanta π©h:a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val)β’ a.toCharges.dedup.toFinset = c
simp at h π©:Typeinstβ:DecidableEq π©c:Finset π©a:TenQuanta π©h:(β a_1, (a_1.toFinset β c β§ a_1.card = 3) β§ Multiset.map (fun z => (z, { M := 1, N := 0 })) a_1 = a) β§
c.val β€ a.toCharges β¨
(β a_1 a_2 b,
(a_1 β c β§ a_2 β c β§ b β c) β§
(a_1, { M := 1, N := 1 }) ::β (a_2, { M := 1, N := -1 }) ::β {(b, { M := 1, N := 0 })} = a) β§
c.val β€ a.toChargesβ’ a.toCharges.dedup.toFinset = c
rcases h with h | h inl π©:Typeinstβ:DecidableEq π©c:Finset π©a:TenQuanta π©h:(β a_1, (a_1.toFinset β c β§ a_1.card = 3) β§ Multiset.map (fun z => (z, { M := 1, N := 0 })) a_1 = a) β§
c.val β€ a.toChargesβ’ a.toCharges.dedup.toFinset = cinr π©:Typeinstβ:DecidableEq π©c:Finset π©a:TenQuanta π©h:(β a_1 a_2 b,
(a_1 β c β§ a_2 β c β§ b β c) β§
(a_1, { M := 1, N := 1 }) ::β (a_2, { M := 1, N := -1 }) ::β {(b, { M := 1, N := 0 })} = a) β§
c.val β€ a.toChargesβ’ a.toCharges.dedup.toFinset = c
Β· inl π©:Typeinstβ:DecidableEq π©c:Finset π©a:TenQuanta π©h:(β a_1, (a_1.toFinset β c β§ a_1.card = 3) β§ Multiset.map (fun z => (z, { M := 1, N := 0 })) a_1 = a) β§
c.val β€ a.toChargesβ’ a.toCharges.dedup.toFinset = c obtain β¨β¨s, h, rflβ©, h'β© := h inl π©:Typeinstβ:DecidableEq π©c:Finset π©s:Multiset π©h:s.toFinset β c β§ s.card = 3h':c.val β€ toCharges (Multiset.map (fun z => (z, { M := 1, N := 0 })) s)β’ (toCharges (Multiset.map (fun z => (z, { M := 1, N := 0 })) s)).dedup.toFinset = c
simp_all [toCharges] inl π©:Typeinstβ:DecidableEq π©c:Finset π©s:Multiset π©h:s.toFinset β c β§ s.card = 3h':c.val β€ sβ’ s.toFinset = c
ext a inl π©:Typeinstβ:DecidableEq π©c:Finset π©s:Multiset π©h:s.toFinset β c β§ s.card = 3h':c.val β€ sa:π©β’ a β s.toFinset β a β c
simp only [Multiset.mem_toFinset] inl π©:Typeinstβ:DecidableEq π©c:Finset π©s:Multiset π©h:s.toFinset β c β§ s.card = 3h':c.val β€ sa:π©β’ a β s β a β c
constructor inl.mp π©:Typeinstβ:DecidableEq π©c:Finset π©s:Multiset π©h:s.toFinset β c β§ s.card = 3h':c.val β€ sa:π©β’ a β s β a β cinl.mpr π©:Typeinstβ:DecidableEq π©c:Finset π©s:Multiset π©h:s.toFinset β c β§ s.card = 3h':c.val β€ sa:π©β’ a β c β a β s
Β· inl.mp π©:Typeinstβ:DecidableEq π©c:Finset π©s:Multiset π©h:s.toFinset β c β§ s.card = 3h':c.val β€ sa:π©β’ a β s β a β c intro hr inl.mp π©:Typeinstβ:DecidableEq π©c:Finset π©s:Multiset π©h:s.toFinset β c β§ s.card = 3h':c.val β€ sa:π©hr:a β sβ’ a β c
apply h.1 inl.mp π©:Typeinstβ:DecidableEq π©c:Finset π©s:Multiset π©h:s.toFinset β c β§ s.card = 3h':c.val β€ sa:π©hr:a β sβ’ a β s.toFinset
simpa using hr All goals completed! π
Β· inl.mpr π©:Typeinstβ:DecidableEq π©c:Finset π©s:Multiset π©h:s.toFinset β c β§ s.card = 3h':c.val β€ sa:π©β’ a β c β a β s intro hr inl.mpr π©:Typeinstβ:DecidableEq π©c:Finset π©s:Multiset π©h:s.toFinset β c β§ s.card = 3h':c.val β€ sa:π©hr:a β cβ’ a β s
exact Multiset.mem_of_le h' hr All goals completed! π
Β· inr π©:Typeinstβ:DecidableEq π©c:Finset π©a:TenQuanta π©h:(β a_1 a_2 b,
(a_1 β c β§ a_2 β c β§ b β c) β§
(a_1, { M := 1, N := 1 }) ::β (a_2, { M := 1, N := -1 }) ::β {(b, { M := 1, N := 0 })} = a) β§
c.val β€ a.toChargesβ’ a.toCharges.dedup.toFinset = c obtain β¨β¨q1, q2, q3, h, rflβ©, h'β© := h inr π©:Typeinstβ:DecidableEq π©c:Finset π©q1:π©q2:π©q3:π©h:q1 β c β§ q2 β c β§ q3 β ch':c.val β€ toCharges ((q1, { M := 1, N := 1 }) ::β (q2, { M := 1, N := -1 }) ::β {(q3, { M := 1, N := 0 })})β’ (toCharges ((q1, { M := 1, N := 1 }) ::β (q2, { M := 1, N := -1 }) ::β {(q3, { M := 1, N := 0 })})).dedup.toFinset = c
simp_all [toCharges] inr π©:Typeinstβ:DecidableEq π©c:Finset π©q1:π©q2:π©q3:π©h:q1 β c β§ q2 β c β§ q3 β ch':c.val β€ q1 ::β q2 ::β {q3}β’ {q1, q2, q3} = c
refine Eq.symm (Finset.ext_iff.mpr ?_) inr π©:Typeinstβ:DecidableEq π©c:Finset π©q1:π©q2:π©q3:π©h:q1 β c β§ q2 β c β§ q3 β ch':c.val β€ q1 ::β q2 ::β {q3}β’ β (a : π©), a β c β a β {q1, q2, q3}
intro a inr π©:Typeinstβ:DecidableEq π©c:Finset π©q1:π©q2:π©q3:π©h:q1 β c β§ q2 β c β§ q3 β ch':c.val β€ q1 ::β q2 ::β {q3}a:π©β’ a β c β a β {q1, q2, q3}
constructor inr.mp π©:Typeinstβ:DecidableEq π©c:Finset π©q1:π©q2:π©q3:π©h:q1 β c β§ q2 β c β§ q3 β ch':c.val β€ q1 ::β q2 ::β {q3}a:π©β’ a β c β a β {q1, q2, q3}inr.mpr π©:Typeinstβ:DecidableEq π©c:Finset π©q1:π©q2:π©q3:π©h:q1 β c β§ q2 β c β§ q3 β ch':c.val β€ q1 ::β q2 ::β {q3}a:π©β’ a β {q1, q2, q3} β a β c
Β· inr.mp π©:Typeinstβ:DecidableEq π©c:Finset π©q1:π©q2:π©q3:π©h:q1 β c β§ q2 β c β§ q3 β ch':c.val β€ q1 ::β q2 ::β {q3}a:π©β’ a β c β a β {q1, q2, q3} intro hr inr.mp π©:Typeinstβ:DecidableEq π©c:Finset π©q1:π©q2:π©q3:π©h:q1 β c β§ q2 β c β§ q3 β ch':c.val β€ q1 ::β q2 ::β {q3}a:π©hr:a β cβ’ a β {q1, q2, q3}
simpa using Multiset.mem_of_le h' hr All goals completed! π
Β· inr.mpr π©:Typeinstβ:DecidableEq π©c:Finset π©q1:π©q2:π©q3:π©h:q1 β c β§ q2 β c β§ q3 β ch':c.val β€ q1 ::β q2 ::β {q3}a:π©β’ a β {q1, q2, q3} β a β c intro hr inr.mpr π©:Typeinstβ:DecidableEq π©c:Finset π©q1:π©q2:π©q3:π©h:q1 β c β§ q2 β c β§ q3 β ch':c.val β€ q1 ::β q2 ::β {q3}a:π©hr:a β {q1, q2, q3}β’ a β c
simp at hr inr.mpr π©:Typeinstβ:DecidableEq π©c:Finset π©q1:π©q2:π©q3:π©h:q1 β c β§ q2 β c β§ q3 β ch':c.val β€ q1 ::β q2 ::β {q3}a:π©hr:a = q1 β¨ a = q2 β¨ a = q3β’ a β c
rcases hr with rfl | rfl | rfl inr.mpr.inl π©:Typeinstβ:DecidableEq π©c:Finset π©q2:π©q3:π©a:π©h:a β c β§ q2 β c β§ q3 β ch':c.val β€ a ::β q2 ::β {q3}β’ a β cinr.mpr.inr.inl π©:Typeinstβ:DecidableEq π©c:Finset π©q1:π©q3:π©a:π©h:q1 β c β§ a β c β§ q3 β ch':c.val β€ q1 ::β a ::β {q3}β’ a β cinr.mpr.inr.inr π©:Typeinstβ:DecidableEq π©c:Finset π©q1:π©q2:π©a:π©h:q1 β c β§ q2 β c β§ a β ch':c.val β€ q1 ::β q2 ::β {a}β’ a β c
Β· inr.mpr.inl π©:Typeinstβ:DecidableEq π©c:Finset π©q2:π©q3:π©a:π©h:a β c β§ q2 β c β§ q3 β ch':c.val β€ a ::β q2 ::β {q3}β’ a β c exact h.1 All goals completed! π
Β· inr.mpr.inr.inl π©:Typeinstβ:DecidableEq π©c:Finset π©q1:π©q3:π©a:π©h:q1 β c β§ a β c β§ q3 β ch':c.val β€ q1 ::β a ::β {q3}β’ a β c exact h.2.1 All goals completed! π
Β· inr.mpr.inr.inr π©:Typeinstβ:DecidableEq π©c:Finset π©q1:π©q2:π©a:π©h:q1 β c β§ q2 β c β§ a β ch':c.val β€ q1 ::β q2 ::β {a}β’ a β c exact h.2.2 All goals completed! π
D.3. TenQuanta in liftCharge c have no duplicate charges
lemma toCharges_nodup_of_mem_liftCharge (c : Finset π©) {x : TenQuanta π©}
(h : x β liftCharge c) : x.toCharges.Nodup := by π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x β liftCharge cβ’ x.toCharges.Nodup
rw [liftCharge, π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x β
Multiset.map reduce
(Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val))β’ x.toCharges.Nodup π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:β
a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val),
a.reduce = xβ’ x.toCharges.Nodup Multiset.mem_map π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:β
a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val),
a.reduce = xβ’ x.toCharges.Nodup π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:β
a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val),
a.reduce = xβ’ x.toCharges.Nodup] at h π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:β
a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val),
a.reduce = xβ’ x.toCharges.Nodup
obtain β¨x, h, rflβ© := h π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val)β’ x.reduce.toCharges.Nodup
rw [reduce_toCharges π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val)β’ x.toCharges.dedup.Nodup π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val)β’ x.toCharges.dedup.Nodup] π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val)β’ x.toCharges.dedup.Nodup
exact Multiset.nodup_dedup x.toCharges All goals completed! π
D.4. Membership in liftCharge c iff is reduction of TenQuanta with given fluxes
lemma exists_toCharges_toFluxesTen_of_mem_liftCharge (c : Finset π©)
{x : TenQuanta π©} (h : x β liftCharge c) :
β a : TenQuanta π©, a.reduce = x β§ a.toCharges.toFinset = c β§
(a.toFluxesTen = {β¨1, 0β©, β¨1, 0β©, β¨1, 0β©}
β¨ a.toFluxesTen = {β¨1, 1β©, β¨1, -1β©, β¨1, 0β©}) := by π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x β liftCharge cβ’ β a,
a.reduce = x β§
a.toCharges.toFinset = c β§
(a.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
a.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }})
have h' := h π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x β liftCharge ch':x β liftCharge cβ’ β a,
a.reduce = x β§
a.toCharges.toFinset = c β§
(a.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
a.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }})
rw [liftCharge, π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x β
Multiset.map reduce
(Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val))h':x β liftCharge cβ’ β a,
a.reduce = x β§
a.toCharges.toFinset = c β§
(a.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
a.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}) π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:β
a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val),
a.reduce = xh':x β liftCharge cβ’ β a,
a.reduce = x β§
a.toCharges.toFinset = c β§
(a.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
a.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}) Multiset.mem_map π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:β
a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val),
a.reduce = xh':x β liftCharge cβ’ β a,
a.reduce = x β§
a.toCharges.toFinset = c β§
(a.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
a.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}) π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:β
a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val),
a.reduce = xh':x β liftCharge cβ’ β a,
a.reduce = x β§
a.toCharges.toFinset = c β§
(a.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
a.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }})] at h π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:β
a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val),
a.reduce = xh':x β liftCharge cβ’ β a,
a.reduce = x β§
a.toCharges.toFinset = c β§
(a.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
a.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }})
obtain β¨a, h, rflβ© := h π©:Typeinstβ:DecidableEq π©c:Finset π©a:TenQuanta π©h:a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val)h':a.reduce β liftCharge cβ’ β a_1,
a_1.reduce = a.reduce β§
a_1.toCharges.toFinset = c β§
(a_1.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
a_1.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }})
use a h π©:Typeinstβ:DecidableEq π©c:Finset π©a:TenQuanta π©h:a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val)h':a.reduce β liftCharge cβ’ a.reduce = a.reduce β§
a.toCharges.toFinset = c β§
(a.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
a.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }})
simp only [Multiset.insert_eq_cons, Int.reduceNeg, true_and] h π©:Typeinstβ:DecidableEq π©c:Finset π©a:TenQuanta π©h:a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val)h':a.reduce β liftCharge cβ’ a.toCharges.toFinset = c β§
(a.toFluxesTen = { M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }} β¨
a.toFluxesTen = { M := 1, N := 1 } ::β { M := 1, N := -1 } ::β {{ M := 1, N := 0 }})
apply And.intro h.left π©:Typeinstβ:DecidableEq π©c:Finset π©a:TenQuanta π©h:a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val)h':a.reduce β liftCharge cβ’ a.toCharges.toFinset = ch.right π©:Typeinstβ:DecidableEq π©c:Finset π©a:TenQuanta π©h:a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val)h':a.reduce β liftCharge cβ’ a.toFluxesTen = { M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }} β¨
a.toFluxesTen = { M := 1, N := 1 } ::β { M := 1, N := -1 } ::β {{ M := 1, N := 0 }}
Β· h.left π©:Typeinstβ:DecidableEq π©c:Finset π©a:TenQuanta π©h:a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val)h':a.reduce β liftCharge cβ’ a.toCharges.toFinset = c rw [β toCharge_toFinset_of_mem_liftCharge c h', h.left π©:Typeinstβ:DecidableEq π©c:Finset π©a:TenQuanta π©h:a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val)h':a.reduce β liftCharge cβ’ a.toCharges.toFinset = a.reduce.toCharges.toFinset h.left π©:Typeinstβ:DecidableEq π©c:Finset π©a:TenQuanta π©h:a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val)h':a.reduce β liftCharge cβ’ a.toCharges.toFinset = a.toCharges.dedup.toFinset reduce_toCharges h.left π©:Typeinstβ:DecidableEq π©c:Finset π©a:TenQuanta π©h:a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val)h':a.reduce β liftCharge cβ’ a.toCharges.toFinset = a.toCharges.dedup.toFinseth.left π©:Typeinstβ:DecidableEq π©c:Finset π©a:TenQuanta π©h:a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val)h':a.reduce β liftCharge cβ’ a.toCharges.toFinset = a.toCharges.dedup.toFinset]h.left π©:Typeinstβ:DecidableEq π©c:Finset π©a:TenQuanta π©h:a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val)h':a.reduce β liftCharge cβ’ a.toCharges.toFinset = a.toCharges.dedup.toFinset
simp All goals completed! π
simp at h h.right π©:Typeinstβ:DecidableEq π©c:Finset π©a:TenQuanta π©h':a.reduce β liftCharge ch:(β a_1, (a_1.toFinset β c β§ a_1.card = 3) β§ Multiset.map (fun z => (z, { M := 1, N := 0 })) a_1 = a) β§
c.val β€ a.toCharges β¨
(β a_1 a_2 b,
(a_1 β c β§ a_2 β c β§ b β c) β§
(a_1, { M := 1, N := 1 }) ::β (a_2, { M := 1, N := -1 }) ::β {(b, { M := 1, N := 0 })} = a) β§
c.val β€ a.toChargesβ’ a.toFluxesTen = { M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }} β¨
a.toFluxesTen = { M := 1, N := 1 } ::β { M := 1, N := -1 } ::β {{ M := 1, N := 0 }}
rcases h with h | h h.right.inl π©:Typeinstβ:DecidableEq π©c:Finset π©a:TenQuanta π©h':a.reduce β liftCharge ch:(β a_1, (a_1.toFinset β c β§ a_1.card = 3) β§ Multiset.map (fun z => (z, { M := 1, N := 0 })) a_1 = a) β§
c.val β€ a.toChargesβ’ a.toFluxesTen = { M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }} β¨
a.toFluxesTen = { M := 1, N := 1 } ::β { M := 1, N := -1 } ::β {{ M := 1, N := 0 }}h.right.inr π©:Typeinstβ:DecidableEq π©c:Finset π©a:TenQuanta π©h':a.reduce β liftCharge ch:(β a_1 a_2 b,
(a_1 β c β§ a_2 β c β§ b β c) β§
(a_1, { M := 1, N := 1 }) ::β (a_2, { M := 1, N := -1 }) ::β {(b, { M := 1, N := 0 })} = a) β§
c.val β€ a.toChargesβ’ a.toFluxesTen = { M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }} β¨
a.toFluxesTen = { M := 1, N := 1 } ::β { M := 1, N := -1 } ::β {{ M := 1, N := 0 }}
Β· h.right.inl π©:Typeinstβ:DecidableEq π©c:Finset π©a:TenQuanta π©h':a.reduce β liftCharge ch:(β a_1, (a_1.toFinset β c β§ a_1.card = 3) β§ Multiset.map (fun z => (z, { M := 1, N := 0 })) a_1 = a) β§
c.val β€ a.toChargesβ’ a.toFluxesTen = { M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }} β¨
a.toFluxesTen = { M := 1, N := 1 } ::β { M := 1, N := -1 } ::β {{ M := 1, N := 0 }} obtain β¨β¨s, h, rflβ©, h'β© := h h.right.inl π©:Typeinstβ:DecidableEq π©c:Finset π©s:Multiset π©h:s.toFinset β c β§ s.card = 3h'β:reduce (Multiset.map (fun z => (z, { M := 1, N := 0 })) s) β liftCharge ch':c.val β€ toCharges (Multiset.map (fun z => (z, { M := 1, N := 0 })) s)β’ toFluxesTen (Multiset.map (fun z => (z, { M := 1, N := 0 })) s) =
{ M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }} β¨
toFluxesTen (Multiset.map (fun z => (z, { M := 1, N := 0 })) s) =
{ M := 1, N := 1 } ::β { M := 1, N := -1 } ::β {{ M := 1, N := 0 }}
left h.right.inl π©:Typeinstβ:DecidableEq π©c:Finset π©s:Multiset π©h:s.toFinset β c β§ s.card = 3h'β:reduce (Multiset.map (fun z => (z, { M := 1, N := 0 })) s) β liftCharge ch':c.val β€ toCharges (Multiset.map (fun z => (z, { M := 1, N := 0 })) s)β’ toFluxesTen (Multiset.map (fun z => (z, { M := 1, N := 0 })) s) =
{ M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }}
simp [toFluxesTen] h.right.inl π©:Typeinstβ:DecidableEq π©c:Finset π©s:Multiset π©h:s.toFinset β c β§ s.card = 3h'β:reduce (Multiset.map (fun z => (z, { M := 1, N := 0 })) s) β liftCharge ch':c.val β€ toCharges (Multiset.map (fun z => (z, { M := 1, N := 0 })) s)β’ Multiset.replicate s.card { M := 1, N := 0 } = { M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }}
rw [h.2 h.right.inl π©:Typeinstβ:DecidableEq π©c:Finset π©s:Multiset π©h:s.toFinset β c β§ s.card = 3h'β:reduce (Multiset.map (fun z => (z, { M := 1, N := 0 })) s) β liftCharge ch':c.val β€ toCharges (Multiset.map (fun z => (z, { M := 1, N := 0 })) s)β’ Multiset.replicate 3 { M := 1, N := 0 } = { M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }} h.right.inl π©:Typeinstβ:DecidableEq π©c:Finset π©s:Multiset π©h:s.toFinset β c β§ s.card = 3h'β:reduce (Multiset.map (fun z => (z, { M := 1, N := 0 })) s) β liftCharge ch':c.val β€ toCharges (Multiset.map (fun z => (z, { M := 1, N := 0 })) s)β’ Multiset.replicate 3 { M := 1, N := 0 } = { M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }}]h.right.inl π©:Typeinstβ:DecidableEq π©c:Finset π©s:Multiset π©h:s.toFinset β c β§ s.card = 3h'β:reduce (Multiset.map (fun z => (z, { M := 1, N := 0 })) s) β liftCharge ch':c.val β€ toCharges (Multiset.map (fun z => (z, { M := 1, N := 0 })) s)β’ Multiset.replicate 3 { M := 1, N := 0 } = { M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }}
decide All goals completed! π
Β· h.right.inr π©:Typeinstβ:DecidableEq π©c:Finset π©a:TenQuanta π©h':a.reduce β liftCharge ch:(β a_1 a_2 b,
(a_1 β c β§ a_2 β c β§ b β c) β§
(a_1, { M := 1, N := 1 }) ::β (a_2, { M := 1, N := -1 }) ::β {(b, { M := 1, N := 0 })} = a) β§
c.val β€ a.toChargesβ’ a.toFluxesTen = { M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }} β¨
a.toFluxesTen = { M := 1, N := 1 } ::β { M := 1, N := -1 } ::β {{ M := 1, N := 0 }} obtain β¨β¨q1, q2, q3, h, rflβ©, h'β© := h h.right.inr π©:Typeinstβ:DecidableEq π©c:Finset π©q1:π©q2:π©q3:π©h:q1 β c β§ q2 β c β§ q3 β ch'β:reduce ((q1, { M := 1, N := 1 }) ::β (q2, { M := 1, N := -1 }) ::β {(q3, { M := 1, N := 0 })}) β liftCharge ch':c.val β€ toCharges ((q1, { M := 1, N := 1 }) ::β (q2, { M := 1, N := -1 }) ::β {(q3, { M := 1, N := 0 })})β’ toFluxesTen ((q1, { M := 1, N := 1 }) ::β (q2, { M := 1, N := -1 }) ::β {(q3, { M := 1, N := 0 })}) =
{ M := 1, N := 0 } ::β { M := 1, N := 0 } ::β {{ M := 1, N := 0 }} β¨
toFluxesTen ((q1, { M := 1, N := 1 }) ::β (q2, { M := 1, N := -1 }) ::β {(q3, { M := 1, N := 0 })}) =
{ M := 1, N := 1 } ::β { M := 1, N := -1 } ::β {{ M := 1, N := 0 }}
simp [toFluxesTen] All goals completed! π
lemma mem_liftCharge_of_exists_toCharges_toFluxesTen (c : Finset π©) {x : TenQuanta π©}
(h :β a : TenQuanta π©, a.reduce = x β§ a.toCharges.toFinset = c β§
(a.toFluxesTen = {β¨1, 0β©, β¨1, 0β©, β¨1, 0β©}
β¨ a.toFluxesTen = {β¨1, 1β©, β¨1, -1β©, β¨1, 0β©})) :
x β liftCharge c := by π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:β a,
a.reduce = x β§
a.toCharges.toFinset = c β§
(a.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
a.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }})β’ x β liftCharge c
obtain β¨x, rfl, h, h2β© := h π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}β’ x.reduce β liftCharge c
rw [liftCharge, π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}β’ x.reduce β
Multiset.map reduce
(Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val)) π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}β’ β
a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val),
a.reduce = x.reduce Multiset.mem_map π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}β’ β
a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val),
a.reduce = x.reduce π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}β’ β
a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val),
a.reduce = x.reduce] π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}β’ β
a β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val),
a.reduce = x.reduce
use x h π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}β’ x β
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map (fun s => Multiset.map (fun z => (z, { M := 1, N := 0 })) s) (toMultisetsThree c)) +
Multiset.filter (fun s => c.val β€ s.toCharges)
(Multiset.map
(fun x =>
match x with
| (x, y, z) => {(x, { M := 1, N := 1 }), (y, { M := 1, N := -1 }), (z, { M := 1, N := 0 })})
(c.product (c.product c)).val) β§
x.reduce = x.reduce
simp only [Finset.product_eq_sprod, Finset.product_val, Int.reduceNeg, Multiset.insert_eq_cons,
Multiset.mem_add, Multiset.mem_filter, Multiset.mem_map, mem_toMultisetsThree_iff, Prod.exists,
and_true] h π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}β’ (β a, (a.toFinset β c β§ a.card = 3) β§ Multiset.map (fun z => (z, { M := 1, N := 0 })) a = x) β§ c.val β€ x.toCharges β¨
(β a a_1 b,
(a, a_1, b) β c.val ΓΛ’ c.val ΓΛ’ c.val β§
(a, { M := 1, N := 1 }) ::β (a_1, { M := 1, N := -1 }) ::β {(b, { M := 1, N := 0 })} = x) β§
c.val β€ x.toCharges
rcases h2 with h2 | h2 h.inl π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ (β a, (a.toFinset β c β§ a.card = 3) β§ Multiset.map (fun z => (z, { M := 1, N := 0 })) a = x) β§ c.val β€ x.toCharges β¨
(β a a_1 b,
(a, a_1, b) β c.val ΓΛ’ c.val ΓΛ’ c.val β§
(a, { M := 1, N := 1 }) ::β (a_1, { M := 1, N := -1 }) ::β {(b, { M := 1, N := 0 })} = x) β§
c.val β€ x.toChargesh.inr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2:x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}β’ (β a, (a.toFinset β c β§ a.card = 3) β§ Multiset.map (fun z => (z, { M := 1, N := 0 })) a = x) β§ c.val β€ x.toCharges β¨
(β a a_1 b,
(a, a_1, b) β c.val ΓΛ’ c.val ΓΛ’ c.val β§
(a, { M := 1, N := 1 }) ::β (a_1, { M := 1, N := -1 }) ::β {(b, { M := 1, N := 0 })} = x) β§
c.val β€ x.toCharges
Β· h.inl π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ (β a, (a.toFinset β c β§ a.card = 3) β§ Multiset.map (fun z => (z, { M := 1, N := 0 })) a = x) β§ c.val β€ x.toCharges β¨
(β a a_1 b,
(a, a_1, b) β c.val ΓΛ’ c.val ΓΛ’ c.val β§
(a, { M := 1, N := 1 }) ::β (a_1, { M := 1, N := -1 }) ::β {(b, { M := 1, N := 0 })} = x) β§
c.val β€ x.toCharges left h.inl π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ (β a, (a.toFinset β c β§ a.card = 3) β§ Multiset.map (fun z => (z, { M := 1, N := 0 })) a = x) β§ c.val β€ x.toCharges
subst h h.inl π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ (β a, (a.toFinset β x.toCharges.toFinset β§ a.card = 3) β§ Multiset.map (fun z => (z, { M := 1, N := 0 })) a = x) β§
x.toCharges.toFinset.val β€ x.toCharges
simp only [Multiset.toFinset_subset, Multiset.toFinset_val] h.inl π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ (β a, (a β x.toCharges β§ a.card = 3) β§ Multiset.map (fun z => (z, { M := 1, N := 0 })) a = x) β§
x.toCharges.dedup β€ x.toCharges
apply And.intro h.inl.left π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ β a, (a β x.toCharges β§ a.card = 3) β§ Multiset.map (fun z => (z, { M := 1, N := 0 })) a = xh.inl.right π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ x.toCharges.dedup β€ x.toCharges
Β· h.inl.left π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ β a, (a β x.toCharges β§ a.card = 3) β§ Multiset.map (fun z => (z, { M := 1, N := 0 })) a = x use x.toCharges h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ (x.toCharges β x.toCharges β§ x.toCharges.card = 3) β§ Multiset.map (fun z => (z, { M := 1, N := 0 })) x.toCharges = x
simp only [Multiset.Subset.refl, true_and] h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ x.toCharges.card = 3 β§ Multiset.map (fun z => (z, { M := 1, N := 0 })) x.toCharges = x
apply And.intro h.left π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ x.toCharges.card = 3h.right π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ Multiset.map (fun z => (z, { M := 1, N := 0 })) x.toCharges = x
Β· h.left π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ x.toCharges.card = 3 simp [toCharges] h.left π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ Multiset.card x = 3
trans x.toFluxesTen.card π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ Multiset.card x = Multiset.card x.toFluxesTenπ©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ Multiset.card x.toFluxesTen = 3
Β· π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ Multiset.card x = Multiset.card x.toFluxesTen simp [toFluxesTen] All goals completed! π
rw [h2 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ Multiset.card {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} = 3 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ Multiset.card {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} = 3] π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ Multiset.card {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} = 3
decide All goals completed! π
Β· h.right π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ Multiset.map (fun z => (z, { M := 1, N := 0 })) x.toCharges = x trans Multiset.map (fun z => z) x π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ Multiset.map (fun z => (z, { M := 1, N := 0 })) x.toCharges = Multiset.map (fun z => z) xπ©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ Multiset.map (fun z => z) x = x
swap π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ Multiset.map (fun z => z) x = xπ©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ Multiset.map (fun z => (z, { M := 1, N := 0 })) x.toCharges = Multiset.map (fun z => z) x
Β· π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ Multiset.map (fun z => z) x = x simp All goals completed! π
rw [toCharges, π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ Multiset.map (fun z => (z, { M := 1, N := 0 })) (Multiset.map Prod.fst x) = Multiset.map (fun z => z) x π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ Multiset.map ((fun z => (z, { M := 1, N := 0 })) β Prod.fst) x = Multiset.map (fun z => z) x Multiset.map_map π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ Multiset.map ((fun z => (z, { M := 1, N := 0 })) β Prod.fst) x = Multiset.map (fun z => z) x π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ Multiset.map ((fun z => (z, { M := 1, N := 0 })) β Prod.fst) x = Multiset.map (fun z => z) x] π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ Multiset.map ((fun z => (z, { M := 1, N := 0 })) β Prod.fst) x = Multiset.map (fun z => z) x
refine Multiset.map_congr rfl fun p hp => ?_ π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}p:π© Γ Fluxeshp:p β xβ’ ((fun z => (z, { M := 1, N := 0 })) β Prod.fst) p = p
simp only [Function.comp_apply] π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}p:π© Γ Fluxeshp:p β xβ’ (p.1, { M := 1, N := 0 }) = p
have h1 : p.2 β x.toFluxesTen := by π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:β a,
a.reduce = x β§
a.toCharges.toFinset = c β§
(a.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
a.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }})β’ x β liftCharge c π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}p:π© Γ Fluxeshp:p β xh1:p.2 β x.toFluxesTenβ’ (p.1, { M := 1, N := 0 }) = p
simp [toFluxesTen] π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}p:π© Γ Fluxeshp:p β xβ’ β a, (a, p.2) β x π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}p:π© Γ Fluxeshp:p β xh1:p.2 β x.toFluxesTenβ’ (p.1, { M := 1, N := 0 }) = p
use p.1 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}p:π© Γ Fluxeshp:p β xh1:p.2 β x.toFluxesTenβ’ (p.1, { M := 1, N := 0 }) = p π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}p:π© Γ Fluxeshp:p β xh1:p.2 β x.toFluxesTenβ’ (p.1, { M := 1, N := 0 }) = p
rw [h2 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}p:π© Γ Fluxeshp:p β xh1:p.2 β {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ (p.1, { M := 1, N := 0 }) = p π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}p:π© Γ Fluxeshp:p β xh1:p.2 β {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ (p.1, { M := 1, N := 0 }) = p] at h1 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}p:π© Γ Fluxeshp:p β xh1:p.2 β {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ (p.1, { M := 1, N := 0 }) = p
simp at h1 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}p:π© Γ Fluxeshp:p β xh1:p.2 = { M := 1, N := 0 }β’ (p.1, { M := 1, N := 0 }) = p
change _ = (p.1, p.2) π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}p:π© Γ Fluxeshp:p β xh1:p.2 = { M := 1, N := 0 }β’ (p.1, { M := 1, N := 0 }) = (p.1, p.2)
rw [h1 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}p:π© Γ Fluxeshp:p β xh1:p.2 = { M := 1, N := 0 }β’ (p.1, { M := 1, N := 0 }) = (p.1, { M := 1, N := 0 }) All goals completed! π] All goals completed! π
Β· h.inl.right π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ x.toCharges.dedup β€ x.toCharges exact Multiset.dedup_le x.toCharges All goals completed! π
Β· h.inr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2:x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}β’ (β a, (a.toFinset β c β§ a.card = 3) β§ Multiset.map (fun z => (z, { M := 1, N := 0 })) a = x) β§ c.val β€ x.toCharges β¨
(β a a_1 b,
(a, a_1, b) β c.val ΓΛ’ c.val ΓΛ’ c.val β§
(a, { M := 1, N := 1 }) ::β (a_1, { M := 1, N := -1 }) ::β {(b, { M := 1, N := 0 })} = x) β§
c.val β€ x.toCharges right h.inr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2:x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}β’ (β a a_1 b,
(a, a_1, b) β c.val ΓΛ’ c.val ΓΛ’ c.val β§
(a, { M := 1, N := 1 }) ::β (a_1, { M := 1, N := -1 }) ::β {(b, { M := 1, N := 0 })} = x) β§
c.val β€ x.toCharges
have h2' := h2 h.inr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2:x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}β’ (β a a_1 b,
(a, a_1, b) β c.val ΓΛ’ c.val ΓΛ’ c.val β§
(a, { M := 1, N := 1 }) ::β (a_1, { M := 1, N := -1 }) ::β {(b, { M := 1, N := 0 })} = x) β§
c.val β€ x.toCharges
simp [toFluxesTen] at h2 h.inr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2:Multiset.map Prod.snd x = { M := 1, N := 1 } ::β { M := 1, N := -1 } ::β {{ M := 1, N := 0 }}h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}β’ (β a a_1 b,
(a, a_1, b) β c.val ΓΛ’ c.val ΓΛ’ c.val β§
(a, { M := 1, N := 1 }) ::β (a_1, { M := 1, N := -1 }) ::β {(b, { M := 1, N := 0 })} = x) β§
c.val β€ x.toCharges
rw [β Multiset.map_eq_cons h.inr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2:β a β x,
a.2 = { M := 1, N := 1 } β§ Multiset.map Prod.snd (Multiset.erase x a) = { M := 1, N := -1 } ::β {{ M := 1, N := 0 }}h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}β’ (β a a_1 b,
(a, a_1, b) β c.val ΓΛ’ c.val ΓΛ’ c.val β§
(a, { M := 1, N := 1 }) ::β (a_1, { M := 1, N := -1 }) ::β {(b, { M := 1, N := 0 })} = x) β§
c.val β€ x.toCharges h.inr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2:β a β x,
a.2 = { M := 1, N := 1 } β§ Multiset.map Prod.snd (Multiset.erase x a) = { M := 1, N := -1 } ::β {{ M := 1, N := 0 }}h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}β’ (β a a_1 b,
(a, a_1, b) β c.val ΓΛ’ c.val ΓΛ’ c.val β§
(a, { M := 1, N := 1 }) ::β (a_1, { M := 1, N := -1 }) ::β {(b, { M := 1, N := 0 })} = x) β§
c.val β€ x.toCharges] at h2h.inr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2:β a β x,
a.2 = { M := 1, N := 1 } β§ Multiset.map Prod.snd (Multiset.erase x a) = { M := 1, N := -1 } ::β {{ M := 1, N := 0 }}h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}β’ (β a a_1 b,
(a, a_1, b) β c.val ΓΛ’ c.val ΓΛ’ c.val β§
(a, { M := 1, N := 1 }) ::β (a_1, { M := 1, N := -1 }) ::β {(b, { M := 1, N := 0 })} = x) β§
c.val β€ x.toCharges
obtain β¨p1, hp1, hp1_2, h2β© := h2 h.inr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }h2:Multiset.map Prod.snd (Multiset.erase x p1) = { M := 1, N := -1 } ::β {{ M := 1, N := 0 }}β’ (β a a_1 b,
(a, a_1, b) β c.val ΓΛ’ c.val ΓΛ’ c.val β§
(a, { M := 1, N := 1 }) ::β (a_1, { M := 1, N := -1 }) ::β {(b, { M := 1, N := 0 })} = x) β§
c.val β€ x.toCharges
rw [β Multiset.map_eq_cons h.inr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }h2:β a β Multiset.erase x p1,
a.2 = { M := 1, N := -1 } β§ Multiset.map Prod.snd ((Multiset.erase x p1).erase a) = {{ M := 1, N := 0 }}β’ (β a a_1 b,
(a, a_1, b) β c.val ΓΛ’ c.val ΓΛ’ c.val β§
(a, { M := 1, N := 1 }) ::β (a_1, { M := 1, N := -1 }) ::β {(b, { M := 1, N := 0 })} = x) β§
c.val β€ x.toCharges h.inr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }h2:β a β Multiset.erase x p1,
a.2 = { M := 1, N := -1 } β§ Multiset.map Prod.snd ((Multiset.erase x p1).erase a) = {{ M := 1, N := 0 }}β’ (β a a_1 b,
(a, a_1, b) β c.val ΓΛ’ c.val ΓΛ’ c.val β§
(a, { M := 1, N := 1 }) ::β (a_1, { M := 1, N := -1 }) ::β {(b, { M := 1, N := 0 })} = x) β§
c.val β€ x.toCharges] at h2h.inr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }h2:β a β Multiset.erase x p1,
a.2 = { M := 1, N := -1 } β§ Multiset.map Prod.snd ((Multiset.erase x p1).erase a) = {{ M := 1, N := 0 }}β’ (β a a_1 b,
(a, a_1, b) β c.val ΓΛ’ c.val ΓΛ’ c.val β§
(a, { M := 1, N := 1 }) ::β (a_1, { M := 1, N := -1 }) ::β {(b, { M := 1, N := 0 })} = x) β§
c.val β€ x.toCharges
obtain β¨p2, hp2, hp2_2, h2β© := h2 h.inr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }h2:Multiset.map Prod.snd ((Multiset.erase x p1).erase p2) = {{ M := 1, N := 0 }}β’ (β a a_1 b,
(a, a_1, b) β c.val ΓΛ’ c.val ΓΛ’ c.val β§
(a, { M := 1, N := 1 }) ::β (a_1, { M := 1, N := -1 }) ::β {(b, { M := 1, N := 0 })} = x) β§
c.val β€ x.toCharges
rw [Multiset.map_eq_singleton h.inr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }h2:β a, (Multiset.erase x p1).erase p2 = {a} β§ a.2 = { M := 1, N := 0 }β’ (β a a_1 b,
(a, a_1, b) β c.val ΓΛ’ c.val ΓΛ’ c.val β§
(a, { M := 1, N := 1 }) ::β (a_1, { M := 1, N := -1 }) ::β {(b, { M := 1, N := 0 })} = x) β§
c.val β€ x.toCharges h.inr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }h2:β a, (Multiset.erase x p1).erase p2 = {a} β§ a.2 = { M := 1, N := 0 }β’ (β a a_1 b,
(a, a_1, b) β c.val ΓΛ’ c.val ΓΛ’ c.val β§
(a, { M := 1, N := 1 }) ::β (a_1, { M := 1, N := -1 }) ::β {(b, { M := 1, N := 0 })} = x) β§
c.val β€ x.toCharges] at h2h.inr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }h2:β a, (Multiset.erase x p1).erase p2 = {a} β§ a.2 = { M := 1, N := 0 }β’ (β a a_1 b,
(a, a_1, b) β c.val ΓΛ’ c.val ΓΛ’ c.val β§
(a, { M := 1, N := 1 }) ::β (a_1, { M := 1, N := -1 }) ::β {(b, { M := 1, N := 0 })} = x) β§
c.val β€ x.toCharges
obtain β¨p3, hp3, hp3_2β© := h2 h.inr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (β a a_1 b,
(a, a_1, b) β c.val ΓΛ’ c.val ΓΛ’ c.val β§
(a, { M := 1, N := 1 }) ::β (a_1, { M := 1, N := -1 }) ::β {(b, { M := 1, N := 0 })} = x) β§
c.val β€ x.toCharges
apply And.intro h.inr.left π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ β a a_1 b,
(a, a_1, b) β c.val ΓΛ’ c.val ΓΛ’ c.val β§
(a, { M := 1, N := 1 }) ::β (a_1, { M := 1, N := -1 }) ::β {(b, { M := 1, N := 0 })} = xh.inr.right π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ c.val β€ x.toCharges
Β· h.inr.left π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ β a a_1 b,
(a, a_1, b) β c.val ΓΛ’ c.val ΓΛ’ c.val β§
(a, { M := 1, N := 1 }) ::β (a_1, { M := 1, N := -1 }) ::β {(b, { M := 1, N := 0 })} = x use p1.1, p2.1, p3.1 h π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p1.1, p2.1, p3.1) β c.val ΓΛ’ c.val ΓΛ’ c.val β§
(p1.1, { M := 1, N := 1 }) ::β (p2.1, { M := 1, N := -1 }) ::β {(p3.1, { M := 1, N := 0 })} = x
subst h h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p1.1, p2.1, p3.1) β x.toCharges.toFinset.val ΓΛ’ x.toCharges.toFinset.val ΓΛ’ x.toCharges.toFinset.val β§
(p1.1, { M := 1, N := 1 }) ::β (p2.1, { M := 1, N := -1 }) ::β {(p3.1, { M := 1, N := 0 })} = x
simp only [Multiset.toFinset_val, Multiset.mem_product, Multiset.mem_dedup, Int.reduceNeg] h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p1.1 β x.toCharges β§ p2.1 β x.toCharges β§ p3.1 β x.toCharges) β§
(p1.1, { M := 1, N := 1 }) ::β (p2.1, { M := 1, N := -1 }) ::β {(p3.1, { M := 1, N := 0 })} = x
refine β¨β¨?_, ?_, ?_β©, ?_β© h.refine_1 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ p1.1 β x.toChargesh.refine_2 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ p2.1 β x.toChargesh.refine_3 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ p3.1 β x.toChargesh.refine_4 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p1.1, { M := 1, N := 1 }) ::β (p2.1, { M := 1, N := -1 }) ::β {(p3.1, { M := 1, N := 0 })} = x
Β· h.refine_1 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ p1.1 β x.toCharges simp [toCharges] h.refine_1 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ β x_1, (p1.1, x_1) β x
use p1.2 All goals completed! π
Β· h.refine_2 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ p2.1 β x.toCharges simp [toCharges] h.refine_2 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ β x_1, (p2.1, x_1) β x
use p2.2 h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p2.1, p2.2) β x
apply Multiset.erase_subset p1 x hp2 All goals completed! π
Β· h.refine_3 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ p3.1 β x.toCharges simp [toCharges] h.refine_3 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ β x_1, (p3.1, x_1) β x
use p3.2 h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p3.1, p3.2) β x
apply Multiset.erase_subset p1 x h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p3.1, p3.2) β Multiset.erase x p1
apply Multiset.erase_subset p2 _ h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p3.1, p3.2) β (Multiset.erase x p1).erase p2
rw [hp3 h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p3.1, p3.2) β {p3} h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p3.1, p3.2) β {p3}]h π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p3.1, p3.2) β {p3}
simp All goals completed! π
Β· h.refine_4 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p1.1, { M := 1, N := 1 }) ::β (p2.1, { M := 1, N := -1 }) ::β {(p3.1, { M := 1, N := 0 })} = x refine Multiset.eq_of_le_of_card_le ?_ ?_ h.refine_4.refine_1 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p1.1, { M := 1, N := 1 }) ::β (p2.1, { M := 1, N := -1 }) ::β {(p3.1, { M := 1, N := 0 })} β€ xh.refine_4.refine_2 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ Multiset.card x β€ ((p1.1, { M := 1, N := 1 }) ::β (p2.1, { M := 1, N := -1 }) ::β {(p3.1, { M := 1, N := 0 })}).card
Β· h.refine_4.refine_1 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p1.1, { M := 1, N := 1 }) ::β (p2.1, { M := 1, N := -1 }) ::β {(p3.1, { M := 1, N := 0 })} β€ x refine (Multiset.cons_le_of_notMem ?_).mpr β¨?_, ?_β© h.refine_4.refine_1.refine_1 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p1.1, { M := 1, N := 1 }) β (p2.1, { M := 1, N := -1 }) ::β {(p3.1, { M := 1, N := 0 })}h.refine_4.refine_1.refine_2 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p1.1, { M := 1, N := 1 }) β xh.refine_4.refine_1.refine_3 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p2.1, { M := 1, N := -1 }) ::β {(p3.1, { M := 1, N := 0 })} β€ x
Β· h.refine_4.refine_1.refine_1 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p1.1, { M := 1, N := 1 }) β (p2.1, { M := 1, N := -1 }) ::β {(p3.1, { M := 1, N := 0 })} simp All goals completed! π
Β· h.refine_4.refine_1.refine_2 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p1.1, { M := 1, N := 1 }) β x rw [β hp1_2 h.refine_4.refine_1.refine_2 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p1.1, p1.2) β x h.refine_4.refine_1.refine_2 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p1.1, p1.2) β x]h.refine_4.refine_1.refine_2 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p1.1, p1.2) β x
exact hp1 All goals completed! π
refine (Multiset.cons_le_of_notMem ?_).mpr β¨?_, ?_β© h.refine_4.refine_1.refine_3.refine_1 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p2.1, { M := 1, N := -1 }) β {(p3.1, { M := 1, N := 0 })}h.refine_4.refine_1.refine_3.refine_2 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p2.1, { M := 1, N := -1 }) β xh.refine_4.refine_1.refine_3.refine_3 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ {(p3.1, { M := 1, N := 0 })} β€ x
Β· h.refine_4.refine_1.refine_3.refine_1 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p2.1, { M := 1, N := -1 }) β {(p3.1, { M := 1, N := 0 })} simp All goals completed! π
Β· h.refine_4.refine_1.refine_3.refine_2 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p2.1, { M := 1, N := -1 }) β x rw [β hp2_2 h.refine_4.refine_1.refine_3.refine_2 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p2.1, p2.2) β x h.refine_4.refine_1.refine_3.refine_2 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p2.1, p2.2) β x]h.refine_4.refine_1.refine_3.refine_2 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p2.1, p2.2) β x
apply Multiset.erase_subset p1 x h.refine_4.refine_1.refine_3.refine_2 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p2.1, p2.2) β Multiset.erase x p1
exact hp2 All goals completed! π
simp only [Multiset.singleton_le] h.refine_4.refine_1.refine_3.refine_3 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p3.1, { M := 1, N := 0 }) β x
rw [β hp3_2 h.refine_4.refine_1.refine_3.refine_3 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p3.1, p3.2) β x h.refine_4.refine_1.refine_3.refine_3 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p3.1, p3.2) β x]h.refine_4.refine_1.refine_3.refine_3 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p3.1, p3.2) β x
apply Multiset.erase_subset p1 x h.refine_4.refine_1.refine_3.refine_3 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p3.1, p3.2) β Multiset.erase x p1
apply Multiset.erase_subset p2 _ h.refine_4.refine_1.refine_3.refine_3 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p3.1, p3.2) β (Multiset.erase x p1).erase p2
rw [hp3 h.refine_4.refine_1.refine_3.refine_3 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p3.1, p3.2) β {p3} h.refine_4.refine_1.refine_3.refine_3 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p3.1, p3.2) β {p3}]h.refine_4.refine_1.refine_3.refine_3 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ (p3.1, p3.2) β {p3}
simp All goals completed! π
Β· h.refine_4.refine_2 π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ Multiset.card x β€ ((p1.1, { M := 1, N := 1 }) ::β (p2.1, { M := 1, N := -1 }) ::β {(p3.1, { M := 1, N := 0 })}).card trans x.toFluxesTen.card π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ Multiset.card x β€ Multiset.card x.toFluxesTenπ©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ Multiset.card x.toFluxesTen β€
((p1.1, { M := 1, N := 1 }) ::β (p2.1, { M := 1, N := -1 }) ::β {(p3.1, { M := 1, N := 0 })}).card
Β· π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ Multiset.card x β€ Multiset.card x.toFluxesTen simp [toFluxesTen] All goals completed! π
rw [h2' π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ Multiset.card {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }} β€
((p1.1, { M := 1, N := 1 }) ::β (p2.1, { M := 1, N := -1 }) ::β {(p3.1, { M := 1, N := 0 })}).card π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ Multiset.card {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }} β€
((p1.1, { M := 1, N := 1 }) ::β (p2.1, { M := 1, N := -1 }) ::β {(p3.1, { M := 1, N := 0 })}).card] π©:Typeinstβ:DecidableEq π©x:TenQuanta π©h2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ Multiset.card {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }} β€
((p1.1, { M := 1, N := 1 }) ::β (p2.1, { M := 1, N := -1 }) ::β {(p3.1, { M := 1, N := 0 })}).card
simp All goals completed! π
Β· h.inr.right π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ c.val β€ x.toCharges rw [β h h.inr.right π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ x.toCharges.toFinset.val β€ x.toCharges h.inr.right π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ x.toCharges.toFinset.val β€ x.toCharges]h.inr.right π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ x.toCharges.toFinset.val β€ x.toCharges
simp only [Multiset.toFinset_val] h.inr.right π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x.toCharges.toFinset = ch2':x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}p1:π© Γ Fluxeshp1:p1 β xhp1_2:p1.2 = { M := 1, N := 1 }p2:π© Γ Fluxeshp2:p2 β Multiset.erase x p1hp2_2:p2.2 = { M := 1, N := -1 }p3:π© Γ Fluxeshp3:(Multiset.erase x p1).erase p2 = {p3}hp3_2:p3.2 = { M := 1, N := 0 }β’ x.toCharges.dedup β€ x.toCharges
exact Multiset.dedup_le x.toCharges All goals completed! πlemma mem_liftCharge_iff_exists (c : Finset π©) {x : TenQuanta π©} :
x β liftCharge c β
β a : TenQuanta π©, a.reduce = x β§ a.toCharges.toFinset = c β§
(a.toFluxesTen = {β¨1, 0β©, β¨1, 0β©, β¨1, 0β©}
β¨ a.toFluxesTen = {β¨1, 1β©, β¨1, -1β©, β¨1, 0β©}) := by π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©β’ x β liftCharge c β
β a,
a.reduce = x β§
a.toCharges.toFinset = c β§
(a.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
a.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }})
constructor mp π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©β’ x β liftCharge c β
β a,
a.reduce = x β§
a.toCharges.toFinset = c β§
(a.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
a.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }})mpr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©β’ (β a,
a.reduce = x β§
a.toCharges.toFinset = c β§
(a.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
a.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }})) β
x β liftCharge c
Β· mp π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©β’ x β liftCharge c β
β a,
a.reduce = x β§
a.toCharges.toFinset = c β§
(a.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
a.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}) exact exists_toCharges_toFluxesTen_of_mem_liftCharge c All goals completed! π
Β· mpr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©β’ (β a,
a.reduce = x β§
a.toCharges.toFinset = c β§
(a.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
a.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }})) β
x β liftCharge c exact mem_liftCharge_of_exists_toCharges_toFluxesTen c All goals completed! π
D.5. TenQuanta in liftCharge c do not have zero fluxes
lemma hasNoZero_of_mem_liftCharge (c : Finset π©) {x : TenQuanta π©}
(h : x β liftCharge c) : x.toFluxesTen.HasNoZero := by π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x β liftCharge cβ’ x.toFluxesTen.HasNoZero
rw [mem_liftCharge_iff_exists π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:β a,
a.reduce = x β§
a.toCharges.toFinset = c β§
(a.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
a.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }})β’ x.toFluxesTen.HasNoZero π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:β a,
a.reduce = x β§
a.toCharges.toFinset = c β§
(a.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
a.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }})β’ x.toFluxesTen.HasNoZero] at h π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:β a,
a.reduce = x β§
a.toCharges.toFinset = c β§
(a.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
a.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }})β’ x.toFluxesTen.HasNoZero
obtain β¨x, rfl, h1, h2β© := h π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toCharges.toFinset = ch2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}β’ x.reduce.toFluxesTen.HasNoZero
intro hf π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toCharges.toFinset = ch2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}hf:0 β x.reduce.toFluxesTenβ’ False
have hx := mem_powerset_sum_of_mem_reduce_toFluxesTen_filter hf π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toCharges.toFinset = ch2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}hf:0 β x.reduce.toFluxesTenhx:0 β Multiset.map (fun s => s.sum) (Multiset.filter (fun s => s β 0) (Multiset.powerset x.toFluxesTen))β’ False
rcases h2 with h2 | h2 inl π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toCharges.toFinset = chf:0 β x.reduce.toFluxesTenhx:0 β Multiset.map (fun s => s.sum) (Multiset.filter (fun s => s β 0) (Multiset.powerset x.toFluxesTen))h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ Falseinr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toCharges.toFinset = chf:0 β x.reduce.toFluxesTenhx:0 β Multiset.map (fun s => s.sum) (Multiset.filter (fun s => s β 0) (Multiset.powerset x.toFluxesTen))h2:x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}β’ False
all_goals
rw [h2 inl π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toCharges.toFinset = chf:0 β x.reduce.toFluxesTenhx:0 β
Multiset.map (fun s => s.sum)
(Multiset.filter (fun s => s β 0) (Multiset.powerset {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}))h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ False inr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toCharges.toFinset = chf:0 β x.reduce.toFluxesTenhx:0 β
Multiset.map (fun s => s.sum)
(Multiset.filter (fun s => s β 0) (Multiset.powerset {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}))h2:x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}β’ False] inl π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toCharges.toFinset = chf:0 β x.reduce.toFluxesTenhx:0 β
Multiset.map (fun s => s.sum)
(Multiset.filter (fun s => s β 0) (Multiset.powerset {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}))h2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ Falseinr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toCharges.toFinset = chf:0 β x.reduce.toFluxesTenhx:0 β
Multiset.map (fun s => s.sum)
(Multiset.filter (fun s => s β 0) (Multiset.powerset {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}))h2:x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}β’ False at hxinr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toCharges.toFinset = chf:0 β x.reduce.toFluxesTenhx:0 β
Multiset.map (fun s => s.sum)
(Multiset.filter (fun s => s β 0) (Multiset.powerset {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}))h2:x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}β’ False
revert hx inr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toCharges.toFinset = chf:0 β x.reduce.toFluxesTenh2:x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}β’ 0 β
Multiset.map (fun s => s.sum)
(Multiset.filter (fun s => s β 0)
(Multiset.powerset {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }})) β
False
decide All goals completed! π
D.6. TenQuanta in liftCharge c have no exotics
lemma noExotics_of_mem_liftCharge (c : Finset π©) (F : TenQuanta π©)
(h : F β liftCharge c) :
F.toFluxesTen.NoExotics := by π©:Typeinstβ:DecidableEq π©c:Finset π©F:TenQuanta π©h:F β liftCharge cβ’ F.toFluxesTen.NoExotics
rw [mem_liftCharge_iff_exists π©:Typeinstβ:DecidableEq π©c:Finset π©F:TenQuanta π©h:β a,
a.reduce = F β§
a.toCharges.toFinset = c β§
(a.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
a.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }})β’ F.toFluxesTen.NoExotics π©:Typeinstβ:DecidableEq π©c:Finset π©F:TenQuanta π©h:β a,
a.reduce = F β§
a.toCharges.toFinset = c β§
(a.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
a.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }})β’ F.toFluxesTen.NoExotics] at h π©:Typeinstβ:DecidableEq π©c:Finset π©F:TenQuanta π©h:β a,
a.reduce = F β§
a.toCharges.toFinset = c β§
(a.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
a.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }})β’ F.toFluxesTen.NoExotics
obtain β¨x, rfl, h1, h2β© := h π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toCharges.toFinset = ch2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}β’ x.reduce.toFluxesTen.NoExotics
apply reduce_noExotics_of_mem_elemsNoExotics π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toCharges.toFinset = ch2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}β’ x.toFluxesTen β FluxesTen.elemsNoExotics
rcases h2 with h2 | h2 inl π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toCharges.toFinset = ch2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ x.toFluxesTen β FluxesTen.elemsNoExoticsinr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toCharges.toFinset = ch2:x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}β’ x.toFluxesTen β FluxesTen.elemsNoExotics
all_goals
rw [h2 inl π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toCharges.toFinset = ch2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β FluxesTen.elemsNoExotics inr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toCharges.toFinset = ch2:x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}β’ {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }} β FluxesTen.elemsNoExotics] inl π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toCharges.toFinset = ch2:x.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }}β’ {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β FluxesTen.elemsNoExoticsinr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toCharges.toFinset = ch2:x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}β’ {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }} β FluxesTen.elemsNoExoticsinr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toCharges.toFinset = ch2:x.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}β’ {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }} β FluxesTen.elemsNoExotics
decide All goals completed! π
D.7. Membership in liftCharge c iff have no exotics, no zero fluxes, and charges c
lemma mem_liftCharge_of_mem_noExotics_hasNoZero (c : Finset π©) {x : TenQuanta π©}
(h1 : x.toFluxesTen.NoExotics) (h2 : x.toFluxesTen.HasNoZero)
(h3 : x.toCharges.toFinset = c) (h4 : x.toCharges.Nodup) :
x β liftCharge c := by π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExoticsh2:x.toFluxesTen.HasNoZeroh3:x.toCharges.toFinset = ch4:x.toCharges.Nodupβ’ x β liftCharge c
have hf : x.toFluxesTen β FluxesTen.elemsNoExotics := by
rw [β FluxesTen.noExotics_iff_mem_elemsNoExotics π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExoticsh2:x.toFluxesTen.HasNoZeroh3:x.toCharges.toFinset = ch4:x.toCharges.Nodupβ’ x.toFluxesTen.NoExotics β§ x.toFluxesTen.HasNoZero π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExoticsh2:x.toFluxesTen.HasNoZeroh3:x.toCharges.toFinset = ch4:x.toCharges.Nodupβ’ x.toFluxesTen.NoExotics β§ x.toFluxesTen.HasNoZero π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExoticsh2:x.toFluxesTen.HasNoZeroh3:x.toCharges.toFinset = ch4:x.toCharges.Noduphf:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ x β liftCharge c] π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExoticsh2:x.toFluxesTen.HasNoZeroh3:x.toCharges.toFinset = ch4:x.toCharges.Nodupβ’ x.toFluxesTen.NoExotics β§ x.toFluxesTen.HasNoZero π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExoticsh2:x.toFluxesTen.HasNoZeroh3:x.toCharges.toFinset = ch4:x.toCharges.Noduphf:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ x β liftCharge c
exact β¨h1, h2β© π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExoticsh2:x.toFluxesTen.HasNoZeroh3:x.toCharges.toFinset = ch4:x.toCharges.Noduphf:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ x β liftCharge c π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExoticsh2:x.toFluxesTen.HasNoZeroh3:x.toCharges.toFinset = ch4:x.toCharges.Noduphf:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ x β liftCharge c
rw [mem_liftCharge_iff_exists π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExoticsh2:x.toFluxesTen.HasNoZeroh3:x.toCharges.toFinset = ch4:x.toCharges.Noduphf:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ β a,
a.reduce = x β§
a.toCharges.toFinset = c β§
(a.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
a.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}) π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExoticsh2:x.toFluxesTen.HasNoZeroh3:x.toCharges.toFinset = ch4:x.toCharges.Noduphf:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ β a,
a.reduce = x β§
a.toCharges.toFinset = c β§
(a.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
a.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }})] π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExoticsh2:x.toFluxesTen.HasNoZeroh3:x.toCharges.toFinset = ch4:x.toCharges.Noduphf:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ β a,
a.reduce = x β§
a.toCharges.toFinset = c β§
(a.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
a.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }})
refine β¨x.decompose, ?_, ?_, ?_β© refine_1 π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExoticsh2:x.toFluxesTen.HasNoZeroh3:x.toCharges.toFinset = ch4:x.toCharges.Noduphf:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ x.decompose.reduce = xrefine_2 π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExoticsh2:x.toFluxesTen.HasNoZeroh3:x.toCharges.toFinset = ch4:x.toCharges.Noduphf:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ x.decompose.toCharges.toFinset = crefine_3 π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExoticsh2:x.toFluxesTen.HasNoZeroh3:x.toCharges.toFinset = ch4:x.toCharges.Noduphf:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ x.decompose.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
x.decompose.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }}
Β· refine_1 π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExoticsh2:x.toFluxesTen.HasNoZeroh3:x.toCharges.toFinset = ch4:x.toCharges.Noduphf:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ x.decompose.reduce = x rw [decompose_reduce x hf refine_1 π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExoticsh2:x.toFluxesTen.HasNoZeroh3:x.toCharges.toFinset = ch4:x.toCharges.Noduphf:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ x.reduce = x refine_1 π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExoticsh2:x.toFluxesTen.HasNoZeroh3:x.toCharges.toFinset = ch4:x.toCharges.Noduphf:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ x.reduce = x]refine_1 π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExoticsh2:x.toFluxesTen.HasNoZeroh3:x.toCharges.toFinset = ch4:x.toCharges.Noduphf:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ x.reduce = x
exact reduce_eq_self_of_ofCharges_nodup x h4 All goals completed! π
Β· refine_2 π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExoticsh2:x.toFluxesTen.HasNoZeroh3:x.toCharges.toFinset = ch4:x.toCharges.Noduphf:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ x.decompose.toCharges.toFinset = c trans x.decompose.toCharges.dedup.toFinset π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExoticsh2:x.toFluxesTen.HasNoZeroh3:x.toCharges.toFinset = ch4:x.toCharges.Noduphf:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ x.decompose.toCharges.toFinset = x.decompose.toCharges.dedup.toFinsetπ©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExoticsh2:x.toFluxesTen.HasNoZeroh3:x.toCharges.toFinset = ch4:x.toCharges.Noduphf:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ x.decompose.toCharges.dedup.toFinset = c
Β· π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExoticsh2:x.toFluxesTen.HasNoZeroh3:x.toCharges.toFinset = ch4:x.toCharges.Noduphf:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ x.decompose.toCharges.toFinset = x.decompose.toCharges.dedup.toFinset simp All goals completed! π
Β· π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExoticsh2:x.toFluxesTen.HasNoZeroh3:x.toCharges.toFinset = ch4:x.toCharges.Noduphf:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ x.decompose.toCharges.dedup.toFinset = c rw [decompose_toCharges_dedup x hf, π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExoticsh2:x.toFluxesTen.HasNoZeroh3:x.toCharges.toFinset = ch4:x.toCharges.Noduphf:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ x.toCharges.dedup.toFinset = c π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExoticsh2:x.toFluxesTen.HasNoZeroh3:x.toCharges.toFinset = ch4:x.toCharges.Noduphf:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ x.toCharges.dedup.toFinset = x.toCharges.toFinset β h3 π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExoticsh2:x.toFluxesTen.HasNoZeroh3:x.toCharges.toFinset = ch4:x.toCharges.Noduphf:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ x.toCharges.dedup.toFinset = x.toCharges.toFinset π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExoticsh2:x.toFluxesTen.HasNoZeroh3:x.toCharges.toFinset = ch4:x.toCharges.Noduphf:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ x.toCharges.dedup.toFinset = x.toCharges.toFinset] π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExoticsh2:x.toFluxesTen.HasNoZeroh3:x.toCharges.toFinset = ch4:x.toCharges.Noduphf:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ x.toCharges.dedup.toFinset = x.toCharges.toFinset
simp All goals completed! π
Β· refine_3 π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExoticsh2:x.toFluxesTen.HasNoZeroh3:x.toCharges.toFinset = ch4:x.toCharges.Noduphf:x.toFluxesTen β FluxesTen.elemsNoExoticsβ’ x.decompose.toFluxesTen = {{ M := 1, N := 0 }, { M := 1, N := 0 }, { M := 1, N := 0 }} β¨
x.decompose.toFluxesTen = {{ M := 1, N := 1 }, { M := 1, N := -1 }, { M := 1, N := 0 }} exact decompose_toFluxesTen x hf All goals completed! π
lemma mem_liftCharge_iff (c : Finset π©) (x : TenQuanta π©) :
x β liftCharge c β x.toFluxesTen β FluxesTen.elemsNoExotics
β§ x.toCharges.toFinset = c β§ x.toCharges.Nodup := by π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©β’ x β liftCharge c β x.toFluxesTen β FluxesTen.elemsNoExotics β§ x.toCharges.toFinset = c β§ x.toCharges.Nodup
constructor mp π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©β’ x β liftCharge c β x.toFluxesTen β FluxesTen.elemsNoExotics β§ x.toCharges.toFinset = c β§ x.toCharges.Nodupmpr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©β’ x.toFluxesTen β FluxesTen.elemsNoExotics β§ x.toCharges.toFinset = c β§ x.toCharges.Nodup β x β liftCharge c
Β· mp π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©β’ x β liftCharge c β x.toFluxesTen β FluxesTen.elemsNoExotics β§ x.toCharges.toFinset = c β§ x.toCharges.Nodup intro h mp π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x β liftCharge cβ’ x.toFluxesTen β FluxesTen.elemsNoExotics β§ x.toCharges.toFinset = c β§ x.toCharges.Nodup
refine β¨?_, ?_, ?_β© mp.refine_1 π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x β liftCharge cβ’ x.toFluxesTen β FluxesTen.elemsNoExoticsmp.refine_2 π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x β liftCharge cβ’ x.toCharges.toFinset = cmp.refine_3 π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x β liftCharge cβ’ x.toCharges.Nodup
Β· mp.refine_1 π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x β liftCharge cβ’ x.toFluxesTen β FluxesTen.elemsNoExotics rw [β FluxesTen.noExotics_iff_mem_elemsNoExotics mp.refine_1 π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x β liftCharge cβ’ x.toFluxesTen.NoExotics β§ x.toFluxesTen.HasNoZero mp.refine_1 π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x β liftCharge cβ’ x.toFluxesTen.NoExotics β§ x.toFluxesTen.HasNoZero] mp.refine_1 π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x β liftCharge cβ’ x.toFluxesTen.NoExotics β§ x.toFluxesTen.HasNoZero
exact β¨noExotics_of_mem_liftCharge c x h, hasNoZero_of_mem_liftCharge c hβ© All goals completed! π
Β· mp.refine_2 π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x β liftCharge cβ’ x.toCharges.toFinset = c exact toCharge_toFinset_of_mem_liftCharge c h All goals completed! π
Β· mp.refine_3 π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h:x β liftCharge cβ’ x.toCharges.Nodup exact toCharges_nodup_of_mem_liftCharge c h All goals completed! π
Β· mpr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©β’ x.toFluxesTen β FluxesTen.elemsNoExotics β§ x.toCharges.toFinset = c β§ x.toCharges.Nodup β x β liftCharge c intro β¨h1, h2, h3β© mpr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen β FluxesTen.elemsNoExoticsh2:x.toCharges.toFinset = ch3:x.toCharges.Nodupβ’ x β liftCharge c
rw [β FluxesTen.noExotics_iff_mem_elemsNoExotics mpr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExotics β§ x.toFluxesTen.HasNoZeroh2:x.toCharges.toFinset = ch3:x.toCharges.Nodupβ’ x β liftCharge c mpr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExotics β§ x.toFluxesTen.HasNoZeroh2:x.toCharges.toFinset = ch3:x.toCharges.Nodupβ’ x β liftCharge c] at h1mpr π©:Typeinstβ:DecidableEq π©c:Finset π©x:TenQuanta π©h1:x.toFluxesTen.NoExotics β§ x.toFluxesTen.HasNoZeroh2:x.toCharges.toFinset = ch3:x.toCharges.Nodupβ’ x β liftCharge c
exact mem_liftCharge_of_mem_noExotics_hasNoZero c h1.1 h1.2 h2 h3 All goals completed! π
D.8. liftCharge c is preserved under a map if reduced
lemma map_liftCharge {π© π©1 : Type}[DecidableEq π©] [DecidableEq π©1] [CommRing π©] [CommRing π©1]
(f : π© β+* π©1) (c : Finset π©) (F : TenQuanta π©) (h : F β liftCharge c) :
TenQuanta.reduce (F.map fun y => (f y.1, y.2)) β liftCharge (c.image f) := by π©:Typeπ©1:TypeinstβΒ³:DecidableEq π©instβΒ²:DecidableEq π©1instβΒΉ:CommRing π©instβ:CommRing π©1f:π© β+* π©1c:Finset π©F:TenQuanta π©h:F β liftCharge cβ’ reduce (Multiset.map (fun y => (f y.1, y.2)) F) β liftCharge (Finset.image (βf) c)
rw [mem_liftCharge_iff π©:Typeπ©1:TypeinstβΒ³:DecidableEq π©instβΒ²:DecidableEq π©1instβΒΉ:CommRing π©instβ:CommRing π©1f:π© β+* π©1c:Finset π©F:TenQuanta π©h:F.toFluxesTen β FluxesTen.elemsNoExotics β§ F.toCharges.toFinset = c β§ F.toCharges.Nodupβ’ (reduce (Multiset.map (fun y => (f y.1, y.2)) F)).toFluxesTen β FluxesTen.elemsNoExotics β§
(reduce (Multiset.map (fun y => (f y.1, y.2)) F)).toCharges.toFinset = Finset.image (βf) c β§
(reduce (Multiset.map (fun y => (f y.1, y.2)) F)).toCharges.Nodup π©:Typeπ©1:TypeinstβΒ³:DecidableEq π©instβΒ²:DecidableEq π©1instβΒΉ:CommRing π©instβ:CommRing π©1f:π© β+* π©1c:Finset π©F:TenQuanta π©h:F.toFluxesTen β FluxesTen.elemsNoExotics β§ F.toCharges.toFinset = c β§ F.toCharges.Nodupβ’ (reduce (Multiset.map (fun y => (f y.1, y.2)) F)).toFluxesTen β FluxesTen.elemsNoExotics β§
(reduce (Multiset.map (fun y => (f y.1, y.2)) F)).toCharges.toFinset = Finset.image (βf) c β§
(reduce (Multiset.map (fun y => (f y.1, y.2)) F)).toCharges.Nodup] at h β’ π©:Typeπ©1:TypeinstβΒ³:DecidableEq π©instβΒ²:DecidableEq π©1instβΒΉ:CommRing π©instβ:CommRing π©1f:π© β+* π©1c:Finset π©F:TenQuanta π©h:F.toFluxesTen β FluxesTen.elemsNoExotics β§ F.toCharges.toFinset = c β§ F.toCharges.Nodupβ’ (reduce (Multiset.map (fun y => (f y.1, y.2)) F)).toFluxesTen β FluxesTen.elemsNoExotics β§
(reduce (Multiset.map (fun y => (f y.1, y.2)) F)).toCharges.toFinset = Finset.image (βf) c β§
(reduce (Multiset.map (fun y => (f y.1, y.2)) F)).toCharges.Nodup
refine β¨?_, ?_, ?_β© refine_1 π©:Typeπ©1:TypeinstβΒ³:DecidableEq π©instβΒ²:DecidableEq π©1instβΒΉ:CommRing π©instβ:CommRing π©1f:π© β+* π©1c:Finset π©F:TenQuanta π©h:F.toFluxesTen β FluxesTen.elemsNoExotics β§ F.toCharges.toFinset = c β§ F.toCharges.Nodupβ’ (reduce (Multiset.map (fun y => (f y.1, y.2)) F)).toFluxesTen β FluxesTen.elemsNoExoticsrefine_2 π©:Typeπ©1:TypeinstβΒ³:DecidableEq π©instβΒ²:DecidableEq π©1instβΒΉ:CommRing π©instβ:CommRing π©1f:π© β+* π©1c:Finset π©F:TenQuanta π©h:F.toFluxesTen β FluxesTen.elemsNoExotics β§ F.toCharges.toFinset = c β§ F.toCharges.Nodupβ’ (reduce (Multiset.map (fun y => (f y.1, y.2)) F)).toCharges.toFinset = Finset.image (βf) crefine_3 π©:Typeπ©1:TypeinstβΒ³:DecidableEq π©instβΒ²:DecidableEq π©1instβΒΉ:CommRing π©instβ:CommRing π©1f:π© β+* π©1c:Finset π©F:TenQuanta π©h:F.toFluxesTen β FluxesTen.elemsNoExotics β§ F.toCharges.toFinset = c β§ F.toCharges.Nodupβ’ (reduce (Multiset.map (fun y => (f y.1, y.2)) F)).toCharges.Nodup
Β· refine_1 π©:Typeπ©1:TypeinstβΒ³:DecidableEq π©instβΒ²:DecidableEq π©1instβΒΉ:CommRing π©instβ:CommRing π©1f:π© β+* π©1c:Finset π©F:TenQuanta π©h:F.toFluxesTen β FluxesTen.elemsNoExotics β§ F.toCharges.toFinset = c β§ F.toCharges.Nodupβ’ (reduce (Multiset.map (fun y => (f y.1, y.2)) F)).toFluxesTen β FluxesTen.elemsNoExotics apply reduce_mem_elemsNoExotics refine_1 π©:Typeπ©1:TypeinstβΒ³:DecidableEq π©instβΒ²:DecidableEq π©1instβΒΉ:CommRing π©instβ:CommRing π©1f:π© β+* π©1c:Finset π©F:TenQuanta π©h:F.toFluxesTen β FluxesTen.elemsNoExotics β§ F.toCharges.toFinset = c β§ F.toCharges.Nodupβ’ toFluxesTen (Multiset.map (fun y => (f y.1, y.2)) F) β FluxesTen.elemsNoExotics
simpa [toFluxesTen, Multiset.map_map] using h.1 All goals completed! π
Β· refine_2 π©:Typeπ©1:TypeinstβΒ³:DecidableEq π©instβΒ²:DecidableEq π©1instβΒΉ:CommRing π©instβ:CommRing π©1f:π© β+* π©1c:Finset π©F:TenQuanta π©h:F.toFluxesTen β FluxesTen.elemsNoExotics β§ F.toCharges.toFinset = c β§ F.toCharges.Nodupβ’ (reduce (Multiset.map (fun y => (f y.1, y.2)) F)).toCharges.toFinset = Finset.image (βf) c rw [reduce_toCharges refine_2 π©:Typeπ©1:TypeinstβΒ³:DecidableEq π©instβΒ²:DecidableEq π©1instβΒΉ:CommRing π©instβ:CommRing π©1f:π© β+* π©1c:Finset π©F:TenQuanta π©h:F.toFluxesTen β FluxesTen.elemsNoExotics β§ F.toCharges.toFinset = c β§ F.toCharges.Nodupβ’ (toCharges (Multiset.map (fun y => (f y.1, y.2)) F)).dedup.toFinset = Finset.image (βf) c refine_2 π©:Typeπ©1:TypeinstβΒ³:DecidableEq π©instβΒ²:DecidableEq π©1instβΒΉ:CommRing π©instβ:CommRing π©1f:π© β+* π©1c:Finset π©F:TenQuanta π©h:F.toFluxesTen β FluxesTen.elemsNoExotics β§ F.toCharges.toFinset = c β§ F.toCharges.Nodupβ’ (toCharges (Multiset.map (fun y => (f y.1, y.2)) F)).dedup.toFinset = Finset.image (βf) c]refine_2 π©:Typeπ©1:TypeinstβΒ³:DecidableEq π©instβΒ²:DecidableEq π©1instβΒΉ:CommRing π©instβ:CommRing π©1f:π© β+* π©1c:Finset π©F:TenQuanta π©h:F.toFluxesTen β FluxesTen.elemsNoExotics β§ F.toCharges.toFinset = c β§ F.toCharges.Nodupβ’ (toCharges (Multiset.map (fun y => (f y.1, y.2)) F)).dedup.toFinset = Finset.image (βf) c
simp [β h.2.1, β Multiset.toFinset_map, toCharges] All goals completed! π
Β· refine_3 π©:Typeπ©1:TypeinstβΒ³:DecidableEq π©instβΒ²:DecidableEq π©1instβΒΉ:CommRing π©instβ:CommRing π©1f:π© β+* π©1c:Finset π©F:TenQuanta π©h:F.toFluxesTen β FluxesTen.elemsNoExotics β§ F.toCharges.toFinset = c β§ F.toCharges.Nodupβ’ (reduce (Multiset.map (fun y => (f y.1, y.2)) F)).toCharges.Nodup rw [reduce_toCharges refine_3 π©:Typeπ©1:TypeinstβΒ³:DecidableEq π©instβΒ²:DecidableEq π©1instβΒΉ:CommRing π©instβ:CommRing π©1f:π© β+* π©1c:Finset π©F:TenQuanta π©h:F.toFluxesTen β FluxesTen.elemsNoExotics β§ F.toCharges.toFinset = c β§ F.toCharges.Nodupβ’ (toCharges (Multiset.map (fun y => (f y.1, y.2)) F)).dedup.Nodup refine_3 π©:Typeπ©1:TypeinstβΒ³:DecidableEq π©instβΒ²:DecidableEq π©1instβΒΉ:CommRing π©instβ:CommRing π©1f:π© β+* π©1c:Finset π©F:TenQuanta π©h:F.toFluxesTen β FluxesTen.elemsNoExotics β§ F.toCharges.toFinset = c β§ F.toCharges.Nodupβ’ (toCharges (Multiset.map (fun y => (f y.1, y.2)) F)).dedup.Nodup]refine_3 π©:Typeπ©1:TypeinstβΒ³:DecidableEq π©instβΒ²:DecidableEq π©1instβΒΉ:CommRing π©instβ:CommRing π©1f:π© β+* π©1c:Finset π©F:TenQuanta π©h:F.toFluxesTen β FluxesTen.elemsNoExotics β§ F.toCharges.toFinset = c β§ F.toCharges.Nodupβ’ (toCharges (Multiset.map (fun y => (f y.1, y.2)) F)).dedup.Nodup
exact Multiset.nodup_dedup (toCharges (Multiset.map (fun y => (f y.1, y.2)) F)) All goals completed! πE. Anomaly cancellation coefficients
E.1. Anomaly coefficients of a TenQuanta
The anomaly coefficient of a TenQuanta is given by the pair of integers:
(βα΅’ qα΅’ Nα΅’, 3 * βα΅’ qα΅’Β² Nα΅’).
The first components is for the mixed U(1)-MSSM, see equation (22) of arXiv:1401.5084. The second component is for the mixed U(1)Y-U(1)-U(1) gauge anomaly, see equation (23) of arXiv:1401.5084.
def anomalyCoefficient (F : TenQuanta π©) : π© Γ π© :=
((F.map fun x => x.2.2 β’ x.1).sum, 3 * (F.map fun x => x.2.2 β’ (x.1 * x.1)).sum)E.2. Anomaly coefficients under a map
@[simp]
lemma anomalyCoefficient_of_map {π© π©1 : Type} [CommRing π©] [CommRing π©1]
(f : π© β+* π©1) (F : TenQuanta π©) :
TenQuanta.anomalyCoefficient (F.map fun y => (f y.1, y.2) : TenQuanta π©1) =
(f.prodMap f) F.anomalyCoefficient := by π©:Typeπ©1:TypeinstβΒΉ:CommRing π©instβ:CommRing π©1f:π© β+* π©1F:TenQuanta π©β’ anomalyCoefficient (Multiset.map (fun y => (f y.1, y.2)) F) = (f.prodMap f) F.anomalyCoefficient
simp [TenQuanta.anomalyCoefficient, map_multiset_sum, Multiset.map_map, map_ofNat] All goals completed! π
E.3. Anomaly coefficients is preserved under reduce
lemma anomalyCoefficient_of_reduce [DecidableEq π©] (F : TenQuanta π©) :
F.reduce.anomalyCoefficient = F.anomalyCoefficient := by π©:TypeinstβΒΉ:CommRing π©instβ:DecidableEq π©F:TenQuanta π©β’ F.reduce.anomalyCoefficient = F.anomalyCoefficient
have weighted_N_sum_eq : β w : π© β π©,
(Multiset.map (fun x => (x.2.N : π©) * w x.1) F.reduce).sum =
(Multiset.map (fun x => (x.2.N : π©) * w x.1) F).sum := fun w =>
reduce_sum_eq_sum_toCharges F fun q5 =>
{ toFun := fun x => (x.N : π©) * w q5
map_zero' := by π©:TypeinstβΒΉ:CommRing π©instβ:DecidableEq π©F:TenQuanta π©w:π© β π©q5:π©β’ β(Fluxes.N 0) * w q5 = 0 π©:TypeinstβΒΉ:CommRing π©instβ:DecidableEq π©F:TenQuanta π©weighted_N_sum_eq:β (w : π© β π©), (Multiset.map (fun x => βx.2.N * w x.1) F.reduce).sum = (Multiset.map (fun x => βx.2.N * w x.1) F).sumβ’ F.reduce.anomalyCoefficient = F.anomalyCoefficient simp All goals completed! π π©:TypeinstβΒΉ:CommRing π©instβ:DecidableEq π©F:TenQuanta π©weighted_N_sum_eq:β (w : π© β π©), (Multiset.map (fun x => βx.2.N * w x.1) F.reduce).sum = (Multiset.map (fun x => βx.2.N * w x.1) F).sumβ’ F.reduce.anomalyCoefficient = F.anomalyCoefficient
map_add' := fun x y => by π©:TypeinstβΒΉ:CommRing π©instβ:DecidableEq π©F:TenQuanta π©w:π© β π©q5:π©x:Fluxesy:Fluxesβ’ β(x + y).N * w q5 = βx.N * w q5 + βy.N * w q5 π©:TypeinstβΒΉ:CommRing π©instβ:DecidableEq π©F:TenQuanta π©weighted_N_sum_eq:β (w : π© β π©), (Multiset.map (fun x => βx.2.N * w x.1) F.reduce).sum = (Multiset.map (fun x => βx.2.N * w x.1) F).sumβ’ F.reduce.anomalyCoefficient = F.anomalyCoefficient simp [add_mul] All goals completed! π π©:TypeinstβΒΉ:CommRing π©instβ:DecidableEq π©F:TenQuanta π©weighted_N_sum_eq:β (w : π© β π©), (Multiset.map (fun x => βx.2.N * w x.1) F.reduce).sum = (Multiset.map (fun x => βx.2.N * w x.1) F).sumβ’ F.reduce.anomalyCoefficient = F.anomalyCoefficient } π©:TypeinstβΒΉ:CommRing π©instβ:DecidableEq π©F:TenQuanta π©weighted_N_sum_eq:β (w : π© β π©), (Multiset.map (fun x => βx.2.N * w x.1) F.reduce).sum = (Multiset.map (fun x => βx.2.N * w x.1) F).sumβ’ F.reduce.anomalyCoefficient = F.anomalyCoefficient
simp [anomalyCoefficient] π©:TypeinstβΒΉ:CommRing π©instβ:DecidableEq π©F:TenQuanta π©weighted_N_sum_eq:β (w : π© β π©), (Multiset.map (fun x => βx.2.N * w x.1) F.reduce).sum = (Multiset.map (fun x => βx.2.N * w x.1) F).sumβ’ (Multiset.map (fun x => βx.2.N * x.1) F.reduce).sum = (Multiset.map (fun x => βx.2.N * x.1) F).sum β§
3 * (Multiset.map (fun x => βx.2.N * (x.1 * x.1)) F.reduce).sum =
3 * (Multiset.map (fun x => βx.2.N * (x.1 * x.1)) F).sum
exact β¨weighted_N_sum_eq fun q => q, congrArg (3 * Β·) (weighted_N_sum_eq fun q => q * q)β© All goals completed! π