Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 4f9e951

Browse files
committed
feat(analysis): add probability mass functions
1 parent eaa1b93 commit 4f9e951

8 files changed

Lines changed: 273 additions & 10 deletions

File tree

algebra/big_operators.lean

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,10 @@ lemma prod_hom [comm_monoid γ] (g : β → γ)
120120
(h₁ : g 1 = 1) (h₂ : ∀x y, g (x * y) = g x * g y) : s.prod (λx, g (f x)) = g (s.prod f) :=
121121
eq.trans (by rw [h₁]; refl) (fold_hom h₂)
122122

123+
lemma sum_nat_cast [add_comm_monoid β] [has_one β] (s : finset α) (f : α → ℕ) :
124+
↑(s.sum f) = s.sum (λa, f a : α → β) :=
125+
(sum_hom _ nat.cast_zero nat.cast_add).symm
126+
123127
@[to_additive finset.sum_subset]
124128
lemma prod_subset (h : s₁ ⊆ s₂) (hf : ∀x∈s₂, x ∉ s₁ → f x = 1) : s₁.prod f = s₂.prod f :=
125129
by haveI := classical.dec_eq α; exact
@@ -358,3 +362,29 @@ theorem inv_prod : ∀ l : list α, (prod l)⁻¹ = prod (map (λ x, x⁻¹) (re
358362
λ l, @is_group_anti_hom.prod _ _ _ _ _ inv_is_group_anti_hom l -- TODO there is probably a cleaner proof of this
359363

360364
end group
365+
366+
namespace multiset
367+
variables [decidable_eq α]
368+
369+
@[simp] lemma to_finset_sum_count_eq (s : multiset α) :
370+
s.to_finset.sum (λa, s.count a) = s.card :=
371+
multiset.induction_on s (by simp)
372+
(assume a s ih,
373+
calc (to_finset (a :: s)).sum (λx, count x (a :: s)) =
374+
(to_finset (a :: s)).sum (λx, (if x = a then 1 else 0) + count x s) :
375+
by congr; funext x; split_ifs; simp [h, nat.one_add]
376+
... = card (a :: s) :
377+
begin
378+
by_cases a ∈ s.to_finset,
379+
{ have : (to_finset s).sum (λx, ite (x = a) 1 0) = ({a}:finset α).sum (λx, ite (x = a) 1 0),
380+
{ apply (finset.sum_subset _ _).symm,
381+
{ simp [finset.subset_iff, *] at * },
382+
{ simp [if_neg] {contextual := tt} } },
383+
simp [h, ih, this, finset.sum_add_distrib] },
384+
{ have : a ∉ s, by simp * at *,
385+
have : (to_finset s).sum (λx, ite (x = a) 1 0) = (to_finset s).sum (λx, 0), from
386+
finset.sum_congr rfl begin assume a ha, split_ifs; simp [*] at * end,
387+
simp [*, finset.sum_add_distrib], }
388+
end)
389+
390+
end multiset

analysis/ennreal.lean

Lines changed: 68 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Author: Johannes Hölzl
55
66
Extended non-negative reals
7+
8+
TODO: base ennreal on nnreal!
79
-/
8-
import order.bounds algebra.ordered_group analysis.real analysis.topology.infinite_sum
10+
import order.bounds algebra.ordered_group analysis.nnreal analysis.topology.infinite_sum
911
noncomputable theory
1012
open classical set lattice filter
1113
local attribute [instance] prop_decidable
12-
13-
universes u v w
14+
variables {α : Type*} {β : Type*}
1415

1516
/-- The extended nonnegative real numbers. This is usually denoted [0, ∞],
1617
and is relevant as the codomain of a measure. -/
@@ -910,7 +911,7 @@ end inv
910911

911912
section tsum
912913

913-
variables {α : Type*} {β : Type*} {f g : α → ennreal}
914+
variables {f g : α → ennreal}
914915

915916
protected lemma is_sum : is_sum f (⨆s:finset α, s.sum f) :=
916917
tendsto_orderable.2
@@ -984,6 +985,9 @@ have tendsto (λs:finset α, s.sum ((*) a ∘ f)) at_top (nhds (a * (∑i, f i))
984985
exact (is_sum_tsum ennreal.has_sum).comp (ennreal.tendsto_mul sum_ne_0),
985986
tsum_eq_is_sum this
986987

988+
protected lemma tsum_mul : (∑i, f i * a) = (∑i, f i) * a :=
989+
by simp [mul_comm, ennreal.mul_tsum]
990+
987991
@[simp] lemma tsum_supr_eq {α : Type*} (a : α) {f : α → ennreal} :
988992
(∑b:α, ⨆ (h : a = b), f b) = f a :=
989993
le_antisymm
@@ -999,4 +1003,64 @@ le_antisymm
9991003

10001004
end tsum
10011005

1006+
section nnreal
1007+
-- TODO: use nnreal to define ennreal
1008+
1009+
instance : has_coe nnreal ennreal := ⟨ennreal.of_real ∘ coe⟩
1010+
1011+
lemma tendsto_of_real_iff {f : filter α} {m : α → ℝ} {r : ℝ} (hm : ∀a, 0 ≤ m a) (hr : 0 ≤ r) :
1012+
tendsto (λx, of_real (m x)) f (nhds (of_real r)) ↔ tendsto m f (nhds r) :=
1013+
iff.intro
1014+
(assume h,
1015+
have tendsto (λ (x : α), of_ennreal (of_real (m x))) f (nhds r), from
1016+
h.comp (tendsto_of_ennreal hr),
1017+
by simpa [hm])
1018+
(assume h, h.comp tendsto_of_real)
1019+
1020+
lemma tendsto_coe_iff {f : filter α} {m : α → nnreal} {r : nnreal} :
1021+
tendsto (λx, (m x : ennreal)) f (nhds r) ↔ tendsto m f (nhds r) :=
1022+
iff.trans (tendsto_of_real_iff (assume a, (m a).2) r.2) nnreal.tendsto_coe
1023+
1024+
protected lemma is_sum_of_real_iff {f : α → ℝ} {r : ℝ} (hf : ∀a, 0 ≤ f a) (hr : 0 ≤ r) :
1025+
is_sum (λa, of_real (f a)) (of_real r) ↔ is_sum f r :=
1026+
by simp [is_sum, sum_of_real, hf];
1027+
exact tendsto_of_real_iff (assume s, finset.zero_le_sum $ assume a ha, hf a) hr
1028+
1029+
protected lemma is_sum_coe_iff {f : α → nnreal} {r : nnreal} :
1030+
is_sum (λa, (f a : ennreal)) r ↔ is_sum f r :=
1031+
iff.trans (ennreal.is_sum_of_real_iff (assume a, (f a).2) r.2) nnreal.is_sum_coe
1032+
1033+
protected lemma coe_tsum {f : α → nnreal} (h : has_sum f) : ↑(∑a, f a) = (∑a, f a : ennreal) :=
1034+
eq.symm (tsum_eq_is_sum $ ennreal.is_sum_coe_iff.2 $ is_sum_tsum h)
1035+
1036+
@[simp] lemma coe_mul (a b : nnreal) : ↑(a * b) = (a * b : ennreal) :=
1037+
(ennreal.of_real_mul_of_real a.2 b.2).symm
1038+
1039+
@[simp] lemma coe_one : ↑(1 : nnreal) = (1 : ennreal) := rfl
1040+
1041+
@[simp] lemma coe_eq_coe {n m : nnreal} : (↑n : ennreal) = m ↔ n = m :=
1042+
iff.trans (of_real_eq_of_real_of n.2 m.2) (iff.intro subtype.eq $ assume eq, eq ▸ rfl)
1043+
1044+
end nnreal
1045+
10021046
end ennreal
1047+
1048+
lemma has_sum_of_nonneg_of_le {f g : β → ℝ} (hg : ∀b, 0 ≤ g b) (hgf : ∀b, g b ≤ f b) :
1049+
has_sum f → has_sum g
1050+
| ⟨r, hfr⟩ :=
1051+
have hf : ∀a, 0 ≤ f a, from assume a, le_trans (hg a) (hgf a),
1052+
have hr : 0 ≤ r, from is_sum_le hf is_sum_zero hfr,
1053+
have is_sum (λa, ennreal.of_real (f a)) (ennreal.of_real r), from
1054+
(ennreal.is_sum_of_real_iff hf hr).2 hfr,
1055+
have (∑b, ennreal.of_real (g b)) ≤ ennreal.of_real r,
1056+
begin
1057+
refine is_sum_le (assume b, _) (is_sum_tsum ennreal.has_sum) this,
1058+
exact ennreal.of_real_le_of_real (hgf _)
1059+
end,
1060+
let ⟨p, hp, hpr, eq⟩ := (ennreal.le_of_real_iff hr).1 this in
1061+
have is_sum g p, from
1062+
(ennreal.is_sum_of_real_iff hg hp).1 (eq ▸ is_sum_tsum ennreal.has_sum),
1063+
has_sum_spec this
1064+
1065+
lemma nnreal.has_sum_of_le {f g : β → nnreal} (hgf : ∀b, g b ≤ f b) (hf : has_sum f) : has_sum g :=
1066+
nnreal.has_sum_coe.1 $ has_sum_of_nonneg_of_le (assume b, (g b).2) hgf $ nnreal.has_sum_coe.2 hf

analysis/nnreal.lean

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@ Authors: Johan Commelin
55
66
Nonnegative real numbers.
77
-/
8+
import analysis.real analysis.topology.infinite_sum
89

9-
import analysis.real
1010
noncomputable theory
11-
open lattice
11+
open lattice filter
12+
variables {α : Type*}
1213

1314
definition nnreal := {r : ℝ // 0 ≤ r}
1415
local notation ` ℝ≥0 ` := nnreal
@@ -25,14 +26,20 @@ instance : has_zero ℝ≥0 := ⟨⟨0, le_refl 0⟩⟩
2526
instance : has_one ℝ≥0 := ⟨⟨1, zero_le_one⟩⟩
2627
instance : has_add ℝ≥0 := ⟨λa b, ⟨a + b, add_nonneg a.2 b.2⟩⟩
2728
instance : has_mul ℝ≥0 := ⟨λa b, ⟨a * b, mul_nonneg a.2 b.2⟩⟩
29+
instance : has_div ℝ≥0 := ⟨λa b, ⟨a.1 / b.1, div_nonneg' a.2 b.2⟩⟩
2830
instance : has_le ℝ≥0 := ⟨λ r s, (r:ℝ) ≤ s⟩
2931
instance : has_bot ℝ≥0 := ⟨0
3032
instance : inhabited ℝ≥0 := ⟨0
3133

32-
@[simp] protected lemma coe_add (r₁ r₂ : ℝ≥0) : ((r₁ + r₂ : ℝ≥0) : ℝ) = r₁ + r₂ := rfl
33-
@[simp] protected lemma coe_mul (r₁ r₂ : ℝ≥0) : ((r₁ * r₂ : ℝ≥0) : ℝ) = r₁ * r₂ := rfl
3434
@[simp] protected lemma coe_zero : ((0 : ℝ≥0) : ℝ) = 0 := rfl
3535
@[simp] protected lemma coe_one : ((1 : ℝ≥0) : ℝ) = 1 := rfl
36+
@[simp] protected lemma coe_add (r₁ r₂ : ℝ≥0) : ((r₁ + r₂ : ℝ≥0) : ℝ) = r₁ + r₂ := rfl
37+
@[simp] protected lemma coe_mul (r₁ r₂ : ℝ≥0) : ((r₁ * r₂ : ℝ≥0) : ℝ) = r₁ * r₂ := rfl
38+
@[simp] protected lemma coe_div (r₁ r₂ : ℝ≥0) : ((r₁ / r₂ : ℝ≥0) : ℝ) = r₁ / r₂ := rfl
39+
40+
-- TODO: setup semifield!
41+
@[simp] protected lemma zero_div (r : nnreal) : 0 / r = 0 :=
42+
nnreal.eq (zero_div _)
3643

3744
instance : comm_semiring ℝ≥0 :=
3845
begin
@@ -43,6 +50,10 @@ begin
4350
add_comm_monoid.zero], }
4451
end
4552

53+
@[simp] protected lemma coe_nat_cast : ∀(n : ℕ), (↑(↑n : ℝ≥0) : ℝ) = n
54+
| 0 := rfl
55+
| (n + 1) := by simp [coe_nat_cast n]
56+
4657
instance : decidable_linear_order ℝ≥0 :=
4758
{ le := (≤),
4859
lt := λa b, (a : ℝ) < b,
@@ -132,4 +143,23 @@ instance : orderable_topology ℝ≥0 :=
132143
| _, ⟨⟨a, ha⟩, or.inr rfl⟩ := ⟨{b : ℝ | b < a}, is_open_gt' a, set.ext $ assume b, iff.refl _⟩
133144
end) ⟩
134145

135-
end nnreal
146+
lemma tendsto_coe {f : filter α} {m : α → nnreal} :
147+
∀{x : nnreal}, tendsto (λa, (m a : ℝ)) f (nhds (x : ℝ)) ↔ tendsto m f (nhds x)
148+
| ⟨r, hr⟩ := by rw [nhds_subtype_eq_vmap, tendsto_vmap_iff]; refl
149+
150+
lemma sum_coe {s : finset α} {f : α → nnreal} :
151+
s.sum (λa, (f a : ℝ)) = (s.sum f : nnreal) :=
152+
finset.sum_hom _ rfl (assume a b, rfl)
153+
154+
lemma is_sum_coe {f : α → nnreal} {r : nnreal} : is_sum (λa, (f a : ℝ)) (r : ℝ) ↔ is_sum f r :=
155+
by simp [is_sum, sum_coe, tendsto_coe]
156+
157+
lemma has_sum_coe {f : α → nnreal} : has_sum (λa, (f a : ℝ)) ↔ has_sum f :=
158+
begin
159+
simp [has_sum],
160+
split,
161+
exact assume ⟨a, ha⟩, ⟨⟨a, is_sum_le (λa, (f a).2) is_sum_zero ha⟩, is_sum_coe.1 ha⟩,
162+
exact assume ⟨a, ha⟩, ⟨a.1, is_sum_coe.2 ha⟩
163+
end
164+
165+
end nnreal
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
/-
2+
Copyright (c) 2017 Johannes Hölzl. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Author: Johannes Hölzl
5+
6+
Probability mass function -- discrete probability measures
7+
-/
8+
import analysis.nnreal analysis.ennreal analysis.topology.infinite_sum
9+
noncomputable theory
10+
variables {α : Type*} {β : Type*} {γ : Type*}
11+
local attribute [instance] classical.prop_decidable
12+
13+
/-- Probability mass functions, i.e. discrete probability measures -/
14+
def {u} pmf (α : Type u) : Type u := { f : α → nnreal // is_sum f 1 }
15+
16+
namespace pmf
17+
18+
instance : has_coe_to_fun (pmf α) := ⟨λp, α → nnreal, λp a, p.1 a⟩
19+
20+
@[extensionality] protected lemma ext : ∀{p q : pmf α}, (∀a, p a = q a) → p = q
21+
| ⟨f, hf⟩ ⟨g, hg⟩ eq := subtype.eq $ funext eq
22+
23+
lemma is_sum_coe_one (p : pmf α) : is_sum p 1 := p.2
24+
25+
lemma has_sum_coe (p : pmf α) : has_sum p := has_sum_spec p.is_sum_coe_one
26+
27+
@[simp] lemma tsum_coe (p : pmf α) : (∑a, p a) = 1 := tsum_eq_is_sum p.is_sum_coe_one
28+
29+
def support (p : pmf α) : set α := {a | p.1 a ≠ 0}
30+
31+
def pure (a : α) : pmf α := ⟨λa', if a' = a then 1 else 0, is_sum_ite _ _⟩
32+
33+
@[simp] lemma pure_apply (a a' : α) : pure a a' = (if a' = a then 1 else 0) := rfl
34+
35+
instance [inhabited α] : inhabited (pmf α) := ⟨pure (default α)⟩
36+
37+
lemma coe_le_one (p : pmf α) (a : α) : p a ≤ 1 :=
38+
is_sum_le (by intro b; split_ifs; simp [h]; exact le_refl _) (is_sum_ite a (p a)) p.2
39+
40+
protected lemma bind.has_sum (p : pmf α) (f : α → pmf β) (b : β) : has_sum (λa:α, p a * f a b) :=
41+
begin
42+
refine nnreal.has_sum_of_le (assume a, _) p.has_sum_coe,
43+
suffices : p a * f a b ≤ p a * 1, { simpa },
44+
exact mul_le_mul_of_nonneg_left ((f a).coe_le_one _) (p a).2
45+
end
46+
47+
def bind (p : pmf α) (f : α → pmf β) : pmf β :=
48+
⟨λb, (∑a, p a * f a b),
49+
begin
50+
simp [ennreal.is_sum_coe_iff.symm, ennreal.coe_tsum (bind.has_sum p f _)],
51+
rw [is_sum_iff_of_has_sum ennreal.has_sum, ennreal.tsum_comm],
52+
simp [ennreal.mul_tsum, (ennreal.coe_tsum (f _).has_sum_coe).symm,
53+
(ennreal.coe_tsum p.has_sum_coe).symm]
54+
end
55+
56+
@[simp] lemma bind_apply (p : pmf α) (f : α → pmf β) (b : β) : p.bind f b = (∑a, p a * f a b) := rfl
57+
58+
lemma coe_bind_apply (p : pmf α) (f : α → pmf β) (b : β) :
59+
(p.bind f b : ennreal) = (∑a, p a * f a b) :=
60+
eq.trans (ennreal.coe_tsum $ bind.has_sum p f b) $ by simp
61+
62+
@[simp] lemma pure_bind (a : α) (f : α → pmf β) : (pure a).bind f = f a :=
63+
have ∀b a', ite (a' = a) 1 0 * f a' b = ite (a' = a) (f a b) 0, from
64+
assume b a', by split_ifs; simp; subst h; simp,
65+
by ext b; simp [this]
66+
67+
@[simp] lemma bind_pure (p : pmf α) : p.bind pure = p :=
68+
have ∀a a', (p a * ite (a' = a) 1 0) = ite (a = a') (p a') 0, from
69+
assume a a', begin split_ifs; try { subst a }; try { subst a' }; simp * at * end,
70+
by ext b; simp [this]
71+
72+
@[simp] lemma bind_bind (p : pmf α) (f : α → pmf β) (g : β → pmf γ) :
73+
(p.bind f).bind g = p.bind (λa, (f a).bind g) :=
74+
begin
75+
ext b,
76+
simp only [ennreal.coe_eq_coe.symm, coe_bind_apply, ennreal.mul_tsum.symm, ennreal.tsum_mul.symm],
77+
rw [ennreal.tsum_comm],
78+
simp [mul_assoc, mul_left_comm, mul_comm]
79+
end
80+
81+
lemma bind_comm (p : pmf α) (q : pmf β) (f : α → β → pmf γ) :
82+
p.bind (λa, q.bind (f a)) = q.bind (λb, p.bind (λa, f a b)) :=
83+
begin
84+
ext b,
85+
simp only [ennreal.coe_eq_coe.symm, coe_bind_apply, ennreal.mul_tsum.symm, ennreal.tsum_mul.symm],
86+
rw [ennreal.tsum_comm],
87+
simp [mul_assoc, mul_left_comm, mul_comm]
88+
end
89+
90+
def map (f : α → β) (p : pmf α) : pmf β := bind p (pure ∘ f)
91+
92+
lemma bind_pure_comp (f : α → β) (p : pmf α) : bind p (pure ∘ f) = map f p := rfl
93+
94+
lemma map_id (p : pmf α) : map id p = p := by simp [map]
95+
96+
lemma map_comp (p : pmf α) (f : α → β) (g : β → γ) : (p.map f).map g = p.map (g ∘ f) :=
97+
by simp [map]
98+
99+
lemma pure_map (a : α) (f : α → β) : (pure a).map f = pure (f a) :=
100+
by simp [map]
101+
102+
def seq (f : pmf (α → β)) (p : pmf α) : pmf β := f.bind (λm, p.bind $ λa, pure (m a))
103+
104+
def of_multiset (s : multiset α) (hs : s ≠ 0) : pmf α :=
105+
⟨λa, s.count a / s.card,
106+
have s.to_finset.sum (λa, (s.count a : ℝ) / s.card) = 1,
107+
by simp [div_eq_inv_mul, finset.mul_sum.symm, (finset.sum_nat_cast _ _).symm, hs],
108+
have s.to_finset.sum (λa, (s.count a : nnreal) / s.card) = 1,
109+
by rw [← nnreal.eq_iff, nnreal.coe_one, ← this, ← nnreal.sum_coe]; simp,
110+
begin
111+
rw ← this,
112+
apply is_sum_sum_of_ne_finset_zero,
113+
simp {contextual := tt},
114+
end
115+
116+
end pmf

