/- Copyright (c) 2017 Mario Carneiro. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Mario Carneiro ! This file was ported from Lean 3 source module data.multiset.fold ! leanprover-community/mathlib commit 9003f28797c0664a49e4179487267c494477d853 ! Please do not edit these lines, except to modify the commit id ! if you have ported upstream changes. -/ import Mathlib.Data.Multiset.Dedup import Mathlib.Data.List.MinMax /-! # The fold operation for a commutative associative operation over a multiset. -/ namespace Multiset variable {αα: Type ?u.4793β :β: Type ?u.5Type _} /-! ### fold -/ section Fold variable (Type _: Type (?u.5+1)op :op: α → α → αα →α: Type ?u.8α →α: Type ?u.8α) [α: Type ?u.8hc : IsCommutativehc: IsCommutative α opαα: Type ?u.152op] [op: α → α → αha : IsAssociativeha: IsAssociative α opαα: Type ?u.152op] local notationop: α → α → αa " * "a: ?m.236b => opb: ?m.227aa: ?m.236b /-- `fold op b s` folds a commutative associative operation `op` over the multiset `s`. -/ defb: ?m.227fold :fold: α → Multiset α → αα → Multisetα: Type ?u.2302α →α: Type ?u.2302α :=α: Type ?u.2302foldrfoldr: {α : Type ?u.2331} → {β : Type ?u.2330} → (f : α → β → β) → LeftCommutative f → β → Multiset α → βop (op: α → α → αleft_commleft_comm: ∀ {α : Type ?u.2345} (f : α → α → α), Commutative f → Associative f → LeftCommutative f__: ?m.2346 → ?m.2346 → ?m.2346hc.hc: IsCommutative α opcommcomm: ∀ {α : Type ?u.2358} {op : α → α → α} [self : IsCommutative α op] (a b : α), op a b = op b aha.ha: IsAssociative α opassoc) #align multiset.foldassoc: ∀ {α : Type ?u.2369} {op : α → α → α} [self : IsAssociative α op] (a b c : α), op (op a b) c = op a (op b c)Multiset.fold theoremMultiset.fold: {α : Type u_1} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αfold_eq_foldr (fold_eq_foldr: ∀ {α : Type u_1} (op : α → α → α) [hc : IsCommutative α op] [ha : IsAssociative α op] (b : α) (s : Multiset α), fold op b s = foldr op (_ : LeftCommutative op) b sb :b: αα) (α: Type ?u.2489s : Multisets: Multiset αα) :α: Type ?u.2489foldfold: {α : Type ?u.2517} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αopop: α → α → αbb: αs =s: Multiset αfoldrfoldr: {α : Type ?u.2547} → {β : Type ?u.2546} → (f : α → β → β) → LeftCommutative f → β → Multiset α → βop (op: α → α → αleft_commleft_comm: ∀ {α : Type ?u.2556} (f : α → α → α), Commutative f → Associative f → LeftCommutative f__: ?m.2557 → ?m.2557 → ?m.2557hc.hc: IsCommutative α opcommcomm: ∀ {α : Type ?u.2569} {op : α → α → α} [self : IsCommutative α op] (a b : α), op a b = op b aha.ha: IsAssociative α opassoc)assoc: ∀ {α : Type ?u.2576} {op : α → α → α} [self : IsAssociative α op] (a b c : α), op (op a b) c = op a (op b c)bb: αs := rfl #align multiset.fold_eq_foldrs: Multiset αMultiset.fold_eq_foldr @[simp] theoremMultiset.fold_eq_foldr: ∀ {α : Type u_1} (op : α → α → α) [hc : IsCommutative α op] [ha : IsAssociative α op] (b : α) (s : Multiset α), fold op b s = foldr op (_ : LeftCommutative op) b scoe_fold_r (coe_fold_r: ∀ {α : Type u_1} (op : α → α → α) [hc : IsCommutative α op] [ha : IsAssociative α op] (b : α) (l : List α), fold op b ↑l = List.foldr op b lb :b: αα) (α: Type ?u.2618l : Listl: List αα) :α: Type ?u.2618foldfold: {α : Type ?u.2646} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αopop: α → α → αbb: αl =l: List αl.foldrl: List αopop: α → α → αb := rfl #align multiset.coe_fold_rb: αMultiset.coe_fold_r theoremMultiset.coe_fold_r: ∀ {α : Type u_1} (op : α → α → α) [hc : IsCommutative α op] [ha : IsAssociative α op] (b : α) (l : List α), fold op b ↑l = List.foldr op b lcoe_fold_l (coe_fold_l: ∀ {α : Type u_1} (op : α → α → α) [hc : IsCommutative α op] [ha : IsAssociative α op] (b : α) (l : List α), fold op b ↑l = List.foldl op b lb :b: αα) (α: Type ?u.2858l : Listl: List αα) :α: Type ?u.2858foldfold: {α : Type ?u.2886} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αopop: α → α → αbb: αl =l: List αl.foldll: List αopop: α → α → αb := (b: αcoe_foldr_swapcoe_foldr_swap: ∀ {α : Type ?u.3040} {β : Type ?u.3041} (f : α → β → β) (H : LeftCommutative f) (b : β) (l : List α), foldr f H b ↑l = List.foldl (fun x y => f y x) b lopop: α → α → α__: LeftCommutative opbb: αl).trans <|l: List αGoals accomplished! 🐙List.foldl (fun x y => op y x) b l = List.foldl op b l#align multiset.coe_fold_lGoals accomplished! 🐙Multiset.coe_fold_l theoremMultiset.coe_fold_l: ∀ {α : Type u_1} (op : α → α → α) [hc : IsCommutative α op] [ha : IsAssociative α op] (b : α) (l : List α), fold op b ↑l = List.foldl op b lfold_eq_foldl (fold_eq_foldl: ∀ {α : Type u_1} (op : α → α → α) [hc : IsCommutative α op] [ha : IsAssociative α op] (b : α) (s : Multiset α), fold op b s = foldl op (_ : RightCommutative op) b sb :b: αα) (α: Type ?u.3267s : Multisets: Multiset αα) :α: Type ?u.3267foldfold: {α : Type ?u.3295} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αopop: α → α → αbb: αs =s: Multiset αfoldlfoldl: {α : Type ?u.3325} → {β : Type ?u.3324} → (f : β → α → β) → RightCommutative f → β → Multiset α → βop (op: α → α → αright_commright_comm: ∀ {α : Type ?u.3334} (f : α → α → α), Commutative f → Associative f → RightCommutative f__: ?m.3335 → ?m.3335 → ?m.3335hc.hc: IsCommutative α opcommcomm: ∀ {α : Type ?u.3347} {op : α → α → α} [self : IsCommutative α op] (a b : α), op a b = op b aha.ha: IsAssociative α opassoc)assoc: ∀ {α : Type ?u.3354} {op : α → α → α} [self : IsAssociative α op] (a b c : α), op (op a b) c = op a (op b c)bb: αs := Quot.inductionOns: Multiset αs funs: Multiset α_ =>_: ?m.3401coe_fold_lcoe_fold_l: ∀ {α : Type ?u.3403} (op : α → α → α) [hc : IsCommutative α op] [ha : IsAssociative α op] (b : α) (l : List α), fold op b ↑l = List.foldl op b l__: ?m.3404 → ?m.3404 → ?m.3404__: ?m.3404_ #align multiset.fold_eq_foldl_: List ?m.3404Multiset.fold_eq_foldl @[simp] theoremMultiset.fold_eq_foldl: ∀ {α : Type u_1} (op : α → α → α) [hc : IsCommutative α op] [ha : IsAssociative α op] (b : α) (s : Multiset α), fold op b s = foldl op (_ : RightCommutative op) b sfold_zero (fold_zero: ∀ {α : Type u_1} (op : α → α → α) [hc : IsCommutative α op] [ha : IsAssociative α op] (b : α), fold op b 0 = bb :b: αα) : (α: Type ?u.35140 : Multiset0: ?m.3542α).α: Type ?u.3514foldfold: {α : Type ?u.3571} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αopop: α → α → αb =b: αb := rfl #align multiset.fold_zerob: αMultiset.fold_zero @[simp] theoremMultiset.fold_zero: ∀ {α : Type u_1} (op : α → α → α) [hc : IsCommutative α op] [ha : IsAssociative α op] (b : α), fold op b 0 = bfold_cons_left : ∀ (fold_cons_left: ∀ {α : Type u_1} (op : α → α → α) [hc : IsCommutative α op] [ha : IsAssociative α op] (b a : α) (s : Multiset α), fold op b (a ::ₘ s) = op a (fold op b s)bb: αa :a: αα) (α: Type ?u.3653s : Multisets: Multiset αα), (α: Type ?u.3653a ::ₘa: αs).s: Multiset αfoldfold: {α : Type ?u.3687} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αopop: α → α → αb =b: αa *a: αs.s: Multiset αfoldfold: {α : Type ?u.3721} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αopop: α → α → αb := foldr_consb: α__: ?m.4724 → ?m.4725 → ?m.4725_ #align multiset.fold_cons_left_: LeftCommutative ?m.4726Multiset.fold_cons_left theoremMultiset.fold_cons_left: ∀ {α : Type u_1} (op : α → α → α) [hc : IsCommutative α op] [ha : IsAssociative α op] (b a : α) (s : Multiset α), fold op b (a ::ₘ s) = op a (fold op b s)fold_cons_right (fold_cons_right: ∀ {α : Type u_1} (op : α → α → α) [hc : IsCommutative α op] [ha : IsAssociative α op] (b a : α) (s : Multiset α), fold op b (a ::ₘ s) = op (fold op b s) abb: αa :a: αα) (α: Type ?u.4793s : Multisets: Multiset αα) : (α: Type ?u.4793a ::ₘa: αs).s: Multiset αfoldfold: {α : Type ?u.4826} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αopop: α → α → αb =b: αs.s: Multiset αfoldfold: {α : Type ?u.4860} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αopop: α → α → αb *b: αa :=a: αGoals accomplished! 🐙α: Type u_1
β: Type ?u.4796
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
b, a: α
s: Multiset α#align multiset.fold_cons_rightGoals accomplished! 🐙Multiset.fold_cons_right theoremMultiset.fold_cons_right: ∀ {α : Type u_1} (op : α → α → α) [hc : IsCommutative α op] [ha : IsAssociative α op] (b a : α) (s : Multiset α), fold op b (a ::ₘ s) = op (fold op b s) afold_cons'_right (fold_cons'_right: ∀ {α : Type u_1} (op : α → α → α) [hc : IsCommutative α op] [ha : IsAssociative α op] (b a : α) (s : Multiset α), fold op b (a ::ₘ s) = fold op (op b a) sbb: αa :a: αα) (α: Type ?u.6036s : Multisets: Multiset αα) : (α: Type ?u.6036a ::ₘa: αs).s: Multiset αfoldfold: {α : Type ?u.6069} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αopop: α → α → αb =b: αs.s: Multiset αfoldfold: {α : Type ?u.6103} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αop (op: α → α → αb *b: αa) :=a: αGoals accomplished! 🐙α: Type u_1
β: Type ?u.6039
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
b, a: α
s: Multiset αα: Type u_1
β: Type ?u.6039
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
b, a: α
s: Multiset αα: Type u_1
β: Type ?u.6039
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
b, a: α
s: Multiset αfoldl op (_ : RightCommutative op) b (a ::ₘ s) = fold op (op b a) sα: Type u_1
β: Type ?u.6039
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
b, a: α
s: Multiset αα: Type u_1
β: Type ?u.6039
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
b, a: α
s: Multiset αfoldl op (_ : RightCommutative op) (op b a) s = fold op (op b a) sα: Type u_1
β: Type ?u.6039
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
b, a: α
s: Multiset αα: Type u_1
β: Type ?u.6039
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
b, a: α
s: Multiset α#align multiset.fold_cons'_rightGoals accomplished! 🐙Multiset.fold_cons'_right theoremMultiset.fold_cons'_right: ∀ {α : Type u_1} (op : α → α → α) [hc : IsCommutative α op] [ha : IsAssociative α op] (b a : α) (s : Multiset α), fold op b (a ::ₘ s) = fold op (op b a) sfold_cons'_left (fold_cons'_left: ∀ {α : Type u_1} (op : α → α → α) [hc : IsCommutative α op] [ha : IsAssociative α op] (b a : α) (s : Multiset α), fold op b (a ::ₘ s) = fold op (op a b) sbb: αa :a: αα) (α: Type ?u.7201s : Multisets: Multiset αα) : (α: Type ?u.7201a ::ₘa: αs).s: Multiset αfoldfold: {α : Type ?u.7234} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αopop: α → α → αb =b: αs.s: Multiset αfoldfold: {α : Type ?u.7268} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αop (op: α → α → αa *a: αb) :=b: αGoals accomplished! 🐙α: Type u_1
β: Type ?u.7204
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
b, a: α
s: Multiset αα: Type u_1
β: Type ?u.7204
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
b, a: α
s: Multiset αα: Type u_1
β: Type ?u.7204
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
b, a: α
s: Multiset αα: Type u_1
β: Type ?u.7204
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
b, a: α
s: Multiset αα: Type u_1
β: Type ?u.7204
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
b, a: α
s: Multiset α#align multiset.fold_cons'_leftGoals accomplished! 🐙Multiset.fold_cons'_left theoremMultiset.fold_cons'_left: ∀ {α : Type u_1} (op : α → α → α) [hc : IsCommutative α op] [ha : IsAssociative α op] (b a : α) (s : Multiset α), fold op b (a ::ₘ s) = fold op (op a b) sfold_add (fold_add: ∀ {α : Type u_1} (op : α → α → α) [hc : IsCommutative α op] [ha : IsAssociative α op] (b₁ b₂ : α) (s₁ s₂ : Multiset α), fold op (op b₁ b₂) (s₁ + s₂) = op (fold op b₁ s₁) (fold op b₂ s₂)b₁b₁: αb₂ :b₂: αα) (α: Type ?u.8329s₁s₁: Multiset αs₂ : Multisets₂: Multiset αα) : (α: Type ?u.8329s₁ +s₁: Multiset αs₂).s₂: Multiset αfoldfold: {α : Type ?u.8407} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αop (op: α → α → αb₁ *b₁: αb₂) =b₂: αs₁.s₁: Multiset αfoldfold: {α : Type ?u.9409} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αopop: α → α → αb₁ *b₁: αs₂.s₂: Multiset αfoldfold: {α : Type ?u.9425} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αopop: α → α → αb₂ := Multiset.induction_onb₂: αs₂ (s₂: Multiset αGoals accomplished! 🐙α: Type u_1
β: Type ?u.8332
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
b₁, b₂: α
s₁, s₂: Multiset αα: Type u_1
β: Type ?u.8332
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
b₁, b₂: α
s₁, s₂: Multiset αα: Type u_1
β: Type ?u.8332
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
b₁, b₂: α
s₁, s₂: Multiset αα: Type u_1
β: Type ?u.8332
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
b₁, b₂: α
s₁, s₂: Multiset αα: Type u_1
β: Type ?u.8332
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
b₁, b₂: α
s₁, s₂: Multiset αα: Type u_1
β: Type ?u.8332
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
b₁, b₂: α
s₁, s₂: Multiset αα: Type u_1
β: Type ?u.8332
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
b₁, b₂: α
s₁, s₂: Multiset αα: Type u_1
β: Type ?u.8332
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
b₁, b₂: α
s₁, s₂: Multiset αα: Type u_1
β: Type ?u.8332
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
b₁, b₂: α
s₁, s₂: Multiset α) (funGoals accomplished! 🐙aa: ?m.9940bb: ?m.9943h =>h: ?m.9946Goals accomplished! 🐙) #align multiset.fold_addGoals accomplished! 🐙Multiset.fold_add theoremMultiset.fold_add: ∀ {α : Type u_1} (op : α → α → α) [hc : IsCommutative α op] [ha : IsAssociative α op] (b₁ b₂ : α) (s₁ s₂ : Multiset α), fold op (op b₁ b₂) (s₁ + s₂) = op (fold op b₁ s₁) (fold op b₂ s₂)fold_bind {ι :ι: Type u_1Type _} (Type _: Type (?u.10564+1)s : Multisets: Multiset ιι) (ι: Type ?u.10564t :t: ι → Multiset αι → Multisetι: Type ?u.10564α) (α: Type ?u.10542b :b: ι → αι →ι: Type ?u.10564α) (α: Type ?u.10542b₀ :b₀: αα) : (α: Type ?u.10542s.binds: Multiset ιt).t: ι → Multiset αfoldfold: {α : Type ?u.10598} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αop ((op: α → α → αs.maps: Multiset ιb).b: ι → αfoldfold: {α : Type ?u.10625} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αopop: α → α → αb₀) = (b₀: αs.map funs: Multiset ιi => (i: ?m.10668tt: ι → Multiset αi).i: ?m.10668foldfold: {α : Type ?u.10670} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αop (op: α → α → αbb: ι → αi)).i: ?m.10668foldfold: {α : Type ?u.10689} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αopop: α → α → αb₀ :=b₀: αGoals accomplished! 🐙α: Type u_2
β: Type ?u.10545
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
ι: Type u_1
t: ι → Multiset α
b: ι → α
b₀: α
emptyα: Type u_2
β: Type ?u.10545
op: α → α → α
hc: IsCommutative α op
ha✝: IsAssociative α op
ι: Type u_1
t: ι → Multiset α
b: ι → α
b₀: α
a: ι
ha: Multiset ι
ih: fold op (fold op b₀ (map b ha)) (bind ha t) = fold op b₀ (map (fun i => fold op (b i) (t i)) ha)
consα: Type u_2
β: Type ?u.10545
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
ι: Type u_1
t: ι → Multiset α
b: ι → α
b₀: α
emptyα: Type u_2
β: Type ?u.10545
op: α → α → α
hc: IsCommutative α op
ha✝: IsAssociative α op
ι: Type u_1
t: ι → Multiset α
b: ι → α
b₀: α
a: ι
ha: Multiset ι
ih: fold op (fold op b₀ (map b ha)) (bind ha t) = fold op b₀ (map (fun i => fold op (b i) (t i)) ha)
consα: Type u_2
β: Type ?u.10545
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
ι: Type u_1
t: ι → Multiset α
b: ι → α
b₀: α
emptyα: Type u_2
β: Type ?u.10545
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
ι: Type u_1
t: ι → Multiset α
b: ι → α
b₀: α
emptyGoals accomplished! 🐙#align multiset.fold_bind Multiset.fold_bind theoremGoals accomplished! 🐙fold_singleton (fold_singleton: ∀ {α : Type u_1} (op : α → α → α) [hc : IsCommutative α op] [ha : IsAssociative α op] (b a : α), fold op b {a} = op a bbb: αa :a: αα) : ({α: Type ?u.11021a} : Multiseta: αα).α: Type ?u.11021foldfold: {α : Type ?u.11074} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αopop: α → α → αb =b: αa *a: αb :=b: αfoldr_singletonfoldr_singleton: ∀ {α : Type ?u.12079} {β : Type ?u.12080} (f : α → β → β) (H : LeftCommutative f) (b : β) (a : α), foldr f H b {a} = f a b__: ?m.12081 → ?m.12082 → ?m.12082__: LeftCommutative ?m.12083__: ?m.12082_ #align multiset.fold_singleton_: ?m.12081Multiset.fold_singleton theoremMultiset.fold_singleton: ∀ {α : Type u_1} (op : α → α → α) [hc : IsCommutative α op] [ha : IsAssociative α op] (b a : α), fold op b {a} = op a bfold_distrib {ff: β → αg :g: β → αβ →β: Type ?u.12133α} (α: Type ?u.12130u₁u₁: αu₂ :u₂: αα) (α: Type ?u.12130s : Multisets: Multiset ββ) : (β: Type ?u.12133s.map funs: Multiset βx =>x: ?m.12177ff: β → αx *x: ?m.12177gg: β → αx).x: ?m.12177foldfold: {α : Type ?u.13149} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αop (op: α → α → αu₁ *u₁: αu₂) = (u₂: αs.maps: Multiset βf).f: β → αfoldfold: {α : Type ?u.13624} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αopop: α → α → αu₁ * (u₁: αs.maps: Multiset βg).g: β → αfoldfold: {α : Type ?u.13651} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αopop: α → α → αu₂ := Multiset.induction_onu₂: αs (s: Multiset βGoals accomplished! 🐙) (funGoals accomplished! 🐙aa: ?m.14189bb: ?m.14192h =>h: ?m.14195Goals accomplished! 🐙) #align multiset.fold_distrib Multiset.fold_distrib theoremGoals accomplished! 🐙fold_hom {fold_hom: ∀ {α : Type u_2} {β : Type u_1} (op : α → α → α) [hc : IsCommutative α op] [ha : IsAssociative α op] {op' : β → β → β} [inst : IsCommutative β op'] [inst_1 : IsAssociative β op'] {m : α → β}, (∀ (x y : α), m (op x y) = op' (m x) (m y)) → ∀ (b : α) (s : Multiset α), fold op' (m b) (map m s) = m (fold op b s)op' :op': β → β → ββ →β: Type ?u.14890β →β: Type ?u.14890β} [IsCommutativeβ: Type ?u.14890ββ: Type ?u.14890op'] [IsAssociativeop': β → β → βββ: Type ?u.14890op'] {op': β → β → βm :m: α → βα →α: Type ?u.14887β} (β: Type ?u.14890hm : ∀hm: ∀ (x y : α), m (op x y) = op' (m x) (m y)xx: ?m.14930y,y: ?m.14933m (m: α → βopop: α → α → αxx: ?m.14930y) =y: ?m.14933op' (op': β → β → βmm: α → βx) (x: ?m.14930mm: α → βy)) (y: ?m.14933b :b: αα) (α: Type ?u.14887s : Multisets: Multiset αα) : (α: Type ?u.14887s.maps: Multiset αm).m: α → βfoldfold: {α : Type ?u.14958} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αop' (op': β → β → βmm: α → βb) =b: αm (m: α → βs.s: Multiset αfoldfold: {α : Type ?u.14993} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αopop: α → α → αb) := Multiset.induction_onb: αs (s: Multiset αGoals accomplished! 🐙α: Type u_2
β: Type u_1
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
op': β → β → β
inst✝¹: IsCommutative β op'
inst✝: IsAssociative β op'
m: α → β
hm: ∀ (x y : α), m (op x y) = op' (m x) (m y)
b: α
s: Multiset α) (Goals accomplished! 🐙Goals accomplished! 🐙α: Type u_2
β: Type u_1
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
op': β → β → β
inst✝¹: IsCommutative β op'
inst✝: IsAssociative β op'
m: α → β
hm: ∀ (x y : α), m (op x y) = op' (m x) (m y)
b: α
s: Multiset α) #align multiset.fold_homGoals accomplished! 🐙Multiset.fold_hom theoremMultiset.fold_hom: ∀ {α : Type u_2} {β : Type u_1} (op : α → α → α) [hc : IsCommutative α op] [ha : IsAssociative α op] {op' : β → β → β} [inst : IsCommutative β op'] [inst_1 : IsAssociative β op'] {m : α → β}, (∀ (x y : α), m (op x y) = op' (m x) (m y)) → ∀ (b : α) (s : Multiset α), fold op' (m b) (map m s) = m (fold op b s)fold_union_inter [DecidableEqα] (α: Type ?u.17496s₁s₁: Multiset αs₂ : Multisets₂: Multiset αα) (α: Type ?u.17496b₁b₁: αb₂ :b₂: αα) : ((α: Type ?u.17496s₁ ∪s₁: Multiset αs₂).s₂: Multiset αfoldfold: {α : Type ?u.17577} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αopop: α → α → αb₁ * (b₁: αs₁ ∩s₁: Multiset αs₂).s₂: Multiset αfoldfold: {α : Type ?u.17640} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αopop: α → α → αb₂) =b₂: αs₁.s₁: Multiset αfoldfold: {α : Type ?u.18661} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αopop: α → α → αb₁ *b₁: αs₂.s₂: Multiset αfoldfold: {α : Type ?u.18677} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αopop: α → α → αb₂ :=b₂: αGoals accomplished! 🐙α: Type u_1
β: Type ?u.17499
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
inst✝: DecidableEq α
s₁, s₂: Multiset α
b₁, b₂: αα: Type u_1
β: Type ?u.17499
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
inst✝: DecidableEq α
s₁, s₂: Multiset α
b₁, b₂: αα: Type u_1
β: Type ?u.17499
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
inst✝: DecidableEq α
s₁, s₂: Multiset α
b₁, b₂: αα: Type u_1
β: Type ?u.17499
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
inst✝: DecidableEq α
s₁, s₂: Multiset α
b₁, b₂: αα: Type u_1
β: Type ?u.17499
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
inst✝: DecidableEq α
s₁, s₂: Multiset α
b₁, b₂: αα: Type u_1
β: Type ?u.17499
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
inst✝: DecidableEq α
s₁, s₂: Multiset α
b₁, b₂: αα: Type u_1
β: Type ?u.17499
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
inst✝: DecidableEq α
s₁, s₂: Multiset α
b₁, b₂: α#align multiset.fold_union_interGoals accomplished! 🐙Multiset.fold_union_inter @[simp] theoremMultiset.fold_union_inter: ∀ {α : Type u_1} (op : α → α → α) [hc : IsCommutative α op] [ha : IsAssociative α op] [inst : DecidableEq α] (s₁ s₂ : Multiset α) (b₁ b₂ : α), op (fold op b₁ (s₁ ∪ s₂)) (fold op b₂ (s₁ ∩ s₂)) = op (fold op b₁ s₁) (fold op b₂ s₂)fold_dedup_idem [DecidableEqfold_dedup_idem: ∀ {α : Type u_1} (op : α → α → α) [hc : IsCommutative α op] [ha : IsAssociative α op] [inst : DecidableEq α] [hi : IsIdempotent α op] (s : Multiset α) (b : α), fold op b (dedup s) = fold op b sα] [α: Type ?u.19408hi : IsIdempotenthi: IsIdempotent α opαα: Type ?u.19408op] (op: α → α → αs : Multisets: Multiset αα) (α: Type ?u.19408b :b: αα) : (α: Type ?u.19408dedupdedup: {α : Type ?u.19450} → [inst : DecidableEq α] → Multiset α → Multiset αs).s: Multiset αfoldfold: {α : Type ?u.19493} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αopop: α → α → αb =b: αs.s: Multiset αfoldfold: {α : Type ?u.19527} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → αopop: α → α → αb := Multiset.induction_onb: αs (s: Multiset αGoals accomplished! 🐙α: Type u_1
β: Type ?u.19411
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
inst✝: DecidableEq α
hi: IsIdempotent α op
s: Multiset α
b: α) funGoals accomplished! 🐙aa: ?m.19583ss: ?m.19586IH =>IH: ?m.19589Goals accomplished! 🐙α: Type u_1
β: Type ?u.19411
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
inst✝: DecidableEq α
hi: IsIdempotent α op
s✝: Multiset α
b, a: α
s: Multiset α
IH: fold op b (dedup s) = fold op b sα: Type u_1
β: Type ?u.19411
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
inst✝: DecidableEq α
hi: IsIdempotent α op
s✝: Multiset α
b, a: α
s: Multiset α
IH: fold op b (dedup s) = fold op b s
h: a ∈ s
posα: Type u_1
β: Type ?u.19411
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
inst✝: DecidableEq α
hi: IsIdempotent α op
s✝: Multiset α
b, a: α
s: Multiset α
IH: fold op b (dedup s) = fold op b s
h: ¬a ∈ s
negα: Type u_1
β: Type ?u.19411
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
inst✝: DecidableEq α
hi: IsIdempotent α op
s✝: Multiset α
b, a: α
s: Multiset α
IH: fold op b (dedup s) = fold op b sα: Type u_1
β: Type ?u.19411
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
inst✝: DecidableEq α
hi: IsIdempotent α op
s✝: Multiset α
b, a: α
s: Multiset α
IH: fold op b (dedup s) = fold op b s
h: a ∈ s
posα: Type u_1
β: Type ?u.19411
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
inst✝: DecidableEq α
hi: IsIdempotent α op
s✝: Multiset α
b, a: α
s: Multiset α
IH: fold op b (dedup s) = fold op b s
h: ¬a ∈ s
negα: Type u_1
β: Type ?u.19411
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
inst✝: DecidableEq α
hi: IsIdempotent α op
s✝: Multiset α
b, a: α
s: Multiset α
IH: fold op b (dedup s) = fold op b sGoals accomplished! 🐙α: Type u_1
β: Type ?u.19411
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
inst✝: DecidableEq α
hi: IsIdempotent α op
s✝: Multiset α
b, a: α
s: Multiset α
IH: fold op b (dedup s) = fold op b sα: Type u_1
β: Type ?u.19411
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
inst✝: DecidableEq α
hi: IsIdempotent α op
s✝: Multiset α
b, a: α
s: Multiset α
IH: fold op b (dedup s) = fold op b s
h: a ∈ s
posα: Type u_1
β: Type ?u.19411
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
inst✝: DecidableEq α
hi: IsIdempotent α op
s✝: Multiset α
b, a: α
s: Multiset α
IH: fold op b (dedup s) = fold op b sα: Type u_1
β: Type ?u.19411
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
inst✝: DecidableEq α
hi: IsIdempotent α op
s✝: Multiset α
b, a: α
s: Multiset α
IH: fold op b (dedup s) = fold op b s
h: a ∈ s
posα: Type u_1
β: Type ?u.19411
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
inst✝: DecidableEq α
hi: IsIdempotent α op
s✝: Multiset α
b, a: α
s: Multiset α
IH: fold op b (dedup s) = fold op b s
h: a ∈ s
posα: Type u_1
β: Type ?u.19411
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
inst✝: DecidableEq α
hi: IsIdempotent α op
s✝: Multiset α
b, a: α
s: Multiset α
IH: fold op b (dedup s) = fold op b s
h: a ∈ s
posα: Type u_1
β: Type ?u.19411
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
inst✝: DecidableEq α
hi: IsIdempotent α op
s✝: Multiset α
b, a: α
s: Multiset α
IH: fold op b (dedup s) = fold op b s
h: a ∈ s
posα: Type u_1
β: Type ?u.19411
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
inst✝: DecidableEq α
hi: IsIdempotent α op
s✝: Multiset α
b, a: α
s: Multiset α
IH: fold op b (dedup s) = fold op b s
h: a ∈ s
posα: Type u_1
β: Type ?u.19411
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
inst✝: DecidableEq α
hi: IsIdempotent α op
s✝: Multiset α
b, a: α
s: Multiset α
IH: fold op b (dedup s) = fold op b s
h: a ∈ s
posα: Type u_1
β: Type ?u.19411
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
inst✝: DecidableEq α
hi: IsIdempotent α op
s✝: Multiset α
b, a: α
s: Multiset α
IH: fold op b (dedup s) = fold op b s
h: a ∈ s
posα: Type u_1
β: Type ?u.19411
op: α → α → α
hc: IsCommutative α op
ha: IsAssociative α op
inst✝: DecidableEq α
hi: IsIdempotent α op
s✝: Multiset α
b, a: α
s: Multiset α
IH: fold op b (dedup s) = fold op b s
h: a ∈ s
pos#align multiset.fold_dedup_idemGoals accomplished! 🐙Multiset.fold_dedup_idem end Fold section Order theoremMultiset.fold_dedup_idem: ∀ {α : Type u_1} (op : α → α → α) [hc : IsCommutative α op] [ha : IsAssociative α op] [inst : DecidableEq α] [hi : IsIdempotent α op] (s : Multiset α) (b : α), fold op b (dedup s) = fold op b smax_le_of_forall_le {α :α: Type ?u.20502Type _} [CanonicallyLinearOrderedAddMonoidType _: Type (?u.20502+1)α] (α: Type ?u.20502l : Multisetl: Multiset αα) (α: Type ?u.20502n :n: αα) (h : ∀α: Type ?u.20502x ∈x: ?m.20514l,l: Multiset αx ≤x: ?m.20514n) :n: αl.l: Multiset αfold maxfold: {α : Type ?u.20758} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → α⊥ ≤⊥: ?m.20801n :=n: αGoals accomplished! 🐙α✝: Type ?u.20496
β: Type ?u.20499
α: Type u_1
inst✝: CanonicallyLinearOrderedAddMonoid α
n: α
a✝: List α
h: ∀ (x : α), x ∈ Quotient.mk (List.isSetoid α) a✝ → x ≤ n
hfold max ⊥ (Quotient.mk (List.isSetoid α) a✝) ≤ n#align multiset.max_le_of_forall_le Multiset.max_le_of_forall_le theorem max_nat_le_of_forall_le (l : MultisetGoals accomplished! 🐙ℕ) (ℕ: Typen :n: ℕℕ) (h : ∀ℕ: Typex ∈ l,x: ?m.22108x ≤x: ?m.22108n) : l.n: ℕfold maxfold: {α : Type ?u.22152} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → α0 ≤0: ?m.22195n := max_le_of_forall_le ln: ℕn h #align multiset.max_nat_le_of_forall_le Multiset.max_nat_le_of_forall_le end Order open Nat theorem le_smul_dedup [DecidableEqn: ℕα] (α: Type ?u.22301s : Multisets: Multiset αα) : ∃α: Type ?u.22301n :n: ℕℕ,ℕ: Types ≤s: Multiset αn •n: ℕdedupdedup: {α : Type ?u.22332} → [inst : DecidableEq α] → Multiset α → Multiset αs := ⟨(s: Multiset αs.map funs: Multiset αa =>a: ?m.22820countcount: {α : Type ?u.22822} → [inst : DecidableEq α] → α → Multiset α → ℕaa: ?m.22820s).s: Multiset αfold maxfold: {α : Type ?u.22899} → (op : α → α → α) → [hc : IsCommutative α op] → [ha : IsAssociative α op] → α → Multiset α → α0, le_iff_count.2 fun0: ?m.22943a =>a: ?m.23056Goals accomplished! 🐙