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

Commit 4605b55

Browse files
committed
feat(algebra/big_operators/finprod): add a few lemmas (#7130)
* add `finprod_nonneg`, `finprod_cond_nonneg`, and `finprod_eq_zero`; * use `α → Prop` instead of `set α` in `finprod_mem_eq_prod_of_mem_iff`, rename to `finprod_cond_eq_prod_of_cond_iff`.
1 parent 49fd719 commit 4605b55

File tree

1 file changed

+31
-6
lines changed

1 file changed

+31
-6
lines changed

src/algebra/big_operators/finprod.lean

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,15 @@ by { subst q, exact finprod_congr hfg }
169169

170170
attribute [congr] finsum_congr_Prop
171171

172+
lemma finprod_nonneg {R : Type*} [ordered_comm_semiring R] {f : α → R} (hf : ∀ x, 0 ≤ f x) :
173+
0 ≤ ∏ᶠ x, f x :=
174+
begin
175+
rw finprod,
176+
split_ifs,
177+
{ exact finset.prod_nonneg (λ x _, hf _) },
178+
{ exact zero_le_one }
179+
end
180+
172181
@[to_additive] lemma monoid_hom.map_finprod_plift (f : M →* N) (g : α → M)
173182
(h : finite (mul_support $ g ∘ plift.down)) :
174183
f (∏ᶠ x, g x) = ∏ᶠ x, f (g x) :=
@@ -240,13 +249,14 @@ by { classical, rw [finprod_def, dif_pos hf] }
240249
∏ᶠ i : α, f i = ∏ i, f i :=
241250
finprod_eq_prod_of_mul_support_to_finset_subset _ (finite.of_fintype _) $ finset.subset_univ _
242251

243-
@[to_additive] lemma finprod_mem_eq_prod_of_mem_iff (f : α → M) {s : set α} {t : finset α}
244-
(h : ∀ {x}, f x ≠ 1 → (x ∈ s ↔ x ∈ t)) :
245-
∏ᶠ i ∈ s, f i = ∏ i in t, f i :=
252+
@[to_additive] lemma finprod_cond_eq_prod_of_cond_iff (f : α → M) {p : α → Prop} {t : finset α}
253+
(h : ∀ {x}, f x ≠ 1 → (p x ↔ x ∈ t)) :
254+
∏ᶠ i (hi : p i), f i = ∏ i in t, f i :=
246255
begin
256+
set s := {x | p x},
247257
have : mul_support (s.mul_indicator f) ⊆ t,
248258
{ rw [set.mul_support_mul_indicator], intros x hx, exact (h hx.2).1 hx.1 },
249-
rw [finprod_mem_def, finprod_eq_prod_of_mul_support_subset _ this],
259+
erw [finprod_mem_def, finprod_eq_prod_of_mul_support_subset _ this],
250260
refine finset.prod_congr rfl (λ x hx, mul_indicator_apply_eq_self.2 $ λ hxs, _),
251261
contrapose! hxs,
252262
exact (h hxs).2 hx
@@ -255,12 +265,12 @@ end
255265
@[to_additive] lemma finprod_mem_eq_prod_of_inter_mul_support_eq (f : α → M) {s : set α}
256266
{t : finset α} (h : s ∩ mul_support f = t ∩ mul_support f) :
257267
∏ᶠ i ∈ s, f i = ∏ i in t, f i :=
258-
finprod_mem_eq_prod_of_mem_iff _ $ by simpa [set.ext_iff] using h
268+
finprod_cond_eq_prod_of_cond_iff _ $ by simpa [set.ext_iff] using h
259269

260270
@[to_additive] lemma finprod_mem_eq_prod_of_subset (f : α → M) {s : set α} {t : finset α}
261271
(h₁ : s ∩ mul_support f ⊆ t) (h₂ : ↑t ⊆ s) :
262272
∏ᶠ i ∈ s, f i = ∏ i in t, f i :=
263-
finprod_mem_eq_prod_of_mem_iff _ $ λ x hx, ⟨λ h, h₁ ⟨h, hx⟩, λ h, h₂ h⟩
273+
finprod_cond_eq_prod_of_cond_iff _ $ λ x hx, ⟨λ h, h₁ ⟨h, hx⟩, λ h, h₂ h⟩
264274

265275
@[to_additive] lemma finprod_mem_eq_prod (f : α → M) {s : set α}
266276
(hf : (s ∩ mul_support f).finite) :
@@ -642,4 +652,19 @@ begin
642652
{ exact (finprod_mem_eq_one_of_infinite hs).symm ▸ hp₀ }
643653
end
644654

655+
lemma finprod_cond_nonneg {R : Type*} [ordered_comm_semiring R] {p : α → Prop} {f : α → R}
656+
(hf : ∀ x, p x → 0 ≤ f x) :
657+
0 ≤ ∏ᶠ x (h : p x), f x :=
658+
finprod_nonneg $ λ x, finprod_nonneg $ hf x
659+
660+
lemma finprod_eq_zero {M₀ : Type*} [comm_monoid_with_zero M₀] (f : α → M₀) (x : α)
661+
(hx : f x = 0) (hf : finite (mul_support f)) :
662+
∏ᶠ x, f x = 0 :=
663+
begin
664+
nontriviality,
665+
rw [finprod_eq_prod f hf],
666+
refine finset.prod_eq_zero (hf.mem_to_finset.2 _) hx,
667+
simp [hx]
668+
end
669+
645670
end type

0 commit comments

Comments
 (0)