analysis/topology/infinite_sum.lean

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,14 @@ tendsto_infi' s $ tendsto_cong tendsto_const_nhds $
7171
lemma has_sum_sum_of_ne_finset_zero (hf : ∀b∉s, f b = 0) : has_sum f :=
7272
has_sum_spec $ is_sum_sum_of_ne_finset_zero hf
7373

74+
lemma is_sum_ite (b : β) (a : α) : is_sum (λb', if b' = b then a else 0) a :=
75+
suffices
76+
is_sum (λb', if b' = b then a else 0) (({b} : finset β).sum (λb', if b' = b then a else 0)), from
77+
by simpa,
78+
is_sum_sum_of_ne_finset_zero $ assume b' hb,
79+
have b' ≠ b, by simpa using hb,
80+
by rw [if_neg this]
81+
7482
lemma is_sum_of_iso {j : γ → β} {i : β → γ}
7583
(hf : is_sum f a) (h₁ : ∀x, i (j x) = x) (h₂ : ∀x, j (i x) = x) : is_sum (f ∘ j) a :=
7684
have ∀x y, j x = j y → x = y,
@@ -228,6 +236,9 @@ lemma is_sum_unique : is_sum f a₁ → is_sum f a₂ → a₁ = a₂ := tendsto
228236

229237
lemma tsum_eq_is_sum (ha : is_sum f a) : (∑b, f b) = a := is_sum_unique (is_sum_tsum ⟨a, ha⟩) ha
230238

