Imports
/-
Copyright (c) 2024 Joseph Tooby-Smith. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Tooby-Smith
-/
module
public import Physlib.QFT.PerturbationTheory.FieldStatistics.Basic
public import Mathlib.Data.Finset.SortField statistics of a finite set.
@[expose] public section
The field statistic associated with a map f : Fin n → 𝓕 (usually .get of a list)
and a finite set of elements of Fin n.
def ofFinset {n : ℕ} (q : 𝓕 → FieldStatistic) (f : Fin n → 𝓕) (a : Finset (Fin n)) :
FieldStatistic :=
ofList q ((a.sort (· ≤ ·)).map f)@[simp]
lemma ofFinset_empty (q : 𝓕 → FieldStatistic) (f : Fin n → 𝓕) :
ofFinset q f ∅ = 1 := 𝓕:Typen:ℕq:𝓕 → FieldStatisticf:Fin n → 𝓕⊢ ofFinset q f ∅ = 1
𝓕:Typen:ℕq:𝓕 → FieldStatisticf:Fin n → 𝓕⊢ bosonic = 1
All goals completed! 🐙lemma ofFinset_singleton {n : ℕ} (q : 𝓕 → FieldStatistic) (f : Fin n → 𝓕) (i : Fin n) :
ofFinset q f {i} = q (f i) := 𝓕:Typen:ℕq:𝓕 → FieldStatisticf:Fin n → 𝓕i:Fin n⊢ ofFinset q f {i} = q (f i)
All goals completed! 🐙𝓕:Typen:ℕm:ℕq:𝓕 → FieldStatistici:Fin m → Fin nhi:Function.Injective if:Fin n → 𝓕a:Finset (Fin m)⊢ (List.map f (List.map i (a.sort fun x1 x2 => x1 ≤ x2))).Perm
(List.map f ((Finset.map { toFun := i, inj' := hi } a).sort fun x1 x2 => x1 ≤ x2))
refine List.Perm.map f ?_ 𝓕:Typen:ℕm:ℕq:𝓕 → FieldStatistici:Fin m → Fin nhi:Function.Injective if:Fin n → 𝓕a:Finset (Fin m)⊢ (List.map i (a.sort fun x1 x2 => x1 ≤ x2)).Perm ((Finset.map { toFun := i, inj' := hi } a).sort fun x1 x2 => x1 ≤ x2)
apply List.perm_of_nodup_nodup_toFinset_eq hl 𝓕:Typen:ℕm:ℕq:𝓕 → FieldStatistici:Fin m → Fin nhi:Function.Injective if:Fin n → 𝓕a:Finset (Fin m)⊢ (List.map i (a.sort fun x1 x2 => x1 ≤ x2)).Noduphl' 𝓕:Typen:ℕm:ℕq:𝓕 → FieldStatistici:Fin m → Fin nhi:Function.Injective if:Fin n → 𝓕a:Finset (Fin m)⊢ ((Finset.map { toFun := i, inj' := hi } a).sort fun x1 x2 => x1 ≤ x2).Noduph 𝓕:Typen:ℕm:ℕq:𝓕 → FieldStatistici:Fin m → Fin nhi:Function.Injective if:Fin n → 𝓕a:Finset (Fin m)⊢ (List.map i (a.sort fun x1 x2 => x1 ≤ x2)).toFinset =
((Finset.map { toFun := i, inj' := hi } a).sort fun x1 x2 => x1 ≤ x2).toFinset
· hl 𝓕:Typen:ℕm:ℕq:𝓕 → FieldStatistici:Fin m → Fin nhi:Function.Injective if:Fin n → 𝓕a:Finset (Fin m)⊢ (List.map i (a.sort fun x1 x2 => x1 ≤ x2)).Nodup refine (List.nodup_map_iff_inj_on ?_).mpr ?_ hl.refine_1 𝓕:Typen:ℕm:ℕq:𝓕 → FieldStatistici:Fin m → Fin nhi:Function.Injective if:Fin n → 𝓕a:Finset (Fin m)⊢ (a.sort fun x1 x2 => x1 ≤ x2).Noduphl.refine_2 𝓕:Typen:ℕm:ℕq:𝓕 → FieldStatistici:Fin m → Fin nhi:Function.Injective if:Fin n → 𝓕a:Finset (Fin m)⊢ ∀ x ∈ a.sort fun x1 x2 => x1 ≤ x2, ∀ y ∈ a.sort fun x1 x2 => x1 ≤ x2, i x = i y → x = y
exact a.sort_nodup (fun x1 x2 => x1 ≤ x2) hl.refine_2 𝓕:Typen:ℕm:ℕq:𝓕 → FieldStatistici:Fin m → Fin nhi:Function.Injective if:Fin n → 𝓕a:Finset (Fin m)⊢ ∀ x ∈ a.sort fun x1 x2 => x1 ≤ x2, ∀ y ∈ a.sort fun x1 x2 => x1 ≤ x2, i x = i y → x = y
simp only [Finset.mem_sort] hl.refine_2 𝓕:Typen:ℕm:ℕq:𝓕 → FieldStatistici:Fin m → Fin nhi:Function.Injective if:Fin n → 𝓕a:Finset (Fin m)⊢ ∀ x ∈ a, ∀ y ∈ a, i x = i y → x = y
intro x hx y hy hl.refine_2 𝓕:Typen:ℕm:ℕq:𝓕 → FieldStatistici:Fin m → Fin nhi:Function.Injective if:Fin n → 𝓕a:Finset (Fin m)x:Fin mhx:x ∈ ay:Fin mhy:y ∈ a⊢ i x = i y → x = y
exact fun a => hi a All goals completed! 🐙
· hl' 𝓕:Typen:ℕm:ℕq:𝓕 → FieldStatistici:Fin m → Fin nhi:Function.Injective if:Fin n → 𝓕a:Finset (Fin m)⊢ ((Finset.map { toFun := i, inj' := hi } a).sort fun x1 x2 => x1 ≤ x2).Nodup exact (Finset.map { toFun := i, inj' := hi } a).sort_nodup (fun x1 x2 => x1 ≤ x2) All goals completed! 🐙
· h 𝓕:Typen:ℕm:ℕq:𝓕 → FieldStatistici:Fin m → Fin nhi:Function.Injective if:Fin n → 𝓕a:Finset (Fin m)⊢ (List.map i (a.sort fun x1 x2 => x1 ≤ x2)).toFinset =
((Finset.map { toFun := i, inj' := hi } a).sort fun x1 x2 => x1 ≤ x2).toFinset ext a h 𝓕:Typen:ℕm:ℕq:𝓕 → FieldStatistici:Fin m → Fin nhi:Function.Injective if:Fin n → 𝓕a✝:Finset (Fin m)a:Fin n⊢ a ∈ (List.map i (a✝.sort fun x1 x2 => x1 ≤ x2)).toFinset ↔
a ∈ ((Finset.map { toFun := i, inj' := hi } a✝).sort fun x1 x2 => x1 ≤ x2).toFinset
simp All goals completed! 🐙
lemma ofFinset_insert (q : 𝓕 → FieldStatistic) (φs : List 𝓕) (a : Finset (Fin φs.length))
(i : Fin φs.length) (h : i ∉ a) :
ofFinset q φs.get (Insert.insert i a) = (q φs[i]) * ofFinset q φs.get a := by 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ a⊢ ofFinset q φs.get (insert i a) = q φs[i] * ofFinset q φs.get a
simp only [ofFinset, Fin.getElem_fin] 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ a⊢ ofList q (List.map φs.get ((insert i a).sort fun x1 x2 => x1 ≤ x2)) =
q φs[↑i] * ofList q (List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2))
rw [← ofList_cons_eq_mul 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ a⊢ ofList q (List.map φs.get ((insert i a).sort fun x1 x2 => x1 ≤ x2)) =
ofList q (φs[↑i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2)) 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ a⊢ ofList q (List.map φs.get ((insert i a).sort fun x1 x2 => x1 ≤ x2)) =
ofList q (φs[↑i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2))] 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ a⊢ ofList q (List.map φs.get ((insert i a).sort fun x1 x2 => x1 ≤ x2)) =
ofList q (φs[↑i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2))
have h1 : (φs[↑i] :: List.map φs.get (a.sort (fun x1 x2 => x1 ≤ x2)))
= List.map φs.get (i :: a.sort (fun x1 x2 => x1 ≤ x2)) := by 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ a⊢ ofFinset q φs.get (insert i a) = q φs[i] * ofFinset q φs.get a 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ ah1:φs[i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2) = List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2)⊢ ofList q (List.map φs.get ((insert i a).sort fun x1 x2 => x1 ≤ x2)) =
ofList q (φs[↑i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2))
simp 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ ah1:φs[i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2) = List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2)⊢ ofList q (List.map φs.get ((insert i a).sort fun x1 x2 => x1 ≤ x2)) =
ofList q (φs[↑i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2)) 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ ah1:φs[i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2) = List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2)⊢ ofList q (List.map φs.get ((insert i a).sort fun x1 x2 => x1 ≤ x2)) =
ofList q (φs[↑i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2))
erw [h1 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ ah1:φs[i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2) = List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2)⊢ ofList q (List.map φs.get ((insert i a).sort fun x1 x2 => x1 ≤ x2)) =
ofList q (List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2))] 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ ah1:φs[i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2) = List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2)⊢ ofList q (List.map φs.get ((insert i a).sort fun x1 x2 => x1 ≤ x2)) =
ofList q (List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2))
apply ofList_perm 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ ah1:φs[i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2) = List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2)⊢ (List.map φs.get ((insert i a).sort fun x1 x2 => x1 ≤ x2)).Perm (List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2))
refine List.Perm.map φs.get ?_ 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ ah1:φs[i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2) = List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2)⊢ ((insert i a).sort fun x1 x2 => x1 ≤ x2).Perm (i :: a.sort fun x1 x2 => x1 ≤ x2)
refine (List.perm_ext_iff_of_nodup ?_ ?_).mpr ?_ refine_1 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ ah1:φs[i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2) = List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2)⊢ ((insert i a).sort fun x1 x2 => x1 ≤ x2).Noduprefine_2 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ ah1:φs[i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2) = List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2)⊢ (i :: a.sort fun x1 x2 => x1 ≤ x2).Noduprefine_3 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ ah1:φs[i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2) = List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2)⊢ ∀ (a_1 : Fin φs.length), (a_1 ∈ (insert i a).sort fun x1 x2 => x1 ≤ x2) ↔ a_1 ∈ i :: a.sort fun x1 x2 => x1 ≤ x2
· refine_1 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ ah1:φs[i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2) = List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2)⊢ ((insert i a).sort fun x1 x2 => x1 ≤ x2).Nodup exact (Insert.insert i a).sort_nodup (fun x1 x2 => x1 ≤ x2) All goals completed! 🐙
· refine_2 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ ah1:φs[i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2) = List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2)⊢ (i :: a.sort fun x1 x2 => x1 ≤ x2).Nodup simp only [List.nodup_cons, Finset.mem_sort, Finset.sort_nodup, and_true] refine_2 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ ah1:φs[i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2) = List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2)⊢ i ∉ a
exact h All goals completed! 🐙
intro a refine_3 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a✝:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ ah1:φs[i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2) = List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2)a:Fin φs.length⊢ (a ∈ (insert i a✝).sort fun x1 x2 => x1 ≤ x2) ↔ a ∈ i :: a✝.sort fun x1 x2 => x1 ≤ x2
simp All goals completed! 🐙
lemma ofFinset_erase (q : 𝓕 → FieldStatistic) (φs : List 𝓕) (a : Finset (Fin φs.length))
(i : Fin φs.length) (h : i ∈ a) :
ofFinset q φs.get (a.erase i) = (q φs[i]) * ofFinset q φs.get a := by 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∈ a⊢ ofFinset q φs.get (a.erase i) = q φs[i] * ofFinset q φs.get a
have ha : a = Insert.insert i (a.erase i) := by
exact Eq.symm (Finset.insert_erase h) 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∈ aha:a = insert i (a.erase i)⊢ ofFinset q φs.get (a.erase i) = q φs[i] * ofFinset q φs.get a 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∈ aha:a = insert i (a.erase i)⊢ ofFinset q φs.get (a.erase i) = q φs[i] * ofFinset q φs.get a
conv_rhs => rw [ha] 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∈ aha:a = insert i (a.erase i)| q φs[i] * ofFinset q φs.get (insert i (a.erase i))
rw [ofFinset_insert 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∈ aha:a = insert i (a.erase i)⊢ ofFinset q φs.get (a.erase i) = q φs[i] * (q φs[i] * ofFinset q φs.get (a.erase i))h 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∈ aha:a = insert i (a.erase i)⊢ i ∉ a.erase i 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∈ aha:a = insert i (a.erase i)⊢ ofFinset q φs.get (a.erase i) = q φs[i] * (q φs[i] * ofFinset q φs.get (a.erase i))h 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∈ aha:a = insert i (a.erase i)⊢ i ∉ a.erase i] 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∈ aha:a = insert i (a.erase i)⊢ ofFinset q φs.get (a.erase i) = q φs[i] * (q φs[i] * ofFinset q φs.get (a.erase i))h 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∈ aha:a = insert i (a.erase i)⊢ i ∉ a.erase i
rw [← mul_assoc 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∈ aha:a = insert i (a.erase i)⊢ ofFinset q φs.get (a.erase i) = q φs[i] * q φs[i] * ofFinset q φs.get (a.erase i)h 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∈ aha:a = insert i (a.erase i)⊢ i ∉ a.erase i 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∈ aha:a = insert i (a.erase i)⊢ ofFinset q φs.get (a.erase i) = q φs[i] * q φs[i] * ofFinset q φs.get (a.erase i)h 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∈ aha:a = insert i (a.erase i)⊢ i ∉ a.erase i] 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∈ aha:a = insert i (a.erase i)⊢ ofFinset q φs.get (a.erase i) = q φs[i] * q φs[i] * ofFinset q φs.get (a.erase i)h 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∈ aha:a = insert i (a.erase i)⊢ i ∉ a.erase i
simp only [Fin.getElem_fin, mul_self, one_mul] h 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∈ aha:a = insert i (a.erase i)⊢ i ∉ a.erase i
simp All goals completed! 🐙
lemma ofFinset_eq_prod (q : 𝓕 → FieldStatistic) (φs : List 𝓕) (a : Finset (Fin φs.length)) :
ofFinset q φs.get a = ∏ (i : Fin φs.length), if i ∈ a then (q φs[i]) else 1 := by 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)⊢ ofFinset q φs.get a = ∏ i, if i ∈ a then q φs[i] else 1
rw [ofFinset 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)⊢ ofList q (List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2)) = ∏ i, if i ∈ a then q φs[i] else 1 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)⊢ ofList q (List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2)) = ∏ i, if i ∈ a then q φs[i] else 1] 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)⊢ ofList q (List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2)) = ∏ i, if i ∈ a then q φs[i] else 1
rw [ofList_map_eq_finset_prod 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)⊢ (∏ i, if i ∈ a.sort fun x1 x2 => x1 ≤ x2 then q φs[i] else 1) = ∏ i, if i ∈ a then q φs[i] else 1hl 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)⊢ (a.sort fun x1 x2 => x1 ≤ x2).Nodup 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)⊢ (∏ i, if i ∈ a.sort fun x1 x2 => x1 ≤ x2 then q φs[i] else 1) = ∏ i, if i ∈ a then q φs[i] else 1hl 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)⊢ (a.sort fun x1 x2 => x1 ≤ x2).Nodup] 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)⊢ (∏ i, if i ∈ a.sort fun x1 x2 => x1 ≤ x2 then q φs[i] else 1) = ∏ i, if i ∈ a then q φs[i] else 1hl 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)⊢ (a.sort fun x1 x2 => x1 ≤ x2).Nodup
congr e_f 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)⊢ (fun i => if i ∈ a.sort fun x1 x2 => x1 ≤ x2 then q φs[i] else 1) = fun i => if i ∈ a then q φs[i] else 1hl 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)⊢ (a.sort fun x1 x2 => x1 ≤ x2).Nodup
funext i e_f 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.length⊢ (if i ∈ a.sort fun x1 x2 => x1 ≤ x2 then q φs[i] else 1) = if i ∈ a then q φs[i] else 1hl 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)⊢ (a.sort fun x1 x2 => x1 ≤ x2).Nodup
simp only [Finset.mem_sort, Fin.getElem_fin] hl 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)⊢ (a.sort fun x1 x2 => x1 ≤ x2).Nodup
exact a.sort_nodup (fun x1 x2 => x1 ≤ x2) All goals completed! 🐙
lemma ofFinset_union (q : 𝓕 → FieldStatistic) (φs : List 𝓕) (a b : Finset (Fin φs.length)) :
ofFinset q φs.get a * ofFinset q φs.get b = ofFinset q φs.get ((a ∪ b) \ (a ∩ b)) := by 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)⊢ ofFinset q φs.get a * ofFinset q φs.get b = ofFinset q φs.get ((a ∪ b) \ (a ∩ b))
rw [ofFinset_eq_prod, 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)⊢ (∏ i, if i ∈ a then q φs[i] else 1) * ofFinset q φs.get b = ofFinset q φs.get ((a ∪ b) \ (a ∩ b)) 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)⊢ ((∏ i, if i ∈ a then q φs[i] else 1) * ∏ i, if i ∈ b then q φs[i] else 1) =
∏ i, if i ∈ (a ∪ b) \ (a ∩ b) then q φs[i] else 1 ofFinset_eq_prod, 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)⊢ ((∏ i, if i ∈ a then q φs[i] else 1) * ∏ i, if i ∈ b then q φs[i] else 1) = ofFinset q φs.get ((a ∪ b) \ (a ∩ b)) 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)⊢ ((∏ i, if i ∈ a then q φs[i] else 1) * ∏ i, if i ∈ b then q φs[i] else 1) =
∏ i, if i ∈ (a ∪ b) \ (a ∩ b) then q φs[i] else 1 ofFinset_eq_prod 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)⊢ ((∏ i, if i ∈ a then q φs[i] else 1) * ∏ i, if i ∈ b then q φs[i] else 1) =
∏ i, if i ∈ (a ∪ b) \ (a ∩ b) then q φs[i] else 1 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)⊢ ((∏ i, if i ∈ a then q φs[i] else 1) * ∏ i, if i ∈ b then q φs[i] else 1) =
∏ i, if i ∈ (a ∪ b) \ (a ∩ b) then q φs[i] else 1] 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)⊢ ((∏ i, if i ∈ a then q φs[i] else 1) * ∏ i, if i ∈ b then q φs[i] else 1) =
∏ i, if i ∈ (a ∪ b) \ (a ∩ b) then q φs[i] else 1
rw [← Finset.prod_mul_distrib 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)⊢ (∏ x, (if x ∈ a then q φs[x] else 1) * if x ∈ b then q φs[x] else 1) = ∏ i, if i ∈ (a ∪ b) \ (a ∩ b) then q φs[i] else 1 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)⊢ (∏ x, (if x ∈ a then q φs[x] else 1) * if x ∈ b then q φs[x] else 1) = ∏ i, if i ∈ (a ∪ b) \ (a ∩ b) then q φs[i] else 1] 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)⊢ (∏ x, (if x ∈ a then q φs[x] else 1) * if x ∈ b then q φs[x] else 1) = ∏ i, if i ∈ (a ∪ b) \ (a ∩ b) then q φs[i] else 1
congr e_f 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)⊢ (fun x => (if x ∈ a then q φs[x] else 1) * if x ∈ b then q φs[x] else 1) = fun i =>
if i ∈ (a ∪ b) \ (a ∩ b) then q φs[i] else 1
funext x e_f 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)x:Fin φs.length⊢ ((if x ∈ a then q φs[x] else 1) * if x ∈ b then q φs[x] else 1) = if x ∈ (a ∪ b) \ (a ∩ b) then q φs[x] else 1
simp only [Fin.getElem_fin, mul_ite, ite_mul, mul_self, one_mul, mul_one,
Finset.mem_sdiff, Finset.mem_union, Finset.mem_inter, not_and] e_f 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)x:Fin φs.length⊢ (if x ∈ b then if x ∈ a then 1 else q φs[↑x] else if x ∈ a then q φs[↑x] else 1) =
if (x ∈ a ∨ x ∈ b) ∧ (x ∈ a → x ∉ b) then q φs[↑x] else 1
split e_f.isTrue 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)x:Fin φs.lengthh✝:x ∈ b⊢ (if x ∈ a then 1 else q φs[↑x]) = if (x ∈ a ∨ x ∈ b) ∧ (x ∈ a → x ∉ b) then q φs[↑x] else 1e_f.isFalse 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)x:Fin φs.lengthh✝:x ∉ b⊢ (if x ∈ a then q φs[↑x] else 1) = if (x ∈ a ∨ x ∈ b) ∧ (x ∈ a → x ∉ b) then q φs[↑x] else 1
· e_f.isTrue 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)x:Fin φs.lengthh✝:x ∈ b⊢ (if x ∈ a then 1 else q φs[↑x]) = if (x ∈ a ∨ x ∈ b) ∧ (x ∈ a → x ∉ b) then q φs[↑x] else 1 rename_i h e_f.isTrue 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)x:Fin φs.lengthh:x ∈ b⊢ (if x ∈ a then 1 else q φs[↑x]) = if (x ∈ a ∨ x ∈ b) ∧ (x ∈ a → x ∉ b) then q φs[↑x] else 1
simp [h] All goals completed! 🐙
· e_f.isFalse 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)x:Fin φs.lengthh✝:x ∉ b⊢ (if x ∈ a then q φs[↑x] else 1) = if (x ∈ a ∨ x ∈ b) ∧ (x ∈ a → x ∉ b) then q φs[↑x] else 1 rename_i h e_f.isFalse 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)x:Fin φs.lengthh:x ∉ b⊢ (if x ∈ a then q φs[↑x] else 1) = if (x ∈ a ∨ x ∈ b) ∧ (x ∈ a → x ∉ b) then q φs[↑x] else 1
simp [h] All goals completed! 🐙
lemma ofFinset_union_disjoint (q : 𝓕 → FieldStatistic) (φs : List 𝓕) (a b : Finset (Fin φs.length))
(h : Disjoint a b) :
ofFinset q φs.get a * ofFinset q φs.get b = ofFinset q φs.get (a ∪ b) := by 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)h:Disjoint a b⊢ ofFinset q φs.get a * ofFinset q φs.get b = ofFinset q φs.get (a ∪ b)
rw [ofFinset_union, 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)h:Disjoint a b⊢ ofFinset q φs.get ((a ∪ b) \ (a ∩ b)) = ofFinset q φs.get (a ∪ b) 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)h:Disjoint a b⊢ ofFinset q φs.get ((a ∪ b) \ ∅) = ofFinset q φs.get (a ∪ b) Finset.disjoint_iff_inter_eq_empty.mp h 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)h:Disjoint a b⊢ ofFinset q φs.get ((a ∪ b) \ ∅) = ofFinset q φs.get (a ∪ b) 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)h:Disjoint a b⊢ ofFinset q φs.get ((a ∪ b) \ ∅) = ofFinset q φs.get (a ∪ b)] 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)h:Disjoint a b⊢ ofFinset q φs.get ((a ∪ b) \ ∅) = ofFinset q φs.get (a ∪ b)
simp All goals completed! 🐙
lemma ofFinset_filter_mul_neg (q : 𝓕 → FieldStatistic) (φs : List 𝓕) (a : Finset (Fin φs.length))
(p : Fin φs.length → Prop) [DecidablePred p] :
ofFinset q φs.get (Finset.filter p a) *
ofFinset q φs.get (Finset.filter (fun i => ¬ p i) a) = ofFinset q φs.get a := by 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)p:Fin φs.length → Propinst✝:DecidablePred p⊢ ofFinset q φs.get (Finset.filter p a) * ofFinset q φs.get ({i ∈ a | ¬p i}) = ofFinset q φs.get a
rw [ofFinset_union_disjoint 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)p:Fin φs.length → Propinst✝:DecidablePred p⊢ ofFinset q φs.get (Finset.filter p a ∪ {i ∈ a | ¬p i}) = ofFinset q φs.get ah 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)p:Fin φs.length → Propinst✝:DecidablePred p⊢ Disjoint (Finset.filter p a) ({i ∈ a | ¬p i}) 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)p:Fin φs.length → Propinst✝:DecidablePred p⊢ ofFinset q φs.get (Finset.filter p a ∪ {i ∈ a | ¬p i}) = ofFinset q φs.get ah 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)p:Fin φs.length → Propinst✝:DecidablePred p⊢ Disjoint (Finset.filter p a) ({i ∈ a | ¬p i})] 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)p:Fin φs.length → Propinst✝:DecidablePred p⊢ ofFinset q φs.get (Finset.filter p a ∪ {i ∈ a | ¬p i}) = ofFinset q φs.get ah 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)p:Fin φs.length → Propinst✝:DecidablePred p⊢ Disjoint (Finset.filter p a) ({i ∈ a | ¬p i})
congr e_a 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)p:Fin φs.length → Propinst✝:DecidablePred p⊢ Finset.filter p a ∪ {i ∈ a | ¬p i} = ah 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)p:Fin φs.length → Propinst✝:DecidablePred p⊢ Disjoint (Finset.filter p a) ({i ∈ a | ¬p i})
exact Finset.filter_union_filter_not_eq p a h 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)p:Fin φs.length → Propinst✝:DecidablePred p⊢ Disjoint (Finset.filter p a) ({i ∈ a | ¬p i})
exact Finset.disjoint_filter_filter_not a a p All goals completed! 🐙
lemma ofFinset_filter (q : 𝓕 → FieldStatistic) (φs : List 𝓕) (a : Finset (Fin φs.length))
(p : Fin φs.length → Prop) [DecidablePred p] :
ofFinset q φs.get (Finset.filter p a) = ofFinset q φs.get (Finset.filter (fun i => ¬ p i) a) *
ofFinset q φs.get a := by 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)p:Fin φs.length → Propinst✝:DecidablePred p⊢ ofFinset q φs.get (Finset.filter p a) = ofFinset q φs.get ({i ∈ a | ¬p i}) * ofFinset q φs.get a
rw [← ofFinset_filter_mul_neg q φs a p 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)p:Fin φs.length → Propinst✝:DecidablePred p⊢ ofFinset q φs.get (Finset.filter p a) =
ofFinset q φs.get ({i ∈ a | ¬p i}) * (ofFinset q φs.get (Finset.filter p a) * ofFinset q φs.get ({i ∈ a | ¬p i})) 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)p:Fin φs.length → Propinst✝:DecidablePred p⊢ ofFinset q φs.get (Finset.filter p a) =
ofFinset q φs.get ({i ∈ a | ¬p i}) * (ofFinset q φs.get (Finset.filter p a) * ofFinset q φs.get ({i ∈ a | ¬p i}))] 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)p:Fin φs.length → Propinst✝:DecidablePred p⊢ ofFinset q φs.get (Finset.filter p a) =
ofFinset q φs.get ({i ∈ a | ¬p i}) * (ofFinset q φs.get (Finset.filter p a) * ofFinset q φs.get ({i ∈ a | ¬p i}))
conv_rhs =>
rhs 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)p:Fin φs.length → Propinst✝:DecidablePred p| ofFinset q φs.get (Finset.filter p a) * ofFinset q φs.get ({i ∈ a | ¬p i})
rw [mul_comm] 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)p:Fin φs.length → Propinst✝:DecidablePred p| ofFinset q φs.get ({i ∈ a | ¬p i}) * ofFinset q φs.get (Finset.filter p a)
rw [← mul_assoc 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)p:Fin φs.length → Propinst✝:DecidablePred p⊢ ofFinset q φs.get (Finset.filter p a) =
ofFinset q φs.get ({i ∈ a | ¬p i}) * ofFinset q φs.get ({i ∈ a | ¬p i}) * ofFinset q φs.get (Finset.filter p a) 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)p:Fin φs.length → Propinst✝:DecidablePred p⊢ ofFinset q φs.get (Finset.filter p a) =
ofFinset q φs.get ({i ∈ a | ¬p i}) * ofFinset q φs.get ({i ∈ a | ¬p i}) * ofFinset q φs.get (Finset.filter p a)] 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)p:Fin φs.length → Propinst✝:DecidablePred p⊢ ofFinset q φs.get (Finset.filter p a) =
ofFinset q φs.get ({i ∈ a | ¬p i}) * ofFinset q φs.get ({i ∈ a | ¬p i}) * ofFinset q φs.get (Finset.filter p a)
simp All goals completed! 🐙