239+
lemma is_sum_iff_of_has_sum (h : has_sum f) : is_sum f a ↔ (∑b, f b) = a :=
240+
iff.intro tsum_eq_is_sum (assume eq, eq ▸ is_sum_tsum h)
241+
231242
@[simp] lemma tsum_zero : (∑b:β, 0:α) = 0 := tsum_eq_is_sum is_sum_zero
232243

233244
lemma tsum_add (hf : has_sum f) (hg : has_sum g) : (∑b, f b + g b) = (∑b, f b) + (∑b, g b) :=
@@ -250,6 +261,9 @@ lemma tsum_sigma [regular_space α] {γ : β → Type*} {f : (Σb:β, γ b) →
250261
(h₁ : ∀b, has_sum (λc, f ⟨b, c⟩)) (h₂ : has_sum f) : (∑p, f p) = (∑b c, f ⟨b, c⟩):=
251262
(tsum_eq_is_sum $ is_sum_sigma (assume b, is_sum_tsum $ h₁ b) $ is_sum_tsum h₂).symm
252263

264+
@[simp] lemma tsum_ite (b : β) (a : α) : (∑b', if b' = b then a else 0) = a :=
265+
tsum_eq_is_sum (is_sum_ite b a)
266+
253267
lemma tsum_eq_tsum_of_is_sum_iff_is_sum {f : β → α} {g : γ → α}
254268
(h : ∀{a}, is_sum f a ↔ is_sum g a) : (∑b, f b) = (∑c, g c) :=
255269
by_cases

data/finset.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -573,6 +573,10 @@ finset.val_inj.1 (erase_dup_eq_self.2 n).symm
573573
@[simp] theorem mem_to_finset {a : α} {s : multiset α} : a ∈ s.to_finset ↔ a ∈ s :=
574574
mem_erase_dup
575575

576+
@[simp] lemma to_finset_cons (a : α) (s : multiset α) :
577+
to_finset (a :: s) = insert a (to_finset s) :=
578+
finset.eq_of_veq erase_dup_cons
579+
576580
end multiset
577581

578582
namespace list

data/multiset.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1556,7 +1556,7 @@ by induction n; simp [*, succ_smul', succ_mul]
15561556
theorem count_pos {a : α} {s : multiset α} : 0 < count a s ↔ a ∈ s :=
15571557
by simp [count, countp_pos]
15581558

1559-
@[simp] theorem count_eq_zero_of_not_mem {a : α} {l : list α} (h : a ∉ l) : count a l = 0 :=
1559+
@[simp] theorem count_eq_zero_of_not_mem {a : α} {s : multiset α} (h : a ∉ s) : count a s = 0 :=
15601560
by_contradiction $ λ h', h $ count_pos.1 (nat.pos_of_ne_zero h')
15611561

15621562
theorem count_eq_zero {a : α} {s : multiset α} : count a s = 0 ↔ a ∉ s :=

0 commit comments

Comments
 (0)